From f156abcff046609e7750327e4886912bfd128da6 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 21 Apr 2024 03:04:56 -0400 Subject: [PATCH 001/414] - version 4.12.0 --- src/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/version.h b/src/version.h index 722439183..2c772fbaf 100644 --- a/src/version.h +++ b/src/version.h @@ -41,11 +41,11 @@ const char *GetVersionString(); /** Lots of different version numbers **/ -#define VERSIONSTR "4.12pre" +#define VERSIONSTR "4.12.0" // The version as seen in the Windows resource -#define RC_FILEVERSION 4,11,9999,0 -#define RC_PRODUCTVERSION 4,11,9999,0 +#define RC_FILEVERSION 4,12,0,0 +#define RC_PRODUCTVERSION 4,12,0,0 #define RC_PRODUCTVERSION2 VERSIONSTR // These are for content versioning. #define VER_MAJOR 4 From 132a150aa140037d1342485c16454d408d50f522 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 18 Apr 2024 14:54:43 -0400 Subject: [PATCH 002/414] Added pistol start gameplay option Automatically resets the player's inventory and health when changing maps. --- src/d_main.cpp | 1 + src/doomdef.h | 1 + src/g_level.cpp | 5 +++-- wadsrc/static/menudef.txt | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index c5b77942e..c5e83cf58 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -580,6 +580,7 @@ CVAR(Flag, sv_nolocaldrops, dmflags3, DF3_NO_LOCAL_DROPS); CVAR(Flag, sv_nocoopitems, dmflags3, DF3_NO_COOP_ONLY_ITEMS); CVAR(Flag, sv_nocoopthings, dmflags3, DF3_NO_COOP_ONLY_THINGS); CVAR(Flag, sv_rememberlastweapon, dmflags3, DF3_REMEMBER_LAST_WEAP); +CVAR(Flag, sv_pistolstart, dmflags3, DF3_PISTOL_START); //========================================================================== // diff --git a/src/doomdef.h b/src/doomdef.h index 70759a406..98fa88d93 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -186,6 +186,7 @@ enum : unsigned DF3_NO_COOP_ONLY_ITEMS = 1 << 4, // Items that only appear in co-op are disabled DF3_NO_COOP_ONLY_THINGS = 1 << 5, // Any Actor that only appears in co-op is disabled DF3_REMEMBER_LAST_WEAP = 1 << 6, // When respawning in co-op, keep the last used weapon out instead of switching to the best new one. + DF3_PISTOL_START = 1 << 7, // Take player inventory when exiting to the next level. }; // [RH] Compatibility flags. diff --git a/src/g_level.cpp b/src/g_level.cpp index 386df8d09..4fcef5f75 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -776,11 +776,12 @@ void FLevelLocals::ChangeLevel(const char *levelname, int position, int inflags, { if (thiscluster != nextcluster || (thiscluster && !(thiscluster->flags & CLUSTER_HUB))) { - if (nextinfo->flags2 & LEVEL2_RESETINVENTORY) + const bool doReset = dmflags3 & DF3_PISTOL_START; + if (doReset || (nextinfo->flags2 & LEVEL2_RESETINVENTORY)) { inflags |= CHANGELEVEL_RESETINVENTORY; } - if (nextinfo->flags2 & LEVEL2_RESETHEALTH) + if (doReset || (nextinfo->flags2 & LEVEL2_RESETHEALTH)) { inflags |= CHANGELEVEL_RESETHEALTH; } diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index ed0d727c5..7c8359cd5 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1630,6 +1630,7 @@ OptionMenu GameplayOptions protected StaticText " " Option "$GMPLYMNU_SMARTAUTOAIM", "sv_smartaim", "SmartAim" StaticText " " + Option "$GMPLYMNU_PISTOLSTART", "sv_pistolstart", "YesNo" Option "$GMPLYMNU_FALLINGDAMAGE", "sv_fallingdamage", "FallingDM" Option "$GMPLYMNU_DROPWEAPON", "sv_weapondrop", "YesNo" Option "$GMPLYMNU_DOUBLEAMMO", "sv_doubleammo", "YesNo" From 7f3e01470704bab2aec7bc2d7b7b1fea3cac3313 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 19 Apr 2024 09:10:31 -0400 Subject: [PATCH 003/414] Exported FTeam getters --- src/gamedata/teaminfo.cpp | 77 ++++++++++++++++++- src/gamedata/teaminfo.h | 4 +- wadsrc/static/zscript/actors/player/player.zs | 13 +++- 3 files changed, 88 insertions(+), 6 deletions(-) diff --git a/src/gamedata/teaminfo.cpp b/src/gamedata/teaminfo.cpp index 3a28da984..1838d1b39 100644 --- a/src/gamedata/teaminfo.cpp +++ b/src/gamedata/teaminfo.cpp @@ -38,6 +38,7 @@ #include "gi.h" #include "teaminfo.h" +#include "texturemanager.h" #include "v_font.h" #include "v_video.h" #include "filesystem.h" @@ -244,7 +245,7 @@ void FTeam::ClearTeams () // //========================================================================== -bool FTeam::IsValidTeam (unsigned int uiTeam) +bool FTeam::IsValidTeam (unsigned int uiTeam) const { if (uiTeam >= Teams.Size ()) return false; @@ -303,7 +304,7 @@ int FTeam::GetTextColor () const // //========================================================================== -FString FTeam::GetLogo () const +const FString& FTeam::GetLogo () const { return m_Logo; } @@ -338,3 +339,75 @@ CCMD (teamlist) DEFINE_GLOBAL(Teams) DEFINE_FIELD_NAMED(FTeam, m_Name, mName) + +static int IsValid(unsigned int id) +{ + return TeamLibrary.IsValidTeam(id); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FTeam, IsValid, IsValid) +{ + PARAM_PROLOGUE; + PARAM_UINT(id); + + ACTION_RETURN_BOOL(TeamLibrary.IsValidTeam(id)); +} + +static int GetPlayerColor(FTeam* self) +{ + return self->GetPlayerColor(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FTeam, GetPlayerColor, GetPlayerColor) +{ + PARAM_SELF_STRUCT_PROLOGUE(FTeam); + ACTION_RETURN_INT(self->GetPlayerColor()); +} + +static int GetTextColor(FTeam* self) +{ + return self->GetTextColor(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FTeam, GetTextColor, GetTextColor) +{ + PARAM_SELF_STRUCT_PROLOGUE(FTeam); + ACTION_RETURN_INT(self->GetTextColor()); +} + +static int GetLogo(FTeam* self) +{ + const FString& name = self->GetLogo(); + if (name.IsEmpty()) + return -1; + + return TexMan.CheckForTexture(name.GetChars(), ETextureType::Any).GetIndex(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FTeam, GetLogo, GetLogo) +{ + PARAM_SELF_STRUCT_PROLOGUE(FTeam); + ACTION_RETURN_INT(GetLogo(self)); +} + +static void GetLogoName(FTeam* self, FString* res) +{ + *res = self->GetLogo(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FTeam, GetLogoName, GetLogoName) +{ + PARAM_SELF_STRUCT_PROLOGUE(FTeam); + ACTION_RETURN_STRING(self->GetLogo()); +} + +static int AllowsCustomPlayerColor(FTeam* self) +{ + return self->GetAllowCustomPlayerColor(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FTeam, AllowsCustomPlayerColor, AllowsCustomPlayerColor) +{ + PARAM_SELF_STRUCT_PROLOGUE(FTeam); + ACTION_RETURN_BOOL(self->GetAllowCustomPlayerColor()); +} diff --git a/src/gamedata/teaminfo.h b/src/gamedata/teaminfo.h index 1c84d9b9b..1a3db705c 100644 --- a/src/gamedata/teaminfo.h +++ b/src/gamedata/teaminfo.h @@ -46,12 +46,12 @@ class FTeam public: FTeam (); void ParseTeamInfo (); - bool IsValidTeam (unsigned int uiTeam); + bool IsValidTeam (unsigned int uiTeam) const; const char *GetName () const; int GetPlayerColor () const; int GetTextColor () const; - FString GetLogo () const; + const FString& GetLogo () const; bool GetAllowCustomPlayerColor () const; int m_iPlayerCount; diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index e6c66fa44..65fc28943 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2969,7 +2969,16 @@ struct PlayerSkin native struct Team native { - const NoTeam = 255; - const Max = 16; + const NOTEAM = 255; + const MAX = 16; + native String mName; + + native static bool IsValid(uint teamIndex); + + native Color GetPlayerColor() const; + native int GetTextColor() const; + native TextureID GetLogo() const; + native string GetLogoName() const; + native bool AllowsCustomPlayerColor() const; } From 661b1d128e30be7a16656ea30bf2275f1b9235a1 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 29 Mar 2024 11:02:46 -0400 Subject: [PATCH 004/414] Added PSpriteTick virtual --- wadsrc/static/zscript/actors/actor.zs | 5 +++++ wadsrc/static/zscript/actors/player/player.zs | 22 ++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 72f441b10..7c52030da 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -509,6 +509,11 @@ class Actor : Thinker native native clearscope void DisableLocalRendering(uint playerNum, bool disable); native ui bool ShouldRenderLocally(); // Only clients get to check this, never the playsim. + // Called when the Actor is being used within a PSprite. This happens before potentially changing PSprite + // state so that any custom actions based on things like player input can be done before moving to the next + // state of something like a weapon. + virtual void PSpriteTick(PSprite psp) {} + // Called by inventory items to see if this actor is capable of touching them. // If true, the item will attempt to be picked up. Useful for things like // allowing morphs to pick up limited items such as keys while preventing diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index 65fc28943..0cee7a7f3 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2708,13 +2708,23 @@ class PSprite : Object native play { if (processPending) { - // drop tic count and possibly change state - if (Tics != -1) // a -1 tic count never changes + if (Caller) { - Tics--; - // [BC] Apply double firing speed. - if (bPowDouble && Tics && (Owner.mo.FindInventory ("PowerDoubleFiringSpeed", true))) Tics--; - if (!Tics && Caller != null) SetState(CurState.NextState); + Caller.PSpriteTick(self); + if (bDestroyed) + return; + } + + if (processPending) + { + // drop tic count and possibly change state + if (Tics != -1) // a -1 tic count never changes + { + Tics--; + // [BC] Apply double firing speed. + if (bPowDouble && Tics && (Owner.mo.FindInventory ("PowerDoubleFiringSpeed", true))) Tics--; + if (!Tics && Caller != null) SetState(CurState.NextState); + } } } } From 38cff89a238e7ed005648b53b00221f681e24ac4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 21 Apr 2024 12:12:21 +0200 Subject: [PATCH 005/414] ZWidgets: disabled SetClientFrame. On Win32 this function is unused, but it contains two API calls that only exist in Windows 10 or later. --- libraries/ZWidget/src/window/win32/win32window.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index f279bcf3f..8a1fda50c 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -128,6 +128,8 @@ void Win32Window::SetWindowFrame(const Rect& box) void Win32Window::SetClientFrame(const Rect& box) { + // This function is currently unused but needs to be disabled because it contains Windows API calls that were only added in Windows 10. +#if 0 double dpiscale = GetDpiScale(); RECT rect = {}; @@ -141,6 +143,7 @@ void Win32Window::SetClientFrame(const Rect& box) AdjustWindowRectExForDpi(&rect, style, FALSE, exstyle, GetDpiForWindow(WindowHandle)); SetWindowPos(WindowHandle, nullptr, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOACTIVATE | SWP_NOZORDER); +#endif } void Win32Window::Show() From 51b3e4b33527615e685510af491b78cfd425a022 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 21 Apr 2024 07:09:00 -0400 Subject: [PATCH 006/414] - dynamically import GetDpiForWindow from USER32.dll, else return a default value --- libraries/ZWidget/src/window/win32/win32window.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index 8a1fda50c..64d4701ed 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -271,9 +271,20 @@ int Win32Window::GetPixelHeight() const return box.bottom; } +typedef UINT(WINAPI* GetDpiForWindow_t)(HWND); double Win32Window::GetDpiScale() const { - return GetDpiForWindow(WindowHandle) / 96.0; + static GetDpiForWindow_t pGetDpiForWindow = nullptr; + if (!pGetDpiForWindow) + { + HMODULE hMod = LoadLibrary(TEXT("User32.dll")); + pGetDpiForWindow = reinterpret_cast(GetProcAddress(hMod, "GetDpiForWindow")); + } + + if (pGetDpiForWindow) + return pGetDpiForWindow(WindowHandle) / 96.0; + else + return 1.0; } std::string Win32Window::GetClipboardText() From 260c019301b7f32583576d13a3c2d64fa5969282 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 21 Apr 2024 14:30:26 +0200 Subject: [PATCH 007/414] optimized last commit to not retrieve the function repeatedly if it has already failed. --- libraries/ZWidget/src/window/win32/win32window.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index 64d4701ed..3ba21698a 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -275,10 +275,12 @@ typedef UINT(WINAPI* GetDpiForWindow_t)(HWND); double Win32Window::GetDpiScale() const { static GetDpiForWindow_t pGetDpiForWindow = nullptr; - if (!pGetDpiForWindow) + static bool done = false; + if (!done) { - HMODULE hMod = LoadLibrary(TEXT("User32.dll")); - pGetDpiForWindow = reinterpret_cast(GetProcAddress(hMod, "GetDpiForWindow")); + HMODULE hMod = GetModuleHandleA("User32.dll"); + if (hMod != nullptr) pGetDpiForWindow = reinterpret_cast(GetProcAddress(hMod, "GetDpiForWindow")); + done = true; } if (pGetDpiForWindow) From 0e1de064e31bff7c48e63f59b9eeb6babe15e461 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 21 Apr 2024 09:11:46 -0400 Subject: [PATCH 008/414] - hide the additional parameters for now, this needs to be added in later --- src/launcher/playgamepage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/launcher/playgamepage.cpp b/src/launcher/playgamepage.cpp index 5c585c9e5..ce30930f8 100644 --- a/src/launcher/playgamepage.cpp +++ b/src/launcher/playgamepage.cpp @@ -85,6 +85,7 @@ void PlayGamePage::OnGeometryChanged() y = GetHeight() - 10.0; +#if 0 // NYI: Additional Parameters double editHeight = 24.0; y -= editHeight; ParametersEdit->SetFrameGeometry(0.0, y, GetWidth(), editHeight); @@ -94,6 +95,7 @@ void PlayGamePage::OnGeometryChanged() y -= labelHeight; ParametersLabel->SetFrameGeometry(0.0, y, GetWidth(), labelHeight); y -= 10.0; +#endif double listViewBottom = y - 10.0; GamesList->SetFrameGeometry(0.0, listViewTop, GetWidth(), std::max(listViewBottom - listViewTop, 0.0)); From c3b9dd7c8f6d99d8e15f3a31164ca60bb66f41fd Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 21 Apr 2024 09:37:01 -0400 Subject: [PATCH 009/414] - minor language update --- wadsrc/static/language.csv | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index eb9e98808..080a605b2 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -1875,7 +1875,7 @@ Zorch Propulsor,TAG_ZORCHPROPULSOR,,,,Bzukový propulzor,,Zorch-Propeller,,Zorĉ Phasing Zorcher,TAG_PHASINGZORCHER,,,,Fázovací bzukr,,Phasenzorcher,,Fluktuantzorĉilo,Zorcher de Fase,,Vaiheiszorcheri,Zorcheur à Phase,Fokozatos Zorker,Zorcher di Fase,フェイシング ゾーチャー,전자 자쳐,Fasezorcher,,Fazowy Zorcher,Zorcher Fásico,,Zorcher Fazat,Фазерный зорчер,Фазни зорчер,Fasande Zorcher,Fazlama Zorcher,Фазовий Зорчер LAZ Device,TAG_LAZDEVICE,,,,Velkodosahový bzukr,LAZ-enhed,Flächenzorcher,,LAZ-Aparato,Dispositivo LAZ,,SAZ-laite,Zorcheur Zone Large,LAZ Készülék,Dispositivo LAZ,ラージエリアゾーキング デバイス,LAZ 장치,LAZ-aparaat,LAZ-enhet,Urządzenie LAZ,Dispositivo LAZ,,Dispozitiv LAZ,Устройство «ЗБР»,ЛАЗ уређај,LAZ-enhet,LAZ Cihazı,Пристрій LAZ %o was slimed by a flemoid.,OB_COMMONUS,,,,%o byl@[ao_cs] osliznut@[ao_cs] slizounem.,%o blev slimet af en flemoid.,%o wurde von einem Flemoiden vollgeschleimt.,,%o estas ŝlimiga de mukulo.,%o fue pegotead@[ao_esp] por un flemoide.,,%o joutui limatuksen limaamaksi.,%o à été gélifié par un flemoid.,%o el lett trutyizva egy Flemoid által.,%o è stato coperto di slime da un flemoid.,%o はフレモイドにベトベトにされた。,%o 은(는) 플레모이드에 의해 더러워졌습니다.,%o werd afgeslankt door een flemoid.,%o ble slimet av en flemoid.,"%o został@[ao_pl] oszlamion@[adj_pl] przez flemoida. -",%o foi melecad@[ao_ptb] por um flemóide.,%o foi suj@[ao_ptb] por um flemóide.,%o a fost transformat în mâzgă de un flemoid.,Игрока %o обслюнявил флемоид.,%o је унаказио љигавац.,%o blev slemmad av en flemoid.,%o bir flemoid tarafından sümüklendi., +",%o foi melecad@[ao_ptb] por um flemóide.,%o foi suj@[ao_ptb] por um flemóide.,%o a fost transformat în mâzgă de un flemoid.,Игрока %o обслюнявил флемоид.,%o је унаказио љигавац.,%o blev slemmad av en flemoid.,%o bir flemoid tarafından sümüklendi.,Виберіть рівень важкості: %o was slimed by a bipedicus.,OB_BIPEDICUS,,,,%o byl@[ao_cs] osliznut@[ao_cs] dvojnožkem.,%o blev slimet af en bipedicus.,%o wurde von einem Bipedicus vollgeschleimt.,,%o estas ŝlimiga de dupiedmukulo.,%o fue pegotead@[ao_esp] por un bipedicus.,,%o joutui bipedicuksen limaamaksi.,%o à été gélifié@[e_fr] par un bipedicus.,%o el lett trutyizva egy kétlábusz által.,%o è stato coperto di slime da un bipedicus.,%o はバイペディクスにベトベトにされた。,%o 은(는) 바이피디쿠스의 끈쩍한 시야에 걸렸습니다.,%o werd afgeslankt door een bipedicus.,%o ble slimet av en bipedicus.,%o został@[ao_pl] oszlamion@[adj_pl] przez bipedicusa.,%o foi melecad@[ao_ptb] por um bipedicus.,%o foi suj@[ao_ptb] por um bipedicus.,% a fost transformat în mâzgă de un biped.,Игрока %o обслюнявила двуножка.,%o је унаказио двоножни-љигавац.,%o blev slemmad av en bipedicus.,%o bir bipedicus tarafından sümüklendi., %o was slimed by an armored bipedicus.,OB_BIPEDICUS2,,,%o was slimed by an armoured bipedicus.,%o byl@[ao_cs] osliznut@[ao_cs] obrněným dvojnožkem.,%o blev slimet af en pansret bipedicus.,%o wurde von einem gepanzerten Bipedicus vollgeschleimt.,,%o estas ŝlimiga de kirasa dupiedmukulo.,%o fue pegotead@[ao_esp] por un bipedicus blindado.,,%o joutui panssaroidun bipedicuksen limaamaksi.,%o à été gélifié@[e_fr] par un bipedicus en armure.,%o el lett trutyizva egy páncélozott kétlábusz által.,%o è stato coperto di slime da un bipedicus corazzato.,%o はアーマードペディクスにベトベトにされた。,%o 은(는) 정예 바이피디쿠스의 찐득한 공격을 받았습니다.,%o werd afgeslankt door een gepantserde bipedicus.,%o ble slimet av en pansret bipedicus.,%o został@[ao_pl] oszlamion@[adj_pl] przez opancerzonego bipedicusa.,%o foi melecad@[ao_ptb] por um bipedicus de armadura.,%o foi suj@[ao_ptb] por um bipedicus de armadura.,"%o a fost transformat în mâzgă de un biped cu armură.",Игрока %o обслюнявила бронированная двуножка.,%o је унаказио оклопни-љигавац.,%o blev slemmad av en bepansrad bipedicus.,%o zırhlı bir bipedicus tarafından sümüklendi., @@ -3387,4 +3387,5 @@ HUD scale factor,SCALEMNU_HUD_SCALEFACTOR,hud_scalefactor,,,Faktor HUD škálov Spawn co-op only things in multiplayer,GMPLYMNU_COOPTHINGS,Any Actor that only appears in co-op is disabled,,,Co-op věci pouze v multiplayeru,,,,Ekaperigi nurajn kooperajn aĵojn en plurludanta reĝimo,,,,,,,マルチで協力モード限定thingsを出す,,,,,,,,Появление вещей из совместной игры в сетевой игре,,,, Spawn co-op only items in multiplayer,GMPLYMNU_COOPITEMS,Items that only appear in co-op are disabled,,,Co-op předměty pouze v multiplayeru,,,,Ekaperigi nurajn kooperajn objektojn en plurludanta reĝimo,,,,,,,マルチで協力モード限定アイテムを出す,,,,,,,,Появление предметов из совместной игры в сетевой игре,,,, Players pick up their own copy of items in multiplayer,GMPLYMNU_LOCALITEMS,Items are picked up client-side rather than fully taken by the client who picked it up,,,V multiplayeru hráči sbírají své vlastní kopie předmětů,,,,Ludantoj prenas sian propran kopion de objektoj en plurludanta reĝimo,,,,,,,マルチでプレイヤー達は複製アイテムを拾う,,,,,,,,Игроки подбирают собственные копии предметов в сетевой игре,,,, -Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,,,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,,,,クライアント側で落としたアイテムを拾わせない,,,,,,,,Отключить подбирание выпавших предметов на стороне клиента,,,, \ No newline at end of file +Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,,,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,,,,クライアント側で落としたアイテムを拾わせない,,,,,,,,Отключить подбирание выпавших предметов на стороне клиента,,,, +Restart on Death,MISCMNU_RESTARTONDEATH,Disables autoloading save on death,,,,,,,,,,,,,,,,,,,,,,Перезапуск после смерти,,,, \ No newline at end of file From 10a8a615cbaaa994ba9f6632c16ba3ce1a5c9430 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Wed, 17 Apr 2024 20:54:16 -0400 Subject: [PATCH 010/414] Fixed local copies of items not respecting their Amount value --- wadsrc/static/zscript/actors/inventory/inventory.zs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs index c9890c699..a2af10398 100644 --- a/wadsrc/static/zscript/actors/inventory/inventory.zs +++ b/wadsrc/static/zscript/actors/inventory/inventory.zs @@ -414,7 +414,10 @@ class Inventory : Actor { Inventory copy; - Amount = MIN(Amount, MaxAmount); + // Clamping this on local copy creation presents too many possible + // pitfalls (e.g. Health items). + if (!IsCreatingLocalCopy()) + Amount = MIN(Amount, MaxAmount); if (GoAway ()) { copy = Inventory(Spawn (GetClass())); @@ -1046,7 +1049,7 @@ class Inventory : Actor protected bool GoAway () { - if (bCreatingCopy) + if (IsCreatingLocalCopy()) return true; // Dropped items never stick around @@ -1130,6 +1133,11 @@ class Inventory : Actor return item; } + + protected clearscope bool IsCreatingLocalCopy() const + { + return bCreatingCopy; + } //=========================================================================== // From a938e9c66ce38ab30234534a496c14252ec577d1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 21 Apr 2024 18:30:19 +0200 Subject: [PATCH 011/414] moved the NetworkEntityManager into the backend code. --- src/common/objects/dobject.cpp | 161 ++++++++++++++++++++++++++++++++ src/common/objects/dobject.h | 21 +++++ src/d_main.cpp | 2 + src/d_net.cpp | 162 --------------------------------- src/d_net.h | 19 ---- src/g_game.cpp | 2 +- src/p_saveg.cpp | 2 +- 7 files changed, 186 insertions(+), 183 deletions(-) diff --git a/src/common/objects/dobject.cpp b/src/common/objects/dobject.cpp index b66029a53..e3d2b9240 100644 --- a/src/common/objects/dobject.cpp +++ b/src/common/objects/dobject.cpp @@ -622,3 +622,164 @@ void *DObject::ScriptVar(FName field, PType *type) // This is only for internal use so I_Error is fine. I_Error("Variable %s not found in %s\n", field.GetChars(), cls->TypeName.GetChars()); } + + +//========================================================================== +// +// +// +//========================================================================== + +void NetworkEntityManager::InitializeNetworkEntities() +{ + if (!s_netEntities.Size()) + s_netEntities.AppendFill(nullptr, NetIDStart); // Allocate the first 0-8 slots for the world and clients. +} + +// Clients need special handling since they always go in slots 1 - MAXPLAYERS. +void NetworkEntityManager::SetClientNetworkEntity(DObject* mo, const uint32_t id) +{ + // If resurrecting, we need to swap the corpse's position with the new pawn's + // position so it's no longer considered the client's body. + DObject* const oldBody = s_netEntities[id]; + if (oldBody != nullptr) + { + if (oldBody == mo) + return; + + const uint32_t curID = mo->GetNetworkID(); + + s_netEntities[curID] = oldBody; + oldBody->ClearNetworkID(); + oldBody->SetNetworkID(curID); + + mo->ClearNetworkID(); + } + else + { + RemoveNetworkEntity(mo); // Free up its current id. + } + + s_netEntities[id] = mo; + mo->SetNetworkID(ClientNetIDStart + id); +} + +void NetworkEntityManager::AddNetworkEntity(DObject* const ent) +{ + if (ent->IsNetworked()) + return; + + // Slot 0 is reserved for the world. + // Clients go in the first 1 - MAXPLAYERS slots + // Everything else is first come first serve. + uint32_t id = WorldNetID; + if (s_openNetIDs.Size()) + { + s_openNetIDs.Pop(id); + s_netEntities[id] = ent; + } + else + { + id = s_netEntities.Push(ent); + } + + ent->SetNetworkID(id); +} + +void NetworkEntityManager::RemoveNetworkEntity(DObject* const ent) +{ + if (!ent->IsNetworked()) + return; + + const uint32_t id = ent->GetNetworkID(); + if (id == WorldNetID) + return; + + assert(s_netEntities[id] == ent); + if (id >= NetIDStart) + s_openNetIDs.Push(id); + s_netEntities[id] = nullptr; + ent->ClearNetworkID(); +} + +DObject* NetworkEntityManager::GetNetworkEntity(const uint32_t id) +{ + if (id == WorldNetID || id >= s_netEntities.Size()) + return nullptr; + + return s_netEntities[id]; +} + +//========================================================================== +// +// +// +//========================================================================== + +void DObject::SetNetworkID(const uint32_t id) +{ + if (!IsNetworked()) + { + ObjectFlags |= OF_Networked; + _networkID = id; + } +} + +void DObject::ClearNetworkID() +{ + ObjectFlags &= ~OF_Networked; + _networkID = NetworkEntityManager::WorldNetID; +} + +void DObject::EnableNetworking(const bool enable) +{ + if (enable) + NetworkEntityManager::AddNetworkEntity(this); + else + NetworkEntityManager::RemoveNetworkEntity(this); +} + +void DObject::RemoveFromNetwork() +{ + NetworkEntityManager::RemoveNetworkEntity(this); +} + +static unsigned int GetNetworkID(DObject* const self) +{ + return self->GetNetworkID(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(DObject, GetNetworkID, GetNetworkID) +{ + PARAM_SELF_PROLOGUE(DObject); + + ACTION_RETURN_INT(self->GetNetworkID()); +} + +static void EnableNetworking(DObject* const self, const bool enable) +{ + self->EnableNetworking(enable); +} + +DEFINE_ACTION_FUNCTION_NATIVE(DObject, EnableNetworking, EnableNetworking) +{ + PARAM_SELF_PROLOGUE(DObject); + PARAM_BOOL(enable); + + self->EnableNetworking(enable); + return 0; +} + +static DObject* GetNetworkEntity(const unsigned int id) +{ + return NetworkEntityManager::GetNetworkEntity(id); +} + +DEFINE_ACTION_FUNCTION_NATIVE(DObject, GetNetworkEntity, GetNetworkEntity) +{ + PARAM_PROLOGUE; + PARAM_UINT(id); + + ACTION_RETURN_OBJECT(NetworkEntityManager::GetNetworkEntity(id)); +} + diff --git a/src/common/objects/dobject.h b/src/common/objects/dobject.h index f193379c1..f7f1e195d 100644 --- a/src/common/objects/dobject.h +++ b/src/common/objects/dobject.h @@ -487,4 +487,25 @@ inline T *&DObject::PointerVar(FName field) return *(T**)ScriptVar(field, nullptr); // pointer check is more tricky and for the handful of uses in the DECORATE parser not worth the hassle. } + +class NetworkEntityManager +{ +private: + inline static TArray s_netEntities = {}; + inline static TArray s_openNetIDs = {}; + +public: + NetworkEntityManager() = delete; + + static constexpr uint32_t WorldNetID = 0u; + static constexpr uint32_t ClientNetIDStart = 1u; + inline static uint32_t NetIDStart;// = MAXPLAYERS + 1u; + + static void InitializeNetworkEntities(); + static void SetClientNetworkEntity(DObject* mo, const uint32_t id); + static void AddNetworkEntity(DObject* const ent); + static void RemoveNetworkEntity(DObject* const ent); + static DObject* GetNetworkEntity(const uint32_t id); +}; + #endif //__DOBJECT_H__ diff --git a/src/d_main.cpp b/src/d_main.cpp index 723fff388..a4e8f5eb9 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1,4 +1,5 @@ //----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- // Copyright 1993-1996 id Software // Copyright 1999-2016 Randy Heit // Copyright 2002-2016 Christoph Oelckers @@ -3617,6 +3618,7 @@ static int D_DoomMain_Internal (void) const char *wad; FIWadManager *iwad_man; + NetworkEntityManager::NetIDStart = MAXPLAYERS + 1; GC::AddMarkerFunc(GC_MarkGameRoots); VM_CastSpriteIDToString = Doom_CastSpriteIDToString; diff --git a/src/d_net.cpp b/src/d_net.cpp index 656b07e0b..d70425f76 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2971,168 +2971,6 @@ int Net_GetLatency(int *ld, int *ad) // //========================================================================== -void NetworkEntityManager::InitializeNetworkEntities() -{ - if (!s_netEntities.Size()) - s_netEntities.AppendFill(nullptr, NetIDStart); // Allocate the first 0-8 slots for the world and clients. -} - -// Clients need special handling since they always go in slots 1 - MAXPLAYERS. -void NetworkEntityManager::SetClientNetworkEntity(player_t* const client) -{ - AActor* const mo = client->mo; - const uint32_t id = ClientNetIDStart + mo->Level->PlayerNum(client); - - // If resurrecting, we need to swap the corpse's position with the new pawn's - // position so it's no longer considered the client's body. - DObject* const oldBody = s_netEntities[id]; - if (oldBody != nullptr) - { - if (oldBody == mo) - return; - - const uint32_t curID = mo->GetNetworkID(); - - s_netEntities[curID] = oldBody; - oldBody->ClearNetworkID(); - oldBody->SetNetworkID(curID); - - mo->ClearNetworkID(); - } - else - { - RemoveNetworkEntity(mo); // Free up its current id. - } - - s_netEntities[id] = mo; - mo->SetNetworkID(id); -} - -void NetworkEntityManager::AddNetworkEntity(DObject* const ent) -{ - if (ent->IsNetworked()) - return; - - // Slot 0 is reserved for the world. - // Clients go in the first 1 - MAXPLAYERS slots - // Everything else is first come first serve. - uint32_t id = WorldNetID; - if (s_openNetIDs.Size()) - { - s_openNetIDs.Pop(id); - s_netEntities[id] = ent; - } - else - { - id = s_netEntities.Push(ent); - } - - ent->SetNetworkID(id); -} - -void NetworkEntityManager::RemoveNetworkEntity(DObject* const ent) -{ - if (!ent->IsNetworked()) - return; - - const uint32_t id = ent->GetNetworkID(); - if (id == WorldNetID) - return; - - assert(s_netEntities[id] == ent); - if (id >= NetIDStart) - s_openNetIDs.Push(id); - s_netEntities[id] = nullptr; - ent->ClearNetworkID(); -} - -DObject* NetworkEntityManager::GetNetworkEntity(const uint32_t id) -{ - if (id == WorldNetID || id >= s_netEntities.Size()) - return nullptr; - - return s_netEntities[id]; -} - -//========================================================================== -// -// -// -//========================================================================== - -void DObject::SetNetworkID(const uint32_t id) -{ - if (!IsNetworked()) - { - ObjectFlags |= OF_Networked; - _networkID = id; - } -} - -void DObject::ClearNetworkID() -{ - ObjectFlags &= ~OF_Networked; - _networkID = NetworkEntityManager::WorldNetID; -} - -void DObject::EnableNetworking(const bool enable) -{ - if (enable) - NetworkEntityManager::AddNetworkEntity(this); - else - NetworkEntityManager::RemoveNetworkEntity(this); -} - -void DObject::RemoveFromNetwork() -{ - NetworkEntityManager::RemoveNetworkEntity(this); -} - -static unsigned int GetNetworkID(DObject* const self) -{ - return self->GetNetworkID(); -} - -DEFINE_ACTION_FUNCTION_NATIVE(DObject, GetNetworkID, GetNetworkID) -{ - PARAM_SELF_PROLOGUE(DObject); - - ACTION_RETURN_INT(self->GetNetworkID()); -} - -static void EnableNetworking(DObject* const self, const bool enable) -{ - self->EnableNetworking(enable); -} - -DEFINE_ACTION_FUNCTION_NATIVE(DObject, EnableNetworking, EnableNetworking) -{ - PARAM_SELF_PROLOGUE(DObject); - PARAM_BOOL(enable); - - self->EnableNetworking(enable); - return 0; -} - -static DObject* GetNetworkEntity(const unsigned int id) -{ - return NetworkEntityManager::GetNetworkEntity(id); -} - -DEFINE_ACTION_FUNCTION_NATIVE(DObject, GetNetworkEntity, GetNetworkEntity) -{ - PARAM_PROLOGUE; - PARAM_UINT(id); - - ACTION_RETURN_OBJECT(NetworkEntityManager::GetNetworkEntity(id)); -} - -//========================================================================== -// -// -// -//========================================================================== - // [RH] List "ping" times CCMD (pings) { diff --git a/src/d_net.h b/src/d_net.h index e4029bd66..e6a6a32b9 100644 --- a/src/d_net.h +++ b/src/d_net.h @@ -98,25 +98,6 @@ extern int ticdup; class player_t; class DObject; -class NetworkEntityManager -{ -private: - inline static TArray s_netEntities = {}; - inline static TArray s_openNetIDs = {}; - -public: - NetworkEntityManager() = delete; - - inline static uint32_t WorldNetID = 0u; - inline static uint32_t ClientNetIDStart = 1u; - inline static uint32_t NetIDStart = MAXPLAYERS + 1u; - - static void InitializeNetworkEntities(); - static void SetClientNetworkEntity(player_t* const client); - static void AddNetworkEntity(DObject* const ent); - static void RemoveNetworkEntity(DObject* const ent); - static DObject* GetNetworkEntity(const uint32_t id); -}; // [RH] // New generic packet structure: diff --git a/src/g_game.cpp b/src/g_game.cpp index ac09977d8..56a84d482 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1425,7 +1425,7 @@ void FLevelLocals::PlayerReborn (int player) p->oldbuttons = ~0, p->attackdown = true; p->usedown = true; // don't do anything immediately p->original_oldbuttons = ~0; p->playerstate = PST_LIVE; - NetworkEntityManager::SetClientNetworkEntity(p); + NetworkEntityManager::SetClientNetworkEntity(p->mo, p - players); if (gamestate != GS_TITLELEVEL) { diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index de4f7c1c1..e58124759 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -660,7 +660,7 @@ void FLevelLocals::SerializePlayers(FSerializer &arc, bool skipload) for (unsigned int i = 0u; i < MAXPLAYERS; ++i) { if (PlayerInGame(i) && Players[i]->mo != nullptr) - NetworkEntityManager::SetClientNetworkEntity(Players[i]); + NetworkEntityManager::SetClientNetworkEntity(Players[i]->mo, i); } } } From d45a4f18d46f482847f8d54300c87d9dafd7cadc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 22 Apr 2024 07:14:04 +0200 Subject: [PATCH 012/414] fix lifetime of skyinfo variable in HWWall::SkyPlane. --- src/rendering/hwrenderer/scene/hw_sky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_sky.cpp b/src/rendering/hwrenderer/scene/hw_sky.cpp index dfa954530..45ff8c5e7 100644 --- a/src/rendering/hwrenderer/scene/hw_sky.cpp +++ b/src/rendering/hwrenderer/scene/hw_sky.cpp @@ -137,9 +137,9 @@ void HWWall::SkyPlane(HWWallDispatcher *di, sector_t *sector, int plane, bool al // Either a regular sky or a skybox with skyboxes disabled if ((sportal == nullptr && sector->GetTexture(plane) == skyflatnum) || (gl_noskyboxes && sportal != nullptr && sportal->mType == PORTS_SKYVIEWPOINT)) { + HWSkyInfo skyinfo; if (di->di) { - HWSkyInfo skyinfo; skyinfo.init(di->di, sector, plane, sector->skytransfer, Colormap.FadeColor); ptype = PORTALTYPE_SKY; sky = &skyinfo; From 29e103363e960d6bc9af6bedf2c90153b808f541 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 22 Apr 2024 22:09:32 +0800 Subject: [PATCH 013/414] ZDRay specs fix --- specs/udmf_zdoom.txt | 2 +- src/namedef_custom.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index e3c73df4d..402f3d6e8 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -424,7 +424,7 @@ Note: All fields default to false unless mentioned otherwise. lm_sampledist = ; // ZDRay lightmap sample distance for the entire map. Defines the map units each lightmap texel covers. Must be in powers of two. Default = 8 lm_suncolor = ; // ZDRay lightmap sun color in hex. Default = "FFFFFF" - sourceradius = ; // ZDRay lightmap light soft shadow amount. Higher values produce softer shadows. Default = 5.0 + SourceRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 7d6d095f2..e04dc3795 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -863,7 +863,9 @@ xx(lm_sampledist_ceiling) xx(lm_dynamic) xx(lm_suncolor) xx(lm_sampledist) -xx(sourceradius) + +// Light keywords +xx(SourceRadius) xx(skew_bottom_type) xx(skew_middle_type) From a3e61ce33ba454cdc0e41def2ef3fa969c6f5793 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 22 Apr 2024 16:53:12 -0400 Subject: [PATCH 014/414] - `-norun` now implies `-stdout` on Windows as it's useless without it --- src/common/platform/win32/i_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index 6977055b7..acadc2dc8 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -158,7 +158,7 @@ int DoMain (HINSTANCE hInstance) Args->AppendArg(FString(wargv[i])); } - if (Args->CheckParm("-stdout")) + if (Args->CheckParm("-stdout") || Args->CheckParm("-norun")) { // As a GUI application, we don't normally get a console when we start. // If we were run from the shell and are on XP+, we can attach to its From 586e89954a6d706efd184adb04079b998de12535 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 23 Apr 2024 20:30:44 -0400 Subject: [PATCH 015/414] - fixed: rollsprites now 'unstretch' properly in regular y-billboarding --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 8ada22c8b..341bb2001 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -355,6 +355,12 @@ void HandleSpriteOffsets(Matrix3x4 *mat, const FRotator *HW, FVector2 *offset, b bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) { + float pixelstretch = 1.2; + if (actor && actor->Level) + pixelstretch = actor->Level->pixelstretch; + else if (particle && particle->subsector && particle->subsector->sector && particle->subsector->sector->Level) + pixelstretch = particle->subsector->sector->Level->pixelstretch; + FVector3 center = FVector3((x1 + x2) * 0.5, (y1 + y2) * 0.5, (z1 + z2) * 0.5); const auto& HWAngles = di->Viewpoint.HWAngles; Matrix3x4 mat; @@ -421,12 +427,6 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) // [Nash] check for special sprite drawing modes if (drawWithXYBillboard || isWallSprite) { - float pixelstretch = 1.2; - if (actor && actor->Level) - pixelstretch = actor->Level->pixelstretch; - else if (particle && particle->subsector && particle->subsector->sector && particle->subsector->sector->Level) - pixelstretch = particle->subsector->sector->Level->pixelstretch; - mat.MakeIdentity(); mat.Translate(center.X, center.Z, center.Y); // move to sprite center mat.Scale(1.0, 1.0/pixelstretch, 1.0); // unstretch sprite by level aspect ratio @@ -509,9 +509,11 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) float rollDegrees = Angles.Roll.Degrees(); mat.Translate(center.X, center.Z, center.Y); + mat.Scale(1.0, 1.0/pixelstretch, 1.0); // unstretch sprite by level aspect ratio if (useOffsets) mat.Translate(xx, zz, yy); mat.Rotate(cos(angleRad), 0, sin(angleRad), rollDegrees); if (useOffsets) mat.Translate(-xx, -zz, -yy); + mat.Scale(1.0, pixelstretch, 1.0); // stretch sprite by level aspect ratio mat.Translate(-center.X, -center.Z, -center.Y); } From 83d751af72b51223ccee97c32fda3b363ccbcd10 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 24 Apr 2024 06:52:01 -0400 Subject: [PATCH 016/414] - demote SDL_Wait errors to console printouts --- libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 2cb52e2b5..808244a22 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -289,7 +289,11 @@ void SDL2DisplayWindow::RunLoop() SDL_Event event; int result = SDL_WaitEvent(&event); if (result == 0) - throw std::runtime_error(std::string("SDL_WaitEvent failed:") + SDL_GetError()); + { + fprintf(stderr, "SDL_WaitEvent failed: "); + fprintf(stderr, SDL_GetError()); + fprintf(stderr, "\n"); + } DispatchEvent(event); } } From eba90361646fba61a0f0b809df3e58c77ff5d97c Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 24 Apr 2024 07:17:09 -0400 Subject: [PATCH 017/414] - shorten sdl_waitevent error message --- libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 808244a22..9ccf859e0 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -289,11 +289,7 @@ void SDL2DisplayWindow::RunLoop() SDL_Event event; int result = SDL_WaitEvent(&event); if (result == 0) - { - fprintf(stderr, "SDL_WaitEvent failed: "); - fprintf(stderr, SDL_GetError()); - fprintf(stderr, "\n"); - } + fprintf(stderr, "SDL_WaitEvent failed: %s\n", SDL_GetError()); DispatchEvent(event); } } From 36a4207a9879387bd756828569828d775ce8a015 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 25 Apr 2024 02:27:20 -0400 Subject: [PATCH 018/414] - make gcc14 happy --- libraries/ZWidget/src/widgets/lineedit/lineedit.cpp | 2 +- src/common/filesystem/source/resourcefile.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp index 34391fd19..5c90e68e1 100644 --- a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp +++ b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp @@ -1,4 +1,4 @@ - +#include #include "widgets/lineedit/lineedit.h" #include "core/utf8reader.h" #include "core/colorf.h" diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp index 7a6085d2f..81e2b7850 100644 --- a/src/common/filesystem/source/resourcefile.cpp +++ b/src/common/filesystem/source/resourcefile.cpp @@ -34,6 +34,7 @@ ** */ +#include #include #include "resourcefile.h" #include "md5.hpp" @@ -45,7 +46,7 @@ #include "wildcards.hpp" namespace FileSys { - + // this is for restricting shared file readers to the main thread. thread_local bool mainThread; void SetMainThread() From d9f03863bfd80157c9d67c0c4b05d4d7e98cd90c Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 25 Apr 2024 02:27:20 -0400 Subject: [PATCH 019/414] - make gcc14 happy --- libraries/ZWidget/src/widgets/lineedit/lineedit.cpp | 2 +- src/common/filesystem/source/resourcefile.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp index 34391fd19..5c90e68e1 100644 --- a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp +++ b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp @@ -1,4 +1,4 @@ - +#include #include "widgets/lineedit/lineedit.h" #include "core/utf8reader.h" #include "core/colorf.h" diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp index 7a6085d2f..81e2b7850 100644 --- a/src/common/filesystem/source/resourcefile.cpp +++ b/src/common/filesystem/source/resourcefile.cpp @@ -34,6 +34,7 @@ ** */ +#include #include #include "resourcefile.h" #include "md5.hpp" @@ -45,7 +46,7 @@ #include "wildcards.hpp" namespace FileSys { - + // this is for restricting shared file readers to the main thread. thread_local bool mainThread; void SetMainThread() From 2b697d6c4c29b84604c1ed30031eba642d96fea4 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 07:52:44 -0400 Subject: [PATCH 020/414] Interpolation fix for network prediction This is a minor fix for interpolation when playing online as predicted movement was not properly having its prev data reset like a real tick would be. This resulted in jittery player sprites in third person. --- src/playsim/p_user.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 9751fc268..b67ed2bb9 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1481,6 +1481,8 @@ void P_PredictPlayer (player_t *player) R_RebuildViewInterpolation(player); player->cmd = localcmds[i % LOCALCMDTICS]; + player->mo->ClearInterpolation(); + player->mo->ClearFOVInterpolation(); P_PlayerThink (player); player->mo->Tick (); From 7c9c7fa1f7886501515903eaa50fa41541382188 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 25 Apr 2024 18:14:39 +0200 Subject: [PATCH 021/414] fixed: AActor's members must all be native. The morph code added 4 scripted ones, but AActor's size must be known at compile time. --- src/playsim/actor.h | 7 ++++++- src/playsim/p_mobj.cpp | 8 +++++++- src/scripting/vmthunks_actors.cpp | 4 ++++ wadsrc/static/zscript/actors/morph.zs | 8 ++++---- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 8e562f125..ece9be8e0 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1362,18 +1362,23 @@ public: DVector3 Prev; DRotator PrevAngles; DAngle PrevFOV; - int PrevPortalGroup; TArray AttachedLights; TDeletingArray UserLights; + int PrevPortalGroup; // When was this actor spawned? int SpawnTime; uint32_t SpawnOrder; + int UnmorphTime; + int MorphFlags; + int PremorphProperties; + PClassActor* MorphExitFlash; // landing speed from a jump with normal gravity (squats the player's view) // (note: this is put into AActor instead of the PlayerPawn because non-players also use the value) double LandingSpeed; + // ThingIDs void SetTID (int newTID); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 5e7a19f0c..185260505 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -393,7 +393,13 @@ void AActor::Serialize(FSerializer &arc) A("userlights", UserLights) A("WorldOffset", WorldOffset) ("modelData", modelData) - A("LandingSpeed", LandingSpeed); + A("LandingSpeed", LandingSpeed) + + ("unmorphtime", UnmorphTime) + ("morphflags", MorphFlags) + ("premorphproperties", PremorphProperties) + ("morphexitflash", MorphExitFlash); + SerializeTerrain(arc, "floorterrain", floorterrain, &def->floorterrain); SerializeArgs(arc, "args", args, def->args, special); diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 7094212e0..acf253807 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2126,6 +2126,10 @@ DEFINE_FIELD(AActor, ShadowAimFactor) DEFINE_FIELD(AActor, ShadowPenaltyFactor) DEFINE_FIELD(AActor, AutomapOffsets) DEFINE_FIELD(AActor, LandingSpeed) +DEFINE_FIELD(AActor, UnmorphTime) +DEFINE_FIELD(AActor, MorphFlags) +DEFINE_FIELD(AActor, PremorphProperties) +DEFINE_FIELD(AActor, MorphExitFlash) DEFINE_FIELD_X(FCheckPosition, FCheckPosition, thing); DEFINE_FIELD_X(FCheckPosition, FCheckPosition, pos); diff --git a/wadsrc/static/zscript/actors/morph.zs b/wadsrc/static/zscript/actors/morph.zs index b9fdbb101..9cd21287a 100644 --- a/wadsrc/static/zscript/actors/morph.zs +++ b/wadsrc/static/zscript/actors/morph.zs @@ -35,10 +35,10 @@ extend class Actor MPROP_INVIS = 1 << 6, } - int UnmorphTime; - EMorphFlags MorphFlags; - class MorphExitFlash; - EPremorphProperty PremorphProperties; + native int UnmorphTime; + native int MorphFlags; + native class MorphExitFlash; + native int PremorphProperties; // Players still track these separately for legacy reasons. void SetMorphStyle(EMorphFlags flags) From 566e03da60faccd0139829e25cc56d8fa7df6f72 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 12:55:26 -0400 Subject: [PATCH 022/414] Fixed incorrect automap arrow position in multiplayer This caused the player arrows to update at only 35Hz and for the console player's arrow it would lag behind when following. --- src/am_map.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index f08ce8909..48bc53823 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2880,7 +2880,8 @@ void DAutomap::drawPlayers () if (p->mo != nullptr) { - DVector3 pos = p->mo->PosRelative(MapPortalGroup); + DVector2 pos = p->mo->InterpolatedPosition(r_viewpoint.TicFrac).XY(); + pos += Level->Displacements.getOffset(Level->PointInSector(pos)->PortalGroup, MapPortalGroup); pt.x = pos.X; pt.y = pos.Y; From cf6bad97e8d913dcd50df987172909dd6df28dcc Mon Sep 17 00:00:00 2001 From: Boondorl Date: Wed, 24 Apr 2024 12:46:30 -0400 Subject: [PATCH 023/414] Fixes for client network IDs Fixed an off-by-one error on client IDs (these need to start at 1 as 0 is an invalid network ID). Morphing will now swap the client body's ID so it remains in the first 1 - MAXPLAYERS slots. --- src/common/objects/dobject.cpp | 3 ++- src/common/objects/dobject.h | 2 +- src/playsim/p_mobj.cpp | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/common/objects/dobject.cpp b/src/common/objects/dobject.cpp index e3d2b9240..dc0d9a579 100644 --- a/src/common/objects/dobject.cpp +++ b/src/common/objects/dobject.cpp @@ -637,10 +637,11 @@ void NetworkEntityManager::InitializeNetworkEntities() } // Clients need special handling since they always go in slots 1 - MAXPLAYERS. -void NetworkEntityManager::SetClientNetworkEntity(DObject* mo, const uint32_t id) +void NetworkEntityManager::SetClientNetworkEntity(DObject* mo, const unsigned int playNum) { // If resurrecting, we need to swap the corpse's position with the new pawn's // position so it's no longer considered the client's body. + const uint32_t id = ClientNetIDStart + playNum; DObject* const oldBody = s_netEntities[id]; if (oldBody != nullptr) { diff --git a/src/common/objects/dobject.h b/src/common/objects/dobject.h index f7f1e195d..c0b6aecb5 100644 --- a/src/common/objects/dobject.h +++ b/src/common/objects/dobject.h @@ -502,7 +502,7 @@ public: inline static uint32_t NetIDStart;// = MAXPLAYERS + 1u; static void InitializeNetworkEntities(); - static void SetClientNetworkEntity(DObject* mo, const uint32_t id); + static void SetClientNetworkEntity(DObject* mo, const unsigned int playNum); static void AddNetworkEntity(DObject* const ent); static void RemoveNetworkEntity(DObject* const ent); static DObject* GetNetworkEntity(const uint32_t id); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 185260505..3bc54c8d7 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -5390,6 +5390,10 @@ int MorphPointerSubstitution(AActor* from, AActor* to) { to->player = from->player; from->player = nullptr; + + // Swap the new body into the right network slot if it's a client (this doesn't + // really matter for regular Actors since they grab any ID they can get anyway). + NetworkEntityManager::SetClientNetworkEntity(to, to->player - players); } if (from->alternative != nullptr) From ca95e18742371730702e3d8785e9200b1adcf028 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 16:10:00 -0400 Subject: [PATCH 024/414] View fixes when predicting View interpolation paths are now reset properly when predicting, fixing portals. Teleporters disabling view interpolation is now handled before every movement instead of only once at the start of predicting. Enabled FoV interpolation when playing online. --- src/playsim/p_mobj.cpp | 4 ---- src/playsim/p_user.cpp | 21 ++++++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 3bc54c8d7..671a65238 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -3662,10 +3662,6 @@ void AActor::SetViewAngle(DAngle ang, int fflags) double AActor::GetFOV(double ticFrac) { - // [B] Disable interpolation when playing online, otherwise it gets vomit inducing - if (netgame) - return player ? player->FOV : CameraFOV; - double fov; if (player) { diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index b67ed2bb9..055b347a1 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1437,7 +1437,6 @@ void P_PredictPlayer (player_t *player) act->flags &= ~MF_PICKUP; act->flags2 &= ~MF2_PUSHWALL; - act->renderflags &= ~RF_NOINTERPOLATEVIEW; player->cheats |= CF_PREDICTING; BackupNodeList(act, act->touching_sectorlist, §or_t::touching_thinglist, PredictionTouchingSectors_sprev_Backup, PredictionTouchingSectorsBackup); @@ -1474,11 +1473,16 @@ void P_PredictPlayer (player_t *player) act->BlockNode = NULL; // Values too small to be usable for lerping can be considered "off". - bool CanLerp = (!(cl_predict_lerpscale < 0.01f) && (ticdup == 1)), DoLerp = false, NoInterpolateOld = R_GetViewInterpolationStatus(); + bool CanLerp = (!(cl_predict_lerpscale < 0.01f) && (ticdup == 1)), DoLerp = false; + // This essentially acts like a mini P_Ticker where only the stuff relevant to the client is actually + // called. Call order is preserved. for (int i = gametic; i < maxtic; ++i) { - if (!NoInterpolateOld) - R_RebuildViewInterpolation(player); + // Make sure any portal paths have been cleared from the previous movement. + R_ClearInterpolationPath(); + r_NoInterpolate = false; + // Because we're always predicting, this will get set by teleporters and then can never unset itself in the renderer properly. + player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; player->cmd = localcmds[i % LOCALCMDTICS]; player->mo->ClearInterpolation(); @@ -1486,7 +1490,7 @@ void P_PredictPlayer (player_t *player) P_PlayerThink (player); player->mo->Tick (); - if (CanLerp && PredictionLast.gametic > 0 && i == PredictionLast.gametic && !NoInterpolateOld) + if (CanLerp && PredictionLast.gametic > 0 && i == PredictionLast.gametic) { // Z is not compared as lifts will alter this with no apparent change // Make lerping less picky by only testing whole units @@ -1503,12 +1507,11 @@ void P_PredictPlayer (player_t *player) } } + // TODO: This should be changed to a proper rubberbanding solution in the near future (only rubberband if there was + // a mismatch between client's last predicted pos and current predicted pos). if (CanLerp) { - if (NoInterpolateOld) - P_PredictionLerpReset(); - - else if (DoLerp) + if (DoLerp) { // If lerping is already in effect, use the previous camera postion so the view doesn't suddenly snap PredictionLerpFrom = (PredictionLerptics == 0) ? PredictionLast : PredictionLerpResult; From f0aa0acf0849bd1f776f1263cec22a83c8f9c051 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 18:09:53 -0400 Subject: [PATCH 025/414] Fixed changeskill being unnetworked --- src/console/c_cmds.cpp | 5 +++-- src/d_net.cpp | 5 +++++ src/d_protocol.h | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/console/c_cmds.cpp b/src/console/c_cmds.cpp index b4e9b8810..19c5c9d50 100644 --- a/src/console/c_cmds.cpp +++ b/src/console/c_cmds.cpp @@ -412,7 +412,7 @@ CCMD (changeskill) { if (!players[consoleplayer].mo || !usergame) { - Printf ("Use the skill command when not in a game.\n"); + Printf ("Cannot change skills while not in a game.\n"); return; } @@ -431,7 +431,8 @@ CCMD (changeskill) } else { - NextSkill = skill; + Net_WriteInt8(DEM_CHANGESKILL); + Net_WriteInt32(skill); Printf ("Skill %d will take effect on the next map.\n", skill); } } diff --git a/src/d_net.cpp b/src/d_net.cpp index d70425f76..b785b52e2 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2753,6 +2753,10 @@ void Net_DoCommand (int type, uint8_t **stream, int player) primaryLevel->localEventManager->NetCommand(netCmd); } break; + + case DEM_CHANGESKILL: + NextSkill = ReadInt32(stream); + break; default: I_Error ("Unknown net command: %d", type); @@ -2848,6 +2852,7 @@ void Net_SkipCommand (int type, uint8_t **stream) case DEM_INVUSE: case DEM_FOV: case DEM_MYFOV: + case DEM_CHANGESKILL: skip = 4; break; diff --git a/src/d_protocol.h b/src/d_protocol.h index 33fa10966..f726a6ef2 100644 --- a/src/d_protocol.h +++ b/src/d_protocol.h @@ -164,6 +164,7 @@ enum EDemoCommand DEM_SETINV, // 72 SetInventory DEM_ENDSCREENJOB, DEM_ZSC_CMD, // 74 String: Command, Word: Byte size of command + DEM_CHANGESKILL, // 75 Int: Skill }; // The following are implemented by cht_DoCheat in m_cheat.cpp From 287277b1f8058f8d4ba7a92e24089ce7fb10f8ee Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 26 Apr 2024 13:10:49 -0400 Subject: [PATCH 026/414] Player spawn fix in co-op new games If there aren't enough player spawns present in co-op, the game will instead fail to spawn extra players, waiting for the ticker to automatically capture the fact they have PST_ENTER. This presents a problem in WorldLoaded() where it becomes unreliable whether or not a player has truly spawned. This also means those extra players had slightly different spawn behavior compared to regular pawns. --- src/g_level.cpp | 2 +- src/p_setup.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 686057d64..1278494b2 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1478,7 +1478,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au for (int i = 0; imo != nullptr) - P_PlayerStartStomp(Players[i]->mo); + P_PlayerStartStomp(Players[i]->mo, !deathmatch); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 02f89c860..23bf28e98 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -504,6 +504,18 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) } } } + else if (newGame) + { + for (i = 0; i < MAXPLAYERS; ++i) + { + // Didn't have a player spawn available so spawn it now. + if (Level->PlayerInGame(i) && Level->Players[i]->playerstate == PST_ENTER && Level->Players[i]->mo == nullptr) + { + FPlayerStart* mthing = Level->PickPlayerStart(i); + Level->SpawnPlayer(mthing, i, (Level->flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + } + } + } // [SP] move unfriendly players around // horribly hacky - yes, this needs rewritten. From 12d0c946f059759634d8744c7f5d084ec6089120 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 26 Apr 2024 15:12:47 -0400 Subject: [PATCH 027/414] Reworked clientside lerping Now acts as a rubberbanding effect. The result is that movement is now considered correct and adjusted towards the real position if not rather than cautiously moving towards the predicted position. --- src/playsim/p_user.cpp | 138 +++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 055b347a1..d00f7571b 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -103,16 +103,26 @@ CVAR(Bool, sv_singleplayerrespawn, false, CVAR_SERVERINFO | CVAR_CHEAT) // Variables for prediction CVAR (Bool, cl_noprediction, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, cl_predict_specials, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +// Deprecated +CVAR(Float, cl_predict_lerpscale, 0.05f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Float, cl_predict_lerpthreshold, 2.00f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -CUSTOM_CVAR(Float, cl_predict_lerpscale, 0.05f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CUSTOM_CVAR(Float, cl_rubberband_scale, 0.3f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { - P_PredictionLerpReset(); + if (self < 0.0f) + self = 0.0f; + else if (self > 1.0f) + self = 1.0f; } -CUSTOM_CVAR(Float, cl_predict_lerpthreshold, 2.00f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CUSTOM_CVAR(Float, cl_rubberband_threshold, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +{ + if (self < 0.1f) + self = 0.1f; +} +CUSTOM_CVAR(Float, cl_rubberband_minmove, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { if (self < 0.1f) self = 0.1f; - P_PredictionLerpReset(); } ColorSetList ColorSets; @@ -125,13 +135,9 @@ CUSTOM_CVAR(Float, fov, 90.f, CVAR_ARCHIVE | CVAR_USERINFO | CVAR_NOINITCALL) p->SetFOV(fov); } -struct PredictPos -{ - int gametic; - DVector3 pos; - DRotator angles; -} static PredictionLerpFrom, PredictionLerpResult, PredictionLast; -static int PredictionLerptics; +static DVector3 LastPredictedPosition; +static int LastPredictedPortalGroup; +static int LastPredictedTic; static player_t PredictionPlayerBackup; static AActor *PredictionActor; @@ -1290,23 +1296,25 @@ void P_PlayerThink (player_t *player) void P_PredictionLerpReset() { - PredictionLerptics = PredictionLast.gametic = PredictionLerpFrom.gametic = PredictionLerpResult.gametic = 0; + LastPredictedPosition = DVector3{}; + LastPredictedPortalGroup = 0; + LastPredictedTic = -1; } -bool P_LerpCalculate(AActor *pmo, PredictPos from, PredictPos to, PredictPos &result, float scale) +void P_LerpCalculate(AActor* pmo, const DVector3& from, DVector3 &result, float scale, float threshold, float minMove) { - DVector3 vecFrom = from.pos; - DVector3 vecTo = to.pos; - DVector3 vecResult; - vecResult = vecTo - vecFrom; - vecResult *= scale; - vecResult = vecResult + vecFrom; - DVector3 delta = vecResult - vecTo; + DVector3 diff = pmo->Pos() - from; + diff.XY() += pmo->Level->Displacements.getOffset(pmo->Sector->PortalGroup, pmo->Level->PointInSector(from.XY())->PortalGroup); + double dist = diff.Length(); + if (dist <= max(threshold, minMove)) + { + result = pmo->Pos(); + return; + } - result.pos = pmo->Vec3Offset(vecResult - to.pos); - - // As a fail safe, assume extrapolation is the threshold. - return (delta.LengthSquared() > cl_predict_lerpthreshold && scale <= 1.00f); + diff /= dist; + diff *= min(dist * (1.0f - scale), dist - minMove); + result = pmo->Vec3Offset(-diff.X, -diff.Y, -diff.Z); } template @@ -1472,10 +1480,12 @@ void P_PredictPlayer (player_t *player) } act->BlockNode = NULL; - // Values too small to be usable for lerping can be considered "off". - bool CanLerp = (!(cl_predict_lerpscale < 0.01f) && (ticdup == 1)), DoLerp = false; // This essentially acts like a mini P_Ticker where only the stuff relevant to the client is actually // called. Call order is preserved. + bool rubberband = false; + DVector3 rubberbandPos = {}; + const bool canRubberband = LastPredictedTic >= 0 && cl_rubberband_scale > 0.0f && cl_rubberband_scale < 1.0f; + const double rubberbandThreshold = max(cl_rubberband_minmove, cl_rubberband_threshold); for (int i = gametic; i < maxtic; ++i) { // Make sure any portal paths have been cleared from the previous movement. @@ -1484,58 +1494,52 @@ void P_PredictPlayer (player_t *player) // Because we're always predicting, this will get set by teleporters and then can never unset itself in the renderer properly. player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; + // Got snagged on something. Start correcting towards the player's final predicted position. We're + // being intentionally generous here by not really caring how the player got to that position, only + // that they ended up in the same spot on the same tick. + if (canRubberband && LastPredictedTic == i) + { + DVector3 diff = player->mo->Pos() - LastPredictedPosition; + diff += player->mo->Level->Displacements.getOffset(player->mo->Sector->PortalGroup, LastPredictedPortalGroup); + double dist = diff.LengthSquared(); + if (dist >= EQUAL_EPSILON * EQUAL_EPSILON && dist > rubberbandThreshold * rubberbandThreshold) + { + rubberband = true; + rubberbandPos = player->mo->Pos(); + } + } + player->cmd = localcmds[i % LOCALCMDTICS]; player->mo->ClearInterpolation(); player->mo->ClearFOVInterpolation(); P_PlayerThink (player); player->mo->Tick (); - - if (CanLerp && PredictionLast.gametic > 0 && i == PredictionLast.gametic) - { - // Z is not compared as lifts will alter this with no apparent change - // Make lerping less picky by only testing whole units - DoLerp = (int)PredictionLast.pos.X != (int)player->mo->X() || (int)PredictionLast.pos.Y != (int)player->mo->Y(); - - // Aditional Debug information - if (developer >= DMSG_NOTIFY && DoLerp) - { - DPrintf(DMSG_NOTIFY, "Lerp! Ltic (%d) && Ptic (%d) | Lx (%f) && Px (%f) | Ly (%f) && Py (%f)\n", - PredictionLast.gametic, i, - (PredictionLast.pos.X), (player->mo->X()), - (PredictionLast.pos.Y), (player->mo->Y())); - } - } } - // TODO: This should be changed to a proper rubberbanding solution in the near future (only rubberband if there was - // a mismatch between client's last predicted pos and current predicted pos). - if (CanLerp) + if (rubberband) { - if (DoLerp) - { - // If lerping is already in effect, use the previous camera postion so the view doesn't suddenly snap - PredictionLerpFrom = (PredictionLerptics == 0) ? PredictionLast : PredictionLerpResult; - PredictionLerptics = 1; - } + R_ClearInterpolationPath(); + player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; - PredictionLast.gametic = maxtic - 1; - PredictionLast.pos = player->mo->Pos(); - //PredictionLast.portalgroup = player->mo->Sector->PortalGroup; + DPrintf(DMSG_NOTIFY, "Prediction mismatch at (%.3f, %.3f, %.3f)\nExpected: (%.3f, %.3f, %.3f)\nCorrecting to (%.3f, %.3f, %.3f)\n", + LastPredictedPosition.X, LastPredictedPosition.Y, LastPredictedPosition.Z, + rubberbandPos.X, rubberbandPos.Y, rubberbandPos.Z, + player->mo->X(), player->mo->Y(), player->mo->Z()); - if (PredictionLerptics > 0) - { - if (PredictionLerpFrom.gametic > 0 && - P_LerpCalculate(player->mo, PredictionLerpFrom, PredictionLast, PredictionLerpResult, (float)PredictionLerptics * cl_predict_lerpscale)) - { - PredictionLerptics++; - player->mo->SetXYZ(PredictionLerpResult.pos); - } - else - { - PredictionLerptics = 0; - } - } + DVector3 snapPos = {}; + P_LerpCalculate(player->mo, LastPredictedPosition, snapPos, cl_rubberband_scale, cl_rubberband_threshold, cl_rubberband_minmove); + player->mo->PrevPortalGroup = LastPredictedPortalGroup; + player->mo->Prev = LastPredictedPosition; + const double zOfs = player->viewz - player->mo->Z(); + player->mo->SetXYZ(snapPos); + player->viewz = snapPos.Z + zOfs; } + + // This is intentionally done after rubberbanding starts since it'll automatically smooth itself towards + // the right spot until it reaches it. + LastPredictedTic = maxtic; + LastPredictedPosition = player->mo->Pos(); + LastPredictedPortalGroup = player->mo->Level->PointInSector(LastPredictedPosition)->PortalGroup; } void P_UnPredictPlayer () From b43c440552964578f35782714ca6765a4030ce37 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Mon, 22 Apr 2024 20:45:33 -0400 Subject: [PATCH 028/414] Added ShouldShareItem virtual Allows for easier customizing of whether or not an item should be shared with players upon pickup in co-op (e.g. it allows it to be expanded to weapons with custom cvars). --- wadsrc/static/zscript/actors/inventory/inv_misc.zs | 10 ++++++++++ wadsrc/static/zscript/actors/inventory/inventory.zs | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/actors/inventory/inv_misc.zs b/wadsrc/static/zscript/actors/inventory/inv_misc.zs index 318d29491..7dd374932 100644 --- a/wadsrc/static/zscript/actors/inventory/inv_misc.zs +++ b/wadsrc/static/zscript/actors/inventory/inv_misc.zs @@ -43,6 +43,11 @@ class Key : Inventory static native clearscope Color GetMapColorForKey(Key key); static native clearscope int GetKeyTypeCount(); static native clearscope class GetKeyType(int index); + + override bool ShouldShareItem(Actor giver) + { + return sv_coopsharekeys; + } override bool HandlePickup (Inventory item) { @@ -113,6 +118,11 @@ class PuzzleItem : Inventory PuzzleItem.FailMessage("$TXT_USEPUZZLEFAILED"); PuzzleItem.FailSound "*puzzfail"; } + + override bool ShouldShareItem(Actor giver) + { + return sv_coopsharekeys; + } override bool HandlePickup (Inventory item) { diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs index a2af10398..564989459 100644 --- a/wadsrc/static/zscript/actors/inventory/inventory.zs +++ b/wadsrc/static/zscript/actors/inventory/inventory.zs @@ -261,6 +261,11 @@ class Inventory : Actor } } + virtual bool ShouldShareItem(Actor giver) + { + return false; + } + protected void ShareItemWithPlayers(Actor giver) { if (bSharingItem) @@ -695,7 +700,7 @@ class Inventory : Actor toucher.HasReceived(self); // If the item can be shared, make sure every player gets a copy. - if (multiplayer && !deathmatch && sv_coopsharekeys && bIsKeyItem) + if (multiplayer && !deathmatch && ShouldShareItem(toucher)) ShareItemWithPlayers(toucher); } return res, toucher; From 861a557d9224b589a588c8ffda1a95750eea265a Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Sat, 6 Jan 2024 17:55:20 +0300 Subject: [PATCH 029/414] Add graycheckVal, expose hud_oldscale/hud_scalefactor to the menu Add graycheckVal to OptionMenu items Add menu elements for hud_oldscale and hud_scalefactor to menudef.txt --- wadsrc/static/menudef.txt | 8 ++-- .../zscript/engine/ui/menu/optionmenuitems.zs | 46 ++++++++++--------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 7c8359cd5..fe289c6c8 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1078,9 +1078,11 @@ OptionMenu "ScalingOptions" protected StaticText "$SCALEMNU_OVERRIDE", 1 ScaleSlider "$SCALEMNU_MESSAGES", "con_scaletext", 0.0, 8.0, 1.0, "$SCALEMNU_USEUI" ScaleSlider "$SCALEMNU_CONSOLE", "con_scale", 0.0, 8.0, 1.0, "$SCALEMNU_USEUI" - ScaleSlider "$SCALEMNU_STATBAR", "st_scale", -1.0, 8.0, 1.0, "$SCALEMNU_USEUI", "$SCALEMNU_USEFS" - ScaleSlider "$SCALEMNU_HUD", "hud_scale", -1.0, 8.0, 1.0, "$SCALEMNU_USEUI", "$SCALEMNU_USEFS" - ScaleSlider "$SCALEMNU_ALTHUD", "hud_althudscale", 0.0, 8.0, 1.0, "$SCALEMNU_USEUI" + Option "$SCALEMNU_HUD_OLDSCALE", "hud_oldscale", "OnOff" + Slider "$SCALEMNU_HUD_SCALEFACTOR", "hud_scalefactor", 0.0, 1.0, 0.025, 3, "hud_oldscale", 1 + ScaleSlider "$SCALEMNU_STATBAR", "st_scale", -1.0, 8.0, 1.0, "$SCALEMNU_USEUI", "$SCALEMNU_USEFS", "hud_oldscale" + ScaleSlider "$SCALEMNU_HUD", "hud_scale", -1.0, 8.0, 1.0, "$SCALEMNU_USEUI", "$SCALEMNU_USEFS", "hud_oldscale" + ScaleSlider "$SCALEMNU_ALTHUD", "hud_althudscale", 0.0, 8.0, 1.0, "$SCALEMNU_USEUI", "", "hud_oldscale" StaticText " " Option "$SCALEMNU_HUDASPECT", "hud_aspectscale", "OnOff" StaticText " " diff --git a/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs b/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs index 8276dda3e..9fc0d66ff 100644 --- a/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs +++ b/wadsrc/static/zscript/engine/ui/menu/optionmenuitems.zs @@ -37,13 +37,15 @@ class OptionMenuItem : MenuItemBase String mLabel; bool mCentered; CVar mGrayCheck; + int mGrayCheckVal; - protected void Init(String label, String command, bool center = false, CVar graycheck = null) + protected void Init(String label, String command, bool center = false, CVar graycheck = null, int graycheckVal = 0) { Super.Init(0, 0, command); mLabel = label; mCentered = center; mGrayCheck = graycheck; + mGrayCheckVal = graycheckVal; } protected void drawText(int x, int y, int color, String text, bool grayed = false) @@ -75,7 +77,7 @@ class OptionMenuItem : MenuItemBase virtual bool IsGrayed() { - return mGrayCheck != null && !mGrayCheck.GetInt(); + return mGrayCheck != null && mGrayCheck.GetInt() == mGrayCheckVal; } override bool Selectable() @@ -263,9 +265,9 @@ class OptionMenuItemOptionBase : OptionMenuItem const OP_VALUES = 0x11001; - protected void Init(String label, Name command, Name values, CVar graycheck, int center) + protected void Init(String label, Name command, Name values, CVar graycheck, int center, int graycheckVal = 0) { - Super.Init(label, command, false, graycheck); + Super.Init(label, command, false, graycheck, graycheckVal); mValues = values; mCenter = center; } @@ -361,9 +363,9 @@ class OptionMenuItemOption : OptionMenuItemOptionBase private static native void SetCVarDescription(CVar cv, String label); - OptionMenuItemOption Init(String label, Name command, Name values, CVar graycheck = null, int center = 0) + OptionMenuItemOption Init(String label, Name command, Name values, CVar graycheck = null, int center = 0, int graycheckVal = 0) { - Super.Init(label, command, values, graycheck, center); + Super.Init(label, command, values, graycheck, center, graycheckVal); mCVar = CVar.FindCVar(mAction); if (mCVar) SetCVarDescription(mCVar, label); return self; @@ -699,9 +701,9 @@ class OptionMenuSliderBase : OptionMenuItem int mDrawX; int mSliderShort; - protected void Init(String label, double min, double max, double step, int showval, Name command = 'none', CVar graycheck = NULL) + protected void Init(String label, double min, double max, double step, int showval, Name command = 'none', CVar graycheck = NULL, int graycheckVal = 0) { - Super.Init(label, command, false, graycheck); + Super.Init(label, command, false, graycheck, graycheckVal); mMin = min; mMax = max; mStep = step; @@ -855,9 +857,9 @@ class OptionMenuItemSlider : OptionMenuSliderBase { CVar mCVar; - OptionMenuItemSlider Init(String label, Name command, double min, double max, double step, int showval = 1, CVar graycheck = NULL) + OptionMenuItemSlider Init(String label, Name command, double min, double max, double step, int showval = 1, CVar graycheck = NULL, int graycheckVal = 0) { - Super.Init(label, min, max, step, showval, command, graycheck); + Super.Init(label, min, max, step, showval, command, graycheck, graycheckVal); mCVar =CVar.FindCVar(command); return self; } @@ -895,9 +897,9 @@ class OptionMenuItemColorPicker : OptionMenuItem const CPF_RESET = 0x20001; - OptionMenuItemColorPicker Init(String label, Name command, CVar graycheck = null) + OptionMenuItemColorPicker Init(String label, Name command, CVar graycheck = null, int graycheckVal = 0) { - Super.Init(label, command, false, graycheck); + Super.Init(label, command, false, graycheck, graycheckVal); CVar cv = CVar.FindCVar(command); if (cv != null && cv.GetRealType() != CVar.CVAR_Color) cv = null; mCVar = cv; @@ -974,9 +976,9 @@ class OptionMenuFieldBase : OptionMenuItem { CVar mCVar; - void Init (String label, Name command, CVar graycheck = null) + void Init (String label, Name command, CVar graycheck = null, int graycheckVal = 0) { - Super.Init(label, command, false, graycheck); + Super.Init(label, command, false, graycheck, graycheckVal); mCVar = CVar.FindCVar(mAction); } @@ -1037,9 +1039,9 @@ class OptionMenuItemTextField : OptionMenuFieldBase { TextEnterMenu mEnter; - OptionMenuItemTextField Init (String label, Name command, CVar graycheck = null) + OptionMenuItemTextField Init (String label, Name command, CVar graycheck = null, int graycheckVal = 0) { - Super.Init(label, command, graycheck); + Super.Init(label, command, graycheck, graycheckVal); mEnter = null; return self; } @@ -1109,9 +1111,9 @@ class OptionMenuItemTextField : OptionMenuFieldBase class OptionMenuItemNumberField : OptionMenuFieldBase { - OptionMenuItemNumberField Init (String label, Name command, float minimum = 0, float maximum = 100, float step = 1, CVar graycheck = null) + OptionMenuItemNumberField Init (String label, Name command, float minimum = 0, float maximum = 100, float step = 1, CVar graycheck = null, int graycheckVal = 0) { - Super.Init(label, command, graycheck); + Super.Init(label, command, graycheck, graycheckVal); mMinimum = min(minimum, maximum); mMaximum = max(minimum, maximum); mStep = max(1, step); @@ -1169,9 +1171,9 @@ class OptionMenuItemScaleSlider : OptionMenuItemSlider String TextNegOne; int mClickVal; - OptionMenuItemScaleSlider Init(String label, Name command, double min, double max, double step, String zero, String negone = "", CVar graycheck = null) + OptionMenuItemScaleSlider Init(String label, Name command, double min, double max, double step, String zero, String negone = "", CVar graycheck = null, int graycheckVal = 0) { - Super.Init(label, command, min, max, step, 0, graycheck); + Super.Init(label, command, min, max, step, 0, graycheck, graycheckVal); mCVar =CVar.FindCVar(command); TextZero = zero; TextNEgOne = negone; @@ -1237,9 +1239,9 @@ class OptionMenuItemFlagOption : OptionMenuItemOption { int mBitShift; - OptionMenuItemFlagOption Init(String label, Name command, Name values, int bitShift, CVar greycheck = null, int center = 0) + OptionMenuItemFlagOption Init(String label, Name command, Name values, int bitShift, CVar greycheck = null, int center = 0, int graycheckVal = 0) { - Super.Init(label, command, values, greycheck, center); + Super.Init(label, command, values, greycheck, center, graycheckVal); mBitShift = bitShift; return self; From f7a15bc5f9e995ff63298ccd46eef938e846306e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 27 Apr 2024 10:45:50 +0200 Subject: [PATCH 030/414] added emulation of Final Doom's teleporter z glitch and activate it for Saturnia MAP10 --- src/d_main.cpp | 2 ++ src/doomdef.h | 1 + src/maploader/compatibility.cpp | 1 + src/playsim/p_lnspec.cpp | 2 +- src/playsim/p_spec.h | 1 + src/playsim/p_teleport.cpp | 23 ++++++++++++++++++++--- wadsrc/static/compatibility.txt | 5 +++++ wadsrc/static/menudef.txt | 2 ++ 8 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index a4e8f5eb9..c570eddc4 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -713,6 +713,8 @@ CVAR (Flag, compat_railing, compatflags2, COMPATF2_RAILING); CVAR (Flag, compat_avoidhazard, compatflags2, COMPATF2_AVOID_HAZARDS); CVAR (Flag, compat_stayonlift, compatflags2, COMPATF2_STAYONLIFT); CVAR (Flag, compat_nombf21, compatflags2, COMPATF2_NOMBF21); +CVAR (Flag, compat_voodoozombies, compatflags2, COMPATF2_VOODOO_ZOMBIES); +CVAR (Flag, compat_fdteleport, compatflags2, COMPATF2_FDTELEPORT); CVAR(Bool, vid_activeinbackground, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) diff --git a/src/doomdef.h b/src/doomdef.h index 98fa88d93..811b4fa5e 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -241,6 +241,7 @@ enum : unsigned int COMPATF2_STAYONLIFT = 1 << 13, // yet another MBF thing. COMPATF2_NOMBF21 = 1 << 14, // disable MBF21 features that may clash with certain maps COMPATF2_VOODOO_ZOMBIES = 1 << 15, // [RL0] allow playerinfo, playerpawn, and voodoo health to all be different, and skip killing the player's mobj if a voodoo doll dies to allow voodoo zombies + COMPATF2_FDTELEPORT = 1 << 16, // Emulate Final Doom's teleporter z glitch. }; diff --git a/src/maploader/compatibility.cpp b/src/maploader/compatibility.cpp index 802ec3465..7caddc90a 100644 --- a/src/maploader/compatibility.cpp +++ b/src/maploader/compatibility.cpp @@ -173,6 +173,7 @@ static FCompatOption Options[] = { "scriptwait", COMPATF2_SCRIPTWAIT, SLOT_COMPAT2 }, { "nombf21", COMPATF2_NOMBF21, SLOT_COMPAT2 }, { "voodoozombies", COMPATF2_VOODOO_ZOMBIES, SLOT_COMPAT2 }, + { "fdteleport", COMPATF2_FDTELEPORT, SLOT_COMPAT2 }, { NULL, 0, 0 } }; diff --git a/src/playsim/p_lnspec.cpp b/src/playsim/p_lnspec.cpp index 73666d0c3..00318dfbb 100644 --- a/src/playsim/p_lnspec.cpp +++ b/src/playsim/p_lnspec.cpp @@ -1120,7 +1120,7 @@ FUNC(LS_Teleport_NewMap) FUNC(LS_Teleport) // Teleport (tid, sectortag, bNoSourceFog) { - int flags = TELF_DESTFOG; + int flags = TELF_DESTFOG | TELF_FDCOMPAT; if (!arg2) { flags |= TELF_SOURCEFOG; diff --git a/src/playsim/p_spec.h b/src/playsim/p_spec.h index 5d602eb1d..cc7d990a9 100644 --- a/src/playsim/p_spec.h +++ b/src/playsim/p_spec.h @@ -141,6 +141,7 @@ enum TELF_KEEPHEIGHT = 16, TELF_ROTATEBOOM = 32, TELF_ROTATEBOOMINVERSE = 64, + TELF_FDCOMPAT = 128, }; //Spawns teleport fog. Pass the actor to pluck TeleFogFromType and TeleFogToType. 'from' determines if this is the fog to spawn at the old position (true) or new (false). diff --git a/src/playsim/p_teleport.cpp b/src/playsim/p_teleport.cpp index 1643b1b76..a69d3654c 100644 --- a/src/playsim/p_teleport.cpp +++ b/src/playsim/p_teleport.cpp @@ -128,7 +128,15 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) } else { - pos.Z = floorheight; + if (!(thing->Level->i_compatflags2 & COMPATF2_FDTELEPORT) || !(flags & TELF_FDCOMPAT) || floorheight > thing->Z()) + { + pos.Z = floorheight; + } + else + { + pos.Z = thing->Z(); + } + if (!(flags & TELF_KEEPORIENTATION)) { resetpitch = false; @@ -145,7 +153,16 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) } else { - pos.Z = floorheight; + // emulation of Final Doom's teleport glitch. + // For walking monsters we still have to force them to the ground because the handling of off-ground monsters is different from vanilla. + if (!(thing->Level->i_compatflags2 & COMPATF2_FDTELEPORT) || !(flags & TELF_FDCOMPAT) || !(thing->flags & MF_NOGRAVITY) || floorheight > pos.Z) + { + pos.Z = floorheight; + } + else + { + pos.Z = thing->Z(); + } } } // [MK] notify thing of incoming teleport, check for an early cancel @@ -245,7 +262,7 @@ DEFINE_ACTION_FUNCTION(AActor, Teleport) PARAM_FLOAT(z); PARAM_ANGLE(an); PARAM_INT(flags); - ACTION_RETURN_BOOL(P_Teleport(self, DVector3(x, y, z), an, flags)); + ACTION_RETURN_BOOL(P_Teleport(self, DVector3(x, y, z), an, flags & ~TELF_FDCOMPAT)); } //----------------------------------------------------------------------------- diff --git a/wadsrc/static/compatibility.txt b/wadsrc/static/compatibility.txt index 2440ef55f..f8c3fe453 100644 --- a/wadsrc/static/compatibility.txt +++ b/wadsrc/static/compatibility.txt @@ -332,3 +332,8 @@ F1EB6927F53047F219A54997DAD9DC81 // mm2.wad map20 rebuildnodes trace } + +BA2247ED1465C8107192AC4215B2A5F3 // saturnia.wad map10 +{ + fdteleport +} diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index fe289c6c8..a213f593f 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1760,6 +1760,7 @@ OptionMenu "CompatActorMenu" protected Option "$CMPTMNU_INVISIBILITY", "compat_INVISIBILITY", "YesNo" Option "$CMPTMNU_MINOTAUR", "compat_MINOTAUR", "YesNo" Option "$CMPTMNU_NOTOSSDROPS", "compat_NOTOSSDROPS", "YesNo" + Option "$CMPTMNU_VOODOOZOMBIES", "compat_voodoozombies", "YesNo" Class "CompatibilityMenu" } @@ -1786,6 +1787,7 @@ OptionMenu "CompatMapMenu" protected Option "$CMPTMNU_POINTONLINE", "compat_pointonline", "YesNo" Option "$CMPTMNU_MULTIEXIT", "compat_multiexit", "YesNo" Option "$CMPTMNU_TELEPORT", "compat_teleport", "YesNo" + Option "$CMPTMNU_FDTELEPORT", "compat_fdteleport", "YesNo" Option "$CMPTMNU_PUSHWINDOW", "compat_pushwindow", "YesNo" Option "$CMPTMNU_CHECKSWITCHRANGE", "compat_checkswitchrange", "YesNo" Option "$CMPTMNU_RAILINGHACK", "compat_railing", "YesNo" From 45cf72ff48ef21c145f248d90bd19a6caf51e655 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 27 Apr 2024 11:57:22 +0200 Subject: [PATCH 031/414] fixed bad network ID assignment. ClientNetIDStart was added twice here. This was asserting when loading a savegame. --- src/common/objects/dobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/objects/dobject.cpp b/src/common/objects/dobject.cpp index dc0d9a579..4ba504738 100644 --- a/src/common/objects/dobject.cpp +++ b/src/common/objects/dobject.cpp @@ -662,7 +662,7 @@ void NetworkEntityManager::SetClientNetworkEntity(DObject* mo, const unsigned in } s_netEntities[id] = mo; - mo->SetNetworkID(ClientNetIDStart + id); + mo->SetNetworkID(id); } void NetworkEntityManager::AddNetworkEntity(DObject* const ent) From 572ba9f515780530eb63c28fd9154ab0ce62e326 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 07:52:44 -0400 Subject: [PATCH 032/414] Interpolation fix for network prediction This is a minor fix for interpolation when playing online as predicted movement was not properly having its prev data reset like a real tick would be. This resulted in jittery player sprites in third person. --- src/playsim/p_user.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 6839b412a..dad3a9870 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1481,6 +1481,8 @@ void P_PredictPlayer (player_t *player) R_RebuildViewInterpolation(player); player->cmd = localcmds[i % LOCALCMDTICS]; + player->mo->ClearInterpolation(); + player->mo->ClearFOVInterpolation(); P_PlayerThink (player); player->mo->Tick (); From 347cb724e3c1681689158fcb39ac8523870f7bdc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 25 Apr 2024 18:14:39 +0200 Subject: [PATCH 033/414] fixed: AActor's members must all be native. The morph code added 4 scripted ones, but AActor's size must be known at compile time. --- src/playsim/actor.h | 7 ++++++- src/playsim/p_mobj.cpp | 8 +++++++- src/scripting/vmthunks_actors.cpp | 4 ++++ wadsrc/static/zscript/actors/morph.zs | 8 ++++---- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 8e562f125..ece9be8e0 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1362,18 +1362,23 @@ public: DVector3 Prev; DRotator PrevAngles; DAngle PrevFOV; - int PrevPortalGroup; TArray AttachedLights; TDeletingArray UserLights; + int PrevPortalGroup; // When was this actor spawned? int SpawnTime; uint32_t SpawnOrder; + int UnmorphTime; + int MorphFlags; + int PremorphProperties; + PClassActor* MorphExitFlash; // landing speed from a jump with normal gravity (squats the player's view) // (note: this is put into AActor instead of the PlayerPawn because non-players also use the value) double LandingSpeed; + // ThingIDs void SetTID (int newTID); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index e1a1fb6fb..daa19670f 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -393,7 +393,13 @@ void AActor::Serialize(FSerializer &arc) A("userlights", UserLights) A("WorldOffset", WorldOffset) ("modelData", modelData) - A("LandingSpeed", LandingSpeed); + A("LandingSpeed", LandingSpeed) + + ("unmorphtime", UnmorphTime) + ("morphflags", MorphFlags) + ("premorphproperties", PremorphProperties) + ("morphexitflash", MorphExitFlash); + SerializeTerrain(arc, "floorterrain", floorterrain, &def->floorterrain); SerializeArgs(arc, "args", args, def->args, special); diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 7094212e0..acf253807 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2126,6 +2126,10 @@ DEFINE_FIELD(AActor, ShadowAimFactor) DEFINE_FIELD(AActor, ShadowPenaltyFactor) DEFINE_FIELD(AActor, AutomapOffsets) DEFINE_FIELD(AActor, LandingSpeed) +DEFINE_FIELD(AActor, UnmorphTime) +DEFINE_FIELD(AActor, MorphFlags) +DEFINE_FIELD(AActor, PremorphProperties) +DEFINE_FIELD(AActor, MorphExitFlash) DEFINE_FIELD_X(FCheckPosition, FCheckPosition, thing); DEFINE_FIELD_X(FCheckPosition, FCheckPosition, pos); diff --git a/wadsrc/static/zscript/actors/morph.zs b/wadsrc/static/zscript/actors/morph.zs index b9fdbb101..9cd21287a 100644 --- a/wadsrc/static/zscript/actors/morph.zs +++ b/wadsrc/static/zscript/actors/morph.zs @@ -35,10 +35,10 @@ extend class Actor MPROP_INVIS = 1 << 6, } - int UnmorphTime; - EMorphFlags MorphFlags; - class MorphExitFlash; - EPremorphProperty PremorphProperties; + native int UnmorphTime; + native int MorphFlags; + native class MorphExitFlash; + native int PremorphProperties; // Players still track these separately for legacy reasons. void SetMorphStyle(EMorphFlags flags) From 503f716507bbc21492908f2cb2bd1d45a0606a2d Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 12:55:26 -0400 Subject: [PATCH 034/414] Fixed incorrect automap arrow position in multiplayer This caused the player arrows to update at only 35Hz and for the console player's arrow it would lag behind when following. --- src/am_map.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 61f8a3366..41d60cb55 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2880,7 +2880,8 @@ void DAutomap::drawPlayers () if (p->mo != nullptr) { - DVector3 pos = p->mo->PosRelative(MapPortalGroup); + DVector2 pos = p->mo->InterpolatedPosition(r_viewpoint.TicFrac).XY(); + pos += Level->Displacements.getOffset(Level->PointInSector(pos)->PortalGroup, MapPortalGroup); pt.x = pos.X; pt.y = pos.Y; From 3f07d4e689a0db34128d7b1c2762c912bb905f80 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 16:10:00 -0400 Subject: [PATCH 035/414] View fixes when predicting View interpolation paths are now reset properly when predicting, fixing portals. Teleporters disabling view interpolation is now handled before every movement instead of only once at the start of predicting. Enabled FoV interpolation when playing online. --- src/playsim/p_mobj.cpp | 4 ---- src/playsim/p_user.cpp | 21 ++++++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index daa19670f..a75925996 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -3662,10 +3662,6 @@ void AActor::SetViewAngle(DAngle ang, int fflags) double AActor::GetFOV(double ticFrac) { - // [B] Disable interpolation when playing online, otherwise it gets vomit inducing - if (netgame) - return player ? player->FOV : CameraFOV; - double fov; if (player) { diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index dad3a9870..e5f02b2fe 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1437,7 +1437,6 @@ void P_PredictPlayer (player_t *player) act->flags &= ~MF_PICKUP; act->flags2 &= ~MF2_PUSHWALL; - act->renderflags &= ~RF_NOINTERPOLATEVIEW; player->cheats |= CF_PREDICTING; BackupNodeList(act, act->touching_sectorlist, §or_t::touching_thinglist, PredictionTouchingSectors_sprev_Backup, PredictionTouchingSectorsBackup); @@ -1474,11 +1473,16 @@ void P_PredictPlayer (player_t *player) act->BlockNode = NULL; // Values too small to be usable for lerping can be considered "off". - bool CanLerp = (!(cl_predict_lerpscale < 0.01f) && (ticdup == 1)), DoLerp = false, NoInterpolateOld = R_GetViewInterpolationStatus(); + bool CanLerp = (!(cl_predict_lerpscale < 0.01f) && (ticdup == 1)), DoLerp = false; + // This essentially acts like a mini P_Ticker where only the stuff relevant to the client is actually + // called. Call order is preserved. for (int i = gametic; i < maxtic; ++i) { - if (!NoInterpolateOld) - R_RebuildViewInterpolation(player); + // Make sure any portal paths have been cleared from the previous movement. + R_ClearInterpolationPath(); + r_NoInterpolate = false; + // Because we're always predicting, this will get set by teleporters and then can never unset itself in the renderer properly. + player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; player->cmd = localcmds[i % LOCALCMDTICS]; player->mo->ClearInterpolation(); @@ -1486,7 +1490,7 @@ void P_PredictPlayer (player_t *player) P_PlayerThink (player); player->mo->Tick (); - if (CanLerp && PredictionLast.gametic > 0 && i == PredictionLast.gametic && !NoInterpolateOld) + if (CanLerp && PredictionLast.gametic > 0 && i == PredictionLast.gametic) { // Z is not compared as lifts will alter this with no apparent change // Make lerping less picky by only testing whole units @@ -1503,12 +1507,11 @@ void P_PredictPlayer (player_t *player) } } + // TODO: This should be changed to a proper rubberbanding solution in the near future (only rubberband if there was + // a mismatch between client's last predicted pos and current predicted pos). if (CanLerp) { - if (NoInterpolateOld) - P_PredictionLerpReset(); - - else if (DoLerp) + if (DoLerp) { // If lerping is already in effect, use the previous camera postion so the view doesn't suddenly snap PredictionLerpFrom = (PredictionLerptics == 0) ? PredictionLast : PredictionLerpResult; From 6040416caae48722474d76e646a4d33d18a10326 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 25 Apr 2024 18:09:53 -0400 Subject: [PATCH 036/414] Fixed changeskill being unnetworked --- src/console/c_cmds.cpp | 5 +++-- src/d_net.cpp | 5 +++++ src/d_protocol.h | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/console/c_cmds.cpp b/src/console/c_cmds.cpp index 3871b47dd..0ec5cfe05 100644 --- a/src/console/c_cmds.cpp +++ b/src/console/c_cmds.cpp @@ -412,7 +412,7 @@ CCMD (changeskill) { if (!players[consoleplayer].mo || !usergame) { - Printf ("Use the skill command when not in a game.\n"); + Printf ("Cannot change skills while not in a game.\n"); return; } @@ -431,7 +431,8 @@ CCMD (changeskill) } else { - NextSkill = skill; + Net_WriteInt8(DEM_CHANGESKILL); + Net_WriteInt32(skill); Printf ("Skill %d will take effect on the next map.\n", skill); } } diff --git a/src/d_net.cpp b/src/d_net.cpp index ca45da4ef..6dbbc2c5c 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2753,6 +2753,10 @@ void Net_DoCommand (int type, uint8_t **stream, int player) primaryLevel->localEventManager->NetCommand(netCmd); } break; + + case DEM_CHANGESKILL: + NextSkill = ReadInt32(stream); + break; default: I_Error ("Unknown net command: %d", type); @@ -2848,6 +2852,7 @@ void Net_SkipCommand (int type, uint8_t **stream) case DEM_INVUSE: case DEM_FOV: case DEM_MYFOV: + case DEM_CHANGESKILL: skip = 4; break; diff --git a/src/d_protocol.h b/src/d_protocol.h index 33fa10966..f726a6ef2 100644 --- a/src/d_protocol.h +++ b/src/d_protocol.h @@ -164,6 +164,7 @@ enum EDemoCommand DEM_SETINV, // 72 SetInventory DEM_ENDSCREENJOB, DEM_ZSC_CMD, // 74 String: Command, Word: Byte size of command + DEM_CHANGESKILL, // 75 Int: Skill }; // The following are implemented by cht_DoCheat in m_cheat.cpp From 0e8325401d2e319a52fc5511acf501d91438908f Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 26 Apr 2024 13:10:49 -0400 Subject: [PATCH 037/414] Player spawn fix in co-op new games If there aren't enough player spawns present in co-op, the game will instead fail to spawn extra players, waiting for the ticker to automatically capture the fact they have PST_ENTER. This presents a problem in WorldLoaded() where it becomes unreliable whether or not a player has truly spawned. This also means those extra players had slightly different spawn behavior compared to regular pawns. --- src/g_level.cpp | 2 +- src/p_setup.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 4fcef5f75..0f6484419 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1478,7 +1478,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au for (int i = 0; imo != nullptr) - P_PlayerStartStomp(Players[i]->mo); + P_PlayerStartStomp(Players[i]->mo, !deathmatch); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 02f89c860..23bf28e98 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -504,6 +504,18 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) } } } + else if (newGame) + { + for (i = 0; i < MAXPLAYERS; ++i) + { + // Didn't have a player spawn available so spawn it now. + if (Level->PlayerInGame(i) && Level->Players[i]->playerstate == PST_ENTER && Level->Players[i]->mo == nullptr) + { + FPlayerStart* mthing = Level->PickPlayerStart(i); + Level->SpawnPlayer(mthing, i, (Level->flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + } + } + } // [SP] move unfriendly players around // horribly hacky - yes, this needs rewritten. From 0049a00fe5fac37894fa59785aa5ed38679bbb13 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 27 Apr 2024 10:45:50 +0200 Subject: [PATCH 038/414] added emulation of Final Doom's teleporter z glitch and activate it for Saturnia MAP10 --- src/d_main.cpp | 2 ++ src/doomdef.h | 1 + src/maploader/compatibility.cpp | 1 + src/playsim/p_lnspec.cpp | 2 +- src/playsim/p_spec.h | 1 + src/playsim/p_teleport.cpp | 23 ++++++++++++++++++++--- wadsrc/static/compatibility.txt | 5 +++++ wadsrc/static/menudef.txt | 2 ++ 8 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index c5e83cf58..ef7ff549f 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -712,6 +712,8 @@ CVAR (Flag, compat_railing, compatflags2, COMPATF2_RAILING); CVAR (Flag, compat_avoidhazard, compatflags2, COMPATF2_AVOID_HAZARDS); CVAR (Flag, compat_stayonlift, compatflags2, COMPATF2_STAYONLIFT); CVAR (Flag, compat_nombf21, compatflags2, COMPATF2_NOMBF21); +CVAR (Flag, compat_voodoozombies, compatflags2, COMPATF2_VOODOO_ZOMBIES); +CVAR (Flag, compat_fdteleport, compatflags2, COMPATF2_FDTELEPORT); CVAR(Bool, vid_activeinbackground, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) diff --git a/src/doomdef.h b/src/doomdef.h index 98fa88d93..811b4fa5e 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -241,6 +241,7 @@ enum : unsigned int COMPATF2_STAYONLIFT = 1 << 13, // yet another MBF thing. COMPATF2_NOMBF21 = 1 << 14, // disable MBF21 features that may clash with certain maps COMPATF2_VOODOO_ZOMBIES = 1 << 15, // [RL0] allow playerinfo, playerpawn, and voodoo health to all be different, and skip killing the player's mobj if a voodoo doll dies to allow voodoo zombies + COMPATF2_FDTELEPORT = 1 << 16, // Emulate Final Doom's teleporter z glitch. }; diff --git a/src/maploader/compatibility.cpp b/src/maploader/compatibility.cpp index 802ec3465..7caddc90a 100644 --- a/src/maploader/compatibility.cpp +++ b/src/maploader/compatibility.cpp @@ -173,6 +173,7 @@ static FCompatOption Options[] = { "scriptwait", COMPATF2_SCRIPTWAIT, SLOT_COMPAT2 }, { "nombf21", COMPATF2_NOMBF21, SLOT_COMPAT2 }, { "voodoozombies", COMPATF2_VOODOO_ZOMBIES, SLOT_COMPAT2 }, + { "fdteleport", COMPATF2_FDTELEPORT, SLOT_COMPAT2 }, { NULL, 0, 0 } }; diff --git a/src/playsim/p_lnspec.cpp b/src/playsim/p_lnspec.cpp index 5fb7c026d..3eec35b2d 100644 --- a/src/playsim/p_lnspec.cpp +++ b/src/playsim/p_lnspec.cpp @@ -1120,7 +1120,7 @@ FUNC(LS_Teleport_NewMap) FUNC(LS_Teleport) // Teleport (tid, sectortag, bNoSourceFog) { - int flags = TELF_DESTFOG; + int flags = TELF_DESTFOG | TELF_FDCOMPAT; if (!arg2) { flags |= TELF_SOURCEFOG; diff --git a/src/playsim/p_spec.h b/src/playsim/p_spec.h index 5d602eb1d..cc7d990a9 100644 --- a/src/playsim/p_spec.h +++ b/src/playsim/p_spec.h @@ -141,6 +141,7 @@ enum TELF_KEEPHEIGHT = 16, TELF_ROTATEBOOM = 32, TELF_ROTATEBOOMINVERSE = 64, + TELF_FDCOMPAT = 128, }; //Spawns teleport fog. Pass the actor to pluck TeleFogFromType and TeleFogToType. 'from' determines if this is the fog to spawn at the old position (true) or new (false). diff --git a/src/playsim/p_teleport.cpp b/src/playsim/p_teleport.cpp index 1643b1b76..a69d3654c 100644 --- a/src/playsim/p_teleport.cpp +++ b/src/playsim/p_teleport.cpp @@ -128,7 +128,15 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) } else { - pos.Z = floorheight; + if (!(thing->Level->i_compatflags2 & COMPATF2_FDTELEPORT) || !(flags & TELF_FDCOMPAT) || floorheight > thing->Z()) + { + pos.Z = floorheight; + } + else + { + pos.Z = thing->Z(); + } + if (!(flags & TELF_KEEPORIENTATION)) { resetpitch = false; @@ -145,7 +153,16 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) } else { - pos.Z = floorheight; + // emulation of Final Doom's teleport glitch. + // For walking monsters we still have to force them to the ground because the handling of off-ground monsters is different from vanilla. + if (!(thing->Level->i_compatflags2 & COMPATF2_FDTELEPORT) || !(flags & TELF_FDCOMPAT) || !(thing->flags & MF_NOGRAVITY) || floorheight > pos.Z) + { + pos.Z = floorheight; + } + else + { + pos.Z = thing->Z(); + } } } // [MK] notify thing of incoming teleport, check for an early cancel @@ -245,7 +262,7 @@ DEFINE_ACTION_FUNCTION(AActor, Teleport) PARAM_FLOAT(z); PARAM_ANGLE(an); PARAM_INT(flags); - ACTION_RETURN_BOOL(P_Teleport(self, DVector3(x, y, z), an, flags)); + ACTION_RETURN_BOOL(P_Teleport(self, DVector3(x, y, z), an, flags & ~TELF_FDCOMPAT)); } //----------------------------------------------------------------------------- diff --git a/wadsrc/static/compatibility.txt b/wadsrc/static/compatibility.txt index 2440ef55f..f8c3fe453 100644 --- a/wadsrc/static/compatibility.txt +++ b/wadsrc/static/compatibility.txt @@ -332,3 +332,8 @@ F1EB6927F53047F219A54997DAD9DC81 // mm2.wad map20 rebuildnodes trace } + +BA2247ED1465C8107192AC4215B2A5F3 // saturnia.wad map10 +{ + fdteleport +} diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 7c8359cd5..3c3fb1af0 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1758,6 +1758,7 @@ OptionMenu "CompatActorMenu" protected Option "$CMPTMNU_INVISIBILITY", "compat_INVISIBILITY", "YesNo" Option "$CMPTMNU_MINOTAUR", "compat_MINOTAUR", "YesNo" Option "$CMPTMNU_NOTOSSDROPS", "compat_NOTOSSDROPS", "YesNo" + Option "$CMPTMNU_VOODOOZOMBIES", "compat_voodoozombies", "YesNo" Class "CompatibilityMenu" } @@ -1784,6 +1785,7 @@ OptionMenu "CompatMapMenu" protected Option "$CMPTMNU_POINTONLINE", "compat_pointonline", "YesNo" Option "$CMPTMNU_MULTIEXIT", "compat_multiexit", "YesNo" Option "$CMPTMNU_TELEPORT", "compat_teleport", "YesNo" + Option "$CMPTMNU_FDTELEPORT", "compat_fdteleport", "YesNo" Option "$CMPTMNU_PUSHWINDOW", "compat_pushwindow", "YesNo" Option "$CMPTMNU_CHECKSWITCHRANGE", "compat_checkswitchrange", "YesNo" Option "$CMPTMNU_RAILINGHACK", "compat_railing", "YesNo" From a768d6c177f1e6f2be4b1047b789511c9924c7f0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 27 Apr 2024 12:36:10 +0200 Subject: [PATCH 039/414] text update --- wadsrc/static/language.csv | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index 080a605b2..b588c7c66 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -3384,8 +3384,11 @@ Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,Til Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,Prohodit zdraví a brnění,Byt om på helbred og rustning,Anzeige für Gesundheit und Panzerung tauschen,,Permuti sanon kaj kirason,,,,Échanger la santé et l'armure,,Scambio di salute e armatura,体力とアーマーをスワップ,,Verwissel gezondheid en pantser,Bytt helse og rustning,Zamień zdrowie i pancerz,Trocar saúde e armadura,,,Поменять отображение здоровья и брони местами,,Byt hälsa och rustning,Sağlık ve zırhı değiştir, Use classic HUD scaling,SCALEMNU_HUD_OLDSCALE,hud_oldscale,,,Pro HUD použít klasické škálování,Brug klassisk HUD-skalering,Klassische HUD-Skalierung,,Uzi klasikan skaladon de HUD,,,,Utiliser l'échelle classique du HUD,,Utilizzare la scalatura classica dell'HUD,旧式HUDスケーリングを使う,,Gebruik klassieke HUD-schaling,Bruk klassisk HUD-skalering,,Usar escala clássica do HUD,,,Классическое масштабирование интерфейса,,Använd klassisk HUD-skalning,Klasik HUD ölçeklendirmesini kullanın, HUD scale factor,SCALEMNU_HUD_SCALEFACTOR,hud_scalefactor,,,Faktor HUD škálování,HUD-skaleringsfaktor,HUD-Skalierungsfaktor,,Skalfaktoro de HUD,,,,Facteur d'échelle du HUD,,Fattore di scala dell'HUD,HUDスケール倍率,,HUD-schaalfactor,HUD-skaleringsfaktor,,Fator de escala do HUD,,,Значение масштабирования интерфейса,,Skalningsfaktor för HUD,HUD ölçek faktörü, -Spawn co-op only things in multiplayer,GMPLYMNU_COOPTHINGS,Any Actor that only appears in co-op is disabled,,,Co-op věci pouze v multiplayeru,,,,Ekaperigi nurajn kooperajn aĵojn en plurludanta reĝimo,,,,,,,マルチで協力モード限定thingsを出す,,,,,,,,Появление вещей из совместной игры в сетевой игре,,,, -Spawn co-op only items in multiplayer,GMPLYMNU_COOPITEMS,Items that only appear in co-op are disabled,,,Co-op předměty pouze v multiplayeru,,,,Ekaperigi nurajn kooperajn objektojn en plurludanta reĝimo,,,,,,,マルチで協力モード限定アイテムを出す,,,,,,,,Появление предметов из совместной игры в сетевой игре,,,, -Players pick up their own copy of items in multiplayer,GMPLYMNU_LOCALITEMS,Items are picked up client-side rather than fully taken by the client who picked it up,,,V multiplayeru hráči sbírají své vlastní kopie předmětů,,,,Ludantoj prenas sian propran kopion de objektoj en plurludanta reĝimo,,,,,,,マルチでプレイヤー達は複製アイテムを拾う,,,,,,,,Игроки подбирают собственные копии предметов в сетевой игре,,,, -Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,,,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,,,,クライアント側で落としたアイテムを拾わせない,,,,,,,,Отключить подбирание выпавших предметов на стороне клиента,,,, -Restart on Death,MISCMNU_RESTARTONDEATH,Disables autoloading save on death,,,,,,,,,,,,,,,,,,,,,,Перезапуск после смерти,,,, \ No newline at end of file +Spawn co-op only things in multiplayer,GMPLYMNU_COOPTHINGS,Any Actor that only appears in co-op is disabled,,,Co-op věci pouze v multiplayeru,Skab kun co-op-objekter i multiplayer,Erzeuge Nur-Co-op Dinge in Multiplayer,,Ekaperigi nurajn kooperajn aĵojn en plurludanta reĝimo,,,,Faire apparaitre les acteurs Co-Op Seulement en Multijoueur,,Creare oggetti solo per la cooperativa in multigiocatore,マルチで協力モード限定thingsを出す,,Alleen co-op-voorwerpen maken in multiplayer,Opprett co-op-objekter i flerspillermodus,,,,,Появление вещей из совместной игры в сетевой игре,,Skapa co-op-objekt i flerspelarläget,Çok oyunculu modda ortak nesneler oluşturun, +Spawn co-op only pickup items in multiplayer,GMPLYMNU_COOPITEMS,Items that only appear in co-op are disabled,,,Co-op předměty pouze v multiplayeru,Skab kun co-op-genstande i multiplayer,Erzeuge Nur-Co-op Gegenstände in Multiplayer,,Ekaperigi nurajn kooperajn objektojn en plurludanta reĝimo,,,,Faire apparaitre les objets Co-Op Seulement en Multijoueur,,Creare pickup solo per la cooperativa in multigiocatore,マルチで協力モード限定アイテムを出す,,Alleen co-op pickups maken in multiplayer,Opprett co-op-pickuper i flerspillermodus,,,,,Появление предметов из совместной игры в сетевой игре,,Skapa co-op pickups i flerspelarläget,Çok oyunculu modda ortak pikaplar oluşturun, +Players pick up their own copy of items in multiplayer,GMPLYMNU_LOCALITEMS,Items are picked up client-side rather than fully taken by the client who picked it up,,,V multiplayeru hráči sbírají své vlastní kopie předmětů,Spillere samler deres egen kopi af genstande op i multiplayer,Spieler nehmen ihre eigene Kopie von Gegenständen im Mehrspielermodus auf,,Ludantoj prenas sian propran kopion de objektoj en plurludanta reĝimo,,,,Chaque joueur obtient sa copie de chaque objet en Multijoueur,,I giocatori raccolgono la propria copia di oggetti in multigiocatore,マルチでプレイヤー達は複製アイテムを拾う,,Spelers pikken hun eigen exemplaar van voorwerpen op in multiplayer,Spillere plukker opp sin egen kopi av gjenstander i flerspiller,,,,,Игроки подбирают собственные копии предметов в сетевой игре,,Spelare plockar upp sin egen kopia av föremål i flerspelarläget,Oyuncular çok oyunculu modda eşyaların kendi kopyalarını alırlar, +Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,Deaktiver opsamling på klientsiden af tabte genstande,Client-seitiges Aufnehmen von fallengelassenen Gegenständen deaktivieren,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,Désactiver le ramassage des objets lâchés en clientside,,Disabilita il ritiro degli oggetti caduti dal lato client,クライアント側で落としたアイテムを拾わせない,,Client-side pick ups van gedropte items uitschakelen,Deaktiver opphenting på klientsiden av gjenstander som droppes,,,,,Отключить подбирание выпавших предметов на стороне клиента,,Inaktivera upphämtning av tappade föremål på klientsidan,Düşen öğeleri istemci tarafında almayı devre dışı bırakma, +Restart level on Death,MISCMNU_RESTARTONDEATH,Disables autoloading save on death,,,Restart po umření,Genstart niveau ved død,Level bei Tod neu starten,,,,,,Recharger après mort,,Riavvio del livello in caso di morte,,,Level herstarten bij dood,Start nivået på nytt ved død,,,,,Перезапуск уровня после смерти,,Starta om nivån vid död,Ölüm halinde seviyeyi yeniden başlat, +Pistol Start,GMPLYMNU_PISTOLSTART,Resets inventory on every map,,,Začít jen s pistolí,Start med pistol,Pistolenstart,,,,,,Démarrage du pistolet,,Avvio pistola,,,Start met pistool,Start med pistol,,,,,Пистолет в начале,,Starta med pistol,Tabanca ile başlayın, +Allow creation of zombie players,CMPTMNU_VOODOOZOMBIES,,,,,,Erlaube Zombieplayer,,,,,,,,,,,,,,,,,,,,, +ignore floor z when teleporting,CMPTMNU_FDTELEPORT,,,,,,Ignoriere Fußbodenhöhe bem Teleportieren,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file From 387e59cba7fa02d5891b4c7e22b2c55d7d20db1e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 27 Apr 2024 12:36:10 +0200 Subject: [PATCH 040/414] text update --- wadsrc/static/language.csv | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index 080a605b2..b588c7c66 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -3384,8 +3384,11 @@ Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,Til Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,Prohodit zdraví a brnění,Byt om på helbred og rustning,Anzeige für Gesundheit und Panzerung tauschen,,Permuti sanon kaj kirason,,,,Échanger la santé et l'armure,,Scambio di salute e armatura,体力とアーマーをスワップ,,Verwissel gezondheid en pantser,Bytt helse og rustning,Zamień zdrowie i pancerz,Trocar saúde e armadura,,,Поменять отображение здоровья и брони местами,,Byt hälsa och rustning,Sağlık ve zırhı değiştir, Use classic HUD scaling,SCALEMNU_HUD_OLDSCALE,hud_oldscale,,,Pro HUD použít klasické škálování,Brug klassisk HUD-skalering,Klassische HUD-Skalierung,,Uzi klasikan skaladon de HUD,,,,Utiliser l'échelle classique du HUD,,Utilizzare la scalatura classica dell'HUD,旧式HUDスケーリングを使う,,Gebruik klassieke HUD-schaling,Bruk klassisk HUD-skalering,,Usar escala clássica do HUD,,,Классическое масштабирование интерфейса,,Använd klassisk HUD-skalning,Klasik HUD ölçeklendirmesini kullanın, HUD scale factor,SCALEMNU_HUD_SCALEFACTOR,hud_scalefactor,,,Faktor HUD škálování,HUD-skaleringsfaktor,HUD-Skalierungsfaktor,,Skalfaktoro de HUD,,,,Facteur d'échelle du HUD,,Fattore di scala dell'HUD,HUDスケール倍率,,HUD-schaalfactor,HUD-skaleringsfaktor,,Fator de escala do HUD,,,Значение масштабирования интерфейса,,Skalningsfaktor för HUD,HUD ölçek faktörü, -Spawn co-op only things in multiplayer,GMPLYMNU_COOPTHINGS,Any Actor that only appears in co-op is disabled,,,Co-op věci pouze v multiplayeru,,,,Ekaperigi nurajn kooperajn aĵojn en plurludanta reĝimo,,,,,,,マルチで協力モード限定thingsを出す,,,,,,,,Появление вещей из совместной игры в сетевой игре,,,, -Spawn co-op only items in multiplayer,GMPLYMNU_COOPITEMS,Items that only appear in co-op are disabled,,,Co-op předměty pouze v multiplayeru,,,,Ekaperigi nurajn kooperajn objektojn en plurludanta reĝimo,,,,,,,マルチで協力モード限定アイテムを出す,,,,,,,,Появление предметов из совместной игры в сетевой игре,,,, -Players pick up their own copy of items in multiplayer,GMPLYMNU_LOCALITEMS,Items are picked up client-side rather than fully taken by the client who picked it up,,,V multiplayeru hráči sbírají své vlastní kopie předmětů,,,,Ludantoj prenas sian propran kopion de objektoj en plurludanta reĝimo,,,,,,,マルチでプレイヤー達は複製アイテムを拾う,,,,,,,,Игроки подбирают собственные копии предметов в сетевой игре,,,, -Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,,,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,,,,クライアント側で落としたアイテムを拾わせない,,,,,,,,Отключить подбирание выпавших предметов на стороне клиента,,,, -Restart on Death,MISCMNU_RESTARTONDEATH,Disables autoloading save on death,,,,,,,,,,,,,,,,,,,,,,Перезапуск после смерти,,,, \ No newline at end of file +Spawn co-op only things in multiplayer,GMPLYMNU_COOPTHINGS,Any Actor that only appears in co-op is disabled,,,Co-op věci pouze v multiplayeru,Skab kun co-op-objekter i multiplayer,Erzeuge Nur-Co-op Dinge in Multiplayer,,Ekaperigi nurajn kooperajn aĵojn en plurludanta reĝimo,,,,Faire apparaitre les acteurs Co-Op Seulement en Multijoueur,,Creare oggetti solo per la cooperativa in multigiocatore,マルチで協力モード限定thingsを出す,,Alleen co-op-voorwerpen maken in multiplayer,Opprett co-op-objekter i flerspillermodus,,,,,Появление вещей из совместной игры в сетевой игре,,Skapa co-op-objekt i flerspelarläget,Çok oyunculu modda ortak nesneler oluşturun, +Spawn co-op only pickup items in multiplayer,GMPLYMNU_COOPITEMS,Items that only appear in co-op are disabled,,,Co-op předměty pouze v multiplayeru,Skab kun co-op-genstande i multiplayer,Erzeuge Nur-Co-op Gegenstände in Multiplayer,,Ekaperigi nurajn kooperajn objektojn en plurludanta reĝimo,,,,Faire apparaitre les objets Co-Op Seulement en Multijoueur,,Creare pickup solo per la cooperativa in multigiocatore,マルチで協力モード限定アイテムを出す,,Alleen co-op pickups maken in multiplayer,Opprett co-op-pickuper i flerspillermodus,,,,,Появление предметов из совместной игры в сетевой игре,,Skapa co-op pickups i flerspelarläget,Çok oyunculu modda ortak pikaplar oluşturun, +Players pick up their own copy of items in multiplayer,GMPLYMNU_LOCALITEMS,Items are picked up client-side rather than fully taken by the client who picked it up,,,V multiplayeru hráči sbírají své vlastní kopie předmětů,Spillere samler deres egen kopi af genstande op i multiplayer,Spieler nehmen ihre eigene Kopie von Gegenständen im Mehrspielermodus auf,,Ludantoj prenas sian propran kopion de objektoj en plurludanta reĝimo,,,,Chaque joueur obtient sa copie de chaque objet en Multijoueur,,I giocatori raccolgono la propria copia di oggetti in multigiocatore,マルチでプレイヤー達は複製アイテムを拾う,,Spelers pikken hun eigen exemplaar van voorwerpen op in multiplayer,Spillere plukker opp sin egen kopi av gjenstander i flerspiller,,,,,Игроки подбирают собственные копии предметов в сетевой игре,,Spelare plockar upp sin egen kopia av föremål i flerspelarläget,Oyuncular çok oyunculu modda eşyaların kendi kopyalarını alırlar, +Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,Deaktiver opsamling på klientsiden af tabte genstande,Client-seitiges Aufnehmen von fallengelassenen Gegenständen deaktivieren,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,Désactiver le ramassage des objets lâchés en clientside,,Disabilita il ritiro degli oggetti caduti dal lato client,クライアント側で落としたアイテムを拾わせない,,Client-side pick ups van gedropte items uitschakelen,Deaktiver opphenting på klientsiden av gjenstander som droppes,,,,,Отключить подбирание выпавших предметов на стороне клиента,,Inaktivera upphämtning av tappade föremål på klientsidan,Düşen öğeleri istemci tarafında almayı devre dışı bırakma, +Restart level on Death,MISCMNU_RESTARTONDEATH,Disables autoloading save on death,,,Restart po umření,Genstart niveau ved død,Level bei Tod neu starten,,,,,,Recharger après mort,,Riavvio del livello in caso di morte,,,Level herstarten bij dood,Start nivået på nytt ved død,,,,,Перезапуск уровня после смерти,,Starta om nivån vid död,Ölüm halinde seviyeyi yeniden başlat, +Pistol Start,GMPLYMNU_PISTOLSTART,Resets inventory on every map,,,Začít jen s pistolí,Start med pistol,Pistolenstart,,,,,,Démarrage du pistolet,,Avvio pistola,,,Start met pistool,Start med pistol,,,,,Пистолет в начале,,Starta med pistol,Tabanca ile başlayın, +Allow creation of zombie players,CMPTMNU_VOODOOZOMBIES,,,,,,Erlaube Zombieplayer,,,,,,,,,,,,,,,,,,,,, +ignore floor z when teleporting,CMPTMNU_FDTELEPORT,,,,,,Ignoriere Fußbodenhöhe bem Teleportieren,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file From 620d689038bab84ffa5bead36c518ba6026c934c Mon Sep 17 00:00:00 2001 From: DyNaM1Kk <42520902+DyNaM1Kk@users.noreply.github.com> Date: Sat, 27 Apr 2024 17:38:45 +0400 Subject: [PATCH 041/414] Fixed "PrivateNetOf" function not checking for the entire B class private network range --- src/common/engine/i_net.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/engine/i_net.cpp b/src/common/engine/i_net.cpp index 65dc60cb1..33b4c1267 100644 --- a/src/common/engine/i_net.cpp +++ b/src/common/engine/i_net.cpp @@ -903,11 +903,11 @@ bool JoinGame (int i) static int PrivateNetOf(in_addr in) { int addr = ntohl(in.s_addr); - if ((addr & 0xFFFF0000) == 0xC0A80000) // 192.168.0.0 + if ((addr & 0xFFFF0000) == 0xC0A80000) // 192.168.0.0 { return 0xC0A80000; } - else if ((addr & 0xFFF00000) == 0xAC100000) // 172.16.0.0 + else if ((addr & 0xFFFF0000) >= 0xAC100000 && (addr & 0xFFFF0000) <= 0xAC1F0000) // 172.16.0.0 - 172.31.0.0 { return 0xAC100000; } From 98a0b5f8d23d2d96baad4de14a0859895bd9b896 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 22 Apr 2024 07:14:04 +0200 Subject: [PATCH 042/414] fix lifetime of skyinfo variable in HWWall::SkyPlane. --- src/rendering/hwrenderer/scene/hw_sky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_sky.cpp b/src/rendering/hwrenderer/scene/hw_sky.cpp index dfa954530..45ff8c5e7 100644 --- a/src/rendering/hwrenderer/scene/hw_sky.cpp +++ b/src/rendering/hwrenderer/scene/hw_sky.cpp @@ -137,9 +137,9 @@ void HWWall::SkyPlane(HWWallDispatcher *di, sector_t *sector, int plane, bool al // Either a regular sky or a skybox with skyboxes disabled if ((sportal == nullptr && sector->GetTexture(plane) == skyflatnum) || (gl_noskyboxes && sportal != nullptr && sportal->mType == PORTS_SKYVIEWPOINT)) { + HWSkyInfo skyinfo; if (di->di) { - HWSkyInfo skyinfo; skyinfo.init(di->di, sector, plane, sector->skytransfer, Colormap.FadeColor); ptype = PORTALTYPE_SKY; sky = &skyinfo; From 54ee0391d794d377d60e439160966c0937dcf3bb Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 22 Apr 2024 22:09:32 +0800 Subject: [PATCH 043/414] ZDRay specs fix --- specs/udmf_zdoom.txt | 2 +- src/namedef_custom.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index e3c73df4d..402f3d6e8 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -424,7 +424,7 @@ Note: All fields default to false unless mentioned otherwise. lm_sampledist = ; // ZDRay lightmap sample distance for the entire map. Defines the map units each lightmap texel covers. Must be in powers of two. Default = 8 lm_suncolor = ; // ZDRay lightmap sun color in hex. Default = "FFFFFF" - sourceradius = ; // ZDRay lightmap light soft shadow amount. Higher values produce softer shadows. Default = 5.0 + SourceRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 7d6d095f2..e04dc3795 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -863,7 +863,9 @@ xx(lm_sampledist_ceiling) xx(lm_dynamic) xx(lm_suncolor) xx(lm_sampledist) -xx(sourceradius) + +// Light keywords +xx(SourceRadius) xx(skew_bottom_type) xx(skew_middle_type) From 5971d521d9f35ae34dadbd5705e9dcc5845bd670 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 22 Apr 2024 16:53:12 -0400 Subject: [PATCH 044/414] - `-norun` now implies `-stdout` on Windows as it's useless without it --- src/common/platform/win32/i_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index 6977055b7..acadc2dc8 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -158,7 +158,7 @@ int DoMain (HINSTANCE hInstance) Args->AppendArg(FString(wargv[i])); } - if (Args->CheckParm("-stdout")) + if (Args->CheckParm("-stdout") || Args->CheckParm("-norun")) { // As a GUI application, we don't normally get a console when we start. // If we were run from the shell and are on XP+, we can attach to its From 25f791156f50212aa6a20a76c000de23e07bbc74 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 23 Apr 2024 20:30:44 -0400 Subject: [PATCH 045/414] - fixed: rollsprites now 'unstretch' properly in regular y-billboarding --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 8ada22c8b..341bb2001 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -355,6 +355,12 @@ void HandleSpriteOffsets(Matrix3x4 *mat, const FRotator *HW, FVector2 *offset, b bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) { + float pixelstretch = 1.2; + if (actor && actor->Level) + pixelstretch = actor->Level->pixelstretch; + else if (particle && particle->subsector && particle->subsector->sector && particle->subsector->sector->Level) + pixelstretch = particle->subsector->sector->Level->pixelstretch; + FVector3 center = FVector3((x1 + x2) * 0.5, (y1 + y2) * 0.5, (z1 + z2) * 0.5); const auto& HWAngles = di->Viewpoint.HWAngles; Matrix3x4 mat; @@ -421,12 +427,6 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) // [Nash] check for special sprite drawing modes if (drawWithXYBillboard || isWallSprite) { - float pixelstretch = 1.2; - if (actor && actor->Level) - pixelstretch = actor->Level->pixelstretch; - else if (particle && particle->subsector && particle->subsector->sector && particle->subsector->sector->Level) - pixelstretch = particle->subsector->sector->Level->pixelstretch; - mat.MakeIdentity(); mat.Translate(center.X, center.Z, center.Y); // move to sprite center mat.Scale(1.0, 1.0/pixelstretch, 1.0); // unstretch sprite by level aspect ratio @@ -509,9 +509,11 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) float rollDegrees = Angles.Roll.Degrees(); mat.Translate(center.X, center.Z, center.Y); + mat.Scale(1.0, 1.0/pixelstretch, 1.0); // unstretch sprite by level aspect ratio if (useOffsets) mat.Translate(xx, zz, yy); mat.Rotate(cos(angleRad), 0, sin(angleRad), rollDegrees); if (useOffsets) mat.Translate(-xx, -zz, -yy); + mat.Scale(1.0, pixelstretch, 1.0); // stretch sprite by level aspect ratio mat.Translate(-center.X, -center.Z, -center.Y); } From 9d460d3f46acb3b05834f6d5bf764a8b7f037b47 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 24 Apr 2024 06:52:01 -0400 Subject: [PATCH 046/414] - demote SDL_Wait errors to console printouts --- libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 2cb52e2b5..808244a22 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -289,7 +289,11 @@ void SDL2DisplayWindow::RunLoop() SDL_Event event; int result = SDL_WaitEvent(&event); if (result == 0) - throw std::runtime_error(std::string("SDL_WaitEvent failed:") + SDL_GetError()); + { + fprintf(stderr, "SDL_WaitEvent failed: "); + fprintf(stderr, SDL_GetError()); + fprintf(stderr, "\n"); + } DispatchEvent(event); } } From d00fc3b9b8f7224ff0bc6fcfdb8d6b0a623734bc Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 24 Apr 2024 07:17:09 -0400 Subject: [PATCH 047/414] - shorten sdl_waitevent error message --- libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 808244a22..9ccf859e0 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -289,11 +289,7 @@ void SDL2DisplayWindow::RunLoop() SDL_Event event; int result = SDL_WaitEvent(&event); if (result == 0) - { - fprintf(stderr, "SDL_WaitEvent failed: "); - fprintf(stderr, SDL_GetError()); - fprintf(stderr, "\n"); - } + fprintf(stderr, "SDL_WaitEvent failed: %s\n", SDL_GetError()); DispatchEvent(event); } } From 92e509e771e016e257f789dc42abf569629b9d6d Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 28 Apr 2024 02:41:00 -0400 Subject: [PATCH 048/414] - this is 4.12.2 --- src/version.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/version.h b/src/version.h index 2c772fbaf..b0e6b4e14 100644 --- a/src/version.h +++ b/src/version.h @@ -41,21 +41,21 @@ const char *GetVersionString(); /** Lots of different version numbers **/ -#define VERSIONSTR "4.12.0" +#define VERSIONSTR "4.12.2" // The version as seen in the Windows resource -#define RC_FILEVERSION 4,12,0,0 -#define RC_PRODUCTVERSION 4,12,0,0 +#define RC_FILEVERSION 4,12,2,0 +#define RC_PRODUCTVERSION 4,12,2,0 #define RC_PRODUCTVERSION2 VERSIONSTR // These are for content versioning. #define VER_MAJOR 4 #define VER_MINOR 12 -#define VER_REVISION 0 +#define VER_REVISION 2 // This should always refer to the GZDoom version a derived port is based on and not reflect the derived port's version number! #define ENG_MAJOR 4 #define ENG_MINOR 12 -#define ENG_REVISION 0 +#define ENG_REVISION 2 // Version identifier for network games. // Bump it every time you do a release unless you're certain you From 22fd9b66ad9aed6aa9d036720bb482cbbbf9064f Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 28 Apr 2024 03:35:09 -0400 Subject: [PATCH 049/414] - mirror changes with ZWidget, remove SDL_Wait failure message --- libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 9ccf859e0..17db8a863 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -288,9 +288,8 @@ void SDL2DisplayWindow::RunLoop() { SDL_Event event; int result = SDL_WaitEvent(&event); - if (result == 0) - fprintf(stderr, "SDL_WaitEvent failed: %s\n", SDL_GetError()); - DispatchEvent(event); + if (result == 1) + DispatchEvent(event); } } From 4625d4ac34d34e3f08f16533da24a3f1e7cb5501 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 28 Apr 2024 03:35:09 -0400 Subject: [PATCH 050/414] - mirror changes with ZWidget, remove SDL_Wait failure message --- libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 9ccf859e0..17db8a863 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -288,9 +288,8 @@ void SDL2DisplayWindow::RunLoop() { SDL_Event event; int result = SDL_WaitEvent(&event); - if (result == 0) - fprintf(stderr, "SDL_WaitEvent failed: %s\n", SDL_GetError()); - DispatchEvent(event); + if (result == 1) + DispatchEvent(event); } } From 71c40432e5e893c629a1c9c76a523a0ab22bd56a Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 26 Apr 2024 15:12:47 -0400 Subject: [PATCH 051/414] Reworked clientside lerping Now acts as a rubberbanding effect. The result is that movement is now considered correct and adjusted towards the real position if not rather than cautiously moving towards the predicted position. --- src/playsim/p_user.cpp | 138 +++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index e5f02b2fe..dc48c783d 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -103,16 +103,26 @@ CVAR(Bool, sv_singleplayerrespawn, false, CVAR_SERVERINFO | CVAR_CHEAT) // Variables for prediction CVAR (Bool, cl_noprediction, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, cl_predict_specials, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +// Deprecated +CVAR(Float, cl_predict_lerpscale, 0.05f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Float, cl_predict_lerpthreshold, 2.00f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -CUSTOM_CVAR(Float, cl_predict_lerpscale, 0.05f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CUSTOM_CVAR(Float, cl_rubberband_scale, 0.3f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { - P_PredictionLerpReset(); + if (self < 0.0f) + self = 0.0f; + else if (self > 1.0f) + self = 1.0f; } -CUSTOM_CVAR(Float, cl_predict_lerpthreshold, 2.00f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CUSTOM_CVAR(Float, cl_rubberband_threshold, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +{ + if (self < 0.1f) + self = 0.1f; +} +CUSTOM_CVAR(Float, cl_rubberband_minmove, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { if (self < 0.1f) self = 0.1f; - P_PredictionLerpReset(); } ColorSetList ColorSets; @@ -125,13 +135,9 @@ CUSTOM_CVAR(Float, fov, 90.f, CVAR_ARCHIVE | CVAR_USERINFO | CVAR_NOINITCALL) p->SetFOV(fov); } -struct PredictPos -{ - int gametic; - DVector3 pos; - DRotator angles; -} static PredictionLerpFrom, PredictionLerpResult, PredictionLast; -static int PredictionLerptics; +static DVector3 LastPredictedPosition; +static int LastPredictedPortalGroup; +static int LastPredictedTic; static player_t PredictionPlayerBackup; static AActor *PredictionActor; @@ -1290,23 +1296,25 @@ void P_PlayerThink (player_t *player) void P_PredictionLerpReset() { - PredictionLerptics = PredictionLast.gametic = PredictionLerpFrom.gametic = PredictionLerpResult.gametic = 0; + LastPredictedPosition = DVector3{}; + LastPredictedPortalGroup = 0; + LastPredictedTic = -1; } -bool P_LerpCalculate(AActor *pmo, PredictPos from, PredictPos to, PredictPos &result, float scale) +void P_LerpCalculate(AActor* pmo, const DVector3& from, DVector3 &result, float scale, float threshold, float minMove) { - DVector3 vecFrom = from.pos; - DVector3 vecTo = to.pos; - DVector3 vecResult; - vecResult = vecTo - vecFrom; - vecResult *= scale; - vecResult = vecResult + vecFrom; - DVector3 delta = vecResult - vecTo; + DVector3 diff = pmo->Pos() - from; + diff.XY() += pmo->Level->Displacements.getOffset(pmo->Sector->PortalGroup, pmo->Level->PointInSector(from.XY())->PortalGroup); + double dist = diff.Length(); + if (dist <= max(threshold, minMove)) + { + result = pmo->Pos(); + return; + } - result.pos = pmo->Vec3Offset(vecResult - to.pos); - - // As a fail safe, assume extrapolation is the threshold. - return (delta.LengthSquared() > cl_predict_lerpthreshold && scale <= 1.00f); + diff /= dist; + diff *= min(dist * (1.0f - scale), dist - minMove); + result = pmo->Vec3Offset(-diff.X, -diff.Y, -diff.Z); } template @@ -1472,10 +1480,12 @@ void P_PredictPlayer (player_t *player) } act->BlockNode = NULL; - // Values too small to be usable for lerping can be considered "off". - bool CanLerp = (!(cl_predict_lerpscale < 0.01f) && (ticdup == 1)), DoLerp = false; // This essentially acts like a mini P_Ticker where only the stuff relevant to the client is actually // called. Call order is preserved. + bool rubberband = false; + DVector3 rubberbandPos = {}; + const bool canRubberband = LastPredictedTic >= 0 && cl_rubberband_scale > 0.0f && cl_rubberband_scale < 1.0f; + const double rubberbandThreshold = max(cl_rubberband_minmove, cl_rubberband_threshold); for (int i = gametic; i < maxtic; ++i) { // Make sure any portal paths have been cleared from the previous movement. @@ -1484,58 +1494,52 @@ void P_PredictPlayer (player_t *player) // Because we're always predicting, this will get set by teleporters and then can never unset itself in the renderer properly. player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; + // Got snagged on something. Start correcting towards the player's final predicted position. We're + // being intentionally generous here by not really caring how the player got to that position, only + // that they ended up in the same spot on the same tick. + if (canRubberband && LastPredictedTic == i) + { + DVector3 diff = player->mo->Pos() - LastPredictedPosition; + diff += player->mo->Level->Displacements.getOffset(player->mo->Sector->PortalGroup, LastPredictedPortalGroup); + double dist = diff.LengthSquared(); + if (dist >= EQUAL_EPSILON * EQUAL_EPSILON && dist > rubberbandThreshold * rubberbandThreshold) + { + rubberband = true; + rubberbandPos = player->mo->Pos(); + } + } + player->cmd = localcmds[i % LOCALCMDTICS]; player->mo->ClearInterpolation(); player->mo->ClearFOVInterpolation(); P_PlayerThink (player); player->mo->Tick (); - - if (CanLerp && PredictionLast.gametic > 0 && i == PredictionLast.gametic) - { - // Z is not compared as lifts will alter this with no apparent change - // Make lerping less picky by only testing whole units - DoLerp = (int)PredictionLast.pos.X != (int)player->mo->X() || (int)PredictionLast.pos.Y != (int)player->mo->Y(); - - // Aditional Debug information - if (developer >= DMSG_NOTIFY && DoLerp) - { - DPrintf(DMSG_NOTIFY, "Lerp! Ltic (%d) && Ptic (%d) | Lx (%f) && Px (%f) | Ly (%f) && Py (%f)\n", - PredictionLast.gametic, i, - (PredictionLast.pos.X), (player->mo->X()), - (PredictionLast.pos.Y), (player->mo->Y())); - } - } } - // TODO: This should be changed to a proper rubberbanding solution in the near future (only rubberband if there was - // a mismatch between client's last predicted pos and current predicted pos). - if (CanLerp) + if (rubberband) { - if (DoLerp) - { - // If lerping is already in effect, use the previous camera postion so the view doesn't suddenly snap - PredictionLerpFrom = (PredictionLerptics == 0) ? PredictionLast : PredictionLerpResult; - PredictionLerptics = 1; - } + R_ClearInterpolationPath(); + player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; - PredictionLast.gametic = maxtic - 1; - PredictionLast.pos = player->mo->Pos(); - //PredictionLast.portalgroup = player->mo->Sector->PortalGroup; + DPrintf(DMSG_NOTIFY, "Prediction mismatch at (%.3f, %.3f, %.3f)\nExpected: (%.3f, %.3f, %.3f)\nCorrecting to (%.3f, %.3f, %.3f)\n", + LastPredictedPosition.X, LastPredictedPosition.Y, LastPredictedPosition.Z, + rubberbandPos.X, rubberbandPos.Y, rubberbandPos.Z, + player->mo->X(), player->mo->Y(), player->mo->Z()); - if (PredictionLerptics > 0) - { - if (PredictionLerpFrom.gametic > 0 && - P_LerpCalculate(player->mo, PredictionLerpFrom, PredictionLast, PredictionLerpResult, (float)PredictionLerptics * cl_predict_lerpscale)) - { - PredictionLerptics++; - player->mo->SetXYZ(PredictionLerpResult.pos); - } - else - { - PredictionLerptics = 0; - } - } + DVector3 snapPos = {}; + P_LerpCalculate(player->mo, LastPredictedPosition, snapPos, cl_rubberband_scale, cl_rubberband_threshold, cl_rubberband_minmove); + player->mo->PrevPortalGroup = LastPredictedPortalGroup; + player->mo->Prev = LastPredictedPosition; + const double zOfs = player->viewz - player->mo->Z(); + player->mo->SetXYZ(snapPos); + player->viewz = snapPos.Z + zOfs; } + + // This is intentionally done after rubberbanding starts since it'll automatically smooth itself towards + // the right spot until it reaches it. + LastPredictedTic = maxtic; + LastPredictedPosition = player->mo->Pos(); + LastPredictedPortalGroup = player->mo->Level->PointInSector(LastPredictedPosition)->PortalGroup; } void P_UnPredictPlayer () From 929febdfb1fe4704c05d37eeb94e165992f684d8 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sun, 28 Apr 2024 18:30:19 -0400 Subject: [PATCH 052/414] Fixed prediction not calling virtual Tick function --- src/playsim/p_user.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index d00f7571b..806db50fc 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1512,8 +1512,8 @@ void P_PredictPlayer (player_t *player) player->cmd = localcmds[i % LOCALCMDTICS]; player->mo->ClearInterpolation(); player->mo->ClearFOVInterpolation(); - P_PlayerThink (player); - player->mo->Tick (); + P_PlayerThink(player); + player->mo->CallTick(); } if (rubberband) From 2643a4a16772406ebc4eca53af48a74e898e006e Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sun, 28 Apr 2024 19:18:55 -0400 Subject: [PATCH 053/414] Fixed desync in Heretic --- wadsrc/static/zscript/actors/player/player.zs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index 0cee7a7f3..f2d7213f4 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -154,7 +154,7 @@ class PlayerPawn : Actor if (health > 0) Height = FullHeight; } - if (player && bWeaponLevel2Ended) + if (player && bWeaponLevel2Ended && !(player.cheats & CF_PREDICTING)) { bWeaponLevel2Ended = false; if (player.ReadyWeapon != NULL && player.ReadyWeapon.bPowered_Up) From 48eb848433840761a1b129aa0e16853f10c59f14 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sun, 28 Apr 2024 09:00:18 -0400 Subject: [PATCH 054/414] Fixed ViewPos not properly backing up when predicting Also now forcibly creates the object on players when they spawn so their pointer won't get lost when predicting. --- src/playsim/p_user.cpp | 20 +++++++++++++++++++ wadsrc/static/zscript/actors/player/player.zs | 3 +++ 2 files changed, 23 insertions(+) diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 806db50fc..967ddb660 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -156,6 +156,12 @@ static TArray PredictionPortalSectors_sprev_Backup; static TArray PredictionPortalLinesBackup; static TArray PredictionPortalLines_sprev_Backup; +struct +{ + DVector3 Pos = {}; + int Flags = 0; +} static PredictionViewPosBackup; + // [GRB] Custom player classes TArray PlayerClasses; @@ -1443,6 +1449,14 @@ void P_PredictPlayer (player_t *player) PredictionActorBackupArray.Resize(act->GetClass()->Size); memcpy(PredictionActorBackupArray.Data(), &act->snext, act->GetClass()->Size - ((uint8_t *)&act->snext - (uint8_t *)act)); + // Since this is a DObject it needs to have its fields backed up manually for restore, otherwise any changes + // to it will be permanent while predicting. This is now auto-created on pawns to prevent creation spam. + if (act->ViewPos != nullptr) + { + PredictionViewPosBackup.Pos = act->ViewPos->Offset; + PredictionViewPosBackup.Flags = act->ViewPos->Flags; + } + act->flags &= ~MF_PICKUP; act->flags2 &= ~MF2_PUSHWALL; player->cheats |= CF_PREDICTING; @@ -1580,6 +1594,12 @@ void P_UnPredictPlayer () act->UnlinkFromWorld(&ctx); memcpy(&act->snext, PredictionActorBackupArray.Data(), PredictionActorBackupArray.Size() - ((uint8_t *)&act->snext - (uint8_t *)act)); + if (act->ViewPos != nullptr) + { + act->ViewPos->Offset = PredictionViewPosBackup.Pos; + act->ViewPos->Flags = PredictionViewPosBackup.Flags; + } + // The blockmap ordering needs to remain unchanged, too. // Restore sector links and refrences. // [ED850] This is somewhat of a duplicate of LinkToWorld(), but we need to keep every thing the same, diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index f2d7213f4..fe56805d7 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -179,6 +179,9 @@ class PlayerPawn : Actor override void BeginPlay() { + // Force create this since players can predict. + SetViewPos((0.0, 0.0, 0.0)); + Super.BeginPlay (); ChangeStatNum (STAT_PLAYER); FullHeight = Height; From 27eb78f4374a431e5181564fdec9f923c4e89bc1 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sat, 27 Apr 2024 18:43:04 -0400 Subject: [PATCH 055/414] Fixed weapon slots not resetting on unmorph Important for any morphed pawns that set custom weapon slots. --- wadsrc/static/zscript/actors/player/player_morph.zs | 1 + 1 file changed, 1 insertion(+) diff --git a/wadsrc/static/zscript/actors/player/player_morph.zs b/wadsrc/static/zscript/actors/player/player_morph.zs index ff84246a1..25858dd7c 100644 --- a/wadsrc/static/zscript/actors/player/player_morph.zs +++ b/wadsrc/static/zscript/actors/player/player_morph.zs @@ -323,6 +323,7 @@ extend class PlayerPawn if (level2) level2.Destroy(); + WeaponSlots.SetupWeaponSlots(alt); let morphWeap = p.ReadyWeapon; if (premorphWeap) { From c03f7889bf071ddc8992320d153e90920d33d312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 28 Apr 2024 11:20:31 -0300 Subject: [PATCH 056/414] restore old fadestep behavior if SPF_NEGATIVE_FADESTEP is not passed in --- src/playsim/p_effect.cpp | 2 +- src/playsim/p_effect.h | 1 + wadsrc/static/zscript/constants.zs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/playsim/p_effect.cpp b/src/playsim/p_effect.cpp index 5ee7e9f3c..459d267be 100644 --- a/src/playsim/p_effect.cpp +++ b/src/playsim/p_effect.cpp @@ -374,7 +374,7 @@ void P_SpawnParticle(FLevelLocals *Level, const DVector3 &pos, const DVector3 &v particle->Acc = FVector3(accel); particle->color = ParticleColor(color); particle->alpha = float(startalpha); - if (fadestep <= -1.0) particle->fadestep = FADEFROMTTL(lifetime); + if ((fadestep < 0 && !(flags & SPF_NEGATIVE_FADESTEP)) || fadestep <= -1.0) particle->fadestep = FADEFROMTTL(lifetime); else particle->fadestep = float(fadestep); particle->ttl = lifetime; particle->size = size; diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index 0f439785c..374aeecfc 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -65,6 +65,7 @@ enum EParticleFlags SPF_REPLACE = 1 << 7, SPF_NO_XY_BILLBOARD = 1 << 8, SPF_LOCAL_ANIM = 1 << 9, + SPF_NEGATIVE_FADESTEP = 1 << 10, }; class DVisualThinker; diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index e1176c649..8e36a5516 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -714,6 +714,7 @@ enum EParticleFlags SPF_REPLACE = 1 << 7, SPF_NO_XY_BILLBOARD = 1 << 8, SPF_LOCAL_ANIM = 1 << 9, + SPF_NEGATIVE_FADESTEP = 1 << 10, SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG }; From 3318e540b665c0ffffaa93ba1b8f993b34d2460e Mon Sep 17 00:00:00 2001 From: Ru5tK1ng Date: Mon, 29 Apr 2024 00:46:12 -0500 Subject: [PATCH 057/414] Added missing checking for LOOKALLAROUND. --- src/playsim/p_enemy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index 50ed1a74d..cf15cbf38 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -2139,7 +2139,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LookEx) if (!(flags & LOF_NOSIGHTCHECK)) { - if (!P_LookForPlayers(self, true, ¶ms)) + if (!P_LookForPlayers(self, (self->flags4 & MF4_LOOKALLAROUND), ¶ms)) // [RK] Account for the flag being set. return 0; } else From 81dade9ed5fd80bed0fb0fcd4477bea0b160e915 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 1 May 2024 09:47:58 +0200 Subject: [PATCH 058/414] fixed: for deleting files and folders on Windows we have to call the Unicode variants of these functions. --- src/common/menu/savegamemanager.cpp | 7 +++---- src/common/utility/cmdlib.cpp | 20 ++++++++++++++++++++ src/common/utility/cmdlib.h | 2 ++ src/common/utility/writezip.cpp | 7 ++++--- src/g_game.cpp | 2 +- src/maploader/glnodes.cpp | 10 ++-------- 6 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/common/menu/savegamemanager.cpp b/src/common/menu/savegamemanager.cpp index 83865cd1d..06b014122 100644 --- a/src/common/menu/savegamemanager.cpp +++ b/src/common/menu/savegamemanager.cpp @@ -84,7 +84,7 @@ int FSavegameManagerBase::RemoveSaveSlot(int index) int listindex = SaveGames[0]->bNoDelete ? index - 1 : index; if (listindex < 0) return index; - remove(SaveGames[index]->Filename.GetChars()); + RemoveFile(SaveGames[index]->Filename.GetChars()); UnloadSaveData(); FSaveGameNode *file = SaveGames[index]; @@ -274,7 +274,7 @@ DEFINE_ACTION_FUNCTION(FSavegameManager, DoSave) unsigned FSavegameManagerBase::ExtractSaveData(int index) { - FResourceFile *resf; + std::unique_ptr resf; FSaveGameNode *node; if (index == -1) @@ -295,7 +295,7 @@ unsigned FSavegameManagerBase::ExtractSaveData(int index) (node = SaveGames[index]) && !node->Filename.IsEmpty() && !node->bOldVersion && - (resf = FResourceFile::OpenResourceFile(node->Filename.GetChars(), true)) != nullptr) + ( (resf.reset(FResourceFile::OpenResourceFile(node->Filename.GetChars(), true))), resf != nullptr)) { auto info = resf->FindEntry("info.json"); if (info < 0) @@ -329,7 +329,6 @@ unsigned FSavegameManagerBase::ExtractSaveData(int index) } } } - delete resf; } return index; } diff --git a/src/common/utility/cmdlib.cpp b/src/common/utility/cmdlib.cpp index 5933a91d5..3b8dc9981 100644 --- a/src/common/utility/cmdlib.cpp +++ b/src/common/utility/cmdlib.cpp @@ -593,6 +593,26 @@ void CreatePath(const char *fn) } #endif +void RemoveFile(const char* file) +{ +#ifndef _WIN32 + remove(file); +#else + auto wpath = WideString(file); + _wremove(wpath.c_str()); +#endif +} + +int RemoveDir(const char* file) +{ +#ifndef _WIN32 + return rmdir(file); +#else + auto wpath = WideString(file); + return _wrmdir(wpath.c_str()); +#endif +} + //========================================================================== // // strbin -- In-place version diff --git a/src/common/utility/cmdlib.h b/src/common/utility/cmdlib.h index df779a975..88027c156 100644 --- a/src/common/utility/cmdlib.h +++ b/src/common/utility/cmdlib.h @@ -71,6 +71,8 @@ int strbin (char *str); FString strbin1 (const char *start); void CreatePath(const char * fn); +void RemoveFile(const char* file); +int RemoveDir(const char* file); FString ExpandEnvVars(const char *searchpathstring); FString NicePath(const char *path); diff --git a/src/common/utility/writezip.cpp b/src/common/utility/writezip.cpp index 2f3507e6f..de89779c0 100644 --- a/src/common/utility/writezip.cpp +++ b/src/common/utility/writezip.cpp @@ -40,6 +40,7 @@ #include "m_swap.h" #include "w_zip.h" #include "fs_decompress.h" +#include "cmdlib.h" using FileSys::FCompressedBuffer; @@ -201,7 +202,7 @@ bool WriteZip(const char* filename, const FCompressedBuffer* content, size_t con if (pos == -1) { delete f; - remove(filename); + RemoveFile(filename); return false; } positions.Push(pos); @@ -213,7 +214,7 @@ bool WriteZip(const char* filename, const FCompressedBuffer* content, size_t con if (AppendCentralDirectory(f, content[i], dostime, positions[i]) < 0) { delete f; - remove(filename); + RemoveFile(filename); return false; } } @@ -230,7 +231,7 @@ bool WriteZip(const char* filename, const FCompressedBuffer* content, size_t con if (f->Write(&dirend, sizeof(dirend)) != sizeof(dirend)) { delete f; - remove(filename); + RemoveFile(filename); return false; } delete f; diff --git a/src/g_game.cpp b/src/g_game.cpp index 56a84d482..472b840a4 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -3079,7 +3079,7 @@ bool G_CheckDemoStatus (void) const size_t size = demo_p - demobuffer; saved = fw->Write(demobuffer, size) == size; delete fw; - if (!saved) remove(demoname.GetChars()); + if (!saved) RemoveFile(demoname.GetChars()); } M_Free (demobuffer); demorecording = false; diff --git a/src/maploader/glnodes.cpp b/src/maploader/glnodes.cpp index b41b22c0b..df569b1ae 100644 --- a/src/maploader/glnodes.cpp +++ b/src/maploader/glnodes.cpp @@ -34,12 +34,6 @@ #ifndef _WIN32 #include - -#else -#include - -#define rmdir _rmdir - #endif #include @@ -1215,11 +1209,11 @@ UNSAFE_CCMD(clearnodecache) { if (list[i].isDirectory) { - rmdir(list[i].FilePath.c_str()); + RemoveDir(list[i].FilePath.c_str()); } else { - remove(list[i].FilePath.c_str()); + RemoveFile(list[i].FilePath.c_str()); } } From f2d582f680b72eb50480e7c704f90b9bd38c7529 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 1 May 2024 09:49:45 +0200 Subject: [PATCH 059/414] fixed: The savegame's PNG loader must use a caching FileReader to avoid holding a handle to the containing file. This blocked savegame deletion. --- src/common/menu/savegamemanager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/menu/savegamemanager.cpp b/src/common/menu/savegamemanager.cpp index 06b014122..135093021 100644 --- a/src/common/menu/savegamemanager.cpp +++ b/src/common/menu/savegamemanager.cpp @@ -316,7 +316,8 @@ unsigned FSavegameManagerBase::ExtractSaveData(int index) auto pic = resf->FindEntry("savepic.png"); if (pic >= 0) { - FileReader picreader = resf->GetEntryReader(pic, FileSys::READER_NEW, FileSys::READERFLAG_SEEKABLE); + // This must use READER_CACHED or it will lock the savegame file. + FileReader picreader = resf->GetEntryReader(pic, FileSys::READER_CACHED, FileSys::READERFLAG_SEEKABLE); PNGHandle *png = M_VerifyPNG(picreader); if (png != nullptr) { From 6f2bc8379adbde57fbe38778e10e8c5ab4f97536 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 1 May 2024 11:58:30 +0200 Subject: [PATCH 060/414] strip spaces from language labels. --- src/common/engine/stringtable.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/engine/stringtable.cpp b/src/common/engine/stringtable.cpp index 707b59b69..d9d739b57 100644 --- a/src/common/engine/stringtable.cpp +++ b/src/common/engine/stringtable.cpp @@ -254,6 +254,7 @@ bool FStringTable::ParseLanguageCSV(int filenum, const char* buffer, size_t size } } + row[labelcol].StripLeftRight(); FName strName = row[labelcol].GetChars(); if (hasDefaultEntry) { From 3a5838c8f5a24bbe198faa41574736694848992e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 1 May 2024 12:20:06 +0200 Subject: [PATCH 061/414] don't abort when parsing the Steam config fails. --- src/win32/i_steam.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/win32/i_steam.cpp b/src/win32/i_steam.cpp index f8bd74bff..2cf536475 100644 --- a/src/win32/i_steam.cpp +++ b/src/win32/i_steam.cpp @@ -61,6 +61,7 @@ #include "printf.h" +#include "engineerrors.h" #include "version.h" #include "i_sound.h" #include "stats.h" @@ -307,22 +308,29 @@ TArray I_GetSteamPath() return result; } - TArray paths = ParseSteamRegistry((steamPath + "/config/libraryfolders.vdf").GetChars()); - - for(FString &path : paths) + try { - path.ReplaceChars('\\','/'); - path+="/"; - } + TArray paths = ParseSteamRegistry((steamPath + "/config/libraryfolders.vdf").GetChars()); - paths.Push(steamPath + "/steamapps/common/"); - - for(unsigned int i = 0; i < countof(steam_dirs); ++i) - { - for(const FString &path : paths) + for (FString& path : paths) { - result.Push(path + steam_dirs[i]); + path.ReplaceChars('\\', '/'); + path += "/"; } + + paths.Push(steamPath + "/steamapps/common/"); + + for (unsigned int i = 0; i < countof(steam_dirs); ++i) + { + for (const FString& path : paths) + { + result.Push(path + steam_dirs[i]); + } + } + } + catch (const CRecoverableError& err) + { + // don't abort on errors in here. Just return an empty path. } return result; From 370bec6c559ec3b3be2552ae4cf829750599f915 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 1 May 2024 17:57:11 +0200 Subject: [PATCH 062/414] fixed GL nodes loader for maps loaded from mounted folders. Due to how the reader is created, READER_NEW will not work for it, it needs to force READER_CACHED. --- src/maploader/glnodes.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/maploader/glnodes.cpp b/src/maploader/glnodes.cpp index df569b1ae..33051b6c1 100644 --- a/src/maploader/glnodes.cpp +++ b/src/maploader/glnodes.cpp @@ -900,7 +900,8 @@ bool MapLoader::LoadGLNodes(MapData * map) break; } else - gwalumps[i] = f_gwa->GetEntryReader(li + i + 1, FileSys::READER_NEW, FileSys::READERFLAG_SEEKABLE); + // This is a special case. The container for the map WAD is not set up to create new file handles for itself so this needs to cache the content here. + gwalumps[i] = f_gwa->GetEntryReader(li + i + 1, FileSys::READER_CACHED, FileSys::READERFLAG_SEEKABLE); } if (result) result = DoLoadGLNodes(gwalumps); } From a6e1114d3cea82cf9aeaa74f36eea7f94a544e67 Mon Sep 17 00:00:00 2001 From: Xaser Acheron Date: Wed, 1 May 2024 15:46:07 -0500 Subject: [PATCH 063/414] add mbf21 and mbf21 (strict) compatibility presets --- src/d_main.cpp | 13 +++++++++++++ wadsrc/static/language.csv | 2 ++ wadsrc/static/menudef.txt | 2 ++ 3 files changed, 17 insertions(+) diff --git a/src/d_main.cpp b/src/d_main.cpp index c570eddc4..fbc67693c 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -662,6 +662,19 @@ CUSTOM_CVAR(Int, compatmode, 0, CVAR_ARCHIVE|CVAR_NOINITCALL) COMPATF_TRACE | COMPATF_HITSCAN | COMPATF_MISSILECLIP | COMPATF_MASKEDMIDTEX | COMPATF_SOUNDTARGET; w = COMPATF2_POINTONLINE | COMPATF2_EXPLODE1 | COMPATF2_EXPLODE2 | COMPATF2_AVOID_HAZARDS | COMPATF2_STAYONLIFT | COMPATF2_NOMBF21; break; + + case 8: // MBF21 compat mode + v = COMPATF_TRACE | COMPATF_SOUNDTARGET | COMPATF_BOOMSCROLL | COMPATF_MISSILECLIP | COMPATF_CROSSDROPOFF | + COMPATF_MUSHROOM | COMPATF_MBFMONSTERMOVE | COMPATF_NOBLOCKFRIENDS | COMPATF_MASKEDMIDTEX; + w = COMPATF2_EXPLODE1 | COMPATF2_AVOID_HAZARDS | COMPATF2_STAYONLIFT; + break; + + case 9: // Stricter MBF21 compatibility + v = COMPATF_NOBLOCKFRIENDS | COMPATF_MBFMONSTERMOVE | COMPATF_INVISIBILITY | + COMPATF_NOTOSSDROPS | COMPATF_MUSHROOM | COMPATF_NO_PASSMOBJ | COMPATF_BOOMSCROLL | COMPATF_WALLRUN | + COMPATF_TRACE | COMPATF_HITSCAN | COMPATF_MISSILECLIP | COMPATF_CROSSDROPOFF | COMPATF_MASKEDMIDTEX | COMPATF_SOUNDTARGET; + w = COMPATF2_POINTONLINE | COMPATF2_EXPLODE1 | COMPATF2_EXPLODE2 | COMPATF2_AVOID_HAZARDS | COMPATF2_STAYONLIFT; + break; } compatflags = v; compatflags2 = w; diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index b588c7c66..81a41967e 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -3146,6 +3146,8 @@ Boom,OPTVAL_BOOM,,,,,,,,,,,,,,,,붐,,,,,,,,,,, Boom (strict),OPTVAL_BOOMSTRICT,,,,Boom (striktní),Boom (streng),Boom (strikt),,Boom (severa),Boom (estricto),,Boom (tiukka),,Boom (szigorú),Boom (rigoroso),Boom(厳密),붐 (엄격하게),Boom (streng),Boom (streng),Boom (ścisły),Boom (estritamente),Boom (estrito),,Boom (строгий),Boom (строг),Boom (strikt),Boom (katı), MBF,OPTVAL_MBF,,,,,,,,,,,,,,,,마린의 절친한 친구,,,,,,,,,,, MBF (strict),OPTVAL_MBFSTRICT,,,,MBF (striktní),MBF (streng),MBF (strikt),,MBF (severa),MBF (estricto),,MBF (tiukka),,MBF (szigorú),MBF (rigoroso),MBF(厳密),마린의 절친한 친구 (엄격하게),MBF (streng),MBF (streng),MBF (ścisły),MBF (estritamente),MBF (estrito),,MBF (строгий),MBF (строг),MBF (strikt),MBF (katı), +MBF21,OPTVAL_MBF21,,,,,,,,,,,,,,,,,,,,,,,,,,, +MBF21 (strict),OPTVAL_MBF21STRICT,,,,MBF21 (striktní),MBF21 (streng),MBF21 (strikt),,MBF21 (severa),MBF21 (estricto),,MBF21 (tiukka),,MBF21 (szigorú),MBF21 (rigoroso),MBF21(厳密),MBF21 (엄격하게),MBF21 (streng),MBF21 (streng),MBF21 (ścisły),MBF21 (estritamente),MBF21 (estrito),,MBF21 (строгий),MBF21 (строг),MBF21 (strikt),MBF21 (katı), ZDoom 2.0.63,OPTVAL_ZDOOM2063,,,,,,,,,,,,,,,,Z둠 2.0.63,,,,,,,,,,, All unacknowledged,OPTVAL_ALLUNACKNOWLEDGED,,,,Všechny nepotrvzené,Alle ubekræftede,Alle unbestätigten,,Ĉiuj neagnoskitaj,Todos no reconocidos,,Kaikki kuittaamattomat,Tout non-acknowledged,Minden visszaigazolatlan,Tutti non riconosciuti,未確認全て,모두 미확인함,Allemaal onbekend,Alle ubekreftet,Wszystkie niepotwierdzone,Todos não-reconhecidos,,Toate necunoscute,Всё неопознанное,Све неусвојено,Alla obeaktade,Tüm onaylanmamış, Errors,OPTVAL_ERRORS,,,,Chyby,Fejl,Fehler,,Eraroj,Errores,,Virheet,Erreurs,Hibák,Errori,エラー,에러,Fouten,Feil,Błędy,Erros,,Erori,Ошибки,Грешка,Fel,Hatalar, diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index a213f593f..c9535ff0c 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1729,6 +1729,8 @@ OptionValue CompatModes 6, "$OPTVAL_BOOMSTRICT" 5, "$OPTVAL_MBF" 7, "$OPTVAL_MBFSTRICT" + 8, "$OPTVAL_MBF21" + 9, "$OPTVAL_MBF21STRICT" 4, "$OPTVAL_ZDOOM2063" } From 4bf2fb0ef89582f54d87613253b48440b7e86b37 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 3 May 2024 02:03:58 -0400 Subject: [PATCH 064/414] - make particles square --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 341bb2001..8263a57fa 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -1447,7 +1447,11 @@ void HWSprite::ProcessParticle(HWDrawInfo *di, particle_t *particle, sector_t *s else factor = 1 / 7.f; float scalefac=particle->size * factor; - float viewvecX = vp.ViewVector.X * scalefac; + float ps = di->Level->pixelstretch; + + scalefac *= 2 * ps / (ps * ps + 1); // shrink it slightly to account for the stretch + + float viewvecX = vp.ViewVector.X * scalefac * ps; float viewvecY = vp.ViewVector.Y * scalefac; x1=x+viewvecY; From bcad040fd341e78f1f32c83d0ad8b0143dd4aa51 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 3 May 2024 09:45:20 -0400 Subject: [PATCH 065/414] - always show iwad picker, offer option for forks to hide picker by default. this commit was intentionally done in a way to cause merge conflicts so as to force fork maintainers to pay attention to the new option in version.h --- src/common/engine/i_interface.cpp | 3 ++- src/d_iwad.cpp | 4 ++-- src/version.h | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/common/engine/i_interface.cpp b/src/common/engine/i_interface.cpp index 580dde407..7030194ea 100644 --- a/src/common/engine/i_interface.cpp +++ b/src/common/engine/i_interface.cpp @@ -4,6 +4,7 @@ #include "startupinfo.h" #include "c_cvars.h" #include "gstrings.h" +#include "version.h" static_assert(sizeof(void*) == 8, "32 builds are not supported"); @@ -23,7 +24,7 @@ bool pauseext; FStartupInfo GameStartupInfo; -CVAR(Bool, queryiwad, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); +CVAR(Bool, queryiwad, QUERYIWADDEFAULT, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); CVAR(String, defaultiwad, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG); CVAR(Bool, vid_fps, false, 0) diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index f1495febc..99f5df02f 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -728,7 +728,7 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char int pick = 0; // We got more than one so present the IWAD selection box. - if (picks.Size() > 1) + if (picks.Size() > 0) { // Locate the user's prefered IWAD, if it was found. if (defaultiwad[0] != '\0') @@ -743,7 +743,7 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char } } } - if (picks.Size() > 1) + if (picks.Size() > 0) { if (!havepicked) { diff --git a/src/version.h b/src/version.h index 1d02a1f40..21d2247e6 100644 --- a/src/version.h +++ b/src/version.h @@ -101,8 +101,11 @@ const char *GetVersionString(); #define GAMENAME "GZDoom" #define WGAMENAME L"GZDoom" #define GAMENAMELOWERCASE "gzdoom" +#define QUERYIWADDEFAULT true #define FORUM_URL "http://forum.zdoom.org/" #define BUGS_FORUM_URL "http://forum.zdoom.org/viewforum.php?f=2" +// For QUERYIWADDEFAULT: Set to 'true' to always show dialog box on startup by default, 'false' to disable. +// Should set to 'false' for standalone games, and set to 'true' for regular source port forks that are meant to run any game. #if defined(__APPLE__) || defined(_WIN32) #define GAME_DIR GAMENAME From 7ef6fa97a776c0285334cd16daa9186524a92cb0 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 3 May 2024 14:32:20 -0400 Subject: [PATCH 066/414] - make roll and flat sprites square --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 8263a57fa..cd2100e3f 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -355,11 +355,7 @@ void HandleSpriteOffsets(Matrix3x4 *mat, const FRotator *HW, FVector2 *offset, b bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) { - float pixelstretch = 1.2; - if (actor && actor->Level) - pixelstretch = actor->Level->pixelstretch; - else if (particle && particle->subsector && particle->subsector->sector && particle->subsector->sector->Level) - pixelstretch = particle->subsector->sector->Level->pixelstretch; + float pixelstretch = di->Level->pixelstretch; FVector3 center = FVector3((x1 + x2) * 0.5, (y1 + y2) * 0.5, (z1 + z2) * 0.5); const auto& HWAngles = di->Viewpoint.HWAngles; @@ -1005,6 +1001,13 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 : sprscale.Y); + if (thing->renderflags & (RF_ROLLSPRITE|RF_FLATSPRITE)) + { + double ps = di->Level->pixelstretch; + double mult = 2 * ps / (ps * ps + 1); // shrink slightly + r.Scale(mult * ps, mult); + } + float rightfac = -r.left; float leftfac = rightfac - r.width; z1 = z - r.top; @@ -1521,6 +1524,13 @@ void HWSprite::AdjustVisualThinker(HWDrawInfo* di, DVisualThinker* spr, sector_t auto r = spi.GetSpriteRect(); r.Scale(spr->Scale.X, spr->Scale.Y); + if (spr->PT.flags & SPF_ROLL) + { + double ps = di->Level->pixelstretch; + double mult = 2 * ps / (ps * ps + 1); // shrink slightly + r.Scale(mult * ps, mult); + } + if (spr->bXFlip) { std::swap(ul,ur); From 35f5e0498eda6871f30386d977953fe5d2e25abd Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 3 May 2024 14:45:25 -0400 Subject: [PATCH 067/414] - fix always show iwad box - don't show if queryiwad is false, or if -iwad parameter is used --- src/d_iwad.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 99f5df02f..0dd46db3b 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -727,8 +727,10 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char } int pick = 0; - // We got more than one so present the IWAD selection box. - if (picks.Size() > 0) + // Present the IWAD selection box. + bool alwaysshow = (queryiwad && !Args->CheckParm("-iwad")); + + if (alwaysshow || picks.Size() > 1) { // Locate the user's prefered IWAD, if it was found. if (defaultiwad[0] != '\0') @@ -743,7 +745,7 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char } } } - if (picks.Size() > 0) + if (alwaysshow || picks.Size() > 1) { if (!havepicked) { From 75c9b584ee89ea2c4dc35b7ae43404be1271121e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 21 Apr 2024 10:50:27 -0300 Subject: [PATCH 068/414] Revert "- hide the additional parameters for now, this needs to be added in later" This reverts commit fde6c863d171ab5b071d45dd47cb03861937d376. --- src/launcher/playgamepage.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/launcher/playgamepage.cpp b/src/launcher/playgamepage.cpp index 972e48d26..46bd16a92 100644 --- a/src/launcher/playgamepage.cpp +++ b/src/launcher/playgamepage.cpp @@ -85,7 +85,6 @@ void PlayGamePage::OnGeometryChanged() y = GetHeight() - 10.0; -#if 0 // NYI: Additional Parameters double editHeight = 24.0; y -= editHeight; ParametersEdit->SetFrameGeometry(0.0, y, GetWidth(), editHeight); @@ -95,7 +94,6 @@ void PlayGamePage::OnGeometryChanged() y -= labelHeight; ParametersLabel->SetFrameGeometry(0.0, y, GetWidth(), labelHeight); y -= 10.0; -#endif double listViewBottom = y - 10.0; GamesList->SetFrameGeometry(0.0, listViewTop, GetWidth(), std::max(listViewBottom - listViewTop, 0.0)); From c3ac4c9c38b1208e724fee1a0d4b2f794c11c535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 21 Apr 2024 12:20:36 -0300 Subject: [PATCH 069/414] Handle Extra Args --- src/common/platform/posix/i_system.h | 2 +- src/common/platform/posix/sdl/i_system.cpp | 4 +- src/common/platform/win32/i_system.cpp | 4 +- src/common/platform/win32/i_system.h | 2 +- src/common/utility/m_argv.cpp | 108 +++++++++++++++++++++ src/common/utility/m_argv.h | 1 + src/common/utility/zstring.h | 1 + src/d_iwad.cpp | 11 ++- src/d_main.cpp | 7 +- src/launcher/launcherwindow.cpp | 10 +- src/launcher/launcherwindow.h | 2 +- 11 files changed, 136 insertions(+), 16 deletions(-) diff --git a/src/common/platform/posix/i_system.h b/src/common/platform/posix/i_system.h index 02acf0e3e..4d800d53b 100644 --- a/src/common/platform/posix/i_system.h +++ b/src/common/platform/posix/i_system.h @@ -38,7 +38,7 @@ void I_PrintStr (const char *str); void I_SetIWADInfo (); // Pick from multiple IWADs to use -int I_PickIWad (WadStuff *wads, int numwads, bool queryiwad, int defaultiwad, int&); +int I_PickIWad (WadStuff *wads, int numwads, bool queryiwad, int defaultiwad, int&, FString &); // [RH] Checks the registry for Steam's install path, so we can scan its // directories for IWADs if the user purchased any through Steam. diff --git a/src/common/platform/posix/sdl/i_system.cpp b/src/common/platform/posix/sdl/i_system.cpp index 7fa41b2bc..2c28368b0 100644 --- a/src/common/platform/posix/sdl/i_system.cpp +++ b/src/common/platform/posix/sdl/i_system.cpp @@ -298,7 +298,7 @@ void I_PrintStr(const char *cp) if (StartWindow) RedrawProgressBar(ProgressBarCurPos,ProgressBarMaxPos); } -int I_PickIWad (WadStuff *wads, int numwads, bool showwin, int defaultiwad, int& autoloadflags) +int I_PickIWad (WadStuff *wads, int numwads, bool showwin, int defaultiwad, int& autoloadflags, FString &extraArgs) { if (!showwin) { @@ -308,7 +308,7 @@ int I_PickIWad (WadStuff *wads, int numwads, bool showwin, int defaultiwad, int& #ifdef __APPLE__ return I_PickIWad_Cocoa (wads, numwads, showwin, defaultiwad); #else - return LauncherWindow::ExecModal(wads, numwads, defaultiwad, &autoloadflags); + return LauncherWindow::ExecModal(wads, numwads, defaultiwad, &autoloadflags, &extraArgs); #endif } diff --git a/src/common/platform/win32/i_system.cpp b/src/common/platform/win32/i_system.cpp index fe5fada53..71a4ded12 100644 --- a/src/common/platform/win32/i_system.cpp +++ b/src/common/platform/win32/i_system.cpp @@ -353,7 +353,7 @@ static void SetQueryIWad(HWND dialog) // //========================================================================== -int I_PickIWad(WadStuff *wads, int numwads, bool showwin, int defaultiwad, int& autoloadflags) +int I_PickIWad(WadStuff *wads, int numwads, bool showwin, int defaultiwad, int& autoloadflags, FString &extraArgs) { int vkey; if (stricmp(queryiwad_key, "shift") == 0) @@ -370,7 +370,7 @@ int I_PickIWad(WadStuff *wads, int numwads, bool showwin, int defaultiwad, int& } if (showwin || (vkey != 0 && GetAsyncKeyState(vkey))) { - return LauncherWindow::ExecModal(wads, numwads, defaultiwad, &autoloadflags); + return LauncherWindow::ExecModal(wads, numwads, defaultiwad, &autoloadflags, &extraArgs); } return defaultiwad; } diff --git a/src/common/platform/win32/i_system.h b/src/common/platform/win32/i_system.h index 9d360b55a..b70efb78b 100644 --- a/src/common/platform/win32/i_system.h +++ b/src/common/platform/win32/i_system.h @@ -38,7 +38,7 @@ void I_PrintStr (const char *cp); void I_SetIWADInfo (); // Pick from multiple IWADs to use -int I_PickIWad(WadStuff* wads, int numwads, bool queryiwad, int defaultiwad, int& autoloadflags); +int I_PickIWad(WadStuff* wads, int numwads, bool queryiwad, int defaultiwad, int& autoloadflags, FString &extraArgs); // The ini could not be saved at exit bool I_WriteIniFailed (const char* filename); diff --git a/src/common/utility/m_argv.cpp b/src/common/utility/m_argv.cpp index b9b05c3e9..05bc173ee 100644 --- a/src/common/utility/m_argv.cpp +++ b/src/common/utility/m_argv.cpp @@ -345,6 +345,114 @@ void FArgs::AppendArgs(int argc, const FString *argv) } } +//=========================================================================== +// +// FArgs :: AppendArgsString +// +// Adds extra args as a space-separated string, supporting simple quoting, and inserting -file args into the right place +// +//=========================================================================== + + +void FArgs::AppendArgsString(FString argv) +{ + auto file_index = Argv.Find("-file"); + auto files_end = file_index + 1; + + for (; files_end < Argv.Size() && Argv[files_end][0] != '-' && Argv[files_end][0] != '+'; ++files_end); + + if(file_index == Argv.Size()) + { + Argv.Push("-file"); + } + + bool inserting_file = true; + + argv.StripLeftRight(); + + size_t i = 0; + size_t lastSection = 0; + size_t lastStart = 0; + char lastQuoteType = 0; + + FString tmp; + bool has_tmp = false; + + for(i = 0; i < argv.Len(); i++) + { + if(argv[i] == ' ') + { + FString arg = tmp + argv.Mid(lastSection, i - lastSection); + + if(arg[0] == '-' || arg[0] == '+') inserting_file = false; + + if(inserting_file) + { + Argv.Insert(files_end++, arg); + } + else if(arg.Compare("-file") == 0) + { + inserting_file = true; + } + else + { + files_end++; + Argv.Insert(file_index++, arg); + } + + lastSection = i + 1; + tmp = ""; + has_tmp = false; + for(;(i + 1) < argv.Len() && argv[i + 1] == ' '; i++, lastSection++); + lastStart = i + 1; + } + else if(argv[i] == '\'' || argv[i] == '"') + { + lastQuoteType = argv[i]; + tmp += argv.Mid(lastSection, i - lastSection); + has_tmp = true; + bool wasSlash = false; + + for(i++; (argv[i] != lastQuoteType || wasSlash) && i < argv.Len(); i++) + { + if(i == '\\' && !wasSlash) + { + wasSlash = true; + } + else + { + tmp += argv[i]; + wasSlash = false; + } + } + lastSection = i + 1; + } + } + + if(lastSection != i) + { // ended on an unquoted section + FString arg = tmp + argv.Mid(lastSection); + if(inserting_file) + { + Argv.Insert(files_end, arg); + } + else if(arg.Compare("-file") != 0) + { + Argv.Insert(file_index, arg); + } + } + else if(has_tmp) + { // ended on a quote + if(inserting_file) + { + Argv.Insert(files_end, tmp); + } + else if(tmp.Compare("-file") != 0) + { + Argv.Insert(file_index, tmp); + } + } +} //=========================================================================== // // FArgs :: RemoveArg diff --git a/src/common/utility/m_argv.h b/src/common/utility/m_argv.h index 953769703..d12da9a5f 100644 --- a/src/common/utility/m_argv.h +++ b/src/common/utility/m_argv.h @@ -85,6 +85,7 @@ public: void AppendArg(FString arg); void AppendArgs(int argc, const FString *argv); + void AppendArgsString(FString argv); void RemoveArg(int argindex); void RemoveArgs(const char *check); void SetArgs(int argc, char **argv); diff --git a/src/common/utility/zstring.h b/src/common/utility/zstring.h index 93d679021..284027712 100644 --- a/src/common/utility/zstring.h +++ b/src/common/utility/zstring.h @@ -128,6 +128,7 @@ public: FString (FString &&other) noexcept : Chars(other.Chars) { other.ResetToNull(); } FString (const char *copyStr); FString (const char *copyStr, size_t copyLen); + FString (const std::string &s) : FString(s.c_str(), s.length()) {} FString (char oneChar); FString(const TArray & source) : FString(source.Data(), source.Size()) {} FString(const TArray & source) : FString((char*)source.Data(), source.Size()) {} diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 0dd46db3b..4758064a3 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -764,9 +764,18 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char if (autoloadbrightmaps) flags |= 4; if (autoloadwidescreen) flags |= 8; - pick = I_PickIWad(&wads[0], (int)wads.Size(), queryiwad, pick, flags); + FString extraArgs; + + pick = I_PickIWad(&wads[0], (int)wads.Size(), queryiwad, pick, flags, extraArgs); if (pick >= 0) { + extraArgs.StripLeftRight(); + + if(extraArgs.Len() > 0) + { + Args->AppendArgsString(extraArgs); + } + disableautoload = !!(flags & 1); autoloadlights = !!(flags & 2); autoloadbrightmaps = !!(flags & 4); diff --git a/src/d_main.cpp b/src/d_main.cpp index fbc67693c..2d7f20c48 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1809,7 +1809,9 @@ static void GetCmdLineFiles(std::vector& wadfiles) int i, argc; argc = Args->CheckParmList("-file", &args); - for (i = 0; i < argc; ++i) + + // [RL0] Check for array size to only add new wads + for (i = wadfiles.size(); i < argc; ++i) { D_AddWildFile(wadfiles, args[i].GetChars(), ".wad", GameConfig); } @@ -3764,6 +3766,9 @@ static int D_DoomMain_Internal (void) std::vector allwads; const FIWADInfo *iwad_info = iwad_man->FindIWAD(allwads, iwad.GetChars(), basewad.GetChars(), optionalwad.GetChars()); + + GetCmdLineFiles(pwads); // [RL0] Update with files passed on the launcher extra args + if (!iwad_info) return 0; // user exited the selection popup via cancel button. if ((iwad_info->flags & GI_SHAREWARE) && pwads.size() > 0) { diff --git a/src/launcher/launcherwindow.cpp b/src/launcher/launcherwindow.cpp index 37d0a236d..860d1a109 100644 --- a/src/launcher/launcherwindow.cpp +++ b/src/launcher/launcherwindow.cpp @@ -11,7 +11,7 @@ #include #include -int LauncherWindow::ExecModal(WadStuff* wads, int numwads, int defaultiwad, int* autoloadflags) +int LauncherWindow::ExecModal(WadStuff* wads, int numwads, int defaultiwad, int* autoloadflags, FString * extraArgs) { Size screenSize = GetScreenSize(); double windowWidth = 615.0; @@ -23,6 +23,8 @@ int LauncherWindow::ExecModal(WadStuff* wads, int numwads, int defaultiwad, int* DisplayWindow::RunLoop(); + if(extraArgs) *extraArgs = launcher->PlayGame->GetExtraArgs(); + return launcher->ExecResult; } @@ -54,12 +56,6 @@ void LauncherWindow::Start() { Settings->Save(); - std::string extraargs = PlayGame->GetExtraArgs(); - if (!extraargs.empty()) - { - // To do: restart the process like the cocoa backend is doing? - } - ExecResult = PlayGame->GetSelectedGame(); DisplayWindow::ExitLoop(); } diff --git a/src/launcher/launcherwindow.h b/src/launcher/launcherwindow.h index 8cdbc6ce7..8e7c8bbe6 100644 --- a/src/launcher/launcherwindow.h +++ b/src/launcher/launcherwindow.h @@ -14,7 +14,7 @@ struct WadStuff; class LauncherWindow : public Widget { public: - static int ExecModal(WadStuff* wads, int numwads, int defaultiwad, int* autoloadflags); + static int ExecModal(WadStuff* wads, int numwads, int defaultiwad, int* autoloadflags, FString * extraArgs = nullptr); LauncherWindow(WadStuff* wads, int numwads, int defaultiwad, int* autoloadflags); void UpdateLanguage(); From 1006d20c136b438985a6c0ae246aec59d2de0ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 21 Apr 2024 12:25:14 -0300 Subject: [PATCH 070/414] fix CheckParmList seems like it was checking the second char for '+' instead of the first --- src/common/utility/m_argv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/utility/m_argv.cpp b/src/common/utility/m_argv.cpp index 05bc173ee..0e8946058 100644 --- a/src/common/utility/m_argv.cpp +++ b/src/common/utility/m_argv.cpp @@ -189,7 +189,7 @@ int FArgs::CheckParmList(const char *check, FString **strings, int start) const } for (i = ++parmat; i < Argv.Size(); ++i) { - if (Argv[i][0] == '-' || Argv[i][1] == '+') + if (Argv[i][0] == '-' || Argv[i][0] == '+') { break; } From 9129f0121b0b9facbcbee0eb5f82afbb0e67b022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 21 Apr 2024 12:31:12 -0300 Subject: [PATCH 071/414] Fix MacOS Compilation --- src/common/platform/posix/cocoa/i_system.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/platform/posix/cocoa/i_system.mm b/src/common/platform/posix/cocoa/i_system.mm index cef2d177b..267bac31d 100644 --- a/src/common/platform/posix/cocoa/i_system.mm +++ b/src/common/platform/posix/cocoa/i_system.mm @@ -122,7 +122,7 @@ void I_ShowFatalError(const char *message) } -int I_PickIWad(WadStuff* const wads, const int numwads, const bool showwin, const int defaultiwad, int&) +int I_PickIWad(WadStuff* const wads, const int numwads, const bool showwin, const int defaultiwad, int&, FString&) { if (!showwin) { From 096b92f1b4f4c2297dafb4b2fdea9562210871de Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 9 May 2024 20:50:53 +0200 Subject: [PATCH 072/414] Rewrite the crash reporter code --- libraries/ZWidget/CMakeLists.txt | 8 + .../ZWidget/include/zwidget/core/widget.h | 2 + .../systemdialogs/folder_browse_dialog.h | 30 + .../zwidget/systemdialogs/open_file_dialog.h | 55 + .../zwidget/systemdialogs/save_file_dialog.h | 46 + .../ZWidget/include/zwidget/window/window.h | 2 + libraries/ZWidget/src/core/widget.cpp | 6 + .../systemdialogs/folder_browse_dialog.cpp | 188 ++ .../src/systemdialogs/open_file_dialog.cpp | 286 ++ .../src/systemdialogs/save_file_dialog.cpp | 263 ++ .../ZWidget/src/widgets/lineedit/lineedit.cpp | 2 +- .../src/window/sdl2/sdl2displaywindow.cpp | 7 +- .../src/window/sdl2/sdl2displaywindow.h | 2 + .../src/window/win32/win32displaywindow.cpp | 18 +- .../src/window/win32/win32displaywindow.h | 2 + src/CMakeLists.txt | 7 +- src/common/platform/win32/i_crash.cpp | 2477 ++--------------- src/common/platform/win32/i_crash_arm.cpp | 7 - src/common/platform/win32/i_main.cpp | 301 +- src/common/widgets/errorwindow.cpp | 62 +- src/common/widgets/errorwindow.h | 7 +- src/d_main.cpp | 46 + 22 files changed, 1327 insertions(+), 2497 deletions(-) create mode 100644 libraries/ZWidget/include/zwidget/systemdialogs/folder_browse_dialog.h create mode 100644 libraries/ZWidget/include/zwidget/systemdialogs/open_file_dialog.h create mode 100644 libraries/ZWidget/include/zwidget/systemdialogs/save_file_dialog.h create mode 100644 libraries/ZWidget/src/systemdialogs/folder_browse_dialog.cpp create mode 100644 libraries/ZWidget/src/systemdialogs/open_file_dialog.cpp create mode 100644 libraries/ZWidget/src/systemdialogs/save_file_dialog.cpp delete mode 100644 src/common/platform/win32/i_crash_arm.cpp diff --git a/libraries/ZWidget/CMakeLists.txt b/libraries/ZWidget/CMakeLists.txt index 4ce83efe3..9967b4ec6 100644 --- a/libraries/ZWidget/CMakeLists.txt +++ b/libraries/ZWidget/CMakeLists.txt @@ -33,6 +33,9 @@ set(ZWIDGET_SOURCES src/widgets/listview/listview.cpp src/widgets/tabwidget/tabwidget.cpp src/window/window.cpp + src/systemdialogs/folder_browse_dialog.cpp + src/systemdialogs/open_file_dialog.cpp + src/systemdialogs/save_file_dialog.cpp ) set(ZWIDGET_INCLUDES @@ -63,6 +66,9 @@ set(ZWIDGET_INCLUDES include/zwidget/widgets/listview/listview.h include/zwidget/widgets/tabwidget/tabwidget.h include/zwidget/window/window.h + include/zwidget/systemdialogs/folder_browse_dialog.h + include/zwidget/systemdialogs/open_file_dialog.h + include/zwidget/systemdialogs/save_file_dialog.h ) set(ZWIDGET_WIN32_SOURCES @@ -97,6 +103,7 @@ source_group("src\\widgets\\checkboxlabel" REGULAR_EXPRESSION "${CMAKE_CURRENT_S source_group("src\\widgets\\listview" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/widgets/listview/.+") source_group("src\\widgets\\tabwidget" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/widgets/tabwidget/.+") source_group("src\\window" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/window/.+") +source_group("src\\systemdialogs" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/systemdialogs/.+") source_group("include" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zwidget/.+") source_group("include\\core" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zwidget/core/.+") source_group("include\\widgets" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zwidget/widgets/.+") @@ -116,6 +123,7 @@ source_group("include\\widgets\\tabwidget" REGULAR_EXPRESSION "${CMAKE_CURRENT_S source_group("include\\window" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zwidget/window/.+") source_group("include\\window\\win32" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zwidget/window/win32/.+") source_group("include\\window\\sdl2" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zwidget/window/sdl2/.+") +source_group("include\\systemdialogs" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zwidget/systemdialogs/.+") include_directories(include include/zwidget src) diff --git a/libraries/ZWidget/include/zwidget/core/widget.h b/libraries/ZWidget/include/zwidget/core/widget.h index 02e87729c..43f9094b4 100644 --- a/libraries/ZWidget/include/zwidget/core/widget.h +++ b/libraries/ZWidget/include/zwidget/core/widget.h @@ -129,6 +129,8 @@ public: static Size GetScreenSize(); + void* GetNativeHandle(); + protected: virtual void OnPaintFrame(Canvas* canvas); virtual void OnPaint(Canvas* canvas) { } diff --git a/libraries/ZWidget/include/zwidget/systemdialogs/folder_browse_dialog.h b/libraries/ZWidget/include/zwidget/systemdialogs/folder_browse_dialog.h new file mode 100644 index 000000000..991869a5a --- /dev/null +++ b/libraries/ZWidget/include/zwidget/systemdialogs/folder_browse_dialog.h @@ -0,0 +1,30 @@ + +#pragma once + +#include +#include + +class Widget; + +/// \brief Displays the system folder browsing dialog +class BrowseFolderDialog +{ +public: + /// \brief Constructs an browse folder dialog. + static std::unique_ptr Create(Widget*owner); + + virtual ~BrowseFolderDialog() = default; + + /// \brief Get the full path of the directory selected. + virtual std::string SelectedPath() const = 0; + + /// \brief Sets the initial directory that is displayed. + virtual void SetInitialDirectory(const std::string& path) = 0; + + /// \brief Sets the text that appears in the title bar. + virtual void SetTitle(const std::string& title) = 0; + + /// \brief Shows the file dialog. + /// \return true if the user clicks the OK button of the dialog that is displayed, false otherwise. + virtual bool Show() = 0; +}; diff --git a/libraries/ZWidget/include/zwidget/systemdialogs/open_file_dialog.h b/libraries/ZWidget/include/zwidget/systemdialogs/open_file_dialog.h new file mode 100644 index 000000000..29ede966e --- /dev/null +++ b/libraries/ZWidget/include/zwidget/systemdialogs/open_file_dialog.h @@ -0,0 +1,55 @@ + +#pragma once + +#include +#include +#include + +class Widget; + +/// \brief Displays the system open file dialog. +class OpenFileDialog +{ +public: + /// \brief Constructs an open file dialog. + static std::unique_ptr Create(Widget* owner); + + virtual ~OpenFileDialog() = default; + + /// \brief Get the full path of the file selected. + /// + /// If multiple files are selected, this returns the first file. + virtual std::string Filename() const = 0; + + /// \brief Gets an array that contains one file name for each selected file. + virtual std::vector Filenames() const = 0; + + /// \brief Sets if multiple files can be selected or not. + /// \param multiselect = When true, multiple items can be selected. + virtual void SetMultiSelect(bool multiselect) = 0; + + /// \brief Sets a string containing the full path of the file selected. + virtual void SetFilename(const std::string &filename) = 0; + + /// \brief Sets the default extension to use. + virtual void SetDefaultExtension(const std::string& extension) = 0; + + /// \brief Add a filter that determines what types of files are displayed. + virtual void AddFilter(const std::string &filter_description, const std::string &filter_extension) = 0; + + /// \brief Clears all filters. + virtual void ClearFilters() = 0; + + /// \brief Sets a default filter, on a 0-based index. + virtual void SetFilterIndex(int filter_index) = 0; + + /// \brief Sets the initial directory that is displayed. + virtual void SetInitialDirectory(const std::string &path) = 0; + + /// \brief Sets the text that appears in the title bar. + virtual void SetTitle(const std::string &title) = 0; + + /// \brief Shows the file dialog. + /// \return true if the user clicks the OK button of the dialog that is displayed, false otherwise. + virtual bool Show() = 0; +}; diff --git a/libraries/ZWidget/include/zwidget/systemdialogs/save_file_dialog.h b/libraries/ZWidget/include/zwidget/systemdialogs/save_file_dialog.h new file mode 100644 index 000000000..ce10a127f --- /dev/null +++ b/libraries/ZWidget/include/zwidget/systemdialogs/save_file_dialog.h @@ -0,0 +1,46 @@ + +#pragma once + +#include +#include +#include + +class Widget; + +/// \brief Displays the system save file dialog. +class SaveFileDialog +{ +public: + /// \brief Constructs a save file dialog. + static std::unique_ptr Create(Widget *owner); + + virtual ~SaveFileDialog() = default; + + /// \brief Get the full path of the file selected. + virtual std::string Filename() const = 0; + + /// \brief Sets a string containing the full path of the file selected. + virtual void SetFilename(const std::string &filename) = 0; + + /// \brief Sets the default extension to use. + virtual void SetDefaultExtension(const std::string& extension) = 0; + + /// \brief Add a filter that determines what types of files are displayed. + virtual void AddFilter(const std::string &filter_description, const std::string &filter_extension) = 0; + + /// \brief Clears all filters. + virtual void ClearFilters() = 0; + + /// \brief Sets a default filter, on a 0-based index. + virtual void SetFilterIndex(int filter_index) = 0; + + /// \brief Sets the initial directory that is displayed. + virtual void SetInitialDirectory(const std::string &path) = 0; + + /// \brief Sets the text that appears in the title bar. + virtual void SetTitle(const std::string &title) = 0; + + /// \brief Shows the file dialog. + /// \return true if the user clicks the OK button of the dialog that is displayed, false otherwise. + virtual bool Show() = 0; +}; diff --git a/libraries/ZWidget/include/zwidget/window/window.h b/libraries/ZWidget/include/zwidget/window/window.h index 2c9a413b9..8515f5004 100644 --- a/libraries/ZWidget/include/zwidget/window/window.h +++ b/libraries/ZWidget/include/zwidget/window/window.h @@ -165,4 +165,6 @@ public: virtual std::string GetClipboardText() = 0; virtual void SetClipboardText(const std::string& text) = 0; + + virtual void* GetNativeHandle() = 0; }; diff --git a/libraries/ZWidget/src/core/widget.cpp b/libraries/ZWidget/src/core/widget.cpp index e27fff171..299857cfc 100644 --- a/libraries/ZWidget/src/core/widget.cpp +++ b/libraries/ZWidget/src/core/widget.cpp @@ -733,6 +733,12 @@ Size Widget::GetScreenSize() return DisplayWindow::GetScreenSize(); } +void* Widget::GetNativeHandle() +{ + Widget* w = Window(); + return w ? w->DispWindow->GetNativeHandle() : nullptr; +} + void Widget::SetStyleClass(const std::string& themeClass) { if (StyleClass != themeClass) diff --git a/libraries/ZWidget/src/systemdialogs/folder_browse_dialog.cpp b/libraries/ZWidget/src/systemdialogs/folder_browse_dialog.cpp new file mode 100644 index 000000000..754e397e2 --- /dev/null +++ b/libraries/ZWidget/src/systemdialogs/folder_browse_dialog.cpp @@ -0,0 +1,188 @@ + +#include "systemdialogs/folder_browse_dialog.h" +#include "core/widget.h" +#include "window/window.h" +#include + +#if defined(WIN32) +#include + +namespace +{ + static std::string from_utf16(const std::wstring& str) + { + if (str.empty()) return {}; + int needed = WideCharToMultiByte(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0, nullptr, nullptr); + if (needed == 0) + throw std::runtime_error("WideCharToMultiByte failed"); + std::string result; + result.resize(needed); + needed = WideCharToMultiByte(CP_UTF8, 0, str.data(), (int)str.size(), &result[0], (int)result.size(), nullptr, nullptr); + if (needed == 0) + throw std::runtime_error("WideCharToMultiByte failed"); + return result; + } + + static std::wstring to_utf16(const std::string& str) + { + if (str.empty()) return {}; + int needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0); + if (needed == 0) + throw std::runtime_error("MultiByteToWideChar failed"); + std::wstring result; + result.resize(needed); + needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), &result[0], (int)result.size()); + if (needed == 0) + throw std::runtime_error("MultiByteToWideChar failed"); + return result; + } + + template + class ComPtr + { + public: + ComPtr() { Ptr = nullptr; } + ComPtr(const ComPtr& other) { Ptr = other.Ptr; if (Ptr) Ptr->AddRef(); } + ComPtr(ComPtr&& move) { Ptr = move.Ptr; move.Ptr = nullptr; } + ~ComPtr() { reset(); } + ComPtr& operator=(const ComPtr& other) { if (this != &other) { if (Ptr) Ptr->Release(); Ptr = other.Ptr; if (Ptr) Ptr->AddRef(); } return *this; } + void reset() { if (Ptr) Ptr->Release(); Ptr = nullptr; } + T* get() { return Ptr; } + static IID GetIID() { return __uuidof(T); } + void** InitPtr() { return (void**)TypedInitPtr(); } + T** TypedInitPtr() { reset(); return &Ptr; } + operator T* () const { return Ptr; } + T* operator ->() const { return Ptr; } + T* Ptr; + }; +} + +class BrowseFolderDialogImpl : public BrowseFolderDialog +{ +public: + BrowseFolderDialogImpl(Widget *owner) : owner(owner) + { + } + + Widget *owner = nullptr; + + std::string selected_path; + std::string initial_directory; + std::string title; + + bool Show() override + { + std::wstring title16 = to_utf16(title); + std::wstring initial_directory16 = to_utf16(initial_directory); + + HRESULT result; + ComPtr open_dialog; + + result = CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_ALL, open_dialog.GetIID(), open_dialog.InitPtr()); + throw_if_failed(result, "CoCreateInstance(FileOpenDialog) failed"); + + result = open_dialog->SetTitle(title16.c_str()); + throw_if_failed(result, "IFileOpenDialog.SetTitle failed"); + + result = open_dialog->SetOptions(FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); + throw_if_failed(result, "IFileOpenDialog.SetOptions((FOS_PICKFOLDERS) failed"); + + if (initial_directory16.length() > 0) + { + LPITEMIDLIST item_id_list = nullptr; + SFGAOF flags = 0; + result = SHParseDisplayName(initial_directory16.c_str(), nullptr, &item_id_list, SFGAO_FILESYSTEM, &flags); + throw_if_failed(result, "SHParseDisplayName failed"); + + ComPtr folder_item; + result = SHCreateShellItem(nullptr, nullptr, item_id_list, folder_item.TypedInitPtr()); + ILFree(item_id_list); + throw_if_failed(result, "SHCreateItemFromParsingName failed"); + + /* This code requires Windows Vista or newer: + ComPtr folder_item; + result = SHCreateItemFromParsingName(initial_directory16.c_str(), nullptr, folder_item.GetIID(), folder_item.InitPtr()); + throw_if_failed(result, "SHCreateItemFromParsingName failed"); + */ + + if (folder_item) + { + result = open_dialog->SetFolder(folder_item); + throw_if_failed(result, "IFileOpenDialog.SetFolder failed"); + } + } + + if (owner && owner->Window()) + result = open_dialog->Show((HWND)owner->Window()->GetNativeHandle()); + else + result = open_dialog->Show(0); + + if (SUCCEEDED(result)) + { + ComPtr chosen_folder; + result = open_dialog->GetResult(chosen_folder.TypedInitPtr()); + throw_if_failed(result, "IFileOpenDialog.GetResult failed"); + + WCHAR *buffer = nullptr; + result = chosen_folder->GetDisplayName(SIGDN_FILESYSPATH, &buffer); + throw_if_failed(result, "IShellItem.GetDisplayName failed"); + + std::wstring output_directory16; + if (buffer) + { + try + { + output_directory16 = buffer; + } + catch (...) + { + CoTaskMemFree(buffer); + throw; + } + } + + CoTaskMemFree(buffer); + selected_path = from_utf16(output_directory16); + return true; + } + else + { + return false; + } + } + + std::string BrowseFolderDialog::SelectedPath() const override + { + return selected_path; + } + + void BrowseFolderDialog::SetInitialDirectory(const std::string& path) override + { + initial_directory = path; + } + + void BrowseFolderDialog::SetTitle(const std::string& newtitle) override + { + title = newtitle; + } + + void throw_if_failed(HRESULT result, const std::string &error) + { + if (FAILED(result)) + throw std::runtime_error(error); + } +}; + +std::unique_ptr BrowseFolderDialog::Create(Widget* owner) +{ + return std::make_unique(owner); +} + +#else + +std::unique_ptr BrowseFolderDialog::Create(Widget* owner) +{ + return {}; +} + +#endif diff --git a/libraries/ZWidget/src/systemdialogs/open_file_dialog.cpp b/libraries/ZWidget/src/systemdialogs/open_file_dialog.cpp new file mode 100644 index 000000000..ca7bc8f30 --- /dev/null +++ b/libraries/ZWidget/src/systemdialogs/open_file_dialog.cpp @@ -0,0 +1,286 @@ + +#include "systemdialogs/open_file_dialog.h" +#include "core/widget.h" +#include "window/window.h" +#include + +#if defined(WIN32) +#include + +namespace +{ + static std::string from_utf16(const std::wstring& str) + { + if (str.empty()) return {}; + int needed = WideCharToMultiByte(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0, nullptr, nullptr); + if (needed == 0) + throw std::runtime_error("WideCharToMultiByte failed"); + std::string result; + result.resize(needed); + needed = WideCharToMultiByte(CP_UTF8, 0, str.data(), (int)str.size(), &result[0], (int)result.size(), nullptr, nullptr); + if (needed == 0) + throw std::runtime_error("WideCharToMultiByte failed"); + return result; + } + + static std::wstring to_utf16(const std::string& str) + { + if (str.empty()) return {}; + int needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0); + if (needed == 0) + throw std::runtime_error("MultiByteToWideChar failed"); + std::wstring result; + result.resize(needed); + needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), &result[0], (int)result.size()); + if (needed == 0) + throw std::runtime_error("MultiByteToWideChar failed"); + return result; + } + + template + class ComPtr + { + public: + ComPtr() { Ptr = nullptr; } + ComPtr(const ComPtr& other) { Ptr = other.Ptr; if (Ptr) Ptr->AddRef(); } + ComPtr(ComPtr&& move) { Ptr = move.Ptr; move.Ptr = nullptr; } + ~ComPtr() { reset(); } + ComPtr& operator=(const ComPtr& other) { if (this != &other) { if (Ptr) Ptr->Release(); Ptr = other.Ptr; if (Ptr) Ptr->AddRef(); } return *this; } + void reset() { if (Ptr) Ptr->Release(); Ptr = nullptr; } + T* get() { return Ptr; } + static IID GetIID() { return __uuidof(T); } + void** InitPtr() { return (void**)TypedInitPtr(); } + T** TypedInitPtr() { reset(); return &Ptr; } + operator T* () const { return Ptr; } + T* operator ->() const { return Ptr; } + T* Ptr; + }; +} + +class OpenFileDialogImpl : public OpenFileDialog +{ +public: + OpenFileDialogImpl(Widget* owner) : owner(owner) + { + } + + Widget* owner = nullptr; + + std::string initial_directory; + std::string initial_filename; + std::string title; + std::vector filenames; + bool multi_select = false; + + struct Filter + { + std::string description; + std::string extension; + }; + std::vector filters; + int filterindex = 0; + std::string defaultext; + + bool Show() override + { + std::wstring title16 = to_utf16(title); + std::wstring initial_directory16 = to_utf16(initial_directory); + + HRESULT result; + ComPtr open_dialog; + + result = CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_ALL, open_dialog.GetIID(), open_dialog.InitPtr()); + throw_if_failed(result, "CoCreateInstance(FileOpenDialog) failed"); + + result = open_dialog->SetTitle(title16.c_str()); + throw_if_failed(result, "IFileOpenDialog.SetTitle failed"); + + if (!initial_filename.empty()) + { + result = open_dialog->SetFileName(to_utf16(initial_filename).c_str()); + throw_if_failed(result, "IFileOpenDialog.SetFileName failed"); + } + + FILEOPENDIALOGOPTIONS options = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST; + if (multi_select) + options |= FOS_ALLOWMULTISELECT; + result = open_dialog->SetOptions(options); + throw_if_failed(result, "IFileOpenDialog.SetOptions() failed"); + + if (!filters.empty()) + { + std::vector filterspecs(filters.size()); + std::vector descriptions(filters.size()); + std::vector extensions(filters.size()); + for (size_t i = 0; i < filters.size(); i++) + { + descriptions[i] = to_utf16(filters[i].description); + extensions[i] = to_utf16(filters[i].extension); + COMDLG_FILTERSPEC& spec = filterspecs[i]; + spec.pszName = descriptions[i].c_str(); + spec.pszSpec = extensions[i].c_str(); + } + result = open_dialog->SetFileTypes((UINT)filterspecs.size(), filterspecs.data()); + throw_if_failed(result, "IFileOpenDialog.SetFileTypes() failed"); + + if ((size_t)filterindex < filters.size()) + { + result = open_dialog->SetFileTypeIndex(filterindex); + throw_if_failed(result, "IFileOpenDialog.SetFileTypeIndex() failed"); + } + } + + if (!defaultext.empty()) + { + result = open_dialog->SetDefaultExtension(to_utf16(defaultext).c_str()); + throw_if_failed(result, "IFileOpenDialog.SetDefaultExtension() failed"); + } + + if (initial_directory16.length() > 0) + { + LPITEMIDLIST item_id_list = nullptr; + SFGAOF flags = 0; + result = SHParseDisplayName(initial_directory16.c_str(), nullptr, &item_id_list, SFGAO_FILESYSTEM, &flags); + throw_if_failed(result, "SHParseDisplayName failed"); + + ComPtr folder_item; + result = SHCreateShellItem(nullptr, nullptr, item_id_list, folder_item.TypedInitPtr()); + ILFree(item_id_list); + throw_if_failed(result, "SHCreateItemFromParsingName failed"); + + /* This code requires Windows Vista or newer: + ComPtr folder_item; + result = SHCreateItemFromParsingName(initial_directory16.c_str(), nullptr, folder_item.GetIID(), folder_item.InitPtr()); + throw_if_failed(result, "SHCreateItemFromParsingName failed"); + */ + + if (folder_item) + { + result = open_dialog->SetFolder(folder_item); + throw_if_failed(result, "IFileOpenDialog.SetFolder failed"); + } + } + + if (owner && owner->Window()) + result = open_dialog->Show((HWND)owner->Window()->GetNativeHandle()); + else + result = open_dialog->Show(0); + + if (SUCCEEDED(result)) + { + ComPtr items; + result = open_dialog->GetSelectedItems(items.TypedInitPtr()); + throw_if_failed(result, "IFileOpenDialog.GetSelectedItems failed"); + + DWORD num_items = 0; + result = items->GetCount(&num_items); + throw_if_failed(result, "IShellItemArray.GetCount failed"); + + for (DWORD i = 0; i < num_items; i++) + { + ComPtr item; + result = items->GetItemAt(i, item.TypedInitPtr()); + throw_if_failed(result, "IShellItemArray.GetItemAt failed"); + + WCHAR* buffer = nullptr; + result = item->GetDisplayName(SIGDN_FILESYSPATH, &buffer); + throw_if_failed(result, "IShellItem.GetDisplayName failed"); + + std::wstring output16; + if (buffer) + { + try + { + output16 = buffer; + } + catch (...) + { + CoTaskMemFree(buffer); + throw; + } + } + + CoTaskMemFree(buffer); + filenames.push_back(from_utf16(output16)); + } + return true; + } + else + { + return false; + } + } + + std::string Filename() const override + { + return !filenames.empty() ? filenames.front() : std::string(); + } + + std::vector Filenames() const override + { + return filenames; + } + + void SetMultiSelect(bool new_multi_select) override + { + multi_select = new_multi_select; + } + + void SetFilename(const std::string& filename) override + { + initial_filename = filename; + } + + void AddFilter(const std::string& filter_description, const std::string& filter_extension) override + { + Filter f; + f.description = filter_description; + f.extension = filter_extension; + filters.push_back(std::move(f)); + } + + void ClearFilters() override + { + filters.clear(); + } + + void SetFilterIndex(int filter_index) override + { + filterindex = filter_index; + } + + void SetInitialDirectory(const std::string& path) override + { + initial_directory = path; + } + + void SetTitle(const std::string& newtitle) override + { + title = newtitle; + } + + void SetDefaultExtension(const std::string& extension) override + { + defaultext = extension; + } + + void throw_if_failed(HRESULT result, const std::string& error) + { + if (FAILED(result)) + throw std::runtime_error(error); + } +}; + +std::unique_ptr OpenFileDialog::Create(Widget* owner) +{ + return std::make_unique(owner); +} + +#else + +std::unique_ptr OpenFileDialog::Create(Widget* owner) +{ + return {}; +} + +#endif diff --git a/libraries/ZWidget/src/systemdialogs/save_file_dialog.cpp b/libraries/ZWidget/src/systemdialogs/save_file_dialog.cpp new file mode 100644 index 000000000..7bd8c00cd --- /dev/null +++ b/libraries/ZWidget/src/systemdialogs/save_file_dialog.cpp @@ -0,0 +1,263 @@ + +#include "systemdialogs/save_file_dialog.h" +#include "core/widget.h" +#include "window/window.h" +#include + +#if defined(WIN32) +#include + +namespace +{ + static std::string from_utf16(const std::wstring& str) + { + if (str.empty()) return {}; + int needed = WideCharToMultiByte(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0, nullptr, nullptr); + if (needed == 0) + throw std::runtime_error("WideCharToMultiByte failed"); + std::string result; + result.resize(needed); + needed = WideCharToMultiByte(CP_UTF8, 0, str.data(), (int)str.size(), &result[0], (int)result.size(), nullptr, nullptr); + if (needed == 0) + throw std::runtime_error("WideCharToMultiByte failed"); + return result; + } + + static std::wstring to_utf16(const std::string& str) + { + if (str.empty()) return {}; + int needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), nullptr, 0); + if (needed == 0) + throw std::runtime_error("MultiByteToWideChar failed"); + std::wstring result; + result.resize(needed); + needed = MultiByteToWideChar(CP_UTF8, 0, str.data(), (int)str.size(), &result[0], (int)result.size()); + if (needed == 0) + throw std::runtime_error("MultiByteToWideChar failed"); + return result; + } + + template + class ComPtr + { + public: + ComPtr() { Ptr = nullptr; } + ComPtr(const ComPtr& other) { Ptr = other.Ptr; if (Ptr) Ptr->AddRef(); } + ComPtr(ComPtr&& move) { Ptr = move.Ptr; move.Ptr = nullptr; } + ~ComPtr() { reset(); } + ComPtr& operator=(const ComPtr& other) { if (this != &other) { if (Ptr) Ptr->Release(); Ptr = other.Ptr; if (Ptr) Ptr->AddRef(); } return *this; } + void reset() { if (Ptr) Ptr->Release(); Ptr = nullptr; } + T* get() { return Ptr; } + static IID GetIID() { return __uuidof(T); } + void** InitPtr() { return (void**)TypedInitPtr(); } + T** TypedInitPtr() { reset(); return &Ptr; } + operator T* () const { return Ptr; } + T* operator ->() const { return Ptr; } + T* Ptr; + }; +} + +class SaveFileDialogImpl : public SaveFileDialog +{ +public: + SaveFileDialogImpl(Widget* owner) : owner(owner) + { + } + + Widget* owner = nullptr; + + std::string filename; + std::string initial_directory; + std::string initial_filename; + std::string title; + std::vector filenames; + + struct Filter + { + std::string description; + std::string extension; + }; + std::vector filters; + int filterindex = 0; + std::string defaultext; + + bool Show() override + { + std::wstring title16 = to_utf16(title); + std::wstring initial_directory16 = to_utf16(initial_directory); + + HRESULT result; + ComPtr save_dialog; + + result = CoCreateInstance(CLSID_FileSaveDialog, nullptr, CLSCTX_ALL, save_dialog.GetIID(), save_dialog.InitPtr()); + throw_if_failed(result, "CoCreateInstance(FileSaveDialog) failed"); + + result = save_dialog->SetTitle(title16.c_str()); + throw_if_failed(result, "IFileSaveDialog.SetTitle failed"); + + if (!initial_filename.empty()) + { + result = save_dialog->SetFileName(to_utf16(initial_filename).c_str()); + throw_if_failed(result, "IFileSaveDialog.SetFileName failed"); + } + + FILEOPENDIALOGOPTIONS options = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST; + result = save_dialog->SetOptions(options); + throw_if_failed(result, "IFileSaveDialog.SetOptions() failed"); + + if (!filters.empty()) + { + std::vector filterspecs(filters.size()); + std::vector descriptions(filters.size()); + std::vector extensions(filters.size()); + for (size_t i = 0; i < filters.size(); i++) + { + descriptions[i] = to_utf16(filters[i].description); + extensions[i] = to_utf16(filters[i].extension); + COMDLG_FILTERSPEC& spec = filterspecs[i]; + spec.pszName = descriptions[i].c_str(); + spec.pszSpec = extensions[i].c_str(); + } + result = save_dialog->SetFileTypes((UINT)filterspecs.size(), filterspecs.data()); + throw_if_failed(result, "IFileOpenDialog.SetFileTypes() failed"); + + if ((size_t)filterindex < filters.size()) + { + result = save_dialog->SetFileTypeIndex(filterindex); + throw_if_failed(result, "IFileOpenDialog.SetFileTypeIndex() failed"); + } + } + + if (!defaultext.empty()) + { + result = save_dialog->SetDefaultExtension(to_utf16(defaultext).c_str()); + throw_if_failed(result, "IFileOpenDialog.SetDefaultExtension() failed"); + } + + if (initial_directory16.length() > 0) + { + LPITEMIDLIST item_id_list = nullptr; + SFGAOF flags = 0; + result = SHParseDisplayName(initial_directory16.c_str(), nullptr, &item_id_list, SFGAO_FILESYSTEM, &flags); + throw_if_failed(result, "SHParseDisplayName failed"); + + ComPtr folder_item; + result = SHCreateShellItem(nullptr, nullptr, item_id_list, folder_item.TypedInitPtr()); + ILFree(item_id_list); + throw_if_failed(result, "SHCreateItemFromParsingName failed"); + + /* This code requires Windows Vista or newer: + ComPtr folder_item; + result = SHCreateItemFromParsingName(initial_directory16.c_str(), nullptr, folder_item.GetIID(), folder_item.InitPtr()); + throw_if_failed(result, "SHCreateItemFromParsingName failed"); + */ + + if (folder_item) + { + result = save_dialog->SetFolder(folder_item); + throw_if_failed(result, "IFileSaveDialog.SetFolder failed"); + } + } + + if (owner && owner->Window()) + result = save_dialog->Show((HWND)owner->Window()->GetNativeHandle()); + else + result = save_dialog->Show(0); + + if (SUCCEEDED(result)) + { + ComPtr chosen_folder; + result = save_dialog->GetResult(chosen_folder.TypedInitPtr()); + throw_if_failed(result, "IFileSaveDialog.GetResult failed"); + + WCHAR* buffer = nullptr; + result = chosen_folder->GetDisplayName(SIGDN_FILESYSPATH, &buffer); + throw_if_failed(result, "IShellItem.GetDisplayName failed"); + + std::wstring output16; + if (buffer) + { + try + { + output16 = buffer; + } + catch (...) + { + CoTaskMemFree(buffer); + throw; + } + } + + CoTaskMemFree(buffer); + filename = from_utf16(output16); + return true; + } + else + { + return false; + } + } + + std::string Filename() const override + { + return filename; + } + + void SetFilename(const std::string& filename) override + { + initial_filename = filename; + } + + void AddFilter(const std::string& filter_description, const std::string& filter_extension) override + { + Filter f; + f.description = filter_description; + f.extension = filter_extension; + filters.push_back(std::move(f)); + } + + void ClearFilters() override + { + filters.clear(); + } + + void SetFilterIndex(int filter_index) override + { + filterindex = filter_index; + } + + void SetInitialDirectory(const std::string& path) override + { + initial_directory = path; + } + + void SetTitle(const std::string& newtitle) override + { + title = newtitle; + } + + void SetDefaultExtension(const std::string& extension) override + { + defaultext = extension; + } + + void throw_if_failed(HRESULT result, const std::string& error) + { + if (FAILED(result)) + throw std::runtime_error(error); + } +}; + +std::unique_ptr SaveFileDialog::Create(Widget* owner) +{ + return std::make_unique(owner); +} + +#else + +std::unique_ptr SaveFileDialog::Create(Widget* owner) +{ + return {}; +} + +#endif diff --git a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp index 38b928f95..2905604af 100644 --- a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp +++ b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp @@ -1,4 +1,4 @@ - +#include #include "widgets/lineedit/lineedit.h" #include "core/utf8reader.h" #include "core/colorf.h" diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 98988cd0b..f80fe86c0 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -286,11 +286,10 @@ void SDL2DisplayWindow::RunLoop() while (!ExitRunLoop) { - SDL_Event event; + SDL_Event event = {}; int result = SDL_WaitEvent(&event); - if (result == 0) - throw std::runtime_error(std::string("SDL_WaitEvent failed:") + SDL_GetError()); - DispatchEvent(event); + if (result == 1) + DispatchEvent(event); // Silently ignore if it fails and pray it doesn't busy loop, because SDL and Linux utterly sucks! } } diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h index cb5c37219..ca0a61f0e 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h @@ -45,6 +45,8 @@ public: std::string GetClipboardText() override; void SetClipboardText(const std::string& text) override; + void* GetNativeHandle() override { return WindowHandle; } + static void DispatchEvent(const SDL_Event& event); static SDL2DisplayWindow* FindEventWindow(const SDL_Event& event); diff --git a/libraries/ZWidget/src/window/win32/win32displaywindow.cpp b/libraries/ZWidget/src/window/win32/win32displaywindow.cpp index c703a39b7..2bf0acff5 100644 --- a/libraries/ZWidget/src/window/win32/win32displaywindow.cpp +++ b/libraries/ZWidget/src/window/win32/win32displaywindow.cpp @@ -128,8 +128,6 @@ void Win32DisplayWindow::SetWindowFrame(const Rect& box) void Win32DisplayWindow::SetClientFrame(const Rect& box) { - // This function is currently unused but needs to be disabled because it contains Windows API calls that were only added in Windows 10. -#if 0 double dpiscale = GetDpiScale(); RECT rect = {}; @@ -143,7 +141,6 @@ void Win32DisplayWindow::SetClientFrame(const Rect& box) AdjustWindowRectExForDpi(&rect, style, FALSE, exstyle, GetDpiForWindow(WindowHandle)); SetWindowPos(WindowHandle, nullptr, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOACTIVATE | SWP_NOZORDER); -#endif } void Win32DisplayWindow::Show() @@ -271,22 +268,9 @@ int Win32DisplayWindow::GetPixelHeight() const return box.bottom; } -typedef UINT(WINAPI* GetDpiForWindow_t)(HWND); double Win32DisplayWindow::GetDpiScale() const { - static GetDpiForWindow_t pGetDpiForWindow = nullptr; - static bool done = false; - if (!done) - { - HMODULE hMod = GetModuleHandleA("User32.dll"); - if (hMod != nullptr) pGetDpiForWindow = reinterpret_cast(GetProcAddress(hMod, "GetDpiForWindow")); - done = true; - } - - if (pGetDpiForWindow) - return pGetDpiForWindow(WindowHandle) / 96.0; - else - return 1.0; + return GetDpiForWindow(WindowHandle) / 96.0; } std::string Win32DisplayWindow::GetClipboardText() diff --git a/libraries/ZWidget/src/window/win32/win32displaywindow.h b/libraries/ZWidget/src/window/win32/win32displaywindow.h index fd7ae3eae..8aa00e42a 100644 --- a/libraries/ZWidget/src/window/win32/win32displaywindow.h +++ b/libraries/ZWidget/src/window/win32/win32displaywindow.h @@ -55,6 +55,8 @@ public: Point GetLParamPos(LPARAM lparam) const; + void* GetNativeHandle() override { return reinterpret_cast(WindowHandle); } + static void ProcessEvents(); static void RunLoop(); static void ExitLoop(); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8d935e723..b313c1faa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -408,19 +408,14 @@ set( PLAT_WIN32_SOURCES common/platform/win32/st_start.cpp common/platform/win32/base_sysfb.cpp common/platform/win32/win32basevideo.cpp + common/platform/win32/i_crash.cpp ) if (HAVE_VULKAN) list (APPEND PLAT_WIN32_SOURCES common/platform/win32/win32vulkanvideo.cpp ) endif() -# todo: implement an actual crash catcher for ARM -# for now this is purely experimental -if (NOT ${TARGET_ARCHITECTURE} MATCHES "arm" ) - set (PLAT_WIN32_SOURCES ${PLAT_WIN32_SOURCES} common/platform/win32/i_crash.cpp ) -endif() if (MSVC AND ${TARGET_ARCHITECTURE} MATCHES "arm") - set (PLAT_WIN32_SOURCES ${PLAT_WIN32_SOURCES} common/platform/win32/i_crash_arm.cpp ) add_definitions( -DNO_SSE -D__ARM__ -DRAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN) endif() diff --git a/src/common/platform/win32/i_crash.cpp b/src/common/platform/win32/i_crash.cpp index 7bb6a83b4..e8f77cc76 100644 --- a/src/common/platform/win32/i_crash.cpp +++ b/src/common/platform/win32/i_crash.cpp @@ -1,2291 +1,406 @@ /* -** i_crash.cpp -** Gathers exception information when the program crashes. +** Windows Crash Reporter +** Copyright (c) 2024 Magnus Norddahl ** -**--------------------------------------------------------------------------- -** Copyright 2002-2006 Randy Heit -** All rights reserved. +** This software is provided 'as-is', without any express or implied +** warranty. In no event will the authors be held liable for any damages +** arising from the use of this software. ** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.s -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- +** Permission is granted to anyone to use this software for any purpose, +** including commercial applications, and to alter it and redistribute it +** freely, subject to the following restrictions: ** +** 1. The origin of this software must not be misrepresented; you must not +** claim that you wrote the original software. If you use this software +** in a product, an acknowledgment in the product documentation would be +** appreciated but is not required. +** 2. Altered source versions must be plainly marked as such, and must not be +** misrepresented as being the original software. +** 3. This notice may not be removed or altered from any source distribution. */ -// HEADER FILES ------------------------------------------------------------ - -#pragma warning(disable:4996) #define WIN32_LEAN_AND_MEAN #include -#include -#include -#ifndef _M_IX86 -#include -#endif -#ifndef __GNUC__ -#if _MSC_VER -#pragma warning(disable:4091) // this silences a warning for a bogus definition in the Windows 8.1 SDK. -#endif -#include -#if _MSC_VER -#pragma warning(default:4091) -#endif -#endif -#include -#include -#include -#include - -#include -#include -#include "resource.h" -#include "version.h" -#include "m_swap.h" -#include "basics.h" -#include "zstring.h" -#include "printf.h" -#include "cmdlib.h" +#include +#include +#include +#include #include "i_mainwindow.h" -#include -#include +#ifdef _MSC_VER +#include +#include -// MACROS ------------------------------------------------------------------ - -// Maximum number of files that might appear in a crash report. -#define MAX_FILES 5 - -#define ZIP_LOCALFILE MAKE_ID('P','K',3,4) -#define ZIP_CENTRALFILE MAKE_ID('P','K',1,2) -#define ZIP_ENDOFDIR MAKE_ID('P','K',5,6) - -// DBGHELP.H --------------------------------------------------------------- - -// w32api does not include dbghelp.h, so if I don't include these here, -// a person using GCC will need to download the Platform SDK, grab dbghelp.h -// from it, and edit it so it works with GCC. -#ifdef __GNUC__ -typedef enum _MINIDUMP_TYPE +class CrashReporter { - MiniDumpNormal - // Other types omitted. -} MINIDUMP_TYPE; +public: + CrashReporter(const std::wstring& reports_directory, const std::wstring& uploader_executable = std::wstring()); + ~CrashReporter(); -typedef struct _MINIDUMP_EXCEPTION_INFORMATION { - DWORD ThreadId; - PEXCEPTION_POINTERS ExceptionPointers; - BOOL ClientPointers; -} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; + static void hook_thread(); + static void invoke(); + static void generate_report(); -typedef struct _MINIDUMP_USER_STREAM_INFORMATION { - ULONG UserStreamCount; - void *UserStreamArray; // Not really void * -} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION; +private: + struct DumpParams + { + HANDLE hprocess; + HANDLE hthread; + int thread_id; + PEXCEPTION_POINTERS exception_pointers; + unsigned int exception_code; + }; -typedef BOOL (WINAPI * MINIDUMP_CALLBACK_ROUTINE) ( - IN PVOID CallbackParam, - IN CONST void *CallbackInput, // Not really void * - IN OUT void *CallbackOutput // Not really void * - ); + void load_dbg_help(); + static void create_dump(DumpParams* params, bool launch_uploader); + static std::wstring reports_directory; + static std::wstring uploader_exe; -typedef struct _MINIDUMP_CALLBACK_INFORMATION { - MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; - PVOID CallbackParam; -} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION; + static std::recursive_mutex mutex; + + static DWORD WINAPI create_dump_main(LPVOID thread_parameter); + + static int generate_report_filter(unsigned int code, struct _EXCEPTION_POINTERS* ep); + static void on_terminate(); + static void on_sigabort(int); + static void on_se_unhandled_exception(unsigned int exception_code, PEXCEPTION_POINTERS exception_pointers); + static LONG WINAPI on_win32_unhandled_exception(PEXCEPTION_POINTERS exception_pointers); + + typedef BOOL(WINAPI* MiniDumpWriteDumpPointer)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, CONST PMINIDUMP_EXCEPTION_INFORMATION, CONST PMINIDUMP_USER_STREAM_INFORMATION, CONST PMINIDUMP_CALLBACK_INFORMATION); + HMODULE module_dbghlp; + static MiniDumpWriteDumpPointer func_MiniDumpWriteDump; + + bool enforce_filter(bool enforce); + bool write_memory(BYTE* target, const BYTE* source, DWORD size); +#if defined(_M_X64) + static const BYTE patch_bytes[6]; + BYTE original_bytes[6]; +#elif defined(_M_IX86) + static const BYTE patch_bytes[5]; + BYTE original_bytes[5]; #endif +}; -// Dbghelp.dll is loaded at runtime so we don't create any needless -// dependencies on it. -typedef BOOL (WINAPI *THREADWALK) (HANDLE, LPTHREADENTRY32); -typedef BOOL (WINAPI *MODULEWALK) (HANDLE, LPMODULEENTRY32); -typedef HANDLE (WINAPI *CREATESNAPSHOT) (DWORD, DWORD); -typedef BOOL (WINAPI *WRITEDUMP) (HANDLE, DWORD, HANDLE, int, - PMINIDUMP_EXCEPTION_INFORMATION, - PMINIDUMP_USER_STREAM_INFORMATION, - PMINIDUMP_CALLBACK_INFORMATION); - -// TYPES ------------------------------------------------------------------- - -#ifdef _M_X64 -typedef PRUNTIME_FUNCTION (WINAPI *RTLLOOKUPFUNCTIONENTRY) - (ULONG64 ControlPc, PULONG64 ImageBase, void *HistoryTable); -#endif - -// Damn Microsoft for doing Get/SetWindowLongPtr half-assed. Instead of -// giving them proper prototypes under Win32, they are just macros for -// Get/SetWindowLong, meaning they take LONGs and not LONG_PTRs. -#ifdef _WIN64 -typedef LONG_PTR WLONG_PTR; #else -typedef LONG WLONG_PTR; + +class CrashReporter +{ +public: + CrashReporter(const std::wstring& reports_directory, const std::wstring& uploader_executable = std::wstring()) { } + + static void hook_thread() {} + static void invoke() { } + static void generate_report() { } +}; + #endif -namespace zip +void InitCrashReporter(const std::wstring& reports_directory, const std::wstring& uploader_executable) { -#pragma pack(push,1) - struct LocalFileHeader - { - uint32_t Magic; // 0 - uint8_t VersionToExtract[2]; // 4 - uint16_t Flags; // 6 - uint16_t Method; // 8 - uint16_t ModTime; // 10 - uint16_t ModDate; // 12 - uint32_t CRC32; // 14 - uint32_t CompressedSize; // 18 - uint32_t UncompressedSize; // 22 - uint16_t NameLength; // 26 - uint16_t ExtraLength; // 28 - }; - - struct CentralDirectoryEntry - { - uint32_t Magic; - uint8_t VersionMadeBy[2]; - uint8_t VersionToExtract[2]; - uint16_t Flags; - uint16_t Method; - uint16_t ModTime; - uint16_t ModDate; - uint32_t CRC32; - uint32_t CompressedSize; - uint32_t UncompressedSize; - uint16_t NameLength; - uint16_t ExtraLength; - uint16_t CommentLength; - uint16_t StartingDiskNumber; - uint16_t InternalAttributes; - uint32_t ExternalAttributes; - uint32_t LocalHeaderOffset; - }; - - struct EndOfCentralDirectory - { - uint32_t Magic; - uint16_t DiskNumber; - uint16_t FirstDisk; - uint16_t NumEntries; - uint16_t NumEntriesOnAllDisks; - uint32_t DirectorySize; - uint32_t DirectoryOffset; - uint16_t ZipCommentLength; - }; -#pragma pack(pop) + static CrashReporter reporter(reports_directory, uploader_executable); } -struct TarFile +void CrashReporterHookThread() { - HANDLE File; - const char *Filename; - int ZipOffset; - uint32_t UncompressedSize; - uint32_t CompressedSize; - uint32_t CRC32; - bool Deflated; -}; + CrashReporter::hook_thread(); +} -struct MiniDumpThreadData +void InvokeCrashReporter() { - HANDLE File; - WRITEDUMP pMiniDumpWriteDump; - MINIDUMP_EXCEPTION_INFORMATION *Exceptor; -}; + CrashReporter::invoke(); +} -// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- +#ifdef _MSC_VER -// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- +#pragma warning(disable: 4535) // warning C4535: calling _set_se_translator() requires /EHa -static void AddFile (HANDLE file, const char *filename); -static void CloseTarFiles (); -static HANDLE MakeZip (); -static void AddZipFile (HANDLE ziphandle, TarFile *whichfile, short dosdate, short dostime); -static HANDLE CreateTempFile (); +std::wstring CrashReporter::reports_directory; +std::wstring CrashReporter::uploader_exe; +CrashReporter::MiniDumpWriteDumpPointer CrashReporter::func_MiniDumpWriteDump = 0; +std::recursive_mutex CrashReporter::mutex; -static void DumpBytes (HANDLE file, uint8_t *address); -static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code, CONTEXT *ctxt); -static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt); -static void AddToolHelp (HANDLE file); - -static HANDLE WriteTextReport (); -static DWORD WINAPI WriteMiniDumpInAnotherThread (LPVOID lpParam); - -static INT_PTR CALLBACK DetailsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); -static void SetEditControl (HWND control, HWND sizedisplay, int filenum); - -static BOOL UploadReport (HANDLE report, bool gziped); - -// EXTERNAL DATA DECLARATIONS ---------------------------------------------- - -extern HINSTANCE g_hInst; - -// PUBLIC DATA DEFINITIONS ------------------------------------------------- - -EXCEPTION_POINTERS CrashPointers; - -// PRIVATE DATA DEFINITIONS ------------------------------------------------ - -static HRESULT (__stdcall *pEnableThemeDialogTexture) (HWND hwnd, DWORD dwFlags); - -static TarFile TarFiles[MAX_FILES]; - -static int NumFiles; - -static HANDLE DbgProcess; -static DWORD DbgProcessID; -static DWORD DbgThreadID; -static DWORD CrashCode; -static PVOID CrashAddress; -static bool NeedDbgHelp; -static char CrashSummary[256]; - -static WNDPROC StdStaticProc; - -// CODE -------------------------------------------------------------------- - -//========================================================================== -// -// SafeReadMemory -// -// Returns true if the memory was succussfully read and false if not. -// -//========================================================================== - -static bool SafeReadMemory (const void *base, void *buffer, size_t len) +CrashReporter::CrashReporter(const std::wstring& new_reports_directory, const std::wstring& new_uploader_executable) { -#ifdef __GNUC__ - // GCC version: Test the memory beforehand and hope it doesn't become - // unreadable while we read it. GCC is the only Windows compiler (that - // I know of) that can't do SEH. + reports_directory = new_reports_directory; + if (!reports_directory.empty() && (reports_directory.back() != L'/' && reports_directory.back() != L'\\')) + reports_directory.push_back(L'\\'); + uploader_exe = new_uploader_executable; + load_dbg_help(); + SetUnhandledExceptionFilter(&CrashReporter::on_win32_unhandled_exception); + enforce_filter(true); // Prevent anyone else from changing the unhandled exception filter + hook_thread(); +} - if (IsBadReadPtr (base, len)) - { - return false; - } - memcpy (buffer, base, len); - return true; -#else - // Non-GCC version: Use SEH to catch any bad reads immediately when - // they happen instead of trying to catch them beforehand. +CrashReporter::~CrashReporter() +{ +} - bool success = false; +void CrashReporter::invoke() +{ +#ifdef _DEBUG + DebugBreak(); // Bring up the debugger if it is running +#endif + Sleep(1000); // Give any possibly logging functionality a little time before we die + RaiseException(EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_NONCONTINUABLE_EXCEPTION, 0, 0); +} +void CrashReporter::generate_report() +{ __try { - memcpy (buffer, base, len); - success = true; + RaiseException(EXCEPTION_BREAKPOINT, EXCEPTION_BREAKPOINT, 0, 0); } - __except(EXCEPTION_EXECUTE_HANDLER) + __except (generate_report_filter(GetExceptionCode(), GetExceptionInformation())) { } - return success; -#endif -} - -//========================================================================== -// -// GetTopOfStack -// -// Given a pointer to some address on the stack, returns a pointer to -// the top of the stack. -// -//========================================================================== - -DWORD *GetTopOfStack (void *top) -{ - MEMORY_BASIC_INFORMATION memInfo; - - if (VirtualQuery (top, &memInfo, sizeof(memInfo))) - { - return (DWORD *)((uint8_t *)memInfo.BaseAddress + memInfo.RegionSize); - } - else - { - return NULL; - } } -//========================================================================== -// -// WriteMyMiniDump -// -// Writes a minidump if dbghelp.dll is present and adds it to the tarball. -// Otherwise, it just returns INVALID_HANDLE_VALUE. -// -//========================================================================== - -static HANDLE WriteMyMiniDump (void) +void CrashReporter::create_dump(DumpParams* dump_params, bool launch_uploader) { - MINIDUMP_EXCEPTION_INFORMATION exceptor = { DbgThreadID, &CrashPointers, FALSE }; - WCHAR dbghelpPath[MAX_PATH+12], *bs; - WRITEDUMP pMiniDumpWriteDump; + SYSTEMTIME systime; + GetLocalTime(&systime); + HANDLE file = INVALID_HANDLE_VALUE; - BOOL good = FALSE; - HMODULE dbghelp = NULL; - - // Make sure dbghelp.dll and MiniDumpWriteDump are available - // Try loading from the application directory first, then from the search path. - GetModuleFileNameW (NULL, dbghelpPath, MAX_PATH); - dbghelpPath[MAX_PATH] = 0; - bs = wcsrchr (dbghelpPath, '\\'); - if (bs != NULL) + WCHAR minidump_filename[1024]; + int counter; + for (counter = 1; counter < 1000; counter++) { - wcscpy (bs + 1, L"dbghelp.dll"); - dbghelp = LoadLibraryW (dbghelpPath); - } - if (dbghelp == NULL) - { - dbghelp = LoadLibraryA ("dbghelp.dll"); - if (dbghelp == NULL) - { - NeedDbgHelp = true; - return INVALID_HANDLE_VALUE; - } - } - pMiniDumpWriteDump = (WRITEDUMP)GetProcAddress (dbghelp, "MiniDumpWriteDump"); - if (pMiniDumpWriteDump != NULL) - { - file = CreateTempFile (); + swprintf_s(minidump_filename, L"%s%04d-%02d-%02d %02d.%02d.%02d (%d).dmp", reports_directory.c_str(), systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, systime.wSecond, counter); + file = CreateFile(minidump_filename, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); if (file != INVALID_HANDLE_VALUE) - { - if (CrashPointers.ExceptionRecord->ExceptionCode != EXCEPTION_STACK_OVERFLOW) - { - good = pMiniDumpWriteDump (DbgProcess, DbgProcessID, file, -#if 1 - MiniDumpNormal -#else - MiniDumpWithDataSegs|MiniDumpWithIndirectlyReferencedMemory|MiniDumpWithPrivateReadWriteMemory -#endif - , &exceptor, NULL, NULL); - } - else - { - MiniDumpThreadData dumpdata = { file, pMiniDumpWriteDump, &exceptor }; - DWORD id; - HANDLE thread = CreateThread (NULL, 0, WriteMiniDumpInAnotherThread, &dumpdata, 0, &id); - if (thread != nullptr) - { - WaitForSingleObject(thread, INFINITE); - if (GetExitCodeThread(thread, &id)) - { - good = id; - } - } - } - } + break; } - else - { - NeedDbgHelp = true; - } - return good ? file : INVALID_HANDLE_VALUE; -} + if (file == INVALID_HANDLE_VALUE) + return; -//========================================================================== -// -// WriteMiniDumpInAnotherThread -// -// When a stack overflow occurs, there isn't enough room left on the stack -// for MiniDumpWriteDump to do its thing, so we create a new thread with -// a new stack to do the work. -// -//========================================================================== + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = dump_params->thread_id; + info.ExceptionPointers = dump_params->exception_pointers; + info.ClientPointers = 0; + MINIDUMP_TYPE type = static_cast( + MiniDumpWithHandleData | + MiniDumpWithProcessThreadData | + MiniDumpWithFullMemoryInfo | + MiniDumpWithThreadInfo); + func_MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, type, &info, 0, 0); + CloseHandle(file); -static DWORD WINAPI WriteMiniDumpInAnotherThread (LPVOID lpParam) -{ - MiniDumpThreadData *dumpdata = (MiniDumpThreadData *)lpParam; - return dumpdata->pMiniDumpWriteDump (DbgProcess, DbgProcessID, - dumpdata->File, MiniDumpNormal, dumpdata->Exceptor, NULL, NULL); -} + WCHAR log_filename[1024]; + swprintf_s(log_filename, L"%s%04d-%02d-%02d %02d.%02d.%02d (%d).log", reports_directory.c_str(), systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, systime.wSecond, counter); -//========================================================================== -// -// Writef -// -// Like printf, but for Win32 file HANDLEs. -// -//========================================================================== - -void Writef (HANDLE file, const char *format, ...) -{ - char buffer[1024]; - va_list args; - DWORD len; - - va_start (args, format); - len = myvsnprintf (buffer, sizeof buffer, format, args); - va_end (args); - WriteFile (file, buffer, len, &len, NULL); -} - -//========================================================================== -// -// WriteLogFileStreamer -// -// The callback function to stream a Rich Edit's contents to a file. -// -//========================================================================== - - -//========================================================================== -// -// WriteLogFile -// -// Writes the contents of a Rich Edit control to a file. -// -//========================================================================== - -HANDLE WriteLogFile() -{ - HANDLE file; - - file = CreateTempFile(); - if (file != INVALID_HANDLE_VALUE) - { - auto writeFile = [&](const void* data, uint32_t size, uint32_t& written) -> bool + file = CreateFile(log_filename, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) + return; + auto writeFile = [&](const void* data, uint32_t size, uint32_t& written) -> bool { DWORD tmp = 0; BOOL result = WriteFile(file, data, size, &tmp, nullptr); written = tmp; return result == TRUE; }; - mainwindow.GetLog(writeFile); + mainwindow.GetLog(writeFile); + CloseHandle(file); + + if (launch_uploader && !uploader_exe.empty()) + { + WCHAR commandline[3 * 1024]; + swprintf_s(commandline, L"modulename -showcrashreport \"%s\" \"%s\"", minidump_filename, log_filename); + + STARTUPINFO startup_info = {}; + PROCESS_INFORMATION process_info = {}; + startup_info.cb = sizeof(STARTUPINFO); + if (CreateProcess(uploader_exe.c_str(), commandline, 0, 0, FALSE, CREATE_SUSPENDED, 0, 0, &startup_info, &process_info)) + { + // We need to allow the process to become the foreground window. Otherwise the error dialog while show up behind other apps + AllowSetForegroundWindow(process_info.dwProcessId); + ResumeThread(process_info.hThread); + + CloseHandle(process_info.hThread); + CloseHandle(process_info.hProcess); + + Sleep(1000); // Give process one second to show the foreground window before we exit + } } - return file; } -//========================================================================== -// -// CreateCrashLog -// -// Creates all the files needed for a crash report. -// -//========================================================================== - -void CreateCrashLog (const char *custominfo, DWORD customsize) +int CrashReporter::generate_report_filter(unsigned int code, struct _EXCEPTION_POINTERS* ep) { - // Do not collect information more than once. - if (NumFiles != 0) - { + DumpParams dump_params; + dump_params.hprocess = GetCurrentProcess(); + dump_params.hthread = GetCurrentThread(); + dump_params.thread_id = GetCurrentThreadId(); + dump_params.exception_pointers = ep; + dump_params.exception_code = code; + create_dump(&dump_params, false); + return EXCEPTION_EXECUTE_HANDLER; +} + +void CrashReporter::load_dbg_help() +{ + module_dbghlp = LoadLibrary(L"dbghelp.dll"); + if (module_dbghlp == 0) return; - } - - DbgThreadID = GetCurrentThreadId(); - DbgProcessID = GetCurrentProcessId(); - DbgProcess = GetCurrentProcess(); - - CrashCode = CrashPointers.ExceptionRecord->ExceptionCode; - CrashAddress = CrashPointers.ExceptionRecord->ExceptionAddress; - - AddFile (WriteTextReport(), "report.txt"); - AddFile (WriteMyMiniDump(), "minidump.mdmp"); - - // Copy app-specific information out of the crashing process's memory - // and into a new temporary file. - if (customsize != 0) - { - HANDLE file = CreateTempFile(); - DWORD wrote; - - if (file != INVALID_HANDLE_VALUE) - { - uint8_t buffer[512]; - DWORD left; - - for (;; customsize -= left, custominfo += left) - { - left = customsize > 512 ? 512 : customsize; - if (left == 0) - { - break; - } - if (SafeReadMemory (custominfo, buffer, left)) - { - WriteFile (file, buffer, left, &wrote, NULL); - } - else - { - Writef (file, "Failed reading remaining %lu bytes\r\n", customsize); - break; - } - } - AddFile (file, "local.txt"); - } - } - AddFile (WriteLogFile(), "log.rtf"); - CloseHandle (DbgProcess); + func_MiniDumpWriteDump = reinterpret_cast(GetProcAddress(module_dbghlp, "MiniDumpWriteDump")); } -//========================================================================== -// -// WriteTextReport -// -// This is the classic plain-text report ZDoom has generated since it -// added crash gathering abilities in 2002. -// -//========================================================================== - -HANDLE WriteTextReport () +void CrashReporter::hook_thread() { - HANDLE file; - - static const struct - { - DWORD Code; const char *Text; - } - exceptions[] = - { - { EXCEPTION_ACCESS_VIOLATION, "Access Violation" }, - { EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "Array Bounds Exceeded" }, - { EXCEPTION_BREAKPOINT, "Breakpoint" }, - { EXCEPTION_DATATYPE_MISALIGNMENT, "Data Type Misalignment" }, - { EXCEPTION_FLT_DENORMAL_OPERAND, "Floating Point Denormal Operand." }, - { EXCEPTION_FLT_DIVIDE_BY_ZERO, "Floating Point Divide By Zero" }, - { EXCEPTION_FLT_INEXACT_RESULT, "Floating Point Inexact Result" }, - { EXCEPTION_FLT_INVALID_OPERATION, "Floating Point Invalid Operation" }, - { EXCEPTION_FLT_OVERFLOW, "Floating Point Overflow" }, - { EXCEPTION_FLT_STACK_CHECK, "Floating Point Stack Check" }, - { EXCEPTION_FLT_UNDERFLOW, "Floating Point Underflow" }, - { EXCEPTION_ILLEGAL_INSTRUCTION, "Illegal Instruction" }, - { EXCEPTION_IN_PAGE_ERROR, "In Page Error" }, - { EXCEPTION_INT_DIVIDE_BY_ZERO, "Integer Divide By Zero" }, - { EXCEPTION_INT_OVERFLOW, "Integer Overflow" }, - { EXCEPTION_INVALID_DISPOSITION, "Invalid Disposition" }, - { EXCEPTION_NONCONTINUABLE_EXCEPTION, "Noncontinuable Exception" }, - { EXCEPTION_PRIV_INSTRUCTION, "Priviledged Instruction" }, - { EXCEPTION_SINGLE_STEP, "Single Step" }, - { EXCEPTION_STACK_OVERFLOW, "Stack Overflow" } - }; - static const char eflagsBits[][2] = - { - { 'C','F' }, // Carry Flag - { 'x','1' }, // Always one - { 'P','F' }, // Parity Flag - { 'x','0' }, // Always zero - { 'A','F' }, // Auxilliary Carry Flag - { 'x','0' }, // Always zero - { 'Z','F' }, // Zero Flag - { 'S','F' }, // Sign Flag - { 'T','F' }, // Trap Flag - { 'I','F' }, // Interrupt Enable Flag - { 'D','F' }, // Direction Flag - { 'O','F' }, // Overflow Flag - { 'x','x' }, // IOPL low bit - { 'x','x' }, // IOPL high bit - { 'N','T' }, // Nested Task - { 'x','0' }, // Always zero - { 'R','F' }, // Resume Flag - { 'V','M' }, // Virtual-8086 Mode - { 'A','C' }, // Alignment Check - { 'V','I' }, // Virtual Interrupt Flag - { 'V','P' } // Virtual Interrupt Pending - }; - - - int i, j; - - file = CreateTempFile (); - if (file == INVALID_HANDLE_VALUE) - { - return file; - } - - OSVERSIONINFO verinfo = { sizeof(verinfo) }; - GetVersionEx (&verinfo); - - for (i = 0; (size_t)i < sizeof(exceptions)/sizeof(exceptions[0]); ++i) - { - if (exceptions[i].Code == CrashPointers.ExceptionRecord->ExceptionCode) - { - break; - } - } - j = mysnprintf (CrashSummary, countof(CrashSummary), "Code: %08lX", CrashPointers.ExceptionRecord->ExceptionCode); - if ((size_t)i < sizeof(exceptions)/sizeof(exceptions[0])) - { - j += mysnprintf (CrashSummary + j, countof(CrashSummary) - j, " (%s", exceptions[i].Text); - if (CrashPointers.ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) - { - // Pre-NT kernels do not seem to provide this information. - if (verinfo.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) - { - j += mysnprintf (CrashSummary + j, countof(CrashSummary) - j, - " - tried to %s address %p", - CrashPointers.ExceptionRecord->ExceptionInformation[0] ? "write" : "read", - (void *)CrashPointers.ExceptionRecord->ExceptionInformation[1]); - } - } - CrashSummary[j++] = ')'; - } - j += mysnprintf (CrashSummary + j, countof(CrashSummary) - j, "\r\nAddress: %p", CrashPointers.ExceptionRecord->ExceptionAddress); - Writef (file, "%s\r\nFlags: %08X\r\n\r\n", CrashSummary, CrashPointers.ExceptionRecord->ExceptionFlags); - - Writef (file, "Windows %s %d.%d Build %d %s\r\n\r\n", - verinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ? "9x" : "NT", - verinfo.dwMajorVersion, verinfo.dwMinorVersion, verinfo.dwBuildNumber, verinfo.szCSDVersion); - - CONTEXT *ctxt = CrashPointers.ContextRecord; - - if (ctxt->ContextFlags & CONTEXT_SEGMENTS) - { - Writef (file, "GS=%04x FS=%04x ES=%04x DS=%04x\r\n", - ctxt->SegGs, ctxt->SegFs, ctxt->SegEs, ctxt->SegDs); - } - - if (ctxt->ContextFlags & CONTEXT_INTEGER) - { -#ifndef _M_X64 - Writef (file, "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\r\nESI=%08x EDI=%08x\r\n", - ctxt->Eax, ctxt->Ebx, ctxt->Ecx, ctxt->Edx, ctxt->Esi, ctxt->Edi); -#else - Writef (file, "RAX=%016I64x RBX=%016I64x RCX=%016I64x\r\n" - "RDX=%016I64x RSI=%016I64x RDI=%016I64x\r\n" - "RBP=%016I64x R8=%016I64x R9=%016I64x\r\n" - "R10=%016I64x R11=%016I64x R12=%016I64x\r\n" - "R13=%016I64x R14=%016I64x R15=%016I64x\r\n", - ctxt->Rax, ctxt->Rbx, ctxt->Rcx, ctxt->Rdx, ctxt->Rsi, ctxt->Rdi, ctxt->Rbp, - ctxt->R8, ctxt->R9, ctxt->R10, ctxt->R11, ctxt->R12, ctxt->R13, ctxt->R14, ctxt->R15); -#endif - } - - if (ctxt->ContextFlags & CONTEXT_CONTROL) - { -#ifndef _M_X64 - Writef (file, "EBP=%08x EIP=%08x ESP=%08x CS=%04x SS=%04x\r\nEFlags=%08x\r\n", - ctxt->Ebp, ctxt->Eip, ctxt->Esp, ctxt->SegCs, ctxt->SegSs, ctxt->EFlags); -#else - Writef (file, "RIP=%016I64x RSP=%016I64x\r\nCS=%04x SS=%04x EFlags=%08x\r\n", - ctxt->Rip, ctxt->Rsp, ctxt->SegCs, ctxt->SegSs, ctxt->EFlags); -#endif - - DWORD dw; - - for (i = 0, dw = 1; (size_t)i < sizeof(eflagsBits)/sizeof(eflagsBits[0]); dw <<= 1, ++i) - { - if (eflagsBits[i][0] != 'x') - { - Writef (file, " %c%c%c", eflagsBits[i][0], eflagsBits[i][1], - ctxt->EFlags & dw ? '+' : '-'); - } - } - Writef (file, "\r\n"); - } - - if (ctxt->ContextFlags & CONTEXT_FLOATING_POINT) - { -#ifndef _M_X64 - Writef (file, - "\r\nFPU State:\r\n ControlWord=%04x StatusWord=%04x TagWord=%04x\r\n" - " ErrorOffset=%08x\r\n ErrorSelector=%08x\r\n DataOffset=%08x\r\n DataSelector=%08x\r\n" - // Cr0NpxState was renamed in recent Windows headers so better skip it here. Its meaning is unknown anyway. - //" Cr0NpxState=%08x\r\n" - "\r\n" - , - (uint16_t)ctxt->FloatSave.ControlWord, (uint16_t)ctxt->FloatSave.StatusWord, (uint16_t)ctxt->FloatSave.TagWord, - ctxt->FloatSave.ErrorOffset, ctxt->FloatSave.ErrorSelector, ctxt->FloatSave.DataOffset, - ctxt->FloatSave.DataSelector - //, ctxt->FloatSave.Cr0NpxState - ); - - for (i = 0; i < 8; ++i) - { - DWORD d0, d1; - memcpy(&d0, &ctxt->FloatSave.RegisterArea[20*i+4], sizeof(DWORD)); - memcpy(&d1, &ctxt->FloatSave.RegisterArea[20*i], sizeof(DWORD)); - Writef (file, "MM%d=%08x%08x\r\n", i, d0, d1); - } -#else - for (i = 0; i < 8; ++i) - { - Writef (file, "MM%d=%016I64x\r\n", i, ctxt->Legacy[i].Low); - } - for (i = 0; i < 16; ++i) - { - Writef (file, "XMM%d=%016I64x%016I64x\r\n", i, ctxt->FltSave.XmmRegisters[i].High, ctxt->FltSave.XmmRegisters[i].Low); - } -#endif - } - - AddToolHelp (file); - -#ifdef _M_IX86 - Writef (file, "\r\nBytes near EIP:"); -#else - Writef (file, "\r\nBytes near RIP:"); -#endif - DumpBytes (file, (uint8_t *)CrashPointers.ExceptionRecord->ExceptionAddress-16); - - if (ctxt->ContextFlags & CONTEXT_CONTROL) - { -#ifndef _M_X64 - AddStackInfo (file, (void *)(size_t)CrashPointers.ContextRecord->Esp, - CrashPointers.ExceptionRecord->ExceptionCode, ctxt); -#else - AddStackInfo (file, (void *)CrashPointers.ContextRecord->Rsp, - CrashPointers.ExceptionRecord->ExceptionCode, ctxt); -#endif - } - - return file; + set_terminate(&CrashReporter::on_terminate); + _set_abort_behavior(0, _CALL_REPORTFAULT | _WRITE_ABORT_MSG); + signal(SIGABRT, &CrashReporter::on_sigabort); + _set_se_translator(&CrashReporter::on_se_unhandled_exception); } -//========================================================================== -// -// AddToolHelp -// -// Adds the information supplied by the tool help functions to the text -// report. This includes the list of threads for this process and the -// loaded modules. -// -//========================================================================== - -static void AddToolHelp (HANDLE file) +void CrashReporter::on_terminate() { - HMODULE kernel = GetModuleHandleA ("kernel32.dll"); - if (kernel == NULL) - return; - - CREATESNAPSHOT pCreateToolhelp32Snapshot; - THREADWALK pThread32First; - THREADWALK pThread32Next; - MODULEWALK pModule32First; - MODULEWALK pModule32Next; - - pCreateToolhelp32Snapshot = (CREATESNAPSHOT)GetProcAddress (kernel, "CreateToolhelp32Snapshot"); - pThread32First = (THREADWALK)GetProcAddress (kernel, "Thread32First"); - pThread32Next = (THREADWALK)GetProcAddress (kernel, "Thread32Next"); - pModule32First = (MODULEWALK)GetProcAddress (kernel, "Module32FirstW"); - pModule32Next = (MODULEWALK)GetProcAddress (kernel, "Module32NextW"); - - if (!(pCreateToolhelp32Snapshot && pThread32First && pThread32Next && - pModule32First && pModule32Next)) - { - Writef (file, "\r\nTool Help unavailable\r\n"); - return; - } - - HANDLE snapshot = pCreateToolhelp32Snapshot (TH32CS_SNAPMODULE|TH32CS_SNAPTHREAD, 0); - if (snapshot == INVALID_HANDLE_VALUE) - { - Writef (file, "\r\nTool Help snapshot unavailable\r\n"); - return; - } - - THREADENTRY32 thread = { sizeof(thread) }; - - Writef (file, "\r\nRunning threads:\r\n"); - - if (pThread32First (snapshot, &thread)) - { - do - { - if (thread.th32OwnerProcessID == DbgProcessID) - { - Writef (file, "%08x", thread.th32ThreadID); - - if (thread.th32ThreadID == DbgThreadID) - { - Writef (file, " at %p*", CrashAddress); - } - Writef (file, "\r\n"); - } - } while (pThread32Next (snapshot, &thread)); - } - - MODULEENTRY32 module = { sizeof(module) }; - - Writef (file, "\r\nLoaded modules:\r\n"); - - if (pModule32First (snapshot, &module)) - { - do - { - auto amod = FString(module.szModule); - Writef (file, "%p - %p %c%s\r\n", - module.modBaseAddr, module.modBaseAddr + module.modBaseSize - 1, - module.modBaseAddr <= CrashPointers.ExceptionRecord->ExceptionAddress && - module.modBaseAddr + module.modBaseSize > CrashPointers.ExceptionRecord->ExceptionAddress - ? '*' : ' ', - amod.GetChars()); - } while (pModule32Next (snapshot, &module)); - } - - CloseHandle (snapshot); + invoke(); } -//========================================================================== -// -// AddStackInfo -// -// Writes a stack dump to the text report. -// -//========================================================================== - -static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code, CONTEXT *ctxt) +void CrashReporter::on_sigabort(int) { - DWORD *addr = (DWORD *)dumpaddress, *jump; - DWORD *topOfStack = GetTopOfStack (dumpaddress); - uint8_t peekb; -#ifdef _M_IX86 - DWORD peekd; -#else - uint64_t peekq; -#endif - - jump = topOfStack; - if (code == EXCEPTION_STACK_OVERFLOW) - { - // If the stack overflowed, only dump the first and last 16KB of it. - if (topOfStack - addr > 32768/4) - { - jump = addr + 16384/4; - } - } - - StackWalk (file, dumpaddress, topOfStack, jump, ctxt); - - Writef (file, "\r\nStack Contents:\r\n"); - DWORD *scan; - for (scan = addr; scan < topOfStack; scan += 4) - { - int i; - ptrdiff_t max; - - if (scan == jump) - { - scan = topOfStack - 16384/4; - Writef (file, "\r\n . . . Snip . . .\r\n\r\n"); - } - - Writef (file, "%p:", scan); -#ifdef _M_IX86 - if (topOfStack - scan < 4) - { - max = topOfStack - scan; - } - else - { - max = 4; - } - - for (i = 0; i < max; ++i) - { - if (!SafeReadMemory (&scan[i], &peekd, 4)) - { - break; - } - Writef (file, " %08x", peekd); - } - for (; i < 4; ++i) - { - Writef (file, " "); - } -#else - if ((uint64_t *)topOfStack - (uint64_t *)scan < 2) - { - max = (uint64_t *)topOfStack - (uint64_t *)scan; - } - else - { - max = 2; - } - - for (i = 0; i < max; ++i) - { - if (!SafeReadMemory (&scan[i], &peekq, 8)) - { - break; - } - Writef (file, " %016x", peekq); - } - if (i < 2) - { - Writef (file, " "); - } -#endif - Writef (file, " "); - for (i = 0; i < int(max*sizeof(void*)); ++i) - { - if (!SafeReadMemory ((uint8_t *)scan + i, &peekb, 1)) - { - break; - } - Writef (file, "%c", peekb >= 0x20 && peekb <= 0x7f ? peekb : '\xb7'); - } - Writef (file, "\r\n"); - } + invoke(); } -#ifdef _M_IX86 - -//========================================================================== -// -// StackWalk -// Win32 version -// -// Lists a possible call trace for the crashing thread to the text report. -// This is not very specific and just lists any pointers into the -// main executable region, whether they are part of the real trace or not. -// -//========================================================================== - -static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt) +void CrashReporter::on_se_unhandled_exception(unsigned int exception_code, PEXCEPTION_POINTERS exception_pointers) { - DWORD *addr = (DWORD *)dumpaddress; + // Ignore those bloody breakpoints! + if (exception_code == EXCEPTION_BREAKPOINT) return; - uint8_t *pBaseOfImage = (uint8_t *)GetModuleHandle (0); - IMAGE_OPTIONAL_HEADER *pHeader = (IMAGE_OPTIONAL_HEADER *)(pBaseOfImage + - ((IMAGE_DOS_HEADER*)pBaseOfImage)->e_lfanew + - sizeof(IMAGE_NT_SIGNATURE) + sizeof(IMAGE_FILE_HEADER)); + DumpParams dump_params; + dump_params.hprocess = GetCurrentProcess(); + dump_params.hthread = GetCurrentThread(); + dump_params.thread_id = GetCurrentThreadId(); + dump_params.exception_pointers = exception_pointers; + dump_params.exception_code = exception_code; - DWORD_PTR codeStart = (DWORD_PTR)pBaseOfImage + pHeader->BaseOfCode; - DWORD_PTR codeEnd = codeStart + pHeader->SizeOfCode; + // Ensure we only get a dump of the first thread crashing - let other threads block here. + std::unique_lock mutex_lock(mutex); - Writef (file, "\r\nPossible call trace:\r\n %08x BOOM", CrashAddress); - for (DWORD *scan = addr; scan < topOfStack; ++scan) - { - if (scan == jump) - { - scan = topOfStack - 16384/4; - Writef (file, "\r\n\r\n . . . . Snip . . . .\r\n"); - } - - DWORD_PTR code; - - if (SafeReadMemory (scan, &code, sizeof(code)) && - code >= codeStart && code < codeEnd) - { - static const char regNames[][4] = - { - "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi" - }; - - // Check if address is after a call statement. Print what was called if it is. - const uint8_t *bytep = (uint8_t *)code; - uint8_t peekb; - -#define chkbyte(x,m,v) (SafeReadMemory(x, &peekb, 1) && ((peekb & m) == v)) - - if (chkbyte(bytep - 5, 0xFF, 0xE8) || chkbyte(bytep - 5, 0xFF, 0xE9)) - { - DWORD peekd; - if (SafeReadMemory (bytep - 4, &peekd, 4)) - { - DWORD_PTR jumpaddr = peekd + code; - Writef (file, "\r\n %p %s %p", code - 5, - peekb == 0xE9 ? "jmp " : "call", jumpaddr); - if (chkbyte((LPCVOID)jumpaddr, 0xFF, 0xE9) && - SafeReadMemory ((LPCVOID)(jumpaddr + 1), &peekd, 4)) - { - Writef (file," => jmp %p", peekd + jumpaddr + 5); - } - } - else - { - Writef (file, "\r\n %p %s ????????", code - 5, - peekb == 0xE9 ? "jmp " : "call"); - } - } - else if (chkbyte(bytep - 2, 0xFF, 0xFF) && chkbyte(bytep - 1, 0xF7, 0xD0)) - { - Writef (file, "\r\n %p call %s", code - 2, regNames[peekb & 7]); - } - else - { - int i; - - for (i = 2; i < 7; ++i) - { - if (chkbyte(bytep - i, 0xFF, 0xFF) && chkbyte(bytep - i + 1, 070, 020)) - { - break; - } - } - if (i >= 7) - { - Writef (file, "\r\n %08x", code); - } - else - { - int mod, rm, basereg = -1, indexreg = -1; - int scale = 1, offset = 0; - - Writef (file, "\r\n %08x", bytep - i); - bytep -= i - 1; - SafeReadMemory (bytep, &peekb, 1); - mod = peekb >> 6; - rm = peekb & 7; - bytep++; - - if (mod == 0 && rm == 5) - { - mod = 2; - } - else if (rm == 4) - { - int index, base; - - SafeReadMemory (bytep, &peekb, 1); - scale = 1 << (peekb >> 6); - index = (peekb >> 3) & 7; - base = peekb & 7; - bytep++; - - if (index != 4) - { - indexreg = index; - } - if (base != 5) - { - basereg = base; - } - else - { - if (mod == 0) - { - mod = 2; - } - else - { - basereg = 5; - } - } - } - else - { - basereg = rm; - } - - if (mod == 1) - { - signed char miniofs; - SafeReadMemory (bytep++, &miniofs, 1); - offset = miniofs; - } - else - { - SafeReadMemory (bytep, &offset, 4); - bytep += 4; - } - if ((DWORD_PTR)bytep == code) - { - Writef (file, " call [", bytep - i + 1); - if (basereg >= 0) - { - Writef (file, "%s", regNames[basereg]); - } - if (indexreg >= 0) - { - Writef (file, "%s%s", basereg >= 0 ? "+" : "", regNames[indexreg]); - if (scale > 1) - { - Writef (file, "*%d", scale); - } - } - if (offset != 0) - { - if (indexreg < 0 && basereg < 0) - { - Writef (file, "%08x", offset); - } - else - { - char sign; - if (offset < 0) - { - sign = '-'; - offset = -offset; - } - else - { - sign = '+'; - } - Writef (file, "%c0x%x", sign, offset); - } - } - Writef (file, "]"); - } - } - } - } - } - Writef (file, "\r\n"); + // Create dump in separate thread: + DWORD threadId; + HANDLE hThread = CreateThread(0, 0, &CrashReporter::create_dump_main, &dump_params, 0, &threadId); + if (hThread != 0) + WaitForSingleObject(hThread, INFINITE); + TerminateProcess(GetCurrentProcess(), 255); } -#else - -//========================================================================== -// -// StackWalk -// Win64 version -// -// Walks the stack for the crashing thread and dumps the trace to the text -// report. Unlike the Win32 version, Win64 provides facilities for -// doing a 100% exact walk. -// -// See http://www.nynaeve.net/?p=113 for more information, and -// http://www.nynaeve.net/Code/StackWalk64.cpp in particular. -// -//========================================================================== - -static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt) +LONG CrashReporter::on_win32_unhandled_exception(PEXCEPTION_POINTERS exception_pointers) { - RTLLOOKUPFUNCTIONENTRY RtlLookupFunctionEntry; - HMODULE kernel; - CONTEXT context; - KNONVOLATILE_CONTEXT_POINTERS nv_context; - PRUNTIME_FUNCTION function; - PVOID handler_data; - ULONG64 establisher_frame; - ULONG64 image_base; + DumpParams dump_params; + dump_params.hprocess = GetCurrentProcess(); + dump_params.hthread = GetCurrentThread(); + dump_params.thread_id = GetCurrentThreadId(); + dump_params.exception_pointers = exception_pointers; + dump_params.exception_code = 0; - Writef (file, "\r\nCall trace:\r\n rip=%p <- Here it dies.\r\n", CrashAddress); + // Ensure we only get a dump of the first thread crashing - let other threads block here. + std::unique_lock mutex_lock(mutex); - kernel = GetModuleHandleA("kernel32.dll"); - if (kernel == NULL || NULL == (RtlLookupFunctionEntry = - (RTLLOOKUPFUNCTIONENTRY)GetProcAddress(kernel, "RtlLookupFunctionEntry"))) - { - Writef (file, " Unavailable: Could not get address of RtlLookupFunctionEntry\r\n"); - return; - } - // Get the caller's context - context = *ctxt; - - // This unwind loop intentionally skips the first call frame, as it - // shall correspond to the call to StackTrace64, which we aren't - // interested in. - - for (ULONG frame = 0; ; ++frame) - { - // Try to look up unwind metadata for the current function. - function = RtlLookupFunctionEntry(context.Rip, &image_base, NULL); - memset(&nv_context, 0, sizeof(nv_context)); - if (function == NULL) - { - // If we don't have a RUNTIME_FUNCTION, then we've encountered - // a leaf function. Adjust the stack appropriately. - context.Rip = (ULONG64)(*(PULONG64)context.Rsp); - context.Rsp += 8; - Writef(file, " Leaf function\r\n\r\n"); - } - else - { - // Note that there is not a one-to-one correspondance between - // runtime functions and source functions. One source function - // may be broken into multiple runtime functions. This loop walks - // backward from the current runtime function for however many - // consecutive runtime functions precede it. There is a slight - // chance that this will walk across different source functions. - // (Or maybe not, depending on whether or not the compiler - // guarantees that there will be empty space between functions; - // it looks like VC++ might.) In practice, this seems to work - // quite well for identifying the exact address to search for in - // a map file to determine the function name. - - PRUNTIME_FUNCTION function2 = function; - ULONG64 base = image_base; - - while (function2 != NULL) - { - Writef(file, " Function range: %p -> %p\r\n", - (void *)(base + function2->BeginAddress), - (void *)(base + function2->EndAddress)); - function2 = RtlLookupFunctionEntry(base + function2->BeginAddress - 1, &base, NULL); - } - Writef(file, "\r\n"); - - // Use RtlVirtualUnwind to execute the unwind for us. - RtlVirtualUnwind(0/*UNW_FLAG_NHANDLER*/, image_base, context.Rip, - function, &context, &handler_data, &establisher_frame, - &nv_context); - } - // If we reach a RIP of zero, this means we've walked off the end of - // the call stack and are done. - if (context.Rip == 0) - { - break; - } - - // Display the context. Note that we don't bother showing the XMM - // context, although we have the nonvolatile portion of it. - Writef(file, " FRAME %02d:\r\n rip=%p rsp=%p rbp=%p\r\n", - frame, context.Rip, context.Rsp, context.Rbp); - Writef(file, " r12=%p r13=%p r14=%p\r\n" - " rdi=%p rsi=%p rbx=%p\r\n", - context.R12, context.R13, context.R14, - context.Rdi, context.Rsi, context.Rbx); - - static const char reg_names[16][4] = - { - "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" - }; - - // If we have stack-based register stores, then display them here. - for (int i = 0; i < 16; ++i) - { - if (nv_context.IntegerContext[i]) - { - Writef(file, " -> '%s' saved on stack at %p (=> %p)\r\n", - reg_names[i], nv_context.IntegerContext[i], *nv_context.IntegerContext[i]); - } - } - } + // Create minidump in seperate thread: + DWORD threadId; + HANDLE hThread = CreateThread(0, 0, &CrashReporter::create_dump_main, &dump_params, 0, &threadId); + if (hThread != 0) + WaitForSingleObject(hThread, INFINITE); + TerminateProcess(GetCurrentProcess(), 255); + return EXCEPTION_EXECUTE_HANDLER; } -#endif - -//========================================================================== -// -// DumpBytes -// -// Writes the bytes around EIP to the text report. -// -//========================================================================== - -static void DumpBytes (HANDLE file, uint8_t *address) +DWORD WINAPI CrashReporter::create_dump_main(LPVOID thread_parameter) { - char line[68*3], *line_p = line; - DWORD len; - uint8_t peek; - - for (int i = 0; i < 16*3; ++i) - { - if ((i & 15) == 0) - { - line_p += mysnprintf (line_p, countof(line) - (line_p - line), "\r\n%p:", address); - } - if (SafeReadMemory (address, &peek, 1)) - { - line_p += mysnprintf (line_p, countof(line) - (line_p - line), " %02x", *address); - } - else - { - line_p += mysnprintf (line_p, countof(line) - (line_p - line), " --"); - } - address++; - } - *line_p++ = '\r'; - *line_p++ = '\n'; - WriteFile (file, line, DWORD(line_p - line), &len, NULL); + create_dump(reinterpret_cast(thread_parameter), true); + TerminateProcess(GetCurrentProcess(), 255); + return 0; } -//========================================================================== -// -// CreateTempFile -// -// Creates a new temporary with read/write access. The file will be deleted -// automatically when it is closed. -// -//========================================================================== - -static HANDLE CreateTempFile () +bool CrashReporter::enforce_filter(bool bEnforce) { - WCHAR temppath[MAX_PATH-13]; - WCHAR tempname[MAX_PATH]; - if (!GetTempPathW (countof(temppath), temppath)) +#if defined(_M_X64) || defined(_M_IX86) + DWORD ErrCode = 0; + + HMODULE hLib = GetModuleHandle(L"kernel32.dll"); + if (hLib == 0) { - temppath[0] = '.'; - temppath[1] = '\0'; + ErrCode = GetLastError(); + return false; } - if (!GetTempFileNameW (temppath, L"zdo", 0, tempname)) + + BYTE* pTarget = (BYTE*)GetProcAddress(hLib, "SetUnhandledExceptionFilter"); + if (pTarget == 0) { - return INVALID_HANDLE_VALUE; + ErrCode = GetLastError(); + return false; } - return CreateFileW (tempname, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, - FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE|FILE_FLAG_SEQUENTIAL_SCAN, - NULL); -} -//========================================================================== -// -// AddFile -// -// Add another file to be written to the tar. -// -//========================================================================== - -static void AddFile (HANDLE file, const char *filename) -{ - if (NumFiles == MAX_FILES || file == INVALID_HANDLE_VALUE) + if (IsBadReadPtr(pTarget, sizeof(original_bytes))) { - return; + return false; } - TarFiles[NumFiles].File = file; - TarFiles[NumFiles].Filename = filename; - NumFiles++; -} -//========================================================================== -// -// CloseTarFiles -// -// Close all files that were previously registerd with AddFile(). They -// must still be open. -// -//========================================================================== - -static void CloseTarFiles () -{ - for (int i = 0; i < NumFiles; ++i) + if (bEnforce) { - CloseHandle (TarFiles[i].File); - } - NumFiles = 0; -} + // Save the original contents of SetUnhandledExceptionFilter + memcpy(original_bytes, pTarget, sizeof(original_bytes)); -//========================================================================== -// -// WriteBlock -// -// This is a wrapper around WriteFile. If stream is non-NULL, then the data -// is compressed before writing it to the file. outbuf must be 1024 bytes. -// -//========================================================================== - -static DWORD WriteBlock (HANDLE file, LPCVOID buffer, DWORD bytes, z_stream *stream, Bytef *outbuf) -{ - if (stream == NULL) - { - WriteFile (file, buffer, bytes, &bytes, NULL); - return bytes; + // Patch SetUnhandledExceptionFilter + if (!write_memory(pTarget, patch_bytes, sizeof(patch_bytes))) + return false; } else { - DWORD wrote = 0; - - stream->next_in = (Bytef *)buffer; - stream->avail_in = bytes; - - while (stream->avail_in != 0) - { - if (stream->avail_out == 0) - { - stream->next_out = outbuf; - stream->avail_out = 1024; - wrote += 1024; - WriteFile (file, outbuf, 1024, &bytes, NULL); - } - deflate (stream, Z_NO_FLUSH); - } - return wrote; + // Restore the original behavior of SetUnhandledExceptionFilter + if (!write_memory(pTarget, original_bytes, sizeof(original_bytes))) + return false; } -} - -//========================================================================== -// -// WriteZip -// -// Writes a .zip/pk3 file. A HANDLE to the file is returned. This file is -// delete-on-close. -// -// The archive contains all the files previously passed to AddFile(). They -// must still be open, because MakeZip() does not open them itself. -// -//========================================================================== - -static HANDLE MakeZip () -{ - zip::CentralDirectoryEntry central = { ZIP_CENTRALFILE, { 20, 0 }, { 20, 0 }, }; - zip::EndOfCentralDirectory dirend = { ZIP_ENDOFDIR, }; - short dosdate, dostime; - time_t now; - struct tm *nowtm; - int i, numfiles; - HANDLE file; - DWORD len; - uint32_t dirsize; - size_t namelen; - - if (NumFiles == 0) - { - return INVALID_HANDLE_VALUE; - } - - // Open the zip file. - file = CreateTempFile (); - if (file == INVALID_HANDLE_VALUE) - { - return file; - } - - time (&now); - nowtm = localtime (&now); - - if (nowtm == NULL || nowtm->tm_year < 80) - { - dosdate = dostime = 0; - } - else - { - dosdate = (nowtm->tm_year - 80) * 512 + (nowtm->tm_mon + 1) * 32 + nowtm->tm_mday; - dostime = nowtm->tm_hour * 2048 + nowtm->tm_min * 32 + nowtm->tm_sec / 2; - dosdate = LittleShort(dosdate); - dostime = LittleShort(dostime); - } - - // Write out the zip archive, one file at a time - for (i = 0; i < NumFiles; ++i) - { - AddZipFile (file, &TarFiles[i], dosdate, dostime); - } - - // Write the central directory - central.ModTime = dostime; - central.ModDate = dosdate; - - dirend.DirectoryOffset = LittleLong((uint32_t)SetFilePointer (file, 0, NULL, FILE_CURRENT)); - - for (i = 0, numfiles = 0, dirsize = 0; i < NumFiles; ++i) - { - // Skip empty files - if (TarFiles[i].UncompressedSize == 0) - { - continue; - } - numfiles++; - if (TarFiles[i].Deflated) - { - central.Flags = LittleShort((uint16_t)2); - central.Method = LittleShort((uint16_t)8); - } - else - { - central.Flags = 0; - central.Method = 0; - } - namelen = strlen(TarFiles[i].Filename); - central.InternalAttributes = 0; - if (namelen > 4 && stricmp(TarFiles[i].Filename - 4, ".txt") == 0) - { // Bit 0 set indicates this is probably a text file. But do any tools use it? - central.InternalAttributes = LittleShort((uint16_t)1); - } - central.CRC32 = LittleLong(TarFiles[i].CRC32); - central.CompressedSize = LittleLong(TarFiles[i].CompressedSize); - central.UncompressedSize = LittleLong(TarFiles[i].UncompressedSize); - central.NameLength = LittleShort((uint16_t)namelen); - central.LocalHeaderOffset = LittleLong(TarFiles[i].ZipOffset); - WriteFile (file, ¢ral, sizeof(central), &len, NULL); - WriteFile (file, TarFiles[i].Filename, (DWORD)namelen, &len, NULL); - dirsize += DWORD(sizeof(central) + namelen); - } - - // Write the directory terminator - dirend.NumEntriesOnAllDisks = dirend.NumEntries = LittleShort((uint16_t)numfiles); - dirend.DirectorySize = LittleLong(dirsize); - WriteFile (file, &dirend, sizeof(dirend), &len, NULL); - - return file; -} - -//========================================================================== -// -// AddZipFile -// -// Adds a file to the opened zip. -// -//========================================================================== - -static void AddZipFile (HANDLE ziphandle, TarFile *whichfile, short dosdate, short dostime) -{ - zip::LocalFileHeader local = { ZIP_LOCALFILE, }; - Bytef outbuf[1024], inbuf[1024]; - z_stream stream; - DWORD wrote, len, k; - int err; - bool gzip; - - whichfile->UncompressedSize = GetFileSize (whichfile->File, NULL); - whichfile->CompressedSize = 0; - whichfile->ZipOffset = 0; - whichfile->Deflated = false; - - // Skip empty files. - if (whichfile->UncompressedSize == 0) - { - return; - } - - stream.next_in = Z_NULL; - stream.avail_in = 0; - stream.zalloc = Z_NULL; - stream.zfree = Z_NULL; - err = deflateInit2 (&stream, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, - 8, Z_DEFAULT_STRATEGY); - gzip = err == Z_OK; - - if (gzip) - { - local.Method = LittleShort((uint16_t)8); - whichfile->Deflated = true; - stream.next_out = outbuf; - stream.avail_out = sizeof(outbuf); - } - - // Write out the header and filename. - local.VersionToExtract[0] = 20; - local.Flags = gzip ? LittleShort((uint16_t)2) : 0; - local.ModTime = dostime; - local.ModDate = dosdate; - local.UncompressedSize = LittleLong(whichfile->UncompressedSize); - local.NameLength = LittleShort((uint16_t)strlen(whichfile->Filename)); - - whichfile->ZipOffset = SetFilePointer (ziphandle, 0, NULL, FILE_CURRENT); - WriteFile (ziphandle, &local, sizeof(local), &wrote, NULL); - WriteFile (ziphandle, whichfile->Filename, (DWORD)strlen(whichfile->Filename), &wrote, NULL); - - // Write the file itself and calculate its CRC. - SetFilePointer (whichfile->File, 0, NULL, FILE_BEGIN); - for (k = 0; k < whichfile->UncompressedSize; ) - { - len = whichfile->UncompressedSize - k; - if (len > 1024) - { - len = 1024; - } - k += len; - ReadFile (whichfile->File, &inbuf, len, &len, NULL); - whichfile->CRC32 = crc32 (whichfile->CRC32, inbuf, len); - whichfile->CompressedSize += WriteBlock (ziphandle, inbuf, len, gzip ? &stream : NULL, outbuf); - } - - // Flush the zlib stream buffer. - if (gzip) - { - for (bool done = false;;) - { - len = sizeof(outbuf) - stream.avail_out; - if (len != 0) - { - whichfile->CompressedSize += len; - WriteFile (ziphandle, outbuf, len, &wrote, NULL); - stream.next_out = outbuf; - stream.avail_out = sizeof(outbuf); - } - if (done) - { - break; - } - err = deflate (&stream, Z_FINISH); - done = stream.avail_out != 0 || err == Z_STREAM_END; - if (err != Z_STREAM_END && err != Z_OK) - { - break; - } - } - deflateEnd (&stream); - } - - // Fill in fields we didn't know when we wrote the local header. - SetFilePointer (ziphandle, whichfile->ZipOffset + 14, NULL, FILE_BEGIN); - k = LittleLong(whichfile->CRC32); - WriteFile (ziphandle, &k, 4, &wrote, NULL); - k = LittleLong(whichfile->CompressedSize); - WriteFile (ziphandle, &k, 4, &wrote, NULL); - - SetFilePointer (ziphandle, 0, NULL, FILE_END); -} - -//========================================================================== -// -// DrawTransparentBitmap -// -// The replacement for TransparentBlt that does not leak memory under -// Windows 98/ME. As seen in the MSKB. -// -//========================================================================== - -void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart, - short yStart, COLORREF cTransparentColor) -{ - BITMAP bm; - COLORREF cColor; - HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave; - HBITMAP bmBackOld, bmObjectOld, bmMemOld, bmSaveOld; - HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave; - POINT ptSize; - - hdcTemp = CreateCompatibleDC(hdc); - SelectObject(hdcTemp, hBitmap); // Select the bitmap - - GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm); - ptSize.x = bm.bmWidth; // Get width of bitmap - ptSize.y = bm.bmHeight; // Get height of bitmap - DPtoLP(hdcTemp, &ptSize, 1); // Convert from device - - // to logical points - - // Create some DCs to hold temporary data. - hdcBack = CreateCompatibleDC(hdc); - hdcObject = CreateCompatibleDC(hdc); - hdcMem = CreateCompatibleDC(hdc); - hdcSave = CreateCompatibleDC(hdc); - - // Create a bitmap for each DC. DCs are required for a number of - // GDI functions. - - // Monochrome DC - bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); - - // Monochrome DC - bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); - - bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); - bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); - - // Each DC must select a bitmap object to store pixel data. - bmBackOld = (HBITMAP)SelectObject(hdcBack, bmAndBack); - bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject); - bmMemOld = (HBITMAP)SelectObject(hdcMem, bmAndMem); - bmSaveOld = (HBITMAP)SelectObject(hdcSave, bmSave); - - // Set proper mapping mode. - SetMapMode(hdcTemp, GetMapMode(hdc)); - - // Save the bitmap sent here, because it will be overwritten. - BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); - - // Set the background color of the source DC to the color. - // contained in the parts of the bitmap that should be transparent - cColor = SetBkColor(hdcTemp, cTransparentColor); - - // Create the object mask for the bitmap by performing a BitBlt - // from the source bitmap to a monochrome bitmap. - BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, - SRCCOPY); - - // Set the background color of the source DC back to the original - // color. - SetBkColor(hdcTemp, cColor); - - // Create the inverse of the object mask. - BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, - NOTSRCCOPY); - - // Copy the background of the main DC to the destination. - BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, - SRCCOPY); - - // Mask out the places where the bitmap will be placed. - BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND); - - // Mask out the transparent colored pixels on the bitmap. - BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND); - - // XOR the bitmap with the background on the destination DC. - BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT); - - // Copy the destination to the screen. - BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, - SRCCOPY); - - // Place the original bitmap back into the bitmap sent here. - BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY); - - // Delete the memory bitmaps. - DeleteObject(SelectObject(hdcBack, bmBackOld)); - DeleteObject(SelectObject(hdcObject, bmObjectOld)); - DeleteObject(SelectObject(hdcMem, bmMemOld)); - DeleteObject(SelectObject(hdcSave, bmSaveOld)); - - // Delete the memory DCs. - DeleteDC(hdcMem); - DeleteDC(hdcBack); - DeleteDC(hdcObject); - DeleteDC(hdcSave); - DeleteDC(hdcTemp); -} - -//========================================================================== -// -// TransparentStaticProc -// -// A special window procedure for the static control displaying the dying -// Doom Guy. It draws the bitmap with magenta as transparent. I could have -// made it an owner-draw control instead, but then I wouldn't get any of -// the standard bitmap graphic handling (like automatic sizing). -// -//========================================================================== - -static LRESULT CALLBACK TransparentStaticProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - RECT rect; - PAINTSTRUCT paint; - HDC dc; - - if (uMsg == WM_PAINT) - { - if (GetUpdateRect (hWnd, &rect, FALSE)) - { - dc = BeginPaint (hWnd, &paint); - if (dc != NULL) - { - HBITMAP bitmap = (HBITMAP)SendMessage (hWnd, STM_GETIMAGE, IMAGE_BITMAP, 0); - if (bitmap != NULL) - { - DrawTransparentBitmap (dc, bitmap, 0, 0, RGB(255,0,255)); - } - EndPaint (hWnd, &paint); - } - } - return 0; - } - return CallWindowProc (StdStaticProc, hWnd, uMsg, wParam, lParam); -} - -static HMODULE WinHlp32; - -//========================================================================== -// -// OverviewDlgProc -// -// The DialogProc for the crash overview page. -// -//========================================================================== - -static INT_PTR CALLBACK OverviewDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - CHARFORMAT charFormat; - HWND edit; - ENLINK *link; - - switch (message) - { - case WM_INITDIALOG: - { - if (pEnableThemeDialogTexture != NULL) - { - pEnableThemeDialogTexture(hDlg, ETDT_ENABLETAB); - } - - // Setup the header at the top of the page. - edit = GetDlgItem(hDlg, IDC_CRASHHEADER); - SetWindowTextW(edit, WGAMENAME" has encountered a problem and needs to close.\n" - "We are sorry for the inconvenience."); - - // Setup a bold version of the standard dialog font and make the header bold. - charFormat.cbSize = sizeof(charFormat); - SendMessageW(edit, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM)&charFormat); - charFormat.dwEffects = CFE_BOLD; - SendMessageW(edit, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&charFormat); - - // Setup the drawing routine for the dying guy's bitmap. - edit = GetDlgItem(hDlg, IDC_DEADGUYVIEWER); - StdStaticProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(edit, GWLP_WNDPROC, (WLONG_PTR)(LONG_PTR)TransparentStaticProc); - - // Fill in all the text just below the heading. - edit = GetDlgItem(hDlg, IDC_PLEASETELLUS); - SendMessageW(edit, EM_AUTOURLDETECT, TRUE, 0); - SetWindowTextW(edit, L"Please tell us about this problem.\n" - "The information will NOT be sent to Microsoft.\n\n" - "An error report has been created that you can submit to help improve " GAMENAME ". " - /*"You can either save it to disk and make a report in the bugs forum at " FORUM_URL ", " - "or you can send it directly without letting other people know about it."*/); - SendMessageW(edit, EM_SETSEL, 0, 81); - SendMessageW(edit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&charFormat); - SendMessageW(edit, EM_SETEVENTMASK, 0, ENM_LINK); - - // Assign a default invalid file handle to the user's edit control. - edit = GetDlgItem(hDlg, IDC_CRASHINFO); - SetWindowLongPtrW(edit, GWLP_USERDATA, (LONG_PTR)INVALID_HANDLE_VALUE); - - // Fill in the summary text at the bottom of the page. - edit = GetDlgItem(hDlg, IDC_CRASHSUMMARY); - auto wsum = WideString(CrashSummary); - SetWindowTextW(edit, wsum.c_str()); - return TRUE; - } - - case WM_NOTIFY: - // When the link in the "please tell us" edit control is clicked, open - // the bugs forum in a browser window. ShellExecute is used to do this, - // so the default browser, whatever it may be, will open it. - link = (ENLINK *)lParam; - if (link->nmhdr.idFrom == IDC_PLEASETELLUS && link->nmhdr.code == EN_LINK) - { - if (link->msg == WM_LBUTTONDOWN) - { - //ShellExecuteA (NULL, "open", BUGS_FORUM_URL, NULL, NULL, 0); - SetWindowLongPtrW (hDlg, DWLP_MSGRESULT, 1); - return TRUE; - } - } - return FALSE; - break; - } - return FALSE; -} - -//========================================================================== -// -// CrashDlgProc -// -// The DialogProc for the main crash dialog. -// -//========================================================================== - -static INT_PTR CALLBACK CrashDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - static WCHAR overview[] = L"Overview"; - static WCHAR details[] = L"Details"; - HWND edit; - TCITEM tcitem; - RECT tabrect, tcrect; - LPNMHDR nmhdr; - - switch (message) - { - case WM_INITDIALOG: - // Set up the tab control - tcitem.mask = TCIF_TEXT | TCIF_PARAM; - edit = GetDlgItem (hDlg, IDC_CRASHTAB); - - GetWindowRect (edit, &tcrect); - ScreenToClient (hDlg, (LPPOINT)&tcrect.left); - ScreenToClient (hDlg, (LPPOINT)&tcrect.right); - - // There are two tabs: Overview and Details. Each pane is created from a - // dialog template, and the resultant window is stored as the lParam for - // the corresponding tab. - tcitem.pszText = overview; - tcitem.lParam = (LPARAM)CreateDialogParamW (g_hInst, MAKEINTRESOURCE(IDD_CRASHOVERVIEW), hDlg, OverviewDlgProc, (LPARAM)edit); - TabCtrl_InsertItem (edit, 0, &tcitem); - TabCtrl_GetItemRect (edit, 0, &tabrect); - SetWindowPos ((HWND)tcitem.lParam, HWND_TOP, tcrect.left + 3, tcrect.top + tabrect.bottom + 3, - tcrect.right - tcrect.left - 8, tcrect.bottom - tcrect.top - tabrect.bottom - 8, 0); - - tcitem.pszText = details; - tcitem.lParam = (LPARAM)CreateDialogParamW (g_hInst, MAKEINTRESOURCE(IDD_CRASHDETAILS), hDlg, DetailsDlgProc, (LPARAM)edit); - TabCtrl_InsertItem (edit, 1, &tcitem); - SetWindowPos ((HWND)tcitem.lParam, HWND_TOP, tcrect.left + 3, tcrect.top + tabrect.bottom + 3, - tcrect.right - tcrect.left - 8, tcrect.bottom - tcrect.top - tabrect.bottom - 8, 0); - break; - - case WM_NOTIFY: - nmhdr = (LPNMHDR)lParam; - if (nmhdr->idFrom == IDC_CRASHTAB) - { - int i = TabCtrl_GetCurSel (nmhdr->hwndFrom); - tcitem.mask = TCIF_PARAM; - TabCtrl_GetItem (nmhdr->hwndFrom, i, &tcitem); - edit = (HWND)tcitem.lParam; - - // TCN_SELCHANGING is sent just before the selected tab changes. - // TCN_SELCHANGE is sent just after the selected tab changes. - // So, when TCN_SELCHANGING is received hide the pane for the - // selected tab, and when TCN_SELCHANGE is received, show the pane - // for the selected tab. - if (nmhdr->code == TCN_SELCHANGING) - { - ShowWindow (edit, SW_HIDE); - SetWindowLongPtr (hDlg, DWLP_MSGRESULT, FALSE); - return TRUE; - } - else if (nmhdr->code == TCN_SELCHANGE) - { - ShowWindow (edit, SW_SHOW); - return TRUE; - } - else - { - return FALSE; - } - } - break; - - case WM_COMMAND: - if (HIWORD(wParam) == BN_CLICKED) - { - EndDialog (hDlg, LOWORD(wParam)); - } - break; - } - return FALSE; -} - -//========================================================================== -// -// DetailsDlgProc -// -// The dialog procedure for when the user wants to examine the files -// in the report. -// -//========================================================================== - -static INT_PTR CALLBACK DetailsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - HWND ctrl; - int i, j; - - switch (message) - { - case WM_INITDIALOG: - if (pEnableThemeDialogTexture != NULL) - { - pEnableThemeDialogTexture (hDlg, ETDT_ENABLETAB); - } - - // Set up the file contents display: No undos. The control's - // userdata stores the index of the file currently displayed. - ctrl = GetDlgItem (hDlg, IDC_CRASHFILECONTENTS); - SendMessageW (ctrl, EM_SETUNDOLIMIT, 0, 0); - SetWindowLongPtrW (ctrl, GWLP_USERDATA, -1); - SetEditControl (ctrl, GetDlgItem(hDlg, IDC_CRASHFILESIZE), 0); - SendMessageW (ctrl, LB_SETCURSEL, 0, 0); - break; - - case WM_SHOWWINDOW: - // When showing this pane, refresh the list of packaged files, and - // update the contents display as necessary. - if (wParam == TRUE) - { - ctrl = GetDlgItem (hDlg, IDC_CRASHFILES); - j = (int)SendMessageW (ctrl, LB_GETCURSEL, 0, 0); - SendMessageW (ctrl, LB_RESETCONTENT, 0, 0); - for (i = 0; i < NumFiles; ++i) - { - SendMessageA (ctrl, LB_ADDSTRING, 0, (LPARAM)TarFiles[i].Filename); - } - if (j == LB_ERR || j >= i) j = 0; - SendMessageW (ctrl, LB_SETCURSEL, j, 0); - - ctrl = GetDlgItem (hDlg, IDC_CRASHFILECONTENTS); - if (j > 2) SetWindowLongPtr (ctrl, GWLP_USERDATA, -1); - SetEditControl (ctrl, GetDlgItem(hDlg, IDC_CRASHFILESIZE), j); - } - break; - - case WM_COMMAND: - // Selecting a different file makes the contents display update. - if (HIWORD(wParam) == LBN_SELCHANGE) - { - i = (int)SendMessage ((HWND)lParam, LB_GETCURSEL, 0, 0); - if (i != LB_ERR) - { - // Update the contents control for this file - SetEditControl (GetDlgItem (hDlg, IDC_CRASHFILECONTENTS), - GetDlgItem (hDlg, IDC_CRASHFILESIZE), i); - } - } - break; - } - return FALSE; -} - -//========================================================================== -// -// StreamEditText -// -// The callback function to stream a text file into a rich edit control. -// -//========================================================================== - -static DWORD CALLBACK StreamEditText (DWORD_PTR cookie, LPBYTE buffer, LONG cb, LONG *pcb) -{ - DWORD wrote; - ReadFile ((HANDLE)cookie, buffer, cb, &wrote, NULL); - *pcb = wrote; - return wrote == 0; -} - -//========================================================================== -// -// StreamEditBinary -// -// The callback function to stream a binary file into a rich edit control. -// The binary file is converted to a RTF hex dump so that the different -// columns can be color-coded. -// -//========================================================================== - -struct BinStreamInfo -{ - int Stage; - HANDLE File; - DWORD Pointer; -}; - -static DWORD CALLBACK StreamEditBinary (DWORD_PTR cookie, LPBYTE buffer, LONG cb, LONG *pcb) -{ - BinStreamInfo *info = (BinStreamInfo *)cookie; - uint8_t buf16[16]; - DWORD read, i; - char *buff_p = (char *)buffer; - char *buff_end = (char *)buffer + cb; - -repeat: - switch (info->Stage) - { - case 0: // Write prologue - buff_p += mysnprintf (buff_p, buff_end - buff_p, "{\\rtf1\\ansi\\deff0" - "{\\colortbl ;\\red0\\green0\\blue80;\\red0\\green0\\blue0;\\red80\\green0\\blue80;}" - "\\viewkind4\\pard"); - info->Stage++; - break; - - case 1: // Write body - while (cb - ((LPBYTE)buff_p - buffer) > 150) - { - ReadFile (info->File, buf16, 16, &read, NULL); - if (read == 0 || info->Pointer >= 65536) - { - info->Stage = read == 0 ? 2 : 3; - goto repeat; - } - char *linestart = buff_p; - buff_p += mysnprintf (buff_p, buff_end - buff_p, "\\cf1 %08lx:\\cf2 ", info->Pointer); - info->Pointer += read; - - for (i = 0; i < read;) - { - if (i <= read - 4) - { - DWORD d; - memcpy(&d, &buf16[i], sizeof(d)); - buff_p += mysnprintf (buff_p, buff_end - buff_p, " %08lx", d); - i += 4; - } - else - { - buff_p += mysnprintf (buff_p, buff_end - buff_p, " %02x", buf16[i]); - i += 1; - } - } - while (buff_p - linestart < 57) - { - *buff_p++ = ' '; - } - buff_p += mysnprintf (buff_p, buff_end - buff_p, "\\cf3 "); - for (i = 0; i < read; ++i) - { - uint8_t code = buf16[i]; - if (code < 0x20 || code > 0x7f) code = 0xB7; - if (code == '\\' || code == '{' || code == '}') *buff_p++ = '\\'; - *buff_p++ = code; - } - buff_p += mysnprintf (buff_p, buff_end - buff_p, "\\par\r\n"); - } - break; - - case 2: // Write epilogue - buff_p += mysnprintf (buff_p, buff_end - buff_p, "\\cf0 }"); - info->Stage = 4; - break; - - case 3: // Write epilogue for truncated file - buff_p += mysnprintf (buff_p, buff_end - buff_p, "--- Rest of file truncated ---\\cf0 }"); - info->Stage = 4; - break; - - case 4: // We're done - return TRUE; - } - - *pcb = (LONG)((LPBYTE)buff_p - buffer); - return FALSE; -} - -//========================================================================== -// -// SetEditControl -// -// Fills the edit control with the contents of the chosen file. -// If the filename ends with ".txt" the file is assumed to be text. -// Otherwise it is treated as binary, and you get a hex dump. -// -//========================================================================== - -static void SetEditControl (HWND edit, HWND sizedisplay, int filenum) -{ - char sizebuf[32]; - EDITSTREAM stream; - DWORD size; - POINT pt = { 0, 0 }; - const char *rtf = NULL; - HGDIOBJ font; - - // Don't refresh the control if it's already showing the file we want. - if (GetWindowLongPtr (edit, GWLP_USERDATA) == filenum) - { - return; - } - - size = GetFileSize (TarFiles[filenum].File, NULL); - if (size < 1024) - { - mysnprintf (sizebuf, countof(sizebuf), "(%lu bytes)", size); - } - else - { - mysnprintf (sizebuf, countof(sizebuf), "(%lu KB)", size/1024); - } - SetWindowTextA (sizedisplay, sizebuf); - - SetWindowLongPtr (edit, GWLP_USERDATA, filenum); - - SetFilePointer (TarFiles[filenum].File, 0, NULL, FILE_BEGIN); - SendMessage (edit, EM_SETSCROLLPOS, 0, (LPARAM)&pt); - - // Set the font now, in case log.rtf was previously viewed, because - // that file changes it. - font = GetStockObject (ANSI_FIXED_FONT); - if (font != INVALID_HANDLE_VALUE) - { - SendMessage (edit, WM_SETFONT, (WPARAM)font, FALSE); - } - - // Text files are streamed in as-is. - // Binary files are streamed in as color-coded hex dumps. - stream.dwError = 0; - if (strstr (TarFiles[filenum].Filename, ".txt") != NULL || - (rtf = strstr (TarFiles[filenum].Filename, ".rtf")) != NULL) - { - CHARFORMAT beBlack; - - beBlack.cbSize = sizeof(beBlack); - beBlack.dwMask = CFM_COLOR; - beBlack.dwEffects = 0; - beBlack.crTextColor = RGB(0,0,0); - SendMessage (edit, EM_SETCHARFORMAT, 0, (LPARAM)&beBlack); - stream.dwCookie = (DWORD_PTR)TarFiles[filenum].File; - stream.pfnCallback = StreamEditText; - SendMessage (edit, EM_STREAMIN, rtf ? SF_RTF : SF_TEXT | SF_USECODEPAGE | (1252 << 16), (LPARAM)&stream); - } - else - { - BinStreamInfo info = { 0, TarFiles[filenum].File, 0 }; - stream.dwCookie = (DWORD_PTR)&info; - stream.pfnCallback = StreamEditBinary; - SendMessage (edit, EM_EXLIMITTEXT, 0, GetFileSize(TarFiles[filenum].File, NULL)*7); - SendMessage (edit, EM_STREAMIN, SF_RTF, (LPARAM)&stream); - } - SendMessage (edit, EM_SETSEL, (WPARAM)-1, 0); -} - -//========================================================================== -// -// SaveReport -// -// Makes a permanent copy of the report tarball. -// -//========================================================================== - -static void SaveReport (HANDLE file) -{ - OPENFILENAME ofn = { -#ifdef OPENFILENAME_SIZE_VERSION_400 - OPENFILENAME_SIZE_VERSION_400 -#else - sizeof(ofn) #endif - , }; - WCHAR filename[256]; - ofn.lpstrFilter = L"Zip file (*.zip)\0*.zip\0"; - wcscpy (filename, L"CrashReport.zip"); - ofn.lpstrFile = filename; - ofn.nMaxFile = countof(filename); - - while (GetSaveFileNameW (&ofn)) - { - HANDLE ofile = CreateFileW (ofn.lpstrFile, GENERIC_WRITE, 0, NULL, - CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, - NULL); - if (ofile == INVALID_HANDLE_VALUE) - { - if (MessageBoxA (NULL, "Could not open the crash report file", - "Save As failed", MB_RETRYCANCEL) == IDRETRY) - { - continue; - } - return; - } - else - { - DWORD fileLen = GetFileSize (file, NULL), fileLeft; - char xferbuf[1024]; - - SetFilePointer (file, 0, NULL, FILE_BEGIN); - fileLeft = fileLen; - while (fileLeft != 0) - { - DWORD grab = fileLeft > sizeof(xferbuf) ? sizeof(xferbuf) : fileLeft; - DWORD didread; - - ReadFile (file, xferbuf, grab, &didread, NULL); - WriteFile (ofile, xferbuf, didread, &grab, NULL); - fileLeft -= didread; - } - CloseHandle (ofile); - return; - } - } + return true; } -//========================================================================== -// -// DisplayCrashLog -// -// Displays the crash information and possibly submits it. CreateCrashLog() -// must have been called previously. -// -//========================================================================== - -void DisplayCrashLog () +bool CrashReporter::write_memory(BYTE* pTarget, const BYTE* pSource, DWORD Size) { - HANDLE file; + DWORD ErrCode = 0; - if (NumFiles == 0) - { - char ohPoo[] = - GAMENAME" crashed but was unable to produce\n" - "detailed information about the crash.\n" - "\nThis is all that is available:\n\nCode=XXXXXXXX\nAddr=XXXXXXXX"; - mysnprintf (ohPoo + countof(ohPoo) - 23, 23, "%08lX\nAddr=%p", CrashCode, CrashAddress); - MessageBoxA (NULL, ohPoo, GAMENAME" Very Fatal Error", MB_OK|MB_ICONSTOP); - if (WinHlp32 != NULL) - { - FreeLibrary (WinHlp32); - } - } - else - { - HMODULE uxtheme = LoadLibraryA ("uxtheme.dll"); - if (uxtheme != NULL) - { - pEnableThemeDialogTexture = (HRESULT (__stdcall *)(HWND,DWORD))GetProcAddress (uxtheme, "EnableThemeDialogTexture"); - } - INT_PTR result = DialogBox (g_hInst, MAKEINTRESOURCE(IDD_CRASHDIALOG), NULL, (DLGPROC)CrashDlgProc); + if (pTarget == 0) + return false; + if (pSource == 0) + return false; + if (Size == 0) + return false; + if (IsBadReadPtr(pSource, Size)) + return false; - if (result == IDC_SAVEREPORT) - { - file = MakeZip (); - SaveReport (file); - CloseHandle (file); - } - if (uxtheme != NULL) - { - FreeLibrary (uxtheme); - } + // Modify protection attributes of the target memory page + + DWORD OldProtect = 0; + + if (!VirtualProtect(pTarget, Size, PAGE_EXECUTE_READWRITE, &OldProtect)) + { + ErrCode = GetLastError(); + return false; } - CloseTarFiles (); + + // Write memory + + memcpy(pTarget, pSource, Size); + + // Restore memory protection attributes of the target memory page + + DWORD Temp = 0; + + if (!VirtualProtect(pTarget, Size, OldProtect, &Temp)) + { + ErrCode = GetLastError(); + return false; + } + + // Success + return true; } + +#if defined(_M_X64) +const BYTE CrashReporter::patch_bytes[6] = { 0x48, 0x31, 0xC0, 0xC2, 0x00, 0x00 }; +#elif defined(_M_IX86) +const BYTE CrashReporter::patch_bytes[5] = { 0x33, 0xC0, 0xC2, 0x04, 0x00 }; +#endif + +#endif diff --git a/src/common/platform/win32/i_crash_arm.cpp b/src/common/platform/win32/i_crash_arm.cpp deleted file mode 100644 index 2a61ab42c..000000000 --- a/src/common/platform/win32/i_crash_arm.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// Licensed to the Public Domain by Rachael Alexandersion (c) 2021 -// This file is nothing more than a stub. Please replace with a proper copyright notice if this function is implemented for ARM. Or just use the regular i_crash.cpp - -void DisplayCrashLog() -{ - // stub -} diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index 6977055b7..200cd541b 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -32,14 +32,13 @@ ** */ -// HEADER FILES ------------------------------------------------------------ - #define WIN32_LEAN_AND_MEAN #include #include #include #include -#include +#include +#include #include #include @@ -80,8 +79,6 @@ #include "i_mainwindow.h" -// MACROS ------------------------------------------------------------------ - // The main window's title. #ifdef _M_X64 #define X64 " 64-bit" @@ -91,53 +88,25 @@ #define X64 "" #endif -// TYPES ------------------------------------------------------------------- +void InitCrashReporter(const std::wstring& reports_directory, const std::wstring& uploader_executable); +FString GetKnownFolder(int shell_folder, REFKNOWNFOLDERID known_folder, bool create); -// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- - -LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); -void CreateCrashLog (const char *custominfo, DWORD customsize); -void DisplayCrashLog (); void DestroyCustomCursor(); int GameMain(); -// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- - -// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- - -// EXTERNAL DATA DECLARATIONS ---------------------------------------------- - -extern EXCEPTION_POINTERS CrashPointers; extern UINT TimerPeriod; -// PUBLIC DATA DEFINITIONS ------------------------------------------------- - // The command line arguments. FArgs *Args; HINSTANCE g_hInst; -HANDLE MainThread; -DWORD MainThreadID; HANDLE StdOut; bool FancyStdOut, AttachedStdOut; -// CODE -------------------------------------------------------------------- - - -//========================================================================== -// -// I_SetIWADInfo -// -//========================================================================== - void I_SetIWADInfo() { } -//========================================================================== -// -// DoMain -// //========================================================================== int DoMain (HINSTANCE hInstance) @@ -167,7 +136,7 @@ int DoMain (HINSTANCE hInstance) // handle instead of creating a console window. StdOut = GetStdHandle(STD_OUTPUT_HANDLE); - if (StdOut != NULL) + if (StdOut != nullptr) { // It seems that running from a shell always creates a std output // for us, even if it doesn't go anywhere. (Running from Explorer @@ -177,7 +146,7 @@ int DoMain (HINSTANCE hInstance) BY_HANDLE_FILE_INFORMATION info; if (!GetFileInformationByHandle(StdOut, &info)) { - StdOut = NULL; + StdOut = nullptr; } } if (StdOut == nullptr) @@ -185,7 +154,7 @@ int DoMain (HINSTANCE hInstance) if (AttachConsole(ATTACH_PARENT_PROCESS)) { StdOut = GetStdHandle(STD_OUTPUT_HANDLE); - DWORD foo; WriteFile(StdOut, "\n", 1, &foo, NULL); + DWORD foo; WriteFile(StdOut, "\n", 1, &foo, nullptr); AttachedStdOut = true; } if (StdOut == nullptr && AllocConsole()) @@ -217,7 +186,7 @@ int DoMain (HINSTANCE hInstance) // Figure out what directory the program resides in. WCHAR progbuff[1024]; - if (GetModuleFileNameW(nullptr, progbuff, sizeof progbuff) == 0) + if (GetModuleFileNameW(nullptr, progbuff, 1024) == 0) { MessageBoxA(nullptr, "Fatal", "Could not determine program location.", MB_ICONEXCLAMATION|MB_OK); exit(-1); @@ -242,7 +211,7 @@ int DoMain (HINSTANCE hInstance) // element. DEVMODE is not one of those structures. memset (&displaysettings, 0, sizeof(displaysettings)); displaysettings.dmSize = sizeof(displaysettings); - EnumDisplaySettings (NULL, ENUM_CURRENT_SETTINGS, &displaysettings); + EnumDisplaySettings (nullptr, ENUM_CURRENT_SETTINGS, &displaysettings); x = (displaysettings.dmPelsWidth - width) / 2; y = (displaysettings.dmPelsHeight - height) / 2; @@ -260,17 +229,17 @@ int DoMain (HINSTANCE hInstance) WinWidth = cRect.right; WinHeight = cRect.bottom; - CoInitialize (NULL); - atexit ([](){ CoUninitialize(); }); // beware of calling convention. + if (SUCCEEDED(CoInitialize(nullptr))) + atexit ([](){ CoUninitialize(); }); // beware of calling convention. int ret = GameMain (); if (mainwindow.CheckForRestart()) { - HMODULE hModule = GetModuleHandleW(NULL); + HMODULE hModule = GetModuleHandleW(nullptr); WCHAR path[MAX_PATH]; GetModuleFileNameW(hModule, path, MAX_PATH); - ShellExecuteW(NULL, L"open", path, GetCommandLineW(), NULL, SW_SHOWNORMAL); + ShellExecuteW(nullptr, L"open", path, GetCommandLineW(), nullptr, SW_SHOWNORMAL); } DestroyCustomCursor(); @@ -287,7 +256,7 @@ int DoMain (HINSTANCE hInstance) if (StdOut != nullptr) WriteFile(StdOut, "Press any key to exit...", 24, &bytes, nullptr); FlushConsoleInputBuffer(stdinput); SetConsoleMode(stdinput, 0); - ReadConsole(stdinput, &bytes, 1, &bytes, NULL); + ReadConsole(stdinput, &bytes, 1, &bytes, nullptr); } else if (StdOut == nullptr) { @@ -319,231 +288,13 @@ void I_ShowFatalError(const char *msg) } } -// Here is how the error logging system works. -// -// To catch exceptions that occur in secondary threads, CatchAllExceptions is -// set as the UnhandledExceptionFilter for this process. It records the state -// of the thread at the time of the crash using CreateCrashLog and then queues -// an APC on the primary thread. When the APC executes, it raises a software -// exception that gets caught by the __try/__except block in WinMain. -// I_GetEvent calls SleepEx to put the primary thread in a waitable state -// periodically so that the APC has a chance to execute. -// -// Exceptions on the primary thread are caught by the __try/__except block in -// WinMain. Not only does it record the crash information, it also shuts -// everything down and displays a dialog with the information present. If a -// console log is being produced, the information will also be appended to it. -// -// If a debugger is running, CatchAllExceptions never executes, so secondary -// thread exceptions will always be caught by the debugger. For the primary -// thread, IsDebuggerPresent is called to determine if a debugger is present. -// Note that this function is not present on Windows 95, so we cannot -// statically link to it. -// -// To make this work with MinGW, you will need to use inline assembly -// because GCC offers no native support for Windows' SEH. - -//========================================================================== -// -// SleepForever -// //========================================================================== -void SleepForever () -{ - Sleep (INFINITE); -} - -//========================================================================== -// -// ExitMessedUp -// -// An exception occurred while exiting, so don't do any standard processing. -// Just die. -// -//========================================================================== - -LONG WINAPI ExitMessedUp (LPEXCEPTION_POINTERS foo) -{ - ExitProcess (1000); -} - -//========================================================================== -// -// ExitFatally -// -//========================================================================== - -void CALLBACK ExitFatally (ULONG_PTR dummy) -{ - SetUnhandledExceptionFilter (ExitMessedUp); - I_ShutdownGraphics (); - mainwindow.RestoreConView (); - DisplayCrashLog (); - exit(-1); -} - -#ifndef _M_ARM64 -//========================================================================== -// -// CatchAllExceptions -// -//========================================================================== - -namespace -{ - CONTEXT MainThreadContext; -} - -LONG WINAPI CatchAllExceptions (LPEXCEPTION_POINTERS info) -{ -#ifdef _DEBUG - if (info->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) - { - return EXCEPTION_CONTINUE_SEARCH; - } -#endif - - static bool caughtsomething = false; - - if (caughtsomething) return EXCEPTION_EXECUTE_HANDLER; - caughtsomething = true; - - char *custominfo = (char *)HeapAlloc (GetProcessHeap(), 0, 16384); - - CrashPointers = *info; - if (sysCallbacks.CrashInfo && custominfo) sysCallbacks.CrashInfo(custominfo, 16384, "\r\n"); - CreateCrashLog (custominfo, (DWORD)strlen(custominfo)); - - // If the main thread crashed, then make it clean up after itself. - // Otherwise, put the crashing thread to sleep and signal the main thread to clean up. - if (GetCurrentThreadId() == MainThreadID) - { -#ifdef _M_X64 - *info->ContextRecord = MainThreadContext; -#else - info->ContextRecord->Eip = (DWORD_PTR)ExitFatally; -#endif // _M_X64 - } - else - { -#ifndef _M_X64 - info->ContextRecord->Eip = (DWORD_PTR)SleepForever; -#else - info->ContextRecord->Rip = (DWORD_PTR)SleepForever; -#endif - QueueUserAPC (ExitFatally, MainThread, 0); - } - return EXCEPTION_CONTINUE_EXECUTION; -} -#else // !_M_ARM64 -// stub this function for ARM64 -LONG WINAPI CatchAllExceptions (LPEXCEPTION_POINTERS info) -{ - return EXCEPTION_CONTINUE_EXECUTION; -} -#endif // !_M_ARM64 - -//========================================================================== -// -// infiniterecursion -// -// Debugging routine for testing the crash logger. -// -//========================================================================== - -#ifdef _DEBUG -static void infiniterecursion(int foo) -{ - if (foo) - { - infiniterecursion(foo); - } -} -#endif - -// Setting this to 'true' allows getting the standard notification for a crash -// which offers the very important feature to open a debugger and see the crash in context right away. -CUSTOM_CVAR(Bool, disablecrashlog, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -{ - SetUnhandledExceptionFilter(!*self ? CatchAllExceptions : nullptr); -} - -//========================================================================== -// -// WinMain -// -//========================================================================== - -int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int nCmdShow) +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int nCmdShow) { g_hInst = hInstance; - InitCommonControls (); // Load some needed controls and be pretty under XP - - // We need to load riched20.dll so that we can create the control. - if (NULL == LoadLibraryA ("riched20.dll")) - { - // This should only happen on basic Windows 95 installations, but since we - // don't support Windows 95, we have no obligation to provide assistance in - // getting it installed. - MessageBoxA(NULL, "Could not load riched20.dll", GAMENAME " Error", MB_OK | MB_ICONSTOP); - return 0; - } - -#if !defined(__GNUC__) && defined(_DEBUG) - if (__argc == 2 && __wargv != nullptr && wcscmp (__wargv[1], L"TestCrash") == 0) - { - __try - { - *(int *)0 = 0; - } - __except(CrashPointers = *GetExceptionInformation(), - CreateCrashLog ("TestCrash", 9), EXCEPTION_EXECUTE_HANDLER) - { - } - DisplayCrashLog (); - return 0; - } - if (__argc == 2 && __wargv != nullptr && wcscmp (__wargv[1], L"TestStackCrash") == 0) - { - __try - { - infiniterecursion(1); - } - __except(CrashPointers = *GetExceptionInformation(), - CreateCrashLog ("TestStackCrash", 14), EXCEPTION_EXECUTE_HANDLER) - { - } - DisplayCrashLog (); - return 0; - } -#endif - - MainThread = INVALID_HANDLE_VALUE; - DuplicateHandle (GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &MainThread, - 0, FALSE, DUPLICATE_SAME_ACCESS); - MainThreadID = GetCurrentThreadId(); - -#ifndef _DEBUG - if (MainThread != INVALID_HANDLE_VALUE) - { -#ifndef _M_ARM64 - SetUnhandledExceptionFilter (CatchAllExceptions); -#endif - -#ifdef _M_X64 - static bool setJumpResult = false; - RtlCaptureContext(&MainThreadContext); - if (setJumpResult) - { - ExitFatally(0); - return 0; - } - setJumpResult = true; -#endif // _M_X64 - } -#endif + InitCommonControls(); #if defined(_DEBUG) && defined(_MSC_VER) // Uncomment this line to make the Visual C++ CRT check the heap before @@ -558,14 +309,24 @@ int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int //_crtBreakAlloc = 227524; #endif - int ret = DoMain (hInstance); + // Setup crash reporting, unless it is the crash reporter launching us in response to a crash + if (wcsstr(cmdline, L"-showcrashreport") == nullptr) + { + WCHAR exeFilename[1024] = {}; + if (GetModuleFileName(0, exeFilename, 1023) != 0) + { + FString reportsDirectory = GetKnownFolder(CSIDL_LOCAL_APPDATA, FOLDERID_LocalAppData, true); + reportsDirectory += "/" GAMENAMELOWERCASE; + reportsDirectory += "/crashreports"; + CreatePath(reportsDirectory.GetChars()); - CloseHandle (MainThread); - MainThread = INVALID_HANDLE_VALUE; - return ret; + InitCrashReporter(reportsDirectory.WideString(), exeFilename); + } + } + + return DoMain(hInstance); } -// each platform has its own specific version of this function. void I_SetWindowTitle(const char* caption) { mainwindow.SetWindowTitle(caption); diff --git a/src/common/widgets/errorwindow.cpp b/src/common/widgets/errorwindow.cpp index 625f278f7..d74864bb6 100644 --- a/src/common/widgets/errorwindow.cpp +++ b/src/common/widgets/errorwindow.cpp @@ -6,14 +6,16 @@ #include #include #include +#include +#include -bool ErrorWindow::ExecModal(const std::string& text, const std::string& log) +bool ErrorWindow::ExecModal(const std::string& text, const std::string& log, std::vector minidump) { Size screenSize = GetScreenSize(); double windowWidth = 1200.0; double windowHeight = 700.0; - auto window = std::make_unique(); + auto window = std::make_unique(std::move(minidump)); window->SetText(text, log); window->SetFrameGeometry((screenSize.width - windowWidth) * 0.5, (screenSize.height - windowHeight) * 0.5, windowWidth, windowHeight); window->Show(); @@ -23,7 +25,7 @@ bool ErrorWindow::ExecModal(const std::string& text, const std::string& log) return window->Restart; } -ErrorWindow::ErrorWindow() : Widget(nullptr, WidgetType::Window) +ErrorWindow::ErrorWindow(std::vector initminidump) : Widget(nullptr, WidgetType::Window), minidump(std::move(initminidump)) { FStringf caption("Fatal Error - " GAMENAME " %s (%s)", GetVersionString(), GetGitTime()); SetWindowTitle(caption.GetChars()); @@ -34,13 +36,21 @@ ErrorWindow::ErrorWindow() : Widget(nullptr, WidgetType::Window) LogView = new LogViewer(this); ClipboardButton = new PushButton(this); - RestartButton = new PushButton(this); - ClipboardButton->OnClick = [=]() { OnClipboardButtonClicked(); }; - RestartButton->OnClick = [=]() { OnRestartButtonClicked(); }; - ClipboardButton->SetText("Copy to clipboard"); - RestartButton->SetText("Restart"); + + if (minidump.empty()) + { + RestartButton = new PushButton(this); + RestartButton->OnClick = [=]() { OnRestartButtonClicked(); }; + RestartButton->SetText("Restart"); + } + else + { + SaveReportButton = new PushButton(this); + SaveReportButton->OnClick = [=]() { OnSaveReportButtonClicked(); }; + SaveReportButton->SetText("Save Report"); + } LogView->SetFocus(); } @@ -83,6 +93,37 @@ void ErrorWindow::OnRestartButtonClicked() DisplayWindow::ExitLoop(); } +void ErrorWindow::OnSaveReportButtonClicked() +{ + auto dialog = SaveFileDialog::Create(this); + dialog->AddFilter("Crash Report Zip Files", "*.zip"); + dialog->AddFilter("All Files", "*.*"); + dialog->SetFilename("CrashReport.zip"); + dialog->SetDefaultExtension("zip"); + if (dialog->Show()) + { + std::string filename = dialog->Filename(); + + mz_zip_archive zip = {}; + if (mz_zip_writer_init_heap(&zip, 0, 16 * 1024 * 1024)) + { + mz_zip_writer_add_mem(&zip, "minidump.dmp", minidump.data(), minidump.size(), MZ_DEFAULT_COMPRESSION); + mz_zip_writer_add_mem(&zip, "log.txt", clipboardtext.data(), clipboardtext.size(), MZ_DEFAULT_COMPRESSION); + } + void* buffer = nullptr; + size_t buffersize = 0; + mz_zip_writer_finalize_heap_archive(&zip, &buffer, &buffersize); + mz_zip_writer_end(&zip); + + std::unique_ptr f(FileWriter::Open(filename.c_str())); + if (f) + { + f->Write(buffer, buffersize); + f->Close(); + } + } +} + void ErrorWindow::OnClose() { Restart = false; @@ -96,7 +137,10 @@ void ErrorWindow::OnGeometryChanged() double y = GetHeight() - 15.0 - ClipboardButton->GetPreferredHeight(); ClipboardButton->SetFrameGeometry(20.0, y, 170.0, ClipboardButton->GetPreferredHeight()); - RestartButton->SetFrameGeometry(GetWidth() - 20.0 - 100.0, y, 100.0, RestartButton->GetPreferredHeight()); + if (RestartButton) + RestartButton->SetFrameGeometry(GetWidth() - 20.0 - 100.0, y, 100.0, RestartButton->GetPreferredHeight()); + else if (SaveReportButton) + SaveReportButton->SetFrameGeometry(GetWidth() - 20.0 - 100.0, y, 100.0, SaveReportButton->GetPreferredHeight()); y -= 20.0; LogView->SetFrameGeometry(Rect::xywh(0.0, 0.0, w, y)); diff --git a/src/common/widgets/errorwindow.h b/src/common/widgets/errorwindow.h index fe5b21029..1cb9b236d 100644 --- a/src/common/widgets/errorwindow.h +++ b/src/common/widgets/errorwindow.h @@ -10,9 +10,9 @@ class Scrollbar; class ErrorWindow : public Widget { public: - static bool ExecModal(const std::string& text, const std::string& log); + static bool ExecModal(const std::string& text, const std::string& log, std::vector minidump = {}); - ErrorWindow(); + ErrorWindow(std::vector minidump); bool Restart = false; @@ -25,11 +25,14 @@ private: void OnClipboardButtonClicked(); void OnRestartButtonClicked(); + void OnSaveReportButtonClicked(); LogViewer* LogView = nullptr; PushButton* ClipboardButton = nullptr; PushButton* RestartButton = nullptr; + PushButton* SaveReportButton = nullptr; + std::vector minidump; std::string clipboardtext; }; diff --git a/src/d_main.cpp b/src/d_main.cpp index 42ce5935b..df6770fe3 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -29,6 +29,8 @@ #ifdef _WIN32 #include +#define WIN32_MEAN_AND_LEAN +#include #endif #if defined(__unix__) || defined(__APPLE__) @@ -117,6 +119,7 @@ #include "screenjob.h" #include "startscreen.h" #include "shiftstate.h" +#include "common/widgets/errorwindow.h" #ifdef __unix__ #include "i_system.h" // for SHARE_DIR @@ -3717,6 +3720,49 @@ static int D_DoomMain_Internal (void) LoadHexFont(wad); // load hex font early so we have it during startup. InitWidgetResources(wad); + if (Args->CheckParm("-showcrashreport")) + { + FString minidumpFilename = Args->GetArg(2); + FString logFilename = Args->GetArg(3); + + FString logText; + { + FileReader fr; + if (fr.OpenFile(logFilename.GetChars())) + { + std::vector data(fr.GetLength() + 1); + if (fr.Read(data.data(), data.size() - 1) == (FileReader::Size)data.size() - 1) + { + logText = data.data(); + } + } + } + std::vector minidump; + { + FileReader fr; + if (fr.OpenFile(minidumpFilename.GetChars())) + { + minidump.resize(fr.GetLength()); + if (fr.Read(minidump.data(), minidump.size()) != (FileReader::Size)minidump.size()) + { + minidump.clear(); + } + } + } + + FString text; + text.Format("%s fatally crashed!", GAMENAME); + ErrorWindow::ExecModal(text.GetChars(), logText.GetChars(), std::move(minidump)); + + // Crash reporter only uses -showcrashreport on Windows at the moment and there seems to be no abstraction available + #ifdef WIN32 + DeleteFile(logFilename.WideString().c_str()); + DeleteFile(minidumpFilename.WideString().c_str()); + #endif + + return 0; + } + C_InitConsole(80*8, 25*8, false); I_DetectOS(); From a7a95f48003eef362aea3de8e18f265cbe0a5ac7 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 9 May 2024 21:27:46 +0200 Subject: [PATCH 073/414] According to people on the zdoom forum this isn't working properly. Since it isn't part of the other yml file it causes more trouble than it solves. --- .github/workflows/appimage.yml | 53 ---------------------------------- 1 file changed, 53 deletions(-) delete mode 100644 .github/workflows/appimage.yml diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml deleted file mode 100644 index 6fd30f38b..000000000 --- a/.github/workflows/appimage.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: App Image - -on: [push, pull_request] - -jobs: - build-appimage: - name: Linux Clang 12 | AppImage - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Install VKDoom dependencies - run: | - sudo apt-get update - sudo apt-get install clang-12 libsdl2-dev libvpx-dev libwebp-dev cmake -y - - name: Install appimage-builder dependencies - run: | - sudo apt-get install binutils coreutils desktop-file-utils fakeroot fuse libgdk-pixbuf2.0-dev patchelf -y - sudo apt-get install python3-pip python3-setuptools squashfs-tools strace util-linux zsync -y - sudo apt-get install imagemagick-6.q16hdri -y - - name: Install appimage-builder - run: | - python3 -m pip install --upgrade pip - pip install appimage-builder - - name: Build zmusic dependency - run: | - git clone -b 1.1.12 https://github.com/ZDoom/ZMusic.git zmusic_build - mkdir ./zmusic_build/build - cd ./zmusic_build/build - cmake -DCMAKE_BUILD_TYPE=Release .. - cmake --build . - cd ../../ - mkdir -p ./AppDir/zmusic/lib - mkdir ./AppDir/zmusic/include - mv ./zmusic_build/build/source/libzmusic* ./AppDir/zmusic/lib/ - mv ./zmusic_build/include/zmusic.h ./AppDir/zmusic/include/ - - name: Configure - run: cmake -B AppDir -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_PREFIX_PATH=`pwd`/AppDir/zmusic -DPK3_QUIET_ZIPDIR=ON -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 . - - name: Build - shell: bash - run: | - export MAKEFLAGS=--keep-going - cmake --build AppDir --config Release --parallel `nproc` - cp ./AppDir/zmusic/lib/* ./AppDir/ - mkdir -p ./AppDir/usr/share/icons - convert ./src/win32/icon1.ico[0] -flatten ./AppDir/usr/share/icons/game_icon.png - - name: Build AppImage - run: | - appimage-builder --skip-tests - - uses: actions/upload-artifact@v2 - with: - name: AppImage - path: './*.AppImage*' From cf7be6272108ec029711a8070faab7072b0c2eaa Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 9 May 2024 21:56:58 +0200 Subject: [PATCH 074/414] Create stripped PDB and include it in the nightly builds --- .github/workflows/continuous_integration.yml | 5 +++-- src/CMakeLists.txt | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 077734def..03cb9e05e 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -13,7 +13,7 @@ jobs: - name: Visual Studio 2022 os: windows-2022 extra_options: -DCMAKE_TOOLCHAIN_FILE=build/vcpkg/scripts/buildsystems/vcpkg.cmake - build_type: Release + build_type: RelWithDebInfo - name: Visual Studio 2022 os: windows-2022 @@ -103,6 +103,7 @@ jobs: if [[ "${{ runner.os }}" == 'Windows' ]]; then cp -r ${{ matrix.config.build_type }}/vkdoom.exe ${{ matrix.config.build_type }}/*.pk3 ${{ matrix.config.build_type }}/fm_banks ${{ matrix.config.build_type }}/soundfonts package cp ../bin/licenses.zip ../bin/windows/libsndfile/64bit/libsndfile-1.dll ../bin/windows/openal/64bit/openal32.dll ../bin/windows/zmusic/64bit/zmusic.dll package + cp ${{ matrix.config.build_type }}/vkdoom-stripped.pdb package/${{ matrix.config.build_type }}/vkdoom.pdb elif [[ "${{ runner.os }}" == 'macOS' ]]; then cp -r vkdoom.app package elif [[ "${{ runner.os }}" == 'Linux' ]]; then @@ -134,7 +135,7 @@ jobs: - name: Download Windows artifact uses: actions/download-artifact@v4 with: - name: Visual Studio 2022 Release + name: Visual Studio 2022 RelWithDebInfo path: build/vkdoom-windows-prerelease - name: Download Linux artifact diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b313c1faa..476fab429 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1328,6 +1328,9 @@ if( MSVC ) endif() set_target_properties(zdoom PROPERTIES LINK_FLAGS ${LINKERSTUFF}) + # Create stripped PDBs for nightly builds + set_target_properties(zdoom PROPERTIES LINK_FLAGS_RELWITHDEBINFO /PDBSTRIPPED:${ZDOOM_OUTPUT_DIR}/RelWithDebInfo/${ZDOOM_EXE_NAME}-stripped.pdb) + add_custom_command(TARGET zdoom POST_BUILD COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\common\\platform\\win32\\manifest.xml\" -outputresource:\"$\"\;\#1 COMMENT "Adding manifest..." From 316003dbf6885a9836d4b512b7ab1a02e626b47a Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 9 May 2024 22:06:36 +0200 Subject: [PATCH 075/414] Stop building packages for debug builds --- .github/workflows/continuous_integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 03cb9e05e..5d602700f 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -95,7 +95,7 @@ jobs: cmake --build build --config ${{ matrix.config.build_type }} --parallel 3 - name: Create Package - if: runner.os == 'Windows' || matrix.config.name == 'Linux GCC 12' + if: (runner.os == 'Windows' || matrix.config.name == 'Linux GCC 12') && matrix.config.build_type == 'RelWithDebInfo' shell: bash run: | cd build From 59ad52299e3a640f186d7911cf0e21bdc5005ef8 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 9 May 2024 22:14:06 +0200 Subject: [PATCH 076/414] Fix path in copy command --- .github/workflows/continuous_integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 5d602700f..ef538d78e 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -103,7 +103,7 @@ jobs: if [[ "${{ runner.os }}" == 'Windows' ]]; then cp -r ${{ matrix.config.build_type }}/vkdoom.exe ${{ matrix.config.build_type }}/*.pk3 ${{ matrix.config.build_type }}/fm_banks ${{ matrix.config.build_type }}/soundfonts package cp ../bin/licenses.zip ../bin/windows/libsndfile/64bit/libsndfile-1.dll ../bin/windows/openal/64bit/openal32.dll ../bin/windows/zmusic/64bit/zmusic.dll package - cp ${{ matrix.config.build_type }}/vkdoom-stripped.pdb package/${{ matrix.config.build_type }}/vkdoom.pdb + cp ${{ matrix.config.build_type }}/vkdoom-stripped.pdb package/vkdoom.pdb elif [[ "${{ runner.os }}" == 'macOS' ]]; then cp -r vkdoom.app package elif [[ "${{ runner.os }}" == 'Linux' ]]; then From b575ffd36d36f1c7fb0c6d15863fd99610e46019 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 10 May 2024 18:42:57 +0200 Subject: [PATCH 077/414] Add null pointer check for light->target --- src/rendering/hwrenderer/doom_levelmesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 2df459bba..6e02498b8 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -230,7 +230,7 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) meshlight.Origin = { (float)pos.X, (float)pos.Y, (float)pos.Z }; meshlight.RelativeOrigin = meshlight.Origin; meshlight.Radius = (float)light->GetRadius(); - meshlight.Intensity = (float)light->target->Alpha; + meshlight.Intensity = light->target ? (float)light->target->Alpha : 1.0f; if (light->IsSpot()) { meshlight.InnerAngleCos = (float)light->pSpotInnerAngle->Cos(); From da4752d7ec74534c4de3618894447f9fbcd58d06 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 10 May 2024 15:33:56 -0400 Subject: [PATCH 078/414] Fixed unmorphed Actors still ticking --- src/playsim/p_mobj.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 671a65238..d5fdf8574 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -3810,8 +3810,11 @@ void AActor::Tick () // Check for Actor unmorphing, but only on the thing that is the morphed Actor. // Players do their own special checking for this. - if (alternative != nullptr && !(flags & MF_UNMORPHED) && player == nullptr) + if (alternative != nullptr && player == nullptr) { + if (flags & MF_UNMORPHED) + return; + int res = false; IFVIRTUAL(AActor, CheckUnmorph) { From 92230626c15dc9384a6740db95b5249c6dc64564 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 12 May 2024 02:55:44 +0200 Subject: [PATCH 079/414] Add additional null pointer checks for spot lights --- src/rendering/hwrenderer/doom_levelmesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 6e02498b8..6d714f600 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -231,7 +231,7 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) meshlight.RelativeOrigin = meshlight.Origin; meshlight.Radius = (float)light->GetRadius(); meshlight.Intensity = light->target ? (float)light->target->Alpha : 1.0f; - if (light->IsSpot()) + if (light->IsSpot() && light->pSpotInnerAngle && light->pSpotOuterAngle && light->pPitch && light->target) { meshlight.InnerAngleCos = (float)light->pSpotInnerAngle->Cos(); meshlight.OuterAngleCos = (float)light->pSpotOuterAngle->Cos(); From 147a136e27f8a740c0d27843ef8b56e9fabe3448 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Tue, 14 May 2024 00:19:52 +0200 Subject: [PATCH 080/414] Add startscreen_console cvar for showing the console during loading instead of the start screen --- src/common/console/c_console.cpp | 3 +++ src/common/startscreen/startscreen.cpp | 35 +++++++++++++++++--------- src/d_main.cpp | 7 ++++-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/common/console/c_console.cpp b/src/common/console/c_console.cpp index 44c8ffacf..7668f73bb 100644 --- a/src/common/console/c_console.cpp +++ b/src/common/console/c_console.cpp @@ -563,6 +563,9 @@ void C_DrawConsole () static int oldbottom = 0; int lines, left, offset; + if (!CurrentConsoleFont) + return; + int textScale = active_con_scale(twod); left = LEFTMARGIN; diff --git a/src/common/startscreen/startscreen.cpp b/src/common/startscreen/startscreen.cpp index 82fa28f02..47050bf05 100644 --- a/src/common/startscreen/startscreen.cpp +++ b/src/common/startscreen/startscreen.cpp @@ -49,6 +49,9 @@ #include "v_draw.h" #include "g_input.h" #include "texturemanager.h" +#include "c_console.h" + +CVAR(Bool, startscreen_console, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); // Text mode color values enum{ @@ -670,22 +673,30 @@ void FStartScreen::Render(bool force) float displayheight; twod->Begin(screen->GetWidth(), screen->GetHeight()); - // At this point the shader for untextured rendering has not been loaded yet, so we got to clear the screen by rendering a texture with black color. - DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, StartupTexture->GetDisplayWidth(), DTA_VirtualHeightF, StartupTexture->GetDisplayHeight(), DTA_KeepRatio, true, DTA_Color, PalEntry(255,0,0,0), TAG_END); - - if (HeaderTexture) + if (startscreen_console) { - displaywidth = HeaderTexture->GetDisplayWidth(); - displayheight = HeaderTexture->GetDisplayHeight() + StartupTexture->GetDisplayHeight(); - DrawTexture(twod, HeaderTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); - DrawTexture(twod, StartupTexture, 0, 32, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); - if (NetMaxPos >= 0) DrawTexture(twod, NetTexture, 0, displayheight - 16, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + C_FullConsole(); + C_DrawConsole(); } else { - displaywidth = StartupTexture->GetDisplayWidth(); - displayheight = StartupTexture->GetDisplayHeight(); - DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + // At this point the shader for untextured rendering has not been loaded yet, so we got to clear the screen by rendering a texture with black color. + DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, StartupTexture->GetDisplayWidth(), DTA_VirtualHeightF, StartupTexture->GetDisplayHeight(), DTA_KeepRatio, true, DTA_Color, PalEntry(255, 0, 0, 0), TAG_END); + + if (HeaderTexture) + { + displaywidth = HeaderTexture->GetDisplayWidth(); + displayheight = HeaderTexture->GetDisplayHeight() + StartupTexture->GetDisplayHeight(); + DrawTexture(twod, HeaderTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + DrawTexture(twod, StartupTexture, 0, 32, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + if (NetMaxPos >= 0) DrawTexture(twod, NetTexture, 0, displayheight - 16, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + } + else + { + displaywidth = StartupTexture->GetDisplayWidth(); + displayheight = StartupTexture->GetDisplayHeight(); + DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + } } twod->End(); diff --git a/src/d_main.cpp b/src/d_main.cpp index df6770fe3..a577b2866 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -3307,7 +3307,11 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw } TexMan.Init(); - + + // Init fonts and console earlier as the start screen might display it + V_InitFonts(); + C_InitConsole(SCREENWIDTH, SCREENHEIGHT, false); + if (!batchrun) Printf ("V_Init: allocate screen.\n"); if (!restart) { @@ -3376,7 +3380,6 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw StartWindow->Progress(); if (StartScreen) StartScreen->Progress(1); - V_InitFonts(); InitDoomFonts(); V_LoadTranslations(); UpdateGenericUI(false); From a0d15768bb8bee237d355f30e604177fc3592c9d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 14 May 2024 10:52:16 +0200 Subject: [PATCH 081/414] Revert "Add startscreen_console cvar for showing the console during loading instead of the start screen" This reverts commit 147a136e27f8a740c0d27843ef8b56e9fabe3448. --- src/common/console/c_console.cpp | 3 --- src/common/startscreen/startscreen.cpp | 35 +++++++++----------------- src/d_main.cpp | 7 ++---- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/common/console/c_console.cpp b/src/common/console/c_console.cpp index 7668f73bb..44c8ffacf 100644 --- a/src/common/console/c_console.cpp +++ b/src/common/console/c_console.cpp @@ -563,9 +563,6 @@ void C_DrawConsole () static int oldbottom = 0; int lines, left, offset; - if (!CurrentConsoleFont) - return; - int textScale = active_con_scale(twod); left = LEFTMARGIN; diff --git a/src/common/startscreen/startscreen.cpp b/src/common/startscreen/startscreen.cpp index 47050bf05..82fa28f02 100644 --- a/src/common/startscreen/startscreen.cpp +++ b/src/common/startscreen/startscreen.cpp @@ -49,9 +49,6 @@ #include "v_draw.h" #include "g_input.h" #include "texturemanager.h" -#include "c_console.h" - -CVAR(Bool, startscreen_console, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); // Text mode color values enum{ @@ -673,30 +670,22 @@ void FStartScreen::Render(bool force) float displayheight; twod->Begin(screen->GetWidth(), screen->GetHeight()); - if (startscreen_console) + // At this point the shader for untextured rendering has not been loaded yet, so we got to clear the screen by rendering a texture with black color. + DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, StartupTexture->GetDisplayWidth(), DTA_VirtualHeightF, StartupTexture->GetDisplayHeight(), DTA_KeepRatio, true, DTA_Color, PalEntry(255,0,0,0), TAG_END); + + if (HeaderTexture) { - C_FullConsole(); - C_DrawConsole(); + displaywidth = HeaderTexture->GetDisplayWidth(); + displayheight = HeaderTexture->GetDisplayHeight() + StartupTexture->GetDisplayHeight(); + DrawTexture(twod, HeaderTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + DrawTexture(twod, StartupTexture, 0, 32, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); + if (NetMaxPos >= 0) DrawTexture(twod, NetTexture, 0, displayheight - 16, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); } else { - // At this point the shader for untextured rendering has not been loaded yet, so we got to clear the screen by rendering a texture with black color. - DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, StartupTexture->GetDisplayWidth(), DTA_VirtualHeightF, StartupTexture->GetDisplayHeight(), DTA_KeepRatio, true, DTA_Color, PalEntry(255, 0, 0, 0), TAG_END); - - if (HeaderTexture) - { - displaywidth = HeaderTexture->GetDisplayWidth(); - displayheight = HeaderTexture->GetDisplayHeight() + StartupTexture->GetDisplayHeight(); - DrawTexture(twod, HeaderTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); - DrawTexture(twod, StartupTexture, 0, 32, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); - if (NetMaxPos >= 0) DrawTexture(twod, NetTexture, 0, displayheight - 16, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); - } - else - { - displaywidth = StartupTexture->GetDisplayWidth(); - displayheight = StartupTexture->GetDisplayHeight(); - DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); - } + displaywidth = StartupTexture->GetDisplayWidth(); + displayheight = StartupTexture->GetDisplayHeight(); + DrawTexture(twod, StartupTexture, 0, 0, DTA_VirtualWidthF, displaywidth, DTA_VirtualHeightF, displayheight, TAG_END); } twod->End(); diff --git a/src/d_main.cpp b/src/d_main.cpp index a577b2866..df6770fe3 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -3307,11 +3307,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw } TexMan.Init(); - - // Init fonts and console earlier as the start screen might display it - V_InitFonts(); - C_InitConsole(SCREENWIDTH, SCREENHEIGHT, false); - + if (!batchrun) Printf ("V_Init: allocate screen.\n"); if (!restart) { @@ -3380,6 +3376,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw StartWindow->Progress(); if (StartScreen) StartScreen->Progress(1); + V_InitFonts(); InitDoomFonts(); V_LoadTranslations(); UpdateGenericUI(false); From 6d8bee9316223dee577239975168a7308afc454c Mon Sep 17 00:00:00 2001 From: Xaser Acheron Date: Mon, 10 Apr 2023 22:18:41 -0500 Subject: [PATCH 082/414] don't show secret-flagged linedefs with special color on am_cheat 4 and above --- src/am_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 48bc53823..6ee8165da 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2624,7 +2624,7 @@ void DAutomap::drawWalls (bool allmap) } else if (line.flags & ML_SECRET) { // secret door - if (am_cheat != 0 && line.backsector != nullptr) + if (am_cheat != 0 && am_cheat < 4 && line.backsector != nullptr) drawMline(&l, AMColors.SecretWallColor); else drawMline(&l, AMColors.WallColor); From 1dedcee7391370f919b38ce2a5c95728ba1a9d4e Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Sat, 18 May 2024 10:24:00 +0200 Subject: [PATCH 083/414] Provide a diagnostic message for the two 32-bit related static_asserts --- src/common/engine/i_interface.cpp | 8 +++++++- src/playsim/p_effect.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/common/engine/i_interface.cpp b/src/common/engine/i_interface.cpp index 7030194ea..dfedbe8ee 100644 --- a/src/common/engine/i_interface.cpp +++ b/src/common/engine/i_interface.cpp @@ -6,7 +6,13 @@ #include "gstrings.h" #include "version.h" -static_assert(sizeof(void*) == 8, "32 builds are not supported"); +static_assert(sizeof(void*) == 8, + "Only LP64/LLP64 builds are officially supported. " + "Please do not attempt to build for other platforms; " + "even if the program succeeds in a MAP01 smoke test, " + "there are e.g. known visual artifacts " + " " + "that lead to a bad user experience."); // Some global engine variables taken out of the backend code. FStartupScreen* StartWindow; diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index 374aeecfc..c87aa2c7d 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -88,7 +88,7 @@ struct particle_t FStandaloneAnimation animData; //+16 = 128 }; -static_assert(sizeof(particle_t) == 128); +static_assert(sizeof(particle_t) == 128, "Only LP64/LLP64 is supported"); const uint16_t NO_PARTICLE = 0xffff; From e7f06ab1a30b683ba8f90e4d52ed989dd8ef34ee Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 18 May 2024 17:31:07 +0200 Subject: [PATCH 084/414] Modify the volume defaults and total maximum volume in such a way that if a user puts everything on maximum the chance of audio clipping is reduced --- src/common/audio/music/i_music.cpp | 4 ++-- src/common/audio/sound/i_sound.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/common/audio/music/i_music.cpp b/src/common/audio/music/i_music.cpp index d190537d4..6623ad790 100644 --- a/src/common/audio/music/i_music.cpp +++ b/src/common/audio/music/i_music.cpp @@ -70,7 +70,7 @@ int nomusic = 0; // Maximum volume of MOD/stream music. //========================================================================== -CUSTOM_CVARD(Float, snd_musicvolume, 0.5, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "controls music volume") +CUSTOM_CVARD(Float, snd_musicvolume, 1.0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "controls music volume") { if (self < 0.f) self = 0.f; @@ -82,7 +82,7 @@ CUSTOM_CVARD(Float, snd_musicvolume, 0.5, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "contr ChangeMusicSetting(zmusic_snd_musicvolume, nullptr, self); if (GSnd != nullptr) { - GSnd->SetMusicVolume(clamp(self * relative_volume * snd_mastervolume, 0, 1)); + GSnd->SetMusicVolume(clamp(self * relative_volume * snd_mastervolume * 0.5f, 0, 1)); } // For music not implemented through the digital sound system, // let them know about the change. diff --git a/src/common/audio/sound/i_sound.cpp b/src/common/audio/sound/i_sound.cpp index 7d6acef96..81c8f1d11 100644 --- a/src/common/audio/sound/i_sound.cpp +++ b/src/common/audio/sound/i_sound.cpp @@ -88,14 +88,14 @@ void I_CloseSound (); // Maximum volume of all audio //========================================================================== -CUSTOM_CVAR(Float, snd_mastervolume, 0.5f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +CUSTOM_CVAR(Float, snd_mastervolume, 1.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { if (self < 0.f) self = 0.f; else if (self > 1.f) self = 1.f; - ChangeMusicSetting(zmusic_snd_mastervolume, nullptr, self); + ChangeMusicSetting(zmusic_snd_mastervolume, nullptr, self * 0.5f); snd_sfxvolume->Callback(); snd_musicvolume->Callback(); } @@ -107,7 +107,7 @@ CUSTOM_CVAR(Float, snd_mastervolume, 0.5f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CV // Maximum volume of a sound effect. //========================================================================== -CUSTOM_CVAR (Float, snd_sfxvolume, 0.5f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) +CUSTOM_CVAR (Float, snd_sfxvolume, 1.0f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) { if (self < 0.f) self = 0.f; @@ -115,7 +115,7 @@ CUSTOM_CVAR (Float, snd_sfxvolume, 0.5f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOI self = 1.f; else if (GSnd != NULL) { - GSnd->SetSfxVolume (self * snd_mastervolume); + GSnd->SetSfxVolume (self * snd_mastervolume * 0.25f); } } From 6dd59c7787066c52b5df726a2521cca186033546 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 19 May 2024 12:59:46 +0200 Subject: [PATCH 085/414] Make the volume multipliers a little less aggressive --- src/common/audio/music/i_music.cpp | 2 +- src/common/audio/sound/i_sound.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/audio/music/i_music.cpp b/src/common/audio/music/i_music.cpp index 6623ad790..b30a27f13 100644 --- a/src/common/audio/music/i_music.cpp +++ b/src/common/audio/music/i_music.cpp @@ -82,7 +82,7 @@ CUSTOM_CVARD(Float, snd_musicvolume, 1.0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "contr ChangeMusicSetting(zmusic_snd_musicvolume, nullptr, self); if (GSnd != nullptr) { - GSnd->SetMusicVolume(clamp(self * relative_volume * snd_mastervolume * 0.5f, 0, 1)); + GSnd->SetMusicVolume(clamp(self * relative_volume * snd_mastervolume * 0.75f, 0, 1)); } // For music not implemented through the digital sound system, // let them know about the change. diff --git a/src/common/audio/sound/i_sound.cpp b/src/common/audio/sound/i_sound.cpp index 81c8f1d11..f859ae0a8 100644 --- a/src/common/audio/sound/i_sound.cpp +++ b/src/common/audio/sound/i_sound.cpp @@ -95,7 +95,7 @@ CUSTOM_CVAR(Float, snd_mastervolume, 1.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CV else if (self > 1.f) self = 1.f; - ChangeMusicSetting(zmusic_snd_mastervolume, nullptr, self * 0.5f); + ChangeMusicSetting(zmusic_snd_mastervolume, nullptr, self * 0.75f); snd_sfxvolume->Callback(); snd_musicvolume->Callback(); } @@ -115,7 +115,7 @@ CUSTOM_CVAR (Float, snd_sfxvolume, 1.0f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOI self = 1.f; else if (GSnd != NULL) { - GSnd->SetSfxVolume (self * snd_mastervolume * 0.25f); + GSnd->SetSfxVolume (self * snd_mastervolume * 0.50f); } } From ffbbe0a4c6b155db91c0160ce47a63588b43a4ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Mon, 20 May 2024 16:08:13 -0300 Subject: [PATCH 086/414] partial fix for `FString::IsInt()` --- src/common/utility/zstring.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/common/utility/zstring.cpp b/src/common/utility/zstring.cpp index ecd0dc7e6..488c09eb6 100644 --- a/src/common/utility/zstring.cpp +++ b/src/common/utility/zstring.cpp @@ -1089,6 +1089,12 @@ octdigits = [0-7]; ("0" octdigits+ | "0" [xX] hexdigits+ | (digits \ '0') digits*) { return true; } [\000-\377] { return false; }*/ + + //FIX for "0" returning false, doesn't fix 0 with whitespace, but that isn't necessary for savegame loading, so it'll need to be fixed later + if(Len() == 1 && Chars[0] == '0') return true; + + + const char *YYCURSOR = Chars; char yych; From cf8a04c457988b4cf01626802fe6e6490931b7a6 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 21 May 2024 03:09:21 -0400 Subject: [PATCH 087/414] - simplify squishing to square pixels for particles and rollsprites --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index cd2100e3f..c06812858 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -1004,7 +1004,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t if (thing->renderflags & (RF_ROLLSPRITE|RF_FLATSPRITE)) { double ps = di->Level->pixelstretch; - double mult = 2 * ps / (ps * ps + 1); // shrink slightly + double mult = 1.0 / sqrt(ps); // shrink slightly r.Scale(mult * ps, mult); } @@ -1452,7 +1452,7 @@ void HWSprite::ProcessParticle(HWDrawInfo *di, particle_t *particle, sector_t *s float ps = di->Level->pixelstretch; - scalefac *= 2 * ps / (ps * ps + 1); // shrink it slightly to account for the stretch + scalefac /= sqrt(ps); // shrink it slightly to account for the stretch float viewvecX = vp.ViewVector.X * scalefac * ps; float viewvecY = vp.ViewVector.Y * scalefac; @@ -1527,7 +1527,7 @@ void HWSprite::AdjustVisualThinker(HWDrawInfo* di, DVisualThinker* spr, sector_t if (spr->PT.flags & SPF_ROLL) { double ps = di->Level->pixelstretch; - double mult = 2 * ps / (ps * ps + 1); // shrink slightly + double mult = 1.0 / sqrt(ps); // shrink slightly r.Scale(mult * ps, mult); } From 3bc54d3757dc866d1509f29dd4bc3e4614441d53 Mon Sep 17 00:00:00 2001 From: Kartinea Date: Mon, 6 May 2024 16:08:41 -0700 Subject: [PATCH 088/414] Fix invisibility affect on enemies When performing the ShadowBlock check, we previously would return a nullptr actor if nothing was between the monster and the player. This resulted in the monster aiming as if you didn't have invisibility. Fall back to returning the target actor if it is shadowed but nothing is in between the two. --- src/playsim/shadowinlines.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/playsim/shadowinlines.h b/src/playsim/shadowinlines.h index 60caa9506..574abd251 100644 --- a/src/playsim/shadowinlines.h +++ b/src/playsim/shadowinlines.h @@ -85,7 +85,12 @@ inline bool AffectedByShadows(AActor* self) inline AActor* CheckForShadows(AActor* self, AActor* other, DVector3 pos, double& penaltyFactor) { - return ((other && (other->flags & MF_SHADOW)) || (self->flags9 & MF9_DOSHADOWBLOCK)) ? P_CheckForShadowBlock(self, other, pos, penaltyFactor) : nullptr; + if ((other && (other->flags & MF_SHADOW)) || (self->flags9 & MF9_DOSHADOWBLOCK)) + { + AActor* shadowBlock = P_CheckForShadowBlock(self, other, pos, penaltyFactor); + return shadowBlock ? shadowBlock : other; + } + return nullptr; } inline AActor* PerformShadowChecks(AActor* self, AActor* other, DVector3 pos, double& penaltyFactor) From d24d5ae2c8f9d22bbbd5e2a9f7e0059f50b0bcef Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 26 May 2024 00:14:44 +0200 Subject: [PATCH 089/414] Update to latest ZWidget --- .../ZWidget/include/zwidget/core/widget.h | 23 +- .../zwidget/widgets/imagebox/imagebox.h | 1 + .../include/zwidget/widgets/menubar/menubar.h | 84 +++++++ .../ZWidget/include/zwidget/window/window.h | 5 +- libraries/ZWidget/src/core/canvas.cpp | 90 ++++++++ libraries/ZWidget/src/core/theme.cpp | 46 +++- libraries/ZWidget/src/core/widget.cpp | 52 ++++- .../widgets/checkboxlabel/checkboxlabel.cpp | 18 +- .../ZWidget/src/widgets/imagebox/imagebox.cpp | 8 + .../ZWidget/src/widgets/lineedit/lineedit.cpp | 2 +- .../ZWidget/src/widgets/menubar/menubar.cpp | 205 +++++++++++++++++- .../src/window/sdl2/sdl2displaywindow.cpp | 25 ++- .../src/window/sdl2/sdl2displaywindow.h | 5 +- .../src/window/win32/win32displaywindow.cpp | 35 ++- .../src/window/win32/win32displaywindow.h | 5 +- libraries/ZWidget/src/window/window.cpp | 10 +- 16 files changed, 578 insertions(+), 36 deletions(-) diff --git a/libraries/ZWidget/include/zwidget/core/widget.h b/libraries/ZWidget/include/zwidget/core/widget.h index 43f9094b4..747edc8a4 100644 --- a/libraries/ZWidget/include/zwidget/core/widget.h +++ b/libraries/ZWidget/include/zwidget/core/widget.h @@ -41,10 +41,23 @@ public: // Widget noncontent area void SetNoncontentSizes(double left, double top, double right, double bottom); - double GetNoncontentLeft() const { return GetStyleDouble("noncontent-left"); } - double GetNoncontentTop() const { return GetStyleDouble("noncontent-top"); } - double GetNoncontentRight() const { return GetStyleDouble("noncontent-right"); } - double GetNoncontentBottom() const { return GetStyleDouble("noncontent-bottom"); } + double GetNoncontentLeft() const { return GridFitSize(GetStyleDouble("noncontent-left")); } + double GetNoncontentTop() const { return GridFitSize(GetStyleDouble("noncontent-top")); } + double GetNoncontentRight() const { return GridFitSize(GetStyleDouble("noncontent-right")); } + double GetNoncontentBottom() const { return GridFitSize(GetStyleDouble("noncontent-bottom")); } + + // Get the DPI scale factor for the window the widget is located on + double GetDpiScale() const; + + // Align point to the nearest physical screen pixel + double GridFitPoint(double p) const; + Point GridFitPoint(double x, double y) const { return GridFitPoint(Point(x, y)); } + Point GridFitPoint(Point p) const { return Point(GridFitPoint(p.x), GridFitPoint(p.y)); } + + // Convert size to exactly covering physical screen pixels + double GridFitSize(double s) const; + Size GridFitSize(double w, double h) const { return GridFitSize(Size(w, h)); } + Size GridFitSize(Size s) const { return Size(GridFitSize(s.width), GridFitSize(s.height)); } // Widget frame box Rect GetFrameGeometry() const; @@ -108,7 +121,7 @@ public: std::string GetClipboardText(); void SetClipboardText(const std::string& text); - Widget* Window(); + Widget* Window() const; Canvas* GetCanvas() const; Widget* ChildAt(double x, double y) { return ChildAt(Point(x, y)); } Widget* ChildAt(const Point& pos); diff --git a/libraries/ZWidget/include/zwidget/widgets/imagebox/imagebox.h b/libraries/ZWidget/include/zwidget/widgets/imagebox/imagebox.h index e3a724381..7d3aa520e 100644 --- a/libraries/ZWidget/include/zwidget/widgets/imagebox/imagebox.h +++ b/libraries/ZWidget/include/zwidget/widgets/imagebox/imagebox.h @@ -11,6 +11,7 @@ public: void SetImage(std::shared_ptr newImage); + double GetPreferredWidth() const; double GetPreferredHeight() const; protected: diff --git a/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h b/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h index 9c13283cc..d9f084393 100644 --- a/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h +++ b/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h @@ -2,6 +2,13 @@ #pragma once #include "../../core/widget.h" +#include "../textlabel/textlabel.h" +#include "../imagebox/imagebox.h" + +class Menu; +class MenubarItem; +class MenuItem; +class MenuItemSeparator; class Menubar : public Widget { @@ -9,6 +16,83 @@ public: Menubar(Widget* parent); ~Menubar(); + MenubarItem* AddItem(std::string text, std::function onOpen, bool alignRight = false); + +protected: + void OnGeometryChanged() override; + +private: + void ShowMenu(MenubarItem* item); + void CloseMenu(); + + std::vector menuItems; + Menu* openMenu = nullptr; + + friend class MenubarItem; +}; + +class MenubarItem : public Widget +{ +public: + MenubarItem(Menubar* menubar, std::string text, bool alignRight); + + void SetOpenCallback(std::function callback) { onOpen = std::move(callback); } + const std::function& GetOpenCallback() const { return onOpen; } + + double GetPreferredWidth() const; + + bool AlignRight = false; + protected: void OnPaint(Canvas* canvas) override; + bool OnMouseDown(const Point& pos, InputKey key) override; + bool OnMouseUp(const Point& pos, InputKey key) override; + void OnMouseMove(const Point& pos) override; + void OnMouseLeave() override; + +private: + Menubar* menubar = nullptr; + std::function onOpen; + std::string text; +}; + +class Menu : public Widget +{ +public: + Menu(Widget* parent); + + void SetLeftPosition(const Point& globalPos); + void SetRightPosition(const Point& globalPos); + MenuItem* AddItem(std::shared_ptr icon, std::string text, std::function onClick = {}); + MenuItemSeparator* AddSeparator(); + + double GetPreferredWidth() const; + double GetPreferredHeight() const; + +protected: + void OnGeometryChanged() override; + + std::function onCloseMenu; + + friend class Menubar; +}; + +class MenuItem : public Widget +{ +public: + MenuItem(Widget* parent); + + ImageBox* icon = nullptr; + TextLabel* text = nullptr; + +protected: + void OnMouseMove(const Point& pos) override; + void OnMouseLeave() override; + void OnGeometryChanged() override; +}; + +class MenuItemSeparator : public Widget +{ +public: + MenuItemSeparator(Widget* parent); }; diff --git a/libraries/ZWidget/include/zwidget/window/window.h b/libraries/ZWidget/include/zwidget/window/window.h index 8515f5004..538c7041d 100644 --- a/libraries/ZWidget/include/zwidget/window/window.h +++ b/libraries/ZWidget/include/zwidget/window/window.h @@ -118,7 +118,7 @@ public: class DisplayWindow { public: - static std::unique_ptr Create(DisplayWindowHost* windowHost); + static std::unique_ptr Create(DisplayWindowHost* windowHost, bool popupWindow); static void ProcessEvents(); static void RunLoop(); @@ -157,6 +157,9 @@ public: virtual int GetPixelHeight() const = 0; virtual double GetDpiScale() const = 0; + virtual Point MapFromGlobal(const Point& pos) const = 0; + virtual Point MapToGlobal(const Point& pos) const = 0; + virtual void SetBorderColor(uint32_t bgra8) = 0; virtual void SetCaptionColor(uint32_t bgra8) = 0; virtual void SetCaptionTextColor(uint32_t bgra8) = 0; diff --git a/libraries/ZWidget/src/core/canvas.cpp b/libraries/ZWidget/src/core/canvas.cpp index eab9f0eea..437c25f02 100644 --- a/libraries/ZWidget/src/core/canvas.cpp +++ b/libraries/ZWidget/src/core/canvas.cpp @@ -765,6 +765,95 @@ void BitmapCanvas::drawGlyph(CanvasTexture* texture, float left, float top, floa if (x1 <= x0 || y1 <= y0) return; +#if 1 // Use gamma correction + + // To linear + float cred = color.r * color.r; // std::pow(color.r, 2.2f); + float cgreen = color.g * color.g; // std::pow(color.g, 2.2f); + float cblue = color.b * color.b; // std::pow(color.b, 2.2f); +#ifdef USE_SSE2 + __m128 crgba = _mm_set_ps(0.0f, cred, cgreen, cblue); +#endif + + float uscale = uvwidth / width; + float vscale = uvheight / height; + + for (int y = y0; y < y1; y++) + { + float vpix = v + vscale * (y + 0.5f - top); + const uint32_t* sline = src + ((int)vpix) * swidth; + uint32_t* dline = dest + y * dwidth; + + int x = x0; +#ifdef USE_SSE2 + while (x < x1) + { + float upix = u + uscale * (x + 0.5f - left); + __m128i spixel = _mm_cvtsi32_si128(sline[(int)upix]); + spixel = _mm_unpacklo_epi8(spixel, _mm_setzero_si128()); + spixel = _mm_unpacklo_epi16(spixel, _mm_setzero_si128()); + __m128 srgba = _mm_mul_ps(_mm_cvtepi32_ps(spixel), _mm_set_ps1(1.0f / 255.0f)); + + __m128i dpixel = _mm_cvtsi32_si128(dline[x]); + dpixel = _mm_unpacklo_epi8(dpixel, _mm_setzero_si128()); + dpixel = _mm_unpacklo_epi16(dpixel, _mm_setzero_si128()); + __m128 drgba = _mm_mul_ps(_mm_cvtepi32_ps(dpixel), _mm_set_ps1(1.0f / 255.0f)); + + // To linear + drgba = _mm_mul_ps(drgba, drgba); + + // dest.rgb = color.rgb * src.rgb + dest.rgb * (1-src.rgb) + __m128 frgba = _mm_add_ps(_mm_mul_ps(crgba, srgba), _mm_mul_ps(drgba, _mm_sub_ps(_mm_set_ps1(1.0f), srgba))); + + // To srgb + frgba = _mm_sqrt_ps(frgba); + + __m128i rgba = _mm_cvtps_epi32(_mm_add_ps(_mm_mul_ps(frgba, _mm_set_ps1(255.0f)), _mm_set_ps1(0.5f))); + rgba = _mm_packs_epi32(rgba, _mm_setzero_si128()); + rgba = _mm_packus_epi16(rgba, _mm_setzero_si128()); + dline[x] = ((uint32_t)_mm_cvtsi128_si32(rgba)) | 0xff000000; + x++; + } +#else + while (x < x1) + { + float upix = u + uscale * (x + 0.5f - left); + uint32_t spixel = sline[(int)upix]; + float sred = ((spixel >> 16) & 0xff) * (1.0f / 255.0f); + float sgreen = ((spixel >> 8) & 0xff) * (1.0f / 255.0f); + float sblue = (spixel & 0xff) * (1.0f / 255.0f); + + uint32_t dpixel = dline[x]; + float dred = ((dpixel >> 16) & 0xff) * (1.0f / 255.0f); + float dgreen = ((dpixel >> 8) & 0xff) * (1.0f / 255.0f); + float dblue = (dpixel & 0xff) * (1.0f / 255.0f); + + // To linear + dred = dred * dred; // std::pow(dred, 2.2f); + dgreen = dgreen * dgreen; // std::pow(dgreen, 2.2f); + dblue = dblue * dblue; // std::pow(dblue, 2.2f); + + // dest.rgb = color.rgb * src.rgb + dest.rgb * (1-src.rgb) + double fr = cred * sred + dred * (1.0f - sred); + double fg = cgreen * sgreen + dgreen * (1.0f - sgreen); + double fb = cblue * sblue + dblue * (1.0f - sblue); + + // To srgb + fr = std::sqrt(fr); // std::pow(fr, 1.0f / 2.2f); + fg = std::sqrt(fg); // std::pow(fg, 1.0f / 2.2f); + fb = std::sqrt(fb); // std::pow(fb, 1.0f / 2.2f); + + uint32_t r = (int)(fr * 255.0f + 0.5f); + uint32_t g = (int)(fg * 255.0f + 0.5f); + uint32_t b = (int)(fb * 255.0f + 0.5f); + dline[x] = 0xff000000 | (r << 16) | (g << 8) | b; + x++; + } +#endif + } + +#else + uint32_t cred = (int32_t)clamp(color.r * 255.0f, 0.0f, 255.0f); uint32_t cgreen = (int32_t)clamp(color.g * 255.0f, 0.0f, 255.0f); uint32_t cblue = (int32_t)clamp(color.b * 255.0f, 0.0f, 255.0f); @@ -832,6 +921,7 @@ void BitmapCanvas::drawGlyph(CanvasTexture* texture, float left, float top, floa x++; } } +#endif } void BitmapCanvas::begin(const Colorf& color) diff --git a/libraries/ZWidget/src/core/theme.cpp b/libraries/ZWidget/src/core/theme.cpp index f30bffdf2..b92839989 100644 --- a/libraries/ZWidget/src/core/theme.cpp +++ b/libraries/ZWidget/src/core/theme.cpp @@ -102,14 +102,16 @@ void BasicWidgetStyle::Paint(Widget* widget, Canvas* canvas, Size size) Colorf borderright = widget->GetStyleColor("border-right-color"); Colorf borderbottom = widget->GetStyleColor("border-bottom-color"); + double borderwidth = widget->GridFitSize(1.0); + if (bordertop.a > 0.0f) - canvas->fillRect(Rect::xywh(0.0, 0.0, size.width, 1.0), bordertop); + canvas->fillRect(Rect::xywh(0.0, 0.0, size.width, borderwidth), bordertop); if (borderbottom.a > 0.0f) - canvas->fillRect(Rect::xywh(0.0, size.height - 1.0, size.width, 1.0), borderbottom); + canvas->fillRect(Rect::xywh(0.0, size.height - borderwidth, size.width, borderwidth), borderbottom); if (borderleft.a > 0.0f) - canvas->fillRect(Rect::xywh(0.0, 0.0, 1.0, size.height - 0.0), borderleft); + canvas->fillRect(Rect::xywh(0.0, 0.0, borderwidth, size.height), borderleft); if (borderright.a > 0.0f) - canvas->fillRect(Rect::xywh(size.width - 1.0, 0.0, 1.0, size.height - 0.0), borderright); + canvas->fillRect(Rect::xywh(size.width - borderwidth, 0.0, borderwidth, size.height), borderright); } ///////////////////////////////////////////////////////////////////////////// @@ -154,6 +156,9 @@ DarkWidgetTheme::DarkWidgetTheme() auto tabbar_tab = RegisterStyle(std::make_unique(widget), "tabbar-tab"); auto tabwidget_stack = RegisterStyle(std::make_unique(widget), "tabwidget-stack"); auto checkbox_label = RegisterStyle(std::make_unique(widget), "checkbox-label"); + auto menubaritem = RegisterStyle(std::make_unique(widget), "menubaritem"); + auto menu = RegisterStyle(std::make_unique(widget), "menu"); + auto menuitem = RegisterStyle(std::make_unique(widget), "menuitem"); widget->SetString("font-family", "NotoSans"); widget->SetColor("color", Colorf::fromRgba8(226, 223, 219)); @@ -229,6 +234,21 @@ DarkWidgetTheme::DarkWidgetTheme() checkbox_label->SetColor("checked-color", Colorf::fromRgba8(226, 223, 219)); checkbox_label->SetColor("unchecked-outer-border-color", Colorf::fromRgba8(99, 99, 99)); checkbox_label->SetColor("unchecked-inner-border-color", Colorf::fromRgba8(51, 51, 51)); + + menubaritem->SetColor("hover", "background-color", Colorf::fromRgba8(78, 78, 78)); + menubaritem->SetColor("down", "background-color", Colorf::fromRgba8(88, 88, 88)); + + menu->SetDouble("noncontent-left", 5.0); + menu->SetDouble("noncontent-top", 5.0); + menu->SetDouble("noncontent-right", 5.0); + menu->SetDouble("noncontent-bottom", 5.0); + menu->SetColor("border-left-color", Colorf::fromRgba8(100, 100, 100)); + menu->SetColor("border-top-color", Colorf::fromRgba8(100, 100, 100)); + menu->SetColor("border-right-color", Colorf::fromRgba8(100, 100, 100)); + menu->SetColor("border-bottom-color", Colorf::fromRgba8(100, 100, 100)); + + menuitem->SetColor("hover", "background-color", Colorf::fromRgba8(78, 78, 78)); + menuitem->SetColor("down", "background-color", Colorf::fromRgba8(88, 88, 88)); } ///////////////////////////////////////////////////////////////////////////// @@ -246,6 +266,9 @@ LightWidgetTheme::LightWidgetTheme() auto tabbar_tab = RegisterStyle(std::make_unique(widget), "tabbar-tab"); auto tabwidget_stack = RegisterStyle(std::make_unique(widget), "tabwidget-stack"); auto checkbox_label = RegisterStyle(std::make_unique(widget), "checkbox-label"); + auto menubaritem = RegisterStyle(std::make_unique(widget), "menubaritem"); + auto menu = RegisterStyle(std::make_unique(widget), "menu"); + auto menuitem = RegisterStyle(std::make_unique(widget), "menuitem"); widget->SetString("font-family", "NotoSans"); widget->SetColor("color", Colorf::fromRgba8(0, 0, 0)); @@ -321,4 +344,19 @@ LightWidgetTheme::LightWidgetTheme() checkbox_label->SetColor("checked-color", Colorf::fromRgba8(50, 50, 50)); checkbox_label->SetColor("unchecked-outer-border-color", Colorf::fromRgba8(156, 156, 156)); checkbox_label->SetColor("unchecked-inner-border-color", Colorf::fromRgba8(200, 200, 200)); + + menubaritem->SetColor("hover", "background-color", Colorf::fromRgba8(200, 200, 200)); + menubaritem->SetColor("down", "background-color", Colorf::fromRgba8(190, 190, 190)); + + menu->SetDouble("noncontent-left", 5.0); + menu->SetDouble("noncontent-top", 5.0); + menu->SetDouble("noncontent-right", 5.0); + menu->SetDouble("noncontent-bottom", 5.0); + menu->SetColor("border-left-color", Colorf::fromRgba8(155, 155, 155)); + menu->SetColor("border-top-color", Colorf::fromRgba8(155, 155, 155)); + menu->SetColor("border-right-color", Colorf::fromRgba8(155, 155, 155)); + menu->SetColor("border-bottom-color", Colorf::fromRgba8(155, 155, 155)); + + menuitem->SetColor("hover", "background-color", Colorf::fromRgba8(200, 200, 200)); + menuitem->SetColor("down", "background-color", Colorf::fromRgba8(190, 190, 190)); } diff --git a/libraries/ZWidget/src/core/widget.cpp b/libraries/ZWidget/src/core/widget.cpp index 299857cfc..fe18d9376 100644 --- a/libraries/ZWidget/src/core/widget.cpp +++ b/libraries/ZWidget/src/core/widget.cpp @@ -4,12 +4,14 @@ #include "core/colorf.h" #include "core/theme.h" #include +#include +#include Widget::Widget(Widget* parent, WidgetType type) : Type(type) { if (type != WidgetType::Child) { - DispWindow = DisplayWindow::Create(this); + DispWindow = DisplayWindow::Create(this, type == WidgetType::Popup); DispCanvas = Canvas::create(DispWindow.get()); SetStyleState("root"); @@ -167,6 +169,10 @@ void Widget::SetFrameGeometry(const Rect& geometry) top = std::min(top, FrameGeometry.bottom()); right = std::max(right, FrameGeometry.left()); bottom = std::max(bottom, FrameGeometry.top()); + left = GridFitPoint(left); + top = GridFitPoint(top); + right = GridFitPoint(right); + bottom = GridFitPoint(bottom); ContentGeometry = Rect::ltrb(left, top, right, bottom); OnGeometryChanged(); } @@ -458,12 +464,12 @@ void Widget::SetClipboardText(const std::string& text) w->DispWindow->SetClipboardText(text); } -Widget* Widget::Window() +Widget* Widget::Window() const { - for (Widget* w = this; w != nullptr; w = w->Parent()) + for (const Widget* w = this; w != nullptr; w = w->Parent()) { if (w->DispWindow) - return w; + return const_cast(w); } return nullptr; } @@ -510,7 +516,7 @@ Point Widget::MapFromGlobal(const Point& pos) const { if (cur->DispWindow) { - return p - cur->GetFrameGeometry().topLeft(); + return cur->DispWindow->MapFromGlobal(p); } p -= cur->ContentGeometry.topLeft(); } @@ -536,7 +542,7 @@ Point Widget::MapToGlobal(const Point& pos) const { if (cur->DispWindow) { - return cur->GetFrameGeometry().topLeft() + p; + return cur->DispWindow->MapToGlobal(p); } p += cur->ContentGeometry.topLeft(); } @@ -705,9 +711,21 @@ void Widget::OnWindowKeyUp(InputKey key) void Widget::OnWindowGeometryChanged() { + if (!DispWindow) + return; Size size = DispWindow->GetClientSize(); FrameGeometry = Rect::xywh(0.0, 0.0, size.width, size.height); - ContentGeometry = FrameGeometry; + + double left = FrameGeometry.left() + GetNoncontentLeft(); + double top = FrameGeometry.top() + GetNoncontentTop(); + double right = FrameGeometry.right() - GetNoncontentRight(); + double bottom = FrameGeometry.bottom() - GetNoncontentBottom(); + left = std::min(left, FrameGeometry.right()); + top = std::min(top, FrameGeometry.bottom()); + right = std::max(right, FrameGeometry.left()); + bottom = std::max(bottom, FrameGeometry.top()); + ContentGeometry = Rect::ltrb(left, top, right, bottom); + OnGeometryChanged(); } @@ -728,6 +746,26 @@ void Widget::OnWindowDpiScaleChanged() { } +double Widget::GetDpiScale() const +{ + Widget* w = Window(); + return w ? w->DispWindow->GetDpiScale() : 1.0; +} + +double Widget::GridFitPoint(double p) const +{ + double dpiscale = GetDpiScale(); + return std::round(p * dpiscale) / dpiscale; +} + +double Widget::GridFitSize(double s) const +{ + if (s <= 0.0) + return 0.0; + double dpiscale = GetDpiScale(); + return std::max(std::floor(s * dpiscale + 0.25), 1.0) / dpiscale; +} + Size Widget::GetScreenSize() { return DisplayWindow::GetScreenSize(); diff --git a/libraries/ZWidget/src/widgets/checkboxlabel/checkboxlabel.cpp b/libraries/ZWidget/src/widgets/checkboxlabel/checkboxlabel.cpp index f78998890..77c1bd645 100644 --- a/libraries/ZWidget/src/widgets/checkboxlabel/checkboxlabel.cpp +++ b/libraries/ZWidget/src/widgets/checkboxlabel/checkboxlabel.cpp @@ -41,16 +41,24 @@ double CheckboxLabel::GetPreferredHeight() const void CheckboxLabel::OnPaint(Canvas* canvas) { + // To do: add and use GetStyleImage for the checkbox + + double center = GridFitPoint(GetHeight() * 0.5); + double borderwidth = GridFitSize(1.0); + double outerboxsize = GridFitSize(10.0); + double innerboxsize = outerboxsize - 2.0 * borderwidth; + double checkedsize = innerboxsize - 2.0 * borderwidth; + if (checked) { - canvas->fillRect(Rect::xywh(0.0, GetHeight() * 0.5 - 6.0, 10.0, 10.0), GetStyleColor("checked-outer-border-color")); - canvas->fillRect(Rect::xywh(1.0, GetHeight() * 0.5 - 5.0, 8.0, 8.0), GetStyleColor("checked-inner-border-color")); - canvas->fillRect(Rect::xywh(2.0, GetHeight() * 0.5 - 4.0, 6.0, 6.0), GetStyleColor("checked-color")); + canvas->fillRect(Rect::xywh(0.0, center - 6.0 * borderwidth, outerboxsize, outerboxsize), GetStyleColor("checked-outer-border-color")); + canvas->fillRect(Rect::xywh(1.0 * borderwidth, center - 5.0 * borderwidth, innerboxsize, innerboxsize), GetStyleColor("checked-inner-border-color")); + canvas->fillRect(Rect::xywh(2.0 * borderwidth, center - 4.0 * borderwidth, checkedsize, checkedsize), GetStyleColor("checked-color")); } else { - canvas->fillRect(Rect::xywh(0.0, GetHeight() * 0.5 - 6.0, 10.0, 10.0), GetStyleColor("unchecked-outer-border-color")); - canvas->fillRect(Rect::xywh(1.0, GetHeight() * 0.5 - 5.0, 8.0, 8.0), GetStyleColor("unchecked-inner-border-color")); + canvas->fillRect(Rect::xywh(0.0, center - 6.0 * borderwidth, outerboxsize, outerboxsize), GetStyleColor("unchecked-outer-border-color")); + canvas->fillRect(Rect::xywh(1.0 * borderwidth, center - 5.0 * borderwidth, innerboxsize, innerboxsize), GetStyleColor("unchecked-inner-border-color")); } canvas->drawText(Point(14.0, GetHeight() - 5.0), GetStyleColor("color"), text); diff --git a/libraries/ZWidget/src/widgets/imagebox/imagebox.cpp b/libraries/ZWidget/src/widgets/imagebox/imagebox.cpp index 45d35a160..37253c857 100644 --- a/libraries/ZWidget/src/widgets/imagebox/imagebox.cpp +++ b/libraries/ZWidget/src/widgets/imagebox/imagebox.cpp @@ -5,6 +5,14 @@ ImageBox::ImageBox(Widget* parent) : Widget(parent) { } +double ImageBox::GetPreferredWidth() const +{ + if (image) + return (double)image->GetWidth(); + else + return 0.0; +} + double ImageBox::GetPreferredHeight() const { if (image) diff --git a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp index 2905604af..38b928f95 100644 --- a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp +++ b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp @@ -1,4 +1,4 @@ -#include + #include "widgets/lineedit/lineedit.h" #include "core/utf8reader.h" #include "core/colorf.h" diff --git a/libraries/ZWidget/src/widgets/menubar/menubar.cpp b/libraries/ZWidget/src/widgets/menubar/menubar.cpp index 8a66ce8f3..517128508 100644 --- a/libraries/ZWidget/src/widgets/menubar/menubar.cpp +++ b/libraries/ZWidget/src/widgets/menubar/menubar.cpp @@ -4,13 +4,214 @@ Menubar::Menubar(Widget* parent) : Widget(parent) { + SetStyleClass("menubar"); } Menubar::~Menubar() { } -void Menubar::OnPaint(Canvas* canvas) +MenubarItem* Menubar::AddItem(std::string text, std::function onOpen, bool alignRight) { - canvas->drawText(Point(16.0, 21.0), Colorf::fromRgba8(0, 0, 0), "File Edit View Tools Window Help"); + auto item = new MenubarItem(this, text, alignRight); + item->SetOpenCallback(std::move(onOpen)); + menuItems.push_back(item); + OnGeometryChanged(); + return item; +} + +void Menubar::ShowMenu(MenubarItem* item) +{ + CloseMenu(); + if (item->GetOpenCallback()) + { + openMenu = new Menu(this); + openMenu->onCloseMenu = [=]() { CloseMenu(); }; + item->GetOpenCallback()(openMenu); + if (item->AlignRight) + openMenu->SetRightPosition(item->MapToGlobal(Point(item->GetWidth(), item->GetHeight()))); + else + openMenu->SetLeftPosition(item->MapToGlobal(Point(0.0, item->GetHeight()))); + openMenu->Show(); + } +} + +void Menubar::CloseMenu() +{ + //delete openMenu; + //openMenu = nullptr; +} + +void Menubar::OnGeometryChanged() +{ + double w = GetWidth(); + double h = GetHeight(); + double left = 0.0; + double right = w; + for (MenubarItem* item : menuItems) + { + double itemwidth = item->GetPreferredWidth(); + itemwidth += 16.0; + if (!item->AlignRight) + { + item->SetFrameGeometry(left, 0.0, itemwidth, h); + left += itemwidth; + } + else + { + right -= itemwidth; + item->SetFrameGeometry(right, 0.0, itemwidth, h); + } + } +} + +///////////////////////////////////////////////////////////////////////////// + +MenubarItem::MenubarItem(Menubar* menubar, std::string text, bool alignRight) : Widget(menubar), menubar(menubar), text(text), AlignRight(alignRight) +{ + SetStyleClass("menubaritem"); +} + +bool MenubarItem::OnMouseDown(const Point& pos, InputKey key) +{ + menubar->ShowMenu(this); + return true; +} + +bool MenubarItem::OnMouseUp(const Point& pos, InputKey key) +{ + return true; +} + +void MenubarItem::OnMouseMove(const Point& pos) +{ + if (GetStyleState().empty()) + { + SetStyleState("hover"); + } +} + +void MenubarItem::OnMouseLeave() +{ + SetStyleState(""); +} + +double MenubarItem::GetPreferredWidth() const +{ + Canvas* canvas = GetCanvas(); + return canvas->measureText(text).width; +} + +void MenubarItem::OnPaint(Canvas* canvas) +{ + double x = (GetWidth() - canvas->measureText(text).width) * 0.5; + canvas->drawText(Point(x, 21.0), GetStyleColor("color"), text); +} + +///////////////////////////////////////////////////////////////////////////// + +Menu::Menu(Widget* parent) : Widget(parent, WidgetType::Popup) +{ + SetStyleClass("menu"); +} + +void Menu::SetLeftPosition(const Point& pos) +{ + SetFrameGeometry(Rect::xywh(pos.x, pos.y, GetPreferredWidth() + GetNoncontentLeft() + GetNoncontentRight(), GetPreferredHeight() + GetNoncontentTop() + GetNoncontentBottom())); +} + +void Menu::SetRightPosition(const Point& pos) +{ + SetFrameGeometry(Rect::xywh(pos.x - GetWidth() - GetNoncontentLeft() - GetNoncontentRight(), pos.y, GetWidth() + GetNoncontentLeft() + GetNoncontentRight(), GetHeight() + GetNoncontentTop() + GetNoncontentBottom())); +} + +MenuItem* Menu::AddItem(std::shared_ptr icon, std::string text, std::function onClick) +{ + auto item = new MenuItem(this); + if (icon) + item->icon->SetImage(icon); + item->text->SetText(text); + /* + item->element->addEventListener("click", [=](Event* event) + { + event->stopPropagation(); + if (onCloseMenu) + onCloseMenu(); + if (onClick) + onClick(); + }); + */ + return item; +} + +MenuItemSeparator* Menu::AddSeparator() +{ + auto sep = new MenuItemSeparator(this); + return sep; +} + +double Menu::GetPreferredWidth() const +{ + return 200.0; +} + +double Menu::GetPreferredHeight() const +{ + double h = 0.0; + for (Widget* item = FirstChild(); item != nullptr; item = item->NextSibling()) + { + h += 20.0; + } + return h; +} + +void Menu::OnGeometryChanged() +{ + double w = GetWidth(); + double h = GetHeight(); + double y = 0.0; + for (Widget* item = FirstChild(); item != nullptr; item = item->NextSibling()) + { + item->SetFrameGeometry(Rect::xywh(0.0, y, w, 20.0)); + y += 20.0; + } +} + +///////////////////////////////////////////////////////////////////////////// + +MenuItem::MenuItem(Widget* parent) : Widget(parent) +{ + SetStyleClass("menuitem"); + icon = new ImageBox(this); + text = new TextLabel(this); +} + +void MenuItem::OnMouseMove(const Point& pos) +{ + if (GetStyleState().empty()) + { + SetStyleState("hover"); + } +} + +void MenuItem::OnMouseLeave() +{ + SetStyleState(""); +} + +void MenuItem::OnGeometryChanged() +{ + double iconwidth = icon->GetPreferredWidth(); + double iconheight = icon->GetPreferredHeight(); + double w = GetWidth(); + double h = GetHeight(); + icon->SetFrameGeometry(Rect::xywh(0.0, (h - iconheight) * 0.5, iconwidth, iconheight)); + text->SetFrameGeometry(Rect::xywh(iconwidth, 0.0, w - iconwidth, h)); +} + +///////////////////////////////////////////////////////////////////////////// + +MenuItemSeparator::MenuItemSeparator(Widget* parent) : Widget(parent) +{ + SetStyleClass("menuitemseparator"); } diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index f80fe86c0..5e44cb6f1 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -24,11 +24,14 @@ static void CheckInitSDL() static InitSDL initsdl; } -SDL2DisplayWindow::SDL2DisplayWindow(DisplayWindowHost* windowHost) : WindowHost(windowHost) +SDL2DisplayWindow::SDL2DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow) : WindowHost(windowHost) { CheckInitSDL(); - int result = SDL_CreateWindowAndRenderer(320, 200, SDL_WINDOW_HIDDEN /*| SDL_WINDOW_ALLOW_HIGHDPI*/, &WindowHandle, &RendererHandle); + unsigned int flags = SDL_WINDOW_HIDDEN /*| SDL_WINDOW_ALLOW_HIGHDPI*/; + if (popupWindow) + flags |= SDL_WINDOW_BORDERLESS; + int result = SDL_CreateWindowAndRenderer(320, 200, flags, &WindowHandle, &RendererHandle); if (result != 0) throw std::runtime_error(std::string("Unable to create SDL window:") + SDL_GetError()); @@ -174,6 +177,24 @@ Rect SDL2DisplayWindow::GetWindowFrame() const return Rect::xywh(x / uiscale, y / uiscale, w / uiscale, h / uiscale); } +Point SDL2DisplayWindow::MapFromGlobal(const Point& pos) const +{ + int x = 0; + int y = 0; + double uiscale = GetDpiScale(); + SDL_GetWindowPosition(WindowHandle, &x, &y); + return Point(pos.x - x / uiscale, pos.y - y / uiscale); +} + +Point SDL2DisplayWindow::MapToGlobal(const Point& pos) const +{ + int x = 0; + int y = 0; + double uiscale = GetDpiScale(); + SDL_GetWindowPosition(WindowHandle, &x, &y); + return Point(pos.x + x / uiscale, pos.y + y / uiscale); +} + Size SDL2DisplayWindow::GetClientSize() const { int w = 0; diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h index ca0a61f0e..7f54544bb 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h @@ -8,7 +8,7 @@ class SDL2DisplayWindow : public DisplayWindow { public: - SDL2DisplayWindow(DisplayWindowHost* windowHost); + SDL2DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow); ~SDL2DisplayWindow(); void SetWindowTitle(const std::string& text) override; @@ -45,6 +45,9 @@ public: std::string GetClipboardText() override; void SetClipboardText(const std::string& text) override; + Point MapFromGlobal(const Point& pos) const override; + Point MapToGlobal(const Point& pos) const override; + void* GetNativeHandle() override { return WindowHandle; } static void DispatchEvent(const SDL_Event& event); diff --git a/libraries/ZWidget/src/window/win32/win32displaywindow.cpp b/libraries/ZWidget/src/window/win32/win32displaywindow.cpp index 2bf0acff5..6d4be07ff 100644 --- a/libraries/ZWidget/src/window/win32/win32displaywindow.cpp +++ b/libraries/ZWidget/src/window/win32/win32displaywindow.cpp @@ -56,7 +56,7 @@ static std::wstring to_utf16(const std::string& str) return result; } -Win32DisplayWindow::Win32DisplayWindow(DisplayWindowHost* windowHost) : WindowHost(windowHost) +Win32DisplayWindow::Win32DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow) : WindowHost(windowHost) { Windows.push_front(this); WindowsIterator = Windows.begin(); @@ -74,7 +74,18 @@ Win32DisplayWindow::Win32DisplayWindow(DisplayWindowHost* windowHost) : WindowHo // WS_CAPTION shows the caption (yay! actually a flag that does what it says it does!) // WS_SYSMENU shows the min/max/close buttons // WS_THICKFRAME makes the window resizable - CreateWindowEx(WS_EX_APPWINDOW | WS_EX_DLGMODALFRAME, L"ZWidgetWindow", L"", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 100, 100, 0, 0, GetModuleHandle(0), this); + + DWORD style = 0, exstyle = 0; + if (popupWindow) + { + style = WS_POPUP; + } + else + { + exstyle = WS_EX_APPWINDOW | WS_EX_DLGMODALFRAME; + style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; + } + CreateWindowEx(exstyle, L"ZWidgetWindow", L"", style, 0, 0, 100, 100, 0, 0, GetModuleHandle(0), this); /* RAWINPUTDEVICE rid; @@ -246,6 +257,26 @@ Rect Win32DisplayWindow::GetWindowFrame() const return Rect(box.left / dpiscale, box.top / dpiscale, box.right / dpiscale, box.bottom / dpiscale); } +Point Win32DisplayWindow::MapFromGlobal(const Point& pos) const +{ + double dpiscale = GetDpiScale(); + POINT point = {}; + point.x = (LONG)std::round(pos.x / dpiscale); + point.y = (LONG)std::round(pos.y / dpiscale); + ScreenToClient(WindowHandle, &point); + return Point(point.x * dpiscale, point.y * dpiscale); +} + +Point Win32DisplayWindow::MapToGlobal(const Point& pos) const +{ + double dpiscale = GetDpiScale(); + POINT point = {}; + point.x = (LONG)std::round(pos.x * dpiscale); + point.y = (LONG)std::round(pos.y * dpiscale); + ClientToScreen(WindowHandle, &point); + return Point(point.x / dpiscale, point.y / dpiscale); +} + Size Win32DisplayWindow::GetClientSize() const { RECT box = {}; diff --git a/libraries/ZWidget/src/window/win32/win32displaywindow.h b/libraries/ZWidget/src/window/win32/win32displaywindow.h index 8aa00e42a..7bb481868 100644 --- a/libraries/ZWidget/src/window/win32/win32displaywindow.h +++ b/libraries/ZWidget/src/window/win32/win32displaywindow.h @@ -14,7 +14,7 @@ class Win32DisplayWindow : public DisplayWindow { public: - Win32DisplayWindow(DisplayWindowHost* windowHost); + Win32DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow); ~Win32DisplayWindow(); void SetWindowTitle(const std::string& text) override; @@ -53,6 +53,9 @@ public: std::string GetClipboardText() override; void SetClipboardText(const std::string& text) override; + Point MapFromGlobal(const Point& pos) const override; + Point MapToGlobal(const Point& pos) const override; + Point GetLParamPos(LPARAM lparam) const; void* GetNativeHandle() override { return reinterpret_cast(WindowHandle); } diff --git a/libraries/ZWidget/src/window/window.cpp b/libraries/ZWidget/src/window/window.cpp index 4ceb49469..fa7aaac21 100644 --- a/libraries/ZWidget/src/window/window.cpp +++ b/libraries/ZWidget/src/window/window.cpp @@ -6,9 +6,9 @@ #include "win32/win32displaywindow.h" -std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost) +std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow) { - return std::make_unique(windowHost); + return std::make_unique(windowHost, popupWindow); } void DisplayWindow::ProcessEvents() @@ -43,7 +43,7 @@ void DisplayWindow::StopTimer(void* timerID) #elif defined(__APPLE__) -std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost) +std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow) { throw std::runtime_error("DisplayWindow::Create not implemented"); } @@ -82,9 +82,9 @@ void DisplayWindow::StopTimer(void* timerID) #include "sdl2/sdl2displaywindow.h" -std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost) +std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow) { - return std::make_unique(windowHost); + return std::make_unique(windowHost, popupWindow); } void DisplayWindow::ProcessEvents() From a25a5b5b76adf41fb0086e1eee587e9252165e42 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 26 May 2024 00:23:53 +0200 Subject: [PATCH 090/414] Add missing include statement --- libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h b/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h index d9f084393..572d2a2f9 100644 --- a/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h +++ b/libraries/ZWidget/include/zwidget/widgets/menubar/menubar.h @@ -4,6 +4,7 @@ #include "../../core/widget.h" #include "../textlabel/textlabel.h" #include "../imagebox/imagebox.h" +#include class Menu; class MenubarItem; From 621d052c740684e16555265d3b9a56b800116d41 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 26 May 2024 14:04:15 +0200 Subject: [PATCH 091/414] Update to latest ZWidget --- .../ZWidget/include/zwidget/core/widget.h | 1 + .../ZWidget/include/zwidget/window/window.h | 3 ++- libraries/ZWidget/src/core/widget.cpp | 17 +++++++++++++++-- .../ZWidget/src/widgets/lineedit/lineedit.cpp | 1 + .../src/window/sdl2/sdl2displaywindow.cpp | 2 +- .../src/window/sdl2/sdl2displaywindow.h | 2 +- .../src/window/win32/win32displaywindow.cpp | 19 +++++++++++++++++-- .../src/window/win32/win32displaywindow.h | 4 +++- libraries/ZWidget/src/window/window.cpp | 10 +++++----- 9 files changed, 46 insertions(+), 13 deletions(-) diff --git a/libraries/ZWidget/include/zwidget/core/widget.h b/libraries/ZWidget/include/zwidget/core/widget.h index 747edc8a4..2c17507fd 100644 --- a/libraries/ZWidget/include/zwidget/core/widget.h +++ b/libraries/ZWidget/include/zwidget/core/widget.h @@ -171,6 +171,7 @@ private: // DisplayWindowHost void OnWindowPaint() override; void OnWindowMouseMove(const Point& pos) override; + void OnWindowMouseLeave() override; void OnWindowMouseDown(const Point& pos, InputKey key) override; void OnWindowMouseDoubleclick(const Point& pos, InputKey key) override; void OnWindowMouseUp(const Point& pos, InputKey key) override; diff --git a/libraries/ZWidget/include/zwidget/window/window.h b/libraries/ZWidget/include/zwidget/window/window.h index 538c7041d..a51519af4 100644 --- a/libraries/ZWidget/include/zwidget/window/window.h +++ b/libraries/ZWidget/include/zwidget/window/window.h @@ -100,6 +100,7 @@ class DisplayWindowHost public: virtual void OnWindowPaint() = 0; virtual void OnWindowMouseMove(const Point& pos) = 0; + virtual void OnWindowMouseLeave() = 0; virtual void OnWindowMouseDown(const Point& pos, InputKey key) = 0; virtual void OnWindowMouseDoubleclick(const Point& pos, InputKey key) = 0; virtual void OnWindowMouseUp(const Point& pos, InputKey key) = 0; @@ -118,7 +119,7 @@ public: class DisplayWindow { public: - static std::unique_ptr Create(DisplayWindowHost* windowHost, bool popupWindow); + static std::unique_ptr Create(DisplayWindowHost* windowHost, bool popupWindow, DisplayWindow* owner); static void ProcessEvents(); static void RunLoop(); diff --git a/libraries/ZWidget/src/core/widget.cpp b/libraries/ZWidget/src/core/widget.cpp index fe18d9376..9d380917c 100644 --- a/libraries/ZWidget/src/core/widget.cpp +++ b/libraries/ZWidget/src/core/widget.cpp @@ -11,7 +11,8 @@ Widget::Widget(Widget* parent, WidgetType type) : Type(type) { if (type != WidgetType::Child) { - DispWindow = DisplayWindow::Create(this, type == WidgetType::Popup); + Widget* owner = parent ? parent->Window() : nullptr; + DispWindow = DisplayWindow::Create(this, type == WidgetType::Popup, owner ? owner->DispWindow.get() : nullptr); DispCanvas = Canvas::create(DispWindow.get()); SetStyleState("root"); @@ -488,7 +489,7 @@ Widget* Widget::ChildAt(const Point& pos) { for (Widget* cur = LastChild(); cur != nullptr; cur = cur->PrevSibling()) { - if (!cur->HiddenFlag && cur->FrameGeometry.contains(pos)) + if (cur->Type == WidgetType::Child && !cur->HiddenFlag && cur->FrameGeometry.contains(pos)) { Widget* cur2 = cur->ChildAt(pos - cur->ContentGeometry.topLeft()); return cur2 ? cur2 : cur; @@ -595,6 +596,18 @@ void Widget::OnWindowMouseMove(const Point& pos) } } +void Widget::OnWindowMouseLeave() +{ + if (HoverWidget) + { + for (Widget* w = HoverWidget; w; w = w->Parent()) + { + w->OnMouseLeave(); + } + HoverWidget = nullptr; + } +} + void Widget::OnWindowMouseDown(const Point& pos, InputKey key) { if (CaptureWidget) diff --git a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp index 38b928f95..7faa25d90 100644 --- a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp +++ b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp @@ -2,6 +2,7 @@ #include "widgets/lineedit/lineedit.h" #include "core/utf8reader.h" #include "core/colorf.h" +#include LineEdit::LineEdit(Widget* parent) : Widget(parent) { diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp index 5e44cb6f1..b863aad02 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.cpp @@ -24,7 +24,7 @@ static void CheckInitSDL() static InitSDL initsdl; } -SDL2DisplayWindow::SDL2DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow) : WindowHost(windowHost) +SDL2DisplayWindow::SDL2DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow, SDL2DisplayWindow* owner) : WindowHost(windowHost) { CheckInitSDL(); diff --git a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h index 7f54544bb..81494dc70 100644 --- a/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h +++ b/libraries/ZWidget/src/window/sdl2/sdl2displaywindow.h @@ -8,7 +8,7 @@ class SDL2DisplayWindow : public DisplayWindow { public: - SDL2DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow); + SDL2DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow, SDL2DisplayWindow* owner); ~SDL2DisplayWindow(); void SetWindowTitle(const std::string& text) override; diff --git a/libraries/ZWidget/src/window/win32/win32displaywindow.cpp b/libraries/ZWidget/src/window/win32/win32displaywindow.cpp index 6d4be07ff..eafc4f527 100644 --- a/libraries/ZWidget/src/window/win32/win32displaywindow.cpp +++ b/libraries/ZWidget/src/window/win32/win32displaywindow.cpp @@ -56,7 +56,7 @@ static std::wstring to_utf16(const std::string& str) return result; } -Win32DisplayWindow::Win32DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow) : WindowHost(windowHost) +Win32DisplayWindow::Win32DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow, Win32DisplayWindow* owner) : WindowHost(windowHost) { Windows.push_front(this); WindowsIterator = Windows.begin(); @@ -85,7 +85,7 @@ Win32DisplayWindow::Win32DisplayWindow(DisplayWindowHost* windowHost, bool popup exstyle = WS_EX_APPWINDOW | WS_EX_DLGMODALFRAME; style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; } - CreateWindowEx(exstyle, L"ZWidgetWindow", L"", style, 0, 0, 100, 100, 0, 0, GetModuleHandle(0), this); + CreateWindowEx(exstyle, L"ZWidgetWindow", L"", style, 0, 0, 100, 100, owner ? owner->WindowHandle : 0, 0, GetModuleHandle(0), this); /* RAWINPUTDEVICE rid; @@ -464,8 +464,23 @@ LRESULT Win32DisplayWindow::OnWindowMessage(UINT msg, WPARAM wparam, LPARAM lpar UpdateCursor(); } + if (!TrackMouseActive) + { + TRACKMOUSEEVENT eventTrack = {}; + eventTrack.cbSize = sizeof(TRACKMOUSEEVENT); + eventTrack.hwndTrack = WindowHandle; + eventTrack.dwFlags = TME_LEAVE; + if (TrackMouseEvent(&eventTrack)) + TrackMouseActive = true; + } + WindowHost->OnWindowMouseMove(GetLParamPos(lparam)); } + else if (msg == WM_MOUSELEAVE) + { + TrackMouseActive = false; + WindowHost->OnWindowMouseLeave(); + } else if (msg == WM_LBUTTONDOWN) { WindowHost->OnWindowMouseDown(GetLParamPos(lparam), InputKey::LeftMouse); diff --git a/libraries/ZWidget/src/window/win32/win32displaywindow.h b/libraries/ZWidget/src/window/win32/win32displaywindow.h index 7bb481868..85ed92b64 100644 --- a/libraries/ZWidget/src/window/win32/win32displaywindow.h +++ b/libraries/ZWidget/src/window/win32/win32displaywindow.h @@ -14,7 +14,7 @@ class Win32DisplayWindow : public DisplayWindow { public: - Win32DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow); + Win32DisplayWindow(DisplayWindowHost* windowHost, bool popupWindow, Win32DisplayWindow* owner); ~Win32DisplayWindow(); void SetWindowTitle(const std::string& text) override; @@ -85,6 +85,8 @@ public: bool MouseLocked = false; POINT MouseLockPos = {}; + bool TrackMouseActive = false; + HDC PaintDC = 0; StandardCursor CurrentCursor = StandardCursor::arrow; diff --git a/libraries/ZWidget/src/window/window.cpp b/libraries/ZWidget/src/window/window.cpp index fa7aaac21..b19945fed 100644 --- a/libraries/ZWidget/src/window/window.cpp +++ b/libraries/ZWidget/src/window/window.cpp @@ -6,9 +6,9 @@ #include "win32/win32displaywindow.h" -std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow) +std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow, DisplayWindow* owner) { - return std::make_unique(windowHost, popupWindow); + return std::make_unique(windowHost, popupWindow, static_cast(owner)); } void DisplayWindow::ProcessEvents() @@ -43,7 +43,7 @@ void DisplayWindow::StopTimer(void* timerID) #elif defined(__APPLE__) -std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow) +std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow, DisplayWindow* owner) { throw std::runtime_error("DisplayWindow::Create not implemented"); } @@ -82,9 +82,9 @@ void DisplayWindow::StopTimer(void* timerID) #include "sdl2/sdl2displaywindow.h" -std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow) +std::unique_ptr DisplayWindow::Create(DisplayWindowHost* windowHost, bool popupWindow, DisplayWindow* owner) { - return std::make_unique(windowHost, popupWindow); + return std::make_unique(windowHost, popupWindow, static_cast(owner)); } void DisplayWindow::ProcessEvents() From d02f79d4be457667000756496742b16f57625648 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sun, 12 May 2024 18:32:36 -0400 Subject: [PATCH 092/414] Added subclassing for use commands Allows for finding subclasses when using the item commands that search the inventory. Can be either true/false or 0/1. --- src/g_game.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 472b840a4..105b16aa7 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -476,11 +476,17 @@ CCMD(invquery) } } +constexpr char True[] = "true"; + CCMD (use) { if (argv.argc() > 1 && players[consoleplayer].mo != NULL) { - SendItemUse = players[consoleplayer].mo->FindInventory(argv[1]); + bool subclass = false; + if (argv.argc() > 2) + subclass = !stricmp(argv[2], True) || atoi(argv[2]); + + SendItemUse = players[consoleplayer].mo->FindInventory(argv[1], subclass); } } @@ -503,7 +509,11 @@ CCMD (drop) { if (argv.argc() > 1 && players[consoleplayer].mo != NULL) { - SendItemDrop = players[consoleplayer].mo->FindInventory(argv[1]); + bool subclass = false; + if (argv.argc() > 3) + subclass = !stricmp(argv[3], True) || atoi(argv[3]); + + SendItemDrop = players[consoleplayer].mo->FindInventory(argv[1], subclass); SendItemDropAmount = argv.argc() > 2 ? atoi(argv[2]) : -1; } } @@ -528,7 +538,11 @@ CCMD (select) auto user = players[consoleplayer].mo; if (argv.argc() > 1) { - auto item = user->FindInventory(argv[1]); + bool subclass = false; + if (argv.argc() > 2) + subclass = !stricmp(argv[2], True) || atoi(argv[2]); + + auto item = user->FindInventory(argv[1], subclass); if (item != NULL) { user->PointerVar(NAME_InvSel) = item; From 4c191f4bf525cf8b0a36d5644266df57466bad5d Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 17 May 2024 20:03:44 -0400 Subject: [PATCH 093/414] Inventory item spawn fixes Default player items and shared items are no longer capable of being duplicated regardless of item flags. Shared items now give a true copy of the item. Fixed incorrect effects playing from item copies. Dropped items can no longer be shared. --- .../zscript/actors/inventory/inventory.zs | 22 +++++++++---------- wadsrc/static/zscript/actors/player/player.zs | 1 + 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs index 564989459..2e6544093 100644 --- a/wadsrc/static/zscript/actors/inventory/inventory.zs +++ b/wadsrc/static/zscript/actors/inventory/inventory.zs @@ -271,19 +271,18 @@ class Inventory : Actor if (bSharingItem) return; - class type = GetClass(); int skip = giver && giver.player ? giver.PlayerNumber() : -1; - for (int i; i < MAXPLAYERS; ++i) { if (!playerInGame[i] || i == skip) continue; - let item = Inventory(Spawn(type)); - if (!item) + let item = CreateLocalCopy(players[i].mo); + if (!item || item == self) continue; item.bSharingItem = true; + item.bDropped = item.bNeverLocal = true; if (!item.CallTryPickup(players[i].mo)) { item.Destroy(); @@ -293,14 +292,13 @@ class Inventory : Actor if (!bQuiet) { - PlayPickupSound(players[i].mo); + PrintPickupMessage(i == consoleplayer, item.PickupMessage()); + + item.PlayPickupSound(players[i].mo); if (!bNoScreenFlash && players[i].PlayerState != PST_DEAD) players[i].BonusCount = BONUSADD; } } - - if (!bQuiet && consoleplayer != skip) - PrintPickupMessage(true, PickupMessage()); } //=========================================================================== @@ -700,7 +698,7 @@ class Inventory : Actor toucher.HasReceived(self); // If the item can be shared, make sure every player gets a copy. - if (multiplayer && !deathmatch && ShouldShareItem(toucher)) + if (multiplayer && !deathmatch && !bDropped && ShouldShareItem(toucher)) ShareItemWithPlayers(toucher); } return res, toucher; @@ -869,13 +867,13 @@ class Inventory : Actor if (!bQuiet) { - PrintPickupMessage(localview, PickupMessage ()); + PrintPickupMessage(localview, give.PickupMessage ()); // Special check so voodoo dolls picking up items cause the // real player to make noise. if (player != NULL) { - PlayPickupSound (player.mo); + give.PlayPickupSound (player.mo); if (!bNoScreenFlash && player.playerstate != PST_DEAD) { player.bonuscount = BONUSADD; @@ -883,7 +881,7 @@ class Inventory : Actor } else { - PlayPickupSound (toucher); + give.PlayPickupSound (toucher); } } diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index fe56805d7..505d18d83 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -1945,6 +1945,7 @@ class PlayerPawn : Actor { item = Inventory(Spawn(ti)); item.bIgnoreSkill = true; // no skill multipliers here + item.bDropped = item.bNeverLocal = true; // Avoid possible copies. item.Amount = di.Amount; let weap = Weapon(item); if (weap) From 3d6e508d678b139646c185f7ff63e3ea502a6fa2 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Mon, 29 Apr 2024 07:43:14 -0400 Subject: [PATCH 094/414] Network messages will now show usernames instead of just numbers Gives more useful feedback as it's not obvious which node belongs to who. Added line breaks to network messages for cases where a large amount of players are desynced. --- src/g_statusbar/shared_sbar.cpp | 73 ++++++++----------- src/playsim/d_player.h | 20 ++++- src/playsim/p_user.cpp | 3 +- wadsrc/static/zscript/actors/player/player.zs | 2 +- 4 files changed, 51 insertions(+), 47 deletions(-) diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index bd75e4469..de125725b 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -1233,76 +1233,63 @@ void DBaseStatusBar::DrawTopStuff (EHudState state) void DBaseStatusBar::DrawConsistancy () const { - static bool firsttime = true; - int i; - char conbuff[64], *buff_p; - if (!netgame) return; - buff_p = NULL; - for (i = 0; i < MAXPLAYERS; i++) + bool desync = false; + FString text = "Out of sync with:"; + for (int i = 0; i < MAXPLAYERS; i++) { if (playeringame[i] && players[i].inconsistant) { - if (buff_p == NULL) - { - strcpy (conbuff, "Out of sync with:"); - buff_p = conbuff + 17; - } - *buff_p++ = ' '; - *buff_p++ = '1' + i; - *buff_p = 0; + desync = true; + text.AppendFormat(" %s (%d)", players[i].userinfo.GetName(10u), i + 1); } } - if (buff_p != NULL) + if (desync) { - if (firsttime) + auto lines = V_BreakLines(SmallFont, twod->GetWidth() / CleanXfac - 40, text.GetChars()); + const int height = SmallFont->GetHeight() * CleanYfac; + double y = 0.0; + for (auto& line : lines) { - firsttime = false; - if (debugfile) - { - fprintf (debugfile, "%s as of tic %d (%d)\n", conbuff, - players[1-consoleplayer].inconsistant, - players[1-consoleplayer].inconsistant/ticdup); - } + DrawText(twod, SmallFont, CR_GREEN, + (twod->GetWidth() - SmallFont->StringWidth(line.Text) * CleanXfac) * 0.5, + y, line.Text.GetChars(), DTA_CleanNoMove, true, TAG_DONE); + y += height; } - DrawText(twod, SmallFont, CR_GREEN, - (twod->GetWidth() - SmallFont->StringWidth (conbuff)*CleanXfac) / 2, - 0, conbuff, DTA_CleanNoMove, true, TAG_DONE); } } void DBaseStatusBar::DrawWaiting () const { - int i; - char conbuff[64], *buff_p; - if (!netgame) return; - buff_p = NULL; - for (i = 0; i < MAXPLAYERS; i++) + FString text = "Waiting for:"; + bool isWaiting = false; + for (int i = 0; i < MAXPLAYERS; i++) { if (playeringame[i] && players[i].waiting) { - if (buff_p == NULL) - { - strcpy (conbuff, "Waiting for:"); - buff_p = conbuff + 12; - } - *buff_p++ = ' '; - *buff_p++ = '1' + i; - *buff_p = 0; + isWaiting = true; + text.AppendFormat(" %s (%d)", players[i].userinfo.GetName(10u), i + 1); } } - if (buff_p != NULL) + if (isWaiting) { - DrawText(twod, SmallFont, CR_ORANGE, - (twod->GetWidth() - SmallFont->StringWidth (conbuff)*CleanXfac) / 2, - SmallFont->GetHeight()*CleanYfac, conbuff, DTA_CleanNoMove, true, TAG_DONE); + auto lines = V_BreakLines(SmallFont, twod->GetWidth() / CleanXfac - 40, text.GetChars()); + const int height = SmallFont->GetHeight() * CleanYfac; + double y = 0.0; + for (auto& line : lines) + { + DrawText(twod, SmallFont, CR_ORANGE, + (twod->GetWidth() - SmallFont->StringWidth(line.Text) * CleanXfac) * 0.5, + y, line.Text.GetChars(), DTA_CleanNoMove, true, TAG_DONE); + y += height; + } } } diff --git a/src/playsim/d_player.h b/src/playsim/d_player.h index 34ac55da6..a717bb42c 100644 --- a/src/playsim/d_player.h +++ b/src/playsim/d_player.h @@ -204,9 +204,25 @@ struct userinfo_t : TMap { return *static_cast(*CheckKey(NAME_Autoaim)); } - const char *GetName() const + const char *GetName(unsigned int charLimit = 0u) const { - return *static_cast(*CheckKey(NAME_Name)); + const char* name = *static_cast(*CheckKey(NAME_Name)); + if (charLimit) + { + FString temp = name; + if (temp.CharacterCount() > charLimit) + { + int next = 0; + for (unsigned int i = 0u; i < charLimit; ++i) + temp.GetNextCharacter(next); + + temp.Truncate(next); + temp += "..."; + name = temp.GetChars(); + } + } + + return name; } int GetTeam() const { diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 967ddb660..924ad47a8 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -727,7 +727,8 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, Resurrect) DEFINE_ACTION_FUNCTION(_PlayerInfo, GetUserName) { PARAM_SELF_STRUCT_PROLOGUE(player_t); - ACTION_RETURN_STRING(self->userinfo.GetName()); + PARAM_UINT(charLimit); + ACTION_RETURN_STRING(self->userinfo.GetName(charLimit)); } DEFINE_ACTION_FUNCTION(_PlayerInfo, GetNeverSwitch) diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index 505d18d83..e9b25c9b2 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2861,7 +2861,7 @@ struct PlayerInfo native play // self is what internally is known as player_t native void SetSubtitleNumber (int text, Sound sound_id = 0); native bool Resurrect(); - native clearscope String GetUserName() const; + native clearscope String GetUserName(uint charLimit = 0u) const; native clearscope Color GetColor() const; native clearscope Color GetDisplayColor() const; native clearscope int GetColorSet() const; From 53270f0bc809c330286ac3696434e10cfc0bd940 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Thu, 23 May 2024 12:16:34 -0400 Subject: [PATCH 095/414] Added ChangeTeam function for teamplay Also removes the TeamLibrary global since all it did was call what should've been static functions. --- src/d_main.cpp | 2 +- src/d_netinfo.cpp | 16 ++++----- src/gamedata/teaminfo.cpp | 34 ++++++++++++++++--- src/gamedata/teaminfo.h | 10 +++--- src/hu_scores.cpp | 4 +-- src/playsim/bots/b_game.cpp | 4 +-- wadsrc/static/zscript/actors/player/player.zs | 1 + 7 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 2d7f20c48..b0d3d88f2 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -3359,7 +3359,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw // [CW] Parse any TEAMINFO lumps. if (!batchrun) Printf ("ParseTeamInfo: Load team definitions.\n"); - TeamLibrary.ParseTeamInfo (); + FTeam::ParseTeamInfo (); R_ParseTrnslate(); PClassActor::StaticInit (); diff --git a/src/d_netinfo.cpp b/src/d_netinfo.cpp index ee004505e..bac6eddfe 100644 --- a/src/d_netinfo.cpp +++ b/src/d_netinfo.cpp @@ -197,7 +197,7 @@ void D_GetPlayerColor (int player, float *h, float *s, float *v, FPlayerColorSet RGBtoHSV (RPART(color)/255.f, GPART(color)/255.f, BPART(color)/255.f, h, s, v); - if (teamplay && TeamLibrary.IsValidTeam((team = info->GetTeam())) && !Teams[team].GetAllowCustomPlayerColor()) + if (teamplay && FTeam::IsValid((team = info->GetTeam())) && !Teams[team].GetAllowCustomPlayerColor()) { // In team play, force the player to use the team's hue // and adjust the saturation and value so that the team @@ -264,7 +264,7 @@ int D_PickRandomTeam () if (playeringame[i]) { team = players[i].userinfo.GetTeam(); - if (TeamLibrary.IsValidTeam(team)) + if (FTeam::IsValid(team)) { if (Teams[team].m_iPresent++ == 0) { @@ -319,7 +319,7 @@ static void UpdateTeam (int pnum, int team, bool update) { userinfo_t *info = &players[pnum].userinfo; - if ((dmflags2 & DF2_NO_TEAM_SWITCH) && (alwaysapplydmflags || deathmatch) && TeamLibrary.IsValidTeam (info->GetTeam())) + if ((dmflags2 & DF2_NO_TEAM_SWITCH) && (alwaysapplydmflags || deathmatch) && FTeam::IsValid (info->GetTeam())) { Printf ("%s\n", GStrings.GetString("TXT_NO_TEAM_CHANGE")); return; @@ -327,7 +327,7 @@ static void UpdateTeam (int pnum, int team, bool update) int oldteam; - if (!TeamLibrary.IsValidTeam (team)) + if (!FTeam::IsValid (team)) { team = TEAM_NONE; } @@ -337,7 +337,7 @@ static void UpdateTeam (int pnum, int team, bool update) if (update && oldteam != team) { FString message; - if (TeamLibrary.IsValidTeam (team)) + if (FTeam::IsValid (team)) { message = GStrings.GetString("TXT_JOINED_TEAM"); message.Substitute("%t", Teams[team].GetName()); @@ -356,7 +356,7 @@ static void UpdateTeam (int pnum, int team, bool update) StatusBar->AttachToPlayer (&players[pnum]); } // Double-check - if (!TeamLibrary.IsValidTeam (team)) + if (!FTeam::IsValid (team)) { *static_cast((*info)[NAME_Team]) = TEAM_NONE; } @@ -365,7 +365,7 @@ static void UpdateTeam (int pnum, int team, bool update) int D_GetFragCount (player_t *player) { const int team = player->userinfo.GetTeam(); - if (!teamplay || !TeamLibrary.IsValidTeam(team)) + if (!teamplay || !FTeam::IsValid(team)) { return player->fragcount; } @@ -479,7 +479,7 @@ void userinfo_t::Reset(int pnum) int userinfo_t::TeamChanged(int team) { - if (teamplay && !TeamLibrary.IsValidTeam(team)) + if (teamplay && !FTeam::IsValid(team)) { // Force players onto teams in teamplay mode team = D_PickRandomTeam(); } diff --git a/src/gamedata/teaminfo.cpp b/src/gamedata/teaminfo.cpp index 1838d1b39..25ec9dd3b 100644 --- a/src/gamedata/teaminfo.cpp +++ b/src/gamedata/teaminfo.cpp @@ -43,6 +43,7 @@ #include "v_video.h" #include "filesystem.h" #include "vm.h" +#include "d_player.h" // MACROS ------------------------------------------------------------------ @@ -56,9 +57,11 @@ // EXTERNAL DATA DECLARATIONS ---------------------------------------------- +extern bool playeringame[MAXPLAYERS]; +extern player_t players[MAXPLAYERS]; + // PUBLIC DATA DEFINITIONS ------------------------------------------------- -FTeam TeamLibrary; TArray Teams; // PRIVATE DATA DEFINITIONS ------------------------------------------------ @@ -245,7 +248,7 @@ void FTeam::ClearTeams () // //========================================================================== -bool FTeam::IsValidTeam (unsigned int uiTeam) const +bool FTeam::IsValid (unsigned int uiTeam) { if (uiTeam >= Teams.Size ()) return false; @@ -253,6 +256,15 @@ bool FTeam::IsValidTeam (unsigned int uiTeam) const return true; } +bool FTeam::ChangeTeam(unsigned int pNum, unsigned int newTeam) +{ + if (!multiplayer || !teamplay || pNum >= MAXPLAYERS || !playeringame[pNum] || !FTeam::IsValid(newTeam) || players[pNum].userinfo.GetTeam() == newTeam) + return false; + + players[pNum].userinfo.TeamChanged(newTeam); + return true; +} + //========================================================================== // // FTeam :: GetName @@ -342,7 +354,7 @@ DEFINE_FIELD_NAMED(FTeam, m_Name, mName) static int IsValid(unsigned int id) { - return TeamLibrary.IsValidTeam(id); + return FTeam::IsValid(id); } DEFINE_ACTION_FUNCTION_NATIVE(FTeam, IsValid, IsValid) @@ -350,7 +362,21 @@ DEFINE_ACTION_FUNCTION_NATIVE(FTeam, IsValid, IsValid) PARAM_PROLOGUE; PARAM_UINT(id); - ACTION_RETURN_BOOL(TeamLibrary.IsValidTeam(id)); + ACTION_RETURN_BOOL(FTeam::IsValid(id)); +} + +static int ChangeTeam(unsigned int pNum, unsigned int newTeam) +{ + return FTeam::ChangeTeam(pNum, newTeam); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FTeam, ChangeTeam, ChangeTeam) +{ + PARAM_PROLOGUE; + PARAM_UINT(pNum); + PARAM_UINT(newTeam); + + ACTION_RETURN_BOOL(FTeam::ChangeTeam(pNum, newTeam)); } static int GetPlayerColor(FTeam* self) diff --git a/src/gamedata/teaminfo.h b/src/gamedata/teaminfo.h index 1a3db705c..17be9dd46 100644 --- a/src/gamedata/teaminfo.h +++ b/src/gamedata/teaminfo.h @@ -45,8 +45,9 @@ class FTeam { public: FTeam (); - void ParseTeamInfo (); - bool IsValidTeam (unsigned int uiTeam) const; + static void ParseTeamInfo (); + static bool IsValid (unsigned int uiTeam); + static bool ChangeTeam(unsigned int pNum, unsigned int newTeam); const char *GetName () const; int GetPlayerColor () const; @@ -60,8 +61,8 @@ public: int m_iTies; private: - void ParseTeamDefinition (FScanner &Scan); - void ClearTeams (); + static void ParseTeamDefinition (FScanner &Scan); + static void ClearTeams (); public: // needed for script access. FString m_Name; @@ -72,7 +73,6 @@ private: bool m_bAllowCustomPlayerColor; }; -extern FTeam TeamLibrary; extern TArray Teams; #endif diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index 797e222ef..d7cde85fc 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -293,7 +293,7 @@ static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYER for (i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[sortedplayers[i]-players] && TeamLibrary.IsValidTeam (sortedplayers[i]->userinfo.GetTeam())) + if (playeringame[sortedplayers[i]-players] && FTeam::IsValid (sortedplayers[i]->userinfo.GetTeam())) { if (Teams[sortedplayers[i]->userinfo.GetTeam()].m_iPlayerCount++ == 0) { @@ -485,7 +485,7 @@ int HU_GetRowColor(player_t *player, bool highlight) { if (teamplay && deathmatch) { - if (TeamLibrary.IsValidTeam (player->userinfo.GetTeam())) + if (FTeam::IsValid (player->userinfo.GetTeam())) return Teams[player->userinfo.GetTeam()].GetTextColor(); else return CR_GREY; diff --git a/src/playsim/bots/b_game.cpp b/src/playsim/bots/b_game.cpp index 198692c1f..3863ac923 100644 --- a/src/playsim/bots/b_game.cpp +++ b/src/playsim/bots/b_game.cpp @@ -305,7 +305,7 @@ bool FCajunMaster::SpawnBot (const char *name, int color) { concat << colors[bot_next_color]; } - if (TeamLibrary.IsValidTeam (thebot->lastteam)) + if (FTeam::IsValid (thebot->lastteam)) { // Keep the bot on the same team when switching levels concat.AppendFormat("\\team\\%d\n", thebot->lastteam); } @@ -587,7 +587,7 @@ bool FCajunMaster::LoadBots () if (IsNum (sc.String)) { teamnum = atoi (sc.String); - if (!TeamLibrary.IsValidTeam (teamnum)) + if (!FTeam::IsValid (teamnum)) { teamnum = TEAM_NONE; } diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index e9b25c9b2..05d9e1b1b 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2989,6 +2989,7 @@ struct Team native native String mName; native static bool IsValid(uint teamIndex); + native static bool ChangeTeam(uint playerNumber, uint newTeamIndex); native Color GetPlayerColor() const; native int GetTextColor() const; From ab20b75c14b898aa551052e0f6e8be258757796d Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sat, 25 May 2024 22:41:30 -0400 Subject: [PATCH 096/414] Added missing player retranslation Play-scoped team changing function. --- src/gamedata/teaminfo.cpp | 1 + wadsrc/static/zscript/actors/player/player.zs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gamedata/teaminfo.cpp b/src/gamedata/teaminfo.cpp index 25ec9dd3b..44e8c0e37 100644 --- a/src/gamedata/teaminfo.cpp +++ b/src/gamedata/teaminfo.cpp @@ -262,6 +262,7 @@ bool FTeam::ChangeTeam(unsigned int pNum, unsigned int newTeam) return false; players[pNum].userinfo.TeamChanged(newTeam); + R_BuildPlayerTranslation(pNum); return true; } diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index 05d9e1b1b..b2252c16e 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2989,7 +2989,7 @@ struct Team native native String mName; native static bool IsValid(uint teamIndex); - native static bool ChangeTeam(uint playerNumber, uint newTeamIndex); + native play static bool ChangeTeam(uint playerNumber, uint newTeamIndex); native Color GetPlayerColor() const; native int GetTextColor() const; From ae28eeae94384dfebbe93c45ed95921c15fccd1f Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Tue, 14 May 2024 21:26:12 +0800 Subject: [PATCH 097/414] Scriptified the view squatting. --- src/playsim/p_mobj.cpp | 17 ++++++++++------- wadsrc/static/zscript/actors/actor.zs | 11 +++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index d5fdf8574..9c0b99c88 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -2811,15 +2811,18 @@ static void PlayerLandedMakeGruntSound(AActor* self, AActor *onmobj) } } +static void PlayerSquatView(AActor *self, AActor *onmobj) +{ + IFVIRTUALPTR(self, AActor, PlayerSquatView) + { + VMValue params[2] = { self, onmobj }; + VMCall(func, params, 2, nullptr, 0); + } +} + static void PlayerLandedOnThing (AActor *mo, AActor *onmobj) { - if (!mo->player) - return; - - if (mo->player->mo == mo) - { - mo->player->deltaviewheight = mo->Vel.Z / 8.; - } + PlayerSquatView(mo, onmobj); if (mo->player->cheats & CF_PREDICTING) return; diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 7c52030da..694f8262e 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -1439,6 +1439,17 @@ class Actor : Thinker native } } + virtual void PlayerSquatView(Actor onmobj) + { + if (!self.player) + return; + + if (self.player.mo == self) + { + self.player.deltaviewheight = self.Vel.Z / 8.; + } + } + //---------------------------------------------------------------------------- // // PROC A_CheckSkullDone From c707b418efec4f27e8ba66cd008d66e36188f645 Mon Sep 17 00:00:00 2001 From: Acts 19 quiz Date: Mon, 6 May 2024 14:41:18 -0500 Subject: [PATCH 098/414] Narrow the Launcher check box clickable areas to stop overlap and fix #2558 --- src/launcher/settingspage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/launcher/settingspage.cpp b/src/launcher/settingspage.cpp index 9cd89bcd0..1bfe54d22 100644 --- a/src/launcher/settingspage.cpp +++ b/src/launcher/settingspage.cpp @@ -161,7 +161,7 @@ void SettingsPage::OnLanguageChanged(int i) void SettingsPage::OnGeometryChanged() { - double panelWidth = 200.0; + double panelWidth = 160.0; double y = 0.0; double w = GetWidth(); double h = GetHeight(); From 87463ef36b7a5a9ad691cd8eac664e791e9c9589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 31 May 2024 03:02:50 -0300 Subject: [PATCH 099/414] Fix memory leak on TDeletingArray move assignment --- src/common/utility/tarray.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/utility/tarray.h b/src/common/utility/tarray.h index bce3ba3ea..3445bd484 100644 --- a/src/common/utility/tarray.h +++ b/src/common/utility/tarray.h @@ -919,6 +919,7 @@ public: TDeletingArray(TDeletingArray &&other) : TArray(std::move(other)) {} TDeletingArray &operator=(TDeletingArray &&other) { + DeleteAndClear(); TArray::operator=(std::move(other)); return *this; } From 20cf8befbf55dd2e603a73e5215731267fdea980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 31 May 2024 03:07:31 -0300 Subject: [PATCH 100/414] Rework named arguments Now allows arguments to be in any arbitrary position, and allows required arguments to be named --- src/common/scripting/backend/codegen.cpp | 210 ++++++++++++++--------- 1 file changed, 125 insertions(+), 85 deletions(-) diff --git a/src/common/scripting/backend/codegen.cpp b/src/common/scripting/backend/codegen.cpp index 8b3ee306a..077ca1654 100644 --- a/src/common/scripting/backend/codegen.cpp +++ b/src/common/scripting/backend/codegen.cpp @@ -9544,7 +9544,7 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx) if(FnPtrCall) static_cast(ctx.Function->Variants[0].Implementation)->blockJit = true; - int implicit = Function->GetImplicitArgs(); + unsigned implicit = Function->GetImplicitArgs(); if (!CheckAccessibility(ctx.Version)) { @@ -9576,21 +9576,110 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx) CallingFunction = ctx.Function; if (ArgList.Size() > 0) { - if (argtypes.Size() == 0) + if ((argtypes.Size() == 0) || (argtypes.Last() != nullptr && ArgList.Size() + implicit > argtypes.Size())) { ScriptPosition.Message(MSG_ERROR, "Too many arguments in call to %s", Function->SymbolName.GetChars()); delete this; return nullptr; } + bool isvararg = (argtypes.Last() == nullptr); + + { + TDeletingArray OrderedArgs; + const unsigned count = (argtypes.Size() - implicit) - isvararg; + + OrderedArgs.Resize(count); + memset(OrderedArgs.Data(), 0, sizeof(FxExpression*) * count); + + unsigned index = 0; + unsigned n = ArgList.Size(); + + for(unsigned i = 0; i < n; i++) + { + if(ArgList[i]->ExprType == EFX_NamedNode) + { + if(FnPtrCall) + { + ScriptPosition.Message(MSG_ERROR, "Named arguments not supported in function pointer calls"); + delete this; + return nullptr; + } + else if((index >= count) && isvararg) + { + ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument in the varargs part of the parameter list."); + delete this; + return nullptr; + } + else + { + unsigned j; + FName name = static_cast(ArgList[i])->name; + for (j = 0; j < count; j++) + { + if (argnames[j + implicit] == name) + { + // i don't think this needs any further optimization? + // O(N^2) complexity technically but N isn't likely to be large, + // and the check itself is just an int comparison, so it should be fine + index = j; + break; + } + } + + if(j == count) + { + ScriptPosition.Message(MSG_ERROR, "Named argument %s not found.", name.GetChars()); + delete this; + return nullptr; + } + } + } + + if(index >= count) + { + if(isvararg) + { + OrderedArgs.Push(ArgList[i]); + ArgList[i] = nullptr; + index++; + } + else + { + ScriptPosition.Message(MSG_ERROR, "Too many arguments in call to %s", Function->SymbolName.GetChars()); + delete this; + return nullptr; + } + } + else + { + if(ArgList[i]->ExprType == EFX_NamedNode) + { + auto * node = static_cast(ArgList[i]); + OrderedArgs[index] = node->value; + node->value = nullptr; + } + else + { + OrderedArgs[index] = ArgList[i]; + } + ArgList[i] = nullptr; + index++; + } + } + + ArgList = std::move(OrderedArgs); + } + bool foundvarargs = false; PType * type = nullptr; int flag = 0; - if (argtypes.Size() > 0 && argtypes.Last() != nullptr && ArgList.Size() + implicit > argtypes.Size()) + + int defaults_index = 0; + + for(unsigned i = 0; i < implicit; i++) { - ScriptPosition.Message(MSG_ERROR, "Too many arguments in call to %s", Function->SymbolName.GetChars()); - delete this; - return nullptr; + defaults_index += argtypes[i]->GetRegCount(); } for (unsigned i = 0; i < ArgList.Size(); i++) @@ -9608,94 +9697,45 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx) } assert(type != nullptr); - if (ArgList[i]->ExprType == EFX_NamedNode) + if(!foundvarargs) { - if(FnPtrCall) + if(ArgList[i] == nullptr) { - ScriptPosition.Message(MSG_ERROR, "Named arguments not supported in function pointer calls"); - delete this; - return nullptr; - } - if (!(flag & VARF_Optional)) - { - ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument here - not all required arguments have been passed."); - delete this; - return nullptr; - } - if (foundvarargs) - { - ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument in the varargs part of the parameter list."); - delete this; - return nullptr; - } - unsigned j; - bool done = false; - FName name = static_cast(ArgList[i])->name; - for (j = 0; j < argnames.Size() - implicit; j++) - { - if (argnames[j + implicit] == name) + if(!(flag & VARF_Optional)) { - if (j < i) + ScriptPosition.Message(MSG_ERROR, "Required argument %s has not been passed in call to %s", argnames[i + implicit].GetChars(), Function->SymbolName.GetChars()); + delete this; + return nullptr; + } + + auto ntype = argtypes[i + implicit]; + // If this is a reference argument, the pointer type must be undone because the code below expects the pointed type as value type. + if (argflags[i + implicit] & VARF_Ref) + { + assert(ntype->isPointer()); + ntype = TypeNullPtr; // the default of a reference type can only be a null pointer + } + if (ntype->GetRegCount() == 1) + { + ArgList[i] = new FxConstant(ntype, (*defaults)[defaults_index], ScriptPosition); + } + else + { + // Vectors need special treatment because they are not normal constants + FxConstant *cs[4] = { nullptr }; + for (int l = 0; l < ntype->GetRegCount(); l++) { - ScriptPosition.Message(MSG_ERROR, "Named argument %s comes before current position in argument list.", name.GetChars()); - delete this; - return nullptr; + cs[l] = new FxConstant(TypeFloat64, (*defaults)[l + defaults_index], ScriptPosition); } - // copy the original argument into the list - auto old = static_cast(ArgList[i]); - ArgList[i] = old->value; - old->value = nullptr; - delete old; - // now fill the gap with constants created from the default list so that we got a full list of arguments. - int insert = j - i; - int skipdefs = 0; - // Defaults contain multiple entries for pointers so we need to calculate how much additional defaults we need to skip - for (unsigned k = 0; k < i + implicit; k++) - { - skipdefs += argtypes[k]->GetRegCount() - 1; - } - for (int k = 0; k < insert; k++) - { - auto ntype = argtypes[i + k + implicit]; - // If this is a reference argument, the pointer type must be undone because the code below expects the pointed type as value type. - if (argflags[i + k + implicit] & VARF_Ref) - { - assert(ntype->isPointer()); - ntype = TypeNullPtr; // the default of a reference type can only be a null pointer - } - if (ntype->GetRegCount() == 1) - { - auto x = new FxConstant(ntype, (*defaults)[i + k + skipdefs + implicit], ScriptPosition); - ArgList.Insert(i + k, x); - } - else - { - // Vectors need special treatment because they are not normal constants - FxConstant *cs[4] = { nullptr }; - for (int l = 0; l < ntype->GetRegCount(); l++) - { - cs[l] = new FxConstant(TypeFloat64, (*defaults)[l + i + k + skipdefs + implicit], ScriptPosition); - } - FxExpression *x = new FxVectorValue(cs[0], cs[1], cs[2], cs[3], ScriptPosition); - ArgList.Insert(i + k, x); - skipdefs += ntype->GetRegCount() - 1; - } - } - done = true; - break; + ArgList[i] = new FxVectorValue(cs[0], cs[1], cs[2], cs[3], ScriptPosition); } } - if (!done) - { - ScriptPosition.Message(MSG_ERROR, "Named argument %s not found.", name.GetChars()); - delete this; - return nullptr; - } - // re-get the proper info for the inserted node. - type = argtypes[i + implicit]; - flag = argflags[i + implicit]; + + defaults_index += argtypes[i + implicit]->GetRegCount(); } + assert(ArgList[i]); + FxExpression *x = nullptr; if (foundvarargs && (Function->Variants[0].Flags & VARF_VarArg)) { From 461c2f77b7214f4cd556c9147c64c7279e29e725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 1 Jun 2024 11:24:12 -0300 Subject: [PATCH 101/414] restrict new relaxed named arguments to zscript >= 4.13 --- src/common/scripting/backend/codegen.cpp | 46 +++++++++++++++++------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/common/scripting/backend/codegen.cpp b/src/common/scripting/backend/codegen.cpp index 077ca1654..5b1a975a6 100644 --- a/src/common/scripting/backend/codegen.cpp +++ b/src/common/scripting/backend/codegen.cpp @@ -9546,6 +9546,8 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx) unsigned implicit = Function->GetImplicitArgs(); + bool relaxed_named_arugments = (ctx.Version >= MakeVersion(4, 13)); + if (!CheckAccessibility(ctx.Version)) { delete this; @@ -9613,25 +9615,43 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx) } else { - unsigned j; FName name = static_cast(ArgList[i])->name; - for (j = 0; j < count; j++) + if(argnames[index + implicit] != name) { - if (argnames[j + implicit] == name) + unsigned j; + + for (j = 0; j < count; j++) { - // i don't think this needs any further optimization? - // O(N^2) complexity technically but N isn't likely to be large, - // and the check itself is just an int comparison, so it should be fine - index = j; - break; + if (argnames[j + implicit] == name) + { + if(!relaxed_named_arugments && !(argflags[j + implicit] & VARF_Optional)) + { + ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument here - not all required arguments have been passed."); + } + else if(!relaxed_named_arugments && j < index) + { + ScriptPosition.Message(MSG_ERROR, "Named argument %s comes before current position in argument list.", name.GetChars()); + } + + // i don't think this needs any further optimization? + // O(N^2) complexity technically but N isn't likely to be large, + // and the check itself is just an int comparison, so it should be fine + index = j; + + break; + } + } + + if(j == count) + { + ScriptPosition.Message(MSG_ERROR, "Named argument %s not found.", name.GetChars()); + delete this; + return nullptr; } } - - if(j == count) + else if(!relaxed_named_arugments && !(argflags[index + implicit] & VARF_Optional)) { - ScriptPosition.Message(MSG_ERROR, "Named argument %s not found.", name.GetChars()); - delete this; - return nullptr; + ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument here - not all required arguments have been passed."); } } } From c693e3b0731707351cd166aa160aaa7803751d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Wed, 5 Jun 2024 19:43:25 -0300 Subject: [PATCH 102/414] Fix A_SetAnimation --- wadsrc/static/zscript/actors/actor.zs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 694f8262e..768837d59 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -1310,7 +1310,7 @@ class Actor : Thinker native native bool A_AttachLight(Name lightid, int type, Color lightcolor, int radius1, int radius2, int flags = 0, Vector3 ofs = (0,0,0), double param = 0, double spoti = 10, double spoto = 25, double spotp = 0); native bool A_RemoveLight(Name lightid); - native version("4.12") void SetAnimation(Name animName, double framerate = -1, int startFrame = -1, int loopFrame= -1, int endFrame = -1, int interpolateTics = -1, int flags = 0); + native version("4.12") void SetAnimation(Name animName, double framerate = -1, int startFrame = -1, int loopFrame = -1, int endFrame = -1, int interpolateTics = -1, int flags = 0); native version("4.12") ui void SetAnimationUI(Name animName, double framerate = -1, int startFrame = -1, int loopFrame = -1, int endFrame = -1, int interpolateTics = -1, int flags = 0); native version("4.12") void SetAnimationFrameRate(double framerate); @@ -1321,9 +1321,9 @@ class Actor : Thinker native native version("4.12") void ResetModelFlags(); - action version("4.12") void A_SetAnimation(Name animName, double framerate = -1, int startFrame = -1, int loopFrame= -1, int interpolateTics = -1, int flags = 0) + action version("4.12") void A_SetAnimation(Name animName, double framerate = -1, int startFrame = -1, int loopFrame = -1, int endFrame = -1, int interpolateTics = -1, int flags = 0) { - invoker.SetAnimation(animName, framerate, startFrame, loopFrame, interpolateTics, flags); + invoker.SetAnimation(animName, framerate, startFrame, loopFrame, endFrame, interpolateTics, flags); } action version("4.12") void A_SetAnimationFrameRate(double framerate) From 8d320ec31c9efe31d614a055e50d891d4d835875 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 13 Jun 2024 12:50:43 +0200 Subject: [PATCH 103/414] Add textureGrad compatibility --- wadsrc/static/shaders/scene/layout_frag.glsl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/wadsrc/static/shaders/scene/layout_frag.glsl b/wadsrc/static/shaders/scene/layout_frag.glsl index f4115e218..925436afd 100644 --- a/wadsrc/static/shaders/scene/layout_frag.glsl +++ b/wadsrc/static/shaders/scene/layout_frag.glsl @@ -36,6 +36,11 @@ ivec2 textureSize(int index, int lod) return textureSize(textures[uTextureIndex + index], lod); } +vec4 textureGrad(int index, vec2 P, vec2 dPdx, vec2 dPdy) +{ + return textureGrad(textures[uTextureIndex + index], P, dPdx, dPdy); +} + vec4 texelFetch(int index, ivec2 P, int lod) { return texelFetch(textures[uTextureIndex + index], P, lod); From 1f8c617e4f188dfc2b5ff397dc63eb5f24462200 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Fri, 14 Jun 2024 17:54:17 +0800 Subject: [PATCH 104/414] Fix Mac bundle identifier --- src/posix/osx/zdoom-info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/posix/osx/zdoom-info.plist b/src/posix/osx/zdoom-info.plist index cb386fec7..1250226b3 100644 --- a/src/posix/osx/zdoom-info.plist +++ b/src/posix/osx/zdoom-info.plist @@ -9,11 +9,11 @@ CFBundleIconFile zdoom.icns CFBundleIdentifier - org.drdteam.gzdoom + org.vkdoom.app CFBundleInfoDictionaryVersion 6.0 CFBundleName - GZDoom + VKDoom CFBundlePackageType APPL CFBundleShortVersionString From 1a89307ee721a9234de94bb7587e21b8a025f421 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sat, 15 Jun 2024 18:08:37 +0800 Subject: [PATCH 105/414] Rename SourceRadius to SoftShadowRadius --- specs/udmf_zdoom.txt | 2 +- .../rendering/hwrenderer/data/hw_levelmeshlight.h | 2 +- src/common/rendering/vulkan/vk_levelmesh.cpp | 2 +- src/common/rendering/vulkan/vk_levelmesh.h | 2 +- src/doomdata.h | 2 +- src/maploader/udmf.cpp | 6 +++--- src/namedef_custom.h | 2 +- src/playsim/a_dynlight.cpp | 2 +- src/playsim/a_dynlight.h | 6 +++--- src/playsim/actor.h | 2 +- src/playsim/p_mobj.cpp | 4 ++-- src/r_data/a_dynlightdata.cpp | 2 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 2 +- src/rendering/hwrenderer/hw_dynlightdata.cpp | 4 ++-- .../shaders/lightmap/binding_lightmapper.glsl | 2 +- wadsrc/static/shaders/lightmap/trace_light.glsl | 4 ++-- wadsrc/static/shaders/scene/light_shadow.glsl | 14 +++++++------- 17 files changed, 30 insertions(+), 30 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 10d357712..75ae3c474 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -424,7 +424,7 @@ Note: All fields default to false unless mentioned otherwise. lm_sampledist = ; // ZDRay lightmap sample distance for the entire map. Defines the map units each lightmap texel covers. Must be in powers of two. Default = 8 lm_suncolor = ; // ZDRay lightmap sun color in hex. Default = "FFFFFF" - SourceRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 + SoftShadowRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 diff --git a/src/common/rendering/hwrenderer/data/hw_levelmeshlight.h b/src/common/rendering/hwrenderer/data/hw_levelmeshlight.h index b18ca38eb..ca8b063fa 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmeshlight.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmeshlight.h @@ -15,5 +15,5 @@ public: FVector3 SpotDir; FVector3 Color; int SectorGroup; - float SourceRadius; + float SoftShadowRadius; }; diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 171d3c3a5..e985578fd 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -674,7 +674,7 @@ void VkLevelMeshUploader::UploadLights() info.OuterAngleCos = light.OuterAngleCos; info.SpotDir = SwapYZ(light.SpotDir); info.Color = light.Color; - info.SourceRadius = light.SourceRadius; + info.SoftShadowRadius = light.SoftShadowRadius; *(lights++) = info; } diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index 6b6eec003..b7d5f04b0 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -57,7 +57,7 @@ struct LightInfo float InnerAngleCos; float OuterAngleCos; FVector3 SpotDir; - float SourceRadius; + float SoftShadowRadius; FVector3 Color; float Padding3; }; diff --git a/src/doomdata.h b/src/doomdata.h index 40d3b6862..09235c03a 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -382,7 +382,7 @@ struct FMapThing int FloatbobPhase; int friendlyseeblocks; FName arg0str; - double SourceRadius; + double SoftShadowRadius; }; diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index ab2c939ed..f71f60fa6 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -518,7 +518,7 @@ public: th->Alpha = -1; th->Health = 1; th->FloatbobPhase = -1; - th->SourceRadius = -1.0; + th->SoftShadowRadius = -1.0; sc.MustGetToken('{'); while (!sc.CheckToken('}')) { @@ -792,8 +792,8 @@ public: th->friendlyseeblocks = CheckInt(key); break; - case NAME_SourceRadius: - th->SourceRadius = (float)CheckFloat(key); + case NAME_SoftShadowRadius: + th->SoftShadowRadius = (float)CheckFloat(key); break; case NAME_lm_suncolor: diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 39bba8085..9359888e4 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -864,7 +864,7 @@ xx(lm_dynamic) xx(lm_suncolor) // Light keywords -xx(SourceRadius) +xx(SoftShadowRadius) xx(skew_bottom_type) xx(skew_middle_type) diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index 42ccb8fef..98d105acb 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -115,7 +115,7 @@ void AttachLight(AActor *self) light->pPitch = &self->Angles.Pitch; light->pLightFlags = (LightFlags*)&self->IntVar(NAME_lightflags); light->pArgs = self->args; - light->pSourceRadius = &self->SourceRadius; + light->pSoftShadowRadius = &self->SoftShadowRadius; light->specialf1 = DAngle::fromDeg(double(self->SpawnAngle)).Normalized360().Degrees(); light->Sector = self->Sector; light->target = self; diff --git a/src/playsim/a_dynlight.h b/src/playsim/a_dynlight.h index a73074b4f..ad9a04ec4 100644 --- a/src/playsim/a_dynlight.h +++ b/src/playsim/a_dynlight.h @@ -130,7 +130,7 @@ protected: DAngle m_spotInnerAngle = DAngle::fromDeg(10.0); DAngle m_spotOuterAngle = DAngle::fromDeg(25.0); DAngle m_pitch = nullAngle; - double SourceRadius = 5.0; + double SoftShadowRadius = 5.0; friend FSerializer &Serialize(FSerializer &arc, const char *key, FLightDefaults &value, FLightDefaults *def); }; @@ -223,7 +223,7 @@ struct FDynamicLight bool IsActive() const { return m_active; } float GetRadius() const { return (IsActive() ? m_currentRadius * 2.f : 0.f); } - float GetSourceRadius() const { return (float)(*pSourceRadius); } + float GetSoftShadowRadius() const { return (float)(*pSoftShadowRadius); } int GetRed() const { return pArgs[LIGHT_RED]; } int GetGreen() const { return pArgs[LIGHT_GREEN]; } int GetBlue() const { return pArgs[LIGHT_BLUE]; } @@ -270,7 +270,7 @@ public: const DAngle *pPitch; // This is to handle pitch overrides through GLDEFS, it can either point to the target's pitch or the light definition. const int *pArgs; const LightFlags *pLightFlags; - const double* pSourceRadius; // Softshadows. Physical size of the light source + const double* pSoftShadowRadius; // Softshadows. Physical size of the light source double specialf1; FDynamicLight *next, *prev; diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 4cb0cd60b..ea0bd0538 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1374,7 +1374,7 @@ public: // (note: this is put into AActor instead of the PlayerPawn because non-players also use the value) double LandingSpeed; - double SourceRadius = 5.0; // Light source radius + double SoftShadowRadius = 5.0; // Light source's soft shadow radius // ThingIDs void SetTID (int newTID); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 453ff5b78..09d4dfc9c 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -6046,8 +6046,8 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) if (mthing->fillcolor) mobj->fillcolor = (mthing->fillcolor & 0xffffff) | (ColorMatcher.Pick((mthing->fillcolor & 0xff0000) >> 16, (mthing->fillcolor & 0xff00) >> 8, (mthing->fillcolor & 0xff)) << 24); - if (mthing->SourceRadius >= 0.0) - mobj->SourceRadius = mthing->SourceRadius; + if (mthing->SoftShadowRadius >= 0.0) + mobj->SoftShadowRadius = mthing->SoftShadowRadius; // allow color strings for lights and reshuffle the args for spot lights if (i->IsDescendantOf(NAME_DynamicLight)) diff --git a/src/r_data/a_dynlightdata.cpp b/src/r_data/a_dynlightdata.cpp index da451282e..bc692faec 100644 --- a/src/r_data/a_dynlightdata.cpp +++ b/src/r_data/a_dynlightdata.cpp @@ -126,7 +126,7 @@ void FLightDefaults::ApplyProperties(FDynamicLight * light) const light->lighttype = m_type; light->specialf1 = m_Param; light->pArgs = m_Args; - light->pSourceRadius = &SourceRadius; + light->pSoftShadowRadius = &SoftShadowRadius; light->pLightFlags = &m_lightFlags; if (m_lightFlags & LF_SPOT) { diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 6d714f600..066fd55a8 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -255,7 +255,7 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) meshlight.Color.Y = light->GetGreen() * (1.0f / 255.0f); meshlight.Color.Z = light->GetBlue() * (1.0f / 255.0f); - meshlight.SourceRadius = light->GetSourceRadius(); + meshlight.SoftShadowRadius = light->GetSoftShadowRadius(); if (light->Sector) meshlight.SectorGroup = sectorGroup[light->Sector->Index()]; diff --git a/src/rendering/hwrenderer/hw_dynlightdata.cpp b/src/rendering/hwrenderer/hw_dynlightdata.cpp index 2414f2901..517b8a501 100644 --- a/src/rendering/hwrenderer/hw_dynlightdata.cpp +++ b/src/rendering/hwrenderer/hw_dynlightdata.cpp @@ -135,7 +135,7 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f spotDirY = float(-negPitch.Sin()); spotDirZ = float(-Angle.Sin() * xzLen); } - float sourceRadius = light->GetSourceRadius(); + float softShadowRadius = light->GetSoftShadowRadius(); float *data = &dld.arrays[i][dld.arrays[i].Reserve(16)]; data[0] = float(pos.X); @@ -152,7 +152,7 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f data[11] = lightType; data[12] = spotInnerAngle; data[13] = spotOuterAngle; - data[14] = sourceRadius; + data[14] = softShadowRadius; data[15] = 0.0f; // unused } diff --git a/wadsrc/static/shaders/lightmap/binding_lightmapper.glsl b/wadsrc/static/shaders/lightmap/binding_lightmapper.glsl index e23406f12..a03e2ab49 100644 --- a/wadsrc/static/shaders/lightmap/binding_lightmapper.glsl +++ b/wadsrc/static/shaders/lightmap/binding_lightmapper.glsl @@ -37,7 +37,7 @@ struct LightInfo float InnerAngleCos; float OuterAngleCos; vec3 SpotDir; - float SourceRadius; + float SoftShadowRadius; vec3 Color; float Padding3; }; diff --git a/wadsrc/static/shaders/lightmap/trace_light.glsl b/wadsrc/static/shaders/lightmap/trace_light.glsl index 742e961e2..1265909bb 100644 --- a/wadsrc/static/shaders/lightmap/trace_light.glsl +++ b/wadsrc/static/shaders/lightmap/trace_light.glsl @@ -29,13 +29,13 @@ vec3 TraceLight(vec3 origin, vec3 normal, LightInfo light, float extraDistance) #if defined(USE_SOFTSHADOWS) - if (light.SourceRadius != 0.0) + if (light.SoftShadowRadius != 0.0) { vec3 v = (abs(dir.x) > abs(dir.y)) ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0); vec3 xdir = normalize(cross(dir, v)); vec3 ydir = cross(dir, xdir); - float lightsize = light.SourceRadius; + float lightsize = light.SoftShadowRadius; int step_count = 10; for (int i = 0; i < step_count; i++) { diff --git a/wadsrc/static/shaders/scene/light_shadow.glsl b/wadsrc/static/shaders/scene/light_shadow.glsl index e46421345..7ca90d173 100644 --- a/wadsrc/static/shaders/scene/light_shadow.glsl +++ b/wadsrc/static/shaders/scene/light_shadow.glsl @@ -182,7 +182,7 @@ vec2 getVogelDiskSample(int sampleIndex, int sampleCount, float phi) return vec2(cosine, sine) * r; } -float traceShadow(vec4 lightpos, int quality, float sourceRadius) +float traceShadow(vec4 lightpos, int quality, float softShadowRadius) { vec3 origin = pixelpos.xyz; vec3 target = lightpos.xyz + 0.01; // nudge light position slightly as Doom maps tend to have their lights perfectly aligned with planes @@ -190,7 +190,7 @@ float traceShadow(vec4 lightpos, int quality, float sourceRadius) vec3 direction = normalize(target - origin); float dist = distance(origin, target); - if (quality == 0 || sourceRadius == 0) + if (quality == 0 || softShadowRadius == 0) { return traceHit(origin, direction, dist) ? 0.0 : 1.0; } @@ -204,7 +204,7 @@ float traceShadow(vec4 lightpos, int quality, float sourceRadius) int step_count = quality * 4; for (int i = 0; i < step_count; i++) { - vec2 gridoffset = getVogelDiskSample(i, step_count, gl_FragCoord.x + gl_FragCoord.y * 13.37) * sourceRadius; + vec2 gridoffset = getVogelDiskSample(i, step_count, gl_FragCoord.x + gl_FragCoord.y * 13.37) * softShadowRadius; vec3 pos = target + xdir * gridoffset.x + ydir * gridoffset.y; sum += traceHit(origin, normalize(pos - origin), dist) ? 0.0 : 1.0; } @@ -212,11 +212,11 @@ float traceShadow(vec4 lightpos, int quality, float sourceRadius) } } -float shadowAttenuation(vec4 lightpos, float lightcolorA, float sourceRadius) +float shadowAttenuation(vec4 lightpos, float lightcolorA, float softShadowRadius) { if (lightpos.w > 1000000.0) return 1.0; // Sunlight - return traceShadow(lightpos, uShadowmapFilter, sourceRadius); + return traceShadow(lightpos, uShadowmapFilter, softShadowRadius); } #elif defined(USE_SHADOWMAP) @@ -346,7 +346,7 @@ float shadowmapAttenuation(vec4 lightpos, float shadowIndex) } } -float shadowAttenuation(vec4 lightpos, float lightcolorA, float sourceRadius) +float shadowAttenuation(vec4 lightpos, float lightcolorA, float softShadowRadius) { if (lightpos.w > 1000000.0) return 1.0; // Sunlight @@ -360,7 +360,7 @@ float shadowAttenuation(vec4 lightpos, float lightcolorA, float sourceRadius) #else -float shadowAttenuation(vec4 lightpos, float lightcolorA, float sourceRadius) +float shadowAttenuation(vec4 lightpos, float lightcolorA, float softShadowRadius) { return 1.0; } From 13b9ffd6c83ea4b3aa49b9ad4d2af3e4da2c620a Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sat, 15 Jun 2024 18:14:10 +0800 Subject: [PATCH 106/414] Rename SourceRadius to SoftShadowRadius (to match VKDoom) --- specs/udmf_zdoom.txt | 2 +- src/namedef_custom.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 402f3d6e8..73e94ea8a 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -424,7 +424,7 @@ Note: All fields default to false unless mentioned otherwise. lm_sampledist = ; // ZDRay lightmap sample distance for the entire map. Defines the map units each lightmap texel covers. Must be in powers of two. Default = 8 lm_suncolor = ; // ZDRay lightmap sun color in hex. Default = "FFFFFF" - SourceRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 + SoftShadowRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 diff --git a/src/namedef_custom.h b/src/namedef_custom.h index e04dc3795..61bf9d261 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -865,7 +865,7 @@ xx(lm_suncolor) xx(lm_sampledist) // Light keywords -xx(SourceRadius) +xx(SoftShadowRadius) xx(skew_bottom_type) xx(skew_middle_type) From 8c1351a3631edfcd5f3582c36a296d16ad351b44 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 16 Jun 2024 01:19:09 +0200 Subject: [PATCH 107/414] Use a win32 message box if a fatal error happens before we got the chance to initialize zwidget's resources --- src/common/platform/win32/i_mainwindow.cpp | 12 +++++++++++- src/common/widgets/widgetresourcedata.cpp | 11 ++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/common/platform/win32/i_mainwindow.cpp b/src/common/platform/win32/i_mainwindow.cpp index 95dda5031..abe46df5e 100644 --- a/src/common/platform/win32/i_mainwindow.cpp +++ b/src/common/platform/win32/i_mainwindow.cpp @@ -20,6 +20,8 @@ #pragma comment(lib, "dwmapi.lib") +bool IsZWidgetAvailable(); + MainWindow mainwindow; void MainWindow::Create(const FString& caption, int x, int y, int width, int height) @@ -115,7 +117,15 @@ void MainWindow::ShowErrorPane(const char* text) for (const FString& line : bufferedConsoleStuff) alltext.append(line.GetChars(), line.Len()); - restartrequest = ErrorWindow::ExecModal(text, alltext); + if (IsZWidgetAvailable()) + { + restartrequest = ErrorWindow::ExecModal(text, alltext); + } + else // We are aborting before we even got to load zdoom.pk3 + { + MessageBoxA(0, text, "Fatal Error", MB_OK | MB_ICONERROR); + restartrequest = false; + } } void MainWindow::ShowNetStartPane(const char* message, int maxpos) diff --git a/src/common/widgets/widgetresourcedata.cpp b/src/common/widgets/widgetresourcedata.cpp index 522f4ff1e..849b6d553 100644 --- a/src/common/widgets/widgetresourcedata.cpp +++ b/src/common/widgets/widgetresourcedata.cpp @@ -12,6 +12,11 @@ FResourceFile* WidgetResources; +bool IsZWidgetAvailable() +{ + return WidgetResources; +} + void InitWidgetResources(const char* filename) { WidgetResources = FResourceFile::OpenResourceFile(filename); @@ -23,11 +28,15 @@ void InitWidgetResources(const char* filename) void CloseWidgetResources() { - if (WidgetResources) delete WidgetResources; + delete WidgetResources; + WidgetResources = nullptr; } static std::vector LoadFile(const char* name) { + if (!WidgetResources) + I_FatalError("InitWidgetResources has not been called"); + auto lump = WidgetResources->FindEntry(name); if (lump == -1) I_FatalError("Unable to find %s", name); From c66b809d4e9aae0035896fe77b2620e271e8dd70 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 16 Jun 2024 02:31:34 +0200 Subject: [PATCH 108/414] Initialize COM early as we call SHGetKnownFolderPath as part of crash reporter setup --- src/common/platform/win32/i_main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index 200cd541b..c05e1aaba 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -229,9 +229,6 @@ int DoMain (HINSTANCE hInstance) WinWidth = cRect.right; WinHeight = cRect.bottom; - if (SUCCEEDED(CoInitialize(nullptr))) - atexit ([](){ CoUninitialize(); }); // beware of calling convention. - int ret = GameMain (); if (mainwindow.CheckForRestart()) @@ -296,6 +293,9 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int InitCommonControls(); + if (SUCCEEDED(CoInitialize(nullptr))) + atexit([]() { CoUninitialize(); }); // beware of calling convention. + #if defined(_DEBUG) && defined(_MSC_VER) // Uncomment this line to make the Visual C++ CRT check the heap before // every allocation and deallocation. This will be slow, but it can be a From c72092ffedc357fd71487880f30ee2d1149bd9cb Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Wed, 19 Jun 2024 12:28:33 +0200 Subject: [PATCH 109/414] Fix redundant 2D shadowmap test for lightmap lights --- src/rendering/hwrenderer/scene/hw_spritelight.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index 689e3d85d..adf3d58e9 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -158,7 +158,7 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig dist = (float)L.LengthSquared(); radius = light->GetRadius(); - if (dist < radius * radius) + if (radius > 0 && dist < radius * radius) { dist = sqrtf(dist); // only calculate the square root if we really need it. @@ -181,7 +181,7 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig frac *= (float)smoothstep(light->pSpotOuterAngle->Cos(), light->pSpotInnerAngle->Cos(), cosDir); } - if (frac > 0 && (!light->shadowmapped || (light->GetRadius() > 0 && screen->mShadowMap->ShadowTest(light->Pos, { x, y, z })))) + if (frac > 0 && (!light->shadowmapped || light->Trace() || screen->mShadowMap->ShadowTest(light->Pos, { x, y, z }))) { lr = light->GetRed() / 255.0f; lg = light->GetGreen() / 255.0f; From 57d39048c8bd7124c24ea7286459a8bfc6e803fd Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Wed, 19 Jun 2024 19:39:02 +0200 Subject: [PATCH 110/414] Apply 2D shadowmapping to particles as they do not use levelmesh raytracing --- src/rendering/hwrenderer/scene/hw_spritelight.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index adf3d58e9..4cc36e1a9 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -181,7 +181,7 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig frac *= (float)smoothstep(light->pSpotOuterAngle->Cos(), light->pSpotInnerAngle->Cos(), cosDir); } - if (frac > 0 && (!light->shadowmapped || light->Trace() || screen->mShadowMap->ShadowTest(light->Pos, { x, y, z }))) + if (frac > 0 && (!light->shadowmapped || (self && light->Trace()) || screen->mShadowMap->ShadowTest(light->Pos, { x, y, z }))) { lr = light->GetRed() / 255.0f; lg = light->GetGreen() / 255.0f; From e76e86ca4b58db8309e79c4959796937c934052f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 20 Jun 2024 18:11:58 +0200 Subject: [PATCH 111/414] Fix compile error on Windows ARM64 --- src/common/filesystem/source/fs_findfile.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common/filesystem/source/fs_findfile.cpp b/src/common/filesystem/source/fs_findfile.cpp index 9bc32e75e..5ec10f5e1 100644 --- a/src/common/filesystem/source/fs_findfile.cpp +++ b/src/common/filesystem/source/fs_findfile.cpp @@ -49,6 +49,11 @@ #include +#else + +#include +#include + #endif namespace FileSys { @@ -203,9 +208,6 @@ static size_t FS_GetFileSize(findstate_t* handle, const char* pathname) #else -#include -#include - std::wstring toWide(const char* str) { int len = (int)strlen(str); From 8c713794a0e79a73fae0353d399e3abde1bc595f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 20 Jun 2024 18:45:17 +0200 Subject: [PATCH 112/414] Add missing arm64 dlls --- bin/windows/openal/arm64/openal32.dll | Bin 0 -> 1238016 bytes bin/windows/zmusic/arm64/zmusic.dll | Bin 0 -> 2298880 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/windows/openal/arm64/openal32.dll create mode 100644 bin/windows/zmusic/arm64/zmusic.dll diff --git a/bin/windows/openal/arm64/openal32.dll b/bin/windows/openal/arm64/openal32.dll new file mode 100644 index 0000000000000000000000000000000000000000..9ecf5c11f60be84cec25721c5fa04d0ff8a731f8 GIT binary patch literal 1238016 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�Y1+LviBL3KS6tuwm{Fb0fpy%kRR9>Lb{b4R(3(d&4ZEqG|yk>$>x8Z zC$D7nIX$0|^Yu$+h7e(fKa)0dGyF`1hTr7RjPP@8L|GWNoL~|^y?{@=o9SciWzc?d z{Z0R;HzJ*7Qw$9YP+A0?Wz+bXamorlvF@p$vuyZ;yCL^79K$$=ZZfM+H>gZXVqggQ z%q+GFlm|iXsAuARt-;6;a_9elaZosIM-B^R#)+c*OjBf_;j{r+?l8kdK6p5R>Mh8e z1c!mcPEb1#w11wNi6KN-1boNc1SUrIiJ*2mgQCGiX90$Z1xyZmA38Hk{2Og3Ven54uo5k>x??nEY#JeR}H`VT{I5FuFBiIgxL_M%S z&wdiOWFdYk}OyI5DXSA`dbjEPqgc;x3T+dQkTXF-=TjVuJWj(Ex1zG?0EHhn+7O z8iF1>GfaG0&!qV%m|^0>WQK_^q#1UC+{MtyKT!(g4mXFj8{8PyPU1RXyNRp8w!_F_ z=L#dpUO?nNPBb(PAlgT`(-|lYC@Hdn(-$aiGngE9!rlK+cVZVS!xWGhXj}_9ojF16 z_zWIrBw#)x4)ZtaPAtMvlOLRLtAWYhrkSo2Y@q4-bemAME~ztP{cM=^;Oc`@gVa zcmD}e%x7eSgij)7_}sx^{stn=2Zzr=%3&eWFgWT>1fA;-vJ*X@We{mT$Q-7Ju<+Ld`vWC?ybpYUJ0w0Gz=Veg6_+dKgdwHn1>-mjIH64iHO5bPR?ty zIv5%*J$81m1noHnonvP&$ncS)v2&Jit=Q}&CXsG$HijwXeAi})F*IBf=VI70If!B6 z7gmN3KUf(){A6YL@C!7S!PIcck(qU3LJ-5n#C89tJ1{bsaxyhs>SAiR#Le7rsfW4Y z5-&@`r9PI1OZ==2m)cnyE`j=QOiT@z6q_OXf?@hN8ZLElG+g55Y`E0J*>H)MtKm`~ zSHmTK?uJY4+zppNa|IxMjLd9c`&?oA_!=&C@ikoH=5M&v!{2a;SD@iipFqPUe!+%I z?Sc)LKy5sbzQ!hqKJ#_pwR5JNA`O?iL>ew}i#A;95pB4{E7owSPpsh*zj(u?cJYQw z8HeI`Tw`OHc%Mo9wMM4tj!ZV^9iEw{J2ISNcVuLm?kH%A-7_K6bWh=-*gYFFP4^Tr z#qGJ2X}TxFDQ?G$Ow%33O>uiZXPEAJ{0-FSI<(?vw)09vzYB5?>j_teDQ8t7Wf-KK z+>JQDFPnMgZ)MQAeUS1W6qlemWcfsf!o|D{AzaK2myE%2c?uktusHe6%J2aemlCyH zvtP0@d=O_A?yhGNf4zW}Aq13`MIG5Deqk0~1qv5MM%Ia-wR|7f{-4gk#9#svOKgUS zy;=KzdIBRv%#j&%R*cB1=WG8@KfnMHQ*4HaJzD#Jx&kMIDX4G17~I|wT?NYLh`P>T z;(2CJ_VVE)j+LnAA#4zy@v^~p^2x&`d zgXHBP>Em$`!^B6>_AEmqq%EfmN*_(2@Rxw3kDvcTKJhn>h}1-v{-G@7`Z2~u8w!g4;7_-jJt#m+U* z@&Z~vp_dmMVe-&=2)(>m36qD`H|XWXLXbSDynxm#hkedmW z7mh9rQ{3S3O#S-(I17>WyECMo&Rj!c{eBptFB+x~8mSX0GF$-F1)#PXw0^&UT)%_vB0{O(9U*o3 z&(%oz^)N*2%W9I|vN->*i>uZJOGuU6yEuORyv9vV!%&IqaBL44#q3#;EZL-Q*r zufAkuxPUXig54{;>g;N0enqd}!EP5`brdF#UcZC=A-rlYOdh>{2m48Q)mD%^D8CY} z-!BkTzlSHaX;?*9hyFDVd`+z@6dE&3{!`zeut(P&DA8;?-$6e-w!)6OgW(hDKiMABLek1 zIQ!6zdGTTuW_j^=6=r#HZxw;^!qI5rX$FQV9a!pjQ2JmL({=Vm^`$;f!FWQ_+JT<2bCAZ)$bPw z)$g883{(7|@eJzQf%@ppObj91Yz>#R!2P<@;C>yftmmxdo~_M$dX_gM!xm2luG1Qf zT-^e$4r{Yn87_kECl%s6U>n5QVC!{|VWRf`|64(O{SBNLz~{Ar%?I@x*%?CEnHw(Y zgUvq1$v7Cf!{eaLjsnK0Jpqied*1!| zzjZz%@9Rg53?ZCs4VOA>*=Kiha?W1E$a9)2kYS?sMuv$6j(2T(K<+@YuaMPwPhczK z9vx^Hymw>}0sFs^q3|#hq(21;Uyz?c{VDFo&RMTPVH(IV(W`)AVu0g48&H@U9Gqw4 zaWH;|#zFZVfvnDZ3|X1>1Ubg;F>;jK6WkcP$GA~$&+31WaK7e<8qUd}cx1*OkJ^k3 zTLKsk*n;c|U~I7U;Bffqbbw)^2PeZ%&|R>wINa~ZAo90*&&toij4QuJGp+nC&F~X6 zmv(d|=xiXii{GK=kbh=oT=jtow5O73RVEW?50AsnZ_Es<>=`+-LF<7est8<`w-K4@Z@ zcz^%@>7aS0L=c~eW#aAq|EGiI@<8VXK4@Z|SiAZEbkJFqp!$KyQDWi)CgzEMHbBHc z^B)hIm?pk~^1*5pL28&Leuj!YVisBTpowwfV<;c2h7qKOapEhe*du1qRS%jNCfaG8$gY1{z1@SBBe8X2v3{yNnXGt+CO$6~XI3Vlw zu*G9A3GtW=ns0{2BWN8OC?35D#N%?bcwCGYkMq&uksC`qc0t1%7LQd>J~;fL@z@9z zgT-SZln+(|jmHY87%Uz$pnR|zXgua4#bXFOoEawu!q`oW6a8RpCZ>trFm@BuL=PC7 ziFu+cjNQaM(Fw+8Vwq?UV>hu(w1KgiSSMOS<8kdyL_AiY#p5@2-0}Eu1@8P<#01(G z;IJ2z9|M#i>j?`P9QFn%LDmz3;_>DR?D;W)!C@~bKSo325xf?yiDhCqG#(R}K=LdT zgVEw~<|c?gz+nr`j}p-EhQ%WXln+(|jYoc{7%U$DuSYTm8joynHIV%H4OtB|9{;X~ z=D{Y0iI28G*-VTR@59(lj1%v`*i1|lZ^GD3OcSrc*i6h5FT>bP%o8ub*i0-F&%)SE zEE7+`*i5Vwk8gqGM{A^bWJ8O`7HB+z)@6NV2aT~p*3g2=vkW1JpP5_^Ke<46kuY+- z&R}2&QDkVibXA;TN`{)_N^Vw$i&>1EU0Hk#KS63a8M(Sa>jO*~xw|+kOMkp%VA#sY z-T*#h=)h~nDWLt8AbEyL(;pxjq{hCMMbo~PVWoX7<4XI#Oe?|Wurf@{6au;B@QSbO z4nJY*u|VVV-!}iB4lYj?N`ub`4S~5I>o_809~o$E#SdntRsTWbgUk%8J~K0~TENK= zqRY^5>4lrajuIw^pWLhrffJp$z~`J~{dK#{$;fj$Ua<4E5(h&_mmpVnwy49Tm5Qfl zc`!Qsv}fdamB6?5}JLTUP9H+}T|O4zIwDGKZflw>j>N{Ofi(N|Zr} z<74e*d)|)MhnN{cG*}rXuG;0ev#c`X$H^kdJrVYdT-gtq7(&FD8MZVkxvT{3U$bZ6 zcnw~2>BKPc)CxY4CZjxW;zzwbQ>aGp({`5P1#C`wzGo zLO|z(iymZ|XdJ*W@ir^Nh3~8k8-B1dZ1~B_u;CXg!v@fpB5Y2DX9c1S4x2AwUx8?Y z!{$PmRv_Bo525oMf0zHCp1{dq3Yy12ACm{Ufx*#e;;X-)wJpv&ko)VPF*dM#qS3@h zAbF?Q9gBq+CoY1{&x7PUSQ$Qm`h>Us{+|w-2LbUH8!=8?qy(9xht2PA`}co(!J*ha zAoCUnF-~0M1eJ%5`K|-WGsQvVix?*^N`lHaLdJZT{rf*1G@r6~663^0Nb~<7^FU(` zyTJCx?OD8uapIyy5WNY?kokn^AiY5h7v&j6UMGG9-ES=hzAFk>9A?Wy`doy@X~>FC z=os3JyIzj3P#Ag{OzSwZbXC6o%Pkg3H^=Qr>$ z$Z!bg$$2m|1l7ke>=YERlgn7eXvyW!5X7ahps3&wlkNs?2AL8iwuu=^47x?!3^Jhm zgbJe=_8M|C$bi-?W*lPH{lLW_lOe>gH$#nKZ$=Ws-ug6#ouKpG>i;pVtpCTnvi={- z%KA$Tm6;q27c?F^?bKvy3d*Qr*qd=kK)0}uVQ!hMMENxqZd|=^2NZCI+xD$Z#<-Ps~sf))i!7kSS0S(UoW9dR@4R zVK3-xM@~bAi5dsx_t-ni|Il!3(a|tuxTxW33s&R!AC%ufce5Q{@q*joFYGROP+jJ{ z30#+5V1(9X3!!K8fX}64*y0RY*MIYzxcww9w*8a1*z93v)q(RR_}(W-{no+CZ~=6d zI>_Ik_LT@&Er;(7Ej;Tn;}? z7#X%q{ZxAy)DGCH#Bgy68^cA0%+epAb#t3vGENEkk670U5?l9@aSCXSVLcbaPsrL% zhMy~6GEM>c0eMXl;=FlC*nr)^r z9}VIsV_DnA{`dd%4k^sFZJ@FdRQE}P^vgNy1@W=1ZTk+AR|1cBUO-;o2Al7E50VG1 zeKTU5m;|jiL2mgV%&-?U=lLAue$d*tAjXMF(0UV8_kz@b>b~E<|4*Nw2Q|Nlabgmz z?u5>#UkB+o0{I_x?HpMDLH&uZLHf<0`ZqC7OoG;*42_Wb^Ek+TR#5p%j1!X%LF!kA zgAn=sAbC5eJeIYE+d=Y9P_;+sNc=% z^y38s!xpYYCaiiv>K^|4AChs+;U_%*UxViVOAJ3t&LQRhQw~32`F}xH1|5>Y0Rt7=N9gI6)t#aC_$SJgKvXf?*(yipTGIN{bPFNoUG)@TWV`S}e+?iOJ@k6r!(Z^t9WC&4YWY_}k(=rRM z+9wRUOXVPZe+HRTq|B#aes_kTH#n_wo@JP% zRm(Sf>m#r3#DD)o?lXyk*Jg_|G)$6g=)V-nu;7z~!-7j7yI^PE$_sbC=459G=?HQJ z--!ph56`@YVP%J(<4;aUhKZeij6Xs9{u-RPCU$)OKOH3gkXdpSsNDiOySAK(;U^0y zeIcEF3$pjcpZ_5W44}Ib4`N-r4l+m7k>TP>CWoJ&nKf5|_8ggk)`)@kG$8h=oPgFZ zE1>&Sj2VTy92CW83;zE<{qn#6Tem4OOa$#qc)@JEY6TO+&(F^pr`%^^_z5x}bS^H) z{h%{b?*0ESj=JuBA9!C1Xub8SMUE>${VH!pj_!Cy?$-}^7(&)Aa#+d3%5brRk*jNE zWyTK^Nr#_P7#OyCu`)~qsR6Z3ws13S>0omBnZeDlwS%Q8D4u~M8+3Oi8$&}-0vkif z3aA)}eFDl}2nuT@M@w;rO1VZQhn)>U4wmwaOoay-L2=*!?l)@HG6n|=G6-Jy&oG6f zMp)W|fx)za!S2c{t`kz7K@K}X=6lz2N`uzG$+IHqy>2?JV-z<=vmsZws`BFB|n3=Khgj2zwejC`*jFfxQJ zU*xcopOxX_3r5baHx(H_;u*QKLF@H9Bpr6h8;|V4P%L`2nHlP3h7iVC2 z@c;k+_l}@E$-uC|0Zji}?||O^;ZlfN30k)Z%8$H^T;1`EyssZ{F@*3aM1sd}G8nnK zIx91NgfcK}HI;PusUhjG)0359;wxs(RrZX$udg|2bc4$BFiwUo8jLML_6!`^pfguI zU~Eu*0A(w3FodiSa@cv1DS4g%W3rrrRDm3*{6Ib*-~dzdJan-YN{*Hbl^k|1fTklw zCWeqLK@K}R*cbviYZ-%$1sMeGpm8h6m@F5 zZ})yizSj;c3?VrT3|qPx9e#rD5dw`rWpFzD1hpqJSRH<9G4ghCR%ZRMXXJkkx`CCdeC70L-Q zCd(yA6=C=Rly(^y4D7YGIQ-<4ZMXzVvwREkGZ^F-f7hl%lw3?J1Q zJ7#$Xg6bBAkD&QPHpb3b9*ittIZnBTOR9_=vyjvH3kHXsCm9@ea@DfT_JrnXFV2&* zRxmjH^kn4d_GDoAsiWYxl5-29ZKK2l89xQ(gC4Ye0NTsegOm?6l^irVY8@_X);e6~ zG~`^Rw>IZ8zI*|iSI+_E3xjGW!}jNGpq7#Tu%6(XVaDQDNJN>F*v z4{k4dNIL91cF!PdY z@$ye^(enI%Muv}|Fn;lnc_Qcxdk#j2oi76!CW6GdYFTH4!jyxta~3C~!%kRud2*hd z1(ugfy)s; zMux2*^`N^SK;;fz)>Hz^AhrKX22pTx-H9DjuH;IkmuaF7E+~7k>a+A3j{<E8$GNPzy1#qV1bwgbBhqNTcC0C@bmu=0UlI!9LVaRZeIBPe~5qulACRi z-0T3+4|DSmQ2QAz?iPOdA0i+CQ3rF+JLuUPV82B&6n026gk6F z$#8(=mmEHZ5C6`~RnBV)4tvd;dcOCP2)BrJDo>29XS? zTMmdbglIth(8!7DuEal}un-5G!@ElR-~Z{LJ3&BUA*{#`z8mE;7sJo?w~SL7#2HLM zau1UjCNl6k{p4f-_icWH?qlbaZ@6?qiDlw_CWeoodiJFdsJ?Xg8Oq4n4H`%4e#OW>Mad^wKG8B6J!Zdr~+5aJ+ z^zQTL|8$TaKw)$3|9^3GHzc0V`A_|BKg~ITV8KjCsL;a0}yiOnVYf{SOhS zLDjzpi#>`b|Az=PpsL&S|G#)flS3evDnnpAFGC^6m;WIr*%<^hJXcw0aB_4rFv?#; zckjbv|3d^SP|aC@#lD3{|A#zY#4z#6Ch(qlEztRkTNxRqFvu_jH+=eU@fftHFZ4wxpi-Cbbj)8%}nvsFw3I5s}W z9FVynyT1MZ|KE;*fdPb%UAS-oGH=Dekb3s4BewR-?fL(w|36Gz`$b29A>@DtqW!|d z#Sr44foQ+vfYKEUqW#jt%n;(B4r#wMNFmxU3)C1wGC3GNK=Z`}8* zB}kq6QW8<8g3r!$w3vwAw%K?0|Mau}|BHjpBm$cOs+Yh258+gVn6Xk8VFujo5)22toZP#_)6H z|Nr7JH>1~s6Yu_?4$2c5j4j}D?~DLLhyzl&=flMilEBRn0;@CLfbN3eLaN)iAoX4Y zs4RlkC7}BaJ)rEy_x~~KJJ7iJBW6gw;`#?tCO0TCtW;oV2&zMJE4I2W_3r=aCIA16 zqnGob@oSiw27lmn)lcNQ>dtG%DGkEp*HsT*L+UC}9RjMSKy%S>>ZMk|~87$9X+!ZT3W)Brj+|EB@S z4#t)sSUG>X;|U=ECy-W2m{85aqZt)Le$U|4m+~xoUQ(F|2%PjyyvMg9Ss#3TPiUM}Q%u!5owZ zAmwom=zLx_q&fn09-kScjsW#_VSU^Ornu{fB}U-3(*~wSMwGTw#vN!K;mkBqci#W$ zh_&O8b59{3LL3tB&Hp44W+XC7Teqex9$H3c4 zPLuaT(^vy&9Fvt{0;uneUjEzN`9B@hZi3e#f((T#e*6zPX%0?PJ32A?We7Jn{`w!X zVkyE+N8#-hgqp;k|3g;PI_~6TZ3>cSMC) zfniIBBy>Kw(qSjepBq5=n4uvEvJRJn{&UmLD+luG;e(lAasB{5QGa z=9YWO3Y@0pK>9S8D&#uY7^uL}_NF+TVovLY9e_CJF3K?6`w)ebr3YZht2(W{)a3)>S+1!2}Iq4U;n{(XDf;@ zgj|5u&!BK+yn$&)<1J8r5Y__4=c^z8r+<)PhynSHK`B8_z%D@!98XLPJNN%X?eo0> z)y3QlA)xwJhYdo5>S0)W?!ce_;QrtuEMfHU+W(M+D;+KEB^U}lxEVrDii6^D;f|L` z#sYCKrqlWoN*@|KbOj7$>gU^ndyzW(Lr@ zzX^YC-K3ba8BakU7YBD+72k38bBY{r~^}gfK`w zNDU_g1H+g9|NsB^|Ns9Vs5@C07#KJh7#MgM7#M^Y7#Lvg0;z@cyAS;T|Np)te0>P` zJ{!pTAy9j1#WF`r&>Ec|%*?C4GqbFE!N6d$Vi~laK82{KLGvu2`Qn~a3_rsp9Dbe< za@g51k8$V8AO}l(R)#{*euNdL94$fPHjWGoA)Sm3L7ho#mM6j-EIZQJEDtI<>^uWqCVM@ay#+@*}-*?D7=7BH=OY`pxQ@WDeEJ5?=9m^PZdfa6e|kUF z0rBTAVzY#af!0)HfZ7Pl*ev4>845vt22fcGx@Y7>k%MK&A~wqtWe%1d%h)VWC^_ux zSjPxnXVn2}b3Ag~$;l{h1iG_jMIEA@0_rDqfaMsBIv+9aeBs0}asD&Lo&T8_K0ajb zm<8HPaoB@#$|GipRr?RIS%S`m0`HsPVweKjTLGF+?w)?c^Fg3vphV0%hH_cv)UfX>>1>?`3!+E)S!U)Wv5pnJ<9^FfgLNRYYQpm|so zho2z(HFzC9)#{-ric4nf(M2(%0bp@b%l00M?f-{&H zOgTy*@*J`Z!7msYOt_$CdhkNb=3r#l!pZ9J^A$74Do+N6E%t?sJ3)4U%=GyGe=CUQ zQi0xy&cMI`Pj|u$KVOJ5`~|h^LGAg^%uHIKc_~mG1KL9gI^P%6c7J2Y5OP2VF}~v? z%@EQciDVXYneCMGBsBH|I7edsHiChdJ6PX0Ma-tH{U@GJ(lquY{6<+-fI?A3=9cfztT`PKGJ9NM@q;S;SUp-26Yi z6xmFuUmyPd9|H5MA(9`~*hBoPgCxcS6612%tBxd=W5*D(!VS%@UQoaKG3?#-_5bv6 zv^lgB8Vn(swvc)lUwd!i&;M}$YFk77%La+l6i$XIj>!Ijw*MG^AoO%wLiO-L^n`OV zOff;$0}X?NpAlj3fe#ViJ?4-wc#S0X#tahQ&yd7?%osveSfPc19W)G_81`0v{Xbm{ z*i7a8Up#z|FgM!} zYOWH*+_10zr+$E;pj~Yae=hy$!pJCCn@D0KqZ9S+SIfx#cum7jt z#G;4s^?!I?@77@m5fIRm1LbuM9fum!C% ze-aEEixOMK!DJ~1%I~1{^oyAorZiyD`|v(QFQ}ZzR)mBrNYByl|EGi2P=9A)*a9kV zA2ADSEmUHg_#l~KqQW61xzMlwr@u&cuzbM)z9;wtQ=%pKZUIpHQR2q`>7aXjj%;)I z`IuR36?lHLnPK7sX7N?A>0u43E?N=Kl%!i~Ea{zf3pdA#(qKd4e0I$(7i9PIZp*{#GI!hJJQ@DCuGhuk%<9bb}=Ev)fq`hdicwW z$jdsQx~dB;{`wg925~S<(MO6O)xS=YQRha*R^7b*f4Ul$a9(%?Qf^2nD#&SzF@%8b zr+9#5XOAc(>{m>Jq-k>w2GE=jeC||%1u=K}fD=5XbpbT*0j?L2<^$jBGEM=DC0c>+ z8UxJ}K42DGwfXx0>EOE|#2x;kuSbRTMc*(ngn;_MusKN3_$O=*vhfdQ9}?7O0mUC? zy0d_%J60x!DUbdm#-kmP$GBkW_cS7(d-Edl`3oLMm~5N|36oFk3{%d7#*~o8hR;C9 z0YT%ypgB|!4cf;58&gR5^*;pGH%@8Kwm7#MY-ij&RFs4uo4eIG}E6 zgSh29JHr&vcowK1?C|}62&^9oN}GzHIs&|=0#RlzJc2M+n~fnvV1f#`EIYvpHMb68 z?oM`wDbujHYvCaz{VYiOnW6fdAo^FbGfZg%jV~h2U9NcdKSUEWcNw_~ZJZg&efyEj zXGHk>1b7TzY}Ljpi1`!Q8K&g@|1S;>M@B@Rm%jdgddC0%;!+F@46%$13=U8XYS+Tp zybO@O7!xA{!&3%SoWj7s0K(|v*!UoGK<0w%`uzX@|6&FP1`s~|KLQLH7`8Zr4L|ZCxGT6LG$yFJSnp3+%>S9CQh00e>&uB63G2Ru=&RX1yFkv z()NVR(KAEVYC+o~ic$keA>;*GI$(*g4`zzax3=C8LA7+@yhUPEOdLh_++=|!WvhD&C zw5&@8xf!|K+4Z{KVUs)~_v;rd3?Z2;ptBmd zUw5!Dgk*6z`~>ZJ(O`kPL7iFi$z+C!uap^f!tzBj)Ezs~+<`i$0!}*@K>e)eS0QO_ zEt-1dH6a}j{)c38g7XQyTuo${5(FAwSi#D0fr-&_;#H_Qv(d~!?QdMi2m?U(h*1(D+t>Gw8f0hE+SaIsA;TXIKf^pB`V&xDvF-D_$6~M)n(Y z>`Q{7;nJL2j8h&=gzO!E!7R1Pftlea2Lr>;cx#5A(hLnj@sAlTL3^J-b@duEhL8uy z^Na=zAqTn;<^LNVh7eHO5?20$)~X!ngv>J@U_+Gu3Z3Bce*?5lb^&=UN|!dYP1eYW z)Fu;M<#+Y}bcgc}D?NlAeu^_RT-wdRU;=6*KYGkK1tbQN1C0TJ_E^98|9@-zV#bxh zj0{^!KGj~HqQr2qBP-!YF&o20keUa~9IIk(F-~z{clc@i|NmCd{80pm&+PCs{y)RY zcxHy5A-5Q({BLHO_+#4t>A$r>=Qq2o{GRN*5;4Dd419+33nsDCtbY-01JFDXI6Y%q z|9kcSbWoe@1e3!~(70g-8$$@_uFV(h^QAy@S{;iREkXI=@W=ntL350m;CWBZ>;?6R zx(&2u4sItj&p%LP0JYV?c@Z^_imqa~`hPlTeHOgV5@aaU`0_ubvjvfx3D(>7ZVM-7<91mK< z)q&2H2JM$U!N{=XL>c6+_Y6h`6L30fw3&Fg%3&v{jSlLIwp@XptHdn4O8PP56yyK@ z#ldC3ekea@Yx0C&{oAWS$mi&x^dn zPY+gxi(b+WKQ+PowK=*@p0tjzwQA5$Zeo~o-j2TFm**xb&3SkNjdxk znnd!O+gQtrB-#+G45Zu}3)U}Lz*$;jQsQIYwBOA@qBmtl+7MeKXlL3%S-8797F=2#`q$n#q9-~W(J z|G@o_3rvjG6PtHAg44??&>9{lhn>#KOcPy#5%bmpj7oAR*c^6(@`fOY%>~*ssw5ZS zE~pzcnPIQ{FIXCrTIKTo|MYDjb71QXA{h!bF8&YEOoEgzCnFKEDjKO|lLKV1YGhw_pP zg&OBUbLgV0I`TkwZi}os#mq2;hr}@Rz5IXr|G)pm4>LLJY-VOKsb^s*1kZ(VFcgCJ zrDbw3AleiUO(!}qGz67tg4+`pm>O*-g7ksfoNxaA7x!dn2m*z3=OIXaw2YZy%8S4M z#X)!CB8x9zW|;Em?|*SlH1)HX8K&I%`(K=tFp<6dfBJc1-QQ>ecE20U{SWQn?%#v# z{$mjLmoYO;*@5hSsCWT0!<0?P?uUwJF*8hA15(cjT3gDQ4eH+=U}p&7fUd(xU|nTCwAP?9fYxxftLHd4;D@n^Avo8Ig?gLE=84R<6>KQn)bwKMh85u&785vA8 zpkkmtrU#Vm$OM`PYzPAFg#gX_iZd{Xa4<9kiGucxFf;@SgYHNLtL4lF?JZaVW^-ga zFfxRkfU-g57Np#T+{di>7qX5Mw5Ji&zXi>EcYx-YS20?ynC5Pou>?^b-DP5!B2Qv^ zNVxQWx)8_?CWoCXSfFhtMp1a1>D~jzDG&4!ZKjeR;Ir(ug6<4qN;Cntfk1f{)VA@x z1gm$1S3P;aIOWfu|Kgy%U=wCB>=op2*gJ6^!(JgChrN>)G3*r@>Tf?Otik!187#X%^fcn`BA@>@C!t>|F z|I=Z8r!^oyvN`P32#1^r>;%Perx-`K!A?j#8}5a~ zv(Z6FJR2W{#IwmsNIb_rV4MO9KhSyIpn0%PG0tv5MFtrmMFtrIM{!+4M+se{lMH)7 zZJZ70zI131* z4wTM7X$)kiL?pvc^N;_hGcYo20iBTy5(mxw$bilz6?XUuYQwqz`7aKNpT0wEmLR_K zpa0^ta?3MD26#VO^AGCU>lID^LpsGE?Kw^sEbTee_5e8DqmJ2#u8O<(f4TrDKB0YI zXn%17a(^-O;{WOFf6)4i=OFdlKG2>Y4Tt43wro;~>amC7|?mx%@xQ@e+Y+i1CswzyFK>yAQe38q^jIp7(#c z2J}8)5P#!Gh}>5sHC||HRzTIfxz9M|^?k-EyZ`_HfARnS|2fdHwk^z%Q8ClM|Nlq- z`~QE(Z&VBt17UP=Y#7Aw9eh0k>@q2o`kF|lL4V}aH@PCmpn5p*~727kttpfRiZdyG>K@GzKmF!@=&U}Z1?oh4=# z=dcoVzaazYTw*rIAE5Ihx3Zw#M-E!E#{s>Q{6tgy4{p20OQ7>ZLFYw=D00sR#p^A0 zhAB;t9De#J_^s^3awc0BXbb|!nQR@0+$`rGVzWE}9^(~R70!S-ySZZ<drpwgUByK=PomNzfX_1&R{06&M+| zfX*qBXB5i@?UCj<;ASa*fXxz=$3cB>H3o($*Vq^YL2hgO4LJ+d_#Wuo&O3^eE3y^v|*%1=xa-#If( z^k8-R@n4?-RL^YTXk?oBf}7zdsLc4!&G6IUVEi7C9z)L~Iv?Dbb&UgSbwByD=zh^= z*n2h7VQpz-;~LOhSw|>%f6~^BU5?=M6+z~7gfjf>_!obo=O5&pbx{0*;`I$9!s9?_@Jc+P~HKhg|Gkri-XqKAfH(as)j!Y?**UZ`5nA&8HSQMuN5>sejQ?92+3gNJPn#(Rpw*}(fnC|`3Gnom*LN( z8+@SoPmb3w*cd_-Kh|Cb&4t~&%s2%!wkFQbu;uh3hm~LWB)UQ6RwA!NH|NLN%UX<# zr-K=}yFvFN?4S65dNGqo_dzy?pP+J6o>}yD1|vfV)92dDJ0||0zJf{ObON75H`B-3 z%b;>Fd(!{uAUV+d6b}P~$f8fRm)A}FKOIz$g2WhkMY}l|8BYuIN`TE@KJou_keUQ0 z@otd*=t=*lA7FF%37VJMbeVC=2`-19*V!0;ax#i`pX36am3eptqTGk9wFaH#_i^@r zcsmTl_kYhg1w_9_6ZZs(GmEV<2kpOPu)6|UH$O?m6NFe0=dNGfWhI4=FQ2=?FB&!ElgoqSQS`&=!3LEg6TM@s-m!ITlR0W>DG`aro)Mfho6`1FDY)Q|>T3Lx={*Z2}H^1sECjBD>`= z8&sbNraorSysL=A&p-)>y@F`^lv$zrWH9wPgVxZ2>{GzBFBx=q1ISDjOfy0ERe{4r z1JlgKp!1(VX6j&?d6)s}7Eo9-Lc+S8ok65Uok3*fjK!-q?%03q?3LS(UVixg9TdMB z3=TWR1oY%Y1+?Tm7#MbHvN-JYWMSB;!QrsegM(qGCXd5TPacMy8X^umJp>qb8b~}2t0CjC(?fz`r=fzw-ar|Ky+$eydxIiabcF=;<-&9r_Qq>4?9|Y3*coQRus7a< zVW)=y!%kxXhrPiz40}y<9QKAdFzf}TfiMq-y&f(MJ3;rPa5Cyn)L?Y@DZqHZHq?Vx zH>`kRZ&(Gx-uMHoKLQT4*uxM00 z*c-ouVQ1J1hP@h`5OV?!blJoo;QkSR1f)h%H|zq#-uNpFJHu`;>;<)HJq=hU3NjwB z1>FI{;V3>a@IbFk`~kin@n1md<#odt8284rFzyWFVB9O<>9E$olVPoJpyS$8%nT78 z2CNfLGc!aO2Qsep3}Bte#mMl}qkwgyHY3ANFJ^`a5Z`kG>qKpk+6@qKE|~ZQ)`_o~ z7$Q7AK*UcmLDdVeOy5WGHkNf~W=Ex23^|B zK=p|@{6x_w$WXYLA1a5Xd^pSpmBUg#Jm!VUVJRP&VRBf?2W1|pJ^{>p2P&(;Wrql6 zzJr%l5}5ixWfe$YpbTa{2bEPIxd1HX1FWnHQgPTTgjVLj%PK781FWnHz*0WI%POSu z0UQsYvKU%c1)5;G6INCQSYY}cR91of5M+btPFPtL=zwV^ysUCTgjoz5gGi(rgUE5{ zp1Ono|NlP$UdQwQ|F!@B|KI)p|37G7-RuAV|9|@b|Nl?u*aIk?^D!_mh%zuR$S^Q4 zC_~qM8Zt02STHa!*fTINxG^v=_<{;O@ctrLdmYlRd%(=Nic7{}=T~N?Rq>Gwg)3AU zLQbke@~ESs5l6H?mGl2H*cJyb5&2|HEL0 zi7&(<ypAl!+%LkI@gUZA1007B@?w=87*vkfzXF6cJp{daZXZT2> zx%U#o#H2&0?gfPh=*)gTsCz+t_?-bD`#@**i!(YWRT0lWXpQ)~ch5 zFBD>!7>7+WeJtvY7$)jq6L(^mxDJ~+K@1ZoU=vSbnD`2tcoDrqF0Gkr{N)Ba_2kriBa>LFo;Yjut%mKfQp-VebYt zhP_zhMUbKJF%QH%kU5%-tP_$5{mm24JR^xWS9tY3)4e{`zm1W)5CP%!b8}@2Nn*>>=1XO*wbh@k=c+DVviyt zJRIU+_LyPX12bgEtHr3=9l43=9lS3=9k%3=9kgE)HwO1@z>+xELbD1hnM5 zxfmiu1@z?tTo~3G`8ci(@?l)7q2TZ{9MrB;VE73NYgoHZgzw(ME-XY| zHyqlo3+G_mE9mL4))3mR1GVXfVtWqzJ!z0JcTigobhlP~E<<4k7eh!V7izx^G_Gdz z50uUhuE2GNSCbOs#NGG*Pyhb^zc`3(b?^Ul&^Q!`t$hFg^p8;SW%vG1e+OEZ4yxlE z848)%LHEMCTs9MN_-W6{@X-TwpFv~itgAxe-Jm-WKy!tknZ;J^U}gBQla=AaE>?yQ zyIC1NfY#G9GO|nr-Pr~jD_GF;e|iElc&*+CMn{DBte*eV7ceoHfYc>2vx4Wtr}iN3 z0&{GJh)n?LXN0IzWCq>6F1)I{2XPk|V>3jot>^!A1x5zbVkd@)^-Q9#5B~li^5|X7 zWzas^1|^n>eZBvuZ~OmWT#toeiXjWb6g?G&DI2hZoqP5lIw~TdC&w{?d!l?T!%9%! zXca5N1bI$|pTYuKaxWPUT#{ePywa;tXQEIbi!S2??uo*(411YW8-hf18TN{pGVGO? zWY{UM$*@!2kYT4Mqr*>*4LlP;=l2UL@J=-LV$c-{VBRYd!Ms=Ag?T5aUCr@D*5kne zxQ7nrg6^T%4Ii)ina#ZNw=$@n zhP2HQ2OvrZIcXb1{6V3`Q&SAxou-K-23GMw2ankcYL+`-Cl0o1n?Vmx3A z8vo!p$To31E5n6ttPB@|4s_WFGaj%FKG18kpNpX|iJc(?l=dDnu}lPwdwuKvKYalM zgXs$<7O;HHE*G6IGhn`bRc{DE-*5(Lesp+s>e`uFt>xuQi7># zM5wz7RR{7H$d4d(5-@d)Y;g0=L)C%&2~)=hQ`d-4ceEQkpKf~M5F6YNpmi-EKY_xk zkg36TD`*T}h@o(b6T?JMURnM9f51=P6YLzPi%sSuV!Y50E=H@o!G_95OLxYL_8ZNF2ptw)So_K#0EA8 z)Sm{a2el_~l~>g2Cu1*HA?XrSu7djumC&<^Wgz{9Or*Jea6j6Ru`pSRA;cJ|zrgkM z|MUVc$Q@T4jI0woSs6YkFd9u{He{Lz+Oq{}i-FowHji-kD>A(tcCPe-w5xE1186P8 z(La!Kdyx_2M5hOkavQ`xcn?x;gV?L?L&|LsTlfC|>93K>@MaODGF%XH7Qc97=d3H> zGF$|_-UC{OUjXGbP#y#2Cs5u&F2nV^;br&*tM3-X|~G{eQXwKdcNFK`Fx*7_m&0?fE}_Gt7U2428|SkhlTekA)r= z;P$5?6TDq`;~}(t?8UHm5zGulhQefSP#8I1)&|vcs-Sa#8!mA)cFxM><>;;l-I4O? zf5|Gwghn%rNm`F~dZ`hv2^1&J|1yJ3HANcCKV&*xAA5uyX|$ z!_H1Vhn*|=72PHZ}@i(LKe<5MeCCu=g}4LxhPA!(I~;hP@^p414V*7koqiEjIQk3_IWY5A-$Rg=b1ybM9AE3C%T z!uyYLiU5bE9D|aEoX|N9IS(caxt9-Hgh1ymYHsY1vS(x{d~vu_s$(C=PHhGTkqK^r zYdbfwPn3<1r=5+P*uic9&GUffctGr3M1M0*0fh(XZmb9540~S$GfeDS1m-Zm!CeR_viyyAEG`(n96?iY5aAE0zE#mF$_I6nvIq}x1^-E#6G z)rqA{jNrad0t-V3sBMf~$Aj9niO@RRyz~F`1O^7v>r4!mptaN>Iau9o0F|4b#%>8} zbAsd)p>?<>OfHMv612twB*zG?%auC8=Te$Z&tta)wKG9|vcy0CLqKboKxL{^T)2}TCffP?nB9**%p0uM6i2JtfN1>G&loyasX6SC(hFcaxs%6Lcl zAJY%9S%U6#nJ>uj(F?Q|{_p<~(7GU8Z7R?_3_N_1?#%_wIfLeS-~RhQJ?W9dPj3a( zdlX@J4Pm=S5p>s3A|u0=j6-gg^@rHNd-*{9-mLGCemU%3T@Ho@A<%t_Aoszxg zct#`}?<@L|(F5tWlNpFyR4Vte7?Rf>Al_$%1H6v%z_JDa)F+B(Whh($x+?@U1|-N(2%1v^ z%?}AYafHvgGi_j>`1bpMai##yiFbee7YCJTV7<8vg(tWeLO8iWZDPc|2TT*VCtm*X zUz}+J&&0oXA#^8{z7M76-u*8Qp37=vC~W3n2;tbkKM^#C4yuDd^%LBVN`}G}>s!WDGC z;!X}5*PR}m3_Cd;Tz7i%GVJ82aNX%42$}!y|NmdSMV>*V_5XkI8H<)IKXBl{fhB9O zf^{1NBZzaNeJ#UEV^xN|#<~o9jZGQ$+H*4ew3lSqX|Kt!)83F_C&;YK zA}(;-1QgbwGy;k{P?!t-{y#nOk_dP_k^k@i>7X_Th@YS&J+Zgr|8zx$h9FShE&2;8 zpAWBqmBoS%ToZMa99F{4YJ{E92wMvYj!OpYXElQEc>}G31lv^y=5JCo(ApzVr3|79Ss=^(WQ zuNe0RF))b0%zDhl5CS@99AsC$B}1VH7emNO@YpiK9f?gG6CW^ht>U`=f4VaRg9wbj z;QIgR_8|Twh{@{6i3a){XzuLFZy6UV`wi zUH?BF)J9Ew1mW+x{(rhUNc|@WU+l*J>B=BJ6R7RUwd&DzNEev72tRQtt(r~ft-;lN1rJ(fQ#BK>1$NI|c@Dq0L`|N-Jr_YdMn9{%M<-5X@jE7Q8^~RGSFbxk+d%GZo5xNmMkToyX&yU4^XjGCCUR%E9Civ?X~=0Za&W)M z^4M9xs3bR?QAy50$xtrnoS~c{qmtZ7r}!PgTn1n@9*o@FmY{YCqmtYTMjq}mEkn6t zZ4GIgSl~GA9n9B;>hPkF?EH{rc->&aPZTgZ898_9v{ZBYFUilc?ldYk_Tq<$_?)RXG~)$58{ zasswma-e3VC__S2FBM3p!H@94&b}1KxdO^GBEt)VsQBB#lWz|fsx^-27|*- z570f}AU2D`PfiwxpByXs%?9nitdkFZ$;4m+8pl#%WS#h!Sp>Rwj$@VV5y<+-&D;(@H-p;D|KdA1Ss4N| z|8aG!f~}cmWhhMHa`*+>rwPiNJnf8AK(xV0#wo!J3?jk@xxi)nW?_b({g)W0IB+qT zE;?n>y?`5ZMy=?o{Y*@+L3cWU%5z;Mhn4CK4VU=s8ZYrN@}Bl!gxpE3@z?FLykOsJ z9Z?3MN1!!%f88#x7UbxDsc>di1|xW_>?_dO!Wpa%KRXrqXLm9%Z1EBV-Dk@5`r+UI zA@Ph%uR(jmof#c=g4$V3iL4V98Kwk1Jq+<5$h|d}AbWsF@$1Dlh+n^+V4MP)2UzUP zFcGxIVZmaCiC%XRW~U;V4Z3SQ15Y@D_RoUcvkPkWy%P|3p|3qYbqUhWMBhL0TOL%0 zZG*3c{m#s|YJ)e!&+X=rw6GwVVd8NMNIKZe@9-0Jm+}+P7($(VF!)>(&{?#N%t+}# zc-8E~|EGi0&SzpMe8b2PLTp;-g!*Ca3C1a>85l&Wnfxq4cNFi}XZX3_n&GDyLqpJh zX9mmtj~Oki85vAUo!BNOII&IKs?YF~cbJx}Or{&xgztpE8SREo7Jyl!TNPeqMxx`84o;4$)O#p?r`#i1oV{ z)bDvG7^n0wFo-nPIb4>1@P9h!e9ZZ5422mi45l8e3>P>VttWc1GFQC<$O4W7klU=0+;$1-7MR=4LHVS(O&RJo_Y;g$KxcU>GBSjK>|T2R|8$NWjyqp4 zG3=D)WH4FC@9;C>@Bitp3=ATmvzPYQGp!V6Xt=arngM*K(QO6>6Og|aG&4+`_vQce z&G(&F?htnPx&J@&%KhpLKf!X3879u1@_+i)beEMNJ9_Rz&Y0O|3|fyZ`5IJioY>_E z8gt&URhi)@sO&%Vhz*jD9y3gQ(*x1Fn~}k!o=F_6zKn_CXR#8)#LeOiKSARdi<%iH zg4TwC+#z%Y;f^V641pzo{+n)-clf!$+~MaUCb83?`Q`7e|EGUpmRL2PNf>+&Fvy<` zZ4N(F|Nfs25^MbbKV%vM!xqrln*WYN(n1B8FR|*^amFc|wIS>3^PyqC!r8&HgMqD*E#NcGF8+j`wPnB#$^So?8MQ!jX|OZ39xzL;I&2Op4>Xt| z^@1l-xoynN@Kf<3mMEn-XzTfW2h6?3jqPG*>>au{^(nS_?kBS@a{ zU}7*aIPREhB<}Ec0~5pFi%blEKQS@<1?^V=&2=y>RGA3c^IdT0|8!8A0Oz4ZNPPw> z>$46a%40@o92qk^{3JGx!k}?f1&t%n8GW)X|EK>{2JLA>K4^u2v7VRM2jC!W`-?OnHaW|F)?fjXJUZv`$mnQBcSmQ8HV5$ zNbw`!lq6^9lq47Alq3f_m;53V!`@F!40}Owf5Eh^q^rIvLdV0L9h+gNV4A zb^((ANQtZ0Es*@gj}%v%nsLX~_X~vc)2wFD*>wy=<)`;%`16zRg#pMlpS`SWMTl9`{;2r=O8>kp~TTNq&U(gBaWJ&akT6hB!2%lGfecv6Gwf} zIKq{mj6m^on7H_9ClEhR&ksQSK+8LY$4K$B+;Qa!(A|>a4nI#aG5mbN#PAb6eoS!0 zj~-I|96b*SV^Z>v6f}P9VDWR9VdBFk+<8b18b9E1lxW74uyImYKjbSjgVr}@MlI0# zI8a|i4H^fqzK8=-nFi`Bw47(0@_?Pe6x2^x!Nw4Xug+0o#$D%t&!Ay-_z4>80o6Gt z85y=*VPM#bTn;@x@P9gJt^_=$%gni|MTr5__FDCbSxl?v0ebou)dH1K*A5`cs9b3H zg8B}`)+dLWA!XFFqmZ}(x9_7JSHi|7E}e&zNyLWdB~wV5gDX4@=op^;=;3(?5uO$} z!m|k}JSE8p&pc>&PQnqMb@;+lnBgaS`m93>Pf!~e-j@|;_<83X5P5OZi z67FA^8MVGKGpz#cHC2Fy`wJ#WTl6eaxd6H&yzU(1ln0UwrVp4LeiAAd4vF9{7aj^D z+M;U|IcMhxGiy(7HXArXWzi@eDUZ$OA#hdEy{G=)Bkj(E0%ehXamRF-m(+wjhJxqT#eG)Q_ski zttrSLc-<*U?s}BQp2vUxhtxBQW;I6Kps{fzb3z#!f|i2zR+}{k!Quiu2H*sVCkN1Y9b*ePj%R|@LC?|# z+0oJD5SYWr5W*?T5D2m?&Y$b2)0LeP07ptBf3YCz|e%{Ou=?E3#-9Db+x$NwRn zpmX_=?i4p=Xb5Tsoq-J+{|EO?Aol`)Fr`3AbLUf!hdVP ze*d-2ImRh7{@?qb_&*U&F8hD$e=HQi@GO*8j%% z!_$C{;n|NKo=EMf3|#d;Qg}*|5uSO_@SKDrJnKjd&pHC(dFKqx)8_@)n1(facp|l@ zL=fS*0n&$tlqq^h;d%57B#n`hKBb`HX@?^`wMYz4Edt@$LC5fXz85XOCn55?*F$)I zM+whcdlC7)kc{v=)&R-xuMR=t0zJQ9I|Iw_`&Yu|6k&ZQ&>Rk^&verWlE*>u_?eYq zOTr{d(*xA*bcF0x0<}9IoQ8}EfaFEMb6O&+zVI>pymgv! z3Iiu`?NKH?{QyPKS*b|<)Rl}3TLc`FHYsfkF=$*^LDMg2{PS+z|LL#PLF*-* zbH7VF{6yR}02u>Sgr*&NXk0=11xVx7Xz_Kh4n4jUkm5@L8ea#Z;{_B)5l}WMakRD`QpQ|72#IS@9F-7=qa9Ftwt>p8 zSfsf5atacrpt$)6We1Zmf8Yj0%3-o3!NDzg6ch1 z21q^t)mxzTXrS_s(0u&{b;vv&Y|X|U1Be-*dJ{BPF9Etg6fsx7fk}}KG*$^+vmv}{ z!|wmnL25~ztDgrAheHP#r~GGN5CPp;v;RNSO3+;Hd?kj$6$}g^E0P%}O8c60Z%byJ z2pWf8l*}*@JjZ*OVItSr|I@cCJFf)U&A}*sdb>EoPtL#2lYjGZc7J0QUj>@8-zLle zK93AEXU_vlQ?d-EZ z8A7&jJN%r=#ISV+^t@7eW{%gOH8TxP3=Ar+T_E>?+}6zmisOb$T*;{C zmu4`6%6*Adpu1qYp=Q-HBFyUB%Q&SQ&8!|K#)-TP4VPeNq54A4LhWE=__>;o;pbL9 zho9To7=D7*0c0{X1g%hG(zH}&n7HHrfAJk03|m%nJN(Sr>hLpD6>@GL=sYRVdBEuR zXIl_)MruYW>KUn7P%}w6BQ;Bv;paAChoASEq+c&!hQ#0LHisX)ihe6Iw>s|R_*i?{ zp10#QEdH`~I__Lknen5u5H>%D6M55p<6aB<|815qwZQXD~GdWi&GG z1lhOn59BP)0BAbhF7EIXmR2wCN2FC^=OGr7R&s#W#rQM)1eKMb zvldq{Gfx!tHR)c-%sdfPZmzt}x)QV(eC1+>iCdVNCxZ64f!4W#%Fl-k3|l~D=>lb@ zi91gJpT2#u2e=&FZqM)&T$buX%F?fVoZTR^RxM_jxYd{ee16*(X7N=4j19J+@)hK_ z&H4;Kx1L~}l3>kX3NKfgM8W0i2{%N!`UYCA_Cd>4P(M+Nk@vLsUzf@Cl0L6985u%W z3G#KH#8s}gA(g943_lM;%GC*=F$h?>%DW3zPYbVF0$s-jORE~t^hT&$MGpV3HITF_ zxu0>$JkTBI+zvlEwmSUebUa|W!Wp!tjQOgDEJN@K76wyLnaT;x>mV@=76y}*tDRQb zGjhEKt-wOumwFCwC*`&cy$a{8fSG-aq>gd5hRIc@pa0xBD2U z6hYm~#n5nR{d}jDoQi%cmuoZpTrbSz|8zWW$Lj_bh7gXw&XYwLxlV(^=@cXHY0g52pW2KLKQnl{PS0oJc&*9E5aRLI zc`_#>H&~4#qewS{Bg4dBdl;vz7k2o$T-)I%NH5ny==t7^BHi%wy}2EJg8Zkg$S^U3 zm!o_2Vz!kl7Bhm+I9U0Z0i5>N?si@Y^5a@{hM)W88Fuo4@{c&fPf$IvU!LKo8&gvd z=>Fwarlz3(jO?!$$S{QbV08E?rX00W^ti)M9!9b5`%FBq8KfCPN*NfotY&fmpBu}~ z&~Pb()8Qv4E5k+5dQdG!G4S1NnvxDXPckx?5~Y^a;b$fT!`5qT3=^OK|1S=zJKr)f zZ0%EWS-DOelFsfka=Zqun*-IK7k4vG=~Hq5yBQQVAUA{D4pIxNM^B-h0}iT3-!k*9 z5@TQxL9Rz(X71SysYgNKuvXsTC&S@P9hU&#*86 z`5lz*-YYUp1m&B`|Nq5H7#OyI#SKE?n# zhtZUik--$3`SpyP7-!OBOTQ19B~~qQ2CYdHS+y9H_mI*)Q)SkV%zOW*gZu{zM^HF} z!V(m=pz!3_&bSj67oe~O#Rn*S6+w3)Lj3`XXOJ97JxEUK|9|mwEX23X^yt_&1J#2Z z(6wLN?Gf#x?!AaI9AEng)GodZZC6B8L+YFwsNTQT7gnI3Wt@H-(Jq4Q*Fx(PIx|en z(uK5ZKy{-71H)F(zTFO1h6zlJyx{xFopwO#N>F`>&uyT!_OLbLhETVK!rgWVzCS9F zfdSl3!`|QA0&jnT)`M=aXZZP>nQ7Gyd4`?4^&#ysP+QCv>SmCeKz+}Zj0_?i_3(A# z6PO&?Cq8DDfcHHGcR<=z^30^I6aQZY31j8Gj8i5sGKj$2GR_P?n~pI~aWI9fvjB~8 z<68&BWQcpbPSF4{-@i?fbM`iUhAk&Pu})lJ%<%I>o#ReU)}|m(nWYFCBL~IHLXh7? zv_SV%-rf$08&J9`g06=Gg$cfP04Sb7YnwrOjzj(TdJp522u22x6H06oPhE2Oxk8)a z=ZPk^iF{ieey&qyS$X1`!_S+G*d~Jday!KteqL2#o5&5S#~Ha_gYLaQs}#AChn3-? z2P03{%F2u%=8_ISw?oz}One2tJCXaf;{X34ClVbd?mx_EDFVLhQ)JZ^d4```%o%>_ zA7h-Npv_8dPpeWOvCkge2e2*a0d_n^_o4 zKzBO9!hMCZ!%xmchlz%a!r=XPpf$j-wZBP7S zf%Xl7?i&H!4>kA2|LH5#99MF)GF;SRysLlo+;vg;P-G(meC?Q0oV+W%!*2{Ma| zm0{v4A%>qTl^j=s;zo;=;o?d*ho7K3IK3G;x^fs8w(3@9|6pNY5Yed2{sHRazGdcE zwN{wn=NDmyEge!0JG(A1PFx|$u(MOjVdqLkhMgT!4nJ31WLk;suFejm`&OH)9CmiH zGE4x4jglfKIJ``@|DO&z)2f_-Ve5BhkyUM=Jv~AWJ3(>$Ldap~>mUb9P`d66a*D`_Ha@^f3RynQ&#nXI7PH>wy7qqvF5z?juwVAyZI)Lk6ZAP9h zkIL*HoRSVd!S`3;xKk8#&H(6arLFf}R)XxQXXJXF$-)qF;+(@zPgaJBpmX;TX-9k& z-;4j#L2@gZ9Dah*PZlF**DBE3OJ+#=IdRJ2rwKUyl%S-aAG;Z+Gzc)G5Nd6?Y4lIEBbINW=-Tt@w49>k1 z;B*LHcOwE`!e$lc6-YKi~X+`U`f34~z?? zCxZB5*BPgP+J~U^=y367rilXAA#8ps^D0xUw^3TzRK6 zXv~p81T+=`8W#cWqboTM8V_*-kB5NALWCh>A)s;PpU`n-P#)Q=&hWGR2;&q7Nzjwk08GmEOJ!Z_f1Jc(;HVf3p1&sw@8#6x5$MEwSpTo~^28J!q z9z4IwsBaO^iGD?_&4~8b97&#kdpXubuz@i{BujuR_mpWKi0@3teNg zT^P|?#FmA+&@>VV)%&;lB+jzX>IkIILi#xF9+ds?ko~5(%NZRl)NdO0%(8jc5cGEQlNme-(u0BEiX zw6+;E=7(*rs)>yuL<2fkHKQ`)2PgCnInZ1c3%A3s23CfU5+;VNpfY7Tbl&Jc6US@N zm=kCWjbS_El<7(iKatCkS4o(2PoVK`(75?lZik=9ckhAB0o}d#ZX4w8J&-wT@XR}P z^D+FK!sqal?J=umCsR|<4Cwq*hZK|M$tK2~p!1*Z?_&6QVjJU5P+4-nigD-u|Nq6W zlTePB(|OF}G<0naXl@FY2KGyY$`M@ae!np@Xo1%EgZ7+) z#uPL(QOkpC807&M%6#^p&E%B_ugW0h0pCu>DSH`^#uS7Ze&!xxoYEi#8B;hxU~iF= z816BJL{Y?;!dgYn*>6P{wydai+^Gp2O8}iY0B#pN1o=q}JWg_AGa|pnL*t8-cEA>> zzi#YcoYD^J4=;7J)L>>X0o${Xd*Wkeh&}6&>~ST-o>@?P_U&Mtk_)n@(Q&6HQ&SKt zLqiZ~o&waT1fAOeTA%iSnRgXv{9gYu_zbx%d`BF9u2PIz2~x)c9>3su4Z81sxnkr> zepZHyFBrMHURGrMuxI3Z4I0bxU}b=gU+}zM%EBNBI-dvBj@r*4k_}q3r~%z4uLa#F z586Ku+9wb8vm*~Yy%Zw(nS%^J$3p$wxPx(u0cd~2O30XR#z|10h6~(Z(UElc=>rY&-zvl~amt_nrl9t~P3T$_P`V&C&+0+l9<&2e=A*AK1&0;5?;{58`=}v>)m|j~ zh;5GwLG3f!!8qmV|Nr7@;5C|dS77(yy$}YS@3{xw{{XGM+<>&t3Um&Iss^MiSiuk3 z>w~;b479hu`5yzOgDFTJ76&5y3_oQ+aUjWH%E0XKlTaC&B#gTZZ4^S3 zp{o@+XLAcNY`G2@)0_ZX|6aZ6|MUqA3?e63nu7K-ab)XoFoZPlL-t{T`K$~f4Ezis zD;Oa1J2VFE8h2p2;`5JxlU+!lsaES_53 z%;0@>qFN7_xmWGH@qc;|s2qTr^MD(&&k1CwWUji6O)Rm{}<1I@*jZC&x4xd`2Bx~7ehl3=qxWzv*w@`OpyEKPlDEo zJ3-6_opaOyWv@lrHw6lx6-^F-p#52}eN&uF3?ciC9121AOnWf41i|9MlaV20znMef zT%^5I8K3`$c!I(XY44O4D4rM^f;gKQCVq&@0Pk@#jMUfzny&+mPlCqH`aphx@2!HA zb8j{x@@6x1Ef*+nHbB|JB&^}QS^~+NKes{hCTM-_oZ|n}zb7M~{{T6s;}O*S2L~9Z zEQQ|xGVTBW{~!#?uOJ$PLF}Dq@*r^#2FZaih)oEC)M3M$Hf`Dj5=XSp5M?r~JYFEo zuotwB7gQ!6P=k~QpfcBkfnh7?EIC+t04kH^4lqt};9xKX$-~M6P?;=ofN{zJ(0*+q z%4Fnu0?^zo@);qGu(<-e#!I06+MLjJ)u1vMxlF!v9bOir>~SqXif?vU954&7Vu7+r zIhQ388sD|h`2Jgc1m&*JOsJXZ2N2~jtp58h3_6Di^(-z>+4~)O{tBoqoC*tT=y_b= zb622c?`C0!pNIED*06*6T=1|KXZX2yKcrp+wUG#wy`=7qzskU{RRc8s2R)-hW+Uoe znI+)8GNP*6w>;sQe{H?}J?~8;PcEZv-3oH(xZ4mVIp0po(dXL#p-}J6^8+&@+vH?-P zc|*e&6xJS4HYw?SE;OtUZiSR@=;?he)XdfUk<&Y7I4?TPxDvLX9+b{kt3t~ZXgWs^ zV@_BYb0hX@fXWnRSQv8?Zs(C*rXcO5&qlQGP|B2Oq%i&jT?YmVL*WZn2I&6#g%%pnHaG)AL(u6-FVvx1-3>*ww8Mz^AA3V1(PFcXoutnergTH_S!&(6c#aj%F2!`{+Qj(bI281`mNbGPJBV6@DfGn>XXJhjS}*VOm-9p?R4qtMfr%jmw0`C5|Nr8znHg5`XgCnm z!|>yO$OC4MRUmz!Gu%PrDX_DrLFc?X)j-34p)~m1_XW_iPaxrrx&G^wGHRJ1g|xra zb1&l*1!l;aWliXL*PNN{q#GF(tn)R_2~Sr|OF2@0mcVjgXZ<+OBpOdG-$jY-iHuo_{j@$2Mff%@>AI@S8_Z2)KGN;ouOz7YUc<3|34kH zuLX3Lr-mXM_?%A>GQuJg8Wz3qut1z2UIlUk18BSowBH(gIMkwr1L)knOomxt|LZU@ zgn;_8#f%Ilnou#&Sf(eG-N?ic62j0BB*VZUV#3f61d4AFhK3-}+Sd|>h9JcWd1R;m> z<~@v49H8MWG7%ciQ{6##UYH_>_t$@z;k{!IB>j+*_IRP;ZHOG+(EZwSu<+)W|M7wy zG&YC`a}EauInY_fptPp|4Resapmhm`pt){E1vzeJh7blv1v#!Kj8iyl7=+~+847cl z7($AjAbYey{iX6fj8ha?A?b?aCF5T7bhR6cKkN1|P66F@BXCej4pi1MIU0h`kp$Ii z%uH$X?yQBhJwWaub}aUE0VEH;-vkLmP}%W<-Qh2+{J6abH6P*&k2^|`asy;Pw(vOi z7wIKM1Zhv%29wUE357H?DouboR>3prN{InO-X%{YYtnrA>` zPFz^ZC(VEVr-SmF7PM@73tf8ziX&pvh!ZqS(vZRgmOg@!!y|a#%CDgIPBkLGfbt6L zOo$MqFv(zG*a~Xn#3R)$pnS1$H{+B8+zh4~3^TxI9D&ZBI>W*c@_-pMh6*|NsE3Im z1hmGK!wGUG(g7xh5Dh3h5wu@~gJA;4L#Lgfd}jih58`(CS;)yCBcSN8*HFqpPD4pS z4zy+jbjFb`1A_?YJfww8ko71+FCF)KfaF;iLO}AWQ2hdL9rto5Daa{6#X)yjc|hF= znp?_%vO)C@=*%ThodX*4faFt6_`J{OHUFmzK+WWw=x%Ax$x!%Je7+Q@+ytc+fsYV- zKroVQlR`^jTDc>&VyXYhvfAy8$q4V-LF;Cn877`rgp?VeumY_$2j92AFePXUWNZg~ zuFSGE|EGh_S_X&ZLmhBFS-6JuvTg#@|64Y~%DO`D2mxZ?|M)bbuV{VsvJ z6%-%f^!tQCKMF1VGVW%aq5w_598VbZL1%9HurP#x_M3ph2*d}aUr^l%3MUXBlvZHr z_aW%+7ijwBU`&z&&FyhaNS4!srkRZ#3^AZ|EObaoPD83lP6L{LL1%J++yzd*hm_>N zcfxWz{1krcxHsdFlAIjqjt*!V1?3mK>GdEYy}GY~+-U(an_;56<>^2Fr*kkQ$${>) z0EvOq>meoZJqRGapg^7+EUjwDWq|K8x&U3{11fWfO{=QVxbob{IEBG6K@OBwUvNA8 zg`GKR3QeovdksK|)uG?vGY!&fH6*?Mg{4g6^(@m8lCr>+_-M z6?>Vg1us+Qt%i&bfcyzcqe|d3sw4+$D}lr~K059Nl^-BB=zcg@`s9$)0H;q4GSX)) zG;S7d0Hsd_jP%*Ni*X8Q8~~C&X;+@sL(=D7So*An#yP(98HAiZ74^XB)0d3&X#)*| zgbldM)2~?0*M+qQ0-$aM#S1unGBgA=qNUHZI~k`i2r!t!(gmnJpu@@#0=jn)IemiG zY{1G>P#pv-PZ>dXesM5N5Pj&hGlGFZWHfhm)PTmZBz1((Or zw8scKAuPBp+9B6zPWELzF(0&SsmLLw61x29p zJqL6aBqKuztjq8%OP<_zoV41{VcXEUGacp2Zs0Ho=++Fp5Iw&uBAlVDD2b2!L^`@gXJilC8^?y2OPZ!MG z4n_tOkewo19ez$ra+rAFkl;lBos3f&SQtz@pnTDlt~=v)GEM=V)e1KgYWKcXkg^Tb zE(wLM!y=`uUzH0f=gzGM(a?4Ycn!fJ@cCK0pl0p>r3IAs3I6ux4tcclkD=ibC=DRD zp+$ExPI&+=|3GmCI{QM0g(0K?sl5p*|8S)*&^h#=a1?#mv=bC}Ul|%Mf!dUy@SF%O z`=IG-o;oyrA=lNROcwJ%c^9M}R9BZWS#}k=z1Jd;?5cxckz(8TLr48k=vBs&^V)YIamuR2Y-UX64W=hgvLE6 ztzv0cZUC*<5LgATrzbEa>VwNcZfIHtg#oesqhC3obSu0{ZauDYkoxWDmH)u)=$$bC z{*{BIb$tH4vJ%O^2O;JD`IV5oONxK@LH+w^9WMXk&zF~=ZUv=zXt{q0RL&viOZ^>; zQyf?sOg&7RVg0~MpfRirC?Bb8n*h3tfhkc3Tn^5L`VnNdsHWpj(AXT9t?CFq&qtSx zG~NXD@3M8EcoxM-UwPLPf%U=nVE5wFeAejkY8YD`hxazZTtU!dIA#zJk9n% z!v#GKH$(bD;53^I^&j{i5k&)VnI1<*9Qs22REQ%EK}~8M2kjOMto; zv`)GN(x1NsI%|0a!xZq^C(!*nJkYw@11jdj#1H~%ONufwm}o%764@9+K>p!S_;l&uK5F9fcSX`%|UIR_ahg6c=O zIf+aYLF1ho4AUU%p?DbzH9-6CLHB7Rt>wvPWtdQ`$UjjK*{no{iM&w0@I(HIpuW)L zeU3jlpkho1LGdCA9cLC<^=-xf>7X#$0$Pg+y-%wX?Ow7L_`PHztDa?p(wWFAE^vAi zUIm)_K`v84ebrlcA3g!c54e4Wv~GYOv2G3&N8e>3POkVr9n^>1FU3&k!ORfi$p*R?bt`;+DvOn2LP(;@M9^3< zNUunv%0$rJh+y_Ym5HD;m%!|UD)6uqQB<7>y1M`@o~SwzH0A+jA5;a+-H3qLOpV49 zA2Y+kPI%Sw6_7R6#P%DfgTqdE)$X;BFhpM$aOvue+xH$md4ih0v5!}+fQB8Y{D78I zL7+MwxtwC%&N$@&D}yPhT{@qMqYyNIlVJ)evp{JRl$SyN0+&$>HNfFpwBrACkl#V( zBA@#L8m|Jaw*`w&bw?TR`43%F0*Xgs!y*J478T&IfVQiU?vzZ~4lTE^%&&mbP6m?y zL1UPpF$844AKS(_rGXi;Hl0Jo%~D>44ctZr)eoTh9+ZwQBDtH``cw_-Zm+el`UNo; zVh(jPIQ|HX&s#v<4+=Bn@n~M?_`K3R+~d*x+mOcRKVptYU;cqP4>4^U%J}>QrbHuf ze1pOPG(P`jIq7xn<1A1*7GA}U6c)(i^Pjgt;t(7j=;I&U3_o9RGfdz#bl>Tr=kSv= zGV_NB2g8MqCfA)>j1Ch)ceKhga%Y3qoN{n5To6taotVMoVEKZ9!6ZY-;b)c-!^BKB zhoAC}3?CH~yJmsvQczlENK~5$DwAMiXAMkZ69bPjP63%K&&pu9@bCW+P7a0(#vt=p z8743?s)6rSG+56#g@cvh0z)F(#GlZ8h9JE%MFolfzEXy)7w93_Huk7=D%+ zG3*502LQSsyF(sa&s<<^WSI!MPyPY3$g2L#|I=qMGz2YR0F8k(1XZvx?97m2*m(+4 zmS12zh)~;-`G0x?1B2-bhK3-}+~DKI^b2t9I0c7gQ4>|#UG2kP@f{Dsgb z0JSR-$*!M_h%f}Lg#qh1h|t4~WEV&u%&yl+`oQ%oC=4ADar`yo|MUa~NV))x=|ap! z$iK~iq%BYy0L7ms%%6P40c7pt#!3Mea)LxLG zFoT&PM3nJ|d4`n3PI*p-LeQBa8FCIgLE{$UEDT%1K<9ISOpe^nM%%@@{SILT*jSJSyBu;L1pLP>Vp{P*nr%}z{ok#lYwChn61b)(GA9K z@z8bbzrNIVak}*bg};S}`zy$LJvIARy%o2P?w|4o8cLpt1&3=DcKPT$RDZ z@H0_~VWNT}!$eS-BXOJ&Y$wM-_K6@lm>XepV#ww_0_g{(1xAjEAoH}L_T$nEF8`3~ zW00Oh3=CU9^T7~%5OpEQ-;9jh;58kO|NozU0pDN9tX4@mW*`EP&&u3Fp9pMbR7nuQkUc&`g z7=pqFlx7|;*P!=-xAc^OKKE9;pUEJ0_rXR|VF$W-K+2s1xJ zk!PYcBgg47R)!5HjS%7|jCdx-b2I$3WaKy_D;-$g!>;p0iBhD&CK9kULwF-&Y=VAulM4+N42`I~{E;Zl4w(@K#0~O z?qFot@`zb_RiYx#L#Qy^CeduG=j)aEdM`!3j;`x$STmi z!yq+1<^QL9I5SMFuVY*(;Oelpz>Q%oEPe~q|4;v|?eG)x%;{s`F~Q<;$k`L1ct_4} zp!NkU?SbMMTmIEJ2F|}5I1+i_X$n-v;K{!m7#H$P1es_3|NnH*cq%TvAorl>w>Oad zc7d@`6`VI6jzQXNknsXYxdWP01)0mp$O5(p)HVUNQPR^PWj-kFfZYh4uY{;Y)VHze z|EE7-2k))iz=%}mho}Fat^gB9s?!5O=CVT7Bh}m9Aag+FG%LdfMx=V#HU0l|2gu&d z4U9;2uYEdr9166ja|2@|qMoz_nFDG^g3LjxKaJD>PfuWGFwJ0SxCClLWw0^)%w%G) zME08p9y!n+43M4-G(Dg)rk;)AC%QN&oER8+C(izlNH6vR3?COUfc9B61TnIJ&Xi)X z1f6*eD*G86`6f>I|6d#wkEEt6(0y(o`#2c+iBDIK{NVUr`VX3}aOefO2WPr+R0pT4 zRYxJ|>c2C?#fQucKVL9I?)qh@Nc!>LnPDQxk0AFkH1bab@!!Dw84PW2gVzf~#(F?$ zy{w60BB-3KXA*l2ng@rKlb|vVG(QN+$Dn?qNBRHh^-K(}6&M*pI2as$$}=$hOk{EZ z#l_D?=-G59iy?iVh1?EcF_69^P_cwIhaZobMOHmx76q3d92NhkgYLQq+57O%{}51L z1AQL_C_Etf2jSilxO+ujZ{TM5335+jo5PR#Cix#AcO)n=TwD&dvz|!=eEt~7Y*;@A zIle*uPhfKRIlb!t^aM7CpHr*;PY0(_cE=x}a0J^AuBRdS7o`5&c1T|hUEQ{=j3U_7 z--D`$(dhah?m>+0fb0PIYe6%^#JB$;;c3jsu!WO@VS}QiGw58e4NMP(K;zh}Kxex5 z{eq1BENo_&xZp6u#4G>7Yo(`v`sN@rCTwM#0vaEIm3yH29&{H8D9$%9Gp>BI9g?0t z2k!>&Px+qAwDPAk!%xsT8ZXpYa{pHESP56J4LWO^VHGHiNOCZ2&^RnPQQ@%U#1+B} zKld+Yu-v_gamoWd22*Q>hM?Vx87x6^+cq&yY0zUZ<=|l0!0}LGBDbl-$`y>&-hoAC{qOZaEmXYf;=xnBLMTUu>`spPz*D8?uHUB{O z!tuTatx?Qk1f8iV`WiIX4BhiAh`i^yn9<=U$PJsN8Gf$V#5m;(v+$}H%)+ZSgU8Q= zSAphCK=Ppb!$ISi^EWY0+0PF-vlDcFGU&{XD~b$TI9wepL4C^vMTU?LrvsK8vJAl- ziVP;8d9(e>jFu9L{1ZWYS9d5g{H)rXDxb@; z6GVgRP*6SiNQPm`0VW2Mhs+FGAbuHi{}0H#YUo<54Cr`bCfax+=qzH8p1aUF+V3kM zV=17zoR^V7gt4vR5(87irOzuErz9wY&bDLtxmlj!XXd~74oy}D!OVXg9V?*gk{3Q^ znAn=iIOQ8N!>Voi3_pM6GET`*bNHEfh+!gVYyi~mO9Y(@$I38)*^zf56GOu#Q2x$x zVweKDZ#;vI!DNNF!(Pyu$fGwAV=lRj3?ZPkjG**ueo$iKL(n~mpz{nHdBJxQfW}Pj z{$!W}S~nmdU@pg?q#-AGPD4&WKwVBj$v{ri&OlB69o<^$sJH) z*b6cvfuSJ?EFfyKg z#4NI^BJKb56HW{hGm{)9-e+R?_=34(R!5fU50IUf4;jIBpWtS=z@cbAv7VXZHE6sM zwAT@I=Ap(;XK-3N@t@uN0kia~@)e9zZU}?UO_NylW+USiQ4WR;D-KCcTyRKo;tFnt zpP;mQX(Qv51|dj(WN?(6C}QBSvV&0sBR_WYadl^a^P?C_ek{R~A2~Q2es1Gu_&J}E z<8=cQL&$t4p4XtXIgOFwCkKnePYy+fi5x5pKSAT`U5cRdA{~A@F^Zf9g%#*LLQWQk zpBhj#4U9~ujnn>5pT@-S6EuejI(rMG&H;L^49G8AH!@DSvdi&j2ouAW6`-&=Xg!gU z(P8IfX0cUFf}n5~S#_rp(x!UIEVc^N&RSIsnHK}aH#iL(K@hC{1WGObMF8z_0~W_HgF1?1ZIt z&Xa85v;Z1^?SPgS*ybNVYr;X{aRKaZkyWpjBg%}w)hAZGP5Y)H;wnoZ_0@uA#))zT;J)ew@HunMj1z01=dyt6NCpNAhtHsO zq~LiCNZk&ukNCl7!mZlR&F~Xc9#7$5*aAw!pg33A$T(#IA0*v!I7$*xkBFe8TU_-B zXx$N{9uavB+Utv}9s#*Qd?V<-FovI(nHjc%#_&O6LK_*UfZU57&n^s8f|wZ^E`j2B z=?~K4*pp#O5GYN+;uN%o7BoKwO6y#W))Pbi#-9jA+J6EX_dUtY@IlkieW!3_=8sY) zhlwki96+x(^%B+CSX;9#*|zXV}1T z(ZTWrH-m`?2g8JhLy{9g>#-JagVVwU;?jaJQE35G$3W78F!(HWTxnr5Hv@Ri8I(pr zaSw9S1nBxGV`he}oE!`jpn3iRQ=;KSL)_+w&goG50f2lptfd$6Whd3>lvpoFhk}cK>Q3fHcLjR8;FUY2x$D&z~cw8z8MzJ z=_v7oxgQ$Tzxcw;uu6=BVZw<+k`oVr+6SO}1P(J;o?6d1MS&OMz7>ZVEJ1N4>L@vJ zff1;kz<|+C;O2p~6Hv?B1T5_Yc?O=>57-z&gc%%ug8F8SYz!fwwm72#!^9>=#?z)L z|EGh_JLXVixVVCi;b-YKho7J}m#t7GVnV6EQ{FoPv>8K6jES^}Nz`VQ)bH=y(cDnG&f zRHV9;o8c#@-3Xf(1l0?fOb!z@8X@%p+kVC=8B7in88{t&HZU-3UBS(;fuYbH+};G0 z(Xjp^V!jUR`leN|GT8`%X;e({XEc|14tZHMuW;~ z_4SNXK;s&qzMTjQ{&IT9H_Gxm=)8Vx?J!W^475H%c&o!tZ1SLfCZz5ZSrrRTdm^hE zmqOAYI9{M*gL$xc55{)>nz#-`PQ<#HcLV}a@L{Qsgku$?Y&^;KS z{P94a!DNN7!_E_o3?>;)(i1xw8iH1cGyGg>%&_x2bWac13{l6QpuQhSAIKb#UIsk| z6Og$XX3jr7u+)DoNNu4c62r9<(iVc(f1vPlW@Hd4Wr2**b3n#1FEBPLf%{i>OBtsm zFf*8d+S`ndf?zSrrHtS{Hdw3?B4)Cbaf$*HR2}$SdeK$-OBts$fXWZ11D5i0A@f%& z*bZ3AFJveLwVT2E8HK=Rsw`!k;=ll26LJY$*EKp=b}=*rc``Hvf!261ZkupPkzv6n zQ2#qZuv1ECDdQ9d6^1Pf_!)kJ!fsO*D4jB_+QQH9Q{zBG(DWpSiJcu&FL~x2_|)OV zP&pICcVhf;!mBZeQ=#D!C&z(L9dZmiUy3pPoDs&bGr`RHXNMER#Q97NA0IJy%wh(e zMa1Cn6Li-ftjrUGj?;Z+7Fz|{cLiFfvVehM3uydK5p;f$ETmr{&A~7sN?aMel{YFIW$T+{On+5xWIhS0zT%j z*bXx0;K9aVvP#@xCl?!o3HOWUAP+`vZ_XPtgFG1)6oJkI^kiZPsb}QM&S>nC;yf@H zEN;)pkuBWVDFteynI4pwxR42K{s$&S;fYU}g|!|tb7_Ib)pmSknDUBQSPR;}njm^m zVq%Aw!_Gj)WI0iR9615TWI52;`6f~Ya)OM>azp-{b`wI3_Q9d@o@U@+li*dPQ7D~-kuDGhy`=3HQ2h;Rcd z)Eo~`UJ-ZLc@moDUu^D>l9yyCD zot;Sz6S-I!0zv6cOOa(KsH|DN7P3zT)aGD#C^1nOJT@VW(dNj8k4>PqIf}8gIY46* zTeuNp6ZO!si79x;CWKEvWENh9ZES)k>HqW+*w}kTgx~F6c;T> zX}Cqo;U_$uF^YiJbArbhaTsSExr294V`T>4vm z4Ck53Poe9H9z*E`%8U~&a=`ua4d8ycGULQ)`x&SFz6vr6v?mbMp2t?7>_pTj!VI8& z`KWD2X@;NsA2V25gVvxaK--Rwp>4;95=68eQTt~&+m4b9AtDS8Kj$+EziyOd2-&^|1NpZA$0!DpMEU}E@rO^IP5Xp9%s zCIYQz1+@b}<75k*87J=HXPC0>x$DXu+73TKYwB?I@j>^Yu4I6;!;KRmX)=5<;}p;x z0>X}x6EoNxelAo3jm3$sVq#=GZI}3eI!KI9k>O$<8^h0hCWoKjl^7=O`u|@Xq=(_4 zW)=Y%#_WxFO}t7j}jZpf#Icq1B1!zON>(eoWZxGE?eF|srSf$G5i{h%;rSQYZ;|CR>10~W297^fWg|KIf9|Nr8kbc8(q zdS^Arf1q<`aHk{C9W7tE7`DRFlH+Q|DF^rlJ}nvJNK3lVw1h7m9r#3AnFmTo=<_bH z^Z-gzps_n#{dwelA4TAJ6Is=>5ESkWmq2SfU$8Sw;AnKPe8I?I;=#)B0aSmMFlkLJ zW73{DpGgdS*IEO#FZS;`-~ay?N7e@#TLZ0&0M(74{@X{W z9?%*G(7Z)4R1c^xjh-GN$Vd-+S20d`FbLAa`cmx@TCWv0ZI?=(m?rG zWEBS_Jp_UF`XQ$WPk>891^*?MWR;h7boK$hp)YF&{35 z5C=hqkcFHKCiV_Ig`hP>_AWeyj4BKvAb$!UWSW@41vzhhqA#XmG*;}I1=}S(gc`BSGU=#*7`ab}}%4_J(cXU{sta+{id_E0TS+(D(y|WeGFG7FfRz)F+0- zpU5iEJ}yu@7q-S66m~GPKxdmxNrJ@dq?L?Q8bt8N>)e%)c1Xgk0dV?$%)k%=O54GbPCuhpGEM>QQ|Dl1m>|q(4bB%~D;cMN&WuAZOOg8% zFF%08?E|^}2~a$5VZ$G`p#CnXtuqfAwmarCP63^h1CRHE4B)+?pnapDFnquaI*%U` z?x3@rU}eKI8ORt61B1g)P+Ag$h9AfcQ<(6(0W@C>azicD4b$gC&Q5^4!I5zyGc>M* z8A0RIkbR!8`PAB#kUm;9l&%ED5qw@1bG;_={3__Y=&#I7T3?u%SAAz^`0(J6pX@+Yj11R86>)kgxg??L_r)dQe*J;+U`pzC7xGcgploO1XD+K1ZgW!eo| z`}B}m47}#8l%HV=XrJy&c7_YkKI#Ne9~IK>7hVPGqlQ4z)CE|Ydcnf*0lAL~<|ECU zgW7A8LF3Fx4iiD`evrFfurpi$wclawHC*Kuq%SSJiX9xU!mAYLL*fZkFQTte<$=Z- z{9I)4em2bc7tp=NpP8AozB4mxf!!+T`11=p!-WPcb1?@r5OXmdXmc@Bpy?HC2GU#% z$Q;mI%mXzB6Occ}7^NqI#_vJ%G1$Tt*7yJS9-LQ63RjT%uy6#mA-NeDME)}|6#6hT zgy6I5F%|6kz`!7K6}mqo12k6!+It9{``JH_amoSESPf`BI&_|9*F3~L4f34KI*?i! z$b1ZF9>OmL)OLi-$AIqT7=Z!D|3SR#ndfwaXeVtp=S%b1>dQ^J2Wk3^9hCE1VfDSGqG;u26QU zTp`R@vC`eaa)q~pWoHwEWk(x>C3xJ5k-_K{Gp814?8<{t-smMWhZbl)LW@z(s4IwJ z=kz#c&4xAy%Ug#SrhwLSG&DI_Za%~?%1x9J-pKWr^njNeR8<-MBC$@@#*4{C! zdcrIW9@ox%4_edefHFU&Ou_urcXoygFAhmg1eGVCd4h$@8K)%hQFnd{WcGaMS~z_3 zQ^@Y92f2d_T;5(7tn(EQqA}+y-a^lk0Qos-IrjMqP#lBf*HIikU-9`Jq^<@;z7tA=<|+8n{!d>4+Uo|srkKCQ#>?aLr9Lup`#BD1z?4 zfzC~U`r(kd3E@@$r6A!48ZTv84)RMw5NNO1X3(54bPY^NG-Pf9qy{!G@pBpDlnl`N z@xu(3$ZKKlFN56qkO5lT0v)FYsY4&92Fq7U3uQvrzC4AlWx>~Wht+{@(D+N33#kJ^ zW454nHhMXa-2TgaM_Qc%9Z!bW%^<(;Sq2Fo^ffjH&@`e44nNSi6{tUobhZO@ehOT- z9+I3mZ5iW~2mFvcO3iU&a@$0pG0#?L_#3k^Y{`J8lY^`bA)vT}$1gv_&-7)CQyjP$ zOf#GgfX}T4?K@b(z+ehXPuWroQ$YC;9KV7r!I_K?I?EOm*YNZr%<%Iz zX#EO1gDE(^Nhl84+uW=|SUF2Oh7;{UxOG02;rb zJxk#J5~$66NOIx?(0UxP!BsBQL*qG^2NBN?xfw#Pa{e#}^`9P`a`=_N$q=%ijiGQA z=&V8LI)C(iL7;IF(7KxI(0R>|vl*vYfcl|H4ik~ni$7=$6d$C_5aV_Fd6LQDCupsY zhA5=m*w4g}-O0od(#QZBBNJZbFA1r?KxIb=)UCM64wxIZLEUg+Hsch~*+HN_$s=Y_ zEy(^Su~i&`5W7HYe?aDf)^CB>xXgvsOADap?wSqB8=x`?y>A9{w<6TtxXgsPwHs>Y z(%FntK>H@~m2Df|(7$X;hPtnIHsh2d|No2ULgOGCl$PP+2C#M!=6oQiPYzoD2s;08 zGY7+#uj~vLKzkU@E@7OqfCrivh}v60+}tW?4jwjcfNSk$38TYLkQ)vxVVnY5r}LFr zWYra<{S~{GK=xO>WQXs6`~VsoKweMl3yF&jNMi#R(8dNXAkSZe*3^U6>>>4G!Q<{L zxEVemua^bwn>f(~K9kebY73};D7p%?w*n-#88T*VYO;lK3W)E)z+h^)g>lLjE{31P zlx@!+=0F4!Z)`)=CErP}v8WeDkPvl5I$_TI-SjHz7$T66FW@gv| zny-Sa*%V&od697nXx}+{9D~MxKz4)1f3Ca+=QpC`7&QKa7RQ%B=lz^uXSe{GYs0lx zGgPosYWXb2DGMYZV*`#14MFY+pty&O4NOjQn8=~faEXKCz$eWE4MCu@R5Qewes*+B zy)-q9VJB#9?0h+fouD&UI-D4PfbM2xZnT&Pnuq9gVyG-JVVJ_f0NJz6!Qud3zn1}8 zzX#e^30FdCBFj$L8q?3r9kX)%!EXNvT5I}kTr$K<NL1lo7;(0Hqy30VUII!_9gE=*_Q4 zD?>s3ax7~eHo)plV)|odP&WoZ(pC_*cA7PKEh{Yjz|NILYQI3&f`Qhdd|_tN+6-EQ z1?o3*G88&8F@$Vk{9!(yiJ@@8DTiO6b%Kd%4m%T?94vG9GE8~IETY9+<8V2_3A9#M zbk!q0hAE&m7qGVBEHU`p1MGYSaQgxhZjgSgDH-90r5_6qH&A_yeAXvuPb_5p8&ZCO z_FG_iBxMo2UrNMT?*q5hUWG#ou=FiruVr(Y=}1Ud%+6#rUCYpOYz7`B4yv+YEh zD+x8%cm{M%7C&oP1Nq2$D)@OchV z@H~h9OGI5efq>g!{nk&hkhH^tly;EoTF`pmTBuo|^%aD|@E+8>AJZA9y#4=Q9DDf> zDaV+poL7h`|F=QicVRl?l%xOuiywgcZ6A2O6LS7QD(|6XAAF7*)DJl%IZ+vuPatbp zsaght&hv%!Qx7sSgy5Rr2DcNq8Gec`M6?rLG7GN)tpNhbf%?~=b}H{eL|cKAq2ZDV zE4019%20R!v>xB6IS6zvGh+Rb@Twmo3{$Ka7(_yuf0%0|I!s($=WtojQE;M`lEX?) zMy}KKqMffncM6Aya(8#|AKuWto1L|g{>7ceHs7-nZ<*su*c=~~k`+?`(k>-M+ zX$Um#_XD)P^04GY2I&4a(0<$r3mB&y5JJocf#kXuFiuGj0++)Rh%1MQYlkAvDiX$f zRuRYzpfwb=3lQn+E3@#bZ_JRhia_$PG*+?zk;Xv%Bha1{5jI3R1Feq%t$9YSi-Q+1 zP63^p05T_K0pk?Vo@h{5fc8y;_BepfD1y%&K>KwdHIT77;Z>l$4xs(h+*}Oceb=CU zj-b0xKxK2l0!V#9O#Qhr29yqkSDl^)(er>=R10)w3dmh{3&4Gw37~Z#ptCALZCH>S zA?-0pdc63Yy6KVFGgF$u?iN`!7wT@%xg4PRDfIcwc4%0%Lh0rOpfn6=-~O$}eSW2C zFy#JV(D{|1wLSst3_pJ`GpzcF=re)Z4B#^`9?WN);$TclT9p9rBhnynt`?%rAc42d z06J3>w5A4B-o-OB`~;PM=b`IlKx;vcfZF1k3?ZMDAngaxewzj*)H$vYZib)hK>pBW zFqJ;gbjhAsIy*;XrxEOwBE^^ZJ0IjoTu)Ctkc|uBqvFXyuMT{%&i!uB>!_aUEbT=S} zQ8QTW0wxE`CRTnF!4jm;UY4Pdk%=MX1xTF~ z!_S0G4wlkTb)3e{mrg8WUYW4X!O{*YrU@2fS(%~cu(OA;;nE2`hM%YSc)B^5nl3pi zGfwniWcUf12jWz8+1bI#F!3}WM|Y1P!$gpnCo98GO{S(xAoZDy3_m$lU3P-bWb|NI z@F|m(;isoj^ChtUFo&HUtPDTV_4jfzOa$rM%E>U1bEo6a45Q{tpuK6Y*yqp6VrBSw znvbXZ3?FZI2FwkaEjvAon=gUP2JM{$xqnyd^HHCP!Yp03jT0oq@8s!HQWw`ubw z5Z{!QVWLMYBRKpa>P>&#uhRUHz`!5^N-vgq0AOl1VOdsQVsIVVpAW|9|nz&^WvZr5%zPCaT4P#{t3nh(Y|84Ul+qILt6n9$D@% z!^B#Y^JuW`FGiY!kcRC01GU?JGBd3*ho0Ab0<``gbjCJ#t)KX+BU2#j`otL;F8yYQ zoL{itnb8uo2YZD&!%qpw`aV<8nXxON;==P7rzFUbQfE@PeFt(IXq=IC9-@5*YTNyQ zw(mglpz|j|b?TqFi1r<*Z3jA+`U*d!eb>PcxwB0aykA*#)mCwapLgamPB|dTV0r?& z76^0>4o9*B#yL1(`ATV_lR*qSL34qi_9STE0E4OX&kQF9@Se3t%pJ2pXXk*%`9bH3 z!p@Ue;mj~mo{`~o0|R6qHs}mk(45@@VTYgC&Xwo@?^zOG1u6$%`gkyW6ve+@>+S)3p@Vly9fK4l8hKKm3Yho3LmA!l!a$3G8B zgU?9?o#*HBlwrz4X315cdGTm=NWc9H=o~%xyn)CnCVQduZt&VbNc$LkE+F`RX~>zo zpmVA~2IIT^W6YyWkgyo%NPbUh>2>rQ5d5DA7qlXigC{C%#y3_4S^dotsc@5~IVwo5bo z+|J3cXm$AE(aP`x#J6vh{{dR34BDrW!Rp;D&nW#`La}ES$WD1?-q#uI3?UEy{};Ds z6b7FOfY2-a8m9Loo5RoT+zdbKnK;2}GTIz|fa*LDAAHvG|NkLZm>hm?VPe>Fl?`+z z18MQ228|ytr1&|&B$f56PN3Y2#LRwIp5aWjC=xn@vcn5f9YaPi>(|64(0`yh4j{QyYk zZG-xBpgSjCurN#jonH@HuL_!P2i0|;dI5C*1n4e>2TBa!J1EMb=jDLTEazxs1D`kk zEs0@bJs-o*`hQF-zbtZE2|Jtj8=u3^`A(2C&o3|?u>H!|aH*iF(FSy0U5hllptenpnEG4#2kJy zvNBB6UCB7*3uD8j`b*3!>lZOtg6>lS#Rpgo8$^xDO2#Smml#*pE1{l$kL+%^J)r#z zLP+*N%@AJ6I0Y15^^1_qfu2#0%^dK)2#`673?COWFob~i{c^A}Ol167f0+Sf7DK}& zuvtP3m7p>a+5ez@P?&YC{54RT28R!L9SS6TK;gX^-2N3_weK;*6j0oRp@k{9Jdb9C z-|++*W8cE$@be23!47>;#1=Xk7?s?F?w2KS&QKJY|m{${~(PjF9u=gJJWZkT3?h zRfEC7GLy-{QiF-X)DuS<=~{uBMnHE-fZ_vW7jm8Vl8M2@RDoe)i4y4SFi~*b0UJ*S zrCZQGb5PnYgPJ#AiE-t8CI-t5ZVupkJ0`d>tlh7~xN<-AZU$ttH53>og6?Oi|Hrse z$k$H{66B^IOrqVOGanu>i?4EKWC)oIZW9Zys`CFo z{U95|L`h}_OHf$Ivolyqu3((P3SKuLvZ~1c|8$TXNPIf9FAa)I)N`33?J3Q;|IASP%&2t|dWH?Cj$lgE1)uru_lRLiJr;MK zy71-NokuU;A(xLF4bbqA975r7fXMK0)B%SF7tZhi2gf^5`{gsJea*};vC|ha-u#)F z0elBY0TaVdMj3`+MMee_dlrU5(3(w9Uj{T5)8>nQ7gIwJNW1|}JfVqU;>u*uJwXhs zK=H)5P=8_q6XV1u`TwVb#-~7c*exvpj~z^4Y?PS@;+G zp)iq&Aq2EW5aga1H21*VABH9l>Z5?v2cU_A++T_8{)Yx&_isURe<_;#U2(YI5Y7Fd zumy#&y$nMkC@*$`^Ws8yUSwF%1P)VeG&d2T*Z#G;vTE86by|qaHYnvXR0_2Q7^LtY(~Y;@p*651xH`11hJG# zurY*y)&OKMK=^N17{K>eYry!RGZ8o#Lgst%6oU4z&u4QeWZ+;3@nT>Q@qns%$bsp0 z(AW%Y{qhnL-3}U?0r?d+XAW{V=w8eh3{62@OdQ_vstko5tPCNXmJ9+Kk*juS{`oHe zuhWe|cN24G=P)vaB>es#!eP`5(WA&vxPqA>WTgc}Pv z)P>w31~S_ObdNT(@T#dZKz$Gq@SWY*+G8(}_UnBDoo|S|{s_9a<^U7JPS73`So#5- zLkCNLiJG9Z9K}v^{&kvcugdTdG)@b;6A7|rLwr>(55pADSza6rO_wwn4txU5O=vPS zUD9MY@W~^oA?PF_CUpZv$H zdFuavaSg_XAkch7q!B3nNM`#;GlV2aF@$h4g7O7-wvQ-7h=K@YZWfddbeI@IKtd?l0E>90);6G34BG7B{43o{FJzvv2h zFK9j(RKE2JGECeGz7t1$l_x91&Qo06-6yKF;cB6C!a<WD2N)SbG{EVXBO8>*LE!~TV~%_bA)xT$ zP;}YJ2{ki;gCPV|j?40uN zzxYz{+A&aT6N23s7#Of&h%AJ}Cx77Z)2EA8Z#j46%9SgO3``7+3=9mQcFpHtM)3K_ zre6Q2|957*_yyXZngA+?LG_uSQG><%8M-ptEm4bNit2AO$W4lMW`-bN4}G z8l6%MJ0-axW1iqT5NR(J$Q+Pf2Mz`kkhvL$Bqt^ulAPGV#PIXhG{z|j>|kKn3i3~b6T`#_ zzyD7s$Bqs$$haqHyt07{GIn|uy6*(!w;j_Mr~G$jocP4^|Mbtnjw?aq&!90ho#~8I zy!Ru<(U9Zgq9=9ZV=EWw@ll2xABoOCiH?thNbzwHdweJn5g$7E;scKz*y5uQDLz7= z@zH=5A19_UPI%&=;MIK$5j=L43nnHg8@=4SZ0TA1M{ z=&S<{J_ggwWQU0w(6u+9d+sul9VQ~5w;c&RZ`*^HvwHf z%E{Sq>BJ+5el5n1S)g?*U}N~n z!PanzgRyg#Jk%@>^@d9)7qLu~VC~v>k*xti5|)hmJ#j@KiyavHdM1ROgL@S93*Mf9OS{zU}?_K zaLG)eAt;BTA;^beL6N6%b5J}ZceaigL&yUWhLCth$?P1^d55eFA)t15JR?Uo0}De4 zs67T|GckmK+N&UTqas5{3Y)`DW(CcOjLZ%{lbX#Zg4S?czQZsjgUw+l?9K|#iSwmA zlNok`&iVwY_h4n%z%}vxnF?YiqhAGKx4m&|(>{-w;_6$(pT9^^sAMa#jfcM9>7#f1SoEa*AGcbr~ zDL~jiKx_vH8+6vERsw_#I_p!b0m6O{QnLWUegk4ZfUsXOFo=M{1(J6lDt5;`BTNg9vEdE~x(& zh9rIxB+kiD_)vl&B%Yta@+bo&EImMbm>;5sQyMIs8k&N@;UvjW2nwf6ZXDs{%}}`! zCZ0u)M=CC6~=%r|)EjoqY@pBJqrz**-iBAqt$} zb-O{JG_|3FF5L%u&o#xx+9e2b``PcKQf2?5u*??W};R zP6`@c$xI9;^(+j9p#Doe2SXuftQ!>PV81XLfXfj6I}B4eKw~ZZ43(gA`)V(!-sh60~mx)K>z9IjHQ2XXMES^~pf~ z0f);&NLYgI@Bx(;v6{)5*XP0&+uqGs8~M zeYNtE427WkZ8RG@q&%A$c7o)%Vg77H_2+7+d7v^Aqz+`}RxXB#let8@L1m>cE5n2= zCI?WtJi(upVS+m=!vr^0h6%2$3=^DL874TfGE8t}WtiZ=$}r*7)&HiE;toGG+#M`E zgc-nf$wMZF5RYaD%M2z46OYN@`Ct?27tKK$jMCm*H)aNTf$u%y%FbY92nla@u>3E_ zPzdVxdCYdO1h1czhMYUl!O9Q_3geZaaZQFPL4oWHA|Ul(vw|IVnm98~G<9a2$O%0| zNCV3{LQtPYJK14k)kSyIH~F4nNHfGfY%G%rFtO_7Aky0yO6fx|bRh|DbagK=bSl zhZ!eIsW43OIP7TYlkBh)?Dukqotz4gyScO{c1Ur7(pt8|P7a0*LL7`d-k^2e8WTID zI2n1k?HO4LITRX#v>Q95<}-3<`-VG!*RW?b_DJ~zJN(RK?~(uu=JP?iDzzRhMgX*43?ldJ5OPUogVWY zEIm~jc6!P?SbA(^u=L!@U>V8K5Cn=hYlns)PEH1+l}rpf4>2%^{AXh*RQ&%x#Dm`f ztVW9g)D~ng@lbcL^pa+<1nu+D6rL~TDbHZ(!S7J%0cxv6JM27Z+8hLOFKA2-WUd!8 zLnX4=pz``9R1G5|LkLKXxk5uwIGVbJptvxDn8o<}KUf{eoM>i-N|-xmFffRK^lKkz z2;wZ16#}^(bT=C8&NR>*HYYQ~&v;daogT8N@o^0nAJ99*K=B5OlZntc@ho@P2?|e; zKQ#oqrB*OAnA9_KWP6J{{LEF{%9lEcIx#s*stPKKWvjC>On4m$qyFlP8^e~|GfsDH@Z z$v6dc|0$;;-$aq4jz8s(GXC_eX83spv}Td1W3;}nn^Kz3*~@=Y|p==jtABI8f5 zc!rRMc<4^gk5HoIdFi!DU%mi8&4!*0E%aLQEh$F|u6=4n& zIUOy)cLaj^yxxnMCW7vh*8s0k<$4VY2avr@3=NkY7c)*2T*v`lgXNISI8pE+ge|DZ z2^JGfgwhM4^g}4E2w9&cm&qhrpP@pKAK@?m@~sq zVGui;VP~i7|LH3paZPMsU@!&8BV&UtC~wI#3WL|U%eyk{0I@;w3Q8OI>ljvYGBgN* z-0T_6uoL9&_-uxqAUAJLa+p}^`hPkDBgCwXB<_gEMNs+?lvd(_h$lhmMNs+?lvd&e%Y*#InaDfQ)1TodXCv=K`L&Ec zJ;ND(%5P-+30l9^zy?kOKjj%XUW4`+gVIMq2ji6abqp&(n#%fNI!^BfJPhHyI#_*H# zAm2o;n~dP};c3qBb0uiMT_(#;&>V|`EHg+UpxN)A9CU!!^CiR&^^Q)uN@f~LLNfvh{wz#tC$=uCxXT)%x{9~YzIqF z+=JQ+8A=fLiZ%wzm7p^Z80Cys1TpLcxd~JbgUkb+)dX@IsBHpTPv;;H8OvNWk8uia ze_Fx)c?^1g9mq@#Rvi9pG=}(7iW$Y9|J$Md^g{Bd6!XM-CXUyM7=E+@`|;lmgdf9# z9e#q!&kQH1KbsgVGu<34w>dFRT&c#e^8^#9zLGZrx$Ptq=&UOS5s(}%Kd0jJ^FxH6 zJCXg&gXw3`JsP0+WfZiY2pW4j+RiwIftA5@v6{oqdLD+tOcsWaPM(IK433jhoV}dV zTAB=j@tO>UO$-bnAbl)`))PfQZ45?)8qob8p!q|vyrcC*9tH*xP4b@H+4vQ4EzJ z`#|>Miqj8sai-%7%!zi;bj&!>N)eQ<94$8|F-!!tXFzRUP7YA}o3T*CutQ3o)1i=) zp(TjJuv2P<6vIv&dE)}}LWG&BiVRaSnH+Y4+VwCqxtJP)Kz$hv;|?i#M}|TU!!9X~ zT25)uI?5Gt4m&j~<%2l@V5ADEl zDF}%-Qx9ebOAgQ-Q0$PgLr~f6!OCz!n$dnD$PJ)-Okn&FP#gTPgC(es>dDG*!J5&2 z;zMR>aC!H)jd6;?|Nkb?GS zqDMc&&lPP96Fs;Yey(U@nCLN^;pYh!h7BT&))TJ_O_}Ainqi8ExWiA-y6}1?hQiB2 zQ)V$VI#^1qW|$(+%upC1?(p+Dv-m1d+4_W;Vbx)wDYH10oi(2^i>?Cs? zkZ~f&EsvQQR)OaBKR2@ z{F0Hu zYV45JR7wef)PTloV0pu=jd98Y1_oH(_yEoujI7|iVSOD`W;s~mD*HChVVnZ;8>nsv z_47ezuYkgZ`5-IUPoVY&sNA?Jk5q2p^A{r<*k6Ke;CdUhSM?I8Zw)#p7wjiRh&(6M zPoTats2l+GpFwN*9IZj;^$M?Igy{#3|1mREg6b_$9D&@%zm zr-X1j{0!B1_!%wk@Y9Leq0(`(!%omV4y!rCln8f+pP)H7(7arFxWi7+I9pb-!$dY+ z7tk33AF`7jCaQwgO)#>9#{gXvU3MmGy6k*%jbX|OCI?H91^A0#3GEM}YR{-i8g2Xu)MJ8%A zGELMx$UG5L9>Uc>6osf?$N*Lks^h`xABs-Yc*rzS(~x;0sGdNGF;3LH$TSh8-$RvQ zCCCjOj1E6J1sX2NGctVisCM}Iin(*vH)gI?p#7|%`9BU$hl!kw4nI8^7`B8lvP{fS zcleorl7GfEV!`U;TqQ(l1Xu2*;XnTVu55vrcqkprBjK;sme@}P9- zXbHOW8&r>i#wmIj8A7_494zB`846c0F@$6WL&9<;1EOEg!PpQ4YL{|A>qrIx1vw4S z9o>lxg`CU{L7;oOIanD285x!2E^KC;5^V19Gl7X=FGvrB?XXuuK|$^f149UCycnFG z8acpuzTg_03=AS5b3kkcM+G@h zcxo^*glKv}%tH=O1uq5}P}nedF~}4!Iqa2CQjp7KU~JkFpx9f#yG_z+~KFd z1T{G?e}|tRJs4!v7#e~uc`(SRg6==zFpyIL(Tom1*`F}zgVF=&&gf_E3^Jg(e3mB+ z`VPrV6F+h@>}7t!p#O=PVXvyAf}9p3$LWoZw_QCTka8fa~f z!%xsY>|lQfcz-?m8l=DexrK4cXJ(OA!R-t`JNO)SdMdL_ymm;V+an%yPc-LiP#q!4 z=1QGL#2Z%`rZ{jjOpNDdu-v=`be?9zrATfDOHkQ^Jpb>FH2?46&+xOJk>m9NU51dA zwhS_>Y#C%STOEGHKW4PlaAdgX9nS#1Tl)ud$1DzKP}vG;@A39APB~!8U>fnYHES&9Gt zhj8qN^iM(aF<+TER()X>UIkk_P}71~J0QHD;ivF!$DhV53|k&DORP$0Vw(8Jgkg#Y zzr)W2H;11Bj0bE5SQ>1zxEy}2Vr1AV_=LgVgP9pTM&+5zJW&ud2F1)gG5$Z#N+HGr zwxIPrMvM)%8k`J2L3cxXDmt(9TF$%DqnzOV)*~* z9Muj#IT#tXfXYNJUe0dNURtG(wcxW%926NQesTIgU67e)qG=Rp4TIQg1~$+>F2^5V zm^D_Furh4nc5ArQ!F1pjr{IBGE1KeefXp^lCHfg7%;}{`wzMuFS9nlvXD6GENaY%r&t%98_0|tpcT?uyBT-@rRi#OM4lo zFeovYMjmFe6m;gAs4wTR@;kHes{f4auN6S^;jE57-ZE>f(q&=TvVsxf_ZN-vKS1|0 zaoROr@>ArTt*Lwp?0;TH-ma6P;@xKsvV!jzmS^O74O+X-Wymnm!!iEH3kHTQ+=)yR zGyleSXtFW{X8z^qSn>bADQI1a$3gi$@s9F8JXBkBJPa8wdT83}g7ky-#@{^1W~uw< z|JE1G;;TenR$m6W&GGmD5KwtnQdfPMQ`v7NXb-6=FGshrA|$;(;A05kU~ahdt&U@M zLYu=6&={J>VFvKHR|gYAH|Ig7iChO*;bVXxIYCc{wT7Ocu~5huAXpDHEpj<<6uz&3-^;in-qZE7Zh)}nHO$8!W1a81;;a#*>ak?-{b zR)&x@jn)(2OEFwz5pTHUrpz|cbu;TkcV|}ccOYzx;KPKux=nV`Fw);64e(slG*y&NuxObv1L_Ge#_)1V7 zf5FVYimQ=n;!9@kRRXRD*BH2h#)Kh$1m&shhfLsgb09lmc?*=s*EU*D1i87V(R!ld z@BblO3=NlfYT{3D)o`8w-6{TtkzotBG-Pc}_g03VT!$GZdi;$)Av$8JUYIaaSBKbv|fp0wZl)2^$b7dr5S!+;{xRY zu~p}LKx54kt3YX9UYX63`TYOsp!0{c*FpA^GdQzNJl4ZF#XH{Nr-#1-xU6Qp{67TL zrUbP&LFK*OYKAGn!45yc{UKiF;FHV@rXG_){WAw}*#jz@Kx-et@{BS@9@9bPFvCs{ zZm=55b;}v1c+7VA3F^NvFgjSaf%x4HKSBK!SpNl7&w%P3c1DMt9{mnK*+4X?znI7~ z(dr7MF7x09pZjkDa+Bn0hAE(RM4)yxNF3A-1BnZ-W|+drz#yW)FeT_eGtb1m_W!59 zGI#jUC1lOw@fDyoi=h5A(?f=dpnK;Wnz<$#fA~MW z19Wx)qvk{qey596KPWk@-|NmeA|NrL!tw;U; z|37FYD>DNF0~-Sa11AFm15Exe7P$}q|NsB`|Nnmj1_lO@86dqNeIT%;C!S;ypNLQ=dio%f z_(YJ}Ie!1AC$c&Iz-QiMzyH%g^}@ry|3f^G!U|Nzg8YIAD{*jGJ-mcFtRiMGPU#2r zcR_b}9ux=1uQXEpb}%!5!w{CXU}iHKN`T{bUnAobke#4;IB=LHN=yWWjr>IhOOSgG zU1FF5n#%#j1I!FioWjguYLo=KamOVFa9YNd2KAuv#oQ$An*jbQstirE-0 zPX7OYE6Cn@K8BB=@(=9Jhf))hzQ zO$5!2g4|RG_0!fWIUzX)1`&|>Lm_Fff6L)=vO=J-E|6SeFhs5ZWIiLvd}$%j7+1X% z!$;8CkwXj(mkt_1)TG1p%Lsw$WKj9WDCztYGbV zeuBy;P}$(o>JCEGNrTj}GHl>*l${tH z?XVMcuLQ_E9>&?TK=HttC_C{DGs90W(E8j)*@^W`GDTW~9kW(5$q3amG8DQCLe(vl z1QzIw`QDZ1Kv7Si|szwg1#ucU}5UQpSq(;7IHIuv$$Ucx= zE-*C{p=vgQ)G!pSW@3P=0lAs!q1;4g!P&DwetvurH0CVImC4O8K_id_T*h;N=CGi1 z58$|f&XXx6>G>6j#YX z+>odUcEbj!8&06vf$WCR2F583pmGr@tkB)?Z7U=!9Jukj;S6YhO_i+B1`+UF%m(Iz zitw}m%FCZ58KxvZhR888Dou1)%s8>V30ki&cC7o2Y@VSdhf)hb|zL!WbfX~|Q`0(EZrnVWRHrW+)9uPRafzr=mBy-zA z@xml;Gz+8-bVqZe0*aaaP%||?{WmFQk~f+FQisR9Vo(?}$r&vNsRNm(sEA@-HPpNl zpZ}XAFv%Is{r_JaRQD<-DuL^7?Iy-4ptC>!=N?N;IV&(h9Gd=5Awr7C9oer`41G%UQj=P z%7_>2^QB<%2=)h~GT0wK8xj7PM!+9xP=BnzR1kY*62?(gmDJU7p8QB@gf%-i{PZ;z;& z3xAy9e(sl}D14o_vA zQq0X@;*sz0(~FsTqGz(h&mYX%h zjiu}i6Rp4f-wH}I(Z&ux#e}EL0=Z=iJHv&op!+5H7(yah874%qGE9hOWtgzS%=u>q zXrEM)^G^?6hOIByAbnU+{~k1^4w_d3jqf~Wa`*|FkI!IdFl9;>1h?rx`xiiaOXZnG zUP~~}nDyW{$h{n|7ySMo@`_nv6{wBt{g`E<&tsN}nvM(?;~6<$gT@X67!TMQG9Iuk zU~I6R#CX6qkhReUBnKLYJNWN^2xt$Vmon=_Z)H}nzWGcLeG`}<`T`gmY>OBV*iK|? zv;oP%^nvV@2kkcm-5HY1I?+3sbs`7YUJkguf{X`j4WRlV_Hw)yVr;Ml*(>49Fmc`g z|KgzX2}FbP1Cyf=sK0Un)Sd;knWmj*m;ws37mN&BLE!`1XA2r@hmF01!U(ixWCc3| zSPv-Nk{%09+-$}So?B@<&oHGU$@wQtKWNMen|_eK$w|yVm70aYeN32nW#<{De0O4) z2#Qn1Pya(eahz=o+6w|2=ZC}{$bFkZcdj!qY)zDM2CaRcz|^P$jaKT(rbfSl{izNqW?ag$DpI*)^6Fs{fep)j$1cCA` zXdQ_pqvb>kW;XCTI9Pw^{A@^n2y}KUC|w>A3i*}5%n(w>z_8^i6J~$Nlu_jLXJ*M& z8BCyjBaD`Bgir5h;&=_}gMiL)1I_V+!mkICUrjTF9CrRbrD0JFI+v44;x(ube1(l+ z;x);}l^~y&4S~?_iqf=?_|$X$^0~nnK;k{17}IF+oXD1YVz5h%-#-WM}wb z+{iEyR5pO}KX_dcJ9xi}C1_7%qm=VcPgaHrAb&C~RG+BKs18nRch7eu$@;O*~F))~(WMVJ@)uW(w>Z=$SOh9vPATyX5H70`Aw1LwBHEW!IRqLJdp9}+iaQy8aw zW^A|=f1Yb)d@_?IsLliNJsvxO=kY*w2`CMM`yy@1v< zgUY3s%si`f85)Eb1ytpj1oY%M1a#!M1Z?CO1Qg{s1+?Tk7#f0BE##Hn&&W{d!l)#- zs>3=KgXjNIN6BoyVm z7`eU07?tGqb21dVaT&^e(lVF(sihVh<_GDIaCtbBRM!PT5g@PYIW$++_&`xv5<0a!a{1>k@jxjoys?7;H(xwPb_aaqcRaBIrhAC%c+e^7qUbuM+e zX@?Z${%~o?i62swvvHK&V{=e$kLf|#J-4{*LqOHExvM14^?txi-4$wYIwZc^L}r80~bGMD2Bbzy1#ajf=mNcli5e zyHoC~^^UnOmOJErW_JOfF$@|fM?c2^mM=4ESZDuWW?99<&~Qnff$?=H3rBYYGeZa` zheY>R4hEUe91JpFI2dF=cS(Tu0={NuSS8N@S$k37>aa(U%Tz8w$xyE7oS~e9l8IcP zorzpMBj;<-ni&s9hDtA1)^1Q+fq}(g;`Sf)mwQ+lCTg-eOa$4L_!lxi3liVLz;k*F z3&WQG>I{_?EDT#ZgcvSL{&l+ijag*X6lR7kP7Do~{wp(7K6GZ7_`n;qzE57BR4pFITalQI~f@&dstb!7ykPn0t@4FtPB&gp<(QZ62^R|!FRbaObB|R&QN&+ zDV%>bGj0Nf^%Wdp{mue2tT$TypAOm+f-9`6(8Br~1H+b+Rr0|ZOq|`X{`U)IsWDW5 z+Vr5Z92Vw3enZ1N+j%A8UMk2rvGNMcSMi3sG~&E&jC9R`CtV9MOe8T~@ATqCO4ncN zu&3)Ub(i7kTAX1gwsZ{|JN_@suoIlFgCXg9GAyjWLGI82rRy*&9O+sKny%RxL3a#Y zjAvy8-|GTS*JX0>bnQlby7p&aU^xH(|9?MX(lswb!zDh34VOYWIJ!Z38kDxVI3&8K zax%zF=46nW!pR`>8kDw$7(ipctK=EDz-fB|jV%Mz>&#!`}UjOxfHLT-_O*tlgmg)~lM@%K@1gdxW_RVJ41oe24toV7v-X&9 z8OTlIGM9_ivXQGg6u-wqSwZfAAVY}g8Hc^~3=D;WM;!L%ax#SUaWDj~aM0@pxrIxD zquT?gTTJCD@VKRn%Tx~Jo*T$+IRSBt1($)`3r1#dAs>j}#a$fszNvAz46+mEf6zIC zT_0;N3ottD4b05gQ_sRsD8ywXXUt_TC(dmP4hJD?6S*IJMskAOR&v%_)^ecn5m30m z^uodgq<1QpIXG-UdO_iXuGfcwK?EFL9u9j!YCvHI(gzARbhVBQ3?eHWREP?rN+QDO zCYCU=L<%D=PKH2G7_D~D>V5|eCmspz?ha_&oI(nxAT9%N7@?;VkQ!KceC09$hXp7c z;OWEz5;q|KPUo_ft7l;_G}1Pa1EmM#Fb3sukXYq0hdmuN4wp5Q733878A61h=}7d5 z!`@zYh7b-$)^1Sx0mUhD8Um$bP?`?nGL#eM!k>n=LfuIy4dDwP&>Swv@33?POGBXW znWSYQ=Kk%yQ->{#KLA4XVU#D`Jg5!jcUqNLB zC@rAp7f@M%oL_LI1CSbQe#DjzKA zFbIOmz!nw;!L3Y;6Mb*|4|(CH-~FDILGUTF_$qN$hKc_f8MAw@{SQIEF9p;d`^>V{ z9@I_%)%~FLlz9pa6R$MJ?>T)ie#aSB#~-hG8Mg3pFm=Z>aKApx#t^cSllwHN|FDX& zYZmA(VS7g2*P!#xUV+D@IahHAg2p{LUW3lM3h;G zBB;*whER8b#&|*MK;yn3bwREUdkh&tVZ-@4@Syx2BdEIh zj2v*kg4iInlc9bE@h2Qa_!Z`6P&+};)nShjmx&z6%|Zv|_rTf-pm=Tk_&)?RCIE_O z*t)hC{0vCr0gS7}pD^glvp5ufVP;wdy1Qp36GMm~gRIqaRvWh}SNN<;2}l9}B1b7pccm@MQ(YaK3cVN#y=z{*69VFTlo zryCikh+8Vit>9vqSkA<-x3el^$0{#|i5j(x!I^9fJ2^q?gt-`Yc2{NX=x}rR$?2)x zoyi623mjbWg5TjU@_IG~h6Y!VKmJy4UkN(*@@q8H%J0d{D}QFQtbC!)n)^zhE%%K% zd+s}Xj$F{VRe|aM>HiNiUHs0>wCX35!%xtdEa)CB5r&2!9)^Y>(AhGk?hZSx7#e~& z6S*cDFdneIP}gAlm6^c=)JA)&%rr4?5!1v|tWG~xwKDwBVq)0hvCzr#1!$bI&#HZ7+9S%RsJx+d^&^ zw>G%0zs#*BS7+w1_l1_J+*EFLIU#OKxh^dOIRg$mIU8IZPc=o`zXz@_am3G+;t9f zxiT$7xyxEca^E=Y%U$MFmis8rus4uHSI$D)TuwmSM(%?$!(Iap zeYvSx269t4bmcZ_8Ok|oS;_t4RF#X?HkK>ZHj!JPWh-}`Lr?A-hrS%2gMysCgMyrr zgMu8ZgM!=-Ei<|8oc3}O+U9b++BV=e-G@aEdk;7&$USsakbC5)Aa~SJLC!$SKJJG0mv_I_|wkb5EIZ0X~uAP1WF%b4Z}98T);VfIR+&|IRQIExl%cYy*rc?5`lylf?p`;+!%g7MIA!P{m7o(G+9B3Y#cNyc9f;xx2TpU_pK1iHn8RHZl4jnlS zM+G?xM+LbV>qEyu``5xyzHp^+1o+)E4Ra5Q2VZsOAj2so48Em zinWa75}Xv}DPj+T^fT%$G-lYlm5IURl`!MP>`P1&L1la4!T3F# zj3QYD{FZW{vRa7C3LI7sl#Jy**%`~(GcptwvpVe&;n$D@mE)lH!W1rJxzfhCJt0>c zbsqoyACe*Gu=j(ahFq@{3Fa^fs3ejm&k_KNZ`nCw?#C{*TP2w7ev zD+KBnKNDu0_*9s2;uB%UiI0UDCq5EpocK_fapD7E#)&_K87H2ob-2u1D>C~fD?^}m zt;p;bwGNkgAbi0MnQ418YDH$h;$;vl%uL<$QjkG#QfA7YbBYXt!kNi??lZDyi#RFB znXvKXg|La_m9WX=O}=NISHvb0w>eX7Pa&H~Tmc(ToKU9no)?@9f*^Y)W~%IYA<7`= zQ!6sNAX9bEdqoC8kiDBTllE}cip-vpnYgDkGht6yX2qTYCk43)Y&>}z*hKO!u*u{J z-80V%VB?9~l&Q2QkWC~mh)pJLLZ;%L!c2udL75hN7XSPoa-UH&`w%PWz5+gPc|nFk zXBLK#HGB+#r#Tq}-wHEMd@sy6@wqVLL{PYZ{LWb`GCPBnArNGDMyq|1oaJD=A=;UPBVxZ~>-UF)3$q-_w=(yL2%UCX0OGB@DCjk(H4eI1@^G2T8E88072wj5)8^6v*CC*} zeFam;y#flFa-cgP<}GKO5+JD{m!N1Mmu+hxcTrPA&H!p3m!u)sJ}pNDxr35Aat}cD zn5CB7%_WReJ_!(LF^>gzs-y(LW!d#jin_P$Ve(0#@2uy+HO3Amg- z%ghk+(c4*9(n(S7o3g{+uYMuAUsgHn734IO`+dk^uK}l#TsfB}xULW6G?NqKG?fd| zG6c6RrgLe@#c)}I+ZVFjmU0`Et>vn8t>ly#8A2u~TgxRgFogW#VvqsVr-jzGas}2l za)wd{a#mbcawq0F?i87zBB#mjuv3^(ShNUn^_O74P^2{>*U8Kwk*&c*=E z@m%0CmE&NtkOQ5S%Gfwd>fk=coe5bEI}a(bPkhGCFy+7_hMxs}4toWZ^yS_%Fob-R zG>{8mXOJ=CGLSQ5XOK~`GLqw9U=aDCs35nNfgyxJN?%TBE#njx4Fzy~g7yVJW0qX? zVVlF=r%a3!L3^1VD>F@G=F*pY#LPJH;bDe}517SPb+9vR5R`P>3!;Su9rt#!Gi)#t zb=>R3X(-3QX)LG6X(acIkzvaJ!%Pz=8U3IB&fX*Ujk$a7D}A@z7wWFLnERDZg6E*$ z{{R2~+5i9lLHmC|ZGS}u1_mhx1_n_7m4Si5gn?m;^FzI-P7DlHE@{hFJLiM;@-Q^i zgZc`$`8^$O^PhA8or@1@&vP*_g7>d^|K$YlZv*XB0qs}oW?hv-b-9&avQl!!S(DXE^|51 zc$0y$H8`9N4lBxuNE^uAqfkSndnAJ-FR}K?!2VwL^+> z;?ibvi@43@4sx5zJ>WJ6yOrSygFfRE27RU{4EpNMigG{v8TP(#W|$c5tSI-0pGkL~ zv!dL8d4`=2g;{j}>oe?puFbIbw=~1vr@z^B9~d+2{ePJG$A4#*AN3y{b!$Z(_JYp- z7xHyn`+}KaBB&n{!eKA>gIifnz=e73Z*FTjAs?2t7r1TZK69&q-6zUnD|cPXRPLLW zn%s156}fNB412`{9QI0To6GIsR+Y2Twvda|R+Ib1VI%jGonddGwiP%G1GUuTCUL9D zf%dY4#+o*BtI18#GM1a7r6%`RN%d@i77ro&FpY=)g6J)p9NMbftlbVktrI-!*U0(x@$53yK+`XvQU4tqB!G42Jm zoj0m6?k)0j*touhxE6hQgDK3?XY+83Io!fy1{$o{>8n6uv%xIXe*H%bg9n7yd0X zht_Lm4lU5VN1*i{OsotcUz!|#g6HR$MOJB*F;02G@9@)uiDAntZik;53=4ul>r*@! z8FqR&GEC%bWS)qAo?;j)!_Urt@h3D{876lA<2V7^&kSk@CpbC$JOJ7wtH3ZZ<8OQi zcr4>DSH~*o9#;_mBm;x#Y6gZapuOvg;PnuYb!%l#3_o9sLDEmQ8^h06i@^Sa@2w5S zv$qx$#~lm|TUZnsCbBX#TmsbvFG2hK6CEaMCOS-HN#vNQ`jBfP=$!q>%u=f$YsbV_ zf%e0~_OOD|;NR-QD}G5k{6wFt{ad{kJihWRo(Y`(z*9e#FIYX0D2gp8q_U|=xO z@a3Hi8YAIU=R|!7^YlhXOIE;C*cvp&xw2vdnd3t?ESvUVegbh4tqgv0Ifg%!p*SP=$wJvL?MU0 z6Q()rbx<;t3$rtn6XY@jkNYoBGM3w9XDl~)mc!mp{tUXHbz?n@4VT_JGfaFJ%rNnN zGQ&hryR%D-qZ{NW&RU+?0ls0nA$vjnS~EH0OuaoOnfiN-xXk4iC>hCZvNMu1%GBKh zvLEDsWzaf-Ck*<}n8j9s%6?FN3@ZPhfX)pRu#&^VC(%MHwH*}X z;+Z*LdpRh`Jx=FdndzV)_r;&#=hN8?Kfh-){QU1MYWdZhVdu+ahMzB#8Gbf!FoZNQ zG+g?>7&I5pIPrfl!_EiIOcOU4{GZM#-f-zlvcu1edd}HjnHjVqk~JrOV`iNw{tz@@ z&pMH*39=3f)P~71`ahki3AFxOcojpk=*10&|EFJtp3ljl%y1EQrY0zz%Kx`tDgU2g zrTl-!mGb|YR(@uZ=$3rUFwve_`1JuM?C$9Sx#uy{M9{hyP`RU_h-#+&U;CBze;HQV z|7Bch|Cec{Shdj0dehZnmEInVEH>;;;W9U;G_@e)V?P`E9zx z&+pj|KYzwM{QNZ;yyxuFsU$bc;LVPf@rDeApmSwBS3<^LI5`pHFWRgOA1V$iO$4pi zJn_hJCugao(8))PJ5Swm_<4$fVN1YdhrJV5GRT0^zk!{BTmUD-UXZzb0(x>DPniWl zcevS$G8A@(F@#(eW-xi4|OdPZLGT`3u@4i+3pegoZI z2O3)d`48kbkRL(*1GUSIDz)~2^nv2M=ON$3bF2&(^}he#`dQiGrxfUXY+;6ppZytr z@~}GW`5TlEjDP&!3QB`-nHfZ0C^=eoOkt1#pEDr?NpA*< z8gj_#Z7n}Th?k?H+~qLGp9>rn)TNz#~MVlX?yMUCSQ7V^9d;JZ6PaSSS7UNCWXGcbxwRAdyHINjj?^zTj9 zAirMR{O|wP1&)exFOnI-_Bw&=a#WBr1II^@?q}~n-LJs`x*wg{bw4`$>wflT)BWu2 zr~5USRrhPKukJ@@7Tu4|KDwX1nRP#Vd+UA;X43uW%&7a>n?V;eHi^w_c`BG4CBU%d zB{Xfm^k?|V0rm5baE6~L(hgOi`6TqTpw;g1LkpS~JekG2L1_V0XMxV?(PZT4R#McN zIN>;ETKEy}@bjg=!%t0ChKnG(Kxv`#&;PBUvI`UsoQ%>&pzk9PaS* z$7`3Bp!^7`TZ)^kC;m`p_!-5{aPf0E!_QyZ3_o{${l66y)}T0mg+B)~gUAOzhrOVD zs4Kz{0vh`UjrRx&Xvw`$cKEr8Nm)*S%TP{1(Lm1Ntbv>$myz72G6oqBDMPsoMush* zc>2Z6u?iG7pmA|fm@6bQPW(HaVG76%Ap5QUL*kv2Q3@RApmM;&Q4u^A0_vN9(mNA0 z4{0zkhzJPSf%Cb@Ic>QHB|W(YJ3YDUD;TGM@-&Zwf*hz^a9_zdrMHMdhTB0wuJE9O zoPm2- z1Qb7@yaOuFLFvjNkz*n!BWJggqvpf~#~7ykhNVY!ho8TqA?*^pX_8T-TZ>TwoF*q6 z!=5HVWx!``ho3Li9ex%+;+yy)*x~1AZ3b}LN3+oybZ*7Pm+A~ZUj#G!%=qztYYG#C z2sr(L{H*No6C-^+VbF)AuT(tg3ltYoUJP46=@(R{yj$(C7nDx_|7TeVs+WHRGyGhe zz#zjf04l>7e!|KaMUcIq_5*rYb3@{Q^QzNMPZLk_eIgt2|m5fskgW43JI+{~K4wOzo?Sd&sLFH4BE-1c1brGn%2GvKPI0vNz zT=fztU4X(DRzHE#2DUm%P?-fX z6I5<}wj>ugow)11n9Mv8)P{W7%rX(&j!b5mXz0WMZcBc2W|?U0 z#Q<(kepF_eXd1)-X;U)8)PUNR^3ZmrobDA%eYua$vbvwWWpo8x9rjG*GLQrHFFLHMBTL{K~n7P{}{XJ8P4h$%qC3_bRO z)@ne+feFJ>(8n(goNJq)OE6DkO>cm zj3a-ImeR!>OI8ApNrT3cuSgopt>!Y3JHurn_ZB*q{6CxFC+`ym{ny4(y5Zs8x?#x< zdqLyc-@~PJKX93Y$5cUM)SxvY1xl!9z2GvDTghc2cM8cYt|tuoFVv%SJtjL^o?v4z zeKFhNrx<7q-PcQ(wbo6SMb<@^S<*vSn#)X1($Zn?Mh+c0Sxtw%6F9Wxo=d_m-bUsw^hqTPEy+pJa4{R%UaG{+d!^L%StZ8SwZfVmW`aJvw~a@r;eN< zr>>kZr>M%3V-W0Fv~=JCkI{7c*cjt40|6i zvrc4cfQ(l->VfW}b=WK5s3`YovBTa%M@2c1{7W&1om(6g<=#0n?me;2apy;2wu$;q z47#7$nf3-dD#`^pDaw6RW}m2O#Gw1JpK&kfeEN^d921R$7<3gIJET4xXWTpI%m3*I zliV!r4HybLKx-5(GzD>}9+c8xWH39q$juUzSGW?DzN8K;~8TNi*ci8(eTu%3cFyr12(hhq+d&}y6 zdCsu+!*7PYADA8Xet68VmzkL%9Q^>!^Blz z>n;~CMu7H!T@>W9kehf=eoql&%${H_3%SXxjC)ELL2KzO zh1~Q;`8~e>{%?(EZO$M6hk(+-kI4={*Dxu|f%cz&jd%EI z$1 z4n}#S6R#L|ZeVlRt0BrD1KJA)n%f2S^SJ~RtMC?}|;C}+f_ zEf=VzC8q@1FF1u^$_6fny$YbQ4~B-Igij0;L3(hhPo2Ur1(a?xnIZi~FLs8DoQ5_N z3$z^eda*KGG&m@~r%=yfFKF#&k&(k*BUXmJ#byqBjX4?imRLFLHQ{C0Tk7Vp*Hn^W zZ<&|FUNc#Sz2$xmd(9OY_ErQr?6pv3*jpLqu-8(PVK1mH>-G2l*58~ACZKT?(D}Sq znK&j&Ff&gSXpY|l3Ohk|r#<`I7f9dC7$a#z!+zcN$0$p~VWMr72$tXNgo>8V~1tY@; z4n^IG3W6Q8kkx|386Ik)=%3H#P}m8&a}?PeM;?SZjH(#spxP;bQ2S5^LoL`&G&dhS zc;v|0OLyNtdjIGV1L$1Q1c!-Fm>E}r?k46+aF}SQ$U9My%V8z6uj5aLy^cTs)ia2I z)PdxmGc&FN-9gND(P<}$uX@&LCrA&=Nhk2##2~RisD5Q%$Da&)9e=ttK=i}bOT+d~ ze_>`=H95&);#X$IRUJtnH;At4Omdi5sD!XzVXx!Qd-V)c9y5!A)qv!4mO1|9KI^m- zq(|$d(@utijz60Wxw{(;xw_4p7^Z;29C@Ad=iuEdzeY2z{GQCT@@F>l%HPVM_0W*H zV32#iGBav@m1fw|<55^Kl@cghn14E&TgmV>W-uE%HsMaH9=~WC@7^Z;Kg7z$Xg6R5*3q#0z zW|39%nYdpcU}gw;ugGxm71$o`Rj--3R)O{bfbL!KV|4iWhSA~Yi9m;+pmhVFIu5kI z`8(83kUG#jfi9!N&lONL4*&m$__i|q&|_ry`4)607LvW7`vCqka=mW+13C*{=&_QU0d!_D(`gnF$CX-teI`2_aCK+!I{XBk;Q$Kz#()1q zvcPwuLehx`D}>f$+n;Pk)tbOGaulTJD zI(ry-|L;+7nF`8}uzd92nc*TR9rLj?U3$n2T07w|5p<89l9Izp-=&T}IT@KwgXDGo z`b-ApU1tNHZczRKiGlJD>srU393c)97aDSRvoKmrTwuu6ox#rVfn%b>&t(jJ-78rf zCaN;(DgzcT~4`~t1(L0(_+6TH3xawaZleFbP=0BDWHPiE#-bqowsRw*$|#CHDf z3Znzy`{g-g8Gzw@4mq!sLxv$(f>A;XboVJJt%LTfd}(v|(NW~MGlPx61k~o8{4f4Q7t&gf%S;Sg zXRtDuOjBZ**l`JR#z#kzo8<}y1``gXxwse13?UuY94%KcGnmM8G8BT=OMujAFf*7! z+#$9Kbe__>&;O@`<^@3Jf#yG%bRlz}MOy!-uNH#Dd-gVlpQ}K3Cn25tjlMPkbOsV= z9TjM83$pp|zW<*N@|)w&{~@@-6IAx$*rU$?OE3R4K<5B6T!fYRkC_=Ja{4;{)L?a( z_)?i+r6#AtL{Qpz$<6Q+lwNq2I{pOlwa-Gzc&?L9I~8^!%3P-73{ybq;)BNj=^*<- zX#Hy<@utYk5Yo-$@Y9=#VN3mA ziIrIwStr&PGVb&MovF?WiPxxFq;)VL{p|ClKxKOULsrWUHi$c=OBr{9?ob8sL2DsE z@*pwLx_HpK*@s*Zdq8Wd!S)Up!e^bzY7m(ff?Bx)gEd}xu$PSPn zKz4AJGJ?x$kXt}|_`2B;egWB)g=P{Fegn=`K|{lpZFbqzF>x|_W{khdl)iIjAmrmiEXXVem;gm zc|nGqVVn#*S1>Y!tOV^-@Z1V-PsQ^x>;$bTiRNY430eaX#S6Jp3v?ce2QS0UOz1kH zOr&)}Q}`fp5c2;2R*>6&%7N-~+~wr+m#^Qx;FtdcOZzLB7-R$#G~{?08A2E|G~^ta z7-XWBF-~Ey(2xVA-52bRe?aMX10zVC0eGD*gQbETBO`-M07#vs0*X3NI~BGr@;1Nc z0Z_V!waIbP4r~!m?h7^P?XKi@F8;|!_NXaBRNo+ zD<6e+ELH7Nv-icUmBF*sg5kJeyC*rIt zpUJa<*Bdc`^7~mLWl3Fx{j4Oxa@4sHe$ z(D^~2IDcUcx|fX+>-w%Q%xvJhNWAU;Pk+n|Ip_Z=v&gC@xrR#*nHeXtFf?3ZV65LH zK9do2-@Op%oN$hf4N@5lKg{JXG8Z~CFogU+&tjPY8rw%|kA;HfwOJV^hVgQCgYN5S zU}Ff`0xI93t4{ob?CI~wf~3jLJcplL z&^DkqFK2f=Bll}id&8sE;fMTRiIwt&ko+rO%D59G=lK7B2*@u7fBp}_6(9c(vrL?& z{(t&+X@{TacMl-%^Z#4D2OQV-3<8B54Glq{wzYU;qZFu(EXc?)(KyTjeBTXxEe%rp za+mu5>EDRrB%|EKpSIZXVy z(0Q+gvVz=Mc7~9z3~s+Y_XGcv;a$Z)V-+{0=`~GxM(6 z&&UIA9|12A$zm%*HVB6*KoL zQ22oE*9rjbt>)5_V^B1d6Fh4ur=X-MXJDr(7thG^8nkCXgOR~flTj3W#uMnwA<+3O zpzs8l+xYi?$QCBv*GHrrey!wV2m#%%^@v$y6==)|RJShF_&>dvNwoVK8^cAj|Npn< zFffRK?zaTFo1dZKlAt2*L}YiTqqv*>wE{E5-EWzNSApF94(e`DpXCA$ci)G)8?@$3 zi;+oi6(fV?T1L@sP@e_l{`ag5;Pg<>$o?91cG4Cmeu(=yklZf-I=5bURUw-DLHEvs z-2aqWbk!4P$yFftD=0avd|c;n8PvDrWMlw`KcfLxx6IrB(+!~hB}RS5+yB#5NKn7) zEu>vetb5qr{htn6drhqRh|uMl_GY0fOp&B-Y4{qog+(-qE;J7+*?yk;V3Oybar zSK6R6-q%RBr;ZKFfZ2b}i*|NkSMlg{KJH%m>-I)3=?01)I0*Iv0Yir#0Z*uu*`VGa8aI7oBV=_`}BS$ zzSk0e-6l71GK6GsIs9D1#xQX$8^c6Ue%1c#Hu)5*_vv~@uGgF_3?U*7|0iwXXZYFp ztm-lYW5Xq#OvWjoa}HKYGyFWs#<0aqQlk4D6XV2n;tW4EBqh3EF*aP<#?A0ko{{0F zd@bWj19ykD0~m^oL0<~%c4y}Lo@1BfX0%mTS#J`>+-4i<)xyZ`@-gYJEK#LT(sA+z`@Wd?>R ziEIu(S8_A_1l=tLk>gt>%K$mI5_HeOA~uGJ51Bc^_x+v+t+iwpTlKg4_zKiC0y+0< zK{De+E5rZOJ=hs8FfNpy2;$EG-5+QAfBFJu#)-zra?FeqC$=z7VPLSk0*W8d`2`Hj z3?beQ3=_E?FiiAeU^xAjvEfpEZOaOehYT0vSy+C6_LO)eGF%LBv0EFz)plikql`s8 zqwJ4*M!6sJGqrvQ`8upEI%~H!zES>%FDuIru)anq3wcJy*9ZUp4|%}Mvd?I{bVEGG7BUrsJ^Fo{^ytGzR3r=wQhLDsLDZesV}c z#&+ac7z{!EP0(4a3JeS)@(kwLp#CMuTvLXIpsmgfmgwe#?$PUHWZ1%~;qX&~(P1a3 zjSuRFfbQ+oU}V_ICFAfDKK97S@Dp^`Eoh$uhb+WSP+#c;m%~p^h7XhM8982eFffD! zgXV9<8Fqrs`D2t}5C)AqEV}l8Ixcqz@-R%f`2WB77Ji4Ho5dY=ZgqCB+#&ApGn9eB zw3tcW2&C@~Q$rBQ?cIkoyE6nGc4n%A!bVujo{`}rs1NW$xI>DQkxMH>)M2LXk&V#lSwLoXhD%wpn7VMY>ith!<3=^%m8KyjB7GCv;nPC+u?RSC3SV8$h zQD-8Ef2kRg_EFOzWZV~2CV|EvHV8BPToB9vI{P+As2p-m?+kW^4Wjn0KZCg$K9pEF z{oKmW@be2J!&XpT4Jyw$${D9*SULTC!N9Q9i<{wtN2Ckr+zmmET8GJ=kt{niteAd+ z)ajHnP66qE$>#8L+Navf8oUla=QDA<2JQXS;B@#YTv_s?n2}*C=o})@x+jf^ko$@! zlrv7@;DM+G-Fwf$;qX&9v+PGO6T{Y028J!4nMJ{65U6|sg~J~!gXpqoMQ z$`2}QgjZ#O+{xtd6V$$d|kQ}*{H-YF+qu8;)JFK z8>ME(DG+s56G3tXO$Tkjc09BJ&E>2DiA`u~v;n&TI$r~_2Xr1K=)4n9-DIr-I@5&V z;umJfome2hP2ghqIhl#!=L=?$RUkTm;eaj3zw`MRe$E$T_&Gm`!4ll3WNf(9AqBag z33N^a?0j}5M#j?(NemO`m_Y7(YvgiR*_;IFm#XVS#5$x9X9+j(LCzB9se^{!LmPPb z{XfhwQA!20Ho^xxPcmcULfyn`U@2J5d(4Bsu@sNWnU||mPFUYT;G{1qH0d!B* z2M$Nui5v_JKZPqHX&z=aNIh~qfXvU3L%20T2;$a;g9SdE(Tb+=djc3Af%jc0F}d_@)lZdAiIx)mEi-&LMyQQ zL1_n;Mj2Qfekw3R_J+asWx?tTP?-T1m8p6qp!HI9M4jFfs~)#U`aOPHA9dFagzXu?rceC@?aZg4Ps(#)vc6K<#V> zOHf%1N`J600rhwB$=5S6RHExa4o7tNr!z22abRTF0=gT-ZXF}IKMgvA9b`rV8^d0( z-OzBY$5KXv(+5(yk8Zv{0|V$Doh`6CTK><5*pa}-uoGkl$Sy*5;B&t@1H+UCCWbAb zZ~>Y10#wGZG5iFz>+2UWuB=yLums(Sfm+@&oCckr4yqUIjY0R6g6cIy83-D)1i7ui ziD7NM5W`PUc?2>C*`0*^Er{mtvt;-i*Zqv3vT&vnq#pVOt%pEu;V@^0m7uivm6>T( zDP&*rrB2Y=Wzbpn+zdbCm6=w?J2O~rV`10=$_I>z_TaMvKBO{EVPIh}Il*+m64drZ z4J)zJ51GYQf$mfKV)TFd7Dk3G4_O<6Kzxxapmrljj|j@W2}+D2rynwlfc116{htm~ z&vE7d^c7$`L|2^vo?wAEC7nl?o!S@l&-NrB_L(1W&1{1>;P`z0K)!z)dM_kC^ zC+LjmDU1wTahkIbVovuq(0%Zby~v=kNKl-C?l#K*|9?6tO@QvM1Gx*-XLsO+)VF`C zL1nJUDo~q&SLy$Be0LFm(|hp#m9VwVFDw# z>=RxUk;(|Zvk6i539kwUr8#ifC%j5-0ppYf3=F2AGa$fu4BGaB?2$&)2M?G(7@beo;jGJL+d^*?4 zcxlkx-3*rT(JU)L=|{X#b7D99}juN%~7;X16@?JelA^E4x9d|zT!90$V` zc@2g_P`{svp+QIyd~c$}s#)v|Q_%Hv|NC!(Easu;@Kcx-eD^W9{T(b0YIh;}Kn~3e z6L0ZQ-sKg$S?>8Gcs%ejoX0IF09=FYbPMLV;(V!XgPw<3z1l*`se?2 zA7#jV3)n9QAbzQ5l`m>!UOPtRr{2HXb%W(26@57Kh(!t1eT0yaU zmWMLKPeul=ZYEZSiJO)FPY+Xe_<8Ni|1F{F4nINnhKGRez;%Z_g5(EP64eg*w4i9F-0i!7ieAj0=5H| z2}}$oTi6&T+D(Prfdsl&(|Ri8&L>bA1iBYQzL%j8bbk=2oMdXWn+Qq=pnG{9GmEVP zrOWkO8K%^N)_-_A{Pc8Ynz)~d!4j0ugOB0juX;8lubdQU@;s5E~YzHhe9HD!ART&C3LF-6rnc#bUSAy=% z{fpqAU}OmC;W}X1fu!dpXucasPbP?uq~|3AL&#(2GMUIxg%gA9S7G0qGmGr{7qjDg_wL`Y_X#qTl%a^=bdBfAMC-T^hI1I?Tcs5u>I z=5&C}VdT=9%*Qa%QIv2{!hwnYebgz}tp!GlCdIk0V9wkOZxV|*_ zKOLl2;QxPdP+N7fP{%AWMush*bytbdIC<8@I3)qxj}Sf$P4|=TGjY7WY}7I9Gb6(m zP#OcJH%R&u?q>LS-(u|)#wiCF7$EnjGBAMCEGWH#)?$Q(yQ~DUi|_s4a-T`~b+Q#C zodzp2fYUX|9QjORi*SFJm7a$gCW6$~J28Bms?<3voEhXc@l^}iLFq+w)&3^NDGQhw zwumx_p5D&}>AP=Z1C7}-Yys&(xJwl5u6C%qwz4r?oXWtkC0O0zC&+w|yFm7V*i%9E z%3+3yApOmtJjKfJfvM3Rp4LI>{OcBmDdFr6KM(!;FMgj%9J~%1q#kA;L*_S&oGFY` zU}l2y{xvp+i6FJ0ybo%R#an~g9vmy<4>MZ+2Aw|v%`>3<0vg+QILtVaQL%GYg8{Uy zaF}u8-;0p=0_lgD{hvwnb-Xgq%11_1XT?V|fX*%X2)b_`v7HUxq43CKV3*`V;?Tj|Nr5ai*^JP|a8YRo9CB_GJR(#x4~VlXoU zXspjNz?EUGG3ef=a)+OwyEeh%&~bN%Y>0cgs~D#kGcuTg{8C&cFNC57>L;cu#wp&$ zZY#aC9e&ocGJHJA&JZ%+k>TT8^Z8OB+QXS~qK6{1OzmVS1f8c0y7LDtF4!?EgOQ_~ z^W%LB`%Z>J(EJdx9Jm~w%TTDu$`FDq4%ai6q0o^9A(zR@aM44sW0t2e!%z84O$!fm z(A{2)6MeKDerkix<#&XX^Pn*7Q0$ro3Xe<%1`|$3p3}?>3?iJ2T&I1U87F!fJN#^5 z6%6etR?pdbL^dI8x@H5of;pgWl(7d?V>j%6H zA>qyrKO+t^g4>VtoftkYRGNXK{U{D@KfaMiZa<2F=fT4tL(EIyW(e^xcKF%B%&-L( zCZ5_3KOLNz!R<*p<;Q(0ol>CF2xOJEcAf zGL|yI&0%eU8^hZ9QH(3+Gci~eF))aL)WL^8m0HDa$9urP!aKVqEtgR$XK=_7`V zC65>{&Sw&RodBwPn4*5b>;T;{2(lx$l5xrgH;1(o+!)r@KeAm3s{cxp7%rA1A?u65 z&=-%Q&mOD~)SiaS6^Xr8{PRB~g4^NeH#Uc#mzfwZg4)C|yJ2HVesKTc9!qkqWSj!? zKj@x84o1d{FW4A>dPdlEtCJc07DeGTJEP+s;p%slZWW5Xo_7lyU*(R?f8otZ7|1sHzX z*D$XX@^x5iM^;<+8Z6|WF zFp6Z-FNTPL+yQbIIIf^+DW`&QiueSEDWLums7#8lXIVK} z$#Eq}9cb=s3KRHjv5$`!7(ym69k2z}(*leQwxBxDL!IF#Xbvia&tVg6e#*?SW7YvS zhKZmyn0*D~6i^!s6bDIc3=p@DmgVpmx+`Hij)Y!}&17#B5MF ztAoOaVIruG#umArBhJ-4N`+GoTVuU=PV+z(I?x;tEbJK=9Dah*(_?0aRUkiu z(pA$YXr44jDmS2U`LmpH3bOeqVF0zKgn}>-MGJ$E&^&^i*8UVB{HwtT@h`}a;PQ*z z0W=RWk@08!<#W(^H&C2`{0mN#(6Z%tIpY*iKL1~=-+eza0%4!hPeT@USb(&9u2f!qDlTo z6&uSBP(Lt}DGI)30#t{B%JMnoj8o>bu~>la-K~FRxpLv({~-&Q9DcGSGER9RCDFZI ziDBhSDar1YT#z}MpIGko0*%XXDS*$e>)>EzDD?Qt*|8G34wHdl{w&bE1$f;@G~>#@ z)m!0ft2Q_@`~>-Pe>KBS(AXhp?p&0MVap08ho2`n8MZR8HC&1-hxAdm*fabD-F&A<9>dIpZl8`Ecc5u{M>(- z!E(Pmm|wYHo#E&H#SE4E^+9|_%l+mcc}C04Y@juH!mB`L+$?~Y0V;br60O1G^(&N_ zCeG(#0N-cYS;#mA#0S;46OJ*g1(g*d3=NmIFfshR%*~dgW*is1Mt2_JzxdFt_1@Yw_euCTv;%9>R;toGSZU*sFL41CPpCG@0_=zCC zGs8rXANN81>%h=(>2LMv6l?vsU&z`6P*{TOyT;5g<^BKv;-ES4EzS;>CQJ+_AUAbG*Ei%G((DF> zbB8LZEyVD#L(pL-D6F*@IkY-JVa&+QrOnD<)D2$Wz@5d&!Vm(|4+}rgSYbUQL*WDQ z`BHzYQNzERLBI@@R$yxxKy1)D1};{H3m%Gg6YCk}i{NV+ni(dtGb62Kc+4;{{0DfA z&jd!$T876A6X#bmP64ft0GR_b6SO`8#78z4+00K&NM<%OPIN*xvzc*XS2ZLJL*`?4 z!_z2eehrjPk^Sl+=&-YciNO?PwF#S9aL(O3&=n zW}LV~9hyc!>%f#5CyG@wPFZl6Vd5ra@xu%g1)yO8I)@ZA*Yv=dVdC8H|EFt!`o#;i zCW83vP&J_NQjlQ~2A5wb^MFjNl9(7zKVW8AWhaX{#|F{|n@iA;VGw3?V3^1t%Mff@ zz&M3LhCvuK&JQvZqz(}ukop<4wgYrtC8!S!s>49{^dyKmSS)m6n5bF+TGJr%I^mPN z1?Vh5P`H51LJkXT_NG&4Z#WV5Lh=pF53ulIUiD1|SNQBg?9+hWvjaL86ci^jrBUZM zels(yiayM^GMby=Cn$YJi!=QE4oYXt3_I(Y8GhEsGp?*>X0QbH`{V5yep)az1cmW4 z{ET2`*cpGDV`cnfMoZAx_X}CjIRA%9@)H>fLF?sf@DsGw zLX<(|^b{u1?g-PXUd8GK;KgU^-yAw+}p)ZwhjYd@Un*&mBnqC+G~xcM!h(SH{AHVhkam z{ztq%!_WA|Y%BLOiM) z4r=dt=sW!MOlF+uaF_u+cKI;@v_Hkc(u0w~ghPP=GN$mDd7}Is#+4Gx@<#Fs43-{` znJ0qA7C`lqM>5ky&{%+HGV??UW;r8|WM**Q2DN8AA2Uq^#fy9_BY3?nNRI`hfSE_N z!%vB7Ss}2TBV_%pLq4QW%~{Gg#R4=|*bP!6hpMI?qK2WAamsxss6Km#p9k3(CjKsA zoZ|7A3F=ahV&B_gT@c!A!fWUfwap)7yGRAddxV{GajNw3p7^8 z&hQfyW}xr^>(Phkc~rtU#f#nHr-!%0&-nXnD?#Dy!4F!m`C*bN7sHmac*m75n8Z%+ zXX1Fx!Nd@9f=RSHgBvu5FTLu&6T?SPUow-~;ioa9ST`s?L*_TRR%yumpB~2V@UuS4 z)B=>&1HkhDVyER9MPE0A&J|=5?dIfl*ksQr{Q4y5yeNhbmxLKUOj=RGIOQiZ!z$3+ zY6e^Q>Hka|DDn%S@}P5xUa*CCgVs(88+Oi0U}KmFO8YaQ@}M@SBtyd`uzUR(S2}V# z{Iq5k>jt?QG_UZ0S#lLK6GMnG1L(eX;Z=X6|4(;hclZf%{{v>}RX?QvPk#uSC(Aaq z0Qn1KZgjNcN|0YFnHhe{{Qoch9!<|{>HpK~vrR2P^Vl$TpfC{p|6d$EZd*z~^Sjck z{yVcwoGOLCFEm{XF^&RR@3Ir6?%N=aXoJGqGa;%DKTS9pwt&`vg4VEXmPTy{BG>Jp zdcA{z!2~pyxc@POC1_1FsLd(Q!0?epAov$(uIHyGQ-3k2BdZwGvmZNU!ip|sIAA$I8mh%+Aa&;3tvzFw;BZ0&UGa^XNo%__!%xt%>g|^ugn6D~=*G>zsy87q;bkH7ZP<(*a zCHF}={OV<82$5j;Flj!M1o*uDDQpZEOIUtvM-L-VyB@T*c_rG~X3)J`9IOn1u(i#e zj1E6FSQ#dIFf#m9KweV~UEd6DLozUgfY(n8GwkF5wdvVFZF7kI9IOlzGuRk@$}@;% zC;t8)0$P&>N)KCw9d>S)hRn5NOA}m-q6E_fXzlU~CP-R+c?jRyWzgE9;}~mZNlgRX zXlWoCEe$NLfTRIXd&vW|7k?qkL`DXNog6F-i1o54?K8$z@hl95pf%{A`Vh3Xt6qt5 zB?C*tCD3}O_+rK>E0`KCWpIJY;f70@e4xC|uz^$23VepN07HYVhM>bv4grRpnt=x_ zIRh9h5Nm5?E$aPV#2*P3zTPWXku>{aj-IMV0dT= zzAFUeUqt&5Db3e2X@b-Id8U=HG!IJOpfpcx8ka#z;~5MLrXmatLXw~~290-EzY&z4 zxfrqU1qfkuump|kgZnlR?^>9>7BEtme4L((LqK7qA+8CHSjbU^t( zlbK;lrWSN>11m!z=pH;+{?C$wt$k&f=n2jL;4}p-Lra{%dyFvjfW*KNE{Td zpmYV>9|0;q7J}Oa4MNCfgWLy-Pc24B-Nwo20N&dHx}OKMw*y%%$UKm_uzeoLa_IgB zm9?Ng3#hFLI+Fr4j>H)Q>92s!P(;=XN!O_Rqd@y4k;`>Z-v_iOX0@8bN>HC@t1!b) zUWPxDKx38}Ox&kI`=mtvI#2fa>pU5>_eg=8A%usOVWKoE!^9P!eIbn8r?vk&PhJJx zBh|^w5F*a-XVP|lhMx~V)q?j(J&tCa0=jEpn>54EG7g3$0QqEk8J6i*GvzN)*(a?Feqt)Y1V60gvDS{O9O zfY@IGiqEaiOyKba9)^FD<}>lU=HOrmSq0vI%5@qPXJ&t0CUY`!o!0*AGPw&HZ=8$_ zArBZECavKH_xUD$C}f-hD*HfX9k`7P-g_qU8gw@rXpaKJ+nUQOKx&y8RxvO#Yjml>EEE~!UD){KGn z@R+hNY&pRsetHE1!y3F|gYJvC{r|uC z0%gXDUXZi|*}tdEIB`W8j&HuW=!>p5qAw;+V8fMR`E;leVT)Gv72(zs$3|m%8iFbp-jRTZc+#S|}&Y1)C zDTVwU*BbdUuGM5@oapiY|5oHM+$sS{E3hy;9K|?gg%mUlrI5lf*=Z$Yd>yg}3_T2Q zp@rdfXc+!f0_RnD7>1WIPKkqt;U{Fd!weGxpkes88nTB1wuhjRfnf`S0K-H@7KV!l z|Nq|#+9LoOqr$3=L4Y`QEDjjzP{)ZFR)O+cJsZQ$1Sgh>ptei_6T{vDA%?y6VhlU$ z`51l{C^77&FUIh*z=&aQy&1#KdO3!l1x^fm>)jZ3)~hl6EC^!QTOY=-vtEzk zXF(Ff-ug6#o%Lo6KMRT&_STm%?5wwA_*u}zu(!UAVQ0M?!_R_A414RRG3>1OWB6IH zh+%L2GKQV?VGKVDHZkn2-^Q@BK91pM!6Amd^~V@?)~7N2EV#t5xBeQ#&iXutp9PN? z_SQdR*jZo3@U!3(!`}LD3_I)F_*bs^kG(yI?B5I`_Kj^Q1@9xdz;TcnypIG_-hk^) z=spF|7&iwa3wYlcX#CvsAT!FoG4%KX&6R@kZQUw{DX=&Nut?|;v0!9%~ zT*Jgc>ZPI}V#w|XmAjyIIG{5mK>Lwl<=sNi_+TBw%6f2FfY@sQG7r6-kf8<{QvuCu zCP+cXP$m|@_D`{_tUrW(|5OLa4lMhp(A`(h#P}L?r@ICZXs;_He6On}gTqfH4#@sL z(Ej2dYS`loG%gI<5BC*R4l^@MEE9u_MSg|uMc5$5@DtS5-|q(+i)2`}KZ(f_)IQn2 zh->Bkf7~ng|KnM?Kab(3z!L`l6-~?&A2AEBl9vR{?~ATlki;|*e9sSOgYAb%$b9t* zCI`z5CI%DGUg%t=C+LhTP}=|`22ukWhXT!~ zGaY1|2wG2ZXcfbhCm3+AYBDl}WU@1C0Ikaht5al~$imbR1k%5K6~h#N zklK9?J74^tA5_o4k&U6=k$vKm|MS7>SFd82;>^Gxvf-4&-asw}nFhATOQ7)y(7io| z=M3a7a6<0zF|;#~6Vznb%U%Gfqd{#HP&m~4F<653?l7@527&6B0;L9wQiqjVj2x#|F*0oF<#YJS&CqaZMV`aY9#FrUk)vBc(P3}4Bjdykt_*u%YUeX@ zy?*@fe+VefKx2rYcmc%&XgqKM8ze2?gU*+N;@aB-bQT!P#J8gVr+*c8`1v^)v~Lko zwlgrCa010)i4z4&fsJG zDZ;=Y0uu8C?eP!-osS1n(+M6kgxvKdvMRxeW8#g!|EF^@Fo;Ys>NKE|IQyR?)XR=!@$FcH+2dnL~B)5lP(TkmYiq_d1%-S>_9UcVJ) z`1w|v;inS=L&zIxhMxtD2W&y-OMv7!7jl8`YwHA^ee|Ds<;%wm;Qh~_vx?qqXI?4D zc)<3hGUG%;#s)BLzz8{m2DJ9(I_NB}#f~dE7`aaWH|ltOn2{kwP;P_Yi^U8RUoB>s zD9G4g8vwP7GZA!ORDSGw=7aoS<-LDoiuYC2GVInc=3z5tOxeJ?_sPT-LU;NI@ zuxi77CU74IbPmK1W+ttSYh{-~<64}K3={1g1wL{$HC*yA?3^Xa)N_f8QM8-0rRNgp z{6Hy{QvY0A%}^aOdXdRm^izc7+QklYZ+F8 z@}LJuj!Cq8GMB+m21n4D3&N{d|3TU*Uziwvg3cXV0UC$oD)`yOB-$O~$S~1UlcU?r zkzpceO$X?V70|tC`;{4XE=*>axL=xKCunXwOZ5Nr$xH$hL1%P=&*y}mDGnM#)fWFh z9W*~MpGo*ND1U?6>+-G)JLDOKUmyJcKV%A%0NCteCV`2H|Ne&vGAqlyU~>3rz{DWK zAm}iWLCR3>Ts^}S&>B3@d@1@~?FEk+CT>$eY70GPm?%;LZ8JK|aRt>!Trv#7@wE(v zD|i?}Uh;s>v_+hQ%gxGgAt8|kJoW<0PYer@*bkA|imV7Vj!5iAB=$ihHX|F7dL(uu z68j($Tag{1J`st%5Q+T|iLJc}mgU(xmtTp+}%)E-@34=bUt((cjIB|nL z=-eg7RiHlgPI<__DbSqj3ufU}pnf^%4hYb>)f{Ib_dtO9^c?CAKN+BVdq8tG4AS5= zTNjud`9NpbUQlG@od{Z2miGxVcB~=6U?QQYAoo_BA%sKRVP}98gNztM!=?TI8CQye zXmN(0p#52bjLLF)QU-FM@=q|4cOvL+JJ5Nkihq43GlKVT|CbZ#Tx#5L*+ zKY0aoTlzb4i1lqg$jpV+Uy5E`gIFB%8@$uYjetoFJE; zoS~MkoR*WST!5mE+*(G4kO$0?T0sYun%8-gA)i)cM! z<^}H|nzw>sN|&R8+!`ja(_MdECU>wg2*xvVy!LMFm{l*>1MU}I72@s|1QpI`s}KON?0(7aWKV9)6n3=CWLvoV17YF}K*#<*v{ zll+eTP4Yi7{{PbtWUD!_WK`3{yJT9CogfcKEqQ-Qnk2Yloj4ybKdLzt&CCV&v*x zCC%`2l{qNf9e#diW0<&8-r;Al5W_^!TwC(j{~@bDYp=i7T?UumjSL^TSRmy$=$yUy zMwXA9Dh-zup=GyIIOCKC4u&lY;J1G<)w!+~Yu2{wkG_nAb&XP{kRI$*ov zF~h{uPM~}LL|=pII}jgK9||%w*e(EtAEVf59!7@lwa$za*F9#KxZas@;&Nxki7V_K zb{4Q6wBh7sn7BgO;iuNux=9-t8*J+tMPGApa&@oJXZZP%@qq0oh6A=285?XTu{PR( z?gs>=$yLlu6FC?1O|)m^0+j&nXz++Af|Nd_QojJTg`Tz6<&WsaXq(SQkK>0jCmO%zIC*+~$0A35|!O#%2 zL5pFp8EBp@iP3U}n#0e9pthzXWDa(r6eK@0A7q@!#L#dFH2yI21EfA&aoEAKlAU3~ z3RVV_71|CzS3PE!xKbX{k1*PzW-U z!_aynNUdg~^+XlMj#(>{942b0I{j2TC;;9U0xD%|rOpGiO>z6Z3@nC1zAi>BA3gZpZjAGz2+Juo|q9ilp z#QS^$2GE%|6IUcTOf;_Loc)r8;REQ760U_D6SJ8(yFqt%g64ohV;viW8TM+3I#{d_ zXV|%d8+85>H+bw9w4P_7n#0ZoO%9f&RggJRrW%LKp!W6mKmVtL%m&RzfYyF;>~#FO zLYU!a>O_Vq;tUQyAVwk1|8%)c9B(}wv_G?2C&*y$qW-Y7xIGhIs+p^hytU-Pjf~F@I9NLwVTSr_6llyCbY~POuYP7`)C!Yf2ws4cXBR;7>;|TXJfJw)0IGvQ`y6^dKG`A)=K}C+qk#`~}{V*tL$O)a(kaJKnlnb&mlnXedB)2J!VQ(gMKRYv1 z+PpW*7^bWc1H}vD#0_x{dqMRz=pNONtPC;=QbuxaHIT5&Vq*{#dB`=f3$#Xtm0<(t zLLN}vyCEZyXX1S(hC-*>y32}!9kW2~;Lprlt2PM#pFV|4xEmBlpmy~Cdc+y`!iwAz zX9)eDp1{ap3Tmr^^kguJoM!r3Hz`U4wEpeTiWkBTf04%uL2c>=28NLNZVWp>Y*2d| zG~R=*?(CT}wxBW;d-=H@zAj>sJA>tKP~XHEG|s`iYPUMW&kiOBOFbEeU=L;n)2wC( z%XnFa!WT>oAuFpP=S*sHBhH!RU}c!V)5tt=J`+P_2PebCPF{wI9m^P2g395}K!%AO zNeq@9f(#Qo)R@%8o>qiJc2UY?hTB3qfp-i5+UJD=&lgO*1qEbuckha zrGp7Mjsg=qKxWH=%s`k8IzI^<24J&Up=PsA>|6+9gUkl8xxi+F?hFRIn^PL$ZboT@ zyV1->b~os3rp`pxi7Wp97w2SUn4rxlJrUH$%LLiO#88>h$%+zoAT^qe3KKInvVy}< zqmW@@hZuOCd;-r$wTYS_z9YlLP9x@(osJ9>dz4sKb~v(4>{Mc1ISF*nu>vFvK;~$C zR0D@WuA}Zm&PcY2D-;1tv;;e5bu%!Sg81AA z<-zq%JuA50`M`NlZsKbeh7TDBWhZJgcFf99ci0J9Pr+ErF*_sKVWJNsV>jp=Q_h7P z6G3|fLFZO`h&osl+|1asLY`qKNG?#yKyITn!`>DA4nH+o8GbPS{~rQsH-OeYb^rc9 zJwx5$XChL6AraDF*ud;41TL$T7hiELS8jm~51H*lVGrAm^LF5F(Jq zAd{%>uoG0qg3MIlGLYN;@Bj4QObjBR_3NN^{{H_=EBDv4t^}>q0-fi&-d;es(T$SPANTWP{ENVdOl$LZ0C#hYQ0N9#)18{HzQc*jX7iu(2|1 zU}a_4z{1L~fti(I0~0I521Ztf4Wg_J8~9imHfUv*f%^)eJy*rm89VCP7z`K6Fob~n z($WkeoiUIyAd?SK1|&*?$1*oCC$daD)F=dQr_5N&Fy#Xyg9u!1Awq8AQidrnk>wsD zr(r#d( zvB+|Y2)Tbt7^Z|lM;s*%vTT2+G7(vAkGjPHEaAgU@6dkDeV+Dlx zxg`u!)L`O{2=Nn37(i!ffy2K!5g~qP3BwdAMg|dWX7SUYG55^BZj(#d7zFJZMPIK_ zW}2wgICYkQBg5Kw$?n$zj*M$T^RhpsxVjw}7(_r~FWDJFRxpa6j+g9s?a9axvPhX} z;zMSxRiM7u(jWh)?_BJGcgVXa9x)7pQvj%&^0nb%sRv#hnsXI*Pk&bHRBo_(z) zGt0!&fB$dwWn$O@@)u}L@yb-GU?E?}wOUUZ0^cx8uF_;?oCq@0qfoX8WF}}#r;CxJ zyF>JVg@!1D1!x?9;s5_3meRc4JM|fUb}~6wzK{~`W@l))WX{SU7|zaM(#YmusmjoB zsY%G;rwT*ErN_+TS`jV|dlDHKOxD-1&IZj{yk}-v^`C+NwG%5t$V*1{(``}?KkWq> zJ|=_i?BigV_)0*m8+3=BCnv+iSB&hZ&vI~fdkQjK)c)&qIggcL;&TqZ?hTFcd(N>k zTm;|U*C@Yd)4_Pi-F*k;_iSNx+%uKSLT)N6YUa<;W{_3UdUpy?$SoL(U3QJ|(5iB+7; zj1xg-g3=4fOkC*&6iyP-yxlvjL2X1xdSPQ|2m+;-7A1$D&1?>qGa}OVoUC!U+|0mW zqRGlIQNNaRHfZkZWKI2LeO88vpm>9&msTzO>18b$=|z;=gsAlLl7SPPUe@4AFUMFI z1n)D5XD9#sAF^BB;pcX7ho7RX3=`HWJFf(tg90iGyxAE(bh0`8rU}j~Qzyvxsi;RuB z^HPeZTbq$_B4``{)UP&hb=bq9q#*Z#eZCYIBbOFP9Mu1R#lm2^UD)9#2a?{`Qas%` zjEoaO=k9~_7NF?`iG%cNF*BIL+?ra(FeORcVJBma!)4H%NaD}`(^oKq*A%`6^$|s& zV+LE48GeGsgFt@XrM?cbwxNT|VIpWw8Wdia z0zvx^L{?o0WSp{D-QnkDMusg3Tme5zp!!Y)GESLa$FOof7sJmCBz;G~`h-^<3WSWC zPG<|9Sua|6lt5|Nk}r|Nr0o|NsA8|Ns9#`2YX^6aWAJfAatT|MUO<|G)PC z|Np!H|Nnpe|Ns9_|NsC0`Tzfaka_G33=Dh>3=Emo7|a}+JKAFK1bf&m{J=042dghh(^(-sx>seR6P;=P%Q<&kW{9pFM zOwjpV3=Kh`GFIM}p)h0GWT_KO43;1@opbtwPRcJR3Sj{49p=me<+l@T43;nT9Cm6l zLhtitU0-~83E&=9nop&4nKd}IsE)(om~OyzU5Hq81~^Y0wxK=nOK@m@jCZ++;4$+Ey;`csFPb zP2xd;iI;i*PfuWAFa?#dGZ+{|Ky^;%MTB`B7qOdF&&2f_bhZn~oW_d+6Awbo0gWfM zF))aL-SrS*PR2vR<|IB8n7AHl4rmOi1ZK`hBy&CzVa`W^iF2XmykckwN`jfgC2xP7b%v?hxa}9Bu z3yaT0L&1r@P=B9dXb2KwU=aDw&9D=cp8hj4SR$t>P(8!wC^!*x$KNAm2GAOXDKEGk zcFMCb6moI;SDoNt2;p#K5ag0&2!12%u=AvoMK^bS&1Ef4P@ZbIG+&V6<6&lokPOgx zrXa(`d~S|zjlWKpd7<}kzgx~Q@x;e?i?yr_7e6${@8MwN?&efwn0Ug~!Qw)d=AMrS zk;E>>TU@Nt-1CXm5uxs3yv3y|%{`wT5$Y~iY3|AW`+qB_?E-4=XE1Vg=W=s&zgx^O z(IYd@!i$w*;s#fTJs^3QeIUD(|Njqpq2;g>)E+v?$`AsYA4Ye-AJqN)pg!Bzy322u zGfZ6ZG2Y@mE5pSLF!!6XOk4qV|3#SlL1Iw%UxK+GBnEZ=WtjU-Stf$qpO5B#UwrO2 zWtj+bzXUsjAgE01;B)v1n(G41VS&nrW+w1l-2|pYL3ld>w62YDA;Xjx{0={-I5AFq zyNCfi<_IbyK=%wd-uWN$Q`q5W1vBU@Uw0G$0(4@sVG&DAU`HS`&Ng3g}J*L%{VKbcU7KUzf?CJ3LL_ z)Li}wZfl6Hl1^islF8=q6TH@(o8c#@E(N!3xfyvPFZ5lQ;pcC0(4GRs+9}Xo$s70?euCECgVs?=Gc{e}W@);_DeABjw6{*I zmSZ+(FU87z4nJSbbNKn0nRC@E7KSaGcY*2_&esjlGc4p8xxjlUK=%fJX69H0x^os( zFUv46h@3cAa{2!}NZkJa$Fb6$QTlbJapx=zN6J;1Eo7$?$Yvyti{~S!LS9iz6^ABav2xH zPtd*flcDYc?GaeGC>(s|8)%-=n1SKvihT}0LF31qiVPE1?qm1~TDJv?|EvH1i-Xo? zEI7nEk^l4m>9F}mK7Yn3AU(p03>R~l9DcrJVc4Lhs5J336IVBAjs|qc-{_&RJ(6r>h3rVi@YyjEfY_nScd7W-C)AE3SxXl|>6)8S`V zBg4cjMuwlBh8*3Qte~`Ubj5FRho9*CEI@Pl2IBvxbAZoyke&$Q_hm7H&xg=L6Yt1^ ztTVvZZY|^ntqEqk2s&pClxLin87e_{=7HB8WHbEy&CIAJywmZg*g@Wj@;e!S20JtS z1j#dOb^Iy6mGLKN-Sr_qNc$hOHy(8UCTKm}0Vc@Yt?+z?DfgKee$GsCm^dTJVWNFC z^G0zB9qEJ5?s*kJ3qm~mpfHp5SOPKKYtj19IP&a4v!T^ZI2x-zcyP-d7I zZ_M!1fU&_Aq~5ccVWNjR=Sq+ok6?zM@%8L0lbIQ|bf`J}Y($z@Zj^HPxrm8(qQhdQ zi4rd$dDmmHlO_1vu5{3OYtVC7m6^cn6ciP^W)*$;KOLk79JW}_UcHgRI0Y2WoDZFL z+OskkK44-90rPJ{_z5unT?ij^{w2s=4M^^4fXsJKU}^+~YXfMF=cP+8AamWIbK*gL zB~ZUbn4uvEq!0bfG*CP+9pnVBQ(MTyJMr*~|I zD|j6Z$G88}!Qpe%@na{-u-u|4-0Jl$h9=<&K|hzn?qE5cfx%=y7egT^uQhM|I4m&n?C1Z}LE@nDL1-StERenoR)(!$`{Nu|?q?Ez{eT5xFKCRzA(>&~ zWthGE;5)&#Zf#`eWuN;&aCMG=pKixwa za^{F9zr#*WMg|j&YUiEyj2zjZJEQCs845WV8-g?%JETD7f#RzA+yCjH^ugh%4o(xG z{+-5I#-E_{p_R$9^8y2d2q+zZ(gVzWJD~3S&dy-6pN*k#Av;3|V?+BT(7NhqUr60) zEXA;;>3>U5{Xg}cp!FC(x&Ke+U}(LRz{Jtb)X;PZB=&_Hl3u-EtG%8Wf8{0uumdru3c4CDg28TNXB&LV-%M>ncD>}+UquuLpu zn3BlQa0xPYDYEMEXJ|Mv8cYP;p#iF&JCYbJJKP|3!T~OZ5K!3ziZ5838y-gsx!`fM z^BFXbI2lYl_`!4Nf%2jZg(o-|LK;~cE`j#XarrV%N#JML0xHKr_s)7QW}cYg#5YmE zfnhBupUDd_{FK*V*a^y$p#06i$nY~0oOU=@{q$j+0?J>G{0=)4PC5QmO=19zQ6j?a zAtcHth(3=duA9L)1=Rof z3+?wXGcYiK`ZSPrVJAStm<*u%h#cS4T;@n-6akGVGAJm@F`QA9gY8%IU}w0%z^DaY zR}PZ@9K3twS8mX~-%Kl?h%>KzCeH%D*8|j61MSuNdYED2r~jZcVH|#f?pOuwy<%c$ zm;^e56?7-J^L)_Q>%kR}^8=1T)~7Nw1cB^?>}T5tUMB_G^Zs9$VJE1s1xhoZbzBdf z8769S{+|xI?+BD8LHFzwI5Dm*aAI0p;KaNZv?dF7R!RpG=lk(-hXt?0%uBw-%Rh0jIQ-;HbeO2K z(s}28Yv!wG{sPX>mqpu4iYI8V;XsC4-0$;i>I$-wXv zq#mYU3#xxUBUd))j#iL3hpMBdCL@QpMlJ7b4Hkx#d#8=$e# z3^s?KptJ$n77q5I+;t_D^(}=y{h6 zGcKZ;aTUVvVrU2g+wqiX=SqeK@OUIHcZ1vjcM~D=9zx6qnaKrm^HT^PH1-F!?pygFjw*h&0m4e??LR>Wn^l&bVVHdzF0`Q zMx1j3yQ6MVBBnVYt0Cp&UT`@HDsw?*gYG2;?XzL^2Hyv_1++GgBawF^M*zdh1o-`H zhv9eRfyRcMgu(d?ytf_1Uyz2J&mivM;AZ&1Y3RNawAP<9GV@0;JHv*IF0Y+hj1CjM zWkGk#a%Z1mU=0rn?T~=@jUSPoDjc($`4RI13Fs;bnp6C(7DW5?w52( zWSmkT#<;ScjmZL}7UU0*nUFdRa$YaU{n*$2BF+{9t+~cLcjf;i&_2`*CfK zuLSM?4REzzYtPDLQ4c+zC6|@y2WXw966l;G@VOzNegM%RibfyC6 zOg+%LPaPcQfzBuesp*B9w+en{3m5oKiOfWXiQqF~Sebs*voifCaC2B&;A+3N-V7E$ zT(3dy0H5Q+#IR*M_#7AU*9RCGLQ0YtCW7`>gWBDoeZ`=0LPl1Gi6;^mr+~r*6uN(K37bu->;AZ%lpyaR;bgw{2DB~2+_!B7KgZex(5!SR2H7z!r1{tq^B} zEyqEKJZOwJL&|X{=q%raD#+N|9Z$w72}ukSgS;50gfKFgf!uzDLBRZ)C#;-10xzE! zRT?gJh{4KBg!pUFd8@E+3P$&z1aAL5bVTvrPHOm1$Z@9z6N4$pPqJu!T8Pb0$_2c1;IxkIeiyz3 z#wqo2uzVu&8dQ#jFgyI5%;W&RqYlIdr-i4EKPR&>fWxbk3$z!~;ip)Q!{sn(hMk~! z4$i->lkFYNzaE9zB1MSgr zFo&Eaa5|oGO2l)|m7dB>6XWl*uZ(tg_z7z7#V=;G^x$UL3A$sdSh;hSyfXv%9*P2{ z1Gb?4FX$Xx0mcT~P;m$FJro@LnDKa z_W#qrGfS)rzsaq09unLo!jhW7Z>PiB%4uefnbmr@vxh_~5w^5sn@U#ld%sI4%^Q2vV~~ z^#61ZZt$3cASf(6n0}b~nzKxN!_46g+oRS|3)|NQ-J`aVL;4Lfw-)C?2Emno1oa~F@7=oN_z&**Pu88 z?FRs@B?O6s+XagmC*BhMKiz4uJNO4`^BdrGfC< z&MQH23(5<#K>JOMk+GO^a9a~87#juHe7nb zEUXo-%&kd#MoW%H z2JrqE(0PJR%8?r97eCj{B&pbohwh&7&ZN--OQ;8r$1auy(AS?bc3Q)a+uN?cyf>w?#B)uHF6Gvn@#_L3KImXP0D964LQI0j?D97Xj z8FqrpvX7W$nT$8#vTQTx{uyQB%CZ@8v@OfB;_#PcS6C@8%Qmx+UY6YxAzYSKieM?r z!l_V}LChepEDOg`mW8uSgq3B>MR1p8E+V+gGErz+Ahs;yjH7;8RyG5BS@td#UY1>; zW?8oA5B9R`QY`ke>@c(}yT^>bEW_TPL!5^P>d%4BU0k8&u<{2p<0>wO|C4rbGyIfi z=6Ve}XTtKY>*Ng3oCmaTCg;vL1+SKZWA;k2v zVEr4=-9n(V0Ac-`-;AKSWk@{(D%W9soc>tGDTw}!*z4JBOg|1n`#0a*7^l1tlZ4zG z1n=A6-dnstnQ@{qKe%rLIYU61apJ@z$eh0}viME8`ps5ia_f=KzvaD z57Z6@&GQu4HQ3fOF;!-8u~=p(v4GEb0=4xgGlABF9EOhJL&iVqSs?dyg8FSB_asBz zQ_KQ$j~s@3RuJQ!e|#%JZUMQepsC-cUWlnOLyN_-(5=B1ms{q8$Gb#U{jElIBWO=( zD<4w2O=g(*IFWG*NW30R{B9y5-9q}~kaWnw&2Ry2JZwV7A*|zJ8yFJN#>1GjC-%lM zP64S$8V{Smz$iM=I*xHl0+aT{_&CIP7_NL!QqC|1k{2W=g5o`c3y~Kzu;hgfEO}v} z8{-ry1_qH*q`Z&-8f)>Bn7yBm;bZbM$I7qlQ)eA?a{9r<;jnYz?f=v9rvHDA;PihG zDg96R``@$_l>U+3_ZxTm2h9hdtY=qd_z7Camc#Ua`u}FeiyrI@6C@qACYpsitOS*# zpnL#2!v(aS!0^xi=^*jX%wns)FfnYY2c7LA#Sk(Be802EstN`M6WBN+sBf&rC~_J! z{s0;a0?m_y%E=@yhoA8bT(3dvc0lu0eN4!064BS7J99whGDt9lykY~L121-3w z2S*1>ZVraPdeHnV14GD4NyuCSrvzfI!NJwRQl5dKkVV3|ibcY;szHPy1eD)iC^Jla zsmw4j8@je#UXh{Fknw=6hT?(Bk4^nHFNByXJzX6vLFwNfG?&5HA@$-DW2K|0!%mRB z2QwL_ykv9u`QRI4rGl%2-oH0L1RUb@gxrr+sWyNn=5pzs+nQp%Vvg&iFI|CLHjX5>kL3+R-p097n2w! z8X=8SsUzum;KcL;r0=sH!%mRC*PyjJoDH^MeL;+1eZ_$eYfCu~*n;I;8PV6f+uv0jYVXY`{qv*j4S|`E<&MLT^%ezcTChvF%*K<)Pv51;ACkCdLhhE z`BI;ul8dDw2(+K%t1v@lJsW5r0O*eJh9J-$1JF8Q4yJ}6E~bW{7y1m9JnRlXLHYU# zv&1UU`uc~=B3hk}p!Ho0p!`y}f^Di4=zjVa;tZ85*``Wq)N)C4*D?pc)@G>eV0GB} z-6~JCLs47WMK#iW@rckxeau_G($Oj ztat+lbS(7+v%^nN*=4|Zz_zQ-;W9@#!%tATC1BrR%fZZ4smbi{6BG{GqFmjO^vn%j zuayB#&)o3zoXF_#Gl|pTXOaI7c%JC%11t<7nOqJ(H5nPUfa)C38AGu8CXvbErxGgzcs&zC~9!x7`_p!FR+Yz{v= zzB%mdc9!%j|K20^V-IiW0GhMi!2AhBAe z;7(44on26KJXjfaHa~K#1g#~j=V2%W?UQN#=U7?az)%RfUja0RbrLk!?aE*&$iN^1 zF3T25O-uxxYsbP+xR9G61gzcxq23d!9yHcfufR~K2wHE&=J1otmBF(4nPX)=2SXvK zUj#Cn%aH+m#|EhF+Q`8W0uqyVWB{+3eER+WbP%7x)xq*wI{3`GpPkPfD?w}QIBPkj zjcXaC8=RbeEO&<1JBRA4GD`hp+}+{C{bTYzhMn`3Kx;-2^DN-7W|Rf5HwLpCrNQfs!E8sFiJs7N zoIviangZH)0GfY7=m(YLpt&dH_8h1!_w)b1>HiNiUi<+)^I1R`vY(=462ru)3=NmU zSQsXRvoK5m^{GJpsS|Qe;QO0FeJYq3sILWTpMk`t9AcQbm5t%z)PMiCg8E|hS}c~J zdVg;u;}p;yiWmR?f8b!`oG7fouo5&D4_bH60NQ);|NjLhMo~~XvWiuiVIm6yc+GDR zNd5!pJUnLb`q3?*IV=ul2GbYJ5~~Cl57=@#Gl0s=2^@k>KS67sL3~hq4b&e2xew$f z&>E}%hZ!dx`~Pn`YMl(Z1L6Q^-xoK-P6=PgIG`DPUHl%zy?xS&3`V2ofo0=J?}FiWi%)~ zfy-&|ejLc$C}=LzgN0!N2cr{sE)(QmkRL(iGpLUUin|OZ1`|;K*Wa0O3WyIH7ue(r zVaqczWG`T02uWZITnU;_*x<`JWdSpTDY#wk%rFr&&jXtO1f2s3ieIo@oCv#+(<~_N z!Rb{BkzQeG)AT1Wok8@9#`5 zmWkS+{e6GqIkf+BaGZeN-RuDy4-sA}ii@`9DYqzvR=A;+Cy|AO|%v;~0uTLSVg z3&OvkG6m#kP&~o<`x($N6nR00LePEeps*AIg(Z@B^8f!K;ILoH-2=YY=5A<{R?HTwB9T^!yyd2=;GlIzD zGY$z16VE$A@*2o4Sp9}!&KEv{=Iq5{4me$sv94rQ1Z-UiGa2hjc7W&gL1RLoamWqI z3_n*hf%aiBt^(bwEXmeziBFgz0=Bk9g!ksG6>JVae=swz;$-ALt;KtDRy-r$>jwf1 zA)q~8zN`!reOMVLt`%nZ36np;>UA1)t}JMe;|pfKRV(-zeoEI$&IXO|JY<$$^~w>t z)g8Ws5n#wnmMtY>4kfUQyKV`GM|QE7E#oU%gL;U_0s!=-KD@h{0$9Fd%}GnvJ@ zS1e;#`M3H6&hriyG&4@z&k1frPXM0@+srsoHkNUU3g7?fpt0T^$a0|je`6tKQz!(m zg3fpVhn@9O3_njW zGnj(h3u=!byBE|>0J#sFILJNN#6k9B6aQO%1mm6{g$zhMLDmaG#xFr(3hLW{&aqTr zgzS|Bxf|JCpfysUFaoU+0*#S@*1EygRfFqcv~`c5v9o$m8-Rgf%VP)7_zddWM{xNF zuD4Ogu|aP6#>}Yo0(8!-qA56z6Zjl{g5qWY_$E*izko$8_ghA>XP&;0Xq2W>zJHx~<@P1&>ni{cHM*sdz|G_N1 zDk7eFr5Cfq&tT|!DA2e}sT0G*=w^nApgItA&+b8`*%)hU7O^@1h-Z*^4H{48|NC!x z0|SEzr2Pz8TLbbBX#FS1>;s$(Ar8t8KSALF^4B9~=~avh9kU#o875lrg6E|-;9O(V z%rNmX&;RL`>fc7$h z#`G8%LO|k9p!?XG87DIH{-5ro?!FSVmc^@?aiYB=!$(HNF0g+W@cf^SEe#Yw(?CSL z^GZ&J(sT@+;`h@n#0lUfZ>om=4%Z;%czgLyyIGu?L1)*4&Q|7Hwd?Qy>7nutKSA*UQtJrXlgbX-V<5Il_#neYa9OMi z8Lw7g`e6B_i)PUXk{Kq7)d)*3;B)x-zn*C&XfF+DtaeMBizc|N7lf3npP3o7g4uqUzmRs=$-yY@ z&BZ9f9ReM@_vE}HrLmn5J()f-oDS-#wiR;P%{-x!R!1%W`WGXsvq1Ygw#c_ zx*W9T-;w?Q^cQRlA3*Is5PyCY;}j5WjV3-b3euJUr&px$5=0lrwCVGZ5P64Th&4+5RFkE0zl$`iIjB!drlg>oxaHRQABzr;o4TKf7 zCxXszIKj%W6%@A&jMfu(yMX3V8Ga@(GHgXj502L0Gjh-O!^Wx*`xHQW85wORt^nx; zuX|ho zZbQ(2XQm$yn;9m)P-fWq|1i@JaDL&1k z1XLC=iaP9MaCER-lEg3tRQ`z9I9vvmL48T6Wzd`?hAANRpfMG286@QJ^Pw`sL=n)~ zET_Xx&>2D?w^`JRNpnEUp%srHYd1J#8G-KwL(3o!&eKvnE4iiTGfHHG_Li40GMIwQ z0NpDC+N%oMp9*plhan=ojCp^Un=mv4X@JhX4s`elIujqP_E$p?s6I&GVlV;S7x9>x zLCa~e9yooO_cKiKWnd5infL6eKY;b#QY4IP{}q(EgT=SB%>4_$|!&zKn|K6Pf8 z_(YgtViO~$_v2*9+L04H3=*LDs%PTJ2Hmp_vLmTkep}4Y z8pCEds5?=E9TKJw7=D-~N;`wvEE7O!kEziRoc3n)F-)1v@WUKzjwYnt1G1}xnPDr) z4$!?~Uzj;peP$L}h1?bbozDnb&w##0K|uksM#1AS!$i=$xV#|4PtckJc^QVn3{Hj+ zO%>2OhXp%0kQO@PiT0nGt`_6C6Z4zKMQ zr-0AoP=wq$0~&h(hl8QhPse0N@R}^pJ^;|&Y4VB;A3^(nKzjkeXVd?zzkEEHams!s zhQh0C4nMmY8A2{If!5KBzCIwv5CS@v5M&1ETpvy}cY(&$LH=zJWe8dS|G#)QLqm|a zJHt-U{4Hp{*TbD*C#atHNM?Yq*$7F5tl4l#X8^C+uuEi^;+gJH30kwkWy=uEZOahs zS<5NyUC&SnTcZJ5p8;Cu;cLqf>|4!H30iBe!RoLxzL}xYyPcuZ!<=E~idqh74{L^< z8lbf%k_?3h85u%Ad4q$|cp_--B7m{MmKW5&VrvKj-FN%qU_;Q2|Nq5bJZuQM2BMEQ z1YH5qpfPnvPflW`pMEPW+!Abc(4V2;?`fW`;_Td%AcU zf^>Ktc4qJD4D#k#R0P@&0xGBD|1++9=)^FQvzAL56pk9TtD$Q}*n;OXa%Xomc1wZW z&&k?w$&;Dkr{`gYiJsgHKSBEsK?9zOu72aQ=FuPfPV!#Kr3AF{4wlMUk( z(EbO|{Vgw)7)^JQfUc&)WHxEsnOa$YU=Lrl`kjk1>Op0dUdZ@OS zVG1a$LGz>c5+LmnriW(W`81GOAiKNJ%;Sh)oU$I>yhd}dd6_Wt933o|!OVlM8-bZu zhGyQEaK)nWXHRw61pt;CvKR|6NM)24OsC*Vv z)IpThj@lDJd#X+bf!6jitOA{fX3r?{nvt1-=yI9?y}i|F2nru?pG3D8OIaP{uu_x{ zR91_;KETTm@)cZGi=vd(ri>0hIi$hohXr*oGHeBxaiNg>0B)NwG=S$YLHXr`7=wg7 z1H(rKY0zG-`BL%B3_lZuf0%>v6DUtUWR_Y5%8MYi3xuHc#!bhc!ORXnOPC;ajT7j; z6)DjABZgI=u|SYo2f-iap!24LLFXhYgT`8g!TAc*{zV^`1C0xU_JIk5&W8e@*+W1r zKf_PqWQK{5b9L~m6?SHr_<~t#l{}*`ct0XG`#qQ)euDfB8q4Hj2kk2sUA2Pg0NTD{ z(bM4bei|7jp5%b!LkDK?c|Th~Wd&^P8q@{=&0Plk_&5D$w#!P?xn0P5D@gq(0=~~} zJGi_MU4^;ENR+_ZL(x_FKalG`5$M`Ok=KeJp!FZP-z~bz;W1>MQriws{kNC_QvYd# z&mq);*MIWhvmPfh{;a>u9>h511w+H7_{A)sbuNYR#SE2KQ0hX6pTKqDVup#JbmNBR zMo3*K@)|T368`_c_z4z<50J8m0lZcR|;IilfBd9ET%rKD|ddD4DEqG0t=qhlT z_?Tg06`I-~VURv3s{=y=18Dy}Y}^FAP8`zz290ro#=91o~10NPgxYCnMH%|Y$9%WMpwv8D|grLI3gZ8}gMf|d;%K<5;J z{my6)FB{Z)7^cAOWM>Eg*$JA@2aPj<)~bTm4uQ^we84QSiiwqB;sN&m(;?%OqOU=F zmOZKd&xg znD{~oRA%9yOZd;l@bg9!!^9U(AhiwQ6n z!WK!#ss>hukomj}g`j#6bl;eVBZK8@CWoCMzktjI-2(+Shf&&yqf$zUL$FiI!;xVp zNbUub!%ondEb@{Jg>S^?OV!IV6n3yOgm@}L{Jj$CY?k?|423C@ZdIUtEg7;5fuOT? zLHA&2vP14&2j>|@lZlU+xxw{mWH-YUP(KZH=JD71Vb$?G| z*vSvNFT;_+^7Ax?ouD&tGuRq}I6-%HGcpvuWN!!pwTm?bJET}ZYt9}v1cBxoUL0=- zdNGY*=WP~-4=30he!gX5tOV_MhK-5D$1zMf30jBE23d#g8OJc?4VxplO%Ga!&1=gL ztXaz={Z@{#ay}mwy{Fob~8v4$&yB`B?Qg3cmgcKF%J z%J4xk(Qe|SMbPmjMo1VvVEbYISDxfM(d zKSB39g639EfbMc-0-fD=L%IvO%G@oC~}^V;$~)n!v+~4WU;j=2jbj}S3XBX4 z3?K~Z4}fS;TjBTr|Np=I|Ns9x^bQ6PA0!UyD}eB~|NsAMfCL&D8DQtfocsE3`hRA| ziwrytKS6ea%TrZII#|H)!~8!pA;`K&(0aD|M-1RKjUE1=wP6ffK;uCi4|!15 zG&Vri=}myGX>3JXr?)$UaY_Sd4gjwt^Fz#YOn>h zbEkd%HyyH<0J2UEv~F=e7sJk1&^1sT;C1_USCHqkLFSUPGz~=B16n^0O8Ar>Bsb@iVaU$lpLE#12hlN=Cm-&bR=Nh;ZObn)= z^%osX3?>}R3?^GaYu3C#=M^zzA7BEl`EvoUf!plNIOPB%VhtQs#ssikpU@#ZHL$1+RNRS{DXtm&!AUfX~JjPGFn}n)3wB zU%=Yq2~BZ7VB=BB{)|&zGBjMOUuM5DBZ=XnJR?J8CR5xG(7Y?S{nixoLy?tXqNG3L zl#E9V7wfOtt_0mvk;xQ;q$UciMgXKHiSc6nHS3kdO`!b9V40D`cu^kIpZ)Vc1eAV} z&oaWk?-g?2JE(oVSeR)gXzj)Zb%vjy^Qb}hifoo<_$kKIaOo8vL&R@prd2PPcutG* zUYiBkm&tQloA=tRdeB+mpgj^?4nK2Q875Y;GEC%TgvfcYdY`Um#Sc11Lt>Se1@v5SWrm+2oD5r5)QQa&V-)GW z+Qc|z&X`7*ARS7ii;=L&I$pP)0^!F?k|hM)0@tSdDb4phEmW?Tgx2hu%I z@#6n~Qw>JO(@cLICp$1QPSjz8?0-&Rb65#FBmF-UBX~{0S7wn_ptclfju})xgW77{ z3=C5e*&Kdu;RelHi?4#niLPpe-uDYCs}C?RYyqhO-64_v|NnH57^elOzt?aHbk4a( zFvo08W|3}Cd7c4Y>vap;S;_K$I_QidTV%Op#)-3o zA?X>^_gw`6Ovw2Vlperoft%rHrV!}NMTegZ2Q|Av=jSOf+F#RjhMrZ#+;9mrevs=2 zG7q#?{Ll(mK0;jwhS*;XDoeIFGp+o_%(#k|;m4%=OuVmOurY*mD>Z&GfbIGHC86`rE(hjY|MlN=ke@;AB+#8iYt0#_tl$#s zo~p#KawV5=cPIG#{bLwwt|qhkbc6O|gYI(!?M1x*|GzlM9raASuQeDMLhk(kFAiE$ z_xS%m(7Y@7>@^VIF_>|R2Ph5>GfcdLEO(e;q7^g_AmI*M$Hlbj5i|2Dc?QPU3@i*G z*-nfTxgIb~%wb|U4cbHg4perqvHkFP$Z)Z~)@CK>oD$F)$^tjrweeeRSH?HWSj^AV z`ccm)`=g#w?guE{dnhtYEIMnqHh!!9%J@b(i+V=+AN93uD?~ya)|OngSsTBTab>(9 zL#0sh58f0W;ioUoao9p1$34psNdHB+TZ8QFfqrOaf$|LjhLgw!~`YCTEM44pmk=T zJ-&zF>!XnCA((nl{|IC!$i5CHhM$c}3}7=RG&R_)31XZAs&hCNDuV7f{#np;&<14h zgr-ItP?-puCr1u>sljF%%v?r!@R~MI*nrK0)*GOD zA5`aq^3Dcs(EPH)&jm~jTeuV$CVKph@8Do%2=w^N*|8G3ruzgVgDGcNn6BM!PTLlrM}8m+FI< zSJpQ%Sc3ZP=wk(SzKm1qgBVxVGcj0#{S$l;e10ox{@ns!mkbK`4c_28Ab)mpGi>Ql za)6AxJ#@0<;ASw@*z2(K1Q&y;2BWiO2N#1W2Rp+Cj)z?r@@Ob@87KRC$2Zbhr@)9_GGco+k zkaE}wx+CQU%MWu&<%g9qj3SWy0BH{>I5=2>#=Ajt^D8(R zLO8h?1T;JsSZHu^bTcr@UqfGO1iEihk&z+9`Tu{D3>F3<(0ySK{{0UD^~FJX4we=` zW8sSI3?UgD3__qiKnK|vLNLq{VkiXNtMmBJf0GOm1|j*g426xXSky@|6oU2@FaG`C zBtwHiNZwYW(Bb$05U`%V422JwvFMRwCK%PK-K+~ z0PiP7S9h3!!BkPiVP|n9!<2d^hHQ|$0|Ntwzqjl-ef80sH{U?z6LS3tnqTF3sDg6N zWG0)lUtNR>wg4Sq)%KwWFj8hU0F;47t2d!gcnCNcDI0aPJTRJjMnZm$e#wZ18 z53fW%D;Qp%g4Pp4;uTb$fzInZ`0qc;`fyHDP}vV!&xhzEGx9fF+Rcd627{W%;J|PZ zwC)AjA24%y(bk=RHo;=9Si_~I_{>Er4?yiLQ2!aUmkeYFY~6^Vr^8weL5H7(UJPq9 zgcyD*GdNU&#u@7wII=}q8IwIeTZ;IoGZlD-WY4%imra5w1O5tzF{ zoT1fCeCNz$X>|C5R#$fP$?hDQ0NR|cR5%xax`4Zo#$Zr;4s6) zoLLT*+0z^>vnDxMzF-E&$A`>52TP`hN)z8|Gwe)nbFh4)%&;@9$-(lqG{eqRJBP|w z!VEi8tQ;yq>%x+y9Ck)XFic5hbEpK}QwMSbXnl6tJO|AehZ!bjN;y=%5NG(AA?C0% zN6n!!TgjpFB{RcLn18e694cQZL+oX0)SdW7nqlW_VTPTrxEXf(v@%Tjf0%LNoe!wv zTrj&pc7W{CVsxkkrLznvh}%H!f|(EV6VpM%i55`vPN10w+TYH_!fXlZD|pB-1cUA| zQe<@a$@Bqq{}#hfh69Wf?G+g;C)hKJaP48(3F7CvF^V9@k05m|C_fo6G)w}OFB_N{ zSDMH$1n+NVu*|Y$oRYxCU~q+8f`P$wA-}^1P7D(lEM}N!-t~X_4mZXr zj-a;VVupzqSs145bA!~aM{FT9Os!7W|LJSpAax-qeZu=2;CWw2ISHEIJH-V)!}Zc> zPKJnhMuv}`jUBU08M#jHXJUM5%s-JBn5FKaO} zo(^W@?gov`O#1k5dNGqo_d(D+5VP$HBZl;g5 z;4ufgPyeQa2;qr`pSnAOB4U%`bt(7Gj~7`B|?a`?&kvG%ek=&Wikho9HkK>IjFyHA40DKO6(`~DbIPl&A& zP5|B2VRr@8&V_8}3uT3eFL*x!VmxLcH^Wa*8id__D9+Px33R{g308)PFy8C4>=`&- zXRt7YnAV7c$LT=*qC{ip7#%;u&nrv}TR>xCkTEWiRcD}Umq6oL$YWfaenG~#0*o1_ zoCp%1je6%H=9mj;{G|UkcsvENe^Hrn;#)t+d32q~;)fX~J_nCKLHr9D&RPW>&w{KU z0QnC&kAd>nBpb#l3Cs+pnhXs=E1MZCGq{{V_m!D~*7ap@F-g50E`JZ2n_vd7T>`lmbRL}J zVaAnftQ=N`wll1p&&c;Akr875}4GF;S_W!Uob z|9|nGM#hOC`woJ~f*4jgC^Js9W`c}?MlN<;3A!uD8g%A?Bg01zb%&pk%nUz4`@leF z-7+yUguu>L{=qD{3ceRi+~KD%1A~YLj=f;6o~V1llt6pI;O8rgty=#9v=>ZrRir+| zzKHwGE4TPLtenpz{JMdMA!Mo(!$iO8ko{mYXMyrHXv_l?9-#j7A~rYpez5NM zko7oIniwa7%y9hoKO{07VjctNtYu>d@cF->Gkza2OM=f@2AKuAzi!L_f74Ha_Sh{% z+GB@y=Cc3)f77ek83eb^oEbEA=FTE%(7v$mpnYM|-W|1Dp=%|vpS8^MAN8zdP+8&# z(W`||FX)VAkY3O}zIbc4*`&%$6C3{j zo9?vO6LQY7yTeb=8QQROmSz7##!Wqf5o1ga?vQ;^?>rc%fZ`+KzVpg3aY(#?_Jplk zAKp$LXD*W9*-rc8;N;Jd0cn<4q7-U+%kS=`}gA{)cRg&vT)5VUp~l%7CyKcIEXpfS5y z9*k2!`|)7@hs#6Hsh;G)IORVx^TZ|Z@UKUOm-k5ZDX1JQ*_l|-3>7e!sgAQcB zn1V6pelbwly+IgqrptbAhM$u``_hS6C%K=W;pb$~e&=M+d_DeklA!fdu(52Adl2nP zSe?hX3RHg_W@a#D6oc$pD>j7G+a(+fTR`cQqtSZeNfw3+pz)oKFou=$>zGz{a4<-K z=0QMhxcPO=D;ty;Cw54I&l37M*9vkj5~z;sNMf=CwJRrRHQ0jYt3d8SZWDs~Yzvtg zLO}gj(B8HXLr@tSbc?+H8>b!=cyueT9OV87%pzK#_Bt%Bz{UYzF)~cK?hI*@K++HD_ylNN3^cdxVFfuqCyUMD zC%41QOWwuHKY6?atykfm?ZFBjy8_=Wrpb9?mPaM%Tr`gEP9}z*S#AzHJ!%~;bJudu z?q*~737R_u?IrMl-W`^~d14mGjt(}4pUzgGv;ms;L5zFsu!6V^c|7a|7sCeReTl;C z3?DL-e6a0HoWO7peP5!%L}gFVzC<6;9q-_Ki#S*qJ}@xKPrT>>8qYD9_|*fkFA;qm z;!o&0M7y_;z4t$%YdS#l2L{3nKTVk#euCDdnu>$wd>L2SYcu?`cV@J-Pi9+bFU|1N z{xE~3eKN~RduGtSXNRAl_5`TC4{KW{u>3GXsY4o7z-vxG>k+0mGE6ze!f?U!pz=h} znF#xn7+3CRVz7jred=*g8FJUdLFI{{dad^_q`n60QB;|@Ux?x7{v_s=`{n8FVh=3Jb#pP&_m+ z{xD0Fat5vUxB%Y2l&A{c1CW8_c9?rX>yng(9V+W<7{KFxirfxA6%I2_^frdni=aI} z51AR@X9+SgIQ(SdaQLa<%sBDaABf*H+@bX^6GMoCHKZ+a+Kq7vs6GL?qbW%ZY`+H< z`;o&7WaiU9|E6nz_Q$w7{ZvqftgD9l`2yI_3!&?-pni5>LG!DlI@m7VMusWZSr{(7 zR8pA;^Xm&Gm5IiT9H;B;7(RmLia~u!V`YY)50z9VDja5*`0MSz=^BR_Ce~+ZSa>op zh=A(RdM1w7CwLe_GWj6&YbG0LEc3%95rz+wYTO`ot2qOM2rLW}nHWM~Vff34aSF&h zc}52C9qj@x4r{^u1jd!}43IM(U}3iyG@c6$JCM1c^L3EJ?q>t({yB!^A5kR#c(5^q zoB^HD6Up%L1XIH$5yQ?|4bU?n+@XGg)$QOg3T9ae3L{Y6zVYq9>1NUlKkKv1EHs=M zC+@Ff1kZhg`~}KiLcR`bA$g5uB`BY5aAR1zzm9q3CO^it=65 zec$|>j_d5zfIpCS0;0Z!+y%zL&M-k_As2Yg1T<&W!Q`;>1osa!2C0Ti{Lpi=L1Q_= zOwc;;p$d4O5VVJ(l#5~KHCxEI31}SXumxnCnbnDLO8p}y%ldr`JL{VmE9<$KE$h=5 z!1wxq>Y2^j3_tfLGg|I%X0#0EV%V~^nb8tde|Xk{&odYFtc9FszCzpK=hnvzmMcJe zMwl8dy#~#}Gcasf;mkOZgMr~ECj-LOIanZOgX%F*z2))m{|C@K{$pl_RZAD6 zo)IS#&p2g)FvCvm|bk}VW>_~~TDI7NY#!F0i4hKa`i{!edUV%WJr+JPo> z;R~D@Cx-oi?Ck*U%>(Uu2gLy>>_PW)KiEEB>TmUNlrzmiI0g64@;=v`W5i?2OBms{1jnlxX=ix zYc?=FGy%`sfW~ys)-y~2)#)6zPCr3)D<~a<*2FFlX4vV#^ur9M2V6fjnu5#h1N973 zVDt0!0`fGax*NJb;y!3S5kGXjCA4h__7_wh<`1TY=HPy2Kh!MHz8Fxr`U)^ifvah> z0IO-MXP6?)&Tt{YNq?d=LqpIdbH*tNCgAlM7ep88f!AWJ5CZpOFZ^Vd)_TFfur<+1 zf1*O8?nHLbIb=||jQ{_)tkQE_xrWW*rw1#;MNUTUu8zvgA7YFRJB1%QtlYMlVdv(@ z+$%W~87A&eXZX27nRz0pFDJs#a0xW#0NR&q&&co-X2zCuhMyXa4wn0!nJrf&Gg~5? z$&kn}G4A{S>0o!UGF)6K1itHf>wZ3lpP;qrpu5&VYb#gqG5q8J-&LtUaf3M|U*A_^ zC|sb;5CTfqp!@5(m>MoUW0qKTScz*kNQ_C*aw13%=&q)x%)+alFpFt{(vVF(!<74S z422x33?VPAL3EQ(WZ2Ts#4vIHV+P9w(hNUy%^9aG&|m3j@3L1S95wIrbWY{g^f7`?Q^&jNGCDdLPj%ziUVYTagF zFx|%R!yN2JXxag(2d%r|XJin;<~Go}UJ-SMEhTDDw<$APE>LFp=>~F}Dud~EWk#^O zR;VDkim&j8hPmYb&y?CR2jB>QGwc(%xJklo8hOn zIpY)s6$aDo$q>6Vl#%Rm#$i{oqos#5gUJGIho9Gw?Sh^~0kTU(g<(sHGSsfcjFt{9K4^5421OQDoS%MFDD$ zGLz*3XNI45%owLUkO##R6F8n;$RXLo%!J(@Whd|&t_98xKOdMePN`;R2>dO;V2Ye> zni&{G#2FfbtQn!=XlWjlrav=_YfWeTVGb%6L1iR}##cUq;>4KwhuIeyhAkm7P=6#d zSuXHq__@lAaY}}f99$x?%j!DNBA!_T#5j8pU&7(_PnJNyK# z*Ss$UIa3;x@0k>J!RKax*4csbJ81t4Sp1+4_>6o|IeL_hVagXthAknIP`52+vRn|% z@Ut1@HVLTP7DL@8j^wsx9O1m!$+819KM?Hjvkkh|=Q57HBflU0H@*JoKi0gfz`!5^ zDZ{MbW!Ph8G4Q&3o;rppBCHHsrijAa%wP#>r-hj@PB|a~O6QPr<%BSU=?hT?i4MrU z=|92cOEYMlnh1QI8mO#TvDg9PW?_e)kx(};P-dR^Q_418{pX~93xI#}k3 zAHV*e4tC!`g!@2c>(g3>DH{L&i-X%(i&-b0{QH0UHhV~Uy$5P`B53ZgnPK9gzyGJN zhstd=W1Irk)66h&&)@&kSK7n)%oBI~{XcyvR2@Vw^Tf@6|4&~46cDyrGf!Od_y6>XP_gMSy@#16&ing+dN)ijGt0zTfB#Q!hpGeX zWoDT;_3!`bO;E88m|kXDa+ zdK6S0Snpw$i5Z~t)}Uh1FujLaCMNy;Kiwaumzi~9+~5Dxy`k#BdYM@#M*jUj-3=<{ z1JldQIx+a~|LG1ez0Rx?{r~=-ZUa>Z*6YkV(d+O3>E=)|TbN#F)`>2E|4%oxXPi>~ z|NsAW|Ns9#_5c6>r_j5)r5G3(te_Y%E{ED){96qf{{)ZG2{ZfzmtnR}KSApoklTcy zvIlf_5+^&u1?Ya=4NQ%oJ+F}cD^|4(u>C6=!24GY+D+Vg0J5(tnSnv1BNn_q1bkl8 zY#qiapmXKLVjVR*k`7sd&N~9FeZ9%TFhPQy;X;F$!%t8f6EtqeAqiQ72(n+8?uis$wOO3uXAo$u5gUVPvy;Ql zN6eyHptS%EYz{x?9Q;2WSl%?<}iP+ z`0?Ka)b9tm5j4ikbdUjjZUv~{^|S^YW)~P68Nq!KsG1E-j-Y+gkZ`{PQ^UwG5#%0F z*oPnZKOMAZYQ7t|5A*@Hj~KG9?eL19(hfhr!}k(H&KzH13h6(A${~h>N)uuICQ$kS zt%Larng?fQnCSHaG@i$J@hfyZZvz)J&4hyHNf=gv`c$B`rXar~r=JEnhMx=q3|l6% zGHe0W8yp99CUU4ctOT`nLF3*aJ&za~fWCr|MU}V4B#^kKzdKPF@pM<7dRpz`I!^3hj|0jLox8! zEhx=vfYLJ)g9K;}WhD#42PN=1E*x5*v3ig>W@zSaaRcvP*Z{gq7BmN=hbF%Ux@Lxt zfxQ7#2BN3uY0pv9Gia;=l%_%Z1Hj|?j0{^jK4F|0y1EndDyH+s&FbDO; zf3ZOF-Grb2r+;B)(4v()L3a>>^3^@4eI+!uuSAMrX9&{|b5Pn<#FBQwaf~f(Ix@l2 zW@9zOlqrl15-Z?mdWgW&<%H>|>75Un?m%e{G){wW9n05esOwk)xEX%_WM)_eN`Ihx zv$ybq%ghbp2X!WXjsl&-A@=$K3q#0M@YyONt4cxZT4WDcfcD^l_N)+dubag4f1t5O zlb6hB`sG0DVnj}Z##KRc>7e;~(0chKDb#!6I6(SAX9G7eP6X}sI{5p42#986X9xkG z1=Y+r@wg7-l+RWUEB);qemWR~&JyE$-N4Kc;%@EmGlz+BqFXcL#13AEpZ^sZK5{9v z&3ehqvkJBrr<2j)XE&$A&w57o*Pykjrx_Wx=;B$2bD9CN4hOWiv!03XHE2DK;@|%v zAhSX9+b>ulbK89mj8opRIs63gWmINg8Go3e5~Ln_b$P8Tlq6%TiIYq{x^MsTM&y!!_V%P#&e-tmw@bfkc!-Py{hKcd< z%q!!Y5p!V~&I}lHG{MpgKNFo9CW6j>p7{LVbkLc`pg9`QSqh-_3H3~zuR8?6=dWx6 z)%hpE>&-u05@q->N!S50M+3SCOg@s~<4LB5OQwb$vlc+-JGi0p$nzb+;mj*R_JQU* zN}vCm4w~x#or8_{e6nVSiDuvaP4{3%+$rtJ%rp@`&(j?LL%0!iR}3f4b8i0GGfn~N zuaASwsT8;|tOf07_3($xuYuBoOW^qpHF$|3;+M=9?cMUg5pCy1~MPz2@-Q#d1 zZViUG^#s(d*v@i3XwNt$KAv@DJTs%Ehde~@V@8G$&>7I6H8?x%8K-bFK>FAmj4Tu9 zGckN@7V4M<+RFwSFFeV@utCX@1w4*xP{lCi0keb_Xid)kr})?89Q+EII|B8qi77`H zKSe7?`Eit^in>%QM~^+FtQ_42(vPnkUCcPKR2y23Iy?LXt$PBMSKxBg9$JnrrhhpK z>Yu{P(Z%d5<1Z5~M>ke7Olgo~ka$i)ISM|v3`be&q6{e;k;~E_Oh3$n*&Tic3uBh0 zj}c`r`0QF(S^9`sY89v*1S((gm8CNnf0%*VxP;Ppc_qV?UiizAiO_nE=#1YvXOSj%a7XgR%@VWRr8f73y04bjVK4jkq5N;~}J^g^gSN;!QU zQBHF|`v)nf#TkC$EvFYVOg!`D-*gXUNcjgU`#|d}NhznN*fCB4>BlJhpldS0pNHoht@f$LaGOGEYjVobKZLKiy+7#GNSRG)Rodayk>_*2P%L>10S*3wCQb zq@0d}x)rqM5!5~duZ4uJbqu#-oDzSZb!EIVqb2CR36MNkuQ)`nKUA*+j&uEB<#OZ` z{N-}=7tC@Q`*|6=;q#C`nHg7YNM~8Olb_)yX#Nv4_hzrm2wvY~&&*&6UhgH$uv1AG za-ZZwL57frps~%v3=`v-5PMZ0sG#mu%}{}?3xmxSf$9oc&7XtnGtjt&h@!(v(Aogd zy3PeW3?ZO2BFyk%QU{;I&)>`<@V4P>CWoKsb-WTI$7x4L(73VWD&a5xrgv~b_Ec|A za$G6K$}o|GS^V^UCXUxDK;*uEa9kjoL?diYijO+{(|7V$5fc&-0mT?NGJq0R{ z|3CRR9p+Dv-0vq4zwTsW__>qc;pYlzho7Le=pcWsVqy3IijRk%L3f8ruKHVj6z81u zL1?-<$%sf-4T7lYibIgD>1qOK+yI=egc-p1f;{;7KLq3_kl#p6SGAuhPge_|VU3)w zK>LMor7I<9y1n0{UO*ncM6Q)HIfrRX41A5S!%om$?JX-EsxlcFLO^FfaPu@=TEPSwAK*Cc&3k%Q zy`#?SCI(P{p9j1@VDqQ{(?M%{!ES=C?SQ)pI{v+lh2euZJHrG9mLKMzeLo8qqplSM zo$LNk3Nl`QNJ$I4M^m|+0o=dXEbj2rn2})%NZ%u7(N&-_<;SQ0(>XxrqL@1U1eFn> zHr#%3hMyocpmp%zaee6gFKB%W$bFzR29gJj+k@@_=wM|qkzirius|3#A0Psm4}iM) z0WsgRn&5_(GPrN&)urUbEXX40y{Of-RwzYU5w__9kTYYQ= zVyquBP74~3!d_n^->1m9YC|~t%J0k!t9~#uY5inoUIj`gp!Ip`HjGn1dznCErJ%D# zplkFdfcAug#u7nm^s2cScD^-6tkJur2U(*hV?khz9zVlR(0;T1iy15@b2DrK-Fdcq zF@q&&PXuT!F9Rb(2(~qQo0%AX?pI>4+^xi53EC?RI@^|$oneB8qy9t%NBxPQ`ud?B z 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

    Ck+;5>r75l+1sp4&r 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

    cfsr93fz9D(hZln&V{P5!L))0A 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 W!Vh^aDT9gAhwHh#-Y zHs;FAWlWVBn^-KfcJW(gaxqtCu41ap*v4X+wU6I2laIMFa~)G<#x54itV8^knL^B! znVXm@Gxo7qW*y_V%oJm;%-qIQnQ@54GV2t-Wu_E!W#%rX%8X+ymRaZcEi>hqD>L^o zRc4%GvCO)}Z<(pYT$y=@sWRgni)Gd|e#=ZX=E}@tOqCgzSS+({@mpqUF;`}uVyeuz z#$uUukKZy&O4u^XNZ2wP1rKaPS`R_OV~2YN!T(=PuMcc zP1y1)1A_@CL&qggh6SHi)^W}bV_?_{n$I)gyf&-kAIr{v!VW(nXFnjuE0EI#sB8tT zL+nv=-3i*C06IgWQ;4Tq`(cRXYGwg5&8H!j8I1Bmnz9^Pol*>ys~H%~I-uoFhaH0@ zsNCs*mOC9*44}2_f?d9h6FD^*ggoBXT<%n2-Pzga^piWYF z$f{yChKp@K|4*O%|NmBy8$fMU(Na0%jv$?G(T5_IoocQ-yMi>k!=8#*c1&~n2{y}? zVPc1x>&|*c&evIrowGPV_PwpStd(i<10>!xjp--oOlvJo2B9uBNO^)S96)PaUxC-r zGYEM+WZ9|7!WgW{? z-76RvwrX-PTu=b5Q-$uKP-3W*V`yQ>eZb7IijkpG?(e_<(?M=SKC=qsF3`RtVFu7S zTufTVj0{_pWEg@$=LLc4va6Z@)OiVn)II;d8<4VweC(wP>OpFadp!IyscmGfK zU}uQAV#M(CDig!c6N?xpUI}CPdGZj`#1m``KSAg3fY!fWsbctf(vNXv?1TT)L1G6U z2~Lc906HIQLePCNrk`ilvF!wv%b@jtpf);a41=4MTMM*KT(g!jxaq<>VgNdi=I5qG8<6H^aOLjtu;pYh_ho7hFgf#Eh@vS^nC#`wH zjp65sG>4xj&6s|kDPq}qKaOSRi7e3Cq)9<1%2;-uP;>fu--zkwsVJ76C$yM;z7Ti# zi=M9K6_~FYgF&=Cay|#;anRjNpP89fePd=`1-Y9ClK&1c*bXEV^n-6T?K%y0I5+4nH^r9e!pqGHkKXW!PEI z$56OX%Vj5MuM_CpB~Vz)F)~a6&BZM^Brvg`fnf@G&yx^C;S?ptiQNDGhrD1G)8b$h z^IoCFf^|K8rhYiI?H0=go{Co`R4&cR}F|Dwja=&YcV^9g*a@ zSsZ>QcQUL@DX_OBviLl6^FLl8)wYk|~6&>8$Z8>A+J=1#jA z8FqRyGVIg<-SNQ6sRi2auUNwv-1Psy=}Jb1og6ZdJOE1j@-?h0IZc>;g7O0=!=xat z8ct0P1%{s-4h}!%|8TD4su9wZui;zC;ll8fBgNq-SB$r`52a+92uZIFd>Me zfMq9#iqlVd1E!x`5iC17G?;#Z`~oV6zH)=j+Buc0;S!e#=zJZ9A`SzGox!YKQMpVU z-n?uKCOiTTKZOk#cCsrlPV7{Kq#e-OJy6u;OWOeunTU)l03A%1i1k1WT0f(KZ zMWE~UBpi006acNugRa{HuW3T8%LA?bJH>do@~jTC=1Imwm8Ze!25n8A4rEQV?cN8fyQ(g8M~x7T|j%R8H8Rjb9m>lFbIO?_mf$j zz0R<5m~|>SXoAA%GqW&!4IU(ngrz@(lFtBig{O|qqe@I3hqcF1r!%hwZ&^ji} za6&K7KyBkpGsxYgUzwS-G+7x;GOR#ph^g=_XuXIXh|N%#VdSvWT(mRl5fg_uD9

    L(N@t3KIvn79&GYmL2H+Q_*bDe&P%>(D?)m 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

    J~WalWXYY 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

    J~WalWXYYAupK9@E25{+NU!71l_58A2g20 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

    wp2*Jh* zS0RmcI)K*osX6_uf{t~9%4AB%IWuKI_E%V}%(6t-&&bII8fOK$fl~VkjZ-qQH3U6m z0o4t{tM>i)KfQh%%g*{uEIUDC#Py&tVg?423^k{p*v4o(WIHd_YccH9{@Zb>UW(!8 zDkhHZ`bP|wE10;u>+KkJo@8ja^rpTcD4vmFrzR`IMfpOh3a^K36XiEbSnwE1?%>%d zxkLV=e1*KBoCVKDxg9))@;l@USu5n4 zOh9|Pf8y!Ks}R)5m?$!P&fJ32dh?7J?3%zx1i;dk0X)Nz2-YwX~30`o02 zY`ZS4=F|Mi36|He=x~6Db2@@(jU63eT60IID})d7Gp}3MC7zCkAdo*n{tA{d0k1^? z`K!~d>(Yz-=AboMx;wyp7mz;99UQJ*mpDB^Y>gfJvotMMYia(}0Ly7uaDr(~iw<{) zJf{bU*4)tnrZske?CkXEy2Mk^9K`F}b&2akGlt#50?OcU?ey)s1hV_Z{N^CA{oW9> zID9~~#tzN^5UpvU;oWs_z$%^5~Npi2M5#)&NwjN zLL;*4(&{?RpPXQM4U3K#h&X2~h}PKA0j4!~yku_(+MlJdgQEg0Zoy^Rb*W=n$EB57 zS{9)4G=qtw`vn)n&y@@fK^y`Lf?iHywEQ5%@E3GP&tj{rpZ1^sPY12Z{h95w@_Vx5 z%CGDWKR>g(fbWJJi|}Wc@rEjJ1(^|addNpcV2of&G2(36G!(9CeCh- zqn($22s8ZT?CZQV735A0hn=&TIJ>`cGyLTI(|PF`Gn3XdCeH3>%nYD)1cu-E8Gb4< zF@!u?;s_p>e7wNTvVn{!i!s(s8MgiN71f-wNV$b;9`@L40k8 zo&Q-G3_)fwEeDw;v5I*y#H^Kn{!eE-%rp_CcNthMLhm9F-x0x|_viogel4e+8rlv! zU$ROG$+I#TGO{p)JY<$!1=6p{#9-1qE7Gzl&TZ%9KmVsU&x^EFJj^t)DamaoNWKpw zHZ9UpF`02G5)=l^t&UXZ>95IdO>?8aIUTbTvS zuKM$TdOp-|pfjeDz~2eF}MvGcy1DpT1rT5?PR=_uqXgF?m?h0er`Ja(t=Y2-dUJizx^BEa-&iMI%x)Qi^nW_1S=S{{o}J3X*?kREmb5!tbTBZOfbQ-Et$Dxr<^S}pj~FIiV`B(3`~Tmx zbC=uBj%{u`zeYQ*{2}b{6SRJ_bD!JJu5D~PLF<+eGc$yAZiA%x4v_dJx1A5A9e#rP zy`a6#o!i)Uc5GtXc@$LNGei7$2+W4$t^Hs w>BY>1zBg4q!NZ2R$ldec6)oz2_a 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 ohJjGTqP6xH;9e)0w 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%0A(9OW$@DpU$dO1it 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 #@Ua|GG7pB1v^ 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

      v}S{y9khCbg9EhI9<-)|n;W#cgNFyS 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

      xu<=9tzwK}*Q%MyocT00ZO3 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

      q c #0056C4", -",q c #004AA7", -"'q c #02469E", -")q c #143F8D", -"!q c #000C34", -"~q c #636F83", -"{q c #E2E1E0", -"]q c #BEBDBC", -"^q c #1C1D20", -"/q c #0E4090", -"(q c #0046A1", -"_q c #004FB4", -":q c #004399", -"r c #15387E", -",r c #0E2146", -"'r c #031333", -")r c #696A70", -"!r c #D6D4D2", -"~r c #D1CFCB", -"{r c #717885", -"]r c #0B1B3D", -"^r c #0D214C", -"/r c #15377C", -"(r c #0C3886", -"_r c #003483", -":r c #003C99", -"s c #D0CFCD", -",s c #D7D5D1", -"'s c #A0A2A6", -")s c #273753", -"!s c #123882", -"~s c #032D72", -"{s c #0045B4", -"]s c #022E85", -"^s c #0047BA", -"/s c #053F9F", -"(s c #788292", -"_s c #C8C7C6", -":s c #0E43A0", -"t c #0042A6", -",t c #0E3F95", -"'t c #243553", -")t c #9EA0A2", -"!t c #BBBAB9", -"~t c #45423D", -"{t c #000019", -"]t c #0A1833", -"^t c #6B6B6B", -"/t c #B6B3AE", -"(t c #A5A6A6", -"_t c #505969", -":t c #000E35", -"u c #013D87", -",u c #013E8A", -"'u c #01397F", -")u c #013A81", -"!u c #014193", -"~u c #014497", -"{u c #013E8B", -"]u c #013A82", -"^u c #01479E", -"/u c #0149A4", -"(u c #0150B3", -"_u c #0154BD", -":u c #013D89", -"v c #C6C5C4", -",v c #0E4196", -"'v c #004099", -")v c #0046A6", -"!v c #004AB1", -"~v c #004BB1", -"{v c #004BB5", -"]v c #004EBB", -"^v c #0E4197", -"/v c #02173E", -"(v c #20304F", -"_v c #838387", -":v c #969694", -"w c #031840", -",w c #1E2E4D", -"'w c #7A7B7D", -")w c #8D8C8B", -"!w c #051C49", -"~w c #0C1B38", -"{w c #626467", -"]w c #A09E99", -"^w c #999A9A", -"/w c #B8B8B6", -"(w c #B3B3B0", -"_w c #485060", -":w c #001037", -"x c #6A6D72", -",x c #102040", -"'x c #133472", -")x c #1A3E88", -"!x c #012F7C", -"~x c #002460", -"{x c #00286C", -"]x c #002665", -"^x c #002767", -"/x c #002769", -"(x c #0A1449", -"_x c #0B1347", -":x c #00328F", -"y c #0148AA", -",y c #013C8C", -"'y c #013175", -")y c #013377", -"!y c #01357D", -"~y c #01377E", -"{y c #01357E", -"]y c #013378", -"^y c #0249A9", -"/y c #024DB3", -"(y c #01439B", -"_y c #024BAD", -":y c #013C8D", -"z c #023A81", -",z c #024398", -"'z c #0350B3", -")z c #0351B7", -"!z c #024295", -"~z c #0348A2", -"{z c #0247A2", -"]z c #0248A2", -"^z c #024BA8", -"/z c #03469D", -"(z c #074499", -"_z c #717B8E", -":z c #EEEEED", -"A c #747372", -",A c #707070", -"'A c #989692", -")A c #4C515D", -"!A c #143B88", -"~A c #03317F", -"{A c #061C5C", -"]A c #091752", -"^A c #002C7D", -"/A c #0048C1", -"(A c #0F3D90", -"_A c #BEC1C6", -":A c #E4E3E1", -"B c #0F254F", -",B c #A1A0A1", -"'B c #A6A39E", -")B c #64676E", -"!B c #0F1F3D", -"~B c #143574", -"{B c #032F7A", -"]B c #00286E", -"^B c #002563", -"/B c #022977", -"(B c #3B3B3B", -"_B c #0E0E3C", -":B c #081D5C", -"C c #0550B0", -",C c #0456BC", -"'C c #0450AE", -")C c #044EAC", -"!C c #04499F", -"~C c #044FAD", -"{C c #024EAD", -"]C c #0B1D3D", -"^C c #44516D", -"/C c #E9E7E4", -"(C c #D0D0CF", -"_C c #BCBCBB", -":C c #B9BABB", -"D c #6E6F71", -",D c #727375", -"'D c #727374", -")D c #757575", -"!D c #969595", -"~D c #828487", -"{D c #8B8D90", -"]D c #898A8C", -"^D c #868789", -"/D c #848587", -"(D c #858688", -"_D c #828385", -":D c #818284", -"E c #989796", -",E c #959493", -"'E c #9E9D9C", -")E c #969695", -"!E c #989897", -"~E c #A09F9E", -"{E c #9E9E9D", -"]E c #9A9A99", -"^E c #959594", -"/E c #9B9B9A", -"(E c #9C9B9A", -"_E c #949392", -":E c #939392", -"F c #103986", -",F c #000B35", -"'F c #566278", -")F c #CBCAC7", -"!F c #C9C7C6", -"~F c #C8C8C9", -"{F c #BBBCBD", -"]F c #A8AAAB", -"^F c #ADAFB1", -"/F c #A7A8AA", -"(F c #A1A3A6", -"_F c #94999B", -":F c #919698", -"G c #424242", -",G c #505050", -"'G c #5E5E5E", -")G c #6A6A6A", -"!G c #383838", -"~G c #A2A19D", -"{G c #3E434D", -"]G c #032B73", -"^G c #002A77", -"/G c #002567", -"(G c #00276D", -"_G c #002C7B", -":G c #00286F", -"H c #0549A0", -",H c #0651B1", -"'H c #084FAE", -")H c #47546E", -"!H c #B6B6B8", -"~H c #B6B8B7", -"{H c #ACADAF", -"]H c #A3A5A6", -"^H c #9EA1A2", -"/H c #9EA2A4", -"(H c #9C9FA2", -"_H c #979B9E", -":H c #9A9EA1", -"I c #00092C", -",I c #032F73", -"'I c #002C6C", -")I c #003075", -"!I c #002E74", -"~I c #002E72", -"{I c #00327B", -"]I c #003177", -"^I c #002F76", -"/I c #002D71", -"(I c #002A68", -"_I c #002864", -":I c #002D6F", -"J c #032768", -",J c #002D7F", -"'J c #09174F", -")J c #0D0F3F", -"!J c #090F3B", -"~J c #0D1043", -"{J c #041C59", -"]J c #01338A", -"^J c #14377B", -"/J c #253555", -"(J c #A0A4AA", -"_J c #BEBEBC", -":J c #AFAFB0", -"K c #B4B5B3", -",K c #9BA0A2", -"'K c #93979A", -")K c #909598", -"!K c #909698", -"~K c #92979C", -"{K c #B2B5B6", -"]K c #2A2A2A", -"^K c #A3A29E", -"/K c #053374", -"(K c #023172", -"_K c #033272", -":K c #03377F", -"L c #8D9398", -",L c #A9ACAE", -"'L c #B8B9BB", -")L c #414650", -"!L c #143B83", -"~L c #073375", -"{L c #04357A", -"]L c #053274", -"^L c #043170", -"/L c #05306F", -"(L c #05367B", -"_L c #053377", -":L c #05377E", -"M c #7B7A78", -",M c #7E7D7B", -"'M c #7C7B7A", -")M c #7B7B79", -"!M c #7F7E7D", -"~M c #7E7D7C", -"{M c #838280", -"]M c #898886", -"^M c #8B8A89", -"/M c #949492", -"(M c #9F9F9D", -"_M c #9B9A98", -":M c #9F9E9C", -"N c #676D78", -",N c #656C76", -"'N c #646A75", -")N c #656A76", -"!N c #606671", -"~N c #606570", -"{N c #626772", -"]N c #5E636F", -"^N c #5E6470", -"/N c #5C626D", -"(N c #5B606C", -"_N c #5B616C", -":N c #595E69", -"O c #122549", -",O c #0E2247", -"'O c #143880", -")O c #032561", -"!O c #00205B", -"~O c #00215D", -"{O c #001E54", -"]O c #00205C", -"^O c #052066", -"/O c #01246B", -"(O c #002D80", -"_O c #002C80", -":O c #002E83", -"P c #0B469A", -",P c #0A4597", -"'P c #0B4291", -")P c #194190", -"!P c #16397E", -"~P c #041F46", -"{P c #052553", -"]P c #072B5D", -"^P c #0A2665", -"/P c #093078", -"(P c #094394", -"_P c #0A4394", -":P c #0B4496", -"

      Q c #06244F", -",Q c #062759", -"'Q c #062452", -")Q c #062450", -"!Q c #062350", -"~Q c #05244E", -"{Q c #08245A", -"]Q c #0C154C", -"^Q c #020309", -"/Q c #0C3C89", -"(Q c #0E51B4", -"_Q c #08295D", -":Q c #07295A", -"R c #08295F", -",R c #082A61", -"'R c #08285C", -")R c #082554", -"!R c #0E4498", -"~R c #082C65", -"{R c #082657", -"]R c #072350", -"^R c #061E45", -"/R c #06204A", -"(R c #06234C", -"_R c #07234F", -":R c #05224A", -"S c #08224F", -",S c #07214A", -"'S c #06234B", -")S c #092457", -"!S c #0D1851", -"~S c #0A275E", -"{S c #092D62", -"]S c #0E4191", -"^S c #0A2B5E", -"/S c #072049", -"(S c #07214C", -"_S c #072148", -":S c #092759", -"T c #0B2656", -",T c #08214B", -"'T c #0B2858", -")T c #0A2555", -"!T c #0A2450", -"~T c #09224C", -"{T c #09224D", -"]T c #09244E", -"^T c #082652", -"/T c #0C215B", -"(T c #0D306E", -"_T c #071B3C", -":T c #061B3C", -"U c #0D2E65", -",U c #0C2A5B", -"'U c #0D3068", -")U c #0B2959", -"!U c #0B2857", -"~U c #0D2D62", -"{U c #0C2B5D", -"]U c #0B2A5C", -"^U c #0A224B", -"/U c #0B2653", -"(U c #0C2A5C", -"_U c #0B2756", -":U c #09224B", -"V c #0B2855", -",V c #0B2153", -"'V c #0E1F5C", -")V c #0D2C65", -"!V c #0E2F66", -"~V c #12387B", -"{V c #0D2656", -"]V c #0C2755", -"^V c #091D40", -"/V c #081937", -"(V c #0A2148", -"_V c #091E45", -":V c #0C2A5A", -"W c #02030B", -",W c #0C164B", -"'W c #0D2055", -")W c #0D2553", -"!W c #0C214B", -"~W c #0C1F48", -"{W c #0D234F", -"]W c #0C2049", -"^W c #0E2657", -"/W c #0B1C40", -"(W c #0C2048", -"_W c #091A3B", -":W c #0B1D44", -"X c #0C1E48", -",X c #0B1B3E", -"'X c #0F2552", -")X c #0E224D", -"!X c #0E224E", -"~X c #0A1A39", -"{X c #0A1939", -"]X c #091735", -"^X c #0A193A", -"/X c #0F2452", -"(X c #081633", -"_X c #0E214A", -":X c #13306D", -"Y c #0F224C", -",Y c #0D1C41", -"'Y c #0D1D40", -")Y c #0B1937", -"!Y c #0C1C41", -"~Y c #0F214F", -"{Y c #0E1E53", -"]Y c #0C1547", -"^Y c #0D1248", -"/Y c #0C1B4A", -"(Y c #0C1B42", -"_Y c #0E1F46", -":Y c #0F234D", -"Z c #0D174C", -",Z c #0C1046", -"'Z c #0D1648", -")Z c #0C1446", -"!Z c #0E1A4E", -"~Z c #0F1E4F", -"{Z c #0E1E4A", -"]Z c #0E1E46", -"^Z c #0E1F45", -"/Z c #0D1D3F", -"(Z c #0C1A39", -"_Z c #0F2148", -":Z c #0E1D3F", -" , ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) ! ~ { ", -" ] ^ / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ( _ % ", -" * : < + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * [ } ", -" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | 1 1 2 2 1 1 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 ", -" - + + + + + + + + + + + + + + + + + + + + + + + + + + 4 5 6 7 8 9 0 a b c d e f f g g f f e h c b a i j 8 7 k l m | + + + + + + + + + + + + + + + + + + + + + + + + + n ", -" o ] + + + + + + + + + + + + + + + + + + + + + | p q r s t u v w x y z A B C A A D D D E E E E D D D A A C F G H y I J K L M N O P Q R + + + + + + + + + + + + + + + + + + + + + * S ", -" ! * + + + + + + + + + + + + + + + + + + T U P V W X J x Y z D D z Z ` .Y Y ......................................Y .` Z z E D H y I +.@.#.$.%.&.*.| + + + + + + + + + + + + + + + + + + =. ", -" * + + + + + + + + + + + + + + + + + m -.%.;.>.,.Y Y '.Z ` .y Y ....................................................................Y Y .` Z Z y ..I ).!.~.{.].| + + + + + + + + + + + + + + + + [ . ", -" ^.+ + + + + + + + + + + + + + + + + l /.(.v '.z ` .Y Y Y ..............................................................................................Y Y y ` z _.w :.<.[.2 + + + + + + + + + + + + + + + + [ ", -" }.+ + + + + + + + + + + + + + + + |.j 1.2.A D ` ........................................................................................................................ .E 3...4.5.6.R + + + + + + + + + + + + + + + ^. ", -" % + + + + + + + + + + + + + + + 7.5.u 8.A A ` ..............................I ,.,.9.9.9.9.9.9.0.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.,.9.9.,.9.I .............................. .D G ..a.b.q | + + + + + + + + + + + + + + ^ ", -" 3 + + + + + + + + + + + + + | c.d.e.x Z D ` ..........................9.8.f.g.h.i.Z j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.r.I.J.K.l. .k.'.y L.M.f.f.,........................... .E z 9.K $.l R + + + + + + + + + + + + + . ", -" [ + + + + + + + + + + + + + N.O.c P.y ` '.Y ......................9.J Q.R.S.A T.U.V.W.X.Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+2.,.......................Y .Z y I g %.9++ + + + + + + + + + + + + < ", -" ] + + + + + + + + + + + + + &.O v _.Z Y ........................8.Q.0+a+b+c+d+e+f+g+h+^+i+,+j+k+l+m+n+!+o+p+l+l+q+l+r+@+n+s+t+u+v+.+w+x+y+%+i+j+j+z+A+B+^+A+C+D+E+F+G+H+I+e+J+K+L+7+Q.f.........................Y '.H +.$.M++ + + + + + + + + + + + + < ", -" N++ + + + + + + + + + + + + |.O+P+Q+Z ........................,.R.R+S+J.q.T+U+V+W+X+Y+Z+,+`+ @x+.@B++@k+@@`+#@$@r+t+k+v+%@&@*@,+!+x+u+=@=@-@A+;@>@p+!+@+n+x+'+,@n+x+'@)@-@!@~@{@]@^@/@(@_@:@<@[@8......................... .5+..}@7 + + + + + + + + + + + + + |@ ", -" o ^.+ + + + + + + + + + + + O.1@2@A Z ..................I ,.,.9.3@4@5@6@7@8@9@0@a@b@^+c@C+d@e@++]+#@f@i+h+!+`+g@h@B+i@;+)@>+u+j@)@k@A+>@(+l@m@=@n@o@B+*@W+A+p@l+q@)+n+^+r@s@F+t@k+k+u@v@w@Y+x@y@z@r.A@..9.9.,.9................... .A S.B@C@| + + + + + + + + + + + + =. ", -" D@+ + + + + + + + + + + 1 q E@F@H Z ..................8.g.G@j.H@I@J@K@o+L@M@++^+N@O@P@Q@R@S@T@n@s+U@V@W@X@Y@Z@`@ #.#o@+#@###$#%#j@-@&#%#u+*#W+A+s+S@=#o+-#A+N@;#>#%#]+,#'#*#A+A+)#*@r@F+=#$#!#W+~#{#W@]#^#/#2+ .Y (#f.I ................'.E y _#<.*.+ + + + + + + + + + + . ", -" + + + + + + + + + + + + q :#<#'. .................I [#}#|#1#2#3#4#T@5#6#7#V@7#'#8#9#0#a#Y@b#c# #O@d#$@e#f#g#L@h#.#%#W+'#i#j#$#r+k#.#4#l#.#q@##&#.#=#m#n#o#s+'#r+R@N@s+n@7#V@p#q#r#s#t+t#n@'#T@'#p#u#.#o+v#{@7#w#x#y#z#_.A#Q.,.................y ` y K B#T + + + + + + + + + + + C# ", -" & + + + + + + + + + + + M+D#6+Z Y ................I E#7+K.F#G#H#I#J#W+S@W+9#K#T@L#S@M#Y@Y@N@N#d@'#-@$@U@=#O#{#P#*@7#a#O#t+F+u#s#Q#R#$#L@S@S#T#U#V#d@$#@#p#$@W#X#.#.#b#Y#P#o#Z#=#,#S@T@S@,#7#r#w+i#`#W+)#a#d@ $.$S@'#o++$9#@$#$$$%$&$9...................'.H *$=$+ + + + + + + + + + + + ", -" + + + + + + + + + + + -$b.Y A ..................I [@;$>$,$'$)$!$'#`#~${$-#d#j#u#p#R@h#V@{#W#]$s+^$p#@#p#p#/$u#,#($O#h#_$j#d#:$Z#<$Q# #n@/$`###[$i#}$@#|$!#w#c#|$1$V@2$s+L@3$p#4$5$7#9#S@a#Z#q#u#W+`#k#6$V@d#s+P#V@7$/$W#d#+$8$9$0$a$b$c$d$9...................E z e k + + + + + + + + + + + = ", -" e$+ + + + + + + + + + *.0 P+A '...............I 8.f.S.f$g$h$i$j$k$@#p#u#l$}$m$n$<$<$o#o$p$q$9#2$o$r$/$6$s$t$u$v$w$^$x$y$z$A$^$B$C$<$9$D$:$/$E$F$}$@#G$($H$p#I$J$K$`#L$M$N$}$_$O$P$Q$:$Z#:$^$R$D$D$u$S$p#I$/$T$s$U$o#/$n$v$/$n@n$V$W$B$X$Y$Z$`$D f.f.,...............y D .. %].+ + + + + + + + + + [ ", -" ( + + + + + + + + + | =$v z z Y ............I [@h.D .%+%<$@%#%w$^$$%%%_$&%*%u$=%:$E$($_$S$r$ $<$S@n$D$q#-%e#;%u$s$>%h#2$/$V$n$O@>%R$/$I$,%d#u$;%'%F$)%!%N$~%{%n@<$V$Z#D$;%]%}$j#$%^%9#^$E$r$Z#Z#/$/%9$(%n$C$<$V@1$<$D$;%U$V$e#_%($P#:%D$o#<%[%M$}%|%1%0.d$,.Y ............Z z +.2%3%+ + + + + + + + + + 4% ", -" % + + + + + + + + + + 9+5%y '.Y ..............d$h.6%7%8%O$9%x$o$0%y$a%u$($I$b%]%j#p#I$^%d#L$s$($u$r$^%z$^$_%2$^%n$x$V$m$o$c%d%V$r$/$d#e%f%2$S#K$a%/$g%|$h%=%i%;%D$I$N$_%<$y$,%|$@#u#!#S#j%($U$r$u$q#2$r$z$9#r$k%1$y$|$($l%_%m%n%9#s$9$m$9#A$D$A$L$:%o%c%p%q%H@%$r%................'.'.u M++ + + + + + + + + + s% ", -" s%+ + + + + + + + + + r t%u%................8.8+E v%w%;%,%r$x%y%2$z%A%D$_%9$Q#B%|$C%/$B$d%{%o$N$d#M$D%r$w$E%F%G%y$H%z%1$($o${%V$<$p#I$o#I%{%P$E$J%K%p#/$|$S#;%/$n$z$x$ $N$[$(%9$d%2$,%u#|$s$/%s$9#_%y%p$L%d#Z#M%N$:$N%N$w$U$O%L$^$S@P%A$^$h#Q%p$R%S%>%U$_$d%T%U%V%W%}#[#................X%y Y%Z%+ + + + + + + + + + ", -" + + + + + + + + + + l :#`%X%................[#'. &.&i$+&N$@&#&0%$&]%s#m%:%^$(%F$k#d#%&<%f%&&o%p$V$^$*&u$=&-&O%O$V$2$N$/$;&u$>&9$r$/$)$f%,&W$9$+$s$u$E$'&C$1$E$)&P$!&[%;%D$1$u$~&A$D$1$z$D$P$!&&&z$n$w$O$o#_$($:$($p#6$)#V$Q%{&]&V$v$^&:%r$9$V$o${&m%o$-&n%O%/&~&(&_&:&<&K.[&9............... .A }&O.+ + + + + + + + + + |& ", -" 1&+ + + + + + + + + + r 2.D Y ............,.f.;$2&3&4&5&s$A$y$r$6&0%E$D%z$7&%&l%^$u$x%D%6&8&9&(%~&[%,%(%z$/$5&0&Q%[%V$a&a&(%j%$%b&c&Q%m%I%d&o%w$e&m%a&e&f&}$g&g%)&l%M$1$h&y$i&s$[%j&%%0%g&V$D%k&l&h&z$i&A$(%^%D%)&^$x%k&M%u$D%m&c&c%%&M$~&l%D%i&A$n&o&p&q&r&4&s&c&t&u&5&v&8&w&x&_.[@,...............D y&5.*.+ + + + + + + + + D@ ", -" } + + + + + + + + + z&c '.Z ............I (#%$A&B&C&D&r&E&l&F&h&%&k&G&w$D&o&~&i&l&v$H&(%I&J&K&L&n&i&M%M&J&D%D%v&N&n&D%O&~&P&Q%a&H&Q&F&K&T%E&R&C&r&~&i&6&6&s$S&)&H&%%9&T&U&D%u$9&V&i&h&a&W&%%v$k&X&e&a&l%f&Y&i&Z&`&M%P$ *.*+*V$%%%%h&@*Z&D%z$M&i&q&f&D%#*$*D&%*Z&p&&*&*Y&**=*f&-*;*>*2&,*[&9.............` z '*)*+ + + + + + + + + + ", -" + + + + + + + + + + q !*z Y ..........Y ,.8+~*{*]*^*/*K&(*K&t&.*k%%%(%)&4&s&M%@%e&o%~&[%o$e&%%R%C&a&M&l&_*c&c&K&:*A$~&_*o&t&<*K&~%n&M$~&9&l%9&[%[*}*l%0%@*-&m&F&%%M%M%+*H&9&|*1*q&@%s$2*%%_*0%M%3*4*~&R&(%_*_*9$A$g%+*,%x%0%5*D%6*h&h&u$D%M&G%]*l%i&o&i&7*Y&8*9*#&0*#&L&C&5&$*0*a*b*c*0*d*e*f*[@g*..........Y z 2@~.+ + + + + + + + + + ", -" + + + + + + + + + + h*y Z ..............[&0.i*j*[%k*0&l*+*m*n*o*p*q*p&r*s*t*n&u*v*q*w*q*x*K&q*q*9&y*z*A*g&x%I&B*c%q&C*D%D*=*I&Z&E*Y&F*l&C&s*G*H*p&I*q*r*9&J*E*_*y*n&w*K*L*7&q*]*M*D*P&C*N*O*g&h&P*Q*R*S*x*E&P&l&T*z$U*s*V*)&9&I&W*w*X*L*l*T*Y*E*L&E&I*B*Z*`* =.=+=u&0&D*@=m&Z&p&#=p*$=%=&=*===-=h.;=.............. ._. %N.+ + + + + + + + + >= ", -" + + + + + + + + + ].d H y I ..........I d$S+,='=)=!=~={=R*I*]=O&^=I*S*t*/=(=_=:=<=L*[=r*D*C*}=|=1=2=2=3=3=4=5=6=7=7*!=8=D*9=0=|=T&a=Z*.=b=]=c=d=[=7*s*H&'=e=}='=w*f=e&g=P*h=:=i=e&j=7*[=k=l=m=n=o=l=p=y*q=I&|=r=k=r*s=t=Q*<=q=u=+*+*j=I*K*v=w=+=q*I&C*B*a= = =x=y=!=D*z=M* =}*A==*B=h=]=Z*P* =C=D=E=F=G=8...............D v )*+ + + + + + + + + 1& ", -" H=+ + + + + + + + + 6 I=A Y ..........I f.Y J=K=L=a=y*L*q=M=N=.=U*q=q*^=f=C*[*}*t=j=j=h&d=W&U*w=O=P=Q=R=S=^=S*T=I&W&W*x=U=9&'=7*I*Z*D*0=Z*i=I*%*I*H&I&|=w*T&~=P*i=.=V=a=W*d=D*p&A=t*W=p=I&X=V*I&Q*k&V*E&M*7*E&O&Z*Y=W*d=Z=}=r=V*n=R*a=S*v=a=S*p=w=l&r*Z*'=}=C*I&N=`=s=Y&D* -9=Z*.-[*8=+-~= =z=Z*9= =@-#-$-%-|#f.9.............&-2@*-+ + + + + + + + + }. ", -" o + + + + + + + + + B#3@=-Y ........Y 8.d$--;- =>-.=s=,-I*p=@='-E&)-E&s=p*!-'=l&~-{-I*r*~-]-^-W&/-(-_-n=W&:-X=T=Z=a=)=0=+=@=a=P*.=P&<-M=t=b=T*T=[*g=S*I*E*[*}=w=I*C*.=i=w=Q*i=Z*W&R*[-z=D*}-Z=g=o=^-Z*q=)=Z*[=O&R*H&p*X*^-r*r=:-c=c=V*V*|-X=y*P&N*k&4=I&a=1-~=9=`=Z=0=E&P&P*2-.=[*3-M*4-5-Z*i=6-A=W=j=[*t=|*7-8-9-d$[@............z ` i | + + + + + + + + 0- ", -" |@+ + + + + + + + + a- .'.............Q.f*b-c->-d-z=e-W&N=}=z=.=w=q=I&~-}=f-g-q=I&v=h-i-j-^-k-I&1=4=+*l-R*a=[*I*{-i=[=I&m-6-p=Q*P*~=T*_*n-o-e&|=e&{=Q*l&w=Z&}=p-p*)='=~=q- =x=8=C*h&C*Q*P*q=q-P&B*Q*r-t=|=7*y*N*T*v=~-[-s-P&6*^-A*I*p=O=A*q={=Q*W&p=a=v=t-u-6*{-8=.=0=Z=T*2=A*v-L&w-x-`=y-M*'=C*M=N=`=!-V=D* =z-A-B-C-0.[&I ..........Y _. %T + + + + + + + + 0- ", -" D-+ + + + + + + + 3%;.H Y ............[&E-F-G-q-'= =P&f=H-w='=Z=P&P&}=m-|=C*3=I-I*^-J-q=c=4=r*K-C*Y&[=S*d=S*P&L-q=:-^=z=}=]=M-I*'=N-@=N-+*:=|=Z=P&Q*,-O-r=0=r=Q*Z*[=I&E* ='=]=E*@=M*|-r-P-Q-w=Q*S*'-R-'=N-w='=q=W&Q*q=:-z*q=a=k=l=O=g%S-4=p=R-X&4=H-Z*r*X*S*W*W*I*R*O=[*`=}=T-0=y*Z&/=}* =~=p*!=x=U-j=}=}= -V-m-'=z=6-W-X-Y-[&..............H u Z-+ + + + + + + + : ", -" @ + + + + + + + + z&1@A Y ............[#`- ;.;+;'={-{-j=u-i=z=w=@;#;L-U-$;%;q=&;X*g-*;=;-;;;>;,;^-';L-|-);{-h-!-!;)=P-B=z=~;{;[*];{;]=^;/=2-/;!;(;L=!-5-_;!-:;s-<;[;b=q=};~=];p-|;}=`=`=1;1;2;[;~=p-{;3;s-[=4;5;v-f=X*%;I*%;u=6;[=q=f=%;1=R*0=7;3=p=q=q=r=f=u-v-:;O=Z=%;~-!;P-r=8;h-C*M*R-(;];9;0;$;a;Z*z=N=b;b;w={;c;v-%;d;e;f;Q...............D g;h;+ + + + + + + + i; ", -" / + + + + + + + + p _#A Y ..........,.G=j;k;l;m;n;o;o-2;/;!-(;}-`=|;p;q;r;{;s;c=t;7=u;v;=;w;L=};x;};y;a;z;A;P-B;!;s-C;o;q;/;5;5-5;N=P-B=x;(;b;P-R-};D;!-r;E;F;:-,;v;3;F;(;(;G;L-F;H;;;B=W-];!;B;{;n;I;j-u-b=F;{;p-a;o-J;K;;;%;N*z;L;M;c=2;=;v-r-2=X*<;N;O;p-p-F;P;Q;u-}-R;3;;;{-~;@;3-1-p-S;T;U;w-b;a;F;H;V;b;a;-;n;0;a;v-O;s-W;X;Y;;$8...........Y D P.O.+ + + + + + + + i; ", -" D@+ + + + + + + + l K D Y ..........[@Z;`;x- > >o;.>5-5;a;+>~=;;j=o;n;a;a;}-f=v-L=W;@>#>N;{=T;{;{;x;};V-7-$>F;{-}-%>8;(;&>*>x;%>=>i=(;->>;;>}-0;>>/;{-D;B=r;!;P;!;,>t;'>x;x;B;)>j=1-s;:=L=x-,-J;h-)>n;[;3;@;O;->!>3=O;+-~>!;f=R;b=1;{>]>2=%;=;!-S-N*q=[=3;^>A;/>R-W;u-r-O;F;2;%;r--;(>_>R-i=B;:>1-a;<>z=v-[>.>7-~=}>%>|;/=x;~-}-2;s;|>1>y 2>I ..........z 3>=$+ + + + + + + + i; ", -" C#+ + + + + + + + 4>!*X%............d$c$5>q;6>:>x;->|;x;}>}>D;-;;>7>8>w-8;>>!-9>x;p;5;0>P;a;T;j-/;u--;=;.;a>r;=;O;~-b>@;0;c>d>w;p-L=(;d>R-e>f>g>%;h>~>i>d>d>x;/;@;<;3;A;!;j>->/;}-0>/;@;5;H;:>B;<;k>/;x;W;3;0;l>g>}-m>n>s;o>p>{;g-k>O;,>q>;;j-I;r>2;W;P;>;Q;s>;;c=t>[;X*c=u>v>~-O;Q;u>P;b>s;@;b>w>(;x>=;=;d>[>n;M=y>L=5;(;9>/;(;4;S;g-k>j-z>A>2>............y I /.+ + + + + + + + ) ", -" B>+ + + + + + + + 4>+.X%..........Y d$Y-C>D>7>E>F>G>g>G>H>I>f=J>K>n>L>M>N>9>O>7>V;9>H;P>Q>R>x;S>w;J>P;A;C;T>U>V>%;@;H>N>9>G>W>~>G>:>;><;X>Y>b>H;Z>J>e>/;n>`> ,n>e>/;.,p>+,N>@,H;g>w;D;Z>=;:>#,Z>$,%,&,*,H;.,=,H;R>J>J>-,r;;>;,%;>,O;*,0>g>R;I;]>u>,,p;n>',),!,~,S;l>J;W>w;{,],^,^>;;;;/,(,D;n;:>_,Z>X>[>:,<,[,},L>y>|,1,n>n>2,Q-+,{,3,S;-;1,4,5,6,7,g*.......... .Y %.+ + + + + + + + / ", -" H=+ + + + + + + + M+P.H ............[&V.8,9,&,|>0,n>n>|;:>a,5;w;b,K>V;c,c,`>D;P;{,}>:>&,d,9>e,f,.,1;j-g,J;@;9>$,h,i,R>X>/;;>;,j,k,l,m,h,O;G>n,9>9>V;b,%,o,~>>,e>;;p,b>q,},D;&,x>4;1,r,r;:>/;9>p>H>{,v-1,G>4;P;s,b>+,J>&,k,~>p>e>,,p,W>;,b,|>t,u,Q;A;N;J;X>:>;;v,w,h>n>b>R;j-',k>h>;,t,A;L;;>{;x,y,9>e>|>M>z,A,B,C,z,@,d,D,{,E,F,',C;R;I;h,n>e,b>G,H,I,J,I ..........Z X%%.+ + + + + + + + K, ", -" + + + + + + + + M+P.L,..........9.M,N,O,P,_,f,G>f>r;Q,L>j>y,d,H;2,R,p>N>>>S,}>4;T,Z>H;U,z,J>P>S;t;V>6;k>+,0>f>H;V,W,&,0,n>H;x>n>U>f>2,X,y,Y,D,G>a,Q,},Z,f>Z>1,&,P;j,Z>p>`, 'F;;;&,q,p>y,&,/;.'a,+'b>@;p>l>L;@'H;D;n>y,;>J>#'r;`>@'Q;k>e>~,Q;$'%'&'*'='-'y,p>S;;'>','''p>R>u>/;w;;>&,/,j-;>.,@;b>e,`,b,2,)'2,9>s,},}><,E>s,!'~'@,X>h>4;f,e>%'z;k>/,{']'^'R.,...........z Z B#+ + + + + + + + D- ", -" + + + + + + + + 4>w u%..........,./'('_'a,+'K>$'$'y,@,~>A,}>c,B,f>s,y>9>e>H>c,s,:'<'y,Z>['#'|>@;$'Q;>'}'R;|'u>b,&,u>4;c,@;$,0,B,D;$'!'1'X>N>Z>y,b,y,_,c,X>A,!'p>.,4;2'A,x>e>e>J>S;1,X>k,3'x;N>z,},@,o,G>N>V;W;4'e>n>5'6'p>b>0,D;],I;k>7'I;8'Q;X>;,;'@>h,W;h>X>q,s>9't;0'a'$'>,2;A;S;i,g-C;G>],&,b'1'c'~'d'y>e'+'@,b,},x,<,f'Z>@,b,k,A,Z>g'h';'i';'I;0'j'd,k'l'8...........Z Y /.+ + + + + + + + m' ", -" + + + + + + + + n'X Z ............o'p'q'S,r'I>/;Z>k>W,y,h,s'<'M>_,p;t'C,u's,v'f>w'2,a,2,r'G>;>1'}'J>X>/,4'/,p>Z>x'H>:,K>j'y'W;1,z'{,|>t'7>9>N>}>A'~'b>H;H;@;;>(,S;&,p>A'n>C;O;;>e>1,G>B'b>a,K>C'K>Z>@;&,f,9>j>/;P;@;J>$';>D'b>N>/,1'&,=,i,4;3,3,,,E'>'F'e,>,j'[>c,h>s>h>`>G'>,g>~>J>S;h>G'Z> ,E'S;$'<'H'+'I'J'K'Q,#,|,L'Q,M>x'f>+'K'L>2,1,M'N'~,O'E'G>I;W>J>k,P'i.8...........y I O.+ + + + + + + + ", -" + + + + + + + + Z-K Z ..........Q'}#R'S'T'#'e,J>q,1,;,U'>,G>V'W'X'@,@,z,w'K>R,R,q,X>2'x>w'y,Y'',t,q>N'f,S;Z'u,1,G>f'`'>,G> )b,+,|>.)X>q,K'&,1,+'2'K'+)G'f> ,@)#)t,G>X>1,!'U'$)`>%)&)#'@,G>D;n,@,a,N>Z,G>y,V,G>k,u'L'G'@)X>1,G>*)@'B'1,1'u>I;k,=)u,t,-)>,''v,}'`>@;b,X>{,],i,X>h,>,1'e>;) 'q, '>)7'X>,)')))+)K>Y,A'u's,A,L's,u'C'L'A'c,!)Z>k,$'~)h,{)*,.,.,$)G>C'])^)i.,...........'.x /)+ + + + + + + + ", -" : + + + + + + + N.B@D ..........I 7,`;()_):)X'@)<)e,1'X>[)&)@,}) '|)1)2)3)[)4) )5)C'#,G>R>6)a'e,7)R>8)',',#)+,4';)9)0)a)V,@)1'b)c)d)$,e)T,f)G'd)g)h)i)j)$)c)4)k)l)H>Y,m)$)m)H>b,b,n)X>4)o)X>X,@)>,>,p)$)n)&)U'U'X':)X'e, 'e,&,j,q)4'.)a'-)-)>,N'E's>r)s)t);)e,>)1'3,m)H>u)9>j)#)@'G' , 'v)$)j,w)I;n)))L'x)y)z)c)A)h)B)0)Y,h)A)))a)C)D)#'V,v)@).'e,l)1'],E)U'4)i)j)F)G)H)L.,...........u%P.I)+ + + + + + + + ", -" J)+ + + + + + + | }@A Y ........9.K)L)M)N)V,7> )b)1,@)X,U'O)P)X>Q)B,R)B)S)o)o)P)L>T)4)o) 'U'+,N'/,n)G'g,U)%'V)q)y,A,W)z)+'X)k)7'+,+'!'e,Y)Z)b)G>$)#,X)P)b,G>!'n)b) )+'V,U'e)$,`)X'X'#,X>m) !],.!+!@!%'-)6'#!R>@)u)$!U'%!w'$,.,',N'n)#)3,.,.!],@'@'u>H>&!s)>,q)I;~)=)3,@'*!=!-!G';! )7'H>X'<)>!-)>)9)1,+, 'A'P)b)L>i)X>+),!4)u)u)j)'!Q)C'k,n,j)e,C'4)o)C'>,e,w'w'G'>){,f))!!!~!8...........D X U + + + + + + + < ", -" + + + + + + + + s D Y ........9./'{!]!^!j) )n)/!(!U'q,D,})_!2'4):!})*!j)_!D,k,&)6!/!C'c!{,>!-)g,0!d!.)e!<)@'f!c!b)H>d)g)/![)d)R>8!*'e,m)~)g!m)<)''i,.!*'a'h!e,i!''=)=)j!k!n)%)c!X,{, )k,2)1,#!j)b)})1,{,/!$)m) )g)m!n!j)g)_!/!y,b)o!D,i)i)1, )e)m)p!j)~)q!e)}'r!s!t!u!%$,...........D E@2 + + + + + + + 4% ", -" + + + + + + + + v!_.Y ..........2>w!x!X'e,y!z!A!7!k!`)B!C!M!j!l)O!P!g)Q!n!l)z!N!N!n!>)R!S!T!U!6!X)6!V!n!e)}!G'2)W!H!D!X!A!Y!%!Z!`! ~.~ ~9!|!m)l)+~a'L!%)@~#~j)n!$~l)%~&~J!&)j!j!8!r)l)2!*~Y'R!=~J!-~>);~Q!>~r!,~e,k)%)*!b)Y!}!8!t!2)'~)~!~Q!~~9!{~]~]~^~V!j!Y!`)&)2)5)&)z!/~$)T)X!n!%!(~U!_~9!O!:~<~b)[~}~+~|~E!5)t!1~G=............_.;.+ + + + + + + + ", -" ) + + + + + + + 2~Y g*........Y [&3~4~5~L!U!}~}~`):)9!X!6~7~8~9~0~z!z!H!)%)9!:~f~a'*~w)~)g~h~|'s)<)d)q)d)t!N!i~K!:~>)D,e)#~`)z!}~;!q)Q!j~k~k~l~#~d)4)T)#~1!/!`)W)&)9!6)6)m)k~;!Z!r)m~6)d)1!`)6)%!d);! ~l);!2!q)e~E!}!V)3,`) ~L!~)>)f!n~o~S!d).!6)l)}!p~U!q~|!z!b~X'l)0~m):~r~z!g)H!s~t~G'e!2)v~w~/~+~N'x~G=g*.........._.y~+ + + + + + + + ", -" N++ + + + + + + l P+X%..........[&z~A~B~U!L!C~7~Q!2)O!a)D~H!E~p!o)S!H!3)5)k)5)F~4)<~G~k)1!o)<~u~O!7'N'E!m)j!&~4)H~I~}!9!s)J~n~;~K~L~M~N~2!Q!}!O!/~}!U!o~}!z!O~j~l~l)e)$~U!1!k~P~:).......... .'.7 + + + + + + + s% ", -" + + + + + + + T ${D ..........[#A %{&{Q!:~5!g!m)1!c~F~1)A!D)*{T))~={p~@~T)-{={H!;{H!>{O!E!)>)j~`)k~r~(~r)r)~)]{r)J!L!-)7)Q!J!L!>!N'^{d)r) !b)Y!%)j~l)k)<~0~`);{/{F!*!n)({_{1!6!:{<{[{)~p!}{/~$~G)r)~)2!E!;!2!A!]G~-~x{l)z{l{p~>{C~_~C~^{G{j~-]o~0~g!Q!G{,]j~(~'])]w~i~!]L{+]~]{]+~r)<~z!/~z{~];{p{]]p~o~Q{e~r{^]j~k~/];{}!P{]{~]y{(]Q!p{}~o~_]:]H [@........Y D b.+ + + + + + + 0- ", -" + + + + + + + <]2@` ..........d$[]}]o~L!M~E!V{n{|]/~&];{1]j{a{2]C!~~6{3]({F~R~4]+]@~Y{O{5]@~_~6]U!~]7]6{`~_~_~8]9]C~:~d{%]<~%~o~^{/~Z!_~o~E!0]Z!a]:~O{_~}~l{h{b]P{$]c]1!i~d]G~6{j{e]0~f]h{g]p{U!U!1!{~h{l{p~W~%~h]7~l{}~T~p{)]i]E{j],]p~Z{1!_~k]n{>]*]l]a]L~g{|{H!m]T~n]6)-]:~}]o]k~O{g]$]C~Y{l)j~p]W{G~l{q]o]o]L{A{`~r]s]t]b](~R~_~@]}~G~;!|{k~T~;{g!z{p{L!M~n]-~Z!;!u]U!&~A{P~ {a]~]h{}]^{v]w]x]y]l'............z z]+ + + + + + + A] ", -" + + + + + + + Z%B]_.I ........[@C]D]E]6)6]/]o~n]&]w~F]Y~G~p{}~_]G],]G~H]_]n{p]I]_]A{J]p]>]}~~]n{K]_~`{;{7~Z!6]R{M~L!!{){L]z{n]-~Q{M]k~k]}~c]h{Z!l{0~ {N]F{k~l{({c{}~T~c{J]j]0~O]w~F{({;{}~2!b]@]~]$]p{#]K]>]P]T~_~Q]J]}~U{_~Q{l]n{8{p{J]R]p{c{p{G{G{c]Z!;]L!Z!y{y{S]T]9{c]M~]{o~p{U]V]9{_]k]Q{q{b]o~K]+]N{y{%~!{%~R]D{N] ]w~~]t]n{@~;]W]%~i{$]o~X]G~Y]Q{R]Y{z{P{o~p{T!P{Y{V{D{D{_~Q{Z]/~w]%~h]n{-]E]%~`][#..........` ^l + + + + + + + ", -" ' + + + + + + + Y%.^..........(#--+^@^P{U{O{R~]]%~_{w~g]>]#^_]>]$^p~%^$^&^v~G~f]G{p]J]N]c{C~%~@]]]l{']D{*^r{n]Q{:~=^-^!{;^>^Q{v]o~i{O{%~,^O{'^&~:~i{_]O!&]}~~]h{K]k~Q]0~G{&]j])^]]N!p{&]c]_~}~h{6]G{,]i{J{a{0~I]T~e~%~k]k~h{g]V{o~o~!^%]G{/~T!p{p]G{Y{Q!U!%~R{-~,^~^*^i{o]c]a]{^z{Y{_~C~/]%~n]Z!Z!%~o]O{l{~]i{n{~]Z!O]B{p]]^$^o]V{ {K]n]:~g!:~l{p{-~O{T!T~j~;]U{l{k~/~U{R{q)+]^^y{&~%~'^/^l~R~o~,~l]E!(^_^w![&.........._.g R + + + + + + + ", -" + + + + + + + :^.. .......Y [@G@<^O{_~ ~%~P{;{<~K]6{>]o~Q!G{D{R]R~8{M{p~v~W{f]G~w~[^)]]]Q!%~}^C~~]1!,]:~|{-]V{_~V{a]/^*^|^S{-]Q{R{d{l]/^8]M~_~i{h{&]%~z{%]Y{ {x{N{T!p]F{j])]m]T~l{/~G{~];{+]1^p]p{@~h{/~2^i~p{T~~]3^!^+~}~*^r)U!6]<~:~;]n{#]T!Y{%~W~>]p{&~z{4^%~o~g!|{5^o~+~,~6^z{-~%^G{$]9{c]p{C~7^n{k~r{%~<~V{b]@]Z~8^W{`{[^n{%]D]r)&]n{d{o~9^o~r{>]w~h{o~'^}~1!0]T!~]0~0^P{*]z{Z!Q{5^7^T~l]a]/^M~]]!^a^b^6%[&........Y Z c^+ + + + + + + =. ", -" + + + + + + + 4 d^z ........,.e^f^b]b]g^l{V{N{Y{;{o~n]'^j]m]3]f]h^[^9^]]`{G{p{i^I]j{j^}~~]J]k^=]#]9^$]l]5^l]h{M~!{{^l^6]Z!S~*~^]m^n^o^p^q^r^!^l)A{m]m]&]j~i{i{%]<~Z{,]q]p{,]]]>]G{h^q]p{p{]],]9^B{I]~]$]A{']s^I]o]c]~]8]6]G{o~p{+]V{t^9]z{>]T!u^9]@]G{+]p{o]$]v^>]J{x{J!#^&]5^8]o~N{o~Z!h^w^_]x^&^']~]%]R{/]q]/~R~6{+]Y{T~#]!^~]y^p]R{,]F{h{~]z^7^;^y{h^A^,]*^B^6{T~Q{Q!N]C^D^~]$]O{{^#]h{p]r)E^R{&]g]>]O{}~F^G^/'[@........Z ..H^+ + + + + + + ", -" / + + + + + + + b.D Y ........I^J^K^L^7]#^M^N^i{p]N^Q{6]O^P^e]m]Q^R^S^T^U^p]V^W^X^Y^#]#]w]X{Z^V^`^i^*^*^l] /./R{8]+/@/#/$/%/#/r^&/*/p^V{=/v]n^-/U];/>/q]K]W{N^0]n{p{V^,/#^`^1^q]v^'/]]V^#]#^)/f]f]p{`^f]Y^h^#]!/~/{/,],]o]7^*^0]]/6]^/k]1^1^D^$]1^~]//;/B^M^>]'^n](/z^6]k],/#]&/>^*^_/*^@]{^1^7^;/w]!^:/'^z{=/]]1]j]//~]g^v^:/n^h^M^^{^'^x/X{y///B^q]'^z/V{M^X{V{o]#]Q{&/$]F{A/O^p{/]+/h{p]@]v^e]c]'/`^~]l]m/c]]/*^N^$]]]L{f]l{f]'/-~X]B/D^w/C/Q{l{R{r{;^0]6]c]Z^1^D/E/#{[@..........A j + + + + + + + F/ ", -" G/+ + + + + + 4 v H ..........,.H/I/V{n^8]k]W^>/X{*^'^j]J/e]!/K/R]#]v^z^#]V^L/]]V^M^M/z^3/Z^z^e]j^h]N/x{V{z{O/V{h]P/Q/./R/S/5^>^6/T/>^x{S{v]E]g^U/]/b]V/*^*^;/*^N/Y{N^)/M^;/g]D^#^h^`^W/B/T^e]z^#^F{V^`^V^v^,]V^;/v^v^M/Z^;/z^#]7^k]U/&//o]w]D^Y{f/#^Z/l{*^M^U/O{]/l{'^`/X{(/o//C/6]x{y{E]/]~]N{x{'^-/N{#^h]`^:/6]-/$];/>/Y/'^L{x^O^l^n^Q{`^>/V] /'/ (X{n]h].(j]7^Z/+(>/c]!^V^]/@(n]+/o^h]/]N^0]p{v^#($(%(,.........'.I l + + + + + + &( ", -" + + + + + + + *(H ........g*2>=(g^-(n^&/]/;(W^>(5/,('()(!(K/h/~(Z/o]'(Z^//D/{(](^(](/((([/_(:(M///]/'^<([(}(U/n^,/X/|(1(2(3(z/4(5(6(7(2/V]8(^/&/<(o/9(0(&/./.(^[/t(!(u(//$]g^v(^(A/;(@(t/:/[(^/w(n^O^x(y(Y^z($]A(`/u]Z^B(/'..........Z 1.+ + + + + + + = ", -" s%+ + + + + + &.x Y ........[#_.C(0//B^q(^/v]n^*/I(J(g(K(#/I(|(>^g(_/*/N{`/B^`/L(;/M(Y/.(.(v(N(Y/O(.(]/J/e(;(P([/.()/M/V^e(Q(.(V^R(J/S(l(e]>/T(;(X];(U(](o/+/7(x(U/;/v^+(U^j(V^f/#^V(Y^>^J(n^./N/W(_/V{g(X(N/.()/O(Y(Z(J(7^7^7^Z/<(x(;(,/0(`(j(N/]/Y/i(n(J/;(5^o^g^&/ _^/Z/)(/(O(f/._~/J/+_b(n/'^w/,(f/e]o/;^X/B^*^.()/7^o^+_@_B^s/#_f/;/d(D^$_^(%_&_Y ......Y S.*_+ + + + + + + ", -" + + + + + + + :#Z ........I =_-_;_>_n^X{D^=/*/x/M/^(u(K/,_k(Y(9/M^Z^}/M/L/3/J/Y^p(:(+(K/'_d(e]f/D^'^.(P/[()_A/!_ /~_o^8({_N{[(]_8]I(@(V{r(8(+/<(8( /g^:/f/;/('^.(U(g].(r/;/X{1/h/:/'^w/<(*^1/*/S{^X{<(`/(k(0(Y^Z^((U(^(3_Z^A(:/4_5_%$[#........'.@.N.+ + + + + + ' ", -" + + + + + + + /.S.y ........6_7_8_,(;(9_q]=/t/t/0_a_b_c_d_e_f_]/c(,_p(d(!(g_}_a_,_Q(k(h_i_:(j_T^.(Q(b_h(x/)_Q(X/N/./k_ /m(l_n^V]p^m_I(g^z( /y/P/n_g^*^o_v^p_|/>(1/]/ /|/;/U(v(7]q_((A/e_9/G(r_r/]()_Y^s/Z^K/s_((4/#_T(p(:(B^9/M/,_^(z^t_M(u_N/g^G(^(c(9/f_](M^r/](a(z(!_;/;/./v_,/X/^(w_^(x_g^N/V/V/N/g^U/X/./)_,/./w/M(M(|/f/b_9/4/y_M(f/./>^o^7]{_<(G(x(X/z_A_z(o_B_d(V^B^,/](Q(g^N/C_;(c()(G(>^=/D_Z^q_E_d(U(.(F_d(;/.(Y^!(0(G_G=9.........H a + + + + + + + ", -" + + + + + + 3%H_H ........[@|#$(I_s/s_K/.(>(7^w/.(s/!({(4/,_J_}_r/)_K_L_{(#_((!(d_W^M_g_N_Y^l(F_T^s/](,/j(O_!_P_>^[(N/[(8(6(Q_<(t/j/(/6/#/g({_R_ /G(z(>(a(N/[(M(z(0_N/i(w/N(;/f/;(T^c(V^](V^T^)_c(9/f/V^)((_S_3/Y^T_y_M/;()_c(U_y_f/K_}_^(V_D(K_<(Z/w_K_p(W_0(,/V/B^:/k(](^_o/U(|/(U/./!_{(d_K/,/Z_=/`_E^{^R_:/X/[(=/z(;/ :.:f/t/:x_J_,:F(____,_j_U(w/J/[/z(r([(N^v(^(i(P/[(Q_':):r(>(N/T/&/Y(V_Z_ /./!_B^D([(!:](B_N/(B^)_j(c(K_U(Z^r/U(O_b_l(K_K_F_y^s/J_](~:{:]:j_W^^:y_Z^((T(s/Y^)_^()_A/.(O_/:A/)/,_.(N^.(j()_j_z^|/p(;((:r(>(|/2_^(|/M(G(U(p(9(A/:/v(U(F_K_N^0_!:'(d_z(`_R_{^_:+/K(::Z_I(<:m_[:j(=/T/n^./}:|(::|:w(_/n^6(X/v]](9(2(1:2:3:&/:/#^D(p(4/A/x_3/h_4:c(g^B_r(5:6:R+,.........A b + + + + + + + ", -" ! + + + + + + N.w z ........,.7:8:9:z_X_x_0:P/i(a:b:c:d:U(p_A/K_B_`/d:e:B_f:g:h:j_2:,:>:T(i:W_i:j:p(<_e:k:0:0_l:m:n:o:p:q:r:s:t:u:v:w:x:y:z:A:B:C:D:E:z:y:m:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:Q:T:U:T:V:W:X:X:Y:Z:`: <.<+<@<#<$<%<&<*<=<-<,<'<.<)(W_sP;|>$,x>O;P;x>F;J>l>L/;b>n>Z>x>;>D;MN2'0,y,A,w'},OR)=![,Y>P>9>D;b,[,y,D;3'[,R<9>[,+)Q)[,Y)L>P<#'#'2'd,X>9>2'-,['`,[,u'C'B,3'b,W'b,y,z)D;;,P;[;p>Rb,9>n>@,L>M<-,L>y,n>(>2'g>e>n>`,2'N>/;N>u)B;2'Y,p>@;N>[;9>X)z,n>Z/p:S[,['[;[)[![;[![>[!['[-[-[,[>[~['[;[;[>[>[;[{[,[)[>[)[>['[;[;[-[>[;[-[>[>[;[>[;['[,[*[][*['['[;[^['[)[>[>[>['[*[*[;['[{[>[>[;[>[-[;[>[;[>['[^[>[=[-[/[(['[;[>['[;[{[;[)[*['[-[_[)[:['[)[)['[>[<[[[;[:[:[}[;[;[|[^[1[)[>[{[2[>[<[:[3[>[;[;[<[4[/['[![>['[*[5[;[{[|[;[)[6[;[![7[/[8[9[D{0[I}l[X[{[7[2[]}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}^}/}^}/[-[;[6[9[j^P[I_q}'}_}S<:}K[<}`-6_........` E@+ + + + + + + ", -" + + + + + + m J Z ........[}}}e:=}|}N:M[k[Y<1}2}q[3}1<9:4}s&{[x[;[;[;[;[;['[|[2[/[0}a}b}%+/+p+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+c}p+d}e};[v[f}!(g}h})}i:i}T[j}k}j}l}m}f:n}o}p}q}3>......%}0.k + + + + + + } ", -" + + + + + + + r}Z Y ......(#_.s}o}p[t}z<)}n}1}u}k})}v}v}M[w}B[s<@<'}x}@[{['[>[y}e@;+z}A}B}C}D}E}E}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}F}G}F}H}]};[v[I})/J}=}p:Z:G:X[7[1[+|#@@|#|C}$|E}%|&|*|*|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|-|=|;|>|;[6[,|__'|)|d[7} |6|@@7|8|&|&|*|=|C}9|B}#|0|a|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|c|C}C}&|C};|>|;[v[I})(d|T:)}e|S}f|g|d[`:<|:|h|.|y|^+A}F}*|C}C}C}C}#|z|A|B|C|D|E|F|G|H|H|I|J|J|H|H|H|F|F|K|K|F|K|F|F|G|G|F|F|G|L|H|L|H|H|I|I|I|J|M|I|H|J|M|I|H|J|J|J|M|M|M|N|N|N|O|O|P|P|P|P|Q|O|P|P|O|P|O|N|O|O|P|P|Q|P|O|P|P|O|M|M|O|N|N|N|M|O|N|N|N|N|O|N|N|N|O|N|N|O|P|N|N|N|N|N|N|O|N|N|N|N|N|M|M|N|N|M|N|M|N|M|M|M|M|N|O|O|O|N|O|N|N|N|N|M|M|N|Q|R|S|T|&|C};|>|;[v[U|U(U[[|Y}V|#1;[;[;['[2[,1'1)1!1C}C}C}C}~1{1]1^1/1(1_1:1<1[1}1|111213141516171819101a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1s1u1v1w1q1x1y1z1A1w1B1C1D1E1F1G1H1I1J1J1K1L1M1N1J1O1P1Q1R1O1Q1J1S1T1N1H1U1N1V1w1w1W1M1X1M1C1Y1Z1`1R1 2H1X1X1M1.2R1F1.2S1+2+2 2+2D1M1Y1R1+2+2O1E1w1@2M1#2$2%2&2X1B1*2B1$2#2O1G1=2D1O1`1+2V1M1w1-2M1;2>2,2'2&|C};|>|;[6[,|^()2Y| 3*3Z2Z2`2-3&3$3$3;3.3`2X2>3,3W2&3W2*3Y2Y2%3>3*3Y2%3-3#3+3 3Z2Z2%3Z2`2;3W2`2&3+3'3)3'2&|C};|>|;[v[I}z1;[;[;[7[+|>+03$|C}C}a3b3c3d3e3f3g3h3i3j3k3l3m3j3n3o3p3q3r3s3t3u3v3w3x3y3z3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z3`3l2 4l2.4+4+4m2l2@4V2#4*3n2@4>3=3,3-3*3$4@4X2V2%4&4*4n2@4@4&4=4V2P2-4+4.4m2O2t3;4t3>4;4>4>4.4m2,4-4t3'4'4)4t3!4!4P2 4.4l2+4'4t3;4-4!4%4m2%4.4.4%4-4+4-4P2,4.4&4'4O2+4+4+4O2%4,4@4%4m2~4{4]4'2&|C};|>|;[v[,|^4/433(48<'|;<<|U}22Z}_4'|:4<4[4}4|414R+I ........X%/)+ + + + + + H= ", -" 4%+ + + + + + %.H ........[@243444546474849404a4a4b4c4d4d4e4f4g4h432i4j4>.|;[;[;[>|l4m4%|=|C}C}n4o4p4q4r4s4t4u4v4w4x4x4y4y4z4n3A4B4C4D4+4!4E4F4G4G3H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4S3q3D4s3S3Z4`4 5s3s3t3 4P2'4+4-4%4O2,4.5+5=4=4S2=4@5=3,3#4@5.5X2>3n2@4,4*4'4*4S2$4&4+5@5!4 4P2'4l2!4!4.4)4#5;4!4-4#5-4'4-4&4&4;4>4'4.4 4>4%4.4l2%4l2'4+4-4.4-4%4%4+4O2 4.4'4&4P2O2O2l2-4m2%4%4O2&4@4'4-4=4$5{4]4'2&|C};|>|;[w[%5P(&5*5=5{2!|-5c4;5>5,5'5)5!5~5{5~5]5^5x~/5........` ;.+ + + + + + D- ", -" / + + + + + | #.` ......Y (5_5:5<5[5}5|515253545556575859505a5b5c5d5e5f5g5R,e}v[;[;[>|+|h5F}C}C}i5j5k5l5m5n5o5p5q5r5s5u4l3t5u5v5w5x5y5B4z5Z4A5B5C5D5E5F5G5y3H5I5J5K5L5M5H3N5O5P5Q5R5S5T5U5V5S3W5X5S3S3`4Y5Z5#5t3)4@4@4O2P2+4@4S2@4S2m2,4=3.5S2S2#4S2n2#4`5.5`5=4n2=4=4'4'4#4'4.4@4&4!4>4t3>4l2.4 4>4)4-4!4+4.4 4l2.4!4%4O2'4l2m2!4A5&4+5+4%4&4O2P2+4.4+4%4P2!4.4.4!4+4+4P2'4P2%4l2l2P2P2P2@4*4+4P2,4@5 6.6]4'2&|C};|>|;[}[+6@6#6$6%6|5&665*6=6-6;6>6,6'6)645!6~6{6]6^6I ......y P+/6+ + + + + + ", -" + + + + + + -...Y ......(6y _6:6<6[6}6|6162636465666768696062686a6b6c6d6e6f6v[;[;[7[&[g6)1C}C}C}A|h6i6j6k6l6m6m6n6r5v4u4o6p6y4q6r6j3y5s6r3X5A5t6u6v6w6x6y6z6A6B3B6C6D6E6F6G6H6I6J6N3K6L6M6N6q3O6k2V3A5B5l2+4t6!4P2+4-4@5-4P2%3V2S2&4O2'4+5.5@5=4%4@4#4.5n2#4n2'4+4m2,4@4S2=4m2,4S2P2'4 4>4%4+4.4;4t3m2'4;4>4;4l2%4%4)4;4,4-4!4%4.4,4@5*4-4m2m2m2.4%4-4l2m2%4 4>4!4%4-4,4*4,4P2.4-4&4,4P2+5@4.4&4$4m2*4P6Q6R6'2&|C};|>|;[S6T6U6V6W6X6Y6Z6`6d6 7.7+7@7#7$7a6%7&716Z6*7=7-7........y ;7+ + + + + + m' ", -" o + + + + + + 0 S.........>7,7'7)7!7~7{7]7^7/7(7^7_7:7<7(7[7}7(7|71727374757S6;[;[1[6777F}C}C}879707a7b7c7m6d7e7p5f7s5g7s5w4o6p6u5z4z4y5h7i7S3#5+4j7k7E5D6l7m7n7o7p7q7r7s7t7u7v7w7x7y7V4z7A7B7C7q3V3B5B5D7E7>4O2n2,4-4O2*4&4*4#4n2P2m2,4n2`5#4n2,4*4$4+5n2n2*4m2*4l2t3O2O2%4P2'4'4+4&4&4m2m2O2.4t3t3 4*4 4t3A5B5t3 4!4;4.4+4A5!4=4n2'4,4&4%4l2;4O2-4%4'4.4+4+4!4!4 4-4,4=4*4O2%4%4-4m2'4&4,4%4O2$4&4P2,4F7.6R6'2&|C};|>|;[S6G7H7I7^7J7K7_737L7M7N7:7O7P7Q7R7{7&7{7S7T7U7V7........Z u + + + + + + : ", -" + + + + + + + >.Z ......I W7X7Y7[7[7Z7`7O7]7 8.8Z7:617+837}717@8#8/7$8Z6%8&8;[;[^[>[*8%|C}C}87=8-8;8>8n6l6,8l6e7'8n6v4s5s5)8!8y4k3~8j3~8{8]8Z4)4)4^8/8(8_8G5n7:8<8[8}8O4|8182838k7485868788898D4B5D708a8b8D7l2+4'4@5+4%4+5$4@4,4O2%4 4P2+5$4&4*4&4#4$4#4'4O2O2m2O2%4t3>4m2!4%4.4O2t3%4!4,4'4>4>4%4>4t3+4;4>4>4.4)4l2!4>4t3!4.4m2=4%4t3,4%4l2!4 4+4!4P2m2+4.4l2%4!4-4.4m2S2'4+4-4'4m2,4P2+4*4*4P2&4@4P2@4$5c8d8'2&|C};|>|;[&8e8f8g8h8Q7i8<7j8&7<7)7K7K7~7k8^7R7Y7l8m8n8o8p8q8......` P+&.+ + + + + + ", -" + + + + + + r8x '.......s8t8u8]7v8w8j8x8y8z817K7A8v8B8C8D8<7~7E8+8}7.8F88[~[;[;[G8C+D}72C}C}H8I8)8J8K8f7m6L8M8l6n6m6'8n6s5s5)8)8k3z4q6j3N8O8P8Q8B5B5R8P4y6S8T8H4z6U8V8F3W82828X8Y8Z8`888 9.988Q8D7P2!4A5>4m2 4;4+4'4!4*4.5*4S2S2*4>4.4=4,4O2O2,4$4*4&4,4%4O2m2-4m2@4%4>4-4%4*4*4%4'4P2O2*4,4+4.4&4>4)4-4A5t3A5`4B5m2S2O2l2O2+4-4+4#5;4m2;4+4%4O2%4l2%4-4m2%4%4P2-4 4.4l2 4.4m2,4,4@4P2l2O2@4%4O2,4&4&4`5+9@9]4'2&|C};|>|;[S6#9$917^7g8+8M7:6)7:7%9&9*9~717(7Y7&9^7=9-9;9>9,9......Y S.'9+ + + + + + ", -" + + + + + + k|z ........s8)9~7`7!9~9Z7Q7l8{9Y7]9^9v8@8@8^7 8/9(9&7S7_9>&:9;[-[>|<9[9}9C}|91929)839w449q559,8L8'859m6m6p5r5r5u4)8o6k3u569A4i779S389.49909a9C3A6B6L4b9c9d9e9f9g9w7T5h9i9W5P8D4s3 4j9k9l9!4,4'4@4-4!4,4P2+5,4 4@5V2P2l2%4'4'4&4=4@4@5+4-4m2P2'4+4+4,4@4.4t3!4.4P2&4S2P2%4+4%4*4m2&4'4t6>4)4!4.4)4%4>4%4.4>4.4m2 4>4-4!4 4.4%4;4s3@4'4l2-4.4O2-4'4'4!4%4-4;4!4O2O2*4S2O2.4O2P2m2P2+4m2$4$4n2 6c8]4'2&|C};|>|;[&8m9n9$7o9^7k8k8[6|7+8 8v8v8~7)7x8l8g8{7:6p9q9r9d$I ......D f + + + + + + + ", -" + + + + + + 2 ${D ......,.0.s9t9u9O7v9w9v9:7x9K7.8y9(7y8z9{766i8h8A9$7B9C9;[;[4[67g6F}C}i5D9E9F9G9k3w4u4s5r5c7e7H9I9,8e7p5f7v4w4K8k3k369q6v5y5p3q3)4J9K9L9M9N9O9P9J5Q9w2Q4f9R9w7S9T9U9V9A7W9V5l2!4)4D7o2.4!4@4'4>4n2=4@4S2.4l2$4.5m2t3m2O2n2`5@4@5*4%4%4O2%4O2,4-4%4%4>4!4>4)4.4*4&4%4 4 4P2$4,4m2>4t3)4#5>4 4!4@4>4.4%4!4O2.4B5%4O2&4+4l2.4)4m2+4.4'4O2@4O2 4l2)4l2.4A5;4P2P2$4S2%4+4n2P2%4P2'4P2S2,4m2,4X9Y9]4'2&|C};|>|;[S6m9Z9`9 0.0{7|727`7J7I7L7_7_7{7+0[6`9:7O7M7A9@0#08.......j. 1&.+ + + + + + ", -" + + + + + + M+3>` ......[@.^$0%0&0*0=0-0;0>0,0'0)0!0~0{0]0^0/0(0)0_0:0;[~[;['[<0[0}0=||9|01020304050z4p6p6k3g7e7L8,8l6d7'8'8q5r5g7!8m3q6l369o3p3k2#5X348607080A3A3p790_800N5a0b0c0K678U3`4t6l2d0s3e0.4f0m2>4%4%4-4@5*4%4*4=3#4+5`5P2 4*4=4=4+5+4*4,4m2+4!4-4S2=4+4+4+4+4%4l2t6.4+5m2%4%4$4@5*4P2'4 4 4!4;4#5l2-4A5;4.4O2+4.4!4-4P2%4.4!4.4m2>4%4.4l2&4%4O2O2O2l2;4t3>4)4>4O2n2.5P2.4n2@4%4-4%4P2n2,4O2&4@5g0Y9]4'2&|C};|>|;[.|X[h0i0j0k0l0m0n0)0_0o0p0q0{0r0s0)0_0^0t0~0u0v0w0f.......Y D ~.+ + + + + + ", -" + + + + + + h*A Y ......f.L)x0y0z0A0B0C0D0E0F0E0G0H0I0J0K0L0M0N0O0P0x=![;[;[G88@C}039|Q0R0S0T0U0V0{8v5n3z4m3K8r5c7'8W0e7c759q5o5s549!8w4y4n3X0Y0Z0)4!4`018 a.a+aC3L4Q900Q4@aH6#a$aK6y7%at6B5 4&a*a 4+4n2%4!4'4&4O2$4+4.4`5X2n2$4=4,4O2P2P2@5P2%4P2m2!4.4.4+4&4=4%4.4m2+4-4l2A5!4.5&4,4&4*4@4,4S2@4'4!4P2%4;4t3;4!4>4.4l2t3%4-4O2'4 4.4;4%4-4>4.4!4m2P2%4+4+4O2O2+4!4+4 4+4'4P2P2*4m2+4-4.4m2O2+4m2O2'4*4=4X9=ad8'2&|C};|>|;[w[I}p|-a;a>a,aB0'aN0)aA0!a~a{a]a!a^a/a(a_a:a[k@%|C}C}kalamanaj2oapaqaX069l3t5p6g7f759n6f7'8c7v4r559q5)8x4t5r6pai7Z4b8ra18satauavawaxa|8yazaAaBaCaU4C7s3t6q3DaEaP2*4,4O2l2!4=4m2-4n2@4P2,3=3&4n2*4*4O2m2m2S2S2O2-4>4l2m2-4+4n2,4P2.4O2*4,4O2%4+4@4+4@4,4l2O2*4O2O2+4m2-4t3t3!4%4*4.4%4O2-4P2%4-4!4%4 4 4!4t3)4m2-4'4'4O2'4%4l2t3t3!4!4!4'4;4)4%4P2.4!4>4l2P2O2l2!4+4P2@4@4FaGa]4'2&|C};|>|;[>1y[42Ha6aIaJaKaLaMaNaOaPaQaRaSaTaUaVaVaWaXaLa2aYad$........Z Zac.+ + + + + [ ", -" [ + + + + + U `a` ......Y [& b.b+b@b#b$b%b&b*b=b-b;b>b,b'b)b!b~b{b]bc;w[;[;[{[^b&|C}C}/b(b_b:b4-4P2!4'4%4.4.4.4t3>4>4.4l2 4 4;4!4>4>4+4!4t3.4!4l2m2&4'4@4dbeb]4'2&|C};|>|;[fbgbhbibjbkb~blb,bmbnbobpbqb,brbsbmbtb{bobsbubvb]7wbI ......g*H q + + + + + s% ", -" &(+ + + + + =$&-........xbybzbAbBbCb_7[7<7J7y9DbEb$846$8`9i846K7FbGbHbv[;[,[-[m4&|C}=|IbJbKbLbY0MbC4k2Z0O8Nboay5x4q6u5s5n6p5f7l6W0H9'8s5!8)8)8l3paD4A5S3X438ObPbQbRbSbTbUbVbWbXbYbZb`bZ0z5`4)4*a'4O2A5m2=3=3X2@4=4O2,3=3n2'4t6m2n2.4O2@4m2%4%4+4t6#5B5#5>4l2P2*4'4+4P2%4%4P2@4&4P2l2$4!4+4&4'4P2-4m2n2'4P2'4.4+4>4#5l2O2m2*4&4m2m2t3#5#5 4%4+4l2>4%4>4l2.4B5%4*4%4t3.4 4B5%4.4s3 4B5l2O2+4t3t3!4-4&4'4-4,4O2 c.cd8'2&|C};|>|;[+cT6@cu9:7(7|7&7~7`9h8{7:7y8N7#cx8)7<7$c$7 8 8{7]9%c&c........S+*c+ + + + + + .1 ", -" .1+ + + + + + 0 A ........,9=c-c;c>ck8 8+8^7x8,c'c(9j8)c!c,ci8<7~cJ7{cv[;[;[|[b}*|72C}Q0]c^c/cs6k2D4z5j2r3D4O8NbX0r6v5k3u5s5f7L8(cL8e7c7o5)8g7o6l3[bi7D4;4_c7b:c4'4'4.4;4!4.4m2 4A5A5`4)4!4!4t6s3 4O2l2;4 4t3;4!4.4'4'4-4+48c9c0c'2&|C};|>|;[&8gbacK7&7bccc-9k8!9-9!9!9dcw8ec)cfcn8gcQ7hc!9Y7icjc6_........Z kc3%+ + + + + 3 ", -" 3 + + + + + 3%g Z ........lcmcncocx8}7~7ec&9h8pcqcgc^9(9qc)7+8)crcsctcS6;[;[:[ucvcC}|9wcxcyczcMbW5W5MbW5Z4S3C4k2Y0qa50n3v5!8'8I9L8H9e759'8c7u4l3u5x4oa#5cbAc7bp7BcQbCcDc|cEc7bk7FcGcQ3HcA5E7*a!4`4.4@5$4@5&4P2,4>3n2n2`5@4O2O2.4l2&4.4>4A5S3P8P8`4)4 4.4l2 4t3#4+5O2P2+4m2%4O2,4,4.4-4@4l2.4.4%4,4O2&4'4+4'4,4-4t3%4.4$4n2P2+4!4t3>4.4+4>4A5.4@4-4!4m2.4t3)4`4!4+4;4`4s3#5B5B5#5A5B5#5W9t6 4 4.4)4t6t3!4t3t3l2IcJcKc'2&|C};|>|;[&8gbLc<7>cMcNcOcPc-9n8PcQc!9)7#8]7hc`7`7x8Rcdc^7-bScTc8....... .x ].+ + + + + e$ ", -" Uc+ + + + + Vcx g*......f.wbWcXcqc(9Yc&7z8 8+8Zc 8 8`c d.dfc+d%937@dw[~[;[2[#d$dD}C}%d&d*d=d]8qa79O8z5C4q3q3q3q3s6O8B4h7z4u4K8'8,8W0e7H9l6c749!8!8t5h7k2D4P8Xb-dua;d a>d,d'd4cO3)d!dB5A5!4.4~d,4l2m2`5$4-4%4*4S2.5'4P2,4*4&4O2A5Q8)4Q8S3`4Z4;4 4;4>4-4%4.4-4O2@4P2+4@4n2O2P2,4%4A5>4+4%4t3;4-4&4@4.4-4P2%4m2m2l2'4P2 4+4t3%4&4-4m2A5>4D4%4!4t3.4t3A5B5A5t3)4S3>4A5P8t6;4W9t6Q8A5>4Z4S3D4Z4`4;4t3t3l2B5`4s3Q8t6{d]d^d'2&|C};|>|;[&8/d(dh8_dbc>cNchc:d|6d7dC}|98d9d0dad5050NbMbj2O8Z4P8D4P8r3P8W5]8~8o6w4K8p5m6e7H9p5c7o5u4q6x5w5qaW9O6yabdcdQbdd>dedfd4cU4gdZ4B5hdY3Q8;4'4O2S2S2,4n2n2*4=4@4l2A5)4!4m2t3r3W9+4t6A5l2B5t3-4,4l2!4+4l2!4+5@4>4-4O2m2.4&4@4.4-4%4+4+4+4l2-4O2,4!4!4m2,4*4*4P2V2&4l2!4+4+4;4-4!4+4.4;4+4)4l2 4`4t6A5#5q3B5A5S3P8W9#5B5Z4q3`4t6X5W9t6Q8Z4q3k2D4)4t3t6t6Q8D4q3id=a^d'2&|C};|>|;[x[U|jdv8{9Oc{9rc>cnckdq9n8^9v8l8&7ldmdndod#8)7z8)7pdqdrd........Z a-+ + + + + + sd ", -" td+ + + + + + V ` ........udvd.dwdqbxd%bydzdAdBdCdXcDd#brbkbzd*b}7EdFdw[;[GdHdA}IdC}JdKdLdMdNdw5r6h7p379O8P8s6S3P8W9D4z5]8X0[bu5p6v4'8W0d7e7d7f7)8p6u5z4Y0Q8O6ya-dOdQbx6PdQdRdBaSds3q3A5E7t3B5t3O2,4,4=4S2>3>3'4P2-4+4#5X5S3l2t3A5W9>4 4O2)4#5 4%4m2>4;4>4P2m2n2S2-4%4'4$4*4l2m2!4%4m2l2&4=4m2l2%4O2!4 4%4'4@4m2&4&4P2O2#5;4!4 4!4#5O2 4t3+4>4 4#5Q8A5A5q3Z4S3D4S3W9Z4S3k2X5s3q3W5r3t6`4Q8D4D4r3S3D4P8Q8t6B5t6S3Td@90c'2&|C};|>|;[S6UdVdpdWd-b%bXdYdZdub_d`d e)c.eqb+e@efc-b!b#e$eC8%e&e^60....... .*eG[+ + + + + B> ", -" 4%+ + + + + | e .......I =e-e;e>e,e'e)e!e~e{e8aXa]e^e/eUa(e_e:e4 4t3>4)4 4!4%4@5s3;4O2,4>4>4+4%4+4!4l2&4@4m2O2O2m2,4,4S2@5&4'4%4+4&4,4+4,4`5.4s3;4!4 4+4-4+4'4.4l2!4!4O2l2;4A5)4.4>4l2t6Q8s3t6-4>4S3W9s3S3P8r3P8W9D4C4S3Z4W9Z4W5D4X5P8W9S3k2s3z5r3W9D4X5Z4S3#5#5Ic0e^d'2&|C};|>|;[aebe|2cedeeefegehe]eiejekele_emeneoeJaaapePaqereseteueve[&......Y +.*.+ + + + + 3 ", -" |&+ + + + + *.wey ......d$xeyezeAeBeCeDeEeFeGeCeHeIeJeKeLeMeNeOePeQex[;['['[Re7dC}SeTeUeVez4w550r6y5paN8o33eMbz5z5s6O8r3z5Mbp3Nbx5q6w4c7d7m6WeXeYeZe`e`e f.f+f@f#f$f%f&f*f=fna-f;f>f,f'f)f!f~f8c!f{f+3+3$5F7]fIc^f/f(f_f:f:f|;[aeqfrfsftfufvfwfxfyfzfCeAfBfCfDfEfAeufFfGfHfvfIfIfJfKfLflc......Y ..I)+ + + + + + ", -" G/+ + + + + &.9.Y ......^6MfNfOfPfQfRfSfTfUfVfWfXfYfZfPf`f g.g+g@g#g~[;[Gd$g#|8|C}%g&g*g=g~8v5[b~8{8n3v5x5qaB4X0h7h7O8MbW5W5Z0p3Nbr6t5u5w4-g;g>g,g'g)g!g~g{g]g^g/g(g_g:g|;[aeSgTg gUgVgWgXgYgZg`g h.h+hVg@h#hYg$hSf%h&h*h`fPf=h-h;h>h......Y ..B#+ + + + + + ", -" + + + + + + /...Y ......,h'h)hJ7]9*9[6~7.8!h~7~h*9y817)h{h:6Z7A9]h&8;[;[<0^hF}C}C}H8/h(hA4r6v5[bw5~8m3[bv5[b[bj3y5h7Z0]8O8Z0z5s6p37979A4_h:h|;[&8#9ChDhl8Eh&9)7$8Fh1727~h|7g8g8.8k8A9 8y8&7Z7*9(7J7j8Gh&cI ...... .k|+ + + + + + Hh ", -" Ih+ + + + + + 0 y ......I JhKhLh^9k8YcY7%9k8Ncpc d{7Y7OcMhNhNc>ck8Ohv[;['[,[)+IdC}Q0PhQhRho3r650j3n3q6~8~8k3l3x4z4r6X050X03ei7Y0]8Z0W5Z0ShThUhVhJdJd{1{192WhXhIbD9YhYhYhWhD9XhIbIbZh`h i i i i i.i.i.i+i.i i i i i i i i i i i i i i i i.i i i i i i i i i.i i i i i i i i i i i i i i i i i i i`h`h`h`h i`hZhZh`hZhZhZhZhZhIb%g@i#i$i%iA5Z4W9s3W9q3X5Z4P8MbC4D4`4C4j2s6MbW5z5q3q3r3Z0Nbi7C4q3k2Mbs6W5W579k2k2z5S3&i*i^d'2&|C};|>|;[=iT6-im8Oc!9bcx8j8!9kdbcQ7Wd46h8)c_7~7icld~9bcQ7+8gc;i>i<#,i......Z f + + + + + + 'i ", -" td+ + + + + + W '.......(6F@)i!i!9bcocy8x8{9x8`7ic^9~i~irc+dbcrc{i]iv[;[/[&[^i*|C}D9/i(i_iqa{8oa[b50~8z4q6m3l3t5j3v5v5n3w5X0{8paZ0Q8s6:i|;[&8U|6iv8m8Ocbcx8bc7i8ihc+dYcj8fcpchcK7`7oc9iZ70igcRcaibicis8......Z Za1 + + + + + di ", -" B>+ + + + + + H_Z ......,ieifi~cv8LhYcZ7giDdz8hip9_d;cRcockdYcbciiji;[;[e}kiC}=|C}liminiP8MbO8h7Y0Y0w5v5~8x4k3r6x4y4l3w5w5q6n33eB4p3MboipiVhT|9|*|7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d&|C}C}C}C}C}qirisitiuiviabk2D4Z4P8z5q3W9W9X5i7Z0k2s6]8MbMbO8p3s6i7D4P8r3i7i7s6C4k2X5C4k2C4z5C4q3P8q3D4wixiyi'2&|C};|>|;[=iziAix9BibcA8!9 efc]7pcNh)cz8$eicx9j8hc~cZ7&7pdhcaiCiDiEiFi......` w p + + + + + & ", -" A]+ + + + + m GiZ ......HiIiJiKi:6ic#8hcrcMhDdhcfcw8Lincp9~i>c:6MiNi;[;[/[l@*|C}Oi10PiQiW9k2k2C4X5O8o350A4paN8x5z4m3j3n369v5j3z4z4{8h2RiSiTiC}*|C}Uik@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@k@q+Vi=|C}C}C}WiXiYiZi`i>4X5z5S3S3k2C4MbD4S3P8W5k2k2k2z5h7k2k2j2s6r3C4z5X5)4W5j2k2k2W5D4s3Z4k2Mbr3k2W9q3 j.j+j@jT|&|C};|>|;[fb#j$jn8!9Mc%j!9fc&j#eYc^7&j%9v8j8&7*j~c,cKii8z8p9=jLh-j;j>j......'.x O.+ + + + + + ", -" ( + + + + + ,jP+'.......Fi'j)j!j]9oc!9p9!9~917i8(7A8;i{9kdz9l8&9~j~[;[>[>[l+*|C}{j87]j^j#5)4>4s3W9P8r3r3X5Z0Nb3eo3pax5q6A4{8v5p6m3v5/j(j{1C}C}D}&+_jG8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G8G87[G8:j|;[fb7j8j`7#c9jv8@8)7v8S7Y7]7rcNcw8 8v8k8@8 8j8~7&7QcOc0jajbj[&......Y Y cj+ + + + + + ", -" + + + + + + /.I .......}3djejfjgjhjijjj*0kjljmjnjojpjqjmjqjrjsjc;v[;[>[>[77&|C}Q0tjujvj+4&4+4>4;4B5;4!4!4k2Z0X5W5O8h7i7oaA4v5t5u5wjf7xj82C}*|Ti0}e}>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[:[7[yj72!1C}T|[9.izjAjBjB5X5W9;4W9X5Z4Q8Q8W9k2z5z5X5Mbj2C4W5P8MbC4r3z5j2k2X5P8`4Q8D4)4t6X5k2S3Q8X5Q8S3s3CjDjEjFjJd|9C}Gj=|a}>|;[HjziIjJjKjpjLj_0MjrjNjOjPjQjkjjjRjOjSjTj_0UjVj]0WjXjYjZj`j0.,.....Y Z k+ + + + + + ", -" + + + + + + O y Y ....I W7.k+k@k#k$k%k&k*k=k#k-k;k>k,k'k)k!k~k'k{kae;[,[&[0|&|C}92]k^k/kS2n2,4O2l2m2P2+4!4A5t3;4Q8B5;4`4O8Y0B4A4y5(k_k:k[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[-[;[;[;[;[;[;[;[;[;[;[7[;[}k%|$|C}|k1k2k3k4k5kD4k2X5`4S3W9t6D4C4k2q3S3k2C4Q8r3W5r3MbMbD4Q8Mbk2q3P8r3r3X5D4#5>4s3t6q3X5Z4P8P86k7k8k9k0kaki5C}%|72bk^[>[;[ck |dkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAk)kBkCkS.8.......D c + + + + + + ", -" + + + + + + a z Y ....,.DkEkFkGk~kHkIkJkKkLk)kteAkMkNk'kOkPkQkRkSkw[;['[Tk'2*|C}IbUkVkWkS2n2,4#4.5V2&4!4P2O2O2%4m2%4.4t3`4S3#5P8Y0XkYkZk`kC}-|h+/[;[;[-[+c+cS6fb+c&8+c l l l&8+cw[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[-[.l:9+l@l>[;[;[;[;[;[;[2[+|#l$|*|C}$l%l&l*l=l-lr3W9s3Q8Z4W9;4B5`4X5r3W5q3Z4k2Z4S3C4Z0Mbz5k2P8X5S3q3W5q3t6W9Z4S3W9Z4q3S3Q8s3Q8;l>l,l'lUhSeC}C}E}Ti)l|[,[;[;[!l~l{l]l^lJk/lLk)kPk/luk(l_l:l[DlElvlFlGlw[;[;[;[;[]}kiHl!1C}C}|9IlJlKl`i)4Z4C4S3S3X5B5A5B5`4s3s3W9k2D4W9q3Z4Z4r3D4C4j2k2A5t6P8D4Z4P8S3A5t6S3t6W9q3`4)4LlMlNlOlPl19C}C}C}F}Qlm,m~iOcl8icccoc:d'mOc~i]9)mNc!m;[w[;[7[B+72=|C}~m{m]m^m&4n2+5O2'4O2@4&4l2@4$4+5.4Q8 4+4 4#5>4'4!4W3/m(m$d*|_m#g{[;[@l:mbc$cY7:6{h=9ccj8|717Ncldt{+l;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[w[[v[;[;[,[>||m1mvcC}C}|92m3m4m5m#5Z4t6s3P8C4s3#5)4t6S3s3`4X5Z4B5W9s3Q8Z4`4Z4MbC4#5`4Z4Z4q3S3P8S3#5q3s3S3;4#5s3#5a86m7m8mJd|9C}72F}9m&[0m;[;[;[w[ambmQ7<7&9OcA8q9n8[dy8]7Y7&7 d^9^9#8Wd~7WdOc9i!9~iococAbA8cm*mdm......z emfm+ + + + + 0- ", -" + + + + + | L E ......8.gmhmimubndjmq9hiecp9ndndbcxdimnd:d+d ekm,[;[;[7[lm$|=|C}8dmmnmP2@4+5,4 4%4,4+4.4m2P2t3-4>4`4&4+4W9t6!4Q8S3ompmqm$d&|rm+|{[;[=ism;cdc etm_dPcicicDdgi%j%jumfb;[;[;['[/['['['['['['['['['['['['['['['['['['['['['['['['['['['['['['['['[/[>[;[;[w[vmwmxmymfb;[;[;[/[1[i@{jE}C}T|zmAmBmCmDm#5`4t3A5`4t6`4k2Z4t6t6q3s3#5B5W9#5W9X5q3Q8Q8P8P8S3S3q3W9q3Z4k2X5q3z5s3W9s3A5W9`4EmFmGmHmImi5C}&|Gj&+5|2[;[;[;[x[#9Jmq9p9KmBi eAdCiccMhic%bNhz8Cd*j&jLm.d~c>cNhMh%jMmNm4)4-4%4`4l2'4O2#5S3)4B5`4A5P8D4Q8k2P8B5`m nql$d&|m4&[{[;[=i.n;c%j>cMc`d+dtmictm-9SmMh+n=i;[>[)[@n;||m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m|m;|#n'[;[w[$n%n&nx[;[;[;[7[-[>@&|$|C}|k*n=n-n;n>nA5S3)4>4t6A5)4s3q3W5r3W9Q8t6)4A5A5t6q3X5D4D4D4s3q3k2D4Z4Z4C4r3S3`4A5X5#5)4#5`4b8,nt7'n)n!nC}C}$|C}-+{[|[-[;[v[~n{n]nA8`dndPcXd^nKmtm*j eic*jYc~b)c.dLm/nXdAd%bgcMh(n_n:ncBiSm;j[@......` 8.M++ + + + + + ", -" ) + + + + + ].@.z ......8.[nldc`dZdndndib3nCi4n.l;[;[/[m4E}C}5n6n7n8n!4S3q3!4-4)4A5 4A5)4Z4q3>4B5Z4P8q3C4s6MbX5r39n0nql$d&|m4&[{[;[=i.nLhnd%jPcPc e)c*jobMhBitm.n+c;[e}&[an%|C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}*|$|bncn;[;[;[jiv[;[;[;[2[+|k@Gj*|C}|92mdnenfngn-4A5Q8X5Z4t6A5t6`4Q8;4k2A5;4>4#5#5t3A5W9W9X5D4#5s3D4D4Z4`4t6Q8k2X5Z4t3t3A5A5Da-lhninjnkaSeT|C}E}kn^hln/[;[;[v[&8mnnnx8;cMh>cYc!i3n@bPc`don^9cc#e.eWdec$egi~c,cpd:nnd~iKmq9pnLiqnCiU78.......'...6.+ + + + + + ", -" + + + + + + l J Z ......[@w0rnsnCi^nndZdLhLiNh%b>cndWm}dCiimndtnunvn;[,[*[wn%|C}.imixnynS3Q8-4 4 4t3>4S3Z4`4X5B5l2s3X5k2P8r3D4Z4s3A5-lzn(m$d&|m4&[{[;[fb.nCiim`d@bAntm!b*j~bDdecndBnfb;[e}&[Cnvc=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|&|%|bncn;[;[;[;[;[;[,[]}DnViEn=|C}|9}iFnGnHnm2)4.4l2B5B5#5t6s3!4#5#5P2&4l2;4t3B5#5>4)4S3Q8s3s3`4P8r3P8#5 4 4#5`4q3`4W9A5s34i3iInJnKnWhC}C}=|7dLnMnG8>[;[;[v[u[~jBi e%btm~c&jgi efc%b-9Km:dLhhi;bgi!c*j]bpchckbgcKm_dPcWmkdimSmimNnOn[@...... .S.z]+ + + + + + ", -" + + + + + + [.8.` ......[@PnjmQnRnLinc3nAnYd~cAn(n%jndSnVmTnpn{9Un=i;[{[6|Ql$|C}AmVnWnXns3t3>4>4%4!4;4Q8`4 4)4;4Z4;4`4X5D4Q8B5s3;4,4YnZn`n$d&|m4&[{[;[fb oonLiBifcAnBi~cCdpd+8Sm,m.o&8;[e}&[an%|C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}+oC}C}C}*|$|bncn;[;[;[;[;['[G8c@B}F}C}C}$l%g@o#o$o%o!4#5t6t3!4;4 4;4t6A5;4!4+4Y2X2+4l2.4 4!4B5`4t3>4t6`4P8D4r3D4>4.4t3S3A5W9W9V5A5&o*o=o-oJdi5C}72F};o+|>|;[;[;[v[][>ox8LhYc$e*j~cpnNh&9 e]7$e]bBiAn,onbim#ez8;b dMhKmec'oDdKmpnMh;iPcMcib)of.......Y z !o+ + + + + + ", -" + + + + + + k I ` ......d$~o{o]o^o/o(o_o:o4-4m2codo(m$d&|m4&[{[;[=ieofogohoiojokolomonooopohoeo=i;[e}&[an%|C}C}+o%dqo!n!nro!n!n!n!n!n!nqososoqoqoYmYmYmYmYmYmtotouoakT|C}*|$|bncn;[;[;[;[/[/[vo=|E}9|9|82Fjwoxodfyo%4-4#5)4.4)4)4!4!4l2>4)4Q8W9t3'4l2l2+4 4)4!4l2!4;4s3W9W9t6B5P8S3.4.4q3S3t6zo*aHnp,p'p)p8o;[|[!p#|$|C}8d~pm2{pl2O2,4O2-4+4&4>4!4&4+4%4'4#5)4)4;4A5;4'4l2 4]p^p`n$d&|m4&[{[;[8o/p(p_p:px[;[e}&[an%|C}Jd4p5p6p7p8p9p0papbpbpcpdpepfpgphpipjpkplpkpmpnpopppqprpspc|*|$|bncn;[;[;[|[)[@+*|-|9||9tp=nupvpwp>4 4 4)4l2.4l2 4t6Q8s3A5;4 4t6s3#5`4#5l2>4>4 4.4l2;4A5t3t6S3t6q3W9t6>4)4S3X5A708xpypzp8dJd|9C}$|Ap@@'[|[;[;[v[u[BpCpDpEpFpGpHp|pIpJpKpLpMp3pNpOpPpQpNpRpSpTpUp[pVpOpHpWp3pXpJp(pYpZp`p.p(pDp qf.........G j + + + + + + ", -" + + + + + + P y .......[@.q+q@q1o#q$q%q&q[oRo*q=q-q;qq,q'q)q8o;[7[|mB}&|C}!q~qwp{q$4@4S2,4+4S2+5O2l2'4&4!4+4;4`4S3;4 4>4>4)4#5]q^q`n$d&|m4&[{[;[Hj/q,q(q_q[>|hqiq!1*|C}|9jqkqlqmqnqoqt3#5#5,4*4!4 4t3#5Q8W9W9A5t6;4s3A5s3W9>4>4>4;4B5)4 4t3t6t3A5W9S3Q8X5s3B5S3r3Q8hnpqE9qq87|9=|F}rqsq:['[;[;[6[S6t*tquqRojololovqwqooxqyqVozqfoAqrg6E}=|C},r2m'r)r!r.4%4%4B5A5 4-4%4P2-4;4t3X5S3B5#5 4 4`4;4t6Q8t3 4t6s3;4!4 4;4)4!4>4t6t6Q8W9)4t3k2X3~r{rtoWhC}C}72]r^r/r>|>[;[;[~[x[(rpd-bzd_rvbqn:r%b*jXd|-[;[;[u[-[qr#8j8p9~c.eon[dpctmBiDdNhBiydR7WdhcNhAnC8Xcgi;b)c.dxd1n}dBipcDd.eDdLhp9`dtm;conp9rr8.........C Y%+ + + + + + ", -" + + + + + + B#X%y ......8.sr%jxdLi^n}dNmtr3nncWmUmRmpnWmnc}dRcur$n@l;[2[)lC}*|C}Wqvr2fwr,4n2V2n2%4m2S2&4%4-4-4!4%4m2 4s3#5s3s3s3t3'4Ml`q(m$d&|m4&[{[;[x[xr`dPcyrzrVmSmSm:rCi^n%becxr&8;[e}&[an%|C}wcArBrCrz4x4!8p6!84949q5r5r5s5g749!8!8y4m3x4x5{8w5y5r3DrEr7|*|$|^hFrz+C}vc9|C}GrHrIrJrid 4s3P8D4q3`4s3W9Q8Z4#5#5t3A5A5s3P8Z4t6D4q3s3s3s3)4#5t3)4`4A5A5#5Q8A5.4#5s3t3B5s35mLbKrBoWh|9C}*|$|Lr-[G8-[;[;[u[MrNr]7Cd e~cgcYc~cx8qb)bhiWd$eKikb dWdkb!bpdOr~cMckb.eMc;cMc`d_d*jrbqbYc{9ic#e>cTmononPr,.........C k|+ + + + + + ", -" + + + + + + C@_.Y ......8.Qrnd(nMcnd%j}d(nTm[dVmRrSrSqonimVm%jTrUr@l;[2[VrC}*|C}WrXrYrZr&4'4@4&4@4P2-4,4'4l2.4P2&4A5t6t6D4s3)4 4)4%4`rdo s$d&|m4&[{[;[fb o.s+s.btnRcMcib(n%jubMhonBnfb;[e}&[an%|C}wc@s#s$sw5n3~8j3l3!8K849v4r5s5r5r549g749!8y4k369q6~8]8%s&s7|*|*|`+j+-|GjC}*s=s2k-s;s>sX5D4C4C4D4D4X5P8q3`4W9S3s3#5B5q3W9q3`4q3q3X5Z4X5S3B5t6t6A5t6B5;4`4`4-4 4S3S3t6)4,s's)ska%d|9C}!1*|z+/[:[;[;[~[:9!s~s%9Wdzdpdpd-b!crb~cKm+dXdgcDdyd'oWd{s~izdKiBijm!i@rububp9Adrb]bDd)b]b%bWd,c ep9Sm@rub]s8.........C k|+ + + + + + ", -" + + + + + + B#X%y ......f.Qr;iWmndndibTnndTmnc%j.rim`dibtr4;4>4.4_s^p`n$d&|m4&[{[;[vn:smyr=9kslsmsw[;[2[#@C}*|C}8rnsospsl2>4*4'4P2*4-4 4'4&4'4 4>4>4!4.4>4#5l2-4P2'4qs^p s$d&|m4&[{[;[rssstsaidctsaj-cec]9Qckd=9w8us&8;[e}&[an%|C}wcvsws9np3Nbo3n3v5z4t5k3o6w4K8u4g7g7s5K849g7u4)8p6!8N8xsys7|C}C}72C}C},rzsAsBsCsDsEsh7h7]8p3i7O8i7i7MbW5X5P8z5k2D4P8W9X5r3D4r3p3O8j2k2X5S3S3Q8Q8`4S3W9>4q3W5P8i9;lFsGsHsIsC}C}C}F}b|8@G8;[;[;[&8>1JsD8KsLs`cMsZc(9Ks#8@8{9w8.0 eod#8 e&j`ci8^7/7 eech8Wdv8Z7ic(7%9`7l8Z7x9%946%9%9&j&9k8rcpcy8Ns,.........C Y%+ + + + + + ", -" + + + + + + z]6+ .......f.OsPsQsRsSs3rTsUsVlVsWsXsVsYsZs`s t.t+ty[>1;[2[)lC}*|C}8r@t chdB5)4A5'4P2O2n2P2+4O2-4-4%4O2'4.4>4.4%4m2%4 4#t/m`n$d&|m4&[{[;[fb$t%t&t*t*t=tvb-tilflRs;t>t,tck;[e}&[an%|C}wc't)t!tZ0qaN8y5[by5r6~869u5w4!8m3l3)849w4o6w4)8o6o6y5~t{t7|C}C}C}C}9|&r]t^t/tY4(tx5{8X03eoaB4B4Nb]8p3j2C4k2MbP8k2j2Z0z5C4z5s6i7r3W5O8C4q3q3S3S3D4q3s3B5P8q3X5Xnmq_t:tb3|9C}C}vc@||-[;[;[v[*[[t}tlb>b|t=b1t2t3t4t5t#m6tblhl7t3t8t9t0tatbtYlctdt@metftgthtit%ectdtjt8t7tctktftgtatltbtftmtctnt,.........F 0 + + + + + + ", -" + + + + + + 7 y .......[@otptqtNkrtstNk&kttut=kvtwtxt5lptytzt73At@l;[2[^h9|&|C}BtCtDtEts3Z4 4 4%4,4S2&4+4l2P2*4!4m2%4-4-4!4>4%4l2m2Zq/m`n$d&|m4&[{[;[FtGtHtItJtNkststrtIkKtLtMtIk6>8o;[e}&[an%|C}TeNterOtoaoapaX050x5y5w5n3k3l3l369w4o6u4u4u5y4u5o6)8[bPt3s7|C}C}C}[9+iQtRtStTt~8j3w5[b[b50X0x5X03ep3Nbp3W5MbY0Mbp3i7]8i7j2j2W5Mbi7Z0s6W5O8C4X5r3r3D4D4P8X5X5UtVtWtXtYt4sC}&|Ztl+;[2[;[;[;[=i`t$1Soja u.u+u@u#unk$u%u&u*u=u-u;umk>u,u'uyq)u$ukk!umk(l~u{u]u^u/u(u_uzk>utk~u$u:uu|u1u2uf.........F V + + + + + + ", -" + + + + + + 6.Y .......[@3uGkGk4u5ust@k5uqt)k$k6u7u8u5l5u9u0uaubucu;[G8ir$d&|C}dueufugu 4Z4A5;4>4P2l2-4>4l2+4%4l2%4-4>4 4s3#5m2m2l2hu/m`n$d&|m4&[{[;[Ftt'iuju4lkuGklumunuJk1lou~kpuck;[e}&[an%|C}19qurusu{8paoaB4o3A4[b{8A4v5~8q6u5t5m3w4)8o6y4u5)8u4A4tu3s7|C}|9uuvuwuxuyu69x4q6z4z4z4j33ex5v5x5paqaoapaY079B4h7]8]8Nbh7]8p3Mbs6]8p3]8p3i7O8W5k2k2z5j2zuC4AuBuCukaSei5C}E}*|j+([:[;[;[v[&8b*/4DuEuFu>uGuHuIu,uHu~u#kJuKuLuwk1lMu:lNuokukOu}uPuqkmk~uQu=uRu^uqk/l;ugkSu;uTukkIu:l'k4l_lukwkUuFuVu,.........G j + + + + + + ", -" + + + + + + q I ` ......f.WuXuYuZui0`u v.vXj+v@v#vKjMj$vlj%vMj&v)q8o;[7[|mB}&|C}*v=v-vgul2S3t6t6#5 4+4O2t3t3O2 4m2+4-4!4A5W9!4A5#5;v>v^q`n$d&|m4&[{[;[fb,vmj=0'v)v!vj0pj~v`lgj{v]v^vvn;[e}&[an%|C}/v(v_v:vw5X0NbB4h7pa[br6A450[bq6~8j369l3m3y4l3p6!8o6N84#5;4IvJv`n$d&|m4&[{[;[&8KvY7~9]9N7)mM7]9:6Oc=9m8q9Lv.l;[e}&[an%|C}Is(vMvAjx4v5y5o3oaX050x5o3{8x5j3j3z4v5n3~8t5k3y4l3u5{8Nv3sOv2mPvQvRvx4!8!8w4y4y4u5k3k3k369~8z4q6q6j3[by5X0{850X050X0paX0oaqah7NbY03epaqa79qaB4]8B4h7SvTvUvVvb3i5C}C}F}wnWvG8;[;[;[8v&8Xv|7J7R7/7)70iWd dYv0iqc&9pcZvKsD8/7L7)7[7o9b6gc{9i8`vJ727 wLsw8h8y8&9Z7!7i8&7{7`7Y7x9w8R7.w+wLs}7Yv[7)7@w,.......Y E #w+ + + + + + ", -" + + + + + + l J Z ......8.$w+0bckdTn;cndjmnc{9Oc>m!9{9Oconkdmd!9%w=i;[e}ki0|$|C}&wUk*w^jm2'4#5#5+4t3+4l2.4n2 4-4)4t3t3#5)4>4W9A5>4!4=w-wqm$d&|m4&[{[;[=ismon{9kd7ixd9ifcbckdMh=9.s;w.l;[e}&[an%|C}>w,w'w)w49w4x4w5y5A4paX0x5503e50{850y5A4v5z4x4j369p6A4Pt3s!w~w{w]w^ww4o6p6o6w4o6o6p6u5u5m3x4696969j3n369y5X0y5x550[by5{8{8qah7X03eX0paoa50pao3qah7/w(w_w:w|;[;[;[v[ji[w`7i8.d.d d/9Kigi]7Cdkb.dx8$eEbod}wE8Ddz8,cqcXcpchcgi'oMs37|wC8qcw8j8`v 8ZcDdonecCd&jgiic,c1wec`v2wWd#8,c3w,....... .y z]+ + + + + + ", -" 0-+ + + + + U 4wz ......f.5wm8:6v8aiCi>mAnw8>cNh~cn8[d^9v8,mock8&n&8;[/[#nh5%|C}ka6w7w8w%4)4l2+4P2@4 4!4-4,4+4#5l2-4.4B5;4m2;4S3Q89w0waw`n$d&|m4&[{[;[x[bwNcYcpndc,m;iYcbconYc!jcwLv.l;[e}&[an%|C}ridwewfwq5g7y4t5~8A4{850A4o33eo3NbB4y5y5r6y5w5y5z4m3pagwK|hwiwjwkww4p6p6o6p6p6)8o6k3p6w4p6y4m3m3x4t5m3m3q6j3v5v5r6y5[by550X0[bA4x5N850A4N8X0{83elwk3mwnwowi5C}03-|pwqwG8;[;[;[S6zirw:6Dd#8Ki.d!7Or^7+8%9kb@8Zcpcx8`v#8)70i&jkbz8.d!cz8hc,c2w|wXc0i0i`v]7kb#8]7gcgi`7odpcWd(9l8Oc{9]7Zc dpcWdXdsw,....... .Y P + + + + + + ", -" 1&+ + + + + m K z ......8.gm96icccdcq9Bioctw~ix8Mc,m[dbrA8Ocgc~9uw+c;['[*[wn%|C}vwwwxwyw=4%4@4.5%4&4,4>4l2l2)4B5m2$4m2t6B5;4j7W9V36kzwAwqm$d&|m4&[{[;[=i;wYcn8kdbc{9>c-9rcock8:6A8Bnfb;[e}&[an%|C}ridwBwCw'8o5K8p669j3w5y5A450pao3B43e50{8X0{8A4y5~8q6qaDwEwFwGwHwy4p6p6p6o6y4o6o6u5l3!8o6p6y4m3p6y4p6u5m3x4~8w5v5~8~8y5A4y5r6[by5{8x5y5r6x5r6IwJwKwLwkaMwC}C}IdC}Nwln|[;[;[~[u[OwPw^7ecpd`c%9%9]7Qw.dpd%9R7.dLm%9]7hc^7`v(9qcWd#8 d^9]9w8J7QwZcRwC8#8qcWd)cec)c)7g8i8%9Wd3dodonv8%jA8 8`c#8z8]7Sw,.......` 3>|.+ + + + + + ", -" + + + + + 1 B@E ......8.TwUw^9braibc e!9Z7giv8RcVwajVwbr{h`7-jWwck;[>[lnz}E}C}XwYwZw`wO2*4+5@5+4%4O2m2.4>4t3-4%4t6s3`4`4#5Q8 xX5s3.x+xql$d&|m4&[{[;[=i.n>cNc.0n8bc{9]9Nck8k8 eY7@x=i;[e}&[an%|C}#x$x%x&x,8'8g7v4w4t5v5r6y5oaqaqaqaX0X0NbY0N8x5r6w5w5{8d7*x=x69m3m3y4u5y4o6y4l369t5y4w4l3u5l3p6K8!8p6u5u5k3y5w569m3n3w5z4z4z4r6x5w5~8r6n3m3-x;x>x,xIl[9C}C}F}#|'x:[,[;[;[~[)xxr!x$8 d^70i~x{x#8}7|7#80i`7 8R7)7 dv8@8}7]xQw`vR7z8WdLi!9|7x8 8RwRw^x/xod!cz8l8h8`vJ7pcqc37]7#8v8p9Y7n8p9`v+8qc}7(x,.......Z +.l + + + + + + ", -" + + + + + + E@D ......,._x:xM7[;[;[v[gxhxo9o9(7{7|7b656&7w8@8^7I7Yv(7O7K756L7Z7(766B8B8I78646ix^737.817|7J7(7c6y9Ls27/7^7[7B8&9 866%7{h 866v9v9|78ix9jxB8kxlx,.......z 4wZ-+ + + + + * ", -" + + + + + + h D ......8.S.mx gYfnxoxpxqxrxsxtxuxvxwxxxyx-hzxAxBx*[-[;[7[l#8|=|C}8dCxDxExl2>3S2+4>4+4 4 4&4O2Q8S3t3#5A5B5cqX5Z4`4W9Fx nql$d&|z}&[{[;[>1GxHxIxJxnxKxLxMxNxOxPxQxo0};S6;[e}&[an%|C}Rx$xSxTxUxH9l6q5s5v4y4y4x4j3{8N8Nbi7h7h7B4h73e3eo3pa{8r6j3j3n3n3z4n3l3u5x4m3m3q6~869x4u5w4p6u5o6w4y4l3x4m3u5u5m3m3l3m3t5t5x4t569n3v5w5~8VxWx8mowi5C}*|EnXxYx>|;[;[;[v[qwZx`x ypx.y+yVf@h@y.yTf#y$y%y&yPf%y*y=y-yPfqxpxZgXg@y;yPf>yVf`g,ySfrx,y'y)y!y~y{y.y*y.y]y]y-y^y/y(yPf_ynxPf:y y1lymyny4yoypyqyrysyvftypk:ld'x[;[e}&[an%|C}#xuyvywyxyUxW0l6n649w4o6m3~8r6X0B4B4NbNbh7oaY0793eo3N8x5w5[bj3j3v5z469z4q6t569x4z4m3o6y4y4p6p6!8w4l3x4t5u5o6x4p6p6m3x4t5m3k3m3x469z4yyfwzy-oAyC}C}03By)+,[2[;[;[;[w[Cyk:DyEy(eFyGyPeHyIyIyJyKyLyMyNysyOyPyKyQyGyFfRySyTy5y5yMeryNyUyxfMeIfVyWyQyXyYyufZy`yGfFyZySapy zoyNyOy.z+z@zxf#z$zEe%z&zY 8.......D f + + + + + + ", -" + + + + + + *z'.Y ....9.,.=z-z;zhe>zqe,z'z)z!z~z{zqe2a]z^z/zge(zjiw[;[{[Vr9|*|C}ll_z:z#'K'ezfz:!gz2zgzW'hziz_!=!i~jzkzhelzmznzozpzqzrz_eszpetzuz!z!zXapevzwzre(ecaIaxzyzX%8.......D d + + + + + + ", -" + + + + + + %... .......>jzz2r$rAzqbKmBdlbpd,o@r+b%b+bBzCz*jLhDzf}v[;['[[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[e}&[an%|C}Rx$x;A>ANzNzNzNz,A(cd7s5v4v4p6t5m3v5A4o3pao3qaoaX0oapa50X0o3h7X0A4{8x5~8~8r6v5k3z4y5w5q6m3k3l3x4k3x4x4l3u5k3x4m3u5k3l3m3k3l3v5'A)Ak5uu*sC}C}F}Qld}G8Ni;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[S6!A~A^7ec)7ZvZcD8+8D8^7 8(9/7^7]7 dqcQc(7Q7y88iZ7R7^7]7{Af.......Y .v!+ + + + + + ", -" Uc+ + + + + fmOmZ ......s8]A^ADdl8+wQw`7,m=9Rc/An8pchc!9)c]7^9=j(A@l;[>[;[;o*|C}ak|9_A:AO2&4,4 4l2t3)4l2>4Q8W36x98q3P8V388k2[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[|[hqan%|C}ridw4A5Axy6A7A^t6AUxW0d759f749u4u5q6r6X0paX0X0oapaX0qaB4paoaqaoao350paX0x5j3j3v5z4w5n3q669n369t5t5q6k3l3t5t5m3k3k3x4l3k3l38A9A0AaAbAC}C}72GjiqYxcn>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[;[;[;[S6T6(d(7Xc.d.d0iqc 8<746D8)7%9^7D8)7.d&9z8Zc`c>caj)cececcA&c......'.x dA+ + + + + + ", -" n + + + + + + eAZ ......,ifAgABi`v!7Zc^7*bpcMh,m!j'm@*|C}SeiAjA{q,4n2,4t3t6>4.4l2)4#5A5P8k2.9.9P8kAO8Y4lAmAnAoApAqArA=|$|)+sA;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[e}&[an%|C}ridwtA5z7A7Axyxy6A7A6AI9l6p5r5)8m3k369y5N8x5x5o3o3paoaqa3eoaqaB43eo3X0{8y5A4A4v5n3j3n3~8j3z4~8~8q6t5t5x4t5x4m369m3t5m3z4uAvAwAxA1Ai5C}C}Apl+y|7[-[-[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[=iyAzAQ7z8(9%9+8^7z8]7 8v8@8pc@8#8+8Z7^7+8RwQwz8j80i,cK7AA&c......` +.&.+ + + + + + ", -" m'+ + + + + + M ` ......(6_xBAzd2wKsi8}7hc@8+8%9~9:dp9+#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l>+k@NA*|C}ridwBw5z7A7AxyM8Nz^txyM8H9'8q5!8u5l3t5q6~8r6r6A4X0X0qaB4Nb]87979NbqaN8N8X0{8j3r6r6r6j3[bw5~8v5~86969z469t5t569m3m3t5OAPAQARASAAyi5C}C}=|TA#l&+#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#l#lUi#lUA7[;[&8gbVA|7`7kb@8#8QwC8^7gc~70ihcic@8]7]7i8giod`cD8`v3dhcWAXAs8......Z @.3%+ + + + + ! ", -" YA+ + + + + + k| .......I s8ZA 8`v[7Ks37@8g8D8S7Z7P7+0]9l8`A B0j.Bvm;[;[{[kiApC}C}vw+B^j@B!4>4.4!4>4'4 4$A6xbbt6r3z5Z0q3#BLb$B%B&B3c*B=B-B;B>B=|=|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|&|*|=|C}C}ridw;gwy^t,AUx(cNz,ANzNzL8e7p5c7r5g7u5x4q6n3n3n3[b{8X0B4p3B4Y0]8h7X0X0o3x5x550x5y5j3r6y5A4[bv5w5n3v5z4z4q6t5x4t5z4,B'B)B!BYtC}C}C}C}C}C}C}72*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|En*|~B>|;[S6#9{BK7[6l8~7@866<7[6L7D837i8S7!9&9Q7R7g8D8 w}7]B^BLm/B#0,i......Z u + + + + + + (B ", -" + + + + + + ^|Y Y ......_B:BCd{b@r{b4l2!4vi4B;47xC4GcGzZ0zuGA5B6B7B8B9BH60BaBbBTiC}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}ricBvydB(c(c(c(c,A6A7AxyH9,8H9d7f7v4K8!8l3m3q6y5x5x5paY0]8]8Y0B4X0papaN8N8X0N8N8A4A43eoax5r6y5r6j3r6r6w5j3z4z4j3eBfBgBhB1kC}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}&|C};|>|;[&8#9iB~c$erbKi#egizseNaKatBuB;zvBwBxByBzBme]~>1;[>[,[n+%|C}!nABBB3f!4.4!4 4#5;4Y3CB6xX5Z3D4DBomEBlAFBGBk7v3HBIBJBE5KBK|LB82MwakMwakakakakQ0Q0Q0%d%d%dQ0Q0Q0Q0akMwMwMwSeMwIl$xMBNBL8UxNzNzNz6A7A7AL8I9I9m6q5r5s5s5!8u5v5N8r6A4A450oaB4oaqa]8qapa{8pa50qaoaX0X0[bA4N8r6[bx5r6{8{8[bw5r6w5X0OB0APBQBSeQ0Q0Q0Q0Q0Q0Q0Q0Q0akMwakakMwMwakakMwMwMwMwakakQ0Q0akMwQ0MwMwakQ0MwakakMwakakakakMwakQ0Q0Q0[9C}C}&|C};|>|;[>1RBSBTBUBVBWBXBYBuzYBZB`B C.C CpecaUBWBbareaamzszvz+C@C#C......Y Y ;7+ + + + + + (c ", -" ! + + + + + *.J y ......d$4@$C%C&C*CM0M0=C-C;C;C>C,C'C)C!C_a~C{Cg_>1;[;[2[ir]CC}C}R0^C/CO2;4t3B5Z4(Cb8S3W5_Cr3D4gd|;[v[,|T[OyiC)ajCkClCmCnCoCpCqCrCsCiCN0{atCpCoCuCvCd|wCxCyCJh......Y I )*+ + + + + + ", -" o + + + + + G[E@ .......I #}zCDoACBCpx=y'yCCXftx gDCKx+hUf>ytx~0EC7rw[;[7[DnFC&|C}kaYwGCHCB5t6B5`3FA6kZ4CBB5R3D4k2ICJCKCKCCaLCMCNCOCPCQC,dRCSCTCUCVCWCXCYCZC`C D.DBu+D@D#D$D%D&D*DKw=D-D;D>DBw,D'D59c7d7)DI9(cUx,AM8M8xyxyNzUx)Dd7p5q5)8r5g7t5q6x4v5[br6x5pao3o3X0pa3e3eoa3eB4paN8pa3epaX0X0X050x5{8x5A4[b[b!D~D{D]D]D^D*DFw^D/D(D/D(D_D(D:DKw|;[x[%59D(0:y0DaDVfbDcD0t&y`fdDeDfD.yaDgDhD@yaD=yiDjDkDlDmD[&......Y P+N.+ + + + + K, ", -" m'+ + + + + + nD` ........udoD[6/7b6|7pDA9h8qD+0rD$c@8`7[x)hzbP7P7sD)x;[![/[*8tDC}%duDvDwD#Bj7xDe0.9q3U3q3yD5cD4jyLbzDADBD9b8eHBCDDDBuEDFDGDHDIDHDJDKDLDMDNDODPDQDY4RDSDomTDUDVDWDXDfCYDZD`DxuZD Ec7e7W0I9)DUxUxI9(c,Axy,ANzNzM8L8e7'8o5u4)8p6t5q669q6v5A450N8o3{8pah7B4B4oa3eo3h73eo3X0o3o3X0pao350X0paA4.Ex5+E@E#E$EeCeCwj%ECr&E*E*E=E-E;E;EOz>E,E;E'E)E)EOz!E!EOz~E7q}A{E]E^E!EOz/E}AOz2e&E(E)E_E}A,E:E]E]E|;[S6!A1E2EFb[7273E[7:7{7Ls46]B4E]B wL7<796/9!75E66:7/96Ee^9....... .f R + + + + + .1 ", -" < + + + + + 2~z ........1d7EWAD8[xT7Z7@8y8:7~9rDK7l8:6Q7l8*9[6.78E9E;[;[^}VrE}=||9Wq0E#5aECBFAbEcEt6Q8X5O6Z4SdU58s:CJAdEX8eE8BfEgEhE7eSbiEjEkElEz3H4G5KDmEnEoEpEqErE|;[u[vEwE`9Lsqc$856(717J7xE wyE{x}7i8h8~7g8!7xE17<7 8[6zE>7........Z i + + + + + + > ", -" @ + + + + + AE3@g*......f.BECE^7rD27|7<7y8:6*9O72x+0x9_7+0l8pDDEEEFE=i;[|[+|^iE}C}GEHEIE,sJEj9t6KE>4bbjyLE=fMENE[A%BOEPEX8QERE6bSETEUEVEWEXEJ5YEZE`E F.F+F80@F#F$Fs6j21vr3p3N8v5k3w4w4o6)8s5q5c7d7e7,8)DI9,8H9L8I9Nz7AxyUxUx,A,AL8W0e7q5g7)8)8k3q6n3j3r6A4paX0{8qaoaoa]8i7i7i779qai7]8B4qaNbs6p3B4]8B4Nb79oaX0X0qaX0A4{8N8{8X0paN8x5v5y5A4z4q6z4z4l3t5v5t5t5j3w5x4~869t5x4u569l369t5k3m3q6q6z4x4y4k3q6p6u5l3u5%F&F*F'2&|C};|>|;[S6!A=F66:7/9i8^7i8/9]B4E/x37Ls]7^7+8.8Q7Ls4E.8~7Q7Fh-F-7........H O.+ + + + + + ", -" D@+ + + + + *.u Z ........&c;F&9:756L7@8l8P7&7+0{h17<7l8_7A9Y7A9Z6>F l;[;[]}y+F}=||9,F'F)F!Fcb>4bbS3~FV5D4W5{F6B]FOE9eRd^F/FfE(F@F_F:FOD<8.D|;[u[+6H7Y6/7B846 d(9C8}74ER7Q7i8^7Q7/x)746^B/9Zcb6DdSc#0,.......Y F@9++ + + + + / ", -" iF+ + + + + + jFD ........HikF46&9(70i)7y8Y7x9 8`7pc~7O7S7_7v8R7&7lFw[w[;[7[Dv$d-|C}!nmFnFoFt3cbW9Z4pFZ4Q8qFFBrFsF$FtFws5eWb'duFvFuFwFxFkEyF:8zF.aBcAFBF:8CFDFJBmA:Ci2Mbj2i7qaA4r669y4K8o5n6n6m6'859m659l6L8)DUxL8W0,AM8,ANz,A(c)D,8W0H9YAEF5FnB4F6FnBnB0FFF59p3GFdFHhcFbFfFfFbF{ HF49i7q3l64%0FaFHhcFIFHh$ eFqa79Nbs5> 6FfFHhcFfFbFJFnBm3j3l3fFtdnB0FHh0FnBnB$ )Dj3r6f7S 4FHh4FnB0FHhJFJF0FnBcFnBsdaFw4x4k3o6`eKFuE'2&|C};|>|;[u[G7LF]B!7Yv/7`vZc!7 wKs%9i8D8+8Qw5E`c.8Ls!7EbDb`vMF&c........Z u *.+ + + + + D@ ", -" &(+ + + + + 7 A ........(6SwNFL7.8xEOFP7P7A9PFO796K7O7$7a6<6QFRFSFTF&8;[;[|[uc%|C}2AllUFiyZ3r3A5j7 xC4VFK9WFXFYF]FZF`F G.G+G@G#GuFwF$GkE%GI4ZEG6AZ0k2`4,8S oaX5i7O8z5z5n6'ip6D450,G'GqaY0qaoaNbh7w47F)G3eI9m'e7[br6A4w550A4GFtd!8o3n6!Gs5A4k3v5z469nB4F~869q6n3Ux$ M8z4o6!8~G{GuE'2&|C};|>|;[u[m9]G^G/G(GxE$83Eb6c6Yv$8`6_G(G76:G_G`686X6[7 wI7=Nzf7n6s5g7K8w4m3l3q6~8r6w5[b{8N8B4B4; EF50P8Z0W9d7(BX0Z0]8s6h7C4n3o c7D4A4(Bd7r3h7h7o3qao3oaDGIFp3EG$ 69x5[bv5j3y5X0l6!Gg7pap5H[e7w5t5n3p6y46FnBm3p6m3n3g7- 7Al3u4x4FGGGHG'2&|C};|>|;[~[IGJGKGLGMGACLGNGOGPG4G4GQGRGSGTGAC4GUGVGWGXGYGZGfA,.......g*&-2~+ + + + + s% ", -" 0-+ + + + + | e A ........,.`G H.H+H!|@H#H$H%H&H*HY}=H-H;H>Hg4!2,H'H5|>1;[>[>[or&|C}C}ll)H;lZ4zoW9Mb!H~H@f6B{H]H/FWb|C^H/H(H_H:H z4j3x5j3r6j3N8W0(Bo63eq56Hp5r669x4q6696FnBz4l3k369v4'i,Aq6o6u5xo7HuE'2&|C};|>|;[w[ |8H9H0HaH@HbH!|cH@H=5dHeHcHfH{3 HgHhHiHj4jHkHlH[#........Z w Vc+ + + + + : ", -" + + + + + + V A ........,.mHnH~}q:]3#<[2w|^3`:3=M8C4qa3epao3qaX0DG; i76A$ l3N8{8r6y5y5N8d7(Bw43eo5~ r5x5y4v5v5z44F0Fw5l3u569s5- )Dj3m3t5FHKF|E'2&|C};|>|;[6[GHT(HHX:IH:|U}Y|fH&b1rLHAz_rMH8t&b,oNHOHPHQHRHSHTHUHBzVH;[;[;['[,[>+F}C}C}UhWHXHYHZH$azu`H%BmAyH I.I7b2CIB+IvF:FDF@Ibd#INDB3$IJ5%IvGJ4xGMD&ITE'd%BW5*IW5P8X5s6NboaA4~8l3x4p6o6u4v4s5s5c7'8e7d7,8l6I9UxNz^t6Axy,A7A6AI9# > 8Fd7n6xy>GtdEFJFEFxyz4m3q6z4v5x5; 7Fn3i7h7Y079Q8'8(Bo3C4i7i7Y0s6n3J)g7W950>=I9X5Nbqapa3eB450=IYAj26A$ t5A4[b[bN8v5o3d7H[)83eo56H'8r669j3~8n35FcFz4l3m3t5r5'iUxj3z4t5-I;I>I'2&|C};|>|;[u[+6,Iwd'I)I!I&blt~I4t{I_r=b]I&b!I2t^I/I(I_I:I$e '8B43eqaNbp3B5m6(BX0k2s6]8qaC4j3J)49W9N8H=H9D4B43eB4o3X0X0FF# X5^t$ j3pa50y5{8~879,8H[o6O8v4!Gn650n3q6~8j34F4Fn3l3w4z4r5- M8x5m3k3dIeIuE'2&|C};|>|;[:9fIgIYv{xo956.8Yv{x37o9hIhI:GxEb6iIxE37hI dLsjIkI,.......Z dm4>+ + + + + + ", -" 3 + + + + + + lIE ........s8mIQ7~7(7J7i8D846~hg817S7x9Cbm8 8x9~9~hJ7nIoI8v;[>[>|pIqI=|C}YmrIsI`iJCtIIA$BZHuI8Bws'dvI/HwIxI=)DW5qaB4h7o33e3e=IGFQ8,A>Gn3oay5oaA4[bh7d76Hz4i7r5~ s5p3~8n3x5w54FnBt5p6y4z4o5'i(c[bm3p6EIFIuE'2&|C};|>|;[GIHIIIc6Ls27o9xEKsE8KsLs wJI{x^B{xiIZc/9yE)c17oD9.I ......D g | + + + + + + ", -" + + + + + + dA2@'.......s8KILIO7{7(7J7_7Fb$8$8~717MIS7zbh8l8<7[6P7NIOIPI;[;[|[ji77F}C}4sQIRISITIzDIAOEUIVIXbWIXIYIZI`IVEVE@I JMD.JMDZE+JKDzG@J#J$J%J&JCD*JBaabom=Jr3C4MbMbY050r6m3u5p6!8w4!8)8g7o5c7'8m6m6W0I9H9H9UxM8)DM8,AM8H98F$ gFH9H9l6,8m6o5W0HF7Al3u469n3'GEFp6[bA4{8pa79i7D4e7(B[bj2Y0NbZ0W5k3J)K8s3X0H=)Dr3Nbh7B4B4Y0qaFFIhP8,AHFv5B4N83eN8N8]8596Hm37949~ v4B4v5q6~8p65F4Ft5l3l3~8K8'ixy[bw5v5-J}E;J'2&|C};|>|;[GIvE>J]B<7$8E8iIYvJI/7Lsy9 w{x/xB8L7i8~hLs37,J'J)J......Y X%r}+ + + + + + ", -" + + + + + + 1 !JZ ......I ~J{J^9K7Z617J7 8|7$8.8+0P7pD%796`9FbO7h8zb]J>&&8;[-[2[^J|k%|C}|9wc/J(J_J:JLC}CX8Xb8BGeFd7L8H9d7e7'8)DHF7Au5g7k3W0S W0x5v5[bX0o3pao3r3l6S r6Y0j2]8B4k2n3o v4`4A4S W0X5qa3eNbp3Z0i7=IYAZ4xy>Gpaqapa50{8X0P8v4J)u5z5p64%v4h7z4q6x4j3nBcFj3u5t5r6u4'iNzx5n3z4(h5J>I'2&|C};|>|;[:96J7Ja6L7y9/94EB83756{x5E]B[7[727D8g817278J9JTw(6......'.P.0J+ + + + + + ", -" D-+ + + + + + (. .........>7aJ.7%7<6Fbo9c6OFI7bJFbZ6qD`6kxWARFDi<627cJdJv[&8;[;[GdazGjeJC}[9vwfJgJhJiJxHjJkJXIEclJtGmJx3mJ}JnJ&IJ5yFKDwGG5T8xGoJJDWESbpJ'dPE!Hi7qJQ8S3W5p3h73e[b~8x4y4k3o6w4o6)84949r5n6'8p5,8,8H9I9I9M8(cUxM8W08F$ 8F59e7c7q5p5r5e7>GEG!8g7c7DGIFv5{8X03e3ep3i73eMbl6S o3P8C4Z0D4Q8k3rJ49W9N8>=,Aq3D4X5P8W9`4Nb{ YA`4I9>=50r3Z0Y0j2X5W9L86Hq6D4!8F/v4B4z4j3v5N8cF4Fj3w5~8t5v4- (cN8z4w5sJtJuJ'2&|C};|>|;[S6vJwJ(Gy9 wxJyJ]BLs]BB8b6c6/G(Gc656a636b6yJzJAJ........Z *$+ + + + + + < ", -" + + + + + + M+Y Y ......(6i.BJ&j(7.8`6{7Z7P7y8b6/7S766D8v8+0S7h8Y7`7P7CJ8o;[;[,[/[.+E}C}C}Oio4DJ3JEJFJ GGJ/HhE(FYIHJx3IJwF a<8sa6e[c$JKDPbJJ # g7r5; >GgF59d7n6p5f7q5s5A4Y0)D'io5g7c7w4u5495FFFA4r3O8UxH=p5t5!8o6l3w4EGHFg7r3q6m'cI!8u449)8p6n6>GNJo3Z0K8~ q5pay5r6{8{84F0FN8x5w5j3s5'iNzj3N8N8-IKF>I'2&|C};|>|;[S6T6OJyE!7PJQJ(9y9y9{x$8`6!7Yv}7c6g8}7`v~xRJEis8........y 2%+ + + + + + H= ", -" + + + + + + | _#x<......Y SJTJUJVJh0WJXJYJZJ`J K.K`J+K@K#K#K`J$K%K&K*K=Kbux[;[;[/[][iqF}9|C}Ap-o-K;K>K*J'dkJLJlJ[J,KaI'K)K!KWEjE}HG5:cH4JDuaOdK4~K a(H5e{KKC/878D4D4P8Mbi7B450j3m3k3q6l3K8u4u4g7g7v4f759d7e7l6W0H9H9l6W0M8)DW0e7^t6F> HF>G>G>G>G> HFMJg7)G$ tdHF(BS H[H[!G4%(Bw4z5Ux~ !G~ !GJ)rJrJ=I69C4O8W5oa)G!GN+rJrJrJB>EFo5p3i7j2s5FFB>J)4%J)n ~ # [b]8O8p6]Kl6paj3~8N8[b{ =Ir6m3m3z4q5o NzA4v5t5^K7HuE'2&|C};|>|;[![Ud/K(K_K_K:KI'2&|C};|>|;[![Udi{(}CKDK>(-(EKEK;(FKGK;(E(j(HK`(IKJKd:KKM,........` c + + + + + + . ", -" + + + + + + 9+9.Y ........o'LKMKNKOKPKQKRKSKTKUKVKWKXKYKZK`K L.LTK+L@L%K#L>1~[;[;[G8l4m4)172C}C}5vOi$L%L&L%BDD,d*L=LF5<8WEMD-L}HH4KD%J;L>Lm7:8V8wF,K,Lv3'Ls6gdr3Z4q3j2Z079paX0x5~8m3x4w449)849v4c7c7n6n6'8e7m659e7,8W0H9H9,8L8L8,8W0W0d7d7,8l659,8H9I9e7s5!8u4g7y4l3k3j3q6t5z4k3~8[b[bw5X0oaNbZ0W5Z0Y0]8j2C4k2s3s3`4S3P8z5k2j279B479P8X5Z0j2Z0q3k2s6s679qaN8y5h7X0o3y5x5paoaN8x5t5u5~8r650X0y4u5u4p67z)L>I'2&|C};|>|;[![!L~L{L]LH:^L^L/L(L_L:L$<|;[GI+6gLhLiLxJ^BjLjLB8c6I7.8a6374EJI{x/9]BkL&c........Z Za4 + + + + + i; ", -" |@+ + + + + + 2~H Y ........8.lL`6c6YvX6v9mL86a6^GnL4Lo916WAFhI766iI(7`6oLpLqLC9~[;[;[/[Yx;+E}&|9|C}C}JdrLsLtLuLvLwL/H}JV83HV8z3%JxLP99IxGA3JDyLHJcL5e{KeLj2zuP8W9Z4W5MbZ03e50N8r6x4k3k3w4K849v4v4o5p5f7o5n6f7p5e759m6d7d7W0W0L8)D)DM8(cH9,8,8H9L8)Dd7d7H9l6n6q5r5v4s5u4K8y4y4t5z4j3q6t5q6v5x5paNbY0W5C4P8O8s6C4i7p3Z0i7p379O8Q8s6i779B4C4Z0pao3O8O8Nbh7oay5oaN85079i7qa50y5[b~8y5qaX0z4z4x4t5~8r6q6zLALBL'2&|C};|>|;[:9#9CLDLxJPJyJELELKsY6`6jL[7`6xEFLNFb6GLkI9.........A c^+ + + + + + . ", -" s%+ + + + + HLu D ........,.ILEh66Y6Eh%7:Gb6$7a656[6kx27$8Y6:Ga6]BFb16WA'7I7JL:9;[;[;[1[([az9|IdC}C}C}C} i0kKLLLMLNLwFOLPLQLRL8Ib9jEwG)K8I[HSL#fRETLULGzW5VLXnna/cdqWLzwXLh2YL;s;sXD5qZL`L M3qYD.M+M@M#M$M.M.M%M&M$M*M=M=M-M;M>MRt,M*M-M'M)MdC!M~M-MCw-M{M&M$M]M^M`L M2q/MZL~E7q(MCm_M-r:M|;[GI+6lMmMPJnMoMpMqMrMJIxEyJjxy9iLjL]BYvsM8.........tM,.uM+ + + + + + ", -" & + + + + + + r c/Y ......8.'.vMa6hIYvFLo9wMxM^GYvyM56`6OFo916zMzMEhX636,JAMBMCM![~[;[;[/[>|Wvan$|&|=|C}C}Oi iDMWhEMFMGMHMIMJMKMLMMMNMOMPMQMRMSMTMUMVMWMXMYMZM`M N N.N+N@N#N$N%N&N*N=N-N;N>N,N'N)N)N'N!N~N{N!N]N^N/N(N_N:NNaN*N=NbNcNdNeNfNgNhNiNjNkNkNlNmNnNoNpNqNrNsNtNuNvNwNxNmNlNwNmNyNmNzNANBNANzNCNDNENwNFNhNGNHNGNINJNGN%N&NKNLNMNeNNNONPNQNRN8mT|&|C};|>|;[SN6JTNUNVNWNPJhLjLV6XNYNhIV6xJjLjLjxZNTwxb........G b.+ + + + + + &( ", -" + + + + + + m !*H ........I^`N_Gy9b6Y6FLY6nL|63E`616 O06_G%7FL#7%7I7X6kx66}666.O~[~[;[;[,[7[+OazA}&|vc*|C}C}C}%dIbwc}j{1Se4s@O7C#O0CmFmF#O#O$O#O%O#O9C$O&O#O&O&O9C9C*O$O=O#O9C0C#O0C#O7C7C7C7C#O7C%O#O0C%O-O#O0C@O0C%O@O0C%O%O%O@O@O%O@O%O%O%O@O@O;O-O%O%O0C0C0C%O7C0C0C#O0C9C7C9C=O=O9C9C$O9C9C#O#O9C9C$O9C$O9C=O$O9C&O#O#O&O=O>O#O$O$O#O9C&O&O=O9C9C9C&O$O9C&O9C9C9C$O&O*O0C#O&O9C9C9C9C&O$O$O0C,O`kC}&|C};|>|;[SN'O)O!OYN~O!O{O{OUN]OhL~xV6jLNFjx!7^O0.I ......` Y |.+ + + + + + ", -" + + + + + + + a z Y ......,i$w/OB8^GwM O|6FLoL(O3LFLwM_O}6^GNF:O,J}6RJ:O:OnLwM|;[GI6J}O|O1OrM2O3O4OUNUNELrM5O6O1OELFL7Os8........H kc+ + + + + + + ", -" + + + + + + ].[@` ........8O9OVz0OaObOcOdOeOfOgOhOiOjOkOlOmOnOoOpOqOrOsOtOuOvO1wwOxO}[;[;[;[;[,[>|5[%+yO#|[e)1%|*|=|C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}C}&|C};|>|;[SNzOAOBOCODOEOFOGOHOIOJOKOLOLOMONOOOi.xb......%}Y 7 + + + + + + & ", -" + + + + + + + b.` ........(#E POQOw{)(5:DK+___ROSOTOD/UOSOe]VO[^qKWO$_XOYO]/X]A/Z:{/ZO;[v[;[;[;[;['[cn4[9o`Ol+an3A$|F}%|%|%|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|$|7d$|Tz]};[![!LK{G^o^m($P%P&P6_........Z '*| + + + + + + ", -" rJ+ + + + + + uMP.Y ......Y [}*P#^=P-P~/x^O]'];PN]_]>P;P3],P'P~/N]H]u]B/)~B/$]J{5{;(a([)Sgaev[;[;[;[;['[2[)P:[+|>rDvVqx+,+B+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+p+}kp+!P/[;[![f}6)V]O/z/l/~P8]8]{P|^]Pi{'^$_^Pq}I ......Y .7 + + + + + + & ", -" + + + + + + + (.z ........,.~J/P(P)/W/[^-PJ]Z^W/_P:PW]F{J/B/RO~/V^U^#^j]W^Y{g]#]~]D^V^o]h-,|;[6[v[;[;[;[;['[|[7[2[7[/['['['[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,[,['[,[;[;[;[{[6|I~n^&/a]|^+/o^{P/y^K/!/i^p]~/y^|P1P3/z^X]B^I]2P/]'/Z^Y^3Pw];/g^h^2,4Pqw6[S6v[;[;[;[;[;[;[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[>[;[;[;[![9[}!_/Q{z/M~Q{{^5P#Po^n^n^>(6Pd$..........z 7P+ + + + + + * ", -" + + + + + + + $.Q+..........R+8P9P$]o])]B/.]B{1]h^;{B/Z]fy&]W~&]/]}]X]`^G~N]z^[^1^T!>]o]l{A/0(M)@=0PaP{[S66[6[6[>[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[;[![9[N'j/Q{z/|^r^l/#/z/d{bPx{cPc/I ........E u dP+ + + + + + ", -" 1&+ + + + + + Z-dmZ ........[@6,eP@]s]fPW]@~,],]+]q{a{)]T~gP}]$]J{/~&]p{p~q/T~5{T~g]c]W~R]~/6{,/X_i^i)v-hP#[,|f}f6~[~[~[~[6[v[6[~[6[6[v[v[v[v[w[v[![v[v[v[6[w[v[~[6[6[v[w[6[6[w[6[![~[~[![![v[v[~[![~[![![6[~[v[~[![6[v[~[![![{[![{[6[v[6[~[![{[6[~[![![![~[![![~[![{[![~[v[6[~[~[~[~[~[~[w[ae~[![![{[e}{[![![e}|[|[{[{[![![{[{[![{[![{[{[{[{[{[|[|[{[{[{[{[{[{[{[![![{[{[{[![|[{[![{[{[{[|[{[{[{[{[![{[{[{[iPYx~)v]S~8]jPjPk/8]~^kPV)o^W~=L=+-V;x;d>},rP+-sPy>tP8;!-8;sP[>_>uPx,];V;B=.;uP};B=8>d,L-p; -{;l>*>vPx;v-a;L-r,5-~=>>1-P-L=[>};(;h--;v-Z==;wPn;5;g>F;rP2-|;P-z=xPv-P>5;)>yP[; -W-};a;x;2-];B=];zP~'n>!-p-{-3;v;N=1-i-3;&;{-[={;|,o-APj=>;i=C;>;Z=I*O=,><;B;b=w=}-Z=K;{-o-/;Z=v;b=h-1;{-x;B;j={-g-2;w=T;B;p-!;{-T;K;g-e{(]l/L~h~+!L~6^R/n]BPCPDP9.........A d | + + + + + + ", -" _ + + + + + + N.g;H ........d$5+EPFP1]GP;{2]fP;{C{&]>]p{ ~&~Y{c]o~n{n{%]&~;{T~O{_]c{c]h{k~F~)~$]W{w~a{;{c]&][/#^w/A{h^Y{v^Z]'^]({/1^S_.]T^m]A_i^z^M^f/r/q/}/p]>]w]y^HP{/h^1]A^&]x/O^M^l{1^G]:/'^N^6]X{$]v^^S{7^w/]]M^$]$]Y{N^N{0]JP]]IPKP'/x/ /{_n^V{{^@(l^p^|:*^(/{^v]!^Y]z/l^&/=]5^{^n^I(L~Q_LP^/S{i/_/!^S{#PQ_N{MPj/l^O^{_5^j/2(g(n^t/S{5(+/S{@(|:>^R{z{6]a]K~k/8]|^g{NPg~OPf.........Z ..M++ + + + + + s% ", -" + + + + + + + ;7Z y ........o'l|s^B/i~P~q/~]h{,]n{PPc]U!%~R{3^b]:~R{&~}!E!%]l{,]o]r{Z!/~Z{;{~]G{F~)~)~R~@~f]%]<~0~p{j~c]0~G{9{+]9{QP$^#^&]9^W]9{%^$^p{+]_{}~,]j{$^%^)]T~G~)^D]N{o~P]l{m]_~d{;{~];]Y{>]R~ {Q]G~O{M~%~o~-~y{l]o]p{]]k/RPq]J!f!7^Z!/~;{i{ ~l{{^m{Q{,~7^+]c]%~$]]]l{h{ {~]o~j!<~z{&]SPR~n{T~h{S{J!z{J!M~^]!{J~l/S]l]l^~^!{){Z/e~h{L~RPL!TP8]l^n~l{h{y{V{l]o~V{|^|{V{#/5Ph{UP!{ ~~^k/VP;^R/V)m/M~;^NPy{+!|{NPn]/^WPs(XPYP,.........E ZP+ + + + + + + ", -" % + + + + + + | u X%........,.R+`PH{x]&];{}]/~t!U!O{ Q ~9!&~_~-~.Q6);!i{-~U!+]3^(~#~p{^{}~v~@~_~k~&]/~T~;{G~J{F~p{j~-~O!n{F~D);{=~H!`~9{)]0~%~v~={C!U!_~Q!0^b~/~}!l~+QT!>]<~U!G{@Qj{n{L!n~-^8)i{l{6)E!t!0~p~(~8!#Qo~:~r{&~-{D]H!L~<~;]$Q6)|~J!j!1!Q!}]E!9!5^,~N~m{8)&~J!j~Z{}~%~@~@~@]W~}~g!r{=]%Qy{_{p~0~w~{]&Q*~5^n~*Q=Qg{d{=Q-Q6^;Q>Q,Q*~'{'QS~|{*~V)bPM!-^6)S!k~bP*~8)f!Z!!{NP7)&~'QjPM~|^&~l^*Qa]*Q4!;^g{-^)Q;Q;Q*~M!!Q~Q{Q]Q[@........` +.^Q+ + + + + + * ", -" + + + + + + + `z0.Y ......Y [&6%~jx]n{p~&)%!6)&)/~}~W~n)Q!2!l)z!#~f!&~Q! ~9!E!$)Q!q)&)1!=~k)W~j!p~n{=]/Q*!#~v)s)^{D~r~d~(Q`~{~E!o)8~,{]~c~~:)2)m)}~1!<~d)<~H!F!K!`)r{%',~%'L!:)%!7)&)N!+]$)k~A!k~_Qf!J!7{u~{)2!r)l)*~W~d)m)k~e~f!e,c~-~}!W)Z!9'&~-Q:Qn!)6){)N'J!q)j!>]k~K!/~q)6)E!N!%!4)A!H!`))~V!6!t!p~o~%!C!bQ[{cQdQj{/!`)5)2)O!d~p!B!V!&~8!$~i)`'U!o{))#)E!N!&~l)o~k~}~]{n~M~.!l)+~#)W~c~n!V!>):~r{k)0~|{bP<~}!)-]K~+!3!!{r)M!h~-^4!5P|'iQjQkQ~!I ........Z 4.1 + + + + + + 3 ", -" : + + + + + + m weu%I ......I 9.lQa{j~.QL!d!m~S!2);]r).)>)6)h!l)m)}!6)d)k)U!Q!~`)N'U!/~}!={~~U'Q!Y! {&)j~&~|~O!l)~)J!<)d{,~2!h!L!'{d)1!%)5!m)&)L!:~8)=QsQ{~,~tQc~5)n~s)}!Z!g!q)5!m~%)k)O~z!}{_{ {U{,~uQ;~k/M!Q!%!9!;!a'.!a]r)f!5!vQN~wQ;~>)H!N~Z!&!V)M!7)r)d~[{m)#)e{-^xQk/J~3Qg)M!hQV)NPjPn~h!<)s)L!h!w)4!M!*~J~Y'L!*~*~bPM!5Q>Q6QV)8Q2Q'Q;^*~hQ-Q6QyQzQAQBQ[QCQ-m,......... .y M++ + + + + + + ", -" + + + + + + + /.E y ........f.DQEQM]r)-]L!_~#)8!U'Q!I~]{q)FQa'l)L!6)8!>)d)e,:~^{N'h!l~:)0{={5)*!={A!2)6!T!)~:)B!A)GQqQHQIQT)T)%)7{<~g!f!/~JQY):)~~(~-)f!6)U{G'7)+]F~KQg!H~J!8)s)N'2!s)L!l)M~'{-)m~~)5!+!8)>)=~*~&Qu,JQ*!%QN'm)!~H~r)/^5!&~n!l)z!`)i)E!l)H~n~=Qr)9'G'U!`)a'V)r{H~g!hQF',~J~+!.!*~3!L!Q!M~7'a'N~d{LQ;Q*~2)T)l)f!|'MQNQf!OQa'3!jP){5Q7)9'PQ;]|{6^+!V)d!f!J~*~-Q-Q4!M!+!uQuQQQ}Qh!1!M!;QV~xQRQ|Q}QSQTQUQI,,...........S+k|+ + + + + + + 3 ", -" } + + + + + + | c Q+..........h.VQWQ5^+~:~#)r)m~6)l)%~e,>!r)N~&~>)e)6)%)6)Q!$~%~;]n!A!5)n!k),!1!E!z!`~C!3zXQYQY~!|{h{^{Q!7)!{g!/^fQ R|{q{%!K~jQ,~;~#)D~H~Z!l)r)!{8!L!K~-)O~E!:)p~9!M]H!j!q);]e{2!h!>)z!%!s)N~.!-Q-)V)hQ;'K~5!,~;]&~~)L!8!k,j!|{V)uQfQ.RV~xQd)+Rl)G~}!5Q)QjPs)bP>)e~'{V);~@R)Qn~n]r)|{+~ !g,K~jP+!#R7)hQ;~V!6!p]X)8)-Q*~$R%R'Q)QV~){&R..9.......I D X N.+ + + + + + i; ", -" + + + + + + + m J z ........,.0K*RO~5!=R-)*'-)m~*,l)%!z!<)2!e!U'FQ}!N'm~e!|~6)|!u)k,%!e!D,z!6)m):)m)z!G!6!dz-R})iz[!c!R)Y,H>/!0!N'O!S!8!q)W);R`!X,>,=)a'T,X)e,h,>R,Rr)6)|!j!FQ{)|~<)*'3,*'''{)8Q>)o)X)&QK~9'9'.)T,'R7)j!a' R{)s)5!%'_Q1'e!%!l)*'>)e)-)}'[)H>w)+,m)7'v,5!u,/,)RxQu,w)S>;~4Q,R!R7'N~~Rm~<)|{f{f{{RM!'{4Qw)]RZ'%)A!6'=)e,f{K~hQr)R>(!>)F'f{;~-)7)&QNQ;~u,n~_QhQhQU~9'9)=) '}'.,7'N'm)N'#)$)b)q,.'4'b) ']{1,X'#,`'w'})A'w'2R3Ra~B)+)Q)4Re,R>X'!'U'%)`'$)X'V,G'vQa'.,*)o)p);)&'E'3!a'#'H>/,.,$)G'/,.,G'{,9'w)5!$)V,3,f{.)7'@R$)K'.R',@)9'5R6Q[QeQ5Qu>*)%)7'{)e,6Rg,>,&,1,1'''.)e!],;'s>V)%'hQ7R4!%'_Qh~fQ9'8R;)W><)1'-)9R'{w)-)5QS>w)E)='-^F)E)9'>)b,;)E)%'_QF)(,.,',-Qt,#)4'%'%'g,|'%'3!F'h~*~0R3,N'Z'aRhQ4QbR_R)RcRi'h~dR1Q4@h.........Y u%k|+ + + + + + + K, ", -" ) + + + + + + + %c/..........[@eRfRgR*'%'F)4'',9'*,H>H>>,N'e,1,s!hRU'U'&!b) )1'&)X'X'&,$)e,k)P)3zw'L>gz2)iRK'+)Q)y)V,n)9)b,c,K'&,+,jRq)@).'j,O~1'X'A,8).)',F)3,',e!<);)*,e,7'~)>).)U'kR5R$)@,lR%'8)7'K~>,g!,!/,g,='3!s)$QuQ_QE)r)X,{,e,1,X,>)F)mR%)&,G)@)1'j,.)u,@'3,F)$RNQ:QnRE)U)>Q(R5RW)O~.)',3,3!t,@'F)3!9R-Q9R5Rw)/,]{|RhQ+!@'-^g,h,g!7R4!f{>)g!3,1'|RV)5!3!,'%'*,w)u>%'g,7'='@R,'bPRQF'hQh~$QeQoR4QpRh.I ........z v 4 + + + + + + + ", -" + + + + + + + c.@.z I ........[@f$qRw)~,@'8)7'3,]{e,W>a'k>X,1,e,h,(,e,n,})V,X'C'Y,@,#'3'e)3zL'N>;>I'A's,'!u'L>f'W'&)q,+'K'iR=! )+,G>e>$,#)R>N>~)N';,w)''@'q)k,P;;)-)q){,*,3,%)!'7)='w)$'Z>%'3QI;;,f{F)R; '#)='g,9RF'u,-)/,N>w'4)k,X,V,9>1,m)}!G'R>*)&,G>$'N'/,I;I;9R_RrRF's)F'yQZ'Z'5Rh~lR.)3!u>@'@' !;,3!OQZ'sRtRu,8);,#!],Z'4!hQZ'g,lR;'Z')RQ;h,C'{,,,g,3!t,F)~,3,-)rRhQS>hQ;~eQF'4Q9Ru>E)$QE)u,V>)QuRh...........y ..vR+ + + + + + + ", -" + + + + + + + k y y ..........(#wR1'3;w)%'V>,,-)I;xRt;@'p>C;$'/,<;y,-,R,Z>j>GtyRu'X>G> 'K>#,[,e>j>N2'#,K>AR9>H>s,9>U>D;e>$'h,Z>X>h>S;N;z;j-<;.,j->,P;&,BR%'3,e>f,f,-'+,1,$'V>',@'S;/,CR$Qw;K>;'_QlRz;],$,G;n>G>H>y,9>J>b>x>2'PR>|>DR}'A;L;ERFRGR;'Q;sRj-Z'bRsRHR9R;,],E)w)IRf{JRv,hQKR9R)R~,OQ''q>LRMRCRg,>'8'>'_RNRQ;%'{>OR/;=,~,v,;'>'3!,,N;GRPRhQ~,;'^,rR>'3!t,lRZ'F)-'~,-^QRS.I ..........E 2%+ + + + + + + 1& ", -" @ + + + + + + + j =-Y ........3>i.RR1R-'~,]>)R^>]>g,]>Q>S;h,S;6RSR2,E>TRZ>9>c>URT>2'N1,u)A'f,9>#':>e>A'}>n>y,N>0,Q,Y>-;|>H;@;O;.,P;U>N>h>VR*,~,S>@'h>P;Z'a'C;K;h>;>6'Q;3,3,,,j>|>@>@'d;N;k>h,cR>'[,|>Q;U>|>S;$'N>y,/;~>i,H>G>;;b>X>|>$,H>/;j,P;*)@;=,1'>!|R9RWRXRz;;'YROR/,;'tQWRQ;',g,',I;$Qu;)Rf{2QsRI;~,OQt,Q;w)2QLRWR;'9RZR`RZ';'3!'')RWRtQQ;u, S^>''{,-'u;.SO'Z'Q;g-+S^,CRv,u,u,;'f{;'MR@S4@8...........D d + + + + + + + i; ", -" + + + + + + + + W A ..........8.H #S7R/,t;~,k>Q;~,''R;Q;P;Ln>!'K>},7>&S=;h,}'s'P;P>Z>9>j,a'J;/;&>*Se>&,s,#'P;+,p>k,p>J>M0'u>k>k>I;w;|>L>Z>Q;],w;}'|R~,k>NRu>w;Q;;'bRn>9>.)0>1'X,x>C;U>h>|>{,w;h,;,D;n>1,x,P;p>g-;,|>>!+,$'k>j-=SMRO'yQf{S>^,NR9RZ's>g,Z',,BR+,~,v,]>),LR^>t;^>j-I;q>0'~,I;h>f{-S;SBR^,*'z;IRsRZ'$QMRf{>SIR_Qs>;S^>},}'='xQbRv,@R,S9R-'sRv,Z'O''S)S&Ph.I ........E X Qm+ + + + + + + ", -" + + + + + + + aKemz ........I (#!S~S{SI;Q;x>w;u>h>R;u>}'$,A,Q,]S'!e>|>k,#'l>b>f>c,y,e>H;n,#,Nb,C'N<6>p;|>e>n>`>U>|>w;2'},i,S;h>R;V>/,$'h>U>u,G>S;,,@>3,N>;,H>;;%;H;$'^>^S0'Q;F'lRf{/SLRC;N>(Sq><;g-9>X>.,$,S;h,+,p>G>G>G>6'D;y>1'}'|>|>}'k>S;h,j-s>z;CRxQw,='],g,z;2Q;'^,_S%'''h,/,',/,-'I;h>W;u>A;$'Q;,;-':S/,s>)RGRWR;'5Rz;;SZ'-'-'V>]R%'sRw,-'@>/,>'&,h>xQ>'>',SWR^,.S;'-S[Ss>}S(#I ........z Y k + + + + + + + , ", -" =.+ + + + + + + |.I '...........d$|S1S,'k>h,R;1't;KR3;n>n>%>/;b>L-@;/;D;B;@;@;H;|,;>Z>:>qPr;D;x>t;B,x,k,P;@;M$'F;P;!;$,n;/;u-%;s>$'t;;,h>;,7=z;BR2=OR@'u,(,CR=S=,2;BRcR:;j-,>-;u,sRWRO'-'L=-'.SNR1;;;~>h,}'G>J>S;c=eor;/;C;}-@;h>],k>h,;>1'R;Q;,,t,A;NR9Rz;MR2S,;-'9R2QWR`RP;B;g,Z'BR0>N;XRh,3;k>{>j-3S~,s>-'v,z;7=@>@>8SQ}I ........y z r + + + + + + + + ", -" &(+ + + + + + + 9S'...........Y [&OPOR0SCRv,,>k>j-)>7-=;>;;;w;{-(;5;|=r-x;->/;l>/;{;A'0,b=b>@;F;/;-;[=%;_><;-;c=J>(;~=v;b=;;g-c=,;b>g>d;6;O=b=q=@>c=L<,,7=_-Q;[=h>@>NR,>f=N;2;2;@>aS_-bS5;3;cS]>x;-;O;g-N;<;K;3;3;}-P-!;b'dS!-b=h>R;f=W;|>,>eS:;-'#>@>F']>,;NRI-S-JR.SLRfSgShSi=-'j-N*,;s-|-,><;d;,>e->',;h>,,6;5SWRiS:SQ;@>jSMRaSWRkS>'lSj-@>GR{RsRIR+SWRmSnS-'='_-oS_-pSsRO'CRMRz;qSl'Q'........I c/s + + + + + + + + ", -" + + + + + + + + 0 _.Y ..........(#rSsSV>2=GR2;v;L-i={-K;T-O;P;!-5-{-W>@;r,}-Q-M==;;;g-j=*StSd>f=!;v-3;~>{-4SB;5;V;v;f=4;K;s->;->g>g-A;uSg=j-2=j--;j=l-GRN;,>t;lSlS,;dSe-W;:SvSS-+S.ST;}-AB,Sv>P;R*)>u-6;W;1;1;-;o-O=5;O=<;%;v>Q;%;g>}-j-7=u*O;h>NRwSl-:SNRw,GRGR+SxSfSN*4SN;~,b',>@>1=}-w={-C;W;L;:;WRz;o>kS^-lSAS-SlSl-l-7=^>u;w,7RCRCR6SBSCSiSkSMRO'KR6SGR+SvS>'='DSy I ..........z e | + + + + + + + ", -" + + + + + + + + ES`%Y ........I L.FS]>]>IRW;|;g>;,v;}-W;F;-;K;/;i=F;!;l>D;d>+-%;A;h>F;rPGSB=j=v;+;w;~-c=B;:>u-P;~>>;{-,;Q-sP5;~-3;r-,>c=C;{-,>N;,;HSBR6;_-u;2=7=CR{-}-A;Q;7=-S.S{-F;iSNR^SGRvS%;B;,;2=>;D;/;j=w=b={;O=A;j-f=H-a=W>ISQ;r-2=j-,;d=j-6;-'O'JSz;,,L;z;_-_->':S@>,,MSlSiSCRkSIR+SJRNR7=u;NSlS2=JSmSOSS-S-mSiS_-IR$'PS0.,...........H v m + + + + + + + ^ ", -" . + + + + + + + 4 L D Y ........,.%$QSu-RSr-!;J>g-|-t;F;[*~-W;2;S*:-2;`=L=`=-;s-P-d>v-b=b=`=i=Z=v-2;q=p-]=SSA*[=p-M;6;s-b=2;g=]>u-N*z;z;p-}-jS5=v,L;;'TS-S SLRVRl-KR4S:;@>>'US;;v-f=%;N*OSO'u;b=VSd;L;:=v-->s;v;O=dS3;3=d=|=APt;1=l-KRS-N;jSk>q=;;2=GRvSvSWRgS2=^-O'-Sf=e-kSd=X=N*:;W&6;I-s-r-,;O=|-l->SGRCRIS>'|;V*iS+SGRWRu;S-WSvSA*N*NRu*7;+SO'XS]>jS_-@>jSO'WRLR:S]>YSZS|#,...........=-P.4>+ + + + + + + * ", -" : + + + + + + + uM@.E ..........9.`S To-O=a=s-f=v=c=[=q=P&~-W&a=Q*1-P&s-X*T*O=~=C=0=Z&.Tx=0=v-R*C*r=!-p*S*I&~-3=:-A*N*t;O*d=T*u=W*W;,;N*+T@TX&N*v*JS#T$T%T0=O&]-^-,;GR&TlS7=v-`=r*0=*T=TR=-Tn=r*K;|=g=|=c=a=T=k&y*9=I-T=!-L*r-l&H-I-k-;TX&^-R*l=>TjSI-nSgSMSI-,TlSI-6;fSu*A*(-jS/-6;N*(-K*L*7;'TP=S=(-)TJRk-MSS-!TnS5=fS~T_-I-MSKSr-MSjS =X&{TI-z*iS]Tn=CRfSiSR=JR1=^T/TZ f...........Z y k + + + + + + + + ", -" + + + + + + + + &.J '...........I L. TX*v;q=b=c=T*c=v>p=T-(Th=.=O-w=+*'=E*r*[=z=h=~=%*x=xP2;W=t=O=L*I*M*0=N*A*p=k=d=2=A*W&K*2=r=}*1=6=S-A*6;xSxS_T:TUS1=q-(-I-K*S-6;,;r-'=S*S*v=#>GR:-k=W&J&f=s-3=k&W&A*N;kS$TfSlS&TS=fS[T5=6=k-JRv*jSq=}TkSl-K*GRP=5=CRP=fSl-5=lS|T{TJR5=3=L*1TI-u*&T^-_-W&2TxS5=OSu;S=7;S-KS~TJS3TGRN;4Tz f........... . .P + + + + + + + + ", -" + + + + + + + + [.+.'...........9.h.5T(TE&p=S*g=T-d=q=6T0=+=C*I*S*Q*l*w=hPv=R*.=N- -x=M*h-H*f-(TB*D*A=A*S*0=I&7T8TR*T*k=6;I-I*T*(-I-3=n=!T9TGR0TxST*A*JSaTJRbT8TS*S*X*Z=6Tn=bTT*k&P=Q*|=)-2ScT3=c=(TdTT*q=k&3=6-s*L*3=S*A*^-c=b=v=L*2=:;nSu;mSnSeT/-*;{T%TjS_-fTxS'TaT/-lScTcTe-4=k=u*cTu*5=5=A*v*^-cTJRk-jSaTfSxSL*g=gT~Tk-I-6=(-0=~TjShTJS)TfSASnSS=fTJ-iT+SjTA f...........y y ^|+ + + + + + + + ", -" + + + + + + + + q x X%..........,.g.kTlTmTq=+*v=L*R*i=}*[=p=q=T&H*j=V*v=P&a=j=[*.=nT4-q=P*v=R*0=D*r*r*Z*<=N*l=W*o>/-k=k&N&d=fSbT4=,T,TMSnSoT%TK*^-pT.SiT^-GRqTv=Z*Z=jSP=oSgTrTE&d=I&Y*q=4SmS5=I-z*R*I&S*I&[=W*q=n=T*r-^-O*K*jSK*^-JRMSlSS-jS/-3=vSaTaT_-{T*;4SsTxSI-jSiTS-k=6;^-)T)TS=+TA*tTJR/-|-fSaT(-(-v*v*v*5={TT7T'&5=JTJ-jScT!T(-v*nS(-cTv*u=N*L*@T!T(-7T4S>T4=k-z*P=k-%TS=k-S=xSJR5=KTJ-/-/-S=S*H-aTLT'&l=cTv*fT~T_-(-MT*TFSL+,.........I ` E 2%+ + + + + + + + ^ ", -" ] + + + + + + + + 6.y z ............g.V.NTOT^$~&L%)&9%6*n&9$A$q*I&k&k&V*x%6=PTl=n&QTRTSTE&X&2*x%W&L%$%2*z*z*N%6*+*g&[TiTK*P='&TTUTnSV*rTVTWTXTpTvTMSA%aTXS2*+*[-@TK*JT%TKTYT%TH$)&R*g%3*ZTfTJT>TiTrTL%(-6*v$L%L*7&l&L*r*D%g%>T>TbT]-(-@TS=`TST U.Uv*+Uv*TT@U#US=XT'&7T$Ug&3*JT%U UP={T'&H%>TJTTT&U{T%UTTxSoSjSXT7TP=!TjS]%OS~T[T%TE$5=WT.UxS.UWT4*@T*UF@9...........` D O + + + + + + + + [ ", -" A]+ + + + + + + + =$0. ...........Y [&=U-U;Uv$>U>U,U3*p&Q%'&/-l%.*l&g%)-l&XS3*2T6&W*+U'UV&H&E&P=rTG&bT3*3*_*2*P=)Ug&2*]%fS!UsT%T'&D%XSy$6&%T=T[TLTaTg&rT2S4*~Uj%k%!T!TXTA%]%D%{U'T]US&rTQ$!TJT^U%Uj%%Uv*MS4*I*i&D%T*L*7&L*P$2*K*0%G%N%P=3**Tk-P=/UiTWTWT/U)%'TsTH%(Uk-P=P='%M%'&)Uj%3*5=_U}$XT{Tk-:U%Uv*fT%UMT7*K*=T6=Q$*ToS2S%UU2*OT`&2*XS/-JTz*!U@%T&_U!T_UK*}$S&mT%UmT_UiTS=3*D%($6U!TKT[UbTj%&U7Uf&G%iT[T[TfTiT(%>U]U8UTI-&UTQ$'&6UxScU]%:UUk$/$H$,UE$!%NU!%{$CUa%$%_%%&~$A%NUu$3*}$_U}$($9%%UJ%XT<$]%}UE$n$Q#5U%U^Ul$OUJ%5U]%GUnUPUQURU'T[TaU!Th%E$S#J$p#2$'%^UP$0%x%p$A$B%JT>T=TyUEU&USUTU=TWTHU&UwU[UxU~$CUXT)%F$UUWTCUOUVUJT&UuU^UQ$Q$aTWUDU[UuUl$XUXTVW+ + + + + + + + + B> ", -" + + + + + + + + + + B#P._.Y ..........Y f.9.,W'WPU WMV;#j+-WfVm@LVj@)WB%!WnVkV_m WVU_mnVVUDVSV!W*Wv+LV~Wj@MV_mjV{W;VVU)Wm@ WjVoVMV+W]WgVj@oV[92V-@^WjV/W(WOi_WSe.G ...............I h.~*yWzWAW873WdW]Wh5BW/W`kG ", -" ( + + + + + + + + + + [.u '.'...............I g.z X.X+X@XiAqV{jfW}WDV/WRW#X$XCV%X9|qVoW{WB}dWVU0|NA0W9|c|(W{WLWdW(W!WLVFCbs]W;oDVUV:W[99|IW$W$XRW$|fW.............. .X%Za/.+ + + + + + + + + + + ", -" H[+ + + + + + + + + + 3%2%+.z Z ..............9.h.tM[n;X>XMV%|}0qI[9]r$XfW{jA}Id,X[9c|b| W'XFC$duWA}OiuWB}|kg6TABWyOFC)X!XB}A}BysWrmE}~XIdUW#X{XCW]X^X/W)1a|;oor/X=X$|`kD}XW)X)1RW(X#W=Xbs,X/W_XsW&XUV/W]rtDtDA}LWb|IdsWFCbsqWFCFCAp/Wbs:Xh@{jHlwn(b@{jbsqXC}rX'Xrm'2sXFWtXuX~*%$9...................'.D v %.+ + + + + + + + + + + ] ", -" + + + + + + + + + + + + vXb/H '...................,.g.L+wXxXyXByZt$|rqzXrqApAXaXBX_XCXzX#|DXC}ApEXTiFXkn|kGX5XHXoX*|{j03D}03{XIXTAfWIXJXKX)19|*sGjLX|kwn/Wbs&|03MXNXjXOXTikn&|!1$|zXC}En*|#|kXOXzXPX}0TAQX_XGX]rTAAp03RXaXSXTXz#UXg.8...................y =-Q.;74 + + + + + + + + + + + ", -" |@+ + + + + + + + + + + Z%B#ZaS.` y ................I 2.tMu%VXWXXXiX&|YX*s|9ZX_X|k`Xkn)X YzX9|BX*s5X*s*|.Y+Y@Yrq#Y=|FX Y,X8X$Y%Y8X$YG}&YE}&YGj6vrq*Y=Y]r6v-Y=X+YoX;YBX>Y_Xwh)172,Y'Y$Y&Y9|AXTADX)Y}0!YoX|kG}-YGj_X~Y{Y]Yu%^Y(#,.................Y ` S.J h*Z-+ + + + + + + + + + + . ", -" . + + + + + + + + + + + *.;7v S.E .................I ,.0.X%Y ,W/Y(Y_XEXrA#Yvcwh_Y:YFX*sFXFX_XrqFXFCLn ", -" % + + + + + + + + + + + + | xYW Y A .........................,.f.S.yYzYAYBYCYDYEY&dvc'Y*s@YFX_YFY7d@YtjGjYX!1=YmYYX03GYHYIY)1)1JY>Y:Ykn)1By YoY!17YKY]r)1%Y}YYXGjLYHYMY;YCXNYOY%|PYQYRYSY$$.^L.,.I ......................Y D z L v!4 + + + + + + + + + + + + K, ", -" < + + + + + + + + + + + + + |.s P.H '.Y ......................I f.%$G@S+TYUYVYWYXYYYZYhC*s!1)1oY[YZX`YLY*Y]r ZoY.Z6Y*YG}ZY03zX_Y)1QX&Y@Y+ZWioY-Y]t@Z#ZKX1Y$Z}0%Z&Z!1rY*Z=Z-Z;Z>ZS+,ZM.f.9.......................Y y u%Y !.6.1 + + + + + + + + + + + + + ", -" < + + + + + + + + + + + + + >W8 L .. .Z .........................,.M.A#,*D T.'Z)Z!Z}X~Z{Z]Z`XYXwh Z Z#Y^Z Z/ZiX/Z(Z-Y`X_Z:Z= ", -" Uc+ + + + + + + + + + + + + + + 4 CZb.b/y 3.z .........................................................................................................................Y Z A z I=!.r n'+ + + + + + + + + + + + + + + + EF ", -" < + + + + + + + + + + + + + + + + 4 /)DZM P.z Z .Y Y Y ................................................................................................Y Y Y .` z Y #.V :^].+ + + + + + + + + + + + + + + + + ", -" @ [ + + + + + + + + + + + + + + + + 3%U q h*=m+...Y '.Z Z .y Y ........................................................................Y Y .` Z ` Y ..,.${EZP &.*.+ + + + + + + + + + + + + + + + ( [ ", -" ^ A]+ + + + + + + + + + + + + + + + + + 1 N.6 0Q %B]w x Y z D D z Z ` .Y ............................................Y y ` Z z E A z y x J K FZV O.c.3%+ + + + + + + + + + + + + + + + + + 1&' ", -" !G< + + + + + + + + + + + + + + + + + + + + + c.q ;7k|c u K w ,.S.D B C Q+A D E E z z z z z z z z E E D D A C G D X%I +.ZaL e lIGZO.AE+ + + + + + + + + + + + + + + + + + + + + + n ", -" gF|@+ + + + + + + + + + + + + + + + + + + + + + + + + HZl /)/.v!V Y%;.c M #.L ${B]v K K K v B]L #.=md b s r}0QB#q I)m | + + + + + + + + + + + + + + + + + + + + + + + + 3 cI ", -" @ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | 3%*.N.N.m c.c.c.m N.*.3%| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [ ", -" e$0-: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ( * * ", -" =.diUc&(+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + e$= ] ", -" m'n D-< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _ iF>= ", -" cIdF.1. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + e$IZsd6A ", -" e$+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + |a ", -" @ : + + + + + + ( / ", -" "}; +static char *dummy[]={ +"512 512 256 2", +"Qt c None", +".j c #ff0000", +".s c #ff7f00", +".P c #ff5500", +"av c #ff4000", +".b c #cc3300", +".# c #d45500", +"#U c #db4900", +"#D c #df4000", +".o c #e33900", +".W c #e54c00", +".H c #e84600", +"by c #ea4000", +"ac c #d83b00", +".D c #db4900", +"#m c #dd4400", +"ar c #df4000", +"aD c #e13c00", +"#L c #e34700", +"aw c #e44300", +"aQ c #e54000", +"aI c #db3d00", +".2 c #dc460c", +"#P c #de430b", +".w c #df400b", +".Z c #e03d0a", +"#b c #e2450a", +"a4 c #e34209", +".a c #e44009", +"#4 c #dc3e09", +"#Y c #dd4408", +".M c #de4208", +"a5 c #df4008", +".E c #e03e08", +"bd c #e14307", +"ah c #e24207", +"b4 c #e34007", +"bV c #e33e07", +"#a c #dd4307", +".3 c #de4107", +"#s c #df4006", +"a6 c #e03e06", +"#E c #e14306", +"b0 c #e14106", +"a0 c #e24006", +"#V c #e33e06", +"a8 c #de4306", +".A c #de4105", +"#Z c #df4005", +".z c #e03e05", +".U c #e04205", +"#M c #e14105", +"aX c #e24005", +"bC c #e23f05", +"#f c #de4205", +"#6 c #df4105", +"bb c #df4005", +"#w c #e03f04", +"bP c #e04204", +"aS c #e14104", +"#j c #e14004", +".i c #e23f04", +"af c #de4204", +".c c #df4104", +"aO c #df4008", +"bG c #e03f08", +".7 c #e04208", +"#t c #e14108", +"#3 c #e14007", +"bu c #e13f07", +"bU c #de4207", +"#G c #df4107", +"aj c #df4007", +"#z c #e03f07", +".Y c #e04107", +"bX c #e04107", +"aU c #e14007", +"ad c #e13f07", +"bw c #e24107", +"aW c #df4106", +"#q c #df4006", +"aG c #e03f06", +"#A c #e04106", +"bR c #e04106", +"aJ c #e14006", +"bD c #e13f06", +"az c #e14106", +"#h c #df4006", +"#I c #df4006", +"bl c #df3f06", +".J c #e04106", +"ao c #e04006", +".v c #e14006", +"bi c #e13f05", +"#n c #e14105", +"b6 c #df4005", +"#S c #df4005", +"bg c #df3f05", +".p c #e04105", +".t c #e04005", +"bA c #e04005", +"br c #e13f05", +".9 c #e14105", +"bz c #df4005", +"aR c #df4005", +"aB c #df3f05", +"aL c #e04105", +"#k c #e04007", +"aE c #e04007", +".V c #e13f07", +"bH c #e14107", +"bv c #e14007", +"bc c #df4007", +"a. c #df3f07", +"bs c #e04107", +"bK c #e04007", +"bT c #e04007", +"b9 c #e03f07", +".r c #e14106", +".R c #e14006", +"bk c #df4006", +"bW c #df3f06", +"#8 c #e04106", +"#9 c #e04006", +"b8 c #e04006", +"aM c #e03f06", +"#H c #e14106", +"b2 c #e14006", +"#T c #df4006", +".n c #df3f06", +"bp c #e04106", +"bh c #e04006", +"#c c #e04006", +"ai c #e03f06", +"b. c #e14106", +"bx c #e14006", +"a2 c #df4006", +"al c #df3f06", +".K c #e04106", +".d c #e04006", +"#7 c #e04005", +"a# c #e03f05", +"b3 c #e04105", +"bn c #e14005", +"ag c #df4005", +"bf c #df3f05", +".S c #e04105", +"bZ c #e04005", +".X c #e04005", +"aA c #e03f07", +"ax c #e04107", +"bo c #e14007", +".0 c #e14007", +"#C c #df3f07", +"ak c #e04107", +".4 c #e04007", +"#Q c #e04007", +"#0 c #e03f06", +"#W c #e04106", +"bq c #e14006", +"bM c #e14006", +"bN c #df3f06", +"#p c #e04106", +"b5 c #e04006", +"an c #e04006", +".k c #e03f06", +".G c #e04106", +"b7 c #e04006", +"aZ c #e14006", +"#5 c #df3f06", +"bJ c #df4006", +"b1 c #e04006", +"bY c #e04006", +"b# c #e03f06", +"aq c #e04006", +"ab c #e04006", +"aN c #e14006", +".8 c #df3f06", +".6 c #df4006", +"a1 c #e04006", +"ay c #e04006", +"#K c #e03f06", +"aT c #e04006", +"#x c #e04006", +"bF c #e14006", +"bI c #e13f06", +".h c #df4005", +"#2 c #e04005", +"a3 c #e04005", +"bt c #e03f05", +"aH c #e04005", +"a9 c #e04005", +".x c #e04007", +".O c #e13f07", +"bO c #df4007", +"as c #e04007", +"#N c #e04007", +"bj c #e03f06", +"#i c #e04006", +"bE c #e04006", +"aK c #e04006", +"at c #e13f06", +"#X c #df4006", +"#e c #e04006", +"ba c #e04006", +"bm c #e03f06", +"aP c #e04006", +"aF c #e04006", +".q c #e04006", +"am c #e03f06", +"#. c #df4006", +"bL c #e04006", +"#r c #e04006", +".e c #e03f06", +".Q c #e04006", +".I c #e04006", +"bS c #e04006", +"aY c #e03f06", +"aV c #df4006", +".C c #e04006", +"bQ c #e04006", +"ae c #e03f06", +"#O c #e04006", +"#o c #e04006", +"#l c #e04006", +"aa c #e03f06", +"#J c #e14006", +".B c #e04006", +"#1 c #e04006", +"bB c #e03f06", +"ap c #e04006", +"a7 c #e04006", +".1 c #e04005", +".F c #e03f05", +".u c #e04007", +"#d c #e04007", +"#B c #e04006", +"#F c #e03f06", +"be c #e04006", +".l c #e04006", +".L c #e04006", +"aC c #e03f06", +"#y c #e04006", +"au c #e04006", +"#v c #e04006", +"## c #e03f06", +"#u c #e04006", +"#R c #e04006", +".y c #e04006", +".5 c #e03f06", +".T c #e04006", +"#g c #e04006", +".N c #e04006", +".f c #e03f06", +".m c #e04006", +".g c #e04006", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.b.c.d.e.f.g.f.h.iQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.c.k.l.g.g.g.g.g.g.g.m.n.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.o.p.q.g.g.g.g.g.g.g.g.g.g.g.g.rQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s.t.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.vQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.w.x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.y.zQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.A.B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.C.DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.E.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.GQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.H.I.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.JQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.K.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.L.MQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.z.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.O.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.o.Q.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.RQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.S.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.T.UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.V.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.I.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P.S.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.XQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.A.O.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Z.0.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.1.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.3.4.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.6.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.7.8.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.9QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.o.t#..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g###aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#b#c#d.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#e.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#f.k#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.b#h#i.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.f#jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##k.B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#l#mQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P#n#o.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#pQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#q#r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.JQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#s#i.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5#tQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#k#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#v#wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Z#x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#y#zQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#A#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.f#kQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.W#C.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#C#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#E#r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#e.MQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.t#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#F#GQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.D.G.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m#H.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#I#J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#K#LQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#M#N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#O.zQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#P#Q.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#R#SQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#P#T#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.0#UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#V#W.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#X#YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Z#0#1#e.YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s.Y#2.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#B#3QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#4#5.g.g.g.g.g#TQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#6#7#l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.f#8.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#D#9##.g.g.g.g.g.g.ga.QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#6a#aa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gabacQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jadae.g.g.g.g.g.g.g.g.g.ga.QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Pafagaa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#rahQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#a#x.g.g.g.g.g.g.g.g.g.g.g.g.gai.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#ajak.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#F#tQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtacal.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gam#MQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.H#Aan.L.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.N.VQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jaoap.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaq#MQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtar.vaq#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.K.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Zas.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gat.V.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.oao#x.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gau.n.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#0avQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtawax.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.Nayaz.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.UaA.l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.kQt.V.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaq#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.PaB#F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaC.4af.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaDaEaF.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaGQtQt#S.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaHacQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#jaF.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#oaE#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s#t.G.y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaIQtQtQtaJ.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaKarQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#ban.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#1aL#UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#4aM#O.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaN.MaO#F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaaQtQtQtQtQt#z#R.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaPaQQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#U.R#v.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#JaR.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaSaT.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.x#DQtQtaU.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaHQtQtQtQtQtQtaf#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#r.wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#zaV.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaaaWQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.z#K.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gap.2QtQtQtQt.6.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaTQtQtQtQtQtQtQtaX#F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaY.aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtah.6.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaZaIQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Z#5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.faOQtQtQtQtQt#E.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#2QtQtQtQtQtQtQtQta0.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#O.EQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Hai.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#B.J.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#G.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaMQtQtQtQtQtQtQt#Q.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.BQtQtQtQtQtQtQtQtQt#E.1.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.B#aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#h.B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga1.aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.ba2.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga3.PQtQtQtQtQtQtQta4#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga5QtQtQtQtQtQtQtQtQta6a7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.1a0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta8a9.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#F#tQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m.x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga7#PQtQtQtQtQtQtQtQtQtb..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.galQtQtQtQtQtQtQtQtQtQt.3ap.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#B.zQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.zb#.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fa..jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaQba.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m.7QtQtQtQtQtQtQtQtQtQt#m#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#u.AQtQtQtQtQtQtQtQtQtQta8#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.lafQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbbay.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#p.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Z.e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#TQtQtQtQtQtQtQtQtQtQtQtQtbc.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ObdQtQtQtQtQtQtQtQtQtQt#t#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5.JQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#L.t#C#Nbe.g.f#gbe.Obfbg#f.3#3ai#X.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#e#4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#P.C.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ebhao.c#MaG.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaH.PQtQtQtQtQtQtQtQtQtQtQtQt#U#o.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbeaW.jQtQtQtQtQtQtQtQtQtbi.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#9.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.saJ#K#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.F#wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.H#e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbj#S#PQtQtQtQtQt.M.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.F.wQtQtQtQtQtQtQtQtQtQtQtQtQtQt.J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#e#AavQtQtQtQtQtQtQtQtbk.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#0.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Pbl.e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.y#IQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtavay.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.C#A.jQtQtQtQtQtQtQt#L.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m#3QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.sbm.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaabkaQQtQtQtQtQtQt.jbn.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.h#mQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.zba.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#H.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbo.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#9.#QtQtQtQtQtQtQtQtQt#f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbpQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#3.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ybq#sQtQtQtQtQt.sbq.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#.#4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#U.K.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gan#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbr.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5#hQtQtQtQtQtQtQtQtQtQtQt.R.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga9.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fan#sQtQtQtQt.jbs.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gap.zQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.M#e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbjaIQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.U.y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.LaOQtQtQtQtQtQtQtQtQtQtQtQtbt.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.u#bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.a#d.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fan#YQtQtQtQt#6.h.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#v.YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#G#F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#O#EQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#L#o.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ubbQtQtQtQtQtQtQtQtQtQtQtQtaw.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#GQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbu.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#u#8#UQtQtQtQt#fa2#i#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fbv.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s#H.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaCbuQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.say.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fbwQtQtQtQtQtQtQtQtQtQtQtQtQt#n.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbxQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbu.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaVajQtQtQtQtQtQt.oaSbs#5aa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaZbyQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaDaT.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.NaRQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#8.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbzQtQtQtQtQtQtQtQtQtQtQtQtQtQtab.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbj.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#b#5.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaq.MQtQtQtQtQtQtQtQtQt.wbiay#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.Qa6QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbd.I.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbn.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#t.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbhQtQtQtQtQtQtQtQtQtQtQtQtQtQt#b.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbe#YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Eag#v.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#u#8#UQtQtQtQtQtQtQtQtQtQt#LbA#2.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#vazQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbb.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gayacQtQtQtQtQtQtQtQtQtQtQtQtQtQta4.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbq.jQtQtQtQtQtQtQtQtQtQtQtQtQtQt.K.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbwQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaD.RbB.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaYbCQtQtQtQtQtQtQtQtQtQtQtQta4bx.l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gag.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbD#R.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gam#YQtQtQtQtQtQtQtQtQtQtQtQt#UbE.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbF.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtaDau.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbnQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##nam.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#g.r.sQtQtQtQtQtQtQtQtQtQtQtQtby.Vae.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbja4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.1#fQtQtQtQtQtQtQtQtQtQt.j#W.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbabyQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.n.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#e.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#3bF.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbta4QtQtQtQtQtQtQtQtQtQtQtQtQt.PaJ.e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.FbGQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.b#C.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#RaJQtQtQtQtQtQtQtQtQtbH.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#O#PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.3.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaCahQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta0#W.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#BaWQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P#S#J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.f.R.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#mbI.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#8.jQtQtQtQtQtQt#t.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#B#aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s.O.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gazQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.ZbJ.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gax.WQtQtQtQtQtQtQtQtQtQtQtQtQtQt#DbK#F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga3#YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#YbL.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbM#UQtQtQtQtbd#F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ubbQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaR.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gboQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Z#1.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ea8QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#ma2.y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaC#S.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Ma7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#g.IaN#pbNbq#0anbEbe.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbOaQQtQtac#r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fadQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbP.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gam.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#DbE.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ybH.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Man.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.8#PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbw##.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.F#C#A.3.bQtQtQtQtQtQtQtQt.jaQaSbK.x.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbQ.3.sab.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbzQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Y.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#v#sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbq.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#K.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaX.x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#dbRQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbH.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#Bagaf.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#LaobJ#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.lan.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbpQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#L.q.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#hQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.1#GQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jadbS.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.kaDQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P.S.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.FbTbyQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Ybf#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#W.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaIam.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gagQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbU.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga##UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.baB.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbBajQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtby.6.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ubv.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaI#c.L.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#K.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Z.e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.O.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbV.l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaFa6QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Dai#R.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#CacQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#baP.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbJaQQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#mbWau.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaK.HQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.zaa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaF#mQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m.I.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#R.ravQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#4bN.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gae#jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta8.B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#F#hQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#4.8.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaYaQQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbl#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaY.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P#K.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbm#ZQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Ubt.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mal#UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#G#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbO.wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#AbB.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gapa5QtQtQtQtQtQtQtQtQtQtQtQtQtQtac.X.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gam.aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta8.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.Nai#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbX.Q.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gamahQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbz.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbY#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m.X.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaC.AQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Y#J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaTacQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbS#jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtavbz.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.lajQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.sal.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.X.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaS#l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5aOQtQtQtQtQtQtQtQtQtQtQtQtQtaI.k.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbZavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#b0az#Tb1.e#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaA.DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtacb2#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mbk.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.obJ.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaM.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m.k.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mbDQtQtQtQtQtQtQtQtQtQtQtQt.j.v#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fbHQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##EaJb2#5bL.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gapbi.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaw.K#R.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.4.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaQbj.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gb3QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.v#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaEQtQtQtQtQtQtQtQtQtQtQtQt.3bF.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gauaUQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.b#sbR#H.k#e#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#iaXQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#bax#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbY#UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbV.C.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gb#.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbdbE.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaiQtQtQtQtQtQtQtQtQtQtQtaQbZ#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbObdQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.wafbA.K.8.I.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m#0#PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbd#p.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga3.HQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaS#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbE.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.bbp.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbq.jQtQtQtQtQtQtQtQtQt#UbT.L.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5bT.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtavah.Ybcaxa3.B.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaCbs.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb0b#.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.h#UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaz.y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.CaIQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.iaa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#K.bQtQtQtQtQtQtQtQt.jbD#O.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaPa0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P.Z#Madbz.n.4#KaF.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbS.ZQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Uaq.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaqavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#Bb4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtar#5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaK.HQtQtQtQtQtQtQtQt#s.x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.Nbp.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##4#6aG#kai.4.8bEbQ#y.g.g.g.g.g.g.g.g.g.g#F.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta0.G.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#p.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtavbo.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.N.iQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#S#v.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbSaQQtQtQtQtQtQtQt#D.n.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#Na8QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#D#4#Maj#nbTalbq#K#X.dQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#abq.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#9QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtacaT.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#FaL.B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaMQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#aam.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.Ba5QtQtQtQtQtQtQt.7aV.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#d#S.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.E.0.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.madQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#baF.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gb1#PQt.U.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.O.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.o#0.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.F.3QtQtQtQtQtQtaIbN.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m.0#LQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.a.S.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ya6QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#V.B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.FbRQtQtQt.v.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbe#4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.l.AQtQtQtQtQtQt#3.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbabCQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbdaZ.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#.#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbu#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#pawQtQtQt#V#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaGQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta3.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gau#6QtQtQtQtQtav#c.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#F.9.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#fbO.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.dQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.p#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.B.YQtQtQtQt.DaV.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#RaOQtQtQtQtQt.D#2.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.maxawQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbDaC.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m.cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#c.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#C#mQtQtQtQt.jb#.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.I.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.A.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.T.YQtQtQtQtQt.ZaF.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbE.UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb4#..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#l.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#U.k.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#O.7QtQtQtQtQtQtbT.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fbbQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#sap.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.faJQtQtQtQtQtah#o.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.F#S.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Wb5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#L.O.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mag.HQtQtQtQtQtQt.Y.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.KQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta0.1.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gb6QtQtQtQtQt#Pae.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.NagarQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbv.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5bVQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.E.I.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#OaSQtQtQtQtQtQtQtb0#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbS.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#M#d.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#kQtQtQtQtQtacbm.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.O#VQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbW.g.g.g.g.g.g.g.g.g.g.g.g.g.gaT.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbP.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gabarQtQtQtQtQtQtQta8a7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m#wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Y#v.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbkQtQtQtQtQt.saT.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbBbl.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.S.g.g.g.g.g.g.g.g.g.g.g.g.g.g.7QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.J.y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#gbc.jQtQtQtQtQtQtQtaS.L.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#7QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.9.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaiQtQtQtQtQtQtbH.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#g.KacQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s#5.g.g.g.g.g.g.g.g.g.g.g.g.gas.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.n.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaabbQtQtQtQtQtQtQt.j#k.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaY.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jai.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.S.jQtQtQtQtQtb0#R.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#2#sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Uat.g.g.g.g.g.g.g.g.g.g.g.g.g#tQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.ob7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga1#LQtQtQtQtQtQtQt#mb1.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mbPQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#b5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#Q.sQtQtQtQtQt.Pbm.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaa#A.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.A.N.g.g.g.g.g.g.g.g.g.g.g.g#N.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#PbE.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.N.r.sQtQtQtQtQtQtQt#Mae.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaraH.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.X.sQtQtQtQtQtQtbi.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5bh.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.d.g.g.g.g.g.g.g.g.g.g.g.g.gaUQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Vaa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbB#jQtQtQtQtQtQtQt.jaE.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaV.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#4#r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.d.jQtQtQtQtQtQt#Daa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#Kb4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Haa.g.g.g.g.g.g.g.g.g.g.g.g.eavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Yau.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbIaIQtQtQtQtQtQtQtarb#.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m#jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.AbB.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.n.jQtQtQtQtQtQtQta..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaeaUQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaU.g.g.g.g.g.g.g.g.g.g.g.g.gbAQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbH.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fb8.sQtQtQtQtQtQtQtbC#O.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbnQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbU#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbkQtQtQtQtQtQtQtQt#m#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#RaM#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtat.g.g.g.g.g.g.g.g.g.g.g.gap.HQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtavaA.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.1bGQtQtQtQtQtQtQt.jbv.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.C.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaR#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbHQtQtQtQtQtQtQtQtQt#c.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaqa5QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.t.g.g.g.g.g.g.g.g.g.g.g.g.gb8QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtarbI.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaH.wQtQtQtQtQtQtQtaDab.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.baA.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.TbgQtQtQtQtQtQtQtQtQt.Z#u.g.g.g.g.g.g.g.g.g.g.g.g.g.gaY#GQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.M.g.g.g.g.g.g.g.g.g.g.g.g.gau#YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbd.Q.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mbp.PQtQtQtQtQtQtQt#f#l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtawaH.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#dafQtQtQtQtQtQtQtQtQtQt.0.g.g.g.g.g.g.g.g.g.g.g.g.g.gag#DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbu.g.g.g.g.g.g.g.g.g.g.g.g.g.g#NavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaS#d.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ubUQtQtQtQtQtQtQt.ja.#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.u#LQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb0ae.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#r.EQtQtQtQtQtQtQtQtQtQt.3.N.g.g.g.g.g.g.g.g.g.g.g.g.u.YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jb0b9.l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbpQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.v.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gasa4QtQtQtQtQtQtQt#L.8.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.vQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaU#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga1.DQtQtQtQtQtQtQtQtQtQtQtbY.g.g.g.g.g.g.g.g.g.g.g.g#Oa4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.b#aadbKak.O.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.maOQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.sbh.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga2avQtQtQtQtQtQtQtbbaa.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#2.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.R.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gal.PQtQtQtQtQtQtQtQtQtQtQt#6.g.g.g.g.g.g.g.g.g.g.g.g.1ahQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m.7bkb#aY#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbBaQQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.o#5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#FbXQtQtQtQtQtQtQt.jbK#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.yb4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Dan.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.yb6QtQtQtQtQtQtQtQtQtQtQtQtQtbt.g.g.g.g.g.g.g.g.g.g.gaC#ZQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P#wbpba.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#KavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.wat.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbE#YQtQtQtQtQtQtQtawa1.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#9QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#bat.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.e#VQtQtQtQtQtQtQtQtQtQtQtQtQtaf.g.g.g.g.g.g.g.g.g.g.g.gaoQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.U.S#d.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#W.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta8#J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga#.#QtQtQtQtQtQtQtbP#J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.e.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbbbB.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.0.WQtQtQtQtQtQtQtQtQtQtQtQtQtQta9.g.g.g.g.g.g.g.g.g.g.gaq.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#Pbs#..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga#.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbXau.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.L#qQtQtQtQtQtQtQt.sb9.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#k.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.laJQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaO.g.g.g.g.g.g.g.g.g.g.g#B#PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##A.6.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#8QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbc.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbabdQtQtQtQtQtQtQtaQ#K.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaAQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Han.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#N.MQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.O.g.g.g.g.g.g.g.g.g.g.gbDQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.U.S#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaBQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.b.0.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbZ#UQtQtQtQtQtQtQt#j#1.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#J.DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#abL.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mbpavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.7.g.g.g.g.g.g.g.g.g.g.g#5QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.2bs#..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.maLQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaQ.x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ybDQtQtQtQtQtQtQt.sbk.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#A#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbBaOQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jas.g.g.g.g.g.g.g.g.g.g.FaQQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#wan.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbx.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta8#o.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.qbVQtQtQtQtQtQtQtaI#x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gb5QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtav.K.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaNaQQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#3.g.g.g.g.g.g.g.g.g.g.g#qQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.W.taP.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gb5.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaG#v.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#C.oQtQtQtQtQtQtQt.ibB.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.QacQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.w.x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.L#n.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbj.g.g.g.g.g.g.g.g.g.gb5QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb4a#be.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#2.DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jaM.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#vaoQtQtQtQtQtQtQt.s#8.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#y#sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbXa7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbF.aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbu.g.g.g.g.g.g.g.g.g.gapaDQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.PaU#x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.q.aQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.HbJ.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#r#sQtQtQtQtQtQtQt.2bI.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbQ.T.g.g.g.g.g.g.g.g.g.g.g.g.g#AQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.D#Q.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaubr.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#i.g.g.g.g.g.g.g.g.g.gbXQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaw.r#o.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gapaXQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.MaF.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbq.WQtQtQtQtQtQtQt.cap.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbtad#U.m.g.g.g.g.g.g.g.g.g.g.g.g.nQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaO#l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ga9a5QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.c.g.g.g.g.g.g.g.g.g.g#WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#6.l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#u#AQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#j.u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ubgQtQtQtQtQtQtQt.Pb8.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#R.4#VQtQt#4.g.g.g.g.g.g.g.g.g.g.g.g#T.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.obn.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#u.V.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaZ.g.g.g.g.g.g.g.g.g.B#mQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P.e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbk.jQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbA.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbSa0QtQtQtQtQtQtQt#P#2.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbB#8aQQtQtQtQt#w.g.g.g.g.g.g.g.g.g.g.g#8QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbC.I.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbjbVQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.w.T.g.g.g.g.g.g.g.g.gbUQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbq.#QtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtav.S.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.kbyQtQtQtQtQtQtQtbGa7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gatbl.bQtQtQtQtQtQtaJ.g.g.g.g.g.g.g.g.g#g#kQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#bp.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#va..PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#9.g.g.g.g.g.g.g.g.g.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb9#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.OawQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#P.x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.y.9.jQtQtQtQtQtQt.P#H.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#R#WbCQtQtQtQtQtQtQtQtQtbc.g.g.g.g.g.g.g.g#1bPQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.i.q.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.6#YQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.C.g.g.g.g.g.g.g.g#oacQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.3bfap.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbQ.3QtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbPbB.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.C.zQtQtQtQtQtQtQt.#aN.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaYbcaDQtQtQtQtQtQtQtQtQtQtQt#7.g.g.g.g.g.g.ga3.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.EbJ.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbB#A.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaQ.g.g.g.g.g.g.g.g.gbGQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##b.A#3blbHbh.0aqasbS#F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.l.7QtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbH#g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gb1#mQtQtQtQtQtQtQtavbY.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.NbY.7.jQtQtQtQtQtQtQtQtQtQtQtQtQtb7.g.g.g.g.g#gbk.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtacb..y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.mbZ.DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#G.g.g.g.g.g.g.g.gbZQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtav#Pa0bGaz#k.naxb1.x.e.u.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#gbrQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtby.G.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.TaE.jQtQtQtQtQtQtQt.j#p.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#1#H#bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtas.g.g.g.gaY#MQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtar#9#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.q#fQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#9.g.g.g.g.g.g.gbQ.HQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P.2#V#3.vbT#7aZaP#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gagavQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#a#r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#obCQtQtQtQtQtQtQtQtQtbs.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.Cb3bGavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#o.g.g.g.0.HQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaQ#caC.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g##bT.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtab.g.g.g.g.g.g.m#jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s#YbUbH#Q#o.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbF#mQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaG#y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaNaDQtQtQtQtQtQtQtQtQtbG.N.g.g.g.g.g.g.g.g.g.g.g.g.g.FbF.r#s.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbe.g#dbwQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#M.X##.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.8a5QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#e.g.g.g.g.g.ga#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbVbs#r.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.QahQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaval.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#gbs.jQtQtQtQtQtQtQtQtQtQt.p.0.hbL#lbeaC#F.FbS.Ob7#8#z.ZQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Uan.wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaIbcam.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.I#GQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Q.g.g.g.g.gbS.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j#6b7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#FaOQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#PaH.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#J#wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb4#ka1.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaCa..bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaa.g.g.g.g.fbbQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#fas.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#gbrQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#wbB.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#KawQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaIaWaAae.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.m#Q.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#d.g.g.g.ga2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jaE.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gagav", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.sbT.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.N.R.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#U#fbH.kae.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#i#MQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt##.g.g.g#r#UQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbb.B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbF", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#4aH.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gapafQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.E#IagbE.5.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbBao.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#d.g.g.TaXQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaw#Wbe.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#h.l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.h.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.D#t#8.6.F.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#y.nbyQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbS.g.gbAQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtby.3#t#nbW.Xab#Xap.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m#p.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.maM.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P#Vbr#Q#r.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gau#c#LQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#i.gbfQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtav.a#6#A.Valana9aV#v.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.i#l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.1.7QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.waWbxaHau.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gauaiawQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQta1#2avQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.H.E#6bwbA#9bfaZaH.e#d.m.g.g.g.g.g", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#ai.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.6.wQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#DbPa.#5#l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#vbxaQQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#9#LQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtav.w.Abu.vbs", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb0#e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ybg.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jb4.vbZ#e.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g##alaIQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#U#T.T.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.xa5QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaI#z#H#K#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.B#9aIQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#w.e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ya..sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m.7.rb1#l.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#2#qavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtac.S.m.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.x#EQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.WbPbvb5bS.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#Jb..3QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Y#J.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbSbw.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.Ubz#Q.q.N.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaubqbG.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaI.k.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#d#k.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Pb0#S.Xat.y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#FbM#q.WQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbi#B.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.ybx#mQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jah#Ia#.Oau.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.IbfbGavQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtbVa3.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ya##4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.a#qai.hbe.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#Jbqbia4QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.##9.y.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.BbT#mQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaQ#zaM.6a7.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#ybta2#A#4.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQt#j.e.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gaP.J.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#madbn#..g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.LaKbq.radbV.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtaD#C.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#y#W.c.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.P#qbt.f.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g##.eaybZbK#A.UaDQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQt.j#I.1.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.Nay#h.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtarbs#O.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.5aVbI.0bk#h#6.2.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQt.E#x.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gat.V.2QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbA.L.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.N#oaH#0aM.v#ja4.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQt.b.r#u.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.gbeb7#n#PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtaw#2.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.l#.ayaxbk.J.ia5avQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQt#6am.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.fbabh#w.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#sae.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#g#O.x#p#cbz#zb0.DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQt#m.X.m.g.g.g.g.g.g.g.g.g.g.g.g.l#xaM#3.DQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.Eap.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g#dbaabbfbKbD#6#b.PQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQt.jbRbB.g.g.g.g.g.g.g.g.g#vaKakbA#E.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#LbQ.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.TaaataN.0b2bzbw#f#4.#QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"Qt#Y.6.g.g.g.g.g.NbSb1aM#qah.sQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.jbJ.g.g.g.g.g.g.l.IaH.Ga#b9.v#3b0aw.jQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtaaaY#KbfaEajb4.bQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtb0.4bhaL#A#wa5.oQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; diff --git a/src/win32/icon1.ico b/src/win32/icon1.ico index bf8c00ce1422b0d55c28199470acb0e1e41d3f6e..d8013f4944e53223d4d69462d94426c00622c43f 100644 GIT binary patch literal 32805 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 literal 1453926 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

      `4 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 M(GVC70g6HZ0FUcDVgLXD From a82e3b9dfe627b2981694f4c7ba33270c3c18d8d Mon Sep 17 00:00:00 2001 From: MrRaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:51:48 +0200 Subject: [PATCH 123/414] Add missing GC write barrier --- src/common/objects/dobject.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/objects/dobject.cpp b/src/common/objects/dobject.cpp index 4ba504738..e124a975c 100644 --- a/src/common/objects/dobject.cpp +++ b/src/common/objects/dobject.cpp @@ -330,6 +330,7 @@ void DObject::Destroy () } OnDestroy(); ObjectFlags = (ObjectFlags & ~OF_Fixed) | OF_EuthanizeMe; + GC::WriteBarrier(this); } DEFINE_ACTION_FUNCTION(DObject, Destroy) From c02d041b237991854b09bea5d5c2e94bdcc20c11 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 30 Jun 2024 19:44:00 +0200 Subject: [PATCH 124/414] Enable MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS for Apple --- .../ZVulkan/include/zvulkan/vulkaninstance.h | 2 +- libraries/ZVulkan/src/vulkaninstance.cpp | 73 +++++++++++++++++-- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/libraries/ZVulkan/include/zvulkan/vulkaninstance.h b/libraries/ZVulkan/include/zvulkan/vulkaninstance.h index 1074ce420..ae8ec33e3 100644 --- a/libraries/ZVulkan/include/zvulkan/vulkaninstance.h +++ b/libraries/ZVulkan/include/zvulkan/vulkaninstance.h @@ -65,7 +65,7 @@ public: std::vector AvailableLayers; std::vector AvailableExtensions; - std::set EnabledValidationLayers; + std::set EnabledLayers; std::set EnabledExtensions; std::vector PhysicalDevices; diff --git a/libraries/ZVulkan/src/vulkaninstance.cpp b/libraries/ZVulkan/src/vulkaninstance.cpp index 0641d3987..cc5719ced 100644 --- a/libraries/ZVulkan/src/vulkaninstance.cpp +++ b/libraries/ZVulkan/src/vulkaninstance.cpp @@ -65,7 +65,7 @@ void VulkanInstance::CreateInstance() { if (layer.layerName == debugLayer) { - EnabledValidationLayers.insert(layer.layerName); + EnabledLayers.insert(layer.layerName); EnabledExtensions.insert(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); debugLayerFound = true; break; @@ -73,6 +73,61 @@ void VulkanInstance::CreateInstance() } } + // Are we running on Apple's horrible platform? + std::string moltenVKLayer = "MoltenVK"; // kMVKMoltenVKDriverLayerName + bool moltenVKLayerFound = false; + for (const VkLayerProperties& layer : AvailableLayers) + { + if (layer.layerName == moltenVKLayer) + { + EnabledLayers.insert(layer.layerName); + EnabledExtensions.insert("VK_EXT_layer_settings"); + moltenVKLayerFound = true; + break; + } + } + + // Provided by VK_EXT_layer_settings (not sure why volk doesn't have this...) + enum VkLayerSettingTypeEXT + { + VK_LAYER_SETTING_TYPE_BOOL32_EXT = 0, + VK_LAYER_SETTING_TYPE_INT32_EXT = 1, + VK_LAYER_SETTING_TYPE_INT64_EXT = 2, + VK_LAYER_SETTING_TYPE_UINT32_EXT = 3, + VK_LAYER_SETTING_TYPE_UINT64_EXT = 4, + VK_LAYER_SETTING_TYPE_FLOAT32_EXT = 5, + VK_LAYER_SETTING_TYPE_FLOAT64_EXT = 6, + VK_LAYER_SETTING_TYPE_STRING_EXT = 7, + }; + struct VkLayerSettingEXT + { + const char* pLayerName; + const char* pSettingName; + VkLayerSettingTypeEXT type; + uint32_t valueCount; + const void* pValues; + }; + struct VkLayerSettingsCreateInfoEXT + { + VkStructureType sType; + const void* pNext; + uint32_t settingCount; + const VkLayerSettingEXT* pSettings; + }; + const VkStructureType VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT = (VkStructureType)1000496000; + + std::vector layersettings; + int32_t mkvalue2 = 2; + if (moltenVKLayerFound) + { + VkLayerSettingEXT setting = {}; + setting.pLayerName = "MoltenVK"; + setting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; + setting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; + setting.pValues = &mkvalue2; // Use Metal Argument Buffers only if the VK_EXT_descriptor_indexing extension is enabled + layersettings.push_back(setting); + } + // Enable optional instance extensions we are interested in for (const auto& ext : AvailableExtensions) { @@ -82,9 +137,9 @@ void VulkanInstance::CreateInstance() } } - std::vector enabledValidationLayersCStr; - for (const std::string& layer : EnabledValidationLayers) - enabledValidationLayersCStr.push_back(layer.c_str()); + std::vector enabledLayersCStr; + for (const std::string& layer : EnabledLayers) + enabledLayersCStr.push_back(layer.c_str()); std::vector enabledExtensionsCStr; for (const std::string& ext : EnabledExtensions) @@ -106,10 +161,16 @@ void VulkanInstance::CreateInstance() createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; createInfo.enabledExtensionCount = (uint32_t)EnabledExtensions.size(); - createInfo.enabledLayerCount = (uint32_t)enabledValidationLayersCStr.size(); - createInfo.ppEnabledLayerNames = enabledValidationLayersCStr.data(); + createInfo.enabledLayerCount = (uint32_t)enabledLayersCStr.size(); + createInfo.ppEnabledLayerNames = enabledLayersCStr.data(); createInfo.ppEnabledExtensionNames = enabledExtensionsCStr.data(); + VkLayerSettingsCreateInfoEXT layerSettingsInfo = { VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT }; + layerSettingsInfo.settingCount = (uint32_t)layersettings.size(); + layerSettingsInfo.pSettings = layersettings.data(); + if (moltenVKLayerFound) + createInfo.pNext = &layerSettingsInfo; + result = vkCreateInstance(&createInfo, nullptr, &Instance); if (result >= VK_SUCCESS) { From d649a75e7504795d7fab23dc553f1efde869c5a5 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 30 Jun 2024 19:48:42 +0200 Subject: [PATCH 125/414] Add missing value count --- libraries/ZVulkan/src/vulkaninstance.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ZVulkan/src/vulkaninstance.cpp b/libraries/ZVulkan/src/vulkaninstance.cpp index cc5719ced..169dd6daa 100644 --- a/libraries/ZVulkan/src/vulkaninstance.cpp +++ b/libraries/ZVulkan/src/vulkaninstance.cpp @@ -124,6 +124,7 @@ void VulkanInstance::CreateInstance() setting.pLayerName = "MoltenVK"; setting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; setting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; + setting.valueCount = 1; setting.pValues = &mkvalue2; // Use Metal Argument Buffers only if the VK_EXT_descriptor_indexing extension is enabled layersettings.push_back(setting); } From 8b0bae0abf3d67f9424cb77c566de95c452198fd Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 2 Jul 2024 07:52:31 -0400 Subject: [PATCH 126/414] - remove the useless build scripts that caused more confusion than they helped --- auto-setup-linux.sh | 104 ------------------------------------- auto-setup-windows-arm.cmd | 89 ------------------------------- auto-setup-windows.cmd | 82 ----------------------------- 3 files changed, 275 deletions(-) delete mode 100755 auto-setup-linux.sh delete mode 100644 auto-setup-windows-arm.cmd delete mode 100644 auto-setup-windows.cmd diff --git a/auto-setup-linux.sh b/auto-setup-linux.sh deleted file mode 100755 index c6c09cbf5..000000000 --- a/auto-setup-linux.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash -#** -#** auto-setup-linux.sh -#** Automatic (easy) setup and build script for Linux -#** -#** Note that this script assumes you have both 'git' and 'cmake' installed properly and in your PATH! -#** This script also assumes you have installed a build system that cmake can automatically detect. -#** Such as GCC or Clang. Requires appropriate supporting libraries installed too! -#** Without these items, this script will FAIL! So make sure you have your build environment properly -#** set up in order for this script to succeed. -#** -#** The purpose of this script is to get someone easily going with a full working compile of GZDoom. -#** This allows anyone to make simple changes or tweaks to the engine as they see fit and easily -#** compile their own copy without having to follow complex instructions to get it working. -#** Every build environment is different, and every computer system is different - this should work -#** in most typical systems under Windows but it may fail under certain types of systems or conditions. -#** Not guaranteed to work and your mileage will vary. -#** -#** Prerequisite Packages used in testing (from Linux Mint-XFCE): -#** nasm autoconf libtool libsystemd-dev clang-15 libx11-dev libsdl2-dev libgtk-3-dev -#** -#**--------------------------------------------------------------------------- -#** Copyright 2024 Rachael Alexanderson and the GZDoom team -#** All rights reserved. -#** -#** Redistribution and use in source and binary forms, with or without -#** modification, are permitted provided that the following conditions -#** are met: -#** -#** 1. Redistributions of source code must retain the above copyright -#** notice, this list of conditions and the following disclaimer. -#** 2. Redistributions in binary form must reproduce the above copyright -#** notice, this list of conditions and the following disclaimer in the -#** documentation and/or other materials provided with the distribution. -#** 3. The name of the author may not be used to endorse or promote products -#** derived from this software without specific prior written permission. -#** -#** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -#** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -#** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -#** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -#** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -#** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -#** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -#** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -#** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -#** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#**--------------------------------------------------------------------------- -#** - -# -- Always operate within the build folder -BUILDFOLDER=$(dirname "$0")/build - -if [ ! -d "$BUILDFOLDER" ]; then - mkdir "$BUILDFOLDER" -fi -cd "$BUILDFOLDER" - -if [ -d "vcpkg" ]; then - git -C ./vcpkg pull -fi -if [ ! -d "vcpkg" ]; then - git clone https://github.com/microsoft/vcpkg -fi -if [ -d "zmusic" ]; then - git -C ./zmusic fetch -fi -if [ ! -d "zmusic" ]; then - git clone https://github.com/zdoom/zmusic -fi -if [ -d "zmusic" ]; then - git -C ./zmusic checkout 1.1.12 -fi - -if [ ! -d "zmusic/build" ]; then - mkdir zmusic/build -fi -if [ ! -d "vcpkg_installed" ]; then - mkdir vcpkg_installed -fi - -cmake -S ./zmusic -B ./zmusic/build \ - -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake \ - -DVCPKG_LIBSNDFILE=1 \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DVCPKG_INSTALLLED_DIR=../vcpkg_installed/ -pushd ./zmusic/build -make -j $(nproc) -popd - -cmake -S .. -B . \ - -DCMAKE_TOOLCHAIN_FILE=./vcpkg/scripts/buildsystems/vcpkg.cmake \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DVCPKG_INSTALLLED_DIR=./vcpkg_installed/ -make -j $(nproc); rc=$? - -# -- If successful, show the build -if [ $rc -eq 0 ]; then - if [ -f vkdoom ]; then - xdg-open . - fi -fi - -exit $rc diff --git a/auto-setup-windows-arm.cmd b/auto-setup-windows-arm.cmd deleted file mode 100644 index 01c9b13d8..000000000 --- a/auto-setup-windows-arm.cmd +++ /dev/null @@ -1,89 +0,0 @@ -@echo off -goto aftercopyright - -** -** auto-setup-windows-arm.cmd -** Automatic (easy) setup and build script for Windows ARM (cross compiling on x64) - please have a -** build of x64 in your build folder ready before executing this script! -** -** Note that this script assumes you have both 'git' and 'cmake' installed properly and in your PATH! -** This script also assumes you have installed a build system that cmake can automatically detect. -** Such as Visual Studio Community. Requires appropriate SDK installed too! -** Without these items, this script will FAIL! So make sure you have your build environment properly -** set up in order for this script to succeed. -** -** The purpose of this script is to get someone easily going with a full working compile of GZDoom. -** This allows anyone to make simple changes or tweaks to the engine as they see fit and easily -** compile their own copy without having to follow complex instructions to get it working. -** Every build environment is different, and every computer system is different - this should work -** in most typical systems under Windows but it may fail under certain types of systems or conditions. -** Not guaranteed to work and your mileage will vary. -** -**--------------------------------------------------------------------------- -** Copyright 2024 Rachael Alexanderson and the GZDoom team -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** - -:aftercopyright - - -setlocal -rem -- Always operate within the build-arm folder -if not exist "%~dp0\build-arm" mkdir "%~dp0\build-arm" -pushd "%~dp0\build-arm" - -if exist ..\build\vcpkg if exist ..\build\vcpkg\* git -C ../build/vcpkg pull -if not exist ..\build\vcpkg goto :nobuild - -if exist zmusic if exist zmusic\* git -C ./zmusic pull -if not exist zmusic git clone https://github.com/zdoom/zmusic - -mkdir "%~dp0\build-arm\zmusic\build" -mkdir "%~dp0\build-arm\vcpkg_installed" - -cmake -A ARM64 -S ./zmusic -B ./zmusic/build ^ - -DCMAKE_TOOLCHAIN_FILE=../../build/vcpkg/scripts/buildsystems/vcpkg.cmake ^ - -DVCPKG_LIBSNDFILE=1 ^ - -DVCPKG_INSTALLLED_DIR=../vcpkg_installed/ ^ - -DCMAKE_CROSSCOMPILING=TRUE -cmake --build ./zmusic/build --config Release -- -maxcpucount -verbosity:minimal - -cmake -A ARM64 -S .. -B . ^ - -DCMAKE_TOOLCHAIN_FILE=../build/vcpkg/scripts/buildsystems/vcpkg.cmake ^ - -DZMUSIC_INCLUDE_DIR=./zmusic/include ^ - -DZMUSIC_LIBRARIES=./zmusic/build/source/Release/zmusic.lib ^ - -DVCPKG_INSTALLLED_DIR=./vcpkg_installed/ ^ - -DFORCE_CROSSCOMPILE=TRUE ^ - -DIMPORT_EXECUTABLES=../build/ImportExecutables.cmake -cmake --build . --config RelWithDebInfo -- -maxcpucount -verbosity:minimal - -rem -- If successful, show the build -if exist RelWithDebInfo\vkdoom.exe explorer.exe RelWithDebInfo - -goto :eof -:nobuild -echo Please use auto-setup-windows.cmd to create an x64 build first! diff --git a/auto-setup-windows.cmd b/auto-setup-windows.cmd deleted file mode 100644 index 845dc1710..000000000 --- a/auto-setup-windows.cmd +++ /dev/null @@ -1,82 +0,0 @@ -@echo off -goto aftercopyright - -** -** auto-setup-windows.cmd -** Automatic (easy) setup and build script for Windows -** -** Note that this script assumes you have both 'git' and 'cmake' installed properly and in your PATH! -** This script also assumes you have installed a build system that cmake can automatically detect. -** Such as Visual Studio Community. Requires appropriate SDK installed too! -** Without these items, this script will FAIL! So make sure you have your build environment properly -** set up in order for this script to succeed. -** -** The purpose of this script is to get someone easily going with a full working compile of GZDoom. -** This allows anyone to make simple changes or tweaks to the engine as they see fit and easily -** compile their own copy without having to follow complex instructions to get it working. -** Every build environment is different, and every computer system is different - this should work -** in most typical systems under Windows but it may fail under certain types of systems or conditions. -** Not guaranteed to work and your mileage will vary. -** -**--------------------------------------------------------------------------- -** Copyright 2023-2024 Rachael Alexanderson and the GZDoom team -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** - -:aftercopyright - -setlocal enableextensions - -rem -- Always operate within the build folder -if not exist "%~dp0\build" mkdir "%~dp0\build" -pushd "%~dp0\build" - -if exist vcpkg if exist vcpkg\* git -C ./vcpkg pull -if not exist vcpkg git clone https://github.com/microsoft/vcpkg - -if exist zmusic if exist vcpkg\* git -C ./zmusic pull -if not exist zmusic git clone https://github.com/zdoom/zmusic - -if not exist "%~dp0\build\zmusic\build" mkdir "%~dp0\build\zmusic\build" -if not exist "%~dp0\build\vcpkg_installed" mkdir "%~dp0\build\vcpkg_installed" - -cmake -A x64 -S ./zmusic -B ./zmusic/build ^ - -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake ^ - -DVCPKG_LIBSNDFILE=1 ^ - -DVCPKG_INSTALLLED_DIR=../vcpkg_installed/ -cmake --build ./zmusic/build --config Release -- -maxcpucount -verbosity:minimal - -cmake -A x64 -S .. -B . ^ - -DCMAKE_TOOLCHAIN_FILE=./vcpkg/scripts/buildsystems/vcpkg.cmake ^ - -DZMUSIC_INCLUDE_DIR=./zmusic/include ^ - -DZMUSIC_LIBRARIES=./zmusic/build/source/Release/zmusic.lib ^ - -DVCPKG_INSTALLLED_DIR=./vcpkg_installed/ -cmake --build . --config RelWithDebInfo -- -maxcpucount -verbosity:minimal - -rem -- If successful, show the build -if not errorlevel 1 if exist RelWithDebInfo\vkdoom.exe explorer.exe RelWithDebInfo - From 9a81932b2559fc9af8a74d146b484baddd5c6430 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 2 Jul 2024 08:18:50 -0400 Subject: [PATCH 127/414] - add a small little build guide to replace the now missing build scripts --- build-guide.txt | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 build-guide.txt diff --git a/build-guide.txt b/build-guide.txt new file mode 100644 index 000000000..c6228ea23 --- /dev/null +++ b/build-guide.txt @@ -0,0 +1,34 @@ +For Windows, you need the latest version of Visual Studio, Windows SDK, Git, and CMake to build VkDoom. + +For Linux, you need the following: +* libsdl2-dev +* libopenal-dev +* libvpx-dev +* git +* cmake + +For Mac, I recommend you use the following project, as it contains all the dependencies and makes building easy: +* https://github.com/ZDoom/zdoom-macos-deps + + +After you have the packages installed, cd into your projects dir, and do the following to clone: +* git clone https://github.com/dpjudas/VkDoom + +Afterwards, cd into it +* cd VkDoom + +Make a build folder, then cd into it +* mkdir build +* cd build + +For Windows, run the following to prepare your build environment and the second command will build: +* cmake -A x64 .. +* cmake --build . --config Release -- -maxcpucount +(replace x64 with ARM64 if you're building on ARM64) + +For Linux, run the following to prepare your build environment and the second command will build: +* cmake .. -DCMAKE_BUILD_TYPE=Release +* make -j $(nproc) + +For Mac, if you're using zdoom-macos-deps, simply cd into it and type the following: +* ./build.py --target vkdoom From a69603997d0900bec9ede57009393c40f43de98c Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 2 Jul 2024 14:36:50 +0200 Subject: [PATCH 128/414] Move the build guide into README.md --- README.md | 36 ++++++++++++++++++++++++++++++++++++ build-guide.txt | 34 ---------------------------------- 2 files changed, 36 insertions(+), 34 deletions(-) delete mode 100644 build-guide.txt diff --git a/README.md b/README.md index a0ea1d01c..539f09518 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,39 @@ Visit our [website](https://vkdoom.org) for more details. ### Licensed under the GPL v3 ##### https://www.gnu.org/licenses/quick-guide-gplv3.en.html + +### Build Guide + +For Windows, you need the latest version of Visual Studio, Windows SDK, Git, and CMake to build VkDoom. + +For Linux, you need the following: +* libsdl2-dev +* libopenal-dev +* libvpx-dev +* git +* cmake + +For Mac, I recommend you use the following project, as it contains all the dependencies and makes building easy: +* https://github.com/ZDoom/zdoom-macos-deps + +After you have the packages installed, cd into your projects dir, and do the following to clone: +* git clone https://github.com/dpjudas/VkDoom + +Afterwards, cd into it +* cd VkDoom + +Make a build folder, then cd into it +* mkdir build +* cd build + +For Windows, run the following to prepare your build environment and the second command will build: +* cmake -A x64 .. +* cmake --build . --config Release -- -maxcpucount +(replace x64 with ARM64 if you're building on ARM64) + +For Linux, run the following to prepare your build environment and the second command will build: +* cmake .. -DCMAKE_BUILD_TYPE=Release +* make -j $(nproc) + +For Mac, if you're using zdoom-macos-deps, simply cd into it and type the following: +* ./build.py --target vkdoom diff --git a/build-guide.txt b/build-guide.txt deleted file mode 100644 index c6228ea23..000000000 --- a/build-guide.txt +++ /dev/null @@ -1,34 +0,0 @@ -For Windows, you need the latest version of Visual Studio, Windows SDK, Git, and CMake to build VkDoom. - -For Linux, you need the following: -* libsdl2-dev -* libopenal-dev -* libvpx-dev -* git -* cmake - -For Mac, I recommend you use the following project, as it contains all the dependencies and makes building easy: -* https://github.com/ZDoom/zdoom-macos-deps - - -After you have the packages installed, cd into your projects dir, and do the following to clone: -* git clone https://github.com/dpjudas/VkDoom - -Afterwards, cd into it -* cd VkDoom - -Make a build folder, then cd into it -* mkdir build -* cd build - -For Windows, run the following to prepare your build environment and the second command will build: -* cmake -A x64 .. -* cmake --build . --config Release -- -maxcpucount -(replace x64 with ARM64 if you're building on ARM64) - -For Linux, run the following to prepare your build environment and the second command will build: -* cmake .. -DCMAKE_BUILD_TYPE=Release -* make -j $(nproc) - -For Mac, if you're using zdoom-macos-deps, simply cd into it and type the following: -* ./build.py --target vkdoom From 130171d608c97fb81a5bd30c5595e9fd1c61f31c Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 2 Jul 2024 14:42:27 +0200 Subject: [PATCH 129/414] Add comment about builds --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 539f09518..525aff156 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,10 @@ Please see license files for individual contributor licenses. Visit our [website](https://vkdoom.org) for more details. -### Licensed under the GPL v3 -##### https://www.gnu.org/licenses/quick-guide-gplv3.en.html +### Releases + +We do not have any official release of VKDoom yet. You can however download a binary build +of the latest master branch commit at https://github.com/dpjudas/VkDoom/releases/tag/nightly ### Build Guide @@ -44,3 +46,6 @@ For Linux, run the following to prepare your build environment and the second co For Mac, if you're using zdoom-macos-deps, simply cd into it and type the following: * ./build.py --target vkdoom + +### Licensed under the GPL v3 +##### https://www.gnu.org/licenses/quick-guide-gplv3.en.html From 45c002225f2cdb40d149131e3410b675a9dc4aba Mon Sep 17 00:00:00 2001 From: Nash Muhandes Date: Wed, 3 Jul 2024 21:25:13 +0800 Subject: [PATCH 130/414] Styling fixes --- README.md | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 525aff156..1abc848f0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -## Welcome to VkDoom! +## Welcome to VKDoom! -VkDoom is a source port based on the DOOM engine with a focus on Vulkan and modern computers. +VKDoom is a source port based on the DOOM engine with a focus on Vulkan and modern computers. Please see license files for individual contributor licenses. @@ -8,12 +8,11 @@ Visit our [website](https://vkdoom.org) for more details. ### Releases -We do not have any official release of VKDoom yet. You can however download a binary build -of the latest master branch commit at https://github.com/dpjudas/VkDoom/releases/tag/nightly +We do not have any official release of VKDoom yet. You can however download a binary build of the latest master branch commit at https://github.com/dpjudas/VkDoom/releases/tag/nightly ### Build Guide -For Windows, you need the latest version of Visual Studio, Windows SDK, Git, and CMake to build VkDoom. +For Windows, you need the latest version of Visual Studio, Windows SDK, Git, and CMake to build VKDoom. For Linux, you need the following: * libsdl2-dev @@ -22,30 +21,48 @@ For Linux, you need the following: * git * cmake -For Mac, I recommend you use the following project, as it contains all the dependencies and makes building easy: -* https://github.com/ZDoom/zdoom-macos-deps +For Mac, the following project is recommended, as it contains all the dependencies and makes building easy: https://github.com/ZDoom/zdoom-macos-deps -After you have the packages installed, cd into your projects dir, and do the following to clone: -* git clone https://github.com/dpjudas/VkDoom +After you have the packages installed, `cd` into your projects directory, and do the following to clone: -Afterwards, cd into it -* cd VkDoom +``` +git clone https://github.com/dpjudas/VkDoom +``` -Make a build folder, then cd into it -* mkdir build -* cd build +Afterwards, `cd` into it + +``` +cd VkDoom +``` + +Make a build folder, then `cd` into it + +``` +mkdir build +cd build +``` For Windows, run the following to prepare your build environment and the second command will build: -* cmake -A x64 .. -* cmake --build . --config Release -- -maxcpucount + +``` +cmake -A x64 .. +cmake --build . --config Release -- -maxcpucount +``` + (replace x64 with ARM64 if you're building on ARM64) For Linux, run the following to prepare your build environment and the second command will build: -* cmake .. -DCMAKE_BUILD_TYPE=Release -* make -j $(nproc) + +``` +cmake .. -DCMAKE_BUILD_TYPE=Release +make -j $(nproc) +``` For Mac, if you're using zdoom-macos-deps, simply cd into it and type the following: -* ./build.py --target vkdoom + +``` +./build.py --target vkdoom +``` ### Licensed under the GPL v3 ##### https://www.gnu.org/licenses/quick-guide-gplv3.en.html From 971bd0b3cb0def2afa2526aa15c0d1cb9c8e20c6 Mon Sep 17 00:00:00 2001 From: Nash Muhandes Date: Wed, 3 Jul 2024 21:26:45 +0800 Subject: [PATCH 131/414] Add highlighting to the code blocks --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1abc848f0..d2ac74a6a 100644 --- a/README.md +++ b/README.md @@ -25,26 +25,26 @@ For Mac, the following project is recommended, as it contains all the dependenci After you have the packages installed, `cd` into your projects directory, and do the following to clone: -``` +```sh git clone https://github.com/dpjudas/VkDoom ``` Afterwards, `cd` into it -``` +```sh cd VkDoom ``` Make a build folder, then `cd` into it -``` +```sh mkdir build cd build ``` For Windows, run the following to prepare your build environment and the second command will build: -``` +```sh cmake -A x64 .. cmake --build . --config Release -- -maxcpucount ``` @@ -53,14 +53,14 @@ cmake --build . --config Release -- -maxcpucount For Linux, run the following to prepare your build environment and the second command will build: -``` +```sh cmake .. -DCMAKE_BUILD_TYPE=Release make -j $(nproc) ``` For Mac, if you're using zdoom-macos-deps, simply cd into it and type the following: -``` +```sh ./build.py --target vkdoom ``` From 415dfb859bb61578a7435aa6114337c3ae039b80 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 4 Jul 2024 00:58:54 +0200 Subject: [PATCH 132/414] Update glslang to 14.3.0 --- libraries/ZVulkan/CMakeLists.txt | 166 +- .../zvulkan/vk_mem_alloc/vk_mem_alloc.h | 2 +- .../glslang/StandAlone/DirStackFileIncluder.h | 149 + .../src/glslang/StandAlone/StandAlone.cpp | 2207 +++ .../ZVulkan/src/glslang/StandAlone/Worklist.h | 95 + .../src/glslang/StandAlone/spirv-remap.cpp | 402 + libraries/ZVulkan/src/glslang/build_info.h | 62 + .../CInterface/glslang_c_interface.cpp | 470 + .../glslang/GenericCodeGen/CodeGen.cpp | 8 +- .../glslang/glslang/GenericCodeGen/Link.cpp | 10 +- .../src/glslang/glslang/Include/BaseTypes.h | 61 +- .../src/glslang/glslang/Include/Common.h | 34 +- .../glslang/glslang/Include/ConstantUnion.h | 38 +- .../src/glslang/glslang/Include/InfoSink.h | 24 +- .../glslang/Include/InitializeGlobals.h | 2 +- .../src/glslang/glslang/Include/PoolAlloc.h | 23 +- .../glslang/glslang/Include/ResourceLimits.h | 9 + .../src/glslang/glslang/Include/ShHandle.h | 16 +- .../glslang/glslang/Include/SpirvIntrinsics.h | 34 +- .../src/glslang/glslang/Include/Types.h | 1200 +- .../src/glslang/glslang/Include/arrays.h | 29 +- .../glslang/Include/glslang_c_interface.h | 288 + .../glslang/Include/glslang_c_shader_types.h | 228 + .../glslang/glslang/Include/intermediate.h | 193 +- .../glslang/MachineIndependent/Constant.cpp | 71 +- .../glslang/MachineIndependent/Initialize.cpp | 1686 ++- .../glslang/MachineIndependent/Initialize.h | 3 + .../MachineIndependent/Intermediate.cpp | 255 +- .../MachineIndependent/ParseContextBase.cpp | 59 +- .../MachineIndependent/ParseHelper.cpp | 1835 ++- .../glslang/MachineIndependent/ParseHelper.h | 40 +- .../glslang/MachineIndependent/PoolAlloc.cpp | 48 +- .../glslang/MachineIndependent/Scan.cpp | 99 +- .../glslang/MachineIndependent/ShaderLang.cpp | 262 +- .../MachineIndependent/SpirvIntrinsics.cpp | 77 +- .../MachineIndependent/SymbolTable.cpp | 59 +- .../glslang/MachineIndependent/SymbolTable.h | 95 +- .../glslang/MachineIndependent/Versions.cpp | 155 +- .../glslang/MachineIndependent/Versions.h | 49 +- .../glslang/MachineIndependent/attribute.cpp | 15 +- .../glslang/MachineIndependent/attribute.h | 2 + .../glslang/MachineIndependent/glslang.y | 374 +- .../MachineIndependent/glslang_tab.cpp | 11828 ++++++++-------- .../MachineIndependent/glslang_tab.cpp.h | 602 +- .../glslang/MachineIndependent/intermOut.cpp | 130 +- .../glslang/MachineIndependent/iomapper.cpp | 131 +- .../glslang/MachineIndependent/iomapper.h | 33 +- .../glslang/MachineIndependent/limits.cpp | 2 - .../MachineIndependent/linkValidate.cpp | 557 +- .../MachineIndependent/localintermediate.h | 259 +- .../glslang/MachineIndependent/parseConst.cpp | 2 +- .../MachineIndependent/parseVersions.h | 83 +- .../MachineIndependent/preprocessor/Pp.cpp | 31 +- .../preprocessor/PpContext.cpp | 2 +- .../preprocessor/PpContext.h | 60 +- .../preprocessor/PpScanner.cpp | 123 +- .../preprocessor/PpTokens.cpp | 11 +- .../propagateNoContraction.cpp | 8 +- .../glslang/MachineIndependent/reflection.cpp | 139 +- .../glslang/MachineIndependent/reflection.h | 4 - .../glslang/glslang/MachineIndependent/span.h | 92 + .../glslang/OSDependent/Unix/CMakeLists.txt | 26 +- .../glslang/OSDependent/Unix/ossource.cpp | 145 - .../glslang/OSDependent/Web/CMakeLists.txt | 33 +- .../glslang/OSDependent/Web/glslang.js.cpp | 9 + .../glslang/OSDependent/Web/glslang.pre.js | 2 +- .../OSDependent/Windows/CMakeLists.txt | 20 +- .../glslang/OSDependent/Windows/ossource.cpp | 80 - .../glslang/glslang/OSDependent/osinclude.h | 19 - .../glslang/glslang/Public/ResourceLimits.h | 57 + .../src/glslang/glslang/Public/ShaderLang.h | 111 +- .../glslang/Public/resource_limits_c.h | 57 + .../glslang/ResourceLimits/ResourceLimits.cpp | 542 + .../ResourceLimits/resource_limits_c.cpp | 56 + .../ZVulkan/src/glslang/glslang/updateGrammar | 15 +- .../spirv/CInterface/spirv_c_interface.cpp | 120 + .../ZVulkan/src/glslang/spirv/GLSL.ext.ARM.h | 35 + .../ZVulkan/src/glslang/spirv/GLSL.ext.EXT.h | 3 + .../ZVulkan/src/glslang/spirv/GLSL.ext.KHR.h | 13 +- .../ZVulkan/src/glslang/spirv/GLSL.ext.NV.h | 9 + .../ZVulkan/src/glslang/spirv/GLSL.ext.QCOM.h | 43 + .../ZVulkan/src/glslang/spirv/GLSL.std.450.h | 2 +- .../src/glslang/spirv/GlslangToSpv.cpp | 2130 ++- .../ZVulkan/src/glslang/spirv/GlslangToSpv.h | 24 +- .../ZVulkan/src/glslang/spirv/Logger.cpp | 4 - libraries/ZVulkan/src/glslang/spirv/Logger.h | 9 - .../glslang/spirv/NonSemanticDebugPrintf.h | 10 +- .../spirv/NonSemanticShaderDebugInfo100.h | 171 + .../ZVulkan/src/glslang/spirv/SPVRemapper.cpp | 60 +- .../ZVulkan/src/glslang/spirv/SPVRemapper.h | 38 +- .../ZVulkan/src/glslang/spirv/SpvBuilder.cpp | 1489 +- .../ZVulkan/src/glslang/spirv/SpvBuilder.h | 233 +- .../src/glslang/spirv/SpvPostProcess.cpp | 111 +- .../ZVulkan/src/glslang/spirv/SpvTools.cpp | 53 + .../ZVulkan/src/glslang/spirv/SpvTools.h | 31 +- .../ZVulkan/src/glslang/spirv/disassemble.cpp | 120 +- libraries/ZVulkan/src/glslang/spirv/doc.cpp | 3234 +++-- libraries/ZVulkan/src/glslang/spirv/doc.h | 11 +- .../ZVulkan/src/glslang/spirv/hex_float.h | 13 - libraries/ZVulkan/src/glslang/spirv/spirv.hpp | 547 +- libraries/ZVulkan/src/glslang/spirv/spvIR.h | 111 +- libraries/ZVulkan/src/vulkanbuilders.cpp | 115 +- 102 files changed, 22984 insertions(+), 11958 deletions(-) create mode 100644 libraries/ZVulkan/src/glslang/StandAlone/DirStackFileIncluder.h create mode 100644 libraries/ZVulkan/src/glslang/StandAlone/StandAlone.cpp create mode 100644 libraries/ZVulkan/src/glslang/StandAlone/Worklist.h create mode 100644 libraries/ZVulkan/src/glslang/StandAlone/spirv-remap.cpp create mode 100644 libraries/ZVulkan/src/glslang/build_info.h create mode 100644 libraries/ZVulkan/src/glslang/glslang/CInterface/glslang_c_interface.cpp create mode 100644 libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_interface.h create mode 100644 libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_shader_types.h create mode 100644 libraries/ZVulkan/src/glslang/glslang/MachineIndependent/span.h create mode 100644 libraries/ZVulkan/src/glslang/glslang/Public/ResourceLimits.h create mode 100644 libraries/ZVulkan/src/glslang/glslang/Public/resource_limits_c.h create mode 100644 libraries/ZVulkan/src/glslang/glslang/ResourceLimits/ResourceLimits.cpp create mode 100644 libraries/ZVulkan/src/glslang/glslang/ResourceLimits/resource_limits_c.cpp create mode 100644 libraries/ZVulkan/src/glslang/spirv/CInterface/spirv_c_interface.cpp create mode 100644 libraries/ZVulkan/src/glslang/spirv/GLSL.ext.ARM.h create mode 100644 libraries/ZVulkan/src/glslang/spirv/GLSL.ext.QCOM.h create mode 100644 libraries/ZVulkan/src/glslang/spirv/NonSemanticShaderDebugInfo100.h diff --git a/libraries/ZVulkan/CMakeLists.txt b/libraries/ZVulkan/CMakeLists.txt index 3b47b7b68..ef2c9e749 100644 --- a/libraries/ZVulkan/CMakeLists.txt +++ b/libraries/ZVulkan/CMakeLists.txt @@ -21,97 +21,109 @@ set(ZVULKAN_SOURCES src/vk_mem_alloc/vk_mem_alloc.cpp src/vk_mem_alloc/vk_mem_alloc.natvis src/volk/volk.c - src/glslang/glslang/MachineIndependent/SymbolTable.h - src/glslang/glslang/MachineIndependent/propagateNoContraction.cpp - src/glslang/glslang/MachineIndependent/PoolAlloc.cpp - src/glslang/glslang/MachineIndependent/Intermediate.cpp - src/glslang/glslang/MachineIndependent/gl_types.h - src/glslang/glslang/MachineIndependent/parseVersions.h + src/glslang/glslang/CInterface/glslang_c_interface.cpp + src/glslang/glslang/GenericCodeGen/CodeGen.cpp + src/glslang/glslang/GenericCodeGen/Link.cpp + src/glslang/glslang/Include/arrays.h + src/glslang/glslang/Include/BaseTypes.h + src/glslang/glslang/Include/Common.h + src/glslang/glslang/Include/ConstantUnion.h + src/glslang/glslang/Include/glslang_c_interface.h + src/glslang/glslang/Include/glslang_c_shader_types.h + src/glslang/glslang/Include/InfoSink.h + src/glslang/glslang/Include/InitializeGlobals.h + src/glslang/glslang/Include/intermediate.h + src/glslang/glslang/Include/PoolAlloc.h + src/glslang/glslang/Include/ResourceLimits.h + src/glslang/glslang/Include/ShHandle.h + src/glslang/glslang/Include/SpirvIntrinsics.h + src/glslang/glslang/Include/Types.h src/glslang/glslang/MachineIndependent/attribute.cpp - src/glslang/glslang/MachineIndependent/Scan.cpp - src/glslang/glslang/MachineIndependent/iomapper.h - src/glslang/glslang/MachineIndependent/ParseHelper.h - src/glslang/glslang/MachineIndependent/glslang_tab.cpp.h - src/glslang/glslang/MachineIndependent/SymbolTable.cpp - src/glslang/glslang/MachineIndependent/RemoveTree.cpp - src/glslang/glslang/MachineIndependent/Versions.h - src/glslang/glslang/MachineIndependent/reflection.cpp - src/glslang/glslang/MachineIndependent/LiveTraverser.h - src/glslang/glslang/MachineIndependent/iomapper.cpp - src/glslang/glslang/MachineIndependent/intermOut.cpp - src/glslang/glslang/MachineIndependent/Versions.cpp - src/glslang/glslang/MachineIndependent/Initialize.h - src/glslang/glslang/MachineIndependent/linkValidate.cpp - src/glslang/glslang/MachineIndependent/InfoSink.cpp - src/glslang/glslang/MachineIndependent/Constant.cpp - src/glslang/glslang/MachineIndependent/IntermTraverse.cpp - src/glslang/glslang/MachineIndependent/propagateNoContraction.h - src/glslang/glslang/MachineIndependent/glslang_tab.cpp - src/glslang/glslang/MachineIndependent/ShaderLang.cpp - src/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp - src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h - src/glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp - src/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp - src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp - src/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp - src/glslang/glslang/MachineIndependent/preprocessor/PpContext.h src/glslang/glslang/MachineIndependent/attribute.h + src/glslang/glslang/MachineIndependent/Constant.cpp + src/glslang/glslang/MachineIndependent/glslang.y + src/glslang/glslang/MachineIndependent/glslang_tab.cpp + src/glslang/glslang/MachineIndependent/glslang_tab.cpp.h + src/glslang/glslang/MachineIndependent/gl_types.h + src/glslang/glslang/MachineIndependent/InfoSink.cpp + src/glslang/glslang/MachineIndependent/Initialize.cpp + src/glslang/glslang/MachineIndependent/Initialize.h + src/glslang/glslang/MachineIndependent/Intermediate.cpp + src/glslang/glslang/MachineIndependent/intermOut.cpp + src/glslang/glslang/MachineIndependent/IntermTraverse.cpp + src/glslang/glslang/MachineIndependent/iomapper.cpp + src/glslang/glslang/MachineIndependent/iomapper.h + src/glslang/glslang/MachineIndependent/limits.cpp + src/glslang/glslang/MachineIndependent/linkValidate.cpp + src/glslang/glslang/MachineIndependent/LiveTraverser.h src/glslang/glslang/MachineIndependent/localintermediate.h src/glslang/glslang/MachineIndependent/parseConst.cpp - src/glslang/glslang/MachineIndependent/Initialize.cpp - src/glslang/glslang/MachineIndependent/limits.cpp src/glslang/glslang/MachineIndependent/ParseContextBase.cpp - src/glslang/glslang/MachineIndependent/RemoveTree.h src/glslang/glslang/MachineIndependent/ParseHelper.cpp - src/glslang/glslang/MachineIndependent/Scan.h + src/glslang/glslang/MachineIndependent/ParseHelper.h + src/glslang/glslang/MachineIndependent/parseVersions.h + src/glslang/glslang/MachineIndependent/pch.h + src/glslang/glslang/MachineIndependent/PoolAlloc.cpp + src/glslang/glslang/MachineIndependent/preprocessor + src/glslang/glslang/MachineIndependent/propagateNoContraction.cpp + src/glslang/glslang/MachineIndependent/propagateNoContraction.h + src/glslang/glslang/MachineIndependent/reflection.cpp src/glslang/glslang/MachineIndependent/reflection.h + src/glslang/glslang/MachineIndependent/RemoveTree.cpp + src/glslang/glslang/MachineIndependent/RemoveTree.h + src/glslang/glslang/MachineIndependent/Scan.cpp + src/glslang/glslang/MachineIndependent/Scan.h src/glslang/glslang/MachineIndependent/ScanContext.h + src/glslang/glslang/MachineIndependent/ShaderLang.cpp + src/glslang/glslang/MachineIndependent/span.h src/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp + src/glslang/glslang/MachineIndependent/SymbolTable.cpp + src/glslang/glslang/MachineIndependent/SymbolTable.h + src/glslang/glslang/MachineIndependent/Versions.cpp + src/glslang/glslang/MachineIndependent/Versions.h + src/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp + src/glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp + src/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp + src/glslang/glslang/MachineIndependent/preprocessor/PpContext.h + src/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp + src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp + src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h src/glslang/glslang/OSDependent/osinclude.h - src/glslang/glslang/GenericCodeGen/Link.cpp - src/glslang/glslang/GenericCodeGen/CodeGen.cpp + src/glslang/glslang/Public/ResourceLimits.h + src/glslang/glslang/Public/resource_limits_c.h src/glslang/glslang/Public/ShaderLang.h - src/glslang/glslang/Include/ConstantUnion.h - src/glslang/glslang/Include/InitializeGlobals.h - src/glslang/glslang/Include/Common.h - src/glslang/glslang/Include/PoolAlloc.h - src/glslang/glslang/Include/arrays.h - src/glslang/glslang/Include/ShHandle.h - src/glslang/glslang/Include/InfoSink.h - src/glslang/glslang/Include/ResourceLimits.h - src/glslang/glslang/Include/Types.h - src/glslang/glslang/Include/BaseTypes.h - src/glslang/glslang/Include/intermediate.h - src/glslang/glslang/Include/SpirvIntrinsics.h - src/glslang/glslang/Include/build_info.h - src/glslang/glslang/OSDependent/osinclude.h - src/glslang/spirv/Logger.h - src/glslang/spirv/GlslangToSpv.cpp - src/glslang/spirv/SPVRemapper.h - src/glslang/spirv/GLSL.ext.EXT.h - src/glslang/spirv/hex_float.h - src/glslang/spirv/doc.cpp - src/glslang/spirv/disassemble.cpp - src/glslang/spirv/SpvPostProcess.cpp + src/glslang/glslang/ResourceLimits/ResourceLimits.cpp + src/glslang/glslang/ResourceLimits/resource_limits_c.cpp src/glslang/spirv/bitutils.h - src/glslang/spirv/InReadableOrder.cpp - src/glslang/spirv/GLSL.ext.AMD.h - src/glslang/spirv/GLSL.ext.NV.h - src/glslang/spirv/SPVRemapper.cpp - src/glslang/spirv/SpvBuilder.h - src/glslang/spirv/GLSL.ext.KHR.h + src/glslang/spirv/disassemble.cpp src/glslang/spirv/disassemble.h - src/glslang/spirv/SpvBuilder.cpp - src/glslang/spirv/GlslangToSpv.h + src/glslang/spirv/doc.cpp src/glslang/spirv/doc.h - src/glslang/spirv/SpvTools.cpp - src/glslang/spirv/spvIR.h - src/glslang/spirv/Logger.cpp - src/glslang/spirv/SpvTools.h + src/glslang/spirv/GLSL.ext.AMD.h + src/glslang/spirv/GLSL.ext.ARM.h + src/glslang/spirv/GLSL.ext.EXT.h + src/glslang/spirv/GLSL.ext.KHR.h + src/glslang/spirv/GLSL.ext.NV.h + src/glslang/spirv/GLSL.ext.QCOM.h src/glslang/spirv/GLSL.std.450.h + src/glslang/spirv/GlslangToSpv.cpp + src/glslang/spirv/GlslangToSpv.h + src/glslang/spirv/hex_float.h + src/glslang/spirv/InReadableOrder.cpp + src/glslang/spirv/Logger.cpp + src/glslang/spirv/Logger.h src/glslang/spirv/NonSemanticDebugPrintf.h - src/glslang/OGLCompilersDLL/InitializeDll.cpp - src/glslang/OGLCompilersDLL/InitializeDll.h + src/glslang/spirv/NonSemanticShaderDebugInfo100.h + src/glslang/spirv/spirv.hpp + src/glslang/spirv/SpvBuilder.cpp + src/glslang/spirv/SpvBuilder.h + src/glslang/spirv/spvIR.h + src/glslang/spirv/SpvPostProcess.cpp + src/glslang/spirv/SPVRemapper.cpp + src/glslang/spirv/SPVRemapper.h + src/glslang/spirv/SpvTools.cpp + src/glslang/spirv/SpvTools.h + src/glslang/spirv/CInterface/spirv_c_interface.cpp ) set(ZVULKAN_INCLUDES @@ -164,6 +176,7 @@ set(VULKAN_INCLUDES source_group("src" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/.+") source_group("src\\glslang" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/.+") source_group("src\\glslang\\glslang" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/.+") +source_group("src\\glslang\\glslang\\CInterface" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/CInterface/.+") source_group("src\\glslang\\glslang\\GenericCodeGen" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/GenericCodeGen/.+") source_group("src\\glslang\\glslang\\Include" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/Include/.+") source_group("src\\glslang\\glslang\\MachineIndependent" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/MachineIndependent/.+") @@ -173,8 +186,9 @@ source_group("src\\glslang\\glslang\\OSDependent\\Unix" REGULAR_EXPRESSION "${CM source_group("src\\glslang\\glslang\\OSDependent\\Web" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/OSDependent/Web/.+") source_group("src\\glslang\\glslang\\OSDependent\\Windows" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/OSDependent/Windows/.+") source_group("src\\glslang\\glslang\\Public" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/Public/.+") -source_group("src\\glslang\\OGLCompilersDLL" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/OGLCompilersDLL/.+") +source_group("src\\glslang\\glslang\\ResourceLimits" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/glslang/ResourceLimits/.+") source_group("src\\glslang\\spirv" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/spirv/.+") +source_group("src\\glslang\\spirv\\CInterface" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/glslang/spirv/CInterface/.+") source_group("src\\vk_mem_alloc" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/vk_mem_alloc/.+") source_group("src\\volk" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/src/volk/.+") source_group("include" REGULAR_EXPRESSION "${CMAKE_CURRENT_SOURCE_DIR}/include/zvulkan/.+") diff --git a/libraries/ZVulkan/include/zvulkan/vk_mem_alloc/vk_mem_alloc.h b/libraries/ZVulkan/include/zvulkan/vk_mem_alloc/vk_mem_alloc.h index 39f9d9d42..7cdfed19b 100644 --- a/libraries/ZVulkan/include/zvulkan/vk_mem_alloc/vk_mem_alloc.h +++ b/libraries/ZVulkan/include/zvulkan/vk_mem_alloc/vk_mem_alloc.h @@ -6424,7 +6424,7 @@ void VmaBlockMetadata::PrintDetailedMap_Begin(class VmaJsonWriter& json, json.WriteNumber(GetSize()); json.WriteString("UnusedBytes"); - json.WriteSize(unusedBytes); + json.WriteSize((size_t)unusedBytes); json.WriteString("Allocations"); json.WriteSize(allocationCount); diff --git a/libraries/ZVulkan/src/glslang/StandAlone/DirStackFileIncluder.h b/libraries/ZVulkan/src/glslang/StandAlone/DirStackFileIncluder.h new file mode 100644 index 000000000..5a33c78fa --- /dev/null +++ b/libraries/ZVulkan/src/glslang/StandAlone/DirStackFileIncluder.h @@ -0,0 +1,149 @@ +// +// Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +// Copyright (C) 2017 Google, Inc. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// + +#pragma once + +#include +#include +#include +#include +#include + +#include "./../glslang/Public/ShaderLang.h" + +// Default include class for normal include convention of search backward +// through the stack of active include paths (for nested includes). +// Can be overridden to customize. +class DirStackFileIncluder : public glslang::TShader::Includer { +public: + DirStackFileIncluder() : externalLocalDirectoryCount(0) { } + + virtual IncludeResult* includeLocal(const char* headerName, + const char* includerName, + size_t inclusionDepth) override + { + return readLocalPath(headerName, includerName, (int)inclusionDepth); + } + + virtual IncludeResult* includeSystem(const char* headerName, + const char* /*includerName*/, + size_t /*inclusionDepth*/) override + { + return readSystemPath(headerName); + } + + // Externally set directories. E.g., from a command-line -I

      . + // - Most-recently pushed are checked first. + // - All these are checked after the parse-time stack of local directories + // is checked. + // - This only applies to the "local" form of #include. + // - Makes its own copy of the path. + virtual void pushExternalLocalDirectory(const std::string& dir) + { + directoryStack.push_back(dir); + externalLocalDirectoryCount = (int)directoryStack.size(); + } + + virtual void releaseInclude(IncludeResult* result) override + { + if (result != nullptr) { + delete [] static_cast(result->userData); + delete result; + } + } + + virtual std::set getIncludedFiles() + { + return includedFiles; + } + + virtual ~DirStackFileIncluder() override { } + +protected: + typedef char tUserDataElement; + std::vector directoryStack; + int externalLocalDirectoryCount; + std::set includedFiles; + + // Search for a valid "local" path based on combining the stack of include + // directories and the nominal name of the header. + virtual IncludeResult* readLocalPath(const char* headerName, const char* includerName, int depth) + { + // Discard popped include directories, and + // initialize when at parse-time first level. + directoryStack.resize(depth + externalLocalDirectoryCount); + if (depth == 1) + directoryStack.back() = getDirectory(includerName); + + // Find a directory that works, using a reverse search of the include stack. + for (auto it = directoryStack.rbegin(); it != directoryStack.rend(); ++it) { + std::string path = *it + '/' + headerName; + std::replace(path.begin(), path.end(), '\\', '/'); + std::ifstream file(path, std::ios_base::binary | std::ios_base::ate); + if (file) { + directoryStack.push_back(getDirectory(path)); + includedFiles.insert(path); + return newIncludeResult(path, file, (int)file.tellg()); + } + } + + return nullptr; + } + + // Search for a valid path. + // Not implemented yet; returning nullptr signals failure to find. + virtual IncludeResult* readSystemPath(const char* /*headerName*/) const + { + return nullptr; + } + + // Do actual reading of the file, filling in a new include result. + virtual IncludeResult* newIncludeResult(const std::string& path, std::ifstream& file, int length) const + { + char* content = new tUserDataElement [length]; + file.seekg(0, file.beg); + file.read(content, length); + return new IncludeResult(path, content, length, content); + } + + // If no path markers, return current working directory. + // Otherwise, strip file name and return path leading up to it. + virtual std::string getDirectory(const std::string path) const + { + size_t last = path.find_last_of("/\\"); + return last == std::string::npos ? "." : path.substr(0, last); + } +}; diff --git a/libraries/ZVulkan/src/glslang/StandAlone/StandAlone.cpp b/libraries/ZVulkan/src/glslang/StandAlone/StandAlone.cpp new file mode 100644 index 000000000..ac967f2b5 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/StandAlone/StandAlone.cpp @@ -0,0 +1,2207 @@ +// +// Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +// Copyright (C) 2013-2016 LunarG, Inc. +// Copyright (C) 2016-2020 Google, Inc. +// Modifications Copyright(C) 2021 Advanced Micro Devices, Inc.All rights reserved. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// + +// this only applies to the standalone wrapper, not the front end in general +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "glslang/Public/ResourceLimits.h" +#include "Worklist.h" +#include "DirStackFileIncluder.h" +#include "./../glslang/Include/ShHandle.h" +#include "./../glslang/Public/ShaderLang.h" +#include "../glslang/MachineIndependent/localintermediate.h" +#include "../SPIRV/GlslangToSpv.h" +#include "../SPIRV/GLSL.std.450.h" +#include "../SPIRV/doc.h" +#include "../SPIRV/disassemble.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../glslang/OSDependent/osinclude.h" + +// Build-time generated includes +#include "glslang/build_info.h" + +#include "glslang/glsl_intrinsic_header.h" + +extern "C" { + GLSLANG_EXPORT void ShOutputHtml(); +} + +// Command-line options +enum TOptions : uint64_t { + EOptionNone = 0, + EOptionIntermediate = (1ull << 0), + EOptionSuppressInfolog = (1ull << 1), + EOptionMemoryLeakMode = (1ull << 2), + EOptionRelaxedErrors = (1ull << 3), + EOptionGiveWarnings = (1ull << 4), + EOptionLinkProgram = (1ull << 5), + EOptionMultiThreaded = (1ull << 6), + EOptionDumpConfig = (1ull << 7), + EOptionDumpReflection = (1ull << 8), + EOptionSuppressWarnings = (1ull << 9), + EOptionDumpVersions = (1ull << 10), + EOptionSpv = (1ull << 11), + EOptionHumanReadableSpv = (1ull << 12), + EOptionVulkanRules = (1ull << 13), + EOptionDefaultDesktop = (1ull << 14), + EOptionOutputPreprocessed = (1ull << 15), + EOptionOutputHexadecimal = (1ull << 16), + EOptionReadHlsl = (1ull << 17), + EOptionCascadingErrors = (1ull << 18), + EOptionAutoMapBindings = (1ull << 19), + EOptionFlattenUniformArrays = (1ull << 20), + EOptionNoStorageFormat = (1ull << 21), + EOptionKeepUncalled = (1ull << 22), + EOptionHlslOffsets = (1ull << 23), + EOptionHlslIoMapping = (1ull << 24), + EOptionAutoMapLocations = (1ull << 25), + EOptionDebug = (1ull << 26), + EOptionStdin = (1ull << 27), + EOptionOptimizeDisable = (1ull << 28), + EOptionOptimizeSize = (1ull << 29), + EOptionInvertY = (1ull << 30), + EOptionDumpBareVersion = (1ull << 31), + EOptionCompileOnly = (1ull << 32), +}; +bool targetHlslFunctionality1 = false; +bool SpvToolsDisassembler = false; +bool SpvToolsValidate = false; +bool NaNClamp = false; +bool stripDebugInfo = false; +bool emitNonSemanticShaderDebugInfo = false; +bool emitNonSemanticShaderDebugSource = false; +bool beQuiet = false; +bool VulkanRulesRelaxed = false; +bool autoSampledTextures = false; + +// +// Return codes from main/exit(). +// +enum TFailCode { + ESuccess = 0, + EFailUsage, + EFailCompile, + EFailLink, + EFailCompilerCreate, + EFailThreadCreate, + EFailLinkerCreate +}; + +// +// Forward declarations. +// +EShLanguage FindLanguage(const std::string& name, bool parseSuffix=true); +void CompileFile(const char* fileName, ShHandle); +void usage(); +char* ReadFileData(const char* fileName); +void FreeFileData(char* data); +void InfoLogMsg(const char* msg, const char* name, const int num); + +// Globally track if any compile or link failure. +std::atomic CompileFailed{0}; +std::atomic LinkFailed{0}; +std::atomic CompileOrLinkFailed{0}; + +// array of unique places to leave the shader names and infologs for the asynchronous compiles +std::vector> WorkItems; + +std::string ConfigFile; + +// +// Parse either a .conf file provided by the user or the default from glslang::DefaultTBuiltInResource +// +void ProcessConfigFile() +{ + if (ConfigFile.size() == 0) + *GetResources() = *GetDefaultResources(); + else { + char* configString = ReadFileData(ConfigFile.c_str()); + DecodeResourceLimits(GetResources(), configString); + FreeFileData(configString); + } +} + +int ReflectOptions = EShReflectionDefault; +std::underlying_type_t Options = EOptionNone; +const char* ExecutableName = nullptr; +const char* binaryFileName = nullptr; +const char* depencyFileName = nullptr; +const char* entryPointName = nullptr; +const char* sourceEntryPointName = nullptr; +const char* shaderStageName = nullptr; +const char* variableName = nullptr; +bool HlslEnable16BitTypes = false; +bool HlslDX9compatible = false; +bool HlslDxPositionW = false; +bool EnhancedMsgs = false; +bool AbsolutePath = false; +bool DumpBuiltinSymbols = false; +std::vector IncludeDirectoryList; + +// Source environment +// (source 'Client' is currently the same as target 'Client') +int ClientInputSemanticsVersion = 100; + +// Target environment +glslang::EShClient Client = glslang::EShClientNone; // will stay EShClientNone if only validating +glslang::EShTargetClientVersion ClientVersion; // not valid until Client is set +glslang::EShTargetLanguage TargetLanguage = glslang::EShTargetNone; +glslang::EShTargetLanguageVersion TargetVersion; // not valid until TargetLanguage is set + +// GLSL version +int GlslVersion = 0; // GLSL version specified on CLI, overrides #version in shader source + +std::vector Processes; // what should be recorded by OpModuleProcessed, or equivalent + +// Per descriptor-set binding base data +typedef std::map TPerSetBaseBinding; + +std::vector> uniformLocationOverrides; +int uniformBase = 0; + +std::array, glslang::EResCount> baseBinding; +std::array, glslang::EResCount> baseBindingForSet; +std::array, EShLangCount> baseResourceSetBinding; + +std::vector> blockStorageOverrides; + +bool setGlobalUniformBlock = false; +std::string globalUniformName; +unsigned int globalUniformBinding; +unsigned int globalUniformSet; + +bool setGlobalBufferBlock = false; +std::string atomicCounterBlockName; +unsigned int atomicCounterBlockSet; + +// Add things like "#define ..." to a preamble to use in the beginning of the shader. +class TPreamble { +public: + TPreamble() { } + + bool isSet() const { return text.size() > 0; } + const char* get() const { return text.c_str(); } + + // #define... + void addDef(std::string def) + { + text.append("#define "); + fixLine(def); + + Processes.push_back("define-macro "); + Processes.back().append(def); + + // The first "=" needs to turn into a space + const size_t equal = def.find_first_of("="); + if (equal != def.npos) + def[equal] = ' '; + + text.append(def); + text.append("\n"); + } + + // #undef... + void addUndef(std::string undef) + { + text.append("#undef "); + fixLine(undef); + + Processes.push_back("undef-macro "); + Processes.back().append(undef); + + text.append(undef); + text.append("\n"); + } + + void addText(std::string preambleText) + { + fixLine(preambleText); + + Processes.push_back("preamble-text"); + Processes.back().append(preambleText); + + text.append(preambleText); + text.append("\n"); + } + +protected: + void fixLine(std::string& line) + { + // Can't go past a newline in the line + const size_t end = line.find_first_of("\n"); + if (end != line.npos) + line = line.substr(0, end); + } + + std::string text; // contents of preamble +}; + +// Track the user's #define and #undef from the command line. +TPreamble UserPreamble; +std::string PreambleString; + +// +// Create the default name for saving a binary if -o is not provided. +// +const char* GetBinaryName(EShLanguage stage) +{ + const char* name; + if (binaryFileName == nullptr) { + switch (stage) { + case EShLangVertex: name = "vert.spv"; break; + case EShLangTessControl: name = "tesc.spv"; break; + case EShLangTessEvaluation: name = "tese.spv"; break; + case EShLangGeometry: name = "geom.spv"; break; + case EShLangFragment: name = "frag.spv"; break; + case EShLangCompute: name = "comp.spv"; break; + case EShLangRayGen: name = "rgen.spv"; break; + case EShLangIntersect: name = "rint.spv"; break; + case EShLangAnyHit: name = "rahit.spv"; break; + case EShLangClosestHit: name = "rchit.spv"; break; + case EShLangMiss: name = "rmiss.spv"; break; + case EShLangCallable: name = "rcall.spv"; break; + case EShLangMesh : name = "mesh.spv"; break; + case EShLangTask : name = "task.spv"; break; + default: name = "unknown"; break; + } + } else + name = binaryFileName; + + return name; +} + +// +// *.conf => this is a config file that can set limits/resources +// +bool SetConfigFile(const std::string& name) +{ + if (name.size() < 5) + return false; + + if (name.compare(name.size() - 5, 5, ".conf") == 0) { + ConfigFile = name; + return true; + } + + return false; +} + +// +// Give error and exit with failure code. +// +void Error(const char* message, const char* detail = nullptr) +{ + fprintf(stderr, "%s: Error: ", ExecutableName); + if (detail != nullptr) + fprintf(stderr, "%s: ", detail); + fprintf(stderr, "%s (use -h for usage)\n", message); + exit(EFailUsage); +} + +// +// Process an optional binding base of one the forms: +// --argname [stage] base // base for stage (if given) or all stages (if not) +// --argname [stage] [base set]... // set/base pairs: set the base for given binding set. + +// Where stage is one of the forms accepted by FindLanguage, and base is an integer +// +void ProcessBindingBase(int& argc, char**& argv, glslang::TResourceType res) +{ + if (argc < 2) + usage(); + + EShLanguage lang = EShLangCount; + int singleBase = 0; + TPerSetBaseBinding perSetBase; + int arg = 1; + + // Parse stage, if given + if (!isdigit(argv[arg][0])) { + if (argc < 3) // this form needs one more argument + usage(); + + lang = FindLanguage(argv[arg++], false); + } + + if ((argc - arg) >= 2 && isdigit(argv[arg+0][0]) && isdigit(argv[arg+1][0])) { + // Parse a per-set binding base + do { + const int baseNum = atoi(argv[arg++]); + const int setNum = atoi(argv[arg++]); + perSetBase[setNum] = baseNum; + } while ((argc - arg) >= 2 && isdigit(argv[arg + 0][0]) && isdigit(argv[arg + 1][0])); + } else { + // Parse single binding base + singleBase = atoi(argv[arg++]); + } + + argc -= (arg-1); + argv += (arg-1); + + // Set one or all languages + const int langMin = (lang < EShLangCount) ? lang+0 : 0; + const int langMax = (lang < EShLangCount) ? lang+1 : EShLangCount; + + for (int lang = langMin; lang < langMax; ++lang) { + if (!perSetBase.empty()) + baseBindingForSet[res][lang].insert(perSetBase.begin(), perSetBase.end()); + else + baseBinding[res][lang] = singleBase; + } +} + +void ProcessResourceSetBindingBase(int& argc, char**& argv, std::array, EShLangCount>& base) +{ + if (argc < 2) + usage(); + + if (!isdigit(argv[1][0])) { + if (argc < 3) // this form needs one more argument + usage(); + + // Parse form: --argname stage [regname set base...], or: + // --argname stage set + const EShLanguage lang = FindLanguage(argv[1], false); + + argc--; + argv++; + + while (argc > 1 && argv[1] != nullptr && argv[1][0] != '-') { + base[lang].push_back(argv[1]); + + argc--; + argv++; + } + + // Must have one arg, or a multiple of three (for [regname set binding] triples) + if (base[lang].size() != 1 && (base[lang].size() % 3) != 0) + usage(); + + } else { + // Parse form: --argname set + for (int lang=0; lang>& storage) +{ + if (argc < 3) + usage(); + + glslang::TBlockStorageClass blockStorage = glslang::EbsNone; + + std::string strBacking(argv[2]); + if (strBacking == "uniform") + blockStorage = glslang::EbsUniform; + else if (strBacking == "buffer") + blockStorage = glslang::EbsStorageBuffer; + else if (strBacking == "push_constant") + blockStorage = glslang::EbsPushConstant; + else { + printf("%s: invalid block storage\n", strBacking.c_str()); + usage(); + } + + storage.push_back(std::make_pair(std::string(argv[1]), blockStorage)); + + argc -= 2; + argv += 2; +} + +inline bool isNonDigit(char c) { + // a non-digit character valid in a glsl identifier + return (c == '_') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +// whether string isa valid identifier to be used in glsl +bool isValidIdentifier(const char* str) { + std::string idn(str); + + if (idn.length() == 0) { + return false; + } + + if (idn.length() >= 3 && idn.substr(0, 3) == "gl_") { + // identifiers startin with "gl_" are reserved + return false; + } + + if (!isNonDigit(idn[0])) { + return false; + } + + for (unsigned int i = 1; i < idn.length(); ++i) { + if (!(isdigit(idn[i]) || isNonDigit(idn[i]))) { + return false; + } + } + + return true; +} + +// Process settings for either the global buffer block or global unfirom block +// of the form: +// --argname name set binding +void ProcessGlobalBlockSettings(int& argc, char**& argv, std::string* name, unsigned int* set, unsigned int* binding) +{ + if (argc < 4) + usage(); + + unsigned int curArg = 1; + + assert(name || set || binding); + + if (name) { + if (!isValidIdentifier(argv[curArg])) { + printf("%s: invalid identifier\n", argv[curArg]); + usage(); + } + *name = argv[curArg]; + + curArg++; + } + + if (set) { + errno = 0; + int setVal = static_cast(::strtol(argv[curArg], nullptr, 10)); + if (errno || setVal < 0) { + printf("%s: invalid set\n", argv[curArg]); + usage(); + } + *set = setVal; + + curArg++; + } + + if (binding) { + errno = 0; + int bindingVal = static_cast(::strtol(argv[curArg], nullptr, 10)); + if (errno || bindingVal < 0) { + printf("%s: invalid binding\n", argv[curArg]); + usage(); + } + *binding = bindingVal; + + curArg++; + } + + argc -= (curArg - 1); + argv += (curArg - 1); +} + +// +// Do all command-line argument parsing. This includes building up the work-items +// to be processed later, and saving all the command-line options. +// +// Does not return (it exits) if command-line is fatally flawed. +// +void ProcessArguments(std::vector>& workItems, int argc, char* argv[]) +{ + for (int res = 0; res < glslang::EResCount; ++res) + baseBinding[res].fill(0); + + ExecutableName = argv[0]; + workItems.reserve(argc); + + const auto bumpArg = [&]() { + if (argc > 0) { + argc--; + argv++; + } + }; + + // read a string directly attached to a single-letter option + const auto getStringOperand = [&](const char* desc) { + if (argv[0][2] == 0) { + printf("%s must immediately follow option (no spaces)\n", desc); + exit(EFailUsage); + } + return argv[0] + 2; + }; + + // read a number attached to a single-letter option + const auto getAttachedNumber = [&](const char* desc) { + int num = atoi(argv[0] + 2); + if (num == 0) { + printf("%s: expected attached non-0 number\n", desc); + exit(EFailUsage); + } + return num; + }; + + // minimum needed (without overriding something else) to target Vulkan SPIR-V + const auto setVulkanSpv = []() { + if (Client == glslang::EShClientNone) + ClientVersion = glslang::EShTargetVulkan_1_0; + Client = glslang::EShClientVulkan; + Options |= EOptionSpv; + Options |= EOptionVulkanRules; + Options |= EOptionLinkProgram; + }; + + // minimum needed (without overriding something else) to target OpenGL SPIR-V + const auto setOpenGlSpv = []() { + if (Client == glslang::EShClientNone) + ClientVersion = glslang::EShTargetOpenGL_450; + Client = glslang::EShClientOpenGL; + Options |= EOptionSpv; + Options |= EOptionLinkProgram; + // undo a -H default to Vulkan + Options &= ~EOptionVulkanRules; + }; + + const auto getUniformOverride = [getStringOperand]() { + const char *arg = getStringOperand("-u:"); + const char *split = strchr(arg, ':'); + if (split == nullptr) { + printf("%s: missing location\n", arg); + exit(EFailUsage); + } + errno = 0; + int location = static_cast(::strtol(split + 1, nullptr, 10)); + if (errno) { + printf("%s: invalid location\n", arg); + exit(EFailUsage); + } + return std::make_pair(std::string(arg, split - arg), location); + }; + + for (bumpArg(); argc >= 1; bumpArg()) { + if (argv[0][0] == '-') { + switch (argv[0][1]) { + case '-': + { + std::string lowerword(argv[0]+2); + std::transform(lowerword.begin(), lowerword.end(), lowerword.begin(), ::tolower); + + // handle --word style options + if (lowerword == "auto-map-bindings" || // synonyms + lowerword == "auto-map-binding" || + lowerword == "amb") { + Options |= EOptionAutoMapBindings; + } else if (lowerword == "auto-map-locations" || // synonyms + lowerword == "aml") { + Options |= EOptionAutoMapLocations; + } else if (lowerword == "uniform-base") { + if (argc <= 1) + Error("no provided", lowerword.c_str()); + uniformBase = static_cast(::strtol(argv[1], nullptr, 10)); + bumpArg(); + break; + } else if (lowerword == "client") { + if (argc > 1) { + if (strcmp(argv[1], "vulkan100") == 0) + setVulkanSpv(); + else if (strcmp(argv[1], "opengl100") == 0) + setOpenGlSpv(); + else + Error("expects vulkan100 or opengl100", lowerword.c_str()); + } else + Error("expects vulkan100 or opengl100", lowerword.c_str()); + bumpArg(); + } else if (lowerword == "define-macro" || + lowerword == "d") { + if (argc > 1) + UserPreamble.addDef(argv[1]); + else + Error("expects ", argv[0]); + bumpArg(); + } else if (lowerword == "dump-builtin-symbols") { + DumpBuiltinSymbols = true; + } else if (lowerword == "entry-point") { + entryPointName = argv[1]; + if (argc <= 1) + Error("no provided", lowerword.c_str()); + bumpArg(); + } else if (lowerword == "flatten-uniform-arrays" || // synonyms + lowerword == "flatten-uniform-array" || + lowerword == "fua") { + Options |= EOptionFlattenUniformArrays; + } else if (lowerword == "glsl-version") { + if (argc > 1) { + if (strcmp(argv[1], "100") == 0) { + GlslVersion = 100; + } else if (strcmp(argv[1], "110") == 0) { + GlslVersion = 110; + } else if (strcmp(argv[1], "120") == 0) { + GlslVersion = 120; + } else if (strcmp(argv[1], "130") == 0) { + GlslVersion = 130; + } else if (strcmp(argv[1], "140") == 0) { + GlslVersion = 140; + } else if (strcmp(argv[1], "150") == 0) { + GlslVersion = 150; + } else if (strcmp(argv[1], "300es") == 0) { + GlslVersion = 300; + } else if (strcmp(argv[1], "310es") == 0) { + GlslVersion = 310; + } else if (strcmp(argv[1], "320es") == 0) { + GlslVersion = 320; + } else if (strcmp(argv[1], "330") == 0) { + GlslVersion = 330; + } else if (strcmp(argv[1], "400") == 0) { + GlslVersion = 400; + } else if (strcmp(argv[1], "410") == 0) { + GlslVersion = 410; + } else if (strcmp(argv[1], "420") == 0) { + GlslVersion = 420; + } else if (strcmp(argv[1], "430") == 0) { + GlslVersion = 430; + } else if (strcmp(argv[1], "440") == 0) { + GlslVersion = 440; + } else if (strcmp(argv[1], "450") == 0) { + GlslVersion = 450; + } else if (strcmp(argv[1], "460") == 0) { + GlslVersion = 460; + } else + Error("--glsl-version expected one of: 100, 110, 120, 130, 140, 150,\n" + "300es, 310es, 320es, 330\n" + "400, 410, 420, 430, 440, 450, 460"); + } + bumpArg(); + } else if (lowerword == "hlsl-offsets") { + Options |= EOptionHlslOffsets; + } else if (lowerword == "hlsl-iomap" || + lowerword == "hlsl-iomapper" || + lowerword == "hlsl-iomapping") { + Options |= EOptionHlslIoMapping; + } else if (lowerword == "hlsl-enable-16bit-types") { + HlslEnable16BitTypes = true; + } else if (lowerword == "hlsl-dx9-compatible") { + HlslDX9compatible = true; + } else if (lowerword == "hlsl-dx-position-w") { + HlslDxPositionW = true; + } else if (lowerword == "enhanced-msgs") { + EnhancedMsgs = true; + } else if (lowerword == "absolute-path") { + AbsolutePath = true; + } else if (lowerword == "auto-sampled-textures") { + autoSampledTextures = true; + } else if (lowerword == "invert-y" || // synonyms + lowerword == "iy") { + Options |= EOptionInvertY; + } else if (lowerword == "keep-uncalled" || // synonyms + lowerword == "ku") { + Options |= EOptionKeepUncalled; + } else if (lowerword == "nan-clamp") { + NaNClamp = true; + } else if (lowerword == "no-storage-format" || // synonyms + lowerword == "nsf") { + Options |= EOptionNoStorageFormat; + } else if (lowerword == "preamble-text" || + lowerword == "p") { + if (argc > 1) + UserPreamble.addText(argv[1]); + else + Error("expects ", argv[0]); + bumpArg(); + } else if (lowerword == "relaxed-errors") { + Options |= EOptionRelaxedErrors; + } else if (lowerword == "reflect-strict-array-suffix") { + ReflectOptions |= EShReflectionStrictArraySuffix; + } else if (lowerword == "reflect-basic-array-suffix") { + ReflectOptions |= EShReflectionBasicArraySuffix; + } else if (lowerword == "reflect-intermediate-io") { + ReflectOptions |= EShReflectionIntermediateIO; + } else if (lowerword == "reflect-separate-buffers") { + ReflectOptions |= EShReflectionSeparateBuffers; + } else if (lowerword == "reflect-all-block-variables") { + ReflectOptions |= EShReflectionAllBlockVariables; + } else if (lowerword == "reflect-unwrap-io-blocks") { + ReflectOptions |= EShReflectionUnwrapIOBlocks; + } else if (lowerword == "reflect-all-io-variables") { + ReflectOptions |= EShReflectionAllIOVariables; + } else if (lowerword == "reflect-shared-std140-ubo") { + ReflectOptions |= EShReflectionSharedStd140UBO; + } else if (lowerword == "reflect-shared-std140-ssbo") { + ReflectOptions |= EShReflectionSharedStd140SSBO; + } else if (lowerword == "resource-set-bindings" || // synonyms + lowerword == "resource-set-binding" || + lowerword == "rsb") { + ProcessResourceSetBindingBase(argc, argv, baseResourceSetBinding); + } else if (lowerword == "set-block-storage" || + lowerword == "sbs") { + ProcessBlockStorage(argc, argv, blockStorageOverrides); + } else if (lowerword == "set-atomic-counter-block" || + lowerword == "sacb") { + ProcessGlobalBlockSettings(argc, argv, &atomicCounterBlockName, &atomicCounterBlockSet, nullptr); + setGlobalBufferBlock = true; + } else if (lowerword == "set-default-uniform-block" || + lowerword == "sdub") { + ProcessGlobalBlockSettings(argc, argv, &globalUniformName, &globalUniformSet, &globalUniformBinding); + setGlobalUniformBlock = true; + } else if (lowerword == "shift-image-bindings" || // synonyms + lowerword == "shift-image-binding" || + lowerword == "sib") { + ProcessBindingBase(argc, argv, glslang::EResImage); + } else if (lowerword == "shift-sampler-bindings" || // synonyms + lowerword == "shift-sampler-binding" || + lowerword == "ssb") { + ProcessBindingBase(argc, argv, glslang::EResSampler); + } else if (lowerword == "shift-uav-bindings" || // synonyms + lowerword == "shift-uav-binding" || + lowerword == "suavb") { + ProcessBindingBase(argc, argv, glslang::EResUav); + } else if (lowerword == "shift-texture-bindings" || // synonyms + lowerword == "shift-texture-binding" || + lowerword == "stb") { + ProcessBindingBase(argc, argv, glslang::EResTexture); + } else if (lowerword == "shift-ubo-bindings" || // synonyms + lowerword == "shift-ubo-binding" || + lowerword == "shift-cbuffer-bindings" || + lowerword == "shift-cbuffer-binding" || + lowerword == "sub" || + lowerword == "scb") { + ProcessBindingBase(argc, argv, glslang::EResUbo); + } else if (lowerword == "shift-ssbo-bindings" || // synonyms + lowerword == "shift-ssbo-binding" || + lowerword == "sbb") { + ProcessBindingBase(argc, argv, glslang::EResSsbo); + } else if (lowerword == "source-entrypoint" || // synonyms + lowerword == "sep") { + if (argc <= 1) + Error("no provided", lowerword.c_str()); + sourceEntryPointName = argv[1]; + bumpArg(); + break; + } else if (lowerword == "spirv-dis") { + SpvToolsDisassembler = true; + } else if (lowerword == "spirv-val") { + SpvToolsValidate = true; + } else if (lowerword == "stdin") { + Options |= EOptionStdin; + shaderStageName = argv[1]; + } else if (lowerword == "suppress-warnings") { + Options |= EOptionSuppressWarnings; + } else if (lowerword == "target-env") { + if (argc > 1) { + if (strcmp(argv[1], "vulkan1.0") == 0) { + setVulkanSpv(); + ClientVersion = glslang::EShTargetVulkan_1_0; + } else if (strcmp(argv[1], "vulkan1.1") == 0) { + setVulkanSpv(); + ClientVersion = glslang::EShTargetVulkan_1_1; + } else if (strcmp(argv[1], "vulkan1.2") == 0) { + setVulkanSpv(); + ClientVersion = glslang::EShTargetVulkan_1_2; + } else if (strcmp(argv[1], "vulkan1.3") == 0) { + setVulkanSpv(); + ClientVersion = glslang::EShTargetVulkan_1_3; + } else if (strcmp(argv[1], "opengl") == 0) { + setOpenGlSpv(); + ClientVersion = glslang::EShTargetOpenGL_450; + } else if (strcmp(argv[1], "spirv1.0") == 0) { + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_0; + } else if (strcmp(argv[1], "spirv1.1") == 0) { + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_1; + } else if (strcmp(argv[1], "spirv1.2") == 0) { + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_2; + } else if (strcmp(argv[1], "spirv1.3") == 0) { + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_3; + } else if (strcmp(argv[1], "spirv1.4") == 0) { + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_4; + } else if (strcmp(argv[1], "spirv1.5") == 0) { + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_5; + } else if (strcmp(argv[1], "spirv1.6") == 0) { + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_6; + } else + Error("--target-env expected one of: vulkan1.0, vulkan1.1, vulkan1.2,\n" + "vulkan1.3, opengl, spirv1.0, spirv1.1, spirv1.2, spirv1.3,\n" + "spirv1.4, spirv1.5 or spirv1.6"); + } + bumpArg(); + } else if (lowerword == "undef-macro" || + lowerword == "u") { + if (argc > 1) + UserPreamble.addUndef(argv[1]); + else + Error("expects ", argv[0]); + bumpArg(); + } else if (lowerword == "variable-name" || // synonyms + lowerword == "vn") { + Options |= EOptionOutputHexadecimal; + if (argc <= 1) + Error("no provided", lowerword.c_str()); + variableName = argv[1]; + bumpArg(); + break; + } else if (lowerword == "quiet") { + beQuiet = true; + } else if (lowerword == "depfile") { + if (argc <= 1) + Error("no provided", lowerword.c_str()); + depencyFileName = argv[1]; + bumpArg(); + } else if (lowerword == "version") { + Options |= EOptionDumpVersions; + } else if (lowerword == "no-link") { + Options |= EOptionCompileOnly; + } else if (lowerword == "help") { + usage(); + break; + } else { + Error("unrecognized command-line option", argv[0]); + } + } + break; + case 'C': + Options |= EOptionCascadingErrors; + break; + case 'D': + if (argv[0][2] == 0) + Options |= EOptionReadHlsl; + else + UserPreamble.addDef(getStringOperand("-D")); + break; + case 'u': + uniformLocationOverrides.push_back(getUniformOverride()); + break; + case 'E': + Options |= EOptionOutputPreprocessed; + break; + case 'G': + // OpenGL client + setOpenGlSpv(); + if (argv[0][2] != 0) + ClientInputSemanticsVersion = getAttachedNumber("-G client input semantics"); + if (ClientInputSemanticsVersion != 100) + Error("unknown client version for -G, should be 100"); + break; + case 'H': + Options |= EOptionHumanReadableSpv; + if ((Options & EOptionSpv) == 0) { + // default to Vulkan + setVulkanSpv(); + } + break; + case 'I': + IncludeDirectoryList.push_back(getStringOperand("-I include path")); + break; + case 'O': + if (argv[0][2] == 'd') + Options |= EOptionOptimizeDisable; + else if (argv[0][2] == 's') +#if ENABLE_OPT + Options |= EOptionOptimizeSize; +#else + Error("-Os not available; optimizer not linked"); +#endif + else + Error("unknown -O option"); + break; + case 'P': + UserPreamble.addText(getStringOperand("-P")); + break; + case 'R': + VulkanRulesRelaxed = true; + break; + case 'S': + if (argc <= 1) + Error("no specified for -S"); + shaderStageName = argv[1]; + bumpArg(); + break; + case 'U': + UserPreamble.addUndef(getStringOperand("-U")); + break; + case 'V': + setVulkanSpv(); + if (argv[0][2] != 0) + ClientInputSemanticsVersion = getAttachedNumber("-V client input semantics"); + if (ClientInputSemanticsVersion != 100) + Error("unknown client version for -V, should be 100"); + break; + case 'c': + Options |= EOptionDumpConfig; + break; + case 'd': + if (strncmp(&argv[0][1], "dumpversion", strlen(&argv[0][1]) + 1) == 0 || + strncmp(&argv[0][1], "dumpfullversion", strlen(&argv[0][1]) + 1) == 0) + Options |= EOptionDumpBareVersion; + else + Options |= EOptionDefaultDesktop; + break; + case 'e': + entryPointName = argv[1]; + if (argc <= 1) + Error("no provided for -e"); + bumpArg(); + break; + case 'f': + if (strcmp(&argv[0][2], "hlsl_functionality1") == 0) + targetHlslFunctionality1 = true; + else + Error("-f: expected hlsl_functionality1"); + break; + case 'g': + // Override previous -g or -g0 argument + stripDebugInfo = false; + emitNonSemanticShaderDebugInfo = false; + Options &= ~EOptionDebug; + if (argv[0][2] == '0') + stripDebugInfo = true; + else { + Options |= EOptionDebug; + if (argv[0][2] == 'V') { + emitNonSemanticShaderDebugInfo = true; + if (argv[0][3] == 'S') { + emitNonSemanticShaderDebugSource = true; + } else { + emitNonSemanticShaderDebugSource = false; + } + } + } + break; + case 'h': + usage(); + break; + case 'i': + Options |= EOptionIntermediate; + break; + case 'l': + Options |= EOptionLinkProgram; + break; + case 'm': + Options |= EOptionMemoryLeakMode; + break; + case 'o': + if (argc <= 1) + Error("no provided for -o"); + binaryFileName = argv[1]; + bumpArg(); + break; + case 'q': + Options |= EOptionDumpReflection; + break; + case 'r': + Options |= EOptionRelaxedErrors; + break; + case 's': + Options |= EOptionSuppressInfolog; + break; + case 't': + Options |= EOptionMultiThreaded; + break; + case 'v': + Options |= EOptionDumpVersions; + break; + case 'w': + Options |= EOptionSuppressWarnings; + break; + case 'x': + Options |= EOptionOutputHexadecimal; + break; + default: + Error("unrecognized command-line option", argv[0]); + break; + } + } else { + std::string name(argv[0]); + if (! SetConfigFile(name)) { + workItems.push_back(std::unique_ptr(new glslang::TWorkItem(name))); + } + } + } + + // Make sure that -S is always specified if --stdin is specified + if ((Options & EOptionStdin) && shaderStageName == nullptr) + Error("must provide -S when --stdin is given"); + + // Make sure that -E is not specified alongside linking (which includes SPV generation) + // Or things that require linking + if (Options & EOptionOutputPreprocessed) { + if (Options & EOptionLinkProgram) + Error("can't use -E when linking is selected"); + if (Options & EOptionDumpReflection) + Error("reflection requires linking, which can't be used when -E when is selected"); + } + + // reflection requires linking + if ((Options & EOptionDumpReflection) && !(Options & EOptionLinkProgram)) + Error("reflection requires -l for linking"); + + // -o or -x makes no sense if there is no target binary + if (binaryFileName && (Options & EOptionSpv) == 0) + Error("no binary generation requested (e.g., -V)"); + + if ((Options & EOptionFlattenUniformArrays) != 0 && + (Options & EOptionReadHlsl) == 0) + Error("uniform array flattening only valid when compiling HLSL source."); + + if ((Options & EOptionReadHlsl) && (Client == glslang::EShClientOpenGL)) { + Error("Using HLSL input under OpenGL semantics is not currently supported."); + } + + // rationalize client and target language + if (TargetLanguage == glslang::EShTargetNone) { + switch (ClientVersion) { + case glslang::EShTargetVulkan_1_0: + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_0; + break; + case glslang::EShTargetVulkan_1_1: + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_3; + break; + case glslang::EShTargetVulkan_1_2: + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_5; + break; + case glslang::EShTargetVulkan_1_3: + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_6; + break; + case glslang::EShTargetOpenGL_450: + TargetLanguage = glslang::EShTargetSpv; + TargetVersion = glslang::EShTargetSpv_1_0; + break; + default: + break; + } + } + if (TargetLanguage != glslang::EShTargetNone && Client == glslang::EShClientNone) + Error("To generate SPIR-V, also specify client semantics. See -G and -V."); +} + +// +// Translate the meaningful subset of command-line options to parser-behavior options. +// +void SetMessageOptions(EShMessages& messages) +{ + if (Options & EOptionRelaxedErrors) + messages = (EShMessages)(messages | EShMsgRelaxedErrors); + if (Options & EOptionIntermediate) + messages = (EShMessages)(messages | EShMsgAST); + if (Options & EOptionSuppressWarnings) + messages = (EShMessages)(messages | EShMsgSuppressWarnings); + if (Options & EOptionSpv) + messages = (EShMessages)(messages | EShMsgSpvRules); + if (Options & EOptionVulkanRules) + messages = (EShMessages)(messages | EShMsgVulkanRules); + if (Options & EOptionOutputPreprocessed) + messages = (EShMessages)(messages | EShMsgOnlyPreprocessor); + if (Options & EOptionReadHlsl) + messages = (EShMessages)(messages | EShMsgReadHlsl); + if (Options & EOptionCascadingErrors) + messages = (EShMessages)(messages | EShMsgCascadingErrors); + if (Options & EOptionKeepUncalled) + messages = (EShMessages)(messages | EShMsgKeepUncalled); + if (Options & EOptionHlslOffsets) + messages = (EShMessages)(messages | EShMsgHlslOffsets); + if (Options & EOptionDebug) + messages = (EShMessages)(messages | EShMsgDebugInfo); + if (HlslEnable16BitTypes) + messages = (EShMessages)(messages | EShMsgHlslEnable16BitTypes); + if ((Options & EOptionOptimizeDisable) || !ENABLE_OPT) + messages = (EShMessages)(messages | EShMsgHlslLegalization); + if (HlslDX9compatible) + messages = (EShMessages)(messages | EShMsgHlslDX9Compatible); + if (DumpBuiltinSymbols) + messages = (EShMessages)(messages | EShMsgBuiltinSymbolTable); + if (EnhancedMsgs) + messages = (EShMessages)(messages | EShMsgEnhanced); + if (AbsolutePath) + messages = (EShMessages)(messages | EShMsgAbsolutePath); +} + +// +// Thread entry point, for non-linking asynchronous mode. +// +void CompileShaders(glslang::TWorklist& worklist) +{ + if (Options & EOptionDebug) + Error("cannot generate debug information unless linking to generate code"); + + // NOTE: TWorkList::remove is thread-safe + glslang::TWorkItem* workItem; + if (Options & EOptionStdin) { + if (worklist.remove(workItem)) { + ShHandle compiler = ShConstructCompiler(FindLanguage("stdin"), 0); + if (compiler == nullptr) + return; + + CompileFile("stdin", compiler); + + if (! (Options & EOptionSuppressInfolog)) + workItem->results = ShGetInfoLog(compiler); + + ShDestruct(compiler); + } + } else { + while (worklist.remove(workItem)) { + ShHandle compiler = ShConstructCompiler(FindLanguage(workItem->name), 0); + if (compiler == nullptr) + return; + + + CompileFile(workItem->name.c_str(), compiler); + + if (! (Options & EOptionSuppressInfolog)) + workItem->results = ShGetInfoLog(compiler); + + ShDestruct(compiler); + } + } +} + +// Outputs the given string, but only if it is non-null and non-empty. +// This prevents erroneous newlines from appearing. +void PutsIfNonEmpty(const char* str) +{ + if (str && str[0]) { + puts(str); + } +} + +// Outputs the given string to stderr, but only if it is non-null and non-empty. +// This prevents erroneous newlines from appearing. +void StderrIfNonEmpty(const char* str) +{ + if (str && str[0]) + fprintf(stderr, "%s\n", str); +} + +// Simple bundling of what makes a compilation unit for ease in passing around, +// and separation of handling file IO versus API (programmatic) compilation. +struct ShaderCompUnit { + EShLanguage stage; + static const int maxCount = 1; + int count; // live number of strings/names + const char* text[maxCount]; // memory owned/managed externally + std::string fileName[maxCount]; // hold's the memory, but... + const char* fileNameList[maxCount]; // downstream interface wants pointers + + ShaderCompUnit(EShLanguage stage) : stage(stage), count(0) { } + + ShaderCompUnit(const ShaderCompUnit& rhs) + { + stage = rhs.stage; + count = rhs.count; + for (int i = 0; i < count; ++i) { + fileName[i] = rhs.fileName[i]; + text[i] = rhs.text[i]; + fileNameList[i] = rhs.fileName[i].c_str(); + } + } + + void addString(std::string& ifileName, const char* itext) + { + assert(count < maxCount); + fileName[count] = ifileName; + text[count] = itext; + fileNameList[count] = fileName[count].c_str(); + ++count; + } +}; + +// Writes a string into a depfile, escaping some special characters following the Makefile rules. +static void writeEscapedDepString(std::ofstream& file, const std::string& str) +{ + for (char c : str) { + switch (c) { + case ' ': + case ':': + case '#': + case '[': + case ']': + case '\\': + file << '\\'; + break; + case '$': + file << '$'; + break; + } + file << c; + } +} + +// Writes a depfile similar to gcc -MMD foo.c +bool writeDepFile(std::string depfile, std::vector& binaryFiles, const std::vector& sources) +{ + std::ofstream file(depfile); + if (file.fail()) + return false; + + for (auto binaryFile = binaryFiles.begin(); binaryFile != binaryFiles.end(); binaryFile++) { + writeEscapedDepString(file, *binaryFile); + file << ":"; + for (auto sourceFile = sources.begin(); sourceFile != sources.end(); sourceFile++) { + file << " "; + writeEscapedDepString(file, *sourceFile); + } + file << std::endl; + } + return true; +} + +// +// For linking mode: Will independently parse each compilation unit, but then put them +// in the same program and link them together, making at most one linked module per +// pipeline stage. +// +// Uses the new C++ interface instead of the old handle-based interface. +// + +void CompileAndLinkShaderUnits(std::vector compUnits) +{ + // keep track of what to free + std::list shaders; + + EShMessages messages = EShMsgDefault; + SetMessageOptions(messages); + + DirStackFileIncluder includer; + std::for_each(IncludeDirectoryList.rbegin(), IncludeDirectoryList.rend(), [&includer](const std::string& dir) { + includer.pushExternalLocalDirectory(dir); }); + + std::vector sources; + + // + // Per-shader processing... + // + + glslang::TProgram& program = *new glslang::TProgram; + const bool compileOnly = (Options & EOptionCompileOnly) != 0; + for (auto it = compUnits.cbegin(); it != compUnits.cend(); ++it) { + const auto &compUnit = *it; + for (int i = 0; i < compUnit.count; i++) { + sources.push_back(compUnit.fileNameList[i]); + } + glslang::TShader* shader = new glslang::TShader(compUnit.stage); + shader->setStringsWithLengthsAndNames(compUnit.text, nullptr, compUnit.fileNameList, compUnit.count); + if (entryPointName) + shader->setEntryPoint(entryPointName); + if (sourceEntryPointName) { + if (entryPointName == nullptr) + printf("Warning: Changing source entry point name without setting an entry-point name.\n" + "Use '-e '.\n"); + shader->setSourceEntryPoint(sourceEntryPointName); + } + + if (compileOnly) + shader->setCompileOnly(); + + shader->setOverrideVersion(GlslVersion); + + std::string intrinsicString = getIntrinsic(compUnit.text, compUnit.count); + + PreambleString = ""; + if (UserPreamble.isSet()) + PreambleString.append(UserPreamble.get()); + + if (!intrinsicString.empty()) + PreambleString.append(intrinsicString); + + shader->setPreamble(PreambleString.c_str()); + shader->addProcesses(Processes); + + // Set IO mapper binding shift values + for (int r = 0; r < glslang::EResCount; ++r) { + const glslang::TResourceType res = glslang::TResourceType(r); + + // Set base bindings + shader->setShiftBinding(res, baseBinding[res][compUnit.stage]); + + // Set bindings for particular resource sets + // TODO: use a range based for loop here, when available in all environments. + for (auto i = baseBindingForSet[res][compUnit.stage].begin(); + i != baseBindingForSet[res][compUnit.stage].end(); ++i) + shader->setShiftBindingForSet(res, i->second, i->first); + } + shader->setNoStorageFormat((Options & EOptionNoStorageFormat) != 0); + shader->setResourceSetBinding(baseResourceSetBinding[compUnit.stage]); + + if (autoSampledTextures) + shader->setTextureSamplerTransformMode(EShTexSampTransUpgradeTextureRemoveSampler); + + if (Options & EOptionAutoMapBindings) + shader->setAutoMapBindings(true); + + if (Options & EOptionAutoMapLocations) + shader->setAutoMapLocations(true); + + for (auto& uniOverride : uniformLocationOverrides) { + shader->addUniformLocationOverride(uniOverride.first.c_str(), + uniOverride.second); + } + + shader->setUniformLocationBase(uniformBase); + + if (VulkanRulesRelaxed) { + for (auto& storageOverride : blockStorageOverrides) { + shader->addBlockStorageOverride(storageOverride.first.c_str(), + storageOverride.second); + } + + if (setGlobalBufferBlock) { + shader->setAtomicCounterBlockName(atomicCounterBlockName.c_str()); + shader->setAtomicCounterBlockSet(atomicCounterBlockSet); + } + + if (setGlobalUniformBlock) { + shader->setGlobalUniformBlockName(globalUniformName.c_str()); + shader->setGlobalUniformSet(globalUniformSet); + shader->setGlobalUniformBinding(globalUniformBinding); + } + } + + shader->setNanMinMaxClamp(NaNClamp); + +#ifdef ENABLE_HLSL + shader->setFlattenUniformArrays((Options & EOptionFlattenUniformArrays) != 0); + if (Options & EOptionHlslIoMapping) + shader->setHlslIoMapping(true); +#endif + + if (Options & EOptionInvertY) + shader->setInvertY(true); + + if (HlslDxPositionW) + shader->setDxPositionW(true); + + if (EnhancedMsgs) + shader->setEnhancedMsgs(); + + if (emitNonSemanticShaderDebugInfo) + shader->setDebugInfo(true); + + // Set up the environment, some subsettings take precedence over earlier + // ways of setting things. + if (Options & EOptionSpv) { + shader->setEnvInput((Options & EOptionReadHlsl) ? glslang::EShSourceHlsl + : glslang::EShSourceGlsl, + compUnit.stage, Client, ClientInputSemanticsVersion); + shader->setEnvClient(Client, ClientVersion); + shader->setEnvTarget(TargetLanguage, TargetVersion); +#ifdef ENABLE_HLSL + if (targetHlslFunctionality1) + shader->setEnvTargetHlslFunctionality1(); +#endif + if (VulkanRulesRelaxed) + shader->setEnvInputVulkanRulesRelaxed(); + } + + shaders.push_back(shader); + + const int defaultVersion = Options & EOptionDefaultDesktop ? 110 : 100; + + if (Options & EOptionOutputPreprocessed) { + std::string str; + if (shader->preprocess(GetResources(), defaultVersion, ENoProfile, false, false, messages, &str, includer)) { + PutsIfNonEmpty(str.c_str()); + } else { + CompileFailed = 1; + } + StderrIfNonEmpty(shader->getInfoLog()); + StderrIfNonEmpty(shader->getInfoDebugLog()); + continue; + } + + if (! shader->parse(GetResources(), defaultVersion, false, messages, includer)) + CompileFailed = 1; + + if (!compileOnly) + program.addShader(shader); + + if (! (Options & EOptionSuppressInfolog) && + ! (Options & EOptionMemoryLeakMode)) { + if (!beQuiet) + PutsIfNonEmpty(compUnit.fileName[0].c_str()); + PutsIfNonEmpty(shader->getInfoLog()); + PutsIfNonEmpty(shader->getInfoDebugLog()); + } + } + + // + // Program-level processing... + // + + if (!compileOnly) { + // Link + if (!(Options & EOptionOutputPreprocessed) && !program.link(messages)) + LinkFailed = true; + + // Map IO + if (Options & EOptionSpv) { + if (!program.mapIO()) + LinkFailed = true; + } + + // Report + if (!(Options & EOptionSuppressInfolog) && !(Options & EOptionMemoryLeakMode)) { + PutsIfNonEmpty(program.getInfoLog()); + PutsIfNonEmpty(program.getInfoDebugLog()); + } + + // Reflect + if (Options & EOptionDumpReflection) { + program.buildReflection(ReflectOptions); + program.dumpReflection(); + } + } + + std::vector outputFiles; + + // Dump SPIR-V + if (Options & EOptionSpv) { + CompileOrLinkFailed.fetch_or(CompileFailed); + CompileOrLinkFailed.fetch_or(LinkFailed); + if (static_cast(CompileOrLinkFailed.load())) + printf("SPIR-V is not generated for failed compile or link\n"); + else { + std::vector intermediates; + if (!compileOnly) { + for (int stage = 0; stage < EShLangCount; ++stage) { + if (auto* i = program.getIntermediate((EShLanguage)stage)) { + intermediates.emplace_back(i); + } + } + } else { + for (const auto* shader : shaders) { + if (auto* i = shader->getIntermediate()) { + intermediates.emplace_back(i); + } + } + } + for (auto* intermediate : intermediates) { + std::vector spirv; + spv::SpvBuildLogger logger; + glslang::SpvOptions spvOptions; + if (Options & EOptionDebug) { + spvOptions.generateDebugInfo = true; + if (emitNonSemanticShaderDebugInfo) { + spvOptions.emitNonSemanticShaderDebugInfo = true; + if (emitNonSemanticShaderDebugSource) { + spvOptions.emitNonSemanticShaderDebugSource = true; + } + } + } else if (stripDebugInfo) + spvOptions.stripDebugInfo = true; + spvOptions.disableOptimizer = (Options & EOptionOptimizeDisable) != 0; + spvOptions.optimizeSize = (Options & EOptionOptimizeSize) != 0; + spvOptions.disassemble = SpvToolsDisassembler; + spvOptions.validate = SpvToolsValidate; + spvOptions.compileOnly = compileOnly; + glslang::GlslangToSpv(*intermediate, spirv, &logger, &spvOptions); + + // Dump the spv to a file or stdout, etc., but only if not doing + // memory/perf testing, as it's not internal to programmatic use. + if (!(Options & EOptionMemoryLeakMode)) { + printf("%s", logger.getAllMessages().c_str()); + const auto filename = GetBinaryName(intermediate->getStage()); + if (Options & EOptionOutputHexadecimal) { + if (!glslang::OutputSpvHex(spirv, filename, variableName)) + exit(EFailUsage); + } else { + if (!glslang::OutputSpvBin(spirv, filename)) + exit(EFailUsage); + } + + outputFiles.push_back(filename); + if (!SpvToolsDisassembler && (Options & EOptionHumanReadableSpv)) + spv::Disassemble(std::cout, spirv); + } + } + } + } + + CompileOrLinkFailed.fetch_or(CompileFailed); + CompileOrLinkFailed.fetch_or(LinkFailed); + if (depencyFileName && !static_cast(CompileOrLinkFailed.load())) { + std::set includedFiles = includer.getIncludedFiles(); + sources.insert(sources.end(), includedFiles.begin(), includedFiles.end()); + + writeDepFile(depencyFileName, outputFiles, sources); + } + + // Free everything up, program has to go before the shaders + // because it might have merged stuff from the shaders, and + // the stuff from the shaders has to have its destructors called + // before the pools holding the memory in the shaders is freed. + delete &program; + while (shaders.size() > 0) { + delete shaders.back(); + shaders.pop_back(); + } +} + +// +// Do file IO part of compile and link, handing off the pure +// API/programmatic mode to CompileAndLinkShaderUnits(), which can +// be put in a loop for testing memory footprint and performance. +// +// This is just for linking mode: meaning all the shaders will be put into the +// the same program linked together. +// +// This means there are a limited number of work items (not multi-threading mode) +// and that the point is testing at the linking level. Hence, to enable +// performance and memory testing, the actual compile/link can be put in +// a loop, independent of processing the work items and file IO. +// +void CompileAndLinkShaderFiles(glslang::TWorklist& Worklist) +{ + std::vector compUnits; + + // If this is using stdin, we can't really detect multiple different file + // units by input type. We need to assume that we're just being given one + // file of a certain type. + if ((Options & EOptionStdin) != 0) { + ShaderCompUnit compUnit(FindLanguage("stdin")); + std::istreambuf_iterator begin(std::cin), end; + std::string tempString(begin, end); + char* fileText = strdup(tempString.c_str()); + std::string fileName = "stdin"; + compUnit.addString(fileName, fileText); + compUnits.push_back(compUnit); + } else { + // Transfer all the work items from to a simple list of + // of compilation units. (We don't care about the thread + // work-item distribution properties in this path, which + // is okay due to the limited number of shaders, know since + // they are all getting linked together.) + glslang::TWorkItem* workItem; + while (Worklist.remove(workItem)) { + ShaderCompUnit compUnit(FindLanguage(workItem->name)); + char* fileText = ReadFileData(workItem->name.c_str()); + if (fileText == nullptr) + usage(); + compUnit.addString(workItem->name, fileText); + compUnits.push_back(compUnit); + } + } + + // Actual call to programmatic processing of compile and link, + // in a loop for testing memory and performance. This part contains + // all the perf/memory that a programmatic consumer will care about. + for (int i = 0; i < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++i) { + for (int j = 0; j < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++j) + CompileAndLinkShaderUnits(compUnits); + + if (Options & EOptionMemoryLeakMode) + glslang::OS_DumpMemoryCounters(); + } + + // free memory from ReadFileData, which got stored in a const char* + // as the first string above + for (auto it = compUnits.begin(); it != compUnits.end(); ++it) + FreeFileData(const_cast(it->text[0])); +} + +int singleMain() +{ + glslang::TWorklist workList; + std::for_each(WorkItems.begin(), WorkItems.end(), [&workList](std::unique_ptr& item) { + assert(item); + workList.add(item.get()); + }); + + if (Options & EOptionDumpConfig) { + printf("%s", GetDefaultTBuiltInResourceString().c_str()); + if (workList.empty()) + return ESuccess; + } + + if (Options & EOptionDumpBareVersion) { + printf("%d:%d.%d.%d%s\n", glslang::GetSpirvGeneratorVersion(), GLSLANG_VERSION_MAJOR, GLSLANG_VERSION_MINOR, + GLSLANG_VERSION_PATCH, GLSLANG_VERSION_FLAVOR); + if (workList.empty()) + return ESuccess; + } else if (Options & EOptionDumpVersions) { + printf("Glslang Version: %d:%d.%d.%d%s\n", glslang::GetSpirvGeneratorVersion(), GLSLANG_VERSION_MAJOR, + GLSLANG_VERSION_MINOR, GLSLANG_VERSION_PATCH, GLSLANG_VERSION_FLAVOR); + printf("ESSL Version: %s\n", glslang::GetEsslVersionString()); + printf("GLSL Version: %s\n", glslang::GetGlslVersionString()); + std::string spirvVersion; + glslang::GetSpirvVersion(spirvVersion); + printf("SPIR-V Version %s\n", spirvVersion.c_str()); + printf("GLSL.std.450 Version %d, Revision %d\n", GLSLstd450Version, GLSLstd450Revision); + printf("Khronos Tool ID %d\n", glslang::GetKhronosToolId()); + printf("SPIR-V Generator Version %d\n", glslang::GetSpirvGeneratorVersion()); + printf("GL_KHR_vulkan_glsl version %d\n", 100); + printf("ARB_GL_gl_spirv version %d\n", 100); + if (workList.empty()) + return ESuccess; + } + + if (workList.empty() && ((Options & EOptionStdin) == 0)) { + usage(); + } + + if (Options & EOptionStdin) { + WorkItems.push_back(std::unique_ptr{new glslang::TWorkItem("stdin")}); + workList.add(WorkItems.back().get()); + } + + ProcessConfigFile(); + + if ((Options & EOptionReadHlsl) && !((Options & EOptionOutputPreprocessed) || (Options & EOptionSpv))) + Error("HLSL requires SPIR-V code generation (or preprocessing only)"); + + // + // Two modes: + // 1) linking all arguments together, single-threaded, new C++ interface + // 2) independent arguments, can be tackled by multiple asynchronous threads, for testing thread safety, using the old handle interface + // + if (Options & (EOptionLinkProgram | EOptionOutputPreprocessed)) { + glslang::InitializeProcess(); + glslang::InitializeProcess(); // also test reference counting of users + glslang::InitializeProcess(); // also test reference counting of users + glslang::FinalizeProcess(); // also test reference counting of users + glslang::FinalizeProcess(); // also test reference counting of users + CompileAndLinkShaderFiles(workList); + glslang::FinalizeProcess(); + } else { + ShInitialize(); + ShInitialize(); // also test reference counting of users + ShFinalize(); // also test reference counting of users + + bool printShaderNames = workList.size() > 1; + + if (Options & EOptionMultiThreaded) { + std::array threads; + for (unsigned int t = 0; t < threads.size(); ++t) { + threads[t] = std::thread(CompileShaders, std::ref(workList)); + if (threads[t].get_id() == std::thread::id()) { + fprintf(stderr, "Failed to create thread\n"); + return EFailThreadCreate; + } + } + + std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); }); + } else + CompileShaders(workList); + + // Print out all the resulting infologs + for (size_t w = 0; w < WorkItems.size(); ++w) { + if (WorkItems[w]) { + if (printShaderNames || WorkItems[w]->results.size() > 0) + PutsIfNonEmpty(WorkItems[w]->name.c_str()); + PutsIfNonEmpty(WorkItems[w]->results.c_str()); + } + } + + ShFinalize(); + } + + if (CompileFailed.load()) + return EFailCompile; + if (LinkFailed.load()) + return EFailLink; + + return 0; +} + +int C_DECL main(int argc, char* argv[]) +{ + ProcessArguments(WorkItems, argc, argv); + + int ret = 0; + + // Loop over the entire init/finalize cycle to watch memory changes + const int iterations = 1; + if (iterations > 1) + glslang::OS_DumpMemoryCounters(); + for (int i = 0; i < iterations; ++i) { + ret = singleMain(); + if (iterations > 1) + glslang::OS_DumpMemoryCounters(); + } + + return ret; +} + +// +// Deduce the language from the filename. Files must end in one of the +// following extensions: +// +// .vert = vertex +// .tesc = tessellation control +// .tese = tessellation evaluation +// .geom = geometry +// .frag = fragment +// .comp = compute +// .rgen = ray generation +// .rint = ray intersection +// .rahit = ray any hit +// .rchit = ray closest hit +// .rmiss = ray miss +// .rcall = ray callable +// .mesh = mesh +// .task = task +// Additionally, the file names may end in ..glsl and ..hlsl +// where is one of the stages listed above. +// +EShLanguage FindLanguage(const std::string& name, bool parseStageName) +{ + std::string stageName; + if (shaderStageName) + stageName = shaderStageName; + else if (parseStageName) { + // Note: "first" extension means "first from the end", i.e. + // if the file is named foo.vert.glsl, then "glsl" is first, + // "vert" is second. + size_t firstExtStart = name.find_last_of("."); + bool hasFirstExt = firstExtStart != std::string::npos; + size_t secondExtStart = hasFirstExt ? name.find_last_of(".", firstExtStart - 1) : std::string::npos; + bool hasSecondExt = secondExtStart != std::string::npos; + std::string firstExt = name.substr(firstExtStart + 1, std::string::npos); + bool usesUnifiedExt = hasFirstExt && (firstExt == "glsl" || firstExt == "hlsl"); + if (usesUnifiedExt && firstExt == "hlsl") + Options |= EOptionReadHlsl; + if (hasFirstExt && !usesUnifiedExt) + stageName = firstExt; + else if (usesUnifiedExt && hasSecondExt) + stageName = name.substr(secondExtStart + 1, firstExtStart - secondExtStart - 1); + else { + usage(); + return EShLangVertex; + } + } else + stageName = name; + + if (stageName == "vert") + return EShLangVertex; + else if (stageName == "tesc") + return EShLangTessControl; + else if (stageName == "tese") + return EShLangTessEvaluation; + else if (stageName == "geom") + return EShLangGeometry; + else if (stageName == "frag") + return EShLangFragment; + else if (stageName == "comp") + return EShLangCompute; + else if (stageName == "rgen") + return EShLangRayGen; + else if (stageName == "rint") + return EShLangIntersect; + else if (stageName == "rahit") + return EShLangAnyHit; + else if (stageName == "rchit") + return EShLangClosestHit; + else if (stageName == "rmiss") + return EShLangMiss; + else if (stageName == "rcall") + return EShLangCallable; + else if (stageName == "mesh") + return EShLangMesh; + else if (stageName == "task") + return EShLangTask; + + usage(); + return EShLangVertex; +} + +// +// Read a file's data into a string, and compile it using the old interface ShCompile, +// for non-linkable results. +// +void CompileFile(const char* fileName, ShHandle compiler) +{ + int ret = 0; + char* shaderString; + if ((Options & EOptionStdin) != 0) { + std::istreambuf_iterator begin(std::cin), end; + std::string tempString(begin, end); + shaderString = strdup(tempString.c_str()); + } else { + shaderString = ReadFileData(fileName); + } + + // move to length-based strings, rather than null-terminated strings + int* lengths = new int[1]; + lengths[0] = (int)strlen(shaderString); + + EShMessages messages = EShMsgDefault; + SetMessageOptions(messages); + + if (UserPreamble.isSet()) + Error("-D, -U and -P options require -l (linking)\n"); + + for (int i = 0; i < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++i) { + for (int j = 0; j < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++j) { + // ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages); + ret = ShCompile(compiler, &shaderString, 1, nullptr, EShOptNone, GetResources(), 0, + (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages, fileName); + // const char* multi[12] = { "# ve", "rsion", " 300 e", "s", "\n#err", + // "or should be l", "ine 1", "string 5\n", "float glo", "bal", + // ";\n#error should be line 2\n void main() {", "global = 2.3;}" }; + // const char* multi[7] = { "/", "/", "\\", "\n", "\n", "#", "version 300 es" }; + // ret = ShCompile(compiler, multi, 7, nullptr, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages); + } + + if (Options & EOptionMemoryLeakMode) + glslang::OS_DumpMemoryCounters(); + } + + delete [] lengths; + FreeFileData(shaderString); + + if (ret == 0) + CompileFailed = true; +} + +// +// print usage to stdout +// +void usage() +{ + printf("Usage: glslang [option]... [file]...\n" + "\n" + "'file' can end in . for auto-stage classification, where is:\n" + " .conf to provide a config file that replaces the default configuration\n" + " (see -c option below for generating a template)\n" + " .vert for a vertex shader\n" + " .tesc for a tessellation control shader\n" + " .tese for a tessellation evaluation shader\n" + " .geom for a geometry shader\n" + " .frag for a fragment shader\n" + " .comp for a compute shader\n" + " .mesh for a mesh shader\n" + " .task for a task shader\n" + " .rgen for a ray generation shader\n" + " .rint for a ray intersection shader\n" + " .rahit for a ray any hit shader\n" + " .rchit for a ray closest hit shader\n" + " .rmiss for a ray miss shader\n" + " .rcall for a ray callable shader\n" + " .glsl for .vert.glsl, .tesc.glsl, ..., .comp.glsl compound suffixes\n" + " .hlsl for .vert.hlsl, .tesc.hlsl, ..., .comp.hlsl compound suffixes\n" + "\n" + "Options:\n" + " -C cascading errors; risk crash from accumulation of error recoveries\n" + " -D input is HLSL (this is the default when any suffix is .hlsl)\n" + " -D | --define-macro | --D \n" + " define a pre-processor macro\n" + " -E print pre-processed GLSL; cannot be used with -l;\n" + " errors will appear on stderr\n" + " -G[ver] create SPIR-V binary, under OpenGL semantics; turns on -l;\n" + " default file name is .spv (-o overrides this);\n" + " 'ver', when present, is the version of the input semantics,\n" + " which will appear in #define GL_SPIRV ver;\n" + " '--client opengl100' is the same as -G100;\n" + " a '--target-env' for OpenGL will also imply '-G';\n" + " currently only supports GLSL\n" + " -H print human readable form of SPIR-V; turns on -V\n" + " -I add dir to the include search path; includer's directory\n" + " is searched first, followed by left-to-right order of -I\n" + " -Od disables optimization; may cause illegal SPIR-V for HLSL\n" + " -Os optimizes SPIR-V to minimize size\n" + " -P | --preamble-text | --P \n" + " inject custom preamble text, which is treated as if it\n" + " appeared immediately after the version declaration (if any).\n" + " -R use relaxed verification rules for generating Vulkan SPIR-V,\n" + " allowing the use of default uniforms, atomic_uints, and\n" + " gl_VertexID and gl_InstanceID keywords.\n" + " -S uses specified stage rather than parsing the file extension\n" + " choices for are vert, tesc, tese, geom, frag, or comp\n" + " -U | --undef-macro | --U \n" + " undefine a pre-processor macro\n" + " -V[ver] create SPIR-V binary, under Vulkan semantics; turns on -l;\n" + " default file name is .spv (-o overrides this)\n" + " 'ver', when present, is the version of the input semantics,\n" + " which will appear in #define VULKAN ver\n" + " '--client vulkan100' is the same as -V100\n" + " a '--target-env' for Vulkan will also imply '-V'\n" + " -c configuration dump;\n" + " creates the default configuration file (redirect to a .conf file)\n" + " -d default to desktop (#version 110) when there is no shader #version\n" + " (default is ES version 100)\n" + " -e | --entry-point \n" + " specify as the entry-point function name\n" + " -f{hlsl_functionality1}\n" + " 'hlsl_functionality1' enables use of the\n" + " SPV_GOOGLE_hlsl_functionality1 extension\n" + " -g generate debug information\n" + " -g0 strip debug information\n" + " -gV generate nonsemantic shader debug information\n" + " -gVS generate nonsemantic shader debug information with source\n" + " -h print this usage message\n" + " -i intermediate tree (glslang AST) is printed out\n" + " -l link all input files together to form a single module\n" + " -m memory leak mode\n" + " -o save binary to , requires a binary option (e.g., -V)\n" + " -q dump reflection query database; requires -l for linking\n" + " -r | --relaxed-errors" + " relaxed GLSL semantic error-checking mode\n" + " -s silence syntax and semantic error reporting\n" + " -t multi-threaded mode\n" + " -v | --version\n" + " print version strings\n" + " -w | --suppress-warnings\n" + " suppress GLSL warnings, except as required by \"#extension : warn\"\n" + " -x save binary output as text-based 32-bit hexadecimal numbers\n" + " -u: specify a uniform location override for --aml\n" + " --uniform-base set a base to use for generated uniform locations\n" + " --auto-map-bindings | --amb automatically bind uniform variables\n" + " without explicit bindings\n" + " --auto-map-locations | --aml automatically locate input/output lacking\n" + " 'location' (fragile, not cross stage)\n" + " --absolute-path Prints absolute path for messages\n" + " --auto-sampled-textures Removes sampler variables and converts\n" + " existing textures to sampled textures\n" + " --client {vulkan|opengl} see -V and -G\n" + " --depfile writes depfile for build systems\n" + " --dump-builtin-symbols prints builtin symbol table prior each compile\n" + " -dumpfullversion | -dumpversion print bare major.minor.patchlevel\n" + " --flatten-uniform-arrays | --fua flatten uniform texture/sampler arrays to\n" + " scalars\n" + " --glsl-version {100 | 110 | 120 | 130 | 140 | 150 |\n" + " 300es | 310es | 320es | 330\n" + " 400 | 410 | 420 | 430 | 440 | 450 | 460}\n" + " set GLSL version, overrides #version\n" + " in shader sourcen\n" + " --hlsl-offsets allow block offsets to follow HLSL rules\n" + " works independently of source language\n" + " --hlsl-iomap perform IO mapping in HLSL register space\n" + " --hlsl-enable-16bit-types allow 16-bit types in SPIR-V for HLSL\n" + " --hlsl-dx9-compatible interprets sampler declarations as a\n" + " texture/sampler combo like DirectX9 would,\n" + " and recognizes DirectX9-specific semantics\n" + " --hlsl-dx-position-w W component of SV_Position in HLSL fragment\n" + " shaders compatible with DirectX\n" + " --invert-y | --iy invert position.Y output in vertex shader\n" + " --enhanced-msgs print more readable error messages (GLSL only)\n" + " --keep-uncalled | --ku don't eliminate uncalled functions\n" + " --nan-clamp favor non-NaN operand in min, max, and clamp\n" + " --no-storage-format | --nsf use Unknown image format\n" + " --quiet do not print anything to stdout, unless\n" + " requested by another option\n" + " --reflect-strict-array-suffix use strict array suffix rules when\n" + " reflecting\n" + " --reflect-basic-array-suffix arrays of basic types will have trailing [0]\n" + " --reflect-intermediate-io reflection includes inputs/outputs of linked\n" + " shaders rather than just vertex/fragment\n" + " --reflect-separate-buffers reflect buffer variables and blocks\n" + " separately to uniforms\n" + " --reflect-all-block-variables reflect all variables in blocks, whether\n" + " inactive or active\n" + " --reflect-unwrap-io-blocks unwrap input/output blocks the same as\n" + " uniform blocks\n" + " --resource-set-binding [stage] name set binding\n" + " set descriptor set and binding for\n" + " individual resources\n" + " --resource-set-binding [stage] set\n" + " set descriptor set for all resources\n" + " --rsb synonym for --resource-set-binding\n" + " --set-block-backing name {uniform|buffer|push_constant}\n" + " changes the backing type of a uniform, buffer,\n" + " or push_constant block declared in\n" + " in the program, when using -R option.\n" + " This can be used to change the backing\n" + " for existing blocks as well as implicit ones\n" + " such as 'gl_DefaultUniformBlock'.\n" + " --sbs synonym for set-block-storage\n" + " --set-atomic-counter-block name set\n" + " set name, and descriptor set for\n" + " atomic counter blocks, with -R opt\n" + " --sacb synonym for set-atomic-counter-block\n" + " --set-default-uniform-block name set binding\n" + " set name, descriptor set, and binding for\n" + " global default-uniform-block, with -R opt\n" + " --sdub synonym for set-default-uniform-block\n" + " --shift-image-binding [stage] num\n" + " base binding number for images (uav)\n" + " --shift-image-binding [stage] [num set]...\n" + " per-descriptor-set shift values\n" + " --sib synonym for --shift-image-binding\n" + " --shift-sampler-binding [stage] num\n" + " base binding number for samplers\n" + " --shift-sampler-binding [stage] [num set]...\n" + " per-descriptor-set shift values\n" + " --ssb synonym for --shift-sampler-binding\n" + " --shift-ssbo-binding [stage] num base binding number for SSBOs\n" + " --shift-ssbo-binding [stage] [num set]...\n" + " per-descriptor-set shift values\n" + " --sbb synonym for --shift-ssbo-binding\n" + " --shift-texture-binding [stage] num\n" + " base binding number for textures\n" + " --shift-texture-binding [stage] [num set]...\n" + " per-descriptor-set shift values\n" + " --stb synonym for --shift-texture-binding\n" + " --shift-uav-binding [stage] num base binding number for UAVs\n" + " --shift-uav-binding [stage] [num set]...\n" + " per-descriptor-set shift values\n" + " --suavb synonym for --shift-uav-binding\n" + " --shift-UBO-binding [stage] num base binding number for UBOs\n" + " --shift-UBO-binding [stage] [num set]...\n" + " per-descriptor-set shift values\n" + " --sub synonym for --shift-UBO-binding\n" + " --shift-cbuffer-binding | --scb synonyms for --shift-UBO-binding\n" + " --spirv-dis output standard-form disassembly; works only\n" + " when a SPIR-V generation option is also used\n" + " --spirv-val execute the SPIRV-Tools validator\n" + " --source-entrypoint the given shader source function is\n" + " renamed to be the given in -e\n" + " --sep synonym for --source-entrypoint\n" + " --stdin read from stdin instead of from a file;\n" + " requires providing the shader stage using -S\n" + " --target-env {vulkan1.0 | vulkan1.1 | vulkan1.2 | vulkan1.3 | opengl |\n" + " spirv1.0 | spirv1.1 | spirv1.2 | spirv1.3 | spirv1.4 |\n" + " spirv1.5 | spirv1.6}\n" + " Set the execution environment that the\n" + " generated code will be executed in.\n" + " Defaults to:\n" + " * vulkan1.0 under --client vulkan\n" + " * opengl under --client opengl\n" + " * spirv1.0 under --target-env vulkan1.0\n" + " * spirv1.3 under --target-env vulkan1.1\n" + " * spirv1.5 under --target-env vulkan1.2\n" + " * spirv1.6 under --target-env vulkan1.3\n" + " Multiple --target-env can be specified.\n" + " --variable-name \n" + " --vn creates a C header file that contains a\n" + " uint32_t array named \n" + " initialized with the shader binary code\n" + " --no-link Only compile shader; do not link (GLSL-only)\n" + " NOTE: this option will set the export linkage\n" + " attribute on all functions\n"); + + exit(EFailUsage); +} + +#if !defined _MSC_VER && !defined MINGW_HAS_SECURE_API + +#include + +int fopen_s( + FILE** pFile, + const char* filename, + const char* mode +) +{ + if (!pFile || !filename || !mode) { + return EINVAL; + } + + FILE* f = fopen(filename, mode); + if (! f) { + if (errno != 0) { + return errno; + } else { + return ENOENT; + } + } + *pFile = f; + + return 0; +} + +#endif + +// +// Malloc a string of sufficient size and read a string into it. +// +char* ReadFileData(const char* fileName) +{ + FILE *in = nullptr; + int errorCode = fopen_s(&in, fileName, "r"); + if (errorCode || in == nullptr) + Error("unable to open input file"); + + int count = 0; + while (fgetc(in) != EOF) + count++; + + fseek(in, 0, SEEK_SET); + + if (count > 3) { + unsigned char head[3]; + if (fread(head, 1, 3, in) == 3) { + if (head[0] == 0xef && head[1] == 0xbb && head[2] == 0xbf) { + // skip BOM + count -= 3; + } else { + fseek(in, 0, SEEK_SET); + } + } else { + Error("can't read input file"); + } + } + + char* return_data = (char*)malloc(count + 1); // freed in FreeFileData() + if ((int)fread(return_data, 1, count, in) != count) { + free(return_data); + Error("can't read input file"); + } + + return_data[count] = '\0'; + fclose(in); + + return return_data; +} + +void FreeFileData(char* data) +{ + free(data); +} + +void InfoLogMsg(const char* msg, const char* name, const int num) +{ + if (num >= 0 ) + printf("#### %s %s %d INFO LOG ####\n", msg, name, num); + else + printf("#### %s %s INFO LOG ####\n", msg, name); +} diff --git a/libraries/ZVulkan/src/glslang/StandAlone/Worklist.h b/libraries/ZVulkan/src/glslang/StandAlone/Worklist.h new file mode 100644 index 000000000..91b6f516b --- /dev/null +++ b/libraries/ZVulkan/src/glslang/StandAlone/Worklist.h @@ -0,0 +1,95 @@ +// +// Copyright (C) 2013 LunarG, Inc. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +#ifndef WORKLIST_H_INCLUDED +#define WORKLIST_H_INCLUDED + +#include "../glslang/OSDependent/osinclude.h" +#include +#include +#include + +namespace glslang { + + class TWorkItem { + public: + TWorkItem() { } + explicit TWorkItem(const std::string& s) : + name(s) { } + std::string name; + std::string results; + std::string resultsIndex; + }; + + class TWorklist { + public: + TWorklist() { } + virtual ~TWorklist() { } + + void add(TWorkItem* item) + { + std::lock_guard guard(mutex); + worklist.push_back(item); + } + + bool remove(TWorkItem*& item) + { + std::lock_guard guard(mutex); + + if (worklist.empty()) + return false; + item = worklist.front(); + worklist.pop_front(); + + return true; + } + + int size() + { + return (int)worklist.size(); + } + + bool empty() + { + return worklist.empty(); + } + + protected: + std::mutex mutex; + std::list worklist; + }; + +} // end namespace glslang + +#endif // WORKLIST_H_INCLUDED diff --git a/libraries/ZVulkan/src/glslang/StandAlone/spirv-remap.cpp b/libraries/ZVulkan/src/glslang/StandAlone/spirv-remap.cpp new file mode 100644 index 000000000..1bd4a2d6a --- /dev/null +++ b/libraries/ZVulkan/src/glslang/StandAlone/spirv-remap.cpp @@ -0,0 +1,402 @@ +// +// Copyright (C) 2015 LunarG, Inc. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// + +#include +#include +#include +#include +#include + +// +// Include remapper +// +#include "../SPIRV/SPVRemapper.h" + +namespace { + + typedef unsigned int SpvWord; + + // Poor man's basename: given a complete path, return file portion. + // E.g: + // Linux: /foo/bar/test -> test + // Win: c:\foo\bar\test -> test + // It's not very efficient, but that doesn't matter for our minimal-duty use. + // Using boost::filesystem would be better in many ways, but want to avoid that dependency. + + // OS dependent path separator (avoiding boost::filesystem dependency) +#if defined(_WIN32) + char path_sep_char() { return '\\'; } +#else + char path_sep_char() { return '/'; } +#endif + + std::string basename(const std::string filename) + { + const size_t sepLoc = filename.find_last_of(path_sep_char()); + + return (sepLoc == filename.npos) ? filename : filename.substr(sepLoc+1); + } + + void errHandler(const std::string& str) { + std::cout << str << std::endl; + exit(5); + } + + void logHandler(const std::string& str) { + std::cout << str << std::endl; + } + + // Read word stream from disk + void read(std::vector& spv, const std::string& inFilename, int verbosity) + { + std::ifstream fp; + + if (verbosity > 0) + logHandler(std::string(" reading: ") + inFilename); + + spv.clear(); + fp.open(inFilename, std::fstream::in | std::fstream::binary); + + if (fp.fail()) + errHandler("error opening file for read: "); + + // Reserve space (for efficiency, not for correctness) + fp.seekg(0, fp.end); + spv.reserve(size_t(fp.tellg()) / sizeof(SpvWord)); + fp.seekg(0, fp.beg); + + while (!fp.eof()) { + SpvWord inWord; + fp.read((char *)&inWord, sizeof(inWord)); + + if (!fp.eof()) { + spv.push_back(inWord); + if (fp.fail()) + errHandler(std::string("error reading file: ") + inFilename); + } + } + } + + // Read strings from a file + void read(std::vector& strings, const std::string& inFilename, int verbosity) + { + std::ifstream fp; + + if (verbosity > 0) + logHandler(std::string(" reading: ") + inFilename); + + strings.clear(); + fp.open(inFilename, std::fstream::in); + + if (fp.fail()) + errHandler("error opening file for read: "); + + std::string line; + while (std::getline(fp, line)) + { + // Ignore empty lines and lines starting with the comment marker '#'. + if (line.length() == 0 || line[0] == '#') { + continue; + } + + strings.push_back(line); + } + } + + void write(std::vector& spv, const std::string& outFile, int verbosity) + { + if (outFile.empty()) + errHandler("missing output filename."); + + std::ofstream fp; + + if (verbosity > 0) + logHandler(std::string(" writing: ") + outFile); + + fp.open(outFile, std::fstream::out | std::fstream::binary); + + if (fp.fail()) + errHandler(std::string("error opening file for write: ") + outFile); + + for (auto it = spv.cbegin(); it != spv.cend(); ++it) { + SpvWord word = *it; + fp.write((char *)&word, sizeof(word)); + if (fp.fail()) + errHandler(std::string("error writing file: ") + outFile); + } + + // file is closed by destructor + } + + // Print helpful usage message to stdout, and exit + void usage(const char* const name, const char* const msg = nullptr) + { + if (msg) + std::cout << msg << std::endl << std::endl; + + std::cout << "Usage: " << std::endl; + + std::cout << " " << basename(name) + << " [-v[v[...]] | --verbose [int]]" + << " [--map (all|types|names|funcs)]" + << " [--dce (all|types|funcs)]" + << " [--opt (all|loadstore)]" + << " [--strip-all | --strip all | -s]" + << " [--strip-white-list]" + << " [--do-everything]" + << " --input | -i file1 [file2...] --output|-o DESTDIR | destfile1 [destfile2...]" + << std::endl; + + std::cout << " " << basename(name) << " [--version | -V]" << std::endl; + std::cout << " " << basename(name) << " [--help | -?]" << std::endl; + + exit(5); + } + + // grind through each SPIR in turn + void execute(const std::vector& inputFiles, + const std::vector& outputDirOrFiles, + const bool isSingleOutputDir, + const std::string& whiteListFile, + int opts, + int verbosity) + { + std::vector whiteListStrings; + if (!whiteListFile.empty()) + read(whiteListStrings, whiteListFile, verbosity); + + for (std::size_t ii=0; ii spv; + read(spv, inputFiles[ii], verbosity); + + spv::spirvbin_t(verbosity).remap(spv, whiteListStrings, opts); + + if (isSingleOutputDir) { + // write all outputs to same directory + const std::string outFile = outputDirOrFiles[0] + path_sep_char() + basename(inputFiles[ii]); + write(spv, outFile, verbosity); + } else { + // write each input to its associated output + write(spv, outputDirOrFiles[ii], verbosity); + } + } + + if (verbosity > 0) + std::cout << "Done: " << inputFiles.size() << " file(s) processed" << std::endl; + } + + // Parse command line options + void parseCmdLine(int argc, + char** argv, + std::vector& inputFiles, + std::vector& outputDirOrFiles, + std::string& stripWhiteListFile, + int& options, + int& verbosity) + { + if (argc < 2) + usage(argv[0]); + + verbosity = 0; + options = spv::spirvbin_t::NONE; + + // Parse command line. + // boost::program_options would be quite a bit nicer, but we don't want to + // introduce a dependency on boost. + for (int a=1; a inputFiles; + std::vector outputDirOrFiles; + std::string whiteListFile; + int opts; + int verbosity; + + // handle errors by exiting + spv::spirvbin_t::registerErrorHandler(errHandler); + + // Log messages to std::cout + spv::spirvbin_t::registerLogHandler(logHandler); + + if (argc < 2) + usage(argv[0]); + + parseCmdLine(argc, argv, inputFiles, outputDirOrFiles, whiteListFile, opts, verbosity); + + if (outputDirOrFiles.empty()) + usage(argv[0], "Output directory or file(s) required."); + + const bool isMultiInput = inputFiles.size() > 1; + const bool isMultiOutput = outputDirOrFiles.size() > 1; + const bool isSingleOutputDir = !isMultiOutput && std::filesystem::is_directory(outputDirOrFiles[0]); + + if (isMultiInput && !isMultiOutput && !isSingleOutputDir) + usage(argv[0], "Output is not a directory."); + + + if (isMultiInput && isMultiOutput && (outputDirOrFiles.size() != inputFiles.size())) + usage(argv[0], "Output must be either a single directory or one output file per input."); + + // Main operations: read, remap, and write. + execute(inputFiles, outputDirOrFiles, isSingleOutputDir, whiteListFile, opts, verbosity); + + // If we get here, everything went OK! Nothing more to be done. +} diff --git a/libraries/ZVulkan/src/glslang/build_info.h b/libraries/ZVulkan/src/glslang/build_info.h new file mode 100644 index 000000000..35940d133 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/build_info.h @@ -0,0 +1,62 @@ +// Copyright (C) 2020 The Khronos Group Inc. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of The Khronos Group Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#ifndef GLSLANG_BUILD_INFO +#define GLSLANG_BUILD_INFO + +#define GLSLANG_VERSION_MAJOR 14 +#define GLSLANG_VERSION_MINOR 3 +#define GLSLANG_VERSION_PATCH 0 +#define GLSLANG_VERSION_FLAVOR "" + +#define GLSLANG_VERSION_GREATER_THAN(major, minor, patch) \ + ((GLSLANG_VERSION_MAJOR) > (major) || ((major) == GLSLANG_VERSION_MAJOR && \ + ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ + (GLSLANG_VERSION_PATCH) > (patch))))) + +#define GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch) \ + ((GLSLANG_VERSION_MAJOR) > (major) || ((major) == GLSLANG_VERSION_MAJOR && \ + ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ + (GLSLANG_VERSION_PATCH >= (patch)))))) + +#define GLSLANG_VERSION_LESS_THAN(major, minor, patch) \ + ((GLSLANG_VERSION_MAJOR) < (major) || ((major) == GLSLANG_VERSION_MAJOR && \ + ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ + (GLSLANG_VERSION_PATCH) < (patch))))) + +#define GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch) \ + ((GLSLANG_VERSION_MAJOR) < (major) || ((major) == GLSLANG_VERSION_MAJOR && \ + ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) == GLSLANG_VERSION_MINOR && \ + (GLSLANG_VERSION_PATCH <= (patch)))))) + +#endif // GLSLANG_BUILD_INFO diff --git a/libraries/ZVulkan/src/glslang/glslang/CInterface/glslang_c_interface.cpp b/libraries/ZVulkan/src/glslang/glslang/CInterface/glslang_c_interface.cpp new file mode 100644 index 000000000..dcc46614d --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/CInterface/glslang_c_interface.cpp @@ -0,0 +1,470 @@ +/** + This code is based on the glslang_c_interface implementation by Viktor Latypov +**/ + +/** +BSD 2-Clause License + +Copyright (c) 2019, Viktor Latypov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**/ + +#include "../Include/glslang_c_interface.h" + +#include "../../StandAlone/DirStackFileIncluder.h" +#include "../Public/ResourceLimits.h" +#include "../Include/ShHandle.h" + +#include "../Include/ResourceLimits.h" +#include "../MachineIndependent/Versions.h" +#include "../MachineIndependent/localintermediate.h" + +static_assert(int(GLSLANG_STAGE_COUNT) == EShLangCount, ""); +static_assert(int(GLSLANG_STAGE_MASK_COUNT) == EShLanguageMaskCount, ""); +static_assert(int(GLSLANG_SOURCE_COUNT) == glslang::EShSourceCount, ""); +static_assert(int(GLSLANG_CLIENT_COUNT) == glslang::EShClientCount, ""); +static_assert(int(GLSLANG_TARGET_COUNT) == glslang::EShTargetCount, ""); +static_assert(int(GLSLANG_TARGET_CLIENT_VERSION_COUNT) == glslang::EShTargetClientVersionCount, ""); +static_assert(int(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT) == glslang::EShTargetLanguageVersionCount, ""); +static_assert(int(GLSLANG_OPT_LEVEL_COUNT) == EshOptLevelCount, ""); +static_assert(int(GLSLANG_TEX_SAMP_TRANS_COUNT) == EShTexSampTransCount, ""); +static_assert(int(GLSLANG_MSG_COUNT) == EShMsgCount, ""); +static_assert(int(GLSLANG_REFLECTION_COUNT) == EShReflectionCount, ""); +static_assert(int(GLSLANG_PROFILE_COUNT) == EProfileCount, ""); +static_assert(sizeof(glslang_limits_t) == sizeof(TLimits), ""); +static_assert(sizeof(glslang_resource_t) == sizeof(TBuiltInResource), ""); + +typedef struct glslang_shader_s { + glslang::TShader* shader; + std::string preprocessedGLSL; +} glslang_shader_t; + +typedef struct glslang_program_s { + glslang::TProgram* program; + std::vector spirv; + std::string loggerMessages; +} glslang_program_t; + +/* Wrapper/Adapter for C glsl_include_callbacks_t functions + + This class contains a 'glsl_include_callbacks_t' structure + with C include_local/include_system callback pointers. + + This class implement TShader::Includer interface + by redirecting C++ virtual methods to C callbacks. + + The 'IncludeResult' instances produced by this Includer + contain a reference to glsl_include_result_t C structure + to allow its lifetime management by another C callback + (CallbackIncluder::callbacks::free_include_result) +*/ +class CallbackIncluder : public glslang::TShader::Includer { +public: + CallbackIncluder(glsl_include_callbacks_t _callbacks, void* _context) : callbacks(_callbacks), context(_context) {} + + virtual ~CallbackIncluder() {} + + virtual IncludeResult* includeSystem(const char* headerName, const char* includerName, + size_t inclusionDepth) override + { + if (this->callbacks.include_system) { + glsl_include_result_t* result = + this->callbacks.include_system(this->context, headerName, includerName, inclusionDepth); + return makeIncludeResult(result); + } + + return glslang::TShader::Includer::includeSystem(headerName, includerName, inclusionDepth); + } + + virtual IncludeResult* includeLocal(const char* headerName, const char* includerName, + size_t inclusionDepth) override + { + if (this->callbacks.include_local) { + glsl_include_result_t* result = + this->callbacks.include_local(this->context, headerName, includerName, inclusionDepth); + return makeIncludeResult(result); + } + + return glslang::TShader::Includer::includeLocal(headerName, includerName, inclusionDepth); + } + + /* This function only calls free_include_result callback + when the IncludeResult instance is allocated by a C function */ + virtual void releaseInclude(IncludeResult* result) override + { + if (result == nullptr) + return; + + if (this->callbacks.free_include_result) { + this->callbacks.free_include_result(this->context, static_cast(result->userData)); + } + + delete result; + } + +private: + CallbackIncluder() {} + + IncludeResult* makeIncludeResult(glsl_include_result_t* result) { + if (!result) { + return nullptr; + } + + return new glslang::TShader::Includer::IncludeResult( + std::string(result->header_name), result->header_data, result->header_length, result); + } + + /* C callback pointers */ + glsl_include_callbacks_t callbacks; + /* User-defined context */ + void* context; +}; + +GLSLANG_EXPORT int glslang_initialize_process() { return static_cast(glslang::InitializeProcess()); } + +GLSLANG_EXPORT void glslang_finalize_process() { glslang::FinalizeProcess(); } + +static EShLanguage c_shader_stage(glslang_stage_t stage) +{ + switch (stage) { + case GLSLANG_STAGE_VERTEX: + return EShLangVertex; + case GLSLANG_STAGE_TESSCONTROL: + return EShLangTessControl; + case GLSLANG_STAGE_TESSEVALUATION: + return EShLangTessEvaluation; + case GLSLANG_STAGE_GEOMETRY: + return EShLangGeometry; + case GLSLANG_STAGE_FRAGMENT: + return EShLangFragment; + case GLSLANG_STAGE_COMPUTE: + return EShLangCompute; + case GLSLANG_STAGE_RAYGEN_NV: + return EShLangRayGen; + case GLSLANG_STAGE_INTERSECT_NV: + return EShLangIntersect; + case GLSLANG_STAGE_ANYHIT_NV: + return EShLangAnyHit; + case GLSLANG_STAGE_CLOSESTHIT_NV: + return EShLangClosestHit; + case GLSLANG_STAGE_MISS_NV: + return EShLangMiss; + case GLSLANG_STAGE_CALLABLE_NV: + return EShLangCallable; + case GLSLANG_STAGE_TASK: + return EShLangTask; + case GLSLANG_STAGE_MESH: + return EShLangMesh; + default: + break; + } + return EShLangCount; +} + +static int c_shader_messages(glslang_messages_t messages) +{ +#define CONVERT_MSG(in, out) \ + if ((messages & in) == in) \ + res |= out; + + int res = 0; + + CONVERT_MSG(GLSLANG_MSG_RELAXED_ERRORS_BIT, EShMsgRelaxedErrors); + CONVERT_MSG(GLSLANG_MSG_SUPPRESS_WARNINGS_BIT, EShMsgSuppressWarnings); + CONVERT_MSG(GLSLANG_MSG_AST_BIT, EShMsgAST); + CONVERT_MSG(GLSLANG_MSG_SPV_RULES_BIT, EShMsgSpvRules); + CONVERT_MSG(GLSLANG_MSG_VULKAN_RULES_BIT, EShMsgVulkanRules); + CONVERT_MSG(GLSLANG_MSG_ONLY_PREPROCESSOR_BIT, EShMsgOnlyPreprocessor); + CONVERT_MSG(GLSLANG_MSG_READ_HLSL_BIT, EShMsgReadHlsl); + CONVERT_MSG(GLSLANG_MSG_CASCADING_ERRORS_BIT, EShMsgCascadingErrors); + CONVERT_MSG(GLSLANG_MSG_KEEP_UNCALLED_BIT, EShMsgKeepUncalled); + CONVERT_MSG(GLSLANG_MSG_HLSL_OFFSETS_BIT, EShMsgHlslOffsets); + CONVERT_MSG(GLSLANG_MSG_DEBUG_INFO_BIT, EShMsgDebugInfo); + CONVERT_MSG(GLSLANG_MSG_HLSL_ENABLE_16BIT_TYPES_BIT, EShMsgHlslEnable16BitTypes); + CONVERT_MSG(GLSLANG_MSG_HLSL_LEGALIZATION_BIT, EShMsgHlslLegalization); + CONVERT_MSG(GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT, EShMsgHlslDX9Compatible); + CONVERT_MSG(GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT, EShMsgBuiltinSymbolTable); + CONVERT_MSG(GLSLANG_MSG_ABSOLUTE_PATH, EShMsgAbsolutePath); + return res; +#undef CONVERT_MSG +} + +static glslang::EShTargetLanguageVersion +c_shader_target_language_version(glslang_target_language_version_t target_language_version) +{ + switch (target_language_version) { + case GLSLANG_TARGET_SPV_1_0: + return glslang::EShTargetSpv_1_0; + case GLSLANG_TARGET_SPV_1_1: + return glslang::EShTargetSpv_1_1; + case GLSLANG_TARGET_SPV_1_2: + return glslang::EShTargetSpv_1_2; + case GLSLANG_TARGET_SPV_1_3: + return glslang::EShTargetSpv_1_3; + case GLSLANG_TARGET_SPV_1_4: + return glslang::EShTargetSpv_1_4; + case GLSLANG_TARGET_SPV_1_5: + return glslang::EShTargetSpv_1_5; + case GLSLANG_TARGET_SPV_1_6: + return glslang::EShTargetSpv_1_6; + default: + break; + } + return glslang::EShTargetSpv_1_0; +} + +static glslang::EShClient c_shader_client(glslang_client_t client) +{ + switch (client) { + case GLSLANG_CLIENT_VULKAN: + return glslang::EShClientVulkan; + case GLSLANG_CLIENT_OPENGL: + return glslang::EShClientOpenGL; + default: + break; + } + + return glslang::EShClientNone; +} + +static glslang::EShTargetClientVersion c_shader_client_version(glslang_target_client_version_t client_version) +{ + switch (client_version) { + case GLSLANG_TARGET_VULKAN_1_1: + return glslang::EShTargetVulkan_1_1; + case GLSLANG_TARGET_VULKAN_1_2: + return glslang::EShTargetVulkan_1_2; + case GLSLANG_TARGET_VULKAN_1_3: + return glslang::EShTargetVulkan_1_3; + case GLSLANG_TARGET_OPENGL_450: + return glslang::EShTargetOpenGL_450; + default: + break; + } + + return glslang::EShTargetVulkan_1_0; +} + +static glslang::EShTargetLanguage c_shader_target_language(glslang_target_language_t target_language) +{ + if (target_language == GLSLANG_TARGET_NONE) + return glslang::EShTargetNone; + + return glslang::EShTargetSpv; +} + +static glslang::EShSource c_shader_source(glslang_source_t source) +{ + switch (source) { + case GLSLANG_SOURCE_GLSL: + return glslang::EShSourceGlsl; + case GLSLANG_SOURCE_HLSL: + return glslang::EShSourceHlsl; + default: + break; + } + + return glslang::EShSourceNone; +} + +static EProfile c_shader_profile(glslang_profile_t profile) +{ + switch (profile) { + case GLSLANG_BAD_PROFILE: + return EBadProfile; + case GLSLANG_NO_PROFILE: + return ENoProfile; + case GLSLANG_CORE_PROFILE: + return ECoreProfile; + case GLSLANG_COMPATIBILITY_PROFILE: + return ECompatibilityProfile; + case GLSLANG_ES_PROFILE: + return EEsProfile; + case GLSLANG_PROFILE_COUNT: // Should not use this + break; + } + + return EProfile(); +} + +GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input) +{ + if (!input || !input->code) { + printf("Error creating shader: null input(%p)/input->code\n", input); + + if (input) + printf("input->code = %p\n", input->code); + + return nullptr; + } + + glslang_shader_t* shader = new glslang_shader_t(); + + shader->shader = new glslang::TShader(c_shader_stage(input->stage)); + shader->shader->setStrings(&input->code, 1); + shader->shader->setEnvInput(c_shader_source(input->language), c_shader_stage(input->stage), + c_shader_client(input->client), input->default_version); + shader->shader->setEnvClient(c_shader_client(input->client), c_shader_client_version(input->client_version)); + shader->shader->setEnvTarget(c_shader_target_language(input->target_language), + c_shader_target_language_version(input->target_language_version)); + + return shader; +} + +GLSLANG_EXPORT void glslang_shader_set_preamble(glslang_shader_t* shader, const char* s) { + shader->shader->setPreamble(s); +} + +GLSLANG_EXPORT void glslang_shader_shift_binding(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base) +{ + const glslang::TResourceType res_type = glslang::TResourceType(res); + shader->shader->setShiftBinding(res_type, base); +} + +GLSLANG_EXPORT void glslang_shader_shift_binding_for_set(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base, unsigned int set) +{ + const glslang::TResourceType res_type = glslang::TResourceType(res); + shader->shader->setShiftBindingForSet(res_type, base, set); +} + +GLSLANG_EXPORT void glslang_shader_set_options(glslang_shader_t* shader, int options) +{ + if (options & GLSLANG_SHADER_AUTO_MAP_BINDINGS) { + shader->shader->setAutoMapBindings(true); + } + + if (options & GLSLANG_SHADER_AUTO_MAP_LOCATIONS) { + shader->shader->setAutoMapLocations(true); + } + + if (options & GLSLANG_SHADER_VULKAN_RULES_RELAXED) { + shader->shader->setEnvInputVulkanRulesRelaxed(); + } +} + +GLSLANG_EXPORT void glslang_shader_set_glsl_version(glslang_shader_t* shader, int version) +{ + shader->shader->setOverrideVersion(version); +} + +GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader) +{ + return shader->preprocessedGLSL.c_str(); +} + +GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input) +{ + DirStackFileIncluder dirStackFileIncluder; + CallbackIncluder callbackIncluder(input->callbacks, input->callbacks_ctx); + glslang::TShader::Includer& Includer = (input->callbacks.include_local||input->callbacks.include_system) + ? static_cast(callbackIncluder) + : static_cast(dirStackFileIncluder); + return shader->shader->preprocess( + reinterpret_cast(input->resource), + input->default_version, + c_shader_profile(input->default_profile), + input->force_default_version_and_profile != 0, + input->forward_compatible != 0, + (EShMessages)c_shader_messages(input->messages), + &shader->preprocessedGLSL, + Includer + ); +} + +GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input) +{ + const char* preprocessedCStr = shader->preprocessedGLSL.c_str(); + shader->shader->setStrings(&preprocessedCStr, 1); + + return shader->shader->parse( + reinterpret_cast(input->resource), + input->default_version, + input->forward_compatible != 0, + (EShMessages)c_shader_messages(input->messages) + ); +} + +GLSLANG_EXPORT const char* glslang_shader_get_info_log(glslang_shader_t* shader) { return shader->shader->getInfoLog(); } + +GLSLANG_EXPORT const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader) { return shader->shader->getInfoDebugLog(); } + +GLSLANG_EXPORT void glslang_shader_delete(glslang_shader_t* shader) +{ + if (!shader) + return; + + delete (shader->shader); + delete (shader); +} + +GLSLANG_EXPORT glslang_program_t* glslang_program_create() +{ + glslang_program_t* p = new glslang_program_t(); + p->program = new glslang::TProgram(); + return p; +} + +GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program) +{ + if (!program) + return; + + delete (program->program); + delete (program); +} + +GLSLANG_EXPORT void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader) +{ + program->program->addShader(shader->shader); +} + +GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages) +{ + return (int)program->program->link((EShMessages)messages); +} + +GLSLANG_EXPORT void glslang_program_add_source_text(glslang_program_t* program, glslang_stage_t stage, const char* text, size_t len) { + glslang::TIntermediate* intermediate = program->program->getIntermediate(c_shader_stage(stage)); + intermediate->addSourceText(text, len); +} + +GLSLANG_EXPORT void glslang_program_set_source_file(glslang_program_t* program, glslang_stage_t stage, const char* file) { + glslang::TIntermediate* intermediate = program->program->getIntermediate(c_shader_stage(stage)); + intermediate->setSourceFile(file); +} + +GLSLANG_EXPORT int glslang_program_map_io(glslang_program_t* program) +{ + return (int)program->program->mapIO(); +} + +GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program) +{ + return program->program->getInfoLog(); +} + +GLSLANG_EXPORT const char* glslang_program_get_info_debug_log(glslang_program_t* program) +{ + return program->program->getInfoDebugLog(); +} diff --git a/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/CodeGen.cpp b/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/CodeGen.cpp index b3c7226df..1ef244962 100644 --- a/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/CodeGen.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/CodeGen.cpp @@ -41,10 +41,9 @@ // class TGenericCompiler : public TCompiler { public: - TGenericCompiler(EShLanguage l, int dOptions) : TCompiler(l, infoSink), debugOptions(dOptions) { } + TGenericCompiler(EShLanguage l) : TCompiler(l, infoSink) {} virtual bool compile(TIntermNode* root, int version = 0, EProfile profile = ENoProfile); TInfoSink infoSink; - int debugOptions; }; // @@ -52,10 +51,7 @@ public: // compile object used by higher level code. It returns // a subclass of TCompiler. // -TCompiler* ConstructCompiler(EShLanguage language, int debugOptions) -{ - return new TGenericCompiler(language, debugOptions); -} +TCompiler* ConstructCompiler(EShLanguage language, int) { return new TGenericCompiler(language); } // // Delete the compiler made by ConstructCompiler diff --git a/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/Link.cpp b/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/Link.cpp index c38db0f69..5df39b814 100644 --- a/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/Link.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/GenericCodeGen/Link.cpp @@ -44,11 +44,10 @@ // class TGenericLinker : public TLinker { public: - TGenericLinker(EShExecutable e, int dOptions) : TLinker(e, infoSink), debugOptions(dOptions) { } + TGenericLinker(EShExecutable e) : TLinker(e, infoSink) {} bool link(TCompilerList&, TUniformMap*) { return true; } void getAttributeBindings(ShBindingTable const **) const { } TInfoSink infoSink; - int debugOptions; }; // @@ -60,10 +59,7 @@ public: virtual int getLocation(const char*) { return 0; } }; -TShHandleBase* ConstructLinker(EShExecutable executable, int debugOptions) -{ - return new TGenericLinker(executable, debugOptions); -} +TShHandleBase* ConstructLinker(EShExecutable executable, int) { return new TGenericLinker(executable); } void DeleteLinker(TShHandleBase* linker) { @@ -82,7 +78,7 @@ void DeleteUniformMap(TUniformMap* map) TShHandleBase* ConstructBindings() { - return 0; + return nullptr; } void DeleteBindingList(TShHandleBase* bindingList) diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/BaseTypes.h b/libraries/ZVulkan/src/glslang/glslang/Include/BaseTypes.h index c8203c223..0ac526bfb 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/BaseTypes.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/BaseTypes.h @@ -65,10 +65,10 @@ enum TBasicType { EbtAccStruct, EbtReference, EbtRayQuery, -#ifndef GLSLANG_WEB + EbtHitObjectNV, + EbtCoopmat, // SPIR-V type defined by spirv_type EbtSpirvType, -#endif // HLSL types that live only temporarily. EbtString, @@ -95,15 +95,16 @@ enum TStorageQualifier { EvqUniform, // read only, shared with app EvqBuffer, // read/write, shared with app EvqShared, // compute shader's read/write 'shared' qualifier -#ifndef GLSLANG_WEB EvqSpirvStorageClass, // spirv_storage_class -#endif EvqPayload, EvqPayloadIn, EvqHitAttr, EvqCallableData, EvqCallableDataIn, + EvqHitObjectAttrNV, + + EvqtaskPayloadSharedEXT, // parameters EvqIn, // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter @@ -128,6 +129,9 @@ enum TStorageQualifier { // built-ins written by fragment shader EvqFragColor, EvqFragDepth, + EvqFragStencil, + + EvqTileImageEXT, // end of list EvqLast @@ -263,7 +267,7 @@ enum TBuiltInVariable { EbvObjectRayDirection, EbvRayTmin, EbvRayTmax, - EbvHitT, + EbvCullMask, EbvHitKind, EbvObjectToWorld, EbvObjectToWorld3x4, @@ -274,6 +278,8 @@ enum TBuiltInVariable { // barycentrics EbvBaryCoordNV, EbvBaryCoordNoPerspNV, + EbvBaryCoordEXT, + EbvBaryCoordNoPerspEXT, // mesh shaders EbvTaskCountNV, EbvPrimitiveCountNV, @@ -284,6 +290,17 @@ enum TBuiltInVariable { EbvMeshViewCountNV, EbvMeshViewIndicesNV, + EbvMicroTrianglePositionNV, + EbvMicroTriangleBaryNV, + EbvHitKindFrontFacingMicroTriangleNV, + EbvHitKindBackFacingMicroTriangleNV, + + //GL_EXT_mesh_shader + EbvPrimitivePointIndicesEXT, + EbvPrimitiveLineIndicesEXT, + EbvPrimitiveTriangleIndicesEXT, + EbvCullPrimitiveEXT, + // sm builtins EbvWarpsPerSM, EbvSMCount, @@ -305,6 +322,15 @@ enum TBuiltInVariable { EbvByteAddressBuffer, EbvRWByteAddressBuffer, + // ARM specific core builtins + EbvCoreCountARM, + EbvCoreIDARM, + EbvCoreMaxIDARM, + EbvWarpIDARM, + EbvWarpMaxIDARM, + + EbvPositionFetch, + EbvLast }; @@ -317,10 +343,6 @@ enum TPrecisionQualifier { EpqHigh }; -#ifdef GLSLANG_WEB -__inline const char* GetStorageQualifierString(TStorageQualifier q) { return ""; } -__inline const char* GetPrecisionQualifierString(TPrecisionQualifier p) { return ""; } -#else // These will show up in error messages __inline const char* GetStorageQualifierString(TStorageQualifier q) { @@ -329,9 +351,7 @@ __inline const char* GetStorageQualifierString(TStorageQualifier q) case EvqGlobal: return "global"; break; case EvqConst: return "const"; break; case EvqConstReadOnly: return "const (read only)"; break; -#ifndef GLSLANG_WEB case EvqSpirvStorageClass: return "spirv_storage_class"; break; -#endif case EvqVaryingIn: return "in"; break; case EvqVaryingOut: return "out"; break; case EvqUniform: return "uniform"; break; @@ -350,11 +370,14 @@ __inline const char* GetStorageQualifierString(TStorageQualifier q) case EvqPointCoord: return "gl_PointCoord"; break; case EvqFragColor: return "fragColor"; break; case EvqFragDepth: return "gl_FragDepth"; break; + case EvqFragStencil: return "gl_FragStencilRefARB"; break; case EvqPayload: return "rayPayloadNV"; break; case EvqPayloadIn: return "rayPayloadInNV"; break; case EvqHitAttr: return "hitAttributeNV"; break; case EvqCallableData: return "callableDataNV"; break; case EvqCallableDataIn: return "callableDataInNV"; break; + case EvqtaskPayloadSharedEXT: return "taskPayloadSharedEXT"; break; + case EvqHitObjectAttrNV:return "hitObjectAttributeNV"; break; default: return "unknown qualifier"; } } @@ -471,15 +494,16 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v) case EbvObjectRayDirection: return "ObjectRayDirectionNV"; case EbvRayTmin: return "ObjectRayTminNV"; case EbvRayTmax: return "ObjectRayTmaxNV"; - case EbvHitT: return "HitTNV"; case EbvHitKind: return "HitKindNV"; case EbvIncomingRayFlags: return "IncomingRayFlagsNV"; case EbvObjectToWorld: return "ObjectToWorldNV"; case EbvWorldToObject: return "WorldToObjectNV"; case EbvCurrentRayTimeNV: return "CurrentRayTimeNV"; - case EbvBaryCoordNV: return "BaryCoordNV"; - case EbvBaryCoordNoPerspNV: return "BaryCoordNoPerspNV"; + case EbvBaryCoordEXT: + case EbvBaryCoordNV: return "BaryCoordKHR"; + case EbvBaryCoordNoPerspEXT: + case EbvBaryCoordNoPerspNV: return "BaryCoordNoPerspKHR"; case EbvTaskCountNV: return "TaskCountNV"; case EbvPrimitiveCountNV: return "PrimitiveCountNV"; @@ -489,6 +513,11 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v) case EbvLayerPerViewNV: return "LayerPerViewNV"; case EbvMeshViewCountNV: return "MeshViewCountNV"; case EbvMeshViewIndicesNV: return "MeshViewIndicesNV"; + // GL_EXT_mesh_shader + case EbvPrimitivePointIndicesEXT: return "PrimitivePointIndicesEXT"; + case EbvPrimitiveLineIndicesEXT: return "PrimitiveLineIndicesEXT"; + case EbvPrimitiveTriangleIndicesEXT: return "PrimitiveTriangleIndicesEXT"; + case EbvCullPrimitiveEXT: return "CullPrimitiveEXT"; case EbvWarpsPerSM: return "WarpsPerSMNV"; case EbvSMCount: return "SMCountNV"; @@ -498,6 +527,9 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v) case EbvShadingRateKHR: return "ShadingRateKHR"; case EbvPrimitiveShadingRateKHR: return "PrimitiveShadingRateKHR"; + case EbvHitKindFrontFacingMicroTriangleNV: return "HitKindFrontFacingMicroTriangleNV"; + case EbvHitKindBackFacingMicroTriangleNV: return "HitKindBackFacingMicroTriangleNV"; + default: return "unknown built-in variable"; } } @@ -512,7 +544,6 @@ __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p) default: return "unknown precision qualifier"; } } -#endif __inline bool isTypeSignedInt(TBasicType type) { diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/Common.h b/libraries/ZVulkan/src/glslang/glslang/Include/Common.h index 4f888ae16..d1bd13b57 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/Common.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/Common.h @@ -39,6 +39,12 @@ #include #include +#ifdef _MSC_VER +#include +#else +#include +#endif +#include #include #include #include @@ -49,7 +55,7 @@ #include #include -#if defined(__ANDROID__) || (defined(_MSC_VER) && _MSC_VER < 1700) +#if defined(__ANDROID__) #include namespace std { template @@ -61,7 +67,7 @@ std::string to_string(const T& val) { } #endif -#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) || defined MINGW_HAS_SECURE_API +#if defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API #include #ifndef snprintf #define snprintf sprintf_s @@ -77,24 +83,7 @@ std::string to_string(const T& val) { #define UINT_PTR uintptr_t #endif -#if defined(_MSC_VER) && _MSC_VER < 1800 - #include - inline long long int strtoll (const char* str, char** endptr, int base) - { - return _strtoi64(str, endptr, base); - } - inline unsigned long long int strtoull (const char* str, char** endptr, int base) - { - return _strtoui64(str, endptr, base); - } - inline long long int atoll (const char* str) - { - return strtoll(str, NULL, 10); - } -#endif - #if defined(_MSC_VER) -#undef strdup #define strdup _strdup #endif @@ -170,6 +159,11 @@ template inline T* NewPoolObject(T, int instances) return new(GetThreadPoolAllocator().allocate(instances * sizeof(T))) T[instances]; } +inline bool StartsWith(TString const &str, const char *prefix) +{ + return str.compare(0, strlen(prefix), prefix) == 0; +} + // // Pool allocator versions of vectors, lists, and maps // @@ -214,7 +208,7 @@ template T Max(const T a, const T b) { return a > b ? a : b; } // // Create a TString object from an integer. // -#if defined _MSC_VER || defined MINGW_HAS_SECURE_API +#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) inline const TString String(const int i, const int base = 10) { char text[16]; // 32 bit ints are at most 10 digits in base 10 diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/ConstantUnion.h b/libraries/ZVulkan/src/glslang/glslang/Include/ConstantUnion.h index c4ffb8577..da4737b65 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/ConstantUnion.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/ConstantUnion.h @@ -234,7 +234,6 @@ public: break; -#ifndef GLSLANG_WEB case EbtInt16: if (constant.i16Const == i16Const) return true; @@ -265,7 +264,6 @@ public: return true; break; -#endif default: assert(false && "Default missing"); } @@ -347,7 +345,6 @@ public: return true; return false; -#ifndef GLSLANG_WEB case EbtInt8: if (i8Const > constant.i8Const) return true; @@ -378,7 +375,6 @@ public: return true; return false; -#endif default: assert(false && "Default missing"); return false; @@ -389,7 +385,6 @@ public: { assert(type == constant.type); switch (type) { -#ifndef GLSLANG_WEB case EbtInt8: if (i8Const < constant.i8Const) return true; @@ -419,7 +414,6 @@ public: return true; return false; -#endif case EbtDouble: if (dConst < constant.dConst) return true; @@ -449,14 +443,12 @@ public: case EbtInt: returnValue.setIConst(iConst + constant.iConst); break; case EbtUint: returnValue.setUConst(uConst + constant.uConst); break; case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const + constant.i8Const); break; case EbtInt16: returnValue.setI16Const(i16Const + constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const + constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const + constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -471,14 +463,12 @@ public: case EbtInt: returnValue.setIConst(iConst - constant.iConst); break; case EbtUint: returnValue.setUConst(uConst - constant.uConst); break; case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const - constant.i8Const); break; case EbtInt16: returnValue.setI16Const(i16Const - constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const - constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const - constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -493,14 +483,12 @@ public: case EbtInt: returnValue.setIConst(iConst * constant.iConst); break; case EbtUint: returnValue.setUConst(uConst * constant.uConst); break; case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const * constant.i8Const); break; case EbtInt16: returnValue.setI16Const(i16Const * constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const * constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const * constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -514,14 +502,12 @@ public: switch (type) { case EbtInt: returnValue.setIConst(iConst % constant.iConst); break; case EbtUint: returnValue.setUConst(uConst % constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const % constant.i8Const); break; - case EbtInt16: returnValue.setI8Const(i8Const % constant.i16Const); break; + case EbtInt16: returnValue.setI16Const(i16Const % constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const % constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const % constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -532,7 +518,6 @@ public: { TConstUnion returnValue; switch (type) { -#ifndef GLSLANG_WEB case EbtInt8: switch (constant.type) { case EbtInt8: returnValue.setI8Const(i8Const >> constant.i8Const); break; @@ -585,19 +570,16 @@ public: default: assert(false && "Default missing"); } break; -#endif case EbtInt: switch (constant.type) { case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break; case EbtUint: returnValue.setIConst(iConst >> constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setIConst(iConst >> constant.i8Const); break; case EbtUint8: returnValue.setIConst(iConst >> constant.u8Const); break; case EbtInt16: returnValue.setIConst(iConst >> constant.i16Const); break; case EbtUint16: returnValue.setIConst(iConst >> constant.u16Const); break; case EbtInt64: returnValue.setIConst(iConst >> constant.i64Const); break; case EbtUint64: returnValue.setIConst(iConst >> constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; @@ -605,18 +587,15 @@ public: switch (constant.type) { case EbtInt: returnValue.setUConst(uConst >> constant.iConst); break; case EbtUint: returnValue.setUConst(uConst >> constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setUConst(uConst >> constant.i8Const); break; case EbtUint8: returnValue.setUConst(uConst >> constant.u8Const); break; case EbtInt16: returnValue.setUConst(uConst >> constant.i16Const); break; case EbtUint16: returnValue.setUConst(uConst >> constant.u16Const); break; case EbtInt64: returnValue.setUConst(uConst >> constant.i64Const); break; case EbtUint64: returnValue.setUConst(uConst >> constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; -#ifndef GLSLANG_WEB case EbtInt64: switch (constant.type) { case EbtInt8: returnValue.setI64Const(i64Const >> constant.i8Const); break; @@ -643,7 +622,6 @@ public: default: assert(false && "Default missing"); } break; -#endif default: assert(false && "Default missing"); } @@ -654,7 +632,6 @@ public: { TConstUnion returnValue; switch (type) { -#ifndef GLSLANG_WEB case EbtInt8: switch (constant.type) { case EbtInt8: returnValue.setI8Const(i8Const << constant.i8Const); break; @@ -733,19 +710,16 @@ public: default: assert(false && "Default missing"); } break; -#endif case EbtInt: switch (constant.type) { case EbtInt: returnValue.setIConst(iConst << constant.iConst); break; case EbtUint: returnValue.setIConst(iConst << constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setIConst(iConst << constant.i8Const); break; case EbtUint8: returnValue.setIConst(iConst << constant.u8Const); break; case EbtInt16: returnValue.setIConst(iConst << constant.i16Const); break; case EbtUint16: returnValue.setIConst(iConst << constant.u16Const); break; case EbtInt64: returnValue.setIConst(iConst << constant.i64Const); break; case EbtUint64: returnValue.setIConst(iConst << constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; @@ -753,14 +727,12 @@ public: switch (constant.type) { case EbtInt: returnValue.setUConst(uConst << constant.iConst); break; case EbtUint: returnValue.setUConst(uConst << constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setUConst(uConst << constant.i8Const); break; case EbtUint8: returnValue.setUConst(uConst << constant.u8Const); break; case EbtInt16: returnValue.setUConst(uConst << constant.i16Const); break; case EbtUint16: returnValue.setUConst(uConst << constant.u16Const); break; case EbtInt64: returnValue.setUConst(uConst << constant.i64Const); break; case EbtUint64: returnValue.setUConst(uConst << constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; @@ -777,14 +749,12 @@ public: switch (type) { case EbtInt: returnValue.setIConst(iConst & constant.iConst); break; case EbtUint: returnValue.setUConst(uConst & constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const & constant.i8Const); break; case EbtUint8: returnValue.setU8Const(u8Const & constant.u8Const); break; case EbtInt16: returnValue.setI16Const(i16Const & constant.i16Const); break; case EbtUint16: returnValue.setU16Const(u16Const & constant.u16Const); break; case EbtInt64: returnValue.setI64Const(i64Const & constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -798,14 +768,12 @@ public: switch (type) { case EbtInt: returnValue.setIConst(iConst | constant.iConst); break; case EbtUint: returnValue.setUConst(uConst | constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const | constant.i8Const); break; case EbtUint8: returnValue.setU8Const(u8Const | constant.u8Const); break; case EbtInt16: returnValue.setI16Const(i16Const | constant.i16Const); break; case EbtUint16: returnValue.setU16Const(u16Const | constant.u16Const); break; case EbtInt64: returnValue.setI64Const(i64Const | constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -819,14 +787,12 @@ public: switch (type) { case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break; case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const ^ constant.i8Const); break; case EbtUint8: returnValue.setU8Const(u8Const ^ constant.u8Const); break; case EbtInt16: returnValue.setI16Const(i16Const ^ constant.i16Const); break; case EbtUint16: returnValue.setU16Const(u16Const ^ constant.u16Const); break; case EbtInt64: returnValue.setI64Const(i64Const ^ constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -839,14 +805,12 @@ public: switch (type) { case EbtInt: returnValue.setIConst(~iConst); break; case EbtUint: returnValue.setUConst(~uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(~i8Const); break; case EbtUint8: returnValue.setU8Const(~u8Const); break; case EbtInt16: returnValue.setI16Const(~i16Const); break; case EbtUint16: returnValue.setU16Const(~u16Const); break; case EbtInt64: returnValue.setI64Const(~i64Const); break; case EbtUint64: returnValue.setU64Const(~u64Const); break; -#endif default: assert(false && "Default missing"); } diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h index dceb603cf..23f495dcb 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h @@ -36,6 +36,7 @@ #define _INFOSINK_INCLUDED_ #include "../Include/Common.h" +#include #include namespace glslang { @@ -67,7 +68,7 @@ enum TOutputStream { // class TInfoSinkBase { public: - TInfoSinkBase() : outputStream(4) {} + TInfoSinkBase() : outputStream(4), shaderFileName(nullptr) {} void erase() { sink.erase(); } TInfoSinkBase& operator<<(const TPersistString& t) { append(t); return *this; } TInfoSinkBase& operator<<(char c) { append(1, c); return *this; } @@ -94,11 +95,22 @@ public: default: append("UNKNOWN ERROR: "); break; } } - void location(const TSourceLoc& loc) { + void location(const TSourceLoc& loc, bool absolute = false) { const int maxSize = 24; char locText[maxSize]; snprintf(locText, maxSize, ":%d", loc.line); - append(loc.getStringNameOrNum(false).c_str()); + + if(loc.getFilename() == nullptr && shaderFileName != nullptr && absolute) { + append(std::filesystem::absolute(shaderFileName).string()); + } else { + std::string location = loc.getStringNameOrNum(false); + if (absolute) { + append(std::filesystem::absolute(location).string()); + } else { + append(location); + } + } + append(locText); append(": "); } @@ -119,6 +131,11 @@ public: outputStream = output; } + void setShaderFileName(const char* file = nullptr) + { + shaderFileName = file; + } + protected: void append(const char* s); @@ -131,6 +148,7 @@ protected: void appendToStream(const char* s); TPersistString sink; int outputStream; + const char* shaderFileName; }; } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/InitializeGlobals.h b/libraries/ZVulkan/src/glslang/glslang/Include/InitializeGlobals.h index 95d0a40e9..b7fdd7aab 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/InitializeGlobals.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/InitializeGlobals.h @@ -37,7 +37,7 @@ namespace glslang { -bool InitializePoolIndex(); +inline bool InitializePoolIndex() { return true; } // DEPRECATED: No need to call } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/PoolAlloc.h b/libraries/ZVulkan/src/glslang/glslang/Include/PoolAlloc.h index b8eccb883..e84ac52cd 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/PoolAlloc.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/PoolAlloc.h @@ -37,7 +37,7 @@ #ifndef _POOLALLOC_INCLUDED_ #define _POOLALLOC_INCLUDED_ -#ifdef _DEBUG +#ifndef NDEBUG # define GUARD_BLOCKS // define to enable guard block sanity checking #endif @@ -74,7 +74,7 @@ namespace glslang { class TAllocation { public: - TAllocation(size_t size, unsigned char* mem, TAllocation* prev = 0) : + TAllocation(size_t size, unsigned char* mem, TAllocation* prev = nullptr) : size(size), mem(mem), prevAlloc(prev) { // Allocations are bracketed: // [allocationHeader][initialGuardBlock][userData][finalGuardBlock] @@ -118,11 +118,16 @@ private: unsigned char* mem; // beginning of our allocation (pts to header) TAllocation* prevAlloc; // prior allocation in the chain - const static unsigned char guardBlockBeginVal; - const static unsigned char guardBlockEndVal; - const static unsigned char userDataFill; + static inline constexpr unsigned char guardBlockBeginVal = 0xfb; + static inline constexpr unsigned char guardBlockEndVal = 0xfe; + static inline constexpr unsigned char userDataFill = 0xcd; + +# ifdef GUARD_BLOCKS + static inline constexpr size_t guardBlockSize = 16; +# else + static inline constexpr size_t guardBlockSize = 0; +# endif - const static size_t guardBlockSize; # ifdef GUARD_BLOCKS inline static size_t headerSize() { return sizeof(TAllocation); } # else @@ -171,7 +176,7 @@ public: void popAll(); // - // Call allocate() to actually acquire memory. Returns 0 if no memory + // Call allocate() to actually acquire memory. Returns nullptr if no memory // available, otherwise a properly aligned pointer to 'numBytes' of memory. // void* allocate(size_t numBytes); @@ -189,7 +194,7 @@ protected: struct tHeader { tHeader(tHeader* nextPage, size_t pageCount) : #ifdef GUARD_BLOCKS - lastAllocation(0), + lastAllocation(nullptr), #endif nextPage(nextPage), pageCount(pageCount) { } @@ -306,6 +311,8 @@ public: TPoolAllocator& getAllocator() const { return allocator; } + pool_allocator select_on_container_copy_construction() const { return pool_allocator{}; } + protected: pool_allocator& operator=(const pool_allocator&) { return *this; } TPoolAllocator& allocator; diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/ResourceLimits.h b/libraries/ZVulkan/src/glslang/glslang/Include/ResourceLimits.h index b670cf163..b36c8d627 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/ResourceLimits.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/ResourceLimits.h @@ -142,6 +142,15 @@ struct TBuiltInResource { int maxTaskWorkGroupSizeY_NV; int maxTaskWorkGroupSizeZ_NV; int maxMeshViewCountNV; + int maxMeshOutputVerticesEXT; + int maxMeshOutputPrimitivesEXT; + int maxMeshWorkGroupSizeX_EXT; + int maxMeshWorkGroupSizeY_EXT; + int maxMeshWorkGroupSizeZ_EXT; + int maxTaskWorkGroupSizeX_EXT; + int maxTaskWorkGroupSizeY_EXT; + int maxTaskWorkGroupSizeZ_EXT; + int maxMeshViewCountEXT; int maxDualSourceDrawBuffersEXT; TLimits limits; diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/ShHandle.h b/libraries/ZVulkan/src/glslang/glslang/Include/ShHandle.h index df07bd8ed..dee47c0df 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/ShHandle.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/ShHandle.h @@ -58,9 +58,9 @@ class TShHandleBase { public: TShHandleBase() { pool = new glslang::TPoolAllocator; } virtual ~TShHandleBase() { delete pool; } - virtual TCompiler* getAsCompiler() { return 0; } - virtual TLinker* getAsLinker() { return 0; } - virtual TUniformMap* getAsUniformMap() { return 0; } + virtual TCompiler* getAsCompiler() { return nullptr; } + virtual TLinker* getAsLinker() { return nullptr; } + virtual TUniformMap* getAsUniformMap() { return nullptr; } virtual glslang::TPoolAllocator* getPool() const { return pool; } private: glslang::TPoolAllocator* pool; @@ -123,11 +123,11 @@ public: infoSink(iSink), executable(e), haveReturnableObjectCode(false), - appAttributeBindings(0), - fixedAttributeBindings(0), - excludedAttributes(0), + appAttributeBindings(nullptr), + fixedAttributeBindings(nullptr), + excludedAttributes(nullptr), excludedCount(0), - uniformBindings(0) { } + uniformBindings(nullptr) { } virtual TLinker* getAsLinker() { return this; } virtual ~TLinker() { } virtual bool link(TCompilerList&, TUniformMap*) = 0; @@ -137,7 +137,7 @@ public: virtual void getAttributeBindings(ShBindingTable const **t) const = 0; virtual void setExcludedAttributes(const int* attributes, int count) { excludedAttributes = attributes; excludedCount = count; } virtual ShBindingTable* getUniformBindings() const { return uniformBindings; } - virtual const void* getObjectCode() const { return 0; } // a real compiler would be returning object code here + virtual const void* getObjectCode() const { return nullptr; } // a real compiler would be returning object code here virtual TInfoSink& getInfoSink() { return infoSink; } TInfoSink& infoSink; protected: diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/SpirvIntrinsics.h b/libraries/ZVulkan/src/glslang/glslang/Include/SpirvIntrinsics.h index e7a999d40..0082a4d4e 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/SpirvIntrinsics.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/SpirvIntrinsics.h @@ -35,12 +35,11 @@ #pragma once -#ifndef GLSLANG_WEB - // // GL_EXT_spirv_intrinsics // #include "Common.h" +#include namespace glslang { @@ -65,7 +64,7 @@ struct TSpirvExecutionMode { // spirv_execution_mode TMap> modes; // spirv_execution_mode_id - TMap > modeIds; + TMap > modeIds; }; // SPIR-V decorations @@ -75,7 +74,7 @@ struct TSpirvDecorate { // spirv_decorate TMap > decorates; // spirv_decorate_id - TMap > decorateIds; + TMap> decorateIds; // spirv_decorate_string TMap > decorateStrings; }; @@ -98,20 +97,27 @@ struct TSpirvInstruction { struct TSpirvTypeParameter { POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - TSpirvTypeParameter(const TIntermConstantUnion* arg) { isConstant = true; constant = arg; } - TSpirvTypeParameter(const TType* arg) { isConstant = false; type = arg; } + TSpirvTypeParameter(const TIntermConstantUnion* arg) { value = arg; } + TSpirvTypeParameter(const TType* arg) { value = arg; } - bool operator==(const TSpirvTypeParameter& rhs) const + const TIntermConstantUnion* getAsConstant() const { - return isConstant == rhs.isConstant && ((isConstant && constant == rhs.constant) || (!isConstant && type == rhs.type)); + if (value.index() == 0) + return std::get(value); + return nullptr; } + const TType* getAsType() const + { + if (value.index() == 1) + return std::get(value); + return nullptr; + } + + bool operator==(const TSpirvTypeParameter& rhs) const; bool operator!=(const TSpirvTypeParameter& rhs) const { return !operator==(rhs); } - bool isConstant; - union { - const TIntermConstantUnion* constant; - const TType* type; - }; + // Parameter value: constant expression or type specifier + std::variant value; }; typedef TVector TSpirvTypeParameters; @@ -132,5 +138,3 @@ struct TSpirvType { }; } // end namespace glslang - -#endif // GLSLANG_WEB diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/Types.h b/libraries/ZVulkan/src/glslang/glslang/Include/Types.h index a6bf191d7..232622854 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/Types.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/Types.h @@ -72,6 +72,7 @@ enum TSamplerDim { EsdRect, EsdBuffer, EsdSubpass, // goes only with non-sampled image (image is true) + EsdAttachmentEXT, EsdNumDims }; @@ -85,19 +86,6 @@ struct TSampler { // misnomer now; includes images, textures without sampler, bool combined : 1; // true means texture is combined with a sampler, false means texture with no sampler bool sampler : 1; // true means a pure sampler, other fields should be clear() -#ifdef GLSLANG_WEB - bool is1D() const { return false; } - bool isBuffer() const { return false; } - bool isRect() const { return false; } - bool isSubpass() const { return false; } - bool isCombined() const { return true; } - bool isImage() const { return false; } - bool isImageClass() const { return false; } - bool isMultiSample() const { return false; } - bool isExternal() const { return false; } - void setExternal(bool e) { } - bool isYuv() const { return false; } -#else unsigned int vectorSize : 3; // vector return type size. // Some languages support structures as sample results. Storing the whole structure in the // TSampler is too large, so there is an index to a separate table. @@ -122,14 +110,14 @@ struct TSampler { // misnomer now; includes images, textures without sampler, bool isBuffer() const { return dim == EsdBuffer; } bool isRect() const { return dim == EsdRect; } bool isSubpass() const { return dim == EsdSubpass; } + bool isAttachmentEXT() const { return dim == EsdAttachmentEXT; } bool isCombined() const { return combined; } - bool isImage() const { return image && !isSubpass(); } + bool isImage() const { return image && !isSubpass() && !isAttachmentEXT();} bool isImageClass() const { return image; } bool isMultiSample() const { return ms; } bool isExternal() const { return external; } void setExternal(bool e) { external = e; } bool isYuv() const { return yuv; } -#endif bool isTexture() const { return !sampler && !image; } bool isPureSampler() const { return sampler; } @@ -149,10 +137,8 @@ struct TSampler { // misnomer now; includes images, textures without sampler, image = false; combined = false; sampler = false; -#ifndef GLSLANG_WEB external = false; yuv = false; -#endif #ifdef ENABLE_HLSL clearReturnStruct(); @@ -204,7 +190,6 @@ struct TSampler { // misnomer now; includes images, textures without sampler, shadow = s; } -#ifndef GLSLANG_WEB // make a subpass input attachment void setSubpass(TBasicType t, bool m = false) { @@ -214,7 +199,15 @@ struct TSampler { // misnomer now; includes images, textures without sampler, dim = EsdSubpass; ms = m; } -#endif + + // make an AttachmentEXT + void setAttachmentEXT(TBasicType t) + { + clear(); + type = t; + image = true; + dim = EsdAttachmentEXT; + } bool operator==(const TSampler& right) const { @@ -252,7 +245,6 @@ struct TSampler { // misnomer now; includes images, textures without sampler, switch (type) { case EbtInt: s.append("i"); break; case EbtUint: s.append("u"); break; -#ifndef GLSLANG_WEB case EbtFloat16: s.append("f16"); break; case EbtInt8: s.append("i8"); break; case EbtUint16: s.append("u8"); break; @@ -260,11 +252,12 @@ struct TSampler { // misnomer now; includes images, textures without sampler, case EbtUint8: s.append("u16"); break; case EbtInt64: s.append("i64"); break; case EbtUint64: s.append("u64"); break; -#endif default: break; } if (isImageClass()) { - if (isSubpass()) + if (isAttachmentEXT()) + s.append("attachmentEXT"); + else if (isSubpass()) s.append("subpass"); else s.append("image"); @@ -284,12 +277,11 @@ struct TSampler { // misnomer now; includes images, textures without sampler, case Esd2D: s.append("2D"); break; case Esd3D: s.append("3D"); break; case EsdCube: s.append("Cube"); break; -#ifndef GLSLANG_WEB - case Esd1D: s.append("1D"); break; - case EsdRect: s.append("2DRect"); break; - case EsdBuffer: s.append("Buffer"); break; - case EsdSubpass: s.append("Input"); break; -#endif + case Esd1D: s.append("1D"); break; + case EsdRect: s.append("2DRect"); break; + case EsdBuffer: s.append("Buffer"); break; + case EsdSubpass: s.append("Input"); break; + case EsdAttachmentEXT: s.append(""); break; default: break; // some compilers want this } if (isMultiSample()) @@ -429,6 +421,12 @@ enum TLayoutFormat { ElfR16ui, ElfR8ui, ElfR64ui, + ElfExtSizeGuard, // to help with comparisons + ElfSize1x8, + ElfSize1x16, + ElfSize1x32, + ElfSize2x32, + ElfSize4x32, ElfCount }; @@ -443,6 +441,18 @@ enum TLayoutDepth { EldCount }; +enum TLayoutStencil { + ElsNone, + ElsRefUnchangedFrontAMD, + ElsRefGreaterFrontAMD, + ElsRefLessFrontAMD, + ElsRefUnchangedBackAMD, + ElsRefGreaterBackAMD, + ElsRefLessBackAMD, + + ElsCount +}; + enum TBlendEquationShift { // No 'EBlendNone': // These are used as bit-shift amounts. A mask of such shifts will have type 'int', @@ -500,12 +510,10 @@ public: invariant = false; makeTemporary(); declaredBuiltIn = EbvNone; -#ifndef GLSLANG_WEB noContraction = false; nullInit = false; spirvByReference = false; spirvLiteral = false; -#endif defaultBlock = false; } @@ -522,21 +530,17 @@ public: nullInit = false; defaultBlock = false; clearLayout(); -#ifndef GLSLANG_WEB spirvStorageClass = -1; spirvDecorate = nullptr; spirvByReference = false; spirvLiteral = false; -#endif } void clearInterstage() { clearInterpolation(); -#ifndef GLSLANG_WEB patch = false; sample = false; -#endif } void clearInterpolation() @@ -544,19 +548,17 @@ public: centroid = false; smooth = false; flat = false; -#ifndef GLSLANG_WEB nopersp = false; explicitInterp = false; pervertexNV = false; perPrimitiveNV = false; perViewNV = false; perTaskNV = false; -#endif + pervertexEXT = false; } void clearMemory() { -#ifndef GLSLANG_WEB coherent = false; devicecoherent = false; queuefamilycoherent = false; @@ -568,11 +570,11 @@ public: restrict = false; readonly = false; writeonly = false; -#endif } const char* semanticName; - TStorageQualifier storage : 6; + TStorageQualifier storage : 7; + static_assert(EvqLast < 64, "need to increase size of TStorageQualifier bitfields!"); TBuiltInVariable builtIn : 9; TBuiltInVariable declaredBuiltIn : 9; static_assert(EbvLast < 256, "need to increase size of TBuiltInVariable bitfields!"); @@ -587,34 +589,11 @@ public: bool explicitOffset : 1; bool defaultBlock : 1; // default blocks with matching names have structures merged when linking -#ifdef GLSLANG_WEB - bool isWriteOnly() const { return false; } - bool isReadOnly() const { return false; } - bool isRestrict() const { return false; } - bool isCoherent() const { return false; } - bool isVolatile() const { return false; } - bool isSample() const { return false; } - bool isMemory() const { return false; } - bool isMemoryQualifierImageAndSSBOOnly() const { return false; } - bool bufferReferenceNeedsVulkanMemoryModel() const { return false; } - bool isInterpolation() const { return flat || smooth; } - bool isExplicitInterpolation() const { return false; } - bool isAuxiliary() const { return centroid; } - bool isPatch() const { return false; } - bool isNoContraction() const { return false; } - void setNoContraction() { } - bool isPervertexNV() const { return false; } - void setNullInit() { } - bool isNullInit() const { return false; } - void setSpirvByReference() { } - bool isSpirvByReference() { return false; } - void setSpirvLiteral() { } - bool isSpirvLiteral() { return false; } -#else bool noContraction: 1; // prevent contraction and reassociation, e.g., for 'precise' keyword, and expressions it affects bool nopersp : 1; bool explicitInterp : 1; bool pervertexNV : 1; + bool pervertexEXT : 1; bool perPrimitiveNV : 1; bool perViewNV : 1; bool perTaskNV : 1; @@ -663,19 +642,19 @@ public: } bool isAuxiliary() const { - return centroid || patch || sample || pervertexNV; + return centroid || patch || sample || pervertexNV || pervertexEXT; } bool isPatch() const { return patch; } bool isNoContraction() const { return noContraction; } void setNoContraction() { noContraction = true; } bool isPervertexNV() const { return pervertexNV; } + bool isPervertexEXT() const { return pervertexEXT; } void setNullInit() { nullInit = true; } bool isNullInit() const { return nullInit; } void setSpirvByReference() { spirvByReference = true; } bool isSpirvByReference() const { return spirvByReference; } void setSpirvLiteral() { spirvLiteral = true; } bool isSpirvLiteral() const { return spirvLiteral; } -#endif bool isPipeInput() const { @@ -701,6 +680,7 @@ public: case EvqVaryingOut: case EvqFragColor: case EvqFragDepth: + case EvqFragStencil: return true; default: return false; @@ -741,6 +721,16 @@ public: } } + bool isUniform() const + { + switch (storage) { + case EvqUniform: + return true; + default: + return false; + } + } + bool isIo() const { switch (storage) { @@ -758,6 +748,7 @@ public: case EvqVaryingOut: case EvqFragColor: case EvqFragDepth: + case EvqFragStencil: return true; default: return false; @@ -794,9 +785,7 @@ public: } void setBlockStorage(TBlockStorageClass newBacking) { -#ifndef GLSLANG_WEB layoutPushConstant = (newBacking == EbsPushConstant); -#endif switch (newBacking) { case EbsUniform : if (layoutPacking == ElpStd430) { @@ -805,35 +794,32 @@ public: } storage = EvqUniform; break; - case EbsStorageBuffer : + case EbsStorageBuffer : storage = EvqBuffer; break; -#ifndef GLSLANG_WEB case EbsPushConstant : storage = EvqUniform; layoutSet = TQualifier::layoutSetEnd; layoutBinding = TQualifier::layoutBindingEnd; break; -#endif default: break; } } -#ifdef GLSLANG_WEB - bool isPerView() const { return false; } - bool isTaskMemory() const { return false; } - bool isArrayedIo(EShLanguage language) const { return false; } -#else bool isPerPrimitive() const { return perPrimitiveNV; } bool isPerView() const { return perViewNV; } bool isTaskMemory() const { return perTaskNV; } + bool isTaskPayload() const { return storage == EvqtaskPayloadSharedEXT; } bool isAnyPayload() const { return storage == EvqPayload || storage == EvqPayloadIn; } bool isAnyCallable() const { return storage == EvqCallableData || storage == EvqCallableDataIn; } + bool isHitObjectAttrNV() const { + return storage == EvqHitObjectAttrNV; + } // True if this type of IO is supposed to be arrayed with extra level for per-vertex data bool isArrayedIo(EShLanguage language) const @@ -846,22 +832,20 @@ public: case EShLangTessEvaluation: return ! patch && isPipeInput(); case EShLangFragment: - return pervertexNV && isPipeInput(); - case EShLangMeshNV: + return (pervertexNV || pervertexEXT) && isPipeInput(); + case EShLangMesh: return ! perTaskNV && isPipeOutput(); default: return false; } } -#endif // Implementing an embedded layout-qualifier class here, since C++ can't have a real class bitfield void clearLayout() // all layout { clearUniformLayout(); -#ifndef GLSLANG_WEB layoutPushConstant = false; layoutBufferReference = false; layoutPassthrough = false; @@ -869,9 +853,13 @@ public: // -2048 as the default value indicating layoutSecondaryViewportRelative is not set layoutSecondaryViewportRelativeOffset = -2048; layoutShaderRecord = false; + layoutFullQuads = false; + layoutQuadDeriv = false; + layoutHitObjectShaderRecordNV = false; + layoutBindlessSampler = false; + layoutBindlessImage = false; layoutBufferReferenceAlign = layoutBufferReferenceAlignEnd; layoutFormat = ElfNone; -#endif clearInterstageLayout(); @@ -881,14 +869,11 @@ public: { layoutLocation = layoutLocationEnd; layoutComponent = layoutComponentEnd; -#ifndef GLSLANG_WEB layoutIndex = layoutIndexEnd; clearStreamLayout(); clearXfbLayout(); -#endif } -#ifndef GLSLANG_WEB void clearStreamLayout() { layoutStream = layoutStreamEnd; @@ -899,7 +884,6 @@ public: layoutXfbStride = layoutXfbStrideEnd; layoutXfbOffset = layoutXfbOffsetEnd; } -#endif bool hasNonXfbLayout() const { @@ -955,7 +939,6 @@ public: unsigned int layoutSpecConstantId : 11; static const unsigned int layoutSpecConstantIdEnd = 0x7FF; -#ifndef GLSLANG_WEB // stored as log2 of the actual alignment value unsigned int layoutBufferReferenceAlign : 6; static const unsigned int layoutBufferReferenceAlignEnd = 0x3F; @@ -968,11 +951,16 @@ public: bool layoutViewportRelative; int layoutSecondaryViewportRelativeOffset; bool layoutShaderRecord; + bool layoutFullQuads; + bool layoutQuadDeriv; + bool layoutHitObjectShaderRecordNV; // GL_EXT_spirv_intrinsics int spirvStorageClass; TSpirvDecorate* spirvDecorate; -#endif + + bool layoutBindlessSampler; + bool layoutBindlessImage; bool hasUniformLayout() const { @@ -992,9 +980,7 @@ public: layoutSet = layoutSetEnd; layoutBinding = layoutBindingEnd; -#ifndef GLSLANG_WEB layoutAttachment = layoutAttachmentEnd; -#endif } bool hasMatrix() const @@ -1027,26 +1013,6 @@ public: { return layoutBinding != layoutBindingEnd; } -#ifdef GLSLANG_WEB - bool hasOffset() const { return false; } - bool isNonPerspective() const { return false; } - bool hasIndex() const { return false; } - unsigned getIndex() const { return 0; } - bool hasComponent() const { return false; } - bool hasStream() const { return false; } - bool hasFormat() const { return false; } - bool hasXfb() const { return false; } - bool hasXfbBuffer() const { return false; } - bool hasXfbStride() const { return false; } - bool hasXfbOffset() const { return false; } - bool hasAttachment() const { return false; } - TLayoutFormat getFormat() const { return ElfNone; } - bool isPushConstant() const { return false; } - bool isShaderRecord() const { return false; } - bool hasBufferReference() const { return false; } - bool hasBufferReferenceAlign() const { return false; } - bool isNonUniform() const { return false; } -#else bool hasOffset() const { return layoutOffset != layoutNotSet; @@ -1094,6 +1060,9 @@ public: TLayoutFormat getFormat() const { return layoutFormat; } bool isPushConstant() const { return layoutPushConstant; } bool isShaderRecord() const { return layoutShaderRecord; } + bool isFullQuads() const { return layoutFullQuads; } + bool isQuadDeriv() const { return layoutQuadDeriv; } + bool hasHitObjectShaderRecordNV() const { return layoutHitObjectShaderRecordNV; } bool hasBufferReference() const { return layoutBufferReference; } bool hasBufferReferenceAlign() const { @@ -1103,16 +1072,24 @@ public: { return nonUniform; } + bool isBindlessSampler() const + { + return layoutBindlessSampler; + } + bool isBindlessImage() const + { + return layoutBindlessImage; + } // GL_EXT_spirv_intrinsics - bool hasSprivDecorate() const { return spirvDecorate != nullptr; } + bool hasSpirvDecorate() const { return spirvDecorate != nullptr; } void setSpirvDecorate(int decoration, const TIntermAggregate* args = nullptr); void setSpirvDecorateId(int decoration, const TIntermAggregate* args); void setSpirvDecorateString(int decoration, const TIntermAggregate* args); const TSpirvDecorate& getSpirvDecorate() const { assert(spirvDecorate); return *spirvDecorate; } TSpirvDecorate& getSpirvDecorate() { assert(spirvDecorate); return *spirvDecorate; } TString getSpirvDecorateQualifierString() const; -#endif + bool hasSpecConstantId() const { // Not the same thing as being a specialization constant, this @@ -1146,12 +1123,10 @@ public: { switch (packing) { case ElpStd140: return "std140"; -#ifndef GLSLANG_WEB case ElpPacked: return "packed"; case ElpShared: return "shared"; case ElpStd430: return "std430"; case ElpScalar: return "scalar"; -#endif default: return "none"; } } @@ -1163,9 +1138,6 @@ public: default: return "none"; } } -#ifdef GLSLANG_WEB - static const char* getLayoutFormatString(TLayoutFormat f) { return "none"; } -#else static const char* getLayoutFormatString(TLayoutFormat f) { switch (f) { @@ -1212,6 +1184,11 @@ public: case ElfR8ui: return "r8ui"; case ElfR64ui: return "r64ui"; case ElfR64i: return "r64i"; + case ElfSize1x8: return "size1x8"; + case ElfSize1x16: return "size1x16"; + case ElfSize1x32: return "size1x32"; + case ElfSize2x32: return "size2x32"; + case ElfSize4x32: return "size4x32"; default: return "none"; } } @@ -1225,6 +1202,18 @@ public: default: return "none"; } } + static const char* getLayoutStencilString(TLayoutStencil s) + { + switch (s) { + case ElsRefUnchangedFrontAMD: return "stencil_ref_unchanged_front_amd"; + case ElsRefGreaterFrontAMD: return "stencil_ref_greater_front_amd"; + case ElsRefLessFrontAMD: return "stencil_ref_less_front_amd"; + case ElsRefUnchangedBackAMD: return "stencil_ref_unchanged_back_amd"; + case ElsRefGreaterBackAMD: return "stencil_ref_greater_back_amd"; + case ElsRefLessBackAMD: return "stencil_ref_less_back_amd"; + default: return "none"; + } + } static const char* getBlendEquationString(TBlendEquationShift e) { switch (e) { @@ -1302,7 +1291,6 @@ public: default: return "none"; } } -#endif }; // Qualifiers that don't need to be keep per object. They have shader scope, not object scope. @@ -1319,10 +1307,14 @@ struct TShaderQualifiers { int localSize[3]; // compute shader bool localSizeNotDefault[3]; // compute shader int localSizeSpecId[3]; // compute shader specialization id for gl_WorkGroupSize -#ifndef GLSLANG_WEB bool earlyFragmentTests; // fragment input bool postDepthCoverage; // fragment input + bool earlyAndLateFragmentTestsAMD; //fragment input + bool nonCoherentColorAttachmentReadEXT; // fragment input + bool nonCoherentDepthAttachmentReadEXT; // fragment input + bool nonCoherentStencilAttachmentReadEXT; // fragment input TLayoutDepth layoutDepth; + TLayoutStencil layoutStencil; bool blendEquation; // true if any blend equation was specified int numViews; // multiview extenstions TInterlockOrdering interlockOrdering; @@ -1332,9 +1324,7 @@ struct TShaderQualifiers { int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set bool layoutPrimitiveCulling; // true if layout primitive_culling set TLayoutDepth getDepth() const { return layoutDepth; } -#else - TLayoutDepth getDepth() const { return EldNone; } -#endif + TLayoutStencil getStencil() const { return layoutStencil; } void init() { @@ -1355,10 +1345,14 @@ struct TShaderQualifiers { localSizeSpecId[0] = TQualifier::layoutNotSet; localSizeSpecId[1] = TQualifier::layoutNotSet; localSizeSpecId[2] = TQualifier::layoutNotSet; -#ifndef GLSLANG_WEB earlyFragmentTests = false; + earlyAndLateFragmentTestsAMD = false; postDepthCoverage = false; + nonCoherentColorAttachmentReadEXT = false; + nonCoherentDepthAttachmentReadEXT = false; + nonCoherentStencilAttachmentReadEXT = false; layoutDepth = EldNone; + layoutStencil = ElsNone; blendEquation = false; numViews = TQualifier::layoutNotSet; layoutOverrideCoverage = false; @@ -1367,14 +1361,9 @@ struct TShaderQualifiers { layoutPrimitiveCulling = false; primitives = TQualifier::layoutNotSet; interlockOrdering = EioNone; -#endif } -#ifdef GLSLANG_WEB - bool hasBlendEquation() const { return false; } -#else bool hasBlendEquation() const { return blendEquation; } -#endif // Merge in characteristics from the 'src' qualifier. They can override when // set, but never erase when not set. @@ -1407,13 +1396,22 @@ struct TShaderQualifiers { if (src.localSizeSpecId[i] != TQualifier::layoutNotSet) localSizeSpecId[i] = src.localSizeSpecId[i]; } -#ifndef GLSLANG_WEB if (src.earlyFragmentTests) earlyFragmentTests = true; + if (src.earlyAndLateFragmentTestsAMD) + earlyAndLateFragmentTestsAMD = true; if (src.postDepthCoverage) postDepthCoverage = true; + if (src.nonCoherentColorAttachmentReadEXT) + nonCoherentColorAttachmentReadEXT = true; + if (src.nonCoherentDepthAttachmentReadEXT) + nonCoherentDepthAttachmentReadEXT = true; + if (src.nonCoherentStencilAttachmentReadEXT) + nonCoherentStencilAttachmentReadEXT = true; if (src.layoutDepth) layoutDepth = src.layoutDepth; + if (src.layoutStencil) + layoutStencil = src.layoutStencil; if (src.blendEquation) blendEquation = src.blendEquation; if (src.numViews != TQualifier::layoutNotSet) @@ -1430,7 +1428,31 @@ struct TShaderQualifiers { interlockOrdering = src.interlockOrdering; if (src.layoutPrimitiveCulling) layoutPrimitiveCulling = src.layoutPrimitiveCulling; -#endif + } +}; + +class TTypeParameters { +public: + POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) + + TTypeParameters() : basicType(EbtVoid), arraySizes(nullptr), spirvType(nullptr) {} + + TBasicType basicType; + TArraySizes *arraySizes; + TSpirvType *spirvType; + + bool operator==(const TTypeParameters& rhs) const + { + bool same = basicType == rhs.basicType && *arraySizes == *rhs.arraySizes; + if (same && basicType == EbtSpirvType) { + assert(spirvType && rhs.spirvType); + return *spirvType == *rhs.spirvType; + } + return same; + } + bool operator!=(const TTypeParameters& rhs) const + { + return !(*this == rhs); } }; @@ -1448,39 +1470,35 @@ public: TSampler sampler; TQualifier qualifier; TShaderQualifiers shaderQualifiers; - int vectorSize : 4; - int matrixCols : 4; - int matrixRows : 4; - bool coopmat : 1; + uint32_t vectorSize : 4; + uint32_t matrixCols : 4; + uint32_t matrixRows : 4; + bool coopmatNV : 1; + bool coopmatKHR : 1; TArraySizes* arraySizes; const TType* userDef; TSourceLoc loc; - TArraySizes* typeParameters; -#ifndef GLSLANG_WEB + TTypeParameters* typeParameters; // SPIR-V type defined by spirv_type directive TSpirvType* spirvType; -#endif -#ifdef GLSLANG_WEB - bool isCoopmat() const { return false; } -#else - bool isCoopmat() const { return coopmat; } -#endif + bool isCoopmat() const { return coopmatNV || coopmatKHR; } + bool isCoopmatNV() const { return coopmatNV; } + bool isCoopmatKHR() const { return coopmatKHR; } void initType(const TSourceLoc& l) { basicType = EbtVoid; - vectorSize = 1; + vectorSize = 1u; matrixRows = 0; matrixCols = 0; arraySizes = nullptr; userDef = nullptr; loc = l; typeParameters = nullptr; - coopmat = false; -#ifndef GLSLANG_WEB + coopmatNV = false; + coopmatKHR = false; spirvType = nullptr; -#endif } void initQualifiers(bool global = false) @@ -1502,29 +1520,31 @@ public: { matrixRows = 0; matrixCols = 0; - vectorSize = s; + assert(s >= 0); + vectorSize = static_cast(s) & 0b1111; } void setMatrix(int c, int r) { - matrixRows = r; - matrixCols = c; + assert(r >= 0); + matrixRows = static_cast(r) & 0b1111; + assert(c >= 0); + matrixCols = static_cast(c) & 0b1111; vectorSize = 0; } bool isScalar() const { - return matrixCols == 0 && vectorSize == 1 && arraySizes == nullptr && userDef == nullptr; + return matrixCols == 0u && vectorSize == 1u && arraySizes == nullptr && userDef == nullptr; } -#ifndef GLSLANG_WEB // GL_EXT_spirv_intrinsics void setSpirvType(const TSpirvInstruction& spirvInst, const TSpirvTypeParameters* typeParams = nullptr); -#endif // "Image" is a superset of "Subpass" - bool isImage() const { return basicType == EbtSampler && sampler.isImage(); } - bool isSubpass() const { return basicType == EbtSampler && sampler.isSubpass(); } + bool isImage() const { return basicType == EbtSampler && sampler.isImage(); } + bool isSubpass() const { return basicType == EbtSampler && sampler.isSubpass(); } + bool isAttachmentEXT() const { return basicType == EbtSampler && sampler.isAttachmentEXT(); } }; // @@ -1537,12 +1557,14 @@ public: // for "empty" type (no args) or simple scalar/vector/matrix explicit TType(TBasicType t = EbtVoid, TStorageQualifier q = EvqTemporary, int vs = 1, int mc = 0, int mr = 0, bool isVector = false) : - basicType(t), vectorSize(vs), matrixCols(mc), matrixRows(mr), vector1(isVector && vs == 1), coopmat(false), - arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(t), vectorSize(static_cast(vs) & 0b1111), matrixCols(static_cast(mc) & 0b1111), matrixRows(static_cast(mr) & 0b1111), vector1(isVector && vs == 1), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), + arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { + assert(vs >= 0); + assert(mc >= 0); + assert(mr >= 0); + sampler.clear(); qualifier.clear(); qualifier.storage = q; @@ -1551,12 +1573,14 @@ public: // for explicit precision qualifier TType(TBasicType t, TStorageQualifier q, TPrecisionQualifier p, int vs = 1, int mc = 0, int mr = 0, bool isVector = false) : - basicType(t), vectorSize(vs), matrixCols(mc), matrixRows(mr), vector1(isVector && vs == 1), coopmat(false), - arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(t), vectorSize(static_cast(vs) & 0b1111), matrixCols(static_cast(mc) & 0b1111), matrixRows(static_cast(mr) & 0b1111), vector1(isVector && vs == 1), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), + arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { + assert(vs >= 0); + assert(mc >= 0); + assert(mr >= 0); + sampler.clear(); qualifier.clear(); qualifier.storage = q; @@ -1567,11 +1591,9 @@ public: // for turning a TPublicType into a TType, using a shallow copy explicit TType(const TPublicType& p) : basicType(p.basicType), - vectorSize(p.vectorSize), matrixCols(p.matrixCols), matrixRows(p.matrixRows), vector1(false), coopmat(p.coopmat), - arraySizes(p.arraySizes), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(p.typeParameters) -#ifndef GLSLANG_WEB - , spirvType(p.spirvType) -#endif + vectorSize(p.vectorSize), matrixCols(p.matrixCols), matrixRows(p.matrixRows), vector1(false), coopmatNV(p.coopmatNV), coopmatKHR(p.coopmatKHR), coopmatKHRuse(0), coopmatKHRUseValid(false), + arraySizes(p.arraySizes), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(p.typeParameters), + spirvType(p.spirvType) { if (basicType == EbtSampler) sampler = p.sampler; @@ -1587,28 +1609,46 @@ public: } typeName = NewPoolTString(p.userDef->getTypeName().c_str()); } - if (p.isCoopmat() && p.typeParameters && p.typeParameters->getNumDims() > 0) { - int numBits = p.typeParameters->getDimSize(0); + if (p.isCoopmatNV() && p.typeParameters && p.typeParameters->arraySizes->getNumDims() > 0) { + int numBits = p.typeParameters->arraySizes->getDimSize(0); if (p.basicType == EbtFloat && numBits == 16) { basicType = EbtFloat16; qualifier.precision = EpqNone; } else if (p.basicType == EbtUint && numBits == 8) { basicType = EbtUint8; qualifier.precision = EpqNone; + } else if (p.basicType == EbtUint && numBits == 16) { + basicType = EbtUint16; + qualifier.precision = EpqNone; } else if (p.basicType == EbtInt && numBits == 8) { basicType = EbtInt8; qualifier.precision = EpqNone; + } else if (p.basicType == EbtInt && numBits == 16) { + basicType = EbtInt16; + qualifier.precision = EpqNone; + } + } + if (p.isCoopmatKHR() && p.typeParameters && p.typeParameters->arraySizes->getNumDims() > 0) { + basicType = p.typeParameters->basicType; + if (isSpirvType()) { + assert(p.typeParameters->spirvType); + spirvType = p.typeParameters->spirvType; + } + + if (p.typeParameters->arraySizes->getNumDims() == 4) { + const int dimSize = p.typeParameters->arraySizes->getDimSize(3); + assert(dimSize >= 0); + coopmatKHRuse = static_cast(dimSize) & 0b111; + coopmatKHRUseValid = true; + p.typeParameters->arraySizes->removeLastSize(); } } } // for construction of sampler types TType(const TSampler& sampler, TStorageQualifier q = EvqUniform, TArraySizes* as = nullptr) : - basicType(EbtSampler), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmat(false), + basicType(EbtSampler), vectorSize(1u), matrixCols(0u), matrixRows(0u), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), arraySizes(as), structure(nullptr), fieldName(nullptr), typeName(nullptr), - sampler(sampler), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + sampler(sampler), typeParameters(nullptr), spirvType(nullptr) { qualifier.clear(); qualifier.storage = q; @@ -1650,18 +1690,19 @@ public: vectorSize = 1; vector1 = false; } else if (isCoopMat()) { - coopmat = false; + coopmatNV = false; + coopmatKHR = false; + coopmatKHRuse = 0; + coopmatKHRUseValid = false; typeParameters = nullptr; } } } // for making structures, ... TType(TTypeList* userDef, const TString& n) : - basicType(EbtStruct), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmat(false), - arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(EbtStruct), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), + arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { sampler.clear(); qualifier.clear(); @@ -1669,25 +1710,22 @@ public: } // For interface blocks TType(TTypeList* userDef, const TString& n, const TQualifier& q) : - basicType(EbtBlock), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmat(false), - qualifier(q), arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(EbtBlock), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), + qualifier(q), arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { sampler.clear(); typeName = NewPoolTString(n.c_str()); } // for block reference (first parameter must be EbtReference) explicit TType(TBasicType t, const TType &p, const TString& n) : - basicType(t), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), - arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(t), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(0), coopmatKHRUseValid(false), + arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { assert(t == EbtReference); typeName = NewPoolTString(n.c_str()); + sampler.clear(); qualifier.clear(); qualifier.storage = p.qualifier.storage; referentType = p.clone(); @@ -1715,10 +1753,11 @@ public: referentType = copyOf.referentType; } typeParameters = copyOf.typeParameters; -#ifndef GLSLANG_WEB spirvType = copyOf.spirvType; -#endif - coopmat = copyOf.isCoopMat(); + coopmatNV = copyOf.isCoopMatNV(); + coopmatKHR = copyOf.isCoopMatKHR(); + coopmatKHRuse = copyOf.coopmatKHRuse; + coopmatKHRUseValid = copyOf.coopmatKHRUseValid; } // Make complete copy of the whole type graph rooted at 'copyOf'. @@ -1748,7 +1787,7 @@ public: void makeVector() { vector1 = true; } - virtual void hideMember() { basicType = EbtVoid; vectorSize = 1; } + virtual void hideMember() { basicType = EbtVoid; vectorSize = 1u; } virtual bool hiddenMember() const { return basicType == EbtVoid; } virtual void setFieldName(const TString& n) { fieldName = NewPoolTString(n.c_str()); } @@ -1788,35 +1827,33 @@ public: virtual TQualifier& getQualifier() { return qualifier; } virtual const TQualifier& getQualifier() const { return qualifier; } - virtual int getVectorSize() const { return vectorSize; } // returns 1 for either scalar or vector of size 1, valid for both - virtual int getMatrixCols() const { return matrixCols; } - virtual int getMatrixRows() const { return matrixRows; } + virtual int getVectorSize() const { return static_cast(vectorSize); } // returns 1 for either scalar or vector of size 1, valid for both + virtual int getMatrixCols() const { return static_cast(matrixCols); } + virtual int getMatrixRows() const { return static_cast(matrixRows); } virtual int getOuterArraySize() const { return arraySizes->getOuterSize(); } virtual TIntermTyped* getOuterArrayNode() const { return arraySizes->getOuterNode(); } virtual int getCumulativeArraySize() const { return arraySizes->getCumulativeSize(); } -#ifdef GLSLANG_WEB - bool isArrayOfArrays() const { return false; } -#else bool isArrayOfArrays() const { return arraySizes != nullptr && arraySizes->getNumDims() > 1; } -#endif virtual int getImplicitArraySize() const { return arraySizes->getImplicitSize(); } virtual const TArraySizes* getArraySizes() const { return arraySizes; } virtual TArraySizes* getArraySizes() { return arraySizes; } virtual TType* getReferentType() const { return referentType; } - virtual const TArraySizes* getTypeParameters() const { return typeParameters; } - virtual TArraySizes* getTypeParameters() { return typeParameters; } + virtual const TTypeParameters* getTypeParameters() const { return typeParameters; } + virtual TTypeParameters* getTypeParameters() { return typeParameters; } virtual bool isScalar() const { return ! isVector() && ! isMatrix() && ! isStruct() && ! isArray(); } virtual bool isScalarOrVec1() const { return isScalar() || vector1; } virtual bool isScalarOrVector() const { return !isMatrix() && !isStruct() && !isArray(); } - virtual bool isVector() const { return vectorSize > 1 || vector1; } + virtual bool isVector() const { return vectorSize > 1u || vector1; } virtual bool isMatrix() const { return matrixCols ? true : false; } virtual bool isArray() const { return arraySizes != nullptr; } virtual bool isSizedArray() const { return isArray() && arraySizes->isSized(); } virtual bool isUnsizedArray() const { return isArray() && !arraySizes->isSized(); } + virtual bool isImplicitlySizedArray() const { return isArray() && arraySizes->isImplicitlySized(); } virtual bool isArrayVariablyIndexed() const { assert(isArray()); return arraySizes->isVariablyIndexed(); } virtual void setArrayVariablyIndexed() { assert(isArray()); arraySizes->setVariablyIndexed(); } virtual void updateImplicitArraySize(int size) { assert(isArray()); arraySizes->updateImplicitSize(size); } + virtual void setImplicitlySized(bool isImplicitSized) { arraySizes->setImplicitlySized(isImplicitSized); } virtual bool isStruct() const { return basicType == EbtStruct || basicType == EbtBlock; } virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble || basicType == EbtFloat16; } virtual bool isIntegerDomain() const @@ -1838,28 +1875,26 @@ public: return false; } virtual bool isOpaque() const { return basicType == EbtSampler -#ifndef GLSLANG_WEB || basicType == EbtAtomicUint || basicType == EbtAccStruct || basicType == EbtRayQuery -#endif - ; } + || basicType == EbtHitObjectNV; } virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; } - // "Image" is a superset of "Subpass" - virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } + virtual bool isAttachmentEXT() const { return basicType == EbtSampler && getSampler().isAttachmentEXT(); } + virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); } virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); } + virtual bool isBindlessImage() const { return isImage() && qualifier.layoutBindlessImage; } + virtual bool isBindlessTexture() const { return isTexture() && qualifier.layoutBindlessSampler; } // Check the block-name convention of creating a block without populating it's members: virtual bool isUnusableName() const { return isStruct() && structure == nullptr; } virtual bool isParameterized() const { return typeParameters != nullptr; } -#ifdef GLSLANG_WEB - bool isAtomic() const { return false; } - bool isCoopMat() const { return false; } - bool isReference() const { return false; } -#else bool isAtomic() const { return basicType == EbtAtomicUint; } - bool isCoopMat() const { return coopmat; } + bool isCoopMat() const { return coopmatNV || coopmatKHR; } + bool isCoopMatNV() const { return coopmatNV; } + bool isCoopMatKHR() const { return coopmatKHR; } bool isReference() const { return getBasicType() == EbtReference; } -#endif + bool isSpirvType() const { return getBasicType() == EbtSpirvType; } + int getCoopMatKHRuse() const { return static_cast(coopmatKHRuse); } // return true if this type contains any subtype which satisfies the given predicate. template @@ -1902,6 +1937,11 @@ public: return contains([](const TType* t) { return t->isOpaque(); } ); } + virtual bool containsSampler() const + { + return contains([](const TType* t) { return t->isTexture() || t->isImage(); }); + } + // Recursively checks if the type contains a built-in variable virtual bool containsBuiltIn() const { @@ -1940,15 +1980,6 @@ public: return contains([](const TType* t) { return t->isArray() && t->arraySizes->isOuterSpecialization(); } ); } -#ifdef GLSLANG_WEB - bool containsDouble() const { return false; } - bool contains16BitFloat() const { return false; } - bool contains64BitInt() const { return false; } - bool contains16BitInt() const { return false; } - bool contains8BitInt() const { return false; } - bool containsCoopMat() const { return false; } - bool containsReference() const { return false; } -#else bool containsDouble() const { return containsBasicType(EbtDouble); @@ -1971,13 +2002,12 @@ public: } bool containsCoopMat() const { - return contains([](const TType* t) { return t->coopmat; } ); + return contains([](const TType* t) { return t->coopmatNV || t->coopmatKHR; } ); } bool containsReference() const { return containsBasicType(EbtReference); } -#endif // Array editing methods. Array descriptors can be shared across // type instances. This allows all uses of the same array @@ -2035,8 +2065,12 @@ public: // an explicit array. void adoptImplicitArraySizes(bool skipNonvariablyIndexed) { - if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed())) + if (isUnsizedArray() && + (qualifier.builtIn == EbvSampleMask || + !(skipNonvariablyIndexed || isArrayVariablyIndexed()))) { changeOuterArraySize(getImplicitArraySize()); + setImplicitlySized(true); + } // For multi-dim per-view arrays, set unsized inner dimension size to 1 if (qualifier.isPerView() && arraySizes && arraySizes->isInnerUnsized()) arraySizes->clearInnerUnsized(); @@ -2049,43 +2083,12 @@ public: } } - - void updateTypeParameters(const TType& type) - { - // For when we may already be sharing existing array descriptors, - // keeping the pointers the same, just updating the contents. - assert(typeParameters != nullptr); - assert(type.typeParameters != nullptr); - *typeParameters = *type.typeParameters; - } - void copyTypeParameters(const TArraySizes& s) + void copyTypeParameters(const TTypeParameters& s) { // For setting a fresh new set of type parameters, not yet worrying about sharing. - typeParameters = new TArraySizes; + typeParameters = new TTypeParameters; *typeParameters = s; } - void transferTypeParameters(TArraySizes* s) - { - // For setting an already allocated set of sizes that this type can use - // (no copy made). - typeParameters = s; - } - void clearTypeParameters() - { - typeParameters = nullptr; - } - - // Add inner array sizes, to any existing sizes, via copy; the - // sizes passed in can still be reused for other purposes. - void copyTypeParametersInnerSizes(const TArraySizes* s) - { - if (s != nullptr) { - if (typeParameters == nullptr) - copyTypeParameters(*s); - else - typeParameters->addInnerSizes(*s); - } - } const char* getBasicString() const { @@ -2099,7 +2102,6 @@ public: case EbtInt: return "int"; case EbtUint: return "uint"; case EbtSampler: return "sampler/image"; -#ifndef GLSLANG_WEB case EbtVoid: return "void"; case EbtDouble: return "double"; case EbtFloat16: return "float16_t"; @@ -2118,19 +2120,13 @@ public: case EbtReference: return "reference"; case EbtString: return "string"; case EbtSpirvType: return "spirv_type"; -#endif + case EbtCoopmat: return "coopmat"; default: return "unknown type"; } } -#ifdef GLSLANG_WEB - TString getCompleteString() const { return ""; } - const char* getStorageQualifierString() const { return ""; } - const char* getBuiltInVariableString() const { return ""; } - const char* getPrecisionQualifierString() const { return ""; } - TString getBasicTypeString() const { return ""; } -#else - TString getCompleteString() const + TString getCompleteString(bool syntactic = false, bool getQualifiers = true, bool getPrecision = true, + bool getType = true, TString name = "", TString structName = "") const { TString typeString; @@ -2138,232 +2134,358 @@ public: const auto appendUint = [&](unsigned int u) { typeString.append(std::to_string(u).c_str()); }; const auto appendInt = [&](int i) { typeString.append(std::to_string(i).c_str()); }; - if (qualifier.hasSprivDecorate()) + if (getQualifiers) { + if (qualifier.hasSpirvDecorate()) appendStr(qualifier.getSpirvDecorateQualifierString().c_str()); - if (qualifier.hasLayout()) { + if (qualifier.hasLayout()) { // To reduce noise, skip this if the only layout is an xfb_buffer // with no triggering xfb_offset. TQualifier noXfbBuffer = qualifier; noXfbBuffer.layoutXfbBuffer = TQualifier::layoutXfbBufferEnd; if (noXfbBuffer.hasLayout()) { - appendStr("layout("); - if (qualifier.hasAnyLocation()) { - appendStr(" location="); - appendUint(qualifier.layoutLocation); - if (qualifier.hasComponent()) { - appendStr(" component="); - appendUint(qualifier.layoutComponent); - } - if (qualifier.hasIndex()) { - appendStr(" index="); - appendUint(qualifier.layoutIndex); - } + appendStr("layout("); + if (qualifier.hasAnyLocation()) { + appendStr(" location="); + appendUint(qualifier.layoutLocation); + if (qualifier.hasComponent()) { + appendStr(" component="); + appendUint(qualifier.layoutComponent); } - if (qualifier.hasSet()) { - appendStr(" set="); - appendUint(qualifier.layoutSet); - } - if (qualifier.hasBinding()) { - appendStr(" binding="); - appendUint(qualifier.layoutBinding); - } - if (qualifier.hasStream()) { - appendStr(" stream="); - appendUint(qualifier.layoutStream); - } - if (qualifier.hasMatrix()) { - appendStr(" "); - appendStr(TQualifier::getLayoutMatrixString(qualifier.layoutMatrix)); - } - if (qualifier.hasPacking()) { - appendStr(" "); - appendStr(TQualifier::getLayoutPackingString(qualifier.layoutPacking)); - } - if (qualifier.hasOffset()) { - appendStr(" offset="); - appendInt(qualifier.layoutOffset); - } - if (qualifier.hasAlign()) { - appendStr(" align="); - appendInt(qualifier.layoutAlign); - } - if (qualifier.hasFormat()) { - appendStr(" "); - appendStr(TQualifier::getLayoutFormatString(qualifier.layoutFormat)); - } - if (qualifier.hasXfbBuffer() && qualifier.hasXfbOffset()) { - appendStr(" xfb_buffer="); - appendUint(qualifier.layoutXfbBuffer); - } - if (qualifier.hasXfbOffset()) { - appendStr(" xfb_offset="); - appendUint(qualifier.layoutXfbOffset); - } - if (qualifier.hasXfbStride()) { - appendStr(" xfb_stride="); - appendUint(qualifier.layoutXfbStride); - } - if (qualifier.hasAttachment()) { - appendStr(" input_attachment_index="); - appendUint(qualifier.layoutAttachment); - } - if (qualifier.hasSpecConstantId()) { - appendStr(" constant_id="); - appendUint(qualifier.layoutSpecConstantId); - } - if (qualifier.layoutPushConstant) - appendStr(" push_constant"); - if (qualifier.layoutBufferReference) - appendStr(" buffer_reference"); - if (qualifier.hasBufferReferenceAlign()) { - appendStr(" buffer_reference_align="); - appendUint(1u << qualifier.layoutBufferReferenceAlign); + if (qualifier.hasIndex()) { + appendStr(" index="); + appendUint(qualifier.layoutIndex); } + } + if (qualifier.hasSet()) { + appendStr(" set="); + appendUint(qualifier.layoutSet); + } + if (qualifier.hasBinding()) { + appendStr(" binding="); + appendUint(qualifier.layoutBinding); + } + if (qualifier.hasStream()) { + appendStr(" stream="); + appendUint(qualifier.layoutStream); + } + if (qualifier.hasMatrix()) { + appendStr(" "); + appendStr(TQualifier::getLayoutMatrixString(qualifier.layoutMatrix)); + } + if (qualifier.hasPacking()) { + appendStr(" "); + appendStr(TQualifier::getLayoutPackingString(qualifier.layoutPacking)); + } + if (qualifier.hasOffset()) { + appendStr(" offset="); + appendInt(qualifier.layoutOffset); + } + if (qualifier.hasAlign()) { + appendStr(" align="); + appendInt(qualifier.layoutAlign); + } + if (qualifier.hasFormat()) { + appendStr(" "); + appendStr(TQualifier::getLayoutFormatString(qualifier.layoutFormat)); + } + if (qualifier.hasXfbBuffer() && qualifier.hasXfbOffset()) { + appendStr(" xfb_buffer="); + appendUint(qualifier.layoutXfbBuffer); + } + if (qualifier.hasXfbOffset()) { + appendStr(" xfb_offset="); + appendUint(qualifier.layoutXfbOffset); + } + if (qualifier.hasXfbStride()) { + appendStr(" xfb_stride="); + appendUint(qualifier.layoutXfbStride); + } + if (qualifier.hasAttachment()) { + appendStr(" input_attachment_index="); + appendUint(qualifier.layoutAttachment); + } + if (qualifier.hasSpecConstantId()) { + appendStr(" constant_id="); + appendUint(qualifier.layoutSpecConstantId); + } + if (qualifier.layoutPushConstant) + appendStr(" push_constant"); + if (qualifier.layoutBufferReference) + appendStr(" buffer_reference"); + if (qualifier.hasBufferReferenceAlign()) { + appendStr(" buffer_reference_align="); + appendUint(1u << qualifier.layoutBufferReferenceAlign); + } - if (qualifier.layoutPassthrough) - appendStr(" passthrough"); - if (qualifier.layoutViewportRelative) - appendStr(" layoutViewportRelative"); - if (qualifier.layoutSecondaryViewportRelativeOffset != -2048) { - appendStr(" layoutSecondaryViewportRelativeOffset="); - appendInt(qualifier.layoutSecondaryViewportRelativeOffset); - } - if (qualifier.layoutShaderRecord) - appendStr(" shaderRecordNV"); + if (qualifier.layoutPassthrough) + appendStr(" passthrough"); + if (qualifier.layoutViewportRelative) + appendStr(" layoutViewportRelative"); + if (qualifier.layoutSecondaryViewportRelativeOffset != -2048) { + appendStr(" layoutSecondaryViewportRelativeOffset="); + appendInt(qualifier.layoutSecondaryViewportRelativeOffset); + } + + if (qualifier.layoutShaderRecord) + appendStr(" shaderRecordNV"); + if (qualifier.layoutFullQuads) + appendStr(" full_quads"); + if (qualifier.layoutQuadDeriv) + appendStr(" quad_derivatives"); + if (qualifier.layoutHitObjectShaderRecordNV) + appendStr(" hitobjectshaderrecordnv"); - appendStr(")"); + if (qualifier.layoutBindlessSampler) + appendStr(" layoutBindlessSampler"); + if (qualifier.layoutBindlessImage) + appendStr(" layoutBindlessImage"); + + appendStr(")"); } - } + } - if (qualifier.invariant) + if (qualifier.invariant) appendStr(" invariant"); - if (qualifier.noContraction) + if (qualifier.noContraction) appendStr(" noContraction"); - if (qualifier.centroid) + if (qualifier.centroid) appendStr(" centroid"); - if (qualifier.smooth) + if (qualifier.smooth) appendStr(" smooth"); - if (qualifier.flat) + if (qualifier.flat) appendStr(" flat"); - if (qualifier.nopersp) + if (qualifier.nopersp) appendStr(" noperspective"); - if (qualifier.explicitInterp) + if (qualifier.explicitInterp) appendStr(" __explicitInterpAMD"); - if (qualifier.pervertexNV) + if (qualifier.pervertexNV) appendStr(" pervertexNV"); - if (qualifier.perPrimitiveNV) + if (qualifier.pervertexEXT) + appendStr(" pervertexEXT"); + if (qualifier.perPrimitiveNV) appendStr(" perprimitiveNV"); - if (qualifier.perViewNV) + if (qualifier.perViewNV) appendStr(" perviewNV"); - if (qualifier.perTaskNV) + if (qualifier.perTaskNV) appendStr(" taskNV"); - if (qualifier.patch) + if (qualifier.patch) appendStr(" patch"); - if (qualifier.sample) + if (qualifier.sample) appendStr(" sample"); - if (qualifier.coherent) + if (qualifier.coherent) appendStr(" coherent"); - if (qualifier.devicecoherent) + if (qualifier.devicecoherent) appendStr(" devicecoherent"); - if (qualifier.queuefamilycoherent) + if (qualifier.queuefamilycoherent) appendStr(" queuefamilycoherent"); - if (qualifier.workgroupcoherent) + if (qualifier.workgroupcoherent) appendStr(" workgroupcoherent"); - if (qualifier.subgroupcoherent) + if (qualifier.subgroupcoherent) appendStr(" subgroupcoherent"); - if (qualifier.shadercallcoherent) + if (qualifier.shadercallcoherent) appendStr(" shadercallcoherent"); - if (qualifier.nonprivate) + if (qualifier.nonprivate) appendStr(" nonprivate"); - if (qualifier.volatil) + if (qualifier.volatil) appendStr(" volatile"); - if (qualifier.restrict) + if (qualifier.restrict) appendStr(" restrict"); - if (qualifier.readonly) + if (qualifier.readonly) appendStr(" readonly"); - if (qualifier.writeonly) + if (qualifier.writeonly) appendStr(" writeonly"); - if (qualifier.specConstant) + if (qualifier.specConstant) appendStr(" specialization-constant"); - if (qualifier.nonUniform) + if (qualifier.nonUniform) appendStr(" nonuniform"); - if (qualifier.isNullInit()) + if (qualifier.isNullInit()) appendStr(" null-init"); - if (qualifier.isSpirvByReference()) + if (qualifier.isSpirvByReference()) appendStr(" spirv_by_reference"); - if (qualifier.isSpirvLiteral()) + if (qualifier.isSpirvLiteral()) appendStr(" spirv_literal"); - appendStr(" "); - appendStr(getStorageQualifierString()); - if (isArray()) { - for(int i = 0; i < (int)arraySizes->getNumDims(); ++i) { + appendStr(" "); + appendStr(getStorageQualifierString()); + } + if (getType) { + if (syntactic) { + if (getPrecision && qualifier.precision != EpqNone) { + appendStr(" "); + appendStr(getPrecisionQualifierString()); + } + if (isVector() || isMatrix()) { + appendStr(" "); + switch (basicType) { + case EbtDouble: + appendStr("d"); + break; + case EbtInt: + appendStr("i"); + break; + case EbtUint: + appendStr("u"); + break; + case EbtBool: + appendStr("b"); + break; + case EbtFloat: + default: + break; + } + if (isVector()) { + appendStr("vec"); + appendInt(vectorSize); + } else { + appendStr("mat"); + appendInt(matrixCols); + appendStr("x"); + appendInt(matrixRows); + } + } else if (isStruct() && structure) { + appendStr(" "); + appendStr(structName.c_str()); + appendStr("{"); + bool hasHiddenMember = true; + for (size_t i = 0; i < structure->size(); ++i) { + if (!(*structure)[i].type->hiddenMember()) { + if (!hasHiddenMember) + appendStr(", "); + typeString.append((*structure)[i].type->getCompleteString(syntactic, getQualifiers, getPrecision, getType, (*structure)[i].type->getFieldName())); + hasHiddenMember = false; + } + } + appendStr("}"); + } else { + appendStr(" "); + switch (basicType) { + case EbtDouble: + appendStr("double"); + break; + case EbtInt: + appendStr("int"); + break; + case EbtUint: + appendStr("uint"); + break; + case EbtBool: + appendStr("bool"); + break; + case EbtFloat: + appendStr("float"); + break; + default: + appendStr("unexpected"); + break; + } + } + if (name.length() > 0) { + appendStr(" "); + appendStr(name.c_str()); + } + if (isArray()) { + for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) { int size = arraySizes->getDimSize(i); if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed()) - appendStr(" runtime-sized array of"); + appendStr("[]"); else { - if (size == UnsizedArraySize) { - appendStr(" unsized"); - if (i == 0) { - appendStr(" "); - appendInt(arraySizes->getImplicitSize()); - } - } else { - appendStr(" "); - appendInt(arraySizes->getDimSize(i)); + if (size == UnsizedArraySize) { + appendStr("["); + if (i == 0) + appendInt(arraySizes->getImplicitSize()); + appendStr("]"); + } + else { + appendStr("["); + appendInt(arraySizes->getDimSize(i)); + appendStr("]"); + } + } + } + } + } + else { + if (isArray()) { + for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) { + int size = arraySizes->getDimSize(i); + if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed()) + appendStr(" runtime-sized array of"); + else { + if (size == UnsizedArraySize) { + appendStr(" unsized"); + if (i == 0) { + appendStr(" "); + appendInt(arraySizes->getImplicitSize()); } - appendStr("-element array of"); + } + else { + appendStr(" "); + appendInt(arraySizes->getDimSize(i)); + } + appendStr("-element array of"); } + } } - } - if (isParameterized()) { - appendStr("<"); - for(int i = 0; i < (int)typeParameters->getNumDims(); ++i) { - appendInt(typeParameters->getDimSize(i)); - if (i != (int)typeParameters->getNumDims() - 1) + if (isParameterized()) { + if (isCoopMatKHR()) { + appendStr(" "); + appendStr("coopmat"); + } + + appendStr("<"); + for (int i = 0; i < (int)typeParameters->arraySizes->getNumDims(); ++i) { + appendInt(typeParameters->arraySizes->getDimSize(i)); + if (i != (int)typeParameters->arraySizes->getNumDims() - 1) + appendStr(", "); + } + if (coopmatKHRUseValid) { + appendStr(", "); + appendInt(coopmatKHRuse); + } + appendStr(">"); + } + if (getPrecision && qualifier.precision != EpqNone) { + appendStr(" "); + appendStr(getPrecisionQualifierString()); + } + if (isMatrix()) { + appendStr(" "); + appendInt(matrixCols); + appendStr("X"); + appendInt(matrixRows); + appendStr(" matrix of"); + } + else if (isVector()) { + appendStr(" "); + appendInt(vectorSize); + appendStr("-component vector of"); + } + + appendStr(" "); + typeString.append(getBasicTypeString()); + + if (qualifier.builtIn != EbvNone) { + appendStr(" "); + appendStr(getBuiltInVariableString()); + } + + // Add struct/block members + if (isStruct() && structure) { + appendStr("{"); + bool hasHiddenMember = true; + for (size_t i = 0; i < structure->size(); ++i) { + if (!(*structure)[i].type->hiddenMember()) { + if (!hasHiddenMember) appendStr(", "); - } - appendStr(">"); - } - if (qualifier.precision != EpqNone) { - appendStr(" "); - appendStr(getPrecisionQualifierString()); - } - if (isMatrix()) { - appendStr(" "); - appendInt(matrixCols); - appendStr("X"); - appendInt(matrixRows); - appendStr(" matrix of"); - } else if (isVector()) { - appendStr(" "); - appendInt(vectorSize); - appendStr("-component vector of"); - } - - appendStr(" "); - typeString.append(getBasicTypeString()); - - if (qualifier.builtIn != EbvNone) { - appendStr(" "); - appendStr(getBuiltInVariableString()); - } - - // Add struct/block members - if (isStruct() && structure) { - appendStr("{"); - bool hasHiddenMember = true; - for (size_t i = 0; i < structure->size(); ++i) { - if (! (*structure)[i].type->hiddenMember()) { - if (!hasHiddenMember) - appendStr(", "); - typeString.append((*structure)[i].type->getCompleteString()); - typeString.append(" "); - typeString.append((*structure)[i].type->getFieldName()); - hasHiddenMember = false; + typeString.append((*structure)[i].type->getCompleteString()); + typeString.append(" "); + typeString.append((*structure)[i].type->getFieldName()); + hasHiddenMember = false; } + } + appendStr("}"); } - appendStr("}"); + } } return typeString; @@ -2380,16 +2502,19 @@ public: const char* getStorageQualifierString() const { return GetStorageQualifierString(qualifier.storage); } const char* getBuiltInVariableString() const { return GetBuiltInVariableString(qualifier.builtIn); } const char* getPrecisionQualifierString() const { return GetPrecisionQualifierString(qualifier.precision); } -#endif const TTypeList* getStruct() const { assert(isStruct()); return structure; } void setStruct(TTypeList* s) { assert(isStruct()); structure = s; } TTypeList* getWritableStruct() const { assert(isStruct()); return structure; } // This should only be used when known to not be sharing with other threads void setBasicType(const TBasicType& t) { basicType = t; } - + void setVectorSize(int s) { + assert(s >= 0); + vectorSize = static_cast(s) & 0b1111; + } + int computeNumComponents() const { - int components = 0; + uint32_t components = 0; if (getBasicType() == EbtStruct || getBasicType() == EbtBlock) { for (TTypeList::const_iterator tl = getStruct()->begin(); tl != getStruct()->end(); tl++) @@ -2403,7 +2528,7 @@ public: components *= arraySizes->getCumulativeSize(); } - return components; + return static_cast(components); } // append this type's mangled name to the passed in 'name' @@ -2432,13 +2557,27 @@ public: // type definitions, and member names to be considered the same type. // This rule applies recursively for nested or embedded types." // - bool sameStructType(const TType& right) const + // If type mismatch in structure, return member indices through lpidx and rpidx. + // If matching members for either block are exhausted, return -1 for exhausted + // block and the index of the unmatched member. Otherwise return {-1,-1}. + // + bool sameStructType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const { + // Initialize error to general type mismatch. + if (lpidx != nullptr) { + *lpidx = -1; + *rpidx = -1; + } + // Most commonly, they are both nullptr, or the same pointer to the same actual structure + // TODO: Why return true when neither types are structures? if ((!isStruct() && !right.isStruct()) || (isStruct() && right.isStruct() && structure == right.structure)) return true; + if (!isStruct() || !right.isStruct()) + return false; + // Structure names have to match if (*typeName != *right.typeName) return false; @@ -2448,17 +2587,30 @@ public: bool isGLPerVertex = *typeName == "gl_PerVertex"; // Both being nullptr was caught above, now they both have to be structures of the same number of elements - if (!isStruct() || !right.isStruct() || - (structure->size() != right.structure->size() && !isGLPerVertex)) + if (lpidx == nullptr && + (structure->size() != right.structure->size() && !isGLPerVertex)) { return false; + } // Compare the names and types of all the members, which have to match for (size_t li = 0, ri = 0; li < structure->size() || ri < right.structure->size(); ++li, ++ri) { + if (lpidx != nullptr) { + *lpidx = static_cast(li); + *rpidx = static_cast(ri); + } if (li < structure->size() && ri < right.structure->size()) { if ((*structure)[li].type->getFieldName() == (*right.structure)[ri].type->getFieldName()) { if (*(*structure)[li].type != *(*right.structure)[ri].type) return false; } else { + // Skip hidden members + if ((*structure)[li].type->hiddenMember()) { + ri--; + continue; + } else if ((*right.structure)[ri].type->hiddenMember()) { + li--; + continue; + } // If one of the members is something that's inconsistently declared, skip over it // for now. if (isGLPerVertex) { @@ -2475,11 +2627,19 @@ public: } // If we get here, then there should only be inconsistently declared members left } else if (li < structure->size()) { - if (!isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName())) + if (!(*structure)[li].type->hiddenMember() && !isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName())) { + if (lpidx != nullptr) { + *rpidx = -1; + } return false; + } } else { - if (!isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName())) + if (!(*right.structure)[ri].type->hiddenMember() && !isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName())) { + if (lpidx != nullptr) { + *lpidx = -1; + } return false; + } } } @@ -2503,17 +2663,25 @@ public: return *referentType == *right.referentType; } - // See if two types match, in all aspects except arrayness - bool sameElementType(const TType& right) const + // See if two types match, in all aspects except arrayness + // If mismatch in structure members, return member indices in lpidx and rpidx. + bool sameElementType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const { - return basicType == right.basicType && sameElementShape(right); + if (lpidx != nullptr) { + *lpidx = -1; + *rpidx = -1; + } + return basicType == right.basicType && sameElementShape(right, lpidx, rpidx); } // See if two type's arrayness match bool sameArrayness(const TType& right) const { return ((arraySizes == nullptr && right.arraySizes == nullptr) || - (arraySizes != nullptr && right.arraySizes != nullptr && *arraySizes == *right.arraySizes)); + (arraySizes != nullptr && right.arraySizes != nullptr && + (*arraySizes == *right.arraySizes || + (arraySizes->isImplicitlySized() && right.arraySizes->isDefaultImplicitlySized()) || + (right.arraySizes->isImplicitlySized() && arraySizes->isDefaultImplicitlySized())))); } // See if two type's arrayness match in everything except their outer dimension @@ -2530,25 +2698,29 @@ public: (typeParameters != nullptr && right.typeParameters != nullptr && *typeParameters == *right.typeParameters)); } -#ifndef GLSLANG_WEB // See if two type's SPIR-V type contents match bool sameSpirvType(const TType& right) const { return ((spirvType == nullptr && right.spirvType == nullptr) || (spirvType != nullptr && right.spirvType != nullptr && *spirvType == *right.spirvType)); } -#endif // See if two type's elements match in all ways except basic type - bool sameElementShape(const TType& right) const + // If mismatch in structure members, return member indices in lpidx and rpidx. + bool sameElementShape(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const { - return sampler == right.sampler && + if (lpidx != nullptr) { + *lpidx = -1; + *rpidx = -1; + } + return ((basicType != EbtSampler && right.basicType != EbtSampler) || sampler == right.sampler) && vectorSize == right.vectorSize && matrixCols == right.matrixCols && matrixRows == right.matrixRows && vector1 == right.vector1 && - isCoopMat() == right.isCoopMat() && - sameStructType(right) && + isCoopMatNV() == right.isCoopMatNV() && + isCoopMatKHR() == right.isCoopMatKHR() && + sameStructType(right, lpidx, rpidx) && sameReferenceType(right); } @@ -2556,32 +2728,70 @@ public: // an OK function parameter bool coopMatParameterOK(const TType& right) const { - return isCoopMat() && right.isCoopMat() && (getBasicType() == right.getBasicType()) && - typeParameters == nullptr && right.typeParameters != nullptr; + if (isCoopMatNV()) { + return right.isCoopMatNV() && (getBasicType() == right.getBasicType()) && typeParameters == nullptr && + right.typeParameters != nullptr; + } + if (isCoopMatKHR() && right.isCoopMatKHR()) { + return ((getBasicType() == right.getBasicType()) || (getBasicType() == EbtCoopmat) || + (right.getBasicType() == EbtCoopmat)) && + ((typeParameters == nullptr && right.typeParameters != nullptr) || + (typeParameters != nullptr && right.typeParameters == nullptr)); + } + return false; } bool sameCoopMatBaseType(const TType &right) const { - bool rv = coopmat && right.coopmat; - if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16) - rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16; - else if (getBasicType() == EbtUint || getBasicType() == EbtUint8) - rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8; - else if (getBasicType() == EbtInt || getBasicType() == EbtInt8) - rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8; - else - rv = false; + bool rv = false; + + if (isCoopMatNV()) { + rv = isCoopMatNV() && right.isCoopMatNV(); + if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16) + rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16; + else if (getBasicType() == EbtUint || getBasicType() == EbtUint8 || getBasicType() == EbtUint16) + rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8 || right.getBasicType() == EbtUint16; + else if (getBasicType() == EbtInt || getBasicType() == EbtInt8 || getBasicType() == EbtInt16) + rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8 || right.getBasicType() == EbtInt16; + else + rv = false; + } else if (isCoopMatKHR() && right.isCoopMatKHR()) { + if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16) + rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16 || right.getBasicType() == EbtCoopmat; + else if (getBasicType() == EbtUint || getBasicType() == EbtUint8 || getBasicType() == EbtUint16) + rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8 || right.getBasicType() == EbtUint16 || right.getBasicType() == EbtCoopmat; + else if (getBasicType() == EbtInt || getBasicType() == EbtInt8 || getBasicType() == EbtInt16) + rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8 || right.getBasicType() == EbtInt16 || right.getBasicType() == EbtCoopmat; + else + rv = false; + } return rv; } + bool sameCoopMatUse(const TType &right) const { + return coopmatKHRuse == right.coopmatKHRuse; + } + + bool sameCoopMatShapeAndUse(const TType &right) const + { + if (!isCoopMat() || !right.isCoopMat() || isCoopMatKHR() != right.isCoopMatKHR()) + return false; + + if (coopmatKHRuse != right.coopmatKHRuse) + return false; + + // Skip bit width type parameter (first array size) for coopmatNV + int firstArrayDimToCompare = isCoopMatNV() ? 1 : 0; + for (int i = firstArrayDimToCompare; i < typeParameters->arraySizes->getNumDims(); ++i) { + if (typeParameters->arraySizes->getDimSize(i) != right.typeParameters->arraySizes->getDimSize(i)) + return false; + } + return true; + } // See if two types match in all ways (just the actual type, not qualification) bool operator==(const TType& right) const { -#ifndef GLSLANG_WEB - return sameElementType(right) && sameArrayness(right) && sameTypeParameters(right) && sameSpirvType(right); -#else - return sameElementType(right) && sameArrayness(right) && sameTypeParameters(right); -#endif + return sameElementType(right) && sameArrayness(right) && sameTypeParameters(right) && sameCoopMatUse(right) && sameSpirvType(right); } bool operator!=(const TType& right) const @@ -2591,18 +2801,14 @@ public: unsigned int getBufferReferenceAlignment() const { -#ifndef GLSLANG_WEB if (getBasicType() == glslang::EbtReference) { return getReferentType()->getQualifier().hasBufferReferenceAlign() ? (1u << getReferentType()->getQualifier().layoutBufferReferenceAlign) : 16u; } -#endif return 0; } -#ifndef GLSLANG_WEB const TSpirvType& getSpirvType() const { assert(spirvType); return *spirvType; } -#endif protected: // Require consumer to pick between deep copy and shallow copy. @@ -2616,7 +2822,6 @@ protected: { shallowCopy(copyOf); -#ifndef GLSLANG_WEB // GL_EXT_spirv_intrinsics if (copyOf.qualifier.spirvDecorate) { qualifier.spirvDecorate = new TSpirvDecorate; @@ -2627,7 +2832,6 @@ protected: spirvType = new TSpirvType; *spirvType = *copyOf.spirvType; } -#endif if (copyOf.arraySizes) { arraySizes = new TArraySizes; @@ -2635,8 +2839,11 @@ protected: } if (copyOf.typeParameters) { - typeParameters = new TArraySizes; - *typeParameters = *copyOf.typeParameters; + typeParameters = new TTypeParameters; + typeParameters->arraySizes = new TArraySizes; + *typeParameters->arraySizes = *copyOf.typeParameters->arraySizes; + *typeParameters->spirvType = *copyOf.typeParameters->spirvType; + typeParameters->basicType = copyOf.basicType; } if (copyOf.isStruct() && copyOf.structure) { @@ -2666,15 +2873,18 @@ protected: void buildMangledName(TString&) const; TBasicType basicType : 8; - int vectorSize : 4; // 1 means either scalar or 1-component vector; see vector1 to disambiguate. - int matrixCols : 4; - int matrixRows : 4; + uint32_t vectorSize : 4; // 1 means either scalar or 1-component vector; see vector1 to disambiguate. + uint32_t matrixCols : 4; + uint32_t matrixRows : 4; bool vector1 : 1; // Backward-compatible tracking of a 1-component vector distinguished from a scalar. // GLSL 4.5 never has a 1-component vector; so this will always be false until such // functionality is added. // HLSL does have a 1-component vectors, so this will be true to disambiguate // from a scalar. - bool coopmat : 1; + bool coopmatNV : 1; + bool coopmatKHR : 1; + uint32_t coopmatKHRuse : 3; // Accepts one of three values: 0, 1, 2 (gl_MatrixUseA, gl_MatrixUseB, gl_MatrixUseAccumulator) + bool coopmatKHRUseValid : 1; // True if coopmatKHRuse has been set TQualifier qualifier; TArraySizes* arraySizes; // nullptr unless an array; can be shared across types @@ -2687,10 +2897,8 @@ protected: TString *fieldName; // for structure field names TString *typeName; // for structure type name TSampler sampler; - TArraySizes* typeParameters;// nullptr unless a parameterized type; can be shared across types -#ifndef GLSLANG_WEB + TTypeParameters *typeParameters;// nullptr unless a parameterized type; can be shared across types TSpirvType* spirvType; // SPIR-V type defined by spirv_type directive -#endif }; } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/arrays.h b/libraries/ZVulkan/src/glslang/glslang/Include/arrays.h index 7f047d9fb..91e190835 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/arrays.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/arrays.h @@ -147,6 +147,15 @@ struct TSmallArrayVector { sizes->erase(sizes->begin()); } + void pop_back() + { + assert(sizes != nullptr && sizes->size() > 0); + if (sizes->size() == 1) + dealloc(); + else + sizes->resize(sizes->size() - 1); + } + // 'this' should currently not be holding anything, and copyNonFront // will make it hold a copy of all but the first element of rhs. // (This would be useful for making a type that is dereferenced by @@ -222,7 +231,7 @@ protected: struct TArraySizes { POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - TArraySizes() : implicitArraySize(1), variablyIndexed(false) { } + TArraySizes() : implicitArraySize(0), implicitlySized(true), variablyIndexed(false){ } // For breaking into two non-shared copies, independently modifiable. TArraySizes& operator=(const TArraySizes& from) @@ -230,6 +239,7 @@ struct TArraySizes { implicitArraySize = from.implicitArraySize; variablyIndexed = from.variablyIndexed; sizes = from.sizes; + implicitlySized = from.implicitlySized; return *this; } @@ -256,11 +266,17 @@ struct TArraySizes { void addInnerSize(int s, TIntermTyped* n) { sizes.push_back((unsigned)s, n); } void addInnerSize(TArraySize pair) { sizes.push_back(pair.size, pair.node); + implicitlySized = false; } void addInnerSizes(const TArraySizes& s) { sizes.push_back(s.sizes); } - void changeOuterSize(int s) { sizes.changeFront((unsigned)s); } - int getImplicitSize() const { return implicitArraySize; } - void updateImplicitSize(int s) { implicitArraySize = std::max(implicitArraySize, s); } + void changeOuterSize(int s) { + sizes.changeFront((unsigned)s); + implicitlySized = false; + } + int getImplicitSize() const { return implicitArraySize > 0 ? implicitArraySize : 1; } + void updateImplicitSize(int s) { + implicitArraySize = (std::max)(implicitArraySize, s); + } bool isInnerUnsized() const { for (int d = 1; d < sizes.size(); ++d) { @@ -295,7 +311,11 @@ struct TArraySizes { bool hasUnsized() const { return getOuterSize() == UnsizedArraySize || isInnerUnsized(); } bool isSized() const { return getOuterSize() != UnsizedArraySize; } + bool isImplicitlySized() const { return implicitlySized; } + bool isDefaultImplicitlySized() const { return implicitlySized && implicitArraySize == 0; } + void setImplicitlySized(bool isImplicitSizing) { implicitlySized = isImplicitSizing; } void dereference() { sizes.pop_front(); } + void removeLastSize() { sizes.pop_back(); } void copyDereferenced(const TArraySizes& rhs) { assert(sizes.size() == 0); @@ -333,6 +353,7 @@ protected: // the implicit size of the array, if not variably indexed and // otherwise legal. int implicitArraySize; + bool implicitlySized; bool variablyIndexed; // true if array is indexed with a non compile-time constant }; diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_interface.h b/libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_interface.h new file mode 100644 index 000000000..7fa1a05d5 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_interface.h @@ -0,0 +1,288 @@ +/** + This code is based on the glslang_c_interface implementation by Viktor Latypov +**/ + +/** +BSD 2-Clause License + +Copyright (c) 2019, Viktor Latypov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**/ + +#ifndef GLSLANG_C_IFACE_H_INCLUDED +#define GLSLANG_C_IFACE_H_INCLUDED + +#include +#include + +#include "glslang_c_shader_types.h" + +typedef struct glslang_shader_s glslang_shader_t; +typedef struct glslang_program_s glslang_program_t; + +/* TLimits counterpart */ +typedef struct glslang_limits_s { + bool non_inductive_for_loops; + bool while_loops; + bool do_while_loops; + bool general_uniform_indexing; + bool general_attribute_matrix_vector_indexing; + bool general_varying_indexing; + bool general_sampler_indexing; + bool general_variable_indexing; + bool general_constant_matrix_vector_indexing; +} glslang_limits_t; + +/* TBuiltInResource counterpart */ +typedef struct glslang_resource_s { + int max_lights; + int max_clip_planes; + int max_texture_units; + int max_texture_coords; + int max_vertex_attribs; + int max_vertex_uniform_components; + int max_varying_floats; + int max_vertex_texture_image_units; + int max_combined_texture_image_units; + int max_texture_image_units; + int max_fragment_uniform_components; + int max_draw_buffers; + int max_vertex_uniform_vectors; + int max_varying_vectors; + int max_fragment_uniform_vectors; + int max_vertex_output_vectors; + int max_fragment_input_vectors; + int min_program_texel_offset; + int max_program_texel_offset; + int max_clip_distances; + int max_compute_work_group_count_x; + int max_compute_work_group_count_y; + int max_compute_work_group_count_z; + int max_compute_work_group_size_x; + int max_compute_work_group_size_y; + int max_compute_work_group_size_z; + int max_compute_uniform_components; + int max_compute_texture_image_units; + int max_compute_image_uniforms; + int max_compute_atomic_counters; + int max_compute_atomic_counter_buffers; + int max_varying_components; + int max_vertex_output_components; + int max_geometry_input_components; + int max_geometry_output_components; + int max_fragment_input_components; + int max_image_units; + int max_combined_image_units_and_fragment_outputs; + int max_combined_shader_output_resources; + int max_image_samples; + int max_vertex_image_uniforms; + int max_tess_control_image_uniforms; + int max_tess_evaluation_image_uniforms; + int max_geometry_image_uniforms; + int max_fragment_image_uniforms; + int max_combined_image_uniforms; + int max_geometry_texture_image_units; + int max_geometry_output_vertices; + int max_geometry_total_output_components; + int max_geometry_uniform_components; + int max_geometry_varying_components; + int max_tess_control_input_components; + int max_tess_control_output_components; + int max_tess_control_texture_image_units; + int max_tess_control_uniform_components; + int max_tess_control_total_output_components; + int max_tess_evaluation_input_components; + int max_tess_evaluation_output_components; + int max_tess_evaluation_texture_image_units; + int max_tess_evaluation_uniform_components; + int max_tess_patch_components; + int max_patch_vertices; + int max_tess_gen_level; + int max_viewports; + int max_vertex_atomic_counters; + int max_tess_control_atomic_counters; + int max_tess_evaluation_atomic_counters; + int max_geometry_atomic_counters; + int max_fragment_atomic_counters; + int max_combined_atomic_counters; + int max_atomic_counter_bindings; + int max_vertex_atomic_counter_buffers; + int max_tess_control_atomic_counter_buffers; + int max_tess_evaluation_atomic_counter_buffers; + int max_geometry_atomic_counter_buffers; + int max_fragment_atomic_counter_buffers; + int max_combined_atomic_counter_buffers; + int max_atomic_counter_buffer_size; + int max_transform_feedback_buffers; + int max_transform_feedback_interleaved_components; + int max_cull_distances; + int max_combined_clip_and_cull_distances; + int max_samples; + int max_mesh_output_vertices_nv; + int max_mesh_output_primitives_nv; + int max_mesh_work_group_size_x_nv; + int max_mesh_work_group_size_y_nv; + int max_mesh_work_group_size_z_nv; + int max_task_work_group_size_x_nv; + int max_task_work_group_size_y_nv; + int max_task_work_group_size_z_nv; + int max_mesh_view_count_nv; + int max_mesh_output_vertices_ext; + int max_mesh_output_primitives_ext; + int max_mesh_work_group_size_x_ext; + int max_mesh_work_group_size_y_ext; + int max_mesh_work_group_size_z_ext; + int max_task_work_group_size_x_ext; + int max_task_work_group_size_y_ext; + int max_task_work_group_size_z_ext; + int max_mesh_view_count_ext; + union + { + int max_dual_source_draw_buffers_ext; + + /* Incorrectly capitalized name retained for backward compatibility */ + int maxDualSourceDrawBuffersEXT; + }; + + glslang_limits_t limits; +} glslang_resource_t; + +/* Inclusion result structure allocated by C include_local/include_system callbacks */ +typedef struct glsl_include_result_s { + /* Header file name or NULL if inclusion failed */ + const char* header_name; + + /* Header contents or NULL */ + const char* header_data; + size_t header_length; + +} glsl_include_result_t; + +/* Callback for local file inclusion */ +typedef glsl_include_result_t* (*glsl_include_local_func)(void* ctx, const char* header_name, const char* includer_name, + size_t include_depth); + +/* Callback for system file inclusion */ +typedef glsl_include_result_t* (*glsl_include_system_func)(void* ctx, const char* header_name, + const char* includer_name, size_t include_depth); + +/* Callback for include result destruction */ +typedef int (*glsl_free_include_result_func)(void* ctx, glsl_include_result_t* result); + +/* Collection of callbacks for GLSL preprocessor */ +typedef struct glsl_include_callbacks_s { + glsl_include_system_func include_system; + glsl_include_local_func include_local; + glsl_free_include_result_func free_include_result; +} glsl_include_callbacks_t; + +typedef struct glslang_input_s { + glslang_source_t language; + glslang_stage_t stage; + glslang_client_t client; + glslang_target_client_version_t client_version; + glslang_target_language_t target_language; + glslang_target_language_version_t target_language_version; + /** Shader source code */ + const char* code; + int default_version; + glslang_profile_t default_profile; + int force_default_version_and_profile; + int forward_compatible; + glslang_messages_t messages; + const glslang_resource_t* resource; + glsl_include_callbacks_t callbacks; + void* callbacks_ctx; +} glslang_input_t; + +/* SpvOptions counterpart */ +typedef struct glslang_spv_options_s { + bool generate_debug_info; + bool strip_debug_info; + bool disable_optimizer; + bool optimize_size; + bool disassemble; + bool validate; + bool emit_nonsemantic_shader_debug_info; + bool emit_nonsemantic_shader_debug_source; + bool compile_only; +} glslang_spv_options_t; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef GLSLANG_IS_SHARED_LIBRARY + #ifdef _WIN32 + #ifdef GLSLANG_EXPORTING + #define GLSLANG_EXPORT __declspec(dllexport) + #else + #define GLSLANG_EXPORT __declspec(dllimport) + #endif + #elif __GNUC__ >= 4 + #define GLSLANG_EXPORT __attribute__((visibility("default"))) + #endif +#endif // GLSLANG_IS_SHARED_LIBRARY + +#ifndef GLSLANG_EXPORT +#define GLSLANG_EXPORT +#endif + +GLSLANG_EXPORT int glslang_initialize_process(void); +GLSLANG_EXPORT void glslang_finalize_process(void); + +GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input); +GLSLANG_EXPORT void glslang_shader_delete(glslang_shader_t* shader); +GLSLANG_EXPORT void glslang_shader_set_preamble(glslang_shader_t* shader, const char* s); +GLSLANG_EXPORT void glslang_shader_shift_binding(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base); +GLSLANG_EXPORT void glslang_shader_shift_binding_for_set(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base, unsigned int set); +GLSLANG_EXPORT void glslang_shader_set_options(glslang_shader_t* shader, int options); // glslang_shader_options_t +GLSLANG_EXPORT void glslang_shader_set_glsl_version(glslang_shader_t* shader, int version); +GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input); +GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input); +GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader); +GLSLANG_EXPORT const char* glslang_shader_get_info_log(glslang_shader_t* shader); +GLSLANG_EXPORT const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader); + +GLSLANG_EXPORT glslang_program_t* glslang_program_create(void); +GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program); +GLSLANG_EXPORT void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader); +GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t +GLSLANG_EXPORT void glslang_program_add_source_text(glslang_program_t* program, glslang_stage_t stage, const char* text, size_t len); +GLSLANG_EXPORT void glslang_program_set_source_file(glslang_program_t* program, glslang_stage_t stage, const char* file); +GLSLANG_EXPORT int glslang_program_map_io(glslang_program_t* program); +GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage); +GLSLANG_EXPORT void glslang_program_SPIRV_generate_with_options(glslang_program_t* program, glslang_stage_t stage, glslang_spv_options_t* spv_options); +GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program); +GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*); +GLSLANG_EXPORT unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program); +GLSLANG_EXPORT const char* glslang_program_SPIRV_get_messages(glslang_program_t* program); +GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program); +GLSLANG_EXPORT const char* glslang_program_get_info_debug_log(glslang_program_t* program); + +#ifdef __cplusplus +} +#endif + +#endif /* #ifdef GLSLANG_C_IFACE_INCLUDED */ diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_shader_types.h b/libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_shader_types.h new file mode 100644 index 000000000..51f5642ab --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/Include/glslang_c_shader_types.h @@ -0,0 +1,228 @@ +/** + This code is based on the glslang_c_interface implementation by Viktor Latypov +**/ + +/** +BSD 2-Clause License + +Copyright (c) 2019, Viktor Latypov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**/ + +#ifndef C_SHADER_TYPES_H_INCLUDED +#define C_SHADER_TYPES_H_INCLUDED + +#define LAST_ELEMENT_MARKER(x) x + +/* EShLanguage counterpart */ +typedef enum { + GLSLANG_STAGE_VERTEX, + GLSLANG_STAGE_TESSCONTROL, + GLSLANG_STAGE_TESSEVALUATION, + GLSLANG_STAGE_GEOMETRY, + GLSLANG_STAGE_FRAGMENT, + GLSLANG_STAGE_COMPUTE, + GLSLANG_STAGE_RAYGEN, + GLSLANG_STAGE_RAYGEN_NV = GLSLANG_STAGE_RAYGEN, + GLSLANG_STAGE_INTERSECT, + GLSLANG_STAGE_INTERSECT_NV = GLSLANG_STAGE_INTERSECT, + GLSLANG_STAGE_ANYHIT, + GLSLANG_STAGE_ANYHIT_NV = GLSLANG_STAGE_ANYHIT, + GLSLANG_STAGE_CLOSESTHIT, + GLSLANG_STAGE_CLOSESTHIT_NV = GLSLANG_STAGE_CLOSESTHIT, + GLSLANG_STAGE_MISS, + GLSLANG_STAGE_MISS_NV = GLSLANG_STAGE_MISS, + GLSLANG_STAGE_CALLABLE, + GLSLANG_STAGE_CALLABLE_NV = GLSLANG_STAGE_CALLABLE, + GLSLANG_STAGE_TASK, + GLSLANG_STAGE_TASK_NV = GLSLANG_STAGE_TASK, + GLSLANG_STAGE_MESH, + GLSLANG_STAGE_MESH_NV = GLSLANG_STAGE_MESH, + LAST_ELEMENT_MARKER(GLSLANG_STAGE_COUNT), +} glslang_stage_t; // would be better as stage, but this is ancient now + +/* EShLanguageMask counterpart */ +typedef enum { + GLSLANG_STAGE_VERTEX_MASK = (1 << GLSLANG_STAGE_VERTEX), + GLSLANG_STAGE_TESSCONTROL_MASK = (1 << GLSLANG_STAGE_TESSCONTROL), + GLSLANG_STAGE_TESSEVALUATION_MASK = (1 << GLSLANG_STAGE_TESSEVALUATION), + GLSLANG_STAGE_GEOMETRY_MASK = (1 << GLSLANG_STAGE_GEOMETRY), + GLSLANG_STAGE_FRAGMENT_MASK = (1 << GLSLANG_STAGE_FRAGMENT), + GLSLANG_STAGE_COMPUTE_MASK = (1 << GLSLANG_STAGE_COMPUTE), + GLSLANG_STAGE_RAYGEN_MASK = (1 << GLSLANG_STAGE_RAYGEN), + GLSLANG_STAGE_RAYGEN_NV_MASK = GLSLANG_STAGE_RAYGEN_MASK, + GLSLANG_STAGE_INTERSECT_MASK = (1 << GLSLANG_STAGE_INTERSECT), + GLSLANG_STAGE_INTERSECT_NV_MASK = GLSLANG_STAGE_INTERSECT_MASK, + GLSLANG_STAGE_ANYHIT_MASK = (1 << GLSLANG_STAGE_ANYHIT), + GLSLANG_STAGE_ANYHIT_NV_MASK = GLSLANG_STAGE_ANYHIT_MASK, + GLSLANG_STAGE_CLOSESTHIT_MASK = (1 << GLSLANG_STAGE_CLOSESTHIT), + GLSLANG_STAGE_CLOSESTHIT_NV_MASK = GLSLANG_STAGE_CLOSESTHIT_MASK, + GLSLANG_STAGE_MISS_MASK = (1 << GLSLANG_STAGE_MISS), + GLSLANG_STAGE_MISS_NV_MASK = GLSLANG_STAGE_MISS_MASK, + GLSLANG_STAGE_CALLABLE_MASK = (1 << GLSLANG_STAGE_CALLABLE), + GLSLANG_STAGE_CALLABLE_NV_MASK = GLSLANG_STAGE_CALLABLE_MASK, + GLSLANG_STAGE_TASK_MASK = (1 << GLSLANG_STAGE_TASK), + GLSLANG_STAGE_TASK_NV_MASK = GLSLANG_STAGE_TASK_MASK, + GLSLANG_STAGE_MESH_MASK = (1 << GLSLANG_STAGE_MESH), + GLSLANG_STAGE_MESH_NV_MASK = GLSLANG_STAGE_MESH_MASK, + LAST_ELEMENT_MARKER(GLSLANG_STAGE_MASK_COUNT), +} glslang_stage_mask_t; + +/* EShSource counterpart */ +typedef enum { + GLSLANG_SOURCE_NONE, + GLSLANG_SOURCE_GLSL, + GLSLANG_SOURCE_HLSL, + LAST_ELEMENT_MARKER(GLSLANG_SOURCE_COUNT), +} glslang_source_t; + +/* EShClient counterpart */ +typedef enum { + GLSLANG_CLIENT_NONE, + GLSLANG_CLIENT_VULKAN, + GLSLANG_CLIENT_OPENGL, + LAST_ELEMENT_MARKER(GLSLANG_CLIENT_COUNT), +} glslang_client_t; + +/* EShTargetLanguage counterpart */ +typedef enum { + GLSLANG_TARGET_NONE, + GLSLANG_TARGET_SPV, + LAST_ELEMENT_MARKER(GLSLANG_TARGET_COUNT), +} glslang_target_language_t; + +/* SH_TARGET_ClientVersion counterpart */ +typedef enum { + GLSLANG_TARGET_VULKAN_1_0 = (1 << 22), + GLSLANG_TARGET_VULKAN_1_1 = (1 << 22) | (1 << 12), + GLSLANG_TARGET_VULKAN_1_2 = (1 << 22) | (2 << 12), + GLSLANG_TARGET_VULKAN_1_3 = (1 << 22) | (3 << 12), + GLSLANG_TARGET_OPENGL_450 = 450, + LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT = 5), +} glslang_target_client_version_t; + +/* SH_TARGET_LanguageVersion counterpart */ +typedef enum { + GLSLANG_TARGET_SPV_1_0 = (1 << 16), + GLSLANG_TARGET_SPV_1_1 = (1 << 16) | (1 << 8), + GLSLANG_TARGET_SPV_1_2 = (1 << 16) | (2 << 8), + GLSLANG_TARGET_SPV_1_3 = (1 << 16) | (3 << 8), + GLSLANG_TARGET_SPV_1_4 = (1 << 16) | (4 << 8), + GLSLANG_TARGET_SPV_1_5 = (1 << 16) | (5 << 8), + GLSLANG_TARGET_SPV_1_6 = (1 << 16) | (6 << 8), + LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT = 7), +} glslang_target_language_version_t; + +/* EShExecutable counterpart */ +typedef enum { GLSLANG_EX_VERTEX_FRAGMENT, GLSLANG_EX_FRAGMENT } glslang_executable_t; + +// EShOptimizationLevel counterpart +// This enum is not used in the current C interface, but could be added at a later date. +// GLSLANG_OPT_NONE is the current default. +typedef enum { + GLSLANG_OPT_NO_GENERATION, + GLSLANG_OPT_NONE, + GLSLANG_OPT_SIMPLE, + GLSLANG_OPT_FULL, + LAST_ELEMENT_MARKER(GLSLANG_OPT_LEVEL_COUNT), +} glslang_optimization_level_t; + +/* EShTextureSamplerTransformMode counterpart */ +typedef enum { + GLSLANG_TEX_SAMP_TRANS_KEEP, + GLSLANG_TEX_SAMP_TRANS_UPGRADE_TEXTURE_REMOVE_SAMPLER, + LAST_ELEMENT_MARKER(GLSLANG_TEX_SAMP_TRANS_COUNT), +} glslang_texture_sampler_transform_mode_t; + +/* EShMessages counterpart */ +typedef enum { + GLSLANG_MSG_DEFAULT_BIT = 0, + GLSLANG_MSG_RELAXED_ERRORS_BIT = (1 << 0), + GLSLANG_MSG_SUPPRESS_WARNINGS_BIT = (1 << 1), + GLSLANG_MSG_AST_BIT = (1 << 2), + GLSLANG_MSG_SPV_RULES_BIT = (1 << 3), + GLSLANG_MSG_VULKAN_RULES_BIT = (1 << 4), + GLSLANG_MSG_ONLY_PREPROCESSOR_BIT = (1 << 5), + GLSLANG_MSG_READ_HLSL_BIT = (1 << 6), + GLSLANG_MSG_CASCADING_ERRORS_BIT = (1 << 7), + GLSLANG_MSG_KEEP_UNCALLED_BIT = (1 << 8), + GLSLANG_MSG_HLSL_OFFSETS_BIT = (1 << 9), + GLSLANG_MSG_DEBUG_INFO_BIT = (1 << 10), + GLSLANG_MSG_HLSL_ENABLE_16BIT_TYPES_BIT = (1 << 11), + GLSLANG_MSG_HLSL_LEGALIZATION_BIT = (1 << 12), + GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13), + GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14), + GLSLANG_MSG_ENHANCED = (1 << 15), + GLSLANG_MSG_ABSOLUTE_PATH = (1 << 16), + LAST_ELEMENT_MARKER(GLSLANG_MSG_COUNT), +} glslang_messages_t; + +/* EShReflectionOptions counterpart */ +typedef enum { + GLSLANG_REFLECTION_DEFAULT_BIT = 0, + GLSLANG_REFLECTION_STRICT_ARRAY_SUFFIX_BIT = (1 << 0), + GLSLANG_REFLECTION_BASIC_ARRAY_SUFFIX_BIT = (1 << 1), + GLSLANG_REFLECTION_INTERMEDIATE_IOO_BIT = (1 << 2), + GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3), + GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4), + GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5), + GLSLANG_REFLECTION_ALL_IO_VARIABLES_BIT = (1 << 6), + GLSLANG_REFLECTION_SHARED_STD140_SSBO_BIT = (1 << 7), + GLSLANG_REFLECTION_SHARED_STD140_UBO_BIT = (1 << 8), + LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT), +} glslang_reflection_options_t; + +/* EProfile counterpart (from Versions.h) */ +typedef enum { + GLSLANG_BAD_PROFILE = 0, + GLSLANG_NO_PROFILE = (1 << 0), + GLSLANG_CORE_PROFILE = (1 << 1), + GLSLANG_COMPATIBILITY_PROFILE = (1 << 2), + GLSLANG_ES_PROFILE = (1 << 3), + LAST_ELEMENT_MARKER(GLSLANG_PROFILE_COUNT), +} glslang_profile_t; + +/* Shader options */ +typedef enum { + GLSLANG_SHADER_DEFAULT_BIT = 0, + GLSLANG_SHADER_AUTO_MAP_BINDINGS = (1 << 0), + GLSLANG_SHADER_AUTO_MAP_LOCATIONS = (1 << 1), + GLSLANG_SHADER_VULKAN_RULES_RELAXED = (1 << 2), + LAST_ELEMENT_MARKER(GLSLANG_SHADER_COUNT), +} glslang_shader_options_t; + +/* TResourceType counterpart */ +typedef enum { + GLSLANG_RESOURCE_TYPE_SAMPLER, + GLSLANG_RESOURCE_TYPE_TEXTURE, + GLSLANG_RESOURCE_TYPE_IMAGE, + GLSLANG_RESOURCE_TYPE_UBO, + GLSLANG_RESOURCE_TYPE_SSBO, + GLSLANG_RESOURCE_TYPE_UAV, + LAST_ELEMENT_MARKER(GLSLANG_RESOURCE_TYPE_COUNT), +} glslang_resource_type_t; + +#undef LAST_ELEMENT_MARKER + +#endif diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/intermediate.h b/libraries/ZVulkan/src/glslang/glslang/Include/intermediate.h index 1e6ab4aa7..bcce91d3a 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/intermediate.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/intermediate.h @@ -1,7 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. -// Copyright (C) 2017 ARM Limited. +// Copyright (C) 2017, 2022-2024 Arm Limited. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. // // All rights reserved. @@ -48,14 +48,9 @@ #ifndef __INTERMEDIATE_H #define __INTERMEDIATE_H -#if defined(_MSC_VER) && _MSC_VER >= 1900 - #pragma warning(disable : 4464) // relative include path contains '..' - #pragma warning(disable : 5026) // 'glslang::TIntermUnary': move constructor was implicitly defined as deleted -#endif - -#include "../Include/Common.h" -#include "../Include/Types.h" -#include "../Include/ConstantUnion.h" +#include "Common.h" +#include "Types.h" +#include "ConstantUnion.h" namespace glslang { @@ -67,13 +62,12 @@ class TIntermediate; enum TOperator { EOpNull, // if in a node, should only mean a node is still being built EOpSequence, // denotes a list of statements, or parameters, etc. + EOpScope, // Used by debugging to denote a scoped list of statements EOpLinkerObjects, // for aggregate node of objects the linker may need, if not reference by the rest of the AST EOpFunctionCall, EOpFunction, // For function definition EOpParameters, // an aggregate listing the parameters to a function -#ifndef GLSLANG_WEB EOpSpirvInst, -#endif // // Unary operators @@ -91,6 +85,8 @@ enum TOperator { EOpCopyObject, + EOpDeclare, // Used by debugging to force declaration of variable in correct scope + // (u)int* -> bool EOpConvInt8ToBool, EOpConvUint8ToBool, @@ -510,6 +506,8 @@ enum TOperator { EOpSubgroupShuffleXor, EOpSubgroupShuffleUp, EOpSubgroupShuffleDown, + EOpSubgroupRotate, + EOpSubgroupClusteredRotate, EOpSubgroupAdd, EOpSubgroupMul, EOpSubgroupMin, @@ -542,6 +540,8 @@ enum TOperator { EOpSubgroupQuadSwapHorizontal, EOpSubgroupQuadSwapVertical, EOpSubgroupQuadSwapDiagonal, + EOpSubgroupQuadAll, + EOpSubgroupQuadAny, EOpSubgroupPartition, EOpSubgroupPartitionedAdd, @@ -626,6 +626,9 @@ enum TOperator { EOpCooperativeMatrixLoad, EOpCooperativeMatrixStore, EOpCooperativeMatrixMulAdd, + EOpCooperativeMatrixLoadNV, + EOpCooperativeMatrixStoreNV, + EOpCooperativeMatrixMulAddNV, EOpBeginInvocationInterlock, // Fragment only EOpEndInvocationInterlock, // Fragment only @@ -763,7 +766,8 @@ enum TOperator { EOpConstructTextureSampler, EOpConstructNonuniform, // expected to be transformed away, not present in final AST EOpConstructReference, - EOpConstructCooperativeMatrix, + EOpConstructCooperativeMatrixNV, + EOpConstructCooperativeMatrixKHR, EOpConstructAccStruct, EOpConstructGuardEnd, @@ -824,6 +828,7 @@ enum TOperator { EOpSubpassLoadMS, EOpSparseImageLoad, EOpSparseImageLoadLod, + EOpColorAttachmentReadEXT, // Fragment only EOpImageGuardEnd, @@ -934,6 +939,8 @@ enum TOperator { EOpExecuteCallableNV, EOpExecuteCallableKHR, EOpWritePackedPrimitiveIndices4x8NV, + EOpEmitMeshTasksEXT, + EOpSetMeshOutputsEXT, // // GL_EXT_ray_query operations @@ -963,7 +970,44 @@ enum TOperator { EOpRayQueryGetIntersectionObjectToWorld, EOpRayQueryGetIntersectionWorldToObject, + // + // GL_NV_shader_invocation_reorder // + + EOpHitObjectTraceRayNV, + EOpHitObjectTraceRayMotionNV, + EOpHitObjectRecordHitNV, + EOpHitObjectRecordHitMotionNV, + EOpHitObjectRecordHitWithIndexNV, + EOpHitObjectRecordHitWithIndexMotionNV, + EOpHitObjectRecordMissNV, + EOpHitObjectRecordMissMotionNV, + EOpHitObjectRecordEmptyNV, + EOpHitObjectExecuteShaderNV, + EOpHitObjectIsEmptyNV, + EOpHitObjectIsMissNV, + EOpHitObjectIsHitNV, + EOpHitObjectGetRayTMinNV, + EOpHitObjectGetRayTMaxNV, + EOpHitObjectGetObjectRayOriginNV, + EOpHitObjectGetObjectRayDirectionNV, + EOpHitObjectGetWorldRayOriginNV, + EOpHitObjectGetWorldRayDirectionNV, + EOpHitObjectGetWorldToObjectNV, + EOpHitObjectGetObjectToWorldNV, + EOpHitObjectGetInstanceCustomIndexNV, + EOpHitObjectGetInstanceIdNV, + EOpHitObjectGetGeometryIndexNV, + EOpHitObjectGetPrimitiveIndexNV, + EOpHitObjectGetHitKindNV, + EOpHitObjectGetShaderBindingTableRecordIndexNV, + EOpHitObjectGetShaderRecordBufferHandleNV, + EOpHitObjectGetAttributesNV, + EOpHitObjectGetCurrentTimeNV, + EOpReorderThreadNV, + EOpFetchMicroTriangleVertexPositionNV, + EOpFetchMicroTriangleVertexBarycentricNV, + // HLSL operations // @@ -1047,9 +1091,37 @@ enum TOperator { EOpWaveActiveCountBits, // Will decompose to subgroupBallotBitCount(subgroupBallot()). EOpWavePrefixCountBits, // Will decompose to subgroupBallotInclusiveBitCount(subgroupBallot()). + // GL_EXT_expect_assume + EOpAssumeEXT, + EOpExpectEXT, + // Shader Clock Ops EOpReadClockSubgroupKHR, EOpReadClockDeviceKHR, + + // GL_EXT_ray_tracing_position_fetch + EOpRayQueryGetIntersectionTriangleVertexPositionsEXT, + + // Shader tile image ops + EOpStencilAttachmentReadEXT, // Fragment only + EOpDepthAttachmentReadEXT, // Fragment only + + // Image processing + EOpImageSampleWeightedQCOM, + EOpImageBoxFilterQCOM, + EOpImageBlockMatchSADQCOM, + EOpImageBlockMatchSSDQCOM, + + // Image processing2 + EOpImageBlockMatchWindowSSDQCOM, + EOpImageBlockMatchWindowSADQCOM, + EOpImageBlockMatchGatherSSDQCOM, + EOpImageBlockMatchGatherSADQCOM, +}; + +enum TLinkType { + ELinkNone, + ELinkExport, }; class TIntermTraverser; @@ -1081,31 +1153,31 @@ public: virtual const glslang::TSourceLoc& getLoc() const { return loc; } virtual void setLoc(const glslang::TSourceLoc& l) { loc = l; } virtual void traverse(glslang::TIntermTraverser*) = 0; - virtual glslang::TIntermTyped* getAsTyped() { return 0; } - virtual glslang::TIntermOperator* getAsOperator() { return 0; } - virtual glslang::TIntermConstantUnion* getAsConstantUnion() { return 0; } - virtual glslang::TIntermAggregate* getAsAggregate() { return 0; } - virtual glslang::TIntermUnary* getAsUnaryNode() { return 0; } - virtual glslang::TIntermBinary* getAsBinaryNode() { return 0; } - virtual glslang::TIntermSelection* getAsSelectionNode() { return 0; } - virtual glslang::TIntermSwitch* getAsSwitchNode() { return 0; } - virtual glslang::TIntermMethod* getAsMethodNode() { return 0; } - virtual glslang::TIntermSymbol* getAsSymbolNode() { return 0; } - virtual glslang::TIntermBranch* getAsBranchNode() { return 0; } - virtual glslang::TIntermLoop* getAsLoopNode() { return 0; } + virtual glslang::TIntermTyped* getAsTyped() { return nullptr; } + virtual glslang::TIntermOperator* getAsOperator() { return nullptr; } + virtual glslang::TIntermConstantUnion* getAsConstantUnion() { return nullptr; } + virtual glslang::TIntermAggregate* getAsAggregate() { return nullptr; } + virtual glslang::TIntermUnary* getAsUnaryNode() { return nullptr; } + virtual glslang::TIntermBinary* getAsBinaryNode() { return nullptr; } + virtual glslang::TIntermSelection* getAsSelectionNode() { return nullptr; } + virtual glslang::TIntermSwitch* getAsSwitchNode() { return nullptr; } + virtual glslang::TIntermMethod* getAsMethodNode() { return nullptr; } + virtual glslang::TIntermSymbol* getAsSymbolNode() { return nullptr; } + virtual glslang::TIntermBranch* getAsBranchNode() { return nullptr; } + virtual glslang::TIntermLoop* getAsLoopNode() { return nullptr; } - virtual const glslang::TIntermTyped* getAsTyped() const { return 0; } - virtual const glslang::TIntermOperator* getAsOperator() const { return 0; } - virtual const glslang::TIntermConstantUnion* getAsConstantUnion() const { return 0; } - virtual const glslang::TIntermAggregate* getAsAggregate() const { return 0; } - virtual const glslang::TIntermUnary* getAsUnaryNode() const { return 0; } - virtual const glslang::TIntermBinary* getAsBinaryNode() const { return 0; } - virtual const glslang::TIntermSelection* getAsSelectionNode() const { return 0; } - virtual const glslang::TIntermSwitch* getAsSwitchNode() const { return 0; } - virtual const glslang::TIntermMethod* getAsMethodNode() const { return 0; } - virtual const glslang::TIntermSymbol* getAsSymbolNode() const { return 0; } - virtual const glslang::TIntermBranch* getAsBranchNode() const { return 0; } - virtual const glslang::TIntermLoop* getAsLoopNode() const { return 0; } + virtual const glslang::TIntermTyped* getAsTyped() const { return nullptr; } + virtual const glslang::TIntermOperator* getAsOperator() const { return nullptr; } + virtual const glslang::TIntermConstantUnion* getAsConstantUnion() const { return nullptr; } + virtual const glslang::TIntermAggregate* getAsAggregate() const { return nullptr; } + virtual const glslang::TIntermUnary* getAsUnaryNode() const { return nullptr; } + virtual const glslang::TIntermBinary* getAsBinaryNode() const { return nullptr; } + virtual const glslang::TIntermSelection* getAsSelectionNode() const { return nullptr; } + virtual const glslang::TIntermSwitch* getAsSwitchNode() const { return nullptr; } + virtual const glslang::TIntermMethod* getAsMethodNode() const { return nullptr; } + virtual const glslang::TIntermSymbol* getAsSymbolNode() const { return nullptr; } + virtual const glslang::TIntermBranch* getAsBranchNode() const { return nullptr; } + virtual const glslang::TIntermLoop* getAsLoopNode() const { return nullptr; } virtual ~TIntermNode() { } protected: @@ -1155,7 +1227,7 @@ public: virtual bool isIntegerDomain() const { return type.isIntegerDomain(); } bool isAtomic() const { return type.isAtomic(); } bool isReference() const { return type.isReference(); } - TString getCompleteString() const { return type.getCompleteString(); } + TString getCompleteString(bool enhanced = false) const { return type.getCompleteString(enhanced); } protected: TIntermTyped& operator=(const TIntermTyped&); @@ -1269,9 +1341,11 @@ public: virtual const TString& getMethodName() const { return method; } virtual TIntermTyped* getObject() const { return object; } virtual void traverse(TIntermTraverser*); + void setExport() { linkType = ELinkExport; } protected: TIntermTyped* object; TString method; + TLinkType linkType; }; // @@ -1283,12 +1357,7 @@ public: // per process threadPoolAllocator, then it causes increased memory usage per compile // it is essential to use "symbol = sym" to assign to symbol TIntermSymbol(long long i, const TString& n, const TType& t) - : TIntermTyped(t), id(i), -#ifndef GLSLANG_WEB - flattenSubset(-1), -#endif - constSubtree(nullptr) - { name = n; } + : TIntermTyped(t), id(i), flattenSubset(-1), constSubtree(nullptr) { name = n; } virtual long long getId() const { return id; } virtual void changeId(long long i) { id = i; } virtual const TString& getName() const { return name; } @@ -1299,12 +1368,10 @@ public: const TConstUnionArray& getConstArray() const { return constArray; } void setConstSubtree(TIntermTyped* subtree) { constSubtree = subtree; } TIntermTyped* getConstSubtree() const { return constSubtree; } -#ifndef GLSLANG_WEB void setFlattenSubset(int subset) { flattenSubset = subset; } virtual const TString& getAccessName() const; int getFlattenSubset() const { return flattenSubset; } // -1 means full object -#endif // This is meant for cases where a node has already been constructed, and // later on, it becomes necessary to switch to a different symbol. @@ -1312,9 +1379,7 @@ public: protected: long long id; // the unique id of the symbol this node represents -#ifndef GLSLANG_WEB int flattenSubset; // how deeply the flattened object rooted at id has been dereferenced -#endif TString name; // the name of the symbol this node represents TConstUnionArray constArray; // if the symbol is a front-end compile-time constant, this is its value TIntermTyped* constSubtree; @@ -1353,6 +1418,7 @@ struct TCrackedTextureOp { bool subpass; bool lodClamp; bool fragMask; + bool attachmentEXT; }; // @@ -1368,19 +1434,11 @@ public: bool isConstructor() const; bool isTexture() const { return op > EOpTextureGuardBegin && op < EOpTextureGuardEnd; } bool isSampling() const { return op > EOpSamplingGuardBegin && op < EOpSamplingGuardEnd; } -#ifdef GLSLANG_WEB - bool isImage() const { return false; } - bool isSparseTexture() const { return false; } - bool isImageFootprint() const { return false; } - bool isSparseImage() const { return false; } - bool isSubgroup() const { return false; } -#else bool isImage() const { return op > EOpImageGuardBegin && op < EOpImageGuardEnd; } bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; } bool isImageFootprint() const { return op > EOpImageFootprintGuardBegin && op < EOpImageFootprintGuardEnd; } bool isSparseImage() const { return op == EOpSparseImageLoad; } bool isSubgroup() const { return op > EOpSubgroupGuardStart && op < EOpSubgroupGuardStop; } -#endif void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; } TPrecisionQualifier getOperationPrecision() const { return operationPrecision != EpqNone ? @@ -1409,6 +1467,7 @@ public: cracked.gather = false; cracked.grad = false; cracked.subpass = false; + cracked.attachmentEXT = false; cracked.lodClamp = false; cracked.fragMask = false; @@ -1485,7 +1544,6 @@ public: cracked.offset = true; cracked.proj = true; break; -#ifndef GLSLANG_WEB case EOpTextureClamp: case EOpSparseTextureClamp: cracked.lodClamp = true; @@ -1569,7 +1627,9 @@ public: case EOpSubpassLoadMS: cracked.subpass = true; break; -#endif + case EOpColorAttachmentReadEXT: + cracked.attachmentEXT = true; + break; default: break; } @@ -1611,8 +1671,8 @@ protected: // class TIntermUnary : public TIntermOperator { public: - TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(0) {} - TIntermUnary(TOperator o) : TIntermOperator(o), operand(0) {} + TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(nullptr) {} + TIntermUnary(TOperator o) : TIntermOperator(o), operand(nullptr) {} virtual void traverse(TIntermTraverser*); virtual void setOperand(TIntermTyped* o) { operand = o; } virtual TIntermTyped* getOperand() { return operand; } @@ -1620,15 +1680,11 @@ public: virtual TIntermUnary* getAsUnaryNode() { return this; } virtual const TIntermUnary* getAsUnaryNode() const { return this; } virtual void updatePrecision(); -#ifndef GLSLANG_WEB void setSpirvInstruction(const TSpirvInstruction& inst) { spirvInst = inst; } const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; } -#endif protected: TIntermTyped* operand; -#ifndef GLSLANG_WEB TSpirvInstruction spirvInst; -#endif }; typedef TVector TIntermSequence; @@ -1643,6 +1699,7 @@ public: ~TIntermAggregate() { delete pragmaTable; } virtual TIntermAggregate* getAsAggregate() { return this; } virtual const TIntermAggregate* getAsAggregate() const { return this; } + virtual void updatePrecision(); virtual void setOperator(TOperator o) { op = o; } virtual TIntermSequence& getSequence() { return sequence; } virtual const TIntermSequence& getSequence() const { return sequence; } @@ -1659,10 +1716,11 @@ public: bool getDebug() const { return debug; } void setPragmaTable(const TPragmaTable& pTable); const TPragmaTable& getPragmaTable() const { return *pragmaTable; } -#ifndef GLSLANG_WEB void setSpirvInstruction(const TSpirvInstruction& inst) { spirvInst = inst; } const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; } -#endif + + void setLinkType(TLinkType l) { linkType = l; } + TLinkType getLinkType() const { return linkType; } protected: TIntermAggregate(const TIntermAggregate&); // disallow copy constructor TIntermAggregate& operator=(const TIntermAggregate&); // disallow assignment operator @@ -1673,9 +1731,8 @@ protected: bool optimize; bool debug; TPragmaTable* pragmaTable; -#ifndef GLSLANG_WEB TSpirvInstruction spirvInst; -#endif + TLinkType linkType = ELinkNone; }; // @@ -1813,7 +1870,7 @@ public: TIntermNode *getParentNode() { - return path.size() == 0 ? NULL : path.back(); + return path.size() == 0 ? nullptr : path.back(); } const bool preVisit; diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Constant.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Constant.cpp index 17b496c53..ac7fc8cd1 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Constant.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Constant.cpp @@ -42,43 +42,10 @@ #include #include -#ifdef _MSC_VER -#pragma warning(disable: 4146) // warning C4146: unary minus operator applied to unsigned type, result still unsigned -#endif - namespace { using namespace glslang; -typedef union { - double d; - int i[2]; -} DoubleIntUnion; - -// Some helper functions - -bool isNan(double x) -{ - DoubleIntUnion u; - // tough to find a platform independent library function, do it directly - u.d = x; - int bitPatternL = u.i[0]; - int bitPatternH = u.i[1]; - return (bitPatternH & 0x7ff80000) == 0x7ff80000 && - ((bitPatternH & 0xFFFFF) != 0 || bitPatternL != 0); -} - -bool isInf(double x) -{ - DoubleIntUnion u; - // tough to find a platform independent library function, do it directly - u.d = x; - int bitPatternL = u.i[0]; - int bitPatternH = u.i[1]; - return (bitPatternH & 0x7ff00000) == 0x7ff00000 && - (bitPatternH & 0xFFFFF) == 0 && bitPatternL == 0; -} - const double pi = 3.1415926535897932384626433832795; } // end anonymous namespace @@ -210,7 +177,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setUConst(leftUnionArray[i].getUConst() / rightUnionArray[i].getUConst()); break; -#ifndef GLSLANG_WEB case EbtInt8: if (rightUnionArray[i] == (signed char)0) newConstArray[i].setI8Const((signed char)0x7F); @@ -245,9 +211,9 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right case EbtInt64: if (rightUnionArray[i] == 0ll) - newConstArray[i].setI64Const(0x7FFFFFFFFFFFFFFFll); - else if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == (long long)-0x8000000000000000ll) - newConstArray[i].setI64Const((long long)-0x8000000000000000ll); + newConstArray[i].setI64Const(LLONG_MAX); + else if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) + newConstArray[i].setI64Const(LLONG_MIN); else newConstArray[i].setI64Const(leftUnionArray[i].getI64Const() / rightUnionArray[i].getI64Const()); break; @@ -259,8 +225,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setU64Const(leftUnionArray[i].getU64Const() / rightUnionArray[i].getU64Const()); break; default: - return 0; -#endif + return nullptr; } } break; @@ -299,7 +264,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setIConst(0); break; } else goto modulo_default; -#ifndef GLSLANG_WEB case EbtInt64: if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) { newConstArray[i].setI64Const(0); @@ -310,7 +274,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setIConst(0); break; } else goto modulo_default; -#endif default: modulo_default: newConstArray[i] = leftUnionArray[i] % rightUnionArray[i]; @@ -387,7 +350,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right break; default: - return 0; + return nullptr; } TIntermConstantUnion *newNode = new TIntermConstantUnion(newConstArray, returnType); @@ -535,19 +498,17 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) case EbtFloat: newConstArray[i].setDConst(-unionArray[i].getDConst()); break; // Note: avoid UBSAN error regarding negating 0x80000000 case EbtInt: newConstArray[i].setIConst( - unionArray[i].getIConst() == 0x80000000 + static_cast(unionArray[i].getIConst()) == 0x80000000 ? -0x7FFFFFFF - 1 : -unionArray[i].getIConst()); break; case EbtUint: newConstArray[i].setUConst(static_cast(-static_cast(unionArray[i].getUConst()))); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[i].setI8Const(-unionArray[i].getI8Const()); break; case EbtUint8: newConstArray[i].setU8Const(static_cast(-static_cast(unionArray[i].getU8Const()))); break; case EbtInt16: newConstArray[i].setI16Const(-unionArray[i].getI16Const()); break; case EbtUint16:newConstArray[i].setU16Const(static_cast(-static_cast(unionArray[i].getU16Const()))); break; case EbtInt64: newConstArray[i].setI64Const(-unionArray[i].getI64Const()); break; case EbtUint64: newConstArray[i].setU64Const(static_cast(-static_cast(unionArray[i].getU64Const()))); break; -#endif default: return nullptr; } @@ -667,12 +628,12 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) case EOpIsNan: { - newConstArray[i].setBConst(isNan(unionArray[i].getDConst())); + newConstArray[i].setBConst(std::isnan(unionArray[i].getDConst())); break; } case EOpIsInf: { - newConstArray[i].setBConst(isInf(unionArray[i].getDConst())); + newConstArray[i].setBConst(std::isinf(unionArray[i].getDConst())); break; } @@ -717,7 +678,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) case EOpConvDoubleToInt: newConstArray[i].setIConst(static_cast(unionArray[i].getDConst())); break; -#ifndef GLSLANG_WEB case EOpConvInt8ToBool: newConstArray[i].setBConst(unionArray[i].getI8Const() != 0); break; case EOpConvUint8ToBool: @@ -729,7 +689,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) case EOpConvInt64ToBool: newConstArray[i].setBConst(unionArray[i].getI64Const() != 0); break; case EOpConvUint64ToBool: - newConstArray[i].setBConst(unionArray[i].getI64Const() != 0); break; + newConstArray[i].setBConst(unionArray[i].getU64Const() != 0); break; case EOpConvFloat16ToBool: newConstArray[i].setBConst(unionArray[i].getDConst() != 0); break; @@ -952,7 +912,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) case EOpConvUint64ToPtr: case EOpConstructReference: newConstArray[i].setU64Const(unionArray[i].getU64Const()); break; -#endif // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out @@ -1099,7 +1058,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint: newConstArray[comp].setUConst(std::min(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[comp].setI8Const(std::min(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const())); break; @@ -1118,7 +1076,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint64: newConstArray[comp].setU64Const(std::min(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); break; -#endif default: assert(false && "Default missing"); } break; @@ -1135,7 +1092,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint: newConstArray[comp].setUConst(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[comp].setI8Const(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const())); break; @@ -1154,7 +1110,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint64: newConstArray[comp].setU64Const(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); break; -#endif default: assert(false && "Default missing"); } break; @@ -1170,7 +1125,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) newConstArray[comp].setUConst(std::min(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()), childConstUnions[2][arg2comp].getUConst())); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[comp].setI8Const(std::min(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()), childConstUnions[2][arg2comp].getI8Const())); @@ -1199,7 +1153,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) newConstArray[comp].setU64Const(std::min(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()), childConstUnions[2][arg2comp].getU64Const())); break; -#endif default: assert(false && "Default missing"); } break; @@ -1378,7 +1331,7 @@ TIntermTyped* TIntermediate::foldDereference(TIntermTyped* node, int index, cons { TType dereferencedType(node->getType(), index); dereferencedType.getQualifier().storage = EvqConst; - TIntermTyped* result = 0; + TIntermTyped* result = nullptr; int size = dereferencedType.computeNumComponents(); // arrays, vectors, matrices, all use simple multiplicative math @@ -1398,7 +1351,7 @@ TIntermTyped* TIntermediate::foldDereference(TIntermTyped* node, int index, cons result = addConstantUnion(TConstUnionArray(node->getAsConstantUnion()->getConstArray(), start, size), node->getType(), loc); - if (result == 0) + if (result == nullptr) result = node; else result->setType(dereferencedType); @@ -1420,7 +1373,7 @@ TIntermTyped* TIntermediate::foldSwizzle(TIntermTyped* node, TSwizzleSelectorsgetType(), loc); - if (result == 0) + if (result == nullptr) result = node; else result->setType(TType(node->getBasicType(), EvqConst, selectors.size())); diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.cpp index 823406c18..d8a969d77 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.cpp @@ -2,8 +2,8 @@ // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. // Copyright (C) 2015-2020 Google, Inc. -// Copyright (C) 2017 ARM Limited. -// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. +// Copyright (C) 2017, 2022-2024 Arm Limited. +// Modifications Copyright (C) 2020-2021 Advanced Micro Devices, Inc. All rights reserved. // // All rights reserved. // @@ -51,8 +51,9 @@ // including identifying what extensions are needed if a version does not allow a symbol // -#include "../Include/intermediate.h" +#include #include "Initialize.h" +#include "span.h" namespace glslang { @@ -61,10 +62,6 @@ const bool ARBCompatibility = true; const bool ForwardCompatibility = false; -// change this back to false if depending on textual spellings of texturing calls when consuming the AST -// Using PureOperatorBuiltins=false is deprecated. -bool PureOperatorBuiltins = true; - namespace { // @@ -144,29 +141,17 @@ struct Versioning { EProfile EDesktopProfile = static_cast(ENoProfile | ECoreProfile | ECompatibilityProfile); // Declare pointers to put into the table for versioning. -#ifdef GLSLANG_WEB - const Versioning* Es300Desktop130 = nullptr; - const Versioning* Es310Desktop420 = nullptr; -#elif defined(GLSLANG_ANGLE) - const Versioning* Es300Desktop130 = nullptr; - const Versioning* Es310Desktop420 = nullptr; - const Versioning* Es310Desktop450 = nullptr; -#else - const Versioning Es300Desktop130Version[] = { { EEsProfile, 0, 300, 0, nullptr }, - { EDesktopProfile, 0, 130, 0, nullptr }, - { EBadProfile } }; - const Versioning* Es300Desktop130 = &Es300Desktop130Version[0]; + const std::array Es300Desktop130Version = { Versioning{ EEsProfile, 0, 300, 0, nullptr }, + Versioning{ EDesktopProfile, 0, 130, 0, nullptr }, + }; - const Versioning Es310Desktop420Version[] = { { EEsProfile, 0, 310, 0, nullptr }, - { EDesktopProfile, 0, 420, 0, nullptr }, - { EBadProfile } }; - const Versioning* Es310Desktop420 = &Es310Desktop420Version[0]; + const std::array Es310Desktop400Version = { Versioning{ EEsProfile, 0, 310, 0, nullptr }, + Versioning{ EDesktopProfile, 0, 400, 0, nullptr }, + }; - const Versioning Es310Desktop450Version[] = { { EEsProfile, 0, 310, 0, nullptr }, - { EDesktopProfile, 0, 450, 0, nullptr }, - { EBadProfile } }; - const Versioning* Es310Desktop450 = &Es310Desktop450Version[0]; -#endif + const std::array Es310Desktop450Version = { Versioning{ EEsProfile, 0, 310, 0, nullptr }, + Versioning{ EDesktopProfile, 0, 450, 0, nullptr }, + }; // The main descriptor of what a set of function prototypes can look like, and // a pointer to extra versioning information, when needed. @@ -176,7 +161,7 @@ struct BuiltInFunction { int numArguments; // number of arguments (overloads with varying arguments need different entries) ArgType types; // ArgType mask ArgClass classes; // the ways this particular function entry manifests - const Versioning* versioning; // nullptr means always a valid version + const span versioning; // An empty span means always a valid version }; // The tables can have the same built-in function name more than one time, @@ -188,152 +173,146 @@ struct BuiltInFunction { // // Table is terminated by an OpNull TOperator. -const BuiltInFunction BaseFunctions[] = { +const std::array BaseFunctions = { // TOperator, name, arg-count, ArgType, ArgClass, versioning // --------- ---- --------- ------- -------- ---------- - { EOpRadians, "radians", 1, TypeF, ClassRegular, nullptr }, - { EOpDegrees, "degrees", 1, TypeF, ClassRegular, nullptr }, - { EOpSin, "sin", 1, TypeF, ClassRegular, nullptr }, - { EOpCos, "cos", 1, TypeF, ClassRegular, nullptr }, - { EOpTan, "tan", 1, TypeF, ClassRegular, nullptr }, - { EOpAsin, "asin", 1, TypeF, ClassRegular, nullptr }, - { EOpAcos, "acos", 1, TypeF, ClassRegular, nullptr }, - { EOpAtan, "atan", 2, TypeF, ClassRegular, nullptr }, - { EOpAtan, "atan", 1, TypeF, ClassRegular, nullptr }, - { EOpPow, "pow", 2, TypeF, ClassRegular, nullptr }, - { EOpExp, "exp", 1, TypeF, ClassRegular, nullptr }, - { EOpLog, "log", 1, TypeF, ClassRegular, nullptr }, - { EOpExp2, "exp2", 1, TypeF, ClassRegular, nullptr }, - { EOpLog2, "log2", 1, TypeF, ClassRegular, nullptr }, - { EOpSqrt, "sqrt", 1, TypeF, ClassRegular, nullptr }, - { EOpInverseSqrt, "inversesqrt", 1, TypeF, ClassRegular, nullptr }, - { EOpAbs, "abs", 1, TypeF, ClassRegular, nullptr }, - { EOpSign, "sign", 1, TypeF, ClassRegular, nullptr }, - { EOpFloor, "floor", 1, TypeF, ClassRegular, nullptr }, - { EOpCeil, "ceil", 1, TypeF, ClassRegular, nullptr }, - { EOpFract, "fract", 1, TypeF, ClassRegular, nullptr }, - { EOpMod, "mod", 2, TypeF, ClassLS, nullptr }, - { EOpMin, "min", 2, TypeF, ClassLS, nullptr }, - { EOpMax, "max", 2, TypeF, ClassLS, nullptr }, - { EOpClamp, "clamp", 3, TypeF, ClassLS2, nullptr }, - { EOpMix, "mix", 3, TypeF, ClassLS, nullptr }, - { EOpStep, "step", 2, TypeF, ClassFS, nullptr }, - { EOpSmoothStep, "smoothstep", 3, TypeF, ClassFS2, nullptr }, - { EOpNormalize, "normalize", 1, TypeF, ClassRegular, nullptr }, - { EOpFaceForward, "faceforward", 3, TypeF, ClassRegular, nullptr }, - { EOpReflect, "reflect", 2, TypeF, ClassRegular, nullptr }, - { EOpRefract, "refract", 3, TypeF, ClassXLS, nullptr }, - { EOpLength, "length", 1, TypeF, ClassRS, nullptr }, - { EOpDistance, "distance", 2, TypeF, ClassRS, nullptr }, - { EOpDot, "dot", 2, TypeF, ClassRS, nullptr }, - { EOpCross, "cross", 2, TypeF, ClassV3, nullptr }, - { EOpLessThan, "lessThan", 2, TypeFI, ClassBNS, nullptr }, - { EOpLessThanEqual, "lessThanEqual", 2, TypeFI, ClassBNS, nullptr }, - { EOpGreaterThan, "greaterThan", 2, TypeFI, ClassBNS, nullptr }, - { EOpGreaterThanEqual, "greaterThanEqual", 2, TypeFI, ClassBNS, nullptr }, - { EOpVectorEqual, "equal", 2, TypeFIB, ClassBNS, nullptr }, - { EOpVectorNotEqual, "notEqual", 2, TypeFIB, ClassBNS, nullptr }, - { EOpAny, "any", 1, TypeB, ClassRSNS, nullptr }, - { EOpAll, "all", 1, TypeB, ClassRSNS, nullptr }, - { EOpVectorLogicalNot, "not", 1, TypeB, ClassNS, nullptr }, - { EOpSinh, "sinh", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpCosh, "cosh", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpTanh, "tanh", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpAsinh, "asinh", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpAcosh, "acosh", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpAtanh, "atanh", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpAbs, "abs", 1, TypeI, ClassRegular, Es300Desktop130 }, - { EOpSign, "sign", 1, TypeI, ClassRegular, Es300Desktop130 }, - { EOpTrunc, "trunc", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpRound, "round", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpRoundEven, "roundEven", 1, TypeF, ClassRegular, Es300Desktop130 }, - { EOpModf, "modf", 2, TypeF, ClassLO, Es300Desktop130 }, - { EOpMin, "min", 2, TypeIU, ClassLS, Es300Desktop130 }, - { EOpMax, "max", 2, TypeIU, ClassLS, Es300Desktop130 }, - { EOpClamp, "clamp", 3, TypeIU, ClassLS2, Es300Desktop130 }, - { EOpMix, "mix", 3, TypeF, ClassLB, Es300Desktop130 }, - { EOpIsInf, "isinf", 1, TypeF, ClassB, Es300Desktop130 }, - { EOpIsNan, "isnan", 1, TypeF, ClassB, Es300Desktop130 }, - { EOpLessThan, "lessThan", 2, TypeU, ClassBNS, Es300Desktop130 }, - { EOpLessThanEqual, "lessThanEqual", 2, TypeU, ClassBNS, Es300Desktop130 }, - { EOpGreaterThan, "greaterThan", 2, TypeU, ClassBNS, Es300Desktop130 }, - { EOpGreaterThanEqual, "greaterThanEqual", 2, TypeU, ClassBNS, Es300Desktop130 }, - { EOpVectorEqual, "equal", 2, TypeU, ClassBNS, Es300Desktop130 }, - { EOpVectorNotEqual, "notEqual", 2, TypeU, ClassBNS, Es300Desktop130 }, - { EOpAtomicAdd, "atomicAdd", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, - { EOpAtomicMin, "atomicMin", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, - { EOpAtomicMax, "atomicMax", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, - { EOpAtomicAnd, "atomicAnd", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, - { EOpAtomicOr, "atomicOr", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, - { EOpAtomicXor, "atomicXor", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, - { EOpAtomicExchange, "atomicExchange", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, - { EOpAtomicCompSwap, "atomicCompSwap", 3, TypeIU, ClassV1FIOCV, Es310Desktop420 }, -#ifndef GLSLANG_WEB - { EOpMix, "mix", 3, TypeB, ClassRegular, Es310Desktop450 }, - { EOpMix, "mix", 3, TypeIU, ClassLB, Es310Desktop450 }, -#endif - - { EOpNull } + BuiltInFunction{ EOpRadians, "radians", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpDegrees, "degrees", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpSin, "sin", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpCos, "cos", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpTan, "tan", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpAsin, "asin", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpAcos, "acos", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpAtan, "atan", 2, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpAtan, "atan", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpPow, "pow", 2, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpExp, "exp", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpLog, "log", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpExp2, "exp2", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpLog2, "log2", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpSqrt, "sqrt", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpInverseSqrt, "inversesqrt", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpAbs, "abs", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpSign, "sign", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpFloor, "floor", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpCeil, "ceil", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpFract, "fract", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpMod, "mod", 2, TypeF, ClassLS, {} }, + BuiltInFunction{ EOpMin, "min", 2, TypeF, ClassLS, {} }, + BuiltInFunction{ EOpMax, "max", 2, TypeF, ClassLS, {} }, + BuiltInFunction{ EOpClamp, "clamp", 3, TypeF, ClassLS2, {} }, + BuiltInFunction{ EOpMix, "mix", 3, TypeF, ClassLS, {} }, + BuiltInFunction{ EOpStep, "step", 2, TypeF, ClassFS, {} }, + BuiltInFunction{ EOpSmoothStep, "smoothstep", 3, TypeF, ClassFS2, {} }, + BuiltInFunction{ EOpNormalize, "normalize", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpFaceForward, "faceforward", 3, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpReflect, "reflect", 2, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpRefract, "refract", 3, TypeF, ClassXLS, {} }, + BuiltInFunction{ EOpLength, "length", 1, TypeF, ClassRS, {} }, + BuiltInFunction{ EOpDistance, "distance", 2, TypeF, ClassRS, {} }, + BuiltInFunction{ EOpDot, "dot", 2, TypeF, ClassRS, {} }, + BuiltInFunction{ EOpCross, "cross", 2, TypeF, ClassV3, {} }, + BuiltInFunction{ EOpLessThan, "lessThan", 2, TypeFI, ClassBNS, {} }, + BuiltInFunction{ EOpLessThanEqual, "lessThanEqual", 2, TypeFI, ClassBNS, {} }, + BuiltInFunction{ EOpGreaterThan, "greaterThan", 2, TypeFI, ClassBNS, {} }, + BuiltInFunction{ EOpGreaterThanEqual, "greaterThanEqual", 2, TypeFI, ClassBNS, {} }, + BuiltInFunction{ EOpVectorEqual, "equal", 2, TypeFIB, ClassBNS, {} }, + BuiltInFunction{ EOpVectorNotEqual, "notEqual", 2, TypeFIB, ClassBNS, {} }, + BuiltInFunction{ EOpAny, "any", 1, TypeB, ClassRSNS, {} }, + BuiltInFunction{ EOpAll, "all", 1, TypeB, ClassRSNS, {} }, + BuiltInFunction{ EOpVectorLogicalNot, "not", 1, TypeB, ClassNS, {} }, + BuiltInFunction{ EOpSinh, "sinh", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpCosh, "cosh", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpTanh, "tanh", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpAsinh, "asinh", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpAcosh, "acosh", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpAtanh, "atanh", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpAbs, "abs", 1, TypeI, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpSign, "sign", 1, TypeI, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpTrunc, "trunc", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpRound, "round", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpRoundEven, "roundEven", 1, TypeF, ClassRegular, {Es300Desktop130Version} }, + BuiltInFunction{ EOpModf, "modf", 2, TypeF, ClassLO, {Es300Desktop130Version} }, + BuiltInFunction{ EOpMin, "min", 2, TypeIU, ClassLS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpMax, "max", 2, TypeIU, ClassLS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpClamp, "clamp", 3, TypeIU, ClassLS2, {Es300Desktop130Version} }, + BuiltInFunction{ EOpMix, "mix", 3, TypeF, ClassLB, {Es300Desktop130Version} }, + BuiltInFunction{ EOpIsInf, "isinf", 1, TypeF, ClassB, {Es300Desktop130Version} }, + BuiltInFunction{ EOpIsNan, "isnan", 1, TypeF, ClassB, {Es300Desktop130Version} }, + BuiltInFunction{ EOpLessThan, "lessThan", 2, TypeU, ClassBNS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpLessThanEqual, "lessThanEqual", 2, TypeU, ClassBNS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpGreaterThan, "greaterThan", 2, TypeU, ClassBNS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpGreaterThanEqual, "greaterThanEqual", 2, TypeU, ClassBNS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpVectorEqual, "equal", 2, TypeU, ClassBNS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpVectorNotEqual, "notEqual", 2, TypeU, ClassBNS, {Es300Desktop130Version} }, + BuiltInFunction{ EOpAtomicAdd, "atomicAdd", 2, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpAtomicMin, "atomicMin", 2, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpAtomicMax, "atomicMax", 2, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpAtomicAnd, "atomicAnd", 2, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpAtomicOr, "atomicOr", 2, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpAtomicXor, "atomicXor", 2, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpAtomicExchange, "atomicExchange", 2, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpAtomicCompSwap, "atomicCompSwap", 3, TypeIU, ClassV1FIOCV, {Es310Desktop400Version} }, + BuiltInFunction{ EOpMix, "mix", 3, TypeB, ClassRegular, {Es310Desktop450Version} }, + BuiltInFunction{ EOpMix, "mix", 3, TypeIU, ClassLB, {Es310Desktop450Version} }, }; -const BuiltInFunction DerivativeFunctions[] = { - { EOpDPdx, "dFdx", 1, TypeF, ClassRegular, nullptr }, - { EOpDPdy, "dFdy", 1, TypeF, ClassRegular, nullptr }, - { EOpFwidth, "fwidth", 1, TypeF, ClassRegular, nullptr }, - { EOpNull } +const std::array DerivativeFunctions = { + BuiltInFunction{ EOpDPdx, "dFdx", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpDPdy, "dFdy", 1, TypeF, ClassRegular, {} }, + BuiltInFunction{ EOpFwidth, "fwidth", 1, TypeF, ClassRegular, {} }, }; // For functions declared some other way, but still use the table to relate to operator. struct CustomFunction { TOperator op; // operator to map the name to const char* name; // function name - const Versioning* versioning; // nullptr means always a valid version + const span versioning; // An empty span means always a valid version }; const CustomFunction CustomFunctions[] = { - { EOpBarrier, "barrier", nullptr }, - { EOpMemoryBarrierShared, "memoryBarrierShared", nullptr }, - { EOpGroupMemoryBarrier, "groupMemoryBarrier", nullptr }, - { EOpMemoryBarrier, "memoryBarrier", nullptr }, - { EOpMemoryBarrierBuffer, "memoryBarrierBuffer", nullptr }, + { EOpBarrier, "barrier", {} }, + { EOpMemoryBarrierShared, "memoryBarrierShared", {} }, + { EOpGroupMemoryBarrier, "groupMemoryBarrier", {} }, + { EOpMemoryBarrier, "memoryBarrier", {} }, + { EOpMemoryBarrierBuffer, "memoryBarrierBuffer", {} }, - { EOpPackSnorm2x16, "packSnorm2x16", nullptr }, - { EOpUnpackSnorm2x16, "unpackSnorm2x16", nullptr }, - { EOpPackUnorm2x16, "packUnorm2x16", nullptr }, - { EOpUnpackUnorm2x16, "unpackUnorm2x16", nullptr }, - { EOpPackHalf2x16, "packHalf2x16", nullptr }, - { EOpUnpackHalf2x16, "unpackHalf2x16", nullptr }, + { EOpPackSnorm2x16, "packSnorm2x16", {} }, + { EOpUnpackSnorm2x16, "unpackSnorm2x16", {} }, + { EOpPackUnorm2x16, "packUnorm2x16", {} }, + { EOpUnpackUnorm2x16, "unpackUnorm2x16", {} }, + { EOpPackHalf2x16, "packHalf2x16", {} }, + { EOpUnpackHalf2x16, "unpackHalf2x16", {} }, - { EOpMul, "matrixCompMult", nullptr }, - { EOpOuterProduct, "outerProduct", nullptr }, - { EOpTranspose, "transpose", nullptr }, - { EOpDeterminant, "determinant", nullptr }, - { EOpMatrixInverse, "inverse", nullptr }, - { EOpFloatBitsToInt, "floatBitsToInt", nullptr }, - { EOpFloatBitsToUint, "floatBitsToUint", nullptr }, - { EOpIntBitsToFloat, "intBitsToFloat", nullptr }, - { EOpUintBitsToFloat, "uintBitsToFloat", nullptr }, + { EOpMul, "matrixCompMult", {} }, + { EOpOuterProduct, "outerProduct", {} }, + { EOpTranspose, "transpose", {} }, + { EOpDeterminant, "determinant", {} }, + { EOpMatrixInverse, "inverse", {} }, + { EOpFloatBitsToInt, "floatBitsToInt", {} }, + { EOpFloatBitsToUint, "floatBitsToUint", {} }, + { EOpIntBitsToFloat, "intBitsToFloat", {} }, + { EOpUintBitsToFloat, "uintBitsToFloat", {} }, - { EOpTextureQuerySize, "textureSize", nullptr }, - { EOpTextureQueryLod, "textureQueryLod", nullptr }, - { EOpTextureQueryLevels, "textureQueryLevels", nullptr }, - { EOpTextureQuerySamples, "textureSamples", nullptr }, - { EOpTexture, "texture", nullptr }, - { EOpTextureProj, "textureProj", nullptr }, - { EOpTextureLod, "textureLod", nullptr }, - { EOpTextureOffset, "textureOffset", nullptr }, - { EOpTextureFetch, "texelFetch", nullptr }, - { EOpTextureFetchOffset, "texelFetchOffset", nullptr }, - { EOpTextureProjOffset, "textureProjOffset", nullptr }, - { EOpTextureLodOffset, "textureLodOffset", nullptr }, - { EOpTextureProjLod, "textureProjLod", nullptr }, - { EOpTextureProjLodOffset, "textureProjLodOffset", nullptr }, - { EOpTextureGrad, "textureGrad", nullptr }, - { EOpTextureGradOffset, "textureGradOffset", nullptr }, - { EOpTextureProjGrad, "textureProjGrad", nullptr }, - { EOpTextureProjGradOffset, "textureProjGradOffset", nullptr }, - - { EOpNull } + { EOpTextureQuerySize, "textureSize", {} }, + { EOpTextureQueryLod, "textureQueryLod", {} }, + { EOpTextureQueryLod, "textureQueryLOD", {} }, // extension GL_ARB_texture_query_lod + { EOpTextureQueryLevels, "textureQueryLevels", {} }, + { EOpTextureQuerySamples, "textureSamples", {} }, + { EOpTexture, "texture", {} }, + { EOpTextureProj, "textureProj", {} }, + { EOpTextureLod, "textureLod", {} }, + { EOpTextureOffset, "textureOffset", {} }, + { EOpTextureFetch, "texelFetch", {} }, + { EOpTextureFetchOffset, "texelFetchOffset", {} }, + { EOpTextureProjOffset, "textureProjOffset", {} }, + { EOpTextureLodOffset, "textureLodOffset", {} }, + { EOpTextureProjLod, "textureProjLod", {} }, + { EOpTextureProjLodOffset, "textureProjLodOffset", {} }, + { EOpTextureGrad, "textureGrad", {} }, + { EOpTextureGradOffset, "textureGradOffset", {} }, + { EOpTextureProjGrad, "textureProjGrad", {} }, + { EOpTextureProjGradOffset, "textureProjGradOffset", {} }, }; // For the given table of functions, add all the indicated prototypes for each @@ -389,10 +368,8 @@ void AddTabledBuiltin(TString& decls, const BuiltInFunction& function) if (arg == function.numArguments - 1 && (function.classes & ClassLO)) decls.append("out "); if (arg == 0) { -#ifndef GLSLANG_WEB if (function.classes & ClassCV) decls.append("coherent volatile "); -#endif if (function.classes & ClassFIO) decls.append("inout "); if (function.classes & ClassFO) @@ -419,19 +396,14 @@ void AddTabledBuiltin(TString& decls, const BuiltInFunction& function) // See if the tabled versioning information allows the current version. bool ValidVersion(const BuiltInFunction& function, int version, EProfile profile, const SpvVersion& /* spVersion */) { -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - // all entries in table are valid - return true; -#endif - // nullptr means always valid - if (function.versioning == nullptr) + if (function.versioning.empty()) return true; // check for what is said about our current profile - for (const Versioning* v = function.versioning; v->profiles != EBadProfile; ++v) { - if ((v->profiles & profile) != 0) { - if (v->minCoreVersion <= version || (v->numExtensions > 0 && v->minExtendedVersion <= version)) + for (const auto& v : function.versioning) { + if ((v.profiles & profile) != 0) { + if (v.minCoreVersion <= version || (v.numExtensions > 0 && v.minExtendedVersion <= version)) return true; } } @@ -444,12 +416,11 @@ bool ValidVersion(const BuiltInFunction& function, int version, EProfile profile // called once per stage). This is a performance issue only, not a correctness // concern. It is done for quality arising from simplicity, as there are subtleties // to get correct if instead trying to do it surgically. -template -void RelateTabledBuiltins(const FunctionT* functions, TSymbolTable& symbolTable) +template +void RelateTabledBuiltins(const FunctionContainer& functions, TSymbolTable& symbolTable) { - while (functions->op != EOpNull) { - symbolTable.relateToOperator(functions->name, functions->op); - ++functions; + for (const auto& fn : functions) { + symbolTable.relateToOperator(fn.name, fn.op); } } @@ -458,11 +429,10 @@ void RelateTabledBuiltins(const FunctionT* functions, TSymbolTable& symbolTable) // Add declarations for all tables of built-in functions. void TBuiltIns::addTabledBuiltins(int version, EProfile profile, const SpvVersion& spvVersion) { - const auto forEachFunction = [&](TString& decls, const BuiltInFunction* function) { - while (function->op != EOpNull) { - if (ValidVersion(*function, version, profile, spvVersion)) - AddTabledBuiltin(decls, *function); - ++function; + const auto forEachFunction = [&](TString& decls, const span& functions) { + for (const auto& fn : functions) { + if (ValidVersion(fn, version, profile, spvVersion)) + AddTabledBuiltin(decls, fn); } }; @@ -504,7 +474,6 @@ TBuiltIns::TBuiltIns() prefixes[EbtFloat] = ""; prefixes[EbtInt] = "i"; prefixes[EbtUint] = "u"; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) prefixes[EbtFloat16] = "f16"; prefixes[EbtInt8] = "i8"; prefixes[EbtUint8] = "u8"; @@ -512,7 +481,6 @@ TBuiltIns::TBuiltIns() prefixes[EbtUint16] = "u16"; prefixes[EbtInt64] = "i64"; prefixes[EbtUint64] = "u64"; -#endif postfixes[2] = "2"; postfixes[3] = "3"; @@ -522,14 +490,11 @@ TBuiltIns::TBuiltIns() dimMap[Esd2D] = 2; dimMap[Esd3D] = 3; dimMap[EsdCube] = 3; -#ifndef GLSLANG_WEB -#ifndef GLSLANG_ANGLE dimMap[Esd1D] = 1; -#endif dimMap[EsdRect] = 2; dimMap[EsdBuffer] = 1; dimMap[EsdSubpass] = 2; // potentially unused for now -#endif + dimMap[EsdAttachmentEXT] = 2; // potentially unused for now } TBuiltIns::~TBuiltIns() @@ -547,13 +512,6 @@ TBuiltIns::~TBuiltIns() // void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvVersion) { -#ifdef GLSLANG_WEB - version = 310; - profile = EEsProfile; -#elif defined(GLSLANG_ANGLE) - version = 450; - profile = ECoreProfile; -#endif addTabledBuiltins(version, profile, spvVersion); //============================================================================ @@ -562,7 +520,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV // //============================================================================ -#ifndef GLSLANG_WEB // // Derivatives Functions. // @@ -598,7 +555,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "vec4 fwidthCoarse(vec4 p);" ); -#ifndef GLSLANG_ANGLE TString derivativesAndControl16bits ( "float16_t dFdx(float16_t);" "f16vec2 dFdx(f16vec2);" @@ -1392,7 +1348,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n" ); } -#endif // !GLSLANG_ANGLE if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 430)) { @@ -1430,7 +1385,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 440) { commonBuiltins.append( "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t);" @@ -1510,8 +1464,20 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void atomicStore(coherent volatile out double, double, int, int, int);" "\n"); } -#endif // !GLSLANG_ANGLE -#endif // !GLSLANG_WEB + + // NV_shader_atomic_fp16_vector + if (profile != EEsProfile && version >= 430) { + commonBuiltins.append( + "f16vec2 atomicAdd(coherent volatile inout f16vec2, f16vec2);" + "f16vec4 atomicAdd(coherent volatile inout f16vec4, f16vec4);" + "f16vec2 atomicMin(coherent volatile inout f16vec2, f16vec2);" + "f16vec4 atomicMin(coherent volatile inout f16vec4, f16vec4);" + "f16vec2 atomicMax(coherent volatile inout f16vec2, f16vec2);" + "f16vec4 atomicMax(coherent volatile inout f16vec4, f16vec4);" + "f16vec2 atomicExchange(coherent volatile inout f16vec2, f16vec2);" + "f16vec4 atomicExchange(coherent volatile inout f16vec4, f16vec4);" + "\n"); + } if ((profile == EEsProfile && version >= 300) || (profile != EEsProfile && version >= 150)) { // GL_ARB_shader_bit_encoding @@ -1539,7 +1505,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_WEB if ((profile != EEsProfile && version >= 400) || (profile == EEsProfile && version >= 310)) { // GL_OES_gpu_shader5 @@ -1551,7 +1516,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64 commonBuiltins.append( "double fma(double, double, double);" @@ -1569,7 +1533,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "f64vec4 fma(f64vec4, f64vec4, f64vec4 );" "\n"); } -#endif if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 400)) { @@ -1587,7 +1550,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64 commonBuiltins.append( "double frexp(double, out int);" @@ -1620,8 +1582,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif -#endif if ((profile == EEsProfile && version >= 300) || (profile != EEsProfile && version >= 150)) { @@ -1650,7 +1610,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_WEB if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 150)) { commonBuiltins.append( @@ -1670,7 +1629,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "vec4 unpackUnorm4x8(highp uint);" "\n"); } -#endif // // Matrix Functions. @@ -1729,8 +1687,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV } } -#ifndef GLSLANG_WEB -#ifndef GLSLANG_ANGLE // // Original-style texture functions existing in all stages. // (Per-stage functions below.) @@ -1776,6 +1732,16 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "vec4 shadow2DRect(sampler2DRectShadow, vec3);" // GL_ARB_texture_rectangle, caught by keyword check "vec4 shadow2DRectProj(sampler2DRectShadow, vec4);" // GL_ARB_texture_rectangle, caught by keyword check + "vec4 texture1DArray(sampler1DArray, vec2);" // GL_EXT_texture_array + "vec4 texture2DArray(sampler2DArray, vec3);" // GL_EXT_texture_array + "vec4 shadow1DArray(sampler1DArrayShadow, vec3);" // GL_EXT_texture_array + "vec4 shadow2DArray(sampler2DArrayShadow, vec4);" // GL_EXT_texture_array + "vec4 texture1DArray(sampler1DArray, vec2, float);" // GL_EXT_texture_array + "vec4 texture2DArray(sampler2DArray, vec3, float);" // GL_EXT_texture_array + "vec4 shadow1DArray(sampler1DArrayShadow, vec3, float);" // GL_EXT_texture_array + "vec4 texture1DArrayLod(sampler1DArray, vec2, float);" // GL_EXT_texture_array + "vec4 texture2DArrayLod(sampler2DArray, vec3, float);" // GL_EXT_texture_array + "vec4 shadow1DArrayLod(sampler1DArrayShadow, vec3, float);" // GL_EXT_texture_array "\n"); } } @@ -1925,7 +1891,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } } -#endif // !GLSLANG_ANGLE // Bitfield if ((profile == EEsProfile && version >= 310) || @@ -2068,7 +2033,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE // GL_ARB_shader_ballot if (profile != EEsProfile && version >= 450) { commonBuiltins.append( @@ -2149,6 +2113,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "%s subgroupShuffleXor(%s, uint);\n", "%s subgroupShuffleUp(%s, uint delta);\n", "%s subgroupShuffleDown(%s, uint delta);\n", + "%s subgroupRotate(%s, uint);\n", + "%s subgroupClusteredRotate(%s, uint, uint);\n", "%s subgroupAdd(%s);\n", "%s subgroupMul(%s);\n", "%s subgroupMin(%s);\n", @@ -2267,16 +2233,25 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n" ); - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "void subgroupMemoryBarrierShared();" "\n" ); - stageBuiltins[EShLangTaskNV].append( + stageBuiltins[EShLangTask].append( "void subgroupMemoryBarrierShared();" "\n" ); } + // GL_EXT_shader_quad_control + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + commonBuiltins.append( + "bool subgroupQuadAll(bool);\n" + "bool subgroupQuadAny(bool);\n" + ); + } + if (profile != EEsProfile && version >= 460) { commonBuiltins.append( "bool anyInvocation(bool);" @@ -3389,7 +3364,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "bool textureFootprintGradClampNV(sampler2D, vec2, vec2, vec2, float, int, bool, out gl_TextureFootprint2DNV);" "\n"); } -#endif // !GLSLANG_ANGLE if ((profile == EEsProfile && version >= 300 && version < 310) || (profile != EEsProfile && version >= 150 && version < 450)) { // GL_EXT_shader_integer_mix @@ -3409,7 +3383,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE // GL_AMD_gpu_shader_half_float/Explicit types if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) { commonBuiltins.append( @@ -4160,105 +4133,49 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "i32vec2 unpack32(int64_t);" "u32vec2 unpack32(uint64_t);" - "float64_t radians(float64_t);" - "f64vec2 radians(f64vec2);" - "f64vec3 radians(f64vec3);" - "f64vec4 radians(f64vec4);" + // GL_EXT_expect_assume + "int8_t expectEXT(int8_t, int8_t);" + "i8vec2 expectEXT(i8vec2, i8vec2);" + "i8vec3 expectEXT(i8vec3, i8vec3);" + "i8vec4 expectEXT(i8vec4, i8vec4);" - "float64_t degrees(float64_t);" - "f64vec2 degrees(f64vec2);" - "f64vec3 degrees(f64vec3);" - "f64vec4 degrees(f64vec4);" + "uint8_t expectEXT(uint8_t, uint8_t);" + "u8vec2 expectEXT(u8vec2, u8vec2);" + "u8vec3 expectEXT(u8vec3, u8vec3);" + "u8vec4 expectEXT(u8vec4, u8vec4);" - "float64_t sin(float64_t);" - "f64vec2 sin(f64vec2);" - "f64vec3 sin(f64vec3);" - "f64vec4 sin(f64vec4);" + "int16_t expectEXT(int16_t, int16_t);" + "i16vec2 expectEXT(i16vec2, i16vec2);" + "i16vec3 expectEXT(i16vec3, i16vec3);" + "i16vec4 expectEXT(i16vec4, i16vec4);" - "float64_t cos(float64_t);" - "f64vec2 cos(f64vec2);" - "f64vec3 cos(f64vec3);" - "f64vec4 cos(f64vec4);" + "uint16_t expectEXT(uint16_t, uint16_t);" + "u16vec2 expectEXT(u16vec2, u16vec2);" + "u16vec3 expectEXT(u16vec3, u16vec3);" + "u16vec4 expectEXT(u16vec4, u16vec4);" - "float64_t tan(float64_t);" - "f64vec2 tan(f64vec2);" - "f64vec3 tan(f64vec3);" - "f64vec4 tan(f64vec4);" + "int64_t expectEXT(int64_t, int64_t);" + "i64vec2 expectEXT(i64vec2, i64vec2);" + "i64vec3 expectEXT(i64vec3, i64vec3);" + "i64vec4 expectEXT(i64vec4, i64vec4);" - "float64_t asin(float64_t);" - "f64vec2 asin(f64vec2);" - "f64vec3 asin(f64vec3);" - "f64vec4 asin(f64vec4);" + "uint64_t expectEXT(uint64_t, uint64_t);" + "u64vec2 expectEXT(u64vec2, u64vec2);" + "u64vec3 expectEXT(u64vec3, u64vec3);" + "u64vec4 expectEXT(u64vec4, u64vec4);" + "\n"); + } - "float64_t acos(float64_t);" - "f64vec2 acos(f64vec2);" - "f64vec3 acos(f64vec3);" - "f64vec4 acos(f64vec4);" - - "float64_t atan(float64_t, float64_t);" - "f64vec2 atan(f64vec2, f64vec2);" - "f64vec3 atan(f64vec3, f64vec3);" - "f64vec4 atan(f64vec4, f64vec4);" - - "float64_t atan(float64_t);" - "f64vec2 atan(f64vec2);" - "f64vec3 atan(f64vec3);" - "f64vec4 atan(f64vec4);" - - "float64_t sinh(float64_t);" - "f64vec2 sinh(f64vec2);" - "f64vec3 sinh(f64vec3);" - "f64vec4 sinh(f64vec4);" - - "float64_t cosh(float64_t);" - "f64vec2 cosh(f64vec2);" - "f64vec3 cosh(f64vec3);" - "f64vec4 cosh(f64vec4);" - - "float64_t tanh(float64_t);" - "f64vec2 tanh(f64vec2);" - "f64vec3 tanh(f64vec3);" - "f64vec4 tanh(f64vec4);" - - "float64_t asinh(float64_t);" - "f64vec2 asinh(f64vec2);" - "f64vec3 asinh(f64vec3);" - "f64vec4 asinh(f64vec4);" - - "float64_t acosh(float64_t);" - "f64vec2 acosh(f64vec2);" - "f64vec3 acosh(f64vec3);" - "f64vec4 acosh(f64vec4);" - - "float64_t atanh(float64_t);" - "f64vec2 atanh(f64vec2);" - "f64vec3 atanh(f64vec3);" - "f64vec4 atanh(f64vec4);" - - "float64_t pow(float64_t, float64_t);" - "f64vec2 pow(f64vec2, f64vec2);" - "f64vec3 pow(f64vec3, f64vec3);" - "f64vec4 pow(f64vec4, f64vec4);" - - "float64_t exp(float64_t);" - "f64vec2 exp(f64vec2);" - "f64vec3 exp(f64vec3);" - "f64vec4 exp(f64vec4);" - - "float64_t log(float64_t);" - "f64vec2 log(f64vec2);" - "f64vec3 log(f64vec3);" - "f64vec4 log(f64vec4);" - - "float64_t exp2(float64_t);" - "f64vec2 exp2(f64vec2);" - "f64vec3 exp2(f64vec3);" - "f64vec4 exp2(f64vec4);" - - "float64_t log2(float64_t);" - "f64vec2 log2(f64vec2);" - "f64vec3 log2(f64vec3);" - "f64vec4 log2(f64vec4);" + // Builtins for GL_EXT_texture_shadow_lod + if ((profile == EEsProfile && version >= 300) || ((profile != EEsProfile && version >= 130))) { + commonBuiltins.append( + "float texture(sampler2DArrayShadow, vec4, float);" + "float texture(samplerCubeArrayShadow, vec4, float, float);" + "float textureLod(sampler2DArrayShadow, vec4, float);" + "float textureLod(samplerCubeShadow, vec4, float);" + "float textureLod(samplerCubeArrayShadow, vec4, float, float);" + "float textureLodOffset(sampler2DArrayShadow, vec4, float, ivec2);" + "float textureOffset(sampler2DArrayShadow, vec4 , ivec2, float);" "\n"); } @@ -4283,7 +4200,46 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif // !GLSLANG_ANGLE + + // GL_EXT_expect_assume + if ((profile == EEsProfile && version >= 310) || + ((profile != EEsProfile && version >= 140))) { + commonBuiltins.append( + "void assumeEXT(bool);" + + "bool expectEXT(bool, bool);" + "bvec2 expectEXT(bvec2, bvec2);" + "bvec3 expectEXT(bvec3, bvec3);" + "bvec4 expectEXT(bvec4, bvec4);" + + "int expectEXT(int, int);" + "ivec2 expectEXT(ivec2, ivec2);" + "ivec3 expectEXT(ivec3, ivec3);" + "ivec4 expectEXT(ivec4, ivec4);" + + "uint expectEXT(uint, uint);" + "uvec2 expectEXT(uvec2, uvec2);" + "uvec3 expectEXT(uvec3, uvec3);" + "uvec4 expectEXT(uvec4, uvec4);" + "\n"); + } + + // QCOM_image_processing + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + commonBuiltins.append( + "vec4 textureWeightedQCOM(sampler2D, vec2, sampler2DArray);" + "vec4 textureWeightedQCOM(sampler2D, vec2, sampler1DArray);" + "vec4 textureBoxFilterQCOM(sampler2D, vec2, vec2);" + "vec4 textureBlockMatchSADQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + "vec4 textureBlockMatchSSDQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + + "vec4 textureBlockMatchWindowSSDQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + "vec4 textureBlockMatchWindowSADQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + "vec4 textureBlockMatchGatherSSDQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + "vec4 textureBlockMatchGatherSADQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + "\n"); + } //============================================================================ // @@ -4299,7 +4255,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV if (spvVersion.vulkan == 0 && IncludeLegacy(version, profile, spvVersion)) stageBuiltins[EShLangVertex].append("vec4 ftransform();"); -#ifndef GLSLANG_ANGLE // // Original-style texture Functions with lod. // @@ -4359,7 +4314,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } } -#endif // !GLSLANG_ANGLE if ((profile != EEsProfile && version >= 150) || (profile == EEsProfile && version >= 310)) { @@ -4369,7 +4323,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV // //============================================================================ - if (profile != EEsProfile && version >= 400) { + if (profile != EEsProfile && (version >= 400 || version == 150)) { stageBuiltins[EShLangGeometry].append( "void EmitStreamVertex(int);" "void EndStreamPrimitive(int);" @@ -4380,7 +4334,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void EndPrimitive();" "\n"); } -#endif // !GLSLANG_WEB //============================================================================ // @@ -4397,10 +4350,10 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void barrier();" ); if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "void barrier();" ); - stageBuiltins[EShLangTaskNV].append( + stageBuiltins[EShLangTask].append( "void barrier();" ); } @@ -4417,7 +4370,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void groupMemoryBarrier();" ); } -#ifndef GLSLANG_WEB if ((profile != EEsProfile && version >= 420) || esBarrier) { if (spvVersion.vulkan == 0 || spvVersion.vulkanRelaxed) { commonBuiltins.append("void memoryBarrierAtomicCounter();"); @@ -4425,11 +4377,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV commonBuiltins.append("void memoryBarrierImage();"); } if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "void memoryBarrierShared();" "void groupMemoryBarrier();" ); - stageBuiltins[EShLangTaskNV].append( + stageBuiltins[EShLangTask].append( "void memoryBarrierShared();" "void groupMemoryBarrier();" ); @@ -4440,7 +4392,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV commonBuiltins.append("void debugPrintfEXT();\n"); -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 450) { // coopMatStoreNV perhaps ought to have "out" on the buf parameter, but // adding it introduces undesirable tempArgs on the stack. What we want @@ -4521,6 +4472,96 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "icoopmatNV coopMatMulAddNV(icoopmatNV A, icoopmatNV B, icoopmatNV C);\n" "ucoopmatNV coopMatMulAddNV(ucoopmatNV A, ucoopmatNV B, ucoopmatNV C);\n" ); + + std::string cooperativeMatrixFuncs = + "void coopMatLoad(out coopmat m, volatile coherent int8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent int16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent int32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent int64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent float16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent float[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent float64_t[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatLoad(out coopmat m, volatile coherent i8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatLoad(out coopmat m, volatile coherent i8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatStore(coopmat m, volatile coherent int8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent int16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent int32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent int64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent float16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent float[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent float64_t[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatStore(coopmat m, volatile coherent i8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatStore(coopmat m, volatile coherent i8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + + "coopmat coopMatMulAdd(coopmat A, coopmat B, coopmat C);\n" + "coopmat coopMatMulAdd(coopmat A, coopmat B, coopmat C, int matrixOperands);\n"; + + commonBuiltins.append(cooperativeMatrixFuncs.c_str()); + + commonBuiltins.append( + "const int gl_MatrixUseA = 0;\n" + "const int gl_MatrixUseB = 1;\n" + "const int gl_MatrixUseAccumulator = 2;\n" + "const int gl_MatrixOperandsSaturatingAccumulation = 0x10;\n" + "const int gl_CooperativeMatrixLayoutRowMajor = 0;\n" + "const int gl_CooperativeMatrixLayoutColumnMajor = 1;\n" + "const int gl_CooperativeMatrixLayoutRowBlockedInterleavedARM = 4202;\n" + "const int gl_CooperativeMatrixLayoutColumnBlockedInterleavedARM = 4203;\n" + "\n" + ); } //============================================================================ @@ -4564,7 +4605,24 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif // !GLSLANG_ANGLE + + // GL_EXT_shader_tile_image + if (spvVersion.vulkan > 0) { + stageBuiltins[EShLangFragment].append( + "lowp uint stencilAttachmentReadEXT();" + "lowp uint stencilAttachmentReadEXT(int);" + "highp float depthAttachmentReadEXT();" + "highp float depthAttachmentReadEXT(int);" + "\n"); + stageBuiltins[EShLangFragment].append( + "vec4 colorAttachmentReadEXT(attachmentEXT);" + "vec4 colorAttachmentReadEXT(attachmentEXT, int);" + "ivec4 colorAttachmentReadEXT(iattachmentEXT);" + "ivec4 colorAttachmentReadEXT(iattachmentEXT, int);" + "uvec4 colorAttachmentReadEXT(uattachmentEXT);" + "uvec4 colorAttachmentReadEXT(uattachmentEXT, int);" + "\n"); + } // GL_ARB_derivative_control if (profile != EEsProfile && version >= 400) { @@ -4602,7 +4660,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "bool helperInvocationEXT();" "\n"); -#ifndef GLSLANG_ANGLE // GL_AMD_shader_explicit_vertex_parameter if (profile != EEsProfile && version >= 450) { stageBuiltins[EShLangFragment].append( @@ -4653,7 +4710,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } - // GL_ARB_shader_clock & GL_EXT_shader_realtime_clock + // GL_ARB_shader_clock& GL_EXT_shader_realtime_clock if (profile != EEsProfile && version >= 450) { commonBuiltins.append( "uvec2 clock2x32ARB();" @@ -4675,9 +4732,10 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "uvec4 fragmentFetchAMD(usubpassInputMS, uint);" "\n"); - } + } - // Builtins for GL_NV_ray_tracing/GL_NV_ray_tracing_motion_blur/GL_EXT_ray_tracing/GL_EXT_ray_query + // Builtins for GL_NV_ray_tracing/GL_NV_ray_tracing_motion_blur/GL_EXT_ray_tracing/GL_EXT_ray_query/ + // GL_NV_shader_invocation_reorder/GL_KHR_ray_tracing_position_Fetch if (profile != EEsProfile && version >= 460) { commonBuiltins.append("void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);" "void rayQueryTerminateEXT(rayQueryEXT);" @@ -4702,6 +4760,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "vec3 rayQueryGetIntersectionObjectRayOriginEXT(rayQueryEXT, bool);" "mat4x3 rayQueryGetIntersectionObjectToWorldEXT(rayQueryEXT, bool);" "mat4x3 rayQueryGetIntersectionWorldToObjectEXT(rayQueryEXT, bool);" + "void rayQueryGetIntersectionTriangleVertexPositionsEXT(rayQueryEXT, bool, out vec3[3]);" "\n"); stageBuiltins[EShLangRayGen].append( @@ -4710,6 +4769,41 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" + "void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitWithIndexNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordMissNV(hitObjectNV,uint,vec3,float,vec3,float);" + "void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);" + "void hitObjectRecordEmptyNV(hitObjectNV);" + "void hitObjectExecuteShaderNV(hitObjectNV,int);" + "bool hitObjectIsEmptyNV(hitObjectNV);" + "bool hitObjectIsMissNV(hitObjectNV);" + "bool hitObjectIsHitNV(hitObjectNV);" + "float hitObjectGetRayTMinNV(hitObjectNV);" + "float hitObjectGetRayTMaxNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);" + "mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);" + "mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);" + "int hitObjectGetInstanceCustomIndexNV(hitObjectNV);" + "int hitObjectGetInstanceIdNV(hitObjectNV);" + "int hitObjectGetGeometryIndexNV(hitObjectNV);" + "int hitObjectGetPrimitiveIndexNV(hitObjectNV);" + "uint hitObjectGetHitKindNV(hitObjectNV);" + "void hitObjectGetAttributesNV(hitObjectNV,int);" + "float hitObjectGetCurrentTimeNV(hitObjectNV);" + "uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);" + "uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);" + "void reorderThreadNV(uint, uint);" + "void reorderThreadNV(hitObjectNV);" + "void reorderThreadNV(hitObjectNV, uint, uint);" + "vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);" + "vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);" "\n"); stageBuiltins[EShLangIntersect].append( "bool reportIntersectionNV(float, uint);" @@ -4725,6 +4819,36 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" + "void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitWithIndexNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordMissNV(hitObjectNV, uint, vec3, float, vec3, float);" + "void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);" + "void hitObjectRecordEmptyNV(hitObjectNV);" + "void hitObjectExecuteShaderNV(hitObjectNV, int);" + "bool hitObjectIsEmptyNV(hitObjectNV);" + "bool hitObjectIsMissNV(hitObjectNV);" + "bool hitObjectIsHitNV(hitObjectNV);" + "float hitObjectGetRayTMinNV(hitObjectNV);" + "float hitObjectGetRayTMaxNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);" + "mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);" + "mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);" + "int hitObjectGetInstanceCustomIndexNV(hitObjectNV);" + "int hitObjectGetInstanceIdNV(hitObjectNV);" + "int hitObjectGetGeometryIndexNV(hitObjectNV);" + "int hitObjectGetPrimitiveIndexNV(hitObjectNV);" + "uint hitObjectGetHitKindNV(hitObjectNV);" + "void hitObjectGetAttributesNV(hitObjectNV,int);" + "float hitObjectGetCurrentTimeNV(hitObjectNV);" + "uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);" + "uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);" "\n"); stageBuiltins[EShLangMiss].append( "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" @@ -4732,20 +4856,48 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" + "void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitWithIndexNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordMissNV(hitObjectNV, uint, vec3, float, vec3, float);" + "void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);" + "void hitObjectRecordEmptyNV(hitObjectNV);" + "void hitObjectExecuteShaderNV(hitObjectNV, int);" + "bool hitObjectIsEmptyNV(hitObjectNV);" + "bool hitObjectIsMissNV(hitObjectNV);" + "bool hitObjectIsHitNV(hitObjectNV);" + "float hitObjectGetRayTMinNV(hitObjectNV);" + "float hitObjectGetRayTMaxNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);" + "mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);" + "mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);" + "int hitObjectGetInstanceCustomIndexNV(hitObjectNV);" + "int hitObjectGetInstanceIdNV(hitObjectNV);" + "int hitObjectGetGeometryIndexNV(hitObjectNV);" + "int hitObjectGetPrimitiveIndexNV(hitObjectNV);" + "uint hitObjectGetHitKindNV(hitObjectNV);" + "void hitObjectGetAttributesNV(hitObjectNV,int);" + "float hitObjectGetCurrentTimeNV(hitObjectNV);" + "uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);" + "uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);" "\n"); stageBuiltins[EShLangCallable].append( "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" "\n"); } -#endif // !GLSLANG_ANGLE //E_SPV_NV_compute_shader_derivatives if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450)) { stageBuiltins[EShLangCompute].append(derivativeControls); stageBuiltins[EShLangCompute].append("\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 450) { stageBuiltins[EShLangCompute].append(derivativesAndControl16bits); stageBuiltins[EShLangCompute].append(derivativesAndControl64bits); @@ -4754,12 +4906,35 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV // Builtins for GL_NV_mesh_shader if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "void writePackedPrimitiveIndices4x8NV(uint, uint);" "\n"); } -#endif // !GLSLANG_ANGLE -#endif // !GLSLANG_WEB + // Builtins for GL_EXT_mesh_shader + if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { + // Builtins for GL_EXT_mesh_shader + stageBuiltins[EShLangTask].append( + "void EmitMeshTasksEXT(uint, uint, uint);" + "\n"); + + stageBuiltins[EShLangMesh].append( + "void SetMeshOutputsEXT(uint, uint);" + "\n"); + } + // Builtins for GL_NV_displacement_micromap + if ((profile != EEsProfile && version >= 460) || (profile == EEsProfile && version >= 320)) { + stageBuiltins[EShLangMesh].append( + "vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);" + "vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);" + "\n"); + + stageBuiltins[EShLangCompute].append( + "vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);" + "vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);" + "\n"); + + } + //============================================================================ // @@ -4781,13 +4956,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "highp float diff;" // f - n ); } else { -#ifndef GLSLANG_WEB commonBuiltins.append( "float near;" // n "float far;" // f "float diff;" // f - n ); -#endif } commonBuiltins.append( @@ -4796,7 +4969,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion)) { // // Matrix state. p. 31, 32, 37, 39, 40. @@ -4914,7 +5086,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE //============================================================================ // @@ -4944,8 +5115,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_WEB -#ifndef GLSLANG_ANGLE //============================================================================ // // Define the interface to the mesh/task shader. @@ -4954,7 +5123,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { // per-vertex attributes - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "out gl_MeshPerVertexNV {" "vec4 gl_Position;" "float gl_PointSize;" @@ -4967,7 +5136,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ); // per-primitive attributes - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "perprimitiveNV out gl_MeshPerPrimitiveNV {" "int gl_PrimitiveID;" "int gl_Layer;" @@ -4978,7 +5147,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "} gl_MeshPrimitivesNV[];" ); - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "out uint gl_PrimitiveCountNV;" "out uint gl_PrimitiveIndicesNV[];" @@ -4992,10 +5161,38 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in highp uvec3 gl_GlobalInvocationID;" "in highp uint gl_LocalInvocationIndex;" - "\n"); - stageBuiltins[EShLangTaskNV].append( + // GL_EXT_mesh_shader + stageBuiltins[EShLangMesh].append( + "out uint gl_PrimitivePointIndicesEXT[];" + "out uvec2 gl_PrimitiveLineIndicesEXT[];" + "out uvec3 gl_PrimitiveTriangleIndicesEXT[];" + "in highp uvec3 gl_NumWorkGroups;" + "\n"); + + // per-vertex attributes + stageBuiltins[EShLangMesh].append( + "out gl_MeshPerVertexEXT {" + "vec4 gl_Position;" + "float gl_PointSize;" + "float gl_ClipDistance[];" + "float gl_CullDistance[];" + "} gl_MeshVerticesEXT[];" + ); + + // per-primitive attributes + stageBuiltins[EShLangMesh].append( + "perprimitiveEXT out gl_MeshPerPrimitiveEXT {" + "int gl_PrimitiveID;" + "int gl_Layer;" + "int gl_ViewportIndex;" + "bool gl_CullPrimitiveEXT;" + "int gl_PrimitiveShadingRateEXT;" + "} gl_MeshPrimitivesEXT[];" + ); + + stageBuiltins[EShLangTask].append( "out uint gl_TaskCountNV;" "const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);" @@ -5008,32 +5205,32 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in uint gl_MeshViewCountNV;" "in uint gl_MeshViewIndicesNV[4];" - + "in highp uvec3 gl_NumWorkGroups;" "\n"); } if (profile != EEsProfile && version >= 450) { - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "in highp int gl_DeviceIndex;" // GL_EXT_device_group "in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters + "in int gl_ViewIndex;" // GL_EXT_multiview "\n"); - stageBuiltins[EShLangTaskNV].append( + stageBuiltins[EShLangTask].append( "in highp int gl_DeviceIndex;" // GL_EXT_device_group "in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters "\n"); if (version >= 460) { - stageBuiltins[EShLangMeshNV].append( + stageBuiltins[EShLangMesh].append( "in int gl_DrawID;" "\n"); - stageBuiltins[EShLangTaskNV].append( + stageBuiltins[EShLangTask].append( "in int gl_DrawID;" "\n"); } } -#endif // !GLSLANG_ANGLE //============================================================================ // @@ -5137,7 +5334,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV stageBuiltins[EShLangVertex].append( "int gl_VertexID;" // needs qualifier fixed later ); - if (version >= 140 && spvVersion.vulkan == 0) + if (spvVersion.vulkan == 0) stageBuiltins[EShLangVertex].append( "int gl_InstanceID;" // needs qualifier fixed later ); @@ -5174,9 +5371,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ); } - if (version >= 450) + if (version >= 430) stageBuiltins[EShLangVertex].append( "out int gl_ViewportMask[];" // GL_NV_viewport_array2 + ); + + if (version >= 450) + stageBuiltins[EShLangVertex].append( "out int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering "out vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering "out vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes @@ -5188,6 +5389,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV stageBuiltins[EShLangVertex].append( "highp vec4 gl_Position;" // needs qualifier fixed later "mediump float gl_PointSize;" // needs qualifier fixed later + "highp int gl_InstanceID;" // needs qualifier fixed later ); } else { if (spvVersion.vulkan == 0 || spvVersion.vulkanRelaxed) @@ -5196,19 +5398,15 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in highp int gl_InstanceID;" // needs qualifier fixed later ); if (spvVersion.vulkan > 0) -#endif stageBuiltins[EShLangVertex].append( "in highp int gl_VertexIndex;" "in highp int gl_InstanceIndex;" ); -#ifndef GLSLANG_WEB if (version < 310) -#endif stageBuiltins[EShLangVertex].append( "highp vec4 gl_Position;" // needs qualifier fixed later "highp float gl_PointSize;" // needs qualifier fixed later ); -#ifndef GLSLANG_WEB else stageBuiltins[EShLangVertex].append( "out gl_PerVertex {" @@ -5312,9 +5510,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in int gl_InvocationID;" ); - if (version >= 450) + if (version >= 430) stageBuiltins[EShLangGeometry].append( "out int gl_ViewportMask[];" // GL_NV_viewport_array2 + ); + + if (version >= 450) + stageBuiltins[EShLangGeometry].append( "out int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering "out vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering "out vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes @@ -5390,7 +5592,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV if (version >= 450) stageBuiltins[EShLangTessControl].append( "float gl_CullDistance[];" + ); + if (version >= 430) + stageBuiltins[EShLangTessControl].append( "int gl_ViewportMask[];" // GL_NV_viewport_array2 + ); + if (version >= 450) + stageBuiltins[EShLangTessControl].append( "vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering "int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering "vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes @@ -5493,9 +5701,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "out int gl_Layer;" "\n"); - if (version >= 450) + if (version >= 430) stageBuiltins[EShLangTessEvaluation].append( "out int gl_ViewportMask[];" // GL_NV_viewport_array2 + ); + + if (version >= 450) + stageBuiltins[EShLangTessEvaluation].append( "out vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering "out int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering "out vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes @@ -5652,6 +5864,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "flat in int gl_InvocationsPerPixelNV;" "in vec3 gl_BaryCoordNV;" // GL_NV_fragment_shader_barycentric "in vec3 gl_BaryCoordNoPerspNV;" + "in vec3 gl_BaryCoordEXT;" // GL_EXT_fragment_shader_barycentric + "in vec3 gl_BaryCoordNoPerspEXT;" ); if (version >= 450) @@ -5670,7 +5884,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "mediump vec2 gl_PointCoord;" // needs qualifier fixed later ); } -#endif if (version >= 300) { stageBuiltins[EShLangFragment].append( "highp vec4 gl_FragCoord;" // needs qualifier fixed later @@ -5679,7 +5892,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "highp float gl_FragDepth;" // needs qualifier fixed later ); } -#ifndef GLSLANG_WEB if (version >= 310) { stageBuiltins[EShLangFragment].append( "bool gl_HelperInvocation;" // needs qualifier fixed later @@ -5716,21 +5928,20 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV stageBuiltins[EShLangFragment].append( "in vec3 gl_BaryCoordNV;" "in vec3 gl_BaryCoordNoPerspNV;" - ); + "in vec3 gl_BaryCoordEXT;" + "in vec3 gl_BaryCoordNoPerspEXT;" + ); if (version >= 310) stageBuiltins[EShLangFragment].append( "flat in highp int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate ); } -#endif stageBuiltins[EShLangFragment].append("\n"); if (version >= 130) add2ndGenerationSamplingImaging(version, profile, spvVersion); -#ifndef GLSLANG_WEB - if ((profile != EEsProfile && version >= 140) || (profile == EEsProfile && version >= 310)) { stageBuiltins[EShLangFragment].append( @@ -5745,7 +5956,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE // GL_ARB_shader_ballot if (profile != EEsProfile && version >= 450) { const char* ballotDecls = @@ -5781,8 +5991,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV stageBuiltins[EShLangGeometry] .append(ballotDecls); stageBuiltins[EShLangCompute] .append(ballotDecls); stageBuiltins[EShLangFragment] .append(fragmentBallotDecls); - stageBuiltins[EShLangMeshNV] .append(ballotDecls); - stageBuiltins[EShLangTaskNV] .append(ballotDecls); + stageBuiltins[EShLangMesh] .append(ballotDecls); + stageBuiltins[EShLangTask] .append(ballotDecls); stageBuiltins[EShLangRayGen] .append(rtBallotDecls); stageBuiltins[EShLangIntersect] .append(rtBallotDecls); // No volatile qualifier on these builtins in any-hit @@ -5808,6 +6018,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in highp uint gl_SMCountNV;" "in highp uint gl_WarpIDNV;" "in highp uint gl_SMIDNV;" + // GL_ARM_shader_core_builtins + "in highp uint gl_CoreIDARM;" + "in highp uint gl_CoreCountARM;" + "in highp uint gl_CoreMaxIDARM;" + "in highp uint gl_WarpIDARM;" + "in highp uint gl_WarpMaxIDARM;" "\n"; const char* fragmentSubgroupDecls = "flat in mediump uint gl_SubgroupSize;" @@ -5822,6 +6038,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "flat in highp uint gl_SMCountNV;" "flat in highp uint gl_WarpIDNV;" "flat in highp uint gl_SMIDNV;" + // GL_ARM_shader_core_builtins + "flat in highp uint gl_CoreIDARM;" + "flat in highp uint gl_CoreCountARM;" + "flat in highp uint gl_CoreMaxIDARM;" + "flat in highp uint gl_WarpIDARM;" + "flat in highp uint gl_WarpMaxIDARM;" "\n"; const char* computeSubgroupDecls = "in highp uint gl_NumSubgroups;" @@ -5841,6 +6063,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in highp uint gl_SMCountNV;" "in highp volatile uint gl_WarpIDNV;" "in highp volatile uint gl_SMIDNV;" + // GL_ARM_shader_core_builtins + "in highp uint gl_CoreIDARM;" + "in highp uint gl_CoreCountARM;" + "in highp uint gl_CoreMaxIDARM;" + "in highp uint gl_WarpIDARM;" + "in highp uint gl_WarpMaxIDARM;" "\n"; stageBuiltins[EShLangVertex] .append(subgroupDecls); @@ -5850,10 +6078,10 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV stageBuiltins[EShLangCompute] .append(subgroupDecls); stageBuiltins[EShLangCompute] .append(computeSubgroupDecls); stageBuiltins[EShLangFragment] .append(fragmentSubgroupDecls); - stageBuiltins[EShLangMeshNV] .append(subgroupDecls); - stageBuiltins[EShLangMeshNV] .append(computeSubgroupDecls); - stageBuiltins[EShLangTaskNV] .append(subgroupDecls); - stageBuiltins[EShLangTaskNV] .append(computeSubgroupDecls); + stageBuiltins[EShLangMesh] .append(subgroupDecls); + stageBuiltins[EShLangMesh] .append(computeSubgroupDecls); + stageBuiltins[EShLangTask] .append(subgroupDecls); + stageBuiltins[EShLangTask] .append(computeSubgroupDecls); stageBuiltins[EShLangRayGen] .append(rtSubgroupDecls); stageBuiltins[EShLangIntersect] .append(rtSubgroupDecls); // No volatile qualifier on these builtins in any-hit @@ -5887,8 +6115,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "const uint gl_RayFlagsCullNoOpaqueEXT = 128U;" "const uint gl_RayFlagsSkipTrianglesEXT = 256U;" "const uint gl_RayFlagsSkipAABBEXT = 512U;" + "const uint gl_RayFlagsForceOpacityMicromap2StateEXT = 1024U;" "const uint gl_HitKindFrontFacingTriangleEXT = 254U;" "const uint gl_HitKindBackFacingTriangleEXT = 255U;" + "in uint gl_HitKindFrontFacingMicroTriangleNV;" + "in uint gl_HitKindBackFacingMicroTriangleNV;" "\n"; const char *constRayQueryIntersection = @@ -5938,6 +6169,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in uint gl_IncomingRayFlagsNV;" "in uint gl_IncomingRayFlagsEXT;" "in float gl_CurrentRayTimeNV;" + "in uint gl_CullMaskEXT;" "\n"; const char *hitDecls = "in uvec3 gl_LaunchIDNV;" @@ -5974,7 +6206,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in uint gl_IncomingRayFlagsNV;" "in uint gl_IncomingRayFlagsEXT;" "in float gl_CurrentRayTimeNV;" + "in uint gl_CullMaskEXT;" + "in vec3 gl_HitTriangleVertexPositionsEXT[3];" + "in vec3 gl_HitMicroTriangleVertexPositionsNV[3];" + "in vec2 gl_HitMicroTriangleVertexBarycentricsNV[3];" "\n"; + const char *missDecls = "in uvec3 gl_LaunchIDNV;" "in uvec3 gl_LaunchIDEXT;" @@ -5993,6 +6230,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in uint gl_IncomingRayFlagsNV;" "in uint gl_IncomingRayFlagsEXT;" "in float gl_CurrentRayTimeNV;" + "in uint gl_CullMaskEXT;" "\n"; const char *callableDecls = @@ -6100,9 +6338,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV } } } -#endif // !GLSLANG_ANGLE - -#endif // !GLSLANG_WEB // printf("%s\n", commonBuiltins.c_str()); // printf("%s\n", stageBuiltins[EShLangFragment].c_str()); @@ -6121,30 +6356,18 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c // enumerate all the types const TBasicType bTypes[] = { EbtFloat, EbtInt, EbtUint, -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - EbtFloat16 -#endif + EbtFloat16 }; -#ifdef GLSLANG_WEB - bool skipBuffer = true; - bool skipCubeArrayed = true; - const int image = 0; -#else bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140); bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130); for (int image = 0; image <= 1; ++image) // loop over "bool" image vs sampler -#endif { for (int shadow = 0; shadow <= 1; ++shadow) { // loop over "bool" shadow or not -#ifdef GLSLANG_WEB - const int ms = 0; -#else for (int ms = 0; ms <= 1; ++ms) // loop over "bool" multisample or not -#endif { if ((ms || image) && shadow) continue; - if (ms && profile != EEsProfile && version < 150) + if (ms && profile != EEsProfile && version < 140) continue; if (ms && image && profile == EEsProfile) continue; @@ -6152,14 +6375,9 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c continue; for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over "bool" arrayed or not -#ifdef GLSLANG_WEB - for (int dim = Esd2D; dim <= EsdCube; ++dim) { // 2D, 3D, and Cube -#else -#if defined(GLSLANG_ANGLE) - for (int dim = Esd2D; dim < EsdNumDims; ++dim) { // 2D, ..., buffer, subpass -#else for (int dim = Esd1D; dim < EsdNumDims; ++dim) { // 1D, ..., buffer, subpass -#endif + if (dim == EsdAttachmentEXT) + continue; if (dim == EsdSubpass && spvVersion.vulkan == 0) continue; if (dim == EsdSubpass && (image || shadow || arrayed)) @@ -6180,7 +6398,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c continue; if (ms && arrayed && profile == EEsProfile && version < 310) continue; -#endif if (dim == Esd3D && shadow) continue; if (dim == EsdCube && arrayed && skipCubeArrayed) @@ -6190,23 +6407,21 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c // Loop over the bTypes for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) { -#ifndef GLSLANG_WEB if (bTypes[bType] == EbtFloat16 && (profile == EEsProfile || version < 450)) continue; if (dim == EsdRect && version < 140 && bType > 0) continue; -#endif if (shadow && (bTypes[bType] == EbtInt || bTypes[bType] == EbtUint)) continue; // // Now, make all the function prototypes for the type we just built... // TSampler sampler; -#ifndef GLSLANG_WEB if (dim == EsdSubpass) { sampler.setSubpass(bTypes[bType], ms ? true : false); + } else if (dim == EsdAttachmentEXT) { + sampler.setAttachmentEXT(bTypes[bType]); } else -#endif if (image) { sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false, shadow ? true : false, @@ -6219,12 +6434,10 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c TString typeName = sampler.getString(); -#ifndef GLSLANG_WEB if (dim == EsdSubpass) { addSubpassSampling(sampler, typeName, version, profile); continue; } -#endif addQueryFunctions(sampler, typeName, version, profile); @@ -6232,7 +6445,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c addImageFunctions(sampler, typeName, version, profile); else { addSamplingFunctions(sampler, typeName, version, profile); -#ifndef GLSLANG_WEB addGatherFunctions(sampler, typeName, version, profile); if (spvVersion.vulkan > 0 && sampler.isCombined() && !sampler.shadow) { // Base Vulkan allows texelFetch() for @@ -6248,7 +6460,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c addSamplingFunctions(sampler, textureTypeName, version, profile); addQueryFunctions(sampler, textureTypeName, version, profile); } -#endif } } } @@ -6279,16 +6490,6 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int int sizeDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0) - (sampler.dim == EsdCube ? 1 : 0); -#ifdef GLSLANG_WEB - commonBuiltins.append("highp "); - commonBuiltins.append("ivec"); - commonBuiltins.append(postfixes[sizeDims]); - commonBuiltins.append(" textureSize("); - commonBuiltins.append(typeName); - commonBuiltins.append(",int);\n"); - return; -#endif - if (sampler.isImage() && ((profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 420))) return; @@ -6329,38 +6530,44 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int // // textureQueryLod(), fragment stage only // Also enabled with extension GL_ARB_texture_query_lod + // Extension GL_ARB_texture_query_lod says that textureQueryLOD() also exist at extension. if (profile != EEsProfile && version >= 150 && sampler.isCombined() && sampler.dim != EsdRect && ! sampler.isMultiSample() && ! sampler.isBuffer()) { - for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) { - if (f16TexAddr && sampler.type != EbtFloat16) - continue; - stageBuiltins[EShLangFragment].append("vec2 textureQueryLod("); - stageBuiltins[EShLangFragment].append(typeName); - if (dimMap[sampler.dim] == 1) - if (f16TexAddr) - stageBuiltins[EShLangFragment].append(", float16_t"); - else - stageBuiltins[EShLangFragment].append(", float"); - else { - if (f16TexAddr) - stageBuiltins[EShLangFragment].append(", f16vec"); - else - stageBuiltins[EShLangFragment].append(", vec"); - stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]); - } - stageBuiltins[EShLangFragment].append(");\n"); - } - stageBuiltins[EShLangCompute].append("vec2 textureQueryLod("); - stageBuiltins[EShLangCompute].append(typeName); - if (dimMap[sampler.dim] == 1) - stageBuiltins[EShLangCompute].append(", float"); - else { - stageBuiltins[EShLangCompute].append(", vec"); - stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]); + const TString funcName[2] = {"vec2 textureQueryLod(", "vec2 textureQueryLOD("}; + + for (int i = 0; i < 2; ++i){ + for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) { + if (f16TexAddr && sampler.type != EbtFloat16) + continue; + stageBuiltins[EShLangFragment].append(funcName[i]); + stageBuiltins[EShLangFragment].append(typeName); + if (dimMap[sampler.dim] == 1) + if (f16TexAddr) + stageBuiltins[EShLangFragment].append(", float16_t"); + else + stageBuiltins[EShLangFragment].append(", float"); + else { + if (f16TexAddr) + stageBuiltins[EShLangFragment].append(", f16vec"); + else + stageBuiltins[EShLangFragment].append(", vec"); + stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]); + } + stageBuiltins[EShLangFragment].append(");\n"); + } + + stageBuiltins[EShLangCompute].append(funcName[i]); + stageBuiltins[EShLangCompute].append(typeName); + if (dimMap[sampler.dim] == 1) + stageBuiltins[EShLangCompute].append(", float"); + else { + stageBuiltins[EShLangCompute].append(", vec"); + stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]); + } + stageBuiltins[EShLangCompute].append(");\n"); } - stageBuiltins[EShLangCompute].append(");\n"); } // @@ -6492,6 +6699,34 @@ void TBuiltIns::addImageFunctions(TSampler sampler, const TString& typeName, int commonBuiltins.append(imageParams); commonBuiltins.append(", float);\n"); } + + // GL_NV_shader_atomic_fp16_vector + if (profile != EEsProfile && version >= 430) { + const int numFp16Builtins = 4; + const char* atomicFp16Func[numFp16Builtins] = { + " imageAtomicAdd(volatile coherent ", + " imageAtomicMin(volatile coherent ", + " imageAtomicMax(volatile coherent ", + " imageAtomicExchange(volatile coherent " + }; + const int numFp16DataTypes = 2; + const char* atomicFp16DataTypes[numFp16DataTypes] = { + "f16vec2", + "f16vec4" + }; + // Loop twice to add prototypes with/without scope/semantics + for (int j = 0; j < numFp16DataTypes; ++j) { + for (int i = 0; i < numFp16Builtins; ++i) { + commonBuiltins.append(atomicFp16DataTypes[j]); + commonBuiltins.append(atomicFp16Func[i]); + commonBuiltins.append(imageParams); + commonBuiltins.append(", "); + commonBuiltins.append(atomicFp16DataTypes[j]); + commonBuiltins.append(");\n"); + } + } + } + if (profile != EEsProfile && version >= 450) { commonBuiltins.append("float imageAtomicAdd(volatile coherent "); commonBuiltins.append(imageParams); @@ -6602,14 +6837,6 @@ void TBuiltIns::addSubpassSampling(TSampler sampler, const TString& typeName, in // void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - // // texturing // @@ -6684,11 +6911,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, continue; // loop over 16-bit floating-point texel addressing -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - const int f16TexAddr = 0; -#else for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) -#endif { if (f16TexAddr && sampler.type != EbtFloat16) continue; @@ -6697,11 +6920,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, totalDims--; } // loop over "bool" lod clamp -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - const int lodClamp = 0; -#else for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) -#endif { if (lodClamp && (profile == EEsProfile || version < 450)) continue; @@ -6709,11 +6928,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, continue; // loop over "bool" sparse or not -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - const int sparse = 0; -#else for (int sparse = 0; sparse <= 1; ++sparse) -#endif { if (sparse && (profile == EEsProfile || version < 450)) continue; @@ -6890,14 +7105,6 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, // void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - switch (sampler.dim) { case Esd2D: case EsdRect: @@ -7136,14 +7343,6 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in // void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language) { -#ifdef GLSLANG_WEB - version = 310; - profile = EEsProfile; -#elif defined(GLSLANG_ANGLE) - version = 450; - profile = ECoreProfile; -#endif - // // Initialize the context-dependent (resource-dependent) built-in strings for parsing. // @@ -7201,7 +7400,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append(builtInConstant); } -#ifndef GLSLANG_WEB if (version >= 310) { // geometry @@ -7524,7 +7722,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf snprintf(builtInConstant, maxSize, "const int gl_MaxTransformFeedbackInterleavedComponents = %d;", resources.maxTransformFeedbackInterleavedComponents); s.append(builtInConstant); } -#endif } // compute @@ -7546,7 +7743,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#ifndef GLSLANG_WEB // images (some in compute below) if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 130)) { @@ -7574,7 +7770,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#ifndef GLSLANG_ANGLE // atomic counters (some in compute below) if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 420)) { @@ -7611,7 +7806,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#endif // !GLSLANG_ANGLE // GL_ARB_cull_distance if (profile != EEsProfile && version >= 450) { @@ -7628,7 +7822,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append(builtInConstant); } -#ifndef GLSLANG_ANGLE // SPV_NV_mesh_shader if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputVerticesNV = %d;", resources.maxMeshOutputVerticesNV); @@ -7651,8 +7844,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#endif -#endif s.append("\n"); } @@ -7681,6 +7872,23 @@ static void SpecialQualifier(const char* name, TStorageQualifier qualifier, TBui symQualifier.builtIn = builtIn; } +// +// Modify the symbol's flat decoration. +// +// Safe to call even if name is not present. +// +// Originally written to transform gl_SubGroupSizeARB from uniform to fragment input in Vulkan. +// +static void ModifyFlatDecoration(const char* name, bool flat, TSymbolTable& symbolTable) +{ + TSymbol* symbol = symbolTable.find(name); + if (symbol == nullptr) + return; + + TQualifier& symQualifier = symbol->getWritableType().getQualifier(); + symQualifier.flat = flat; +} + // // To tag built-in variables with their TBuiltInVariable enum. Use this when the // normal declaration text already gets the qualifier right, and all that's needed @@ -7701,6 +7909,11 @@ static void BuiltInVariable(const char* name, TBuiltInVariable builtIn, TSymbolT symQualifier.builtIn = builtIn; } +static void RetargetVariable(const char* from, const char* to, TSymbolTable& symbolTable) +{ + symbolTable.retargetSymbol(from, to); +} + // // For built-in variables inside a named block. // SpecialQualifier() won't ever go inside a block; their member's qualifier come @@ -7733,14 +7946,6 @@ static void BuiltInVariable(const char* blockName, const char* name, TBuiltInVar // void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable) { -#ifdef GLSLANG_WEB - version = 310; - profile = EEsProfile; -#elif defined(GLSLANG_ANGLE) - version = 450; - profile = ECoreProfile; -#endif - // // Tag built-in variables and functions with additional qualifier and extension information // that cannot be declared with the text strings. @@ -7760,16 +7965,17 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_InstanceIndex", EbvInstanceIndex, symbolTable); } -#ifndef GLSLANG_WEB if (spvVersion.vulkan == 0) { SpecialQualifier("gl_VertexID", EvqVertexId, EbvVertexId, symbolTable); SpecialQualifier("gl_InstanceID", EvqInstanceId, EbvInstanceId, symbolTable); + if (version < 140) + symbolTable.setVariableExtensions("gl_InstanceID", 1, &E_GL_EXT_draw_instanced); } if (spvVersion.vulkan > 0 && spvVersion.vulkanRelaxed) { // treat these built-ins as aliases of VertexIndex and InstanceIndex - BuiltInVariable("gl_VertexID", EbvVertexIndex, symbolTable); - BuiltInVariable("gl_InstanceID", EbvInstanceIndex, symbolTable); + RetargetVariable("gl_InstanceID", "gl_InstanceIndex", symbolTable); + RetargetVariable("gl_VertexID", "gl_VertexIndex", symbolTable); } if (profile != EEsProfile) { @@ -7915,7 +8121,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("shadow2DEXT", 1, &E_GL_EXT_shadow_samplers); symbolTable.setFunctionExtensions("shadow2DProjEXT", 1, &E_GL_EXT_shadow_samplers); } - // Fall through + + // E_GL_EXT_texture_array + if (profile != EEsProfile && spvVersion.spv == 0) { + symbolTable.setFunctionExtensions("texture1DArray", 1, &E_GL_EXT_texture_array); + symbolTable.setFunctionExtensions("texture2DArray", 1, &E_GL_EXT_texture_array); + symbolTable.setFunctionExtensions("shadow1DArray", 1, &E_GL_EXT_texture_array); + symbolTable.setFunctionExtensions("shadow2DArray", 1, &E_GL_EXT_texture_array); + + symbolTable.setFunctionExtensions("texture1DArrayLod", 1, &E_GL_EXT_texture_array); + symbolTable.setFunctionExtensions("texture2DArrayLod", 1, &E_GL_EXT_texture_array); + symbolTable.setFunctionExtensions("shadow1DArrayLod", 1, &E_GL_EXT_texture_array); + } + [[fallthrough]]; case EShLangTessControl: if (profile == EEsProfile && version >= 310) { @@ -7930,11 +8148,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_BoundingBox", EbvBoundingBox, symbolTable); } } - // Fall through + [[fallthrough]]; case EShLangTessEvaluation: case EShLangGeometry: -#endif // !GLSLANG_WEB SpecialQualifier("gl_Position", EvqPosition, EbvPosition, symbolTable); SpecialQualifier("gl_PointSize", EvqPointSize, EbvPointSize, symbolTable); @@ -7944,7 +8161,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_out", "gl_Position", EbvPosition, symbolTable); BuiltInVariable("gl_out", "gl_PointSize", EbvPointSize, symbolTable); -#ifndef GLSLANG_WEB SpecialQualifier("gl_ClipVertex", EvqClipVertex, EbvClipVertex, symbolTable); BuiltInVariable("gl_in", "gl_ClipDistance", EbvClipDistance, symbolTable); @@ -8051,7 +8267,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); } - if (profile != EEsProfile) { + if (profile != EEsProfile) { BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable); BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable); BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable); @@ -8059,9 +8275,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -8094,6 +8313,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if (language == EShLangGeometry || language == EShLangVertex) { @@ -8108,8 +8340,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } } - -#endif // !GLSLANG_WEB break; case EShLangFragment: @@ -8126,8 +8356,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion } } SpecialQualifier("gl_FragDepth", EvqFragDepth, EbvFragDepth, symbolTable); -#ifndef GLSLANG_WEB SpecialQualifier("gl_FragDepthEXT", EvqFragDepth, EbvFragDepth, symbolTable); + SpecialQualifier("gl_FragStencilRefARB", EvqFragStencil, EbvFragStencilRef, symbolTable); SpecialQualifier("gl_HelperInvocation", EvqVaryingIn, EbvHelperInvocation, symbolTable); BuiltInVariable("gl_ClipDistance", EbvClipDistance, symbolTable); @@ -8140,7 +8370,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion } if (profile != EEsProfile && version < 400) { - symbolTable.setFunctionExtensions("textureQueryLod", 1, &E_GL_ARB_texture_query_lod); + symbolTable.setFunctionExtensions("textureQueryLOD", 1, &E_GL_ARB_texture_query_lod); } if (profile != EEsProfile && version >= 460) { @@ -8167,8 +8397,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("rayQueryGetIntersectionWorldToObjectEXT", 1, &E_GL_EXT_ray_query); symbolTable.setFunctionExtensions("rayQueryGetWorldRayOriginEXT", 1, &E_GL_EXT_ray_query); symbolTable.setFunctionExtensions("rayQueryGetWorldRayDirectionEXT", 1, &E_GL_EXT_ray_query); + symbolTable.setFunctionExtensions("rayQueryGetIntersectionTriangleVertexPositionsEXT", 1, &E_GL_EXT_ray_tracing_position_fetch); symbolTable.setVariableExtensions("gl_RayFlagsSkipAABBEXT", 1, &E_GL_EXT_ray_flags_primitive_culling); symbolTable.setVariableExtensions("gl_RayFlagsSkipTrianglesEXT", 1, &E_GL_EXT_ray_flags_primitive_culling); + symbolTable.setVariableExtensions("gl_RayFlagsForceOpacityMicromap2StateEXT", 1, &E_GL_EXT_opacity_micromap); } if ((profile != EEsProfile && version >= 130) || @@ -8388,6 +8620,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_BaryCoordNoPerspNV", 1, &E_GL_NV_fragment_shader_barycentric); BuiltInVariable("gl_BaryCoordNV", EbvBaryCoordNV, symbolTable); BuiltInVariable("gl_BaryCoordNoPerspNV", EbvBaryCoordNoPerspNV, symbolTable); + symbolTable.setVariableExtensions("gl_BaryCoordEXT", 1, &E_GL_EXT_fragment_shader_barycentric); + symbolTable.setVariableExtensions("gl_BaryCoordNoPerspEXT", 1, &E_GL_EXT_fragment_shader_barycentric); + BuiltInVariable("gl_BaryCoordEXT", EbvBaryCoordEXT, symbolTable); + BuiltInVariable("gl_BaryCoordNoPerspEXT", EbvBaryCoordNoPerspEXT, symbolTable); } if ((profile != EEsProfile && version >= 450) || @@ -8403,7 +8639,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("clockARB", 1, &E_GL_ARB_shader_clock); symbolTable.setFunctionExtensions("clock2x32ARB", 1, &E_GL_ARB_shader_clock); - symbolTable.setFunctionExtensions("clockRealtimeEXT", 1, &E_GL_EXT_shader_realtime_clock); + symbolTable.setFunctionExtensions("clockRealtimeEXT", 1, &E_GL_EXT_shader_realtime_clock); symbolTable.setFunctionExtensions("clockRealtime2x32EXT", 1, &E_GL_EXT_shader_realtime_clock); if (profile == EEsProfile && version < 320) { @@ -8423,10 +8659,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion } if (profile != EEsProfile && version < 330 ) { - symbolTable.setFunctionExtensions("floatBitsToInt", 1, &E_GL_ARB_shader_bit_encoding); - symbolTable.setFunctionExtensions("floatBitsToUint", 1, &E_GL_ARB_shader_bit_encoding); - symbolTable.setFunctionExtensions("intBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding); - symbolTable.setFunctionExtensions("uintBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding); + const char* bitsConvertExt[2] = {E_GL_ARB_shader_bit_encoding, E_GL_ARB_gpu_shader5}; + symbolTable.setFunctionExtensions("floatBitsToInt", 2, bitsConvertExt); + symbolTable.setFunctionExtensions("floatBitsToUint", 2, bitsConvertExt); + symbolTable.setFunctionExtensions("intBitsToFloat", 2, bitsConvertExt); + symbolTable.setFunctionExtensions("uintBitsToFloat", 2, bitsConvertExt); } if (profile != EEsProfile && version < 430 ) { @@ -8487,13 +8724,23 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } + // GL_EXT_expect_assume + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + symbolTable.setFunctionExtensions("assumeEXT", 1, &E_GL_EXT_expect_assume); + symbolTable.setFunctionExtensions("expectEXT", 1, &E_GL_EXT_expect_assume); + } + // GL_KHR_shader_subgroup if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 140)) { @@ -8535,6 +8782,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("subgroupShuffleXor", 1, &E_GL_KHR_shader_subgroup_shuffle); symbolTable.setFunctionExtensions("subgroupShuffleUp", 1, &E_GL_KHR_shader_subgroup_shuffle_relative); symbolTable.setFunctionExtensions("subgroupShuffleDown", 1, &E_GL_KHR_shader_subgroup_shuffle_relative); + symbolTable.setFunctionExtensions("subgroupRotate", 1, &E_GL_KHR_shader_subgroup_rotate); + symbolTable.setFunctionExtensions("subgroupClusteredRotate", 1, &E_GL_KHR_shader_subgroup_rotate); symbolTable.setFunctionExtensions("subgroupAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic); symbolTable.setFunctionExtensions("subgroupMul", 1, &E_GL_KHR_shader_subgroup_arithmetic); symbolTable.setFunctionExtensions("subgroupMin", 1, &E_GL_KHR_shader_subgroup_arithmetic); @@ -8599,6 +8848,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if (profile == EEsProfile) { @@ -8639,7 +8901,32 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } -#endif // !GLSLANG_WEB + + // GL_EXT_shader_quad_control + if ((profile != EEsProfile && version >= 140) || + (profile == EEsProfile && version >= 310)) { + symbolTable.setFunctionExtensions("subgroupQuadAll", 1, &E_GL_KHR_shader_subgroup_vote); + symbolTable.setFunctionExtensions("subgroupQuadAny", 1, &E_GL_KHR_shader_subgroup_vote); + } + + // GL_EXT_shader_tile_image + symbolTable.setFunctionExtensions("stencilAttachmentReadEXT", 1, &E_GL_EXT_shader_tile_image); + symbolTable.setFunctionExtensions("depthAttachmentReadEXT", 1, &E_GL_EXT_shader_tile_image); + symbolTable.setFunctionExtensions("colorAttachmentReadEXT", 1, &E_GL_EXT_shader_tile_image); + + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + + symbolTable.setFunctionExtensions("textureWeightedQCOM", 1, &E_GL_QCOM_image_processing); + symbolTable.setFunctionExtensions("textureBoxFilterQCOM", 1, &E_GL_QCOM_image_processing); + symbolTable.setFunctionExtensions("textureBlockMatchSADQCOM", 1, &E_GL_QCOM_image_processing); + symbolTable.setFunctionExtensions("textureBlockMatchSSDQCOM", 1, &E_GL_QCOM_image_processing); + + symbolTable.setFunctionExtensions("textureBlockMatchWindowSSDQCOM", 1, &E_GL_QCOM_image_processing2); + symbolTable.setFunctionExtensions("textureBlockMatchWindowSADQCOM", 1, &E_GL_QCOM_image_processing2); + symbolTable.setFunctionExtensions("textureBlockMatchGatherSSDQCOM", 1, &E_GL_QCOM_image_processing2); + symbolTable.setFunctionExtensions("textureBlockMatchGatherSADQCOM", 1, &E_GL_QCOM_image_processing2); + } break; case EShLangCompute: @@ -8652,7 +8939,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); -#ifndef GLSLANG_WEB if ((profile != EEsProfile && version >= 140) || (profile == EEsProfile && version >= 310)) { symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); @@ -8704,9 +8990,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -8739,6 +9028,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } // GL_KHR_shader_subgroup @@ -8760,6 +9062,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("coopMatMulAddNV", 2, coopExt); } + { + symbolTable.setFunctionExtensions("coopMatLoad", 1, &E_GL_KHR_cooperative_matrix); + symbolTable.setFunctionExtensions("coopMatStore", 1, &E_GL_KHR_cooperative_matrix); + symbolTable.setFunctionExtensions("coopMatMulAdd", 1, &E_GL_KHR_cooperative_matrix); + } + if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { symbolTable.setFunctionExtensions("dFdx", 1, &E_GL_NV_compute_shader_derivatives); symbolTable.setFunctionExtensions("dFdy", 1, &E_GL_NV_compute_shader_derivatives); @@ -8779,10 +9087,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } -#endif // !GLSLANG_WEB + + if ((profile != EEsProfile && version >= 460)) { + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexPositionNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexBarycentricNV", 1, &E_GL_NV_displacement_micromap); + } break; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) case EShLangRayGen: case EShLangIntersect: case EShLangAnyHit: @@ -8812,6 +9123,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_RayTminEXT", 1, &E_GL_EXT_ray_tracing); symbolTable.setVariableExtensions("gl_RayTmaxNV", 1, &E_GL_NV_ray_tracing); symbolTable.setVariableExtensions("gl_RayTmaxEXT", 1, &E_GL_EXT_ray_tracing); + symbolTable.setVariableExtensions("gl_CullMaskEXT", 1, &E_GL_EXT_ray_cull_mask); symbolTable.setVariableExtensions("gl_HitTNV", 1, &E_GL_NV_ray_tracing); symbolTable.setVariableExtensions("gl_HitTEXT", 1, &E_GL_EXT_ray_tracing); symbolTable.setVariableExtensions("gl_HitKindNV", 1, &E_GL_NV_ray_tracing); @@ -8825,6 +9137,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_IncomingRayFlagsNV", 1, &E_GL_NV_ray_tracing); symbolTable.setVariableExtensions("gl_IncomingRayFlagsEXT", 1, &E_GL_EXT_ray_tracing); symbolTable.setVariableExtensions("gl_CurrentRayTimeNV", 1, &E_GL_NV_ray_tracing_motion_blur); + symbolTable.setVariableExtensions("gl_HitTriangleVertexPositionsEXT", 1, &E_GL_EXT_ray_tracing_position_fetch); + symbolTable.setVariableExtensions("gl_HitMicroTriangleVertexPositionsNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setVariableExtensions("gl_HitMicroTriangleVertexBarycentricsNV", 1, &E_GL_NV_displacement_micromap); symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); @@ -8839,6 +9154,40 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("executeCallableNV", 1, &E_GL_NV_ray_tracing); symbolTable.setFunctionExtensions("executeCallableEXT", 1, &E_GL_EXT_ray_tracing); + symbolTable.setFunctionExtensions("hitObjectTraceRayNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectTraceRayMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitWithIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitWithIndexMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordMissNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordMissMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordEmptyNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectExecuteShaderNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectIsEmptyNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectIsMissNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectIsHitNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetRayTMinNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetRayTMaxNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetObjectRayOriginNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetObjectRayDirectionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetWorldRayOriginNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetWorldRayDirectionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetWorldToObjectNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetbjectToWorldNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetInstanceCustomIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetInstanceIdNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetGeometryIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetPrimitiveIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetHitKindNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetAttributesNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetCurrentTimeNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetShaderBindingTableRecordIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetShaderRecordBufferHandleNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("reorderThreadNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexPositionNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexBarycentricNV", 1, &E_GL_NV_displacement_micromap); + BuiltInVariable("gl_LaunchIDNV", EbvLaunchId, symbolTable); BuiltInVariable("gl_LaunchIDEXT", EbvLaunchId, symbolTable); @@ -8861,8 +9210,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_RayTminEXT", EbvRayTmin, symbolTable); BuiltInVariable("gl_RayTmaxNV", EbvRayTmax, symbolTable); BuiltInVariable("gl_RayTmaxEXT", EbvRayTmax, symbolTable); - BuiltInVariable("gl_HitTNV", EbvHitT, symbolTable); - BuiltInVariable("gl_HitTEXT", EbvHitT, symbolTable); + BuiltInVariable("gl_CullMaskEXT", EbvCullMask, symbolTable); BuiltInVariable("gl_HitKindNV", EbvHitKind, symbolTable); BuiltInVariable("gl_HitKindEXT", EbvHitKind, symbolTable); BuiltInVariable("gl_ObjectToWorldNV", EbvObjectToWorld, symbolTable); @@ -8875,6 +9223,15 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_IncomingRayFlagsEXT", EbvIncomingRayFlags, symbolTable); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); BuiltInVariable("gl_CurrentRayTimeNV", EbvCurrentRayTimeNV, symbolTable); + BuiltInVariable("gl_HitTriangleVertexPositionsEXT", EbvPositionFetch, symbolTable); + BuiltInVariable("gl_HitMicroTriangleVertexPositionsNV", EbvMicroTrianglePositionNV, symbolTable); + BuiltInVariable("gl_HitMicroTriangleVertexBarycentricsNV", EbvMicroTriangleBaryNV, symbolTable); + BuiltInVariable("gl_HitKindFrontFacingMicroTriangleNV", EbvHitKindFrontFacingMicroTriangleNV, symbolTable); + BuiltInVariable("gl_HitKindBackFacingMicroTriangleNV", EbvHitKindBackFacingMicroTriangleNV, symbolTable); + + // gl_HitT variables are aliases of their gl_RayTmax counterparts. + RetargetVariable("gl_HitTNV", "gl_RayTmaxNV", symbolTable); + RetargetVariable("gl_HitTEXT", "gl_RayTmaxEXT", symbolTable); // GL_ARB_shader_ballot symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot); @@ -8892,9 +9249,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); @@ -8928,6 +9288,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 450)) { @@ -8938,7 +9311,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion } break; - case EShLangMeshNV: + case EShLangMesh: if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { // per-vertex builtins symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_Position", 1, &E_GL_NV_mesh_shader); @@ -8982,12 +9355,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_PrimitiveIndicesNV", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_MeshViewCountNV", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_MeshViewIndicesNV", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_LocalInvocationID", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_GlobalInvocationID", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader); - + if (profile != EEsProfile) { + symbolTable.setVariableExtensions("gl_WorkGroupSize", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_WorkGroupID", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationID", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_GlobalInvocationID", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationIndex", Num_AEP_mesh_shader, AEP_mesh_shader); + } else { + symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationID", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_GlobalInvocationID", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader); + } BuiltInVariable("gl_PrimitiveCountNV", EbvPrimitiveCountNV, symbolTable); BuiltInVariable("gl_PrimitiveIndicesNV", EbvPrimitiveIndicesNV, symbolTable); BuiltInVariable("gl_MeshViewCountNV", EbvMeshViewCountNV, symbolTable); @@ -9005,12 +9385,58 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_MaxMeshViewCountNV", 1, &E_GL_NV_mesh_shader); // builtin functions - symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader); - symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader); - symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader); + if (profile != EEsProfile) { + symbolTable.setFunctionExtensions("barrier", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setFunctionExtensions("memoryBarrierShared", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setFunctionExtensions("groupMemoryBarrier", Num_AEP_mesh_shader, AEP_mesh_shader); + } else { + symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader); + symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader); + symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader); + } + symbolTable.setFunctionExtensions("writePackedPrimitiveIndices4x8NV", 1, &E_GL_NV_mesh_shader); } if (profile != EEsProfile && version >= 450) { + // GL_EXT_Mesh_shader + symbolTable.setVariableExtensions("gl_PrimitivePointIndicesEXT", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_PrimitiveLineIndicesEXT", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_PrimitiveTriangleIndicesEXT", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_NumWorkGroups", 1, &E_GL_EXT_mesh_shader); + + BuiltInVariable("gl_PrimitivePointIndicesEXT", EbvPrimitivePointIndicesEXT, symbolTable); + BuiltInVariable("gl_PrimitiveLineIndicesEXT", EbvPrimitiveLineIndicesEXT, symbolTable); + BuiltInVariable("gl_PrimitiveTriangleIndicesEXT", EbvPrimitiveTriangleIndicesEXT, symbolTable); + BuiltInVariable("gl_NumWorkGroups", EbvNumWorkGroups, symbolTable); + + symbolTable.setVariableExtensions("gl_MeshVerticesEXT", "gl_Position", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_MeshVerticesEXT", "gl_PointSize", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_MeshVerticesEXT", "gl_ClipDistance", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_MeshVerticesEXT", "gl_CullDistance", 1, &E_GL_EXT_mesh_shader); + + BuiltInVariable("gl_MeshVerticesEXT", "gl_Position", EbvPosition, symbolTable); + BuiltInVariable("gl_MeshVerticesEXT", "gl_PointSize", EbvPointSize, symbolTable); + BuiltInVariable("gl_MeshVerticesEXT", "gl_ClipDistance", EbvClipDistance, symbolTable); + BuiltInVariable("gl_MeshVerticesEXT", "gl_CullDistance", EbvCullDistance, symbolTable); + + symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_PrimitiveID", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_Layer", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_ViewportIndex", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_CullPrimitiveEXT", 1, &E_GL_EXT_mesh_shader); + + // note: technically this member requires both GL_EXT_mesh_shader and GL_EXT_fragment_shading_rate + // since setVariableExtensions only needs *one of* the extensions to validate, it's more useful to specify EXT_fragment_shading_rate + // GL_EXT_mesh_shader will be required in practice by use of other fields of gl_MeshPrimitivesEXT + symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_PrimitiveShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate); + + BuiltInVariable("gl_MeshPrimitivesEXT", "gl_PrimitiveID", EbvPrimitiveId, symbolTable); + BuiltInVariable("gl_MeshPrimitivesEXT", "gl_Layer", EbvLayer, symbolTable); + BuiltInVariable("gl_MeshPrimitivesEXT", "gl_ViewportIndex", EbvViewportIndex, symbolTable); + BuiltInVariable("gl_MeshPrimitivesEXT", "gl_CullPrimitiveEXT", EbvCullPrimitiveEXT, symbolTable); + BuiltInVariable("gl_MeshPrimitivesEXT", "gl_PrimitiveShadingRateEXT", EbvPrimitiveShadingRateKHR, symbolTable); + + symbolTable.setFunctionExtensions("SetMeshOutputsEXT", 1, &E_GL_EXT_mesh_shader); + // GL_EXT_device_group symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); @@ -9021,6 +9447,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion if (version >= 460) { BuiltInVariable("gl_DrawID", EbvDrawId, symbolTable); } + // GL_EXT_multiview + BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); + symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview); // GL_ARB_shader_ballot symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot); @@ -9038,9 +9467,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -9079,6 +9511,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if ((profile == EEsProfile && version >= 310) || @@ -9088,18 +9533,33 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } + + // Builtins for GL_NV_displacment_micromap + if ((profile != EEsProfile && version >= 460)) { + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexPositionNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexBarycentricNV", 1, &E_GL_NV_displacement_micromap); + } + break; - case EShLangTaskNV: + case EShLangTask: if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { symbolTable.setVariableExtensions("gl_TaskCountNV", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_LocalInvocationID", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_GlobalInvocationID", 1, &E_GL_NV_mesh_shader); - symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_MeshViewCountNV", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_MeshViewIndicesNV", 1, &E_GL_NV_mesh_shader); + if (profile != EEsProfile) { + symbolTable.setVariableExtensions("gl_WorkGroupSize", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_WorkGroupID", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationID", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_GlobalInvocationID", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationIndex", Num_AEP_mesh_shader, AEP_mesh_shader); + } else { + symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationID", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_GlobalInvocationID", 1, &E_GL_NV_mesh_shader); + symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader); + } BuiltInVariable("gl_TaskCountNV", EbvTaskCountNV, symbolTable); BuiltInVariable("gl_WorkGroupSize", EbvWorkGroupSize, symbolTable); @@ -9113,12 +9573,23 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_MaxTaskWorkGroupSizeNV", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_MaxMeshViewCountNV", 1, &E_GL_NV_mesh_shader); - symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader); - symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader); - symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader); + if (profile != EEsProfile) { + symbolTable.setFunctionExtensions("barrier", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setFunctionExtensions("memoryBarrierShared", Num_AEP_mesh_shader, AEP_mesh_shader); + symbolTable.setFunctionExtensions("groupMemoryBarrier", Num_AEP_mesh_shader, AEP_mesh_shader); + } else { + symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader); + symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader); + symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader); + } } if (profile != EEsProfile && version >= 450) { + // GL_EXT_mesh_shader + symbolTable.setFunctionExtensions("EmitMeshTasksEXT", 1, &E_GL_EXT_mesh_shader); + symbolTable.setVariableExtensions("gl_NumWorkGroups", 1, &E_GL_EXT_mesh_shader); + BuiltInVariable("gl_NumWorkGroups", EbvNumWorkGroups, symbolTable); + // GL_EXT_device_group symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); @@ -9146,9 +9617,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -9187,6 +9661,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 450)) { @@ -9196,7 +9683,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } break; -#endif default: assert(false && "Language not supported"); @@ -9212,7 +9698,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion relateTabledBuiltins(version, profile, spvVersion, language, symbolTable); -#ifndef GLSLANG_WEB symbolTable.relateToOperator("doubleBitsToInt64", EOpDoubleBitsToInt64); symbolTable.relateToOperator("doubleBitsToUint64", EOpDoubleBitsToUint64); symbolTable.relateToOperator("int64BitsToDouble", EOpInt64BitsToDouble); @@ -9365,6 +9850,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("averageRounded", EOpAverageRounded); symbolTable.relateToOperator("multiply32x16", EOpMul32x16); symbolTable.relateToOperator("debugPrintfEXT", EOpDebugPrintf); + symbolTable.relateToOperator("assumeEXT", EOpAssumeEXT); + symbolTable.relateToOperator("expectEXT", EOpExpectEXT); if (PureOperatorBuiltins) { @@ -9568,6 +10055,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("subgroupShuffleXor", EOpSubgroupShuffleXor); symbolTable.relateToOperator("subgroupShuffleUp", EOpSubgroupShuffleUp); symbolTable.relateToOperator("subgroupShuffleDown", EOpSubgroupShuffleDown); + symbolTable.relateToOperator("subgroupRotate", EOpSubgroupRotate); + symbolTable.relateToOperator("subgroupClusteredRotate", EOpSubgroupClusteredRotate); symbolTable.relateToOperator("subgroupAdd", EOpSubgroupAdd); symbolTable.relateToOperator("subgroupMul", EOpSubgroupMul); symbolTable.relateToOperator("subgroupMin", EOpSubgroupMin); @@ -9629,6 +10118,37 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("shadow2DEXT", EOpTexture); symbolTable.relateToOperator("shadow2DProjEXT", EOpTextureProj); } + + // GL_EXT_shader_quad_control + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + symbolTable.relateToOperator("subgroupQuadAll", EOpSubgroupQuadAll); + symbolTable.relateToOperator("subgroupQuadAny", EOpSubgroupQuadAny); + } + + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + symbolTable.relateToOperator("textureWeightedQCOM", EOpImageSampleWeightedQCOM); + symbolTable.relateToOperator("textureBoxFilterQCOM", EOpImageBoxFilterQCOM); + symbolTable.relateToOperator("textureBlockMatchSADQCOM", EOpImageBlockMatchSADQCOM); + symbolTable.relateToOperator("textureBlockMatchSSDQCOM", EOpImageBlockMatchSSDQCOM); + + symbolTable.relateToOperator("textureBlockMatchWindowSSDQCOM", EOpImageBlockMatchWindowSSDQCOM); + symbolTable.relateToOperator("textureBlockMatchWindowSADQCOM", EOpImageBlockMatchWindowSADQCOM); + symbolTable.relateToOperator("textureBlockMatchGatherSSDQCOM", EOpImageBlockMatchGatherSSDQCOM); + symbolTable.relateToOperator("textureBlockMatchGatherSADQCOM", EOpImageBlockMatchGatherSADQCOM); + } + + if (profile != EEsProfile && spvVersion.spv == 0) { + symbolTable.relateToOperator("texture1DArray", EOpTexture); + symbolTable.relateToOperator("texture2DArray", EOpTexture); + symbolTable.relateToOperator("shadow1DArray", EOpTexture); + symbolTable.relateToOperator("shadow2DArray", EOpTexture); + + symbolTable.relateToOperator("texture1DArrayLod", EOpTextureLod); + symbolTable.relateToOperator("texture2DArrayLod", EOpTextureLod); + symbolTable.relateToOperator("shadow1DArrayLod", EOpTextureLod); + } } switch(language) { @@ -9680,6 +10200,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("rayQueryGetWorldRayOriginEXT", EOpRayQueryGetWorldRayOrigin); symbolTable.relateToOperator("rayQueryGetIntersectionObjectToWorldEXT", EOpRayQueryGetIntersectionObjectToWorld); symbolTable.relateToOperator("rayQueryGetIntersectionWorldToObjectEXT", EOpRayQueryGetIntersectionWorldToObject); + symbolTable.relateToOperator("rayQueryGetIntersectionTriangleVertexPositionsEXT", EOpRayQueryGetIntersectionTriangleVertexPositionsEXT); } symbolTable.relateToOperator("interpolateAtCentroid", EOpInterpolateAtCentroid); @@ -9692,6 +10213,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("beginInvocationInterlockARB", EOpBeginInvocationInterlock); symbolTable.relateToOperator("endInvocationInterlockARB", EOpEndInvocationInterlock); + symbolTable.relateToOperator("stencilAttachmentReadEXT", EOpStencilAttachmentReadEXT); + symbolTable.relateToOperator("depthAttachmentReadEXT", EOpDepthAttachmentReadEXT); + symbolTable.relateToOperator("colorAttachmentReadEXT", EOpColorAttachmentReadEXT); + break; case EShLangCompute: @@ -9708,12 +10233,26 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("dFdyCoarse", EOpDPdyCoarse); symbolTable.relateToOperator("fwidthCoarse",EOpFwidthCoarse); } - symbolTable.relateToOperator("coopMatLoadNV", EOpCooperativeMatrixLoad); - symbolTable.relateToOperator("coopMatStoreNV", EOpCooperativeMatrixStore); - symbolTable.relateToOperator("coopMatMulAddNV", EOpCooperativeMatrixMulAdd); + symbolTable.relateToOperator("coopMatLoadNV", EOpCooperativeMatrixLoadNV); + symbolTable.relateToOperator("coopMatStoreNV", EOpCooperativeMatrixStoreNV); + symbolTable.relateToOperator("coopMatMulAddNV", EOpCooperativeMatrixMulAddNV); + + symbolTable.relateToOperator("coopMatLoad", EOpCooperativeMatrixLoad); + symbolTable.relateToOperator("coopMatStore", EOpCooperativeMatrixStore); + symbolTable.relateToOperator("coopMatMulAdd", EOpCooperativeMatrixMulAdd); + + if (profile != EEsProfile && version >= 460) { + symbolTable.relateToOperator("fetchMicroTriangleVertexPositionNV", EOpFetchMicroTriangleVertexPositionNV); + symbolTable.relateToOperator("fetchMicroTriangleVertexBarycentricNV", EOpFetchMicroTriangleVertexBarycentricNV); + } break; case EShLangRayGen: + if (profile != EEsProfile && version >= 460) { + symbolTable.relateToOperator("fetchMicroTriangleVertexPositionNV", EOpFetchMicroTriangleVertexPositionNV); + symbolTable.relateToOperator("fetchMicroTriangleVertexBarycentricNV", EOpFetchMicroTriangleVertexBarycentricNV); + } + [[fallthrough]]; case EShLangClosestHit: case EShLangMiss: if (profile != EEsProfile && version >= 460) { @@ -9722,13 +10261,45 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("traceRayEXT", EOpTraceKHR); symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV); symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR); + + symbolTable.relateToOperator("hitObjectTraceRayNV", EOpHitObjectTraceRayNV); + symbolTable.relateToOperator("hitObjectTraceRayMotionNV", EOpHitObjectTraceRayMotionNV); + symbolTable.relateToOperator("hitObjectRecordHitNV", EOpHitObjectRecordHitNV); + symbolTable.relateToOperator("hitObjectRecordHitMotionNV", EOpHitObjectRecordHitMotionNV); + symbolTable.relateToOperator("hitObjectRecordHitWithIndexNV", EOpHitObjectRecordHitWithIndexNV); + symbolTable.relateToOperator("hitObjectRecordHitWithIndexMotionNV", EOpHitObjectRecordHitWithIndexMotionNV); + symbolTable.relateToOperator("hitObjectRecordMissNV", EOpHitObjectRecordMissNV); + symbolTable.relateToOperator("hitObjectRecordMissMotionNV", EOpHitObjectRecordMissMotionNV); + symbolTable.relateToOperator("hitObjectRecordEmptyNV", EOpHitObjectRecordEmptyNV); + symbolTable.relateToOperator("hitObjectExecuteShaderNV", EOpHitObjectExecuteShaderNV); + symbolTable.relateToOperator("hitObjectIsEmptyNV", EOpHitObjectIsEmptyNV); + symbolTable.relateToOperator("hitObjectIsMissNV", EOpHitObjectIsMissNV); + symbolTable.relateToOperator("hitObjectIsHitNV", EOpHitObjectIsHitNV); + symbolTable.relateToOperator("hitObjectGetRayTMinNV", EOpHitObjectGetRayTMinNV); + symbolTable.relateToOperator("hitObjectGetRayTMaxNV", EOpHitObjectGetRayTMaxNV); + symbolTable.relateToOperator("hitObjectGetObjectRayOriginNV", EOpHitObjectGetObjectRayOriginNV); + symbolTable.relateToOperator("hitObjectGetObjectRayDirectionNV", EOpHitObjectGetObjectRayDirectionNV); + symbolTable.relateToOperator("hitObjectGetWorldRayOriginNV", EOpHitObjectGetWorldRayOriginNV); + symbolTable.relateToOperator("hitObjectGetWorldRayDirectionNV", EOpHitObjectGetWorldRayDirectionNV); + symbolTable.relateToOperator("hitObjectGetWorldToObjectNV", EOpHitObjectGetWorldToObjectNV); + symbolTable.relateToOperator("hitObjectGetObjectToWorldNV", EOpHitObjectGetObjectToWorldNV); + symbolTable.relateToOperator("hitObjectGetInstanceCustomIndexNV", EOpHitObjectGetInstanceCustomIndexNV); + symbolTable.relateToOperator("hitObjectGetInstanceIdNV", EOpHitObjectGetInstanceIdNV); + symbolTable.relateToOperator("hitObjectGetGeometryIndexNV", EOpHitObjectGetGeometryIndexNV); + symbolTable.relateToOperator("hitObjectGetPrimitiveIndexNV", EOpHitObjectGetPrimitiveIndexNV); + symbolTable.relateToOperator("hitObjectGetHitKindNV", EOpHitObjectGetHitKindNV); + symbolTable.relateToOperator("hitObjectGetAttributesNV", EOpHitObjectGetAttributesNV); + symbolTable.relateToOperator("hitObjectGetCurrentTimeNV", EOpHitObjectGetCurrentTimeNV); + symbolTable.relateToOperator("hitObjectGetShaderBindingTableRecordIndexNV", EOpHitObjectGetShaderBindingTableRecordIndexNV); + symbolTable.relateToOperator("hitObjectGetShaderRecordBufferHandleNV", EOpHitObjectGetShaderRecordBufferHandleNV); + symbolTable.relateToOperator("reorderThreadNV", EOpReorderThreadNV); } break; case EShLangIntersect: if (profile != EEsProfile && version >= 460) { symbolTable.relateToOperator("reportIntersectionNV", EOpReportIntersection); symbolTable.relateToOperator("reportIntersectionEXT", EOpReportIntersection); - } + } break; case EShLangAnyHit: if (profile != EEsProfile && version >= 460) { @@ -9742,23 +10313,38 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR); } break; - case EShLangMeshNV: + case EShLangMesh: if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { symbolTable.relateToOperator("writePackedPrimitiveIndices4x8NV", EOpWritePackedPrimitiveIndices4x8NV); + symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared); + symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier); + symbolTable.relateToOperator("subgroupMemoryBarrierShared", EOpSubgroupMemoryBarrierShared); } - // fall through - case EShLangTaskNV: + + if (profile != EEsProfile && version >= 450) { + symbolTable.relateToOperator("SetMeshOutputsEXT", EOpSetMeshOutputsEXT); + } + + if (profile != EEsProfile && version >= 460) { + // Builtins for GL_NV_displacement_micromap. + symbolTable.relateToOperator("fetchMicroTriangleVertexPositionNV", EOpFetchMicroTriangleVertexPositionNV); + symbolTable.relateToOperator("fetchMicroTriangleVertexBarycentricNV", EOpFetchMicroTriangleVertexBarycentricNV); + } + break; + case EShLangTask: if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared); symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier); symbolTable.relateToOperator("subgroupMemoryBarrierShared", EOpSubgroupMemoryBarrierShared); } + if (profile != EEsProfile && version >= 450) { + symbolTable.relateToOperator("EmitMeshTasksEXT", EOpEmitMeshTasksEXT); + } break; default: assert(false && "Language not supported"); } -#endif // !GLSLANG_WEB } // @@ -9772,11 +10358,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion // void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) { -#ifndef GLSLANG_WEB -#if defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif if (profile != EEsProfile && version >= 430 && version < 440) { symbolTable.setVariableExtensions("gl_MaxTransformFeedbackBuffers", 1, &E_GL_ARB_enhanced_layouts); symbolTable.setVariableExtensions("gl_MaxTransformFeedbackInterleavedComponents", 1, &E_GL_ARB_enhanced_layouts); @@ -9848,7 +10429,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion default: break; } -#endif } } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.h index ac8ec33e9..42c32ddbb 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Initialize.h @@ -107,6 +107,9 @@ protected: int dimMap[EsdNumDims]; }; +// change this back to false if depending on textual spellings of texturing calls when consuming the AST +// Using PureOperatorBuiltins=false is deprecated. +constexpr bool PureOperatorBuiltins = true; } // end namespace glslang #endif // _INITIALIZE_INCLUDED_ diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Intermediate.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Intermediate.cpp index 027844596..63e176e3a 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Intermediate.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Intermediate.cpp @@ -352,7 +352,7 @@ TIntermTyped* TIntermediate::addIndex(TOperator op, TIntermTyped* base, TIntermT TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, const TSourceLoc& loc) { - if (child == 0) + if (child == nullptr) return nullptr; if (child->getType().getBasicType() == EbtBlock) @@ -376,6 +376,7 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, case EOpNegative: if (child->getType().getBasicType() == EbtStruct || child->getType().isArray()) return nullptr; + break; default: break; // some compilers want this } @@ -388,7 +389,6 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, case EOpConstructFloat: newType = EbtFloat; break; case EOpConstructInt: newType = EbtInt; break; case EOpConstructUint: newType = EbtUint; break; -#ifndef GLSLANG_WEB case EOpConstructInt8: newType = EbtInt8; break; case EOpConstructUint8: newType = EbtUint8; break; case EOpConstructInt16: newType = EbtInt16; break; @@ -397,7 +397,6 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, case EOpConstructUint64: newType = EbtUint64; break; case EOpConstructDouble: newType = EbtDouble; break; case EOpConstructFloat16: newType = EbtFloat16; break; -#endif default: break; // some compilers want this } @@ -416,20 +415,24 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, // TODO: but, did this bypass constant folding? // switch (op) { - case EOpConstructInt8: - case EOpConstructUint8: - case EOpConstructInt16: - case EOpConstructUint16: - case EOpConstructInt: - case EOpConstructUint: - case EOpConstructInt64: - case EOpConstructUint64: - case EOpConstructBool: - case EOpConstructFloat: - case EOpConstructDouble: - case EOpConstructFloat16: - return child; - default: break; // some compilers want this + case EOpConstructInt8: + case EOpConstructUint8: + case EOpConstructInt16: + case EOpConstructUint16: + case EOpConstructInt: + case EOpConstructUint: + case EOpConstructInt64: + case EOpConstructUint64: + case EOpConstructBool: + case EOpConstructFloat: + case EOpConstructDouble: + case EOpConstructFloat16: { + TIntermUnary* unary_node = child->getAsUnaryNode(); + if (unary_node != nullptr) + unary_node->updatePrecision(); + return child; + } + default: break; // some compilers want this } // @@ -565,7 +568,6 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& newOp) const { switch (dst) { -#ifndef GLSLANG_WEB case EbtDouble: switch (src) { case EbtUint: newOp = EOpConvUintToDouble; break; @@ -583,13 +585,11 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif case EbtFloat: switch (src) { case EbtInt: newOp = EOpConvIntToFloat; break; case EbtUint: newOp = EOpConvUintToFloat; break; case EbtBool: newOp = EOpConvBoolToFloat; break; -#ifndef GLSLANG_WEB case EbtDouble: newOp = EOpConvDoubleToFloat; break; case EbtInt8: newOp = EOpConvInt8ToFloat; break; case EbtUint8: newOp = EOpConvUint8ToFloat; break; @@ -598,12 +598,10 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToFloat; break; case EbtInt64: newOp = EOpConvInt64ToFloat; break; case EbtUint64: newOp = EOpConvUint64ToFloat; break; -#endif default: return false; } break; -#ifndef GLSLANG_WEB case EbtFloat16: switch (src) { case EbtInt8: newOp = EOpConvInt8ToFloat16; break; @@ -621,13 +619,11 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif case EbtBool: switch (src) { case EbtInt: newOp = EOpConvIntToBool; break; case EbtUint: newOp = EOpConvUintToBool; break; case EbtFloat: newOp = EOpConvFloatToBool; break; -#ifndef GLSLANG_WEB case EbtDouble: newOp = EOpConvDoubleToBool; break; case EbtInt8: newOp = EOpConvInt8ToBool; break; case EbtUint8: newOp = EOpConvUint8ToBool; break; @@ -636,12 +632,10 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToBool; break; case EbtInt64: newOp = EOpConvInt64ToBool; break; case EbtUint64: newOp = EOpConvUint64ToBool; break; -#endif default: return false; } break; -#ifndef GLSLANG_WEB case EbtInt8: switch (src) { case EbtUint8: newOp = EOpConvUint8ToInt8; break; @@ -711,14 +705,12 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif case EbtInt: switch (src) { case EbtUint: newOp = EOpConvUintToInt; break; case EbtBool: newOp = EOpConvBoolToInt; break; case EbtFloat: newOp = EOpConvFloatToInt; break; -#ifndef GLSLANG_WEB case EbtInt8: newOp = EOpConvInt8ToInt; break; case EbtUint8: newOp = EOpConvUint8ToInt; break; case EbtInt16: newOp = EOpConvInt16ToInt; break; @@ -727,7 +719,6 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToInt; break; case EbtInt64: newOp = EOpConvInt64ToInt; break; case EbtUint64: newOp = EOpConvUint64ToInt; break; -#endif default: return false; } @@ -737,7 +728,6 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtInt: newOp = EOpConvIntToUint; break; case EbtBool: newOp = EOpConvBoolToUint; break; case EbtFloat: newOp = EOpConvFloatToUint; break; -#ifndef GLSLANG_WEB case EbtInt8: newOp = EOpConvInt8ToUint; break; case EbtUint8: newOp = EOpConvUint8ToUint; break; case EbtInt16: newOp = EOpConvInt16ToUint; break; @@ -746,12 +736,15 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToUint; break; case EbtInt64: newOp = EOpConvInt64ToUint; break; case EbtUint64: newOp = EOpConvUint64ToUint; break; -#endif + // For bindless texture type conversion, add a dummy convert op, just + // to generate a new TIntermTyped + // uvec2(any sampler type) + // uvec2(any image type) + case EbtSampler: newOp = EOpConvIntToUint; break; default: return false; } break; -#ifndef GLSLANG_WEB case EbtInt64: switch (src) { case EbtInt8: newOp = EOpConvInt8ToInt64; break; @@ -786,7 +779,6 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif default: return false; } @@ -802,7 +794,6 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped // Add a new newNode for the conversion. // -#ifndef GLSLANG_WEB bool convertToIntTypes = (convertTo == EbtInt8 || convertTo == EbtUint8 || convertTo == EbtInt16 || convertTo == EbtUint16 || convertTo == EbtInt || convertTo == EbtUint || @@ -839,7 +830,6 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped return nullptr; } } -#endif TIntermUnary* newNode = nullptr; TOperator newOp = EOpNull; @@ -851,13 +841,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped newNode = addUnaryNode(newOp, node, node->getLoc(), newType); if (node->getAsConstantUnion()) { -#ifndef GLSLANG_WEB // 8/16-bit storage extensions don't support 8/16-bit constants, so don't fold conversions // to those types if ((getArithemeticInt8Enabled() || !(convertTo == EbtInt8 || convertTo == EbtUint8)) && (getArithemeticInt16Enabled() || !(convertTo == EbtInt16 || convertTo == EbtUint16)) && (getArithemeticFloat16Enabled() || !(convertTo == EbtFloat16))) -#endif { TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType); if (folded) @@ -1040,6 +1028,12 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt if (type.isArray() || node->getType().isArray()) return nullptr; + // Reject implicit conversions to cooperative matrix types + if (node->getType().isCoopMat() && + op != EOpConstructCooperativeMatrixNV && + op != EOpConstructCooperativeMatrixKHR) + return nullptr; + // Note: callers are responsible for other aspects of shape, // like vector and matrix sizes. @@ -1051,7 +1045,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt case EOpConstructFloat: case EOpConstructInt: case EOpConstructUint: -#ifndef GLSLANG_WEB case EOpConstructDouble: case EOpConstructFloat16: case EOpConstructInt8: @@ -1062,8 +1055,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt case EOpConstructUint64: break; -#endif - // // Implicit conversions // @@ -1108,7 +1099,8 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt case EOpSequence: case EOpConstructStruct: - case EOpConstructCooperativeMatrix: + case EOpConstructCooperativeMatrixNV: + case EOpConstructCooperativeMatrixKHR: if (type.isReference() || node->getType().isReference()) { // types must match to assign a reference @@ -1150,7 +1142,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt } bool canPromoteConstant = true; -#ifndef GLSLANG_WEB // GL_EXT_shader_16bit_storage can't do OpConstantComposite with // 16-bit types, so disable promotion for those types. // Many issues with this, from JohnK: @@ -1178,7 +1169,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt default: break; } -#endif if (canPromoteConstant && node->getAsConstantUnion()) return promoteConstantUnion(type.getBasicType(), node->getAsConstantUnion()); @@ -1288,6 +1278,7 @@ void TIntermediate::addBiShapeConversion(TOperator op, TIntermTyped*& lhsNode, T // matrix multiply does not change shapes if (lhsNode->isMatrix() && rhsNode->isMatrix()) return; + [[fallthrough]]; case EOpAdd: case EOpSub: case EOpDiv: @@ -1475,10 +1466,6 @@ bool TIntermediate::isFPPromotion(TBasicType from, TBasicType to) const bool TIntermediate::isIntegralConversion(TBasicType from, TBasicType to) const { -#ifdef GLSLANG_WEB - return false; -#endif - switch (from) { case EbtInt: switch(to) { @@ -1559,10 +1546,6 @@ bool TIntermediate::isIntegralConversion(TBasicType from, TBasicType to) const bool TIntermediate::isFPConversion(TBasicType from, TBasicType to) const { -#ifdef GLSLANG_WEB - return false; -#endif - if (to == EbtFloat && from == EbtFloat16) { return true; } else { @@ -1583,7 +1566,6 @@ bool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const break; } break; -#ifndef GLSLANG_WEB case EbtInt8: case EbtUint8: case EbtInt16: @@ -1603,7 +1585,6 @@ bool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const return true; } break; -#endif default: break; } @@ -1805,10 +1786,6 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat static bool canSignedIntTypeRepresentAllUnsignedValues(TBasicType sintType, TBasicType uintType) { -#ifdef GLSLANG_WEB - return false; -#endif - switch(sintType) { case EbtInt8: switch(uintType) { @@ -1869,11 +1846,6 @@ static bool canSignedIntTypeRepresentAllUnsignedValues(TBasicType sintType, TBas static TBasicType getCorrespondingUnsignedType(TBasicType type) { -#ifdef GLSLANG_WEB - assert(type == EbtInt); - return EbtUint; -#endif - switch(type) { case EbtInt8: return EbtUint8; @@ -1999,8 +1971,11 @@ TOperator TIntermediate::mapTypeToConstructorOp(const TType& type) const if (type.getQualifier().isNonUniform()) return EOpConstructNonuniform; - if (type.isCoopMat()) - return EOpConstructCooperativeMatrix; + if (type.isCoopMatNV()) + return EOpConstructCooperativeMatrixNV; + + if (type.isCoopMatKHR()) + return EOpConstructCooperativeMatrixKHR; switch (type.getBasicType()) { case EbtStruct: @@ -2163,7 +2138,6 @@ TOperator TIntermediate::mapTypeToConstructorOp(const TType& type) const } } break; -#ifndef GLSLANG_WEB case EbtDouble: if (type.getMatrixCols()) { switch (type.getMatrixCols()) { @@ -2302,7 +2276,6 @@ TOperator TIntermediate::mapTypeToConstructorOp(const TType& type) const case EbtAccStruct: op = EOpConstructAccStruct; break; -#endif default: break; } @@ -2346,6 +2319,40 @@ TIntermAggregate* TIntermediate::growAggregate(TIntermNode* left, TIntermNode* r return aggNode; } +TIntermAggregate* TIntermediate::mergeAggregate(TIntermNode* left, TIntermNode* right) +{ + if (left == nullptr && right == nullptr) + return nullptr; + + TIntermAggregate* aggNode = nullptr; + if (left != nullptr) + aggNode = left->getAsAggregate(); + if (aggNode == nullptr || aggNode->getOp() != EOpNull) { + aggNode = new TIntermAggregate; + if (left != nullptr) + aggNode->getSequence().push_back(left); + } + + TIntermAggregate* rhsagg = right->getAsAggregate(); + if (rhsagg == nullptr || rhsagg->getOp() != EOpNull) + aggNode->getSequence().push_back(right); + else + aggNode->getSequence().insert(aggNode->getSequence().end(), + rhsagg->getSequence().begin(), + rhsagg->getSequence().end()); + + return aggNode; +} + +TIntermAggregate* TIntermediate::mergeAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc& loc) +{ + TIntermAggregate* aggNode = mergeAggregate(left, right); + if (aggNode) + aggNode->setLoc(loc); + + return aggNode; +} + // // Turn an existing node into an aggregate. // @@ -2619,6 +2626,18 @@ TIntermConstantUnion* TIntermediate::addConstantUnion(double d, TBasicType baseT { assert(baseType == EbtFloat || baseType == EbtDouble || baseType == EbtFloat16); + if (isEsProfile() && (baseType == EbtFloat || baseType == EbtFloat16)) { + int exponent = 0; + frexp(d, &exponent); + int minExp = baseType == EbtFloat ? -126 : -14; + int maxExp = baseType == EbtFloat ? 127 : 15; + if (exponent > maxExp) { //overflow, d = inf + d = std::numeric_limits::infinity(); + } else if (exponent < minExp) { //underflow, d = 0.0; + d = 0.0; + } + } + TConstUnionArray unionArray(1); unionArray[0].setDConst(d); @@ -2676,28 +2695,42 @@ TIntermTyped* TIntermediate::addSwizzle(TSwizzleSelectors& selecto // 'swizzleOkay' says whether or not it is okay to consider a swizzle // a valid part of the dereference chain. // -// 'BufferReferenceOk' says if type is buffer_reference, the routine stop to find the most left node. +// 'bufferReferenceOk' says if type is buffer_reference, the routine will stop to find the most left node. // +// 'proc' is an optional function to run on each node that is processed during the traversal. 'proc' must +// return true to continue the traversal, or false to end the traversal early. // -const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool swizzleOkay , bool bufferReferenceOk) +const TIntermTyped* TIntermediate::traverseLValueBase(const TIntermTyped* node, bool swizzleOkay, + bool bufferReferenceOk, + std::function proc) { do { const TIntermBinary* binary = node->getAsBinaryNode(); - if (binary == nullptr) + if (binary == nullptr) { + if (proc) { + proc(*node); + } return node; + } TOperator op = binary->getOp(); - if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct && op != EOpVectorSwizzle && op != EOpMatrixSwizzle) + if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct && op != EOpVectorSwizzle && + op != EOpMatrixSwizzle) return nullptr; - if (! swizzleOkay) { + if (!swizzleOkay) { if (op == EOpVectorSwizzle || op == EOpMatrixSwizzle) return nullptr; if ((op == EOpIndexDirect || op == EOpIndexIndirect) && (binary->getLeft()->getType().isVector() || binary->getLeft()->getType().isScalar()) && - ! binary->getLeft()->getType().isArray()) + !binary->getLeft()->getType().isArray()) return nullptr; } - node = node->getAsBinaryNode()->getLeft(); + if (proc) { + if (!proc(*node)) { + return node; + } + } + node = binary->getLeft(); if (bufferReferenceOk && node->isReference()) return node; } while (true); @@ -2729,10 +2762,10 @@ TIntermAggregate* TIntermediate::addForLoop(TIntermNode* body, TIntermNode* init TIntermAggregate* loopSequence = (initializer == nullptr || initializer->getAsAggregate() == nullptr) ? makeAggregate(initializer, loc) : initializer->getAsAggregate(); - if (loopSequence != nullptr && loopSequence->getOp() == EOpSequence) + if (loopSequence != nullptr && (loopSequence->getOp() == EOpSequence || loopSequence->getOp() == EOpScope)) loopSequence->setOp(EOpNull); loopSequence = growAggregate(loopSequence, node); - loopSequence->setOperator(EOpSequence); + loopSequence->setOperator(getDebugInfo() ? EOpScope : EOpSequence); return loopSequence; } @@ -2762,7 +2795,7 @@ void TIntermBranch::updatePrecision(TPrecisionQualifier parentPrecision) return; if (exp->getBasicType() == EbtInt || exp->getBasicType() == EbtUint || - exp->getBasicType() == EbtFloat || exp->getBasicType() == EbtFloat16) { + exp->getBasicType() == EbtFloat) { if (parentPrecision != EpqNone && exp->getQualifier().precision == EpqNone) { exp->propagatePrecision(parentPrecision); } @@ -2783,7 +2816,6 @@ bool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/) if (aggRoot && aggRoot->getOp() == EOpNull) aggRoot->setOperator(EOpSequence); -#ifndef GLSLANG_WEB // Propagate 'noContraction' label in backward from 'precise' variables. glslang::PropagateNoContraction(*this); @@ -2797,7 +2829,6 @@ bool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/) assert(0); break; } -#endif return true; } @@ -2826,10 +2857,9 @@ void TIntermediate::addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguag //} if (language == EShLangVertex) { - // the names won't be found in the symbol table unless the versions are right, - // so version logic does not need to be repeated here addSymbolLinkageNode(linkage, symbolTable, "gl_VertexID"); - addSymbolLinkageNode(linkage, symbolTable, "gl_InstanceID"); + if ((version < 140 && requestedExtensions.find(E_GL_EXT_draw_instanced) != requestedExtensions.end()) || version >= 140) + addSymbolLinkageNode(linkage, symbolTable, "gl_InstanceID"); } // Add a child to the root node for the linker objects @@ -3280,7 +3310,7 @@ bool TIntermediate::promoteUnary(TIntermUnary& node) void TIntermUnary::updatePrecision() { if (getBasicType() == EbtInt || getBasicType() == EbtUint || - getBasicType() == EbtFloat || getBasicType() == EbtFloat16) { + getBasicType() == EbtFloat) { if (operand->getQualifier().precision > getQualifier().precision) getQualifier().precision = operand->getQualifier().precision; } @@ -3461,6 +3491,7 @@ bool TIntermediate::promoteBinary(TIntermBinary& node) // check for non-Boolean operands if (left->getBasicType() == EbtBool || right->getBasicType() == EbtBool) return false; + break; default: break; @@ -3504,33 +3535,42 @@ bool TIntermediate::promoteBinary(TIntermBinary& node) if (left->getType() == right->getType()) return true; - // Fall through + [[fallthrough]]; case EOpMul: case EOpMulAssign: // At least the basic type has to match if (left->getBasicType() != right->getBasicType()) return false; + break; default: break; } if (left->getType().isCoopMat() || right->getType().isCoopMat()) { + // Operations on two cooperative matrices must have identical types if (left->getType().isCoopMat() && right->getType().isCoopMat() && - *left->getType().getTypeParameters() != *right->getType().getTypeParameters()) { + left->getType() != right->getType()) { return false; } switch (op) { case EOpMul: case EOpMulAssign: - if (left->getType().isCoopMat() && right->getType().isCoopMat()) { + // Mul not supported in NV_cooperative_matrix + if (left->getType().isCoopMatNV() && right->getType().isCoopMatNV()) { return false; } - if (op == EOpMulAssign && right->getType().isCoopMat()) { + // NV_cooperative_matrix supports MulAssign is for mat*=scalar only. + // KHR_cooperative_matrix supports it for mat*=mat as well. + if (op == EOpMulAssign && right->getType().isCoopMatNV()) { return false; } - node.setOp(op == EOpMulAssign ? EOpMatrixTimesScalarAssign : EOpMatrixTimesScalar); + // Use MatrixTimesScalar if either operand is not a matrix. Otherwise use Mul. + if (!left->getType().isCoopMat() || !right->getType().isCoopMat()) { + node.setOp(op == EOpMulAssign ? EOpMatrixTimesScalarAssign : EOpMatrixTimesScalar); + } + // In case of scalar*matrix, take the result type from the matrix. if (right->getType().isCoopMat()) { node.setType(right->getType()); } @@ -3645,7 +3685,7 @@ bool TIntermediate::promoteBinary(TIntermBinary& node) case EOpAssign: if (left->getVectorSize() != right->getVectorSize() || left->getMatrixCols() != right->getMatrixCols() || left->getMatrixRows() != right->getMatrixRows()) return false; - // fall through + [[fallthrough]]; case EOpAdd: case EOpSub: @@ -3776,12 +3816,34 @@ bool TIntermediate::promoteAggregate(TIntermAggregate& node) return false; } +// Propagate precision qualifiers *up* from children to parent, and then +// back *down* again to the children's subtrees. +void TIntermAggregate::updatePrecision() +{ + if (getBasicType() == EbtInt || getBasicType() == EbtUint || + getBasicType() == EbtFloat) { + TPrecisionQualifier maxPrecision = EpqNone; + TIntermSequence operands = getSequence(); + for (unsigned int i = 0; i < operands.size(); ++i) { + TIntermTyped* typedNode = operands[i]->getAsTyped(); + assert(typedNode); + maxPrecision = std::max(maxPrecision, typedNode->getQualifier().precision); + } + getQualifier().precision = maxPrecision; + for (unsigned int i = 0; i < operands.size(); ++i) { + TIntermTyped* typedNode = operands[i]->getAsTyped(); + assert(typedNode); + typedNode->propagatePrecision(maxPrecision); + } + } +} + // Propagate precision qualifiers *up* from children to parent, and then // back *down* again to the children's subtrees. void TIntermBinary::updatePrecision() { if (getBasicType() == EbtInt || getBasicType() == EbtUint || - getBasicType() == EbtFloat || getBasicType() == EbtFloat16) { + getBasicType() == EbtFloat) { if (op == EOpRightShift || op == EOpLeftShift) { // For shifts get precision from left side only and thus no need to propagate getQualifier().precision = left->getQualifier().precision; @@ -3861,22 +3923,12 @@ TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermC #define PROMOTE(Set, CType, Get) leftUnionArray[i].Set(static_cast(rightUnionArray[i].Get())) #define PROMOTE_TO_BOOL(Get) leftUnionArray[i].setBConst(rightUnionArray[i].Get() != 0) -#ifdef GLSLANG_WEB -#define TO_ALL(Get) \ - switch (promoteTo) { \ - case EbtFloat: PROMOTE(setDConst, double, Get); break; \ - case EbtInt: PROMOTE(setIConst, int, Get); break; \ - case EbtUint: PROMOTE(setUConst, unsigned int, Get); break; \ - case EbtBool: PROMOTE_TO_BOOL(Get); break; \ - default: return node; \ - } -#else #define TO_ALL(Get) \ switch (promoteTo) { \ case EbtFloat16: PROMOTE(setDConst, double, Get); break; \ case EbtFloat: PROMOTE(setDConst, double, Get); break; \ case EbtDouble: PROMOTE(setDConst, double, Get); break; \ - case EbtInt8: PROMOTE(setI8Const, char, Get); break; \ + case EbtInt8: PROMOTE(setI8Const, signed char, Get); break; \ case EbtInt16: PROMOTE(setI16Const, short, Get); break; \ case EbtInt: PROMOTE(setIConst, int, Get); break; \ case EbtInt64: PROMOTE(setI64Const, long long, Get); break; \ @@ -3887,14 +3939,12 @@ TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermC case EbtBool: PROMOTE_TO_BOOL(Get); break; \ default: return node; \ } -#endif switch (node->getType().getBasicType()) { case EbtFloat: TO_ALL(getDConst); break; case EbtInt: TO_ALL(getIConst); break; case EbtUint: TO_ALL(getUConst); break; case EbtBool: TO_ALL(getBConst); break; -#ifndef GLSLANG_WEB case EbtFloat16: TO_ALL(getDConst); break; case EbtDouble: TO_ALL(getDConst); break; case EbtInt8: TO_ALL(getI8Const); break; @@ -3903,7 +3953,6 @@ TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermC case EbtUint8: TO_ALL(getU8Const); break; case EbtUint16: TO_ALL(getU16Const); break; case EbtUint64: TO_ALL(getU64Const); break; -#endif default: return node; } } diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseContextBase.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseContextBase.cpp index 02cca409e..591dfc718 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseContextBase.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseContextBase.cpp @@ -59,7 +59,7 @@ void TParseContextBase::outputMessage(const TSourceLoc& loc, const char* szReaso safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args); infoSink.info.prefix(prefix); - infoSink.info.location(loc); + infoSink.info.location(loc, messages & EShMsgAbsolutePath); infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n"; if (prefix == EPrefixError) { @@ -67,13 +67,14 @@ void TParseContextBase::outputMessage(const TSourceLoc& loc, const char* szReaso } } -#if !defined(GLSLANG_WEB) || defined(GLSLANG_WEB_DEVEL) - void C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) { if (messages & EShMsgOnlyPreprocessor) return; + // If enhanced msg readability, only print one error + if (messages & EShMsgEnhanced && numErrors > 0) + return; va_list args; va_start(args, szExtraInfoFormat); outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args); @@ -115,8 +116,6 @@ void C_DECL TParseContextBase::ppWarn(const TSourceLoc& loc, const char* szReaso va_end(args); } -#endif - // // Both test and if necessary, spit out an error, to see if the node is really // an l-value that can be operated on this way. @@ -137,7 +136,6 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, case EvqConst: message = "can't modify a const"; break; case EvqConstReadOnly: message = "can't modify a const"; break; case EvqUniform: message = "can't modify a uniform"; break; -#ifndef GLSLANG_WEB case EvqBuffer: if (node->getQualifier().isReadOnly()) message = "can't modify a readonly buffer"; @@ -148,7 +146,6 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, if (language != EShLangIntersect) message = "cannot modify hitAttributeNV in this stage"; break; -#endif default: // @@ -156,12 +153,12 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, // switch (node->getBasicType()) { case EbtSampler: - message = "can't modify a sampler"; + if (extensionTurnedOn(E_GL_ARB_bindless_texture) == false) + message = "can't modify a sampler"; break; case EbtVoid: message = "can't modify void"; break; -#ifndef GLSLANG_WEB case EbtAtomicUint: message = "can't modify an atomic_uint"; break; @@ -171,7 +168,9 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, case EbtRayQuery: message = "can't modify rayQueryEXT"; break; -#endif + case EbtHitObjectNV: + message = "can't modify hitObjectNV"; + break; default: break; } @@ -209,7 +208,7 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, // // If we get here, we have an error and a message. // - const TIntermTyped* leftMostTypeNode = TIntermediate::findLValueBase(node, true); + const TIntermTyped* leftMostTypeNode = TIntermediate::traverseLValueBase(node, true); if (symNode) error(loc, " l-value required", op, "\"%s\" (%s)", symbol, message); @@ -228,14 +227,14 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, // Test for and give an error if the node can't be read from. void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node) { - TIntermBinary* binaryNode = node->getAsBinaryNode(); - const TIntermSymbol* symNode = node->getAsSymbolNode(); - if (! node) return; + TIntermBinary* binaryNode = node->getAsBinaryNode(); + const TIntermSymbol* symNode = node->getAsSymbolNode(); + if (node->getQualifier().isWriteOnly()) { - const TIntermTyped* leftMostTypeNode = TIntermediate::findLValueBase(node, true); + const TIntermTyped* leftMostTypeNode = TIntermediate::traverseLValueBase(node, true); if (symNode != nullptr) error(loc, "can't read from writeonly object: ", op, symNode->getName().c_str()); @@ -258,6 +257,7 @@ void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, case EOpVectorSwizzle: case EOpMatrixSwizzle: rValueErrorCheck(loc, op, binaryNode->getLeft()); + break; default: break; } @@ -622,6 +622,17 @@ void TParseContextBase::growGlobalUniformBlock(const TSourceLoc& loc, TType& mem globalUniformBlock->getWritableType().getQualifier().layoutBinding = globalUniformBinding; globalUniformBlock->getWritableType().getQualifier().layoutSet = globalUniformSet; + // Check for declarations of this default uniform that already exist due to other compilation units. + TSymbol* symbol = symbolTable.find(memberName); + if (symbol) { + if (memberType != symbol->getType()) { + TString err; + err += "Redeclaration: already declared as \"" + symbol->getType().getCompleteString() + "\""; + error(loc, "", memberName.c_str(), err.c_str()); + } + return; + } + // Add the requested member as a member to the global block. TType* type = new TType; type->shallowCopy(memberType); @@ -712,6 +723,24 @@ void TParseContextBase::finish() if (parsingBuiltins) return; + for (const TString& relaxedSymbol : relaxedSymbols) + { + TSymbol* symbol = symbolTable.find(relaxedSymbol); + TType& type = symbol->getWritableType(); + for (const TTypeLoc& typeLoc : *type.getStruct()) + { + if (typeLoc.type->isOpaque()) + { + typeLoc.type->getSampler() = TSampler{}; + typeLoc.type->setBasicType(EbtInt); + TString fieldName("/*"); + fieldName.append(typeLoc.type->getFieldName()); + fieldName.append("*/"); + typeLoc.type->setFieldName(fieldName); + } + } + } + // Transfer the linkage symbols to AST nodes, preserving order. TIntermAggregate* linkage = new TIntermAggregate; for (auto i = linkageSymbols.begin(); i != linkageSymbols.end(); ++i) diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.cpp index b957bb87c..c5f0e63f1 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.cpp @@ -4,6 +4,7 @@ // Copyright (C) 2015-2018 Google, Inc. // Copyright (C) 2017, 2019 ARM Limited. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. +// Modifications Copyright (C) 2024 Ravi Prakash Singh. // // All rights reserved. // @@ -38,6 +39,7 @@ // #include "ParseHelper.h" +#include "Initialize.h" #include "Scan.h" #include "../OSDependent/osinclude.h" @@ -57,11 +59,8 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b infoSink, forwardCompatible, messages, entryPoint), inMain(false), blockName(nullptr), - limits(resources.limits) -#ifndef GLSLANG_WEB - , + limits(resources.limits), atomicUintOffsets(nullptr), anyIndexLimits(false) -#endif { // decide whether precision qualifiers should be ignored or respected if (isEsProfile() || spvVersion.vulkan > 0) { @@ -80,10 +79,6 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b globalBufferDefaults.layoutMatrix = ElmColumnMajor; globalBufferDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd430 : ElpShared; - // use storage buffer on SPIR-V 1.3 and up - if (spvVersion.spv >= EShTargetSpv_1_3) - intermediate.setUseStorageBuffer(); - globalInputDefaults.clear(); globalOutputDefaults.clear(); @@ -91,7 +86,6 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b globalSharedDefaults.layoutMatrix = ElmColumnMajor; globalSharedDefaults.layoutPacking = ElpStd430; -#ifndef GLSLANG_WEB // "Shaders in the transform // feedback capturing mode have an initial global default of // layout(xfb_buffer = 0) out;" @@ -103,7 +97,6 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b if (language == EShLangGeometry) globalOutputDefaults.layoutStream = 0; -#endif if (entryPoint != nullptr && entryPoint->size() > 0 && *entryPoint != "main") infoSink.info.message(EPrefixError, "Source entry point must be \"main\""); @@ -111,9 +104,7 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b TParseContext::~TParseContext() { -#ifndef GLSLANG_WEB delete [] atomicUintOffsets; -#endif } // Set up all default precisions as needed by the current environment. @@ -177,7 +168,6 @@ void TParseContext::setLimits(const TBuiltInResource& r) resources = r; intermediate.setLimits(r); -#ifndef GLSLANG_WEB anyIndexLimits = ! limits.generalAttributeMatrixVectorIndexing || ! limits.generalConstantMatrixVectorIndexing || ! limits.generalSamplerIndexing || @@ -192,7 +182,6 @@ void TParseContext::setLimits(const TBuiltInResource& r) atomicUintOffsets = new int[resources.maxAtomicCounterBindings]; for (int b = 0; b < resources.maxAtomicCounterBindings; ++b) atomicUintOffsets[b] = 0; -#endif } // @@ -339,7 +328,6 @@ void TParseContext::setInvariant(const TSourceLoc& loc, const char* builtin) { void TParseContext::handlePragma(const TSourceLoc& loc, const TVector& tokens) { -#ifndef GLSLANG_WEB if (pragmaCallback) pragmaCallback(loc.line, tokens); @@ -412,6 +400,10 @@ void TParseContext::handlePragma(const TSourceLoc& loc, const TVector& if (spvVersion.spv < glslang::EShTargetSpv_1_3) error(loc, "requires SPIR-V 1.3", "#pragma use_variable_pointers", ""); intermediate.setUseVariablePointers(); + } else if (spvVersion.spv > 0 && tokens[0].compare("use_replicated_composites") == 0) { + if (tokens.size() != 1) + error(loc, "extra tokens", "#pragma", ""); + intermediate.setReplicatedComposites(); } else if (tokens[0].compare("once") == 0) { warn(loc, "not implemented", "#pragma once", ""); } else if (tokens[0].compare("glslang_binary_double_output") == 0) { @@ -441,7 +433,6 @@ void TParseContext::handlePragma(const TSourceLoc& loc, const TVector& setInvariant(loc, "gl_FragColor"); setInvariant(loc, "gl_FragData"); } -#endif } // @@ -455,7 +446,6 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb if (symbol && symbol->getNumExtensions()) requireExtensions(loc, symbol->getNumExtensions(), symbol->getExtensions(), symbol->getName().c_str()); -#ifndef GLSLANG_WEB if (symbol && symbol->isReadOnly()) { // All shared things containing an unsized array must be copied up // on first use, so that all future references will share its array structure, @@ -475,7 +465,6 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb makeEditable(symbol); } } -#endif const TVariable* variable; const TAnonMember* anon = symbol ? symbol->getAsAnonMember() : nullptr; @@ -502,6 +491,16 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb error(loc, "cannot be used (maybe an instance name is needed)", string->c_str(), ""); variable = nullptr; } + + if (language == EShLangMesh && variable) { + TLayoutGeometry primitiveType = intermediate.getOutputPrimitive(); + if ((variable->getMangledName() == "gl_PrimitiveTriangleIndicesEXT" && primitiveType != ElgTriangles) || + (variable->getMangledName() == "gl_PrimitiveLineIndicesEXT" && primitiveType != ElgLines) || + (variable->getMangledName() == "gl_PrimitivePointIndicesEXT" && primitiveType != ElgPoints)) { + error(loc, "cannot be used (output primitive type mismatch)", string->c_str(), ""); + variable = nullptr; + } + } } else { if (symbol) error(loc, "variable name expected", string->c_str(), ""); @@ -570,7 +569,6 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn // at least one of base and index is not a front-end constant variable... TIntermTyped* result = nullptr; -#ifndef GLSLANG_WEB if (base->isReference() && ! base->isArray()) { requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, "buffer reference indexing"); if (base->getType().getReferentType()->containsUnsizedArray()) { @@ -589,15 +587,26 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } if (base->getAsSymbolNode() && isIoResizeArray(base->getType())) handleIoResizeArrayAccess(loc, base); -#endif if (index->getQualifier().isFrontEndConstant()) checkIndex(loc, base->getType(), indexValue); if (index->getQualifier().isFrontEndConstant()) { -#ifndef GLSLANG_WEB if (base->getType().isUnsizedArray()) { base->getWritableType().updateImplicitArraySize(indexValue + 1); + base->getWritableType().setImplicitlySized(true); + if (base->getQualifier().builtIn == EbvClipDistance && + indexValue >= resources.maxClipDistances) { + error(loc, "gl_ClipDistance", "[", "array index out of range '%d'", indexValue); + } + else if (base->getQualifier().builtIn == EbvCullDistance && + indexValue >= resources.maxCullDistances) { + error(loc, "gl_CullDistance", "[", "array index out of range '%d'", indexValue); + } + else if (base->getQualifier().builtIn == EbvSampleMask && + indexValue >= (resources.maxSamples + 31) / 32) { + error(loc, "gl_SampleMask", "[", "array index out of range '%d'", indexValue); + } // For 2D per-view builtin arrays, update the inner dimension size in parent type if (base->getQualifier().isPerView() && base->getQualifier().builtIn != EbvNone) { TIntermBinary* binaryNode = base->getAsBinaryNode(); @@ -609,11 +618,9 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } } } else -#endif checkIndex(loc, base->getType(), indexValue); result = intermediate.addIndex(EOpIndexDirect, base, index, loc); } else { -#ifndef GLSLANG_WEB if (base->getType().isUnsizedArray()) { // we have a variable index into an unsized array, which is okay, // depending on the situation @@ -625,7 +632,6 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } base->getWritableType().setArrayVariablyIndexed(); } -#endif if (base->getBasicType() == EbtBlock) { if (base->getQualifier().storage == EvqBuffer) requireProfile(base->getLoc(), ~EEsProfile, "variable indexing buffer block array"); @@ -635,7 +641,7 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn else { // input/output blocks either don't exist or can't be variably indexed } - } else if (language == EShLangFragment && base->getQualifier().isPipeOutput()) + } else if (language == EShLangFragment && base->getQualifier().isPipeOutput() && base->getQualifier().builtIn != EbvSampleMask) requireProfile(base->getLoc(), ~EEsProfile, "variable indexing fragment shader output array"); else if (base->getBasicType() == EbtSampler && version >= 130) { const char* explanation = "variable indexing sampler array"; @@ -661,7 +667,6 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } result->setType(newType); -#ifndef GLSLANG_WEB inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier()); // Propagate nonuniform @@ -670,13 +675,10 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn if (anyIndexLimits) handleIndexLimits(loc, base, index); -#endif return result; } -#ifndef GLSLANG_WEB - // for ES 2.0 (version 100) limitations for almost all index operations except vertex-shader uniforms void TParseContext::handleIndexLimits(const TSourceLoc& /*loc*/, TIntermTyped* base, TIntermTyped* index) { @@ -716,8 +718,8 @@ bool TParseContext::isIoResizeArray(const TType& type) const (language == EShLangTessControl && type.getQualifier().storage == EvqVaryingOut && ! type.getQualifier().patch) || (language == EShLangFragment && type.getQualifier().storage == EvqVaryingIn && - type.getQualifier().pervertexNV) || - (language == EShLangMeshNV && type.getQualifier().storage == EvqVaryingOut && + (type.getQualifier().pervertexNV || type.getQualifier().pervertexEXT)) || + (language == EShLangMesh && type.getQualifier().storage == EvqVaryingOut && !type.getQualifier().perTaskNV)); } @@ -794,7 +796,7 @@ void TParseContext::checkIoArraysConsistency(const TSourceLoc &loc, bool tailOnl // As I/O array sizes don't change, fetch requiredSize only once, // except for mesh shaders which could have different I/O array sizes based on type qualifiers. - if (firstIteration || (language == EShLangMeshNV)) { + if (firstIteration || (language == EShLangMesh)) { requiredSize = getIoArrayImplicitSize(type.getQualifier(), &featureString); if (requiredSize == 0) break; @@ -823,7 +825,7 @@ int TParseContext::getIoArrayImplicitSize(const TQualifier &qualifier, TString * // Number of vertices for Fragment shader is always three. expectedSize = 3; str = "vertices"; - } else if (language == EShLangMeshNV) { + } else if (language == EShLangMesh) { unsigned int maxPrimitives = intermediate.getPrimitives() != TQualifier::layoutNotSet ? intermediate.getPrimitives() : 0; if (qualifier.builtIn == EbvPrimitiveIndicesNV) { @@ -831,6 +833,11 @@ int TParseContext::getIoArrayImplicitSize(const TQualifier &qualifier, TString * str = "max_primitives*"; str += TQualifier::getGeometryString(intermediate.getOutputPrimitive()); } + else if (qualifier.builtIn == EbvPrimitiveTriangleIndicesEXT || qualifier.builtIn == EbvPrimitiveLineIndicesEXT || + qualifier.builtIn == EbvPrimitivePointIndicesEXT) { + expectedSize = maxPrimitives; + str = "max_primitives"; + } else if (qualifier.isPerPrimitive()) { expectedSize = maxPrimitives; str = "max_primitives"; @@ -856,17 +863,15 @@ void TParseContext::checkIoArrayConsistency(const TSourceLoc& loc, int requiredS error(loc, "inconsistent output number of vertices for array size of", feature, name.c_str()); else if (language == EShLangFragment) { if (type.getOuterArraySize() > requiredSize) - error(loc, " cannot be greater than 3 for pervertexNV", feature, name.c_str()); + error(loc, " cannot be greater than 3 for pervertexEXT", feature, name.c_str()); } - else if (language == EShLangMeshNV) + else if (language == EShLangMesh) error(loc, "inconsistent output array size of", feature, name.c_str()); else assert(0); } } -#endif // GLSLANG_WEB - // Handle seeing a binary node with a math operation. // Returns nullptr if not semantically allowed. TIntermTyped* TParseContext::handleBinaryMath(const TSourceLoc& loc, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right) @@ -902,8 +907,10 @@ TIntermTyped* TParseContext::handleBinaryMath(const TSourceLoc& loc, const char* result = intermediate.addBinaryMath(op, left, right, loc); } - if (result == nullptr) - binaryOpError(loc, str, left->getCompleteString(), right->getCompleteString()); + if (result == nullptr) { + bool enhanced = intermediate.getEnhancedMsgs(); + binaryOpError(loc, str, left->getCompleteString(enhanced), right->getCompleteString(enhanced)); + } return result; } @@ -926,8 +933,10 @@ TIntermTyped* TParseContext::handleUnaryMath(const TSourceLoc& loc, const char* if (result) return result; - else - unaryOpError(loc, str, childNode->getCompleteString()); + else { + bool enhanced = intermediate.getEnhancedMsgs(); + unaryOpError(loc, str, childNode->getCompleteString(enhanced)); + } return childNode; } @@ -953,8 +962,8 @@ TIntermTyped* TParseContext::handleDotDereference(const TSourceLoc& loc, TInterm requireProfile(loc, ~EEsProfile, feature); profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, feature); } else if (!base->getType().isCoopMat()) { - error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString().c_str()); - + bool enhanced = intermediate.getEnhancedMsgs(); + error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString(enhanced).c_str()); return base; } @@ -993,22 +1002,44 @@ TIntermTyped* TParseContext::handleDotDereference(const TSourceLoc& loc, TInterm break; } } + if (fieldFound) { - if (base->getType().getQualifier().isFrontEndConstant()) - result = intermediate.foldDereference(base, member, loc); - else { - blockMemberExtensionCheck(loc, base, member, field); - TIntermTyped* index = intermediate.addConstantUnion(member, loc); - result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc); - result->setType(*(*fields)[member].type); - if ((*fields)[member].type->getQualifier().isIo()) - intermediate.addIoAccessed(field); + if (spvVersion.vulkan != 0 && spvVersion.vulkanRelaxed) + result = vkRelaxedRemapDotDereference(loc, *base, *(*fields)[member].type, field); + + if (result == base) + { + if (base->getType().getQualifier().isFrontEndConstant()) + result = intermediate.foldDereference(base, member, loc); + else { + blockMemberExtensionCheck(loc, base, member, field); + TIntermTyped* index = intermediate.addConstantUnion(member, loc); + result = intermediate.addIndex(EOpIndexDirectStruct, base, index, loc); + result->setType(*(*fields)[member].type); + if ((*fields)[member].type->getQualifier().isIo()) + intermediate.addIoAccessed(field); + } } + inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier()); - } else - error(loc, "no such field in structure", field.c_str(), ""); + } else { + auto baseSymbol = base; + while (baseSymbol->getAsSymbolNode() == nullptr) { + auto binaryNode = baseSymbol->getAsBinaryNode(); + if (binaryNode == nullptr) break; + baseSymbol = binaryNode->getLeft(); + } + if (baseSymbol->getAsSymbolNode() != nullptr) { + TString structName; + structName.append("\'").append(baseSymbol->getAsSymbolNode()->getName().c_str()).append("\'"); + error(loc, "no such field in structure", field.c_str(), structName.c_str()); + } else { + error(loc, "no such field in structure", field.c_str(), ""); + } + } } else - error(loc, "does not apply to this type:", field.c_str(), base->getType().getCompleteString().c_str()); + error(loc, "does not apply to this type:", field.c_str(), + base->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str()); // Propagate noContraction up the dereference chain if (base->getQualifier().isNoContraction()) @@ -1127,7 +1158,6 @@ TFunction* TParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunct TSymbol* symbol = symbolTable.find(function.getMangledName(), &builtIn); if (symbol && symbol->getAsFunction() && builtIn) requireProfile(loc, ~EEsProfile, "redefinition of built-in function"); -#ifndef GLSLANG_WEB // Check the validity of using spirv_literal qualifier for (int i = 0; i < function.getParamCount(); ++i) { if (function[i].type->getQualifier().isSpirvLiteral() && function.getBuiltInOp() != EOpSpirvInst) @@ -1139,19 +1169,16 @@ TFunction* TParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunct // respect this redeclared one. if (symbol && builtIn && function.getBuiltInOp() == EOpSpirvInst) symbol = nullptr; -#endif - const TFunction* prevDec = symbol ? symbol->getAsFunction() : 0; + const TFunction* prevDec = symbol ? symbol->getAsFunction() : nullptr; if (prevDec) { if (prevDec->isPrototyped() && prototype) profileRequires(loc, EEsProfile, 300, nullptr, "multiple prototypes for same function"); if (prevDec->getType() != function.getType()) error(loc, "overloaded functions must have the same return type", function.getName().c_str(), ""); -#ifndef GLSLANG_WEB if (prevDec->getSpirvInstruction() != function.getSpirvInstruction()) { error(loc, "overloaded functions must have the same qualifiers", function.getName().c_str(), "spirv_instruction"); } -#endif for (int i = 0; i < prevDec->getParamCount(); ++i) { if ((*prevDec)[i].type->getQualifier().storage != function[i].type->getQualifier().storage) error(loc, "overloaded functions must have the same parameter storage qualifiers for argument", function[i].type->getStorageQualifierString(), "%d", i+1); @@ -1233,6 +1260,8 @@ TIntermAggregate* TParseContext::handleFunctionDefinition(const TSourceLoc& loc, error(loc, "function cannot take any parameter(s)", function.getName().c_str(), ""); if (function.getType().getBasicType() != EbtVoid) error(loc, "", function.getType().getBasicTypeString().c_str(), "entry point cannot return a value"); + if (function.getLinkType() != ELinkNone) + error(loc, "main function cannot be exported", "", ""); } // @@ -1269,6 +1298,7 @@ TIntermAggregate* TParseContext::handleFunctionDefinition(const TSourceLoc& loc, } else paramNodes = intermediate.growAggregate(paramNodes, intermediate.addSymbol(*param.type, loc), loc); } + paramNodes->setLinkType(function.getLinkType()); intermediate.setAggregateOperator(paramNodes, EOpParameters, TType(EbtVoid), loc); loopNestingLevel = 0; statementNestingLevel = 0; @@ -1314,14 +1344,14 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction // result = addConstructor(loc, arguments, type); if (result == nullptr) - error(loc, "cannot construct with these arguments", type.getCompleteString().c_str(), ""); + error(loc, "cannot construct with these arguments", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str(), ""); } } else { // // Find it in the symbol table. // const TFunction* fnCandidate; - bool builtIn; + bool builtIn {false}; fnCandidate = findFunction(loc, *function, builtIn); if (fnCandidate) { // This is a declared function that might map to @@ -1330,6 +1360,10 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction // - a user function. // Error check for a function requiring specific extensions present. + if (builtIn && + (fnCandidate->getBuiltInOp() == EOpSubgroupQuadAll || fnCandidate->getBuiltInOp() == EOpSubgroupQuadAny)) + requireExtensions(loc, 1, &E_GL_EXT_shader_quad_control, fnCandidate->getName().c_str()); + if (builtIn && fnCandidate->getNumExtensions()) requireExtensions(loc, fnCandidate->getNumExtensions(), fnCandidate->getExtensions(), fnCandidate->getName().c_str()); @@ -1339,7 +1373,10 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction requireInt16Arithmetic(loc, "built-in function", "(u)int16 types can only be in uniform block or buffer storage"); if (builtIn && fnCandidate->getType().contains8BitInt()) requireInt8Arithmetic(loc, "built-in function", "(u)int8 types can only be in uniform block or buffer storage"); - + if (builtIn && (fnCandidate->getBuiltInOp() == EOpTextureFetch || fnCandidate->getBuiltInOp() == EOpTextureQuerySize)) { + if ((*fnCandidate)[0].type->getSampler().isMultiSample() && version <= 140) + requireExtensions(loc, 1, &E_GL_ARB_texture_multisample, fnCandidate->getName().c_str()); + } if (arguments != nullptr) { // Make sure qualifications work for these arguments. TIntermAggregate* aggregate = arguments->getAsAggregate(); @@ -1353,7 +1390,6 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction if (lValueErrorCheck(arguments->getLoc(), "assign", arg->getAsTyped())) error(arguments->getLoc(), "Non-L-value cannot be passed for 'out' or 'inout' parameters.", "out", ""); } -#ifndef GLSLANG_WEB if (formalQualifier.isSpirvLiteral()) { if (!arg->getAsTyped()->getQualifier().isFrontEndConstant()) { error(arguments->getLoc(), @@ -1361,12 +1397,11 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction "spirv_literal", ""); } } -#endif const TType& argType = arg->getAsTyped()->getType(); const TQualifier& argQualifier = argType.getQualifier(); - if (argQualifier.isMemory() && (argType.containsOpaque() || argType.isReference())) { + bool containsBindlessSampler = intermediate.getBindlessMode() && argType.containsSampler(); + if (argQualifier.isMemory() && !containsBindlessSampler && (argType.containsOpaque() || argType.isReference())) { const char* message = "argument cannot drop memory qualifier when passed to formal parameter"; -#ifndef GLSLANG_WEB if (argQualifier.volatil && ! formalQualifier.volatil) error(arguments->getLoc(), message, "volatile", ""); if (argQualifier.coherent && ! (formalQualifier.devicecoherent || formalQualifier.coherent)) @@ -1386,7 +1421,6 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction // Don't check 'restrict', it is different than the rest: // "...but only restrict can be taken away from a calling argument, by a formal parameter that // lacks the restrict qualifier..." -#endif } if (!builtIn && argQualifier.getFormat() != formalQualifier.getFormat()) { // we have mismatched formats, which should only be allowed if writeonly @@ -1416,11 +1450,9 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction if (builtIn && fnCandidate->getBuiltInOp() != EOpNull) { // A function call mapped to a built-in operation. result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate); -#ifndef GLSLANG_WEB } else if (fnCandidate->getBuiltInOp() == EOpSpirvInst) { // When SPIR-V instruction qualifier is specified, the function call is still mapped to a built-in operation. result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate); -#endif } else { // This is a function call not mapped to built-in operator. // It could still be a built-in function, but only if PureOperatorBuiltins == false. @@ -1440,11 +1472,9 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction intermediate.addToCallGraph(infoSink, currentCaller, fnCandidate->getMangledName()); } -#ifndef GLSLANG_WEB if (builtIn) nonOpBuiltInCheck(loc, *fnCandidate, *call); else -#endif userFunctionCallCheck(loc, *call); } @@ -1462,7 +1492,8 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction if (result->getAsTyped()->getType().isCoopMat() && !result->getAsTyped()->getType().isParameterized()) { - assert(fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAdd); + assert(fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAdd || + fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAddNV); result->setType(result->getAsAggregate()->getSequence()[2]->getAsTyped()->getType()); } @@ -1494,11 +1525,10 @@ TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNo else error(arguments->getLoc(), " wrong operand type", "Internal Error", "built in unary operator function. Type: %s", - static_cast(arguments)->getCompleteString().c_str()); + static_cast(arguments)->getCompleteString(intermediate.getEnhancedMsgs()).c_str()); } else if (result->getAsOperator()) builtInOpCheck(loc, function, *result->getAsOperator()); -#ifndef GLSLANG_WEB // Special handling for function call with SPIR-V instruction qualifier specified if (function.getBuiltInOp() == EOpSpirvInst) { if (auto agg = result->getAsAggregate()) { @@ -1525,7 +1555,6 @@ TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNo } else assert(0); } -#endif return result; } @@ -1628,9 +1657,7 @@ void TParseContext::computeBuiltinPrecisions(TIntermTyped& node, const TFunction TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value) { -#ifndef GLSLANG_WEB storage16BitAssignmentCheck(loc, value->getType(), "return"); -#endif functionReturnsValue = true; TIntermBranch* branch = nullptr; @@ -1650,9 +1677,15 @@ TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermType error(loc, "type does not match, or is not convertible to, the function's return type", "return", ""); branch = intermediate.addBranch(EOpReturn, value, loc); } - } else + } else { + if (value->getType().isTexture() || value->getType().isImage()) { + if (spvVersion.spv != 0) + error(loc, "sampler or image cannot be used as return type when generating SPIR-V", "return", ""); + else if (!extensionTurnedOn(E_GL_ARB_bindless_texture)) + error(loc, "sampler or image can be used as return type only when the extension GL_ARB_bindless_texture enabled", "return", ""); + } branch = intermediate.addBranch(EOpReturn, value, loc); - + } branch->updatePrecision(currentFunctionType->getQualifier().precision); return branch; } @@ -1660,7 +1693,6 @@ TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermType // See if the operation is being done in an illegal location. void TParseContext::checkLocation(const TSourceLoc& loc, TOperator op) { -#ifndef GLSLANG_WEB switch (op) { case EOpBarrier: if (language == EShLangTessControl) { @@ -1713,7 +1745,6 @@ void TParseContext::checkLocation(const TSourceLoc& loc, TOperator op) default: break; } -#endif } // Finish processing object.length(). This started earlier in handleDotDereference(), where @@ -1731,7 +1762,6 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction const TType& type = intermNode->getAsTyped()->getType(); if (type.isArray()) { if (type.isUnsizedArray()) { -#ifndef GLSLANG_WEB if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) { // We could be between a layout declaration that gives a built-in io array implicit size and // a user redeclaration of that array, meaning we have to substitute its implicit size here @@ -1742,17 +1772,19 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction name == "gl_MeshPrimitivesNV") { length = getIoArrayImplicitSize(type.getQualifier()); } + } else if (const auto typed = intermNode->getAsTyped()) { + if (typed->getQualifier().builtIn == EbvSampleMask) { + requireProfile(loc, EEsProfile, "the array size of gl_SampleMask and gl_SampleMaskIn is ceil(gl_MaxSamples/32)"); + length = (resources.maxSamples + 31) / 32; + } } -#endif if (length == 0) { -#ifndef GLSLANG_WEB if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier"); else if (isRuntimeLength(*intermNode->getAsTyped())) { // Create a unary op and let the back end handle it return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt)); } else -#endif error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method"); } } else if (type.getOuterArrayNode()) { @@ -1785,7 +1817,6 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction // void TParseContext::addInputArgumentConversions(const TFunction& function, TIntermNode*& arguments) const { -#ifndef GLSLANG_WEB TIntermAggregate* aggregate = arguments->getAsAggregate(); // Process each argument's conversion @@ -1813,7 +1844,6 @@ void TParseContext::addInputArgumentConversions(const TFunction& function, TInte } } } -#endif } // @@ -1825,9 +1855,6 @@ void TParseContext::addInputArgumentConversions(const TFunction& function, TInte // TIntermTyped* TParseContext::addOutputArgumentConversions(const TFunction& function, TIntermAggregate& intermNode) const { -#ifdef GLSLANG_WEB - return &intermNode; -#else TIntermSequence& arguments = intermNode.getSequence(); // Will there be any output conversions? @@ -1895,7 +1922,6 @@ TIntermTyped* TParseContext::addOutputArgumentConversions(const TFunction& funct conversionTree = intermediate.setAggregateOperator(conversionTree, EOpComma, intermNode.getType(), intermNode.getLoc()); return conversionTree; -#endif } TIntermTyped* TParseContext::addAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right) @@ -1903,6 +1929,9 @@ TIntermTyped* TParseContext::addAssign(const TSourceLoc& loc, TOperator op, TInt if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference()) requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, "+= and -= on a buffer reference"); + if (op == EOpAssign && left->getBasicType() == EbtSampler && right->getBasicType() == EbtSampler) + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "sampler assignment for bindless texture"); + return intermediate.addAssign(op, left, right, loc); } @@ -1990,18 +2019,18 @@ void TParseContext::memorySemanticsCheck(const TSourceLoc& loc, const TFunction& break; } - if ((semantics & gl_SemanticsAcquire) && + if ((semantics & gl_SemanticsAcquire) && (callNode.getOp() == EOpAtomicStore || callNode.getOp() == EOpImageAtomicStore)) { error(loc, "gl_SemanticsAcquire must not be used with (image) atomic store", fnCandidate.getName().c_str(), ""); } - if ((semantics & gl_SemanticsRelease) && + if ((semantics & gl_SemanticsRelease) && (callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpImageAtomicLoad)) { error(loc, "gl_SemanticsRelease must not be used with (image) atomic load", fnCandidate.getName().c_str(), ""); } - if ((semantics & gl_SemanticsAcquireRelease) && - (callNode.getOp() == EOpAtomicStore || callNode.getOp() == EOpImageAtomicStore || + if ((semantics & gl_SemanticsAcquireRelease) && + (callNode.getOp() == EOpAtomicStore || callNode.getOp() == EOpImageAtomicStore || callNode.getOp() == EOpAtomicLoad || callNode.getOp() == EOpImageAtomicLoad)) { error(loc, "gl_SemanticsAcquireRelease must not be used with (image) atomic load/store", fnCandidate.getName().c_str(), ""); @@ -2102,7 +2131,6 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan TString featureString; const char* feature = nullptr; switch (callNode.getOp()) { -#ifndef GLSLANG_WEB case EOpTextureGather: case EOpTextureGatherOffset: case EOpTextureGatherOffsets: @@ -2175,6 +2203,37 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } break; } + + case EOpTexture: + case EOpTextureLod: + { + if ((fnCandidate.getParamCount() > 2) && ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) && + ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) && fnCandidate[0].type->getSampler().shadow) { + featureString = fnCandidate.getName(); + if (callNode.getOp() == EOpTexture) + featureString += "(..., float bias)"; + else + featureString += "(..., float lod)"; + feature = featureString.c_str(); + + if ((fnCandidate[0].type->getSampler().dim == Esd2D && fnCandidate[0].type->getSampler().arrayed) || //2D Array Shadow + (fnCandidate[0].type->getSampler().dim == EsdCube && fnCandidate[0].type->getSampler().arrayed && fnCandidate.getParamCount() > 3) || // Cube Array Shadow + (fnCandidate[0].type->getSampler().dim == EsdCube && callNode.getOp() == EOpTextureLod)) { // Cube Shadow + requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature); + if (isEsProfile()) { + if (version < 320 && + !extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array)) + error(loc, "GL_EXT_texture_shadow_lod not supported for this ES version", feature, ""); + else + profileRequires(loc, EEsProfile, 320, nullptr, feature); + } else { // Desktop + profileRequires(loc, ~EEsProfile, 130, nullptr, feature); + } + } + } + break; + } + case EOpSparseTextureGather: case EOpSparseTextureGatherOffset: case EOpSparseTextureGatherOffsets: @@ -2243,7 +2302,6 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan break; } -#endif case EOpTextureOffset: case EOpTextureFetchOffset: @@ -2271,12 +2329,10 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan if (arg > 0) { -#ifndef GLSLANG_WEB bool f16ShadowCompare = (*argp)[1]->getAsTyped()->getBasicType() == EbtFloat16 && arg0->getType().getSampler().shadow; if (f16ShadowCompare) ++arg; -#endif if (! (*argp)[arg]->getAsTyped()->getQualifier().isConstant()) error(loc, "argument must be compile-time constant", "texel offset", ""); else if ((*argp)[arg]->getAsConstantUnion()) { @@ -2292,18 +2348,41 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan if (callNode.getOp() == EOpTextureOffset) { TSampler s = arg0->getType().getSampler(); if (s.is2D() && s.isArrayed() && s.isShadow()) { - if (isEsProfile()) + if ( + ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) && + ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) && + (fnCandidate.getParamCount() == 4)) { + featureString = fnCandidate.getName() + " for sampler2DArrayShadow"; + feature = featureString.c_str(); + requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature); + profileRequires(loc, EEsProfile, 300, nullptr, feature); + profileRequires(loc, ~EEsProfile, 130, nullptr, feature); + } + else if (isEsProfile()) error(loc, "TextureOffset does not support sampler2DArrayShadow : ", "sampler", "ES Profile"); else if (version <= 420) error(loc, "TextureOffset does not support sampler2DArrayShadow : ", "sampler", "version <= 420"); } } + + if (callNode.getOp() == EOpTextureLodOffset) { + TSampler s = arg0->getType().getSampler(); + if (s.is2D() && s.isArrayed() && s.isShadow() && + ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) && + ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) && + (fnCandidate.getParamCount() == 4)) { + featureString = fnCandidate.getName() + " for sampler2DArrayShadow"; + feature = featureString.c_str(); + profileRequires(loc, EEsProfile, 300, nullptr, feature); + profileRequires(loc, ~EEsProfile, 130, nullptr, feature); + requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature); + } + } } break; } -#ifndef GLSLANG_WEB case EOpTraceNV: if (!(*argp)[10]->getAsConstantUnion()) error(loc, "argument must be compile-time constant", "payload number", "a"); @@ -2317,7 +2396,7 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan error(loc, "argument must be compile-time constant", "payload number", "a"); else { unsigned int location = (*argp)[10]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); - if (intermediate.checkLocationRT(0, location) < 0) + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0) error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location); } break; @@ -2330,11 +2409,84 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan error(loc, "argument must be compile-time constant", "callable data number", ""); else { unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); - if (intermediate.checkLocationRT(1, location) < 0) + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(1, location) < 0) error(loc, "with layout(location =", "no callableDataEXT/callableDataInEXT declared", "%d)", location); } break; + case EOpHitObjectTraceRayNV: + if (!(*argp)[11]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "payload number", ""); + else { + unsigned int location = (*argp)[11]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0) + error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location); + } + break; + case EOpHitObjectTraceRayMotionNV: + if (!(*argp)[12]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "payload number", ""); + else { + unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0) + error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location); + } + break; + case EOpHitObjectExecuteShaderNV: + if (!(*argp)[1]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "payload number", ""); + else { + unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0) + error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitNV: + if (!(*argp)[12]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitMotionNV: + if (!(*argp)[13]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[13]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitWithIndexNV: + if (!(*argp)[11]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[11]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitWithIndexMotionNV: + if (!(*argp)[12]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectGetAttributesNV: + if (!(*argp)[1]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpRayQueryGetIntersectionType: case EOpRayQueryGetIntersectionT: case EOpRayQueryGetIntersectionInstanceCustomIndex: @@ -2348,6 +2500,7 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan case EOpRayQueryGetIntersectionObjectRayOrigin: case EOpRayQueryGetIntersectionObjectToWorld: case EOpRayQueryGetIntersectionWorldToObject: + case EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: if (!(*argp)[1]->getAsConstantUnion()) error(loc, "argument must be compile-time constant", "committed", ""); break; @@ -2380,15 +2533,26 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan error(loc, "only supported on image with format r64i", fnCandidate.getName().c_str(), ""); else if (callNode.getType().getBasicType() == EbtUint64 && imageType.getQualifier().getFormat() != ElfR64ui) error(loc, "only supported on image with format r64ui", fnCandidate.getName().c_str(), ""); + } else if(callNode.getType().getBasicType() == EbtFloat16 && + ((callNode.getType().getVectorSize() == 2 && arg0->getType().getQualifier().getFormat() == ElfRg16f) || + (callNode.getType().getVectorSize() == 4 && arg0->getType().getQualifier().getFormat() == ElfRgba16f))) { + if (StartsWith(fnCandidate.getName(), "imageAtomicAdd") || + StartsWith(fnCandidate.getName(), "imageAtomicExchange") || + StartsWith(fnCandidate.getName(), "imageAtomicMin") || + StartsWith(fnCandidate.getName(), "imageAtomicMax")) { + requireExtensions(loc, 1, &E_GL_NV_shader_atomic_fp16_vector, fnCandidate.getName().c_str()); + } else { + error(loc, "f16vec2/4 operation not supported on: ", fnCandidate.getName().c_str(), ""); + } } else if (imageType.getSampler().type == EbtFloat) { - if (fnCandidate.getName().compare(0, 19, "imageAtomicExchange") == 0) { + if (StartsWith(fnCandidate.getName(), "imageAtomicExchange")) { // imageAtomicExchange doesn't require an extension - } else if ((fnCandidate.getName().compare(0, 14, "imageAtomicAdd") == 0) || - (fnCandidate.getName().compare(0, 15, "imageAtomicLoad") == 0) || - (fnCandidate.getName().compare(0, 16, "imageAtomicStore") == 0)) { + } else if (StartsWith(fnCandidate.getName(), "imageAtomicAdd") || + StartsWith(fnCandidate.getName(), "imageAtomicLoad") || + StartsWith(fnCandidate.getName(), "imageAtomicStore")) { requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str()); - } else if ((fnCandidate.getName().compare(0, 14, "imageAtomicMin") == 0) || - (fnCandidate.getName().compare(0, 14, "imageAtomicMax") == 0)) { + } else if (StartsWith(fnCandidate.getName(), "imageAtomicMin") || + StartsWith(fnCandidate.getName(), "imageAtomicMax")) { requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str()); } else { error(loc, "only supported on integer images", fnCandidate.getName().c_str(), ""); @@ -2438,6 +2602,11 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan const char* const extensions[2] = { E_GL_NV_shader_atomic_int64, E_GL_EXT_shader_atomic_int64 }; requireExtensions(loc, 2, extensions, fnCandidate.getName().c_str()); + } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange || + callNode.getOp() == EOpAtomicMin || callNode.getOp() == EOpAtomicMax) && + arg0->getType().getBasicType() == EbtFloat16 && + (arg0->getType().getVectorSize() == 2 || arg0->getType().getVectorSize() == 4 )) { + requireExtensions(loc, 1, &E_GL_NV_shader_atomic_fp16_vector, fnCandidate.getName().c_str()); } else if ((callNode.getOp() == EOpAtomicAdd || callNode.getOp() == EOpAtomicExchange) && (arg0->getType().getBasicType() == EbtFloat || arg0->getType().getBasicType() == EbtDouble)) { @@ -2449,12 +2618,19 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str()); } - const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true , true); - const TType* refType = (base->getType().isReference()) ? base->getType().getReferentType() : nullptr; - const TQualifier& qualifier = (refType != nullptr) ? refType->getQualifier() : base->getType().getQualifier(); - if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer) - error(loc,"Atomic memory function can only be used for shader storage block member or shared variable.", - fnCandidate.getName().c_str(), ""); + const TIntermTyped* base = TIntermediate::traverseLValueBase(arg0, true, true); + const char* errMsg = "Only l-values corresponding to shader block storage or shared variables can be used with " + "atomic memory functions."; + if (base) { + const TType* refType = (base->getType().isReference()) ? base->getType().getReferentType() : nullptr; + const TQualifier& qualifier = + (refType != nullptr) ? refType->getQualifier() : base->getType().getQualifier(); + if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer && + qualifier.storage != EvqtaskPayloadSharedEXT) + error(loc, errMsg, fnCandidate.getName().c_str(), ""); + } else { + error(loc, errMsg, fnCandidate.getName().c_str(), ""); + } break; } @@ -2462,20 +2638,57 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan case EOpInterpolateAtCentroid: case EOpInterpolateAtSample: case EOpInterpolateAtOffset: - case EOpInterpolateAtVertex: - // Make sure the first argument is an interpolant, or an array element of an interpolant + case EOpInterpolateAtVertex: { if (arg0->getType().getQualifier().storage != EvqVaryingIn) { - // It might still be an array element. + // Traverse down the left branch of arg0 to ensure this argument is a valid interpolant. // - // We could check more, but the semantics of the first argument are already met; the - // only way to turn an array into a float/vec* is array dereference and swizzle. + // For desktop GL >4.3 we effectively only need to ensure that arg0 represents an l-value from an + // input declaration. // - // ES and desktop 4.3 and earlier: swizzles may not be used - // desktop 4.4 and later: swizzles may be used - bool swizzleOkay = (!isEsProfile()) && (version >= 440); - const TIntermTyped* base = TIntermediate::findLValueBase(arg0, swizzleOkay); - if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn) - error(loc, "first argument must be an interpolant, or interpolant-array element", fnCandidate.getName().c_str(), ""); + // For desktop GL <= 4.3 and ES, we must also ensure that swizzling is not used + // + // For ES, we must also ensure that a field selection operator (i.e., '.') is not used on a named + // struct. + + const bool esProfile = isEsProfile(); + const bool swizzleOkay = !esProfile && (version >= 440); + + std::string interpolantErrorMsg = "first argument must be an interpolant, or interpolant-array element"; + bool isValid = true; // Assume that the interpolant is valid until we find a condition making it invalid + bool isIn = false; // Checks whether or not the interpolant is a shader input + bool structAccessOp = false; // Whether or not the previous node in the chain is a struct accessor + TIntermediate::traverseLValueBase( + arg0, swizzleOkay, false, + [&isValid, &isIn, &interpolantErrorMsg, esProfile, &structAccessOp](const TIntermNode& n) -> bool { + auto* type = n.getAsTyped(); + if (type) { + if (type->getType().getQualifier().storage == EvqVaryingIn) { + isIn = true; + } + // If a field accessor was used, it can only be used to access a field with an input block, not a struct. + if (structAccessOp && (type->getType().getBasicType() != EbtBlock)) { + interpolantErrorMsg += + ". Using the field of a named struct as an interpolant argument is not " + "allowed (ES-only)."; + isValid = false; + } + } + + // ES has different requirements for interpolants than GL + if (esProfile) { + // Swizzling will be taken care of by the 'swizzleOkay' argument passsed to traverseLValueBase, + // so we only ned to check whether or not a field accessor has been used with a named struct. + auto* binary = n.getAsBinaryNode(); + if (binary && (binary->getOp() == EOpIndexDirectStruct)) { + structAccessOp = true; + } + } + // Don't continue traversing if we know we have an invalid interpolant at this point. + return isValid; + }); + if (!isIn || !isValid) { + error(loc, interpolantErrorMsg.c_str(), fnCandidate.getName().c_str(), ""); + } } if (callNode.getOp() == EOpInterpolateAtVertex) { @@ -2491,10 +2704,12 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } } } - break; + } break; case EOpEmitStreamVertex: case EOpEndStreamPrimitive: + if (version == 150) + requireExtensions(loc, 1, &E_GL_ARB_gpu_shader5, "if the version is 150 , the EmitStreamVertex and EndStreamPrimitive only support at extension GL_ARB_gpu_shader5"); intermediate.setMultiStream(); break; @@ -2548,7 +2763,7 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } if (profile != EEsProfile && version < 450) { - if ((*argp)[0]->getAsTyped()->getBasicType() != EbtFloat && + if ((*argp)[0]->getAsTyped()->getBasicType() != EbtFloat && (*argp)[0]->getAsTyped()->getBasicType() != EbtDouble && (*argp)[1]->getAsTyped()->getBasicType() != EbtFloat && (*argp)[1]->getAsTyped()->getBasicType() != EbtDouble && @@ -2558,7 +2773,6 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } break; -#endif default: break; @@ -2597,32 +2811,30 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan // Check that if extended types are being used that the correct extensions are enabled. if (arg0 != nullptr) { const TType& type = arg0->getType(); + bool enhanced = intermediate.getEnhancedMsgs(); switch (type.getBasicType()) { default: break; case EbtInt8: case EbtUint8: - requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int8, type.getCompleteString().c_str()); + requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int8, type.getCompleteString(enhanced).c_str()); break; case EbtInt16: case EbtUint16: - requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int16, type.getCompleteString().c_str()); + requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int16, type.getCompleteString(enhanced).c_str()); break; case EbtInt64: case EbtUint64: - requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int64, type.getCompleteString().c_str()); + requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int64, type.getCompleteString(enhanced).c_str()); break; case EbtFloat16: - requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_float16, type.getCompleteString().c_str()); + requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_float16, type.getCompleteString(enhanced).c_str()); break; } } } } -#ifndef GLSLANG_WEB - -extern bool PureOperatorBuiltins; // Deprecated! Use PureOperatorBuiltins == true instead, in which case this // functionality is handled in builtInOpCheck() instead of here. @@ -2748,8 +2960,6 @@ void TParseContext::nonOpBuiltInCheck(const TSourceLoc& loc, const TFunction& fn } } -#endif - // // Do any extra checking for a user function call. // @@ -2783,10 +2993,21 @@ TFunction* TParseContext::handleConstructorCall(const TSourceLoc& loc, const TPu profileRequires(loc, EEsProfile, 300, nullptr, "arrayed constructor"); } + // Reuse EOpConstructTextureSampler for bindless image constructor + // uvec2 imgHandle; + // imageLoad(image1D(imgHandle), 0); + if (type.isImage() && extensionTurnedOn(E_GL_ARB_bindless_texture)) + { + intermediate.setBindlessImageMode(currentCaller, AstRefTypeFunc); + } + TOperator op = intermediate.mapTypeToConstructorOp(type); if (op == EOpNull) { - error(loc, "cannot construct this type", type.getBasicString(), ""); + if (intermediate.getEnhancedMsgs() && type.getBasicType() == EbtSampler) + error(loc, "function not supported in this version; use texture() instead", "texture*D*", ""); + else + error(loc, "cannot construct this type", type.getBasicString(), ""); op = EOpConstructFloat; TType errorType(EbtFloat); type.shallowCopy(errorType); @@ -2897,7 +3118,6 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt bool errorReturn = false; switch(binaryNode->getOp()) { -#ifndef GLSLANG_WEB case EOpIndexDirect: case EOpIndexIndirect: // ... tessellation control shader ... @@ -2914,7 +3134,6 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt } } break; // left node is checked by base class -#endif case EOpVectorSwizzle: errorReturn = lValueErrorCheck(loc, op, binaryNode->getLeft()); if (!errorReturn) { @@ -2972,7 +3191,17 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt if (isEsProfile() && intermediate.getEarlyFragmentTests()) message = "can't modify gl_FragDepth if using early_fragment_tests"; break; + case EvqFragStencil: + intermediate.setStencilReplacing(); + // "In addition, it is an error to statically write to gl_FragDepth in the fragment shader." + if (isEsProfile() && intermediate.getEarlyFragmentTests()) + message = "can't modify EvqFragStencil if using early_fragment_tests"; + break; + case EvqtaskPayloadSharedEXT: + if (language == EShLangMesh) + message = "can't modify variable with storage qualifier taskPayloadSharedEXT in mesh shaders"; + break; default: break; } @@ -3011,7 +3240,7 @@ void TParseContext::rValueErrorCheck(const TSourceLoc& loc, const char* op, TInt if (symNode && symNode->getQualifier().isExplicitInterpolation()) error(loc, "can't read from explicitly-interpolated object: ", op, symNode->getName().c_str()); - // local_size_{xyz} must be assigned or specialized before gl_WorkGroupSize can be assigned. + // local_size_{xyz} must be assigned or specialized before gl_WorkGroupSize can be assigned. if(node->getQualifier().builtIn == EbvWorkGroupSize && !(intermediate.isLocalSizeSet() || intermediate.isLocalSizeSpecialized())) error(loc, "can't read from gl_WorkGroupSize before a fixed workgroup size has been declared", op, ""); @@ -3029,11 +3258,14 @@ void TParseContext::constantValueCheck(TIntermTyped* node, const char* token) // // Both test, and if necessary spit out an error, to see if the node is really -// an integer. +// a 32-bit integer or can implicitly convert to one. // void TParseContext::integerCheck(const TIntermTyped* node, const char* token) { - if ((node->getBasicType() == EbtInt || node->getBasicType() == EbtUint) && node->isScalar()) + auto from_type = node->getBasicType(); + if ((from_type == EbtInt || from_type == EbtUint || + intermediate.canImplicitlyPromote(from_type, EbtInt, EOpNull) || + intermediate.canImplicitlyPromote(from_type, EbtUint, EOpNull)) && node->isScalar()) return; error(node->getLoc(), "scalar integer expression required", token, ""); @@ -3096,7 +3328,7 @@ void TParseContext::reservedPpErrorCheck(const TSourceLoc& loc, const char* iden ppWarn(loc, "\"defined\" is (un)defined:", op, identifier); else ppError(loc, "\"defined\" can't be (un)defined:", op, identifier); - else if (strstr(identifier, "__") != 0 && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) { + else if (strstr(identifier, "__") != nullptr && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) { // The extension GL_EXT_spirv_intrinsics allows us to declare macros prefixed with "__". if (isEsProfile() && version >= 300 && (strcmp(identifier, "__LINE__") == 0 || @@ -3119,10 +3351,6 @@ void TParseContext::reservedPpErrorCheck(const TSourceLoc& loc, const char* iden // bool TParseContext::lineContinuationCheck(const TSourceLoc& loc, bool endOfComment) { -#ifdef GLSLANG_WEB - return true; -#endif - const char* message = "line continuation"; bool lineContinuationAllowed = (isEsProfile() && version >= 300) || @@ -3179,7 +3407,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T // it, in which case the type comes from the argument instead of from the // constructor function. switch (op) { -#ifndef GLSLANG_WEB case EOpConstructNonuniform: if (node != nullptr && node->getAsTyped() != nullptr) { type.shallowCopy(node->getAsTyped()->getType()); @@ -3187,12 +3414,17 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T type.getQualifier().nonUniform = true; } break; -#endif default: type.shallowCopy(function.getType()); break; } + TString constructorString; + if (intermediate.getEnhancedMsgs()) + constructorString.append(type.getCompleteString(true, false, false, true)).append(" constructor"); + else + constructorString.append("constructor"); + // See if it's a matrix bool constructingMatrix = false; switch (op) { @@ -3207,7 +3439,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructMat4x2: case EOpConstructMat4x3: case EOpConstructMat4x4: -#ifndef GLSLANG_WEB case EOpConstructDMat2x2: case EOpConstructDMat2x3: case EOpConstructDMat2x4: @@ -3226,7 +3457,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructF16Mat4x2: case EOpConstructF16Mat4x3: case EOpConstructF16Mat4x4: -#endif constructingMatrix = true; break; default: @@ -3250,7 +3480,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T if (function[arg].type->isArray()) { if (function[arg].type->isUnsizedArray()) { // Can't construct from an unsized array. - error(loc, "array argument must be sized", "constructor", ""); + error(loc, "array argument must be sized", constructorString.c_str(), ""); return true; } arrayArg = true; @@ -3280,29 +3510,28 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T intArgument = true; if (type.isStruct()) { if (function[arg].type->contains16BitFloat()) { - requireFloat16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type"); + requireFloat16Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 16-bit type"); } if (function[arg].type->contains16BitInt()) { - requireInt16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type"); + requireInt16Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 16-bit type"); } if (function[arg].type->contains8BitInt()) { - requireInt8Arithmetic(loc, "constructor", "can't construct structure containing 8-bit type"); + requireInt8Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 8-bit type"); } } } if (op == EOpConstructNonuniform) constType = false; -#ifndef GLSLANG_WEB switch (op) { case EOpConstructFloat16: case EOpConstructF16Vec2: case EOpConstructF16Vec3: case EOpConstructF16Vec4: if (type.isArray()) - requireFloat16Arithmetic(loc, "constructor", "16-bit arrays not supported"); + requireFloat16Arithmetic(loc, constructorString.c_str(), "16-bit arrays not supported"); if (type.isVector() && function.getParamCount() != 1) - requireFloat16Arithmetic(loc, "constructor", "16-bit vectors only take vector types"); + requireFloat16Arithmetic(loc, constructorString.c_str(), "16-bit vectors only take vector types"); break; case EOpConstructUint16: case EOpConstructU16Vec2: @@ -3313,9 +3542,9 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructI16Vec3: case EOpConstructI16Vec4: if (type.isArray()) - requireInt16Arithmetic(loc, "constructor", "16-bit arrays not supported"); + requireInt16Arithmetic(loc, constructorString.c_str(), "16-bit arrays not supported"); if (type.isVector() && function.getParamCount() != 1) - requireInt16Arithmetic(loc, "constructor", "16-bit vectors only take vector types"); + requireInt16Arithmetic(loc, constructorString.c_str(), "16-bit vectors only take vector types"); break; case EOpConstructUint8: case EOpConstructU8Vec2: @@ -3326,14 +3555,13 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructI8Vec3: case EOpConstructI8Vec4: if (type.isArray()) - requireInt8Arithmetic(loc, "constructor", "8-bit arrays not supported"); + requireInt8Arithmetic(loc, constructorString.c_str(), "8-bit arrays not supported"); if (type.isVector() && function.getParamCount() != 1) - requireInt8Arithmetic(loc, "constructor", "8-bit vectors only take vector types"); + requireInt8Arithmetic(loc, constructorString.c_str(), "8-bit vectors only take vector types"); break; default: break; } -#endif // inherit constness from children if (constType) { @@ -3354,7 +3582,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructUVec2: case EOpConstructUVec3: case EOpConstructUVec4: -#ifndef GLSLANG_WEB case EOpConstructUint8: case EOpConstructInt16: case EOpConstructUint16: @@ -3378,7 +3605,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructU64Vec2: case EOpConstructU64Vec3: case EOpConstructU64Vec4: -#endif // This was the list of valid ones, if they aren't converting from float // and aren't making an array. makeSpecConst = ! floatArgument && ! type.isArray(); @@ -3392,6 +3618,19 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T makeSpecConst = ! intArgument && !type.isArray(); break; + case EOpConstructCooperativeMatrixNV: + case EOpConstructCooperativeMatrixKHR: + case EOpConstructStruct: + { + const char *specConstantCompositeExt[] = { E_GL_EXT_spec_constant_composites }; + if (checkExtensionsRequested(loc, 1, specConstantCompositeExt, "spec constant aggregate constructor")) { + makeSpecConst = true; + } else { + makeSpecConst = false; + } + } + break; + default: // anything else wasn't white-listed in the spec as a conversion makeSpecConst = false; @@ -3410,7 +3649,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T if (type.isArray()) { if (function.getParamCount() == 0) { - error(loc, "array constructor must have at least one argument", "constructor", ""); + error(loc, "array constructor must have at least one argument", constructorString.c_str(), ""); return true; } @@ -3418,7 +3657,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T // auto adapt the constructor type to the number of arguments type.changeOuterArraySize(function.getParamCount()); } else if (type.getOuterArraySize() != function.getParamCount()) { - error(loc, "array constructor needs one argument per array element", "constructor", ""); + error(loc, "array constructor needs one argument per array element", constructorString.c_str(), ""); return true; } @@ -3431,7 +3670,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T // At least the dimensionalities have to match. if (! function[0].type->isArray() || arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) { - error(loc, "array constructor argument not correct type to construct array element", "constructor", ""); + error(loc, "array constructor argument not correct type to construct array element", constructorString.c_str(), ""); return true; } @@ -3448,7 +3687,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T } if (arrayArg && op != EOpConstructStruct && ! type.isArrayOfArrays()) { - error(loc, "constructing non-array constituent from array argument", "constructor", ""); + error(loc, "constructing non-array constituent from array argument", constructorString.c_str(), ""); return true; } @@ -3458,51 +3697,62 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T // "If a matrix argument is given to a matrix constructor, // it is a compile-time error to have any other arguments." if (function.getParamCount() != 1) - error(loc, "matrix constructed from matrix can only have one argument", "constructor", ""); + error(loc, "matrix constructed from matrix can only have one argument", constructorString.c_str(), ""); return false; } if (overFull) { - error(loc, "too many arguments", "constructor", ""); + error(loc, "too many arguments", constructorString.c_str(), ""); return true; } if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) { - error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", ""); + error(loc, "Number of constructor parameters does not match the number of structure fields", constructorString.c_str(), ""); return true; } if ((op != EOpConstructStruct && size != 1 && size < type.computeNumComponents()) || (op == EOpConstructStruct && size < type.computeNumComponents())) { - error(loc, "not enough data provided for construction", "constructor", ""); + error(loc, "not enough data provided for construction", constructorString.c_str(), ""); return true; } if (type.isCoopMat() && function.getParamCount() != 1) { - error(loc, "wrong number of arguments", "constructor", ""); + error(loc, "wrong number of arguments", constructorString.c_str(), ""); return true; } if (type.isCoopMat() && !(function[0].type->isScalar() || function[0].type->isCoopMat())) { - error(loc, "Cooperative matrix constructor argument must be scalar or cooperative matrix", "constructor", ""); + error(loc, "Cooperative matrix constructor argument must be scalar or cooperative matrix", constructorString.c_str(), ""); return true; } TIntermTyped* typed = node->getAsTyped(); + if (type.isCoopMat() && typed->getType().isCoopMat() && + !type.sameCoopMatShapeAndUse(typed->getType())) { + error(loc, "Cooperative matrix type parameters mismatch", constructorString.c_str(), ""); + return true; + } + if (typed == nullptr) { - error(loc, "constructor argument does not have a type", "constructor", ""); + error(loc, "constructor argument does not have a type", constructorString.c_str(), ""); return true; } if (op != EOpConstructStruct && op != EOpConstructNonuniform && typed->getBasicType() == EbtSampler) { - error(loc, "cannot convert a sampler", "constructor", ""); - return true; + if (op == EOpConstructUVec2 && extensionTurnedOn(E_GL_ARB_bindless_texture)) { + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeFunc); + } + else { + error(loc, "cannot convert a sampler", constructorString.c_str(), ""); + return true; + } } if (op != EOpConstructStruct && typed->isAtomic()) { - error(loc, "cannot convert an atomic_uint", "constructor", ""); + error(loc, "cannot convert an atomic_uint", constructorString.c_str(), ""); return true; } if (typed->getBasicType() == EbtVoid) { - error(loc, "cannot convert a void", "constructor", ""); + error(loc, "cannot convert a void", constructorString.c_str(), ""); return true; } @@ -3515,6 +3765,26 @@ bool TParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const { TString constructorName = function.getType().getBasicTypeString(); // TODO: performance: should not be making copy; interface needs to change const char* token = constructorName.c_str(); + // verify the constructor for bindless texture, the input must be ivec2 or uvec2 + if (function.getParamCount() == 1) { + TType* pType = function[0].type; + TBasicType basicType = pType->getBasicType(); + bool isIntegerVec2 = ((basicType == EbtUint || basicType == EbtInt) && pType->getVectorSize() == 2); + bool bindlessMode = extensionTurnedOn(E_GL_ARB_bindless_texture); + if (isIntegerVec2 && bindlessMode) { + if (pType->getSampler().isImage()) + intermediate.setBindlessImageMode(currentCaller, AstRefTypeFunc); + else + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeFunc); + return false; + } else { + if (!bindlessMode) + error(loc, "sampler-constructor requires the extension GL_ARB_bindless_texture enabled", token, ""); + else + error(loc, "sampler-constructor requires the input to be ivec2 or uvec2", token, ""); + return true; + } + } // exactly two arguments needed if (function.getParamCount() != 2) { @@ -3610,18 +3880,38 @@ void TParseContext::samplerCheck(const TSourceLoc& loc, const TType& type, const if (type.getQualifier().storage == EvqUniform) return; - if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtSampler)) - error(loc, "non-uniform struct contains a sampler or image:", type.getBasicTypeString().c_str(), identifier.c_str()); + if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtSampler)) { + // For bindless texture, sampler can be declared as an struct member + if (extensionTurnedOn(E_GL_ARB_bindless_texture)) { + if (type.getSampler().isImage()) + intermediate.setBindlessImageMode(currentCaller, AstRefTypeVar); + else + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeVar); + } + else { + error(loc, "non-uniform struct contains a sampler or image:", type.getBasicTypeString().c_str(), identifier.c_str()); + } + } else if (type.getBasicType() == EbtSampler && type.getQualifier().storage != EvqUniform) { - // non-uniform sampler - // not yet: okay if it has an initializer - // if (! initializer) - error(loc, "sampler/image types can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str()); + // For bindless texture, sampler can be declared as an input/output/block member + if (extensionTurnedOn(E_GL_ARB_bindless_texture)) { + if (type.getSampler().isImage()) + intermediate.setBindlessImageMode(currentCaller, AstRefTypeVar); + else + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeVar); + } + else { + // non-uniform sampler + // not yet: okay if it has an initializer + // if (! initializer) + if (type.getSampler().isAttachmentEXT() && type.getQualifier().storage != EvqTileImageEXT) + error(loc, "can only be used in tileImageEXT variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str()); + else if (type.getQualifier().storage != EvqTileImageEXT) + error(loc, "sampler/image types can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str()); + } } } -#ifndef GLSLANG_WEB - void TParseContext::atomicUintCheck(const TSourceLoc& loc, const TType& type, const TString& identifier) { if (type.getQualifier().storage == EvqUniform) @@ -3646,8 +3936,6 @@ void TParseContext::accStructCheck(const TSourceLoc& loc, const TType& type, con } -#endif // GLSLANG_WEB - void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier) { if (parsingBuiltins) @@ -3682,7 +3970,7 @@ void TParseContext::memberQualifierCheck(glslang::TPublicType& publicType) // // Check/fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level. // -void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier, bool isMemberCheck) +void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier, bool isMemberCheck, const TPublicType* publicType) { bool nonuniformOkay = false; @@ -3718,6 +4006,11 @@ void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& q { requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "default std430 layout for uniform"); } + + if (publicType != nullptr && publicType->isImage() && + (qualifier.layoutFormat > ElfExtSizeGuard && qualifier.layoutFormat < ElfCount)) + qualifier.layoutFormat = mapLegacyLayoutFormat(qualifier.layoutFormat, publicType->sampler.getBasicType()); + break; default: break; @@ -3726,17 +4019,27 @@ void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& q if (!nonuniformOkay && qualifier.isNonUniform()) error(loc, "for non-parameter, can only apply to 'in' or no storage qualifier", "nonuniformEXT", ""); -#ifndef GLSLANG_WEB if (qualifier.isSpirvByReference()) error(loc, "can only apply to parameter", "spirv_by_reference", ""); if (qualifier.isSpirvLiteral()) error(loc, "can only apply to parameter", "spirv_literal", ""); -#endif // Storage qualifier isn't ready for memberQualifierCheck, we should skip invariantCheck for it. if (!isMemberCheck || structNestingLevel > 0) invariantCheck(loc, qualifier); + + if (qualifier.isFullQuads()) { + if (qualifier.storage != EvqVaryingIn) + error(loc, "can only apply to input layout", "full_quads ", ""); + intermediate.setReqFullQuadsMode(); + } + + if (qualifier.isQuadDeriv()) { + if (qualifier.storage != EvqVaryingIn) + error(loc, "can only apply to input layout", "quad_derivatives", ""); + intermediate.setQuadDerivMode(); + } } // @@ -3778,10 +4081,12 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali return; } - if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble) - profileRequires(loc, EEsProfile, 300, nullptr, "shader input/output"); + if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble) { + profileRequires(loc, EEsProfile, 300, nullptr, "non-float shader input/output"); + profileRequires(loc, ~EEsProfile, 130, nullptr, "non-float shader input/output"); + } - if (!qualifier.flat && !qualifier.isExplicitInterpolation() && !qualifier.isPervertexNV()) { + if (!qualifier.flat && !qualifier.isExplicitInterpolation() && !qualifier.isPervertexNV() && !qualifier.isPervertexEXT()) { if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble || (publicType.userDef && ( publicType.userDef->containsBasicType(EbtInt) @@ -3800,6 +4105,9 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali if (qualifier.isPatch() && qualifier.isInterpolation()) error(loc, "cannot use interpolation qualifiers with patch", "patch", ""); + if (qualifier.isTaskPayload() && publicType.basicType == EbtBlock) + error(loc, "taskPayloadSharedEXT variables should not be declared as interface blocks", "taskPayloadSharedEXT", ""); + if (qualifier.isTaskMemory() && publicType.basicType != EbtBlock) error(loc, "taskNV variables can be declared only as blocks", "taskNV", ""); @@ -3807,7 +4115,7 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali switch (language) { case EShLangVertex: if (publicType.basicType == EbtStruct) { - error(loc, "cannot be a structure or array", GetStorageQualifierString(qualifier.storage), ""); + error(loc, "cannot be a structure", GetStorageQualifierString(qualifier.storage), ""); return; } if (publicType.arraySizes) { @@ -3833,12 +4141,10 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali if (! symbolTable.atBuiltInLevel()) error(loc, "global storage input qualifier cannot be used in a compute shader", "in", ""); break; -#ifndef GLSLANG_WEB case EShLangTessControl: if (qualifier.patch) error(loc, "can only use on output in tessellation-control shader", "patch", ""); break; -#endif default: break; } @@ -3877,12 +4183,10 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali case EShLangCompute: error(loc, "global storage output qualifier cannot be used in a compute shader", "out", ""); break; -#ifndef GLSLANG_WEB case EShLangTessEvaluation: if (qualifier.patch) error(loc, "can only use on input in tessellation-evaluation shader", "patch", ""); break; -#endif default: break; } @@ -3950,17 +4254,16 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons if (dst.precision == EpqNone || (force && src.precision != EpqNone)) dst.precision = src.precision; -#ifndef GLSLANG_WEB if (!force && ((src.coherent && (dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) || (src.devicecoherent && (dst.coherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) || (src.queuefamilycoherent && (dst.coherent || dst.devicecoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) || (src.workgroupcoherent && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.subgroupcoherent || dst.shadercallcoherent)) || (src.subgroupcoherent && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.shadercallcoherent)) || (src.shadercallcoherent && (dst.coherent || dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent)))) { - error(loc, "only one coherent/devicecoherent/queuefamilycoherent/workgroupcoherent/subgroupcoherent/shadercallcoherent qualifier allowed", + error(loc, "only one coherent/devicecoherent/queuefamilycoherent/workgroupcoherent/subgroupcoherent/shadercallcoherent qualifier allowed", GetPrecisionQualifierString(src.precision), ""); } -#endif + // Layout qualifiers mergeObjectLayoutQualifiers(dst, src, false); @@ -3972,7 +4275,6 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons MERGE_SINGLETON(smooth); MERGE_SINGLETON(flat); MERGE_SINGLETON(specConstant); -#ifndef GLSLANG_WEB MERGE_SINGLETON(noContraction); MERGE_SINGLETON(nopersp); MERGE_SINGLETON(explicitInterp); @@ -3993,15 +4295,13 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons MERGE_SINGLETON(readonly); MERGE_SINGLETON(writeonly); MERGE_SINGLETON(nonUniform); -#endif -#ifndef GLSLANG_WEB // SPIR-V storage class qualifier (GL_EXT_spirv_intrinsics) dst.spirvStorageClass = src.spirvStorageClass; // SPIR-V decorate qualifiers (GL_EXT_spirv_intrinsics) - if (src.hasSprivDecorate()) { - if (dst.hasSprivDecorate()) { + if (src.hasSpirvDecorate()) { + if (dst.hasSpirvDecorate()) { const TSpirvDecorate& srcSpirvDecorate = src.getSpirvDecorate(); TSpirvDecorate& dstSpirvDecorate = dst.getSpirvDecorate(); for (auto& decorate : srcSpirvDecorate.decorates) { @@ -4022,13 +4322,12 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons if (dstSpirvDecorate.decorates.find(decorateString.first) != dstSpirvDecorate.decorates.end()) error(loc, "too many SPIR-V decorate qualifiers", "spirv_decorate_string", "(decoration=%u)", decorateString.first); else - dstSpirvDecorate.decorates.insert(decorateString); + dstSpirvDecorate.decorateStrings.insert(decorateString); } } else { dst.spirvDecorate = src.spirvDecorate; } } -#endif if (repeated) error(loc, "replicated qualifiers", "", ""); @@ -4092,17 +4391,18 @@ TPrecisionQualifier TParseContext::getDefaultPrecision(TPublicType& publicType) return defaultPrecision[publicType.basicType]; } -void TParseContext::precisionQualifierCheck(const TSourceLoc& loc, TBasicType baseType, TQualifier& qualifier) +void TParseContext::precisionQualifierCheck(const TSourceLoc& loc, TBasicType baseType, TQualifier& qualifier, bool isCoopMat) { // Built-in symbols are allowed some ambiguous precisions, to be pinned down // later by context. if (! obeyPrecisionQualifiers() || parsingBuiltins) return; -#ifndef GLSLANG_WEB if (baseType == EbtAtomicUint && qualifier.precision != EpqNone && qualifier.precision != EpqHigh) error(loc, "atomic counters can only be highp", "atomic_uint", ""); -#endif + + if (isCoopMat) + return; if (baseType == EbtFloat || baseType == EbtUint || baseType == EbtInt || baseType == EbtSampler || baseType == EbtAtomicUint) { if (qualifier.precision == EpqNone) { @@ -4119,7 +4419,7 @@ void TParseContext::precisionQualifierCheck(const TSourceLoc& loc, TBasicType ba void TParseContext::parameterTypeCheck(const TSourceLoc& loc, TStorageQualifier qualifier, const TType& type) { - if ((qualifier == EvqOut || qualifier == EvqInOut) && type.isOpaque()) + if ((qualifier == EvqOut || qualifier == EvqInOut) && type.isOpaque() && !intermediate.getBindlessMode()) error(loc, "samplers and atomic_uints cannot be output parameters", type.getBasicTypeString().c_str(), ""); if (!parsingBuiltins && type.contains16BitFloat()) requireFloat16Arithmetic(loc, type.getBasicTypeString().c_str(), "float16 types can only be in uniform block or buffer storage"); @@ -4148,7 +4448,8 @@ bool TParseContext::containsFieldWithBasicType(const TType& type, TBasicType bas // // Do size checking for an array type's size. // -void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TArraySize& sizePair, const char *sizeType) +void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TArraySize& sizePair, + const char* sizeType, const bool allowZero) { bool isConst = false; sizePair.node = nullptr; @@ -4168,9 +4469,8 @@ void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TA TIntermSymbol* symbol = expr->getAsSymbolNode(); if (symbol && symbol->getConstArray().size() > 0) size = symbol->getConstArray()[0].getIConst(); - } else if (expr->getAsUnaryNode() && - expr->getAsUnaryNode()->getOp() == glslang::EOpArrayLength && - expr->getAsUnaryNode()->getOperand()->getType().isCoopMat()) { + } else if (expr->getAsUnaryNode() && expr->getAsUnaryNode()->getOp() == glslang::EOpArrayLength && + expr->getAsUnaryNode()->getOperand()->getType().isCoopMatNV()) { isConst = true; size = 1; sizePair.node = expr->getAsUnaryNode(); @@ -4184,9 +4484,16 @@ void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TA return; } - if (size <= 0) { - error(loc, sizeType, "", "must be a positive integer"); - return; + if (allowZero) { + if (size < 0) { + error(loc, sizeType, "", "must be a non-negative integer"); + return; + } + } else { + if (size <= 0) { + error(loc, sizeType, "", "must be a positive integer"); + return; + } } } @@ -4284,8 +4591,6 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua (qualifier.storage != EvqTemporary && qualifier.storage != EvqGlobal && qualifier.storage != EvqShared && qualifier.storage != EvqConst)) error(loc, "only outermost dimension of an array of arrays can be a specialization constant", "[]", ""); -#ifndef GLSLANG_WEB - // desktop always allows outer-dimension-unsized variable arrays, if (!isEsProfile()) return; @@ -4315,18 +4620,16 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader)) return; break; - case EShLangMeshNV: + case EShLangMesh: if (qualifier.storage == EvqVaryingOut) if ((isEsProfile() && version >= 320) || - extensionTurnedOn(E_GL_NV_mesh_shader)) + extensionsTurnedOn(Num_AEP_mesh_shader, AEP_mesh_shader)) return; break; default: break; } -#endif - // last member of ssbo block exception: if (qualifier.storage == EvqBuffer && lastMember) return; @@ -4371,7 +4674,6 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie if (symbolTable.atGlobalLevel()) trackLinkage(*symbol); -#ifndef GLSLANG_WEB if (! symbolTable.atBuiltInLevel()) { if (isIoResizeArray(type)) { ioArraySymbolResizeList.push_back(symbol); @@ -4379,7 +4681,6 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie } else fixIoArraySize(loc, symbol->getWritableType()); } -#endif return; } @@ -4417,7 +4718,6 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie return; } -#ifndef GLSLANG_WEB if (existingType.isSizedArray()) { // be more leniant for input arrays to geometry shaders and tessellation control outputs, where the redeclaration is the same size if (! (isIoResizeArray(type) && existingType.getOuterArraySize() == type.getOuterArraySize())) @@ -4431,11 +4731,8 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie if (isIoResizeArray(type)) checkIoArraysConsistency(loc); -#endif } -#ifndef GLSLANG_WEB - // Policy and error check for needing a runtime sized array. void TParseContext::checkRuntimeSizable(const TSourceLoc& loc, const TIntermTyped& base) { @@ -4463,7 +4760,7 @@ void TParseContext::checkRuntimeSizable(const TSourceLoc& loc, const TIntermType // check for additional things allowed by GL_EXT_nonuniform_qualifier if (base.getBasicType() == EbtSampler || base.getBasicType() == EbtAccStruct || base.getBasicType() == EbtRayQuery || - (base.getBasicType() == EbtBlock && base.getType().getQualifier().isUniformOrBuffer())) + base.getBasicType() == EbtHitObjectNV || (base.getBasicType() == EbtBlock && base.getType().getQualifier().isUniformOrBuffer())) requireExtensions(loc, 1, &E_GL_EXT_nonuniform_qualifier, "variable index"); else error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable"); @@ -4518,8 +4815,6 @@ void TParseContext::checkAndResizeMeshViewDim(const TSourceLoc& loc, TType& type } } -#endif // GLSLANG_WEB - // Returns true if the first argument to the #line directive is the line number for the next line. // // Desktop, pre-version 3.30: "After processing this directive @@ -4562,7 +4857,6 @@ void TParseContext::nonInitConstCheck(const TSourceLoc& loc, TString& identifier TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TString& identifier, const TQualifier& qualifier, const TShaderQualifiers& publicType) { -#ifndef GLSLANG_WEB if (! builtInName(identifier) || symbolTable.atBuiltInLevel() || ! symbolTable.atGlobalLevel()) return nullptr; @@ -4586,7 +4880,7 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS if (ssoPre150 || (identifier == "gl_FragDepth" && ((nonEsRedecls && version >= 420) || esRedecls)) || - (identifier == "gl_FragCoord" && ((nonEsRedecls && version >= 150) || esRedecls)) || + (identifier == "gl_FragCoord" && ((nonEsRedecls && version >= 140) || esRedecls)) || identifier == "gl_ClipDistance" || identifier == "gl_CullDistance" || identifier == "gl_ShadingRateEXT" || @@ -4602,6 +4896,9 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS identifier == "gl_SampleMask" || identifier == "gl_Layer" || identifier == "gl_PrimitiveIndicesNV" || + identifier == "gl_PrimitivePointIndicesEXT" || + identifier == "gl_PrimitiveLineIndicesEXT" || + identifier == "gl_PrimitiveTriangleIndicesEXT" || identifier == "gl_TexCoord") { // Find the existing symbol, if any. @@ -4655,7 +4952,7 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS symbolQualifier.storage != qualifier.storage) error(loc, "cannot change qualification of", "redeclaration", symbol->getName().c_str()); } else if (identifier == "gl_FragCoord") { - if (intermediate.inIoAccessed("gl_FragCoord")) + if (!intermediate.getTexCoordRedeclared() && intermediate.inIoAccessed("gl_FragCoord")) error(loc, "cannot redeclare after use", "gl_FragCoord", ""); if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat || qualifier.isMemory() || qualifier.isAuxiliary()) @@ -4665,6 +4962,9 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS if (! builtIn && (publicType.pixelCenterInteger != intermediate.getPixelCenterInteger() || publicType.originUpperLeft != intermediate.getOriginUpperLeft())) error(loc, "cannot redeclare with different qualification:", "redeclaration", symbol->getName().c_str()); + + + intermediate.setTexCoordRedeclared(); if (publicType.pixelCenterInteger) intermediate.setPixelCenterInteger(); if (publicType.originUpperLeft) @@ -4681,10 +4981,22 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS if (! intermediate.setDepth(publicType.layoutDepth)) error(loc, "all redeclarations must use the same depth layout on", "redeclaration", symbol->getName().c_str()); } + } else if (identifier == "gl_FragStencilRefARB") { + if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat || + qualifier.isMemory() || qualifier.isAuxiliary()) + error(loc, "can only change layout qualification of", "redeclaration", symbol->getName().c_str()); + if (qualifier.storage != EvqVaryingOut) + error(loc, "cannot change output storage qualification of", "redeclaration", symbol->getName().c_str()); + if (publicType.layoutStencil != ElsNone) { + if (intermediate.inIoAccessed("gl_FragStencilRefARB")) + error(loc, "cannot redeclare after use", "gl_FragStencilRefARB", ""); + if (!intermediate.setStencil(publicType.layoutStencil)) + error(loc, "all redeclarations must use the same stencil layout on", "redeclaration", + symbol->getName().c_str()); + } } else if ( - identifier == "gl_PrimitiveIndicesNV" || - identifier == "gl_FragStencilRefARB") { + identifier == "gl_PrimitiveIndicesNV") { if (qualifier.hasLayout()) error(loc, "cannot apply layout qualifier to", "redeclaration", symbol->getName().c_str()); if (qualifier.storage != EvqVaryingOut) @@ -4707,7 +5019,6 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS return symbol; } -#endif return nullptr; } @@ -4719,13 +5030,13 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newTypeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes) { -#ifndef GLSLANG_WEB const char* feature = "built-in block redeclaration"; profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature); profileRequires(loc, ~EEsProfile, 410, E_GL_ARB_separate_shader_objects, feature); if (blockName != "gl_PerVertex" && blockName != "gl_PerFragment" && - blockName != "gl_MeshPerVertexNV" && blockName != "gl_MeshPerPrimitiveNV") { + blockName != "gl_MeshPerVertexNV" && blockName != "gl_MeshPerPrimitiveNV" && + blockName != "gl_MeshPerVertexEXT" && blockName != "gl_MeshPerPrimitiveEXT") { error(loc, "cannot redeclare block: ", "block declaration", blockName.c_str()); return; } @@ -4934,7 +5245,6 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT // Save it in the AST for linker use. trackLinkage(*block); -#endif // GLSLANG_WEB } void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type) @@ -4947,6 +5257,7 @@ void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQu case EvqIn: case EvqOut: case EvqInOut: + case EvqTileImageEXT: type.getQualifier().storage = qualifier; break; case EvqGlobal: @@ -4962,7 +5273,6 @@ void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQu void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& qualifier, TType& type) { -#ifndef GLSLANG_WEB if (qualifier.isMemory()) { type.getQualifier().volatil = qualifier.volatil; type.getQualifier().coherent = qualifier.coherent; @@ -4976,7 +5286,6 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali type.getQualifier().writeonly = qualifier.writeonly; type.getQualifier().restrict = qualifier.restrict; } -#endif if (qualifier.isAuxiliary() || qualifier.isInterpolation()) @@ -4993,7 +5302,6 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali } if (qualifier.isNonUniform()) type.getQualifier().nonUniform = qualifier.nonUniform; -#ifndef GLSLANG_WEB if (qualifier.isSpirvByReference()) type.getQualifier().setSpirvByReference(); if (qualifier.isSpirvLiteral()) { @@ -5002,7 +5310,6 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali type.getQualifier().setSpirvLiteral(); else error(loc, "cannot use spirv_literal qualifier", type.getBasicTypeString().c_str(), ""); -#endif } paramCheckFixStorage(loc, qualifier.storage, type); @@ -5033,21 +5340,18 @@ void TParseContext::arrayObjectCheck(const TSourceLoc& loc, const TType& type, c void TParseContext::opaqueCheck(const TSourceLoc& loc, const TType& type, const char* op) { - if (containsFieldWithBasicType(type, EbtSampler)) + if (containsFieldWithBasicType(type, EbtSampler) && !extensionTurnedOn(E_GL_ARB_bindless_texture)) error(loc, "can't use with samplers or structs containing samplers", op, ""); } void TParseContext::referenceCheck(const TSourceLoc& loc, const TType& type, const char* op) { -#ifndef GLSLANG_WEB if (containsFieldWithBasicType(type, EbtReference)) error(loc, "can't use with reference types", op, ""); -#endif } void TParseContext::storage16BitAssignmentCheck(const TSourceLoc& loc, const TType& type, const char* op) { -#ifndef GLSLANG_WEB if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtFloat16)) requireFloat16Arithmetic(loc, op, "can't use with structs containing float16"); @@ -5077,7 +5381,6 @@ void TParseContext::storage16BitAssignmentCheck(const TSourceLoc& loc, const TTy if (type.isArray() && type.getBasicType() == EbtUint8) requireInt8Arithmetic(loc, op, "can't use with arrays containing uint8"); -#endif } void TParseContext::specializationCheck(const TSourceLoc& loc, const TType& type, const char* op) @@ -5129,12 +5432,11 @@ void TParseContext::structTypeCheck(const TSourceLoc& /*loc*/, TPublicType& publ // void TParseContext::inductiveLoopCheck(const TSourceLoc& loc, TIntermNode* init, TIntermLoop* loop) { -#ifndef GLSLANG_WEB // loop index init must exist and be a declaration, which shows up in the AST as an aggregate of size 1 of the declaration bool badInit = false; if (! init || ! init->getAsAggregate() || init->getAsAggregate()->getSequence().size() != 1) badInit = true; - TIntermBinary* binaryInit = 0; + TIntermBinary* binaryInit = nullptr; if (! badInit) { // get the declaration assignment binaryInit = init->getAsAggregate()->getSequence()[0]->getAsBinaryNode(); @@ -5225,10 +5527,8 @@ void TParseContext::inductiveLoopCheck(const TSourceLoc& loc, TIntermNode* init, // the body inductiveLoopBodyCheck(loop->getBody(), loopIndex, symbolTable); -#endif } -#ifndef GLSLANG_WEB // Do limit checks for built-in arrays. void TParseContext::arrayLimitCheck(const TSourceLoc& loc, const TString& identifier, int size) { @@ -5243,7 +5543,6 @@ void TParseContext::arrayLimitCheck(const TSourceLoc& loc, const TString& identi else if (identifier.compare("gl_CullDistancePerViewNV") == 0) limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistancePerViewNV array size"); } -#endif // GLSLANG_WEB // See if the provided value is less than or equal to the symbol indicated by limit, // which should be a constant in the symbol table. @@ -5257,8 +5556,6 @@ void TParseContext::limitCheck(const TSourceLoc& loc, int value, const char* lim error(loc, "must be less than or equal to", feature, "%s (%d)", limit, constArray[0].getIConst()); } -#ifndef GLSLANG_WEB - // // Do any additional error checking, etc., once we know the parsing is done. // @@ -5294,11 +5591,11 @@ void TParseContext::finish() if (!isEsProfile() && version < 430) requireExtensions(getCurrentLoc(), 1, &E_GL_ARB_compute_shader, "compute shaders"); break; - case EShLangTaskNV: - requireExtensions(getCurrentLoc(), 1, &E_GL_NV_mesh_shader, "task shaders"); + case EShLangTask: + requireExtensions(getCurrentLoc(), Num_AEP_mesh_shader, AEP_mesh_shader, "task shaders"); break; - case EShLangMeshNV: - requireExtensions(getCurrentLoc(), 1, &E_GL_NV_mesh_shader, "mesh shaders"); + case EShLangMesh: + requireExtensions(getCurrentLoc(), Num_AEP_mesh_shader, AEP_mesh_shader, "mesh shaders"); break; default: break; @@ -5324,7 +5621,6 @@ void TParseContext::finish() } } } -#endif // GLSLANG_WEB // // Layout qualifier stuff. @@ -5368,7 +5664,6 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.qualifier.layoutPacking = ElpStd140; return; } -#ifndef GLSLANG_WEB if (id == TQualifier::getLayoutPackingString(ElpStd430)) { requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, "std430"); profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_shader_storage_buffer_object, "std430"); @@ -5408,12 +5703,34 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi intermediate.setUsePhysicalStorageBuffer(); return; } - if (language == EShLangGeometry || language == EShLangTessEvaluation || language == EShLangMeshNV) { + if (id == "bindless_sampler") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bindless_sampler"); + publicType.qualifier.layoutBindlessSampler = true; + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeLayout); + return; + } + if (id == "bindless_image") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bindless_image"); + publicType.qualifier.layoutBindlessImage = true; + intermediate.setBindlessImageMode(currentCaller, AstRefTypeLayout); + return; + } + if (id == "bound_sampler") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bound_sampler"); + publicType.qualifier.layoutBindlessSampler = false; + return; + } + if (id == "bound_image") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bound_image"); + publicType.qualifier.layoutBindlessImage = false; + return; + } + if (language == EShLangGeometry || language == EShLangTessEvaluation || language == EShLangMesh) { if (id == TQualifier::getGeometryString(ElgTriangles)) { publicType.shaderQualifiers.geometry = ElgTriangles; return; } - if (language == EShLangGeometry || language == EShLangMeshNV) { + if (language == EShLangGeometry || language == EShLangMesh) { if (id == TQualifier::getGeometryString(ElgPoints)) { publicType.shaderQualifiers.geometry = ElgPoints; return; @@ -5496,12 +5813,19 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi } if (language == EShLangFragment) { if (id == "origin_upper_left") { - requireProfile(loc, ECoreProfile | ECompatibilityProfile, "origin_upper_left"); + requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, "origin_upper_left"); + if (profile == ENoProfile) { + profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, "origin_upper_left"); + } + publicType.shaderQualifiers.originUpperLeft = true; return; } if (id == "pixel_center_integer") { - requireProfile(loc, ECoreProfile | ECompatibilityProfile, "pixel_center_integer"); + requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, "pixel_center_integer"); + if (profile == ENoProfile) { + profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, "pixel_center_integer"); + } publicType.shaderQualifiers.pixelCenterInteger = true; return; } @@ -5511,6 +5835,12 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.shaderQualifiers.earlyFragmentTests = true; return; } + if (id == "early_and_late_fragment_tests_amd") { + profileRequires(loc, ENoProfile | ECoreProfile | ECompatibilityProfile, 420, E_GL_AMD_shader_early_and_late_fragment_tests, "early_and_late_fragment_tests_amd"); + profileRequires(loc, EEsProfile, 310, nullptr, "early_and_late_fragment_tests_amd"); + publicType.shaderQualifiers.earlyAndLateFragmentTestsAMD = true; + return; + } if (id == "post_depth_coverage") { requireExtensions(loc, Num_post_depth_coverageEXTs, post_depth_coverageEXTs, "post depth coverage"); if (extensionTurnedOn(E_GL_ARB_post_depth_coverage)) { @@ -5519,6 +5849,22 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.shaderQualifiers.postDepthCoverage = true; return; } + /* id is transformed into lower case in the beginning of this function. */ + if (id == "non_coherent_color_attachment_readext") { + requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, "non_coherent_color_attachment_readEXT"); + publicType.shaderQualifiers.nonCoherentColorAttachmentReadEXT = true; + return; + } + if (id == "non_coherent_depth_attachment_readext") { + requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, "non_coherent_depth_attachment_readEXT"); + publicType.shaderQualifiers.nonCoherentDepthAttachmentReadEXT = true; + return; + } + if (id == "non_coherent_stencil_attachment_readext") { + requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, "non_coherent_stencil_attachment_readEXT"); + publicType.shaderQualifiers.nonCoherentStencilAttachmentReadEXT = true; + return; + } for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth+1)) { if (id == TQualifier::getLayoutDepthString(depth)) { requireProfile(loc, ECoreProfile | ECompatibilityProfile, "depth layout qualifier"); @@ -5527,6 +5873,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi return; } } + for (TLayoutStencil stencil = (TLayoutStencil)(ElsNone + 1); stencil < ElsCount; stencil = (TLayoutStencil)(stencil+1)) { + if (id == TQualifier::getLayoutStencilString(stencil)) { + requireProfile(loc, ECoreProfile | ECompatibilityProfile, "stencil layout qualifier"); + profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, nullptr, "stencil layout qualifier"); + publicType.shaderQualifiers.layoutStencil = stencil; + return; + } + } for (TInterlockOrdering order = (TInterlockOrdering)(EioNone + 1); order < EioCount; order = (TInterlockOrdering)(order+1)) { if (id == TQualifier::getInterlockOrderingString(order)) { requireProfile(loc, ECoreProfile | ECompatibilityProfile, "fragment shader interlock layout qualifier"); @@ -5559,6 +5913,15 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.shaderQualifiers.layoutOverrideCoverage = true; return; } + if (id == "full_quads") + { + const char* feature = "full_quads qualifier"; + requireProfile(loc, ECompatibilityProfile | ECoreProfile | EEsProfile, feature); + profileRequires(loc, ECoreProfile | ECompatibilityProfile, 140, E_GL_EXT_shader_quad_control, feature); + profileRequires(loc, EEsProfile, 310, E_GL_EXT_shader_quad_control, feature); + publicType.qualifier.layoutFullQuads = true; + return; + } } if (language == EShLangVertex || language == EShLangTessControl || @@ -5581,6 +5944,10 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi } publicType.qualifier.layoutShaderRecord = true; return; + } else if (id == "hitobjectshaderrecordnv") { + requireExtensions(loc, 1, &E_GL_NV_shader_invocation_reorder, "hitobject shader record NV"); + publicType.qualifier.layoutHitObjectShaderRecordNV = true; + return; } } @@ -5603,7 +5970,16 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.shaderQualifiers.layoutPrimitiveCulling = true; return; } -#endif + + if (id == "quad_derivatives") + { + const char* feature = "quad_derivatives qualifier"; + requireProfile(loc, ECompatibilityProfile | ECoreProfile | EEsProfile, feature); + profileRequires(loc, ECoreProfile | ECompatibilityProfile, 140, E_GL_EXT_shader_quad_control, feature); + profileRequires(loc, EEsProfile, 310, E_GL_EXT_shader_quad_control, feature); + publicType.qualifier.layoutQuadDeriv = true; + return; + } error(loc, "unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4)", id.c_str(), ""); } @@ -5670,7 +6046,7 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi return; } else if (id == "location") { profileRequires(loc, EEsProfile, 300, nullptr, "location"); - const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location }; + const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location }; // GL_ARB_explicit_uniform_location requires 330 or GL_ARB_explicit_attrib_location we do not need to add it here profileRequires(loc, ~EEsProfile, 330, 2, exts, "location"); if ((unsigned int)value >= TQualifier::layoutLocationEnd) @@ -5691,10 +6067,8 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi error(loc, "needs a literal integer", "set", ""); return; } else if (id == "binding") { -#ifndef GLSLANG_WEB profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, "binding"); profileRequires(loc, EEsProfile, 310, nullptr, "binding"); -#endif if ((unsigned int)value >= TQualifier::layoutBindingEnd) error(loc, "binding is too large", id.c_str(), ""); else @@ -5717,7 +6091,6 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi error(loc, "needs a literal integer", "constant_id", ""); return; } -#ifndef GLSLANG_WEB if (id == "component") { requireProfile(loc, ECoreProfile | ECompatibilityProfile, "component"); profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, "component"); @@ -5815,10 +6188,8 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi error(loc, "needs a literal integer", "buffer_reference_align", ""); return; } -#endif switch (language) { -#ifndef GLSLANG_WEB case EShLangTessControl: if (id == "vertices") { if (value == 0) @@ -5880,40 +6251,49 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi } break; - case EShLangMeshNV: + case EShLangMesh: if (id == "max_vertices") { - requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "max_vertices"); + requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, "max_vertices"); publicType.shaderQualifiers.vertices = value; - if (value > resources.maxMeshOutputVerticesNV) - error(loc, "too large, must be less than gl_MaxMeshOutputVerticesNV", "max_vertices", ""); + int max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? resources.maxMeshOutputVerticesEXT + : resources.maxMeshOutputVerticesNV; + if (value > max) { + TString maxsErrtring = "too large, must be less than "; + maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? "gl_MaxMeshOutputVerticesEXT" + : "gl_MaxMeshOutputVerticesNV"); + error(loc, maxsErrtring.c_str(), "max_vertices", ""); + } if (nonLiteral) error(loc, "needs a literal integer", "max_vertices", ""); return; } if (id == "max_primitives") { - requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "max_primitives"); + requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, "max_primitives"); publicType.shaderQualifiers.primitives = value; - if (value > resources.maxMeshOutputPrimitivesNV) - error(loc, "too large, must be less than gl_MaxMeshOutputPrimitivesNV", "max_primitives", ""); + int max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? resources.maxMeshOutputPrimitivesEXT + : resources.maxMeshOutputPrimitivesNV; + if (value > max) { + TString maxsErrtring = "too large, must be less than "; + maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? "gl_MaxMeshOutputPrimitivesEXT" + : "gl_MaxMeshOutputPrimitivesNV"); + error(loc, maxsErrtring.c_str(), "max_primitives", ""); + } if (nonLiteral) error(loc, "needs a literal integer", "max_primitives", ""); return; } - // Fall through + [[fallthrough]]; - case EShLangTaskNV: + case EShLangTask: // Fall through -#endif case EShLangCompute: if (id.compare(0, 11, "local_size_") == 0) { -#ifndef GLSLANG_WEB - if (language == EShLangMeshNV || language == EShLangTaskNV) { - requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "gl_WorkGroupSize"); + if (language == EShLangMesh || language == EShLangTask) { + requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, "gl_WorkGroupSize"); } else { - profileRequires(loc, EEsProfile, 310, 0, "gl_WorkGroupSize"); + profileRequires(loc, EEsProfile, 310, nullptr, "gl_WorkGroupSize"); profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, "gl_WorkGroupSize"); } -#endif if (nonLiteral) error(loc, "needs a literal integer", "local_size", ""); if (id.size() == 12 && value == 0) { @@ -5980,7 +6360,6 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie if (src.hasPacking()) dst.layoutPacking = src.layoutPacking; -#ifndef GLSLANG_WEB if (src.hasStream()) dst.layoutStream = src.layoutStream; if (src.hasFormat()) @@ -5989,7 +6368,6 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie dst.layoutXfbBuffer = src.layoutXfbBuffer; if (src.hasBufferReferenceAlign()) dst.layoutBufferReferenceAlign = src.layoutBufferReferenceAlign; -#endif if (src.hasAlign()) dst.layoutAlign = src.layoutAlign; @@ -6007,7 +6385,6 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie if (src.hasSpecConstantId()) dst.layoutSpecConstantId = src.layoutSpecConstantId; -#ifndef GLSLANG_WEB if (src.hasComponent()) dst.layoutComponent = src.layoutComponent; if (src.hasIndex()) @@ -6032,9 +6409,20 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie dst.layoutSecondaryViewportRelativeOffset = src.layoutSecondaryViewportRelativeOffset; if (src.layoutShaderRecord) dst.layoutShaderRecord = true; + if (src.layoutFullQuads) + dst.layoutFullQuads = true; + if (src.layoutQuadDeriv) + dst.layoutQuadDeriv = true; + if (src.layoutBindlessSampler) + dst.layoutBindlessSampler = true; + if (src.layoutBindlessImage) + dst.layoutBindlessImage = true; if (src.pervertexNV) dst.pervertexNV = true; -#endif + if (src.pervertexEXT) + dst.pervertexEXT = true; + if (src.layoutHitObjectShaderRecordNV) + dst.layoutHitObjectShaderRecordNV = true; } } @@ -6070,10 +6458,7 @@ void TParseContext::layoutObjectCheck(const TSourceLoc& loc, const TSymbol& symb switch (qualifier.storage) { case EvqVaryingIn: case EvqVaryingOut: - if (!type.getQualifier().isTaskMemory() && -#ifndef GLSLANG_WEB - !type.getQualifier().hasSprivDecorate() && -#endif + if (!type.getQualifier().isTaskMemory() && !type.getQualifier().hasSpirvDecorate() && (type.getBasicType() != EbtBlock || (!(*type.getStruct())[0].type->getQualifier().hasLocation() && (*type.getStruct())[0].type->getQualifier().builtIn == EbvNone))) @@ -6135,11 +6520,6 @@ void TParseContext::layoutMemberLocationArrayCheck(const TSourceLoc& loc, bool m // Do layout error checking with respect to a type. void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) { -#ifndef GLSLANG_WEB - if (extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) - return; // Skip any check if GL_EXT_spirv_intrinsics is turned on -#endif - const TQualifier& qualifier = type.getQualifier(); // first, intra-layout qualifier-only error checking @@ -6181,15 +6561,22 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) case EvqBuffer: if (type.getBasicType() == EbtBlock) error(loc, "cannot apply to uniform or buffer block", "location", ""); + else if (type.getBasicType() == EbtSampler && type.getSampler().isAttachmentEXT()) + error(loc, "only applies to", "location", "%s with storage tileImageEXT", type.getBasicTypeString().c_str()); + break; + case EvqtaskPayloadSharedEXT: + error(loc, "cannot apply to taskPayloadSharedEXT", "location", ""); break; -#ifndef GLSLANG_WEB case EvqPayload: case EvqPayloadIn: case EvqHitAttr: case EvqCallableData: case EvqCallableDataIn: + case EvqHitObjectAttrNV: + case EvqSpirvStorageClass: + break; + case EvqTileImageEXT: break; -#endif default: error(loc, "can only apply to uniform, buffer, in, or out storage qualifiers", "location", ""); break; @@ -6199,19 +6586,20 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) int repeated = intermediate.addUsedLocation(qualifier, type, typeCollision); if (repeated >= 0 && ! typeCollision) error(loc, "overlapping use of location", "location", "%d", repeated); - // "fragment-shader outputs ... if two variables are placed within the same - // location, they must have the same underlying type (floating-point or integer)" - if (typeCollision && language == EShLangFragment && qualifier.isPipeOutput()) - error(loc, "fragment outputs sharing the same location must be the same basic type", "location", "%d", repeated); + // When location aliasing, the aliases sharing the location must have the same underlying numerical type and bit width( + // floating - point or integer, 32 - bit versus 64 - bit,etc.) + if (typeCollision && (qualifier.isPipeInput() || qualifier.isPipeOutput() || qualifier.storage == EvqTileImageEXT)) + error(loc, "the aliases sharing the location", "location", "%d must be the same basic type and interpolation qualification", repeated); } -#ifndef GLSLANG_WEB if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) { - int repeated = intermediate.addXfbBufferOffset(type); - if (repeated >= 0) - error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer); - if (type.isUnsizedArray()) + if (type.isUnsizedArray()) { error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer); + } else { + int repeated = intermediate.addXfbBufferOffset(type); + if (repeated >= 0) + error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer); + } // "The offset must be a multiple of the size of the first component of the first // qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate @@ -6232,7 +6620,6 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) if (! intermediate.setXfbBufferStride(qualifier.layoutXfbBuffer, qualifier.layoutXfbStride)) error(loc, "all stride settings must match for xfb buffer", "xfb_stride", "%d", qualifier.layoutXfbBuffer); } -#endif if (qualifier.hasBinding()) { // Binding checking, from the spec: @@ -6243,7 +6630,7 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) // an array of size N, all elements of the array from binding through binding + N - 1 must be within this // range." // - if (! type.isOpaque() && type.getBasicType() != EbtBlock) + if (!type.isOpaque() && type.getBasicType() != EbtBlock && type.getBasicType() != EbtSpirvType) error(loc, "requires block, or sampler/image, or atomic-counter type", "binding", ""); if (type.getBasicType() == EbtSampler) { int lastBinding = qualifier.layoutBinding; @@ -6252,16 +6639,12 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) if (type.isSizedArray()) lastBinding += (type.getCumulativeArraySize() - 1); else { -#ifndef GLSLANG_WEB warn(loc, "assuming binding count of one for compile-time checking of binding numbers for unsized array", "[]", ""); -#endif } } } -#ifndef GLSLANG_WEB if (spvVersion.vulkan == 0 && lastBinding >= resources.maxCombinedTextureImageUnits) error(loc, "sampler binding not less than gl_MaxCombinedTextureImageUnits", "binding", type.isArray() ? "(using array)" : ""); -#endif } if (type.isAtomic() && !spvVersion.vulkanRelaxed) { if (qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) { @@ -6284,7 +6667,7 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) !qualifier.hasAttachment() && !qualifier.hasBufferReference()) error(loc, "uniform/buffer blocks require layout(binding=X)", "binding", ""); - else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler) + else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler && !type.getSampler().isAttachmentEXT()) error(loc, "sampler/texture/image requires layout(binding=X)", "binding", ""); } } @@ -6306,7 +6689,7 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) // Image format if (qualifier.hasFormat()) { - if (! type.isImage()) + if (! type.isImage() && !intermediate.getBindlessImageMode()) error(loc, "only apply to images", TQualifier::getLayoutFormatString(qualifier.getFormat()), ""); else { if (type.getSampler().type == EbtFloat && qualifier.getFormat() > ElfFloatGuard) @@ -6325,14 +6708,18 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) } } } - } else if (type.isImage() && ! qualifier.isWriteOnly()) { + } else if (type.isImage() && ! qualifier.isWriteOnly() && !intermediate.getBindlessImageMode()) { const char *explanation = "image variables not declared 'writeonly' and without a format layout qualifier"; requireProfile(loc, ECoreProfile | ECompatibilityProfile, explanation); profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation); } - if (qualifier.isPushConstant() && type.getBasicType() != EbtBlock) - error(loc, "can only be used with a block", "push_constant", ""); + if (qualifier.isPushConstant()) { + if (type.getBasicType() != EbtBlock) + error(loc, "can only be used with a block", "push_constant", ""); + if (type.isArray()) + error(loc, "Push constants blocks can't be an array", "push_constant", ""); + } if (qualifier.hasBufferReference() && type.getBasicType() != EbtBlock) error(loc, "can only be used with a block", "buffer_reference", ""); @@ -6342,6 +6729,8 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) // input attachment if (type.isSubpass()) { + if (extensionTurnedOn(E_GL_EXT_shader_tile_image)) + error(loc, "can not be used with GL_EXT_shader_tile_image enabled", type.getSampler().getString().c_str(), ""); if (! qualifier.hasAttachment()) error(loc, "requires an input_attachment_index layout qualifier", "subpass", ""); } else { @@ -6411,7 +6800,6 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier // output block declarations, and output block member declarations." switch (qualifier.storage) { -#ifndef GLSLANG_WEB case EvqVaryingIn: { const char* feature = "location qualifier on input"; @@ -6446,7 +6834,6 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier } break; } -#endif case EvqUniform: case EvqBuffer: { @@ -6493,6 +6880,8 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier error(loc, "can only be used with a uniform", "push_constant", ""); if (qualifier.hasSet()) error(loc, "cannot be used with push_constant", "set", ""); + if (qualifier.hasBinding()) + error(loc, "cannot be used with push_constant", "binding", ""); } if (qualifier.hasBufferReference()) { if (qualifier.storage != EvqBuffer) @@ -6507,6 +6896,14 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier error(loc, "cannot be used with shaderRecordNV", "set", ""); } + + if (qualifier.storage == EvqTileImageEXT) { + if (qualifier.hasSet()) + error(loc, "cannot be used with tileImageEXT", "set", ""); + if (!qualifier.hasLocation()) + error(loc, "can only be used with an explicit location", "tileImageEXT", ""); + } + if (qualifier.storage == EvqHitAttr && qualifier.hasLayout()) { error(loc, "cannot apply layout qualifiers to hitAttributeNV variable", "hitAttributeNV", ""); } @@ -6515,7 +6912,6 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier // For places that can't have shader-level layout qualifiers void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQualifiers& shaderQualifiers) { -#ifndef GLSLANG_WEB const char* message = "can only apply to a standalone qualifier"; if (shaderQualifiers.geometry != ElgNone) @@ -6535,7 +6931,7 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua error(loc, message, "local_size id", ""); } if (shaderQualifiers.vertices != TQualifier::layoutNotSet) { - if (language == EShLangGeometry || language == EShLangMeshNV) + if (language == EShLangGeometry || language == EShLangMesh) error(loc, message, "max_vertices", ""); else if (language == EShLangTessControl) error(loc, message, "vertices", ""); @@ -6546,8 +6942,14 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua error(loc, message, "early_fragment_tests", ""); if (shaderQualifiers.postDepthCoverage) error(loc, message, "post_depth_coverage", ""); + if (shaderQualifiers.nonCoherentColorAttachmentReadEXT) + error(loc, message, "non_coherent_color_attachment_readEXT", ""); + if (shaderQualifiers.nonCoherentDepthAttachmentReadEXT) + error(loc, message, "non_coherent_depth_attachment_readEXT", ""); + if (shaderQualifiers.nonCoherentStencilAttachmentReadEXT) + error(loc, message, "non_coherent_stencil_attachment_readEXT", ""); if (shaderQualifiers.primitives != TQualifier::layoutNotSet) { - if (language == EShLangMeshNV) + if (language == EShLangMesh) error(loc, message, "max_primitives", ""); else assert(0); @@ -6560,14 +6962,12 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua error(loc, message, TQualifier::getInterlockOrderingString(shaderQualifiers.interlockOrdering), ""); if (shaderQualifiers.layoutPrimitiveCulling) error(loc, "can only be applied as standalone", "primitive_culling", ""); -#endif } // Correct and/or advance an object's offset layout qualifier. void TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol) { const TQualifier& qualifier = symbol.getType().getQualifier(); -#ifndef GLSLANG_WEB if (symbol.getType().isAtomic()) { if (qualifier.hasBinding() && (int)qualifier.layoutBinding < resources.maxAtomicCounterBindings) { @@ -6601,7 +7001,6 @@ void TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol) atomicUintOffsets[qualifier.layoutBinding] = offset + numOffsets; } } -#endif } // @@ -6616,10 +7015,6 @@ const TFunction* TParseContext::findFunction(const TSourceLoc& loc, const TFunct return nullptr; } -#ifdef GLSLANG_WEB - return findFunctionExact(loc, call, builtIn); -#endif - const TFunction* function = nullptr; // debugPrintfEXT has var args and is in the symbol table as "debugPrintfEXT()", @@ -6647,8 +7042,10 @@ const TFunction* TParseContext::findFunction(const TSourceLoc& loc, const TFunct : findFunctionExact(loc, call, builtIn)); else if (version < 120) function = findFunctionExact(loc, call, builtIn); - else if (version < 400) - function = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn); + else if (version < 400) { + bool needfindFunction400 = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) || extensionTurnedOn(E_GL_ARB_gpu_shader5); + function = needfindFunction400 ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn); + } else if (explicitTypesEnabled) function = findFunctionExplicitTypes(loc, call, builtIn); else @@ -6944,7 +7341,6 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T { TIntermTyped* result = nullptr; -#ifndef GLSLANG_WEB if (function->getBuiltInOp() != EOpNull) { return nullptr; } @@ -6956,12 +7352,14 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T TFunction realFunc(&name, function->getType()); + // Use copyParam to avoid shared ownership of the 'type' field + // of the parameter. for (int i = 0; i < function->getParamCount(); ++i) { - realFunc.addParameter((*function)[i]); + realFunc.addParameter(TParameter().copyParam((*function)[i])); } - TParameter tmpP = { 0, &uintType }; - realFunc.addParameter(tmpP); + TParameter tmpP = { nullptr, &uintType, {} }; + realFunc.addParameter(TParameter().copyParam(tmpP)); arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(1, loc, true)); result = handleFunctionCall(loc, &realFunc, arguments); @@ -6974,11 +7372,11 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T TFunction realFunc(&name, function->getType()); for (int i = 0; i < function->getParamCount(); ++i) { - realFunc.addParameter((*function)[i]); + realFunc.addParameter(TParameter().copyParam((*function)[i])); } - TParameter tmpP = { 0, &uintType }; - realFunc.addParameter(tmpP); + TParameter tmpP = { nullptr, &uintType, {} }; + realFunc.addParameter(TParameter().copyParam(tmpP)); arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(-1, loc, true)); result = handleFunctionCall(loc, &realFunc, arguments); @@ -6993,7 +7391,6 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T result = arguments->getAsTyped(); } } -#endif return result; } @@ -7002,7 +7399,6 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T // to establish defaults. void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType& publicType) { -#ifndef GLSLANG_WEB if (publicType.basicType == EbtAtomicUint && publicType.qualifier.hasBinding()) { if (publicType.qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) { error(loc, "atomic_uint binding is too large", "binding", ""); @@ -7019,19 +7415,52 @@ void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType if (publicType.qualifier.hasLayout() && !publicType.qualifier.hasBufferReference()) warn(loc, "useless application of layout qualifier", "layout", ""); -#endif } -bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString& identifier, const TPublicType&, +void TParseContext::coopMatTypeParametersCheck(const TSourceLoc& loc, const TPublicType& publicType) +{ + if (parsingBuiltins) + return; + if (publicType.isCoopmatKHR()) { + if (publicType.typeParameters == nullptr) { + error(loc, "coopmat missing type parameters", "", ""); + return; + } + switch (publicType.typeParameters->basicType) { + case EbtFloat: + case EbtFloat16: + case EbtInt: + case EbtInt8: + case EbtInt16: + case EbtUint: + case EbtUint8: + case EbtUint16: + case EbtSpirvType: + break; + default: + error(loc, "coopmat invalid basic type", TType::getBasicString(publicType.typeParameters->basicType), ""); + break; + } + if (publicType.typeParameters->arraySizes->getNumDims() != 4) { + error(loc, "coopmat incorrect number of type parameters", "", ""); + return; + } + int use = publicType.typeParameters->arraySizes->getDimSize(3); + if (use < 0 || use > 2) { + error(loc, "coopmat invalid matrix Use", "", ""); + return; + } + } +} + +bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString& identifier, const TPublicType& publicType, TArraySizes*, TIntermTyped* initializer, TType& type) { + vkRelaxedRemapUniformMembers(loc, publicType, type, identifier); + if (parsingBuiltins || symbolTable.atBuiltInLevel() || !symbolTable.atGlobalLevel() || type.getQualifier().storage != EvqUniform || - !(type.containsNonOpaque() -#ifndef GLSLANG_WEB - || type.getBasicType() == EbtAtomicUint -#endif - )) { + !(type.containsNonOpaque() || type.getBasicType() == EbtAtomicUint || (type.containsSampler() && type.isStruct()))) { return false; } @@ -7060,7 +7489,6 @@ bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString int bufferBinding = TQualifier::layoutBindingEnd; TVariable* updatedBlock = nullptr; -#ifndef GLSLANG_WEB // Convert atomic_uint into members of a buffer block if (type.isAtomic()) { type.setBasicType(EbtUint); @@ -7076,7 +7504,6 @@ bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString growAtomicCounterBlock(bufferBinding, loc, type, identifier, nullptr); updatedBlock = atomicCounterBuffers[bufferBinding]; } -#endif if (!updatedBlock) { growGlobalUniformBlock(loc, type, identifier, nullptr); @@ -7107,6 +7534,263 @@ bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString return true; } +template +static void ForEachOpaque(const TType& type, const TString& path, Function callback) +{ + auto recursion = [&callback](const TType& type, const TString& path, bool skipArray, auto& recursion) -> void { + if (!skipArray && type.isArray()) + { + std::vector indices(type.getArraySizes()->getNumDims()); + for (int flatIndex = 0; + flatIndex < type.getArraySizes()->getCumulativeSize(); + ++flatIndex) + { + TString subscriptPath = path; + for (size_t dimIndex = 0; dimIndex < indices.size(); ++dimIndex) + { + int index = indices[dimIndex]; + subscriptPath.append("["); + subscriptPath.append(String(index)); + subscriptPath.append("]"); + } + + recursion(type, subscriptPath, true, recursion); + + for (size_t dimIndex = 0; dimIndex < indices.size(); ++dimIndex) + { + ++indices[dimIndex]; + if (indices[dimIndex] < type.getArraySizes()->getDimSize(dimIndex)) + break; + else + indices[dimIndex] = 0; + } + } + } + + else if (type.isStruct() && type.containsOpaque()) + { + const TTypeList& types = *type.getStruct(); + for (const TTypeLoc& typeLoc : types) + { + TString nextPath = path; + nextPath.append("."); + nextPath.append(typeLoc.type->getFieldName()); + + recursion(*(typeLoc.type), nextPath, false, recursion); + } + } + + else if (type.isOpaque()) + { + callback(type, path); + } + }; + + recursion(type, path, false, recursion); +} + +void TParseContext::vkRelaxedRemapUniformMembers(const TSourceLoc& loc, const TPublicType& publicType, const TType& type, + const TString& identifier) +{ + if (!type.isStruct() || !type.containsOpaque()) + return; + + ForEachOpaque(type, identifier, + [&publicType, &loc, this](const TType& type, const TString& path) { + TArraySizes arraySizes = {}; + if (type.getArraySizes()) arraySizes = *type.getArraySizes(); + TTypeParameters typeParameters = {}; + if (type.getTypeParameters()) typeParameters = *type.getTypeParameters(); + + TPublicType memberType{}; + memberType.basicType = type.getBasicType(); + memberType.sampler = type.getSampler(); + memberType.qualifier = type.getQualifier(); + memberType.vectorSize = type.getVectorSize(); + memberType.matrixCols = type.getMatrixCols(); + memberType.matrixRows = type.getMatrixRows(); + memberType.coopmatNV = type.isCoopMatNV(); + memberType.coopmatKHR = type.isCoopMatKHR(); + memberType.arraySizes = nullptr; + memberType.userDef = nullptr; + memberType.loc = loc; + memberType.typeParameters = (type.getTypeParameters() ? &typeParameters : nullptr); + memberType.spirvType = nullptr; + + memberType.qualifier.storage = publicType.qualifier.storage; + memberType.shaderQualifiers = publicType.shaderQualifiers; + + TString& structMemberName = *NewPoolTString(path.c_str()); // A copy is required due to declareVariable() signature. + declareVariable(loc, structMemberName, memberType, nullptr, nullptr); + }); +} + +void TParseContext::vkRelaxedRemapFunctionParameter(TFunction* function, TParameter& param, std::vector* newParams) +{ + function->addParameter(param); + + if (!param.type->isStruct() || !param.type->containsOpaque()) + return; + + ForEachOpaque(*param.type, (param.name ? *param.name : param.type->getFieldName()), + [function, param, newParams](const TType& type, const TString& path) { + TString* memberName = NewPoolTString(path.c_str()); + + TType* memberType = new TType(); + memberType->shallowCopy(type); + memberType->getQualifier().storage = param.type->getQualifier().storage; + memberType->clearArraySizes(); + + TParameter memberParam = {}; + memberParam.name = memberName; + memberParam.type = memberType; + memberParam.defaultValue = nullptr; + function->addParameter(memberParam); + if (newParams) + newParams->push_back(function->getParamCount()-1); + }); +} + +// +// Generates a valid GLSL dereferencing string for the input TIntermNode +// +struct AccessChainTraverser : public TIntermTraverser { + AccessChainTraverser() : TIntermTraverser(false, false, true) + {} + + TString path = ""; + TStorageQualifier topLevelStorageQualifier = TStorageQualifier::EvqLast; + + bool visitBinary(TVisit, TIntermBinary* binary) override { + if (binary->getOp() == EOpIndexDirectStruct) + { + const TTypeList& members = *binary->getLeft()->getType().getStruct(); + const TTypeLoc& member = + members[binary->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()]; + TString memberName = member.type->getFieldName(); + + if (path != "") + path.append("."); + + path.append(memberName); + } + + if (binary->getOp() == EOpIndexDirect) + { + const TConstUnionArray& indices = binary->getRight()->getAsConstantUnion()->getConstArray(); + for (int index = 0; index < indices.size(); ++index) + { + path.append("["); + path.append(String(indices[index].getIConst())); + path.append("]"); + } + } + + return true; + } + + void visitSymbol(TIntermSymbol* symbol) override { + if (symbol->getType().isOpaque()) + topLevelStorageQualifier = symbol->getQualifier().storage; + if (!IsAnonymous(symbol->getName())) + path.append(symbol->getName()); + } +}; + +TIntermNode* TParseContext::vkRelaxedRemapFunctionArgument(const TSourceLoc& loc, TFunction* function, TIntermTyped* intermTyped) +{ + AccessChainTraverser accessChainTraverser{}; + intermTyped->traverse(&accessChainTraverser); + + if (accessChainTraverser.topLevelStorageQualifier == TStorageQualifier::EvqUniform) + { + TParameter param = { 0, new TType, {} }; + param.type->shallowCopy(intermTyped->getType()); + + function->addParameter(param); + return intermTyped; + } + + TParameter param = { NewPoolTString(accessChainTraverser.path.c_str()), new TType, {} }; + param.type->shallowCopy(intermTyped->getType()); + + std::vector newParams = {}; + vkRelaxedRemapFunctionParameter(function, param, &newParams); + + if (intermTyped->getType().isOpaque()) + { + TIntermNode* remappedArgument = intermTyped; + { + TIntermSymbol* intermSymbol = nullptr; + TSymbol* symbol = symbolTable.find(*param.name); + if (symbol && symbol->getAsVariable()) + intermSymbol = intermediate.addSymbol(*symbol->getAsVariable(), loc); + else + { + TVariable* variable = new TVariable(param.name, *param.type); + intermSymbol = intermediate.addSymbol(*variable, loc); + } + + remappedArgument = intermSymbol; + } + + return remappedArgument; + } + else if (!(intermTyped->isStruct() && intermTyped->getType().containsOpaque())) + return intermTyped; + else + { + TIntermNode* remappedArgument = intermTyped; + { + TSymbol* symbol = symbolTable.find(*param.name); + if (symbol && symbol->getAsVariable()) + remappedArgument = intermediate.addSymbol(*symbol->getAsVariable(), loc); + } + + if (!newParams.empty()) + remappedArgument = intermediate.makeAggregate(remappedArgument, loc); + + for (int paramIndex : newParams) + { + TParameter& newParam = function->operator[](paramIndex); + TIntermSymbol* intermSymbol = nullptr; + TSymbol* symbol = symbolTable.find(*newParam.name); + if (symbol && symbol->getAsVariable()) + intermSymbol = intermediate.addSymbol(*symbol->getAsVariable(), loc); + else + { + TVariable* variable = new TVariable(newParam.name, *newParam.type); + intermSymbol = intermediate.addSymbol(*variable, loc); + } + + remappedArgument = intermediate.growAggregate(remappedArgument, intermSymbol); + } + + return remappedArgument; + } +} + +TIntermTyped* TParseContext::vkRelaxedRemapDotDereference(const TSourceLoc&, TIntermTyped& base, const TType& member, + const TString& identifier) +{ + if (!member.isOpaque()) + return &base; + + AccessChainTraverser traverser{}; + base.traverse(&traverser); + if (!traverser.path.empty()) + traverser.path.append("."); + traverser.path.append(identifier); + + const TSymbol* symbol = symbolTable.find(traverser.path); + if (!symbol) + return &base; + + TIntermTyped* result = intermediate.addSymbol(*symbol->getAsVariable()); + result->setType(symbol->getType()); + return result; +} + // // Do everything necessary to handle a variable (non-block) declaration. // Either redeclaring a variable, or making a new one, updating the symbol @@ -7131,32 +7815,50 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden if (initializer) { if (type.getBasicType() == EbtRayQuery) { error(loc, "ray queries can only be initialized by using the rayQueryInitializeEXT intrinsic:", "=", identifier.c_str()); + } else if (type.getBasicType() == EbtHitObjectNV) { + error(loc, "hit objects cannot be initialized using initializers", "=", identifier.c_str()); } + } - if (type.isCoopMat()) { + if (type.isCoopMatKHR()) { intermediate.setUseVulkanMemoryModel(); intermediate.setUseStorageBuffer(); - if (!publicType.typeParameters || publicType.typeParameters->getNumDims() != 4) { + if (!publicType.typeParameters || !publicType.typeParameters->arraySizes || + publicType.typeParameters->arraySizes->getNumDims() != 3) { + error(loc, "unexpected number type parameters", identifier.c_str(), ""); + } + if (publicType.typeParameters) { + if (!isTypeFloat(publicType.typeParameters->basicType) && + !isTypeInt(publicType.typeParameters->basicType) && publicType.typeParameters->basicType != EbtSpirvType) { + error(loc, "expected 8, 16, 32, or 64 bit signed or unsigned integer or 16, 32, or 64 bit float type", identifier.c_str(), ""); + } + } + } + else if (type.isCoopMatNV()) { + intermediate.setUseVulkanMemoryModel(); + intermediate.setUseStorageBuffer(); + + if (!publicType.typeParameters || publicType.typeParameters->arraySizes->getNumDims() != 4) { error(loc, "expected four type parameters", identifier.c_str(), ""); } if (publicType.typeParameters) { if (isTypeFloat(publicType.basicType) && - publicType.typeParameters->getDimSize(0) != 16 && - publicType.typeParameters->getDimSize(0) != 32 && - publicType.typeParameters->getDimSize(0) != 64) { + publicType.typeParameters->arraySizes->getDimSize(0) != 16 && + publicType.typeParameters->arraySizes->getDimSize(0) != 32 && + publicType.typeParameters->arraySizes->getDimSize(0) != 64) { error(loc, "expected 16, 32, or 64 bits for first type parameter", identifier.c_str(), ""); } if (isTypeInt(publicType.basicType) && - publicType.typeParameters->getDimSize(0) != 8 && - publicType.typeParameters->getDimSize(0) != 32) { - error(loc, "expected 8 or 32 bits for first type parameter", identifier.c_str(), ""); + publicType.typeParameters->arraySizes->getDimSize(0) != 8 && + publicType.typeParameters->arraySizes->getDimSize(0) != 16 && + publicType.typeParameters->arraySizes->getDimSize(0) != 32) { + error(loc, "expected 8, 16, or 32 bits for first type parameter", identifier.c_str(), ""); } } - } else { - if (publicType.typeParameters && publicType.typeParameters->getNumDims() != 0) { + if (publicType.typeParameters && publicType.typeParameters->arraySizes->getNumDims() != 0) { error(loc, "unexpected type parameters", identifier.c_str(), ""); } } @@ -7171,11 +7873,9 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden samplerCheck(loc, type, identifier, initializer); transparentOpaqueCheck(loc, type, identifier); -#ifndef GLSLANG_WEB atomicUintCheck(loc, type, identifier); accStructCheck(loc, type, identifier); checkAndResizeMeshViewDim(loc, type, /*isBlockMember*/ false); -#endif if (type.getQualifier().storage == EvqConst && type.containsReference()) { error(loc, "variables with reference type can't have qualifier 'const'", "qualifier", ""); } @@ -7189,6 +7889,8 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden requireInt8Arithmetic(loc, "qualifier", "(u)int8 types can only be in uniform block or buffer storage"); } + if (type.getQualifier().storage == EvqtaskPayloadSharedEXT) + intermediate.addTaskPayloadEXTCount(); if (type.getQualifier().storage == EvqShared && type.containsCoopMat()) error(loc, "qualifier", "Cooperative matrix types must not be used in shared memory", ""); @@ -7212,6 +7914,8 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden error(loc, "can only apply origin_upper_left and pixel_center_origin to gl_FragCoord", "layout qualifier", ""); if (identifier != "gl_FragDepth" && publicType.shaderQualifiers.getDepth() != EldNone) error(loc, "can only apply depth layout to gl_FragDepth", "layout qualifier", ""); + if (identifier != "gl_FragStencilRefARB" && publicType.shaderQualifiers.getStencil() != ElsNone) + error(loc, "can only apply depth layout to gl_FragStencilRefARB", "layout qualifier", ""); // Check for redeclaration of built-ins and/or attempting to declare a reserved name TSymbol* symbol = redeclareBuiltinVariable(loc, identifier, type.getQualifier(), publicType.shaderQualifiers); @@ -7274,14 +7978,12 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden // Pick up global defaults from the provide global defaults into dst. void TParseContext::inheritGlobalDefaults(TQualifier& dst) const { -#ifndef GLSLANG_WEB if (dst.storage == EvqVaryingOut) { if (! dst.hasStream() && language == EShLangGeometry) dst.layoutStream = globalOutputDefaults.layoutStream; if (! dst.hasXfbBuffer()) dst.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer; } -#endif } // @@ -7310,9 +8012,7 @@ TVariable* TParseContext::declareNonArray(const TSourceLoc& loc, const TString& // make a new variable TVariable* variable = new TVariable(&identifier, type); -#ifndef GLSLANG_WEB ioArrayCheck(loc, type, identifier); -#endif // add variable to symbol table if (symbolTable.insert(*variable)) { @@ -7389,9 +8089,7 @@ TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyp TType skeletalType; skeletalType.shallowCopy(variable->getType()); skeletalType.getQualifier().makeTemporary(); -#ifndef GLSLANG_WEB initializer = convertInitializerList(loc, skeletalType, initializer); -#endif if (! initializer) { // error recovery; don't leave const without constant values if (qualifier == EvqConst) @@ -7419,14 +8117,14 @@ TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyp // Uniforms require a compile-time constant initializer if (qualifier == EvqUniform && ! initializer->getType().getQualifier().isFrontEndConstant()) { error(loc, "uniform initializers must be constant", "=", "'%s'", - variable->getType().getCompleteString().c_str()); + variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str()); variable->getWritableType().getQualifier().makeTemporary(); return nullptr; } // Global consts require a constant initializer (specialization constant is okay) if (qualifier == EvqConst && symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) { error(loc, "global const initializers must be constant", "=", "'%s'", - variable->getType().getCompleteString().c_str()); + variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str()); variable->getWritableType().getQualifier().makeTemporary(); return nullptr; } @@ -7489,7 +8187,7 @@ TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyp TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc); TIntermTyped* initNode = intermediate.addAssign(EOpAssign, intermSymbol, initializer, loc); if (! initNode) - assignError(loc, "=", intermSymbol->getCompleteString(), initializer->getCompleteString()); + assignError(loc, "=", intermSymbol->getCompleteString(intermediate.getEnhancedMsgs()), initializer->getCompleteString(intermediate.getEnhancedMsgs())); return initNode; } @@ -7560,7 +8258,7 @@ TIntermTyped* TParseContext::convertInitializerList(const TSourceLoc& loc, const } } else if (type.isMatrix()) { if (type.getMatrixCols() != (int)initList->getSequence().size()) { - error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str()); + error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str()); return nullptr; } TType vectorType(type, 0); // dereferenced type @@ -7571,20 +8269,20 @@ TIntermTyped* TParseContext::convertInitializerList(const TSourceLoc& loc, const } } else if (type.isVector()) { if (type.getVectorSize() != (int)initList->getSequence().size()) { - error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str()); + error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str()); return nullptr; } TBasicType destType = type.getBasicType(); for (int i = 0; i < type.getVectorSize(); ++i) { TBasicType initType = initList->getSequence()[i]->getAsTyped()->getBasicType(); if (destType != initType && !intermediate.canImplicitlyPromote(initType, destType)) { - error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString().c_str()); + error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str()); return nullptr; } } } else { - error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString().c_str()); + error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str()); return nullptr; } @@ -7619,12 +8317,14 @@ TIntermTyped* TParseContext::addConstructor(const TSourceLoc& loc, TIntermNode* // Combined texture-sampler constructors are completely semantic checked // in constructorTextureSamplerError() if (op == EOpConstructTextureSampler) { - if (aggrNode->getSequence()[1]->getAsTyped()->getType().getSampler().shadow) { - // Transfer depth into the texture (SPIR-V image) type, as a hint - // for tools to know this texture/image is a depth image. - aggrNode->getSequence()[0]->getAsTyped()->getWritableType().getSampler().shadow = true; + if (aggrNode != nullptr) { + if (aggrNode->getSequence()[1]->getAsTyped()->getType().getSampler().shadow) { + // Transfer depth into the texture (SPIR-V image) type, as a hint + // for tools to know this texture/image is a depth image. + aggrNode->getSequence()[0]->getAsTyped()->getWritableType().getSampler().shadow = true; + } + return intermediate.setAggregateOperator(aggrNode, op, type, loc); } - return intermediate.setAggregateOperator(aggrNode, op, type, loc); } TTypeList::const_iterator memberTypes; @@ -7673,6 +8373,11 @@ TIntermTyped* TParseContext::addConstructor(const TSourceLoc& loc, TIntermNode* int paramCount = 0; // keeps track of the constructor parameter number being checked + // We don't know "top down" whether type is a specialization constant, + // but a const becomes a specialization constant if any of its children are. + bool hasSpecConst = false; + bool isConstConstructor = true; + // for each parameter to the constructor call, check to see if the right type is passed or convert them // to the right type if possible (and allowed). // for structure constructors, just check if the right type is passed, no conversion is allowed. @@ -7685,13 +8390,30 @@ TIntermTyped* TParseContext::addConstructor(const TSourceLoc& loc, TIntermNode* else newNode = constructBuiltIn(type, op, (*p)->getAsTyped(), node->getLoc(), true); - if (newNode) + if (newNode) { *p = newNode; - else + if (!newNode->getType().getQualifier().isConstant()) + isConstConstructor = false; + if (newNode->getType().getQualifier().isSpecConstant()) + hasSpecConst = true; + } else return nullptr; } - return intermediate.setAggregateOperator(aggrNode, op, type, loc); + TIntermTyped* ret_node = intermediate.setAggregateOperator(aggrNode, op, type, loc); + + const char *specConstantCompositeExt[] = { E_GL_EXT_spec_constant_composites }; + if (checkExtensionsRequested(loc, 1, specConstantCompositeExt, "spec constant aggregate constructor")) { + if (isConstConstructor && hasSpecConst) { + ret_node->getWritableType().getQualifier().makeSpecConstant(); + } + } + + TIntermAggregate *agg_node = ret_node->getAsAggregate(); + if (agg_node && (agg_node->isVector() || agg_node->isArray() || agg_node->isMatrix())) + agg_node->updatePrecision(); + + return ret_node; } // Function for constructor implementation. Calls addUnaryMath with appropriate EOp value @@ -7753,7 +8475,18 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T TIntermTyped* newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvPtrToUvec2, true, node, type); return newNode; + } else if (node->getType().getBasicType() == EbtSampler) { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "sampler conversion to uvec2"); + // force the basic type of the constructor param to uvec2, otherwise spv builder will + // report some errors + TIntermTyped* newSrcNode = intermediate.createConversion(EbtUint, node); + newSrcNode->getAsTyped()->getWritableType().setVectorSize(2); + + TIntermTyped* newNode = + intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConstructUVec2, false, newSrcNode, type); + return newNode; } + [[fallthrough]]; case EOpConstructUVec3: case EOpConstructUVec4: case EOpConstructUint: @@ -7766,9 +8499,16 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EOpConstructBool: basicOp = EOpConstructBool; break; - -#ifndef GLSLANG_WEB - + case EOpConstructTextureSampler: + if ((node->getType().getBasicType() == EbtUint || node->getType().getBasicType() == EbtInt) && + node->getType().getVectorSize() == 2) { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "ivec2/uvec2 convert to texture handle"); + // No matter ivec2 or uvec2, Set EOpPackUint2x32 just to generate an opBitcast op code + TIntermTyped* newNode = + intermediate.addBuiltInFunctionCall(node->getLoc(), EOpPackUint2x32, true, node, type); + return newNode; + } + [[fallthrough]]; case EOpConstructDVec2: case EOpConstructDVec3: case EOpConstructDVec4: @@ -7801,7 +8541,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T basicOp = EOpConstructFloat16; // 8/16-bit storage extensions don't support constructing composites of 8/16-bit types, // so construct a 32-bit type and convert - if (!intermediate.getArithemeticFloat16Enabled()) { + // and do not generate any conversion if it is an identity conversion, i.e. float16_t( var) + if (!intermediate.getArithemeticFloat16Enabled() && (node->getBasicType() != EbtFloat16)) { TType tempType(EbtFloat, EvqTemporary, type.getVectorSize()); newNode = node; if (tempType != newNode->getType()) { @@ -7824,7 +8565,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T basicOp = EOpConstructInt8; // 8/16-bit storage extensions don't support constructing composites of 8/16-bit types, // so construct a 32-bit type and convert - if (!intermediate.getArithemeticInt8Enabled()) { + // and do not generate any conversion if it is an identity conversion, i.e. int8_t( var) + if (!intermediate.getArithemeticInt8Enabled() && (node->getBasicType() != EbtInt8)) { TType tempType(EbtInt, EvqTemporary, type.getVectorSize()); newNode = node; if (tempType != newNode->getType()) { @@ -7847,7 +8589,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T basicOp = EOpConstructUint8; // 8/16-bit storage extensions don't support constructing composites of 8/16-bit types, // so construct a 32-bit type and convert - if (!intermediate.getArithemeticInt8Enabled()) { + // and do not generate any conversion if it is an identity conversion, i.e. uint8_t( var) + if (!intermediate.getArithemeticInt8Enabled() && (node->getBasicType() != EbtUint8)) { TType tempType(EbtUint, EvqTemporary, type.getVectorSize()); newNode = node; if (tempType != newNode->getType()) { @@ -7870,7 +8613,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T basicOp = EOpConstructInt16; // 8/16-bit storage extensions don't support constructing composites of 8/16-bit types, // so construct a 32-bit type and convert - if (!intermediate.getArithemeticInt16Enabled()) { + // and do not generate any conversion if it is an identity conversion, i.e. int16_t( var) + if (!intermediate.getArithemeticInt16Enabled() && (node->getBasicType() != EbtInt16)) { TType tempType(EbtInt, EvqTemporary, type.getVectorSize()); newNode = node; if (tempType != newNode->getType()) { @@ -7893,7 +8637,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T basicOp = EOpConstructUint16; // 8/16-bit storage extensions don't support constructing composites of 8/16-bit types, // so construct a 32-bit type and convert - if (!intermediate.getArithemeticInt16Enabled()) { + // and do not generate any conversion if it is an identity conversion, i.e. uint16_t( var) + if (!intermediate.getArithemeticInt16Enabled() && (node->getBasicType() != EbtUint16)) { TType tempType(EbtUint, EvqTemporary, type.getVectorSize()); newNode = node; if (tempType != newNode->getType()) { @@ -7921,7 +8666,7 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T TIntermTyped* newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvPtrToUint64, true, node, type); return newNode; } - // fall through + [[fallthrough]]; case EOpConstructU64Vec2: case EOpConstructU64Vec3: case EOpConstructU64Vec4: @@ -7954,14 +8699,18 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T return nullptr; } - case EOpConstructCooperativeMatrix: + case EOpConstructCooperativeMatrixNV: + case EOpConstructCooperativeMatrixKHR: + if (node->getType() == type) { + return node; + } if (!node->getType().isCoopMat()) { if (type.getBasicType() != node->getType().getBasicType()) { node = intermediate.addConversion(type.getBasicType(), node); if (node == nullptr) return nullptr; } - node = intermediate.setAggregateOperator(node, EOpConstructCooperativeMatrix, type, node->getLoc()); + node = intermediate.setAggregateOperator(node, op, type, node->getLoc()); } else { TOperator op = EOpNull; switch (type.getBasicType()) { @@ -7974,6 +8723,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat16: op = EOpConvFloat16ToInt; break; case EbtUint8: op = EOpConvUint8ToInt; break; case EbtInt8: op = EOpConvInt8ToInt; break; + case EbtUint16: op = EOpConvUint16ToInt; break; + case EbtInt16: op = EOpConvInt16ToInt; break; case EbtUint: op = EOpConvUintToInt; break; default: assert(0); } @@ -7984,8 +8735,33 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat16: op = EOpConvFloat16ToUint; break; case EbtUint8: op = EOpConvUint8ToUint; break; case EbtInt8: op = EOpConvInt8ToUint; break; + case EbtUint16: op = EOpConvUint16ToUint; break; + case EbtInt16: op = EOpConvInt16ToUint; break; case EbtInt: op = EOpConvIntToUint; break; - case EbtUint: op = EOpConvUintToInt8; break; + default: assert(0); + } + break; + case EbtInt16: + switch (node->getType().getBasicType()) { + case EbtFloat: op = EOpConvFloatToInt16; break; + case EbtFloat16: op = EOpConvFloat16ToInt16; break; + case EbtUint8: op = EOpConvUint8ToInt16; break; + case EbtInt8: op = EOpConvInt8ToInt16; break; + case EbtUint16: op = EOpConvUint16ToInt16; break; + case EbtInt: op = EOpConvIntToInt16; break; + case EbtUint: op = EOpConvUintToInt16; break; + default: assert(0); + } + break; + case EbtUint16: + switch (node->getType().getBasicType()) { + case EbtFloat: op = EOpConvFloatToUint16; break; + case EbtFloat16: op = EOpConvFloat16ToUint16; break; + case EbtUint8: op = EOpConvUint8ToUint16; break; + case EbtInt8: op = EOpConvInt8ToUint16; break; + case EbtInt16: op = EOpConvInt16ToUint16; break; + case EbtInt: op = EOpConvIntToUint16; break; + case EbtUint: op = EOpConvUintToUint16; break; default: assert(0); } break; @@ -7994,6 +8770,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat: op = EOpConvFloatToInt8; break; case EbtFloat16: op = EOpConvFloat16ToInt8; break; case EbtUint8: op = EOpConvUint8ToInt8; break; + case EbtInt16: op = EOpConvInt16ToInt8; break; + case EbtUint16: op = EOpConvUint16ToInt8; break; case EbtInt: op = EOpConvIntToInt8; break; case EbtUint: op = EOpConvUintToInt8; break; default: assert(0); @@ -8004,6 +8782,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat: op = EOpConvFloatToUint8; break; case EbtFloat16: op = EOpConvFloat16ToUint8; break; case EbtInt8: op = EOpConvInt8ToUint8; break; + case EbtInt16: op = EOpConvInt16ToUint8; break; + case EbtUint16: op = EOpConvUint16ToUint8; break; case EbtInt: op = EOpConvIntToUint8; break; case EbtUint: op = EOpConvUintToUint8; break; default: assert(0); @@ -8014,6 +8794,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat16: op = EOpConvFloat16ToFloat; break; case EbtInt8: op = EOpConvInt8ToFloat; break; case EbtUint8: op = EOpConvUint8ToFloat; break; + case EbtInt16: op = EOpConvInt16ToFloat; break; + case EbtUint16: op = EOpConvUint16ToFloat; break; case EbtInt: op = EOpConvIntToFloat; break; case EbtUint: op = EOpConvUintToFloat; break; default: assert(0); @@ -8024,6 +8806,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat: op = EOpConvFloatToFloat16; break; case EbtInt8: op = EOpConvInt8ToFloat16; break; case EbtUint8: op = EOpConvUint8ToFloat16; break; + case EbtInt16: op = EOpConvInt16ToFloat16; break; + case EbtUint16: op = EOpConvUint16ToFloat16; break; case EbtInt: op = EOpConvIntToFloat16; break; case EbtUint: op = EOpConvUintToFloat16; break; default: assert(0); @@ -8042,17 +8826,16 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EOpConstructAccStruct: if ((node->getType().isScalar() && node->getType().getBasicType() == EbtUint64)) { // construct acceleration structure from uint64 - requireExtensions(loc, 1, &E_GL_EXT_ray_tracing, "uint64_t conversion to acclerationStructureEXT"); + requireExtensions(loc, Num_ray_tracing_EXTs, ray_tracing_EXTs, "uint64_t conversion to acclerationStructureEXT"); return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUint64ToAccStruct, true, node, type); } else if (node->getType().isVector() && node->getType().getBasicType() == EbtUint && node->getVectorSize() == 2) { // construct acceleration structure from uint64 - requireExtensions(loc, 1, &E_GL_EXT_ray_tracing, "uvec2 conversion to accelerationStructureEXT"); + requireExtensions(loc, Num_ray_tracing_EXTs, ray_tracing_EXTs, "uvec2 conversion to accelerationStructureEXT"); return intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvUvec2ToAccStruct, true, node, type); } else return nullptr; -#endif // GLSLANG_WEB default: error(loc, "unsupported construction", "", ""); @@ -8086,8 +8869,9 @@ TIntermTyped* TParseContext::constructAggregate(TIntermNode* node, const TType& { TIntermTyped* converted = intermediate.addConversion(EOpConstructStruct, type, node->getAsTyped()); if (! converted || converted->getType() != type) { + bool enhanced = intermediate.getEnhancedMsgs(); error(loc, "", "constructor", "cannot convert parameter %d from '%s' to '%s'", paramCount, - node->getAsTyped()->getType().getCompleteString().c_str(), type.getCompleteString().c_str()); + node->getAsTyped()->getType().getCompleteString(enhanced).c_str(), type.getCompleteString(enhanced).c_str()); return nullptr; } @@ -8098,7 +8882,6 @@ TIntermTyped* TParseContext::constructAggregate(TIntermNode* node, const TType& // If a memory qualifier is present in 'to', also make it present in 'from'. void TParseContext::inheritMemoryQualifiers(const TQualifier& from, TQualifier& to) { -#ifndef GLSLANG_WEB if (from.isReadOnly()) to.readonly = from.readonly; if (from.isWriteOnly()) @@ -8109,7 +8892,30 @@ void TParseContext::inheritMemoryQualifiers(const TQualifier& from, TQualifier& to.volatil = from.volatil; if (from.restrict) to.restrict = from.restrict; -#endif +} + +// +// Update qualifier layoutBindlessImage & layoutBindlessSampler on block member +// +void TParseContext::updateBindlessQualifier(TType& memberType) +{ + if (memberType.containsSampler()) { + if (memberType.isStruct()) { + TTypeList* typeList = memberType.getWritableStruct(); + for (unsigned int member = 0; member < typeList->size(); ++member) { + TType* subMemberType = (*typeList)[member].type; + updateBindlessQualifier(*subMemberType); + } + } + else if (memberType.getSampler().isImage()) { + intermediate.setBindlessImageMode(currentCaller, AstRefTypeLayout); + memberType.getQualifier().layoutBindlessImage = true; + } + else { + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeLayout); + memberType.getQualifier().layoutBindlessSampler = true; + } + } } // @@ -8138,7 +8944,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con error(memberLoc, "member storage qualifier cannot contradict block storage qualifier", memberType.getFieldName().c_str(), ""); memberQualifier.storage = currentBlockQualifier.storage; globalQualifierFixCheck(memberLoc, memberQualifier); -#ifndef GLSLANG_WEB inheritMemoryQualifiers(currentBlockQualifier, memberQualifier); if (currentBlockQualifier.perPrimitiveNV) memberQualifier.perPrimitiveNV = currentBlockQualifier.perPrimitiveNV; @@ -8146,11 +8951,12 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con memberQualifier.perViewNV = currentBlockQualifier.perViewNV; if (currentBlockQualifier.perTaskNV) memberQualifier.perTaskNV = currentBlockQualifier.perTaskNV; + if (currentBlockQualifier.storage == EvqtaskPayloadSharedEXT) + memberQualifier.storage = EvqtaskPayloadSharedEXT; if (memberQualifier.storage == EvqSpirvStorageClass) error(memberLoc, "member cannot have a spirv_storage_class qualifier", memberType.getFieldName().c_str(), ""); - if (memberQualifier.hasSprivDecorate() && !memberQualifier.getSpirvDecorate().decorateIds.empty()) + if (memberQualifier.hasSpirvDecorate() && !memberQualifier.getSpirvDecorate().decorateIds.empty()) error(memberLoc, "member cannot have a spirv_decorate_id qualifier", memberType.getFieldName().c_str(), ""); -#endif if ((currentBlockQualifier.storage == EvqUniform || currentBlockQualifier.storage == EvqBuffer) && (memberQualifier.isInterpolation() || memberQualifier.isAuxiliary())) error(memberLoc, "member of uniform or buffer block cannot have an auxiliary or interpolation qualifier", memberType.getFieldName().c_str(), ""); if (memberType.isArray()) @@ -8162,8 +8968,13 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con } } - if (memberType.containsOpaque()) - error(memberLoc, "member of block cannot be or contain a sampler, image, or atomic_uint type", typeList[member].type->getFieldName().c_str(), ""); + // For bindless texture, sampler can be declared as uniform/storage block member, + if (memberType.containsOpaque()) { + if (memberType.containsSampler() && extensionTurnedOn(E_GL_ARB_bindless_texture)) + updateBindlessQualifier(memberType); + else + error(memberLoc, "member of block cannot be or contain a sampler, image, or atomic_uint type", typeList[member].type->getFieldName().c_str(), ""); + } if (memberType.containsCoopMat()) error(memberLoc, "member of block cannot be or contain a cooperative matrix type", typeList[member].type->getFieldName().c_str(), ""); @@ -8225,7 +9036,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con for (unsigned int member = 0; member < typeList.size(); ++member) { TQualifier& memberQualifier = typeList[member].type->getQualifier(); const TSourceLoc& memberLoc = typeList[member].loc; -#ifndef GLSLANG_WEB if (memberQualifier.hasStream()) { if (defaultQualification.layoutStream != memberQualifier.layoutStream) error(memberLoc, "member cannot contradict block", "stream", ""); @@ -8239,14 +9049,12 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (defaultQualification.layoutXfbBuffer != memberQualifier.layoutXfbBuffer) error(memberLoc, "member cannot contradict block (or what block inherited from global)", "xfb_buffer", ""); } -#endif if (memberQualifier.hasPacking()) error(memberLoc, "member of block cannot have a packing layout qualifier", typeList[member].type->getFieldName().c_str(), ""); if (memberQualifier.hasLocation()) { const char* feature = "location on block member"; switch (currentBlockQualifier.storage) { -#ifndef GLSLANG_WEB case EvqVaryingIn: case EvqVaryingOut: requireProfile(memberLoc, ECoreProfile | ECompatibilityProfile | EEsProfile, feature); @@ -8254,7 +9062,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con profileRequires(memberLoc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature); memberWithLocation = true; break; -#endif default: error(memberLoc, "can only use in an in/out block", feature, ""); break; @@ -8282,7 +9089,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con layoutMemberLocationArrayCheck(loc, memberWithLocation, arraySizes); -#ifndef GLSLANG_WEB // Ensure that the block has an XfbBuffer assigned. This is needed // because if the block has a XfbOffset assigned, then it is // assumed that it has implicitly assigned the current global @@ -8292,7 +9098,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (!currentBlockQualifier.hasXfbBuffer() && currentBlockQualifier.hasXfbOffset()) currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer; } -#endif // Process the members fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation); @@ -8303,13 +9108,11 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con for (unsigned int member = 0; member < typeList.size(); ++member) layoutTypeCheck(typeList[member].loc, *typeList[member].type); -#ifndef GLSLANG_WEB if (memberWithPerViewQualifier) { for (unsigned int member = 0; member < typeList.size(); ++member) { checkAndResizeMeshViewDim(typeList[member].loc, *typeList[member].type, /*isBlockMember*/ true); } } -#endif // reverse merge, so that currentBlockQualifier now has all layout information // (can't use defaultQualification directly, it's missing other non-layout-default-class qualifiers) @@ -8323,7 +9126,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (arraySizes != nullptr) blockType.transferArraySizes(arraySizes); -#ifndef GLSLANG_WEB if (arraySizes == nullptr) ioArrayCheck(loc, blockType, instanceName ? *instanceName : *blockName); if (currentBlockQualifier.hasBufferReference()) { @@ -8350,9 +9152,7 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (!instanceName) { return; } - } else -#endif - { + } else { // // Don't make a user-defined type out of block name; that will cause an error // if the same block name gets reused in a different interface. @@ -8400,14 +9200,12 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con // Check for general layout qualifier errors layoutObjectCheck(loc, variable); -#ifndef GLSLANG_WEB // fix up if (isIoResizeArray(blockType)) { ioArraySymbolResizeList.push_back(&variable); checkIoArraysConsistency(loc, true); } else fixIoArraySize(loc, variable.getWritableType()); -#endif // Save it in the AST for linker use. trackLinkage(variable); @@ -8446,23 +9244,23 @@ void TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& q // It is a compile-time error to have an input block in a vertex shader or an output block in a fragment shader // "Compute shaders do not permit user-defined input variables..." requireStage(loc, (EShLanguageMask)(EShLangTessControlMask|EShLangTessEvaluationMask|EShLangGeometryMask| - EShLangFragmentMask|EShLangMeshNVMask), "input block"); + EShLangFragmentMask|EShLangMeshMask), "input block"); if (language == EShLangFragment) { profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, "fragment input block"); - } else if (language == EShLangMeshNV && ! qualifier.isTaskMemory()) { + } else if (language == EShLangMesh && ! qualifier.isTaskMemory()) { error(loc, "input blocks cannot be used in a mesh shader", "out", ""); } break; case EvqVaryingOut: profileRequires(loc, ~EEsProfile, 150, E_GL_ARB_separate_shader_objects, "output block"); requireStage(loc, (EShLanguageMask)(EShLangVertexMask|EShLangTessControlMask|EShLangTessEvaluationMask| - EShLangGeometryMask|EShLangMeshNVMask|EShLangTaskNVMask), "output block"); + EShLangGeometryMask|EShLangMeshMask|EShLangTaskMask), "output block"); // ES 310 can have a block before shader_io is turned on, so skip this test for built-ins if (language == EShLangVertex && ! parsingBuiltins) { profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, "vertex output block"); - } else if (language == EShLangMeshNV && qualifier.isTaskMemory()) { + } else if (language == EShLangMesh && qualifier.isTaskMemory()) { error(loc, "can only use on input blocks in mesh shader", "taskNV", ""); - } else if (language == EShLangTaskNV && ! qualifier.isTaskMemory()) { + } else if (language == EShLangTask && ! qualifier.isTaskMemory()) { error(loc, "output blocks cannot be used in a task shader", "out", ""); } break; @@ -8472,7 +9270,6 @@ void TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& q } profileRequires(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shared_memory_block, "shared block"); break; -#ifndef GLSLANG_WEB case EvqPayload: profileRequires(loc, ~EEsProfile, 460, 2, extsrt, "rayPayloadNV block"); requireStage(loc, (EShLanguageMask)(EShLangRayGenMask | EShLangAnyHitMask | EShLangClosestHitMask | EShLangMissMask), @@ -8496,7 +9293,10 @@ void TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& q profileRequires(loc, ~EEsProfile, 460, 2, extsrt, "callableDataInNV block"); requireStage(loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInNV block"); break; -#endif + case EvqHitObjectAttrNV: + profileRequires(loc, ~EEsProfile, 460, E_GL_NV_shader_invocation_reorder, "hitObjectAttributeNV block"); + requireStage(loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | EShLangMissMask), "hitObjectAttributeNV block"); + break; default: error(loc, "only uniform, buffer, in, or out blocks are supported", blockName->c_str(), ""); break; @@ -8585,7 +9385,6 @@ void TParseContext::fixBlockLocations(const TSourceLoc& loc, TQualifier& qualifi void TParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList) { -#ifndef GLSLANG_WEB // "If a block is qualified with xfb_offset, all its // members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any // members of that block not qualified with an xfb_offset will not be assigned transform feedback buffer @@ -8619,7 +9418,6 @@ void TParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList) // The above gave all block members an offset, so we can take it off the block now, // which will avoid double counting the offset usage. qualifier.layoutXfbOffset = TQualifier::layoutXfbOffsetEnd; -#endif } // Calculate and save the offset of each block member, using the recursively @@ -8652,7 +9450,8 @@ void TParseContext::fixBlockUniformOffsets(TQualifier& qualifier, TTypeList& typ // "The specified offset must be a multiple // of the base alignment of the type of the block member it qualifies, or a compile-time error results." if (! IsMultipleOfPow2(memberQualifier.layoutOffset, memberAlignment)) - error(memberLoc, "must be a multiple of the member's alignment", "offset", ""); + error(memberLoc, "must be a multiple of the member's alignment", "offset", + "(layout offset = %d | member alignment = %d)", memberQualifier.layoutOffset, memberAlignment); // GLSL: "It is a compile-time error to specify an offset that is smaller than the offset of the previous // member in the block or that lies within the previous member of the block" @@ -8795,7 +9594,7 @@ void TParseContext::addQualifierToExisting(const TSourceLoc& loc, TQualifier qua // TParseContext::declareBlock. if (!symbol && qualifier.hasBufferReference()) { TTypeList typeList; - TType blockType(&typeList, identifier, qualifier);; + TType blockType(&typeList, identifier, qualifier); TType blockNameType(EbtReference, blockType, identifier); TVariable* blockNameVar = new TVariable(&identifier, blockNameType, true); if (! symbolTable.insert(*blockNameVar)) { @@ -8874,9 +9673,8 @@ void TParseContext::invariantCheck(const TSourceLoc& loc, const TQualifier& qual // void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, const TPublicType& publicType) { -#ifndef GLSLANG_WEB if (publicType.shaderQualifiers.vertices != TQualifier::layoutNotSet) { - assert(language == EShLangTessControl || language == EShLangGeometry || language == EShLangMeshNV); + assert(language == EShLangTessControl || language == EShLangGeometry || language == EShLangMesh); const char* id = (language == EShLangTessControl) ? "vertices" : "max_vertices"; if (publicType.qualifier.storage != EvqVaryingOut) @@ -8888,7 +9686,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con checkIoArraysConsistency(loc); } if (publicType.shaderQualifiers.primitives != TQualifier::layoutNotSet) { - assert(language == EShLangMeshNV); + assert(language == EShLangMesh); const char* id = "max_primitives"; if (publicType.qualifier.storage != EvqVaryingOut) @@ -8912,7 +9710,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con case ElgTrianglesAdjacency: case ElgQuads: case ElgIsolines: - if (language == EShLangMeshNV) { + if (language == EShLangMesh) { error(loc, "cannot apply to input", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), ""); break; } @@ -8929,11 +9727,11 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con switch (publicType.shaderQualifiers.geometry) { case ElgLines: case ElgTriangles: - if (language != EShLangMeshNV) { + if (language != EShLangMesh) { error(loc, "cannot apply to 'out'", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), ""); break; } - // Fall through + [[fallthrough]]; case ElgPoints: case ElgLineStrip: case ElgTriangleStrip: @@ -8966,7 +9764,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con else error(loc, "can only apply to 'in'", "point_mode", ""); } -#endif + for (int i = 0; i < 3; ++i) { if (publicType.shaderQualifiers.localSizeNotDefault[i]) { if (publicType.qualifier.storage == EvqVaryingIn) { @@ -8983,29 +9781,57 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con } if (intermediate.getLocalSize(i) > (unsigned int)max) error(loc, "too large; see gl_MaxComputeWorkGroupSize", "local_size", ""); - } -#ifndef GLSLANG_WEB - else if (language == EShLangMeshNV) { + } else if (language == EShLangMesh) { switch (i) { - case 0: max = resources.maxMeshWorkGroupSizeX_NV; break; - case 1: max = resources.maxMeshWorkGroupSizeY_NV; break; - case 2: max = resources.maxMeshWorkGroupSizeZ_NV; break; + case 0: + max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? + resources.maxMeshWorkGroupSizeX_EXT : + resources.maxMeshWorkGroupSizeX_NV; + break; + case 1: + max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? + resources.maxMeshWorkGroupSizeY_EXT : + resources.maxMeshWorkGroupSizeY_NV ; + break; + case 2: + max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? + resources.maxMeshWorkGroupSizeZ_EXT : + resources.maxMeshWorkGroupSizeZ_NV ; + break; default: break; } - if (intermediate.getLocalSize(i) > (unsigned int)max) - error(loc, "too large; see gl_MaxMeshWorkGroupSizeNV", "local_size", ""); - } else if (language == EShLangTaskNV) { + if (intermediate.getLocalSize(i) > (unsigned int)max) { + TString maxsErrtring = "too large, see "; + maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? + "gl_MaxMeshWorkGroupSizeEXT" : "gl_MaxMeshWorkGroupSizeNV"); + error(loc, maxsErrtring.c_str(), "local_size", ""); + } + } else if (language == EShLangTask) { switch (i) { - case 0: max = resources.maxTaskWorkGroupSizeX_NV; break; - case 1: max = resources.maxTaskWorkGroupSizeY_NV; break; - case 2: max = resources.maxTaskWorkGroupSizeZ_NV; break; + case 0: + max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? + resources.maxTaskWorkGroupSizeX_EXT : + resources.maxTaskWorkGroupSizeX_NV; + break; + case 1: + max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? + resources.maxTaskWorkGroupSizeY_EXT: + resources.maxTaskWorkGroupSizeY_NV; + break; + case 2: + max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? + resources.maxTaskWorkGroupSizeZ_EXT: + resources.maxTaskWorkGroupSizeZ_NV; + break; default: break; } - if (intermediate.getLocalSize(i) > (unsigned int)max) - error(loc, "too large; see gl_MaxTaskWorkGroupSizeNV", "local_size", ""); - } -#endif - else { + if (intermediate.getLocalSize(i) > (unsigned int)max) { + TString maxsErrtring = "too large, see "; + maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? + "gl_MaxTaskWorkGroupSizeEXT" : "gl_MaxTaskWorkGroupSizeNV"); + error(loc, maxsErrtring.c_str(), "local_size", ""); + } + } else { assert(0); } @@ -9030,19 +9856,42 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con } } -#ifndef GLSLANG_WEB if (publicType.shaderQualifiers.earlyFragmentTests) { if (publicType.qualifier.storage == EvqVaryingIn) intermediate.setEarlyFragmentTests(); else error(loc, "can only apply to 'in'", "early_fragment_tests", ""); } + if (publicType.shaderQualifiers.earlyAndLateFragmentTestsAMD) { + if (publicType.qualifier.storage == EvqVaryingIn) + intermediate.setEarlyAndLateFragmentTestsAMD(); + else + error(loc, "can only apply to 'in'", "early_and_late_fragment_tests_amd", ""); + } if (publicType.shaderQualifiers.postDepthCoverage) { if (publicType.qualifier.storage == EvqVaryingIn) intermediate.setPostDepthCoverage(); else error(loc, "can only apply to 'in'", "post_coverage_coverage", ""); } + if (publicType.shaderQualifiers.nonCoherentColorAttachmentReadEXT) { + if (publicType.qualifier.storage == EvqVaryingIn) + intermediate.setNonCoherentColorAttachmentReadEXT(); + else + error(loc, "can only apply to 'in'", "non_coherent_color_attachment_readEXT", ""); + } + if (publicType.shaderQualifiers.nonCoherentDepthAttachmentReadEXT) { + if (publicType.qualifier.storage == EvqVaryingIn) + intermediate.setNonCoherentDepthAttachmentReadEXT(); + else + error(loc, "can only apply to 'in'", "non_coherent_depth_attachment_readEXT", ""); + } + if (publicType.shaderQualifiers.nonCoherentStencilAttachmentReadEXT) { + if (publicType.qualifier.storage == EvqVaryingIn) + intermediate.setNonCoherentStencilAttachmentReadEXT(); + else + error(loc, "can only apply to 'in'", "non_coherent_stencil_attachment_readEXT", ""); + } if (publicType.shaderQualifiers.hasBlendEquation()) { if (publicType.qualifier.storage != EvqVaryingOut) error(loc, "can only apply to 'out'", "blend equation", ""); @@ -9085,7 +9934,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con error(loc, "can only apply to 'in'", "derivative_group_linearNV", ""); } // Check mesh out array sizes, once all the necessary out qualifiers are defined. - if ((language == EShLangMeshNV) && + if ((language == EShLangMesh) && (intermediate.getVertices() != TQualifier::layoutNotSet) && (intermediate.getPrimitives() != TQualifier::layoutNotSet) && (intermediate.getOutputPrimitive() != ElgNone)) @@ -9102,7 +9951,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con // Exit early as further checks are not valid return; } -#endif + const TQualifier& qualifier = publicType.qualifier; if (qualifier.isAuxiliary() || @@ -9135,7 +9984,6 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con case EvqVaryingIn: break; case EvqVaryingOut: -#ifndef GLSLANG_WEB if (qualifier.hasStream()) globalOutputDefaults.layoutStream = qualifier.layoutStream; if (qualifier.hasXfbBuffer()) @@ -9144,7 +9992,6 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con if (! intermediate.setXfbBufferStride(globalOutputDefaults.layoutXfbBuffer, qualifier.layoutXfbStride)) error(loc, "all stride settings must match for xfb buffer", "xfb_stride", "%d", qualifier.layoutXfbBuffer); } -#endif break; case EvqShared: if (qualifier.hasMatrix()) @@ -9237,11 +10084,14 @@ TIntermNode* TParseContext::addSwitch(const TSourceLoc& loc, TIntermTyped* expre // "it is an error to have no statement between a label and the end of the switch statement." // The specifications were updated to remove this (being ill-defined what a "statement" was), // so, this became a warning. However, 3.0 tests still check for the error. - if (isEsProfile() && version <= 300 && ! relaxedErrors()) + if (isEsProfile() && (version <= 300 || version >= 320) && ! relaxedErrors()) + error(loc, "last case/default label not followed by statements", "switch", ""); + else if (!isEsProfile() && (version <= 430 || version >= 460)) error(loc, "last case/default label not followed by statements", "switch", ""); else warn(loc, "last case/default label not followed by statements", "switch", ""); + // emulate a break for error recovery lastStatements = intermediate.makeAggregate(intermediate.addBranch(EOpBreak, loc)); lastStatements->setOperator(EOpSequence); @@ -9296,5 +10146,38 @@ const TTypeList* TParseContext::recordStructCopy(TStructRecord& record, const TT return originStruct; } -} // end namespace glslang +TLayoutFormat TParseContext::mapLegacyLayoutFormat(TLayoutFormat legacyLayoutFormat, TBasicType imageType) +{ + TLayoutFormat layoutFormat = ElfNone; + if (imageType == EbtFloat) { + switch (legacyLayoutFormat) { + case ElfSize1x16: layoutFormat = ElfR16f; break; + case ElfSize1x32: layoutFormat = ElfR32f; break; + case ElfSize2x32: layoutFormat = ElfRg32f; break; + case ElfSize4x32: layoutFormat = ElfRgba32f; break; + default: break; + } + } else if (imageType == EbtUint) { + switch (legacyLayoutFormat) { + case ElfSize1x8: layoutFormat = ElfR8ui; break; + case ElfSize1x16: layoutFormat = ElfR16ui; break; + case ElfSize1x32: layoutFormat = ElfR32ui; break; + case ElfSize2x32: layoutFormat = ElfRg32ui; break; + case ElfSize4x32: layoutFormat = ElfRgba32ui; break; + default: break; + } + } else if (imageType == EbtInt) { + switch (legacyLayoutFormat) { + case ElfSize1x8: layoutFormat = ElfR8i; break; + case ElfSize1x16: layoutFormat = ElfR16i; break; + case ElfSize1x32: layoutFormat = ElfR32i; break; + case ElfSize2x32: layoutFormat = ElfRg32i; break; + case ElfSize4x32: layoutFormat = ElfRgba32i; break; + default: break; + } + } + return layoutFormat; +} + +} // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.h index de4488465..16902aefe 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ParseHelper.h @@ -95,12 +95,15 @@ public: globalUniformSet(TQualifier::layoutSetEnd), atomicCounterBlockSet(TQualifier::layoutSetEnd) { + // use storage buffer on SPIR-V 1.3 and up + if (spvVersion.spv >= EShTargetSpv_1_3) + intermediate.setUseStorageBuffer(); + if (entryPoint != nullptr) sourceEntryPointName = *entryPoint; } virtual ~TParseContextBase() { } -#if !defined(GLSLANG_WEB) || defined(GLSLANG_WEB_DEVEL) virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...); virtual void C_DECL warn(const TSourceLoc&, const char* szReason, const char* szToken, @@ -109,7 +112,6 @@ public: const char* szExtraInfoFormat, ...); virtual void C_DECL ppWarn(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...); -#endif virtual void setLimits(const TBuiltInResource&) = 0; @@ -178,6 +180,7 @@ public: // Basic parsing state, easily accessible to the grammar TSymbolTable& symbolTable; // symbol table that goes with the current language, version, and profile + TVector relaxedSymbols; int statementNestingLevel; // 0 if outside all flow control or compound statements int loopNestingLevel; // 0 if outside all loops int structNestingLevel; // 0 if outside structures @@ -194,6 +197,7 @@ public: struct TPragma contextPragma; int beginInvocationInterlockCount; int endInvocationInterlockCount; + bool compileOnly = false; protected: TParseContextBase(TParseContextBase&); @@ -241,7 +245,7 @@ protected: // override this to set the language-specific name virtual const char* getAtomicCounterBlockName() const { return ""; } virtual void setAtomicCounterBlockDefaults(TType&) const {} - virtual void setInvariant(const TSourceLoc& loc, const char* builtin) {} + virtual void setInvariant(const TSourceLoc&, const char*) {} virtual void finalizeAtomicCounterBlockLayout(TVariable&) {} bool isAtomicCounterBlock(const TSymbol& symbol) { const TVariable* var = symbol.getAsVariable(); @@ -327,10 +331,8 @@ public: TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index); void handleIndexLimits(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index); -#ifndef GLSLANG_WEB void makeEditable(TSymbol*&) override; void ioArrayCheck(const TSourceLoc&, const TType&, const TString& identifier); -#endif bool isIoResizeArray(const TType&) const; void fixIoArraySize(const TSourceLoc&, TType&); void handleIoResizeArrayAccess(const TSourceLoc&, TIntermTyped* base); @@ -366,6 +368,10 @@ public: TIntermTyped* vkRelaxedRemapFunctionCall(const TSourceLoc&, TFunction*, TIntermNode*); // returns true if the variable was remapped to something else bool vkRelaxedRemapUniformVariable(const TSourceLoc&, TString&, const TPublicType&, TArraySizes*, TIntermTyped*, TType&); + void vkRelaxedRemapUniformMembers(const TSourceLoc&, const TPublicType&, const TType&, const TString&); + void vkRelaxedRemapFunctionParameter(TFunction*, TParameter&, std::vector* newParams = nullptr); + TIntermNode* vkRelaxedRemapFunctionArgument(const TSourceLoc&, TFunction*, TIntermTyped*); + TIntermTyped* vkRelaxedRemapDotDereference(const TSourceLoc&, TIntermTyped&, const TType&, const TString&); void assignError(const TSourceLoc&, const char* op, TString left, TString right); void unaryOpError(const TSourceLoc&, const char* op, TString operand); @@ -378,7 +384,7 @@ public: void globalCheck(const TSourceLoc&, const char* token); bool constructorError(const TSourceLoc&, TIntermNode*, TFunction&, TOperator, TType&); bool constructorTextureSamplerError(const TSourceLoc&, const TFunction&); - void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&, const char *sizeType); + void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&, const char *sizeType, const bool allowZero = false); bool arrayQualifierError(const TSourceLoc&, const TQualifier&); bool arrayError(const TSourceLoc&, const TType&); void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&); @@ -393,14 +399,14 @@ public: void accStructCheck(const TSourceLoc & loc, const TType & type, const TString & identifier); void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier); void memberQualifierCheck(glslang::TPublicType&); - void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false); + void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false, const TPublicType* publicType = nullptr); void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&); bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType); void mergeQualifiers(const TSourceLoc&, TQualifier& dst, const TQualifier& src, bool force); void setDefaultPrecision(const TSourceLoc&, TPublicType&, TPrecisionQualifier); int computeSamplerTypeIndex(TSampler&); TPrecisionQualifier getDefaultPrecision(TPublicType&); - void precisionQualifierCheck(const TSourceLoc&, TBasicType, TQualifier&); + void precisionQualifierCheck(const TSourceLoc&, TBasicType, TQualifier&, bool isCoopMat); void parameterTypeCheck(const TSourceLoc&, TStorageQualifier qualifier, const TType& type); bool containsFieldWithBasicType(const TType& type ,TBasicType basicType); TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&); @@ -418,6 +424,7 @@ public: void inductiveLoopCheck(const TSourceLoc&, TIntermNode* init, TIntermLoop* loop); void arrayLimitCheck(const TSourceLoc&, const TString&, int size); void limitCheck(const TSourceLoc&, int value, const char* limit, const char* feature); + void coopMatTypeParametersCheck(const TSourceLoc&, const TPublicType&); void inductiveLoopBodyCheck(TIntermNode*, long long loopIndexId, TSymbolTable&); void constantIndexExpressionCheck(TIntermNode*); @@ -438,12 +445,12 @@ public: const TFunction* findFunction400(const TSourceLoc& loc, const TFunction& call, bool& builtIn); const TFunction* findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn); void declareTypeDefaults(const TSourceLoc&, const TPublicType&); - TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, const TPublicType&, TArraySizes* typeArray = 0, TIntermTyped* initializer = 0); + TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, const TPublicType&, TArraySizes* typeArray = nullptr, TIntermTyped* initializer = nullptr); TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&); TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&); TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset); void inheritMemoryQualifiers(const TQualifier& from, TQualifier& to); - void declareBlock(const TSourceLoc&, TTypeList& typeList, const TString* instanceName = 0, TArraySizes* arraySizes = 0); + void declareBlock(const TSourceLoc&, TTypeList& typeList, const TString* instanceName = nullptr, TArraySizes* arraySizes = nullptr); void blockStorageRemap(const TSourceLoc&, const TString*, TQualifier&); void blockStageIoCheck(const TSourceLoc&, const TQualifier&); void blockQualifierCheck(const TSourceLoc&, const TQualifier&, bool instanceName); @@ -456,11 +463,12 @@ public: void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&); void invariantCheck(const TSourceLoc&, const TQualifier&); void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&); + void updateBindlessQualifier(TType& memberType); void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode); TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body); const TTypeList* recordStructCopy(TStructRecord&, const TType*, const TType*); + TLayoutFormat mapLegacyLayoutFormat(TLayoutFormat legacyLayoutFormat, TBasicType imageType); -#ifndef GLSLANG_WEB TAttributeType attributeFromName(const TString& name) const; TAttributes* makeAttributes(const TString& identifier) const; TAttributes* makeAttributes(const TString& identifier, TIntermNode* node) const; @@ -472,7 +480,7 @@ public: // Determine loop control from attributes void handleLoopAttributes(const TAttributes& attributes, TIntermNode*); // Function attributes - void handleFunctionAttributes(const TSourceLoc&, const TAttributes&, TFunction*); + void handleFunctionAttributes(const TSourceLoc&, const TAttributes&); // GL_EXT_spirv_intrinsics TSpirvRequirement* makeSpirvRequirement(const TSourceLoc& loc, const TString& name, @@ -480,15 +488,13 @@ public: TSpirvRequirement* mergeSpirvRequirements(const TSourceLoc& loc, TSpirvRequirement* spirvReq1, TSpirvRequirement* spirvReq2); TSpirvTypeParameters* makeSpirvTypeParameters(const TSourceLoc& loc, const TIntermConstantUnion* constant); - TSpirvTypeParameters* makeSpirvTypeParameters(const TPublicType& type); + TSpirvTypeParameters* makeSpirvTypeParameters(const TSourceLoc& loc, const TPublicType& type); TSpirvTypeParameters* mergeSpirvTypeParameters(TSpirvTypeParameters* spirvTypeParams1, TSpirvTypeParameters* spirvTypeParams2); TSpirvInstruction* makeSpirvInstruction(const TSourceLoc& loc, const TString& name, const TString& value); TSpirvInstruction* makeSpirvInstruction(const TSourceLoc& loc, const TString& name, int value); TSpirvInstruction* mergeSpirvInstruction(const TSourceLoc& loc, TSpirvInstruction* spirvInst1, TSpirvInstruction* spirvInst2); -#endif - void checkAndResizeMeshViewDim(const TSourceLoc&, TType&, bool isBlockMember); protected: @@ -501,9 +507,7 @@ protected: bool isRuntimeLength(const TIntermTyped&) const; TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable); TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer); -#ifndef GLSLANG_WEB void finish() override; -#endif virtual const char* getGlobalUniformBlockName() const override; virtual void finalizeGlobalUniformBlockLayout(TVariable&) override; @@ -540,7 +544,6 @@ protected: TQualifier globalOutputDefaults; TQualifier globalSharedDefaults; TString currentCaller; // name of last function body entered (not valid when at global scope) -#ifndef GLSLANG_WEB int* atomicUintOffsets; // to become an array of the right size to hold an offset per binding point bool anyIndexLimits; TIdSetType inductiveLoopIds; @@ -581,7 +584,6 @@ protected: // array-sizing declarations // TVector ioArraySymbolResizeList; -#endif }; } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/PoolAlloc.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/PoolAlloc.cpp index 84c40f4e7..5d7173c9d 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/PoolAlloc.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/PoolAlloc.cpp @@ -35,34 +35,28 @@ #include "../Include/Common.h" #include "../Include/PoolAlloc.h" -#include "../Include/InitializeGlobals.h" -#include "../OSDependent/osinclude.h" - namespace glslang { -// Process-wide TLS index -OS_TLSIndex PoolIndex; +namespace { +thread_local TPoolAllocator* threadPoolAllocator = nullptr; + +TPoolAllocator* GetDefaultThreadPoolAllocator() +{ + thread_local TPoolAllocator defaultAllocator; + return &defaultAllocator; +} +} // anonymous namespace // Return the thread-specific current pool. TPoolAllocator& GetThreadPoolAllocator() { - return *static_cast(OS_GetTLSValue(PoolIndex)); + return *(threadPoolAllocator ? threadPoolAllocator : GetDefaultThreadPoolAllocator()); } // Set the thread-specific current pool. void SetThreadPoolAllocator(TPoolAllocator* poolAllocator) { - OS_SetTLSValue(PoolIndex, poolAllocator); -} - -// Process-wide set up of the TLS pool storage. -bool InitializePoolIndex() -{ - // Allocate a TLS index. - if ((PoolIndex = OS_AllocTLSIndex()) == OS_INVALID_TLS_INDEX) - return false; - - return true; + threadPoolAllocator = poolAllocator; } // @@ -137,16 +131,6 @@ TPoolAllocator::~TPoolAllocator() } } -const unsigned char TAllocation::guardBlockBeginVal = 0xfb; -const unsigned char TAllocation::guardBlockEndVal = 0xfe; -const unsigned char TAllocation::userDataFill = 0xcd; - -# ifdef GUARD_BLOCKS - const size_t TAllocation::guardBlockSize = 16; -# else - const size_t TAllocation::guardBlockSize = 0; -# endif - // // Check a single guard block for damage // @@ -267,8 +251,8 @@ void* TPoolAllocator::allocate(size_t numBytes) // size_t numBytesToAlloc = allocationSize + headerSkip; tHeader* memory = reinterpret_cast(::new char[numBytesToAlloc]); - if (memory == 0) - return 0; + if (memory == nullptr) + return nullptr; // Use placement-new to initialize header new(memory) tHeader(inUseList, (numBytesToAlloc + pageSize - 1) / pageSize); @@ -289,8 +273,8 @@ void* TPoolAllocator::allocate(size_t numBytes) freeList = freeList->nextPage; } else { memory = reinterpret_cast(::new char[pageSize]); - if (memory == 0) - return 0; + if (memory == nullptr) + return nullptr; } // Use placement-new to initialize header @@ -308,7 +292,7 @@ void* TPoolAllocator::allocate(size_t numBytes) // void TAllocation::checkAllocList() const { - for (const TAllocation* alloc = this; alloc != 0; alloc = alloc->prevAlloc) + for (const TAllocation* alloc = this; alloc != nullptr; alloc = alloc->prevAlloc) alloc->check(); } diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Scan.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Scan.cpp index c387aede0..44546596e 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Scan.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Scan.cpp @@ -324,11 +324,9 @@ struct str_hash // A single global usable by all threads, by all versions, by all languages. // After a single process-level initialization, this is read only and thread safe std::unordered_map* KeywordMap = nullptr; -#ifndef GLSLANG_WEB std::unordered_set* ReservedSet = nullptr; -#endif -}; +} namespace glslang { @@ -343,6 +341,7 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["const"] = CONST; (*KeywordMap)["uniform"] = UNIFORM; + (*KeywordMap)["tileImageEXT"] = TILEIMAGEEXT; (*KeywordMap)["buffer"] = BUFFER; (*KeywordMap)["in"] = IN; (*KeywordMap)["out"] = OUT; @@ -408,7 +407,6 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["uvec3"] = UVEC3; (*KeywordMap)["uvec4"] = UVEC4; -#ifndef GLSLANG_WEB (*KeywordMap)["nonuniformEXT"] = NONUNIFORM; (*KeywordMap)["demote"] = DEMOTE; (*KeywordMap)["attribute"] = ATTRIBUTE; @@ -598,7 +596,6 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["spirv_storage_class"] = SPIRV_STORAGE_CLASS; (*KeywordMap)["spirv_by_reference"] = SPIRV_BY_REFERENCE; (*KeywordMap)["spirv_literal"] = SPIRV_LITERAL; -#endif (*KeywordMap)["sampler2D"] = SAMPLER2D; (*KeywordMap)["samplerCube"] = SAMPLERCUBE; @@ -632,7 +629,6 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["sampler"] = SAMPLER; (*KeywordMap)["samplerShadow"] = SAMPLERSHADOW; -#ifndef GLSLANG_WEB (*KeywordMap)["textureCubeArray"] = TEXTURECUBEARRAY; (*KeywordMap)["itextureCubeArray"] = ITEXTURECUBEARRAY; (*KeywordMap)["utextureCubeArray"] = UTEXTURECUBEARRAY; @@ -685,6 +681,10 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["texture2DRect"] = TEXTURE2DRECT; (*KeywordMap)["texture1DArray"] = TEXTURE1DARRAY; + (*KeywordMap)["attachmentEXT"] = ATTACHMENTEXT; + (*KeywordMap)["iattachmentEXT"] = IATTACHMENTEXT; + (*KeywordMap)["uattachmentEXT"] = UATTACHMENTEXT; + (*KeywordMap)["subpassInput"] = SUBPASSINPUT; (*KeywordMap)["subpassInputMS"] = SUBPASSINPUTMS; (*KeywordMap)["isubpassInput"] = ISUBPASSINPUT; @@ -739,6 +739,7 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["f16subpassInputMS"] = F16SUBPASSINPUTMS; (*KeywordMap)["__explicitInterpAMD"] = EXPLICITINTERPAMD; (*KeywordMap)["pervertexNV"] = PERVERTEXNV; + (*KeywordMap)["pervertexEXT"] = PERVERTEXEXT; (*KeywordMap)["precise"] = PRECISE; (*KeywordMap)["rayPayloadNV"] = PAYLOADNV; @@ -757,11 +758,18 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["perprimitiveNV"] = PERPRIMITIVENV; (*KeywordMap)["perviewNV"] = PERVIEWNV; (*KeywordMap)["taskNV"] = PERTASKNV; + (*KeywordMap)["perprimitiveEXT"] = PERPRIMITIVEEXT; + (*KeywordMap)["taskPayloadSharedEXT"] = TASKPAYLOADWORKGROUPEXT; (*KeywordMap)["fcoopmatNV"] = FCOOPMATNV; (*KeywordMap)["icoopmatNV"] = ICOOPMATNV; (*KeywordMap)["ucoopmatNV"] = UCOOPMATNV; + (*KeywordMap)["coopmat"] = COOPMAT; + + (*KeywordMap)["hitObjectNV"] = HITOBJECTNV; + (*KeywordMap)["hitObjectAttributeNV"] = HITOBJECTATTRNV; + ReservedSet = new std::unordered_set; ReservedSet->insert("common"); @@ -801,17 +809,14 @@ void TScanContext::fillInKeywordMap() ReservedSet->insert("cast"); ReservedSet->insert("namespace"); ReservedSet->insert("using"); -#endif } void TScanContext::deleteKeywordMap() { delete KeywordMap; KeywordMap = nullptr; -#ifndef GLSLANG_WEB delete ReservedSet; ReservedSet = nullptr; -#endif } // Called by yylex to get the next token. @@ -892,14 +897,12 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token) case PpAtomConstInt: parserToken->sType.lex.i = ppToken.ival; return INTCONSTANT; case PpAtomConstUint: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT; case PpAtomConstFloat: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT; -#ifndef GLSLANG_WEB case PpAtomConstInt16: parserToken->sType.lex.i = ppToken.ival; return INT16CONSTANT; case PpAtomConstUint16: parserToken->sType.lex.i = ppToken.ival; return UINT16CONSTANT; case PpAtomConstInt64: parserToken->sType.lex.i64 = ppToken.i64val; return INT64CONSTANT; case PpAtomConstUint64: parserToken->sType.lex.i64 = ppToken.i64val; return UINT64CONSTANT; case PpAtomConstDouble: parserToken->sType.lex.d = ppToken.dval; return DOUBLECONSTANT; case PpAtomConstFloat16: parserToken->sType.lex.d = ppToken.dval; return FLOAT16CONSTANT; -#endif case PpAtomIdentifier: { int token = tokenizeIdentifier(); @@ -921,10 +924,8 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token) int TScanContext::tokenizeIdentifier() { -#ifndef GLSLANG_WEB if (ReservedSet->find(tokenText) != ReservedSet->end()) return reservedWord(); -#endif auto it = KeywordMap->find(tokenText); if (it == KeywordMap->end()) { @@ -936,6 +937,7 @@ int TScanContext::tokenizeIdentifier() switch (keyword) { case CONST: case UNIFORM: + case TILEIMAGEEXT: case IN: case OUT: case INOUT: @@ -1046,7 +1048,6 @@ int TScanContext::tokenizeIdentifier() return identifierOrReserved(reserved); } -#ifndef GLSLANG_WEB case NOPERSPECTIVE: if (parseContext.extensionTurnedOn(E_GL_NV_shader_noperspective_interpolation)) return keyword; @@ -1072,12 +1073,18 @@ int TScanContext::tokenizeIdentifier() parseContext.extensionTurnedOn(E_GL_NV_ray_tracing)) return keyword; return identifierOrType(); + case ACCSTRUCTEXT: + if (parseContext.symbolTable.atBuiltInLevel() || + parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing) || + parseContext.extensionTurnedOn(E_GL_EXT_ray_query) || + parseContext.extensionTurnedOn(E_GL_NV_displacement_micromap)) + return keyword; + return identifierOrType(); case PAYLOADEXT: case PAYLOADINEXT: case HITATTREXT: case CALLDATAEXT: case CALLDATAINEXT: - case ACCSTRUCTEXT: if (parseContext.symbolTable.atBuiltInLevel() || parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing) || parseContext.extensionTurnedOn(E_GL_EXT_ray_query)) @@ -1133,7 +1140,7 @@ int TScanContext::tokenizeIdentifier() case SUBROUTINE: return es30ReservedFromGLSL(400); -#endif + case SHARED: if ((parseContext.isEsProfile() && parseContext.version < 300) || (!parseContext.isEsProfile() && parseContext.version < 140)) @@ -1168,7 +1175,6 @@ int TScanContext::tokenizeIdentifier() case MAT4X4: return matNxM(); -#ifndef GLSLANG_WEB case DMAT2: case DMAT3: case DMAT4: @@ -1473,7 +1479,6 @@ int TScanContext::tokenizeIdentifier() return keyword; else return identifierOrType(); -#endif case UINT: case UVEC2: @@ -1491,6 +1496,12 @@ int TScanContext::tokenizeIdentifier() case USAMPLERCUBE: case USAMPLER2DARRAY: afterType = true; + if (keyword == SAMPLER2DARRAY || keyword == SAMPLER2DARRAYSHADOW) { + if (!parseContext.isEsProfile() && + (parseContext.extensionTurnedOn(E_GL_EXT_texture_array) || parseContext.symbolTable.atBuiltInLevel())) { + return keyword; + } + } return nonreservedKeyword(300, 130); case SAMPLER3D: @@ -1528,13 +1539,18 @@ int TScanContext::tokenizeIdentifier() else return identifierOrType(); -#ifndef GLSLANG_WEB case ISAMPLER1D: case ISAMPLER1DARRAY: case SAMPLER1DARRAYSHADOW: case USAMPLER1D: case USAMPLER1DARRAY: afterType = true; + if (keyword == SAMPLER1DARRAYSHADOW) { + if (!parseContext.isEsProfile() && + (parseContext.extensionTurnedOn(E_GL_EXT_texture_array) || parseContext.symbolTable.atBuiltInLevel())) { + return keyword; + } + } return es30ReservedFromGLSL(130); case ISAMPLER2DRECT: case USAMPLER2DRECT: @@ -1604,7 +1620,9 @@ int TScanContext::tokenizeIdentifier() if (parseContext.isEsProfile() && parseContext.version == 300) reservedWord(); else if ((parseContext.isEsProfile() && parseContext.version < 300) || - (!parseContext.isEsProfile() && parseContext.version < 130)) + ((!parseContext.isEsProfile() && parseContext.version < 130) && + !parseContext.symbolTable.atBuiltInLevel() && + !parseContext.extensionTurnedOn(E_GL_EXT_texture_array))) return identifierOrType(); return keyword; @@ -1652,6 +1670,9 @@ int TScanContext::tokenizeIdentifier() case ISUBPASSINPUTMS: case USUBPASSINPUT: case USUBPASSINPUTMS: + case ATTACHMENTEXT: + case IATTACHMENTEXT: + case UATTACHMENTEXT: if (parseContext.spvVersion.vulkan > 0) return keyword; else @@ -1719,6 +1740,12 @@ int TScanContext::tokenizeIdentifier() return keyword; return identifierOrType(); + case PERVERTEXEXT: + if ((!parseContext.isEsProfile() && parseContext.version >= 450) || + parseContext.extensionTurnedOn(E_GL_EXT_fragment_shader_barycentric)) + return keyword; + return identifierOrType(); + case PRECISE: if ((parseContext.isEsProfile() && (parseContext.version >= 320 || parseContext.extensionsTurnedOn(Num_AEP_gpu_shader5, AEP_gpu_shader5))) || @@ -1733,12 +1760,18 @@ int TScanContext::tokenizeIdentifier() case PERPRIMITIVENV: case PERVIEWNV: case PERTASKNV: - if ((!parseContext.isEsProfile() && parseContext.version >= 450) || - (parseContext.isEsProfile() && parseContext.version >= 320) || + if (parseContext.symbolTable.atBuiltInLevel() || parseContext.extensionTurnedOn(E_GL_NV_mesh_shader)) return keyword; return identifierOrType(); + case PERPRIMITIVEEXT: + case TASKPAYLOADWORKGROUPEXT: + if (parseContext.symbolTable.atBuiltInLevel() || + parseContext.extensionTurnedOn(E_GL_EXT_mesh_shader)) + return keyword; + return identifierOrType(); + case FCOOPMATNV: afterType = true; if (parseContext.symbolTable.atBuiltInLevel() || @@ -1754,6 +1787,13 @@ int TScanContext::tokenizeIdentifier() return keyword; return identifierOrType(); + case COOPMAT: + afterType = true; + if (parseContext.symbolTable.atBuiltInLevel() || + parseContext.extensionTurnedOn(E_GL_KHR_cooperative_matrix)) + return keyword; + return identifierOrType(); + case DEMOTE: if (parseContext.extensionTurnedOn(E_GL_EXT_demote_to_helper_invocation)) return keyword; @@ -1774,7 +1814,20 @@ int TScanContext::tokenizeIdentifier() parseContext.extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) return keyword; return identifierOrType(); -#endif + + case HITOBJECTNV: + if (parseContext.symbolTable.atBuiltInLevel() || + (!parseContext.isEsProfile() && parseContext.version >= 460 + && parseContext.extensionTurnedOn(E_GL_NV_shader_invocation_reorder))) + return keyword; + return identifierOrType(); + + case HITOBJECTATTRNV: + if (parseContext.symbolTable.atBuiltInLevel() || + (!parseContext.isEsProfile() && parseContext.version >= 460 + && parseContext.extensionTurnedOn(E_GL_NV_shader_invocation_reorder))) + return keyword; + return identifierOrType(); default: parseContext.infoSink.info.message(EPrefixInternalError, "Unknown glslang keyword", loc); diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ShaderLang.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ShaderLang.cpp index 17902b5da..e0358edbd 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ShaderLang.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/ShaderLang.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include "SymbolTable.h" #include "ParseHelper.h" #include "Scan.h" @@ -57,7 +58,6 @@ #endif #include "../Include/ShHandle.h" -#include "../../OGLCompilersDLL/InitializeDll.h" #include "preprocessor/PpContext.h" @@ -73,7 +73,7 @@ #include "preprocessor/PpTokens.h" // Build-time generated includes -#include "../Include/build_info.h" +#include "../../build_info.h" namespace { // anonymous namespace for file-local functions and symbols @@ -81,6 +81,9 @@ namespace { // anonymous namespace for file-local functions and symbols // Shared global; access should be protected by a global mutex/critical section. int NumberOfClients = 0; +// global initialization lock +std::mutex init_lock; + using namespace glslang; // Create a language specific version of parseables. @@ -295,14 +298,6 @@ void InitializeStageSymbolTable(TBuiltInParseables& builtInParseables, int versi EShLanguage language, EShSource source, TInfoSink& infoSink, TSymbolTable** commonTable, TSymbolTable** symbolTables) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]); InitializeSymbolTable(builtInParseables.getStageString(language), version, profile, spvVersion, language, source, infoSink, *symbolTables[language]); @@ -319,14 +314,6 @@ void InitializeStageSymbolTable(TBuiltInParseables& builtInParseables, int versi // bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TSymbolTable** symbolTables, int version, EProfile profile, const SpvVersion& spvVersion, EShSource source) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - std::unique_ptr builtInParseables(CreateBuiltInParseables(infoSink, source)); if (builtInParseables == nullptr) @@ -349,7 +336,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangFragment, source, infoSink, commonTable, symbolTables); -#ifndef GLSLANG_WEB // check for tessellation if ((profile != EEsProfile && version >= 150) || (profile == EEsProfile && version >= 310)) { @@ -371,7 +357,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source, infoSink, commonTable, symbolTables); -#ifndef GLSLANG_ANGLE // check for ray tracing stages if (profile != EEsProfile && version >= 450) { InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGen, source, @@ -391,16 +376,14 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS // check for mesh if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) - InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMeshNV, source, + InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMesh, source, infoSink, commonTable, symbolTables); // check for task if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) - InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTaskNV, source, + InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTask, source, infoSink, commonTable, symbolTables); -#endif // !GLSLANG_ANGLE -#endif // !GLSLANG_WEB return true; } @@ -437,18 +420,15 @@ void SetupBuiltinSymbolTable(int version, EProfile profile, const SpvVersion& sp TInfoSink infoSink; // Make sure only one thread tries to do this at a time - glslang::GetGlobalLock(); + const std::lock_guard lock(init_lock); // See if it's already been done for this version/profile combination int versionIndex = MapVersionToIndex(version); int spvVersionIndex = MapSpvVersionToIndex(spvVersion); int profileIndex = MapProfileToIndex(profile); int sourceIndex = MapSourceToIndex(source); - if (CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][EPcGeneral]) { - glslang::ReleaseGlobalLock(); - + if (CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][EPcGeneral]) return; - } // Switch to a new pool TPoolAllocator& previousAllocator = GetThreadPoolAllocator(); @@ -495,20 +475,16 @@ void SetupBuiltinSymbolTable(int version, EProfile profile, const SpvVersion& sp delete builtInPoolAllocator; SetThreadPoolAllocator(&previousAllocator); - - glslang::ReleaseGlobalLock(); } // Function to Print all builtins void DumpBuiltinSymbolTable(TInfoSink& infoSink, const TSymbolTable& symbolTable) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) infoSink.debug << "BuiltinSymbolTable {\n"; symbolTable.dump(infoSink, true); infoSink.debug << "}\n"; -#endif } // Return true if the shader was correctly specified for version/profile/stage. @@ -606,7 +582,6 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo break; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) // Correct for stage type... switch (stage) { case EShLangGeometry: @@ -650,14 +625,15 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo version = 460; } break; - case EShLangMeshNV: - case EShLangTaskNV: + case EShLangMesh: + case EShLangTask: if ((profile == EEsProfile && version < 320) || (profile != EEsProfile && version < 450)) { correct = false; infoSink.info.message(EPrefixError, "#version: mesh/task shaders require es profile with version 320 or above, or non-es profile with version 450 or above"); version = profile == EEsProfile ? 320 : 450; } + break; default: break; } @@ -694,7 +670,6 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo break; } } -#endif return correct; } @@ -813,6 +788,7 @@ bool ProcessDeferred( // set version/profile to defaultVersion/defaultProfile regardless of the #version // directive in the source code bool forceDefaultVersionAndProfile, + int overrideVersion, // overrides version specified by #version or default version bool forwardCompatible, // give errors for use of deprecated features EShMessages messages, // warnings/errors/AST; things to print out TIntermediate& intermediate, // returned tree, etc. @@ -820,7 +796,8 @@ bool ProcessDeferred( bool requireNonempty, TShader::Includer& includer, const std::string sourceEntryPointName = "", - const TEnvironment* environment = nullptr) // optional way of fully setting all versions, overriding the above + const TEnvironment* environment = nullptr, // optional way of fully setting all versions, overriding the above + bool compileOnly = false) { // This must be undone (.pop()) by the caller, after it finishes consuming the created tree. GetThreadPoolAllocator().push(); @@ -883,7 +860,6 @@ bool ProcessDeferred( : userInput.scanVersion(version, profile, versionNotFirstToken); bool versionNotFound = version == 0; if (forceDefaultVersionAndProfile && source == EShSourceGlsl) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (! (messages & EShMsgSuppressWarnings) && ! versionNotFound && (version != defaultVersion || profile != defaultProfile)) { compiler->infoSink.info << "Warning, (version, profile) forced to be (" @@ -891,7 +867,7 @@ bool ProcessDeferred( << "), while in source code it is (" << version << ", " << ProfileName(profile) << ")\n"; } -#endif + if (versionNotFound) { versionNotFirstToken = false; versionNotFirst = false; @@ -900,19 +876,13 @@ bool ProcessDeferred( version = defaultVersion; profile = defaultProfile; } + if (source == EShSourceGlsl && overrideVersion != 0) { + version = overrideVersion; + } bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage, versionNotFirst, defaultVersion, source, version, profile, spvVersion); -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - bool versionWillBeError = (versionNotFound || (profile == EEsProfile && version >= 300 && versionNotFirst)); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) bool warnVersionNotFirst = false; if (! versionWillBeError && versionNotFirstToken) { if (messages & EShMsgRelaxedErrors) @@ -920,7 +890,6 @@ bool ProcessDeferred( else versionWillBeError = true; } -#endif intermediate.setSource(source); intermediate.setVersion(version); @@ -974,6 +943,7 @@ bool ProcessDeferred( std::unique_ptr parseContext(CreateParseContext(*symbolTable, intermediate, version, profile, source, stage, compiler->infoSink, spvVersion, forwardCompatible, messages, false, sourceEntryPointName)); + parseContext->compileOnly = compileOnly; TPpContext ppContext(*parseContext, names[numPre] ? names[numPre] : "", includer); // only GLSL (bison triggered, really) needs an externally set scan context @@ -985,13 +955,11 @@ bool ProcessDeferred( parseContext->setLimits(*resources); if (! goodVersion) parseContext->addError(); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (warnVersionNotFirst) { TSourceLoc loc; loc.init(); parseContext->warn(loc, "Illegal to have non-comment, non-whitespace tokens before #version", "#version", ""); } -#endif parseContext->initializeExtensionBehavior(); @@ -1023,8 +991,6 @@ bool ProcessDeferred( return success; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // Responsible for keeping track of the most recent source string and line in // the preprocessor and outputting newlines appropriately if the source string // or line changes. @@ -1102,8 +1068,8 @@ struct DoPreprocessing { EShOptimizationLevel, EShMessages) { // This is a list of tokens that do not require a space before or after. - static const std::string unNeededSpaceTokens = ";()[]"; - static const std::string noSpaceBeforeTokens = ","; + static const std::string noNeededSpaceBeforeTokens = ";)[].,"; + static const std::string noNeededSpaceAfterTokens = ".(["; glslang::TPpToken ppToken; parseContext.setScanner(&input); @@ -1176,6 +1142,7 @@ struct DoPreprocessing { }); int lastToken = EndOfInput; // lastToken records the last token processed. + std::string lastTokenName; do { int token = ppContext.tokenize(ppToken); if (token == EndOfInput) @@ -1194,12 +1161,23 @@ struct DoPreprocessing { // Output a space in between tokens, but not at the start of a line, // and also not around special tokens. This helps with readability // and consistency. - if (!isNewString && !isNewLine && lastToken != EndOfInput && - (unNeededSpaceTokens.find((char)token) == std::string::npos) && - (unNeededSpaceTokens.find((char)lastToken) == std::string::npos) && - (noSpaceBeforeTokens.find((char)token) == std::string::npos)) { - outputBuffer += ' '; + if (!isNewString && !isNewLine && lastToken != EndOfInput) { + // left parenthesis need a leading space, except it is in a function-call-like context. + // examples: `for (xxx)`, `a * (b + c)`, `vec(2.0)`, `foo(x, y, z)` + if (token == '(') { + if (lastToken != PpAtomIdentifier || + lastTokenName == "if" || + lastTokenName == "for" || + lastTokenName == "while" || + lastTokenName == "switch") + outputBuffer += ' '; + } else if ((noNeededSpaceBeforeTokens.find((char)token) == std::string::npos) && + (noNeededSpaceAfterTokens.find((char)lastToken) == std::string::npos)) { + outputBuffer += ' '; + } } + if (token == PpAtomIdentifier) + lastTokenName = ppToken.name; lastToken = token; if (token == PpAtomConstString) outputBuffer += "\""; @@ -1221,8 +1199,6 @@ struct DoPreprocessing { std::string* outputString; }; -#endif - // DoFullParse is a valid ProcessingConext template argument for fully // parsing the shader. It populates the "intermediate" with the AST. struct DoFullParse{ @@ -1246,16 +1222,13 @@ struct DoFullParse{ parseContext.infoSink.info << parseContext.getNumErrors() << " compilation errors. No code generated.\n\n"; } -#ifndef GLSLANG_ANGLE if (messages & EShMsgAST) intermediate.output(parseContext.infoSink, true); -#endif return success; } }; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) // Take a single compilation unit, and run the preprocessor on it. // Return: True if there were no issues found in preprocessing, // False if during preprocessing any unknown version, pragmas or @@ -1275,6 +1248,7 @@ bool PreprocessDeferred( int defaultVersion, // use 100 for ES environment, 110 for desktop EProfile defaultProfile, bool forceDefaultVersionAndProfile, + int overrideVersion, // use 0 if not overriding GLSL version bool forwardCompatible, // give errors for use of deprecated features EShMessages messages, // warnings/errors/AST; things to print out TShader::Includer& includer, @@ -1285,11 +1259,10 @@ bool PreprocessDeferred( DoPreprocessing parser(outputString); return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames, preamble, optLevel, resources, defaultVersion, - defaultProfile, forceDefaultVersionAndProfile, + defaultProfile, forceDefaultVersionAndProfile, overrideVersion, forwardCompatible, messages, intermediate, parser, false, includer, "", environment); } -#endif // // do a partial compile on the given strings for a single compilation unit @@ -1314,19 +1287,21 @@ bool CompileDeferred( int defaultVersion, // use 100 for ES environment, 110 for desktop EProfile defaultProfile, bool forceDefaultVersionAndProfile, + int overrideVersion, // use 0 if not overriding GLSL version bool forwardCompatible, // give errors for use of deprecated features EShMessages messages, // warnings/errors/AST; things to print out TIntermediate& intermediate,// returned tree, etc. TShader::Includer& includer, const std::string sourceEntryPointName = "", - TEnvironment* environment = nullptr) + TEnvironment* environment = nullptr, + bool compileOnly = false) { DoFullParse parser; return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames, preamble, optLevel, resources, defaultVersion, - defaultProfile, forceDefaultVersionAndProfile, + defaultProfile, forceDefaultVersionAndProfile, overrideVersion, forwardCompatible, messages, intermediate, parser, - true, includer, sourceEntryPointName, environment); + true, includer, sourceEntryPointName, environment, compileOnly); } } // end anonymous namespace for local functions @@ -1336,14 +1311,8 @@ bool CompileDeferred( // int ShInitialize() { - glslang::InitGlobalLock(); - - if (! InitProcess()) - return 0; - - glslang::GetGlobalLock(); + const std::lock_guard lock(init_lock); ++NumberOfClients; - glslang::ReleaseGlobalLock(); if (PerProcessGPA == nullptr) PerProcessGPA = new TPoolAllocator(); @@ -1361,31 +1330,22 @@ int ShInitialize() // objects. // -ShHandle ShConstructCompiler(const EShLanguage language, int debugOptions) +ShHandle ShConstructCompiler(const EShLanguage language, int /*debugOptions unused*/) { - if (!InitThread()) - return 0; - - TShHandleBase* base = static_cast(ConstructCompiler(language, debugOptions)); + TShHandleBase* base = static_cast(ConstructCompiler(language, 0)); return reinterpret_cast(base); } -ShHandle ShConstructLinker(const EShExecutable executable, int debugOptions) +ShHandle ShConstructLinker(const EShExecutable executable, int /*debugOptions unused*/) { - if (!InitThread()) - return 0; - - TShHandleBase* base = static_cast(ConstructLinker(executable, debugOptions)); + TShHandleBase* base = static_cast(ConstructLinker(executable, 0)); return reinterpret_cast(base); } ShHandle ShConstructUniformMap() { - if (!InitThread()) - return 0; - TShHandleBase* base = static_cast(ConstructUniformMap()); return reinterpret_cast(base); @@ -1393,7 +1353,7 @@ ShHandle ShConstructUniformMap() void ShDestruct(ShHandle handle) { - if (handle == 0) + if (handle == nullptr) return; TShHandleBase* base = static_cast(handle); @@ -1411,12 +1371,10 @@ void ShDestruct(ShHandle handle) // int ShFinalize() { - glslang::GetGlobalLock(); + const std::lock_guard lock(init_lock); --NumberOfClients; assert(NumberOfClients >= 0); - bool finalize = NumberOfClients == 0; - glslang::ReleaseGlobalLock(); - if (! finalize) + if (NumberOfClients > 0) return 1; for (int version = 0; version < VersionCount; ++version) { @@ -1425,7 +1383,7 @@ int ShFinalize() for (int source = 0; source < SourceCount; ++source) { for (int stage = 0; stage < EShLangCount; ++stage) { delete SharedSymbolTables[version][spvVersion][p][source][stage]; - SharedSymbolTables[version][spvVersion][p][source][stage] = 0; + SharedSymbolTables[version][spvVersion][p][source][stage] = nullptr; } } } @@ -1438,7 +1396,7 @@ int ShFinalize() for (int source = 0; source < SourceCount; ++source) { for (int pc = 0; pc < EPcCount; ++pc) { delete CommonSymbolTable[version][spvVersion][p][source][pc]; - CommonSymbolTable[version][spvVersion][p][source][pc] = 0; + CommonSymbolTable[version][spvVersion][p][source][pc] = nullptr; } } } @@ -1476,27 +1434,31 @@ int ShCompile( int /*debugOptions*/, int defaultVersion, // use 100 for ES environment, 110 for desktop bool forwardCompatible, // give errors for use of deprecated features - EShMessages messages // warnings/errors/AST; things to print out + EShMessages messages, // warnings/errors/AST; things to print out, + const char *shaderFileName // the filename ) { // Map the generic handle to the C++ object - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TCompiler* compiler = base->getAsCompiler(); - if (compiler == 0) + if (compiler == nullptr) return 0; SetThreadPoolAllocator(compiler->getPool()); compiler->infoSink.info.erase(); compiler->infoSink.debug.erase(); + compiler->infoSink.info.setShaderFileName(shaderFileName); + compiler->infoSink.debug.setShaderFileName(shaderFileName); + TIntermediate intermediate(compiler->getLanguage()); TShader::ForbidIncluder includer; bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, nullptr, - "", optLevel, resources, defaultVersion, ENoProfile, false, + "", optLevel, resources, defaultVersion, ENoProfile, false, 0, forwardCompatible, messages, intermediate, includer); // @@ -1525,13 +1487,13 @@ int ShLinkExt( const ShHandle compHandles[], const int numHandles) { - if (linkHandle == 0 || numHandles == 0) + if (linkHandle == nullptr || numHandles == 0) return 0; THandleList cObjects; for (int i = 0; i < numHandles; ++i) { - if (compHandles[i] == 0) + if (compHandles[i] == nullptr) return 0; TShHandleBase* base = reinterpret_cast(compHandles[i]); if (base->getAsLinker()) { @@ -1540,18 +1502,17 @@ int ShLinkExt( if (base->getAsCompiler()) cObjects.push_back(base->getAsCompiler()); - if (cObjects[i] == 0) + if (cObjects[i] == nullptr) return 0; } TShHandleBase* base = reinterpret_cast(linkHandle); TLinker* linker = static_cast(base->getAsLinker()); - SetThreadPoolAllocator(linker->getPool()); - - if (linker == 0) + if (linker == nullptr) return 0; - + + SetThreadPoolAllocator(linker->getPool()); linker->infoSink.info.erase(); for (int i = 0; i < numHandles; ++i) { @@ -1574,7 +1535,7 @@ int ShLinkExt( // void ShSetEncryptionMethod(ShHandle handle) { - if (handle == 0) + if (handle == nullptr) return; } @@ -1583,8 +1544,8 @@ void ShSetEncryptionMethod(ShHandle handle) // const char* ShGetInfoLog(const ShHandle handle) { - if (handle == 0) - return 0; + if (handle == nullptr) + return nullptr; TShHandleBase* base = static_cast(handle); TInfoSink* infoSink; @@ -1594,7 +1555,7 @@ const char* ShGetInfoLog(const ShHandle handle) else if (base->getAsLinker()) infoSink = &(base->getAsLinker()->getInfoSink()); else - return 0; + return nullptr; infoSink->info << infoSink->debug.c_str(); return infoSink->info.c_str(); @@ -1606,14 +1567,14 @@ const char* ShGetInfoLog(const ShHandle handle) // const void* ShGetExecutable(const ShHandle handle) { - if (handle == 0) - return 0; + if (handle == nullptr) + return nullptr; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) - return 0; + if (linker == nullptr) + return nullptr; return linker->getObjectCode(); } @@ -1628,13 +1589,13 @@ const void* ShGetExecutable(const ShHandle handle) // int ShSetVirtualAttributeBindings(const ShHandle handle, const ShBindingTable* table) { - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) + if (linker == nullptr) return 0; linker->setAppAttributeBindings(table); @@ -1647,13 +1608,13 @@ int ShSetVirtualAttributeBindings(const ShHandle handle, const ShBindingTable* t // int ShSetFixedAttributeBindings(const ShHandle handle, const ShBindingTable* table) { - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) + if (linker == nullptr) return 0; linker->setFixedAttributeBindings(table); @@ -1665,12 +1626,12 @@ int ShSetFixedAttributeBindings(const ShHandle handle, const ShBindingTable* tab // int ShExcludeAttributes(const ShHandle handle, int *attributes, int count) { - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) + if (linker == nullptr) return 0; linker->setExcludedAttributes(attributes, count); @@ -1686,12 +1647,12 @@ int ShExcludeAttributes(const ShHandle handle, int *attributes, int count) // int ShGetUniformLocation(const ShHandle handle, const char* name) { - if (handle == 0) + if (handle == nullptr) return -1; TShHandleBase* base = reinterpret_cast(handle); TUniformMap* uniformMap= base->getAsUniformMap(); - if (uniformMap == 0) + if (uniformMap == nullptr) return -1; return uniformMap->getLocation(name); @@ -1757,7 +1718,7 @@ public: }; TShader::TShader(EShLanguage s) - : stage(s), lengths(nullptr), stringNames(nullptr), preamble("") + : stage(s), lengths(nullptr), stringNames(nullptr), preamble(""), overrideVersion(0) { pool = new TPoolAllocator; infoSink = new TInfoSink; @@ -1826,10 +1787,16 @@ void TShader::setUniqueId(unsigned long long id) intermediate->setUniqueId(id); } -void TShader::setInvertY(bool invert) { intermediate->setInvertY(invert); } -void TShader::setNanMinMaxClamp(bool useNonNan) { intermediate->setNanMinMaxClamp(useNonNan); } +void TShader::setOverrideVersion(int version) +{ + overrideVersion = version; +} -#ifndef GLSLANG_WEB +void TShader::setDebugInfo(bool debugInfo) { intermediate->setDebugInfo(debugInfo); } +void TShader::setInvertY(bool invert) { intermediate->setInvertY(invert); } +void TShader::setDxPositionW(bool invert) { intermediate->setDxPositionW(invert); } +void TShader::setEnhancedMsgs() { intermediate->setEnhancedMsgs(); } +void TShader::setNanMinMaxClamp(bool useNonNan) { intermediate->setNanMinMaxClamp(useNonNan); } // Set binding base for given resource type void TShader::setShiftBinding(TResourceType res, unsigned int base) { @@ -1872,7 +1839,6 @@ void TShader::setUniformLocationBase(int base) void TShader::setNoStorageFormat(bool useUnknownFormat) { intermediate->setNoStorageFormat(useUnknownFormat); } void TShader::setResourceSetBinding(const std::vector& base) { intermediate->setResourceSetBinding(base); } void TShader::setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { intermediate->setTextureSamplerTransformMode(mode); } -#endif void TShader::addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing) { intermediate->addBlockStorageOverride(nameStr, backing); } @@ -1897,8 +1863,6 @@ void TShader::setFlattenUniformArrays(bool flatten) { intermediate->setFlatt bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion, EProfile defaultProfile, bool forceDefaultVersionAndProfile, bool forwardCompatible, EShMessages messages, Includer& includer) { - if (! InitThread()) - return false; SetThreadPoolAllocator(pool); if (! preamble) @@ -1906,12 +1870,11 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion return CompileDeferred(compiler, strings, numStrings, lengths, stringNames, preamble, EShOptNone, builtInResources, defaultVersion, - defaultProfile, forceDefaultVersionAndProfile, + defaultProfile, forceDefaultVersionAndProfile, overrideVersion, forwardCompatible, messages, *intermediate, includer, sourceEntryPointName, - &environment); + &environment, compileOnly); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) // Fill in a string with the result of preprocessing ShaderStrings // Returns true if all extensions, pragmas and version strings were valid. // @@ -1924,8 +1887,6 @@ bool TShader::preprocess(const TBuiltInResource* builtInResources, std::string* output_string, Includer& includer) { - if (! InitThread()) - return false; SetThreadPoolAllocator(pool); if (! preamble) @@ -1933,11 +1894,10 @@ bool TShader::preprocess(const TBuiltInResource* builtInResources, return PreprocessDeferred(compiler, strings, numStrings, lengths, stringNames, preamble, EShOptNone, builtInResources, defaultVersion, - defaultProfile, forceDefaultVersionAndProfile, + defaultProfile, forceDefaultVersionAndProfile, overrideVersion, forwardCompatible, message, includer, *intermediate, output_string, &environment); } -#endif const char* TShader::getInfoLog() { @@ -1949,16 +1909,12 @@ const char* TShader::getInfoDebugLog() return infoSink->debug.c_str(); } -TProgram::TProgram() : -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - reflection(0), -#endif - linked(false) +TProgram::TProgram() : reflection(nullptr), linked(false) { pool = new TPoolAllocator; infoSink = new TInfoSink; for (int s = 0; s < EShLangCount; ++s) { - intermediate[s] = 0; + intermediate[s] = nullptr; newedIntermediate[s] = false; } } @@ -1966,9 +1922,7 @@ TProgram::TProgram() : TProgram::~TProgram() { delete infoSink; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) delete reflection; -#endif for (int s = 0; s < EShLangCount; ++s) if (newedIntermediate[s]) @@ -2016,7 +1970,6 @@ bool TProgram::linkStage(EShLanguage stage, EShMessages messages) if (stages[stage].size() == 0) return true; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) int numEsShaders = 0, numNonEsShaders = 0; for (auto it = stages[stage].begin(); it != stages[stage].end(); ++it) { if ((*it)->intermediate->getProfile() == EEsProfile) { @@ -2046,6 +1999,8 @@ bool TProgram::linkStage(EShLanguage stage, EShMessages messages) firstIntermediate->getVersion(), firstIntermediate->getProfile()); intermediate[stage]->setLimits(firstIntermediate->getLimits()); + if (firstIntermediate->getEnhancedMsgs()) + intermediate[stage]->setEnhancedMsgs(); // The new TIntermediate must use the same origin as the original TIntermediates. // Otherwise linking will fail due to different coordinate systems. @@ -2065,15 +2020,10 @@ bool TProgram::linkStage(EShLanguage stage, EShMessages messages) for (it = stages[stage].begin(); it != stages[stage].end(); ++it) intermediate[stage]->merge(*infoSink, *(*it)->intermediate); } -#else - intermediate[stage] = stages[stage].front()->intermediate; -#endif intermediate[stage]->finalCheck(*infoSink, (messages & EShMsgKeepUncalled) != 0); -#ifndef GLSLANG_ANGLE if (messages & EShMsgAST) intermediate[stage]->output(*infoSink, true); -#endif return intermediate[stage]->getNumErrors() == 0; } @@ -2151,12 +2101,12 @@ const char* TProgram::getInfoDebugLog() return infoSink->debug.c_str(); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // // Reflection implementation. // +unsigned int TObjectReflection::layoutLocation() const { return type->getQualifier().layoutLocation; } + bool TProgram::buildReflection(int opts) { if (! linked || reflection != nullptr) @@ -2233,6 +2183,4 @@ bool TProgram::mapIO(TIoMapResolver* pResolver, TIoMapper* pIoMapper) return ioMapper->doMap(pResolver, *infoSink); } -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE - } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp index 38094eaaf..1d08797ac 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#ifndef GLSLANG_WEB - // // GL_EXT_spirv_intrinsics // @@ -45,6 +43,15 @@ namespace glslang { +bool TSpirvTypeParameter::operator==(const TSpirvTypeParameter& rhs) const +{ + if (getAsConstant() != nullptr) + return getAsConstant()->getConstArray() == rhs.getAsConstant()->getConstArray(); + + assert(getAsType() != nullptr); + return *getAsType() == *rhs.getAsType(); +} + // // Handle SPIR-V requirements // @@ -67,7 +74,7 @@ TSpirvRequirement* TParseContext::makeSpirvRequirement(const TSourceLoc& loc, co spirvReq->capabilities.insert(capability->getAsConstantUnion()->getConstArray()[0].getIConst()); } } else - error(loc, "unknow SPIR-V requirement", name.c_str(), ""); + error(loc, "unknown SPIR-V requirement", name.c_str(), ""); return spirvReq; } @@ -130,11 +137,11 @@ void TIntermediate::insertSpirvExecutionModeId(int executionMode, const TIntermA spirvExecutionMode = new TSpirvExecutionMode; assert(args); - TVector extraOperands; + TVector extraOperands; for (auto arg : args->getSequence()) { - auto extraOperand = arg->getAsConstantUnion(); - assert(extraOperand != nullptr); + auto extraOperand = arg->getAsTyped(); + assert(extraOperand != nullptr && extraOperand->getQualifier().isConstant()); extraOperands.push_back(extraOperand); } spirvExecutionMode->modeIds[executionMode] = extraOperands; @@ -165,9 +172,9 @@ void TQualifier::setSpirvDecorateId(int decoration, const TIntermAggregate* args spirvDecorate = new TSpirvDecorate; assert(args); - TVector extraOperands; + TVector extraOperands; for (auto arg : args->getSequence()) { - auto extraOperand = arg->getAsConstantUnion(); + auto extraOperand = arg->getAsTyped(); assert(extraOperand != nullptr); extraOperands.push_back(extraOperand); } @@ -201,29 +208,30 @@ TString TQualifier::getSpirvDecorateQualifierString() const const auto appendBool = [&](bool b) { qualifierString.append(std::to_string(b).c_str()); }; const auto appendStr = [&](const char* s) { qualifierString.append(s); }; - const auto appendDecorate = [&](const TIntermConstantUnion* constant) { - if (constant->getBasicType() == EbtFloat) { - float value = static_cast(constant->getConstArray()[0].getDConst()); - appendFloat(value); + const auto appendDecorate = [&](const TIntermTyped* constant) { + if (constant->getAsConstantUnion()) { + auto& constArray = constant->getAsConstantUnion()->getConstArray(); + if (constant->getBasicType() == EbtFloat) { + float value = static_cast(constArray[0].getDConst()); + appendFloat(value); + } else if (constant->getBasicType() == EbtInt) { + int value = constArray[0].getIConst(); + appendInt(value); + } else if (constant->getBasicType() == EbtUint) { + unsigned value = constArray[0].getUConst(); + appendUint(value); + } else if (constant->getBasicType() == EbtBool) { + bool value = constArray[0].getBConst(); + appendBool(value); + } else if (constant->getBasicType() == EbtString) { + const TString* value = constArray[0].getSConst(); + appendStr(value->c_str()); + } else + assert(0); + } else { + assert(constant->getAsSymbolNode()); + appendStr(constant->getAsSymbolNode()->getName().c_str()); } - else if (constant->getBasicType() == EbtInt) { - int value = constant->getConstArray()[0].getIConst(); - appendInt(value); - } - else if (constant->getBasicType() == EbtUint) { - unsigned value = constant->getConstArray()[0].getUConst(); - appendUint(value); - } - else if (constant->getBasicType() == EbtBool) { - bool value = constant->getConstArray()[0].getBConst(); - appendBool(value); - } - else if (constant->getBasicType() == EbtString) { - const TString* value = constant->getConstArray()[0].getSConst(); - appendStr(value->c_str()); - } - else - assert(0); }; for (auto& decorate : spirvDecorate->decorates) { @@ -282,15 +290,14 @@ TSpirvTypeParameters* TParseContext::makeSpirvTypeParameters(const TSourceLoc& l constant->getBasicType() != EbtBool && constant->getBasicType() != EbtString) error(loc, "this type not allowed", constant->getType().getBasicString(), ""); - else { - assert(constant); + else spirvTypeParams->push_back(TSpirvTypeParameter(constant)); - } return spirvTypeParams; } -TSpirvTypeParameters* TParseContext::makeSpirvTypeParameters(const TPublicType& type) +TSpirvTypeParameters* TParseContext::makeSpirvTypeParameters(const TSourceLoc& /* loc */, + const TPublicType& type) { TSpirvTypeParameters* spirvTypeParams = new TSpirvTypeParameters; spirvTypeParams->push_back(TSpirvTypeParameter(new TType(type))); @@ -351,5 +358,3 @@ TSpirvInstruction* TParseContext::mergeSpirvInstruction(const TSourceLoc& loc, T } } // end namespace glslang - -#endif // GLSLANG_WEB diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.cpp index 747b43666..3b56e414b 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.cpp @@ -65,7 +65,6 @@ void TType::buildMangledName(TString& mangledName) const case EbtInt: mangledName += 'i'; break; case EbtUint: mangledName += 'u'; break; case EbtBool: mangledName += 'b'; break; -#ifndef GLSLANG_WEB case EbtDouble: mangledName += 'd'; break; case EbtFloat16: mangledName += "f16"; break; case EbtInt8: mangledName += "i8"; break; @@ -78,12 +77,10 @@ void TType::buildMangledName(TString& mangledName) const case EbtAccStruct: mangledName += "as"; break; case EbtRayQuery: mangledName += "rq"; break; case EbtSpirvType: mangledName += "spv-t"; break; -#endif + case EbtHitObjectNV: mangledName += "ho"; break; case EbtSampler: switch (sampler.type) { -#ifndef GLSLANG_WEB case EbtFloat16: mangledName += "f16"; break; -#endif case EbtInt: mangledName += "i"; break; case EbtUint: mangledName += "u"; break; case EbtInt64: mangledName += "i64"; break; @@ -110,12 +107,10 @@ void TType::buildMangledName(TString& mangledName) const case Esd2D: mangledName += "2"; break; case Esd3D: mangledName += "3"; break; case EsdCube: mangledName += "C"; break; -#ifndef GLSLANG_WEB case Esd1D: mangledName += "1"; break; case EsdRect: mangledName += "R2"; break; case EsdBuffer: mangledName += "B"; break; case EsdSubpass: mangledName += "P"; break; -#endif default: break; // some compilers want this } @@ -154,6 +149,7 @@ void TType::buildMangledName(TString& mangledName) const mangledName += '-'; (*structure)[i].type->buildMangledName(mangledName); } + break; default: break; } @@ -183,8 +179,6 @@ void TType::buildMangledName(TString& mangledName) const } } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // // Dump functions. // @@ -263,8 +257,6 @@ void TSymbolTable::dump(TInfoSink& infoSink, bool complete) const } } -#endif - // // Functions have buried pointers to delete. // @@ -279,8 +271,14 @@ TFunction::~TFunction() // TSymbolTableLevel::~TSymbolTableLevel() { - for (tLevel::iterator it = level.begin(); it != level.end(); ++it) - delete (*it).second; + for (tLevel::iterator it = level.begin(); it != level.end(); ++it) { + const TString& name = it->first; + auto retargetIter = std::find_if(retargetedSymbols.begin(), retargetedSymbols.end(), + [&name](const std::pair& i) { return i.first == name; }); + if (retargetIter == retargetedSymbols.end()) + delete (*it).second; + } + delete [] defaultPrecision; } @@ -321,6 +319,16 @@ void TSymbolTableLevel::setFunctionExtensions(const char* name, int num, const c } } +// Make a single function require an extension(s). i.e., this will only set the extensions for the symbol that matches 'name' exactly. +// This is different from setFunctionExtensions, which uses std::map::lower_bound to effectively set all symbols that start with 'name'. +// Should only be used for a version/profile that actually needs the extension(s). +void TSymbolTableLevel::setSingleFunctionExtensions(const char* name, int num, const char* const extensions[]) +{ + if (auto candidate = level.find(name); candidate != level.end()) { + candidate->second->setExtensions(num, extensions); + } +} + // // Make all symbols in this table level read only. // @@ -375,9 +383,9 @@ TVariable* TVariable::clone() const TFunction::TFunction(const TFunction& copyOf) : TSymbol(copyOf) { for (unsigned int i = 0; i < copyOf.parameters.size(); ++i) { - TParameter param; + TParameter param{}; parameters.push_back(param); - parameters.back().copyParam(copyOf.parameters[i]); + (void)parameters.back().copyParam(copyOf.parameters[i]); } extensions = nullptr; @@ -391,9 +399,7 @@ TFunction::TFunction(const TFunction& copyOf) : TSymbol(copyOf) implicitThis = copyOf.implicitThis; illegalImplicitThis = copyOf.illegalImplicitThis; defaultParamCount = copyOf.defaultParamCount; -#ifndef GLSLANG_WEB spirvInst = copyOf.spirvInst; -#endif } TFunction* TFunction::clone() const @@ -410,7 +416,7 @@ TAnonMember* TAnonMember::clone() const // copy of the original container. assert(0); - return 0; + return nullptr; } TSymbolTableLevel* TSymbolTableLevel::clone() const @@ -418,6 +424,10 @@ TSymbolTableLevel* TSymbolTableLevel::clone() const TSymbolTableLevel *symTableLevel = new TSymbolTableLevel(); symTableLevel->anonId = anonId; symTableLevel->thisLevel = thisLevel; + symTableLevel->retargetedSymbols.clear(); + for (auto &s : retargetedSymbols) { + symTableLevel->retargetedSymbols.push_back({s.first, s.second}); + } std::vector containerCopied(anonId, false); tLevel::const_iterator iter; for (iter = level.begin(); iter != level.end(); ++iter) { @@ -433,8 +443,21 @@ TSymbolTableLevel* TSymbolTableLevel::clone() const symTableLevel->insert(*container, false); containerCopied[anon->getAnonId()] = true; } - } else + } else { + const TString& name = iter->first; + auto retargetIter = std::find_if(retargetedSymbols.begin(), retargetedSymbols.end(), + [&name](const std::pair& i) { return i.first == name; }); + if (retargetIter != retargetedSymbols.end()) + continue; symTableLevel->insert(*iter->second->clone(), false); + } + } + // Now point retargeted symbols to the newly created versions of them + for (auto &s : retargetedSymbols) { + TSymbol* sym = symTableLevel->find(s.second); + if (!sym) + continue; + symTableLevel->insert(s.first, sym); } return symTableLevel; diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.h index 219609307..94c3929da 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/SymbolTable.h @@ -84,7 +84,7 @@ typedef TVector TExtensionList; class TSymbol { public: POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - explicit TSymbol(const TString *n) : name(n), extensions(0), writable(true) { } + explicit TSymbol(const TString *n) : name(n), uniqueId(0), extensions(nullptr), writable(true) { } virtual TSymbol* clone() const = 0; virtual ~TSymbol() { } // rely on all symbol owned memory coming from the pool @@ -97,18 +97,18 @@ public: changeName(NewPoolTString(newName.c_str())); } virtual const TString& getMangledName() const { return getName(); } - virtual TFunction* getAsFunction() { return 0; } - virtual const TFunction* getAsFunction() const { return 0; } - virtual TVariable* getAsVariable() { return 0; } - virtual const TVariable* getAsVariable() const { return 0; } - virtual const TAnonMember* getAsAnonMember() const { return 0; } + virtual TFunction* getAsFunction() { return nullptr; } + virtual const TFunction* getAsFunction() const { return nullptr; } + virtual TVariable* getAsVariable() { return nullptr; } + virtual const TVariable* getAsVariable() const { return nullptr; } + virtual const TAnonMember* getAsAnonMember() const { return nullptr; } virtual const TType& getType() const = 0; virtual TType& getWritableType() = 0; virtual void setUniqueId(long long id) { uniqueId = id; } virtual long long getUniqueId() const { return uniqueId; } virtual void setExtensions(int numExts, const char* const exts[]) { - assert(extensions == 0); + assert(extensions == nullptr); assert(numExts > 0); extensions = NewPoolObject(extensions); for (int e = 0; e < numExts; ++e) @@ -117,10 +117,8 @@ public: virtual int getNumExtensions() const { return extensions == nullptr ? 0 : (int)extensions->size(); } virtual const char** getExtensions() const { return extensions->data(); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const = 0; void dumpExtensions(TInfoSink& infoSink) const; -#endif virtual bool isReadOnly() const { return ! writable; } virtual void makeReadOnly() { writable = false; } @@ -196,9 +194,7 @@ public: } virtual const char** getMemberExtensions(int member) const { return (*memberExtensions)[member].data(); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const; -#endif protected: explicit TVariable(const TVariable&); @@ -224,14 +220,15 @@ struct TParameter { TString *name; TType* type; TIntermTyped* defaultValue; - void copyParam(const TParameter& param) + TParameter& copyParam(const TParameter& param) { if (param.name) name = NewPoolTString(param.name->c_str()); else - name = 0; + name = nullptr; type = param.type->clone(); defaultValue = param.defaultValue; + return *this; } TBuiltInVariable getDeclaredBuiltIn() const { return type->getQualifier().declaredBuiltIn; } }; @@ -242,14 +239,15 @@ struct TParameter { class TFunction : public TSymbol { public: explicit TFunction(TOperator o) : - TSymbol(0), + TSymbol(nullptr), op(o), defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0) { } TFunction(const TString *name, const TType& retType, TOperator tOp = EOpNull) : TSymbol(name), mangledName(*name + '('), op(tOp), - defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0) + defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0), + linkType(ELinkNone) { returnType.shallowCopy(retType); declaredBuiltIn = retType.getQualifier().builtIn; @@ -318,19 +316,19 @@ public: virtual TParameter& operator[](int i) { assert(writable); return parameters[i]; } virtual const TParameter& operator[](int i) const { return parameters[i]; } + const TQualifier& getQualifier() const { return returnType.getQualifier(); } -#ifndef GLSLANG_WEB virtual void setSpirvInstruction(const TSpirvInstruction& inst) { relateToOperator(EOpSpirvInst); spirvInst = inst; } virtual const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; } -#endif -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const override; -#endif + + void setExport() { linkType = ELinkExport; } + TLinkType getLinkType() const { return linkType; } protected: explicit TFunction(const TFunction&); @@ -352,9 +350,8 @@ protected: // but is not allowed to use them, or see hidden symbols instead. int defaultParamCount; -#ifndef GLSLANG_WEB TSpirvInstruction spirvInst; // SPIR-V instruction qualifiers -#endif + TLinkType linkType; }; // @@ -394,9 +391,7 @@ public: virtual const char** getExtensions() const override { return anonContainer.getMemberExtensions(memberNumber); } virtual int getAnonId() const { return anonId; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const override; -#endif protected: explicit TAnonMember(const TAnonMember&); @@ -410,16 +405,23 @@ protected: class TSymbolTableLevel { public: POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - TSymbolTableLevel() : defaultPrecision(0), anonId(0), thisLevel(false) { } + TSymbolTableLevel() : defaultPrecision(nullptr), anonId(0), thisLevel(false) { } ~TSymbolTableLevel(); - bool insert(TSymbol& symbol, bool separateNameSpaces) + bool insert(const TString& name, TSymbol* symbol) { + return level.insert(tLevelPair(name, symbol)).second; + } + + bool insert(TSymbol& symbol, bool separateNameSpaces, const TString& forcedKeyName = TString()) { // // returning true means symbol was added to the table with no semantic errors // const TString& name = symbol.getName(); - if (name == "") { + if (forcedKeyName.length()) { + return level.insert(tLevelPair(forcedKeyName, &symbol)).second; + } + else if (name == "") { symbol.getAsVariable()->setAnonId(anonId++); // An empty name means an anonymous container, exposing its members to the external scope. // Give it a name and insert its members in the symbol table, pointing to the container. @@ -471,11 +473,21 @@ public: return true; } + void retargetSymbol(const TString& from, const TString& to) { + tLevel::const_iterator fromIt = level.find(from); + tLevel::const_iterator toIt = level.find(to); + if (fromIt == level.end() || toIt == level.end()) + return; + delete fromIt->second; + level[from] = toIt->second; + retargetedSymbols.push_back({from, to}); + } + TSymbol* find(const TString& name) const { tLevel::const_iterator it = level.find(name); if (it == level.end()) - return 0; + return nullptr; else return (*it).second; } @@ -543,7 +555,7 @@ public: { // can call multiple times at one scope, will only latch on first call, // as we're tracking the previous scope's values, not the current values - if (defaultPrecision != 0) + if (defaultPrecision != nullptr) return; defaultPrecision = new TPrecisionQualifier[EbtNumTypes]; @@ -555,7 +567,7 @@ public: { // can be called for table level pops that didn't set the // defaults - if (defaultPrecision == 0 || p == 0) + if (defaultPrecision == nullptr || p == nullptr) return; for (int t = 0; t < EbtNumTypes; ++t) @@ -564,9 +576,8 @@ public: void relateToOperator(const char* name, TOperator op); void setFunctionExtensions(const char* name, int num, const char* const extensions[]); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) + void setSingleFunctionExtensions(const char* name, int num, const char* const extensions[]); void dump(TInfoSink& infoSink, bool complete = false) const; -#endif TSymbolTableLevel* clone() const; void readOnly(); @@ -583,6 +594,8 @@ protected: tLevel level; // named mappings TPrecisionQualifier *defaultPrecision; + // pair + TVector> retargetedSymbols; int anonId; bool thisLevel; // True if this level of the symbol table is a structure scope containing member function // that are supposed to see anonymous access to member variables. @@ -602,7 +615,7 @@ public: // don't deallocate levels passed in from elsewhere while (table.size() > adoptedLevels) - pop(0); + pop(nullptr); } void adoptLevels(TSymbolTable& symTable) @@ -763,7 +776,7 @@ public: // Normal find of a symbol, that can optionally say whether the symbol was found // at a built-in level or the current top-scope level. - TSymbol* find(const TString& name, bool* builtIn = 0, bool* currentScope = 0, int* thisDepthP = 0) + TSymbol* find(const TString& name, bool* builtIn = nullptr, bool* currentScope = nullptr, int* thisDepthP = nullptr) { int level = currentLevel(); TSymbol* symbol; @@ -788,6 +801,12 @@ public: return symbol; } + void retargetSymbol(const TString& from, const TString& to) { + int level = currentLevel(); + table[level]->retargetSymbol(from, to); + } + + // Find of a symbol that returns how many layers deep of nested // structures-with-member-functions ('this' scopes) deep the symbol was // found in. @@ -801,7 +820,7 @@ public: ++thisDepth; symbol = table[level]->find(name); --level; - } while (symbol == 0 && level >= 0); + } while (symbol == nullptr && level >= 0); if (! table[level + 1]->isThisLevel()) thisDepth = 0; @@ -859,6 +878,12 @@ public: table[level]->setFunctionExtensions(name, num, extensions); } + void setSingleFunctionExtensions(const char* name, int num, const char* const extensions[]) + { + for (unsigned int level = 0; level < table.size(); ++level) + table[level]->setSingleFunctionExtensions(name, num, extensions); + } + void setVariableExtensions(const char* name, int numExts, const char* const extensions[]) { TSymbol* symbol = find(TString(name)); @@ -886,9 +911,7 @@ public: } long long getMaxSymbolId() { return uniqueId; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) void dump(TInfoSink& infoSink, bool complete = false) const; -#endif void copyTable(const TSymbolTable& copyOf); void setPreviousDefaultPrecisions(TPrecisionQualifier *p) { table[currentLevel()]->setPreviousDefaultPrecisions(p); } diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.cpp index 097ee8455..e016ef6b9 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.cpp @@ -1,7 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. -// Copyright (C) 2017 ARM Limited. +// Copyright (C) 2017, 2022-2024 Arm Limited. // Copyright (C) 2015-2020 Google, Inc. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. // @@ -151,8 +151,6 @@ namespace glslang { -#ifndef GLSLANG_WEB - // // Initialize all extensions, almost always to 'disable', as once their features // are incorporated into a core version, their features are supported through allowing that @@ -166,7 +164,8 @@ void TParseVersions::initializeExtensionBehavior() } extensionData; const extensionData exts[] = { {E_GL_EXT_ray_tracing, EShTargetSpv_1_4}, - {E_GL_NV_ray_tracing_motion_blur, EShTargetSpv_1_4} + {E_GL_NV_ray_tracing_motion_blur, EShTargetSpv_1_4}, + {E_GL_EXT_mesh_shader, EShTargetSpv_1_4} }; for (size_t ii = 0; ii < sizeof(exts) / sizeof(exts[0]); ii++) { @@ -225,6 +224,10 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_ARB_shading_language_packing] = EBhDisable; extensionBehavior[E_GL_ARB_texture_query_lod] = EBhDisable; extensionBehavior[E_GL_ARB_vertex_attrib_64bit] = EBhDisable; + extensionBehavior[E_GL_ARB_draw_instanced] = EBhDisable; + extensionBehavior[E_GL_ARB_bindless_texture] = EBhDisable; + extensionBehavior[E_GL_ARB_fragment_coord_conventions] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_basic] = EBhDisable; extensionBehavior[E_GL_KHR_shader_subgroup_vote] = EBhDisable; @@ -232,6 +235,7 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_KHR_shader_subgroup_ballot] = EBhDisable; extensionBehavior[E_GL_KHR_shader_subgroup_shuffle] = EBhDisable; extensionBehavior[E_GL_KHR_shader_subgroup_shuffle_relative] = EBhDisable; + extensionBehavior[E_GL_KHR_shader_subgroup_rotate] = EBhDisable; extensionBehavior[E_GL_KHR_shader_subgroup_clustered] = EBhDisable; extensionBehavior[E_GL_KHR_shader_subgroup_quad] = EBhDisable; extensionBehavior[E_GL_KHR_memory_scope_semantics] = EBhDisable; @@ -255,10 +259,20 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_EXT_shader_16bit_storage] = EBhDisable; extensionBehavior[E_GL_EXT_shader_8bit_storage] = EBhDisable; extensionBehavior[E_GL_EXT_subgroup_uniform_control_flow] = EBhDisable; + extensionBehavior[E_GL_EXT_maximal_reconvergence] = EBhDisable; + + extensionBehavior[E_GL_EXT_fragment_shader_barycentric] = EBhDisable; + extensionBehavior[E_GL_EXT_expect_assume] = EBhDisable; + + extensionBehavior[E_GL_EXT_control_flow_attributes2] = EBhDisable; + extensionBehavior[E_GL_EXT_spec_constant_composites] = EBhDisable; + + extensionBehavior[E_GL_KHR_cooperative_matrix] = EBhDisable; // #line and #include extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive] = EBhDisable; extensionBehavior[E_GL_GOOGLE_include_directive] = EBhDisable; + extensionBehavior[E_GL_ARB_shading_language_include] = EBhDisable; extensionBehavior[E_GL_AMD_shader_ballot] = EBhDisable; extensionBehavior[E_GL_AMD_shader_trinary_minmax] = EBhDisable; @@ -270,6 +284,7 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_AMD_shader_image_load_store_lod] = EBhDisable; extensionBehavior[E_GL_AMD_shader_fragment_mask] = EBhDisable; extensionBehavior[E_GL_AMD_gpu_shader_half_float_fetch] = EBhDisable; + extensionBehavior[E_GL_AMD_shader_early_and_late_fragment_tests] = EBhDisable; extensionBehavior[E_GL_INTEL_shader_integer_functions2] = EBhDisable; @@ -289,10 +304,19 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_NV_compute_shader_derivatives] = EBhDisable; extensionBehavior[E_GL_NV_shader_texture_footprint] = EBhDisable; extensionBehavior[E_GL_NV_mesh_shader] = EBhDisable; - extensionBehavior[E_GL_NV_cooperative_matrix] = EBhDisable; extensionBehavior[E_GL_NV_shader_sm_builtins] = EBhDisable; extensionBehavior[E_GL_NV_integer_cooperative_matrix] = EBhDisable; + extensionBehavior[E_GL_NV_shader_invocation_reorder] = EBhDisable; + extensionBehavior[E_GL_NV_displacement_micromap] = EBhDisable; + extensionBehavior[E_GL_NV_shader_atomic_fp16_vector] = EBhDisable; + + // ARM + extensionBehavior[E_GL_ARM_shader_core_builtins] = EBhDisable; + + // QCOM + extensionBehavior[E_GL_QCOM_image_processing] = EBhDisable; + extensionBehavior[E_GL_QCOM_image_processing2] = EBhDisable; // AEP extensionBehavior[E_GL_ANDROID_extension_pack_es31a] = EBhDisable; @@ -331,13 +355,22 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_EXT_ray_tracing] = EBhDisable; extensionBehavior[E_GL_EXT_ray_query] = EBhDisable; extensionBehavior[E_GL_EXT_ray_flags_primitive_culling] = EBhDisable; + extensionBehavior[E_GL_EXT_ray_cull_mask] = EBhDisable; extensionBehavior[E_GL_EXT_blend_func_extended] = EBhDisable; extensionBehavior[E_GL_EXT_shader_implicit_conversions] = EBhDisable; extensionBehavior[E_GL_EXT_fragment_shading_rate] = EBhDisable; - extensionBehavior[E_GL_EXT_shader_image_int64] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_image_int64] = EBhDisable; extensionBehavior[E_GL_EXT_terminate_invocation] = EBhDisable; extensionBehavior[E_GL_EXT_shared_memory_block] = EBhDisable; extensionBehavior[E_GL_EXT_spirv_intrinsics] = EBhDisable; + extensionBehavior[E_GL_EXT_mesh_shader] = EBhDisable; + extensionBehavior[E_GL_EXT_opacity_micromap] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_quad_control] = EBhDisable; + extensionBehavior[E_GL_EXT_ray_tracing_position_fetch] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_tile_image] = EBhDisable; + extensionBehavior[E_GL_EXT_texture_shadow_lod] = EBhDisable; + extensionBehavior[E_GL_EXT_draw_instanced] = EBhDisable; + extensionBehavior[E_GL_EXT_texture_array] = EBhDisable; // OVR extensions extensionBehavior[E_GL_OVR_multiview] = EBhDisable; @@ -360,9 +393,10 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_float16] = EBhDisable; extensionBehavior[E_GL_EXT_shader_atomic_float] = EBhDisable; extensionBehavior[E_GL_EXT_shader_atomic_float2] = EBhDisable; -} -#endif // GLSLANG_WEB + // Record extensions not for spv. + spvUnsupportedExt.push_back(E_GL_ARB_bindless_texture); +} // Get code that is not part of a shared symbol table, is specific to this shader, // or needed by the preprocessor (which does not use a shared symbol table). @@ -372,9 +406,6 @@ void TParseVersions::getPreamble(std::string& preamble) preamble = "#define GL_ES 1\n" "#define GL_FRAGMENT_PRECISION_HIGH 1\n" -#ifdef GLSLANG_WEB - ; -#else "#define GL_OES_texture_3D 1\n" "#define GL_OES_standard_derivatives 1\n" "#define GL_EXT_frag_depth 1\n" @@ -415,6 +446,9 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_OES_texture_buffer 1\n" "#define GL_OES_texture_cube_map_array 1\n" "#define GL_EXT_shader_non_constant_global_initializers 1\n" + + "#define GL_QCOM_image_processing 1\n" + "#define GL_QCOM_image_processing2 1\n" ; if (version >= 300) { @@ -423,11 +457,11 @@ void TParseVersions::getPreamble(std::string& preamble) if (version >= 310) { preamble += "#define GL_EXT_null_initializer 1\n"; preamble += "#define GL_EXT_subgroup_uniform_control_flow 1\n"; + preamble += "#define GL_EXT_maximal_reconvergence 1\n"; } } else { // !isEsProfile() preamble = - "#define GL_FRAGMENT_PRECISION_HIGH 1\n" "#define GL_ARB_texture_rectangle 1\n" "#define GL_ARB_shading_language_420pack 1\n" "#define GL_ARB_texture_gather 1\n" @@ -465,6 +499,9 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_ARB_shader_storage_buffer_object 1\n" "#define GL_ARB_texture_query_lod 1\n" "#define GL_ARB_vertex_attrib_64bit 1\n" + "#define GL_ARB_draw_instanced 1\n" + "#define GL_ARB_fragment_coord_conventions 1\n" + "#define GL_EXT_shader_non_constant_global_initializers 1\n" "#define GL_EXT_shader_image_load_formatted 1\n" "#define GL_EXT_post_depth_coverage 1\n" @@ -482,6 +519,8 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_EXT_debug_printf 1\n" "#define GL_EXT_fragment_shading_rate 1\n" "#define GL_EXT_shared_memory_block 1\n" + "#define GL_EXT_shader_integer_mix 1\n" + "#define GL_EXT_spec_constant_composites 1\n" // GL_KHR_shader_subgroup "#define GL_KHR_shader_subgroup_basic 1\n" @@ -493,13 +532,18 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_KHR_shader_subgroup_clustered 1\n" "#define GL_KHR_shader_subgroup_quad 1\n" + "#define GL_KHR_cooperative_matrix 1\n" + "#define GL_EXT_shader_image_int64 1\n" "#define GL_EXT_shader_atomic_int64 1\n" "#define GL_EXT_shader_realtime_clock 1\n" "#define GL_EXT_ray_tracing 1\n" "#define GL_EXT_ray_query 1\n" "#define GL_EXT_ray_flags_primitive_culling 1\n" + "#define GL_EXT_ray_cull_mask 1\n" + "#define GL_EXT_ray_tracing_position_fetch 1\n" "#define GL_EXT_spirv_intrinsics 1\n" + "#define GL_EXT_mesh_shader 1\n" "#define GL_AMD_shader_ballot 1\n" "#define GL_AMD_shader_trinary_minmax 1\n" @@ -529,6 +573,10 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_NV_mesh_shader 1\n" "#define GL_NV_cooperative_matrix 1\n" "#define GL_NV_integer_cooperative_matrix 1\n" + "#define GL_NV_shader_invocation_reorder 1\n" + + "#define GL_QCOM_image_processing 1\n" + "#define GL_QCOM_image_processing2 1\n" "#define GL_EXT_shader_explicit_arithmetic_types 1\n" "#define GL_EXT_shader_explicit_arithmetic_types_int8 1\n" @@ -546,8 +594,18 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_EXT_shader_atomic_float 1\n" "#define GL_EXT_shader_atomic_float2 1\n" + + "#define GL_EXT_fragment_shader_barycentric 1\n" + "#define GL_EXT_shader_quad_control 1\n" + "#define GL_EXT_texture_array 1\n" + + "#define GL_EXT_control_flow_attributes2 1\n" ; + if (spvVersion.spv == 0) { + preamble += "#define GL_ARB_bindless_texture 1\n"; + } + if (version >= 150) { // define GL_core_profile and GL_compatibility_profile preamble += "#define GL_core_profile 1\n"; @@ -558,11 +616,13 @@ void TParseVersions::getPreamble(std::string& preamble) if (version >= 140) { preamble += "#define GL_EXT_null_initializer 1\n"; preamble += "#define GL_EXT_subgroup_uniform_control_flow 1\n"; + preamble += "#define GL_EXT_maximal_reconvergence 1\n"; + } + if (version >= 130) { + preamble +="#define GL_FRAGMENT_PRECISION_HIGH 1\n"; } -#endif // GLSLANG_WEB } -#ifndef GLSLANG_WEB if ((!isEsProfile() && version >= 140) || (isEsProfile() && version >= 310)) { preamble += @@ -590,7 +650,6 @@ void TParseVersions::getPreamble(std::string& preamble) preamble += "#define GL_EXT_terminate_invocation 1\n" ; -#endif // #define VULKAN XXXX const int numberBufSize = 12; @@ -602,7 +661,6 @@ void TParseVersions::getPreamble(std::string& preamble) preamble += "\n"; } -#ifndef GLSLANG_WEB // #define GL_SPIRV XXXX if (spvVersion.openGl > 0) { preamble += "#define GL_SPIRV "; @@ -610,9 +668,7 @@ void TParseVersions::getPreamble(std::string& preamble) preamble += numberBuf; preamble += "\n"; } -#endif -#ifndef GLSLANG_WEB // GL_EXT_spirv_intrinsics if (!isEsProfile()) { switch (language) { @@ -628,12 +684,11 @@ void TParseVersions::getPreamble(std::string& preamble) case EShLangClosestHit: preamble += "#define GL_CLOSEST_HIT_SHADER_EXT 1 \n"; break; case EShLangMiss: preamble += "#define GL_MISS_SHADER_EXT 1 \n"; break; case EShLangCallable: preamble += "#define GL_CALLABLE_SHADER_EXT 1 \n"; break; - case EShLangTaskNV: preamble += "#define GL_TASK_SHADER_NV 1 \n"; break; - case EShLangMeshNV: preamble += "#define GL_MESH_SHADER_NV 1 \n"; break; + case EShLangTask: preamble += "#define GL_TASK_SHADER_NV 1 \n"; break; + case EShLangMesh: preamble += "#define GL_MESH_SHADER_NV 1 \n"; break; default: break; } } -#endif } // @@ -645,7 +700,6 @@ const char* StageName(EShLanguage stage) case EShLangVertex: return "vertex"; case EShLangFragment: return "fragment"; case EShLangCompute: return "compute"; -#ifndef GLSLANG_WEB case EShLangTessControl: return "tessellation control"; case EShLangTessEvaluation: return "tessellation evaluation"; case EShLangGeometry: return "geometry"; @@ -655,9 +709,8 @@ const char* StageName(EShLanguage stage) case EShLangClosestHit: return "closest-hit"; case EShLangMiss: return "miss"; case EShLangCallable: return "callable"; - case EShLangMeshNV: return "mesh"; - case EShLangTaskNV: return "task"; -#endif + case EShLangMesh: return "mesh"; + case EShLangTask: return "task"; default: return "unknown stage"; } } @@ -682,7 +735,6 @@ void TParseVersions::requireStage(const TSourceLoc& loc, EShLanguage stage, cons requireStage(loc, static_cast(1 << stage), featureDesc); } -#ifndef GLSLANG_WEB // // When to use requireProfile(): // @@ -720,12 +772,11 @@ void TParseVersions::profileRequires(const TSourceLoc& loc, int profileMask, int { if (profile & profileMask) { bool okay = minVersion > 0 && version >= minVersion; -#ifndef GLSLANG_WEB for (int i = 0; i < numExtensions; ++i) { switch (getExtensionBehavior(extensions[i])) { case EBhWarn: infoSink.info.message(EPrefixWarning, ("extension " + TString(extensions[i]) + " is being used for " + featureDesc).c_str(), loc); - // fall through + [[fallthrough]]; case EBhRequire: case EBhEnable: okay = true; @@ -733,7 +784,6 @@ void TParseVersions::profileRequires(const TSourceLoc& loc, int profileMask, int default: break; // some compilers want this } } -#endif if (! okay) error(loc, "not supported for this version or the enabled extensions", featureDesc, ""); } @@ -943,6 +993,8 @@ void TParseVersions::updateExtensionBehavior(int line, const char* extension, co updateExtensionBehavior(line, "GL_OES_shader_io_blocks", behaviorString); else if (strcmp(extension, "GL_GOOGLE_include_directive") == 0) updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString); + else if (strcmp(extension, "GL_ARB_shading_language_include") == 0) + updateExtensionBehavior(line, "GL_GOOGLE_cpp_style_line_directive", behaviorString); // subgroup_* to subgroup_basic else if (strcmp(extension, "GL_KHR_shader_subgroup_vote") == 0) updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString); @@ -1047,10 +1099,22 @@ void TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * con { // GL_NV_mesh_shader extension is only allowed in task/mesh shaders if (strcmp(extension, "GL_NV_mesh_shader") == 0) { - requireStage(loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask | EShLangFragmentMask), + requireStage(loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask | EShLangFragmentMask), "#extension GL_NV_mesh_shader"); - profileRequires(loc, ECoreProfile, 450, 0, "#extension GL_NV_mesh_shader"); - profileRequires(loc, EEsProfile, 320, 0, "#extension GL_NV_mesh_shader"); + profileRequires(loc, ECoreProfile, 450, nullptr, "#extension GL_NV_mesh_shader"); + profileRequires(loc, EEsProfile, 320, nullptr, "#extension GL_NV_mesh_shader"); + if (extensionTurnedOn(E_GL_EXT_mesh_shader)) { + error(loc, "GL_EXT_mesh_shader is already turned on, and not allowed with", "#extension", extension); + } + } + else if (strcmp(extension, "GL_EXT_mesh_shader") == 0) { + requireStage(loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask | EShLangFragmentMask), + "#extension GL_EXT_mesh_shader"); + profileRequires(loc, ECoreProfile, 450, nullptr, "#extension GL_EXT_mesh_shader"); + profileRequires(loc, EEsProfile, 320, nullptr, "#extension GL_EXT_mesh_shader"); + if (extensionTurnedOn(E_GL_NV_mesh_shader)) { + error(loc, "GL_NV_mesh_shader is already turned on, and not allowed with", "#extension", extension); + } } } @@ -1070,6 +1134,13 @@ void TParseVersions::extensionRequires(const TSourceLoc &loc, const char * const minSpvVersion = iter->second; requireSpv(loc, extension, minSpvVersion); } + + if (spvVersion.spv != 0){ + for (auto ext : spvUnsupportedExt){ + if (strcmp(extension, ext.c_str()) == 0) + error(loc, "not allowed when using generating SPIR-V codes", extension, ""); + } + } } // Call for any operation needing full GLSL integer data-type support. @@ -1282,7 +1353,7 @@ void TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool buil } } -void TParseVersions::fcoopmatCheck(const TSourceLoc& loc, const char* op, bool builtIn) +void TParseVersions::fcoopmatCheckNV(const TSourceLoc& loc, const char* op, bool builtIn) { if (!builtIn) { const char* const extensions[] = {E_GL_NV_cooperative_matrix}; @@ -1290,14 +1361,22 @@ void TParseVersions::fcoopmatCheck(const TSourceLoc& loc, const char* op, bool b } } -void TParseVersions::intcoopmatCheck(const TSourceLoc& loc, const char* op, bool builtIn) +void TParseVersions::intcoopmatCheckNV(const TSourceLoc& loc, const char* op, bool builtIn) { if (!builtIn) { const char* const extensions[] = {E_GL_NV_integer_cooperative_matrix}; requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op); } } -#endif // GLSLANG_WEB + +void TParseVersions::coopmatCheck(const TSourceLoc& loc, const char* op, bool builtIn) +{ + if (!builtIn) { + const char* const extensions[] = {E_GL_KHR_cooperative_matrix}; + requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op); + } +} + // Call for any operation removed because SPIR-V is in use. void TParseVersions::spvRemoved(const TSourceLoc& loc, const char* op) { @@ -1315,26 +1394,20 @@ void TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op) // Call for any operation that requires Vulkan. void TParseVersions::requireVulkan(const TSourceLoc& loc, const char* op) { -#ifndef GLSLANG_WEB if (spvVersion.vulkan == 0) error(loc, "only allowed when using GLSL for Vulkan", op, ""); -#endif } // Call for any operation that requires SPIR-V. void TParseVersions::requireSpv(const TSourceLoc& loc, const char* op) { -#ifndef GLSLANG_WEB if (spvVersion.spv == 0) error(loc, "only allowed when generating SPIR-V", op, ""); -#endif } void TParseVersions::requireSpv(const TSourceLoc& loc, const char *op, unsigned int version) { -#ifndef GLSLANG_WEB if (spvVersion.spv < version) error(loc, "not supported for current targeted SPIR-V version", op, ""); -#endif } } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.h index 949a7a173..75a823774 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/Versions.h @@ -1,7 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2013 LunarG, Inc. -// Copyright (C) 2017 ARM Limited. +// Copyright (C) 2017, 2022-2024 Arm Limited. // Copyright (C) 2015-2018 Google, Inc. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. // @@ -161,6 +161,9 @@ const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing"; const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod"; const char* const E_GL_ARB_vertex_attrib_64bit = "GL_ARB_vertex_attrib_64bit"; +const char* const E_GL_ARB_draw_instanced = "GL_ARB_draw_instanced"; +const char* const E_GL_ARB_fragment_coord_conventions = "GL_ARB_fragment_coord_conventions"; +const char* const E_GL_ARB_bindless_texture = "GL_ARB_bindless_texture"; const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic"; const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote"; @@ -168,9 +171,11 @@ const char* const E_GL_KHR_shader_subgroup_arithmetic = "GL_KHR_shader_sub const char* const E_GL_KHR_shader_subgroup_ballot = "GL_KHR_shader_subgroup_ballot"; const char* const E_GL_KHR_shader_subgroup_shuffle = "GL_KHR_shader_subgroup_shuffle"; const char* const E_GL_KHR_shader_subgroup_shuffle_relative = "GL_KHR_shader_subgroup_shuffle_relative"; +const char* const E_GL_KHR_shader_subgroup_rotate = "GL_KHR_shader_subgroup_rotate"; const char* const E_GL_KHR_shader_subgroup_clustered = "GL_KHR_shader_subgroup_clustered"; const char* const E_GL_KHR_shader_subgroup_quad = "GL_KHR_shader_subgroup_quad"; const char* const E_GL_KHR_memory_scope_semantics = "GL_KHR_memory_scope_semantics"; +const char* const E_GL_KHR_cooperative_matrix = "GL_KHR_cooperative_matrix"; const char* const E_GL_EXT_shader_atomic_int64 = "GL_EXT_shader_atomic_int64"; @@ -199,6 +204,7 @@ const char* const E_GL_EXT_debug_printf = "GL_EXT_debug_prin const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing"; const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query"; const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling"; +const char* const E_GL_EXT_ray_cull_mask = "GL_EXT_ray_cull_mask"; const char* const E_GL_EXT_blend_func_extended = "GL_EXT_blend_func_extended"; const char* const E_GL_EXT_shader_implicit_conversions = "GL_EXT_shader_implicit_conversions"; const char* const E_GL_EXT_fragment_shading_rate = "GL_EXT_fragment_shading_rate"; @@ -207,12 +213,26 @@ const char* const E_GL_EXT_null_initializer = "GL_EXT_null_initi const char* const E_GL_EXT_shared_memory_block = "GL_EXT_shared_memory_block"; const char* const E_GL_EXT_subgroup_uniform_control_flow = "GL_EXT_subgroup_uniform_control_flow"; const char* const E_GL_EXT_spirv_intrinsics = "GL_EXT_spirv_intrinsics"; +const char* const E_GL_EXT_fragment_shader_barycentric = "GL_EXT_fragment_shader_barycentric"; +const char* const E_GL_EXT_mesh_shader = "GL_EXT_mesh_shader"; +const char* const E_GL_EXT_opacity_micromap = "GL_EXT_opacity_micromap"; +const char* const E_GL_EXT_shader_quad_control = "GL_EXT_shader_quad_control"; +const char* const E_GL_EXT_draw_instanced = "GL_EXT_draw_instanced"; +const char* const E_GL_EXT_texture_array = "GL_EXT_texture_array"; +const char* const E_GL_EXT_maximal_reconvergence = "GL_EXT_maximal_reconvergence"; +const char* const E_GL_EXT_expect_assume = "GL_EXT_expect_assume"; +const char* const E_GL_EXT_control_flow_attributes2 = "GL_EXT_control_flow_attributes2"; +const char* const E_GL_EXT_spec_constant_composites = "GL_EXT_spec_constant_composites"; // Arrays of extensions for the above viewportEXTs duplications const char* const post_depth_coverageEXTs[] = { E_GL_ARB_post_depth_coverage, E_GL_EXT_post_depth_coverage }; const int Num_post_depth_coverageEXTs = sizeof(post_depth_coverageEXTs) / sizeof(post_depth_coverageEXTs[0]); +// Array of extensions to cover both extensions providing ray tracing capabilities. +const char* const ray_tracing_EXTs[] = { E_GL_EXT_ray_query, E_GL_EXT_ray_tracing }; +const int Num_ray_tracing_EXTs = sizeof(ray_tracing_EXTs) / sizeof(ray_tracing_EXTs[0]); + // OVR extensions const char* const E_GL_OVR_multiview = "GL_OVR_multiview"; const char* const E_GL_OVR_multiview2 = "GL_OVR_multiview2"; @@ -223,6 +243,7 @@ const int Num_OVR_multiview_EXTs = sizeof(OVR_multiview_EXTs) / sizeof(OVR_multi // #line and #include const char* const E_GL_GOOGLE_cpp_style_line_directive = "GL_GOOGLE_cpp_style_line_directive"; const char* const E_GL_GOOGLE_include_directive = "GL_GOOGLE_include_directive"; +const char* const E_GL_ARB_shading_language_include = "GL_ARB_shading_language_include"; const char* const E_GL_AMD_shader_ballot = "GL_AMD_shader_ballot"; const char* const E_GL_AMD_shader_trinary_minmax = "GL_AMD_shader_trinary_minmax"; @@ -234,6 +255,7 @@ const char* const E_GL_AMD_gpu_shader_int16 = "GL_AMD_gpu_sh const char* const E_GL_AMD_shader_image_load_store_lod = "GL_AMD_shader_image_load_store_lod"; const char* const E_GL_AMD_shader_fragment_mask = "GL_AMD_shader_fragment_mask"; const char* const E_GL_AMD_gpu_shader_half_float_fetch = "GL_AMD_gpu_shader_half_float_fetch"; +const char* const E_GL_AMD_shader_early_and_late_fragment_tests = "GL_AMD_shader_early_and_late_fragment_tests"; const char* const E_GL_INTEL_shader_integer_functions2 = "GL_INTEL_shader_integer_functions2"; @@ -253,15 +275,25 @@ const char* const E_GL_NV_fragment_shader_barycentric = "GL_NV_fragmen const char* const E_GL_NV_compute_shader_derivatives = "GL_NV_compute_shader_derivatives"; const char* const E_GL_NV_shader_texture_footprint = "GL_NV_shader_texture_footprint"; const char* const E_GL_NV_mesh_shader = "GL_NV_mesh_shader"; +const char* const E_GL_NV_cooperative_matrix = "GL_NV_cooperative_matrix"; +const char* const E_GL_NV_shader_sm_builtins = "GL_NV_shader_sm_builtins"; +const char* const E_GL_NV_integer_cooperative_matrix = "GL_NV_integer_cooperative_matrix"; +const char* const E_GL_NV_shader_invocation_reorder = "GL_NV_shader_invocation_reorder"; +const char* const E_GL_EXT_ray_tracing_position_fetch = "GL_EXT_ray_tracing_position_fetch"; +const char* const E_GL_NV_displacement_micromap = "GL_NV_displacement_micromap"; +const char* const E_GL_NV_shader_atomic_fp16_vector = "GL_NV_shader_atomic_fp16_vector"; + +// ARM +const char* const E_GL_ARM_shader_core_builtins = "GL_ARM_shader_core_builtins"; // Arrays of extensions for the above viewportEXTs duplications const char* const viewportEXTs[] = { E_GL_ARB_shader_viewport_layer_array, E_GL_NV_viewport_array2 }; const int Num_viewportEXTs = sizeof(viewportEXTs) / sizeof(viewportEXTs[0]); -const char* const E_GL_NV_cooperative_matrix = "GL_NV_cooperative_matrix"; -const char* const E_GL_NV_shader_sm_builtins = "GL_NV_shader_sm_builtins"; -const char* const E_GL_NV_integer_cooperative_matrix = "GL_NV_integer_cooperative_matrix"; + +const char* const E_GL_QCOM_image_processing = "GL_QCOM_image_processing"; +const char* const E_GL_QCOM_image_processing2 = "GL_QCOM_image_processing2"; // AEP const char* const E_GL_ANDROID_extension_pack_es31a = "GL_ANDROID_extension_pack_es31a"; @@ -279,7 +311,7 @@ const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessel const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size"; const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer"; const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array"; -const char* const E_GL_EXT_shader_integer_mix = "GL_EXT_shader_integer_mix"; +const char* const E_GL_EXT_shader_integer_mix = "GL_EXT_shader_integer_mix"; // OES matching AEP const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader"; @@ -311,6 +343,10 @@ const char* const E_GL_EXT_terminate_invocation = "GL_EXT_terminate_invocation"; const char* const E_GL_EXT_shader_atomic_float = "GL_EXT_shader_atomic_float"; const char* const E_GL_EXT_shader_atomic_float2 = "GL_EXT_shader_atomic_float2"; +const char* const E_GL_EXT_shader_tile_image = "GL_EXT_shader_tile_image"; + +const char* const E_GL_EXT_texture_shadow_lod = "GL_EXT_texture_shadow_lod"; + // Arrays of extensions for the above AEP duplications const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader }; @@ -340,6 +376,9 @@ const int Num_AEP_texture_buffer = sizeof(AEP_texture_buffer)/sizeof(AEP_texture const char* const AEP_texture_cube_map_array[] = { E_GL_EXT_texture_cube_map_array, E_GL_OES_texture_cube_map_array }; const int Num_AEP_texture_cube_map_array = sizeof(AEP_texture_cube_map_array)/sizeof(AEP_texture_cube_map_array[0]); +const char* const AEP_mesh_shader[] = { E_GL_NV_mesh_shader, E_GL_EXT_mesh_shader }; +const int Num_AEP_mesh_shader = sizeof(AEP_mesh_shader)/sizeof(AEP_mesh_shader[0]); + } // end namespace glslang #endif // _VERSIONS_INCLUDED_ diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.cpp index 8a92f6ae0..19e8faac3 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.cpp @@ -34,8 +34,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#ifndef GLSLANG_WEB - #include "attribute.h" #include "../Include/intermediate.h" #include "ParseHelper.h" @@ -125,6 +123,10 @@ TAttributeType TParseContext::attributeFromName(const TString& name) const return EatPartialCount; else if (name == "subgroup_uniform_control_flow") return EatSubgroupUniformControlFlow; + else if (name == "export") + return EatExport; + else if (name == "maximally_reconverges") + return EatMaximallyReconverges; else return EatNone; } @@ -347,7 +349,7 @@ void TParseContext::handleLoopAttributes(const TAttributes& attributes, TIntermN // // Function attributes // -void TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttributes& attributes, TFunction* function) +void TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttributes& attributes) { for (auto it = attributes.begin(); it != attributes.end(); ++it) { if (it->size() > 0) { @@ -357,8 +359,13 @@ void TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttri switch (it->name) { case EatSubgroupUniformControlFlow: + requireExtensions(loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); intermediate.setSubgroupUniformControlFlow(); break; + case EatMaximallyReconverges: + requireExtensions(loc, 1, &E_GL_EXT_maximal_reconvergence, "attribute"); + intermediate.setMaximallyReconverges(); + break; default: warn(loc, "attribute does not apply to a function", "", ""); break; @@ -367,5 +374,3 @@ void TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttri } } // end namespace glslang - -#endif // GLSLANG_WEB diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.h index c5b29176c..3b480c6f0 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/attribute.h @@ -120,6 +120,8 @@ namespace glslang { EatNonWritable, EatNonReadable, EatSubgroupUniformControlFlow, + EatExport, + EatMaximallyReconverges, }; class TIntermAggregate; diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang.y b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang.y index b77f4617b..53c576778 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang.y +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang.y @@ -37,31 +37,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -// -// Do not edit the .y file, only edit the .m4 file. -// The .y bison file is not a source file, it is a derivative of the .m4 file. -// The m4 file needs to be processed by m4 to generate the .y bison file. -// -// Code sandwiched between a pair: -// -// GLSLANG_WEB_EXCLUDE_ON -// ... -// ... -// ... -// GLSLANG_WEB_EXCLUDE_OFF -// -// Will be excluded from the grammar when m4 is executed as: -// -// m4 -P -DGLSLANG_WEB -// -// It will be included when m4 is executed as: -// -// m4 -P -// - - - - /** * This is bison grammar and productions for parsing all versions of the * GLSL shading languages. @@ -129,19 +104,12 @@ using namespace glslang; glslang::TArraySizes* arraySizes; glslang::TIdentifierList* identifierList; }; - glslang::TArraySizes* typeParameters; + glslang::TTypeParameters* typeParameters; } interm; } %{ -/* windows only pragma */ -#ifdef _MSC_VER - #pragma warning(disable : 4065) - #pragma warning(disable : 4127) - #pragma warning(disable : 4244) -#endif - #define parseContext (*pParseContext) #define yyerror(context, msg) context->parserError(msg) @@ -177,8 +145,6 @@ extern int yylex(YYSTYPE*, TParseContext&); %token ITEXTURE2D ITEXTURE3D ITEXTURECUBE ITEXTURE2DARRAY %token UTEXTURE2D UTEXTURE3D UTEXTURECUBE UTEXTURE2DARRAY - - %token ATTRIBUTE VARYING %token FLOAT16_T FLOAT32_T DOUBLE FLOAT64_T %token INT64_T UINT64_T INT32_T UINT32_T INT16_T UINT16_T INT8_T UINT8_T @@ -211,6 +177,8 @@ extern int yylex(YYSTYPE*, TParseContext&); %token ACCSTRUCTEXT %token RAYQUERYEXT %token FCOOPMATNV ICOOPMATNV UCOOPMATNV +%token COOPMAT +%token HITOBJECTNV HITOBJECTATTRNV // combined image/sampler %token SAMPLERCUBEARRAY SAMPLERCUBEARRAYSHADOW @@ -278,8 +246,7 @@ extern int yylex(YYSTYPE*, TParseContext&); %token SPIRV_INSTRUCTION SPIRV_EXECUTION_MODE SPIRV_EXECUTION_MODE_ID %token SPIRV_DECORATE SPIRV_DECORATE_ID SPIRV_DECORATE_STRING %token SPIRV_TYPE SPIRV_STORAGE_CLASS SPIRV_BY_REFERENCE SPIRV_LITERAL - - +%token ATTACHMENTEXT IATTACHMENTEXT UATTACHMENTEXT %token LEFT_OP RIGHT_OP %token INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP @@ -303,22 +270,20 @@ extern int yylex(YYSTYPE*, TParseContext&); %token BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT %token TERMINATE_INVOCATION %token TERMINATE_RAY IGNORE_INTERSECTION -%token UNIFORM SHARED BUFFER +%token UNIFORM SHARED BUFFER TILEIMAGEEXT %token FLAT SMOOTH LAYOUT - %token DOUBLECONSTANT INT16CONSTANT UINT16CONSTANT FLOAT16CONSTANT INT32CONSTANT UINT32CONSTANT %token INT64CONSTANT UINT64CONSTANT %token SUBROUTINE DEMOTE -%token PAYLOADNV PAYLOADINNV HITATTRNV CALLDATANV CALLDATAINNV +%token PAYLOADNV PAYLOADINNV HITATTRNV CALLDATANV CALLDATAINNV %token PAYLOADEXT PAYLOADINEXT HITATTREXT CALLDATAEXT CALLDATAINEXT %token PATCH SAMPLE NONUNIFORM %token COHERENT VOLATILE RESTRICT READONLY WRITEONLY DEVICECOHERENT QUEUEFAMILYCOHERENT WORKGROUPCOHERENT %token SUBGROUPCOHERENT NONPRIVATE SHADERCALLCOHERENT -%token NOPERSPECTIVE EXPLICITINTERPAMD PERVERTEXNV PERPRIMITIVENV PERVIEWNV PERTASKNV +%token NOPERSPECTIVE EXPLICITINTERPAMD PERVERTEXEXT PERVERTEXNV PERPRIMITIVENV PERVIEWNV PERTASKNV PERPRIMITIVEEXT TASKPAYLOADWORKGROUPEXT %token PRECISE - %type assignment_operator unary_operator %type variable_identifier primary_expression postfix_expression %type expression integer_expression assignment_expression @@ -364,7 +329,6 @@ extern int yylex(YYSTYPE*, TParseContext&); %type identifier_list - %type precise_qualifier non_uniform_qualifier %type type_name_list %type attribute attribute_list single_attribute @@ -377,14 +341,13 @@ extern int yylex(YYSTYPE*, TParseContext&); %type spirv_storage_class_qualifier %type spirv_decorate_qualifier %type spirv_decorate_parameter_list spirv_decorate_parameter -%type spirv_decorate_id_parameter_list +%type spirv_decorate_id_parameter_list spirv_decorate_id_parameter %type spirv_decorate_string_parameter_list %type spirv_type_specifier %type spirv_type_parameter_list spirv_type_parameter %type spirv_instruction_qualifier %type spirv_instruction_qualifier_list spirv_instruction_qualifier_id - %start translation_unit %% @@ -416,7 +379,6 @@ primary_expression | BOOLCONSTANT { $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); } - | STRING_LITERAL { $$ = parseContext.intermediate.addConstantUnion($1.string, $1.loc, true); } @@ -454,7 +416,6 @@ primary_expression parseContext.float16Check($1.loc, "half float literal"); $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat16, $1.loc, true); } - ; postfix_expression @@ -524,18 +485,44 @@ function_call_header_no_parameters function_call_header_with_parameters : function_call_header assignment_expression { - TParameter param = { 0, new TType }; - param.type->shallowCopy($2->getType()); - $1.function->addParameter(param); - $$.function = $1.function; - $$.intermNode = $2; + if (parseContext.spvVersion.vulkan > 0 + && parseContext.spvVersion.vulkanRelaxed + && $2->getType().containsOpaque()) + { + $$.intermNode = parseContext.vkRelaxedRemapFunctionArgument($$.loc, $1.function, $2); + $$.function = $1.function; + } + else + { + TParameter param = { 0, new TType, {} }; + param.type->shallowCopy($2->getType()); + + $1.function->addParameter(param); + $$.function = $1.function; + $$.intermNode = $2; + } } | function_call_header_with_parameters COMMA assignment_expression { - TParameter param = { 0, new TType }; - param.type->shallowCopy($3->getType()); - $1.function->addParameter(param); - $$.function = $1.function; - $$.intermNode = parseContext.intermediate.growAggregate($1.intermNode, $3, $2.loc); + if (parseContext.spvVersion.vulkan > 0 + && parseContext.spvVersion.vulkanRelaxed + && $3->getType().containsOpaque()) + { + TIntermNode* remappedNode = parseContext.vkRelaxedRemapFunctionArgument($2.loc, $1.function, $3); + if (remappedNode == $3) + $$.intermNode = parseContext.intermediate.growAggregate($1.intermNode, $3, $2.loc); + else + $$.intermNode = parseContext.intermediate.mergeAggregate($1.intermNode, remappedNode, $2.loc); + $$.function = $1.function; + } + else + { + TParameter param = { 0, new TType, {} }; + param.type->shallowCopy($3->getType()); + + $1.function->addParameter(param); + $$.function = $1.function; + $$.intermNode = parseContext.intermediate.growAggregate($1.intermNode, $3, $2.loc); + } } ; @@ -580,13 +567,11 @@ function_identifier $$.function = new TFunction(empty, TType(EbtVoid), EOpNull); } } - | non_uniform_qualifier { // Constructor $$.intermNode = 0; $$.function = parseContext.handleConstructorCall($1.loc, $1); } - ; unary_expression @@ -798,7 +783,7 @@ conditional_expression parseContext.rValueErrorCheck($5.loc, ":", $6); $$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc); if ($$ == 0) { - parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(), $6->getCompleteString()); + parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $6->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); $$ = $6; } } @@ -815,7 +800,7 @@ assignment_expression parseContext.rValueErrorCheck($2.loc, "assign", $3); $$ = parseContext.addAssign($2.loc, $2.op, $1, $3); if ($$ == 0) { - parseContext.assignError($2.loc, "assign", $1->getCompleteString(), $3->getCompleteString()); + parseContext.assignError($2.loc, "assign", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); $$ = $1; } } @@ -877,7 +862,7 @@ expression parseContext.samplerConstructorLocationCheck($2.loc, ",", $3); $$ = parseContext.intermediate.addComma($1, $3, $2.loc); if ($$ == 0) { - parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(), $3->getCompleteString()); + parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); $$ = $3; } } @@ -896,7 +881,6 @@ declaration $$ = 0; // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature } - | spirv_instruction_qualifier function_prototype SEMICOLON { parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V instruction qualifier"); $2.function->setSpirvInstruction(*$1); // Attach SPIR-V intruction qualifier @@ -909,7 +893,6 @@ declaration parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V execution mode qualifier"); $$ = 0; } - | init_declarator_list SEMICOLON { if ($1.intermNode && $1.intermNode->getAsAggregate()) $1.intermNode->getAsAggregate()->setOperator(EOpSequence); @@ -977,26 +960,33 @@ identifier_list function_prototype : function_declarator RIGHT_PAREN { $$.function = $1; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $2.loc; } | function_declarator RIGHT_PAREN attribute { $$.function = $1; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $2.loc; - parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes($2.loc, *$3, $$.function); + const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence }; + parseContext.requireExtensions($2.loc, 2, extensions, "attribute"); + parseContext.handleFunctionAttributes($2.loc, *$3); } | attribute function_declarator RIGHT_PAREN { $$.function = $2; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $3.loc; - parseContext.requireExtensions($3.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes($3.loc, *$1, $$.function); + const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence }; + parseContext.requireExtensions($3.loc, 2, extensions, "attribute"); + parseContext.handleFunctionAttributes($3.loc, *$1); } | attribute function_declarator RIGHT_PAREN attribute { $$.function = $2; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $3.loc; - parseContext.requireExtensions($3.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes($3.loc, *$1, $$.function); - parseContext.handleFunctionAttributes($3.loc, *$4, $$.function); + const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence }; + parseContext.requireExtensions($3.loc, 2, extensions, "attribute"); + parseContext.handleFunctionAttributes($3.loc, *$1); + parseContext.handleFunctionAttributes($3.loc, *$4); } ; @@ -1015,7 +1005,12 @@ function_header_with_parameters // Add the parameter $$ = $1; if ($2.param.type->getBasicType() != EbtVoid) - $1->addParameter($2.param); + { + if (!(parseContext.spvVersion.vulkan > 0 && parseContext.spvVersion.vulkanRelaxed)) + $1->addParameter($2.param); + else + parseContext.vkRelaxedRemapFunctionParameter($1, $2.param); + } else delete $2.param.type; } @@ -1033,7 +1028,10 @@ function_header_with_parameters } else { // Add the parameter $$ = $1; - $1->addParameter($3.param); + if (!(parseContext.spvVersion.vulkan > 0 && parseContext.spvVersion.vulkanRelaxed)) + $1->addParameter($3.param); + else + parseContext.vkRelaxedRemapFunctionParameter($1, $3.param); } } ; @@ -1073,7 +1071,7 @@ parameter_declarator } parseContext.reservedErrorCheck($2.loc, *$2.string); - TParameter param = {$2.string, new TType($1)}; + TParameter param = {$2.string, new TType($1), {}}; $$.loc = $2.loc; $$.param = param; } @@ -1091,7 +1089,7 @@ parameter_declarator parseContext.arraySizeRequiredCheck($3.loc, *$3.arraySizes); parseContext.reservedErrorCheck($2.loc, *$2.string); - TParameter param = { $2.string, type }; + TParameter param = { $2.string, type, {} }; $$.loc = $2.loc; $$.param = param; @@ -1106,7 +1104,7 @@ parameter_declaration $$ = $2; if ($1.qualifier.precision != EpqNone) $$.param.type->getQualifier().precision = $1.qualifier.precision; - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); parseContext.parameterTypeCheck($2.loc, $1.qualifier.storage, *$$.param.type); @@ -1118,7 +1116,7 @@ parameter_declaration parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); } // // Without name @@ -1127,7 +1125,7 @@ parameter_declaration $$ = $2; if ($1.qualifier.precision != EpqNone) $$.param.type->getQualifier().precision = $1.qualifier.precision; - parseContext.precisionQualifierCheck($1.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($1.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); parseContext.parameterTypeCheck($2.loc, $1.qualifier.storage, *$$.param.type); @@ -1138,13 +1136,13 @@ parameter_declaration parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); } ; parameter_type_specifier : type_specifier { - TParameter param = { 0, new TType($1) }; + TParameter param = { 0, new TType($1), {} }; $$.param = param; if ($1.arraySizes) parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes); @@ -1179,9 +1177,7 @@ single_declaration : fully_specified_type { $$.type = $1; $$.intermNode = 0; - parseContext.declareTypeDefaults($$.loc, $$.type); - } | fully_specified_type IDENTIFIER { $$.type = $1; @@ -1215,10 +1211,10 @@ fully_specified_type parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type"); } - parseContext.precisionQualifierCheck($$.loc, $$.basicType, $$.qualifier); + parseContext.precisionQualifierCheck($$.loc, $$.basicType, $$.qualifier, $$.isCoopmat()); } | type_qualifier type_specifier { - parseContext.globalQualifierFixCheck($1.loc, $1.qualifier); + parseContext.globalQualifierFixCheck($1.loc, $1.qualifier, false, &$2); parseContext.globalQualifierTypeCheck($1.loc, $1.qualifier, $2); if ($2.arraySizes) { @@ -1232,7 +1228,7 @@ fully_specified_type parseContext.checkNoShaderLayouts($2.loc, $1.shaderQualifiers); $2.shaderQualifiers.merge($1.shaderQualifiers); parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true); - parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier); + parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier, $2.isCoopmat()); $$ = $2; @@ -1267,7 +1263,6 @@ interpolation_qualifier $$.init($1.loc); $$.qualifier.flat = true; } - | NOPERSPECTIVE { parseContext.globalCheck($1.loc, "noperspective"); parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective"); @@ -1290,31 +1285,48 @@ interpolation_qualifier $$.init($1.loc); $$.qualifier.pervertexNV = true; } + | PERVERTEXEXT { + parseContext.globalCheck($1.loc, "pervertexEXT"); + parseContext.profileRequires($1.loc, ECoreProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); + parseContext.profileRequires($1.loc, ECompatibilityProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); + parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); + $$.init($1.loc); + $$.qualifier.pervertexEXT = true; + } | PERPRIMITIVENV { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck($1.loc, "perprimitiveNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshNVMask), "perprimitiveNV"); + parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), "perprimitiveNV"); // Fragment shader stage doesn't check for extension. So we explicitly add below extension check. if (parseContext.language == EShLangFragment) parseContext.requireExtensions($1.loc, 1, &E_GL_NV_mesh_shader, "perprimitiveNV"); $$.init($1.loc); $$.qualifier.perPrimitiveNV = true; } + | PERPRIMITIVEEXT { + // No need for profile version or extension check. Shader stage already checks both. + parseContext.globalCheck($1.loc, "perprimitiveEXT"); + parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), "perprimitiveEXT"); + // Fragment shader stage doesn't check for extension. So we explicitly add below extension check. + if (parseContext.language == EShLangFragment) + parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_mesh_shader, "perprimitiveEXT"); + $$.init($1.loc); + $$.qualifier.perPrimitiveNV = true; + } | PERVIEWNV { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck($1.loc, "perviewNV"); - parseContext.requireStage($1.loc, EShLangMeshNV, "perviewNV"); + parseContext.requireStage($1.loc, EShLangMesh, "perviewNV"); $$.init($1.loc); $$.qualifier.perViewNV = true; } | PERTASKNV { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck($1.loc, "taskNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask), "taskNV"); + parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), "taskNV"); $$.init($1.loc); $$.qualifier.perTaskNV = true; } - ; layout_qualifier @@ -1349,7 +1361,6 @@ layout_qualifier_id } ; - precise_qualifier : PRECISE { parseContext.profileRequires($$.loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise"); @@ -1359,7 +1370,6 @@ precise_qualifier } ; - type_qualifier : single_type_qualifier { $$ = $1; @@ -1393,7 +1403,6 @@ single_type_qualifier // allow inheritance of storage qualifier from block declaration $$ = $1; } - | precise_qualifier { // allow inheritance of storage qualifier from block declaration $$ = $1; @@ -1420,7 +1429,6 @@ single_type_qualifier $$.init($1.loc); $$.qualifier.setSpirvLiteral(); } - ; storage_qualifier @@ -1457,11 +1465,16 @@ storage_qualifier $$.init($1.loc); $$.qualifier.storage = EvqUniform; } + | TILEIMAGEEXT { + parseContext.globalCheck($1.loc, "tileImageEXT"); + $$.init($1.loc); + $$.qualifier.storage = EvqTileImageEXT; + } | SHARED { parseContext.globalCheck($1.loc, "shared"); parseContext.profileRequires($1.loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared"); parseContext.profileRequires($1.loc, EEsProfile, 310, 0, "shared"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshNVMask | EShLangTaskNVMask), "shared"); + parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshMask | EShLangTaskMask), "shared"); $$.init($1.loc); $$.qualifier.storage = EvqShared; } @@ -1470,7 +1483,6 @@ storage_qualifier $$.init($1.loc); $$.qualifier.storage = EvqBuffer; } - | ATTRIBUTE { parseContext.requireStage($1.loc, EShLangVertex, "attribute"); parseContext.checkDeprecated($1.loc, ECoreProfile, 130, "attribute"); @@ -1516,6 +1528,14 @@ storage_qualifier $$.init($1.loc); $$.qualifier.storage = EvqHitAttr; } + | HITOBJECTATTRNV { + parseContext.globalCheck($1.loc, "hitAttributeNV"); + parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask + | EShLangMissMask), "hitObjectAttributeNV"); + parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_shader_invocation_reorder, "hitObjectAttributeNV"); + $$.init($1.loc); + $$.qualifier.storage = EvqHitObjectAttrNV; + } | HITATTREXT { parseContext.globalCheck($1.loc, "hitAttributeEXT"); parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask @@ -1648,10 +1668,15 @@ storage_qualifier parseContext.unimplemented($1.loc, "subroutine"); $$.init($1.loc); } - + | TASKPAYLOADWORKGROUPEXT { + // No need for profile version or extension check. Shader stage already checks both. + parseContext.globalCheck($1.loc, "taskPayloadSharedEXT"); + parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), "taskPayloadSharedEXT "); + $$.init($1.loc); + $$.qualifier.storage = EvqtaskPayloadSharedEXT; + } ; - non_uniform_qualifier : NONUNIFORM { $$.init($1.loc); @@ -1670,12 +1695,13 @@ type_name_list } ; - type_specifier : type_specifier_nonarray type_parameter_specifier_opt { $$ = $1; $$.qualifier.precision = parseContext.getDefaultPrecision($$); $$.typeParameters = $2; + parseContext.coopMatTypeParametersCheck($1.loc, $$); + } | type_specifier_nonarray type_parameter_specifier_opt array_specifier { parseContext.arrayOfArrayVersionCheck($3.loc, $3.arraySizes); @@ -1683,6 +1709,7 @@ type_specifier $$.qualifier.precision = parseContext.getDefaultPrecision($$); $$.typeParameters = $2; $$.arraySizes = $3.arraySizes; + parseContext.coopMatTypeParametersCheck($1.loc, $$); } ; @@ -1729,19 +1756,26 @@ type_parameter_specifier ; type_parameter_specifier_list - : unary_expression { - $$ = new TArraySizes; + : type_specifier { + $$ = new TTypeParameters; + $$->arraySizes = new TArraySizes; + $$->spirvType = $1.spirvType; + $$->basicType = $1.basicType; + } + | unary_expression { + $$ = new TTypeParameters; + $$->arraySizes = new TArraySizes; TArraySize size; - parseContext.arraySizeCheck($1->getLoc(), $1, size, "type parameter"); - $$->addInnerSize(size); + parseContext.arraySizeCheck($1->getLoc(), $1, size, "type parameter", true); + $$->arraySizes->addInnerSize(size); } | type_parameter_specifier_list COMMA unary_expression { $$ = $1; TArraySize size; - parseContext.arraySizeCheck($3->getLoc(), $3, size, "type parameter"); - $$->addInnerSize(size); + parseContext.arraySizeCheck($3->getLoc(), $3, size, "type parameter", true); + $$->arraySizes->addInnerSize(size); } ; @@ -1890,7 +1924,6 @@ type_specifier_nonarray $$.basicType = EbtFloat; $$.setMatrix(4, 4); } - | DOUBLE { parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -2509,7 +2542,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, Esd1D); } - | SAMPLER2D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2545,7 +2577,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, Esd2D, true, true); } - | SAMPLER1DSHADOW { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2654,7 +2685,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtInt, Esd1D); } - | ISAMPLER2D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2690,7 +2720,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtUint, EsdCube); } - | ISAMPLER1DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2731,7 +2760,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.setTexture(EbtUint, EsdCube, true); } - | USAMPLER2DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2807,7 +2835,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.setPureSampler(true); } - | SAMPLER2DRECT { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -3412,6 +3439,24 @@ type_specifier_nonarray $$.sampler.set(EbtFloat, Esd2D); $$.sampler.yuv = true; } + | ATTACHMENTEXT { + parseContext.requireStage($1.loc, EShLangFragment, "attachmentEXT input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setAttachmentEXT(EbtFloat); + } + | IATTACHMENTEXT { + parseContext.requireStage($1.loc, EShLangFragment, "attachmentEXT input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setAttachmentEXT(EbtInt); + } + | UATTACHMENTEXT { + parseContext.requireStage($1.loc, EShLangFragment, "attachmentEXT input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setAttachmentEXT(EbtUint); + } | SUBPASSINPUT { parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); @@ -3463,28 +3508,41 @@ type_specifier_nonarray $$.sampler.setSubpass(EbtUint, true); } | FCOOPMATNV { - parseContext.fcoopmatCheck($1.loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.fcoopmatCheckNV($1.loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat; - $$.coopmat = true; + $$.coopmatNV = true; + $$.coopmatKHR = false; } | ICOOPMATNV { - parseContext.intcoopmatCheck($1.loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV($1.loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtInt; - $$.coopmat = true; + $$.coopmatNV = true; + $$.coopmatKHR = false; } | UCOOPMATNV { - parseContext.intcoopmatCheck($1.loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV($1.loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtUint; - $$.coopmat = true; + $$.coopmatNV = true; + $$.coopmatKHR = false; + } + | COOPMAT { + parseContext.coopmatCheck($1.loc, "coopmat", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtCoopmat; + $$.coopmatNV = false; + $$.coopmatKHR = true; } | spirv_type_specifier { parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V type specifier"); $$ = $1; } - + | HITOBJECTNV { + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtHitObjectNV; + } | struct_specifier { $$ = $1; $$.qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary; @@ -3525,11 +3583,17 @@ precision_qualifier struct_specifier : STRUCT IDENTIFIER LEFT_BRACE { parseContext.nestedStructCheck($1.loc); } struct_declaration_list RIGHT_BRACE { + TType* structure = new TType($5, *$2.string); parseContext.structArrayCheck($2.loc, *structure); + TVariable* userTypeDef = new TVariable($2.string, *structure, true); if (! parseContext.symbolTable.insert(*userTypeDef)) parseContext.error($2.loc, "redefinition", $2.string->c_str(), "struct"); + else if (parseContext.spvVersion.vulkanRelaxed + && structure->containsOpaque()) + parseContext.relaxedSymbols.push_back(structure->getTypeName()); + $$.init($1.loc); $$.basicType = EbtStruct; $$.userDef = structure; @@ -3572,7 +3636,7 @@ struct_declaration $$ = $2; parseContext.voidErrorCheck($1.loc, (*$2)[0].type->getFieldName(), $1.basicType); - parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier); + parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier, $1.isCoopmat()); for (unsigned int i = 0; i < $$->size(); ++i) { TType type($1); @@ -3596,7 +3660,7 @@ struct_declaration parseContext.memberQualifierCheck($1); parseContext.voidErrorCheck($2.loc, (*$3)[0].type->getFieldName(), $2.basicType); parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true); - parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier); + parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier, $2.isCoopmat()); for (unsigned int i = 0; i < $$->size(); ++i) { TType type($2); @@ -3639,7 +3703,6 @@ initializer : assignment_expression { $$ = $1; } - | LEFT_BRACE initializer_list RIGHT_BRACE { const char* initFeature = "{ } style initializers"; parseContext.requireProfile($1.loc, ~EEsProfile, initFeature); @@ -3658,10 +3721,8 @@ initializer parseContext.profileRequires($1.loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); $$ = parseContext.intermediate.makeAggregate($1.loc); } - ; - initializer_list : initializer { $$ = parseContext.intermediate.growAggregate(0, $1, $1->getLoc()); @@ -3671,7 +3732,6 @@ initializer_list } ; - declaration_statement : declaration { $$ = $1; } ; @@ -3691,12 +3751,9 @@ simple_statement | case_label { $$ = $1; } | iteration_statement { $$ = $1; } | jump_statement { $$ = $1; } - | demote_statement { $$ = $1; } - ; - demote_statement : DEMOTE SEMICOLON { parseContext.requireStage($1.loc, EShLangFragment, "demote"); @@ -3705,7 +3762,6 @@ demote_statement } ; - compound_statement : LEFT_BRACE RIGHT_BRACE { $$ = 0; } | LEFT_BRACE { @@ -3718,7 +3774,7 @@ compound_statement } RIGHT_BRACE { if ($3 && $3->getAsAggregate()) - $3->getAsAggregate()->setOperator(EOpSequence); + $3->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence); $$ = $3; } ; @@ -3788,14 +3844,12 @@ selection_statement : selection_statement_nonattributed { $$ = $1; } - | attribute selection_statement_nonattributed { parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSelectionAttributes(*$1, $2); $$ = $2; } - selection_statement_nonattributed : IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement { parseContext.boolCheck($1.loc, $3); @@ -3836,14 +3890,12 @@ switch_statement : switch_statement_nonattributed { $$ = $1; } - | attribute switch_statement_nonattributed { parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSwitchAttributes(*$1, $2); $$ = $2; } - switch_statement_nonattributed : SWITCH LEFT_PAREN expression RIGHT_PAREN { // start new switch sequence on the switch stack @@ -3901,14 +3953,13 @@ iteration_statement : iteration_statement_nonattributed { $$ = $1; } - | attribute iteration_statement_nonattributed { - parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); + const char * extensions[2] = { E_GL_EXT_control_flow_attributes, E_GL_EXT_control_flow_attributes2 }; + parseContext.requireExtensions($2->getLoc(), 2, extensions, "attribute"); parseContext.handleLoopAttributes(*$1, $2); $$ = $2; } - iteration_statement_nonattributed : WHILE LEFT_PAREN { if (! parseContext.limits.whileLoops) @@ -3926,6 +3977,7 @@ iteration_statement_nonattributed --parseContext.controlFlowNestingLevel; } | DO { + parseContext.symbolTable.push(); ++parseContext.loopNestingLevel; ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; @@ -3937,6 +3989,7 @@ iteration_statement_nonattributed parseContext.boolCheck($8.loc, $6); $$ = parseContext.intermediate.addLoop($3, $6, 0, false, $4.loc); + parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.loopNestingLevel; --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; @@ -4019,7 +4072,6 @@ jump_statement parseContext.requireStage($1.loc, EShLangFragment, "terminateInvocation"); $$ = parseContext.intermediate.addBranch(EOpTerminateInvocation, $1.loc); } - | TERMINATE_RAY SEMICOLON { parseContext.requireStage($1.loc, EShLangAnyHit, "terminateRayEXT"); $$ = parseContext.intermediate.addBranch(EOpTerminateRayKHR, $1.loc); @@ -4028,7 +4080,6 @@ jump_statement parseContext.requireStage($1.loc, EShLangAnyHit, "ignoreIntersectionEXT"); $$ = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, $1.loc); } - ; // Grammar Note: No 'goto'. Gotos are not supported. @@ -4053,13 +4104,11 @@ external_declaration | declaration { $$ = $1; } - | SEMICOLON { parseContext.requireProfile($1.loc, ~EEsProfile, "extraneous semicolon"); parseContext.profileRequires($1.loc, ~EEsProfile, 460, nullptr, "extraneous semicolon"); $$ = nullptr; } - ; function_definition @@ -4081,6 +4130,7 @@ function_definition parseContext.error($1.loc, "function does not return a value:", "", $1.function->getName().c_str()); parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); $$ = parseContext.intermediate.growAggregate($1.intermNode, $3); + $$->getAsAggregate()->setLinkType($1.function->getLinkType()); parseContext.intermediate.setAggregateOperator($$, EOpFunction, $1.function->getType(), $1.loc); $$->getAsAggregate()->setName($1.function->getMangledName().c_str()); @@ -4103,7 +4153,6 @@ function_definition } ; - attribute : LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET { $$ = $3; @@ -4125,8 +4174,6 @@ single_attribute $$ = parseContext.makeAttributes(*$1.string, $3); } - - spirv_requirements_list : spirv_requirements_parameter { $$ = $1; @@ -4307,23 +4354,33 @@ spirv_decorate_parameter } spirv_decorate_id_parameter_list - : constant_expression { - if ($1->getBasicType() != EbtFloat && - $1->getBasicType() != EbtInt && - $1->getBasicType() != EbtUint && - $1->getBasicType() != EbtBool) - parseContext.error($1->getLoc(), "this type not allowed", $1->getType().getBasicString(), ""); + : spirv_decorate_id_parameter { $$ = parseContext.intermediate.makeAggregate($1); } - | spirv_decorate_id_parameter_list COMMA constant_expression { - if ($3->getBasicType() != EbtFloat && - $3->getBasicType() != EbtInt && - $3->getBasicType() != EbtUint && - $3->getBasicType() != EbtBool) - parseContext.error($3->getLoc(), "this type not allowed", $3->getType().getBasicString(), ""); + | spirv_decorate_id_parameter_list COMMA spirv_decorate_id_parameter { $$ = parseContext.intermediate.growAggregate($1, $3); } +spirv_decorate_id_parameter + : variable_identifier { + if ($1->getAsConstantUnion() || $1->getAsSymbolNode()) + $$ = $1; + else + parseContext.error($1->getLoc(), "only allow constants or variables which are not elements of a composite", "", ""); + } + | FLOATCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true); + } + | INTCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); + } + | UINTCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); + } + | BOOLCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); + } + spirv_decorate_string_parameter_list : STRING_LITERAL { $$ = parseContext.intermediate.makeAggregate( @@ -4365,8 +4422,8 @@ spirv_type_parameter : constant_expression { $$ = parseContext.makeSpirvTypeParameters($1->getLoc(), $1->getAsConstantUnion()); } - | type_specifier { - $$ = parseContext.makeSpirvTypeParameters($1); + | type_specifier_nonarray { + $$ = parseContext.makeSpirvTypeParameters($1.loc, $1); } spirv_instruction_qualifier @@ -4394,5 +4451,4 @@ spirv_instruction_qualifier_id $$ = parseContext.makeSpirvInstruction($2.loc, *$1.string, $3.i); } - %% diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp index dba06aefe..5764d3929 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.7.4. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -46,10 +46,10 @@ USER NAME SPACE" below. */ /* Identify Bison output, and Bison version. */ -#define YYBISON 30704 +#define YYBISON 30802 /* Bison version string. */ -#define YYBISON_VERSION "3.7.4" +#define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -67,7 +67,7 @@ /* First part of user prologue. */ -#line 69 "MachineIndependent/glslang.y" +#line 44 "MachineIndependent/glslang.y" /* Based on: @@ -287,448 +287,452 @@ enum yysymbol_kind_t YYSYMBOL_FCOOPMATNV = 163, /* FCOOPMATNV */ YYSYMBOL_ICOOPMATNV = 164, /* ICOOPMATNV */ YYSYMBOL_UCOOPMATNV = 165, /* UCOOPMATNV */ - YYSYMBOL_SAMPLERCUBEARRAY = 166, /* SAMPLERCUBEARRAY */ - YYSYMBOL_SAMPLERCUBEARRAYSHADOW = 167, /* SAMPLERCUBEARRAYSHADOW */ - YYSYMBOL_ISAMPLERCUBEARRAY = 168, /* ISAMPLERCUBEARRAY */ - YYSYMBOL_USAMPLERCUBEARRAY = 169, /* USAMPLERCUBEARRAY */ - YYSYMBOL_SAMPLER1D = 170, /* SAMPLER1D */ - YYSYMBOL_SAMPLER1DARRAY = 171, /* SAMPLER1DARRAY */ - YYSYMBOL_SAMPLER1DARRAYSHADOW = 172, /* SAMPLER1DARRAYSHADOW */ - YYSYMBOL_ISAMPLER1D = 173, /* ISAMPLER1D */ - YYSYMBOL_SAMPLER1DSHADOW = 174, /* SAMPLER1DSHADOW */ - YYSYMBOL_SAMPLER2DRECT = 175, /* SAMPLER2DRECT */ - YYSYMBOL_SAMPLER2DRECTSHADOW = 176, /* SAMPLER2DRECTSHADOW */ - YYSYMBOL_ISAMPLER2DRECT = 177, /* ISAMPLER2DRECT */ - YYSYMBOL_USAMPLER2DRECT = 178, /* USAMPLER2DRECT */ - YYSYMBOL_SAMPLERBUFFER = 179, /* SAMPLERBUFFER */ - YYSYMBOL_ISAMPLERBUFFER = 180, /* ISAMPLERBUFFER */ - YYSYMBOL_USAMPLERBUFFER = 181, /* USAMPLERBUFFER */ - YYSYMBOL_SAMPLER2DMS = 182, /* SAMPLER2DMS */ - YYSYMBOL_ISAMPLER2DMS = 183, /* ISAMPLER2DMS */ - YYSYMBOL_USAMPLER2DMS = 184, /* USAMPLER2DMS */ - YYSYMBOL_SAMPLER2DMSARRAY = 185, /* SAMPLER2DMSARRAY */ - YYSYMBOL_ISAMPLER2DMSARRAY = 186, /* ISAMPLER2DMSARRAY */ - YYSYMBOL_USAMPLER2DMSARRAY = 187, /* USAMPLER2DMSARRAY */ - YYSYMBOL_SAMPLEREXTERNALOES = 188, /* SAMPLEREXTERNALOES */ - YYSYMBOL_SAMPLEREXTERNAL2DY2YEXT = 189, /* SAMPLEREXTERNAL2DY2YEXT */ - YYSYMBOL_ISAMPLER1DARRAY = 190, /* ISAMPLER1DARRAY */ - YYSYMBOL_USAMPLER1D = 191, /* USAMPLER1D */ - YYSYMBOL_USAMPLER1DARRAY = 192, /* USAMPLER1DARRAY */ - YYSYMBOL_F16SAMPLER1D = 193, /* F16SAMPLER1D */ - YYSYMBOL_F16SAMPLER2D = 194, /* F16SAMPLER2D */ - YYSYMBOL_F16SAMPLER3D = 195, /* F16SAMPLER3D */ - YYSYMBOL_F16SAMPLER2DRECT = 196, /* F16SAMPLER2DRECT */ - YYSYMBOL_F16SAMPLERCUBE = 197, /* F16SAMPLERCUBE */ - YYSYMBOL_F16SAMPLER1DARRAY = 198, /* F16SAMPLER1DARRAY */ - YYSYMBOL_F16SAMPLER2DARRAY = 199, /* F16SAMPLER2DARRAY */ - YYSYMBOL_F16SAMPLERCUBEARRAY = 200, /* F16SAMPLERCUBEARRAY */ - YYSYMBOL_F16SAMPLERBUFFER = 201, /* F16SAMPLERBUFFER */ - YYSYMBOL_F16SAMPLER2DMS = 202, /* F16SAMPLER2DMS */ - YYSYMBOL_F16SAMPLER2DMSARRAY = 203, /* F16SAMPLER2DMSARRAY */ - YYSYMBOL_F16SAMPLER1DSHADOW = 204, /* F16SAMPLER1DSHADOW */ - YYSYMBOL_F16SAMPLER2DSHADOW = 205, /* F16SAMPLER2DSHADOW */ - YYSYMBOL_F16SAMPLER1DARRAYSHADOW = 206, /* F16SAMPLER1DARRAYSHADOW */ - YYSYMBOL_F16SAMPLER2DARRAYSHADOW = 207, /* F16SAMPLER2DARRAYSHADOW */ - YYSYMBOL_F16SAMPLER2DRECTSHADOW = 208, /* F16SAMPLER2DRECTSHADOW */ - YYSYMBOL_F16SAMPLERCUBESHADOW = 209, /* F16SAMPLERCUBESHADOW */ - YYSYMBOL_F16SAMPLERCUBEARRAYSHADOW = 210, /* F16SAMPLERCUBEARRAYSHADOW */ - YYSYMBOL_IMAGE1D = 211, /* IMAGE1D */ - YYSYMBOL_IIMAGE1D = 212, /* IIMAGE1D */ - YYSYMBOL_UIMAGE1D = 213, /* UIMAGE1D */ - YYSYMBOL_IMAGE2D = 214, /* IMAGE2D */ - YYSYMBOL_IIMAGE2D = 215, /* IIMAGE2D */ - YYSYMBOL_UIMAGE2D = 216, /* UIMAGE2D */ - YYSYMBOL_IMAGE3D = 217, /* IMAGE3D */ - YYSYMBOL_IIMAGE3D = 218, /* IIMAGE3D */ - YYSYMBOL_UIMAGE3D = 219, /* UIMAGE3D */ - YYSYMBOL_IMAGE2DRECT = 220, /* IMAGE2DRECT */ - YYSYMBOL_IIMAGE2DRECT = 221, /* IIMAGE2DRECT */ - YYSYMBOL_UIMAGE2DRECT = 222, /* UIMAGE2DRECT */ - YYSYMBOL_IMAGECUBE = 223, /* IMAGECUBE */ - YYSYMBOL_IIMAGECUBE = 224, /* IIMAGECUBE */ - YYSYMBOL_UIMAGECUBE = 225, /* UIMAGECUBE */ - YYSYMBOL_IMAGEBUFFER = 226, /* IMAGEBUFFER */ - YYSYMBOL_IIMAGEBUFFER = 227, /* IIMAGEBUFFER */ - YYSYMBOL_UIMAGEBUFFER = 228, /* UIMAGEBUFFER */ - YYSYMBOL_IMAGE1DARRAY = 229, /* IMAGE1DARRAY */ - YYSYMBOL_IIMAGE1DARRAY = 230, /* IIMAGE1DARRAY */ - YYSYMBOL_UIMAGE1DARRAY = 231, /* UIMAGE1DARRAY */ - YYSYMBOL_IMAGE2DARRAY = 232, /* IMAGE2DARRAY */ - YYSYMBOL_IIMAGE2DARRAY = 233, /* IIMAGE2DARRAY */ - YYSYMBOL_UIMAGE2DARRAY = 234, /* UIMAGE2DARRAY */ - YYSYMBOL_IMAGECUBEARRAY = 235, /* IMAGECUBEARRAY */ - YYSYMBOL_IIMAGECUBEARRAY = 236, /* IIMAGECUBEARRAY */ - YYSYMBOL_UIMAGECUBEARRAY = 237, /* UIMAGECUBEARRAY */ - YYSYMBOL_IMAGE2DMS = 238, /* IMAGE2DMS */ - YYSYMBOL_IIMAGE2DMS = 239, /* IIMAGE2DMS */ - YYSYMBOL_UIMAGE2DMS = 240, /* UIMAGE2DMS */ - YYSYMBOL_IMAGE2DMSARRAY = 241, /* IMAGE2DMSARRAY */ - YYSYMBOL_IIMAGE2DMSARRAY = 242, /* IIMAGE2DMSARRAY */ - YYSYMBOL_UIMAGE2DMSARRAY = 243, /* UIMAGE2DMSARRAY */ - YYSYMBOL_F16IMAGE1D = 244, /* F16IMAGE1D */ - YYSYMBOL_F16IMAGE2D = 245, /* F16IMAGE2D */ - YYSYMBOL_F16IMAGE3D = 246, /* F16IMAGE3D */ - YYSYMBOL_F16IMAGE2DRECT = 247, /* F16IMAGE2DRECT */ - YYSYMBOL_F16IMAGECUBE = 248, /* F16IMAGECUBE */ - YYSYMBOL_F16IMAGE1DARRAY = 249, /* F16IMAGE1DARRAY */ - YYSYMBOL_F16IMAGE2DARRAY = 250, /* F16IMAGE2DARRAY */ - YYSYMBOL_F16IMAGECUBEARRAY = 251, /* F16IMAGECUBEARRAY */ - YYSYMBOL_F16IMAGEBUFFER = 252, /* F16IMAGEBUFFER */ - YYSYMBOL_F16IMAGE2DMS = 253, /* F16IMAGE2DMS */ - YYSYMBOL_F16IMAGE2DMSARRAY = 254, /* F16IMAGE2DMSARRAY */ - YYSYMBOL_I64IMAGE1D = 255, /* I64IMAGE1D */ - YYSYMBOL_U64IMAGE1D = 256, /* U64IMAGE1D */ - YYSYMBOL_I64IMAGE2D = 257, /* I64IMAGE2D */ - YYSYMBOL_U64IMAGE2D = 258, /* U64IMAGE2D */ - YYSYMBOL_I64IMAGE3D = 259, /* I64IMAGE3D */ - YYSYMBOL_U64IMAGE3D = 260, /* U64IMAGE3D */ - YYSYMBOL_I64IMAGE2DRECT = 261, /* I64IMAGE2DRECT */ - YYSYMBOL_U64IMAGE2DRECT = 262, /* U64IMAGE2DRECT */ - YYSYMBOL_I64IMAGECUBE = 263, /* I64IMAGECUBE */ - YYSYMBOL_U64IMAGECUBE = 264, /* U64IMAGECUBE */ - YYSYMBOL_I64IMAGEBUFFER = 265, /* I64IMAGEBUFFER */ - YYSYMBOL_U64IMAGEBUFFER = 266, /* U64IMAGEBUFFER */ - YYSYMBOL_I64IMAGE1DARRAY = 267, /* I64IMAGE1DARRAY */ - YYSYMBOL_U64IMAGE1DARRAY = 268, /* U64IMAGE1DARRAY */ - YYSYMBOL_I64IMAGE2DARRAY = 269, /* I64IMAGE2DARRAY */ - YYSYMBOL_U64IMAGE2DARRAY = 270, /* U64IMAGE2DARRAY */ - YYSYMBOL_I64IMAGECUBEARRAY = 271, /* I64IMAGECUBEARRAY */ - YYSYMBOL_U64IMAGECUBEARRAY = 272, /* U64IMAGECUBEARRAY */ - YYSYMBOL_I64IMAGE2DMS = 273, /* I64IMAGE2DMS */ - YYSYMBOL_U64IMAGE2DMS = 274, /* U64IMAGE2DMS */ - YYSYMBOL_I64IMAGE2DMSARRAY = 275, /* I64IMAGE2DMSARRAY */ - YYSYMBOL_U64IMAGE2DMSARRAY = 276, /* U64IMAGE2DMSARRAY */ - YYSYMBOL_TEXTURECUBEARRAY = 277, /* TEXTURECUBEARRAY */ - YYSYMBOL_ITEXTURECUBEARRAY = 278, /* ITEXTURECUBEARRAY */ - YYSYMBOL_UTEXTURECUBEARRAY = 279, /* UTEXTURECUBEARRAY */ - YYSYMBOL_TEXTURE1D = 280, /* TEXTURE1D */ - YYSYMBOL_ITEXTURE1D = 281, /* ITEXTURE1D */ - YYSYMBOL_UTEXTURE1D = 282, /* UTEXTURE1D */ - YYSYMBOL_TEXTURE1DARRAY = 283, /* TEXTURE1DARRAY */ - YYSYMBOL_ITEXTURE1DARRAY = 284, /* ITEXTURE1DARRAY */ - YYSYMBOL_UTEXTURE1DARRAY = 285, /* UTEXTURE1DARRAY */ - YYSYMBOL_TEXTURE2DRECT = 286, /* TEXTURE2DRECT */ - YYSYMBOL_ITEXTURE2DRECT = 287, /* ITEXTURE2DRECT */ - YYSYMBOL_UTEXTURE2DRECT = 288, /* UTEXTURE2DRECT */ - YYSYMBOL_TEXTUREBUFFER = 289, /* TEXTUREBUFFER */ - YYSYMBOL_ITEXTUREBUFFER = 290, /* ITEXTUREBUFFER */ - YYSYMBOL_UTEXTUREBUFFER = 291, /* UTEXTUREBUFFER */ - YYSYMBOL_TEXTURE2DMS = 292, /* TEXTURE2DMS */ - YYSYMBOL_ITEXTURE2DMS = 293, /* ITEXTURE2DMS */ - YYSYMBOL_UTEXTURE2DMS = 294, /* UTEXTURE2DMS */ - YYSYMBOL_TEXTURE2DMSARRAY = 295, /* TEXTURE2DMSARRAY */ - YYSYMBOL_ITEXTURE2DMSARRAY = 296, /* ITEXTURE2DMSARRAY */ - YYSYMBOL_UTEXTURE2DMSARRAY = 297, /* UTEXTURE2DMSARRAY */ - YYSYMBOL_F16TEXTURE1D = 298, /* F16TEXTURE1D */ - YYSYMBOL_F16TEXTURE2D = 299, /* F16TEXTURE2D */ - YYSYMBOL_F16TEXTURE3D = 300, /* F16TEXTURE3D */ - YYSYMBOL_F16TEXTURE2DRECT = 301, /* F16TEXTURE2DRECT */ - YYSYMBOL_F16TEXTURECUBE = 302, /* F16TEXTURECUBE */ - YYSYMBOL_F16TEXTURE1DARRAY = 303, /* F16TEXTURE1DARRAY */ - YYSYMBOL_F16TEXTURE2DARRAY = 304, /* F16TEXTURE2DARRAY */ - YYSYMBOL_F16TEXTURECUBEARRAY = 305, /* F16TEXTURECUBEARRAY */ - YYSYMBOL_F16TEXTUREBUFFER = 306, /* F16TEXTUREBUFFER */ - YYSYMBOL_F16TEXTURE2DMS = 307, /* F16TEXTURE2DMS */ - YYSYMBOL_F16TEXTURE2DMSARRAY = 308, /* F16TEXTURE2DMSARRAY */ - YYSYMBOL_SUBPASSINPUT = 309, /* SUBPASSINPUT */ - YYSYMBOL_SUBPASSINPUTMS = 310, /* SUBPASSINPUTMS */ - YYSYMBOL_ISUBPASSINPUT = 311, /* ISUBPASSINPUT */ - YYSYMBOL_ISUBPASSINPUTMS = 312, /* ISUBPASSINPUTMS */ - YYSYMBOL_USUBPASSINPUT = 313, /* USUBPASSINPUT */ - YYSYMBOL_USUBPASSINPUTMS = 314, /* USUBPASSINPUTMS */ - YYSYMBOL_F16SUBPASSINPUT = 315, /* F16SUBPASSINPUT */ - YYSYMBOL_F16SUBPASSINPUTMS = 316, /* F16SUBPASSINPUTMS */ - YYSYMBOL_SPIRV_INSTRUCTION = 317, /* SPIRV_INSTRUCTION */ - YYSYMBOL_SPIRV_EXECUTION_MODE = 318, /* SPIRV_EXECUTION_MODE */ - YYSYMBOL_SPIRV_EXECUTION_MODE_ID = 319, /* SPIRV_EXECUTION_MODE_ID */ - YYSYMBOL_SPIRV_DECORATE = 320, /* SPIRV_DECORATE */ - YYSYMBOL_SPIRV_DECORATE_ID = 321, /* SPIRV_DECORATE_ID */ - YYSYMBOL_SPIRV_DECORATE_STRING = 322, /* SPIRV_DECORATE_STRING */ - YYSYMBOL_SPIRV_TYPE = 323, /* SPIRV_TYPE */ - YYSYMBOL_SPIRV_STORAGE_CLASS = 324, /* SPIRV_STORAGE_CLASS */ - YYSYMBOL_SPIRV_BY_REFERENCE = 325, /* SPIRV_BY_REFERENCE */ - YYSYMBOL_SPIRV_LITERAL = 326, /* SPIRV_LITERAL */ - YYSYMBOL_LEFT_OP = 327, /* LEFT_OP */ - YYSYMBOL_RIGHT_OP = 328, /* RIGHT_OP */ - YYSYMBOL_INC_OP = 329, /* INC_OP */ - YYSYMBOL_DEC_OP = 330, /* DEC_OP */ - YYSYMBOL_LE_OP = 331, /* LE_OP */ - YYSYMBOL_GE_OP = 332, /* GE_OP */ - YYSYMBOL_EQ_OP = 333, /* EQ_OP */ - YYSYMBOL_NE_OP = 334, /* NE_OP */ - YYSYMBOL_AND_OP = 335, /* AND_OP */ - YYSYMBOL_OR_OP = 336, /* OR_OP */ - YYSYMBOL_XOR_OP = 337, /* XOR_OP */ - YYSYMBOL_MUL_ASSIGN = 338, /* MUL_ASSIGN */ - YYSYMBOL_DIV_ASSIGN = 339, /* DIV_ASSIGN */ - YYSYMBOL_ADD_ASSIGN = 340, /* ADD_ASSIGN */ - YYSYMBOL_MOD_ASSIGN = 341, /* MOD_ASSIGN */ - YYSYMBOL_LEFT_ASSIGN = 342, /* LEFT_ASSIGN */ - YYSYMBOL_RIGHT_ASSIGN = 343, /* RIGHT_ASSIGN */ - YYSYMBOL_AND_ASSIGN = 344, /* AND_ASSIGN */ - YYSYMBOL_XOR_ASSIGN = 345, /* XOR_ASSIGN */ - YYSYMBOL_OR_ASSIGN = 346, /* OR_ASSIGN */ - YYSYMBOL_SUB_ASSIGN = 347, /* SUB_ASSIGN */ - YYSYMBOL_STRING_LITERAL = 348, /* STRING_LITERAL */ - YYSYMBOL_LEFT_PAREN = 349, /* LEFT_PAREN */ - YYSYMBOL_RIGHT_PAREN = 350, /* RIGHT_PAREN */ - YYSYMBOL_LEFT_BRACKET = 351, /* LEFT_BRACKET */ - YYSYMBOL_RIGHT_BRACKET = 352, /* RIGHT_BRACKET */ - YYSYMBOL_LEFT_BRACE = 353, /* LEFT_BRACE */ - YYSYMBOL_RIGHT_BRACE = 354, /* RIGHT_BRACE */ - YYSYMBOL_DOT = 355, /* DOT */ - YYSYMBOL_COMMA = 356, /* COMMA */ - YYSYMBOL_COLON = 357, /* COLON */ - YYSYMBOL_EQUAL = 358, /* EQUAL */ - YYSYMBOL_SEMICOLON = 359, /* SEMICOLON */ - YYSYMBOL_BANG = 360, /* BANG */ - YYSYMBOL_DASH = 361, /* DASH */ - YYSYMBOL_TILDE = 362, /* TILDE */ - YYSYMBOL_PLUS = 363, /* PLUS */ - YYSYMBOL_STAR = 364, /* STAR */ - YYSYMBOL_SLASH = 365, /* SLASH */ - YYSYMBOL_PERCENT = 366, /* PERCENT */ - YYSYMBOL_LEFT_ANGLE = 367, /* LEFT_ANGLE */ - YYSYMBOL_RIGHT_ANGLE = 368, /* RIGHT_ANGLE */ - YYSYMBOL_VERTICAL_BAR = 369, /* VERTICAL_BAR */ - YYSYMBOL_CARET = 370, /* CARET */ - YYSYMBOL_AMPERSAND = 371, /* AMPERSAND */ - YYSYMBOL_QUESTION = 372, /* QUESTION */ - YYSYMBOL_INVARIANT = 373, /* INVARIANT */ - YYSYMBOL_HIGH_PRECISION = 374, /* HIGH_PRECISION */ - YYSYMBOL_MEDIUM_PRECISION = 375, /* MEDIUM_PRECISION */ - YYSYMBOL_LOW_PRECISION = 376, /* LOW_PRECISION */ - YYSYMBOL_PRECISION = 377, /* PRECISION */ - YYSYMBOL_PACKED = 378, /* PACKED */ - YYSYMBOL_RESOURCE = 379, /* RESOURCE */ - YYSYMBOL_SUPERP = 380, /* SUPERP */ - YYSYMBOL_FLOATCONSTANT = 381, /* FLOATCONSTANT */ - YYSYMBOL_INTCONSTANT = 382, /* INTCONSTANT */ - YYSYMBOL_UINTCONSTANT = 383, /* UINTCONSTANT */ - YYSYMBOL_BOOLCONSTANT = 384, /* BOOLCONSTANT */ - YYSYMBOL_IDENTIFIER = 385, /* IDENTIFIER */ - YYSYMBOL_TYPE_NAME = 386, /* TYPE_NAME */ - YYSYMBOL_CENTROID = 387, /* CENTROID */ - YYSYMBOL_IN = 388, /* IN */ - YYSYMBOL_OUT = 389, /* OUT */ - YYSYMBOL_INOUT = 390, /* INOUT */ - YYSYMBOL_STRUCT = 391, /* STRUCT */ - YYSYMBOL_VOID = 392, /* VOID */ - YYSYMBOL_WHILE = 393, /* WHILE */ - YYSYMBOL_BREAK = 394, /* BREAK */ - YYSYMBOL_CONTINUE = 395, /* CONTINUE */ - YYSYMBOL_DO = 396, /* DO */ - YYSYMBOL_ELSE = 397, /* ELSE */ - YYSYMBOL_FOR = 398, /* FOR */ - YYSYMBOL_IF = 399, /* IF */ - YYSYMBOL_DISCARD = 400, /* DISCARD */ - YYSYMBOL_RETURN = 401, /* RETURN */ - YYSYMBOL_SWITCH = 402, /* SWITCH */ - YYSYMBOL_CASE = 403, /* CASE */ - YYSYMBOL_DEFAULT = 404, /* DEFAULT */ - YYSYMBOL_TERMINATE_INVOCATION = 405, /* TERMINATE_INVOCATION */ - YYSYMBOL_TERMINATE_RAY = 406, /* TERMINATE_RAY */ - YYSYMBOL_IGNORE_INTERSECTION = 407, /* IGNORE_INTERSECTION */ - YYSYMBOL_UNIFORM = 408, /* UNIFORM */ - YYSYMBOL_SHARED = 409, /* SHARED */ - YYSYMBOL_BUFFER = 410, /* BUFFER */ - YYSYMBOL_FLAT = 411, /* FLAT */ - YYSYMBOL_SMOOTH = 412, /* SMOOTH */ - YYSYMBOL_LAYOUT = 413, /* LAYOUT */ - YYSYMBOL_DOUBLECONSTANT = 414, /* DOUBLECONSTANT */ - YYSYMBOL_INT16CONSTANT = 415, /* INT16CONSTANT */ - YYSYMBOL_UINT16CONSTANT = 416, /* UINT16CONSTANT */ - YYSYMBOL_FLOAT16CONSTANT = 417, /* FLOAT16CONSTANT */ - YYSYMBOL_INT32CONSTANT = 418, /* INT32CONSTANT */ - YYSYMBOL_UINT32CONSTANT = 419, /* UINT32CONSTANT */ - YYSYMBOL_INT64CONSTANT = 420, /* INT64CONSTANT */ - YYSYMBOL_UINT64CONSTANT = 421, /* UINT64CONSTANT */ - YYSYMBOL_SUBROUTINE = 422, /* SUBROUTINE */ - YYSYMBOL_DEMOTE = 423, /* DEMOTE */ - YYSYMBOL_PAYLOADNV = 424, /* PAYLOADNV */ - YYSYMBOL_PAYLOADINNV = 425, /* PAYLOADINNV */ - YYSYMBOL_HITATTRNV = 426, /* HITATTRNV */ - YYSYMBOL_CALLDATANV = 427, /* CALLDATANV */ - YYSYMBOL_CALLDATAINNV = 428, /* CALLDATAINNV */ - YYSYMBOL_PAYLOADEXT = 429, /* PAYLOADEXT */ - YYSYMBOL_PAYLOADINEXT = 430, /* PAYLOADINEXT */ - YYSYMBOL_HITATTREXT = 431, /* HITATTREXT */ - YYSYMBOL_CALLDATAEXT = 432, /* CALLDATAEXT */ - YYSYMBOL_CALLDATAINEXT = 433, /* CALLDATAINEXT */ - YYSYMBOL_PATCH = 434, /* PATCH */ - YYSYMBOL_SAMPLE = 435, /* SAMPLE */ - YYSYMBOL_NONUNIFORM = 436, /* NONUNIFORM */ - YYSYMBOL_COHERENT = 437, /* COHERENT */ - YYSYMBOL_VOLATILE = 438, /* VOLATILE */ - YYSYMBOL_RESTRICT = 439, /* RESTRICT */ - YYSYMBOL_READONLY = 440, /* READONLY */ - YYSYMBOL_WRITEONLY = 441, /* WRITEONLY */ - YYSYMBOL_DEVICECOHERENT = 442, /* DEVICECOHERENT */ - YYSYMBOL_QUEUEFAMILYCOHERENT = 443, /* QUEUEFAMILYCOHERENT */ - YYSYMBOL_WORKGROUPCOHERENT = 444, /* WORKGROUPCOHERENT */ - YYSYMBOL_SUBGROUPCOHERENT = 445, /* SUBGROUPCOHERENT */ - YYSYMBOL_NONPRIVATE = 446, /* NONPRIVATE */ - YYSYMBOL_SHADERCALLCOHERENT = 447, /* SHADERCALLCOHERENT */ - YYSYMBOL_NOPERSPECTIVE = 448, /* NOPERSPECTIVE */ - YYSYMBOL_EXPLICITINTERPAMD = 449, /* EXPLICITINTERPAMD */ - YYSYMBOL_PERVERTEXNV = 450, /* PERVERTEXNV */ - YYSYMBOL_PERPRIMITIVENV = 451, /* PERPRIMITIVENV */ - YYSYMBOL_PERVIEWNV = 452, /* PERVIEWNV */ - YYSYMBOL_PERTASKNV = 453, /* PERTASKNV */ - YYSYMBOL_PRECISE = 454, /* PRECISE */ - YYSYMBOL_YYACCEPT = 455, /* $accept */ - YYSYMBOL_variable_identifier = 456, /* variable_identifier */ - YYSYMBOL_primary_expression = 457, /* primary_expression */ - YYSYMBOL_postfix_expression = 458, /* postfix_expression */ - YYSYMBOL_integer_expression = 459, /* integer_expression */ - YYSYMBOL_function_call = 460, /* function_call */ - YYSYMBOL_function_call_or_method = 461, /* function_call_or_method */ - YYSYMBOL_function_call_generic = 462, /* function_call_generic */ - YYSYMBOL_function_call_header_no_parameters = 463, /* function_call_header_no_parameters */ - YYSYMBOL_function_call_header_with_parameters = 464, /* function_call_header_with_parameters */ - YYSYMBOL_function_call_header = 465, /* function_call_header */ - YYSYMBOL_function_identifier = 466, /* function_identifier */ - YYSYMBOL_unary_expression = 467, /* unary_expression */ - YYSYMBOL_unary_operator = 468, /* unary_operator */ - YYSYMBOL_multiplicative_expression = 469, /* multiplicative_expression */ - YYSYMBOL_additive_expression = 470, /* additive_expression */ - YYSYMBOL_shift_expression = 471, /* shift_expression */ - YYSYMBOL_relational_expression = 472, /* relational_expression */ - YYSYMBOL_equality_expression = 473, /* equality_expression */ - YYSYMBOL_and_expression = 474, /* and_expression */ - YYSYMBOL_exclusive_or_expression = 475, /* exclusive_or_expression */ - YYSYMBOL_inclusive_or_expression = 476, /* inclusive_or_expression */ - YYSYMBOL_logical_and_expression = 477, /* logical_and_expression */ - YYSYMBOL_logical_xor_expression = 478, /* logical_xor_expression */ - YYSYMBOL_logical_or_expression = 479, /* logical_or_expression */ - YYSYMBOL_conditional_expression = 480, /* conditional_expression */ - YYSYMBOL_481_1 = 481, /* $@1 */ - YYSYMBOL_assignment_expression = 482, /* assignment_expression */ - YYSYMBOL_assignment_operator = 483, /* assignment_operator */ - YYSYMBOL_expression = 484, /* expression */ - YYSYMBOL_constant_expression = 485, /* constant_expression */ - YYSYMBOL_declaration = 486, /* declaration */ - YYSYMBOL_block_structure = 487, /* block_structure */ - YYSYMBOL_488_2 = 488, /* $@2 */ - YYSYMBOL_identifier_list = 489, /* identifier_list */ - YYSYMBOL_function_prototype = 490, /* function_prototype */ - YYSYMBOL_function_declarator = 491, /* function_declarator */ - YYSYMBOL_function_header_with_parameters = 492, /* function_header_with_parameters */ - YYSYMBOL_function_header = 493, /* function_header */ - YYSYMBOL_parameter_declarator = 494, /* parameter_declarator */ - YYSYMBOL_parameter_declaration = 495, /* parameter_declaration */ - YYSYMBOL_parameter_type_specifier = 496, /* parameter_type_specifier */ - YYSYMBOL_init_declarator_list = 497, /* init_declarator_list */ - YYSYMBOL_single_declaration = 498, /* single_declaration */ - YYSYMBOL_fully_specified_type = 499, /* fully_specified_type */ - YYSYMBOL_invariant_qualifier = 500, /* invariant_qualifier */ - YYSYMBOL_interpolation_qualifier = 501, /* interpolation_qualifier */ - YYSYMBOL_layout_qualifier = 502, /* layout_qualifier */ - YYSYMBOL_layout_qualifier_id_list = 503, /* layout_qualifier_id_list */ - YYSYMBOL_layout_qualifier_id = 504, /* layout_qualifier_id */ - YYSYMBOL_precise_qualifier = 505, /* precise_qualifier */ - YYSYMBOL_type_qualifier = 506, /* type_qualifier */ - YYSYMBOL_single_type_qualifier = 507, /* single_type_qualifier */ - YYSYMBOL_storage_qualifier = 508, /* storage_qualifier */ - YYSYMBOL_non_uniform_qualifier = 509, /* non_uniform_qualifier */ - YYSYMBOL_type_name_list = 510, /* type_name_list */ - YYSYMBOL_type_specifier = 511, /* type_specifier */ - YYSYMBOL_array_specifier = 512, /* array_specifier */ - YYSYMBOL_type_parameter_specifier_opt = 513, /* type_parameter_specifier_opt */ - YYSYMBOL_type_parameter_specifier = 514, /* type_parameter_specifier */ - YYSYMBOL_type_parameter_specifier_list = 515, /* type_parameter_specifier_list */ - YYSYMBOL_type_specifier_nonarray = 516, /* type_specifier_nonarray */ - YYSYMBOL_precision_qualifier = 517, /* precision_qualifier */ - YYSYMBOL_struct_specifier = 518, /* struct_specifier */ - YYSYMBOL_519_3 = 519, /* $@3 */ - YYSYMBOL_520_4 = 520, /* $@4 */ - YYSYMBOL_struct_declaration_list = 521, /* struct_declaration_list */ - YYSYMBOL_struct_declaration = 522, /* struct_declaration */ - YYSYMBOL_struct_declarator_list = 523, /* struct_declarator_list */ - YYSYMBOL_struct_declarator = 524, /* struct_declarator */ - YYSYMBOL_initializer = 525, /* initializer */ - YYSYMBOL_initializer_list = 526, /* initializer_list */ - YYSYMBOL_declaration_statement = 527, /* declaration_statement */ - YYSYMBOL_statement = 528, /* statement */ - YYSYMBOL_simple_statement = 529, /* simple_statement */ - YYSYMBOL_demote_statement = 530, /* demote_statement */ - YYSYMBOL_compound_statement = 531, /* compound_statement */ - YYSYMBOL_532_5 = 532, /* $@5 */ - YYSYMBOL_533_6 = 533, /* $@6 */ - YYSYMBOL_statement_no_new_scope = 534, /* statement_no_new_scope */ - YYSYMBOL_statement_scoped = 535, /* statement_scoped */ - YYSYMBOL_536_7 = 536, /* $@7 */ - YYSYMBOL_537_8 = 537, /* $@8 */ - YYSYMBOL_compound_statement_no_new_scope = 538, /* compound_statement_no_new_scope */ - YYSYMBOL_statement_list = 539, /* statement_list */ - YYSYMBOL_expression_statement = 540, /* expression_statement */ - YYSYMBOL_selection_statement = 541, /* selection_statement */ - YYSYMBOL_selection_statement_nonattributed = 542, /* selection_statement_nonattributed */ - YYSYMBOL_selection_rest_statement = 543, /* selection_rest_statement */ - YYSYMBOL_condition = 544, /* condition */ - YYSYMBOL_switch_statement = 545, /* switch_statement */ - YYSYMBOL_switch_statement_nonattributed = 546, /* switch_statement_nonattributed */ - YYSYMBOL_547_9 = 547, /* $@9 */ - YYSYMBOL_switch_statement_list = 548, /* switch_statement_list */ - YYSYMBOL_case_label = 549, /* case_label */ - YYSYMBOL_iteration_statement = 550, /* iteration_statement */ - YYSYMBOL_iteration_statement_nonattributed = 551, /* iteration_statement_nonattributed */ - YYSYMBOL_552_10 = 552, /* $@10 */ - YYSYMBOL_553_11 = 553, /* $@11 */ - YYSYMBOL_554_12 = 554, /* $@12 */ - YYSYMBOL_for_init_statement = 555, /* for_init_statement */ - YYSYMBOL_conditionopt = 556, /* conditionopt */ - YYSYMBOL_for_rest_statement = 557, /* for_rest_statement */ - YYSYMBOL_jump_statement = 558, /* jump_statement */ - YYSYMBOL_translation_unit = 559, /* translation_unit */ - YYSYMBOL_external_declaration = 560, /* external_declaration */ - YYSYMBOL_function_definition = 561, /* function_definition */ - YYSYMBOL_562_13 = 562, /* $@13 */ - YYSYMBOL_attribute = 563, /* attribute */ - YYSYMBOL_attribute_list = 564, /* attribute_list */ - YYSYMBOL_single_attribute = 565, /* single_attribute */ - YYSYMBOL_spirv_requirements_list = 566, /* spirv_requirements_list */ - YYSYMBOL_spirv_requirements_parameter = 567, /* spirv_requirements_parameter */ - YYSYMBOL_spirv_extension_list = 568, /* spirv_extension_list */ - YYSYMBOL_spirv_capability_list = 569, /* spirv_capability_list */ - YYSYMBOL_spirv_execution_mode_qualifier = 570, /* spirv_execution_mode_qualifier */ - YYSYMBOL_spirv_execution_mode_parameter_list = 571, /* spirv_execution_mode_parameter_list */ - YYSYMBOL_spirv_execution_mode_parameter = 572, /* spirv_execution_mode_parameter */ - YYSYMBOL_spirv_execution_mode_id_parameter_list = 573, /* spirv_execution_mode_id_parameter_list */ - YYSYMBOL_spirv_storage_class_qualifier = 574, /* spirv_storage_class_qualifier */ - YYSYMBOL_spirv_decorate_qualifier = 575, /* spirv_decorate_qualifier */ - YYSYMBOL_spirv_decorate_parameter_list = 576, /* spirv_decorate_parameter_list */ - YYSYMBOL_spirv_decorate_parameter = 577, /* spirv_decorate_parameter */ - YYSYMBOL_spirv_decorate_id_parameter_list = 578, /* spirv_decorate_id_parameter_list */ - YYSYMBOL_spirv_decorate_string_parameter_list = 579, /* spirv_decorate_string_parameter_list */ - YYSYMBOL_spirv_type_specifier = 580, /* spirv_type_specifier */ - YYSYMBOL_spirv_type_parameter_list = 581, /* spirv_type_parameter_list */ - YYSYMBOL_spirv_type_parameter = 582, /* spirv_type_parameter */ - YYSYMBOL_spirv_instruction_qualifier = 583, /* spirv_instruction_qualifier */ - YYSYMBOL_spirv_instruction_qualifier_list = 584, /* spirv_instruction_qualifier_list */ - YYSYMBOL_spirv_instruction_qualifier_id = 585 /* spirv_instruction_qualifier_id */ + YYSYMBOL_COOPMAT = 166, /* COOPMAT */ + YYSYMBOL_HITOBJECTNV = 167, /* HITOBJECTNV */ + YYSYMBOL_HITOBJECTATTRNV = 168, /* HITOBJECTATTRNV */ + YYSYMBOL_SAMPLERCUBEARRAY = 169, /* SAMPLERCUBEARRAY */ + YYSYMBOL_SAMPLERCUBEARRAYSHADOW = 170, /* SAMPLERCUBEARRAYSHADOW */ + YYSYMBOL_ISAMPLERCUBEARRAY = 171, /* ISAMPLERCUBEARRAY */ + YYSYMBOL_USAMPLERCUBEARRAY = 172, /* USAMPLERCUBEARRAY */ + YYSYMBOL_SAMPLER1D = 173, /* SAMPLER1D */ + YYSYMBOL_SAMPLER1DARRAY = 174, /* SAMPLER1DARRAY */ + YYSYMBOL_SAMPLER1DARRAYSHADOW = 175, /* SAMPLER1DARRAYSHADOW */ + YYSYMBOL_ISAMPLER1D = 176, /* ISAMPLER1D */ + YYSYMBOL_SAMPLER1DSHADOW = 177, /* SAMPLER1DSHADOW */ + YYSYMBOL_SAMPLER2DRECT = 178, /* SAMPLER2DRECT */ + YYSYMBOL_SAMPLER2DRECTSHADOW = 179, /* SAMPLER2DRECTSHADOW */ + YYSYMBOL_ISAMPLER2DRECT = 180, /* ISAMPLER2DRECT */ + YYSYMBOL_USAMPLER2DRECT = 181, /* USAMPLER2DRECT */ + YYSYMBOL_SAMPLERBUFFER = 182, /* SAMPLERBUFFER */ + YYSYMBOL_ISAMPLERBUFFER = 183, /* ISAMPLERBUFFER */ + YYSYMBOL_USAMPLERBUFFER = 184, /* USAMPLERBUFFER */ + YYSYMBOL_SAMPLER2DMS = 185, /* SAMPLER2DMS */ + YYSYMBOL_ISAMPLER2DMS = 186, /* ISAMPLER2DMS */ + YYSYMBOL_USAMPLER2DMS = 187, /* USAMPLER2DMS */ + YYSYMBOL_SAMPLER2DMSARRAY = 188, /* SAMPLER2DMSARRAY */ + YYSYMBOL_ISAMPLER2DMSARRAY = 189, /* ISAMPLER2DMSARRAY */ + YYSYMBOL_USAMPLER2DMSARRAY = 190, /* USAMPLER2DMSARRAY */ + YYSYMBOL_SAMPLEREXTERNALOES = 191, /* SAMPLEREXTERNALOES */ + YYSYMBOL_SAMPLEREXTERNAL2DY2YEXT = 192, /* SAMPLEREXTERNAL2DY2YEXT */ + YYSYMBOL_ISAMPLER1DARRAY = 193, /* ISAMPLER1DARRAY */ + YYSYMBOL_USAMPLER1D = 194, /* USAMPLER1D */ + YYSYMBOL_USAMPLER1DARRAY = 195, /* USAMPLER1DARRAY */ + YYSYMBOL_F16SAMPLER1D = 196, /* F16SAMPLER1D */ + YYSYMBOL_F16SAMPLER2D = 197, /* F16SAMPLER2D */ + YYSYMBOL_F16SAMPLER3D = 198, /* F16SAMPLER3D */ + YYSYMBOL_F16SAMPLER2DRECT = 199, /* F16SAMPLER2DRECT */ + YYSYMBOL_F16SAMPLERCUBE = 200, /* F16SAMPLERCUBE */ + YYSYMBOL_F16SAMPLER1DARRAY = 201, /* F16SAMPLER1DARRAY */ + YYSYMBOL_F16SAMPLER2DARRAY = 202, /* F16SAMPLER2DARRAY */ + YYSYMBOL_F16SAMPLERCUBEARRAY = 203, /* F16SAMPLERCUBEARRAY */ + YYSYMBOL_F16SAMPLERBUFFER = 204, /* F16SAMPLERBUFFER */ + YYSYMBOL_F16SAMPLER2DMS = 205, /* F16SAMPLER2DMS */ + YYSYMBOL_F16SAMPLER2DMSARRAY = 206, /* F16SAMPLER2DMSARRAY */ + YYSYMBOL_F16SAMPLER1DSHADOW = 207, /* F16SAMPLER1DSHADOW */ + YYSYMBOL_F16SAMPLER2DSHADOW = 208, /* F16SAMPLER2DSHADOW */ + YYSYMBOL_F16SAMPLER1DARRAYSHADOW = 209, /* F16SAMPLER1DARRAYSHADOW */ + YYSYMBOL_F16SAMPLER2DARRAYSHADOW = 210, /* F16SAMPLER2DARRAYSHADOW */ + YYSYMBOL_F16SAMPLER2DRECTSHADOW = 211, /* F16SAMPLER2DRECTSHADOW */ + YYSYMBOL_F16SAMPLERCUBESHADOW = 212, /* F16SAMPLERCUBESHADOW */ + YYSYMBOL_F16SAMPLERCUBEARRAYSHADOW = 213, /* F16SAMPLERCUBEARRAYSHADOW */ + YYSYMBOL_IMAGE1D = 214, /* IMAGE1D */ + YYSYMBOL_IIMAGE1D = 215, /* IIMAGE1D */ + YYSYMBOL_UIMAGE1D = 216, /* UIMAGE1D */ + YYSYMBOL_IMAGE2D = 217, /* IMAGE2D */ + YYSYMBOL_IIMAGE2D = 218, /* IIMAGE2D */ + YYSYMBOL_UIMAGE2D = 219, /* UIMAGE2D */ + YYSYMBOL_IMAGE3D = 220, /* IMAGE3D */ + YYSYMBOL_IIMAGE3D = 221, /* IIMAGE3D */ + YYSYMBOL_UIMAGE3D = 222, /* UIMAGE3D */ + YYSYMBOL_IMAGE2DRECT = 223, /* IMAGE2DRECT */ + YYSYMBOL_IIMAGE2DRECT = 224, /* IIMAGE2DRECT */ + YYSYMBOL_UIMAGE2DRECT = 225, /* UIMAGE2DRECT */ + YYSYMBOL_IMAGECUBE = 226, /* IMAGECUBE */ + YYSYMBOL_IIMAGECUBE = 227, /* IIMAGECUBE */ + YYSYMBOL_UIMAGECUBE = 228, /* UIMAGECUBE */ + YYSYMBOL_IMAGEBUFFER = 229, /* IMAGEBUFFER */ + YYSYMBOL_IIMAGEBUFFER = 230, /* IIMAGEBUFFER */ + YYSYMBOL_UIMAGEBUFFER = 231, /* UIMAGEBUFFER */ + YYSYMBOL_IMAGE1DARRAY = 232, /* IMAGE1DARRAY */ + YYSYMBOL_IIMAGE1DARRAY = 233, /* IIMAGE1DARRAY */ + YYSYMBOL_UIMAGE1DARRAY = 234, /* UIMAGE1DARRAY */ + YYSYMBOL_IMAGE2DARRAY = 235, /* IMAGE2DARRAY */ + YYSYMBOL_IIMAGE2DARRAY = 236, /* IIMAGE2DARRAY */ + YYSYMBOL_UIMAGE2DARRAY = 237, /* UIMAGE2DARRAY */ + YYSYMBOL_IMAGECUBEARRAY = 238, /* IMAGECUBEARRAY */ + YYSYMBOL_IIMAGECUBEARRAY = 239, /* IIMAGECUBEARRAY */ + YYSYMBOL_UIMAGECUBEARRAY = 240, /* UIMAGECUBEARRAY */ + YYSYMBOL_IMAGE2DMS = 241, /* IMAGE2DMS */ + YYSYMBOL_IIMAGE2DMS = 242, /* IIMAGE2DMS */ + YYSYMBOL_UIMAGE2DMS = 243, /* UIMAGE2DMS */ + YYSYMBOL_IMAGE2DMSARRAY = 244, /* IMAGE2DMSARRAY */ + YYSYMBOL_IIMAGE2DMSARRAY = 245, /* IIMAGE2DMSARRAY */ + YYSYMBOL_UIMAGE2DMSARRAY = 246, /* UIMAGE2DMSARRAY */ + YYSYMBOL_F16IMAGE1D = 247, /* F16IMAGE1D */ + YYSYMBOL_F16IMAGE2D = 248, /* F16IMAGE2D */ + YYSYMBOL_F16IMAGE3D = 249, /* F16IMAGE3D */ + YYSYMBOL_F16IMAGE2DRECT = 250, /* F16IMAGE2DRECT */ + YYSYMBOL_F16IMAGECUBE = 251, /* F16IMAGECUBE */ + YYSYMBOL_F16IMAGE1DARRAY = 252, /* F16IMAGE1DARRAY */ + YYSYMBOL_F16IMAGE2DARRAY = 253, /* F16IMAGE2DARRAY */ + YYSYMBOL_F16IMAGECUBEARRAY = 254, /* F16IMAGECUBEARRAY */ + YYSYMBOL_F16IMAGEBUFFER = 255, /* F16IMAGEBUFFER */ + YYSYMBOL_F16IMAGE2DMS = 256, /* F16IMAGE2DMS */ + YYSYMBOL_F16IMAGE2DMSARRAY = 257, /* F16IMAGE2DMSARRAY */ + YYSYMBOL_I64IMAGE1D = 258, /* I64IMAGE1D */ + YYSYMBOL_U64IMAGE1D = 259, /* U64IMAGE1D */ + YYSYMBOL_I64IMAGE2D = 260, /* I64IMAGE2D */ + YYSYMBOL_U64IMAGE2D = 261, /* U64IMAGE2D */ + YYSYMBOL_I64IMAGE3D = 262, /* I64IMAGE3D */ + YYSYMBOL_U64IMAGE3D = 263, /* U64IMAGE3D */ + YYSYMBOL_I64IMAGE2DRECT = 264, /* I64IMAGE2DRECT */ + YYSYMBOL_U64IMAGE2DRECT = 265, /* U64IMAGE2DRECT */ + YYSYMBOL_I64IMAGECUBE = 266, /* I64IMAGECUBE */ + YYSYMBOL_U64IMAGECUBE = 267, /* U64IMAGECUBE */ + YYSYMBOL_I64IMAGEBUFFER = 268, /* I64IMAGEBUFFER */ + YYSYMBOL_U64IMAGEBUFFER = 269, /* U64IMAGEBUFFER */ + YYSYMBOL_I64IMAGE1DARRAY = 270, /* I64IMAGE1DARRAY */ + YYSYMBOL_U64IMAGE1DARRAY = 271, /* U64IMAGE1DARRAY */ + YYSYMBOL_I64IMAGE2DARRAY = 272, /* I64IMAGE2DARRAY */ + YYSYMBOL_U64IMAGE2DARRAY = 273, /* U64IMAGE2DARRAY */ + YYSYMBOL_I64IMAGECUBEARRAY = 274, /* I64IMAGECUBEARRAY */ + YYSYMBOL_U64IMAGECUBEARRAY = 275, /* U64IMAGECUBEARRAY */ + YYSYMBOL_I64IMAGE2DMS = 276, /* I64IMAGE2DMS */ + YYSYMBOL_U64IMAGE2DMS = 277, /* U64IMAGE2DMS */ + YYSYMBOL_I64IMAGE2DMSARRAY = 278, /* I64IMAGE2DMSARRAY */ + YYSYMBOL_U64IMAGE2DMSARRAY = 279, /* U64IMAGE2DMSARRAY */ + YYSYMBOL_TEXTURECUBEARRAY = 280, /* TEXTURECUBEARRAY */ + YYSYMBOL_ITEXTURECUBEARRAY = 281, /* ITEXTURECUBEARRAY */ + YYSYMBOL_UTEXTURECUBEARRAY = 282, /* UTEXTURECUBEARRAY */ + YYSYMBOL_TEXTURE1D = 283, /* TEXTURE1D */ + YYSYMBOL_ITEXTURE1D = 284, /* ITEXTURE1D */ + YYSYMBOL_UTEXTURE1D = 285, /* UTEXTURE1D */ + YYSYMBOL_TEXTURE1DARRAY = 286, /* TEXTURE1DARRAY */ + YYSYMBOL_ITEXTURE1DARRAY = 287, /* ITEXTURE1DARRAY */ + YYSYMBOL_UTEXTURE1DARRAY = 288, /* UTEXTURE1DARRAY */ + YYSYMBOL_TEXTURE2DRECT = 289, /* TEXTURE2DRECT */ + YYSYMBOL_ITEXTURE2DRECT = 290, /* ITEXTURE2DRECT */ + YYSYMBOL_UTEXTURE2DRECT = 291, /* UTEXTURE2DRECT */ + YYSYMBOL_TEXTUREBUFFER = 292, /* TEXTUREBUFFER */ + YYSYMBOL_ITEXTUREBUFFER = 293, /* ITEXTUREBUFFER */ + YYSYMBOL_UTEXTUREBUFFER = 294, /* UTEXTUREBUFFER */ + YYSYMBOL_TEXTURE2DMS = 295, /* TEXTURE2DMS */ + YYSYMBOL_ITEXTURE2DMS = 296, /* ITEXTURE2DMS */ + YYSYMBOL_UTEXTURE2DMS = 297, /* UTEXTURE2DMS */ + YYSYMBOL_TEXTURE2DMSARRAY = 298, /* TEXTURE2DMSARRAY */ + YYSYMBOL_ITEXTURE2DMSARRAY = 299, /* ITEXTURE2DMSARRAY */ + YYSYMBOL_UTEXTURE2DMSARRAY = 300, /* UTEXTURE2DMSARRAY */ + YYSYMBOL_F16TEXTURE1D = 301, /* F16TEXTURE1D */ + YYSYMBOL_F16TEXTURE2D = 302, /* F16TEXTURE2D */ + YYSYMBOL_F16TEXTURE3D = 303, /* F16TEXTURE3D */ + YYSYMBOL_F16TEXTURE2DRECT = 304, /* F16TEXTURE2DRECT */ + YYSYMBOL_F16TEXTURECUBE = 305, /* F16TEXTURECUBE */ + YYSYMBOL_F16TEXTURE1DARRAY = 306, /* F16TEXTURE1DARRAY */ + YYSYMBOL_F16TEXTURE2DARRAY = 307, /* F16TEXTURE2DARRAY */ + YYSYMBOL_F16TEXTURECUBEARRAY = 308, /* F16TEXTURECUBEARRAY */ + YYSYMBOL_F16TEXTUREBUFFER = 309, /* F16TEXTUREBUFFER */ + YYSYMBOL_F16TEXTURE2DMS = 310, /* F16TEXTURE2DMS */ + YYSYMBOL_F16TEXTURE2DMSARRAY = 311, /* F16TEXTURE2DMSARRAY */ + YYSYMBOL_SUBPASSINPUT = 312, /* SUBPASSINPUT */ + YYSYMBOL_SUBPASSINPUTMS = 313, /* SUBPASSINPUTMS */ + YYSYMBOL_ISUBPASSINPUT = 314, /* ISUBPASSINPUT */ + YYSYMBOL_ISUBPASSINPUTMS = 315, /* ISUBPASSINPUTMS */ + YYSYMBOL_USUBPASSINPUT = 316, /* USUBPASSINPUT */ + YYSYMBOL_USUBPASSINPUTMS = 317, /* USUBPASSINPUTMS */ + YYSYMBOL_F16SUBPASSINPUT = 318, /* F16SUBPASSINPUT */ + YYSYMBOL_F16SUBPASSINPUTMS = 319, /* F16SUBPASSINPUTMS */ + YYSYMBOL_SPIRV_INSTRUCTION = 320, /* SPIRV_INSTRUCTION */ + YYSYMBOL_SPIRV_EXECUTION_MODE = 321, /* SPIRV_EXECUTION_MODE */ + YYSYMBOL_SPIRV_EXECUTION_MODE_ID = 322, /* SPIRV_EXECUTION_MODE_ID */ + YYSYMBOL_SPIRV_DECORATE = 323, /* SPIRV_DECORATE */ + YYSYMBOL_SPIRV_DECORATE_ID = 324, /* SPIRV_DECORATE_ID */ + YYSYMBOL_SPIRV_DECORATE_STRING = 325, /* SPIRV_DECORATE_STRING */ + YYSYMBOL_SPIRV_TYPE = 326, /* SPIRV_TYPE */ + YYSYMBOL_SPIRV_STORAGE_CLASS = 327, /* SPIRV_STORAGE_CLASS */ + YYSYMBOL_SPIRV_BY_REFERENCE = 328, /* SPIRV_BY_REFERENCE */ + YYSYMBOL_SPIRV_LITERAL = 329, /* SPIRV_LITERAL */ + YYSYMBOL_ATTACHMENTEXT = 330, /* ATTACHMENTEXT */ + YYSYMBOL_IATTACHMENTEXT = 331, /* IATTACHMENTEXT */ + YYSYMBOL_UATTACHMENTEXT = 332, /* UATTACHMENTEXT */ + YYSYMBOL_LEFT_OP = 333, /* LEFT_OP */ + YYSYMBOL_RIGHT_OP = 334, /* RIGHT_OP */ + YYSYMBOL_INC_OP = 335, /* INC_OP */ + YYSYMBOL_DEC_OP = 336, /* DEC_OP */ + YYSYMBOL_LE_OP = 337, /* LE_OP */ + YYSYMBOL_GE_OP = 338, /* GE_OP */ + YYSYMBOL_EQ_OP = 339, /* EQ_OP */ + YYSYMBOL_NE_OP = 340, /* NE_OP */ + YYSYMBOL_AND_OP = 341, /* AND_OP */ + YYSYMBOL_OR_OP = 342, /* OR_OP */ + YYSYMBOL_XOR_OP = 343, /* XOR_OP */ + YYSYMBOL_MUL_ASSIGN = 344, /* MUL_ASSIGN */ + YYSYMBOL_DIV_ASSIGN = 345, /* DIV_ASSIGN */ + YYSYMBOL_ADD_ASSIGN = 346, /* ADD_ASSIGN */ + YYSYMBOL_MOD_ASSIGN = 347, /* MOD_ASSIGN */ + YYSYMBOL_LEFT_ASSIGN = 348, /* LEFT_ASSIGN */ + YYSYMBOL_RIGHT_ASSIGN = 349, /* RIGHT_ASSIGN */ + YYSYMBOL_AND_ASSIGN = 350, /* AND_ASSIGN */ + YYSYMBOL_XOR_ASSIGN = 351, /* XOR_ASSIGN */ + YYSYMBOL_OR_ASSIGN = 352, /* OR_ASSIGN */ + YYSYMBOL_SUB_ASSIGN = 353, /* SUB_ASSIGN */ + YYSYMBOL_STRING_LITERAL = 354, /* STRING_LITERAL */ + YYSYMBOL_LEFT_PAREN = 355, /* LEFT_PAREN */ + YYSYMBOL_RIGHT_PAREN = 356, /* RIGHT_PAREN */ + YYSYMBOL_LEFT_BRACKET = 357, /* LEFT_BRACKET */ + YYSYMBOL_RIGHT_BRACKET = 358, /* RIGHT_BRACKET */ + YYSYMBOL_LEFT_BRACE = 359, /* LEFT_BRACE */ + YYSYMBOL_RIGHT_BRACE = 360, /* RIGHT_BRACE */ + YYSYMBOL_DOT = 361, /* DOT */ + YYSYMBOL_COMMA = 362, /* COMMA */ + YYSYMBOL_COLON = 363, /* COLON */ + YYSYMBOL_EQUAL = 364, /* EQUAL */ + YYSYMBOL_SEMICOLON = 365, /* SEMICOLON */ + YYSYMBOL_BANG = 366, /* BANG */ + YYSYMBOL_DASH = 367, /* DASH */ + YYSYMBOL_TILDE = 368, /* TILDE */ + YYSYMBOL_PLUS = 369, /* PLUS */ + YYSYMBOL_STAR = 370, /* STAR */ + YYSYMBOL_SLASH = 371, /* SLASH */ + YYSYMBOL_PERCENT = 372, /* PERCENT */ + YYSYMBOL_LEFT_ANGLE = 373, /* LEFT_ANGLE */ + YYSYMBOL_RIGHT_ANGLE = 374, /* RIGHT_ANGLE */ + YYSYMBOL_VERTICAL_BAR = 375, /* VERTICAL_BAR */ + YYSYMBOL_CARET = 376, /* CARET */ + YYSYMBOL_AMPERSAND = 377, /* AMPERSAND */ + YYSYMBOL_QUESTION = 378, /* QUESTION */ + YYSYMBOL_INVARIANT = 379, /* INVARIANT */ + YYSYMBOL_HIGH_PRECISION = 380, /* HIGH_PRECISION */ + YYSYMBOL_MEDIUM_PRECISION = 381, /* MEDIUM_PRECISION */ + YYSYMBOL_LOW_PRECISION = 382, /* LOW_PRECISION */ + YYSYMBOL_PRECISION = 383, /* PRECISION */ + YYSYMBOL_PACKED = 384, /* PACKED */ + YYSYMBOL_RESOURCE = 385, /* RESOURCE */ + YYSYMBOL_SUPERP = 386, /* SUPERP */ + YYSYMBOL_FLOATCONSTANT = 387, /* FLOATCONSTANT */ + YYSYMBOL_INTCONSTANT = 388, /* INTCONSTANT */ + YYSYMBOL_UINTCONSTANT = 389, /* UINTCONSTANT */ + YYSYMBOL_BOOLCONSTANT = 390, /* BOOLCONSTANT */ + YYSYMBOL_IDENTIFIER = 391, /* IDENTIFIER */ + YYSYMBOL_TYPE_NAME = 392, /* TYPE_NAME */ + YYSYMBOL_CENTROID = 393, /* CENTROID */ + YYSYMBOL_IN = 394, /* IN */ + YYSYMBOL_OUT = 395, /* OUT */ + YYSYMBOL_INOUT = 396, /* INOUT */ + YYSYMBOL_STRUCT = 397, /* STRUCT */ + YYSYMBOL_VOID = 398, /* VOID */ + YYSYMBOL_WHILE = 399, /* WHILE */ + YYSYMBOL_BREAK = 400, /* BREAK */ + YYSYMBOL_CONTINUE = 401, /* CONTINUE */ + YYSYMBOL_DO = 402, /* DO */ + YYSYMBOL_ELSE = 403, /* ELSE */ + YYSYMBOL_FOR = 404, /* FOR */ + YYSYMBOL_IF = 405, /* IF */ + YYSYMBOL_DISCARD = 406, /* DISCARD */ + YYSYMBOL_RETURN = 407, /* RETURN */ + YYSYMBOL_SWITCH = 408, /* SWITCH */ + YYSYMBOL_CASE = 409, /* CASE */ + YYSYMBOL_DEFAULT = 410, /* DEFAULT */ + YYSYMBOL_TERMINATE_INVOCATION = 411, /* TERMINATE_INVOCATION */ + YYSYMBOL_TERMINATE_RAY = 412, /* TERMINATE_RAY */ + YYSYMBOL_IGNORE_INTERSECTION = 413, /* IGNORE_INTERSECTION */ + YYSYMBOL_UNIFORM = 414, /* UNIFORM */ + YYSYMBOL_SHARED = 415, /* SHARED */ + YYSYMBOL_BUFFER = 416, /* BUFFER */ + YYSYMBOL_TILEIMAGEEXT = 417, /* TILEIMAGEEXT */ + YYSYMBOL_FLAT = 418, /* FLAT */ + YYSYMBOL_SMOOTH = 419, /* SMOOTH */ + YYSYMBOL_LAYOUT = 420, /* LAYOUT */ + YYSYMBOL_DOUBLECONSTANT = 421, /* DOUBLECONSTANT */ + YYSYMBOL_INT16CONSTANT = 422, /* INT16CONSTANT */ + YYSYMBOL_UINT16CONSTANT = 423, /* UINT16CONSTANT */ + YYSYMBOL_FLOAT16CONSTANT = 424, /* FLOAT16CONSTANT */ + YYSYMBOL_INT32CONSTANT = 425, /* INT32CONSTANT */ + YYSYMBOL_UINT32CONSTANT = 426, /* UINT32CONSTANT */ + YYSYMBOL_INT64CONSTANT = 427, /* INT64CONSTANT */ + YYSYMBOL_UINT64CONSTANT = 428, /* UINT64CONSTANT */ + YYSYMBOL_SUBROUTINE = 429, /* SUBROUTINE */ + YYSYMBOL_DEMOTE = 430, /* DEMOTE */ + YYSYMBOL_PAYLOADNV = 431, /* PAYLOADNV */ + YYSYMBOL_PAYLOADINNV = 432, /* PAYLOADINNV */ + YYSYMBOL_HITATTRNV = 433, /* HITATTRNV */ + YYSYMBOL_CALLDATANV = 434, /* CALLDATANV */ + YYSYMBOL_CALLDATAINNV = 435, /* CALLDATAINNV */ + YYSYMBOL_PAYLOADEXT = 436, /* PAYLOADEXT */ + YYSYMBOL_PAYLOADINEXT = 437, /* PAYLOADINEXT */ + YYSYMBOL_HITATTREXT = 438, /* HITATTREXT */ + YYSYMBOL_CALLDATAEXT = 439, /* CALLDATAEXT */ + YYSYMBOL_CALLDATAINEXT = 440, /* CALLDATAINEXT */ + YYSYMBOL_PATCH = 441, /* PATCH */ + YYSYMBOL_SAMPLE = 442, /* SAMPLE */ + YYSYMBOL_NONUNIFORM = 443, /* NONUNIFORM */ + YYSYMBOL_COHERENT = 444, /* COHERENT */ + YYSYMBOL_VOLATILE = 445, /* VOLATILE */ + YYSYMBOL_RESTRICT = 446, /* RESTRICT */ + YYSYMBOL_READONLY = 447, /* READONLY */ + YYSYMBOL_WRITEONLY = 448, /* WRITEONLY */ + YYSYMBOL_DEVICECOHERENT = 449, /* DEVICECOHERENT */ + YYSYMBOL_QUEUEFAMILYCOHERENT = 450, /* QUEUEFAMILYCOHERENT */ + YYSYMBOL_WORKGROUPCOHERENT = 451, /* WORKGROUPCOHERENT */ + YYSYMBOL_SUBGROUPCOHERENT = 452, /* SUBGROUPCOHERENT */ + YYSYMBOL_NONPRIVATE = 453, /* NONPRIVATE */ + YYSYMBOL_SHADERCALLCOHERENT = 454, /* SHADERCALLCOHERENT */ + YYSYMBOL_NOPERSPECTIVE = 455, /* NOPERSPECTIVE */ + YYSYMBOL_EXPLICITINTERPAMD = 456, /* EXPLICITINTERPAMD */ + YYSYMBOL_PERVERTEXEXT = 457, /* PERVERTEXEXT */ + YYSYMBOL_PERVERTEXNV = 458, /* PERVERTEXNV */ + YYSYMBOL_PERPRIMITIVENV = 459, /* PERPRIMITIVENV */ + YYSYMBOL_PERVIEWNV = 460, /* PERVIEWNV */ + YYSYMBOL_PERTASKNV = 461, /* PERTASKNV */ + YYSYMBOL_PERPRIMITIVEEXT = 462, /* PERPRIMITIVEEXT */ + YYSYMBOL_TASKPAYLOADWORKGROUPEXT = 463, /* TASKPAYLOADWORKGROUPEXT */ + YYSYMBOL_PRECISE = 464, /* PRECISE */ + YYSYMBOL_YYACCEPT = 465, /* $accept */ + YYSYMBOL_variable_identifier = 466, /* variable_identifier */ + YYSYMBOL_primary_expression = 467, /* primary_expression */ + YYSYMBOL_postfix_expression = 468, /* postfix_expression */ + YYSYMBOL_integer_expression = 469, /* integer_expression */ + YYSYMBOL_function_call = 470, /* function_call */ + YYSYMBOL_function_call_or_method = 471, /* function_call_or_method */ + YYSYMBOL_function_call_generic = 472, /* function_call_generic */ + YYSYMBOL_function_call_header_no_parameters = 473, /* function_call_header_no_parameters */ + YYSYMBOL_function_call_header_with_parameters = 474, /* function_call_header_with_parameters */ + YYSYMBOL_function_call_header = 475, /* function_call_header */ + YYSYMBOL_function_identifier = 476, /* function_identifier */ + YYSYMBOL_unary_expression = 477, /* unary_expression */ + YYSYMBOL_unary_operator = 478, /* unary_operator */ + YYSYMBOL_multiplicative_expression = 479, /* multiplicative_expression */ + YYSYMBOL_additive_expression = 480, /* additive_expression */ + YYSYMBOL_shift_expression = 481, /* shift_expression */ + YYSYMBOL_relational_expression = 482, /* relational_expression */ + YYSYMBOL_equality_expression = 483, /* equality_expression */ + YYSYMBOL_and_expression = 484, /* and_expression */ + YYSYMBOL_exclusive_or_expression = 485, /* exclusive_or_expression */ + YYSYMBOL_inclusive_or_expression = 486, /* inclusive_or_expression */ + YYSYMBOL_logical_and_expression = 487, /* logical_and_expression */ + YYSYMBOL_logical_xor_expression = 488, /* logical_xor_expression */ + YYSYMBOL_logical_or_expression = 489, /* logical_or_expression */ + YYSYMBOL_conditional_expression = 490, /* conditional_expression */ + YYSYMBOL_491_1 = 491, /* $@1 */ + YYSYMBOL_assignment_expression = 492, /* assignment_expression */ + YYSYMBOL_assignment_operator = 493, /* assignment_operator */ + YYSYMBOL_expression = 494, /* expression */ + YYSYMBOL_constant_expression = 495, /* constant_expression */ + YYSYMBOL_declaration = 496, /* declaration */ + YYSYMBOL_block_structure = 497, /* block_structure */ + YYSYMBOL_498_2 = 498, /* $@2 */ + YYSYMBOL_identifier_list = 499, /* identifier_list */ + YYSYMBOL_function_prototype = 500, /* function_prototype */ + YYSYMBOL_function_declarator = 501, /* function_declarator */ + YYSYMBOL_function_header_with_parameters = 502, /* function_header_with_parameters */ + YYSYMBOL_function_header = 503, /* function_header */ + YYSYMBOL_parameter_declarator = 504, /* parameter_declarator */ + YYSYMBOL_parameter_declaration = 505, /* parameter_declaration */ + YYSYMBOL_parameter_type_specifier = 506, /* parameter_type_specifier */ + YYSYMBOL_init_declarator_list = 507, /* init_declarator_list */ + YYSYMBOL_single_declaration = 508, /* single_declaration */ + YYSYMBOL_fully_specified_type = 509, /* fully_specified_type */ + YYSYMBOL_invariant_qualifier = 510, /* invariant_qualifier */ + YYSYMBOL_interpolation_qualifier = 511, /* interpolation_qualifier */ + YYSYMBOL_layout_qualifier = 512, /* layout_qualifier */ + YYSYMBOL_layout_qualifier_id_list = 513, /* layout_qualifier_id_list */ + YYSYMBOL_layout_qualifier_id = 514, /* layout_qualifier_id */ + YYSYMBOL_precise_qualifier = 515, /* precise_qualifier */ + YYSYMBOL_type_qualifier = 516, /* type_qualifier */ + YYSYMBOL_single_type_qualifier = 517, /* single_type_qualifier */ + YYSYMBOL_storage_qualifier = 518, /* storage_qualifier */ + YYSYMBOL_non_uniform_qualifier = 519, /* non_uniform_qualifier */ + YYSYMBOL_type_name_list = 520, /* type_name_list */ + YYSYMBOL_type_specifier = 521, /* type_specifier */ + YYSYMBOL_array_specifier = 522, /* array_specifier */ + YYSYMBOL_type_parameter_specifier_opt = 523, /* type_parameter_specifier_opt */ + YYSYMBOL_type_parameter_specifier = 524, /* type_parameter_specifier */ + YYSYMBOL_type_parameter_specifier_list = 525, /* type_parameter_specifier_list */ + YYSYMBOL_type_specifier_nonarray = 526, /* type_specifier_nonarray */ + YYSYMBOL_precision_qualifier = 527, /* precision_qualifier */ + YYSYMBOL_struct_specifier = 528, /* struct_specifier */ + YYSYMBOL_529_3 = 529, /* $@3 */ + YYSYMBOL_530_4 = 530, /* $@4 */ + YYSYMBOL_struct_declaration_list = 531, /* struct_declaration_list */ + YYSYMBOL_struct_declaration = 532, /* struct_declaration */ + YYSYMBOL_struct_declarator_list = 533, /* struct_declarator_list */ + YYSYMBOL_struct_declarator = 534, /* struct_declarator */ + YYSYMBOL_initializer = 535, /* initializer */ + YYSYMBOL_initializer_list = 536, /* initializer_list */ + YYSYMBOL_declaration_statement = 537, /* declaration_statement */ + YYSYMBOL_statement = 538, /* statement */ + YYSYMBOL_simple_statement = 539, /* simple_statement */ + YYSYMBOL_demote_statement = 540, /* demote_statement */ + YYSYMBOL_compound_statement = 541, /* compound_statement */ + YYSYMBOL_542_5 = 542, /* $@5 */ + YYSYMBOL_543_6 = 543, /* $@6 */ + YYSYMBOL_statement_no_new_scope = 544, /* statement_no_new_scope */ + YYSYMBOL_statement_scoped = 545, /* statement_scoped */ + YYSYMBOL_546_7 = 546, /* $@7 */ + YYSYMBOL_547_8 = 547, /* $@8 */ + YYSYMBOL_compound_statement_no_new_scope = 548, /* compound_statement_no_new_scope */ + YYSYMBOL_statement_list = 549, /* statement_list */ + YYSYMBOL_expression_statement = 550, /* expression_statement */ + YYSYMBOL_selection_statement = 551, /* selection_statement */ + YYSYMBOL_selection_statement_nonattributed = 552, /* selection_statement_nonattributed */ + YYSYMBOL_selection_rest_statement = 553, /* selection_rest_statement */ + YYSYMBOL_condition = 554, /* condition */ + YYSYMBOL_switch_statement = 555, /* switch_statement */ + YYSYMBOL_switch_statement_nonattributed = 556, /* switch_statement_nonattributed */ + YYSYMBOL_557_9 = 557, /* $@9 */ + YYSYMBOL_switch_statement_list = 558, /* switch_statement_list */ + YYSYMBOL_case_label = 559, /* case_label */ + YYSYMBOL_iteration_statement = 560, /* iteration_statement */ + YYSYMBOL_iteration_statement_nonattributed = 561, /* iteration_statement_nonattributed */ + YYSYMBOL_562_10 = 562, /* $@10 */ + YYSYMBOL_563_11 = 563, /* $@11 */ + YYSYMBOL_564_12 = 564, /* $@12 */ + YYSYMBOL_for_init_statement = 565, /* for_init_statement */ + YYSYMBOL_conditionopt = 566, /* conditionopt */ + YYSYMBOL_for_rest_statement = 567, /* for_rest_statement */ + YYSYMBOL_jump_statement = 568, /* jump_statement */ + YYSYMBOL_translation_unit = 569, /* translation_unit */ + YYSYMBOL_external_declaration = 570, /* external_declaration */ + YYSYMBOL_function_definition = 571, /* function_definition */ + YYSYMBOL_572_13 = 572, /* $@13 */ + YYSYMBOL_attribute = 573, /* attribute */ + YYSYMBOL_attribute_list = 574, /* attribute_list */ + YYSYMBOL_single_attribute = 575, /* single_attribute */ + YYSYMBOL_spirv_requirements_list = 576, /* spirv_requirements_list */ + YYSYMBOL_spirv_requirements_parameter = 577, /* spirv_requirements_parameter */ + YYSYMBOL_spirv_extension_list = 578, /* spirv_extension_list */ + YYSYMBOL_spirv_capability_list = 579, /* spirv_capability_list */ + YYSYMBOL_spirv_execution_mode_qualifier = 580, /* spirv_execution_mode_qualifier */ + YYSYMBOL_spirv_execution_mode_parameter_list = 581, /* spirv_execution_mode_parameter_list */ + YYSYMBOL_spirv_execution_mode_parameter = 582, /* spirv_execution_mode_parameter */ + YYSYMBOL_spirv_execution_mode_id_parameter_list = 583, /* spirv_execution_mode_id_parameter_list */ + YYSYMBOL_spirv_storage_class_qualifier = 584, /* spirv_storage_class_qualifier */ + YYSYMBOL_spirv_decorate_qualifier = 585, /* spirv_decorate_qualifier */ + YYSYMBOL_spirv_decorate_parameter_list = 586, /* spirv_decorate_parameter_list */ + YYSYMBOL_spirv_decorate_parameter = 587, /* spirv_decorate_parameter */ + YYSYMBOL_spirv_decorate_id_parameter_list = 588, /* spirv_decorate_id_parameter_list */ + YYSYMBOL_spirv_decorate_id_parameter = 589, /* spirv_decorate_id_parameter */ + YYSYMBOL_spirv_decorate_string_parameter_list = 590, /* spirv_decorate_string_parameter_list */ + YYSYMBOL_spirv_type_specifier = 591, /* spirv_type_specifier */ + YYSYMBOL_spirv_type_parameter_list = 592, /* spirv_type_parameter_list */ + YYSYMBOL_spirv_type_parameter = 593, /* spirv_type_parameter */ + YYSYMBOL_spirv_instruction_qualifier = 594, /* spirv_instruction_qualifier */ + YYSYMBOL_spirv_instruction_qualifier_list = 595, /* spirv_instruction_qualifier_list */ + YYSYMBOL_spirv_instruction_qualifier_id = 596 /* spirv_instruction_qualifier_id */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; /* Second part of user prologue. */ -#line 136 "MachineIndependent/glslang.y" +#line 111 "MachineIndependent/glslang.y" -/* windows only pragma */ -#ifdef _MSC_VER - #pragma warning(disable : 4065) - #pragma warning(disable : 4127) - #pragma warning(disable : 4244) -#endif - #define parseContext (*pParseContext) #define yyerror(context, msg) context->parserError(msg) extern int yylex(YYSTYPE*, TParseContext&); -#line 732 "MachineIndependent/glslang_tab.cpp" +#line 736 "MachineIndependent/glslang_tab.cpp" #ifdef short @@ -768,6 +772,18 @@ typedef int_least16_t yytype_int16; typedef short yytype_int16; #endif +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ @@ -865,17 +881,23 @@ typedef int yy_state_fast_t; /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) +# define YY_USE(E) ((void) (E)) #else -# define YYUSE(E) /* empty */ +# define YY_USE(E) /* empty */ #endif -#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else @@ -1032,21 +1054,21 @@ union yyalloc #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 442 +#define YYFINAL 452 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 12453 +#define YYLAST 12701 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 455 +#define YYNTOKENS 465 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 131 +#define YYNNTS 132 /* YYNRULES -- Number of rules. */ -#define YYNRULES 684 +#define YYNRULES 700 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 930 +#define YYNSTATES 946 /* YYMAXUTOK -- Last valid token kind. */ -#define YYMAXUTOK 709 +#define YYMAXUTOK 719 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -1130,82 +1152,85 @@ static const yytype_int16 yytranslate[] = 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454 + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464 }; #if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 392, 392, 398, 401, 406, 409, 412, 416, 420, - 423, 427, 431, 435, 439, 443, 447, 453, 461, 464, - 467, 470, 473, 478, 486, 493, 500, 506, 510, 517, - 520, 526, 533, 543, 551, 556, 584, 593, 599, 603, - 607, 627, 628, 629, 630, 636, 637, 642, 647, 656, - 657, 662, 670, 671, 677, 686, 687, 692, 697, 702, - 710, 711, 720, 732, 733, 742, 743, 752, 753, 762, - 763, 771, 772, 780, 781, 789, 790, 790, 808, 809, - 825, 829, 833, 837, 842, 846, 850, 854, 858, 862, - 866, 873, 876, 887, 894, 900, 907, 913, 918, 925, - 929, 933, 937, 942, 947, 956, 956, 967, 971, 978, - 982, 988, 994, 1004, 1007, 1014, 1022, 1042, 1065, 1080, - 1105, 1116, 1126, 1136, 1146, 1155, 1158, 1162, 1166, 1171, - 1179, 1186, 1191, 1196, 1201, 1210, 1220, 1247, 1256, 1263, - 1271, 1278, 1285, 1293, 1303, 1310, 1321, 1327, 1330, 1337, - 1341, 1345, 1354, 1364, 1367, 1378, 1381, 1384, 1388, 1392, - 1397, 1401, 1404, 1409, 1413, 1418, 1427, 1431, 1436, 1442, - 1448, 1455, 1460, 1468, 1474, 1486, 1500, 1506, 1511, 1519, - 1527, 1535, 1543, 1551, 1559, 1567, 1575, 1582, 1589, 1593, - 1598, 1603, 1608, 1613, 1618, 1623, 1627, 1631, 1635, 1639, - 1645, 1656, 1663, 1666, 1675, 1680, 1690, 1695, 1703, 1707, - 1717, 1720, 1726, 1732, 1739, 1749, 1753, 1757, 1761, 1766, - 1770, 1775, 1780, 1785, 1790, 1795, 1800, 1805, 1810, 1815, - 1821, 1827, 1833, 1838, 1843, 1848, 1853, 1858, 1863, 1868, - 1873, 1878, 1883, 1888, 1894, 1901, 1906, 1911, 1916, 1921, - 1926, 1931, 1936, 1941, 1946, 1951, 1956, 1964, 1972, 1980, - 1986, 1992, 1998, 2004, 2010, 2016, 2022, 2028, 2034, 2040, - 2046, 2052, 2058, 2064, 2070, 2076, 2082, 2088, 2094, 2100, - 2106, 2112, 2118, 2124, 2130, 2136, 2142, 2148, 2154, 2160, - 2166, 2172, 2178, 2186, 2194, 2202, 2210, 2218, 2226, 2234, - 2242, 2250, 2258, 2266, 2274, 2280, 2286, 2292, 2298, 2304, - 2310, 2316, 2322, 2328, 2334, 2340, 2346, 2352, 2358, 2364, - 2370, 2376, 2382, 2388, 2394, 2400, 2406, 2412, 2418, 2424, - 2430, 2436, 2442, 2448, 2454, 2460, 2466, 2472, 2478, 2484, - 2490, 2494, 2498, 2502, 2507, 2513, 2518, 2523, 2528, 2533, - 2538, 2543, 2549, 2554, 2559, 2564, 2569, 2574, 2580, 2586, - 2592, 2598, 2604, 2610, 2616, 2622, 2628, 2634, 2640, 2646, - 2652, 2658, 2663, 2668, 2673, 2678, 2683, 2688, 2694, 2699, - 2704, 2709, 2714, 2719, 2724, 2729, 2735, 2740, 2745, 2750, - 2755, 2760, 2765, 2770, 2775, 2780, 2785, 2790, 2795, 2800, - 2805, 2811, 2816, 2821, 2827, 2833, 2838, 2843, 2848, 2854, - 2859, 2864, 2869, 2875, 2880, 2885, 2890, 2896, 2901, 2906, - 2911, 2917, 2923, 2929, 2935, 2940, 2946, 2952, 2958, 2963, - 2968, 2973, 2978, 2983, 2989, 2994, 2999, 3004, 3010, 3015, - 3020, 3025, 3031, 3036, 3041, 3046, 3052, 3057, 3062, 3067, - 3073, 3078, 3083, 3088, 3094, 3099, 3104, 3109, 3115, 3120, - 3125, 3130, 3136, 3141, 3146, 3151, 3157, 3162, 3167, 3172, - 3178, 3183, 3188, 3193, 3199, 3204, 3209, 3214, 3220, 3225, - 3230, 3235, 3241, 3246, 3251, 3256, 3262, 3267, 3272, 3277, - 3283, 3288, 3293, 3298, 3303, 3308, 3313, 3318, 3323, 3328, - 3333, 3338, 3343, 3348, 3353, 3358, 3363, 3368, 3373, 3378, - 3383, 3388, 3393, 3398, 3403, 3409, 3415, 3421, 3427, 3434, - 3441, 3447, 3453, 3459, 3465, 3471, 3477, 3483, 3488, 3493, - 3509, 3514, 3519, 3527, 3527, 3538, 3538, 3548, 3551, 3564, - 3586, 3613, 3617, 3623, 3628, 3639, 3643, 3649, 3655, 3666, - 3669, 3676, 3680, 3681, 3687, 3688, 3689, 3690, 3691, 3692, - 3693, 3695, 3701, 3710, 3711, 3715, 3711, 3727, 3728, 3732, - 3732, 3739, 3739, 3753, 3756, 3764, 3772, 3783, 3784, 3788, - 3792, 3800, 3807, 3811, 3819, 3823, 3836, 3840, 3848, 3848, - 3868, 3871, 3877, 3889, 3901, 3905, 3913, 3913, 3928, 3928, - 3944, 3944, 3965, 3968, 3974, 3977, 3983, 3987, 3994, 3999, - 4004, 4011, 4014, 4018, 4023, 4027, 4037, 4041, 4050, 4053, - 4057, 4066, 4066, 4108, 4113, 4116, 4121, 4124, 4131, 4134, - 4139, 4142, 4147, 4150, 4155, 4158, 4163, 4167, 4172, 4176, - 4181, 4185, 4192, 4195, 4200, 4203, 4206, 4209, 4212, 4217, - 4226, 4237, 4242, 4250, 4254, 4259, 4263, 4268, 4272, 4277, - 4281, 4288, 4291, 4296, 4299, 4302, 4305, 4310, 4318, 4328, - 4332, 4337, 4341, 4346, 4350, 4357, 4360, 4365, 4368, 4373, - 4376, 4382, 4385, 4390, 4393 + 0, 355, 355, 361, 364, 369, 372, 375, 379, 382, + 385, 389, 393, 397, 401, 405, 409, 415, 422, 425, + 428, 431, 434, 439, 447, 454, 461, 467, 471, 478, + 481, 487, 505, 530, 538, 543, 570, 578, 584, 588, + 592, 612, 613, 614, 615, 621, 622, 627, 632, 641, + 642, 647, 655, 656, 662, 671, 672, 677, 682, 687, + 695, 696, 705, 717, 718, 727, 728, 737, 738, 747, + 748, 756, 757, 765, 766, 774, 775, 775, 793, 794, + 810, 814, 818, 822, 827, 831, 835, 839, 843, 847, + 851, 858, 861, 872, 879, 884, 891, 896, 901, 908, + 912, 916, 920, 925, 930, 939, 939, 950, 954, 961, + 966, 974, 982, 994, 997, 1004, 1017, 1040, 1063, 1078, + 1103, 1114, 1124, 1134, 1144, 1153, 1156, 1160, 1164, 1169, + 1177, 1182, 1187, 1192, 1197, 1206, 1216, 1243, 1252, 1259, + 1266, 1273, 1280, 1288, 1296, 1306, 1316, 1323, 1333, 1339, + 1342, 1349, 1353, 1357, 1365, 1374, 1377, 1388, 1391, 1394, + 1398, 1402, 1406, 1410, 1413, 1418, 1422, 1427, 1435, 1439, + 1444, 1450, 1456, 1463, 1468, 1473, 1481, 1486, 1498, 1512, + 1518, 1523, 1531, 1539, 1547, 1555, 1563, 1571, 1579, 1587, + 1595, 1602, 1609, 1613, 1618, 1623, 1628, 1633, 1638, 1643, + 1647, 1651, 1655, 1659, 1665, 1671, 1681, 1688, 1691, 1699, + 1706, 1717, 1722, 1730, 1734, 1744, 1747, 1753, 1759, 1765, + 1773, 1783, 1787, 1791, 1795, 1800, 1804, 1809, 1814, 1819, + 1824, 1829, 1834, 1839, 1844, 1849, 1855, 1861, 1867, 1872, + 1877, 1882, 1887, 1892, 1897, 1902, 1907, 1912, 1917, 1922, + 1927, 1934, 1939, 1944, 1949, 1954, 1959, 1964, 1969, 1974, + 1979, 1984, 1989, 1997, 2005, 2013, 2019, 2025, 2031, 2037, + 2043, 2049, 2055, 2061, 2067, 2073, 2079, 2085, 2091, 2097, + 2103, 2109, 2115, 2121, 2127, 2133, 2139, 2145, 2151, 2157, + 2163, 2169, 2175, 2181, 2187, 2193, 2199, 2205, 2211, 2219, + 2227, 2235, 2243, 2251, 2259, 2267, 2275, 2283, 2291, 2299, + 2307, 2313, 2319, 2325, 2331, 2337, 2343, 2349, 2355, 2361, + 2367, 2373, 2379, 2385, 2391, 2397, 2403, 2409, 2415, 2421, + 2427, 2433, 2439, 2445, 2451, 2457, 2463, 2469, 2475, 2481, + 2487, 2493, 2499, 2505, 2511, 2517, 2523, 2527, 2531, 2535, + 2540, 2545, 2550, 2555, 2560, 2565, 2570, 2575, 2580, 2585, + 2590, 2595, 2600, 2605, 2611, 2617, 2623, 2629, 2635, 2641, + 2647, 2653, 2659, 2665, 2671, 2677, 2683, 2688, 2693, 2698, + 2703, 2708, 2713, 2718, 2723, 2728, 2733, 2738, 2743, 2748, + 2753, 2758, 2763, 2768, 2773, 2778, 2783, 2788, 2793, 2798, + 2803, 2808, 2813, 2818, 2823, 2828, 2833, 2838, 2843, 2848, + 2854, 2860, 2865, 2870, 2875, 2881, 2886, 2891, 2896, 2902, + 2907, 2912, 2917, 2923, 2928, 2933, 2938, 2944, 2950, 2956, + 2962, 2967, 2973, 2979, 2985, 2990, 2995, 3000, 3005, 3010, + 3016, 3021, 3026, 3031, 3037, 3042, 3047, 3052, 3058, 3063, + 3068, 3073, 3079, 3084, 3089, 3094, 3100, 3105, 3110, 3115, + 3121, 3126, 3131, 3136, 3142, 3147, 3152, 3157, 3163, 3168, + 3173, 3178, 3184, 3189, 3194, 3199, 3205, 3210, 3215, 3220, + 3226, 3231, 3236, 3241, 3247, 3252, 3257, 3262, 3268, 3273, + 3278, 3283, 3289, 3294, 3299, 3304, 3310, 3315, 3320, 3325, + 3330, 3335, 3340, 3345, 3350, 3355, 3360, 3365, 3370, 3375, + 3380, 3385, 3390, 3395, 3400, 3405, 3410, 3415, 3420, 3425, + 3430, 3436, 3442, 3448, 3454, 3460, 3466, 3472, 3479, 3486, + 3492, 3498, 3504, 3510, 3517, 3524, 3531, 3538, 3542, 3546, + 3551, 3567, 3572, 3577, 3585, 3585, 3602, 3602, 3612, 3615, + 3628, 3650, 3677, 3681, 3687, 3692, 3703, 3706, 3712, 3718, + 3727, 3730, 3736, 3740, 3741, 3747, 3748, 3749, 3750, 3751, + 3752, 3753, 3754, 3758, 3766, 3767, 3771, 3767, 3783, 3784, + 3788, 3788, 3795, 3795, 3809, 3812, 3820, 3828, 3839, 3840, + 3844, 3847, 3854, 3861, 3865, 3873, 3877, 3890, 3893, 3900, + 3900, 3920, 3923, 3929, 3941, 3953, 3956, 3964, 3964, 3979, + 3979, 3997, 3997, 4018, 4021, 4027, 4030, 4036, 4040, 4047, + 4052, 4057, 4064, 4067, 4071, 4075, 4079, 4088, 4092, 4101, + 4104, 4107, 4115, 4115, 4157, 4162, 4165, 4170, 4173, 4178, + 4181, 4186, 4189, 4194, 4197, 4202, 4205, 4210, 4214, 4219, + 4223, 4228, 4232, 4239, 4242, 4247, 4250, 4253, 4256, 4259, + 4264, 4273, 4284, 4289, 4297, 4301, 4306, 4310, 4315, 4319, + 4324, 4328, 4335, 4338, 4343, 4346, 4349, 4352, 4357, 4360, + 4365, 4371, 4374, 4377, 4380, 4385, 4389, 4394, 4398, 4403, + 4407, 4414, 4417, 4422, 4425, 4430, 4433, 4439, 4442, 4447, + 4450 }; #endif @@ -1250,16 +1275,17 @@ static const char *const yytname[] = "F32MAT4X2", "F32MAT4X3", "F32MAT4X4", "F64MAT2X2", "F64MAT2X3", "F64MAT2X4", "F64MAT3X2", "F64MAT3X3", "F64MAT3X4", "F64MAT4X2", "F64MAT4X3", "F64MAT4X4", "ATOMIC_UINT", "ACCSTRUCTNV", "ACCSTRUCTEXT", - "RAYQUERYEXT", "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV", - "SAMPLERCUBEARRAY", "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY", - "USAMPLERCUBEARRAY", "SAMPLER1D", "SAMPLER1DARRAY", - "SAMPLER1DARRAYSHADOW", "ISAMPLER1D", "SAMPLER1DSHADOW", "SAMPLER2DRECT", - "SAMPLER2DRECTSHADOW", "ISAMPLER2DRECT", "USAMPLER2DRECT", - "SAMPLERBUFFER", "ISAMPLERBUFFER", "USAMPLERBUFFER", "SAMPLER2DMS", - "ISAMPLER2DMS", "USAMPLER2DMS", "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", - "USAMPLER2DMSARRAY", "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT", - "ISAMPLER1DARRAY", "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D", - "F16SAMPLER2D", "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE", + "RAYQUERYEXT", "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV", "COOPMAT", + "HITOBJECTNV", "HITOBJECTATTRNV", "SAMPLERCUBEARRAY", + "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY", "USAMPLERCUBEARRAY", + "SAMPLER1D", "SAMPLER1DARRAY", "SAMPLER1DARRAYSHADOW", "ISAMPLER1D", + "SAMPLER1DSHADOW", "SAMPLER2DRECT", "SAMPLER2DRECTSHADOW", + "ISAMPLER2DRECT", "USAMPLER2DRECT", "SAMPLERBUFFER", "ISAMPLERBUFFER", + "USAMPLERBUFFER", "SAMPLER2DMS", "ISAMPLER2DMS", "USAMPLER2DMS", + "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", "USAMPLER2DMSARRAY", + "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT", "ISAMPLER1DARRAY", + "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D", "F16SAMPLER2D", + "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE", "F16SAMPLER1DARRAY", "F16SAMPLER2DARRAY", "F16SAMPLERCUBEARRAY", "F16SAMPLERBUFFER", "F16SAMPLER2DMS", "F16SAMPLER2DMSARRAY", "F16SAMPLER1DSHADOW", "F16SAMPLER2DSHADOW", "F16SAMPLER1DARRAYSHADOW", @@ -1295,32 +1321,34 @@ static const char *const yytname[] = "F16SUBPASSINPUTMS", "SPIRV_INSTRUCTION", "SPIRV_EXECUTION_MODE", "SPIRV_EXECUTION_MODE_ID", "SPIRV_DECORATE", "SPIRV_DECORATE_ID", "SPIRV_DECORATE_STRING", "SPIRV_TYPE", "SPIRV_STORAGE_CLASS", - "SPIRV_BY_REFERENCE", "SPIRV_LITERAL", "LEFT_OP", "RIGHT_OP", "INC_OP", - "DEC_OP", "LE_OP", "GE_OP", "EQ_OP", "NE_OP", "AND_OP", "OR_OP", - "XOR_OP", "MUL_ASSIGN", "DIV_ASSIGN", "ADD_ASSIGN", "MOD_ASSIGN", - "LEFT_ASSIGN", "RIGHT_ASSIGN", "AND_ASSIGN", "XOR_ASSIGN", "OR_ASSIGN", - "SUB_ASSIGN", "STRING_LITERAL", "LEFT_PAREN", "RIGHT_PAREN", - "LEFT_BRACKET", "RIGHT_BRACKET", "LEFT_BRACE", "RIGHT_BRACE", "DOT", - "COMMA", "COLON", "EQUAL", "SEMICOLON", "BANG", "DASH", "TILDE", "PLUS", - "STAR", "SLASH", "PERCENT", "LEFT_ANGLE", "RIGHT_ANGLE", "VERTICAL_BAR", - "CARET", "AMPERSAND", "QUESTION", "INVARIANT", "HIGH_PRECISION", - "MEDIUM_PRECISION", "LOW_PRECISION", "PRECISION", "PACKED", "RESOURCE", - "SUPERP", "FLOATCONSTANT", "INTCONSTANT", "UINTCONSTANT", "BOOLCONSTANT", + "SPIRV_BY_REFERENCE", "SPIRV_LITERAL", "ATTACHMENTEXT", "IATTACHMENTEXT", + "UATTACHMENTEXT", "LEFT_OP", "RIGHT_OP", "INC_OP", "DEC_OP", "LE_OP", + "GE_OP", "EQ_OP", "NE_OP", "AND_OP", "OR_OP", "XOR_OP", "MUL_ASSIGN", + "DIV_ASSIGN", "ADD_ASSIGN", "MOD_ASSIGN", "LEFT_ASSIGN", "RIGHT_ASSIGN", + "AND_ASSIGN", "XOR_ASSIGN", "OR_ASSIGN", "SUB_ASSIGN", "STRING_LITERAL", + "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACKET", "RIGHT_BRACKET", + "LEFT_BRACE", "RIGHT_BRACE", "DOT", "COMMA", "COLON", "EQUAL", + "SEMICOLON", "BANG", "DASH", "TILDE", "PLUS", "STAR", "SLASH", "PERCENT", + "LEFT_ANGLE", "RIGHT_ANGLE", "VERTICAL_BAR", "CARET", "AMPERSAND", + "QUESTION", "INVARIANT", "HIGH_PRECISION", "MEDIUM_PRECISION", + "LOW_PRECISION", "PRECISION", "PACKED", "RESOURCE", "SUPERP", + "FLOATCONSTANT", "INTCONSTANT", "UINTCONSTANT", "BOOLCONSTANT", "IDENTIFIER", "TYPE_NAME", "CENTROID", "IN", "OUT", "INOUT", "STRUCT", "VOID", "WHILE", "BREAK", "CONTINUE", "DO", "ELSE", "FOR", "IF", "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "TERMINATE_INVOCATION", "TERMINATE_RAY", "IGNORE_INTERSECTION", "UNIFORM", "SHARED", "BUFFER", - "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", "INT16CONSTANT", - "UINT16CONSTANT", "FLOAT16CONSTANT", "INT32CONSTANT", "UINT32CONSTANT", - "INT64CONSTANT", "UINT64CONSTANT", "SUBROUTINE", "DEMOTE", "PAYLOADNV", - "PAYLOADINNV", "HITATTRNV", "CALLDATANV", "CALLDATAINNV", "PAYLOADEXT", - "PAYLOADINEXT", "HITATTREXT", "CALLDATAEXT", "CALLDATAINEXT", "PATCH", - "SAMPLE", "NONUNIFORM", "COHERENT", "VOLATILE", "RESTRICT", "READONLY", - "WRITEONLY", "DEVICECOHERENT", "QUEUEFAMILYCOHERENT", - "WORKGROUPCOHERENT", "SUBGROUPCOHERENT", "NONPRIVATE", - "SHADERCALLCOHERENT", "NOPERSPECTIVE", "EXPLICITINTERPAMD", - "PERVERTEXNV", "PERPRIMITIVENV", "PERVIEWNV", "PERTASKNV", "PRECISE", - "$accept", "variable_identifier", "primary_expression", + "TILEIMAGEEXT", "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", + "INT16CONSTANT", "UINT16CONSTANT", "FLOAT16CONSTANT", "INT32CONSTANT", + "UINT32CONSTANT", "INT64CONSTANT", "UINT64CONSTANT", "SUBROUTINE", + "DEMOTE", "PAYLOADNV", "PAYLOADINNV", "HITATTRNV", "CALLDATANV", + "CALLDATAINNV", "PAYLOADEXT", "PAYLOADINEXT", "HITATTREXT", + "CALLDATAEXT", "CALLDATAINEXT", "PATCH", "SAMPLE", "NONUNIFORM", + "COHERENT", "VOLATILE", "RESTRICT", "READONLY", "WRITEONLY", + "DEVICECOHERENT", "QUEUEFAMILYCOHERENT", "WORKGROUPCOHERENT", + "SUBGROUPCOHERENT", "NONPRIVATE", "SHADERCALLCOHERENT", "NOPERSPECTIVE", + "EXPLICITINTERPAMD", "PERVERTEXEXT", "PERVERTEXNV", "PERPRIMITIVENV", + "PERVIEWNV", "PERTASKNV", "PERPRIMITIVEEXT", "TASKPAYLOADWORKGROUPEXT", + "PRECISE", "$accept", "variable_identifier", "primary_expression", "postfix_expression", "integer_expression", "function_call", "function_call_or_method", "function_call_generic", "function_call_header_no_parameters", @@ -1365,7 +1393,7 @@ static const char *const yytname[] = "spirv_execution_mode_id_parameter_list", "spirv_storage_class_qualifier", "spirv_decorate_qualifier", "spirv_decorate_parameter_list", "spirv_decorate_parameter", - "spirv_decorate_id_parameter_list", + "spirv_decorate_id_parameter_list", "spirv_decorate_id_parameter", "spirv_decorate_string_parameter_list", "spirv_type_specifier", "spirv_type_parameter_list", "spirv_type_parameter", "spirv_instruction_qualifier", "spirv_instruction_qualifier_list", @@ -1379,2385 +1407,364 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, - 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, - 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, - 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, - 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, - 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, - 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, - 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709 -}; -#endif - -#define YYPACT_NINF (-863) +#define YYPACT_NINF (-872) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-570) +#define YYTABLE_NINF (-695) #define yytable_value_is_error(Yyn) \ 0 - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ static const yytype_int16 yypact[] = { - 4549, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -260, -182, -177, -163, -130, - -115, -100, -89, -863, -863, -196, -863, -863, -863, -863, - -863, -324, -863, -863, -863, -863, -863, -306, -863, -863, - -863, -863, -863, -863, -77, -66, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -332, -175, - -153, -161, 7713, -266, -863, -71, -863, -863, -863, -863, - 5453, -863, -863, -863, -863, -116, -863, -863, 933, -863, - -863, 7713, -35, -863, -863, -863, 5905, -54, -139, -138, - -137, -128, -124, -54, -123, -51, 12061, -863, -15, -347, - -44, -863, -295, -863, -9, -6, 7713, -863, -863, -863, - 7713, -39, -38, -863, -303, -863, -226, -863, -863, 10762, - -3, -863, -863, -863, 1, -32, 7713, -863, -5, -8, - -1, -863, -230, -863, -219, -2, 3, 4, 5, -215, - 6, 8, 10, 11, 12, 15, -214, 13, 16, 21, - -134, -863, 17, 7713, -863, 19, -863, -212, -863, -863, - -211, 9030, -863, -273, 1385, -863, -863, -863, -863, -863, - -3, -263, -863, 9463, -236, -863, -28, -863, -106, 10762, - 10762, -863, 10762, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -264, -863, -863, -863, 23, -203, 11195, 25, - -863, 10762, -863, -863, -311, 24, -6, 29, -863, -309, - -54, -863, -20, -863, -323, 28, -118, 10762, -112, -863, - -155, -111, 10762, -103, 35, -98, -54, -863, 11628, -863, - -94, 10762, 32, -51, -863, 7713, 18, 6357, -863, 7713, - 10762, -863, -347, -863, 33, -863, -863, -72, -254, -86, - -297, -68, -13, 26, 20, 50, 49, -300, 42, 9896, - -863, 43, -863, -863, 55, 58, 60, -863, 65, 71, - 62, 10329, 73, 10762, 66, 69, 70, 72, 74, -241, - -863, -863, -41, -863, -175, 83, 85, -863, -863, -863, - -863, -863, 1837, -863, -863, -863, -863, -863, -863, -863, - -863, -863, 5001, 24, 9463, -233, 8164, -863, -863, 9463, - 7713, -863, 51, -863, -863, -863, -194, -863, -863, 10762, - 52, -863, -863, 10762, 88, -863, -863, -863, 10762, -863, - -863, -863, -315, -863, -863, -191, 82, -863, -863, -863, - -863, -863, -863, -190, -863, -187, -863, -863, -186, 86, - -863, -863, -863, -863, -169, -863, -168, -863, -167, 89, - -863, -165, 91, -157, 82, -863, 85, -156, -863, 94, - 98, -863, -863, 18, -3, -40, -863, -863, -863, 6809, - -863, -863, -863, 10762, 10762, 10762, 10762, 10762, 10762, 10762, - 10762, 10762, 10762, 10762, 10762, 10762, 10762, 10762, 10762, 10762, - 10762, 10762, -863, -863, -863, 97, -863, 2289, -863, -863, - -863, 2289, -863, 10762, -863, -863, -34, 10762, -79, -863, - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, 10762, 10762, -863, -863, -863, - -863, -863, -863, -863, 9463, -863, -863, -208, -863, 7261, - -863, -863, 99, 96, -863, -863, -863, -863, -863, -132, - -131, -863, -307, -863, -323, -863, -323, -863, 10762, 10762, - -863, -155, -863, -155, -863, 10762, 10762, -863, 93, 35, - -863, 11628, -863, 10762, -863, -863, -33, 24, 18, -863, - -863, -863, -863, -863, -72, -72, -254, -254, -86, -86, - -86, -86, -297, -297, -68, -13, 26, 20, 50, 49, - 10762, -863, 2289, 4097, 57, 3645, -154, -863, -152, -863, - -863, -863, -863, -863, 8597, -863, -863, -863, 105, -863, - 75, -863, -145, -863, -144, -863, -143, -863, -142, -863, - -141, -140, -863, -863, -863, -27, 100, 96, 76, 106, - 109, -863, -863, 4097, 107, -863, -863, -863, -863, -863, - -863, -863, -863, -863, -863, -863, 10762, -863, 101, 2741, - 10762, -863, 103, 113, 67, 112, 3193, -863, 114, -863, - 9463, -863, -863, -863, -133, 10762, 2741, 107, -863, -863, - 2289, -863, 110, 96, -863, -863, 2289, 116, -863, -863 + 4648, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -305, -301, + -289, -276, -246, -238, -227, -182, -872, -872, -872, -872, + -872, -168, -872, -872, -872, -872, -872, -55, -872, -872, + -872, -872, -872, -319, -872, -872, -872, -872, -872, -872, + -872, -135, -120, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -327, -114, + -81, -124, 7882, -313, -872, -101, -872, -872, -872, -872, + 5572, -872, -872, -872, -872, -94, -872, -872, 952, -872, + -872, 7882, -73, -872, -872, -872, 6034, -78, -252, -250, + -216, -197, -136, -78, -127, -49, 12303, -872, -13, -346, + -39, -872, -309, -872, -10, -9, 7882, -872, -872, -872, + 7882, -38, -37, -872, -267, -872, -236, -872, -872, 10983, + -2, -872, -872, -872, 3, -35, 7882, -872, -8, -6, + -1, -872, -256, -872, -255, -4, 4, 7, 8, -237, + 10, 11, 13, 14, 15, 18, -232, 9, 19, 27, + -188, -872, -3, 7882, -872, 20, -872, -229, -872, -872, + -219, 9223, -872, -272, 1414, -872, -872, -872, -872, -872, + -2, -277, -872, 9663, -265, -872, -23, -872, -112, 10983, + 10983, -872, 10983, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -253, -872, -872, -872, 29, -204, 11423, 28, + -872, 10983, -872, 31, -321, 17, -9, 32, -872, -325, + -78, -872, 5, -872, -330, 33, -125, 10983, -123, -872, + -130, -119, -146, -118, 34, -103, -78, -872, 11863, -872, + -74, 10983, 36, -49, -872, 7882, 24, 6496, -872, 7882, + 10983, -872, -346, -872, 30, -872, -872, -33, -133, -105, + -303, -11, -14, 21, 23, 48, 52, -316, 41, -872, + 10103, -872, 42, -872, -872, 46, 38, 40, -872, 64, + 67, 60, 10543, 74, 10983, 68, 65, 69, 70, 73, + -167, -872, -872, -47, -872, -114, 77, 31, -872, -872, + -872, -872, -872, 1876, -872, -872, -872, -872, -872, -872, + -872, -872, -872, 5110, 17, 9663, -261, 8343, -872, -872, + 9663, 7882, -872, 50, -872, -872, -872, -203, -872, -872, + 10983, 51, -872, -872, 10983, 87, -872, -872, -872, 10983, + -872, -872, -872, -312, -872, -872, -200, 80, -872, -872, + -872, -872, -872, -872, -199, -872, -196, -872, -872, -195, + 71, -872, -872, -872, -872, -169, -872, -164, -872, -872, + -872, -872, -872, -161, -872, 83, -872, -160, 84, -153, + 80, -872, -278, -152, -872, 91, 94, -872, -872, 24, + -2, -43, -872, -872, -872, 6958, -872, -872, -872, 10983, + 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, + 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, -872, -872, + -872, 93, -872, 2338, -872, -872, -872, 2338, -872, 10983, + -872, -872, -42, 10983, -32, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, 10983, 10983, -872, -872, -872, -872, -872, -872, -872, + 9663, -872, -872, -76, -872, 7420, -872, -872, 96, 95, + -872, -872, -872, -872, -872, -132, -131, -872, -311, -872, + -330, -872, -330, -872, 10983, 10983, -872, -130, -872, -130, + -872, -146, -146, -872, 101, 34, -872, 11863, -872, 10983, + -872, -872, -41, 17, 24, -872, -872, -872, -872, -872, + -33, -33, -133, -133, -105, -105, -105, -105, -303, -303, + -11, -14, 21, 23, 48, 52, 10983, -872, 2338, 4186, + 59, 3724, -151, -872, -150, -872, -872, -872, -872, -872, + 8783, -872, -872, -872, 105, -872, 72, -872, -149, -872, + -148, -872, -141, -872, -140, -872, -139, -138, -872, -872, + -872, -28, 102, 95, 75, 107, 106, -872, -872, 4186, + 108, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, 10983, -872, 100, 2800, 10983, -872, 104, 109, + 76, 112, 3262, -872, 113, -872, 9663, -872, -872, -872, + -137, 10983, 2800, 108, -872, -872, 2338, -872, 110, 95, + -872, -872, 2338, 114, -872, -872 }; - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ static const yytype_int16 yydefact[] = { - 0, 166, 219, 217, 218, 216, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 220, 221, 222, 232, 233, - 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 345, 346, 347, 348, 349, 350, 351, 371, 372, 373, - 374, 375, 376, 377, 386, 399, 400, 387, 388, 390, - 389, 391, 392, 393, 394, 395, 396, 397, 398, 174, - 175, 245, 246, 244, 247, 254, 255, 252, 253, 250, - 251, 248, 249, 277, 278, 279, 289, 290, 291, 274, - 275, 276, 286, 287, 288, 271, 272, 273, 283, 284, - 285, 268, 269, 270, 280, 281, 282, 256, 257, 258, - 292, 293, 294, 259, 260, 261, 304, 305, 306, 262, - 263, 264, 316, 317, 318, 265, 266, 267, 328, 329, - 330, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 343, 340, 341, - 342, 524, 525, 526, 355, 356, 379, 382, 344, 353, - 354, 370, 352, 401, 402, 405, 406, 407, 409, 410, - 411, 413, 414, 415, 417, 418, 514, 515, 378, 380, - 381, 357, 358, 359, 403, 360, 364, 365, 368, 408, - 412, 416, 361, 362, 366, 367, 404, 363, 369, 448, - 450, 451, 452, 454, 455, 456, 458, 459, 460, 462, - 463, 464, 466, 467, 468, 470, 471, 472, 474, 475, - 476, 478, 479, 480, 482, 483, 484, 486, 487, 488, - 490, 491, 449, 453, 457, 461, 465, 473, 477, 481, - 469, 485, 489, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 511, 512, 513, 383, 384, 385, 419, 428, - 430, 424, 429, 431, 432, 434, 435, 436, 438, 439, - 440, 442, 443, 444, 446, 447, 420, 421, 422, 433, - 423, 425, 426, 427, 437, 441, 445, 516, 517, 520, - 521, 522, 523, 518, 519, 0, 0, 0, 0, 0, - 0, 0, 0, 164, 165, 0, 620, 137, 530, 531, - 532, 0, 529, 170, 168, 169, 167, 0, 215, 171, - 172, 173, 139, 138, 0, 199, 180, 182, 178, 184, - 186, 181, 183, 179, 185, 187, 176, 177, 201, 188, - 195, 196, 197, 198, 189, 190, 191, 192, 193, 194, - 140, 141, 142, 143, 144, 145, 152, 619, 0, 621, - 0, 114, 113, 0, 125, 130, 159, 158, 156, 160, - 0, 153, 155, 161, 135, 211, 157, 528, 0, 616, - 618, 0, 0, 162, 163, 527, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 535, 0, 0, + 0, 168, 225, 223, 224, 222, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 226, 227, 228, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 351, 352, 353, 354, 355, 356, 357, 377, 378, 379, + 380, 381, 382, 383, 392, 405, 406, 393, 394, 396, + 395, 397, 398, 399, 400, 401, 402, 403, 404, 177, + 178, 251, 252, 250, 253, 260, 261, 258, 259, 256, + 257, 254, 255, 283, 284, 285, 295, 296, 297, 280, + 281, 282, 292, 293, 294, 277, 278, 279, 289, 290, + 291, 274, 275, 276, 286, 287, 288, 262, 263, 264, + 298, 299, 300, 265, 266, 267, 310, 311, 312, 268, + 269, 270, 322, 323, 324, 271, 272, 273, 334, 335, + 336, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 349, 346, 347, + 348, 533, 534, 535, 536, 538, 182, 361, 362, 385, + 388, 350, 359, 360, 376, 358, 407, 408, 411, 412, + 413, 415, 416, 417, 419, 420, 421, 423, 424, 520, + 521, 384, 386, 387, 363, 364, 365, 409, 366, 370, + 371, 374, 414, 418, 422, 367, 368, 372, 373, 410, + 369, 375, 454, 456, 457, 458, 460, 461, 462, 464, + 465, 466, 468, 469, 470, 472, 473, 474, 476, 477, + 478, 480, 481, 482, 484, 485, 486, 488, 489, 490, + 492, 493, 494, 496, 497, 455, 459, 463, 467, 471, + 479, 483, 487, 475, 491, 495, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 389, 390, + 391, 425, 434, 436, 430, 435, 437, 438, 440, 441, + 442, 444, 445, 446, 448, 449, 450, 452, 453, 426, + 427, 428, 439, 429, 431, 432, 433, 443, 447, 451, + 525, 526, 529, 530, 531, 532, 527, 528, 0, 0, + 0, 0, 0, 0, 0, 0, 166, 167, 522, 523, + 524, 0, 631, 137, 541, 542, 543, 0, 540, 172, + 170, 171, 169, 0, 221, 173, 175, 176, 174, 139, + 138, 0, 203, 184, 186, 181, 188, 190, 185, 187, + 183, 189, 191, 179, 180, 206, 192, 199, 200, 201, + 202, 193, 194, 195, 196, 197, 198, 140, 141, 143, + 142, 144, 146, 147, 145, 205, 154, 630, 0, 632, + 0, 114, 113, 0, 125, 130, 161, 160, 158, 162, + 0, 155, 157, 163, 135, 216, 159, 539, 0, 627, + 629, 0, 0, 164, 165, 537, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 546, 0, 0, 0, 99, 0, 94, 0, 109, 0, 121, 115, 123, - 0, 124, 0, 97, 131, 102, 0, 154, 136, 0, - 204, 210, 1, 617, 0, 0, 0, 96, 0, 0, - 0, 628, 0, 681, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, - 0, 624, 0, 0, 533, 149, 151, 0, 147, 202, - 0, 0, 100, 0, 0, 622, 110, 116, 120, 122, + 0, 124, 0, 97, 131, 102, 0, 156, 136, 0, + 209, 215, 1, 628, 0, 0, 0, 96, 0, 0, + 0, 639, 0, 697, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, + 0, 635, 0, 0, 544, 151, 153, 0, 149, 207, + 0, 0, 100, 0, 0, 633, 110, 116, 120, 122, 118, 126, 117, 0, 132, 105, 0, 103, 0, 0, 0, 9, 0, 43, 42, 44, 41, 5, 6, 7, 8, 2, 16, 14, 15, 17, 10, 11, 12, 13, 3, 18, 37, 20, 25, 26, 0, 0, 30, 0, - 213, 0, 36, 34, 0, 205, 111, 0, 95, 0, - 0, 679, 0, 636, 0, 0, 0, 0, 0, 653, - 0, 0, 0, 0, 0, 0, 0, 673, 0, 651, - 0, 0, 0, 0, 98, 0, 0, 0, 537, 0, - 0, 146, 0, 200, 0, 206, 45, 49, 52, 55, - 60, 63, 65, 67, 69, 71, 73, 75, 0, 0, - 101, 564, 573, 577, 0, 0, 0, 598, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 78, 91, 0, 551, 0, 161, 135, 554, 575, 553, - 561, 552, 0, 555, 556, 579, 557, 586, 558, 559, - 594, 560, 0, 119, 0, 127, 0, 545, 134, 0, - 0, 107, 0, 104, 38, 39, 0, 22, 23, 0, - 0, 28, 27, 0, 215, 31, 33, 40, 0, 212, - 112, 683, 0, 684, 629, 0, 0, 682, 648, 644, - 645, 646, 647, 0, 642, 0, 93, 649, 0, 0, - 663, 664, 665, 666, 0, 661, 0, 667, 0, 0, - 669, 0, 0, 0, 2, 677, 678, 0, 675, 0, - 0, 623, 625, 0, 543, 0, 541, 536, 538, 0, - 150, 148, 203, 0, 0, 0, 0, 0, 0, 0, + 219, 0, 36, 218, 0, 210, 111, 0, 95, 0, + 0, 695, 0, 647, 0, 0, 0, 0, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 689, 0, 662, + 0, 0, 0, 0, 98, 0, 0, 0, 548, 0, + 0, 148, 0, 204, 0, 211, 45, 49, 52, 55, + 60, 63, 65, 67, 69, 71, 73, 75, 0, 34, + 0, 101, 575, 584, 588, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 76, 207, 208, 0, 563, 0, 596, 609, - 608, 0, 600, 0, 612, 610, 0, 0, 0, 593, - 613, 614, 615, 562, 81, 82, 84, 83, 86, 87, - 88, 89, 90, 85, 80, 0, 0, 578, 574, 576, - 580, 587, 595, 129, 0, 548, 549, 0, 133, 0, - 108, 4, 0, 24, 21, 32, 214, 632, 634, 0, - 0, 680, 0, 638, 0, 637, 0, 640, 0, 0, - 655, 0, 654, 0, 657, 0, 0, 659, 0, 0, - 674, 0, 671, 0, 652, 627, 0, 544, 0, 539, - 534, 46, 47, 48, 51, 50, 53, 54, 58, 59, - 56, 57, 61, 62, 64, 66, 68, 70, 72, 74, - 0, 209, 565, 0, 0, 0, 0, 611, 0, 592, - 79, 92, 128, 546, 0, 106, 19, 630, 0, 631, - 0, 643, 0, 650, 0, 662, 0, 668, 0, 670, - 0, 0, 676, 540, 542, 0, 0, 584, 0, 0, - 0, 603, 602, 605, 571, 588, 547, 550, 633, 635, - 639, 641, 656, 658, 660, 672, 0, 566, 0, 0, - 0, 604, 0, 0, 583, 0, 0, 581, 0, 77, - 0, 568, 597, 567, 0, 606, 0, 571, 570, 572, - 590, 585, 0, 607, 601, 582, 591, 0, 599, 589 + 45, 78, 91, 0, 562, 0, 163, 135, 565, 586, + 564, 572, 563, 0, 566, 567, 590, 568, 597, 569, + 570, 605, 571, 0, 119, 0, 127, 0, 556, 134, + 0, 0, 107, 0, 104, 38, 39, 0, 22, 23, + 0, 0, 28, 27, 0, 221, 31, 33, 40, 0, + 217, 112, 699, 0, 700, 640, 0, 0, 698, 659, + 655, 656, 657, 658, 0, 653, 0, 93, 660, 0, + 0, 674, 675, 676, 677, 0, 672, 0, 681, 682, + 683, 684, 680, 0, 678, 0, 685, 0, 0, 0, + 2, 693, 216, 0, 691, 0, 0, 634, 636, 0, + 554, 0, 552, 547, 549, 0, 152, 150, 208, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 76, 212, + 213, 0, 574, 0, 607, 620, 619, 0, 611, 0, + 623, 621, 0, 0, 0, 604, 624, 625, 626, 573, + 81, 82, 84, 83, 86, 87, 88, 89, 90, 85, + 80, 0, 0, 589, 585, 587, 591, 598, 606, 129, + 0, 559, 560, 0, 133, 0, 108, 4, 0, 24, + 21, 32, 220, 643, 645, 0, 0, 696, 0, 649, + 0, 648, 0, 651, 0, 0, 666, 0, 665, 0, + 668, 0, 0, 670, 0, 0, 690, 0, 687, 0, + 663, 638, 0, 555, 0, 550, 545, 46, 47, 48, + 51, 50, 53, 54, 58, 59, 56, 57, 61, 62, + 64, 66, 68, 70, 72, 74, 0, 214, 576, 0, + 0, 0, 0, 622, 0, 603, 79, 92, 128, 557, + 0, 106, 19, 641, 0, 642, 0, 654, 0, 661, + 0, 673, 0, 679, 0, 686, 0, 0, 692, 551, + 553, 0, 0, 595, 0, 0, 0, 614, 613, 616, + 582, 599, 558, 561, 644, 646, 650, 652, 667, 669, + 671, 688, 0, 577, 0, 0, 0, 615, 0, 0, + 594, 0, 0, 592, 0, 77, 0, 579, 608, 578, + 0, 617, 0, 582, 581, 583, 601, 596, 0, 618, + 612, 593, 602, 0, 610, 600 }; - /* YYPGOTO[NTERM-NUM]. */ +/* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -863, -863, -863, -863, -863, -863, -863, -863, -863, -863, - -863, -863, -418, -863, -380, -379, -484, -382, -258, -256, - -253, -257, -252, -255, -863, -478, -863, -485, -863, -491, - -530, 14, -863, -863, -863, 7, -397, -863, -863, 44, - 53, 47, -863, -863, -400, -863, -863, -863, -863, -92, - -863, -377, -362, -863, 9, -863, 0, -414, -863, -863, - -863, -863, 150, -863, -863, -863, -546, -548, -218, -331, - -624, -863, -359, -609, -862, -863, -417, -863, -863, -427, - -426, -863, -863, 68, -719, -355, -863, -136, -863, -389, - -863, -135, -863, -863, -863, -863, -129, -863, -863, -863, - -863, -863, -863, -863, -863, 102, -863, -863, 2, -863, - -65, -234, -432, -863, -863, -863, -301, -293, -294, -863, - -863, -304, -299, -302, -298, -863, -296, -305, -863, -383, - -526 + -872, -544, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -436, -872, -392, -391, -490, -390, -269, -266, + -268, -264, -262, -260, -872, -482, -872, -499, -872, -492, + -534, 6, -872, -872, -872, 1, -403, -872, -872, 45, + 44, 49, -872, -872, -406, -872, -872, -872, -872, -104, + -872, -389, -375, -872, 12, -872, 0, -433, -872, -872, + -872, -553, 145, -872, -872, -872, -560, -556, -233, -344, + -614, -872, -373, -626, -871, -872, -430, -872, -872, -440, + -437, -872, -872, 63, -737, -363, -872, -144, -872, -399, + -872, -142, -872, -872, -872, -872, -134, -872, -872, -872, + -872, -872, -872, -872, -872, 97, -872, -872, 2, -872, + -71, -308, -416, -872, -872, -872, -304, -307, -302, -872, + -872, -315, -310, -306, -300, -314, -872, -299, -317, -872, + -395, -538 }; - /* YYDEFGOTO[NTERM-NUM]. */ +/* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 520, 521, 522, 782, 523, 524, 525, 526, 527, - 528, 529, 609, 531, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 610, 840, 611, 765, 612, - 695, 613, 378, 640, 498, 614, 380, 381, 382, 427, - 428, 429, 383, 384, 385, 386, 387, 388, 477, 478, - 389, 390, 391, 392, 532, 480, 533, 483, 440, 441, - 534, 395, 396, 397, 569, 473, 567, 568, 705, 706, - 638, 777, 617, 618, 619, 620, 621, 737, 876, 912, - 904, 905, 906, 913, 622, 623, 624, 625, 907, 879, - 626, 627, 908, 927, 628, 629, 630, 843, 741, 845, - 883, 902, 903, 631, 398, 399, 400, 424, 632, 470, - 471, 450, 451, 789, 790, 402, 673, 674, 678, 403, - 404, 684, 685, 688, 691, 405, 697, 698, 406, 452, - 453 + 0, 530, 531, 532, 798, 533, 534, 535, 536, 537, + 538, 539, 620, 541, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 621, 856, 622, 781, 623, + 711, 624, 388, 651, 508, 625, 390, 391, 392, 437, + 438, 439, 393, 394, 395, 396, 397, 398, 487, 488, + 399, 400, 401, 402, 542, 490, 599, 493, 450, 451, + 544, 405, 406, 407, 579, 483, 577, 578, 721, 722, + 649, 793, 628, 629, 630, 631, 632, 753, 892, 928, + 920, 921, 922, 929, 633, 634, 635, 636, 923, 895, + 637, 638, 924, 943, 639, 640, 641, 859, 757, 861, + 899, 918, 919, 642, 408, 409, 410, 434, 643, 480, + 481, 460, 461, 805, 806, 412, 684, 685, 689, 413, + 414, 695, 696, 703, 704, 707, 415, 713, 714, 416, + 462, 463 }; - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 394, 445, 401, 588, 444, 430, 445, 379, 637, 393, - 773, 646, 776, 769, 377, 778, 667, 677, 842, 708, - 494, 530, 687, 709, 446, 668, 535, 421, 437, 446, - 466, 700, 667, 787, 720, 721, 731, 911, 475, 661, - 710, 661, 662, 655, 919, 658, 492, 417, 481, 430, - 328, 329, 330, 422, 911, 493, 481, 659, 669, 670, - 671, 672, 476, 576, 482, 647, 648, 788, 437, 676, - 722, 723, 732, 663, 676, 663, 633, 635, 589, 418, - 676, 644, 645, 676, 437, -35, 590, 649, 481, 407, - 432, 650, 676, 433, 779, 634, 565, 754, 755, 756, - 757, 758, 759, 760, 761, 762, 763, 716, 664, 717, - 746, 735, 748, 657, 664, 589, 664, 764, 589, 664, - 541, 664, 639, 664, 664, 774, 542, 495, 664, 576, - 496, 543, 844, 497, 576, 549, 557, 544, 571, 573, - 576, 550, 558, 576, 572, 574, 853, 652, 854, 637, - 852, 637, 576, 653, 637, 415, 781, 665, 783, 791, - 793, 708, 766, 795, 797, 542, 794, 408, 785, 796, - 798, 576, 409, 693, 456, 458, 460, 462, 464, 465, - 468, 800, 802, 804, 423, 807, 410, 801, 803, 805, - 565, 808, 565, 810, 812, 426, 884, 425, 885, 811, - 813, 926, 766, 437, 766, 890, 891, 892, 893, 894, - 895, 794, 798, 801, 805, 808, 813, 922, 562, 411, - 857, 859, 563, 766, 858, 860, 680, 681, 682, 683, - 887, 708, 445, 769, 412, 444, 828, 829, 830, 831, - 786, 718, 719, 454, 457, 459, 455, 455, 455, 413, - 642, 439, 846, 643, 461, 446, 848, 455, 463, 467, - 414, 455, 455, 565, 675, 724, 725, 455, 863, 677, - 679, 686, 419, 455, 455, 867, 687, 766, 849, 689, - 850, 851, 455, 420, 692, 667, 921, 455, 699, 637, - 817, 455, 713, 714, 715, 821, 822, 823, 576, 576, - 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, - 576, 576, 576, 576, 434, 766, 818, 769, 767, 819, - 676, 676, 766, 818, 447, 847, 873, 676, 676, 766, - 896, 449, 565, 676, 469, 676, 824, 825, 474, 826, - 827, 479, 832, 833, 484, 325, 490, 491, 481, 875, - 539, 536, 877, 537, 538, 540, 545, 641, 726, 546, - 547, 548, 551, 559, 552, 666, 553, 554, 555, 637, - 561, 556, 560, 651, 656, 589, 564, 570, 492, 662, - 576, 576, 431, 690, 701, 729, 730, 576, 576, 728, - 438, 393, 877, 576, 733, 576, 727, 736, 394, 393, - 401, 394, 565, 704, 738, 379, 394, 393, 401, 914, - 393, 909, 377, 448, 742, 393, 472, 739, 712, 740, - 743, 744, 747, 749, 923, 637, 431, 486, 750, 751, - 431, 752, -36, 753, -34, 393, 780, 784, -29, 393, - 792, 869, 799, 878, 814, 806, 438, 809, 815, 841, - 880, 856, 766, 888, 897, 393, 899, 889, 900, 910, - -569, 898, 915, 916, 917, 591, 446, 920, 834, 928, - 929, 835, 837, 566, 488, 836, 839, 489, 838, 487, - 711, 416, 393, 878, 616, 816, 881, 874, 918, 924, - 882, 925, 485, 615, 901, 862, 770, 771, 702, 866, - 443, 861, 865, 772, 868, 864, 446, 0, 872, 0, - 0, 870, 0, 0, 0, 871, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 696, 0, - 0, 0, 0, 0, 0, 703, 0, 566, 0, 566, - 0, 0, 0, 0, 393, 0, 393, 0, 393, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 0, 615, 394, 0, 0, 0, 0, 0, 0, 0, - 566, 393, 0, 0, 0, 0, 0, 0, 0, 393, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, - 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, - 0, 616, 0, 0, 0, 0, 615, 0, 0, 0, - 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, - 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 696, 0, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 616, 616, 0, 616, 0, 401, 0, 0, - 0, 615, 615, 0, 615, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 0, 615, 0, 0, 0, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 616, 0, 615, 0, - 0, 0, 0, 0, 0, 615, 616, 0, 0, 0, - 616, 0, 0, 0, 0, 615, 616, 0, 0, 615, - 0, 0, 0, 442, 0, 615, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, - 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 327, 328, 329, 330, - 331, 0, 0, 0, 0, 0, 0, 0, 0, 332, - 333, 334, 335, 336, 337, 338, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 339, 340, 341, 342, 343, 344, 0, 0, 0, - 0, 0, 0, 0, 0, 345, 0, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 499, 500, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 501, 502, 0, 325, 0, 591, 592, - 0, 0, 0, 0, 593, 503, 504, 505, 506, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 0, 507, 508, 509, 510, - 511, 332, 333, 334, 335, 336, 337, 338, 594, 595, - 596, 597, 0, 598, 599, 600, 601, 602, 603, 604, - 605, 606, 607, 339, 340, 341, 342, 343, 344, 512, - 513, 514, 515, 516, 517, 518, 519, 345, 608, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 0, 0, 499, 500, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 501, 502, 0, 325, 0, - 591, 768, 0, 0, 0, 0, 593, 503, 504, 505, - 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 327, 328, 329, 330, 331, 0, 0, 0, 507, 508, - 509, 510, 511, 332, 333, 334, 335, 336, 337, 338, - 594, 595, 596, 597, 0, 598, 599, 600, 601, 602, - 603, 604, 605, 606, 607, 339, 340, 341, 342, 343, - 344, 512, 513, 514, 515, 516, 517, 518, 519, 345, - 608, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 0, 0, 499, 500, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 501, 502, 0, - 325, 0, 591, 0, 0, 0, 0, 0, 593, 503, - 504, 505, 506, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 327, 328, 329, 330, 331, 0, 0, 0, - 507, 508, 509, 510, 511, 332, 333, 334, 335, 336, - 337, 338, 594, 595, 596, 597, 0, 598, 599, 600, - 601, 602, 603, 604, 605, 606, 607, 339, 340, 341, - 342, 343, 344, 512, 513, 514, 515, 516, 517, 518, - 519, 345, 608, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 0, 0, - 499, 500, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, - 502, 0, 325, 0, 484, 0, 0, 0, 0, 0, - 593, 503, 504, 505, 506, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 327, 328, 329, 330, 331, 0, - 0, 0, 507, 508, 509, 510, 511, 332, 333, 334, - 335, 336, 337, 338, 594, 595, 596, 597, 0, 598, - 599, 600, 601, 602, 603, 604, 605, 606, 607, 339, - 340, 341, 342, 343, 344, 512, 513, 514, 515, 516, - 517, 518, 519, 345, 608, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 0, 0, 499, 500, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 501, 502, 0, 325, 0, 0, 0, 0, 0, - 0, 0, 593, 503, 504, 505, 506, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 327, 328, 329, 330, - 331, 0, 0, 0, 507, 508, 509, 510, 511, 332, - 333, 334, 335, 336, 337, 338, 594, 595, 596, 597, - 0, 598, 599, 600, 601, 602, 603, 604, 605, 606, - 607, 339, 340, 341, 342, 343, 344, 512, 513, 514, - 515, 516, 517, 518, 519, 345, 608, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 499, 500, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 501, 502, 0, 325, 0, 0, 0, - 0, 0, 0, 0, 593, 503, 504, 505, 506, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 0, 507, 508, 509, 510, - 511, 332, 333, 334, 335, 336, 337, 338, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 512, - 513, 514, 515, 516, 517, 518, 519, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 0, 0, 0, 318, 319, 320, - 321, 322, 323, 324, 0, 0, 499, 500, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 501, 502, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 503, 504, 505, - 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 327, 328, 329, 330, 0, 0, 0, 0, 507, 508, - 509, 510, 511, 332, 333, 334, 335, 336, 337, 338, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 339, 340, 341, 342, 343, - 344, 512, 513, 514, 515, 516, 517, 518, 519, 345, - 0, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 325, 0, 0, 0, 0, 0, 0, 0, 326, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 327, 328, 329, 330, 331, 0, 0, 0, - 0, 0, 0, 0, 0, 332, 333, 334, 335, 336, - 337, 338, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 339, 340, 341, - 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, - 0, 345, 0, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, - 0, 318, 319, 320, 321, 322, 323, 324, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 327, 328, 329, 330, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 332, 333, 334, - 335, 336, 337, 338, 594, 0, 0, 597, 0, 598, - 599, 0, 0, 602, 0, 0, 0, 0, 0, 339, - 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, - 0, 0, 0, 345, 0, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 327, 328, 329, 330, - 0, 0, 0, 0, 0, 0, 0, 0, 436, 332, - 333, 334, 335, 336, 337, 338, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 339, 340, 341, 342, 343, 344, 0, 0, 0, - 0, 0, 0, 0, 0, 345, 0, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 0, 0, 0, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 332, 333, 334, 335, 336, 337, 338, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 0, - 0, 0, 0, 0, 0, 0, 0, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 0, 0, 0, 318, 319, 320, - 321, 322, 323, 324, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 707, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 327, 328, 329, 330, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 332, 333, 334, 335, 336, 337, 338, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 339, 340, 341, 342, 343, - 344, 0, 0, 0, 0, 0, 0, 0, 0, 345, - 0, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 820, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 327, 328, 329, 330, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 332, 333, 334, 335, 336, - 337, 338, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 339, 340, 341, - 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, - 0, 345, 0, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, - 0, 318, 319, 320, 321, 322, 323, 324, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 855, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 327, 328, 329, 330, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 332, 333, 334, - 335, 336, 337, 338, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, - 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, - 0, 0, 0, 345, 0, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 327, 328, 329, 330, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, - 333, 334, 335, 336, 337, 338, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 339, 340, 341, 342, 343, 344, 0, 0, 0, - 0, 0, 0, 0, 0, 345, 0, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 0, 0, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 0, 0, 0, 0, 0, 0, 321, 0, 0, - 0, 0, 0, 499, 500, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 501, 502, 0, 0, 0, 636, 775, 0, - 0, 0, 0, 0, 503, 504, 505, 506, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 507, 508, 509, 510, 511, - 332, 0, 0, 0, 0, 337, 338, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 512, 513, - 514, 515, 516, 517, 518, 519, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 358, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 0, 0, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 0, 0, 0, 0, 0, 0, - 321, 0, 0, 0, 0, 0, 499, 500, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 501, 502, 0, 0, 0, - 636, 886, 0, 0, 0, 0, 0, 503, 504, 505, - 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 507, 508, - 509, 510, 511, 332, 0, 0, 0, 0, 337, 338, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 512, 513, 514, 515, 516, 517, 518, 519, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 358, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, - 0, 0, 0, 321, 0, 0, 0, 0, 0, 499, - 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 501, 502, - 0, 0, 575, 0, 0, 0, 0, 0, 0, 0, - 503, 504, 505, 506, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 507, 508, 509, 510, 511, 332, 0, 0, 0, - 0, 337, 338, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 512, 513, 514, 515, 516, 517, - 518, 519, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 358, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, - 0, 0, 499, 500, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 501, 502, 0, 0, 0, 636, 0, 0, 0, - 0, 0, 0, 503, 504, 505, 506, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 507, 508, 509, 510, 511, 332, - 0, 0, 0, 0, 337, 338, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 512, 513, 514, - 515, 516, 517, 518, 519, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 0, 0, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 0, 0, 0, 0, 0, 0, 321, - 0, 0, 0, 0, 0, 499, 500, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 501, 502, 0, 0, 734, 0, - 0, 0, 0, 0, 0, 0, 503, 504, 505, 506, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 507, 508, 509, - 510, 511, 332, 0, 0, 0, 0, 337, 338, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 512, 513, 514, 515, 516, 517, 518, 519, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 358, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 0, 0, 0, 0, - 0, 0, 321, 0, 0, 0, 0, 0, 499, 500, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 501, 502, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 745, 503, - 504, 505, 506, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 507, 508, 509, 510, 511, 332, 0, 0, 0, 0, - 337, 338, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 512, 513, 514, 515, 516, 517, 518, - 519, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 358, 2, 3, 4, 5, + 404, 389, 411, 440, 648, 455, 387, 785, 454, 598, + 455, 504, 403, 540, 678, 712, 858, 545, 702, 725, + 657, 724, 456, 688, 679, 447, 747, 456, 476, 672, + 678, 789, 673, 792, 736, 737, 794, 716, 431, 666, + 427, 669, 803, 672, 927, 485, 726, 440, 491, 442, + 417, 935, 443, 670, 418, 586, 492, 680, 681, 682, + 683, 927, 748, 674, 432, 447, 419, 644, 646, 486, + 738, 739, 428, 655, 656, 687, 804, 674, -694, 420, + 491, 447, 658, 659, -694, 600, 687, 645, 502, 687, + 491, 795, 600, 601, 575, 449, 600, 503, 687, 650, + 551, 553, -35, 790, 660, 668, 552, 554, 661, 421, + 466, 468, 470, 472, 474, 475, 478, 422, 751, 559, + 762, 586, 764, 505, 567, 560, 506, 581, 423, 507, + 568, 860, 586, 582, 675, 586, 464, 583, 467, 465, + 675, 465, 675, 584, 586, 675, 648, 675, 648, 675, + 675, 648, 663, 797, 675, 676, 807, 809, 664, 782, + 811, 813, 552, 810, 586, 801, 812, 814, 799, 724, + 572, 709, 469, 424, 573, 465, 868, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 816, 575, 425, + 575, 471, 818, 817, 465, 820, 823, 780, 819, 942, + 447, 821, 824, 826, 828, 900, 901, 906, 907, 827, + 829, 782, 782, 810, 814, 908, 909, 910, 911, 938, + 429, 817, 821, 824, 829, 782, 873, 875, 734, 735, + 874, 876, 785, 802, 732, 430, 733, 455, 436, 724, + 454, 698, 699, 700, 701, 521, 844, 845, 846, 847, + 653, 433, 473, 654, 456, 465, 903, 691, 692, 693, + 694, 477, 575, 686, 465, 690, 465, 862, 465, 697, + 705, 864, 465, 465, 712, 435, 712, 702, 702, 449, + 879, 688, 866, 867, 869, 708, 870, 833, 465, 678, + 444, 648, 457, 837, 838, 839, 586, 586, 586, 586, + 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, + 586, 586, 937, 459, 715, 782, 785, 465, 783, 834, + 782, 834, 835, 863, 889, 334, 335, 336, 740, 741, + 782, 865, 687, 687, 782, 912, 575, 729, 730, 731, + 840, 841, 479, 842, 843, 687, 484, 687, 331, 494, + 848, 849, 489, 500, 501, 491, 547, 548, 549, 546, + 555, 550, 574, 742, 891, 569, 556, 893, 652, 557, + 558, 648, 561, 562, 600, 563, 564, 565, 586, 586, + 566, 570, 571, 667, 580, 662, -34, 502, 706, 745, + 673, 586, 441, 586, 717, 746, 677, 743, 744, 749, + 448, 754, 752, 755, 403, 756, 575, 893, 404, 389, + 411, 404, 403, 925, 387, 720, 404, 458, 411, 758, + 403, 728, 759, 403, 930, 760, 482, 648, 403, 763, + 766, 765, -36, 815, 767, 768, 441, 496, 769, 939, + 441, 796, 800, -29, 808, 822, 825, 830, 403, 543, + 831, 857, 403, 894, 872, 885, 448, 782, 896, 904, + 905, 916, 913, 915, 926, 932, 914, -580, 403, 931, + 456, 602, 936, 850, 945, 944, 852, 851, 727, 933, + 497, 853, 426, 576, 854, 498, 832, 855, 897, 499, + 890, 934, 940, 894, 627, 403, 941, 495, 898, 786, + 917, 787, 718, 877, 882, 453, 626, 881, 878, 788, + 456, 886, 888, 880, 0, 0, 884, 0, 0, 0, + 0, 883, 0, 0, 0, 0, 0, 0, 887, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 671, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 576, 0, 576, + 0, 0, 0, 0, 0, 0, 0, 403, 0, 403, + 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 404, 0, 626, 0, 0, 0, 0, + 0, 576, 0, 0, 0, 403, 0, 0, 0, 0, + 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 627, 0, 0, 0, 627, 0, 0, + 0, 0, 0, 0, 0, 626, 0, 0, 0, 626, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 627, 627, + 0, 627, 0, 411, 0, 0, 0, 0, 0, 0, + 626, 626, 0, 626, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 626, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 627, 0, 0, 0, 0, 626, 0, 0, + 0, 0, 627, 0, 626, 0, 627, 0, 0, 0, + 0, 0, 627, 0, 626, 0, 0, 0, 626, 0, + 0, 0, 452, 0, 626, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 0, - 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, - 0, 499, 500, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 501, 502, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 503, 504, 505, 506, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 507, 508, 509, 510, 511, 332, 0, - 0, 0, 0, 337, 338, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 512, 513, 514, 515, - 516, 517, 518, 519, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 358, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 0, 0, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 0, 0, 0, 0, 0, 0, 321, 0, - 0, 0, 0, 0, 499, 500, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 501, 502, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 503, 504, 505, 506, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 507, 508, 509, 510, - 511, 332, 0, 0, 0, 0, 337, 654, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, - 513, 514, 515, 516, 517, 518, 519, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 358, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 0, - 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 0, 0, 0, 0, 0, - 0, 321, 0, 0, 0, 0, 0, 499, 500, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 501, 502, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 503, 504, - 505, 506, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 507, - 508, 509, 510, 694, 332, 0, 0, 0, 0, 337, - 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 512, 513, 514, 515, 516, 517, 518, 519, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 358, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, - 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, - 0, 0, 337, 338 -}; - -static const yytype_int16 yycheck[] = -{ - 0, 401, 0, 481, 401, 382, 406, 0, 493, 0, - 634, 502, 636, 622, 0, 639, 542, 547, 737, 567, - 434, 439, 552, 569, 401, 348, 440, 359, 390, 406, - 413, 561, 558, 348, 331, 332, 336, 899, 385, 348, - 570, 348, 351, 528, 906, 356, 349, 353, 351, 426, - 374, 375, 376, 385, 916, 358, 351, 368, 381, 382, - 383, 384, 409, 481, 359, 329, 330, 382, 430, 547, - 367, 368, 372, 382, 552, 382, 490, 491, 351, 385, - 558, 499, 500, 561, 446, 349, 359, 351, 351, 349, - 356, 355, 570, 359, 640, 358, 473, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 361, 540, 363, - 601, 589, 603, 531, 546, 351, 548, 358, 351, 551, - 350, 553, 358, 555, 556, 358, 356, 353, 560, 547, - 356, 350, 741, 359, 552, 350, 350, 356, 350, 350, - 558, 356, 356, 561, 356, 356, 354, 350, 356, 634, - 774, 636, 570, 356, 639, 351, 350, 540, 649, 350, - 350, 709, 356, 350, 350, 356, 356, 349, 653, 356, - 356, 589, 349, 556, 408, 409, 410, 411, 412, 413, - 414, 350, 350, 350, 359, 350, 349, 356, 356, 356, - 567, 356, 569, 350, 350, 356, 350, 350, 350, 356, - 356, 920, 356, 565, 356, 350, 350, 350, 350, 350, - 350, 356, 356, 356, 356, 356, 356, 350, 352, 349, - 352, 352, 356, 356, 356, 356, 381, 382, 383, 384, - 854, 779, 632, 842, 349, 632, 720, 721, 722, 723, - 658, 327, 328, 382, 382, 382, 385, 385, 385, 349, - 356, 367, 743, 359, 382, 632, 747, 385, 382, 382, - 349, 385, 385, 640, 382, 333, 334, 385, 798, 799, - 382, 382, 349, 385, 385, 805, 806, 356, 357, 382, - 765, 766, 385, 349, 382, 811, 910, 385, 382, 774, - 704, 385, 364, 365, 366, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, - 728, 729, 730, 731, 385, 356, 356, 926, 359, 359, - 798, 799, 356, 356, 359, 359, 359, 805, 806, 356, - 357, 385, 709, 811, 385, 813, 716, 717, 353, 718, - 719, 385, 724, 725, 353, 351, 385, 385, 351, 840, - 358, 350, 843, 385, 359, 356, 358, 385, 371, 356, - 356, 356, 356, 350, 356, 385, 356, 356, 356, 854, - 349, 356, 356, 350, 349, 351, 359, 358, 349, 351, - 798, 799, 382, 348, 352, 335, 337, 805, 806, 369, - 390, 382, 883, 811, 352, 813, 370, 354, 398, 390, - 398, 401, 779, 385, 349, 398, 406, 398, 406, 900, - 401, 896, 398, 406, 349, 406, 416, 359, 385, 359, - 349, 359, 349, 357, 915, 910, 426, 425, 359, 359, - 430, 359, 349, 359, 349, 426, 385, 385, 350, 430, - 358, 348, 356, 843, 350, 356, 446, 356, 350, 352, - 393, 352, 356, 348, 354, 446, 350, 382, 349, 358, - 353, 385, 359, 350, 397, 353, 843, 353, 726, 359, - 354, 727, 729, 473, 430, 728, 731, 430, 730, 426, - 572, 331, 473, 883, 484, 703, 845, 818, 905, 916, - 845, 917, 424, 484, 883, 796, 632, 632, 563, 803, - 398, 794, 801, 632, 806, 799, 883, -1, 813, -1, - -1, 809, -1, -1, -1, 811, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 536, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 558, -1, - -1, -1, -1, -1, -1, 565, -1, 567, -1, 569, - -1, -1, -1, -1, 565, -1, 567, -1, 569, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 622, -1, -1, -1, -1, -1, -1, -1, - -1, 622, 632, -1, -1, -1, -1, -1, -1, -1, - 640, 632, -1, -1, -1, -1, -1, -1, -1, 640, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 709, - -1, -1, -1, -1, -1, -1, -1, -1, 709, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 737, -1, -1, - -1, 741, -1, -1, -1, -1, 737, -1, -1, -1, - 741, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 779, - -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 811, -1, 813, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 842, 843, -1, 845, -1, 845, -1, -1, - -1, 842, 843, -1, 845, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 883, -1, -1, -1, -1, -1, -1, - -1, -1, 883, -1, -1, -1, -1, -1, -1, 899, - -1, -1, -1, -1, -1, -1, 906, -1, 899, -1, - -1, -1, -1, -1, -1, 906, 916, -1, -1, -1, - 920, -1, -1, -1, -1, 916, 926, -1, -1, 920, - -1, -1, -1, 0, -1, 926, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 351, -1, -1, -1, -1, -1, - -1, -1, 359, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 373, 374, 375, 376, - 377, -1, -1, -1, -1, -1, -1, -1, -1, 386, - 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 408, 409, 410, 411, 412, 413, -1, -1, -1, - -1, -1, -1, -1, -1, 422, -1, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, -1, 329, 330, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 348, 349, -1, 351, -1, 353, 354, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, 377, -1, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, -1, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, -1, -1, 329, 330, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 348, 349, -1, 351, -1, - 353, 354, -1, -1, -1, -1, 359, 360, 361, 362, - 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 373, 374, 375, 376, 377, -1, -1, -1, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, -1, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, -1, -1, 329, 330, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 348, 349, -1, - 351, -1, 353, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 373, 374, 375, 376, 377, -1, -1, -1, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, -1, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, - 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 348, - 349, -1, 351, -1, 353, -1, -1, -1, -1, -1, - 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 373, 374, 375, 376, 377, -1, - -1, -1, 381, 382, 383, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, -1, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - -1, -1, 329, 330, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 348, 349, -1, 351, -1, -1, -1, -1, -1, - -1, -1, 359, 360, 361, 362, 363, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 373, 374, 375, 376, - 377, -1, -1, -1, 381, 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - -1, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, -1, 329, 330, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 348, 349, -1, 351, -1, -1, -1, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, 377, -1, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, 320, 321, 322, - 323, 324, 325, 326, -1, -1, 329, 330, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 348, 349, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 360, 361, 362, - 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 373, 374, 375, 376, -1, -1, -1, -1, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - -1, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 351, -1, -1, -1, -1, -1, -1, -1, 359, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 373, 374, 375, 376, 377, -1, -1, -1, - -1, -1, -1, -1, -1, 386, 387, 388, 389, 390, - 391, 392, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 408, 409, 410, - 411, 412, 413, -1, -1, -1, -1, -1, -1, -1, - -1, 422, -1, 424, 425, 426, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, 320, 321, 322, 323, 324, 325, 326, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 373, 374, 375, 376, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 386, 387, 388, - 389, 390, 391, 392, 393, -1, -1, 396, -1, 398, - 399, -1, -1, 402, -1, -1, -1, -1, -1, 408, - 409, 410, 411, 412, 413, -1, -1, -1, -1, -1, - -1, -1, -1, 422, -1, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - -1, -1, -1, 320, 321, 322, 323, 324, 325, 326, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 359, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 373, 374, 375, 376, - -1, -1, -1, -1, -1, -1, -1, -1, 385, 386, - 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 408, 409, 410, 411, 412, 413, -1, -1, -1, - -1, -1, -1, -1, -1, 422, -1, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, 320, 321, 322, 323, 324, - 325, 326, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 351, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 386, 387, 388, 389, 390, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, -1, - -1, -1, -1, -1, -1, -1, -1, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, 320, 321, 322, - 323, 324, 325, 326, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 354, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 373, 374, 375, 376, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 386, 387, 388, 389, 390, 391, 392, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 408, 409, 410, 411, 412, - 413, -1, -1, -1, -1, -1, -1, -1, -1, 422, - -1, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, -1, -1, -1, 320, - 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 354, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 373, 374, 375, 376, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 386, 387, 388, 389, 390, - 391, 392, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 408, 409, 410, - 411, 412, 413, -1, -1, -1, -1, -1, -1, -1, - -1, 422, -1, 424, 425, 426, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, 320, 321, 322, 323, 324, 325, 326, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 354, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 373, 374, 375, 376, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 386, 387, 388, - 389, 390, 391, 392, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 408, - 409, 410, 411, 412, 413, -1, -1, -1, -1, -1, - -1, -1, -1, 422, -1, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - -1, -1, -1, 320, 321, 322, 323, 324, 325, 326, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 373, 374, 375, 376, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 386, - 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 408, 409, 410, 411, 412, 413, -1, -1, -1, - -1, -1, -1, -1, -1, 422, -1, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, -1, -1, 63, 64, 65, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, @@ -3783,154 +1790,27 @@ static const yytype_int16 yycheck[] = 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, -1, -1, -1, -1, -1, -1, 323, -1, -1, - -1, -1, -1, 329, 330, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 348, 349, -1, -1, -1, 353, 354, -1, - -1, -1, -1, -1, 360, 361, 362, 363, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 381, 382, 383, 384, 385, - 386, -1, -1, -1, -1, 391, 392, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 414, 415, - 416, 417, 418, 419, 420, 421, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 436, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, -1, -1, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, -1, -1, -1, - 323, -1, -1, -1, -1, -1, 329, 330, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 348, 349, -1, -1, -1, - 353, 354, -1, -1, -1, -1, -1, 360, 361, 362, - 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 381, 382, - 383, 384, 385, 386, -1, -1, -1, -1, 391, 392, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 414, 415, 416, 417, 418, 419, 420, 421, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 436, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, -1, -1, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - -1, -1, -1, 323, -1, -1, -1, -1, -1, 329, - 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 348, 349, - -1, -1, 352, -1, -1, -1, -1, -1, -1, -1, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 381, 382, 383, 384, 385, 386, -1, -1, -1, - -1, 391, 392, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 414, 415, 416, 417, 418, 419, - 420, 421, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 436, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - -1, -1, -1, -1, -1, -1, 323, -1, -1, -1, - -1, -1, 329, 330, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 348, 349, -1, -1, -1, 353, -1, -1, -1, - -1, -1, -1, 360, 361, 362, 363, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 381, 382, 383, 384, 385, 386, - -1, -1, -1, -1, 391, 392, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 414, 415, 416, - 417, 418, 419, 420, 421, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 436, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, + 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 335, 336, 337, 0, 0, 0, 0, + 0, 0, 0, 0, 338, 339, 340, 341, 342, 343, + 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, -1, -1, 63, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, @@ -3956,155 +1836,28 @@ static const yytype_int16 yycheck[] = 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, -1, -1, -1, -1, -1, -1, 323, - -1, -1, -1, -1, -1, 329, 330, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 348, 349, -1, -1, 352, -1, - -1, -1, -1, -1, -1, -1, 360, 361, 362, 363, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 381, 382, 383, - 384, 385, 386, -1, -1, -1, -1, 391, 392, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 414, 415, 416, 417, 418, 419, 420, 421, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 436, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - -1, -1, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, -1, -1, -1, -1, - -1, -1, 323, -1, -1, -1, -1, -1, 329, 330, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 348, 349, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 381, 382, 383, 384, 385, 386, -1, -1, -1, -1, - 391, 392, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 414, 415, 416, 417, 418, 419, 420, - 421, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 436, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, -1, -1, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, -1, - -1, -1, -1, -1, -1, 323, -1, -1, -1, -1, - -1, 329, 330, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 348, 349, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 381, 382, 383, 384, 385, 386, -1, - -1, -1, -1, 391, 392, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, - 418, 419, 420, 421, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 436, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, -1, -1, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, -1, 323, -1, - -1, -1, -1, -1, 329, 330, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 348, 349, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 381, 382, 383, 384, - 385, 386, -1, -1, -1, -1, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 414, - 415, 416, 417, 418, 419, 420, 421, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 436, 4, 5, 6, 7, 8, 9, 10, 11, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 0, 0, 509, + 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 511, 512, + 0, 331, 0, 602, 603, 0, 0, 0, 0, 604, + 513, 514, 515, 516, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 335, 336, 337, 0, 0, + 0, 517, 518, 519, 520, 521, 338, 339, 340, 341, + 342, 343, 344, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 345, 346, + 347, 348, 349, 350, 351, 522, 523, 524, 525, 526, + 527, 528, 529, 352, 619, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, -1, - -1, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, @@ -4129,62 +1882,2337 @@ static const yytype_int16 yycheck[] = 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - -1, 323, -1, -1, -1, -1, -1, 329, 330, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 348, 349, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 360, 361, - 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 381, - 382, 383, 384, 385, 386, -1, -1, -1, -1, 391, - 392, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 414, 415, 416, 417, 418, 419, 420, 421, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 436, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, -1, -1, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, -1, 323, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 386, -1, -1, - -1, -1, 391, 392 + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 0, + 0, 509, 510, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 511, 512, 0, 331, 0, 602, 784, 0, 0, 0, + 0, 604, 513, 514, 515, 516, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 335, 336, 337, + 0, 0, 0, 517, 518, 519, 520, 521, 338, 339, + 340, 341, 342, 343, 344, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 345, 346, 347, 348, 349, 350, 351, 522, 523, 524, + 525, 526, 527, 528, 529, 352, 619, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 0, 0, 509, 510, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 511, 512, 0, 331, 0, 602, 0, 0, + 0, 0, 0, 604, 513, 514, 515, 516, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 335, + 336, 337, 0, 0, 0, 517, 518, 519, 520, 521, + 338, 339, 340, 341, 342, 343, 344, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 345, 346, 347, 348, 349, 350, 351, 522, + 523, 524, 525, 526, 527, 528, 529, 352, 619, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 0, 0, 509, 510, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 511, 512, 0, 331, 0, 494, + 0, 0, 0, 0, 0, 604, 513, 514, 515, 516, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 335, 336, 337, 0, 0, 0, 517, 518, 519, + 520, 521, 338, 339, 340, 341, 342, 343, 344, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 345, 346, 347, 348, 349, 350, + 351, 522, 523, 524, 525, 526, 527, 528, 529, 352, + 619, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 0, 0, 509, 510, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 511, 512, 0, 331, + 0, 0, 0, 0, 0, 0, 0, 604, 513, 514, + 515, 516, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 335, 336, 337, 0, 0, 0, 517, + 518, 519, 520, 521, 338, 339, 340, 341, 342, 343, + 344, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 345, 346, 347, 348, + 349, 350, 351, 522, 523, 524, 525, 526, 527, 528, + 529, 352, 619, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 0, 0, 509, + 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 511, 512, + 0, 331, 0, 0, 0, 0, 0, 0, 0, 604, + 513, 514, 515, 516, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 335, 336, 337, 0, 0, + 0, 517, 518, 519, 520, 521, 338, 339, 340, 341, + 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 351, 522, 523, 524, 525, 526, + 527, 528, 529, 352, 0, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 0, 0, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 0, + 0, 509, 510, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 511, 512, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 513, 514, 515, 516, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 335, 336, 0, + 0, 0, 0, 517, 518, 519, 520, 521, 338, 339, + 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 351, 522, 523, 524, + 525, 526, 527, 528, 529, 352, 0, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, + 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 335, + 336, 337, 0, 0, 0, 0, 0, 0, 0, 0, + 338, 339, 340, 341, 342, 343, 344, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 351, 0, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 0, 0, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 335, 336, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 338, 339, 340, 341, 342, 343, 344, 605, + 0, 0, 608, 0, 609, 610, 0, 0, 613, 0, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 351, 0, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 0, 0, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 445, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 335, 336, 0, 0, 0, 0, 0, + 0, 0, 0, 446, 338, 339, 340, 341, 342, 343, + 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 0, 0, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 335, 336, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 338, 339, 340, 341, + 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 351, 0, 0, 0, 0, 0, + 0, 0, 0, 352, 0, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 0, 0, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 723, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 335, 336, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 338, 339, + 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 351, 0, 0, 0, + 0, 0, 0, 0, 0, 352, 0, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 0, + 0, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 836, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 335, + 336, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 338, 339, 340, 341, 342, 343, 344, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 351, 0, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 0, 0, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 871, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 335, 336, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 338, 339, 340, 341, 342, 343, 344, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 351, 0, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 0, 0, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 335, 336, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 338, 339, 340, 341, 342, 343, + 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 647, 791, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 647, 902, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 585, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 647, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 750, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 761, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 665, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 710, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, + 343, 344 }; - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ +static const yytype_int16 yycheck[] = +{ + 0, 0, 0, 392, 503, 411, 0, 633, 411, 491, + 416, 444, 0, 449, 552, 568, 753, 450, 562, 579, + 512, 577, 411, 557, 354, 400, 342, 416, 423, 354, + 568, 645, 357, 647, 337, 338, 650, 571, 365, 538, + 359, 362, 354, 354, 915, 391, 580, 436, 357, 362, + 355, 922, 365, 374, 355, 491, 365, 387, 388, 389, + 390, 932, 378, 388, 391, 440, 355, 500, 501, 415, + 373, 374, 391, 509, 510, 557, 388, 388, 356, 355, + 357, 456, 335, 336, 362, 357, 568, 364, 355, 571, + 357, 651, 357, 365, 483, 373, 357, 364, 580, 364, + 356, 356, 355, 364, 357, 541, 362, 362, 361, 355, + 418, 419, 420, 421, 422, 423, 424, 355, 600, 356, + 612, 557, 614, 359, 356, 362, 362, 356, 355, 365, + 362, 757, 568, 362, 550, 571, 388, 356, 388, 391, + 556, 391, 558, 362, 580, 561, 645, 563, 647, 565, + 566, 650, 356, 356, 570, 550, 356, 356, 362, 362, + 356, 356, 362, 362, 600, 664, 362, 362, 660, 725, + 358, 566, 388, 355, 362, 391, 790, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 356, 577, 357, + 579, 388, 356, 362, 391, 356, 356, 364, 362, 936, + 575, 362, 362, 356, 356, 356, 356, 356, 356, 362, + 362, 362, 362, 362, 362, 356, 356, 356, 356, 356, + 355, 362, 362, 362, 362, 362, 358, 358, 333, 334, + 362, 362, 858, 669, 367, 355, 369, 643, 362, 795, + 643, 387, 388, 389, 390, 391, 736, 737, 738, 739, + 362, 365, 388, 365, 643, 391, 870, 387, 388, 389, + 390, 388, 651, 388, 391, 388, 391, 759, 391, 388, + 388, 763, 391, 391, 827, 356, 829, 821, 822, 373, + 814, 815, 781, 782, 360, 388, 362, 720, 391, 827, + 391, 790, 365, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 926, 391, 388, 362, 942, 391, 365, 362, + 362, 362, 365, 365, 365, 380, 381, 382, 339, 340, + 362, 363, 814, 815, 362, 363, 725, 370, 371, 372, + 732, 733, 391, 734, 735, 827, 359, 829, 357, 359, + 740, 741, 391, 391, 391, 357, 391, 365, 364, 356, + 364, 362, 365, 377, 856, 356, 362, 859, 391, 362, + 362, 870, 362, 362, 357, 362, 362, 362, 814, 815, + 362, 362, 355, 355, 364, 356, 355, 355, 354, 341, + 357, 827, 392, 829, 358, 343, 391, 376, 375, 358, + 400, 355, 360, 365, 392, 365, 795, 899, 408, 408, + 408, 411, 400, 912, 408, 391, 416, 416, 416, 355, + 408, 391, 355, 411, 916, 365, 426, 926, 416, 355, + 365, 363, 355, 362, 365, 365, 436, 435, 365, 931, + 440, 391, 391, 356, 364, 362, 362, 356, 436, 449, + 356, 358, 440, 859, 358, 354, 456, 362, 399, 354, + 388, 355, 360, 356, 364, 356, 391, 359, 456, 365, + 859, 359, 359, 742, 360, 365, 744, 743, 582, 403, + 436, 745, 337, 483, 746, 440, 719, 747, 861, 440, + 834, 921, 932, 899, 494, 483, 933, 434, 861, 643, + 899, 643, 573, 810, 819, 408, 494, 817, 812, 643, + 899, 825, 829, 815, -1, -1, 822, -1, -1, -1, + -1, 821, -1, -1, -1, -1, -1, -1, 827, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 546, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 575, -1, 577, -1, 579, + -1, -1, -1, -1, -1, -1, -1, 575, -1, 577, + -1, 579, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 633, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 643, -1, 633, -1, -1, -1, -1, + -1, 651, -1, -1, -1, 643, -1, -1, -1, -1, + -1, -1, -1, 651, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 725, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 725, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 753, -1, -1, -1, 757, -1, -1, + -1, -1, -1, -1, -1, 753, -1, -1, -1, 757, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 795, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 795, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 858, 859, + -1, 861, -1, 861, -1, -1, -1, -1, -1, -1, + 858, 859, -1, 861, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 899, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 899, -1, -1, -1, 915, -1, -1, -1, -1, + -1, -1, 922, -1, -1, -1, -1, 915, -1, -1, + -1, -1, 932, -1, 922, -1, 936, -1, -1, -1, + -1, -1, 942, -1, 932, -1, -1, -1, 936, -1, + -1, -1, 0, -1, 942, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 357, + -1, -1, -1, -1, -1, -1, -1, 365, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, 383, -1, -1, -1, -1, + -1, -1, -1, -1, 392, 393, 394, 395, 396, 397, + 398, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, + 418, 419, 420, -1, -1, -1, -1, -1, -1, -1, + -1, 429, -1, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, -1, -1, 335, + 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, + -1, 357, -1, 359, 360, -1, -1, -1, -1, 365, + 366, 367, 368, 369, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 379, 380, 381, 382, 383, -1, -1, + -1, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, -1, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, -1, + -1, 335, 336, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 354, 355, -1, 357, -1, 359, 360, -1, -1, -1, + -1, 365, 366, 367, 368, 369, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 379, 380, 381, 382, 383, + -1, -1, -1, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, -1, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, -1, -1, 335, 336, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 354, 355, -1, 357, -1, 359, -1, -1, + -1, -1, -1, 365, 366, 367, 368, 369, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 379, 380, 381, + 382, 383, -1, -1, -1, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, -1, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, -1, -1, 335, 336, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 354, 355, -1, 357, -1, 359, + -1, -1, -1, -1, -1, 365, 366, 367, 368, 369, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + 380, 381, 382, 383, -1, -1, -1, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, -1, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, 335, 336, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 354, 355, -1, 357, + -1, -1, -1, -1, -1, -1, -1, 365, 366, 367, + 368, 369, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, 383, -1, -1, -1, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, -1, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, -1, -1, 335, + 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, + -1, 357, -1, -1, -1, -1, -1, -1, -1, 365, + 366, 367, 368, 369, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 379, 380, 381, 382, 383, -1, -1, + -1, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, -1, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, -1, -1, -1, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, -1, + -1, 335, 336, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 354, 355, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 366, 367, 368, 369, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 379, 380, 381, 382, -1, + -1, -1, -1, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, -1, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 357, -1, -1, -1, -1, + -1, -1, -1, 365, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 379, 380, 381, + 382, 383, -1, -1, -1, -1, -1, -1, -1, -1, + 392, 393, 394, 395, 396, 397, 398, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 414, 415, 416, 417, 418, 419, 420, -1, + -1, -1, -1, -1, -1, -1, -1, 429, -1, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + -1, -1, -1, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + 380, 381, 382, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 392, 393, 394, 395, 396, 397, 398, 399, + -1, -1, 402, -1, 404, 405, -1, -1, 408, -1, + -1, -1, -1, -1, 414, 415, 416, 417, 418, 419, + 420, -1, -1, -1, -1, -1, -1, -1, -1, 429, + -1, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, -1, -1, -1, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 365, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, -1, -1, -1, -1, -1, + -1, -1, -1, 391, 392, 393, 394, 395, 396, 397, + 398, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, + 418, 419, 420, -1, -1, -1, -1, -1, -1, -1, + -1, 429, -1, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, -1, -1, -1, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 357, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 379, 380, 381, 382, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 392, 393, 394, 395, + 396, 397, 398, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 414, 415, + 416, 417, 418, 419, 420, -1, -1, -1, -1, -1, + -1, -1, -1, 429, -1, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, -1, -1, -1, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 360, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 379, 380, 381, 382, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 392, 393, + 394, 395, 396, 397, 398, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 414, 415, 416, 417, 418, 419, 420, -1, -1, -1, + -1, -1, -1, -1, -1, 429, -1, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, -1, -1, + -1, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 360, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 379, 380, 381, + 382, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 392, 393, 394, 395, 396, 397, 398, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 414, 415, 416, 417, 418, 419, 420, -1, + -1, -1, -1, -1, -1, -1, -1, 429, -1, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + -1, -1, -1, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 360, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + 380, 381, 382, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 392, 393, 394, 395, 396, 397, 398, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 414, 415, 416, 417, 418, 419, + 420, -1, -1, -1, -1, -1, -1, -1, -1, 429, + -1, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, -1, -1, -1, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 392, 393, 394, 395, 396, 397, + 398, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, + 418, 419, 420, -1, -1, -1, -1, -1, -1, -1, + -1, 429, -1, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, 359, 360, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, 359, 360, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, 358, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, 359, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, 358, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 365, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 392, -1, -1, -1, -1, + 397, 398 +}; + +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ static const yytype_int16 yystos[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, @@ -4219,144 +4247,148 @@ static const yytype_int16 yystos[] = 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 351, 359, 373, 374, 375, - 376, 377, 386, 387, 388, 389, 390, 391, 392, 408, - 409, 410, 411, 412, 413, 422, 424, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 357, 365, 379, 380, 381, 382, 383, 392, 393, + 394, 395, 396, 397, 398, 414, 415, 416, 417, 418, + 419, 420, 429, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 486, 487, 490, - 491, 492, 493, 497, 498, 499, 500, 501, 502, 505, - 506, 507, 508, 509, 511, 516, 517, 518, 559, 560, - 561, 563, 570, 574, 575, 580, 583, 349, 349, 349, - 349, 349, 349, 349, 349, 351, 517, 353, 385, 349, - 349, 359, 385, 359, 562, 350, 356, 494, 495, 496, - 506, 511, 356, 359, 385, 359, 385, 507, 511, 367, - 513, 514, 0, 560, 491, 499, 506, 359, 490, 385, - 566, 567, 584, 585, 382, 385, 566, 382, 566, 382, - 566, 382, 566, 382, 566, 566, 584, 382, 566, 385, - 564, 565, 511, 520, 353, 385, 409, 503, 504, 385, - 510, 351, 359, 512, 353, 538, 563, 495, 494, 496, - 385, 385, 349, 358, 512, 353, 356, 359, 489, 329, - 330, 348, 349, 360, 361, 362, 363, 381, 382, 383, - 384, 385, 414, 415, 416, 417, 418, 419, 420, 421, - 456, 457, 458, 460, 461, 462, 463, 464, 465, 466, - 467, 468, 509, 511, 515, 512, 350, 385, 359, 358, - 356, 350, 356, 350, 356, 358, 356, 356, 356, 350, - 356, 356, 356, 356, 356, 356, 356, 350, 356, 350, - 356, 349, 352, 356, 359, 506, 511, 521, 522, 519, - 358, 350, 356, 350, 356, 352, 467, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 351, - 359, 353, 354, 359, 393, 394, 395, 396, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 423, 467, - 480, 482, 484, 486, 490, 509, 511, 527, 528, 529, - 530, 531, 539, 540, 541, 542, 545, 546, 549, 550, - 551, 558, 563, 512, 358, 512, 353, 482, 525, 358, - 488, 385, 356, 359, 467, 467, 484, 329, 330, 351, - 355, 350, 350, 356, 392, 482, 349, 467, 356, 368, - 563, 348, 351, 382, 567, 584, 385, 585, 348, 381, - 382, 383, 384, 571, 572, 382, 480, 485, 573, 382, - 381, 382, 383, 384, 576, 577, 382, 485, 578, 382, - 348, 579, 382, 584, 385, 485, 511, 581, 582, 382, - 485, 352, 565, 511, 385, 523, 524, 354, 522, 521, - 485, 504, 385, 364, 365, 366, 361, 363, 327, 328, - 331, 332, 367, 368, 333, 334, 371, 370, 369, 335, - 337, 336, 372, 352, 352, 480, 354, 532, 349, 359, - 359, 553, 349, 349, 359, 359, 484, 349, 484, 357, - 359, 359, 359, 359, 338, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 358, 483, 356, 359, 354, 528, - 542, 546, 551, 525, 358, 354, 525, 526, 525, 521, - 385, 350, 459, 484, 385, 482, 467, 348, 382, 568, - 569, 350, 358, 350, 356, 350, 356, 350, 356, 356, - 350, 356, 350, 356, 350, 356, 356, 350, 356, 356, - 350, 356, 350, 356, 350, 350, 523, 512, 356, 359, - 354, 467, 467, 467, 469, 469, 470, 470, 471, 471, - 471, 471, 472, 472, 473, 474, 475, 476, 477, 478, - 481, 352, 539, 552, 528, 554, 484, 359, 484, 357, - 482, 482, 525, 354, 356, 354, 352, 352, 356, 352, - 356, 572, 571, 485, 573, 577, 576, 485, 578, 348, - 579, 581, 582, 359, 524, 484, 533, 484, 499, 544, - 393, 527, 540, 555, 350, 350, 354, 525, 348, 382, - 350, 350, 350, 350, 350, 350, 357, 354, 385, 350, - 349, 544, 556, 557, 535, 536, 537, 543, 547, 482, - 358, 529, 534, 538, 484, 359, 350, 397, 531, 529, - 353, 525, 350, 484, 534, 535, 539, 548, 359, 354 + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 496, 497, 500, + 501, 502, 503, 507, 508, 509, 510, 511, 512, 515, + 516, 517, 518, 519, 521, 526, 527, 528, 569, 570, + 571, 573, 580, 584, 585, 591, 594, 355, 355, 355, + 355, 355, 355, 355, 355, 357, 527, 359, 391, 355, + 355, 365, 391, 365, 572, 356, 362, 504, 505, 506, + 516, 521, 362, 365, 391, 365, 391, 517, 521, 373, + 523, 524, 0, 570, 501, 509, 516, 365, 500, 391, + 576, 577, 595, 596, 388, 391, 576, 388, 576, 388, + 576, 388, 576, 388, 576, 576, 595, 388, 576, 391, + 574, 575, 521, 530, 359, 391, 415, 513, 514, 391, + 520, 357, 365, 522, 359, 548, 573, 505, 504, 506, + 391, 391, 355, 364, 522, 359, 362, 365, 499, 335, + 336, 354, 355, 366, 367, 368, 369, 387, 388, 389, + 390, 391, 421, 422, 423, 424, 425, 426, 427, 428, + 466, 467, 468, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 519, 521, 525, 522, 356, 391, 365, 364, + 362, 356, 362, 356, 362, 364, 362, 362, 362, 356, + 362, 362, 362, 362, 362, 362, 362, 356, 362, 356, + 362, 355, 358, 362, 365, 516, 521, 531, 532, 529, + 364, 356, 362, 356, 362, 358, 477, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 521, + 357, 365, 359, 360, 365, 399, 400, 401, 402, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 430, + 477, 490, 492, 494, 496, 500, 519, 521, 537, 538, + 539, 540, 541, 549, 550, 551, 552, 555, 556, 559, + 560, 561, 568, 573, 522, 364, 522, 359, 492, 535, + 364, 498, 391, 362, 365, 477, 477, 494, 335, 336, + 357, 361, 356, 356, 362, 398, 492, 355, 477, 362, + 374, 573, 354, 357, 388, 577, 595, 391, 596, 354, + 387, 388, 389, 390, 581, 582, 388, 490, 495, 583, + 388, 387, 388, 389, 390, 586, 587, 388, 387, 388, + 389, 390, 466, 588, 589, 388, 354, 590, 388, 595, + 391, 495, 526, 592, 593, 388, 495, 358, 575, 521, + 391, 533, 534, 360, 532, 531, 495, 514, 391, 370, + 371, 372, 367, 369, 333, 334, 337, 338, 373, 374, + 339, 340, 377, 376, 375, 341, 343, 342, 378, 358, + 358, 490, 360, 542, 355, 365, 365, 563, 355, 355, + 365, 365, 494, 355, 494, 363, 365, 365, 365, 365, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 364, 493, 362, 365, 360, 538, 552, 556, 561, 535, + 364, 360, 535, 536, 535, 531, 391, 356, 469, 494, + 391, 492, 477, 354, 388, 578, 579, 356, 364, 356, + 362, 356, 362, 356, 362, 362, 356, 362, 356, 362, + 356, 362, 362, 356, 362, 362, 356, 362, 356, 362, + 356, 356, 533, 522, 362, 365, 360, 477, 477, 477, + 479, 479, 480, 480, 481, 481, 481, 481, 482, 482, + 483, 484, 485, 486, 487, 488, 491, 358, 549, 562, + 538, 564, 494, 365, 494, 363, 492, 492, 535, 360, + 362, 360, 358, 358, 362, 358, 362, 582, 581, 495, + 583, 587, 586, 589, 588, 354, 590, 592, 593, 365, + 534, 494, 543, 494, 509, 554, 399, 537, 550, 565, + 356, 356, 360, 535, 354, 388, 356, 356, 356, 356, + 356, 356, 363, 360, 391, 356, 355, 554, 566, 567, + 545, 546, 547, 553, 557, 492, 364, 539, 544, 548, + 494, 365, 356, 403, 541, 539, 359, 535, 356, 494, + 544, 545, 549, 558, 365, 360 }; - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int16 yyr1[] = { - 0, 455, 456, 457, 457, 457, 457, 457, 457, 457, - 457, 457, 457, 457, 457, 457, 457, 457, 458, 458, - 458, 458, 458, 458, 459, 460, 461, 462, 462, 463, - 463, 464, 464, 465, 466, 466, 466, 467, 467, 467, - 467, 468, 468, 468, 468, 469, 469, 469, 469, 470, - 470, 470, 471, 471, 471, 472, 472, 472, 472, 472, - 473, 473, 473, 474, 474, 475, 475, 476, 476, 477, - 477, 478, 478, 479, 479, 480, 481, 480, 482, 482, - 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, - 483, 484, 484, 485, 486, 486, 486, 486, 486, 486, - 486, 486, 486, 486, 486, 488, 487, 489, 489, 490, - 490, 490, 490, 491, 491, 492, 492, 493, 494, 494, - 495, 495, 495, 495, 496, 497, 497, 497, 497, 497, - 498, 498, 498, 498, 498, 499, 499, 500, 501, 501, - 501, 501, 501, 501, 501, 501, 502, 503, 503, 504, - 504, 504, 505, 506, 506, 507, 507, 507, 507, 507, - 507, 507, 507, 507, 507, 507, 508, 508, 508, 508, - 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, - 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, - 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, - 508, 509, 510, 510, 511, 511, 512, 512, 512, 512, - 513, 513, 514, 515, 515, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 517, 517, 517, 519, 518, 520, 518, 521, 521, 522, - 522, 523, 523, 524, 524, 525, 525, 525, 525, 526, - 526, 527, 528, 528, 529, 529, 529, 529, 529, 529, - 529, 529, 530, 531, 532, 533, 531, 534, 534, 536, - 535, 537, 535, 538, 538, 539, 539, 540, 540, 541, - 541, 542, 543, 543, 544, 544, 545, 545, 547, 546, - 548, 548, 549, 549, 550, 550, 552, 551, 553, 551, - 554, 551, 555, 555, 556, 556, 557, 557, 558, 558, - 558, 558, 558, 558, 558, 558, 559, 559, 560, 560, - 560, 562, 561, 563, 564, 564, 565, 565, 566, 566, - 567, 567, 568, 568, 569, 569, 570, 570, 570, 570, - 570, 570, 571, 571, 572, 572, 572, 572, 572, 573, - 573, 574, 574, 575, 575, 575, 575, 575, 575, 575, - 575, 576, 576, 577, 577, 577, 577, 578, 578, 579, - 579, 580, 580, 580, 580, 581, 581, 582, 582, 583, - 583, 584, 584, 585, 585 + 0, 465, 466, 467, 467, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 467, 467, 467, 467, 468, 468, + 468, 468, 468, 468, 469, 470, 471, 472, 472, 473, + 473, 474, 474, 475, 476, 476, 476, 477, 477, 477, + 477, 478, 478, 478, 478, 479, 479, 479, 479, 480, + 480, 480, 481, 481, 481, 482, 482, 482, 482, 482, + 483, 483, 483, 484, 484, 485, 485, 486, 486, 487, + 487, 488, 488, 489, 489, 490, 491, 490, 492, 492, + 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, + 493, 494, 494, 495, 496, 496, 496, 496, 496, 496, + 496, 496, 496, 496, 496, 498, 497, 499, 499, 500, + 500, 500, 500, 501, 501, 502, 502, 503, 504, 504, + 505, 505, 505, 505, 506, 507, 507, 507, 507, 507, + 508, 508, 508, 508, 508, 509, 509, 510, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 512, 513, + 513, 514, 514, 514, 515, 516, 516, 517, 517, 517, + 517, 517, 517, 517, 517, 517, 517, 517, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 519, 520, 520, 521, + 521, 522, 522, 522, 522, 523, 523, 524, 525, 525, + 525, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 527, 527, 527, 529, 528, 530, 528, 531, 531, + 532, 532, 533, 533, 534, 534, 535, 535, 535, 535, + 536, 536, 537, 538, 538, 539, 539, 539, 539, 539, + 539, 539, 539, 540, 541, 542, 543, 541, 544, 544, + 546, 545, 547, 545, 548, 548, 549, 549, 550, 550, + 551, 551, 552, 553, 553, 554, 554, 555, 555, 557, + 556, 558, 558, 559, 559, 560, 560, 562, 561, 563, + 561, 564, 561, 565, 565, 566, 566, 567, 567, 568, + 568, 568, 568, 568, 568, 568, 568, 569, 569, 570, + 570, 570, 572, 571, 573, 574, 574, 575, 575, 576, + 576, 577, 577, 578, 578, 579, 579, 580, 580, 580, + 580, 580, 580, 581, 581, 582, 582, 582, 582, 582, + 583, 583, 584, 584, 585, 585, 585, 585, 585, 585, + 585, 585, 586, 586, 587, 587, 587, 587, 588, 588, + 589, 589, 589, 589, 589, 590, 590, 591, 591, 591, + 591, 592, 592, 593, 593, 594, 594, 595, 595, 596, + 596 }; - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 1, 3, 1, 1, 1, 1, 1, @@ -4373,61 +4405,63 @@ static const yytype_int8 yyr2[] = 3, 3, 4, 1, 1, 2, 3, 3, 2, 3, 2, 1, 2, 1, 1, 1, 3, 4, 6, 5, 1, 2, 3, 5, 4, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 4, 1, 3, 1, - 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, + 3, 1, 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 3, 2, 3, 2, 3, 3, 4, - 1, 0, 3, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 6, 0, 5, 1, 2, 3, - 4, 1, 3, 1, 2, 1, 3, 4, 2, 1, + 1, 1, 1, 1, 4, 1, 1, 1, 3, 2, + 3, 2, 3, 3, 4, 1, 0, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 0, 0, 5, 1, 1, 0, - 2, 0, 2, 2, 3, 1, 2, 1, 2, 1, - 2, 5, 3, 1, 1, 4, 1, 2, 0, 8, - 0, 1, 3, 2, 1, 2, 0, 6, 0, 8, - 0, 7, 1, 1, 1, 0, 2, 3, 2, 2, - 2, 3, 2, 2, 2, 2, 1, 2, 1, 1, - 1, 0, 3, 5, 1, 3, 1, 4, 1, 3, - 5, 5, 1, 3, 1, 3, 4, 6, 6, 8, - 6, 8, 1, 3, 1, 1, 1, 1, 1, 1, - 3, 4, 6, 4, 6, 6, 8, 6, 8, 6, - 8, 1, 3, 1, 1, 1, 1, 1, 3, 1, - 3, 6, 8, 4, 6, 1, 3, 1, 1, 4, - 6, 1, 3, 3, 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 6, 0, 5, 1, 2, + 3, 4, 1, 3, 1, 2, 1, 3, 4, 2, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 0, 0, 5, 1, 1, + 0, 2, 0, 2, 2, 3, 1, 2, 1, 2, + 1, 2, 5, 3, 1, 1, 4, 1, 2, 0, + 8, 0, 1, 3, 2, 1, 2, 0, 6, 0, + 8, 0, 7, 1, 1, 1, 0, 2, 3, 2, + 2, 2, 3, 2, 2, 2, 2, 1, 2, 1, + 1, 1, 0, 3, 5, 1, 3, 1, 4, 1, + 3, 5, 5, 1, 3, 1, 3, 4, 6, 6, + 8, 6, 8, 1, 3, 1, 1, 1, 1, 1, + 1, 3, 4, 6, 4, 6, 6, 8, 6, 8, + 6, 8, 1, 3, 1, 1, 1, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 3, 6, 8, 4, + 6, 1, 3, 1, 1, 4, 6, 1, 3, 3, + 3 }; @@ -4439,6 +4473,7 @@ enum { YYENOMEM = -2 }; #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab #define YYRECOVERING() (!!yyerrstatus) @@ -4479,10 +4514,7 @@ do { \ YYFPRINTF Args; \ } while (0) -/* This macro is provided for backward compatibility. */ -# ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif + # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ @@ -4506,16 +4538,12 @@ yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext) { FILE *yyoutput = yyo; - YYUSE (yyoutput); - YYUSE (pParseContext); + YY_USE (yyoutput); + YY_USE (pParseContext); if (!yyvaluep) return; -# ifdef YYPRINT - if (yykind < YYNTOKENS) - YYPRINT (yyo, yytoknum[yykind], *yyvaluep); -# endif YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yykind); + YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -4896,14 +4924,14 @@ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep, glslang::TParseContext* pParseContext) { - YYUSE (yyvaluep); - YYUSE (pParseContext); + YY_USE (yyvaluep); + YY_USE (pParseContext); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yykind); + YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -4975,6 +5003,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ + goto yysetstate; @@ -5000,7 +5029,7 @@ yysetstate: if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE - goto yyexhaustedlab; + YYNOMEM; #else { /* Get the current used size of the three stacks, in elements. */ @@ -5028,7 +5057,7 @@ yysetstate: # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; @@ -5039,7 +5068,7 @@ yysetstate: YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) - goto yyexhaustedlab; + YYNOMEM; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE @@ -5061,6 +5090,7 @@ yysetstate: } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + if (yystate == YYFINAL) YYACCEPT; @@ -5173,302 +5203,328 @@ yyreduce: switch (yyn) { case 2: /* variable_identifier: IDENTIFIER */ -#line 392 "MachineIndependent/glslang.y" +#line 355 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string); } -#line 5181 "MachineIndependent/glslang_tab.cpp" +#line 5211 "MachineIndependent/glslang_tab.cpp" break; case 3: /* primary_expression: variable_identifier */ -#line 398 "MachineIndependent/glslang.y" +#line 361 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5189 "MachineIndependent/glslang_tab.cpp" +#line 5219 "MachineIndependent/glslang_tab.cpp" break; case 4: /* primary_expression: LEFT_PAREN expression RIGHT_PAREN */ -#line 401 "MachineIndependent/glslang.y" +#line 364 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode); if ((yyval.interm.intermTypedNode)->getAsConstantUnion()) (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression(); } -#line 5199 "MachineIndependent/glslang_tab.cpp" +#line 5229 "MachineIndependent/glslang_tab.cpp" break; case 5: /* primary_expression: FLOATCONSTANT */ -#line 406 "MachineIndependent/glslang.y" +#line 369 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 5207 "MachineIndependent/glslang_tab.cpp" +#line 5237 "MachineIndependent/glslang_tab.cpp" break; case 6: /* primary_expression: INTCONSTANT */ -#line 409 "MachineIndependent/glslang.y" +#line 372 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 5215 "MachineIndependent/glslang_tab.cpp" +#line 5245 "MachineIndependent/glslang_tab.cpp" break; case 7: /* primary_expression: UINTCONSTANT */ -#line 412 "MachineIndependent/glslang.y" +#line 375 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 5224 "MachineIndependent/glslang_tab.cpp" +#line 5254 "MachineIndependent/glslang_tab.cpp" break; case 8: /* primary_expression: BOOLCONSTANT */ -#line 416 "MachineIndependent/glslang.y" +#line 379 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 5232 "MachineIndependent/glslang_tab.cpp" +#line 5262 "MachineIndependent/glslang_tab.cpp" break; case 9: /* primary_expression: STRING_LITERAL */ -#line 420 "MachineIndependent/glslang.y" +#line 382 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true); } -#line 5240 "MachineIndependent/glslang_tab.cpp" +#line 5270 "MachineIndependent/glslang_tab.cpp" break; case 10: /* primary_expression: INT32CONSTANT */ -#line 423 "MachineIndependent/glslang.y" +#line 385 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 5249 "MachineIndependent/glslang_tab.cpp" +#line 5279 "MachineIndependent/glslang_tab.cpp" break; case 11: /* primary_expression: UINT32CONSTANT */ -#line 427 "MachineIndependent/glslang.y" +#line 389 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 5258 "MachineIndependent/glslang_tab.cpp" +#line 5288 "MachineIndependent/glslang_tab.cpp" break; case 12: /* primary_expression: INT64CONSTANT */ -#line 431 "MachineIndependent/glslang.y" +#line 393 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true); } -#line 5267 "MachineIndependent/glslang_tab.cpp" +#line 5297 "MachineIndependent/glslang_tab.cpp" break; case 13: /* primary_expression: UINT64CONSTANT */ -#line 435 "MachineIndependent/glslang.y" +#line 397 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true); } -#line 5276 "MachineIndependent/glslang_tab.cpp" +#line 5306 "MachineIndependent/glslang_tab.cpp" break; case 14: /* primary_expression: INT16CONSTANT */ -#line 439 "MachineIndependent/glslang.y" +#line 401 "MachineIndependent/glslang.y" { parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 5285 "MachineIndependent/glslang_tab.cpp" +#line 5315 "MachineIndependent/glslang_tab.cpp" break; case 15: /* primary_expression: UINT16CONSTANT */ -#line 443 "MachineIndependent/glslang.y" +#line 405 "MachineIndependent/glslang.y" { parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 5294 "MachineIndependent/glslang_tab.cpp" +#line 5324 "MachineIndependent/glslang_tab.cpp" break; case 16: /* primary_expression: DOUBLECONSTANT */ -#line 447 "MachineIndependent/glslang.y" +#line 409 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double literal"); if (! parseContext.symbolTable.atBuiltInLevel()) parseContext.doubleCheck((yyvsp[0].lex).loc, "double literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true); } -#line 5305 "MachineIndependent/glslang_tab.cpp" +#line 5335 "MachineIndependent/glslang_tab.cpp" break; case 17: /* primary_expression: FLOAT16CONSTANT */ -#line 453 "MachineIndependent/glslang.y" +#line 415 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true); } -#line 5314 "MachineIndependent/glslang_tab.cpp" +#line 5344 "MachineIndependent/glslang_tab.cpp" break; case 18: /* postfix_expression: primary_expression */ -#line 461 "MachineIndependent/glslang.y" +#line 422 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5322 "MachineIndependent/glslang_tab.cpp" +#line 5352 "MachineIndependent/glslang_tab.cpp" break; case 19: /* postfix_expression: postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET */ -#line 464 "MachineIndependent/glslang.y" +#line 425 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode)); } -#line 5330 "MachineIndependent/glslang_tab.cpp" +#line 5360 "MachineIndependent/glslang_tab.cpp" break; case 20: /* postfix_expression: function_call */ -#line 467 "MachineIndependent/glslang.y" +#line 428 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5338 "MachineIndependent/glslang_tab.cpp" +#line 5368 "MachineIndependent/glslang_tab.cpp" break; case 21: /* postfix_expression: postfix_expression DOT IDENTIFIER */ -#line 470 "MachineIndependent/glslang.y" +#line 431 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string); } -#line 5346 "MachineIndependent/glslang_tab.cpp" +#line 5376 "MachineIndependent/glslang_tab.cpp" break; case 22: /* postfix_expression: postfix_expression INC_OP */ -#line 473 "MachineIndependent/glslang.y" +#line 434 "MachineIndependent/glslang.y" { parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode)); parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "++", (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "++", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode)); } -#line 5356 "MachineIndependent/glslang_tab.cpp" +#line 5386 "MachineIndependent/glslang_tab.cpp" break; case 23: /* postfix_expression: postfix_expression DEC_OP */ -#line 478 "MachineIndependent/glslang.y" +#line 439 "MachineIndependent/glslang.y" { parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode)); parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "--", (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "--", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode)); } -#line 5366 "MachineIndependent/glslang_tab.cpp" +#line 5396 "MachineIndependent/glslang_tab.cpp" break; case 24: /* integer_expression: expression */ -#line 486 "MachineIndependent/glslang.y" +#line 447 "MachineIndependent/glslang.y" { parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), "[]"); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5375 "MachineIndependent/glslang_tab.cpp" +#line 5405 "MachineIndependent/glslang_tab.cpp" break; case 25: /* function_call: function_call_or_method */ -#line 493 "MachineIndependent/glslang.y" +#line 454 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode); delete (yyvsp[0].interm).function; } -#line 5384 "MachineIndependent/glslang_tab.cpp" +#line 5414 "MachineIndependent/glslang_tab.cpp" break; case 26: /* function_call_or_method: function_call_generic */ -#line 500 "MachineIndependent/glslang.y" +#line 461 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); } -#line 5392 "MachineIndependent/glslang_tab.cpp" +#line 5422 "MachineIndependent/glslang_tab.cpp" break; case 27: /* function_call_generic: function_call_header_with_parameters RIGHT_PAREN */ -#line 506 "MachineIndependent/glslang.y" +#line 467 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 5401 "MachineIndependent/glslang_tab.cpp" +#line 5431 "MachineIndependent/glslang_tab.cpp" break; case 28: /* function_call_generic: function_call_header_no_parameters RIGHT_PAREN */ -#line 510 "MachineIndependent/glslang.y" +#line 471 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 5410 "MachineIndependent/glslang_tab.cpp" +#line 5440 "MachineIndependent/glslang_tab.cpp" break; case 29: /* function_call_header_no_parameters: function_call_header VOID */ -#line 517 "MachineIndependent/glslang.y" +#line 478 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); } -#line 5418 "MachineIndependent/glslang_tab.cpp" +#line 5448 "MachineIndependent/glslang_tab.cpp" break; case 30: /* function_call_header_no_parameters: function_call_header */ -#line 520 "MachineIndependent/glslang.y" +#line 481 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); } -#line 5426 "MachineIndependent/glslang_tab.cpp" +#line 5456 "MachineIndependent/glslang_tab.cpp" break; case 31: /* function_call_header_with_parameters: function_call_header assignment_expression */ -#line 526 "MachineIndependent/glslang.y" +#line 487 "MachineIndependent/glslang.y" { - TParameter param = { 0, new TType }; - param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); - (yyvsp[-1].interm).function->addParameter(param); - (yyval.interm).function = (yyvsp[-1].interm).function; - (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode); + if (parseContext.spvVersion.vulkan > 0 + && parseContext.spvVersion.vulkanRelaxed + && (yyvsp[0].interm.intermTypedNode)->getType().containsOpaque()) + { + (yyval.interm).intermNode = parseContext.vkRelaxedRemapFunctionArgument((yyval.interm).loc, (yyvsp[-1].interm).function, (yyvsp[0].interm.intermTypedNode)); + (yyval.interm).function = (yyvsp[-1].interm).function; + } + else + { + TParameter param = { 0, new TType, {} }; + param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); + + (yyvsp[-1].interm).function->addParameter(param); + (yyval.interm).function = (yyvsp[-1].interm).function; + (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode); + } } -#line 5438 "MachineIndependent/glslang_tab.cpp" +#line 5479 "MachineIndependent/glslang_tab.cpp" break; case 32: /* function_call_header_with_parameters: function_call_header_with_parameters COMMA assignment_expression */ -#line 533 "MachineIndependent/glslang.y" +#line 505 "MachineIndependent/glslang.y" { - TParameter param = { 0, new TType }; - param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); - (yyvsp[-2].interm).function->addParameter(param); - (yyval.interm).function = (yyvsp[-2].interm).function; - (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); + if (parseContext.spvVersion.vulkan > 0 + && parseContext.spvVersion.vulkanRelaxed + && (yyvsp[0].interm.intermTypedNode)->getType().containsOpaque()) + { + TIntermNode* remappedNode = parseContext.vkRelaxedRemapFunctionArgument((yyvsp[-1].lex).loc, (yyvsp[-2].interm).function, (yyvsp[0].interm.intermTypedNode)); + if (remappedNode == (yyvsp[0].interm.intermTypedNode)) + (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); + else + (yyval.interm).intermNode = parseContext.intermediate.mergeAggregate((yyvsp[-2].interm).intermNode, remappedNode, (yyvsp[-1].lex).loc); + (yyval.interm).function = (yyvsp[-2].interm).function; + } + else + { + TParameter param = { 0, new TType, {} }; + param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); + + (yyvsp[-2].interm).function->addParameter(param); + (yyval.interm).function = (yyvsp[-2].interm).function; + (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); + } } -#line 5450 "MachineIndependent/glslang_tab.cpp" +#line 5506 "MachineIndependent/glslang_tab.cpp" break; case 33: /* function_call_header: function_identifier LEFT_PAREN */ -#line 543 "MachineIndependent/glslang.y" +#line 530 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); } -#line 5458 "MachineIndependent/glslang_tab.cpp" +#line 5514 "MachineIndependent/glslang_tab.cpp" break; case 34: /* function_identifier: type_specifier */ -#line 551 "MachineIndependent/glslang.y" +#line 538 "MachineIndependent/glslang.y" { // Constructor (yyval.interm).intermNode = 0; (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); } -#line 5468 "MachineIndependent/glslang_tab.cpp" +#line 5524 "MachineIndependent/glslang_tab.cpp" break; case 35: /* function_identifier: postfix_expression */ -#line 556 "MachineIndependent/glslang.y" +#line 543 "MachineIndependent/glslang.y" { // // Should be a method or subroutine call, but we haven't recognized the arguments yet. @@ -5496,50 +5552,50 @@ yyreduce: (yyval.interm).function = new TFunction(empty, TType(EbtVoid), EOpNull); } } -#line 5500 "MachineIndependent/glslang_tab.cpp" +#line 5556 "MachineIndependent/glslang_tab.cpp" break; case 36: /* function_identifier: non_uniform_qualifier */ -#line 584 "MachineIndependent/glslang.y" +#line 570 "MachineIndependent/glslang.y" { // Constructor (yyval.interm).intermNode = 0; (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); } -#line 5510 "MachineIndependent/glslang_tab.cpp" +#line 5566 "MachineIndependent/glslang_tab.cpp" break; case 37: /* unary_expression: postfix_expression */ -#line 593 "MachineIndependent/glslang.y" +#line 578 "MachineIndependent/glslang.y" { parseContext.variableCheck((yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode()) parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), ""); } -#line 5521 "MachineIndependent/glslang_tab.cpp" +#line 5577 "MachineIndependent/glslang_tab.cpp" break; case 38: /* unary_expression: INC_OP unary_expression */ -#line 599 "MachineIndependent/glslang.y" +#line 584 "MachineIndependent/glslang.y" { parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "++", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "++", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode)); } -#line 5530 "MachineIndependent/glslang_tab.cpp" +#line 5586 "MachineIndependent/glslang_tab.cpp" break; case 39: /* unary_expression: DEC_OP unary_expression */ -#line 603 "MachineIndependent/glslang.y" +#line 588 "MachineIndependent/glslang.y" { parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "--", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "--", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode)); } -#line 5539 "MachineIndependent/glslang_tab.cpp" +#line 5595 "MachineIndependent/glslang_tab.cpp" break; case 40: /* unary_expression: unary_operator unary_expression */ -#line 607 "MachineIndependent/glslang.y" +#line 592 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm).op != EOpNull) { char errorOp[2] = {0, 0}; @@ -5556,179 +5612,179 @@ yyreduce: (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression(); } } -#line 5560 "MachineIndependent/glslang_tab.cpp" +#line 5616 "MachineIndependent/glslang_tab.cpp" break; case 41: /* unary_operator: PLUS */ -#line 627 "MachineIndependent/glslang.y" +#line 612 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; } -#line 5566 "MachineIndependent/glslang_tab.cpp" +#line 5622 "MachineIndependent/glslang_tab.cpp" break; case 42: /* unary_operator: DASH */ -#line 628 "MachineIndependent/glslang.y" +#line 613 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; } -#line 5572 "MachineIndependent/glslang_tab.cpp" +#line 5628 "MachineIndependent/glslang_tab.cpp" break; case 43: /* unary_operator: BANG */ -#line 629 "MachineIndependent/glslang.y" +#line 614 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; } -#line 5578 "MachineIndependent/glslang_tab.cpp" +#line 5634 "MachineIndependent/glslang_tab.cpp" break; case 44: /* unary_operator: TILDE */ -#line 630 "MachineIndependent/glslang.y" +#line 615 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot; parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); } -#line 5585 "MachineIndependent/glslang_tab.cpp" +#line 5641 "MachineIndependent/glslang_tab.cpp" break; case 45: /* multiplicative_expression: unary_expression */ -#line 636 "MachineIndependent/glslang.y" +#line 621 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5591 "MachineIndependent/glslang_tab.cpp" +#line 5647 "MachineIndependent/glslang_tab.cpp" break; case 46: /* multiplicative_expression: multiplicative_expression STAR unary_expression */ -#line 637 "MachineIndependent/glslang.y" +#line 622 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "*", EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5601 "MachineIndependent/glslang_tab.cpp" +#line 5657 "MachineIndependent/glslang_tab.cpp" break; case 47: /* multiplicative_expression: multiplicative_expression SLASH unary_expression */ -#line 642 "MachineIndependent/glslang.y" +#line 627 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "/", EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5611 "MachineIndependent/glslang_tab.cpp" +#line 5667 "MachineIndependent/glslang_tab.cpp" break; case 48: /* multiplicative_expression: multiplicative_expression PERCENT unary_expression */ -#line 647 "MachineIndependent/glslang.y" +#line 632 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "%"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "%", EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5622 "MachineIndependent/glslang_tab.cpp" +#line 5678 "MachineIndependent/glslang_tab.cpp" break; case 49: /* additive_expression: multiplicative_expression */ -#line 656 "MachineIndependent/glslang.y" +#line 641 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5628 "MachineIndependent/glslang_tab.cpp" +#line 5684 "MachineIndependent/glslang_tab.cpp" break; case 50: /* additive_expression: additive_expression PLUS multiplicative_expression */ -#line 657 "MachineIndependent/glslang.y" +#line 642 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "+", EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5638 "MachineIndependent/glslang_tab.cpp" +#line 5694 "MachineIndependent/glslang_tab.cpp" break; case 51: /* additive_expression: additive_expression DASH multiplicative_expression */ -#line 662 "MachineIndependent/glslang.y" +#line 647 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "-", EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5648 "MachineIndependent/glslang_tab.cpp" +#line 5704 "MachineIndependent/glslang_tab.cpp" break; case 52: /* shift_expression: additive_expression */ -#line 670 "MachineIndependent/glslang.y" +#line 655 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5654 "MachineIndependent/glslang_tab.cpp" +#line 5710 "MachineIndependent/glslang_tab.cpp" break; case 53: /* shift_expression: shift_expression LEFT_OP additive_expression */ -#line 671 "MachineIndependent/glslang.y" +#line 656 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift left"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<<", EOpLeftShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5665 "MachineIndependent/glslang_tab.cpp" +#line 5721 "MachineIndependent/glslang_tab.cpp" break; case 54: /* shift_expression: shift_expression RIGHT_OP additive_expression */ -#line 677 "MachineIndependent/glslang.y" +#line 662 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift right"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">>", EOpRightShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5676 "MachineIndependent/glslang_tab.cpp" +#line 5732 "MachineIndependent/glslang_tab.cpp" break; case 55: /* relational_expression: shift_expression */ -#line 686 "MachineIndependent/glslang.y" +#line 671 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5682 "MachineIndependent/glslang_tab.cpp" +#line 5738 "MachineIndependent/glslang_tab.cpp" break; case 56: /* relational_expression: relational_expression LEFT_ANGLE shift_expression */ -#line 687 "MachineIndependent/glslang.y" +#line 672 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<", EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5692 "MachineIndependent/glslang_tab.cpp" +#line 5748 "MachineIndependent/glslang_tab.cpp" break; case 57: /* relational_expression: relational_expression RIGHT_ANGLE shift_expression */ -#line 692 "MachineIndependent/glslang.y" +#line 677 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">", EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5702 "MachineIndependent/glslang_tab.cpp" +#line 5758 "MachineIndependent/glslang_tab.cpp" break; case 58: /* relational_expression: relational_expression LE_OP shift_expression */ -#line 697 "MachineIndependent/glslang.y" +#line 682 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<=", EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5712 "MachineIndependent/glslang_tab.cpp" +#line 5768 "MachineIndependent/glslang_tab.cpp" break; case 59: /* relational_expression: relational_expression GE_OP shift_expression */ -#line 702 "MachineIndependent/glslang.y" +#line 687 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">=", EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5722 "MachineIndependent/glslang_tab.cpp" +#line 5778 "MachineIndependent/glslang_tab.cpp" break; case 60: /* equality_expression: relational_expression */ -#line 710 "MachineIndependent/glslang.y" +#line 695 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5728 "MachineIndependent/glslang_tab.cpp" +#line 5784 "MachineIndependent/glslang_tab.cpp" break; case 61: /* equality_expression: equality_expression EQ_OP relational_expression */ -#line 711 "MachineIndependent/glslang.y" +#line 696 "MachineIndependent/glslang.y" { parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison"); parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=="); @@ -5738,11 +5794,11 @@ yyreduce: if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5742 "MachineIndependent/glslang_tab.cpp" +#line 5798 "MachineIndependent/glslang_tab.cpp" break; case 62: /* equality_expression: equality_expression NE_OP relational_expression */ -#line 720 "MachineIndependent/glslang.y" +#line 705 "MachineIndependent/glslang.y" { parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison"); parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!="); @@ -5752,124 +5808,124 @@ yyreduce: if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5756 "MachineIndependent/glslang_tab.cpp" +#line 5812 "MachineIndependent/glslang_tab.cpp" break; case 63: /* and_expression: equality_expression */ -#line 732 "MachineIndependent/glslang.y" +#line 717 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5762 "MachineIndependent/glslang_tab.cpp" +#line 5818 "MachineIndependent/glslang_tab.cpp" break; case 64: /* and_expression: and_expression AMPERSAND equality_expression */ -#line 733 "MachineIndependent/glslang.y" +#line 718 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise and"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5773 "MachineIndependent/glslang_tab.cpp" +#line 5829 "MachineIndependent/glslang_tab.cpp" break; case 65: /* exclusive_or_expression: and_expression */ -#line 742 "MachineIndependent/glslang.y" +#line 727 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5779 "MachineIndependent/glslang_tab.cpp" +#line 5835 "MachineIndependent/glslang_tab.cpp" break; case 66: /* exclusive_or_expression: exclusive_or_expression CARET and_expression */ -#line 743 "MachineIndependent/glslang.y" +#line 728 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise exclusive or"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5790 "MachineIndependent/glslang_tab.cpp" +#line 5846 "MachineIndependent/glslang_tab.cpp" break; case 67: /* inclusive_or_expression: exclusive_or_expression */ -#line 752 "MachineIndependent/glslang.y" +#line 737 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5796 "MachineIndependent/glslang_tab.cpp" +#line 5852 "MachineIndependent/glslang_tab.cpp" break; case 68: /* inclusive_or_expression: inclusive_or_expression VERTICAL_BAR exclusive_or_expression */ -#line 753 "MachineIndependent/glslang.y" +#line 738 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise inclusive or"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "|", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5807 "MachineIndependent/glslang_tab.cpp" +#line 5863 "MachineIndependent/glslang_tab.cpp" break; case 69: /* logical_and_expression: inclusive_or_expression */ -#line 762 "MachineIndependent/glslang.y" +#line 747 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5813 "MachineIndependent/glslang_tab.cpp" +#line 5869 "MachineIndependent/glslang_tab.cpp" break; case 70: /* logical_and_expression: logical_and_expression AND_OP inclusive_or_expression */ -#line 763 "MachineIndependent/glslang.y" +#line 748 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&&", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5823 "MachineIndependent/glslang_tab.cpp" +#line 5879 "MachineIndependent/glslang_tab.cpp" break; case 71: /* logical_xor_expression: logical_and_expression */ -#line 771 "MachineIndependent/glslang.y" +#line 756 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5829 "MachineIndependent/glslang_tab.cpp" +#line 5885 "MachineIndependent/glslang_tab.cpp" break; case 72: /* logical_xor_expression: logical_xor_expression XOR_OP logical_and_expression */ -#line 772 "MachineIndependent/glslang.y" +#line 757 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^^", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5839 "MachineIndependent/glslang_tab.cpp" +#line 5895 "MachineIndependent/glslang_tab.cpp" break; case 73: /* logical_or_expression: logical_xor_expression */ -#line 780 "MachineIndependent/glslang.y" +#line 765 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5845 "MachineIndependent/glslang_tab.cpp" +#line 5901 "MachineIndependent/glslang_tab.cpp" break; case 74: /* logical_or_expression: logical_or_expression OR_OP logical_xor_expression */ -#line 781 "MachineIndependent/glslang.y" +#line 766 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "||", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5855 "MachineIndependent/glslang_tab.cpp" +#line 5911 "MachineIndependent/glslang_tab.cpp" break; case 75: /* conditional_expression: logical_or_expression */ -#line 789 "MachineIndependent/glslang.y" +#line 774 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5861 "MachineIndependent/glslang_tab.cpp" +#line 5917 "MachineIndependent/glslang_tab.cpp" break; case 76: /* $@1: %empty */ -#line 790 "MachineIndependent/glslang.y" +#line 775 "MachineIndependent/glslang.y" { ++parseContext.controlFlowNestingLevel; } -#line 5869 "MachineIndependent/glslang_tab.cpp" +#line 5925 "MachineIndependent/glslang_tab.cpp" break; case 77: /* conditional_expression: logical_or_expression QUESTION $@1 expression COLON assignment_expression */ -#line 793 "MachineIndependent/glslang.y" +#line 778 "MachineIndependent/glslang.y" { --parseContext.controlFlowNestingLevel; parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode)); @@ -5878,21 +5934,21 @@ yyreduce: parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, ":", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.intermediate.addSelection((yyvsp[-5].interm.intermTypedNode), (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-4].lex).loc); if ((yyval.interm.intermTypedNode) == 0) { - parseContext.binaryOpError((yyvsp[-4].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); + parseContext.binaryOpError((yyvsp[-4].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } } -#line 5886 "MachineIndependent/glslang_tab.cpp" +#line 5942 "MachineIndependent/glslang_tab.cpp" break; case 78: /* assignment_expression: conditional_expression */ -#line 808 "MachineIndependent/glslang.y" +#line 793 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5892 "MachineIndependent/glslang_tab.cpp" +#line 5948 "MachineIndependent/glslang_tab.cpp" break; case 79: /* assignment_expression: unary_expression assignment_operator assignment_expression */ -#line 809 "MachineIndependent/glslang.y" +#line 794 "MachineIndependent/glslang.y" { parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array assignment"); parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "="); @@ -5902,155 +5958,155 @@ yyreduce: parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.addAssign((yyvsp[-1].interm).loc, (yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) { - parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); + parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } } -#line 5910 "MachineIndependent/glslang_tab.cpp" +#line 5966 "MachineIndependent/glslang_tab.cpp" break; case 80: /* assignment_operator: EQUAL */ -#line 825 "MachineIndependent/glslang.y" +#line 810 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAssign; } -#line 5919 "MachineIndependent/glslang_tab.cpp" +#line 5975 "MachineIndependent/glslang_tab.cpp" break; case 81: /* assignment_operator: MUL_ASSIGN */ -#line 829 "MachineIndependent/glslang.y" +#line 814 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpMulAssign; } -#line 5928 "MachineIndependent/glslang_tab.cpp" +#line 5984 "MachineIndependent/glslang_tab.cpp" break; case 82: /* assignment_operator: DIV_ASSIGN */ -#line 833 "MachineIndependent/glslang.y" +#line 818 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpDivAssign; } -#line 5937 "MachineIndependent/glslang_tab.cpp" +#line 5993 "MachineIndependent/glslang_tab.cpp" break; case 83: /* assignment_operator: MOD_ASSIGN */ -#line 837 "MachineIndependent/glslang.y" +#line 822 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "%="); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpModAssign; } -#line 5947 "MachineIndependent/glslang_tab.cpp" +#line 6003 "MachineIndependent/glslang_tab.cpp" break; case 84: /* assignment_operator: ADD_ASSIGN */ -#line 842 "MachineIndependent/glslang.y" +#line 827 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAddAssign; } -#line 5956 "MachineIndependent/glslang_tab.cpp" +#line 6012 "MachineIndependent/glslang_tab.cpp" break; case 85: /* assignment_operator: SUB_ASSIGN */ -#line 846 "MachineIndependent/glslang.y" +#line 831 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpSubAssign; } -#line 5965 "MachineIndependent/glslang_tab.cpp" +#line 6021 "MachineIndependent/glslang_tab.cpp" break; case 86: /* assignment_operator: LEFT_ASSIGN */ -#line 850 "MachineIndependent/glslang.y" +#line 835 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign; } -#line 5974 "MachineIndependent/glslang_tab.cpp" +#line 6030 "MachineIndependent/glslang_tab.cpp" break; case 87: /* assignment_operator: RIGHT_ASSIGN */ -#line 854 "MachineIndependent/glslang.y" +#line 839 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign; } -#line 5983 "MachineIndependent/glslang_tab.cpp" +#line 6039 "MachineIndependent/glslang_tab.cpp" break; case 88: /* assignment_operator: AND_ASSIGN */ -#line 858 "MachineIndependent/glslang.y" +#line 843 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign; } -#line 5992 "MachineIndependent/glslang_tab.cpp" +#line 6048 "MachineIndependent/glslang_tab.cpp" break; case 89: /* assignment_operator: XOR_ASSIGN */ -#line 862 "MachineIndependent/glslang.y" +#line 847 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign; } -#line 6001 "MachineIndependent/glslang_tab.cpp" +#line 6057 "MachineIndependent/glslang_tab.cpp" break; case 90: /* assignment_operator: OR_ASSIGN */ -#line 866 "MachineIndependent/glslang.y" +#line 851 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign; } -#line 6010 "MachineIndependent/glslang_tab.cpp" +#line 6066 "MachineIndependent/glslang_tab.cpp" break; case 91: /* expression: assignment_expression */ -#line 873 "MachineIndependent/glslang.y" +#line 858 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 6018 "MachineIndependent/glslang_tab.cpp" +#line 6074 "MachineIndependent/glslang_tab.cpp" break; case 92: /* expression: expression COMMA assignment_expression */ -#line 876 "MachineIndependent/glslang.y" +#line 861 "MachineIndependent/glslang.y" { parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); if ((yyval.interm.intermTypedNode) == 0) { - parseContext.binaryOpError((yyvsp[-1].lex).loc, ",", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString()); + parseContext.binaryOpError((yyvsp[-1].lex).loc, ",", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } } -#line 6031 "MachineIndependent/glslang_tab.cpp" +#line 6087 "MachineIndependent/glslang_tab.cpp" break; case 93: /* constant_expression: conditional_expression */ -#line 887 "MachineIndependent/glslang.y" +#line 872 "MachineIndependent/glslang.y" { parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), ""); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 6040 "MachineIndependent/glslang_tab.cpp" +#line 6096 "MachineIndependent/glslang_tab.cpp" break; case 94: /* declaration: function_prototype SEMICOLON */ -#line 894 "MachineIndependent/glslang.y" +#line 879 "MachineIndependent/glslang.y" { parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */); (yyval.interm.intermNode) = 0; // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature } -#line 6050 "MachineIndependent/glslang_tab.cpp" +#line 6106 "MachineIndependent/glslang_tab.cpp" break; case 95: /* declaration: spirv_instruction_qualifier function_prototype SEMICOLON */ -#line 900 "MachineIndependent/glslang.y" +#line 884 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[-1].interm).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V instruction qualifier"); (yyvsp[-1].interm).function->setSpirvInstruction(*(yyvsp[-2].interm.spirvInst)); // Attach SPIR-V intruction qualifier @@ -6058,31 +6114,31 @@ yyreduce: (yyval.interm.intermNode) = 0; // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature } -#line 6062 "MachineIndependent/glslang_tab.cpp" +#line 6118 "MachineIndependent/glslang_tab.cpp" break; case 96: /* declaration: spirv_execution_mode_qualifier SEMICOLON */ -#line 907 "MachineIndependent/glslang.y" +#line 891 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "SPIR-V execution mode qualifier"); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V execution mode qualifier"); (yyval.interm.intermNode) = 0; } -#line 6072 "MachineIndependent/glslang_tab.cpp" +#line 6128 "MachineIndependent/glslang_tab.cpp" break; case 97: /* declaration: init_declarator_list SEMICOLON */ -#line 913 "MachineIndependent/glslang.y" +#line 896 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate()) (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence); (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode; } -#line 6082 "MachineIndependent/glslang_tab.cpp" +#line 6138 "MachineIndependent/glslang_tab.cpp" break; case 98: /* declaration: PRECISION precision_qualifier type_specifier SEMICOLON */ -#line 918 "MachineIndependent/glslang.y" +#line 901 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, "precision statement"); // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope @@ -6090,75 +6146,75 @@ yyreduce: parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision); (yyval.interm.intermNode) = 0; } -#line 6094 "MachineIndependent/glslang_tab.cpp" +#line 6150 "MachineIndependent/glslang_tab.cpp" break; case 99: /* declaration: block_structure SEMICOLON */ -#line 925 "MachineIndependent/glslang.y" +#line 908 "MachineIndependent/glslang.y" { parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList); (yyval.interm.intermNode) = 0; } -#line 6103 "MachineIndependent/glslang_tab.cpp" +#line 6159 "MachineIndependent/glslang_tab.cpp" break; case 100: /* declaration: block_structure IDENTIFIER SEMICOLON */ -#line 929 "MachineIndependent/glslang.y" +#line 912 "MachineIndependent/glslang.y" { parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string); (yyval.interm.intermNode) = 0; } -#line 6112 "MachineIndependent/glslang_tab.cpp" +#line 6168 "MachineIndependent/glslang_tab.cpp" break; case 101: /* declaration: block_structure IDENTIFIER array_specifier SEMICOLON */ -#line 933 "MachineIndependent/glslang.y" +#line 916 "MachineIndependent/glslang.y" { parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes); (yyval.interm.intermNode) = 0; } -#line 6121 "MachineIndependent/glslang_tab.cpp" +#line 6177 "MachineIndependent/glslang_tab.cpp" break; case 102: /* declaration: type_qualifier SEMICOLON */ -#line 937 "MachineIndependent/glslang.y" +#line 920 "MachineIndependent/glslang.y" { parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type)); (yyval.interm.intermNode) = 0; } -#line 6131 "MachineIndependent/glslang_tab.cpp" +#line 6187 "MachineIndependent/glslang_tab.cpp" break; case 103: /* declaration: type_qualifier IDENTIFIER SEMICOLON */ -#line 942 "MachineIndependent/glslang.y" +#line 925 "MachineIndependent/glslang.y" { parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers); parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string); (yyval.interm.intermNode) = 0; } -#line 6141 "MachineIndependent/glslang_tab.cpp" +#line 6197 "MachineIndependent/glslang_tab.cpp" break; case 104: /* declaration: type_qualifier IDENTIFIER identifier_list SEMICOLON */ -#line 947 "MachineIndependent/glslang.y" +#line 930 "MachineIndependent/glslang.y" { parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers); (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string); parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList)); (yyval.interm.intermNode) = 0; } -#line 6152 "MachineIndependent/glslang_tab.cpp" +#line 6208 "MachineIndependent/glslang_tab.cpp" break; case 105: /* $@2: %empty */ -#line 956 "MachineIndependent/glslang.y" +#line 939 "MachineIndependent/glslang.y" { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); } -#line 6158 "MachineIndependent/glslang_tab.cpp" +#line 6214 "MachineIndependent/glslang_tab.cpp" break; case 106: /* block_structure: type_qualifier IDENTIFIER LEFT_BRACE $@2 struct_declaration_list RIGHT_BRACE */ -#line 956 "MachineIndependent/glslang.y" +#line 939 "MachineIndependent/glslang.y" { --parseContext.blockNestingLevel; parseContext.blockName = (yyvsp[-4].lex).string; @@ -6168,101 +6224,113 @@ yyreduce: (yyval.interm).loc = (yyvsp[-5].interm.type).loc; (yyval.interm).typeList = (yyvsp[-1].interm.typeList); } -#line 6172 "MachineIndependent/glslang_tab.cpp" +#line 6228 "MachineIndependent/glslang_tab.cpp" break; case 107: /* identifier_list: COMMA IDENTIFIER */ -#line 967 "MachineIndependent/glslang.y" +#line 950 "MachineIndependent/glslang.y" { (yyval.interm.identifierList) = new TIdentifierList; (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); } -#line 6181 "MachineIndependent/glslang_tab.cpp" +#line 6237 "MachineIndependent/glslang_tab.cpp" break; case 108: /* identifier_list: identifier_list COMMA IDENTIFIER */ -#line 971 "MachineIndependent/glslang.y" +#line 954 "MachineIndependent/glslang.y" { (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList); (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); } -#line 6190 "MachineIndependent/glslang_tab.cpp" +#line 6246 "MachineIndependent/glslang_tab.cpp" break; case 109: /* function_prototype: function_declarator RIGHT_PAREN */ -#line 978 "MachineIndependent/glslang.y" +#line 961 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-1].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 6199 "MachineIndependent/glslang_tab.cpp" +#line 6256 "MachineIndependent/glslang_tab.cpp" break; case 110: /* function_prototype: function_declarator RIGHT_PAREN attribute */ -#line 982 "MachineIndependent/glslang.y" +#line 966 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-2].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[-1].lex).loc; - parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes), (yyval.interm).function); + const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence }; + parseContext.requireExtensions((yyvsp[-1].lex).loc, 2, extensions, "attribute"); + parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes)); } -#line 6210 "MachineIndependent/glslang_tab.cpp" +#line 6269 "MachineIndependent/glslang_tab.cpp" break; case 111: /* function_prototype: attribute function_declarator RIGHT_PAREN */ -#line 988 "MachineIndependent/glslang.y" +#line 974 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-1].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[0].lex).loc; - parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes((yyvsp[0].lex).loc, *(yyvsp[-2].interm.attributes), (yyval.interm).function); + const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence }; + parseContext.requireExtensions((yyvsp[0].lex).loc, 2, extensions, "attribute"); + parseContext.handleFunctionAttributes((yyvsp[0].lex).loc, *(yyvsp[-2].interm.attributes)); } -#line 6221 "MachineIndependent/glslang_tab.cpp" +#line 6282 "MachineIndependent/glslang_tab.cpp" break; case 112: /* function_prototype: attribute function_declarator RIGHT_PAREN attribute */ -#line 994 "MachineIndependent/glslang.y" +#line 982 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-2].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[-1].lex).loc; - parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[-3].interm.attributes), (yyval.interm).function); - parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes), (yyval.interm).function); + const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence }; + parseContext.requireExtensions((yyvsp[-1].lex).loc, 2, extensions, "attribute"); + parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[-3].interm.attributes)); + parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes)); } -#line 6233 "MachineIndependent/glslang_tab.cpp" +#line 6296 "MachineIndependent/glslang_tab.cpp" break; case 113: /* function_declarator: function_header */ -#line 1004 "MachineIndependent/glslang.y" +#line 994 "MachineIndependent/glslang.y" { (yyval.interm.function) = (yyvsp[0].interm.function); } -#line 6241 "MachineIndependent/glslang_tab.cpp" +#line 6304 "MachineIndependent/glslang_tab.cpp" break; case 114: /* function_declarator: function_header_with_parameters */ -#line 1007 "MachineIndependent/glslang.y" +#line 997 "MachineIndependent/glslang.y" { (yyval.interm.function) = (yyvsp[0].interm.function); } -#line 6249 "MachineIndependent/glslang_tab.cpp" +#line 6312 "MachineIndependent/glslang_tab.cpp" break; case 115: /* function_header_with_parameters: function_header parameter_declaration */ -#line 1014 "MachineIndependent/glslang.y" +#line 1004 "MachineIndependent/glslang.y" { // Add the parameter (yyval.interm.function) = (yyvsp[-1].interm.function); if ((yyvsp[0].interm).param.type->getBasicType() != EbtVoid) - (yyvsp[-1].interm.function)->addParameter((yyvsp[0].interm).param); + { + if (!(parseContext.spvVersion.vulkan > 0 && parseContext.spvVersion.vulkanRelaxed)) + (yyvsp[-1].interm.function)->addParameter((yyvsp[0].interm).param); + else + parseContext.vkRelaxedRemapFunctionParameter((yyvsp[-1].interm.function), (yyvsp[0].interm).param); + } else delete (yyvsp[0].interm).param.type; } -#line 6262 "MachineIndependent/glslang_tab.cpp" +#line 6330 "MachineIndependent/glslang_tab.cpp" break; case 116: /* function_header_with_parameters: function_header_with_parameters COMMA parameter_declaration */ -#line 1022 "MachineIndependent/glslang.y" +#line 1017 "MachineIndependent/glslang.y" { // // Only first parameter of one-parameter functions can be void @@ -6277,14 +6345,17 @@ yyreduce: } else { // Add the parameter (yyval.interm.function) = (yyvsp[-2].interm.function); - (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param); + if (!(parseContext.spvVersion.vulkan > 0 && parseContext.spvVersion.vulkanRelaxed)) + (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param); + else + parseContext.vkRelaxedRemapFunctionParameter((yyvsp[-2].interm.function), (yyvsp[0].interm).param); } } -#line 6284 "MachineIndependent/glslang_tab.cpp" +#line 6355 "MachineIndependent/glslang_tab.cpp" break; case 117: /* function_header: fully_specified_type IDENTIFIER LEFT_PAREN */ -#line 1042 "MachineIndependent/glslang.y" +#line 1040 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) { parseContext.error((yyvsp[-1].lex).loc, "no qualifiers allowed for function return", @@ -6304,11 +6375,11 @@ yyreduce: function = new TFunction((yyvsp[-1].lex).string, type); (yyval.interm.function) = function; } -#line 6308 "MachineIndependent/glslang_tab.cpp" +#line 6379 "MachineIndependent/glslang_tab.cpp" break; case 118: /* parameter_declarator: type_specifier IDENTIFIER */ -#line 1065 "MachineIndependent/glslang.y" +#line 1063 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -6320,15 +6391,15 @@ yyreduce: } parseContext.reservedErrorCheck((yyvsp[0].lex).loc, *(yyvsp[0].lex).string); - TParameter param = {(yyvsp[0].lex).string, new TType((yyvsp[-1].interm.type))}; + TParameter param = {(yyvsp[0].lex).string, new TType((yyvsp[-1].interm.type)), {}}; (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).param = param; } -#line 6328 "MachineIndependent/glslang_tab.cpp" +#line 6399 "MachineIndependent/glslang_tab.cpp" break; case 119: /* parameter_declarator: type_specifier IDENTIFIER array_specifier */ -#line 1080 "MachineIndependent/glslang.y" +#line 1078 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -6343,180 +6414,178 @@ yyreduce: parseContext.arraySizeRequiredCheck((yyvsp[0].interm).loc, *(yyvsp[0].interm).arraySizes); parseContext.reservedErrorCheck((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string); - TParameter param = { (yyvsp[-1].lex).string, type }; + TParameter param = { (yyvsp[-1].lex).string, type, {} }; (yyval.interm).loc = (yyvsp[-1].lex).loc; (yyval.interm).param = param; } -#line 6352 "MachineIndependent/glslang_tab.cpp" +#line 6423 "MachineIndependent/glslang_tab.cpp" break; case 120: /* parameter_declaration: type_qualifier parameter_declarator */ -#line 1105 "MachineIndependent/glslang.y" +#line 1103 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); } -#line 6368 "MachineIndependent/glslang_tab.cpp" +#line 6439 "MachineIndependent/glslang_tab.cpp" break; case 121: /* parameter_declaration: parameter_declarator */ -#line 1116 "MachineIndependent/glslang.y" +#line 1114 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); } -#line 6380 "MachineIndependent/glslang_tab.cpp" +#line 6451 "MachineIndependent/glslang_tab.cpp" break; case 122: /* parameter_declaration: type_qualifier parameter_type_specifier */ -#line 1126 "MachineIndependent/glslang.y" +#line 1124 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; - parseContext.precisionQualifierCheck((yyvsp[-1].interm.type).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyvsp[-1].interm.type).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); } -#line 6395 "MachineIndependent/glslang_tab.cpp" +#line 6466 "MachineIndependent/glslang_tab.cpp" break; case 123: /* parameter_declaration: parameter_type_specifier */ -#line 1136 "MachineIndependent/glslang.y" +#line 1134 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); } -#line 6407 "MachineIndependent/glslang_tab.cpp" +#line 6478 "MachineIndependent/glslang_tab.cpp" break; case 124: /* parameter_type_specifier: type_specifier */ -#line 1146 "MachineIndependent/glslang.y" +#line 1144 "MachineIndependent/glslang.y" { - TParameter param = { 0, new TType((yyvsp[0].interm.type)) }; + TParameter param = { 0, new TType((yyvsp[0].interm.type)), {} }; (yyval.interm).param = param; if ((yyvsp[0].interm.type).arraySizes) parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes); } -#line 6418 "MachineIndependent/glslang_tab.cpp" +#line 6489 "MachineIndependent/glslang_tab.cpp" break; case 125: /* init_declarator_list: single_declaration */ -#line 1155 "MachineIndependent/glslang.y" +#line 1153 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); } -#line 6426 "MachineIndependent/glslang_tab.cpp" +#line 6497 "MachineIndependent/glslang_tab.cpp" break; case 126: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER */ -#line 1158 "MachineIndependent/glslang.y" +#line 1156 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-2].interm); parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type); } -#line 6435 "MachineIndependent/glslang_tab.cpp" +#line 6506 "MachineIndependent/glslang_tab.cpp" break; case 127: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier */ -#line 1162 "MachineIndependent/glslang.y" +#line 1160 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-3].interm); parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes); } -#line 6444 "MachineIndependent/glslang_tab.cpp" +#line 6515 "MachineIndependent/glslang_tab.cpp" break; case 128: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer */ -#line 1166 "MachineIndependent/glslang.y" +#line 1164 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-5].interm).type; TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc); } -#line 6454 "MachineIndependent/glslang_tab.cpp" +#line 6525 "MachineIndependent/glslang_tab.cpp" break; case 129: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER EQUAL initializer */ -#line 1171 "MachineIndependent/glslang.y" +#line 1169 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-4].interm).type; TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc); } -#line 6464 "MachineIndependent/glslang_tab.cpp" +#line 6535 "MachineIndependent/glslang_tab.cpp" break; case 130: /* single_declaration: fully_specified_type */ -#line 1179 "MachineIndependent/glslang.y" +#line 1177 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[0].interm.type); (yyval.interm).intermNode = 0; - parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type); - } -#line 6476 "MachineIndependent/glslang_tab.cpp" +#line 6545 "MachineIndependent/glslang_tab.cpp" break; case 131: /* single_declaration: fully_specified_type IDENTIFIER */ -#line 1186 "MachineIndependent/glslang.y" +#line 1182 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-1].interm.type); (yyval.interm).intermNode = 0; parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type)); } -#line 6486 "MachineIndependent/glslang_tab.cpp" +#line 6555 "MachineIndependent/glslang_tab.cpp" break; case 132: /* single_declaration: fully_specified_type IDENTIFIER array_specifier */ -#line 1191 "MachineIndependent/glslang.y" +#line 1187 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-2].interm.type); (yyval.interm).intermNode = 0; parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes); } -#line 6496 "MachineIndependent/glslang_tab.cpp" +#line 6565 "MachineIndependent/glslang_tab.cpp" break; case 133: /* single_declaration: fully_specified_type IDENTIFIER array_specifier EQUAL initializer */ -#line 1196 "MachineIndependent/glslang.y" +#line 1192 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-4].interm.type); TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); } -#line 6506 "MachineIndependent/glslang_tab.cpp" +#line 6575 "MachineIndependent/glslang_tab.cpp" break; case 134: /* single_declaration: fully_specified_type IDENTIFIER EQUAL initializer */ -#line 1201 "MachineIndependent/glslang.y" +#line 1197 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-3].interm.type); TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); } -#line 6516 "MachineIndependent/glslang_tab.cpp" +#line 6585 "MachineIndependent/glslang_tab.cpp" break; case 135: /* fully_specified_type: type_specifier */ -#line 1210 "MachineIndependent/glslang.y" +#line 1206 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); @@ -6525,15 +6594,15 @@ yyreduce: parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); } - parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier); + parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier, (yyval.interm.type).isCoopmat()); } -#line 6531 "MachineIndependent/glslang_tab.cpp" +#line 6600 "MachineIndependent/glslang_tab.cpp" break; case 136: /* fully_specified_type: type_qualifier type_specifier */ -#line 1220 "MachineIndependent/glslang.y" +#line 1216 "MachineIndependent/glslang.y" { - parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); + parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, false, &(yyvsp[0].interm.type)); parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type)); if ((yyvsp[0].interm.type).arraySizes) { @@ -6547,7 +6616,7 @@ yyreduce: parseContext.checkNoShaderLayouts((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); (yyvsp[0].interm.type).shaderQualifiers.merge((yyvsp[-1].interm.type).shaderQualifiers); parseContext.mergeQualifiers((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyvsp[-1].interm.type).qualifier, true); - parseContext.precisionQualifierCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).basicType, (yyvsp[0].interm.type).qualifier); + parseContext.precisionQualifierCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).basicType, (yyvsp[0].interm.type).qualifier, (yyvsp[0].interm.type).isCoopmat()); (yyval.interm.type) = (yyvsp[0].interm.type); @@ -6556,22 +6625,22 @@ yyreduce: (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn))) (yyval.interm.type).qualifier.smooth = true; } -#line 6560 "MachineIndependent/glslang_tab.cpp" +#line 6629 "MachineIndependent/glslang_tab.cpp" break; case 137: /* invariant_qualifier: INVARIANT */ -#line 1247 "MachineIndependent/glslang.y" +#line 1243 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "invariant"); parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, "invariant"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.invariant = true; } -#line 6571 "MachineIndependent/glslang_tab.cpp" +#line 6640 "MachineIndependent/glslang_tab.cpp" break; case 138: /* interpolation_qualifier: SMOOTH */ -#line 1256 "MachineIndependent/glslang.y" +#line 1252 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "smooth"); parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "smooth"); @@ -6579,11 +6648,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.smooth = true; } -#line 6583 "MachineIndependent/glslang_tab.cpp" +#line 6652 "MachineIndependent/glslang_tab.cpp" break; case 139: /* interpolation_qualifier: FLAT */ -#line 1263 "MachineIndependent/glslang.y" +#line 1259 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "flat"); parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "flat"); @@ -6591,11 +6660,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.flat = true; } -#line 6595 "MachineIndependent/glslang_tab.cpp" +#line 6664 "MachineIndependent/glslang_tab.cpp" break; case 140: /* interpolation_qualifier: NOPERSPECTIVE */ -#line 1271 "MachineIndependent/glslang.y" +#line 1266 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective"); parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective"); @@ -6603,11 +6672,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.nopersp = true; } -#line 6607 "MachineIndependent/glslang_tab.cpp" +#line 6676 "MachineIndependent/glslang_tab.cpp" break; case 141: /* interpolation_qualifier: EXPLICITINTERPAMD */ -#line 1278 "MachineIndependent/glslang.y" +#line 1273 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD"); parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); @@ -6615,11 +6684,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.explicitInterp = true; } -#line 6619 "MachineIndependent/glslang_tab.cpp" +#line 6688 "MachineIndependent/glslang_tab.cpp" break; case 142: /* interpolation_qualifier: PERVERTEXNV */ -#line 1285 "MachineIndependent/glslang.y" +#line 1280 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "pervertexNV"); parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric"); @@ -6628,123 +6697,151 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.pervertexNV = true; } -#line 6632 "MachineIndependent/glslang_tab.cpp" +#line 6701 "MachineIndependent/glslang_tab.cpp" break; - case 143: /* interpolation_qualifier: PERPRIMITIVENV */ -#line 1293 "MachineIndependent/glslang.y" + case 143: /* interpolation_qualifier: PERVERTEXEXT */ +#line 1288 "MachineIndependent/glslang.y" + { + parseContext.globalCheck((yyvsp[0].lex).loc, "pervertexEXT"); + parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); + parseContext.profileRequires((yyvsp[0].lex).loc, ECompatibilityProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); + parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.pervertexEXT = true; + } +#line 6714 "MachineIndependent/glslang_tab.cpp" + break; + + case 144: /* interpolation_qualifier: PERPRIMITIVENV */ +#line 1296 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "perprimitiveNV"); - parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshNVMask), "perprimitiveNV"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), "perprimitiveNV"); // Fragment shader stage doesn't check for extension. So we explicitly add below extension check. if (parseContext.language == EShLangFragment) parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_NV_mesh_shader, "perprimitiveNV"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.perPrimitiveNV = true; } -#line 6647 "MachineIndependent/glslang_tab.cpp" +#line 6729 "MachineIndependent/glslang_tab.cpp" break; - case 144: /* interpolation_qualifier: PERVIEWNV */ -#line 1303 "MachineIndependent/glslang.y" + case 145: /* interpolation_qualifier: PERPRIMITIVEEXT */ +#line 1306 "MachineIndependent/glslang.y" + { + // No need for profile version or extension check. Shader stage already checks both. + parseContext.globalCheck((yyvsp[0].lex).loc, "perprimitiveEXT"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), "perprimitiveEXT"); + // Fragment shader stage doesn't check for extension. So we explicitly add below extension check. + if (parseContext.language == EShLangFragment) + parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_mesh_shader, "perprimitiveEXT"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.perPrimitiveNV = true; + } +#line 6744 "MachineIndependent/glslang_tab.cpp" + break; + + case 146: /* interpolation_qualifier: PERVIEWNV */ +#line 1316 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "perviewNV"); - parseContext.requireStage((yyvsp[0].lex).loc, EShLangMeshNV, "perviewNV"); + parseContext.requireStage((yyvsp[0].lex).loc, EShLangMesh, "perviewNV"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.perViewNV = true; } -#line 6659 "MachineIndependent/glslang_tab.cpp" +#line 6756 "MachineIndependent/glslang_tab.cpp" break; - case 145: /* interpolation_qualifier: PERTASKNV */ -#line 1310 "MachineIndependent/glslang.y" + case 147: /* interpolation_qualifier: PERTASKNV */ +#line 1323 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "taskNV"); - parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask), "taskNV"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), "taskNV"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.perTaskNV = true; } -#line 6671 "MachineIndependent/glslang_tab.cpp" +#line 6768 "MachineIndependent/glslang_tab.cpp" break; - case 146: /* layout_qualifier: LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN */ -#line 1321 "MachineIndependent/glslang.y" + case 148: /* layout_qualifier: LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN */ +#line 1333 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-1].interm.type); } -#line 6679 "MachineIndependent/glslang_tab.cpp" +#line 6776 "MachineIndependent/glslang_tab.cpp" break; - case 147: /* layout_qualifier_id_list: layout_qualifier_id */ -#line 1327 "MachineIndependent/glslang.y" + case 149: /* layout_qualifier_id_list: layout_qualifier_id */ +#line 1339 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6687 "MachineIndependent/glslang_tab.cpp" +#line 6784 "MachineIndependent/glslang_tab.cpp" break; - case 148: /* layout_qualifier_id_list: layout_qualifier_id_list COMMA layout_qualifier_id */ -#line 1330 "MachineIndependent/glslang.y" + case 150: /* layout_qualifier_id_list: layout_qualifier_id_list COMMA layout_qualifier_id */ +#line 1342 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-2].interm.type); (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); } -#line 6697 "MachineIndependent/glslang_tab.cpp" +#line 6794 "MachineIndependent/glslang_tab.cpp" break; - case 149: /* layout_qualifier_id: IDENTIFIER */ -#line 1337 "MachineIndependent/glslang.y" + case 151: /* layout_qualifier_id: IDENTIFIER */ +#line 1349 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string); } -#line 6706 "MachineIndependent/glslang_tab.cpp" +#line 6803 "MachineIndependent/glslang_tab.cpp" break; - case 150: /* layout_qualifier_id: IDENTIFIER EQUAL constant_expression */ -#line 1341 "MachineIndependent/glslang.y" + case 152: /* layout_qualifier_id: IDENTIFIER EQUAL constant_expression */ +#line 1353 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-2].lex).loc); parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode)); } -#line 6715 "MachineIndependent/glslang_tab.cpp" +#line 6812 "MachineIndependent/glslang_tab.cpp" break; - case 151: /* layout_qualifier_id: SHARED */ -#line 1345 "MachineIndependent/glslang.y" + case 153: /* layout_qualifier_id: SHARED */ +#line 1357 "MachineIndependent/glslang.y" { // because "shared" is both an identifier and a keyword (yyval.interm.type).init((yyvsp[0].lex).loc); TString strShared("shared"); parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared); } -#line 6725 "MachineIndependent/glslang_tab.cpp" +#line 6822 "MachineIndependent/glslang_tab.cpp" break; - case 152: /* precise_qualifier: PRECISE */ -#line 1354 "MachineIndependent/glslang.y" + case 154: /* precise_qualifier: PRECISE */ +#line 1365 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise"); parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.noContraction = true; } -#line 6736 "MachineIndependent/glslang_tab.cpp" +#line 6833 "MachineIndependent/glslang_tab.cpp" break; - case 153: /* type_qualifier: single_type_qualifier */ -#line 1364 "MachineIndependent/glslang.y" + case 155: /* type_qualifier: single_type_qualifier */ +#line 1374 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6744 "MachineIndependent/glslang_tab.cpp" +#line 6841 "MachineIndependent/glslang_tab.cpp" break; - case 154: /* type_qualifier: type_qualifier single_type_qualifier */ -#line 1367 "MachineIndependent/glslang.y" + case 156: /* type_qualifier: type_qualifier single_type_qualifier */ +#line 1377 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-1].interm.type); if ((yyval.interm.type).basicType == EbtVoid) @@ -6753,151 +6850,151 @@ yyreduce: (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); } -#line 6757 "MachineIndependent/glslang_tab.cpp" +#line 6854 "MachineIndependent/glslang_tab.cpp" break; - case 155: /* single_type_qualifier: storage_qualifier */ -#line 1378 "MachineIndependent/glslang.y" + case 157: /* single_type_qualifier: storage_qualifier */ +#line 1388 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6765 "MachineIndependent/glslang_tab.cpp" +#line 6862 "MachineIndependent/glslang_tab.cpp" break; - case 156: /* single_type_qualifier: layout_qualifier */ -#line 1381 "MachineIndependent/glslang.y" + case 158: /* single_type_qualifier: layout_qualifier */ +#line 1391 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6773 "MachineIndependent/glslang_tab.cpp" +#line 6870 "MachineIndependent/glslang_tab.cpp" break; - case 157: /* single_type_qualifier: precision_qualifier */ -#line 1384 "MachineIndependent/glslang.y" + case 159: /* single_type_qualifier: precision_qualifier */ +#line 1394 "MachineIndependent/glslang.y" { parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6782 "MachineIndependent/glslang_tab.cpp" +#line 6879 "MachineIndependent/glslang_tab.cpp" break; - case 158: /* single_type_qualifier: interpolation_qualifier */ -#line 1388 "MachineIndependent/glslang.y" + case 160: /* single_type_qualifier: interpolation_qualifier */ +#line 1398 "MachineIndependent/glslang.y" { // allow inheritance of storage qualifier from block declaration (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6791 "MachineIndependent/glslang_tab.cpp" +#line 6888 "MachineIndependent/glslang_tab.cpp" break; - case 159: /* single_type_qualifier: invariant_qualifier */ -#line 1392 "MachineIndependent/glslang.y" + case 161: /* single_type_qualifier: invariant_qualifier */ +#line 1402 "MachineIndependent/glslang.y" { // allow inheritance of storage qualifier from block declaration (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6800 "MachineIndependent/glslang_tab.cpp" +#line 6897 "MachineIndependent/glslang_tab.cpp" break; - case 160: /* single_type_qualifier: precise_qualifier */ -#line 1397 "MachineIndependent/glslang.y" + case 162: /* single_type_qualifier: precise_qualifier */ +#line 1406 "MachineIndependent/glslang.y" { // allow inheritance of storage qualifier from block declaration (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6809 "MachineIndependent/glslang_tab.cpp" +#line 6906 "MachineIndependent/glslang_tab.cpp" break; - case 161: /* single_type_qualifier: non_uniform_qualifier */ -#line 1401 "MachineIndependent/glslang.y" + case 163: /* single_type_qualifier: non_uniform_qualifier */ +#line 1410 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6817 "MachineIndependent/glslang_tab.cpp" +#line 6914 "MachineIndependent/glslang_tab.cpp" break; - case 162: /* single_type_qualifier: spirv_storage_class_qualifier */ -#line 1404 "MachineIndependent/glslang.y" + case 164: /* single_type_qualifier: spirv_storage_class_qualifier */ +#line 1413 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].interm.type).loc, "spirv_storage_class"); parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V storage class qualifier"); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6827 "MachineIndependent/glslang_tab.cpp" +#line 6924 "MachineIndependent/glslang_tab.cpp" break; - case 163: /* single_type_qualifier: spirv_decorate_qualifier */ -#line 1409 "MachineIndependent/glslang.y" + case 165: /* single_type_qualifier: spirv_decorate_qualifier */ +#line 1418 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V decorate qualifier"); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6836 "MachineIndependent/glslang_tab.cpp" +#line 6933 "MachineIndependent/glslang_tab.cpp" break; - case 164: /* single_type_qualifier: SPIRV_BY_REFERENCE */ -#line 1413 "MachineIndependent/glslang.y" + case 166: /* single_type_qualifier: SPIRV_BY_REFERENCE */ +#line 1422 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, "spirv_by_reference"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.setSpirvByReference(); } -#line 6846 "MachineIndependent/glslang_tab.cpp" +#line 6943 "MachineIndependent/glslang_tab.cpp" break; - case 165: /* single_type_qualifier: SPIRV_LITERAL */ -#line 1418 "MachineIndependent/glslang.y" + case 167: /* single_type_qualifier: SPIRV_LITERAL */ +#line 1427 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, "spirv_by_literal"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.setSpirvLiteral(); } -#line 6856 "MachineIndependent/glslang_tab.cpp" +#line 6953 "MachineIndependent/glslang_tab.cpp" break; - case 166: /* storage_qualifier: CONST */ -#line 1427 "MachineIndependent/glslang.y" + case 168: /* storage_qualifier: CONST */ +#line 1435 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqConst; // will later turn into EvqConstReadOnly, if the initializer is not constant } -#line 6865 "MachineIndependent/glslang_tab.cpp" +#line 6962 "MachineIndependent/glslang_tab.cpp" break; - case 167: /* storage_qualifier: INOUT */ -#line 1431 "MachineIndependent/glslang.y" + case 169: /* storage_qualifier: INOUT */ +#line 1439 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "inout"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqInOut; } -#line 6875 "MachineIndependent/glslang_tab.cpp" +#line 6972 "MachineIndependent/glslang_tab.cpp" break; - case 168: /* storage_qualifier: IN */ -#line 1436 "MachineIndependent/glslang.y" + case 170: /* storage_qualifier: IN */ +#line 1444 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "in"); (yyval.interm.type).init((yyvsp[0].lex).loc); // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later (yyval.interm.type).qualifier.storage = EvqIn; } -#line 6886 "MachineIndependent/glslang_tab.cpp" +#line 6983 "MachineIndependent/glslang_tab.cpp" break; - case 169: /* storage_qualifier: OUT */ -#line 1442 "MachineIndependent/glslang.y" + case 171: /* storage_qualifier: OUT */ +#line 1450 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "out"); (yyval.interm.type).init((yyvsp[0].lex).loc); // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later (yyval.interm.type).qualifier.storage = EvqOut; } -#line 6897 "MachineIndependent/glslang_tab.cpp" +#line 6994 "MachineIndependent/glslang_tab.cpp" break; - case 170: /* storage_qualifier: CENTROID */ -#line 1448 "MachineIndependent/glslang.y" + case 172: /* storage_qualifier: CENTROID */ +#line 1456 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid"); parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid"); @@ -6905,44 +7002,54 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.centroid = true; } -#line 6909 "MachineIndependent/glslang_tab.cpp" +#line 7006 "MachineIndependent/glslang_tab.cpp" break; - case 171: /* storage_qualifier: UNIFORM */ -#line 1455 "MachineIndependent/glslang.y" + case 173: /* storage_qualifier: UNIFORM */ +#line 1463 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "uniform"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqUniform; } -#line 6919 "MachineIndependent/glslang_tab.cpp" +#line 7016 "MachineIndependent/glslang_tab.cpp" break; - case 172: /* storage_qualifier: SHARED */ -#line 1460 "MachineIndependent/glslang.y" + case 174: /* storage_qualifier: TILEIMAGEEXT */ +#line 1468 "MachineIndependent/glslang.y" + { + parseContext.globalCheck((yyvsp[0].lex).loc, "tileImageEXT"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqTileImageEXT; + } +#line 7026 "MachineIndependent/glslang_tab.cpp" + break; + + case 175: /* storage_qualifier: SHARED */ +#line 1473 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "shared"); parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared"); parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared"); - parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshNVMask | EShLangTaskNVMask), "shared"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshMask | EShLangTaskMask), "shared"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqShared; } -#line 6932 "MachineIndependent/glslang_tab.cpp" +#line 7039 "MachineIndependent/glslang_tab.cpp" break; - case 173: /* storage_qualifier: BUFFER */ -#line 1468 "MachineIndependent/glslang.y" + case 176: /* storage_qualifier: BUFFER */ +#line 1481 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "buffer"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqBuffer; } -#line 6942 "MachineIndependent/glslang_tab.cpp" +#line 7049 "MachineIndependent/glslang_tab.cpp" break; - case 174: /* storage_qualifier: ATTRIBUTE */ -#line 1474 "MachineIndependent/glslang.y" + case 177: /* storage_qualifier: ATTRIBUTE */ +#line 1486 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute"); parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute"); @@ -6955,11 +7062,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqVaryingIn; } -#line 6959 "MachineIndependent/glslang_tab.cpp" +#line 7066 "MachineIndependent/glslang_tab.cpp" break; - case 175: /* storage_qualifier: VARYING */ -#line 1486 "MachineIndependent/glslang.y" + case 178: /* storage_qualifier: VARYING */ +#line 1498 "MachineIndependent/glslang.y" { parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying"); parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying"); @@ -6974,32 +7081,32 @@ yyreduce: else (yyval.interm.type).qualifier.storage = EvqVaryingIn; } -#line 6978 "MachineIndependent/glslang_tab.cpp" +#line 7085 "MachineIndependent/glslang_tab.cpp" break; - case 176: /* storage_qualifier: PATCH */ -#line 1500 "MachineIndependent/glslang.y" + case 179: /* storage_qualifier: PATCH */ +#line 1512 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "patch"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.patch = true; } -#line 6989 "MachineIndependent/glslang_tab.cpp" +#line 7096 "MachineIndependent/glslang_tab.cpp" break; - case 177: /* storage_qualifier: SAMPLE */ -#line 1506 "MachineIndependent/glslang.y" + case 180: /* storage_qualifier: SAMPLE */ +#line 1518 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "sample"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.sample = true; } -#line 6999 "MachineIndependent/glslang_tab.cpp" +#line 7106 "MachineIndependent/glslang_tab.cpp" break; - case 178: /* storage_qualifier: HITATTRNV */ -#line 1511 "MachineIndependent/glslang.y" + case 181: /* storage_qualifier: HITATTRNV */ +#line 1523 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask @@ -7008,11 +7115,24 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqHitAttr; } -#line 7012 "MachineIndependent/glslang_tab.cpp" +#line 7119 "MachineIndependent/glslang_tab.cpp" break; - case 179: /* storage_qualifier: HITATTREXT */ -#line 1519 "MachineIndependent/glslang.y" + case 182: /* storage_qualifier: HITOBJECTATTRNV */ +#line 1531 "MachineIndependent/glslang.y" + { + parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeNV"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask + | EShLangMissMask), "hitObjectAttributeNV"); + parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_shader_invocation_reorder, "hitObjectAttributeNV"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqHitObjectAttrNV; + } +#line 7132 "MachineIndependent/glslang_tab.cpp" + break; + + case 183: /* storage_qualifier: HITATTREXT */ +#line 1539 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask @@ -7021,11 +7141,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqHitAttr; } -#line 7025 "MachineIndependent/glslang_tab.cpp" +#line 7145 "MachineIndependent/glslang_tab.cpp" break; - case 180: /* storage_qualifier: PAYLOADNV */ -#line 1527 "MachineIndependent/glslang.y" + case 184: /* storage_qualifier: PAYLOADNV */ +#line 1547 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | @@ -7034,11 +7154,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayload; } -#line 7038 "MachineIndependent/glslang_tab.cpp" +#line 7158 "MachineIndependent/glslang_tab.cpp" break; - case 181: /* storage_qualifier: PAYLOADEXT */ -#line 1535 "MachineIndependent/glslang.y" + case 185: /* storage_qualifier: PAYLOADEXT */ +#line 1555 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | @@ -7047,11 +7167,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayload; } -#line 7051 "MachineIndependent/glslang_tab.cpp" +#line 7171 "MachineIndependent/glslang_tab.cpp" break; - case 182: /* storage_qualifier: PAYLOADINNV */ -#line 1543 "MachineIndependent/glslang.y" + case 186: /* storage_qualifier: PAYLOADINNV */ +#line 1563 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask | @@ -7060,11 +7180,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayloadIn; } -#line 7064 "MachineIndependent/glslang_tab.cpp" +#line 7184 "MachineIndependent/glslang_tab.cpp" break; - case 183: /* storage_qualifier: PAYLOADINEXT */ -#line 1551 "MachineIndependent/glslang.y" + case 187: /* storage_qualifier: PAYLOADINEXT */ +#line 1571 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask | @@ -7073,11 +7193,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayloadIn; } -#line 7077 "MachineIndependent/glslang_tab.cpp" +#line 7197 "MachineIndependent/glslang_tab.cpp" break; - case 184: /* storage_qualifier: CALLDATANV */ -#line 1559 "MachineIndependent/glslang.y" + case 188: /* storage_qualifier: CALLDATANV */ +#line 1579 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | @@ -7086,11 +7206,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableData; } -#line 7090 "MachineIndependent/glslang_tab.cpp" +#line 7210 "MachineIndependent/glslang_tab.cpp" break; - case 185: /* storage_qualifier: CALLDATAEXT */ -#line 1567 "MachineIndependent/glslang.y" + case 189: /* storage_qualifier: CALLDATAEXT */ +#line 1587 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | @@ -7099,11 +7219,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableData; } -#line 7103 "MachineIndependent/glslang_tab.cpp" +#line 7223 "MachineIndependent/glslang_tab.cpp" break; - case 186: /* storage_qualifier: CALLDATAINNV */ -#line 1575 "MachineIndependent/glslang.y" + case 190: /* storage_qualifier: CALLDATAINNV */ +#line 1595 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInNV"); @@ -7111,11 +7231,11 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableDataIn; } -#line 7115 "MachineIndependent/glslang_tab.cpp" +#line 7235 "MachineIndependent/glslang_tab.cpp" break; - case 187: /* storage_qualifier: CALLDATAINEXT */ -#line 1582 "MachineIndependent/glslang.y" + case 191: /* storage_qualifier: CALLDATAINEXT */ +#line 1602 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInEXT"); @@ -7123,197 +7243,212 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableDataIn; } -#line 7127 "MachineIndependent/glslang_tab.cpp" +#line 7247 "MachineIndependent/glslang_tab.cpp" break; - case 188: /* storage_qualifier: COHERENT */ -#line 1589 "MachineIndependent/glslang.y" + case 192: /* storage_qualifier: COHERENT */ +#line 1609 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.coherent = true; } -#line 7136 "MachineIndependent/glslang_tab.cpp" +#line 7256 "MachineIndependent/glslang_tab.cpp" break; - case 189: /* storage_qualifier: DEVICECOHERENT */ -#line 1593 "MachineIndependent/glslang.y" + case 193: /* storage_qualifier: DEVICECOHERENT */ +#line 1613 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "devicecoherent"); (yyval.interm.type).qualifier.devicecoherent = true; } -#line 7146 "MachineIndependent/glslang_tab.cpp" +#line 7266 "MachineIndependent/glslang_tab.cpp" break; - case 190: /* storage_qualifier: QUEUEFAMILYCOHERENT */ -#line 1598 "MachineIndependent/glslang.y" + case 194: /* storage_qualifier: QUEUEFAMILYCOHERENT */ +#line 1618 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "queuefamilycoherent"); (yyval.interm.type).qualifier.queuefamilycoherent = true; } -#line 7156 "MachineIndependent/glslang_tab.cpp" +#line 7276 "MachineIndependent/glslang_tab.cpp" break; - case 191: /* storage_qualifier: WORKGROUPCOHERENT */ -#line 1603 "MachineIndependent/glslang.y" + case 195: /* storage_qualifier: WORKGROUPCOHERENT */ +#line 1623 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "workgroupcoherent"); (yyval.interm.type).qualifier.workgroupcoherent = true; } -#line 7166 "MachineIndependent/glslang_tab.cpp" +#line 7286 "MachineIndependent/glslang_tab.cpp" break; - case 192: /* storage_qualifier: SUBGROUPCOHERENT */ -#line 1608 "MachineIndependent/glslang.y" + case 196: /* storage_qualifier: SUBGROUPCOHERENT */ +#line 1628 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "subgroupcoherent"); (yyval.interm.type).qualifier.subgroupcoherent = true; } -#line 7176 "MachineIndependent/glslang_tab.cpp" +#line 7296 "MachineIndependent/glslang_tab.cpp" break; - case 193: /* storage_qualifier: NONPRIVATE */ -#line 1613 "MachineIndependent/glslang.y" + case 197: /* storage_qualifier: NONPRIVATE */ +#line 1633 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "nonprivate"); (yyval.interm.type).qualifier.nonprivate = true; } -#line 7186 "MachineIndependent/glslang_tab.cpp" +#line 7306 "MachineIndependent/glslang_tab.cpp" break; - case 194: /* storage_qualifier: SHADERCALLCOHERENT */ -#line 1618 "MachineIndependent/glslang.y" + case 198: /* storage_qualifier: SHADERCALLCOHERENT */ +#line 1638 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_ray_tracing, "shadercallcoherent"); (yyval.interm.type).qualifier.shadercallcoherent = true; } -#line 7196 "MachineIndependent/glslang_tab.cpp" +#line 7316 "MachineIndependent/glslang_tab.cpp" break; - case 195: /* storage_qualifier: VOLATILE */ -#line 1623 "MachineIndependent/glslang.y" + case 199: /* storage_qualifier: VOLATILE */ +#line 1643 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.volatil = true; } -#line 7205 "MachineIndependent/glslang_tab.cpp" +#line 7325 "MachineIndependent/glslang_tab.cpp" break; - case 196: /* storage_qualifier: RESTRICT */ -#line 1627 "MachineIndependent/glslang.y" + case 200: /* storage_qualifier: RESTRICT */ +#line 1647 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.restrict = true; } -#line 7214 "MachineIndependent/glslang_tab.cpp" +#line 7334 "MachineIndependent/glslang_tab.cpp" break; - case 197: /* storage_qualifier: READONLY */ -#line 1631 "MachineIndependent/glslang.y" + case 201: /* storage_qualifier: READONLY */ +#line 1651 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.readonly = true; } -#line 7223 "MachineIndependent/glslang_tab.cpp" +#line 7343 "MachineIndependent/glslang_tab.cpp" break; - case 198: /* storage_qualifier: WRITEONLY */ -#line 1635 "MachineIndependent/glslang.y" + case 202: /* storage_qualifier: WRITEONLY */ +#line 1655 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.writeonly = true; } -#line 7232 "MachineIndependent/glslang_tab.cpp" +#line 7352 "MachineIndependent/glslang_tab.cpp" break; - case 199: /* storage_qualifier: SUBROUTINE */ -#line 1639 "MachineIndependent/glslang.y" + case 203: /* storage_qualifier: SUBROUTINE */ +#line 1659 "MachineIndependent/glslang.y" { parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine"); parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine"); parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine"); (yyval.interm.type).init((yyvsp[0].lex).loc); } -#line 7243 "MachineIndependent/glslang_tab.cpp" +#line 7363 "MachineIndependent/glslang_tab.cpp" break; - case 200: /* storage_qualifier: SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN */ -#line 1645 "MachineIndependent/glslang.y" + case 204: /* storage_qualifier: SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN */ +#line 1665 "MachineIndependent/glslang.y" { parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine"); parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine"); parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine"); (yyval.interm.type).init((yyvsp[-3].lex).loc); } -#line 7254 "MachineIndependent/glslang_tab.cpp" +#line 7374 "MachineIndependent/glslang_tab.cpp" break; - case 201: /* non_uniform_qualifier: NONUNIFORM */ -#line 1656 "MachineIndependent/glslang.y" + case 205: /* storage_qualifier: TASKPAYLOADWORKGROUPEXT */ +#line 1671 "MachineIndependent/glslang.y" + { + // No need for profile version or extension check. Shader stage already checks both. + parseContext.globalCheck((yyvsp[0].lex).loc, "taskPayloadSharedEXT"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), "taskPayloadSharedEXT "); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqtaskPayloadSharedEXT; + } +#line 7386 "MachineIndependent/glslang_tab.cpp" + break; + + case 206: /* non_uniform_qualifier: NONUNIFORM */ +#line 1681 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.nonUniform = true; } -#line 7263 "MachineIndependent/glslang_tab.cpp" +#line 7395 "MachineIndependent/glslang_tab.cpp" break; - case 202: /* type_name_list: IDENTIFIER */ -#line 1663 "MachineIndependent/glslang.y" + case 207: /* type_name_list: IDENTIFIER */ +#line 1688 "MachineIndependent/glslang.y" { // TODO } -#line 7271 "MachineIndependent/glslang_tab.cpp" +#line 7403 "MachineIndependent/glslang_tab.cpp" break; - case 203: /* type_name_list: type_name_list COMMA IDENTIFIER */ -#line 1666 "MachineIndependent/glslang.y" + case 208: /* type_name_list: type_name_list COMMA IDENTIFIER */ +#line 1691 "MachineIndependent/glslang.y" { // TODO: 4.0 semantics: subroutines // 1) make sure each identifier is a type declared earlier with SUBROUTINE // 2) save all of the identifiers for future comparison with the declared function } -#line 7281 "MachineIndependent/glslang_tab.cpp" +#line 7413 "MachineIndependent/glslang_tab.cpp" break; - case 204: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt */ -#line 1675 "MachineIndependent/glslang.y" + case 209: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt */ +#line 1699 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-1].interm.type); (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); (yyval.interm.type).typeParameters = (yyvsp[0].interm.typeParameters); + parseContext.coopMatTypeParametersCheck((yyvsp[-1].interm.type).loc, (yyval.interm.type)); + } -#line 7291 "MachineIndependent/glslang_tab.cpp" +#line 7425 "MachineIndependent/glslang_tab.cpp" break; - case 205: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt array_specifier */ -#line 1680 "MachineIndependent/glslang.y" + case 210: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt array_specifier */ +#line 1706 "MachineIndependent/glslang.y" { parseContext.arrayOfArrayVersionCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes); (yyval.interm.type) = (yyvsp[-2].interm.type); (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); (yyval.interm.type).typeParameters = (yyvsp[-1].interm.typeParameters); (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes; + parseContext.coopMatTypeParametersCheck((yyvsp[-2].interm.type).loc, (yyval.interm.type)); } -#line 7303 "MachineIndependent/glslang_tab.cpp" +#line 7438 "MachineIndependent/glslang_tab.cpp" break; - case 206: /* array_specifier: LEFT_BRACKET RIGHT_BRACKET */ -#line 1690 "MachineIndependent/glslang.y" + case 211: /* array_specifier: LEFT_BRACKET RIGHT_BRACKET */ +#line 1717 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[-1].lex).loc; (yyval.interm).arraySizes = new TArraySizes; (yyval.interm).arraySizes->addInnerSize(); } -#line 7313 "MachineIndependent/glslang_tab.cpp" +#line 7448 "MachineIndependent/glslang_tab.cpp" break; - case 207: /* array_specifier: LEFT_BRACKET conditional_expression RIGHT_BRACKET */ -#line 1695 "MachineIndependent/glslang.y" + case 212: /* array_specifier: LEFT_BRACKET conditional_expression RIGHT_BRACKET */ +#line 1722 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[-2].lex).loc; (yyval.interm).arraySizes = new TArraySizes; @@ -7322,20 +7457,20 @@ yyreduce: parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size"); (yyval.interm).arraySizes->addInnerSize(size); } -#line 7326 "MachineIndependent/glslang_tab.cpp" +#line 7461 "MachineIndependent/glslang_tab.cpp" break; - case 208: /* array_specifier: array_specifier LEFT_BRACKET RIGHT_BRACKET */ -#line 1703 "MachineIndependent/glslang.y" + case 213: /* array_specifier: array_specifier LEFT_BRACKET RIGHT_BRACKET */ +#line 1730 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-2].interm); (yyval.interm).arraySizes->addInnerSize(); } -#line 7335 "MachineIndependent/glslang_tab.cpp" +#line 7470 "MachineIndependent/glslang_tab.cpp" break; - case 209: /* array_specifier: array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET */ -#line 1707 "MachineIndependent/glslang.y" + case 214: /* array_specifier: array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET */ +#line 1734 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-3].interm); @@ -7343,348 +7478,360 @@ yyreduce: parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size"); (yyval.interm).arraySizes->addInnerSize(size); } -#line 7347 "MachineIndependent/glslang_tab.cpp" +#line 7482 "MachineIndependent/glslang_tab.cpp" break; - case 210: /* type_parameter_specifier_opt: type_parameter_specifier */ -#line 1717 "MachineIndependent/glslang.y" + case 215: /* type_parameter_specifier_opt: type_parameter_specifier */ +#line 1744 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = (yyvsp[0].interm.typeParameters); } -#line 7355 "MachineIndependent/glslang_tab.cpp" +#line 7490 "MachineIndependent/glslang_tab.cpp" break; - case 211: /* type_parameter_specifier_opt: %empty */ -#line 1720 "MachineIndependent/glslang.y" + case 216: /* type_parameter_specifier_opt: %empty */ +#line 1747 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = 0; } -#line 7363 "MachineIndependent/glslang_tab.cpp" +#line 7498 "MachineIndependent/glslang_tab.cpp" break; - case 212: /* type_parameter_specifier: LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE */ -#line 1726 "MachineIndependent/glslang.y" + case 217: /* type_parameter_specifier: LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE */ +#line 1753 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = (yyvsp[-1].interm.typeParameters); } -#line 7371 "MachineIndependent/glslang_tab.cpp" +#line 7506 "MachineIndependent/glslang_tab.cpp" break; - case 213: /* type_parameter_specifier_list: unary_expression */ -#line 1732 "MachineIndependent/glslang.y" + case 218: /* type_parameter_specifier_list: type_specifier */ +#line 1759 "MachineIndependent/glslang.y" + { + (yyval.interm.typeParameters) = new TTypeParameters; + (yyval.interm.typeParameters)->arraySizes = new TArraySizes; + (yyval.interm.typeParameters)->spirvType = (yyvsp[0].interm.type).spirvType; + (yyval.interm.typeParameters)->basicType = (yyvsp[0].interm.type).basicType; + } +#line 7517 "MachineIndependent/glslang_tab.cpp" + break; + + case 219: /* type_parameter_specifier_list: unary_expression */ +#line 1765 "MachineIndependent/glslang.y" { - (yyval.interm.typeParameters) = new TArraySizes; + (yyval.interm.typeParameters) = new TTypeParameters; + (yyval.interm.typeParameters)->arraySizes = new TArraySizes; TArraySize size; - parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter"); - (yyval.interm.typeParameters)->addInnerSize(size); + parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter", true); + (yyval.interm.typeParameters)->arraySizes->addInnerSize(size); } -#line 7383 "MachineIndependent/glslang_tab.cpp" +#line 7530 "MachineIndependent/glslang_tab.cpp" break; - case 214: /* type_parameter_specifier_list: type_parameter_specifier_list COMMA unary_expression */ -#line 1739 "MachineIndependent/glslang.y" + case 220: /* type_parameter_specifier_list: type_parameter_specifier_list COMMA unary_expression */ +#line 1773 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = (yyvsp[-2].interm.typeParameters); TArraySize size; - parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter"); - (yyval.interm.typeParameters)->addInnerSize(size); + parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter", true); + (yyval.interm.typeParameters)->arraySizes->addInnerSize(size); } -#line 7395 "MachineIndependent/glslang_tab.cpp" +#line 7542 "MachineIndependent/glslang_tab.cpp" break; - case 215: /* type_specifier_nonarray: VOID */ -#line 1749 "MachineIndependent/glslang.y" + case 221: /* type_specifier_nonarray: VOID */ +#line 1783 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtVoid; } -#line 7404 "MachineIndependent/glslang_tab.cpp" +#line 7551 "MachineIndependent/glslang_tab.cpp" break; - case 216: /* type_specifier_nonarray: FLOAT */ -#line 1753 "MachineIndependent/glslang.y" + case 222: /* type_specifier_nonarray: FLOAT */ +#line 1787 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; } -#line 7413 "MachineIndependent/glslang_tab.cpp" +#line 7560 "MachineIndependent/glslang_tab.cpp" break; - case 217: /* type_specifier_nonarray: INT */ -#line 1757 "MachineIndependent/glslang.y" + case 223: /* type_specifier_nonarray: INT */ +#line 1791 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; } -#line 7422 "MachineIndependent/glslang_tab.cpp" +#line 7569 "MachineIndependent/glslang_tab.cpp" break; - case 218: /* type_specifier_nonarray: UINT */ -#line 1761 "MachineIndependent/glslang.y" + case 224: /* type_specifier_nonarray: UINT */ +#line 1795 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; } -#line 7432 "MachineIndependent/glslang_tab.cpp" +#line 7579 "MachineIndependent/glslang_tab.cpp" break; - case 219: /* type_specifier_nonarray: BOOL */ -#line 1766 "MachineIndependent/glslang.y" - { - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; - } -#line 7441 "MachineIndependent/glslang_tab.cpp" - break; - - case 220: /* type_specifier_nonarray: VEC2 */ -#line 1770 "MachineIndependent/glslang.y" - { - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(2); - } -#line 7451 "MachineIndependent/glslang_tab.cpp" - break; - - case 221: /* type_specifier_nonarray: VEC3 */ -#line 1775 "MachineIndependent/glslang.y" - { - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(3); - } -#line 7461 "MachineIndependent/glslang_tab.cpp" - break; - - case 222: /* type_specifier_nonarray: VEC4 */ -#line 1780 "MachineIndependent/glslang.y" - { - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(4); - } -#line 7471 "MachineIndependent/glslang_tab.cpp" - break; - - case 223: /* type_specifier_nonarray: BVEC2 */ -#line 1785 "MachineIndependent/glslang.y" - { - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; - (yyval.interm.type).setVector(2); - } -#line 7481 "MachineIndependent/glslang_tab.cpp" - break; - - case 224: /* type_specifier_nonarray: BVEC3 */ -#line 1790 "MachineIndependent/glslang.y" - { - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; - (yyval.interm.type).setVector(3); - } -#line 7491 "MachineIndependent/glslang_tab.cpp" - break; - - case 225: /* type_specifier_nonarray: BVEC4 */ -#line 1795 "MachineIndependent/glslang.y" - { - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtBool; - (yyval.interm.type).setVector(4); - } -#line 7501 "MachineIndependent/glslang_tab.cpp" - break; - - case 226: /* type_specifier_nonarray: IVEC2 */ + case 225: /* type_specifier_nonarray: BOOL */ #line 1800 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; + } +#line 7588 "MachineIndependent/glslang_tab.cpp" + break; + + case 226: /* type_specifier_nonarray: VEC2 */ +#line 1804 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(2); + } +#line 7598 "MachineIndependent/glslang_tab.cpp" + break; + + case 227: /* type_specifier_nonarray: VEC3 */ +#line 1809 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(3); + } +#line 7608 "MachineIndependent/glslang_tab.cpp" + break; + + case 228: /* type_specifier_nonarray: VEC4 */ +#line 1814 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(4); + } +#line 7618 "MachineIndependent/glslang_tab.cpp" + break; + + case 229: /* type_specifier_nonarray: BVEC2 */ +#line 1819 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; + (yyval.interm.type).setVector(2); + } +#line 7628 "MachineIndependent/glslang_tab.cpp" + break; + + case 230: /* type_specifier_nonarray: BVEC3 */ +#line 1824 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; + (yyval.interm.type).setVector(3); + } +#line 7638 "MachineIndependent/glslang_tab.cpp" + break; + + case 231: /* type_specifier_nonarray: BVEC4 */ +#line 1829 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtBool; + (yyval.interm.type).setVector(4); + } +#line 7648 "MachineIndependent/glslang_tab.cpp" + break; + + case 232: /* type_specifier_nonarray: IVEC2 */ +#line 1834 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(2); } -#line 7511 "MachineIndependent/glslang_tab.cpp" +#line 7658 "MachineIndependent/glslang_tab.cpp" break; - case 227: /* type_specifier_nonarray: IVEC3 */ -#line 1805 "MachineIndependent/glslang.y" + case 233: /* type_specifier_nonarray: IVEC3 */ +#line 1839 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(3); } -#line 7521 "MachineIndependent/glslang_tab.cpp" +#line 7668 "MachineIndependent/glslang_tab.cpp" break; - case 228: /* type_specifier_nonarray: IVEC4 */ -#line 1810 "MachineIndependent/glslang.y" + case 234: /* type_specifier_nonarray: IVEC4 */ +#line 1844 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(4); } -#line 7531 "MachineIndependent/glslang_tab.cpp" +#line 7678 "MachineIndependent/glslang_tab.cpp" break; - case 229: /* type_specifier_nonarray: UVEC2 */ -#line 1815 "MachineIndependent/glslang.y" + case 235: /* type_specifier_nonarray: UVEC2 */ +#line 1849 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(2); } -#line 7542 "MachineIndependent/glslang_tab.cpp" +#line 7689 "MachineIndependent/glslang_tab.cpp" break; - case 230: /* type_specifier_nonarray: UVEC3 */ -#line 1821 "MachineIndependent/glslang.y" + case 236: /* type_specifier_nonarray: UVEC3 */ +#line 1855 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(3); } -#line 7553 "MachineIndependent/glslang_tab.cpp" +#line 7700 "MachineIndependent/glslang_tab.cpp" break; - case 231: /* type_specifier_nonarray: UVEC4 */ -#line 1827 "MachineIndependent/glslang.y" + case 237: /* type_specifier_nonarray: UVEC4 */ +#line 1861 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(4); } -#line 7564 "MachineIndependent/glslang_tab.cpp" +#line 7711 "MachineIndependent/glslang_tab.cpp" break; - case 232: /* type_specifier_nonarray: MAT2 */ -#line 1833 "MachineIndependent/glslang.y" + case 238: /* type_specifier_nonarray: MAT2 */ +#line 1867 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 7574 "MachineIndependent/glslang_tab.cpp" +#line 7721 "MachineIndependent/glslang_tab.cpp" break; - case 233: /* type_specifier_nonarray: MAT3 */ -#line 1838 "MachineIndependent/glslang.y" + case 239: /* type_specifier_nonarray: MAT3 */ +#line 1872 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 7584 "MachineIndependent/glslang_tab.cpp" +#line 7731 "MachineIndependent/glslang_tab.cpp" break; - case 234: /* type_specifier_nonarray: MAT4 */ -#line 1843 "MachineIndependent/glslang.y" + case 240: /* type_specifier_nonarray: MAT4 */ +#line 1877 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 7594 "MachineIndependent/glslang_tab.cpp" +#line 7741 "MachineIndependent/glslang_tab.cpp" break; - case 235: /* type_specifier_nonarray: MAT2X2 */ -#line 1848 "MachineIndependent/glslang.y" + case 241: /* type_specifier_nonarray: MAT2X2 */ +#line 1882 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 7604 "MachineIndependent/glslang_tab.cpp" +#line 7751 "MachineIndependent/glslang_tab.cpp" break; - case 236: /* type_specifier_nonarray: MAT2X3 */ -#line 1853 "MachineIndependent/glslang.y" + case 242: /* type_specifier_nonarray: MAT2X3 */ +#line 1887 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 3); } -#line 7614 "MachineIndependent/glslang_tab.cpp" +#line 7761 "MachineIndependent/glslang_tab.cpp" break; - case 237: /* type_specifier_nonarray: MAT2X4 */ -#line 1858 "MachineIndependent/glslang.y" + case 243: /* type_specifier_nonarray: MAT2X4 */ +#line 1892 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 4); } -#line 7624 "MachineIndependent/glslang_tab.cpp" +#line 7771 "MachineIndependent/glslang_tab.cpp" break; - case 238: /* type_specifier_nonarray: MAT3X2 */ -#line 1863 "MachineIndependent/glslang.y" + case 244: /* type_specifier_nonarray: MAT3X2 */ +#line 1897 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 2); } -#line 7634 "MachineIndependent/glslang_tab.cpp" +#line 7781 "MachineIndependent/glslang_tab.cpp" break; - case 239: /* type_specifier_nonarray: MAT3X3 */ -#line 1868 "MachineIndependent/glslang.y" + case 245: /* type_specifier_nonarray: MAT3X3 */ +#line 1902 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 7644 "MachineIndependent/glslang_tab.cpp" +#line 7791 "MachineIndependent/glslang_tab.cpp" break; - case 240: /* type_specifier_nonarray: MAT3X4 */ -#line 1873 "MachineIndependent/glslang.y" + case 246: /* type_specifier_nonarray: MAT3X4 */ +#line 1907 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 4); } -#line 7654 "MachineIndependent/glslang_tab.cpp" +#line 7801 "MachineIndependent/glslang_tab.cpp" break; - case 241: /* type_specifier_nonarray: MAT4X2 */ -#line 1878 "MachineIndependent/glslang.y" + case 247: /* type_specifier_nonarray: MAT4X2 */ +#line 1912 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 2); } -#line 7664 "MachineIndependent/glslang_tab.cpp" +#line 7811 "MachineIndependent/glslang_tab.cpp" break; - case 242: /* type_specifier_nonarray: MAT4X3 */ -#line 1883 "MachineIndependent/glslang.y" + case 248: /* type_specifier_nonarray: MAT4X3 */ +#line 1917 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 3); } -#line 7674 "MachineIndependent/glslang_tab.cpp" +#line 7821 "MachineIndependent/glslang_tab.cpp" break; - case 243: /* type_specifier_nonarray: MAT4X4 */ -#line 1888 "MachineIndependent/glslang.y" + case 249: /* type_specifier_nonarray: MAT4X4 */ +#line 1922 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 7684 "MachineIndependent/glslang_tab.cpp" +#line 7831 "MachineIndependent/glslang_tab.cpp" break; - case 244: /* type_specifier_nonarray: DOUBLE */ -#line 1894 "MachineIndependent/glslang.y" + case 250: /* type_specifier_nonarray: DOUBLE */ +#line 1927 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -7692,121 +7839,121 @@ yyreduce: (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; } -#line 7696 "MachineIndependent/glslang_tab.cpp" +#line 7843 "MachineIndependent/glslang_tab.cpp" break; - case 245: /* type_specifier_nonarray: FLOAT16_T */ -#line 1901 "MachineIndependent/glslang.y" + case 251: /* type_specifier_nonarray: FLOAT16_T */ +#line 1934 "MachineIndependent/glslang.y" { parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "float16_t", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; } -#line 7706 "MachineIndependent/glslang_tab.cpp" +#line 7853 "MachineIndependent/glslang_tab.cpp" break; - case 246: /* type_specifier_nonarray: FLOAT32_T */ -#line 1906 "MachineIndependent/glslang.y" + case 252: /* type_specifier_nonarray: FLOAT32_T */ +#line 1939 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; } -#line 7716 "MachineIndependent/glslang_tab.cpp" +#line 7863 "MachineIndependent/glslang_tab.cpp" break; - case 247: /* type_specifier_nonarray: FLOAT64_T */ -#line 1911 "MachineIndependent/glslang.y" + case 253: /* type_specifier_nonarray: FLOAT64_T */ +#line 1944 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; } -#line 7726 "MachineIndependent/glslang_tab.cpp" +#line 7873 "MachineIndependent/glslang_tab.cpp" break; - case 248: /* type_specifier_nonarray: INT8_T */ -#line 1916 "MachineIndependent/glslang.y" + case 254: /* type_specifier_nonarray: INT8_T */ +#line 1949 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt8; } -#line 7736 "MachineIndependent/glslang_tab.cpp" +#line 7883 "MachineIndependent/glslang_tab.cpp" break; - case 249: /* type_specifier_nonarray: UINT8_T */ -#line 1921 "MachineIndependent/glslang.y" + case 255: /* type_specifier_nonarray: UINT8_T */ +#line 1954 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint8; } -#line 7746 "MachineIndependent/glslang_tab.cpp" +#line 7893 "MachineIndependent/glslang_tab.cpp" break; - case 250: /* type_specifier_nonarray: INT16_T */ -#line 1926 "MachineIndependent/glslang.y" + case 256: /* type_specifier_nonarray: INT16_T */ +#line 1959 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; } -#line 7756 "MachineIndependent/glslang_tab.cpp" +#line 7903 "MachineIndependent/glslang_tab.cpp" break; - case 251: /* type_specifier_nonarray: UINT16_T */ -#line 1931 "MachineIndependent/glslang.y" + case 257: /* type_specifier_nonarray: UINT16_T */ +#line 1964 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint16; } -#line 7766 "MachineIndependent/glslang_tab.cpp" +#line 7913 "MachineIndependent/glslang_tab.cpp" break; - case 252: /* type_specifier_nonarray: INT32_T */ -#line 1936 "MachineIndependent/glslang.y" + case 258: /* type_specifier_nonarray: INT32_T */ +#line 1969 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; } -#line 7776 "MachineIndependent/glslang_tab.cpp" +#line 7923 "MachineIndependent/glslang_tab.cpp" break; - case 253: /* type_specifier_nonarray: UINT32_T */ -#line 1941 "MachineIndependent/glslang.y" + case 259: /* type_specifier_nonarray: UINT32_T */ +#line 1974 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; } -#line 7786 "MachineIndependent/glslang_tab.cpp" +#line 7933 "MachineIndependent/glslang_tab.cpp" break; - case 254: /* type_specifier_nonarray: INT64_T */ -#line 1946 "MachineIndependent/glslang.y" + case 260: /* type_specifier_nonarray: INT64_T */ +#line 1979 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; } -#line 7796 "MachineIndependent/glslang_tab.cpp" +#line 7943 "MachineIndependent/glslang_tab.cpp" break; - case 255: /* type_specifier_nonarray: UINT64_T */ -#line 1951 "MachineIndependent/glslang.y" + case 261: /* type_specifier_nonarray: UINT64_T */ +#line 1984 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint64; } -#line 7806 "MachineIndependent/glslang_tab.cpp" +#line 7953 "MachineIndependent/glslang_tab.cpp" break; - case 256: /* type_specifier_nonarray: DVEC2 */ -#line 1956 "MachineIndependent/glslang.y" + case 262: /* type_specifier_nonarray: DVEC2 */ +#line 1989 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -7815,426 +7962,426 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setVector(2); } -#line 7819 "MachineIndependent/glslang_tab.cpp" - break; - - case 257: /* type_specifier_nonarray: DVEC3 */ -#line 1964 "MachineIndependent/glslang.y" - { - parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(3); - } -#line 7832 "MachineIndependent/glslang_tab.cpp" - break; - - case 258: /* type_specifier_nonarray: DVEC4 */ -#line 1972 "MachineIndependent/glslang.y" - { - parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(4); - } -#line 7845 "MachineIndependent/glslang_tab.cpp" - break; - - case 259: /* type_specifier_nonarray: F16VEC2 */ -#line 1980 "MachineIndependent/glslang.y" - { - parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setVector(2); - } -#line 7856 "MachineIndependent/glslang_tab.cpp" - break; - - case 260: /* type_specifier_nonarray: F16VEC3 */ -#line 1986 "MachineIndependent/glslang.y" - { - parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setVector(3); - } -#line 7867 "MachineIndependent/glslang_tab.cpp" - break; - - case 261: /* type_specifier_nonarray: F16VEC4 */ -#line 1992 "MachineIndependent/glslang.y" - { - parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setVector(4); - } -#line 7878 "MachineIndependent/glslang_tab.cpp" - break; - - case 262: /* type_specifier_nonarray: F32VEC2 */ -#line 1998 "MachineIndependent/glslang.y" - { - parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(2); - } -#line 7889 "MachineIndependent/glslang_tab.cpp" - break; - - case 263: /* type_specifier_nonarray: F32VEC3 */ -#line 2004 "MachineIndependent/glslang.y" - { - parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(3); - } -#line 7900 "MachineIndependent/glslang_tab.cpp" - break; - - case 264: /* type_specifier_nonarray: F32VEC4 */ -#line 2010 "MachineIndependent/glslang.y" - { - parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).setVector(4); - } -#line 7911 "MachineIndependent/glslang_tab.cpp" - break; - - case 265: /* type_specifier_nonarray: F64VEC2 */ -#line 2016 "MachineIndependent/glslang.y" - { - parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(2); - } -#line 7922 "MachineIndependent/glslang_tab.cpp" - break; - - case 266: /* type_specifier_nonarray: F64VEC3 */ -#line 2022 "MachineIndependent/glslang.y" - { - parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(3); - } -#line 7933 "MachineIndependent/glslang_tab.cpp" - break; - - case 267: /* type_specifier_nonarray: F64VEC4 */ -#line 2028 "MachineIndependent/glslang.y" - { - parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setVector(4); - } -#line 7944 "MachineIndependent/glslang_tab.cpp" - break; - - case 268: /* type_specifier_nonarray: I8VEC2 */ -#line 2034 "MachineIndependent/glslang.y" - { - parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt8; - (yyval.interm.type).setVector(2); - } -#line 7955 "MachineIndependent/glslang_tab.cpp" - break; - - case 269: /* type_specifier_nonarray: I8VEC3 */ -#line 2040 "MachineIndependent/glslang.y" - { - parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtInt8; - (yyval.interm.type).setVector(3); - } #line 7966 "MachineIndependent/glslang_tab.cpp" break; - case 270: /* type_specifier_nonarray: I8VEC4 */ -#line 2046 "MachineIndependent/glslang.y" + case 263: /* type_specifier_nonarray: DVEC3 */ +#line 1997 "MachineIndependent/glslang.y" + { + parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); + if (! parseContext.symbolTable.atBuiltInLevel()) + parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(3); + } +#line 7979 "MachineIndependent/glslang_tab.cpp" + break; + + case 264: /* type_specifier_nonarray: DVEC4 */ +#line 2005 "MachineIndependent/glslang.y" + { + parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); + if (! parseContext.symbolTable.atBuiltInLevel()) + parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(4); + } +#line 7992 "MachineIndependent/glslang_tab.cpp" + break; + + case 265: /* type_specifier_nonarray: F16VEC2 */ +#line 2013 "MachineIndependent/glslang.y" + { + parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setVector(2); + } +#line 8003 "MachineIndependent/glslang_tab.cpp" + break; + + case 266: /* type_specifier_nonarray: F16VEC3 */ +#line 2019 "MachineIndependent/glslang.y" + { + parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setVector(3); + } +#line 8014 "MachineIndependent/glslang_tab.cpp" + break; + + case 267: /* type_specifier_nonarray: F16VEC4 */ +#line 2025 "MachineIndependent/glslang.y" + { + parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setVector(4); + } +#line 8025 "MachineIndependent/glslang_tab.cpp" + break; + + case 268: /* type_specifier_nonarray: F32VEC2 */ +#line 2031 "MachineIndependent/glslang.y" + { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(2); + } +#line 8036 "MachineIndependent/glslang_tab.cpp" + break; + + case 269: /* type_specifier_nonarray: F32VEC3 */ +#line 2037 "MachineIndependent/glslang.y" + { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(3); + } +#line 8047 "MachineIndependent/glslang_tab.cpp" + break; + + case 270: /* type_specifier_nonarray: F32VEC4 */ +#line 2043 "MachineIndependent/glslang.y" + { + parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat; + (yyval.interm.type).setVector(4); + } +#line 8058 "MachineIndependent/glslang_tab.cpp" + break; + + case 271: /* type_specifier_nonarray: F64VEC2 */ +#line 2049 "MachineIndependent/glslang.y" + { + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(2); + } +#line 8069 "MachineIndependent/glslang_tab.cpp" + break; + + case 272: /* type_specifier_nonarray: F64VEC3 */ +#line 2055 "MachineIndependent/glslang.y" + { + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(3); + } +#line 8080 "MachineIndependent/glslang_tab.cpp" + break; + + case 273: /* type_specifier_nonarray: F64VEC4 */ +#line 2061 "MachineIndependent/glslang.y" + { + parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setVector(4); + } +#line 8091 "MachineIndependent/glslang_tab.cpp" + break; + + case 274: /* type_specifier_nonarray: I8VEC2 */ +#line 2067 "MachineIndependent/glslang.y" + { + parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt8; + (yyval.interm.type).setVector(2); + } +#line 8102 "MachineIndependent/glslang_tab.cpp" + break; + + case 275: /* type_specifier_nonarray: I8VEC3 */ +#line 2073 "MachineIndependent/glslang.y" + { + parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtInt8; + (yyval.interm.type).setVector(3); + } +#line 8113 "MachineIndependent/glslang_tab.cpp" + break; + + case 276: /* type_specifier_nonarray: I8VEC4 */ +#line 2079 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt8; (yyval.interm.type).setVector(4); } -#line 7977 "MachineIndependent/glslang_tab.cpp" +#line 8124 "MachineIndependent/glslang_tab.cpp" break; - case 271: /* type_specifier_nonarray: I16VEC2 */ -#line 2052 "MachineIndependent/glslang.y" + case 277: /* type_specifier_nonarray: I16VEC2 */ +#line 2085 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; (yyval.interm.type).setVector(2); } -#line 7988 "MachineIndependent/glslang_tab.cpp" +#line 8135 "MachineIndependent/glslang_tab.cpp" break; - case 272: /* type_specifier_nonarray: I16VEC3 */ -#line 2058 "MachineIndependent/glslang.y" + case 278: /* type_specifier_nonarray: I16VEC3 */ +#line 2091 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; (yyval.interm.type).setVector(3); } -#line 7999 "MachineIndependent/glslang_tab.cpp" +#line 8146 "MachineIndependent/glslang_tab.cpp" break; - case 273: /* type_specifier_nonarray: I16VEC4 */ -#line 2064 "MachineIndependent/glslang.y" + case 279: /* type_specifier_nonarray: I16VEC4 */ +#line 2097 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; (yyval.interm.type).setVector(4); } -#line 8010 "MachineIndependent/glslang_tab.cpp" +#line 8157 "MachineIndependent/glslang_tab.cpp" break; - case 274: /* type_specifier_nonarray: I32VEC2 */ -#line 2070 "MachineIndependent/glslang.y" + case 280: /* type_specifier_nonarray: I32VEC2 */ +#line 2103 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(2); } -#line 8021 "MachineIndependent/glslang_tab.cpp" +#line 8168 "MachineIndependent/glslang_tab.cpp" break; - case 275: /* type_specifier_nonarray: I32VEC3 */ -#line 2076 "MachineIndependent/glslang.y" + case 281: /* type_specifier_nonarray: I32VEC3 */ +#line 2109 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(3); } -#line 8032 "MachineIndependent/glslang_tab.cpp" +#line 8179 "MachineIndependent/glslang_tab.cpp" break; - case 276: /* type_specifier_nonarray: I32VEC4 */ -#line 2082 "MachineIndependent/glslang.y" + case 282: /* type_specifier_nonarray: I32VEC4 */ +#line 2115 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(4); } -#line 8043 "MachineIndependent/glslang_tab.cpp" +#line 8190 "MachineIndependent/glslang_tab.cpp" break; - case 277: /* type_specifier_nonarray: I64VEC2 */ -#line 2088 "MachineIndependent/glslang.y" + case 283: /* type_specifier_nonarray: I64VEC2 */ +#line 2121 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; (yyval.interm.type).setVector(2); } -#line 8054 "MachineIndependent/glslang_tab.cpp" +#line 8201 "MachineIndependent/glslang_tab.cpp" break; - case 278: /* type_specifier_nonarray: I64VEC3 */ -#line 2094 "MachineIndependent/glslang.y" + case 284: /* type_specifier_nonarray: I64VEC3 */ +#line 2127 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; (yyval.interm.type).setVector(3); } -#line 8065 "MachineIndependent/glslang_tab.cpp" +#line 8212 "MachineIndependent/glslang_tab.cpp" break; - case 279: /* type_specifier_nonarray: I64VEC4 */ -#line 2100 "MachineIndependent/glslang.y" + case 285: /* type_specifier_nonarray: I64VEC4 */ +#line 2133 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; (yyval.interm.type).setVector(4); } -#line 8076 "MachineIndependent/glslang_tab.cpp" +#line 8223 "MachineIndependent/glslang_tab.cpp" break; - case 280: /* type_specifier_nonarray: U8VEC2 */ -#line 2106 "MachineIndependent/glslang.y" + case 286: /* type_specifier_nonarray: U8VEC2 */ +#line 2139 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint8; (yyval.interm.type).setVector(2); } -#line 8087 "MachineIndependent/glslang_tab.cpp" - break; - - case 281: /* type_specifier_nonarray: U8VEC3 */ -#line 2112 "MachineIndependent/glslang.y" - { - parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint8; - (yyval.interm.type).setVector(3); - } -#line 8098 "MachineIndependent/glslang_tab.cpp" - break; - - case 282: /* type_specifier_nonarray: U8VEC4 */ -#line 2118 "MachineIndependent/glslang.y" - { - parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint8; - (yyval.interm.type).setVector(4); - } -#line 8109 "MachineIndependent/glslang_tab.cpp" - break; - - case 283: /* type_specifier_nonarray: U16VEC2 */ -#line 2124 "MachineIndependent/glslang.y" - { - parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint16; - (yyval.interm.type).setVector(2); - } -#line 8120 "MachineIndependent/glslang_tab.cpp" - break; - - case 284: /* type_specifier_nonarray: U16VEC3 */ -#line 2130 "MachineIndependent/glslang.y" - { - parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint16; - (yyval.interm.type).setVector(3); - } -#line 8131 "MachineIndependent/glslang_tab.cpp" - break; - - case 285: /* type_specifier_nonarray: U16VEC4 */ -#line 2136 "MachineIndependent/glslang.y" - { - parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint16; - (yyval.interm.type).setVector(4); - } -#line 8142 "MachineIndependent/glslang_tab.cpp" - break; - - case 286: /* type_specifier_nonarray: U32VEC2 */ -#line 2142 "MachineIndependent/glslang.y" - { - parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).setVector(2); - } -#line 8153 "MachineIndependent/glslang_tab.cpp" - break; - - case 287: /* type_specifier_nonarray: U32VEC3 */ -#line 2148 "MachineIndependent/glslang.y" - { - parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).setVector(3); - } -#line 8164 "MachineIndependent/glslang_tab.cpp" - break; - - case 288: /* type_specifier_nonarray: U32VEC4 */ -#line 2154 "MachineIndependent/glslang.y" - { - parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).setVector(4); - } -#line 8175 "MachineIndependent/glslang_tab.cpp" - break; - - case 289: /* type_specifier_nonarray: U64VEC2 */ -#line 2160 "MachineIndependent/glslang.y" - { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint64; - (yyval.interm.type).setVector(2); - } -#line 8186 "MachineIndependent/glslang_tab.cpp" - break; - - case 290: /* type_specifier_nonarray: U64VEC3 */ -#line 2166 "MachineIndependent/glslang.y" - { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint64; - (yyval.interm.type).setVector(3); - } -#line 8197 "MachineIndependent/glslang_tab.cpp" - break; - - case 291: /* type_specifier_nonarray: U64VEC4 */ -#line 2172 "MachineIndependent/glslang.y" - { - parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtUint64; - (yyval.interm.type).setVector(4); - } -#line 8208 "MachineIndependent/glslang_tab.cpp" - break; - - case 292: /* type_specifier_nonarray: DMAT2 */ -#line 2178 "MachineIndependent/glslang.y" - { - parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setMatrix(2, 2); - } -#line 8221 "MachineIndependent/glslang_tab.cpp" - break; - - case 293: /* type_specifier_nonarray: DMAT3 */ -#line 2186 "MachineIndependent/glslang.y" - { - parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setMatrix(3, 3); - } #line 8234 "MachineIndependent/glslang_tab.cpp" break; - case 294: /* type_specifier_nonarray: DMAT4 */ -#line 2194 "MachineIndependent/glslang.y" + case 287: /* type_specifier_nonarray: U8VEC3 */ +#line 2145 "MachineIndependent/glslang.y" + { + parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint8; + (yyval.interm.type).setVector(3); + } +#line 8245 "MachineIndependent/glslang_tab.cpp" + break; + + case 288: /* type_specifier_nonarray: U8VEC4 */ +#line 2151 "MachineIndependent/glslang.y" + { + parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint8; + (yyval.interm.type).setVector(4); + } +#line 8256 "MachineIndependent/glslang_tab.cpp" + break; + + case 289: /* type_specifier_nonarray: U16VEC2 */ +#line 2157 "MachineIndependent/glslang.y" + { + parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint16; + (yyval.interm.type).setVector(2); + } +#line 8267 "MachineIndependent/glslang_tab.cpp" + break; + + case 290: /* type_specifier_nonarray: U16VEC3 */ +#line 2163 "MachineIndependent/glslang.y" + { + parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint16; + (yyval.interm.type).setVector(3); + } +#line 8278 "MachineIndependent/glslang_tab.cpp" + break; + + case 291: /* type_specifier_nonarray: U16VEC4 */ +#line 2169 "MachineIndependent/glslang.y" + { + parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint16; + (yyval.interm.type).setVector(4); + } +#line 8289 "MachineIndependent/glslang_tab.cpp" + break; + + case 292: /* type_specifier_nonarray: U32VEC2 */ +#line 2175 "MachineIndependent/glslang.y" + { + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(2); + } +#line 8300 "MachineIndependent/glslang_tab.cpp" + break; + + case 293: /* type_specifier_nonarray: U32VEC3 */ +#line 2181 "MachineIndependent/glslang.y" + { + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(3); + } +#line 8311 "MachineIndependent/glslang_tab.cpp" + break; + + case 294: /* type_specifier_nonarray: U32VEC4 */ +#line 2187 "MachineIndependent/glslang.y" + { + parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint; + (yyval.interm.type).setVector(4); + } +#line 8322 "MachineIndependent/glslang_tab.cpp" + break; + + case 295: /* type_specifier_nonarray: U64VEC2 */ +#line 2193 "MachineIndependent/glslang.y" + { + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint64; + (yyval.interm.type).setVector(2); + } +#line 8333 "MachineIndependent/glslang_tab.cpp" + break; + + case 296: /* type_specifier_nonarray: U64VEC3 */ +#line 2199 "MachineIndependent/glslang.y" + { + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint64; + (yyval.interm.type).setVector(3); + } +#line 8344 "MachineIndependent/glslang_tab.cpp" + break; + + case 297: /* type_specifier_nonarray: U64VEC4 */ +#line 2205 "MachineIndependent/glslang.y" + { + parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtUint64; + (yyval.interm.type).setVector(4); + } +#line 8355 "MachineIndependent/glslang_tab.cpp" + break; + + case 298: /* type_specifier_nonarray: DMAT2 */ +#line 2211 "MachineIndependent/glslang.y" + { + parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); + if (! parseContext.symbolTable.atBuiltInLevel()) + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(2, 2); + } +#line 8368 "MachineIndependent/glslang_tab.cpp" + break; + + case 299: /* type_specifier_nonarray: DMAT3 */ +#line 2219 "MachineIndependent/glslang.y" + { + parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); + if (! parseContext.symbolTable.atBuiltInLevel()) + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(3, 3); + } +#line 8381 "MachineIndependent/glslang_tab.cpp" + break; + + case 300: /* type_specifier_nonarray: DMAT4 */ +#line 2227 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8243,11 +8390,11 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 8247 "MachineIndependent/glslang_tab.cpp" +#line 8394 "MachineIndependent/glslang_tab.cpp" break; - case 295: /* type_specifier_nonarray: DMAT2X2 */ -#line 2202 "MachineIndependent/glslang.y" + case 301: /* type_specifier_nonarray: DMAT2X2 */ +#line 2235 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8256,11 +8403,11 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 8260 "MachineIndependent/glslang_tab.cpp" +#line 8407 "MachineIndependent/glslang_tab.cpp" break; - case 296: /* type_specifier_nonarray: DMAT2X3 */ -#line 2210 "MachineIndependent/glslang.y" + case 302: /* type_specifier_nonarray: DMAT2X3 */ +#line 2243 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8269,11 +8416,11 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 3); } -#line 8273 "MachineIndependent/glslang_tab.cpp" +#line 8420 "MachineIndependent/glslang_tab.cpp" break; - case 297: /* type_specifier_nonarray: DMAT2X4 */ -#line 2218 "MachineIndependent/glslang.y" + case 303: /* type_specifier_nonarray: DMAT2X4 */ +#line 2251 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8282,11 +8429,11 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 4); } -#line 8286 "MachineIndependent/glslang_tab.cpp" +#line 8433 "MachineIndependent/glslang_tab.cpp" break; - case 298: /* type_specifier_nonarray: DMAT3X2 */ -#line 2226 "MachineIndependent/glslang.y" + case 304: /* type_specifier_nonarray: DMAT3X2 */ +#line 2259 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8295,11 +8442,11 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 2); } -#line 8299 "MachineIndependent/glslang_tab.cpp" +#line 8446 "MachineIndependent/glslang_tab.cpp" break; - case 299: /* type_specifier_nonarray: DMAT3X3 */ -#line 2234 "MachineIndependent/glslang.y" + case 305: /* type_specifier_nonarray: DMAT3X3 */ +#line 2267 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8308,11 +8455,11 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 8312 "MachineIndependent/glslang_tab.cpp" +#line 8459 "MachineIndependent/glslang_tab.cpp" break; - case 300: /* type_specifier_nonarray: DMAT3X4 */ -#line 2242 "MachineIndependent/glslang.y" + case 306: /* type_specifier_nonarray: DMAT3X4 */ +#line 2275 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8321,11 +8468,11 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 4); } -#line 8325 "MachineIndependent/glslang_tab.cpp" +#line 8472 "MachineIndependent/glslang_tab.cpp" break; - case 301: /* type_specifier_nonarray: DMAT4X2 */ -#line 2250 "MachineIndependent/glslang.y" + case 307: /* type_specifier_nonarray: DMAT4X2 */ +#line 2283 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8334,2254 +8481,2287 @@ yyreduce: (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 2); } -#line 8338 "MachineIndependent/glslang_tab.cpp" - break; - - case 302: /* type_specifier_nonarray: DMAT4X3 */ -#line 2258 "MachineIndependent/glslang.y" - { - parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setMatrix(4, 3); - } -#line 8351 "MachineIndependent/glslang_tab.cpp" - break; - - case 303: /* type_specifier_nonarray: DMAT4X4 */ -#line 2266 "MachineIndependent/glslang.y" - { - parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtDouble; - (yyval.interm.type).setMatrix(4, 4); - } -#line 8364 "MachineIndependent/glslang_tab.cpp" - break; - - case 304: /* type_specifier_nonarray: F16MAT2 */ -#line 2274 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 2); - } -#line 8375 "MachineIndependent/glslang_tab.cpp" - break; - - case 305: /* type_specifier_nonarray: F16MAT3 */ -#line 2280 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 3); - } -#line 8386 "MachineIndependent/glslang_tab.cpp" - break; - - case 306: /* type_specifier_nonarray: F16MAT4 */ -#line 2286 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(4, 4); - } -#line 8397 "MachineIndependent/glslang_tab.cpp" - break; - - case 307: /* type_specifier_nonarray: F16MAT2X2 */ -#line 2292 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 2); - } -#line 8408 "MachineIndependent/glslang_tab.cpp" - break; - - case 308: /* type_specifier_nonarray: F16MAT2X3 */ -#line 2298 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 3); - } -#line 8419 "MachineIndependent/glslang_tab.cpp" - break; - - case 309: /* type_specifier_nonarray: F16MAT2X4 */ -#line 2304 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(2, 4); - } -#line 8430 "MachineIndependent/glslang_tab.cpp" - break; - - case 310: /* type_specifier_nonarray: F16MAT3X2 */ -#line 2310 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 2); - } -#line 8441 "MachineIndependent/glslang_tab.cpp" - break; - - case 311: /* type_specifier_nonarray: F16MAT3X3 */ -#line 2316 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 3); - } -#line 8452 "MachineIndependent/glslang_tab.cpp" - break; - - case 312: /* type_specifier_nonarray: F16MAT3X4 */ -#line 2322 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(3, 4); - } -#line 8463 "MachineIndependent/glslang_tab.cpp" - break; - - case 313: /* type_specifier_nonarray: F16MAT4X2 */ -#line 2328 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(4, 2); - } -#line 8474 "MachineIndependent/glslang_tab.cpp" - break; - - case 314: /* type_specifier_nonarray: F16MAT4X3 */ -#line 2334 "MachineIndependent/glslang.y" - { - parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); - (yyval.interm.type).basicType = EbtFloat16; - (yyval.interm.type).setMatrix(4, 3); - } #line 8485 "MachineIndependent/glslang_tab.cpp" break; - case 315: /* type_specifier_nonarray: F16MAT4X4 */ -#line 2340 "MachineIndependent/glslang.y" + case 308: /* type_specifier_nonarray: DMAT4X3 */ +#line 2291 "MachineIndependent/glslang.y" + { + parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); + if (! parseContext.symbolTable.atBuiltInLevel()) + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 3); + } +#line 8498 "MachineIndependent/glslang_tab.cpp" + break; + + case 309: /* type_specifier_nonarray: DMAT4X4 */ +#line 2299 "MachineIndependent/glslang.y" + { + parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); + if (! parseContext.symbolTable.atBuiltInLevel()) + parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtDouble; + (yyval.interm.type).setMatrix(4, 4); + } +#line 8511 "MachineIndependent/glslang_tab.cpp" + break; + + case 310: /* type_specifier_nonarray: F16MAT2 */ +#line 2307 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 2); + } +#line 8522 "MachineIndependent/glslang_tab.cpp" + break; + + case 311: /* type_specifier_nonarray: F16MAT3 */ +#line 2313 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 3); + } +#line 8533 "MachineIndependent/glslang_tab.cpp" + break; + + case 312: /* type_specifier_nonarray: F16MAT4 */ +#line 2319 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(4, 4); + } +#line 8544 "MachineIndependent/glslang_tab.cpp" + break; + + case 313: /* type_specifier_nonarray: F16MAT2X2 */ +#line 2325 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 2); + } +#line 8555 "MachineIndependent/glslang_tab.cpp" + break; + + case 314: /* type_specifier_nonarray: F16MAT2X3 */ +#line 2331 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 3); + } +#line 8566 "MachineIndependent/glslang_tab.cpp" + break; + + case 315: /* type_specifier_nonarray: F16MAT2X4 */ +#line 2337 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(2, 4); + } +#line 8577 "MachineIndependent/glslang_tab.cpp" + break; + + case 316: /* type_specifier_nonarray: F16MAT3X2 */ +#line 2343 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 2); + } +#line 8588 "MachineIndependent/glslang_tab.cpp" + break; + + case 317: /* type_specifier_nonarray: F16MAT3X3 */ +#line 2349 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 3); + } +#line 8599 "MachineIndependent/glslang_tab.cpp" + break; + + case 318: /* type_specifier_nonarray: F16MAT3X4 */ +#line 2355 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(3, 4); + } +#line 8610 "MachineIndependent/glslang_tab.cpp" + break; + + case 319: /* type_specifier_nonarray: F16MAT4X2 */ +#line 2361 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(4, 2); + } +#line 8621 "MachineIndependent/glslang_tab.cpp" + break; + + case 320: /* type_specifier_nonarray: F16MAT4X3 */ +#line 2367 "MachineIndependent/glslang.y" + { + parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtFloat16; + (yyval.interm.type).setMatrix(4, 3); + } +#line 8632 "MachineIndependent/glslang_tab.cpp" + break; + + case 321: /* type_specifier_nonarray: F16MAT4X4 */ +#line 2373 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(4, 4); } -#line 8496 "MachineIndependent/glslang_tab.cpp" +#line 8643 "MachineIndependent/glslang_tab.cpp" break; - case 316: /* type_specifier_nonarray: F32MAT2 */ -#line 2346 "MachineIndependent/glslang.y" + case 322: /* type_specifier_nonarray: F32MAT2 */ +#line 2379 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 8507 "MachineIndependent/glslang_tab.cpp" +#line 8654 "MachineIndependent/glslang_tab.cpp" break; - case 317: /* type_specifier_nonarray: F32MAT3 */ -#line 2352 "MachineIndependent/glslang.y" + case 323: /* type_specifier_nonarray: F32MAT3 */ +#line 2385 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 8518 "MachineIndependent/glslang_tab.cpp" +#line 8665 "MachineIndependent/glslang_tab.cpp" break; - case 318: /* type_specifier_nonarray: F32MAT4 */ -#line 2358 "MachineIndependent/glslang.y" + case 324: /* type_specifier_nonarray: F32MAT4 */ +#line 2391 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 8529 "MachineIndependent/glslang_tab.cpp" +#line 8676 "MachineIndependent/glslang_tab.cpp" break; - case 319: /* type_specifier_nonarray: F32MAT2X2 */ -#line 2364 "MachineIndependent/glslang.y" + case 325: /* type_specifier_nonarray: F32MAT2X2 */ +#line 2397 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 8540 "MachineIndependent/glslang_tab.cpp" +#line 8687 "MachineIndependent/glslang_tab.cpp" break; - case 320: /* type_specifier_nonarray: F32MAT2X3 */ -#line 2370 "MachineIndependent/glslang.y" + case 326: /* type_specifier_nonarray: F32MAT2X3 */ +#line 2403 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 3); } -#line 8551 "MachineIndependent/glslang_tab.cpp" +#line 8698 "MachineIndependent/glslang_tab.cpp" break; - case 321: /* type_specifier_nonarray: F32MAT2X4 */ -#line 2376 "MachineIndependent/glslang.y" + case 327: /* type_specifier_nonarray: F32MAT2X4 */ +#line 2409 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 4); } -#line 8562 "MachineIndependent/glslang_tab.cpp" +#line 8709 "MachineIndependent/glslang_tab.cpp" break; - case 322: /* type_specifier_nonarray: F32MAT3X2 */ -#line 2382 "MachineIndependent/glslang.y" + case 328: /* type_specifier_nonarray: F32MAT3X2 */ +#line 2415 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 2); } -#line 8573 "MachineIndependent/glslang_tab.cpp" +#line 8720 "MachineIndependent/glslang_tab.cpp" break; - case 323: /* type_specifier_nonarray: F32MAT3X3 */ -#line 2388 "MachineIndependent/glslang.y" + case 329: /* type_specifier_nonarray: F32MAT3X3 */ +#line 2421 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 8584 "MachineIndependent/glslang_tab.cpp" +#line 8731 "MachineIndependent/glslang_tab.cpp" break; - case 324: /* type_specifier_nonarray: F32MAT3X4 */ -#line 2394 "MachineIndependent/glslang.y" + case 330: /* type_specifier_nonarray: F32MAT3X4 */ +#line 2427 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 4); } -#line 8595 "MachineIndependent/glslang_tab.cpp" +#line 8742 "MachineIndependent/glslang_tab.cpp" break; - case 325: /* type_specifier_nonarray: F32MAT4X2 */ -#line 2400 "MachineIndependent/glslang.y" + case 331: /* type_specifier_nonarray: F32MAT4X2 */ +#line 2433 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 2); } -#line 8606 "MachineIndependent/glslang_tab.cpp" +#line 8753 "MachineIndependent/glslang_tab.cpp" break; - case 326: /* type_specifier_nonarray: F32MAT4X3 */ -#line 2406 "MachineIndependent/glslang.y" + case 332: /* type_specifier_nonarray: F32MAT4X3 */ +#line 2439 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 3); } -#line 8617 "MachineIndependent/glslang_tab.cpp" +#line 8764 "MachineIndependent/glslang_tab.cpp" break; - case 327: /* type_specifier_nonarray: F32MAT4X4 */ -#line 2412 "MachineIndependent/glslang.y" + case 333: /* type_specifier_nonarray: F32MAT4X4 */ +#line 2445 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 8628 "MachineIndependent/glslang_tab.cpp" +#line 8775 "MachineIndependent/glslang_tab.cpp" break; - case 328: /* type_specifier_nonarray: F64MAT2 */ -#line 2418 "MachineIndependent/glslang.y" + case 334: /* type_specifier_nonarray: F64MAT2 */ +#line 2451 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 8639 "MachineIndependent/glslang_tab.cpp" +#line 8786 "MachineIndependent/glslang_tab.cpp" break; - case 329: /* type_specifier_nonarray: F64MAT3 */ -#line 2424 "MachineIndependent/glslang.y" + case 335: /* type_specifier_nonarray: F64MAT3 */ +#line 2457 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 8650 "MachineIndependent/glslang_tab.cpp" +#line 8797 "MachineIndependent/glslang_tab.cpp" break; - case 330: /* type_specifier_nonarray: F64MAT4 */ -#line 2430 "MachineIndependent/glslang.y" + case 336: /* type_specifier_nonarray: F64MAT4 */ +#line 2463 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 8661 "MachineIndependent/glslang_tab.cpp" +#line 8808 "MachineIndependent/glslang_tab.cpp" break; - case 331: /* type_specifier_nonarray: F64MAT2X2 */ -#line 2436 "MachineIndependent/glslang.y" + case 337: /* type_specifier_nonarray: F64MAT2X2 */ +#line 2469 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 8672 "MachineIndependent/glslang_tab.cpp" +#line 8819 "MachineIndependent/glslang_tab.cpp" break; - case 332: /* type_specifier_nonarray: F64MAT2X3 */ -#line 2442 "MachineIndependent/glslang.y" + case 338: /* type_specifier_nonarray: F64MAT2X3 */ +#line 2475 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 3); } -#line 8683 "MachineIndependent/glslang_tab.cpp" +#line 8830 "MachineIndependent/glslang_tab.cpp" break; - case 333: /* type_specifier_nonarray: F64MAT2X4 */ -#line 2448 "MachineIndependent/glslang.y" + case 339: /* type_specifier_nonarray: F64MAT2X4 */ +#line 2481 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 4); } -#line 8694 "MachineIndependent/glslang_tab.cpp" +#line 8841 "MachineIndependent/glslang_tab.cpp" break; - case 334: /* type_specifier_nonarray: F64MAT3X2 */ -#line 2454 "MachineIndependent/glslang.y" + case 340: /* type_specifier_nonarray: F64MAT3X2 */ +#line 2487 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 2); } -#line 8705 "MachineIndependent/glslang_tab.cpp" +#line 8852 "MachineIndependent/glslang_tab.cpp" break; - case 335: /* type_specifier_nonarray: F64MAT3X3 */ -#line 2460 "MachineIndependent/glslang.y" + case 341: /* type_specifier_nonarray: F64MAT3X3 */ +#line 2493 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 8716 "MachineIndependent/glslang_tab.cpp" +#line 8863 "MachineIndependent/glslang_tab.cpp" break; - case 336: /* type_specifier_nonarray: F64MAT3X4 */ -#line 2466 "MachineIndependent/glslang.y" + case 342: /* type_specifier_nonarray: F64MAT3X4 */ +#line 2499 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 4); } -#line 8727 "MachineIndependent/glslang_tab.cpp" +#line 8874 "MachineIndependent/glslang_tab.cpp" break; - case 337: /* type_specifier_nonarray: F64MAT4X2 */ -#line 2472 "MachineIndependent/glslang.y" + case 343: /* type_specifier_nonarray: F64MAT4X2 */ +#line 2505 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 2); } -#line 8738 "MachineIndependent/glslang_tab.cpp" +#line 8885 "MachineIndependent/glslang_tab.cpp" break; - case 338: /* type_specifier_nonarray: F64MAT4X3 */ -#line 2478 "MachineIndependent/glslang.y" + case 344: /* type_specifier_nonarray: F64MAT4X3 */ +#line 2511 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 3); } -#line 8749 "MachineIndependent/glslang_tab.cpp" +#line 8896 "MachineIndependent/glslang_tab.cpp" break; - case 339: /* type_specifier_nonarray: F64MAT4X4 */ -#line 2484 "MachineIndependent/glslang.y" + case 345: /* type_specifier_nonarray: F64MAT4X4 */ +#line 2517 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 8760 "MachineIndependent/glslang_tab.cpp" +#line 8907 "MachineIndependent/glslang_tab.cpp" break; - case 340: /* type_specifier_nonarray: ACCSTRUCTNV */ -#line 2490 "MachineIndependent/glslang.y" + case 346: /* type_specifier_nonarray: ACCSTRUCTNV */ +#line 2523 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtAccStruct; } -#line 8769 "MachineIndependent/glslang_tab.cpp" +#line 8916 "MachineIndependent/glslang_tab.cpp" break; - case 341: /* type_specifier_nonarray: ACCSTRUCTEXT */ -#line 2494 "MachineIndependent/glslang.y" + case 347: /* type_specifier_nonarray: ACCSTRUCTEXT */ +#line 2527 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtAccStruct; } -#line 8778 "MachineIndependent/glslang_tab.cpp" +#line 8925 "MachineIndependent/glslang_tab.cpp" break; - case 342: /* type_specifier_nonarray: RAYQUERYEXT */ -#line 2498 "MachineIndependent/glslang.y" + case 348: /* type_specifier_nonarray: RAYQUERYEXT */ +#line 2531 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtRayQuery; } -#line 8787 "MachineIndependent/glslang_tab.cpp" +#line 8934 "MachineIndependent/glslang_tab.cpp" break; - case 343: /* type_specifier_nonarray: ATOMIC_UINT */ -#line 2502 "MachineIndependent/glslang.y" + case 349: /* type_specifier_nonarray: ATOMIC_UINT */ +#line 2535 "MachineIndependent/glslang.y" { parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtAtomicUint; } -#line 8797 "MachineIndependent/glslang_tab.cpp" +#line 8944 "MachineIndependent/glslang_tab.cpp" break; - case 344: /* type_specifier_nonarray: SAMPLER1D */ -#line 2507 "MachineIndependent/glslang.y" + case 350: /* type_specifier_nonarray: SAMPLER1D */ +#line 2540 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D); } -#line 8807 "MachineIndependent/glslang_tab.cpp" +#line 8954 "MachineIndependent/glslang_tab.cpp" break; - case 345: /* type_specifier_nonarray: SAMPLER2D */ -#line 2513 "MachineIndependent/glslang.y" + case 351: /* type_specifier_nonarray: SAMPLER2D */ +#line 2545 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D); } -#line 8817 "MachineIndependent/glslang_tab.cpp" +#line 8964 "MachineIndependent/glslang_tab.cpp" break; - case 346: /* type_specifier_nonarray: SAMPLER3D */ -#line 2518 "MachineIndependent/glslang.y" + case 352: /* type_specifier_nonarray: SAMPLER3D */ +#line 2550 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd3D); } -#line 8827 "MachineIndependent/glslang_tab.cpp" +#line 8974 "MachineIndependent/glslang_tab.cpp" break; - case 347: /* type_specifier_nonarray: SAMPLERCUBE */ -#line 2523 "MachineIndependent/glslang.y" + case 353: /* type_specifier_nonarray: SAMPLERCUBE */ +#line 2555 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube); } -#line 8837 "MachineIndependent/glslang_tab.cpp" +#line 8984 "MachineIndependent/glslang_tab.cpp" break; - case 348: /* type_specifier_nonarray: SAMPLER2DSHADOW */ -#line 2528 "MachineIndependent/glslang.y" + case 354: /* type_specifier_nonarray: SAMPLER2DSHADOW */ +#line 2560 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true); } -#line 8847 "MachineIndependent/glslang_tab.cpp" +#line 8994 "MachineIndependent/glslang_tab.cpp" break; - case 349: /* type_specifier_nonarray: SAMPLERCUBESHADOW */ -#line 2533 "MachineIndependent/glslang.y" + case 355: /* type_specifier_nonarray: SAMPLERCUBESHADOW */ +#line 2565 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true); } -#line 8857 "MachineIndependent/glslang_tab.cpp" +#line 9004 "MachineIndependent/glslang_tab.cpp" break; - case 350: /* type_specifier_nonarray: SAMPLER2DARRAY */ -#line 2538 "MachineIndependent/glslang.y" + case 356: /* type_specifier_nonarray: SAMPLER2DARRAY */ +#line 2570 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true); } -#line 8867 "MachineIndependent/glslang_tab.cpp" +#line 9014 "MachineIndependent/glslang_tab.cpp" break; - case 351: /* type_specifier_nonarray: SAMPLER2DARRAYSHADOW */ -#line 2543 "MachineIndependent/glslang.y" + case 357: /* type_specifier_nonarray: SAMPLER2DARRAYSHADOW */ +#line 2575 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true); } -#line 8877 "MachineIndependent/glslang_tab.cpp" +#line 9024 "MachineIndependent/glslang_tab.cpp" break; - case 352: /* type_specifier_nonarray: SAMPLER1DSHADOW */ -#line 2549 "MachineIndependent/glslang.y" + case 358: /* type_specifier_nonarray: SAMPLER1DSHADOW */ +#line 2580 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true); } -#line 8887 "MachineIndependent/glslang_tab.cpp" +#line 9034 "MachineIndependent/glslang_tab.cpp" break; - case 353: /* type_specifier_nonarray: SAMPLER1DARRAY */ -#line 2554 "MachineIndependent/glslang.y" + case 359: /* type_specifier_nonarray: SAMPLER1DARRAY */ +#line 2585 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true); } -#line 8897 "MachineIndependent/glslang_tab.cpp" +#line 9044 "MachineIndependent/glslang_tab.cpp" break; - case 354: /* type_specifier_nonarray: SAMPLER1DARRAYSHADOW */ -#line 2559 "MachineIndependent/glslang.y" + case 360: /* type_specifier_nonarray: SAMPLER1DARRAYSHADOW */ +#line 2590 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true); } -#line 8907 "MachineIndependent/glslang_tab.cpp" +#line 9054 "MachineIndependent/glslang_tab.cpp" break; - case 355: /* type_specifier_nonarray: SAMPLERCUBEARRAY */ -#line 2564 "MachineIndependent/glslang.y" + case 361: /* type_specifier_nonarray: SAMPLERCUBEARRAY */ +#line 2595 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true); } -#line 8917 "MachineIndependent/glslang_tab.cpp" +#line 9064 "MachineIndependent/glslang_tab.cpp" break; - case 356: /* type_specifier_nonarray: SAMPLERCUBEARRAYSHADOW */ -#line 2569 "MachineIndependent/glslang.y" + case 362: /* type_specifier_nonarray: SAMPLERCUBEARRAYSHADOW */ +#line 2600 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true); } -#line 8927 "MachineIndependent/glslang_tab.cpp" +#line 9074 "MachineIndependent/glslang_tab.cpp" break; - case 357: /* type_specifier_nonarray: F16SAMPLER1D */ -#line 2574 "MachineIndependent/glslang.y" + case 363: /* type_specifier_nonarray: F16SAMPLER1D */ +#line 2605 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D); } -#line 8938 "MachineIndependent/glslang_tab.cpp" +#line 9085 "MachineIndependent/glslang_tab.cpp" break; - case 358: /* type_specifier_nonarray: F16SAMPLER2D */ -#line 2580 "MachineIndependent/glslang.y" + case 364: /* type_specifier_nonarray: F16SAMPLER2D */ +#line 2611 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D); } -#line 8949 "MachineIndependent/glslang_tab.cpp" +#line 9096 "MachineIndependent/glslang_tab.cpp" break; - case 359: /* type_specifier_nonarray: F16SAMPLER3D */ -#line 2586 "MachineIndependent/glslang.y" + case 365: /* type_specifier_nonarray: F16SAMPLER3D */ +#line 2617 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd3D); } -#line 8960 "MachineIndependent/glslang_tab.cpp" +#line 9107 "MachineIndependent/glslang_tab.cpp" break; - case 360: /* type_specifier_nonarray: F16SAMPLERCUBE */ -#line 2592 "MachineIndependent/glslang.y" + case 366: /* type_specifier_nonarray: F16SAMPLERCUBE */ +#line 2623 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube); } -#line 8971 "MachineIndependent/glslang_tab.cpp" +#line 9118 "MachineIndependent/glslang_tab.cpp" break; - case 361: /* type_specifier_nonarray: F16SAMPLER1DSHADOW */ -#line 2598 "MachineIndependent/glslang.y" + case 367: /* type_specifier_nonarray: F16SAMPLER1DSHADOW */ +#line 2629 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true); } -#line 8982 "MachineIndependent/glslang_tab.cpp" +#line 9129 "MachineIndependent/glslang_tab.cpp" break; - case 362: /* type_specifier_nonarray: F16SAMPLER2DSHADOW */ -#line 2604 "MachineIndependent/glslang.y" + case 368: /* type_specifier_nonarray: F16SAMPLER2DSHADOW */ +#line 2635 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true); } -#line 8993 "MachineIndependent/glslang_tab.cpp" +#line 9140 "MachineIndependent/glslang_tab.cpp" break; - case 363: /* type_specifier_nonarray: F16SAMPLERCUBESHADOW */ -#line 2610 "MachineIndependent/glslang.y" + case 369: /* type_specifier_nonarray: F16SAMPLERCUBESHADOW */ +#line 2641 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true); } -#line 9004 "MachineIndependent/glslang_tab.cpp" +#line 9151 "MachineIndependent/glslang_tab.cpp" break; - case 364: /* type_specifier_nonarray: F16SAMPLER1DARRAY */ -#line 2616 "MachineIndependent/glslang.y" + case 370: /* type_specifier_nonarray: F16SAMPLER1DARRAY */ +#line 2647 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true); } -#line 9015 "MachineIndependent/glslang_tab.cpp" +#line 9162 "MachineIndependent/glslang_tab.cpp" break; - case 365: /* type_specifier_nonarray: F16SAMPLER2DARRAY */ -#line 2622 "MachineIndependent/glslang.y" + case 371: /* type_specifier_nonarray: F16SAMPLER2DARRAY */ +#line 2653 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true); } -#line 9026 "MachineIndependent/glslang_tab.cpp" +#line 9173 "MachineIndependent/glslang_tab.cpp" break; - case 366: /* type_specifier_nonarray: F16SAMPLER1DARRAYSHADOW */ -#line 2628 "MachineIndependent/glslang.y" + case 372: /* type_specifier_nonarray: F16SAMPLER1DARRAYSHADOW */ +#line 2659 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true); } -#line 9037 "MachineIndependent/glslang_tab.cpp" +#line 9184 "MachineIndependent/glslang_tab.cpp" break; - case 367: /* type_specifier_nonarray: F16SAMPLER2DARRAYSHADOW */ -#line 2634 "MachineIndependent/glslang.y" + case 373: /* type_specifier_nonarray: F16SAMPLER2DARRAYSHADOW */ +#line 2665 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true); } -#line 9048 "MachineIndependent/glslang_tab.cpp" +#line 9195 "MachineIndependent/glslang_tab.cpp" break; - case 368: /* type_specifier_nonarray: F16SAMPLERCUBEARRAY */ -#line 2640 "MachineIndependent/glslang.y" + case 374: /* type_specifier_nonarray: F16SAMPLERCUBEARRAY */ +#line 2671 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true); } -#line 9059 "MachineIndependent/glslang_tab.cpp" +#line 9206 "MachineIndependent/glslang_tab.cpp" break; - case 369: /* type_specifier_nonarray: F16SAMPLERCUBEARRAYSHADOW */ -#line 2646 "MachineIndependent/glslang.y" + case 375: /* type_specifier_nonarray: F16SAMPLERCUBEARRAYSHADOW */ +#line 2677 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true); } -#line 9070 "MachineIndependent/glslang_tab.cpp" +#line 9217 "MachineIndependent/glslang_tab.cpp" break; - case 370: /* type_specifier_nonarray: ISAMPLER1D */ -#line 2652 "MachineIndependent/glslang.y" + case 376: /* type_specifier_nonarray: ISAMPLER1D */ +#line 2683 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd1D); } -#line 9080 "MachineIndependent/glslang_tab.cpp" +#line 9227 "MachineIndependent/glslang_tab.cpp" break; - case 371: /* type_specifier_nonarray: ISAMPLER2D */ -#line 2658 "MachineIndependent/glslang.y" + case 377: /* type_specifier_nonarray: ISAMPLER2D */ +#line 2688 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D); } -#line 9090 "MachineIndependent/glslang_tab.cpp" +#line 9237 "MachineIndependent/glslang_tab.cpp" break; - case 372: /* type_specifier_nonarray: ISAMPLER3D */ -#line 2663 "MachineIndependent/glslang.y" + case 378: /* type_specifier_nonarray: ISAMPLER3D */ +#line 2693 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd3D); } -#line 9100 "MachineIndependent/glslang_tab.cpp" +#line 9247 "MachineIndependent/glslang_tab.cpp" break; - case 373: /* type_specifier_nonarray: ISAMPLERCUBE */ -#line 2668 "MachineIndependent/glslang.y" + case 379: /* type_specifier_nonarray: ISAMPLERCUBE */ +#line 2698 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdCube); } -#line 9110 "MachineIndependent/glslang_tab.cpp" +#line 9257 "MachineIndependent/glslang_tab.cpp" break; - case 374: /* type_specifier_nonarray: ISAMPLER2DARRAY */ -#line 2673 "MachineIndependent/glslang.y" + case 380: /* type_specifier_nonarray: ISAMPLER2DARRAY */ +#line 2703 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D, true); } -#line 9120 "MachineIndependent/glslang_tab.cpp" +#line 9267 "MachineIndependent/glslang_tab.cpp" break; - case 375: /* type_specifier_nonarray: USAMPLER2D */ -#line 2678 "MachineIndependent/glslang.y" + case 381: /* type_specifier_nonarray: USAMPLER2D */ +#line 2708 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D); } -#line 9130 "MachineIndependent/glslang_tab.cpp" +#line 9277 "MachineIndependent/glslang_tab.cpp" break; - case 376: /* type_specifier_nonarray: USAMPLER3D */ -#line 2683 "MachineIndependent/glslang.y" + case 382: /* type_specifier_nonarray: USAMPLER3D */ +#line 2713 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd3D); } -#line 9140 "MachineIndependent/glslang_tab.cpp" +#line 9287 "MachineIndependent/glslang_tab.cpp" break; - case 377: /* type_specifier_nonarray: USAMPLERCUBE */ -#line 2688 "MachineIndependent/glslang.y" + case 383: /* type_specifier_nonarray: USAMPLERCUBE */ +#line 2718 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdCube); } -#line 9150 "MachineIndependent/glslang_tab.cpp" +#line 9297 "MachineIndependent/glslang_tab.cpp" break; - case 378: /* type_specifier_nonarray: ISAMPLER1DARRAY */ -#line 2694 "MachineIndependent/glslang.y" + case 384: /* type_specifier_nonarray: ISAMPLER1DARRAY */ +#line 2723 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd1D, true); } -#line 9160 "MachineIndependent/glslang_tab.cpp" +#line 9307 "MachineIndependent/glslang_tab.cpp" break; - case 379: /* type_specifier_nonarray: ISAMPLERCUBEARRAY */ -#line 2699 "MachineIndependent/glslang.y" + case 385: /* type_specifier_nonarray: ISAMPLERCUBEARRAY */ +#line 2728 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdCube, true); } -#line 9170 "MachineIndependent/glslang_tab.cpp" +#line 9317 "MachineIndependent/glslang_tab.cpp" break; - case 380: /* type_specifier_nonarray: USAMPLER1D */ -#line 2704 "MachineIndependent/glslang.y" + case 386: /* type_specifier_nonarray: USAMPLER1D */ +#line 2733 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd1D); } -#line 9180 "MachineIndependent/glslang_tab.cpp" +#line 9327 "MachineIndependent/glslang_tab.cpp" break; - case 381: /* type_specifier_nonarray: USAMPLER1DARRAY */ -#line 2709 "MachineIndependent/glslang.y" + case 387: /* type_specifier_nonarray: USAMPLER1DARRAY */ +#line 2738 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd1D, true); } -#line 9190 "MachineIndependent/glslang_tab.cpp" +#line 9337 "MachineIndependent/glslang_tab.cpp" break; - case 382: /* type_specifier_nonarray: USAMPLERCUBEARRAY */ -#line 2714 "MachineIndependent/glslang.y" + case 388: /* type_specifier_nonarray: USAMPLERCUBEARRAY */ +#line 2743 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdCube, true); } -#line 9200 "MachineIndependent/glslang_tab.cpp" +#line 9347 "MachineIndependent/glslang_tab.cpp" break; - case 383: /* type_specifier_nonarray: TEXTURECUBEARRAY */ -#line 2719 "MachineIndependent/glslang.y" + case 389: /* type_specifier_nonarray: TEXTURECUBEARRAY */ +#line 2748 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true); } -#line 9210 "MachineIndependent/glslang_tab.cpp" +#line 9357 "MachineIndependent/glslang_tab.cpp" break; - case 384: /* type_specifier_nonarray: ITEXTURECUBEARRAY */ -#line 2724 "MachineIndependent/glslang.y" + case 390: /* type_specifier_nonarray: ITEXTURECUBEARRAY */ +#line 2753 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true); } -#line 9220 "MachineIndependent/glslang_tab.cpp" +#line 9367 "MachineIndependent/glslang_tab.cpp" break; - case 385: /* type_specifier_nonarray: UTEXTURECUBEARRAY */ -#line 2729 "MachineIndependent/glslang.y" + case 391: /* type_specifier_nonarray: UTEXTURECUBEARRAY */ +#line 2758 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true); } -#line 9230 "MachineIndependent/glslang_tab.cpp" +#line 9377 "MachineIndependent/glslang_tab.cpp" break; - case 386: /* type_specifier_nonarray: USAMPLER2DARRAY */ -#line 2735 "MachineIndependent/glslang.y" + case 392: /* type_specifier_nonarray: USAMPLER2DARRAY */ +#line 2763 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D, true); } -#line 9240 "MachineIndependent/glslang_tab.cpp" +#line 9387 "MachineIndependent/glslang_tab.cpp" break; - case 387: /* type_specifier_nonarray: TEXTURE2D */ -#line 2740 "MachineIndependent/glslang.y" + case 393: /* type_specifier_nonarray: TEXTURE2D */ +#line 2768 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D); } -#line 9250 "MachineIndependent/glslang_tab.cpp" +#line 9397 "MachineIndependent/glslang_tab.cpp" break; - case 388: /* type_specifier_nonarray: TEXTURE3D */ -#line 2745 "MachineIndependent/glslang.y" + case 394: /* type_specifier_nonarray: TEXTURE3D */ +#line 2773 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D); } -#line 9260 "MachineIndependent/glslang_tab.cpp" +#line 9407 "MachineIndependent/glslang_tab.cpp" break; - case 389: /* type_specifier_nonarray: TEXTURE2DARRAY */ -#line 2750 "MachineIndependent/glslang.y" + case 395: /* type_specifier_nonarray: TEXTURE2DARRAY */ +#line 2778 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true); } -#line 9270 "MachineIndependent/glslang_tab.cpp" +#line 9417 "MachineIndependent/glslang_tab.cpp" break; - case 390: /* type_specifier_nonarray: TEXTURECUBE */ -#line 2755 "MachineIndependent/glslang.y" + case 396: /* type_specifier_nonarray: TEXTURECUBE */ +#line 2783 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube); } -#line 9280 "MachineIndependent/glslang_tab.cpp" +#line 9427 "MachineIndependent/glslang_tab.cpp" break; - case 391: /* type_specifier_nonarray: ITEXTURE2D */ -#line 2760 "MachineIndependent/glslang.y" + case 397: /* type_specifier_nonarray: ITEXTURE2D */ +#line 2788 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D); } -#line 9290 "MachineIndependent/glslang_tab.cpp" +#line 9437 "MachineIndependent/glslang_tab.cpp" break; - case 392: /* type_specifier_nonarray: ITEXTURE3D */ -#line 2765 "MachineIndependent/glslang.y" + case 398: /* type_specifier_nonarray: ITEXTURE3D */ +#line 2793 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D); } -#line 9300 "MachineIndependent/glslang_tab.cpp" +#line 9447 "MachineIndependent/glslang_tab.cpp" break; - case 393: /* type_specifier_nonarray: ITEXTURECUBE */ -#line 2770 "MachineIndependent/glslang.y" + case 399: /* type_specifier_nonarray: ITEXTURECUBE */ +#line 2798 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube); } -#line 9310 "MachineIndependent/glslang_tab.cpp" +#line 9457 "MachineIndependent/glslang_tab.cpp" break; - case 394: /* type_specifier_nonarray: ITEXTURE2DARRAY */ -#line 2775 "MachineIndependent/glslang.y" + case 400: /* type_specifier_nonarray: ITEXTURE2DARRAY */ +#line 2803 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true); } -#line 9320 "MachineIndependent/glslang_tab.cpp" +#line 9467 "MachineIndependent/glslang_tab.cpp" break; - case 395: /* type_specifier_nonarray: UTEXTURE2D */ -#line 2780 "MachineIndependent/glslang.y" + case 401: /* type_specifier_nonarray: UTEXTURE2D */ +#line 2808 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D); } -#line 9330 "MachineIndependent/glslang_tab.cpp" +#line 9477 "MachineIndependent/glslang_tab.cpp" break; - case 396: /* type_specifier_nonarray: UTEXTURE3D */ -#line 2785 "MachineIndependent/glslang.y" + case 402: /* type_specifier_nonarray: UTEXTURE3D */ +#line 2813 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D); } -#line 9340 "MachineIndependent/glslang_tab.cpp" +#line 9487 "MachineIndependent/glslang_tab.cpp" break; - case 397: /* type_specifier_nonarray: UTEXTURECUBE */ -#line 2790 "MachineIndependent/glslang.y" + case 403: /* type_specifier_nonarray: UTEXTURECUBE */ +#line 2818 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube); } -#line 9350 "MachineIndependent/glslang_tab.cpp" +#line 9497 "MachineIndependent/glslang_tab.cpp" break; - case 398: /* type_specifier_nonarray: UTEXTURE2DARRAY */ -#line 2795 "MachineIndependent/glslang.y" + case 404: /* type_specifier_nonarray: UTEXTURE2DARRAY */ +#line 2823 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true); } -#line 9360 "MachineIndependent/glslang_tab.cpp" +#line 9507 "MachineIndependent/glslang_tab.cpp" break; - case 399: /* type_specifier_nonarray: SAMPLER */ -#line 2800 "MachineIndependent/glslang.y" + case 405: /* type_specifier_nonarray: SAMPLER */ +#line 2828 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setPureSampler(false); } -#line 9370 "MachineIndependent/glslang_tab.cpp" +#line 9517 "MachineIndependent/glslang_tab.cpp" break; - case 400: /* type_specifier_nonarray: SAMPLERSHADOW */ -#line 2805 "MachineIndependent/glslang.y" + case 406: /* type_specifier_nonarray: SAMPLERSHADOW */ +#line 2833 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setPureSampler(true); } -#line 9380 "MachineIndependent/glslang_tab.cpp" +#line 9527 "MachineIndependent/glslang_tab.cpp" break; - case 401: /* type_specifier_nonarray: SAMPLER2DRECT */ -#line 2811 "MachineIndependent/glslang.y" + case 407: /* type_specifier_nonarray: SAMPLER2DRECT */ +#line 2838 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdRect); } -#line 9390 "MachineIndependent/glslang_tab.cpp" +#line 9537 "MachineIndependent/glslang_tab.cpp" break; - case 402: /* type_specifier_nonarray: SAMPLER2DRECTSHADOW */ -#line 2816 "MachineIndependent/glslang.y" + case 408: /* type_specifier_nonarray: SAMPLER2DRECTSHADOW */ +#line 2843 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true); } -#line 9400 "MachineIndependent/glslang_tab.cpp" +#line 9547 "MachineIndependent/glslang_tab.cpp" break; - case 403: /* type_specifier_nonarray: F16SAMPLER2DRECT */ -#line 2821 "MachineIndependent/glslang.y" + case 409: /* type_specifier_nonarray: F16SAMPLER2DRECT */ +#line 2848 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdRect); } -#line 9411 "MachineIndependent/glslang_tab.cpp" +#line 9558 "MachineIndependent/glslang_tab.cpp" break; - case 404: /* type_specifier_nonarray: F16SAMPLER2DRECTSHADOW */ -#line 2827 "MachineIndependent/glslang.y" + case 410: /* type_specifier_nonarray: F16SAMPLER2DRECTSHADOW */ +#line 2854 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true); } -#line 9422 "MachineIndependent/glslang_tab.cpp" +#line 9569 "MachineIndependent/glslang_tab.cpp" break; - case 405: /* type_specifier_nonarray: ISAMPLER2DRECT */ -#line 2833 "MachineIndependent/glslang.y" + case 411: /* type_specifier_nonarray: ISAMPLER2DRECT */ +#line 2860 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdRect); } -#line 9432 "MachineIndependent/glslang_tab.cpp" +#line 9579 "MachineIndependent/glslang_tab.cpp" break; - case 406: /* type_specifier_nonarray: USAMPLER2DRECT */ -#line 2838 "MachineIndependent/glslang.y" + case 412: /* type_specifier_nonarray: USAMPLER2DRECT */ +#line 2865 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdRect); } -#line 9442 "MachineIndependent/glslang_tab.cpp" +#line 9589 "MachineIndependent/glslang_tab.cpp" break; - case 407: /* type_specifier_nonarray: SAMPLERBUFFER */ -#line 2843 "MachineIndependent/glslang.y" + case 413: /* type_specifier_nonarray: SAMPLERBUFFER */ +#line 2870 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer); } -#line 9452 "MachineIndependent/glslang_tab.cpp" +#line 9599 "MachineIndependent/glslang_tab.cpp" break; - case 408: /* type_specifier_nonarray: F16SAMPLERBUFFER */ -#line 2848 "MachineIndependent/glslang.y" + case 414: /* type_specifier_nonarray: F16SAMPLERBUFFER */ +#line 2875 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer); } -#line 9463 "MachineIndependent/glslang_tab.cpp" +#line 9610 "MachineIndependent/glslang_tab.cpp" break; - case 409: /* type_specifier_nonarray: ISAMPLERBUFFER */ -#line 2854 "MachineIndependent/glslang.y" + case 415: /* type_specifier_nonarray: ISAMPLERBUFFER */ +#line 2881 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdBuffer); } -#line 9473 "MachineIndependent/glslang_tab.cpp" +#line 9620 "MachineIndependent/glslang_tab.cpp" break; - case 410: /* type_specifier_nonarray: USAMPLERBUFFER */ -#line 2859 "MachineIndependent/glslang.y" + case 416: /* type_specifier_nonarray: USAMPLERBUFFER */ +#line 2886 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdBuffer); } -#line 9483 "MachineIndependent/glslang_tab.cpp" +#line 9630 "MachineIndependent/glslang_tab.cpp" break; - case 411: /* type_specifier_nonarray: SAMPLER2DMS */ -#line 2864 "MachineIndependent/glslang.y" + case 417: /* type_specifier_nonarray: SAMPLER2DMS */ +#line 2891 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true); } -#line 9493 "MachineIndependent/glslang_tab.cpp" +#line 9640 "MachineIndependent/glslang_tab.cpp" break; - case 412: /* type_specifier_nonarray: F16SAMPLER2DMS */ -#line 2869 "MachineIndependent/glslang.y" + case 418: /* type_specifier_nonarray: F16SAMPLER2DMS */ +#line 2896 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true); } -#line 9504 "MachineIndependent/glslang_tab.cpp" +#line 9651 "MachineIndependent/glslang_tab.cpp" break; - case 413: /* type_specifier_nonarray: ISAMPLER2DMS */ -#line 2875 "MachineIndependent/glslang.y" + case 419: /* type_specifier_nonarray: ISAMPLER2DMS */ +#line 2902 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true); } -#line 9514 "MachineIndependent/glslang_tab.cpp" +#line 9661 "MachineIndependent/glslang_tab.cpp" break; - case 414: /* type_specifier_nonarray: USAMPLER2DMS */ -#line 2880 "MachineIndependent/glslang.y" + case 420: /* type_specifier_nonarray: USAMPLER2DMS */ +#line 2907 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true); } -#line 9524 "MachineIndependent/glslang_tab.cpp" +#line 9671 "MachineIndependent/glslang_tab.cpp" break; - case 415: /* type_specifier_nonarray: SAMPLER2DMSARRAY */ -#line 2885 "MachineIndependent/glslang.y" + case 421: /* type_specifier_nonarray: SAMPLER2DMSARRAY */ +#line 2912 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true); } -#line 9534 "MachineIndependent/glslang_tab.cpp" +#line 9681 "MachineIndependent/glslang_tab.cpp" break; - case 416: /* type_specifier_nonarray: F16SAMPLER2DMSARRAY */ -#line 2890 "MachineIndependent/glslang.y" + case 422: /* type_specifier_nonarray: F16SAMPLER2DMSARRAY */ +#line 2917 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true); } -#line 9545 "MachineIndependent/glslang_tab.cpp" +#line 9692 "MachineIndependent/glslang_tab.cpp" break; - case 417: /* type_specifier_nonarray: ISAMPLER2DMSARRAY */ -#line 2896 "MachineIndependent/glslang.y" + case 423: /* type_specifier_nonarray: ISAMPLER2DMSARRAY */ +#line 2923 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true); } -#line 9555 "MachineIndependent/glslang_tab.cpp" +#line 9702 "MachineIndependent/glslang_tab.cpp" break; - case 418: /* type_specifier_nonarray: USAMPLER2DMSARRAY */ -#line 2901 "MachineIndependent/glslang.y" + case 424: /* type_specifier_nonarray: USAMPLER2DMSARRAY */ +#line 2928 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true); } -#line 9565 "MachineIndependent/glslang_tab.cpp" +#line 9712 "MachineIndependent/glslang_tab.cpp" break; - case 419: /* type_specifier_nonarray: TEXTURE1D */ -#line 2906 "MachineIndependent/glslang.y" + case 425: /* type_specifier_nonarray: TEXTURE1D */ +#line 2933 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D); } -#line 9575 "MachineIndependent/glslang_tab.cpp" +#line 9722 "MachineIndependent/glslang_tab.cpp" break; - case 420: /* type_specifier_nonarray: F16TEXTURE1D */ -#line 2911 "MachineIndependent/glslang.y" + case 426: /* type_specifier_nonarray: F16TEXTURE1D */ +#line 2938 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D); } -#line 9586 "MachineIndependent/glslang_tab.cpp" +#line 9733 "MachineIndependent/glslang_tab.cpp" break; - case 421: /* type_specifier_nonarray: F16TEXTURE2D */ -#line 2917 "MachineIndependent/glslang.y" + case 427: /* type_specifier_nonarray: F16TEXTURE2D */ +#line 2944 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D); } -#line 9597 "MachineIndependent/glslang_tab.cpp" +#line 9744 "MachineIndependent/glslang_tab.cpp" break; - case 422: /* type_specifier_nonarray: F16TEXTURE3D */ -#line 2923 "MachineIndependent/glslang.y" + case 428: /* type_specifier_nonarray: F16TEXTURE3D */ +#line 2950 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D); } -#line 9608 "MachineIndependent/glslang_tab.cpp" +#line 9755 "MachineIndependent/glslang_tab.cpp" break; - case 423: /* type_specifier_nonarray: F16TEXTURECUBE */ -#line 2929 "MachineIndependent/glslang.y" + case 429: /* type_specifier_nonarray: F16TEXTURECUBE */ +#line 2956 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube); } -#line 9619 "MachineIndependent/glslang_tab.cpp" +#line 9766 "MachineIndependent/glslang_tab.cpp" break; - case 424: /* type_specifier_nonarray: TEXTURE1DARRAY */ -#line 2935 "MachineIndependent/glslang.y" + case 430: /* type_specifier_nonarray: TEXTURE1DARRAY */ +#line 2962 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true); } -#line 9629 "MachineIndependent/glslang_tab.cpp" +#line 9776 "MachineIndependent/glslang_tab.cpp" break; - case 425: /* type_specifier_nonarray: F16TEXTURE1DARRAY */ -#line 2940 "MachineIndependent/glslang.y" + case 431: /* type_specifier_nonarray: F16TEXTURE1DARRAY */ +#line 2967 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true); } -#line 9640 "MachineIndependent/glslang_tab.cpp" +#line 9787 "MachineIndependent/glslang_tab.cpp" break; - case 426: /* type_specifier_nonarray: F16TEXTURE2DARRAY */ -#line 2946 "MachineIndependent/glslang.y" + case 432: /* type_specifier_nonarray: F16TEXTURE2DARRAY */ +#line 2973 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true); } -#line 9651 "MachineIndependent/glslang_tab.cpp" +#line 9798 "MachineIndependent/glslang_tab.cpp" break; - case 427: /* type_specifier_nonarray: F16TEXTURECUBEARRAY */ -#line 2952 "MachineIndependent/glslang.y" + case 433: /* type_specifier_nonarray: F16TEXTURECUBEARRAY */ +#line 2979 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true); } -#line 9662 "MachineIndependent/glslang_tab.cpp" +#line 9809 "MachineIndependent/glslang_tab.cpp" break; - case 428: /* type_specifier_nonarray: ITEXTURE1D */ -#line 2958 "MachineIndependent/glslang.y" + case 434: /* type_specifier_nonarray: ITEXTURE1D */ +#line 2985 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D); } -#line 9672 "MachineIndependent/glslang_tab.cpp" +#line 9819 "MachineIndependent/glslang_tab.cpp" break; - case 429: /* type_specifier_nonarray: ITEXTURE1DARRAY */ -#line 2963 "MachineIndependent/glslang.y" + case 435: /* type_specifier_nonarray: ITEXTURE1DARRAY */ +#line 2990 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true); } -#line 9682 "MachineIndependent/glslang_tab.cpp" +#line 9829 "MachineIndependent/glslang_tab.cpp" break; - case 430: /* type_specifier_nonarray: UTEXTURE1D */ -#line 2968 "MachineIndependent/glslang.y" + case 436: /* type_specifier_nonarray: UTEXTURE1D */ +#line 2995 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D); } -#line 9692 "MachineIndependent/glslang_tab.cpp" +#line 9839 "MachineIndependent/glslang_tab.cpp" break; - case 431: /* type_specifier_nonarray: UTEXTURE1DARRAY */ -#line 2973 "MachineIndependent/glslang.y" + case 437: /* type_specifier_nonarray: UTEXTURE1DARRAY */ +#line 3000 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true); } -#line 9702 "MachineIndependent/glslang_tab.cpp" +#line 9849 "MachineIndependent/glslang_tab.cpp" break; - case 432: /* type_specifier_nonarray: TEXTURE2DRECT */ -#line 2978 "MachineIndependent/glslang.y" + case 438: /* type_specifier_nonarray: TEXTURE2DRECT */ +#line 3005 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect); } -#line 9712 "MachineIndependent/glslang_tab.cpp" +#line 9859 "MachineIndependent/glslang_tab.cpp" break; - case 433: /* type_specifier_nonarray: F16TEXTURE2DRECT */ -#line 2983 "MachineIndependent/glslang.y" + case 439: /* type_specifier_nonarray: F16TEXTURE2DRECT */ +#line 3010 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect); } -#line 9723 "MachineIndependent/glslang_tab.cpp" +#line 9870 "MachineIndependent/glslang_tab.cpp" break; - case 434: /* type_specifier_nonarray: ITEXTURE2DRECT */ -#line 2989 "MachineIndependent/glslang.y" + case 440: /* type_specifier_nonarray: ITEXTURE2DRECT */ +#line 3016 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect); } -#line 9733 "MachineIndependent/glslang_tab.cpp" +#line 9880 "MachineIndependent/glslang_tab.cpp" break; - case 435: /* type_specifier_nonarray: UTEXTURE2DRECT */ -#line 2994 "MachineIndependent/glslang.y" + case 441: /* type_specifier_nonarray: UTEXTURE2DRECT */ +#line 3021 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect); } -#line 9743 "MachineIndependent/glslang_tab.cpp" +#line 9890 "MachineIndependent/glslang_tab.cpp" break; - case 436: /* type_specifier_nonarray: TEXTUREBUFFER */ -#line 2999 "MachineIndependent/glslang.y" + case 442: /* type_specifier_nonarray: TEXTUREBUFFER */ +#line 3026 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer); } -#line 9753 "MachineIndependent/glslang_tab.cpp" +#line 9900 "MachineIndependent/glslang_tab.cpp" break; - case 437: /* type_specifier_nonarray: F16TEXTUREBUFFER */ -#line 3004 "MachineIndependent/glslang.y" + case 443: /* type_specifier_nonarray: F16TEXTUREBUFFER */ +#line 3031 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer); } -#line 9764 "MachineIndependent/glslang_tab.cpp" +#line 9911 "MachineIndependent/glslang_tab.cpp" break; - case 438: /* type_specifier_nonarray: ITEXTUREBUFFER */ -#line 3010 "MachineIndependent/glslang.y" + case 444: /* type_specifier_nonarray: ITEXTUREBUFFER */ +#line 3037 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer); } -#line 9774 "MachineIndependent/glslang_tab.cpp" +#line 9921 "MachineIndependent/glslang_tab.cpp" break; - case 439: /* type_specifier_nonarray: UTEXTUREBUFFER */ -#line 3015 "MachineIndependent/glslang.y" + case 445: /* type_specifier_nonarray: UTEXTUREBUFFER */ +#line 3042 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer); } -#line 9784 "MachineIndependent/glslang_tab.cpp" +#line 9931 "MachineIndependent/glslang_tab.cpp" break; - case 440: /* type_specifier_nonarray: TEXTURE2DMS */ -#line 3020 "MachineIndependent/glslang.y" + case 446: /* type_specifier_nonarray: TEXTURE2DMS */ +#line 3047 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true); } -#line 9794 "MachineIndependent/glslang_tab.cpp" +#line 9941 "MachineIndependent/glslang_tab.cpp" break; - case 441: /* type_specifier_nonarray: F16TEXTURE2DMS */ -#line 3025 "MachineIndependent/glslang.y" + case 447: /* type_specifier_nonarray: F16TEXTURE2DMS */ +#line 3052 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true); } -#line 9805 "MachineIndependent/glslang_tab.cpp" +#line 9952 "MachineIndependent/glslang_tab.cpp" break; - case 442: /* type_specifier_nonarray: ITEXTURE2DMS */ -#line 3031 "MachineIndependent/glslang.y" + case 448: /* type_specifier_nonarray: ITEXTURE2DMS */ +#line 3058 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true); } -#line 9815 "MachineIndependent/glslang_tab.cpp" +#line 9962 "MachineIndependent/glslang_tab.cpp" break; - case 443: /* type_specifier_nonarray: UTEXTURE2DMS */ -#line 3036 "MachineIndependent/glslang.y" + case 449: /* type_specifier_nonarray: UTEXTURE2DMS */ +#line 3063 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true); } -#line 9825 "MachineIndependent/glslang_tab.cpp" +#line 9972 "MachineIndependent/glslang_tab.cpp" break; - case 444: /* type_specifier_nonarray: TEXTURE2DMSARRAY */ -#line 3041 "MachineIndependent/glslang.y" + case 450: /* type_specifier_nonarray: TEXTURE2DMSARRAY */ +#line 3068 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true); } -#line 9835 "MachineIndependent/glslang_tab.cpp" +#line 9982 "MachineIndependent/glslang_tab.cpp" break; - case 445: /* type_specifier_nonarray: F16TEXTURE2DMSARRAY */ -#line 3046 "MachineIndependent/glslang.y" + case 451: /* type_specifier_nonarray: F16TEXTURE2DMSARRAY */ +#line 3073 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true); } -#line 9846 "MachineIndependent/glslang_tab.cpp" +#line 9993 "MachineIndependent/glslang_tab.cpp" break; - case 446: /* type_specifier_nonarray: ITEXTURE2DMSARRAY */ -#line 3052 "MachineIndependent/glslang.y" + case 452: /* type_specifier_nonarray: ITEXTURE2DMSARRAY */ +#line 3079 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true); } -#line 9856 "MachineIndependent/glslang_tab.cpp" +#line 10003 "MachineIndependent/glslang_tab.cpp" break; - case 447: /* type_specifier_nonarray: UTEXTURE2DMSARRAY */ -#line 3057 "MachineIndependent/glslang.y" + case 453: /* type_specifier_nonarray: UTEXTURE2DMSARRAY */ +#line 3084 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true); } -#line 9866 "MachineIndependent/glslang_tab.cpp" +#line 10013 "MachineIndependent/glslang_tab.cpp" break; - case 448: /* type_specifier_nonarray: IMAGE1D */ -#line 3062 "MachineIndependent/glslang.y" + case 454: /* type_specifier_nonarray: IMAGE1D */ +#line 3089 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D); } -#line 9876 "MachineIndependent/glslang_tab.cpp" +#line 10023 "MachineIndependent/glslang_tab.cpp" break; - case 449: /* type_specifier_nonarray: F16IMAGE1D */ -#line 3067 "MachineIndependent/glslang.y" + case 455: /* type_specifier_nonarray: F16IMAGE1D */ +#line 3094 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D); } -#line 9887 "MachineIndependent/glslang_tab.cpp" +#line 10034 "MachineIndependent/glslang_tab.cpp" break; - case 450: /* type_specifier_nonarray: IIMAGE1D */ -#line 3073 "MachineIndependent/glslang.y" + case 456: /* type_specifier_nonarray: IIMAGE1D */ +#line 3100 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd1D); } -#line 9897 "MachineIndependent/glslang_tab.cpp" +#line 10044 "MachineIndependent/glslang_tab.cpp" break; - case 451: /* type_specifier_nonarray: UIMAGE1D */ -#line 3078 "MachineIndependent/glslang.y" + case 457: /* type_specifier_nonarray: UIMAGE1D */ +#line 3105 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd1D); } -#line 9907 "MachineIndependent/glslang_tab.cpp" +#line 10054 "MachineIndependent/glslang_tab.cpp" break; - case 452: /* type_specifier_nonarray: IMAGE2D */ -#line 3083 "MachineIndependent/glslang.y" + case 458: /* type_specifier_nonarray: IMAGE2D */ +#line 3110 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D); } -#line 9917 "MachineIndependent/glslang_tab.cpp" +#line 10064 "MachineIndependent/glslang_tab.cpp" break; - case 453: /* type_specifier_nonarray: F16IMAGE2D */ -#line 3088 "MachineIndependent/glslang.y" + case 459: /* type_specifier_nonarray: F16IMAGE2D */ +#line 3115 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D); } -#line 9928 "MachineIndependent/glslang_tab.cpp" +#line 10075 "MachineIndependent/glslang_tab.cpp" break; - case 454: /* type_specifier_nonarray: IIMAGE2D */ -#line 3094 "MachineIndependent/glslang.y" + case 460: /* type_specifier_nonarray: IIMAGE2D */ +#line 3121 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D); } -#line 9938 "MachineIndependent/glslang_tab.cpp" +#line 10085 "MachineIndependent/glslang_tab.cpp" break; - case 455: /* type_specifier_nonarray: UIMAGE2D */ -#line 3099 "MachineIndependent/glslang.y" + case 461: /* type_specifier_nonarray: UIMAGE2D */ +#line 3126 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D); } -#line 9948 "MachineIndependent/glslang_tab.cpp" +#line 10095 "MachineIndependent/glslang_tab.cpp" break; - case 456: /* type_specifier_nonarray: IMAGE3D */ -#line 3104 "MachineIndependent/glslang.y" + case 462: /* type_specifier_nonarray: IMAGE3D */ +#line 3131 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D); } -#line 9958 "MachineIndependent/glslang_tab.cpp" +#line 10105 "MachineIndependent/glslang_tab.cpp" break; - case 457: /* type_specifier_nonarray: F16IMAGE3D */ -#line 3109 "MachineIndependent/glslang.y" + case 463: /* type_specifier_nonarray: F16IMAGE3D */ +#line 3136 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D); } -#line 9969 "MachineIndependent/glslang_tab.cpp" +#line 10116 "MachineIndependent/glslang_tab.cpp" break; - case 458: /* type_specifier_nonarray: IIMAGE3D */ -#line 3115 "MachineIndependent/glslang.y" + case 464: /* type_specifier_nonarray: IIMAGE3D */ +#line 3142 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd3D); } -#line 9979 "MachineIndependent/glslang_tab.cpp" +#line 10126 "MachineIndependent/glslang_tab.cpp" break; - case 459: /* type_specifier_nonarray: UIMAGE3D */ -#line 3120 "MachineIndependent/glslang.y" + case 465: /* type_specifier_nonarray: UIMAGE3D */ +#line 3147 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd3D); } -#line 9989 "MachineIndependent/glslang_tab.cpp" +#line 10136 "MachineIndependent/glslang_tab.cpp" break; - case 460: /* type_specifier_nonarray: IMAGE2DRECT */ -#line 3125 "MachineIndependent/glslang.y" + case 466: /* type_specifier_nonarray: IMAGE2DRECT */ +#line 3152 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect); } -#line 9999 "MachineIndependent/glslang_tab.cpp" +#line 10146 "MachineIndependent/glslang_tab.cpp" break; - case 461: /* type_specifier_nonarray: F16IMAGE2DRECT */ -#line 3130 "MachineIndependent/glslang.y" + case 467: /* type_specifier_nonarray: F16IMAGE2DRECT */ +#line 3157 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect); } -#line 10010 "MachineIndependent/glslang_tab.cpp" +#line 10157 "MachineIndependent/glslang_tab.cpp" break; - case 462: /* type_specifier_nonarray: IIMAGE2DRECT */ -#line 3136 "MachineIndependent/glslang.y" + case 468: /* type_specifier_nonarray: IIMAGE2DRECT */ +#line 3163 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdRect); } -#line 10020 "MachineIndependent/glslang_tab.cpp" +#line 10167 "MachineIndependent/glslang_tab.cpp" break; - case 463: /* type_specifier_nonarray: UIMAGE2DRECT */ -#line 3141 "MachineIndependent/glslang.y" + case 469: /* type_specifier_nonarray: UIMAGE2DRECT */ +#line 3168 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdRect); } -#line 10030 "MachineIndependent/glslang_tab.cpp" +#line 10177 "MachineIndependent/glslang_tab.cpp" break; - case 464: /* type_specifier_nonarray: IMAGECUBE */ -#line 3146 "MachineIndependent/glslang.y" + case 470: /* type_specifier_nonarray: IMAGECUBE */ +#line 3173 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube); } -#line 10040 "MachineIndependent/glslang_tab.cpp" +#line 10187 "MachineIndependent/glslang_tab.cpp" break; - case 465: /* type_specifier_nonarray: F16IMAGECUBE */ -#line 3151 "MachineIndependent/glslang.y" + case 471: /* type_specifier_nonarray: F16IMAGECUBE */ +#line 3178 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube); } -#line 10051 "MachineIndependent/glslang_tab.cpp" +#line 10198 "MachineIndependent/glslang_tab.cpp" break; - case 466: /* type_specifier_nonarray: IIMAGECUBE */ -#line 3157 "MachineIndependent/glslang.y" + case 472: /* type_specifier_nonarray: IIMAGECUBE */ +#line 3184 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdCube); } -#line 10061 "MachineIndependent/glslang_tab.cpp" +#line 10208 "MachineIndependent/glslang_tab.cpp" break; - case 467: /* type_specifier_nonarray: UIMAGECUBE */ -#line 3162 "MachineIndependent/glslang.y" + case 473: /* type_specifier_nonarray: UIMAGECUBE */ +#line 3189 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdCube); } -#line 10071 "MachineIndependent/glslang_tab.cpp" +#line 10218 "MachineIndependent/glslang_tab.cpp" break; - case 468: /* type_specifier_nonarray: IMAGEBUFFER */ -#line 3167 "MachineIndependent/glslang.y" + case 474: /* type_specifier_nonarray: IMAGEBUFFER */ +#line 3194 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer); } -#line 10081 "MachineIndependent/glslang_tab.cpp" +#line 10228 "MachineIndependent/glslang_tab.cpp" break; - case 469: /* type_specifier_nonarray: F16IMAGEBUFFER */ -#line 3172 "MachineIndependent/glslang.y" + case 475: /* type_specifier_nonarray: F16IMAGEBUFFER */ +#line 3199 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer); } -#line 10092 "MachineIndependent/glslang_tab.cpp" +#line 10239 "MachineIndependent/glslang_tab.cpp" break; - case 470: /* type_specifier_nonarray: IIMAGEBUFFER */ -#line 3178 "MachineIndependent/glslang.y" + case 476: /* type_specifier_nonarray: IIMAGEBUFFER */ +#line 3205 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer); } -#line 10102 "MachineIndependent/glslang_tab.cpp" +#line 10249 "MachineIndependent/glslang_tab.cpp" break; - case 471: /* type_specifier_nonarray: UIMAGEBUFFER */ -#line 3183 "MachineIndependent/glslang.y" + case 477: /* type_specifier_nonarray: UIMAGEBUFFER */ +#line 3210 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer); } -#line 10112 "MachineIndependent/glslang_tab.cpp" +#line 10259 "MachineIndependent/glslang_tab.cpp" break; - case 472: /* type_specifier_nonarray: IMAGE1DARRAY */ -#line 3188 "MachineIndependent/glslang.y" + case 478: /* type_specifier_nonarray: IMAGE1DARRAY */ +#line 3215 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true); } -#line 10122 "MachineIndependent/glslang_tab.cpp" +#line 10269 "MachineIndependent/glslang_tab.cpp" break; - case 473: /* type_specifier_nonarray: F16IMAGE1DARRAY */ -#line 3193 "MachineIndependent/glslang.y" + case 479: /* type_specifier_nonarray: F16IMAGE1DARRAY */ +#line 3220 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true); } -#line 10133 "MachineIndependent/glslang_tab.cpp" +#line 10280 "MachineIndependent/glslang_tab.cpp" break; - case 474: /* type_specifier_nonarray: IIMAGE1DARRAY */ -#line 3199 "MachineIndependent/glslang.y" + case 480: /* type_specifier_nonarray: IIMAGE1DARRAY */ +#line 3226 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true); } -#line 10143 "MachineIndependent/glslang_tab.cpp" +#line 10290 "MachineIndependent/glslang_tab.cpp" break; - case 475: /* type_specifier_nonarray: UIMAGE1DARRAY */ -#line 3204 "MachineIndependent/glslang.y" + case 481: /* type_specifier_nonarray: UIMAGE1DARRAY */ +#line 3231 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true); } -#line 10153 "MachineIndependent/glslang_tab.cpp" +#line 10300 "MachineIndependent/glslang_tab.cpp" break; - case 476: /* type_specifier_nonarray: IMAGE2DARRAY */ -#line 3209 "MachineIndependent/glslang.y" + case 482: /* type_specifier_nonarray: IMAGE2DARRAY */ +#line 3236 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true); } -#line 10163 "MachineIndependent/glslang_tab.cpp" +#line 10310 "MachineIndependent/glslang_tab.cpp" break; - case 477: /* type_specifier_nonarray: F16IMAGE2DARRAY */ -#line 3214 "MachineIndependent/glslang.y" + case 483: /* type_specifier_nonarray: F16IMAGE2DARRAY */ +#line 3241 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true); } -#line 10174 "MachineIndependent/glslang_tab.cpp" +#line 10321 "MachineIndependent/glslang_tab.cpp" break; - case 478: /* type_specifier_nonarray: IIMAGE2DARRAY */ -#line 3220 "MachineIndependent/glslang.y" + case 484: /* type_specifier_nonarray: IIMAGE2DARRAY */ +#line 3247 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true); } -#line 10184 "MachineIndependent/glslang_tab.cpp" +#line 10331 "MachineIndependent/glslang_tab.cpp" break; - case 479: /* type_specifier_nonarray: UIMAGE2DARRAY */ -#line 3225 "MachineIndependent/glslang.y" + case 485: /* type_specifier_nonarray: UIMAGE2DARRAY */ +#line 3252 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true); } -#line 10194 "MachineIndependent/glslang_tab.cpp" +#line 10341 "MachineIndependent/glslang_tab.cpp" break; - case 480: /* type_specifier_nonarray: IMAGECUBEARRAY */ -#line 3230 "MachineIndependent/glslang.y" + case 486: /* type_specifier_nonarray: IMAGECUBEARRAY */ +#line 3257 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true); } -#line 10204 "MachineIndependent/glslang_tab.cpp" +#line 10351 "MachineIndependent/glslang_tab.cpp" break; - case 481: /* type_specifier_nonarray: F16IMAGECUBEARRAY */ -#line 3235 "MachineIndependent/glslang.y" + case 487: /* type_specifier_nonarray: F16IMAGECUBEARRAY */ +#line 3262 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true); } -#line 10215 "MachineIndependent/glslang_tab.cpp" +#line 10362 "MachineIndependent/glslang_tab.cpp" break; - case 482: /* type_specifier_nonarray: IIMAGECUBEARRAY */ -#line 3241 "MachineIndependent/glslang.y" + case 488: /* type_specifier_nonarray: IIMAGECUBEARRAY */ +#line 3268 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true); } -#line 10225 "MachineIndependent/glslang_tab.cpp" +#line 10372 "MachineIndependent/glslang_tab.cpp" break; - case 483: /* type_specifier_nonarray: UIMAGECUBEARRAY */ -#line 3246 "MachineIndependent/glslang.y" + case 489: /* type_specifier_nonarray: UIMAGECUBEARRAY */ +#line 3273 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true); } -#line 10235 "MachineIndependent/glslang_tab.cpp" +#line 10382 "MachineIndependent/glslang_tab.cpp" break; - case 484: /* type_specifier_nonarray: IMAGE2DMS */ -#line 3251 "MachineIndependent/glslang.y" + case 490: /* type_specifier_nonarray: IMAGE2DMS */ +#line 3278 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true); } -#line 10245 "MachineIndependent/glslang_tab.cpp" +#line 10392 "MachineIndependent/glslang_tab.cpp" break; - case 485: /* type_specifier_nonarray: F16IMAGE2DMS */ -#line 3256 "MachineIndependent/glslang.y" + case 491: /* type_specifier_nonarray: F16IMAGE2DMS */ +#line 3283 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true); } -#line 10256 "MachineIndependent/glslang_tab.cpp" +#line 10403 "MachineIndependent/glslang_tab.cpp" break; - case 486: /* type_specifier_nonarray: IIMAGE2DMS */ -#line 3262 "MachineIndependent/glslang.y" + case 492: /* type_specifier_nonarray: IIMAGE2DMS */ +#line 3289 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true); } -#line 10266 "MachineIndependent/glslang_tab.cpp" +#line 10413 "MachineIndependent/glslang_tab.cpp" break; - case 487: /* type_specifier_nonarray: UIMAGE2DMS */ -#line 3267 "MachineIndependent/glslang.y" + case 493: /* type_specifier_nonarray: UIMAGE2DMS */ +#line 3294 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true); } -#line 10276 "MachineIndependent/glslang_tab.cpp" +#line 10423 "MachineIndependent/glslang_tab.cpp" break; - case 488: /* type_specifier_nonarray: IMAGE2DMSARRAY */ -#line 3272 "MachineIndependent/glslang.y" + case 494: /* type_specifier_nonarray: IMAGE2DMSARRAY */ +#line 3299 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true); } -#line 10286 "MachineIndependent/glslang_tab.cpp" +#line 10433 "MachineIndependent/glslang_tab.cpp" break; - case 489: /* type_specifier_nonarray: F16IMAGE2DMSARRAY */ -#line 3277 "MachineIndependent/glslang.y" + case 495: /* type_specifier_nonarray: F16IMAGE2DMSARRAY */ +#line 3304 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true); } -#line 10297 "MachineIndependent/glslang_tab.cpp" +#line 10444 "MachineIndependent/glslang_tab.cpp" break; - case 490: /* type_specifier_nonarray: IIMAGE2DMSARRAY */ -#line 3283 "MachineIndependent/glslang.y" + case 496: /* type_specifier_nonarray: IIMAGE2DMSARRAY */ +#line 3310 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true); } -#line 10307 "MachineIndependent/glslang_tab.cpp" +#line 10454 "MachineIndependent/glslang_tab.cpp" break; - case 491: /* type_specifier_nonarray: UIMAGE2DMSARRAY */ -#line 3288 "MachineIndependent/glslang.y" + case 497: /* type_specifier_nonarray: UIMAGE2DMSARRAY */ +#line 3315 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true); } -#line 10317 "MachineIndependent/glslang_tab.cpp" +#line 10464 "MachineIndependent/glslang_tab.cpp" break; - case 492: /* type_specifier_nonarray: I64IMAGE1D */ -#line 3293 "MachineIndependent/glslang.y" + case 498: /* type_specifier_nonarray: I64IMAGE1D */ +#line 3320 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D); } -#line 10327 "MachineIndependent/glslang_tab.cpp" +#line 10474 "MachineIndependent/glslang_tab.cpp" break; - case 493: /* type_specifier_nonarray: U64IMAGE1D */ -#line 3298 "MachineIndependent/glslang.y" + case 499: /* type_specifier_nonarray: U64IMAGE1D */ +#line 3325 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D); } -#line 10337 "MachineIndependent/glslang_tab.cpp" +#line 10484 "MachineIndependent/glslang_tab.cpp" break; - case 494: /* type_specifier_nonarray: I64IMAGE2D */ -#line 3303 "MachineIndependent/glslang.y" + case 500: /* type_specifier_nonarray: I64IMAGE2D */ +#line 3330 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D); } -#line 10347 "MachineIndependent/glslang_tab.cpp" +#line 10494 "MachineIndependent/glslang_tab.cpp" break; - case 495: /* type_specifier_nonarray: U64IMAGE2D */ -#line 3308 "MachineIndependent/glslang.y" + case 501: /* type_specifier_nonarray: U64IMAGE2D */ +#line 3335 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D); } -#line 10357 "MachineIndependent/glslang_tab.cpp" +#line 10504 "MachineIndependent/glslang_tab.cpp" break; - case 496: /* type_specifier_nonarray: I64IMAGE3D */ -#line 3313 "MachineIndependent/glslang.y" + case 502: /* type_specifier_nonarray: I64IMAGE3D */ +#line 3340 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd3D); } -#line 10367 "MachineIndependent/glslang_tab.cpp" +#line 10514 "MachineIndependent/glslang_tab.cpp" break; - case 497: /* type_specifier_nonarray: U64IMAGE3D */ -#line 3318 "MachineIndependent/glslang.y" + case 503: /* type_specifier_nonarray: U64IMAGE3D */ +#line 3345 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd3D); } -#line 10377 "MachineIndependent/glslang_tab.cpp" +#line 10524 "MachineIndependent/glslang_tab.cpp" break; - case 498: /* type_specifier_nonarray: I64IMAGE2DRECT */ -#line 3323 "MachineIndependent/glslang.y" + case 504: /* type_specifier_nonarray: I64IMAGE2DRECT */ +#line 3350 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdRect); } -#line 10387 "MachineIndependent/glslang_tab.cpp" +#line 10534 "MachineIndependent/glslang_tab.cpp" break; - case 499: /* type_specifier_nonarray: U64IMAGE2DRECT */ -#line 3328 "MachineIndependent/glslang.y" + case 505: /* type_specifier_nonarray: U64IMAGE2DRECT */ +#line 3355 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdRect); } -#line 10397 "MachineIndependent/glslang_tab.cpp" +#line 10544 "MachineIndependent/glslang_tab.cpp" break; - case 500: /* type_specifier_nonarray: I64IMAGECUBE */ -#line 3333 "MachineIndependent/glslang.y" + case 506: /* type_specifier_nonarray: I64IMAGECUBE */ +#line 3360 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube); } -#line 10407 "MachineIndependent/glslang_tab.cpp" +#line 10554 "MachineIndependent/glslang_tab.cpp" break; - case 501: /* type_specifier_nonarray: U64IMAGECUBE */ -#line 3338 "MachineIndependent/glslang.y" + case 507: /* type_specifier_nonarray: U64IMAGECUBE */ +#line 3365 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube); } -#line 10417 "MachineIndependent/glslang_tab.cpp" +#line 10564 "MachineIndependent/glslang_tab.cpp" break; - case 502: /* type_specifier_nonarray: I64IMAGEBUFFER */ -#line 3343 "MachineIndependent/glslang.y" + case 508: /* type_specifier_nonarray: I64IMAGEBUFFER */ +#line 3370 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdBuffer); } -#line 10427 "MachineIndependent/glslang_tab.cpp" +#line 10574 "MachineIndependent/glslang_tab.cpp" break; - case 503: /* type_specifier_nonarray: U64IMAGEBUFFER */ -#line 3348 "MachineIndependent/glslang.y" + case 509: /* type_specifier_nonarray: U64IMAGEBUFFER */ +#line 3375 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdBuffer); } -#line 10437 "MachineIndependent/glslang_tab.cpp" +#line 10584 "MachineIndependent/glslang_tab.cpp" break; - case 504: /* type_specifier_nonarray: I64IMAGE1DARRAY */ -#line 3353 "MachineIndependent/glslang.y" + case 510: /* type_specifier_nonarray: I64IMAGE1DARRAY */ +#line 3380 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D, true); } -#line 10447 "MachineIndependent/glslang_tab.cpp" +#line 10594 "MachineIndependent/glslang_tab.cpp" break; - case 505: /* type_specifier_nonarray: U64IMAGE1DARRAY */ -#line 3358 "MachineIndependent/glslang.y" + case 511: /* type_specifier_nonarray: U64IMAGE1DARRAY */ +#line 3385 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D, true); } -#line 10457 "MachineIndependent/glslang_tab.cpp" +#line 10604 "MachineIndependent/glslang_tab.cpp" break; - case 506: /* type_specifier_nonarray: I64IMAGE2DARRAY */ -#line 3363 "MachineIndependent/glslang.y" + case 512: /* type_specifier_nonarray: I64IMAGE2DARRAY */ +#line 3390 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true); } -#line 10467 "MachineIndependent/glslang_tab.cpp" +#line 10614 "MachineIndependent/glslang_tab.cpp" break; - case 507: /* type_specifier_nonarray: U64IMAGE2DARRAY */ -#line 3368 "MachineIndependent/glslang.y" + case 513: /* type_specifier_nonarray: U64IMAGE2DARRAY */ +#line 3395 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true); } -#line 10477 "MachineIndependent/glslang_tab.cpp" +#line 10624 "MachineIndependent/glslang_tab.cpp" break; - case 508: /* type_specifier_nonarray: I64IMAGECUBEARRAY */ -#line 3373 "MachineIndependent/glslang.y" + case 514: /* type_specifier_nonarray: I64IMAGECUBEARRAY */ +#line 3400 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube, true); } -#line 10487 "MachineIndependent/glslang_tab.cpp" +#line 10634 "MachineIndependent/glslang_tab.cpp" break; - case 509: /* type_specifier_nonarray: U64IMAGECUBEARRAY */ -#line 3378 "MachineIndependent/glslang.y" + case 515: /* type_specifier_nonarray: U64IMAGECUBEARRAY */ +#line 3405 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube, true); } -#line 10497 "MachineIndependent/glslang_tab.cpp" +#line 10644 "MachineIndependent/glslang_tab.cpp" break; - case 510: /* type_specifier_nonarray: I64IMAGE2DMS */ -#line 3383 "MachineIndependent/glslang.y" + case 516: /* type_specifier_nonarray: I64IMAGE2DMS */ +#line 3410 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, false, false, true); } -#line 10507 "MachineIndependent/glslang_tab.cpp" +#line 10654 "MachineIndependent/glslang_tab.cpp" break; - case 511: /* type_specifier_nonarray: U64IMAGE2DMS */ -#line 3388 "MachineIndependent/glslang.y" + case 517: /* type_specifier_nonarray: U64IMAGE2DMS */ +#line 3415 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, false, false, true); } -#line 10517 "MachineIndependent/glslang_tab.cpp" +#line 10664 "MachineIndependent/glslang_tab.cpp" break; - case 512: /* type_specifier_nonarray: I64IMAGE2DMSARRAY */ -#line 3393 "MachineIndependent/glslang.y" + case 518: /* type_specifier_nonarray: I64IMAGE2DMSARRAY */ +#line 3420 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true, false, true); } -#line 10527 "MachineIndependent/glslang_tab.cpp" +#line 10674 "MachineIndependent/glslang_tab.cpp" break; - case 513: /* type_specifier_nonarray: U64IMAGE2DMSARRAY */ -#line 3398 "MachineIndependent/glslang.y" + case 519: /* type_specifier_nonarray: U64IMAGE2DMSARRAY */ +#line 3425 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true, false, true); } -#line 10537 "MachineIndependent/glslang_tab.cpp" +#line 10684 "MachineIndependent/glslang_tab.cpp" break; - case 514: /* type_specifier_nonarray: SAMPLEREXTERNALOES */ -#line 3403 "MachineIndependent/glslang.y" + case 520: /* type_specifier_nonarray: SAMPLEREXTERNALOES */ +#line 3430 "MachineIndependent/glslang.y" { // GL_OES_EGL_image_external (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D); (yyval.interm.type).sampler.external = true; } -#line 10548 "MachineIndependent/glslang_tab.cpp" +#line 10695 "MachineIndependent/glslang_tab.cpp" break; - case 515: /* type_specifier_nonarray: SAMPLEREXTERNAL2DY2YEXT */ -#line 3409 "MachineIndependent/glslang.y" + case 521: /* type_specifier_nonarray: SAMPLEREXTERNAL2DY2YEXT */ +#line 3436 "MachineIndependent/glslang.y" { // GL_EXT_YUV_target (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D); (yyval.interm.type).sampler.yuv = true; } -#line 10559 "MachineIndependent/glslang_tab.cpp" +#line 10706 "MachineIndependent/glslang_tab.cpp" break; - case 516: /* type_specifier_nonarray: SUBPASSINPUT */ -#line 3415 "MachineIndependent/glslang.y" + case 522: /* type_specifier_nonarray: ATTACHMENTEXT */ +#line 3442 "MachineIndependent/glslang.y" + { + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "attachmentEXT input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setAttachmentEXT(EbtFloat); + } +#line 10717 "MachineIndependent/glslang_tab.cpp" + break; + + case 523: /* type_specifier_nonarray: IATTACHMENTEXT */ +#line 3448 "MachineIndependent/glslang.y" + { + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "attachmentEXT input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setAttachmentEXT(EbtInt); + } +#line 10728 "MachineIndependent/glslang_tab.cpp" + break; + + case 524: /* type_specifier_nonarray: UATTACHMENTEXT */ +#line 3454 "MachineIndependent/glslang.y" + { + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "attachmentEXT input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setAttachmentEXT(EbtUint); + } +#line 10739 "MachineIndependent/glslang_tab.cpp" + break; + + case 525: /* type_specifier_nonarray: SUBPASSINPUT */ +#line 3460 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat); } -#line 10570 "MachineIndependent/glslang_tab.cpp" +#line 10750 "MachineIndependent/glslang_tab.cpp" break; - case 517: /* type_specifier_nonarray: SUBPASSINPUTMS */ -#line 3421 "MachineIndependent/glslang.y" + case 526: /* type_specifier_nonarray: SUBPASSINPUTMS */ +#line 3466 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat, true); } -#line 10581 "MachineIndependent/glslang_tab.cpp" +#line 10761 "MachineIndependent/glslang_tab.cpp" break; - case 518: /* type_specifier_nonarray: F16SUBPASSINPUT */ -#line 3427 "MachineIndependent/glslang.y" + case 527: /* type_specifier_nonarray: F16SUBPASSINPUT */ +#line 3472 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); @@ -10589,11 +10769,11 @@ yyreduce: (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat16); } -#line 10593 "MachineIndependent/glslang_tab.cpp" +#line 10773 "MachineIndependent/glslang_tab.cpp" break; - case 519: /* type_specifier_nonarray: F16SUBPASSINPUTMS */ -#line 3434 "MachineIndependent/glslang.y" + case 528: /* type_specifier_nonarray: F16SUBPASSINPUTMS */ +#line 3479 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); @@ -10601,107 +10781,131 @@ yyreduce: (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat16, true); } -#line 10605 "MachineIndependent/glslang_tab.cpp" +#line 10785 "MachineIndependent/glslang_tab.cpp" break; - case 520: /* type_specifier_nonarray: ISUBPASSINPUT */ -#line 3441 "MachineIndependent/glslang.y" + case 529: /* type_specifier_nonarray: ISUBPASSINPUT */ +#line 3486 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtInt); } -#line 10616 "MachineIndependent/glslang_tab.cpp" +#line 10796 "MachineIndependent/glslang_tab.cpp" break; - case 521: /* type_specifier_nonarray: ISUBPASSINPUTMS */ -#line 3447 "MachineIndependent/glslang.y" + case 530: /* type_specifier_nonarray: ISUBPASSINPUTMS */ +#line 3492 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtInt, true); } -#line 10627 "MachineIndependent/glslang_tab.cpp" +#line 10807 "MachineIndependent/glslang_tab.cpp" break; - case 522: /* type_specifier_nonarray: USUBPASSINPUT */ -#line 3453 "MachineIndependent/glslang.y" + case 531: /* type_specifier_nonarray: USUBPASSINPUT */ +#line 3498 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtUint); } -#line 10638 "MachineIndependent/glslang_tab.cpp" +#line 10818 "MachineIndependent/glslang_tab.cpp" break; - case 523: /* type_specifier_nonarray: USUBPASSINPUTMS */ -#line 3459 "MachineIndependent/glslang.y" + case 532: /* type_specifier_nonarray: USUBPASSINPUTMS */ +#line 3504 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtUint, true); } -#line 10649 "MachineIndependent/glslang_tab.cpp" +#line 10829 "MachineIndependent/glslang_tab.cpp" break; - case 524: /* type_specifier_nonarray: FCOOPMATNV */ -#line 3465 "MachineIndependent/glslang.y" + case 533: /* type_specifier_nonarray: FCOOPMATNV */ +#line 3510 "MachineIndependent/glslang.y" { - parseContext.fcoopmatCheck((yyvsp[0].lex).loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.fcoopmatCheckNV((yyvsp[0].lex).loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).coopmat = true; + (yyval.interm.type).coopmatNV = true; + (yyval.interm.type).coopmatKHR = false; } -#line 10660 "MachineIndependent/glslang_tab.cpp" +#line 10841 "MachineIndependent/glslang_tab.cpp" break; - case 525: /* type_specifier_nonarray: ICOOPMATNV */ -#line 3471 "MachineIndependent/glslang.y" + case 534: /* type_specifier_nonarray: ICOOPMATNV */ +#line 3517 "MachineIndependent/glslang.y" { - parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV((yyvsp[0].lex).loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; - (yyval.interm.type).coopmat = true; + (yyval.interm.type).coopmatNV = true; + (yyval.interm.type).coopmatKHR = false; } -#line 10671 "MachineIndependent/glslang_tab.cpp" +#line 10853 "MachineIndependent/glslang_tab.cpp" break; - case 526: /* type_specifier_nonarray: UCOOPMATNV */ -#line 3477 "MachineIndependent/glslang.y" + case 535: /* type_specifier_nonarray: UCOOPMATNV */ +#line 3524 "MachineIndependent/glslang.y" { - parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV((yyvsp[0].lex).loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).coopmat = true; + (yyval.interm.type).coopmatNV = true; + (yyval.interm.type).coopmatKHR = false; } -#line 10682 "MachineIndependent/glslang_tab.cpp" +#line 10865 "MachineIndependent/glslang_tab.cpp" break; - case 527: /* type_specifier_nonarray: spirv_type_specifier */ -#line 3483 "MachineIndependent/glslang.y" + case 536: /* type_specifier_nonarray: COOPMAT */ +#line 3531 "MachineIndependent/glslang.y" + { + parseContext.coopmatCheck((yyvsp[0].lex).loc, "coopmat", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtCoopmat; + (yyval.interm.type).coopmatNV = false; + (yyval.interm.type).coopmatKHR = true; + } +#line 10877 "MachineIndependent/glslang_tab.cpp" + break; + + case 537: /* type_specifier_nonarray: spirv_type_specifier */ +#line 3538 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V type specifier"); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 10691 "MachineIndependent/glslang_tab.cpp" +#line 10886 "MachineIndependent/glslang_tab.cpp" break; - case 528: /* type_specifier_nonarray: struct_specifier */ -#line 3488 "MachineIndependent/glslang.y" + case 538: /* type_specifier_nonarray: HITOBJECTNV */ +#line 3542 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtHitObjectNV; + } +#line 10895 "MachineIndependent/glslang_tab.cpp" + break; + + case 539: /* type_specifier_nonarray: struct_specifier */ +#line 3546 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary; parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type)); } -#line 10701 "MachineIndependent/glslang_tab.cpp" +#line 10905 "MachineIndependent/glslang_tab.cpp" break; - case 529: /* type_specifier_nonarray: TYPE_NAME */ -#line 3493 "MachineIndependent/glslang.y" + case 540: /* type_specifier_nonarray: TYPE_NAME */ +#line 3551 "MachineIndependent/glslang.y" { // // This is for user defined type names. The lexical phase looked up the @@ -10715,69 +10919,75 @@ yyreduce: } else parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), ""); } -#line 10719 "MachineIndependent/glslang_tab.cpp" +#line 10923 "MachineIndependent/glslang_tab.cpp" break; - case 530: /* precision_qualifier: HIGH_PRECISION */ -#line 3509 "MachineIndependent/glslang.y" + case 541: /* precision_qualifier: HIGH_PRECISION */ +#line 3567 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh); } -#line 10729 "MachineIndependent/glslang_tab.cpp" +#line 10933 "MachineIndependent/glslang_tab.cpp" break; - case 531: /* precision_qualifier: MEDIUM_PRECISION */ -#line 3514 "MachineIndependent/glslang.y" + case 542: /* precision_qualifier: MEDIUM_PRECISION */ +#line 3572 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium); } -#line 10739 "MachineIndependent/glslang_tab.cpp" +#line 10943 "MachineIndependent/glslang_tab.cpp" break; - case 532: /* precision_qualifier: LOW_PRECISION */ -#line 3519 "MachineIndependent/glslang.y" + case 543: /* precision_qualifier: LOW_PRECISION */ +#line 3577 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow); } -#line 10749 "MachineIndependent/glslang_tab.cpp" +#line 10953 "MachineIndependent/glslang_tab.cpp" break; - case 533: /* $@3: %empty */ -#line 3527 "MachineIndependent/glslang.y" + case 544: /* $@3: %empty */ +#line 3585 "MachineIndependent/glslang.y" { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); } -#line 10755 "MachineIndependent/glslang_tab.cpp" +#line 10959 "MachineIndependent/glslang_tab.cpp" break; - case 534: /* struct_specifier: STRUCT IDENTIFIER LEFT_BRACE $@3 struct_declaration_list RIGHT_BRACE */ -#line 3527 "MachineIndependent/glslang.y" + case 545: /* struct_specifier: STRUCT IDENTIFIER LEFT_BRACE $@3 struct_declaration_list RIGHT_BRACE */ +#line 3585 "MachineIndependent/glslang.y" { + TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string); parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure); + TVariable* userTypeDef = new TVariable((yyvsp[-4].lex).string, *structure, true); if (! parseContext.symbolTable.insert(*userTypeDef)) parseContext.error((yyvsp[-4].lex).loc, "redefinition", (yyvsp[-4].lex).string->c_str(), "struct"); + else if (parseContext.spvVersion.vulkanRelaxed + && structure->containsOpaque()) + parseContext.relaxedSymbols.push_back(structure->getTypeName()); + (yyval.interm.type).init((yyvsp[-5].lex).loc); (yyval.interm.type).basicType = EbtStruct; (yyval.interm.type).userDef = structure; --parseContext.structNestingLevel; } -#line 10771 "MachineIndependent/glslang_tab.cpp" +#line 10981 "MachineIndependent/glslang_tab.cpp" break; - case 535: /* $@4: %empty */ -#line 3538 "MachineIndependent/glslang.y" + case 546: /* $@4: %empty */ +#line 3602 "MachineIndependent/glslang.y" { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); } -#line 10777 "MachineIndependent/glslang_tab.cpp" +#line 10987 "MachineIndependent/glslang_tab.cpp" break; - case 536: /* struct_specifier: STRUCT LEFT_BRACE $@4 struct_declaration_list RIGHT_BRACE */ -#line 3538 "MachineIndependent/glslang.y" + case 547: /* struct_specifier: STRUCT LEFT_BRACE $@4 struct_declaration_list RIGHT_BRACE */ +#line 3602 "MachineIndependent/glslang.y" { TType* structure = new TType((yyvsp[-1].interm.typeList), TString("")); (yyval.interm.type).init((yyvsp[-4].lex).loc); @@ -10785,19 +10995,19 @@ yyreduce: (yyval.interm.type).userDef = structure; --parseContext.structNestingLevel; } -#line 10789 "MachineIndependent/glslang_tab.cpp" +#line 10999 "MachineIndependent/glslang_tab.cpp" break; - case 537: /* struct_declaration_list: struct_declaration */ -#line 3548 "MachineIndependent/glslang.y" + case 548: /* struct_declaration_list: struct_declaration */ +#line 3612 "MachineIndependent/glslang.y" { (yyval.interm.typeList) = (yyvsp[0].interm.typeList); } -#line 10797 "MachineIndependent/glslang_tab.cpp" +#line 11007 "MachineIndependent/glslang_tab.cpp" break; - case 538: /* struct_declaration_list: struct_declaration_list struct_declaration */ -#line 3551 "MachineIndependent/glslang.y" + case 549: /* struct_declaration_list: struct_declaration_list struct_declaration */ +#line 3615 "MachineIndependent/glslang.y" { (yyval.interm.typeList) = (yyvsp[-1].interm.typeList); for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) { @@ -10808,11 +11018,11 @@ yyreduce: (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]); } } -#line 10812 "MachineIndependent/glslang_tab.cpp" +#line 11022 "MachineIndependent/glslang_tab.cpp" break; - case 539: /* struct_declaration: type_specifier struct_declarator_list SEMICOLON */ -#line 3564 "MachineIndependent/glslang.y" + case 550: /* struct_declaration: type_specifier struct_declarator_list SEMICOLON */ +#line 3628 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -10824,7 +11034,7 @@ yyreduce: (yyval.interm.typeList) = (yyvsp[-1].interm.typeList); parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType); - parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier); + parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier, (yyvsp[-2].interm.type).isCoopmat()); for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) { TType type((yyvsp[-2].interm.type)); @@ -10835,11 +11045,11 @@ yyreduce: (*(yyval.interm.typeList))[i].type->shallowCopy(type); } } -#line 10839 "MachineIndependent/glslang_tab.cpp" +#line 11049 "MachineIndependent/glslang_tab.cpp" break; - case 540: /* struct_declaration: type_qualifier type_specifier struct_declarator_list SEMICOLON */ -#line 3586 "MachineIndependent/glslang.y" + case 551: /* struct_declaration: type_qualifier type_specifier struct_declarator_list SEMICOLON */ +#line 3650 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -10853,7 +11063,7 @@ yyreduce: parseContext.memberQualifierCheck((yyvsp[-3].interm.type)); parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType); parseContext.mergeQualifiers((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, (yyvsp[-3].interm.type).qualifier, true); - parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier); + parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier, (yyvsp[-2].interm.type).isCoopmat()); for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) { TType type((yyvsp[-2].interm.type)); @@ -10864,38 +11074,38 @@ yyreduce: (*(yyval.interm.typeList))[i].type->shallowCopy(type); } } -#line 10868 "MachineIndependent/glslang_tab.cpp" +#line 11078 "MachineIndependent/glslang_tab.cpp" break; - case 541: /* struct_declarator_list: struct_declarator */ -#line 3613 "MachineIndependent/glslang.y" + case 552: /* struct_declarator_list: struct_declarator */ +#line 3677 "MachineIndependent/glslang.y" { (yyval.interm.typeList) = new TTypeList; (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine)); } -#line 10877 "MachineIndependent/glslang_tab.cpp" +#line 11087 "MachineIndependent/glslang_tab.cpp" break; - case 542: /* struct_declarator_list: struct_declarator_list COMMA struct_declarator */ -#line 3617 "MachineIndependent/glslang.y" + case 553: /* struct_declarator_list: struct_declarator_list COMMA struct_declarator */ +#line 3681 "MachineIndependent/glslang.y" { (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine)); } -#line 10885 "MachineIndependent/glslang_tab.cpp" +#line 11095 "MachineIndependent/glslang_tab.cpp" break; - case 543: /* struct_declarator: IDENTIFIER */ -#line 3623 "MachineIndependent/glslang.y" + case 554: /* struct_declarator: IDENTIFIER */ +#line 3687 "MachineIndependent/glslang.y" { (yyval.interm.typeLine).type = new TType(EbtVoid); (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc; (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string); } -#line 10895 "MachineIndependent/glslang_tab.cpp" +#line 11105 "MachineIndependent/glslang_tab.cpp" break; - case 544: /* struct_declarator: IDENTIFIER array_specifier */ -#line 3628 "MachineIndependent/glslang.y" + case 555: /* struct_declarator: IDENTIFIER array_specifier */ +#line 3692 "MachineIndependent/glslang.y" { parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes); @@ -10904,246 +11114,246 @@ yyreduce: (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string); (yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes); } -#line 10908 "MachineIndependent/glslang_tab.cpp" +#line 11118 "MachineIndependent/glslang_tab.cpp" break; - case 545: /* initializer: assignment_expression */ -#line 3639 "MachineIndependent/glslang.y" + case 556: /* initializer: assignment_expression */ +#line 3703 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 10916 "MachineIndependent/glslang_tab.cpp" +#line 11126 "MachineIndependent/glslang_tab.cpp" break; - case 546: /* initializer: LEFT_BRACE initializer_list RIGHT_BRACE */ -#line 3643 "MachineIndependent/glslang.y" + case 557: /* initializer: LEFT_BRACE initializer_list RIGHT_BRACE */ +#line 3706 "MachineIndependent/glslang.y" { const char* initFeature = "{ } style initializers"; parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature); parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode); } -#line 10927 "MachineIndependent/glslang_tab.cpp" +#line 11137 "MachineIndependent/glslang_tab.cpp" break; - case 547: /* initializer: LEFT_BRACE initializer_list COMMA RIGHT_BRACE */ -#line 3649 "MachineIndependent/glslang.y" + case 558: /* initializer: LEFT_BRACE initializer_list COMMA RIGHT_BRACE */ +#line 3712 "MachineIndependent/glslang.y" { const char* initFeature = "{ } style initializers"; parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature); parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 10938 "MachineIndependent/glslang_tab.cpp" +#line 11148 "MachineIndependent/glslang_tab.cpp" break; - case 548: /* initializer: LEFT_BRACE RIGHT_BRACE */ -#line 3655 "MachineIndependent/glslang.y" + case 559: /* initializer: LEFT_BRACE RIGHT_BRACE */ +#line 3718 "MachineIndependent/glslang.y" { const char* initFeature = "empty { } initializer"; parseContext.profileRequires((yyvsp[-1].lex).loc, EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); parseContext.profileRequires((yyvsp[-1].lex).loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); (yyval.interm.intermTypedNode) = parseContext.intermediate.makeAggregate((yyvsp[-1].lex).loc); } -#line 10949 "MachineIndependent/glslang_tab.cpp" +#line 11159 "MachineIndependent/glslang_tab.cpp" break; - case 549: /* initializer_list: initializer */ -#line 3666 "MachineIndependent/glslang.y" + case 560: /* initializer_list: initializer */ +#line 3727 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc()); } -#line 10957 "MachineIndependent/glslang_tab.cpp" +#line 11167 "MachineIndependent/glslang_tab.cpp" break; - case 550: /* initializer_list: initializer_list COMMA initializer */ -#line 3669 "MachineIndependent/glslang.y" + case 561: /* initializer_list: initializer_list COMMA initializer */ +#line 3730 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); } -#line 10965 "MachineIndependent/glslang_tab.cpp" +#line 11175 "MachineIndependent/glslang_tab.cpp" break; - case 551: /* declaration_statement: declaration */ -#line 3676 "MachineIndependent/glslang.y" + case 562: /* declaration_statement: declaration */ +#line 3736 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 10971 "MachineIndependent/glslang_tab.cpp" +#line 11181 "MachineIndependent/glslang_tab.cpp" break; - case 552: /* statement: compound_statement */ -#line 3680 "MachineIndependent/glslang.y" + case 563: /* statement: compound_statement */ +#line 3740 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 10977 "MachineIndependent/glslang_tab.cpp" +#line 11187 "MachineIndependent/glslang_tab.cpp" break; - case 553: /* statement: simple_statement */ -#line 3681 "MachineIndependent/glslang.y" + case 564: /* statement: simple_statement */ +#line 3741 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 10983 "MachineIndependent/glslang_tab.cpp" +#line 11193 "MachineIndependent/glslang_tab.cpp" break; - case 554: /* simple_statement: declaration_statement */ -#line 3687 "MachineIndependent/glslang.y" + case 565: /* simple_statement: declaration_statement */ +#line 3747 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 10989 "MachineIndependent/glslang_tab.cpp" +#line 11199 "MachineIndependent/glslang_tab.cpp" break; - case 555: /* simple_statement: expression_statement */ -#line 3688 "MachineIndependent/glslang.y" + case 566: /* simple_statement: expression_statement */ +#line 3748 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 10995 "MachineIndependent/glslang_tab.cpp" +#line 11205 "MachineIndependent/glslang_tab.cpp" break; - case 556: /* simple_statement: selection_statement */ -#line 3689 "MachineIndependent/glslang.y" + case 567: /* simple_statement: selection_statement */ +#line 3749 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11001 "MachineIndependent/glslang_tab.cpp" +#line 11211 "MachineIndependent/glslang_tab.cpp" break; - case 557: /* simple_statement: switch_statement */ -#line 3690 "MachineIndependent/glslang.y" + case 568: /* simple_statement: switch_statement */ +#line 3750 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11007 "MachineIndependent/glslang_tab.cpp" +#line 11217 "MachineIndependent/glslang_tab.cpp" break; - case 558: /* simple_statement: case_label */ -#line 3691 "MachineIndependent/glslang.y" + case 569: /* simple_statement: case_label */ +#line 3751 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11013 "MachineIndependent/glslang_tab.cpp" +#line 11223 "MachineIndependent/glslang_tab.cpp" break; - case 559: /* simple_statement: iteration_statement */ -#line 3692 "MachineIndependent/glslang.y" + case 570: /* simple_statement: iteration_statement */ +#line 3752 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11019 "MachineIndependent/glslang_tab.cpp" +#line 11229 "MachineIndependent/glslang_tab.cpp" break; - case 560: /* simple_statement: jump_statement */ -#line 3693 "MachineIndependent/glslang.y" + case 571: /* simple_statement: jump_statement */ +#line 3753 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11025 "MachineIndependent/glslang_tab.cpp" +#line 11235 "MachineIndependent/glslang_tab.cpp" break; - case 561: /* simple_statement: demote_statement */ -#line 3695 "MachineIndependent/glslang.y" + case 572: /* simple_statement: demote_statement */ +#line 3754 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11031 "MachineIndependent/glslang_tab.cpp" +#line 11241 "MachineIndependent/glslang_tab.cpp" break; - case 562: /* demote_statement: DEMOTE SEMICOLON */ -#line 3701 "MachineIndependent/glslang.y" + case 573: /* demote_statement: DEMOTE SEMICOLON */ +#line 3758 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "demote"); parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_demote_to_helper_invocation, "demote"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDemote, (yyvsp[-1].lex).loc); } -#line 11041 "MachineIndependent/glslang_tab.cpp" +#line 11251 "MachineIndependent/glslang_tab.cpp" break; - case 563: /* compound_statement: LEFT_BRACE RIGHT_BRACE */ -#line 3710 "MachineIndependent/glslang.y" + case 574: /* compound_statement: LEFT_BRACE RIGHT_BRACE */ +#line 3766 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11047 "MachineIndependent/glslang_tab.cpp" +#line 11257 "MachineIndependent/glslang_tab.cpp" break; - case 564: /* $@5: %empty */ -#line 3711 "MachineIndependent/glslang.y" + case 575: /* $@5: %empty */ +#line 3767 "MachineIndependent/glslang.y" { parseContext.symbolTable.push(); ++parseContext.statementNestingLevel; } -#line 11056 "MachineIndependent/glslang_tab.cpp" +#line 11266 "MachineIndependent/glslang_tab.cpp" break; - case 565: /* $@6: %empty */ -#line 3715 "MachineIndependent/glslang.y" + case 576: /* $@6: %empty */ +#line 3771 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.statementNestingLevel; } -#line 11065 "MachineIndependent/glslang_tab.cpp" +#line 11275 "MachineIndependent/glslang_tab.cpp" break; - case 566: /* compound_statement: LEFT_BRACE $@5 statement_list $@6 RIGHT_BRACE */ -#line 3719 "MachineIndependent/glslang.y" + case 577: /* compound_statement: LEFT_BRACE $@5 statement_list $@6 RIGHT_BRACE */ +#line 3775 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate()) - (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence); + (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence); (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode); } -#line 11075 "MachineIndependent/glslang_tab.cpp" +#line 11285 "MachineIndependent/glslang_tab.cpp" break; - case 567: /* statement_no_new_scope: compound_statement_no_new_scope */ -#line 3727 "MachineIndependent/glslang.y" + case 578: /* statement_no_new_scope: compound_statement_no_new_scope */ +#line 3783 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11081 "MachineIndependent/glslang_tab.cpp" +#line 11291 "MachineIndependent/glslang_tab.cpp" break; - case 568: /* statement_no_new_scope: simple_statement */ -#line 3728 "MachineIndependent/glslang.y" + case 579: /* statement_no_new_scope: simple_statement */ +#line 3784 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11087 "MachineIndependent/glslang_tab.cpp" +#line 11297 "MachineIndependent/glslang_tab.cpp" break; - case 569: /* $@7: %empty */ -#line 3732 "MachineIndependent/glslang.y" + case 580: /* $@7: %empty */ +#line 3788 "MachineIndependent/glslang.y" { ++parseContext.controlFlowNestingLevel; } -#line 11095 "MachineIndependent/glslang_tab.cpp" +#line 11305 "MachineIndependent/glslang_tab.cpp" break; - case 570: /* statement_scoped: $@7 compound_statement */ -#line 3735 "MachineIndependent/glslang.y" + case 581: /* statement_scoped: $@7 compound_statement */ +#line 3791 "MachineIndependent/glslang.y" { --parseContext.controlFlowNestingLevel; (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11104 "MachineIndependent/glslang_tab.cpp" +#line 11314 "MachineIndependent/glslang_tab.cpp" break; - case 571: /* $@8: %empty */ -#line 3739 "MachineIndependent/glslang.y" + case 582: /* $@8: %empty */ +#line 3795 "MachineIndependent/glslang.y" { parseContext.symbolTable.push(); ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11114 "MachineIndependent/glslang_tab.cpp" +#line 11324 "MachineIndependent/glslang_tab.cpp" break; - case 572: /* statement_scoped: $@8 simple_statement */ -#line 3744 "MachineIndependent/glslang.y" + case 583: /* statement_scoped: $@8 simple_statement */ +#line 3800 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11125 "MachineIndependent/glslang_tab.cpp" +#line 11335 "MachineIndependent/glslang_tab.cpp" break; - case 573: /* compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE */ -#line 3753 "MachineIndependent/glslang.y" + case 584: /* compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE */ +#line 3809 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11133 "MachineIndependent/glslang_tab.cpp" +#line 11343 "MachineIndependent/glslang_tab.cpp" break; - case 574: /* compound_statement_no_new_scope: LEFT_BRACE statement_list RIGHT_BRACE */ -#line 3756 "MachineIndependent/glslang.y" + case 585: /* compound_statement_no_new_scope: LEFT_BRACE statement_list RIGHT_BRACE */ +#line 3812 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate()) (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence); (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode); } -#line 11143 "MachineIndependent/glslang_tab.cpp" +#line 11353 "MachineIndependent/glslang_tab.cpp" break; - case 575: /* statement_list: statement */ -#line 3764 "MachineIndependent/glslang.y" + case 586: /* statement_list: statement */ +#line 3820 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase || @@ -11152,11 +11362,11 @@ yyreduce: (yyval.interm.intermNode) = 0; // start a fresh subsequence for what's after this case } } -#line 11156 "MachineIndependent/glslang_tab.cpp" +#line 11366 "MachineIndependent/glslang_tab.cpp" break; - case 576: /* statement_list: statement_list statement */ -#line 3772 "MachineIndependent/glslang.y" + case 587: /* statement_list: statement_list statement */ +#line 3828 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase || (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) { @@ -11165,77 +11375,77 @@ yyreduce: } else (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode)); } -#line 11169 "MachineIndependent/glslang_tab.cpp" +#line 11379 "MachineIndependent/glslang_tab.cpp" break; - case 577: /* expression_statement: SEMICOLON */ -#line 3783 "MachineIndependent/glslang.y" + case 588: /* expression_statement: SEMICOLON */ +#line 3839 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11175 "MachineIndependent/glslang_tab.cpp" +#line 11385 "MachineIndependent/glslang_tab.cpp" break; - case 578: /* expression_statement: expression SEMICOLON */ -#line 3784 "MachineIndependent/glslang.y" + case 589: /* expression_statement: expression SEMICOLON */ +#line 3840 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = static_cast((yyvsp[-1].interm.intermTypedNode)); } -#line 11181 "MachineIndependent/glslang_tab.cpp" +#line 11391 "MachineIndependent/glslang_tab.cpp" break; - case 579: /* selection_statement: selection_statement_nonattributed */ -#line 3788 "MachineIndependent/glslang.y" + case 590: /* selection_statement: selection_statement_nonattributed */ +#line 3844 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11189 "MachineIndependent/glslang_tab.cpp" +#line 11399 "MachineIndependent/glslang_tab.cpp" break; - case 580: /* selection_statement: attribute selection_statement_nonattributed */ -#line 3792 "MachineIndependent/glslang.y" + case 591: /* selection_statement: attribute selection_statement_nonattributed */ +#line 3847 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11199 "MachineIndependent/glslang_tab.cpp" +#line 11409 "MachineIndependent/glslang_tab.cpp" break; - case 581: /* selection_statement_nonattributed: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement */ -#line 3800 "MachineIndependent/glslang.y" + case 592: /* selection_statement_nonattributed: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement */ +#line 3854 "MachineIndependent/glslang.y" { parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode)); (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc); } -#line 11208 "MachineIndependent/glslang_tab.cpp" +#line 11418 "MachineIndependent/glslang_tab.cpp" break; - case 582: /* selection_rest_statement: statement_scoped ELSE statement_scoped */ -#line 3807 "MachineIndependent/glslang.y" + case 593: /* selection_rest_statement: statement_scoped ELSE statement_scoped */ +#line 3861 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode); (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode); } -#line 11217 "MachineIndependent/glslang_tab.cpp" +#line 11427 "MachineIndependent/glslang_tab.cpp" break; - case 583: /* selection_rest_statement: statement_scoped */ -#line 3811 "MachineIndependent/glslang.y" + case 594: /* selection_rest_statement: statement_scoped */ +#line 3865 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode); (yyval.interm.nodePair).node2 = 0; } -#line 11226 "MachineIndependent/glslang_tab.cpp" +#line 11436 "MachineIndependent/glslang_tab.cpp" break; - case 584: /* condition: expression */ -#line 3819 "MachineIndependent/glslang.y" + case 595: /* condition: expression */ +#line 3873 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode)); } -#line 11235 "MachineIndependent/glslang_tab.cpp" +#line 11445 "MachineIndependent/glslang_tab.cpp" break; - case 585: /* condition: fully_specified_type IDENTIFIER EQUAL initializer */ -#line 3823 "MachineIndependent/glslang.y" + case 596: /* condition: fully_specified_type IDENTIFIER EQUAL initializer */ +#line 3877 "MachineIndependent/glslang.y" { parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type)); @@ -11246,29 +11456,29 @@ yyreduce: else (yyval.interm.intermTypedNode) = 0; } -#line 11250 "MachineIndependent/glslang_tab.cpp" +#line 11460 "MachineIndependent/glslang_tab.cpp" break; - case 586: /* switch_statement: switch_statement_nonattributed */ -#line 3836 "MachineIndependent/glslang.y" + case 597: /* switch_statement: switch_statement_nonattributed */ +#line 3890 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11258 "MachineIndependent/glslang_tab.cpp" +#line 11468 "MachineIndependent/glslang_tab.cpp" break; - case 587: /* switch_statement: attribute switch_statement_nonattributed */ -#line 3840 "MachineIndependent/glslang.y" + case 598: /* switch_statement: attribute switch_statement_nonattributed */ +#line 3893 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11268 "MachineIndependent/glslang_tab.cpp" +#line 11478 "MachineIndependent/glslang_tab.cpp" break; - case 588: /* $@9: %empty */ -#line 3848 "MachineIndependent/glslang.y" + case 599: /* $@9: %empty */ +#line 3900 "MachineIndependent/glslang.y" { // start new switch sequence on the switch stack ++parseContext.controlFlowNestingLevel; @@ -11277,11 +11487,11 @@ yyreduce: parseContext.switchLevel.push_back(parseContext.statementNestingLevel); parseContext.symbolTable.push(); } -#line 11281 "MachineIndependent/glslang_tab.cpp" +#line 11491 "MachineIndependent/glslang_tab.cpp" break; - case 589: /* switch_statement_nonattributed: SWITCH LEFT_PAREN expression RIGHT_PAREN $@9 LEFT_BRACE switch_statement_list RIGHT_BRACE */ -#line 3856 "MachineIndependent/glslang.y" + case 600: /* switch_statement_nonattributed: SWITCH LEFT_PAREN expression RIGHT_PAREN $@9 LEFT_BRACE switch_statement_list RIGHT_BRACE */ +#line 3908 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0); delete parseContext.switchSequenceStack.back(); @@ -11291,27 +11501,27 @@ yyreduce: --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11295 "MachineIndependent/glslang_tab.cpp" +#line 11505 "MachineIndependent/glslang_tab.cpp" break; - case 590: /* switch_statement_list: %empty */ -#line 3868 "MachineIndependent/glslang.y" + case 601: /* switch_statement_list: %empty */ +#line 3920 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11303 "MachineIndependent/glslang_tab.cpp" +#line 11513 "MachineIndependent/glslang_tab.cpp" break; - case 591: /* switch_statement_list: statement_list */ -#line 3871 "MachineIndependent/glslang.y" + case 602: /* switch_statement_list: statement_list */ +#line 3923 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11311 "MachineIndependent/glslang_tab.cpp" +#line 11521 "MachineIndependent/glslang_tab.cpp" break; - case 592: /* case_label: CASE expression COLON */ -#line 3877 "MachineIndependent/glslang.y" + case 603: /* case_label: CASE expression COLON */ +#line 3929 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; if (parseContext.switchLevel.size() == 0) @@ -11324,11 +11534,11 @@ yyreduce: (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc); } } -#line 11328 "MachineIndependent/glslang_tab.cpp" +#line 11538 "MachineIndependent/glslang_tab.cpp" break; - case 593: /* case_label: DEFAULT COLON */ -#line 3889 "MachineIndependent/glslang.y" + case 604: /* case_label: DEFAULT COLON */ +#line 3941 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; if (parseContext.switchLevel.size() == 0) @@ -11338,29 +11548,30 @@ yyreduce: else (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc); } -#line 11342 "MachineIndependent/glslang_tab.cpp" +#line 11552 "MachineIndependent/glslang_tab.cpp" break; - case 594: /* iteration_statement: iteration_statement_nonattributed */ -#line 3901 "MachineIndependent/glslang.y" + case 605: /* iteration_statement: iteration_statement_nonattributed */ +#line 3953 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11350 "MachineIndependent/glslang_tab.cpp" +#line 11560 "MachineIndependent/glslang_tab.cpp" break; - case 595: /* iteration_statement: attribute iteration_statement_nonattributed */ -#line 3905 "MachineIndependent/glslang.y" + case 606: /* iteration_statement: attribute iteration_statement_nonattributed */ +#line 3956 "MachineIndependent/glslang.y" { - parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); + const char * extensions[2] = { E_GL_EXT_control_flow_attributes, E_GL_EXT_control_flow_attributes2 }; + parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 2, extensions, "attribute"); parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11360 "MachineIndependent/glslang_tab.cpp" +#line 11571 "MachineIndependent/glslang_tab.cpp" break; - case 596: /* $@10: %empty */ -#line 3913 "MachineIndependent/glslang.y" + case 607: /* $@10: %empty */ +#line 3964 "MachineIndependent/glslang.y" { if (! parseContext.limits.whileLoops) parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", ""); @@ -11369,11 +11580,11 @@ yyreduce: ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11373 "MachineIndependent/glslang_tab.cpp" +#line 11584 "MachineIndependent/glslang_tab.cpp" break; - case 597: /* iteration_statement_nonattributed: WHILE LEFT_PAREN $@10 condition RIGHT_PAREN statement_no_new_scope */ -#line 3921 "MachineIndependent/glslang.y" + case 608: /* iteration_statement_nonattributed: WHILE LEFT_PAREN $@10 condition RIGHT_PAREN statement_no_new_scope */ +#line 3972 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc); @@ -11381,21 +11592,22 @@ yyreduce: --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11385 "MachineIndependent/glslang_tab.cpp" +#line 11596 "MachineIndependent/glslang_tab.cpp" break; - case 598: /* $@11: %empty */ -#line 3928 "MachineIndependent/glslang.y" + case 609: /* $@11: %empty */ +#line 3979 "MachineIndependent/glslang.y" { + parseContext.symbolTable.push(); ++parseContext.loopNestingLevel; ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11395 "MachineIndependent/glslang_tab.cpp" +#line 11607 "MachineIndependent/glslang_tab.cpp" break; - case 599: /* iteration_statement_nonattributed: DO $@11 statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON */ -#line 3933 "MachineIndependent/glslang.y" + case 610: /* iteration_statement_nonattributed: DO $@11 statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON */ +#line 3985 "MachineIndependent/glslang.y" { if (! parseContext.limits.whileLoops) parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", ""); @@ -11403,26 +11615,27 @@ yyreduce: parseContext.boolCheck((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode)); (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[-5].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, false, (yyvsp[-4].lex).loc); + parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.loopNestingLevel; --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11411 "MachineIndependent/glslang_tab.cpp" +#line 11624 "MachineIndependent/glslang_tab.cpp" break; - case 600: /* $@12: %empty */ -#line 3944 "MachineIndependent/glslang.y" + case 611: /* $@12: %empty */ +#line 3997 "MachineIndependent/glslang.y" { parseContext.symbolTable.push(); ++parseContext.loopNestingLevel; ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11422 "MachineIndependent/glslang_tab.cpp" +#line 11635 "MachineIndependent/glslang_tab.cpp" break; - case 601: /* iteration_statement_nonattributed: FOR LEFT_PAREN $@12 for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope */ -#line 3950 "MachineIndependent/glslang.y" + case 612: /* iteration_statement_nonattributed: FOR LEFT_PAREN $@12 for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope */ +#line 4003 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc); @@ -11435,81 +11648,81 @@ yyreduce: --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11439 "MachineIndependent/glslang_tab.cpp" +#line 11652 "MachineIndependent/glslang_tab.cpp" break; - case 602: /* for_init_statement: expression_statement */ -#line 3965 "MachineIndependent/glslang.y" + case 613: /* for_init_statement: expression_statement */ +#line 4018 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11447 "MachineIndependent/glslang_tab.cpp" +#line 11660 "MachineIndependent/glslang_tab.cpp" break; - case 603: /* for_init_statement: declaration_statement */ -#line 3968 "MachineIndependent/glslang.y" + case 614: /* for_init_statement: declaration_statement */ +#line 4021 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11455 "MachineIndependent/glslang_tab.cpp" +#line 11668 "MachineIndependent/glslang_tab.cpp" break; - case 604: /* conditionopt: condition */ -#line 3974 "MachineIndependent/glslang.y" + case 615: /* conditionopt: condition */ +#line 4027 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 11463 "MachineIndependent/glslang_tab.cpp" +#line 11676 "MachineIndependent/glslang_tab.cpp" break; - case 605: /* conditionopt: %empty */ -#line 3977 "MachineIndependent/glslang.y" + case 616: /* conditionopt: %empty */ +#line 4030 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = 0; } -#line 11471 "MachineIndependent/glslang_tab.cpp" +#line 11684 "MachineIndependent/glslang_tab.cpp" break; - case 606: /* for_rest_statement: conditionopt SEMICOLON */ -#line 3983 "MachineIndependent/glslang.y" + case 617: /* for_rest_statement: conditionopt SEMICOLON */ +#line 4036 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode); (yyval.interm.nodePair).node2 = 0; } -#line 11480 "MachineIndependent/glslang_tab.cpp" +#line 11693 "MachineIndependent/glslang_tab.cpp" break; - case 607: /* for_rest_statement: conditionopt SEMICOLON expression */ -#line 3987 "MachineIndependent/glslang.y" + case 618: /* for_rest_statement: conditionopt SEMICOLON expression */ +#line 4040 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode); (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode); } -#line 11489 "MachineIndependent/glslang_tab.cpp" +#line 11702 "MachineIndependent/glslang_tab.cpp" break; - case 608: /* jump_statement: CONTINUE SEMICOLON */ -#line 3994 "MachineIndependent/glslang.y" + case 619: /* jump_statement: CONTINUE SEMICOLON */ +#line 4047 "MachineIndependent/glslang.y" { if (parseContext.loopNestingLevel <= 0) parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", ""); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc); } -#line 11499 "MachineIndependent/glslang_tab.cpp" +#line 11712 "MachineIndependent/glslang_tab.cpp" break; - case 609: /* jump_statement: BREAK SEMICOLON */ -#line 3999 "MachineIndependent/glslang.y" + case 620: /* jump_statement: BREAK SEMICOLON */ +#line 4052 "MachineIndependent/glslang.y" { if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0) parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", ""); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc); } -#line 11509 "MachineIndependent/glslang_tab.cpp" +#line 11722 "MachineIndependent/glslang_tab.cpp" break; - case 610: /* jump_statement: RETURN SEMICOLON */ -#line 4004 "MachineIndependent/glslang.y" + case 621: /* jump_statement: RETURN SEMICOLON */ +#line 4057 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc); if (parseContext.currentFunctionType->getBasicType() != EbtVoid) @@ -11517,101 +11730,101 @@ yyreduce: if (parseContext.inMain) parseContext.postEntryPointReturn = true; } -#line 11521 "MachineIndependent/glslang_tab.cpp" +#line 11734 "MachineIndependent/glslang_tab.cpp" break; - case 611: /* jump_statement: RETURN expression SEMICOLON */ -#line 4011 "MachineIndependent/glslang.y" + case 622: /* jump_statement: RETURN expression SEMICOLON */ +#line 4064 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode)); } -#line 11529 "MachineIndependent/glslang_tab.cpp" +#line 11742 "MachineIndependent/glslang_tab.cpp" break; - case 612: /* jump_statement: DISCARD SEMICOLON */ -#line 4014 "MachineIndependent/glslang.y" + case 623: /* jump_statement: DISCARD SEMICOLON */ +#line 4067 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc); } -#line 11538 "MachineIndependent/glslang_tab.cpp" +#line 11751 "MachineIndependent/glslang_tab.cpp" break; - case 613: /* jump_statement: TERMINATE_INVOCATION SEMICOLON */ -#line 4018 "MachineIndependent/glslang.y" + case 624: /* jump_statement: TERMINATE_INVOCATION SEMICOLON */ +#line 4071 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "terminateInvocation"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateInvocation, (yyvsp[-1].lex).loc); } -#line 11547 "MachineIndependent/glslang_tab.cpp" +#line 11760 "MachineIndependent/glslang_tab.cpp" break; - case 614: /* jump_statement: TERMINATE_RAY SEMICOLON */ -#line 4023 "MachineIndependent/glslang.y" + case 625: /* jump_statement: TERMINATE_RAY SEMICOLON */ +#line 4075 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "terminateRayEXT"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateRayKHR, (yyvsp[-1].lex).loc); } -#line 11556 "MachineIndependent/glslang_tab.cpp" +#line 11769 "MachineIndependent/glslang_tab.cpp" break; - case 615: /* jump_statement: IGNORE_INTERSECTION SEMICOLON */ -#line 4027 "MachineIndependent/glslang.y" + case 626: /* jump_statement: IGNORE_INTERSECTION SEMICOLON */ +#line 4079 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "ignoreIntersectionEXT"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, (yyvsp[-1].lex).loc); } -#line 11565 "MachineIndependent/glslang_tab.cpp" +#line 11778 "MachineIndependent/glslang_tab.cpp" break; - case 616: /* translation_unit: external_declaration */ -#line 4037 "MachineIndependent/glslang.y" + case 627: /* translation_unit: external_declaration */ +#line 4088 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); parseContext.intermediate.setTreeRoot((yyval.interm.intermNode)); } -#line 11574 "MachineIndependent/glslang_tab.cpp" +#line 11787 "MachineIndependent/glslang_tab.cpp" break; - case 617: /* translation_unit: translation_unit external_declaration */ -#line 4041 "MachineIndependent/glslang.y" + case 628: /* translation_unit: translation_unit external_declaration */ +#line 4092 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermNode) != nullptr) { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode)); parseContext.intermediate.setTreeRoot((yyval.interm.intermNode)); } } -#line 11585 "MachineIndependent/glslang_tab.cpp" +#line 11798 "MachineIndependent/glslang_tab.cpp" break; - case 618: /* external_declaration: function_definition */ -#line 4050 "MachineIndependent/glslang.y" + case 629: /* external_declaration: function_definition */ +#line 4101 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11593 "MachineIndependent/glslang_tab.cpp" +#line 11806 "MachineIndependent/glslang_tab.cpp" break; - case 619: /* external_declaration: declaration */ -#line 4053 "MachineIndependent/glslang.y" + case 630: /* external_declaration: declaration */ +#line 4104 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11601 "MachineIndependent/glslang_tab.cpp" +#line 11814 "MachineIndependent/glslang_tab.cpp" break; - case 620: /* external_declaration: SEMICOLON */ -#line 4057 "MachineIndependent/glslang.y" + case 631: /* external_declaration: SEMICOLON */ +#line 4107 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon"); parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon"); (yyval.interm.intermNode) = nullptr; } -#line 11611 "MachineIndependent/glslang_tab.cpp" +#line 11824 "MachineIndependent/glslang_tab.cpp" break; - case 621: /* $@13: %empty */ -#line 4066 "MachineIndependent/glslang.y" + case 632: /* $@13: %empty */ +#line 4115 "MachineIndependent/glslang.y" { (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */); (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function); @@ -11624,17 +11837,18 @@ yyreduce: ++parseContext.statementNestingLevel; } } -#line 11628 "MachineIndependent/glslang_tab.cpp" +#line 11841 "MachineIndependent/glslang_tab.cpp" break; - case 622: /* function_definition: function_prototype $@13 compound_statement_no_new_scope */ -#line 4078 "MachineIndependent/glslang.y" + case 633: /* function_definition: function_prototype $@13 compound_statement_no_new_scope */ +#line 4127 "MachineIndependent/glslang.y" { // May be best done as post process phase on intermediate code if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue) parseContext.error((yyvsp[-2].interm).loc, "function does not return a value:", "", (yyvsp[-2].interm).function->getName().c_str()); parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermNode)); + (yyval.interm.intermNode)->getAsAggregate()->setLinkType((yyvsp[-2].interm).function->getLinkType()); parseContext.intermediate.setAggregateOperator((yyval.interm.intermNode), EOpFunction, (yyvsp[-2].interm).function->getType(), (yyvsp[-2].interm).loc); (yyval.interm.intermNode)->getAsAggregate()->setName((yyvsp[-2].interm).function->getMangledName().c_str()); @@ -11655,228 +11869,228 @@ yyreduce: --parseContext.statementNestingLevel; } } -#line 11659 "MachineIndependent/glslang_tab.cpp" +#line 11873 "MachineIndependent/glslang_tab.cpp" break; - case 623: /* attribute: LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET */ -#line 4108 "MachineIndependent/glslang.y" + case 634: /* attribute: LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET */ +#line 4157 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = (yyvsp[-2].interm.attributes); } -#line 11667 "MachineIndependent/glslang_tab.cpp" +#line 11881 "MachineIndependent/glslang_tab.cpp" break; - case 624: /* attribute_list: single_attribute */ -#line 4113 "MachineIndependent/glslang.y" + case 635: /* attribute_list: single_attribute */ +#line 4162 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = (yyvsp[0].interm.attributes); } -#line 11675 "MachineIndependent/glslang_tab.cpp" +#line 11889 "MachineIndependent/glslang_tab.cpp" break; - case 625: /* attribute_list: attribute_list COMMA single_attribute */ -#line 4116 "MachineIndependent/glslang.y" + case 636: /* attribute_list: attribute_list COMMA single_attribute */ +#line 4165 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes)); } -#line 11683 "MachineIndependent/glslang_tab.cpp" +#line 11897 "MachineIndependent/glslang_tab.cpp" break; - case 626: /* single_attribute: IDENTIFIER */ -#line 4121 "MachineIndependent/glslang.y" + case 637: /* single_attribute: IDENTIFIER */ +#line 4170 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string); } -#line 11691 "MachineIndependent/glslang_tab.cpp" +#line 11905 "MachineIndependent/glslang_tab.cpp" break; - case 627: /* single_attribute: IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN */ -#line 4124 "MachineIndependent/glslang.y" + case 638: /* single_attribute: IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN */ +#line 4173 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode)); } -#line 11699 "MachineIndependent/glslang_tab.cpp" +#line 11913 "MachineIndependent/glslang_tab.cpp" break; - case 628: /* spirv_requirements_list: spirv_requirements_parameter */ -#line 4131 "MachineIndependent/glslang.y" + case 639: /* spirv_requirements_list: spirv_requirements_parameter */ +#line 4178 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = (yyvsp[0].interm.spirvReq); } -#line 11707 "MachineIndependent/glslang_tab.cpp" +#line 11921 "MachineIndependent/glslang_tab.cpp" break; - case 629: /* spirv_requirements_list: spirv_requirements_list COMMA spirv_requirements_parameter */ -#line 4134 "MachineIndependent/glslang.y" + case 640: /* spirv_requirements_list: spirv_requirements_list COMMA spirv_requirements_parameter */ +#line 4181 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = parseContext.mergeSpirvRequirements((yyvsp[-1].lex).loc, (yyvsp[-2].interm.spirvReq), (yyvsp[0].interm.spirvReq)); } -#line 11715 "MachineIndependent/glslang_tab.cpp" +#line 11929 "MachineIndependent/glslang_tab.cpp" break; - case 630: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_extension_list RIGHT_BRACKET */ -#line 4139 "MachineIndependent/glslang.y" + case 641: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_extension_list RIGHT_BRACKET */ +#line 4186 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = parseContext.makeSpirvRequirement((yyvsp[-3].lex).loc, *(yyvsp[-4].lex).string, (yyvsp[-1].interm.intermNode)->getAsAggregate(), nullptr); } -#line 11723 "MachineIndependent/glslang_tab.cpp" +#line 11937 "MachineIndependent/glslang_tab.cpp" break; - case 631: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_capability_list RIGHT_BRACKET */ -#line 4142 "MachineIndependent/glslang.y" + case 642: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_capability_list RIGHT_BRACKET */ +#line 4189 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = parseContext.makeSpirvRequirement((yyvsp[-3].lex).loc, *(yyvsp[-4].lex).string, nullptr, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 11731 "MachineIndependent/glslang_tab.cpp" +#line 11945 "MachineIndependent/glslang_tab.cpp" break; - case 632: /* spirv_extension_list: STRING_LITERAL */ -#line 4147 "MachineIndependent/glslang.y" + case 643: /* spirv_extension_list: STRING_LITERAL */ +#line 4194 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 11739 "MachineIndependent/glslang_tab.cpp" +#line 11953 "MachineIndependent/glslang_tab.cpp" break; - case 633: /* spirv_extension_list: spirv_extension_list COMMA STRING_LITERAL */ -#line 4150 "MachineIndependent/glslang.y" + case 644: /* spirv_extension_list: spirv_extension_list COMMA STRING_LITERAL */ +#line 4197 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 11747 "MachineIndependent/glslang_tab.cpp" +#line 11961 "MachineIndependent/glslang_tab.cpp" break; - case 634: /* spirv_capability_list: INTCONSTANT */ -#line 4155 "MachineIndependent/glslang.y" + case 645: /* spirv_capability_list: INTCONSTANT */ +#line 4202 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true)); } -#line 11755 "MachineIndependent/glslang_tab.cpp" +#line 11969 "MachineIndependent/glslang_tab.cpp" break; - case 635: /* spirv_capability_list: spirv_capability_list COMMA INTCONSTANT */ -#line 4158 "MachineIndependent/glslang.y" + case 646: /* spirv_capability_list: spirv_capability_list COMMA INTCONSTANT */ +#line 4205 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true)); } -#line 11763 "MachineIndependent/glslang_tab.cpp" +#line 11977 "MachineIndependent/glslang_tab.cpp" break; - case 636: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ -#line 4163 "MachineIndependent/glslang.y" + case 647: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ +#line 4210 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-1].lex).i); (yyval.interm.intermNode) = 0; } -#line 11772 "MachineIndependent/glslang_tab.cpp" +#line 11986 "MachineIndependent/glslang_tab.cpp" break; - case 637: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ -#line 4167 "MachineIndependent/glslang.y" + case 648: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ +#line 4214 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-1].lex).i); (yyval.interm.intermNode) = 0; } -#line 11782 "MachineIndependent/glslang_tab.cpp" +#line 11996 "MachineIndependent/glslang_tab.cpp" break; - case 638: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ -#line 4172 "MachineIndependent/glslang.y" + case 649: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ +#line 4219 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11791 "MachineIndependent/glslang_tab.cpp" +#line 12005 "MachineIndependent/glslang_tab.cpp" break; - case 639: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ -#line 4176 "MachineIndependent/glslang.y" + case 650: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ +#line 4223 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11801 "MachineIndependent/glslang_tab.cpp" +#line 12015 "MachineIndependent/glslang_tab.cpp" break; - case 640: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ -#line 4181 "MachineIndependent/glslang.y" + case 651: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ +#line 4228 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvExecutionModeId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11810 "MachineIndependent/glslang_tab.cpp" +#line 12024 "MachineIndependent/glslang_tab.cpp" break; - case 641: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ -#line 4185 "MachineIndependent/glslang.y" + case 652: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ +#line 4232 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); parseContext.intermediate.insertSpirvExecutionModeId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11820 "MachineIndependent/glslang_tab.cpp" +#line 12034 "MachineIndependent/glslang_tab.cpp" break; - case 642: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter */ -#line 4192 "MachineIndependent/glslang.y" + case 653: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter */ +#line 4239 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); } -#line 11828 "MachineIndependent/glslang_tab.cpp" +#line 12042 "MachineIndependent/glslang_tab.cpp" break; - case 643: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter_list COMMA spirv_execution_mode_parameter */ -#line 4195 "MachineIndependent/glslang.y" + case 654: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter_list COMMA spirv_execution_mode_parameter */ +#line 4242 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode)); } -#line 11836 "MachineIndependent/glslang_tab.cpp" +#line 12050 "MachineIndependent/glslang_tab.cpp" break; - case 644: /* spirv_execution_mode_parameter: FLOATCONSTANT */ -#line 4200 "MachineIndependent/glslang.y" + case 655: /* spirv_execution_mode_parameter: FLOATCONSTANT */ +#line 4247 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 11844 "MachineIndependent/glslang_tab.cpp" +#line 12058 "MachineIndependent/glslang_tab.cpp" break; - case 645: /* spirv_execution_mode_parameter: INTCONSTANT */ -#line 4203 "MachineIndependent/glslang.y" + case 656: /* spirv_execution_mode_parameter: INTCONSTANT */ +#line 4250 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 11852 "MachineIndependent/glslang_tab.cpp" +#line 12066 "MachineIndependent/glslang_tab.cpp" break; - case 646: /* spirv_execution_mode_parameter: UINTCONSTANT */ -#line 4206 "MachineIndependent/glslang.y" + case 657: /* spirv_execution_mode_parameter: UINTCONSTANT */ +#line 4253 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 11860 "MachineIndependent/glslang_tab.cpp" +#line 12074 "MachineIndependent/glslang_tab.cpp" break; - case 647: /* spirv_execution_mode_parameter: BOOLCONSTANT */ -#line 4209 "MachineIndependent/glslang.y" + case 658: /* spirv_execution_mode_parameter: BOOLCONSTANT */ +#line 4256 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 11868 "MachineIndependent/glslang_tab.cpp" +#line 12082 "MachineIndependent/glslang_tab.cpp" break; - case 648: /* spirv_execution_mode_parameter: STRING_LITERAL */ -#line 4212 "MachineIndependent/glslang.y" + case 659: /* spirv_execution_mode_parameter: STRING_LITERAL */ +#line 4259 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true); } -#line 11876 "MachineIndependent/glslang_tab.cpp" +#line 12090 "MachineIndependent/glslang_tab.cpp" break; - case 649: /* spirv_execution_mode_id_parameter_list: constant_expression */ -#line 4217 "MachineIndependent/glslang.y" + case 660: /* spirv_execution_mode_id_parameter_list: constant_expression */ +#line 4264 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && @@ -11886,11 +12100,11 @@ yyreduce: parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermTypedNode)); } -#line 11890 "MachineIndependent/glslang_tab.cpp" +#line 12104 "MachineIndependent/glslang_tab.cpp" break; - case 650: /* spirv_execution_mode_id_parameter_list: spirv_execution_mode_id_parameter_list COMMA constant_expression */ -#line 4226 "MachineIndependent/glslang.y" + case 661: /* spirv_execution_mode_id_parameter_list: spirv_execution_mode_id_parameter_list COMMA constant_expression */ +#line 4273 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && @@ -11900,318 +12114,351 @@ yyreduce: parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermTypedNode)); } -#line 11904 "MachineIndependent/glslang_tab.cpp" +#line 12118 "MachineIndependent/glslang_tab.cpp" break; - case 651: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN INTCONSTANT RIGHT_PAREN */ -#line 4237 "MachineIndependent/glslang.y" + case 662: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN INTCONSTANT RIGHT_PAREN */ +#line 4284 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-3].lex).loc); (yyval.interm.type).qualifier.storage = EvqSpirvStorageClass; (yyval.interm.type).qualifier.spirvStorageClass = (yyvsp[-1].lex).i; } -#line 11914 "MachineIndependent/glslang_tab.cpp" +#line 12128 "MachineIndependent/glslang_tab.cpp" break; - case 652: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ -#line 4242 "MachineIndependent/glslang.y" + case 663: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ +#line 4289 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.type).qualifier.storage = EvqSpirvStorageClass; (yyval.interm.type).qualifier.spirvStorageClass = (yyvsp[-1].lex).i; } -#line 11925 "MachineIndependent/glslang_tab.cpp" +#line 12139 "MachineIndependent/glslang_tab.cpp" break; - case 653: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ -#line 4250 "MachineIndependent/glslang.y" + case 664: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ +#line 4297 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-3].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-1].lex).i); } -#line 11934 "MachineIndependent/glslang_tab.cpp" +#line 12148 "MachineIndependent/glslang_tab.cpp" break; - case 654: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ -#line 4254 "MachineIndependent/glslang.y" + case 665: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ +#line 4301 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-1].lex).i); } -#line 11944 "MachineIndependent/glslang_tab.cpp" +#line 12158 "MachineIndependent/glslang_tab.cpp" break; - case 655: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ -#line 4259 "MachineIndependent/glslang.y" + case 666: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ +#line 4306 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 11953 "MachineIndependent/glslang_tab.cpp" +#line 12167 "MachineIndependent/glslang_tab.cpp" break; - case 656: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ -#line 4263 "MachineIndependent/glslang.y" + case 667: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ +#line 4310 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 11963 "MachineIndependent/glslang_tab.cpp" +#line 12177 "MachineIndependent/glslang_tab.cpp" break; - case 657: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ -#line 4268 "MachineIndependent/glslang.y" + case 668: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ +#line 4315 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorateId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 11972 "MachineIndependent/glslang_tab.cpp" +#line 12186 "MachineIndependent/glslang_tab.cpp" break; - case 658: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ -#line 4272 "MachineIndependent/glslang.y" + case 669: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ +#line 4319 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorateId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 11982 "MachineIndependent/glslang_tab.cpp" +#line 12196 "MachineIndependent/glslang_tab.cpp" break; - case 659: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ -#line 4277 "MachineIndependent/glslang.y" + case 670: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ +#line 4324 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorateString((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 11991 "MachineIndependent/glslang_tab.cpp" +#line 12205 "MachineIndependent/glslang_tab.cpp" break; - case 660: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ -#line 4281 "MachineIndependent/glslang.y" + case 671: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ +#line 4328 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorateString((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 12001 "MachineIndependent/glslang_tab.cpp" +#line 12215 "MachineIndependent/glslang_tab.cpp" break; - case 661: /* spirv_decorate_parameter_list: spirv_decorate_parameter */ -#line 4288 "MachineIndependent/glslang.y" + case 672: /* spirv_decorate_parameter_list: spirv_decorate_parameter */ +#line 4335 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); } -#line 12009 "MachineIndependent/glslang_tab.cpp" +#line 12223 "MachineIndependent/glslang_tab.cpp" break; - case 662: /* spirv_decorate_parameter_list: spirv_decorate_parameter_list COMMA spirv_decorate_parameter */ -#line 4291 "MachineIndependent/glslang.y" + case 673: /* spirv_decorate_parameter_list: spirv_decorate_parameter_list COMMA spirv_decorate_parameter */ +#line 4338 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode)); } -#line 12017 "MachineIndependent/glslang_tab.cpp" +#line 12231 "MachineIndependent/glslang_tab.cpp" break; - case 663: /* spirv_decorate_parameter: FLOATCONSTANT */ -#line 4296 "MachineIndependent/glslang.y" + case 674: /* spirv_decorate_parameter: FLOATCONSTANT */ +#line 4343 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 12025 "MachineIndependent/glslang_tab.cpp" +#line 12239 "MachineIndependent/glslang_tab.cpp" break; - case 664: /* spirv_decorate_parameter: INTCONSTANT */ -#line 4299 "MachineIndependent/glslang.y" + case 675: /* spirv_decorate_parameter: INTCONSTANT */ +#line 4346 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 12033 "MachineIndependent/glslang_tab.cpp" +#line 12247 "MachineIndependent/glslang_tab.cpp" break; - case 665: /* spirv_decorate_parameter: UINTCONSTANT */ -#line 4302 "MachineIndependent/glslang.y" + case 676: /* spirv_decorate_parameter: UINTCONSTANT */ +#line 4349 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 12041 "MachineIndependent/glslang_tab.cpp" +#line 12255 "MachineIndependent/glslang_tab.cpp" break; - case 666: /* spirv_decorate_parameter: BOOLCONSTANT */ -#line 4305 "MachineIndependent/glslang.y" + case 677: /* spirv_decorate_parameter: BOOLCONSTANT */ +#line 4352 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 12049 "MachineIndependent/glslang_tab.cpp" +#line 12263 "MachineIndependent/glslang_tab.cpp" break; - case 667: /* spirv_decorate_id_parameter_list: constant_expression */ -#line 4310 "MachineIndependent/glslang.y" + case 678: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter */ +#line 4357 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); + } +#line 12271 "MachineIndependent/glslang_tab.cpp" + break; + + case 679: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter_list COMMA spirv_decorate_id_parameter */ +#line 4360 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode)); + } +#line 12279 "MachineIndependent/glslang_tab.cpp" + break; + + case 680: /* spirv_decorate_id_parameter: variable_identifier */ +#line 4365 "MachineIndependent/glslang.y" { - if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtUint && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtBool) - parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); - (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermTypedNode)); + if ((yyvsp[0].interm.intermTypedNode)->getAsConstantUnion() || (yyvsp[0].interm.intermTypedNode)->getAsSymbolNode()) + (yyval.interm.intermNode) = (yyvsp[0].interm.intermTypedNode); + else + parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "only allow constants or variables which are not elements of a composite", "", ""); } -#line 12062 "MachineIndependent/glslang_tab.cpp" +#line 12290 "MachineIndependent/glslang_tab.cpp" break; - case 668: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter_list COMMA constant_expression */ -#line 4318 "MachineIndependent/glslang.y" - { - if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtUint && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtBool) - parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); - (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermTypedNode)); + case 681: /* spirv_decorate_id_parameter: FLOATCONSTANT */ +#line 4371 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 12075 "MachineIndependent/glslang_tab.cpp" +#line 12298 "MachineIndependent/glslang_tab.cpp" break; - case 669: /* spirv_decorate_string_parameter_list: STRING_LITERAL */ -#line 4328 "MachineIndependent/glslang.y" + case 682: /* spirv_decorate_id_parameter: INTCONSTANT */ +#line 4374 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); + } +#line 12306 "MachineIndependent/glslang_tab.cpp" + break; + + case 683: /* spirv_decorate_id_parameter: UINTCONSTANT */ +#line 4377 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); + } +#line 12314 "MachineIndependent/glslang_tab.cpp" + break; + + case 684: /* spirv_decorate_id_parameter: BOOLCONSTANT */ +#line 4380 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); + } +#line 12322 "MachineIndependent/glslang_tab.cpp" + break; + + case 685: /* spirv_decorate_string_parameter_list: STRING_LITERAL */ +#line 4385 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate( parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 12084 "MachineIndependent/glslang_tab.cpp" +#line 12331 "MachineIndependent/glslang_tab.cpp" break; - case 670: /* spirv_decorate_string_parameter_list: spirv_decorate_string_parameter_list COMMA STRING_LITERAL */ -#line 4332 "MachineIndependent/glslang.y" + case 686: /* spirv_decorate_string_parameter_list: spirv_decorate_string_parameter_list COMMA STRING_LITERAL */ +#line 4389 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 12092 "MachineIndependent/glslang_tab.cpp" +#line 12339 "MachineIndependent/glslang_tab.cpp" break; - case 671: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ -#line 4337 "MachineIndependent/glslang.y" + case 687: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ +#line 4394 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).setSpirvType(*(yyvsp[-3].interm.spirvInst), (yyvsp[-1].interm.spirvTypeParams)); } -#line 12101 "MachineIndependent/glslang_tab.cpp" +#line 12348 "MachineIndependent/glslang_tab.cpp" break; - case 672: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ -#line 4341 "MachineIndependent/glslang.y" + case 688: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ +#line 4398 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).setSpirvType(*(yyvsp[-3].interm.spirvInst), (yyvsp[-1].interm.spirvTypeParams)); } -#line 12111 "MachineIndependent/glslang_tab.cpp" +#line 12358 "MachineIndependent/glslang_tab.cpp" break; - case 673: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4346 "MachineIndependent/glslang.y" + case 689: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4403 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-3].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).setSpirvType(*(yyvsp[-1].interm.spirvInst)); } -#line 12120 "MachineIndependent/glslang_tab.cpp" +#line 12367 "MachineIndependent/glslang_tab.cpp" break; - case 674: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4350 "MachineIndependent/glslang.y" + case 690: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4407 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.type).setSpirvType(*(yyvsp[-1].interm.spirvInst)); } -#line 12130 "MachineIndependent/glslang_tab.cpp" +#line 12377 "MachineIndependent/glslang_tab.cpp" break; - case 675: /* spirv_type_parameter_list: spirv_type_parameter */ -#line 4357 "MachineIndependent/glslang.y" + case 691: /* spirv_type_parameter_list: spirv_type_parameter */ +#line 4414 "MachineIndependent/glslang.y" { (yyval.interm.spirvTypeParams) = (yyvsp[0].interm.spirvTypeParams); } -#line 12138 "MachineIndependent/glslang_tab.cpp" +#line 12385 "MachineIndependent/glslang_tab.cpp" break; - case 676: /* spirv_type_parameter_list: spirv_type_parameter_list COMMA spirv_type_parameter */ -#line 4360 "MachineIndependent/glslang.y" + case 692: /* spirv_type_parameter_list: spirv_type_parameter_list COMMA spirv_type_parameter */ +#line 4417 "MachineIndependent/glslang.y" { (yyval.interm.spirvTypeParams) = parseContext.mergeSpirvTypeParameters((yyvsp[-2].interm.spirvTypeParams), (yyvsp[0].interm.spirvTypeParams)); } -#line 12146 "MachineIndependent/glslang_tab.cpp" +#line 12393 "MachineIndependent/glslang_tab.cpp" break; - case 677: /* spirv_type_parameter: constant_expression */ -#line 4365 "MachineIndependent/glslang.y" + case 693: /* spirv_type_parameter: constant_expression */ +#line 4422 "MachineIndependent/glslang.y" { (yyval.interm.spirvTypeParams) = parseContext.makeSpirvTypeParameters((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode)->getAsConstantUnion()); } -#line 12154 "MachineIndependent/glslang_tab.cpp" +#line 12401 "MachineIndependent/glslang_tab.cpp" break; - case 678: /* spirv_type_parameter: type_specifier */ -#line 4368 "MachineIndependent/glslang.y" - { - (yyval.interm.spirvTypeParams) = parseContext.makeSpirvTypeParameters((yyvsp[0].interm.type)); + case 694: /* spirv_type_parameter: type_specifier_nonarray */ +#line 4425 "MachineIndependent/glslang.y" + { + (yyval.interm.spirvTypeParams) = parseContext.makeSpirvTypeParameters((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); } -#line 12162 "MachineIndependent/glslang_tab.cpp" +#line 12409 "MachineIndependent/glslang_tab.cpp" break; - case 679: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4373 "MachineIndependent/glslang.y" + case 695: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4430 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = (yyvsp[-1].interm.spirvInst); } -#line 12170 "MachineIndependent/glslang_tab.cpp" +#line 12417 "MachineIndependent/glslang_tab.cpp" break; - case 680: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4376 "MachineIndependent/glslang.y" + case 696: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4433 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.spirvInst) = (yyvsp[-1].interm.spirvInst); } -#line 12179 "MachineIndependent/glslang_tab.cpp" +#line 12426 "MachineIndependent/glslang_tab.cpp" break; - case 681: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_id */ -#line 4382 "MachineIndependent/glslang.y" + case 697: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_id */ +#line 4439 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = (yyvsp[0].interm.spirvInst); } -#line 12187 "MachineIndependent/glslang_tab.cpp" +#line 12434 "MachineIndependent/glslang_tab.cpp" break; - case 682: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_list COMMA spirv_instruction_qualifier_id */ -#line 4385 "MachineIndependent/glslang.y" + case 698: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_list COMMA spirv_instruction_qualifier_id */ +#line 4442 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = parseContext.mergeSpirvInstruction((yyvsp[-1].lex).loc, (yyvsp[-2].interm.spirvInst), (yyvsp[0].interm.spirvInst)); } -#line 12195 "MachineIndependent/glslang_tab.cpp" +#line 12442 "MachineIndependent/glslang_tab.cpp" break; - case 683: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL STRING_LITERAL */ -#line 4390 "MachineIndependent/glslang.y" + case 699: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL STRING_LITERAL */ +#line 4447 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = parseContext.makeSpirvInstruction((yyvsp[-1].lex).loc, *(yyvsp[-2].lex).string, *(yyvsp[0].lex).string); } -#line 12203 "MachineIndependent/glslang_tab.cpp" +#line 12450 "MachineIndependent/glslang_tab.cpp" break; - case 684: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL INTCONSTANT */ -#line 4393 "MachineIndependent/glslang.y" + case 700: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL INTCONSTANT */ +#line 4450 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = parseContext.makeSpirvInstruction((yyvsp[-1].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[0].lex).i); } -#line 12211 "MachineIndependent/glslang_tab.cpp" +#line 12458 "MachineIndependent/glslang_tab.cpp" break; -#line 12215 "MachineIndependent/glslang_tab.cpp" +#line 12462 "MachineIndependent/glslang_tab.cpp" default: break; } @@ -12287,7 +12534,7 @@ yyerrlab: } yyerror (pParseContext, yymsgp); if (yysyntax_error_status == YYENOMEM) - goto yyexhaustedlab; + YYNOMEM; } } @@ -12323,6 +12570,7 @@ yyerrorlab: label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; + ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ @@ -12383,7 +12631,7 @@ yyerrlab1: `-------------------------------------*/ yyacceptlab: yyresult = 0; - goto yyreturn; + goto yyreturnlab; /*-----------------------------------. @@ -12391,24 +12639,22 @@ yyacceptlab: `-----------------------------------*/ yyabortlab: yyresult = 1; - goto yyreturn; + goto yyreturnlab; -#if 1 -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ yyexhaustedlab: yyerror (pParseContext, YY_("memory exhausted")); yyresult = 2; - goto yyreturn; -#endif + goto yyreturnlab; -/*-------------------------------------------------------. -| yyreturn -- parsing is finished, clean up and return. | -`-------------------------------------------------------*/ -yyreturn: +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at @@ -12436,5 +12682,5 @@ yyreturn: return yyresult; } -#line 4398 "MachineIndependent/glslang.y" +#line 4454 "MachineIndependent/glslang.y" diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp.h index 596a10e6d..d6484924d 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/glslang_tab.cpp.h @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.7.4. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -217,295 +217,305 @@ extern int yydebug; FCOOPMATNV = 418, /* FCOOPMATNV */ ICOOPMATNV = 419, /* ICOOPMATNV */ UCOOPMATNV = 420, /* UCOOPMATNV */ - SAMPLERCUBEARRAY = 421, /* SAMPLERCUBEARRAY */ - SAMPLERCUBEARRAYSHADOW = 422, /* SAMPLERCUBEARRAYSHADOW */ - ISAMPLERCUBEARRAY = 423, /* ISAMPLERCUBEARRAY */ - USAMPLERCUBEARRAY = 424, /* USAMPLERCUBEARRAY */ - SAMPLER1D = 425, /* SAMPLER1D */ - SAMPLER1DARRAY = 426, /* SAMPLER1DARRAY */ - SAMPLER1DARRAYSHADOW = 427, /* SAMPLER1DARRAYSHADOW */ - ISAMPLER1D = 428, /* ISAMPLER1D */ - SAMPLER1DSHADOW = 429, /* SAMPLER1DSHADOW */ - SAMPLER2DRECT = 430, /* SAMPLER2DRECT */ - SAMPLER2DRECTSHADOW = 431, /* SAMPLER2DRECTSHADOW */ - ISAMPLER2DRECT = 432, /* ISAMPLER2DRECT */ - USAMPLER2DRECT = 433, /* USAMPLER2DRECT */ - SAMPLERBUFFER = 434, /* SAMPLERBUFFER */ - ISAMPLERBUFFER = 435, /* ISAMPLERBUFFER */ - USAMPLERBUFFER = 436, /* USAMPLERBUFFER */ - SAMPLER2DMS = 437, /* SAMPLER2DMS */ - ISAMPLER2DMS = 438, /* ISAMPLER2DMS */ - USAMPLER2DMS = 439, /* USAMPLER2DMS */ - SAMPLER2DMSARRAY = 440, /* SAMPLER2DMSARRAY */ - ISAMPLER2DMSARRAY = 441, /* ISAMPLER2DMSARRAY */ - USAMPLER2DMSARRAY = 442, /* USAMPLER2DMSARRAY */ - SAMPLEREXTERNALOES = 443, /* SAMPLEREXTERNALOES */ - SAMPLEREXTERNAL2DY2YEXT = 444, /* SAMPLEREXTERNAL2DY2YEXT */ - ISAMPLER1DARRAY = 445, /* ISAMPLER1DARRAY */ - USAMPLER1D = 446, /* USAMPLER1D */ - USAMPLER1DARRAY = 447, /* USAMPLER1DARRAY */ - F16SAMPLER1D = 448, /* F16SAMPLER1D */ - F16SAMPLER2D = 449, /* F16SAMPLER2D */ - F16SAMPLER3D = 450, /* F16SAMPLER3D */ - F16SAMPLER2DRECT = 451, /* F16SAMPLER2DRECT */ - F16SAMPLERCUBE = 452, /* F16SAMPLERCUBE */ - F16SAMPLER1DARRAY = 453, /* F16SAMPLER1DARRAY */ - F16SAMPLER2DARRAY = 454, /* F16SAMPLER2DARRAY */ - F16SAMPLERCUBEARRAY = 455, /* F16SAMPLERCUBEARRAY */ - F16SAMPLERBUFFER = 456, /* F16SAMPLERBUFFER */ - F16SAMPLER2DMS = 457, /* F16SAMPLER2DMS */ - F16SAMPLER2DMSARRAY = 458, /* F16SAMPLER2DMSARRAY */ - F16SAMPLER1DSHADOW = 459, /* F16SAMPLER1DSHADOW */ - F16SAMPLER2DSHADOW = 460, /* F16SAMPLER2DSHADOW */ - F16SAMPLER1DARRAYSHADOW = 461, /* F16SAMPLER1DARRAYSHADOW */ - F16SAMPLER2DARRAYSHADOW = 462, /* F16SAMPLER2DARRAYSHADOW */ - F16SAMPLER2DRECTSHADOW = 463, /* F16SAMPLER2DRECTSHADOW */ - F16SAMPLERCUBESHADOW = 464, /* F16SAMPLERCUBESHADOW */ - F16SAMPLERCUBEARRAYSHADOW = 465, /* F16SAMPLERCUBEARRAYSHADOW */ - IMAGE1D = 466, /* IMAGE1D */ - IIMAGE1D = 467, /* IIMAGE1D */ - UIMAGE1D = 468, /* UIMAGE1D */ - IMAGE2D = 469, /* IMAGE2D */ - IIMAGE2D = 470, /* IIMAGE2D */ - UIMAGE2D = 471, /* UIMAGE2D */ - IMAGE3D = 472, /* IMAGE3D */ - IIMAGE3D = 473, /* IIMAGE3D */ - UIMAGE3D = 474, /* UIMAGE3D */ - IMAGE2DRECT = 475, /* IMAGE2DRECT */ - IIMAGE2DRECT = 476, /* IIMAGE2DRECT */ - UIMAGE2DRECT = 477, /* UIMAGE2DRECT */ - IMAGECUBE = 478, /* IMAGECUBE */ - IIMAGECUBE = 479, /* IIMAGECUBE */ - UIMAGECUBE = 480, /* UIMAGECUBE */ - IMAGEBUFFER = 481, /* IMAGEBUFFER */ - IIMAGEBUFFER = 482, /* IIMAGEBUFFER */ - UIMAGEBUFFER = 483, /* UIMAGEBUFFER */ - IMAGE1DARRAY = 484, /* IMAGE1DARRAY */ - IIMAGE1DARRAY = 485, /* IIMAGE1DARRAY */ - UIMAGE1DARRAY = 486, /* UIMAGE1DARRAY */ - IMAGE2DARRAY = 487, /* IMAGE2DARRAY */ - IIMAGE2DARRAY = 488, /* IIMAGE2DARRAY */ - UIMAGE2DARRAY = 489, /* UIMAGE2DARRAY */ - IMAGECUBEARRAY = 490, /* IMAGECUBEARRAY */ - IIMAGECUBEARRAY = 491, /* IIMAGECUBEARRAY */ - UIMAGECUBEARRAY = 492, /* UIMAGECUBEARRAY */ - IMAGE2DMS = 493, /* IMAGE2DMS */ - IIMAGE2DMS = 494, /* IIMAGE2DMS */ - UIMAGE2DMS = 495, /* UIMAGE2DMS */ - IMAGE2DMSARRAY = 496, /* IMAGE2DMSARRAY */ - IIMAGE2DMSARRAY = 497, /* IIMAGE2DMSARRAY */ - UIMAGE2DMSARRAY = 498, /* UIMAGE2DMSARRAY */ - F16IMAGE1D = 499, /* F16IMAGE1D */ - F16IMAGE2D = 500, /* F16IMAGE2D */ - F16IMAGE3D = 501, /* F16IMAGE3D */ - F16IMAGE2DRECT = 502, /* F16IMAGE2DRECT */ - F16IMAGECUBE = 503, /* F16IMAGECUBE */ - F16IMAGE1DARRAY = 504, /* F16IMAGE1DARRAY */ - F16IMAGE2DARRAY = 505, /* F16IMAGE2DARRAY */ - F16IMAGECUBEARRAY = 506, /* F16IMAGECUBEARRAY */ - F16IMAGEBUFFER = 507, /* F16IMAGEBUFFER */ - F16IMAGE2DMS = 508, /* F16IMAGE2DMS */ - F16IMAGE2DMSARRAY = 509, /* F16IMAGE2DMSARRAY */ - I64IMAGE1D = 510, /* I64IMAGE1D */ - U64IMAGE1D = 511, /* U64IMAGE1D */ - I64IMAGE2D = 512, /* I64IMAGE2D */ - U64IMAGE2D = 513, /* U64IMAGE2D */ - I64IMAGE3D = 514, /* I64IMAGE3D */ - U64IMAGE3D = 515, /* U64IMAGE3D */ - I64IMAGE2DRECT = 516, /* I64IMAGE2DRECT */ - U64IMAGE2DRECT = 517, /* U64IMAGE2DRECT */ - I64IMAGECUBE = 518, /* I64IMAGECUBE */ - U64IMAGECUBE = 519, /* U64IMAGECUBE */ - I64IMAGEBUFFER = 520, /* I64IMAGEBUFFER */ - U64IMAGEBUFFER = 521, /* U64IMAGEBUFFER */ - I64IMAGE1DARRAY = 522, /* I64IMAGE1DARRAY */ - U64IMAGE1DARRAY = 523, /* U64IMAGE1DARRAY */ - I64IMAGE2DARRAY = 524, /* I64IMAGE2DARRAY */ - U64IMAGE2DARRAY = 525, /* U64IMAGE2DARRAY */ - I64IMAGECUBEARRAY = 526, /* I64IMAGECUBEARRAY */ - U64IMAGECUBEARRAY = 527, /* U64IMAGECUBEARRAY */ - I64IMAGE2DMS = 528, /* I64IMAGE2DMS */ - U64IMAGE2DMS = 529, /* U64IMAGE2DMS */ - I64IMAGE2DMSARRAY = 530, /* I64IMAGE2DMSARRAY */ - U64IMAGE2DMSARRAY = 531, /* U64IMAGE2DMSARRAY */ - TEXTURECUBEARRAY = 532, /* TEXTURECUBEARRAY */ - ITEXTURECUBEARRAY = 533, /* ITEXTURECUBEARRAY */ - UTEXTURECUBEARRAY = 534, /* UTEXTURECUBEARRAY */ - TEXTURE1D = 535, /* TEXTURE1D */ - ITEXTURE1D = 536, /* ITEXTURE1D */ - UTEXTURE1D = 537, /* UTEXTURE1D */ - TEXTURE1DARRAY = 538, /* TEXTURE1DARRAY */ - ITEXTURE1DARRAY = 539, /* ITEXTURE1DARRAY */ - UTEXTURE1DARRAY = 540, /* UTEXTURE1DARRAY */ - TEXTURE2DRECT = 541, /* TEXTURE2DRECT */ - ITEXTURE2DRECT = 542, /* ITEXTURE2DRECT */ - UTEXTURE2DRECT = 543, /* UTEXTURE2DRECT */ - TEXTUREBUFFER = 544, /* TEXTUREBUFFER */ - ITEXTUREBUFFER = 545, /* ITEXTUREBUFFER */ - UTEXTUREBUFFER = 546, /* UTEXTUREBUFFER */ - TEXTURE2DMS = 547, /* TEXTURE2DMS */ - ITEXTURE2DMS = 548, /* ITEXTURE2DMS */ - UTEXTURE2DMS = 549, /* UTEXTURE2DMS */ - TEXTURE2DMSARRAY = 550, /* TEXTURE2DMSARRAY */ - ITEXTURE2DMSARRAY = 551, /* ITEXTURE2DMSARRAY */ - UTEXTURE2DMSARRAY = 552, /* UTEXTURE2DMSARRAY */ - F16TEXTURE1D = 553, /* F16TEXTURE1D */ - F16TEXTURE2D = 554, /* F16TEXTURE2D */ - F16TEXTURE3D = 555, /* F16TEXTURE3D */ - F16TEXTURE2DRECT = 556, /* F16TEXTURE2DRECT */ - F16TEXTURECUBE = 557, /* F16TEXTURECUBE */ - F16TEXTURE1DARRAY = 558, /* F16TEXTURE1DARRAY */ - F16TEXTURE2DARRAY = 559, /* F16TEXTURE2DARRAY */ - F16TEXTURECUBEARRAY = 560, /* F16TEXTURECUBEARRAY */ - F16TEXTUREBUFFER = 561, /* F16TEXTUREBUFFER */ - F16TEXTURE2DMS = 562, /* F16TEXTURE2DMS */ - F16TEXTURE2DMSARRAY = 563, /* F16TEXTURE2DMSARRAY */ - SUBPASSINPUT = 564, /* SUBPASSINPUT */ - SUBPASSINPUTMS = 565, /* SUBPASSINPUTMS */ - ISUBPASSINPUT = 566, /* ISUBPASSINPUT */ - ISUBPASSINPUTMS = 567, /* ISUBPASSINPUTMS */ - USUBPASSINPUT = 568, /* USUBPASSINPUT */ - USUBPASSINPUTMS = 569, /* USUBPASSINPUTMS */ - F16SUBPASSINPUT = 570, /* F16SUBPASSINPUT */ - F16SUBPASSINPUTMS = 571, /* F16SUBPASSINPUTMS */ - SPIRV_INSTRUCTION = 572, /* SPIRV_INSTRUCTION */ - SPIRV_EXECUTION_MODE = 573, /* SPIRV_EXECUTION_MODE */ - SPIRV_EXECUTION_MODE_ID = 574, /* SPIRV_EXECUTION_MODE_ID */ - SPIRV_DECORATE = 575, /* SPIRV_DECORATE */ - SPIRV_DECORATE_ID = 576, /* SPIRV_DECORATE_ID */ - SPIRV_DECORATE_STRING = 577, /* SPIRV_DECORATE_STRING */ - SPIRV_TYPE = 578, /* SPIRV_TYPE */ - SPIRV_STORAGE_CLASS = 579, /* SPIRV_STORAGE_CLASS */ - SPIRV_BY_REFERENCE = 580, /* SPIRV_BY_REFERENCE */ - SPIRV_LITERAL = 581, /* SPIRV_LITERAL */ - LEFT_OP = 582, /* LEFT_OP */ - RIGHT_OP = 583, /* RIGHT_OP */ - INC_OP = 584, /* INC_OP */ - DEC_OP = 585, /* DEC_OP */ - LE_OP = 586, /* LE_OP */ - GE_OP = 587, /* GE_OP */ - EQ_OP = 588, /* EQ_OP */ - NE_OP = 589, /* NE_OP */ - AND_OP = 590, /* AND_OP */ - OR_OP = 591, /* OR_OP */ - XOR_OP = 592, /* XOR_OP */ - MUL_ASSIGN = 593, /* MUL_ASSIGN */ - DIV_ASSIGN = 594, /* DIV_ASSIGN */ - ADD_ASSIGN = 595, /* ADD_ASSIGN */ - MOD_ASSIGN = 596, /* MOD_ASSIGN */ - LEFT_ASSIGN = 597, /* LEFT_ASSIGN */ - RIGHT_ASSIGN = 598, /* RIGHT_ASSIGN */ - AND_ASSIGN = 599, /* AND_ASSIGN */ - XOR_ASSIGN = 600, /* XOR_ASSIGN */ - OR_ASSIGN = 601, /* OR_ASSIGN */ - SUB_ASSIGN = 602, /* SUB_ASSIGN */ - STRING_LITERAL = 603, /* STRING_LITERAL */ - LEFT_PAREN = 604, /* LEFT_PAREN */ - RIGHT_PAREN = 605, /* RIGHT_PAREN */ - LEFT_BRACKET = 606, /* LEFT_BRACKET */ - RIGHT_BRACKET = 607, /* RIGHT_BRACKET */ - LEFT_BRACE = 608, /* LEFT_BRACE */ - RIGHT_BRACE = 609, /* RIGHT_BRACE */ - DOT = 610, /* DOT */ - COMMA = 611, /* COMMA */ - COLON = 612, /* COLON */ - EQUAL = 613, /* EQUAL */ - SEMICOLON = 614, /* SEMICOLON */ - BANG = 615, /* BANG */ - DASH = 616, /* DASH */ - TILDE = 617, /* TILDE */ - PLUS = 618, /* PLUS */ - STAR = 619, /* STAR */ - SLASH = 620, /* SLASH */ - PERCENT = 621, /* PERCENT */ - LEFT_ANGLE = 622, /* LEFT_ANGLE */ - RIGHT_ANGLE = 623, /* RIGHT_ANGLE */ - VERTICAL_BAR = 624, /* VERTICAL_BAR */ - CARET = 625, /* CARET */ - AMPERSAND = 626, /* AMPERSAND */ - QUESTION = 627, /* QUESTION */ - INVARIANT = 628, /* INVARIANT */ - HIGH_PRECISION = 629, /* HIGH_PRECISION */ - MEDIUM_PRECISION = 630, /* MEDIUM_PRECISION */ - LOW_PRECISION = 631, /* LOW_PRECISION */ - PRECISION = 632, /* PRECISION */ - PACKED = 633, /* PACKED */ - RESOURCE = 634, /* RESOURCE */ - SUPERP = 635, /* SUPERP */ - FLOATCONSTANT = 636, /* FLOATCONSTANT */ - INTCONSTANT = 637, /* INTCONSTANT */ - UINTCONSTANT = 638, /* UINTCONSTANT */ - BOOLCONSTANT = 639, /* BOOLCONSTANT */ - IDENTIFIER = 640, /* IDENTIFIER */ - TYPE_NAME = 641, /* TYPE_NAME */ - CENTROID = 642, /* CENTROID */ - IN = 643, /* IN */ - OUT = 644, /* OUT */ - INOUT = 645, /* INOUT */ - STRUCT = 646, /* STRUCT */ - VOID = 647, /* VOID */ - WHILE = 648, /* WHILE */ - BREAK = 649, /* BREAK */ - CONTINUE = 650, /* CONTINUE */ - DO = 651, /* DO */ - ELSE = 652, /* ELSE */ - FOR = 653, /* FOR */ - IF = 654, /* IF */ - DISCARD = 655, /* DISCARD */ - RETURN = 656, /* RETURN */ - SWITCH = 657, /* SWITCH */ - CASE = 658, /* CASE */ - DEFAULT = 659, /* DEFAULT */ - TERMINATE_INVOCATION = 660, /* TERMINATE_INVOCATION */ - TERMINATE_RAY = 661, /* TERMINATE_RAY */ - IGNORE_INTERSECTION = 662, /* IGNORE_INTERSECTION */ - UNIFORM = 663, /* UNIFORM */ - SHARED = 664, /* SHARED */ - BUFFER = 665, /* BUFFER */ - FLAT = 666, /* FLAT */ - SMOOTH = 667, /* SMOOTH */ - LAYOUT = 668, /* LAYOUT */ - DOUBLECONSTANT = 669, /* DOUBLECONSTANT */ - INT16CONSTANT = 670, /* INT16CONSTANT */ - UINT16CONSTANT = 671, /* UINT16CONSTANT */ - FLOAT16CONSTANT = 672, /* FLOAT16CONSTANT */ - INT32CONSTANT = 673, /* INT32CONSTANT */ - UINT32CONSTANT = 674, /* UINT32CONSTANT */ - INT64CONSTANT = 675, /* INT64CONSTANT */ - UINT64CONSTANT = 676, /* UINT64CONSTANT */ - SUBROUTINE = 677, /* SUBROUTINE */ - DEMOTE = 678, /* DEMOTE */ - PAYLOADNV = 679, /* PAYLOADNV */ - PAYLOADINNV = 680, /* PAYLOADINNV */ - HITATTRNV = 681, /* HITATTRNV */ - CALLDATANV = 682, /* CALLDATANV */ - CALLDATAINNV = 683, /* CALLDATAINNV */ - PAYLOADEXT = 684, /* PAYLOADEXT */ - PAYLOADINEXT = 685, /* PAYLOADINEXT */ - HITATTREXT = 686, /* HITATTREXT */ - CALLDATAEXT = 687, /* CALLDATAEXT */ - CALLDATAINEXT = 688, /* CALLDATAINEXT */ - PATCH = 689, /* PATCH */ - SAMPLE = 690, /* SAMPLE */ - NONUNIFORM = 691, /* NONUNIFORM */ - COHERENT = 692, /* COHERENT */ - VOLATILE = 693, /* VOLATILE */ - RESTRICT = 694, /* RESTRICT */ - READONLY = 695, /* READONLY */ - WRITEONLY = 696, /* WRITEONLY */ - DEVICECOHERENT = 697, /* DEVICECOHERENT */ - QUEUEFAMILYCOHERENT = 698, /* QUEUEFAMILYCOHERENT */ - WORKGROUPCOHERENT = 699, /* WORKGROUPCOHERENT */ - SUBGROUPCOHERENT = 700, /* SUBGROUPCOHERENT */ - NONPRIVATE = 701, /* NONPRIVATE */ - SHADERCALLCOHERENT = 702, /* SHADERCALLCOHERENT */ - NOPERSPECTIVE = 703, /* NOPERSPECTIVE */ - EXPLICITINTERPAMD = 704, /* EXPLICITINTERPAMD */ - PERVERTEXNV = 705, /* PERVERTEXNV */ - PERPRIMITIVENV = 706, /* PERPRIMITIVENV */ - PERVIEWNV = 707, /* PERVIEWNV */ - PERTASKNV = 708, /* PERTASKNV */ - PRECISE = 709 /* PRECISE */ + COOPMAT = 421, /* COOPMAT */ + HITOBJECTNV = 422, /* HITOBJECTNV */ + HITOBJECTATTRNV = 423, /* HITOBJECTATTRNV */ + SAMPLERCUBEARRAY = 424, /* SAMPLERCUBEARRAY */ + SAMPLERCUBEARRAYSHADOW = 425, /* SAMPLERCUBEARRAYSHADOW */ + ISAMPLERCUBEARRAY = 426, /* ISAMPLERCUBEARRAY */ + USAMPLERCUBEARRAY = 427, /* USAMPLERCUBEARRAY */ + SAMPLER1D = 428, /* SAMPLER1D */ + SAMPLER1DARRAY = 429, /* SAMPLER1DARRAY */ + SAMPLER1DARRAYSHADOW = 430, /* SAMPLER1DARRAYSHADOW */ + ISAMPLER1D = 431, /* ISAMPLER1D */ + SAMPLER1DSHADOW = 432, /* SAMPLER1DSHADOW */ + SAMPLER2DRECT = 433, /* SAMPLER2DRECT */ + SAMPLER2DRECTSHADOW = 434, /* SAMPLER2DRECTSHADOW */ + ISAMPLER2DRECT = 435, /* ISAMPLER2DRECT */ + USAMPLER2DRECT = 436, /* USAMPLER2DRECT */ + SAMPLERBUFFER = 437, /* SAMPLERBUFFER */ + ISAMPLERBUFFER = 438, /* ISAMPLERBUFFER */ + USAMPLERBUFFER = 439, /* USAMPLERBUFFER */ + SAMPLER2DMS = 440, /* SAMPLER2DMS */ + ISAMPLER2DMS = 441, /* ISAMPLER2DMS */ + USAMPLER2DMS = 442, /* USAMPLER2DMS */ + SAMPLER2DMSARRAY = 443, /* SAMPLER2DMSARRAY */ + ISAMPLER2DMSARRAY = 444, /* ISAMPLER2DMSARRAY */ + USAMPLER2DMSARRAY = 445, /* USAMPLER2DMSARRAY */ + SAMPLEREXTERNALOES = 446, /* SAMPLEREXTERNALOES */ + SAMPLEREXTERNAL2DY2YEXT = 447, /* SAMPLEREXTERNAL2DY2YEXT */ + ISAMPLER1DARRAY = 448, /* ISAMPLER1DARRAY */ + USAMPLER1D = 449, /* USAMPLER1D */ + USAMPLER1DARRAY = 450, /* USAMPLER1DARRAY */ + F16SAMPLER1D = 451, /* F16SAMPLER1D */ + F16SAMPLER2D = 452, /* F16SAMPLER2D */ + F16SAMPLER3D = 453, /* F16SAMPLER3D */ + F16SAMPLER2DRECT = 454, /* F16SAMPLER2DRECT */ + F16SAMPLERCUBE = 455, /* F16SAMPLERCUBE */ + F16SAMPLER1DARRAY = 456, /* F16SAMPLER1DARRAY */ + F16SAMPLER2DARRAY = 457, /* F16SAMPLER2DARRAY */ + F16SAMPLERCUBEARRAY = 458, /* F16SAMPLERCUBEARRAY */ + F16SAMPLERBUFFER = 459, /* F16SAMPLERBUFFER */ + F16SAMPLER2DMS = 460, /* F16SAMPLER2DMS */ + F16SAMPLER2DMSARRAY = 461, /* F16SAMPLER2DMSARRAY */ + F16SAMPLER1DSHADOW = 462, /* F16SAMPLER1DSHADOW */ + F16SAMPLER2DSHADOW = 463, /* F16SAMPLER2DSHADOW */ + F16SAMPLER1DARRAYSHADOW = 464, /* F16SAMPLER1DARRAYSHADOW */ + F16SAMPLER2DARRAYSHADOW = 465, /* F16SAMPLER2DARRAYSHADOW */ + F16SAMPLER2DRECTSHADOW = 466, /* F16SAMPLER2DRECTSHADOW */ + F16SAMPLERCUBESHADOW = 467, /* F16SAMPLERCUBESHADOW */ + F16SAMPLERCUBEARRAYSHADOW = 468, /* F16SAMPLERCUBEARRAYSHADOW */ + IMAGE1D = 469, /* IMAGE1D */ + IIMAGE1D = 470, /* IIMAGE1D */ + UIMAGE1D = 471, /* UIMAGE1D */ + IMAGE2D = 472, /* IMAGE2D */ + IIMAGE2D = 473, /* IIMAGE2D */ + UIMAGE2D = 474, /* UIMAGE2D */ + IMAGE3D = 475, /* IMAGE3D */ + IIMAGE3D = 476, /* IIMAGE3D */ + UIMAGE3D = 477, /* UIMAGE3D */ + IMAGE2DRECT = 478, /* IMAGE2DRECT */ + IIMAGE2DRECT = 479, /* IIMAGE2DRECT */ + UIMAGE2DRECT = 480, /* UIMAGE2DRECT */ + IMAGECUBE = 481, /* IMAGECUBE */ + IIMAGECUBE = 482, /* IIMAGECUBE */ + UIMAGECUBE = 483, /* UIMAGECUBE */ + IMAGEBUFFER = 484, /* IMAGEBUFFER */ + IIMAGEBUFFER = 485, /* IIMAGEBUFFER */ + UIMAGEBUFFER = 486, /* UIMAGEBUFFER */ + IMAGE1DARRAY = 487, /* IMAGE1DARRAY */ + IIMAGE1DARRAY = 488, /* IIMAGE1DARRAY */ + UIMAGE1DARRAY = 489, /* UIMAGE1DARRAY */ + IMAGE2DARRAY = 490, /* IMAGE2DARRAY */ + IIMAGE2DARRAY = 491, /* IIMAGE2DARRAY */ + UIMAGE2DARRAY = 492, /* UIMAGE2DARRAY */ + IMAGECUBEARRAY = 493, /* IMAGECUBEARRAY */ + IIMAGECUBEARRAY = 494, /* IIMAGECUBEARRAY */ + UIMAGECUBEARRAY = 495, /* UIMAGECUBEARRAY */ + IMAGE2DMS = 496, /* IMAGE2DMS */ + IIMAGE2DMS = 497, /* IIMAGE2DMS */ + UIMAGE2DMS = 498, /* UIMAGE2DMS */ + IMAGE2DMSARRAY = 499, /* IMAGE2DMSARRAY */ + IIMAGE2DMSARRAY = 500, /* IIMAGE2DMSARRAY */ + UIMAGE2DMSARRAY = 501, /* UIMAGE2DMSARRAY */ + F16IMAGE1D = 502, /* F16IMAGE1D */ + F16IMAGE2D = 503, /* F16IMAGE2D */ + F16IMAGE3D = 504, /* F16IMAGE3D */ + F16IMAGE2DRECT = 505, /* F16IMAGE2DRECT */ + F16IMAGECUBE = 506, /* F16IMAGECUBE */ + F16IMAGE1DARRAY = 507, /* F16IMAGE1DARRAY */ + F16IMAGE2DARRAY = 508, /* F16IMAGE2DARRAY */ + F16IMAGECUBEARRAY = 509, /* F16IMAGECUBEARRAY */ + F16IMAGEBUFFER = 510, /* F16IMAGEBUFFER */ + F16IMAGE2DMS = 511, /* F16IMAGE2DMS */ + F16IMAGE2DMSARRAY = 512, /* F16IMAGE2DMSARRAY */ + I64IMAGE1D = 513, /* I64IMAGE1D */ + U64IMAGE1D = 514, /* U64IMAGE1D */ + I64IMAGE2D = 515, /* I64IMAGE2D */ + U64IMAGE2D = 516, /* U64IMAGE2D */ + I64IMAGE3D = 517, /* I64IMAGE3D */ + U64IMAGE3D = 518, /* U64IMAGE3D */ + I64IMAGE2DRECT = 519, /* I64IMAGE2DRECT */ + U64IMAGE2DRECT = 520, /* U64IMAGE2DRECT */ + I64IMAGECUBE = 521, /* I64IMAGECUBE */ + U64IMAGECUBE = 522, /* U64IMAGECUBE */ + I64IMAGEBUFFER = 523, /* I64IMAGEBUFFER */ + U64IMAGEBUFFER = 524, /* U64IMAGEBUFFER */ + I64IMAGE1DARRAY = 525, /* I64IMAGE1DARRAY */ + U64IMAGE1DARRAY = 526, /* U64IMAGE1DARRAY */ + I64IMAGE2DARRAY = 527, /* I64IMAGE2DARRAY */ + U64IMAGE2DARRAY = 528, /* U64IMAGE2DARRAY */ + I64IMAGECUBEARRAY = 529, /* I64IMAGECUBEARRAY */ + U64IMAGECUBEARRAY = 530, /* U64IMAGECUBEARRAY */ + I64IMAGE2DMS = 531, /* I64IMAGE2DMS */ + U64IMAGE2DMS = 532, /* U64IMAGE2DMS */ + I64IMAGE2DMSARRAY = 533, /* I64IMAGE2DMSARRAY */ + U64IMAGE2DMSARRAY = 534, /* U64IMAGE2DMSARRAY */ + TEXTURECUBEARRAY = 535, /* TEXTURECUBEARRAY */ + ITEXTURECUBEARRAY = 536, /* ITEXTURECUBEARRAY */ + UTEXTURECUBEARRAY = 537, /* UTEXTURECUBEARRAY */ + TEXTURE1D = 538, /* TEXTURE1D */ + ITEXTURE1D = 539, /* ITEXTURE1D */ + UTEXTURE1D = 540, /* UTEXTURE1D */ + TEXTURE1DARRAY = 541, /* TEXTURE1DARRAY */ + ITEXTURE1DARRAY = 542, /* ITEXTURE1DARRAY */ + UTEXTURE1DARRAY = 543, /* UTEXTURE1DARRAY */ + TEXTURE2DRECT = 544, /* TEXTURE2DRECT */ + ITEXTURE2DRECT = 545, /* ITEXTURE2DRECT */ + UTEXTURE2DRECT = 546, /* UTEXTURE2DRECT */ + TEXTUREBUFFER = 547, /* TEXTUREBUFFER */ + ITEXTUREBUFFER = 548, /* ITEXTUREBUFFER */ + UTEXTUREBUFFER = 549, /* UTEXTUREBUFFER */ + TEXTURE2DMS = 550, /* TEXTURE2DMS */ + ITEXTURE2DMS = 551, /* ITEXTURE2DMS */ + UTEXTURE2DMS = 552, /* UTEXTURE2DMS */ + TEXTURE2DMSARRAY = 553, /* TEXTURE2DMSARRAY */ + ITEXTURE2DMSARRAY = 554, /* ITEXTURE2DMSARRAY */ + UTEXTURE2DMSARRAY = 555, /* UTEXTURE2DMSARRAY */ + F16TEXTURE1D = 556, /* F16TEXTURE1D */ + F16TEXTURE2D = 557, /* F16TEXTURE2D */ + F16TEXTURE3D = 558, /* F16TEXTURE3D */ + F16TEXTURE2DRECT = 559, /* F16TEXTURE2DRECT */ + F16TEXTURECUBE = 560, /* F16TEXTURECUBE */ + F16TEXTURE1DARRAY = 561, /* F16TEXTURE1DARRAY */ + F16TEXTURE2DARRAY = 562, /* F16TEXTURE2DARRAY */ + F16TEXTURECUBEARRAY = 563, /* F16TEXTURECUBEARRAY */ + F16TEXTUREBUFFER = 564, /* F16TEXTUREBUFFER */ + F16TEXTURE2DMS = 565, /* F16TEXTURE2DMS */ + F16TEXTURE2DMSARRAY = 566, /* F16TEXTURE2DMSARRAY */ + SUBPASSINPUT = 567, /* SUBPASSINPUT */ + SUBPASSINPUTMS = 568, /* SUBPASSINPUTMS */ + ISUBPASSINPUT = 569, /* ISUBPASSINPUT */ + ISUBPASSINPUTMS = 570, /* ISUBPASSINPUTMS */ + USUBPASSINPUT = 571, /* USUBPASSINPUT */ + USUBPASSINPUTMS = 572, /* USUBPASSINPUTMS */ + F16SUBPASSINPUT = 573, /* F16SUBPASSINPUT */ + F16SUBPASSINPUTMS = 574, /* F16SUBPASSINPUTMS */ + SPIRV_INSTRUCTION = 575, /* SPIRV_INSTRUCTION */ + SPIRV_EXECUTION_MODE = 576, /* SPIRV_EXECUTION_MODE */ + SPIRV_EXECUTION_MODE_ID = 577, /* SPIRV_EXECUTION_MODE_ID */ + SPIRV_DECORATE = 578, /* SPIRV_DECORATE */ + SPIRV_DECORATE_ID = 579, /* SPIRV_DECORATE_ID */ + SPIRV_DECORATE_STRING = 580, /* SPIRV_DECORATE_STRING */ + SPIRV_TYPE = 581, /* SPIRV_TYPE */ + SPIRV_STORAGE_CLASS = 582, /* SPIRV_STORAGE_CLASS */ + SPIRV_BY_REFERENCE = 583, /* SPIRV_BY_REFERENCE */ + SPIRV_LITERAL = 584, /* SPIRV_LITERAL */ + ATTACHMENTEXT = 585, /* ATTACHMENTEXT */ + IATTACHMENTEXT = 586, /* IATTACHMENTEXT */ + UATTACHMENTEXT = 587, /* UATTACHMENTEXT */ + LEFT_OP = 588, /* LEFT_OP */ + RIGHT_OP = 589, /* RIGHT_OP */ + INC_OP = 590, /* INC_OP */ + DEC_OP = 591, /* DEC_OP */ + LE_OP = 592, /* LE_OP */ + GE_OP = 593, /* GE_OP */ + EQ_OP = 594, /* EQ_OP */ + NE_OP = 595, /* NE_OP */ + AND_OP = 596, /* AND_OP */ + OR_OP = 597, /* OR_OP */ + XOR_OP = 598, /* XOR_OP */ + MUL_ASSIGN = 599, /* MUL_ASSIGN */ + DIV_ASSIGN = 600, /* DIV_ASSIGN */ + ADD_ASSIGN = 601, /* ADD_ASSIGN */ + MOD_ASSIGN = 602, /* MOD_ASSIGN */ + LEFT_ASSIGN = 603, /* LEFT_ASSIGN */ + RIGHT_ASSIGN = 604, /* RIGHT_ASSIGN */ + AND_ASSIGN = 605, /* AND_ASSIGN */ + XOR_ASSIGN = 606, /* XOR_ASSIGN */ + OR_ASSIGN = 607, /* OR_ASSIGN */ + SUB_ASSIGN = 608, /* SUB_ASSIGN */ + STRING_LITERAL = 609, /* STRING_LITERAL */ + LEFT_PAREN = 610, /* LEFT_PAREN */ + RIGHT_PAREN = 611, /* RIGHT_PAREN */ + LEFT_BRACKET = 612, /* LEFT_BRACKET */ + RIGHT_BRACKET = 613, /* RIGHT_BRACKET */ + LEFT_BRACE = 614, /* LEFT_BRACE */ + RIGHT_BRACE = 615, /* RIGHT_BRACE */ + DOT = 616, /* DOT */ + COMMA = 617, /* COMMA */ + COLON = 618, /* COLON */ + EQUAL = 619, /* EQUAL */ + SEMICOLON = 620, /* SEMICOLON */ + BANG = 621, /* BANG */ + DASH = 622, /* DASH */ + TILDE = 623, /* TILDE */ + PLUS = 624, /* PLUS */ + STAR = 625, /* STAR */ + SLASH = 626, /* SLASH */ + PERCENT = 627, /* PERCENT */ + LEFT_ANGLE = 628, /* LEFT_ANGLE */ + RIGHT_ANGLE = 629, /* RIGHT_ANGLE */ + VERTICAL_BAR = 630, /* VERTICAL_BAR */ + CARET = 631, /* CARET */ + AMPERSAND = 632, /* AMPERSAND */ + QUESTION = 633, /* QUESTION */ + INVARIANT = 634, /* INVARIANT */ + HIGH_PRECISION = 635, /* HIGH_PRECISION */ + MEDIUM_PRECISION = 636, /* MEDIUM_PRECISION */ + LOW_PRECISION = 637, /* LOW_PRECISION */ + PRECISION = 638, /* PRECISION */ + PACKED = 639, /* PACKED */ + RESOURCE = 640, /* RESOURCE */ + SUPERP = 641, /* SUPERP */ + FLOATCONSTANT = 642, /* FLOATCONSTANT */ + INTCONSTANT = 643, /* INTCONSTANT */ + UINTCONSTANT = 644, /* UINTCONSTANT */ + BOOLCONSTANT = 645, /* BOOLCONSTANT */ + IDENTIFIER = 646, /* IDENTIFIER */ + TYPE_NAME = 647, /* TYPE_NAME */ + CENTROID = 648, /* CENTROID */ + IN = 649, /* IN */ + OUT = 650, /* OUT */ + INOUT = 651, /* INOUT */ + STRUCT = 652, /* STRUCT */ + VOID = 653, /* VOID */ + WHILE = 654, /* WHILE */ + BREAK = 655, /* BREAK */ + CONTINUE = 656, /* CONTINUE */ + DO = 657, /* DO */ + ELSE = 658, /* ELSE */ + FOR = 659, /* FOR */ + IF = 660, /* IF */ + DISCARD = 661, /* DISCARD */ + RETURN = 662, /* RETURN */ + SWITCH = 663, /* SWITCH */ + CASE = 664, /* CASE */ + DEFAULT = 665, /* DEFAULT */ + TERMINATE_INVOCATION = 666, /* TERMINATE_INVOCATION */ + TERMINATE_RAY = 667, /* TERMINATE_RAY */ + IGNORE_INTERSECTION = 668, /* IGNORE_INTERSECTION */ + UNIFORM = 669, /* UNIFORM */ + SHARED = 670, /* SHARED */ + BUFFER = 671, /* BUFFER */ + TILEIMAGEEXT = 672, /* TILEIMAGEEXT */ + FLAT = 673, /* FLAT */ + SMOOTH = 674, /* SMOOTH */ + LAYOUT = 675, /* LAYOUT */ + DOUBLECONSTANT = 676, /* DOUBLECONSTANT */ + INT16CONSTANT = 677, /* INT16CONSTANT */ + UINT16CONSTANT = 678, /* UINT16CONSTANT */ + FLOAT16CONSTANT = 679, /* FLOAT16CONSTANT */ + INT32CONSTANT = 680, /* INT32CONSTANT */ + UINT32CONSTANT = 681, /* UINT32CONSTANT */ + INT64CONSTANT = 682, /* INT64CONSTANT */ + UINT64CONSTANT = 683, /* UINT64CONSTANT */ + SUBROUTINE = 684, /* SUBROUTINE */ + DEMOTE = 685, /* DEMOTE */ + PAYLOADNV = 686, /* PAYLOADNV */ + PAYLOADINNV = 687, /* PAYLOADINNV */ + HITATTRNV = 688, /* HITATTRNV */ + CALLDATANV = 689, /* CALLDATANV */ + CALLDATAINNV = 690, /* CALLDATAINNV */ + PAYLOADEXT = 691, /* PAYLOADEXT */ + PAYLOADINEXT = 692, /* PAYLOADINEXT */ + HITATTREXT = 693, /* HITATTREXT */ + CALLDATAEXT = 694, /* CALLDATAEXT */ + CALLDATAINEXT = 695, /* CALLDATAINEXT */ + PATCH = 696, /* PATCH */ + SAMPLE = 697, /* SAMPLE */ + NONUNIFORM = 698, /* NONUNIFORM */ + COHERENT = 699, /* COHERENT */ + VOLATILE = 700, /* VOLATILE */ + RESTRICT = 701, /* RESTRICT */ + READONLY = 702, /* READONLY */ + WRITEONLY = 703, /* WRITEONLY */ + DEVICECOHERENT = 704, /* DEVICECOHERENT */ + QUEUEFAMILYCOHERENT = 705, /* QUEUEFAMILYCOHERENT */ + WORKGROUPCOHERENT = 706, /* WORKGROUPCOHERENT */ + SUBGROUPCOHERENT = 707, /* SUBGROUPCOHERENT */ + NONPRIVATE = 708, /* NONPRIVATE */ + SHADERCALLCOHERENT = 709, /* SHADERCALLCOHERENT */ + NOPERSPECTIVE = 710, /* NOPERSPECTIVE */ + EXPLICITINTERPAMD = 711, /* EXPLICITINTERPAMD */ + PERVERTEXEXT = 712, /* PERVERTEXEXT */ + PERVERTEXNV = 713, /* PERVERTEXNV */ + PERPRIMITIVENV = 714, /* PERPRIMITIVENV */ + PERVIEWNV = 715, /* PERVIEWNV */ + PERTASKNV = 716, /* PERTASKNV */ + PERPRIMITIVEEXT = 717, /* PERPRIMITIVEEXT */ + TASKPAYLOADWORKGROUPEXT = 718, /* TASKPAYLOADWORKGROUPEXT */ + PRECISE = 719 /* PRECISE */ }; typedef enum yytokentype yytoken_kind_t; #endif @@ -514,7 +524,7 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 97 "MachineIndependent/glslang.y" +#line 72 "MachineIndependent/glslang.y" struct { glslang::TSourceLoc loc; @@ -550,10 +560,10 @@ union YYSTYPE glslang::TArraySizes* arraySizes; glslang::TIdentifierList* identifierList; }; - glslang::TArraySizes* typeParameters; + glslang::TTypeParameters* typeParameters; } interm; -#line 557 "MachineIndependent/glslang_tab.cpp.h" +#line 567 "MachineIndependent/glslang_tab.cpp.h" }; typedef union YYSTYPE YYSTYPE; @@ -563,6 +573,8 @@ typedef union YYSTYPE YYSTYPE; + int yyparse (glslang::TParseContext* pParseContext); + #endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED */ diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/intermOut.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/intermOut.cpp index a0fade16c..f0621bd9e 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/intermOut.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/intermOut.cpp @@ -1,7 +1,7 @@ // // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. -// Copyright (C) 2017 ARM Limited. +// Copyright (C) 2017, 2022-2024 Arm Limited. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. // // All rights reserved. @@ -36,8 +36,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #include "localintermediate.h" #include "../Include/InfoSink.h" @@ -48,37 +46,6 @@ #endif #include -namespace { - -bool IsInfinity(double x) { -#ifdef _MSC_VER - switch (_fpclass(x)) { - case _FPCLASS_NINF: - case _FPCLASS_PINF: - return true; - default: - return false; - } -#else - return std::isinf(x); -#endif -} - -bool IsNan(double x) { -#ifdef _MSC_VER - switch (_fpclass(x)) { - case _FPCLASS_SNAN: - case _FPCLASS_QNAN: - return true; - default: - return false; - } -#else - return std::isnan(x); -#endif -} - -} namespace glslang { @@ -598,6 +565,8 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) case EOpSubgroupShuffleXor: out.debug << "subgroupShuffleXor"; break; case EOpSubgroupShuffleUp: out.debug << "subgroupShuffleUp"; break; case EOpSubgroupShuffleDown: out.debug << "subgroupShuffleDown"; break; + case EOpSubgroupRotate: out.debug << "subgroupRotate"; break; + case EOpSubgroupClusteredRotate: out.debug << "subgroupClusteredRotate"; break; case EOpSubgroupAdd: out.debug << "subgroupAdd"; break; case EOpSubgroupMul: out.debug << "subgroupMul"; break; case EOpSubgroupMin: out.debug << "subgroupMin"; break; @@ -630,6 +599,8 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) case EOpSubgroupQuadSwapHorizontal: out.debug << "subgroupQuadSwapHorizontal"; break; case EOpSubgroupQuadSwapVertical: out.debug << "subgroupQuadSwapVertical"; break; case EOpSubgroupQuadSwapDiagonal: out.debug << "subgroupQuadSwapDiagonal"; break; + case EOpSubgroupQuadAll: out.debug << "subgroupQuadAll"; break; + case EOpSubgroupQuadAny: out.debug << "subgroupQuadAny"; break; case EOpSubgroupPartition: out.debug << "subgroupPartitionNV"; break; case EOpSubgroupPartitionedAdd: out.debug << "subgroupPartitionedAddNV"; break; @@ -694,11 +665,13 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) case EOpSubpassLoad: out.debug << "subpassLoad"; break; case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break; + case EOpColorAttachmentReadEXT: out.debug << "colorAttachmentReadEXT"; break; + case EOpConstructReference: out.debug << "Construct reference type"; break; -#ifndef GLSLANG_WEB + case EOpDeclare: out.debug << "Declare"; break; + case EOpSpirvInst: out.debug << "spirv_instruction"; break; -#endif default: out.debug.message(EPrefixError, "Bad unary op"); } @@ -723,6 +696,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node switch (node->getOp()) { case EOpSequence: out.debug << "Sequence\n"; return true; + case EOpScope: out.debug << "Scope\n"; return true; case EOpLinkerObjects: out.debug << "Linker Objects\n"; return true; case EOpComma: out.debug << "Comma"; break; case EOpFunction: out.debug << "Function Definition: " << node->getName(); break; @@ -835,7 +809,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpConstructStruct: out.debug << "Construct structure"; break; case EOpConstructTextureSampler: out.debug << "Construct combined texture-sampler"; break; case EOpConstructReference: out.debug << "Construct reference"; break; - case EOpConstructCooperativeMatrix: out.debug << "Construct cooperative matrix"; break; + case EOpConstructCooperativeMatrixNV: out.debug << "Construct cooperative matrix NV"; break; + case EOpConstructCooperativeMatrixKHR: out.debug << "Construct cooperative matrix KHR"; break; case EOpConstructAccStruct: out.debug << "Construct acceleration structure"; break; case EOpLessThan: out.debug << "Compare Less Than"; break; @@ -1029,6 +1004,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpSubgroupShuffleXor: out.debug << "subgroupShuffleXor"; break; case EOpSubgroupShuffleUp: out.debug << "subgroupShuffleUp"; break; case EOpSubgroupShuffleDown: out.debug << "subgroupShuffleDown"; break; + case EOpSubgroupRotate: out.debug << "subgroupRotate"; break; + case EOpSubgroupClusteredRotate: out.debug << "subgroupClusteredRotate"; break; case EOpSubgroupAdd: out.debug << "subgroupAdd"; break; case EOpSubgroupMul: out.debug << "subgroupMul"; break; case EOpSubgroupMin: out.debug << "subgroupMin"; break; @@ -1061,6 +1038,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpSubgroupQuadSwapHorizontal: out.debug << "subgroupQuadSwapHorizontal"; break; case EOpSubgroupQuadSwapVertical: out.debug << "subgroupQuadSwapVertical"; break; case EOpSubgroupQuadSwapDiagonal: out.debug << "subgroupQuadSwapDiagonal"; break; + case EOpSubgroupQuadAll: out.debug << "subgroupQuadAll"; break; + case EOpSubgroupQuadAny: out.debug << "subgroupQuadAny"; break; case EOpSubgroupPartition: out.debug << "subgroupPartitionNV"; break; case EOpSubgroupPartitionedAdd: out.debug << "subgroupPartitionedAddNV"; break; @@ -1088,6 +1067,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpSubpassLoad: out.debug << "subpassLoad"; break; case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break; + case EOpColorAttachmentReadEXT: out.debug << "colorAttachmentReadEXT"; break; + case EOpTraceNV: out.debug << "traceNV"; break; case EOpTraceRayMotionNV: out.debug << "traceRayMotionNV"; break; case EOpTraceKHR: out.debug << "traceRayKHR"; break; @@ -1099,6 +1080,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpExecuteCallableNV: out.debug << "executeCallableNV"; break; case EOpExecuteCallableKHR: out.debug << "executeCallableKHR"; break; case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break; + case EOpEmitMeshTasksEXT: out.debug << "EmitMeshTasksEXT"; break; + case EOpSetMeshOutputsEXT: out.debug << "SetMeshOutputsEXT"; break; case EOpRayQueryInitialize: out.debug << "rayQueryInitializeEXT"; break; case EOpRayQueryTerminate: out.debug << "rayQueryTerminateEXT"; break; @@ -1123,22 +1106,60 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpRayQueryGetWorldRayOrigin: out.debug << "rayQueryGetWorldRayOriginEXT"; break; case EOpRayQueryGetIntersectionObjectToWorld: out.debug << "rayQueryGetIntersectionObjectToWorldEXT"; break; case EOpRayQueryGetIntersectionWorldToObject: out.debug << "rayQueryGetIntersectionWorldToObjectEXT"; break; + case EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: out.debug << "rayQueryGetIntersectionTriangleVertexPositionsEXT"; break; - case EOpCooperativeMatrixLoad: out.debug << "Load cooperative matrix"; break; - case EOpCooperativeMatrixStore: out.debug << "Store cooperative matrix"; break; - case EOpCooperativeMatrixMulAdd: out.debug << "MulAdd cooperative matrices"; break; + case EOpCooperativeMatrixLoad: out.debug << "Load cooperative matrix KHR"; break; + case EOpCooperativeMatrixStore: out.debug << "Store cooperative matrix KHR"; break; + case EOpCooperativeMatrixMulAdd: out.debug << "MulAdd cooperative matrices KHR"; break; + case EOpCooperativeMatrixLoadNV: out.debug << "Load cooperative matrix NV"; break; + case EOpCooperativeMatrixStoreNV: out.debug << "Store cooperative matrix NV"; break; + case EOpCooperativeMatrixMulAddNV: out.debug << "MulAdd cooperative matrices NV"; break; case EOpIsHelperInvocation: out.debug << "IsHelperInvocation"; break; case EOpDebugPrintf: out.debug << "Debug printf"; break; -#ifndef GLSLANG_WEB + case EOpHitObjectTraceRayNV: out.debug << "HitObjectTraceRayNV"; break; + case EOpHitObjectTraceRayMotionNV: out.debug << "HitObjectTraceRayMotionNV"; break; + case EOpHitObjectRecordHitNV: out.debug << "HitObjectRecordHitNV"; break; + case EOpHitObjectRecordHitMotionNV: out.debug << "HitObjectRecordHitMotionNV"; break; + case EOpHitObjectRecordHitWithIndexNV: out.debug << "HitObjectRecordHitWithIndexNV"; break; + case EOpHitObjectRecordHitWithIndexMotionNV: out.debug << "HitObjectRecordHitWithIndexMotionNV"; break; + case EOpHitObjectRecordMissNV: out.debug << "HitObjectRecordMissNV"; break; + case EOpHitObjectRecordMissMotionNV: out.debug << "HitObjectRecordMissMotionNV"; break; + case EOpHitObjectRecordEmptyNV: out.debug << "HitObjectRecordEmptyNV"; break; + case EOpHitObjectExecuteShaderNV: out.debug << "HitObjectExecuteShaderNV"; break; + case EOpHitObjectIsEmptyNV: out.debug << "HitObjectIsEmptyNV"; break; + case EOpHitObjectIsMissNV: out.debug << "HitObjectIsMissNV"; break; + case EOpHitObjectIsHitNV: out.debug << "HitObjectIsHitNV"; break; + case EOpHitObjectGetRayTMinNV: out.debug << "HitObjectGetRayTMinNV"; break; + case EOpHitObjectGetRayTMaxNV: out.debug << "HitObjectGetRayTMaxNV"; break; + case EOpHitObjectGetObjectRayOriginNV: out.debug << "HitObjectGetObjectRayOriginNV"; break; + case EOpHitObjectGetObjectRayDirectionNV: out.debug << "HitObjectGetObjectRayDirectionNV"; break; + case EOpHitObjectGetWorldRayOriginNV: out.debug << "HitObjectGetWorldRayOriginNV"; break; + case EOpHitObjectGetWorldRayDirectionNV: out.debug << "HitObjectGetWorldRayDirectionNV"; break; + case EOpHitObjectGetObjectToWorldNV: out.debug << "HitObjectGetObjectToWorldNV"; break; + case EOpHitObjectGetWorldToObjectNV: out.debug << "HitObjectGetWorldToObjectNV"; break; + case EOpHitObjectGetInstanceCustomIndexNV: out.debug<< "HitObjectGetInstanceCustomIndexNV"; break; + case EOpHitObjectGetInstanceIdNV: out.debug << "HitObjectGetInstaneIdNV"; break; + case EOpHitObjectGetGeometryIndexNV: out.debug << "HitObjectGetGeometryIndexNV"; break; + case EOpHitObjectGetPrimitiveIndexNV: out.debug << "HitObjectGetPrimitiveIndexNV"; break; + case EOpHitObjectGetHitKindNV: out.debug << "HitObjectGetHitKindNV"; break; + case EOpHitObjectGetAttributesNV: out.debug << "HitObjectGetAttributesNV"; break; + case EOpHitObjectGetCurrentTimeNV: out.debug << "HitObjectGetCurrentTimeNV"; break; + case EOpHitObjectGetShaderBindingTableRecordIndexNV: out.debug << "HitObjectGetShaderBindingTableRecordIndexNV"; break; + case EOpHitObjectGetShaderRecordBufferHandleNV: out.debug << "HitObjectReadShaderRecordBufferHandleNV"; break; + case EOpReorderThreadNV: out.debug << "ReorderThreadNV"; break; + case EOpFetchMicroTriangleVertexPositionNV: out.debug << "MicroTriangleVertexPositionNV"; break; + case EOpFetchMicroTriangleVertexBarycentricNV: out.debug << "MicroTriangleVertexBarycentricNV"; break; + case EOpSpirvInst: out.debug << "spirv_instruction"; break; -#endif + case EOpStencilAttachmentReadEXT: out.debug << "stencilAttachmentReadEXT"; break; + case EOpDepthAttachmentReadEXT: out.debug << "depthAttachmentReadEXT"; break; default: out.debug.message(EPrefixError, "Bad aggregation op"); } - if (node->getOp() != EOpSequence && node->getOp() != EOpParameters) + if (node->getOp() != EOpSequence && node->getOp() != EOpScope && node->getOp() != EOpParameters) out.debug << " (" << node->getCompleteString() << ")"; out.debug << "\n"; @@ -1195,12 +1216,12 @@ bool TOutputTraverser::visitSelection(TVisit /* visit */, TIntermSelection* node // - shows all digits, no premature rounding static void OutputDouble(TInfoSink& out, double value, TOutputTraverser::EExtraOutput extra) { - if (IsInfinity(value)) { + if (std::isinf(value)) { if (value < 0) out.debug << "-1.#INF"; else out.debug << "+1.#INF"; - } else if (IsNan(value)) + } else if (std::isnan(value)) out.debug << "1.#IND"; else { const int maxSize = 340; @@ -1499,6 +1520,9 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) if (getSubgroupUniformControlFlow()) infoSink.debug << "subgroup_uniform_control_flow\n"; + if (getMaximallyReconverges()) + infoSink.debug << "maximally_reconverges\n"; + switch (language) { case EShLangVertex: break; @@ -1538,6 +1562,12 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) infoSink.debug << "using early_fragment_tests\n"; if (postDepthCoverage) infoSink.debug << "using post_depth_coverage\n"; + if (nonCoherentColorAttachmentReadEXT) + infoSink.debug << "using non_coherent_color_attachment_readEXT\n"; + if (nonCoherentDepthAttachmentReadEXT) + infoSink.debug << "using non_coherent_depth_attachment_readEXT\n"; + if (nonCoherentStencilAttachmentReadEXT) + infoSink.debug << "using non_coherent_stencil_attachment_readEXT\n"; if (depthLayout != EldNone) infoSink.debug << "using " << TQualifier::getLayoutDepthString(depthLayout) << "\n"; if (blendEquations != 0) { @@ -1553,12 +1583,12 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) infoSink.debug << "interlock ordering = " << TQualifier::getInterlockOrderingString(interlockOrdering) << "\n"; break; - case EShLangMeshNV: + case EShLangMesh: infoSink.debug << "max_vertices = " << vertices << "\n"; infoSink.debug << "max_primitives = " << primitives << "\n"; infoSink.debug << "output primitive = " << TQualifier::getGeometryString(outputPrimitive) << "\n"; - // Fall through - case EShLangTaskNV: + [[fallthrough]]; + case EShLangTask: // Fall through case EShLangCompute: infoSink.debug << "local_size = (" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] << ")\n"; @@ -1578,7 +1608,7 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) break; } - if (treeRoot == 0 || ! tree) + if (treeRoot == nullptr || ! tree) return; TOutputTraverser it(infoSink); @@ -1588,5 +1618,3 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) } } // end namespace glslang - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.cpp index 7e12864f3..5e94a9e8d 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.cpp @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #include "../Include/Common.h" #include "../Include/InfoSink.h" #include "../Include/Types.h" @@ -79,7 +77,7 @@ public: target = &inputList; else if (base->getQualifier().storage == EvqVaryingOut) target = &outputList; - else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().isPushConstant()) + else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().isPushConstant() && !base->getQualifier().isShaderRecord()) target = &uniformList; // If a global is being visited, then we should also traverse it incase it's evaluation // ends up visiting inputs we want to tag as live @@ -87,7 +85,7 @@ public: addGlobalReference(base->getAccessName()); if (target) { - TVarEntryInfo ent = {base->getId(), base, ! traverseAll}; + TVarEntryInfo ent = {base->getId(), base, ! traverseAll, {}, {}, {}, {}, {}, {}, {}}; ent.stage = intermediate.getStage(); TVarLiveMap::iterator at = target->find( ent.symbol->getAccessName()); // std::lower_bound(target->begin(), target->end(), ent, TVarEntryInfo::TOrderById()); @@ -126,7 +124,7 @@ public: else return; - TVarEntryInfo ent = { base->getId() }; + TVarEntryInfo ent = { base->getId(), {}, {}, {}, {}, {}, {}, {}, {}, {} }; // Fix a defect, when block has no instance name, we need to find its block name TVarLiveMap::const_iterator at = source->find(base->getAccessName()); if (at == source->end()) @@ -145,6 +143,8 @@ public: base->getWritableType().getQualifier().layoutComponent = at->second.newComponent; if (at->second.newIndex != -1) base->getWritableType().getQualifier().layoutIndex = at->second.newIndex; + if (at->second.upgradedToPushConstant) + base->getWritableType().getQualifier().layoutPushConstant = true; } private: @@ -203,11 +203,7 @@ struct TResolverUniformAdaptor { inline void operator()(std::pair& entKey) { TVarEntryInfo& ent = entKey.second; - ent.newLocation = -1; - ent.newComponent = -1; - ent.newBinding = -1; - ent.newSet = -1; - ent.newIndex = -1; + ent.clearNewAssignments(); const bool isValid = resolver.validateBinding(stage, ent); if (isValid) { resolver.resolveSet(ent.stage, ent); @@ -281,11 +277,7 @@ struct TResolverInOutAdaptor { inline void operator()(std::pair& entKey) { TVarEntryInfo& ent = entKey.second; - ent.newLocation = -1; - ent.newComponent = -1; - ent.newBinding = -1; - ent.newSet = -1; - ent.newIndex = -1; + ent.clearNewAssignments(); const bool isValid = resolver.validateInOut(ent.stage, ent); if (isValid) { resolver.resolveInOutLocation(stage, ent); @@ -514,6 +506,24 @@ struct TSymbolValidater return; } else { + // Deal with input/output pairs where one is a block member but the other is loose, + // e.g. with ARB_separate_shader_objects + if (type1.getBasicType() == EbtBlock && + type1.isStruct() && !type2.isStruct()) { + // Iterate through block members tracking layout + glslang::TString name; + type1.getStruct()->begin()->type->appendMangledName(name); + if (name == mangleName2 + && type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return; + } + if (type2.getBasicType() == EbtBlock && + type2.isStruct() && !type1.isStruct()) { + // Iterate through block members tracking layout + glslang::TString name; + type2.getStruct()->begin()->type->appendMangledName(name); + if (name == mangleName1 + && type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return; + } TString err = "Invalid In/Out variable type : " + entKey.first; infoSink.info.message(EPrefixInternalError, err.c_str()); hadError = true; @@ -748,7 +758,7 @@ private: }; TDefaultIoResolverBase::TDefaultIoResolverBase(const TIntermediate& intermediate) - : intermediate(intermediate) + : referenceIntermediate(intermediate) , nextUniformLocation(intermediate.getUniformLocationBase()) , nextInputLocation(0) , nextOutputLocation(0) @@ -760,17 +770,17 @@ TDefaultIoResolverBase::TDefaultIoResolverBase(const TIntermediate& intermediate int TDefaultIoResolverBase::getBaseBinding(EShLanguage stage, TResourceType res, unsigned int set) const { return stageIntermediates[stage] ? selectBaseBinding(stageIntermediates[stage]->getShiftBinding(res), stageIntermediates[stage]->getShiftBindingForSet(res, set)) - : selectBaseBinding(intermediate.getShiftBinding(res), intermediate.getShiftBindingForSet(res, set)); + : selectBaseBinding(referenceIntermediate.getShiftBinding(res), referenceIntermediate.getShiftBindingForSet(res, set)); } const std::vector& TDefaultIoResolverBase::getResourceSetBinding(EShLanguage stage) const { return stageIntermediates[stage] ? stageIntermediates[stage]->getResourceSetBinding() - : intermediate.getResourceSetBinding(); + : referenceIntermediate.getResourceSetBinding(); } -bool TDefaultIoResolverBase::doAutoBindingMapping() const { return intermediate.getAutoMapBindings(); } +bool TDefaultIoResolverBase::doAutoBindingMapping() const { return referenceIntermediate.getAutoMapBindings(); } -bool TDefaultIoResolverBase::doAutoLocationMapping() const { return intermediate.getAutoMapLocations(); } +bool TDefaultIoResolverBase::doAutoLocationMapping() const { return referenceIntermediate.getAutoMapLocations(); } TDefaultIoResolverBase::TSlotSet::iterator TDefaultIoResolverBase::findSlot(int set, int slot) { return std::lower_bound(slots[set].begin(), slots[set].end(), slot); @@ -827,7 +837,7 @@ int TDefaultIoResolverBase::resolveUniformLocation(EShLanguage /*stage*/, TVarEn } // no locations added if already present, a built-in variable, a block, or an opaque if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock || - type.isAtomic() || (type.containsOpaque() && intermediate.getSpv().openGl == 0)) { + type.isAtomic() || type.isSpirvType() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) { return ent.newLocation = -1; } // no locations on blocks of built-in variables @@ -839,7 +849,7 @@ int TDefaultIoResolverBase::resolveUniformLocation(EShLanguage /*stage*/, TVarEn return ent.newLocation = -1; } } - int location = intermediate.getUniformLocationOverride(name); + int location = referenceIntermediate.getUniformLocationOverride(name); if (location != -1) { return ent.newLocation = location; } @@ -855,8 +865,8 @@ int TDefaultIoResolverBase::resolveInOutLocation(EShLanguage stage, TVarEntryInf return ent.newLocation = -1; } - // no locations added if already present, or a built-in variable - if (type.getQualifier().hasLocation() || type.isBuiltIn()) { + // no locations added if already present, a built-in variable, or a variable with SPIR-V decorate + if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getQualifier().hasSpirvDecorate()) { return ent.newLocation = -1; } @@ -942,8 +952,8 @@ int TDefaultGlslIoResolver::resolveInOutLocation(EShLanguage stage, TVarEntryInf if (type.getQualifier().hasLocation()) { return ent.newLocation = type.getQualifier().layoutLocation; } - // no locations added if already present, or a built-in variable - if (type.isBuiltIn()) { + // no locations added if already present, a built-in variable, or a variable with SPIR-V decorate + if (type.isBuiltIn() || type.getQualifier().hasSpirvDecorate()) { return ent.newLocation = -1; } // no locations on blocks of built-in variables @@ -1024,7 +1034,8 @@ int TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEn } else { // no locations added if already present, a built-in variable, a block, or an opaque if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock || - type.isAtomic() || (type.containsOpaque() && intermediate.getSpv().openGl == 0)) { + type.isAtomic() || type.isSpirvType() || + (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) { return ent.newLocation = -1; } // no locations on blocks of built-in variables @@ -1037,7 +1048,7 @@ int TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEn } } } - int location = intermediate.getUniformLocationOverride(name.c_str()); + int location = referenceIntermediate.getUniformLocationOverride(name.c_str()); if (location != -1) { return ent.newLocation = location; } @@ -1086,7 +1097,7 @@ int TDefaultGlslIoResolver::resolveBinding(EShLanguage stage, TVarEntryInfo& ent const TType& type = ent.symbol->getType(); const TString& name = ent.symbol->getAccessName(); // On OpenGL arrays of opaque types take a separate binding for each element - int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1; + int numBindings = referenceIntermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1; TResourceType resource = getResourceType(type); // don't need to handle uniform symbol, it will be handled in resolveUniformLocation if (resource == EResUbo && type.getBasicType() != EbtBlock) { @@ -1095,7 +1106,7 @@ int TDefaultGlslIoResolver::resolveBinding(EShLanguage stage, TVarEntryInfo& ent // There is no 'set' qualifier in OpenGL shading language, each resource has its own // binding name space, so remap the 'set' to resource type which make each resource // binding is valid from 0 to MAX_XXRESOURCE_BINDINGS - int set = intermediate.getSpv().openGl != 0 ? resource : ent.newSet; + int set = referenceIntermediate.getSpv().openGl != 0 ? resource : ent.newSet; int resourceKey = set; if (resource < EResCount) { if (type.getQualifier().hasBinding()) { @@ -1223,7 +1234,7 @@ void TDefaultGlslIoResolver::reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& const TType& type = ent.symbol->getType(); const TString& name = ent.symbol->getAccessName(); TResourceType resource = getResourceType(type); - int set = intermediate.getSpv().openGl != 0 ? resource : resolveSet(ent.stage, ent); + int set = referenceIntermediate.getSpv().openGl != 0 ? resource : resolveSet(ent.stage, ent); int resourceKey = set; if (type.getQualifier().hasBinding()) { @@ -1233,7 +1244,7 @@ void TDefaultGlslIoResolver::reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& if (iter == varSlotMap.end()) { // Reserve the slots for the ubo, ssbo and opaques who has explicit binding - int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1; + int numBindings = referenceIntermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1; varSlotMap[name] = binding; reserveSlot(resourceKey, binding, numBindings); } else { @@ -1288,7 +1299,7 @@ struct TDefaultIoResolver : public TDefaultIoResolverBase { const TType& type = ent.symbol->getType(); const int set = getLayoutSet(type); // On OpenGL arrays of opaque types take a seperate binding for each element - int numBindings = intermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1; + int numBindings = referenceIntermediate.getSpv().openGl != 0 && type.isSizedArray() ? type.getCumulativeArraySize() : 1; TResourceType resource = getResourceType(type); if (resource < EResCount) { if (type.getQualifier().hasBinding()) { @@ -1633,18 +1644,60 @@ bool TGlslIoMapper::doMap(TIoMapResolver* resolver, TInfoSink& infoSink) { return TVarEntryInfo::TOrderByPriority()(p1.second, p2.second); }); resolver->endResolve(EShLangCount); + if (autoPushConstantBlockName.length()) { + bool upgraded = false; + for (size_t stage = 0; stage < EShLangCount; stage++) { + if (intermediates[stage] != nullptr) { + TVarLiveMap** pUniformVarMap = uniformResolve.uniformVarMap; + auto at = pUniformVarMap[stage]->find(autoPushConstantBlockName); + if (at == pUniformVarMap[stage]->end()) + continue; + TQualifier& qualifier = at->second.symbol->getQualifier(); + if (!qualifier.isUniform()) + continue; + TType& t = at->second.symbol->getWritableType(); + int size, stride; + TIntermediate::getBaseAlignment(t, size, stride, autoPushConstantBlockPacking, + qualifier.layoutMatrix == ElmRowMajor); + if (size <= int(autoPushConstantMaxSize)) { + qualifier.setBlockStorage(EbsPushConstant); + qualifier.layoutPacking = autoPushConstantBlockPacking; + // Push constants don't have set/binding etc. decorations, remove those. + qualifier.layoutSet = TQualifier::layoutSetEnd; + at->second.clearNewAssignments(); + + upgraded = true; + } + } + } + // If it's been upgraded to push_constant, then set the flag so when its traversed + // in the next for loop, all references to this symbol will get their flag changed. + // so it doesn't get a set/binding assigned to it. + if (upgraded) { + std::for_each(uniformVector.begin(), uniformVector.end(), + [this](TVarLivePair& p) { + if (p.first == autoPushConstantBlockName) { + p.second.upgradedToPushConstant = true; + } + }); + } + } for (size_t stage = 0; stage < EShLangCount; stage++) { if (intermediates[stage] != nullptr) { // traverse each stage, set new location to each input/output and unifom symbol, set new binding to - // ubo, ssbo and opaque symbols + // ubo, ssbo and opaque symbols. Assign push_constant upgrades as well. TVarLiveMap** pUniformVarMap = uniformResolve.uniformVarMap; std::for_each(uniformVector.begin(), uniformVector.end(), [pUniformVarMap, stage](TVarLivePair p) { auto at = pUniformVarMap[stage]->find(p.second.symbol->getAccessName()); if (at != pUniformVarMap[stage]->end() && at->second.id == p.second.id){ - int resolvedBinding = at->second.newBinding; - at->second = p.second; - if (resolvedBinding > 0) - at->second.newBinding = resolvedBinding; + if (p.second.upgradedToPushConstant) { + at->second.upgradedToPushConstant = true; + } else { + int resolvedBinding = at->second.newBinding; + at->second = p.second; + if (resolvedBinding > 0) + at->second.newBinding = resolvedBinding; + } } }); TVarSetTraverser iter_iomap(*intermediates[stage], *inVarMaps[stage], *outVarMaps[stage], @@ -1659,5 +1712,3 @@ bool TGlslIoMapper::doMap(TIoMapResolver* resolver, TInfoSink& infoSink) { } } // end namespace glslang - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.h index 07357c2ef..35babbce1 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/iomapper.h @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #ifndef _IOMAPPER_INCLUDED #define _IOMAPPER_INCLUDED @@ -55,12 +53,23 @@ struct TVarEntryInfo { long long id; TIntermSymbol* symbol; bool live; + bool upgradedToPushConstant; int newBinding; int newSet; int newLocation; int newComponent; int newIndex; EShLanguage stage; + + void clearNewAssignments() { + upgradedToPushConstant = false; + newBinding = -1; + newSet = -1; + newLocation = -1; + newComponent = -1; + newIndex = -1; + } + struct TOrderById { inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) { return l.id < r.id; } }; @@ -165,7 +174,7 @@ public: protected: TDefaultIoResolverBase(TDefaultIoResolverBase&); TDefaultIoResolverBase& operator=(TDefaultIoResolverBase&); - const TIntermediate& intermediate; + const TIntermediate& referenceIntermediate; int nextUniformLocation; int nextInputLocation; int nextOutputLocation; @@ -291,7 +300,7 @@ public: bool virtual doMap(TIoMapResolver*, TInfoSink&) { return true; } }; -// I/O mapper for OpenGL +// I/O mapper for GLSL class TGlslIoMapper : public TIoMapper { public: TGlslIoMapper() { @@ -301,6 +310,8 @@ public: memset(intermediates, 0, sizeof(TIntermediate*) * (EShLangCount + 1)); profile = ENoProfile; version = 0; + autoPushConstantMaxSize = 128; + autoPushConstantBlockPacking = ElpStd430; } virtual ~TGlslIoMapper() { for (size_t stage = 0; stage < EShLangCount; stage++) { @@ -320,6 +331,13 @@ public: intermediates[stage] = nullptr; } } + // If set, the uniform block with the given name will be changed to be backed by + // push_constant if it's size is <= maxSize + void setAutoPushConstantBlock(const char* name, unsigned int maxSize, TLayoutPacking packing) { + autoPushConstantBlockName = name; + autoPushConstantMaxSize = maxSize; + autoPushConstantBlockPacking = packing; + } // grow the reflection stage by stage bool addStage(EShLanguage, TIntermediate&, TInfoSink&, TIoMapResolver*) override; bool doMap(TIoMapResolver*, TInfoSink&) override; @@ -329,10 +347,13 @@ public: bool hadError = false; EProfile profile; int version; + +private: + TString autoPushConstantBlockName; + unsigned int autoPushConstantMaxSize; + TLayoutPacking autoPushConstantBlockPacking; }; } // end namespace glslang #endif // _IOMAPPER_INCLUDED - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/limits.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/limits.cpp index 391570579..4404beca4 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/limits.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/limits.cpp @@ -187,14 +187,12 @@ bool TIndexTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node) // void TParseContext::constantIndexExpressionCheck(TIntermNode* index) { -#ifndef GLSLANG_WEB TIndexTraverser it(inductiveLoopIds); index->traverse(&it); if (it.bad) error(it.badLoc, "Non-constant-index-expression", "limitations", ""); -#endif } } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/linkValidate.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/linkValidate.cpp index 9656e2e7e..62e24426e 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/linkValidate.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/linkValidate.cpp @@ -55,23 +55,25 @@ namespace glslang { // // Link-time error emitter. // -void TIntermediate::error(TInfoSink& infoSink, const char* message) +void TIntermediate::error(TInfoSink& infoSink, const char* message, EShLanguage unitStage) { -#ifndef GLSLANG_WEB infoSink.info.prefix(EPrefixError); - infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; -#endif + if (unitStage < EShLangCount) + infoSink.info << "Linking " << StageName(getStage()) << " and " << StageName(unitStage) << " stages: " << message << "\n"; + else + infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; ++numErrors; } // Link-time warning. -void TIntermediate::warn(TInfoSink& infoSink, const char* message) +void TIntermediate::warn(TInfoSink& infoSink, const char* message, EShLanguage unitStage) { -#ifndef GLSLANG_WEB infoSink.info.prefix(EPrefixWarning); - infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; -#endif + if (unitStage < EShLangCount) + infoSink.info << "Linking " << StageName(language) << " and " << StageName(unitStage) << " stages: " << message << "\n"; + else + infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; } // TODO: 4.4 offset/align: "Two blocks linked together in the same program with the same block @@ -83,11 +85,9 @@ void TIntermediate::warn(TInfoSink& infoSink, const char* message) // void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) mergeCallGraphs(infoSink, unit); mergeModes(infoSink, unit); mergeTrees(infoSink, unit); -#endif } // @@ -114,7 +114,7 @@ void TIntermediate::mergeUniformObjects(TInfoSink& infoSink, TIntermediate& unit } // -// do error checking on the shader boundary in / out vars +// do error checking on the shader boundary in / out vars // void TIntermediate::checkStageIO(TInfoSink& infoSink, TIntermediate& unit) { if (unit.treeRoot == nullptr || treeRoot == nullptr) @@ -155,8 +155,6 @@ void TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit) callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end()); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #define MERGE_MAX(member) member = std::max(member, unit.member) #define MERGE_TRUE(member) if (unit.member) member = unit.member; @@ -206,7 +204,7 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit) if (vertices == TQualifier::layoutNotSet) vertices = unit.vertices; else if (unit.vertices != TQualifier::layoutNotSet && vertices != unit.vertices) { - if (language == EShLangGeometry || language == EShLangMeshNV) + if (language == EShLangGeometry || language == EShLangMesh) error(infoSink, "Contradictory layout max_vertices values"); else if (language == EShLangTessControl) error(infoSink, "Contradictory layout vertices values"); @@ -216,7 +214,7 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit) if (primitives == TQualifier::layoutNotSet) primitives = unit.primitives; else if (primitives != unit.primitives) { - if (language == EShLangMeshNV) + if (language == EShLangMesh) error(infoSink, "Contradictory layout max_primitives values"); else assert(0); @@ -265,6 +263,9 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit) MERGE_TRUE(earlyFragmentTests); MERGE_TRUE(postDepthCoverage); + MERGE_TRUE(nonCoherentColorAttachmentReadEXT); + MERGE_TRUE(nonCoherentDepthAttachmentReadEXT); + MERGE_TRUE(nonCoherentStencilAttachmentReadEXT); if (depthLayout == EldNone) depthLayout = unit.depthLayout; @@ -312,6 +313,8 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit) MERGE_TRUE(autoMapBindings); MERGE_TRUE(autoMapLocations); MERGE_TRUE(invertY); + MERGE_TRUE(dxPositionW); + MERGE_TRUE(debugInfo); MERGE_TRUE(flattenUniformArrays); MERGE_TRUE(useUnknownFormat); MERGE_TRUE(hlslOffsets); @@ -370,8 +373,6 @@ void TIntermediate::mergeTrees(TInfoSink& infoSink, TIntermediate& unit) ioAccessed.insert(unit.ioAccessed.begin(), unit.ioAccessed.end()); } -#endif - static const TString& getNameForIdMap(TIntermSymbol* symbol) { TShaderInterface si = symbol->getType().getShaderInterface(); @@ -579,9 +580,6 @@ void TIntermediate::mergeGlobalUniformBlocks(TInfoSink& infoSink, TIntermediate& } void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unit) { - if (block->getType() == unitBlock->getType()) { - return; - } if (block->getType().getTypeName() != unitBlock->getType().getTypeName() || block->getType().getBasicType() != unitBlock->getType().getBasicType() || @@ -628,44 +626,42 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl } } - TType unitType; - unitType.shallowCopy(unitBlock->getType()); - // update symbol node in unit tree, // and other nodes that may reference it class TMergeBlockTraverser : public TIntermTraverser { public: - TMergeBlockTraverser(const glslang::TType &type, const glslang::TType& unitType, - glslang::TIntermediate& unit, - const std::map& memberIdxUpdates) : - newType(type), unitType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates) - { } - virtual ~TMergeBlockTraverser() { } + TMergeBlockTraverser(const TIntermSymbol* newSym) + : newSymbol(newSym), newType(nullptr), unit(nullptr), memberIndexUpdates(nullptr) + { + } + TMergeBlockTraverser(const TIntermSymbol* newSym, const glslang::TType* unitType, glslang::TIntermediate* unit, + const std::map* memberIdxUpdates) + : TIntermTraverser(false, true), newSymbol(newSym), newType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates) + { + } + virtual ~TMergeBlockTraverser() {} - const glslang::TType& newType; // type with modifications - const glslang::TType& unitType; // copy of original type - glslang::TIntermediate& unit; // intermediate that is being updated - const std::map& memberIndexUpdates; + const TIntermSymbol* newSymbol; + const glslang::TType* newType; // shallow copy of the new type + glslang::TIntermediate* unit; // intermediate that is being updated + const std::map* memberIndexUpdates; virtual void visitSymbol(TIntermSymbol* symbol) { - glslang::TType& symType = symbol->getWritableType(); - - if (symType == unitType) { - // each symbol node has a local copy of the unitType - // if merging involves changing properties that aren't shared objects - // they should be updated in all instances - - // e.g. the struct list is a ptr to an object, so it can be updated - // once, outside the traverser - //*symType.getWritableStruct() = *newType.getStruct(); + if (newSymbol->getAccessName() == symbol->getAccessName() && + newSymbol->getQualifier().getBlockStorage() == symbol->getQualifier().getBlockStorage()) { + // Each symbol node may have a local copy of the block structure. + // Update those structures to match the new one post-merge + *(symbol->getWritableType().getWritableStruct()) = *(newSymbol->getType().getStruct()); } - } virtual bool visitBinary(TVisit, glslang::TIntermBinary* node) { - if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == unitType) { + if (!unit || !newType || !memberIndexUpdates || memberIndexUpdates->empty()) + return true; + + if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == *newType) { // this is a dereference to a member of the block since the // member list changed, need to update this to point to the // right index @@ -673,8 +669,8 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl glslang::TIntermConstantUnion* constNode = node->getRight()->getAsConstantUnion(); unsigned int memberIdx = constNode->getConstArray()[0].getUConst(); - unsigned int newIdx = memberIndexUpdates.at(memberIdx); - TIntermTyped* newConstNode = unit.addConstantUnion(newIdx, node->getRight()->getLoc()); + unsigned int newIdx = memberIndexUpdates->at(memberIdx); + TIntermTyped* newConstNode = unit->addConstantUnion(newIdx, node->getRight()->getLoc()); node->setRight(newConstNode); delete constNode; @@ -683,10 +679,20 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl } return true; } - } finalLinkTraverser(block->getType(), unitType, *unit, memberIndexUpdates); + }; - // update the tree to use the new type - unit->getTreeRoot()->traverse(&finalLinkTraverser); + // 'this' may have symbols that are using the old block structure, so traverse the tree to update those + // in 'visitSymbol' + TMergeBlockTraverser finalLinkTraverser(block); + getTreeRoot()->traverse(&finalLinkTraverser); + + // The 'unit' intermediate needs the block structures update, but also structure entry indices + // may have changed from the old block to the new one that it was merged into, so update those + // in 'visitBinary' + TType newType; + newType.shallowCopy(block->getType()); + TMergeBlockTraverser unitFinalLinkTraverser(block, &newType, unit, &memberIndexUpdates); + unit->getTreeRoot()->traverse(&unitFinalLinkTraverser); // update the member list (*unitMemberList) = (*memberList); @@ -736,6 +742,21 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin symbol->getQualifier().layoutLocation = unitSymbol->getQualifier().layoutLocation; } + // Update implicit array sizes + if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isImplicitlySizedArray()) { + if (unitSymbol->getType().getImplicitArraySize() > symbol->getType().getImplicitArraySize()){ + symbol->getWritableType().updateImplicitArraySize(unitSymbol->getType().getImplicitArraySize()); + } + } + else if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isSizedArray()) { + if (symbol->getWritableType().getImplicitArraySize() > unitSymbol->getType().getOuterArraySize()) + error(infoSink, "Implicit size of unsized array doesn't match same symbol among multiple shaders."); + } + else if (unitSymbol->getType().isImplicitlySizedArray() && symbol->getWritableType().isSizedArray()) { + if (unitSymbol->getType().getImplicitArraySize() > symbol->getWritableType().getOuterArraySize()) + error(infoSink, "Implicit size of unsized array doesn't match same symbol among multiple shaders."); + } + // Update implicit array sizes mergeImplicitArraySizes(symbol->getWritableType(), unitSymbol->getType()); @@ -746,6 +767,19 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin else if (symbol->getQualifier().isPushConstant() && unitSymbol->getQualifier().isPushConstant() && getStage() == unitStage) error(infoSink, "Only one push_constant block is allowed per stage"); } + + // Check conflicts between preset primitives and sizes of I/O variables among multiple geometry shaders + if (language == EShLangGeometry && unitStage == EShLangGeometry) + { + TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode(); + if (unitSymbol->isArray() && unitSymbol->getQualifier().storage == EvqVaryingIn && unitSymbol->getQualifier().builtIn == EbvNone) + if ((unitSymbol->getArraySizes()->isImplicitlySized() && + unitSymbol->getArraySizes()->getImplicitSize() != TQualifier::mapGeometryToSize(getInputPrimitive())) || + (! unitSymbol->getArraySizes()->isImplicitlySized() && + unitSymbol->getArraySizes()->getDimSize(0) != TQualifier::mapGeometryToSize(getInputPrimitive()))) + error(infoSink, "Not all array sizes match across all geometry shaders in the program"); + } + if (merge) { linkerObjects.push_back(unitLinkerObjects[unitLinkObj]); @@ -759,7 +793,10 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin auto checkName = [this, unitSymbol, &infoSink](const TString& name) { for (unsigned int i = 0; i < unitSymbol->getType().getStruct()->size(); ++i) { - if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName()) { + if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName() + && !((*unitSymbol->getType().getStruct())[i].type->getQualifier().hasLocation() + || unitSymbol->getType().getQualifier().hasLocation()) + ) { error(infoSink, "Anonymous member name used for global variable or other anonymous member: "); infoSink.info << (*unitSymbol->getType().getStruct())[i].type->getCompleteString() << "\n"; } @@ -812,9 +849,12 @@ void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType) // void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol, EShLanguage unitStage) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) bool crossStage = getStage() != unitStage; bool writeTypeComparison = false; + bool errorReported = false; + bool printQualifiers = false; + bool printPrecision = false; + bool printType = false; // Types have to match { @@ -843,14 +883,52 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy else { arraysMatch = symbol.getType().sameArrayness(unitSymbol.getType()) || (symbol.getType().isArray() && unitSymbol.getType().isArray() && - (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray())); + (symbol.getType().isImplicitlySizedArray() || unitSymbol.getType().isImplicitlySizedArray() || + symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray())); } - if (!symbol.getType().sameElementType(unitSymbol.getType()) || - !symbol.getType().sameTypeParameters(unitSymbol.getType()) || - !arraysMatch ) { + int lpidx = -1; + int rpidx = -1; + if (!symbol.getType().sameElementType(unitSymbol.getType(), &lpidx, &rpidx)) { + if (lpidx >= 0 && rpidx >= 0) { + error(infoSink, "Member names and types must match:", unitStage); + infoSink.info << " Block: " << symbol.getType().getTypeName() << "\n"; + infoSink.info << " " << StageName(getStage()) << " stage: \"" + << (*symbol.getType().getStruct())[lpidx].type->getCompleteString(true, false, false, true, + (*symbol.getType().getStruct())[lpidx].type->getFieldName()) << "\"\n"; + infoSink.info << " " << StageName(unitStage) << " stage: \"" + << (*unitSymbol.getType().getStruct())[rpidx].type->getCompleteString(true, false, false, true, + (*unitSymbol.getType().getStruct())[rpidx].type->getFieldName()) << "\"\n"; + errorReported = true; + } else if (lpidx >= 0 && rpidx == -1) { + TString errmsg = StageName(getStage()); + errmsg.append(" block member has no corresponding member in ").append(StageName(unitStage)).append(" block:"); + error(infoSink, errmsg.c_str(), unitStage); + infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: " + << (*symbol.getType().getStruct())[lpidx].type->getFieldName() << "\n"; + infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: n/a \n"; + errorReported = true; + } else if (lpidx == -1 && rpidx >= 0) { + TString errmsg = StageName(unitStage); + errmsg.append(" block member has no corresponding member in ").append(StageName(getStage())).append(" block:"); + error(infoSink, errmsg.c_str(), unitStage); + infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: " + << (*unitSymbol.getType().getStruct())[rpidx].type->getFieldName() << "\n"; + infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: n/a \n"; + errorReported = true; + } else { + error(infoSink, "Types must match:", unitStage); + writeTypeComparison = true; + printType = true; + } + } else if (!arraysMatch) { + error(infoSink, "Array sizes must be compatible:", unitStage); writeTypeComparison = true; - error(infoSink, "Types must match:"); + printType = true; + } else if (!symbol.getType().sameTypeParameters(unitSymbol.getType())) { + error(infoSink, "Type parameters must match:", unitStage); + writeTypeComparison = true; + printType = true; } } @@ -858,17 +936,51 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock && symbol.getType().getStruct() && unitSymbol.getType().getStruct() && symbol.getType().sameStructType(unitSymbol.getType())) { - for (unsigned int i = 0; i < symbol.getType().getStruct()->size(); ++i) { - const TQualifier& qualifier = (*symbol.getType().getStruct())[i].type->getQualifier(); - const TQualifier& unitQualifier = (*unitSymbol.getType().getStruct())[i].type->getQualifier(); - if (qualifier.layoutMatrix != unitQualifier.layoutMatrix || - qualifier.layoutOffset != unitQualifier.layoutOffset || - qualifier.layoutAlign != unitQualifier.layoutAlign || - qualifier.layoutLocation != unitQualifier.layoutLocation || - qualifier.layoutComponent != unitQualifier.layoutComponent) { - error(infoSink, "Interface block member layout qualifiers must match:"); - writeTypeComparison = true; + unsigned int li = 0; + unsigned int ri = 0; + while (li < symbol.getType().getStruct()->size() && ri < unitSymbol.getType().getStruct()->size()) { + if ((*symbol.getType().getStruct())[li].type->hiddenMember()) { + ++li; + continue; } + if ((*unitSymbol.getType().getStruct())[ri].type->hiddenMember()) { + ++ri; + continue; + } + const TQualifier& qualifier = (*symbol.getType().getStruct())[li].type->getQualifier(); + const TQualifier & unitQualifier = (*unitSymbol.getType().getStruct())[ri].type->getQualifier(); + bool layoutQualifierError = false; + if (qualifier.layoutMatrix != unitQualifier.layoutMatrix) { + error(infoSink, "Interface block member layout matrix qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (qualifier.layoutOffset != unitQualifier.layoutOffset) { + error(infoSink, "Interface block member layout offset qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (qualifier.layoutAlign != unitQualifier.layoutAlign) { + error(infoSink, "Interface block member layout align qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (qualifier.layoutLocation != unitQualifier.layoutLocation) { + error(infoSink, "Interface block member layout location qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (qualifier.layoutComponent != unitQualifier.layoutComponent) { + error(infoSink, "Interface block member layout component qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (layoutQualifierError) { + infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: " + << (*symbol.getType().getStruct())[li].type->getFieldName() << " \"" + << (*symbol.getType().getStruct())[li].type->getCompleteString(true, true, false, false) << "\"\n"; + infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: " + << (*unitSymbol.getType().getStruct())[ri].type->getFieldName() << " \"" + << (*unitSymbol.getType().getStruct())[ri].type->getCompleteString(true, true, false, false) << "\"\n"; + errorReported = true; + } + ++li; + ++ri; } } @@ -879,8 +991,9 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy // Qualifiers have to (almost) match // Storage... if (!isInOut && symbol.getQualifier().storage != unitSymbol.getQualifier().storage) { - error(infoSink, "Storage qualifiers must match:"); + error(infoSink, "Storage qualifiers must match:", unitStage); writeTypeComparison = true; + printQualifiers = true; } // Uniform and buffer blocks must either both have an instance name, or @@ -888,37 +1001,40 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy if (symbol.getQualifier().isUniformOrBuffer() && (IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()))) { error(infoSink, "Matched Uniform or Storage blocks must all be anonymous," - " or all be named:"); + " or all be named:", unitStage); writeTypeComparison = true; } if (symbol.getQualifier().storage == unitSymbol.getQualifier().storage && (IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()) || (!IsAnonymous(symbol.getName()) && symbol.getName() != unitSymbol.getName()))) { - warn(infoSink, "Matched shader interfaces are using different instance names."); + warn(infoSink, "Matched shader interfaces are using different instance names.", unitStage); writeTypeComparison = true; } // Precision... if (!isInOut && symbol.getQualifier().precision != unitSymbol.getQualifier().precision) { - error(infoSink, "Precision qualifiers must match:"); + error(infoSink, "Precision qualifiers must match:", unitStage); writeTypeComparison = true; + printPrecision = true; } // Invariance... if (! crossStage && symbol.getQualifier().invariant != unitSymbol.getQualifier().invariant) { - error(infoSink, "Presence of invariant qualifier must match:"); + error(infoSink, "Presence of invariant qualifier must match:", unitStage); writeTypeComparison = true; + printQualifiers = true; } // Precise... if (! crossStage && symbol.getQualifier().isNoContraction() != unitSymbol.getQualifier().isNoContraction()) { - error(infoSink, "Presence of precise qualifier must match:"); + error(infoSink, "Presence of precise qualifier must match:", unitStage); writeTypeComparison = true; + printPrecision = true; } // Auxiliary and interpolation... - // "interpolation qualification (e.g., flat) and auxiliary qualification (e.g. centroid) may differ. + // "interpolation qualification (e.g., flat) and auxiliary qualification (e.g. centroid) may differ. // These mismatches are allowed between any pair of stages ... // those provided in the fragment shader supersede those provided in previous stages." if (!crossStage && @@ -928,59 +1044,138 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy symbol.getQualifier().isSample()!= unitSymbol.getQualifier().isSample() || symbol.getQualifier().isPatch() != unitSymbol.getQualifier().isPatch() || symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective())) { - error(infoSink, "Interpolation and auxiliary storage qualifiers must match:"); + error(infoSink, "Interpolation and auxiliary storage qualifiers must match:", unitStage); writeTypeComparison = true; + printQualifiers = true; } // Memory... - if (symbol.getQualifier().coherent != unitSymbol.getQualifier().coherent || - symbol.getQualifier().devicecoherent != unitSymbol.getQualifier().devicecoherent || - symbol.getQualifier().queuefamilycoherent != unitSymbol.getQualifier().queuefamilycoherent || - symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent || - symbol.getQualifier().subgroupcoherent != unitSymbol.getQualifier().subgroupcoherent || - symbol.getQualifier().shadercallcoherent!= unitSymbol.getQualifier().shadercallcoherent || - symbol.getQualifier().nonprivate != unitSymbol.getQualifier().nonprivate || - symbol.getQualifier().volatil != unitSymbol.getQualifier().volatil || - symbol.getQualifier().restrict != unitSymbol.getQualifier().restrict || - symbol.getQualifier().readonly != unitSymbol.getQualifier().readonly || - symbol.getQualifier().writeonly != unitSymbol.getQualifier().writeonly) { - error(infoSink, "Memory qualifiers must match:"); - writeTypeComparison = true; + bool memoryQualifierError = false; + if (symbol.getQualifier().coherent != unitSymbol.getQualifier().coherent) { + error(infoSink, "Memory coherent qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().devicecoherent != unitSymbol.getQualifier().devicecoherent) { + error(infoSink, "Memory devicecoherent qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().queuefamilycoherent != unitSymbol.getQualifier().queuefamilycoherent) { + error(infoSink, "Memory queuefamilycoherent qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent) { + error(infoSink, "Memory workgroupcoherent qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().subgroupcoherent != unitSymbol.getQualifier().subgroupcoherent) { + error(infoSink, "Memory subgroupcoherent qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().shadercallcoherent != unitSymbol.getQualifier().shadercallcoherent) { + error(infoSink, "Memory shadercallcoherent qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().nonprivate != unitSymbol.getQualifier().nonprivate) { + error(infoSink, "Memory nonprivate qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().volatil != unitSymbol.getQualifier().volatil) { + error(infoSink, "Memory volatil qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().restrict != unitSymbol.getQualifier().restrict) { + error(infoSink, "Memory restrict qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().readonly != unitSymbol.getQualifier().readonly) { + error(infoSink, "Memory readonly qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (symbol.getQualifier().writeonly != unitSymbol.getQualifier().writeonly) { + error(infoSink, "Memory writeonly qualifier must match:", unitStage); + memoryQualifierError = true; + } + if (memoryQualifierError) { + writeTypeComparison = true; + printQualifiers = true; } // Layouts... // TODO: 4.4 enhanced layouts: Generalize to include offset/align: current spec // requires separate user-supplied offset from actual computed offset, but // current implementation only has one offset. - if (symbol.getQualifier().layoutMatrix != unitSymbol.getQualifier().layoutMatrix || - symbol.getQualifier().layoutPacking != unitSymbol.getQualifier().layoutPacking || - symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation || - symbol.getQualifier().layoutComponent != unitSymbol.getQualifier().layoutComponent || - symbol.getQualifier().layoutIndex != unitSymbol.getQualifier().layoutIndex || - symbol.getQualifier().layoutBinding != unitSymbol.getQualifier().layoutBinding || - (symbol.getQualifier().hasBinding() && (symbol.getQualifier().layoutOffset != unitSymbol.getQualifier().layoutOffset))) { - error(infoSink, "Layout qualification must match:"); + bool layoutQualifierError = false; + if (symbol.getQualifier().layoutMatrix != unitSymbol.getQualifier().layoutMatrix) { + error(infoSink, "Layout matrix qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (symbol.getQualifier().layoutPacking != unitSymbol.getQualifier().layoutPacking) { + error(infoSink, "Layout packing qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (symbol.getQualifier().hasLocation() && unitSymbol.getQualifier().hasLocation() && symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation) { + error(infoSink, "Layout location qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (symbol.getQualifier().layoutComponent != unitSymbol.getQualifier().layoutComponent) { + error(infoSink, "Layout component qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (symbol.getQualifier().layoutIndex != unitSymbol.getQualifier().layoutIndex) { + error(infoSink, "Layout index qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (symbol.getQualifier().hasBinding() && unitSymbol.getQualifier().hasBinding() && symbol.getQualifier().layoutBinding != unitSymbol.getQualifier().layoutBinding) { + error(infoSink, "Layout binding qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (symbol.getQualifier().hasBinding() && (symbol.getQualifier().layoutOffset != unitSymbol.getQualifier().layoutOffset)) { + error(infoSink, "Layout offset qualifier must match:", unitStage); + layoutQualifierError = true; + } + if (layoutQualifierError) { writeTypeComparison = true; + printQualifiers = true; } // Initializers have to match, if both are present, and if we don't already know the types don't match - if (! writeTypeComparison) { + if (! writeTypeComparison && ! errorReported) { if (! symbol.getConstArray().empty() && ! unitSymbol.getConstArray().empty()) { if (symbol.getConstArray() != unitSymbol.getConstArray()) { - error(infoSink, "Initializers must match:"); + error(infoSink, "Initializers must match:", unitStage); infoSink.info << " " << symbol.getName() << "\n"; } } } if (writeTypeComparison) { - infoSink.info << " " << symbol.getName() << ": \"" << symbol.getType().getCompleteString() << "\" versus "; - if (symbol.getName() != unitSymbol.getName()) - infoSink.info << unitSymbol.getName() << ": "; - - infoSink.info << "\"" << unitSymbol.getType().getCompleteString() << "\"\n"; + if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock && + symbol.getType().getStruct() && unitSymbol.getType().getStruct()) { + if (printType) { + infoSink.info << " " << StageName(getStage()) << " stage: \"" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, + printType, symbol.getName(), symbol.getType().getTypeName()) << "\"\n"; + infoSink.info << " " << StageName(unitStage) << " stage: \"" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, + printType, unitSymbol.getName(), unitSymbol.getType().getTypeName()) << "\"\n"; + } else { + infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << " Instance: " << symbol.getName() + << ": \"" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n"; + infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << " Instance: " << unitSymbol.getName() + << ": \"" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n"; + } + } else { + if (printType) { + infoSink.info << " " << StageName(getStage()) << " stage: \"" + << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, symbol.getName()) << "\"\n"; + infoSink.info << " " << StageName(unitStage) << " stage: \"" + << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, unitSymbol.getName()) << "\"\n"; + } else { + infoSink.info << " " << StageName(getStage()) << " stage: " << symbol.getName() << " \"" + << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n"; + infoSink.info << " " << StageName(unitStage) << " stage: " << unitSymbol.getName() << " \"" + << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n"; + } + } } -#endif } void TIntermediate::sharedBlockCheck(TInfoSink& infoSink) @@ -1027,7 +1222,6 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled) // overlap/alias/missing I/O, etc. inOutLocationCheck(infoSink); -#ifndef GLSLANG_WEB if (getNumPushConstants() > 1) error(infoSink, "Only one push_constant block is allowed per stage"); @@ -1120,8 +1314,8 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled) error(infoSink, "At least one shader must specify a layout(max_vertices = value)"); break; case EShLangFragment: - // for GL_ARB_post_depth_coverage, EarlyFragmentTest is set automatically in - // ParseHelper.cpp. So if we reach here, this must be GL_EXT_post_depth_coverage + // for GL_ARB_post_depth_coverage, EarlyFragmentTest is set automatically in + // ParseHelper.cpp. So if we reach here, this must be GL_EXT_post_depth_coverage // requiring explicit early_fragment_tests if (getPostDepthCoverage() && !getEarlyFragmentTests()) error(infoSink, "post_depth_coverage requires early_fragment_tests"); @@ -1138,7 +1332,7 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled) if (numShaderRecordBlocks > 1) error(infoSink, "Only one shaderRecordNV buffer block is allowed per stage"); break; - case EShLangMeshNV: + case EShLangMesh: // NV_mesh_shader doesn't allow use of both single-view and per-view builtins. if (inIoAccessed("gl_Position") && inIoAccessed("gl_PositionPerViewNV")) error(infoSink, "Can only use one of gl_Position or gl_PositionPerViewNV"); @@ -1156,10 +1350,12 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled) error(infoSink, "At least one shader must specify a layout(max_vertices = value)"); if (primitives == TQualifier::layoutNotSet) error(infoSink, "At least one shader must specify a layout(max_primitives = value)"); - // fall through - case EShLangTaskNV: + [[fallthrough]]; + case EShLangTask: if (numTaskNVBlocks > 1) error(infoSink, "Only one taskNV interface block is allowed per shader"); + if (numTaskEXTPayloads > 1) + error(infoSink, "Only single variable of type taskPayloadSharedEXT is allowed per shader"); sharedBlockCheck(infoSink); break; default: @@ -1183,7 +1379,6 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled) } finalLinkTraverser; treeRoot->traverse(&finalLinkTraverser); -#endif } // @@ -1206,7 +1401,7 @@ void TIntermediate::checkCallGraphCycles(TInfoSink& infoSink) TCall* newRoot; do { // See if we have unvisited parts of the graph. - newRoot = 0; + newRoot = nullptr; for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) { if (! call->visited) { newRoot = &(*call); @@ -1340,7 +1535,10 @@ void TIntermediate::checkCallGraphBodies(TInfoSink& infoSink, bool keepUncalled) if (! keepUncalled) { for (int f = 0; f < (int)functionSequence.size(); ++f) { if (! reachable[f]) + { + resetTopLevelUncalledStatus(functionSequence[f]->getAsAggregate()->getName()); functionSequence[f] = nullptr; + } } functionSequence.erase(std::remove(functionSequence.begin(), functionSequence.end(), nullptr), functionSequence.end()); } @@ -1408,7 +1606,7 @@ bool TIntermediate::userOutputUsed() const return found; } -// Accumulate locations used for inputs, outputs, and uniforms, payload and callable data +// Accumulate locations used for inputs, outputs, and uniforms, payload, callable data, and tileImageEXT // and check for collisions as the accumulation is done. // // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value. @@ -1421,7 +1619,6 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ typeCollision = false; int set; - int setRT; if (qualifier.isPipeInput()) set = 0; else if (qualifier.isPipeOutput()) @@ -1430,10 +1627,14 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ set = 2; else if (qualifier.storage == EvqBuffer) set = 3; + else if (qualifier.storage == EvqTileImageEXT) + set = 4; else if (qualifier.isAnyPayload()) - setRT = 0; + set = 0; else if (qualifier.isAnyCallable()) - setRT = 1; + set = 1; + else if (qualifier.isHitObjectAttrNV()) + set = 2; else return -1; @@ -1472,13 +1673,14 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ // For raytracing IO (payloads and callabledata) each declaration occupies a single // slot irrespective of type. int collision = -1; // no collision -#ifndef GLSLANG_WEB - if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) { + if (qualifier.isAnyPayload() || qualifier.isAnyCallable() || qualifier.isHitObjectAttrNV()) { TRange range(qualifier.layoutLocation, qualifier.layoutLocation); - collision = checkLocationRT(setRT, qualifier.layoutLocation); + collision = checkLocationRT(set, qualifier.layoutLocation); if (collision < 0) - usedIoRT[setRT].push_back(range); - } else if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 && + usedIoRT[set].push_back(range); + return collision; + } + if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 && (qualifier.isPipeInput() || qualifier.isPipeOutput())) { // Dealing with dvec3 in/out split across two locations. // Need two io-ranges. @@ -1487,7 +1689,7 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ // First range: TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation); TRange componentRange(0, 3); - TIoRange range(locationRange, componentRange, type.getBasicType(), 0); + TIoRange range(locationRange, componentRange, type.getBasicType(), 0, qualifier.centroid, qualifier.smooth, qualifier.flat); // check for collisions collision = checkLocationRange(set, range, type, typeCollision); @@ -1497,39 +1699,41 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ // Second range: TRange locationRange2(qualifier.layoutLocation + 1, qualifier.layoutLocation + 1); TRange componentRange2(0, 1); - TIoRange range2(locationRange2, componentRange2, type.getBasicType(), 0); + TIoRange range2(locationRange2, componentRange2, type.getBasicType(), 0, qualifier.centroid, qualifier.smooth, qualifier.flat); // check for collisions collision = checkLocationRange(set, range2, type, typeCollision); if (collision < 0) usedIo[set].push_back(range2); } - } else -#endif - { - // Not a dvec3 in/out split across two locations, generic path. - // Need a single IO-range block. - - TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation + size - 1); - TRange componentRange(0, 3); - if (qualifier.hasComponent() || type.getVectorSize() > 0) { - int consumedComponents = type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1); - if (qualifier.hasComponent()) - componentRange.start = qualifier.layoutComponent; - componentRange.last = componentRange.start + consumedComponents - 1; - } - - // combine location and component ranges - TIoRange range(locationRange, componentRange, type.getBasicType(), qualifier.hasIndex() ? qualifier.getIndex() : 0); - - // check for collisions, except for vertex inputs on desktop targeting OpenGL - if (! (!isEsProfile() && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0) - collision = checkLocationRange(set, range, type, typeCollision); - - if (collision < 0) - usedIo[set].push_back(range); + return collision; } + // Not a dvec3 in/out split across two locations, generic path. + // Need a single IO-range block. + + TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation + size - 1); + TRange componentRange(0, 3); + if (qualifier.hasComponent() || type.getVectorSize() > 0) { + int consumedComponents = type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1); + if (qualifier.hasComponent()) + componentRange.start = qualifier.layoutComponent; + componentRange.last = componentRange.start + consumedComponents - 1; + } + + // combine location and component ranges + TBasicType basicTy = type.getBasicType(); + if (basicTy == EbtSampler && type.getSampler().isAttachmentEXT()) + basicTy = type.getSampler().type; + TIoRange range(locationRange, componentRange, basicTy, qualifier.hasIndex() ? qualifier.getIndex() : 0, qualifier.centroid, qualifier.smooth, qualifier.flat); + + // check for collisions, except for vertex inputs on desktop targeting OpenGL + if (! (!isEsProfile() && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0) + collision = checkLocationRange(set, range, type, typeCollision); + + if (collision < 0) + usedIo[set].push_back(range); + return collision; } @@ -1544,13 +1748,30 @@ int TIntermediate::checkLocationRange(int set, const TIoRange& range, const TTyp if (range.overlap(usedIo[set][r])) { // there is a collision; pick one return std::max(range.location.start, usedIo[set][r].location.start); - } else if (range.location.overlap(usedIo[set][r].location) && type.getBasicType() != usedIo[set][r].basicType) { + } else if (range.location.overlap(usedIo[set][r].location) && + (type.getBasicType() != usedIo[set][r].basicType || + type.getQualifier().centroid != usedIo[set][r].centroid || + type.getQualifier().smooth != usedIo[set][r].smooth || + type.getQualifier().flat != usedIo[set][r].flat)) { // aliased-type mismatch typeCollision = true; return std::max(range.location.start, usedIo[set][r].location.start); } } + // check typeCollision between tileImageEXT and out + if (set == 4 || set == 1) { + // if the set is "tileImageEXT", check against "out" and vice versa + int againstSet = (set == 4) ? 1 : 4; + for (size_t r = 0; r < usedIo[againstSet].size(); ++r) { + if (range.location.overlap(usedIo[againstSet][r].location) && type.getBasicType() != usedIo[againstSet][r].basicType) { + // aliased-type mismatch + typeCollision = true; + return std::max(range.location.start, usedIo[againstSet][r].location.start); + } + } + } + return -1; // no collision } @@ -1614,10 +1835,8 @@ int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage) if (type.isSizedArray() && !type.getQualifier().isPerView()) return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage); else { -#ifndef GLSLANG_WEB // unset perViewNV attributes for arrayed per-view outputs: "perviewNV vec4 v[MAX_VIEWS][3];" elementType.getQualifier().perViewNV = false; -#endif return computeTypeLocationSize(elementType, stage); } } @@ -1693,8 +1912,6 @@ int TIntermediate::computeTypeUniformLocationSize(const TType& type) return 1; } -#ifndef GLSLANG_WEB - // Accumulate xfb buffer ranges and check for collisions as the accumulation is done. // // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value. @@ -1786,7 +2003,7 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains return size; } - int numComponents; + int numComponents {0}; if (type.isScalar()) numComponents = 1; else if (type.isVector()) @@ -1812,8 +2029,6 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains } } -#endif - const int baseAlignmentVec4Std140 = 16; // Return the size and alignment of a component of the given type. @@ -1821,10 +2036,6 @@ const int baseAlignmentVec4Std140 = 16; // Return value is the alignment.. int TIntermediate::getBaseAlignmentScalar(const TType& type, int& size) { -#ifdef GLSLANG_WEB - size = 4; return 4; -#endif - switch (type.getBasicType()) { case EbtInt64: case EbtUint64: @@ -1835,6 +2046,15 @@ int TIntermediate::getBaseAlignmentScalar(const TType& type, int& size) case EbtInt16: case EbtUint16: size = 2; return 2; case EbtReference: size = 8; return 8; + case EbtSampler: + { + if (type.isBindlessImage() || type.isBindlessTexture()) { + size = 8; return 8; + } + else { + size = 4; return 4; + } + } default: size = 4; return 4; } } @@ -1934,7 +2154,7 @@ int TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, T } // rule 9 - if (type.getBasicType() == EbtStruct) { + if (type.getBasicType() == EbtStruct || type.getBasicType() == EbtBlock) { const TTypeList& memberList = *type.getStruct(); size = 0; @@ -2001,9 +2221,9 @@ int TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, T } // To aid the basic HLSL rule about crossing vec4 boundaries. -bool TIntermediate::improperStraddle(const TType& type, int size, int offset) +bool TIntermediate::improperStraddle(const TType& type, int size, int offset, bool vectorLike) { - if (! type.isVector() || type.isArray()) + if (! vectorLike || type.isArray()) return false; return size <= 16 ? offset / 16 != (offset + size - 1) / 16 @@ -2052,7 +2272,7 @@ int TIntermediate::getScalarAlignment(const TType& type, int& size, int& stride, if (type.isVector()) { int scalarAlign = getBaseAlignmentScalar(type, size); - + size *= type.getVectorSize(); return scalarAlign; } @@ -2073,7 +2293,7 @@ int TIntermediate::getScalarAlignment(const TType& type, int& size, int& stride, assert(0); // all cases should be covered above size = 1; - return 1; + return 1; } int TIntermediate::getMemberAlignment(const TType& type, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor) @@ -2155,17 +2375,16 @@ int TIntermediate::computeBufferReferenceTypeSize(const TType& type) return size; } -#ifndef GLSLANG_WEB bool TIntermediate::isIoResizeArray(const TType& type, EShLanguage language) { return type.isArray() && ((language == EShLangGeometry && type.getQualifier().storage == EvqVaryingIn) || - (language == EShLangTessControl && type.getQualifier().storage == EvqVaryingOut && + (language == EShLangTessControl && (type.getQualifier().storage == EvqVaryingIn || type.getQualifier().storage == EvqVaryingOut) && ! type.getQualifier().patch) || + (language == EShLangTessEvaluation && type.getQualifier().storage == EvqVaryingIn) || (language == EShLangFragment && type.getQualifier().storage == EvqVaryingIn && - type.getQualifier().pervertexNV) || - (language == EShLangMeshNV && type.getQualifier().storage == EvqVaryingOut && + (type.getQualifier().pervertexNV || type.getQualifier().pervertexEXT)) || + (language == EShLangMesh && type.getQualifier().storage == EvqVaryingOut && !type.getQualifier().perTaskNV)); } -#endif // not GLSLANG_WEB } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/localintermediate.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/localintermediate.h index 6aa9399dc..2a24cdaf7 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/localintermediate.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/localintermediate.h @@ -43,11 +43,12 @@ #include "../Public/ShaderLang.h" #include "Versions.h" +#include +#include +#include +#include #include #include -#include -#include -#include class TInfoSink; @@ -122,8 +123,10 @@ struct TRange { // within the same location range, component range, and index value. Locations don't alias unless // all other dimensions of their range overlap. struct TIoRange { - TIoRange(TRange location, TRange component, TBasicType basicType, int index) - : location(location), component(component), basicType(basicType), index(index) { } + TIoRange(TRange location, TRange component, TBasicType basicType, int index, bool centroid, bool smooth, bool flat) + : location(location), component(component), basicType(basicType), index(index), centroid(centroid), smooth(smooth), flat(flat) + { + } bool overlap(const TIoRange& rhs) const { return location.overlap(rhs.location) && component.overlap(rhs.component) && index == rhs.index; @@ -132,6 +135,9 @@ struct TIoRange { TRange component; TBasicType basicType; int index; + bool centroid; + bool smooth; + bool flat; }; // An offset range is a 2-D rectangle; the set of (binding, offset) pairs all lying @@ -147,7 +153,6 @@ struct TOffsetRange { TRange offset; }; -#ifndef GLSLANG_WEB // Things that need to be tracked per xfb buffer. struct TXfbBuffer { TXfbBuffer() : stride(TQualifier::layoutXfbStrideEnd), implicitStride(0), contains64BitType(false), @@ -159,7 +164,6 @@ struct TXfbBuffer { bool contains32BitType; bool contains16BitType; }; -#endif // Track a set of strings describing how the module was processed. // This includes command line options, transforms, etc., ideally inclusive enough @@ -225,6 +229,16 @@ enum ComputeDerivativeMode { LayoutDerivativeGroupLinear, // derivative_group_linearNV }; +// +// Status type on AST level. Some uncalled status or functions would be reset in call graph. +// Currently we will keep status set by explicitly declared layout or variable decl. +// +enum AstRefType { + AstRefTypeVar, // Status set by variable decl + AstRefTypeFunc, // Status set by function decl + AstRefTypeLayout, // Status set by layout decl +}; + class TIdMaps { public: TMap& operator[](long long i) { return maps[i]; } @@ -283,33 +297,38 @@ class TIntermediate { public: explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) : language(l), -#ifndef GLSLANG_ANGLE profile(p), version(v), -#endif - treeRoot(0), + treeRoot(nullptr), resources(TBuiltInResource{}), numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false), invertY(false), + dxPositionW(false), + enhancedMsgs(false), + debugInfo(false), useStorageBuffer(false), invariantAll(false), nanMinMaxClamp(false), depthReplacing(false), + stencilReplacing(false), uniqueId(0), globalUniformBlockName(""), atomicCounterBlockName(""), globalUniformBlockSet(TQualifier::layoutSetEnd), globalUniformBlockBinding(TQualifier::layoutBindingEnd), - atomicCounterBlockSet(TQualifier::layoutSetEnd) -#ifndef GLSLANG_WEB - , + atomicCounterBlockSet(TQualifier::layoutSetEnd), implicitThisName("@this"), implicitCounterName("@count"), source(EShSourceNone), useVulkanMemoryModel(false), invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone), - pixelCenterInteger(false), originUpperLeft(false), + pixelCenterInteger(false), originUpperLeft(false),texCoordBuiltinRedeclared(false), vertexSpacing(EvsNone), vertexOrder(EvoNone), interlockOrdering(EioNone), pointMode(false), earlyFragmentTests(false), - postDepthCoverage(false), depthLayout(EldNone), + postDepthCoverage(false), earlyAndLateFragmentTestsAMD(false), + nonCoherentColorAttachmentReadEXT(false), + nonCoherentDepthAttachmentReadEXT(false), + nonCoherentStencilAttachmentReadEXT(false), + depthLayout(EldNone), + stencilLayout(ElsNone), hlslFunctionality1(false), blendEquations(0), xfbMode(false), multiStream(false), layoutOverrideCoverage(false), @@ -319,6 +338,7 @@ public: primitives(TQualifier::layoutNotSet), numTaskNVBlocks(0), layoutPrimitiveCulling(false), + numTaskEXTPayloads(0), autoMapBindings(false), autoMapLocations(false), flattenUniformArrays(false), @@ -330,11 +350,12 @@ public: needToLegalize(false), binaryDoubleOutput(false), subgroupUniformControlFlow(false), + maximallyReconverges(false), usePhysicalStorageBuffer(false), spirvRequirement(nullptr), spirvExecutionMode(nullptr), - uniformLocationBase(0) -#endif + uniformLocationBase(0), + quadDerivMode(false), reqFullQuadsMode(false) { localSize[0] = 1; localSize[1] = 1; @@ -345,23 +366,17 @@ public: localSizeSpecId[0] = TQualifier::layoutNotSet; localSizeSpecId[1] = TQualifier::layoutNotSet; localSizeSpecId[2] = TQualifier::layoutNotSet; -#ifndef GLSLANG_WEB xfbBuffers.resize(TQualifier::layoutXfbBufferEnd); shiftBinding.fill(0); -#endif } void setVersion(int v) { -#ifndef GLSLANG_ANGLE version = v; -#endif } void setProfile(EProfile p) { -#ifndef GLSLANG_ANGLE profile = p; -#endif } int getVersion() const { return version; } @@ -397,6 +412,9 @@ public: case EShTargetSpv_1_5: processes.addProcess("target-env spirv1.5"); break; + case EShTargetSpv_1_6: + processes.addProcess("target-env spirv1.6"); + break; default: processes.addProcess("target-env spirvUnknown"); break; @@ -415,6 +433,9 @@ public: case EShTargetVulkan_1_2: processes.addProcess("target-env vulkan1.2"); break; + case EShTargetVulkan_1_3: + processes.addProcess("target-env vulkan1.3"); + break; default: processes.addProcess("target-env vulkanUnknown"); break; @@ -452,6 +473,12 @@ public: const std::string& getEntryPointName() const { return entryPointName; } const std::string& getEntryPointMangledName() const { return entryPointMangledName; } + void setDebugInfo(bool debuginfo) + { + debugInfo = debuginfo; + } + bool getDebugInfo() const { return debugInfo; } + void setInvertY(bool invert) { invertY = invert; @@ -460,6 +487,20 @@ public: } bool getInvertY() const { return invertY; } + void setDxPositionW(bool dxPosW) + { + dxPositionW = dxPosW; + if (dxPositionW) + processes.addProcess("dx-position-w"); + } + bool getDxPositionW() const { return dxPositionW; } + + void setEnhancedMsgs() + { + enhancedMsgs = true; + } + bool getEnhancedMsgs() const { return enhancedMsgs && getSource() == EShSourceGlsl; } + #ifdef ENABLE_HLSL void setSource(EShSource s) { source = s; } EShSource getSource() const { return source; } @@ -494,6 +535,8 @@ public: TOperator mapTypeToConstructorOp(const TType&) const; TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right); TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&); + TIntermAggregate* mergeAggregate(TIntermNode* left, TIntermNode* right); + TIntermAggregate* mergeAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&); TIntermAggregate* makeAggregate(TIntermNode* node); TIntermAggregate* makeAggregate(TIntermNode* node, const TSourceLoc&); TIntermAggregate* makeAggregate(const TSourceLoc&); @@ -539,7 +582,8 @@ public: TIntermTyped* foldSwizzle(TIntermTyped* node, TSwizzleSelectors& fields, const TSourceLoc&); // Tree ops - static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay , bool BufferReferenceOk = false); + static const TIntermTyped* traverseLValueBase(const TIntermTyped*, bool swizzleOkay, bool bufferReferenceOk = false, + std::function proc = {}); // Linkage related void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&); @@ -565,6 +609,8 @@ public: bool isInvariantAll() const { return invariantAll; } void setDepthReplacing() { depthReplacing = true; } bool isDepthReplacing() const { return depthReplacing; } + void setStencilReplacing() { stencilReplacing = true; } + bool isStencilReplacing() const { return stencilReplacing; } bool setLocalSize(int dim, int size) { if (localSizeNotDefault[dim]) @@ -594,34 +640,6 @@ public: localSizeSpecId[1] != TQualifier::layoutNotSet || localSizeSpecId[2] != TQualifier::layoutNotSet; } -#ifdef GLSLANG_WEB - void output(TInfoSink&, bool tree) { } - - bool isEsProfile() const { return false; } - bool getXfbMode() const { return false; } - bool isMultiStream() const { return false; } - TLayoutGeometry getOutputPrimitive() const { return ElgNone; } - bool getPostDepthCoverage() const { return false; } - bool getEarlyFragmentTests() const { return false; } - TLayoutDepth getDepth() const { return EldNone; } - bool getPixelCenterInteger() const { return false; } - void setOriginUpperLeft() { } - bool getOriginUpperLeft() const { return true; } - TInterlockOrdering getInterlockOrdering() const { return EioNone; } - - bool getAutoMapBindings() const { return false; } - bool getAutoMapLocations() const { return false; } - int getNumPushConstants() const { return 0; } - void addShaderRecordCount() { } - void addTaskNVCount() { } - void setUseVulkanMemoryModel() { } - bool usingVulkanMemoryModel() const { return false; } - bool usingPhysicalStorageBuffer() const { return false; } - bool usingVariablePointers() const { return false; } - unsigned getXfbStride(int buffer) const { return 0; } - bool hasLayoutDerivativeModeNone() const { return false; } - ComputeDerivativeMode getLayoutDerivativeModeNone() const { return LayoutDerivativeNone; } -#else void output(TInfoSink&, bool tree); bool isEsProfile() const { return profile == EEsProfile; } @@ -711,11 +729,75 @@ public: usePhysicalStorageBuffer = true; } bool usingPhysicalStorageBuffer() const { return usePhysicalStorageBuffer; } + void setReplicatedComposites() + { + useReplicatedComposites = true; + } + bool usingReplicatedComposites() const { return useReplicatedComposites; } void setUseVariablePointers() { useVariablePointers = true; processes.addProcess("use-variable-pointers"); } + // Set the global flag for bindless texture + void setBindlessTextureMode(const TString& currentCaller, AstRefType type) + { + // When type is not func, currentCaller should be "" (empty string) + bindlessTextureModeCaller[currentCaller] = type; + } + + // Get the global flag for bindless texture + bool getBindlessTextureMode() const + { + return (bindlessTextureModeCaller.size() > 0); + } + + // Set the global flag for bindless image + void setBindlessImageMode(const TString& currentCaller, AstRefType type) + { + // When type is not func, currentCaller should be "" (empty string) + bindlessImageModeCaller[currentCaller] = type; + } + + // Get the global flag for bindless image + bool getBindlessImageMode() const + { + return (bindlessImageModeCaller.size() > 0); + } + + // Get the global flag for bindless texture + bool resetTopLevelUncalledStatus(const TString& deadCaller) + { + // For reflection collection purpose, currently uniform layout setting and some + // flags introduced by variables (IO, global, etc,.) won't be reset here. + // Remove each global status (AST top level) introduced by uncalled functions. + // If a status is set by several functions, keep those which in call graph. + bool result = false; + + // For two types of bindless mode flag, we would only reset which is set by an uncalled function. + // If one status flag's key in caller vec is empty, it should be come from a non-function setting. + if (!bindlessTextureModeCaller.empty()) { + auto caller = bindlessTextureModeCaller.find(deadCaller); + if (caller != bindlessTextureModeCaller.end() && bindlessTextureModeCaller[deadCaller] == AstRefTypeFunc) { + bindlessTextureModeCaller.erase(caller); + result = true; + } + } + if (!bindlessImageModeCaller.empty()) { + auto caller = bindlessImageModeCaller.find(deadCaller); + if (caller != bindlessImageModeCaller.end() && bindlessImageModeCaller[deadCaller] == AstRefTypeFunc) { + bindlessImageModeCaller.erase(caller); + result = true; + } + } + return result; + } + + bool getBindlessMode() const + { + return getBindlessTextureMode() || getBindlessImageMode(); + } + bool usingVariablePointers() const { return useVariablePointers; } #ifdef ENABLE_HLSL @@ -731,6 +813,7 @@ public: int getNumPushConstants() const { return numPushConstants; } void addShaderRecordCount() { ++numShaderRecordBlocks; } void addTaskNVCount() { ++numTaskNVBlocks; } + void addTaskPayloadEXTCount() { ++numTaskEXTPayloads; } bool setInvocations(int i) { @@ -786,6 +869,10 @@ public: void setXfbMode() { xfbMode = true; } bool getXfbMode() const { return xfbMode; } + void setQuadDerivMode(bool mode = true) { quadDerivMode = mode; } + bool getQuadDerivMode() const { return quadDerivMode; } + void setReqFullQuadsMode(bool mode = true) { reqFullQuadsMode = mode; } + bool getReqFullQuadsMode() const { return reqFullQuadsMode; } void setMultiStream() { multiStream = true; } bool isMultiStream() const { return multiStream; } bool setOutputPrimitive(TLayoutGeometry p) @@ -796,10 +883,18 @@ public: return true; } TLayoutGeometry getOutputPrimitive() const { return outputPrimitive; } + void setNonCoherentColorAttachmentReadEXT() { nonCoherentColorAttachmentReadEXT = true; } + bool getNonCoherentColorAttachmentReadEXT() const { return nonCoherentColorAttachmentReadEXT; } + void setNonCoherentDepthAttachmentReadEXT() { nonCoherentDepthAttachmentReadEXT = true; } + bool getNonCoherentDepthAttachmentReadEXT() const { return nonCoherentDepthAttachmentReadEXT; } + void setNonCoherentStencilAttachmentReadEXT() { nonCoherentStencilAttachmentReadEXT = true; } + bool getNonCoherentStencilAttachmentReadEXT() const { return nonCoherentStencilAttachmentReadEXT; } void setPostDepthCoverage() { postDepthCoverage = true; } bool getPostDepthCoverage() const { return postDepthCoverage; } void setEarlyFragmentTests() { earlyFragmentTests = true; } + void setEarlyAndLateFragmentTestsAMD() { earlyAndLateFragmentTestsAMD = true; } bool getEarlyFragmentTests() const { return earlyFragmentTests; } + bool getEarlyAndLateFragmentTestsAMD() const { return earlyAndLateFragmentTestsAMD; } bool setDepth(TLayoutDepth d) { if (depthLayout != EldNone) @@ -807,11 +902,21 @@ public: depthLayout = d; return true; } + bool setStencil(TLayoutStencil s) + { + if (stencilLayout != ElsNone) + return stencilLayout == s; + stencilLayout = s; + return true; + } TLayoutDepth getDepth() const { return depthLayout; } + TLayoutStencil getStencil() const { return stencilLayout; } void setOriginUpperLeft() { originUpperLeft = true; } bool getOriginUpperLeft() const { return originUpperLeft; } void setPixelCenterInteger() { pixelCenterInteger = true; } bool getPixelCenterInteger() const { return pixelCenterInteger; } + void setTexCoordRedeclared() { texCoordBuiltinRedeclared = true; } + bool getTexCoordRedeclared() const { return texCoordBuiltinRedeclared; } void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); } unsigned int getBlendEquations() const { return blendEquations; } bool setXfbBufferStride(int buffer, unsigned stride) @@ -874,6 +979,9 @@ public: void setSubgroupUniformControlFlow() { subgroupUniformControlFlow = true; } bool getSubgroupUniformControlFlow() const { return subgroupUniformControlFlow; } + void setMaximallyReconverges() { maximallyReconverges = true; } + bool getMaximallyReconverges() const { return maximallyReconverges; } + // GL_EXT_spirv_intrinsics void insertSpirvRequirement(const TSpirvRequirement* spirvReq); bool hasSpirvRequirement() const { return spirvRequirement != nullptr; } @@ -882,7 +990,6 @@ public: void insertSpirvExecutionModeId(int executionMode, const TIntermAggregate* args); bool hasSpirvExecutionMode() const { return spirvExecutionMode != nullptr; } const TSpirvExecutionMode& getSpirvExecutionMode() const { return *spirvExecutionMode; } -#endif // GLSLANG_WEB void addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing) { @@ -960,7 +1067,7 @@ public: static int getBaseAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor); static int getScalarAlignment(const TType&, int& size, int& stride, bool rowMajor); static int getMemberAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor); - static bool improperStraddle(const TType& type, int size, int offset); + static bool improperStraddle(const TType& type, int size, int offset, bool vectorLike); static void updateOffset(const TType& parentType, const TType& memberType, int& offset, int& memberSize); static int getOffset(const TType& type, int index); static int getBlockSize(const TType& blockType); @@ -989,12 +1096,6 @@ public: void setUniqueId(unsigned long long id) { uniqueId = id; } // Certain explicit conversions are allowed conditionally -#ifdef GLSLANG_WEB - bool getArithemeticInt8Enabled() const { return false; } - bool getArithemeticInt16Enabled() const { return false; } - bool getArithemeticFloat16Enabled() const { return false; } - void updateNumericFeature(TNumericFeatures::feature f, bool on) { } -#else bool getArithemeticInt8Enabled() const { return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) || numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8); @@ -1012,12 +1113,11 @@ public: } void updateNumericFeature(TNumericFeatures::feature f, bool on) { on ? numericFeatures.insert(f) : numericFeatures.erase(f); } -#endif protected: TIntermSymbol* addSymbol(long long Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&); - void error(TInfoSink& infoSink, const char*); - void warn(TInfoSink& infoSink, const char*); + void error(TInfoSink& infoSink, const char*, EShLanguage unitStage = EShLangCount); + void warn(TInfoSink& infoSink, const char*, EShLanguage unitStage = EShLangCount); void mergeCallGraphs(TInfoSink&, TIntermediate&); void mergeModes(TInfoSink&, TIntermediate&); void mergeTrees(TInfoSink&, TIntermediate&); @@ -1054,13 +1154,8 @@ protected: typedef std::list TGraph; TGraph callGraph; -#ifdef GLSLANG_ANGLE - const EProfile profile = ECoreProfile; - const int version = 450; -#else EProfile profile; // source profile int version; // source version -#endif SpvVersion spvVersion; TIntermNode* treeRoot; std::set requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them @@ -1070,10 +1165,14 @@ protected: int numPushConstants; bool recursive; bool invertY; + bool dxPositionW; + bool enhancedMsgs; + bool debugInfo; bool useStorageBuffer; bool invariantAll; bool nanMinMaxClamp; // true if desiring min/max/clamp to favor non-NaN over NaN bool depthReplacing; + bool stencilReplacing; int localSize[3]; bool localSizeNotDefault[3]; int localSizeSpecId[3]; @@ -1085,7 +1184,6 @@ protected: unsigned int globalUniformBlockBinding; unsigned int atomicCounterBlockSet; -#ifndef GLSLANG_WEB public: const char* const implicitThisName; const char* const implicitCounterName; @@ -1098,13 +1196,19 @@ protected: TLayoutGeometry outputPrimitive; bool pixelCenterInteger; bool originUpperLeft; + bool texCoordBuiltinRedeclared; TVertexSpacing vertexSpacing; TVertexOrder vertexOrder; TInterlockOrdering interlockOrdering; bool pointMode; bool earlyFragmentTests; bool postDepthCoverage; + bool earlyAndLateFragmentTestsAMD; + bool nonCoherentColorAttachmentReadEXT; + bool nonCoherentDepthAttachmentReadEXT; + bool nonCoherentStencilAttachmentReadEXT; TLayoutDepth depthLayout; + TLayoutStencil stencilLayout; bool hlslFunctionality1; int blendEquations; // an 'or'ing of masks of shifts of TBlendEquationShift bool xfbMode; @@ -1117,6 +1221,7 @@ protected: int primitives; int numTaskNVBlocks; bool layoutPrimitiveCulling; + int numTaskEXTPayloads; // Base shift values std::array shiftBinding; @@ -1140,24 +1245,30 @@ protected: bool needToLegalize; bool binaryDoubleOutput; bool subgroupUniformControlFlow; + bool maximallyReconverges; bool usePhysicalStorageBuffer; + bool useReplicatedComposites { false }; TSpirvRequirement* spirvRequirement; TSpirvExecutionMode* spirvExecutionMode; - + std::map bindlessTextureModeCaller; + std::map bindlessImageModeCaller; std::unordered_map uniformLocationOverrides; int uniformLocationBase; + bool quadDerivMode; + bool reqFullQuadsMode; TNumericFeatures numericFeatures; -#endif std::unordered_map blockBackingOverrides; std::unordered_set usedConstantId; // specialization constant ids used std::vector usedAtomics; // sets of bindings used by atomic counters - std::vector usedIo[4]; // sets of used locations, one for each of in, out, uniform, and buffers - std::vector usedIoRT[2]; // sets of used location, one for rayPayload/rayPayloadIN and other - // for callableData/callableDataIn + std::vector usedIo[5]; // sets of used locations, one for each of in, out, uniform, and buffers + std::vector usedIoRT[4]; // sets of used location, one for rayPayload/rayPayloadIN, + // one for callableData/callableDataIn, one for hitObjectAttributeNV and + // one for shaderrecordhitobjectNV // set of names of statically read/written I/O that might need extra checking std::set ioAccessed; + // source code of shader, useful as part of debug information std::string sourceFile; std::string sourceText; diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseConst.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseConst.cpp index 6c182991f..835097234 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseConst.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseConst.cpp @@ -198,7 +198,7 @@ void TConstTraverser::visitConstantUnion(TIntermConstantUnion* node) bool TIntermediate::parseConstTree(TIntermNode* root, TConstUnionArray unionArray, TOperator constructorType, const TType& t, bool singleConstantParam) { - if (root == 0) + if (root == nullptr) return false; TConstTraverser it(unionArray, singleConstantParam, constructorType, t); diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseVersions.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseVersions.h index 7248354e4..5c77e42ce 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseVersions.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/parseVersions.h @@ -58,72 +58,18 @@ public: const SpvVersion& spvVersion, EShLanguage language, TInfoSink& infoSink, bool forwardCompatible, EShMessages messages) : -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) forwardCompatible(forwardCompatible), profile(profile), -#endif infoSink(infoSink), version(version), language(language), spvVersion(spvVersion), - intermediate(interm), messages(messages), numErrors(0), currentScanner(0) { } + intermediate(interm), messages(messages), numErrors(0), currentScanner(nullptr) { } virtual ~TParseVersions() { } void requireStage(const TSourceLoc&, EShLanguageMask, const char* featureDesc); void requireStage(const TSourceLoc&, EShLanguage, const char* featureDesc); -#ifdef GLSLANG_WEB - const EProfile profile = EEsProfile; - bool isEsProfile() const { return true; } - void requireProfile(const TSourceLoc& loc, int profileMask, const char* featureDesc) - { - if (! (EEsProfile & profileMask)) - error(loc, "not supported with this profile:", featureDesc, ProfileName(profile)); - } - void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, int numExtensions, - const char* const extensions[], const char* featureDesc) - { - if ((EEsProfile & profileMask) && (minVersion == 0 || version < minVersion)) - error(loc, "not supported for this version or the enabled extensions", featureDesc, ""); - } - void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, const char* extension, - const char* featureDesc) - { - profileRequires(loc, profileMask, minVersion, extension ? 1 : 0, &extension, featureDesc); - } - void initializeExtensionBehavior() { } - void checkDeprecated(const TSourceLoc&, int queryProfiles, int depVersion, const char* featureDesc) { } - void requireNotRemoved(const TSourceLoc&, int queryProfiles, int removedVersion, const char* featureDesc) { } - void requireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], - const char* featureDesc) { } - void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], - const char* featureDesc) { } - TExtensionBehavior getExtensionBehavior(const char*) { return EBhMissing; } - bool extensionTurnedOn(const char* const extension) { return false; } - bool extensionsTurnedOn(int numExtensions, const char* const extensions[]) { return false; } - void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { } - void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { } - void checkExtensionStage(const TSourceLoc&, const char* const extension) { } - void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior) { } - void fullIntegerCheck(const TSourceLoc&, const char* op) { } - void doubleCheck(const TSourceLoc&, const char* op) { } - bool float16Arithmetic() { return false; } - void requireFloat16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { } - bool int16Arithmetic() { return false; } - void requireInt16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { } - bool int8Arithmetic() { return false; } - void requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { } - void int64Check(const TSourceLoc&, const char* op, bool builtIn = false) { } - void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false) { } - void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false) { } - bool relaxedErrors() const { return false; } - bool suppressWarnings() const { return true; } - bool isForwardCompatible() const { return false; } -#else -#ifdef GLSLANG_ANGLE - const bool forwardCompatible = true; - const EProfile profile = ECoreProfile; -#else + bool forwardCompatible; // true if errors are to be given for use of deprecated features EProfile profile; // the declared profile in the shader (core by default) -#endif bool isEsProfile() const { return profile == EEsProfile; } void requireProfile(const TSourceLoc& loc, int profileMask, const char* featureDesc); void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, int numExtensions, @@ -137,6 +83,11 @@ public: const char* featureDesc); virtual void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc); + template + constexpr void ppRequireExtensions(const TSourceLoc& loc, Container extensions, const char* featureDesc) { + ppRequireExtensions(loc, static_cast(extensions.size()), extensions.data(), featureDesc); + } + virtual TExtensionBehavior getExtensionBehavior(const char*); virtual bool extensionTurnedOn(const char* const extension); virtual bool extensionsTurnedOn(int numExtensions, const char* const extensions[]); @@ -167,29 +118,19 @@ public: virtual void explicitInt32Check(const TSourceLoc&, const char* op, bool builtIn = false); virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false); virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false); - virtual void fcoopmatCheck(const TSourceLoc&, const char* op, bool builtIn = false); - virtual void intcoopmatCheck(const TSourceLoc&, const char *op, bool builtIn = false); + virtual void fcoopmatCheckNV(const TSourceLoc&, const char* op, bool builtIn = false); + virtual void intcoopmatCheckNV(const TSourceLoc&, const char *op, bool builtIn = false); + virtual void coopmatCheck(const TSourceLoc&, const char* op, bool builtIn = false); bool relaxedErrors() const { return (messages & EShMsgRelaxedErrors) != 0; } bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; } bool isForwardCompatible() const { return forwardCompatible; } -#endif // GLSLANG_WEB + virtual void spvRemoved(const TSourceLoc&, const char* op); virtual void vulkanRemoved(const TSourceLoc&, const char* op); virtual void requireVulkan(const TSourceLoc&, const char* op); virtual void requireSpv(const TSourceLoc&, const char* op); virtual void requireSpv(const TSourceLoc&, const char *op, unsigned int version); - -#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL) - void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { addError(); } - void C_DECL warn(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { } - void C_DECL ppError(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { addError(); } - void C_DECL ppWarn(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { } -#else virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) = 0; virtual void C_DECL warn(const TSourceLoc&, const char* szReason, const char* szToken, @@ -198,7 +139,6 @@ public: const char* szExtraInfoFormat, ...) = 0; virtual void C_DECL ppWarn(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) = 0; -#endif void addError() { ++numErrors; } int getNumErrors() const { return numErrors; } @@ -231,6 +171,7 @@ public: protected: TMap extensionBehavior; // for each extension string, what its current behavior is TMap extensionMinSpv; // for each extension string, store minimum spirv required + TVector spvUnsupportedExt; // for extensions reserved for spv usage. EShMessages messages; // errors/warnings/rule-sets int numErrors; // number of compile-time errors encountered TInputScanner* currentScanner; diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp index aa1e0d745..5f18c4e92 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -378,8 +378,6 @@ namespace { int op_cmpl(int a) { return ~a; } int op_not(int a) { return !a; } -}; - struct TBinop { int token, precedence, (*op)(int, int); } binop[] = { @@ -412,6 +410,8 @@ struct TUnop { { '!', op_not }, }; +} // anonymous namespace + #define NUM_ELEMENTS(A) (sizeof(A) / sizeof(A[0])) int TPpContext::eval(int token, int precedence, bool shortCircuit, int& res, bool& err, TPpToken* ppToken) @@ -736,7 +736,6 @@ int TPpContext::CPPline(TPpToken* ppToken) parseContext.setCurrentLine(lineRes); if (token != '\n') { -#ifndef GLSLANG_WEB if (token == PpAtomConstString) { parseContext.ppRequireExtensions(directiveLoc, 1, &E_GL_GOOGLE_cpp_style_line_directive, "filename-based #line"); // We need to save a copy of the string instead of pointing @@ -746,9 +745,7 @@ int TPpContext::CPPline(TPpToken* ppToken) parseContext.setCurrentSourceName(sourceName); hasFile = true; token = scanToken(ppToken); - } else -#endif - { + } else { token = eval(token, MIN_PRECEDENCE, false, fileRes, fileErr, ppToken); if (! fileErr) { parseContext.setCurrentString(fileRes); @@ -974,17 +971,16 @@ int TPpContext::readCPPline(TPpToken* ppToken) case PpAtomLine: token = CPPline(ppToken); break; -#ifndef GLSLANG_WEB case PpAtomInclude: if(!parseContext.isReadingHLSL()) { - parseContext.ppRequireExtensions(ppToken->loc, 1, &E_GL_GOOGLE_include_directive, "#include"); + const std::array exts = { E_GL_GOOGLE_include_directive, E_GL_ARB_shading_language_include }; + parseContext.ppRequireExtensions(ppToken->loc, exts, "#include"); } token = CPPinclude(ppToken); break; case PpAtomPragma: token = CPPpragma(ppToken); break; -#endif case PpAtomUndef: token = CPPundef(ppToken); break; @@ -1126,9 +1122,6 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken) pasting = true; } - // HLSL does expand macros before concatenation - if (pasting && pp->parseContext.isReadingHLSL()) - pasting = false; // TODO: preprocessor: properly handle whitespace (or lack of it) between tokens when expanding if (token == PpAtomIdentifier) { @@ -1138,9 +1131,12 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken) break; if (i >= 0) { TokenStream* arg = expandedArgs[i]; - if (arg == nullptr || pasting) + bool expanded = !!arg && !pasting; + // HLSL does expand macros before concatenation + if (arg == nullptr || (pasting && !pp->parseContext.isReadingHLSL()) ) { arg = args[i]; - pp->pushTokenStreamInput(*arg, prepaste); + } + pp->pushTokenStreamInput(*arg, prepaste, expanded); return pp->scanToken(ppToken); } @@ -1183,6 +1179,9 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b { ppToken->space = false; int macroAtom = atomStrings.getAtom(ppToken->name); + if (ppToken->fullyExpanded) + return MacroExpandNotStarted; + switch (macroAtom) { case PpAtomLineMacro: // Arguments which are macro have been replaced in the first stage. @@ -1214,8 +1213,10 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b MacroSymbol* macro = macroAtom == 0 ? nullptr : lookupMacroDef(macroAtom); // no recursive expansions - if (macro != nullptr && macro->busy) + if (macro != nullptr && macro->busy) { + ppToken->fullyExpanded = true; return MacroExpandNotStarted; + } // not expanding undefined macros if ((macro == nullptr || macro->undef) && ! expandUndef) diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp index 1363ce2be..70f511978 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp @@ -85,7 +85,7 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace glslang { TPpContext::TPpContext(TParseContextBase& pc, const std::string& rootFileName, TShader::Includer& inclr) : - preamble(0), strings(0), previous_token('\n'), parseContext(pc), includer(inclr), inComment(false), + preamble(nullptr), strings(nullptr), previous_token('\n'), parseContext(pc), includer(inclr), inComment(false), rootFileName(rootFileName), currentSourceFile(rootFileName), disableEscapeSequences(false) diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.h index 714b5eadb..1ec30491c 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpContext.h @@ -86,11 +86,6 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../ParseHelper.h" #include "PpTokens.h" -/* windows only pragma */ -#ifdef _MSC_VER - #pragma warning(disable : 4127) -#endif - namespace glslang { class TPpToken { @@ -102,6 +97,7 @@ public: i64val = 0; loc.init(); name[0] = 0; + fullyExpanded = false; } // Used for comparing macro definitions, so checks what is relevant for that. @@ -117,6 +113,8 @@ public: // True if a space (for white space or a removed comment) should also be // recognized, in front of the token returned: bool space; + + bool fullyExpanded; // Numeric value of the token: union { int ival; @@ -217,6 +215,7 @@ public: virtual bool peekContinuedPasting(int) { return false; } // true when non-spaced tokens can paste virtual bool endOfReplacementList() { return false; } // true when at the end of a macro replacement list (RHS of #define) virtual bool isMacroInput() { return false; } + virtual bool isStringInput() { return false; } // Will be called when we start reading tokens from this instance virtual void notifyActivated() {} @@ -357,7 +356,8 @@ protected: // Scanner data: int previous_token; TParseContextBase& parseContext; - + std::vector lastLineTokens; + std::vector lastLineTokenLocs; // Get the next token from *stack* of input sources, popping input sources // that are out of tokens, down until an input source is found that has a token. // Return EndOfInput when there are no more tokens to be found by doing this. @@ -371,7 +371,31 @@ protected: break; popInput(); } - + if (!inputStack.empty() && inputStack.back()->isStringInput()) { + if (token == '\n') { + bool seenNumSign = false; + for (int i = 0; i < (int)lastLineTokens.size() - 1;) { + int curPos = i; + int curToken = lastLineTokens[i++]; + if (curToken == '#' && lastLineTokens[i] == '#') { + curToken = PpAtomPaste; + i++; + } + if (curToken == '#') { + if (seenNumSign) { + parseContext.ppError(lastLineTokenLocs[curPos], "(#) can be preceded in its line only by spaces or horizontal tabs", "#", ""); + } else { + seenNumSign = true; + } + } + } + lastLineTokens.clear(); + lastLineTokenLocs.clear(); + } else { + lastLineTokens.push_back(token); + lastLineTokenLocs.push_back(ppToken->loc); + } + } return token; } int getChar() { return inputStack.back()->getch(); } @@ -475,16 +499,27 @@ protected: // // From PpTokens.cpp // - void pushTokenStreamInput(TokenStream&, bool pasting = false); + void pushTokenStreamInput(TokenStream&, bool pasting = false, bool expanded = false); void UngetToken(int token, TPpToken*); class tTokenInput : public tInput { public: - tTokenInput(TPpContext* pp, TokenStream* t, bool prepasting) : + tTokenInput(TPpContext* pp, TokenStream* t, bool prepasting, bool expanded) : tInput(pp), tokens(t), - lastTokenPastes(prepasting) { } - virtual int scan(TPpToken *ppToken) override { return tokens->getToken(pp->parseContext, ppToken); } + lastTokenPastes(prepasting), + preExpanded(expanded) { } + virtual int scan(TPpToken *ppToken) override { + int token = tokens->getToken(pp->parseContext, ppToken); + ppToken->fullyExpanded = preExpanded; + if (tokens->atEnd() && token == PpAtomIdentifier) { + int macroAtom = pp->atomStrings.getAtom(ppToken->name); + MacroSymbol* macro = macroAtom == 0 ? nullptr : pp->lookupMacroDef(macroAtom); + if (macro && macro->functionLike) + ppToken->fullyExpanded = false; + } + return token; + } virtual int getch() override { assert(0); return EndOfInput; } virtual void ungetch() override { assert(0); } virtual bool peekPasting() override { return tokens->peekTokenizedPasting(lastTokenPastes); } @@ -492,6 +527,7 @@ protected: protected: TokenStream* tokens; bool lastTokenPastes; // true if the last token in the input is to be pasted, rather than consumed as a token + bool preExpanded; }; class tUngotTokenInput : public tInput { @@ -512,7 +548,7 @@ protected: public: tStringInput(TPpContext* pp, TInputScanner& i) : tInput(pp), input(&i) { } virtual int scan(TPpToken*) override; - + bool isStringInput() override { return true; } // Scanner used to get source stream characters. // - Escaped newlines are handled here, invisibly to the caller. // - All forms of newline are handled, and turned into just a '\n'. diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp index ad1179200..49dafa59a 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp @@ -3,6 +3,7 @@ // Copyright (C) 2013 LunarG, Inc. // Copyright (C) 2017 ARM Limited. // Copyright (C) 2015-2018 Google, Inc. +// Copyright (c) 2023, Mobica Limited // // All rights reserved. // @@ -219,7 +220,9 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken) } if (ch >= '0' && ch <= '9') { while (ch >= '0' && ch <= '9') { - exponent = exponent * 10 + (ch - '0'); + if (exponent < 500) { + exponent = exponent * 10 + (ch - '0'); + } saveName(ch); ch = getChar(); } @@ -259,7 +262,6 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken) // Suffix: bool isDouble = false; bool isFloat16 = false; -#ifndef GLSLANG_WEB if (ch == 'l' || ch == 'L') { if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl) parseContext.doubleCheck(ppToken->loc, "double floating-point suffix"); @@ -299,14 +301,11 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken) isFloat16 = true; } } else -#endif if (ch == 'f' || ch == 'F') { -#ifndef GLSLANG_WEB if (ifdepth == 0) parseContext.profileRequires(ppToken->loc, EEsProfile, 300, nullptr, "floating-point suffix"); if (ifdepth == 0 && !parseContext.relaxedErrors()) parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix"); -#endif if (ifdepth == 0 && !hasDecimalOrExponent) parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", ""); saveName(ch); @@ -480,9 +479,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) E_GL_EXT_shader_explicit_arithmetic_types_int16 }; static const int Num_Int16_Extensions = sizeof(Int16_Extensions) / sizeof(Int16_Extensions[0]); - ppToken->ival = 0; - ppToken->i64val = 0; - ppToken->space = false; + ppToken->clear(); ch = getch(); for (;;) { while (ch == ' ' || ch == '\t') { @@ -551,7 +548,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ival = 0; do { - if (len < MaxTokenLength && ival <= 0x0fffffffffffffffull) { + if (len < MaxTokenLength && ival <= 0x7fffffffffffffffull) { ppToken->name[len++] = (char)ch; if (ch >= '0' && ch <= '9') { ii = ch - '0'; @@ -584,7 +581,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->name[len++] = (char)ch; isUnsigned = true; -#ifndef GLSLANG_WEB int nextCh = getch(); if (nextCh == 'l' || nextCh == 'L') { if (len < MaxTokenLength) @@ -610,7 +606,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) if (len < MaxTokenLength) ppToken->name[len++] = (char)ch; isInt16 = true; -#endif } else ungetch(); ppToken->name[len] = '\0'; @@ -641,6 +636,108 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->ival = (int)ival; return isUnsigned ? PpAtomConstUint : PpAtomConstInt; } + } else if ((ch == 'b' || ch == 'B') && pp->parseContext.intermediate.getSource() == EShSourceHlsl) { + // must be binary + bool isUnsigned = false; + bool isInt64 = false; + bool isInt16 = false; + ppToken->name[len++] = (char)ch; + ch = getch(); + + // Check value + if ((ch == '0' || ch == '1')) + { + ival = 0; + do { + if (len < MaxTokenLength && ival <= 0x7fffffffffffffffull) { + ppToken->name[len++] = (char)ch; + if (ch == '0' || ch == '1') { + ii = ch - '0'; + } else { + pp->parseContext.ppError(ppToken->loc, "bad digit in binary literal", "", ""); + } + ival = (ival << 1) | ii; + } + else + { + if (! AlreadyComplained) { + if(len < MaxTokenLength) + pp->parseContext.ppError(ppToken->loc, "binary literal too big", "", ""); + else + pp->parseContext.ppError(ppToken->loc, "binary literal too long", "", ""); + AlreadyComplained = 1; + } + ival = 0xffffffffffffffffull; + } + ch = getch(); + } while (ch == '0' || ch == '1'); + } + else + { + pp->parseContext.ppError(ppToken->loc, "bad digit in binary literal", "", ""); + } + + // check type + if (ch == 'u' || ch == 'U') { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)ch; + isUnsigned = true; + + int nextCh = getch(); + if (nextCh == 'l' || nextCh == 'L') { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)nextCh; + isInt64 = true; + } else + ungetch(); + + nextCh = getch(); + if ((nextCh == 's' || nextCh == 'S') && + pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)nextCh; + isInt16 = true; + } else + ungetch(); + } else if (ch == 'l' || ch == 'L') { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)ch; + isInt64 = true; + } else if ((ch == 's' || ch == 'S') && + pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)ch; + isInt16 = true; + } else { + ungetch(); + } + ppToken->name[len] = '\0'; + + // Assign value + if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + if (pp->ifdepth == 0) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, + "64-bit binary literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int64_Extensions, Int64_Extensions, "64-bit binary literal"); + } + ppToken->i64val = ival; + return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64; + } else if (isInt16) { + if (pp->ifdepth == 0) { + if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, + "16-bit binary literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int16_Extensions, Int16_Extensions, "16-bit binary literal"); + } + } + ppToken->ival = (int)ival; + return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16; + } else { + ppToken->ival = (int)ival; + return isUnsigned ? PpAtomConstUint : PpAtomConstInt; + } } else { // could be octal integer or floating point, speculative pursue octal until it must be floating point @@ -692,7 +789,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->name[len++] = (char)ch; isUnsigned = true; -#ifndef GLSLANG_WEB int nextCh = getch(); if (nextCh == 'l' || nextCh == 'L') { if (len < MaxTokenLength) @@ -718,7 +814,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) if (len < MaxTokenLength) ppToken->name[len++] = (char)ch; isInt16 = true; -#endif } else ungetch(); ppToken->name[len] = '\0'; @@ -781,7 +876,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->name[len++] = (char)ch; isUnsigned = true; -#ifndef GLSLANG_WEB int nextCh = getch(); if (nextCh == 'l' || nextCh == 'L') { if (len < MaxTokenLength) @@ -807,7 +901,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) if (len < MaxTokenLength) ppToken->name[len++] = (char)ch; isInt16 = true; -#endif } else ungetch(); diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp index 7ed58703f..e6ee64cf9 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp @@ -85,9 +85,6 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif -#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) -#define snprintf sprintf_s -#endif #include #include @@ -116,17 +113,15 @@ int TPpContext::TokenStream::getToken(TParseContextBase& parseContext, TPpToken int atom = stream[currentPos++].get(*ppToken); ppToken->loc = parseContext.getCurrentLoc(); -#ifndef GLSLANG_WEB // Check for ##, unless the current # is the last character if (atom == '#') { if (peekToken('#')) { parseContext.requireProfile(ppToken->loc, ~EEsProfile, "token pasting (##)"); - parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, 0, "token pasting (##)"); + parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, nullptr, "token pasting (##)"); currentPos++; atom = PpAtomPaste; } } -#endif return atom; } @@ -195,9 +190,9 @@ bool TPpContext::TokenStream::peekUntokenizedPasting() return pasting; } -void TPpContext::pushTokenStreamInput(TokenStream& ts, bool prepasting) +void TPpContext::pushTokenStreamInput(TokenStream& ts, bool prepasting, bool expanded) { - pushInput(new tTokenInput(this, &ts, prepasting)); + pushInput(new tTokenInput(this, &ts, prepasting, expanded)); ts.reset(); } diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/propagateNoContraction.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/propagateNoContraction.cpp index 9def592ba..7b5cd03fa 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/propagateNoContraction.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/propagateNoContraction.cpp @@ -37,8 +37,6 @@ // propagate the 'noContraction' qualifier. // -#ifndef GLSLANG_WEB - #include "propagateNoContraction.h" #include @@ -423,7 +421,7 @@ getSymbolToDefinitionMappingAndPreciseSymbolIDs(const glslang::TIntermediate& in ReturnBranchNodeSet()); TIntermNode* root = intermediate.getTreeRoot(); - if (root == 0) + if (root == nullptr) return result_tuple; NodeMapping& symbol_definition_mapping = std::get<0>(result_tuple); @@ -865,6 +863,4 @@ void PropagateNoContraction(const glslang::TIntermediate& intermediate) precise_object_accesschains.erase(precise_object_accesschain); } } -}; - -#endif // GLSLANG_WEB +} diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.cpp b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.cpp index 9ea48c452..7e3160929 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.cpp @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #include "../Include/Common.h" #include "reflection.h" #include "LiveTraverser.h" @@ -682,7 +680,7 @@ public: } // For a binary operation indexing into an aggregate, chase down the base of the aggregate. - // Return 0 if the topology does not fit this situation. + // Return nullptr if the topology does not fit this situation. TIntermSymbol* findBase(const TIntermBinary* node) { TIntermSymbol *base = node->getLeft()->getAsSymbolNode(); @@ -706,69 +704,73 @@ public: case EbtFloat: switch ((int)sampler.dim) { case Esd1D: - switch ((int)sampler.shadow) { - case false: return sampler.arrayed ? GL_SAMPLER_1D_ARRAY : GL_SAMPLER_1D; - case true: return sampler.arrayed ? GL_SAMPLER_1D_ARRAY_SHADOW : GL_SAMPLER_1D_SHADOW; - } + if (sampler.shadow) + return sampler.arrayed ? GL_SAMPLER_1D_ARRAY_SHADOW : GL_SAMPLER_1D_SHADOW; + else + return sampler.arrayed ? GL_SAMPLER_1D_ARRAY : GL_SAMPLER_1D; case Esd2D: - switch ((int)sampler.ms) { - case false: - switch ((int)sampler.shadow) { - case false: return sampler.arrayed ? GL_SAMPLER_2D_ARRAY : GL_SAMPLER_2D; - case true: return sampler.arrayed ? GL_SAMPLER_2D_ARRAY_SHADOW : GL_SAMPLER_2D_SHADOW; - } - case true: return sampler.arrayed ? GL_SAMPLER_2D_MULTISAMPLE_ARRAY : GL_SAMPLER_2D_MULTISAMPLE; + if (sampler.ms) { + return sampler.arrayed ? GL_SAMPLER_2D_MULTISAMPLE_ARRAY : GL_SAMPLER_2D_MULTISAMPLE; + } else { + if (sampler.shadow) + return sampler.arrayed ? GL_SAMPLER_2D_ARRAY_SHADOW : GL_SAMPLER_2D_SHADOW; + else + return sampler.arrayed ? GL_SAMPLER_2D_ARRAY : GL_SAMPLER_2D; } case Esd3D: return GL_SAMPLER_3D; case EsdCube: - switch ((int)sampler.shadow) { - case false: return sampler.arrayed ? GL_SAMPLER_CUBE_MAP_ARRAY : GL_SAMPLER_CUBE; - case true: return sampler.arrayed ? GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW : GL_SAMPLER_CUBE_SHADOW; - } + if (sampler.shadow) + return sampler.arrayed ? GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW : GL_SAMPLER_CUBE_SHADOW; + else + return sampler.arrayed ? GL_SAMPLER_CUBE_MAP_ARRAY : GL_SAMPLER_CUBE; case EsdRect: return sampler.shadow ? GL_SAMPLER_2D_RECT_SHADOW : GL_SAMPLER_2D_RECT; case EsdBuffer: return GL_SAMPLER_BUFFER; + default: + return 0; } case EbtFloat16: switch ((int)sampler.dim) { case Esd1D: - switch ((int)sampler.shadow) { - case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_AMD : GL_FLOAT16_SAMPLER_1D_AMD; - case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_1D_SHADOW_AMD; - } + if (sampler.shadow) + return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_1D_SHADOW_AMD; + else + return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_AMD : GL_FLOAT16_SAMPLER_1D_AMD; case Esd2D: - switch ((int)sampler.ms) { - case false: - switch ((int)sampler.shadow) { - case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_AMD; - case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_SHADOW_AMD; - } - case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD; + if (sampler.ms) { + return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD; + } else { + if (sampler.shadow) + return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_SHADOW_AMD; + else + return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_AMD; } case Esd3D: return GL_FLOAT16_SAMPLER_3D_AMD; case EsdCube: - switch ((int)sampler.shadow) { - case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_SAMPLER_CUBE_AMD; - case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD; - } + if (sampler.shadow) + return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD; + else + return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_SAMPLER_CUBE_AMD; case EsdRect: return sampler.shadow ? GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_RECT_AMD; case EsdBuffer: return GL_FLOAT16_SAMPLER_BUFFER_AMD; + default: + return 0; } case EbtInt: switch ((int)sampler.dim) { case Esd1D: return sampler.arrayed ? GL_INT_SAMPLER_1D_ARRAY : GL_INT_SAMPLER_1D; case Esd2D: - switch ((int)sampler.ms) { - case false: return sampler.arrayed ? GL_INT_SAMPLER_2D_ARRAY : GL_INT_SAMPLER_2D; - case true: return sampler.arrayed ? GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY - : GL_INT_SAMPLER_2D_MULTISAMPLE; - } + if (sampler.ms) + return sampler.arrayed ? GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY + : GL_INT_SAMPLER_2D_MULTISAMPLE; + else + return sampler.arrayed ? GL_INT_SAMPLER_2D_ARRAY : GL_INT_SAMPLER_2D; case Esd3D: return GL_INT_SAMPLER_3D; case EsdCube: @@ -777,17 +779,19 @@ public: return GL_INT_SAMPLER_2D_RECT; case EsdBuffer: return GL_INT_SAMPLER_BUFFER; + default: + return 0; } case EbtUint: switch ((int)sampler.dim) { case Esd1D: return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_1D_ARRAY : GL_UNSIGNED_INT_SAMPLER_1D; case Esd2D: - switch ((int)sampler.ms) { - case false: return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_ARRAY : GL_UNSIGNED_INT_SAMPLER_2D; - case true: return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY - : GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE; - } + if (sampler.ms) + return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY + : GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE; + else + return sampler.arrayed ? GL_UNSIGNED_INT_SAMPLER_2D_ARRAY : GL_UNSIGNED_INT_SAMPLER_2D; case Esd3D: return GL_UNSIGNED_INT_SAMPLER_3D; case EsdCube: @@ -796,6 +800,8 @@ public: return GL_UNSIGNED_INT_SAMPLER_2D_RECT; case EsdBuffer: return GL_UNSIGNED_INT_SAMPLER_BUFFER; + default: + return 0; } default: return 0; @@ -808,10 +814,10 @@ public: case Esd1D: return sampler.arrayed ? GL_IMAGE_1D_ARRAY : GL_IMAGE_1D; case Esd2D: - switch ((int)sampler.ms) { - case false: return sampler.arrayed ? GL_IMAGE_2D_ARRAY : GL_IMAGE_2D; - case true: return sampler.arrayed ? GL_IMAGE_2D_MULTISAMPLE_ARRAY : GL_IMAGE_2D_MULTISAMPLE; - } + if (sampler.ms) + return sampler.arrayed ? GL_IMAGE_2D_MULTISAMPLE_ARRAY : GL_IMAGE_2D_MULTISAMPLE; + else + return sampler.arrayed ? GL_IMAGE_2D_ARRAY : GL_IMAGE_2D; case Esd3D: return GL_IMAGE_3D; case EsdCube: @@ -820,16 +826,18 @@ public: return GL_IMAGE_2D_RECT; case EsdBuffer: return GL_IMAGE_BUFFER; + default: + return 0; } case EbtFloat16: switch ((int)sampler.dim) { case Esd1D: return sampler.arrayed ? GL_FLOAT16_IMAGE_1D_ARRAY_AMD : GL_FLOAT16_IMAGE_1D_AMD; case Esd2D: - switch ((int)sampler.ms) { - case false: return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_AMD; - case true: return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD; - } + if (sampler.ms) + return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD; + else + return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_AMD; case Esd3D: return GL_FLOAT16_IMAGE_3D_AMD; case EsdCube: @@ -838,16 +846,18 @@ public: return GL_FLOAT16_IMAGE_2D_RECT_AMD; case EsdBuffer: return GL_FLOAT16_IMAGE_BUFFER_AMD; + default: + return 0; } case EbtInt: switch ((int)sampler.dim) { case Esd1D: return sampler.arrayed ? GL_INT_IMAGE_1D_ARRAY : GL_INT_IMAGE_1D; case Esd2D: - switch ((int)sampler.ms) { - case false: return sampler.arrayed ? GL_INT_IMAGE_2D_ARRAY : GL_INT_IMAGE_2D; - case true: return sampler.arrayed ? GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY : GL_INT_IMAGE_2D_MULTISAMPLE; - } + if (sampler.ms) + return sampler.arrayed ? GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY : GL_INT_IMAGE_2D_MULTISAMPLE; + else + return sampler.arrayed ? GL_INT_IMAGE_2D_ARRAY : GL_INT_IMAGE_2D; case Esd3D: return GL_INT_IMAGE_3D; case EsdCube: @@ -856,17 +866,19 @@ public: return GL_INT_IMAGE_2D_RECT; case EsdBuffer: return GL_INT_IMAGE_BUFFER; + default: + return 0; } case EbtUint: switch ((int)sampler.dim) { case Esd1D: return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_1D_ARRAY : GL_UNSIGNED_INT_IMAGE_1D; case Esd2D: - switch ((int)sampler.ms) { - case false: return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_ARRAY : GL_UNSIGNED_INT_IMAGE_2D; - case true: return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY - : GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE; - } + if (sampler.ms) + return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY + : GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE; + else + return sampler.arrayed ? GL_UNSIGNED_INT_IMAGE_2D_ARRAY : GL_UNSIGNED_INT_IMAGE_2D; case Esd3D: return GL_UNSIGNED_INT_IMAGE_3D; case EsdCube: @@ -875,6 +887,8 @@ public: return GL_UNSIGNED_INT_IMAGE_2D_RECT; case EsdBuffer: return GL_UNSIGNED_INT_IMAGE_BUFFER; + default: + return 0; } default: return 0; @@ -939,6 +953,7 @@ public: case 4: return GL_FLOAT_MAT4; default: return 0; } + default: return 0; } case EbtDouble: switch (type.getMatrixCols()) { @@ -963,6 +978,7 @@ public: case 4: return GL_DOUBLE_MAT4; default: return 0; } + default: return 0; } case EbtFloat16: switch (type.getMatrixCols()) { @@ -987,6 +1003,7 @@ public: case 4: return GL_FLOAT16_MAT4_AMD; default: return 0; } + default: return 0; } default: return 0; @@ -1270,5 +1287,3 @@ void TReflection::dump() } } // end namespace glslang - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.h index 5af4467c1..221d93f8b 100644 --- a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.h +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/reflection.h @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #ifndef _REFLECTION_INCLUDED #define _REFLECTION_INCLUDED @@ -219,5 +217,3 @@ protected: } // end namespace glslang #endif // _REFLECTION_INCLUDED - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/span.h b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/span.h new file mode 100644 index 000000000..bd705fead --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/MachineIndependent/span.h @@ -0,0 +1,92 @@ +#pragma once + +// +// Copyright (C) 2023 LunarG, Inc. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// + +// Partial implementation of std::span for C++11 +// Replace with std::span if repo standard is bumped to C++20 +// +// This code was copied from https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/main/layers/containers/custom_containers.h +template +class span { + public: + using pointer = T *; + using const_pointer = T const *; + using iterator = pointer; + using const_iterator = const_pointer; + + span() = default; + span(pointer start, size_t n) : data_(start), count_(n) {} + template + span(Iterator start, Iterator end) : data_(&(*start)), count_(end - start) {} + template + span(Container &c) : data_(c.data()), count_(c.size()) {} + + iterator begin() { return data_; } + const_iterator begin() const { return data_; } + + iterator end() { return data_ + count_; } + const_iterator end() const { return data_ + count_; } + + T &operator[](int i) { return data_[i]; } + const T &operator[](int i) const { return data_[i]; } + + T &front() { return *data_; } + const T &front() const { return *data_; } + + T &back() { return *(data_ + (count_ - 1)); } + const T &back() const { return *(data_ + (count_ - 1)); } + + size_t size() const { return count_; } + bool empty() const { return count_ == 0; } + + pointer data() { return data_; } + const_pointer data() const { return data_; } + + private: + pointer data_ = {}; + size_t count_ = 0; +}; + +// +// Allow type inference that using the constructor doesn't allow in C++11 +template +span make_span(T *begin, size_t count) { + return span(begin, count); +} +template +span make_span(T *begin, T *end) { + return make_span(begin, end); +} diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/CMakeLists.txt b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/CMakeLists.txt index 354a3e977..0c5497568 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/CMakeLists.txt +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/CMakeLists.txt @@ -36,24 +36,10 @@ set_property(TARGET OSDependent PROPERTY FOLDER glslang) set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON) # Link pthread -set(CMAKE_THREAD_PREFER_PTHREAD ON) -if(${CMAKE_VERSION} VERSION_LESS "3.1.0" OR CMAKE_CROSSCOMPILING) - # Needed as long as we support CMake 2.8 for Ubuntu 14.04, - # which does not support the recommended Threads::Threads target. - # https://cmake.org/cmake/help/v2.8.12/cmake.html#module:FindThreads - # Also needed when cross-compiling to work around - # https://gitlab.kitware.com/cmake/cmake/issues/16920 - find_package(Threads) - target_link_libraries(OSDependent ${CMAKE_THREAD_LIBS_INIT}) -else() - # This is the recommended way, so we use it for 3.1+. - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads) - target_link_libraries(OSDependent Threads::Threads) -endif() +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads REQUIRED) +target_link_libraries(OSDependent Threads::Threads) -if(ENABLE_GLSLANG_INSTALL) - install(TARGETS OSDependent EXPORT OSDependentTargets - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(EXPORT OSDependentTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) -endif(ENABLE_GLSLANG_INSTALL) +if(GLSLANG_ENABLE_INSTALL AND NOT BUILD_SHARED_LIBS) + install(TARGETS OSDependent EXPORT glslang-targets) +endif() diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/ossource.cpp b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/ossource.cpp index 3f029f023..fbb51f7bd 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/ossource.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Unix/ossource.cpp @@ -36,15 +36,8 @@ // This file contains the Linux-specific functions // #include "../osinclude.h" -#include "../../../OGLCompilersDLL/InitializeDll.h" -#include -#include -#include -#include -#include #include -#include #if !defined(__Fuchsia__) #include @@ -52,144 +45,6 @@ namespace glslang { -// -// Thread cleanup -// - -// -// Wrapper for Linux call to DetachThread. This is required as pthread_cleanup_push() expects -// the cleanup routine to return void. -// -static void DetachThreadLinux(void *) -{ - DetachThread(); -} - -// -// Registers cleanup handler, sets cancel type and state, and executes the thread specific -// cleanup handler. This function will be called in the Standalone.cpp for regression -// testing. When OpenGL applications are run with the driver code, Linux OS does the -// thread cleanup. -// -void OS_CleanupThreadData(void) -{ -#if defined(__ANDROID__) || defined(__Fuchsia__) - DetachThreadLinux(NULL); -#else - int old_cancel_state, old_cancel_type; - void *cleanupArg = NULL; - - // - // Set thread cancel state and push cleanup handler. - // - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancel_state); - pthread_cleanup_push(DetachThreadLinux, (void *) cleanupArg); - - // - // Put the thread in deferred cancellation mode. - // - pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &old_cancel_type); - - // - // Pop cleanup handler and execute it prior to unregistering the cleanup handler. - // - pthread_cleanup_pop(1); - - // - // Restore the thread's previous cancellation mode. - // - pthread_setcanceltype(old_cancel_state, NULL); -#endif -} - -// -// Thread Local Storage Operations -// -inline OS_TLSIndex PthreadKeyToTLSIndex(pthread_key_t key) -{ - return (OS_TLSIndex)((uintptr_t)key + 1); -} - -inline pthread_key_t TLSIndexToPthreadKey(OS_TLSIndex nIndex) -{ - return (pthread_key_t)((uintptr_t)nIndex - 1); -} - -OS_TLSIndex OS_AllocTLSIndex() -{ - pthread_key_t pPoolIndex; - - // - // Create global pool key. - // - if ((pthread_key_create(&pPoolIndex, NULL)) != 0) { - assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage"); - return OS_INVALID_TLS_INDEX; - } - else - return PthreadKeyToTLSIndex(pPoolIndex); -} - -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - if (pthread_setspecific(TLSIndexToPthreadKey(nIndex), lpvValue) == 0) - return true; - else - return false; -} - -void* OS_GetTLSValue(OS_TLSIndex nIndex) -{ - // - // This function should return 0 if nIndex is invalid. - // - assert(nIndex != OS_INVALID_TLS_INDEX); - return pthread_getspecific(TLSIndexToPthreadKey(nIndex)); -} - -bool OS_FreeTLSIndex(OS_TLSIndex nIndex) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - // - // Delete the global pool key. - // - if (pthread_key_delete(TLSIndexToPthreadKey(nIndex)) == 0) - return true; - else - return false; -} - -namespace { - pthread_mutex_t gMutex; -} - -void InitGlobalLock() -{ - pthread_mutexattr_t mutexattr; - pthread_mutexattr_init(&mutexattr); - pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&gMutex, &mutexattr); -} - -void GetGlobalLock() -{ - pthread_mutex_lock(&gMutex); -} - -void ReleaseGlobalLock() -{ - pthread_mutex_unlock(&gMutex); -} - // #define DUMP_COUNTERS void OS_DumpMemoryCounters() diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/CMakeLists.txt b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/CMakeLists.txt index 0f60dbcc1..5d1749608 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/CMakeLists.txt +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/CMakeLists.txt @@ -53,9 +53,12 @@ if(ENABLE_GLSLANG_JS) target_link_libraries(glslang.js "-s ALLOW_MEMORY_GROWTH=1") target_link_libraries(glslang.js "-s FILESYSTEM=0") + # We use ccall in glslang.pre.js, so make sure it's exposed + target_link_libraries(glslang.js "-s EXPORTED_RUNTIME_METHODS=ccall") + if(ENABLE_EMSCRIPTEN_SINGLE_FILE) target_link_libraries(glslang.js "-s SINGLE_FILE=1") - endif(ENABLE_EMSCRIPTEN_SINGLE_FILE) + endif() if(ENABLE_EMSCRIPTEN_ENVIRONMENT_NODE) target_link_libraries(glslang.js "-s ENVIRONMENT=node -s BINARYEN_ASYNC_COMPILATION=0") @@ -64,8 +67,28 @@ if(ENABLE_GLSLANG_JS) endif() if(NOT ENABLE_EMSCRIPTEN_ENVIRONMENT_NODE) - add_custom_command(TARGET glslang.js POST_BUILD - COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js >> ${CMAKE_CURRENT_BINARY_DIR}/glslang.js) + if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.18") + add_custom_command(TARGET glslang.js POST_BUILD + COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js >> ${CMAKE_CURRENT_BINARY_DIR}/glslang.js + ) + else() + if (MINGW) + message(FATAL_ERROR "Must use at least CMake 3.18") + endif() + + if (CMAKE_HOST_SYSTEM MATCHES "Windows.*") + # There are several ways we could append one file to another on Windows, but unfortunately 'cat' is not one of them + # (there is no 'cat' command in cmd). Also, since this will ultimately run in cmd and not pwsh, we need to ensure + # Windows path separators are used. + file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/glslang.js" glslang_js_path) + file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js" glslang_after_js_path) + add_custom_command(TARGET glslang.js POST_BUILD + COMMAND type "${glslang_after_js_path}" >> "${glslang_js_path}") + else() + add_custom_command(TARGET glslang.js POST_BUILD + COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js >> ${CMAKE_CURRENT_BINARY_DIR}/glslang.js) + endif() + endif() endif() - endif(EMSCRIPTEN) -endif(ENABLE_GLSLANG_JS) + endif() +endif() \ No newline at end of file diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.js.cpp b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.js.cpp index f2306a609..c820da6aa 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.js.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.js.cpp @@ -141,6 +141,15 @@ const TBuiltInResource DefaultTBuiltInResource = { /* .maxTaskWorkGroupSizeY_NV = */ 1, /* .maxTaskWorkGroupSizeZ_NV = */ 1, /* .maxMeshViewCountNV = */ 4, + /* .maxMeshOutputVerticesEXT = */ 256, + /* .maxMeshOutputPrimitivesEXT = */ 512, + /* .maxMeshWorkGroupSizeX_EXT = */ 32, + /* .maxMeshWorkGroupSizeY_EXT = */ 1, + /* .maxMeshWorkGroupSizeZ_EXT = */ 1, + /* .maxTaskWorkGroupSizeX_EXT = */ 32, + /* .maxTaskWorkGroupSizeY_EXT = */ 1, + /* .maxTaskWorkGroupSizeZ_EXT = */ 1, + /* .maxMeshViewCountEXT = */ 4, /* .maxDualSourceDrawBuffersEXT = */ 1, /* .limits = */ { diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.pre.js b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.pre.js index 46a569506..390390e99 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.pre.js +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Web/glslang.pre.js @@ -25,7 +25,7 @@ Module['compileGLSLZeroCopy'] = function(glsl, shader_stage, gen_debug, spirv_ve var p_output = Module['_malloc'](4); var p_output_len = Module['_malloc'](4); - var id = ccall('convert_glsl_to_spirv', + var id = Module['ccall']('convert_glsl_to_spirv', 'number', ['string', 'number', 'boolean', 'number', 'number', 'number'], [glsl, shader_stage_int, gen_debug, spirv_version_int, p_output, p_output_len]); diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/CMakeLists.txt b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/CMakeLists.txt index 9cf1b7fba..8a9a8c42c 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/CMakeLists.txt +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/CMakeLists.txt @@ -31,24 +31,26 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -set(SOURCES ossource.cpp ../osinclude.h) +add_library(OSDependent STATIC) + +target_sources(OSDependent PRIVATE + ../osinclude.h + ossource.cpp +) -add_library(OSDependent STATIC ${SOURCES}) set_property(TARGET OSDependent PROPERTY FOLDER glslang) set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON) # MinGW GCC complains about function pointer casts to void*. # Turn that off with -fpermissive. -if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") +if(MINGW AND ${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") target_compile_options(OSDependent PRIVATE -fpermissive) endif() if(WIN32) source_group("Source" FILES ${SOURCES}) -endif(WIN32) +endif() -if(ENABLE_GLSLANG_INSTALL) - install(TARGETS OSDependent EXPORT OSDependentTargets - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(EXPORT OSDependentTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) -endif(ENABLE_GLSLANG_INSTALL) +if(GLSLANG_ENABLE_INSTALL) + install(TARGETS OSDependent EXPORT glslang-targets) +endif() diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/ossource.cpp b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/ossource.cpp index 870840c56..d7f89f71b 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/ossource.cpp +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/Windows/ossource.cpp @@ -37,11 +37,9 @@ #define STRICT #define VC_EXTRALEAN 1 #include -#include #include #include #include -#include // // This file contains the Window-OS-specific functions @@ -53,84 +51,6 @@ namespace glslang { -inline OS_TLSIndex ToGenericTLSIndex (DWORD handle) -{ - return (OS_TLSIndex)((uintptr_t)handle + 1); -} - -inline DWORD ToNativeTLSIndex (OS_TLSIndex nIndex) -{ - return (DWORD)((uintptr_t)nIndex - 1); -} - -// -// Thread Local Storage Operations -// -OS_TLSIndex OS_AllocTLSIndex() -{ - DWORD dwIndex = TlsAlloc(); - if (dwIndex == TLS_OUT_OF_INDEXES) { - assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage"); - return OS_INVALID_TLS_INDEX; - } - - return ToGenericTLSIndex(dwIndex); -} - -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - if (TlsSetValue(ToNativeTLSIndex(nIndex), lpvValue)) - return true; - else - return false; -} - -void* OS_GetTLSValue(OS_TLSIndex nIndex) -{ - assert(nIndex != OS_INVALID_TLS_INDEX); - return TlsGetValue(ToNativeTLSIndex(nIndex)); -} - -bool OS_FreeTLSIndex(OS_TLSIndex nIndex) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - if (TlsFree(ToNativeTLSIndex(nIndex))) - return true; - else - return false; -} - -HANDLE GlobalLock; - -void InitGlobalLock() -{ - GlobalLock = CreateMutex(0, false, 0); -} - -void GetGlobalLock() -{ - WaitForSingleObject(GlobalLock, INFINITE); -} - -void ReleaseGlobalLock() -{ - ReleaseMutex(GlobalLock); -} - -unsigned int __stdcall EnterGenericThread (void* entry) -{ - return ((TThreadEntrypoint)entry)(0); -} - //#define DUMP_COUNTERS void OS_DumpMemoryCounters() diff --git a/libraries/ZVulkan/src/glslang/glslang/OSDependent/osinclude.h b/libraries/ZVulkan/src/glslang/glslang/OSDependent/osinclude.h index 218abe4f2..0d677e4af 100644 --- a/libraries/ZVulkan/src/glslang/glslang/OSDependent/osinclude.h +++ b/libraries/ZVulkan/src/glslang/glslang/OSDependent/osinclude.h @@ -37,25 +37,6 @@ namespace glslang { -// -// Thread Local Storage Operations -// -typedef void* OS_TLSIndex; -#define OS_INVALID_TLS_INDEX ((void*)0) - -OS_TLSIndex OS_AllocTLSIndex(); -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue); -bool OS_FreeTLSIndex(OS_TLSIndex nIndex); -void* OS_GetTLSValue(OS_TLSIndex nIndex); - -void InitGlobalLock(); -void GetGlobalLock(); -void ReleaseGlobalLock(); - -typedef unsigned int (*TThreadEntrypoint)(void*); - -void OS_CleanupThreadData(void); - void OS_DumpMemoryCounters(); } // end namespace glslang diff --git a/libraries/ZVulkan/src/glslang/glslang/Public/ResourceLimits.h b/libraries/ZVulkan/src/glslang/glslang/Public/ResourceLimits.h new file mode 100644 index 000000000..f70be8172 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/Public/ResourceLimits.h @@ -0,0 +1,57 @@ +// +// Copyright (C) 2016 Google, Inc. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#ifndef _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_ +#define _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_ + +#include + +#include "../Include/ResourceLimits.h" + +// Return pointer to user-writable Resource to pass through API in +// future-proof way. +extern TBuiltInResource* GetResources(); + +// These are the default resources for TBuiltInResources, used for both +// - parsing this string for the case where the user didn't supply one, +// - dumping out a template for user construction of a config file. +extern const TBuiltInResource* GetDefaultResources(); + +// Returns the DefaultTBuiltInResource as a human-readable string. +std::string GetDefaultTBuiltInResourceString(); + +// Decodes the resource limits from |config| to |resources|. +void DecodeResourceLimits(TBuiltInResource* resources, char* config); + +#endif // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_ diff --git a/libraries/ZVulkan/src/glslang/glslang/Public/ShaderLang.h b/libraries/ZVulkan/src/glslang/glslang/Public/ShaderLang.h index d2a4bf40a..b71b147a5 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Public/ShaderLang.h +++ b/libraries/ZVulkan/src/glslang/glslang/Public/ShaderLang.h @@ -108,8 +108,10 @@ typedef enum { EShLangMissNV = EShLangMiss, EShLangCallable, EShLangCallableNV = EShLangCallable, - EShLangTaskNV, - EShLangMeshNV, + EShLangTask, + EShLangTaskNV = EShLangTask, + EShLangMesh, + EShLangMeshNV = EShLangMesh, LAST_ELEMENT_MARKER(EShLangCount), } EShLanguage; // would be better as stage, but this is ancient now @@ -132,8 +134,10 @@ typedef enum : unsigned { EShLangMissNVMask = EShLangMissMask, EShLangCallableMask = (1 << EShLangCallable), EShLangCallableNVMask = EShLangCallableMask, - EShLangTaskNVMask = (1 << EShLangTaskNV), - EShLangMeshNVMask = (1 << EShLangMeshNV), + EShLangTaskMask = (1 << EShLangTask), + EShLangTaskNVMask = EShLangTaskMask, + EShLangMeshMask = (1 << EShLangMesh), + EShLangMeshNVMask = EShLangMeshMask, LAST_ELEMENT_MARKER(EShLanguageMaskCount), } EShLanguageMask; @@ -150,8 +154,8 @@ typedef enum { typedef enum { EShClientNone, // use when there is no client, e.g. for validation - EShClientVulkan, - EShClientOpenGL, + EShClientVulkan, // as GLSL dialect, specifies KHR_vulkan_glsl extension + EShClientOpenGL, // as GLSL dialect, specifies ARB_gl_spirv extension LAST_ELEMENT_MARKER(EShClientCount), } EShClient; @@ -166,8 +170,9 @@ typedef enum { EShTargetVulkan_1_0 = (1 << 22), // Vulkan 1.0 EShTargetVulkan_1_1 = (1 << 22) | (1 << 12), // Vulkan 1.1 EShTargetVulkan_1_2 = (1 << 22) | (2 << 12), // Vulkan 1.2 + EShTargetVulkan_1_3 = (1 << 22) | (3 << 12), // Vulkan 1.3 EShTargetOpenGL_450 = 450, // OpenGL - LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 4), + LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 5), } EShTargetClientVersion; typedef EShTargetClientVersion EshTargetClientVersion; @@ -179,7 +184,8 @@ typedef enum { EShTargetSpv_1_3 = (1 << 16) | (3 << 8), // SPIR-V 1.3 EShTargetSpv_1_4 = (1 << 16) | (4 << 8), // SPIR-V 1.4 EShTargetSpv_1_5 = (1 << 16) | (5 << 8), // SPIR-V 1.5 - LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 6), + EShTargetSpv_1_6 = (1 << 16) | (6 << 8), // SPIR-V 1.6 + LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 7), } EShTargetLanguageVersion; struct TInputLanguage { @@ -246,22 +252,24 @@ typedef enum { // Message choices for what errors and warnings are given. // enum EShMessages : unsigned { - EShMsgDefault = 0, // default is to give all required errors and extra warnings - EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input - EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification - EShMsgAST = (1 << 2), // print the AST intermediate representation - EShMsgSpvRules = (1 << 3), // issue messages for SPIR-V generation - EShMsgVulkanRules = (1 << 4), // issue messages for Vulkan-requirements of GLSL for SPIR-V - EShMsgOnlyPreprocessor = (1 << 5), // only print out errors produced by the preprocessor - EShMsgReadHlsl = (1 << 6), // use HLSL parsing rules and semantics - EShMsgCascadingErrors = (1 << 7), // get cascading errors; risks error-recovery issues, instead of an early exit - EShMsgKeepUncalled = (1 << 8), // for testing, don't eliminate uncalled functions - EShMsgHlslOffsets = (1 << 9), // allow block offsets to follow HLSL rules instead of GLSL rules - EShMsgDebugInfo = (1 << 10), // save debug information - EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL - EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages - EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics) - EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table + EShMsgDefault = 0, // default is to give all required errors and extra warnings + EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input + EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification + EShMsgAST = (1 << 2), // print the AST intermediate representation + EShMsgSpvRules = (1 << 3), // issue messages for SPIR-V generation + EShMsgVulkanRules = (1 << 4), // issue messages for Vulkan-requirements of GLSL for SPIR-V + EShMsgOnlyPreprocessor = (1 << 5), // only print out errors produced by the preprocessor + EShMsgReadHlsl = (1 << 6), // use HLSL parsing rules and semantics + EShMsgCascadingErrors = (1 << 7), // get cascading errors; risks error-recovery issues, instead of an early exit + EShMsgKeepUncalled = (1 << 8), // for testing, don't eliminate uncalled functions + EShMsgHlslOffsets = (1 << 9), // allow block offsets to follow HLSL rules instead of GLSL rules + EShMsgDebugInfo = (1 << 10), // save debug information + EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL + EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages + EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics) + EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table + EShMsgEnhanced = (1 << 15), // enhanced message readability + EShMsgAbsolutePath = (1 << 16), // Output Absolute path for messages LAST_ELEMENT_MARKER(EShMsgCount), }; @@ -298,7 +306,7 @@ typedef struct { // // ShHandle held by but opaque to the driver. It is allocated, -// managed, and de-allocated by the compiler/linker. It's contents +// managed, and de-allocated by the compiler/linker. Its contents // are defined by and used by the compiler and linker. For example, // symbol table information and object code passed from the compiler // to the linker can be stored where ShHandle points. @@ -311,8 +319,8 @@ typedef void* ShHandle; // Driver calls these to create and destroy compiler/linker // objects. // -GLSLANG_EXPORT ShHandle ShConstructCompiler(const EShLanguage, int debugOptions); // one per shader -GLSLANG_EXPORT ShHandle ShConstructLinker(const EShExecutable, int debugOptions); // one per shader pair +GLSLANG_EXPORT ShHandle ShConstructCompiler(const EShLanguage, int /*debugOptions unused*/); // one per shader +GLSLANG_EXPORT ShHandle ShConstructLinker(const EShExecutable, int /*debugOptions unused*/); // one per shader pair GLSLANG_EXPORT ShHandle ShConstructUniformMap(); // one per uniform namespace (currently entire program object) GLSLANG_EXPORT void ShDestruct(ShHandle); @@ -323,18 +331,14 @@ GLSLANG_EXPORT void ShDestruct(ShHandle); // The info-log should be written by ShCompile into // ShHandle, so it can answer future queries. // -GLSLANG_EXPORT int ShCompile( - const ShHandle, - const char* const shaderStrings[], - const int numStrings, - const int* lengths, - const EShOptimizationLevel, - const TBuiltInResource *resources, - int debugOptions, - int defaultVersion = 110, // use 100 for ES environment, overridden by #version in shader - bool forwardCompatible = false, // give errors for use of deprecated features - EShMessages messages = EShMsgDefault // warnings and errors - ); +GLSLANG_EXPORT int ShCompile(const ShHandle, const char* const shaderStrings[], const int numStrings, + const int* lengths, const EShOptimizationLevel, const TBuiltInResource* resources, + int, // debugOptions unused + int defaultVersion = 110, // use 100 for ES environment, overridden by #version in shader + bool forwardCompatible = false, // give errors for use of deprecated features + EShMessages messages = EShMsgDefault, // warnings and errors + const char* fileName = nullptr +); GLSLANG_EXPORT int ShLinkExt( const ShHandle, // linker object @@ -468,6 +472,8 @@ public: GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName); GLSLANG_EXPORT void addProcesses(const std::vector&); GLSLANG_EXPORT void setUniqueId(unsigned long long id); + GLSLANG_EXPORT void setOverrideVersion(int version); + GLSLANG_EXPORT void setDebugInfo(bool debugInfo); // IO resolver binding data: see comments in ShaderLang.cpp GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base); @@ -485,6 +491,8 @@ public: GLSLANG_EXPORT void addUniformLocationOverride(const char* name, int loc); GLSLANG_EXPORT void setUniformLocationBase(int base); GLSLANG_EXPORT void setInvertY(bool invert); + GLSLANG_EXPORT void setDxPositionW(bool dxPosW); + GLSLANG_EXPORT void setEnhancedMsgs(); #ifdef ENABLE_HLSL GLSLANG_EXPORT void setHlslIoMapping(bool hlslIoMap); GLSLANG_EXPORT void setFlattenUniformArrays(bool flatten); @@ -512,11 +520,14 @@ public: // use EShClientNone and version of 0, e.g. for validation mode. // Note 'version' does not describe the target environment, // just the version of the source dialect to compile under. + // For example, to choose the Vulkan dialect of GLSL defined by + // version 100 of the KHR_vulkan_glsl extension: lang = EShSourceGlsl, + // dialect = EShClientVulkan, and version = 100. // // See the definitions of TEnvironment, EShSource, EShLanguage, // and EShClient for choices and more detail. // - // setEnvClient: The client that will be hosting the execution, and it's version. + // setEnvClient: The client that will be hosting the execution, and its version. // Note 'version' is not the version of the languages involved, but // the version of the client environment. // Use EShClientNone and version of 0 if there is no client, e.g. @@ -559,6 +570,9 @@ public: void setEnvInputVulkanRulesRelaxed() { environment.input.vulkanRulesRelaxed = true; } bool getEnvInputVulkanRulesRelaxed() const { return environment.input.vulkanRulesRelaxed; } + void setCompileOnly() { compileOnly = true; } + bool getCompileOnly() const { return compileOnly; } + // Interface to #include handlers. // // To support #include, a client of Glslang does the following: @@ -703,16 +717,20 @@ protected: // a function in the source string can be renamed FROM this TO the name given in setEntryPoint. std::string sourceEntryPointName; + // overrides #version in shader source or default version if #version isn't present + int overrideVersion; + TEnvironment environment; + // Indicates this shader is meant to be used without linking + bool compileOnly = false; + friend class TProgram; private: TShader& operator=(TShader&); }; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // // A reflection database and its interface, consistent with the OpenGL API reflection queries. // @@ -727,6 +745,8 @@ public: GLSLANG_EXPORT void dump() const; static TObjectReflection badReflection() { return TObjectReflection(); } + GLSLANG_EXPORT unsigned int layoutLocation() const; + std::string name; int offset; int glDefineType; @@ -829,8 +849,6 @@ public: virtual void addStage(EShLanguage stage, TIntermediate& stageIntermediate) = 0; }; -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE - // Make one TProgram per set of shaders that will get linked together. Add all // the shaders that are to be linked together. After calling shader.parse() // for all shaders, call link(). @@ -850,8 +868,6 @@ public: TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // Reflection Interface // call first, to do liveness analysis, index mapping, etc.; returns false on failure @@ -944,7 +960,6 @@ public: // If resolver is not provided it uses the previous approach // and respects auto assignment and offsets. GLSLANG_EXPORT bool mapIO(TIoMapResolver* pResolver = nullptr, TIoMapper* pIoMapper = nullptr); -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE protected: GLSLANG_EXPORT bool linkStage(EShLanguage, EShMessages); @@ -955,9 +970,7 @@ protected: TIntermediate* intermediate[EShLangCount]; bool newedIntermediate[EShLangCount]; // track which intermediate were "new" versus reusing a singleton unit in a stage TInfoSink* infoSink; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) TReflection* reflection; -#endif bool linked; private: diff --git a/libraries/ZVulkan/src/glslang/glslang/Public/resource_limits_c.h b/libraries/ZVulkan/src/glslang/glslang/Public/resource_limits_c.h new file mode 100644 index 000000000..05aa8eb02 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/Public/resource_limits_c.h @@ -0,0 +1,57 @@ +/** +BSD 2-Clause License + +Copyright (c) 2020, Travis Fort +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**/ + +#ifndef _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ +#define _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ + +#include "../Include/glslang_c_interface.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Returns a struct that can be use to create custom resource values. +glslang_resource_t* glslang_resource(void); + +// These are the default resources for TBuiltInResources, used for both +// - parsing this string for the case where the user didn't supply one, +// - dumping out a template for user construction of a config file. +const glslang_resource_t* glslang_default_resource(void); + +// Returns the DefaultTBuiltInResource as a human-readable string. +// NOTE: User is responsible for freeing this string. +const char* glslang_default_resource_string(); + +// Decodes the resource limits from |config| to |resources|. +void glslang_decode_resource_limits(glslang_resource_t* resources, char* config); + +#ifdef __cplusplus +} +#endif + +#endif // _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ diff --git a/libraries/ZVulkan/src/glslang/glslang/ResourceLimits/ResourceLimits.cpp b/libraries/ZVulkan/src/glslang/glslang/ResourceLimits/ResourceLimits.cpp new file mode 100644 index 000000000..45e0804e1 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/ResourceLimits/ResourceLimits.cpp @@ -0,0 +1,542 @@ +// +// Copyright (C) 2016 Google, Inc. +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include + +#include "../Public/ResourceLimits.h" + +TBuiltInResource Resources; + +const TBuiltInResource DefaultTBuiltInResource = { + /* .MaxLights = */ 32, + /* .MaxClipPlanes = */ 6, + /* .MaxTextureUnits = */ 32, + /* .MaxTextureCoords = */ 32, + /* .MaxVertexAttribs = */ 64, + /* .MaxVertexUniformComponents = */ 4096, + /* .MaxVaryingFloats = */ 64, + /* .MaxVertexTextureImageUnits = */ 32, + /* .MaxCombinedTextureImageUnits = */ 80, + /* .MaxTextureImageUnits = */ 32, + /* .MaxFragmentUniformComponents = */ 4096, + /* .MaxDrawBuffers = */ 32, + /* .MaxVertexUniformVectors = */ 128, + /* .MaxVaryingVectors = */ 8, + /* .MaxFragmentUniformVectors = */ 16, + /* .MaxVertexOutputVectors = */ 16, + /* .MaxFragmentInputVectors = */ 15, + /* .MinProgramTexelOffset = */ -8, + /* .MaxProgramTexelOffset = */ 7, + /* .MaxClipDistances = */ 8, + /* .MaxComputeWorkGroupCountX = */ 65535, + /* .MaxComputeWorkGroupCountY = */ 65535, + /* .MaxComputeWorkGroupCountZ = */ 65535, + /* .MaxComputeWorkGroupSizeX = */ 1024, + /* .MaxComputeWorkGroupSizeY = */ 1024, + /* .MaxComputeWorkGroupSizeZ = */ 64, + /* .MaxComputeUniformComponents = */ 1024, + /* .MaxComputeTextureImageUnits = */ 16, + /* .MaxComputeImageUniforms = */ 8, + /* .MaxComputeAtomicCounters = */ 8, + /* .MaxComputeAtomicCounterBuffers = */ 1, + /* .MaxVaryingComponents = */ 60, + /* .MaxVertexOutputComponents = */ 64, + /* .MaxGeometryInputComponents = */ 64, + /* .MaxGeometryOutputComponents = */ 128, + /* .MaxFragmentInputComponents = */ 128, + /* .MaxImageUnits = */ 8, + /* .MaxCombinedImageUnitsAndFragmentOutputs = */ 8, + /* .MaxCombinedShaderOutputResources = */ 8, + /* .MaxImageSamples = */ 0, + /* .MaxVertexImageUniforms = */ 0, + /* .MaxTessControlImageUniforms = */ 0, + /* .MaxTessEvaluationImageUniforms = */ 0, + /* .MaxGeometryImageUniforms = */ 0, + /* .MaxFragmentImageUniforms = */ 8, + /* .MaxCombinedImageUniforms = */ 8, + /* .MaxGeometryTextureImageUnits = */ 16, + /* .MaxGeometryOutputVertices = */ 256, + /* .MaxGeometryTotalOutputComponents = */ 1024, + /* .MaxGeometryUniformComponents = */ 1024, + /* .MaxGeometryVaryingComponents = */ 64, + /* .MaxTessControlInputComponents = */ 128, + /* .MaxTessControlOutputComponents = */ 128, + /* .MaxTessControlTextureImageUnits = */ 16, + /* .MaxTessControlUniformComponents = */ 1024, + /* .MaxTessControlTotalOutputComponents = */ 4096, + /* .MaxTessEvaluationInputComponents = */ 128, + /* .MaxTessEvaluationOutputComponents = */ 128, + /* .MaxTessEvaluationTextureImageUnits = */ 16, + /* .MaxTessEvaluationUniformComponents = */ 1024, + /* .MaxTessPatchComponents = */ 120, + /* .MaxPatchVertices = */ 32, + /* .MaxTessGenLevel = */ 64, + /* .MaxViewports = */ 16, + /* .MaxVertexAtomicCounters = */ 0, + /* .MaxTessControlAtomicCounters = */ 0, + /* .MaxTessEvaluationAtomicCounters = */ 0, + /* .MaxGeometryAtomicCounters = */ 0, + /* .MaxFragmentAtomicCounters = */ 8, + /* .MaxCombinedAtomicCounters = */ 8, + /* .MaxAtomicCounterBindings = */ 1, + /* .MaxVertexAtomicCounterBuffers = */ 0, + /* .MaxTessControlAtomicCounterBuffers = */ 0, + /* .MaxTessEvaluationAtomicCounterBuffers = */ 0, + /* .MaxGeometryAtomicCounterBuffers = */ 0, + /* .MaxFragmentAtomicCounterBuffers = */ 1, + /* .MaxCombinedAtomicCounterBuffers = */ 1, + /* .MaxAtomicCounterBufferSize = */ 16384, + /* .MaxTransformFeedbackBuffers = */ 4, + /* .MaxTransformFeedbackInterleavedComponents = */ 64, + /* .MaxCullDistances = */ 8, + /* .MaxCombinedClipAndCullDistances = */ 8, + /* .MaxSamples = */ 4, + /* .maxMeshOutputVerticesNV = */ 256, + /* .maxMeshOutputPrimitivesNV = */ 512, + /* .maxMeshWorkGroupSizeX_NV = */ 32, + /* .maxMeshWorkGroupSizeY_NV = */ 1, + /* .maxMeshWorkGroupSizeZ_NV = */ 1, + /* .maxTaskWorkGroupSizeX_NV = */ 32, + /* .maxTaskWorkGroupSizeY_NV = */ 1, + /* .maxTaskWorkGroupSizeZ_NV = */ 1, + /* .maxMeshViewCountNV = */ 4, + /* .maxMeshOutputVerticesEXT = */ 256, + /* .maxMeshOutputPrimitivesEXT = */ 256, + /* .maxMeshWorkGroupSizeX_EXT = */ 128, + /* .maxMeshWorkGroupSizeY_EXT = */ 128, + /* .maxMeshWorkGroupSizeZ_EXT = */ 128, + /* .maxTaskWorkGroupSizeX_EXT = */ 128, + /* .maxTaskWorkGroupSizeY_EXT = */ 128, + /* .maxTaskWorkGroupSizeZ_EXT = */ 128, + /* .maxMeshViewCountEXT = */ 4, + /* .maxDualSourceDrawBuffersEXT = */ 1, + + /* .limits = */ { + /* .nonInductiveForLoops = */ 1, + /* .whileLoops = */ 1, + /* .doWhileLoops = */ 1, + /* .generalUniformIndexing = */ 1, + /* .generalAttributeMatrixVectorIndexing = */ 1, + /* .generalVaryingIndexing = */ 1, + /* .generalSamplerIndexing = */ 1, + /* .generalVariableIndexing = */ 1, + /* .generalConstantMatrixVectorIndexing = */ 1, + }}; + +std::string GetDefaultTBuiltInResourceString() +{ + std::ostringstream ostream; + + ostream << "MaxLights " << DefaultTBuiltInResource.maxLights << "\n" + << "MaxClipPlanes " << DefaultTBuiltInResource.maxClipPlanes << "\n" + << "MaxTextureUnits " << DefaultTBuiltInResource.maxTextureUnits << "\n" + << "MaxTextureCoords " << DefaultTBuiltInResource.maxTextureCoords << "\n" + << "MaxVertexAttribs " << DefaultTBuiltInResource.maxVertexAttribs << "\n" + << "MaxVertexUniformComponents " << DefaultTBuiltInResource.maxVertexUniformComponents << "\n" + << "MaxVaryingFloats " << DefaultTBuiltInResource.maxVaryingFloats << "\n" + << "MaxVertexTextureImageUnits " << DefaultTBuiltInResource.maxVertexTextureImageUnits << "\n" + << "MaxCombinedTextureImageUnits " << DefaultTBuiltInResource.maxCombinedTextureImageUnits << "\n" + << "MaxTextureImageUnits " << DefaultTBuiltInResource.maxTextureImageUnits << "\n" + << "MaxFragmentUniformComponents " << DefaultTBuiltInResource.maxFragmentUniformComponents << "\n" + << "MaxDrawBuffers " << DefaultTBuiltInResource.maxDrawBuffers << "\n" + << "MaxVertexUniformVectors " << DefaultTBuiltInResource.maxVertexUniformVectors << "\n" + << "MaxVaryingVectors " << DefaultTBuiltInResource.maxVaryingVectors << "\n" + << "MaxFragmentUniformVectors " << DefaultTBuiltInResource.maxFragmentUniformVectors << "\n" + << "MaxVertexOutputVectors " << DefaultTBuiltInResource.maxVertexOutputVectors << "\n" + << "MaxFragmentInputVectors " << DefaultTBuiltInResource.maxFragmentInputVectors << "\n" + << "MinProgramTexelOffset " << DefaultTBuiltInResource.minProgramTexelOffset << "\n" + << "MaxProgramTexelOffset " << DefaultTBuiltInResource.maxProgramTexelOffset << "\n" + << "MaxClipDistances " << DefaultTBuiltInResource.maxClipDistances << "\n" + << "MaxComputeWorkGroupCountX " << DefaultTBuiltInResource.maxComputeWorkGroupCountX << "\n" + << "MaxComputeWorkGroupCountY " << DefaultTBuiltInResource.maxComputeWorkGroupCountY << "\n" + << "MaxComputeWorkGroupCountZ " << DefaultTBuiltInResource.maxComputeWorkGroupCountZ << "\n" + << "MaxComputeWorkGroupSizeX " << DefaultTBuiltInResource.maxComputeWorkGroupSizeX << "\n" + << "MaxComputeWorkGroupSizeY " << DefaultTBuiltInResource.maxComputeWorkGroupSizeY << "\n" + << "MaxComputeWorkGroupSizeZ " << DefaultTBuiltInResource.maxComputeWorkGroupSizeZ << "\n" + << "MaxComputeUniformComponents " << DefaultTBuiltInResource.maxComputeUniformComponents << "\n" + << "MaxComputeTextureImageUnits " << DefaultTBuiltInResource.maxComputeTextureImageUnits << "\n" + << "MaxComputeImageUniforms " << DefaultTBuiltInResource.maxComputeImageUniforms << "\n" + << "MaxComputeAtomicCounters " << DefaultTBuiltInResource.maxComputeAtomicCounters << "\n" + << "MaxComputeAtomicCounterBuffers " << DefaultTBuiltInResource.maxComputeAtomicCounterBuffers << "\n" + << "MaxVaryingComponents " << DefaultTBuiltInResource.maxVaryingComponents << "\n" + << "MaxVertexOutputComponents " << DefaultTBuiltInResource.maxVertexOutputComponents << "\n" + << "MaxGeometryInputComponents " << DefaultTBuiltInResource.maxGeometryInputComponents << "\n" + << "MaxGeometryOutputComponents " << DefaultTBuiltInResource.maxGeometryOutputComponents << "\n" + << "MaxFragmentInputComponents " << DefaultTBuiltInResource.maxFragmentInputComponents << "\n" + << "MaxImageUnits " << DefaultTBuiltInResource.maxImageUnits << "\n" + << "MaxCombinedImageUnitsAndFragmentOutputs " << DefaultTBuiltInResource.maxCombinedImageUnitsAndFragmentOutputs << "\n" + << "MaxCombinedShaderOutputResources " << DefaultTBuiltInResource.maxCombinedShaderOutputResources << "\n" + << "MaxImageSamples " << DefaultTBuiltInResource.maxImageSamples << "\n" + << "MaxVertexImageUniforms " << DefaultTBuiltInResource.maxVertexImageUniforms << "\n" + << "MaxTessControlImageUniforms " << DefaultTBuiltInResource.maxTessControlImageUniforms << "\n" + << "MaxTessEvaluationImageUniforms " << DefaultTBuiltInResource.maxTessEvaluationImageUniforms << "\n" + << "MaxGeometryImageUniforms " << DefaultTBuiltInResource.maxGeometryImageUniforms << "\n" + << "MaxFragmentImageUniforms " << DefaultTBuiltInResource.maxFragmentImageUniforms << "\n" + << "MaxCombinedImageUniforms " << DefaultTBuiltInResource.maxCombinedImageUniforms << "\n" + << "MaxGeometryTextureImageUnits " << DefaultTBuiltInResource.maxGeometryTextureImageUnits << "\n" + << "MaxGeometryOutputVertices " << DefaultTBuiltInResource.maxGeometryOutputVertices << "\n" + << "MaxGeometryTotalOutputComponents " << DefaultTBuiltInResource.maxGeometryTotalOutputComponents << "\n" + << "MaxGeometryUniformComponents " << DefaultTBuiltInResource.maxGeometryUniformComponents << "\n" + << "MaxGeometryVaryingComponents " << DefaultTBuiltInResource.maxGeometryVaryingComponents << "\n" + << "MaxTessControlInputComponents " << DefaultTBuiltInResource.maxTessControlInputComponents << "\n" + << "MaxTessControlOutputComponents " << DefaultTBuiltInResource.maxTessControlOutputComponents << "\n" + << "MaxTessControlTextureImageUnits " << DefaultTBuiltInResource.maxTessControlTextureImageUnits << "\n" + << "MaxTessControlUniformComponents " << DefaultTBuiltInResource.maxTessControlUniformComponents << "\n" + << "MaxTessControlTotalOutputComponents " << DefaultTBuiltInResource.maxTessControlTotalOutputComponents << "\n" + << "MaxTessEvaluationInputComponents " << DefaultTBuiltInResource.maxTessEvaluationInputComponents << "\n" + << "MaxTessEvaluationOutputComponents " << DefaultTBuiltInResource.maxTessEvaluationOutputComponents << "\n" + << "MaxTessEvaluationTextureImageUnits " << DefaultTBuiltInResource.maxTessEvaluationTextureImageUnits << "\n" + << "MaxTessEvaluationUniformComponents " << DefaultTBuiltInResource.maxTessEvaluationUniformComponents << "\n" + << "MaxTessPatchComponents " << DefaultTBuiltInResource.maxTessPatchComponents << "\n" + << "MaxPatchVertices " << DefaultTBuiltInResource.maxPatchVertices << "\n" + << "MaxTessGenLevel " << DefaultTBuiltInResource.maxTessGenLevel << "\n" + << "MaxViewports " << DefaultTBuiltInResource.maxViewports << "\n" + << "MaxVertexAtomicCounters " << DefaultTBuiltInResource.maxVertexAtomicCounters << "\n" + << "MaxTessControlAtomicCounters " << DefaultTBuiltInResource.maxTessControlAtomicCounters << "\n" + << "MaxTessEvaluationAtomicCounters " << DefaultTBuiltInResource.maxTessEvaluationAtomicCounters << "\n" + << "MaxGeometryAtomicCounters " << DefaultTBuiltInResource.maxGeometryAtomicCounters << "\n" + << "MaxFragmentAtomicCounters " << DefaultTBuiltInResource.maxFragmentAtomicCounters << "\n" + << "MaxCombinedAtomicCounters " << DefaultTBuiltInResource.maxCombinedAtomicCounters << "\n" + << "MaxAtomicCounterBindings " << DefaultTBuiltInResource.maxAtomicCounterBindings << "\n" + << "MaxVertexAtomicCounterBuffers " << DefaultTBuiltInResource.maxVertexAtomicCounterBuffers << "\n" + << "MaxTessControlAtomicCounterBuffers " << DefaultTBuiltInResource.maxTessControlAtomicCounterBuffers << "\n" + << "MaxTessEvaluationAtomicCounterBuffers " << DefaultTBuiltInResource.maxTessEvaluationAtomicCounterBuffers << "\n" + << "MaxGeometryAtomicCounterBuffers " << DefaultTBuiltInResource.maxGeometryAtomicCounterBuffers << "\n" + << "MaxFragmentAtomicCounterBuffers " << DefaultTBuiltInResource.maxFragmentAtomicCounterBuffers << "\n" + << "MaxCombinedAtomicCounterBuffers " << DefaultTBuiltInResource.maxCombinedAtomicCounterBuffers << "\n" + << "MaxAtomicCounterBufferSize " << DefaultTBuiltInResource.maxAtomicCounterBufferSize << "\n" + << "MaxTransformFeedbackBuffers " << DefaultTBuiltInResource.maxTransformFeedbackBuffers << "\n" + << "MaxTransformFeedbackInterleavedComponents " << DefaultTBuiltInResource.maxTransformFeedbackInterleavedComponents << "\n" + << "MaxCullDistances " << DefaultTBuiltInResource.maxCullDistances << "\n" + << "MaxCombinedClipAndCullDistances " << DefaultTBuiltInResource.maxCombinedClipAndCullDistances << "\n" + << "MaxSamples " << DefaultTBuiltInResource.maxSamples << "\n" + << "MaxMeshOutputVerticesNV " << DefaultTBuiltInResource.maxMeshOutputVerticesNV << "\n" + << "MaxMeshOutputPrimitivesNV " << DefaultTBuiltInResource.maxMeshOutputPrimitivesNV << "\n" + << "MaxMeshWorkGroupSizeX_NV " << DefaultTBuiltInResource.maxMeshWorkGroupSizeX_NV << "\n" + << "MaxMeshWorkGroupSizeY_NV " << DefaultTBuiltInResource.maxMeshWorkGroupSizeY_NV << "\n" + << "MaxMeshWorkGroupSizeZ_NV " << DefaultTBuiltInResource.maxMeshWorkGroupSizeZ_NV << "\n" + << "MaxTaskWorkGroupSizeX_NV " << DefaultTBuiltInResource.maxTaskWorkGroupSizeX_NV << "\n" + << "MaxTaskWorkGroupSizeY_NV " << DefaultTBuiltInResource.maxTaskWorkGroupSizeY_NV << "\n" + << "MaxTaskWorkGroupSizeZ_NV " << DefaultTBuiltInResource.maxTaskWorkGroupSizeZ_NV << "\n" + << "MaxMeshViewCountNV " << DefaultTBuiltInResource.maxMeshViewCountNV << "\n" + << "MaxMeshOutputVerticesEXT " << DefaultTBuiltInResource.maxMeshOutputVerticesEXT << "\n" + << "MaxMeshOutputPrimitivesEXT " << DefaultTBuiltInResource.maxMeshOutputPrimitivesEXT << "\n" + << "MaxMeshWorkGroupSizeX_EXT " << DefaultTBuiltInResource.maxMeshWorkGroupSizeX_EXT << "\n" + << "MaxMeshWorkGroupSizeY_EXT " << DefaultTBuiltInResource.maxMeshWorkGroupSizeY_EXT << "\n" + << "MaxMeshWorkGroupSizeZ_EXT " << DefaultTBuiltInResource.maxMeshWorkGroupSizeZ_EXT << "\n" + << "MaxTaskWorkGroupSizeX_EXT " << DefaultTBuiltInResource.maxTaskWorkGroupSizeX_EXT << "\n" + << "MaxTaskWorkGroupSizeY_EXT " << DefaultTBuiltInResource.maxTaskWorkGroupSizeY_EXT << "\n" + << "MaxTaskWorkGroupSizeZ_EXT " << DefaultTBuiltInResource.maxTaskWorkGroupSizeZ_EXT << "\n" + << "MaxMeshViewCountEXT " << DefaultTBuiltInResource.maxMeshViewCountEXT << "\n" + << "MaxDualSourceDrawBuffersEXT " << DefaultTBuiltInResource.maxDualSourceDrawBuffersEXT << "\n" + << "nonInductiveForLoops " << DefaultTBuiltInResource.limits.nonInductiveForLoops << "\n" + << "whileLoops " << DefaultTBuiltInResource.limits.whileLoops << "\n" + << "doWhileLoops " << DefaultTBuiltInResource.limits.doWhileLoops << "\n" + << "generalUniformIndexing " << DefaultTBuiltInResource.limits.generalUniformIndexing << "\n" + << "generalAttributeMatrixVectorIndexing " << DefaultTBuiltInResource.limits.generalAttributeMatrixVectorIndexing << "\n" + << "generalVaryingIndexing " << DefaultTBuiltInResource.limits.generalVaryingIndexing << "\n" + << "generalSamplerIndexing " << DefaultTBuiltInResource.limits.generalSamplerIndexing << "\n" + << "generalVariableIndexing " << DefaultTBuiltInResource.limits.generalVariableIndexing << "\n" + << "generalConstantMatrixVectorIndexing " << DefaultTBuiltInResource.limits.generalConstantMatrixVectorIndexing << "\n" + ; + + return ostream.str(); +} + +void DecodeResourceLimits(TBuiltInResource* resources, char* config) +{ + static const char* delims = " \t\n\r"; + + size_t pos = 0; + std::string configStr(config); + + while ((pos = configStr.find_first_not_of(delims, pos)) != std::string::npos) { + const size_t token_s = pos; + const size_t token_e = configStr.find_first_of(delims, token_s); + const size_t value_s = configStr.find_first_not_of(delims, token_e); + const size_t value_e = configStr.find_first_of(delims, value_s); + pos = value_e; + + // Faster to use compare(), but prefering readability. + const std::string tokenStr = configStr.substr(token_s, token_e-token_s); + const std::string valueStr = configStr.substr(value_s, value_e-value_s); + + if (value_s == std::string::npos || ! (valueStr[0] == '-' || isdigit(valueStr[0]))) { + printf("Error: '%s' bad .conf file. Each name must be followed by one number.\n", + valueStr.c_str()); + return; + } + + const int value = std::atoi(valueStr.c_str()); + + if (tokenStr == "MaxLights") + resources->maxLights = value; + else if (tokenStr == "MaxClipPlanes") + resources->maxClipPlanes = value; + else if (tokenStr == "MaxTextureUnits") + resources->maxTextureUnits = value; + else if (tokenStr == "MaxTextureCoords") + resources->maxTextureCoords = value; + else if (tokenStr == "MaxVertexAttribs") + resources->maxVertexAttribs = value; + else if (tokenStr == "MaxVertexUniformComponents") + resources->maxVertexUniformComponents = value; + else if (tokenStr == "MaxVaryingFloats") + resources->maxVaryingFloats = value; + else if (tokenStr == "MaxVertexTextureImageUnits") + resources->maxVertexTextureImageUnits = value; + else if (tokenStr == "MaxCombinedTextureImageUnits") + resources->maxCombinedTextureImageUnits = value; + else if (tokenStr == "MaxTextureImageUnits") + resources->maxTextureImageUnits = value; + else if (tokenStr == "MaxFragmentUniformComponents") + resources->maxFragmentUniformComponents = value; + else if (tokenStr == "MaxDrawBuffers") + resources->maxDrawBuffers = value; + else if (tokenStr == "MaxVertexUniformVectors") + resources->maxVertexUniformVectors = value; + else if (tokenStr == "MaxVaryingVectors") + resources->maxVaryingVectors = value; + else if (tokenStr == "MaxFragmentUniformVectors") + resources->maxFragmentUniformVectors = value; + else if (tokenStr == "MaxVertexOutputVectors") + resources->maxVertexOutputVectors = value; + else if (tokenStr == "MaxFragmentInputVectors") + resources->maxFragmentInputVectors = value; + else if (tokenStr == "MinProgramTexelOffset") + resources->minProgramTexelOffset = value; + else if (tokenStr == "MaxProgramTexelOffset") + resources->maxProgramTexelOffset = value; + else if (tokenStr == "MaxClipDistances") + resources->maxClipDistances = value; + else if (tokenStr == "MaxComputeWorkGroupCountX") + resources->maxComputeWorkGroupCountX = value; + else if (tokenStr == "MaxComputeWorkGroupCountY") + resources->maxComputeWorkGroupCountY = value; + else if (tokenStr == "MaxComputeWorkGroupCountZ") + resources->maxComputeWorkGroupCountZ = value; + else if (tokenStr == "MaxComputeWorkGroupSizeX") + resources->maxComputeWorkGroupSizeX = value; + else if (tokenStr == "MaxComputeWorkGroupSizeY") + resources->maxComputeWorkGroupSizeY = value; + else if (tokenStr == "MaxComputeWorkGroupSizeZ") + resources->maxComputeWorkGroupSizeZ = value; + else if (tokenStr == "MaxComputeUniformComponents") + resources->maxComputeUniformComponents = value; + else if (tokenStr == "MaxComputeTextureImageUnits") + resources->maxComputeTextureImageUnits = value; + else if (tokenStr == "MaxComputeImageUniforms") + resources->maxComputeImageUniforms = value; + else if (tokenStr == "MaxComputeAtomicCounters") + resources->maxComputeAtomicCounters = value; + else if (tokenStr == "MaxComputeAtomicCounterBuffers") + resources->maxComputeAtomicCounterBuffers = value; + else if (tokenStr == "MaxVaryingComponents") + resources->maxVaryingComponents = value; + else if (tokenStr == "MaxVertexOutputComponents") + resources->maxVertexOutputComponents = value; + else if (tokenStr == "MaxGeometryInputComponents") + resources->maxGeometryInputComponents = value; + else if (tokenStr == "MaxGeometryOutputComponents") + resources->maxGeometryOutputComponents = value; + else if (tokenStr == "MaxFragmentInputComponents") + resources->maxFragmentInputComponents = value; + else if (tokenStr == "MaxImageUnits") + resources->maxImageUnits = value; + else if (tokenStr == "MaxCombinedImageUnitsAndFragmentOutputs") + resources->maxCombinedImageUnitsAndFragmentOutputs = value; + else if (tokenStr == "MaxCombinedShaderOutputResources") + resources->maxCombinedShaderOutputResources = value; + else if (tokenStr == "MaxImageSamples") + resources->maxImageSamples = value; + else if (tokenStr == "MaxVertexImageUniforms") + resources->maxVertexImageUniforms = value; + else if (tokenStr == "MaxTessControlImageUniforms") + resources->maxTessControlImageUniforms = value; + else if (tokenStr == "MaxTessEvaluationImageUniforms") + resources->maxTessEvaluationImageUniforms = value; + else if (tokenStr == "MaxGeometryImageUniforms") + resources->maxGeometryImageUniforms = value; + else if (tokenStr == "MaxFragmentImageUniforms") + resources->maxFragmentImageUniforms = value; + else if (tokenStr == "MaxCombinedImageUniforms") + resources->maxCombinedImageUniforms = value; + else if (tokenStr == "MaxGeometryTextureImageUnits") + resources->maxGeometryTextureImageUnits = value; + else if (tokenStr == "MaxGeometryOutputVertices") + resources->maxGeometryOutputVertices = value; + else if (tokenStr == "MaxGeometryTotalOutputComponents") + resources->maxGeometryTotalOutputComponents = value; + else if (tokenStr == "MaxGeometryUniformComponents") + resources->maxGeometryUniformComponents = value; + else if (tokenStr == "MaxGeometryVaryingComponents") + resources->maxGeometryVaryingComponents = value; + else if (tokenStr == "MaxTessControlInputComponents") + resources->maxTessControlInputComponents = value; + else if (tokenStr == "MaxTessControlOutputComponents") + resources->maxTessControlOutputComponents = value; + else if (tokenStr == "MaxTessControlTextureImageUnits") + resources->maxTessControlTextureImageUnits = value; + else if (tokenStr == "MaxTessControlUniformComponents") + resources->maxTessControlUniformComponents = value; + else if (tokenStr == "MaxTessControlTotalOutputComponents") + resources->maxTessControlTotalOutputComponents = value; + else if (tokenStr == "MaxTessEvaluationInputComponents") + resources->maxTessEvaluationInputComponents = value; + else if (tokenStr == "MaxTessEvaluationOutputComponents") + resources->maxTessEvaluationOutputComponents = value; + else if (tokenStr == "MaxTessEvaluationTextureImageUnits") + resources->maxTessEvaluationTextureImageUnits = value; + else if (tokenStr == "MaxTessEvaluationUniformComponents") + resources->maxTessEvaluationUniformComponents = value; + else if (tokenStr == "MaxTessPatchComponents") + resources->maxTessPatchComponents = value; + else if (tokenStr == "MaxPatchVertices") + resources->maxPatchVertices = value; + else if (tokenStr == "MaxTessGenLevel") + resources->maxTessGenLevel = value; + else if (tokenStr == "MaxViewports") + resources->maxViewports = value; + else if (tokenStr == "MaxVertexAtomicCounters") + resources->maxVertexAtomicCounters = value; + else if (tokenStr == "MaxTessControlAtomicCounters") + resources->maxTessControlAtomicCounters = value; + else if (tokenStr == "MaxTessEvaluationAtomicCounters") + resources->maxTessEvaluationAtomicCounters = value; + else if (tokenStr == "MaxGeometryAtomicCounters") + resources->maxGeometryAtomicCounters = value; + else if (tokenStr == "MaxFragmentAtomicCounters") + resources->maxFragmentAtomicCounters = value; + else if (tokenStr == "MaxCombinedAtomicCounters") + resources->maxCombinedAtomicCounters = value; + else if (tokenStr == "MaxAtomicCounterBindings") + resources->maxAtomicCounterBindings = value; + else if (tokenStr == "MaxVertexAtomicCounterBuffers") + resources->maxVertexAtomicCounterBuffers = value; + else if (tokenStr == "MaxTessControlAtomicCounterBuffers") + resources->maxTessControlAtomicCounterBuffers = value; + else if (tokenStr == "MaxTessEvaluationAtomicCounterBuffers") + resources->maxTessEvaluationAtomicCounterBuffers = value; + else if (tokenStr == "MaxGeometryAtomicCounterBuffers") + resources->maxGeometryAtomicCounterBuffers = value; + else if (tokenStr == "MaxFragmentAtomicCounterBuffers") + resources->maxFragmentAtomicCounterBuffers = value; + else if (tokenStr == "MaxCombinedAtomicCounterBuffers") + resources->maxCombinedAtomicCounterBuffers = value; + else if (tokenStr == "MaxAtomicCounterBufferSize") + resources->maxAtomicCounterBufferSize = value; + else if (tokenStr == "MaxTransformFeedbackBuffers") + resources->maxTransformFeedbackBuffers = value; + else if (tokenStr == "MaxTransformFeedbackInterleavedComponents") + resources->maxTransformFeedbackInterleavedComponents = value; + else if (tokenStr == "MaxCullDistances") + resources->maxCullDistances = value; + else if (tokenStr == "MaxCombinedClipAndCullDistances") + resources->maxCombinedClipAndCullDistances = value; + else if (tokenStr == "MaxSamples") + resources->maxSamples = value; + else if (tokenStr == "MaxMeshOutputVerticesNV") + resources->maxMeshOutputVerticesNV = value; + else if (tokenStr == "MaxMeshOutputPrimitivesNV") + resources->maxMeshOutputPrimitivesNV = value; + else if (tokenStr == "MaxMeshWorkGroupSizeX_NV") + resources->maxMeshWorkGroupSizeX_NV = value; + else if (tokenStr == "MaxMeshWorkGroupSizeY_NV") + resources->maxMeshWorkGroupSizeY_NV = value; + else if (tokenStr == "MaxMeshWorkGroupSizeZ_NV") + resources->maxMeshWorkGroupSizeZ_NV = value; + else if (tokenStr == "MaxTaskWorkGroupSizeX_NV") + resources->maxTaskWorkGroupSizeX_NV = value; + else if (tokenStr == "MaxTaskWorkGroupSizeY_NV") + resources->maxTaskWorkGroupSizeY_NV = value; + else if (tokenStr == "MaxTaskWorkGroupSizeZ_NV") + resources->maxTaskWorkGroupSizeZ_NV = value; + else if (tokenStr == "MaxMeshViewCountNV") + resources->maxMeshViewCountNV = value; + else if (tokenStr == "MaxMeshOutputVerticesEXT") + resources->maxMeshOutputVerticesEXT = value; + else if (tokenStr == "MaxMeshOutputPrimitivesEXT") + resources->maxMeshOutputPrimitivesEXT = value; + else if (tokenStr == "MaxMeshWorkGroupSizeX_EXT") + resources->maxMeshWorkGroupSizeX_EXT = value; + else if (tokenStr == "MaxMeshWorkGroupSizeY_EXT") + resources->maxMeshWorkGroupSizeY_EXT = value; + else if (tokenStr == "MaxMeshWorkGroupSizeZ_EXT") + resources->maxMeshWorkGroupSizeZ_EXT = value; + else if (tokenStr == "MaxTaskWorkGroupSizeX_EXT") + resources->maxTaskWorkGroupSizeX_EXT = value; + else if (tokenStr == "MaxTaskWorkGroupSizeY_EXT") + resources->maxTaskWorkGroupSizeY_EXT = value; + else if (tokenStr == "MaxTaskWorkGroupSizeZ_EXT") + resources->maxTaskWorkGroupSizeZ_EXT = value; + else if (tokenStr == "MaxMeshViewCountEXT") + resources->maxMeshViewCountEXT = value; + else if (tokenStr == "MaxDualSourceDrawBuffersEXT") + resources->maxDualSourceDrawBuffersEXT = value; + else if (tokenStr == "nonInductiveForLoops") + resources->limits.nonInductiveForLoops = (value != 0); + else if (tokenStr == "whileLoops") + resources->limits.whileLoops = (value != 0); + else if (tokenStr == "doWhileLoops") + resources->limits.doWhileLoops = (value != 0); + else if (tokenStr == "generalUniformIndexing") + resources->limits.generalUniformIndexing = (value != 0); + else if (tokenStr == "generalAttributeMatrixVectorIndexing") + resources->limits.generalAttributeMatrixVectorIndexing = (value != 0); + else if (tokenStr == "generalVaryingIndexing") + resources->limits.generalVaryingIndexing = (value != 0); + else if (tokenStr == "generalSamplerIndexing") + resources->limits.generalSamplerIndexing = (value != 0); + else if (tokenStr == "generalVariableIndexing") + resources->limits.generalVariableIndexing = (value != 0); + else if (tokenStr == "generalConstantMatrixVectorIndexing") + resources->limits.generalConstantMatrixVectorIndexing = (value != 0); + else + printf("Warning: unrecognized limit (%s) in configuration file.\n", tokenStr.c_str()); + + } +} + +TBuiltInResource* GetResources() +{ + return &Resources; +} + +const TBuiltInResource* GetDefaultResources() +{ + return &DefaultTBuiltInResource; +} diff --git a/libraries/ZVulkan/src/glslang/glslang/ResourceLimits/resource_limits_c.cpp b/libraries/ZVulkan/src/glslang/glslang/ResourceLimits/resource_limits_c.cpp new file mode 100644 index 000000000..45de6e6e3 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/glslang/ResourceLimits/resource_limits_c.cpp @@ -0,0 +1,56 @@ +/** +BSD 2-Clause License + +Copyright (c) 2020, Travis Fort +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**/ + +#include "../Public/resource_limits_c.h" +#include "../Public/ResourceLimits.h" +#include +#include +#include + +glslang_resource_t* glslang_resource(void) +{ + return reinterpret_cast(GetResources()); +} + +const glslang_resource_t* glslang_default_resource(void) +{ + return reinterpret_cast(GetDefaultResources()); +} + +const char* glslang_default_resource_string() +{ + std::string cpp_str = GetDefaultTBuiltInResourceString(); + char* c_str = (char*)malloc(cpp_str.length() + 1); + strncpy(c_str, cpp_str.c_str(), cpp_str.length() + 1); + return c_str; +} + +void glslang_decode_resource_limits(glslang_resource_t* resources, char* config) +{ + DecodeResourceLimits(reinterpret_cast(resources), config); +} diff --git a/libraries/ZVulkan/src/glslang/glslang/updateGrammar b/libraries/ZVulkan/src/glslang/glslang/updateGrammar index 9209493f3..a15dc24b3 100644 --- a/libraries/ZVulkan/src/glslang/glslang/updateGrammar +++ b/libraries/ZVulkan/src/glslang/glslang/updateGrammar @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Copyright (C) 2020 The Khronos Group Inc. # @@ -33,17 +33,4 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if [ "$1" = 'web' ] -then - m4 -P -DGLSLANG_WEB MachineIndependent/glslang.m4 > MachineIndependent/glslang.y -elif [ "$#" -eq 0 ] -then - m4 -P MachineIndependent/glslang.m4 > MachineIndependent/glslang.y -else - echo usage: - echo $0 web - echo $0 - exit -fi - bison --defines=MachineIndependent/glslang_tab.cpp.h -t MachineIndependent/glslang.y -o MachineIndependent/glslang_tab.cpp diff --git a/libraries/ZVulkan/src/glslang/spirv/CInterface/spirv_c_interface.cpp b/libraries/ZVulkan/src/glslang/spirv/CInterface/spirv_c_interface.cpp new file mode 100644 index 000000000..775e029c2 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/spirv/CInterface/spirv_c_interface.cpp @@ -0,0 +1,120 @@ +/** + This code is based on the glslang_c_interface implementation by Viktor Latypov +**/ + +/** +BSD 2-Clause License + +Copyright (c) 2019, Viktor Latypov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**/ + +#include "../../glslang/Include/glslang_c_interface.h" + +#include "../GlslangToSpv.h" +#include "../Logger.h" +#include "../SpvTools.h" + +static_assert(sizeof(glslang_spv_options_t) == sizeof(glslang::SpvOptions), ""); + +typedef struct glslang_program_s { + glslang::TProgram* program; + std::vector spirv; + std::string loggerMessages; +} glslang_program_t; + +static EShLanguage c_shader_stage(glslang_stage_t stage) +{ + switch (stage) { + case GLSLANG_STAGE_VERTEX: + return EShLangVertex; + case GLSLANG_STAGE_TESSCONTROL: + return EShLangTessControl; + case GLSLANG_STAGE_TESSEVALUATION: + return EShLangTessEvaluation; + case GLSLANG_STAGE_GEOMETRY: + return EShLangGeometry; + case GLSLANG_STAGE_FRAGMENT: + return EShLangFragment; + case GLSLANG_STAGE_COMPUTE: + return EShLangCompute; + case GLSLANG_STAGE_RAYGEN: + return EShLangRayGen; + case GLSLANG_STAGE_INTERSECT: + return EShLangIntersect; + case GLSLANG_STAGE_ANYHIT: + return EShLangAnyHit; + case GLSLANG_STAGE_CLOSESTHIT: + return EShLangClosestHit; + case GLSLANG_STAGE_MISS: + return EShLangMiss; + case GLSLANG_STAGE_CALLABLE: + return EShLangCallable; + case GLSLANG_STAGE_TASK: + return EShLangTask; + case GLSLANG_STAGE_MESH: + return EShLangMesh; + default: + break; + } + return EShLangCount; +} + +GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage) +{ + glslang_spv_options_t spv_options {}; + spv_options.disable_optimizer = true; + spv_options.validate = true; + + glslang_program_SPIRV_generate_with_options(program, stage, &spv_options); +} + +GLSLANG_EXPORT void glslang_program_SPIRV_generate_with_options(glslang_program_t* program, glslang_stage_t stage, glslang_spv_options_t* spv_options) { + spv::SpvBuildLogger logger; + + const glslang::TIntermediate* intermediate = program->program->getIntermediate(c_shader_stage(stage)); + + program->spirv.clear(); + + glslang::GlslangToSpv(*intermediate, program->spirv, &logger, reinterpret_cast(spv_options)); + + program->loggerMessages = logger.getAllMessages(); +} + +GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program) { return program->spirv.size(); } + +GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int* out) +{ + memcpy(out, program->spirv.data(), program->spirv.size() * sizeof(unsigned int)); +} + +GLSLANG_EXPORT unsigned int* glslang_program_SPIRV_get_ptr(glslang_program_t* program) +{ + return program->spirv.data(); +} + +GLSLANG_EXPORT const char* glslang_program_SPIRV_get_messages(glslang_program_t* program) +{ + return program->loggerMessages.empty() ? nullptr : program->loggerMessages.c_str(); +} diff --git a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.ARM.h b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.ARM.h new file mode 100644 index 000000000..14425be1e --- /dev/null +++ b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.ARM.h @@ -0,0 +1,35 @@ +/* +** Copyright (c) 2022 ARM Limited +** +** Permission is hereby granted, free of charge, to any person obtaining a copy +** of this software and/or associated documentation files (the "Materials"), +** to deal in the Materials without restriction, including without limitation +** the rights to use, copy, modify, merge, publish, distribute, sublicense, +** and/or sell copies of the Materials, and to permit persons to whom the +** Materials are furnished to do so, subject to the following conditions: +** +** The above copyright notice and this permission notice shall be included in +** all copies or substantial portions of the Materials. +** +** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +** IN THE MATERIALS. +*/ + +#ifndef GLSLextARM_H +#define GLSLextARM_H + +static const int GLSLextARMVersion = 100; +static const int GLSLextARMRevision = 1; + +static const char * const E_SPV_ARM_core_builtins = "SPV_ARM_core_builtins"; + +#endif // #ifndef GLSLextARM_H diff --git a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.EXT.h b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.EXT.h index f48f1304d..07f3c3026 100644 --- a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.EXT.h +++ b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.EXT.h @@ -39,5 +39,8 @@ static const char* const E_SPV_EXT_shader_atomic_float_add = "SPV_EXT_shader_ato static const char* const E_SPV_EXT_shader_atomic_float16_add = "SPV_EXT_shader_atomic_float16_add"; static const char* const E_SPV_EXT_shader_atomic_float_min_max = "SPV_EXT_shader_atomic_float_min_max"; static const char* const E_SPV_EXT_shader_image_int64 = "SPV_EXT_shader_image_int64"; +static const char* const E_SPV_EXT_shader_tile_image = "SPV_EXT_shader_tile_image"; +static const char* const E_SPV_EXT_mesh_shader = "SPV_EXT_mesh_shader"; +static const char* const E_SPV_ARM_cooperative_matrix_layouts = "SPV_ARM_cooperative_matrix_layouts"; #endif // #ifndef GLSLextEXT_H diff --git a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.KHR.h b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.KHR.h index 5eb3e9448..38d3b974b 100644 --- a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.KHR.h +++ b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.KHR.h @@ -1,5 +1,6 @@ /* ** Copyright (c) 2014-2020 The Khronos Group Inc. +** Copyright (C) 2022-2024 Arm Limited. ** Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. ** ** Permission is hereby granted, free of charge, to any person obtaining a copy @@ -29,7 +30,7 @@ #define GLSLextKHR_H static const int GLSLextKHRVersion = 100; -static const int GLSLextKHRRevision = 2; +static const int GLSLextKHRRevision = 3; static const char* const E_SPV_KHR_shader_ballot = "SPV_KHR_shader_ballot"; static const char* const E_SPV_KHR_subgroup_vote = "SPV_KHR_subgroup_vote"; @@ -52,5 +53,15 @@ static const char* const E_SPV_KHR_fragment_shading_rate = "SPV_KHR_fragm static const char* const E_SPV_KHR_terminate_invocation = "SPV_KHR_terminate_invocation"; static const char* const E_SPV_KHR_workgroup_memory_explicit_layout = "SPV_KHR_workgroup_memory_explicit_layout"; static const char* const E_SPV_KHR_subgroup_uniform_control_flow = "SPV_KHR_subgroup_uniform_control_flow"; +static const char* const E_SPV_KHR_fragment_shader_barycentric = "SPV_KHR_fragment_shader_barycentric"; +static const char* const E_SPV_KHR_quad_control = "SPV_KHR_quad_control"; +static const char* const E_SPV_AMD_shader_early_and_late_fragment_tests = "SPV_AMD_shader_early_and_late_fragment_tests"; +static const char* const E_SPV_KHR_ray_tracing_position_fetch = "SPV_KHR_ray_tracing_position_fetch"; +static const char* const E_SPV_KHR_cooperative_matrix = "SPV_KHR_cooperative_matrix"; +static const char* const E_SPV_KHR_maximal_reconvergence = "SPV_KHR_maximal_reconvergence"; +static const char* const E_SPV_KHR_subgroup_rotate = "SPV_KHR_subgroup_rotate"; +static const char* const E_SPV_KHR_expect_assume = "SPV_KHR_expect_assume"; +static const char* const E_SPV_EXT_replicated_composites = "SPV_EXT_replicated_composites"; +static const char* const E_SPV_KHR_relaxed_extended_instruction = "SPV_KHR_relaxed_extended_instruction"; #endif // #ifndef GLSLextKHR_H diff --git a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.NV.h b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.NV.h index 93c98bf62..e4f11e4bf 100644 --- a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.NV.h +++ b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.NV.h @@ -81,4 +81,13 @@ const char* const E_SPV_NV_cooperative_matrix = "SPV_NV_cooperative_matrix"; //SPV_NV_shader_sm_builtins const char* const E_SPV_NV_shader_sm_builtins = "SPV_NV_shader_sm_builtins"; +//SPV_NV_shader_execution_reorder +const char* const E_SPV_NV_shader_invocation_reorder = "SPV_NV_shader_invocation_reorder"; + +//SPV_NV_displacement_micromap +const char* const E_SPV_NV_displacement_micromap = "SPV_NV_displacement_micromap"; + +//SPV_NV_shader_atomic_fp16_vector +const char* const E_SPV_NV_shader_atomic_fp16_vector = "SPV_NV_shader_atomic_fp16_vector"; + #endif // #ifndef GLSLextNV_H diff --git a/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.QCOM.h b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.QCOM.h new file mode 100644 index 000000000..b52990f02 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/spirv/GLSL.ext.QCOM.h @@ -0,0 +1,43 @@ +/* +** Copyright (c) 2021 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a copy +** of this software and/or associated documentation files (the "Materials"), +** to deal in the Materials without restriction, including without limitation +** the rights to use, copy, modify, merge, publish, distribute, sublicense, +** and/or sell copies of the Materials, and to permit persons to whom the +** Materials are furnished to do so, subject to the following conditions: +** +** The above copyright notice and this permission notice shall be included in +** all copies or substantial portions of the Materials. +** +** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +** IN THE MATERIALS. +*/ + +#ifndef GLSLextQCOM_H +#define GLSLextQCOM_H + +enum BuiltIn; +enum Decoration; +enum Op; +enum Capability; + +static const int GLSLextQCOMVersion = 100; +static const int GLSLextQCOMRevision = 1; + +//SPV_QCOM_image_processing +const char* const E_SPV_QCOM_image_processing = "SPV_QCOM_image_processing"; +//SPV_QCOM_image_processing2 +const char* const E_SPV_QCOM_image_processing2 = "SPV_QCOM_image_processing2"; + +#endif // #ifndef GLSLextQCOM_H diff --git a/libraries/ZVulkan/src/glslang/spirv/GLSL.std.450.h b/libraries/ZVulkan/src/glslang/spirv/GLSL.std.450.h index df31092be..86d3da806 100644 --- a/libraries/ZVulkan/src/glslang/spirv/GLSL.std.450.h +++ b/libraries/ZVulkan/src/glslang/spirv/GLSL.std.450.h @@ -13,7 +13,7 @@ ** ** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS ** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, diff --git a/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.cpp b/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.cpp index 42b084cbe..0fd79b1a4 100644 --- a/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.cpp @@ -1,7 +1,7 @@ // // Copyright (C) 2014-2016 LunarG, Inc. // Copyright (C) 2015-2020 Google, Inc. -// Copyright (C) 2017 ARM Limited. +// Copyright (C) 2017, 2022-2024 Arm Limited. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. // // All rights reserved. @@ -43,12 +43,15 @@ #include "spirv.hpp" #include "GlslangToSpv.h" #include "SpvBuilder.h" +#include "SpvTools.h" namespace spv { #include "GLSL.std.450.h" #include "GLSL.ext.KHR.h" #include "GLSL.ext.EXT.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "GLSL.ext.QCOM.h" #include "NonSemanticDebugPrintf.h" } @@ -58,12 +61,13 @@ namespace spv { #include "../glslang/Include/Common.h" // Build-time generated includes -#include "../glslang/Include/build_info.h" +#include "glslang/build_info.h" #include #include #include #include +#include #include #include #include @@ -94,26 +98,18 @@ struct OpDecorations { public: OpDecorations(spv::Decoration precision, spv::Decoration noContraction, spv::Decoration nonUniform) : precision(precision) -#ifndef GLSLANG_WEB , noContraction(noContraction), nonUniform(nonUniform) -#endif { } spv::Decoration precision; -#ifdef GLSLANG_WEB - void addNoContraction(spv::Builder&, spv::Id) const { } - void addNonUniform(spv::Builder&, spv::Id) const { } -#else void addNoContraction(spv::Builder& builder, spv::Id t) { builder.addDecoration(t, noContraction); } void addNonUniform(spv::Builder& builder, spv::Id t) { builder.addDecoration(t, nonUniform); } protected: spv::Decoration noContraction; spv::Decoration nonUniform; -#endif - }; } // namespace @@ -139,7 +135,7 @@ public: bool visitLoop(glslang::TVisit, glslang::TIntermLoop*); bool visitBranch(glslang::TVisit visit, glslang::TIntermBranch*); - void finishSpv(); + void finishSpv(bool compileOnly); void dumpSpv(std::vector& out); protected: @@ -170,12 +166,14 @@ protected: spv::Id convertGlslangToSpvType(const glslang::TType& type, bool forwardReferenceOnly = false); spv::Id convertGlslangToSpvType(const glslang::TType& type, glslang::TLayoutPacking, const glslang::TQualifier&, bool lastBufferBlockMember, bool forwardReferenceOnly = false); + void applySpirvDecorate(const glslang::TType& type, spv::Id id, std::optional member); bool filterMember(const glslang::TType& member); spv::Id convertGlslangStructToSpvType(const glslang::TType&, const glslang::TTypeList* glslangStruct, glslang::TLayoutPacking, const glslang::TQualifier&); + spv::LinkageType convertGlslangLinkageToSpv(glslang::TLinkType glslangLinkType); void decorateStructType(const glslang::TType&, const glslang::TTypeList* glslangStruct, glslang::TLayoutPacking, - const glslang::TQualifier&, spv::Id); - spv::Id makeArraySizeId(const glslang::TArraySizes&, int dim); + const glslang::TQualifier&, spv::Id, const std::vector& spvMembers); + spv::Id makeArraySizeId(const glslang::TArraySizes&, int dim, bool allowZero = false); spv::Id accessChainLoad(const glslang::TType& type); void accessChainStore(const glslang::TType& type, spv::Id rvalue); void multiTypeStore(const glslang::TType&, spv::Id rValue); @@ -206,16 +204,18 @@ protected: spv::Id createBinaryMatrixOperation(spv::Op, OpDecorations&, spv::Id typeId, spv::Id left, spv::Id right); spv::Id createUnaryOperation(glslang::TOperator op, OpDecorations&, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy, - const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags); + const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags, + const glslang::TType &opType); spv::Id createUnaryMatrixOperation(spv::Op op, OpDecorations&, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy); spv::Id createConversion(glslang::TOperator op, OpDecorations&, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy); - spv::Id createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize); + spv::Id createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize, spv::Id destType); spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy, - const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags); + const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags, + const glslang::TType &opType); spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::GroupOperation groupOperation, @@ -227,6 +227,9 @@ protected: spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId); spv::Id getSymbolId(const glslang::TIntermSymbol* node); void addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier & qualifier); + bool hasQCOMImageProceessingDecoration(spv::Id id, spv::Decoration decor); + void addImageProcessingQCOMDecoration(spv::Id id, spv::Decoration decor); + void addImageProcessing2QCOMDecoration(spv::Id id, bool isForGather); spv::Id createSpvConstant(const glslang::TIntermTyped&); spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&, int& nextConst, bool specConstant); @@ -260,6 +263,7 @@ protected: std::unordered_map extBuiltinMap; std::unordered_map symbolValues; + std::unordered_map builtInVariableIds; std::unordered_set rValueParameters; // set of formal function parameters passed as rValues, // rather than a pointer std::unordered_map functionMap; @@ -276,9 +280,11 @@ protected: // requiring local translation to and from SPIR-V type on every access. // Maps AST-required-type-id> std::unordered_map forceType; - - // Used later for generating OpTraceKHR/OpExecuteCallableKHR - std::unordered_map locationToSymbol[2]; + // Used by Task shader while generating opearnds for OpEmitMeshTasksEXT + spv::Id taskPayloadID; + // Used later for generating OpTraceKHR/OpExecuteCallableKHR/OpHitObjectRecordHit*/OpHitObjectGetShaderBindingTableData + std::unordered_map locationToSymbol[4]; + std::unordered_map > idToQCOMDecorations; }; // @@ -288,12 +294,6 @@ protected: // Translate glslang profile to SPIR-V source language. spv::SourceLanguage TranslateSourceLanguage(glslang::EShSource source, EProfile profile) { -#ifdef GLSLANG_WEB - return spv::SourceLanguageESSL; -#elif defined(GLSLANG_ANGLE) - return spv::SourceLanguageGLSL; -#endif - switch (source) { case glslang::EShSourceGlsl: switch (profile) { @@ -314,13 +314,12 @@ spv::SourceLanguage TranslateSourceLanguage(glslang::EShSource source, EProfile } // Translate glslang language (stage) to SPIR-V execution model. -spv::ExecutionModel TranslateExecutionModel(EShLanguage stage) +spv::ExecutionModel TranslateExecutionModel(EShLanguage stage, bool isMeshShaderEXT = false) { switch (stage) { case EShLangVertex: return spv::ExecutionModelVertex; case EShLangFragment: return spv::ExecutionModelFragment; case EShLangCompute: return spv::ExecutionModelGLCompute; -#ifndef GLSLANG_WEB case EShLangTessControl: return spv::ExecutionModelTessellationControl; case EShLangTessEvaluation: return spv::ExecutionModelTessellationEvaluation; case EShLangGeometry: return spv::ExecutionModelGeometry; @@ -330,9 +329,8 @@ spv::ExecutionModel TranslateExecutionModel(EShLanguage stage) case EShLangClosestHit: return spv::ExecutionModelClosestHitKHR; case EShLangMiss: return spv::ExecutionModelMissKHR; case EShLangCallable: return spv::ExecutionModelCallableKHR; - case EShLangTaskNV: return spv::ExecutionModelTaskNV; - case EShLangMeshNV: return spv::ExecutionModelMeshNV; -#endif + case EShLangTask: return (isMeshShaderEXT)? spv::ExecutionModelTaskEXT : spv::ExecutionModelTaskNV; + case EShLangMesh: return (isMeshShaderEXT)? spv::ExecutionModelMeshEXT: spv::ExecutionModelMeshNV; default: assert(0); return spv::ExecutionModelFragment; @@ -350,6 +348,7 @@ spv::Dim TranslateDimensionality(const glslang::TSampler& sampler) case glslang::EsdRect: return spv::DimRect; case glslang::EsdBuffer: return spv::DimBuffer; case glslang::EsdSubpass: return spv::DimSubpassData; + case glslang::EsdAttachmentEXT: return spv::DimTileImageDataEXT; default: assert(0); return spv::Dim2D; @@ -374,26 +373,23 @@ spv::Decoration TranslatePrecisionDecoration(const glslang::TType& type) } // Translate glslang type to SPIR-V block decorations. -spv::Decoration TranslateBlockDecoration(const glslang::TType& type, bool useStorageBuffer) +spv::Decoration TranslateBlockDecoration(const glslang::TStorageQualifier storage, bool useStorageBuffer) { - if (type.getBasicType() == glslang::EbtBlock) { - switch (type.getQualifier().storage) { - case glslang::EvqUniform: return spv::DecorationBlock; - case glslang::EvqBuffer: return useStorageBuffer ? spv::DecorationBlock : spv::DecorationBufferBlock; - case glslang::EvqVaryingIn: return spv::DecorationBlock; - case glslang::EvqVaryingOut: return spv::DecorationBlock; - case glslang::EvqShared: return spv::DecorationBlock; -#ifndef GLSLANG_WEB - case glslang::EvqPayload: return spv::DecorationBlock; - case glslang::EvqPayloadIn: return spv::DecorationBlock; - case glslang::EvqHitAttr: return spv::DecorationBlock; - case glslang::EvqCallableData: return spv::DecorationBlock; - case glslang::EvqCallableDataIn: return spv::DecorationBlock; -#endif - default: - assert(0); - break; - } + switch (storage) { + case glslang::EvqUniform: return spv::DecorationBlock; + case glslang::EvqBuffer: return useStorageBuffer ? spv::DecorationBlock : spv::DecorationBufferBlock; + case glslang::EvqVaryingIn: return spv::DecorationBlock; + case glslang::EvqVaryingOut: return spv::DecorationBlock; + case glslang::EvqShared: return spv::DecorationBlock; + case glslang::EvqPayload: return spv::DecorationBlock; + case glslang::EvqPayloadIn: return spv::DecorationBlock; + case glslang::EvqHitAttr: return spv::DecorationBlock; + case glslang::EvqCallableData: return spv::DecorationBlock; + case glslang::EvqCallableDataIn: return spv::DecorationBlock; + case glslang::EvqHitObjectAttrNV: return spv::DecorationBlock; + default: + assert(0); + break; } return spv::DecorationMax; @@ -404,11 +400,11 @@ void TranslateMemoryDecoration(const glslang::TQualifier& qualifier, std::vector bool useVulkanMemoryModel) { if (!useVulkanMemoryModel) { - if (qualifier.isCoherent()) - memory.push_back(spv::DecorationCoherent); if (qualifier.isVolatile()) { memory.push_back(spv::DecorationVolatile); memory.push_back(spv::DecorationCoherent); + } else if (qualifier.isCoherent()) { + memory.push_back(spv::DecorationCoherent); } } if (qualifier.isRestrict()) @@ -460,14 +456,13 @@ spv::Decoration TranslateLayoutDecoration(const glslang::TType& type, glslang::T assert(type.getQualifier().layoutPacking == glslang::ElpNone); } return spv::DecorationMax; -#ifndef GLSLANG_WEB case glslang::EvqPayload: case glslang::EvqPayloadIn: case glslang::EvqHitAttr: case glslang::EvqCallableData: case glslang::EvqCallableDataIn: + case glslang::EvqHitObjectAttrNV: return spv::DecorationMax; -#endif default: assert(0); return spv::DecorationMax; @@ -503,14 +498,12 @@ spv::Decoration TGlslangToSpvTraverser::TranslateAuxiliaryStorageDecoration(cons { if (qualifier.centroid) return spv::DecorationCentroid; -#ifndef GLSLANG_WEB else if (qualifier.patch) return spv::DecorationPatch; else if (qualifier.sample) { builder.addCapability(spv::CapabilitySampleRateShading); return spv::DecorationSample; } -#endif return spv::DecorationMax; } @@ -527,24 +520,20 @@ spv::Decoration TranslateInvariantDecoration(const glslang::TQualifier& qualifie // If glslang type is noContraction, return SPIR-V NoContraction decoration. spv::Decoration TranslateNoContractionDecoration(const glslang::TQualifier& qualifier) { -#ifndef GLSLANG_WEB if (qualifier.isNoContraction()) return spv::DecorationNoContraction; else -#endif return spv::DecorationMax; } // If glslang type is nonUniform, return SPIR-V NonUniform decoration. spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(const glslang::TQualifier& qualifier) { -#ifndef GLSLANG_WEB if (qualifier.isNonUniform()) { builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5); builder.addCapability(spv::CapabilityShaderNonUniformEXT); return spv::DecorationNonUniformEXT; } else -#endif return spv::DecorationMax; } @@ -552,13 +541,11 @@ spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(const glsl spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration( const spv::Builder::AccessChain::CoherentFlags& coherentFlags) { -#ifndef GLSLANG_WEB if (coherentFlags.isNonUniform()) { builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5); builder.addCapability(spv::CapabilityShaderNonUniformEXT); return spv::DecorationNonUniformEXT; } else -#endif return spv::DecorationMax; } @@ -567,7 +554,6 @@ spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess( { spv::MemoryAccessMask mask = spv::MemoryAccessMaskNone; -#ifndef GLSLANG_WEB if (!glslangIntermediate->usingVulkanMemoryModel() || coherentFlags.isImage) return mask; @@ -585,7 +571,6 @@ spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess( if (mask != spv::MemoryAccessMaskNone) { builder.addCapability(spv::CapabilityVulkanMemoryModelKHR); } -#endif return mask; } @@ -595,7 +580,6 @@ spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands( { spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone; -#ifndef GLSLANG_WEB if (!glslangIntermediate->usingVulkanMemoryModel()) return mask; @@ -613,7 +597,6 @@ spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands( if (mask != spv::ImageOperandsMaskNone) { builder.addCapability(spv::CapabilityVulkanMemoryModelKHR); } -#endif return mask; } @@ -621,7 +604,6 @@ spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands( spv::Builder::AccessChain::CoherentFlags TGlslangToSpvTraverser::TranslateCoherent(const glslang::TType& type) { spv::Builder::AccessChain::CoherentFlags flags = {}; -#ifndef GLSLANG_WEB flags.coherent = type.getQualifier().coherent; flags.devicecoherent = type.getQualifier().devicecoherent; flags.queuefamilycoherent = type.getQualifier().queuefamilycoherent; @@ -636,7 +618,6 @@ spv::Builder::AccessChain::CoherentFlags TGlslangToSpvTraverser::TranslateCohere flags.anyCoherent() || flags.volatil; flags.isImage = type.getBasicType() == glslang::EbtSampler; -#endif flags.nonUniform = type.getQualifier().nonUniform; return flags; } @@ -646,7 +627,6 @@ spv::Scope TGlslangToSpvTraverser::TranslateMemoryScope( { spv::Scope scope = spv::ScopeMax; -#ifndef GLSLANG_WEB if (coherentFlags.volatil || coherentFlags.coherent) { // coherent defaults to Device scope in the old model, QueueFamilyKHR scope in the new model scope = glslangIntermediate->usingVulkanMemoryModel() ? spv::ScopeQueueFamilyKHR : spv::ScopeDevice; @@ -664,7 +644,6 @@ spv::Scope TGlslangToSpvTraverser::TranslateMemoryScope( if (glslangIntermediate->usingVulkanMemoryModel() && scope == spv::ScopeDevice) { builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR); } -#endif return scope; } @@ -679,7 +658,6 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI { switch (builtIn) { case glslang::EbvPointSize: -#ifndef GLSLANG_WEB // Defer adding the capability until the built-in is actually used. if (! memberDeclaration) { switch (glslangIntermediate->getStage()) { @@ -694,7 +672,6 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI break; } } -#endif return spv::BuiltInPointSize; case glslang::EbvPosition: return spv::BuiltInPosition; @@ -715,7 +692,6 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI case glslang::EbvLocalInvocationIndex: return spv::BuiltInLocalInvocationIndex; case glslang::EbvGlobalInvocationId: return spv::BuiltInGlobalInvocationId; -#ifndef GLSLANG_WEB // These *Distance capabilities logically belong here, but if the member is declared and // then never used, consumers of SPIR-V prefer the capability not be declared. // They are now generated when used, rather than here when declared. @@ -762,7 +738,7 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI return spv::BuiltInSampleMask; case glslang::EbvLayer: - if (glslangIntermediate->getStage() == EShLangMeshNV) { + if (glslangIntermediate->getStage() == EShLangMesh) { return spv::BuiltInLayer; } if (glslangIntermediate->getStage() == EShLangGeometry || @@ -1007,20 +983,12 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI return spv::BuiltInRayTminKHR; case glslang::EbvRayTmax: return spv::BuiltInRayTmaxKHR; + case glslang::EbvCullMask: + return spv::BuiltInCullMaskKHR; + case glslang::EbvPositionFetch: + return spv::BuiltInHitTriangleVertexPositionsKHR; case glslang::EbvInstanceCustomIndex: return spv::BuiltInInstanceCustomIndexKHR; - case glslang::EbvHitT: - { - // this is a GLSL alias of RayTmax - // in SPV_NV_ray_tracing it has a dedicated builtin - // but in SPV_KHR_ray_tracing it gets mapped to RayTmax - auto& extensions = glslangIntermediate->getRequestedExtensions(); - if (extensions.find("GL_NV_ray_tracing") != extensions.end()) { - return spv::BuiltInHitTNV; - } else { - return spv::BuiltInRayTmaxKHR; - } - } case glslang::EbvHitKind: return spv::BuiltInHitKindKHR; case glslang::EbvObjectToWorld: @@ -1037,6 +1005,22 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur); builder.addCapability(spv::CapabilityRayTracingMotionBlurNV); return spv::BuiltInCurrentRayTimeNV; + case glslang::EbvMicroTrianglePositionNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitMicroTriangleVertexPositionsNV; + case glslang::EbvMicroTriangleBaryNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitMicroTriangleVertexBarycentricsNV; + case glslang::EbvHitKindFrontFacingMicroTriangleNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitKindFrontFacingMicroTriangleNV; + case glslang::EbvHitKindBackFacingMicroTriangleNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitKindBackFacingMicroTriangleNV; // barycentrics case glslang::EbvBaryCoordNV: @@ -1048,6 +1032,15 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI builder.addCapability(spv::CapabilityFragmentBarycentricNV); return spv::BuiltInBaryCoordNoPerspNV; + case glslang::EbvBaryCoordEXT: + builder.addExtension(spv::E_SPV_KHR_fragment_shader_barycentric); + builder.addCapability(spv::CapabilityFragmentBarycentricKHR); + return spv::BuiltInBaryCoordKHR; + case glslang::EbvBaryCoordNoPerspEXT: + builder.addExtension(spv::E_SPV_KHR_fragment_shader_barycentric); + builder.addCapability(spv::CapabilityFragmentBarycentricKHR); + return spv::BuiltInBaryCoordNoPerspKHR; + // mesh shaders case glslang::EbvTaskCountNV: return spv::BuiltInTaskCountNV; @@ -1066,6 +1059,16 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI case glslang::EbvMeshViewIndicesNV: return spv::BuiltInMeshViewIndicesNV; + // SPV_EXT_mesh_shader + case glslang::EbvPrimitivePointIndicesEXT: + return spv::BuiltInPrimitivePointIndicesEXT; + case glslang::EbvPrimitiveLineIndicesEXT: + return spv::BuiltInPrimitiveLineIndicesEXT; + case glslang::EbvPrimitiveTriangleIndicesEXT: + return spv::BuiltInPrimitiveTriangleIndicesEXT; + case glslang::EbvCullPrimitiveEXT: + return spv::BuiltInCullPrimitiveEXT; + // sm builtins case glslang::EbvWarpsPerSM: builder.addExtension(spv::E_SPV_NV_shader_sm_builtins); @@ -1083,7 +1086,28 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI builder.addExtension(spv::E_SPV_NV_shader_sm_builtins); builder.addCapability(spv::CapabilityShaderSMBuiltinsNV); return spv::BuiltInSMIDNV; -#endif + + // ARM builtins + case glslang::EbvCoreCountARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInCoreCountARM; + case glslang::EbvCoreIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInCoreIDARM; + case glslang::EbvCoreMaxIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInCoreMaxIDARM; + case glslang::EbvWarpIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInWarpIDARM; + case glslang::EbvWarpMaxIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInWarpMaxIDARM; default: return spv::BuiltInMax; @@ -1095,10 +1119,6 @@ spv::ImageFormat TGlslangToSpvTraverser::TranslateImageFormat(const glslang::TTy { assert(type.getBasicType() == glslang::EbtSampler); -#ifdef GLSLANG_WEB - return spv::ImageFormatUnknown; -#endif - // Check for capabilities switch (type.getQualifier().getFormat()) { case glslang::ElfRg32f: @@ -1136,6 +1156,7 @@ spv::ImageFormat TGlslangToSpvTraverser::TranslateImageFormat(const glslang::TTy case glslang::ElfR64i: builder.addExtension(spv::E_SPV_EXT_shader_image_int64); builder.addCapability(spv::CapabilityInt64ImageEXT); + break; default: break; } @@ -1253,22 +1274,27 @@ spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(const glslang: // Translate glslang type to SPIR-V storage class. spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::TType& type) { - if (type.getBasicType() == glslang::EbtRayQuery) + if (type.getBasicType() == glslang::EbtRayQuery || type.getBasicType() == glslang::EbtHitObjectNV) return spv::StorageClassPrivate; -#ifndef GLSLANG_WEB - if (type.getQualifier().isSpirvByReference()) - return spv::StorageClassFunction; -#endif + if (type.getQualifier().isSpirvByReference()) { + if (type.getQualifier().isParamInput() || type.getQualifier().isParamOutput()) + return spv::StorageClassFunction; + } if (type.getQualifier().isPipeInput()) return spv::StorageClassInput; if (type.getQualifier().isPipeOutput()) return spv::StorageClassOutput; + if (type.getQualifier().storage == glslang::EvqTileImageEXT || type.isAttachmentEXT()) { + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.addCapability(spv::CapabilityTileImageColorReadAccessEXT); + return spv::StorageClassTileImageEXT; + } if (glslangIntermediate->getSource() != glslang::EShSourceHlsl || type.getQualifier().storage == glslang::EvqUniform) { if (type.isAtomic()) return spv::StorageClassAtomicCounter; - if (type.containsOpaque()) + if (type.containsOpaque() && !glslangIntermediate->getBindlessMode()) return spv::StorageClassUniformConstant; } @@ -1301,14 +1327,14 @@ spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::T case glslang::EvqConstReadOnly: return spv::StorageClassFunction; case glslang::EvqTemporary: return spv::StorageClassFunction; case glslang::EvqShared: return spv::StorageClassWorkgroup; -#ifndef GLSLANG_WEB case glslang::EvqPayload: return spv::StorageClassRayPayloadKHR; case glslang::EvqPayloadIn: return spv::StorageClassIncomingRayPayloadKHR; case glslang::EvqHitAttr: return spv::StorageClassHitAttributeKHR; case glslang::EvqCallableData: return spv::StorageClassCallableDataKHR; case glslang::EvqCallableDataIn: return spv::StorageClassIncomingCallableDataKHR; + case glslang::EvqtaskPayloadSharedEXT : return spv::StorageClassTaskPayloadWorkgroupEXT; + case glslang::EvqHitObjectAttrNV: return spv::StorageClassHitObjectAttributeNV; case glslang::EvqSpirvStorageClass: return static_cast(type.getQualifier().spirvStorageClass); -#endif default: assert(0); break; @@ -1324,7 +1350,9 @@ void TGlslangToSpvTraverser::TranslateLiterals(const glslang::TVectorgetBasicType() == glslang::EbtFloat) { float floatValue = static_cast(constant->getConstArray()[0].getDConst()); - unsigned literal = *reinterpret_cast(&floatValue); + unsigned literal; + static_assert(sizeof(literal) == sizeof(floatValue), "sizeof(unsigned) != sizeof(float)"); + memcpy(&literal, &floatValue, sizeof(literal)); literals.push_back(literal); } else if (constant->getBasicType() == glslang::EbtInt) { unsigned literal = constant->getConstArray()[0].getIConst(); @@ -1367,7 +1395,6 @@ void TGlslangToSpvTraverser::TranslateLiterals(const glslang::TVectorgetNanMinMaxClamp()), - nonSemanticDebugPrintf(0) + nonSemanticDebugPrintf(0), + taskPayloadID(0) { - spv::ExecutionModel executionModel = TranslateExecutionModel(glslangIntermediate->getStage()); + bool isMeshShaderExt = (glslangIntermediate->getRequestedExtensions().find(glslang::E_GL_EXT_mesh_shader) != + glslangIntermediate->getRequestedExtensions().end()); + spv::ExecutionModel executionModel = TranslateExecutionModel(glslangIntermediate->getStage(), isMeshShaderExt); builder.clearAccessChain(); builder.setSource(TranslateSourceLanguage(glslangIntermediate->getSource(), glslangIntermediate->getProfile()), glslangIntermediate->getVersion()); - if (options.generateDebugInfo) { - builder.setEmitOpLines(); - builder.setSourceFile(glslangIntermediate->getSourceFile()); + if (options.emitNonSemanticShaderDebugSource) + this->options.emitNonSemanticShaderDebugInfo = true; + if (options.emitNonSemanticShaderDebugInfo) + this->options.generateDebugInfo = true; + + if (this->options.generateDebugInfo) { + if (this->options.emitNonSemanticShaderDebugInfo) { + builder.setEmitNonSemanticShaderDebugInfo(this->options.emitNonSemanticShaderDebugSource); + } + else { + builder.setEmitSpirvDebugInfo(); + } + builder.setDebugSourceFile(glslangIntermediate->getSourceFile()); // Set the source shader's text. If for SPV version 1.0, include // a preamble in comments stating the OpModuleProcessed instructions. @@ -1543,6 +1582,9 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, for (auto iItr = include_txt.begin(); iItr != include_txt.end(); ++iItr) builder.addInclude(iItr->first, iItr->second); } + + builder.setUseReplicatedComposites(glslangIntermediate->usingReplicatedComposites()); + stdBuiltins = builder.import("GLSL.std.450"); spv::AddressingModel addressingModel = spv::AddressingModelLogical; @@ -1564,8 +1606,12 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addCapability(spv::CapabilityVariablePointers); } - shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str()); - entryPoint = builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str()); + // If not linking, there is no entry point + if (!options.compileOnly) { + shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str()); + entryPoint = + builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str()); + } // Add the source extensions const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions(); @@ -1583,12 +1629,28 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingKHR); } -#ifndef GLSLANG_WEB if (glslangIntermediate->getSubgroupUniformControlFlow()) { builder.addExtension(spv::E_SPV_KHR_subgroup_uniform_control_flow); builder.addExecutionMode(shaderEntry, spv::ExecutionModeSubgroupUniformControlFlowKHR); } -#endif + if (glslangIntermediate->getMaximallyReconverges()) { + builder.addExtension(spv::E_SPV_KHR_maximal_reconvergence); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeMaximallyReconvergesKHR); + } + + if (glslangIntermediate->getQuadDerivMode()) + { + builder.addCapability(spv::CapabilityQuadControlKHR); + builder.addExtension(spv::E_SPV_KHR_quad_control); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeQuadDerivativesKHR); + } + + if (glslangIntermediate->getReqFullQuadsMode()) + { + builder.addCapability(spv::CapabilityQuadControlKHR); + builder.addExtension(spv::E_SPV_KHR_quad_control); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeRequireFullQuadsKHR); + } unsigned int mode; switch (glslangIntermediate->getStage()) { @@ -1609,16 +1671,41 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, if (glslangIntermediate->getEarlyFragmentTests()) builder.addExecutionMode(shaderEntry, spv::ExecutionModeEarlyFragmentTests); + if (glslangIntermediate->getEarlyAndLateFragmentTestsAMD()) + { + builder.addExecutionMode(shaderEntry, spv::ExecutionModeEarlyAndLateFragmentTestsAMD); + builder.addExtension(spv::E_SPV_AMD_shader_early_and_late_fragment_tests); + } + if (glslangIntermediate->getPostDepthCoverage()) { builder.addCapability(spv::CapabilitySampleMaskPostDepthCoverage); builder.addExecutionMode(shaderEntry, spv::ExecutionModePostDepthCoverage); builder.addExtension(spv::E_SPV_KHR_post_depth_coverage); } + if (glslangIntermediate->getNonCoherentColorAttachmentReadEXT()) { + builder.addCapability(spv::CapabilityTileImageColorReadAccessEXT); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeNonCoherentColorAttachmentReadEXT); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + } + + if (glslangIntermediate->getNonCoherentDepthAttachmentReadEXT()) { + builder.addCapability(spv::CapabilityTileImageDepthReadAccessEXT); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeNonCoherentDepthAttachmentReadEXT); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + } + + if (glslangIntermediate->getNonCoherentStencilAttachmentReadEXT()) { + builder.addCapability(spv::CapabilityTileImageStencilReadAccessEXT); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeNonCoherentStencilAttachmentReadEXT); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + } + if (glslangIntermediate->isDepthReplacing()) builder.addExecutionMode(shaderEntry, spv::ExecutionModeDepthReplacing); -#ifndef GLSLANG_WEB + if (glslangIntermediate->isStencilReplacing()) + builder.addExecutionMode(shaderEntry, spv::ExecutionModeStencilRefReplacingEXT); switch(glslangIntermediate->getDepth()) { case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break; @@ -1626,6 +1713,20 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, case glslang::EldUnchanged: mode = spv::ExecutionModeDepthUnchanged; break; default: mode = spv::ExecutionModeMax; break; } + + if (mode != spv::ExecutionModeMax) + builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); + + switch (glslangIntermediate->getStencil()) { + case glslang::ElsRefUnchangedFrontAMD: mode = spv::ExecutionModeStencilRefUnchangedFrontAMD; break; + case glslang::ElsRefGreaterFrontAMD: mode = spv::ExecutionModeStencilRefGreaterFrontAMD; break; + case glslang::ElsRefLessFrontAMD: mode = spv::ExecutionModeStencilRefLessFrontAMD; break; + case glslang::ElsRefUnchangedBackAMD: mode = spv::ExecutionModeStencilRefUnchangedBackAMD; break; + case glslang::ElsRefGreaterBackAMD: mode = spv::ExecutionModeStencilRefGreaterBackAMD; break; + case glslang::ElsRefLessBackAMD: mode = spv::ExecutionModeStencilRefLessBackAMD; break; + default: mode = spv::ExecutionModeMax; break; + } + if (mode != spv::ExecutionModeMax) builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); switch (glslangIntermediate->getInterlockOrdering()) { @@ -1657,14 +1758,34 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, } builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock); } -#endif break; - case EShLangCompute: + case EShLangCompute: { builder.addCapability(spv::CapabilityShader); - builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0), - glslangIntermediate->getLocalSize(1), - glslangIntermediate->getLocalSize(2)); + bool needSizeId = false; + for (int dim = 0; dim < 3; ++dim) { + if ((glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet)) { + needSizeId = true; + break; + } + } + if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6 && needSizeId) { + std::vector dimConstId; + for (int dim = 0; dim < 3; ++dim) { + bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet); + dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst)); + if (specConst) { + builder.addDecoration(dimConstId.back(), spv::DecorationSpecId, + glslangIntermediate->getLocalSizeSpecId(dim)); + needSizeId = true; + } + } + builder.addExecutionModeId(shaderEntry, spv::ExecutionModeLocalSizeId, dimConstId); + } else { + builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0), + glslangIntermediate->getLocalSize(1), + glslangIntermediate->getLocalSize(2)); + } if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) { builder.addCapability(spv::CapabilityComputeDerivativeGroupQuadsNV); builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupQuadsNV); @@ -1675,7 +1796,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives); } break; -#ifndef GLSLANG_WEB + } case EShLangTessEvaluation: case EShLangTessControl: builder.addCapability(spv::CapabilityTessellation); @@ -1751,7 +1872,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, case EShLangAnyHit: case EShLangClosestHit: case EShLangMiss: - case EShLangCallable: + case EShLangCallable: { auto& extensions = glslangIntermediate->getRequestedExtensions(); if (extensions.find("GL_NV_ray_tracing") == extensions.end()) { @@ -1762,16 +1883,44 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addCapability(spv::CapabilityRayTracingNV); builder.addExtension("SPV_NV_ray_tracing"); } + if (glslangIntermediate->getStage() != EShLangRayGen && glslangIntermediate->getStage() != EShLangCallable) { + if (extensions.find("GL_EXT_ray_cull_mask") != extensions.end()) { + builder.addCapability(spv::CapabilityRayCullMaskKHR); + builder.addExtension("SPV_KHR_ray_cull_mask"); + } + if (extensions.find("GL_EXT_ray_tracing_position_fetch") != extensions.end()) { + builder.addCapability(spv::CapabilityRayTracingPositionFetchKHR); + builder.addExtension("SPV_KHR_ray_tracing_position_fetch"); + } + } break; } - case EShLangTaskNV: - case EShLangMeshNV: - builder.addCapability(spv::CapabilityMeshShadingNV); - builder.addExtension(spv::E_SPV_NV_mesh_shader); - builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0), - glslangIntermediate->getLocalSize(1), - glslangIntermediate->getLocalSize(2)); - if (glslangIntermediate->getStage() == EShLangMeshNV) { + case EShLangTask: + case EShLangMesh: + if(isMeshShaderExt) { + builder.addCapability(spv::CapabilityMeshShadingEXT); + builder.addExtension(spv::E_SPV_EXT_mesh_shader); + } else { + builder.addCapability(spv::CapabilityMeshShadingNV); + builder.addExtension(spv::E_SPV_NV_mesh_shader); + } + if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) { + std::vector dimConstId; + for (int dim = 0; dim < 3; ++dim) { + bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet); + dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst)); + if (specConst) { + builder.addDecoration(dimConstId.back(), spv::DecorationSpecId, + glslangIntermediate->getLocalSizeSpecId(dim)); + } + } + builder.addExecutionModeId(shaderEntry, spv::ExecutionModeLocalSizeId, dimConstId); + } else { + builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0), + glslangIntermediate->getLocalSize(1), + glslangIntermediate->getLocalSize(2)); + } + if (glslangIntermediate->getStage() == EShLangMesh) { builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices, glslangIntermediate->getVertices()); builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputPrimitivesNV, @@ -1787,13 +1936,11 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); } break; -#endif default: break; } -#ifndef GLSLANG_WEB // // Add SPIR-V requirements (GL_EXT_spirv_intrinsics) // @@ -1830,35 +1977,38 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, std::vector operandIds; assert(!modeId.second.empty()); for (auto extraOperand : modeId.second) { - int nextConst = 0; - spv::Id operandId = createSpvConstantFromConstUnionArray( - extraOperand->getType(), extraOperand->getConstArray(), nextConst, false); - operandIds.push_back(operandId); + if (extraOperand->getType().getQualifier().isSpecConstant()) + operandIds.push_back(getSymbolId(extraOperand->getAsSymbolNode())); + else + operandIds.push_back(createSpvConstant(*extraOperand)); } builder.addExecutionModeId(shaderEntry, static_cast(modeId.first), operandIds); } } -#endif } // Finish creating SPV, after the traversal is complete. -void TGlslangToSpvTraverser::finishSpv() +void TGlslangToSpvTraverser::finishSpv(bool compileOnly) { - // Finish the entry point function - if (! entryPointTerminated) { - builder.setBuildPoint(shaderEntry->getLastBlock()); - builder.leaveFunction(); - } + // If not linking, an entry point is not expected + if (!compileOnly) { + // Finish the entry point function + if (!entryPointTerminated) { + builder.setBuildPoint(shaderEntry->getLastBlock()); + builder.leaveFunction(); + } - // finish off the entry-point SPV instruction by adding the Input/Output - for (auto it = iOSet.cbegin(); it != iOSet.cend(); ++it) - entryPoint->addIdOperand(*it); + // finish off the entry-point SPV instruction by adding the Input/Output + entryPoint->reserveOperands(iOSet.size()); + for (auto id : iOSet) + entryPoint->addIdOperand(id); + } // Add capabilities, extensions, remove unneeded decorations, etc., // based on the resulting SPIR-V. // Note: WebGPU code generation must have the opportunity to aggressively // prune unreachable merge blocks and continue targets. - builder.postProcess(); + builder.postProcess(compileOnly); } // Write the SPV into 'out'. @@ -1884,13 +2034,18 @@ void TGlslangToSpvTraverser::dumpSpv(std::vector& out) // void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) { + // We update the line information even though no code might be generated here + // This is helpful to yield correct lines for control flow instructions + if (!linkageOnly) { + builder.setDebugSourceLocation(symbol->getLoc().line, symbol->getLoc().getFilename()); + } + SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder); if (symbol->getType().isStruct()) glslangTypeToIdMap[symbol->getType().getStruct()] = symbol->getId(); if (symbol->getType().getQualifier().isSpecConstant()) spec_constant_op_mode_setter.turnOnSpecConstantOpMode(); - #ifdef ENABLE_HLSL // Skip symbol handling if it is string-typed if (symbol->getBasicType() == glslang::EbtString) @@ -1901,6 +2056,9 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) // Formal function parameters were mapped during makeFunctions(). spv::Id id = getSymbolId(symbol); + if (symbol->getType().getQualifier().isTaskPayload()) + taskPayloadID = id; // cache the taskPayloadID to be used it as operand for OpEmitMeshTasksEXT + if (builder.isPointer(id)) { if (!symbol->getType().getQualifier().isParamInput() && !symbol->getType().getQualifier().isParamOutput()) { @@ -1911,7 +2069,7 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) spv::StorageClass sc = builder.getStorageClass(id); // Before SPIR-V 1.4, we only want to include Input and Output. // Starting with SPIR-V 1.4, we want all globals. - if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && builder.isGlobalStorage(id)) || + if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && builder.isGlobalVariable(id)) || (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) { iOSet.insert(id); } @@ -1989,7 +2147,7 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node) { - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); if (node->getLeft()->getAsSymbolNode() != nullptr && node->getLeft()->getType().isStruct()) { glslangTypeToIdMap[node->getLeft()->getType().getStruct()] = node->getLeft()->getAsSymbolNode()->getId(); } @@ -2033,6 +2191,9 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T node->getRight()->traverse(this); spv::Id rValue = accessChainLoad(node->getRight()->getType()); + // reset line number for assignment + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); + if (node->getOp() != glslang::EOpAssign) { // the left is also an r-value builder.setAccessChain(lValue); @@ -2364,7 +2525,7 @@ spv::Id TGlslangToSpvTraverser::translateForcedType(spv::Id object) bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node) { - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder); if (node->getType().getQualifier().isSpecConstant()) @@ -2397,12 +2558,15 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI spv::Id length; if (node->getOperand()->getType().isCoopMat()) { - spec_constant_op_mode_setter.turnOnSpecConstantOpMode(); - spv::Id typeId = convertGlslangToSpvType(node->getOperand()->getType()); assert(builder.isCooperativeMatrixType(typeId)); - length = builder.createCooperativeMatrixLength(typeId); + if (node->getOperand()->getType().isCoopMatKHR()) { + length = builder.createCooperativeMatrixLengthKHR(typeId); + } else { + spec_constant_op_mode_setter.turnOnSpecConstantOpMode(); + length = builder.createCooperativeMatrixLengthNV(typeId); + } } else { glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft(); block->traverse(this); @@ -2428,6 +2592,14 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI return false; } + // Force variable declaration - Debug Mode Only + if (node->getOp() == glslang::EOpDeclare) { + builder.clearAccessChain(); + node->getOperand()->traverse(this); + builder.clearAccessChain(); + return false; + } + // Start by evaluating the operand // Does it need a swizzle inversion? If so, evaluation is inverted; @@ -2444,14 +2616,42 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI operandNode = node->getOperand()->getAsBinaryNode()->getLeft(); else operandNode = node->getOperand(); - + operandNode->traverse(this); spv::Id operand = spv::NoResult; spv::Builder::AccessChain::CoherentFlags lvalueCoherentFlags; -#ifndef GLSLANG_WEB + const auto hitObjectOpsWithLvalue = [](glslang::TOperator op) { + switch(op) { + case glslang::EOpReorderThreadNV: + case glslang::EOpHitObjectGetCurrentTimeNV: + case glslang::EOpHitObjectGetHitKindNV: + case glslang::EOpHitObjectGetPrimitiveIndexNV: + case glslang::EOpHitObjectGetGeometryIndexNV: + case glslang::EOpHitObjectGetInstanceIdNV: + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + case glslang::EOpHitObjectGetObjectRayDirectionNV: + case glslang::EOpHitObjectGetObjectRayOriginNV: + case glslang::EOpHitObjectGetWorldRayDirectionNV: + case glslang::EOpHitObjectGetWorldRayOriginNV: + case glslang::EOpHitObjectGetWorldToObjectNV: + case glslang::EOpHitObjectGetObjectToWorldNV: + case glslang::EOpHitObjectGetRayTMaxNV: + case glslang::EOpHitObjectGetRayTMinNV: + case glslang::EOpHitObjectIsEmptyNV: + case glslang::EOpHitObjectIsHitNV: + case glslang::EOpHitObjectIsMissNV: + case glslang::EOpHitObjectRecordEmptyNV: + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + return true; + default: + return false; + } + }; + if (node->getOp() == glslang::EOpAtomicCounterIncrement || node->getOp() == glslang::EOpAtomicCounterDecrement || node->getOp() == glslang::EOpAtomicCounter || @@ -2465,16 +2665,15 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI node->getOp() == glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque || node->getOp() == glslang::EOpRayQueryTerminate || node->getOp() == glslang::EOpRayQueryConfirmIntersection || - (node->getOp() == glslang::EOpSpirvInst && operandNode->getAsTyped()->getQualifier().isSpirvByReference())) { + (node->getOp() == glslang::EOpSpirvInst && operandNode->getAsTyped()->getQualifier().isSpirvByReference()) || + hitObjectOpsWithLvalue(node->getOp())) { operand = builder.accessChainGetLValue(); // Special case l-value operands lvalueCoherentFlags = builder.getAccessChain().coherentFlags; lvalueCoherentFlags |= TranslateCoherent(operandNode->getAsTyped()->getType()); } else if (operandNode->getAsTyped()->getQualifier().isSpirvLiteral()) { // Will be translated to a literal value, make a placeholder here operand = spv::NoResult; - } else -#endif - { + } else { operand = accessChainLoad(node->getOperand()->getType()); } @@ -2490,9 +2689,8 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI // if not, then possibly an operation if (! result) result = createUnaryOperation(node->getOp(), decorations, resultType(), operand, - node->getOperand()->getBasicType(), lvalueCoherentFlags); + node->getOperand()->getBasicType(), lvalueCoherentFlags, node->getType()); -#ifndef GLSLANG_WEB // it could be attached to a SPIR-V intruction if (!result) { if (node->getOp() == glslang::EOpSpirvInst) { @@ -2522,7 +2720,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI return false; // done with this node } } -#endif if (result) { if (invertedType) { @@ -2547,7 +2744,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI spv::Id one = 0; if (node->getBasicType() == glslang::EbtFloat) one = builder.makeFloatConstant(1.0F); -#ifndef GLSLANG_WEB else if (node->getBasicType() == glslang::EbtDouble) one = builder.makeDoubleConstant(1.0); else if (node->getBasicType() == glslang::EbtFloat16) @@ -2558,7 +2754,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI one = builder.makeInt16Constant(1); else if (node->getBasicType() == glslang::EbtInt64 || node->getBasicType() == glslang::EbtUint64) one = builder.makeInt64Constant(1); -#endif else one = builder.makeIntConstant(1); glslang::TOperator op; @@ -2587,7 +2782,11 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI return false; -#ifndef GLSLANG_WEB + case glslang::EOpAssumeEXT: + builder.addCapability(spv::CapabilityExpectAssumeKHR); + builder.addExtension(spv::E_SPV_KHR_expect_assume); + builder.createNoResultOp(spv::OpAssumeTrueKHR, operand); + return false; case glslang::EOpEmitStreamVertex: builder.createNoResultOp(spv::OpEmitStreamVertex, operand); return false; @@ -2600,7 +2799,12 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI case glslang::EOpRayQueryConfirmIntersection: builder.createNoResultOp(spv::OpRayQueryConfirmIntersectionKHR, operand); return false; -#endif + case glslang::EOpReorderThreadNV: + builder.createNoResultOp(spv::OpReorderThreadWithHitObjectNV, operand); + return false; + case glslang::EOpHitObjectRecordEmptyNV: + builder.createNoResultOp(spv::OpHitObjectRecordEmptyNV, operand); + return false; default: logger->missingFunctionality("unknown glslang unary"); @@ -2665,15 +2869,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt builder.setAccessChainRValue(result); return false; - } -#ifndef GLSLANG_WEB - else if (node->getOp() == glslang::EOpImageStore || + } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod || node->getOp() == glslang::EOpImageAtomicStore) { // "imageStore" is a special case, which has no result return false; } -#endif glslang::TOperator binOp = glslang::EOpNull; bool reduceComparison = true; @@ -2688,32 +2889,41 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision()); switch (node->getOp()) { + case glslang::EOpScope: case glslang::EOpSequence: { - if (preVisit) + if (visit == glslang::EvPreVisit) { ++sequenceDepth; - else + if (sequenceDepth == 1) { + // If this is the parent node of all the functions, we want to see them + // early, so all call points have actual SPIR-V functions to reference. + // In all cases, still let the traverser visit the children for us. + makeFunctions(node->getAsAggregate()->getSequence()); + + // Global initializers is specific to the shader entry point, which does not exist in compile-only mode + if (!options.compileOnly) { + // Also, we want all globals initializers to go into the beginning of the entry point, before + // anything else gets there, so visit out of order, doing them all now. + makeGlobalInitializers(node->getAsAggregate()->getSequence()); + } + + //Pre process linker objects for ray tracing stages + if (glslangIntermediate->isRayTracingStage()) + collectRayTracingLinkerObjects(); + + // Initializers are done, don't want to visit again, but functions and link objects need to be processed, + // so do them manually. + visitFunctions(node->getAsAggregate()->getSequence()); + + return false; + } else { + if (node->getOp() == glslang::EOpScope) + builder.enterLexicalBlock(0); + } + } else { + if (sequenceDepth > 1 && node->getOp() == glslang::EOpScope) + builder.leaveLexicalBlock(); --sequenceDepth; - - if (sequenceDepth == 1) { - // If this is the parent node of all the functions, we want to see them - // early, so all call points have actual SPIR-V functions to reference. - // In all cases, still let the traverser visit the children for us. - makeFunctions(node->getAsAggregate()->getSequence()); - - // Also, we want all globals initializers to go into the beginning of the entry point, before - // anything else gets there, so visit out of order, doing them all now. - makeGlobalInitializers(node->getAsAggregate()->getSequence()); - - //Pre process linker objects for ray tracing stages - if (glslangIntermediate->isRayTracingStage()) - collectRayTracingLinkerObjects(); - - // Initializers are done, don't want to visit again, but functions and link objects need to be processed, - // so do them manually. - visitFunctions(node->getAsAggregate()->getSequence()); - - return false; } return true; @@ -2739,13 +2949,23 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt } case glslang::EOpFunction: if (visit == glslang::EvPreVisit) { + if (options.generateDebugInfo) { + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); + } if (isShaderEntryPoint(node)) { inEntryPoint = true; builder.setBuildPoint(shaderEntry->getLastBlock()); + builder.enterFunction(shaderEntry); currentFunction = shaderEntry; } else { handleFunctionEntry(node); } + if (options.generateDebugInfo && !options.emitNonSemanticShaderDebugInfo) { + const auto& loc = node->getLoc(); + const char* sourceFileName = loc.getFilename(); + spv::Id sourceFileId = sourceFileName ? builder.getStringId(sourceFileName) : builder.getMainFileId(); + currentFunction->setDebugLineInfo(sourceFileId, loc.line, loc.column); + } } else { if (inEntryPoint) entryPointTerminated = true; @@ -2761,7 +2981,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt return false; case glslang::EOpFunctionCall: { - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); if (node->isUserDefined()) result = handleUserFunctionCall(node); if (result) { @@ -2827,7 +3047,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt case glslang::EOpConstructF16Mat4x3: case glslang::EOpConstructF16Mat4x4: isMatrix = true; - // fall through + [[fallthrough]]; case glslang::EOpConstructFloat: case glslang::EOpConstructVec2: case glslang::EOpConstructVec3: @@ -2879,16 +3099,26 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt case glslang::EOpConstructStruct: case glslang::EOpConstructTextureSampler: case glslang::EOpConstructReference: - case glslang::EOpConstructCooperativeMatrix: + case glslang::EOpConstructCooperativeMatrixNV: + case glslang::EOpConstructCooperativeMatrixKHR: { - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); std::vector arguments; translateArguments(*node, arguments, lvalueCoherentFlags); spv::Id constructed; - if (node->getOp() == glslang::EOpConstructTextureSampler) - constructed = builder.createOp(spv::OpSampledImage, resultType(), arguments); - else if (node->getOp() == glslang::EOpConstructStruct || - node->getOp() == glslang::EOpConstructCooperativeMatrix || + if (node->getOp() == glslang::EOpConstructTextureSampler) { + const glslang::TType& texType = node->getSequence()[0]->getAsTyped()->getType(); + if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6 && + texType.getSampler().isBuffer()) { + // SamplerBuffer is not supported in spirv1.6 so + // `samplerBuffer(textureBuffer, sampler)` is a no-op + // and textureBuffer is the result going forward + constructed = arguments[0]; + } else + constructed = builder.createOp(spv::OpSampledImage, resultType(), arguments); + } else if (node->getOp() == glslang::EOpConstructStruct || + node->getOp() == glslang::EOpConstructCooperativeMatrixNV || + node->getOp() == glslang::EOpConstructCooperativeMatrixKHR || node->getType().isArray()) { std::vector constituents; for (int c = 0; c < (int)arguments.size(); ++c) @@ -2986,10 +3216,9 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt atomic = true; break; -#ifndef GLSLANG_WEB case glslang::EOpAtomicStore: noReturnValue = true; - // fallthrough + [[fallthrough]]; case glslang::EOpAtomicLoad: atomic = true; break; @@ -3019,6 +3248,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt binOp = node->getOp(); break; + case glslang::EOpExpectEXT: + builder.addCapability(spv::CapabilityExpectAssumeKHR); + builder.addExtension(spv::E_SPV_KHR_expect_assume); + binOp = node->getOp(); + break; + case glslang::EOpIgnoreIntersectionNV: case glslang::EOpTerminateRayNV: case glslang::EOpTraceNV: @@ -3027,6 +3262,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt case glslang::EOpExecuteCallableNV: case glslang::EOpExecuteCallableKHR: case glslang::EOpWritePackedPrimitiveIndices4x8NV: + case glslang::EOpEmitMeshTasksEXT: + case glslang::EOpSetMeshOutputsEXT: noReturnValue = true; break; case glslang::EOpRayQueryInitialize: @@ -3061,6 +3298,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt break; case glslang::EOpCooperativeMatrixLoad: case glslang::EOpCooperativeMatrixStore: + case glslang::EOpCooperativeMatrixLoadNV: + case glslang::EOpCooperativeMatrixStoreNV: noReturnValue = true; break; case glslang::EOpBeginInvocationInterlock: @@ -3068,7 +3307,84 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock); noReturnValue = true; break; -#endif + + case glslang::EOpHitObjectTraceRayNV: + case glslang::EOpHitObjectTraceRayMotionNV: + case glslang::EOpHitObjectGetAttributesNV: + case glslang::EOpHitObjectExecuteShaderNV: + case glslang::EOpHitObjectRecordEmptyNV: + case glslang::EOpHitObjectRecordMissNV: + case glslang::EOpHitObjectRecordMissMotionNV: + case glslang::EOpHitObjectRecordHitNV: + case glslang::EOpHitObjectRecordHitMotionNV: + case glslang::EOpHitObjectRecordHitWithIndexNV: + case glslang::EOpHitObjectRecordHitWithIndexMotionNV: + case glslang::EOpReorderThreadNV: + noReturnValue = true; + [[fallthrough]]; + case glslang::EOpHitObjectIsEmptyNV: + case glslang::EOpHitObjectIsMissNV: + case glslang::EOpHitObjectIsHitNV: + case glslang::EOpHitObjectGetRayTMinNV: + case glslang::EOpHitObjectGetRayTMaxNV: + case glslang::EOpHitObjectGetObjectRayOriginNV: + case glslang::EOpHitObjectGetObjectRayDirectionNV: + case glslang::EOpHitObjectGetWorldRayOriginNV: + case glslang::EOpHitObjectGetWorldRayDirectionNV: + case glslang::EOpHitObjectGetObjectToWorldNV: + case glslang::EOpHitObjectGetWorldToObjectNV: + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + case glslang::EOpHitObjectGetInstanceIdNV: + case glslang::EOpHitObjectGetGeometryIndexNV: + case glslang::EOpHitObjectGetPrimitiveIndexNV: + case glslang::EOpHitObjectGetHitKindNV: + case glslang::EOpHitObjectGetCurrentTimeNV: + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + builder.addExtension(spv::E_SPV_NV_shader_invocation_reorder); + builder.addCapability(spv::CapabilityShaderInvocationReorderNV); + break; + case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: + builder.addExtension(spv::E_SPV_KHR_ray_tracing_position_fetch); + builder.addCapability(spv::CapabilityRayQueryPositionFetchKHR); + noReturnValue = true; + break; + + case glslang::EOpImageSampleWeightedQCOM: + builder.addCapability(spv::CapabilityTextureSampleWeightedQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + break; + case glslang::EOpImageBoxFilterQCOM: + builder.addCapability(spv::CapabilityTextureBoxFilterQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + break; + case glslang::EOpImageBlockMatchSADQCOM: + case glslang::EOpImageBlockMatchSSDQCOM: + builder.addCapability(spv::CapabilityTextureBlockMatchQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + break; + + case glslang::EOpImageBlockMatchWindowSSDQCOM: + case glslang::EOpImageBlockMatchWindowSADQCOM: + builder.addCapability(spv::CapabilityTextureBlockMatchQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + builder.addCapability(spv::CapabilityTextureBlockMatch2QCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing2); + break; + + case glslang::EOpImageBlockMatchGatherSSDQCOM: + case glslang::EOpImageBlockMatchGatherSADQCOM: + builder.addCapability(spv::CapabilityTextureBlockMatchQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + builder.addCapability(spv::CapabilityTextureBlockMatch2QCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing2); + break; + + case glslang::EOpFetchMicroTriangleVertexPositionNV: + case glslang::EOpFetchMicroTriangleVertexBarycentricNV: + builder.addExtension(spv::E_SPV_NV_displacement_micromap); + builder.addCapability(spv::CapabilityDisplacementMicromapNV); + break; case glslang::EOpDebugPrintf: noReturnValue = true; @@ -3094,7 +3410,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt right->traverse(this); spv::Id rightId = accessChainLoad(right->getType()); - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); OpDecorations decorations = { precision, TranslateNoContractionDecoration(node->getType().getQualifier()), TranslateNonUniformDecoration(node->getType().getQualifier()) }; @@ -3125,6 +3441,22 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt lvalue = true; break; + + + case glslang::EOpHitObjectRecordHitNV: + case glslang::EOpHitObjectRecordHitMotionNV: + case glslang::EOpHitObjectRecordHitWithIndexNV: + case glslang::EOpHitObjectRecordHitWithIndexMotionNV: + case glslang::EOpHitObjectTraceRayNV: + case glslang::EOpHitObjectTraceRayMotionNV: + case glslang::EOpHitObjectExecuteShaderNV: + case glslang::EOpHitObjectRecordMissNV: + case glslang::EOpHitObjectRecordMissMotionNV: + case glslang::EOpHitObjectGetAttributesNV: + if (arg == 0) + lvalue = true; + break; + case glslang::EOpRayQueryInitialize: case glslang::EOpRayQueryTerminate: case glslang::EOpRayQueryConfirmIntersection: @@ -3160,7 +3492,6 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt lvalue = true; break; -#ifndef GLSLANG_WEB case glslang::EOpFrexp: if (arg == 1) lvalue = true; @@ -3214,10 +3545,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt lvalue = true; break; case glslang::EOpCooperativeMatrixLoad: + case glslang::EOpCooperativeMatrixLoadNV: if (arg == 0 || arg == 1) lvalue = true; break; case glslang::EOpCooperativeMatrixStore: + case glslang::EOpCooperativeMatrixStoreNV: if (arg == 1) lvalue = true; break; @@ -3225,7 +3558,15 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt if (glslangOperands[arg]->getAsTyped()->getQualifier().isSpirvByReference()) lvalue = true; break; -#endif + case glslang::EOpReorderThreadNV: + //Three variants of reorderThreadNV, two of them use hitObjectNV + if (arg == 0 && glslangOperands.size() != 2) + lvalue = true; + break; + case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: + if (arg == 0 || arg == 2) + lvalue = true; + break; default: break; } @@ -3235,9 +3576,10 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt else glslangOperands[arg]->traverse(this); -#ifndef GLSLANG_WEB if (node->getOp() == glslang::EOpCooperativeMatrixLoad || - node->getOp() == glslang::EOpCooperativeMatrixStore) { + node->getOp() == glslang::EOpCooperativeMatrixStore || + node->getOp() == glslang::EOpCooperativeMatrixLoadNV || + node->getOp() == glslang::EOpCooperativeMatrixStoreNV) { if (arg == 1) { // fold "element" parameter into the access chain @@ -3258,9 +3600,11 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt unsigned int alignment = builder.getAccessChain().alignment; int memoryAccess = TranslateMemoryAccess(coherentFlags); - if (node->getOp() == glslang::EOpCooperativeMatrixLoad) + if (node->getOp() == glslang::EOpCooperativeMatrixLoad || + node->getOp() == glslang::EOpCooperativeMatrixLoadNV) memoryAccess &= ~spv::MemoryAccessMakePointerAvailableKHRMask; - if (node->getOp() == glslang::EOpCooperativeMatrixStore) + if (node->getOp() == glslang::EOpCooperativeMatrixStore || + node->getOp() == glslang::EOpCooperativeMatrixStoreNV) memoryAccess &= ~spv::MemoryAccessMakePointerVisibleKHRMask; if (builder.getStorageClass(builder.getAccessChain().base) == spv::StorageClassPhysicalStorageBufferEXT) { @@ -3282,7 +3626,6 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt continue; } } -#endif // for l-values, pass the address, for r-values, pass the value if (lvalue) { @@ -3302,7 +3645,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt lvalueCoherentFlags = builder.getAccessChain().coherentFlags; lvalueCoherentFlags |= TranslateCoherent(glslangOperands[arg]->getAsTyped()->getType()); } else { - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); glslang::TOperator glslangOp = node->getOp(); if (arg == 1 && (glslangOp == glslang::EOpRayQueryGetIntersectionType || @@ -3317,74 +3660,152 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt glslangOp == glslang::EOpRayQueryGetIntersectionObjectRayDirection || glslangOp == glslang::EOpRayQueryGetIntersectionObjectRayOrigin || glslangOp == glslang::EOpRayQueryGetIntersectionObjectToWorld || - glslangOp == glslang::EOpRayQueryGetIntersectionWorldToObject + glslangOp == glslang::EOpRayQueryGetIntersectionWorldToObject || + glslangOp == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT )) { bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst(); operands.push_back(builder.makeIntConstant(cond ? 1 : 0)); } else if ((arg == 10 && glslangOp == glslang::EOpTraceKHR) || (arg == 11 && glslangOp == glslang::EOpTraceRayMotionNV) || - (arg == 1 && glslangOp == glslang::EOpExecuteCallableKHR)) { - const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : (glslangOp == glslang::EOpTraceRayMotionNV ? 11 : 1); + (arg == 1 && glslangOp == glslang::EOpExecuteCallableKHR) || + (arg == 1 && glslangOp == glslang::EOpHitObjectExecuteShaderNV) || + (arg == 11 && glslangOp == glslang::EOpHitObjectTraceRayNV) || + (arg == 12 && glslangOp == glslang::EOpHitObjectTraceRayMotionNV)) { const int set = glslangOp == glslang::EOpExecuteCallableKHR ? 1 : 0; - - const int location = glslangOperands[opdNum]->getAsConstantUnion()->getConstArray()[0].getUConst(); + const int location = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getUConst(); + auto itNode = locationToSymbol[set].find(location); + visitSymbol(itNode->second); + spv::Id symId = getSymbolId(itNode->second); + operands.push_back(symId); + } else if ((arg == 12 && glslangOp == glslang::EOpHitObjectRecordHitNV) || + (arg == 13 && glslangOp == glslang::EOpHitObjectRecordHitMotionNV) || + (arg == 11 && glslangOp == glslang::EOpHitObjectRecordHitWithIndexNV) || + (arg == 12 && glslangOp == glslang::EOpHitObjectRecordHitWithIndexMotionNV) || + (arg == 1 && glslangOp == glslang::EOpHitObjectGetAttributesNV)) { + const int location = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getUConst(); + const int set = 2; auto itNode = locationToSymbol[set].find(location); visitSymbol(itNode->second); spv::Id symId = getSymbolId(itNode->second); operands.push_back(symId); -#ifndef GLSLANG_WEB } else if (glslangOperands[arg]->getAsTyped()->getQualifier().isSpirvLiteral()) { // Will be translated to a literal value, make a placeholder here operands.push_back(spv::NoResult); -#endif } else { operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType())); } } } - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); -#ifndef GLSLANG_WEB - if (node->getOp() == glslang::EOpCooperativeMatrixLoad) { + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); + if (node->getOp() == glslang::EOpCooperativeMatrixLoad || + node->getOp() == glslang::EOpCooperativeMatrixLoadNV) { std::vector idImmOps; idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf - idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride - idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + if (node->getOp() == glslang::EOpCooperativeMatrixLoad) { + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // matrixLayout + auto layout = builder.getConstantScalar(operands[3]); + if (layout == spv::CooperativeMatrixLayoutRowBlockedInterleavedARM || + layout == spv::CooperativeMatrixLayoutColumnBlockedInterleavedARM) { + builder.addExtension(spv::E_SPV_ARM_cooperative_matrix_layouts); + builder.addCapability(spv::CapabilityCooperativeMatrixLayoutsARM); + } + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + } else { + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + } idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end()); // get the pointee type spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0])); assert(builder.isCooperativeMatrixType(typeId)); // do the op - spv::Id result = builder.createOp(spv::OpCooperativeMatrixLoadNV, typeId, idImmOps); + spv::Id result = node->getOp() == glslang::EOpCooperativeMatrixLoad + ? builder.createOp(spv::OpCooperativeMatrixLoadKHR, typeId, idImmOps) + : builder.createOp(spv::OpCooperativeMatrixLoadNV, typeId, idImmOps); // store the result to the pointer (out param 'm') builder.createStore(result, operands[0]); result = 0; - } else if (node->getOp() == glslang::EOpCooperativeMatrixStore) { + } else if (node->getOp() == glslang::EOpCooperativeMatrixStore || + node->getOp() == glslang::EOpCooperativeMatrixStoreNV) { std::vector idImmOps; idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf idImmOps.push_back(spv::IdImmediate(true, operands[0])); // object - idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride - idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + if (node->getOp() == glslang::EOpCooperativeMatrixStore) { + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // matrixLayout + auto layout = builder.getConstantScalar(operands[3]); + if (layout == spv::CooperativeMatrixLayoutRowBlockedInterleavedARM || + layout == spv::CooperativeMatrixLayoutColumnBlockedInterleavedARM) { + builder.addExtension(spv::E_SPV_ARM_cooperative_matrix_layouts); + builder.addCapability(spv::CapabilityCooperativeMatrixLayoutsARM); + } + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + } else { + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + } idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end()); - builder.createNoResultOp(spv::OpCooperativeMatrixStoreNV, idImmOps); + if (node->getOp() == glslang::EOpCooperativeMatrixStore) + builder.createNoResultOp(spv::OpCooperativeMatrixStoreKHR, idImmOps); + else + builder.createNoResultOp(spv::OpCooperativeMatrixStoreNV, idImmOps); result = 0; - } else -#endif - if (atomic) { + } else if (node->getOp() == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT) { + std::vector idImmOps; + + idImmOps.push_back(spv::IdImmediate(true, operands[0])); // q + idImmOps.push_back(spv::IdImmediate(true, operands[1])); // committed + + spv::Id typeId = builder.makeArrayType(builder.makeVectorType(builder.makeFloatType(32), 3), + builder.makeUintConstant(3), 0); + // do the op + + spv::Op spvOp = spv::OpRayQueryGetIntersectionTriangleVertexPositionsKHR; + + spv::Id result = builder.createOp(spvOp, typeId, idImmOps); + // store the result to the pointer (out param 'm') + builder.createStore(result, operands[2]); + result = 0; + } else if (node->getOp() == glslang::EOpCooperativeMatrixMulAdd) { + uint32_t matrixOperands = 0; + + // If the optional operand is present, initialize matrixOperands to that value. + if (glslangOperands.size() == 4 && glslangOperands[3]->getAsConstantUnion()) { + matrixOperands = glslangOperands[3]->getAsConstantUnion()->getConstArray()[0].getIConst(); + } + + // Determine Cooperative Matrix Operands bits from the signedness of the types. + if (isTypeSignedInt(glslangOperands[0]->getAsTyped()->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixASignedComponentsKHRMask; + if (isTypeSignedInt(glslangOperands[1]->getAsTyped()->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixBSignedComponentsKHRMask; + if (isTypeSignedInt(glslangOperands[2]->getAsTyped()->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixCSignedComponentsKHRMask; + if (isTypeSignedInt(node->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixResultSignedComponentsKHRMask; + + std::vector idImmOps; + idImmOps.push_back(spv::IdImmediate(true, operands[0])); + idImmOps.push_back(spv::IdImmediate(true, operands[1])); + idImmOps.push_back(spv::IdImmediate(true, operands[2])); + if (matrixOperands != 0) + idImmOps.push_back(spv::IdImmediate(false, matrixOperands)); + + result = builder.createOp(spv::OpCooperativeMatrixMulAddKHR, resultType(), idImmOps); + } else if (atomic) { // Handle all atomics glslang::TBasicType typeProxy = (node->getOp() == glslang::EOpAtomicStore) ? node->getSequence()[0]->getAsTyped()->getBasicType() : node->getBasicType(); result = createAtomicOperation(node->getOp(), precision, resultType(), operands, typeProxy, - lvalueCoherentFlags); -#ifndef GLSLANG_WEB + lvalueCoherentFlags, node->getType()); } else if (node->getOp() == glslang::EOpSpirvInst) { const auto& spirvInst = node->getSpirvInstruction(); if (spirvInst.set == "") { std::vector idImmOps; - for (int i = 0; i < glslangOperands.size(); ++i) { + for (unsigned int i = 0; i < glslangOperands.size(); ++i) { if (glslangOperands[i]->getAsTyped()->getQualifier().isSpirvLiteral()) { // Translate the constant to a literal value std::vector literals; @@ -3406,7 +3827,6 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt spirvInst.id, operands); } noReturnValue = node->getBasicType() == glslang::EbtVoid; -#endif } else if (node->getOp() == glslang::EOpDebugPrintf) { if (!nonSemanticDebugPrintf) { nonSemanticDebugPrintf = builder.import("NonSemantic.DebugPrintf"); @@ -3421,13 +3841,13 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt break; case 1: { - OpDecorations decorations = { precision, + OpDecorations decorations = { precision, TranslateNoContractionDecoration(node->getType().getQualifier()), TranslateNonUniformDecoration(node->getType().getQualifier()) }; result = createUnaryOperation( node->getOp(), decorations, resultType(), operands.front(), - glslangOperands[0]->getAsTyped()->getBasicType(), lvalueCoherentFlags); + glslangOperands[0]->getAsTyped()->getBasicType(), lvalueCoherentFlags, node->getType()); } break; default: @@ -3523,35 +3943,44 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang // Find a way of executing both sides and selecting the right result. const auto executeBothSides = [&]() -> void { // execute both sides + spv::Id resultType = convertGlslangToSpvType(node->getType()); node->getTrueBlock()->traverse(this); spv::Id trueValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); node->getFalseBlock()->traverse(this); - spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); + spv::Id falseValue = accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()); - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); // done if void if (node->getBasicType() == glslang::EbtVoid) return; // emit code to select between trueValue and falseValue - - // see if OpSelect can handle it + // see if OpSelect can handle the result type, and that the SPIR-V types + // of the inputs match the result type. if (isOpSelectable()) { // Emit OpSelect for this selection. // smear condition to vector, if necessary (AST is always scalar) // Before 1.4, smear like for mix(), starting with 1.4, keep it scalar if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_4 && builder.isVector(trueValue)) { - condition = builder.smearScalar(spv::NoPrecision, condition, + condition = builder.smearScalar(spv::NoPrecision, condition, builder.makeVectorType(builder.makeBoolType(), builder.getNumComponents(trueValue))); } + // If the types do not match, it is because of mismatched decorations on aggregates. + // Since isOpSelectable only lets us get here for SPIR-V >= 1.4, we can use OpCopyObject + // to get matching types. + if (builder.getTypeId(trueValue) != resultType) { + trueValue = builder.createUnaryOp(spv::OpCopyLogical, resultType, trueValue); + } + if (builder.getTypeId(falseValue) != resultType) { + falseValue = builder.createUnaryOp(spv::OpCopyLogical, resultType, falseValue); + } + // OpSelect - result = builder.createTriOp(spv::OpSelect, - convertGlslangToSpvType(node->getType()), condition, - trueValue, falseValue); + result = builder.createTriOp(spv::OpSelect, resultType, condition, trueValue, falseValue); builder.clearAccessChain(); builder.setAccessChainRValue(result); @@ -3559,7 +3988,7 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang // We need control flow to select the result. // TODO: Once SPIR-V OpSelect allows arbitrary types, eliminate this path. result = builder.createVariable(TranslatePrecisionDecoration(node->getType()), - spv::StorageClassFunction, convertGlslangToSpvType(node->getType())); + spv::StorageClassFunction, resultType); // Selection control: const spv::SelectionControlMask control = TranslateSelectionControl(*node); @@ -3568,10 +3997,15 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang spv::Builder::If ifBuilder(condition, control, builder); // emit the "then" statement - builder.createStore(trueValue, result); + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), trueValue); + ifBuilder.makeBeginElse(); // emit the "else" statement - builder.createStore(falseValue, result); + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), falseValue); // finish off the control flow ifBuilder.makeEndIf(); @@ -3598,16 +4032,26 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang // emit the "then" statement if (node->getTrueBlock() != nullptr) { node->getTrueBlock()->traverse(this); - if (result != spv::NoResult) - builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result); + if (result != spv::NoResult) { + spv::Id load = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); + + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), load); + } } if (node->getFalseBlock() != nullptr) { ifBuilder.makeBeginElse(); // emit the "else" statement node->getFalseBlock()->traverse(this); - if (result != spv::NoResult) - builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result); + if (result != spv::NoResult) { + spv::Id load = accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()); + + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), load); + } } // finish off the control flow @@ -3687,10 +4131,8 @@ bool TGlslangToSpvTraverser::visitSwitch(glslang::TVisit /* visit */, glslang::T void TGlslangToSpvTraverser::visitConstantUnion(glslang::TIntermConstantUnion* node) { -#ifndef GLSLANG_WEB if (node->getQualifier().isSpirvLiteral()) return; // Translated to a literal value, skip further processing -#endif int nextConst = 0; spv::Id constant = createSpvConstantFromConstUnionArray(node->getType(), node->getConstArray(), nextConst, false); @@ -3714,8 +4156,8 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn // by a block-ending branch. But we don't want to put any other body/test // instructions in it, since the body/test may have arbitrary instructions, // including merges of its own. - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); builder.setBuildPoint(&blocks.head); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control, operands); if (node->testFirst() && node->getTest()) { spv::Block& test = builder.makeNewBlock(); @@ -3738,7 +4180,7 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn node->getTerminal()->traverse(this); builder.createBranch(&blocks.head); } else { - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); builder.createBranch(&blocks.body); breakForLoop.push(true); @@ -3773,11 +4215,20 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T if (node->getExpression()) node->getExpression()->traverse(this); - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); switch (node->getFlowOp()) { case glslang::EOpKill: - builder.makeStatementTerminator(spv::OpKill, "post-discard"); + if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) { + if (glslangIntermediate->getSource() == glslang::EShSourceHlsl) { + builder.addCapability(spv::CapabilityDemoteToHelperInvocation); + builder.createNoResultOp(spv::OpDemoteToHelperInvocationEXT); + } else { + builder.makeStatementTerminator(spv::OpTerminateInvocation, "post-terminate-invocation"); + } + } else { + builder.makeStatementTerminator(spv::OpKill, "post-discard"); + } break; case glslang::EOpTerminateInvocation: builder.addExtension(spv::E_SPV_KHR_terminate_invocation); @@ -3812,7 +4263,6 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T builder.clearAccessChain(); break; -#ifndef GLSLANG_WEB case glslang::EOpDemote: builder.createNoResultOp(spv::OpDemoteToHelperInvocationEXT); builder.addExtension(spv::E_SPV_EXT_demote_to_helper_invocation); @@ -3824,7 +4274,6 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T case glslang::EOpIgnoreIntersectionKHR: builder.makeStatementTerminator(spv::OpIgnoreIntersectionKHR, "post-ignoreIntersectionKHR"); break; -#endif default: assert(0); @@ -3866,7 +4315,6 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* else builder.addCapability(spv::CapabilityStorageUniform16); break; -#ifndef GLSLANG_WEB case spv::StorageClassPushConstant: builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3); builder.addCapability(spv::CapabilityStoragePushConstant16); @@ -3876,7 +4324,6 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3); builder.addCapability(spv::CapabilityStorageUniformBufferBlock16); break; -#endif default: if (storageClass == spv::StorageClassWorkgroup && node->getType().getBasicType() == glslang::EbtBlock) { @@ -3925,7 +4372,7 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* initializer = builder.makeNullConstant(spvType); } - return builder.createVariable(spv::NoPrecision, storageClass, spvType, name, initializer); + return builder.createVariable(spv::NoPrecision, storageClass, spvType, name, initializer, false); } // Return type Id of the sampled type. @@ -3935,18 +4382,18 @@ spv::Id TGlslangToSpvTraverser::getSampledType(const glslang::TSampler& sampler) case glslang::EbtInt: return builder.makeIntType(32); case glslang::EbtUint: return builder.makeUintType(32); case glslang::EbtFloat: return builder.makeFloatType(32); -#ifndef GLSLANG_WEB case glslang::EbtFloat16: builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch); builder.addCapability(spv::CapabilityFloat16ImageAMD); return builder.makeFloatType(16); - case glslang::EbtInt64: return builder.makeIntType(64); + case glslang::EbtInt64: builder.addExtension(spv::E_SPV_EXT_shader_image_int64); - builder.addCapability(spv::CapabilityFloat16ImageAMD); - case glslang::EbtUint64: return builder.makeUintType(64); + builder.addCapability(spv::CapabilityInt64ImageEXT); + return builder.makeIntType(64); + case glslang::EbtUint64: builder.addExtension(spv::E_SPV_EXT_shader_image_int64); - builder.addCapability(spv::CapabilityFloat16ImageAMD); -#endif + builder.addCapability(spv::CapabilityInt64ImageEXT); + return builder.makeUintType(64); default: assert(0); return builder.makeFloatType(32); @@ -3991,6 +4438,16 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty return convertGlslangToSpvType(type, getExplicitLayout(type), type.getQualifier(), false, forwardReferenceOnly); } +spv::LinkageType TGlslangToSpvTraverser::convertGlslangLinkageToSpv(glslang::TLinkType linkType) +{ + switch (linkType) { + case glslang::ELinkExport: + return spv::LinkageTypeExport; + default: + return spv::LinkageTypeMax; + } +} + // Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id. // explicitLayout can be kept the same throughout the hierarchical recursive walk. // Mutually recursive with convertGlslangStructToSpvType(). @@ -4022,7 +4479,6 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty case glslang::EbtFloat: spvType = builder.makeFloatType(32); break; -#ifndef GLSLANG_WEB case glslang::EbtDouble: spvType = builder.makeFloatType(64); break; @@ -4100,7 +4556,6 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty } } break; -#endif case glslang::EbtSampler: { const glslang::TSampler& sampler = type.getSampler(); @@ -4111,8 +4566,10 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty spvType = builder.makeImageType(getSampledType(sampler), TranslateDimensionality(sampler), sampler.isShadow(), sampler.isArrayed(), sampler.isMultiSample(), sampler.isImageClass() ? 2 : 1, TranslateImageFormat(type)); - if (sampler.isCombined()) { - // already has both image and sampler, make the combined type + if (sampler.isCombined() && + (!sampler.isBuffer() || glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_6)) { + // Already has both image and sampler, make the combined type. Only combine sampler to + // buffer if before SPIR-V 1.6. spvType = builder.makeSampledImageType(spvType); } } @@ -4140,32 +4597,41 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty case glslang::EbtString: // no type used for OpString return 0; -#ifndef GLSLANG_WEB + + case glslang::EbtHitObjectNV: { + builder.addExtension(spv::E_SPV_NV_shader_invocation_reorder); + builder.addCapability(spv::CapabilityShaderInvocationReorderNV); + spvType = builder.makeHitObjectNVType(); + } + break; case glslang::EbtSpirvType: { // GL_EXT_spirv_intrinsics const auto& spirvType = type.getSpirvType(); const auto& spirvInst = spirvType.spirvInst; - std::vector operands; + std::vector operands; for (const auto& typeParam : spirvType.typeParams) { - if (typeParam.isConstant) { + if (typeParam.getAsConstant() != nullptr) { // Constant expression - if (typeParam.constant->isLiteral()) { - if (typeParam.constant->getBasicType() == glslang::EbtFloat) { - float floatValue = static_cast(typeParam.constant->getConstArray()[0].getDConst()); - unsigned literal = *reinterpret_cast(&floatValue); - operands.push_back(literal); - } else if (typeParam.constant->getBasicType() == glslang::EbtInt) { - unsigned literal = typeParam.constant->getConstArray()[0].getIConst(); - operands.push_back(literal); - } else if (typeParam.constant->getBasicType() == glslang::EbtUint) { - unsigned literal = typeParam.constant->getConstArray()[0].getUConst(); - operands.push_back(literal); - } else if (typeParam.constant->getBasicType() == glslang::EbtBool) { - unsigned literal = typeParam.constant->getConstArray()[0].getBConst(); - operands.push_back(literal); - } else if (typeParam.constant->getBasicType() == glslang::EbtString) { - auto str = typeParam.constant->getConstArray()[0].getSConst()->c_str(); + auto constant = typeParam.getAsConstant(); + if (constant->isLiteral()) { + if (constant->getBasicType() == glslang::EbtFloat) { + float floatValue = static_cast(constant->getConstArray()[0].getDConst()); + unsigned literal; + static_assert(sizeof(literal) == sizeof(floatValue), "sizeof(unsigned) != sizeof(float)"); + memcpy(&literal, &floatValue, sizeof(literal)); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtInt) { + unsigned literal = constant->getConstArray()[0].getIConst(); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtUint) { + unsigned literal = constant->getConstArray()[0].getUConst(); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtBool) { + unsigned literal = constant->getConstArray()[0].getBConst(); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtString) { + auto str = constant->getConstArray()[0].getSConst()->c_str(); unsigned literal = 0; char* literalPtr = reinterpret_cast(&literal); unsigned charCount = 0; @@ -4175,7 +4641,7 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty *(literalPtr++) = ch; ++charCount; if (charCount == 4) { - operands.push_back(literal); + operands.push_back({false, literal}); literalPtr = reinterpret_cast(&literal); charCount = 0; } @@ -4185,32 +4651,24 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty if (charCount > 0) { for (; charCount < 4; ++charCount) *(literalPtr++) = 0; - operands.push_back(literal); + operands.push_back({false, literal}); } } else assert(0); // Unexpected type - } else { - int nextConst = 0; - spv::Id constant = createSpvConstantFromConstUnionArray( - typeParam.constant->getType(), typeParam.constant->getConstArray(), nextConst, false); - operands.push_back(constant); - } + } else + operands.push_back({true, createSpvConstant(*constant)}); } else { // Type specifier - spv::Id typeId = convertGlslangToSpvType(*typeParam.type); - operands.push_back(typeId); + assert(typeParam.getAsType() != nullptr); + operands.push_back({true, convertGlslangToSpvType(*typeParam.getAsType())}); } } - if (spirvInst.set == "") - spvType = builder.createOp(static_cast(spirvInst.id), spv::NoType, operands); - else { - spvType = builder.createBuiltinCall( - spv::NoType, getExtBuiltins(spirvInst.set.c_str()), spirvInst.id, operands); - } + assert(spirvInst.set == ""); // Currently, couldn't be extended instructions. + spvType = builder.makeGenericType(static_cast(spirvInst.id), operands); + break; } -#endif default: assert(0); break; @@ -4224,9 +4682,10 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty spvType = builder.makeVectorType(spvType, type.getVectorSize()); } - if (type.isCoopMat()) { + if (type.isCoopMatNV()) { builder.addCapability(spv::CapabilityCooperativeMatrixNV); builder.addExtension(spv::E_SPV_NV_cooperative_matrix); + if (type.getBasicType() == glslang::EbtFloat16) builder.addCapability(spv::CapabilityFloat16); if (type.getBasicType() == glslang::EbtUint8 || @@ -4234,11 +4693,29 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty builder.addCapability(spv::CapabilityInt8); } - spv::Id scope = makeArraySizeId(*type.getTypeParameters(), 1); - spv::Id rows = makeArraySizeId(*type.getTypeParameters(), 2); - spv::Id cols = makeArraySizeId(*type.getTypeParameters(), 3); + spv::Id scope = makeArraySizeId(*type.getTypeParameters()->arraySizes, 1); + spv::Id rows = makeArraySizeId(*type.getTypeParameters()->arraySizes, 2); + spv::Id cols = makeArraySizeId(*type.getTypeParameters()->arraySizes, 3); - spvType = builder.makeCooperativeMatrixType(spvType, scope, rows, cols); + spvType = builder.makeCooperativeMatrixTypeNV(spvType, scope, rows, cols); + } + + if (type.isCoopMatKHR()) { + builder.addCapability(spv::CapabilityCooperativeMatrixKHR); + builder.addExtension(spv::E_SPV_KHR_cooperative_matrix); + + if (type.getBasicType() == glslang::EbtFloat16) + builder.addCapability(spv::CapabilityFloat16); + if (type.getBasicType() == glslang::EbtUint8 || type.getBasicType() == glslang::EbtInt8) { + builder.addCapability(spv::CapabilityInt8); + } + + spv::Id scope = makeArraySizeId(*type.getTypeParameters()->arraySizes, 0); + spv::Id rows = makeArraySizeId(*type.getTypeParameters()->arraySizes, 1); + spv::Id cols = makeArraySizeId(*type.getTypeParameters()->arraySizes, 2); + spv::Id use = builder.makeUintConstant(type.getCoopMatKHRuse()); + + spvType = builder.makeCooperativeMatrixTypeKHR(spvType, scope, rows, cols, use); } if (type.isArray()) { @@ -4279,12 +4756,10 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty if (type.isSizedArray()) spvType = builder.makeArrayType(spvType, makeArraySizeId(*type.getArraySizes(), 0), stride); else { -#ifndef GLSLANG_WEB if (!lastBufferBlockMember) { builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5); builder.addCapability(spv::CapabilityRuntimeDescriptorArrayEXT); } -#endif spvType = builder.makeRuntimeArray(spvType); } if (stride > 0) @@ -4294,13 +4769,70 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty return spvType; } +// Apply SPIR-V decorations to the SPIR-V object (provided by SPIR-V ID). If member index is provided, the +// decorations are applied to this member. +void TGlslangToSpvTraverser::applySpirvDecorate(const glslang::TType& type, spv::Id id, std::optional member) +{ + assert(type.getQualifier().hasSpirvDecorate()); + + const glslang::TSpirvDecorate& spirvDecorate = type.getQualifier().getSpirvDecorate(); + + // Add spirv_decorate + for (auto& decorate : spirvDecorate.decorates) { + if (!decorate.second.empty()) { + std::vector literals; + TranslateLiterals(decorate.second, literals); + if (member.has_value()) + builder.addMemberDecoration(id, *member, static_cast(decorate.first), literals); + else + builder.addDecoration(id, static_cast(decorate.first), literals); + } else { + if (member.has_value()) + builder.addMemberDecoration(id, *member, static_cast(decorate.first)); + else + builder.addDecoration(id, static_cast(decorate.first)); + } + } + + // Add spirv_decorate_id + if (member.has_value()) { + // spirv_decorate_id not applied to members + assert(spirvDecorate.decorateIds.empty()); + } else { + for (auto& decorateId : spirvDecorate.decorateIds) { + std::vector operandIds; + assert(!decorateId.second.empty()); + for (auto extraOperand : decorateId.second) { + if (extraOperand->getQualifier().isFrontEndConstant()) + operandIds.push_back(createSpvConstant(*extraOperand)); + else + operandIds.push_back(getSymbolId(extraOperand->getAsSymbolNode())); + } + builder.addDecorationId(id, static_cast(decorateId.first), operandIds); + } + } + + // Add spirv_decorate_string + for (auto& decorateString : spirvDecorate.decorateStrings) { + std::vector strings; + assert(!decorateString.second.empty()); + for (auto extraOperand : decorateString.second) { + const char* string = extraOperand->getConstArray()[0].getSConst()->c_str(); + strings.push_back(string); + } + if (member.has_value()) + builder.addMemberDecoration(id, *member, static_cast(decorateString.first), strings); + else + builder.addDecoration(id, static_cast(decorateString.first), strings); + } +} + // TODO: this functionality should exist at a higher level, in creating the AST // // Identify interface members that don't have their required extension turned on. // bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member) { -#ifndef GLSLANG_WEB auto& extensions = glslangIntermediate->getRequestedExtensions(); if (member.getFieldName() == "gl_SecondaryViewportMaskNV" && @@ -4310,7 +4842,13 @@ bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member) extensions.find("GL_NV_stereo_view_rendering") == extensions.end()) return true; - if (glslangIntermediate->getStage() != EShLangMeshNV) { + if (glslangIntermediate->getStage() == EShLangMesh) { + if (member.getFieldName() == "gl_PrimitiveShadingRateEXT" && + extensions.find("GL_EXT_fragment_shading_rate") == extensions.end()) + return true; + } + + if (glslangIntermediate->getStage() != EShLangMesh) { if (member.getFieldName() == "gl_ViewportMask" && extensions.find("GL_NV_viewport_array2") == extensions.end()) return true; @@ -4321,7 +4859,6 @@ bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member) extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end()) return true; } -#endif return false; }; @@ -4340,14 +4877,14 @@ spv::Id TGlslangToSpvTraverser::convertGlslangStructToSpvType(const glslang::TTy // except sometimes for blocks std::vector > deferredForwardPointers; for (int i = 0; i < (int)glslangMembers->size(); i++) { - glslang::TType& glslangMember = *(*glslangMembers)[i].type; - if (glslangMember.hiddenMember()) { + auto& glslangMember = (*glslangMembers)[i]; + if (glslangMember.type->hiddenMember()) { ++memberDelta; if (type.getBasicType() == glslang::EbtBlock) memberRemapper[glslangTypeToIdMap[glslangMembers]][i] = -1; } else { if (type.getBasicType() == glslang::EbtBlock) { - if (filterMember(glslangMember)) { + if (filterMember(*glslangMember.type)) { memberDelta++; memberRemapper[glslangTypeToIdMap[glslangMembers]][i] = -1; continue; @@ -4355,7 +4892,7 @@ spv::Id TGlslangToSpvTraverser::convertGlslangStructToSpvType(const glslang::TTy memberRemapper[glslangTypeToIdMap[glslangMembers]][i] = i - memberDelta; } // modify just this child's view of the qualifier - glslang::TQualifier memberQualifier = glslangMember.getQualifier(); + glslang::TQualifier memberQualifier = glslangMember.type->getQualifier(); InheritQualifiers(memberQualifier, qualifier); // manually inherit location @@ -4366,30 +4903,43 @@ spv::Id TGlslangToSpvTraverser::convertGlslangStructToSpvType(const glslang::TTy bool lastBufferBlockMember = qualifier.storage == glslang::EvqBuffer && i == (int)glslangMembers->size() - 1; - // Make forward pointers for any pointer members, and create a list of members to - // convert to spirv types after creating the struct. - if (glslangMember.isReference()) { - if (forwardPointers.find(glslangMember.getReferentType()) == forwardPointers.end()) { - deferredForwardPointers.push_back(std::make_pair(&glslangMember, memberQualifier)); - } - spvMembers.push_back( - convertGlslangToSpvType(glslangMember, explicitLayout, memberQualifier, lastBufferBlockMember, - true)); - } else { - spvMembers.push_back( - convertGlslangToSpvType(glslangMember, explicitLayout, memberQualifier, lastBufferBlockMember, - false)); + // Make forward pointers for any pointer members. + if (glslangMember.type->isReference() && + forwardPointers.find(glslangMember.type->getReferentType()) == forwardPointers.end()) { + deferredForwardPointers.push_back(std::make_pair(glslangMember.type, memberQualifier)); + } + + // Create the member type. + auto const spvMember = convertGlslangToSpvType(*glslangMember.type, explicitLayout, memberQualifier, lastBufferBlockMember, + glslangMember.type->isReference()); + spvMembers.push_back(spvMember); + + // Update the builder with the type's location so that we can create debug types for the structure members. + // There doesn't exist a "clean" entry point for this information to be passed along to the builder so, for now, + // it is stored in the builder and consumed during the construction of composite debug types. + // TODO: This probably warrants further investigation. This approach was decided to be the least ugly of the + // quick and dirty approaches that were tried. + // Advantages of this approach: + // + Relatively clean. No direct calls into debug type system. + // + Handles nested recursive structures. + // Disadvantages of this approach: + // + Not as clean as desired. Traverser queries/sets persistent state. This is fragile. + // + Table lookup during creation of composite debug types. This really shouldn't be necessary. + if(options.emitNonSemanticShaderDebugInfo) { + builder.debugTypeLocs[spvMember].name = glslangMember.type->getFieldName().c_str(); + builder.debugTypeLocs[spvMember].line = glslangMember.loc.line; + builder.debugTypeLocs[spvMember].column = glslangMember.loc.column; } } } // Make the SPIR-V type - spv::Id spvType = builder.makeStructType(spvMembers, type.getTypeName().c_str()); + spv::Id spvType = builder.makeStructType(spvMembers, type.getTypeName().c_str(), false); if (! HasNonLayoutQualifiers(type, qualifier)) structMap[explicitLayout][qualifier.layoutMatrix][glslangMembers] = spvType; // Decorate it - decorateStructType(type, glslangMembers, explicitLayout, qualifier, spvType); + decorateStructType(type, glslangMembers, explicitLayout, qualifier, spvType, spvMembers); for (int i = 0; i < (int)deferredForwardPointers.size(); ++i) { auto it = deferredForwardPointers[i]; @@ -4403,7 +4953,8 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, const glslang::TTypeList* glslangMembers, glslang::TLayoutPacking explicitLayout, const glslang::TQualifier& qualifier, - spv::Id spvType) + spv::Id spvType, + const std::vector& spvMembers) { // Name and decorate the non-hidden members int offset = -1; @@ -4438,14 +4989,11 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, glslangIntermediate->getSource() == glslang::EShSourceHlsl) { builder.addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier)); builder.addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier)); -#ifndef GLSLANG_WEB addMeshNVDecoration(spvType, member, memberQualifier); -#endif } } builder.addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier)); -#ifndef GLSLANG_WEB if (type.getBasicType() == glslang::EbtBlock && qualifier.storage == glslang::EvqBuffer) { // Add memory decorations only to top-level members of shader storage block @@ -4455,8 +5003,6 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, builder.addMemberDecoration(spvType, member, memory[i]); } -#endif - // Location assignment was already completed correctly by the front end, // just track whether a member needs to be decorated. // Ignore member locations if the container is an array, as that's @@ -4489,7 +5035,6 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, if (builtIn != spv::BuiltInMax) builder.addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn); -#ifndef GLSLANG_WEB // nonuniform builder.addMemberDecoration(spvType, member, TranslateNonUniformDecoration(glslangMember.getQualifier())); @@ -4520,50 +5065,33 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough); } - // - // Add SPIR-V decorations for members (GL_EXT_spirv_intrinsics) - // - if (glslangMember.getQualifier().hasSprivDecorate()) { - const glslang::TSpirvDecorate& spirvDecorate = glslangMember.getQualifier().getSpirvDecorate(); - - // Add spirv_decorate - for (auto& decorate : spirvDecorate.decorates) { - if (!decorate.second.empty()) { - std::vector literals; - TranslateLiterals(decorate.second, literals); - builder.addMemberDecoration(spvType, member, static_cast(decorate.first), literals); - } - else - builder.addMemberDecoration(spvType, member, static_cast(decorate.first)); - } - - // spirv_decorate_id not applied to members - assert(spirvDecorate.decorateIds.empty()); - - // Add spirv_decorate_string - for (auto& decorateString : spirvDecorate.decorateStrings) { - std::vector strings; - assert(!decorateString.second.empty()); - for (auto extraOperand : decorateString.second) { - const char* string = extraOperand->getConstArray()[0].getSConst()->c_str(); - strings.push_back(string); - } - builder.addDecoration(spvType, static_cast(decorateString.first), strings); - } - } -#endif + // Add SPIR-V decorations (GL_EXT_spirv_intrinsics) + if (glslangMember.getQualifier().hasSpirvDecorate()) + applySpirvDecorate(glslangMember, spvType, member); } // Decorate the structure builder.addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix)); - builder.addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer())); + const auto basicType = type.getBasicType(); + const auto typeStorageQualifier = type.getQualifier().storage; + if (basicType == glslang::EbtBlock) { + builder.addDecoration(spvType, TranslateBlockDecoration(typeStorageQualifier, glslangIntermediate->usingStorageBuffer())); + } else if (basicType == glslang::EbtStruct && glslangIntermediate->getSpv().vulkan > 0) { + const auto hasRuntimeArray = !spvMembers.empty() && builder.getOpCode(spvMembers.back()) == spv::OpTypeRuntimeArray; + if (hasRuntimeArray) { + builder.addDecoration(spvType, TranslateBlockDecoration(typeStorageQualifier, glslangIntermediate->usingStorageBuffer())); + } + } + + if (qualifier.hasHitObjectShaderRecordNV()) + builder.addDecoration(spvType, spv::DecorationHitObjectShaderRecordBufferNV); } // Turn the expression forming the array size into an id. // This is not quite trivial, because of specialization constants. // Sometimes, a raw constant is turned into an Id, and sometimes // a specialization constant expression is. -spv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arraySizes, int dim) +spv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arraySizes, int dim, bool allowZero) { // First, see if this is sized with a node, meaning a specialization constant: glslang::TIntermTyped* specNode = arraySizes.getDimNode(dim); @@ -4577,7 +5105,10 @@ spv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arra // Otherwise, need a compile-time (front end) size, get it: int size = arraySizes.getDimSize(dim); - assert(size > 0); + + if (!allowZero) + assert(size > 0); + return builder.makeUintConstant(size); } @@ -4593,6 +5124,16 @@ spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type) spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags; coherentFlags |= TranslateCoherent(type); + spv::MemoryAccessMask accessMask = spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask); + // If the value being loaded is HelperInvocation, SPIR-V 1.6 is being generated (so that + // SPV_EXT_demote_to_helper_invocation is in core) and the memory model is in use, add + // the Volatile MemoryAccess semantic. + if (type.getQualifier().builtIn == glslang::EbvHelperInvocation && + glslangIntermediate->usingVulkanMemoryModel() && + glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) { + accessMask = spv::MemoryAccessMask(accessMask | spv::MemoryAccessVolatileMask); + } + unsigned int alignment = builder.getAccessChain().alignment; alignment |= type.getBufferReferenceAlignment(); @@ -4600,7 +5141,7 @@ spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type) TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags), TranslateNonUniformDecoration(type.getQualifier()), nominalTypeId, - spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask), + accessMask, TranslateMemoryScope(coherentFlags), alignment); @@ -4842,17 +5383,34 @@ void TGlslangToSpvTraverser::updateMemberOffset(const glslang::TType& structType int memberAlignment = glslangIntermediate->getMemberAlignment(memberType, memberSize, dummyStride, explicitLayout, matrixLayout == glslang::ElmRowMajor); + bool isVectorLike = memberType.isVector(); + if (memberType.isMatrix()) { + if (matrixLayout == glslang::ElmRowMajor) + isVectorLike = memberType.getMatrixRows() == 1; + else + isVectorLike = memberType.getMatrixCols() == 1; + } + // Adjust alignment for HLSL rules // TODO: make this consistent in early phases of code: // adjusting this late means inconsistencies with earlier code, which for reflection is an issue // Until reflection is brought in sync with these adjustments, don't apply to $Global, // which is the most likely to rely on reflection, and least likely to rely implicit layouts if (glslangIntermediate->usingHlslOffsets() && - ! memberType.isArray() && memberType.isVector() && structType.getTypeName().compare("$Global") != 0) { - int dummySize; - int componentAlignment = glslangIntermediate->getBaseAlignmentScalar(memberType, dummySize); - if (componentAlignment <= 4) + ! memberType.isStruct() && structType.getTypeName().compare("$Global") != 0) { + int componentSize; + int componentAlignment = glslangIntermediate->getBaseAlignmentScalar(memberType, componentSize); + if (! memberType.isArray() && isVectorLike && componentAlignment <= 4) memberAlignment = componentAlignment; + + // Don't add unnecessary padding after this member + if (memberType.isMatrix()) { + if (matrixLayout == glslang::ElmRowMajor) + memberSize -= componentSize * (4 - memberType.getMatrixCols()); + else + memberSize -= componentSize * (4 - memberType.getMatrixRows()); + } else if (memberType.isArray()) + memberSize -= componentSize * (4 - memberType.getVectorSize()); } // Bump up to member alignment @@ -4860,7 +5418,7 @@ void TGlslangToSpvTraverser::updateMemberOffset(const glslang::TType& structType // Bump up to vec4 if there is a bad straddle if (explicitLayout != glslang::ElpScalar && glslangIntermediate->improperStraddle(memberType, memberSize, - currentOffset)) + currentOffset, isVectorLike)) glslang::RoundToPow2(currentOffset, 16); nextOffset = currentOffset + memberSize; @@ -4872,7 +5430,6 @@ void TGlslangToSpvTraverser::declareUseOfStructMember(const glslang::TTypeList& switch (glslangBuiltIn) { case glslang::EbvPointSize: -#ifndef GLSLANG_WEB case glslang::EbvClipDistance: case glslang::EbvCullDistance: case glslang::EbvViewportMaskNV: @@ -4888,7 +5445,6 @@ void TGlslangToSpvTraverser::declareUseOfStructMember(const glslang::TTypeList& case glslang::EbvLayerPerViewNV: case glslang::EbvMeshViewCountNV: case glslang::EbvMeshViewIndicesNV: -#endif // Generate the associated capability. Delegate to TranslateBuiltInDecoration. // Alternately, we could just call this for any glslang built-in, since the // capability already guards against duplicates. @@ -4927,10 +5483,8 @@ bool TGlslangToSpvTraverser::originalParam(glslang::TStorageQualifier qualifier, return true; if (glslangIntermediate->getSource() == glslang::EShSourceHlsl) return paramType.getBasicType() == glslang::EbtBlock; - return paramType.containsOpaque() || // sampler, etc. -#ifndef GLSLANG_WEB + return (paramType.containsOpaque() && !glslangIntermediate->getBindlessMode()) || // sampler, etc. paramType.getQualifier().isSpirvByReference() || // spirv_by_reference -#endif (paramType.getBasicType() == glslang::EbtBlock && qualifier == glslang::EvqBuffer); // SSBO } @@ -4949,8 +5503,10 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF // memory and use RestrictPointer/AliasedPointer. if (originalParam(type.getQualifier().storage, type, false) || !writableParam(type.getQualifier().storage)) { - decorations.push_back(type.getQualifier().isRestrict() ? spv::DecorationRestrict : - spv::DecorationAliased); + // TranslateMemoryDecoration added Restrict decoration already. + if (!type.getQualifier().isRestrict()) { + decorations.push_back(spv::DecorationAliased); + } } else { decorations.push_back(type.getQualifier().isRestrict() ? spv::DecorationRestrictPointerEXT : spv::DecorationAliasedPointerEXT); @@ -4960,9 +5516,17 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF for (int f = 0; f < (int)glslFunctions.size(); ++f) { glslang::TIntermAggregate* glslFunction = glslFunctions[f]->getAsAggregate(); - if (! glslFunction || glslFunction->getOp() != glslang::EOpFunction || isShaderEntryPoint(glslFunction)) + if (! glslFunction || glslFunction->getOp() != glslang::EOpFunction) continue; - + if (isShaderEntryPoint(glslFunction)) { + if (glslangIntermediate->getSource() != glslang::EShSourceHlsl) { + builder.setupDebugFunctionEntry(shaderEntry, glslangIntermediate->getEntryPointMangledName().c_str(), + glslFunction->getLoc().line, + std::vector(), // main function has no param + std::vector()); + } + continue; + } // We're on a user function. Set up the basic interface for the function now, // so that it's available to call. Translating the body will happen later. // @@ -4978,6 +5542,7 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF // GLSL has copy-in/copy-out semantics. They can be handled though with a pointer to a copy. std::vector paramTypes; + std::vector paramNames; std::vector> paramDecorations; // list of decorations per parameter glslang::TIntermSequence& parameters = glslFunction->getSequence()[0]->getAsAggregate()->getSequence(); @@ -5002,11 +5567,17 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF paramTypes.push_back(typeId); } + for (auto const parameter:parameters) { + paramNames.push_back(parameter->getAsSymbolNode()->getName().c_str()); + } + spv::Block* functionBlock; - spv::Function *function = builder.makeFunctionEntry(TranslatePrecisionDecoration(glslFunction->getType()), - convertGlslangToSpvType(glslFunction->getType()), - glslFunction->getName().c_str(), paramTypes, - paramDecorations, &functionBlock); + spv::Function* function = builder.makeFunctionEntry( + TranslatePrecisionDecoration(glslFunction->getType()), convertGlslangToSpvType(glslFunction->getType()), + glslFunction->getName().c_str(), convertGlslangLinkageToSpv(glslFunction->getLinkType()), paramTypes, + paramDecorations, &functionBlock); + builder.setupDebugFunctionEntry(function, glslFunction->getName().c_str(), glslFunction->getLoc().line, + paramTypes, paramNames); if (implicitThis) function->setImplicitThis(); @@ -5069,6 +5640,10 @@ void TGlslangToSpvTraverser::collectRayTracingLinkerObjects() set = 1; break; + case glslang::EvqHitObjectAttrNV: + set = 2; + break; + default: set = -1; } @@ -5095,6 +5670,7 @@ void TGlslangToSpvTraverser::handleFunctionEntry(const glslang::TIntermAggregate currentFunction = functionMap[node->getName().c_str()]; spv::Block* functionBlock = currentFunction->getEntryBlock(); builder.setBuildPoint(functionBlock); + builder.enterFunction(currentFunction); } void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& node, std::vector& arguments, @@ -5104,23 +5680,18 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& glslang::TSampler sampler = {}; bool cubeCompare = false; -#ifndef GLSLANG_WEB bool f16ShadowCompare = false; -#endif if (node.isTexture() || node.isImage()) { sampler = glslangArguments[0]->getAsTyped()->getType().getSampler(); cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow; -#ifndef GLSLANG_WEB f16ShadowCompare = sampler.shadow && glslangArguments[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16; -#endif } for (int i = 0; i < (int)glslangArguments.size(); ++i) { builder.clearAccessChain(); glslangArguments[i]->traverse(this); -#ifndef GLSLANG_WEB // Special case l-value operands bool lvalue = false; switch (node.getOp()) { @@ -5216,6 +5787,10 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& if (i == 7) lvalue = true; break; + case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: + if (i == 2) + lvalue = true; + break; default: break; } @@ -5226,9 +5801,16 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& lvalueCoherentFlags = builder.getAccessChain().coherentFlags; builder.addDecoration(lvalue_id, TranslateNonUniformDecoration(lvalueCoherentFlags)); lvalueCoherentFlags |= TranslateCoherent(glslangArguments[i]->getAsTyped()->getType()); - } else -#endif - arguments.push_back(accessChainLoad(glslangArguments[i]->getAsTyped()->getType())); + } else { + if (i > 0 && + glslangArguments[i]->getAsSymbolNode() && glslangArguments[i-1]->getAsSymbolNode() && + glslangArguments[i]->getAsSymbolNode()->getId() == glslangArguments[i-1]->getAsSymbolNode()->getId()) { + // Reuse the id if possible + arguments.push_back(arguments[i-1]); + } else { + arguments.push_back(accessChainLoad(glslangArguments[i]->getAsTyped()->getType())); + } + } } } @@ -5244,7 +5826,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO if (! node->isImage() && ! node->isTexture()) return spv::NoResult; - builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + builder.setDebugSourceLocation(node->getLoc().line, node->getLoc().getFilename()); // Process a GLSL texturing op (will be SPV image) @@ -5252,13 +5834,9 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType() : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType(); const glslang::TSampler sampler = imageType.getSampler(); -#ifdef GLSLANG_WEB - const bool f16ShadowCompare = false; -#else bool f16ShadowCompare = (sampler.shadow && node->getAsAggregate()) ? node->getAsAggregate()->getSequence()[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16 : false; -#endif const auto signExtensionMask = [&]() { if (builder.getSpvVersion() >= spv::Spv_1_4) { @@ -5304,7 +5882,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO return builder.createTextureQueryCall(spv::OpImageQuerySizeLod, params, isUnsignedResult); } else return builder.createTextureQueryCall(spv::OpImageQuerySize, params, isUnsignedResult); -#ifndef GLSLANG_WEB case glslang::EOpImageQuerySamples: case glslang::EOpTextureQuerySamples: return builder.createTextureQueryCall(spv::OpImageQuerySamples, params, isUnsignedResult); @@ -5315,7 +5892,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO return builder.createTextureQueryCall(spv::OpImageQueryLevels, params, isUnsignedResult); case glslang::EOpSparseTexelsResident: return builder.createUnaryOp(spv::OpImageSparseTexelsResident, builder.makeBoolType(), arguments[0]); -#endif default: assert(0); break; @@ -5375,6 +5951,17 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO return result; } + if (cracked.attachmentEXT) { + if (opIt != arguments.end()) { + spv::IdImmediate sample = { true, *opIt }; + operands.push_back(sample); + } + spv::Id result = builder.createOp(spv::OpColorAttachmentReadEXT, resultType(), operands); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.setPrecision(result, precision); + return result; + } + spv::IdImmediate coord = { true, *(opIt++) }; operands.push_back(coord); if (node->getOp() == glslang::EOpImageLoad || node->getOp() == glslang::EOpImageLoadLod) { @@ -5522,10 +6109,12 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO operands.push_back(sample); spv::Id resultTypeId; + glslang::TBasicType typeProxy = node->getBasicType(); // imageAtomicStore has a void return type so base the pointer type on // the type of the value operand. if (node->getOp() == glslang::EOpImageAtomicStore) { resultTypeId = builder.makePointer(spv::StorageClassImage, builder.getTypeId(*opIt)); + typeProxy = node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().getSampler().type; } else { resultTypeId = builder.makePointer(spv::StorageClassImage, resultType()); } @@ -5539,12 +6128,11 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO for (; opIt != arguments.end(); ++opIt) operands.push_back(*opIt); - return createAtomicOperation(node->getOp(), precision, resultType(), operands, node->getBasicType(), - lvalueCoherentFlags); + return createAtomicOperation(node->getOp(), precision, resultType(), operands, typeProxy, + lvalueCoherentFlags, node->getType()); } } -#ifndef GLSLANG_WEB // Check for fragment mask functions other than queries if (cracked.fragMask) { assert(sampler.ms); @@ -5578,7 +6166,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO builder.addCapability(spv::CapabilityFragmentMaskAMD); return builder.createOp(fragMaskOp, resultType(), operands); } -#endif // Check for texture functions other than queries bool sparse = node->isSparseTexture(); @@ -5612,7 +6199,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO bias = true; } -#ifndef GLSLANG_WEB if (cracked.gather) { const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions(); if (bias || cracked.lod || @@ -5621,7 +6207,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO builder.addCapability(spv::CapabilityImageGatherBiasLodAMD); } } -#endif // set the rest of the arguments @@ -5681,7 +6266,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ++extraArgs; } -#ifndef GLSLANG_WEB // lod clamp if (cracked.lodClamp) { params.lodClamp = arguments[2 + extraArgs]; @@ -5710,14 +6294,13 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO resultStruct = arguments[4 + extraArgs]; extraArgs += 3; } -#endif + // bias if (bias) { params.bias = arguments[2 + extraArgs]; ++extraArgs; } -#ifndef GLSLANG_WEB if (imageFootprint) { builder.addExtension(spv::E_SPV_NV_shader_image_footprint); builder.addCapability(spv::CapabilityImageFootprintNV); @@ -5743,10 +6326,10 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO assert(builder.isStructType(resultStructType)); //resType (SPIR-V type) contains 6 elements: - //Member 0 must be a Boolean type scalar(LOD), - //Member 1 must be a vector of integer type, whose Signedness operand is 0(anchor), - //Member 2 must be a vector of integer type, whose Signedness operand is 0(offset), - //Member 3 must be a vector of integer type, whose Signedness operand is 0(mask), + //Member 0 must be a Boolean type scalar(LOD), + //Member 1 must be a vector of integer type, whose Signedness operand is 0(anchor), + //Member 2 must be a vector of integer type, whose Signedness operand is 0(offset), + //Member 3 must be a vector of integer type, whose Signedness operand is 0(mask), //Member 4 must be a scalar of integer type, whose Signedness operand is 0(lod), //Member 5 must be a scalar of integer type, whose Signedness operand is 0(granularity). std::vector members; @@ -5759,7 +6342,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO //call ImageFootprintNV spv::Id res = builder.createTextureCall(precision, resType, sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params, signExtensionMask()); - + //copy resType (SPIR-V type) to resultStructType(OpenGL type) for (int i = 0; i < 5; i++) { builder.clearAccessChain(); @@ -5775,7 +6358,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO } return builder.createCompositeExtract(res, resultType(), 0); } -#endif // projective component (might not to move) // GLSL: "The texture coordinates consumed from P, not including the last component of P, @@ -5800,7 +6382,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO } } -#ifndef GLSLANG_WEB // nonprivate if (imageType.getQualifier().nonprivate) { params.nonprivate = true; @@ -5810,9 +6391,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO if (imageType.getQualifier().volatil) { params.volatil = true; } -#endif - std::vector result( 1, + std::vector result( 1, builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params, signExtensionMask()) ); @@ -6074,6 +6654,10 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, OpD binOp = isUnsigned ? spv::OpUMul32x16INTEL : spv::OpIMul32x16INTEL; break; + case glslang::EOpExpectEXT: + binOp = spv::OpExpectKHR; + break; + case glslang::EOpLessThan: case glslang::EOpGreaterThan: case glslang::EOpLessThanEqual: @@ -6296,7 +6880,8 @@ spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, OpDecora } spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDecorations& decorations, spv::Id typeId, - spv::Id operand, glslang::TBasicType typeProxy, const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags) + spv::Id operand, glslang::TBasicType typeProxy, const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags, + const glslang::TType &opType) { spv::Op unaryOp = spv::OpNop; int extBuiltins = -1; @@ -6464,7 +7049,6 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpUnpackHalf2x16: libCall = spv::GLSLstd450UnpackHalf2x16; break; -#ifndef GLSLANG_WEB case glslang::EOpPackSnorm4x8: libCall = spv::GLSLstd450PackSnorm4x8; break; @@ -6483,7 +7067,6 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpUnpackDouble2x32: libCall = spv::GLSLstd450UnpackDouble2x32; break; -#endif case glslang::EOpPackInt2x32: case glslang::EOpUnpackInt2x32: @@ -6538,7 +7121,6 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe libCall = spv::GLSLstd450SSign; break; -#ifndef GLSLANG_WEB case glslang::EOpDPdxFine: unaryOp = spv::OpDPdxFine; break; @@ -6587,7 +7169,7 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe // Handle all of the atomics in one place, in createAtomicOperation() std::vector operands; operands.push_back(operand); - return createAtomicOperation(op, decorations.precision, typeId, operands, typeProxy, lvalueCoherentFlags); + return createAtomicOperation(op, decorations.precision, typeId, operands, typeProxy, lvalueCoherentFlags, opType); } case glslang::EOpBitFieldReverse: @@ -6680,7 +7262,9 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpSubgroupExclusiveXor: case glslang::EOpSubgroupQuadSwapHorizontal: case glslang::EOpSubgroupQuadSwapVertical: - case glslang::EOpSubgroupQuadSwapDiagonal: { + case glslang::EOpSubgroupQuadSwapDiagonal: + case glslang::EOpSubgroupQuadAll: + case glslang::EOpSubgroupQuadAny: { std::vector operands; operands.push_back(operand); return createSubgroupOperation(op, typeId, operands, typeProxy); @@ -6710,12 +7294,108 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpConvUvec2ToAccStruct: unaryOp = spv::OpConvertUToAccelerationStructureKHR; break; -#endif + + case glslang::EOpHitObjectIsEmptyNV: + unaryOp = spv::OpHitObjectIsEmptyNV; + break; + + case glslang::EOpHitObjectIsMissNV: + unaryOp = spv::OpHitObjectIsMissNV; + break; + + case glslang::EOpHitObjectIsHitNV: + unaryOp = spv::OpHitObjectIsHitNV; + break; + + case glslang::EOpHitObjectGetObjectRayOriginNV: + unaryOp = spv::OpHitObjectGetObjectRayOriginNV; + break; + + case glslang::EOpHitObjectGetObjectRayDirectionNV: + unaryOp = spv::OpHitObjectGetObjectRayDirectionNV; + break; + + case glslang::EOpHitObjectGetWorldRayOriginNV: + unaryOp = spv::OpHitObjectGetWorldRayOriginNV; + break; + + case glslang::EOpHitObjectGetWorldRayDirectionNV: + unaryOp = spv::OpHitObjectGetWorldRayDirectionNV; + break; + + case glslang::EOpHitObjectGetObjectToWorldNV: + unaryOp = spv::OpHitObjectGetObjectToWorldNV; + break; + + case glslang::EOpHitObjectGetWorldToObjectNV: + unaryOp = spv::OpHitObjectGetWorldToObjectNV; + break; + + case glslang::EOpHitObjectGetRayTMinNV: + unaryOp = spv::OpHitObjectGetRayTMinNV; + break; + + case glslang::EOpHitObjectGetRayTMaxNV: + unaryOp = spv::OpHitObjectGetRayTMaxNV; + break; + + case glslang::EOpHitObjectGetPrimitiveIndexNV: + unaryOp = spv::OpHitObjectGetPrimitiveIndexNV; + break; + + case glslang::EOpHitObjectGetInstanceIdNV: + unaryOp = spv::OpHitObjectGetInstanceIdNV; + break; + + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + unaryOp = spv::OpHitObjectGetInstanceCustomIndexNV; + break; + + case glslang::EOpHitObjectGetGeometryIndexNV: + unaryOp = spv::OpHitObjectGetGeometryIndexNV; + break; + + case glslang::EOpHitObjectGetHitKindNV: + unaryOp = spv::OpHitObjectGetHitKindNV; + break; + + case glslang::EOpHitObjectGetCurrentTimeNV: + unaryOp = spv::OpHitObjectGetCurrentTimeNV; + break; + + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + unaryOp = spv::OpHitObjectGetShaderBindingTableRecordIndexNV; + break; + + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + unaryOp = spv::OpHitObjectGetShaderRecordBufferHandleNV; + break; + + case glslang::EOpFetchMicroTriangleVertexPositionNV: + unaryOp = spv::OpFetchMicroTriangleVertexPositionNV; + break; + + case glslang::EOpFetchMicroTriangleVertexBarycentricNV: + unaryOp = spv::OpFetchMicroTriangleVertexBarycentricNV; + break; case glslang::EOpCopyObject: unaryOp = spv::OpCopyObject; break; + case glslang::EOpDepthAttachmentReadEXT: + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.addCapability(spv::CapabilityTileImageDepthReadAccessEXT); + unaryOp = spv::OpDepthAttachmentReadEXT; + decorations.precision = spv::NoPrecision; + break; + case glslang::EOpStencilAttachmentReadEXT: + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.addCapability(spv::CapabilityTileImageStencilReadAccessEXT); + unaryOp = spv::OpStencilAttachmentReadEXT; + decorations.precision = spv::DecorationRelaxedPrecision; + break; + default: return 0; } @@ -6772,7 +7452,9 @@ spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, OpDecorat // For converting integers where both the bitwidth and the signedness could // change, but only do the width change here. The caller is still responsible // for the signedness conversion. -spv::Id TGlslangToSpvTraverser::createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize) +// destType is the final type that will be converted to, but this function +// may only be doing part of that conversion. +spv::Id TGlslangToSpvTraverser::createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize, spv::Id destType) { // Get the result type width, based on the type to convert to. int width = 32; @@ -6843,6 +7525,11 @@ spv::Id TGlslangToSpvTraverser::createIntWidthConversion(glslang::TOperator op, if (vectorSize > 0) type = builder.makeVectorType(type, vectorSize); + else if (builder.getOpCode(destType) == spv::OpTypeCooperativeMatrixKHR || + builder.getOpCode(destType) == spv::OpTypeCooperativeMatrixNV) { + + type = builder.makeCooperativeMatrixTypeWithSameShape(type, destType); + } return builder.createUnaryOp(convOp, type, operand); } @@ -6874,13 +7561,10 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvBoolToInt: case glslang::EOpConvBoolToInt64: -#ifndef GLSLANG_WEB if (op == glslang::EOpConvBoolToInt64) { zero = builder.makeInt64Constant(0); one = builder.makeInt64Constant(1); - } else -#endif - { + } else { zero = builder.makeIntConstant(0); one = builder.makeIntConstant(1); } @@ -6890,13 +7574,10 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvBoolToUint: case glslang::EOpConvBoolToUint64: -#ifndef GLSLANG_WEB if (op == glslang::EOpConvBoolToUint64) { zero = builder.makeUint64Constant(0); one = builder.makeUint64Constant(1); - } else -#endif - { + } else { zero = builder.makeUintConstant(0); one = builder.makeUintConstant(1); } @@ -6959,16 +7640,13 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvInt64ToUint64: if (builder.isInSpecConstCodeGenMode()) { // Build zero scalar or vector for OpIAdd. -#ifndef GLSLANG_WEB if(op == glslang::EOpConvUint8ToInt8 || op == glslang::EOpConvInt8ToUint8) { zero = builder.makeUint8Constant(0); } else if (op == glslang::EOpConvUint16ToInt16 || op == glslang::EOpConvInt16ToUint16) { zero = builder.makeUint16Constant(0); } else if (op == glslang::EOpConvUint64ToInt64 || op == glslang::EOpConvInt64ToUint64) { zero = builder.makeUint64Constant(0); - } else -#endif - { + } else { zero = builder.makeUintConstant(0); } zero = makeSmearedConstant(zero, vectorSize); @@ -6995,7 +7673,6 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora convOp = spv::OpConvertFToU; break; -#ifndef GLSLANG_WEB case glslang::EOpConvInt8ToBool: case glslang::EOpConvUint8ToBool: zero = builder.makeUint8Constant(0); @@ -7115,7 +7792,7 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvUint64ToInt16: case glslang::EOpConvUint64ToInt: // OpSConvert/OpUConvert + OpBitCast - operand = createIntWidthConversion(op, operand, vectorSize); + operand = createIntWidthConversion(op, operand, vectorSize, destType); if (builder.isInSpecConstCodeGenMode()) { // Build zero scalar or vector for OpIAdd. @@ -7174,7 +7851,6 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvUvec2ToPtr: convOp = spv::OpBitcast; break; -#endif default: break; @@ -7211,7 +7887,7 @@ spv::Id TGlslangToSpvTraverser::makeSmearedConstant(spv::Id constant, int vector // For glslang ops that map to SPV atomic opCodes spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv::Decoration /*precision*/, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy, - const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags) + const spv::Builder::AccessChain::CoherentFlags &lvalueCoherentFlags, const glslang::TType &opType) { spv::Op opCode = spv::OpNop; @@ -7222,14 +7898,20 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv opCode = spv::OpAtomicIAdd; if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) { opCode = spv::OpAtomicFAddEXT; - builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_add); - if (typeProxy == glslang::EbtFloat16) { - builder.addExtension(spv::E_SPV_EXT_shader_atomic_float16_add); - builder.addCapability(spv::CapabilityAtomicFloat16AddEXT); - } else if (typeProxy == glslang::EbtFloat) { - builder.addCapability(spv::CapabilityAtomicFloat32AddEXT); + if (typeProxy == glslang::EbtFloat16 && + (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) { + builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector); + builder.addCapability(spv::CapabilityAtomicFloat16VectorNV); } else { - builder.addCapability(spv::CapabilityAtomicFloat64AddEXT); + builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_add); + if (typeProxy == glslang::EbtFloat16) { + builder.addExtension(spv::E_SPV_EXT_shader_atomic_float16_add); + builder.addCapability(spv::CapabilityAtomicFloat16AddEXT); + } else if (typeProxy == glslang::EbtFloat) { + builder.addCapability(spv::CapabilityAtomicFloat32AddEXT); + } else { + builder.addCapability(spv::CapabilityAtomicFloat64AddEXT); + } } } break; @@ -7242,13 +7924,19 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv case glslang::EOpAtomicCounterMin: if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) { opCode = spv::OpAtomicFMinEXT; - builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max); - if (typeProxy == glslang::EbtFloat16) - builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT); - else if (typeProxy == glslang::EbtFloat) - builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT); - else - builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT); + if (typeProxy == glslang::EbtFloat16 && + (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) { + builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector); + builder.addCapability(spv::CapabilityAtomicFloat16VectorNV); + } else { + builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max); + if (typeProxy == glslang::EbtFloat16) + builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT); + else if (typeProxy == glslang::EbtFloat) + builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT); + else + builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT); + } } else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) { opCode = spv::OpAtomicUMin; } else { @@ -7260,13 +7948,19 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv case glslang::EOpAtomicCounterMax: if (typeProxy == glslang::EbtFloat16 || typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble) { opCode = spv::OpAtomicFMaxEXT; - builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max); - if (typeProxy == glslang::EbtFloat16) - builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT); - else if (typeProxy == glslang::EbtFloat) - builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT); - else - builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT); + if (typeProxy == glslang::EbtFloat16 && + (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) { + builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector); + builder.addCapability(spv::CapabilityAtomicFloat16VectorNV); + } else { + builder.addExtension(spv::E_SPV_EXT_shader_atomic_float_min_max); + if (typeProxy == glslang::EbtFloat16) + builder.addCapability(spv::CapabilityAtomicFloat16MinMaxEXT); + else if (typeProxy == glslang::EbtFloat) + builder.addCapability(spv::CapabilityAtomicFloat32MinMaxEXT); + else + builder.addCapability(spv::CapabilityAtomicFloat64MinMaxEXT); + } } else if (typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64) { opCode = spv::OpAtomicUMax; } else { @@ -7291,6 +7985,12 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv case glslang::EOpAtomicExchange: case glslang::EOpImageAtomicExchange: case glslang::EOpAtomicCounterExchange: + if ((typeProxy == glslang::EbtFloat16) && + (opType.getVectorSize() == 2 || opType.getVectorSize() == 4)) { + builder.addExtension(spv::E_SPV_NV_shader_atomic_fp16_vector); + builder.addCapability(spv::CapabilityAtomicFloat16VectorNV); + } + opCode = spv::OpAtomicExchange; break; case glslang::EOpAtomicCompSwap: @@ -7335,7 +8035,7 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv } else { scopeId = builder.makeUintConstant(spv::ScopeDevice); } - // semantics default to relaxed + // semantics default to relaxed spv::Id semanticsId = builder.makeUintConstant(lvalueCoherentFlags.isVolatile() && glslangIntermediate->usingVulkanMemoryModel() ? spv::MemorySemanticsVolatileMask : @@ -7389,6 +8089,7 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv } std::vector spvAtomicOperands; // hold the spv operands + spvAtomicOperands.reserve(6); spvAtomicOperands.push_back(pointerId); spvAtomicOperands.push_back(scopeId); spvAtomicOperands.push_back(semanticsId); @@ -7506,6 +8207,8 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op break; case glslang::EOpReadFirstInvocation: opCode = spv::OpSubgroupFirstInvocationKHR; + if (builder.isVectorType(typeId)) + return CreateInvocationsVectorOperation(opCode, groupOperation, typeId, operands); break; case glslang::EOpBallot: { @@ -7630,7 +8333,7 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin || op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax || op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast || - op == spv::OpSubgroupReadInvocationKHR || + op == spv::OpSubgroupReadInvocationKHR || op == spv::OpSubgroupFirstInvocationKHR || op == spv::OpGroupFMinNonUniformAMD || op == spv::OpGroupUMinNonUniformAMD || op == spv::OpGroupSMinNonUniformAMD || op == spv::OpGroupFMaxNonUniformAMD || op == spv::OpGroupUMaxNonUniformAMD || @@ -7659,6 +8362,8 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv spvGroupOperands.push_back(scalar); spv::IdImmediate operand = { true, operands[1] }; spvGroupOperands.push_back(operand); + } else if (op == spv::OpSubgroupFirstInvocationKHR) { + spvGroupOperands.push_back(scalar); } else if (op == spv::OpGroupBroadcast) { spv::IdImmediate scope = { true, builder.makeUintConstant(spv::ScopeSubgroup) }; spvGroupOperands.push_back(scope); @@ -7689,6 +8394,11 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s case glslang::EOpSubgroupElect: builder.addCapability(spv::CapabilityGroupNonUniform); break; + case glslang::EOpSubgroupQuadAll: + case glslang::EOpSubgroupQuadAny: + builder.addExtension(spv::E_SPV_KHR_quad_control); + builder.addCapability(spv::CapabilityQuadControlKHR); + [[fallthrough]]; case glslang::EOpSubgroupAll: case glslang::EOpSubgroupAny: case glslang::EOpSubgroupAllEqual: @@ -7708,6 +8418,11 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s builder.addCapability(spv::CapabilityGroupNonUniform); builder.addCapability(spv::CapabilityGroupNonUniformBallot); break; + case glslang::EOpSubgroupRotate: + case glslang::EOpSubgroupClusteredRotate: + builder.addExtension(spv::E_SPV_KHR_subgroup_rotate); + builder.addCapability(spv::CapabilityGroupNonUniformRotateKHR); + break; case glslang::EOpSubgroupShuffle: case glslang::EOpSubgroupShuffleXor: builder.addCapability(spv::CapabilityGroupNonUniform); @@ -7796,7 +8511,9 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s // Figure out which opcode to use. switch (op) { case glslang::EOpSubgroupElect: opCode = spv::OpGroupNonUniformElect; break; + case glslang::EOpSubgroupQuadAll: opCode = spv::OpGroupNonUniformQuadAllKHR; break; case glslang::EOpSubgroupAll: opCode = spv::OpGroupNonUniformAll; break; + case glslang::EOpSubgroupQuadAny: opCode = spv::OpGroupNonUniformQuadAnyKHR; break; case glslang::EOpSubgroupAny: opCode = spv::OpGroupNonUniformAny; break; case glslang::EOpSubgroupAllEqual: opCode = spv::OpGroupNonUniformAllEqual; break; case glslang::EOpSubgroupBroadcast: opCode = spv::OpGroupNonUniformBroadcast; break; @@ -7813,6 +8530,8 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s case glslang::EOpSubgroupShuffleXor: opCode = spv::OpGroupNonUniformShuffleXor; break; case glslang::EOpSubgroupShuffleUp: opCode = spv::OpGroupNonUniformShuffleUp; break; case glslang::EOpSubgroupShuffleDown: opCode = spv::OpGroupNonUniformShuffleDown; break; + case glslang::EOpSubgroupRotate: + case glslang::EOpSubgroupClusteredRotate: opCode = spv::OpGroupNonUniformRotateKHR; break; case glslang::EOpSubgroupAdd: case glslang::EOpSubgroupInclusiveAdd: case glslang::EOpSubgroupExclusiveAdd: @@ -7993,7 +8712,10 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s // Every operation begins with the Execution Scope operand. spv::IdImmediate executionScope = { true, builder.makeUintConstant(spv::ScopeSubgroup) }; - spvGroupOperands.push_back(executionScope); + // All other ops need the execution scope. Quad Control Ops don't need scope, it's always Quad. + if (opCode != spv::OpGroupNonUniformQuadAllKHR && opCode != spv::OpGroupNonUniformQuadAnyKHR) { + spvGroupOperands.push_back(executionScope); + } // Next, for all operations that use a Group Operation, push that as an operand. if (groupOperation != spv::GroupOperationMax) { @@ -8162,7 +8884,6 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: } break; -#ifndef GLSLANG_WEB case glslang::EOpInterpolateAtSample: if (typeProxy == glslang::EbtFloat16) builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float); @@ -8237,6 +8958,8 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: case glslang::EOpSubgroupShuffleXor: case glslang::EOpSubgroupShuffleUp: case glslang::EOpSubgroupShuffleDown: + case glslang::EOpSubgroupRotate: + case glslang::EOpSubgroupClusteredRotate: case glslang::EOpSubgroupClusteredAdd: case glslang::EOpSubgroupClusteredMul: case glslang::EOpSubgroupClusteredMin: @@ -8435,10 +9158,190 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: case glslang::EOpWritePackedPrimitiveIndices4x8NV: builder.createNoResultOp(spv::OpWritePackedPrimitiveIndices4x8NV, operands); return 0; - case glslang::EOpCooperativeMatrixMulAdd: + case glslang::EOpEmitMeshTasksEXT: + if (taskPayloadID) + operands.push_back(taskPayloadID); + // As per SPV_EXT_mesh_shader make it a terminating instruction in the current block + builder.makeStatementTerminator(spv::OpEmitMeshTasksEXT, operands, "post-OpEmitMeshTasksEXT"); + return 0; + case glslang::EOpSetMeshOutputsEXT: + builder.createNoResultOp(spv::OpSetMeshOutputsEXT, operands); + return 0; + case glslang::EOpCooperativeMatrixMulAddNV: opCode = spv::OpCooperativeMatrixMulAddNV; break; -#endif // GLSLANG_WEB + case glslang::EOpHitObjectTraceRayNV: + builder.createNoResultOp(spv::OpHitObjectTraceRayNV, operands); + return 0; + case glslang::EOpHitObjectTraceRayMotionNV: + builder.createNoResultOp(spv::OpHitObjectTraceRayMotionNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitMotionNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitMotionNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitWithIndexNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitWithIndexNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitWithIndexMotionNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitWithIndexMotionNV, operands); + return 0; + case glslang::EOpHitObjectRecordMissNV: + builder.createNoResultOp(spv::OpHitObjectRecordMissNV, operands); + return 0; + case glslang::EOpHitObjectRecordMissMotionNV: + builder.createNoResultOp(spv::OpHitObjectRecordMissMotionNV, operands); + return 0; + case glslang::EOpHitObjectExecuteShaderNV: + builder.createNoResultOp(spv::OpHitObjectExecuteShaderNV, operands); + return 0; + case glslang::EOpHitObjectIsEmptyNV: + typeId = builder.makeBoolType(); + opCode = spv::OpHitObjectIsEmptyNV; + break; + case glslang::EOpHitObjectIsMissNV: + typeId = builder.makeBoolType(); + opCode = spv::OpHitObjectIsMissNV; + break; + case glslang::EOpHitObjectIsHitNV: + typeId = builder.makeBoolType(); + opCode = spv::OpHitObjectIsHitNV; + break; + case glslang::EOpHitObjectGetRayTMinNV: + typeId = builder.makeFloatType(32); + opCode = spv::OpHitObjectGetRayTMinNV; + break; + case glslang::EOpHitObjectGetRayTMaxNV: + typeId = builder.makeFloatType(32); + opCode = spv::OpHitObjectGetRayTMaxNV; + break; + case glslang::EOpHitObjectGetObjectRayOriginNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetObjectRayOriginNV; + break; + case glslang::EOpHitObjectGetObjectRayDirectionNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetObjectRayDirectionNV; + break; + case glslang::EOpHitObjectGetWorldRayOriginNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetWorldRayOriginNV; + break; + case glslang::EOpHitObjectGetWorldRayDirectionNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetWorldRayDirectionNV; + break; + case glslang::EOpHitObjectGetWorldToObjectNV: + typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3); + opCode = spv::OpHitObjectGetWorldToObjectNV; + break; + case glslang::EOpHitObjectGetObjectToWorldNV: + typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3); + opCode = spv::OpHitObjectGetObjectToWorldNV; + break; + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetInstanceCustomIndexNV; + break; + case glslang::EOpHitObjectGetInstanceIdNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetInstanceIdNV; + break; + case glslang::EOpHitObjectGetGeometryIndexNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetGeometryIndexNV; + break; + case glslang::EOpHitObjectGetPrimitiveIndexNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetPrimitiveIndexNV; + break; + case glslang::EOpHitObjectGetHitKindNV: + typeId = builder.makeIntegerType(32, 0); + opCode = spv::OpHitObjectGetHitKindNV; + break; + case glslang::EOpHitObjectGetCurrentTimeNV: + typeId = builder.makeFloatType(32); + opCode = spv::OpHitObjectGetCurrentTimeNV; + break; + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + typeId = builder.makeIntegerType(32, 0); + opCode = spv::OpHitObjectGetShaderBindingTableRecordIndexNV; + return 0; + case glslang::EOpHitObjectGetAttributesNV: + builder.createNoResultOp(spv::OpHitObjectGetAttributesNV, operands); + return 0; + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + typeId = builder.makeVectorType(builder.makeUintType(32), 2); + opCode = spv::OpHitObjectGetShaderRecordBufferHandleNV; + break; + case glslang::EOpReorderThreadNV: { + if (operands.size() == 2) { + builder.createNoResultOp(spv::OpReorderThreadWithHintNV, operands); + } else { + builder.createNoResultOp(spv::OpReorderThreadWithHitObjectNV, operands); + } + return 0; + + } + + case glslang::EOpImageSampleWeightedQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageSampleWeightedQCOM; + addImageProcessingQCOMDecoration(operands[2], spv::DecorationWeightTextureQCOM); + break; + case glslang::EOpImageBoxFilterQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBoxFilterQCOM; + break; + case glslang::EOpImageBlockMatchSADQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchSADQCOM; + addImageProcessingQCOMDecoration(operands[0], spv::DecorationBlockMatchTextureQCOM); + addImageProcessingQCOMDecoration(operands[2], spv::DecorationBlockMatchTextureQCOM); + break; + case glslang::EOpImageBlockMatchSSDQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchSSDQCOM; + addImageProcessingQCOMDecoration(operands[0], spv::DecorationBlockMatchTextureQCOM); + addImageProcessingQCOMDecoration(operands[2], spv::DecorationBlockMatchTextureQCOM); + break; + + case glslang::EOpFetchMicroTriangleVertexBarycentricNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 2); + opCode = spv::OpFetchMicroTriangleVertexBarycentricNV; + break; + + case glslang::EOpFetchMicroTriangleVertexPositionNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpFetchMicroTriangleVertexPositionNV; + break; + + case glslang::EOpImageBlockMatchWindowSSDQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchWindowSSDQCOM; + addImageProcessing2QCOMDecoration(operands[0], false); + addImageProcessing2QCOMDecoration(operands[2], false); + break; + case glslang::EOpImageBlockMatchWindowSADQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchWindowSADQCOM; + addImageProcessing2QCOMDecoration(operands[0], false); + addImageProcessing2QCOMDecoration(operands[2], false); + break; + case glslang::EOpImageBlockMatchGatherSSDQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchGatherSSDQCOM; + addImageProcessing2QCOMDecoration(operands[0], true); + addImageProcessing2QCOMDecoration(operands[2], true); + break; + case glslang::EOpImageBlockMatchGatherSADQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchGatherSADQCOM; + addImageProcessing2QCOMDecoration(operands[0], true); + addImageProcessing2QCOMDecoration(operands[2], true); + break; default: return 0; } @@ -8482,7 +9385,6 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: } } -#ifndef GLSLANG_WEB // Decode the return types that were structures switch (op) { case glslang::EOpAddCarry: @@ -8512,7 +9414,6 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: default: break; } -#endif return builder.setPrecision(id, precision); } @@ -8557,7 +9458,6 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv: builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsAllMemory | spv::MemorySemanticsAcquireReleaseMask); return 0; -#ifndef GLSLANG_WEB case glslang::EOpMemoryBarrierAtomicCounter: builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAtomicCounterMemoryMask | spv::MemorySemanticsAcquireReleaseMask); @@ -8676,7 +9576,30 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv: builder.addCapability(spv::CapabilityShaderClockKHR); return builder.createOp(spv::OpReadClockKHR, typeId, args); } -#endif + case glslang::EOpStencilAttachmentReadEXT: + case glslang::EOpDepthAttachmentReadEXT: + { + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + + spv::Decoration precision; + spv::Op spv_op; + if (op == glslang::EOpStencilAttachmentReadEXT) + { + precision = spv::DecorationRelaxedPrecision; + spv_op = spv::OpStencilAttachmentReadEXT; + builder.addCapability(spv::CapabilityTileImageStencilReadAccessEXT); + } + else + { + precision = spv::NoPrecision; + spv_op = spv::OpDepthAttachmentReadEXT; + builder.addCapability(spv::CapabilityTileImageDepthReadAccessEXT); + } + + std::vector args; // Dummy args + spv::Id result = builder.createOp(spv_op, typeId, args); + return builder.setPrecision(result, precision); + } default: break; } @@ -8698,7 +9621,32 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol // it was not found, create it spv::BuiltIn builtIn = TranslateBuiltInDecoration(symbol->getQualifier().builtIn, false); auto forcedType = getForcedType(symbol->getQualifier().builtIn, symbol->getType()); + + // There are pairs of symbols that map to the same SPIR-V built-in: + // gl_ObjectToWorldEXT and gl_ObjectToWorld3x4EXT, and gl_WorldToObjectEXT + // and gl_WorldToObject3x4EXT. SPIR-V forbids having two OpVariables + // with the same BuiltIn in the same storage class, so we must re-use one. + const bool mayNeedToReuseBuiltIn = + builtIn == spv::BuiltInObjectToWorldKHR || + builtIn == spv::BuiltInWorldToObjectKHR; + + if (mayNeedToReuseBuiltIn) { + auto iter = builtInVariableIds.find(uint32_t(builtIn)); + if (builtInVariableIds.end() != iter) { + id = iter->second; + symbolValues[symbol->getId()] = id; + if (forcedType.second != spv::NoType) + forceType[id] = forcedType.second; + return id; + } + } + id = createSpvVariable(symbol, forcedType.first); + + if (mayNeedToReuseBuiltIn) { + builtInVariableIds.insert({uint32_t(builtIn), id}); + } + symbolValues[symbol->getId()] = id; if (forcedType.second != spv::NoType) forceType[id] = forcedType.second; @@ -8707,13 +9655,11 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType())); builder.addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier())); builder.addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier())); -#ifndef GLSLANG_WEB addMeshNVDecoration(id, /*member*/ -1, symbol->getType().getQualifier()); if (symbol->getQualifier().hasComponent()) builder.addDecoration(id, spv::DecorationComponent, symbol->getQualifier().layoutComponent); if (symbol->getQualifier().hasIndex()) builder.addDecoration(id, spv::DecorationIndex, symbol->getQualifier().layoutIndex); -#endif if (symbol->getType().getQualifier().hasSpecConstantId()) builder.addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId); // atomic counters use this: @@ -8721,8 +9667,22 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutOffset); } - if (symbol->getQualifier().hasLocation()) - builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation); + if (symbol->getQualifier().hasLocation()) { + if (!(glslangIntermediate->isRayTracingStage() && + (glslangIntermediate->IsRequestedExtension(glslang::E_GL_EXT_ray_tracing) || + glslangIntermediate->IsRequestedExtension(glslang::E_GL_NV_shader_invocation_reorder)) + && (builder.getStorageClass(id) == spv::StorageClassRayPayloadKHR || + builder.getStorageClass(id) == spv::StorageClassIncomingRayPayloadKHR || + builder.getStorageClass(id) == spv::StorageClassCallableDataKHR || + builder.getStorageClass(id) == spv::StorageClassIncomingCallableDataKHR || + builder.getStorageClass(id) == spv::StorageClassHitObjectAttributeNV))) { + // Location values are used to link TraceRayKHR/ExecuteCallableKHR/HitObjectGetAttributesNV + // to corresponding variables but are not valid in SPIRV since they are supported only + // for Input/Output Storage classes. + builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation); + } + } + builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier())); if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) { builder.addCapability(spv::CapabilityGeometryStreams); @@ -8756,10 +9716,19 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol // add built-in variable decoration if (builtIn != spv::BuiltInMax) { - builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn); + // WorkgroupSize deprecated in spirv1.6 + if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_6 || + builtIn != spv::BuiltInWorkgroupSize) + builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn); + } + + // Add volatile decoration to HelperInvocation for spirv1.6 and beyond + if (builtIn == spv::BuiltInHelperInvocation && + !glslangIntermediate->usingVulkanMemoryModel() && + glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) { + builder.addDecoration(id, spv::DecorationVolatile); } -#ifndef GLSLANG_WEB // Subgroup builtins which have input storage class are volatile for ray tracing stages. if (symbol->getType().isImage() || symbol->getQualifier().isPipeInput()) { std::vector memory; @@ -8808,6 +9777,12 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol builder.addExtension(spv::E_SPV_NV_fragment_shader_barycentric); } + if (symbol->getQualifier().pervertexEXT) { + builder.addDecoration(id, spv::DecorationPerVertexKHR); + builder.addCapability(spv::CapabilityFragmentBarycentricKHR); + builder.addExtension(spv::E_SPV_KHR_fragment_shader_barycentric); + } + if (glslangIntermediate->getHlslFunctionality1() && symbol->getType().getQualifier().semanticName != nullptr) { builder.addExtension("SPV_GOOGLE_hlsl_functionality1"); builder.addDecoration(id, (spv::Decoration)spv::DecorationHlslSemanticGOOGLE, @@ -8819,63 +9794,31 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol spv::DecorationRestrictPointerEXT : spv::DecorationAliasedPointerEXT); } - // - // Add SPIR-V decorations for structure (GL_EXT_spirv_intrinsics) - // - if (symbol->getType().getQualifier().hasSprivDecorate()) { - const glslang::TSpirvDecorate& spirvDecorate = symbol->getType().getQualifier().getSpirvDecorate(); - - // Add spirv_decorate - for (auto& decorate : spirvDecorate.decorates) { - if (!decorate.second.empty()) { - std::vector literals; - TranslateLiterals(decorate.second, literals); - builder.addDecoration(id, static_cast(decorate.first), literals); - } - else - builder.addDecoration(id, static_cast(decorate.first)); - } - - // Add spirv_decorate_id - for (auto& decorateId : spirvDecorate.decorateIds) { - std::vector operandIds; - assert(!decorateId.second.empty()); - for (auto extraOperand : decorateId.second) { - int nextConst = 0; - spv::Id operandId = createSpvConstantFromConstUnionArray( - extraOperand->getType(), extraOperand->getConstArray(), nextConst, false); - operandIds.push_back(operandId); - } - builder.addDecoration(id, static_cast(decorateId.first), operandIds); - } - - // Add spirv_decorate_string - for (auto& decorateString : spirvDecorate.decorateStrings) { - std::vector strings; - assert(!decorateString.second.empty()); - for (auto extraOperand : decorateString.second) { - const char* string = extraOperand->getConstArray()[0].getSConst()->c_str(); - strings.push_back(string); - } - builder.addDecoration(id, static_cast(decorateString.first), strings); - } - } -#endif + // Add SPIR-V decorations (GL_EXT_spirv_intrinsics) + if (symbol->getType().getQualifier().hasSpirvDecorate()) + applySpirvDecorate(symbol->getType(), id, {}); return id; } -#ifndef GLSLANG_WEB // add per-primitive, per-view. per-task decorations to a struct member (member >= 0) or an object void TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier& qualifier) { + bool isMeshShaderExt = (glslangIntermediate->getRequestedExtensions().find(glslang::E_GL_EXT_mesh_shader) != + glslangIntermediate->getRequestedExtensions().end()); + if (member >= 0) { if (qualifier.perPrimitiveNV) { // Need to add capability/extension for fragment shader. // Mesh shader already adds this by default. if (glslangIntermediate->getStage() == EShLangFragment) { - builder.addCapability(spv::CapabilityMeshShadingNV); - builder.addExtension(spv::E_SPV_NV_mesh_shader); + if(isMeshShaderExt) { + builder.addCapability(spv::CapabilityMeshShadingEXT); + builder.addExtension(spv::E_SPV_EXT_mesh_shader); + } else { + builder.addCapability(spv::CapabilityMeshShadingNV); + builder.addExtension(spv::E_SPV_NV_mesh_shader); + } } builder.addMemberDecoration(id, (unsigned)member, spv::DecorationPerPrimitiveNV); } @@ -8888,8 +9831,13 @@ void TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const g // Need to add capability/extension for fragment shader. // Mesh shader already adds this by default. if (glslangIntermediate->getStage() == EShLangFragment) { - builder.addCapability(spv::CapabilityMeshShadingNV); - builder.addExtension(spv::E_SPV_NV_mesh_shader); + if(isMeshShaderExt) { + builder.addCapability(spv::CapabilityMeshShadingEXT); + builder.addExtension(spv::E_SPV_EXT_mesh_shader); + } else { + builder.addCapability(spv::CapabilityMeshShadingNV); + builder.addExtension(spv::E_SPV_NV_mesh_shader); + } } builder.addDecoration(id, spv::DecorationPerPrimitiveNV); } @@ -8899,7 +9847,66 @@ void TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const g builder.addDecoration(id, spv::DecorationPerTaskNV); } } -#endif + +bool TGlslangToSpvTraverser::hasQCOMImageProceessingDecoration(spv::Id id, spv::Decoration decor) +{ + std::vector &decoVec = idToQCOMDecorations[id]; + for ( auto d : decoVec ) { + if ( d == decor ) + return true; + } + return false; +} + +void TGlslangToSpvTraverser::addImageProcessingQCOMDecoration(spv::Id id, spv::Decoration decor) +{ + spv::Op opc = builder.getOpCode(id); + if (opc == spv::OpSampledImage) { + id = builder.getIdOperand(id, 0); + opc = builder.getOpCode(id); + } + + if (opc == spv::OpLoad) { + spv::Id texid = builder.getIdOperand(id, 0); + if (!hasQCOMImageProceessingDecoration(texid, decor)) {// + builder.addDecoration(texid, decor); + idToQCOMDecorations[texid].push_back(decor); + } + } +} + +void TGlslangToSpvTraverser::addImageProcessing2QCOMDecoration(spv::Id id, bool isForGather) +{ + if (isForGather) { + return addImageProcessingQCOMDecoration(id, spv::DecorationBlockMatchTextureQCOM); + } + + auto addDecor = + [this](spv::Id id, spv::Decoration decor) { + spv::Id tsopc = this->builder.getOpCode(id); + if (tsopc == spv::OpLoad) { + spv::Id tsid = this->builder.getIdOperand(id, 0); + if (this->glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) { + assert(iOSet.count(tsid) > 0); + } + if (!hasQCOMImageProceessingDecoration(tsid, decor)) { + this->builder.addDecoration(tsid, decor); + idToQCOMDecorations[tsid].push_back(decor); + } + } + }; + + spv::Id opc = builder.getOpCode(id); + bool isInterfaceObject = (opc != spv::OpSampledImage); + + if (!isInterfaceObject) { + addDecor(builder.getIdOperand(id, 0), spv::DecorationBlockMatchTextureQCOM); + addDecor(builder.getIdOperand(id, 1), spv::DecorationBlockMatchSamplerQCOM); + } else { + addDecor(id, spv::DecorationBlockMatchTextureQCOM); + addDecor(id, spv::DecorationBlockMatchSamplerQCOM); + } +} // Make a full tree of instructions to build a SPIR-V specialization constant, // or regular constant if possible. @@ -9027,17 +10034,20 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla case glslang::EbtBool: spvConsts.push_back(builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst())); break; -#ifndef GLSLANG_WEB case glslang::EbtInt8: + builder.addCapability(spv::CapabilityInt8); spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const())); break; case glslang::EbtUint8: + builder.addCapability(spv::CapabilityInt8); spvConsts.push_back(builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const())); break; case glslang::EbtInt16: + builder.addCapability(spv::CapabilityInt16); spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const())); break; case glslang::EbtUint16: + builder.addCapability(spv::CapabilityInt16); spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const())); break; case glslang::EbtInt64: @@ -9050,9 +10060,9 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla spvConsts.push_back(builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst())); break; case glslang::EbtFloat16: + builder.addCapability(spv::CapabilityFloat16); spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst())); break; -#endif default: assert(0); break; @@ -9076,17 +10086,20 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla case glslang::EbtBool: scalar = builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst(), specConstant); break; -#ifndef GLSLANG_WEB case glslang::EbtInt8: + builder.addCapability(spv::CapabilityInt8); scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant); break; case glslang::EbtUint8: + builder.addCapability(spv::CapabilityInt8); scalar = builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const(), specConstant); break; case glslang::EbtInt16: + builder.addCapability(spv::CapabilityInt16); scalar = builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const(), specConstant); break; case glslang::EbtUint16: + builder.addCapability(spv::CapabilityInt16); scalar = builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const(), specConstant); break; case glslang::EbtInt64: @@ -9099,13 +10112,13 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla scalar = builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst(), specConstant); break; case glslang::EbtFloat16: + builder.addCapability(spv::CapabilityFloat16); scalar = builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant); break; case glslang::EbtReference: scalar = builder.makeUint64Constant(zero ? 0 : consts[nextConst].getU64Const(), specConstant); scalar = builder.createUnaryOp(spv::OpBitcast, typeId, scalar); break; -#endif case glslang::EbtString: scalar = builder.getStringId(consts[nextConst].getSConst()->c_str()); break; @@ -9221,6 +10234,7 @@ spv::Id TGlslangToSpvTraverser::createShortCircuit(glslang::TOperator op, glslan // Operands to accumulate OpPhi operands std::vector phiOperands; + phiOperands.reserve(4); // accumulate left operand's phi information phiOperands.push_back(leftId); phiOperands.push_back(builder.getBuildPoint()->getId()); @@ -9253,7 +10267,6 @@ spv::Id TGlslangToSpvTraverser::createShortCircuit(glslang::TOperator op, glslan return builder.createOp(spv::OpPhi, boolTypeId, phiOperands); } -#ifndef GLSLANG_WEB // Return type Id of the imported set of extended instructions corresponds to the name. // Import this set if it has not been imported yet. spv::Id TGlslangToSpvTraverser::getExtBuiltins(const char* name) @@ -9261,13 +10274,11 @@ spv::Id TGlslangToSpvTraverser::getExtBuiltins(const char* name) if (extBuiltinMap.find(name) != extBuiltinMap.end()) return extBuiltinMap[name]; else { - builder.addExtension(name); spv::Id extBuiltins = builder.import(name); extBuiltinMap[name] = extBuiltins; return extBuiltins; } } -#endif }; // end anonymous namespace @@ -9296,31 +10307,36 @@ int GetSpirvGeneratorVersion() // return 7; // GLSL volatile keyword maps to both SPIR-V decorations Volatile and Coherent // return 8; // switch to new dead block eliminator; use OpUnreachable // return 9; // don't include opaque function parameters in OpEntryPoint global's operand list - return 10; // Generate OpFUnordNotEqual for != comparisons + // return 10; // Generate OpFUnordNotEqual for != comparisons + return 11; // Make OpEmitMeshTasksEXT a terminal instruction } // Write SPIR-V out to a binary file -void OutputSpvBin(const std::vector& spirv, const char* baseName) +bool OutputSpvBin(const std::vector& spirv, const char* baseName) { std::ofstream out; out.open(baseName, std::ios::binary | std::ios::out); - if (out.fail()) + if (out.fail()) { printf("ERROR: Failed to open file: %s\n", baseName); + return false; + } for (int i = 0; i < (int)spirv.size(); ++i) { unsigned int word = spirv[i]; out.write((const char*)&word, 4); } out.close(); + return true; } // Write SPIR-V out to a text file with 32-bit hexadecimal words -void OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName) +bool OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) std::ofstream out; out.open(baseName, std::ios::binary | std::ios::out); - if (out.fail()) + if (out.fail()) { printf("ERROR: Failed to open file: %s\n", baseName); + return false; + } out << "\t// " << GetSpirvGeneratorVersion() << GLSLANG_VERSION_MAJOR << "." << GLSLANG_VERSION_MINOR << "." << GLSLANG_VERSION_PATCH << @@ -9346,7 +10362,7 @@ void OutputSpvHex(const std::vector& spirv, const char* baseName, out << std::endl; } out.close(); -#endif + return true; } // @@ -9363,7 +10379,7 @@ void GlslangToSpv(const TIntermediate& intermediate, std::vector& { TIntermNode* root = intermediate.getTreeRoot(); - if (root == 0) + if (root == nullptr) return; SpvOptions defaultOptions; @@ -9374,7 +10390,7 @@ void GlslangToSpv(const TIntermediate& intermediate, std::vector& TGlslangToSpvTraverser it(intermediate.getSpv().spv, &intermediate, logger, *options); root->traverse(&it); - it.finishSpv(); + it.finishSpv(options->compileOnly); it.dumpSpv(spirv); #if ENABLE_OPT diff --git a/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.h b/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.h index 86e1c23bf..1b9ef3c51 100644 --- a/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.h +++ b/libraries/ZVulkan/src/glslang/spirv/GlslangToSpv.h @@ -35,19 +35,25 @@ #pragma once -#if defined(_MSC_VER) && _MSC_VER >= 1900 - #pragma warning(disable : 4464) // relative include path contains '..' -#endif - -#include "SpvTools.h" -#include "../glslang/Include/intermediate.h" - #include #include #include "Logger.h" namespace glslang { +class TIntermediate; + +struct SpvOptions { + bool generateDebugInfo {false}; + bool stripDebugInfo {false}; + bool disableOptimizer {true}; + bool optimizeSize {false}; + bool disassemble {false}; + bool validate {false}; + bool emitNonSemanticShaderDebugInfo {false}; + bool emitNonSemanticShaderDebugSource{ false }; + bool compileOnly{false}; +}; void GetSpirvVersion(std::string&); int GetSpirvGeneratorVersion(); @@ -55,7 +61,7 @@ void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector& spirv, spv::SpvBuildLogger* logger, SpvOptions* options = nullptr); -void OutputSpvBin(const std::vector& spirv, const char* baseName); -void OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName); +bool OutputSpvBin(const std::vector& spirv, const char* baseName); +bool OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName); } diff --git a/libraries/ZVulkan/src/glslang/spirv/Logger.cpp b/libraries/ZVulkan/src/glslang/spirv/Logger.cpp index cdc8469c4..48bd4e3ad 100644 --- a/libraries/ZVulkan/src/glslang/spirv/Logger.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/Logger.cpp @@ -32,8 +32,6 @@ // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -#ifndef GLSLANG_WEB - #include "Logger.h" #include @@ -68,5 +66,3 @@ std::string SpvBuildLogger::getAllMessages() const { } } // end spv namespace - -#endif diff --git a/libraries/ZVulkan/src/glslang/spirv/Logger.h b/libraries/ZVulkan/src/glslang/spirv/Logger.h index 411367c03..2e4ddaf51 100644 --- a/libraries/ZVulkan/src/glslang/spirv/Logger.h +++ b/libraries/ZVulkan/src/glslang/spirv/Logger.h @@ -46,14 +46,6 @@ class SpvBuildLogger { public: SpvBuildLogger() {} -#ifdef GLSLANG_WEB - void tbdFunctionality(const std::string& f) { } - void missingFunctionality(const std::string& f) { } - void warning(const std::string& w) { } - void error(const std::string& e) { errors.push_back(e); } - std::string getAllMessages() { return ""; } -#else - // Registers a TBD functionality. void tbdFunctionality(const std::string& f); // Registers a missing functionality. @@ -67,7 +59,6 @@ public: // Returns all messages accumulated in the order of: // TBD functionalities, missing functionalities, warnings, errors. std::string getAllMessages() const; -#endif private: SpvBuildLogger(const SpvBuildLogger&); diff --git a/libraries/ZVulkan/src/glslang/spirv/NonSemanticDebugPrintf.h b/libraries/ZVulkan/src/glslang/spirv/NonSemanticDebugPrintf.h index 83796d75e..3ca7247f2 100644 --- a/libraries/ZVulkan/src/glslang/spirv/NonSemanticDebugPrintf.h +++ b/libraries/ZVulkan/src/glslang/spirv/NonSemanticDebugPrintf.h @@ -1,5 +1,5 @@ // Copyright (c) 2020 The Khronos Group Inc. -// +// // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and/or associated documentation files (the // "Materials"), to deal in the Materials without restriction, including @@ -7,15 +7,15 @@ // distribute, sublicense, and/or sell copies of the Materials, and to // permit persons to whom the Materials are furnished to do so, subject to // the following conditions: -// +// // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Materials. -// +// // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS // KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS // SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT // https://www.khronos.org/registry/ -// +// // THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -23,7 +23,7 @@ // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -// +// #ifndef SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_ #define SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_ diff --git a/libraries/ZVulkan/src/glslang/spirv/NonSemanticShaderDebugInfo100.h b/libraries/ZVulkan/src/glslang/spirv/NonSemanticShaderDebugInfo100.h new file mode 100644 index 000000000..f74abcb64 --- /dev/null +++ b/libraries/ZVulkan/src/glslang/spirv/NonSemanticShaderDebugInfo100.h @@ -0,0 +1,171 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and/or associated documentation files (the "Materials"), +// to deal in the Materials without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Materials, and to permit persons to whom the +// Materials are furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +// IN THE MATERIALS. + +#ifndef SPIRV_UNIFIED1_NonSemanticShaderDebugInfo100_H_ +#define SPIRV_UNIFIED1_NonSemanticShaderDebugInfo100_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + NonSemanticShaderDebugInfo100Version = 100, + NonSemanticShaderDebugInfo100Version_BitWidthPadding = 0x7fffffff +}; +enum { + NonSemanticShaderDebugInfo100Revision = 6, + NonSemanticShaderDebugInfo100Revision_BitWidthPadding = 0x7fffffff +}; + +enum NonSemanticShaderDebugInfo100Instructions { + NonSemanticShaderDebugInfo100DebugInfoNone = 0, + NonSemanticShaderDebugInfo100DebugCompilationUnit = 1, + NonSemanticShaderDebugInfo100DebugTypeBasic = 2, + NonSemanticShaderDebugInfo100DebugTypePointer = 3, + NonSemanticShaderDebugInfo100DebugTypeQualifier = 4, + NonSemanticShaderDebugInfo100DebugTypeArray = 5, + NonSemanticShaderDebugInfo100DebugTypeVector = 6, + NonSemanticShaderDebugInfo100DebugTypedef = 7, + NonSemanticShaderDebugInfo100DebugTypeFunction = 8, + NonSemanticShaderDebugInfo100DebugTypeEnum = 9, + NonSemanticShaderDebugInfo100DebugTypeComposite = 10, + NonSemanticShaderDebugInfo100DebugTypeMember = 11, + NonSemanticShaderDebugInfo100DebugTypeInheritance = 12, + NonSemanticShaderDebugInfo100DebugTypePtrToMember = 13, + NonSemanticShaderDebugInfo100DebugTypeTemplate = 14, + NonSemanticShaderDebugInfo100DebugTypeTemplateParameter = 15, + NonSemanticShaderDebugInfo100DebugTypeTemplateTemplateParameter = 16, + NonSemanticShaderDebugInfo100DebugTypeTemplateParameterPack = 17, + NonSemanticShaderDebugInfo100DebugGlobalVariable = 18, + NonSemanticShaderDebugInfo100DebugFunctionDeclaration = 19, + NonSemanticShaderDebugInfo100DebugFunction = 20, + NonSemanticShaderDebugInfo100DebugLexicalBlock = 21, + NonSemanticShaderDebugInfo100DebugLexicalBlockDiscriminator = 22, + NonSemanticShaderDebugInfo100DebugScope = 23, + NonSemanticShaderDebugInfo100DebugNoScope = 24, + NonSemanticShaderDebugInfo100DebugInlinedAt = 25, + NonSemanticShaderDebugInfo100DebugLocalVariable = 26, + NonSemanticShaderDebugInfo100DebugInlinedVariable = 27, + NonSemanticShaderDebugInfo100DebugDeclare = 28, + NonSemanticShaderDebugInfo100DebugValue = 29, + NonSemanticShaderDebugInfo100DebugOperation = 30, + NonSemanticShaderDebugInfo100DebugExpression = 31, + NonSemanticShaderDebugInfo100DebugMacroDef = 32, + NonSemanticShaderDebugInfo100DebugMacroUndef = 33, + NonSemanticShaderDebugInfo100DebugImportedEntity = 34, + NonSemanticShaderDebugInfo100DebugSource = 35, + NonSemanticShaderDebugInfo100DebugFunctionDefinition = 101, + NonSemanticShaderDebugInfo100DebugSourceContinued = 102, + NonSemanticShaderDebugInfo100DebugLine = 103, + NonSemanticShaderDebugInfo100DebugNoLine = 104, + NonSemanticShaderDebugInfo100DebugBuildIdentifier = 105, + NonSemanticShaderDebugInfo100DebugStoragePath = 106, + NonSemanticShaderDebugInfo100DebugEntryPoint = 107, + NonSemanticShaderDebugInfo100DebugTypeMatrix = 108, + NonSemanticShaderDebugInfo100InstructionsMax = 0x7fffffff +}; + + +enum NonSemanticShaderDebugInfo100DebugInfoFlags { + NonSemanticShaderDebugInfo100None = 0x0000, + NonSemanticShaderDebugInfo100FlagIsProtected = 0x01, + NonSemanticShaderDebugInfo100FlagIsPrivate = 0x02, + NonSemanticShaderDebugInfo100FlagIsPublic = 0x03, + NonSemanticShaderDebugInfo100FlagIsLocal = 0x04, + NonSemanticShaderDebugInfo100FlagIsDefinition = 0x08, + NonSemanticShaderDebugInfo100FlagFwdDecl = 0x10, + NonSemanticShaderDebugInfo100FlagArtificial = 0x20, + NonSemanticShaderDebugInfo100FlagExplicit = 0x40, + NonSemanticShaderDebugInfo100FlagPrototyped = 0x80, + NonSemanticShaderDebugInfo100FlagObjectPointer = 0x100, + NonSemanticShaderDebugInfo100FlagStaticMember = 0x200, + NonSemanticShaderDebugInfo100FlagIndirectVariable = 0x400, + NonSemanticShaderDebugInfo100FlagLValueReference = 0x800, + NonSemanticShaderDebugInfo100FlagRValueReference = 0x1000, + NonSemanticShaderDebugInfo100FlagIsOptimized = 0x2000, + NonSemanticShaderDebugInfo100FlagIsEnumClass = 0x4000, + NonSemanticShaderDebugInfo100FlagTypePassByValue = 0x8000, + NonSemanticShaderDebugInfo100FlagTypePassByReference = 0x10000, + NonSemanticShaderDebugInfo100FlagUnknownPhysicalLayout = 0x20000, + NonSemanticShaderDebugInfo100DebugInfoFlagsMax = 0x7fffffff +}; + +enum NonSemanticShaderDebugInfo100BuildIdentifierFlags { + NonSemanticShaderDebugInfo100IdentifierPossibleDuplicates = 0x01, + NonSemanticShaderDebugInfo100BuildIdentifierFlagsMax = 0x7fffffff +}; + +enum NonSemanticShaderDebugInfo100DebugBaseTypeAttributeEncoding { + NonSemanticShaderDebugInfo100Unspecified = 0, + NonSemanticShaderDebugInfo100Address = 1, + NonSemanticShaderDebugInfo100Boolean = 2, + NonSemanticShaderDebugInfo100Float = 3, + NonSemanticShaderDebugInfo100Signed = 4, + NonSemanticShaderDebugInfo100SignedChar = 5, + NonSemanticShaderDebugInfo100Unsigned = 6, + NonSemanticShaderDebugInfo100UnsignedChar = 7, + NonSemanticShaderDebugInfo100DebugBaseTypeAttributeEncodingMax = 0x7fffffff +}; + +enum NonSemanticShaderDebugInfo100DebugCompositeType { + NonSemanticShaderDebugInfo100Class = 0, + NonSemanticShaderDebugInfo100Structure = 1, + NonSemanticShaderDebugInfo100Union = 2, + NonSemanticShaderDebugInfo100DebugCompositeTypeMax = 0x7fffffff +}; + +enum NonSemanticShaderDebugInfo100DebugTypeQualifier { + NonSemanticShaderDebugInfo100ConstType = 0, + NonSemanticShaderDebugInfo100VolatileType = 1, + NonSemanticShaderDebugInfo100RestrictType = 2, + NonSemanticShaderDebugInfo100AtomicType = 3, + NonSemanticShaderDebugInfo100DebugTypeQualifierMax = 0x7fffffff +}; + +enum NonSemanticShaderDebugInfo100DebugOperation { + NonSemanticShaderDebugInfo100Deref = 0, + NonSemanticShaderDebugInfo100Plus = 1, + NonSemanticShaderDebugInfo100Minus = 2, + NonSemanticShaderDebugInfo100PlusUconst = 3, + NonSemanticShaderDebugInfo100BitPiece = 4, + NonSemanticShaderDebugInfo100Swap = 5, + NonSemanticShaderDebugInfo100Xderef = 6, + NonSemanticShaderDebugInfo100StackValue = 7, + NonSemanticShaderDebugInfo100Constu = 8, + NonSemanticShaderDebugInfo100Fragment = 9, + NonSemanticShaderDebugInfo100DebugOperationMax = 0x7fffffff +}; + +enum NonSemanticShaderDebugInfo100DebugImportedEntity { + NonSemanticShaderDebugInfo100ImportedModule = 0, + NonSemanticShaderDebugInfo100ImportedDeclaration = 1, + NonSemanticShaderDebugInfo100DebugImportedEntityMax = 0x7fffffff +}; + + +#ifdef __cplusplus +} +#endif + +#endif // SPIRV_UNIFIED1_NonSemanticShaderDebugInfo100_H_ diff --git a/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.cpp b/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.cpp index 56d6d5d4a..f8f50a951 100644 --- a/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.cpp @@ -36,10 +36,6 @@ #include "SPVRemapper.h" #include "doc.h" -#if !defined (use_cpp11) -// ... not supported before C++11 -#else // defined (use_cpp11) - #include #include #include "../glslang/Include/Common.h" @@ -160,15 +156,29 @@ namespace spv { } // Is this an opcode we should remove when using --strip? - bool spirvbin_t::isStripOp(spv::Op opCode) const + bool spirvbin_t::isStripOp(spv::Op opCode, unsigned start) const { switch (opCode) { case spv::OpSource: case spv::OpSourceExtension: case spv::OpName: case spv::OpMemberName: - case spv::OpLine: return true; - default: return false; + case spv::OpLine : + { + const std::string name = literalString(start + 2); + + std::vector::const_iterator it; + for (it = stripWhiteList.begin(); it < stripWhiteList.end(); it++) + { + if (name.find(*it) != std::string::npos) { + return false; + } + } + + return true; + } + default : + return false; } } @@ -297,15 +307,21 @@ namespace spv { std::string spirvbin_t::literalString(unsigned word) const { std::string literal; + const spirword_t * pos = spv.data() + word; literal.reserve(16); - const char* bytes = reinterpret_cast(spv.data() + word); - - while (bytes && *bytes) - literal += *bytes++; - - return literal; + do { + spirword_t word = *pos; + for (int i = 0; i < 4; i++) { + char c = word & 0xff; + if (c == '\0') + return literal; + literal += c; + word >>= 8; + } + pos++; + } while (true); } void spirvbin_t::applyMap() @@ -366,7 +382,7 @@ namespace spv { process( [&](spv::Op opCode, unsigned start) { // remember opcodes we want to strip later - if (isStripOp(opCode)) + if (isStripOp(opCode, start)) stripInst(start); return true; }, @@ -664,6 +680,7 @@ namespace spv { case spv::OperandKernelEnqueueFlags: case spv::OperandKernelProfilingInfo: case spv::OperandCapability: + case spv::OperandCooperativeMatrixOperands: ++word; break; @@ -1488,14 +1505,23 @@ namespace spv { } // remap from a memory image - void spirvbin_t::remap(std::vector& in_spv, std::uint32_t opts) + void spirvbin_t::remap(std::vector& in_spv, const std::vector& whiteListStrings, + std::uint32_t opts) { + stripWhiteList = whiteListStrings; spv.swap(in_spv); remap(opts); spv.swap(in_spv); } + // remap from a memory image - legacy interface without white list + void spirvbin_t::remap(std::vector& in_spv, std::uint32_t opts) + { + stripWhiteList.clear(); + spv.swap(in_spv); + remap(opts); + spv.swap(in_spv); + } + } // namespace SPV -#endif // defined (use_cpp11) - diff --git a/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.h b/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.h index d6b9c346d..33efe331e 100644 --- a/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.h +++ b/libraries/ZVulkan/src/glslang/spirv/SPVRemapper.h @@ -43,12 +43,6 @@ namespace spv { -// MSVC defines __cplusplus as an older value, even when it supports almost all of 11. -// We handle that here by making our own symbol. -#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700) -# define use_cpp11 1 -#endif - class spirvbin_base_t { public: @@ -74,27 +68,6 @@ public: } // namespace SPV -#if !defined (use_cpp11) -#include -#include - -namespace spv { -class spirvbin_t : public spirvbin_base_t -{ -public: - spirvbin_t(int /*verbose = 0*/) { } - - void remap(std::vector& /*spv*/, unsigned int /*opts = 0*/) - { - printf("Tool not compiled for C++11, which is required for SPIR-V remapping.\n"); - exit(5); - } -}; - -} // namespace SPV - -#else // defined (use_cpp11) - #include #include #include @@ -104,9 +77,9 @@ public: #include #include "spirv.hpp" -#include "spvIR.h" namespace spv { +const Id NoResult = 0; // class to hold SPIR-V binary data for remapping, DCE, and debug stripping class spirvbin_t : public spirvbin_base_t @@ -118,6 +91,10 @@ public: virtual ~spirvbin_t() { } // remap on an existing binary in memory + void remap(std::vector& spv, const std::vector& whiteListStrings, + std::uint32_t opts = DO_EVERYTHING); + + // remap on an existing binary in memory - legacy interface without white list void remap(std::vector& spv, std::uint32_t opts = DO_EVERYTHING); // Type for error/log handler functions @@ -180,6 +157,8 @@ private: unsigned typeSizeInWords(spv::Id id) const; unsigned idTypeSizeInWords(spv::Id id) const; + bool isStripOp(spv::Op opCode, unsigned start) const; + spv::Id& asId(unsigned word) { return spv[word]; } const spv::Id& asId(unsigned word) const { return spv[word]; } spv::Op asOpCode(unsigned word) const { return opOpCode(spv[word]); } @@ -249,6 +228,8 @@ private: std::vector spv; // SPIR words + std::vector stripWhiteList; + namemap_t nameMap; // ID names from OpName // Since we want to also do binary ops, we can't use std::vector. we could use @@ -300,5 +281,4 @@ private: } // namespace SPV -#endif // defined (use_cpp11) #endif // SPIRVREMAPPER_H diff --git a/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.cpp b/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.cpp index e83306ebc..d5c037049 100644 --- a/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.cpp @@ -46,10 +46,7 @@ #include #include "SpvBuilder.h" - -#ifndef GLSLANG_WEB #include "hex_float.h" -#endif #ifndef _WIN32 #include @@ -59,18 +56,14 @@ namespace spv { Builder::Builder(unsigned int spvVersion, unsigned int magicNumber, SpvBuildLogger* buildLogger) : spvVersion(spvVersion), - source(SourceLanguageUnknown), + sourceLang(SourceLanguageUnknown), sourceVersion(0), - sourceFileStringId(NoResult), - currentLine(0), - currentFile(nullptr), - emitOpLines(false), addressModel(AddressingModelLogical), memoryModel(MemoryModelGLSL450), builderNumber(magicNumber), - buildPoint(0), + buildPoint(nullptr), uniqueId(0), - entryPointFunction(0), + entryPointFunction(nullptr), generatingOpCodeForSpecConst(false), logger(buildLogger) { @@ -91,56 +84,19 @@ Id Builder::import(const char* name) return import->getResultId(); } -// Emit instruction for non-filename-based #line directives (ie. no filename -// seen yet): emit an OpLine if we've been asked to emit OpLines and the line -// number has changed since the last time, and is a valid line number. -void Builder::setLine(int lineNum) -{ - if (lineNum != 0 && lineNum != currentLine) { - currentLine = lineNum; - if (emitOpLines) - addLine(sourceFileStringId, currentLine, 0); - } -} - -// If no filename, do non-filename-based #line emit. Else do filename-based emit. -// Emit OpLine if we've been asked to emit OpLines and the line number or filename -// has changed since the last time, and line number is valid. -void Builder::setLine(int lineNum, const char* filename) -{ - if (filename == nullptr) { - setLine(lineNum); - return; - } - if ((lineNum != 0 && lineNum != currentLine) || currentFile == nullptr || - strncmp(filename, currentFile, strlen(currentFile) + 1) != 0) { - currentLine = lineNum; - currentFile = filename; - if (emitOpLines) { - spv::Id strId = getStringId(filename); - addLine(strId, currentLine, 0); - } - } -} - -void Builder::addLine(Id fileName, int lineNum, int column) -{ - Instruction* line = new Instruction(OpLine); - line->addIdOperand(fileName); - line->addImmediateOperand(lineNum); - line->addImmediateOperand(column); - buildPoint->addInstruction(std::unique_ptr(line)); -} - // For creating new groupedTypes (will return old type if the requested one was already made). Id Builder::makeVoidType() { Instruction* type; if (groupedTypes[OpTypeVoid].size() == 0) { - type = new Instruction(getUniqueId(), NoType, OpTypeVoid); + Id typeId = getUniqueId(); + type = new Instruction(typeId, NoType, OpTypeVoid); groupedTypes[OpTypeVoid].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + // Core OpTypeVoid used for debug void type + if (emitNonSemanticShaderDebugInfo) + debugId[typeId] = typeId; } else type = groupedTypes[OpTypeVoid].back(); @@ -155,9 +111,16 @@ Id Builder::makeBoolType() groupedTypes[OpTypeBool].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + + if (emitNonSemanticShaderDebugInfo) { + auto const debugResultId = makeBoolDebugType(32); + debugId[type->getResultId()] = debugResultId; + } + } else type = groupedTypes[OpTypeBool].back(); + return type->getResultId(); } @@ -172,6 +135,12 @@ Id Builder::makeSamplerType() } else type = groupedTypes[OpTypeSampler].back(); + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeCompositeDebugType({}, "type.sampler", NonSemanticShaderDebugInfo100Structure, true); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } @@ -188,12 +157,18 @@ Id Builder::makePointer(StorageClass storageClass, Id pointee) // not found, make it type = new Instruction(getUniqueId(), NoType, OpTypePointer); + type->reserveOperands(2); type->addImmediateOperand(storageClass); type->addIdOperand(pointee); groupedTypes[OpTypePointer].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) { + const Id debugResultId = makePointerDebugType(storageClass, pointee); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } @@ -207,6 +182,10 @@ Id Builder::makeForwardPointer(StorageClass storageClass) constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) { + const Id debugResultId = makeForwardPointerDebugType(storageClass); + debugId[type->getResultId()] = debugResultId; + } return type->getResultId(); } @@ -222,22 +201,27 @@ Id Builder::makePointerFromForwardPointer(StorageClass storageClass, Id forwardP } type = new Instruction(forwardPointerType, NoType, OpTypePointer); + type->reserveOperands(2); type->addImmediateOperand(storageClass); type->addIdOperand(pointee); groupedTypes[OpTypePointer].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + // If we are emitting nonsemantic debuginfo, we need to patch the debug pointer type + // that was emitted alongside the forward pointer, now that we have a pointee debug + // type for it to point to. + if (emitNonSemanticShaderDebugInfo) { + Instruction *debugForwardPointer = module.getInstruction(debugId[forwardPointerType]); + assert(debugId[pointee]); + debugForwardPointer->setIdOperand(2, debugId[pointee]); + } + return type->getResultId(); } Id Builder::makeIntegerType(int width, bool hasSign) { -#ifdef GLSLANG_WEB - assert(width == 32); - width = 32; -#endif - // try to find it Instruction* type; for (int t = 0; t < (int)groupedTypes[OpTypeInt].size(); ++t) { @@ -249,6 +233,7 @@ Id Builder::makeIntegerType(int width, bool hasSign) // not found, make it type = new Instruction(getUniqueId(), NoType, OpTypeInt); + type->reserveOperands(2); type->addImmediateOperand(width); type->addImmediateOperand(hasSign ? 1 : 0); groupedTypes[OpTypeInt].push_back(type); @@ -268,16 +253,17 @@ Id Builder::makeIntegerType(int width, bool hasSign) break; } + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeIntegerDebugType(width, hasSign); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } Id Builder::makeFloatType(int width) { -#ifdef GLSLANG_WEB - assert(width == 32); - width = 32; -#endif - // try to find it Instruction* type; for (int t = 0; t < (int)groupedTypes[OpTypeFloat].size(); ++t) { @@ -305,6 +291,12 @@ Id Builder::makeFloatType(int width) break; } + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeFloatDebugType(width); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } @@ -312,7 +304,7 @@ Id Builder::makeFloatType(int width) // See makeStructResultType() for non-decorated structs // needed as the result of some instructions, which does // check for duplicates. -Id Builder::makeStructType(const std::vector& members, const char* name) +Id Builder::makeStructType(const std::vector& members, const char* name, bool const compilerGenerated) { // Don't look for previous one, because in the general case, // structs can be duplicated except for decorations. @@ -326,6 +318,12 @@ Id Builder::makeStructType(const std::vector& members, const char* name) module.mapInstruction(type); addName(type->getResultId(), name); + if (emitNonSemanticShaderDebugInfo && !compilerGenerated) + { + auto const debugResultId = makeCompositeDebugType(members, name, NonSemanticShaderDebugInfo100Structure); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } @@ -366,12 +364,19 @@ Id Builder::makeVectorType(Id component, int size) // not found, make it type = new Instruction(getUniqueId(), NoType, OpTypeVector); + type->reserveOperands(2); type->addIdOperand(component); type->addImmediateOperand(size); groupedTypes[OpTypeVector].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeVectorDebugType(component, size); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } @@ -392,30 +397,65 @@ Id Builder::makeMatrixType(Id component, int cols, int rows) // not found, make it type = new Instruction(getUniqueId(), NoType, OpTypeMatrix); + type->reserveOperands(2); type->addIdOperand(column); type->addImmediateOperand(cols); groupedTypes[OpTypeMatrix].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeMatrixDebugType(column, cols); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } -Id Builder::makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols) +Id Builder::makeCooperativeMatrixTypeKHR(Id component, Id scope, Id rows, Id cols, Id use) +{ + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedTypes[OpTypeCooperativeMatrixKHR].size(); ++t) { + type = groupedTypes[OpTypeCooperativeMatrixKHR][t]; + if (type->getIdOperand(0) == component && + type->getIdOperand(1) == scope && + type->getIdOperand(2) == rows && + type->getIdOperand(3) == cols && + type->getIdOperand(4) == use) + return type->getResultId(); + } + + // not found, make it + type = new Instruction(getUniqueId(), NoType, OpTypeCooperativeMatrixKHR); + type->reserveOperands(5); + type->addIdOperand(component); + type->addIdOperand(scope); + type->addIdOperand(rows); + type->addIdOperand(cols); + type->addIdOperand(use); + groupedTypes[OpTypeCooperativeMatrixKHR].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeCooperativeMatrixTypeNV(Id component, Id scope, Id rows, Id cols) { // try to find it Instruction* type; for (int t = 0; t < (int)groupedTypes[OpTypeCooperativeMatrixNV].size(); ++t) { type = groupedTypes[OpTypeCooperativeMatrixNV][t]; - if (type->getIdOperand(0) == component && - type->getIdOperand(1) == scope && - type->getIdOperand(2) == rows && + if (type->getIdOperand(0) == component && type->getIdOperand(1) == scope && type->getIdOperand(2) == rows && type->getIdOperand(3) == cols) return type->getResultId(); } // not found, make it type = new Instruction(getUniqueId(), NoType, OpTypeCooperativeMatrixNV); + type->reserveOperands(4); type->addIdOperand(component); type->addIdOperand(scope); type->addIdOperand(rows); @@ -427,6 +467,49 @@ Id Builder::makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols) return type->getResultId(); } +Id Builder::makeCooperativeMatrixTypeWithSameShape(Id component, Id otherType) +{ + Instruction* instr = module.getInstruction(otherType); + if (instr->getOpCode() == OpTypeCooperativeMatrixNV) { + return makeCooperativeMatrixTypeNV(component, instr->getIdOperand(1), instr->getIdOperand(2), instr->getIdOperand(3)); + } else { + assert(instr->getOpCode() == OpTypeCooperativeMatrixKHR); + return makeCooperativeMatrixTypeKHR(component, instr->getIdOperand(1), instr->getIdOperand(2), instr->getIdOperand(3), instr->getIdOperand(4)); + } +} + +Id Builder::makeGenericType(spv::Op opcode, std::vector& operands) +{ + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedTypes[opcode].size(); ++t) { + type = groupedTypes[opcode][t]; + if (static_cast(type->getNumOperands()) != operands.size()) + continue; // Number mismatch, find next + + bool match = true; + for (int op = 0; match && op < (int)operands.size(); ++op) { + match = (operands[op].isId ? type->getIdOperand(op) : type->getImmediateOperand(op)) == operands[op].word; + } + if (match) + return type->getResultId(); + } + + // not found, make it + type = new Instruction(getUniqueId(), NoType, opcode); + type->reserveOperands(operands.size()); + for (size_t op = 0; op < operands.size(); ++op) { + if (operands[op].isId) + type->addIdOperand(operands[op].word); + else + type->addImmediateOperand(operands[op].word); + } + groupedTypes[opcode].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} // TODO: performance: track arrays per stride // If a stride is supplied (non-zero) make an array. @@ -447,12 +530,19 @@ Id Builder::makeArrayType(Id element, Id sizeId, int stride) // not found, make it type = new Instruction(getUniqueId(), NoType, OpTypeArray); + type->reserveOperands(2); type->addIdOperand(element); type->addIdOperand(sizeId); groupedTypes[OpTypeArray].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeArrayDebugType(element, sizeId); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } @@ -463,6 +553,12 @@ Id Builder::makeRuntimeArray(Id element) constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeArrayDebugType(element, makeUintConstant(0)); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } @@ -482,11 +578,26 @@ Id Builder::makeFunctionType(Id returnType, const std::vector& paramTypes) } } if (! mismatch) + { + // If compiling HLSL, glslang will create a wrapper function around the entrypoint. Accordingly, a void(void) + // function type is created for the wrapper function. However, nonsemantic shader debug information is disabled + // while creating the HLSL wrapper. Consequently, if we encounter another void(void) function, we need to create + // the associated debug function type if it hasn't been created yet. + if(emitNonSemanticShaderDebugInfo && debugId[type->getResultId()] == 0) { + assert(sourceLang == spv::SourceLanguageHLSL); + assert(getTypeClass(returnType) == OpTypeVoid && paramTypes.size() == 0); + + Id debugTypeId = makeDebugFunctionType(returnType, {}); + debugId[type->getResultId()] = debugTypeId; + } return type->getResultId(); + } } // not found, make it - type = new Instruction(getUniqueId(), NoType, OpTypeFunction); + Id typeId = getUniqueId(); + type = new Instruction(typeId, NoType, OpTypeFunction); + type->reserveOperands(paramTypes.size() + 1); type->addIdOperand(returnType); for (int p = 0; p < (int)paramTypes.size(); ++p) type->addIdOperand(paramTypes[p]); @@ -494,9 +605,39 @@ Id Builder::makeFunctionType(Id returnType, const std::vector& paramTypes) constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + // make debug type and map it + if (emitNonSemanticShaderDebugInfo) { + Id debugTypeId = makeDebugFunctionType(returnType, paramTypes); + debugId[typeId] = debugTypeId; + } + return type->getResultId(); } +Id Builder::makeDebugFunctionType(Id returnType, const std::vector& paramTypes) +{ + assert(debugId[returnType] != 0); + + Id typeId = getUniqueId(); + auto type = new Instruction(typeId, makeVoidType(), OpExtInst); + type->reserveOperands(paramTypes.size() + 4); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeFunction); + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic)); + type->addIdOperand(debugId[returnType]); + for (auto const paramType : paramTypes) { + if (isPointerType(paramType) || isArrayType(paramType)) { + type->addIdOperand(debugId[getContainedTypeId(paramType)]); + } + else { + type->addIdOperand(debugId[paramType]); + } + } + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + return typeId; +} + Id Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format) { @@ -518,6 +659,7 @@ Id Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, boo // not found, make it type = new Instruction(getUniqueId(), NoType, OpTypeImage); + type->reserveOperands(7); type->addIdOperand(sampledType); type->addImmediateOperand( dim); type->addImmediateOperand( depth ? 1 : 0); @@ -530,7 +672,6 @@ Id Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, boo constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); -#ifndef GLSLANG_WEB // deal with capabilities switch (dim) { case DimBuffer: @@ -576,7 +717,22 @@ Id Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, boo addCapability(CapabilityImageMSArray); } } -#endif + + if (emitNonSemanticShaderDebugInfo) + { + auto TypeName = [&dim]() -> char const* { + switch (dim) { + case Dim1D: return "type.1d.image"; + case Dim2D: return "type.2d.image"; + case Dim3D: return "type.3d.image"; + case DimCube: return "type.cube.image"; + default: return "type.image"; + } + }; + + auto const debugResultId = makeCompositeDebugType({}, TypeName(), NonSemanticShaderDebugInfo100Class, true); + debugId[type->getResultId()] = debugResultId; + } return type->getResultId(); } @@ -599,10 +755,483 @@ Id Builder::makeSampledImageType(Id imageType) constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = makeCompositeDebugType({}, "type.sampled.image", NonSemanticShaderDebugInfo100Class, true); + debugId[type->getResultId()] = debugResultId; + } + return type->getResultId(); } -#ifndef GLSLANG_WEB +Id Builder::makeDebugInfoNone() +{ + if (debugInfoNone != 0) + return debugInfoNone; + + Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + inst->reserveOperands(2); + inst->addIdOperand(nonSemanticShaderDebugInfo); + inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugInfoNone); + + constantsTypesGlobals.push_back(std::unique_ptr(inst)); + module.mapInstruction(inst); + + debugInfoNone = inst->getResultId(); + + return debugInfoNone; +} + +Id Builder::makeBoolDebugType(int const size) +{ + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) { + type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t]; + if (type->getIdOperand(0) == getStringId("bool") && + type->getIdOperand(1) == static_cast(size) && + type->getIdOperand(2) == NonSemanticShaderDebugInfo100Boolean) + return type->getResultId(); + } + + type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(6); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic); + + type->addIdOperand(getStringId("bool")); // name id + type->addIdOperand(makeUintConstant(size)); // size id + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Boolean)); // encoding id + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100None)); // flags id + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeIntegerDebugType(int const width, bool const hasSign) +{ + const char* typeName = nullptr; + switch (width) { + case 8: typeName = hasSign ? "int8_t" : "uint8_t"; break; + case 16: typeName = hasSign ? "int16_t" : "uint16_t"; break; + case 64: typeName = hasSign ? "int64_t" : "uint64_t"; break; + default: typeName = hasSign ? "int" : "uint"; + } + auto nameId = getStringId(typeName); + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) { + type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t]; + if (type->getIdOperand(0) == nameId && + type->getIdOperand(1) == static_cast(width) && + type->getIdOperand(2) == (hasSign ? NonSemanticShaderDebugInfo100Signed : NonSemanticShaderDebugInfo100Unsigned)) + return type->getResultId(); + } + + // not found, make it + type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(6); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic); + type->addIdOperand(nameId); // name id + type->addIdOperand(makeUintConstant(width)); // size id + if(hasSign == true) { + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Signed)); // encoding id + } else { + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Unsigned)); // encoding id + } + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100None)); // flags id + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeFloatDebugType(int const width) +{ + const char* typeName = nullptr; + switch (width) { + case 16: typeName = "float16_t"; break; + case 64: typeName = "double"; break; + default: typeName = "float"; break; + } + auto nameId = getStringId(typeName); + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) { + type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t]; + if (type->getIdOperand(0) == nameId && + type->getIdOperand(1) == static_cast(width) && + type->getIdOperand(2) == NonSemanticShaderDebugInfo100Float) + return type->getResultId(); + } + + // not found, make it + type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(6); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic); + type->addIdOperand(nameId); // name id + type->addIdOperand(makeUintConstant(width)); // size id + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Float)); // encoding id + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100None)); // flags id + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeSequentialDebugType(Id const baseType, Id const componentCount, NonSemanticShaderDebugInfo100Instructions const sequenceType) +{ + assert(sequenceType == NonSemanticShaderDebugInfo100DebugTypeArray || + sequenceType == NonSemanticShaderDebugInfo100DebugTypeVector); + + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedDebugTypes[sequenceType].size(); ++t) { + type = groupedDebugTypes[sequenceType][t]; + if (type->getIdOperand(0) == baseType && + type->getIdOperand(1) == makeUintConstant(componentCount)) + return type->getResultId(); + } + + // not found, make it + type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(4); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(sequenceType); + type->addIdOperand(debugId[baseType]); // base type + type->addIdOperand(componentCount); // component count + + groupedDebugTypes[sequenceType].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeArrayDebugType(Id const baseType, Id const componentCount) +{ + return makeSequentialDebugType(baseType, componentCount, NonSemanticShaderDebugInfo100DebugTypeArray); +} + +Id Builder::makeVectorDebugType(Id const baseType, int const componentCount) +{ + return makeSequentialDebugType(baseType, makeUintConstant(componentCount), NonSemanticShaderDebugInfo100DebugTypeVector); +} + +Id Builder::makeMatrixDebugType(Id const vectorType, int const vectorCount, bool columnMajor) +{ + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMatrix].size(); ++t) { + type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMatrix][t]; + if (type->getIdOperand(0) == vectorType && + type->getIdOperand(1) == makeUintConstant(vectorCount)) + return type->getResultId(); + } + + // not found, make it + type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(5); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeMatrix); + type->addIdOperand(debugId[vectorType]); // vector type id + type->addIdOperand(makeUintConstant(vectorCount)); // component count id + type->addIdOperand(makeBoolConstant(columnMajor)); // column-major id + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMatrix].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeMemberDebugType(Id const memberType, DebugTypeLoc const& debugTypeLoc) +{ + assert(debugId[memberType] != 0); + + Instruction* type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(10); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeMember); + type->addIdOperand(getStringId(debugTypeLoc.name)); // name id + type->addIdOperand(debugId[memberType]); // type id + type->addIdOperand(makeDebugSource(currentFileId)); // source id + type->addIdOperand(makeUintConstant(debugTypeLoc.line)); // line id TODO: currentLine is always zero + type->addIdOperand(makeUintConstant(debugTypeLoc.column)); // TODO: column id + type->addIdOperand(makeUintConstant(0)); // TODO: offset id + type->addIdOperand(makeUintConstant(0)); // TODO: size id + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic)); // flags id + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeMember].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +// Note: To represent a source language opaque type, this instruction must have no Members operands, Size operand must be +// DebugInfoNone, and Name must start with @ to avoid clashes with user defined names. +Id Builder::makeCompositeDebugType(std::vector const& memberTypes, char const*const name, + NonSemanticShaderDebugInfo100DebugCompositeType const tag, bool const isOpaqueType) +{ + // Create the debug member types. + std::vector memberDebugTypes; + for(auto const memberType : memberTypes) { + assert(debugTypeLocs.find(memberType) != debugTypeLocs.end()); + + // There _should_ be debug types for all the member types but currently buffer references + // do not have member debug info generated. + if (debugId[memberType]) + memberDebugTypes.emplace_back(makeMemberDebugType(memberType, debugTypeLocs[memberType])); + + // TODO: Need to rethink this method of passing location information. + // debugTypeLocs.erase(memberType); + } + + // Create The structure debug type. + Instruction* type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(memberDebugTypes.size() + 11); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeComposite); + type->addIdOperand(getStringId(name)); // name id + type->addIdOperand(makeUintConstant(tag)); // tag id + type->addIdOperand(makeDebugSource(currentFileId)); // source id + type->addIdOperand(makeUintConstant(currentLine)); // line id TODO: currentLine always zero? + type->addIdOperand(makeUintConstant(0)); // TODO: column id + type->addIdOperand(makeDebugCompilationUnit()); // scope id + if(isOpaqueType == true) { + // Prepend '@' to opaque types. + type->addIdOperand(getStringId('@' + std::string(name))); // linkage name id + type->addIdOperand(makeDebugInfoNone()); // size id + } else { + type->addIdOperand(getStringId(name)); // linkage name id + type->addIdOperand(makeUintConstant(0)); // TODO: size id + } + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic)); // flags id + assert(isOpaqueType == false || (isOpaqueType == true && memberDebugTypes.empty())); + for(auto const memberDebugType : memberDebugTypes) { + type->addIdOperand(memberDebugType); + } + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeComposite].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makePointerDebugType(StorageClass storageClass, Id const baseType) +{ + const Id debugBaseType = debugId[baseType]; + if (!debugBaseType) { + return makeDebugInfoNone(); + } + const Id scID = makeUintConstant(storageClass); + for (Instruction* otherType : groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypePointer]) { + if (otherType->getIdOperand(2) == debugBaseType && + otherType->getIdOperand(3) == scID) { + return otherType->getResultId(); + } + } + + Instruction* type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + type->reserveOperands(5); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypePointer); + type->addIdOperand(debugBaseType); + type->addIdOperand(scID); + type->addIdOperand(makeUintConstant(0)); + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypePointer].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +// Emit a OpExtInstWithForwardRefsKHR nonsemantic instruction for a pointer debug type +// where we don't have the pointee yet. Since we don't have the pointee yet, it just +// points to itself and we rely on patching it later. +Id Builder::makeForwardPointerDebugType(StorageClass storageClass) +{ + const Id scID = makeUintConstant(storageClass); + + this->addExtension(spv::E_SPV_KHR_relaxed_extended_instruction); + + Instruction *type = new Instruction(getUniqueId(), makeVoidType(), OpExtInstWithForwardRefsKHR); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypePointer); + type->addIdOperand(type->getResultId()); + type->addIdOperand(scID); + type->addIdOperand(makeUintConstant(0)); + + groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypePointer].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeDebugSource(const Id fileName) { + if (debugSourceId.find(fileName) != debugSourceId.end()) + return debugSourceId[fileName]; + spv::Id resultId = getUniqueId(); + Instruction* sourceInst = new Instruction(resultId, makeVoidType(), OpExtInst); + sourceInst->reserveOperands(3); + sourceInst->addIdOperand(nonSemanticShaderDebugInfo); + sourceInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugSource); + sourceInst->addIdOperand(fileName); + if (emitNonSemanticShaderDebugSource) { + spv::Id sourceId = 0; + if (fileName == mainFileId) { + sourceId = getStringId(sourceText); + } else { + auto incItr = includeFiles.find(fileName); + if (incItr != includeFiles.end()) { + sourceId = getStringId(*incItr->second); + } + } + + // We omit the optional source text item if not available in glslang + if (sourceId != 0) { + sourceInst->addIdOperand(sourceId); + } + } + constantsTypesGlobals.push_back(std::unique_ptr(sourceInst)); + module.mapInstruction(sourceInst); + debugSourceId[fileName] = resultId; + return resultId; +} + +Id Builder::makeDebugCompilationUnit() { + if (nonSemanticShaderCompilationUnitId != 0) + return nonSemanticShaderCompilationUnitId; + spv::Id resultId = getUniqueId(); + Instruction* sourceInst = new Instruction(resultId, makeVoidType(), OpExtInst); + sourceInst->reserveOperands(6); + sourceInst->addIdOperand(nonSemanticShaderDebugInfo); + sourceInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugCompilationUnit); + sourceInst->addIdOperand(makeUintConstant(1)); // TODO(greg-lunarg): Get rid of magic number + sourceInst->addIdOperand(makeUintConstant(4)); // TODO(greg-lunarg): Get rid of magic number + sourceInst->addIdOperand(makeDebugSource(mainFileId)); + sourceInst->addIdOperand(makeUintConstant(sourceLang)); + constantsTypesGlobals.push_back(std::unique_ptr(sourceInst)); + module.mapInstruction(sourceInst); + nonSemanticShaderCompilationUnitId = resultId; + + // We can reasonably assume that makeDebugCompilationUnit will be called before any of + // debug-scope stack. Function scopes and lexical scopes will occur afterward. + assert(currentDebugScopeId.empty()); + currentDebugScopeId.push(nonSemanticShaderCompilationUnitId); + + return resultId; +} + +Id Builder::createDebugGlobalVariable(Id const type, char const*const name, Id const variable) +{ + assert(type != 0); + + Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + inst->reserveOperands(11); + inst->addIdOperand(nonSemanticShaderDebugInfo); + inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugGlobalVariable); + inst->addIdOperand(getStringId(name)); // name id + inst->addIdOperand(type); // type id + inst->addIdOperand(makeDebugSource(currentFileId)); // source id + inst->addIdOperand(makeUintConstant(currentLine)); // line id TODO: currentLine always zero? + inst->addIdOperand(makeUintConstant(0)); // TODO: column id + inst->addIdOperand(makeDebugCompilationUnit()); // scope id + inst->addIdOperand(getStringId(name)); // linkage name id + inst->addIdOperand(variable); // variable id + inst->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsDefinition)); // flags id + + constantsTypesGlobals.push_back(std::unique_ptr(inst)); + module.mapInstruction(inst); + + return inst->getResultId(); +} + +Id Builder::createDebugLocalVariable(Id type, char const*const name, size_t const argNumber) +{ + assert(name != nullptr); + assert(!currentDebugScopeId.empty()); + + Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + inst->reserveOperands(9); + inst->addIdOperand(nonSemanticShaderDebugInfo); + inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugLocalVariable); + inst->addIdOperand(getStringId(name)); // name id + inst->addIdOperand(type); // type id + inst->addIdOperand(makeDebugSource(currentFileId)); // source id + inst->addIdOperand(makeUintConstant(currentLine)); // line id + inst->addIdOperand(makeUintConstant(0)); // TODO: column id + inst->addIdOperand(currentDebugScopeId.top()); // scope id + inst->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsLocal)); // flags id + if(argNumber != 0) { + inst->addIdOperand(makeUintConstant(argNumber)); + } + + constantsTypesGlobals.push_back(std::unique_ptr(inst)); + module.mapInstruction(inst); + + return inst->getResultId(); +} + +Id Builder::makeDebugExpression() +{ + if (debugExpression != 0) + return debugExpression; + + Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + inst->reserveOperands(2); + inst->addIdOperand(nonSemanticShaderDebugInfo); + inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugExpression); + + constantsTypesGlobals.push_back(std::unique_ptr(inst)); + module.mapInstruction(inst); + + debugExpression = inst->getResultId(); + + return debugExpression; +} + +Id Builder::makeDebugDeclare(Id const debugLocalVariable, Id const pointer) +{ + Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + inst->reserveOperands(5); + inst->addIdOperand(nonSemanticShaderDebugInfo); + inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugDeclare); + inst->addIdOperand(debugLocalVariable); // debug local variable id + inst->addIdOperand(pointer); // pointer to local variable id + inst->addIdOperand(makeDebugExpression()); // expression id + addInstruction(std::unique_ptr(inst)); + + return inst->getResultId(); +} + +Id Builder::makeDebugValue(Id const debugLocalVariable, Id const value) +{ + Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); + inst->reserveOperands(5); + inst->addIdOperand(nonSemanticShaderDebugInfo); + inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugValue); + inst->addIdOperand(debugLocalVariable); // debug local variable id + inst->addIdOperand(value); // value of local variable id + inst->addIdOperand(makeDebugExpression()); // expression id + addInstruction(std::unique_ptr(inst)); + + return inst->getResultId(); +} + Id Builder::makeAccelerationStructureType() { Instruction *type; @@ -611,6 +1240,10 @@ Id Builder::makeAccelerationStructureType() groupedTypes[OpTypeAccelerationStructureKHR].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) { + spv::Id debugType = makeCompositeDebugType({}, "accelerationStructure", NonSemanticShaderDebugInfo100Structure, true); + debugId[type->getResultId()] = debugType; + } } else { type = groupedTypes[OpTypeAccelerationStructureKHR].back(); } @@ -626,13 +1259,31 @@ Id Builder::makeRayQueryType() groupedTypes[OpTypeRayQueryKHR].push_back(type); constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); + if (emitNonSemanticShaderDebugInfo) { + spv::Id debugType = makeCompositeDebugType({}, "rayQuery", NonSemanticShaderDebugInfo100Structure, true); + debugId[type->getResultId()] = debugType; + } } else { type = groupedTypes[OpTypeRayQueryKHR].back(); } return type->getResultId(); } -#endif + +Id Builder::makeHitObjectNVType() +{ + Instruction *type; + if (groupedTypes[OpTypeHitObjectNV].size() == 0) { + type = new Instruction(getUniqueId(), NoType, OpTypeHitObjectNV); + groupedTypes[OpTypeHitObjectNV].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + } else { + type = groupedTypes[OpTypeHitObjectNV].back(); + } + + return type->getResultId(); +} Id Builder::getDerefTypeId(Id resultId) const { @@ -661,7 +1312,7 @@ Op Builder::getMostBasicTypeClass(Id typeId) const } } -int Builder::getNumTypeConstituents(Id typeId) const +unsigned int Builder::getNumTypeConstituents(Id typeId) const { Instruction* instr = module.getInstruction(typeId); @@ -682,6 +1333,7 @@ int Builder::getNumTypeConstituents(Id typeId) const } case OpTypeStruct: return instr->getNumOperands(); + case OpTypeCooperativeMatrixKHR: case OpTypeCooperativeMatrixNV: // has only one constituent when used with OpCompositeConstruct. return 1; @@ -731,6 +1383,7 @@ Id Builder::getContainedTypeId(Id typeId, int member) const case OpTypeMatrix: case OpTypeArray: case OpTypeRuntimeArray: + case OpTypeCooperativeMatrixKHR: case OpTypeCooperativeMatrixNV: return instr->getIdOperand(0); case OpTypePointer: @@ -801,7 +1454,7 @@ bool Builder::containsType(Id typeId, spv::Op typeOp, unsigned int width) const } // return true if the type is a pointer to PhysicalStorageBufferEXT or an -// array of such pointers. These require restrict/aliased decorations. +// contains such a pointer. These require restrict/aliased decorations. bool Builder::containsPhysicalStorageBufferOrArray(Id typeId) const { const Instruction& instr = *module.getInstruction(typeId); @@ -813,6 +1466,12 @@ bool Builder::containsPhysicalStorageBufferOrArray(Id typeId) const return getTypeStorageClass(typeId) == StorageClassPhysicalStorageBufferEXT; case OpTypeArray: return containsPhysicalStorageBufferOrArray(getContainedTypeId(typeId)); + case OpTypeStruct: + for (int m = 0; m < instr.getNumOperands(); ++m) { + if (containsPhysicalStorageBufferOrArray(instr.getIdOperand(m))) + return true; + } + return false; default: return false; } @@ -861,12 +1520,14 @@ bool Builder::isConstantOpCode(Op opcode) const case OpConstantFalse: case OpConstant: case OpConstantComposite: + case OpConstantCompositeReplicateEXT: case OpConstantSampler: case OpConstantNull: case OpSpecConstantTrue: case OpSpecConstantFalse: case OpSpecConstant: case OpSpecConstantComposite: + case OpSpecConstantCompositeReplicateEXT: case OpSpecConstantOp: return true; default: @@ -883,6 +1544,7 @@ bool Builder::isSpecConstantOpCode(Op opcode) const case OpSpecConstant: case OpSpecConstantComposite: case OpSpecConstantOp: + case OpSpecConstantCompositeReplicateEXT: return true; default: return false; @@ -979,6 +1641,7 @@ Id Builder::makeInt64Constant(Id typeId, unsigned long long value, bool specCons } Instruction* c = new Instruction(getUniqueId(), typeId, opcode); + c->reserveOperands(2); c->addImmediateOperand(op1); c->addImmediateOperand(op2); constantsTypesGlobals.push_back(std::unique_ptr(c)); @@ -1015,10 +1678,6 @@ Id Builder::makeFloatConstant(float f, bool specConstant) Id Builder::makeDoubleConstant(double d, bool specConstant) { -#ifdef GLSLANG_WEB - assert(0); - return NoResult; -#else Op opcode = specConstant ? OpSpecConstant : OpConstant; Id typeId = makeFloatType(64); union { double db; unsigned long long ull; } u; @@ -1036,6 +1695,7 @@ Id Builder::makeDoubleConstant(double d, bool specConstant) } Instruction* c = new Instruction(getUniqueId(), typeId, opcode); + c->reserveOperands(2); c->addImmediateOperand(op1); c->addImmediateOperand(op2); constantsTypesGlobals.push_back(std::unique_ptr(c)); @@ -1043,15 +1703,10 @@ Id Builder::makeDoubleConstant(double d, bool specConstant) module.mapInstruction(c); return c->getResultId(); -#endif } Id Builder::makeFloat16Constant(float f16, bool specConstant) { -#ifdef GLSLANG_WEB - assert(0); - return NoResult; -#else Op opcode = specConstant ? OpSpecConstant : OpConstant; Id typeId = makeFloatType(16); @@ -1076,17 +1731,11 @@ Id Builder::makeFloat16Constant(float f16, bool specConstant) module.mapInstruction(c); return c->getResultId(); -#endif } Id Builder::makeFpConstant(Id type, double d, bool specConstant) { -#ifdef GLSLANG_WEB - const int width = 32; - assert(width == getScalarTypeWidth(type)); -#else const int width = getScalarTypeWidth(type); -#endif assert(isFloatType(type)); @@ -1105,9 +1754,22 @@ Id Builder::makeFpConstant(Id type, double d, bool specConstant) return NoResult; } +Id Builder::importNonSemanticShaderDebugInfoInstructions() +{ + assert(emitNonSemanticShaderDebugInfo == true); + + if(nonSemanticShaderDebugInfo == 0) + { + this->addExtension(spv::E_SPV_KHR_non_semantic_info); + nonSemanticShaderDebugInfo = this->import("NonSemantic.Shader.DebugInfo.100"); + } + + return nonSemanticShaderDebugInfo; +} + Id Builder::findCompositeConstant(Op typeClass, Id typeId, const std::vector& comps) { - Instruction* constant = 0; + Instruction* constant = nullptr; bool found = false; for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) { constant = groupedConstants[typeClass][i]; @@ -1134,7 +1796,7 @@ Id Builder::findCompositeConstant(Op typeClass, Id typeId, const std::vector Id Builder::findStructConstant(Id typeId, const std::vector& comps) { - Instruction* constant = 0; + Instruction* constant = nullptr; bool found = false; for (int i = 0; i < (int)groupedStructConstants[typeId].size(); ++i) { constant = groupedStructConstants[typeId][i]; @@ -1159,14 +1821,32 @@ Id Builder::findStructConstant(Id typeId, const std::vector& comps) // Comments in header Id Builder::makeCompositeConstant(Id typeId, const std::vector& members, bool specConstant) { - Op opcode = specConstant ? OpSpecConstantComposite : OpConstantComposite; assert(typeId); Op typeClass = getTypeClass(typeId); + bool replicate = false; + size_t numMembers = members.size(); + if (useReplicatedComposites) { + // use replicate if all members are the same + replicate = numMembers > 0 && + std::equal(members.begin() + 1, members.end(), members.begin()); + + if (replicate) { + numMembers = 1; + addCapability(spv::CapabilityReplicatedCompositesEXT); + addExtension(spv::E_SPV_EXT_replicated_composites); + } + } + + Op opcode = replicate ? + (specConstant ? OpSpecConstantCompositeReplicateEXT : OpConstantCompositeReplicateEXT) : + (specConstant ? OpSpecConstantComposite : OpConstantComposite); + switch (typeClass) { case OpTypeVector: case OpTypeArray: case OpTypeMatrix: + case OpTypeCooperativeMatrixKHR: case OpTypeCooperativeMatrixNV: if (! specConstant) { Id existing = findCompositeConstant(typeClass, typeId, members); @@ -1187,7 +1867,8 @@ Id Builder::makeCompositeConstant(Id typeId, const std::vector& members, boo } Instruction* c = new Instruction(getUniqueId(), typeId, opcode); - for (int op = 0; op < (int)members.size(); ++op) + c->reserveOperands(members.size()); + for (size_t op = 0; op < numMembers; ++op) c->addIdOperand(members[op]); constantsTypesGlobals.push_back(std::unique_ptr(c)); if (typeClass == OpTypeStruct) @@ -1202,6 +1883,7 @@ Id Builder::makeCompositeConstant(Id typeId, const std::vector& members, boo Instruction* Builder::addEntryPoint(ExecutionModel model, Function* function, const char* name) { Instruction* entryPoint = new Instruction(OpEntryPoint); + entryPoint->reserveOperands(3); entryPoint->addImmediateOperand(model); entryPoint->addIdOperand(function->getId()); entryPoint->addStringOperand(name); @@ -1214,7 +1896,12 @@ Instruction* Builder::addEntryPoint(ExecutionModel model, Function* function, co // Currently relying on the fact that all 'value' of interest are small non-negative values. void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, int value1, int value2, int value3) { + // entryPoint can be null if we are in compile-only mode + if (!entryPoint) + return; + Instruction* instr = new Instruction(OpExecutionMode); + instr->reserveOperands(3); instr->addIdOperand(entryPoint->getId()); instr->addImmediateOperand(mode); if (value1 >= 0) @@ -1229,7 +1916,12 @@ void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, int val void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, const std::vector& literals) { + // entryPoint can be null if we are in compile-only mode + if (!entryPoint) + return; + Instruction* instr = new Instruction(OpExecutionMode); + instr->reserveOperands(literals.size() + 2); instr->addIdOperand(entryPoint->getId()); instr->addImmediateOperand(mode); for (auto literal : literals) @@ -1240,7 +1932,12 @@ void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, const s void Builder::addExecutionModeId(Function* entryPoint, ExecutionMode mode, const std::vector& operandIds) { + // entryPoint can be null if we are in compile-only mode + if (!entryPoint) + return; + Instruction* instr = new Instruction(OpExecutionModeId); + instr->reserveOperands(operandIds.size() + 2); instr->addIdOperand(entryPoint->getId()); instr->addImmediateOperand(mode); for (auto operandId : operandIds) @@ -1252,6 +1949,7 @@ void Builder::addExecutionModeId(Function* entryPoint, ExecutionMode mode, const void Builder::addName(Id id, const char* string) { Instruction* name = new Instruction(OpName); + name->reserveOperands(2); name->addIdOperand(id); name->addStringOperand(string); @@ -1261,6 +1959,7 @@ void Builder::addName(Id id, const char* string) void Builder::addMemberName(Id id, int memberNumber, const char* string) { Instruction* name = new Instruction(OpMemberName); + name->reserveOperands(3); name->addIdOperand(id); name->addImmediateOperand(memberNumber); name->addStringOperand(string); @@ -1274,6 +1973,7 @@ void Builder::addDecoration(Id id, Decoration decoration, int num) return; Instruction* dec = new Instruction(OpDecorate); + dec->reserveOperands(2); dec->addIdOperand(id); dec->addImmediateOperand(decoration); if (num >= 0) @@ -1288,6 +1988,7 @@ void Builder::addDecoration(Id id, Decoration decoration, const char* s) return; Instruction* dec = new Instruction(OpDecorateString); + dec->reserveOperands(3); dec->addIdOperand(id); dec->addImmediateOperand(decoration); dec->addStringOperand(s); @@ -1301,6 +2002,7 @@ void Builder::addDecoration(Id id, Decoration decoration, const std::vectorreserveOperands(literals.size() + 2); dec->addIdOperand(id); dec->addImmediateOperand(decoration); for (auto literal : literals) @@ -1315,6 +2017,7 @@ void Builder::addDecoration(Id id, Decoration decoration, const std::vectorreserveOperands(strings.size() + 2); dec->addIdOperand(id); dec->addImmediateOperand(decoration); for (auto string : strings) @@ -1323,12 +2026,24 @@ void Builder::addDecoration(Id id, Decoration decoration, const std::vector(dec)); } +void Builder::addLinkageDecoration(Id id, const char* name, spv::LinkageType linkType) { + Instruction* dec = new Instruction(OpDecorate); + dec->reserveOperands(4); + dec->addIdOperand(id); + dec->addImmediateOperand(spv::DecorationLinkageAttributes); + dec->addStringOperand(name); + dec->addImmediateOperand(linkType); + + decorations.push_back(std::unique_ptr(dec)); +} + void Builder::addDecorationId(Id id, Decoration decoration, Id idDecoration) { if (decoration == spv::DecorationMax) return; Instruction* dec = new Instruction(OpDecorateId); + dec->reserveOperands(3); dec->addIdOperand(id); dec->addImmediateOperand(decoration); dec->addIdOperand(idDecoration); @@ -1342,6 +2057,7 @@ void Builder::addDecorationId(Id id, Decoration decoration, const std::vectorreserveOperands(operandIds.size() + 2); dec->addIdOperand(id); dec->addImmediateOperand(decoration); @@ -1357,6 +2073,7 @@ void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decorat return; Instruction* dec = new Instruction(OpMemberDecorate); + dec->reserveOperands(3); dec->addIdOperand(id); dec->addImmediateOperand(member); dec->addImmediateOperand(decoration); @@ -1372,6 +2089,7 @@ void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decorat return; Instruction* dec = new Instruction(OpMemberDecorateStringGOOGLE); + dec->reserveOperands(4); dec->addIdOperand(id); dec->addImmediateOperand(member); dec->addImmediateOperand(decoration); @@ -1386,6 +2104,7 @@ void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decorat return; Instruction* dec = new Instruction(OpMemberDecorate); + dec->reserveOperands(literals.size() + 3); dec->addIdOperand(id); dec->addImmediateOperand(member); dec->addImmediateOperand(decoration); @@ -1401,6 +2120,7 @@ void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decorat return; Instruction* dec = new Instruction(OpMemberDecorateString); + dec->reserveOperands(strings.size() + 3); dec->addIdOperand(id); dec->addImmediateOperand(member); dec->addImmediateOperand(decoration); @@ -1410,29 +2130,82 @@ void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decorat decorations.push_back(std::unique_ptr(dec)); } +void Builder::addInstruction(std::unique_ptr inst) { + // Optionally insert OpDebugScope + if (emitNonSemanticShaderDebugInfo && dirtyScopeTracker) { + if (buildPoint->updateDebugScope(currentDebugScopeId.top())) { + auto scopeInst = std::make_unique(getUniqueId(), makeVoidType(), OpExtInst); + scopeInst->reserveOperands(3); + scopeInst->addIdOperand(nonSemanticShaderDebugInfo); + scopeInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugScope); + scopeInst->addIdOperand(currentDebugScopeId.top()); + buildPoint->addInstruction(std::move(scopeInst)); + } + + dirtyScopeTracker = false; + } + + // Insert OpLine/OpDebugLine if the debug source location has changed + if (trackDebugInfo && dirtyLineTracker) { + if (buildPoint->updateDebugSourceLocation(currentLine, 0, currentFileId)) { + if (emitSpirvDebugInfo) { + auto lineInst = std::make_unique(OpLine); + lineInst->reserveOperands(3); + lineInst->addIdOperand(currentFileId); + lineInst->addImmediateOperand(currentLine); + lineInst->addImmediateOperand(0); + buildPoint->addInstruction(std::move(lineInst)); + } + if (emitNonSemanticShaderDebugInfo) { + auto lineInst = std::make_unique(getUniqueId(), makeVoidType(), OpExtInst); + lineInst->reserveOperands(7); + lineInst->addIdOperand(nonSemanticShaderDebugInfo); + lineInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugLine); + lineInst->addIdOperand(makeDebugSource(currentFileId)); + lineInst->addIdOperand(makeUintConstant(currentLine)); + lineInst->addIdOperand(makeUintConstant(currentLine)); + lineInst->addIdOperand(makeUintConstant(0)); + lineInst->addIdOperand(makeUintConstant(0)); + buildPoint->addInstruction(std::move(lineInst)); + } + } + + dirtyLineTracker = false; + } + + buildPoint->addInstruction(std::move(inst)); +} + // Comments in header Function* Builder::makeEntryPoint(const char* entryPoint) { assert(! entryPointFunction); - Block* entry; - std::vector params; - std::vector> decorations; + auto const returnType = makeVoidType(); - entryPointFunction = makeFunctionEntry(NoPrecision, makeVoidType(), entryPoint, params, decorations, &entry); + restoreNonSemanticShaderDebugInfo = emitNonSemanticShaderDebugInfo; + if(sourceLang == spv::SourceLanguageHLSL) { + emitNonSemanticShaderDebugInfo = false; + } + + Block* entry = nullptr; + entryPointFunction = makeFunctionEntry(NoPrecision, returnType, entryPoint, LinkageTypeMax, {}, {}, &entry); + + emitNonSemanticShaderDebugInfo = restoreNonSemanticShaderDebugInfo; return entryPointFunction; } // Comments in header -Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const char* name, +Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const char* name, LinkageType linkType, const std::vector& paramTypes, - const std::vector>& decorations, Block **entry) + const std::vector>& decorations, Block** entry) { // Make the function and initial instructions in it Id typeId = makeFunctionType(returnType, paramTypes); Id firstParamId = paramTypes.size() == 0 ? 0 : getUniqueIds((int)paramTypes.size()); - Function* function = new Function(getUniqueId(), returnType, typeId, firstParamId, module); + Id funcId = getUniqueId(); + Function* function = new Function(funcId, returnType, typeId, firstParamId, linkType, name, module); // Set up the precisions setPrecision(function->getId(), precision); @@ -1444,13 +2217,17 @@ Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const } } - // CFG - if (entry) { - *entry = new Block(getUniqueId(), *function); - function->addBlock(*entry); - setBuildPoint(*entry); + // reset last debug scope + if (emitNonSemanticShaderDebugInfo) { + dirtyScopeTracker = true; } + // CFG + assert(entry != nullptr); + *entry = new Block(getUniqueId(), *function); + function->addBlock(*entry); + setBuildPoint(*entry); + if (name) addName(function->getId(), name); @@ -1459,20 +2236,176 @@ Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const return function; } +void Builder::setupDebugFunctionEntry(Function* function, const char* name, int line, const std::vector& paramTypes, + const std::vector& paramNames) +{ + + if (!emitNonSemanticShaderDebugInfo) + return; + + currentLine = line; + Id nameId = getStringId(unmangleFunctionName(name)); + Id funcTypeId = function->getFuncTypeId(); + assert(debugId[funcTypeId] != 0); + Id funcId = function->getId(); + + assert(funcId != 0); + + // Make the debug function instruction + Id debugFuncId = makeDebugFunction(function, nameId, funcTypeId); + debugId[funcId] = debugFuncId; + currentDebugScopeId.push(debugFuncId); + + // DebugScope and DebugLine for parameter DebugDeclares + assert(paramTypes.size() == paramNames.size()); + if ((int)paramTypes.size() > 0) { + Id firstParamId = function->getParamId(0); + + for (size_t p = 0; p < paramTypes.size(); ++p) { + bool passByRef = false; + Id paramTypeId = paramTypes[p]; + + // For pointer-typed parameters, they are actually passed by reference and we need unwrap the pointer to get the actual parameter type. + if (isPointerType(paramTypeId) || isArrayType(paramTypeId)) { + passByRef = true; + paramTypeId = getContainedTypeId(paramTypeId); + } + + auto const& paramName = paramNames[p]; + auto const debugLocalVariableId = createDebugLocalVariable(debugId[paramTypeId], paramName, p + 1); + auto const paramId = static_cast(firstParamId + p); + debugId[paramId] = debugLocalVariableId; + + if (passByRef) { + makeDebugDeclare(debugLocalVariableId, paramId); + } else { + makeDebugValue(debugLocalVariableId, paramId); + } + } + } + + // Clear debug scope stack + if (emitNonSemanticShaderDebugInfo) + currentDebugScopeId.pop(); +} + +Id Builder::makeDebugFunction([[maybe_unused]] Function* function, Id nameId, Id funcTypeId) +{ + assert(function != nullptr); + assert(nameId != 0); + assert(funcTypeId != 0); + assert(debugId[funcTypeId] != 0); + + Id funcId = getUniqueId(); + auto type = new Instruction(funcId, makeVoidType(), OpExtInst); + type->reserveOperands(11); + type->addIdOperand(nonSemanticShaderDebugInfo); + type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugFunction); + type->addIdOperand(nameId); + type->addIdOperand(debugId[funcTypeId]); + type->addIdOperand(makeDebugSource(currentFileId)); // TODO: This points to file of definition instead of declaration + type->addIdOperand(makeUintConstant(currentLine)); // TODO: This points to line of definition instead of declaration + type->addIdOperand(makeUintConstant(0)); // column + type->addIdOperand(makeDebugCompilationUnit()); // scope + type->addIdOperand(nameId); // linkage name + type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic)); + type->addIdOperand(makeUintConstant(currentLine)); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + return funcId; +} + +Id Builder::makeDebugLexicalBlock(uint32_t line) { + assert(!currentDebugScopeId.empty()); + + Id lexId = getUniqueId(); + auto lex = new Instruction(lexId, makeVoidType(), OpExtInst); + lex->reserveOperands(6); + lex->addIdOperand(nonSemanticShaderDebugInfo); + lex->addImmediateOperand(NonSemanticShaderDebugInfo100DebugLexicalBlock); + lex->addIdOperand(makeDebugSource(currentFileId)); + lex->addIdOperand(makeUintConstant(line)); + lex->addIdOperand(makeUintConstant(0)); // column + lex->addIdOperand(currentDebugScopeId.top()); // scope + constantsTypesGlobals.push_back(std::unique_ptr(lex)); + module.mapInstruction(lex); + return lexId; +} + +std::string Builder::unmangleFunctionName(std::string const& name) const +{ + assert(name.length() > 0); + + if(name.rfind('(') != std::string::npos) { + return name.substr(0, name.rfind('(')); + } else { + return name; + } +} + // Comments in header void Builder::makeReturn(bool implicit, Id retVal) { if (retVal) { Instruction* inst = new Instruction(NoResult, NoType, OpReturnValue); inst->addIdOperand(retVal); - buildPoint->addInstruction(std::unique_ptr(inst)); + addInstruction(std::unique_ptr(inst)); } else - buildPoint->addInstruction(std::unique_ptr(new Instruction(NoResult, NoType, OpReturn))); + addInstruction(std::unique_ptr(new Instruction(NoResult, NoType, OpReturn))); if (! implicit) createAndSetNoPredecessorBlock("post-return"); } +// Comments in header +void Builder::enterLexicalBlock(uint32_t line) +{ + // Generate new lexical scope debug instruction + Id lexId = makeDebugLexicalBlock(line); + currentDebugScopeId.push(lexId); + dirtyScopeTracker = true; +} + +// Comments in header +void Builder::leaveLexicalBlock() +{ + // Pop current scope from stack and clear current scope + currentDebugScopeId.pop(); + dirtyScopeTracker = true; +} + +// Comments in header +void Builder::enterFunction(Function const* function) +{ + // Save and disable debugInfo for HLSL entry point function. It is a wrapper + // function with no user code in it. + restoreNonSemanticShaderDebugInfo = emitNonSemanticShaderDebugInfo; + if (sourceLang == spv::SourceLanguageHLSL && function == entryPointFunction) { + emitNonSemanticShaderDebugInfo = false; + } + + if (emitNonSemanticShaderDebugInfo) { + // Initialize scope state + Id funcId = function->getFuncId(); + currentDebugScopeId.push(debugId[funcId]); + // Create DebugFunctionDefinition + spv::Id resultId = getUniqueId(); + Instruction* defInst = new Instruction(resultId, makeVoidType(), OpExtInst); + defInst->reserveOperands(4); + defInst->addIdOperand(nonSemanticShaderDebugInfo); + defInst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugFunctionDefinition); + defInst->addIdOperand(debugId[funcId]); + defInst->addIdOperand(funcId); + addInstruction(std::unique_ptr(defInst)); + } + + if (auto linkType = function->getLinkType(); linkType != LinkageTypeMax) { + Id funcId = function->getFuncId(); + addCapability(CapabilityLinkage); + addLinkageDecoration(funcId, function->getExportName(), linkType); + } +} + // Comments in header void Builder::leaveFunction() { @@ -1488,17 +2421,34 @@ void Builder::leaveFunction() makeReturn(true, createUndefined(function.getReturnType())); } } + + // Clear function scope from debug scope stack + if (emitNonSemanticShaderDebugInfo) + currentDebugScopeId.pop(); + + emitNonSemanticShaderDebugInfo = restoreNonSemanticShaderDebugInfo; } // Comments in header void Builder::makeStatementTerminator(spv::Op opcode, const char *name) { - buildPoint->addInstruction(std::unique_ptr(new Instruction(opcode))); + addInstruction(std::unique_ptr(new Instruction(opcode))); createAndSetNoPredecessorBlock(name); } // Comments in header -Id Builder::createVariable(Decoration precision, StorageClass storageClass, Id type, const char* name, Id initializer) +void Builder::makeStatementTerminator(spv::Op opcode, const std::vector& operands, const char* name) +{ + // It's assumed that the terminator instruction is always of void return type + // However in future if there is a need for non void return type, new helper + // methods can be created. + createNoResultOp(opcode, operands); + createAndSetNoPredecessorBlock(name); +} + +// Comments in header +Id Builder::createVariable(Decoration precision, StorageClass storageClass, Id type, const char* name, Id initializer, + bool const compilerGenerated) { Id pointerType = makePointer(storageClass, type); Instruction* inst = new Instruction(getUniqueId(), pointerType, OpVariable); @@ -1510,11 +2460,26 @@ Id Builder::createVariable(Decoration precision, StorageClass storageClass, Id t case StorageClassFunction: // Validation rules require the declaration in the entry block buildPoint->getParent().addLocalVariable(std::unique_ptr(inst)); + + if (emitNonSemanticShaderDebugInfo && !compilerGenerated) + { + auto const debugLocalVariableId = createDebugLocalVariable(debugId[type], name); + debugId[inst->getResultId()] = debugLocalVariableId; + + makeDebugDeclare(debugLocalVariableId, inst->getResultId()); + } + break; default: constantsTypesGlobals.push_back(std::unique_ptr(inst)); module.mapInstruction(inst); + + if (emitNonSemanticShaderDebugInfo) + { + auto const debugResultId = createDebugGlobalVariable(debugId[type], name, inst->getResultId()); + debugId[inst->getResultId()] = debugResultId; + } break; } @@ -1529,7 +2494,7 @@ Id Builder::createVariable(Decoration precision, StorageClass storageClass, Id t Id Builder::createUndefined(Id type) { Instruction* inst = new Instruction(getUniqueId(), type, OpUndef); - buildPoint->addInstruction(std::unique_ptr(inst)); + addInstruction(std::unique_ptr(inst)); return inst->getResultId(); } @@ -1544,7 +2509,7 @@ spv::MemoryAccessMask Builder::sanitizeMemoryAccessForStorageClass(spv::MemoryAc case spv::StorageClassPhysicalStorageBufferEXT: break; default: - memoryAccess = spv::MemoryAccessMask(memoryAccess & + memoryAccess = spv::MemoryAccessMask(memoryAccess & ~(spv::MemoryAccessMakePointerAvailableKHRMask | spv::MemoryAccessMakePointerVisibleKHRMask | spv::MemoryAccessNonPrivatePointerKHRMask)); @@ -1558,6 +2523,7 @@ void Builder::createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAcce unsigned int alignment) { Instruction* store = new Instruction(OpStore); + store->reserveOperands(2); store->addIdOperand(lValue); store->addIdOperand(rValue); @@ -1573,7 +2539,7 @@ void Builder::createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAcce } } - buildPoint->addInstruction(std::unique_ptr(store)); + addInstruction(std::unique_ptr(store)); } // Comments in header @@ -1595,7 +2561,7 @@ Id Builder::createLoad(Id lValue, spv::Decoration precision, spv::MemoryAccessMa } } - buildPoint->addInstruction(std::unique_ptr(load)); + addInstruction(std::unique_ptr(load)); setPrecision(load->getResultId(), precision); return load->getResultId(); @@ -1610,10 +2576,11 @@ Id Builder::createAccessChain(StorageClass storageClass, Id base, const std::vec // Make the instruction Instruction* chain = new Instruction(getUniqueId(), typeId, OpAccessChain); + chain->reserveOperands(offsets.size() + 1); chain->addIdOperand(base); for (int i = 0; i < (int)offsets.size(); ++i) chain->addIdOperand(offsets[i]); - buildPoint->addInstruction(std::unique_ptr(chain)); + addInstruction(std::unique_ptr(chain)); return chain->getResultId(); } @@ -1622,14 +2589,32 @@ Id Builder::createArrayLength(Id base, unsigned int member) { spv::Id intType = makeUintType(32); Instruction* length = new Instruction(getUniqueId(), intType, OpArrayLength); + length->reserveOperands(2); length->addIdOperand(base); length->addImmediateOperand(member); - buildPoint->addInstruction(std::unique_ptr(length)); + addInstruction(std::unique_ptr(length)); return length->getResultId(); } -Id Builder::createCooperativeMatrixLength(Id type) +Id Builder::createCooperativeMatrixLengthKHR(Id type) +{ + spv::Id intType = makeUintType(32); + + // Generate code for spec constants if in spec constant operation + // generation mode. + if (generatingOpCodeForSpecConst) { + return createSpecConstantOp(OpCooperativeMatrixLengthKHR, intType, std::vector(1, type), std::vector()); + } + + Instruction* length = new Instruction(getUniqueId(), intType, OpCooperativeMatrixLengthKHR); + length->addIdOperand(type); + addInstruction(std::unique_ptr(length)); + + return length->getResultId(); +} + +Id Builder::createCooperativeMatrixLengthNV(Id type) { spv::Id intType = makeUintType(32); @@ -1641,7 +2626,7 @@ Id Builder::createCooperativeMatrixLength(Id type) Instruction* length = new Instruction(getUniqueId(), intType, OpCooperativeMatrixLengthNV); length->addIdOperand(type); - buildPoint->addInstruction(std::unique_ptr(length)); + addInstruction(std::unique_ptr(length)); return length->getResultId(); } @@ -1655,9 +2640,10 @@ Id Builder::createCompositeExtract(Id composite, Id typeId, unsigned index) std::vector(1, index)); } Instruction* extract = new Instruction(getUniqueId(), typeId, OpCompositeExtract); + extract->reserveOperands(2); extract->addIdOperand(composite); extract->addImmediateOperand(index); - buildPoint->addInstruction(std::unique_ptr(extract)); + addInstruction(std::unique_ptr(extract)); return extract->getResultId(); } @@ -1670,10 +2656,11 @@ Id Builder::createCompositeExtract(Id composite, Id typeId, const std::vector(1, composite), indexes); } Instruction* extract = new Instruction(getUniqueId(), typeId, OpCompositeExtract); + extract->reserveOperands(indexes.size() + 1); extract->addIdOperand(composite); for (int i = 0; i < (int)indexes.size(); ++i) extract->addImmediateOperand(indexes[i]); - buildPoint->addInstruction(std::unique_ptr(extract)); + addInstruction(std::unique_ptr(extract)); return extract->getResultId(); } @@ -1681,10 +2668,11 @@ Id Builder::createCompositeExtract(Id composite, Id typeId, const std::vectorreserveOperands(3); insert->addIdOperand(object); insert->addIdOperand(composite); insert->addImmediateOperand(index); - buildPoint->addInstruction(std::unique_ptr(insert)); + addInstruction(std::unique_ptr(insert)); return insert->getResultId(); } @@ -1692,11 +2680,12 @@ Id Builder::createCompositeInsert(Id object, Id composite, Id typeId, unsigned i Id Builder::createCompositeInsert(Id object, Id composite, Id typeId, const std::vector& indexes) { Instruction* insert = new Instruction(getUniqueId(), typeId, OpCompositeInsert); + insert->reserveOperands(indexes.size() + 2); insert->addIdOperand(object); insert->addIdOperand(composite); for (int i = 0; i < (int)indexes.size(); ++i) insert->addImmediateOperand(indexes[i]); - buildPoint->addInstruction(std::unique_ptr(insert)); + addInstruction(std::unique_ptr(insert)); return insert->getResultId(); } @@ -1704,9 +2693,10 @@ Id Builder::createCompositeInsert(Id object, Id composite, Id typeId, const std: Id Builder::createVectorExtractDynamic(Id vector, Id typeId, Id componentIndex) { Instruction* extract = new Instruction(getUniqueId(), typeId, OpVectorExtractDynamic); + extract->reserveOperands(2); extract->addIdOperand(vector); extract->addIdOperand(componentIndex); - buildPoint->addInstruction(std::unique_ptr(extract)); + addInstruction(std::unique_ptr(extract)); return extract->getResultId(); } @@ -1714,10 +2704,11 @@ Id Builder::createVectorExtractDynamic(Id vector, Id typeId, Id componentIndex) Id Builder::createVectorInsertDynamic(Id vector, Id typeId, Id component, Id componentIndex) { Instruction* insert = new Instruction(getUniqueId(), typeId, OpVectorInsertDynamic); + insert->reserveOperands(3); insert->addIdOperand(vector); insert->addIdOperand(component); insert->addIdOperand(componentIndex); - buildPoint->addInstruction(std::unique_ptr(insert)); + addInstruction(std::unique_ptr(insert)); return insert->getResultId(); } @@ -1726,7 +2717,7 @@ Id Builder::createVectorInsertDynamic(Id vector, Id typeId, Id component, Id com void Builder::createNoResultOp(Op opCode) { Instruction* op = new Instruction(opCode); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); } // An opcode that has one id operand, no result id, and no type @@ -1734,47 +2725,51 @@ void Builder::createNoResultOp(Op opCode, Id operand) { Instruction* op = new Instruction(opCode); op->addIdOperand(operand); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); } // An opcode that has one or more operands, no result id, and no type void Builder::createNoResultOp(Op opCode, const std::vector& operands) { Instruction* op = new Instruction(opCode); - for (auto it = operands.cbegin(); it != operands.cend(); ++it) { - op->addIdOperand(*it); + op->reserveOperands(operands.size()); + for (auto id : operands) { + op->addIdOperand(id); } - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); } // An opcode that has multiple operands, no result id, and no type void Builder::createNoResultOp(Op opCode, const std::vector& operands) { Instruction* op = new Instruction(opCode); + op->reserveOperands(operands.size()); for (auto it = operands.cbegin(); it != operands.cend(); ++it) { if (it->isId) op->addIdOperand(it->word); else op->addImmediateOperand(it->word); } - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); } void Builder::createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask semantics) { Instruction* op = new Instruction(OpControlBarrier); + op->reserveOperands(3); op->addIdOperand(makeUintConstant(execution)); op->addIdOperand(makeUintConstant(memory)); op->addIdOperand(makeUintConstant(semantics)); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); } void Builder::createMemoryBarrier(unsigned executionScope, unsigned memorySemantics) { Instruction* op = new Instruction(OpMemoryBarrier); + op->reserveOperands(2); op->addIdOperand(makeUintConstant(executionScope)); op->addIdOperand(makeUintConstant(memorySemantics)); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); } // An opcode that has one operands, a result id, and a type @@ -1787,7 +2782,7 @@ Id Builder::createUnaryOp(Op opCode, Id typeId, Id operand) } Instruction* op = new Instruction(getUniqueId(), typeId, opCode); op->addIdOperand(operand); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); return op->getResultId(); } @@ -1802,9 +2797,10 @@ Id Builder::createBinOp(Op opCode, Id typeId, Id left, Id right) return createSpecConstantOp(opCode, typeId, operands, std::vector()); } Instruction* op = new Instruction(getUniqueId(), typeId, opCode); + op->reserveOperands(2); op->addIdOperand(left); op->addIdOperand(right); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); return op->getResultId(); } @@ -1822,10 +2818,11 @@ Id Builder::createTriOp(Op opCode, Id typeId, Id op1, Id op2, Id op3) opCode, typeId, operands, std::vector()); } Instruction* op = new Instruction(getUniqueId(), typeId, opCode); + op->reserveOperands(3); op->addIdOperand(op1); op->addIdOperand(op2); op->addIdOperand(op3); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); return op->getResultId(); } @@ -1833,9 +2830,10 @@ Id Builder::createTriOp(Op opCode, Id typeId, Id op1, Id op2, Id op3) Id Builder::createOp(Op opCode, Id typeId, const std::vector& operands) { Instruction* op = new Instruction(getUniqueId(), typeId, opCode); - for (auto it = operands.cbegin(); it != operands.cend(); ++it) - op->addIdOperand(*it); - buildPoint->addInstruction(std::unique_ptr(op)); + op->reserveOperands(operands.size()); + for (auto id : operands) + op->addIdOperand(id); + addInstruction(std::unique_ptr(op)); return op->getResultId(); } @@ -1843,13 +2841,14 @@ Id Builder::createOp(Op opCode, Id typeId, const std::vector& operands) Id Builder::createOp(Op opCode, Id typeId, const std::vector& operands) { Instruction* op = new Instruction(getUniqueId(), typeId, opCode); + op->reserveOperands(operands.size()); for (auto it = operands.cbegin(); it != operands.cend(); ++it) { if (it->isId) op->addIdOperand(it->word); else op->addImmediateOperand(it->word); } - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); return op->getResultId(); } @@ -1858,6 +2857,7 @@ Id Builder::createSpecConstantOp(Op opCode, Id typeId, const std::vector& op const std::vector& literals) { Instruction* op = new Instruction(getUniqueId(), typeId, OpSpecConstantOp); + op->reserveOperands(operands.size() + literals.size() + 1); op->addImmediateOperand((unsigned) opCode); for (auto it = operands.cbegin(); it != operands.cend(); ++it) op->addIdOperand(*it); @@ -1866,16 +2866,25 @@ Id Builder::createSpecConstantOp(Op opCode, Id typeId, const std::vector& op module.mapInstruction(op); constantsTypesGlobals.push_back(std::unique_ptr(op)); + // OpSpecConstantOp's using 8 or 16 bit types require the associated capability + if (containsType(typeId, OpTypeInt, 8)) + addCapability(CapabilityInt8); + if (containsType(typeId, OpTypeInt, 16)) + addCapability(CapabilityInt16); + if (containsType(typeId, OpTypeFloat, 16)) + addCapability(CapabilityFloat16); + return op->getResultId(); } Id Builder::createFunctionCall(spv::Function* function, const std::vector& args) { Instruction* op = new Instruction(getUniqueId(), function->getReturnType(), OpFunctionCall); + op->reserveOperands(args.size() + 1); op->addIdOperand(function->getId()); for (int a = 0; a < (int)args.size(); ++a) op->addIdOperand(args[a]); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); return op->getResultId(); } @@ -1893,11 +2902,12 @@ Id Builder::createRvalueSwizzle(Decoration precision, Id typeId, Id source, cons } Instruction* swizzle = new Instruction(getUniqueId(), typeId, OpVectorShuffle); assert(isVector(source)); + swizzle->reserveOperands(channels.size() + 2); swizzle->addIdOperand(source); swizzle->addIdOperand(source); for (int i = 0; i < (int)channels.size(); ++i) swizzle->addImmediateOperand(channels[i]); - buildPoint->addInstruction(std::unique_ptr(swizzle)); + addInstruction(std::unique_ptr(swizzle)); return setPrecision(swizzle->getResultId(), precision); } @@ -1911,9 +2921,10 @@ Id Builder::createLvalueSwizzle(Id typeId, Id target, Id source, const std::vect Instruction* swizzle = new Instruction(getUniqueId(), typeId, OpVectorShuffle); assert(isVector(target)); + swizzle->reserveOperands(2); swizzle->addIdOperand(target); - assert(getNumComponents(source) == (int)channels.size()); + assert(getNumComponents(source) == channels.size()); assert(isVector(source)); swizzle->addIdOperand(source); @@ -1928,9 +2939,10 @@ Id Builder::createLvalueSwizzle(Id typeId, Id target, Id source, const std::vect components[channels[i]] = numTargetComponents + i; // finish the instruction with these components selectors + swizzle->reserveOperands(numTargetComponents); for (int i = 0; i < numTargetComponents; ++i) swizzle->addImmediateOperand(components[i]); - buildPoint->addInstruction(std::unique_ptr(swizzle)); + addInstruction(std::unique_ptr(swizzle)); return swizzle->getResultId(); } @@ -1972,10 +2984,21 @@ Id Builder::smearScalar(Decoration precision, Id scalar, Id vectorType) auto result_id = makeCompositeConstant(vectorType, members, isSpecConstant(scalar)); smear = module.getInstruction(result_id); } else { - smear = new Instruction(getUniqueId(), vectorType, OpCompositeConstruct); + bool replicate = useReplicatedComposites && (numComponents > 0); + + if (replicate) { + numComponents = 1; + addCapability(spv::CapabilityReplicatedCompositesEXT); + addExtension(spv::E_SPV_EXT_replicated_composites); + } + + Op opcode = replicate ? OpCompositeConstructReplicateEXT : OpCompositeConstruct; + + smear = new Instruction(getUniqueId(), vectorType, opcode); + smear->reserveOperands(numComponents); for (int c = 0; c < numComponents; ++c) smear->addIdOperand(scalar); - buildPoint->addInstruction(std::unique_ptr(smear)); + addInstruction(std::unique_ptr(smear)); } return setPrecision(smear->getResultId(), precision); @@ -1985,12 +3008,13 @@ Id Builder::smearScalar(Decoration precision, Id scalar, Id vectorType) Id Builder::createBuiltinCall(Id resultType, Id builtins, int entryPoint, const std::vector& args) { Instruction* inst = new Instruction(getUniqueId(), resultType, OpExtInst); + inst->reserveOperands(args.size() + 2); inst->addIdOperand(builtins); inst->addImmediateOperand(entryPoint); for (int arg = 0; arg < (int)args.size(); ++arg) inst->addIdOperand(args[arg]); - buildPoint->addInstruction(std::unique_ptr(inst)); + addInstruction(std::unique_ptr(inst)); return inst->getResultId(); } @@ -2000,52 +3024,47 @@ Id Builder::createBuiltinCall(Id resultType, Id builtins, int entryPoint, const Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather, bool noImplicitLod, const TextureParameters& parameters, ImageOperandsMask signExtensionMask) { - static const int maxTextureArgs = 10; - Id texArgs[maxTextureArgs] = {}; + std::vector texArgs; // // Set up the fixed arguments // - int numArgs = 0; bool explicitLod = false; - texArgs[numArgs++] = parameters.sampler; - texArgs[numArgs++] = parameters.coords; + texArgs.push_back(parameters.sampler); + texArgs.push_back(parameters.coords); if (parameters.Dref != NoResult) - texArgs[numArgs++] = parameters.Dref; + texArgs.push_back(parameters.Dref); if (parameters.component != NoResult) - texArgs[numArgs++] = parameters.component; + texArgs.push_back(parameters.component); -#ifndef GLSLANG_WEB if (parameters.granularity != NoResult) - texArgs[numArgs++] = parameters.granularity; + texArgs.push_back(parameters.granularity); if (parameters.coarse != NoResult) - texArgs[numArgs++] = parameters.coarse; -#endif + texArgs.push_back(parameters.coarse); // // Set up the optional arguments // - int optArgNum = numArgs; // track which operand, if it exists, is the mask of optional arguments - ++numArgs; // speculatively make room for the mask operand + size_t optArgNum = texArgs.size(); // the position of the mask for the optional arguments, if any. ImageOperandsMask mask = ImageOperandsMaskNone; // the mask operand if (parameters.bias) { mask = (ImageOperandsMask)(mask | ImageOperandsBiasMask); - texArgs[numArgs++] = parameters.bias; + texArgs.push_back(parameters.bias); } if (parameters.lod) { mask = (ImageOperandsMask)(mask | ImageOperandsLodMask); - texArgs[numArgs++] = parameters.lod; + texArgs.push_back(parameters.lod); explicitLod = true; } else if (parameters.gradX) { mask = (ImageOperandsMask)(mask | ImageOperandsGradMask); - texArgs[numArgs++] = parameters.gradX; - texArgs[numArgs++] = parameters.gradY; + texArgs.push_back(parameters.gradX); + texArgs.push_back(parameters.gradY); explicitLod = true; } else if (noImplicitLod && ! fetch && ! gather) { // have to explicitly use lod of 0 if not allowed to have them be implicit, and // we would otherwise be about to issue an implicit instruction mask = (ImageOperandsMask)(mask | ImageOperandsLodMask); - texArgs[numArgs++] = makeFloatConstant(0.0); + texArgs.push_back(makeFloatConstant(0.0)); explicitLod = true; } if (parameters.offset) { @@ -2055,24 +3074,23 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, addCapability(CapabilityImageGatherExtended); mask = (ImageOperandsMask)(mask | ImageOperandsOffsetMask); } - texArgs[numArgs++] = parameters.offset; + texArgs.push_back(parameters.offset); } if (parameters.offsets) { addCapability(CapabilityImageGatherExtended); mask = (ImageOperandsMask)(mask | ImageOperandsConstOffsetsMask); - texArgs[numArgs++] = parameters.offsets; + texArgs.push_back(parameters.offsets); } -#ifndef GLSLANG_WEB if (parameters.sample) { mask = (ImageOperandsMask)(mask | ImageOperandsSampleMask); - texArgs[numArgs++] = parameters.sample; + texArgs.push_back(parameters.sample); } if (parameters.lodClamp) { // capability if this bit is used addCapability(CapabilityMinLod); mask = (ImageOperandsMask)(mask | ImageOperandsMinLodMask); - texArgs[numArgs++] = parameters.lodClamp; + texArgs.push_back(parameters.lodClamp); } if (parameters.nonprivate) { mask = mask | ImageOperandsNonPrivateTexelKHRMask; @@ -2080,12 +3098,10 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, if (parameters.volatil) { mask = mask | ImageOperandsVolatileTexelKHRMask; } -#endif mask = mask | signExtensionMask; - if (mask == ImageOperandsMaskNone) - --numArgs; // undo speculative reservation for the mask argument - else - texArgs[optArgNum] = mask; + // insert the operand for the mask, if any bits were set. + if (mask != ImageOperandsMaskNone) + texArgs.insert(texArgs.begin() + optArgNum, mask); // // Set up the instruction @@ -2096,7 +3112,6 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, opCode = OpImageSparseFetch; else opCode = OpImageFetch; -#ifndef GLSLANG_WEB } else if (parameters.granularity && parameters.coarse) { opCode = OpImageSampleFootprintNV; } else if (gather) { @@ -2110,7 +3125,6 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, opCode = OpImageSparseGather; else opCode = OpImageGather; -#endif } else if (explicitLod) { if (parameters.Dref) { if (proj) @@ -2189,14 +3203,15 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, // Build the SPIR-V instruction Instruction* textureInst = new Instruction(getUniqueId(), resultType, opCode); - for (int op = 0; op < optArgNum; ++op) + textureInst->reserveOperands(optArgNum + (texArgs.size() - (optArgNum + 1))); + for (size_t op = 0; op < optArgNum; ++op) textureInst->addIdOperand(texArgs[op]); - if (optArgNum < numArgs) + if (optArgNum < texArgs.size()) textureInst->addImmediateOperand(texArgs[optArgNum]); - for (int op = optArgNum + 1; op < numArgs; ++op) + for (size_t op = optArgNum + 1; op < texArgs.size(); ++op) textureInst->addIdOperand(texArgs[op]); setPrecision(textureInst->getResultId(), precision); - buildPoint->addInstruction(std::unique_ptr(textureInst)); + addInstruction(std::unique_ptr(textureInst)); Id resultId = textureInst->getResultId(); @@ -2276,7 +3291,7 @@ Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameter query->addIdOperand(parameters.coords); if (parameters.lod) query->addIdOperand(parameters.lod); - buildPoint->addInstruction(std::unique_ptr(query)); + addInstruction(std::unique_ptr(query)); addCapability(CapabilityImageQuery); return query->getResultId(); @@ -2356,7 +3371,7 @@ Id Builder::createCompositeCompare(Decoration precision, Id value1, Id value2, b Id Builder::createCompositeConstruct(Id typeId, const std::vector& constituents) { assert(isAggregateType(typeId) || (getNumTypeConstituents(typeId) > 1 && - getNumTypeConstituents(typeId) == (int)constituents.size())); + getNumTypeConstituents(typeId) == constituents.size())); if (generatingOpCodeForSpecConst) { // Sometime, even in spec-constant-op mode, the constant composite to be @@ -2372,10 +3387,27 @@ Id Builder::createCompositeConstruct(Id typeId, const std::vector& constitue [&](spv::Id id) { return isSpecConstant(id); })); } - Instruction* op = new Instruction(getUniqueId(), typeId, OpCompositeConstruct); - for (int c = 0; c < (int)constituents.size(); ++c) + bool replicate = false; + size_t numConstituents = constituents.size(); + + if (useReplicatedComposites) { + replicate = numConstituents > 0 && + std::equal(constituents.begin() + 1, constituents.end(), constituents.begin()); + } + + if (replicate) { + numConstituents = 1; + addCapability(spv::CapabilityReplicatedCompositesEXT); + addExtension(spv::E_SPV_EXT_replicated_composites); + } + + Op opcode = replicate ? OpCompositeConstructReplicateEXT : OpCompositeConstruct; + + Instruction* op = new Instruction(getUniqueId(), typeId, opcode); + op->reserveOperands(constituents.size()); + for (size_t c = 0; c < numConstituents; ++c) op->addIdOperand(constituents[c]); - buildPoint->addInstruction(std::unique_ptr(op)); + addInstruction(std::unique_ptr(op)); return op->getResultId(); } @@ -2392,6 +3424,12 @@ Id Builder::createConstructor(Decoration precision, const std::vector& sourc if (sources.size() == 1 && isScalar(sources[0]) && numTargetComponents > 1) return smearScalar(precision, sources[0], resultTypeId); + // Special case: 2 vectors of equal size + if (sources.size() == 1 && isVector(sources[0]) && numTargetComponents == getNumComponents(sources[0])) { + assert(resultTypeId == getTypeId(sources[0])); + return sources[0]; + } + // accumulate the arguments for OpCompositeConstruct std::vector constituents; Id scalarTypeId = getScalarTypeId(resultTypeId); @@ -2426,8 +3464,8 @@ Id Builder::createConstructor(Decoration precision, const std::vector& sourc if (sourcesToUse + targetComponent > numTargetComponents) sourcesToUse = numTargetComponents - targetComponent; - int col = 0; - int row = 0; + unsigned int col = 0; + unsigned int row = 0; for (unsigned int s = 0; s < sourcesToUse; ++s) { if (row >= getNumRows(sourceArg)) { row = 0; @@ -2459,26 +3497,24 @@ Id Builder::createConstructor(Decoration precision, const std::vector& sourc } // If the result is a vector, make it from the gathered constituents. - if (constituents.size() > 0) + if (constituents.size() > 0) { result = createCompositeConstruct(resultTypeId, constituents); - - return setPrecision(result, precision); + return setPrecision(result, precision); + } else { + // Precision was set when generating this component. + return result; + } } // Comments in header Id Builder::createMatrixConstructor(Decoration precision, const std::vector& sources, Id resultTypeId) { Id componentTypeId = getScalarTypeId(resultTypeId); - int numCols = getTypeNumColumns(resultTypeId); - int numRows = getTypeNumRows(resultTypeId); + unsigned int numCols = getTypeNumColumns(resultTypeId); + unsigned int numRows = getTypeNumRows(resultTypeId); Instruction* instr = module.getInstruction(componentTypeId); -#ifdef GLSLANG_WEB - const unsigned bitCount = 32; - assert(bitCount == instr->getImmediateOperand(0)); -#else const unsigned bitCount = instr->getImmediateOperand(0); -#endif // Optimize matrix constructed from a bigger matrix if (isMatrix(sources[0]) && getNumColumns(sources[0]) >= numCols && getNumRows(sources[0]) >= numRows) { @@ -2490,11 +3526,11 @@ Id Builder::createMatrixConstructor(Decoration precision, const std::vector& Id sourceColumnTypeId = getContainedTypeId(getTypeId(matrix)); std::vector channels; - for (int row = 0; row < numRows; ++row) + for (unsigned int row = 0; row < numRows; ++row) channels.push_back(row); std::vector matrixColumns; - for (int col = 0; col < numCols; ++col) { + for (unsigned int col = 0; col < numCols; ++col) { std::vector indexes; indexes.push_back(col); Id colv = createCompositeExtract(matrix, sourceColumnTypeId, indexes); @@ -2510,6 +3546,13 @@ Id Builder::createMatrixConstructor(Decoration precision, const std::vector& return setPrecision(createCompositeConstruct(resultTypeId, matrixColumns), precision); } + // Detect a matrix being constructed from a repeated vector of the correct size. + // Create the composite directly from it. + if (sources.size() == numCols && isVector(sources[0]) && getNumComponents(sources[0]) == numRows && + std::equal(sources.begin() + 1, sources.end(), sources.begin())) { + return setPrecision(createCompositeConstruct(resultTypeId, sources), precision); + } + // Otherwise, will use a two step process // 1. make a compile-time 2D array of values // 2. construct a matrix from that array @@ -2537,12 +3580,12 @@ Id Builder::createMatrixConstructor(Decoration precision, const std::vector& } else if (isMatrix(sources[0])) { // constructing from another matrix; copy over the parts that exist in both the argument and constructee Id matrix = sources[0]; - int minCols = std::min(numCols, getNumColumns(matrix)); - int minRows = std::min(numRows, getNumRows(matrix)); - for (int col = 0; col < minCols; ++col) { + unsigned int minCols = std::min(numCols, getNumColumns(matrix)); + unsigned int minRows = std::min(numRows, getNumRows(matrix)); + for (unsigned int col = 0; col < minCols; ++col) { std::vector indexes; indexes.push_back(col); - for (int row = 0; row < minRows; ++row) { + for (unsigned int row = 0; row < minRows; ++row) { indexes.push_back(row); ids[col][row] = createCompositeExtract(matrix, componentTypeId, indexes); indexes.pop_back(); @@ -2551,12 +3594,12 @@ Id Builder::createMatrixConstructor(Decoration precision, const std::vector& } } else { // fill in the matrix in column-major order with whatever argument components are available - int row = 0; - int col = 0; + unsigned int row = 0; + unsigned int col = 0; - for (int arg = 0; arg < (int)sources.size() && col < numCols; ++arg) { + for (unsigned int arg = 0; arg < sources.size() && col < numCols; ++arg) { Id argComp = sources[arg]; - for (int comp = 0; comp < getNumComponents(sources[arg]); ++comp) { + for (unsigned int comp = 0; comp < getNumComponents(sources[arg]); ++comp) { if (getNumComponents(sources[arg]) > 1) { argComp = createCompositeExtract(sources[arg], componentTypeId, comp); setPrecision(argComp, precision); @@ -2580,9 +3623,9 @@ Id Builder::createMatrixConstructor(Decoration precision, const std::vector& // make the column vectors Id columnTypeId = getContainedTypeId(resultTypeId); std::vector matrixColumns; - for (int col = 0; col < numCols; ++col) { + for (unsigned int col = 0; col < numCols; ++col) { std::vector vectorComponents; - for (int row = 0; row < numRows; ++row) + for (unsigned int row = 0; row < numRows; ++row) vectorComponents.push_back(ids[col][row]); Id column = createCompositeConstruct(columnTypeId, vectorComponents); setPrecision(column, precision); @@ -2598,7 +3641,7 @@ Builder::If::If(Id cond, unsigned int ctrl, Builder& gb) : builder(gb), condition(cond), control(ctrl), - elseBlock(0) + elseBlock(nullptr) { function = &builder.getBuildPoint()->getParent(); @@ -2667,6 +3710,7 @@ void Builder::makeSwitch(Id selector, unsigned int control, int numSegments, con // make the switch instruction Instruction* switchInst = new Instruction(NoResult, NoType, OpSwitch); + switchInst->reserveOperands((caseValues.size() * 2) + 2); switchInst->addIdOperand(selector); auto defaultOrMerge = (defaultSegment >= 0) ? segmentBlocks[defaultSegment] : mergeBlock; switchInst->addIdOperand(defaultOrMerge->getId()); @@ -2676,7 +3720,7 @@ void Builder::makeSwitch(Id selector, unsigned int control, int numSegments, con switchInst->addIdOperand(segmentBlocks[valueIndexToSegment[i]]->getId()); segmentBlocks[valueIndexToSegment[i]]->addPredecessor(buildPoint); } - buildPoint->addInstruction(std::unique_ptr(switchInst)); + addInstruction(std::unique_ptr(switchInst)); // push the merge block switchMerges.push(mergeBlock); @@ -2808,7 +3852,7 @@ void Builder::accessChainStore(Id rvalue, Decoration nonUniform, spv::MemoryAcce // If a swizzle exists and is not full and is not dynamic, then the swizzle will be broken into individual stores. if (accessChain.swizzle.size() > 0 && - getNumTypeComponents(getResultingAccessChainType()) != (int)accessChain.swizzle.size() && + getNumTypeComponents(getResultingAccessChainType()) != accessChain.swizzle.size() && accessChain.component == NoResult) { for (unsigned int i = 0; i < accessChain.swizzle.size(); ++i) { accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle[i])); @@ -3128,7 +4172,7 @@ void Builder::simplifyAccessChainSwizzle() { // If the swizzle has fewer components than the vector, it is subsetting, and must stay // to preserve that fact. - if (getNumTypeComponents(accessChain.preSwizzleBaseType) > (int)accessChain.swizzle.size()) + if (getNumTypeComponents(accessChain.preSwizzleBaseType) > accessChain.swizzle.size()) return; // if components are out of order, it is a swizzle @@ -3195,37 +4239,40 @@ void Builder::createBranch(Block* block) { Instruction* branch = new Instruction(OpBranch); branch->addIdOperand(block->getId()); - buildPoint->addInstruction(std::unique_ptr(branch)); + addInstruction(std::unique_ptr(branch)); block->addPredecessor(buildPoint); } void Builder::createSelectionMerge(Block* mergeBlock, unsigned int control) { Instruction* merge = new Instruction(OpSelectionMerge); + merge->reserveOperands(2); merge->addIdOperand(mergeBlock->getId()); merge->addImmediateOperand(control); - buildPoint->addInstruction(std::unique_ptr(merge)); + addInstruction(std::unique_ptr(merge)); } void Builder::createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control, const std::vector& operands) { Instruction* merge = new Instruction(OpLoopMerge); + merge->reserveOperands(operands.size() + 3); merge->addIdOperand(mergeBlock->getId()); merge->addIdOperand(continueBlock->getId()); merge->addImmediateOperand(control); for (int op = 0; op < (int)operands.size(); ++op) merge->addImmediateOperand(operands[op]); - buildPoint->addInstruction(std::unique_ptr(merge)); + addInstruction(std::unique_ptr(merge)); } void Builder::createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock) { Instruction* branch = new Instruction(OpBranchConditional); + branch->reserveOperands(3); branch->addIdOperand(condition); branch->addIdOperand(thenBlock->getId()); branch->addIdOperand(elseBlock->getId()); - buildPoint->addInstruction(std::unique_ptr(branch)); + addInstruction(std::unique_ptr(branch)); thenBlock->addPredecessor(buildPoint); elseBlock->addPredecessor(buildPoint); } @@ -3240,10 +4287,11 @@ void Builder::dumpSourceInstructions(const spv::Id fileId, const std::string& te const int opSourceWordCount = 4; const int nonNullBytesPerInstruction = 4 * (maxWordCount - opSourceWordCount) - 1; - if (source != SourceLanguageUnknown) { + if (sourceLang != SourceLanguageUnknown) { // OpSource Language Version File Source Instruction sourceInst(NoResult, NoType, OpSource); - sourceInst.addImmediateOperand(source); + sourceInst.reserveOperands(3); + sourceInst.addImmediateOperand(sourceLang); sourceInst.addImmediateOperand(sourceVersion); // File operand if (fileId != NoResult) { @@ -3276,7 +4324,8 @@ void Builder::dumpSourceInstructions(const spv::Id fileId, const std::string& te // Dump an OpSource[Continued] sequence for the source and every include file void Builder::dumpSourceInstructions(std::vector& out) const { - dumpSourceInstructions(sourceFileStringId, sourceText, out); + if (emitNonSemanticShaderDebugInfo) return; + dumpSourceInstructions(mainFileId, sourceText, out); for (auto iItr = includeFiles.begin(); iItr != includeFiles.end(); ++iItr) dumpSourceInstructions(iItr->first, *iItr->second, out); } @@ -3298,4 +4347,4 @@ void Builder::dumpModuleProcesses(std::vector& out) const } } -}; // end spv namespace +} // end spv namespace diff --git a/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.h b/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.h index 251b9ee82..08057f439 100644 --- a/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.h +++ b/libraries/ZVulkan/src/glslang/spirv/SpvBuilder.h @@ -50,6 +50,10 @@ #include "Logger.h" #include "spirv.hpp" #include "spvIR.h" +namespace spv { + #include "GLSL.ext.KHR.h" + #include "NonSemanticShaderDebugInfo100.h" +} #include #include @@ -82,7 +86,7 @@ public: void setSource(spv::SourceLanguage lang, int version) { - source = lang; + sourceLang = lang; sourceVersion = version; } spv::Id getStringId(const std::string& str) @@ -99,14 +103,54 @@ public: stringIds[file_c_str] = strId; return strId; } - void setSourceFile(const std::string& file) + + spv::Id getMainFileId() const { return mainFileId; } + + // Initialize the main source file name + void setDebugSourceFile(const std::string& file) { - sourceFileStringId = getStringId(file); + if (trackDebugInfo) { + dirtyLineTracker = true; + mainFileId = getStringId(file); + currentFileId = mainFileId; + } } + + // Set the debug source location tracker in the builder. + // The upcoming instructions in basic blocks will be associated to this location. + void setDebugSourceLocation(int line, const char* filename) + { + if (trackDebugInfo) { + dirtyLineTracker = true; + if (line != 0) { + // TODO: This is special handling of some AST nodes having (untracked) line 0. + // But they should have a valid line number. + currentLine = line; + if (filename) { + currentFileId = getStringId(filename); + } + } + } + } + void setSourceText(const std::string& text) { sourceText = text; } void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); } void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); } - void setEmitOpLines() { emitOpLines = true; } + void setEmitSpirvDebugInfo() + { + trackDebugInfo = true; + emitSpirvDebugInfo = true; + } + void setEmitNonSemanticShaderDebugInfo(bool emitSourceText) + { + trackDebugInfo = true; + emitNonSemanticShaderDebugInfo = true; + importNonSemanticShaderDebugInfoInstructions(); + + if (emitSourceText) { + emitNonSemanticShaderDebugSource = emitSourceText; + } + } void addExtension(const char* ext) { extensions.insert(ext); } void removeExtension(const char* ext) { @@ -147,19 +191,6 @@ public: return id; } - // Generate OpLine for non-filename-based #line directives (ie no filename - // seen yet): Log the current line, and if different than the last one, - // issue a new OpLine using the new line and current source file name. - void setLine(int line); - - // If filename null, generate OpLine for non-filename-based line directives, - // else do filename-based: Log the current line and file, and if different - // than the last one, issue a new OpLine using the new line and file - // name. - void setLine(int line, const char* filename); - // Low-level OpLine. See setLine() for a layered helper. - void addLine(Id fileName, int line, int column); - // For creating new types (will return old type if the requested one was already made). Id makeVoidType(); Id makeBoolType(); @@ -170,7 +201,7 @@ public: Id makeIntType(int width) { return makeIntegerType(width, true); } Id makeUintType(int width) { return makeIntegerType(width, false); } Id makeFloatType(int width); - Id makeStructType(const std::vector& members, const char*); + Id makeStructType(const std::vector& members, const char* name, bool const compilerGenerated = true); Id makeStructResultType(Id type0, Id type1); Id makeVectorType(Id component, int size); Id makeMatrixType(Id component, int cols, int rows); @@ -180,12 +211,52 @@ public: Id makeImageType(Id sampledType, Dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format); Id makeSamplerType(); Id makeSampledImageType(Id imageType); - Id makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols); + Id makeCooperativeMatrixTypeKHR(Id component, Id scope, Id rows, Id cols, Id use); + Id makeCooperativeMatrixTypeNV(Id component, Id scope, Id rows, Id cols); + Id makeCooperativeMatrixTypeWithSameShape(Id component, Id otherType); + Id makeGenericType(spv::Op opcode, std::vector& operands); + + // SPIR-V NonSemantic Shader DebugInfo Instructions + struct DebugTypeLoc { + std::string name {}; + int line {0}; + int column {0}; + }; + std::unordered_map debugTypeLocs; + Id makeDebugInfoNone(); + Id makeBoolDebugType(int const size); + Id makeIntegerDebugType(int const width, bool const hasSign); + Id makeFloatDebugType(int const width); + Id makeSequentialDebugType(Id const baseType, Id const componentCount, NonSemanticShaderDebugInfo100Instructions const sequenceType); + Id makeArrayDebugType(Id const baseType, Id const componentCount); + Id makeVectorDebugType(Id const baseType, int const componentCount); + Id makeMatrixDebugType(Id const vectorType, int const vectorCount, bool columnMajor = true); + Id makeMemberDebugType(Id const memberType, DebugTypeLoc const& debugTypeLoc); + Id makeCompositeDebugType(std::vector const& memberTypes, char const*const name, + NonSemanticShaderDebugInfo100DebugCompositeType const tag, bool const isOpaqueType = false); + Id makePointerDebugType(StorageClass storageClass, Id const baseType); + Id makeForwardPointerDebugType(StorageClass storageClass); + Id makeDebugSource(const Id fileName); + Id makeDebugCompilationUnit(); + Id createDebugGlobalVariable(Id const type, char const*const name, Id const variable); + Id createDebugLocalVariable(Id type, char const*const name, size_t const argNumber = 0); + Id makeDebugExpression(); + Id makeDebugDeclare(Id const debugLocalVariable, Id const pointer); + Id makeDebugValue(Id const debugLocalVariable, Id const value); + Id makeDebugFunctionType(Id returnType, const std::vector& paramTypes); + Id makeDebugFunction(Function* function, Id nameId, Id funcTypeId); + Id makeDebugLexicalBlock(uint32_t line); + std::string unmangleFunctionName(std::string const& name) const; + void setupDebugFunctionEntry(Function* function, const char* name, int line, + const std::vector& paramTypes, + const std::vector& paramNames); // accelerationStructureNV type Id makeAccelerationStructureType(); // rayQueryEXT type Id makeRayQueryType(); + // hitObjectNV type + Id makeHitObjectNVType(); // For querying about types. Id getTypeId(Id resultId) const { return module.getTypeId(resultId); } @@ -193,9 +264,9 @@ public: Op getOpCode(Id id) const { return module.getInstruction(id)->getOpCode(); } Op getTypeClass(Id typeId) const { return getOpCode(typeId); } Op getMostBasicTypeClass(Id typeId) const; - int getNumComponents(Id resultId) const { return getNumTypeComponents(getTypeId(resultId)); } - int getNumTypeConstituents(Id typeId) const; - int getNumTypeComponents(Id typeId) const { return getNumTypeConstituents(typeId); } + unsigned int getNumComponents(Id resultId) const { return getNumTypeComponents(getTypeId(resultId)); } + unsigned int getNumTypeConstituents(Id typeId) const; + unsigned int getNumTypeComponents(Id typeId) const { return getNumTypeConstituents(typeId); } Id getScalarTypeId(Id typeId) const; Id getContainedTypeId(Id typeId) const; Id getContainedTypeId(Id typeId, int) const; @@ -203,6 +274,7 @@ public: ImageFormat getImageTypeFormat(Id typeId) const { return (ImageFormat)module.getInstruction(typeId)->getImmediateOperand(6); } Id getResultingAccessChainType() const; + Id getIdOperand(Id resultId, int idx) { return module.getInstruction(resultId)->getIdOperand(idx); } bool isPointer(Id resultId) const { return isPointerType(getTypeId(resultId)); } bool isScalar(Id resultId) const { return isScalarType(getTypeId(resultId)); } @@ -227,11 +299,10 @@ public: bool isMatrixType(Id typeId) const { return getTypeClass(typeId) == OpTypeMatrix; } bool isStructType(Id typeId) const { return getTypeClass(typeId) == OpTypeStruct; } bool isArrayType(Id typeId) const { return getTypeClass(typeId) == OpTypeArray; } -#ifdef GLSLANG_WEB - bool isCooperativeMatrixType(Id typeId)const { return false; } -#else - bool isCooperativeMatrixType(Id typeId)const { return getTypeClass(typeId) == OpTypeCooperativeMatrixNV; } -#endif + bool isCooperativeMatrixType(Id typeId)const + { + return getTypeClass(typeId) == OpTypeCooperativeMatrixKHR || getTypeClass(typeId) == OpTypeCooperativeMatrixNV; + } bool isAggregateType(Id typeId) const { return isArrayType(typeId) || isStructType(typeId) || isCooperativeMatrixType(typeId); } bool isImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeImage; } @@ -263,18 +334,18 @@ public: return module.getInstruction(scalarTypeId)->getImmediateOperand(0); } - int getTypeNumColumns(Id typeId) const + unsigned int getTypeNumColumns(Id typeId) const { assert(isMatrixType(typeId)); return getNumTypeConstituents(typeId); } - int getNumColumns(Id resultId) const { return getTypeNumColumns(getTypeId(resultId)); } - int getTypeNumRows(Id typeId) const + unsigned int getNumColumns(Id resultId) const { return getTypeNumColumns(getTypeId(resultId)); } + unsigned int getTypeNumRows(Id typeId) const { assert(isMatrixType(typeId)); return getNumTypeComponents(getContainedTypeId(typeId)); } - int getNumRows(Id resultId) const { return getTypeNumRows(getTypeId(resultId)); } + unsigned int getNumRows(Id resultId) const { return getTypeNumRows(getTypeId(resultId)); } Dim getTypeDimensionality(Id typeId) const { @@ -317,6 +388,8 @@ public: Id makeFloat16Constant(float f16, bool specConstant = false); Id makeFpConstant(Id type, double d, bool specConstant = false); + Id importNonSemanticShaderDebugInfoInstructions(); + // Turn the array of constants into a proper spv constant of the requested type. Id makeCompositeConstant(Id type, const std::vector& comps, bool specConst = false); @@ -331,6 +404,7 @@ public: void addDecoration(Id, Decoration, const char*); void addDecoration(Id, Decoration, const std::vector& literals); void addDecoration(Id, Decoration, const std::vector& strings); + void addLinkageDecoration(Id id, const char* name, spv::LinkageType linkType); void addDecorationId(Id id, Decoration, Id idDecoration); void addDecorationId(Id id, Decoration, const std::vector& operandIds); void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1); @@ -339,9 +413,19 @@ public: void addMemberDecoration(Id, unsigned int member, Decoration, const std::vector& strings); // At the end of what block do the next create*() instructions go? - void setBuildPoint(Block* bp) { buildPoint = bp; } + // Also reset current last DebugScope and current source line to unknown + void setBuildPoint(Block* bp) { + buildPoint = bp; + // TODO: Technically, change of build point should set line tracker dirty. But we'll have bad line info for + // branch instructions. Commenting this for now because at least this matches the old behavior. + dirtyScopeTracker = true; + } Block* getBuildPoint() const { return buildPoint; } + // Append an instruction to the end of the current build point. + // Optionally, additional debug info instructions may also be prepended. + void addInstruction(std::unique_ptr inst); + // Make the entry-point function. The returned pointer is only valid // for the lifetime of this builder. Function* makeEntryPoint(const char*); @@ -349,13 +433,23 @@ public: // Make a shader-style function, and create its entry block if entry is non-zero. // Return the function, pass back the entry. // The returned pointer is only valid for the lifetime of this builder. - Function* makeFunctionEntry(Decoration precision, Id returnType, const char* name, - const std::vector& paramTypes, const std::vector>& precisions, Block **entry = 0); + Function* makeFunctionEntry(Decoration precision, Id returnType, const char* name, LinkageType linkType, + const std::vector& paramTypes, + const std::vector>& precisions, Block** entry = nullptr); // Create a return. An 'implicit' return is one not appearing in the source // code. In the case of an implicit return, no post-return block is inserted. void makeReturn(bool implicit, Id retVal = 0); + // Initialize state and generate instructions for new lexical scope + void enterLexicalBlock(uint32_t line); + + // Set state and generate instructions to exit current lexical scope + void leaveLexicalBlock(); + + // Prepare builder for generation of instructions for a function. + void enterFunction(Function const* function); + // Generate all the code needed to finish up a function. void leaveFunction(); @@ -363,9 +457,13 @@ public: // discard, terminate-invocation, terminateRayEXT, or ignoreIntersectionEXT void makeStatementTerminator(spv::Op opcode, const char *name); + // Create block terminator instruction for statements that have input operands + // such as OpEmitMeshTasksEXT + void makeStatementTerminator(spv::Op opcode, const std::vector& operands, const char* name); + // Create a global or function local or IO variable. - Id createVariable(Decoration precision, StorageClass, Id type, const char* name = nullptr, - Id initializer = NoResult); + Id createVariable(Decoration precision, StorageClass storageClass, Id type, const char* name = nullptr, + Id initializer = NoResult, bool const compilerGenerated = true); // Create an intermediate with an undefined value. Id createUndefined(Id type); @@ -385,8 +483,10 @@ public: // Create an OpArrayLength instruction Id createArrayLength(Id base, unsigned int member); + // Create an OpCooperativeMatrixLengthKHR instruction + Id createCooperativeMatrixLengthKHR(Id type); // Create an OpCooperativeMatrixLengthNV instruction - Id createCooperativeMatrixLength(Id type); + Id createCooperativeMatrixLengthNV(Id type); // Create an OpCompositeExtract instruction Id createCompositeExtract(Id composite, Id typeId, unsigned index); @@ -621,11 +721,6 @@ public: // Accumulate whether anything in the chain of structures has coherent decorations. struct CoherentFlags { CoherentFlags() { clear(); } -#ifdef GLSLANG_WEB - void clear() { } - bool isVolatile() const { return false; } - CoherentFlags operator |=(const CoherentFlags &other) { return *this; } -#else bool isVolatile() const { return volatil; } bool isNonUniform() const { return nonUniform; } bool anyCoherent() const { @@ -670,7 +765,6 @@ public: nonUniform |= other.nonUniform; return *this; } -#endif }; CoherentFlags coherentFlags; }; @@ -751,19 +845,19 @@ public: // Add capabilities, extensions, remove unneeded decorations, etc., // based on the resulting SPIR-V. - void postProcess(); + void postProcess(bool compileOnly); // Prune unreachable blocks in the CFG and remove unneeded decorations. void postProcessCFG(); -#ifndef GLSLANG_WEB // Add capabilities, extensions based on instructions in the module. void postProcessFeatures(); // Hook to visit each instruction in a block in a function void postProcess(Instruction&); // Hook to visit each non-32-bit sized float/int operation in a block. void postProcessType(const Instruction&, spv::Id typeId); -#endif + // move OpSampledImage instructions to be next to their users. + void postProcessSamplers(); void dump(std::vector&) const; @@ -779,6 +873,8 @@ public: // Check if the builder is generating code for spec constants. bool isInSpecConstCodeGenMode() { return generatingOpCodeForSpecConst; } + void setUseReplicatedComposites(bool use) { useReplicatedComposites = use; } + protected: Id makeIntConstant(Id typeId, unsigned value, bool specConstant); Id makeInt64Constant(Id typeId, unsigned long long value, bool specConstant); @@ -800,13 +896,39 @@ public: const; unsigned int spvVersion; // the version of SPIR-V to emit in the header - SourceLanguage source; + SourceLanguage sourceLang; int sourceVersion; - spv::Id sourceFileStringId; + spv::Id nonSemanticShaderCompilationUnitId {0}; + spv::Id nonSemanticShaderDebugInfo {0}; + spv::Id debugInfoNone {0}; + spv::Id debugExpression {0}; // Debug expression with zero operations. std::string sourceText; - int currentLine; - const char* currentFile; - bool emitOpLines; + + // True if an new OpLine/OpDebugLine may need to be inserted. Either: + // 1. The current debug location changed + // 2. The current build point changed + bool dirtyLineTracker; + int currentLine = 0; + // OpString id of the current file name. Always 0 if debug info is off. + spv::Id currentFileId = 0; + // OpString id of the main file name. Always 0 if debug info is off. + spv::Id mainFileId = 0; + + // True if an new OpDebugScope may need to be inserted. Either: + // 1. A new lexical block is pushed + // 2. The current build point changed + bool dirtyScopeTracker; + std::stack currentDebugScopeId; + + // This flag toggles tracking of debug info while building the SPIR-V. + bool trackDebugInfo = false; + // This flag toggles emission of SPIR-V debug instructions, like OpLine and OpSource. + bool emitSpirvDebugInfo = false; + // This flag toggles emission of Non-Semantic Debug extension debug instructions. + bool emitNonSemanticShaderDebugInfo = false; + bool restoreNonSemanticShaderDebugInfo = false; + bool emitNonSemanticShaderDebugSource = false; + std::set extensions; std::vector sourceExtensions; std::vector moduleProcesses; @@ -819,6 +941,7 @@ public: Id uniqueId; Function* entryPointFunction; bool generatingOpCodeForSpecConst; + bool useReplicatedComposites { false }; AccessChain accessChain; // special blocks of instructions for output @@ -840,6 +963,8 @@ public: std::unordered_map> groupedStructConstants; // map type opcodes to type instructions std::unordered_map> groupedTypes; + // map type opcodes to debug type instructions + std::unordered_map> groupedDebugTypes; // list of OpConstantNull instructions std::vector nullConstants; @@ -855,6 +980,12 @@ public: // map from include file name ids to their contents std::map includeFiles; + // map from core id to debug id + std::map debugId; + + // map from file name string id to DebugSource id + std::unordered_map debugSourceId; + // The stream for outputting warnings and errors. SpvBuildLogger* logger; }; // end Builder class diff --git a/libraries/ZVulkan/src/glslang/spirv/SpvPostProcess.cpp b/libraries/ZVulkan/src/glslang/spirv/SpvPostProcess.cpp index 23d7b5a46..5b3fbb565 100644 --- a/libraries/ZVulkan/src/glslang/spirv/SpvPostProcess.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/SpvPostProcess.cpp @@ -44,21 +44,20 @@ #include #include "SpvBuilder.h" - #include "spirv.hpp" -#include "GlslangToSpv.h" -#include "SpvBuilder.h" + namespace spv { #include "GLSL.std.450.h" #include "GLSL.ext.KHR.h" #include "GLSL.ext.EXT.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "GLSL.ext.QCOM.h" } namespace spv { -#ifndef GLSLANG_WEB // Hook to visit each operand type and result type of an instruction. // Will be called multiple times for one instruction, once for each typed // operand and the result. @@ -113,8 +112,6 @@ void Builder::postProcessType(const Instruction& inst, Id typeId) } } break; - case OpAccessChain: - case OpPtrAccessChain: case OpCopyObject: break; case OpFConvert: @@ -161,26 +158,44 @@ void Builder::postProcessType(const Instruction& inst, Id typeId) switch (inst.getImmediateOperand(1)) { case GLSLstd450Frexp: case GLSLstd450FrexpStruct: - if (getSpvVersion() < glslang::EShTargetSpv_1_3 && containsType(typeId, OpTypeInt, 16)) + if (getSpvVersion() < spv::Spv_1_3 && containsType(typeId, OpTypeInt, 16)) addExtension(spv::E_SPV_AMD_gpu_shader_int16); break; case GLSLstd450InterpolateAtCentroid: case GLSLstd450InterpolateAtSample: case GLSLstd450InterpolateAtOffset: - if (getSpvVersion() < glslang::EShTargetSpv_1_3 && containsType(typeId, OpTypeFloat, 16)) + if (getSpvVersion() < spv::Spv_1_3 && containsType(typeId, OpTypeFloat, 16)) addExtension(spv::E_SPV_AMD_gpu_shader_half_float); break; default: break; } break; + case OpAccessChain: + case OpPtrAccessChain: + if (isPointerType(typeId)) + break; + if (basicTypeOp == OpTypeInt) { + if (width == 16) + addCapability(CapabilityInt16); + else if (width == 8) + addCapability(CapabilityInt8); + } + break; default: - if (basicTypeOp == OpTypeFloat && width == 16) - addCapability(CapabilityFloat16); - if (basicTypeOp == OpTypeInt && width == 16) - addCapability(CapabilityInt16); - if (basicTypeOp == OpTypeInt && width == 8) - addCapability(CapabilityInt8); + if (basicTypeOp == OpTypeInt) { + if (width == 16) + addCapability(CapabilityInt16); + else if (width == 8) + addCapability(CapabilityInt8); + else if (width == 64) + addCapability(CapabilityInt64); + } else if (basicTypeOp == OpTypeFloat) { + if (width == 16) + addCapability(CapabilityFloat16); + else if (width == 64) + addCapability(CapabilityFloat64); + } break; } } @@ -320,7 +335,6 @@ void Builder::postProcess(Instruction& inst) } } } -#endif // comment in header void Builder::postProcessCFG() @@ -381,7 +395,6 @@ void Builder::postProcessCFG() decorations.end()); } -#ifndef GLSLANG_WEB // comment in header void Builder::postProcessFeatures() { // Add per-instruction capabilities, extensions, etc., @@ -469,14 +482,68 @@ void Builder::postProcessFeatures() { } } } -#endif + +// SPIR-V requires that any instruction consuming the result of an OpSampledImage +// be in the same block as the OpSampledImage instruction. This pass goes finds +// uses of OpSampledImage where that is not the case and duplicates the +// OpSampledImage to be immediately before the instruction that consumes it. +// The old OpSampledImage is left in place, potentially with no users. +void Builder::postProcessSamplers() +{ + // first, find all OpSampledImage instructions and store them in a map. + std::map sampledImageInstrs; + for (auto f: module.getFunctions()) { + for (auto b: f->getBlocks()) { + for (auto &i: b->getInstructions()) { + if (i->getOpCode() == spv::OpSampledImage) { + sampledImageInstrs[i->getResultId()] = i.get(); + } + } + } + } + // next find all uses of the given ids and rewrite them if needed. + for (auto f: module.getFunctions()) { + for (auto b: f->getBlocks()) { + auto &instrs = b->getInstructions(); + for (size_t idx = 0; idx < instrs.size(); idx++) { + Instruction *i = instrs[idx].get(); + for (int opnum = 0; opnum < i->getNumOperands(); opnum++) { + // Is this operand of the current instruction the result of an OpSampledImage? + if (i->isIdOperand(opnum) && + sampledImageInstrs.count(i->getIdOperand(opnum))) + { + Instruction *opSampImg = sampledImageInstrs[i->getIdOperand(opnum)]; + if (i->getBlock() != opSampImg->getBlock()) { + Instruction *newInstr = new Instruction(getUniqueId(), + opSampImg->getTypeId(), + spv::OpSampledImage); + newInstr->addIdOperand(opSampImg->getIdOperand(0)); + newInstr->addIdOperand(opSampImg->getIdOperand(1)); + newInstr->setBlock(b); + + // rewrite the user of the OpSampledImage to use the new instruction. + i->setIdOperand(opnum, newInstr->getResultId()); + // insert the new OpSampledImage right before the current instruction. + instrs.insert(instrs.begin() + idx, + std::unique_ptr(newInstr)); + idx++; + } + } + } + } + } + } +} // comment in header -void Builder::postProcess() { - postProcessCFG(); -#ifndef GLSLANG_WEB - postProcessFeatures(); -#endif +void Builder::postProcess(bool compileOnly) +{ + // postProcessCFG needs an entrypoint to determine what is reachable, but if we are not creating an "executable" shader, we don't have an entrypoint + if (!compileOnly) + postProcessCFG(); + + postProcessFeatures(); + postProcessSamplers(); } }; // end spv namespace diff --git a/libraries/ZVulkan/src/glslang/spirv/SpvTools.cpp b/libraries/ZVulkan/src/glslang/spirv/SpvTools.cpp index 8acf9b139..ff04f4f96 100644 --- a/libraries/ZVulkan/src/glslang/spirv/SpvTools.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/SpvTools.cpp @@ -68,6 +68,8 @@ spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLog } case glslang::EShTargetVulkan_1_2: return spv_target_env::SPV_ENV_VULKAN_1_2; + case glslang::EShTargetVulkan_1_3: + return spv_target_env::SPV_ENV_VULKAN_1_3; default: break; } @@ -210,6 +212,7 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass()); if (options->optimizeSize) { optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass()); + optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsSafePass()); } optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); optimizer.RegisterPass(spvtools::CreateCFGCleanupPass()); @@ -220,6 +223,56 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); } +bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, + spv::SpvBuildLogger*) +{ + spvtools::Optimizer optimizer(target_env); + optimizer.SetMessageConsumer(OptimizerMesssageConsumer); + + optimizer.RegisterPass(spvtools::CreateAnalyzeLiveInputPass(live_locs, live_builtins)); + + spvtools::OptimizerOptions spvOptOptions; + optimizer.SetTargetEnv(target_env); + spvOptOptions.set_run_validator(false); + return optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); +} + +void SpirvToolsEliminateDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, + spv::SpvBuildLogger*) +{ + spvtools::Optimizer optimizer(target_env); + optimizer.SetMessageConsumer(OptimizerMesssageConsumer); + + optimizer.RegisterPass(spvtools::CreateEliminateDeadOutputStoresPass(live_locs, live_builtins)); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass(false, true)); + optimizer.RegisterPass(spvtools::CreateEliminateDeadOutputComponentsPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass(false, true)); + + spvtools::OptimizerOptions spvOptOptions; + optimizer.SetTargetEnv(target_env); + spvOptOptions.set_run_validator(false); + optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); +} + +void SpirvToolsEliminateDeadInputComponents(spv_target_env target_env, std::vector& spirv, + spv::SpvBuildLogger*) +{ + spvtools::Optimizer optimizer(target_env); + optimizer.SetMessageConsumer(OptimizerMesssageConsumer); + + optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + + spvtools::OptimizerOptions spvOptOptions; + optimizer.SetTargetEnv(target_env); + spvOptOptions.set_run_validator(false); + optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); +} + // Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V. This is implicitly done by // SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if // optimization is disabled. diff --git a/libraries/ZVulkan/src/glslang/spirv/SpvTools.h b/libraries/ZVulkan/src/glslang/spirv/SpvTools.h index d856c5236..3ef053d73 100644 --- a/libraries/ZVulkan/src/glslang/spirv/SpvTools.h +++ b/libraries/ZVulkan/src/glslang/spirv/SpvTools.h @@ -48,23 +48,16 @@ #endif #include "../glslang/MachineIndependent/localintermediate.h" +#include "GlslangToSpv.h" #include "Logger.h" namespace glslang { -struct SpvOptions { - SpvOptions() : generateDebugInfo(false), stripDebugInfo(false), disableOptimizer(true), - optimizeSize(false), disassemble(false), validate(false) { } - bool generateDebugInfo; - bool stripDebugInfo; - bool disableOptimizer; - bool optimizeSize; - bool disassemble; - bool validate; -}; - #if ENABLE_OPT +// Translate glslang's view of target versioning to what SPIRV-Tools uses. +spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger); + // Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment. void SpirvToolsDisassemble(std::ostream& out, const std::vector& spirv); @@ -80,6 +73,22 @@ void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector< void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector& spirv, spv::SpvBuildLogger*, const SpvOptions*); +// Apply the SPIRV-Tools EliminateDeadInputComponents pass to generated SPIR-V. Put result in |spirv|. +void SpirvToolsEliminateDeadInputComponents(spv_target_env target_env, std::vector& spirv, + spv::SpvBuildLogger*); + +// Apply the SPIRV-Tools AnalyzeDeadOutputStores pass to generated SPIR-V. Put result in |live_locs|. +// Return true if the result is valid. +bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, spv::SpvBuildLogger*); + +// Apply the SPIRV-Tools EliminateDeadOutputStores and AggressiveDeadCodeElimination passes to generated SPIR-V using +// |live_locs|. Put result in |spirv|. +void SpirvToolsEliminateDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, spv::SpvBuildLogger*); + // Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V. This is implicitly done by // SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if // optimization is disabled. diff --git a/libraries/ZVulkan/src/glslang/spirv/disassemble.cpp b/libraries/ZVulkan/src/glslang/spirv/disassemble.cpp index 73c988c5b..ab77610c4 100644 --- a/libraries/ZVulkan/src/glslang/spirv/disassemble.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/disassemble.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include "disassemble.h" #include "doc.h" @@ -53,6 +54,9 @@ namespace spv { #include "GLSL.std.450.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "NonSemanticShaderDebugInfo100.h" + #include "GLSL.ext.QCOM.h" } } const char* GlslStd450DebugNames[spv::GLSLstd450Count]; @@ -61,6 +65,7 @@ namespace spv { static const char* GLSLextAMDGetDebugNames(const char*, unsigned); static const char* GLSLextNVGetDebugNames(const char*, unsigned); +static const char* NonSemanticShaderDebugInfo100GetDebugNames(unsigned); static void Kill(std::ostream& out, const char* message) { @@ -75,6 +80,8 @@ enum ExtInstSet { GLSLextNVInst, OpenCLExtInst, NonSemanticDebugPrintfExtInst, + NonSemanticDebugBreakExtInst, + NonSemanticShaderDebugInfo100 }; // Container class for a single instance of a SPIR-V stream, with methods for disassembly. @@ -100,6 +107,7 @@ protected: void outputMask(OperandClass operandClass, unsigned mask); void disassembleImmediates(int numOperands); void disassembleIds(int numOperands); + std::pair decodeString(); int disassembleString(); void disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands); @@ -290,31 +298,44 @@ void SpirvStream::disassembleIds(int numOperands) } } -// return the number of operands consumed by the string -int SpirvStream::disassembleString() +// decode string from words at current position (non-consuming) +std::pair SpirvStream::decodeString() { - int startWord = word; - - out << " \""; - - const char* wordString; + std::string res; + int wordPos = word; + char c; bool done = false; + do { - unsigned int content = stream[word]; - wordString = (const char*)&content; + unsigned int content = stream[wordPos]; for (int charCount = 0; charCount < 4; ++charCount) { - if (*wordString == 0) { + c = content & 0xff; + content >>= 8; + if (c == '\0') { done = true; break; } - out << *(wordString++); + res += c; } - ++word; - } while (! done); + ++wordPos; + } while(! done); + return std::make_pair(wordPos - word, res); +} + +// return the number of operands consumed by the string +int SpirvStream::disassembleString() +{ + out << " \""; + + std::pair decoderes = decodeString(); + + out << decoderes.second; out << "\""; - return word - startWord; + word += decoderes.first; + + return decoderes.first; } void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, int numOperands) @@ -331,7 +352,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, nextNestedControl = 0; } } else if (opCode == OpExtInstImport) { - idDescriptor[resultId] = (const char*)(&stream[word]); + idDescriptor[resultId] = decodeString().second; } else { if (resultId != 0 && idDescriptor[resultId].size() == 0) { @@ -340,7 +361,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, switch (stream[word]) { case 8: idDescriptor[resultId] = "int8_t"; break; case 16: idDescriptor[resultId] = "int16_t"; break; - default: assert(0); // fallthrough + default: assert(0); [[fallthrough]]; case 32: idDescriptor[resultId] = "int"; break; case 64: idDescriptor[resultId] = "int64_t"; break; } @@ -348,7 +369,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, case OpTypeFloat: switch (stream[word]) { case 16: idDescriptor[resultId] = "float16_t"; break; - default: assert(0); // fallthrough + default: assert(0); [[fallthrough]]; case 32: idDescriptor[resultId] = "float"; break; case 64: idDescriptor[resultId] = "float64_t"; break; } @@ -428,7 +449,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, --numOperands; // Get names for printing "(XXX)" for readability, *after* this id if (opCode == OpName) - idDescriptor[stream[word - 1]] = (const char*)(&stream[word]); + idDescriptor[stream[word - 1]] = decodeString().second; break; case OperandVariableIds: disassembleIds(numOperands); @@ -486,6 +507,10 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, extInstSet = OpenCLExtInst; } else if (strcmp("NonSemantic.DebugPrintf", name) == 0) { extInstSet = NonSemanticDebugPrintfExtInst; + } else if (strcmp("NonSemantic.DebugBreak", name) == 0) { + extInstSet = NonSemanticDebugBreakExtInst; + } else if (strcmp("NonSemantic.Shader.DebugInfo.100", name) == 0) { + extInstSet = NonSemanticShaderDebugInfo100; } else if (strcmp(spv::E_SPV_AMD_shader_ballot, name) == 0 || strcmp(spv::E_SPV_AMD_shader_trinary_minmax, name) == 0 || strcmp(spv::E_SPV_AMD_shader_explicit_vertex_parameter, name) == 0 || @@ -494,7 +519,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, } else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 || strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 || strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 || - strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 || + strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 || strcmp(spv::E_SPV_NV_fragment_shader_barycentric, name) == 0 || strcmp(spv::E_SPV_NV_mesh_shader, name) == 0) { extInstSet = GLSLextNVInst; @@ -511,6 +536,10 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, out << "(" << GLSLextNVGetDebugNames(name, entrypoint) << ")"; } else if (extInstSet == NonSemanticDebugPrintfExtInst) { out << "(DebugPrintf)"; + } else if (extInstSet == NonSemanticDebugBreakExtInst) { + out << "(DebugBreak)"; + } else if (extInstSet == NonSemanticShaderDebugInfo100) { + out << "(" << NonSemanticShaderDebugInfo100GetDebugNames(entrypoint) << ")"; } } break; @@ -734,6 +763,59 @@ static const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint) return "Bad"; } +static const char* NonSemanticShaderDebugInfo100GetDebugNames(unsigned entrypoint) +{ + switch (entrypoint) { + case NonSemanticShaderDebugInfo100DebugInfoNone: return "DebugInfoNone"; + case NonSemanticShaderDebugInfo100DebugCompilationUnit: return "DebugCompilationUnit"; + case NonSemanticShaderDebugInfo100DebugTypeBasic: return "DebugTypeBasic"; + case NonSemanticShaderDebugInfo100DebugTypePointer: return "DebugTypePointer"; + case NonSemanticShaderDebugInfo100DebugTypeQualifier: return "DebugTypeQualifier"; + case NonSemanticShaderDebugInfo100DebugTypeArray: return "DebugTypeArray"; + case NonSemanticShaderDebugInfo100DebugTypeVector: return "DebugTypeVector"; + case NonSemanticShaderDebugInfo100DebugTypedef: return "DebugTypedef"; + case NonSemanticShaderDebugInfo100DebugTypeFunction: return "DebugTypeFunction"; + case NonSemanticShaderDebugInfo100DebugTypeEnum: return "DebugTypeEnum"; + case NonSemanticShaderDebugInfo100DebugTypeComposite: return "DebugTypeComposite"; + case NonSemanticShaderDebugInfo100DebugTypeMember: return "DebugTypeMember"; + case NonSemanticShaderDebugInfo100DebugTypeInheritance: return "DebugTypeInheritance"; + case NonSemanticShaderDebugInfo100DebugTypePtrToMember: return "DebugTypePtrToMember"; + case NonSemanticShaderDebugInfo100DebugTypeTemplate: return "DebugTypeTemplate"; + case NonSemanticShaderDebugInfo100DebugTypeTemplateParameter: return "DebugTypeTemplateParameter"; + case NonSemanticShaderDebugInfo100DebugTypeTemplateTemplateParameter: return "DebugTypeTemplateTemplateParameter"; + case NonSemanticShaderDebugInfo100DebugTypeTemplateParameterPack: return "DebugTypeTemplateParameterPack"; + case NonSemanticShaderDebugInfo100DebugGlobalVariable: return "DebugGlobalVariable"; + case NonSemanticShaderDebugInfo100DebugFunctionDeclaration: return "DebugFunctionDeclaration"; + case NonSemanticShaderDebugInfo100DebugFunction: return "DebugFunction"; + case NonSemanticShaderDebugInfo100DebugLexicalBlock: return "DebugLexicalBlock"; + case NonSemanticShaderDebugInfo100DebugLexicalBlockDiscriminator: return "DebugLexicalBlockDiscriminator"; + case NonSemanticShaderDebugInfo100DebugScope: return "DebugScope"; + case NonSemanticShaderDebugInfo100DebugNoScope: return "DebugNoScope"; + case NonSemanticShaderDebugInfo100DebugInlinedAt: return "DebugInlinedAt"; + case NonSemanticShaderDebugInfo100DebugLocalVariable: return "DebugLocalVariable"; + case NonSemanticShaderDebugInfo100DebugInlinedVariable: return "DebugInlinedVariable"; + case NonSemanticShaderDebugInfo100DebugDeclare: return "DebugDeclare"; + case NonSemanticShaderDebugInfo100DebugValue: return "DebugValue"; + case NonSemanticShaderDebugInfo100DebugOperation: return "DebugOperation"; + case NonSemanticShaderDebugInfo100DebugExpression: return "DebugExpression"; + case NonSemanticShaderDebugInfo100DebugMacroDef: return "DebugMacroDef"; + case NonSemanticShaderDebugInfo100DebugMacroUndef: return "DebugMacroUndef"; + case NonSemanticShaderDebugInfo100DebugImportedEntity: return "DebugImportedEntity"; + case NonSemanticShaderDebugInfo100DebugSource: return "DebugSource"; + case NonSemanticShaderDebugInfo100DebugFunctionDefinition: return "DebugFunctionDefinition"; + case NonSemanticShaderDebugInfo100DebugSourceContinued: return "DebugSourceContinued"; + case NonSemanticShaderDebugInfo100DebugLine: return "DebugLine"; + case NonSemanticShaderDebugInfo100DebugNoLine: return "DebugNoLine"; + case NonSemanticShaderDebugInfo100DebugBuildIdentifier: return "DebugBuildIdentifier"; + case NonSemanticShaderDebugInfo100DebugStoragePath: return "DebugStoragePath"; + case NonSemanticShaderDebugInfo100DebugEntryPoint: return "DebugEntryPoint"; + case NonSemanticShaderDebugInfo100DebugTypeMatrix: return "DebugTypeMatrix"; + default: return "Bad"; + } + + return "Bad"; +} + void Disassemble(std::ostream& out, const std::vector& stream) { SpirvStream SpirvStream(out, stream); diff --git a/libraries/ZVulkan/src/glslang/spirv/doc.cpp b/libraries/ZVulkan/src/glslang/spirv/doc.cpp index dbdf7077a..0105caa2e 100644 --- a/libraries/ZVulkan/src/glslang/spirv/doc.cpp +++ b/libraries/ZVulkan/src/glslang/spirv/doc.cpp @@ -1,5 +1,6 @@ // // Copyright (C) 2014-2015 LunarG, Inc. +// Copyright (C) 2022-2024 Arm Limited. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. // // All rights reserved. @@ -45,6 +46,7 @@ #include #include #include +#include namespace spv { extern "C" { @@ -53,6 +55,8 @@ namespace spv { #include "GLSL.ext.EXT.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "GLSL.ext.QCOM.h" } } @@ -97,6 +101,8 @@ const char* ExecutionModelString(int model) case 6: return "Kernel"; case ExecutionModelTaskNV: return "TaskNV"; case ExecutionModelMeshNV: return "MeshNV"; + case ExecutionModelTaskEXT: return "TaskEXT"; + case ExecutionModelMeshEXT: return "MeshEXT"; default: return "Bad"; @@ -173,28 +179,33 @@ const char* ExecutionModeString(int mode) case 31: return "ContractionOff"; case 32: return "Bad"; - case ExecutionModeInitializer: return "Initializer"; - case ExecutionModeFinalizer: return "Finalizer"; - case ExecutionModeSubgroupSize: return "SubgroupSize"; - case ExecutionModeSubgroupsPerWorkgroup: return "SubgroupsPerWorkgroup"; - case ExecutionModeSubgroupsPerWorkgroupId: return "SubgroupsPerWorkgroupId"; - case ExecutionModeLocalSizeId: return "LocalSizeId"; - case ExecutionModeLocalSizeHintId: return "LocalSizeHintId"; + case ExecutionModeInitializer: return "Initializer"; + case ExecutionModeFinalizer: return "Finalizer"; + case ExecutionModeSubgroupSize: return "SubgroupSize"; + case ExecutionModeSubgroupsPerWorkgroup: return "SubgroupsPerWorkgroup"; + case ExecutionModeSubgroupsPerWorkgroupId: return "SubgroupsPerWorkgroupId"; + case ExecutionModeLocalSizeId: return "LocalSizeId"; + case ExecutionModeLocalSizeHintId: return "LocalSizeHintId"; - case ExecutionModePostDepthCoverage: return "PostDepthCoverage"; - case ExecutionModeDenormPreserve: return "DenormPreserve"; - case ExecutionModeDenormFlushToZero: return "DenormFlushToZero"; - case ExecutionModeSignedZeroInfNanPreserve: return "SignedZeroInfNanPreserve"; - case ExecutionModeRoundingModeRTE: return "RoundingModeRTE"; - case ExecutionModeRoundingModeRTZ: return "RoundingModeRTZ"; - case ExecutionModeStencilRefReplacingEXT: return "StencilRefReplacingEXT"; + case ExecutionModePostDepthCoverage: return "PostDepthCoverage"; + case ExecutionModeDenormPreserve: return "DenormPreserve"; + case ExecutionModeDenormFlushToZero: return "DenormFlushToZero"; + case ExecutionModeSignedZeroInfNanPreserve: return "SignedZeroInfNanPreserve"; + case ExecutionModeRoundingModeRTE: return "RoundingModeRTE"; + case ExecutionModeRoundingModeRTZ: return "RoundingModeRTZ"; + case ExecutionModeEarlyAndLateFragmentTestsAMD: return "EarlyAndLateFragmentTestsAMD"; + case ExecutionModeStencilRefUnchangedFrontAMD: return "StencilRefUnchangedFrontAMD"; + case ExecutionModeStencilRefLessFrontAMD: return "StencilRefLessFrontAMD"; + case ExecutionModeStencilRefGreaterBackAMD: return "StencilRefGreaterBackAMD"; + case ExecutionModeStencilRefReplacingEXT: return "StencilRefReplacingEXT"; case ExecutionModeSubgroupUniformControlFlowKHR: return "SubgroupUniformControlFlow"; + case ExecutionModeMaximallyReconvergesKHR: return "MaximallyReconverges"; - case ExecutionModeOutputLinesNV: return "OutputLinesNV"; - case ExecutionModeOutputPrimitivesNV: return "OutputPrimitivesNV"; - case ExecutionModeOutputTrianglesNV: return "OutputTrianglesNV"; - case ExecutionModeDerivativeGroupQuadsNV: return "DerivativeGroupQuadsNV"; - case ExecutionModeDerivativeGroupLinearNV: return "DerivativeGroupLinearNV"; + case ExecutionModeOutputLinesNV: return "OutputLinesNV"; + case ExecutionModeOutputPrimitivesNV: return "OutputPrimitivesNV"; + case ExecutionModeOutputTrianglesNV: return "OutputTrianglesNV"; + case ExecutionModeDerivativeGroupQuadsNV: return "DerivativeGroupQuadsNV"; + case ExecutionModeDerivativeGroupLinearNV: return "DerivativeGroupLinearNV"; case ExecutionModePixelInterlockOrderedEXT: return "PixelInterlockOrderedEXT"; case ExecutionModePixelInterlockUnorderedEXT: return "PixelInterlockUnorderedEXT"; @@ -208,6 +219,13 @@ const char* ExecutionModeString(int mode) case ExecutionModeNoGlobalOffsetINTEL: return "NoGlobalOffsetINTEL"; case ExecutionModeNumSIMDWorkitemsINTEL: return "NumSIMDWorkitemsINTEL"; + case ExecutionModeRequireFullQuadsKHR: return "RequireFullQuadsKHR"; + case ExecutionModeQuadDerivativesKHR: return "QuadDerivativesKHR"; + + case ExecutionModeNonCoherentColorAttachmentReadEXT: return "NonCoherentColorAttachmentReadEXT"; + case ExecutionModeNonCoherentDepthAttachmentReadEXT: return "NonCoherentDepthAttachmentReadEXT"; + case ExecutionModeNonCoherentStencilAttachmentReadEXT: return "NonCoherentStencilAttachmentReadEXT"; + case ExecutionModeCeiling: default: return "Bad"; } @@ -238,7 +256,9 @@ const char* StorageClassString(int StorageClass) case StorageClassIncomingCallableDataKHR: return "IncomingCallableDataKHR"; case StorageClassPhysicalStorageBufferEXT: return "PhysicalStorageBufferEXT"; - + case StorageClassTaskPayloadWorkgroupEXT: return "TaskPayloadWorkgroupEXT"; + case StorageClassHitObjectAttributeNV: return "HitObjectAttributeNV"; + case StorageClassTileImageEXT: return "TileImageEXT"; default: return "Bad"; } } @@ -297,7 +317,10 @@ const char* DecorationString(int decoration) case DecorationCeiling: default: return "Bad"; - case DecorationExplicitInterpAMD: return "ExplicitInterpAMD"; + case DecorationWeightTextureQCOM: return "DecorationWeightTextureQCOM"; + case DecorationBlockMatchTextureQCOM: return "DecorationBlockMatchTextureQCOM"; + case DecorationBlockMatchSamplerQCOM: return "DecorationBlockMatchSamplerQCOM"; + case DecorationExplicitInterpAMD: return "ExplicitInterpAMD"; case DecorationOverrideCoverageNV: return "OverrideCoverageNV"; case DecorationPassthroughNV: return "PassthroughNV"; case DecorationViewportRelativeNV: return "ViewportRelativeNV"; @@ -305,13 +328,16 @@ const char* DecorationString(int decoration) case DecorationPerPrimitiveNV: return "PerPrimitiveNV"; case DecorationPerViewNV: return "PerViewNV"; case DecorationPerTaskNV: return "PerTaskNV"; - case DecorationPerVertexNV: return "PerVertexNV"; + + case DecorationPerVertexKHR: return "PerVertexKHR"; case DecorationNonUniformEXT: return "DecorationNonUniformEXT"; case DecorationHlslCounterBufferGOOGLE: return "DecorationHlslCounterBufferGOOGLE"; case DecorationHlslSemanticGOOGLE: return "DecorationHlslSemanticGOOGLE"; case DecorationRestrictPointerEXT: return "DecorationRestrictPointerEXT"; case DecorationAliasedPointerEXT: return "DecorationAliasedPointerEXT"; + + case DecorationHitObjectShaderRecordBufferNV: return "DecorationHitObjectShaderRecordBufferNV"; } } @@ -392,6 +418,12 @@ const char* BuiltInString(int builtIn) case BuiltInObjectRayDirectionKHR: return "ObjectRayDirectionKHR"; case BuiltInRayTminKHR: return "RayTminKHR"; case BuiltInRayTmaxKHR: return "RayTmaxKHR"; + case BuiltInCullMaskKHR: return "CullMaskKHR"; + case BuiltInHitTriangleVertexPositionsKHR: return "HitTriangleVertexPositionsKHR"; + case BuiltInHitMicroTriangleVertexPositionsNV: return "HitMicroTriangleVertexPositionsNV"; + case BuiltInHitMicroTriangleVertexBarycentricsNV: return "HitMicroTriangleVertexBarycentricsNV"; + case BuiltInHitKindFrontFacingMicroTriangleNV: return "HitKindFrontFacingMicroTriangleNV"; + case BuiltInHitKindBackFacingMicroTriangleNV: return "HitKindBackFacingMicroTriangleNV"; case BuiltInInstanceCustomIndexKHR: return "InstanceCustomIndexKHR"; case BuiltInRayGeometryIndexKHR: return "RayGeometryIndexKHR"; case BuiltInObjectToWorldKHR: return "ObjectToWorldKHR"; @@ -406,8 +438,8 @@ const char* BuiltInString(int builtIn) case BuiltInViewportMaskPerViewNV: return "ViewportMaskPerViewNV"; // case BuiltInFragmentSizeNV: return "FragmentSizeNV"; // superseded by BuiltInFragSizeEXT // case BuiltInInvocationsPerPixelNV: return "InvocationsPerPixelNV"; // superseded by BuiltInFragInvocationCountEXT - case BuiltInBaryCoordNV: return "BaryCoordNV"; - case BuiltInBaryCoordNoPerspNV: return "BaryCoordNoPerspNV"; + case BuiltInBaryCoordKHR: return "BaryCoordKHR"; + case BuiltInBaryCoordNoPerspKHR: return "BaryCoordNoPerspKHR"; case BuiltInFragSizeEXT: return "FragSizeEXT"; case BuiltInFragInvocationCountEXT: return "FragInvocationCountEXT"; @@ -427,6 +459,15 @@ const char* BuiltInString(int builtIn) case BuiltInWarpIDNV: return "WarpIDNV"; case BuiltInSMIDNV: return "SMIDNV"; case BuiltInCurrentRayTimeNV: return "CurrentRayTimeNV"; + case BuiltInPrimitivePointIndicesEXT: return "PrimitivePointIndicesEXT"; + case BuiltInPrimitiveLineIndicesEXT: return "PrimitiveLineIndicesEXT"; + case BuiltInPrimitiveTriangleIndicesEXT: return "PrimitiveTriangleIndicesEXT"; + case BuiltInCullPrimitiveEXT: return "CullPrimitiveEXT"; + case BuiltInCoreCountARM: return "CoreCountARM"; + case BuiltInCoreIDARM: return "CoreIDARM"; + case BuiltInCoreMaxIDARM: return "CoreMaxIDARM"; + case BuiltInWarpIDARM: return "WarpIDARM"; + case BuiltInWarpMaxIDARM: return "BuiltInWarpMaxIDARM"; default: return "Bad"; } @@ -442,6 +483,7 @@ const char* DimensionString(int dim) case 4: return "Rect"; case 5: return "Buffer"; case 6: return "SubpassData"; + case DimTileImageDataEXT: return "TileImageDataEXT"; default: return "Bad"; } @@ -556,7 +598,7 @@ const char* ImageChannelOrderString(int format) case 17: return "sRGBA"; case 18: return "sBGRA"; - default: + default: return "Bad"; } } @@ -761,6 +803,21 @@ const char* MemoryAccessString(int mem) } } +const int CooperativeMatrixOperandsCeiling = 6; + +const char* CooperativeMatrixOperandsString(int op) +{ + switch (op) { + case CooperativeMatrixOperandsMatrixASignedComponentsKHRShift: return "ASignedComponentsKHR"; + case CooperativeMatrixOperandsMatrixBSignedComponentsKHRShift: return "BSignedComponentsKHR"; + case CooperativeMatrixOperandsMatrixCSignedComponentsKHRShift: return "CSignedComponentsKHR"; + case CooperativeMatrixOperandsMatrixResultSignedComponentsKHRShift: return "ResultSignedComponentsKHR"; + case CooperativeMatrixOperandsSaturatingAccumulationKHRShift: return "SaturatingAccumulationKHR"; + + default: return "Bad"; + } +} + const char* ScopeString(int mem) { switch (mem) { @@ -842,7 +899,7 @@ const char* CapabilityString(int info) case 22: return "Int16"; case 23: return "TessellationPointSize"; case 24: return "GeometryPointSize"; - case 25: return "ImageGatherExtended"; + case 25: return "ImageGatherExtended"; case 26: return "Bad"; case 27: return "StorageImageMultisample"; case 28: return "UniformBufferArrayDynamicIndexing"; @@ -887,6 +944,7 @@ const char* CapabilityString(int info) case CapabilitySubgroupBallotKHR: return "SubgroupBallotKHR"; case CapabilityDrawParameters: return "DrawParameters"; case CapabilitySubgroupVoteKHR: return "SubgroupVoteKHR"; + case CapabilityGroupNonUniformRotateKHR: return "CapabilityGroupNonUniformRotateKHR"; case CapabilityStorageUniformBufferBlock16: return "StorageUniformBufferBlock16"; case CapabilityStorageUniform16: return "StorageUniform16"; @@ -900,6 +958,12 @@ const char* CapabilityString(int info) case CapabilityDeviceGroup: return "DeviceGroup"; case CapabilityMultiView: return "MultiView"; + case CapabilityDenormPreserve: return "DenormPreserve"; + case CapabilityDenormFlushToZero: return "DenormFlushToZero"; + case CapabilitySignedZeroInfNanPreserve: return "SignedZeroInfNanPreserve"; + case CapabilityRoundingModeRTE: return "RoundingModeRTE"; + case CapabilityRoundingModeRTZ: return "RoundingModeRTZ"; + case CapabilityStencilExportEXT: return "StencilExportEXT"; case CapabilityFloat16ImageAMD: return "Float16ImageAMD"; @@ -919,14 +983,20 @@ const char* CapabilityString(int info) case CapabilityRayTracingNV: return "RayTracingNV"; case CapabilityRayTracingMotionBlurNV: return "RayTracingMotionBlurNV"; case CapabilityRayTracingKHR: return "RayTracingKHR"; + case CapabilityRayCullMaskKHR: return "RayCullMaskKHR"; case CapabilityRayQueryKHR: return "RayQueryKHR"; case CapabilityRayTracingProvisionalKHR: return "RayTracingProvisionalKHR"; case CapabilityRayTraversalPrimitiveCullingKHR: return "RayTraversalPrimitiveCullingKHR"; + case CapabilityRayTracingPositionFetchKHR: return "RayTracingPositionFetchKHR"; + case CapabilityDisplacementMicromapNV: return "DisplacementMicromapNV"; + case CapabilityRayTracingDisplacementMicromapNV: return "CapabilityRayTracingDisplacementMicromapNV"; + case CapabilityRayQueryPositionFetchKHR: return "RayQueryPositionFetchKHR"; case CapabilityComputeDerivativeGroupQuadsNV: return "ComputeDerivativeGroupQuadsNV"; case CapabilityComputeDerivativeGroupLinearNV: return "ComputeDerivativeGroupLinearNV"; - case CapabilityFragmentBarycentricNV: return "FragmentBarycentricNV"; + case CapabilityFragmentBarycentricKHR: return "FragmentBarycentricKHR"; case CapabilityMeshShadingNV: return "MeshShadingNV"; case CapabilityImageFootprintNV: return "ImageFootprintNV"; + case CapabilityMeshShadingEXT: return "MeshShadingEXT"; // case CapabilityShadingRateNV: return "ShadingRateNV"; // superseded by FragmentDensityEXT case CapabilitySampleMaskOverrideCoverageNV: return "SampleMaskOverrideCoverageNV"; case CapabilityFragmentDensityEXT: return "FragmentDensityEXT"; @@ -954,20 +1024,31 @@ const char* CapabilityString(int info) case CapabilityVariablePointers: return "VariablePointers"; case CapabilityCooperativeMatrixNV: return "CooperativeMatrixNV"; + case CapabilityCooperativeMatrixKHR: return "CooperativeMatrixKHR"; case CapabilityShaderSMBuiltinsNV: return "ShaderSMBuiltinsNV"; case CapabilityFragmentShaderSampleInterlockEXT: return "CapabilityFragmentShaderSampleInterlockEXT"; case CapabilityFragmentShaderPixelInterlockEXT: return "CapabilityFragmentShaderPixelInterlockEXT"; case CapabilityFragmentShaderShadingRateInterlockEXT: return "CapabilityFragmentShaderShadingRateInterlockEXT"; + case CapabilityTileImageColorReadAccessEXT: return "TileImageColorReadAccessEXT"; + case CapabilityTileImageDepthReadAccessEXT: return "TileImageDepthReadAccessEXT"; + case CapabilityTileImageStencilReadAccessEXT: return "TileImageStencilReadAccessEXT"; + + case CapabilityCooperativeMatrixLayoutsARM: return "CooperativeMatrixLayoutsARM"; + case CapabilityFragmentShadingRateKHR: return "FragmentShadingRateKHR"; case CapabilityDemoteToHelperInvocationEXT: return "DemoteToHelperInvocationEXT"; + case CapabilityAtomicFloat16VectorNV: return "AtomicFloat16VectorNV"; case CapabilityShaderClockKHR: return "ShaderClockKHR"; + case CapabilityQuadControlKHR: return "QuadControlKHR"; case CapabilityInt64ImageEXT: return "Int64ImageEXT"; case CapabilityIntegerFunctions2INTEL: return "CapabilityIntegerFunctions2INTEL"; + case CapabilityExpectAssumeKHR: return "ExpectAssumeKHR"; + case CapabilityAtomicFloat16AddEXT: return "AtomicFloat16AddEXT"; case CapabilityAtomicFloat32AddEXT: return "AtomicFloat32AddEXT"; case CapabilityAtomicFloat64AddEXT: return "AtomicFloat64AddEXT"; @@ -978,6 +1059,16 @@ const char* CapabilityString(int info) case CapabilityWorkgroupMemoryExplicitLayoutKHR: return "CapabilityWorkgroupMemoryExplicitLayoutKHR"; case CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR: return "CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR"; case CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR: return "CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR"; + case CapabilityCoreBuiltinsARM: return "CoreBuiltinsARM"; + + case CapabilityShaderInvocationReorderNV: return "ShaderInvocationReorderNV"; + + case CapabilityTextureSampleWeightedQCOM: return "TextureSampleWeightedQCOM"; + case CapabilityTextureBoxFilterQCOM: return "TextureBoxFilterQCOM"; + case CapabilityTextureBlockMatchQCOM: return "TextureBlockMatchQCOM"; + case CapabilityTextureBlockMatch2QCOM: return "TextureBlockMatch2QCOM"; + + case CapabilityReplicatedCompositesEXT: return "CapabilityReplicatedCompositesEXT"; default: return "Bad"; } @@ -1356,11 +1447,18 @@ const char* OpcodeString(int op) case 4429: return "OpSubgroupAnyKHR"; case 4430: return "OpSubgroupAllEqualKHR"; case 4432: return "OpSubgroupReadInvocationKHR"; + case 4433: return "OpExtInstWithForwardRefsKHR"; + + case OpGroupNonUniformQuadAllKHR: return "OpGroupNonUniformQuadAllKHR"; + case OpGroupNonUniformQuadAnyKHR: return "OpGroupNonUniformQuadAnyKHR"; case OpAtomicFAddEXT: return "OpAtomicFAddEXT"; case OpAtomicFMinEXT: return "OpAtomicFMinEXT"; case OpAtomicFMaxEXT: return "OpAtomicFMaxEXT"; + case OpAssumeTrueKHR: return "OpAssumeTrueKHR"; + case OpExpectKHR: return "OpExpectKHR"; + case 5000: return "OpGroupIAddNonUniformAMD"; case 5001: return "OpGroupFAddNonUniformAMD"; case 5002: return "OpGroupFMinNonUniformAMD"; @@ -1394,6 +1492,10 @@ const char* OpcodeString(int op) case OpGroupNonUniformPartitionNV: return "OpGroupNonUniformPartitionNV"; case OpImageSampleFootprintNV: return "OpImageSampleFootprintNV"; case OpWritePackedPrimitiveIndices4x8NV: return "OpWritePackedPrimitiveIndices4x8NV"; + case OpEmitMeshTasksEXT: return "OpEmitMeshTasksEXT"; + case OpSetMeshOutputsEXT: return "OpSetMeshOutputsEXT"; + + case OpGroupNonUniformRotateKHR: return "OpGroupNonUniformRotateKHR"; case OpTypeRayQueryKHR: return "OpTypeRayQueryKHR"; case OpRayQueryInitializeKHR: return "OpRayQueryInitializeKHR"; @@ -1419,18 +1521,78 @@ const char* OpcodeString(int op) case OpRayQueryGetWorldRayOriginKHR: return "OpRayQueryGetWorldRayOriginKHR"; case OpRayQueryGetIntersectionObjectToWorldKHR: return "OpRayQueryGetIntersectionObjectToWorldKHR"; case OpRayQueryGetIntersectionWorldToObjectKHR: return "OpRayQueryGetIntersectionWorldToObjectKHR"; + case OpRayQueryGetIntersectionTriangleVertexPositionsKHR: return "OpRayQueryGetIntersectionTriangleVertexPositionsKHR"; case OpTypeCooperativeMatrixNV: return "OpTypeCooperativeMatrixNV"; case OpCooperativeMatrixLoadNV: return "OpCooperativeMatrixLoadNV"; case OpCooperativeMatrixStoreNV: return "OpCooperativeMatrixStoreNV"; case OpCooperativeMatrixMulAddNV: return "OpCooperativeMatrixMulAddNV"; case OpCooperativeMatrixLengthNV: return "OpCooperativeMatrixLengthNV"; + case OpTypeCooperativeMatrixKHR: return "OpTypeCooperativeMatrixKHR"; + case OpCooperativeMatrixLoadKHR: return "OpCooperativeMatrixLoadKHR"; + case OpCooperativeMatrixStoreKHR: return "OpCooperativeMatrixStoreKHR"; + case OpCooperativeMatrixMulAddKHR: return "OpCooperativeMatrixMulAddKHR"; + case OpCooperativeMatrixLengthKHR: return "OpCooperativeMatrixLengthKHR"; case OpDemoteToHelperInvocationEXT: return "OpDemoteToHelperInvocationEXT"; case OpIsHelperInvocationEXT: return "OpIsHelperInvocationEXT"; case OpBeginInvocationInterlockEXT: return "OpBeginInvocationInterlockEXT"; case OpEndInvocationInterlockEXT: return "OpEndInvocationInterlockEXT"; + case OpTypeHitObjectNV: return "OpTypeHitObjectNV"; + case OpHitObjectTraceRayNV: return "OpHitObjectTraceRayNV"; + case OpHitObjectTraceRayMotionNV: return "OpHitObjectTraceRayMotionNV"; + case OpHitObjectRecordHitNV: return "OpHitObjectRecordHitNV"; + case OpHitObjectRecordHitMotionNV: return "OpHitObjectRecordHitMotionNV"; + case OpHitObjectRecordHitWithIndexNV: return "OpHitObjectRecordHitWithIndexNV"; + case OpHitObjectRecordHitWithIndexMotionNV: return "OpHitObjectRecordHitWithIndexMotionNV"; + case OpHitObjectRecordMissNV: return "OpHitObjectRecordMissNV"; + case OpHitObjectRecordMissMotionNV: return "OpHitObjectRecordMissMotionNV"; + case OpHitObjectRecordEmptyNV: return "OpHitObjectRecordEmptyNV"; + case OpHitObjectExecuteShaderNV: return "OpHitObjectExecuteShaderNV"; + case OpReorderThreadWithHintNV: return "OpReorderThreadWithHintNV"; + case OpReorderThreadWithHitObjectNV: return "OpReorderThreadWithHitObjectNV"; + case OpHitObjectGetCurrentTimeNV: return "OpHitObjectGetCurrentTimeNV"; + case OpHitObjectGetAttributesNV: return "OpHitObjectGetAttributesNV"; + case OpHitObjectGetHitKindNV: return "OpHitObjectGetFrontFaceNV"; + case OpHitObjectGetPrimitiveIndexNV: return "OpHitObjectGetPrimitiveIndexNV"; + case OpHitObjectGetGeometryIndexNV: return "OpHitObjectGetGeometryIndexNV"; + case OpHitObjectGetInstanceIdNV: return "OpHitObjectGetInstanceIdNV"; + case OpHitObjectGetInstanceCustomIndexNV: return "OpHitObjectGetInstanceCustomIndexNV"; + case OpHitObjectGetObjectRayDirectionNV: return "OpHitObjectGetObjectRayDirectionNV"; + case OpHitObjectGetObjectRayOriginNV: return "OpHitObjectGetObjectRayOriginNV"; + case OpHitObjectGetWorldRayDirectionNV: return "OpHitObjectGetWorldRayDirectionNV"; + case OpHitObjectGetWorldRayOriginNV: return "OpHitObjectGetWorldRayOriginNV"; + case OpHitObjectGetWorldToObjectNV: return "OpHitObjectGetWorldToObjectNV"; + case OpHitObjectGetObjectToWorldNV: return "OpHitObjectGetObjectToWorldNV"; + case OpHitObjectGetRayTMaxNV: return "OpHitObjectGetRayTMaxNV"; + case OpHitObjectGetRayTMinNV: return "OpHitObjectGetRayTMinNV"; + case OpHitObjectIsEmptyNV: return "OpHitObjectIsEmptyNV"; + case OpHitObjectIsHitNV: return "OpHitObjectIsHitNV"; + case OpHitObjectIsMissNV: return "OpHitObjectIsMissNV"; + case OpHitObjectGetShaderBindingTableRecordIndexNV: return "OpHitObjectGetShaderBindingTableRecordIndexNV"; + case OpHitObjectGetShaderRecordBufferHandleNV: return "OpHitObjectGetShaderRecordBufferHandleNV"; + + case OpFetchMicroTriangleVertexBarycentricNV: return "OpFetchMicroTriangleVertexBarycentricNV"; + case OpFetchMicroTriangleVertexPositionNV: return "OpFetchMicroTriangleVertexPositionNV"; + + case OpColorAttachmentReadEXT: return "OpColorAttachmentReadEXT"; + case OpDepthAttachmentReadEXT: return "OpDepthAttachmentReadEXT"; + case OpStencilAttachmentReadEXT: return "OpStencilAttachmentReadEXT"; + + case OpImageSampleWeightedQCOM: return "OpImageSampleWeightedQCOM"; + case OpImageBoxFilterQCOM: return "OpImageBoxFilterQCOM"; + case OpImageBlockMatchSADQCOM: return "OpImageBlockMatchSADQCOM"; + case OpImageBlockMatchSSDQCOM: return "OpImageBlockMatchSSDQCOM"; + case OpImageBlockMatchWindowSSDQCOM: return "OpImageBlockMatchWindowSSDQCOM"; + case OpImageBlockMatchWindowSADQCOM: return "OpImageBlockMatchWindowSADQCOM"; + case OpImageBlockMatchGatherSSDQCOM: return "OpImageBlockMatchGatherSSDQCOM"; + case OpImageBlockMatchGatherSADQCOM: return "OpImageBlockMatchGatherSADQCOM"; + + case OpConstantCompositeReplicateEXT: return "OpConstantCompositeReplicateEXT"; + case OpSpecConstantCompositeReplicateEXT: return "OpSpecConstantCompositeReplicateEXT"; + case OpCompositeConstructReplicateEXT: return "OpCompositeConstructReplicateEXT"; + default: return "Bad"; } @@ -1450,1553 +1612,1883 @@ EnumParameters LoopControlParams[FunctionControlCeiling]; EnumParameters SelectionControlParams[SelectControlCeiling]; EnumParameters FunctionControlParams[FunctionControlCeiling]; EnumParameters MemoryAccessParams[MemoryAccessCeiling]; +EnumParameters CooperativeMatrixOperandsParams[CooperativeMatrixOperandsCeiling]; // Set up all the parameterizing descriptions of the opcodes, operands, etc. void Parameterize() { // only do this once. - static bool initialized = false; - if (initialized) - return; - initialized = true; - - // Exceptions to having a result and a resulting type . - // (Everything is initialized to have both). - - InstructionDesc[OpNop].setResultAndType(false, false); - InstructionDesc[OpSource].setResultAndType(false, false); - InstructionDesc[OpSourceContinued].setResultAndType(false, false); - InstructionDesc[OpSourceExtension].setResultAndType(false, false); - InstructionDesc[OpExtension].setResultAndType(false, false); - InstructionDesc[OpExtInstImport].setResultAndType(true, false); - InstructionDesc[OpCapability].setResultAndType(false, false); - InstructionDesc[OpMemoryModel].setResultAndType(false, false); - InstructionDesc[OpEntryPoint].setResultAndType(false, false); - InstructionDesc[OpExecutionMode].setResultAndType(false, false); - InstructionDesc[OpExecutionModeId].setResultAndType(false, false); - InstructionDesc[OpTypeVoid].setResultAndType(true, false); - InstructionDesc[OpTypeBool].setResultAndType(true, false); - InstructionDesc[OpTypeInt].setResultAndType(true, false); - InstructionDesc[OpTypeFloat].setResultAndType(true, false); - InstructionDesc[OpTypeVector].setResultAndType(true, false); - InstructionDesc[OpTypeMatrix].setResultAndType(true, false); - InstructionDesc[OpTypeImage].setResultAndType(true, false); - InstructionDesc[OpTypeSampler].setResultAndType(true, false); - InstructionDesc[OpTypeSampledImage].setResultAndType(true, false); - InstructionDesc[OpTypeArray].setResultAndType(true, false); - InstructionDesc[OpTypeRuntimeArray].setResultAndType(true, false); - InstructionDesc[OpTypeStruct].setResultAndType(true, false); - InstructionDesc[OpTypeOpaque].setResultAndType(true, false); - InstructionDesc[OpTypePointer].setResultAndType(true, false); - InstructionDesc[OpTypeForwardPointer].setResultAndType(false, false); - InstructionDesc[OpTypeFunction].setResultAndType(true, false); - InstructionDesc[OpTypeEvent].setResultAndType(true, false); - InstructionDesc[OpTypeDeviceEvent].setResultAndType(true, false); - InstructionDesc[OpTypeReserveId].setResultAndType(true, false); - InstructionDesc[OpTypeQueue].setResultAndType(true, false); - InstructionDesc[OpTypePipe].setResultAndType(true, false); - InstructionDesc[OpFunctionEnd].setResultAndType(false, false); - InstructionDesc[OpStore].setResultAndType(false, false); - InstructionDesc[OpImageWrite].setResultAndType(false, false); - InstructionDesc[OpDecorationGroup].setResultAndType(true, false); - InstructionDesc[OpDecorate].setResultAndType(false, false); - InstructionDesc[OpDecorateId].setResultAndType(false, false); - InstructionDesc[OpDecorateStringGOOGLE].setResultAndType(false, false); - InstructionDesc[OpMemberDecorate].setResultAndType(false, false); - InstructionDesc[OpMemberDecorateStringGOOGLE].setResultAndType(false, false); - InstructionDesc[OpGroupDecorate].setResultAndType(false, false); - InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false); - InstructionDesc[OpName].setResultAndType(false, false); - InstructionDesc[OpMemberName].setResultAndType(false, false); - InstructionDesc[OpString].setResultAndType(true, false); - InstructionDesc[OpLine].setResultAndType(false, false); - InstructionDesc[OpNoLine].setResultAndType(false, false); - InstructionDesc[OpCopyMemory].setResultAndType(false, false); - InstructionDesc[OpCopyMemorySized].setResultAndType(false, false); - InstructionDesc[OpEmitVertex].setResultAndType(false, false); - InstructionDesc[OpEndPrimitive].setResultAndType(false, false); - InstructionDesc[OpEmitStreamVertex].setResultAndType(false, false); - InstructionDesc[OpEndStreamPrimitive].setResultAndType(false, false); - InstructionDesc[OpControlBarrier].setResultAndType(false, false); - InstructionDesc[OpMemoryBarrier].setResultAndType(false, false); - InstructionDesc[OpAtomicStore].setResultAndType(false, false); - InstructionDesc[OpLoopMerge].setResultAndType(false, false); - InstructionDesc[OpSelectionMerge].setResultAndType(false, false); - InstructionDesc[OpLabel].setResultAndType(true, false); - InstructionDesc[OpBranch].setResultAndType(false, false); - InstructionDesc[OpBranchConditional].setResultAndType(false, false); - InstructionDesc[OpSwitch].setResultAndType(false, false); - InstructionDesc[OpKill].setResultAndType(false, false); - InstructionDesc[OpTerminateInvocation].setResultAndType(false, false); - InstructionDesc[OpReturn].setResultAndType(false, false); - InstructionDesc[OpReturnValue].setResultAndType(false, false); - InstructionDesc[OpUnreachable].setResultAndType(false, false); - InstructionDesc[OpLifetimeStart].setResultAndType(false, false); - InstructionDesc[OpLifetimeStop].setResultAndType(false, false); - InstructionDesc[OpCommitReadPipe].setResultAndType(false, false); - InstructionDesc[OpCommitWritePipe].setResultAndType(false, false); - InstructionDesc[OpGroupCommitWritePipe].setResultAndType(false, false); - InstructionDesc[OpGroupCommitReadPipe].setResultAndType(false, false); - InstructionDesc[OpCaptureEventProfilingInfo].setResultAndType(false, false); - InstructionDesc[OpSetUserEventStatus].setResultAndType(false, false); - InstructionDesc[OpRetainEvent].setResultAndType(false, false); - InstructionDesc[OpReleaseEvent].setResultAndType(false, false); - InstructionDesc[OpGroupWaitEvents].setResultAndType(false, false); - InstructionDesc[OpAtomicFlagClear].setResultAndType(false, false); - InstructionDesc[OpModuleProcessed].setResultAndType(false, false); - InstructionDesc[OpTypeCooperativeMatrixNV].setResultAndType(true, false); - InstructionDesc[OpCooperativeMatrixStoreNV].setResultAndType(false, false); - InstructionDesc[OpBeginInvocationInterlockEXT].setResultAndType(false, false); - InstructionDesc[OpEndInvocationInterlockEXT].setResultAndType(false, false); - - // Specific additional context-dependent operands - - ExecutionModeOperands[ExecutionModeInvocations].push(OperandLiteralNumber, "'Number of <>'"); - - ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'x size'"); - ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'y size'"); - ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'z size'"); - - ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'x size'"); - ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'y size'"); - ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'z size'"); - - ExecutionModeOperands[ExecutionModeOutputVertices].push(OperandLiteralNumber, "'Vertex count'"); - ExecutionModeOperands[ExecutionModeVecTypeHint].push(OperandLiteralNumber, "'Vector type'"); - - DecorationOperands[DecorationStream].push(OperandLiteralNumber, "'Stream Number'"); - DecorationOperands[DecorationLocation].push(OperandLiteralNumber, "'Location'"); - DecorationOperands[DecorationComponent].push(OperandLiteralNumber, "'Component'"); - DecorationOperands[DecorationIndex].push(OperandLiteralNumber, "'Index'"); - DecorationOperands[DecorationBinding].push(OperandLiteralNumber, "'Binding Point'"); - DecorationOperands[DecorationDescriptorSet].push(OperandLiteralNumber, "'Descriptor Set'"); - DecorationOperands[DecorationOffset].push(OperandLiteralNumber, "'Byte Offset'"); - DecorationOperands[DecorationXfbBuffer].push(OperandLiteralNumber, "'XFB Buffer Number'"); - DecorationOperands[DecorationXfbStride].push(OperandLiteralNumber, "'XFB Stride'"); - DecorationOperands[DecorationArrayStride].push(OperandLiteralNumber, "'Array Stride'"); - DecorationOperands[DecorationMatrixStride].push(OperandLiteralNumber, "'Matrix Stride'"); - DecorationOperands[DecorationBuiltIn].push(OperandLiteralNumber, "See <>"); - DecorationOperands[DecorationFPRoundingMode].push(OperandFPRoundingMode, "'Floating-Point Rounding Mode'"); - DecorationOperands[DecorationFPFastMathMode].push(OperandFPFastMath, "'Fast-Math Mode'"); - DecorationOperands[DecorationLinkageAttributes].push(OperandLiteralString, "'Name'"); - DecorationOperands[DecorationLinkageAttributes].push(OperandLinkageType, "'Linkage Type'"); - DecorationOperands[DecorationFuncParamAttr].push(OperandFuncParamAttr, "'Function Parameter Attribute'"); - DecorationOperands[DecorationSpecId].push(OperandLiteralNumber, "'Specialization Constant ID'"); - DecorationOperands[DecorationInputAttachmentIndex].push(OperandLiteralNumber, "'Attachment Index'"); - DecorationOperands[DecorationAlignment].push(OperandLiteralNumber, "'Alignment'"); - - OperandClassParams[OperandSource].set(0, SourceString, 0); - OperandClassParams[OperandExecutionModel].set(0, ExecutionModelString, nullptr); - OperandClassParams[OperandAddressing].set(0, AddressingString, nullptr); - OperandClassParams[OperandMemory].set(0, MemoryString, nullptr); - OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams); - OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands); - OperandClassParams[OperandStorage].set(0, StorageClassString, nullptr); - OperandClassParams[OperandDimensionality].set(0, DimensionString, nullptr); - OperandClassParams[OperandSamplerAddressingMode].set(0, SamplerAddressingModeString, nullptr); - OperandClassParams[OperandSamplerFilterMode].set(0, SamplerFilterModeString, nullptr); - OperandClassParams[OperandSamplerImageFormat].set(0, ImageFormatString, nullptr); - OperandClassParams[OperandImageChannelOrder].set(0, ImageChannelOrderString, nullptr); - OperandClassParams[OperandImageChannelDataType].set(0, ImageChannelDataTypeString, nullptr); - OperandClassParams[OperandImageOperands].set(ImageOperandsCeiling, ImageOperandsString, ImageOperandsParams, true); - OperandClassParams[OperandFPFastMath].set(0, FPFastMathString, nullptr, true); - OperandClassParams[OperandFPRoundingMode].set(0, FPRoundingModeString, nullptr); - OperandClassParams[OperandLinkageType].set(0, LinkageTypeString, nullptr); - OperandClassParams[OperandFuncParamAttr].set(0, FuncParamAttrString, nullptr); - OperandClassParams[OperandAccessQualifier].set(0, AccessQualifierString, nullptr); - OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams); - OperandClassParams[OperandDecoration].setOperands(DecorationOperands); - OperandClassParams[OperandBuiltIn].set(0, BuiltInString, nullptr); - OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true); - OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true); - OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true); - OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true); - OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true); - OperandClassParams[OperandScope].set(0, ScopeString, nullptr); - OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr); - OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr); - OperandClassParams[OperandKernelProfilingInfo].set(0, KernelProfilingInfoString, nullptr, true); - OperandClassParams[OperandCapability].set(0, CapabilityString, nullptr); - OperandClassParams[OperandOpcode].set(OpCodeMask + 1, OpcodeString, 0); - - // set name of operator, an initial set of style operands, and the description - - InstructionDesc[OpSource].operands.push(OperandSource, ""); - InstructionDesc[OpSource].operands.push(OperandLiteralNumber, "'Version'"); - InstructionDesc[OpSource].operands.push(OperandId, "'File'", true); - InstructionDesc[OpSource].operands.push(OperandLiteralString, "'Source'", true); - - InstructionDesc[OpSourceContinued].operands.push(OperandLiteralString, "'Continued Source'"); - - InstructionDesc[OpSourceExtension].operands.push(OperandLiteralString, "'Extension'"); - - InstructionDesc[OpName].operands.push(OperandId, "'Target'"); - InstructionDesc[OpName].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpMemberName].operands.push(OperandId, "'Type'"); - InstructionDesc[OpMemberName].operands.push(OperandLiteralNumber, "'Member'"); - InstructionDesc[OpMemberName].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpString].operands.push(OperandLiteralString, "'String'"); - - InstructionDesc[OpLine].operands.push(OperandId, "'File'"); - InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Line'"); - InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Column'"); - - InstructionDesc[OpExtension].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpExtInstImport].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpCapability].operands.push(OperandCapability, "'Capability'"); + static std::once_flag initialized; + std::call_once(initialized, [](){ + + // Exceptions to having a result and a resulting type . + // (Everything is initialized to have both). + + InstructionDesc[OpNop].setResultAndType(false, false); + InstructionDesc[OpSource].setResultAndType(false, false); + InstructionDesc[OpSourceContinued].setResultAndType(false, false); + InstructionDesc[OpSourceExtension].setResultAndType(false, false); + InstructionDesc[OpExtension].setResultAndType(false, false); + InstructionDesc[OpExtInstImport].setResultAndType(true, false); + InstructionDesc[OpCapability].setResultAndType(false, false); + InstructionDesc[OpMemoryModel].setResultAndType(false, false); + InstructionDesc[OpEntryPoint].setResultAndType(false, false); + InstructionDesc[OpExecutionMode].setResultAndType(false, false); + InstructionDesc[OpExecutionModeId].setResultAndType(false, false); + InstructionDesc[OpTypeVoid].setResultAndType(true, false); + InstructionDesc[OpTypeBool].setResultAndType(true, false); + InstructionDesc[OpTypeInt].setResultAndType(true, false); + InstructionDesc[OpTypeFloat].setResultAndType(true, false); + InstructionDesc[OpTypeVector].setResultAndType(true, false); + InstructionDesc[OpTypeMatrix].setResultAndType(true, false); + InstructionDesc[OpTypeImage].setResultAndType(true, false); + InstructionDesc[OpTypeSampler].setResultAndType(true, false); + InstructionDesc[OpTypeSampledImage].setResultAndType(true, false); + InstructionDesc[OpTypeArray].setResultAndType(true, false); + InstructionDesc[OpTypeRuntimeArray].setResultAndType(true, false); + InstructionDesc[OpTypeStruct].setResultAndType(true, false); + InstructionDesc[OpTypeOpaque].setResultAndType(true, false); + InstructionDesc[OpTypePointer].setResultAndType(true, false); + InstructionDesc[OpTypeForwardPointer].setResultAndType(false, false); + InstructionDesc[OpTypeFunction].setResultAndType(true, false); + InstructionDesc[OpTypeEvent].setResultAndType(true, false); + InstructionDesc[OpTypeDeviceEvent].setResultAndType(true, false); + InstructionDesc[OpTypeReserveId].setResultAndType(true, false); + InstructionDesc[OpTypeQueue].setResultAndType(true, false); + InstructionDesc[OpTypePipe].setResultAndType(true, false); + InstructionDesc[OpFunctionEnd].setResultAndType(false, false); + InstructionDesc[OpStore].setResultAndType(false, false); + InstructionDesc[OpImageWrite].setResultAndType(false, false); + InstructionDesc[OpDecorationGroup].setResultAndType(true, false); + InstructionDesc[OpDecorate].setResultAndType(false, false); + InstructionDesc[OpDecorateId].setResultAndType(false, false); + InstructionDesc[OpDecorateStringGOOGLE].setResultAndType(false, false); + InstructionDesc[OpMemberDecorate].setResultAndType(false, false); + InstructionDesc[OpMemberDecorateStringGOOGLE].setResultAndType(false, false); + InstructionDesc[OpGroupDecorate].setResultAndType(false, false); + InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false); + InstructionDesc[OpName].setResultAndType(false, false); + InstructionDesc[OpMemberName].setResultAndType(false, false); + InstructionDesc[OpString].setResultAndType(true, false); + InstructionDesc[OpLine].setResultAndType(false, false); + InstructionDesc[OpNoLine].setResultAndType(false, false); + InstructionDesc[OpCopyMemory].setResultAndType(false, false); + InstructionDesc[OpCopyMemorySized].setResultAndType(false, false); + InstructionDesc[OpEmitVertex].setResultAndType(false, false); + InstructionDesc[OpEndPrimitive].setResultAndType(false, false); + InstructionDesc[OpEmitStreamVertex].setResultAndType(false, false); + InstructionDesc[OpEndStreamPrimitive].setResultAndType(false, false); + InstructionDesc[OpControlBarrier].setResultAndType(false, false); + InstructionDesc[OpMemoryBarrier].setResultAndType(false, false); + InstructionDesc[OpAtomicStore].setResultAndType(false, false); + InstructionDesc[OpLoopMerge].setResultAndType(false, false); + InstructionDesc[OpSelectionMerge].setResultAndType(false, false); + InstructionDesc[OpLabel].setResultAndType(true, false); + InstructionDesc[OpBranch].setResultAndType(false, false); + InstructionDesc[OpBranchConditional].setResultAndType(false, false); + InstructionDesc[OpSwitch].setResultAndType(false, false); + InstructionDesc[OpKill].setResultAndType(false, false); + InstructionDesc[OpTerminateInvocation].setResultAndType(false, false); + InstructionDesc[OpReturn].setResultAndType(false, false); + InstructionDesc[OpReturnValue].setResultAndType(false, false); + InstructionDesc[OpUnreachable].setResultAndType(false, false); + InstructionDesc[OpLifetimeStart].setResultAndType(false, false); + InstructionDesc[OpLifetimeStop].setResultAndType(false, false); + InstructionDesc[OpCommitReadPipe].setResultAndType(false, false); + InstructionDesc[OpCommitWritePipe].setResultAndType(false, false); + InstructionDesc[OpGroupCommitWritePipe].setResultAndType(false, false); + InstructionDesc[OpGroupCommitReadPipe].setResultAndType(false, false); + InstructionDesc[OpCaptureEventProfilingInfo].setResultAndType(false, false); + InstructionDesc[OpSetUserEventStatus].setResultAndType(false, false); + InstructionDesc[OpRetainEvent].setResultAndType(false, false); + InstructionDesc[OpReleaseEvent].setResultAndType(false, false); + InstructionDesc[OpGroupWaitEvents].setResultAndType(false, false); + InstructionDesc[OpAtomicFlagClear].setResultAndType(false, false); + InstructionDesc[OpModuleProcessed].setResultAndType(false, false); + InstructionDesc[OpTypeCooperativeMatrixNV].setResultAndType(true, false); + InstructionDesc[OpCooperativeMatrixStoreNV].setResultAndType(false, false); + InstructionDesc[OpTypeCooperativeMatrixKHR].setResultAndType(true, false); + InstructionDesc[OpCooperativeMatrixStoreKHR].setResultAndType(false, false); + InstructionDesc[OpBeginInvocationInterlockEXT].setResultAndType(false, false); + InstructionDesc[OpEndInvocationInterlockEXT].setResultAndType(false, false); + InstructionDesc[OpAssumeTrueKHR].setResultAndType(false, false); + // Specific additional context-dependent operands + + ExecutionModeOperands[ExecutionModeInvocations].push(OperandLiteralNumber, "'Number of <>'"); + + ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'x size'"); + ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'y size'"); + ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'z size'"); + + ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'x size'"); + ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'y size'"); + ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'z size'"); + + ExecutionModeOperands[ExecutionModeOutputVertices].push(OperandLiteralNumber, "'Vertex count'"); + ExecutionModeOperands[ExecutionModeVecTypeHint].push(OperandLiteralNumber, "'Vector type'"); + + DecorationOperands[DecorationStream].push(OperandLiteralNumber, "'Stream Number'"); + DecorationOperands[DecorationLocation].push(OperandLiteralNumber, "'Location'"); + DecorationOperands[DecorationComponent].push(OperandLiteralNumber, "'Component'"); + DecorationOperands[DecorationIndex].push(OperandLiteralNumber, "'Index'"); + DecorationOperands[DecorationBinding].push(OperandLiteralNumber, "'Binding Point'"); + DecorationOperands[DecorationDescriptorSet].push(OperandLiteralNumber, "'Descriptor Set'"); + DecorationOperands[DecorationOffset].push(OperandLiteralNumber, "'Byte Offset'"); + DecorationOperands[DecorationXfbBuffer].push(OperandLiteralNumber, "'XFB Buffer Number'"); + DecorationOperands[DecorationXfbStride].push(OperandLiteralNumber, "'XFB Stride'"); + DecorationOperands[DecorationArrayStride].push(OperandLiteralNumber, "'Array Stride'"); + DecorationOperands[DecorationMatrixStride].push(OperandLiteralNumber, "'Matrix Stride'"); + DecorationOperands[DecorationBuiltIn].push(OperandLiteralNumber, "See <>"); + DecorationOperands[DecorationFPRoundingMode].push(OperandFPRoundingMode, "'Floating-Point Rounding Mode'"); + DecorationOperands[DecorationFPFastMathMode].push(OperandFPFastMath, "'Fast-Math Mode'"); + DecorationOperands[DecorationLinkageAttributes].push(OperandLiteralString, "'Name'"); + DecorationOperands[DecorationLinkageAttributes].push(OperandLinkageType, "'Linkage Type'"); + DecorationOperands[DecorationFuncParamAttr].push(OperandFuncParamAttr, "'Function Parameter Attribute'"); + DecorationOperands[DecorationSpecId].push(OperandLiteralNumber, "'Specialization Constant ID'"); + DecorationOperands[DecorationInputAttachmentIndex].push(OperandLiteralNumber, "'Attachment Index'"); + DecorationOperands[DecorationAlignment].push(OperandLiteralNumber, "'Alignment'"); + + OperandClassParams[OperandSource].set(0, SourceString, nullptr); + OperandClassParams[OperandExecutionModel].set(0, ExecutionModelString, nullptr); + OperandClassParams[OperandAddressing].set(0, AddressingString, nullptr); + OperandClassParams[OperandMemory].set(0, MemoryString, nullptr); + OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams); + OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands); + OperandClassParams[OperandStorage].set(0, StorageClassString, nullptr); + OperandClassParams[OperandDimensionality].set(0, DimensionString, nullptr); + OperandClassParams[OperandSamplerAddressingMode].set(0, SamplerAddressingModeString, nullptr); + OperandClassParams[OperandSamplerFilterMode].set(0, SamplerFilterModeString, nullptr); + OperandClassParams[OperandSamplerImageFormat].set(0, ImageFormatString, nullptr); + OperandClassParams[OperandImageChannelOrder].set(0, ImageChannelOrderString, nullptr); + OperandClassParams[OperandImageChannelDataType].set(0, ImageChannelDataTypeString, nullptr); + OperandClassParams[OperandImageOperands].set(ImageOperandsCeiling, ImageOperandsString, ImageOperandsParams, true); + OperandClassParams[OperandFPFastMath].set(0, FPFastMathString, nullptr, true); + OperandClassParams[OperandFPRoundingMode].set(0, FPRoundingModeString, nullptr); + OperandClassParams[OperandLinkageType].set(0, LinkageTypeString, nullptr); + OperandClassParams[OperandFuncParamAttr].set(0, FuncParamAttrString, nullptr); + OperandClassParams[OperandAccessQualifier].set(0, AccessQualifierString, nullptr); + OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams); + OperandClassParams[OperandDecoration].setOperands(DecorationOperands); + OperandClassParams[OperandBuiltIn].set(0, BuiltInString, nullptr); + OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true); + OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true); + OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true); + OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true); + OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true); + OperandClassParams[OperandScope].set(0, ScopeString, nullptr); + OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr); + OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr); + OperandClassParams[OperandKernelProfilingInfo].set(0, KernelProfilingInfoString, nullptr, true); + OperandClassParams[OperandCapability].set(0, CapabilityString, nullptr); + OperandClassParams[OperandCooperativeMatrixOperands].set(CooperativeMatrixOperandsCeiling, CooperativeMatrixOperandsString, CooperativeMatrixOperandsParams, true); + OperandClassParams[OperandOpcode].set(OpCodeMask + 1, OpcodeString, nullptr); + + // set name of operator, an initial set of style operands, and the description + + InstructionDesc[OpSource].operands.push(OperandSource, ""); + InstructionDesc[OpSource].operands.push(OperandLiteralNumber, "'Version'"); + InstructionDesc[OpSource].operands.push(OperandId, "'File'", true); + InstructionDesc[OpSource].operands.push(OperandLiteralString, "'Source'", true); + + InstructionDesc[OpSourceContinued].operands.push(OperandLiteralString, "'Continued Source'"); + + InstructionDesc[OpSourceExtension].operands.push(OperandLiteralString, "'Extension'"); + + InstructionDesc[OpName].operands.push(OperandId, "'Target'"); + InstructionDesc[OpName].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpMemberName].operands.push(OperandId, "'Type'"); + InstructionDesc[OpMemberName].operands.push(OperandLiteralNumber, "'Member'"); + InstructionDesc[OpMemberName].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpString].operands.push(OperandLiteralString, "'String'"); + + InstructionDesc[OpLine].operands.push(OperandId, "'File'"); + InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Line'"); + InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Column'"); + + InstructionDesc[OpExtension].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpExtInstImport].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpCapability].operands.push(OperandCapability, "'Capability'"); + + InstructionDesc[OpMemoryModel].operands.push(OperandAddressing, ""); + InstructionDesc[OpMemoryModel].operands.push(OperandMemory, ""); + + InstructionDesc[OpEntryPoint].operands.push(OperandExecutionModel, ""); + InstructionDesc[OpEntryPoint].operands.push(OperandId, "'Entry Point'"); + InstructionDesc[OpEntryPoint].operands.push(OperandLiteralString, "'Name'"); + InstructionDesc[OpEntryPoint].operands.push(OperandVariableIds, "'Interface'"); + + InstructionDesc[OpExecutionMode].operands.push(OperandId, "'Entry Point'"); + InstructionDesc[OpExecutionMode].operands.push(OperandExecutionMode, "'Mode'"); + InstructionDesc[OpExecutionMode].operands.push(OperandOptionalLiteral, "See <>"); + + InstructionDesc[OpExecutionModeId].operands.push(OperandId, "'Entry Point'"); + InstructionDesc[OpExecutionModeId].operands.push(OperandExecutionMode, "'Mode'"); + InstructionDesc[OpExecutionModeId].operands.push(OperandVariableIds, "See <>"); + + InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Width'"); + InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Signedness'"); + + InstructionDesc[OpTypeFloat].operands.push(OperandLiteralNumber, "'Width'"); + + InstructionDesc[OpTypeVector].operands.push(OperandId, "'Component Type'"); + InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber, "'Component Count'"); + + InstructionDesc[OpTypeMatrix].operands.push(OperandId, "'Column Type'"); + InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber, "'Column Count'"); - InstructionDesc[OpMemoryModel].operands.push(OperandAddressing, ""); - InstructionDesc[OpMemoryModel].operands.push(OperandMemory, ""); - - InstructionDesc[OpEntryPoint].operands.push(OperandExecutionModel, ""); - InstructionDesc[OpEntryPoint].operands.push(OperandId, "'Entry Point'"); - InstructionDesc[OpEntryPoint].operands.push(OperandLiteralString, "'Name'"); - InstructionDesc[OpEntryPoint].operands.push(OperandVariableIds, "'Interface'"); - - InstructionDesc[OpExecutionMode].operands.push(OperandId, "'Entry Point'"); - InstructionDesc[OpExecutionMode].operands.push(OperandExecutionMode, "'Mode'"); - InstructionDesc[OpExecutionMode].operands.push(OperandOptionalLiteral, "See <>"); - - InstructionDesc[OpExecutionModeId].operands.push(OperandId, "'Entry Point'"); - InstructionDesc[OpExecutionModeId].operands.push(OperandExecutionMode, "'Mode'"); - InstructionDesc[OpExecutionModeId].operands.push(OperandVariableIds, "See <>"); - - InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Width'"); - InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Signedness'"); - - InstructionDesc[OpTypeFloat].operands.push(OperandLiteralNumber, "'Width'"); - - InstructionDesc[OpTypeVector].operands.push(OperandId, "'Component Type'"); - InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber, "'Component Count'"); + InstructionDesc[OpTypeImage].operands.push(OperandId, "'Sampled Type'"); + InstructionDesc[OpTypeImage].operands.push(OperandDimensionality, ""); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Depth'"); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Arrayed'"); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'MS'"); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Sampled'"); + InstructionDesc[OpTypeImage].operands.push(OperandSamplerImageFormat, ""); + InstructionDesc[OpTypeImage].operands.push(OperandAccessQualifier, "", true); - InstructionDesc[OpTypeMatrix].operands.push(OperandId, "'Column Type'"); - InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber, "'Column Count'"); + InstructionDesc[OpTypeSampledImage].operands.push(OperandId, "'Image Type'"); - InstructionDesc[OpTypeImage].operands.push(OperandId, "'Sampled Type'"); - InstructionDesc[OpTypeImage].operands.push(OperandDimensionality, ""); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Depth'"); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Arrayed'"); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'MS'"); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Sampled'"); - InstructionDesc[OpTypeImage].operands.push(OperandSamplerImageFormat, ""); - InstructionDesc[OpTypeImage].operands.push(OperandAccessQualifier, "", true); + InstructionDesc[OpTypeArray].operands.push(OperandId, "'Element Type'"); + InstructionDesc[OpTypeArray].operands.push(OperandId, "'Length'"); - InstructionDesc[OpTypeSampledImage].operands.push(OperandId, "'Image Type'"); + InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId, "'Element Type'"); - InstructionDesc[OpTypeArray].operands.push(OperandId, "'Element Type'"); - InstructionDesc[OpTypeArray].operands.push(OperandId, "'Length'"); + InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds, "'Member 0 type', +\n'member 1 type', +\n..."); - InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId, "'Element Type'"); + InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString, "The name of the opaque type."); - InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds, "'Member 0 type', +\n'member 1 type', +\n..."); + InstructionDesc[OpTypePointer].operands.push(OperandStorage, ""); + InstructionDesc[OpTypePointer].operands.push(OperandId, "'Type'"); - InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString, "The name of the opaque type."); + InstructionDesc[OpTypeForwardPointer].operands.push(OperandId, "'Pointer Type'"); + InstructionDesc[OpTypeForwardPointer].operands.push(OperandStorage, ""); - InstructionDesc[OpTypePointer].operands.push(OperandStorage, ""); - InstructionDesc[OpTypePointer].operands.push(OperandId, "'Type'"); + InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier, "'Qualifier'"); - InstructionDesc[OpTypeForwardPointer].operands.push(OperandId, "'Pointer Type'"); - InstructionDesc[OpTypeForwardPointer].operands.push(OperandStorage, ""); + InstructionDesc[OpTypeFunction].operands.push(OperandId, "'Return Type'"); + InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds, "'Parameter 0 Type', +\n'Parameter 1 Type', +\n..."); - InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier, "'Qualifier'"); + InstructionDesc[OpConstant].operands.push(OperandVariableLiterals, "'Value'"); - InstructionDesc[OpTypeFunction].operands.push(OperandId, "'Return Type'"); - InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds, "'Parameter 0 Type', +\n'Parameter 1 Type', +\n..."); + InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); - InstructionDesc[OpConstant].operands.push(OperandVariableLiterals, "'Value'"); + InstructionDesc[OpConstantSampler].operands.push(OperandSamplerAddressingMode, ""); + InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Param'"); + InstructionDesc[OpConstantSampler].operands.push(OperandSamplerFilterMode, ""); - InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); + InstructionDesc[OpSpecConstant].operands.push(OperandVariableLiterals, "'Value'"); - InstructionDesc[OpConstantSampler].operands.push(OperandSamplerAddressingMode, ""); - InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Param'"); - InstructionDesc[OpConstantSampler].operands.push(OperandSamplerFilterMode, ""); + InstructionDesc[OpSpecConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); - InstructionDesc[OpSpecConstant].operands.push(OperandVariableLiterals, "'Value'"); + InstructionDesc[OpSpecConstantOp].operands.push(OperandLiteralNumber, "'Opcode'"); + InstructionDesc[OpSpecConstantOp].operands.push(OperandVariableIds, "'Operands'"); - InstructionDesc[OpSpecConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); + InstructionDesc[OpVariable].operands.push(OperandStorage, ""); + InstructionDesc[OpVariable].operands.push(OperandId, "'Initializer'", true); - InstructionDesc[OpSpecConstantOp].operands.push(OperandLiteralNumber, "'Opcode'"); - InstructionDesc[OpSpecConstantOp].operands.push(OperandVariableIds, "'Operands'"); + InstructionDesc[OpFunction].operands.push(OperandFunction, ""); + InstructionDesc[OpFunction].operands.push(OperandId, "'Function Type'"); - InstructionDesc[OpVariable].operands.push(OperandStorage, ""); - InstructionDesc[OpVariable].operands.push(OperandId, "'Initializer'", true); + InstructionDesc[OpFunctionCall].operands.push(OperandId, "'Function'"); + InstructionDesc[OpFunctionCall].operands.push(OperandVariableIds, "'Argument 0', +\n'Argument 1', +\n..."); - InstructionDesc[OpFunction].operands.push(OperandFunction, ""); - InstructionDesc[OpFunction].operands.push(OperandId, "'Function Type'"); + InstructionDesc[OpExtInst].operands.push(OperandId, "'Set'"); + InstructionDesc[OpExtInst].operands.push(OperandLiteralNumber, "'Instruction'"); + InstructionDesc[OpExtInst].operands.push(OperandVariableIds, "'Operand 1', +\n'Operand 2', +\n..."); - InstructionDesc[OpFunctionCall].operands.push(OperandId, "'Function'"); - InstructionDesc[OpFunctionCall].operands.push(OperandVariableIds, "'Argument 0', +\n'Argument 1', +\n..."); + InstructionDesc[OpExtInstWithForwardRefsKHR].operands.push(OperandId, "'Set'"); + InstructionDesc[OpExtInstWithForwardRefsKHR].operands.push(OperandLiteralNumber, "'Instruction'"); + InstructionDesc[OpExtInstWithForwardRefsKHR].operands.push(OperandVariableIds, "'Operand 1', +\n'Operand 2', +\n..."); - InstructionDesc[OpExtInst].operands.push(OperandId, "'Set'"); - InstructionDesc[OpExtInst].operands.push(OperandLiteralNumber, "'Instruction'"); - InstructionDesc[OpExtInst].operands.push(OperandVariableIds, "'Operand 1', +\n'Operand 2', +\n..."); + InstructionDesc[OpLoad].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpLoad].operands.push(OperandMemoryAccess, "", true); + InstructionDesc[OpLoad].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpLoad].operands.push(OperandId, "", true); - InstructionDesc[OpLoad].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpLoad].operands.push(OperandMemoryAccess, "", true); - InstructionDesc[OpLoad].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpLoad].operands.push(OperandId, "", true); + InstructionDesc[OpStore].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpStore].operands.push(OperandId, "'Object'"); + InstructionDesc[OpStore].operands.push(OperandMemoryAccess, "", true); + InstructionDesc[OpStore].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpStore].operands.push(OperandId, "", true); - InstructionDesc[OpStore].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpStore].operands.push(OperandId, "'Object'"); - InstructionDesc[OpStore].operands.push(OperandMemoryAccess, "", true); - InstructionDesc[OpStore].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpStore].operands.push(OperandId, "", true); + InstructionDesc[OpPhi].operands.push(OperandVariableIds, "'Variable, Parent, ...'"); - InstructionDesc[OpPhi].operands.push(OperandVariableIds, "'Variable, Parent, ...'"); + InstructionDesc[OpDecorate].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorate].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <>."); - InstructionDesc[OpDecorate].operands.push(OperandId, "'Target'"); - InstructionDesc[OpDecorate].operands.push(OperandDecoration, ""); - InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <>."); + InstructionDesc[OpDecorateId].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorateId].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorateId].operands.push(OperandVariableIds, "See <>."); - InstructionDesc[OpDecorateId].operands.push(OperandId, "'Target'"); - InstructionDesc[OpDecorateId].operands.push(OperandDecoration, ""); - InstructionDesc[OpDecorateId].operands.push(OperandVariableIds, "See <>."); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); - InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'"); - InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, ""); - InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); + InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'"); + InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'"); + InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, ""); + InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <>."); - InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'"); - InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'"); - InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, ""); - InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <>."); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'"); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'"); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, ""); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'"); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'"); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, ""); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); + InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'"); + InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'"); - InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'"); - InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'"); + InstructionDesc[OpGroupMemberDecorate].operands.push(OperandId, "'Decoration Group'"); + InstructionDesc[OpGroupMemberDecorate].operands.push(OperandVariableIdLiteral, "'Targets'"); - InstructionDesc[OpGroupMemberDecorate].operands.push(OperandId, "'Decoration Group'"); - InstructionDesc[OpGroupMemberDecorate].operands.push(OperandVariableIdLiteral, "'Targets'"); + InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Index'"); - InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Index'"); + InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Component'"); + InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Index'"); - InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Component'"); - InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Index'"); + InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 1'"); + InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 2'"); + InstructionDesc[OpVectorShuffle].operands.push(OperandVariableLiterals, "'Components'"); - InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 1'"); - InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 2'"); - InstructionDesc[OpVectorShuffle].operands.push(OperandVariableLiterals, "'Components'"); + InstructionDesc[OpCompositeConstruct].operands.push(OperandVariableIds, "'Constituents'"); - InstructionDesc[OpCompositeConstruct].operands.push(OperandVariableIds, "'Constituents'"); + InstructionDesc[OpCompositeExtract].operands.push(OperandId, "'Composite'"); + InstructionDesc[OpCompositeExtract].operands.push(OperandVariableLiterals, "'Indexes'"); - InstructionDesc[OpCompositeExtract].operands.push(OperandId, "'Composite'"); - InstructionDesc[OpCompositeExtract].operands.push(OperandVariableLiterals, "'Indexes'"); + InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Object'"); + InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Composite'"); + InstructionDesc[OpCompositeInsert].operands.push(OperandVariableLiterals, "'Indexes'"); - InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Object'"); - InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Composite'"); - InstructionDesc[OpCompositeInsert].operands.push(OperandVariableLiterals, "'Indexes'"); + InstructionDesc[OpCopyObject].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpCopyObject].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Target'"); + InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Source'"); + InstructionDesc[OpCopyMemory].operands.push(OperandMemoryAccess, "", true); + + InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Target'"); + InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Source'"); + InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Size'"); + InstructionDesc[OpCopyMemorySized].operands.push(OperandMemoryAccess, "", true); + + InstructionDesc[OpSampledImage].operands.push(OperandId, "'Image'"); + InstructionDesc[OpSampledImage].operands.push(OperandId, "'Sampler'"); + + InstructionDesc[OpImage].operands.push(OperandId, "'Sampled Image'"); + + InstructionDesc[OpImageRead].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageRead].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageRead].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageRead].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageWrite].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageWrite].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageWrite].operands.push(OperandId, "'Texel'"); + InstructionDesc[OpImageWrite].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageWrite].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageFetch].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageFetch].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageFetch].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageFetch].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageGather].operands.push(OperandId, "'Component'"); + InstructionDesc[OpImageGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageGather].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageDrefGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageDrefGather].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Target'"); - InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Source'"); - InstructionDesc[OpCopyMemory].operands.push(OperandMemoryAccess, "", true); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Target'"); - InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Source'"); - InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Size'"); - InstructionDesc[OpCopyMemorySized].operands.push(OperandMemoryAccess, "", true); - - InstructionDesc[OpSampledImage].operands.push(OperandId, "'Image'"); - InstructionDesc[OpSampledImage].operands.push(OperandId, "'Sampler'"); - - InstructionDesc[OpImage].operands.push(OperandId, "'Sampled Image'"); - - InstructionDesc[OpImageRead].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageRead].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageRead].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageRead].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageWrite].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageWrite].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageWrite].operands.push(OperandId, "'Texel'"); - InstructionDesc[OpImageWrite].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageWrite].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageFetch].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageFetch].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageFetch].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageFetch].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageGather].operands.push(OperandId, "'Component'"); - InstructionDesc[OpImageGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageGather].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageDrefGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageDrefGather].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseFetch].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseFetch].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Component'"); + InstructionDesc[OpImageSparseGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseFetch].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseFetch].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Component'"); - InstructionDesc[OpImageSparseGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseGather].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseRead].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseRead].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageSparseTexelsResident].operands.push(OperandId, "'Resident Code'"); - InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseRead].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseRead].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Level of Detail'"); - InstructionDesc[OpImageSparseTexelsResident].operands.push(OperandId, "'Resident Code'"); + InstructionDesc[OpImageQuerySize].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Level of Detail'"); + InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageQuerySize].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageQueryLevels].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageQuerySamples].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryLevels].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageQueryFormat].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQuerySamples].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageQueryOrder].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryFormat].operands.push(OperandId, "'Image'"); + InstructionDesc[OpAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpImageQueryOrder].operands.push(OperandId, "'Image'"); + InstructionDesc[OpInBoundsAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpInBoundsAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Element'"); + InstructionDesc[OpPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpInBoundsAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpInBoundsAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Element'"); + InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Element'"); - InstructionDesc[OpPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpSNegate].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Element'"); - InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpFNegate].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpSNegate].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpNot].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpFNegate].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpAny].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpNot].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpAll].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpAny].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpConvertFToU].operands.push(OperandId, "'Float Value'"); - InstructionDesc[OpAll].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpConvertFToS].operands.push(OperandId, "'Float Value'"); - InstructionDesc[OpConvertFToU].operands.push(OperandId, "'Float Value'"); + InstructionDesc[OpConvertSToF].operands.push(OperandId, "'Signed Value'"); - InstructionDesc[OpConvertFToS].operands.push(OperandId, "'Float Value'"); + InstructionDesc[OpConvertUToF].operands.push(OperandId, "'Unsigned Value'"); - InstructionDesc[OpConvertSToF].operands.push(OperandId, "'Signed Value'"); + InstructionDesc[OpUConvert].operands.push(OperandId, "'Unsigned Value'"); - InstructionDesc[OpConvertUToF].operands.push(OperandId, "'Unsigned Value'"); + InstructionDesc[OpSConvert].operands.push(OperandId, "'Signed Value'"); - InstructionDesc[OpUConvert].operands.push(OperandId, "'Unsigned Value'"); + InstructionDesc[OpFConvert].operands.push(OperandId, "'Float Value'"); - InstructionDesc[OpSConvert].operands.push(OperandId, "'Signed Value'"); + InstructionDesc[OpSatConvertSToU].operands.push(OperandId, "'Signed Value'"); - InstructionDesc[OpFConvert].operands.push(OperandId, "'Float Value'"); + InstructionDesc[OpSatConvertUToS].operands.push(OperandId, "'Unsigned Value'"); - InstructionDesc[OpSatConvertSToU].operands.push(OperandId, "'Signed Value'"); + InstructionDesc[OpConvertPtrToU].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpSatConvertUToS].operands.push(OperandId, "'Unsigned Value'"); + InstructionDesc[OpConvertUToPtr].operands.push(OperandId, "'Integer Value'"); - InstructionDesc[OpConvertPtrToU].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpConvertUToPtr].operands.push(OperandId, "'Integer Value'"); + InstructionDesc[OpGenericCastToPtr].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage, "'Storage'"); - InstructionDesc[OpGenericCastToPtr].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage, "'Storage'"); + InstructionDesc[OpBitcast].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpQuantizeToF16].operands.push(OperandId, "'Value'"); - InstructionDesc[OpBitcast].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpQuantizeToF16].operands.push(OperandId, "'Value'"); + InstructionDesc[OpCopyLogical].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpIsNan].operands.push(OperandId, "'x'"); - InstructionDesc[OpCopyLogical].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpIsInf].operands.push(OperandId, "'x'"); - InstructionDesc[OpIsNan].operands.push(OperandId, "'x'"); + InstructionDesc[OpIsFinite].operands.push(OperandId, "'x'"); - InstructionDesc[OpIsInf].operands.push(OperandId, "'x'"); + InstructionDesc[OpIsNormal].operands.push(OperandId, "'x'"); - InstructionDesc[OpIsFinite].operands.push(OperandId, "'x'"); + InstructionDesc[OpSignBitSet].operands.push(OperandId, "'x'"); - InstructionDesc[OpIsNormal].operands.push(OperandId, "'x'"); + InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'x'"); + InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'y'"); - InstructionDesc[OpSignBitSet].operands.push(OperandId, "'x'"); + InstructionDesc[OpOrdered].operands.push(OperandId, "'x'"); + InstructionDesc[OpOrdered].operands.push(OperandId, "'y'"); - InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'x'"); - InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'y'"); + InstructionDesc[OpUnordered].operands.push(OperandId, "'x'"); + InstructionDesc[OpUnordered].operands.push(OperandId, "'y'"); - InstructionDesc[OpOrdered].operands.push(OperandId, "'x'"); - InstructionDesc[OpOrdered].operands.push(OperandId, "'y'"); + InstructionDesc[OpArrayLength].operands.push(OperandId, "'Structure'"); + InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber, "'Array member'"); - InstructionDesc[OpUnordered].operands.push(OperandId, "'x'"); - InstructionDesc[OpUnordered].operands.push(OperandId, "'y'"); + InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpArrayLength].operands.push(OperandId, "'Structure'"); - InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber, "'Array member'"); + InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpISub].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpISub].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpISub].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpISub].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Scalar'"); - InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Scalar'"); - InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Scalar'"); + InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Scalar'"); + InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'LeftMatrix'"); + InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'RightMatrix'"); - InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 1'"); + InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 2'"); - InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'LeftMatrix'"); - InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'RightMatrix'"); + InstructionDesc[OpDot].operands.push(OperandId, "'Vector 1'"); + InstructionDesc[OpDot].operands.push(OperandId, "'Vector 2'"); - InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 1'"); - InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 2'"); + InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpDot].operands.push(OperandId, "'Vector 1'"); - InstructionDesc[OpDot].operands.push(OperandId, "'Vector 2'"); + InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Base'"); + InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Shift'"); - InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Base'"); + InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Shift'"); - InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Base'"); - InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Shift'"); + InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Base'"); + InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Shift'"); - InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Base'"); - InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Shift'"); + InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Base'"); - InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Shift'"); + InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpLogicalNot].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpLogicalNot].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Insert'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Offset'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Count'"); - InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Offset'"); + InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Count'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Base'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Insert'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Offset'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Count'"); + InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Offset'"); + InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Count'"); - InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Base'"); - InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Offset'"); - InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Count'"); - - InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Base'"); - InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Offset'"); - InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Count'"); - - InstructionDesc[OpBitReverse].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitReverse].operands.push(OperandId, "'Base'"); - InstructionDesc[OpBitCount].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitCount].operands.push(OperandId, "'Base'"); - InstructionDesc[OpSelect].operands.push(OperandId, "'Condition'"); - InstructionDesc[OpSelect].operands.push(OperandId, "'Object 1'"); - InstructionDesc[OpSelect].operands.push(OperandId, "'Object 2'"); + InstructionDesc[OpSelect].operands.push(OperandId, "'Condition'"); + InstructionDesc[OpSelect].operands.push(OperandId, "'Object 1'"); + InstructionDesc[OpSelect].operands.push(OperandId, "'Object 2'"); - InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpDPdx].operands.push(OperandId, "'P'"); + InstructionDesc[OpDPdx].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdy].operands.push(OperandId, "'P'"); + InstructionDesc[OpDPdy].operands.push(OperandId, "'P'"); - InstructionDesc[OpFwidth].operands.push(OperandId, "'P'"); + InstructionDesc[OpFwidth].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdxFine].operands.push(OperandId, "'P'"); + InstructionDesc[OpDPdxFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdyFine].operands.push(OperandId, "'P'"); + InstructionDesc[OpDPdyFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpFwidthFine].operands.push(OperandId, "'P'"); + InstructionDesc[OpFwidthFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdxCoarse].operands.push(OperandId, "'P'"); + InstructionDesc[OpDPdxCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdyCoarse].operands.push(OperandId, "'P'"); + InstructionDesc[OpDPdyCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpFwidthCoarse].operands.push(OperandId, "'P'"); + InstructionDesc[OpFwidthCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpEmitStreamVertex].operands.push(OperandId, "'Stream'"); + InstructionDesc[OpEmitStreamVertex].operands.push(OperandId, "'Stream'"); - InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId, "'Stream'"); + InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId, "'Stream'"); - InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Memory'"); - InstructionDesc[OpControlBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Memory'"); + InstructionDesc[OpControlBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpMemoryBarrier].operands.push(OperandScope, "'Memory'"); - InstructionDesc[OpMemoryBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpMemoryBarrier].operands.push(OperandScope, "'Memory'"); + InstructionDesc[OpMemoryBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Sample'"); + InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Sample'"); - InstructionDesc[OpAtomicLoad].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicLoad].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicLoad].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicLoad].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicLoad].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicLoad].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicStore].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicStore].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicStore].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicStore].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Equal'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Unequal'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Comparator'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Equal'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Unequal'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Comparator'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Equal'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Unequal'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Comparator'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Equal'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Unequal'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Comparator'"); - InstructionDesc[OpAtomicIIncrement].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicIIncrement].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicIIncrement].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicIIncrement].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicIIncrement].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicIIncrement].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicIDecrement].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicIDecrement].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicIDecrement].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicIDecrement].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicIDecrement].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicIDecrement].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicISub].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAssumeTrueKHR].operands.push(OperandId, "'Condition'"); - InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicUMin].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicUMin].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Value'"); + InstructionDesc[OpExpectKHR].operands.push(OperandId, "'Value'"); + InstructionDesc[OpExpectKHR].operands.push(OperandId, "'ExpectedValue'"); - InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicUMax].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicUMax].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicISub].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicSMin].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicSMin].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicSMax].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicSMax].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicAnd].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicAnd].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicOr].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicOr].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicXor].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicXor].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandMemorySemantics, "'Semantics'"); - - InstructionDesc[OpAtomicFlagClear].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFlagClear].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFlagClear].operands.push(OperandMemorySemantics, "'Semantics'"); - - InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Merge Block'"); - InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Continue Target'"); - InstructionDesc[OpLoopMerge].operands.push(OperandLoop, ""); - InstructionDesc[OpLoopMerge].operands.push(OperandOptionalLiteral, ""); - - InstructionDesc[OpSelectionMerge].operands.push(OperandId, "'Merge Block'"); - InstructionDesc[OpSelectionMerge].operands.push(OperandSelect, ""); - - InstructionDesc[OpBranch].operands.push(OperandId, "'Target Label'"); - - InstructionDesc[OpBranchConditional].operands.push(OperandId, "'Condition'"); - InstructionDesc[OpBranchConditional].operands.push(OperandId, "'True Label'"); - InstructionDesc[OpBranchConditional].operands.push(OperandId, "'False Label'"); - InstructionDesc[OpBranchConditional].operands.push(OperandVariableLiterals, "'Branch weights'"); - - InstructionDesc[OpSwitch].operands.push(OperandId, "'Selector'"); - InstructionDesc[OpSwitch].operands.push(OperandId, "'Default'"); - InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId, "'Target'"); - - - InstructionDesc[OpReturnValue].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpLifetimeStart].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber, "'Size'"); - - InstructionDesc[OpLifetimeStop].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber, "'Size'"); - - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Destination'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Source'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Num Elements'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Stride'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpGroupWaitEvents].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Num Events'"); - InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Events List'"); - - InstructionDesc[OpGroupAll].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupAll].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpGroupAny].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupAny].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpGroupBroadcast].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'Value'"); - InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'LocalId'"); - - InstructionDesc[OpGroupIAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupIAdd].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupFAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFAdd].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupUMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMin].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupSMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMin].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMin].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupUMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMax].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupSMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMax].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMax].operands.push(OperandId, "X"); - - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Index'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Index'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpIsValidReserveId].operands.push(OperandId, "'Reserve Id'"); - - InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkSize'"); - InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'LocalWorkSize'"); - InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkOffset'"); - - InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Event'"); - InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Profiling Info'"); - InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Event'"); - InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Status'"); - - InstructionDesc[OpIsValidEvent].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpRetainEvent].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpReleaseEvent].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'ND Range'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'ND Range'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Queue'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Flags'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'ND Range'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Num Events'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Wait Events'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Ret Event'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Align'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds, "'Local Size'"); - - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Queue'"); - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Num Events'"); - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'"); - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'"); - - InstructionDesc[OpGroupNonUniformElect].operands.push(OperandScope, "'Execution'"); - - InstructionDesc[OpGroupNonUniformAll].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformAll].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformAny].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformAny].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "ID"); - - InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "Bit"); - - InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "'Id'"); - - InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "Mask"); - - InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "Offset"); - - InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "Offset"); - - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Value'"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicAnd].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicAnd].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicOr].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicOr].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicXor].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicXor].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandMemorySemantics, "'Semantics'"); + + InstructionDesc[OpAtomicFlagClear].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFlagClear].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFlagClear].operands.push(OperandMemorySemantics, "'Semantics'"); + + InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Merge Block'"); + InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Continue Target'"); + InstructionDesc[OpLoopMerge].operands.push(OperandLoop, ""); + InstructionDesc[OpLoopMerge].operands.push(OperandOptionalLiteral, ""); + + InstructionDesc[OpSelectionMerge].operands.push(OperandId, "'Merge Block'"); + InstructionDesc[OpSelectionMerge].operands.push(OperandSelect, ""); + + InstructionDesc[OpBranch].operands.push(OperandId, "'Target Label'"); + + InstructionDesc[OpBranchConditional].operands.push(OperandId, "'Condition'"); + InstructionDesc[OpBranchConditional].operands.push(OperandId, "'True Label'"); + InstructionDesc[OpBranchConditional].operands.push(OperandId, "'False Label'"); + InstructionDesc[OpBranchConditional].operands.push(OperandVariableLiterals, "'Branch weights'"); + + InstructionDesc[OpSwitch].operands.push(OperandId, "'Selector'"); + InstructionDesc[OpSwitch].operands.push(OperandId, "'Default'"); + InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId, "'Target'"); + + + InstructionDesc[OpReturnValue].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpLifetimeStart].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber, "'Size'"); + + InstructionDesc[OpLifetimeStop].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber, "'Size'"); + + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Destination'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Source'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Num Elements'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpGroupWaitEvents].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Num Events'"); + InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Events List'"); + + InstructionDesc[OpGroupAll].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupAll].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpGroupAny].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupAny].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpGroupBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'Value'"); + InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'LocalId'"); + + InstructionDesc[OpGroupIAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupIAdd].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupFAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFAdd].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupUMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMin].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupSMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMin].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMin].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupUMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMax].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupSMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMax].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMax].operands.push(OperandId, "X"); + + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Index'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Index'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpIsValidReserveId].operands.push(OperandId, "'Reserve Id'"); + + InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkSize'"); + InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'LocalWorkSize'"); + InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkOffset'"); + + InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Event'"); + InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Profiling Info'"); + InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Event'"); + InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Status'"); + + InstructionDesc[OpIsValidEvent].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpRetainEvent].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpReleaseEvent].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'ND Range'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'ND Range'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Queue'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Flags'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'ND Range'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Num Events'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Wait Events'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Ret Event'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Align'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds, "'Local Size'"); + + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Queue'"); + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Num Events'"); + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'"); + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'"); + + InstructionDesc[OpGroupNonUniformElect].operands.push(OperandScope, "'Execution'"); + + InstructionDesc[OpGroupNonUniformAll].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAll].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformAny].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAny].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "ID"); + + InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "Bit"); + + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "'Id'"); + + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "Mask"); + + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "Offset"); + + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "Offset"); + + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "'Id'"); - - InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "'Direction'"); - - InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupAllKHR].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpSubgroupAllKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'"); - InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'"); - - InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'"); - - InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Image'"); - InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Coordinate'"); - - InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'"); - InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'"); - - InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X"); - - InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); - - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Acceleration Structure'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Flags'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Cull Mask'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Offset'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Stride'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Miss Index'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Origin'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMin'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Direction'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMax'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'"); - InstructionDesc[OpTraceNV].setResultAndType(false, false); - - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Flags'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Cull Mask'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Miss Index'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Origin'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMin'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Direction'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMax'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Time'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Payload'"); - InstructionDesc[OpTraceRayMotionNV].setResultAndType(false, false); - - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Offset'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Stride'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Miss Index'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Origin'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMin'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Direction'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMax'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Payload'"); - InstructionDesc[OpTraceRayKHR].setResultAndType(false, false); - - InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Parameter'"); - InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Kind'"); - - InstructionDesc[OpIgnoreIntersectionNV].setResultAndType(false, false); - - InstructionDesc[OpIgnoreIntersectionKHR].setResultAndType(false, false); - - InstructionDesc[OpTerminateRayNV].setResultAndType(false, false); - - InstructionDesc[OpTerminateRayKHR].setResultAndType(false, false); - - InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "SBT Record Index"); - InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "CallableData ID"); - InstructionDesc[OpExecuteCallableNV].setResultAndType(false, false); - - InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "SBT Record Index"); - InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData"); - InstructionDesc[OpExecuteCallableKHR].setResultAndType(false, false); - - InstructionDesc[OpConvertUToAccelerationStructureKHR].operands.push(OperandId, "Value"); - InstructionDesc[OpConvertUToAccelerationStructureKHR].setResultAndType(true, true); - - // Ray Query - InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); - InstructionDesc[OpTypeRayQueryKHR].setResultAndType(true, false); - - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'AccelerationS'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayFlags'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'CullMask'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Origin'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmin'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Direction'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmax'"); - InstructionDesc[OpRayQueryInitializeKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryTerminateKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryTerminateKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'THit'"); - InstructionDesc[OpRayQueryGenerateIntersectionKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryConfirmIntersectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryConfirmIntersectionKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryProceedKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryProceedKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionTypeKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetRayTMinKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetRayTMinKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetRayFlagsKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetRayFlagsKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionTKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].setResultAndType(true, true); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].setResultAndType(true, true); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].setResultAndType(true, true); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "'Id'"); + + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "'Direction'"); + + InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpSubgroupAllKHR].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpSubgroupAllKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpGroupNonUniformRotateKHR].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformRotateKHR].operands.push(OperandId, "'X'"); + InstructionDesc[OpGroupNonUniformRotateKHR].operands.push(OperandId, "'Delta'"); + InstructionDesc[OpGroupNonUniformRotateKHR].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'"); + InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'"); + + InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'"); + + InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Image'"); + InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Coordinate'"); + + InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'"); + InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'"); + + InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformQuadAllKHR].operands.push(OperandId, "'Predicate'"); + InstructionDesc[OpGroupNonUniformQuadAnyKHR].operands.push(OperandId, "'Predicate'"); + InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); + + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Flags'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Cull Mask'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Origin'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Direction'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpTraceNV].setResultAndType(false, false); + + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Flags'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Cull Mask'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Origin'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Direction'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Time'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpTraceRayMotionNV].setResultAndType(false, false); + + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Origin'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Direction'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpTraceRayKHR].setResultAndType(false, false); + + InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Parameter'"); + InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Kind'"); + + InstructionDesc[OpIgnoreIntersectionNV].setResultAndType(false, false); + + InstructionDesc[OpIgnoreIntersectionKHR].setResultAndType(false, false); + + InstructionDesc[OpTerminateRayNV].setResultAndType(false, false); + + InstructionDesc[OpTerminateRayKHR].setResultAndType(false, false); + + InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "SBT Record Index"); + InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "CallableData ID"); + InstructionDesc[OpExecuteCallableNV].setResultAndType(false, false); + + InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "SBT Record Index"); + InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData"); + InstructionDesc[OpExecuteCallableKHR].setResultAndType(false, false); + + InstructionDesc[OpConvertUToAccelerationStructureKHR].operands.push(OperandId, "Value"); + InstructionDesc[OpConvertUToAccelerationStructureKHR].setResultAndType(true, true); + + // Ray Query + InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); + InstructionDesc[OpTypeRayQueryKHR].setResultAndType(true, false); + + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'AccelerationS'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayFlags'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'CullMask'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmin'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmax'"); + InstructionDesc[OpRayQueryInitializeKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryTerminateKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryTerminateKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'THit'"); + InstructionDesc[OpRayQueryGenerateIntersectionKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryConfirmIntersectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryConfirmIntersectionKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryProceedKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryProceedKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionTypeKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetRayTMinKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetRayTMinKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetRayFlagsKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetRayFlagsKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionTKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].setResultAndType(true, true); - InstructionDesc[OpRayQueryGetWorldRayOriginKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetWorldRayOriginKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].setResultAndType(true, true); - - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Granularity'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coarse'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'"); - InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'"); - - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Component Type'"); - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Scope'"); - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Rows'"); - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Columns'"); - - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Stride'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Column Major'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandMemoryAccess, "'Memory Access'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "", true); + InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].setResultAndType(true, true); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Object'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Stride'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Column Major'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandMemoryAccess, "'Memory Access'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "", true); + InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].setResultAndType(true, true); - InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'A'"); - InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'B'"); - InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'C'"); - - InstructionDesc[OpCooperativeMatrixLengthNV].operands.push(OperandId, "'Type'"); - - InstructionDesc[OpDemoteToHelperInvocationEXT].setResultAndType(false, false); - - InstructionDesc[OpReadClockKHR].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpRayQueryGetWorldRayOriginKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetWorldRayOriginKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].setResultAndType(true, true); + + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Granularity'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coarse'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'"); + InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'"); + + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountX'"); + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountY'"); + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountZ'"); + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpEmitMeshTasksEXT].setResultAndType(false, false); + + InstructionDesc[OpSetMeshOutputsEXT].operands.push(OperandId, "'vertexCount'"); + InstructionDesc[OpSetMeshOutputsEXT].operands.push(OperandId, "'primitiveCount'"); + InstructionDesc[OpSetMeshOutputsEXT].setResultAndType(false, false); + + + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Component Type'"); + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Scope'"); + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Rows'"); + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Columns'"); + + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Column Major'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "", true); + + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Object'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Column Major'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "", true); + + InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'A'"); + InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'B'"); + InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'C'"); + + InstructionDesc[OpCooperativeMatrixLengthNV].operands.push(OperandId, "'Type'"); + + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Component Type'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Scope'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Rows'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Columns'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Use'"); + + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "'Memory Layout'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "", true); + + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Object'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Memory Layout'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "", true); + + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandId, "'A'"); + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandId, "'B'"); + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandId, "'C'"); + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandCooperativeMatrixOperands, "'Cooperative Matrix Operands'", true); + + InstructionDesc[OpCooperativeMatrixLengthKHR].operands.push(OperandId, "'Type'"); + + InstructionDesc[OpDemoteToHelperInvocationEXT].setResultAndType(false, false); + + InstructionDesc[OpReadClockKHR].operands.push(OperandScope, "'Scope'"); + + InstructionDesc[OpTypeHitObjectNV].setResultAndType(true, false); + + InstructionDesc[OpHitObjectGetShaderRecordBufferHandleNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetShaderRecordBufferHandleNV].setResultAndType(true, true); + + InstructionDesc[OpReorderThreadWithHintNV].operands.push(OperandId, "'Hint'"); + InstructionDesc[OpReorderThreadWithHintNV].operands.push(OperandId, "'Bits'"); + InstructionDesc[OpReorderThreadWithHintNV].setResultAndType(false, false); + + InstructionDesc[OpReorderThreadWithHitObjectNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpReorderThreadWithHitObjectNV].operands.push(OperandId, "'Hint'"); + InstructionDesc[OpReorderThreadWithHitObjectNV].operands.push(OperandId, "'Bits'"); + InstructionDesc[OpReorderThreadWithHitObjectNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectGetCurrentTimeNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetCurrentTimeNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetHitKindNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetHitKindNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetPrimitiveIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetPrimitiveIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetGeometryIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetGeometryIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetInstanceIdNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetInstanceIdNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetInstanceCustomIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetInstanceCustomIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetObjectRayDirectionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetObjectRayDirectionNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetObjectRayOriginNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetObjectRayOriginNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetWorldRayDirectionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetWorldRayDirectionNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetWorldRayOriginNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetWorldRayOriginNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetWorldToObjectNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetWorldToObjectNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetObjectToWorldNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetObjectToWorldNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetRayTMaxNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetRayTMaxNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetRayTMinNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetRayTMinNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetShaderBindingTableRecordIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetShaderBindingTableRecordIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectIsEmptyNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectIsEmptyNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectIsHitNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectIsHitNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectIsMissNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectIsMissNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetAttributesNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetAttributesNV].operands.push(OperandId, "'HitObjectAttribute'"); + InstructionDesc[OpHitObjectGetAttributesNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectExecuteShaderNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectExecuteShaderNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpHitObjectExecuteShaderNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Current Time'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'SBT Record Index'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'SBT Record Index'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Current Time'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'SBT Index'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordMissNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'SBT Index'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'Current Time'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordEmptyNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordEmptyNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'RayFlags'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Cullmask'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpHitObjectTraceRayNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'RayFlags'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Cullmask'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Time'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].setResultAndType(false, false); + + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Instance ID'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Geometry Index'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Primitive Index'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Barycentrics'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].setResultAndType(true, true); + + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Instance ID'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Geometry Index'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Primitive Index'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Barycentrics'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].setResultAndType(true, true); + + InstructionDesc[OpColorAttachmentReadEXT].operands.push(OperandId, "'Attachment'"); + InstructionDesc[OpColorAttachmentReadEXT].operands.push(OperandId, "'Sample'", true); + InstructionDesc[OpStencilAttachmentReadEXT].operands.push(OperandId, "'Sample'", true); + InstructionDesc[OpDepthAttachmentReadEXT].operands.push(OperandId, "'Sample'", true); + + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandId, "'source texture'"); + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandId, "'texture coordinates'"); + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandId, "'weights texture'"); + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleWeightedQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandId, "'source texture'"); + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandId, "'texture coordinates'"); + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandId, "'box size'"); + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBoxFilterQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchSADQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchSSDQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchWindowSSDQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchWindowSADQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchGatherSSDQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchGatherSADQCOM].setResultAndType(true, true); + + InstructionDesc[OpConstantCompositeReplicateEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpSpecConstantCompositeReplicateEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpCompositeConstructReplicateEXT].operands.push(OperandId, "'Value'"); + }); } }; // end spv namespace diff --git a/libraries/ZVulkan/src/glslang/spirv/doc.h b/libraries/ZVulkan/src/glslang/spirv/doc.h index 2a0b28c6b..521529913 100644 --- a/libraries/ZVulkan/src/glslang/spirv/doc.h +++ b/libraries/ZVulkan/src/glslang/spirv/doc.h @@ -156,6 +156,7 @@ enum OperandClass { OperandKernelEnqueueFlags, OperandKernelProfilingInfo, OperandCapability, + OperandCooperativeMatrixOperands, OperandOpcode, @@ -190,15 +191,15 @@ protected: // Parameterize an enumerant class EnumParameters { public: - EnumParameters() : desc(0) { } + EnumParameters() : desc(nullptr) { } const char* desc; }; // Parameterize a set of enumerants that form an enum class EnumDefinition : public EnumParameters { public: - EnumDefinition() : - ceiling(0), bitmask(false), getName(0), enumParams(0), operandParams(0) { } + EnumDefinition() : + ceiling(0), bitmask(false), getName(nullptr), enumParams(nullptr), operandParams(nullptr) { } void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false) { ceiling = ceil; @@ -239,8 +240,8 @@ public: OperandParameters operands; protected: - int typePresent : 1; - int resultPresent : 1; + bool typePresent : 1; + bool resultPresent : 1; }; // The set of objects that hold all the instruction/operand diff --git a/libraries/ZVulkan/src/glslang/spirv/hex_float.h b/libraries/ZVulkan/src/glslang/spirv/hex_float.h index 8be8e9f7e..785e8af11 100644 --- a/libraries/ZVulkan/src/glslang/spirv/hex_float.h +++ b/libraries/ZVulkan/src/glslang/spirv/hex_float.h @@ -23,19 +23,6 @@ #include #include -#if defined(_MSC_VER) && _MSC_VER < 1800 -namespace std { -bool isnan(double f) -{ - return ::_isnan(f) != 0; -} -bool isinf(double f) -{ - return ::_finite(f) == 0; -} -} -#endif - #include "bitutils.h" namespace spvutils { diff --git a/libraries/ZVulkan/src/glslang/spirv/spirv.hpp b/libraries/ZVulkan/src/glslang/spirv/spirv.hpp index e0fe24980..38af7fc3e 100644 --- a/libraries/ZVulkan/src/glslang/spirv/spirv.hpp +++ b/libraries/ZVulkan/src/glslang/spirv/spirv.hpp @@ -1,19 +1,19 @@ -// Copyright (c) 2014-2020 The Khronos Group Inc. -// +// Copyright (c) 2014-2024 The Khronos Group Inc. +// // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), // to deal in the Materials without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Materials, and to permit persons to whom the // Materials are furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Materials. -// +// // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS // STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ -// +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// // THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL @@ -26,8 +26,8 @@ // the Binary Section of the SPIR-V specification. // Enumeration tokens for SPIR-V, in various styles: -// C, C++, C++11, JSON, Lua, Python, C#, D -// +// C, C++, C++11, JSON, Lua, Python, C#, D, Beef +// // - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL // - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL // - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL @@ -36,7 +36,9 @@ // - C# will use enum classes in the Specification class located in the "Spv" namespace, // e.g.: Spv.Specification.SourceLanguage.GLSL // - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL -// +// - Beef will use enum classes in the Specification class located in the "Spv" namespace, +// e.g.: Spv.Specification.SourceLanguage.GLSL +// // Some tokens act like mask values, which can be OR'd together, // while others are mutually exclusive. The mask-like ones have // "Mask" in their name, and a parallel enum that has the shift @@ -49,12 +51,12 @@ namespace spv { typedef unsigned int Id; -#define SPV_VERSION 0x10500 -#define SPV_REVISION 4 +#define SPV_VERSION 0x10600 +#define SPV_REVISION 1 static const unsigned int MagicNumber = 0x07230203; -static const unsigned int Version = 0x00010500; -static const unsigned int Revision = 4; +static const unsigned int Version = 0x00010600; +static const unsigned int Revision = 1; static const unsigned int OpCodeMask = 0xffff; static const unsigned int WordCountShift = 16; @@ -65,6 +67,8 @@ enum SourceLanguage { SourceLanguageOpenCL_C = 3, SourceLanguageOpenCL_CPP = 4, SourceLanguageHLSL = 5, + SourceLanguageCPP_for_OpenCL = 6, + SourceLanguageSYCL = 7, SourceLanguageMax = 0x7fffffff, }; @@ -90,6 +94,8 @@ enum ExecutionModel { ExecutionModelMissNV = 5317, ExecutionModelCallableKHR = 5318, ExecutionModelCallableNV = 5318, + ExecutionModelTaskEXT = 5364, + ExecutionModelMeshEXT = 5365, ExecutionModelMax = 0x7fffffff, }; @@ -150,6 +156,9 @@ enum ExecutionMode { ExecutionModeSubgroupsPerWorkgroupId = 37, ExecutionModeLocalSizeId = 38, ExecutionModeLocalSizeHintId = 39, + ExecutionModeNonCoherentColorAttachmentReadEXT = 4169, + ExecutionModeNonCoherentDepthAttachmentReadEXT = 4170, + ExecutionModeNonCoherentStencilAttachmentReadEXT = 4171, ExecutionModeSubgroupUniformControlFlowKHR = 4421, ExecutionModePostDepthCoverage = 4446, ExecutionModeDenormPreserve = 4459, @@ -157,11 +166,23 @@ enum ExecutionMode { ExecutionModeSignedZeroInfNanPreserve = 4461, ExecutionModeRoundingModeRTE = 4462, ExecutionModeRoundingModeRTZ = 4463, + ExecutionModeEarlyAndLateFragmentTestsAMD = 5017, ExecutionModeStencilRefReplacingEXT = 5027, + ExecutionModeStencilRefUnchangedFrontAMD = 5079, + ExecutionModeStencilRefGreaterFrontAMD = 5080, + ExecutionModeStencilRefLessFrontAMD = 5081, + ExecutionModeStencilRefUnchangedBackAMD = 5082, + ExecutionModeStencilRefGreaterBackAMD = 5083, + ExecutionModeStencilRefLessBackAMD = 5084, + ExecutionModeQuadDerivativesKHR = 5088, + ExecutionModeRequireFullQuadsKHR = 5089, + ExecutionModeOutputLinesEXT = 5269, ExecutionModeOutputLinesNV = 5269, + ExecutionModeOutputPrimitivesEXT = 5270, ExecutionModeOutputPrimitivesNV = 5270, ExecutionModeDerivativeGroupQuadsNV = 5289, ExecutionModeDerivativeGroupLinearNV = 5290, + ExecutionModeOutputTrianglesEXT = 5298, ExecutionModeOutputTrianglesNV = 5298, ExecutionModePixelInterlockOrderedEXT = 5366, ExecutionModePixelInterlockUnorderedEXT = 5367, @@ -179,6 +200,9 @@ enum ExecutionMode { ExecutionModeNoGlobalOffsetINTEL = 5895, ExecutionModeNumSIMDWorkitemsINTEL = 5896, ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903, + ExecutionModeMaximallyReconvergesKHR = 6023, + ExecutionModeStreamingInterfaceINTEL = 6154, + ExecutionModeNamedBarrierCountINTEL = 6417, ExecutionModeMax = 0x7fffffff, }; @@ -196,6 +220,7 @@ enum StorageClass { StorageClassAtomicCounter = 10, StorageClassImage = 11, StorageClassStorageBuffer = 12, + StorageClassTileImageEXT = 4172, StorageClassCallableDataKHR = 5328, StorageClassCallableDataNV = 5328, StorageClassIncomingCallableDataKHR = 5329, @@ -210,6 +235,8 @@ enum StorageClass { StorageClassShaderRecordBufferNV = 5343, StorageClassPhysicalStorageBuffer = 5349, StorageClassPhysicalStorageBufferEXT = 5349, + StorageClassHitObjectAttributeNV = 5385, + StorageClassTaskPayloadWorkgroupEXT = 5402, StorageClassCodeSectionINTEL = 5605, StorageClassDeviceOnlyINTEL = 5936, StorageClassHostOnlyINTEL = 5937, @@ -224,6 +251,7 @@ enum Dim { DimRect = 4, DimBuffer = 5, DimSubpassData = 6, + DimTileImageDataEXT = 4173, DimMax = 0x7fffffff, }; @@ -352,6 +380,8 @@ enum ImageOperandsShift { ImageOperandsVolatileTexelKHRShift = 11, ImageOperandsSignExtendShift = 12, ImageOperandsZeroExtendShift = 13, + ImageOperandsNontemporalShift = 14, + ImageOperandsOffsetsShift = 16, ImageOperandsMax = 0x7fffffff, }; @@ -375,6 +405,8 @@ enum ImageOperandsMask { ImageOperandsVolatileTexelKHRMask = 0x00000800, ImageOperandsSignExtendMask = 0x00001000, ImageOperandsZeroExtendMask = 0x00002000, + ImageOperandsNontemporalMask = 0x00004000, + ImageOperandsOffsetsMask = 0x00010000, }; enum FPFastMathModeShift { @@ -430,6 +462,7 @@ enum FunctionParameterAttribute { FunctionParameterAttributeNoCapture = 5, FunctionParameterAttributeNoWrite = 6, FunctionParameterAttributeNoReadWrite = 7, + FunctionParameterAttributeRuntimeAlignedINTEL = 5940, FunctionParameterAttributeMax = 0x7fffffff, }; @@ -483,14 +516,19 @@ enum Decoration { DecorationMaxByteOffsetId = 47, DecorationNoSignedWrap = 4469, DecorationNoUnsignedWrap = 4470, + DecorationWeightTextureQCOM = 4487, + DecorationBlockMatchTextureQCOM = 4488, + DecorationBlockMatchSamplerQCOM = 4499, DecorationExplicitInterpAMD = 4999, DecorationOverrideCoverageNV = 5248, DecorationPassthroughNV = 5250, DecorationViewportRelativeNV = 5252, DecorationSecondaryViewportRelativeNV = 5256, + DecorationPerPrimitiveEXT = 5271, DecorationPerPrimitiveNV = 5271, DecorationPerViewNV = 5272, DecorationPerTaskNV = 5273, + DecorationPerVertexKHR = 5285, DecorationPerVertexNV = 5285, DecorationNonUniform = 5300, DecorationNonUniformEXT = 5300, @@ -498,6 +536,11 @@ enum Decoration { DecorationRestrictPointerEXT = 5355, DecorationAliasedPointer = 5356, DecorationAliasedPointerEXT = 5356, + DecorationHitObjectShaderRecordBufferNV = 5386, + DecorationBindlessSamplerNV = 5398, + DecorationBindlessImageNV = 5399, + DecorationBoundSamplerNV = 5400, + DecorationBoundImageNV = 5401, DecorationSIMTCallINTEL = 5599, DecorationReferencedIndirectlyINTEL = 5602, DecorationClobberINTEL = 5607, @@ -532,11 +575,27 @@ enum Decoration { DecorationPrefetchINTEL = 5902, DecorationStallEnableINTEL = 5905, DecorationFuseLoopsInFunctionINTEL = 5907, + DecorationMathOpDSPModeINTEL = 5909, + DecorationAliasScopeINTEL = 5914, + DecorationNoAliasINTEL = 5915, + DecorationInitiationIntervalINTEL = 5917, + DecorationMaxConcurrencyINTEL = 5918, + DecorationPipelineEnableINTEL = 5919, DecorationBufferLocationINTEL = 5921, DecorationIOPipeStorageINTEL = 5944, DecorationFunctionFloatingPointModeINTEL = 6080, DecorationSingleElementVectorINTEL = 6085, DecorationVectorComputeCallableFunctionINTEL = 6087, + DecorationMediaBlockIOINTEL = 6140, + DecorationConduitKernelArgumentINTEL = 6175, + DecorationRegisterMapKernelArgumentINTEL = 6176, + DecorationMMHostInterfaceAddressWidthINTEL = 6177, + DecorationMMHostInterfaceDataWidthINTEL = 6178, + DecorationMMHostInterfaceLatencyINTEL = 6179, + DecorationMMHostInterfaceReadWriteModeINTEL = 6180, + DecorationMMHostInterfaceMaxBurstINTEL = 6181, + DecorationMMHostInterfaceWaitRequestINTEL = 6182, + DecorationStableKernelArgumentINTEL = 6183, DecorationMax = 0x7fffffff, }; @@ -582,6 +641,11 @@ enum BuiltIn { BuiltInSubgroupLocalInvocationId = 41, BuiltInVertexIndex = 42, BuiltInInstanceIndex = 43, + BuiltInCoreIDARM = 4160, + BuiltInCoreCountARM = 4161, + BuiltInCoreMaxIDARM = 4162, + BuiltInWarpIDARM = 4163, + BuiltInWarpMaxIDARM = 4164, BuiltInSubgroupEqMask = 4416, BuiltInSubgroupEqMaskKHR = 4416, BuiltInSubgroupGeMask = 4417, @@ -621,12 +685,18 @@ enum BuiltIn { BuiltInLayerPerViewNV = 5279, BuiltInMeshViewCountNV = 5280, BuiltInMeshViewIndicesNV = 5281, + BuiltInBaryCoordKHR = 5286, BuiltInBaryCoordNV = 5286, + BuiltInBaryCoordNoPerspKHR = 5287, BuiltInBaryCoordNoPerspNV = 5287, BuiltInFragSizeEXT = 5292, BuiltInFragmentSizeNV = 5292, BuiltInFragInvocationCountEXT = 5293, BuiltInInvocationsPerPixelNV = 5293, + BuiltInPrimitivePointIndicesEXT = 5294, + BuiltInPrimitiveLineIndicesEXT = 5295, + BuiltInPrimitiveTriangleIndicesEXT = 5296, + BuiltInCullPrimitiveEXT = 5299, BuiltInLaunchIdKHR = 5319, BuiltInLaunchIdNV = 5319, BuiltInLaunchSizeKHR = 5320, @@ -653,6 +723,9 @@ enum BuiltIn { BuiltInHitKindKHR = 5333, BuiltInHitKindNV = 5333, BuiltInCurrentRayTimeNV = 5334, + BuiltInHitTriangleVertexPositionsKHR = 5335, + BuiltInHitMicroTriangleVertexPositionsNV = 5337, + BuiltInHitMicroTriangleVertexBarycentricsNV = 5344, BuiltInIncomingRayFlagsKHR = 5351, BuiltInIncomingRayFlagsNV = 5351, BuiltInRayGeometryIndexKHR = 5352, @@ -660,6 +733,9 @@ enum BuiltIn { BuiltInSMCountNV = 5375, BuiltInWarpIDNV = 5376, BuiltInSMIDNV = 5377, + BuiltInHitKindFrontFacingMicroTriangleNV = 5405, + BuiltInHitKindBackFacingMicroTriangleNV = 5406, + BuiltInCullMaskKHR = 6021, BuiltInMax = 0x7fffffff, }; @@ -693,6 +769,8 @@ enum LoopControlShift { LoopControlMaxInterleavingINTELShift = 21, LoopControlSpeculatedIterationsINTELShift = 22, LoopControlNoFusionINTELShift = 23, + LoopControlLoopCountINTELShift = 24, + LoopControlMaxReinvocationDelayINTELShift = 25, LoopControlMax = 0x7fffffff, }; @@ -715,6 +793,8 @@ enum LoopControlMask { LoopControlMaxInterleavingINTELMask = 0x00200000, LoopControlSpeculatedIterationsINTELMask = 0x00400000, LoopControlNoFusionINTELMask = 0x00800000, + LoopControlLoopCountINTELMask = 0x01000000, + LoopControlMaxReinvocationDelayINTELMask = 0x02000000, }; enum FunctionControlShift { @@ -722,6 +802,7 @@ enum FunctionControlShift { FunctionControlDontInlineShift = 1, FunctionControlPureShift = 2, FunctionControlConstShift = 3, + FunctionControlOptNoneINTELShift = 16, FunctionControlMax = 0x7fffffff, }; @@ -731,6 +812,7 @@ enum FunctionControlMask { FunctionControlDontInlineMask = 0x00000002, FunctionControlPureMask = 0x00000004, FunctionControlConstMask = 0x00000008, + FunctionControlOptNoneINTELMask = 0x00010000, }; enum MemorySemanticsShift { @@ -785,6 +867,8 @@ enum MemoryAccessShift { MemoryAccessMakePointerVisibleKHRShift = 4, MemoryAccessNonPrivatePointerShift = 5, MemoryAccessNonPrivatePointerKHRShift = 5, + MemoryAccessAliasScopeINTELMaskShift = 16, + MemoryAccessNoAliasINTELMaskShift = 17, MemoryAccessMax = 0x7fffffff, }; @@ -799,6 +883,8 @@ enum MemoryAccessMask { MemoryAccessMakePointerVisibleKHRMask = 0x00000010, MemoryAccessNonPrivatePointerMask = 0x00000020, MemoryAccessNonPrivatePointerKHRMask = 0x00000020, + MemoryAccessAliasScopeINTELMaskMask = 0x00010000, + MemoryAccessNoAliasINTELMaskMask = 0x00020000, }; enum Scope { @@ -911,6 +997,12 @@ enum Capability { CapabilityGroupNonUniformQuad = 68, CapabilityShaderLayer = 69, CapabilityShaderViewportIndex = 70, + CapabilityUniformDecoration = 71, + CapabilityCoreBuiltinsARM = 4165, + CapabilityTileImageColorReadAccessEXT = 4166, + CapabilityTileImageDepthReadAccessEXT = 4167, + CapabilityTileImageStencilReadAccessEXT = 4168, + CapabilityCooperativeMatrixLayoutsARM = 4201, CapabilityFragmentShadingRateKHR = 4422, CapabilitySubgroupBallotKHR = 4423, CapabilityDrawParameters = 4427, @@ -942,6 +1034,10 @@ enum Capability { CapabilityRayQueryKHR = 4472, CapabilityRayTraversalPrimitiveCullingKHR = 4478, CapabilityRayTracingKHR = 4479, + CapabilityTextureSampleWeightedQCOM = 4484, + CapabilityTextureBoxFilterQCOM = 4485, + CapabilityTextureBlockMatchQCOM = 4486, + CapabilityTextureBlockMatch2QCOM = 4498, CapabilityFloat16ImageAMD = 5008, CapabilityImageGatherBiasLodAMD = 5009, CapabilityFragmentMaskAMD = 5010, @@ -949,6 +1045,7 @@ enum Capability { CapabilityImageReadWriteLodAMD = 5015, CapabilityInt64ImageEXT = 5016, CapabilityShaderClockKHR = 5055, + CapabilityQuadControlKHR = 5087, CapabilitySampleMaskOverrideCoverageNV = 5249, CapabilityGeometryShaderPassthroughNV = 5251, CapabilityShaderViewportIndexLayerEXT = 5254, @@ -959,6 +1056,8 @@ enum Capability { CapabilityFragmentFullyCoveredEXT = 5265, CapabilityMeshShadingNV = 5266, CapabilityImageFootprintNV = 5282, + CapabilityMeshShadingEXT = 5283, + CapabilityFragmentBarycentricKHR = 5284, CapabilityFragmentBarycentricNV = 5284, CapabilityComputeDerivativeGroupQuadsNV = 5288, CapabilityFragmentDensityEXT = 5291, @@ -988,6 +1087,7 @@ enum Capability { CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312, CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, + CapabilityRayTracingPositionFetchKHR = 5336, CapabilityRayTracingNV = 5340, CapabilityRayTracingMotionBlurNV = 5341, CapabilityVulkanMemoryModel = 5345, @@ -1003,7 +1103,15 @@ enum Capability { CapabilityFragmentShaderShadingRateInterlockEXT = 5372, CapabilityShaderSMBuiltinsNV = 5373, CapabilityFragmentShaderPixelInterlockEXT = 5378, + CapabilityDemoteToHelperInvocation = 5379, CapabilityDemoteToHelperInvocationEXT = 5379, + CapabilityDisplacementMicromapNV = 5380, + CapabilityRayTracingOpacityMicromapEXT = 5381, + CapabilityShaderInvocationReorderNV = 5383, + CapabilityBindlessTextureNV = 5390, + CapabilityRayQueryPositionFetchKHR = 5391, + CapabilityAtomicFloat16VectorNV = 5404, + CapabilityRayTracingDisplacementMicromapNV = 5409, CapabilitySubgroupShuffleINTEL = 5568, CapabilitySubgroupBufferBlockIOINTEL = 5569, CapabilitySubgroupImageBlockIOINTEL = 5570, @@ -1028,6 +1136,7 @@ enum Capability { CapabilityFPGAMemoryAttributesINTEL = 5824, CapabilityFPFastMathModeINTEL = 5837, CapabilityArbitraryPrecisionIntegersINTEL = 5844, + CapabilityArbitraryPrecisionFloatingPointINTEL = 5845, CapabilityUnstructuredLoopControlsINTEL = 5886, CapabilityFPGALoopControlsINTEL = 5888, CapabilityKernelAttributesINTEL = 5892, @@ -1035,15 +1144,38 @@ enum Capability { CapabilityFPGAMemoryAccessesINTEL = 5898, CapabilityFPGAClusterAttributesINTEL = 5904, CapabilityLoopFuseINTEL = 5906, + CapabilityFPGADSPControlINTEL = 5908, + CapabilityMemoryAccessAliasingINTEL = 5910, + CapabilityFPGAInvocationPipeliningAttributesINTEL = 5916, CapabilityFPGABufferLocationINTEL = 5920, + CapabilityArbitraryPrecisionFixedPointINTEL = 5922, CapabilityUSMStorageClassesINTEL = 5935, + CapabilityRuntimeAlignedAttributeINTEL = 5939, CapabilityIOPipesINTEL = 5943, CapabilityBlockingPipesINTEL = 5945, CapabilityFPGARegINTEL = 5948, + CapabilityDotProductInputAll = 6016, + CapabilityDotProductInputAllKHR = 6016, + CapabilityDotProductInput4x8Bit = 6017, + CapabilityDotProductInput4x8BitKHR = 6017, + CapabilityDotProductInput4x8BitPacked = 6018, + CapabilityDotProductInput4x8BitPackedKHR = 6018, + CapabilityDotProduct = 6019, + CapabilityDotProductKHR = 6019, + CapabilityRayCullMaskKHR = 6020, + CapabilityCooperativeMatrixKHR = 6022, + CapabilityReplicatedCompositesEXT = 6024, + CapabilityBitInstructions = 6025, + CapabilityGroupNonUniformRotateKHR = 6026, CapabilityAtomicFloat32AddEXT = 6033, CapabilityAtomicFloat64AddEXT = 6034, CapabilityLongConstantCompositeINTEL = 6089, + CapabilityOptNoneINTEL = 6094, CapabilityAtomicFloat16AddEXT = 6095, + CapabilityDebugInfoModuleINTEL = 6114, + CapabilitySplitBarrierINTEL = 6141, + CapabilityFPGAArgumentInterfacesINTEL = 6174, + CapabilityGroupUniformArithmeticKHR = 6400, CapabilityMax = 0x7fffffff, }; @@ -1058,6 +1190,7 @@ enum RayFlagsShift { RayFlagsCullNoOpaqueKHRShift = 7, RayFlagsSkipTrianglesKHRShift = 8, RayFlagsSkipAABBsKHRShift = 9, + RayFlagsForceOpacityMicromap2StateEXTShift = 10, RayFlagsMax = 0x7fffffff, }; @@ -1073,6 +1206,7 @@ enum RayFlagsMask { RayFlagsCullNoOpaqueKHRMask = 0x00000080, RayFlagsSkipTrianglesKHRMask = 0x00000100, RayFlagsSkipAABBsKHRMask = 0x00000200, + RayFlagsForceOpacityMicromap2StateEXTMask = 0x00000400, }; enum RayQueryIntersection { @@ -1122,6 +1256,65 @@ enum FPOperationMode { FPOperationModeMax = 0x7fffffff, }; +enum QuantizationModes { + QuantizationModesTRN = 0, + QuantizationModesTRN_ZERO = 1, + QuantizationModesRND = 2, + QuantizationModesRND_ZERO = 3, + QuantizationModesRND_INF = 4, + QuantizationModesRND_MIN_INF = 5, + QuantizationModesRND_CONV = 6, + QuantizationModesRND_CONV_ODD = 7, + QuantizationModesMax = 0x7fffffff, +}; + +enum OverflowModes { + OverflowModesWRAP = 0, + OverflowModesSAT = 1, + OverflowModesSAT_ZERO = 2, + OverflowModesSAT_SYM = 3, + OverflowModesMax = 0x7fffffff, +}; + +enum PackedVectorFormat { + PackedVectorFormatPackedVectorFormat4x8Bit = 0, + PackedVectorFormatPackedVectorFormat4x8BitKHR = 0, + PackedVectorFormatMax = 0x7fffffff, +}; + +enum CooperativeMatrixOperandsShift { + CooperativeMatrixOperandsMatrixASignedComponentsKHRShift = 0, + CooperativeMatrixOperandsMatrixBSignedComponentsKHRShift = 1, + CooperativeMatrixOperandsMatrixCSignedComponentsKHRShift = 2, + CooperativeMatrixOperandsMatrixResultSignedComponentsKHRShift = 3, + CooperativeMatrixOperandsSaturatingAccumulationKHRShift = 4, + CooperativeMatrixOperandsMax = 0x7fffffff, +}; + +enum CooperativeMatrixOperandsMask { + CooperativeMatrixOperandsMaskNone = 0, + CooperativeMatrixOperandsMatrixASignedComponentsKHRMask = 0x00000001, + CooperativeMatrixOperandsMatrixBSignedComponentsKHRMask = 0x00000002, + CooperativeMatrixOperandsMatrixCSignedComponentsKHRMask = 0x00000004, + CooperativeMatrixOperandsMatrixResultSignedComponentsKHRMask = 0x00000008, + CooperativeMatrixOperandsSaturatingAccumulationKHRMask = 0x00000010, +}; + +enum CooperativeMatrixLayout { + CooperativeMatrixLayoutRowMajorKHR = 0, + CooperativeMatrixLayoutColumnMajorKHR = 1, + CooperativeMatrixLayoutRowBlockedInterleavedARM = 4202, + CooperativeMatrixLayoutColumnBlockedInterleavedARM = 4203, + CooperativeMatrixLayoutMax = 0x7fffffff, +}; + +enum CooperativeMatrixUse { + CooperativeMatrixUseMatrixAKHR = 0, + CooperativeMatrixUseMatrixBKHR = 1, + CooperativeMatrixUseMatrixAccumulatorKHR = 2, + CooperativeMatrixUseMax = 0x7fffffff, +}; + enum Op { OpNop = 0, OpUndef = 1, @@ -1467,18 +1660,43 @@ enum Op { OpPtrEqual = 401, OpPtrNotEqual = 402, OpPtrDiff = 403, + OpColorAttachmentReadEXT = 4160, + OpDepthAttachmentReadEXT = 4161, + OpStencilAttachmentReadEXT = 4162, OpTerminateInvocation = 4416, OpSubgroupBallotKHR = 4421, OpSubgroupFirstInvocationKHR = 4422, OpSubgroupAllKHR = 4428, OpSubgroupAnyKHR = 4429, OpSubgroupAllEqualKHR = 4430, + OpGroupNonUniformRotateKHR = 4431, OpSubgroupReadInvocationKHR = 4432, + OpExtInstWithForwardRefsKHR = 4433, OpTraceRayKHR = 4445, OpExecuteCallableKHR = 4446, OpConvertUToAccelerationStructureKHR = 4447, OpIgnoreIntersectionKHR = 4448, OpTerminateRayKHR = 4449, + OpSDot = 4450, + OpSDotKHR = 4450, + OpUDot = 4451, + OpUDotKHR = 4451, + OpSUDot = 4452, + OpSUDotKHR = 4452, + OpSDotAccSat = 4453, + OpSDotAccSatKHR = 4453, + OpUDotAccSat = 4454, + OpUDotAccSatKHR = 4454, + OpSUDotAccSat = 4455, + OpSUDotAccSatKHR = 4455, + OpTypeCooperativeMatrixKHR = 4456, + OpCooperativeMatrixLoadKHR = 4457, + OpCooperativeMatrixStoreKHR = 4458, + OpCooperativeMatrixMulAddKHR = 4459, + OpCooperativeMatrixLengthKHR = 4460, + OpConstantCompositeReplicateEXT = 4461, + OpSpecConstantCompositeReplicateEXT = 4462, + OpCompositeConstructReplicateEXT = 4463, OpTypeRayQueryKHR = 4472, OpRayQueryInitializeKHR = 4473, OpRayQueryTerminateKHR = 4474, @@ -1486,6 +1704,14 @@ enum Op { OpRayQueryConfirmIntersectionKHR = 4476, OpRayQueryProceedKHR = 4477, OpRayQueryGetIntersectionTypeKHR = 4479, + OpImageSampleWeightedQCOM = 4480, + OpImageBoxFilterQCOM = 4481, + OpImageBlockMatchSSDQCOM = 4482, + OpImageBlockMatchSADQCOM = 4483, + OpImageBlockMatchWindowSSDQCOM = 4500, + OpImageBlockMatchWindowSADQCOM = 4501, + OpImageBlockMatchGatherSSDQCOM = 4502, + OpImageBlockMatchGatherSADQCOM = 4503, OpGroupIAddNonUniformAMD = 5000, OpGroupFAddNonUniformAMD = 5001, OpGroupFMinNonUniformAMD = 5002, @@ -1497,9 +1723,48 @@ enum Op { OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, OpReadClockKHR = 5056, + OpGroupNonUniformQuadAllKHR = 5110, + OpGroupNonUniformQuadAnyKHR = 5111, + OpHitObjectRecordHitMotionNV = 5249, + OpHitObjectRecordHitWithIndexMotionNV = 5250, + OpHitObjectRecordMissMotionNV = 5251, + OpHitObjectGetWorldToObjectNV = 5252, + OpHitObjectGetObjectToWorldNV = 5253, + OpHitObjectGetObjectRayDirectionNV = 5254, + OpHitObjectGetObjectRayOriginNV = 5255, + OpHitObjectTraceRayMotionNV = 5256, + OpHitObjectGetShaderRecordBufferHandleNV = 5257, + OpHitObjectGetShaderBindingTableRecordIndexNV = 5258, + OpHitObjectRecordEmptyNV = 5259, + OpHitObjectTraceRayNV = 5260, + OpHitObjectRecordHitNV = 5261, + OpHitObjectRecordHitWithIndexNV = 5262, + OpHitObjectRecordMissNV = 5263, + OpHitObjectExecuteShaderNV = 5264, + OpHitObjectGetCurrentTimeNV = 5265, + OpHitObjectGetAttributesNV = 5266, + OpHitObjectGetHitKindNV = 5267, + OpHitObjectGetPrimitiveIndexNV = 5268, + OpHitObjectGetGeometryIndexNV = 5269, + OpHitObjectGetInstanceIdNV = 5270, + OpHitObjectGetInstanceCustomIndexNV = 5271, + OpHitObjectGetWorldRayDirectionNV = 5272, + OpHitObjectGetWorldRayOriginNV = 5273, + OpHitObjectGetRayTMaxNV = 5274, + OpHitObjectGetRayTMinNV = 5275, + OpHitObjectIsEmptyNV = 5276, + OpHitObjectIsHitNV = 5277, + OpHitObjectIsMissNV = 5278, + OpReorderThreadWithHitObjectNV = 5279, + OpReorderThreadWithHintNV = 5280, + OpTypeHitObjectNV = 5281, OpImageSampleFootprintNV = 5283, + OpEmitMeshTasksEXT = 5294, + OpSetMeshOutputsEXT = 5295, OpGroupNonUniformPartitionNV = 5296, OpWritePackedPrimitiveIndices4x8NV = 5299, + OpFetchMicroTriangleVertexPositionNV = 5300, + OpFetchMicroTriangleVertexBarycentricNV = 5301, OpReportIntersectionKHR = 5334, OpReportIntersectionNV = 5334, OpIgnoreIntersectionNV = 5335, @@ -1507,6 +1772,7 @@ enum Op { OpTraceNV = 5337, OpTraceMotionNV = 5338, OpTraceRayMotionNV = 5339, + OpRayQueryGetIntersectionTriangleVertexPositionsKHR = 5340, OpTypeAccelerationStructureKHR = 5341, OpTypeAccelerationStructureNV = 5341, OpExecuteCallableNV = 5344, @@ -1517,8 +1783,16 @@ enum Op { OpCooperativeMatrixLengthNV = 5362, OpBeginInvocationInterlockEXT = 5364, OpEndInvocationInterlockEXT = 5365, + OpDemoteToHelperInvocation = 5380, OpDemoteToHelperInvocationEXT = 5380, OpIsHelperInvocationEXT = 5381, + OpConvertUToImageNV = 5391, + OpConvertUToSamplerNV = 5392, + OpConvertImageToUNV = 5393, + OpConvertSamplerToUNV = 5394, + OpConvertUToSampledImageNV = 5395, + OpConvertSampledImageToUNV = 5396, + OpSamplerImageAddressingModeNV = 5397, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, @@ -1543,7 +1817,7 @@ enum Op { OpUSubSatINTEL = 5596, OpIMul32x16INTEL = 5597, OpUMul32x16INTEL = 5598, - OpConstFunctionPointerINTEL = 5600, + OpConstantFunctionPointerINTEL = 5600, OpFunctionPointerCallINTEL = 5601, OpAsmTargetINTEL = 5609, OpAsmINTEL = 5610, @@ -1677,7 +1951,62 @@ enum Op { OpVariableLengthArrayINTEL = 5818, OpSaveMemoryINTEL = 5819, OpRestoreMemoryINTEL = 5820, + OpArbitraryFloatSinCosPiINTEL = 5840, + OpArbitraryFloatCastINTEL = 5841, + OpArbitraryFloatCastFromIntINTEL = 5842, + OpArbitraryFloatCastToIntINTEL = 5843, + OpArbitraryFloatAddINTEL = 5846, + OpArbitraryFloatSubINTEL = 5847, + OpArbitraryFloatMulINTEL = 5848, + OpArbitraryFloatDivINTEL = 5849, + OpArbitraryFloatGTINTEL = 5850, + OpArbitraryFloatGEINTEL = 5851, + OpArbitraryFloatLTINTEL = 5852, + OpArbitraryFloatLEINTEL = 5853, + OpArbitraryFloatEQINTEL = 5854, + OpArbitraryFloatRecipINTEL = 5855, + OpArbitraryFloatRSqrtINTEL = 5856, + OpArbitraryFloatCbrtINTEL = 5857, + OpArbitraryFloatHypotINTEL = 5858, + OpArbitraryFloatSqrtINTEL = 5859, + OpArbitraryFloatLogINTEL = 5860, + OpArbitraryFloatLog2INTEL = 5861, + OpArbitraryFloatLog10INTEL = 5862, + OpArbitraryFloatLog1pINTEL = 5863, + OpArbitraryFloatExpINTEL = 5864, + OpArbitraryFloatExp2INTEL = 5865, + OpArbitraryFloatExp10INTEL = 5866, + OpArbitraryFloatExpm1INTEL = 5867, + OpArbitraryFloatSinINTEL = 5868, + OpArbitraryFloatCosINTEL = 5869, + OpArbitraryFloatSinCosINTEL = 5870, + OpArbitraryFloatSinPiINTEL = 5871, + OpArbitraryFloatCosPiINTEL = 5872, + OpArbitraryFloatASinINTEL = 5873, + OpArbitraryFloatASinPiINTEL = 5874, + OpArbitraryFloatACosINTEL = 5875, + OpArbitraryFloatACosPiINTEL = 5876, + OpArbitraryFloatATanINTEL = 5877, + OpArbitraryFloatATanPiINTEL = 5878, + OpArbitraryFloatATan2INTEL = 5879, + OpArbitraryFloatPowINTEL = 5880, + OpArbitraryFloatPowRINTEL = 5881, + OpArbitraryFloatPowNINTEL = 5882, OpLoopControlINTEL = 5887, + OpAliasDomainDeclINTEL = 5911, + OpAliasScopeDeclINTEL = 5912, + OpAliasScopeListDeclINTEL = 5913, + OpFixedSqrtINTEL = 5923, + OpFixedRecipINTEL = 5924, + OpFixedRsqrtINTEL = 5925, + OpFixedSinINTEL = 5926, + OpFixedCosINTEL = 5927, + OpFixedSinCosINTEL = 5928, + OpFixedSinPiINTEL = 5929, + OpFixedCosPiINTEL = 5930, + OpFixedSinCosPiINTEL = 5931, + OpFixedLogINTEL = 5932, + OpFixedExpINTEL = 5933, OpPtrCastToCrossWorkgroupINTEL = 5934, OpCrossWorkgroupCastToPtrINTEL = 5938, OpReadPipeBlockingINTEL = 5946, @@ -1705,10 +2034,23 @@ enum Op { OpTypeStructContinuedINTEL = 6090, OpConstantCompositeContinuedINTEL = 6091, OpSpecConstantCompositeContinuedINTEL = 6092, + OpControlBarrierArriveINTEL = 6142, + OpControlBarrierWaitINTEL = 6143, + OpGroupIMulKHR = 6401, + OpGroupFMulKHR = 6402, + OpGroupBitwiseAndKHR = 6403, + OpGroupBitwiseOrKHR = 6404, + OpGroupBitwiseXorKHR = 6405, + OpGroupLogicalAndKHR = 6406, + OpGroupLogicalOrKHR = 6407, + OpGroupLogicalXorKHR = 6408, OpMax = 0x7fffffff, }; #ifdef SPV_ENABLE_UTILITY_CODE +#ifndef __cplusplus +#include +#endif inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { *hasResult = *hasResultType = false; switch (opcode) { @@ -2057,18 +2399,37 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpPtrEqual: *hasResult = true; *hasResultType = true; break; case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break; case OpPtrDiff: *hasResult = true; *hasResultType = true; break; + case OpExtInstWithForwardRefsKHR: *hasResult = true; *hasResultType = true; break; + case OpColorAttachmentReadEXT: *hasResult = true; *hasResultType = true; break; + case OpDepthAttachmentReadEXT: *hasResult = true; *hasResultType = true; break; + case OpStencilAttachmentReadEXT: *hasResult = true; *hasResultType = true; break; case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break; case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break; case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break; case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break; case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break; case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformRotateKHR: *hasResult = true; *hasResultType = true; break; case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break; case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break; case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break; case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break; case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break; case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break; + case OpSDot: *hasResult = true; *hasResultType = true; break; + case OpUDot: *hasResult = true; *hasResultType = true; break; + case OpSUDot: *hasResult = true; *hasResultType = true; break; + case OpSDotAccSat: *hasResult = true; *hasResultType = true; break; + case OpUDotAccSat: *hasResult = true; *hasResultType = true; break; + case OpSUDotAccSat: *hasResult = true; *hasResultType = true; break; + case OpTypeCooperativeMatrixKHR: *hasResult = true; *hasResultType = false; break; + case OpCooperativeMatrixLoadKHR: *hasResult = true; *hasResultType = true; break; + case OpCooperativeMatrixStoreKHR: *hasResult = false; *hasResultType = false; break; + case OpCooperativeMatrixMulAddKHR: *hasResult = true; *hasResultType = true; break; + case OpCooperativeMatrixLengthKHR: *hasResult = true; *hasResultType = true; break; + case OpConstantCompositeReplicateEXT: *hasResult = true; *hasResultType = true; break; + case OpSpecConstantCompositeReplicateEXT: *hasResult = true; *hasResultType = true; break; + case OpCompositeConstructReplicateEXT: *hasResult = true; *hasResultType = true; break; case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break; case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break; case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break; @@ -2076,6 +2437,14 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break; case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break; case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break; + case OpImageSampleWeightedQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBoxFilterQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchSSDQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchSADQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchWindowSSDQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchWindowSADQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchGatherSSDQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchGatherSADQCOM: *hasResult = true; *hasResultType = true; break; case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break; case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break; case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break; @@ -2087,7 +2456,44 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break; case OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break; case OpReadClockKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformQuadAllKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformQuadAnyKHR: *hasResult = true; *hasResultType = true; break; + case OpHitObjectRecordHitMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordHitWithIndexMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordMissMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetWorldToObjectNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetObjectToWorldNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetObjectRayDirectionNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetObjectRayOriginNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectTraceRayMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetShaderRecordBufferHandleNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetShaderBindingTableRecordIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectRecordEmptyNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectTraceRayNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordHitNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordHitWithIndexNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordMissNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectExecuteShaderNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetCurrentTimeNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetAttributesNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetHitKindNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetPrimitiveIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetGeometryIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetInstanceIdNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetInstanceCustomIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetWorldRayDirectionNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetWorldRayOriginNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetRayTMaxNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetRayTMinNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectIsEmptyNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectIsHitNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectIsMissNV: *hasResult = true; *hasResultType = true; break; + case OpReorderThreadWithHitObjectNV: *hasResult = false; *hasResultType = false; break; + case OpReorderThreadWithHintNV: *hasResult = false; *hasResultType = false; break; + case OpTypeHitObjectNV: *hasResult = true; *hasResultType = false; break; case OpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break; + case OpEmitMeshTasksEXT: *hasResult = false; *hasResultType = false; break; + case OpSetMeshOutputsEXT: *hasResult = false; *hasResultType = false; break; case OpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break; case OpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break; case OpReportIntersectionNV: *hasResult = true; *hasResultType = true; break; @@ -2096,6 +2502,7 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpTraceNV: *hasResult = false; *hasResultType = false; break; case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break; case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break; + case OpRayQueryGetIntersectionTriangleVertexPositionsKHR: *hasResult = true; *hasResultType = true; break; case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break; case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break; case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break; @@ -2105,8 +2512,15 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break; case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break; case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break; - case OpDemoteToHelperInvocationEXT: *hasResult = false; *hasResultType = false; break; + case OpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break; case OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break; + case OpConvertUToImageNV: *hasResult = true; *hasResultType = true; break; + case OpConvertUToSamplerNV: *hasResult = true; *hasResultType = true; break; + case OpConvertImageToUNV: *hasResult = true; *hasResultType = true; break; + case OpConvertSamplerToUNV: *hasResult = true; *hasResultType = true; break; + case OpConvertUToSampledImageNV: *hasResult = true; *hasResultType = true; break; + case OpConvertSampledImageToUNV: *hasResult = true; *hasResultType = true; break; + case OpSamplerImageAddressingModeNV: *hasResult = false; *hasResultType = false; break; case OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break; case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break; case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break; @@ -2131,7 +2545,7 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break; case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break; case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break; - case OpConstFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break; + case OpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break; case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break; case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break; case OpAsmINTEL: *hasResult = true; *hasResultType = true; break; @@ -2263,7 +2677,62 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break; case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break; case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break; + case OpArbitraryFloatSinCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCastINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCastFromIntINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCastToIntINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatAddINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSubINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatMulINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatDivINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatGTINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatGEINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLTINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLEINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatEQINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatRecipINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatRSqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCbrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatHypotINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLogINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLog2INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLog10INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLog1pINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExpINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExp2INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExp10INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExpm1INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSinINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSinCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSinPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatASinINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatASinPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatACosINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatACosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatATanINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatATanPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatATan2INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatPowINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatPowRINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatPowNINTEL: *hasResult = true; *hasResultType = true; break; case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break; + case OpAliasDomainDeclINTEL: *hasResult = true; *hasResultType = false; break; + case OpAliasScopeDeclINTEL: *hasResult = true; *hasResultType = false; break; + case OpAliasScopeListDeclINTEL: *hasResult = true; *hasResultType = false; break; + case OpFixedSqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedRecipINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedRsqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedLogINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedExpINTEL: *hasResult = true; *hasResultType = true; break; case OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break; case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break; case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break; @@ -2291,22 +2760,66 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break; case OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break; case OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break; + case OpControlBarrierArriveINTEL: *hasResult = false; *hasResultType = false; break; + case OpControlBarrierWaitINTEL: *hasResult = false; *hasResultType = false; break; + case OpGroupIMulKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupFMulKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupBitwiseAndKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupBitwiseOrKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupBitwiseXorKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupLogicalAndKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupLogicalOrKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupLogicalXorKHR: *hasResult = true; *hasResultType = true; break; } } #endif /* SPV_ENABLE_UTILITY_CODE */ -// Overload operator| for mask bit combining +// Overload bitwise operators for mask bit combining inline ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); } +inline ImageOperandsMask operator&(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) & unsigned(b)); } +inline ImageOperandsMask operator^(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) ^ unsigned(b)); } +inline ImageOperandsMask operator~(ImageOperandsMask a) { return ImageOperandsMask(~unsigned(a)); } inline FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); } +inline FPFastMathModeMask operator&(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) & unsigned(b)); } +inline FPFastMathModeMask operator^(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) ^ unsigned(b)); } +inline FPFastMathModeMask operator~(FPFastMathModeMask a) { return FPFastMathModeMask(~unsigned(a)); } inline SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); } +inline SelectionControlMask operator&(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) & unsigned(b)); } +inline SelectionControlMask operator^(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) ^ unsigned(b)); } +inline SelectionControlMask operator~(SelectionControlMask a) { return SelectionControlMask(~unsigned(a)); } inline LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); } +inline LoopControlMask operator&(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) & unsigned(b)); } +inline LoopControlMask operator^(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) ^ unsigned(b)); } +inline LoopControlMask operator~(LoopControlMask a) { return LoopControlMask(~unsigned(a)); } inline FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); } +inline FunctionControlMask operator&(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) & unsigned(b)); } +inline FunctionControlMask operator^(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) ^ unsigned(b)); } +inline FunctionControlMask operator~(FunctionControlMask a) { return FunctionControlMask(~unsigned(a)); } inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); } +inline MemorySemanticsMask operator&(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) & unsigned(b)); } +inline MemorySemanticsMask operator^(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) ^ unsigned(b)); } +inline MemorySemanticsMask operator~(MemorySemanticsMask a) { return MemorySemanticsMask(~unsigned(a)); } inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); } +inline MemoryAccessMask operator&(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) & unsigned(b)); } +inline MemoryAccessMask operator^(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) ^ unsigned(b)); } +inline MemoryAccessMask operator~(MemoryAccessMask a) { return MemoryAccessMask(~unsigned(a)); } inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); } +inline KernelProfilingInfoMask operator&(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) & unsigned(b)); } +inline KernelProfilingInfoMask operator^(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) ^ unsigned(b)); } +inline KernelProfilingInfoMask operator~(KernelProfilingInfoMask a) { return KernelProfilingInfoMask(~unsigned(a)); } inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); } +inline RayFlagsMask operator&(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) & unsigned(b)); } +inline RayFlagsMask operator^(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) ^ unsigned(b)); } +inline RayFlagsMask operator~(RayFlagsMask a) { return RayFlagsMask(~unsigned(a)); } inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); } +inline FragmentShadingRateMask operator&(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) & unsigned(b)); } +inline FragmentShadingRateMask operator^(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) ^ unsigned(b)); } +inline FragmentShadingRateMask operator~(FragmentShadingRateMask a) { return FragmentShadingRateMask(~unsigned(a)); } +inline CooperativeMatrixOperandsMask operator|(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) | unsigned(b)); } +inline CooperativeMatrixOperandsMask operator&(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) & unsigned(b)); } +inline CooperativeMatrixOperandsMask operator^(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) ^ unsigned(b)); } +inline CooperativeMatrixOperandsMask operator~(CooperativeMatrixOperandsMask a) { return CooperativeMatrixOperandsMask(~unsigned(a)); } } // end namespace spv diff --git a/libraries/ZVulkan/src/glslang/spirv/spvIR.h b/libraries/ZVulkan/src/glslang/spirv/spvIR.h index 486e80d00..bd639d8f7 100644 --- a/libraries/ZVulkan/src/glslang/spirv/spvIR.h +++ b/libraries/ZVulkan/src/glslang/spirv/spvIR.h @@ -56,6 +56,7 @@ #include #include #include +#include namespace spv { @@ -96,10 +97,24 @@ public: Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), block(nullptr) { } explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { } virtual ~Instruction() {} + void reserveOperands(size_t count) { + operands.reserve(count); + idOperand.reserve(count); + } void addIdOperand(Id id) { + // ids can't be 0 + assert(id); operands.push_back(id); idOperand.push_back(true); } + // This method is potentially dangerous as it can break assumptions + // about SSA and lack of forward references. + void setIdOperand(unsigned idx, Id id) { + assert(id); + assert(idOperand[idx]); + operands[idx] = id; + } + void addImmediateOperand(unsigned int immediate) { operands.push_back(immediate); idOperand.push_back(false); @@ -111,27 +126,23 @@ public: void addStringOperand(const char* str) { - unsigned int word; - char* wordString = (char*)&word; - char* wordPtr = wordString; - int charCount = 0; + unsigned int word = 0; + unsigned int shiftAmount = 0; char c; + do { c = *(str++); - *(wordPtr++) = c; - ++charCount; - if (charCount == 4) { + word |= ((unsigned int)c) << shiftAmount; + shiftAmount += 8; + if (shiftAmount == 32) { addImmediateOperand(word); - wordPtr = wordString; - charCount = 0; + word = 0; + shiftAmount = 0; } } while (c != 0); // deal with partial last word - if (charCount > 0) { - // pad with 0s - for (; charCount < 4; ++charCount) - *(wordPtr++) = 0; + if (shiftAmount > 0) { addImmediateOperand(word); } } @@ -192,6 +203,12 @@ protected: // SPIR-V IR block. // +struct DebugSourceLocation { + int line; + int column; + spv::Id fileId; +}; + class Block { public: Block(Id id, Function& parent); @@ -202,12 +219,34 @@ public: Id getId() { return instructions.front()->getResultId(); } Function& getParent() const { return parent; } + // Returns true if the source location is actually updated. + // Note we still need the builder to insert the line marker instruction. This is just a tracker. + bool updateDebugSourceLocation(int line, int column, spv::Id fileId) { + if (currentSourceLoc && currentSourceLoc->line == line && currentSourceLoc->column == column && + currentSourceLoc->fileId == fileId) { + return false; + } + + currentSourceLoc = DebugSourceLocation{line, column, fileId}; + return true; + } + // Returns true if the scope is actually updated. + // Note we still need the builder to insert the debug scope instruction. This is just a tracker. + bool updateDebugScope(spv::Id scopeId) { + assert(scopeId); + if (currentDebugScope && *currentDebugScope == scopeId) { + return false; + } + + currentDebugScope = scopeId; + return true; + } void addInstruction(std::unique_ptr inst); void addPredecessor(Block* pred) { predecessors.push_back(pred); pred->successors.push_back(this);} void addLocalVariable(std::unique_ptr inst) { localVariables.push_back(std::move(inst)); } const std::vector& getPredecessors() const { return predecessors; } const std::vector& getSuccessors() const { return successors; } - const std::vector >& getInstructions() const { + std::vector >& getInstructions() { return instructions; } const std::vector >& getLocalVariables() const { return localVariables; } @@ -294,6 +333,12 @@ protected: std::vector > localVariables; Function& parent; + // Track source location of the last source location marker instruction. + std::optional currentSourceLoc; + + // Track scope of the last debug scope instruction. + std::optional currentDebugScope; + // track whether this block is known to be uncreachable (not necessarily // true for all unreachable blocks, but should be set at least // for the extraneous ones introduced by the builder). @@ -325,7 +370,7 @@ void inReadableOrder(Block* root, std::function& getBlocks() const { return blocks; } void addLocalVariable(std::unique_ptr inst); Id getReturnType() const { return functionInstruction.getTypeId(); } + Id getFuncId() const { return functionInstruction.getResultId(); } + Id getFuncTypeId() const { return functionInstruction.getIdOperand(1); } void setReturnPrecision(Decoration precision) { if (precision == DecorationRelaxedPrecision) @@ -361,6 +408,15 @@ public: Decoration getReturnPrecision() const { return reducedPrecisionReturn ? DecorationRelaxedPrecision : NoPrecision; } + void setDebugLineInfo(Id fileName, int line, int column) { + lineInstruction = std::unique_ptr{new Instruction(OpLine)}; + lineInstruction->reserveOperands(3); + lineInstruction->addIdOperand(fileName); + lineInstruction->addImmediateOperand(line); + lineInstruction->addImmediateOperand(column); + } + bool hasDebugLineInfo() const { return lineInstruction != nullptr; } + void setImplicitThis() { implicitThis = true; } bool hasImplicitThis() const { return implicitThis; } @@ -377,6 +433,11 @@ public: void dump(std::vector& out) const { + // OpLine + if (lineInstruction != nullptr) { + lineInstruction->dump(out); + } + // OpFunction functionInstruction.dump(out); @@ -390,17 +451,23 @@ public: end.dump(out); } + LinkageType getLinkType() const { return linkType; } + const char* getExportName() const { return exportName.c_str(); } + protected: Function(const Function&); Function& operator=(Function&); Module& parent; + std::unique_ptr lineInstruction; Instruction functionInstruction; std::vector parameterInstructions; std::vector blocks; bool implicitThis; // true if this is a member function expecting to be passed a 'this' as the first argument bool reducedPrecisionReturn; std::set reducedPrecisionParams; // list of parameter indexes that need a relaxed precision arg + LinkageType linkType; + std::string exportName; }; // @@ -460,11 +527,14 @@ protected: // Add both // - the OpFunction instruction // - all the OpFunctionParameter instructions -__inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, Module& parent) - : parent(parent), functionInstruction(id, resultType, OpFunction), implicitThis(false), - reducedPrecisionReturn(false) +__inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, LinkageType linkage, const std::string& name, Module& parent) + : parent(parent), lineInstruction(nullptr), + functionInstruction(id, resultType, OpFunction), implicitThis(false), + reducedPrecisionReturn(false), + linkType(linkage) { // OpFunction + functionInstruction.reserveOperands(2); functionInstruction.addImmediateOperand(FunctionControlMaskNone); functionInstruction.addIdOperand(functionType); parent.mapInstruction(&functionInstruction); @@ -478,6 +548,11 @@ __inline Function::Function(Id id, Id resultType, Id functionType, Id firstParam parent.mapInstruction(param); parameterInstructions.push_back(param); } + + // If importing/exporting, save the function name (without the mangled parameters) for the linkage decoration + if (linkType != LinkageTypeMax) { + exportName = name.substr(0, name.find_first_of('(')); + } } __inline void Function::addLocalVariable(std::unique_ptr inst) diff --git a/libraries/ZVulkan/src/vulkanbuilders.cpp b/libraries/ZVulkan/src/vulkanbuilders.cpp index e056c6f15..0e7c03a59 100644 --- a/libraries/ZVulkan/src/vulkanbuilders.cpp +++ b/libraries/ZVulkan/src/vulkanbuilders.cpp @@ -3,116 +3,9 @@ #include "vulkancompatibledevice.h" #include "vulkanswapchain.h" #include "glslang/glslang/Public/ShaderLang.h" +#include "glslang/glslang/Public/ResourceLimits.h" #include "glslang/spirv/GlslangToSpv.h" -static const TBuiltInResource DefaultTBuiltInResource = { - /* .MaxLights = */ 32, - /* .MaxClipPlanes = */ 6, - /* .MaxTextureUnits = */ 32, - /* .MaxTextureCoords = */ 32, - /* .MaxVertexAttribs = */ 64, - /* .MaxVertexUniformComponents = */ 4096, - /* .MaxVaryingFloats = */ 64, - /* .MaxVertexTextureImageUnits = */ 32, - /* .MaxCombinedTextureImageUnits = */ 80, - /* .MaxTextureImageUnits = */ 32, - /* .MaxFragmentUniformComponents = */ 4096, - /* .MaxDrawBuffers = */ 32, - /* .MaxVertexUniformVectors = */ 128, - /* .MaxVaryingVectors = */ 8, - /* .MaxFragmentUniformVectors = */ 16, - /* .MaxVertexOutputVectors = */ 16, - /* .MaxFragmentInputVectors = */ 15, - /* .MinProgramTexelOffset = */ -8, - /* .MaxProgramTexelOffset = */ 7, - /* .MaxClipDistances = */ 8, - /* .MaxComputeWorkGroupCountX = */ 65535, - /* .MaxComputeWorkGroupCountY = */ 65535, - /* .MaxComputeWorkGroupCountZ = */ 65535, - /* .MaxComputeWorkGroupSizeX = */ 1024, - /* .MaxComputeWorkGroupSizeY = */ 1024, - /* .MaxComputeWorkGroupSizeZ = */ 64, - /* .MaxComputeUniformComponents = */ 1024, - /* .MaxComputeTextureImageUnits = */ 16, - /* .MaxComputeImageUniforms = */ 8, - /* .MaxComputeAtomicCounters = */ 8, - /* .MaxComputeAtomicCounterBuffers = */ 1, - /* .MaxVaryingComponents = */ 60, - /* .MaxVertexOutputComponents = */ 64, - /* .MaxGeometryInputComponents = */ 64, - /* .MaxGeometryOutputComponents = */ 128, - /* .MaxFragmentInputComponents = */ 128, - /* .MaxImageUnits = */ 8, - /* .MaxCombinedImageUnitsAndFragmentOutputs = */ 8, - /* .MaxCombinedShaderOutputResources = */ 8, - /* .MaxImageSamples = */ 0, - /* .MaxVertexImageUniforms = */ 0, - /* .MaxTessControlImageUniforms = */ 0, - /* .MaxTessEvaluationImageUniforms = */ 0, - /* .MaxGeometryImageUniforms = */ 0, - /* .MaxFragmentImageUniforms = */ 8, - /* .MaxCombinedImageUniforms = */ 8, - /* .MaxGeometryTextureImageUnits = */ 16, - /* .MaxGeometryOutputVertices = */ 256, - /* .MaxGeometryTotalOutputComponents = */ 1024, - /* .MaxGeometryUniformComponents = */ 1024, - /* .MaxGeometryVaryingComponents = */ 64, - /* .MaxTessControlInputComponents = */ 128, - /* .MaxTessControlOutputComponents = */ 128, - /* .MaxTessControlTextureImageUnits = */ 16, - /* .MaxTessControlUniformComponents = */ 1024, - /* .MaxTessControlTotalOutputComponents = */ 4096, - /* .MaxTessEvaluationInputComponents = */ 128, - /* .MaxTessEvaluationOutputComponents = */ 128, - /* .MaxTessEvaluationTextureImageUnits = */ 16, - /* .MaxTessEvaluationUniformComponents = */ 1024, - /* .MaxTessPatchComponents = */ 120, - /* .MaxPatchVertices = */ 32, - /* .MaxTessGenLevel = */ 64, - /* .MaxViewports = */ 16, - /* .MaxVertexAtomicCounters = */ 0, - /* .MaxTessControlAtomicCounters = */ 0, - /* .MaxTessEvaluationAtomicCounters = */ 0, - /* .MaxGeometryAtomicCounters = */ 0, - /* .MaxFragmentAtomicCounters = */ 8, - /* .MaxCombinedAtomicCounters = */ 8, - /* .MaxAtomicCounterBindings = */ 1, - /* .MaxVertexAtomicCounterBuffers = */ 0, - /* .MaxTessControlAtomicCounterBuffers = */ 0, - /* .MaxTessEvaluationAtomicCounterBuffers = */ 0, - /* .MaxGeometryAtomicCounterBuffers = */ 0, - /* .MaxFragmentAtomicCounterBuffers = */ 1, - /* .MaxCombinedAtomicCounterBuffers = */ 1, - /* .MaxAtomicCounterBufferSize = */ 16384, - /* .MaxTransformFeedbackBuffers = */ 4, - /* .MaxTransformFeedbackInterleavedComponents = */ 64, - /* .MaxCullDistances = */ 8, - /* .MaxCombinedClipAndCullDistances = */ 8, - /* .MaxSamples = */ 4, - /* .maxMeshOutputVerticesNV = */ 256, - /* .maxMeshOutputPrimitivesNV = */ 512, - /* .maxMeshWorkGroupSizeX_NV = */ 32, - /* .maxMeshWorkGroupSizeY_NV = */ 1, - /* .maxMeshWorkGroupSizeZ_NV = */ 1, - /* .maxTaskWorkGroupSizeX_NV = */ 32, - /* .maxTaskWorkGroupSizeY_NV = */ 1, - /* .maxTaskWorkGroupSizeZ_NV = */ 1, - /* .maxMeshViewCountNV = */ 4, - /* .maxDualSourceDrawBuffersEXT = */ 1, - - /* .limits = */ { - /* .nonInductiveForLoops = */ 1, - /* .whileLoops = */ 1, - /* .doWhileLoops = */ 1, - /* .generalUniformIndexing = */ 1, - /* .generalAttributeMatrixVectorIndexing = */ 1, - /* .generalVaryingIndexing = */ 1, - /* .generalSamplerIndexing = */ 1, - /* .generalVariableIndexing = */ 1, - /* .generalConstantMatrixVectorIndexing = */ 1, - } -}; - void ShaderBuilder::Init() { ShInitialize(); @@ -260,8 +153,6 @@ std::unique_ptr ShaderBuilder::Create(const char *shadername, Vulk lengthsC.push_back((int)s.second.size()); } - TBuiltInResource resources = DefaultTBuiltInResource; - glslang::TShader shader(stage); shader.setStringsWithLengthsAndNames(sourcesC.data(), lengthsC.data(), namesC.data(), (int)sources.size()); shader.setEnvInput(glslang::EShSourceGlsl, stage, glslang::EShClientVulkan, 100); @@ -277,7 +168,7 @@ std::unique_ptr ShaderBuilder::Create(const char *shadername, Vulk } ShaderBuilderIncluderImpl includer(this); - bool compileSuccess = shader.parse(&resources, 110, false, EShMsgVulkanRules, includer); + bool compileSuccess = shader.parse(GetDefaultResources(), 110, false, EShMsgVulkanRules, includer); if (!compileSuccess) { VulkanError((std::string("Shader compile failed: ") + shader.getInfoLog()).c_str()); @@ -666,7 +557,7 @@ std::unique_ptr BufferBuilder::Create(VulkanDevice* device) CheckVulkanError(result, "Could not allocate memory for vulkan buffer"); } - auto obj = std::make_unique(device, buffer, allocation, bufferInfo.size); + auto obj = std::make_unique(device, buffer, allocation, (size_t)bufferInfo.size); if (debugName) obj->SetDebugName(debugName); return obj; From c56197b1d296e2e4f24e7b3fe71db527598c80f3 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 4 Jul 2024 01:10:40 +0200 Subject: [PATCH 133/414] Remove std::filesystem::absolute dependency for glslang on macOS as it is only supported on macOS 14 --- libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h index 23f495dcb..aa8f489f4 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h @@ -100,6 +100,14 @@ public: char locText[maxSize]; snprintf(locText, maxSize, ":%d", loc.line); +#ifdef __APPLE__ // crapple only implemented std::filesystem::absolute on the very latest macOS. + std::string location = loc.getStringNameOrNum(false); + if (absolute) { + append(std::filesystem::absolute(location).string()); + } else { + append(location); + } +#else if(loc.getFilename() == nullptr && shaderFileName != nullptr && absolute) { append(std::filesystem::absolute(shaderFileName).string()); } else { @@ -110,6 +118,7 @@ public: append(location); } } +#endif append(locText); append(": "); From 8a51044c68d055f04f8cb3e89dc7425b53457ae5 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 4 Jul 2024 01:13:58 +0200 Subject: [PATCH 134/414] Second attempt at fixing the build for the crapple platform --- libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h index aa8f489f4..04c925383 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h @@ -102,11 +102,7 @@ public: #ifdef __APPLE__ // crapple only implemented std::filesystem::absolute on the very latest macOS. std::string location = loc.getStringNameOrNum(false); - if (absolute) { - append(std::filesystem::absolute(location).string()); - } else { - append(location); - } + append(location); #else if(loc.getFilename() == nullptr && shaderFileName != nullptr && absolute) { append(std::filesystem::absolute(shaderFileName).string()); From 9d5fd281d688d758af016dc81d73c943c0f0142d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 4 Jul 2024 10:58:53 +0200 Subject: [PATCH 135/414] Increase macOS minimum version to 10.15 --- CMakeLists.txt | 2 +- libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 02b844269..0ccc1806e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -304,7 +304,7 @@ else() if( APPLE ) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13") + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15") if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ) # If we're compiling with a custom GCC on the Mac (which we know since g++-4.2 doesn't support C++11) statically link libgcc. set( ALL_C_FLAGS "-static-libgcc" ) diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h index 04c925383..23f495dcb 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/InfoSink.h @@ -100,10 +100,6 @@ public: char locText[maxSize]; snprintf(locText, maxSize, ":%d", loc.line); -#ifdef __APPLE__ // crapple only implemented std::filesystem::absolute on the very latest macOS. - std::string location = loc.getStringNameOrNum(false); - append(location); -#else if(loc.getFilename() == nullptr && shaderFileName != nullptr && absolute) { append(std::filesystem::absolute(shaderFileName).string()); } else { @@ -114,7 +110,6 @@ public: append(location); } } -#endif append(locText); append(": "); From 4d4a5ec44091b127bcb5348bfd0bc495aaadcd3a Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Thu, 4 Jul 2024 17:21:11 +0800 Subject: [PATCH 136/414] - Make the default `dimcolor` match VKDoom's titular orange tone - Change Doom's gold-ish dim color to a more darker red (that gold-ish color is a leftover from ancient ZDoom days... time to move on away from it) --- src/menu/doommenu.cpp | 2 +- wadsrc/static/mapinfo/doomcommon.txt | 2 +- wadsrc/static/mapinfo/mindefaults.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/menu/doommenu.cpp b/src/menu/doommenu.cpp index 08bf38f42..f1a22b381 100644 --- a/src/menu/doommenu.cpp +++ b/src/menu/doommenu.cpp @@ -339,7 +339,7 @@ CUSTOM_CVAR(Float, dimamount, -1.f, CVAR_ARCHIVE) self = 1.f; } } -CVAR(Color, dimcolor, 0xffd700, CVAR_ARCHIVE) +CVAR(Color, dimcolor, 0x571902, CVAR_ARCHIVE) void System_M_Dim() { diff --git a/wadsrc/static/mapinfo/doomcommon.txt b/wadsrc/static/mapinfo/doomcommon.txt index 89d4c44a8..32c7da9ce 100644 --- a/wadsrc/static/mapinfo/doomcommon.txt +++ b/wadsrc/static/mapinfo/doomcommon.txt @@ -36,7 +36,7 @@ gameinfo weaponslot = 5, "RocketLauncher" weaponslot = 6, "PlasmaRifle" weaponslot = 7, "BFG9000" - dimcolor = "30 26 00" + dimcolor = "08 00 00" dimamount = 0.5 bluramount = 0.0 menuslidercolor = "Orange" diff --git a/wadsrc/static/mapinfo/mindefaults.txt b/wadsrc/static/mapinfo/mindefaults.txt index 9f2668810..0d76ef3a9 100644 --- a/wadsrc/static/mapinfo/mindefaults.txt +++ b/wadsrc/static/mapinfo/mindefaults.txt @@ -25,7 +25,7 @@ gameinfo statusbar = "sbarinfo/doom.txt" intermissionmusic = "" intermissioncounter = true - dimcolor = "6f 00 6b" + dimcolor = "51 19 02" dimamount = 0.8 bluramount = 0.0 menuslidercolor = "Orange" From e0af452118f730227ac490d83b2e4ec70422fb2b Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Thu, 4 Jul 2024 18:40:40 +0800 Subject: [PATCH 137/414] Remove translucency effect from Doom's BulletPuff --- wadsrc/static/zscript/actors/doom/doommisc.zs | 3 --- 1 file changed, 3 deletions(-) diff --git a/wadsrc/static/zscript/actors/doom/doommisc.zs b/wadsrc/static/zscript/actors/doom/doommisc.zs index a761f94e0..32e70164b 100644 --- a/wadsrc/static/zscript/actors/doom/doommisc.zs +++ b/wadsrc/static/zscript/actors/doom/doommisc.zs @@ -61,9 +61,6 @@ class BulletPuff : Actor +NOGRAVITY +ALLOWPARTICLES +RANDOMIZE - +ZDOOMTRANS - RenderStyle "Translucent"; - Alpha 0.5; VSpeed 1; Mass 5; } From 9c0cd454f020cd4a8b521fdb27678fed1953221f Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Thu, 4 Jul 2024 18:42:16 +0800 Subject: [PATCH 138/414] Remove prediction toggles from the networking menu - unpredicted netgames are objectively inferior and it makes zero sense to allow users to disable them --- wadsrc/static/menudef.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 8499ed42a..a253f9933 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2483,8 +2483,6 @@ OptionMenu NetworkOptions protected { Title "$NETMNU_TITLE" StaticText "$NETMNU_LOCALOPTIONS", 1 - Option "$NETMNU_MOVEPREDICTION", "cl_noprediction", "OffOn" - Option "$NETMNU_LINESPECIALPREDICTION", "cl_predict_specials", "OnOff" Slider "$NETMNU_PREDICTIONLERPSCALE", "cl_predict_lerpscale", 0.0, 0.5, 0.05, 2 Slider "$NETMNU_LERPTHRESHOLD", "cl_predict_lerpthreshold", 0.1, 16.0, 0.1 StaticText " " From a48b4a2fca619abb036ca5fbc491dfad07d019c5 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Thu, 4 Jul 2024 18:49:01 +0800 Subject: [PATCH 139/414] Automap color presets match their vanilla colors by default (`am_colorset` dynamically configured in `gameconfigfile.cpp`) --- src/gameconfigfile.cpp | 23 +++++++++++++++++++++++ src/gameconfigfile.h | 1 + 2 files changed, 24 insertions(+) diff --git a/src/gameconfigfile.cpp b/src/gameconfigfile.cpp index 10931c138..f8da8f096 100644 --- a/src/gameconfigfile.cpp +++ b/src/gameconfigfile.cpp @@ -62,6 +62,7 @@ EXTERN_CVAR (Bool, snd_pitched) EXTERN_CVAR (Color, am_wallcolor) EXTERN_CVAR (Color, am_fdwallcolor) EXTERN_CVAR (Color, am_cdwallcolor) +EXTERN_CVAR (Int, am_colorset) EXTERN_CVAR (Bool, wi_percents) EXTERN_CVAR (Int, gl_texture_hqresizemode) EXTERN_CVAR (Int, gl_texture_hqresizemult) @@ -638,6 +639,11 @@ void FGameConfigFile::DoGameSetup (const char *gamename) ReadCVars (0); } + if (gameinfo.gametype & GAME_Doom) + { + SetDoomDefaults (); + } + if (gameinfo.gametype & GAME_Raven) { SetRavenDefaults (gameinfo.gametype == GAME_Hexen); @@ -926,6 +932,15 @@ void FGameConfigFile::AddAutoexec (FArgs *list, const char *game) } } +void FGameConfigFile::SetDoomDefaults () +{ + UCVarValue val; + + // vanilla-style automap color set + val.Int = 1; + am_colorset->SetGenericRepDefault(val, CVAR_Int); +} + void FGameConfigFile::SetRavenDefaults (bool isHexen) { UCVarValue val; @@ -966,6 +981,10 @@ void FGameConfigFile::SetRavenDefaults (bool isHexen) val.Int = 0x3f6040; color->SetGenericRepDefault (val, CVAR_Int); } + + // vanilla-style automap color set + val.Int = 3; + am_colorset->SetGenericRepDefault(val, CVAR_Int); } void FGameConfigFile::SetStrifeDefaults () @@ -973,6 +992,10 @@ void FGameConfigFile::SetStrifeDefaults () UCVarValue val; val.Int = 3; wipetype->SetGenericRepDefault(val, CVAR_Int); + + // vanilla-style automap color set + val.Int = 2; + am_colorset->SetGenericRepDefault(val, CVAR_Int); } CCMD (whereisini) diff --git a/src/gameconfigfile.h b/src/gameconfigfile.h index 0b898112e..a67c8858e 100644 --- a/src/gameconfigfile.h +++ b/src/gameconfigfile.h @@ -63,6 +63,7 @@ protected: void CreateStandardAutoExec (const char *section, bool start); private: + void SetDoomDefaults (); void SetRavenDefaults (bool isHexen); void SetStrifeDefaults (); void ReadCVars (unsigned flags); From 50b4fda41b7f7654bc4e09ac9ab46e51f2004739 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Thu, 4 Jul 2024 19:24:58 +0800 Subject: [PATCH 140/414] Enable always running by default --- src/g_game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 7ef027725..5ad06b775 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -203,7 +203,7 @@ int lookspeed[2] = {450, 512}; #define SLOWTURNTICS 6 -CVAR (Bool, cl_run, false, CVAR_GLOBALCONFIG|CVAR_ARCHIVE) // Always run? +CVAR (Bool, cl_run, true, CVAR_GLOBALCONFIG|CVAR_ARCHIVE) // Always run? CVAR (Bool, freelook, true, CVAR_GLOBALCONFIG|CVAR_ARCHIVE) // Always mlook? CVAR (Bool, lookstrafe, false, CVAR_GLOBALCONFIG|CVAR_ARCHIVE) // Always strafe with mouse? CVAR (Float, m_forward, 1.f, CVAR_GLOBALCONFIG|CVAR_ARCHIVE) From 188ae392e7d02b5e2941ffffef2503199cf3d803 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 4 Jul 2024 14:32:14 -0400 Subject: [PATCH 141/414] - enable mipmapping in 2D --- src/common/rendering/hwrenderer/hw_draw2d.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/common/rendering/hwrenderer/hw_draw2d.cpp b/src/common/rendering/hwrenderer/hw_draw2d.cpp index 4f556e77d..f3f12568c 100644 --- a/src/common/rendering/hwrenderer/hw_draw2d.cpp +++ b/src/common/rendering/hwrenderer/hw_draw2d.cpp @@ -49,6 +49,7 @@ //=========================================================================== CVAR(Bool, gl_aalines, false, CVAR_ARCHIVE) +CVAR(Bool, hw_2dmip, true, CVAR_ARCHIVE) void Draw2D(F2DDrawer* drawer, FRenderState& state) { @@ -69,6 +70,8 @@ void Draw2D(F2DDrawer* drawer, FRenderState& state, int x, int y, int width, int state.EnableDepthTest(false); state.EnableLineSmooth(gl_aalines); + bool cache_hw_2dmip = hw_2dmip; // cache cvar lookup so it's not done in a loop + auto &vertices = drawer->mVertices; auto &indices = drawer->mIndices; auto &commands = drawer->mData; @@ -184,7 +187,7 @@ void Draw2D(F2DDrawer* drawer, FRenderState& state, int x, int y, int width, int auto flags = cmd.mTexture->GetUseType() >= ETextureType::Special? UF_None : cmd.mTexture->GetUseType() == ETextureType::FontChar? UF_Font : UF_Texture; auto scaleflags = cmd.mFlags & F2DDrawer::DTF_Indexed ? CTF_Indexed : 0; - state.SetMaterial(cmd.mTexture, flags, scaleflags, cmd.mFlags & F2DDrawer::DTF_Wrap ? CLAMP_NONE : CLAMP_XY_NOMIP, cmd.mTranslationId, -1); + state.SetMaterial(cmd.mTexture, flags, scaleflags, cmd.mFlags & F2DDrawer::DTF_Wrap ? CLAMP_NONE : (cache_hw_2dmip ? CLAMP_XY : CLAMP_XY_NOMIP), cmd.mTranslationId, -1); state.EnableTexture(true); // Canvas textures are stored upside down From 7f2c928d14a87651d2dd6a49e835e96520092d93 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Fri, 5 Jul 2024 06:50:00 +0200 Subject: [PATCH 142/414] Prepare wall/flat surface create functions to be able to insert in any location in the mesh buffers --- .../rendering/hwrenderer/data/hw_levelmesh.h | 57 +++++++++ src/rendering/hwrenderer/doom_levelmesh.cpp | 111 ++++++++++++------ 2 files changed, 133 insertions(+), 35 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index ef3987f09..a1569c8d7 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -25,6 +25,25 @@ struct LevelSubmeshDrawRange int Count; }; +struct GeometryAllocInfo +{ + FFlatVertex* Vertices = nullptr; + int* UniformIndexes = nullptr; + uint32_t* Indexes = nullptr; + int VertexStart = 0; + int VertexCount = 0; + int IndexStart = 0; + int IndexCount = 0; +}; + +struct UniformsAllocInfo +{ + SurfaceUniforms* Uniforms = nullptr; + FMaterialState* Materials = nullptr; + int Start = 0; + int Count = 0; +}; + class LevelMesh { public: @@ -45,6 +64,44 @@ public: TArray Portals; + GeometryAllocInfo AllocGeometry(int vertexCount, int indexCount) + { + GeometryAllocInfo info; + info.VertexStart = Mesh.Vertices.Size(); + info.VertexCount = vertexCount; + info.IndexStart = Mesh.Indexes.Size(); + info.IndexCount = indexCount; + Mesh.Vertices.Resize(info.VertexStart + vertexCount); + Mesh.UniformIndexes.Resize(info.VertexStart + vertexCount); + Mesh.Indexes.Resize(info.IndexStart + indexCount); + info.Vertices = &Mesh.Vertices[info.VertexStart]; + info.UniformIndexes = &Mesh.UniformIndexes[info.VertexStart]; + info.Indexes = &Mesh.Indexes[info.IndexStart]; + return info; + } + + UniformsAllocInfo AllocUniforms(int count) + { + UniformsAllocInfo info; + info.Start = Mesh.Uniforms.Size(); + info.Count = count; + Mesh.Uniforms.Resize(info.Start + count); + Mesh.Materials.Resize(info.Start + count); + info.Uniforms = &Mesh.Uniforms[info.Start]; + info.Materials = &Mesh.Materials[info.Start]; + return info; + } + + void FreeGeometry(int vertexStart, int vertexCount, int indexStart, int indexCount) + { + for (int i = 0; i < indexCount; i++) + Mesh.Indexes[indexStart + i] = 0; + } + + void FreeUniforms(int start, int count) + { + } + struct { // Vertex data diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 066fd55a8..34b2952f7 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -455,37 +455,57 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh wallpart.DrawWall(&disp, state, translucent); } + int numVertices = 0; + int numIndexes = 0; + int numUniforms = 0; + for (auto& it : state.mSortedLists) + { + numUniforms++; + for (MeshDrawCommand& command : it.second.mDraws) + { + if (command.DrawType == DT_TriangleFan && command.Count >= 3) + { + numVertices += command.Count; + numIndexes += (command.Count - 2) * 3; + } + } + } + + GeometryAllocInfo ginfo = AllocGeometry(numVertices, numIndexes); + UniformsAllocInfo uinfo = AllocUniforms(numUniforms); + int pipelineID = 0; - int startVertIndex = Mesh.Vertices.Size(); - int startElementIndex = Mesh.Indexes.Size(); + int uniformsIndex = uinfo.Start; + int vertIndex = ginfo.VertexStart; for (auto& it : state.mSortedLists) { const MeshApplyState& applyState = it.first; pipelineID = screen->GetLevelMeshPipelineID(applyState.applyData, applyState.surfaceUniforms, applyState.material); - int uniformsIndex = Mesh.Uniforms.Size(); - Mesh.Uniforms.Push(applyState.surfaceUniforms); - Mesh.Materials.Push(applyState.material); - for (MeshDrawCommand& command : it.second.mDraws) { - for (int i = command.Start, end = command.Start + command.Count; i < end; i++) - { - Mesh.Vertices.Push(state.mVertices[i]); - Mesh.UniformIndexes.Push(uniformsIndex); - } - - if (command.DrawType == DT_TriangleFan) + if (command.DrawType == DT_TriangleFan && command.Count >= 3) { for (int i = 2, count = command.Count; i < count; i++) { - Mesh.Indexes.Push(startVertIndex); - Mesh.Indexes.Push(startVertIndex + i - 1); - Mesh.Indexes.Push(startVertIndex + i); + *(ginfo.Indexes++) = vertIndex; + *(ginfo.Indexes++) = vertIndex + i - 1; + *(ginfo.Indexes++) = vertIndex + i; } + + for (int i = command.Start, end = command.Start + command.Count; i < end; i++) + { + *(ginfo.Vertices++) = state.mVertices[i]; + *(ginfo.UniformIndexes++) = uniformsIndex; + } + vertIndex += command.Count; } } + + *(uinfo.Uniforms++) = applyState.surfaceUniforms; + *(uinfo.Materials++) = applyState.material; + uniformsIndex++; } state.mSortedLists.clear(); state.mVertices.Clear(); @@ -517,10 +537,10 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh surf.AlwaysUpdate = !!(side->sector->Flags & SECF_LM_DYNAMIC); surf.SectorGroup = sectorGroup[side->sector->Index()]; surf.Alpha = float(side->linedef->alpha); - surf.MeshLocation.StartVertIndex = startVertIndex; - surf.MeshLocation.StartElementIndex = startElementIndex; - surf.MeshLocation.NumVerts = Mesh.Vertices.Size() - startVertIndex; - surf.MeshLocation.NumElements = Mesh.Indexes.Size() - startElementIndex; + surf.MeshLocation.StartVertIndex = ginfo.VertexStart; + surf.MeshLocation.StartElementIndex = ginfo.IndexStart; + surf.MeshLocation.NumVerts = ginfo.VertexCount; + surf.MeshLocation.NumElements = ginfo.IndexCount; surf.Plane = FVector4(N.X, N.Y, 0.0f, v1 | N); surf.Texture = wallpart.texture; surf.PipelineID = pipelineID; @@ -627,18 +647,17 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state textureMatrix.loadIdentity(); int pipelineID = 0; - int uniformsIndex = 0; + const SurfaceUniforms* uniforms = nullptr; + const FMaterialState* material = nullptr; bool foundDraw = false; for (auto& it : state.mSortedLists) { const MeshApplyState& applyState = it.first; pipelineID = screen->GetLevelMeshPipelineID(applyState.applyData, applyState.surfaceUniforms, applyState.material); - uniformsIndex = Mesh.Uniforms.Size(); textureMatrix = applyState.textureMatrix; - Mesh.Uniforms.Push(applyState.surfaceUniforms); - Mesh.Materials.Push(applyState.material); - + uniforms = &applyState.surfaceUniforms; + material = &applyState.material; foundDraw = true; break; } @@ -649,6 +668,26 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state if (!foundDraw) continue; + int numVertices = 0; + int numIndexes = 0; + for (subsector_t* sub : flatpart.section->subsectors) + { + if (sub->numlines < 3) + continue; + numVertices += sub->numlines; + numIndexes += (sub->numlines - 2) * 3; + } + + GeometryAllocInfo ginfo = AllocGeometry(numVertices, numIndexes); + UniformsAllocInfo uinfo = AllocUniforms(1); + + *uinfo.Uniforms = *uniforms; + *uinfo.Materials = *material; + + int uniformsIndex = uinfo.Start; + int vertIndex = ginfo.VertexStart; + int elementIndex = ginfo.IndexStart; + uint16_t sampleDimension = 0; if (flatpart.ceiling) { @@ -683,8 +722,10 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state if (sub->numlines < 3) continue; - int startVertIndex = Mesh.Vertices.Size(); - int startElementIndex = Mesh.Indexes.Size(); + int startVertIndex = vertIndex; + int startElementIndex = elementIndex; + vertIndex += sub->numlines; + elementIndex += (sub->numlines - 2) * 3; for (int i = 0, end = sub->numlines; i < end; i++) { @@ -703,26 +744,26 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state ffv.lv = 0.0f; ffv.lindex = -1.0f; - Mesh.Vertices.Push(ffv); - Mesh.UniformIndexes.Push(uniformsIndex); + *(ginfo.Vertices++) = ffv; + *(ginfo.UniformIndexes++) = uniformsIndex; } if (flatpart.ceiling) { for (int i = 2, count = sub->numlines; i < count; i++) { - Mesh.Indexes.Push(startVertIndex); - Mesh.Indexes.Push(startVertIndex + i - 1); - Mesh.Indexes.Push(startVertIndex + i); + *(ginfo.Indexes++) = startVertIndex; + *(ginfo.Indexes++) = startVertIndex + i - 1; + *(ginfo.Indexes++) = startVertIndex + i; } } else { for (int i = 2, count = sub->numlines; i < count; i++) { - Mesh.Indexes.Push(startVertIndex + i); - Mesh.Indexes.Push(startVertIndex + i - 1); - Mesh.Indexes.Push(startVertIndex); + *(ginfo.Indexes++) = startVertIndex + i; + *(ginfo.Indexes++) = startVertIndex + i - 1; + *(ginfo.Indexes++) = startVertIndex; } } From 10d0f94972a6da8b4482ab46b615d9f5b497420a Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sun, 26 May 2024 17:21:58 -0400 Subject: [PATCH 143/414] Misc network fixes Fixed missing teleport specials when predicting. Added rubberband limit; if too far away from the predicted position, will instead instantly snap the player's view to their new spot. Deprecated cl_noprediction; this was pointless as you'd never not want to predict your position/angles. Fixed angle targets not being backed up. Fixed oldbuttons not being set. Updated menu --- src/playsim/p_spec.cpp | 4 +++- src/playsim/p_user.cpp | 43 +++++++++++++++++++++++++------------ src/rendering/r_utility.cpp | 2 -- wadsrc/static/menudef.txt | 5 ++--- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index c0bfca34a..ba2036971 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -384,7 +384,9 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType) // Only predict a very specifc section of specials if (line->special != Teleport_Line && - line->special != Teleport) + line->special != Teleport && + line->special != Teleport_NoFog && + line->special != Teleport_NoStop) { return false; } diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 924ad47a8..fefb0f943 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -101,9 +101,9 @@ static FRandom pr_skullpop ("SkullPop"); CVAR(Bool, sv_singleplayerrespawn, false, CVAR_SERVERINFO | CVAR_CHEAT) // Variables for prediction -CVAR (Bool, cl_noprediction, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, cl_predict_specials, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // Deprecated +CVAR(Bool, cl_noprediction, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, cl_predict_lerpscale, 0.05f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, cl_predict_lerpthreshold, 2.00f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) @@ -124,6 +124,11 @@ CUSTOM_CVAR(Float, cl_rubberband_minmove, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFI if (self < 0.1f) self = 0.1f; } +CUSTOM_CVAR(Float, cl_rubberband_limit, 756.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +{ + if (self < 0.0f) + self = 0.0f; +} ColorSetList ColorSets; PainFlashList PainFlashes; @@ -353,6 +358,7 @@ void player_t::CopyFrom(player_t &p, bool copyPSP) MUSINFOactor = p.MUSINFOactor; MUSINFOtics = p.MUSINFOtics; SoundClass = p.SoundClass; + angleOffsetTargets = p.angleOffsetTargets; if (copyPSP) { // This needs to transfer ownership completely. @@ -1422,8 +1428,7 @@ void P_PredictPlayer (player_t *player) { int maxtic; - if (cl_noprediction || - singletics || + if (singletics || demoplayback || player->mo == NULL || player != player->mo->Level->GetConsolePlayer() || @@ -1497,7 +1502,7 @@ void P_PredictPlayer (player_t *player) // This essentially acts like a mini P_Ticker where only the stuff relevant to the client is actually // called. Call order is preserved. - bool rubberband = false; + bool rubberband = false, rubberbandLimit = false; DVector3 rubberbandPos = {}; const bool canRubberband = LastPredictedTic >= 0 && cl_rubberband_scale > 0.0f && cl_rubberband_scale < 1.0f; const double rubberbandThreshold = max(cl_rubberband_minmove, cl_rubberband_threshold); @@ -1521,9 +1526,11 @@ void P_PredictPlayer (player_t *player) { rubberband = true; rubberbandPos = player->mo->Pos(); + rubberbandLimit = cl_rubberband_limit > 0.0f && dist > cl_rubberband_limit * cl_rubberband_limit; } } + player->oldbuttons = player->cmd.ucmd.buttons; player->cmd = localcmds[i % LOCALCMDTICS]; player->mo->ClearInterpolation(); player->mo->ClearFOVInterpolation(); @@ -1533,21 +1540,29 @@ void P_PredictPlayer (player_t *player) if (rubberband) { - R_ClearInterpolationPath(); - player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; - DPrintf(DMSG_NOTIFY, "Prediction mismatch at (%.3f, %.3f, %.3f)\nExpected: (%.3f, %.3f, %.3f)\nCorrecting to (%.3f, %.3f, %.3f)\n", LastPredictedPosition.X, LastPredictedPosition.Y, LastPredictedPosition.Z, rubberbandPos.X, rubberbandPos.Y, rubberbandPos.Z, player->mo->X(), player->mo->Y(), player->mo->Z()); - DVector3 snapPos = {}; - P_LerpCalculate(player->mo, LastPredictedPosition, snapPos, cl_rubberband_scale, cl_rubberband_threshold, cl_rubberband_minmove); - player->mo->PrevPortalGroup = LastPredictedPortalGroup; - player->mo->Prev = LastPredictedPosition; - const double zOfs = player->viewz - player->mo->Z(); - player->mo->SetXYZ(snapPos); - player->viewz = snapPos.Z + zOfs; + if (rubberbandLimit) + { + // If too far away, instantly snap the player's view to their correct position. + player->mo->renderflags |= RF_NOINTERPOLATEVIEW; + } + else + { + R_ClearInterpolationPath(); + player->mo->renderflags &= ~RF_NOINTERPOLATEVIEW; + + DVector3 snapPos = {}; + P_LerpCalculate(player->mo, LastPredictedPosition, snapPos, cl_rubberband_scale, cl_rubberband_threshold, cl_rubberband_minmove); + player->mo->PrevPortalGroup = LastPredictedPortalGroup; + player->mo->Prev = LastPredictedPosition; + const double zOfs = player->viewz - player->mo->Z(); + player->mo->SetXYZ(snapPos); + player->viewz = snapPos.Z + zOfs; + } } // This is intentionally done after rubberbanding starts since it'll automatically smooth itself towards diff --git a/src/rendering/r_utility.cpp b/src/rendering/r_utility.cpp index b78cf955d..2a5d95586 100644 --- a/src/rendering/r_utility.cpp +++ b/src/rendering/r_utility.cpp @@ -441,7 +441,6 @@ void R_Shutdown () //========================================================================== //CVAR (Int, tf, 0, 0) -EXTERN_CVAR (Bool, cl_noprediction) bool P_NoInterpolation(player_t const *player, AActor const *actor) { @@ -455,7 +454,6 @@ bool P_NoInterpolation(player_t const *player, AActor const *actor) && player->mo->reactiontime == 0 && !NoInterpolateView && !paused - && (!netgame || !cl_noprediction) && !LocalKeyboardTurner; } diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index c9535ff0c..0d099afb6 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2363,10 +2363,9 @@ OptionMenu NetworkOptions protected { Title "$NETMNU_TITLE" StaticText "$NETMNU_LOCALOPTIONS", 1 - Option "$NETMNU_MOVEPREDICTION", "cl_noprediction", "OffOn" Option "$NETMNU_LINESPECIALPREDICTION", "cl_predict_specials", "OnOff" - Slider "$NETMNU_PREDICTIONLERPSCALE", "cl_predict_lerpscale", 0.0, 0.5, 0.05, 2 - Slider "$NETMNU_LERPTHRESHOLD", "cl_predict_lerpthreshold", 0.1, 16.0, 0.1 + Slider "$NETMNU_PREDICTIONLERPSCALE", "cl_rubberband_scale", 0.0, 1.0, 0.05, 2 + Slider "$NETMNU_LERPTHRESHOLD", "cl_rubberband_threshold", 0.0, 256.0, 8.0 StaticText " " StaticText "$NETMNU_HOSTOPTIONS", 1 Option "$NETMNU_EXTRATICS", "net_extratic", "ExtraTicMode" From 50ce14dedbd648fc94523d0cfd16e6f143b1b548 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sun, 7 Jul 2024 22:29:08 +0800 Subject: [PATCH 144/414] Reinstate `autoaim` as an enabled default --- src/d_netinfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_netinfo.cpp b/src/d_netinfo.cpp index 3d35e5029..ee004505e 100644 --- a/src/d_netinfo.cpp +++ b/src/d_netinfo.cpp @@ -54,7 +54,7 @@ static FRandom pr_pickteam ("PickRandomTeam"); -CVAR (Float, autoaim, 0.f, CVAR_USERINFO | CVAR_ARCHIVE); +CVAR (Float, autoaim, 35.f, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (String, name, "Player", CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Color, color, 0x40cf00, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Int, colorset, 0, CVAR_USERINFO | CVAR_ARCHIVE); From 7ddd4ec245c8aec08f5a219e015c0d590dc26f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 7 Jul 2024 10:54:49 -0300 Subject: [PATCH 145/414] handle freeze in decoupled animations --- src/playsim/actor.h | 2 +- src/playsim/p_actionfunctions.cpp | 8 +++++--- src/playsim/p_mobj.cpp | 14 +++++++++++++- src/r_data/models.cpp | 4 ++-- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index ece9be8e0..4a0a3cf14 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -710,7 +710,7 @@ struct AnimOverride int flags = ANIMOVERRIDE_NONE; float framerate; double startTic; // when the current animation started (changing framerates counts as restarting) (or when animation starts if interpolating from previous animation) - double switchTic; // when the animation was changed -- where to interpolate the switch from + double switchOffset; // when the animation was changed -- where to interpolate the switch from }; struct ModelOverride diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index b6090213b..4a647af4e 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5214,18 +5214,20 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s self->modelData->curAnim.startFrame = startFrame < 0 ? animStart : animStart + startFrame; self->modelData->curAnim.loopFrame = loopFrame < 0 ? animStart : animStart + loopFrame; self->modelData->curAnim.flags = (flags&SAF_LOOP) ? ANIMOVERRIDE_LOOP : 0; - self->modelData->curAnim.switchTic = tic; self->modelData->curAnim.framerate = (float)framerate; if(!(flags & SAF_INSTANT)) { self->modelData->prevAnim.startFrame = getCurrentFrame(self->modelData->prevAnim, tic); - self->modelData->curAnim.startTic = floor(tic) + interpolateTics; + int startTic = floor(tic) + interpolateTics; + self->modelData->curAnim.startTic = startTic; + self->modelData->curAnim.switchOffset = startTic - tic; } else { self->modelData->curAnim.startTic = tic; + self->modelData->curAnim.switchOffset = 0; } } @@ -5274,7 +5276,7 @@ void SetAnimationFrameRateInternal(AActor * self, double framerate, double ticFr self->modelData->curAnim.startFrame = frame; self->modelData->curAnim.startTic = tic; - self->modelData->curAnim.switchTic = tic; + self->modelData->curAnim.switchOffset = 0; self->modelData->curAnim.framerate = (float)framerate; } diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 728f1a56d..3f08d3a39 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -1453,7 +1453,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, struct AnimOverride &a arc("flags", ao.flags); arc("framerate", ao.framerate); arc("startTic", ao.startTic); - arc("switchTic", ao.switchTic); + arc("switchOffset", ao.switchOffset); arc.EndObject(); return arc; } @@ -3861,6 +3861,12 @@ void AActor::Tick () { special2++; } + + if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & ANIMOVERRIDE_NONE)) + { + modelData->curAnim.startTic += 1; + } + return; } @@ -3908,6 +3914,12 @@ void AActor::Tick () { special2++; } + + if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & ANIMOVERRIDE_NONE)) + { + modelData->curAnim.startTic += 1; + } + return; } diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index f63a15ef6..abf1bf179 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -316,13 +316,13 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr if(actor->modelData && !(actor->modelData->curAnim.flags & ANIMOVERRIDE_NONE)) { double tic = actor->Level->totaltime; - if ((ConsoleState == c_up || ConsoleState == c_rising) && (menuactive == MENU_Off || menuactive == MENU_OnNoPause) && !Level->isFrozen()) + if ((ConsoleState == c_up || ConsoleState == c_rising) && (menuactive == MENU_Off || menuactive == MENU_OnNoPause) && !actor->isFrozen()) { tic += I_GetTimeFrac(); } if(actor->modelData->curAnim.startTic > tic) { - inter = (tic - actor->modelData->curAnim.switchTic) / (actor->modelData->curAnim.startTic - actor->modelData->curAnim.switchTic); + inter = (tic - (actor->modelData->curAnim.startTic - actor->modelData->curAnim.switchOffset)) / actor->modelData->curAnim.switchOffset; double nextFrame = actor->modelData->curAnim.startFrame; From 0caa036a96a24f47964cddb57906d5b51f71ac1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 9 Jul 2024 11:51:31 -0300 Subject: [PATCH 146/414] fix compilation --- src/r_data/models.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index abf1bf179..866e538c3 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -44,6 +44,7 @@ #include "texturemanager.h" #include "modelrenderer.h" #include "actor.h" +#include "actorinlines.h" #ifdef _MSC_VER From 566ad81cc097b8b5c4857976e81bcc7573f861c0 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Fri, 12 Jul 2024 20:29:48 +0800 Subject: [PATCH 147/414] Rebalance default audio mix --- src/common/audio/music/i_music.cpp | 2 +- src/common/menu/menu.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/audio/music/i_music.cpp b/src/common/audio/music/i_music.cpp index b30a27f13..4570de82e 100644 --- a/src/common/audio/music/i_music.cpp +++ b/src/common/audio/music/i_music.cpp @@ -70,7 +70,7 @@ int nomusic = 0; // Maximum volume of MOD/stream music. //========================================================================== -CUSTOM_CVARD(Float, snd_musicvolume, 1.0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "controls music volume") +CUSTOM_CVARD(Float, snd_musicvolume, 0.65, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "controls music volume") { if (self < 0.f) self = 0.f; diff --git a/src/common/menu/menu.cpp b/src/common/menu/menu.cpp index ee9a1277e..1cff6a8b5 100644 --- a/src/common/menu/menu.cpp +++ b/src/common/menu/menu.cpp @@ -63,7 +63,7 @@ static ScaleOverrider *CurrentScaleOverrider; CVAR (Int, m_showinputgrid, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, m_blockcontrollers, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -CVAR (Float, snd_menuvolume, 0.6f, CVAR_ARCHIVE) +CVAR (Float, snd_menuvolume, 0.8f, CVAR_ARCHIVE) CVAR(Int, m_use_mouse, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Int, m_show_backbutton, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, m_cleanscale, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) From f5ab26a45b42c33e3b8f89a81a0e43d6e589b55c Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 12 Jul 2024 19:50:18 +0200 Subject: [PATCH 148/414] Fix directory crash for filenames that appear elsewhere in the path --- src/common/filesystem/source/file_directory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/filesystem/source/file_directory.cpp b/src/common/filesystem/source/file_directory.cpp index 3193e00b1..1999e9c4c 100644 --- a/src/common/filesystem/source/file_directory.cpp +++ b/src/common/filesystem/source/file_directory.cpp @@ -106,7 +106,7 @@ int FDirectory::AddDirectory(const char *dirpath, LumpFilterInfo* filter, FileSy if (mBasePath == nullptr) { // extract the base path from the first entry to cover changes made in ScanDirectory. - auto full = entry.FilePath.find(entry.FilePathRel); + auto full = entry.FilePath.rfind(entry.FilePathRel); std::string path(entry.FilePath, 0, full); mBasePath = stringpool->Strdup(path.c_str()); } From 9d78eb5aa0231197b3b7399ae13aaf6741384a02 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 12 Jul 2024 19:50:18 +0200 Subject: [PATCH 149/414] Fix directory crash for filenames that appear elsewhere in the path --- src/common/filesystem/source/file_directory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/filesystem/source/file_directory.cpp b/src/common/filesystem/source/file_directory.cpp index 0b9b7cd45..ca87fd9ea 100644 --- a/src/common/filesystem/source/file_directory.cpp +++ b/src/common/filesystem/source/file_directory.cpp @@ -106,7 +106,7 @@ int FDirectory::AddDirectory(const char *dirpath, LumpFilterInfo* filter, FileSy if (mBasePath == nullptr) { // extract the base path from the first entry to cover changes made in ScanDirectory. - auto full = entry.FilePath.find(entry.FilePathRel); + auto full = entry.FilePath.rfind(entry.FilePathRel); std::string path(entry.FilePath, 0, full); mBasePath = stringpool->Strdup(path.c_str()); } From 314ec1030c6c19e0fdc1adc8a0841feaa2cf2287 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 12 Jul 2024 20:04:50 +0200 Subject: [PATCH 150/414] Fix level mesh crash --- src/rendering/hwrenderer/doom_levelmesh.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 34b2952f7..59e9a8bfa 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -618,6 +618,10 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state { for (HWFlat& flatpart : list) { + state.mSortedLists.clear(); + state.mVertices.Clear(); + state.mIndexes.Clear(); + if (isSky) { state.SetEffect(EFF_PORTAL); @@ -661,9 +665,6 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state foundDraw = true; break; } - state.mSortedLists.clear(); - state.mVertices.Clear(); - state.mIndexes.Clear(); if (!foundDraw) continue; From 3ae77ef6c4d18338d5db0bae471ffea18b77ca1d Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sat, 20 Jul 2024 05:45:28 +0200 Subject: [PATCH 151/414] Fix crash when loading maps with sectors with no subsectors --- src/rendering/hwrenderer/doom_levelmesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 59e9a8bfa..a1e4fc0db 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -339,7 +339,7 @@ void DoomLevelMesh::CreateSurfaces(FLevelLocals& doomMap) for (unsigned int i = 0; i < doomMap.sectors.Size(); i++) { sector_t* sector = &doomMap.sectors[i]; - if (sector->subsectors[0]->flags & SSECF_POLYORG) + if (sector->subsectorcount == 0 || sector->subsectors[0]->flags & SSECF_POLYORG) continue; UpdateFlat(doomMap, i); } From f671018700e1e71ad2dda9ccdbf3fe62bb9efb49 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sun, 21 Jul 2024 00:26:58 +0800 Subject: [PATCH 152/414] Clean up lightmap stuff in the namedef --- src/maploader/udmf.cpp | 4 ++-- src/namedef_custom.h | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index db34030de..725b95b91 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -1166,7 +1166,7 @@ public: ld->healthgroup = CheckInt(key); break; - case NAME_lm_sampledist_line: + case NAME_lm_sampledist: case NAME_lm_sampledist_top: case NAME_lm_sampledist_mid: case NAME_lm_sampledist_bot: @@ -1516,7 +1516,7 @@ public: sd->Flags |= WALLF_EXTCOLOR; break; - case NAME_lm_sampledist_line: + case NAME_lm_sampledist: case NAME_lm_sampledist_top: case NAME_lm_sampledist_mid: case NAME_lm_sampledist_bot: diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 61bf9d261..59752245b 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -854,7 +854,7 @@ xx(Sky) xx(Pagename) // Lightmap/ZDRay keywords -xx(lm_sampledist_line) +xx(lm_sampledist) xx(lm_sampledist_top) xx(lm_sampledist_mid) xx(lm_sampledist_bot) @@ -862,7 +862,6 @@ xx(lm_sampledist_floor) xx(lm_sampledist_ceiling) xx(lm_dynamic) xx(lm_suncolor) -xx(lm_sampledist) // Light keywords xx(SoftShadowRadius) From 519dd16c9a2f351fd9e59d6a2f826680f9e80cbd Mon Sep 17 00:00:00 2001 From: Blue Shadow Date: Sun, 28 Jul 2024 08:07:43 +0300 Subject: [PATCH 153/414] - fixed alignment issue in SBARINFO's DrawString command --- src/g_statusbar/sbarinfo_commands.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_statusbar/sbarinfo_commands.cpp b/src/g_statusbar/sbarinfo_commands.cpp index bbb3bc90f..73462f384 100644 --- a/src/g_statusbar/sbarinfo_commands.cpp +++ b/src/g_statusbar/sbarinfo_commands.cpp @@ -924,6 +924,7 @@ class CommandDrawString : public SBarInfoCommand break; default: str = GStrings.localize(label.GetChars()); + RealignString(); break; } } From d697eafbe16d8f76e01759ac033451386dfa3bb8 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Mon, 29 Jul 2024 00:19:56 -0400 Subject: [PATCH 154/414] Fixed subnormal float viewpos values breaking rendering --- src/common/utility/vectors.h | 39 ++++++++++++++++++++++++++++++++++++ src/playsim/actor.h | 3 +++ 2 files changed, 42 insertions(+) diff --git a/src/common/utility/vectors.h b/src/common/utility/vectors.h index 77e41d2a9..47eb59793 100644 --- a/src/common/utility/vectors.h +++ b/src/common/utility/vectors.h @@ -1019,6 +1019,45 @@ struct TVector4 } }; +inline void ZeroSubnormalsF(double& num) +{ + if (fabs(num) < FLT_MIN) num = 0; +} + +inline void ZeroSubnormals(double& num) +{ + if (fabs(num) < DBL_MIN) num = 0; +} + +inline void ZeroSubnormals(float& num) +{ + if (fabsf(num) < FLT_MIN) num = 0; +} + +template +inline void ZeroSubnormals(TVector2& vec) +{ + ZeroSubnormals(vec.X); + ZeroSubnormals(vec.Y); +} + +template +inline void ZeroSubnormals(TVector3& vec) +{ + ZeroSubnormals(vec.X); + ZeroSubnormals(vec.Y); + ZeroSubnormals(vec.Z); +} + +template +inline void ZeroSubnormals(TVector4& vec) +{ + ZeroSubnormals(vec.X); + ZeroSubnormals(vec.Y); + ZeroSubnormals(vec.Z); + ZeroSubnormals(vec.W); +} + template struct TMatrix3x3 { diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 4a0a3cf14..d0ea86cb6 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -774,6 +774,9 @@ public: void Set(DVector3 &off, int f = -1) { + ZeroSubnormalsF(off.X); + ZeroSubnormalsF(off.Y); + ZeroSubnormalsF(off.Z); Offset = off; if (f > -1) From 3d3cd8886843335a28d9c54a4876024948db867e Mon Sep 17 00:00:00 2001 From: Boondorl Date: Wed, 31 Jul 2024 01:01:37 -0400 Subject: [PATCH 155/414] Disable effects on Actors set not to render locally These are purely visual --- src/playsim/a_dynlight.cpp | 2 +- src/playsim/dthinker.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index dddb9f54e..6d67d4e1b 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -255,7 +255,7 @@ void FDynamicLight::Tick() if (owned) { - if (!target->state) + if (!target->state || !target->ShouldRenderLocally()) { Deactivate(); return; diff --git a/src/playsim/dthinker.cpp b/src/playsim/dthinker.cpp index 3214decf3..4229de792 100644 --- a/src/playsim/dthinker.cpp +++ b/src/playsim/dthinker.cpp @@ -132,7 +132,7 @@ void FThinkerCollection::RunThinkers(FLevelLocals *Level) if (dolights) ac->SetDynamicLights(); } // This was merged from P_RunEffects to eliminate the costly duplicate ThinkerIterator loop. - if ((ac->effects || ac->fountaincolor) && !Level->isFrozen()) + if ((ac->effects || ac->fountaincolor) && ac->ShouldRenderLocally() && !Level->isFrozen()) { P_RunEffect(ac, ac->effects); } From 593e1c0225ff4127f80a506bb4631bcc5c842ef3 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Wed, 31 Jul 2024 00:41:00 +0800 Subject: [PATCH 156/414] Add SPF_NOMIPMAP to force actor sprites or particles to have no mipmaps. This makes tiny sprites/particles look more crisp and legible in the distance. Mipmapping causes the sprites/particles to have an inconsistent look where they'd sometimes be clearly visible and sometimes less visible depending on camera distance and movement. --- src/playsim/actor.h | 1 + src/playsim/p_effect.h | 1 + src/rendering/hwrenderer/scene/hw_drawstructs.h | 1 + src/rendering/hwrenderer/scene/hw_sprites.cpp | 7 ++++++- src/scripting/thingdef_data.cpp | 1 + wadsrc/static/zscript/constants.zs | 1 + 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index d0ea86cb6..fa0e23bf2 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -501,6 +501,7 @@ enum ActorRenderFlag2 RF2_FLIPSPRITEOFFSETX = 0x0010, RF2_FLIPSPRITEOFFSETY = 0x0020, RF2_CAMFOLLOWSPLAYER = 0x0040, // Matches the cam's base position and angles to the main viewpoint. + RF2_NOMIPMAP = 0x0080, // [Nash] forces no mipmapping on sprites. Useful for tiny sprites that need to remain visually crisp }; // This translucency value produces the closest match to Heretic's TINTTAB. diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index 29f1cb720..5eafdcd4b 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -69,6 +69,7 @@ enum EParticleFlags SPF_FACECAMERA = 1 << 11, SPF_NOFACECAMERA = 1 << 12, SPF_ROLLCENTER = 1 << 13, + SPF_NOMIPMAP = 1 << 14, }; class DVisualThinker; diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index a025c87c9..b364128de 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -393,6 +393,7 @@ public: TArray *lightlist; DRotator Angles; + bool nomipmap; // force the sprite to have no mipmaps (ensures tiny sprites in the distance stay crisp) void SplitSprite(HWDrawInfo *di, sector_t * frontsector, bool translucent); void PerformSpriteClipAdjustment(AActor *thing, const DVector2 &thingpos, float spriteheight); diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 9340839b9..3f595d177 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -221,8 +221,10 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetFog(0, 0); } + int clampmode = nomipmap ? CLAMP_XY_NOMIP : CLAMP_XY; + uint32_t spritetype = actor? uint32_t(actor->renderflags & RF_SPRITETYPEMASK) : 0; - if (texture) state.SetMaterial(texture, UF_Sprite, (spritetype == RF_FACESPRITE) ? CTF_Expand : 0, CLAMP_XY, translation, OverrideShader); + if (texture) state.SetMaterial(texture, UF_Sprite, (spritetype == RF_FACESPRITE) ? CTF_Expand : 0, clampmode, translation, OverrideShader); else if (!modelframe) state.EnableTexture(false); //SetColor(lightlevel, rel, Colormap, trans); @@ -771,6 +773,8 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t return; } + nomipmap = (thing->renderflags2 & RF2_NOMIPMAP); + // check renderrequired vs ~r_rendercaps, if anything matches we don't support that feature, // check renderhidden vs r_rendercaps, if anything matches we do support that feature and should hide it. if ((!r_debug_disable_vis_filter && !!(thing->RenderRequired & ~r_renderercaps)) || @@ -1325,6 +1329,7 @@ void HWSprite::ProcessParticle(HWDrawInfo *di, particle_t *particle, sector_t *s actor = nullptr; this->particle = particle; fullbright = particle->flags & SPF_FULLBRIGHT; + nomipmap = particle->flags & SPF_NOMIPMAP; if (di->isFullbrightScene()) { diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 997ab78b1..570dd2a4e 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -384,6 +384,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(RF2, FLIPSPRITEOFFSETX, AActor, renderflags2), DEFINE_FLAG(RF2, FLIPSPRITEOFFSETY, AActor, renderflags2), DEFINE_FLAG(RF2, CAMFOLLOWSPLAYER, AActor, renderflags2), + DEFINE_FLAG(RF2, NOMIPMAP, AActor, renderflags2), // Bounce flags DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags), diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index bd92db9b8..ad77dc8b2 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -718,6 +718,7 @@ enum EParticleFlags SPF_FACECAMERA = 1 << 11, SPF_NOFACECAMERA = 1 << 12, SPF_ROLLCENTER = 1 << 13, + SPF_NOMIPMAP = 1 << 14, SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG }; From 847f34f2c996bdeb2fe98a3f6b661c6598ffce66 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 7 Aug 2024 11:11:46 -0400 Subject: [PATCH 157/414] - fix: check if bombsource exists when exploding a projectile with a XF_NOALLIES flag --- src/playsim/p_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index 53329b96f..a79f912ae 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -6169,7 +6169,7 @@ int P_RadiusAttack(AActor *bombspot, AActor *bombsource, int bombdamage, double continue; //[inkoalawetrust] Don't harm actors friendly to the explosions' source. But do harm the source. - if ((flags & RADF_NOALLIES) && bombsource->IsFriend(thing) && !(thing == bombsource || thing == bombspot)) + if ((flags & RADF_NOALLIES) && bombsource && bombsource->IsFriend(thing) && !(thing == bombsource || thing == bombspot)) continue; if (bombsource && thing != bombsource && bombsource->player && P_ShouldPassThroughPlayer(bombsource, thing)) From a0802d566f485c87a1ee430613d17f4cb34dd282 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 7 Aug 2024 11:11:46 -0400 Subject: [PATCH 158/414] - fix: check if bombsource exists when exploding a projectile with a XF_NOALLIES flag --- src/playsim/p_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index 53329b96f..a79f912ae 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -6169,7 +6169,7 @@ int P_RadiusAttack(AActor *bombspot, AActor *bombsource, int bombdamage, double continue; //[inkoalawetrust] Don't harm actors friendly to the explosions' source. But do harm the source. - if ((flags & RADF_NOALLIES) && bombsource->IsFriend(thing) && !(thing == bombsource || thing == bombspot)) + if ((flags & RADF_NOALLIES) && bombsource && bombsource->IsFriend(thing) && !(thing == bombsource || thing == bombspot)) continue; if (bombsource && thing != bombsource && bombsource->player && P_ShouldPassThroughPlayer(bombsource, thing)) From 7930ee807d04421ba1033a832d1822b112c46ea4 Mon Sep 17 00:00:00 2001 From: Ashley Miller-Jelfs Date: Thu, 8 Aug 2024 15:03:54 +0930 Subject: [PATCH 159/414] Fix Specular not using Material definition for Glossiness and Level --- wadsrc/static/shaders/scene/lightmodel_specular.glsl | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index b889034ab..a9d99c779 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -1,5 +1,5 @@ -vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA) +vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float glossiness, float specularLevel) { vec4 lightpos = lights[i]; vec4 lightspot1 = lights[i+2]; @@ -25,9 +25,6 @@ vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA) if (attenuation <= 0.0) return vec2(0.0); - float glossiness = uSpecularMaterial.x; - float specularLevel = uSpecularMaterial.y; - vec3 halfdir = normalize(viewdir + lightdir); float specAngle = clamp(dot(halfdir, normal), 0.0f, 1.0f); float phExp = glossiness * 4.0f; @@ -51,7 +48,7 @@ vec3 ProcessMaterialLight(Material material, vec3 color) for(int i=lightRange.x; i Date: Thu, 8 Aug 2024 15:13:59 +0930 Subject: [PATCH 160/414] Fix Specular not using Material definition for Glossiness and Level --- wadsrc/static/shaders/glsl/material_specular.fp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/wadsrc/static/shaders/glsl/material_specular.fp b/wadsrc/static/shaders/glsl/material_specular.fp index 12eabd33e..8d264848e 100644 --- a/wadsrc/static/shaders/glsl/material_specular.fp +++ b/wadsrc/static/shaders/glsl/material_specular.fp @@ -1,5 +1,5 @@ -vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA) +vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float glossiness, float specularLevel) { vec4 lightpos = lights[i]; vec4 lightspot1 = lights[i+2]; @@ -25,9 +25,6 @@ vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA) if (attenuation <= 0.0) return vec2(0.0); - float glossiness = uSpecularMaterial.x; - float specularLevel = uSpecularMaterial.y; - vec3 halfdir = normalize(viewdir + lightdir); float specAngle = clamp(dot(halfdir, normal), 0.0f, 1.0f); float phExp = glossiness * 4.0f; @@ -51,7 +48,7 @@ vec3 ProcessMaterialLight(Material material, vec3 color) for(int i=lightRange.x; i Date: Fri, 9 Aug 2024 11:38:21 +0300 Subject: [PATCH 161/414] Support the new Doom + Doom II update --- src/win32/i_steam.cpp | 8 +++- wadsrc_extra/static/iwadinfo.txt | 67 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/win32/i_steam.cpp b/src/win32/i_steam.cpp index 2cf536475..07e7f2a02 100644 --- a/src/win32/i_steam.cpp +++ b/src/win32/i_steam.cpp @@ -183,6 +183,7 @@ static bool QueryPathKey(HKEY key, const wchar_t *keypath, const wchar_t *valnam TArray I_GetGogPaths() { + // TODO Does the 2024 Update affect GOG version? TArray result; FString path; std::wstring gamepath; @@ -292,9 +293,13 @@ TArray I_GetSteamPath() "hexen/base", "hexen deathkings of the dark citadel/base", "ultimate doom/base", + "ultimate doom/base/doom2", // 2024 Update + "ultimate doom/base/tnt", // 2024 Update + "ultimate doom/base/plutonia", // 2024 Update "DOOM 3 BFG Edition/base/wads", "Strife", - "Ultimate Doom/rerelease/DOOM_Data/StreamingAssets", + "Ultimate Doom/rerelease/DOOM_Data/StreamingAssets", // 2019 Unity port (previous-re-release branch in Doom + Doom II app) + "Ultimate Doom/rerelease", // 2024 KEX Port "Doom 2/rerelease/DOOM II_Data/StreamingAssets", "Doom 2/finaldoombase", "Master Levels of Doom/doom2" @@ -350,6 +355,7 @@ TArray I_GetBethesdaPath() TArray result; static const char* const bethesda_dirs[] = { + // TODO Does the 2024 Update affect Bethesda Launcher? "DOOM_Classic_2019/base", "DOOM_Classic_2019/rerelease/DOOM_Data/StreamingAssets", "DOOM_II_Classic_2019/base", diff --git a/wadsrc_extra/static/iwadinfo.txt b/wadsrc_extra/static/iwadinfo.txt index c52f899bd..d8149623c 100644 --- a/wadsrc_extra/static/iwadinfo.txt +++ b/wadsrc_extra/static/iwadinfo.txt @@ -336,6 +336,24 @@ IWad IgnoreTitlePatches = 1 } +IWad +{ + Name = "DOOM: KEX Edition" + Autoname = "doom.id.doom1.kex" + Game = "Doom" + Config = "Doom" + IWADName = "doom.wad", 2 + Mapinfo = "mapinfo/ultdoom.txt" + Compatibility = "Shorttex", "nosectionmerge" + MustContain = "E1M1","E2M1","E2M2","E2M3","E2M4","E2M5","E2M6","E2M7","E2M8","E2M9", + "E3M1","E3M2","E3M3","E3M4","E3M5","E3M6","E3M7","E3M8","E3M9", + "DPHOOF","BFGGA0","HEADA1","CYBRA1","SPIDA1D1", "E4M2", + "DMENUPIC", "GAMECONF" + Load = "extras.wad" + BannerColors = "00 7c 00", "a8 a8 a8" + IgnoreTitlePatches = 1 +} + IWad { Name = "DOOM: Unity Edition" @@ -443,6 +461,21 @@ IWad IgnoreTitlePatches = 1 } +IWad +{ + Name = "Final Doom: TNT - Evilution: KEX Edition" + Autoname = "doom.id.doom2.tnt.kex" + Game = "Doom" + Config = "Doom" + IWADName = "tnt.wad" + Mapinfo = "mapinfo/tnt.txt" + Compatibility = "Shorttex", "Stairs" + MustContain = "MAP01", "REDTNT2", "GAMECONF" + BannerColors = "a8 00 00", "a8 a8 a8" + Load = "extras.wad" + IgnoreTitlePatches = 1 +} + IWad { Name = "Final Doom: TNT - Evilution" @@ -471,6 +504,21 @@ IWad IgnoreTitlePatches = 1 } +IWad +{ + Name = "Final Doom: Plutonia Experiment: KEX Edition" + Autoname = "doom.id.doom2.plutonia.kex" + Game = "Doom" + Config = "Doom" + IWADName = "plutonia.wad" + Mapinfo = "mapinfo/plutonia.txt" + Compatibility = "Shorttex" + MustContain = "MAP01", "CAMO1", "GAMECONF" + BannerColors = "a8 00 00", "a8 a8 a8" + Load = "extras.wad" + IgnoreTitlePatches = 1 +} + IWad { Name = "Final Doom: Plutonia Experiment" @@ -500,6 +548,21 @@ IWad IgnoreTitlePatches = 1 } +IWad +{ + Name = "DOOM 2: KEX Edition" + Autoname = "doom.id.doom2.kex" + Game = "Doom" + Config = "Doom" + IWADName = "doom2.wad", 2 + Mapinfo = "mapinfo/doom2.txt" + Compatibility = "Shorttex", "nosectionmerge" + MustContain = "MAP01", "DMENUPIC", "GAMECONF" + BannerColors = "00 7c 00", "a8 a8 a8" + IgnoreTitlePatches = 1 + Load = "extras.wad" +} + IWad { Name = "DOOM 2: Unity Edition" @@ -621,12 +684,16 @@ Order // Order in the IWAD selection box "DOOM 2: BFG Edition" "DOOM: XBox Edition" "DOOM 2: XBox Edition" + "DOOM: KEX Edition" "DOOM: Unity Edition" + "DOOM 2: KEX Edition" "DOOM 2: Unity Edition" "Final Doom: Plutonia Experiment" "Final Doom: Plutonia Experiment: Unity Edition" + "Final Doom: Plutonia Experiment: KEX Edition" "Final Doom: TNT - Evilution" "Final Doom: TNT - Evilution: Unity Edition" + "Final Doom: TNT - Evilution: KEX Edition" "Freedoom: Phase 1" "Freedoom: Phase 2" "FreeDM" From 01e7859e1f5224d0c9abbc179d2c87bee060aa3f Mon Sep 17 00:00:00 2001 From: Xaser Acheron Date: Fri, 9 Aug 2024 06:57:26 -0500 Subject: [PATCH 162/414] fix MBF21 A_RadiusDamage crash/broken 'distance' arg --- wadsrc/static/zscript/actors/attacks.zs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/actors/attacks.zs b/wadsrc/static/zscript/actors/attacks.zs index 188a9c064..db9da6f35 100644 --- a/wadsrc/static/zscript/actors/attacks.zs +++ b/wadsrc/static/zscript/actors/attacks.zs @@ -626,7 +626,7 @@ extend class Actor } deprecated("2.3", "For Dehacked use only") - void A_RadiusDamage(int dam, double dist) + void A_RadiusDamage(int dam, int dist) { A_Explode(dam, dist); } From 1655f7e3b747ca37857f907631177061bd753799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 9 Aug 2024 17:55:44 -0300 Subject: [PATCH 163/414] Allow XInput joysticks to work while the game is unfocused --- src/common/engine/m_joy.cpp | 30 +++++++++++++--- src/common/engine/m_joy.h | 4 +++ src/common/menu/joystickmenu.cpp | 20 +++++++++++ .../platform/posix/cocoa/i_joystick.cpp | 4 +++ src/common/platform/posix/sdl/i_joystick.cpp | 4 +++ src/common/platform/win32/i_dijoy.cpp | 4 +++ src/common/platform/win32/i_rawps2.cpp | 4 +++ src/common/platform/win32/i_xinput.cpp | 12 ++++++- .../zscript/engine/ui/menu/joystickmenu.zs | 34 +++++++++++++++++++ wadsrc/static/zscript/engine/ui/menu/menu.zs | 4 +++ 10 files changed, 114 insertions(+), 6 deletions(-) diff --git a/src/common/engine/m_joy.cpp b/src/common/engine/m_joy.cpp index a2ab71103..1e4b2f3e0 100644 --- a/src/common/engine/m_joy.cpp +++ b/src/common/engine/m_joy.cpp @@ -120,16 +120,30 @@ bool M_LoadJoystickConfig(IJoystickConfig *joy) { return false; } + + assert(GameConfig); + value = GameConfig->GetValueForKey("Enabled"); - if (value != NULL) + if (value) { joy->SetEnabled((bool)atoi(value)); } + + if(joy->AllowsEnabledInBackground()) + { + value = GameConfig->GetValueForKey("EnabledInBackground"); + if (value) + { + joy->SetEnabledInBackground((bool)atoi(value)); + } + } + value = GameConfig->GetValueForKey("Sensitivity"); - if (value != NULL) + if (value) { joy->SetSensitivity((float)atof(value)); } + numaxes = joy->GetNumAxes(); for (int i = 0; i < numaxes; ++i) { @@ -137,21 +151,21 @@ bool M_LoadJoystickConfig(IJoystickConfig *joy) mysnprintf(key + axislen, countof(key) - axislen, "deadzone"); value = GameConfig->GetValueForKey(key); - if (value != NULL) + if (value) { joy->SetAxisDeadZone(i, (float)atof(value)); } mysnprintf(key + axislen, countof(key) - axislen, "scale"); value = GameConfig->GetValueForKey(key); - if (value != NULL) + if (value) { joy->SetAxisScale(i, (float)atof(value)); } mysnprintf(key + axislen, countof(key) - axislen, "map"); value = GameConfig->GetValueForKey(key); - if (value != NULL) + if (value) { EJoyAxis gameaxis = (EJoyAxis)atoi(value); if (gameaxis < JOYAXIS_None || gameaxis >= NUM_JOYAXIS) @@ -185,6 +199,12 @@ void M_SaveJoystickConfig(IJoystickConfig *joy) { GameConfig->SetValueForKey("Enabled", "0"); } + + if (!joy->AllowsEnabledInBackground() && joy->GetEnabledInBackground()) + { + GameConfig->SetValueForKey("EnabledInBackground", "1"); + } + if (!joy->IsSensitivityDefault()) { mysnprintf(value, countof(value), "%g", joy->GetSensitivity()); diff --git a/src/common/engine/m_joy.h b/src/common/engine/m_joy.h index 088d5bd6d..e8d9d3b13 100644 --- a/src/common/engine/m_joy.h +++ b/src/common/engine/m_joy.h @@ -39,6 +39,10 @@ struct IJoystickConfig virtual bool GetEnabled() = 0; virtual void SetEnabled(bool enabled) = 0; + virtual bool AllowsEnabledInBackground() = 0; + virtual bool GetEnabledInBackground() = 0; + virtual void SetEnabledInBackground(bool enabled) = 0; + // Used by the saver to not save properties that are at their defaults. virtual bool IsSensitivityDefault() = 0; virtual bool IsAxisDeadZoneDefault(int axis) = 0; diff --git a/src/common/menu/joystickmenu.cpp b/src/common/menu/joystickmenu.cpp index ae152b5f0..3d3e881b1 100644 --- a/src/common/menu/joystickmenu.cpp +++ b/src/common/menu/joystickmenu.cpp @@ -133,6 +133,26 @@ DEFINE_ACTION_FUNCTION(IJoystickConfig, SetEnabled) return 0; } +DEFINE_ACTION_FUNCTION(IJoystickConfig, AllowsEnabledInBackground) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + ACTION_RETURN_BOOL(self->AllowsEnabledInBackground()); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, GetEnabledInBackground) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + ACTION_RETURN_BOOL(self->GetEnabledInBackground()); +} + +DEFINE_ACTION_FUNCTION(IJoystickConfig, SetEnabledInBackground) +{ + PARAM_SELF_STRUCT_PROLOGUE(IJoystickConfig); + PARAM_BOOL(enabled); + self->SetEnabledInBackground(enabled); + return 0; +} + void UpdateJoystickMenu(IJoystickConfig *selected) { diff --git a/src/common/platform/posix/cocoa/i_joystick.cpp b/src/common/platform/posix/cocoa/i_joystick.cpp index a2a27eaff..44d1fb961 100644 --- a/src/common/platform/posix/cocoa/i_joystick.cpp +++ b/src/common/platform/posix/cocoa/i_joystick.cpp @@ -107,6 +107,10 @@ public: virtual bool GetEnabled(); virtual void SetEnabled(bool enabled); + bool AllowsEnabledInBackground() { return false; } + bool GetEnabledInBackground() { return false; } + void SetEnabledInBackground(bool enabled) {} + virtual void SetDefaultConfig(); virtual FString GetIdentifier(); diff --git a/src/common/platform/posix/sdl/i_joystick.cpp b/src/common/platform/posix/sdl/i_joystick.cpp index a7eb59568..42837ecba 100644 --- a/src/common/platform/posix/sdl/i_joystick.cpp +++ b/src/common/platform/posix/sdl/i_joystick.cpp @@ -167,6 +167,10 @@ public: Enabled = enabled; } + bool AllowsEnabledInBackground() { return false; } + bool GetEnabledInBackground() { return false; } + void SetEnabledInBackground(bool enabled) {} + FString GetIdentifier() { char id[16]; diff --git a/src/common/platform/win32/i_dijoy.cpp b/src/common/platform/win32/i_dijoy.cpp index 492cbda14..33c4574c9 100644 --- a/src/common/platform/win32/i_dijoy.cpp +++ b/src/common/platform/win32/i_dijoy.cpp @@ -183,6 +183,10 @@ public: bool GetEnabled(); void SetEnabled(bool enabled); + bool AllowsEnabledInBackground() { return false; } + bool GetEnabledInBackground() { return false; } + void SetEnabledInBackground(bool enabled) {} + void SetDefaultConfig(); FString GetIdentifier(); diff --git a/src/common/platform/win32/i_rawps2.cpp b/src/common/platform/win32/i_rawps2.cpp index d406d61ea..2f89739bd 100644 --- a/src/common/platform/win32/i_rawps2.cpp +++ b/src/common/platform/win32/i_rawps2.cpp @@ -117,6 +117,10 @@ public: bool GetEnabled(); void SetEnabled(bool enabled); + bool AllowsEnabledInBackground() { return false; } + bool GetEnabledInBackground() { return false; } + void SetEnabledInBackground(bool enabled) {} + void SetDefaultConfig(); FString GetIdentifier(); diff --git a/src/common/platform/win32/i_xinput.cpp b/src/common/platform/win32/i_xinput.cpp index d1dc4364d..0f3c19237 100644 --- a/src/common/platform/win32/i_xinput.cpp +++ b/src/common/platform/win32/i_xinput.cpp @@ -65,6 +65,8 @@ #endif #endif +extern bool AppActive; + // TYPES ------------------------------------------------------------------- typedef DWORD (WINAPI *XInputGetStateType)(DWORD index, XINPUT_STATE *state); @@ -105,6 +107,10 @@ public: bool GetEnabled(); void SetEnabled(bool enabled); + bool AllowsEnabledInBackground() { return true; } + bool GetEnabledInBackground() { return EnabledInBackground; } + void SetEnabledInBackground(bool enabled) { EnabledInBackground = enabled; } + void SetDefaultConfig(); FString GetIdentifier(); @@ -142,6 +148,7 @@ protected: int LastButtons; bool Connected; bool Enabled; + bool EnabledInBackground; void Attached(); void Detached(); @@ -744,7 +751,10 @@ void FXInputManager::ProcessInput() { for (int i = 0; i < XUSER_MAX_COUNT; ++i) { - Devices[i]->ProcessInput(); + if(AppActive || Devices[i]->GetEnabledInBackground()) + { + Devices[i]->ProcessInput(); + } } } diff --git a/wadsrc/static/zscript/engine/ui/menu/joystickmenu.zs b/wadsrc/static/zscript/engine/ui/menu/joystickmenu.zs index 206a31098..02669c1a3 100644 --- a/wadsrc/static/zscript/engine/ui/menu/joystickmenu.zs +++ b/wadsrc/static/zscript/engine/ui/menu/joystickmenu.zs @@ -243,6 +243,29 @@ class OptionMenuJoyEnable : OptionMenuItemOptionBase } } + +class OptionMenuJoyEnableInBackground : OptionMenuItemOptionBase +{ + JoystickConfig mJoy; + + OptionMenuJoyEnableInBackground Init(String label, JoystickConfig joy) + { + Super.Init(label,"none","YesNo",null,0); + mJoy = joy; + return self; + } + + override int GetSelection() + { + return mJoy.GetEnabledInBackground() ? 1 : 0; + } + + override void SetSelection(int Selection) + { + mJoy.SetEnabledInBackground(Selection); + } +} + class OptionMenuItemJoyConfigMenu : OptionMenuItemSubmenu { JoystickConfig mJoy; @@ -279,12 +302,23 @@ class OptionMenuItemJoyConfigMenu : OptionMenuItemSubmenu } else { + /* it = new("OptionMenuItemStaticText").Init(joy.GetName(), false); + opt.mItems.Push(it); + it = new("OptionMenuItemStaticText").Init("", false); + opt.mItems.Push(it); + */ it = new("OptionMenuJoyEnable").Init("$JOYMNU_JOYENABLE", joy); opt.mItems.Push(it); + if(joy.AllowsEnabledInBackground()) + { + it = new("OptionMenuJoyEnableInBackground").Init("$JOYMNU_JOYENABLEINBACKGROUND", joy); + opt.mItems.Push(it); + } + it = new("OptionMenuSliderJoySensitivity").Init("$JOYMNU_OVRSENS", 0, 2, 0.1, 3, joy); opt.mItems.Push(it); it = new("OptionMenuItemStaticText").Init(" ", false); diff --git a/wadsrc/static/zscript/engine/ui/menu/menu.zs b/wadsrc/static/zscript/engine/ui/menu/menu.zs index 154eee82a..7a0ef2036 100644 --- a/wadsrc/static/zscript/engine/ui/menu/menu.zs +++ b/wadsrc/static/zscript/engine/ui/menu/menu.zs @@ -87,6 +87,10 @@ struct JoystickConfig native version("2.4") native bool GetEnabled(); native void SetEnabled(bool enabled); + native bool AllowsEnabledInBackground(); + native bool GetEnabledInBackground(); + native void SetEnabledInBackground(bool enabled); + } class Menu : Object native ui version("2.4") From b044baf850eeb99f06835a223804e1d73994dc04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 9 Aug 2024 17:56:03 -0300 Subject: [PATCH 164/414] don't change priority to idle if i_pauseinbackground is false --- src/common/platform/win32/i_input.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/common/platform/win32/i_input.cpp b/src/common/platform/win32/i_input.cpp index cb945d61e..45a74fe0c 100644 --- a/src/common/platform/win32/i_input.cpp +++ b/src/common/platform/win32/i_input.cpp @@ -124,6 +124,9 @@ int BlockMouseMove; static bool EventHandlerResultForNativeMouse; +EXTERN_CVAR(Bool, i_pauseinbackground); + + CVAR (Bool, k_allowfullscreentoggle, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) static void I_CheckGUICapture () @@ -481,8 +484,8 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_ACTIVATEAPP: - AppActive = wParam == TRUE; - if (wParam) + AppActive = (wParam == TRUE); + if (wParam || !i_pauseinbackground) { SetPriorityClass (GetCurrentProcess (), INGAME_PRIORITY_CLASS); } From f1b9e6830591e4ff7e3742cdddc485ae61cb26b4 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 11 Aug 2024 01:15:44 +0200 Subject: [PATCH 165/414] Add more dynamic update code to level mesh --- .../rendering/hwrenderer/data/hw_levelmesh.h | 13 +- .../hwrenderer/data/hw_levelmeshsurface.h | 2 - .../hwrenderer/data/hw_lightmaptile.h | 2 + src/g_levellocals.h | 2 +- src/gamedata/r_defs.h | 4 +- src/maploader/maploader.cpp | 11 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 121 +++++++++++------- src/rendering/hwrenderer/doom_levelmesh.h | 25 ++-- src/rendering/hwrenderer/hw_vertexbuilder.cpp | 12 +- src/rendering/hwrenderer/scene/hw_decal.cpp | 4 +- src/rendering/hwrenderer/scene/hw_drawinfo.h | 10 +- .../hwrenderer/scene/hw_drawstructs.h | 2 +- src/rendering/hwrenderer/scene/hw_flats.cpp | 4 +- src/rendering/hwrenderer/scene/hw_walls.cpp | 34 ++--- .../hwrenderer/scene/hw_walls_vertex.cpp | 4 +- 15 files changed, 148 insertions(+), 102 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index a1569c8d7..16b424bb0 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -77,6 +77,7 @@ public: info.Vertices = &Mesh.Vertices[info.VertexStart]; info.UniformIndexes = &Mesh.UniformIndexes[info.VertexStart]; info.Indexes = &Mesh.Indexes[info.IndexStart]; + // To do: mark range as dirty return info; } @@ -89,6 +90,7 @@ public: Mesh.Materials.Resize(info.Start + count); info.Uniforms = &Mesh.Uniforms[info.Start]; info.Materials = &Mesh.Materials[info.Start]; + // To do: mark range as dirty return info; } @@ -96,10 +98,19 @@ public: { for (int i = 0; i < indexCount; i++) Mesh.Indexes[indexStart + i] = 0; + // To do: add to a free list + // To do: mark range as dirty } void FreeUniforms(int start, int count) { + // To do: add to a free list + } + + void FreeSurface(unsigned int surfaceIndex) + { + // To do: remove the surface from the surface tile, if attached + // To do: add to a free list } struct @@ -121,7 +132,7 @@ public: TArray SurfaceIndexes; int DynamicIndexStart = 0; - // Above data must not be resized beyond these limits as that's the size of the GPU buffers) + // Above data must not be resized beyond these limits as that's the size of the GPU buffers int MaxVertices = 0; int MaxIndexes = 0; int MaxSurfaces = 0; diff --git a/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h b/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h index 5dae14107..898237da3 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h @@ -24,8 +24,6 @@ struct LevelMeshSurface FVector4 Plane = FVector4(0.0f, 0.0f, 1.0f, 0.0f); int LightmapTileIndex = -1; - bool AlwaysUpdate = false; - FGameTexture* Texture = nullptr; float Alpha = 1.0; diff --git a/src/common/rendering/hwrenderer/data/hw_lightmaptile.h b/src/common/rendering/hwrenderer/data/hw_lightmaptile.h index dd41928f6..2793252ac 100644 --- a/src/common/rendering/hwrenderer/data/hw_lightmaptile.h +++ b/src/common/rendering/hwrenderer/data/hw_lightmaptile.h @@ -54,6 +54,8 @@ struct LightmapTile // True if the tile needs to be rendered into the lightmap texture before it can be used bool NeedsUpdate = true; + bool AlwaysUpdate = false; + FVector2 ToUV(const FVector3& vert) const { FVector3 localPos = vert - Transform.TranslateWorldToLocal; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 2a9c41af6..b54a91ea0 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -467,7 +467,7 @@ public: // Lightmaps bool lightmaps = false; - TArray Surfaces; + TArray LightmapTiles; FVector3 SunDirection; FVector3 SunColor; uint16_t LightmapSampleDistance; diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index efdbd4959..04e32c748 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -1257,7 +1257,7 @@ struct side_t uint16_t Flags; int UDMFIndex; // needed to access custom UDMF fields which are stored in loading order. FLightNode * lighthead; // all dynamic lights that may affect this wall - TArrayView surface; // all mesh surfaces belonging to this sidedef + TArrayView LightmapTiles; // all lightmap tiles belonging to this sidedef seg_t **segs; // all segs belonging to this sidedef in ascending order. Used for precise rendering int numsegs; int sidenum; @@ -1674,7 +1674,7 @@ struct subsector_t // 2: has one-sided walls FPortalCoverage portalcoverage[2]; TArray sprites; - TArrayView surface[2]; // all mesh surfaces belonging to this subsector + TArrayView LightmapTiles[2]; // all lightmap tiles belonging to this subsector }; diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index a62bf1c30..51faf97a1 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -2989,23 +2989,24 @@ void MapLoader::InitLevelMesh(MapData* map) for (unsigned int i = 0; i < Level->subsectors.Size(); i++) allSurfaces += 2 + Level->subsectors[i].sector->e->XFloor.ffloors.Size() * 2; - Level->Surfaces.Resize(allSurfaces); - memset(Level->Surfaces.Data(), 0, sizeof(DoomLevelMeshSurface*) * allSurfaces); + Level->LightmapTiles.Resize(allSurfaces); + for (int& value : Level->LightmapTiles) + value = -1; unsigned int offset = 0; for (unsigned int i = 0; i < Level->sides.Size(); i++) { auto& side = Level->sides[i]; int count = 4 + side.sector->e->XFloor.ffloors.Size(); - side.surface = TArrayView(&Level->Surfaces[offset], count); + side.LightmapTiles = TArrayView(&Level->LightmapTiles[offset], count); offset += count; } for (unsigned int i = 0; i < Level->subsectors.Size(); i++) { auto& subsector = Level->subsectors[i]; unsigned int count = 1 + subsector.sector->e->XFloor.ffloors.Size(); - subsector.surface[0] = TArrayView(&Level->Surfaces[offset], count); - subsector.surface[1] = TArrayView(&Level->Surfaces[offset + count], count); + subsector.LightmapTiles[0] = TArrayView(&Level->LightmapTiles[offset], count); + subsector.LightmapTiles[1] = TArrayView(&Level->LightmapTiles[offset + count], count); offset += count * 2; } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index a1e4fc0db..a21576a5c 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -95,8 +95,8 @@ void PrintSurfaceInfo(const DoomLevelMeshSurface* surface) Printf(" Pixels: %dx%d (area: %d)\n", tile->AtlasLocation.Width, tile->AtlasLocation.Height, tile->AtlasLocation.Area()); Printf(" Sample dimension: %d\n", tile->SampleDimension); Printf(" Needs update?: %d\n", tile->NeedsUpdate); + Printf(" Always update?: %d\n", tile->AlwaysUpdate); } - Printf(" Always update?: %d\n", surface->AlwaysUpdate); Printf(" Sector group: %d\n", surface->SectorGroup); Printf(" Texture: '%s'\n", gameTexture ? gameTexture->GetName().GetChars() : ""); Printf(" Alpha: %f\n", surface->Alpha); @@ -345,8 +345,44 @@ void DoomLevelMesh::CreateSurfaces(FLevelLocals& doomMap) } } +void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) +{ + if (sideIndex < 0 || sideIndex >= Sides.Size()) + return; + + int surf = Sides[sideIndex].FirstSurface; + while (surf != -1) + { + unsigned int next = Surfaces[surf].NextSurface; + FreeSurface(surf); + surf = next; + } + Sides[sideIndex].FirstSurface = -1; + + // To do: call FreeGeometry and FreeUniforms +} + +void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) +{ + if (sectorIndex < 0 || sectorIndex >= Flats.Size()) + return; + + int surf = Flats[sectorIndex].FirstSurface; + while (surf != -1) + { + unsigned int next = Surfaces[surf].NextSurface; + FreeSurface(surf - 1); + surf = next; + } + Flats[sectorIndex].FirstSurface = -1; + + // To do: call FreeGeometry and FreeUniforms +} + void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) { + FreeSide(doomMap, sideIndex); + side_t* side = &doomMap.sides[sideIndex]; seg_t* seg = side->segs[0]; if (!seg) @@ -369,20 +405,20 @@ void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) state.EnableTexture(true); state.EnableBrightmap(true); state.AlphaFunc(Alpha_GEqual, 0.f); - CreateWallSurface(side, disp, state, result.list, false, true); + CreateWallSurface(side, disp, state, result.list, false, true, sideIndex); for (HWWall& portal : result.portals) { WallPortals.Push(portal); } - CreateWallSurface(side, disp, state, result.portals, true, false); + CreateWallSurface(side, disp, state, result.portals, true, false, sideIndex); /* // final pass: translucent stuff state.AlphaFunc(Alpha_GEqual, gl_mask_sprite_threshold); state.SetRenderStyle(STYLE_Translucent); - CreateWallSurface(side, disp, state, result.translucent, false, true); + CreateWallSurface(side, disp, state, result.translucent, false, true, sideIndex); state.AlphaFunc(Alpha_GEqual, 0.f); state.SetRenderStyle(STYLE_Normal); */ @@ -390,6 +426,8 @@ void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) void DoomLevelMesh::UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) { + FreeSide(doomMap, sectorIndex); + sector_t* sector = &doomMap.sectors[sectorIndex]; for (FSection& section : doomMap.sections.SectionsForSector(sectorIndex)) { @@ -405,23 +443,23 @@ void DoomLevelMesh::UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) state.ClearDepthBias(); state.EnableTexture(true); state.EnableBrightmap(true); - CreateFlatSurface(disp, state, result.list, false, false); + CreateFlatSurface(disp, state, result.list, false, false, sectorIndex); - CreateFlatSurface(disp, state, result.portals, true, false); + CreateFlatSurface(disp, state, result.portals, true, false, sectorIndex); // final pass: translucent stuff state.AlphaFunc(Alpha_GEqual, gl_mask_sprite_threshold); state.SetRenderStyle(STYLE_Translucent); - CreateFlatSurface(disp, state, result.translucentborder, false, true); + CreateFlatSurface(disp, state, result.translucentborder, false, true, sectorIndex); state.SetDepthMask(false); - CreateFlatSurface(disp, state, result.translucent, false, true); + CreateFlatSurface(disp, state, result.translucent, false, true, sectorIndex); state.AlphaFunc(Alpha_GEqual, 0.f); state.SetDepthMask(true); state.SetRenderStyle(STYLE_Normal); } } -void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent) +void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent, unsigned int sideIndex) { for (HWWall& wallpart : list) { @@ -534,7 +572,6 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh surf.ControlSector = wallpart.LevelMeshInfo.ControlSector; surf.TypeIndex = side->Index(); surf.Side = side; - surf.AlwaysUpdate = !!(side->sector->Flags & SECF_LM_DYNAMIC); surf.SectorGroup = sectorGroup[side->sector->Index()]; surf.Alpha = float(side->linedef->alpha); surf.MeshLocation.StartVertIndex = ginfo.VertexStart; @@ -547,12 +584,19 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh surf.PortalIndex = isPortal ? linePortals[side->linedef->Index()] : 0; surf.IsSky = isPortal ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; surf.Bounds = GetBoundsFromSurface(surf); - surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(surf, sampleDimension) : -1; + surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(surf, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; + + if (sideIndex < Sides.Size()) + { + surf.NextSurface = Sides[sideIndex].FirstSurface; + Sides[sideIndex].FirstSurface = Surfaces.Size(); + } + Surfaces.Push(surf); } } -int DoomLevelMesh::AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t sampleDimension) +int DoomLevelMesh::AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate) { if (surf.IsSky) return -1; @@ -574,6 +618,7 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t s tile.Bounds.max.X = std::max(tile.Bounds.max.X, surf.Bounds.max.X); tile.Bounds.max.Y = std::max(tile.Bounds.max.Y, surf.Bounds.max.Y); tile.Bounds.max.Z = std::max(tile.Bounds.max.Z, surf.Bounds.max.Z); + tile.AlwaysUpdate = tile.AlwaysUpdate || alwaysUpdate; return index; } @@ -586,6 +631,7 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t s tile.Bounds = surf.Bounds; tile.Plane = surf.Plane; tile.SampleDimension = GetSampleDimension(surf, sampleDimension); + tile.AlwaysUpdate = alwaysUpdate; LightmapTiles.Push(tile); bindings[binding] = index; @@ -614,7 +660,7 @@ int DoomLevelMesh::GetSampleDimension(const DoomLevelMeshSurface& surf, uint16_t return sampleDimension; } -void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent) +void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent, unsigned int sectorIndex) { for (HWFlat& flatpart : list) { @@ -702,7 +748,6 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state DoomLevelMeshSurface surf; surf.Type = flatpart.ceiling ? ST_CEILING : ST_FLOOR; surf.ControlSector = flatpart.controlsector ? flatpart.controlsector->model : nullptr; - surf.AlwaysUpdate = !!(flatpart.sector->Flags & SECF_LM_DYNAMIC); surf.SectorGroup = sectorGroup[flatpart.sector->Index()]; surf.Alpha = flatpart.alpha; surf.Texture = flatpart.texture; @@ -775,37 +820,19 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state surf.MeshLocation.NumVerts = sub->numlines; surf.MeshLocation.NumElements = (sub->numlines - 2) * 3; surf.Bounds = GetBoundsFromSurface(surf); - surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(surf, sampleDimension) : -1; + surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(surf, sampleDimension, !!(flatpart.sector->Flags & SECF_LM_DYNAMIC)) : -1; + + if (sectorIndex < Flats.Size()) + { + surf.NextSurface = Flats[sectorIndex].FirstSurface; + Flats[sectorIndex].FirstSurface = Surfaces.Size(); + } + Surfaces.Push(surf); } } } -#if 0 -void DoomLevelMesh::CreateDynamicSurfaces(FLevelLocals& doomMap) -{ - // Look for polyobjects - for (unsigned int i = 0; i < doomMap.lines.Size(); i++) - { - side_t* side = doomMap.lines[i].sidedef[0]; - bool isPolyLine = !!(side->Flags & WALLF_POLYOBJ); - if (!isPolyLine) - continue; - - // Make sure we have a surface array on the polyobj sidedef - if (!side->surface) - { - auto array = std::make_unique(4); - memset(array.get(), 0, sizeof(DoomLevelMeshSurface*)); - side->surface = array.get(); - PolyLMSurfaces.Push(std::move(array)); - } - - CreateSideSurfaces(doomMap, side); - } -} -#endif - void DoomLevelMesh::SortIndexes() { // Order surfaces by pipeline @@ -879,7 +906,7 @@ void DoomLevelMesh::SetSubsectorLightmap(DoomLevelMeshSurface* surface) if (!surface->ControlSector) { int index = surface->Type == ST_CEILING ? 1 : 0; - surface->Subsector->surface[index][0] = surface; + surface->Subsector->LightmapTiles[index][0] = surface->LightmapTileIndex; } else { @@ -889,7 +916,7 @@ void DoomLevelMesh::SetSubsectorLightmap(DoomLevelMeshSurface* surface) { if (ffloors[i]->model == surface->ControlSector) { - surface->Subsector->surface[index][i + 1] = surface; + surface->Subsector->LightmapTiles[index][i + 1] = surface->LightmapTileIndex; } } } @@ -901,16 +928,16 @@ void DoomLevelMesh::SetSideLightmap(DoomLevelMeshSurface* surface) { if (surface->Type == ST_UPPERSIDE) { - surface->Side->surface[0] = surface; + surface->Side->LightmapTiles[0] = surface->LightmapTileIndex; } else if (surface->Type == ST_MIDDLESIDE) { - surface->Side->surface[1] = surface; - surface->Side->surface[2] = surface; + surface->Side->LightmapTiles[1] = surface->LightmapTileIndex; + surface->Side->LightmapTiles[2] = surface->LightmapTileIndex; } else if (surface->Type == ST_LOWERSIDE) { - surface->Side->surface[3] = surface; + surface->Side->LightmapTiles[3] = surface->LightmapTileIndex; } } else @@ -921,7 +948,7 @@ void DoomLevelMesh::SetSideLightmap(DoomLevelMeshSurface* surface) { if (ffloors[i]->model == surface->ControlSector) { - backside->surface[4 + i] = surface; + backside->LightmapTiles[4 + i] = surface->LightmapTileIndex; } } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 9b407f7b9..75eba0693 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -27,18 +27,18 @@ struct DoomLevelMeshSurface : public LevelMeshSurface sector_t* ControlSector = nullptr; int PipelineID = 0; + + int NextSurface = -1; }; -struct SideSurfaceRange +struct SideSurfaceBlock { - int StartSurface = 0; - int SurfaceCount = 0; + int FirstSurface = -1; }; -struct FlatSurfaceRange +struct FlatSurfaceBlock { - int StartSurface = 0; - int SurfaceCount = 0; + int FirstSurface = -1; }; class DoomLevelMesh : public LevelMesh @@ -72,19 +72,22 @@ private: void UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex); void UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex); + void FreeSide(FLevelLocals& doomMap, unsigned int sideIndex); + void FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex); + void SetSubsectorLightmap(DoomLevelMeshSurface* surface); void SetSideLightmap(DoomLevelMeshSurface* surface); void SortIndexes(); - void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent); - void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent); + void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent, unsigned int sectorIndex); + void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent, unsigned int sectorIndex); void LinkSurfaces(FLevelLocals& doomMap); BBox GetBoundsFromSurface(const LevelMeshSurface& surface) const; - int AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t sampleDimension); + int AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate); int GetSampleDimension(const DoomLevelMeshSurface& surf, uint16_t sampleDimension); void CreatePortals(FLevelLocals& doomMap); @@ -92,8 +95,8 @@ private: int GetLightIndex(FDynamicLight* light, int portalgroup); - TArray Sides; - TArray Flats; + TArray Sides; + TArray Flats; std::map bindings; MeshBuilder state; }; diff --git a/src/rendering/hwrenderer/hw_vertexbuilder.cpp b/src/rendering/hwrenderer/hw_vertexbuilder.cpp index 2e64a07ed..8db2dacee 100644 --- a/src/rendering/hwrenderer/hw_vertexbuilder.cpp +++ b/src/rendering/hwrenderer/hw_vertexbuilder.cpp @@ -243,13 +243,17 @@ static int CreateIndexedSectorVerticesLM(sector_t* sec, const secplane_t& plane, for(auto& sub : section.subsectors) { // vertices - DoomLevelMeshSurface* lightmap = sub->surface[h].Size() > lightmapIndex ? sub->surface[h][lightmapIndex] : nullptr; - if (lightmap && lightmap->Type != ST_NONE) // surface may be missing if the subsector is degenerate triangle + int lightmap = sub->LightmapTiles[h].Size() > lightmapIndex ? sub->LightmapTiles[h][lightmapIndex] : -1; + if (lightmap >= 0) // tile may be missing if the subsector is degenerate triangle { - FFlatVertex* luvs = &level.levelMesh->Mesh.Vertices[lightmap->MeshLocation.StartVertIndex]; + const auto& tile = level.levelMesh->LightmapTiles[lightmap]; + float textureSize = (float)level.levelMesh->LMTextureSize; + float lindex = (float)tile.AtlasLocation.ArrayIndex; for (unsigned int j = 0, end = sub->numlines; j < end; j++) { - SetFlatVertex(vbo_shadowdata[vi + pos], sub->firstline[j].v1, plane, luvs[end - 1 - j].lu, luvs[end - 1 - j].lv, luvs[end - 1 - j].lindex); + vertex_t* vt = sub->firstline[j].v1; + FVector2 luv = tile.ToUV(FVector3((float)vt->fX(), (float)vt->fY(), (float)plane.ZatPoint(vt)), textureSize); + SetFlatVertex(vbo_shadowdata[vi + pos], vt, plane, luv.X, luv.Y, lindex); vbo_shadowdata[vi + pos].z += diff; pos++; } diff --git a/src/rendering/hwrenderer/scene/hw_decal.cpp b/src/rendering/hwrenderer/scene/hw_decal.cpp index cc0dd456c..944ce6c8b 100644 --- a/src/rendering/hwrenderer/scene/hw_decal.cpp +++ b/src/rendering/hwrenderer/scene/hw_decal.cpp @@ -422,9 +422,9 @@ void HWWall::ProcessDecal(HWDrawInfo *di, FRenderState& state, DBaseDecal *decal auto verts = state.AllocVertices(4); gldecal->vertindex = verts.second; - if (surface && surface->LightmapTileIndex >= 0) + if (lightmaptile >= 0) { - LightmapTile* tile = &di->Level->levelMesh->LightmapTiles[surface->LightmapTileIndex]; + LightmapTile* tile = &di->Level->levelMesh->LightmapTiles[lightmaptile]; float lightmapindex = (float)tile->AtlasLocation.ArrayIndex; for (i = 0; i < 4; i++) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index e67bb77a6..900104345 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -225,19 +225,19 @@ public: VPUniforms.mClipHeight = 0; } - void PushVisibleSurface(LevelMeshSurface* surface) + void PushVisibleTile(int tileIndex) { if (outer) { - outer->PushVisibleSurface(surface); + outer->PushVisibleTile(tileIndex); return; } - if (surface->LightmapTileIndex < 0) + if (tileIndex < 0) return; - LightmapTile* tile = &Level->levelMesh->LightmapTiles[surface->LightmapTileIndex]; - if (lm_always_update || surface->AlwaysUpdate) + LightmapTile* tile = &Level->levelMesh->LightmapTiles[tileIndex]; + if (lm_always_update || tile->AlwaysUpdate) { tile->NeedsUpdate = true; } diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index fa0f098ea..0395d954b 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -174,7 +174,7 @@ public: vertex_t* vertexes[2]; // required for polygon splitting FGameTexture* texture; TArray* lightlist; - DoomLevelMeshSurface* surface; + int lightmaptile; HWSeg glseg; float ztop[2], zbottom[2]; diff --git a/src/rendering/hwrenderer/scene/hw_flats.cpp b/src/rendering/hwrenderer/scene/hw_flats.cpp index 123675a73..9e1a58bfe 100644 --- a/src/rendering/hwrenderer/scene/hw_flats.cpp +++ b/src/rendering/hwrenderer/scene/hw_flats.cpp @@ -535,9 +535,9 @@ void HWFlat::ProcessSector(HWFlatDispatcher *di, FRenderState& state, sector_t * unsigned int count = sector->e->XFloor.ffloors.Size() + 1; for (unsigned int j = 0; j < count; j++) { - if (auto surface = sector->subsectors[i]->surface[plane].Size() > j ? sector->subsectors[i]->surface[plane][j] : nullptr) + if (int tile = sector->subsectors[i]->LightmapTiles[plane].Size() > j ? sector->subsectors[i]->LightmapTiles[plane][j] : -1) { - di->di->PushVisibleSurface(surface); + di->di->PushVisibleTile(tile); } } } diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index fa4c0adfa..ecb5661ea 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -1125,17 +1125,17 @@ void HWWall::DoTexture(HWWallDispatcher *di, FRenderState& state, int _type,seg_ if (di->di) { - if (seg->sidedef->surface.Size() >= 4 && type >= RENDERWALL_TOP && type <= RENDERWALL_BOTTOM) + if (seg->sidedef->LightmapTiles.Size() >= 4 && type >= RENDERWALL_TOP && type <= RENDERWALL_BOTTOM) { - surface = seg->sidedef->surface[type - RENDERWALL_TOP]; - if (surface && di->di) + lightmaptile = seg->sidedef->LightmapTiles[type - RENDERWALL_TOP]; + if (lightmaptile && di->di) { - di->di->PushVisibleSurface(surface); + di->di->PushVisibleTile(lightmaptile); } } else { - surface = nullptr; + lightmaptile = -1; } } else @@ -1150,7 +1150,7 @@ void HWWall::DoTexture(HWWallDispatcher *di, FRenderState& state, int _type,seg_ LevelMeshInfo.Type = ST_NONE; } LevelMeshInfo.ControlSector = nullptr; - surface = nullptr; + lightmaptile = -1; } float floatceilingref = ceilingrefheight + tci.RowOffset(seg->sidedef->GetTextureYOffset(texpos)); @@ -1209,12 +1209,12 @@ void HWWall::DoMidTexture(HWWallDispatcher *di, FRenderState& state, seg_t * seg { if (di->di) { - if (seg->sidedef->surface.Size() >= 4) + if (seg->sidedef->LightmapTiles.Size() >= 4) { - surface = seg->sidedef->surface[side_t::mid]; - if (surface && di->di) + lightmaptile = seg->sidedef->LightmapTiles[side_t::mid]; + if (lightmaptile >= 0 && di->di) { - di->di->PushVisibleSurface(surface); + di->di->PushVisibleTile(lightmaptile); } } } @@ -1222,7 +1222,7 @@ void HWWall::DoMidTexture(HWWallDispatcher *di, FRenderState& state, seg_t * seg { LevelMeshInfo.Type = ST_MIDDLESIDE; LevelMeshInfo.ControlSector = nullptr; - surface = nullptr; + lightmaptile = -1; } // Align the texture to the ORIGINAL sector's height!! @@ -1557,20 +1557,20 @@ void HWWall::BuildFFBlock(HWWallDispatcher *di, FRenderState& state, seg_t * seg if (di->di) { if (seg->sidedef == seg->linedef->sidedef[0]) - surface = seg->linedef->sidedef[1]->surface.Size() > 4 + roverIndex ? seg->linedef->sidedef[1]->surface[4 + roverIndex] : nullptr; + lightmaptile = seg->linedef->sidedef[1]->LightmapTiles.Size() > 4 + roverIndex ? seg->linedef->sidedef[1]->LightmapTiles[4 + roverIndex] : -1; else - surface = seg->linedef->sidedef[0]->surface.Size() > 4 + roverIndex ? seg->linedef->sidedef[0]->surface[4 + roverIndex] : nullptr; + lightmaptile = seg->linedef->sidedef[0]->LightmapTiles.Size() > 4 + roverIndex ? seg->linedef->sidedef[0]->LightmapTiles[4 + roverIndex] : -1; - if (surface) + if (lightmaptile > 0) { - di->di->PushVisibleSurface(surface); + di->di->PushVisibleTile(lightmaptile); } } else { LevelMeshInfo.Type = ST_MIDDLESIDE; LevelMeshInfo.ControlSector = rover->model; - surface = nullptr; + lightmaptile = -1; } if (rover->flags&FF_FOG) @@ -1936,7 +1936,7 @@ void HWWall::Process(HWWallDispatcher *di, FRenderState& state, seg_t *seg, sect } #endif - surface = nullptr; + lightmaptile = -1; LevelMeshInfo.Type = ST_NONE; LevelMeshInfo.ControlSector = nullptr; diff --git a/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp b/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp index 52b13763c..abace2bb3 100644 --- a/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp @@ -195,9 +195,9 @@ void HWWall::SplitRightEdge(FFlatVertex *&ptr) int HWWall::CreateVertices(FFlatVertex *&ptr, bool split) { - if (surface && surface->LightmapTileIndex >= 0) + if (lightmaptile >= 0) { - LightmapTile* tile = &level.levelMesh->LightmapTiles[surface->LightmapTileIndex]; + LightmapTile* tile = &level.levelMesh->LightmapTiles[lightmaptile]; FVector2 lolft = tile->ToUV(FVector3(glseg.x1, glseg.y1, zbottom[0]), level.levelMesh->LMTextureSize); FVector2 uplft = tile->ToUV(FVector3(glseg.x1, glseg.y1, ztop[0]), level.levelMesh->LMTextureSize); FVector2 uprgt = tile->ToUV(FVector3(glseg.x2, glseg.y2, ztop[1]), level.levelMesh->LMTextureSize); From 8a5e7449c1b10432f8861691aa09be125d4e5457 Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Fri, 9 Aug 2024 19:58:26 -0600 Subject: [PATCH 166/414] Consolidated isometric mode commits. --- src/am_map.cpp | 4 +- .../rendering/hwrenderer/data/hw_cvars.h | 3 + .../hwrenderer/data/hw_renderstate.h | 1 + .../rendering/hwrenderer/data/hw_vrmodes.cpp | 20 +- .../rendering/hwrenderer/data/hw_vrmodes.h | 2 +- .../rendering/vulkan/shaders/vk_shader.cpp | 1 + src/common/utility/m_bbox.h | 7 + src/gamedata/g_mapinfo.cpp | 1 + src/gamedata/g_mapinfo.h | 1 + src/gamedata/r_defs.h | 4 + src/maploader/maploader.cpp | 19 ++ src/playsim/actor.h | 9 +- src/playsim/p_map.cpp | 34 ++-- src/playsim/p_trace.cpp | 4 + src/playsim/p_trace.h | 1 + src/rendering/hwrenderer/hw_entrypoint.cpp | 6 +- src/rendering/hwrenderer/scene/hw_bsp.cpp | 190 +++++++++++++++++- src/rendering/hwrenderer/scene/hw_clipper.cpp | 146 +++++++++++++- src/rendering/hwrenderer/scene/hw_clipper.h | 40 ++-- .../hwrenderer/scene/hw_drawcontext.h | 2 + .../hwrenderer/scene/hw_drawinfo.cpp | 169 ++++++++++++++-- src/rendering/hwrenderer/scene/hw_drawinfo.h | 5 + src/rendering/hwrenderer/scene/hw_flats.cpp | 9 +- src/rendering/hwrenderer/scene/hw_portal.cpp | 3 +- src/rendering/hwrenderer/scene/hw_sky.cpp | 1 + src/rendering/hwrenderer/scene/hw_sprites.cpp | 44 +++- src/rendering/hwrenderer/scene/hw_walls.cpp | 8 + src/rendering/r_utility.cpp | 97 ++++++--- src/rendering/r_utility.h | 8 + src/scripting/thingdef_data.cpp | 1 + wadsrc/static/shaders/scene/frag_main.glsl | 36 ++++ wadsrc/static/zscript/actors/shared/camera.zs | 84 ++++++++ wadsrc/static/zscript/constants.zs | 8 +- 33 files changed, 870 insertions(+), 98 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index d3057b467..91ed928d9 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2822,7 +2822,7 @@ void DAutomap::drawPlayers () int numarrowlines; double vh = players[consoleplayer].viewheight; - DVector2 pos = players[consoleplayer].camera->InterpolatedPosition(r_viewpoint.TicFrac).XY(); + DVector2 pos = players[consoleplayer].mo->InterpolatedPosition(r_viewpoint.TicFrac).XY(); pt.x = pos.X; pt.y = pos.Y; if (am_rotate == 1 || (am_rotate == 2 && viewactive)) @@ -2832,7 +2832,7 @@ void DAutomap::drawPlayers () } else { - angle = players[consoleplayer].camera->InterpolatedAngles(r_viewpoint.TicFrac).Yaw; + angle = players[consoleplayer].mo->InterpolatedAngles(r_viewpoint.TicFrac).Yaw; } if (am_cheat != 0 && CheatMapArrow.Size() > 0) diff --git a/src/common/rendering/hwrenderer/data/hw_cvars.h b/src/common/rendering/hwrenderer/data/hw_cvars.h index b36dda98a..5190401bb 100644 --- a/src/common/rendering/hwrenderer/data/hw_cvars.h +++ b/src/common/rendering/hwrenderer/data/hw_cvars.h @@ -54,3 +54,6 @@ EXTERN_CVAR(Bool, gl_debug_breakpoint) EXTERN_CVAR(Bool, gl_brightfog) EXTERN_CVAR(Bool, gl_lightadditivesurfaces) EXTERN_CVAR(Bool, gl_notexturefill) + +EXTERN_CVAR(Bool, r_radarclipper) +EXTERN_CVAR(Bool, r_dithertransparency) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 06f79a56a..1caf9e830 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -32,6 +32,7 @@ enum ERenderEffect EFF_BURN, EFF_STENCIL, EFF_PORTAL, + EFF_DITHERTRANS, MAX_EFFECTS }; diff --git a/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp b/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp index c51ce2ee9..8cb3c94e5 100644 --- a/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp +++ b/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp @@ -146,11 +146,27 @@ float VREyeInfo::getShift() const return vr_swap_eyes ? -res : res; } -VSMatrix VREyeInfo::GetProjection(float fov, float aspectRatio, float fovRatio) const +VSMatrix VREyeInfo::GetProjection(float fov, float aspectRatio, float fovRatio, bool iso_ortho) const { VSMatrix result; - if (mShiftFactor == 0) + if (iso_ortho) // Orthographic projection for isometric viewpoint + { + double zNear = -3.0/fovRatio; // screen->GetZNear(); + double zFar = screen->GetZFar(); + + double fH = tan(DEG2RAD(fov) / 2) / fovRatio; + double fW = fH * aspectRatio * mScaleFactor; + double left = -fW; + double right = fW; + double bottom = -fH; + double top = fH; + + VSMatrix fmat(1); + fmat.ortho((float)left, (float)right, (float)bottom, (float)top, (float)zNear, (float)zFar); + return fmat; + } + else if (mShiftFactor == 0) { float fovy = (float)(2 * RAD2DEG(atan(tan(DEG2RAD(fov) / 2) / fovRatio))); result.perspective(fovy, aspectRatio, screen->GetZNear(), screen->GetZFar()); diff --git a/src/common/rendering/hwrenderer/data/hw_vrmodes.h b/src/common/rendering/hwrenderer/data/hw_vrmodes.h index 26c9fd211..989281520 100644 --- a/src/common/rendering/hwrenderer/data/hw_vrmodes.h +++ b/src/common/rendering/hwrenderer/data/hw_vrmodes.h @@ -27,7 +27,7 @@ struct VREyeInfo float mShiftFactor; float mScaleFactor; - VSMatrix GetProjection(float fov, float aspectRatio, float fovRatio) const; + VSMatrix GetProjection(float fov, float aspectRatio, float fovRatio, bool iso_ortho) const; DVector3 GetViewShift(float yaw) const; private: float getShift() const; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 78dd19237..b73d9ba8c 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -72,6 +72,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) { "burn", "shaders/scene/frag_burn.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, { "stencil", "shaders/scene/frag_stencil.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, { "portal", "shaders/scene/frag_portal.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, + { "dithertrans", "shaders/scene/frag_main.glsl", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define NO_ALPHATEST\n#define DITHERTRANS\n" }, }; const auto& desc = effectshaders[key.SpecialEffect]; diff --git a/src/common/utility/m_bbox.h b/src/common/utility/m_bbox.h index f117c290b..7f622a6ba 100644 --- a/src/common/utility/m_bbox.h +++ b/src/common/utility/m_bbox.h @@ -72,6 +72,13 @@ public: m_Box[BOXTOP] = pos.Y; } + bool CheckOverlap(const FBoundingBox &box2) + { + bool hori = (Left() > box2.Right()) || (Right() < box2.Left()); + bool vert = (Bottom() > box2.Top()) || (Top() < box2.Bottom()); + return !(hori || vert); // [DVR] For alternative space partition + } + inline double Top () const { return m_Box[BOXTOP]; } inline double Bottom () const { return m_Box[BOXBOTTOM]; } inline double Left () const { return m_Box[BOXLEFT]; } diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 5081fe68d..4822f35a8 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -1823,6 +1823,7 @@ MapFlagHandlers[] = { "disableskyboxao", MITYPE_CLRFLAG3, LEVEL3_SKYBOXAO, 0 }, { "avoidmelee", MITYPE_SETFLAG3, LEVEL3_AVOIDMELEE, 0 }, { "attenuatelights", MITYPE_SETFLAG3, LEVEL3_ATTENUATE, 0 }, + { "nofogofwar", MITYPE_SETFLAG3, LEVEL3_NOFOGOFWAR, 0 }, { "nousersave", MITYPE_SETVKDFLAG, VKDLEVELFLAG_NOUSERSAVE, 0 }, { "noautomap", MITYPE_SETVKDFLAG, VKDLEVELFLAG_NOAUTOMAP, 0 }, { "noautosaveonenter", MITYPE_SETVKDFLAG, VKDLEVELFLAG_NOAUTOSAVEONENTER, 0 }, diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index 17fae6255..1e9419739 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -270,6 +270,7 @@ enum ELevelFlags : unsigned int LEVEL3_AVOIDMELEE = 0x00020000, // global flag needed for proper MBF support. LEVEL3_NOJUMPDOWN = 0x00040000, // only for MBF21. Inverse of MBF's dog_jumping flag. LEVEL3_LIGHTCREATED = 0x00080000, // a light had been created in the last frame + LEVEL3_NOFOGOFWAR = 0x00100000, // disables effect of r_radarclipper CVAR on this map // VKDoom custom flags VKDLEVELFLAG_NOUSERSAVE = 0x00000001, diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index 04e32c748..54295a12b 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -303,6 +303,7 @@ struct secplane_t DVector3 normal; double D, negiC; // negative iC because that also saves a negation in all methods using this. public: + bool dithertransflag; // Render plane with dithering transparency shader (gets reset every frame) friend FSerializer &Serialize(FSerializer &arc, const char *key, secplane_t &p, secplane_t *def); void set(double aa, double bb, double cc, double dd) @@ -1186,6 +1187,8 @@ enum WALLF_ABSLIGHTING_TOP = WALLF_ABSLIGHTING_TIER << 0, // Top tier light is absolute instead of relative WALLF_ABSLIGHTING_MID = WALLF_ABSLIGHTING_TIER << 1, // Mid tier light is absolute instead of relative WALLF_ABSLIGHTING_BOTTOM = WALLF_ABSLIGHTING_TIER << 2, // Bottom tier light is absolute instead of relative + + WALLF_DITHERTRANS = 8192, // Render with dithering transparency shader (gets reset every frame) }; struct side_t @@ -1664,6 +1667,7 @@ struct subsector_t uint32_t numlines; uint16_t flags; short mapsection; + FBoundingBox bbox; // [DVR] For alternative space culling in orthographic projection with no fog of war // subsector related GL data int validcount; diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 51faf97a1..b819bd57d 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3525,4 +3525,23 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) } Level->aabbTree = new DoomLevelAABBTree(Level); + + // [DVR] Populate subsector->bbox for alternative space culling in orthographic projection with no fog of war + subsector_t* sub = &Level->subsectors[0]; + seg_t* seg; + for (unsigned int kk = 0; kk < Level->subsectors.Size(); kk++) + { + sub[kk].bbox.ClearBox(); + unsigned int count = sub[kk].numlines; + seg = sub[kk].firstline; + while(count--) + { + if((seg->v1 != nullptr) && (seg->v2 != nullptr)) + { + sub[kk].bbox.AddToBox(seg->v1->fPos()); + sub[kk].bbox.AddToBox(seg->v2->fPos()); + } + seg++; + } + } } diff --git a/src/playsim/actor.h b/src/playsim/actor.h index ca7c1d7f9..986e3e11a 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -502,6 +502,7 @@ enum ActorRenderFlag2 RF2_FLIPSPRITEOFFSETY = 0x0020, RF2_CAMFOLLOWSPLAYER = 0x0040, // Matches the cam's base position and angles to the main viewpoint. RF2_NOMIPMAP = 0x0080, // [Nash] forces no mipmapping on sprites. Useful for tiny sprites that need to remain visually crisp + RF2_ISOMETRICSPRITES = 0x0100, }; // This translucency value produces the closest match to Heretic's TINTTAB. @@ -692,8 +693,10 @@ struct FDropItem enum EViewPosFlags // [MC] Flags for SetViewPos. { - VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. - VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. + VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ALLOWOUTOFBOUNDS = 1 << 3, // Allow viewpoint to go out of bounds (hardware renderer only). + VPSF_ORTHOGRAPHIC = 1 << 4, // Use orthographic projection (hardware renderer only). }; enum EAnimOverrideFlags @@ -1123,6 +1126,8 @@ public: DAngle SpriteAngle; DAngle SpriteRotation; DVector2 AutomapOffsets; // Offset the actors' sprite view on the automap by these coordinates. + float isoscaleY; // Y-scale to compensate for Y-billboarding for isometric sprites + float isotheta; // Rotation angle to compensate for Y-billboarding for isometric sprites DRotator Angles; DRotator ViewAngles; // Angle offsets for cameras TObjPtr ViewPos; // Position offsets for cameras diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index a79f912ae..af8df92a7 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -82,6 +82,7 @@ #include "p_blockmap.h" #include "p_3dmidtex.h" #include "vm.h" +#include "d_main.h" #include "decallib.h" @@ -5577,33 +5578,42 @@ void R_OffsetView(FRenderViewpoint& viewPoint, const DVector3& dir, const double { const DAngle baseYaw = dir.Angle(); FTraceResults trace = {}; - if (Trace(viewPoint.Pos, viewPoint.sector, dir, distance, 0u, 0u, nullptr, trace)) + if (viewPoint.IsAllowedOoB() && V_IsHardwareRenderer()) + { + viewPoint.Pos += dir * distance; + viewPoint.sector = viewPoint.ViewLevel->PointInRenderSubsector(viewPoint.Pos)->sector; + } + else if (Trace(viewPoint.Pos, viewPoint.sector, dir, distance, 0u, 0u, nullptr, trace)) { viewPoint.Pos = trace.HitPos - trace.HitVector * min(5.0, trace.Distance); viewPoint.sector = viewPoint.ViewLevel->PointInRenderSubsector(viewPoint.Pos)->sector; + viewPoint.Angles.Yaw += deltaangle(baseYaw, trace.SrcAngleFromTarget); } else { viewPoint.Pos = trace.HitPos; viewPoint.sector = trace.Sector; + viewPoint.Angles.Yaw += deltaangle(baseYaw, trace.SrcAngleFromTarget); } - viewPoint.Angles.Yaw += deltaangle(baseYaw, trace.SrcAngleFromTarget); // TODO: Why does this even need to be done? Please fix tracers already. - if (dir.Z < 0.0) + if (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer()) { - while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor) && viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + if (dir.Z < 0.0) { - viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::floor); - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor) && viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + { + viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::floor); + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + } } - } - else if (dir.Z > 0.0) - { - while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) + else if (dir.Z > 0.0) { - viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; + while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) + { + viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; + } } } } diff --git a/src/playsim/p_trace.cpp b/src/playsim/p_trace.cpp index 7e47a7323..ed37d5e34 100644 --- a/src/playsim/p_trace.cpp +++ b/src/playsim/p_trace.cpp @@ -633,6 +633,9 @@ cont: case TRACE_Stop: return false; + case TRACE_ContinueOutOfBounds: + return true; + case TRACE_Abort: Results->HitType = TRACE_HitNone; return false; @@ -732,6 +735,7 @@ bool FTraceInfo::ThingCheck(intercept_t *in, double dist, DVector3 hit) switch (TraceCallback(*Results, TraceCallbackData)) { case TRACE_Continue: return true; + case TRACE_ContinueOutOfBounds: return true; case TRACE_Stop: return false; case TRACE_Abort: Results->HitType = TRACE_HitNone; return false; case TRACE_Skip: Results->HitType = TRACE_HitNone; return true; diff --git a/src/playsim/p_trace.h b/src/playsim/p_trace.h index ef5318678..9035ae965 100644 --- a/src/playsim/p_trace.h +++ b/src/playsim/p_trace.h @@ -109,6 +109,7 @@ enum ETraceStatus TRACE_Continue, // continue the trace, returning this hit if there are none further along TRACE_Skip, // continue the trace; do not return this hit TRACE_Abort, // stop the trace, returning no hits + TRACE_ContinueOutOfBounds, // continue the trace through walls; don't use this for railguns }; bool Trace(const DVector3 &start, sector_t *sector, const DVector3 &direction, double maxDist, diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index 8e7c363a1..8a2a2bc8b 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -165,7 +165,11 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou di->Viewpoint.FieldOfView = DAngle::fromDeg(fov); // Set the real FOV for the current scene (it's not necessarily the same as the global setting in r_viewpoint) // Stereo mode specific perspective projection - di->VPUniforms.mProjectionMatrix = eye.GetProjection(fov, ratio, fovratio); + float inv_iso_dist = 1.0f; + bool iso_ortho = (camera->ViewPos != NULL) && (camera->ViewPos->Flags & VPSF_ORTHOGRAPHIC); + if (iso_ortho && (camera->ViewPos->Offset.Length() > 0)) inv_iso_dist = 1.0/camera->ViewPos->Offset.Length(); + di->VPUniforms.mProjectionMatrix = eye.GetProjection(fov, ratio, fovratio * inv_iso_dist, iso_ortho); + // Stereo mode specific viewpoint adjustment vp.Pos += eye.GetViewShift(vp.HWAngles.Yaw.Degrees()); di->SetupView(RenderState, vp.Pos.X, vp.Pos.Y, vp.Pos.Z, false, false); diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index 6dd4d04bb..5dd103ab3 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -52,11 +52,24 @@ CVAR(Bool, gl_multithread, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) EXTERN_CVAR(Float, r_actorspriteshadowdist) +EXTERN_CVAR(Bool, r_radarclipper) +EXTERN_CVAR(Bool, r_dithertransparency) thread_local bool isWorkerThread; ctpl::thread_pool renderPool(1); bool inited = false; +const int MAXDITHERACTORS = 20; // Maximum number of enemies that can set dither-transparency flags +AActor* RenderedTargets[MAXDITHERACTORS]; +int RTnum; + +void ClearDitherTargets() +{ + RTnum = 0; // Number of rendered enemies/targets + for (int ii = 0; ii < MAXDITHERACTORS; ii++) + RenderedTargets[ii] = nullptr; +} + struct RenderJob { enum @@ -272,6 +285,20 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip, FRenderState& state) auto &clipper = *mClipper; angle_t startAngle = clipper.GetClipAngle(seg->v2); angle_t endAngle = clipper.GetClipAngle(seg->v1); + auto &clipperr = *rClipper; + angle_t startAngleR = clipperr.PointToPseudoAngle(seg->v2->fX(), seg->v2->fY()); + angle_t endAngleR = clipperr.PointToPseudoAngle(seg->v1->fX(), seg->v1->fY()); + + if(r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR) && (startAngleR - endAngleR >= ANGLE_180)) + { + if (!seg->backsector) clipperr.SafeAddClipRange(startAngleR, endAngleR); + else if((seg->sidedef != nullptr) && !uint8_t(seg->sidedef->Flags & WALLF_POLYOBJ) && (currentsector->sectornum != seg->backsector->sectornum)) + { + if (in_area == area_default) in_area = hw_CheckViewArea(seg->v2, seg->v1, seg->frontsector, seg->backsector); + backsector = hw_FakeFlat(drawctx, seg->backsector, in_area, true); + if (hw_CheckClip(seg->sidedef, currentsector, backsector)) clipperr.SafeAddClipRange(startAngleR, endAngleR); + } + } // Back side, i.e. backface culling - read: endAngle >= startAngle! if (startAngle-endAngleflags & SSECMF_DRAWN)) { - if (clipper.SafeCheckRange(startAngle, endAngle)) + if (clipper.SafeCheckRange(startAngle, endAngle) && (!r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR))) { - currentsubsector->flags |= SSECMF_DRAWN; + currentsubsector->flags |= SSECMF_DRAWN; + } + if ((r_radarclipper || !(Level->flags3 & LEVEL3_NOFOGOFWAR)) && clipperr.SafeCheckRange(startAngleR, endAngleR)) + { + currentsubsector->flags |= SSECMF_DRAWN; } } return; } - if (!clipper.SafeCheckRange(startAngle, endAngle)) + if (!clipper.SafeCheckRange(startAngle, endAngle)) { return; } - currentsubsector->flags |= SSECMF_DRAWN; + + auto &clipperv = *vClipper; + angle_t startPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->floorplane.ZatPoint(seg->v1)); + angle_t endPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->ceilingplane.ZatPoint(seg->v1)); + angle_t startPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->floorplane.ZatPoint(seg->v2)); + angle_t endPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->ceilingplane.ZatPoint(seg->v2)); + angle_t temp; + // Wall can be tilted from viewpoint perspective. Find vertical extent on screen in psuedopitch units (0 to 2, bottom to top) + if(int(startPitch) > int(startPitch2)) // Handle zero crossing + { + temp = startPitch; startPitch = startPitch2; startPitch2 = temp; // exchange + } + if(int(endPitch) > int(endPitch2)) // Handle zero crossing + { + temp = endPitch; endPitch = endPitch2; endPitch2 = temp; // exchange + } + + if (!clipperv.SafeCheckRange(startPitch, endPitch2)) + { + return; + } + + if (!r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR) || clipperr.SafeCheckRange(startAngleR, endAngleR)) + currentsubsector->flags |= SSECMF_DRAWN; uint8_t ispoly = uint8_t(seg->sidedef->Flags & WALLF_POLYOBJ); if (!seg->backsector) { - clipper.SafeAddClipRange(startAngle, endAngle); + if(!Viewpoint.IsAllowedOoB()) + if (!(seg->sidedef->Flags & WALLF_DITHERTRANS)) clipper.SafeAddClipRange(startAngle, endAngle); } else if (!ispoly) // Two-sided polyobjects never obstruct the view { @@ -328,7 +383,8 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip, FRenderState& state) if (hw_CheckClip(seg->sidedef, currentsector, backsector)) { - clipper.SafeAddClipRange(startAngle, endAngle); + if(!Viewpoint.IsAllowedOoB() && !(seg->sidedef->Flags & WALLF_DITHERTRANS)) + clipper.SafeAddClipRange(startAngle, endAngle); } } } @@ -529,13 +585,14 @@ void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector, FRenderState { sector_t * sec=sub->sector; // Handle all things in sector. - const auto &vp = Viewpoint; + const auto &vp = Viewpoint; for (auto p = sec->touching_renderthings; p != nullptr; p = p->m_snext) { auto thing = p->m_thing; if (thing->validcount == validcount) continue; thing->validcount = validcount; + if(Viewpoint.IsAllowedOoB() && thing->Sector->isSecret() && thing->Sector->wasSecret() && !r_radarclipper) continue; // This covers things that are touching non-secret sectors FIntCVar *cvar = thing->GetInfo()->distancecheck; if (cvar != nullptr && *cvar >= 0) { @@ -669,6 +726,51 @@ void HWDrawInfo::DoSubsector(subsector_t * sub, FRenderState& state) fakesector=hw_FakeFlat(drawctx, sector, in_area, false); + if(Viewpoint.IsAllowedOoB() && sector->isSecret() && sector->wasSecret() && !r_radarclipper) return; + + // cull everything if subsector outside all clippers + if ((sub->polys == nullptr) && (!Viewpoint.IsOrtho() || !((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper))) + { + auto &clipper = *mClipper; + auto &clipperv = *vClipper; + auto &clipperr = *rClipper; + int count = sub->numlines; + seg_t * seg = sub->firstline; + bool anglevisible = false; + bool pitchvisible = false; + bool radarvisible = false; + angle_t pitchtemp; + angle_t pitchmin = ANGLE_90; + angle_t pitchmax = 0; + + while (count--) + { + if((seg->v1 != nullptr) && (seg->v2 != nullptr)) + { + angle_t startAngle = clipper.GetClipAngle(seg->v2); + angle_t endAngle = clipper.GetClipAngle(seg->v1); + if (startAngle-endAngle >= ANGLE_180) anglevisible |= clipper.SafeCheckRange(startAngle, endAngle); + angle_t startAngleR = clipperr.PointToPseudoAngle(seg->v2->fX(), seg->v2->fY()); + angle_t endAngleR = clipperr.PointToPseudoAngle(seg->v1->fX(), seg->v1->fY()); + if (startAngleR-endAngleR >= ANGLE_180) + radarvisible |= (clipperr.SafeCheckRange(startAngleR, endAngleR) || (Level->flags3 & LEVEL3_NOFOGOFWAR) || ((sub->flags & SSECMF_DRAWN) && !deathmatch)); + pitchmin = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->floorplane.ZatPoint(seg->v1)); + pitchmax = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->ceilingplane.ZatPoint(seg->v1)); + pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + if (pitchvisible && anglevisible && radarvisible) break; + pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->floorplane.ZatPoint(seg->v2)); + if (int(pitchmin) > int(pitchtemp)) pitchmin = pitchtemp; + pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->ceilingplane.ZatPoint(seg->v2)); + if (int(pitchmax) < int(pitchtemp)) pitchmax = pitchtemp; + pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + if (pitchvisible && anglevisible && radarvisible) break; + } + seg++; + } + // Skip subsector if outside vertical or horizontal clippers or is in unexplored territory (fog of war) + if(!pitchvisible || !anglevisible || (!radarvisible && r_radarclipper)) return; + } + if (mClipPortal) { int clipres = mClipPortal->ClipSubsector(sub); @@ -726,6 +828,20 @@ void HWDrawInfo::DoSubsector(subsector_t * sub, FRenderState& state) SetupSprite.Unclock(); } } + if (r_dithertransparency && Viewpoint.IsAllowedOoB() && (RTnum < MAXDITHERACTORS)) + { + // [DVR] Not parallelizable due to variables RTnum and RenderedTargets[] + for (auto p = sector->touching_renderthings; p != nullptr; p = p->m_snext) + { + auto thing = p->m_thing; + if (thing->validcount == validcount) continue; // Don't double count + if (((thing->flags3 & MF3_ISMONSTER) && !(thing->flags & MF_CORPSE)) || (thing->flags & MF_MISSILE)) + { + if (RTnum < MAXDITHERACTORS) RenderedTargets[RTnum++] = thing; + else break; + } + } + } } if (gl_render_flats) @@ -847,19 +963,62 @@ void HWDrawInfo::RenderBSPNode (void *node, FRenderState& state) if (!(no_renderflags[bsp->Index()] & SSRF_SEEN)) return; } + if (Viewpoint.IsOrtho()) + { + if (!vClipper->CheckBoxOrthoPitch(bsp->bbox[side])) + { + if (!(no_renderflags[bsp->Index()] & SSRF_SEEN)) + return; + } + } node = bsp->children[side]; } DoSubsector ((subsector_t *)((uint8_t *)node - 1), state); } +// No need for clipping inside frustum if no fog of war (How is this faster!) +void HWDrawInfo::RenderOrthoNoFog(FRenderState& state) +{ + if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) + { + double vxdbl = Viewpoint.camera->X(); + double vydbl = Viewpoint.camera->Y(); + double ext = Viewpoint.camera->ViewPos->Offset.Length() ? + 3.0 * Viewpoint.camera->ViewPos->Offset.Length() : 100.0; + FBoundingBox viewbox(vxdbl, vydbl, ext); + + for (unsigned int kk = 0; kk < Level->subsectors.Size(); kk++) + { + if (Level->subsectors[kk].bbox.CheckOverlap(viewbox)) + { + DoSubsector (&Level->subsectors[kk], state); + } + } + } +} + void HWDrawInfo::RenderBSP(void *node, bool drawpsprites, FRenderState& state) { + ClearDitherTargets(); Bsp.Clock(); // Give the DrawInfo the viewpoint in fixed point because that's what the nodes are. viewx = FLOAT2FIXED(Viewpoint.Pos.X); viewy = FLOAT2FIXED(Viewpoint.Pos.Y); + if (r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR) && Viewpoint.IsAllowedOoB() && (Viewpoint.camera->ViewPos->Flags & VPSF_ABSOLUTEOFFSET)) + { + if (Viewpoint.camera->tracer != nullptr) + { + viewx = FLOAT2FIXED(Viewpoint.camera->tracer->X()); + viewy = FLOAT2FIXED(Viewpoint.camera->tracer->Y()); + } + else + { + viewx = FLOAT2FIXED(Viewpoint.camera->X()); + viewy = FLOAT2FIXED(Viewpoint.camera->Y()); + } + } validcount++; // used for processing sidedefs only once by the renderer. @@ -870,7 +1029,8 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites, FRenderState& state) auto future = renderPool.push([&](int id) { WorkerThread(); }); - RenderBSPNode(node, state); + if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(state); + else RenderBSPNode(node, state); jobQueue.AddJob(RenderJob::TerminateJob, nullptr, nullptr); Bsp.Unclock(); @@ -880,9 +1040,21 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites, FRenderState& state) } else { - RenderBSPNode(node, state); + if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(state); + else RenderBSPNode(node, state); Bsp.Unclock(); } + + // Make rendered targets set dither transparency flags on level geometry for next pass + // Can't do this inside DoSubsector() because both Trace() and P_CheckSight() affect 'validcount' global variable + for (int ii = 0; ii < MAXDITHERACTORS; ii++) + { + if ( RenderedTargets[ii] && P_CheckSight(players[consoleplayer].mo, RenderedTargets[ii], 0) ) + { + SetDitherTransFlags(RenderedTargets[ii]); + } + } + // Process all the sprites on the current portal's back side which touch the portal. if (mCurrentPortal != nullptr) mCurrentPortal->RenderAttached(this, state); diff --git a/src/rendering/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp index b46e7837f..09031f8d4 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.cpp +++ b/src/rendering/hwrenderer/scene/hw_clipper.cpp @@ -186,7 +186,7 @@ void Clipper::AddClipRange(angle_t start, angle_t end) if (node->end < end) { - node->end = end; + node->end = end; // [DVR] This never triggers because of previous while loop. Remove? } ClipNode *node2 = node->next; @@ -354,6 +354,17 @@ angle_t Clipper::AngleToPseudo(angle_t ang) return xs_Fix<30>::ToFix(result); } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +angle_t Clipper::PitchToPseudo(double ang) +{ + return AngleToPseudo(DAngle::fromDeg(90.0-ang).BAMs()); // Pitch is positive when looking down +} + //----------------------------------------------------------------------------- // // ! Returns the pseudoangle between the line p1 to (infinity, p1.y) and the @@ -371,11 +382,28 @@ angle_t Clipper::PointToPseudoAngle(double x, double y) { double vecx = x - viewpoint->Pos.X; double vecy = y - viewpoint->Pos.Y; + if ((viewpoint->camera != NULL) && amRadar) + { + if (viewpoint->camera->tracer != NULL) + { + vecx = x - viewpoint->camera->tracer->X(); + vecy = y - viewpoint->camera->tracer->Y(); + } + else + { + vecx = x - viewpoint->camera->X(); + vecy = y - viewpoint->camera->Y(); + } + } if (vecx == 0 && vecy == 0) { return 0; } + else if (!amRadar && viewpoint->IsOrtho()) + { + return PointToPseudoOrthoAngle(x, y); + } else { double result = vecy / (fabs(vecx) + fabs(vecy)); @@ -388,6 +416,78 @@ angle_t Clipper::PointToPseudoAngle(double x, double y) } +angle_t Clipper::PointToPseudoPitch(double x, double y, double z) +{ + double vecx = x - viewpoint->Pos.X; + double vecy = y - viewpoint->Pos.Y; + double vecz = z - viewpoint->Pos.Z; + double result = 0; + + if (vecx == 0 && vecy == 0 && vecz == 0) + { + return 0; + } + else if (viewpoint->IsOrtho()) + { + return PointToPseudoOrthoPitch(x, y, z); + } + else + { + double result = vecz / (g_sqrt(vecx*vecx + vecy*vecy) + fabs(vecz)); // -ffast-math compile flag applies to this file, yes? + if ((vecx * viewpoint->TanCos + vecy * viewpoint->TanSin) <= 0.0) // Point is behind viewpoint + { + result = 2.0 - result; + } + return xs_Fix<30>::ToFix(result + 1.0); // range to 0 to 2 to 4 (bottom to top to suplex) + } +} + + +angle_t Clipper::PointToPseudoOrthoAngle(double x, double y) +{ + DVector3 disp = DVector3( x, y, 0 ) - viewpoint->camera->Pos(); + if (viewpoint->camera->ViewPos->Offset.XY().Length() == 0) + { + return AngleToPseudo( viewpoint->Angles.Yaw.BAMs() ); + } + else + { + angle_t af = viewpoint->FrustAngle; + double xproj = disp.XY().Length() * deltaangle(disp.Angle(), viewpoint->Angles.Yaw).Sin(); + xproj *= viewpoint->ScreenProj; + if (fabs(xproj) < 2.0) + { + return AngleToPseudo( viewpoint->Angles.Yaw.BAMs() - xproj * 0.5 * af ); + } + else + { + return (xproj > 0.0 ? AngleToPseudo( viewpoint->Angles.Yaw.BAMs() - af ) : AngleToPseudo( viewpoint->Angles.Yaw.BAMs() + af )); + } + } +} + + +angle_t Clipper::PointToPseudoOrthoPitch(double x, double y, double z) +{ + DVector3 disp = DVector3( x, y, z ) - viewpoint->camera->Pos(); + if (viewpoint->camera->ViewPos->Offset.XY().Length() > 0) + { + double yproj = viewpoint->PitchSin * disp.XY().Length() * deltaangle(disp.Angle(), viewpoint->Angles.Yaw).Cos(); + yproj += viewpoint->PitchCos * disp.Z; + yproj *= viewpoint->ScreenProj; + if (fabs(yproj) <= 1.5) + { + return PitchToPseudo(viewpoint->Angles.Pitch.Degrees() - yproj * 0.5 * viewpoint->FieldOfView.Degrees() ); + } + else + { + double a2 = 0.75*viewpoint->FieldOfView.Degrees(); + a2 *= ( yproj > 0.0 ? -1.0 : 1.0 ); + return PitchToPseudo(viewpoint->Angles.Pitch.Degrees() + a2 ); + } + } + else return PitchToPseudo(viewpoint->Angles.Pitch.Degrees()); +} //----------------------------------------------------------------------------- // @@ -421,7 +521,7 @@ bool Clipper::CheckBox(const float *bspcoord) // Find the corners of the box // that define the edges from current viewpoint. - auto &vp = viewpoint; + auto &vp = viewpoint; boxpos = (vp->Pos.X <= bspcoord[BOXLEFT] ? 0 : vp->Pos.X < bspcoord[BOXRIGHT ] ? 1 : 2) + (vp->Pos.Y >= bspcoord[BOXTOP ] ? 0 : vp->Pos.Y > bspcoord[BOXBOTTOM] ? 4 : 8); @@ -430,7 +530,47 @@ bool Clipper::CheckBox(const float *bspcoord) check = checkcoord[boxpos]; angle1 = PointToPseudoAngle (bspcoord[check[0]], bspcoord[check[1]]); angle2 = PointToPseudoAngle (bspcoord[check[2]], bspcoord[check[3]]); - + + if (vp->IsOrtho()) + { + if (angle2 != angle1) return true; + switch (boxpos) // Check if the closer corner is poking into the view area + { + case 0: + case 10: + if ( angle1 != PointToPseudoAngle (bspcoord[check[2]], bspcoord[check[1]]) ) return true; + break; + case 2: + case 8: + if ( angle1 != PointToPseudoAngle (bspcoord[check[0]], bspcoord[check[3]]) ) return true; + break; + default: + break; + } + } + return SafeCheckRange(angle2, angle1); } +bool Clipper::CheckBoxOrthoPitch(const float *bspcoord) +{ + angle_t pitchmin, pitchmax; + auto &vp = viewpoint; + if (!vp->IsOrtho()) return true; + + angle_t pitchtemp; + double padding = 1.0/viewpoint->ScreenProj/viewpoint->PitchCos; + double camz = vp->camera->Pos().Z - padding; + pitchmin = PointToPseudoPitch (bspcoord[BOXLEFT], bspcoord[BOXTOP], camz); + pitchmax = PointToPseudoPitch (bspcoord[BOXLEFT], bspcoord[BOXTOP], camz + 2.0*padding); + for (int yi = BOXTOP; yi <= BOXBOTTOM; yi++) + for (int xi = BOXLEFT; xi <= BOXRIGHT; xi++) + { + pitchtemp = PointToPseudoPitch (bspcoord[xi], bspcoord[yi], camz); + if (pitchmin - pitchtemp < ANGLE_180) pitchmin = pitchtemp; + pitchtemp = PointToPseudoPitch (bspcoord[xi], bspcoord[yi], camz + 2.0*padding); + if (pitchtemp - pitchmax < ANGLE_180) pitchmax = pitchtemp; + } + + return (pitchmax != pitchmin); // SafeCheckRange(pitchmin, pitchmax); +} diff --git a/src/rendering/hwrenderer/scene/hw_clipper.h b/src/rendering/hwrenderer/scene/hw_clipper.h index 4eeff16b3..1128fa71e 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.h +++ b/src/rendering/hwrenderer/scene/hw_clipper.h @@ -28,10 +28,11 @@ class Clipper ClipNode * clipnodes = nullptr; ClipNode * cliphead = nullptr; ClipNode * silhouette = nullptr; // will be preserved even when RemoveClipRange is called - const FRenderViewpoint *viewpoint = nullptr; + FRenderViewpoint *viewpoint = nullptr; bool blocked = false; static angle_t AngleToPseudo(angle_t ang); + static angle_t PitchToPseudo(double ang); bool IsRangeVisible(angle_t startangle, angle_t endangle); void RemoveRange(ClipNode * cn); void AddClipRange(angle_t startangle, angle_t endangle); @@ -40,6 +41,7 @@ class Clipper public: + bool amRadar = false; void Clear(); void Free(ClipNode *node) @@ -68,11 +70,11 @@ public: c->next = c->prev = NULL; return c; } - - void SetViewpoint(const FRenderViewpoint &vp) - { - viewpoint = &vp; - } + + void SetViewpoint(FRenderViewpoint &vp) + { + viewpoint = &vp; + } void SetSilhouette(); @@ -100,19 +102,23 @@ public: AddClipRange(startangle, endangle); } } - - void SafeAddClipRange(const vertex_t *v1, const vertex_t *v2) - { - angle_t a2 = PointToPseudoAngle(v1->p.X, v1->p.Y); - angle_t a1 = PointToPseudoAngle(v2->p.X, v2->p.Y); - SafeAddClipRange(a1,a2); - } + + void SafeAddClipRange(const vertex_t *v1, const vertex_t *v2) + { + angle_t a2 = PointToPseudoAngle(v1->p.X, v1->p.Y); + angle_t a1 = PointToPseudoAngle(v2->p.X, v2->p.Y); + SafeAddClipRange(a1,a2); + } void SafeAddClipRangeRealAngles(angle_t startangle, angle_t endangle) { SafeAddClipRange(AngleToPseudo(startangle), AngleToPseudo(endangle)); } + void SafeAddClipRangeDegPitches(double startpitch, double endpitch) + { + SafeAddClipRange(PitchToPseudo(startpitch), PitchToPseudo(endpitch)); + } void SafeRemoveClipRange(angle_t startangle, angle_t endangle) { @@ -143,10 +149,14 @@ public: { return blocked; } - - angle_t PointToPseudoAngle(double x, double y); + + angle_t PointToPseudoAngle(double x, double y); + angle_t PointToPseudoPitch(double x, double y, double z); + angle_t PointToPseudoOrthoAngle(double x, double y); + angle_t PointToPseudoOrthoPitch(double x, double y, double z); bool CheckBox(const float *bspcoord); + bool CheckBoxOrthoPitch(const float *bspcoord); // Used to speed up angle calculations during clipping inline angle_t GetClipAngle(vertex_t *v) diff --git a/src/rendering/hwrenderer/scene/hw_drawcontext.h b/src/rendering/hwrenderer/scene/hw_drawcontext.h index 62e971de1..85bca991c 100644 --- a/src/rendering/hwrenderer/scene/hw_drawcontext.h +++ b/src/rendering/hwrenderer/scene/hw_drawcontext.h @@ -41,6 +41,8 @@ public: FDrawInfoList di_list; Clipper staticClipper; // Since all scenes are processed sequentially we only need one clipper. + Clipper staticVClipper; // Another clipper to clip vertically (used if (VPSF_ALLOWOUTOFBOUNDS & camera->viewpos->Flags)). + Clipper staticRClipper; // Another clipper for radar (doesn't actually clip. Changes SSECMF_DRAWN setting). HWDrawInfo* gl_drawinfo = nullptr; // This is a linked list of all active DrawInfos and needed to free the memory arena after the last one goes out of scope. FMemArena RenderDataAllocator; // Use large blocks to reduce allocation time. diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 6211bcb0f..98f0214ca 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -89,7 +89,12 @@ HWDrawInfo *HWDrawInfo::StartDrawInfo(HWDrawContext* drawctx, FLevelLocals *lev, void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms) { drawctx->staticClipper.Clear(); + drawctx->staticVClipper.Clear(); + drawctx->staticRClipper.Clear(); mClipper = &drawctx->staticClipper; + vClipper = &drawctx->staticVClipper; + rClipper = &drawctx->staticRClipper; + rClipper->amRadar = true; Viewpoint = parentvp; lightmode = getRealLightmode(Level, true); @@ -122,6 +127,8 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0); } mClipper->SetViewpoint(Viewpoint); + vClipper->SetViewpoint(Viewpoint); + rClipper->SetViewpoint(Viewpoint); ClearBuffers(); @@ -167,10 +174,10 @@ HWDrawInfo *HWDrawInfo::EndDrawInfo() void HWDrawInfo::ClearBuffers() { - otherFloorPlanes.Clear(); - otherCeilingPlanes.Clear(); - floodFloorSegs.Clear(); - floodCeilingSegs.Clear(); + otherFloorPlanes.Clear(); + otherCeilingPlanes.Clear(); + floodFloorSegs.Clear(); + floodCeilingSegs.Clear(); // clear all the lists that might not have been cleared already MissingUpperTextures.Clear(); @@ -212,7 +219,9 @@ void HWDrawInfo::ClearBuffers() void HWDrawInfo::UpdateCurrentMapSection() { - const int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; + int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; + if (Viewpoint.IsAllowedOoB()) + mapsection = Level->PointInRenderSubsector(Viewpoint.camera->Pos())->mapsection; CurrentMapSections.Set(mapsection); } @@ -225,9 +234,11 @@ void HWDrawInfo::UpdateCurrentMapSection() void HWDrawInfo::SetViewArea() { - auto &vp = Viewpoint; + auto &vp = Viewpoint; // The render_sector is better suited to represent the current position in GL vp.sector = Level->PointInRenderSubsector(vp.Pos)->render_sector; + if (Viewpoint.IsAllowedOoB()) + vp.sector = Level->PointInRenderSubsector(vp.camera->Pos())->render_sector; // Get the heightsec state from the render sector, not the current one! if (vp.sector->GetHeightSec()) @@ -306,16 +317,14 @@ int HWDrawInfo::SetFullbrightFlags(player_t *player) angle_t HWDrawInfo::FrustumAngle() { - float tilt = fabs(Viewpoint.HWAngles.Pitch.Degrees()); + // If pitch is larger than this you can look all around at an FOV of 90 degrees + if (fabs(Viewpoint.HWAngles.Pitch.Degrees()) > 89.0) return 0xffffffff; - // If the pitch is larger than this you can look all around at a FOV of 90° - if (tilt > 46.0f) return 0xffffffff; + double xratio = r_viewwindow.FocalTangent / Viewpoint.PitchCos; + double floatangle = 0.035 + atan ( xratio ) * 48.0 / AspectMultiplier(r_viewwindow.WidescreenRatio); // this is radians + angle_t a1 = DAngle::fromRad(floatangle).BAMs(); - // ok, this is a gross hack that barely works... - // but at least it doesn't overestimate too much... - double floatangle = 2.0 + (45.0 + ((tilt / 1.9)))*Viewpoint.FieldOfView.Degrees() * 48.0 / AspectMultiplier(r_viewwindow.WidescreenRatio) / 90.0; - angle_t a1 = DAngle::fromDeg(floatangle).BAMs(); - if (a1 >= ANGLE_180) return 0xffffffff; + if (a1 >= ANGLE_90) return 0xffffffff; return a1; } @@ -395,6 +404,10 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) const auto &vp = Viewpoint; angle_t a1 = FrustumAngle(); mClipper->SafeAddClipRangeRealAngles(vp.Angles.Yaw.BAMs() + a1, vp.Angles.Yaw.BAMs() - a1); + Viewpoint.FrustAngle = a1; + double a2 = 20.0 + 0.5*Viewpoint.FieldOfView.Degrees(); // FrustumPitch for vertical clipping + if (a2 > 179.0) a2 = 179.0; + vClipper->SafeAddClipRangeDegPitches(vp.HWAngles.Pitch.Degrees() - a2, vp.HWAngles.Pitch.Degrees() + a2); // clip the suplex range // reset the portal manager drawctx->portalState.StartFrame(); @@ -828,6 +841,122 @@ static ETraceStatus CheckForViewpointActor(FTraceResults& res, void* userdata) return TRACE_Stop; } +//========================================================================== +// +// TraceCallbackForDitherTransparency +// Toggles dither flag on anything that occludes the actor's +// position from viewpoint. +// +//========================================================================== + +static ETraceStatus TraceCallbackForDitherTransparency(FTraceResults& res, void* userdata) +{ + int* count = (int*)userdata; + double bf, bc; + (*count)++; + switch(res.HitType) + { + case TRACE_HitWall: + if (!(res.Line->sidedef[res.Side]->Flags & WALLF_DITHERTRANS)) + { + bf = res.Line->sidedef[res.Side]->sector->floorplane.ZatPoint(res.HitPos.XY()); + bc = res.Line->sidedef[res.Side]->sector->ceilingplane.ZatPoint(res.HitPos.XY()); + if ((res.HitPos.Z <= bc) && (res.HitPos.Z >= bf)) + { + res.Line->sidedef[res.Side]->Flags |= WALLF_DITHERTRANS; + } + } + break; + case TRACE_HitFloor: + if (res.HitPos.Z == res.Sector->floorplane.ZatPoint(res.HitPos)) + { + res.Sector->floorplane.dithertransflag = true; + } + else if (res.Sector->e->XFloor.ffloors.Size()) // Maybe it was 3D floors + { + F3DFloor *rover; + int kk; + for (kk = 0; kk < (int)res.Sector->e->XFloor.ffloors.Size(); kk++) + { + rover = res.Sector->e->XFloor.ffloors[kk]; + if ((rover->flags&(FF_EXISTS | FF_RENDERPLANES | FF_THISINSIDE)) == (FF_EXISTS | FF_RENDERPLANES)) + { + if (res.HitPos.Z == rover->top.plane->ZatPoint(res.HitPos)) + { + rover->top.plane->dithertransflag = true; + break; // Out of for loop + } + } + } + } + break; + case TRACE_HitCeiling: + if (res.HitPos.Z == res.Sector->ceilingplane.ZatPoint(res.HitPos)) + { + res.Sector->ceilingplane.dithertransflag = true; + } + else if (res.Sector->e->XFloor.ffloors.Size()) // Maybe it was 3D floors + { + F3DFloor *rover; + int kk; + for (kk = 0; kk < (int)res.Sector->e->XFloor.ffloors.Size(); kk++) + { + rover = res.Sector->e->XFloor.ffloors[kk]; + if ((rover->flags&(FF_EXISTS | FF_RENDERPLANES | FF_THISINSIDE)) == (FF_EXISTS | FF_RENDERPLANES)) + { + if (res.HitPos.Z == rover->bottom.plane->ZatPoint(res.HitPos)) + { + rover->bottom.plane->dithertransflag = true; + break; // Out of for loop + } + } + } + } + break; + case TRACE_HitActor: + default: + break; + } + + return TRACE_ContinueOutOfBounds; +} + + +void HWDrawInfo::SetDitherTransFlags(AActor* actor) +{ + if (actor && actor->Sector) + { + FTraceResults results; + double horix = Viewpoint.Sin * actor->radius; + double horiy = Viewpoint.Cos * actor->radius; + DVector3 actorpos = actor->Pos(); + DVector3 vvec = actorpos - Viewpoint.Pos; + if (Viewpoint.IsOrtho()) + { + vvec += Viewpoint.camera->Pos() - actorpos; + vvec *= 5.0; // Should be 4.0? (since zNear is behind screen by 3*dist in VREyeInfo::GetProjection()) + } + double distance = vvec.Length() - actor->radius; + DVector3 campos = actorpos - vvec; + sector_t* startsec; + int count = 0; + + vvec = vvec.Unit(); + campos.X -= horix; campos.Y += horiy; campos.Z += actor->Height * 0.25; + for (int iter = 0; iter < 3; iter++) + { + startsec = Level->PointInRenderSubsector(campos)->sector; + Trace(campos, startsec, vvec, distance, + 0, 0, actor, results, 0, TraceCallbackForDitherTransparency, &count); + campos.Z += actor->Height * 0.5; + Trace(campos, startsec, vvec, distance, + 0, 0, actor, results, 0, TraceCallbackForDitherTransparency, &count); + campos.Z -= actor->Height * 0.5; + campos.X += horix; campos.Y -= horiy; + } + } +} + void HWDrawInfo::DrawCoronas(FRenderState& state) { @@ -969,13 +1098,17 @@ void HWDrawInfo::DrawScene(int drawmode, FRenderState& state) { static int recursion = 0; static int ssao_portals_available = 0; - const auto& vp = Viewpoint; + auto& vp = Viewpoint; bool applySSAO = false; if (drawmode == DM_MAINVIEW) { ssao_portals_available = gl_ssao_portals; applySSAO = true; + if (r_dithertransparency && vp.IsAllowedOoB()) + { + vp.camera->tracer ? SetDitherTransFlags(vp.camera->tracer) : SetDitherTransFlags(players[consoleplayer].mo); + } } else if (drawmode == DM_OFFSCREEN) { @@ -1040,6 +1173,8 @@ void HWDrawInfo::ProcessScene(bool toscreen, FRenderState& state) drawctx->portalState.BeginScene(); int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; + if (Viewpoint.IsAllowedOoB()) + mapsection = Level->PointInRenderSubsector(Viewpoint.camera->Pos())->mapsection; CurrentMapSections.Set(mapsection); DrawScene(toscreen ? DM_MAINVIEW : DM_OFFSCREEN, state); @@ -1056,10 +1191,10 @@ void HWDrawInfo::AddSubsectorToPortal(FSectorPortalGroup *ptg, subsector_t *sub) auto portal = FindPortal(ptg); if (!portal) { - portal = new HWSectorStackPortal(&drawctx->portalState, ptg); + portal = new HWSectorStackPortal(&drawctx->portalState, ptg); Portals.Push(portal); } - auto ptl = static_cast(portal); + auto ptl = static_cast(portal); ptl->AddSubsector(sub); } diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index 900104345..6114ec2b8 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -147,6 +147,8 @@ struct HWDrawInfo HWPortal *mClipPortal; HWPortal *mCurrentPortal; Clipper *mClipper; + Clipper *vClipper; // Vertical clipper + Clipper *rClipper; // Radar clipper FRenderViewpoint Viewpoint; HWViewpointUniforms VPUniforms; // per-viewpoint uniform state TArray Portals; @@ -254,6 +256,7 @@ public: HWPortal * FindPortal(const void * src); void RenderBSPNode(void *node, FRenderState& state); + void RenderOrthoNoFog(FRenderState& state); void RenderBSP(void *node, bool drawpsprites, FRenderState& state); static HWDrawInfo *StartDrawInfo(HWDrawContext* drawctx, FLevelLocals *lev, HWDrawInfo *parent, FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms); @@ -318,6 +321,8 @@ public: void DrawCoronas(FRenderState& state); void DrawCorona(FRenderState& state, AActor* corona, float coronaFade, double dist); + void SetDitherTransFlags(AActor* actor); + void ProcessLowerMinisegs(TArray &lowersegs, FRenderState& state); void AddSubsectorToPortal(FSectorPortalGroup *portal, subsector_t *sub); diff --git a/src/rendering/hwrenderer/scene/hw_flats.cpp b/src/rendering/hwrenderer/scene/hw_flats.cpp index 9e1a58bfe..f3af5caab 100644 --- a/src/rendering/hwrenderer/scene/hw_flats.cpp +++ b/src/rendering/hwrenderer/scene/hw_flats.cpp @@ -334,7 +334,7 @@ void HWFlat::DrawFlat(HWFlatDispatcher *di, FRenderState &state, bool translucen state.SetObjectColor(FlatColor | 0xff000000); state.SetAddColor(AddColor | 0xff000000); state.ApplyTextureManipulation(TextureFx); - + if (plane.plane.dithertransflag) state.SetEffect(EFF_DITHERTRANS); if (hacktype & SSRF_PLANEHACK) { @@ -390,6 +390,7 @@ void HWFlat::DrawFlat(HWFlatDispatcher *di, FRenderState &state, bool translucen state.SetObjectColor(0xffffffff); state.SetAddColor(0); state.ApplyTextureManipulation(nullptr); + if (plane.plane.dithertransflag) state.SetEffect(EFF_NONE); } //========================================================================== @@ -419,6 +420,8 @@ inline void HWFlat::PutFlat(HWFlatDispatcher *di, bool fog) void HWFlat::Process(HWFlatDispatcher *di, FRenderState& state, sector_t * model, int whichplane, bool fog) { plane.GetFromSector(model, whichplane); + model->ceilingplane.dithertransflag = false; // Resetting this every frame + model->floorplane.dithertransflag = false; // Resetting this every frame if (whichplane != int(ceiling)) { // Flip the normal if the source plane has a different orientation than what we are about to render. @@ -551,7 +554,7 @@ void HWFlat::ProcessSector(HWFlatDispatcher *di, FRenderState& state, sector_t * // // // - if ((which & SSRF_RENDERFLOOR) && (!di->di || (frontsector->floorplane.ZatPoint(vp->Pos) <= vp->Pos.Z && (!section || !(section->flags & FSection::DONTRENDERFLOOR))))) + if (((which & SSRF_RENDERFLOOR) && (!di->di || (((frontsector->floorplane.ZatPoint(vp->Pos) <= vp->Pos.Z) && (!section || !(section->flags & FSection::DONTRENDERFLOOR)))))) && !(di->di && vp->IsOrtho() && (vp->PitchSin < 0.0))) { // process the original floor first. @@ -609,7 +612,7 @@ void HWFlat::ProcessSector(HWFlatDispatcher *di, FRenderState& state, sector_t * // // // - if ((which & SSRF_RENDERCEILING) && ((!di->di || frontsector->ceilingplane.ZatPoint(vp->Pos) >= vp->Pos.Z && (!section || !(section->flags & FSection::DONTRENDERCEILING))))) + if (((which & SSRF_RENDERCEILING) && ((!di->di || ((frontsector->ceilingplane.ZatPoint(vp->Pos) >= vp->Pos.Z) && (!section || !(section->flags & FSection::DONTRENDERCEILING)))))) && !(di->di && vp->IsOrtho() && (vp->PitchSin > 0.0))) { // process the original ceiling first. diff --git a/src/rendering/hwrenderer/scene/hw_portal.cpp b/src/rendering/hwrenderer/scene/hw_portal.cpp index fe593719c..bdbaf8c6e 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.cpp +++ b/src/rendering/hwrenderer/scene/hw_portal.cpp @@ -561,7 +561,8 @@ bool HWMirrorPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clippe angle_t af = di->FrustumAngle(); if (af < ANGLE_180) clipper->SafeAddClipRangeRealAngles(vp.Angles.Yaw.BAMs() + af, vp.Angles.Yaw.BAMs() - af); - clipper->SafeAddClipRange(linedef->v1, linedef->v2); + if (!di->Viewpoint.IsAllowedOoB()) + clipper->SafeAddClipRange(linedef->v1, linedef->v2); return true; } diff --git a/src/rendering/hwrenderer/scene/hw_sky.cpp b/src/rendering/hwrenderer/scene/hw_sky.cpp index 2a65a9f01..7869bc284 100644 --- a/src/rendering/hwrenderer/scene/hw_sky.cpp +++ b/src/rendering/hwrenderer/scene/hw_sky.cpp @@ -130,6 +130,7 @@ void HWSkyInfo::init(HWDrawInfo *di, sector_t* sec, int skypos, int sky1, PalEnt void HWWall::SkyPlane(HWWallDispatcher *di, FRenderState& state, sector_t *sector, int plane, bool allowreflect) { int ptype = -1; + if (di->di && di->di->Viewpoint.IsAllowedOoB()) return; // Couldn't prevent sky portal occlusion. Skybox is bad in ortho too. FSectorPortal *sportal = sector->ValidatePortal(plane); if (sportal != nullptr && sportal->mFlags & PORTSF_INSKYBOX) sportal = nullptr; // no recursions, delete it here to simplify the following code diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 3f84c6982..9304e09c3 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -64,6 +64,7 @@ extern TArray SpriteFrames; extern uint32_t r_renderercaps; const float LARGE_VALUE = 1e19f; +const float MY_SQRT2 = 1.41421356237309504880; // sqrt(2) EXTERN_CVAR(Bool, r_debug_disable_vis_filter) EXTERN_CVAR(Float, transsouls) @@ -550,7 +551,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) } else // traditional "Y" billboard mode { - if (doRoll || !offset.isZero()) + if (doRoll || !offset.isZero() || (actor && (actor->renderflags2 & RF2_ISOMETRICSPRITES))) { mat.MakeIdentity(); @@ -572,6 +573,16 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) mat.Translate(-center.X, -center.Z, -center.Y); } + if (actor && (actor->renderflags2 & RF2_ISOMETRICSPRITES) && di->Viewpoint.IsOrtho()) + { + float angleRad = (FAngle::fromDeg(270.) - HWAngles.Yaw).Radians(); + mat.Translate(center.X, center.Z, center.Y); + mat.Translate(0.0, z2 - center.Z, 0.0); + mat.Rotate(-sin(angleRad), 0, cos(angleRad), -actor->isotheta); + mat.Translate(0.0, center.Z - z2, 0.0); + mat.Translate(-center.X, -center.Z, -center.Y); + } + v[0] = mat * FVector3(x1, z1, y1); v[1] = mat * FVector3(x2, z1, y2); v[2] = mat * FVector3(x1, z2, y1); @@ -974,6 +985,7 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto { bool mirror = false; DAngle ang = (thingpos - vp.Pos).Angle(); + if (di->Viewpoint.IsOrtho()) ang = vp.Angles.Yaw; FTextureID patch; // [ZZ] add direct picnum override if (isPicnumOverride) @@ -1067,7 +1079,25 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto if (thing->renderflags & RF_SPRITEFLIP) // [SP] Flip back thing->renderflags ^= RF_XFLIP; - r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 : sprscale.Y); + // If sprite is isometric, do both vertical scaling and partial rotation to face the camera to compensate for Y-billboarding. + // Using just rotation (about z=0) might cause tall+slender (high aspect ratio) sprites to clip out of collision box + // at the top and clip into whatever is behind them from the viewpoint's perspective. - [DVR] + thing->isoscaleY = 1.0; + thing->isotheta = vp.HWAngles.Pitch.Degrees(); + if (thing->renderflags2 & RF2_ISOMETRICSPRITES) + { + float floordist = thing->radius * vp.floordistfact; + floordist -= 0.5 * r.width * vp.cotfloor; + float sineisotheta = floordist / r.height; + double scl = g_sqrt( 1.0 + sineisotheta * sineisotheta - 2.0 * vp.PitchSin * sineisotheta ); + if ((thing->radius > 0.0) && (scl > fabs(vp.PitchCos))) + { + thing->isoscaleY = scl / ( fabs(vp.PitchCos) > 0.01 ? fabs(vp.PitchCos) : 0.01 ); + thing->isotheta = 180.0 * asin( sineisotheta / thing->isoscaleY ) / M_PI; + } + } + + r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 * thing->isoscaleY : sprscale.Y * thing->isoscaleY); if (thing->renderflags & (RF_ROLLSPRITE|RF_FLATSPRITE)) { @@ -1081,7 +1111,7 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto z1 = z - r.top; z2 = z1 - r.height; - float spriteheight = sprscale.Y * r.height; + float spriteheight = sprscale.Y * r.height * thing->isoscaleY; // Tests show that this doesn't look good for many decorations and corpses if (spriteheight > 0 && gl_spriteclip > 0 && (thing->renderflags & RF_SPRITETYPEMASK) == RF_FACESPRITE) @@ -1100,6 +1130,13 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto x2 = x - viewvecY*rightfac; y1 = y + viewvecX*leftfac; y2 = y + viewvecX*rightfac; + if (thing->renderflags2 & RF2_ISOMETRICSPRITES) // If sprites are drawn from an isometric perspective + { + x1 -= viewvecX * thing->radius * MY_SQRT2; + x2 -= viewvecX * thing->radius * MY_SQRT2; + y1 -= viewvecY * thing->radius * MY_SQRT2; + y2 -= viewvecY * thing->radius * MY_SQRT2; + } break; } case RF_FLATSPRITE: @@ -1140,6 +1177,7 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto } depth = (float)((x - vp.Pos.X) * vp.TanCos + (y - vp.Pos.Y) * vp.TanSin); + if(thing->renderflags2 & RF2_ISOMETRICSPRITES) depth = depth * vp.PitchCos - vp.PitchSin * z2; // Helps with stacking actors with small xy offsets if (isSpriteShadow) depth += 1.f/65536.f; // always sort shadows behind the sprite. // light calculation diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index ecb5661ea..92f04b892 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -82,10 +82,16 @@ void SetSplitPlanes(FRenderState& state, const secplane_t& top, const secplane_t void HWWall::RenderWall(FRenderState &state, int textured) { + if (seg->sidedef->Flags & WALLF_DITHERTRANS) state.SetEffect(EFF_DITHERTRANS); assert(vertcount > 0); state.SetLightIndex(dynlightindex); state.Draw(DT_TriangleFan, vertindex, vertcount); vertexcount += vertcount; + if (seg->sidedef->Flags & WALLF_DITHERTRANS) + { + state.SetEffect(EFF_NONE); + seg->sidedef->Flags &= ~WALLF_DITHERTRANS; // reset this every frame + } } //========================================================================== @@ -2041,6 +2047,8 @@ void HWWall::Process(HWWallDispatcher *di, FRenderState& state, seg_t *seg, sect } bool isportal = seg->linedef->isVisualPortal() && seg->sidedef == seg->linedef->sidedef[0]; + // Don't render portal insides if in orthographic mode + if (di->di) isportal &= !(di->di->Viewpoint.IsOrtho()); //return; // [GZ] 3D middle textures are necessarily two-sided, even if they lack the explicit two-sided flag diff --git a/src/rendering/r_utility.cpp b/src/rendering/r_utility.cpp index 2a5d95586..3e40c3a0c 100644 --- a/src/rendering/r_utility.cpp +++ b/src/rendering/r_utility.cpp @@ -66,7 +66,9 @@ #include "i_system.h" #include "v_draw.h" #include "i_interface.h" +#include "d_main.h" +const float MY_SQRT2 = 1.41421356237309504880; // sqrt(2) // EXTERNAL DATA DECLARATIONS ---------------------------------------------- extern bool DrawFSHUD; // [RH] Defined in d_main.cpp @@ -103,6 +105,8 @@ CVAR (Bool, r_deathcamera, false, CVAR_ARCHIVE) CVAR (Int, r_clearbuffer, 0, 0) CVAR (Bool, r_drawvoxels, true, 0) CVAR (Bool, r_drawplayersprites, true, 0) // [RH] Draw player sprites? +CVARD (Bool, r_radarclipper, false, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_CHEAT, "Use the horizontal clipper from camera->tracer's perspective") +CVARD (Bool, r_dithertransparency, false, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_CHEAT, "Use dithered-transparency shading for actor-occluding level geometry") CUSTOM_CVAR(Float, r_quakeintensity, 1.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { if (self < 0.f) self = 0.f; @@ -155,9 +159,14 @@ FRenderViewpoint::FRenderViewpoint() Sin = 0.0; TanCos = 0.0; TanSin = 0.0; + PitchCos = 0.0; + PitchSin = 0.0; + floordistfact = 0.0; + cotfloor = 0.0; camera = nullptr; sector = nullptr; FieldOfView = DAngle::fromDeg(90.); // Angles in the SCREENWIDTH wide window + ScreenProj = 0.0; TicFrac = 0.0; FrameTime = 0; extralight = 0; @@ -552,39 +561,42 @@ void R_InterpolateView(FRenderViewpoint& viewPoint, const player_t* const player // Due to interpolation this is not necessarily the same as the sector the camera is in. viewPoint.sector = viewLvl->PointInRenderSubsector(viewPoint.Pos)->sector; - bool moved = false; - while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling)) + if (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer()) { - if (viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) + bool moved = false; + while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling)) { - const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); - viewPoint.Pos += offset; - viewPoint.ActorPos += offset; - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; - moved = true; - } - else - { - break; - } - } - - if (!moved) - { - while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor)) - { - if (viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + if (viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) { - const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::floor); + const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); viewPoint.Pos += offset; viewPoint.ActorPos += offset; - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; + moved = true; } else { break; } } + + if (!moved) + { + while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor)) + { + if (viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + { + const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::floor); + viewPoint.Pos += offset; + viewPoint.ActorPos += offset; + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + } + else + { + break; + } + } + } } if (P_NoInterpolation(player, viewPoint.camera)) @@ -680,10 +692,46 @@ void FRenderViewpoint::SetViewAngle(const FViewWindow& viewWindow) TanSin = viewWindow.FocalTangent * Sin; TanCos = viewWindow.FocalTangent * Cos; + PitchSin = Angles.Pitch.Sin(); + PitchCos = Angles.Pitch.Cos(); + + floordistfact = MY_SQRT2 + ( fabs(Cos) > fabs(Sin) ? 1.0/fabs(Cos) : 1.0/fabs(Sin) ); + cotfloor = ( fabs(Cos) > fabs(Sin) ? fabs(Sin/Cos) : fabs(Cos/Sin) ); + const DVector2 v = Angles.Yaw.ToVector(); ViewVector.X = v.X; ViewVector.Y = v.Y; HWAngles.Yaw = FAngle::fromDeg(270.0 - Angles.Yaw.Degrees()); + + if (IsOrtho() && (camera->ViewPos->Offset.XY().Length() > 0.0)) + ScreenProj = 1.34396 / camera->ViewPos->Offset.Length(); // [DVR] Estimated. +/-1 should be top/bottom of screen. + +} + +//========================================================================== +// +// R_IsAllowedOoB() +// Checks if camera actor exists, has viewpos, +// and viewpos has VPSF_ALLOWOUTOFBOUNDS flag set. +// +//========================================================================== + +bool FRenderViewpoint::IsAllowedOoB() +{ + return (camera && camera->ViewPos && (camera->ViewPos->Flags & VPSF_ALLOWOUTOFBOUNDS)); +} + +//========================================================================== +// +// R_IsOrtho() +// Checks if camera actor exists, has viewpos, +// and viewpos has VPSF_ORTHOGRAPHIC flag set. +// +//========================================================================== + +bool FRenderViewpoint::IsOrtho() +{ + return (camera && camera->ViewPos && (camera->ViewPos->Flags & VPSF_ORTHOGRAPHIC)); } //========================================================================== @@ -1017,14 +1065,15 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA viewPoint.SetViewAngle(viewWindow); // Keep the view within the sector's floor and ceiling - if (viewPoint.sector->PortalBlocksMovement(sector_t::ceiling)) + // But allow VPSF_ALLOWOUTOFBOUNDS camera viewpoints to go out of bounds when using hardware renderer + if (viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer())) { const double z = viewPoint.sector->ceilingplane.ZatPoint(viewPoint.Pos) - 4.0; if (viewPoint.Pos.Z > z) viewPoint.Pos.Z = z; } - if (viewPoint.sector->PortalBlocksMovement(sector_t::floor)) + if (viewPoint.sector->PortalBlocksMovement(sector_t::floor) && (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer())) { const double z = viewPoint.sector->floorplane.ZatPoint(viewPoint.Pos) + 4.0; if (viewPoint.Pos.Z < z) diff --git a/src/rendering/r_utility.h b/src/rendering/r_utility.h index 3013961eb..ee12ecf36 100644 --- a/src/rendering/r_utility.h +++ b/src/rendering/r_utility.h @@ -33,10 +33,16 @@ struct FRenderViewpoint double Sin; // sin(Angles.Yaw) double TanCos; // FocalTangent * cos(Angles.Yaw) double TanSin; // FocalTangent * sin(Angles.Yaw) + double PitchCos; // cos(Angles.Pitch) + double PitchSin; // sin(Angles.Pitch) + double floordistfact; // used for isometric sprites Y-billboarding compensation in hw_sprites.cpp + double cotfloor; // used for isometric sprites Y-billboarding compensation in hw_sprites.cpp + angle_t FrustAngle; // FrustumAngle() result AActor *camera; // camera actor sector_t *sector; // [RH] keep track of sector viewing from DAngle FieldOfView; // current field of view + double ScreenProj; // Screen projection factor for orthographic projection double TicFrac; // fraction of tic for interpolation uint32_t FrameTime; // current frame's time in tics. @@ -45,6 +51,8 @@ struct FRenderViewpoint bool showviewer; // show the camera actor? bool bForceNoViewer; // Never show the camera Actor. void SetViewAngle(const FViewWindow& viewWindow); + bool IsAllowedOoB(); // Checks if camera actor exists, has viewpos, and viewpos has VPSF_ALLOWOUTOFBOUNDS flag set + bool IsOrtho(); // Checks if camera actor exists, has viewpos, and viewpos has VPSF_ORTHOGRAPHIC flag set }; diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 570dd2a4e..3993cd745 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -385,6 +385,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(RF2, FLIPSPRITEOFFSETY, AActor, renderflags2), DEFINE_FLAG(RF2, CAMFOLLOWSPLAYER, AActor, renderflags2), DEFINE_FLAG(RF2, NOMIPMAP, AActor, renderflags2), + DEFINE_FLAG(RF2, ISOMETRICSPRITES, AActor, renderflags2), // Bounce flags DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags), diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index ba3987517..f0274aa1a 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -1,3 +1,19 @@ +//=========================================================================== +// +// RGB to HSV +// +//=========================================================================== + +vec3 rgb2hsv(vec3 c) +{ + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} void main() { @@ -13,6 +29,26 @@ void main() FragColor = ProcessLightMode(material); +#ifdef DITHERTRANS + int index = (int(pixelpos.x) % 8) * 8 + int(pixelpos.y) % 8; + const float DITHER_THRESHOLDS[64] = + { + 1.0 / 65.0, 33.0 / 65.0, 9.0 / 65.0, 41.0 / 65.0, 3.0 / 65.0, 35.0 / 65.0, 11.0 / 65.0, 43.0 / 65.0, + 49.0 / 65.0, 17.0 / 65.0, 57.0 / 65.0, 25.0 / 65.0, 51.0 / 65.0, 19.0 / 65.0, 59.0 / 65.0, 27.0 / 65.0, + 13.0 / 65.0, 45.0 / 65.0, 5.0 / 65.0, 37.0 / 65.0, 15.0 / 65.0, 47.0 / 65.0, 7.0 / 65.0, 39.0 / 65.0, + 61.0 / 65.0, 29.0 / 65.0, 53.0 / 65.0, 21.0 / 65.0, 63.0 / 65.0, 31.0 / 65.0, 55.0 / 65.0, 23.0 / 65.0, + 4.0 / 65.0, 36.0 / 65.0, 12.0 / 65.0, 44.0 / 65.0, 2.0 / 65.0, 34.0 / 65.0, 10.0 / 65.0, 42.0 / 65.0, + 52.0 / 65.0, 20.0 / 65.0, 60.0 / 65.0, 28.0 / 65.0, 50.0 / 65.0, 18.0 / 65.0, 58.0 / 65.0, 26.0 / 65.0, + 16.0 / 65.0, 48.0 / 65.0, 8.0 / 65.0, 40.0 / 65.0, 14.0 / 65.0, 46.0 / 65.0, 6.0 / 65.0, 38.0 / 65.0, + 64.0 / 65.0, 32.0 / 65.0, 56.0 / 65.0, 24.0 / 65.0, 62.0 / 65.0, 30.0 / 65.0, 54.0 / 65.0, 22.0 /65.0 + }; + + vec3 fragHSV = rgb2hsv(FragColor.rgb); + float brightness = clamp(1.5*fragHSV.z, 0.1, 1.0); + if (DITHER_THRESHOLDS[index] < brightness) discard; + else FragColor *= 0.5; +#endif + #ifdef GBUFFER_PASS FragFog = vec4(AmbientOcclusionColor(), 1.0); FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); diff --git a/wadsrc/static/zscript/actors/shared/camera.zs b/wadsrc/static/zscript/actors/shared/camera.zs index d7826c051..463ad6178 100644 --- a/wadsrc/static/zscript/actors/shared/camera.zs +++ b/wadsrc/static/zscript/actors/shared/camera.zs @@ -128,3 +128,87 @@ class AimingCamera : SecurityCamera } } + +class SpectatorCamera : Actor +{ + + bool chasingtracer; + double lagdistance; // camera gives chase (lazy follow) if tracer gets > lagdistance away from camera.pos + int chasemode; // 0: chase until tracer centered, 1: same but only when tracer is moving, 2: stop chase if tracer within lagdistance + property lagdistance : lagdistance; + property chasingtracer : chasingtracer; + property chasemode : chasemode; + + default + { + +NOBLOCKMAP + +NOGRAVITY + +NOINTERACTION + RenderStyle "None"; + CameraHeight 0; + SpectatorCamera.chasingtracer false; + SpectatorCamera.lagdistance 0.0; + SpectatorCamera.chasemode 0; + } + + void Init(double dist, double yaw, double inpitch, int inflags) + { + + double zshift = 0.0; + if(tracer != NULL) + { + if(player != NULL) zshift = -0.25*tracer.height; + else zshift = 0.5*tracer.height; + } + else if (player != NULL && player.mo != NULL) zshift = -0.5*player.mo.height; + + SetViewPos((-dist*Cos(yaw)*Cos(inpitch), -dist*Sin(yaw)*Cos(inpitch), dist*Sin(inpitch)+zshift), inflags); + LookAtSelf(inpitch); + } + + void LookAtSelf(double inpitch) + { + if(ViewPos.Offset.length() > 0.) + { + Vector3 negviewpos = (-1.0) * ViewPos.Offset; + angle = negviewpos.Angle(); + pitch = inpitch; + } + } + + override void Tick() + { + if(tracer != NULL) + { + Vector3 distvec = tracer.pos - pos; + double dist = distvec.length(); + if((dist <= 4 && chasingtracer) || lagdistance <= 0.0) // Keep tracer centered on screen + { + SetOrigin(tracer.pos, true); + chasingtracer = false; + } + else // Lazy follow tracer + { + if(dist >= 2*lagdistance) + { + SetOrigin(tracer.pos, true); + chasingtracer = false; + } + else if(dist > lagdistance && !chasingtracer) chasingtracer = true; + + if(chasingtracer) + { + speed = tracer.vel.xy.length()/dist; + if((speed == 0.0) && (chasemode == 0)) speed = tracer.speed/dist; + SetOrigin(pos + 2*distvec*speed, true); + if(chasemode > 1) chasingtracer = false; + } + } + } + else if(player != NULL && player.mo != NULL) + { + cameraFOV = player.FOV; + SetOrigin(player.mo.pos, true); + } + } +} diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index 38bf37a65..d99daa9e2 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -421,8 +421,10 @@ enum EActivationFlags // [MC] Flags for SetViewPos. enum EViewPosFlags { - VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. - VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. + VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ALLOWOUTOFBOUNDS = 1 << 3, // Allow viewpoint to go out of bounds (hardware renderer only). + VPSF_ORTHOGRAPHIC = 1 << 4, // Use orthographic projection (hardware renderer only). }; // Flags for A_TakeInventory and A_TakeFromTarget @@ -1506,4 +1508,4 @@ enum EModelFlags MDL_MODELSAREATTACHMENTS = 1<<12, // any model index after 0 is treated as an attachment, and therefore will use the bone results of index 0 MDL_CORRECTPIXELSTRETCH = 1<<13, // ensure model does not distort with pixel stretch when pitch/roll is applied MDL_FORCECULLBACKFACES = 1<<14, -}; \ No newline at end of file +}; From 95b264bdb6158c8e62ec2ded6c1e5ee7c0719c6c Mon Sep 17 00:00:00 2001 From: dileepvr Date: Sun, 11 Aug 2024 08:04:40 -0600 Subject: [PATCH 167/414] Isometric Mode and Robin (#2618) * Feature-complete isometric mode fork. * Dithered transparency condition tweaks. * Dithered transparency for non-corpse monsters only (and missiles). * SpectatorCamera vertical shift. * Including math.h in hw_sprites.cpp to keep visual studio happy (it couldn't find M_SQRT2 definition). * Defining MY_SQRT2 in hw_sprites.cpp to keep visual studio happy (it couldn't find M_SQRT2 definition). * Defining MY_SQRT2 in r_utility.cpp also to keep visual studio happy. * retrigger checks * Have correct sprite angle-frame face the camera with orthographic projection enabled. * Dithered Transparency now works properly on 3D floors. Moved that dither-trans flag setting code within hw_bsp.cpp to handle double-processing of linedefs. Added helper functions to FRenderViewpoint class 'bool IsOrtho()' and 'bool IsAllowedOoB()' to clean up checks everywhere in the code. * Fixed indents. Added bbox property to subsector struct and use it instead of BSP nodes and Clippers (creating a bbox around viewpoint and checking for overlap) in orthographic mode when no fog of war is active. Turns out to be much faster. Though you need really big maps (Winter's Fury MAP01) to see a difference in fps. * Non-linux checks don't like uint. Changed to unsigned int. * Small change of a float to camera.zs. Ignore for testing. Should make no difference. * Update actor.h to remain mergeable RF2_NOMIPMAP was introduced, so I had to displace RF_ISOMETRICSPRITES to next bit. --- src/am_map.cpp | 4 +- .../rendering/hwrenderer/data/hw_cvars.h | 3 + .../hwrenderer/data/hw_renderstate.h | 2 +- .../hwrenderer/data/hw_shaderpatcher.cpp | 1 + .../rendering/hwrenderer/data/hw_vrmodes.cpp | 20 +- .../rendering/hwrenderer/data/hw_vrmodes.h | 2 +- src/common/utility/m_bbox.h | 7 + src/gamedata/g_mapinfo.cpp | 1 + src/gamedata/g_mapinfo.h | 3 +- src/gamedata/r_defs.h | 4 + src/maploader/maploader.cpp | 19 ++ src/playsim/actor.h | 9 +- src/playsim/p_map.cpp | 34 ++-- src/playsim/p_trace.cpp | 4 + src/playsim/p_trace.h | 1 + src/rendering/hwrenderer/hw_entrypoint.cpp | 6 +- src/rendering/hwrenderer/scene/hw_bsp.cpp | 190 +++++++++++++++++- src/rendering/hwrenderer/scene/hw_clipper.cpp | 144 ++++++++++++- src/rendering/hwrenderer/scene/hw_clipper.h | 18 +- .../hwrenderer/scene/hw_drawinfo.cpp | 118 +++++++++-- src/rendering/hwrenderer/scene/hw_drawinfo.h | 5 + src/rendering/hwrenderer/scene/hw_flats.cpp | 11 +- src/rendering/hwrenderer/scene/hw_portal.cpp | 3 +- src/rendering/hwrenderer/scene/hw_sky.cpp | 1 + src/rendering/hwrenderer/scene/hw_sprites.cpp | 44 +++- src/rendering/hwrenderer/scene/hw_walls.cpp | 8 + src/rendering/r_utility.cpp | 97 ++++++--- src/rendering/r_utility.h | 8 + src/scripting/thingdef_data.cpp | 1 + wadsrc/static/shaders/glsl/main.fp | 38 ++++ wadsrc/static/shaders_gles/glsl/main.fp | 5 + wadsrc/static/zscript/actors/shared/camera.zs | 84 ++++++++ wadsrc/static/zscript/constants.zs | 8 +- 33 files changed, 819 insertions(+), 84 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 6ee8165da..c547884b2 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2816,7 +2816,7 @@ void DAutomap::drawPlayers () int numarrowlines; double vh = players[consoleplayer].viewheight; - DVector2 pos = players[consoleplayer].camera->InterpolatedPosition(r_viewpoint.TicFrac).XY(); + DVector2 pos = players[consoleplayer].mo->InterpolatedPosition(r_viewpoint.TicFrac).XY(); pt.x = pos.X; pt.y = pos.Y; if (am_rotate == 1 || (am_rotate == 2 && viewactive)) @@ -2826,7 +2826,7 @@ void DAutomap::drawPlayers () } else { - angle = players[consoleplayer].camera->InterpolatedAngles(r_viewpoint.TicFrac).Yaw; + angle = players[consoleplayer].mo->InterpolatedAngles(r_viewpoint.TicFrac).Yaw; } if (am_cheat != 0 && CheatMapArrow.Size() > 0) diff --git a/src/common/rendering/hwrenderer/data/hw_cvars.h b/src/common/rendering/hwrenderer/data/hw_cvars.h index cf2364979..7f84ba09e 100644 --- a/src/common/rendering/hwrenderer/data/hw_cvars.h +++ b/src/common/rendering/hwrenderer/data/hw_cvars.h @@ -54,3 +54,6 @@ EXTERN_CVAR(Int, gl_shadowmap_filter) EXTERN_CVAR(Bool, gl_brightfog) EXTERN_CVAR(Bool, gl_lightadditivesurfaces) EXTERN_CVAR(Bool, gl_notexturefill) + +EXTERN_CVAR(Bool, r_radarclipper) +EXTERN_CVAR(Bool, r_dithertransparency) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 05fd6bcbf..41e4b50a3 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -25,7 +25,7 @@ enum ERenderEffect EFF_SPHEREMAP, EFF_BURN, EFF_STENCIL, - + EFF_DITHERTRANS, MAX_EFFECTS }; diff --git a/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp b/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp index 9049e5090..d32b09e23 100644 --- a/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp +++ b/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp @@ -299,6 +299,7 @@ const FEffectShader effectshaders[] = { "spheremap", "shaders/glsl/main.vp", "shaders/glsl/main.fp", "shaders/glsl/func_normal.fp", "shaders/glsl/material_normal.fp", "#define SPHEREMAP\n#define NO_ALPHATEST\n" }, { "burn", "shaders/glsl/main.vp", "shaders/glsl/burn.fp", nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, { "stencil", "shaders/glsl/main.vp", "shaders/glsl/stencil.fp", nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, + { "dithertrans", "shaders/glsl/main.vp", "shaders/glsl/main.fp", "shaders/glsl/func_normal.fp", "shaders/glsl/material_normal.fp", "#define NO_ALPHATEST\n#define DITHERTRANS\n" }, }; int DFrameBuffer::GetShaderCount() diff --git a/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp b/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp index c51ce2ee9..8cb3c94e5 100644 --- a/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp +++ b/src/common/rendering/hwrenderer/data/hw_vrmodes.cpp @@ -146,11 +146,27 @@ float VREyeInfo::getShift() const return vr_swap_eyes ? -res : res; } -VSMatrix VREyeInfo::GetProjection(float fov, float aspectRatio, float fovRatio) const +VSMatrix VREyeInfo::GetProjection(float fov, float aspectRatio, float fovRatio, bool iso_ortho) const { VSMatrix result; - if (mShiftFactor == 0) + if (iso_ortho) // Orthographic projection for isometric viewpoint + { + double zNear = -3.0/fovRatio; // screen->GetZNear(); + double zFar = screen->GetZFar(); + + double fH = tan(DEG2RAD(fov) / 2) / fovRatio; + double fW = fH * aspectRatio * mScaleFactor; + double left = -fW; + double right = fW; + double bottom = -fH; + double top = fH; + + VSMatrix fmat(1); + fmat.ortho((float)left, (float)right, (float)bottom, (float)top, (float)zNear, (float)zFar); + return fmat; + } + else if (mShiftFactor == 0) { float fovy = (float)(2 * RAD2DEG(atan(tan(DEG2RAD(fov) / 2) / fovRatio))); result.perspective(fovy, aspectRatio, screen->GetZNear(), screen->GetZFar()); diff --git a/src/common/rendering/hwrenderer/data/hw_vrmodes.h b/src/common/rendering/hwrenderer/data/hw_vrmodes.h index 26c9fd211..989281520 100644 --- a/src/common/rendering/hwrenderer/data/hw_vrmodes.h +++ b/src/common/rendering/hwrenderer/data/hw_vrmodes.h @@ -27,7 +27,7 @@ struct VREyeInfo float mShiftFactor; float mScaleFactor; - VSMatrix GetProjection(float fov, float aspectRatio, float fovRatio) const; + VSMatrix GetProjection(float fov, float aspectRatio, float fovRatio, bool iso_ortho) const; DVector3 GetViewShift(float yaw) const; private: float getShift() const; diff --git a/src/common/utility/m_bbox.h b/src/common/utility/m_bbox.h index f117c290b..7f622a6ba 100644 --- a/src/common/utility/m_bbox.h +++ b/src/common/utility/m_bbox.h @@ -72,6 +72,13 @@ public: m_Box[BOXTOP] = pos.Y; } + bool CheckOverlap(const FBoundingBox &box2) + { + bool hori = (Left() > box2.Right()) || (Right() < box2.Left()); + bool vert = (Bottom() > box2.Top()) || (Top() < box2.Bottom()); + return !(hori || vert); // [DVR] For alternative space partition + } + inline double Top () const { return m_Box[BOXTOP]; } inline double Bottom () const { return m_Box[BOXBOTTOM]; } inline double Left () const { return m_Box[BOXLEFT]; } diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 748d7cacd..3d9bc8bd9 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -1819,6 +1819,7 @@ MapFlagHandlers[] = { "disableskyboxao", MITYPE_CLRFLAG3, LEVEL3_SKYBOXAO, 0 }, { "avoidmelee", MITYPE_SETFLAG3, LEVEL3_AVOIDMELEE, 0 }, { "attenuatelights", MITYPE_SETFLAG3, LEVEL3_ATTENUATE, 0 }, + { "nofogofwar", MITYPE_SETFLAG3, LEVEL3_NOFOGOFWAR, 0 }, { "nobotnodes", MITYPE_IGNORE, 0, 0 }, // Skulltag option: nobotnodes { "nopassover", MITYPE_COMPATFLAG, COMPATF_NO_PASSMOBJ, 0 }, { "passover", MITYPE_CLRCOMPATFLAG, COMPATF_NO_PASSMOBJ, 0 }, diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index b56d3b632..73b46d7e0 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -269,7 +269,8 @@ enum ELevelFlags : unsigned int LEVEL3_NOSHADOWMAP = 0x00010000, // disables shadowmaps for a given level. LEVEL3_AVOIDMELEE = 0x00020000, // global flag needed for proper MBF support. LEVEL3_NOJUMPDOWN = 0x00040000, // only for MBF21. Inverse of MBF's dog_jumping flag. - LEVEL3_LIGHTCREATED = 0x00080000, // a light had been created in the last frame + LEVEL3_LIGHTCREATED = 0x00080000, // a light had been created in the last frame + LEVEL3_NOFOGOFWAR = 0x00100000, // disables effect of r_radarclipper CVAR on this map }; diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index 3333a0c7a..943893c66 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -303,6 +303,7 @@ struct secplane_t DVector3 normal; double D, negiC; // negative iC because that also saves a negation in all methods using this. public: + bool dithertransflag; // Render plane with dithering transparency shader (gets reset every frame) friend FSerializer &Serialize(FSerializer &arc, const char *key, secplane_t &p, secplane_t *def); void set(double aa, double bb, double cc, double dd) @@ -1179,6 +1180,8 @@ enum WALLF_ABSLIGHTING_TOP = WALLF_ABSLIGHTING_TIER << 0, // Top tier light is absolute instead of relative WALLF_ABSLIGHTING_MID = WALLF_ABSLIGHTING_TIER << 1, // Mid tier light is absolute instead of relative WALLF_ABSLIGHTING_BOTTOM = WALLF_ABSLIGHTING_TIER << 2, // Bottom tier light is absolute instead of relative + + WALLF_DITHERTRANS = 8192, // Render with dithering transparency shader (gets reset every frame) }; struct side_t @@ -1654,6 +1657,7 @@ struct subsector_t uint32_t numlines; uint16_t flags; short mapsection; + FBoundingBox bbox; // [DVR] For alternative space culling in orthographic projection with no fog of war // subsector related GL data int validcount; diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 826afc85f..fe050d13c 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3262,6 +3262,25 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) Level->aabbTree = new DoomLevelAABBTree(Level); Level->levelMesh = new DoomLevelMesh(*Level); + + // [DVR] Populate subsector->bbox for alternative space culling in orthographic projection with no fog of war + subsector_t* sub = &Level->subsectors[0]; + seg_t* seg; + for (unsigned int kk = 0; kk < Level->subsectors.Size(); kk++) + { + sub[kk].bbox.ClearBox(); + unsigned int count = sub[kk].numlines; + seg = sub[kk].firstline; + while(count--) + { + if((seg->v1 != nullptr) && (seg->v2 != nullptr)) + { + sub[kk].bbox.AddToBox(seg->v1->fPos()); + sub[kk].bbox.AddToBox(seg->v2->fPos()); + } + seg++; + } + } } //========================================================================== diff --git a/src/playsim/actor.h b/src/playsim/actor.h index fa0e23bf2..745c4be9d 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -502,6 +502,7 @@ enum ActorRenderFlag2 RF2_FLIPSPRITEOFFSETY = 0x0020, RF2_CAMFOLLOWSPLAYER = 0x0040, // Matches the cam's base position and angles to the main viewpoint. RF2_NOMIPMAP = 0x0080, // [Nash] forces no mipmapping on sprites. Useful for tiny sprites that need to remain visually crisp + RF2_ISOMETRICSPRITES = 0x0100, }; // This translucency value produces the closest match to Heretic's TINTTAB. @@ -692,8 +693,10 @@ struct FDropItem enum EViewPosFlags // [MC] Flags for SetViewPos. { - VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. - VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. + VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ALLOWOUTOFBOUNDS = 1 << 3, // Allow viewpoint to go out of bounds (hardware renderer only). + VPSF_ORTHOGRAPHIC = 1 << 4, // Use orthographic projection (hardware renderer only). }; enum EAnimOverrideFlags @@ -1123,6 +1126,8 @@ public: DAngle SpriteAngle; DAngle SpriteRotation; DVector2 AutomapOffsets; // Offset the actors' sprite view on the automap by these coordinates. + float isoscaleY; // Y-scale to compensate for Y-billboarding for isometric sprites + float isotheta; // Rotation angle to compensate for Y-billboarding for isometric sprites DRotator Angles; DRotator ViewAngles; // Angle offsets for cameras TObjPtr ViewPos; // Position offsets for cameras diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index a79f912ae..af8df92a7 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -82,6 +82,7 @@ #include "p_blockmap.h" #include "p_3dmidtex.h" #include "vm.h" +#include "d_main.h" #include "decallib.h" @@ -5577,33 +5578,42 @@ void R_OffsetView(FRenderViewpoint& viewPoint, const DVector3& dir, const double { const DAngle baseYaw = dir.Angle(); FTraceResults trace = {}; - if (Trace(viewPoint.Pos, viewPoint.sector, dir, distance, 0u, 0u, nullptr, trace)) + if (viewPoint.IsAllowedOoB() && V_IsHardwareRenderer()) + { + viewPoint.Pos += dir * distance; + viewPoint.sector = viewPoint.ViewLevel->PointInRenderSubsector(viewPoint.Pos)->sector; + } + else if (Trace(viewPoint.Pos, viewPoint.sector, dir, distance, 0u, 0u, nullptr, trace)) { viewPoint.Pos = trace.HitPos - trace.HitVector * min(5.0, trace.Distance); viewPoint.sector = viewPoint.ViewLevel->PointInRenderSubsector(viewPoint.Pos)->sector; + viewPoint.Angles.Yaw += deltaangle(baseYaw, trace.SrcAngleFromTarget); } else { viewPoint.Pos = trace.HitPos; viewPoint.sector = trace.Sector; + viewPoint.Angles.Yaw += deltaangle(baseYaw, trace.SrcAngleFromTarget); } - viewPoint.Angles.Yaw += deltaangle(baseYaw, trace.SrcAngleFromTarget); // TODO: Why does this even need to be done? Please fix tracers already. - if (dir.Z < 0.0) + if (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer()) { - while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor) && viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + if (dir.Z < 0.0) { - viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::floor); - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor) && viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + { + viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::floor); + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + } } - } - else if (dir.Z > 0.0) - { - while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) + else if (dir.Z > 0.0) { - viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; + while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) + { + viewPoint.Pos += viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; + } } } } diff --git a/src/playsim/p_trace.cpp b/src/playsim/p_trace.cpp index 7e47a7323..ed37d5e34 100644 --- a/src/playsim/p_trace.cpp +++ b/src/playsim/p_trace.cpp @@ -633,6 +633,9 @@ cont: case TRACE_Stop: return false; + case TRACE_ContinueOutOfBounds: + return true; + case TRACE_Abort: Results->HitType = TRACE_HitNone; return false; @@ -732,6 +735,7 @@ bool FTraceInfo::ThingCheck(intercept_t *in, double dist, DVector3 hit) switch (TraceCallback(*Results, TraceCallbackData)) { case TRACE_Continue: return true; + case TRACE_ContinueOutOfBounds: return true; case TRACE_Stop: return false; case TRACE_Abort: Results->HitType = TRACE_HitNone; return false; case TRACE_Skip: Results->HitType = TRACE_HitNone; return true; diff --git a/src/playsim/p_trace.h b/src/playsim/p_trace.h index ef5318678..9035ae965 100644 --- a/src/playsim/p_trace.h +++ b/src/playsim/p_trace.h @@ -109,6 +109,7 @@ enum ETraceStatus TRACE_Continue, // continue the trace, returning this hit if there are none further along TRACE_Skip, // continue the trace; do not return this hit TRACE_Abort, // stop the trace, returning no hits + TRACE_ContinueOutOfBounds, // continue the trace through walls; don't use this for railguns }; bool Trace(const DVector3 &start, sector_t *sector, const DVector3 &direction, double maxDist, diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index e80d7ef66..bfa0d8b1c 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -163,7 +163,11 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou di->Viewpoint.FieldOfView = DAngle::fromDeg(fov); // Set the real FOV for the current scene (it's not necessarily the same as the global setting in r_viewpoint) // Stereo mode specific perspective projection - di->VPUniforms.mProjectionMatrix = eye.GetProjection(fov, ratio, fovratio); + float inv_iso_dist = 1.0f; + bool iso_ortho = (camera->ViewPos != NULL) && (camera->ViewPos->Flags & VPSF_ORTHOGRAPHIC); + if (iso_ortho && (camera->ViewPos->Offset.Length() > 0)) inv_iso_dist = 1.0/camera->ViewPos->Offset.Length(); + di->VPUniforms.mProjectionMatrix = eye.GetProjection(fov, ratio, fovratio * inv_iso_dist, iso_ortho); + // Stereo mode specific viewpoint adjustment vp.Pos += eye.GetViewShift(vp.HWAngles.Yaw.Degrees()); di->SetupView(RenderState, vp.Pos.X, vp.Pos.Y, vp.Pos.Z, false, false); diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index 12439669c..fafa680d4 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -51,11 +51,24 @@ CVAR(Bool, gl_multithread, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) EXTERN_CVAR(Float, r_actorspriteshadowdist) +EXTERN_CVAR(Bool, r_radarclipper) +EXTERN_CVAR(Bool, r_dithertransparency) thread_local bool isWorkerThread; ctpl::thread_pool renderPool(1); bool inited = false; +const int MAXDITHERACTORS = 20; // Maximum number of enemies that can set dither-transparency flags +AActor* RenderedTargets[MAXDITHERACTORS]; +int RTnum; + +void ClearDitherTargets() +{ + RTnum = 0; // Number of rendered enemies/targets + for (int ii = 0; ii < MAXDITHERACTORS; ii++) + RenderedTargets[ii] = nullptr; +} + struct RenderJob { enum @@ -269,6 +282,20 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) auto &clipper = *mClipper; angle_t startAngle = clipper.GetClipAngle(seg->v2); angle_t endAngle = clipper.GetClipAngle(seg->v1); + auto &clipperr = *rClipper; + angle_t startAngleR = clipperr.PointToPseudoAngle(seg->v2->fX(), seg->v2->fY()); + angle_t endAngleR = clipperr.PointToPseudoAngle(seg->v1->fX(), seg->v1->fY()); + + if(r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR) && (startAngleR - endAngleR >= ANGLE_180)) + { + if (!seg->backsector) clipperr.SafeAddClipRange(startAngleR, endAngleR); + else if((seg->sidedef != nullptr) && !uint8_t(seg->sidedef->Flags & WALLF_POLYOBJ) && (currentsector->sectornum != seg->backsector->sectornum)) + { + if (in_area == area_default) in_area = hw_CheckViewArea(seg->v2, seg->v1, seg->frontsector, seg->backsector); + backsector = hw_FakeFlat(seg->backsector, in_area, true); + if (hw_CheckClip(seg->sidedef, currentsector, backsector)) clipperr.SafeAddClipRange(startAngleR, endAngleR); + } + } // Back side, i.e. backface culling - read: endAngle >= startAngle! if (startAngle-endAngleflags & SSECMF_DRAWN)) { - if (clipper.SafeCheckRange(startAngle, endAngle)) + if (clipper.SafeCheckRange(startAngle, endAngle) && (!r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR))) { - currentsubsector->flags |= SSECMF_DRAWN; + currentsubsector->flags |= SSECMF_DRAWN; + } + if ((r_radarclipper || !(Level->flags3 & LEVEL3_NOFOGOFWAR)) && clipperr.SafeCheckRange(startAngleR, endAngleR)) + { + currentsubsector->flags |= SSECMF_DRAWN; } } return; } - if (!clipper.SafeCheckRange(startAngle, endAngle)) + if (!clipper.SafeCheckRange(startAngle, endAngle)) { return; } - currentsubsector->flags |= SSECMF_DRAWN; + + auto &clipperv = *vClipper; + angle_t startPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->floorplane.ZatPoint(seg->v1)); + angle_t endPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->ceilingplane.ZatPoint(seg->v1)); + angle_t startPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->floorplane.ZatPoint(seg->v2)); + angle_t endPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->ceilingplane.ZatPoint(seg->v2)); + angle_t temp; + // Wall can be tilted from viewpoint perspective. Find vertical extent on screen in psuedopitch units (0 to 2, bottom to top) + if(int(startPitch) > int(startPitch2)) // Handle zero crossing + { + temp = startPitch; startPitch = startPitch2; startPitch2 = temp; // exchange + } + if(int(endPitch) > int(endPitch2)) // Handle zero crossing + { + temp = endPitch; endPitch = endPitch2; endPitch2 = temp; // exchange + } + + if (!clipperv.SafeCheckRange(startPitch, endPitch2)) + { + return; + } + + if (!r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR) || clipperr.SafeCheckRange(startAngleR, endAngleR)) + currentsubsector->flags |= SSECMF_DRAWN; uint8_t ispoly = uint8_t(seg->sidedef->Flags & WALLF_POLYOBJ); if (!seg->backsector) { - clipper.SafeAddClipRange(startAngle, endAngle); + if(!Viewpoint.IsAllowedOoB()) + if (!(seg->sidedef->Flags & WALLF_DITHERTRANS)) clipper.SafeAddClipRange(startAngle, endAngle); } else if (!ispoly) // Two-sided polyobjects never obstruct the view { @@ -325,7 +380,8 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) if (hw_CheckClip(seg->sidedef, currentsector, backsector)) { - clipper.SafeAddClipRange(startAngle, endAngle); + if(!Viewpoint.IsAllowedOoB() && !(seg->sidedef->Flags & WALLF_DITHERTRANS)) + clipper.SafeAddClipRange(startAngle, endAngle); } } } @@ -526,13 +582,14 @@ void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector) { sector_t * sec=sub->sector; // Handle all things in sector. - const auto &vp = Viewpoint; + const auto &vp = Viewpoint; for (auto p = sec->touching_renderthings; p != nullptr; p = p->m_snext) { auto thing = p->m_thing; if (thing->validcount == validcount) continue; thing->validcount = validcount; + if(Viewpoint.IsAllowedOoB() && thing->Sector->isSecret() && thing->Sector->wasSecret() && !r_radarclipper) continue; // This covers things that are touching non-secret sectors FIntCVar *cvar = thing->GetInfo()->distancecheck; if (cvar != nullptr && *cvar >= 0) { @@ -666,6 +723,51 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) fakesector=hw_FakeFlat(sector, in_area, false); + if(Viewpoint.IsAllowedOoB() && sector->isSecret() && sector->wasSecret() && !r_radarclipper) return; + + // cull everything if subsector outside vertical clipper + if ((sub->polys == nullptr) && (!Viewpoint.IsOrtho() || !((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper))) + { + auto &clipper = *mClipper; + auto &clipperv = *vClipper; + auto &clipperr = *rClipper; + int count = sub->numlines; + seg_t * seg = sub->firstline; + bool anglevisible = false; + bool pitchvisible = false; + bool radarvisible = false; + angle_t pitchtemp; + angle_t pitchmin = ANGLE_90; + angle_t pitchmax = 0; + + while (count--) + { + if((seg->v1 != nullptr) && (seg->v2 != nullptr)) + { + angle_t startAngle = clipper.GetClipAngle(seg->v2); + angle_t endAngle = clipper.GetClipAngle(seg->v1); + if (startAngle-endAngle >= ANGLE_180) anglevisible |= clipper.SafeCheckRange(startAngle, endAngle); + angle_t startAngleR = clipperr.PointToPseudoAngle(seg->v2->fX(), seg->v2->fY()); + angle_t endAngleR = clipperr.PointToPseudoAngle(seg->v1->fX(), seg->v1->fY()); + if (startAngleR-endAngleR >= ANGLE_180) + radarvisible |= (clipperr.SafeCheckRange(startAngleR, endAngleR) || (Level->flags3 & LEVEL3_NOFOGOFWAR) || ((sub->flags & SSECMF_DRAWN) && !deathmatch)); + pitchmin = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->floorplane.ZatPoint(seg->v1)); + pitchmax = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->ceilingplane.ZatPoint(seg->v1)); + pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + if (pitchvisible && anglevisible && radarvisible) break; + pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->floorplane.ZatPoint(seg->v2)); + if (int(pitchmin) > int(pitchtemp)) pitchmin = pitchtemp; + pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->ceilingplane.ZatPoint(seg->v2)); + if (int(pitchmax) < int(pitchtemp)) pitchmax = pitchtemp; + pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + if (pitchvisible && anglevisible && radarvisible) break; + } + seg++; + } + // Skip subsector if outside vertical or horizontal clippers or is in unexplored territory (fog of war) + if(!pitchvisible || !anglevisible || (!radarvisible && r_radarclipper)) return; + } + if (mClipPortal) { int clipres = mClipPortal->ClipSubsector(sub); @@ -723,6 +825,20 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) SetupSprite.Unclock(); } } + if (r_dithertransparency && Viewpoint.IsAllowedOoB() && (RTnum < MAXDITHERACTORS)) + { + // [DVR] Not parallelizable due to variables RTnum and RenderedTargets[] + for (auto p = sector->touching_renderthings; p != nullptr; p = p->m_snext) + { + auto thing = p->m_thing; + if (thing->validcount == validcount) continue; // Don't double count + if (((thing->flags3 & MF3_ISMONSTER) && !(thing->flags & MF_CORPSE)) || (thing->flags & MF_MISSILE)) + { + if (RTnum < MAXDITHERACTORS) RenderedTargets[RTnum++] = thing; + else break; + } + } + } } if (gl_render_flats) @@ -843,19 +959,62 @@ void HWDrawInfo::RenderBSPNode (void *node) if (!(no_renderflags[bsp->Index()] & SSRF_SEEN)) return; } + if (Viewpoint.IsOrtho()) + { + if (!vClipper->CheckBoxOrthoPitch(bsp->bbox[side])) + { + if (!(no_renderflags[bsp->Index()] & SSRF_SEEN)) + return; + } + } node = bsp->children[side]; } DoSubsector ((subsector_t *)((uint8_t *)node - 1)); } +// No need for clipping inside frustum if no fog of war (How is this faster!) +void HWDrawInfo::RenderOrthoNoFog() +{ + if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) + { + double vxdbl = Viewpoint.camera->X(); + double vydbl = Viewpoint.camera->Y(); + double ext = Viewpoint.camera->ViewPos->Offset.Length() ? + 3.0 * Viewpoint.camera->ViewPos->Offset.Length() : 100.0; + FBoundingBox viewbox(vxdbl, vydbl, ext); + + for (unsigned int kk = 0; kk < Level->subsectors.Size(); kk++) + { + if (Level->subsectors[kk].bbox.CheckOverlap(viewbox)) + { + DoSubsector (&Level->subsectors[kk]); + } + } + } +} + void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) { + ClearDitherTargets(); Bsp.Clock(); // Give the DrawInfo the viewpoint in fixed point because that's what the nodes are. viewx = FLOAT2FIXED(Viewpoint.Pos.X); viewy = FLOAT2FIXED(Viewpoint.Pos.Y); + if (r_radarclipper && !(Level->flags3 & LEVEL3_NOFOGOFWAR) && Viewpoint.IsAllowedOoB() && (Viewpoint.camera->ViewPos->Flags & VPSF_ABSOLUTEOFFSET)) + { + if (Viewpoint.camera->tracer != NULL) + { + viewx = FLOAT2FIXED(Viewpoint.camera->tracer->X()); + viewy = FLOAT2FIXED(Viewpoint.camera->tracer->Y()); + } + else + { + viewx = FLOAT2FIXED(Viewpoint.camera->X()); + viewy = FLOAT2FIXED(Viewpoint.camera->Y()); + } + } validcount++; // used for processing sidedefs only once by the renderer. @@ -866,7 +1025,8 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) auto future = renderPool.push([&](int id) { WorkerThread(); }); - RenderBSPNode(node); + if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(); + else RenderBSPNode(node); jobQueue.AddJob(RenderJob::TerminateJob, nullptr, nullptr); Bsp.Unclock(); @@ -876,9 +1036,21 @@ void HWDrawInfo::RenderBSP(void *node, bool drawpsprites) } else { - RenderBSPNode(node); + if (Viewpoint.IsOrtho() && ((Level->flags3 & LEVEL3_NOFOGOFWAR) || !r_radarclipper)) RenderOrthoNoFog(); + else RenderBSPNode(node); Bsp.Unclock(); } + + // Make rendered targets set dither transparency flags on level geometry for next pass + // Can't do this inside DoSubsector() because both Trace() and P_CheckSight() affect 'validcount' global variable + for (int ii = 0; ii < MAXDITHERACTORS; ii++) + { + if ( RenderedTargets[ii] && P_CheckSight(players[consoleplayer].mo, RenderedTargets[ii], 0) ) + { + SetDitherTransFlags(RenderedTargets[ii]); + } + } + // Process all the sprites on the current portal's back side which touch the portal. if (mCurrentPortal != nullptr) mCurrentPortal->RenderAttached(this); diff --git a/src/rendering/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp index fd69e267c..94713f107 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.cpp +++ b/src/rendering/hwrenderer/scene/hw_clipper.cpp @@ -193,7 +193,7 @@ void Clipper::AddClipRange(angle_t start, angle_t end) if (node->end < end) { - node->end = end; + node->end = end; // [DVR] This never triggers because of previous while loop. Remove? } ClipNode *node2 = node->next; @@ -361,6 +361,17 @@ angle_t Clipper::AngleToPseudo(angle_t ang) return xs_Fix<30>::ToFix(result); } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +angle_t Clipper::PitchToPseudo(double ang) +{ + return AngleToPseudo(DAngle::fromDeg(90.0-ang).BAMs()); // Pitch is positive when looking down +} + //----------------------------------------------------------------------------- // // ! Returns the pseudoangle between the line p1 to (infinity, p1.y) and the @@ -378,11 +389,28 @@ angle_t Clipper::PointToPseudoAngle(double x, double y) { double vecx = x - viewpoint->Pos.X; double vecy = y - viewpoint->Pos.Y; + if ((viewpoint->camera != NULL) && amRadar) + { + if (viewpoint->camera->tracer != NULL) + { + vecx = x - viewpoint->camera->tracer->X(); + vecy = y - viewpoint->camera->tracer->Y(); + } + else + { + vecx = x - viewpoint->camera->X(); + vecy = y - viewpoint->camera->Y(); + } + } if (vecx == 0 && vecy == 0) { return 0; } + else if (!amRadar && viewpoint->IsOrtho()) + { + return PointToPseudoOrthoAngle(x, y); + } else { double result = vecy / (fabs(vecx) + fabs(vecy)); @@ -395,6 +423,78 @@ angle_t Clipper::PointToPseudoAngle(double x, double y) } +angle_t Clipper::PointToPseudoPitch(double x, double y, double z) +{ + double vecx = x - viewpoint->Pos.X; + double vecy = y - viewpoint->Pos.Y; + double vecz = z - viewpoint->Pos.Z; + double result = 0; + + if (vecx == 0 && vecy == 0 && vecz == 0) + { + return 0; + } + else if (viewpoint->IsOrtho()) + { + return PointToPseudoOrthoPitch(x, y, z); + } + else + { + double result = vecz / (g_sqrt(vecx*vecx + vecy*vecy) + fabs(vecz)); // -ffast-math compile flag applies to this file, yes? + if ((vecx * viewpoint->TanCos + vecy * viewpoint->TanSin) <= 0.0) // Point is behind viewpoint + { + result = 2.0 - result; + } + return xs_Fix<30>::ToFix(result + 1.0); // range to 0 to 2 to 4 (bottom to top to suplex) + } +} + + +angle_t Clipper::PointToPseudoOrthoAngle(double x, double y) +{ + DVector3 disp = DVector3( x, y, 0 ) - viewpoint->camera->Pos(); + if (viewpoint->camera->ViewPos->Offset.XY().Length() == 0) + { + return AngleToPseudo( viewpoint->Angles.Yaw.BAMs() ); + } + else + { + angle_t af = viewpoint->FrustAngle; + double xproj = disp.XY().Length() * deltaangle(disp.Angle(), viewpoint->Angles.Yaw).Sin(); + xproj *= viewpoint->ScreenProj; + if (fabs(xproj) < 2.0) + { + return AngleToPseudo( viewpoint->Angles.Yaw.BAMs() - xproj * 0.5 * af ); + } + else + { + return (xproj > 0.0 ? AngleToPseudo( viewpoint->Angles.Yaw.BAMs() - af ) : AngleToPseudo( viewpoint->Angles.Yaw.BAMs() + af )); + } + } +} + + +angle_t Clipper::PointToPseudoOrthoPitch(double x, double y, double z) +{ + DVector3 disp = DVector3( x, y, z ) - viewpoint->camera->Pos(); + if (viewpoint->camera->ViewPos->Offset.XY().Length() > 0) + { + double yproj = viewpoint->PitchSin * disp.XY().Length() * deltaangle(disp.Angle(), viewpoint->Angles.Yaw).Cos(); + yproj += viewpoint->PitchCos * disp.Z; + yproj *= viewpoint->ScreenProj; + if (fabs(yproj) <= 1.5) + { + return PitchToPseudo(viewpoint->Angles.Pitch.Degrees() - yproj * 0.5 * viewpoint->FieldOfView.Degrees() ); + } + else + { + double a2 = 0.75*viewpoint->FieldOfView.Degrees(); + a2 *= ( yproj > 0.0 ? -1.0 : 1.0 ); + return PitchToPseudo(viewpoint->Angles.Pitch.Degrees() + a2 ); + } + } + else return PitchToPseudo(viewpoint->Angles.Pitch.Degrees()); +} //----------------------------------------------------------------------------- // @@ -428,7 +528,7 @@ bool Clipper::CheckBox(const float *bspcoord) // Find the corners of the box // that define the edges from current viewpoint. - auto &vp = viewpoint; + auto &vp = viewpoint; boxpos = (vp->Pos.X <= bspcoord[BOXLEFT] ? 0 : vp->Pos.X < bspcoord[BOXRIGHT ] ? 1 : 2) + (vp->Pos.Y >= bspcoord[BOXTOP ] ? 0 : vp->Pos.Y > bspcoord[BOXBOTTOM] ? 4 : 8); @@ -437,7 +537,47 @@ bool Clipper::CheckBox(const float *bspcoord) check = checkcoord[boxpos]; angle1 = PointToPseudoAngle (bspcoord[check[0]], bspcoord[check[1]]); angle2 = PointToPseudoAngle (bspcoord[check[2]], bspcoord[check[3]]); + + if (vp->IsOrtho()) + { + if (angle2 != angle1) return true; + switch (boxpos) // Check if the closer corner is poking into the view area + { + case 0: + case 10: + if ( angle1 != PointToPseudoAngle (bspcoord[check[2]], bspcoord[check[1]]) ) return true; + break; + case 2: + case 8: + if ( angle1 != PointToPseudoAngle (bspcoord[check[0]], bspcoord[check[3]]) ) return true; + break; + default: + break; + } + } return SafeCheckRange(angle2, angle1); } +bool Clipper::CheckBoxOrthoPitch(const float *bspcoord) +{ + angle_t pitchmin, pitchmax; + auto &vp = viewpoint; + if (!vp->IsOrtho()) return true; + + angle_t pitchtemp; + double padding = 1.0/viewpoint->ScreenProj/viewpoint->PitchCos; + double camz = vp->camera->Pos().Z - padding; + pitchmin = PointToPseudoPitch (bspcoord[BOXLEFT], bspcoord[BOXTOP], camz); + pitchmax = PointToPseudoPitch (bspcoord[BOXLEFT], bspcoord[BOXTOP], camz + 2.0*padding); + for (int yi = BOXTOP; yi <= BOXBOTTOM; yi++) + for (int xi = BOXLEFT; xi <= BOXRIGHT; xi++) + { + pitchtemp = PointToPseudoPitch (bspcoord[xi], bspcoord[yi], camz); + if (pitchmin - pitchtemp < ANGLE_180) pitchmin = pitchtemp; + pitchtemp = PointToPseudoPitch (bspcoord[xi], bspcoord[yi], camz + 2.0*padding); + if (pitchtemp - pitchmax < ANGLE_180) pitchmax = pitchtemp; + } + + return (pitchmax != pitchmin); // SafeCheckRange(pitchmin, pitchmax); +} diff --git a/src/rendering/hwrenderer/scene/hw_clipper.h b/src/rendering/hwrenderer/scene/hw_clipper.h index e8da8172c..c2643efd3 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.h +++ b/src/rendering/hwrenderer/scene/hw_clipper.h @@ -29,10 +29,11 @@ class Clipper ClipNode * clipnodes = nullptr; ClipNode * cliphead = nullptr; ClipNode * silhouette = nullptr; // will be preserved even when RemoveClipRange is called - const FRenderViewpoint *viewpoint = nullptr; + FRenderViewpoint *viewpoint = nullptr; bool blocked = false; static angle_t AngleToPseudo(angle_t ang); + static angle_t PitchToPseudo(double ang); bool IsRangeVisible(angle_t startangle, angle_t endangle); void RemoveRange(ClipNode * cn); void AddClipRange(angle_t startangle, angle_t endangle); @@ -41,6 +42,7 @@ class Clipper public: + bool amRadar = false; Clipper(); void Clear(); @@ -72,7 +74,7 @@ public: return c; } - void SetViewpoint(const FRenderViewpoint &vp) + void SetViewpoint(FRenderViewpoint &vp) { viewpoint = &vp; } @@ -116,6 +118,10 @@ public: SafeAddClipRange(AngleToPseudo(startangle), AngleToPseudo(endangle)); } + void SafeAddClipRangeDegPitches(double startpitch, double endpitch) + { + SafeAddClipRange(PitchToPseudo(startpitch), PitchToPseudo(endpitch)); + } void SafeRemoveClipRange(angle_t startangle, angle_t endangle) { @@ -146,10 +152,14 @@ public: { return blocked; } - - angle_t PointToPseudoAngle(double x, double y); + + angle_t PointToPseudoAngle(double x, double y); + angle_t PointToPseudoPitch(double x, double y, double z); + angle_t PointToPseudoOrthoAngle(double x, double y); + angle_t PointToPseudoOrthoPitch(double x, double y, double z); bool CheckBox(const float *bspcoord); + bool CheckBoxOrthoPitch(const float *bspcoord); // Used to speed up angle calculations during clipping inline angle_t GetClipAngle(vertex_t *v) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 2275d9a11..50a81b2c4 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -131,12 +131,19 @@ HWDrawInfo *HWDrawInfo::StartDrawInfo(FLevelLocals *lev, HWDrawInfo *parent, FRe //========================================================================== static Clipper staticClipper; // Since all scenes are processed sequentially we only need one clipper. +static Clipper staticVClipper; // Another clipper to clip vertically (used if (VPSF_ALLOWOUTOFBOUNDS & camera->viewpos->Flags)). +static Clipper staticRClipper; // Another clipper for radar (doesn't actually clip. Changes SSECMF_DRAWN setting). static HWDrawInfo * gl_drawinfo; // This is a linked list of all active DrawInfos and needed to free the memory arena after the last one goes out of scope. void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms) { staticClipper.Clear(); + staticVClipper.Clear(); + staticRClipper.Clear(); mClipper = &staticClipper; + vClipper = &staticVClipper; + rClipper = &staticRClipper; + rClipper->amRadar = true; Viewpoint = parentvp; lightmode = getRealLightmode(Level, true); @@ -169,6 +176,8 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0); } mClipper->SetViewpoint(Viewpoint); + vClipper->SetViewpoint(Viewpoint); + rClipper->SetViewpoint(Viewpoint); ClearBuffers(); @@ -257,7 +266,9 @@ void HWDrawInfo::ClearBuffers() void HWDrawInfo::UpdateCurrentMapSection() { - const int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; + int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; + if (Viewpoint.IsAllowedOoB()) + mapsection = Level->PointInRenderSubsector(Viewpoint.camera->Pos())->mapsection; CurrentMapSections.Set(mapsection); } @@ -270,9 +281,11 @@ void HWDrawInfo::UpdateCurrentMapSection() void HWDrawInfo::SetViewArea() { - auto &vp = Viewpoint; + auto &vp = Viewpoint; // The render_sector is better suited to represent the current position in GL vp.sector = Level->PointInRenderSubsector(vp.Pos)->render_sector; + if (Viewpoint.IsAllowedOoB()) + vp.sector = Level->PointInRenderSubsector(vp.camera->Pos())->render_sector; // Get the heightsec state from the render sector, not the current one! if (vp.sector->GetHeightSec()) @@ -351,16 +364,14 @@ int HWDrawInfo::SetFullbrightFlags(player_t *player) angle_t HWDrawInfo::FrustumAngle() { - float tilt = fabs(Viewpoint.HWAngles.Pitch.Degrees()); + // If pitch is larger than this you can look all around at an FOV of 90 degrees + if (fabs(Viewpoint.HWAngles.Pitch.Degrees()) > 89.0) return 0xffffffff; - // If the pitch is larger than this you can look all around at a FOV of 90° - if (tilt > 46.0f) return 0xffffffff; + double xratio = r_viewwindow.FocalTangent / Viewpoint.PitchCos; + double floatangle = 0.035 + atan ( xratio ) * 48.0 / AspectMultiplier(r_viewwindow.WidescreenRatio); // this is radians + angle_t a1 = DAngle::fromRad(floatangle).BAMs(); - // ok, this is a gross hack that barely works... - // but at least it doesn't overestimate too much... - double floatangle = 2.0 + (45.0 + ((tilt / 1.9)))*Viewpoint.FieldOfView.Degrees() * 48.0 / AspectMultiplier(r_viewwindow.WidescreenRatio) / 90.0; - angle_t a1 = DAngle::fromDeg(floatangle).BAMs(); - if (a1 >= ANGLE_180) return 0xffffffff; + if (a1 >= ANGLE_90) return 0xffffffff; return a1; } @@ -438,8 +449,12 @@ HWDecal *HWDrawInfo::AddDecal(bool onmirror) void HWDrawInfo::CreateScene(bool drawpsprites) { const auto &vp = Viewpoint; - angle_t a1 = FrustumAngle(); + angle_t a1 = FrustumAngle(); // horizontally clip the back of the viewport mClipper->SafeAddClipRangeRealAngles(vp.Angles.Yaw.BAMs() + a1, vp.Angles.Yaw.BAMs() - a1); + Viewpoint.FrustAngle = a1; + double a2 = 20.0 + 0.5*Viewpoint.FieldOfView.Degrees(); // FrustumPitch for vertical clipping + if (a2 > 179.0) a2 = 179.0; + vClipper->SafeAddClipRangeDegPitches(vp.HWAngles.Pitch.Degrees() - a2, vp.HWAngles.Pitch.Degrees() + a2); // clip the suplex range // reset the portal manager portalState.StartFrame(); @@ -648,6 +663,79 @@ void HWDrawInfo::DrawCorona(FRenderState& state, ACorona* corona, double dist) #endif } +//========================================================================== +// +// TraceCallbackForDitherTransparency +// Toggles dither flag on anything that occludes the actor's +// position from viewpoint. +// +//========================================================================== + +static ETraceStatus TraceCallbackForDitherTransparency(FTraceResults& res, void* userdata) +{ + int* count = (int*)userdata; + double bf, bc; + (*count)++; + switch(res.HitType) + { + case TRACE_HitWall: + if (!(res.Line->sidedef[res.Side]->Flags & WALLF_DITHERTRANS)) + { + bf = res.Line->sidedef[res.Side]->sector->floorplane.ZatPoint(res.HitPos.XY()); + bc = res.Line->sidedef[res.Side]->sector->ceilingplane.ZatPoint(res.HitPos.XY()); + if ((res.HitPos.Z <= bc) && (res.HitPos.Z >= bf)) res.Line->sidedef[res.Side]->Flags |= WALLF_DITHERTRANS; + } + break; + case TRACE_HitFloor: + res.Sector->floorplane.dithertransflag = true; + break; + case TRACE_HitCeiling: + res.Sector->ceilingplane.dithertransflag = true; + break; + case TRACE_HitActor: + default: + break; + } + + return TRACE_ContinueOutOfBounds; +} + + +void HWDrawInfo::SetDitherTransFlags(AActor* actor) +{ + if (actor && actor->Sector) + { + FTraceResults results; + double horix = Viewpoint.Sin * actor->radius; + double horiy = Viewpoint.Cos * actor->radius; + DVector3 actorpos = actor->Pos(); + DVector3 vvec = actorpos - Viewpoint.Pos; + if (Viewpoint.IsOrtho()) + { + vvec += Viewpoint.camera->Pos() - actorpos; + vvec *= 5.0; // Should be 4.0? (since zNear is behind screen by 3*dist in VREyeInfo::GetProjection()) + } + double distance = vvec.Length() - actor->radius; + DVector3 campos = actorpos - vvec; + sector_t* startsec; + int count = 0; + + vvec = vvec.Unit(); + campos.X -= horix; campos.Y += horiy; campos.Z += actor->Height * 0.25; + for (int iter = 0; iter < 3; iter++) + { + startsec = Level->PointInRenderSubsector(campos)->sector; + Trace(campos, startsec, vvec, distance, + 0, 0, actor, results, 0, TraceCallbackForDitherTransparency, &count); + campos.Z += actor->Height * 0.5; + Trace(campos, startsec, vvec, distance, + 0, 0, actor, results, 0, TraceCallbackForDitherTransparency, &count); + campos.Z -= actor->Height * 0.5; + campos.X += horix; campos.Y -= horiy; + } + } +} + static ETraceStatus CheckForViewpointActor(FTraceResults& res, void* userdata) { FRenderViewpoint* data = (FRenderViewpoint*)userdata; @@ -803,13 +891,17 @@ void HWDrawInfo::DrawScene(int drawmode) { static int recursion = 0; static int ssao_portals_available = 0; - const auto& vp = Viewpoint; + auto& vp = Viewpoint; bool applySSAO = false; if (drawmode == DM_MAINVIEW) { ssao_portals_available = gl_ssao_portals; applySSAO = true; + if (r_dithertransparency && vp.IsAllowedOoB()) + { + vp.camera->tracer ? SetDitherTransFlags(vp.camera->tracer) : SetDitherTransFlags(players[consoleplayer].mo); + } } else if (drawmode == DM_OFFSCREEN) { @@ -864,6 +956,8 @@ void HWDrawInfo::ProcessScene(bool toscreen) portalState.BeginScene(); int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; + if (Viewpoint.IsAllowedOoB()) + mapsection = Level->PointInRenderSubsector(Viewpoint.camera->Pos())->mapsection; CurrentMapSections.Set(mapsection); DrawScene(toscreen ? DM_MAINVIEW : DM_OFFSCREEN); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index 0d298d9ea..ce848e297 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -146,6 +146,8 @@ struct HWDrawInfo HWPortal *mCurrentPortal; //FRotator mAngles; Clipper *mClipper; + Clipper *vClipper; // Vertical clipper + Clipper *rClipper; // Radar clipper FRenderViewpoint Viewpoint; HWViewpointUniforms VPUniforms; // per-viewpoint uniform state TArray Portals; @@ -234,6 +236,7 @@ public: HWPortal * FindPortal(const void * src); void RenderBSPNode(void *node); + void RenderOrthoNoFog(); void RenderBSP(void *node, bool drawpsprites); static HWDrawInfo *StartDrawInfo(FLevelLocals *lev, HWDrawInfo *parent, FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms); @@ -302,6 +305,8 @@ public: void DrawCoronas(FRenderState& state); void DrawCorona(FRenderState& state, ACorona* corona, double dist); + void SetDitherTransFlags(AActor* actor); + void ProcessLowerMinisegs(TArray &lowersegs); void AddSubsectorToPortal(FSectorPortalGroup *portal, subsector_t *sub); diff --git a/src/rendering/hwrenderer/scene/hw_flats.cpp b/src/rendering/hwrenderer/scene/hw_flats.cpp index 459fe6445..f423c73fc 100644 --- a/src/rendering/hwrenderer/scene/hw_flats.cpp +++ b/src/rendering/hwrenderer/scene/hw_flats.cpp @@ -320,7 +320,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetObjectColor(FlatColor | 0xff000000); state.SetAddColor(AddColor | 0xff000000); state.ApplyTextureManipulation(TextureFx); - + if (plane.plane.dithertransflag) state.SetEffect(EFF_DITHERTRANS); if (hacktype & SSRF_PLANEHACK) { @@ -372,6 +372,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetObjectColor(0xffffffff); state.SetAddColor(0); state.ApplyTextureManipulation(nullptr); + if (plane.plane.dithertransflag) state.SetEffect(EFF_NONE); } //========================================================================== @@ -408,6 +409,8 @@ inline void HWFlat::PutFlat(HWDrawInfo *di, bool fog) void HWFlat::Process(HWDrawInfo *di, sector_t * model, int whichplane, bool fog) { plane.GetFromSector(model, whichplane); + model->ceilingplane.dithertransflag = false; // Resetting this every frame + model->floorplane.dithertransflag = false; // Resetting this every frame if (whichplane != int(ceiling)) { // Flip the normal if the source plane has a different orientation than what we are about to render. @@ -506,7 +509,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) uint8_t sink; uint8_t &srf = hacktype? sink : di->section_renderflags[di->Level->sections.SectionIndex(section)]; - const auto &vp = di->Viewpoint; + auto &vp = di->Viewpoint; // // @@ -515,7 +518,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) // // // - if ((which & SSRF_RENDERFLOOR) && frontsector->floorplane.ZatPoint(vp.Pos) <= vp.Pos.Z && (!section || !(section->flags & FSection::DONTRENDERFLOOR))) + if (((which & SSRF_RENDERFLOOR) && frontsector->floorplane.ZatPoint(vp.Pos) <= vp.Pos.Z && (!section || !(section->flags & FSection::DONTRENDERFLOOR)))&& !(vp.IsOrtho() && (vp.PitchSin < 0.0))) { // process the original floor first. @@ -573,7 +576,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) // // // - if ((which & SSRF_RENDERCEILING) && frontsector->ceilingplane.ZatPoint(vp.Pos) >= vp.Pos.Z && (!section || !(section->flags & FSection::DONTRENDERCEILING))) + if (((which & SSRF_RENDERCEILING) && frontsector->ceilingplane.ZatPoint(vp.Pos) >= vp.Pos.Z && (!section || !(section->flags & FSection::DONTRENDERCEILING))) && !(vp.IsOrtho() && (vp.PitchSin > 0.0))) { // process the original ceiling first. diff --git a/src/rendering/hwrenderer/scene/hw_portal.cpp b/src/rendering/hwrenderer/scene/hw_portal.cpp index a453827f3..b0ea3a8c9 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.cpp +++ b/src/rendering/hwrenderer/scene/hw_portal.cpp @@ -563,7 +563,8 @@ bool HWMirrorPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clippe angle_t af = di->FrustumAngle(); if (af < ANGLE_180) clipper->SafeAddClipRangeRealAngles(vp.Angles.Yaw.BAMs() + af, vp.Angles.Yaw.BAMs() - af); - clipper->SafeAddClipRange(linedef->v1, linedef->v2); + if(!di->Viewpoint.IsAllowedOoB()) + clipper->SafeAddClipRange(linedef->v1, linedef->v2); return true; } diff --git a/src/rendering/hwrenderer/scene/hw_sky.cpp b/src/rendering/hwrenderer/scene/hw_sky.cpp index 45ff8c5e7..6d77a275d 100644 --- a/src/rendering/hwrenderer/scene/hw_sky.cpp +++ b/src/rendering/hwrenderer/scene/hw_sky.cpp @@ -130,6 +130,7 @@ void HWSkyInfo::init(HWDrawInfo *di, sector_t* sec, int skypos, int sky1, PalEnt void HWWall::SkyPlane(HWWallDispatcher *di, sector_t *sector, int plane, bool allowreflect) { int ptype = -1; + if (di->di && di->di->Viewpoint.IsAllowedOoB()) return; // Couldn't prevent sky portal occlusion. Skybox is bad in ortho too. FSectorPortal *sportal = sector->ValidatePortal(plane); if (sportal != nullptr && sportal->mFlags & PORTSF_INSKYBOX) sportal = nullptr; // no recursions, delete it here to simplify the following code diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 3f595d177..ba4b67983 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -65,6 +65,7 @@ extern TArray SpriteFrames; extern uint32_t r_renderercaps; const float LARGE_VALUE = 1e19f; +const float MY_SQRT2 = 1.41421356237309504880; // sqrt(2) EXTERN_CVAR(Bool, r_debug_disable_vis_filter) EXTERN_CVAR(Float, transsouls) @@ -494,7 +495,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) } else // traditional "Y" billboard mode { - if (doRoll || !offset.isZero()) + if (doRoll || !offset.isZero() || (actor && (actor->renderflags2 & RF2_ISOMETRICSPRITES))) { mat.MakeIdentity(); @@ -516,6 +517,16 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) mat.Translate(-center.X, -center.Z, -center.Y); } + if (actor && (actor->renderflags2 & RF2_ISOMETRICSPRITES) && di->Viewpoint.IsOrtho()) + { + float angleRad = (FAngle::fromDeg(270.) - HWAngles.Yaw).Radians(); + mat.Translate(center.X, center.Z, center.Y); + mat.Translate(0.0, z2 - center.Z, 0.0); + mat.Rotate(-sin(angleRad), 0, cos(angleRad), -actor->isotheta); + mat.Translate(0.0, center.Z - z2, 0.0); + mat.Translate(-center.X, -center.Z, -center.Y); + } + v[0] = mat * FVector3(x1, z1, y1); v[1] = mat * FVector3(x2, z1, y2); v[2] = mat * FVector3(x1, z2, y1); @@ -911,6 +922,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t { bool mirror = false; DAngle ang = (thingpos - vp.Pos).Angle(); + if (di->Viewpoint.IsOrtho()) ang = vp.Angles.Yaw; FTextureID patch; // [ZZ] add direct picnum override if (isPicnumOverride) @@ -1004,7 +1016,25 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t if (thing->renderflags & RF_SPRITEFLIP) // [SP] Flip back thing->renderflags ^= RF_XFLIP; - r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 : sprscale.Y); + // If sprite is isometric, do both vertical scaling and partial rotation to face the camera to compensate for Y-billboarding. + // Using just rotation (about z=0) might cause tall+slender (high aspect ratio) sprites to clip out of collision box + // at the top and clip into whatever is behind them from the viewpoint's perspective. - [DVR] + thing->isoscaleY = 1.0; + thing->isotheta = vp.HWAngles.Pitch.Degrees(); + if (thing->renderflags2 & RF2_ISOMETRICSPRITES) + { + float floordist = thing->radius * vp.floordistfact; + floordist -= 0.5 * r.width * vp.cotfloor; + float sineisotheta = floordist / r.height; + double scl = g_sqrt( 1.0 + sineisotheta * sineisotheta - 2.0 * vp.PitchSin * sineisotheta ); + if ((thing->radius > 0.0) && (scl > fabs(vp.PitchCos))) + { + thing->isoscaleY = scl / ( fabs(vp.PitchCos) > 0.01 ? fabs(vp.PitchCos) : 0.01 ); + thing->isotheta = 180.0 * asin( sineisotheta / thing->isoscaleY ) / M_PI; + } + } + + r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 * thing->isoscaleY : sprscale.Y * thing->isoscaleY); if (thing->renderflags & (RF_ROLLSPRITE|RF_FLATSPRITE)) { @@ -1018,7 +1048,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t z1 = z - r.top; z2 = z1 - r.height; - float spriteheight = sprscale.Y * r.height; + float spriteheight = sprscale.Y * r.height * thing->isoscaleY; // Tests show that this doesn't look good for many decorations and corpses if (spriteheight > 0 && gl_spriteclip > 0 && (thing->renderflags & RF_SPRITETYPEMASK) == RF_FACESPRITE) @@ -1037,6 +1067,13 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t x2 = x - viewvecY*rightfac; y1 = y + viewvecX*leftfac; y2 = y + viewvecX*rightfac; + if (thing->renderflags2 & RF2_ISOMETRICSPRITES) // If sprites are drawn from an isometric perspective + { + x1 -= viewvecX * thing->radius * MY_SQRT2; + x2 -= viewvecX * thing->radius * MY_SQRT2; + y1 -= viewvecY * thing->radius * MY_SQRT2; + y2 -= viewvecY * thing->radius * MY_SQRT2; + } break; } case RF_FLATSPRITE: @@ -1077,6 +1114,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t } depth = (float)((x - vp.Pos.X) * vp.TanCos + (y - vp.Pos.Y) * vp.TanSin); + if(thing->renderflags2 & RF2_ISOMETRICSPRITES) depth = depth * vp.PitchCos - vp.PitchSin * z2; // Helps with stacking actors with small xy offsets if (isSpriteShadow) depth += 1.f/65536.f; // always sort shadows behind the sprite. // light calculation diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index 75aa7a849..5c5e357d5 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -83,10 +83,16 @@ void SetSplitPlanes(FRenderState& state, const secplane_t& top, const secplane_t void HWWall::RenderWall(FRenderState &state, int textured) { + if (seg->sidedef->Flags & WALLF_DITHERTRANS) state.SetEffect(EFF_DITHERTRANS); assert(vertcount > 0); state.SetLightIndex(dynlightindex); state.Draw(DT_TriangleFan, vertindex, vertcount); vertexcount += vertcount; + if (seg->sidedef->Flags & WALLF_DITHERTRANS) + { + state.SetEffect(EFF_NONE); + seg->sidedef->Flags &= ~WALLF_DITHERTRANS; // reset this every frame + } } //========================================================================== @@ -2175,6 +2181,8 @@ void HWWall::Process(HWWallDispatcher *di, seg_t *seg, sector_t * frontsector, s } bool isportal = seg->linedef->isVisualPortal() && seg->sidedef == seg->linedef->sidedef[0]; + // Don't render portal insides if in orthographic mode + if (di->di) isportal &= !(di->di->Viewpoint.IsOrtho()); //return; // [GZ] 3D middle textures are necessarily two-sided, even if they lack the explicit two-sided flag diff --git a/src/rendering/r_utility.cpp b/src/rendering/r_utility.cpp index 2a5d95586..3e40c3a0c 100644 --- a/src/rendering/r_utility.cpp +++ b/src/rendering/r_utility.cpp @@ -66,7 +66,9 @@ #include "i_system.h" #include "v_draw.h" #include "i_interface.h" +#include "d_main.h" +const float MY_SQRT2 = 1.41421356237309504880; // sqrt(2) // EXTERNAL DATA DECLARATIONS ---------------------------------------------- extern bool DrawFSHUD; // [RH] Defined in d_main.cpp @@ -103,6 +105,8 @@ CVAR (Bool, r_deathcamera, false, CVAR_ARCHIVE) CVAR (Int, r_clearbuffer, 0, 0) CVAR (Bool, r_drawvoxels, true, 0) CVAR (Bool, r_drawplayersprites, true, 0) // [RH] Draw player sprites? +CVARD (Bool, r_radarclipper, false, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_CHEAT, "Use the horizontal clipper from camera->tracer's perspective") +CVARD (Bool, r_dithertransparency, false, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_CHEAT, "Use dithered-transparency shading for actor-occluding level geometry") CUSTOM_CVAR(Float, r_quakeintensity, 1.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { if (self < 0.f) self = 0.f; @@ -155,9 +159,14 @@ FRenderViewpoint::FRenderViewpoint() Sin = 0.0; TanCos = 0.0; TanSin = 0.0; + PitchCos = 0.0; + PitchSin = 0.0; + floordistfact = 0.0; + cotfloor = 0.0; camera = nullptr; sector = nullptr; FieldOfView = DAngle::fromDeg(90.); // Angles in the SCREENWIDTH wide window + ScreenProj = 0.0; TicFrac = 0.0; FrameTime = 0; extralight = 0; @@ -552,39 +561,42 @@ void R_InterpolateView(FRenderViewpoint& viewPoint, const player_t* const player // Due to interpolation this is not necessarily the same as the sector the camera is in. viewPoint.sector = viewLvl->PointInRenderSubsector(viewPoint.Pos)->sector; - bool moved = false; - while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling)) + if (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer()) { - if (viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) + bool moved = false; + while (!viewPoint.sector->PortalBlocksMovement(sector_t::ceiling)) { - const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); - viewPoint.Pos += offset; - viewPoint.ActorPos += offset; - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; - moved = true; - } - else - { - break; - } - } - - if (!moved) - { - while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor)) - { - if (viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + if (viewPoint.Pos.Z > viewPoint.sector->GetPortalPlaneZ(sector_t::ceiling)) { - const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::floor); + const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::ceiling); viewPoint.Pos += offset; viewPoint.ActorPos += offset; - viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::ceiling)->mDestination; + moved = true; } else { break; } } + + if (!moved) + { + while (!viewPoint.sector->PortalBlocksMovement(sector_t::floor)) + { + if (viewPoint.Pos.Z < viewPoint.sector->GetPortalPlaneZ(sector_t::floor)) + { + const DVector2 offset = viewPoint.sector->GetPortalDisplacement(sector_t::floor); + viewPoint.Pos += offset; + viewPoint.ActorPos += offset; + viewPoint.sector = viewPoint.sector->GetPortal(sector_t::floor)->mDestination; + } + else + { + break; + } + } + } } if (P_NoInterpolation(player, viewPoint.camera)) @@ -680,10 +692,46 @@ void FRenderViewpoint::SetViewAngle(const FViewWindow& viewWindow) TanSin = viewWindow.FocalTangent * Sin; TanCos = viewWindow.FocalTangent * Cos; + PitchSin = Angles.Pitch.Sin(); + PitchCos = Angles.Pitch.Cos(); + + floordistfact = MY_SQRT2 + ( fabs(Cos) > fabs(Sin) ? 1.0/fabs(Cos) : 1.0/fabs(Sin) ); + cotfloor = ( fabs(Cos) > fabs(Sin) ? fabs(Sin/Cos) : fabs(Cos/Sin) ); + const DVector2 v = Angles.Yaw.ToVector(); ViewVector.X = v.X; ViewVector.Y = v.Y; HWAngles.Yaw = FAngle::fromDeg(270.0 - Angles.Yaw.Degrees()); + + if (IsOrtho() && (camera->ViewPos->Offset.XY().Length() > 0.0)) + ScreenProj = 1.34396 / camera->ViewPos->Offset.Length(); // [DVR] Estimated. +/-1 should be top/bottom of screen. + +} + +//========================================================================== +// +// R_IsAllowedOoB() +// Checks if camera actor exists, has viewpos, +// and viewpos has VPSF_ALLOWOUTOFBOUNDS flag set. +// +//========================================================================== + +bool FRenderViewpoint::IsAllowedOoB() +{ + return (camera && camera->ViewPos && (camera->ViewPos->Flags & VPSF_ALLOWOUTOFBOUNDS)); +} + +//========================================================================== +// +// R_IsOrtho() +// Checks if camera actor exists, has viewpos, +// and viewpos has VPSF_ORTHOGRAPHIC flag set. +// +//========================================================================== + +bool FRenderViewpoint::IsOrtho() +{ + return (camera && camera->ViewPos && (camera->ViewPos->Flags & VPSF_ORTHOGRAPHIC)); } //========================================================================== @@ -1017,14 +1065,15 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA viewPoint.SetViewAngle(viewWindow); // Keep the view within the sector's floor and ceiling - if (viewPoint.sector->PortalBlocksMovement(sector_t::ceiling)) + // But allow VPSF_ALLOWOUTOFBOUNDS camera viewpoints to go out of bounds when using hardware renderer + if (viewPoint.sector->PortalBlocksMovement(sector_t::ceiling) && (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer())) { const double z = viewPoint.sector->ceilingplane.ZatPoint(viewPoint.Pos) - 4.0; if (viewPoint.Pos.Z > z) viewPoint.Pos.Z = z; } - if (viewPoint.sector->PortalBlocksMovement(sector_t::floor)) + if (viewPoint.sector->PortalBlocksMovement(sector_t::floor) && (!viewPoint.IsAllowedOoB() || !V_IsHardwareRenderer())) { const double z = viewPoint.sector->floorplane.ZatPoint(viewPoint.Pos) + 4.0; if (viewPoint.Pos.Z < z) diff --git a/src/rendering/r_utility.h b/src/rendering/r_utility.h index 3013961eb..ca6d84b8c 100644 --- a/src/rendering/r_utility.h +++ b/src/rendering/r_utility.h @@ -33,10 +33,16 @@ struct FRenderViewpoint double Sin; // sin(Angles.Yaw) double TanCos; // FocalTangent * cos(Angles.Yaw) double TanSin; // FocalTangent * sin(Angles.Yaw) + double PitchCos; // cos(Angles.Pitch) + double PitchSin; // sin(Angles.Pitch) + double floordistfact; // used for isometric sprites Y-billboarding compensation in hw_sprites.cpp + double cotfloor; // used for isometric sprites Y-billboarding compensation in hw_sprites.cpp + angle_t FrustAngle; // FrustumAngle() result AActor *camera; // camera actor sector_t *sector; // [RH] keep track of sector viewing from DAngle FieldOfView; // current field of view + double ScreenProj; // Screen projection factor for orthographic projection double TicFrac; // fraction of tic for interpolation uint32_t FrameTime; // current frame's time in tics. @@ -45,6 +51,8 @@ struct FRenderViewpoint bool showviewer; // show the camera actor? bool bForceNoViewer; // Never show the camera Actor. void SetViewAngle(const FViewWindow& viewWindow); + bool IsAllowedOoB(); // Checks if camera actor exists, has viewpos, and viewpos has VPSF_ALLOWOUTOFBOUNDS flag set + bool IsOrtho(); // Checks if camera actor exists, has viewpos, and viewpos has VPSF_ORTHOGRAPHIC flag set }; diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 570dd2a4e..3993cd745 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -385,6 +385,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(RF2, FLIPSPRITEOFFSETY, AActor, renderflags2), DEFINE_FLAG(RF2, CAMFOLLOWSPLAYER, AActor, renderflags2), DEFINE_FLAG(RF2, NOMIPMAP, AActor, renderflags2), + DEFINE_FLAG(RF2, ISOMETRICSPRITES, AActor, renderflags2), // Bounce flags DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags), diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index 32891e564..95f248d69 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -48,6 +48,23 @@ const int TEXF_Detailmap = 0x20000; const int TEXF_Glowmap = 0x40000; const int TEXF_ClampY = 0x80000; +//=========================================================================== +// +// RGB to HSV +// +//=========================================================================== + +vec3 rgb2hsv(vec3 c) +{ + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + //=========================================================================== // // Color to grayscale @@ -870,6 +887,27 @@ void main() frag.rgb = frag.rgb + uFogColor.rgb; } FragColor = frag; + +#ifdef DITHERTRANS + int index = (int(pixelpos.x) % 8) * 8 + int(pixelpos.y) % 8; + const float DITHER_THRESHOLDS[64] = + { + 1.0 / 65.0, 33.0 / 65.0, 9.0 / 65.0, 41.0 / 65.0, 3.0 / 65.0, 35.0 / 65.0, 11.0 / 65.0, 43.0 / 65.0, + 49.0 / 65.0, 17.0 / 65.0, 57.0 / 65.0, 25.0 / 65.0, 51.0 / 65.0, 19.0 / 65.0, 59.0 / 65.0, 27.0 / 65.0, + 13.0 / 65.0, 45.0 / 65.0, 5.0 / 65.0, 37.0 / 65.0, 15.0 / 65.0, 47.0 / 65.0, 7.0 / 65.0, 39.0 / 65.0, + 61.0 / 65.0, 29.0 / 65.0, 53.0 / 65.0, 21.0 / 65.0, 63.0 / 65.0, 31.0 / 65.0, 55.0 / 65.0, 23.0 / 65.0, + 4.0 / 65.0, 36.0 / 65.0, 12.0 / 65.0, 44.0 / 65.0, 2.0 / 65.0, 34.0 / 65.0, 10.0 / 65.0, 42.0 / 65.0, + 52.0 / 65.0, 20.0 / 65.0, 60.0 / 65.0, 28.0 / 65.0, 50.0 / 65.0, 18.0 / 65.0, 58.0 / 65.0, 26.0 / 65.0, + 16.0 / 65.0, 48.0 / 65.0, 8.0 / 65.0, 40.0 / 65.0, 14.0 / 65.0, 46.0 / 65.0, 6.0 / 65.0, 38.0 / 65.0, + 64.0 / 65.0, 32.0 / 65.0, 56.0 / 65.0, 24.0 / 65.0, 62.0 / 65.0, 30.0 / 65.0, 54.0 / 65.0, 22.0 /65.0 + }; + + vec3 fragHSV = rgb2hsv(FragColor.rgb); + float brightness = clamp(1.5*fragHSV.z, 0.1, 1.0); + if (DITHER_THRESHOLDS[index] < brightness) discard; + else FragColor *= 0.5; +#endif + #ifdef GBUFFER_PASS FragFog = vec4(AmbientOcclusionColor(), 1.0); FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); diff --git a/wadsrc/static/shaders_gles/glsl/main.fp b/wadsrc/static/shaders_gles/glsl/main.fp index 99e64ca76..90429f8e0 100644 --- a/wadsrc/static/shaders_gles/glsl/main.fp +++ b/wadsrc/static/shaders_gles/glsl/main.fp @@ -493,6 +493,11 @@ void main() if (frag.a <= uAlphaThreshold) discard; #endif +#ifdef DITHERTRANS + int index = (int(pixelpos.x) % 2) * 2 + int(pixelpos.y) % 2; + if (index != 2) discard; +#endif + #if (DEF_FOG_2D == 0) // check for special 2D 'fog' mode. { float fogdist = 0.0; diff --git a/wadsrc/static/zscript/actors/shared/camera.zs b/wadsrc/static/zscript/actors/shared/camera.zs index d7826c051..463ad6178 100644 --- a/wadsrc/static/zscript/actors/shared/camera.zs +++ b/wadsrc/static/zscript/actors/shared/camera.zs @@ -128,3 +128,87 @@ class AimingCamera : SecurityCamera } } + +class SpectatorCamera : Actor +{ + + bool chasingtracer; + double lagdistance; // camera gives chase (lazy follow) if tracer gets > lagdistance away from camera.pos + int chasemode; // 0: chase until tracer centered, 1: same but only when tracer is moving, 2: stop chase if tracer within lagdistance + property lagdistance : lagdistance; + property chasingtracer : chasingtracer; + property chasemode : chasemode; + + default + { + +NOBLOCKMAP + +NOGRAVITY + +NOINTERACTION + RenderStyle "None"; + CameraHeight 0; + SpectatorCamera.chasingtracer false; + SpectatorCamera.lagdistance 0.0; + SpectatorCamera.chasemode 0; + } + + void Init(double dist, double yaw, double inpitch, int inflags) + { + + double zshift = 0.0; + if(tracer != NULL) + { + if(player != NULL) zshift = -0.25*tracer.height; + else zshift = 0.5*tracer.height; + } + else if (player != NULL && player.mo != NULL) zshift = -0.5*player.mo.height; + + SetViewPos((-dist*Cos(yaw)*Cos(inpitch), -dist*Sin(yaw)*Cos(inpitch), dist*Sin(inpitch)+zshift), inflags); + LookAtSelf(inpitch); + } + + void LookAtSelf(double inpitch) + { + if(ViewPos.Offset.length() > 0.) + { + Vector3 negviewpos = (-1.0) * ViewPos.Offset; + angle = negviewpos.Angle(); + pitch = inpitch; + } + } + + override void Tick() + { + if(tracer != NULL) + { + Vector3 distvec = tracer.pos - pos; + double dist = distvec.length(); + if((dist <= 4 && chasingtracer) || lagdistance <= 0.0) // Keep tracer centered on screen + { + SetOrigin(tracer.pos, true); + chasingtracer = false; + } + else // Lazy follow tracer + { + if(dist >= 2*lagdistance) + { + SetOrigin(tracer.pos, true); + chasingtracer = false; + } + else if(dist > lagdistance && !chasingtracer) chasingtracer = true; + + if(chasingtracer) + { + speed = tracer.vel.xy.length()/dist; + if((speed == 0.0) && (chasemode == 0)) speed = tracer.speed/dist; + SetOrigin(pos + 2*distvec*speed, true); + if(chasemode > 1) chasingtracer = false; + } + } + } + else if(player != NULL && player.mo != NULL) + { + cameraFOV = player.FOV; + SetOrigin(player.mo.pos, true); + } + } +} diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index ad77dc8b2..b4f2d85b7 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -421,8 +421,10 @@ enum EActivationFlags // [MC] Flags for SetViewPos. enum EViewPosFlags { - VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. - VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ABSOLUTEOFFSET = 1 << 1, // Don't include angles. + VPSF_ABSOLUTEPOS = 1 << 2, // Use absolute position. + VPSF_ALLOWOUTOFBOUNDS = 1 << 3, // Allow viewpoint to go out of bounds (hardware renderer only). + VPSF_ORTHOGRAPHIC = 1 << 4, // Use orthographic projection (hardware renderer only). }; // Flags for A_TakeInventory and A_TakeFromTarget @@ -1501,4 +1503,4 @@ enum EModelFlags MDL_MODELSAREATTACHMENTS = 1<<12, // any model index after 0 is treated as an attachment, and therefore will use the bone results of index 0 MDL_CORRECTPIXELSTRETCH = 1<<13, // ensure model does not distort with pixel stretch when pitch/roll is applied MDL_FORCECULLBACKFACES = 1<<14, -}; \ No newline at end of file +}; From 1d86d7080defdf398ba1b49bcdf17b55ee8babb4 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 8 Aug 2024 00:17:29 -0400 Subject: [PATCH 168/414] - beginning levelmeshupdater work --- src/gamedata/r_defs.h | 6 ++++++ src/levelmeshhelper.h | 15 +++++++++++++++ src/playsim/p_map.cpp | 1 + 3 files changed, 22 insertions(+) create mode 100644 src/levelmeshhelper.h diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index 54295a12b..babb940a5 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -30,6 +30,7 @@ #ifndef __R_DEFS_H__ #define __R_DEFS_H__ +#include "levelmeshhelper.h" #include "doomdef.h" #include "m_bbox.h" @@ -978,6 +979,7 @@ public: FTextureID old = planes[pos].Texture; planes[pos].Texture = tex; if (floorclip && pos == floor && tex != old) AdjustFloorClip(); + if (tex != old) LevelMeshUpdater->SectorChanged((void*)this); } double GetPlaneTexZ(int pos) const @@ -987,7 +989,9 @@ public: void SetPlaneTexZQuick(int pos, double val) // For the *FakeFlat functions which do not need to have the overlap checked. { + auto old = planes[pos].TexZ; planes[pos].TexZ = val; + if (val != old) LevelMeshUpdater->SectorChanged((void*)this); } void SetPlaneTexZ(int pos, double val, bool dirtify = false) // This mainly gets used by init code. The only place where it must set the vertex to dirty is the interpolation code. @@ -1289,7 +1293,9 @@ struct side_t } void SetTexture(int which, FTextureID tex) { + auto old = textures[which].texture; textures[which].texture = tex; + if (old != tex) LevelMeshUpdater->SideChanged((void*)this); } void SetTextureXOffset(int which, double offset) diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h new file mode 100644 index 000000000..616c4eac0 --- /dev/null +++ b/src/levelmeshhelper.h @@ -0,0 +1,15 @@ +// level mesh helper +// this is a minimal include to keep the other source files a little bit leaner + +struct UpdateLevelMesh +{ + void SectorChanged(void *sector) + { + } + + void SideChanged(void *side) + { + } +}; + +UpdateLevelMesh* LevelMeshUpdater; diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index af8df92a7..2a5cc02a4 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -7058,6 +7058,7 @@ bool P_ChangeSector(sector_t *sector, int crunch, double amt, int floorOrCeil, b } + LevelMeshUpdater->SectorChanged((void*)sector); // update levelmesh return cpos.nofit; } From 467cf2800b21204b35dc34fa5bc383cb8508d4e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 10 Aug 2024 16:51:56 -0300 Subject: [PATCH 169/414] Fix compilation --- .../rendering/hwrenderer/data/hw_meshbuilder.cpp | 14 ++++++++++++++ src/levelmeshhelper.h | 11 ++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index 6df23029e..cfad561b1 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -1,8 +1,22 @@ +#include "levelmeshhelper.h" #include "hw_meshbuilder.h" #include "hw_mesh.h" #include "v_video.h" + +struct NullLevelMeshUpdater : UpdateLevelMesh +{ + virtual void SectorChanged(void *sector) {}; + + virtual void SideChanged(void *side) {}; +}; + +static NullLevelMeshUpdater nullUpdater; + +UpdateLevelMesh* LevelMeshUpdater = &nullUpdater; + + MeshBuilder::MeshBuilder() { Reset(); diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index 616c4eac0..6fd72bbcf 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -1,15 +1,12 @@ +#pragma once // level mesh helper // this is a minimal include to keep the other source files a little bit leaner struct UpdateLevelMesh { - void SectorChanged(void *sector) - { - } + virtual void SectorChanged(void *sector) = 0; - void SideChanged(void *side) - { - } + virtual void SideChanged(void *side) = 0; }; -UpdateLevelMesh* LevelMeshUpdater; +extern UpdateLevelMesh* LevelMeshUpdater; From 7456c7685ba04f9fce8421e0f7592ecd233a0a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 10 Aug 2024 17:12:36 -0300 Subject: [PATCH 170/414] make hooks more specific --- .../hwrenderer/data/hw_meshbuilder.cpp | 9 +++++-- src/gamedata/r_defs.h | 27 ++++++++++++++++--- src/levelmeshhelper.h | 9 +++++-- src/playsim/p_map.cpp | 14 ++++++++-- 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index cfad561b1..83a25200c 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -7,9 +7,14 @@ struct NullLevelMeshUpdater : UpdateLevelMesh { - virtual void SectorChanged(void *sector) {}; + virtual void FloorHeightChanged(struct sector_t *sector) {}; + virtual void CeilingHeightChanged(struct sector_t *sector) {}; + virtual void MidTex3DHeightChanged(struct sector_t *sector) {}; - virtual void SideChanged(void *side) {}; + virtual void FloorTextureChanged(struct sector_t *sector) {}; + virtual void CeilingTextureChanged(struct sector_t *sector) {}; + + virtual void SideTextureChanged(struct side_t *side, int section) {}; }; static NullLevelMeshUpdater nullUpdater; diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index babb940a5..a50445ded 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -979,7 +979,17 @@ public: FTextureID old = planes[pos].Texture; planes[pos].Texture = tex; if (floorclip && pos == floor && tex != old) AdjustFloorClip(); - if (tex != old) LevelMeshUpdater->SectorChanged((void*)this); + if (tex != old) + { + if(pos) + { + LevelMeshUpdater->FloorTextureChanged(this); + } + else + { + LevelMeshUpdater->CeilingTextureChanged(this); + } + } } double GetPlaneTexZ(int pos) const @@ -991,7 +1001,18 @@ public: { auto old = planes[pos].TexZ; planes[pos].TexZ = val; - if (val != old) LevelMeshUpdater->SectorChanged((void*)this); + + if (val != old) + { + if(pos) + { + LevelMeshUpdater->FloorHeightChanged(this); + } + else + { + LevelMeshUpdater->CeilingHeightChanged(this); + } + } } void SetPlaneTexZ(int pos, double val, bool dirtify = false) // This mainly gets used by init code. The only place where it must set the vertex to dirty is the interpolation code. @@ -1295,7 +1316,7 @@ struct side_t { auto old = textures[which].texture; textures[which].texture = tex; - if (old != tex) LevelMeshUpdater->SideChanged((void*)this); + if (old != tex) LevelMeshUpdater->SideTextureChanged(this, which); } void SetTextureXOffset(int which, double offset) diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index 6fd72bbcf..69710cff8 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -4,9 +4,14 @@ struct UpdateLevelMesh { - virtual void SectorChanged(void *sector) = 0; + virtual void FloorHeightChanged(struct sector_t *sector) = 0; + virtual void CeilingHeightChanged(struct sector_t *sector) = 0; + virtual void MidTex3DHeightChanged(struct sector_t *sector) = 0; - virtual void SideChanged(void *side) = 0; + virtual void FloorTextureChanged(struct sector_t *sector) = 0; + virtual void CeilingTextureChanged(struct sector_t *sector) = 0; + + virtual void SideTextureChanged(struct side_t *side, int section) = 0; }; extern UpdateLevelMesh* LevelMeshUpdater; diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index 2a5cc02a4..aca24d5d9 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -7057,8 +7057,18 @@ bool P_ChangeSector(sector_t *sector, int crunch, double amt, int floorOrCeil, b } } - - LevelMeshUpdater->SectorChanged((void*)sector); // update levelmesh + switch(floorOrCeil) + { // update levelmesh + case 0: + LevelMeshUpdater->FloorHeightChanged(sector); + break; + case 1: + LevelMeshUpdater->CeilingHeightChanged(sector); + break; + case 2: + LevelMeshUpdater->MidTex3DHeightChanged(sector); + break; + } return cpos.nofit; } From 8f79753dc0557c94bb8dc802786aef24d681022b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 10 Aug 2024 17:34:43 -0300 Subject: [PATCH 171/414] make sure all texZ functions update the levelmesh --- .../rendering/hwrenderer/data/hw_meshbuilder.cpp | 2 ++ src/gamedata/r_defs.h | 9 +++++---- src/levelmeshhelper.h | 2 ++ src/scripting/vmthunks.cpp | 13 ------------- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index 83a25200c..95317975c 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -14,6 +14,8 @@ struct NullLevelMeshUpdater : UpdateLevelMesh virtual void FloorTextureChanged(struct sector_t *sector) {}; virtual void CeilingTextureChanged(struct sector_t *sector) {}; + virtual void SectorChangedOther(struct sector_t *sector) {}; + virtual void SideTextureChanged(struct side_t *side, int section) {}; }; diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index a50445ded..ba281b360 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -1004,27 +1004,28 @@ public: if (val != old) { + //not sure actually what TexZ does, so changing passing this as "Other" if(pos) { - LevelMeshUpdater->FloorHeightChanged(this); + LevelMeshUpdater->SectorChangedOther(this); } else { - LevelMeshUpdater->CeilingHeightChanged(this); + LevelMeshUpdater->SectorChangedOther(this); } } } void SetPlaneTexZ(int pos, double val, bool dirtify = false) // This mainly gets used by init code. The only place where it must set the vertex to dirty is the interpolation code. { - planes[pos].TexZ = val; + SetPlaneTexZQuick(pos, val); if (dirtify) SetAllVerticesDirty(); CheckOverlap(); } void ChangePlaneTexZ(int pos, double val) { - planes[pos].TexZ += val; + SetPlaneTexZQuick(pos, planes[pos].TexZ + val); SetAllVerticesDirty(); CheckOverlap(); } diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index 69710cff8..f6b6eda23 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -11,6 +11,8 @@ struct UpdateLevelMesh virtual void FloorTextureChanged(struct sector_t *sector) = 0; virtual void CeilingTextureChanged(struct sector_t *sector) = 0; + virtual void SectorChangedOther(struct sector_t *sector) = 0; + virtual void SideTextureChanged(struct side_t *side, int section) = 0; }; diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 6e8ee58eb..2abff431e 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -1806,19 +1806,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Secplane, isEqual, isPlaneEqual) ACTION_RETURN_BOOL(*self == *other); } -static void ChangeHeight(secplane_t *self, double hdiff) -{ - self->ChangeHeight(hdiff); -} - -DEFINE_ACTION_FUNCTION_NATIVE(_Secplane, ChangeHeight, ChangeHeight) -{ - PARAM_SELF_STRUCT_PROLOGUE(secplane_t); - PARAM_FLOAT(hdiff); - self->ChangeHeight(hdiff); - return 0; -} - static double GetChangedHeight(const secplane_t *self, double hdiff) { return self->GetChangedHeight(hdiff); From e80615e167aa1ac5095de1cda824a867e14c381f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 11 Aug 2024 17:51:45 +0200 Subject: [PATCH 172/414] Move the level mesh dirty ranges to levelmesh so that it can be updated --- .../hwrenderer/data/hw_levelmesh.cpp | 3 + .../rendering/hwrenderer/data/hw_levelmesh.h | 54 +++++++++++ src/common/rendering/vulkan/vk_levelmesh.cpp | 95 ++++++++----------- src/common/rendering/vulkan/vk_levelmesh.h | 22 +---- src/rendering/hwrenderer/doom_levelmesh.cpp | 2 + 5 files changed, 101 insertions(+), 75 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index a2998b8aa..ebf2d0b1d 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -41,6 +41,8 @@ void LevelMesh::AddEmptyMesh() for (int i = 0; i < 3 * 4; i++) Mesh.Indexes.Push(i); + + MarkAllDirty(); } LevelMeshSurface* LevelMesh::Trace(const FVector3& start, FVector3 direction, float maxDist) @@ -109,6 +111,7 @@ LevelMeshTileStats LevelMesh::GatherTilePixelStats() void LevelMesh::UpdateCollision() { Collision = std::make_unique(Mesh.Vertices.Data(), Mesh.Vertices.Size(), Mesh.Indexes.Data(), Mesh.Indexes.Size()); + MarkCollisionDirty(); } struct LevelMeshPlaneGroup diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 16b424bb0..dda3971b7 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -44,6 +44,12 @@ struct UniformsAllocInfo int Count = 0; }; +struct MeshBufferRange +{ + int Offset = 0; + int Size = 0; +}; + class LevelMesh { public: @@ -143,6 +149,20 @@ public: int MaxLightIndexes = 0; } Mesh; + struct + { + TArray Vertex; + TArray Index; + TArray Node; + TArray SurfaceIndex; + TArray Surface; + TArray UniformIndexes; + TArray Uniforms; + TArray Portals; + TArray Light; + TArray LightIndex; + } DirtyRanges; + std::unique_ptr Collision; TArray DrawList; @@ -165,6 +185,40 @@ public: void PackLightmapAtlas(int lightmapStartIndex); void AddEmptyMesh(); + + void MarkAllDirty() + { + DirtyRanges.Vertex.Clear(); + DirtyRanges.Vertex.Push({ 0, (int)Mesh.Vertices.Size() }); + DirtyRanges.Index.Clear(); + DirtyRanges.Index.Push({ 0, (int)Mesh.Indexes.Size() }); + DirtyRanges.SurfaceIndex.Clear(); + DirtyRanges.SurfaceIndex.Push({ 0, (int)Mesh.SurfaceIndexes.Size() }); + DirtyRanges.Surface.Clear(); + DirtyRanges.Surface.Push({ 0, GetSurfaceCount() }); + DirtyRanges.UniformIndexes.Clear(); + DirtyRanges.UniformIndexes.Push({ 0, (int)Mesh.UniformIndexes.Size() }); + DirtyRanges.Uniforms.Clear(); + DirtyRanges.Uniforms.Push({ 0, (int)Mesh.Uniforms.Size() }); + DirtyRanges.Portals.Clear(); + DirtyRanges.Portals.Push({ 0, (int)Portals.Size() }); + DirtyRanges.Light.Clear(); + DirtyRanges.Light.Push({ 0, (int)Mesh.Lights.Size() }); + DirtyRanges.LightIndex.Clear(); + DirtyRanges.LightIndex.Push({ 0, (int)Mesh.LightIndexes.Size() }); + } + + void MarkCollisionDirty() + { + DirtyRanges.Node.Clear(); + if (Collision) + DirtyRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); + } + + void MarkDynamicDirty() + { + DirtyRanges.Index.Push({ Mesh.DynamicIndexStart, (int)(Mesh.Indexes.Size() - Mesh.DynamicIndexStart) }); + } }; struct LevelMeshTileStats diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 71d5620ca..4f6a17f81 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -74,7 +74,7 @@ void VkLevelMesh::CreateVulkanObjects() { Reset(); CreateBuffers(); - UploadMeshes(false); + UploadMeshes(); if (useRayQuery) { @@ -112,7 +112,7 @@ void VkLevelMesh::CreateVulkanObjects() void VkLevelMesh::BeginFrame() { - UploadMeshes(true); + UploadMeshes(); if (useRayQuery) { @@ -158,27 +158,8 @@ void VkLevelMesh::BeginFrame() } } -void VkLevelMesh::UploadMeshes(bool dynamicOnly) +void VkLevelMesh::UploadMeshes() { - if (dynamicOnly) - { - Locations.Index.Push({ Mesh->Mesh.DynamicIndexStart, (int)(Mesh->Mesh.Indexes.Size() - Mesh->Mesh.DynamicIndexStart) }); - } - else - { - if (!useRayQuery) - Locations.Node.Push({ 0, (int)Mesh->Collision->get_nodes().size() }); - Locations.Vertex.Push({ 0, (int)Mesh->Mesh.Vertices.Size() }); - Locations.Index.Push({ 0, (int)Mesh->Mesh.Indexes.Size() }); - Locations.SurfaceIndex.Push({ 0, (int)Mesh->Mesh.SurfaceIndexes.Size() }); - Locations.Surface.Push({ 0, Mesh->GetSurfaceCount() }); - Locations.UniformIndexes.Push({ 0, (int)Mesh->Mesh.UniformIndexes.Size() }); - Locations.Uniforms.Push({ 0, (int)Mesh->Mesh.Uniforms.Size() }); - Locations.Portals.Push({ 0, (int)Mesh->Portals.Size() }); - Locations.Light.Push({ 0, (int)Mesh->Mesh.Lights.Size() }); - Locations.LightIndex.Push({ 0, (int)Mesh->Mesh.LightIndexes.Size() }); - } - VkLevelMeshUploader uploader(this); uploader.Upload(); } @@ -467,11 +448,11 @@ void VkLevelMeshUploader::Upload() BeginTransfer(transferBufferSize); UploadNodes(); - UploadRanges(Mesh->Locations.Vertex, Mesh->Mesh->Mesh.Vertices.Data(), Mesh->VertexBuffer.get()); - UploadRanges(Mesh->Locations.UniformIndexes, Mesh->Mesh->Mesh.UniformIndexes.Data(), Mesh->UniformIndexBuffer.get()); - UploadRanges(Mesh->Locations.Index, Mesh->Mesh->Mesh.Indexes.Data(), Mesh->IndexBuffer.get()); - UploadRanges(Mesh->Locations.SurfaceIndex, Mesh->Mesh->Mesh.SurfaceIndexes.Data(), Mesh->SurfaceIndexBuffer.get()); - UploadRanges(Mesh->Locations.LightIndex, Mesh->Mesh->Mesh.LightIndexes.Data(), Mesh->LightIndexBuffer.get()); + UploadRanges(Mesh->Mesh->DirtyRanges.Vertex, Mesh->Mesh->Mesh.Vertices.Data(), Mesh->VertexBuffer.get()); + UploadRanges(Mesh->Mesh->DirtyRanges.UniformIndexes, Mesh->Mesh->Mesh.UniformIndexes.Data(), Mesh->UniformIndexBuffer.get()); + UploadRanges(Mesh->Mesh->DirtyRanges.Index, Mesh->Mesh->Mesh.Indexes.Data(), Mesh->IndexBuffer.get()); + UploadRanges(Mesh->Mesh->DirtyRanges.SurfaceIndex, Mesh->Mesh->Mesh.SurfaceIndexes.Data(), Mesh->SurfaceIndexBuffer.get()); + UploadRanges(Mesh->Mesh->DirtyRanges.LightIndex, Mesh->Mesh->Mesh.LightIndexes.Data(), Mesh->LightIndexBuffer.get()); UploadSurfaces(); UploadUniforms(); UploadPortals(); @@ -493,16 +474,16 @@ void VkLevelMeshUploader::Upload() void VkLevelMeshUploader::ClearRanges() { - Mesh->Locations.Vertex.clear(); - Mesh->Locations.Index.clear(); - Mesh->Locations.Node.clear(); - Mesh->Locations.SurfaceIndex.clear(); - Mesh->Locations.Surface.clear(); - Mesh->Locations.UniformIndexes.clear(); - Mesh->Locations.Uniforms.clear(); - Mesh->Locations.Portals.clear(); - Mesh->Locations.Light.clear(); - Mesh->Locations.LightIndex.clear(); + Mesh->Mesh->DirtyRanges.Vertex.clear(); + Mesh->Mesh->DirtyRanges.Index.clear(); + Mesh->Mesh->DirtyRanges.Node.clear(); + Mesh->Mesh->DirtyRanges.SurfaceIndex.clear(); + Mesh->Mesh->DirtyRanges.Surface.clear(); + Mesh->Mesh->DirtyRanges.UniformIndexes.clear(); + Mesh->Mesh->DirtyRanges.Uniforms.clear(); + Mesh->Mesh->DirtyRanges.Portals.clear(); + Mesh->Mesh->DirtyRanges.Light.clear(); + Mesh->Mesh->DirtyRanges.LightIndex.clear(); } void VkLevelMeshUploader::BeginTransfer(size_t transferBufferSize) @@ -530,8 +511,11 @@ static FVector3 SwapYZ(const FVector3& v) void VkLevelMeshUploader::UploadNodes() { + if (Mesh->useRayQuery) + return; + // Always update the header struct of the collision storage buffer block if something changed - if (Mesh->Locations.Node.Size() > 0) + if (Mesh->Mesh->DirtyRanges.Node.Size() > 0) { CollisionNodeBufferHeader nodesHeader; nodesHeader.root = Mesh->Mesh->Collision->get_root(); @@ -543,7 +527,7 @@ void VkLevelMeshUploader::UploadNodes() } // Copy collision nodes - for (const MeshBufferRange& range : Mesh->Locations.Node) + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Node) { const auto& srcnodes = Mesh->Mesh->Collision->get_nodes(); CollisionNode* nodes = (CollisionNode*)(data + datapos); @@ -581,7 +565,7 @@ void VkLevelMeshUploader::UploadRanges(const TArray& ranges, co void VkLevelMeshUploader::UploadSurfaces() { - for (const MeshBufferRange& range : Mesh->Locations.Surface) + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Surface) { SurfaceInfo* surfaces = (SurfaceInfo*)(data + datapos); for (int j = 0, count = range.Size; j < count; j++) @@ -617,7 +601,7 @@ void VkLevelMeshUploader::UploadSurfaces() void VkLevelMeshUploader::UploadUniforms() { - for (const MeshBufferRange& range : Mesh->Locations.Uniforms) + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Uniforms) { for (int j = 0, count = range.Size; j < count; j++) { @@ -646,7 +630,7 @@ void VkLevelMeshUploader::UploadUniforms() void VkLevelMeshUploader::UploadPortals() { - for (const MeshBufferRange& range : Mesh->Locations.Portals) + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Portals) { PortalInfo* portals = (PortalInfo*)(data + datapos); for (int i = 0, count = range.Size; i < count; i++) @@ -666,7 +650,7 @@ void VkLevelMeshUploader::UploadPortals() void VkLevelMeshUploader::UploadLights() { - for (const MeshBufferRange& range : Mesh->Locations.Light) + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Light) { LightInfo* lights = (LightInfo*)(data + datapos); for (int i = 0, count = range.Size; i < count; i++) @@ -696,16 +680,19 @@ size_t VkLevelMeshUploader::GetTransferSize() { // Figure out how much memory we need to transfer it to the GPU size_t transferBufferSize = 0; - if (Mesh->Locations.Node.Size() > 0) transferBufferSize += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); - for (const MeshBufferRange& range : Mesh->Locations.Node) transferBufferSize += range.Size * sizeof(CollisionNode); - for (const MeshBufferRange& range : Mesh->Locations.Vertex) transferBufferSize += range.Size * sizeof(FFlatVertex); - for (const MeshBufferRange& range : Mesh->Locations.UniformIndexes) transferBufferSize += range.Size * sizeof(int); - for (const MeshBufferRange& range : Mesh->Locations.Index) transferBufferSize += range.Size * sizeof(uint32_t); - for (const MeshBufferRange& range : Mesh->Locations.SurfaceIndex) transferBufferSize += range.Size * sizeof(int); - for (const MeshBufferRange& range : Mesh->Locations.Surface) transferBufferSize += range.Size * sizeof(SurfaceInfo); - for (const MeshBufferRange& range : Mesh->Locations.Uniforms) transferBufferSize += range.Size * sizeof(SurfaceUniforms); - for (const MeshBufferRange& range : Mesh->Locations.Portals) transferBufferSize += range.Size * sizeof(PortalInfo); - for (const MeshBufferRange& range : Mesh->Locations.LightIndex) transferBufferSize += range.Size * sizeof(int32_t); - for (const MeshBufferRange& range : Mesh->Locations.Light) transferBufferSize += range.Size * sizeof(LightInfo); + if (!Mesh->useRayQuery) + { + if (Mesh->Mesh->DirtyRanges.Node.Size() > 0) transferBufferSize += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Node) transferBufferSize += range.Size * sizeof(CollisionNode); + } + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Vertex) transferBufferSize += range.Size * sizeof(FFlatVertex); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.UniformIndexes) transferBufferSize += range.Size * sizeof(int); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Index) transferBufferSize += range.Size * sizeof(uint32_t); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.SurfaceIndex) transferBufferSize += range.Size * sizeof(int); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Surface) transferBufferSize += range.Size * sizeof(SurfaceInfo); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Uniforms) transferBufferSize += range.Size * sizeof(SurfaceUniforms); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Portals) transferBufferSize += range.Size * sizeof(PortalInfo); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.LightIndex) transferBufferSize += range.Size * sizeof(int32_t); + for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Light) transferBufferSize += range.Size * sizeof(LightInfo); return transferBufferSize; } diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index fdd053077..ae4ec76f2 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -64,12 +64,6 @@ struct LightInfo static_assert(sizeof(LightInfo) == sizeof(float) * 20); -struct MeshBufferRange -{ - int Offset = 0; - int Size = 0; -}; - class VkLevelMesh { public: @@ -108,7 +102,7 @@ private: void CreateTLASInstanceBuffer(); void CreateTopLevelAS(int instanceCount); - void UploadMeshes(bool dynamicOnly); + void UploadMeshes(); void UploadTLASInstanceBuffer(); void UpdateTopLevelAS(int instanceCount); @@ -121,20 +115,6 @@ private: LevelMesh NullMesh; LevelMesh* Mesh = nullptr; - struct - { - TArray Vertex; - TArray Index; - TArray Node; - TArray SurfaceIndex; - TArray Surface; - TArray UniformIndexes; - TArray Uniforms; - TArray Portals; - TArray Light; - TArray LightIndex; - } Locations; - std::unique_ptr VertexBuffer; std::unique_ptr UniformIndexBuffer; std::unique_ptr IndexBuffer; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index a21576a5c..77cbafd8f 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -177,6 +177,8 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) Mesh.MaxNodes = std::max(Collision->get_nodes().size() * 2, (size_t)10000); Mesh.MaxLights = 100'000; Mesh.MaxLightIndexes = 4 * 1024 * 1024; + + MarkAllDirty(); } void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) From e0cba776468ee2f07b4ecff90e030e8d4c4ed6ed Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 11 Aug 2024 18:34:03 +0200 Subject: [PATCH 173/414] Move levelmeshhelper completely out of the Common folder Connect the level updates to the level mesh --- src/CMakeLists.txt | 1 + .../hwrenderer/data/hw_meshbuilder.cpp | 21 ----------- src/levelmeshhelper.cpp | 25 +++++++++++++ src/levelmeshhelper.h | 2 + src/maploader/maploader.cpp | 4 ++ src/rendering/hwrenderer/doom_levelmesh.cpp | 37 ++++++++++++++++++- src/rendering/hwrenderer/doom_levelmesh.h | 11 +++++- 7 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 src/levelmeshhelper.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 476fab429..445eab1ad 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -823,6 +823,7 @@ set (PCH_SOURCES st_stuff.cpp r_data/v_palette.cpp wi_stuff.cpp + levelmeshhelper.cpp gamedata/a_keys.cpp gamedata/a_weapons.cpp gamedata/decallib.cpp diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index 95317975c..6df23029e 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -1,29 +1,8 @@ -#include "levelmeshhelper.h" #include "hw_meshbuilder.h" #include "hw_mesh.h" #include "v_video.h" - -struct NullLevelMeshUpdater : UpdateLevelMesh -{ - virtual void FloorHeightChanged(struct sector_t *sector) {}; - virtual void CeilingHeightChanged(struct sector_t *sector) {}; - virtual void MidTex3DHeightChanged(struct sector_t *sector) {}; - - virtual void FloorTextureChanged(struct sector_t *sector) {}; - virtual void CeilingTextureChanged(struct sector_t *sector) {}; - - virtual void SectorChangedOther(struct sector_t *sector) {}; - - virtual void SideTextureChanged(struct side_t *side, int section) {}; -}; - -static NullLevelMeshUpdater nullUpdater; - -UpdateLevelMesh* LevelMeshUpdater = &nullUpdater; - - MeshBuilder::MeshBuilder() { Reset(); diff --git a/src/levelmeshhelper.cpp b/src/levelmeshhelper.cpp new file mode 100644 index 000000000..585db2229 --- /dev/null +++ b/src/levelmeshhelper.cpp @@ -0,0 +1,25 @@ + +#include "levelmeshhelper.h" + +struct NullLevelMeshUpdater : UpdateLevelMesh +{ + virtual void FloorHeightChanged(struct sector_t* sector) {}; + virtual void CeilingHeightChanged(struct sector_t* sector) {}; + virtual void MidTex3DHeightChanged(struct sector_t* sector) {}; + + virtual void FloorTextureChanged(struct sector_t* sector) {}; + virtual void CeilingTextureChanged(struct sector_t* sector) {}; + + virtual void SectorChangedOther(struct sector_t* sector) {}; + + virtual void SideTextureChanged(struct side_t* side, int section) {}; +}; + +static NullLevelMeshUpdater nullUpdater; + +UpdateLevelMesh* LevelMeshUpdater = &nullUpdater; + +void SetNullLevelMeshUpdater() +{ + LevelMeshUpdater = &nullUpdater; +} diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index f6b6eda23..e2eb4cf40 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -17,3 +17,5 @@ struct UpdateLevelMesh }; extern UpdateLevelMesh* LevelMeshUpdater; + +void SetNullLevelMeshUpdater(); diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index b819bd57d..06de343ea 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3203,6 +3203,8 @@ bool MapLoader::LoadLightmap(MapData* map) void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) { + SetNullLevelMeshUpdater(); + const int *oldvertextable = nullptr; // Reset defaults for lightmapping @@ -3544,4 +3546,6 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) seg++; } } + + LevelMeshUpdater = Level->levelMesh; // Start tracking level changes } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 77cbafd8f..898dfdade 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -381,6 +381,41 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) // To do: call FreeGeometry and FreeUniforms } +void DoomLevelMesh::FloorHeightChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::CeilingHeightChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::MidTex3DHeightChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::FloorTextureChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::CeilingTextureChanged(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::SectorChangedOther(struct sector_t* sector) +{ + // UpdateFlat(level, sector->Index()); +} + +void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) +{ + // UpdateSide(level, side->Index()); +} + void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) { FreeSide(doomMap, sideIndex); @@ -428,7 +463,7 @@ void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) void DoomLevelMesh::UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) { - FreeSide(doomMap, sectorIndex); + FreeFlat(doomMap, sectorIndex); sector_t* sector = &doomMap.sectors[sectorIndex]; for (FSection& section : doomMap.sections.SectionsForSector(sectorIndex)) diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 75eba0693..a8fb67c25 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -2,6 +2,7 @@ #pragma once #include "hw_levelmesh.h" +#include "levelmeshhelper.h" #include "scene/hw_drawstructs.h" #include "common/rendering/hwrenderer/data/hw_meshbuilder.h" #include "tarray.h" @@ -41,7 +42,7 @@ struct FlatSurfaceBlock int FirstSurface = -1; }; -class DoomLevelMesh : public LevelMesh +class DoomLevelMesh : public LevelMesh, public UpdateLevelMesh { public: DoomLevelMesh(FLevelLocals &doomMap); @@ -66,6 +67,14 @@ public: void CreateLights(FLevelLocals& doomMap); + void FloorHeightChanged(struct sector_t* sector) override; + void CeilingHeightChanged(struct sector_t* sector) override; + void MidTex3DHeightChanged(struct sector_t* sector) override; + void FloorTextureChanged(struct sector_t* sector) override; + void CeilingTextureChanged(struct sector_t* sector) override; + void SectorChangedOther(struct sector_t* sector) override; + void SideTextureChanged(struct side_t* side, int section) override; + private: void CreateSurfaces(FLevelLocals& doomMap); From 8043370ef1868f55bf03b2123b95f691dc619f16 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Fri, 9 Aug 2024 03:44:46 +0800 Subject: [PATCH 174/414] Export PlayDiveOrSurfaceSounds to ZScript and made it virtual for mods to customize the diving and surfacing sounds --- src/playsim/actor.h | 1 + src/playsim/p_mobj.cpp | 35 +++++++++++++++------------ wadsrc/static/zscript/actors/actor.zs | 19 +++++++++++++++ 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 745c4be9d..30fdc55e8 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1411,6 +1411,7 @@ public: bool IsMapActor(); bool SetState (FState *newstate, bool nofunction=false); void SplashCheck(); + void PlayDiveOrSurfaceSounds(int oldlevel = 0); bool UpdateWaterLevel (bool splash=true); bool isFast(); bool isSlow(); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 3f08d3a39..d216d30d8 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -2937,7 +2937,7 @@ void AActor::CallFallAndSink(double grav, double oldfloorz) } else { - FallAndSink(grav, oldfloorz); + FallAndSink(grav, oldfloorz); } } @@ -4614,6 +4614,23 @@ void AActor::SplashCheck() return; } +//========================================================================== +// +// AActor::PlayDiveOrSurfaceSounds +// +// Plays diving or surfacing sounds for the player +// +//========================================================================== + +void AActor::PlayDiveOrSurfaceSounds(int oldlevel) +{ + IFVIRTUAL(AActor, PlayDiveOrSurfaceSounds) + { + VMValue params[2] = { (DObject *)this, oldlevel }; + VMCall(func, params, 2, nullptr, 0); + } +} + //========================================================================== // // AActor::UpdateWaterLevel @@ -4637,21 +4654,7 @@ bool AActor::UpdateWaterLevel(bool dosplash) if (player != nullptr) { - if (oldlevel < 3 && waterlevel == 3) - { - // Our head just went under. - S_Sound(this, CHAN_VOICE, 0, "*dive", 1, ATTN_NORM); - } - else if (oldlevel == 3 && waterlevel < 3) - { - // Our head just came up. - if (player->air_finished > Level->maptime) - { - // We hadn't run out of air yet. - S_Sound(this, CHAN_VOICE, 0, "*surface", 1, ATTN_NORM); - } - // If we were running out of air, then ResetAirSupply() will play *gasp. - } + PlayDiveOrSurfaceSounds(oldlevel); } return false; // we did the splash ourselves diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 768837d59..2658a052f 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -1450,6 +1450,25 @@ class Actor : Thinker native } } + virtual void PlayDiveOrSurfaceSounds(int oldlevel) + { + if (oldlevel < 3 && WaterLevel == 3) + { + // Our head just went under. + A_StartSound("*dive", CHAN_VOICE, attenuation: ATTN_NORM); + } + else if (oldlevel == 3 && WaterLevel < 3) + { + // Our head just came up. + if (player.air_finished > Level.maptime) + { + // We hadn't run out of air yet. + A_StartSound("*surface", CHAN_VOICE, attenuation: ATTN_NORM); + } + // If we were running out of air, then ResetAirSupply() will play *gasp. + } + } + //---------------------------------------------------------------------------- // // PROC A_CheckSkullDone From 766b558119cf59d90d2da976277b0eafc9152ebf Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 11 Aug 2024 20:39:45 +0200 Subject: [PATCH 175/414] Ranges in buffers are so fun! --- .../hwrenderer/data/hw_levelmesh.cpp | 4 +- .../rendering/hwrenderer/data/hw_levelmesh.h | 112 +++++++++++++----- src/common/rendering/vulkan/vk_levelmesh.cpp | 64 +++++----- src/rendering/hwrenderer/doom_levelmesh.cpp | 2 +- 4 files changed, 116 insertions(+), 66 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index ebf2d0b1d..6892be941 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -42,7 +42,7 @@ void LevelMesh::AddEmptyMesh() for (int i = 0; i < 3 * 4; i++) Mesh.Indexes.Push(i); - MarkAllDirty(); + UploadAll(); } LevelMeshSurface* LevelMesh::Trace(const FVector3& start, FVector3 direction, float maxDist) @@ -111,7 +111,7 @@ LevelMeshTileStats LevelMesh::GatherTilePixelStats() void LevelMesh::UpdateCollision() { Collision = std::make_unique(Mesh.Vertices.Data(), Mesh.Vertices.Size(), Mesh.Indexes.Data(), Mesh.Indexes.Size()); - MarkCollisionDirty(); + UploadCollision(); } struct LevelMeshPlaneGroup diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index dda3971b7..93d39beca 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -48,6 +48,8 @@ struct MeshBufferRange { int Offset = 0; int Size = 0; + + bool operator<(const MeshBufferRange& other) const { return Offset < other.Offset; } }; class LevelMesh @@ -83,7 +85,11 @@ public: info.Vertices = &Mesh.Vertices[info.VertexStart]; info.UniformIndexes = &Mesh.UniformIndexes[info.VertexStart]; info.Indexes = &Mesh.Indexes[info.IndexStart]; - // To do: mark range as dirty + + AddRange(UploadRanges.Vertex, { info.VertexStart, info.VertexCount }); + AddRange(UploadRanges.UniformIndexes, { info.VertexStart, info.VertexCount }); + AddRange(UploadRanges.Index, { info.IndexStart, info.IndexCount }); + return info; } @@ -96,27 +102,33 @@ public: Mesh.Materials.Resize(info.Start + count); info.Uniforms = &Mesh.Uniforms[info.Start]; info.Materials = &Mesh.Materials[info.Start]; - // To do: mark range as dirty + + AddRange(UploadRanges.Uniforms, { info.Start, info.Count }); + return info; } void FreeGeometry(int vertexStart, int vertexCount, int indexStart, int indexCount) { + // Convert triangles to degenerates for (int i = 0; i < indexCount; i++) Mesh.Indexes[indexStart + i] = 0; - // To do: add to a free list - // To do: mark range as dirty + AddRange(UploadRanges.Index, { indexStart, indexCount }); + + AddRange(FreeLists.Vertex, { vertexStart, vertexCount }); + AddRange(FreeLists.Index, { indexStart, indexCount }); } void FreeUniforms(int start, int count) { - // To do: add to a free list + AddRange(FreeLists.Uniforms, { start, count }); } void FreeSurface(unsigned int surfaceIndex) { // To do: remove the surface from the surface tile, if attached - // To do: add to a free list + + AddRange(FreeLists.Surface, { (int)surfaceIndex, 1 }); } struct @@ -161,7 +173,15 @@ public: TArray Portals; TArray Light; TArray LightIndex; - } DirtyRanges; + } UploadRanges; + + struct + { + TArray Vertex; + TArray Index; + TArray Uniforms; + TArray Surface; + } FreeLists; std::unique_ptr Collision; @@ -186,38 +206,68 @@ public: void AddEmptyMesh(); - void MarkAllDirty() + void UploadAll() { - DirtyRanges.Vertex.Clear(); - DirtyRanges.Vertex.Push({ 0, (int)Mesh.Vertices.Size() }); - DirtyRanges.Index.Clear(); - DirtyRanges.Index.Push({ 0, (int)Mesh.Indexes.Size() }); - DirtyRanges.SurfaceIndex.Clear(); - DirtyRanges.SurfaceIndex.Push({ 0, (int)Mesh.SurfaceIndexes.Size() }); - DirtyRanges.Surface.Clear(); - DirtyRanges.Surface.Push({ 0, GetSurfaceCount() }); - DirtyRanges.UniformIndexes.Clear(); - DirtyRanges.UniformIndexes.Push({ 0, (int)Mesh.UniformIndexes.Size() }); - DirtyRanges.Uniforms.Clear(); - DirtyRanges.Uniforms.Push({ 0, (int)Mesh.Uniforms.Size() }); - DirtyRanges.Portals.Clear(); - DirtyRanges.Portals.Push({ 0, (int)Portals.Size() }); - DirtyRanges.Light.Clear(); - DirtyRanges.Light.Push({ 0, (int)Mesh.Lights.Size() }); - DirtyRanges.LightIndex.Clear(); - DirtyRanges.LightIndex.Push({ 0, (int)Mesh.LightIndexes.Size() }); + UploadRanges.Vertex.Clear(); + UploadRanges.Vertex.Push({ 0, (int)Mesh.Vertices.Size() }); + UploadRanges.Index.Clear(); + UploadRanges.Index.Push({ 0, (int)Mesh.Indexes.Size() }); + UploadRanges.SurfaceIndex.Clear(); + UploadRanges.SurfaceIndex.Push({ 0, (int)Mesh.SurfaceIndexes.Size() }); + UploadRanges.Surface.Clear(); + UploadRanges.Surface.Push({ 0, GetSurfaceCount() }); + UploadRanges.UniformIndexes.Clear(); + UploadRanges.UniformIndexes.Push({ 0, (int)Mesh.UniformIndexes.Size() }); + UploadRanges.Uniforms.Clear(); + UploadRanges.Uniforms.Push({ 0, (int)Mesh.Uniforms.Size() }); + UploadRanges.Portals.Clear(); + UploadRanges.Portals.Push({ 0, (int)Portals.Size() }); + UploadRanges.Light.Clear(); + UploadRanges.Light.Push({ 0, (int)Mesh.Lights.Size() }); + UploadRanges.LightIndex.Clear(); + UploadRanges.LightIndex.Push({ 0, (int)Mesh.LightIndexes.Size() }); } - void MarkCollisionDirty() + void UploadCollision() { - DirtyRanges.Node.Clear(); + UploadRanges.Node.Clear(); if (Collision) - DirtyRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); + UploadRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); } - void MarkDynamicDirty() + void UploadDynamic() { - DirtyRanges.Index.Push({ Mesh.DynamicIndexStart, (int)(Mesh.Indexes.Size() - Mesh.DynamicIndexStart) }); + UploadRanges.Index.Push({ Mesh.DynamicIndexStart, (int)(Mesh.Indexes.Size() - Mesh.DynamicIndexStart) }); + } + + void AddRange(TArray& ranges, MeshBufferRange range) + { + auto right = std::lower_bound(ranges.begin(), ranges.end(), range); + + bool leftExists = right != ranges.begin(); + bool rightExists = right != ranges.end(); + + auto left = right; + if (leftExists) + --left; + + if (leftExists && rightExists && left->Offset + left->Size == range.Offset && right->Offset == range.Offset + range.Size) // ####[--]#### + { + left->Size += range.Size + right->Size; + ranges.Delete(right - ranges.begin()); + } + else if (leftExists && left->Offset + left->Size == range.Offset) // ####[--] #### + { + left->Size += range.Size; + } + else if (rightExists && right->Offset == range.Offset + range.Size) // #### [--]#### + { + right->Offset -= range.Size; + } + else // ##### [--] #### + { + ranges.Insert(right - ranges.begin(), range); + } } }; diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 4f6a17f81..f5f4c0c18 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -448,11 +448,11 @@ void VkLevelMeshUploader::Upload() BeginTransfer(transferBufferSize); UploadNodes(); - UploadRanges(Mesh->Mesh->DirtyRanges.Vertex, Mesh->Mesh->Mesh.Vertices.Data(), Mesh->VertexBuffer.get()); - UploadRanges(Mesh->Mesh->DirtyRanges.UniformIndexes, Mesh->Mesh->Mesh.UniformIndexes.Data(), Mesh->UniformIndexBuffer.get()); - UploadRanges(Mesh->Mesh->DirtyRanges.Index, Mesh->Mesh->Mesh.Indexes.Data(), Mesh->IndexBuffer.get()); - UploadRanges(Mesh->Mesh->DirtyRanges.SurfaceIndex, Mesh->Mesh->Mesh.SurfaceIndexes.Data(), Mesh->SurfaceIndexBuffer.get()); - UploadRanges(Mesh->Mesh->DirtyRanges.LightIndex, Mesh->Mesh->Mesh.LightIndexes.Data(), Mesh->LightIndexBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.Vertex, Mesh->Mesh->Mesh.Vertices.Data(), Mesh->VertexBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.UniformIndexes, Mesh->Mesh->Mesh.UniformIndexes.Data(), Mesh->UniformIndexBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.Index, Mesh->Mesh->Mesh.Indexes.Data(), Mesh->IndexBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.SurfaceIndex, Mesh->Mesh->Mesh.SurfaceIndexes.Data(), Mesh->SurfaceIndexBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.LightIndex, Mesh->Mesh->Mesh.LightIndexes.Data(), Mesh->LightIndexBuffer.get()); UploadSurfaces(); UploadUniforms(); UploadPortals(); @@ -474,16 +474,16 @@ void VkLevelMeshUploader::Upload() void VkLevelMeshUploader::ClearRanges() { - Mesh->Mesh->DirtyRanges.Vertex.clear(); - Mesh->Mesh->DirtyRanges.Index.clear(); - Mesh->Mesh->DirtyRanges.Node.clear(); - Mesh->Mesh->DirtyRanges.SurfaceIndex.clear(); - Mesh->Mesh->DirtyRanges.Surface.clear(); - Mesh->Mesh->DirtyRanges.UniformIndexes.clear(); - Mesh->Mesh->DirtyRanges.Uniforms.clear(); - Mesh->Mesh->DirtyRanges.Portals.clear(); - Mesh->Mesh->DirtyRanges.Light.clear(); - Mesh->Mesh->DirtyRanges.LightIndex.clear(); + Mesh->Mesh->UploadRanges.Vertex.clear(); + Mesh->Mesh->UploadRanges.Index.clear(); + Mesh->Mesh->UploadRanges.Node.clear(); + Mesh->Mesh->UploadRanges.SurfaceIndex.clear(); + Mesh->Mesh->UploadRanges.Surface.clear(); + Mesh->Mesh->UploadRanges.UniformIndexes.clear(); + Mesh->Mesh->UploadRanges.Uniforms.clear(); + Mesh->Mesh->UploadRanges.Portals.clear(); + Mesh->Mesh->UploadRanges.Light.clear(); + Mesh->Mesh->UploadRanges.LightIndex.clear(); } void VkLevelMeshUploader::BeginTransfer(size_t transferBufferSize) @@ -515,7 +515,7 @@ void VkLevelMeshUploader::UploadNodes() return; // Always update the header struct of the collision storage buffer block if something changed - if (Mesh->Mesh->DirtyRanges.Node.Size() > 0) + if (Mesh->Mesh->UploadRanges.Node.Size() > 0) { CollisionNodeBufferHeader nodesHeader; nodesHeader.root = Mesh->Mesh->Collision->get_root(); @@ -527,7 +527,7 @@ void VkLevelMeshUploader::UploadNodes() } // Copy collision nodes - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Node) + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Node) { const auto& srcnodes = Mesh->Mesh->Collision->get_nodes(); CollisionNode* nodes = (CollisionNode*)(data + datapos); @@ -565,7 +565,7 @@ void VkLevelMeshUploader::UploadRanges(const TArray& ranges, co void VkLevelMeshUploader::UploadSurfaces() { - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Surface) + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Surface) { SurfaceInfo* surfaces = (SurfaceInfo*)(data + datapos); for (int j = 0, count = range.Size; j < count; j++) @@ -601,7 +601,7 @@ void VkLevelMeshUploader::UploadSurfaces() void VkLevelMeshUploader::UploadUniforms() { - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Uniforms) + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Uniforms) { for (int j = 0, count = range.Size; j < count; j++) { @@ -630,7 +630,7 @@ void VkLevelMeshUploader::UploadUniforms() void VkLevelMeshUploader::UploadPortals() { - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Portals) + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Portals) { PortalInfo* portals = (PortalInfo*)(data + datapos); for (int i = 0, count = range.Size; i < count; i++) @@ -650,7 +650,7 @@ void VkLevelMeshUploader::UploadPortals() void VkLevelMeshUploader::UploadLights() { - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Light) + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Light) { LightInfo* lights = (LightInfo*)(data + datapos); for (int i = 0, count = range.Size; i < count; i++) @@ -682,17 +682,17 @@ size_t VkLevelMeshUploader::GetTransferSize() size_t transferBufferSize = 0; if (!Mesh->useRayQuery) { - if (Mesh->Mesh->DirtyRanges.Node.Size() > 0) transferBufferSize += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Node) transferBufferSize += range.Size * sizeof(CollisionNode); + if (Mesh->Mesh->UploadRanges.Node.Size() > 0) transferBufferSize += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Node) transferBufferSize += range.Size * sizeof(CollisionNode); } - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Vertex) transferBufferSize += range.Size * sizeof(FFlatVertex); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.UniformIndexes) transferBufferSize += range.Size * sizeof(int); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Index) transferBufferSize += range.Size * sizeof(uint32_t); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.SurfaceIndex) transferBufferSize += range.Size * sizeof(int); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Surface) transferBufferSize += range.Size * sizeof(SurfaceInfo); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Uniforms) transferBufferSize += range.Size * sizeof(SurfaceUniforms); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Portals) transferBufferSize += range.Size * sizeof(PortalInfo); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.LightIndex) transferBufferSize += range.Size * sizeof(int32_t); - for (const MeshBufferRange& range : Mesh->Mesh->DirtyRanges.Light) transferBufferSize += range.Size * sizeof(LightInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Vertex) transferBufferSize += range.Size * sizeof(FFlatVertex); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.UniformIndexes) transferBufferSize += range.Size * sizeof(int); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Index) transferBufferSize += range.Size * sizeof(uint32_t); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.SurfaceIndex) transferBufferSize += range.Size * sizeof(int); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Surface) transferBufferSize += range.Size * sizeof(SurfaceInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Uniforms) transferBufferSize += range.Size * sizeof(SurfaceUniforms); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Portals) transferBufferSize += range.Size * sizeof(PortalInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.LightIndex) transferBufferSize += range.Size * sizeof(int32_t); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Light) transferBufferSize += range.Size * sizeof(LightInfo); return transferBufferSize; } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 898dfdade..fd874df93 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -178,7 +178,7 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) Mesh.MaxLights = 100'000; Mesh.MaxLightIndexes = 4 * 1024 * 1024; - MarkAllDirty(); + UploadAll(); } void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) From a4e3aca33c89fa2ce3dcb6605748fc1376e4302c Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 11 Aug 2024 15:58:33 -0400 Subject: [PATCH 176/414] - add messages for sector light change, thinker creation, and destruction --- src/gamedata/r_defs.h | 2 ++ src/levelmeshhelper.cpp | 4 ++++ src/levelmeshhelper.h | 4 ++++ src/playsim/mapthinkers/a_lights.cpp | 16 ++++++++++++++++ src/playsim/mapthinkers/a_lights.h | 1 + src/rendering/hwrenderer/doom_levelmesh.cpp | 12 ++++++++++++ src/rendering/hwrenderer/doom_levelmesh.h | 3 +++ 7 files changed, 42 insertions(+) diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index ba281b360..b9ea96752 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -1038,11 +1038,13 @@ public: void ChangeLightLevel(int newval) { lightlevel = ClampLight(lightlevel + newval); + LevelMeshUpdater->SectorLightChanged(this); } void SetLightLevel(int newval) { lightlevel = ClampLight(newval); + LevelMeshUpdater->SectorLightChanged(this); } int GetLightLevel() const diff --git a/src/levelmeshhelper.cpp b/src/levelmeshhelper.cpp index 585db2229..1b1fdc6eb 100644 --- a/src/levelmeshhelper.cpp +++ b/src/levelmeshhelper.cpp @@ -13,6 +13,10 @@ struct NullLevelMeshUpdater : UpdateLevelMesh virtual void SectorChangedOther(struct sector_t* sector) {}; virtual void SideTextureChanged(struct side_t* side, int section) {}; + + virtual void SectorLightChanged(struct sector_t* sector) {}; + virtual void SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) {}; + virtual void SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) {}; }; static NullLevelMeshUpdater nullUpdater; diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index e2eb4cf40..b4e4a7d29 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -14,6 +14,10 @@ struct UpdateLevelMesh virtual void SectorChangedOther(struct sector_t *sector) = 0; virtual void SideTextureChanged(struct side_t *side, int section) = 0; + + virtual void SectorLightChanged(struct sector_t* sector) = 0; + virtual void SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) = 0; + virtual void SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) = 0; }; extern UpdateLevelMesh* LevelMeshUpdater; diff --git a/src/playsim/mapthinkers/a_lights.cpp b/src/playsim/mapthinkers/a_lights.cpp index 9cd7fb20f..692e2dbdc 100644 --- a/src/playsim/mapthinkers/a_lights.cpp +++ b/src/playsim/mapthinkers/a_lights.cpp @@ -57,6 +57,12 @@ static FRandom pr_fireflicker ("FireFlicker"); IMPLEMENT_CLASS(DLighting, false, false) +void DLighting::OnDestroy() +{ + LevelMeshUpdater->SectorLightThinkerDestroyed(this->GetSector(), this); + Super::OnDestroy(); +} + //----------------------------------------------------------------------------- // // FIRELIGHT FLICKER @@ -110,6 +116,7 @@ void DFireFlicker::Construct(sector_t *sector) m_MaxLight = sector->lightlevel; m_MinLight = sector_t::ClampLight(FindMinSurroundingLight(sector, sector->lightlevel) + 16); m_Count = 4; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } void DFireFlicker::Construct(sector_t *sector, int upper, int lower) @@ -118,6 +125,7 @@ void DFireFlicker::Construct(sector_t *sector, int upper, int lower) m_MaxLight = sector_t::ClampLight(upper); m_MinLight = sector_t::ClampLight(lower); m_Count = 4; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } //----------------------------------------------------------------------------- @@ -173,6 +181,7 @@ void DFlicker::Construct(sector_t *sector, int upper, int lower) m_MinLight = sector_t::ClampLight(lower); sector->lightlevel = m_MaxLight; m_Count = (pr_flicker()&64)+1; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } //----------------------------------------------------------------------------- @@ -232,6 +241,7 @@ void DLightFlash::Construct(sector_t *sector) m_MaxTime = 64; m_MinTime = 7; m_Count = (pr_lightflash() & m_MaxTime) + 1; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } void DLightFlash::Construct (sector_t *sector, int min, int max) @@ -243,6 +253,7 @@ void DLightFlash::Construct (sector_t *sector, int min, int max) m_MaxTime = 64; m_MinTime = 7; m_Count = (pr_lightflash() & m_MaxTime) + 1; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } @@ -301,6 +312,7 @@ void DStrobe::Construct(sector_t *sector, int upper, int lower, int utics, int l m_MaxLight = sector_t::ClampLight(upper); m_MinLight = sector_t::ClampLight(lower); m_Count = 1; // Hexen-style is always in sync + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } //----------------------------------------------------------------------------- @@ -322,6 +334,7 @@ void DStrobe::Construct(sector_t *sector, int utics, int ltics, bool inSync) m_MinLight = 0; m_Count = inSync ? 1 : (pr_strobeflash() & 7) + 1; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } @@ -391,6 +404,7 @@ void DGlow::Construct(sector_t *sector) m_MinLight = FindMinSurroundingLight (sector, sector->lightlevel); m_MaxLight = sector->lightlevel; m_Direction = -1; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } //----------------------------------------------------------------------------- @@ -453,6 +467,7 @@ void DGlow2::Construct(sector_t *sector, int start, int end, int tics, bool ones m_MaxTics = tics; m_Tics = -1; m_OneShot = oneshot; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } //----------------------------------------------------------------------------- @@ -550,6 +565,7 @@ void DPhased::Construct (sector_t *sector, int baselevel, int phase) Super::Construct(sector); m_BaseLevel = baselevel; m_Phase = phase; + LevelMeshUpdater->SectorLightThinkerCreated(sector, this); } //----------------------------------------------------------------------------- diff --git a/src/playsim/mapthinkers/a_lights.h b/src/playsim/mapthinkers/a_lights.h index dde32d904..541b8867e 100644 --- a/src/playsim/mapthinkers/a_lights.h +++ b/src/playsim/mapthinkers/a_lights.h @@ -5,6 +5,7 @@ class DLighting : public DSectorEffect DECLARE_CLASS(DLighting, DSectorEffect) public: static const int DEFAULT_STAT = STAT_LIGHT; + void OnDestroy() override; }; class DFireFlicker : public DLighting diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index fd874df93..0f20512e4 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -416,6 +416,18 @@ void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) // UpdateSide(level, side->Index()); } +void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) +{ +}; + +void DoomLevelMesh::SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) +{ +}; + +void DoomLevelMesh::SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) +{ +}; + void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) { FreeSide(doomMap, sideIndex); diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index a8fb67c25..3ad00d9b4 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -74,6 +74,9 @@ public: void CeilingTextureChanged(struct sector_t* sector) override; void SectorChangedOther(struct sector_t* sector) override; void SideTextureChanged(struct side_t* side, int section) override; + void SectorLightChanged(struct sector_t* sector) override; + void SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) override; + void SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) override; private: void CreateSurfaces(FLevelLocals& doomMap); From b6cbaaedbc179537f4349899068f3b9ccbffb417 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 11 Aug 2024 23:03:32 +0200 Subject: [PATCH 177/414] Update the bottom level accel structure if vertices or indexes change --- .../rendering/hwrenderer/data/hw_levelmesh.h | 6 -- src/common/rendering/vulkan/vk_levelmesh.cpp | 63 ++++++++----------- src/common/rendering/vulkan/vk_levelmesh.h | 3 - src/rendering/hwrenderer/doom_levelmesh.cpp | 1 - 4 files changed, 25 insertions(+), 48 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 93d39beca..f2e443cb9 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -148,7 +148,6 @@ public: // Index data TArray Indexes; TArray SurfaceIndexes; - int DynamicIndexStart = 0; // Above data must not be resized beyond these limits as that's the size of the GPU buffers int MaxVertices = 0; @@ -235,11 +234,6 @@ public: UploadRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); } - void UploadDynamic() - { - UploadRanges.Index.Push({ Mesh.DynamicIndexStart, (int)(Mesh.Indexes.Size() - Mesh.DynamicIndexStart) }); - } - void AddRange(TArray& ranges, MeshBufferRange range) { auto right = std::lower_bound(ranges.begin(), ranges.end(), range); diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index f5f4c0c18..827ccb932 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -57,9 +57,6 @@ void VkLevelMesh::Reset() deletelist->Add(std::move(PortalBuffer)); deletelist->Add(std::move(LightBuffer)); deletelist->Add(std::move(LightIndexBuffer)); - deletelist->Add(std::move(StaticBLAS.ScratchBuffer)); - deletelist->Add(std::move(StaticBLAS.AccelStructBuffer)); - deletelist->Add(std::move(StaticBLAS.AccelStruct)); deletelist->Add(std::move(DynamicBLAS.ScratchBuffer)); deletelist->Add(std::move(DynamicBLAS.AccelStructBuffer)); deletelist->Add(std::move(DynamicBLAS.AccelStruct)); @@ -83,8 +80,7 @@ void VkLevelMesh::CreateVulkanObjects() .AddMemory(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT) .Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - CreateStaticBLAS(); - CreateDynamicBLAS(); + DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.Indexes.Size()); CreateTLASInstanceBuffer(); UploadTLASInstanceBuffer(); @@ -112,6 +108,8 @@ void VkLevelMesh::CreateVulkanObjects() void VkLevelMesh::BeginFrame() { + bool accelStructNeedsUpdate = Mesh->UploadRanges.Index.Size() != 0 || Mesh->UploadRanges.Vertex.Size() != 0; + UploadMeshes(); if (useRayQuery) @@ -121,21 +119,22 @@ void VkLevelMesh::BeginFrame() .AddMemory(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT) .Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - // Create a new dynamic BLAS + if (accelStructNeedsUpdate) + { + // To do: we should reuse the buffers. - // To do: we should reuse the buffers. However this requires we know when the command buffers are completely done with them first. - auto deletelist = fb->GetCommands()->DrawDeleteList.get(); - deletelist->Add(std::move(DynamicBLAS.ScratchBuffer)); - deletelist->Add(std::move(DynamicBLAS.AccelStructBuffer)); - deletelist->Add(std::move(DynamicBLAS.AccelStruct)); - deletelist->Add(std::move(TopLevelAS.TransferBuffer)); - deletelist->Add(std::move(TopLevelAS.InstanceBuffer)); + auto deletelist = fb->GetCommands()->DrawDeleteList.get(); + deletelist->Add(std::move(DynamicBLAS.ScratchBuffer)); + deletelist->Add(std::move(DynamicBLAS.AccelStructBuffer)); + deletelist->Add(std::move(DynamicBLAS.AccelStruct)); - if (Mesh->Mesh.DynamicIndexStart < (int)Mesh->Mesh.Indexes.Size()) - DynamicBLAS = CreateBLAS(true, Mesh->Mesh.DynamicIndexStart, Mesh->Mesh.Indexes.Size() - Mesh->Mesh.DynamicIndexStart); + DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.Indexes.Size()); - CreateTLASInstanceBuffer(); - UploadTLASInstanceBuffer(); + deletelist->Add(std::move(TopLevelAS.TransferBuffer)); + deletelist->Add(std::move(TopLevelAS.InstanceBuffer)); + CreateTLASInstanceBuffer(); + UploadTLASInstanceBuffer(); + } // Wait for bottom level builds to finish before using it as input to a toplevel accel structure. Also wait for the instance buffer upload to complete. PipelineBarrier() @@ -301,17 +300,6 @@ VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(bool preferFastBuild, int indexOffset, return blas; } -void VkLevelMesh::CreateStaticBLAS() -{ - StaticBLAS = CreateBLAS(false, 0, Mesh->Mesh.DynamicIndexStart); -} - -void VkLevelMesh::CreateDynamicBLAS() -{ - if (Mesh->Mesh.DynamicIndexStart < (int)Mesh->Mesh.Indexes.Size()) - DynamicBLAS = CreateBLAS(true, Mesh->Mesh.DynamicIndexStart, Mesh->Mesh.Indexes.Size() - Mesh->Mesh.DynamicIndexStart); -} - void VkLevelMesh::CreateTLASInstanceBuffer() { TopLevelAS.TransferBuffer = BufferBuilder() @@ -411,17 +399,16 @@ void VkLevelMesh::UploadTLASInstanceBuffer() instances[0].transform.matrix[2][2] = 1.0f; instances[0].mask = 0xff; instances[0].flags = 0; - instances[0].accelerationStructureReference = StaticBLAS.AccelStruct->GetDeviceAddress(); + instances[0].accelerationStructureReference = DynamicBLAS.AccelStruct->GetDeviceAddress(); - if (DynamicBLAS.AccelStruct) - { - instances[1].transform.matrix[0][0] = 1.0f; - instances[1].transform.matrix[1][1] = 1.0f; - instances[1].transform.matrix[2][2] = 1.0f; - instances[1].mask = 0xff; - instances[1].flags = 0; - instances[1].accelerationStructureReference = DynamicBLAS.AccelStruct->GetDeviceAddress(); - } + /* + instances[1].transform.matrix[0][0] = 1.0f; + instances[1].transform.matrix[1][1] = 1.0f; + instances[1].transform.matrix[2][2] = 1.0f; + instances[1].mask = 0xff; + instances[1].flags = 0; + instances[1].accelerationStructureReference = DynamicBLAS.AccelStruct->GetDeviceAddress(); + */ auto data = (uint8_t*)TopLevelAS.TransferBuffer->Map(0, sizeof(VkAccelerationStructureInstanceKHR) * 2); memcpy(data, instances, sizeof(VkAccelerationStructureInstanceKHR) * 2); diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index ae4ec76f2..e43f3e6d2 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -97,8 +97,6 @@ private: void Reset(); void CreateVulkanObjects(); void CreateBuffers(); - void CreateStaticBLAS(); - void CreateDynamicBLAS(); void CreateTLASInstanceBuffer(); void CreateTopLevelAS(int instanceCount); @@ -127,7 +125,6 @@ private: std::unique_ptr NodeBuffer; - BLAS StaticBLAS; BLAS DynamicBLAS; struct diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 0f20512e4..383c43901 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -165,7 +165,6 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) SortIndexes(); BuildTileSurfaceLists(); - Mesh.DynamicIndexStart = Mesh.Indexes.size(); UpdateCollision(); // Assume double the size of the static mesh will be enough for anything dynamic. From e9946bead20147871147da811eca494a10b86d35 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 13 Aug 2024 23:35:32 +0200 Subject: [PATCH 178/414] Fix not lights in the internal lightmapper --- .../rendering/hwrenderer/data/hw_levelmesh.h | 44 +++++++++++-------- src/rendering/hwrenderer/doom_levelmesh.cpp | 10 +---- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index f2e443cb9..3d9cb9111 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -207,24 +207,24 @@ public: void UploadAll() { - UploadRanges.Vertex.Clear(); - UploadRanges.Vertex.Push({ 0, (int)Mesh.Vertices.Size() }); - UploadRanges.Index.Clear(); - UploadRanges.Index.Push({ 0, (int)Mesh.Indexes.Size() }); - UploadRanges.SurfaceIndex.Clear(); - UploadRanges.SurfaceIndex.Push({ 0, (int)Mesh.SurfaceIndexes.Size() }); - UploadRanges.Surface.Clear(); - UploadRanges.Surface.Push({ 0, GetSurfaceCount() }); - UploadRanges.UniformIndexes.Clear(); - UploadRanges.UniformIndexes.Push({ 0, (int)Mesh.UniformIndexes.Size() }); - UploadRanges.Uniforms.Clear(); - UploadRanges.Uniforms.Push({ 0, (int)Mesh.Uniforms.Size() }); - UploadRanges.Portals.Clear(); - UploadRanges.Portals.Push({ 0, (int)Portals.Size() }); - UploadRanges.Light.Clear(); - UploadRanges.Light.Push({ 0, (int)Mesh.Lights.Size() }); - UploadRanges.LightIndex.Clear(); - UploadRanges.LightIndex.Push({ 0, (int)Mesh.LightIndexes.Size() }); + ClearRanges(UploadRanges.Vertex); + AddRange(UploadRanges.Vertex, { 0, (int)Mesh.Vertices.Size() }); + ClearRanges(UploadRanges.Index); + AddRange(UploadRanges.Index, { 0, (int)Mesh.Indexes.Size() }); + ClearRanges(UploadRanges.SurfaceIndex); + AddRange(UploadRanges.SurfaceIndex, { 0, (int)Mesh.SurfaceIndexes.Size() }); + ClearRanges(UploadRanges.Surface); + AddRange(UploadRanges.Surface, { 0, GetSurfaceCount() }); + ClearRanges(UploadRanges.UniformIndexes); + AddRange(UploadRanges.UniformIndexes, { 0, (int)Mesh.UniformIndexes.Size() }); + ClearRanges(UploadRanges.Uniforms); + AddRange(UploadRanges.Uniforms, { 0, (int)Mesh.Uniforms.Size() }); + ClearRanges(UploadRanges.Portals); + AddRange(UploadRanges.Portals, { 0, (int)Portals.Size() }); + ClearRanges(UploadRanges.Light); + AddRange(UploadRanges.Light, { 0, (int)Mesh.Lights.Size() }); + ClearRanges(UploadRanges.LightIndex); + AddRange(UploadRanges.LightIndex, { 0, (int)Mesh.LightIndexes.Size() }); } void UploadCollision() @@ -234,8 +234,16 @@ public: UploadRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); } + void ClearRanges(TArray& ranges) + { + ranges.Clear(); + } + void AddRange(TArray& ranges, MeshBufferRange range) { + if (range.Size <= 0) + return; + auto right = std::lower_bound(ranges.begin(), ranges.end(), range); bool leftExists = right != ranges.begin(); diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 383c43901..657506001 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -205,6 +205,7 @@ void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) int lightindex = GetLightIndex(light, portalgroup); if (lightindex >= 0) { + AddRange(UploadRanges.LightIndex, { (int)Mesh.LightIndexes.Size(), 1 }); Mesh.LightIndexes.Push(lightindex); surface.LightList.Count++; } @@ -266,6 +267,7 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) int lightindex = Mesh.Lights.Size(); light->levelmesh[index].index = lightindex + 1; light->levelmesh[index].portalgroup = portalgroup; + AddRange(UploadRanges.Light, { (int)Mesh.Lights.Size(), 1 }); Mesh.Lights.Push(meshlight); return lightindex; } @@ -273,14 +275,6 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) { CreateLights(doomMap); -#if 0 - static_cast(DynamicMesh.get())->Update(doomMap); - if (doomMap.lightmaps) - { - DynamicMesh->SetupTileTransforms(); - DynamicMesh->PackLightmapAtlas(StaticMesh->LMTextureCount); - } -#endif } bool DoomLevelMesh::TraceSky(const FVector3& start, FVector3 direction, float dist) From 95f31cdd7e6f1821c810952b01a1c06ff782cb2e Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 09:29:41 +0100 Subject: [PATCH 179/414] mingw64 requires including cstdint --- libraries/ZVulkan/src/glslang/glslang/Include/Common.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ZVulkan/src/glslang/glslang/Include/Common.h b/libraries/ZVulkan/src/glslang/glslang/Include/Common.h index 4f888ae16..87ec92f27 100644 --- a/libraries/ZVulkan/src/glslang/glslang/Include/Common.h +++ b/libraries/ZVulkan/src/glslang/glslang/Include/Common.h @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include From e3795c762a4bc9c72cf7b23278897a835776132b Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 09:30:06 +0100 Subject: [PATCH 180/414] Fix preprocessor symbol for Windows --- libraries/ZWidget/src/window/window.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ZWidget/src/window/window.cpp b/libraries/ZWidget/src/window/window.cpp index 234be61e4..b67b1a296 100644 --- a/libraries/ZWidget/src/window/window.cpp +++ b/libraries/ZWidget/src/window/window.cpp @@ -2,7 +2,7 @@ #include "window/window.h" #include -#ifdef WIN32 +#ifdef _WIN32 #include "win32/win32window.h" From 67d573cd41fdc4c78e5c38b1448da4b2b21179c4 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 09:30:20 +0100 Subject: [PATCH 181/414] Use TCHAR for Windows --- libraries/ZWidget/src/window/win32/win32window.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index 3ba21698a..54350513d 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -1,6 +1,7 @@ #include "win32window.h" #include +#include #include #include #include @@ -65,7 +66,7 @@ Win32Window::Win32Window(DisplayWindowHost* windowHost) : WindowHost(windowHost) classdesc.cbSize = sizeof(WNDCLASSEX); classdesc.hInstance = GetModuleHandle(0); classdesc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; - classdesc.lpszClassName = L"ZWidgetWindow"; + classdesc.lpszClassName = _T( "ZWidgetWindow" ); classdesc.lpfnWndProc = &Win32Window::WndProc; RegisterClassEx(&classdesc); @@ -74,7 +75,7 @@ Win32Window::Win32Window(DisplayWindowHost* windowHost) : WindowHost(windowHost) // WS_CAPTION shows the caption (yay! actually a flag that does what it says it does!) // WS_SYSMENU shows the min/max/close buttons // WS_THICKFRAME makes the window resizable - CreateWindowEx(WS_EX_APPWINDOW | WS_EX_DLGMODALFRAME, L"ZWidgetWindow", L"", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 100, 100, 0, 0, GetModuleHandle(0), this); + CreateWindowEx(WS_EX_APPWINDOW | WS_EX_DLGMODALFRAME, _T( "ZWidgetWindow" ), _T( "" ), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 100, 100, 0, 0, GetModuleHandle(0), this); /* RAWINPUTDEVICE rid; @@ -278,7 +279,7 @@ double Win32Window::GetDpiScale() const static bool done = false; if (!done) { - HMODULE hMod = GetModuleHandleA("User32.dll"); + HMODULE hMod = GetModuleHandle( _T( "User32.dll" )); if (hMod != nullptr) pGetDpiForWindow = reinterpret_cast(GetProcAddress(hMod, "GetDpiForWindow")); done = true; } @@ -387,8 +388,10 @@ void Win32Window::PresentBitmap(int width, int height, const uint32_t* pixels) LRESULT Win32Window::OnWindowMessage(UINT msg, WPARAM wparam, LPARAM lparam) { LPARAM result = 0; - if (DwmDefWindowProc(WindowHandle, msg, wparam, lparam, &result)) - return result; + + // DwmDefWindowProc is not a publicly defined symbol on Windows 11 + /*if (DwmDefWindowProc(WindowHandle, msg, wparam, lparam, &result)) + return result;*/ if (msg == WM_INPUT) { From 8f7b0ef4eb958501ee785ff96ae318914fb4d9b0 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 09:31:20 +0100 Subject: [PATCH 182/414] Fix libraries on mingw64 dxguid and dwmapi are required on mingw64 and give linker errors if missing legacy_studio_definitions is not in the latest mingw64 --- src/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 37d5d4839..dabeb3642 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -69,7 +69,9 @@ if( WIN32 ) setupapi oleaut32 dbghelp - legacy_stdio_definitions ) + dxguid + dwmapi + ) if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) if( DX_dxguid_LIBRARY ) From e1e5ae16e2501858e3ec5fec5fdb4132abc3d737 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 09:32:05 +0100 Subject: [PATCH 183/414] Fix namespace issue windows.h must be included in the main namespace on mingw64, otherwise there are loads of compile errors --- src/common/filesystem/source/critsec.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/common/filesystem/source/critsec.cpp b/src/common/filesystem/source/critsec.cpp index 874ade79f..b8b8c5522 100644 --- a/src/common/filesystem/source/critsec.cpp +++ b/src/common/filesystem/source/critsec.cpp @@ -31,8 +31,6 @@ ** */ -namespace FileSys { - #ifdef _WIN32 #ifndef _WINNT_ @@ -40,6 +38,8 @@ namespace FileSys { #include #endif +namespace FileSys { + class FInternalCriticalSection { public: @@ -82,6 +82,8 @@ void LeaveCriticalSection(FInternalCriticalSection *c) #include +namespace FileSys { + class FInternalCriticalSection { public: From 801dc4aaac3dbd0c46477d175091d6219fbfa8ac Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 09:32:19 +0100 Subject: [PATCH 184/414] sys/stat.h is required on all platforms --- src/common/filesystem/source/fs_findfile.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/common/filesystem/source/fs_findfile.cpp b/src/common/filesystem/source/fs_findfile.cpp index 9bc32e75e..e3d515ab1 100644 --- a/src/common/filesystem/source/fs_findfile.cpp +++ b/src/common/filesystem/source/fs_findfile.cpp @@ -35,6 +35,7 @@ #include "fs_findfile.h" #include #include +#include #ifndef _WIN32 @@ -45,8 +46,6 @@ #endif #include #include -#include - #include #endif From 120c0fb5caa41fb49de123d2e637a7e3baea9aee Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 09:32:33 +0100 Subject: [PATCH 185/414] Use TCHAR on Windows --- src/common/rendering/gl_load/gl_load.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/rendering/gl_load/gl_load.c b/src/common/rendering/gl_load/gl_load.c index 14aba7a70..f50830528 100644 --- a/src/common/rendering/gl_load/gl_load.c +++ b/src/common/rendering/gl_load/gl_load.c @@ -46,6 +46,7 @@ static void* PosixGetProcAddress (const GLubyte* name) #undef APIENTRY #endif #include +#include #ifdef _MSC_VER @@ -76,7 +77,7 @@ static void CheckOpenGL(void) { if (opengl32dll == 0) { - opengl32dll = LoadLibrary(L"OpenGL32.DLL"); + opengl32dll = LoadLibrary(_T("OpenGL32.DLL")); if (opengl32dll != 0) { createcontext = (HGLRC(WINAPI*)(HDC)) GetProcAddress(opengl32dll, "wglCreateContext"); From 709d5dd742ae0d18185a10d42916aa6d858dc097 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 10:08:32 +0100 Subject: [PATCH 186/414] Keep legacy_studio_definitions for non mingw64 toolchain --- src/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dabeb3642..e10d2cd1f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -73,11 +73,16 @@ if( WIN32 ) dwmapi ) + if( NOT MINGW ) + list( APPEND PROJECT_LIBRARIES legacy_stdio_definitions ) + endif() + if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) if( DX_dxguid_LIBRARY ) list( APPEND PROJECT_LIBRARIES "${DX_dxguid_LIBRARY}" ) endif() endif() + else() if( APPLE ) set( NO_GTK ON ) From 699bef1316f9b44572489537a1c869e9dbbd0268 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 10:33:10 +0100 Subject: [PATCH 187/414] Better solution for DwmDefWindowProc on mingw64 On mingw, create our own thunk for DwmDefWindowProc. It should exist in libdwmapi.a (and exists in MSVC), but doesn't. --- libraries/ZWidget/CMakeLists.txt | 3 +++ .../ZWidget/src/window/win32/win32window.cpp | 25 ++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/libraries/ZWidget/CMakeLists.txt b/libraries/ZWidget/CMakeLists.txt index dd836cd6d..68c048e22 100644 --- a/libraries/ZWidget/CMakeLists.txt +++ b/libraries/ZWidget/CMakeLists.txt @@ -120,6 +120,9 @@ include_directories(include include/zwidget src) if(WIN32) set(ZWIDGET_SOURCES ${ZWIDGET_SOURCES} ${ZWIDGET_WIN32_SOURCES}) add_definitions(-DUNICODE -D_UNICODE) + if(MINGW) + add_definitions(-DMINGW) + endif() elseif(APPLE) set(ZWIDGET_SOURCES ${ZWIDGET_SOURCES} ${ZWIDGET_COCOA_SOURCES}) set(ZWIDGET_LIBS ${CMAKE_DL_LIBS} -ldl) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index 54350513d..958c3fef6 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -29,6 +29,26 @@ #define RIDEV_INPUTSINK (0x100) #endif +#ifdef MINGW +// MinGW's library doesn't contain a thunk for DwmDefWindowProc, so we need to create our own + +BOOL DwmDefWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult ) +{ + typedef LRESULT(* dwmdwp)(HWND, UINT, WPARAM, LPARAM ); + BOOL result(false); + HMODULE module = LoadLibrary( _T( "dwmapi.dll" ) ); + if( module ) { + dwmdwp proc = reinterpret_cast( GetProcAddress( module, "DwmDefWindowProc" ) ); + if( proc ) { + *plResult = proc( hWnd, msg, wParam, lParam ); + } + FreeLibrary(module); + } + return result; +} + +#endif + static std::string from_utf16(const std::wstring& str) { if (str.empty()) return {}; @@ -389,9 +409,8 @@ LRESULT Win32Window::OnWindowMessage(UINT msg, WPARAM wparam, LPARAM lparam) { LPARAM result = 0; - // DwmDefWindowProc is not a publicly defined symbol on Windows 11 - /*if (DwmDefWindowProc(WindowHandle, msg, wparam, lparam, &result)) - return result;*/ + if (DwmDefWindowProc(WindowHandle, msg, wparam, lparam, &result)) + return result; if (msg == WM_INPUT) { From 42c64e438f5b5020e9e281f61c54c7e43cbda648 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 10:34:34 +0100 Subject: [PATCH 188/414] fix faux pas --- libraries/ZWidget/src/window/win32/win32window.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index 958c3fef6..f86fc669d 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -35,12 +35,13 @@ BOOL DwmDefWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult ) { typedef LRESULT(* dwmdwp)(HWND, UINT, WPARAM, LPARAM ); - BOOL result(false); + BOOL result(FALSE); HMODULE module = LoadLibrary( _T( "dwmapi.dll" ) ); if( module ) { dwmdwp proc = reinterpret_cast( GetProcAddress( module, "DwmDefWindowProc" ) ); if( proc ) { *plResult = proc( hWnd, msg, wParam, lParam ); + result = TRUE; } FreeLibrary(module); } From d17bde151fd34076172ed9d6f83b51db5dcde4c3 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 10:51:05 +0100 Subject: [PATCH 189/414] Fix to use the correct definition of DwmDefWindowProc --- libraries/ZWidget/src/window/win32/win32window.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index f86fc669d..32caafacf 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -34,14 +34,13 @@ BOOL DwmDefWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult ) { - typedef LRESULT(* dwmdwp)(HWND, UINT, WPARAM, LPARAM ); + typedef LRESULT(* dwmdwp)(HWND, UINT, WPARAM, LPARAM, LRESULT* ); BOOL result(FALSE); HMODULE module = LoadLibrary( _T( "dwmapi.dll" ) ); if( module ) { dwmdwp proc = reinterpret_cast( GetProcAddress( module, "DwmDefWindowProc" ) ); if( proc ) { - *plResult = proc( hWnd, msg, wParam, lParam ); - result = TRUE; + result = proc( hWnd, msg, wParam, lParam, plResult ); } FreeLibrary(module); } From 0d5e35985d2240f64e2f9dfb6307310ace5ac865 Mon Sep 17 00:00:00 2001 From: Ritchie Swann Date: Sun, 11 Aug 2024 10:52:32 +0100 Subject: [PATCH 190/414] Fix incorrect return type --- libraries/ZWidget/src/window/win32/win32window.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index 32caafacf..48531372c 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -34,7 +34,7 @@ BOOL DwmDefWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult ) { - typedef LRESULT(* dwmdwp)(HWND, UINT, WPARAM, LPARAM, LRESULT* ); + typedef BOOL(* dwmdwp)(HWND, UINT, WPARAM, LPARAM, LRESULT* ); BOOL result(FALSE); HMODULE module = LoadLibrary( _T( "dwmapi.dll" ) ); if( module ) { From 958721e2b87f9d1f0280221224a7ad0cfcda424d Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Wed, 14 Aug 2024 20:43:09 -0600 Subject: [PATCH 191/414] Forgot on check. --- src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 50a81b2c4..19478c30c 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -452,9 +452,12 @@ void HWDrawInfo::CreateScene(bool drawpsprites) angle_t a1 = FrustumAngle(); // horizontally clip the back of the viewport mClipper->SafeAddClipRangeRealAngles(vp.Angles.Yaw.BAMs() + a1, vp.Angles.Yaw.BAMs() - a1); Viewpoint.FrustAngle = a1; - double a2 = 20.0 + 0.5*Viewpoint.FieldOfView.Degrees(); // FrustumPitch for vertical clipping - if (a2 > 179.0) a2 = 179.0; - vClipper->SafeAddClipRangeDegPitches(vp.HWAngles.Pitch.Degrees() - a2, vp.HWAngles.Pitch.Degrees() + a2); // clip the suplex range + if (Viewpoint.IsAllowedOoB()) // No need for vertical clipper if viewpoint not allowed out of bounds + { + double a2 = 20.0 + 0.5*Viewpoint.FieldOfView.Degrees(); // FrustumPitch for vertical clipping + if (a2 > 179.0) a2 = 179.0; + vClipper->SafeAddClipRangeDegPitches(vp.HWAngles.Pitch.Degrees() - a2, vp.HWAngles.Pitch.Degrees() + a2); // clip the suplex range + } // reset the portal manager portalState.StartFrame(); From 2ecf796e2e654474ae440f496174f730bd1eb48a Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 15 Aug 2024 07:58:14 -0400 Subject: [PATCH 192/414] - add doomkex doom2kex tntkex and plutoniakex as valid iwad filenames --- wadsrc_extra/static/iwadinfo.txt | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/wadsrc_extra/static/iwadinfo.txt b/wadsrc_extra/static/iwadinfo.txt index d8149623c..f0709ec7d 100644 --- a/wadsrc_extra/static/iwadinfo.txt +++ b/wadsrc_extra/static/iwadinfo.txt @@ -325,7 +325,7 @@ IWad Autoname = "doom.id.doom1.bfg" Game = "Doom" Config = "Doom" - IWADName = "doom.wad", 2 + IWADName = "doombfg.wad", 2 Mapinfo = "mapinfo/ultdoom.txt" Compatibility = "Shorttex", "nosectionmerge" MustContain = "E1M1","E2M1","E2M2","E2M3","E2M4","E2M5","E2M6","E2M7","E2M8","E2M9", @@ -342,7 +342,7 @@ IWad Autoname = "doom.id.doom1.kex" Game = "Doom" Config = "Doom" - IWADName = "doom.wad", 2 + IWADName = "doomkex.wad", 2 Mapinfo = "mapinfo/ultdoom.txt" Compatibility = "Shorttex", "nosectionmerge" MustContain = "E1M1","E2M1","E2M2","E2M3","E2M4","E2M5","E2M6","E2M7","E2M8","E2M9", @@ -467,7 +467,7 @@ IWad Autoname = "doom.id.doom2.tnt.kex" Game = "Doom" Config = "Doom" - IWADName = "tnt.wad" + IWADName = "tntkex.wad" Mapinfo = "mapinfo/tnt.txt" Compatibility = "Shorttex", "Stairs" MustContain = "MAP01", "REDTNT2", "GAMECONF" @@ -510,7 +510,7 @@ IWad Autoname = "doom.id.doom2.plutonia.kex" Game = "Doom" Config = "Doom" - IWADName = "plutonia.wad" + IWADName = "plutoniakex.wad" Mapinfo = "mapinfo/plutonia.txt" Compatibility = "Shorttex" MustContain = "MAP01", "CAMO1", "GAMECONF" @@ -539,7 +539,7 @@ IWad Autoname = "doom.id.doom2.bfg" Game = "Doom" Config = "Doom" - IWADName = "doom2.wad" + IWADName = "doom2bfg.wad" Mapinfo = "mapinfo/doom2bfg.txt" Compatibility = "Shorttex", "nosectionmerge" MustContain = "MAP01", "DMENUPIC", "M_ACPT", "M_CAN", "M_EXITO", "M_CHG" @@ -554,7 +554,7 @@ IWad Autoname = "doom.id.doom2.kex" Game = "Doom" Config = "Doom" - IWADName = "doom2.wad", 2 + IWADName = "doom2kex.wad", 2 Mapinfo = "mapinfo/doom2.txt" Compatibility = "Shorttex", "nosectionmerge" MustContain = "MAP01", "DMENUPIC", "GAMECONF" @@ -584,7 +584,7 @@ IWad Autoname = "doom.id.doom2.commercial.xbox" Game = "Doom" Config = "Doom" - IWADName = "doom2.wad", 1 + IWADName = "doom2xbox.wad", 1 Mapinfo = "mapinfo/doom2xbox.txt" Compatibility = "Shorttex", "nosectionmerge" MustContain = "MAP01", "MAP33", "CWILV32" @@ -628,10 +628,12 @@ Names "doom_complete.pk3" "doom2.wad" "doom2unity.wad" + "doom2kex.wad" "doom2f.wad" "doomu.wad" "doom.wad" "doomunity.wad" + "doomkex.wad" "doom1.wad" "bfgdoom.wad" "bfgdoom2.wad" @@ -641,8 +643,10 @@ Names "doom2xbox.wad" "plutonia.wad" "plutoniaunity.wad" + "plutoniakex.wad" "tnt.wad" "tntunity.wad" + "tntkex.wad" "freedoom1.wad" "freedoom2.wad" "freedoomu.wad" @@ -677,17 +681,17 @@ Order // Order in the IWAD selection box "DOOM: Complete: WadSmoosh" "DOOM 2: Hell on Earth" "DOOM 2: L'Enfer sur Terre" + "DOOM 2: BFG Edition" + "DOOM 2: XBox Edition" + "DOOM 2: KEX Edition" + "DOOM 2: Unity Edition" "The Ultimate DOOM" "DOOM Registered" "DOOM Shareware" "DOOM: BFG Edition" - "DOOM 2: BFG Edition" "DOOM: XBox Edition" - "DOOM 2: XBox Edition" "DOOM: KEX Edition" "DOOM: Unity Edition" - "DOOM 2: KEX Edition" - "DOOM 2: Unity Edition" "Final Doom: Plutonia Experiment" "Final Doom: Plutonia Experiment: Unity Edition" "Final Doom: Plutonia Experiment: KEX Edition" From 855b7fc026a275a5d096eeab7d9bb6680f98f13d Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 15 Aug 2024 08:18:51 -0400 Subject: [PATCH 193/414] - add xbox filenames too --- wadsrc_extra/static/iwadinfo.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wadsrc_extra/static/iwadinfo.txt b/wadsrc_extra/static/iwadinfo.txt index f0709ec7d..343b64431 100644 --- a/wadsrc_extra/static/iwadinfo.txt +++ b/wadsrc_extra/static/iwadinfo.txt @@ -392,7 +392,7 @@ IWad Autoname = "doom.id.doom1.ultimate.xbox" Game = "Doom" Config = "Doom" - IWADName = "doom.wad" + IWADName = "doomxbox.wad" Mapinfo = "mapinfo/doomxbox.txt" Compatibility = "Shorttex", "nosectionmerge" MustContain = "E1M1","E2M1","E2M2","E2M3","E2M4","E2M5","E2M6","E2M7","E2M8","E2M9", @@ -627,11 +627,13 @@ Names { "doom_complete.pk3" "doom2.wad" + "doom2xbox.wad" "doom2unity.wad" "doom2kex.wad" "doom2f.wad" "doomu.wad" "doom.wad" + "doomxbox.wad" "doomunity.wad" "doomkex.wad" "doom1.wad" From f5c86819abb67534fe80706b8ed2e5ed824ec8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Farkas=20P=C3=A9ter?= Date: Fri, 16 Aug 2024 00:42:14 +0200 Subject: [PATCH 194/414] Added GOG path for Doom + Doom II --- src/win32/i_steam.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/win32/i_steam.cpp b/src/win32/i_steam.cpp index 07e7f2a02..2cc76ab66 100644 --- a/src/win32/i_steam.cpp +++ b/src/win32/i_steam.cpp @@ -183,7 +183,6 @@ static bool QueryPathKey(HKEY key, const wchar_t *keypath, const wchar_t *valnam TArray I_GetGogPaths() { - // TODO Does the 2024 Update affect GOG version? TArray result; FString path; std::wstring gamepath; @@ -226,6 +225,13 @@ TArray I_GetGogPaths() result.Push(path + "/DOOM II_Data/StreamingAssets"); // in a subdirectory } + // Look for Doom + Doom II + gamepath = gogregistrypath + L"\\1413291984"; + if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.c_str(), L"Path", path)) + { + result.Push(path); // directly in install folder + } + // Look for Final Doom gamepath = gogregistrypath + L"\\1435848742"; if (QueryPathKey(HKEY_LOCAL_MACHINE, gamepath.c_str(), L"Path", path)) @@ -355,7 +361,6 @@ TArray I_GetBethesdaPath() TArray result; static const char* const bethesda_dirs[] = { - // TODO Does the 2024 Update affect Bethesda Launcher? "DOOM_Classic_2019/base", "DOOM_Classic_2019/rerelease/DOOM_Data/StreamingAssets", "DOOM_II_Classic_2019/base", From 5fa220219e2e00a65d72e05f883d470db5b01a26 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 16 Aug 2024 12:36:42 +0200 Subject: [PATCH 195/414] Reverted use of tchar.h which should be considered deprecated. GZDoom is Unicode only - as should be the norm for any Windows application - and will not work when compiled as ANSI so there's no good reason to use this wrapper. --- libraries/ZWidget/src/window/win32/win32window.cpp | 9 ++++----- src/CMakeLists.txt | 9 +-------- src/common/rendering/gl_load/gl_load.c | 3 +-- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/libraries/ZWidget/src/window/win32/win32window.cpp b/libraries/ZWidget/src/window/win32/win32window.cpp index 48531372c..6ad09ef60 100644 --- a/libraries/ZWidget/src/window/win32/win32window.cpp +++ b/libraries/ZWidget/src/window/win32/win32window.cpp @@ -1,7 +1,6 @@ #include "win32window.h" #include -#include #include #include #include @@ -82,11 +81,11 @@ Win32Window::Win32Window(DisplayWindowHost* windowHost) : WindowHost(windowHost) Windows.push_front(this); WindowsIterator = Windows.begin(); - WNDCLASSEX classdesc = {}; + WNDCLASSEXW classdesc = {}; classdesc.cbSize = sizeof(WNDCLASSEX); classdesc.hInstance = GetModuleHandle(0); classdesc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; - classdesc.lpszClassName = _T( "ZWidgetWindow" ); + classdesc.lpszClassName = L"ZWidgetWindow"; classdesc.lpfnWndProc = &Win32Window::WndProc; RegisterClassEx(&classdesc); @@ -95,7 +94,7 @@ Win32Window::Win32Window(DisplayWindowHost* windowHost) : WindowHost(windowHost) // WS_CAPTION shows the caption (yay! actually a flag that does what it says it does!) // WS_SYSMENU shows the min/max/close buttons // WS_THICKFRAME makes the window resizable - CreateWindowEx(WS_EX_APPWINDOW | WS_EX_DLGMODALFRAME, _T( "ZWidgetWindow" ), _T( "" ), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 100, 100, 0, 0, GetModuleHandle(0), this); + CreateWindowExW(WS_EX_APPWINDOW | WS_EX_DLGMODALFRAME, L"ZWidgetWindow", L"", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 100, 100, 0, 0, GetModuleHandle(0), this); /* RAWINPUTDEVICE rid; @@ -299,7 +298,7 @@ double Win32Window::GetDpiScale() const static bool done = false; if (!done) { - HMODULE hMod = GetModuleHandle( _T( "User32.dll" )); + HMODULE hMod = GetModuleHandleA("User32.dll"); if (hMod != nullptr) pGetDpiForWindow = reinterpret_cast(GetProcAddress(hMod, "GetDpiForWindow")); done = true; } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e10d2cd1f..37d5d4839 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -69,20 +69,13 @@ if( WIN32 ) setupapi oleaut32 dbghelp - dxguid - dwmapi - ) - - if( NOT MINGW ) - list( APPEND PROJECT_LIBRARIES legacy_stdio_definitions ) - endif() + legacy_stdio_definitions ) if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) if( DX_dxguid_LIBRARY ) list( APPEND PROJECT_LIBRARIES "${DX_dxguid_LIBRARY}" ) endif() endif() - else() if( APPLE ) set( NO_GTK ON ) diff --git a/src/common/rendering/gl_load/gl_load.c b/src/common/rendering/gl_load/gl_load.c index f50830528..d5ba4e49f 100644 --- a/src/common/rendering/gl_load/gl_load.c +++ b/src/common/rendering/gl_load/gl_load.c @@ -46,7 +46,6 @@ static void* PosixGetProcAddress (const GLubyte* name) #undef APIENTRY #endif #include -#include #ifdef _MSC_VER @@ -77,7 +76,7 @@ static void CheckOpenGL(void) { if (opengl32dll == 0) { - opengl32dll = LoadLibrary(_T("OpenGL32.DLL")); + opengl32dll = LoadLibraryA("OpenGL32.DLL"); if (opengl32dll != 0) { createcontext = (HGLRC(WINAPI*)(HDC)) GetProcAddress(opengl32dll, "wglCreateContext"); From 0d43272c8fdb6bd2d0fc8cc94564efcdffe3948e Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 29 Mar 2024 19:49:16 -0400 Subject: [PATCH 196/414] Allow for Basic and Hexen armor replacing --- src/ct_chat.cpp | 2 +- src/g_statusbar/sbarinfo.cpp | 2 +- src/g_statusbar/sbarinfo_commands.cpp | 8 ++++---- src/gamedata/gi.cpp | 4 ++++ src/gamedata/gi.h | 2 ++ src/playsim/p_acs.cpp | 6 +++--- wadsrc/static/zscript/actors/checks.zs | 2 +- wadsrc/static/zscript/actors/hexen/boostarmor.zs | 2 +- .../static/zscript/actors/hexen/healingradius.zs | 2 +- wadsrc/static/zscript/actors/inventory/armor.zs | 14 +++++++------- wadsrc/static/zscript/actors/inventory_util.zs | 14 ++++++++++++++ wadsrc/static/zscript/actors/player/player.zs | 6 +++--- .../static/zscript/actors/player/player_cheat.zs | 2 +- .../static/zscript/actors/player/player_morph.zs | 2 +- wadsrc/static/zscript/doombase.zs | 2 ++ wadsrc/static/zscript/scriptutil/scriptutil.zs | 2 +- wadsrc/static/zscript/ui/statusbar/alt_hud.zs | 2 +- wadsrc/static/zscript/ui/statusbar/doom_sbar.zs | 2 +- wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs | 2 +- wadsrc/static/zscript/ui/statusbar/statusbar.zs | 8 ++++---- wadsrc/static/zscript/ui/statusbar/strife_sbar.zs | 4 ++-- 21 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index e5368f83e..a12bb9f20 100644 --- a/src/ct_chat.cpp +++ b/src/ct_chat.cpp @@ -436,7 +436,7 @@ static bool DoSubstitution (FString &out, const char *in) { if (strnicmp(a, "armor", 5) == 0) { - auto armor = player->mo->FindInventory(NAME_BasicArmor); + auto armor = player->mo->FindInventory(NAME_BasicArmor, true); out.AppendFormat("%d", armor != NULL ? armor->IntVar(NAME_Amount) : 0); } } diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 1d855cc23..6bb27d179 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -1036,7 +1036,7 @@ public: ammocount2 = ammo2 != nullptr ? ammo2->IntVar(NAME_Amount) : 0; //prepare ammo counts - armor = CPlayer->mo->FindInventory(NAME_BasicArmor); + armor = CPlayer->mo->FindInventory(NAME_BasicArmor, true); } void _Draw (EHudState state) diff --git a/src/g_statusbar/sbarinfo_commands.cpp b/src/g_statusbar/sbarinfo_commands.cpp index 73462f384..749294adc 100644 --- a/src/g_statusbar/sbarinfo_commands.cpp +++ b/src/g_statusbar/sbarinfo_commands.cpp @@ -276,7 +276,7 @@ class CommandDrawImage : public SBarInfoCommandFlowControl { int armorType = type - HEXENARMOR_ARMOR; - auto harmor = statusBar->CPlayer->mo->FindInventory(NAME_HexenArmor); + auto harmor = statusBar->CPlayer->mo->FindInventory(NAME_HexenArmor, true); if (harmor != NULL) { double *Slots = (double*)harmor->ScriptVar(NAME_Slots, nullptr); @@ -596,7 +596,7 @@ class CommandDrawSwitchableImage : public CommandDrawImage } else if(condition == ARMORTYPE) { - auto armor = statusBar->CPlayer->mo->FindInventory(NAME_BasicArmor); + auto armor = statusBar->CPlayer->mo->FindInventory(NAME_BasicArmor, true); if(armor != NULL) { auto n = armor->NameVar(NAME_ArmorType).GetIndex(); @@ -1413,7 +1413,7 @@ class CommandDrawNumber : public CommandDrawString case SAVEPERCENT: { double add = 0; - auto harmor = statusBar->CPlayer->mo->FindInventory(NAME_HexenArmor); + auto harmor = statusBar->CPlayer->mo->FindInventory(NAME_HexenArmor, true); if(harmor != NULL) { double *Slots = (double*)harmor->ScriptVar(NAME_Slots, nullptr); @@ -2775,7 +2775,7 @@ class CommandDrawBar : public SBarInfoCommand case SAVEPERCENT: { double add = 0; - auto harmor = statusBar->CPlayer->mo->FindInventory(NAME_HexenArmor); + auto harmor = statusBar->CPlayer->mo->FindInventory(NAME_HexenArmor, true); if (harmor != NULL) { double *Slots = (double*)harmor->ScriptVar(NAME_Slots, nullptr); diff --git a/src/gamedata/gi.cpp b/src/gamedata/gi.cpp index e907722e9..ed9b0bfa9 100644 --- a/src/gamedata/gi.cpp +++ b/src/gamedata/gi.cpp @@ -52,6 +52,8 @@ DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, backpacktype) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, Armor2Percent) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, ArmorIcon1) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, ArmorIcon2) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, BasicArmorClass) +DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, HexenArmorClass) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, gametype) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, norandomplayerclass) DEFINE_FIELD_X(GameInfoStruct, gameinfo_t, infoPages) @@ -392,6 +394,8 @@ void FMapInfoParser::ParseGameInfo() GAMEINFOKEY_SOUNDARRAY(PrecachedSounds, "precachesounds", 0, false) GAMEINFOKEY_STRINGARRAY(EventHandlers, "addeventhandlers", 0, false) GAMEINFOKEY_STRINGARRAY(EventHandlers, "eventhandlers", 0, false) + GAMEINFOKEY_STRING(BasicArmorClass, "BasicArmorClass") + GAMEINFOKEY_STRING(HexenArmorClass, "HexenArmorClass") GAMEINFOKEY_STRING(PauseSign, "pausesign") GAMEINFOKEY_STRING(quitSound, "quitSound") GAMEINFOKEY_STRING(BorderFlat, "borderFlat") diff --git a/src/gamedata/gi.h b/src/gamedata/gi.h index 5e713628d..a8d4fa66c 100644 --- a/src/gamedata/gi.h +++ b/src/gamedata/gi.h @@ -148,6 +148,8 @@ struct gameinfo_t FString SkyFlatName; FString ArmorIcon1; FString ArmorIcon2; + FName BasicArmorClass; + FName HexenArmorClass; FString PauseSign; FString Endoom; double Armor2Percent; diff --git a/src/playsim/p_acs.cpp b/src/playsim/p_acs.cpp index 1d4e90d1e..d05f5dae3 100644 --- a/src/playsim/p_acs.cpp +++ b/src/playsim/p_acs.cpp @@ -5506,7 +5506,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args, int & else { FName p(Level->Behaviors.LookupString(args[0])); - auto armor = Level->Players[args[1]]->mo->FindInventory(NAME_BasicArmor); + auto armor = Level->Players[args[1]]->mo->FindInventory(NAME_BasicArmor, true); if (armor && armor->NameVar(NAME_ArmorType) == p) return armor->IntVar(NAME_Amount); } return 0; @@ -5517,7 +5517,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args, int & { if (activator == NULL || activator->player == NULL) return 0; - auto equippedarmor = activator->FindInventory(NAME_BasicArmor); + auto equippedarmor = activator->FindInventory(NAME_BasicArmor, true); if (equippedarmor && equippedarmor->IntVar(NAME_Amount) != 0) { @@ -8898,7 +8898,7 @@ scriptwait: case PCD_PLAYERARMORPOINTS: if (activator) { - auto armor = activator->FindInventory(NAME_BasicArmor); + auto armor = activator->FindInventory(NAME_BasicArmor, true); PushToStack (armor ? armor->IntVar(NAME_Amount) : 0); } else diff --git a/wadsrc/static/zscript/actors/checks.zs b/wadsrc/static/zscript/actors/checks.zs index 280abf4fe..018f2b552 100644 --- a/wadsrc/static/zscript/actors/checks.zs +++ b/wadsrc/static/zscript/actors/checks.zs @@ -110,7 +110,7 @@ extend class Actor bool CheckArmorType(name Type, int amount = 1) { - let myarmor = BasicArmor(FindInventory("BasicArmor")); + let myarmor = BasicArmor(FindInventory("BasicArmor", true)); return myarmor != null && myarmor.ArmorType == type && myarmor.Amount >= amount; } diff --git a/wadsrc/static/zscript/actors/hexen/boostarmor.zs b/wadsrc/static/zscript/actors/hexen/boostarmor.zs index 4ed7c7f80..0592a4e2d 100644 --- a/wadsrc/static/zscript/actors/hexen/boostarmor.zs +++ b/wadsrc/static/zscript/actors/hexen/boostarmor.zs @@ -32,7 +32,7 @@ class ArtiBoostArmor : Inventory for (int i = 0; i < 4; ++i) { - armor = HexenArmor(Spawn("HexenArmor")); + armor = HexenArmor(Spawn(GetHexenArmorClass())); armor.bDropped = true; armor.health = i; armor.Amount = 1; diff --git a/wadsrc/static/zscript/actors/hexen/healingradius.zs b/wadsrc/static/zscript/actors/hexen/healingradius.zs index 852bd642a..508595a30 100644 --- a/wadsrc/static/zscript/actors/hexen/healingradius.zs +++ b/wadsrc/static/zscript/actors/hexen/healingradius.zs @@ -51,7 +51,7 @@ class ArtiHealingRadius : Inventory case 'Armor': for (int j = 0; j < 4; ++j) { - HexenArmor armor = HexenArmor(Spawn("HexenArmor")); + HexenArmor armor = HexenArmor(Spawn(GetHexenArmorClass())); armor.health = j; armor.Amount = 1; if (!armor.CallTryPickup (mo)) diff --git a/wadsrc/static/zscript/actors/inventory/armor.zs b/wadsrc/static/zscript/actors/inventory/armor.zs index bc764fc2c..8509c5bf2 100644 --- a/wadsrc/static/zscript/actors/inventory/armor.zs +++ b/wadsrc/static/zscript/actors/inventory/armor.zs @@ -106,7 +106,7 @@ class BasicArmor : Armor { // BasicArmor that is in use is stored in the inventory as BasicArmor. // BasicArmor that is in reserve is not. - let copy = BasicArmor(Spawn("BasicArmor")); + let copy = BasicArmor(Spawn(GetBasicArmorClass())); copy.SavePercent = SavePercent != 0 ? SavePercent : 0.33335; // slightly more than 1/3 to avoid roundoff errors. copy.Amount = Amount; copy.MaxAmount = MaxAmount; @@ -127,7 +127,7 @@ class BasicArmor : Armor override bool HandlePickup (Inventory item) { - if (item.GetClass() == "BasicArmor") + if (item is "BasicArmor") { // You shouldn't be picking up BasicArmor anyway. return true; @@ -271,13 +271,13 @@ class BasicArmorBonus : Armor override bool Use (bool pickup) { - let armor = BasicArmor(Owner.FindInventory("BasicArmor")); + let armor = BasicArmor(Owner.FindInventory("BasicArmor", true)); bool result = false; // This should really never happen but let's be prepared for a broken inventory. if (armor == null) { - armor = BasicArmor(Spawn("BasicArmor")); + armor = BasicArmor(Spawn(GetBasicArmorClass())); armor.BecomeItem (); armor.Amount = 0; armor.MaxAmount = MaxSaveAmount; @@ -391,12 +391,12 @@ class BasicArmorPickup : Armor override bool Use (bool pickup) { int SaveAmount = GetSaveAmount(); - let armor = BasicArmor(Owner.FindInventory("BasicArmor")); + let armor = BasicArmor(Owner.FindInventory("BasicArmor", true)); // This should really never happen but let's be prepared for a broken inventory. if (armor == null) { - armor = BasicArmor(Spawn("BasicArmor")); + armor = BasicArmor(Spawn(GetBasicArmorClass())); armor.BecomeItem (); Owner.AddInventory (armor); } @@ -471,7 +471,7 @@ class HexenArmor : Armor // Like BasicArmor, HexenArmor is used in the inventory but not the map. // health is the slot this armor occupies. // Amount is the quantity to give (0 = normal max). - let copy = HexenArmor(Spawn("HexenArmor")); + let copy = HexenArmor(Spawn(GetHexenArmorClass())); copy.AddArmorToSlot (health, Amount); GoAwayAndDie (); return copy; diff --git a/wadsrc/static/zscript/actors/inventory_util.zs b/wadsrc/static/zscript/actors/inventory_util.zs index 1bb9be512..011ca134f 100644 --- a/wadsrc/static/zscript/actors/inventory_util.zs +++ b/wadsrc/static/zscript/actors/inventory_util.zs @@ -855,8 +855,22 @@ extend class Actor } } + clearscope static class GetBasicArmorClass() + { + class cls = (class)(GameInfo.BasicArmorClass); + if (cls) + return cls; + return "BasicArmor"; + } + clearscope static class GetHexenArmorClass() + { + class cls = (class)(GameInfo.HexenArmorClass); + if (cls) + return cls; + return "HexenArmor"; + } } diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index b2252c16e..69e534b70 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -1906,8 +1906,8 @@ class PlayerPawn : Actor // it provides player class based protection that should not affect // any other protection item. let myclass = GetClass(); - GiveInventoryType('HexenArmor'); - let harmor = HexenArmor(FindInventory('HexenArmor')); + GiveInventoryType(GetHexenArmorClass()); + let harmor = HexenArmor(FindInventory('HexenArmor', true)); harmor.Slots[4] = self.HexenArmor[0]; for (int i = 0; i < 4; ++i) @@ -1918,7 +1918,7 @@ class PlayerPawn : Actor // BasicArmor must come right after that. It should not affect any // other protection item as well but needs to process the damage // before the HexenArmor does. - GiveInventoryType('BasicArmor'); + GiveInventoryType(GetBasicArmorClass()); // Now add the items from the DECORATE definition let di = GetDropItems(); diff --git a/wadsrc/static/zscript/actors/player/player_cheat.zs b/wadsrc/static/zscript/actors/player/player_cheat.zs index c89832dca..3fbb5f30b 100644 --- a/wadsrc/static/zscript/actors/player/player_cheat.zs +++ b/wadsrc/static/zscript/actors/player/player_cheat.zs @@ -139,7 +139,7 @@ extend class PlayerPawn { for (i = 0; i < 4; ++i) { - let armoritem = Inventory(Spawn("HexenArmor")); + let armoritem = Inventory(Spawn(GetHexenArmorClass())); armoritem.health = i; armoritem.Amount = 0; if (!armoritem.CallTryPickup (self)) diff --git a/wadsrc/static/zscript/actors/player/player_morph.zs b/wadsrc/static/zscript/actors/player/player_morph.zs index 435d61cdf..85d21d250 100644 --- a/wadsrc/static/zscript/actors/player/player_morph.zs +++ b/wadsrc/static/zscript/actors/player/player_morph.zs @@ -347,7 +347,7 @@ extend class PlayerPawn } // Reset the base AC of the player's Hexen armor back to its default. - let hexArmor = HexenArmor(alt.FindInventory("HexenArmor")); + let hexArmor = HexenArmor(alt.FindInventory("HexenArmor", true)); if (hexArmor) hexArmor.Slots[4] = alt.HexenArmor[0]; diff --git a/wadsrc/static/zscript/doombase.zs b/wadsrc/static/zscript/doombase.zs index 829e75270..54c44f821 100644 --- a/wadsrc/static/zscript/doombase.zs +++ b/wadsrc/static/zscript/doombase.zs @@ -89,6 +89,8 @@ extend struct GameInfoStruct native double Armor2Percent; native String ArmorIcon1; native String ArmorIcon2; + native Name BasicArmorClass; + native Name HexenArmorClass; native bool norandomplayerclass; native Array infoPages; native GIFont mStatscreenMapNameFont; diff --git a/wadsrc/static/zscript/scriptutil/scriptutil.zs b/wadsrc/static/zscript/scriptutil/scriptutil.zs index 26f1a2b9d..b9d13e7b5 100644 --- a/wadsrc/static/zscript/scriptutil/scriptutil.zs +++ b/wadsrc/static/zscript/scriptutil/scriptutil.zs @@ -61,7 +61,7 @@ class ScriptUtil play } if (type == 'Armor') { - type = "BasicArmor"; + type = Actor.GetBasicArmorClass().GetClassName(); } if (amount <= 0) { diff --git a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs index 203d55ec4..c1c6e7288 100644 --- a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs +++ b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs @@ -930,7 +930,7 @@ class AltHud ui int armory = hud_swaphealtharmor ? hudheight-45 : hudheight-20; int healthy = hud_swaphealtharmor ? hudheight-20 : hudheight-45; DrawHealth(CPlayer, 5, healthy); - DrawArmor(BasicArmor(CPlayer.mo.FindInventory('BasicArmor')), HexenArmor(CPlayer.mo.FindInventory('HexenArmor')), 5, armory); + DrawArmor(BasicArmor(CPlayer.mo.FindInventory('BasicArmor', true)), HexenArmor(CPlayer.mo.FindInventory('HexenArmor', true)), 5, armory); int y = DrawKeys(CPlayer, hudwidth-4, hudheight-10); y = DrawAmmo(CPlayer, hudwidth-5, y); diff --git a/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs b/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs index 39cad7adb..7e7496a41 100644 --- a/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs @@ -146,7 +146,7 @@ class DoomStatusBar : BaseStatusBar DrawImage(berserk? "PSTRA0" : "MEDIA0", (20, -2)); DrawString(mHUDFont, FormatNumber(CPlayer.health, 3), (44, -20)); - let armor = CPlayer.mo.FindInventory("BasicArmor"); + let armor = CPlayer.mo.FindInventory("BasicArmor", true); if (armor != null && armor.Amount > 0) { DrawInventoryIcon(armor, (20, -22)); diff --git a/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs b/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs index 5c29e176f..62cc27efa 100644 --- a/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs @@ -148,7 +148,7 @@ class HereticStatusBar : BaseStatusBar DrawString(mBigFont, FormatNumber(mHealthInterpolator.GetValue()), (41, -21), DI_TEXT_ALIGN_RIGHT); //armor - let armor = CPlayer.mo.FindInventory("BasicArmor"); + let armor = CPlayer.mo.FindInventory("BasicArmor", true); if (armor != null && armor.Amount > 0) { DrawInventoryIcon(armor, (58, -24)); diff --git a/wadsrc/static/zscript/ui/statusbar/statusbar.zs b/wadsrc/static/zscript/ui/statusbar/statusbar.zs index 58f2ecc3a..1cbaeae87 100644 --- a/wadsrc/static/zscript/ui/statusbar/statusbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/statusbar.zs @@ -430,7 +430,7 @@ class BaseStatusBar : StatusBarCore native int GetArmorAmount() { - let armor = CPlayer.mo.FindInventory("BasicArmor"); + let armor = CPlayer.mo.FindInventory("BasicArmor", true); return armor? armor.Amount : 0; } @@ -451,13 +451,13 @@ class BaseStatusBar : StatusBarCore native int GetArmorSavePercent() { double add = 0; - let harmor = HexenArmor(CPlayer.mo.FindInventory("HexenArmor")); + let harmor = HexenArmor(CPlayer.mo.FindInventory("HexenArmor", true)); if(harmor != NULL) { add = harmor.Slots[0] + harmor.Slots[1] + harmor.Slots[2] + harmor.Slots[3] + harmor.Slots[4]; } //Hexen counts basic armor also so we should too. - let armor = BasicArmor(CPlayer.mo.FindInventory("BasicArmor")); + let armor = BasicArmor(CPlayer.mo.FindInventory("BasicArmor", true)); if(armor != NULL && armor.Amount > 0) { add += armor.SavePercent * 100; @@ -771,7 +771,7 @@ class BaseStatusBar : StatusBarCore native void DrawHexenArmor(int armortype, String image, Vector2 pos, int flags = 0, double alpha = 1.0, Vector2 boxsize = (-1, -1), Vector2 scale = (1.,1.)) { - let harmor = HexenArmor(statusBar.CPlayer.mo.FindInventory("HexenArmor")); + let harmor = HexenArmor(statusBar.CPlayer.mo.FindInventory("HexenArmor", true)); if (harmor != NULL) { let slotval = harmor.Slots[armorType]; diff --git a/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs b/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs index f52195be4..7186d46d4 100644 --- a/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs @@ -287,7 +287,7 @@ class StrifeStatusBar : BaseStatusBar DrawHealthBar (points, 49, 175); // Armor - item = CPlayer.mo.FindInventory('BasicArmor'); + item = CPlayer.mo.FindInventory('BasicArmor', true); if (item != NULL && item.Amount > 0) { DrawInventoryIcon(item, (2, 177), DI_ITEM_OFFSETS); @@ -333,7 +333,7 @@ class StrifeStatusBar : BaseStatusBar DrawImage("I_MDKT", (14, -17)); // Draw armor - let armor = CPlayer.mo.FindInventory('BasicArmor'); + let armor = CPlayer.mo.FindInventory('BasicArmor', true); if (armor != NULL && armor.Amount != 0) { DrawString(mYelFont, FormatNumber(armor.Amount, 3), (35, -10)); From 1b20c92ca51b5b6ca21bf02b034d8e2ca4cc23e9 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Fri, 16 Aug 2024 18:26:11 -0400 Subject: [PATCH 197/414] Fixed counters not clearing when using shared/local pickups --- wadsrc/static/zscript/actors/inventory/inventory.zs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs index 2e6544093..0ca6faf3e 100644 --- a/wadsrc/static/zscript/actors/inventory/inventory.zs +++ b/wadsrc/static/zscript/actors/inventory/inventory.zs @@ -281,6 +281,7 @@ class Inventory : Actor if (!item || item == self) continue; + item.ClearCounters(); item.bSharingItem = true; item.bDropped = item.bNeverLocal = true; if (!item.CallTryPickup(players[i].mo)) @@ -847,6 +848,8 @@ class Inventory : Actor return; localPickUp = give != self; + if (localPickUp) + give.ClearCounters(); } bool res; @@ -1124,6 +1127,7 @@ class Inventory : Actor int pNum = client.PlayerNumber(); pickedUp[pNum] = true; DisableLocalRendering(pNum, true); + bCountItem = bCountSecret = false; } // Force spawn a new version of the item. This needs to use CreateCopy so that From 108ad7736a8af21ae2e0793303e1da408e38d5c6 Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Thu, 15 Aug 2024 17:02:17 +0300 Subject: [PATCH 198/414] Added itemcls to HasReceived CallTryPickup will cache the item's class and pass it to HasReceived, so the latter will know what item was received even if the item has been destroyed by the time it's called. --- wadsrc/static/zscript/actors/actor.zs | 6 ++++-- wadsrc/static/zscript/actors/inventory/inventory.zs | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 2658a052f..7dd0cfc2b 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -534,7 +534,9 @@ class Actor : Thinker native // [AA] Called by inventory items at the end of CallTryPickup to let actors // do something with the items they've received. 'Item' might be null for // items that disappear on pickup. - virtual void HasReceived(Inventory item) {} + // 'itemcls' is passed unconditionally, so it can still be read even if + // 'item' is null due to being destroyed with GoAwayAndDie() on pickup. + virtual void HasReceived(Inventory item, class itemcls) {} // Called in TryMove if the mover ran into another Actor. This isn't called on players // if they're currently predicting. Guarantees collisions unlike CanCollideWith. @@ -705,7 +707,7 @@ class Actor : Thinker native native void SoundAlert(Actor target, bool splash = false, double maxdist = 0); native void ClearBounce(); native TerrainDef GetFloorTerrain(); - native bool CheckLocalView(int consoleplayer = -1 /* parameter is not used anymore but needed for backward compatibility. */); + native bool CheckLocalView(int consoleplayer = -1 /* parameter is not used anymore but needed for backward compatibility�. */); native bool CheckNoDelay(); native bool UpdateWaterLevel (bool splash = true); native bool IsZeroDamage(); diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs index 0ca6faf3e..52009f2e1 100644 --- a/wadsrc/static/zscript/actors/inventory/inventory.zs +++ b/wadsrc/static/zscript/actors/inventory/inventory.zs @@ -647,9 +647,10 @@ class Inventory : Actor // unmorphed versions of a currently morphed actor cannot pick up anything. if (bUnmorphed) return false, null; - //[AA] starting with true, so that CanReceive can unset it, + // [AA] starting with true, so that CanReceive can unset it, // if necessary: bool res = true; + class cls = self.GetClass(); // [AA] CanReceive lets the actor receiving the item process it first. if (!toucher.CanReceive(self)) { @@ -696,7 +697,7 @@ class Inventory : Actor } } // [AA] Let the toucher do something with the item they've just received: - toucher.HasReceived(self); + toucher.HasReceived(self, cls); // If the item can be shared, make sure every player gets a copy. if (multiplayer && !deathmatch && !bDropped && ShouldShareItem(toucher)) From 4d18380956eaab3da9ccaf8a06043692b5d95cc5 Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Sat, 17 Aug 2024 18:58:03 +0300 Subject: [PATCH 199/414] Made itemcls optional And removed the invalid character on line 710 --- wadsrc/static/zscript/actors/actor.zs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 7dd0cfc2b..584b466af 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -536,7 +536,7 @@ class Actor : Thinker native // items that disappear on pickup. // 'itemcls' is passed unconditionally, so it can still be read even if // 'item' is null due to being destroyed with GoAwayAndDie() on pickup. - virtual void HasReceived(Inventory item, class itemcls) {} + virtual void HasReceived(Inventory item, class itemcls = null) {} // Called in TryMove if the mover ran into another Actor. This isn't called on players // if they're currently predicting. Guarantees collisions unlike CanCollideWith. @@ -707,7 +707,7 @@ class Actor : Thinker native native void SoundAlert(Actor target, bool splash = false, double maxdist = 0); native void ClearBounce(); native TerrainDef GetFloorTerrain(); - native bool CheckLocalView(int consoleplayer = -1 /* parameter is not used anymore but needed for backward compatibility�. */); + native bool CheckLocalView(int consoleplayer = -1 /* parameter is not used anymore but needed for backward compatibility. */); native bool CheckNoDelay(); native bool UpdateWaterLevel (bool splash = true); native bool IsZeroDamage(); From a8acdb9d374976d5c416df628647a884513b43cc Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 18 Aug 2024 14:56:58 +0200 Subject: [PATCH 200/414] Stop grabbing mouse when game window doesn't have the focus --- src/common/platform/win32/i_mouse.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/platform/win32/i_mouse.cpp b/src/common/platform/win32/i_mouse.cpp index 72dc3f335..e0050cc3a 100644 --- a/src/common/platform/win32/i_mouse.cpp +++ b/src/common/platform/win32/i_mouse.cpp @@ -267,7 +267,7 @@ void I_CheckNativeMouse(bool preferNative, bool eventhandlerresult) } else { - if ((GetForegroundWindow() != mainwindow.GetHandle()) || preferNative || !use_mouse) + if (preferNative || !use_mouse) { want_native = true; } @@ -286,6 +286,10 @@ void I_CheckNativeMouse(bool preferNative, bool eventhandlerresult) if (!want_native && eventhandlerresult) want_native = true; + // The application should *never* grab the mouse cursor if its window doesn't have the focus. + if (GetForegroundWindow() != mainwindow.GetHandle()) + want_native = true; + //Printf ("%d %d %d\n", wantNative, preferNative, NativeMouse); if (want_native != NativeMouse) From 87eb89ad334f87bf3da67f18e8e696f4dc7b7b21 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 19 Aug 2024 07:53:30 +0200 Subject: [PATCH 201/414] Remove some indirection --- src/common/platform/win32/i_mainwindow.cpp | 20 -------------------- src/common/platform/win32/i_mainwindow.h | 5 ----- src/common/platform/win32/st_start.cpp | 10 +++++----- 3 files changed, 5 insertions(+), 30 deletions(-) diff --git a/src/common/platform/win32/i_mainwindow.cpp b/src/common/platform/win32/i_mainwindow.cpp index abe46df5e..e13374056 100644 --- a/src/common/platform/win32/i_mainwindow.cpp +++ b/src/common/platform/win32/i_mainwindow.cpp @@ -128,26 +128,6 @@ void MainWindow::ShowErrorPane(const char* text) } } -void MainWindow::ShowNetStartPane(const char* message, int maxpos) -{ - NetStartWindow::ShowNetStartPane(message, maxpos); -} - -void MainWindow::HideNetStartPane() -{ - NetStartWindow::HideNetStartPane(); -} - -void MainWindow::SetNetStartProgress(int pos) -{ - NetStartWindow::SetNetStartProgress(pos); -} - -bool MainWindow::RunMessageLoop(bool (*timer_callback)(void*), void* userdata) -{ - return NetStartWindow::RunMessageLoop(timer_callback, userdata); -} - bool MainWindow::CheckForRestart() { bool result = restartrequest; diff --git a/src/common/platform/win32/i_mainwindow.h b/src/common/platform/win32/i_mainwindow.h index 3c0c7e55d..2e24619cc 100644 --- a/src/common/platform/win32/i_mainwindow.h +++ b/src/common/platform/win32/i_mainwindow.h @@ -25,11 +25,6 @@ public: void PrintStr(const char* cp); void GetLog(std::function writeFile); - void ShowNetStartPane(const char* message, int maxpos); - void SetNetStartProgress(int pos); - bool RunMessageLoop(bool (*timer_callback)(void*), void* userdata); - void HideNetStartPane(); - void SetWindowTitle(const char* caption); HWND GetHandle() { return Window; } diff --git a/src/common/platform/win32/st_start.cpp b/src/common/platform/win32/st_start.cpp index 8bc48d26e..b24fee867 100644 --- a/src/common/platform/win32/st_start.cpp +++ b/src/common/platform/win32/st_start.cpp @@ -53,7 +53,7 @@ #include "startupinfo.h" #include "i_interface.h" #include "texturemanager.h" -#include "i_mainwindow.h" +#include "common/widgets/netstartwindow.h" // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- @@ -140,7 +140,7 @@ void FBasicStartupScreen::Progress() void FBasicStartupScreen::NetInit(const char *message, int numplayers) { NetMaxPos = numplayers; - mainwindow.ShowNetStartPane(message, numplayers); + NetStartWindow::ShowNetStartPane(message, numplayers); NetMaxPos = numplayers; NetCurPos = 0; @@ -157,7 +157,7 @@ void FBasicStartupScreen::NetInit(const char *message, int numplayers) void FBasicStartupScreen::NetDone() { - mainwindow.HideNetStartPane(); + NetStartWindow::HideNetStartPane(); } //========================================================================== @@ -180,7 +180,7 @@ void FBasicStartupScreen::NetProgress(int count) NetCurPos = count; } - mainwindow.SetNetStartProgress(count); + NetStartWindow::SetNetStartProgress(count); } //========================================================================== @@ -199,5 +199,5 @@ void FBasicStartupScreen::NetProgress(int count) bool FBasicStartupScreen::NetLoop(bool (*timer_callback)(void *), void *userdata) { - return mainwindow.RunMessageLoop(timer_callback, userdata); + return NetStartWindow::RunMessageLoop(timer_callback, userdata); } From 356ad2fe9f8f2989f1577f9935d941a7784fb3d2 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 20 Aug 2024 02:06:05 +0200 Subject: [PATCH 202/414] Split doom specific surface data from common/gpu surface data --- .../hwrenderer/data/hw_levelmesh.cpp | 19 ++- .../rendering/hwrenderer/data/hw_levelmesh.h | 12 +- .../hwrenderer/data/hw_levelmeshsurface.h | 4 +- src/common/rendering/vulkan/vk_levelmesh.cpp | 2 +- .../rendering/vulkan/vk_lightmapper.cpp | 2 +- src/gamedata/r_defs.h | 1 - src/rendering/hwrenderer/doom_levelmesh.cpp | 143 ++++++++++-------- src/rendering/hwrenderer/doom_levelmesh.h | 23 ++- .../hwrenderer/scene/hw_drawstructs.h | 1 - 9 files changed, 110 insertions(+), 97 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 6892be941..9679394ce 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -64,7 +64,7 @@ LevelMeshSurface* LevelMesh::Trace(const FVector3& start, FVector3 direction, fl return nullptr; } - hitSurface = GetSurface(Mesh.SurfaceIndexes[hit.triangle]); + hitSurface = &Mesh.Surfaces[Mesh.SurfaceIndexes[hit.triangle]]; int portal = hitSurface->PortalIndex; if (!portal) @@ -91,7 +91,6 @@ LevelMeshSurface* LevelMesh::Trace(const FVector3& start, FVector3 direction, fl LevelMeshTileStats LevelMesh::GatherTilePixelStats() { LevelMeshTileStats stats; - int count = GetSurfaceCount(); for (const LightmapTile& tile : LightmapTiles) { auto area = tile.AtlasLocation.Area(); @@ -125,11 +124,11 @@ void LevelMesh::BuildTileSurfaceLists() { // Plane group surface is to be rendered with TArray PlaneGroups; - TArray PlaneGroupIndexes(GetSurfaceCount()); + TArray PlaneGroupIndexes(Mesh.Surfaces.Size()); - for (int i = 0, count = GetSurfaceCount(); i < count; i++) + for (int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) { - auto surface = GetSurface(i); + auto surface = &Mesh.Surfaces[i]; // Is this surface in the same plane as an existing plane group? int planeGroupIndex = -1; @@ -172,9 +171,9 @@ void LevelMesh::BuildTileSurfaceLists() for (auto& tile : LightmapTiles) tile.Surfaces.Clear(); - for (int i = 0, count = GetSurfaceCount(); i < count; i++) + for (int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) { - LevelMeshSurface* targetSurface = GetSurface(i); + LevelMeshSurface* targetSurface = &Mesh.Surfaces[i]; if (targetSurface->LightmapTileIndex < 0) continue; LightmapTile* tile = &LightmapTiles[targetSurface->LightmapTileIndex]; @@ -185,7 +184,7 @@ void LevelMesh::BuildTileSurfaceLists() if (surface != targetSurface && (maxUV.X < 0.0f || maxUV.Y < 0.0f || minUV.X > 1.0f || minUV.Y > 1.0f)) continue; // Bounding box not visible - tile->Surfaces.Push(GetSurfaceIndex(surface)); + tile->Surfaces.Push((unsigned int)(ptrdiff_t)(surface - Mesh.Surfaces.Data())); } } } @@ -224,9 +223,9 @@ void LevelMesh::PackLightmapAtlas(int lightmapStartIndex) LMTextureCount = (int)packer.getNumPages(); // Calculate final texture coordinates - for (int i = 0, count = GetSurfaceCount(); i < count; i++) + for (int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) { - auto surface = GetSurface(i); + auto surface = &Mesh.Surfaces[i]; if (surface->LightmapTileIndex >= 0) { const LightmapTile& tile = LightmapTiles[surface->LightmapTileIndex]; diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 3d9cb9111..00e38dff1 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -58,10 +58,6 @@ public: LevelMesh(); virtual ~LevelMesh() = default; - virtual LevelMeshSurface* GetSurface(int index) { return nullptr; } - virtual unsigned int GetSurfaceIndex(const LevelMeshSurface* surface) const { return 0xffffffff; } - virtual int GetSurfaceCount() { return 0; } - LevelMeshSurface* Trace(const FVector3& start, FVector3 direction, float maxDist); LevelMeshTileStats GatherTilePixelStats(); @@ -131,6 +127,7 @@ public: AddRange(FreeLists.Surface, { (int)surfaceIndex, 1 }); } + // Data placed in GPU buffers struct { // Vertex data @@ -138,6 +135,7 @@ public: TArray UniformIndexes; // Surface info + TArray Surfaces; TArray Uniforms; TArray Materials; TArray LightIndexes; @@ -160,6 +158,7 @@ public: int MaxLightIndexes = 0; } Mesh; + // Ranges in mesh that have changed since last upload struct { TArray Vertex; @@ -174,6 +173,7 @@ public: TArray LightIndex; } UploadRanges; + // Ranges in mesh currently not in use struct { TArray Vertex; @@ -182,8 +182,10 @@ public: TArray Surface; } FreeLists; + // Data structure for doing mesh traces on the CPU std::unique_ptr Collision; + // Draw index ranges for rendering the level mesh TArray DrawList; TArray PortalList; @@ -214,7 +216,7 @@ public: ClearRanges(UploadRanges.SurfaceIndex); AddRange(UploadRanges.SurfaceIndex, { 0, (int)Mesh.SurfaceIndexes.Size() }); ClearRanges(UploadRanges.Surface); - AddRange(UploadRanges.Surface, { 0, GetSurfaceCount() }); + AddRange(UploadRanges.Surface, { 0, (int)Mesh.Surfaces.Size() }); ClearRanges(UploadRanges.UniformIndexes); AddRange(UploadRanges.UniformIndexes, { 0, (int)Mesh.UniformIndexes.Size() }); ClearRanges(UploadRanges.Uniforms); diff --git a/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h b/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h index 898237da3..abe019cee 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmeshsurface.h @@ -26,7 +26,9 @@ struct LevelMeshSurface FGameTexture* Texture = nullptr; float Alpha = 1.0; - + + int PipelineID = 0; + bool IsSky = false; int PortalIndex = 0; int SectorGroup = 0; diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 827ccb932..5f87289c1 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -557,7 +557,7 @@ void VkLevelMeshUploader::UploadSurfaces() SurfaceInfo* surfaces = (SurfaceInfo*)(data + datapos); for (int j = 0, count = range.Size; j < count; j++) { - LevelMeshSurface* surface = Mesh->Mesh->GetSurface(range.Offset + j); + LevelMeshSurface* surface = &Mesh->Mesh->Mesh.Surfaces[range.Offset + j]; SurfaceInfo info; info.Normal = FVector3(surface->Plane.X, surface->Plane.Z, surface->Plane.Y); diff --git a/src/common/rendering/vulkan/vk_lightmapper.cpp b/src/common/rendering/vulkan/vk_lightmapper.cpp index 83bac594d..c569ce742 100644 --- a/src/common/rendering/vulkan/vk_lightmapper.cpp +++ b/src/common/rendering/vulkan/vk_lightmapper.cpp @@ -196,7 +196,7 @@ void VkLightmapper::Render() // Paint all surfaces visible in the tile for (int surfaceIndex : targetTile->Surfaces) { - LevelMeshSurface* surface = mesh->GetSurface(surfaceIndex); + LevelMeshSurface* surface = &mesh->Mesh.Surfaces[surfaceIndex]; pc.SurfaceIndex = surfaceIndex; VkDrawIndexedIndirectCommand cmd; diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index b9ea96752..bc3f3a58a 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -63,7 +63,6 @@ struct sector_t; class AActor; struct FSection; struct FLevelLocals; -struct DoomLevelMeshSurface; const uint16_t NO_INDEX = 0xffffu; const uint32_t NO_SIDE = 0xffffffffu; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 657506001..233810131 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -81,16 +81,19 @@ CCMD(invalidatelightmap) Printf("Marked %d out of %d tiles for update.\n", count, level.levelMesh->LightmapTiles.Size()); } -void PrintSurfaceInfo(const DoomLevelMeshSurface* surface) +void DoomLevelMesh::PrintSurfaceInfo(const LevelMeshSurface* surface) { if (!RequireLevelMesh()) return; + int surfaceIndex = (int)(ptrdiff_t)(surface - Mesh.Surfaces.Data()); + const auto& info = DoomSurfaceInfos[surfaceIndex]; + auto gameTexture = surface->Texture; - Printf("Surface %d (%p)\n Type: %d, TypeIndex: %d, ControlSector: %d\n", level.levelMesh->GetSurfaceIndex(surface), surface, surface->Type, surface->TypeIndex, surface->ControlSector ? surface->ControlSector->Index() : -1); + Printf("Surface %d (%p)\n Type: %d, TypeIndex: %d, ControlSector: %d\n", surfaceIndex, surface, info.Type, info.TypeIndex, info.ControlSector ? info.ControlSector->Index() : -1); if (surface->LightmapTileIndex >= 0) { - LightmapTile* tile = &level.levelMesh->LightmapTiles[surface->LightmapTileIndex]; + LightmapTile* tile = &LightmapTiles[surface->LightmapTileIndex]; Printf(" Atlas page: %d, x:%d, y:%d\n", tile->AtlasLocation.ArrayIndex, tile->AtlasLocation.X, tile->AtlasLocation.Y); Printf(" Pixels: %dx%d (area: %d)\n", tile->AtlasLocation.Width, tile->AtlasLocation.Height, tile->AtlasLocation.Area()); Printf(" Sample dimension: %d\n", tile->SampleDimension); @@ -130,10 +133,10 @@ CCMD(surfaceinfo) auto angle = pov->Angles.Yaw; auto pitch = pov->Angles.Pitch; - const auto surface = (DoomLevelMeshSurface*)level.levelMesh->Trace(posXYZ, FVector3(RayDir(angle, pitch)), 32000.0f); + const auto surface = level.levelMesh->Trace(posXYZ, FVector3(RayDir(angle, pitch)), 32000.0f); if (surface) { - PrintSurfaceInfo(surface); + level.levelMesh->PrintSurfaceInfo(surface); } else { @@ -185,12 +188,12 @@ void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) if (Mesh.Lights.Size() != 0) return; - for (DoomLevelMeshSurface& surface : Surfaces) + for (unsigned int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) { - surface.LightList.Pos = Mesh.LightIndexes.Size(); - surface.LightList.Count = 0; + Mesh.Surfaces[i].LightList.Pos = Mesh.LightIndexes.Size(); + Mesh.Surfaces[i].LightList.Count = 0; - std::pair nodePortalGroup = GetSurfaceLightNode(&surface); + std::pair nodePortalGroup = GetSurfaceLightNode(i); FLightNode* node = nodePortalGroup.first; int portalgroup = nodePortalGroup.second; if (!node) @@ -207,7 +210,7 @@ void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) { AddRange(UploadRanges.LightIndex, { (int)Mesh.LightIndexes.Size(), 1 }); Mesh.LightIndexes.Push(lightindex); - surface.LightList.Count++; + Mesh.Surfaces[i].LightList.Count++; } } node = node->nextLight; @@ -284,8 +287,9 @@ bool DoomLevelMesh::TraceSky(const FVector3& start, FVector3 direction, float di return surface && surface->IsSky; } -std::pair DoomLevelMesh::GetSurfaceLightNode(const DoomLevelMeshSurface* doomsurf) +std::pair DoomLevelMesh::GetSurfaceLightNode(int surfaceIndex) { + auto doomsurf = &DoomSurfaceInfos[surfaceIndex]; FLightNode* node = nullptr; int portalgroup = 0; if (doomsurf->Type == ST_FLOOR || doomsurf->Type == ST_CEILING) @@ -348,7 +352,7 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) int surf = Sides[sideIndex].FirstSurface; while (surf != -1) { - unsigned int next = Surfaces[surf].NextSurface; + unsigned int next = DoomSurfaceInfos[surf].NextSurface; FreeSurface(surf); surf = next; } @@ -365,7 +369,7 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) int surf = Flats[sectorIndex].FirstSurface; while (surf != -1) { - unsigned int next = Surfaces[surf].NextSurface; + unsigned int next = DoomSurfaceInfos[surf].NextSurface; FreeSurface(surf - 1); surf = next; } @@ -609,11 +613,19 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh sampleDimension = side->textures[side_t::bottom].LightmapSampleDistance; } - DoomLevelMeshSurface surf; - surf.Type = wallpart.LevelMeshInfo.Type; - surf.ControlSector = wallpart.LevelMeshInfo.ControlSector; - surf.TypeIndex = side->Index(); - surf.Side = side; + DoomSurfaceInfo info; + info.Type = wallpart.LevelMeshInfo.Type; + info.ControlSector = wallpart.LevelMeshInfo.ControlSector; + info.TypeIndex = side->Index(); + info.Side = side; + if (sideIndex < Sides.Size()) + { + info.NextSurface = Sides[sideIndex].FirstSurface; + Sides[sideIndex].FirstSurface = Mesh.Surfaces.Size(); + } + + LevelMeshSurface surf; + surf.PipelineID = pipelineID; surf.SectorGroup = sectorGroup[side->sector->Index()]; surf.Alpha = float(side->linedef->alpha); surf.MeshLocation.StartVertIndex = ginfo.VertexStart; @@ -622,31 +634,25 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh surf.MeshLocation.NumElements = ginfo.IndexCount; surf.Plane = FVector4(N.X, N.Y, 0.0f, v1 | N); surf.Texture = wallpart.texture; - surf.PipelineID = pipelineID; surf.PortalIndex = isPortal ? linePortals[side->linedef->Index()] : 0; surf.IsSky = isPortal ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; surf.Bounds = GetBoundsFromSurface(surf); - surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(surf, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; + surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, surf, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; - if (sideIndex < Sides.Size()) - { - surf.NextSurface = Sides[sideIndex].FirstSurface; - Sides[sideIndex].FirstSurface = Surfaces.Size(); - } - - Surfaces.Push(surf); + Mesh.Surfaces.Push(surf); + DoomSurfaceInfos.Push(info); } } -int DoomLevelMesh::AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate) +int DoomLevelMesh::AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate) { if (surf.IsSky) return -1; LightmapTileBinding binding; - binding.Type = surf.Type; - binding.TypeIndex = surf.TypeIndex; - binding.ControlSector = surf.ControlSector ? surf.ControlSector->Index() : (int)0xffffffffUL; + binding.Type = info.Type; + binding.TypeIndex = info.TypeIndex; + binding.ControlSector = info.ControlSector ? info.ControlSector->Index() : (int)0xffffffffUL; auto it = bindings.find(binding); if (it != bindings.end()) @@ -672,7 +678,7 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t s tile.Binding = binding; tile.Bounds = surf.Bounds; tile.Plane = surf.Plane; - tile.SampleDimension = GetSampleDimension(surf, sampleDimension); + tile.SampleDimension = GetSampleDimension(sampleDimension); tile.AlwaysUpdate = alwaysUpdate; LightmapTiles.Push(tile); @@ -681,7 +687,7 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t s } } -int DoomLevelMesh::GetSampleDimension(const DoomLevelMeshSurface& surf, uint16_t sampleDimension) +int DoomLevelMesh::GetSampleDimension(uint16_t sampleDimension) { if (sampleDimension <= 0) { @@ -787,9 +793,11 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state sampleDimension = flatpart.sector->planes[sector_t::floor].LightmapSampleDistance; } - DoomLevelMeshSurface surf; - surf.Type = flatpart.ceiling ? ST_CEILING : ST_FLOOR; - surf.ControlSector = flatpart.controlsector ? flatpart.controlsector->model : nullptr; + DoomSurfaceInfo info; + info.Type = flatpart.ceiling ? ST_CEILING : ST_FLOOR; + info.ControlSector = flatpart.controlsector ? flatpart.controlsector->model : nullptr; + + LevelMeshSurface surf; surf.SectorGroup = sectorGroup[flatpart.sector->Index()]; surf.Alpha = flatpart.alpha; surf.Texture = flatpart.texture; @@ -797,10 +805,10 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state surf.PortalIndex = sectorPortals[flatpart.ceiling][flatpart.sector->Index()]; surf.IsSky = isSky; - auto plane = surf.ControlSector ? surf.ControlSector->GetSecPlane(!flatpart.ceiling) : flatpart.sector->GetSecPlane(flatpart.ceiling); + auto plane = info.ControlSector ? info.ControlSector->GetSecPlane(!flatpart.ceiling) : flatpart.sector->GetSecPlane(flatpart.ceiling); surf.Plane = FVector4((float)plane.Normal().X, (float)plane.Normal().Y, (float)plane.Normal().Z, -(float)plane.D); - if (surf.ControlSector) + if (info.ControlSector) surf.Plane = -surf.Plane; float skyZ = flatpart.ceiling ? 32768.0f : -32768.0f; @@ -855,22 +863,23 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state } } - surf.TypeIndex = sub->Index(); - surf.Subsector = sub; + info.TypeIndex = sub->Index(); + info.Subsector = sub; surf.MeshLocation.StartVertIndex = startVertIndex; surf.MeshLocation.StartElementIndex = startElementIndex; surf.MeshLocation.NumVerts = sub->numlines; surf.MeshLocation.NumElements = (sub->numlines - 2) * 3; surf.Bounds = GetBoundsFromSurface(surf); - surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(surf, sampleDimension, !!(flatpart.sector->Flags & SECF_LM_DYNAMIC)) : -1; + surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, surf, sampleDimension, !!(flatpart.sector->Flags & SECF_LM_DYNAMIC)) : -1; if (sectorIndex < Flats.Size()) { - surf.NextSurface = Flats[sectorIndex].FirstSurface; - Flats[sectorIndex].FirstSurface = Surfaces.Size(); + info.NextSurface = Flats[sectorIndex].FirstSurface; + Flats[sectorIndex].FirstSurface = Mesh.Surfaces.Size(); } - Surfaces.Push(surf); + Mesh.Surfaces.Push(surf); + DoomSurfaceInfos.Push(info); } } } @@ -879,9 +888,9 @@ void DoomLevelMesh::SortIndexes() { // Order surfaces by pipeline std::unordered_map> pipelineSurfaces; - for (size_t i = 0; i < Surfaces.Size(); i++) + for (size_t i = 0; i < Mesh.Surfaces.Size(); i++) { - DoomLevelMeshSurface* s = &Surfaces[i]; + LevelMeshSurface* s = &Mesh.Surfaces[i]; pipelineSurfaces[(int64_t(s->PipelineID) << 32) | int64_t(s->IsSky)].Push(i); } @@ -896,7 +905,7 @@ void DoomLevelMesh::SortIndexes() // Move indexes to new array for (unsigned int i : it.second) { - DoomLevelMeshSurface& s = Surfaces[i]; + LevelMeshSurface& s = Mesh.Surfaces[i]; unsigned int start = s.MeshLocation.StartElementIndex; unsigned int count = s.MeshLocation.NumElements; @@ -927,28 +936,31 @@ void DoomLevelMesh::SortIndexes() void DoomLevelMesh::LinkSurfaces(FLevelLocals& doomMap) { - for (auto& surface : Surfaces) + for (unsigned int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) { - if (surface.Type == ST_FLOOR || surface.Type == ST_CEILING) + if (DoomSurfaceInfos[i].Type == ST_FLOOR || DoomSurfaceInfos[i].Type == ST_CEILING) { - SetSubsectorLightmap(&surface); + SetSubsectorLightmap(i); } else { - SetSideLightmap(&surface); + SetSideLightmap(i); } } } -void DoomLevelMesh::SetSubsectorLightmap(DoomLevelMeshSurface* surface) +void DoomLevelMesh::SetSubsectorLightmap(int surfaceIndex) { + int lightmapTileIndex = Mesh.Surfaces[surfaceIndex].LightmapTileIndex; + auto surface = &DoomSurfaceInfos[surfaceIndex]; + if (surface->Subsector->firstline && surface->Subsector->firstline->sidedef) surface->Subsector->firstline->sidedef->sector->HasLightmaps = true; if (!surface->ControlSector) { int index = surface->Type == ST_CEILING ? 1 : 0; - surface->Subsector->LightmapTiles[index][0] = surface->LightmapTileIndex; + surface->Subsector->LightmapTiles[index][0] = lightmapTileIndex; } else { @@ -958,28 +970,30 @@ void DoomLevelMesh::SetSubsectorLightmap(DoomLevelMeshSurface* surface) { if (ffloors[i]->model == surface->ControlSector) { - surface->Subsector->LightmapTiles[index][i + 1] = surface->LightmapTileIndex; + surface->Subsector->LightmapTiles[index][i + 1] = lightmapTileIndex; } } } } -void DoomLevelMesh::SetSideLightmap(DoomLevelMeshSurface* surface) +void DoomLevelMesh::SetSideLightmap(int surfaceIndex) { + int lightmapTileIndex = Mesh.Surfaces[surfaceIndex].LightmapTileIndex; + auto surface = &DoomSurfaceInfos[surfaceIndex]; if (!surface->ControlSector) { if (surface->Type == ST_UPPERSIDE) { - surface->Side->LightmapTiles[0] = surface->LightmapTileIndex; + surface->Side->LightmapTiles[0] = lightmapTileIndex; } else if (surface->Type == ST_MIDDLESIDE) { - surface->Side->LightmapTiles[1] = surface->LightmapTileIndex; - surface->Side->LightmapTiles[2] = surface->LightmapTileIndex; + surface->Side->LightmapTiles[1] = lightmapTileIndex; + surface->Side->LightmapTiles[2] = lightmapTileIndex; } else if (surface->Type == ST_LOWERSIDE) { - surface->Side->LightmapTiles[3] = surface->LightmapTileIndex; + surface->Side->LightmapTiles[3] = lightmapTileIndex; } } else @@ -990,7 +1004,7 @@ void DoomLevelMesh::SetSideLightmap(DoomLevelMeshSurface* surface) { if (ffloors[i]->model == surface->ControlSector) { - backside->LightmapTiles[4 + i] = surface->LightmapTileIndex; + backside->LightmapTiles[4 + i] = lightmapTileIndex; } } } @@ -1018,7 +1032,7 @@ void DoomLevelMesh::DumpMesh(const FString& objFilename, const FString& mtlFilen auto f = fopen(objFilename.GetChars(), "w"); fprintf(f, "# DoomLevelMesh debug export\n"); - fprintf(f, "# Vertices: %u, Indexes: %u, Surfaces: %u\n", Mesh.Vertices.Size(), Mesh.Indexes.Size(), Surfaces.Size()); + fprintf(f, "# Vertices: %u, Indexes: %u, Surfaces: %u\n", Mesh.Vertices.Size(), Mesh.Indexes.Size(), Mesh.Surfaces.Size()); fprintf(f, "mtllib %s\n", mtlFilename.GetChars()); double scale = 1 / 10.0; @@ -1069,7 +1083,7 @@ void DoomLevelMesh::DumpMesh(const FString& objFilename, const FString& mtlFilen { lastSurfaceIndex = index; - if (unsigned(index) >= Surfaces.Size()) + if (unsigned(index) >= Mesh.Surfaces.Size()) { fprintf(f, "o Surface[%d] (bad index)\n", index); fprintf(f, "usemtl error\n"); @@ -1078,8 +1092,9 @@ void DoomLevelMesh::DumpMesh(const FString& objFilename, const FString& mtlFilen } else { - const auto& surface = Surfaces[index]; - fprintf(f, "o Surface[%d] %s %d%s\n", index, name(surface.Type), surface.TypeIndex, surface.IsSky ? " sky" : ""); + const auto& info = DoomSurfaceInfos[index]; + const auto& surface = Mesh.Surfaces[index]; + fprintf(f, "o Surface[%d] %s %d%s\n", index, name(info.Type), info.TypeIndex, surface.IsSky ? " sky" : ""); if (surface.LightmapTileIndex >= 0) { diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 3ad00d9b4..a6793eb8a 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -18,7 +18,7 @@ struct HWWallDispatcher; class DoomLevelMesh; class MeshBuilder; -struct DoomLevelMeshSurface : public LevelMeshSurface +struct DoomSurfaceInfo { DoomLevelMeshSurfaceType Type = ST_NONE; int TypeIndex = 0; @@ -27,8 +27,6 @@ struct DoomLevelMeshSurface : public LevelMeshSurface side_t* Side = nullptr; sector_t* ControlSector = nullptr; - int PipelineID = 0; - int NextSurface = -1; }; @@ -47,9 +45,7 @@ class DoomLevelMesh : public LevelMesh, public UpdateLevelMesh public: DoomLevelMesh(FLevelLocals &doomMap); - LevelMeshSurface* GetSurface(int index) override { return &Surfaces[index]; } - unsigned int GetSurfaceIndex(const LevelMeshSurface* surface) const override { return (unsigned int)(ptrdiff_t)(static_cast(surface) - Surfaces.Data()); } - int GetSurfaceCount() override { return Surfaces.Size(); } + void PrintSurfaceInfo(const LevelMeshSurface* surface); void BeginFrame(FLevelLocals& doomMap); bool TraceSky(const FVector3& start, FVector3 direction, float dist); @@ -57,8 +53,6 @@ public: void BuildSectorGroups(const FLevelLocals& doomMap); - TArray Surfaces; - TArray> PolyLMSurfaces; TArray WallPortals; TArray sectorGroup; // index is sector, value is sectorGroup @@ -87,8 +81,8 @@ private: void FreeSide(FLevelLocals& doomMap, unsigned int sideIndex); void FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex); - void SetSubsectorLightmap(DoomLevelMeshSurface* surface); - void SetSideLightmap(DoomLevelMeshSurface* surface); + void SetSubsectorLightmap(int surfaceIndex); + void SetSideLightmap(int surfaceIndex); void SortIndexes(); @@ -99,14 +93,17 @@ private: BBox GetBoundsFromSurface(const LevelMeshSurface& surface) const; - int AddSurfaceToTile(const DoomLevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate); - int GetSampleDimension(const DoomLevelMeshSurface& surf, uint16_t sampleDimension); + int AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate); + int GetSampleDimension(uint16_t sampleDimension); void CreatePortals(FLevelLocals& doomMap); - std::pair GetSurfaceLightNode(const DoomLevelMeshSurface* doomsurf); + std::pair GetSurfaceLightNode(int surfaceIndex); int GetLightIndex(FDynamicLight* light, int portalgroup); + TArray DoomSurfaceInfos; + TArray> PolyDoomSurfaceInfos; + TArray Sides; TArray Flats; std::map bindings; diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index 0395d954b..9d62f9242 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -32,7 +32,6 @@ struct HWDecal; struct FSection; enum area_t : int; class HWDrawContext; -struct DoomLevelMeshSurface; struct HWFlatDispatcher; enum HWRenderStyle From 70cf707251c8eb527229278444d4ba2c0bf1cbb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Wed, 21 Aug 2024 00:08:57 -0300 Subject: [PATCH 203/414] Skip bex strings for freedoom if language lump is present (#2682) --- src/d_iwad.cpp | 4 + src/d_main.cpp | 8 +- src/d_main.h | 1 + src/gamedata/d_dehacked.cpp | 134 +++++++++++++++++-------------- src/gamedata/d_dehacked.h | 11 ++- wadsrc_extra/static/iwadinfo.txt | 4 + 6 files changed, 96 insertions(+), 66 deletions(-) diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 4758064a3..7f9bc60fe 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -138,6 +138,10 @@ void FIWadManager::ParseIWadInfo(const char *fn, const char *data, int datasize, { iwad->nokeyboardcheats = true; } + else if (sc.Compare("SkipBexStringsIfLanguage")) + { + iwad->SkipBexStringsIfLanguage = true; + } else if (sc.Compare("Compatibility")) { sc.MustGetStringName("="); diff --git a/src/d_main.cpp b/src/d_main.cpp index b0d3d88f2..c14149196 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1782,7 +1782,7 @@ bool ConsiderPatches (const char *arg) if ( (f = BaseFileSearch(args[i].GetChars(), ".deh", false, GameConfig)) || (f = BaseFileSearch(args[i].GetChars(), ".bex", false, GameConfig)) ) { - D_LoadDehFile(f); + D_LoadDehFile(f, 0); } } return argc > 0; @@ -3396,7 +3396,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw auto numbasesounds = soundEngine->GetNumSounds(); // Load embedded Dehacked patches - D_LoadDehLumps(FromIWAD); + D_LoadDehLumps(FromIWAD, iwad_info->SkipBexStringsIfLanguage ? DEH_SKIP_BEX_STRINGS_IF_LANGUAGE : 0); // [RH] Add any .deh and .bex files on the command line. // If there are none, try adding any in the config file. @@ -3413,13 +3413,13 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw if (stricmp (key, "Path") == 0 && FileExists (value)) { if (!batchrun) Printf ("Applying patch %s\n", value); - D_LoadDehFile(value); + D_LoadDehFile(value, 0); } } } // Load embedded Dehacked patches - D_LoadDehLumps(FromPWADs); + D_LoadDehLumps(FromPWADs, 0); // Create replacements for dehacked pickups FinishDehPatch(); diff --git a/src/d_main.h b/src/d_main.h index 6f6c37458..49e9846be 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -86,6 +86,7 @@ struct FIWADInfo int StartupType = FStartupInfo::DefaultStartup; // alternate startup type FString MapInfo; // Base mapinfo to load bool nokeyboardcheats = false; // disable keyboard cheats + bool SkipBexStringsIfLanguage = false; TArray Load; // Wads to be loaded with this one. TArray Lumps; // Lump names for identification TArray DeleteLumps; // Lumps which must be deleted from the directory. diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index 029878176..26123b319 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -446,28 +446,28 @@ struct Key { ptrdiff_t offset; }; -static int PatchThing (int); -static int PatchSound (int); -static int PatchFrame (int); -static int PatchSprite (int); -static int PatchAmmo (int); -static int PatchWeapon (int); -static int PatchPointer (int); -static int PatchCheats (int); -static int PatchMisc (int); -static int PatchText (int); -static int PatchStrings (int); -static int PatchPars (int); -static int PatchCodePtrs (int); -static int PatchMusic (int); -static int DoInclude (int); -static int PatchSpriteNames(int); -static int PatchSoundNames(int); -static bool DoDehPatch(); +static int PatchThing (int, int); +static int PatchSound (int, int); +static int PatchFrame (int, int); +static int PatchSprite (int, int); +static int PatchAmmo (int, int); +static int PatchWeapon (int, int); +static int PatchPointer (int, int); +static int PatchCheats (int, int); +static int PatchMisc (int, int); +static int PatchText (int, int); +static int PatchStrings (int, int); +static int PatchPars (int, int); +static int PatchCodePtrs (int, int); +static int PatchMusic (int, int); +static int DoInclude (int, int); +static int PatchSpriteNames(int, int); +static int PatchSoundNames(int, int); +static bool DoDehPatch(int); static const struct { const char *name; - int (*func)(int); + int (*func)(int, int); } Modes[] = { // These appear in .deh and .bex files { "Thing", PatchThing }, @@ -491,7 +491,7 @@ static const struct { { NULL, NULL }, }; -static int HandleMode (const char *mode, int num); +static int HandleMode (const char *mode, int num, int flags); static bool HandleKey (const struct Key *keys, void *structure, const char *key, int value); static bool ReadChars (char **stuff, int size); static char *igets (void); @@ -509,14 +509,14 @@ static void PushTouchedActor(PClassActor *cls) } -static int HandleMode (const char *mode, int num) +static int HandleMode (const char *mode, int num, int flags) { int i = 0; while (Modes[i].name && stricmp (Modes[i].name, mode)) i++; if (Modes[i].name) - return Modes[i].func (num); + return Modes[i].func (num, flags); // Handle unknown or unimplemented data Printf ("Unknown chunk %s encountered. Skipping.\n", mode); @@ -1181,7 +1181,7 @@ static void ClearBits2Stuff(AActor* defaults) } -static int PatchThing (int thingy) +static int PatchThing (int thingy, int flags) { enum { @@ -1776,7 +1776,7 @@ static int PatchThing (int thingy) // real benefit to doing this, and it would be very difficult for // me to emulate it, I have disabled them entirely. -static int PatchSound (int soundNum) +static int PatchSound (int soundNum, int flags) { int result; @@ -1833,7 +1833,7 @@ DehBits sbits[] = { }; -static int PatchFrame (int frameNum) +static int PatchFrame (int frameNum, int flags) { MBFArgs args{}; int result; @@ -1983,7 +1983,7 @@ static int PatchFrame (int frameNum) return result; } -static int PatchSprite (int sprNum) +static int PatchSprite (int sprNum, int flags) { int result; int offset = 0; @@ -2025,7 +2025,7 @@ static int PatchSprite (int sprNum) return result; } -static int PatchAmmo (int ammoNum) +static int PatchAmmo (int ammoNum, int flags) { PClassActor *ammoType = NULL; AActor *defaultAmmo = NULL; @@ -2116,7 +2116,7 @@ DehBits wbits[] = { { "NOAUTOSWITCHTO", WIF_NOAUTOSWITCHTO } }; -static int PatchWeapon (int weapNum) +static int PatchWeapon (int weapNum, int flags) { int result; PClassActor *type = nullptr; @@ -2324,7 +2324,7 @@ static int SetPointer(FState *state, PFunction *sym, int frame = 0) return -1; } -static int PatchPointer (int ptrNum) +static int PatchPointer (int ptrNum, int flags) { int result; @@ -2386,7 +2386,7 @@ static int PatchPointer (int ptrNum) return result; } -static int PatchCheats (int dummy) +static int PatchCheats (int dummy, int flags) { int result; @@ -2398,7 +2398,7 @@ static int PatchCheats (int dummy) return result; } -static int PatchMisc (int dummy) +static int PatchMisc (int dummy, int flags) { static const struct Key keys[] = { { "Initial Health", static_cast(myoffsetof(struct DehInfo,StartHealth)) }, @@ -2592,7 +2592,7 @@ static int PatchMisc (int dummy) return result; } -static int PatchPars (int dummy) +static int PatchPars (int dummy, int flags) { char *space, mapname[8], *moredata; level_info_t *info; @@ -2658,7 +2658,7 @@ static int PatchPars (int dummy) } -static int PatchCodePtrs (int dummy) +static int PatchCodePtrs (int dummy, int flags) { int result; @@ -2733,7 +2733,7 @@ static int PatchCodePtrs (int dummy) return result; } -static int PatchMusic (int dummy) +static int PatchMusic (int dummy, int flags) { int result; @@ -2788,7 +2788,7 @@ static void ReplaceSpriteInData(const char* oldStr, const char* newStr) } } -static int PatchText (int oldSize) +static int PatchText (int oldSize, int flags) { int newSize; char *oldStr; @@ -2895,7 +2895,7 @@ donewithtext: return result; } -static int PatchStrings (int dummy) +static int PatchStrings (int dummy, int flags) { int result; @@ -2919,20 +2919,23 @@ static int PatchStrings (int dummy) } } while (Line2 && *Line2); - ReplaceSpecialChars (holdstring.LockBuffer()); - holdstring.UnlockBuffer(); - // Account for a discrepancy between Boom's and ZDoom's name for the red skull key pickup message - const char *ll = Line1; - if (!stricmp(ll, "GOTREDSKULL")) ll = "GOTREDSKUL"; - TableElement te = { LumpFileNum, { holdstring, holdstring, holdstring, holdstring } }; - DehStrings.Insert(ll, te); - DPrintf (DMSG_SPAMMY, "%s set to:\n%s\n", Line1, holdstring.GetChars()); + if(!(flags & DEH_SKIP_BEX_STRINGS_IF_LANGUAGE)) + { + ReplaceSpecialChars (holdstring.LockBuffer()); + holdstring.UnlockBuffer(); + // Account for a discrepancy between Boom's and ZDoom's name for the red skull key pickup message + const char *ll = Line1; + if (!stricmp(ll, "GOTREDSKULL")) ll = "GOTREDSKUL"; + TableElement te = { LumpFileNum, { holdstring, holdstring, holdstring, holdstring } }; + DehStrings.Insert(ll, te); + DPrintf (DMSG_SPAMMY, "%s set to:\n%s\n", Line1, holdstring.GetChars()); + } } return result; } -static int PatchSoundNames (int dummy) +static int PatchSoundNames (int dummy, int flags) { int result; @@ -2949,7 +2952,7 @@ static int PatchSoundNames (int dummy) return result; } -static int PatchSpriteNames (int dummy) +static int PatchSpriteNames (int dummy, int flags) { int result; @@ -2985,7 +2988,7 @@ static int PatchSpriteNames (int dummy) } -static int DoInclude (int dummy) +static int DoInclude (int dummy, int flags) { char *data; int savedversion, savepversion, savepatchsize; @@ -3047,7 +3050,7 @@ static int DoInclude (int dummy) } } - D_LoadDehFile(path); + D_LoadDehFile(path, flags); if (data != path) { @@ -3080,7 +3083,7 @@ static bool isDehFile(int lumpnum) && (0 == stricmp(extension, ".deh") || 0 == stricmp(extension, ".bex")); } -int D_LoadDehLumps(DehLumpSource source) +int D_LoadDehLumps(DehLumpSource source, int flags) { int lastlump = 0, lumpnum, count = 0; @@ -3099,7 +3102,20 @@ int D_LoadDehLumps(DehLumpSource source) continue; } - count += D_LoadDehLump(lumpnum); + int filtered_flags = flags & ~DEH_SKIP_BEX_STRINGS_IF_LANGUAGE; + + if((flags & DEH_SKIP_BEX_STRINGS_IF_LANGUAGE) && FromIWAD == source) + { + int iwadnum = fileSystem.GetIwadNum(); + int lastlump2 = fileSystem.GetFirstEntry(iwadnum); + int lumpnum2 = fileSystem.FindLump("LANGUAGE", &lastlump2); + + if(lumpnum2 >= 0 && fileSystem.GetFileContainer(lumpnum2) == iwadnum) + { + filtered_flags |= DEH_SKIP_BEX_STRINGS_IF_LANGUAGE; + } + } + count += D_LoadDehLump(lumpnum, filtered_flags); } if (FromPWADs == source && 0 == PatchSize && dehload > 0) @@ -3112,7 +3128,7 @@ int D_LoadDehLumps(DehLumpSource source) { if (isDehFile(lumpnum)) { - count += D_LoadDehLump(lumpnum); + count += D_LoadDehLump(lumpnum, 0); } } } @@ -3122,7 +3138,7 @@ int D_LoadDehLumps(DehLumpSource source) { if (isDehFile(lumpnum)) { - count += D_LoadDehLump(lumpnum); + count += D_LoadDehLump(lumpnum, 0); break; } } @@ -3132,7 +3148,7 @@ int D_LoadDehLumps(DehLumpSource source) return count; } -bool D_LoadDehLump(int lumpnum) +bool D_LoadDehLump(int lumpnum, int flags) { auto ls = LumpFileNum; LumpFileNum = fileSystem.GetFileContainer(lumpnum); @@ -3143,13 +3159,13 @@ bool D_LoadDehLump(int lumpnum) PatchFile = new char[PatchSize + 1]; fileSystem.ReadFile(lumpnum, PatchFile); PatchFile[PatchSize] = '\0'; // terminate with a '\0' character - auto res = DoDehPatch(); + auto res = DoDehPatch(flags); LumpFileNum = ls; return res; } -bool D_LoadDehFile(const char *patchfile) +bool D_LoadDehFile(const char *patchfile, int flags) { FileReader fr; @@ -3162,7 +3178,7 @@ bool D_LoadDehFile(const char *patchfile) fr.Read(PatchFile, PatchSize); fr.Close(); PatchFile[PatchSize] = '\0'; // terminate with a '\0' character - return DoDehPatch(); + return DoDehPatch(flags); } else { @@ -3178,14 +3194,14 @@ bool D_LoadDehFile(const char *patchfile) } if (lumpnum >= 0) { - return D_LoadDehLump(lumpnum); + return D_LoadDehLump(lumpnum, flags); } } Printf ("Could not open DeHackEd patch \"%s\"\n", patchfile); return false; } -static bool DoDehPatch() +static bool DoDehPatch(int flags) { if (!batchrun) Printf("Adding dehacked patch %s\n", PatchName.GetChars()); @@ -3276,7 +3292,7 @@ static bool DoDehPatch() } else if (cont == 2) { - cont = HandleMode (Line1, atoi (Line2)); + cont = HandleMode (Line1, atoi (Line2), flags); } } while (cont); diff --git a/src/gamedata/d_dehacked.h b/src/gamedata/d_dehacked.h index bb87993e9..449964943 100644 --- a/src/gamedata/d_dehacked.h +++ b/src/gamedata/d_dehacked.h @@ -40,9 +40,14 @@ enum DehLumpSource FromPWADs }; -int D_LoadDehLumps(DehLumpSource source); -bool D_LoadDehLump(int lumpnum); -bool D_LoadDehFile(const char *filename); +enum DehFlags +{ + DEH_SKIP_BEX_STRINGS_IF_LANGUAGE = 1, +}; + +int D_LoadDehLumps(DehLumpSource source, int flags); +bool D_LoadDehLump(int lumpnum, int flags); +bool D_LoadDehFile(const char *filename, int flags); void FinishDehPatch (); #endif //__D_DEHACK_H__ diff --git a/wadsrc_extra/static/iwadinfo.txt b/wadsrc_extra/static/iwadinfo.txt index 343b64431..8eb7f1522 100644 --- a/wadsrc_extra/static/iwadinfo.txt +++ b/wadsrc_extra/static/iwadinfo.txt @@ -282,6 +282,7 @@ IWad Mapinfo = "mapinfo/doom2.txt" MustContain = "MAP01", "FREEDM" BannerColors = "32 54 43", "c6 dc d1" + SkipBexStringsIfLanguage } IWad @@ -294,6 +295,7 @@ IWad Mapinfo = "mapinfo/doom2.txt" MustContain = "MAP01", "FREEDOOM" BannerColors = "32 54 43", "c6 dc d1" + SkipBexStringsIfLanguage } IWad @@ -306,6 +308,7 @@ IWad Mapinfo = "mapinfo/doom1.txt" MustContain = "E1M1", "E2M1", "E3M1", "FREEDOOM" BannerColors = "32 54 43", "c6 dc d1" + SkipBexStringsIfLanguage } IWad @@ -317,6 +320,7 @@ IWad Mapinfo = "mapinfo/doom1.txt" MustContain = "E1M1", "FREEDOOM" BannerColors = "32 54 43", "c6 dc d1" + SkipBexStringsIfLanguage } IWad From d28a3571b5e95d0ab57f1d5055b401511bfade2a Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 23 Aug 2024 00:01:08 +0200 Subject: [PATCH 204/414] More level mesh buffer fun --- .../hwrenderer/data/hw_levelmesh.cpp | 48 +-- .../rendering/hwrenderer/data/hw_levelmesh.h | 193 ++++++++---- src/common/rendering/vulkan/vk_levelmesh.cpp | 88 +++--- src/rendering/hwrenderer/doom_levelmesh.cpp | 280 ++++++++++-------- src/rendering/hwrenderer/doom_levelmesh.h | 10 +- 5 files changed, 367 insertions(+), 252 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 9679394ce..5f9fb459c 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -4,6 +4,13 @@ LevelMesh::LevelMesh() { + LevelMeshLimits limits; + limits.MaxVertices = 12; + limits.MaxIndexes = 3 * 4; + limits.MaxSurfaces = 1; + limits.MaxUniforms = 1; + Reset(limits); + // Default portal LevelMeshPortal portal; Portals.Push(portal); @@ -11,38 +18,35 @@ LevelMesh::LevelMesh() AddEmptyMesh(); UpdateCollision(); - Mesh.MaxVertices = std::max(Mesh.Vertices.Size() * 2, (unsigned int)10000); - Mesh.MaxIndexes = std::max(Mesh.Indexes.Size() * 2, (unsigned int)10000); - Mesh.MaxSurfaces = std::max(Mesh.SurfaceIndexes.Size() * 2, (unsigned int)10000); - Mesh.MaxUniforms = std::max(Mesh.Uniforms.Size() * 2, (unsigned int)10000); - Mesh.MaxSurfaceIndexes = std::max(Mesh.SurfaceIndexes.Size() * 2, (unsigned int)10000); Mesh.MaxNodes = (int)std::max(Collision->get_nodes().size() * 2, (size_t)10000); - Mesh.MaxLights = 100'000; - Mesh.MaxLightIndexes = 4 * 1024 * 1024; } void LevelMesh::AddEmptyMesh() { + GeometryAllocInfo ginfo = AllocGeometry(12, 3 * 4); + // Default empty mesh (we can't make it completely empty since vulkan doesn't like that) float minval = -100001.0f; float maxval = -100000.0f; - Mesh.Vertices.Push({ minval, minval, minval }); - Mesh.Vertices.Push({ maxval, minval, minval }); - Mesh.Vertices.Push({ maxval, maxval, minval }); - Mesh.Vertices.Push({ minval, minval, minval }); - Mesh.Vertices.Push({ minval, maxval, minval }); - Mesh.Vertices.Push({ maxval, maxval, minval }); - Mesh.Vertices.Push({ minval, minval, maxval }); - Mesh.Vertices.Push({ maxval, minval, maxval }); - Mesh.Vertices.Push({ maxval, maxval, maxval }); - Mesh.Vertices.Push({ minval, minval, maxval }); - Mesh.Vertices.Push({ minval, maxval, maxval }); - Mesh.Vertices.Push({ maxval, maxval, maxval }); + ginfo.Vertices[0] = { minval, minval, minval }; + ginfo.Vertices[1] = { maxval, minval, minval }; + ginfo.Vertices[2] = { maxval, maxval, minval }; + ginfo.Vertices[3] = { minval, minval, minval }; + ginfo.Vertices[4] = { minval, maxval, minval }; + ginfo.Vertices[5] = { maxval, maxval, minval }; + ginfo.Vertices[6] = { minval, minval, maxval }; + ginfo.Vertices[7] = { maxval, minval, maxval }; + ginfo.Vertices[8] = { maxval, maxval, maxval }; + ginfo.Vertices[9] = { minval, minval, maxval }; + ginfo.Vertices[10] = { minval, maxval, maxval }; + ginfo.Vertices[11] = { maxval, maxval, maxval }; for (int i = 0; i < 3 * 4; i++) - Mesh.Indexes.Push(i); + ginfo.Indexes[i] = i; - UploadAll(); + Mesh.IndexCount = ginfo.IndexCount; + + UploadPortals(); } LevelMeshSurface* LevelMesh::Trace(const FVector3& start, FVector3 direction, float maxDist) @@ -109,7 +113,7 @@ LevelMeshTileStats LevelMesh::GatherTilePixelStats() void LevelMesh::UpdateCollision() { - Collision = std::make_unique(Mesh.Vertices.Data(), Mesh.Vertices.Size(), Mesh.Indexes.Data(), Mesh.Indexes.Size()); + Collision = std::make_unique(Mesh.Vertices.Data(), Mesh.Vertices.Size(), Mesh.Indexes.Data(), Mesh.IndexCount); UploadCollision(); } diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 00e38dff1..8361a274d 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -11,6 +11,7 @@ #include "hw_levelmeshsurface.h" #include "hw_materialstate.h" #include "hw_surfaceuniforms.h" +#include "engineerrors.h" #include #include @@ -44,12 +45,32 @@ struct UniformsAllocInfo int Count = 0; }; +struct SurfaceAllocInfo +{ + LevelMeshSurface* Surface = nullptr; + int Index = 0; +}; + +struct LightAllocInfo +{ + LevelMeshLight* Light = nullptr; + int Index = 0; +}; + struct MeshBufferRange { - int Offset = 0; - int Size = 0; + int Start = 0; + int End = 0; - bool operator<(const MeshBufferRange& other) const { return Offset < other.Offset; } + int Count() const { return End - Start; } +}; + +struct LevelMeshLimits +{ + int MaxVertices = 0; + int MaxSurfaces = 0; + int MaxUniforms = 0; + int MaxIndexes = 0; }; class LevelMesh @@ -71,20 +92,18 @@ public: GeometryAllocInfo AllocGeometry(int vertexCount, int indexCount) { GeometryAllocInfo info; - info.VertexStart = Mesh.Vertices.Size(); + info.VertexStart = RemoveRange(FreeLists.Vertex, vertexCount); info.VertexCount = vertexCount; - info.IndexStart = Mesh.Indexes.Size(); + info.IndexStart = RemoveRange(FreeLists.Index, indexCount); info.IndexCount = indexCount; - Mesh.Vertices.Resize(info.VertexStart + vertexCount); - Mesh.UniformIndexes.Resize(info.VertexStart + vertexCount); - Mesh.Indexes.Resize(info.IndexStart + indexCount); info.Vertices = &Mesh.Vertices[info.VertexStart]; info.UniformIndexes = &Mesh.UniformIndexes[info.VertexStart]; info.Indexes = &Mesh.Indexes[info.IndexStart]; - AddRange(UploadRanges.Vertex, { info.VertexStart, info.VertexCount }); - AddRange(UploadRanges.UniformIndexes, { info.VertexStart, info.VertexCount }); - AddRange(UploadRanges.Index, { info.IndexStart, info.IndexCount }); + AddRange(UploadRanges.Vertex, { info.VertexStart, info.VertexStart + info.VertexCount }); + AddRange(UploadRanges.UniformIndexes, { info.VertexStart, info.VertexStart + info.VertexCount }); + AddRange(UploadRanges.Index, { info.IndexStart, info.IndexStart + info.IndexCount }); + AddRange(UploadRanges.SurfaceIndex, { info.IndexStart / 3, (info.IndexStart + info.IndexCount) / 3 + 1 }); return info; } @@ -92,14 +111,23 @@ public: UniformsAllocInfo AllocUniforms(int count) { UniformsAllocInfo info; - info.Start = Mesh.Uniforms.Size(); + info.Start = RemoveRange(FreeLists.Uniforms, count); info.Count = count; - Mesh.Uniforms.Resize(info.Start + count); - Mesh.Materials.Resize(info.Start + count); info.Uniforms = &Mesh.Uniforms[info.Start]; info.Materials = &Mesh.Materials[info.Start]; - AddRange(UploadRanges.Uniforms, { info.Start, info.Count }); + AddRange(UploadRanges.Uniforms, { info.Start, info.Start + info.Count }); + + return info; + } + + SurfaceAllocInfo AllocSurface() + { + SurfaceAllocInfo info; + info.Index = RemoveRange(FreeLists.Surface, 1); + info.Surface = &Mesh.Surfaces[info.Index]; + + AddRange(UploadRanges.Surface, { info.Index, info.Index + 1 }); return info; } @@ -109,10 +137,10 @@ public: // Convert triangles to degenerates for (int i = 0; i < indexCount; i++) Mesh.Indexes[indexStart + i] = 0; - AddRange(UploadRanges.Index, { indexStart, indexCount }); + AddRange(UploadRanges.Index, { indexStart, indexStart + indexCount }); - AddRange(FreeLists.Vertex, { vertexStart, vertexCount }); - AddRange(FreeLists.Index, { indexStart, indexCount }); + AddRange(FreeLists.Vertex, { vertexStart, vertexStart + vertexCount }); + AddRange(FreeLists.Index, { indexStart, indexStart + indexCount }); } void FreeUniforms(int start, int count) @@ -127,6 +155,28 @@ public: AddRange(FreeLists.Surface, { (int)surfaceIndex, 1 }); } + // Sets the sizes of all the GPU buffers and empties the mesh + virtual void Reset(const LevelMeshLimits& limits) + { + Mesh.Vertices.Resize(limits.MaxVertices); + Mesh.UniformIndexes.Resize(limits.MaxVertices); + + Mesh.Surfaces.Resize(limits.MaxSurfaces); + Mesh.Uniforms.Resize(limits.MaxUniforms); + Mesh.Materials.Resize(limits.MaxUniforms); + + Mesh.Lights.Resize(16); + Mesh.LightIndexes.Resize(16); + + Mesh.Indexes.Resize(limits.MaxIndexes); + Mesh.SurfaceIndexes.Resize(limits.MaxIndexes / 3 + 1); + + FreeLists.Vertex.Clear(); FreeLists.Vertex.Push({ 0, limits.MaxVertices }); + FreeLists.Index.Clear(); FreeLists.Index.Push({ 0, limits.MaxIndexes }); + FreeLists.Uniforms.Clear(); FreeLists.Uniforms.Push({ 0, limits.MaxUniforms }); + FreeLists.Surface.Clear(); FreeLists.Surface.Push({ 0, limits.MaxSurfaces }); + } + // Data placed in GPU buffers struct { @@ -146,16 +196,10 @@ public: // Index data TArray Indexes; TArray SurfaceIndexes; + int IndexCount = 0; // Index range filled with data - // Above data must not be resized beyond these limits as that's the size of the GPU buffers - int MaxVertices = 0; - int MaxIndexes = 0; - int MaxSurfaces = 0; - int MaxUniforms = 0; - int MaxSurfaceIndexes = 0; + // GPU buffer size for collision nodes int MaxNodes = 0; - int MaxLights = 0; - int MaxLightIndexes = 0; } Mesh; // Ranges in mesh that have changed since last upload @@ -207,26 +251,10 @@ public: void AddEmptyMesh(); - void UploadAll() + void UploadPortals() { - ClearRanges(UploadRanges.Vertex); - AddRange(UploadRanges.Vertex, { 0, (int)Mesh.Vertices.Size() }); - ClearRanges(UploadRanges.Index); - AddRange(UploadRanges.Index, { 0, (int)Mesh.Indexes.Size() }); - ClearRanges(UploadRanges.SurfaceIndex); - AddRange(UploadRanges.SurfaceIndex, { 0, (int)Mesh.SurfaceIndexes.Size() }); - ClearRanges(UploadRanges.Surface); - AddRange(UploadRanges.Surface, { 0, (int)Mesh.Surfaces.Size() }); - ClearRanges(UploadRanges.UniformIndexes); - AddRange(UploadRanges.UniformIndexes, { 0, (int)Mesh.UniformIndexes.Size() }); - ClearRanges(UploadRanges.Uniforms); - AddRange(UploadRanges.Uniforms, { 0, (int)Mesh.Uniforms.Size() }); - ClearRanges(UploadRanges.Portals); + UploadRanges.Portals.Clear(); AddRange(UploadRanges.Portals, { 0, (int)Portals.Size() }); - ClearRanges(UploadRanges.Light); - AddRange(UploadRanges.Light, { 0, (int)Mesh.Lights.Size() }); - ClearRanges(UploadRanges.LightIndex); - AddRange(UploadRanges.LightIndex, { 0, (int)Mesh.LightIndexes.Size() }); } void UploadCollision() @@ -236,42 +264,81 @@ public: UploadRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); } - void ClearRanges(TArray& ranges) + int RemoveRange(TArray& ranges, int count) { - ranges.Clear(); + for (unsigned int i = ranges.Size(); i > 0; i--) + { + auto& item = ranges[i - 1]; + if (item.End - item.Start >= count) + { + int pos = item.Start; + item.Start += count; + if (item.Start == item.End) + { + ranges.Delete(i - 1); + } + return pos; + } + } + I_FatalError("Could not find space in level mesh buffer"); } void AddRange(TArray& ranges, MeshBufferRange range) { - if (range.Size <= 0) + // Empty range? + if (range.Start == range.End) return; - auto right = std::lower_bound(ranges.begin(), ranges.end(), range); + // First element? + if (ranges.Size() == 0) + { + ranges.push_back(range); + return; + } + // Find start position in ranges + auto right = std::lower_bound(ranges.begin(), ranges.end(), range, [](const auto& a, const auto& b) { return a.Start < b.Start; }); bool leftExists = right != ranges.begin(); bool rightExists = right != ranges.end(); - auto left = right; if (leftExists) --left; - if (leftExists && rightExists && left->Offset + left->Size == range.Offset && right->Offset == range.Offset + range.Size) // ####[--]#### - { - left->Size += range.Size + right->Size; - ranges.Delete(right - ranges.begin()); - } - else if (leftExists && left->Offset + left->Size == range.Offset) // ####[--] #### - { - left->Size += range.Size; - } - else if (rightExists && right->Offset == range.Offset + range.Size) // #### [--]#### - { - right->Offset -= range.Size; - } - else // ##### [--] #### + // Is this a gap between two ranges? + if ((!leftExists || left->End < range.Start) && (!rightExists || right->Start > range.End)) { ranges.Insert(right - ranges.begin(), range); + return; } + + // Are we extending the left or the right range? + if (leftExists && range.Start <= left->End) + { + left->End = std::max(left->End, range.End); + right = left; + } + else // if (rightExists && right->Start <= range.End) + { + right->Start = range.Start; + right->End = std::max(right->End, range.End); + left = right; + } + + // Merge overlaps to the right + while (true) + { + ++right; + if (right == ranges.end() || right->Start > range.End) + break; + left->End = std::max(right->End, range.End); + } + + // Remove ranges now covered by the extended range + //ranges.erase(++left, right); + ++left; + auto leftPos = left - ranges.begin(); + auto rightPos = right - ranges.begin(); + ranges.Delete(leftPos, rightPos - leftPos); } }; diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 5f87289c1..4a1296869 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -80,7 +80,7 @@ void VkLevelMesh::CreateVulkanObjects() .AddMemory(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT) .Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.Indexes.Size()); + DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.IndexCount); CreateTLASInstanceBuffer(); UploadTLASInstanceBuffer(); @@ -128,7 +128,7 @@ void VkLevelMesh::BeginFrame() deletelist->Add(std::move(DynamicBLAS.AccelStructBuffer)); deletelist->Add(std::move(DynamicBLAS.AccelStruct)); - DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.Indexes.Size()); + DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.IndexCount); deletelist->Add(std::move(TopLevelAS.TransferBuffer)); deletelist->Add(std::move(TopLevelAS.InstanceBuffer)); @@ -173,7 +173,7 @@ void VkLevelMesh::CreateBuffers() VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR : 0) | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) - .Size(Mesh->Mesh.MaxVertices * sizeof(FFlatVertex)) + .Size(Mesh->Mesh.Vertices.Size() * sizeof(FFlatVertex)) .DebugName("VertexBuffer") .Create(fb->GetDevice()); @@ -181,7 +181,7 @@ void VkLevelMesh::CreateBuffers() .Usage( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(Mesh->Mesh.MaxVertices * sizeof(int)) + .Size(Mesh->Mesh.UniformIndexes.size() * sizeof(int)) .DebugName("UniformIndexes") .Create(fb->GetDevice()); @@ -193,7 +193,7 @@ void VkLevelMesh::CreateBuffers() VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR : 0) | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) - .Size((size_t)Mesh->Mesh.MaxIndexes * sizeof(uint32_t)) + .Size((size_t)Mesh->Mesh.Indexes.Size() * sizeof(uint32_t)) .DebugName("IndexBuffer") .Create(fb->GetDevice()); @@ -205,19 +205,19 @@ void VkLevelMesh::CreateBuffers() SurfaceIndexBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(Mesh->Mesh.MaxSurfaceIndexes * sizeof(int)) + .Size(Mesh->Mesh.SurfaceIndexes.Size() * sizeof(int)) .DebugName("SurfaceBuffer") .Create(fb->GetDevice()); SurfaceBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(Mesh->Mesh.MaxSurfaces * sizeof(SurfaceInfo)) + .Size(Mesh->Mesh.Surfaces.Size() * sizeof(SurfaceInfo)) .DebugName("SurfaceBuffer") .Create(fb->GetDevice()); UniformsBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(Mesh->Mesh.MaxUniforms * sizeof(SurfaceUniforms)) + .Size(Mesh->Mesh.Uniforms.Size() * sizeof(SurfaceUniforms)) .DebugName("SurfaceUniformsBuffer") .Create(fb->GetDevice()); @@ -229,13 +229,13 @@ void VkLevelMesh::CreateBuffers() LightBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(Mesh->Mesh.MaxLights * sizeof(LightInfo)) + .Size(Mesh->Mesh.Lights.Size() * sizeof(LightInfo)) .DebugName("LightBuffer") .Create(fb->GetDevice()); LightIndexBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(Mesh->Mesh.MaxLightIndexes * sizeof(int32_t)) + .Size(Mesh->Mesh.LightIndexes.Size() * sizeof(int32_t)) .DebugName("LightIndexBuffer") .Create(fb->GetDevice()); } @@ -518,9 +518,9 @@ void VkLevelMeshUploader::UploadNodes() { const auto& srcnodes = Mesh->Mesh->Collision->get_nodes(); CollisionNode* nodes = (CollisionNode*)(data + datapos); - for (int i = 0, count = range.Size; i < count; i++) + for (int i = 0, count = range.Count(); i < count; i++) { - const auto& node = srcnodes[range.Offset + i]; + const auto& node = srcnodes[range.Start + i]; CollisionNode info; info.center = SwapYZ(node.aabb.Center); info.extents = SwapYZ(node.aabb.Extents); @@ -530,9 +530,9 @@ void VkLevelMeshUploader::UploadNodes() *(nodes++) = info; } - size_t copysize = range.Size * sizeof(CollisionNode); + size_t copysize = range.Count() * sizeof(CollisionNode); if (copysize > 0) - copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, sizeof(CollisionNodeBufferHeader) + range.Offset * sizeof(CollisionNode), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, sizeof(CollisionNodeBufferHeader) + range.Start * sizeof(CollisionNode), copysize); datapos += copysize; } } @@ -542,10 +542,10 @@ void VkLevelMeshUploader::UploadRanges(const TArray& ranges, co { for (const MeshBufferRange& range : ranges) { - size_t copysize = range.Size * sizeof(T); - memcpy(data + datapos, srcbuffer + range.Offset, copysize); + size_t copysize = range.Count() * sizeof(T); + memcpy(data + datapos, srcbuffer + range.Start, copysize); if (copysize > 0) - copyCommands.emplace_back(transferBuffer.get(), destbuffer, datapos, range.Offset * sizeof(T), copysize); + copyCommands.emplace_back(transferBuffer.get(), destbuffer, datapos, range.Start * sizeof(T), copysize); datapos += copysize; } } @@ -555,9 +555,9 @@ void VkLevelMeshUploader::UploadSurfaces() for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Surface) { SurfaceInfo* surfaces = (SurfaceInfo*)(data + datapos); - for (int j = 0, count = range.Size; j < count; j++) + for (int j = 0, count = range.Count(); j < count; j++) { - LevelMeshSurface* surface = &Mesh->Mesh->Mesh.Surfaces[range.Offset + j]; + LevelMeshSurface* surface = &Mesh->Mesh->Mesh.Surfaces[range.Start + j]; SurfaceInfo info; info.Normal = FVector3(surface->Plane.X, surface->Plane.Z, surface->Plane.Y); @@ -579,9 +579,9 @@ void VkLevelMeshUploader::UploadSurfaces() *(surfaces++) = info; } - size_t copysize = range.Size * sizeof(SurfaceInfo); + size_t copysize = range.Count() * sizeof(SurfaceInfo); if (copysize > 0) - copyCommands.emplace_back(transferBuffer.get(), Mesh->SurfaceBuffer.get(), datapos, range.Offset * sizeof(SurfaceInfo), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->SurfaceBuffer.get(), datapos, range.Start * sizeof(SurfaceInfo), copysize); datapos += copysize; } } @@ -590,10 +590,10 @@ void VkLevelMeshUploader::UploadUniforms() { for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Uniforms) { - for (int j = 0, count = range.Size; j < count; j++) + for (int j = 0, count = range.Count(); j < count; j++) { - auto& surfaceUniforms = Mesh->Mesh->Mesh.Uniforms[range.Offset + j]; - auto& material = Mesh->Mesh->Mesh.Materials[range.Offset + j]; + auto& surfaceUniforms = Mesh->Mesh->Mesh.Uniforms[range.Start + j]; + auto& material = Mesh->Mesh->Mesh.Materials[range.Start + j]; if (material.mMaterial) { auto source = material.mMaterial->Source(); @@ -607,10 +607,10 @@ void VkLevelMeshUploader::UploadUniforms() } SurfaceUniforms* uniforms = (SurfaceUniforms*)(data + datapos); - size_t copysize = range.Size * sizeof(SurfaceUniforms); + size_t copysize = range.Count() * sizeof(SurfaceUniforms); memcpy(uniforms, Mesh->Mesh->Mesh.Uniforms.Data(), copysize); if (copysize > 0) - copyCommands.emplace_back(transferBuffer.get(), Mesh->UniformsBuffer.get(), datapos, range.Offset * sizeof(SurfaceUniforms), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->UniformsBuffer.get(), datapos, range.Start * sizeof(SurfaceUniforms), copysize); datapos += copysize; } } @@ -620,17 +620,17 @@ void VkLevelMeshUploader::UploadPortals() for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Portals) { PortalInfo* portals = (PortalInfo*)(data + datapos); - for (int i = 0, count = range.Size; i < count; i++) + for (int i = 0, count = range.Count(); i < count; i++) { - const auto& portal = Mesh->Mesh->Portals[range.Offset + i]; + const auto& portal = Mesh->Mesh->Portals[range.Start + i]; PortalInfo info; info.transformation = portal.transformation; *(portals++) = info; } - size_t copysize = range.Size * sizeof(PortalInfo); + size_t copysize = range.Count() * sizeof(PortalInfo); if (copysize > 0) - copyCommands.emplace_back(transferBuffer.get(), Mesh->PortalBuffer.get(), datapos, range.Offset * sizeof(PortalInfo), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->PortalBuffer.get(), datapos, range.Start * sizeof(PortalInfo), copysize); datapos += copysize; } } @@ -640,9 +640,9 @@ void VkLevelMeshUploader::UploadLights() for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Light) { LightInfo* lights = (LightInfo*)(data + datapos); - for (int i = 0, count = range.Size; i < count; i++) + for (int i = 0, count = range.Count(); i < count; i++) { - const auto& light = Mesh->Mesh->Mesh.Lights[range.Offset + i]; + const auto& light = Mesh->Mesh->Mesh.Lights[range.Start + i]; LightInfo info; info.Origin = SwapYZ(light.Origin); info.RelativeOrigin = SwapYZ(light.RelativeOrigin); @@ -656,9 +656,9 @@ void VkLevelMeshUploader::UploadLights() *(lights++) = info; } - size_t copysize = range.Size * sizeof(LightInfo); + size_t copysize = range.Count() * sizeof(LightInfo); if (copysize > 0) - copyCommands.emplace_back(transferBuffer.get(), Mesh->LightBuffer.get(), datapos, range.Offset * sizeof(LightInfo), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->LightBuffer.get(), datapos, range.Start * sizeof(LightInfo), copysize); datapos += copysize; } } @@ -670,16 +670,16 @@ size_t VkLevelMeshUploader::GetTransferSize() if (!Mesh->useRayQuery) { if (Mesh->Mesh->UploadRanges.Node.Size() > 0) transferBufferSize += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Node) transferBufferSize += range.Size * sizeof(CollisionNode); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Node) transferBufferSize += range.Count() * sizeof(CollisionNode); } - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Vertex) transferBufferSize += range.Size * sizeof(FFlatVertex); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.UniformIndexes) transferBufferSize += range.Size * sizeof(int); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Index) transferBufferSize += range.Size * sizeof(uint32_t); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.SurfaceIndex) transferBufferSize += range.Size * sizeof(int); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Surface) transferBufferSize += range.Size * sizeof(SurfaceInfo); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Uniforms) transferBufferSize += range.Size * sizeof(SurfaceUniforms); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Portals) transferBufferSize += range.Size * sizeof(PortalInfo); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.LightIndex) transferBufferSize += range.Size * sizeof(int32_t); - for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Light) transferBufferSize += range.Size * sizeof(LightInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Vertex) transferBufferSize += range.Count() * sizeof(FFlatVertex); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.UniformIndexes) transferBufferSize += range.Count() * sizeof(int); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Index) transferBufferSize += range.Count() * sizeof(uint32_t); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.SurfaceIndex) transferBufferSize += range.Count() * sizeof(int); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Surface) transferBufferSize += range.Count() * sizeof(SurfaceInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Uniforms) transferBufferSize += range.Count() * sizeof(SurfaceUniforms); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Portals) transferBufferSize += range.Count() * sizeof(PortalInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.LightIndex) transferBufferSize += range.Count() * sizeof(int32_t); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Light) transferBufferSize += range.Count() * sizeof(LightInfo); return transferBufferSize; } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 233810131..dfd588940 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -150,72 +150,119 @@ EXTERN_CVAR(Float, lm_scale); DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) { - // Remove the empty mesh added in the LevelMesh constructor - Mesh.Vertices.clear(); - Mesh.Indexes.clear(); + // Try to estimate what the worst case memory needs are for the level + LevelMeshLimits limits; + limits.MaxVertices = (doomMap.vertexes.Size() * 10) * 2; + limits.MaxSurfaces = (doomMap.sides.Size() * 3 + doomMap.subsectors.Size() * 2) * 2; + limits.MaxUniforms = (doomMap.sides.Size() * 3 + doomMap.sectors.Size() * 2) * 2; + limits.MaxIndexes = limits.MaxVertices * 10; + Reset(limits); SunColor = doomMap.SunColor; // TODO keep only one copy? SunDirection = doomMap.SunDirection; + LightmapSampleDistance = doomMap.LightmapSampleDistance; BuildSectorGroups(doomMap); CreatePortals(doomMap); - - LightmapSampleDistance = doomMap.LightmapSampleDistance; - CreateSurfaces(doomMap); - LinkSurfaces(doomMap); SortIndexes(); BuildTileSurfaceLists(); UpdateCollision(); - - // Assume double the size of the static mesh will be enough for anything dynamic. - Mesh.MaxVertices = std::max(Mesh.Vertices.size() * 2, (size_t)10000); - Mesh.MaxIndexes = std::max(Mesh.Indexes.size() * 2, (size_t)10000); - Mesh.MaxSurfaces = std::max(Mesh.SurfaceIndexes.size() * 2, (size_t)10000); - Mesh.MaxUniforms = std::max(Mesh.Uniforms.size() * 2, (size_t)10000); - Mesh.MaxSurfaceIndexes = std::max(Mesh.SurfaceIndexes.size() * 2, (size_t)10000); Mesh.MaxNodes = std::max(Collision->get_nodes().size() * 2, (size_t)10000); - Mesh.MaxLights = 100'000; - Mesh.MaxLightIndexes = 4 * 1024 * 1024; - UploadAll(); + UploadPortals(); +} + +void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) +{ + CreateLights(doomMap); } void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) { - if (Mesh.Lights.Size() != 0) + if (LightsCreated) return; - for (unsigned int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) + for (const SideSurfaceBlock& side : Sides) { - Mesh.Surfaces[i].LightList.Pos = Mesh.LightIndexes.Size(); - Mesh.Surfaces[i].LightList.Count = 0; - - std::pair nodePortalGroup = GetSurfaceLightNode(i); - FLightNode* node = nodePortalGroup.first; - int portalgroup = nodePortalGroup.second; - if (!node) - continue; - - int listpos = 0; - while (node) + int index = side.FirstSurface; + while (index != -1) { - FDynamicLight* light = node->lightsource; - if (light && light->Trace()) - { - int lightindex = GetLightIndex(light, portalgroup); - if (lightindex >= 0) - { - AddRange(UploadRanges.LightIndex, { (int)Mesh.LightIndexes.Size(), 1 }); - Mesh.LightIndexes.Push(lightindex); - Mesh.Surfaces[i].LightList.Count++; - } - } - node = node->nextLight; + CreateLightList(doomMap, index); + index = DoomSurfaceInfos[index].NextSurface; } } + + for (const FlatSurfaceBlock& flat : Flats) + { + int index = flat.FirstSurface; + while (index != -1) + { + CreateLightList(doomMap, index); + index = DoomSurfaceInfos[index].NextSurface; + } + } + + LightsCreated = true; +} + +void DoomLevelMesh::CreateLightList(FLevelLocals& doomMap, int surfaceIndex) +{ + Mesh.Surfaces[surfaceIndex].LightList.Pos = Mesh.LightIndexes.Size(); + Mesh.Surfaces[surfaceIndex].LightList.Count = 0; + + std::pair nodePortalGroup = GetSurfaceLightNode(surfaceIndex); + FLightNode* node = nodePortalGroup.first; + int portalgroup = nodePortalGroup.second; + if (!node) + return; + + int listpos = 0; + while (node) + { + FDynamicLight* light = node->lightsource; + if (light && light->Trace()) + { + int lightindex = GetLightIndex(light, portalgroup); + if (lightindex >= 0) + { + AddRange(UploadRanges.LightIndex, { (int)Mesh.LightIndexes.Size(), (int)Mesh.LightIndexes.Size() + 1 }); + Mesh.LightIndexes.Push(lightindex); + Mesh.Surfaces[surfaceIndex].LightList.Count++; + } + } + node = node->nextLight; + } +} + +std::pair DoomLevelMesh::GetSurfaceLightNode(int surfaceIndex) +{ + auto doomsurf = &DoomSurfaceInfos[surfaceIndex]; + FLightNode* node = nullptr; + int portalgroup = 0; + if (doomsurf->Type == ST_FLOOR || doomsurf->Type == ST_CEILING) + { + node = doomsurf->Subsector->section->lighthead; + portalgroup = doomsurf->Subsector->sector->PortalGroup; + } + else if (doomsurf->Type == ST_MIDDLESIDE || doomsurf->Type == ST_UPPERSIDE || doomsurf->Type == ST_LOWERSIDE) + { + bool isPolyLine = !!(doomsurf->Side->Flags & WALLF_POLYOBJ); + if (isPolyLine) + { + subsector_t* subsector = level.PointInRenderSubsector((doomsurf->Side->V1()->fPos() + doomsurf->Side->V2()->fPos()) * 0.5); + node = subsector->section->lighthead; + portalgroup = subsector->sector->PortalGroup; + } + else + { + node = doomsurf->Side->lighthead; + portalgroup = doomsurf->Side->sector->PortalGroup; + } + } + return { node, portalgroup }; } int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) @@ -270,16 +317,11 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) int lightindex = Mesh.Lights.Size(); light->levelmesh[index].index = lightindex + 1; light->levelmesh[index].portalgroup = portalgroup; - AddRange(UploadRanges.Light, { (int)Mesh.Lights.Size(), 1 }); + AddRange(UploadRanges.Light, { (int)Mesh.Lights.Size(), (int)Mesh.Lights.Size() + 1 }); Mesh.Lights.Push(meshlight); return lightindex; } -void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) -{ - CreateLights(doomMap); -} - bool DoomLevelMesh::TraceSky(const FVector3& start, FVector3 direction, float dist) { FVector3 end = start + direction * dist; @@ -287,34 +329,6 @@ bool DoomLevelMesh::TraceSky(const FVector3& start, FVector3 direction, float di return surface && surface->IsSky; } -std::pair DoomLevelMesh::GetSurfaceLightNode(int surfaceIndex) -{ - auto doomsurf = &DoomSurfaceInfos[surfaceIndex]; - FLightNode* node = nullptr; - int portalgroup = 0; - if (doomsurf->Type == ST_FLOOR || doomsurf->Type == ST_CEILING) - { - node = doomsurf->Subsector->section->lighthead; - portalgroup = doomsurf->Subsector->sector->PortalGroup; - } - else if (doomsurf->Type == ST_MIDDLESIDE || doomsurf->Type == ST_UPPERSIDE || doomsurf->Type == ST_LOWERSIDE) - { - bool isPolyLine = !!(doomsurf->Side->Flags & WALLF_POLYOBJ); - if (isPolyLine) - { - subsector_t* subsector = level.PointInRenderSubsector((doomsurf->Side->V1()->fPos() + doomsurf->Side->V2()->fPos()) * 0.5); - node = subsector->section->lighthead; - portalgroup = subsector->sector->PortalGroup; - } - else - { - node = doomsurf->Side->lighthead; - portalgroup = doomsurf->Side->sector->PortalGroup; - } - } - return { node, portalgroup }; -} - void DoomLevelMesh::CreateSurfaces(FLevelLocals& doomMap) { bindings.clear(); @@ -415,15 +429,15 @@ void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) { -}; +} void DoomLevelMesh::SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) { -}; +} void DoomLevelMesh::SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) { -}; +} void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) { @@ -557,6 +571,7 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh GeometryAllocInfo ginfo = AllocGeometry(numVertices, numIndexes); UniformsAllocInfo uinfo = AllocUniforms(numUniforms); + SurfaceAllocInfo sinfo = AllocSurface(); int pipelineID = 0; int uniformsIndex = uinfo.Start; @@ -613,7 +628,7 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh sampleDimension = side->textures[side_t::bottom].LightmapSampleDistance; } - DoomSurfaceInfo info; + DoomSurfaceInfo& info = DoomSurfaceInfos[sinfo.Index]; info.Type = wallpart.LevelMeshInfo.Type; info.ControlSector = wallpart.LevelMeshInfo.ControlSector; info.TypeIndex = side->Index(); @@ -621,26 +636,24 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh if (sideIndex < Sides.Size()) { info.NextSurface = Sides[sideIndex].FirstSurface; - Sides[sideIndex].FirstSurface = Mesh.Surfaces.Size(); + Sides[sideIndex].FirstSurface = sinfo.Index; } - LevelMeshSurface surf; - surf.PipelineID = pipelineID; - surf.SectorGroup = sectorGroup[side->sector->Index()]; - surf.Alpha = float(side->linedef->alpha); - surf.MeshLocation.StartVertIndex = ginfo.VertexStart; - surf.MeshLocation.StartElementIndex = ginfo.IndexStart; - surf.MeshLocation.NumVerts = ginfo.VertexCount; - surf.MeshLocation.NumElements = ginfo.IndexCount; - surf.Plane = FVector4(N.X, N.Y, 0.0f, v1 | N); - surf.Texture = wallpart.texture; - surf.PortalIndex = isPortal ? linePortals[side->linedef->Index()] : 0; - surf.IsSky = isPortal ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; - surf.Bounds = GetBoundsFromSurface(surf); - surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, surf, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; + sinfo.Surface->PipelineID = pipelineID; + sinfo.Surface->SectorGroup = sectorGroup[side->sector->Index()]; + sinfo.Surface->Alpha = float(side->linedef->alpha); + sinfo.Surface->MeshLocation.StartVertIndex = ginfo.VertexStart; + sinfo.Surface->MeshLocation.StartElementIndex = ginfo.IndexStart; + sinfo.Surface->MeshLocation.NumVerts = ginfo.VertexCount; + sinfo.Surface->MeshLocation.NumElements = ginfo.IndexCount; + sinfo.Surface->Plane = FVector4(N.X, N.Y, 0.0f, v1 | N); + sinfo.Surface->Texture = wallpart.texture; + sinfo.Surface->PortalIndex = isPortal ? linePortals[side->linedef->Index()] : 0; + sinfo.Surface->IsSky = isPortal ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; + sinfo.Surface->Bounds = GetBoundsFromSurface(*sinfo.Surface); + sinfo.Surface->LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, *sinfo.Surface, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; - Mesh.Surfaces.Push(surf); - DoomSurfaceInfos.Push(info); + SetSideLightmap(sinfo.Index); } } @@ -872,30 +885,55 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state surf.Bounds = GetBoundsFromSurface(surf); surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, surf, sampleDimension, !!(flatpart.sector->Flags & SECF_LM_DYNAMIC)) : -1; + SurfaceAllocInfo sinfo = AllocSurface(); + if (sectorIndex < Flats.Size()) { info.NextSurface = Flats[sectorIndex].FirstSurface; - Flats[sectorIndex].FirstSurface = Mesh.Surfaces.Size(); + Flats[sectorIndex].FirstSurface = sinfo.Index; } - Mesh.Surfaces.Push(surf); - DoomSurfaceInfos.Push(info); + *sinfo.Surface = surf; + DoomSurfaceInfos[sinfo.Index] = info; + + SetSubsectorLightmap(sinfo.Index); } } } void DoomLevelMesh::SortIndexes() { + DrawList.Clear(); + PortalList.Clear(); + // Order surfaces by pipeline std::unordered_map> pipelineSurfaces; - for (size_t i = 0; i < Mesh.Surfaces.Size(); i++) + for (const SideSurfaceBlock& side : Sides) { - LevelMeshSurface* s = &Mesh.Surfaces[i]; - pipelineSurfaces[(int64_t(s->PipelineID) << 32) | int64_t(s->IsSky)].Push(i); + int index = side.FirstSurface; + while (index != -1) + { + LevelMeshSurface* s = &Mesh.Surfaces[index]; + pipelineSurfaces[(int64_t(s->PipelineID) << 32) | int64_t(s->IsSky)].Push(index); + + index = DoomSurfaceInfos[index].NextSurface; + } + } + for (const FlatSurfaceBlock& flat : Flats) + { + int index = flat.FirstSurface; + while (index != -1) + { + LevelMeshSurface* s = &Mesh.Surfaces[index]; + pipelineSurfaces[(int64_t(s->PipelineID) << 32) | int64_t(s->IsSky)].Push(index); + + index = DoomSurfaceInfos[index].NextSurface; + } } - // Create reorder surface indexes by pipeline and create a draw range for each + // Reorder surface indexes by pipeline and create a draw range for each TArray sortedIndexes; + TArray sortedSurfaceIndexes; for (const auto& it : pipelineSurfaces) { LevelSubmeshDrawRange range; @@ -919,7 +957,7 @@ void DoomLevelMesh::SortIndexes() for (unsigned int j = 0; j < count; j += 3) { - Mesh.SurfaceIndexes.Push((int)i); + sortedSurfaceIndexes.Push((int)i); } } @@ -931,21 +969,19 @@ void DoomLevelMesh::SortIndexes() PortalList.Push(range); } - Mesh.Indexes.Swap(sortedIndexes); -} - -void DoomLevelMesh::LinkSurfaces(FLevelLocals& doomMap) -{ - for (unsigned int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) + // Place result at front of buffers and upload { - if (DoomSurfaceInfos[i].Type == ST_FLOOR || DoomSurfaceInfos[i].Type == ST_CEILING) - { - SetSubsectorLightmap(i); - } - else - { - SetSideLightmap(i); - } + int count = sortedIndexes.Size(); + memcpy(Mesh.Indexes.Data(), sortedIndexes.Data(), count * sizeof(uint32_t)); + UploadRanges.Index.Clear(); + UploadRanges.Index.Push({ 0, count }); + Mesh.IndexCount = count; + } + { + int count = sortedSurfaceIndexes.Size(); + memcpy(Mesh.SurfaceIndexes.Data(), sortedSurfaceIndexes.Data(), count * sizeof(int)); + UploadRanges.SurfaceIndex.Clear(); + UploadRanges.SurfaceIndex.Push({ 0, count }); } } @@ -1031,8 +1067,10 @@ void DoomLevelMesh::DumpMesh(const FString& objFilename, const FString& mtlFilen { auto f = fopen(objFilename.GetChars(), "w"); + // To do: this dumps the entire vertex buffer, including those not in use + fprintf(f, "# DoomLevelMesh debug export\n"); - fprintf(f, "# Vertices: %u, Indexes: %u, Surfaces: %u\n", Mesh.Vertices.Size(), Mesh.Indexes.Size(), Mesh.Surfaces.Size()); + fprintf(f, "# Vertices: %u, Indexes: %u, Surfaces: %u\n", Mesh.Vertices.Size(), Mesh.IndexCount, Mesh.Surfaces.Size()); fprintf(f, "mtllib %s\n", mtlFilename.GetChars()); double scale = 1 / 10.0; @@ -1075,7 +1113,7 @@ void DoomLevelMesh::DumpMesh(const FString& objFilename, const FString& mtlFilen bool useErrorMaterial = false; int highestUsedAtlasPage = -1; - for (unsigned i = 0, count = Mesh.Indexes.Size(); i + 2 < count; i += 3) + for (unsigned i = 0, count = Mesh.IndexCount; i + 2 < count; i += 3) { auto index = Mesh.SurfaceIndexes[i / 3]; diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index a6793eb8a..f7024d5a7 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -72,8 +72,15 @@ public: void SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) override; void SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) override; + void Reset(const LevelMeshLimits& limits) override + { + LevelMesh::Reset(limits); + DoomSurfaceInfos.Resize(limits.MaxSurfaces); + } + private: void CreateSurfaces(FLevelLocals& doomMap); + void CreateLightList(FLevelLocals& doomMap, int surfaceIndex); void UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex); void UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex); @@ -89,8 +96,6 @@ private: void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent, unsigned int sectorIndex); void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent, unsigned int sectorIndex); - void LinkSurfaces(FLevelLocals& doomMap); - BBox GetBoundsFromSurface(const LevelMeshSurface& surface) const; int AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate); @@ -108,4 +113,5 @@ private: TArray Flats; std::map bindings; MeshBuilder state; + bool LightsCreated = false; }; From f0ff2736203506b4a0c1502ddbf95ba1766d28ef Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 18 Aug 2024 14:56:58 +0200 Subject: [PATCH 205/414] Stop grabbing mouse when game window doesn't have the focus --- src/common/platform/win32/i_mouse.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/platform/win32/i_mouse.cpp b/src/common/platform/win32/i_mouse.cpp index 72dc3f335..e0050cc3a 100644 --- a/src/common/platform/win32/i_mouse.cpp +++ b/src/common/platform/win32/i_mouse.cpp @@ -267,7 +267,7 @@ void I_CheckNativeMouse(bool preferNative, bool eventhandlerresult) } else { - if ((GetForegroundWindow() != mainwindow.GetHandle()) || preferNative || !use_mouse) + if (preferNative || !use_mouse) { want_native = true; } @@ -286,6 +286,10 @@ void I_CheckNativeMouse(bool preferNative, bool eventhandlerresult) if (!want_native && eventhandlerresult) want_native = true; + // The application should *never* grab the mouse cursor if its window doesn't have the focus. + if (GetForegroundWindow() != mainwindow.GetHandle()) + want_native = true; + //Printf ("%d %d %d\n", wantNative, preferNative, NativeMouse); if (want_native != NativeMouse) From 18db0b49a73c979930d818072772c737971688bb Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 25 Aug 2024 01:06:44 +0200 Subject: [PATCH 206/414] Update level mesh on sector changes --- .../rendering/hwrenderer/data/hw_levelmesh.h | 49 +++-- .../rendering/vulkan/vk_renderstate.cpp | 18 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 192 ++++++++---------- src/rendering/hwrenderer/doom_levelmesh.h | 26 ++- 4 files changed, 161 insertions(+), 124 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 8361a274d..8928606ef 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -19,13 +19,6 @@ typedef dp::rect_pack::RectPacker RectPacker; struct LevelMeshTileStats; -struct LevelSubmeshDrawRange -{ - int PipelineID; - int Start; - int Count; -}; - struct GeometryAllocInfo { FFlatVertex* Vertices = nullptr; @@ -103,7 +96,9 @@ public: AddRange(UploadRanges.Vertex, { info.VertexStart, info.VertexStart + info.VertexCount }); AddRange(UploadRanges.UniformIndexes, { info.VertexStart, info.VertexStart + info.VertexCount }); AddRange(UploadRanges.Index, { info.IndexStart, info.IndexStart + info.IndexCount }); - AddRange(UploadRanges.SurfaceIndex, { info.IndexStart / 3, (info.IndexStart + info.IndexCount) / 3 + 1 }); + AddRange(UploadRanges.SurfaceIndex, { info.IndexStart / 3, (info.IndexStart + info.IndexCount) / 3 }); + + Mesh.IndexCount = std::max(Mesh.IndexCount, info.IndexStart + info.IndexCount); return info; } @@ -145,14 +140,14 @@ public: void FreeUniforms(int start, int count) { - AddRange(FreeLists.Uniforms, { start, count }); + AddRange(FreeLists.Uniforms, { start, start + count }); } void FreeSurface(unsigned int surfaceIndex) { // To do: remove the surface from the surface tile, if attached - AddRange(FreeLists.Surface, { (int)surfaceIndex, 1 }); + AddRange(FreeLists.Surface, { (int)surfaceIndex, (int)surfaceIndex + 1 }); } // Sets the sizes of all the GPU buffers and empties the mesh @@ -229,9 +224,9 @@ public: // Data structure for doing mesh traces on the CPU std::unique_ptr Collision; - // Draw index ranges for rendering the level mesh - TArray DrawList; - TArray PortalList; + // Draw index ranges for rendering the level mesh, grouped by pipeline + std::unordered_map> DrawList; + std::unordered_map> PortalList; // Lightmap atlas int LMTextureCount = 0; @@ -283,6 +278,34 @@ public: I_FatalError("Could not find space in level mesh buffer"); } + void RemoveRange(TArray& ranges, MeshBufferRange range) + { + if (range.Start == range.End) + return; + + auto entry = std::lower_bound(ranges.begin(), ranges.end(), range, [](const auto& a, const auto& b) { return a.End < b.End; }); + if (entry->Start == range.Start && entry->End == range.End) + { + ranges.Delete(entry - ranges.begin()); + } + else if (entry->Start == range.Start) + { + entry->Start = range.End; + } + else if (entry->End == range.End) + { + entry->End = range.Start; + } + else + { + MeshBufferRange split; + split.Start = entry->Start; + split.End = range.Start; + entry->Start = range.End; + ranges.Insert(entry - ranges.begin(), split); + } + } + void AddRange(TArray& ranges, MeshBufferRange range) { // Empty range? diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 3d75d3205..2df40a53b 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -850,9 +850,14 @@ void VkRenderState::DrawLevelMeshSurfaces(bool noFragmentShader) ApplyLevelMesh(); auto mesh = fb->GetLevelMesh()->GetMesh(); - for (LevelSubmeshDrawRange& range : mesh->DrawList) + for (auto& it : mesh->DrawList) { - DrawLevelMeshRange(mCommandBuffer, fb->GetLevelMeshPipelineKey(range.PipelineID), range.Start, range.Count, noFragmentShader); + int pipelineID = it.first; + const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID); + for (MeshBufferRange& range : it.second) + { + DrawLevelMeshRange(mCommandBuffer, key, range.Start, range.End - range.Start, noFragmentShader); + } } } @@ -861,9 +866,14 @@ void VkRenderState::DrawLevelMeshPortals(bool noFragmentShader) ApplyLevelMesh(); auto mesh = fb->GetLevelMesh()->GetMesh(); - for (LevelSubmeshDrawRange& range : mesh->PortalList) + for (auto& it : mesh->PortalList) { - DrawLevelMeshRange(mCommandBuffer, fb->GetLevelMeshPipelineKey(range.PipelineID), range.Start, range.Count, noFragmentShader); + int pipelineID = it.first; + const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID); + for (MeshBufferRange& range : it.second) + { + DrawLevelMeshRange(mCommandBuffer, key, range.Start, range.End - range.Start, noFragmentShader); + } } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index dfd588940..4983ab22d 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -166,7 +166,6 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) CreatePortals(doomMap); CreateSurfaces(doomMap); - SortIndexes(); BuildTileSurfaceLists(); UpdateCollision(); @@ -372,7 +371,19 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) } Sides[sideIndex].FirstSurface = -1; - // To do: call FreeGeometry and FreeUniforms + for (auto& geo : Sides[sideIndex].Geometries) + { + FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); + if (!geo.IsPortal) + RemoveRange(DrawList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); + else + RemoveRange(PortalList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); + } + Sides[sideIndex].Geometries.Clear(); + + for (auto& uni : Sides[sideIndex].Uniforms) + FreeUniforms(uni.Start, uni.Count); + Sides[sideIndex].Uniforms.Clear(); } void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) @@ -389,17 +400,43 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) } Flats[sectorIndex].FirstSurface = -1; - // To do: call FreeGeometry and FreeUniforms + for (auto& geo : Flats[sectorIndex].Geometries) + { + FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); + if (!geo.IsPortal) + RemoveRange(DrawList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); + else + RemoveRange(PortalList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); + } + Flats[sectorIndex].Geometries.Clear(); + + for (auto& uni : Flats[sectorIndex].Uniforms) + FreeUniforms(uni.Start, uni.Count); + Flats[sectorIndex].Uniforms.Clear(); } void DoomLevelMesh::FloorHeightChanged(struct sector_t* sector) { - // UpdateFlat(level, sector->Index()); + UpdateFlat(level, sector->Index()); + for (line_t* line : sector->Lines) + { + if (line->sidedef[0]) + UpdateSide(level, line->sidedef[0]->Index()); + if (line->sidedef[1]) + UpdateSide(level, line->sidedef[1]->Index()); + } } void DoomLevelMesh::CeilingHeightChanged(struct sector_t* sector) { - // UpdateFlat(level, sector->Index()); + UpdateFlat(level, sector->Index()); + for (line_t* line : sector->Lines) + { + if (line->sidedef[0]) + UpdateSide(level, line->sidedef[0]->Index()); + if (line->sidedef[1]) + UpdateSide(level, line->sidedef[1]->Index()); + } } void DoomLevelMesh::MidTex3DHeightChanged(struct sector_t* sector) @@ -409,22 +446,22 @@ void DoomLevelMesh::MidTex3DHeightChanged(struct sector_t* sector) void DoomLevelMesh::FloorTextureChanged(struct sector_t* sector) { - // UpdateFlat(level, sector->Index()); + UpdateFlat(level, sector->Index()); } void DoomLevelMesh::CeilingTextureChanged(struct sector_t* sector) { - // UpdateFlat(level, sector->Index()); + UpdateFlat(level, sector->Index()); } void DoomLevelMesh::SectorChangedOther(struct sector_t* sector) { - // UpdateFlat(level, sector->Index()); + UpdateFlat(level, sector->Index()); } void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) { - // UpdateSide(level, side->Index()); + UpdateSide(level, side->Index()); } void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) @@ -633,11 +670,9 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh info.ControlSector = wallpart.LevelMeshInfo.ControlSector; info.TypeIndex = side->Index(); info.Side = side; - if (sideIndex < Sides.Size()) - { - info.NextSurface = Sides[sideIndex].FirstSurface; - Sides[sideIndex].FirstSurface = sinfo.Index; - } + + info.NextSurface = Sides[sideIndex].FirstSurface; + Sides[sideIndex].FirstSurface = sinfo.Index; sinfo.Surface->PipelineID = pipelineID; sinfo.Surface->SectorGroup = sectorGroup[side->sector->Index()]; @@ -654,6 +689,21 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh sinfo.Surface->LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, *sinfo.Surface, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; SetSideLightmap(sinfo.Index); + + for (int i = ginfo.IndexStart / 3, end = (ginfo.IndexStart + ginfo.IndexCount) / 3; i < end; i++) + Mesh.SurfaceIndexes[i] = sinfo.Index; + + Sides[sideIndex].Geometries.Push({ ginfo, pipelineID, sinfo.Surface->IsSky }); + Sides[sideIndex].Uniforms.Push(uinfo); + + if (!sinfo.Surface->IsSky) + { + AddRange(DrawList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); + } + else + { + AddRange(PortalList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); + } } } @@ -789,6 +839,20 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state GeometryAllocInfo ginfo = AllocGeometry(numVertices, numIndexes); UniformsAllocInfo uinfo = AllocUniforms(1); + Flats[sectorIndex].Geometries.Push({ ginfo, pipelineID, isSky }); + Flats[sectorIndex].Uniforms.Push(uinfo); + + if (!isSky) + { + AddRange(DrawList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); + } + else + { + AddRange(PortalList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); + } + + int* surfaceIndexes = &Mesh.SurfaceIndexes[ginfo.IndexStart / 3]; + *uinfo.Uniforms = *uniforms; *uinfo.Materials = *material; @@ -857,6 +921,8 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state *(ginfo.UniformIndexes++) = uniformsIndex; } + SurfaceAllocInfo sinfo = AllocSurface(); + if (flatpart.ceiling) { for (int i = 2, count = sub->numlines; i < count; i++) @@ -864,6 +930,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state *(ginfo.Indexes++) = startVertIndex; *(ginfo.Indexes++) = startVertIndex + i - 1; *(ginfo.Indexes++) = startVertIndex + i; + *(surfaceIndexes++) = sinfo.Index; } } else @@ -873,6 +940,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state *(ginfo.Indexes++) = startVertIndex + i; *(ginfo.Indexes++) = startVertIndex + i - 1; *(ginfo.Indexes++) = startVertIndex; + *(surfaceIndexes++) = sinfo.Index; } } @@ -885,106 +953,20 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state surf.Bounds = GetBoundsFromSurface(surf); surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, surf, sampleDimension, !!(flatpart.sector->Flags & SECF_LM_DYNAMIC)) : -1; - SurfaceAllocInfo sinfo = AllocSurface(); - - if (sectorIndex < Flats.Size()) - { - info.NextSurface = Flats[sectorIndex].FirstSurface; - Flats[sectorIndex].FirstSurface = sinfo.Index; - } + info.NextSurface = Flats[sectorIndex].FirstSurface; + Flats[sectorIndex].FirstSurface = sinfo.Index; *sinfo.Surface = surf; DoomSurfaceInfos[sinfo.Index] = info; + for (int i = ginfo.IndexStart / 3, end = (ginfo.IndexStart + ginfo.IndexCount) / 3; i < end; i++) + Mesh.SurfaceIndexes[i] = sinfo.Index; + SetSubsectorLightmap(sinfo.Index); } } } -void DoomLevelMesh::SortIndexes() -{ - DrawList.Clear(); - PortalList.Clear(); - - // Order surfaces by pipeline - std::unordered_map> pipelineSurfaces; - for (const SideSurfaceBlock& side : Sides) - { - int index = side.FirstSurface; - while (index != -1) - { - LevelMeshSurface* s = &Mesh.Surfaces[index]; - pipelineSurfaces[(int64_t(s->PipelineID) << 32) | int64_t(s->IsSky)].Push(index); - - index = DoomSurfaceInfos[index].NextSurface; - } - } - for (const FlatSurfaceBlock& flat : Flats) - { - int index = flat.FirstSurface; - while (index != -1) - { - LevelMeshSurface* s = &Mesh.Surfaces[index]; - pipelineSurfaces[(int64_t(s->PipelineID) << 32) | int64_t(s->IsSky)].Push(index); - - index = DoomSurfaceInfos[index].NextSurface; - } - } - - // Reorder surface indexes by pipeline and create a draw range for each - TArray sortedIndexes; - TArray sortedSurfaceIndexes; - for (const auto& it : pipelineSurfaces) - { - LevelSubmeshDrawRange range; - range.PipelineID = it.first >> 32; - range.Start = sortedIndexes.Size(); - - // Move indexes to new array - for (unsigned int i : it.second) - { - LevelMeshSurface& s = Mesh.Surfaces[i]; - - unsigned int start = s.MeshLocation.StartElementIndex; - unsigned int count = s.MeshLocation.NumElements; - - s.MeshLocation.StartElementIndex = sortedIndexes.Size(); - - for (unsigned int j = 0; j < count; j++) - { - sortedIndexes.Push(Mesh.Indexes[start + j]); - } - - for (unsigned int j = 0; j < count; j += 3) - { - sortedSurfaceIndexes.Push((int)i); - } - } - - range.Count = sortedIndexes.Size() - range.Start; - - if ((it.first & 1) == 0) - DrawList.Push(range); - else - PortalList.Push(range); - } - - // Place result at front of buffers and upload - { - int count = sortedIndexes.Size(); - memcpy(Mesh.Indexes.Data(), sortedIndexes.Data(), count * sizeof(uint32_t)); - UploadRanges.Index.Clear(); - UploadRanges.Index.Push({ 0, count }); - Mesh.IndexCount = count; - } - { - int count = sortedSurfaceIndexes.Size(); - memcpy(Mesh.SurfaceIndexes.Data(), sortedSurfaceIndexes.Data(), count * sizeof(int)); - UploadRanges.SurfaceIndex.Clear(); - UploadRanges.SurfaceIndex.Push({ 0, count }); - } -} - void DoomLevelMesh::SetSubsectorLightmap(int surfaceIndex) { int lightmapTileIndex = Mesh.Surfaces[surfaceIndex].LightmapTileIndex; diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index f7024d5a7..cab491162 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -30,14 +30,38 @@ struct DoomSurfaceInfo int NextSurface = -1; }; +struct GeometryFreeInfo +{ + GeometryFreeInfo(const GeometryAllocInfo& ginfo, int pipelineID, bool isPortal) + { + VertexStart = ginfo.VertexStart; + VertexCount = ginfo.VertexCount; + IndexStart = ginfo.IndexStart; + IndexCount = ginfo.IndexCount; + PipelineID = pipelineID; + IsPortal = isPortal; + } + + int VertexStart = 0; + int VertexCount = 0; + int IndexStart = 0; + int IndexCount = 0; + int PipelineID = 0; + bool IsPortal = false; +}; + struct SideSurfaceBlock { int FirstSurface = -1; + TArray Geometries; + TArray Uniforms; }; struct FlatSurfaceBlock { int FirstSurface = -1; + TArray Geometries; + TArray Uniforms; }; class DoomLevelMesh : public LevelMesh, public UpdateLevelMesh @@ -91,8 +115,6 @@ private: void SetSubsectorLightmap(int surfaceIndex); void SetSideLightmap(int surfaceIndex); - void SortIndexes(); - void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent, unsigned int sectorIndex); void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent, unsigned int sectorIndex); From 61375fae12205e1a3004dc001d7899ae46671ed2 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 25 Aug 2024 14:19:11 +0200 Subject: [PATCH 207/414] Fix uniforms upload bug --- src/common/rendering/vulkan/vk_levelmesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 4a1296869..cf163cdf9 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -608,7 +608,7 @@ void VkLevelMeshUploader::UploadUniforms() SurfaceUniforms* uniforms = (SurfaceUniforms*)(data + datapos); size_t copysize = range.Count() * sizeof(SurfaceUniforms); - memcpy(uniforms, Mesh->Mesh->Mesh.Uniforms.Data(), copysize); + memcpy(uniforms, Mesh->Mesh->Mesh.Uniforms.Data() + range.Start, copysize); if (copysize > 0) copyCommands.emplace_back(transferBuffer.get(), Mesh->UniformsBuffer.get(), datapos, range.Start * sizeof(SurfaceUniforms), copysize); datapos += copysize; From cd2fdb0cd902f8a13f17703295dfd8a003920718 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 25 Aug 2024 14:50:51 +0200 Subject: [PATCH 208/414] Apply light alpha to intensity --- src/rendering/hwrenderer/hw_dynlightdata.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rendering/hwrenderer/hw_dynlightdata.cpp b/src/rendering/hwrenderer/hw_dynlightdata.cpp index 517b8a501..258b6c9b3 100644 --- a/src/rendering/hwrenderer/hw_dynlightdata.cpp +++ b/src/rendering/hwrenderer/hw_dynlightdata.cpp @@ -92,6 +92,9 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f cs = 1.0f; } + if (light->target) + cs *= (float)light->target->Alpha; + float r = light->GetRed() / 255.0f * cs; float g = light->GetGreen() / 255.0f * cs; float b = light->GetBlue() / 255.0f * cs; From a4b57c5fbe83239a6f73fd6fc1b3e0cb1cf63f33 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 25 Aug 2024 14:54:58 +0200 Subject: [PATCH 209/414] Also apply the alpha scale to sprites --- src/rendering/hwrenderer/scene/hw_spritelight.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index 4cc36e1a9..031262daf 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -186,6 +186,15 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig lr = light->GetRed() / 255.0f; lg = light->GetGreen() / 255.0f; lb = light->GetBlue() / 255.0f; + + if (light->target) + { + float alpha = (float)light->target->Alpha; + lr *= alpha; + lg *= alpha; + lb *= alpha; + } + if (light->IsSubtractive()) { float bright = (float)FVector3(lr, lg, lb).Length(); From 944c6994b7e9c89d28bf8b67682a8d581a24772c Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 25 Aug 2024 15:10:30 +0200 Subject: [PATCH 210/414] Update polyobjs every frame (wtb UpdateLevelMesh notification about this) --- src/rendering/hwrenderer/doom_levelmesh.cpp | 9 +++++++++ src/rendering/hwrenderer/doom_levelmesh.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 4983ab22d..8392cd737 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -176,6 +176,12 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) { + // To do: we don't need to always do this. UpdateLevelMesh should tell us when polyobjs move. + for (side_t* side : PolySides) + { + UpdateSide(doomMap, side->Index()); + } + CreateLights(doomMap); } @@ -342,7 +348,10 @@ void DoomLevelMesh::CreateSurfaces(FLevelLocals& doomMap) side_t* side = &doomMap.sides[i]; bool isPolyLine = !!(side->Flags & WALLF_POLYOBJ); if (isPolyLine) + { + PolySides.Push(side); continue; + } UpdateSide(doomMap, i); } diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index cab491162..0b29e9785 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -133,6 +133,8 @@ private: TArray Sides; TArray Flats; + TArray PolySides; + std::map bindings; MeshBuilder state; bool LightsCreated = false; From 03e36e9d3848683d2eddf71d41a58e08c2a80f9e Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 25 Aug 2024 15:48:17 +0200 Subject: [PATCH 211/414] Fix polyobj height --- src/rendering/hwrenderer/doom_levelmesh.cpp | 22 +++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 8392cd737..452f2aef9 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -490,14 +490,28 @@ void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) FreeSide(doomMap, sideIndex); side_t* side = &doomMap.sides[sideIndex]; + seg_t* seg = side->segs[0]; if (!seg) return; - subsector_t* sub = seg->Subsector; - - sector_t* front = side->sector; - sector_t* back = (side->linedef->frontsector == front) ? side->linedef->backsector : side->linedef->frontsector; + sector_t* front; + sector_t* back; + subsector_t* sub; + if (side->Flags & WALLF_POLYOBJ) + { + sub = level.PointInRenderSubsector((side->V1()->fPos() + side->V2()->fPos()) * 0.5); + if (!sub) + return; + front = sub->sector; + back = nullptr; + } + else + { + sub = seg->Subsector; + front = side->sector; + back = (side->linedef->frontsector == front) ? side->linedef->backsector : side->linedef->frontsector; + } HWMeshHelper result; HWWallDispatcher disp(&doomMap, &result, getRealLightmode(&doomMap, true)); From 858247f25f0fda10206915b607f3f16a37ca04e3 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 25 Aug 2024 16:47:40 +0200 Subject: [PATCH 212/414] Fix interpolation when updating the level mesh --- src/d_main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index bde784b13..fdcb93a9b 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1023,8 +1023,6 @@ void D_Display () screen->FrameTimeNS = I_nsTime(); TexAnim.UpdateAnimations(screen->FrameTime); R_UpdateSky(screen->FrameTime); - if (level.levelMesh) level.levelMesh->BeginFrame(level); - screen->BeginFrame(); twod->ClearClipRect(); if ((gamestate == GS_LEVEL || gamestate == GS_TITLELEVEL) && gametic != 0) { @@ -1034,6 +1032,9 @@ void D_Display () D_Render([&]() { + if (level.levelMesh) level.levelMesh->BeginFrame(level); + screen->BeginFrame(); + viewsec = RenderView(&players[consoleplayer]); }, true); @@ -1084,6 +1085,9 @@ void D_Display () } else { + if (level.levelMesh) level.levelMesh->BeginFrame(level); + screen->BeginFrame(); + twod->Begin(screen->GetWidth(), screen->GetHeight()); switch (gamestate) { From b2976444c95455e11bfedbb08e94361034a35e74 Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Sun, 25 Aug 2024 09:05:54 -0600 Subject: [PATCH 213/414] Smaller aspect ratio screens were getting clipped a bit too much. This is a brute-force if-else solution. Larger aspect ratios (wider screens) were always good. --- src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 19478c30c..b7c02a841 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -366,9 +366,16 @@ angle_t HWDrawInfo::FrustumAngle() { // If pitch is larger than this you can look all around at an FOV of 90 degrees if (fabs(Viewpoint.HWAngles.Pitch.Degrees()) > 89.0) return 0xffffffff; + int aspMult = AspectMultiplier(r_viewwindow.WidescreenRatio); // 48 == square window + double absPitch = fabs(Viewpoint.HWAngles.Pitch.Degrees()); + // Smaller aspect ratios still clip too much. Need a better solution + if (aspMult > 36 && absPitch > 30.0) return 0xffffffff; + else if (aspMult > 40 && absPitch > 25.0) return 0xffffffff; + else if (aspMult > 45 && absPitch > 20.0) return 0xffffffff; + else if (aspMult > 47 && absPitch > 10.0) return 0xffffffff; double xratio = r_viewwindow.FocalTangent / Viewpoint.PitchCos; - double floatangle = 0.035 + atan ( xratio ) * 48.0 / AspectMultiplier(r_viewwindow.WidescreenRatio); // this is radians + double floatangle = 0.05 + atan ( xratio ) * 48.0 / aspMult; // this is radians angle_t a1 = DAngle::fromRad(floatangle).BAMs(); if (a1 >= ANGLE_90) return 0xffffffff; From 76c8b6da5742562a8eece3037f90ab71de4b1d77 Mon Sep 17 00:00:00 2001 From: Xaser Acheron Date: Sat, 10 Aug 2024 02:53:52 -0500 Subject: [PATCH 214/414] fix A_PlaySound not working for DSDHACKED-defined sounds --- src/gamedata/d_dehacked.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index 26123b319..77e9d1320 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -843,7 +843,7 @@ static void CreateScratchFunc(FunctionCallEmitter &emitters, int value1, int val // misc1 = sound, misc2 = attenuation none (true) or normal (false) static void CreatePlaySoundFunc(FunctionCallEmitter &emitters, int value1, int value2, MBFParamState* state) { // A_PlaySound - emitters.AddParameterIntConst(DehFindSound(value1 - 1, true).index()); // soundid + emitters.AddParameterIntConst(DehFindSound(value1 - 1, false).index()); // soundid emitters.AddParameterIntConst(CHAN_BODY); // channel emitters.AddParameterFloatConst(1); // volume emitters.AddParameterIntConst(false); // looping From e94bd7f641a4523d2d6c52ea48b3b029e6de47b7 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 26 Aug 2024 00:49:30 +0200 Subject: [PATCH 215/414] Fix 'Could not find space in level mesh buffer' error Interpolate sector height updates --- src/r_data/r_interpolate.cpp | 5 +++++ src/rendering/hwrenderer/doom_levelmesh.cpp | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index 30dff51c6..7b6554f05 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -509,6 +509,11 @@ void DSectorPlaneInterpolation::Interpolate(double smoothratio) sector->SetPlaneTexZ(pos, oldtexz + (baktexz - oldtexz) * smoothratio, true); P_RecalculateAttached3DFloors(sector); sector->CheckPortalPlane(pos); + + if (ceiling) + LevelMeshUpdater->CeilingHeightChanged(sector); + else + LevelMeshUpdater->FloorHeightChanged(sector); } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 452f2aef9..fedb61f9f 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -404,7 +404,7 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) while (surf != -1) { unsigned int next = DoomSurfaceInfos[surf].NextSurface; - FreeSurface(surf - 1); + FreeSurface(surf); surf = next; } Flats[sectorIndex].FirstSurface = -1; @@ -475,6 +475,16 @@ void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) { + /* + UpdateFlat(level, sector->Index()); + for (line_t* line : sector->Lines) + { + if (line->frontsector == sector && line->sidedef[0]) + UpdateSide(level, line->sidedef[0]->Index()); + else if (line->sidedef[1]) + UpdateSide(level, line->sidedef[1]->Index()); + } + */ } void DoomLevelMesh::SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) From dedd7245f290409b7bfc8595c8fcaf25891f82d4 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 26 Aug 2024 02:05:38 +0200 Subject: [PATCH 216/414] Fix wall portals not getting freed --- src/rendering/hwrenderer/doom_levelmesh.cpp | 24 ++++++++++++++++++- src/rendering/hwrenderer/doom_levelmesh.h | 7 +++++- .../hwrenderer/scene/hw_drawinfo.cpp | 23 ++++++++++-------- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index fedb61f9f..4587f69a9 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -183,6 +183,19 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) } CreateLights(doomMap); + UpdateWallPortals(); +} + +void DoomLevelMesh::UpdateWallPortals() +{ + WallPortals.Clear(); + for (int sideIndex : SidePortals) + { + for (HWWall& wall : Sides[sideIndex].WallPortals) + { + WallPortals.Push(&wall); + } + } } void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) @@ -393,6 +406,8 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) for (auto& uni : Sides[sideIndex].Uniforms) FreeUniforms(uni.Start, uni.Count); Sides[sideIndex].Uniforms.Clear(); + + Sides[sideIndex].WallPortals.Clear(); } void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) @@ -537,9 +552,16 @@ void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) state.AlphaFunc(Alpha_GEqual, 0.f); CreateWallSurface(side, disp, state, result.list, false, true, sideIndex); + if (result.portals.Size() != 0 && !Sides[sideIndex].InSidePortalsList) + { + // Register side having portals + SidePortals.Push(sideIndex); + Sides[sideIndex].InSidePortalsList = true; + } + for (HWWall& portal : result.portals) { - WallPortals.Push(portal); + Sides[sideIndex].WallPortals.Push(portal); } CreateWallSurface(side, disp, state, result.portals, true, false, sideIndex); diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 0b29e9785..7529a153f 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -55,6 +55,8 @@ struct SideSurfaceBlock int FirstSurface = -1; TArray Geometries; TArray Uniforms; + TArray WallPortals; + bool InSidePortalsList = false; }; struct FlatSurfaceBlock @@ -77,7 +79,8 @@ public: void BuildSectorGroups(const FLevelLocals& doomMap); - TArray WallPortals; + TArray SidePortals; + TArray WallPortals; TArray sectorGroup; // index is sector, value is sectorGroup TArray sectorPortals[2]; // index is sector+plane, value is index into the portal list @@ -112,6 +115,8 @@ private: void FreeSide(FLevelLocals& doomMap, unsigned int sideIndex); void FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex); + void UpdateWallPortals(); + void SetSubsectorLightmap(int surfaceIndex); void SetSideLightmap(int surfaceIndex); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 4ddcd679d..bdaa89214 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -445,13 +445,13 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) state.SetDepthMask(false); state.EnableTexture(false); state.SetEffect(EFF_PORTAL); - for (HWWall& wall : portals) + for (HWWall* wall : portals) { state.BeginQuery(); - wall.MakeVertices(state, false); - wall.RenderWall(state, HWWall::RWF_BLANK); - wall.vertcount = 0; + wall->MakeVertices(state, false); + wall->RenderWall(state, HWWall::RWF_BLANK); + wall->vertcount = 0; state.EndQuery(); } @@ -471,14 +471,17 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) } state.SetCulling(Cull_None); - // retrieve the query results and use them to fill the portal manager with portals - state.GetQueryResults(queryStart, queryEnd - queryStart, QueryResultsBuffer); - for (unsigned int i = 0, count = QueryResultsBuffer.Size(); i < count; i++) + if (queryStart != queryEnd) { - bool portalVisible = QueryResultsBuffer[i]; - if (portalVisible) + // retrieve the query results and use them to fill the portal manager with portals + state.GetQueryResults(queryStart, queryEnd - queryStart, QueryResultsBuffer); + for (unsigned int i = 0, count = QueryResultsBuffer.Size(); i < count; i++) { - PutWallPortal(portals[i], state); + bool portalVisible = QueryResultsBuffer[i]; + if (portalVisible) + { + PutWallPortal(*portals[i], state); + } } } From 59205533b291bfb32f50c65b0375877ce250e2f9 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 26 Aug 2024 02:59:03 +0200 Subject: [PATCH 217/414] Bias the trace end point to reduce shadow acne --- wadsrc/static/shaders/scene/light_shadow.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/shaders/scene/light_shadow.glsl b/wadsrc/static/shaders/scene/light_shadow.glsl index 7ca90d173..19cdadc0e 100644 --- a/wadsrc/static/shaders/scene/light_shadow.glsl +++ b/wadsrc/static/shaders/scene/light_shadow.glsl @@ -184,7 +184,7 @@ vec2 getVogelDiskSample(int sampleIndex, int sampleCount, float phi) float traceShadow(vec4 lightpos, int quality, float softShadowRadius) { - vec3 origin = pixelpos.xyz; + vec3 origin = pixelpos.xyz + vWorldNormal.xyz; vec3 target = lightpos.xyz + 0.01; // nudge light position slightly as Doom maps tend to have their lights perfectly aligned with planes vec3 direction = normalize(target - origin); From ddc3b530c734920d2efaa2735fed82443375463c Mon Sep 17 00:00:00 2001 From: dpjudas Date: Mon, 26 Aug 2024 12:51:16 +0200 Subject: [PATCH 218/414] Fix compile error due to missing include statement --- src/common/rendering/hwrenderer/data/hw_levelmesh.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 8928606ef..ee1df91c1 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -13,6 +13,7 @@ #include "hw_surfaceuniforms.h" #include "engineerrors.h" #include +#include #include typedef dp::rect_pack::RectPacker RectPacker; From d12cd4d74dfa51682a74183d9fddf2077061ba19 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 28 Aug 2024 19:53:12 +0200 Subject: [PATCH 219/414] Sort initial draw lists by pipeline Fix applying pipeline state too often for scattered draw ranges Delay updating sides and sectors until frame start to allow the playsim to mark surfaces dirty multiple times --- .../rendering/hwrenderer/data/hw_levelmesh.h | 8 + src/common/rendering/vulkan/vk_levelmesh.cpp | 10 + src/common/rendering/vulkan/vk_levelmesh.h | 2 + .../rendering/vulkan/vk_renderstate.cpp | 23 +- src/common/rendering/vulkan/vk_renderstate.h | 2 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 229 ++++++++++++++---- src/rendering/hwrenderer/doom_levelmesh.h | 33 ++- 7 files changed, 252 insertions(+), 55 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index ee1df91c1..1df2d3fb5 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -167,10 +167,13 @@ public: Mesh.Indexes.Resize(limits.MaxIndexes); Mesh.SurfaceIndexes.Resize(limits.MaxIndexes / 3 + 1); + Mesh.DrawIndexes.Resize(limits.MaxIndexes); + FreeLists.Vertex.Clear(); FreeLists.Vertex.Push({ 0, limits.MaxVertices }); FreeLists.Index.Clear(); FreeLists.Index.Push({ 0, limits.MaxIndexes }); FreeLists.Uniforms.Clear(); FreeLists.Uniforms.Push({ 0, limits.MaxUniforms }); FreeLists.Surface.Clear(); FreeLists.Surface.Push({ 0, limits.MaxSurfaces }); + FreeLists.DrawIndex.Clear(); FreeLists.DrawIndex.Push({ 0, limits.MaxIndexes }); } // Data placed in GPU buffers @@ -194,6 +197,9 @@ public: TArray SurfaceIndexes; int IndexCount = 0; // Index range filled with data + // Indexes sorted by pipeline + TArray DrawIndexes; + // GPU buffer size for collision nodes int MaxNodes = 0; } Mesh; @@ -211,6 +217,7 @@ public: TArray Portals; TArray Light; TArray LightIndex; + TArray DrawIndex; } UploadRanges; // Ranges in mesh currently not in use @@ -220,6 +227,7 @@ public: TArray Index; TArray Uniforms; TArray Surface; + TArray DrawIndex; } FreeLists; // Data structure for doing mesh traces on the CPU diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index cf163cdf9..ce0a2b9e4 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -57,6 +57,7 @@ void VkLevelMesh::Reset() deletelist->Add(std::move(PortalBuffer)); deletelist->Add(std::move(LightBuffer)); deletelist->Add(std::move(LightIndexBuffer)); + deletelist->Add(std::move(DrawIndexBuffer)); deletelist->Add(std::move(DynamicBLAS.ScratchBuffer)); deletelist->Add(std::move(DynamicBLAS.AccelStructBuffer)); deletelist->Add(std::move(DynamicBLAS.AccelStruct)); @@ -197,6 +198,12 @@ void VkLevelMesh::CreateBuffers() .DebugName("IndexBuffer") .Create(fb->GetDevice()); + DrawIndexBuffer = BufferBuilder() + .Usage(VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) + .Size((size_t)Mesh->Mesh.DrawIndexes.Size() * sizeof(uint32_t)) + .DebugName("DrawIndexBuffer") + .Create(fb->GetDevice()); + NodeBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) .Size(sizeof(CollisionNodeBufferHeader) + Mesh->Mesh.MaxNodes * sizeof(CollisionNode)) @@ -440,6 +447,7 @@ void VkLevelMeshUploader::Upload() UploadRanges(Mesh->Mesh->UploadRanges.Index, Mesh->Mesh->Mesh.Indexes.Data(), Mesh->IndexBuffer.get()); UploadRanges(Mesh->Mesh->UploadRanges.SurfaceIndex, Mesh->Mesh->Mesh.SurfaceIndexes.Data(), Mesh->SurfaceIndexBuffer.get()); UploadRanges(Mesh->Mesh->UploadRanges.LightIndex, Mesh->Mesh->Mesh.LightIndexes.Data(), Mesh->LightIndexBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.DrawIndex, Mesh->Mesh->Mesh.DrawIndexes.Data(), Mesh->DrawIndexBuffer.get()); UploadSurfaces(); UploadUniforms(); UploadPortals(); @@ -471,6 +479,7 @@ void VkLevelMeshUploader::ClearRanges() Mesh->Mesh->UploadRanges.Portals.clear(); Mesh->Mesh->UploadRanges.Light.clear(); Mesh->Mesh->UploadRanges.LightIndex.clear(); + Mesh->Mesh->UploadRanges.DrawIndex.clear(); } void VkLevelMeshUploader::BeginTransfer(size_t transferBufferSize) @@ -681,5 +690,6 @@ size_t VkLevelMeshUploader::GetTransferSize() for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Portals) transferBufferSize += range.Count() * sizeof(PortalInfo); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.LightIndex) transferBufferSize += range.Count() * sizeof(int32_t); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Light) transferBufferSize += range.Count() * sizeof(LightInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.DrawIndex) transferBufferSize += range.Count() * sizeof(uint32_t); return transferBufferSize; } diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index e43f3e6d2..6247ea15f 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -83,6 +83,7 @@ public: VulkanBuffer* GetPortalBuffer() { return PortalBuffer.get(); } VulkanBuffer* GetLightBuffer() { return LightBuffer.get(); } VulkanBuffer* GetLightIndexBuffer() { return LightIndexBuffer.get(); } + VulkanBuffer* GetDrawIndexBuffer() { return DrawIndexBuffer.get(); } LevelMesh* GetMesh() { return Mesh; } @@ -122,6 +123,7 @@ private: std::unique_ptr PortalBuffer; std::unique_ptr LightBuffer; std::unique_ptr LightIndexBuffer; + std::unique_ptr DrawIndexBuffer; std::unique_ptr NodeBuffer; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 2df40a53b..e902a2681 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -842,7 +842,7 @@ void VkRenderState::ApplyLevelMesh() VkBuffer vertexBuffers[2] = { fb->GetLevelMesh()->GetVertexBuffer()->buffer, fb->GetLevelMesh()->GetUniformIndexBuffer()->buffer }; VkDeviceSize vertexBufferOffsets[] = { 0, 0 }; mCommandBuffer->bindVertexBuffers(0, 2, vertexBuffers, vertexBufferOffsets); - mCommandBuffer->bindIndexBuffer(fb->GetLevelMesh()->GetIndexBuffer()->buffer, 0, VK_INDEX_TYPE_UINT32); + mCommandBuffer->bindIndexBuffer(fb->GetLevelMesh()->GetDrawIndexBuffer()->buffer, 0, VK_INDEX_TYPE_UINT32); } void VkRenderState::DrawLevelMeshSurfaces(bool noFragmentShader) @@ -854,9 +854,12 @@ void VkRenderState::DrawLevelMeshSurfaces(bool noFragmentShader) { int pipelineID = it.first; const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID); - for (MeshBufferRange& range : it.second) + if (ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader)) { - DrawLevelMeshRange(mCommandBuffer, key, range.Start, range.End - range.Start, noFragmentShader); + for (MeshBufferRange& range : it.second) + { + mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0); + } } } } @@ -870,9 +873,12 @@ void VkRenderState::DrawLevelMeshPortals(bool noFragmentShader) { int pipelineID = it.first; const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID); - for (MeshBufferRange& range : it.second) + if (ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader)) { - DrawLevelMeshRange(mCommandBuffer, key, range.Start, range.End - range.Start, noFragmentShader); + for (MeshBufferRange& range : it.second) + { + mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0); + } } } } @@ -909,10 +915,10 @@ void VkRenderState::GetQueryResults(int queryStart, int queryCount, TArray } } -void VkRenderState::DrawLevelMeshRange(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, int start, int count, bool noFragmentShader) +bool VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader) { if (noFragmentShader && pipelineKey.ShaderKey.AlphaTest) - return; + return false; pipelineKey.ShaderKey.NoFragmentShader = noFragmentShader; pipelineKey.DepthTest = mDepthTest; @@ -945,7 +951,8 @@ void VkRenderState::DrawLevelMeshRange(VulkanCommandBuffer* cmdbuffer, VkPipelin cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetLevelMeshSet(), 4, offsets); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, descriptors->GetBindlessSet()); cmdbuffer->pushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &pushConstants); - cmdbuffer->drawIndexed(count, 1, start, 0, 0); + + return true; } ///////////////////////////////////////////////////////////////////////////// diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index e3bd07754..3e297759f 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -89,7 +89,7 @@ protected: void WaitForStreamBuffers(); void ApplyLevelMesh(); - void DrawLevelMeshRange(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, int start, int count, bool noFragmentShader); + bool ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader); VulkanRenderDevice* fb = nullptr; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 4587f69a9..f1477db3f 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -60,6 +60,13 @@ ADD_STAT(lightmap) return out; } +ADD_STAT(levelmesh) +{ + FString out; + out.Format("Sides=%d, flats=%d", level.levelMesh->LastFrameStats.SidesUpdated, level.levelMesh->LastFrameStats.FlatsUpdated); + return out; +} + CCMD(dumplevelmesh) { if (!RequireLevelMesh()) return; @@ -172,16 +179,35 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) Mesh.MaxNodes = std::max(Collision->get_nodes().size() * 2, (size_t)10000); UploadPortals(); + + SortDrawLists(); } void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) { + LastFrameStats = CurFrameStats; + CurFrameStats = Stats(); + // To do: we don't need to always do this. UpdateLevelMesh should tell us when polyobjs move. for (side_t* side : PolySides) { - UpdateSide(doomMap, side->Index()); + UpdateSide(side->Index()); } + for (int sideIndex : SideUpdateList) + { + CreateSide(doomMap, sideIndex); + Sides[sideIndex].InUpdateList = false; + } + SideUpdateList.Clear(); + + for (int flatIndex : FlatUpdateList) + { + CreateFlat(doomMap, flatIndex); + Flats[flatIndex].InUpdateList = false; + } + FlatUpdateList.Clear(); + CreateLights(doomMap); UpdateWallPortals(); } @@ -366,7 +392,7 @@ void DoomLevelMesh::CreateSurfaces(FLevelLocals& doomMap) continue; } - UpdateSide(doomMap, i); + CreateSide(doomMap, i); } // Create surfaces for all flats @@ -375,7 +401,7 @@ void DoomLevelMesh::CreateSurfaces(FLevelLocals& doomMap) sector_t* sector = &doomMap.sectors[i]; if (sector->subsectorcount == 0 || sector->subsectors[0]->flags & SSECF_POLYORG) continue; - UpdateFlat(doomMap, i); + CreateFlat(doomMap, i); } } @@ -394,15 +420,12 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) Sides[sideIndex].FirstSurface = -1; for (auto& geo : Sides[sideIndex].Geometries) - { FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); - if (!geo.IsPortal) - RemoveRange(DrawList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); - else - RemoveRange(PortalList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); - } Sides[sideIndex].Geometries.Clear(); + RemoveFromDrawList(Sides[sideIndex].DrawRanges); + Sides[sideIndex].DrawRanges.Clear(); + for (auto& uni : Sides[sideIndex].Uniforms) FreeUniforms(uni.Start, uni.Count); Sides[sideIndex].Uniforms.Clear(); @@ -425,15 +448,12 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) Flats[sectorIndex].FirstSurface = -1; for (auto& geo : Flats[sectorIndex].Geometries) - { FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); - if (!geo.IsPortal) - RemoveRange(DrawList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); - else - RemoveRange(PortalList[geo.PipelineID], { geo.IndexStart, geo.IndexStart + geo.IndexCount }); - } Flats[sectorIndex].Geometries.Clear(); + RemoveFromDrawList(Flats[sectorIndex].DrawRanges); + Flats[sectorIndex].DrawRanges.Clear(); + for (auto& uni : Flats[sectorIndex].Uniforms) FreeUniforms(uni.Start, uni.Count); Flats[sectorIndex].Uniforms.Clear(); @@ -441,51 +461,51 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) void DoomLevelMesh::FloorHeightChanged(struct sector_t* sector) { - UpdateFlat(level, sector->Index()); + UpdateFlat(sector->Index()); for (line_t* line : sector->Lines) { if (line->sidedef[0]) - UpdateSide(level, line->sidedef[0]->Index()); + UpdateSide(line->sidedef[0]->Index()); if (line->sidedef[1]) - UpdateSide(level, line->sidedef[1]->Index()); + UpdateSide(line->sidedef[1]->Index()); } } void DoomLevelMesh::CeilingHeightChanged(struct sector_t* sector) { - UpdateFlat(level, sector->Index()); + UpdateFlat(sector->Index()); for (line_t* line : sector->Lines) { if (line->sidedef[0]) - UpdateSide(level, line->sidedef[0]->Index()); + UpdateSide(line->sidedef[0]->Index()); if (line->sidedef[1]) - UpdateSide(level, line->sidedef[1]->Index()); + UpdateSide(line->sidedef[1]->Index()); } } void DoomLevelMesh::MidTex3DHeightChanged(struct sector_t* sector) { - // UpdateFlat(level, sector->Index()); + // UpdateFlat(sector->Index()); } void DoomLevelMesh::FloorTextureChanged(struct sector_t* sector) { - UpdateFlat(level, sector->Index()); + UpdateFlat(sector->Index()); } void DoomLevelMesh::CeilingTextureChanged(struct sector_t* sector) { - UpdateFlat(level, sector->Index()); + UpdateFlat(sector->Index()); } void DoomLevelMesh::SectorChangedOther(struct sector_t* sector) { - UpdateFlat(level, sector->Index()); + UpdateFlat(sector->Index()); } void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) { - UpdateSide(level, side->Index()); + UpdateSide(side->Index()); } void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) @@ -495,9 +515,9 @@ void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) for (line_t* line : sector->Lines) { if (line->frontsector == sector && line->sidedef[0]) - UpdateSide(level, line->sidedef[0]->Index()); + UpdateSide(line->sidedef[0]->Index()); else if (line->sidedef[1]) - UpdateSide(level, line->sidedef[1]->Index()); + UpdateSide(line->sidedef[1]->Index()); } */ } @@ -510,8 +530,28 @@ void DoomLevelMesh::SectorLightThinkerDestroyed(struct sector_t* sector, class D { } -void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) +void DoomLevelMesh::UpdateSide(unsigned int sideIndex) { + if (!Sides[sideIndex].InUpdateList) + { + SideUpdateList.Push(sideIndex); + Sides[sideIndex].InUpdateList = true; + } +} + +void DoomLevelMesh::UpdateFlat(unsigned int sectorIndex) +{ + if (!Flats[sectorIndex].InUpdateList) + { + FlatUpdateList.Push(sectorIndex); + Flats[sectorIndex].InUpdateList = true; + } +} + +void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) +{ + CurFrameStats.SidesUpdated++; + FreeSide(doomMap, sideIndex); side_t* side = &doomMap.sides[sideIndex]; @@ -576,8 +616,10 @@ void DoomLevelMesh::UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex) */ } -void DoomLevelMesh::UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) +void DoomLevelMesh::CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) { + CurFrameStats.FlatsUpdated++; + FreeFlat(doomMap, sectorIndex); sector_t* sector = &doomMap.sectors[sectorIndex]; @@ -751,15 +793,121 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh Sides[sideIndex].Geometries.Push({ ginfo, pipelineID, sinfo.Surface->IsSky }); Sides[sideIndex].Uniforms.Push(uinfo); - if (!sinfo.Surface->IsSky) - { - AddRange(DrawList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); - } + AddToDrawList(Sides[sideIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, sinfo.Surface->IsSky); + } +} + +void DoomLevelMesh::AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, bool isPortal) +{ + // Remember the location if we have to remove it again + DrawRangeInfo info; + info.DrawIndexStart = RemoveRange(FreeLists.DrawIndex, indexCount); + info.DrawIndexCount = indexCount; + info.IsPortal = isPortal; + info.PipelineID = pipelineID; + drawRanges.Push(info); + + // Copy the indexes over from the unsorted index list + memcpy(&Mesh.DrawIndexes[info.DrawIndexStart], &Mesh.Indexes[indexStart], indexCount * sizeof(uint32_t)); + AddRange(UploadRanges.DrawIndex, { info.DrawIndexStart, info.DrawIndexStart + indexCount }); + + // Add to the draw lists + if (!isPortal) + { + AddRange(DrawList[pipelineID], { info.DrawIndexStart, info.DrawIndexStart + indexCount }); + } + else + { + AddRange(PortalList[pipelineID], { info.DrawIndexStart, info.DrawIndexStart + indexCount }); + } +} + +void DoomLevelMesh::RemoveFromDrawList(const TArray& drawRanges) +{ + for (const DrawRangeInfo& info : drawRanges) + { + int start = info.DrawIndexStart; + int end = info.DrawIndexStart + info.DrawIndexCount; + + if (!info.IsPortal) + RemoveRange(DrawList[info.PipelineID], { start, end }); else + RemoveRange(PortalList[info.PipelineID], { start, end }); + + AddRange(FreeLists.DrawIndex, { start, end }); + } +} + +void DoomLevelMesh::SortDrawLists() +{ + std::unordered_map> sortedDrawList; + std::unordered_map> sortedPortalList; + + for (auto& side : Sides) + { + for (auto& range : side.DrawRanges) { - AddRange(PortalList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); + if (!range.IsPortal) + sortedDrawList[range.PipelineID].Push(&range); + else + sortedPortalList[range.PipelineID].Push(&range); } } + + for (auto& flat : Flats) + { + for (auto& range : flat.DrawRanges) + { + if (!range.IsPortal) + sortedDrawList[range.PipelineID].Push(&range); + else + sortedPortalList[range.PipelineID].Push(&range); + } + } + + TArray indexes; + + DrawList.clear(); + for (auto& it : sortedDrawList) + { + auto& list = DrawList[it.first]; + int listStart = indexes.Size(); + for (DrawRangeInfo* range : it.second) + { + int sortedStart = indexes.Size(); + int start = range->DrawIndexStart; + int count = range->DrawIndexCount; + for (int i = 0; i < count; i++) + { + indexes.Push(Mesh.DrawIndexes[start + i]); + } + range->DrawIndexStart = sortedStart; + } + int listEnd = indexes.Size(); + list.Push({ listStart, listEnd }); + } + + PortalList.clear(); + for (auto& it : sortedPortalList) + { + auto& list = PortalList[it.first]; + int listStart = indexes.Size(); + for (DrawRangeInfo* range : it.second) + { + int sortedStart = indexes.Size(); + int start = range->DrawIndexStart; + int count = range->DrawIndexCount; + for (int i = 0; i < count; i++) + { + indexes.Push(Mesh.DrawIndexes[start + i]); + } + range->DrawIndexStart = sortedStart; + } + int listEnd = indexes.Size(); + list.Push({ listStart, listEnd }); + } + + memcpy(Mesh.DrawIndexes.Data(), indexes.Data(), indexes.Size() * sizeof(uint32_t)); } int DoomLevelMesh::AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMeshSurface& surf, uint16_t sampleDimension, bool alwaysUpdate) @@ -897,15 +1045,6 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state Flats[sectorIndex].Geometries.Push({ ginfo, pipelineID, isSky }); Flats[sectorIndex].Uniforms.Push(uinfo); - if (!isSky) - { - AddRange(DrawList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); - } - else - { - AddRange(PortalList[pipelineID], { ginfo.IndexStart, ginfo.IndexStart + ginfo.IndexCount }); - } - int* surfaceIndexes = &Mesh.SurfaceIndexes[ginfo.IndexStart / 3]; *uinfo.Uniforms = *uniforms; @@ -1019,6 +1158,8 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state SetSubsectorLightmap(sinfo.Index); } + + AddToDrawList(Flats[sectorIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, isSky); } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 7529a153f..515e837d4 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -50,6 +50,14 @@ struct GeometryFreeInfo bool IsPortal = false; }; +struct DrawRangeInfo +{ + int PipelineID = 0; + bool IsPortal = false; + int DrawIndexStart = 0; + int DrawIndexCount = 0; +}; + struct SideSurfaceBlock { int FirstSurface = -1; @@ -57,6 +65,8 @@ struct SideSurfaceBlock TArray Uniforms; TArray WallPortals; bool InSidePortalsList = false; + TArray DrawRanges; + bool InUpdateList = false; }; struct FlatSurfaceBlock @@ -64,6 +74,8 @@ struct FlatSurfaceBlock int FirstSurface = -1; TArray Geometries; TArray Uniforms; + TArray DrawRanges; + bool InUpdateList = false; }; class DoomLevelMesh : public LevelMesh, public UpdateLevelMesh @@ -105,12 +117,22 @@ public: DoomSurfaceInfos.Resize(limits.MaxSurfaces); } + struct Stats + { + int FlatsUpdated = 0; + int SidesUpdated = 0; + }; + Stats LastFrameStats, CurFrameStats; + private: void CreateSurfaces(FLevelLocals& doomMap); void CreateLightList(FLevelLocals& doomMap, int surfaceIndex); - void UpdateSide(FLevelLocals& doomMap, unsigned int sideIndex); - void UpdateFlat(FLevelLocals& doomMap, unsigned int sectorIndex); + void UpdateSide(unsigned int sideIndex); + void UpdateFlat(unsigned int sectorIndex); + + void CreateSide(FLevelLocals& doomMap, unsigned int sideIndex); + void CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex); void FreeSide(FLevelLocals& doomMap, unsigned int sideIndex); void FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex); @@ -133,6 +155,10 @@ private: int GetLightIndex(FDynamicLight* light, int portalgroup); + void AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, bool isPortal); + void RemoveFromDrawList(const TArray& drawRanges); + void SortDrawLists(); + TArray DoomSurfaceInfos; TArray> PolyDoomSurfaceInfos; @@ -140,6 +166,9 @@ private: TArray Flats; TArray PolySides; + TArray SideUpdateList; + TArray FlatUpdateList; + std::map bindings; MeshBuilder state; bool LightsCreated = false; From 3cb2b31d95a1798d78ce7c45142e22f647902e4b Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 30 Aug 2024 03:12:24 +0200 Subject: [PATCH 220/414] Create up to 32 bottom level acceleration structures to avoid rebuilding the entire map on geometry changes --- src/common/rendering/vulkan/vk_levelmesh.cpp | 98 +++++++++++++------- src/common/rendering/vulkan/vk_levelmesh.h | 6 +- 2 files changed, 71 insertions(+), 33 deletions(-) diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index ce0a2b9e4..b6579ab11 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -58,9 +58,13 @@ void VkLevelMesh::Reset() deletelist->Add(std::move(LightBuffer)); deletelist->Add(std::move(LightIndexBuffer)); deletelist->Add(std::move(DrawIndexBuffer)); - deletelist->Add(std::move(DynamicBLAS.ScratchBuffer)); - deletelist->Add(std::move(DynamicBLAS.AccelStructBuffer)); - deletelist->Add(std::move(DynamicBLAS.AccelStruct)); + for (BLAS& blas : DynamicBLAS) + { + deletelist->Add(std::move(blas.ScratchBuffer)); + deletelist->Add(std::move(blas.AccelStructBuffer)); + deletelist->Add(std::move(blas.AccelStruct)); + } + DynamicBLAS.clear(); deletelist->Add(std::move(TopLevelAS.TransferBuffer)); deletelist->Add(std::move(TopLevelAS.InstanceBuffer)); deletelist->Add(std::move(TopLevelAS.ScratchBuffer)); @@ -81,9 +85,20 @@ void VkLevelMesh::CreateVulkanObjects() .AddMemory(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT) .Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.IndexCount); - CreateTLASInstanceBuffer(); + // Find out how many segments we should split the map into + DynamicBLAS.resize(32); // fb->GetDevice()->PhysicalDevice.Properties.AccelerationStructure.maxInstanceCount is 65 or 382 on current devices (aug 2024) + IndexesPerBLAS = ((Mesh->Mesh.Indexes.size() + 2) / 3 / DynamicBLAS.size() + 1) * 3; + InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; + // Create a BLAS for each segment in use + for (int instance = 0; instance < InstanceCount; instance++) + { + int indexStart = instance * IndexesPerBLAS; + int indexEnd = std::min(indexStart + IndexesPerBLAS, Mesh->Mesh.IndexCount); + DynamicBLAS[instance] = CreateBLAS(true, indexStart, indexEnd - indexStart); + } + + CreateTLASInstanceBuffer(); UploadTLASInstanceBuffer(); // Wait for bottom level builds to finish before using it as input to a toplevel accel structure. Also wait for the instance buffer upload to complete. @@ -91,7 +106,7 @@ void VkLevelMesh::CreateVulkanObjects() .AddMemory(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT) .Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR); - CreateTopLevelAS(DynamicBLAS.AccelStruct ? 2 : 1); + CreateTopLevelAS(InstanceCount); // Finish building the accel struct before using it from the shaders PipelineBarrier() @@ -109,7 +124,18 @@ void VkLevelMesh::CreateVulkanObjects() void VkLevelMesh::BeginFrame() { - bool accelStructNeedsUpdate = Mesh->UploadRanges.Index.Size() != 0 || Mesh->UploadRanges.Vertex.Size() != 0; + InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; + + bool accelStructNeedsUpdate = Mesh->UploadRanges.Index.Size() != 0; + for (const MeshBufferRange& range : Mesh->UploadRanges.Index) + { + int start = range.Start / IndexesPerBLAS; + int end = (range.End + IndexesPerBLAS - 1) / IndexesPerBLAS; + for (int i = start; i < end; i++) + { + DynamicBLAS[i].NeedsUpdate = true; + } + } UploadMeshes(); @@ -124,12 +150,22 @@ void VkLevelMesh::BeginFrame() { // To do: we should reuse the buffers. + // Create a new BLAS for each segment that changed auto deletelist = fb->GetCommands()->DrawDeleteList.get(); - deletelist->Add(std::move(DynamicBLAS.ScratchBuffer)); - deletelist->Add(std::move(DynamicBLAS.AccelStructBuffer)); - deletelist->Add(std::move(DynamicBLAS.AccelStruct)); + for (int instance = 0; instance < InstanceCount; instance++) + { + BLAS& blas = DynamicBLAS[instance]; + if (blas.NeedsUpdate) + { + deletelist->Add(std::move(blas.ScratchBuffer)); + deletelist->Add(std::move(blas.AccelStructBuffer)); + deletelist->Add(std::move(blas.AccelStruct)); - DynamicBLAS = CreateBLAS(true, 0, Mesh->Mesh.IndexCount); + int indexStart = instance * IndexesPerBLAS; + int indexEnd = std::min(indexStart + IndexesPerBLAS, Mesh->Mesh.IndexCount); + blas = CreateBLAS(true, indexStart, indexEnd - indexStart); + } + } deletelist->Add(std::move(TopLevelAS.TransferBuffer)); deletelist->Add(std::move(TopLevelAS.InstanceBuffer)); @@ -142,7 +178,7 @@ void VkLevelMesh::BeginFrame() .AddMemory(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_SHADER_READ_BIT) .Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR); - UpdateTopLevelAS(DynamicBLAS.AccelStruct ? 2 : 1); + UpdateTopLevelAS(InstanceCount); // Finish building the accel struct before using it from the shaders PipelineBarrier() @@ -295,6 +331,8 @@ VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(bool preferFastBuild, int indexOffset, .DebugName("BLAS.ScratchBuffer") .Create(fb->GetDevice()); + blas.DeviceAddress = blas.AccelStruct->GetDeviceAddress(); + buildInfo.dstAccelerationStructure = blas.AccelStruct->accelstruct; buildInfo.scratchData.deviceAddress = blas.ScratchBuffer->GetDeviceAddress(); @@ -311,13 +349,13 @@ void VkLevelMesh::CreateTLASInstanceBuffer() { TopLevelAS.TransferBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY) - .Size(sizeof(VkAccelerationStructureInstanceKHR) * 2) + .Size(sizeof(VkAccelerationStructureInstanceKHR) * DynamicBLAS.size()) .DebugName("TopLevelAS.TransferBuffer") .Create(fb->GetDevice()); TopLevelAS.InstanceBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(sizeof(VkAccelerationStructureInstanceKHR) * 2) + .Size(sizeof(VkAccelerationStructureInstanceKHR) * DynamicBLAS.size()) .DebugName("TopLevelAS.InstanceBuffer") .Create(fb->GetDevice()); } @@ -338,7 +376,7 @@ void VkLevelMesh::CreateTopLevelAS(int instanceCount) accelStructTLDesc.geometry.instances = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR }; accelStructTLDesc.geometry.instances.data.deviceAddress = TopLevelAS.InstanceBuffer->GetDeviceAddress(); - uint32_t maxInstanceCount = 2; + uint32_t maxInstanceCount = (uint32_t)DynamicBLAS.size(); VkAccelerationStructureBuildSizesInfoKHR sizeInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR }; vkGetAccelerationStructureBuildSizesKHR(fb->GetDevice()->device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &buildInfo, &maxInstanceCount, &sizeInfo); @@ -400,25 +438,21 @@ void VkLevelMesh::UpdateTopLevelAS(int instanceCount) void VkLevelMesh::UploadTLASInstanceBuffer() { - VkAccelerationStructureInstanceKHR instances[2] = {}; - instances[0].transform.matrix[0][0] = 1.0f; - instances[0].transform.matrix[1][1] = 1.0f; - instances[0].transform.matrix[2][2] = 1.0f; - instances[0].mask = 0xff; - instances[0].flags = 0; - instances[0].accelerationStructureReference = DynamicBLAS.AccelStruct->GetDeviceAddress(); + VkAccelerationStructureInstanceKHR instance = {}; + instance.transform.matrix[0][0] = 1.0f; + instance.transform.matrix[1][1] = 1.0f; + instance.transform.matrix[2][2] = 1.0f; + instance.mask = 0xff; + instance.flags = 0; - /* - instances[1].transform.matrix[0][0] = 1.0f; - instances[1].transform.matrix[1][1] = 1.0f; - instances[1].transform.matrix[2][2] = 1.0f; - instances[1].mask = 0xff; - instances[1].flags = 0; - instances[1].accelerationStructureReference = DynamicBLAS.AccelStruct->GetDeviceAddress(); - */ + auto data = (uint8_t*)TopLevelAS.TransferBuffer->Map(0, sizeof(VkAccelerationStructureInstanceKHR) * DynamicBLAS.size()); + for (BLAS& blas : DynamicBLAS) + { + instance.accelerationStructureReference = blas.DeviceAddress; - auto data = (uint8_t*)TopLevelAS.TransferBuffer->Map(0, sizeof(VkAccelerationStructureInstanceKHR) * 2); - memcpy(data, instances, sizeof(VkAccelerationStructureInstanceKHR) * 2); + memcpy(data, &instance, sizeof(VkAccelerationStructureInstanceKHR)); + data += sizeof(VkAccelerationStructureInstanceKHR); + } TopLevelAS.TransferBuffer->Unmap(); fb->GetCommands()->GetTransferCommands()->copyBuffer(TopLevelAS.TransferBuffer.get(), TopLevelAS.InstanceBuffer.get()); diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index 6247ea15f..9bdad073e 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -93,6 +93,8 @@ private: std::unique_ptr ScratchBuffer; std::unique_ptr AccelStructBuffer; std::unique_ptr AccelStruct; + VkDeviceAddress DeviceAddress = 0; + bool NeedsUpdate = false; }; void Reset(); @@ -127,7 +129,9 @@ private: std::unique_ptr NodeBuffer; - BLAS DynamicBLAS; + std::vector DynamicBLAS; + int IndexesPerBLAS = 0; + int InstanceCount = 0; struct { From 75dd9e13c930050d7c61e31a2ddcc361823b4e00 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 30 Aug 2024 21:58:13 +0200 Subject: [PATCH 221/414] Fix line portals drawn as opaque --- src/rendering/hwrenderer/doom_levelmesh.cpp | 8 ++++++-- src/rendering/hwrenderer/doom_levelmesh.h | 1 + src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index f1477db3f..d245a2882 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -62,8 +62,12 @@ ADD_STAT(lightmap) ADD_STAT(levelmesh) { + auto& stats = level.levelMesh->LastFrameStats; FString out; - out.Format("Sides=%d, flats=%d", level.levelMesh->LastFrameStats.SidesUpdated, level.levelMesh->LastFrameStats.FlatsUpdated); + if (level.levelMesh) + out.Format("Sides=%d, flats=%d, portals=%d", stats.SidesUpdated, stats.FlatsUpdated, stats.Portals); + else + out = "No level mesh"; return out; } @@ -793,7 +797,7 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh Sides[sideIndex].Geometries.Push({ ginfo, pipelineID, sinfo.Surface->IsSky }); Sides[sideIndex].Uniforms.Push(uinfo); - AddToDrawList(Sides[sideIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, sinfo.Surface->IsSky); + AddToDrawList(Sides[sideIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, isPortal); } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 515e837d4..7a8fca268 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -121,6 +121,7 @@ public: { int FlatsUpdated = 0; int SidesUpdated = 0; + int Portals = 0; }; Stats LastFrameStats, CurFrameStats; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index bdaa89214..245e8601f 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -513,6 +513,9 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) } else { + if (gl_levelmesh && level.levelMesh) + level.levelMesh->CurFrameStats.Portals++; + RenderBSP(Level->HeadNode(), drawpsprites, state); } From 66288b539cf0c396e1ebbcbdda7beab46d51bab2 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sat, 31 Aug 2024 03:42:03 +0200 Subject: [PATCH 222/414] Fix crash on GPUs that doesn't support ray query --- src/common/rendering/vulkan/vk_levelmesh.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index b6579ab11..fd3dc6d2e 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -124,16 +124,20 @@ void VkLevelMesh::CreateVulkanObjects() void VkLevelMesh::BeginFrame() { - InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; - - bool accelStructNeedsUpdate = Mesh->UploadRanges.Index.Size() != 0; - for (const MeshBufferRange& range : Mesh->UploadRanges.Index) + bool accelStructNeedsUpdate = false; + if (useRayQuery) { - int start = range.Start / IndexesPerBLAS; - int end = (range.End + IndexesPerBLAS - 1) / IndexesPerBLAS; - for (int i = start; i < end; i++) + InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; + + accelStructNeedsUpdate = Mesh->UploadRanges.Index.Size() != 0; + for (const MeshBufferRange& range : Mesh->UploadRanges.Index) { - DynamicBLAS[i].NeedsUpdate = true; + int start = range.Start / IndexesPerBLAS; + int end = (range.End + IndexesPerBLAS - 1) / IndexesPerBLAS; + for (int i = start; i < end; i++) + { + DynamicBLAS[i].NeedsUpdate = true; + } } } From 4666fa6241b85e5646274fc8eb8c512e122cc3ca Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 1 Sep 2024 22:44:25 +0200 Subject: [PATCH 223/414] Split masked from opaque in the level mesh draw lists --- .../rendering/hwrenderer/data/hw_levelmesh.h | 12 +- .../hwrenderer/data/hw_renderstate.h | 4 +- .../rendering/vulkan/vk_renderstate.cpp | 36 +----- src/common/rendering/vulkan/vk_renderstate.h | 5 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 119 +++++++----------- src/rendering/hwrenderer/doom_levelmesh.h | 14 +-- .../hwrenderer/scene/hw_drawinfo.cpp | 10 +- 7 files changed, 73 insertions(+), 127 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 1df2d3fb5..1af04da67 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -67,6 +67,15 @@ struct LevelMeshLimits int MaxIndexes = 0; }; +enum class LevelMeshDrawType +{ + Opaque, + Masked, + Portal, + Translucent, + NumDrawTypes +}; + class LevelMesh { public: @@ -234,8 +243,7 @@ public: std::unique_ptr Collision; // Draw index ranges for rendering the level mesh, grouped by pipeline - std::unordered_map> DrawList; - std::unordered_map> PortalList; + std::unordered_map> DrawList[(int)LevelMeshDrawType::NumDrawTypes]; // Lightmap atlas int LMTextureCount = 0; diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 1caf9e830..63b57d5e3 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -16,6 +16,7 @@ struct FColormap; class IBuffer; struct HWViewpointUniforms; struct FDynLightData; +enum class LevelMeshDrawType; enum EClearTarget { @@ -697,8 +698,7 @@ public: } // Draw level mesh - virtual void DrawLevelMeshSurfaces(bool noFragmentShader) { } - virtual void DrawLevelMeshPortals(bool noFragmentShader) { } + virtual void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) { } virtual int GetNextQueryIndex() { return 0; } virtual void BeginQuery() { } virtual void EndQuery() { } diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index e902a2681..f5bcfbc64 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -845,40 +845,21 @@ void VkRenderState::ApplyLevelMesh() mCommandBuffer->bindIndexBuffer(fb->GetLevelMesh()->GetDrawIndexBuffer()->buffer, 0, VK_INDEX_TYPE_UINT32); } -void VkRenderState::DrawLevelMeshSurfaces(bool noFragmentShader) +void VkRenderState::DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) { ApplyLevelMesh(); auto mesh = fb->GetLevelMesh()->GetMesh(); - for (auto& it : mesh->DrawList) + for (auto& it : mesh->DrawList[(int)drawType]) { int pipelineID = it.first; const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID); - if (ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader)) - { - for (MeshBufferRange& range : it.second) - { - mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0); - } - } - } -} -void VkRenderState::DrawLevelMeshPortals(bool noFragmentShader) -{ - ApplyLevelMesh(); + ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader); - auto mesh = fb->GetLevelMesh()->GetMesh(); - for (auto& it : mesh->PortalList) - { - int pipelineID = it.first; - const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID); - if (ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader)) + for (MeshBufferRange& range : it.second) { - for (MeshBufferRange& range : it.second) - { - mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0); - } + mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0); } } } @@ -915,11 +896,8 @@ void VkRenderState::GetQueryResults(int queryStart, int queryCount, TArray } } -bool VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader) +void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader) { - if (noFragmentShader && pipelineKey.ShaderKey.AlphaTest) - return false; - pipelineKey.ShaderKey.NoFragmentShader = noFragmentShader; pipelineKey.DepthTest = mDepthTest; pipelineKey.DepthWrite = mDepthTest && mDepthWrite; @@ -951,8 +929,6 @@ bool VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetLevelMeshSet(), 4, offsets); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, descriptors->GetBindlessSet()); cmdbuffer->pushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &pushConstants); - - return true; } ///////////////////////////////////////////////////////////////////////////// diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index 3e297759f..9cf1fdb5d 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -57,8 +57,7 @@ public: void ResetVertices() override; // Draw level mesh - void DrawLevelMeshSurfaces(bool noFragmentShader) override; - void DrawLevelMeshPortals(bool noFragmentShader) override; + void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) override; int GetNextQueryIndex() override; void BeginQuery() override; void EndQuery() override; @@ -89,7 +88,7 @@ protected: void WaitForStreamBuffers(); void ApplyLevelMesh(); - bool ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader); + void ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader); VulkanRenderDevice* fb = nullptr; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index d245a2882..6f6a93fa7 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -594,7 +594,7 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) state.EnableTexture(true); state.EnableBrightmap(true); state.AlphaFunc(Alpha_GEqual, 0.f); - CreateWallSurface(side, disp, state, result.list, false, true, sideIndex); + CreateWallSurface(side, disp, state, result.list, back ? LevelMeshDrawType::Masked : LevelMeshDrawType::Opaque, true, sideIndex); if (result.portals.Size() != 0 && !Sides[sideIndex].InSidePortalsList) { @@ -608,13 +608,13 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) Sides[sideIndex].WallPortals.Push(portal); } - CreateWallSurface(side, disp, state, result.portals, true, false, sideIndex); + CreateWallSurface(side, disp, state, result.portals, LevelMeshDrawType::Portal, false, sideIndex); /* // final pass: translucent stuff state.AlphaFunc(Alpha_GEqual, gl_mask_sprite_threshold); state.SetRenderStyle(STYLE_Translucent); - CreateWallSurface(side, disp, state, result.translucent, false, true, sideIndex); + CreateWallSurface(side, disp, state, result.translucent, LevelMeshDrawType::Translucent, true, sideIndex); state.AlphaFunc(Alpha_GEqual, 0.f); state.SetRenderStyle(STYLE_Normal); */ @@ -641,27 +641,27 @@ void DoomLevelMesh::CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) state.ClearDepthBias(); state.EnableTexture(true); state.EnableBrightmap(true); - CreateFlatSurface(disp, state, result.list, false, false, sectorIndex); + CreateFlatSurface(disp, state, result.list, LevelMeshDrawType::Opaque, false, sectorIndex); - CreateFlatSurface(disp, state, result.portals, true, false, sectorIndex); + CreateFlatSurface(disp, state, result.portals, LevelMeshDrawType::Portal, false, sectorIndex); // final pass: translucent stuff state.AlphaFunc(Alpha_GEqual, gl_mask_sprite_threshold); state.SetRenderStyle(STYLE_Translucent); - CreateFlatSurface(disp, state, result.translucentborder, false, true, sectorIndex); + CreateFlatSurface(disp, state, result.translucentborder, LevelMeshDrawType::Translucent, true, sectorIndex); state.SetDepthMask(false); - CreateFlatSurface(disp, state, result.translucent, false, true, sectorIndex); + CreateFlatSurface(disp, state, result.translucent, LevelMeshDrawType::Translucent, true, sectorIndex); state.AlphaFunc(Alpha_GEqual, 0.f); state.SetDepthMask(true); state.SetRenderStyle(STYLE_Normal); } } -void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent, unsigned int sideIndex) +void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sideIndex) { for (HWWall& wallpart : list) { - if (isPortal) + if (drawType == LevelMeshDrawType::Portal) { state.SetEffect(EFF_PORTAL); state.EnableTexture(false); @@ -784,8 +784,8 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh sinfo.Surface->MeshLocation.NumElements = ginfo.IndexCount; sinfo.Surface->Plane = FVector4(N.X, N.Y, 0.0f, v1 | N); sinfo.Surface->Texture = wallpart.texture; - sinfo.Surface->PortalIndex = isPortal ? linePortals[side->linedef->Index()] : 0; - sinfo.Surface->IsSky = isPortal ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; + sinfo.Surface->PortalIndex = (drawType == LevelMeshDrawType::Portal) ? linePortals[side->linedef->Index()] : 0; + sinfo.Surface->IsSky = (drawType == LevelMeshDrawType::Portal) ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; sinfo.Surface->Bounds = GetBoundsFromSurface(*sinfo.Surface); sinfo.Surface->LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, *sinfo.Surface, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; @@ -794,20 +794,20 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh for (int i = ginfo.IndexStart / 3, end = (ginfo.IndexStart + ginfo.IndexCount) / 3; i < end; i++) Mesh.SurfaceIndexes[i] = sinfo.Index; - Sides[sideIndex].Geometries.Push({ ginfo, pipelineID, sinfo.Surface->IsSky }); + Sides[sideIndex].Geometries.Push(ginfo); Sides[sideIndex].Uniforms.Push(uinfo); - AddToDrawList(Sides[sideIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, isPortal); + AddToDrawList(Sides[sideIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, drawType); } } -void DoomLevelMesh::AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, bool isPortal) +void DoomLevelMesh::AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, LevelMeshDrawType drawType) { // Remember the location if we have to remove it again DrawRangeInfo info; info.DrawIndexStart = RemoveRange(FreeLists.DrawIndex, indexCount); info.DrawIndexCount = indexCount; - info.IsPortal = isPortal; + info.DrawType = drawType; info.PipelineID = pipelineID; drawRanges.Push(info); @@ -816,14 +816,7 @@ void DoomLevelMesh::AddToDrawList(TArray& drawRanges, int pipelin AddRange(UploadRanges.DrawIndex, { info.DrawIndexStart, info.DrawIndexStart + indexCount }); // Add to the draw lists - if (!isPortal) - { - AddRange(DrawList[pipelineID], { info.DrawIndexStart, info.DrawIndexStart + indexCount }); - } - else - { - AddRange(PortalList[pipelineID], { info.DrawIndexStart, info.DrawIndexStart + indexCount }); - } + AddRange(DrawList[(int)drawType][pipelineID], { info.DrawIndexStart, info.DrawIndexStart + indexCount }); } void DoomLevelMesh::RemoveFromDrawList(const TArray& drawRanges) @@ -833,28 +826,20 @@ void DoomLevelMesh::RemoveFromDrawList(const TArray& drawRanges) int start = info.DrawIndexStart; int end = info.DrawIndexStart + info.DrawIndexCount; - if (!info.IsPortal) - RemoveRange(DrawList[info.PipelineID], { start, end }); - else - RemoveRange(PortalList[info.PipelineID], { start, end }); - + RemoveRange(DrawList[(int)info.DrawType][info.PipelineID], { start, end }); AddRange(FreeLists.DrawIndex, { start, end }); } } void DoomLevelMesh::SortDrawLists() { - std::unordered_map> sortedDrawList; - std::unordered_map> sortedPortalList; + std::unordered_map> sortedDrawList[(int)LevelMeshDrawType::NumDrawTypes]; for (auto& side : Sides) { for (auto& range : side.DrawRanges) { - if (!range.IsPortal) - sortedDrawList[range.PipelineID].Push(&range); - else - sortedPortalList[range.PipelineID].Push(&range); + sortedDrawList[(int)range.DrawType][range.PipelineID].Push(&range); } } @@ -862,53 +847,33 @@ void DoomLevelMesh::SortDrawLists() { for (auto& range : flat.DrawRanges) { - if (!range.IsPortal) - sortedDrawList[range.PipelineID].Push(&range); - else - sortedPortalList[range.PipelineID].Push(&range); + sortedDrawList[(int)range.DrawType][range.PipelineID].Push(&range); } } TArray indexes; - DrawList.clear(); - for (auto& it : sortedDrawList) + for (int drawType = 0; drawType < (int)LevelMeshDrawType::NumDrawTypes; drawType++) { - auto& list = DrawList[it.first]; - int listStart = indexes.Size(); - for (DrawRangeInfo* range : it.second) + DrawList[drawType].clear(); + for (auto& it : sortedDrawList[drawType]) { - int sortedStart = indexes.Size(); - int start = range->DrawIndexStart; - int count = range->DrawIndexCount; - for (int i = 0; i < count; i++) + auto& list = DrawList[drawType][it.first]; + int listStart = indexes.Size(); + for (DrawRangeInfo* range : it.second) { - indexes.Push(Mesh.DrawIndexes[start + i]); + int sortedStart = indexes.Size(); + int start = range->DrawIndexStart; + int count = range->DrawIndexCount; + for (int i = 0; i < count; i++) + { + indexes.Push(Mesh.DrawIndexes[start + i]); + } + range->DrawIndexStart = sortedStart; } - range->DrawIndexStart = sortedStart; + int listEnd = indexes.Size(); + list.Push({ listStart, listEnd }); } - int listEnd = indexes.Size(); - list.Push({ listStart, listEnd }); - } - - PortalList.clear(); - for (auto& it : sortedPortalList) - { - auto& list = PortalList[it.first]; - int listStart = indexes.Size(); - for (DrawRangeInfo* range : it.second) - { - int sortedStart = indexes.Size(); - int start = range->DrawIndexStart; - int count = range->DrawIndexCount; - for (int i = 0; i < count; i++) - { - indexes.Push(Mesh.DrawIndexes[start + i]); - } - range->DrawIndexStart = sortedStart; - } - int listEnd = indexes.Size(); - list.Push({ listStart, listEnd }); } memcpy(Mesh.DrawIndexes.Data(), indexes.Data(), indexes.Size() * sizeof(uint32_t)); @@ -978,7 +943,7 @@ int DoomLevelMesh::GetSampleDimension(uint16_t sampleDimension) return sampleDimension; } -void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent, unsigned int sectorIndex) +void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex) { for (HWFlat& flatpart : list) { @@ -986,7 +951,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state state.mVertices.Clear(); state.mIndexes.Clear(); - if (isSky) + if (drawType == LevelMeshDrawType::Portal) { state.SetEffect(EFF_PORTAL); state.EnableTexture(false); @@ -1046,7 +1011,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state GeometryAllocInfo ginfo = AllocGeometry(numVertices, numIndexes); UniformsAllocInfo uinfo = AllocUniforms(1); - Flats[sectorIndex].Geometries.Push({ ginfo, pipelineID, isSky }); + Flats[sectorIndex].Geometries.Push(ginfo); Flats[sectorIndex].Uniforms.Push(uinfo); int* surfaceIndexes = &Mesh.SurfaceIndexes[ginfo.IndexStart / 3]; @@ -1078,7 +1043,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state surf.Texture = flatpart.texture; surf.PipelineID = pipelineID; surf.PortalIndex = sectorPortals[flatpart.ceiling][flatpart.sector->Index()]; - surf.IsSky = isSky; + surf.IsSky = (drawType == LevelMeshDrawType::Portal); auto plane = info.ControlSector ? info.ControlSector->GetSecPlane(!flatpart.ceiling) : flatpart.sector->GetSecPlane(flatpart.ceiling); surf.Plane = FVector4((float)plane.Normal().X, (float)plane.Normal().Y, (float)plane.Normal().Z, -(float)plane.D); @@ -1102,7 +1067,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state { auto& vt = sub->firstline[end - 1 - i].v1; - FVector3 pt((float)vt->fX(), (float)vt->fY(), isSky ? skyZ : (float)plane.ZatPoint(vt)); + FVector3 pt((float)vt->fX(), (float)vt->fY(), (drawType == LevelMeshDrawType::Portal) ? skyZ : (float)plane.ZatPoint(vt)); FVector4 uv = textureMatrix * FVector4(pt.X * (1.0f / 64.0f), pt.Y * (-1.0f / 64.0f), 0.0f, 1.0f); FFlatVertex ffv; @@ -1163,7 +1128,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state SetSubsectorLightmap(sinfo.Index); } - AddToDrawList(Flats[sectorIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, isSky); + AddToDrawList(Flats[sectorIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, drawType); } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 7a8fca268..09f8730e6 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -32,28 +32,24 @@ struct DoomSurfaceInfo struct GeometryFreeInfo { - GeometryFreeInfo(const GeometryAllocInfo& ginfo, int pipelineID, bool isPortal) + GeometryFreeInfo(const GeometryAllocInfo& ginfo) { VertexStart = ginfo.VertexStart; VertexCount = ginfo.VertexCount; IndexStart = ginfo.IndexStart; IndexCount = ginfo.IndexCount; - PipelineID = pipelineID; - IsPortal = isPortal; } int VertexStart = 0; int VertexCount = 0; int IndexStart = 0; int IndexCount = 0; - int PipelineID = 0; - bool IsPortal = false; }; struct DrawRangeInfo { int PipelineID = 0; - bool IsPortal = false; + LevelMeshDrawType DrawType = {}; int DrawIndexStart = 0; int DrawIndexCount = 0; }; @@ -143,8 +139,8 @@ private: void SetSubsectorLightmap(int surfaceIndex); void SetSideLightmap(int surfaceIndex); - void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, bool isPortal, bool translucent, unsigned int sectorIndex); - void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, bool isSky, bool translucent, unsigned int sectorIndex); + void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex); + void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex); BBox GetBoundsFromSurface(const LevelMeshSurface& surface) const; @@ -156,7 +152,7 @@ private: int GetLightIndex(FDynamicLight* light, int portalgroup); - void AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, bool isPortal); + void AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, LevelMeshDrawType drawType); void RemoveFromDrawList(const TArray& drawRanges); void SortDrawLists(); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 245e8601f..fa70dcc04 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -432,11 +432,12 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) // draw level into depth buffer state.SetColorMask(false); state.SetCulling(Cull_CW); - state.DrawLevelMeshSurfaces(true); + state.DrawLevelMesh(LevelMeshDrawType::Opaque, true); + state.DrawLevelMesh(LevelMeshDrawType::Masked, false); // To do: properly mark wall top/bottom as opaque so we don't need this if (gl_portals) { state.SetDepthBias(1, 128); - state.DrawLevelMeshPortals(true); + state.DrawLevelMesh(LevelMeshDrawType::Portal, true); state.SetDepthBias(0, 0); } @@ -462,11 +463,12 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) int queryEnd = state.GetNextQueryIndex(); // draw opaque level so the GPU has something to do while we examine the query results - state.DrawLevelMeshSurfaces(false); + state.DrawLevelMesh(LevelMeshDrawType::Opaque, false); + //state.DrawLevelMesh(LevelMeshDrawType::Masked, false); if (!gl_portals) { state.SetDepthBias(1, 128); - state.DrawLevelMeshPortals(false); + state.DrawLevelMesh(LevelMeshDrawType::Portal, false); state.SetDepthBias(0, 0); } state.SetCulling(Cull_None); From c71261bd0fa43341efb6c066b2eb69201d69476b Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 1 Sep 2024 22:49:45 +0200 Subject: [PATCH 224/414] Forgot color write was disabled for the first draw --- src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index fa70dcc04..e112b2695 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -464,7 +464,7 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) // draw opaque level so the GPU has something to do while we examine the query results state.DrawLevelMesh(LevelMeshDrawType::Opaque, false); - //state.DrawLevelMesh(LevelMeshDrawType::Masked, false); + state.DrawLevelMesh(LevelMeshDrawType::Masked, false); if (!gl_portals) { state.SetDepthBias(1, 128); From 4ba0b47665413848161f408ef8bef861907823bd Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 1 Sep 2024 23:01:39 +0200 Subject: [PATCH 225/414] Dont draw sectorstack atm --- src/common/rendering/hwrenderer/data/hw_mesh.cpp | 1 - .../rendering/hwrenderer/data/hw_meshbuilder.cpp | 1 - .../rendering/hwrenderer/data/hw_meshbuilder.h | 1 - src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 14 +++++++++++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.cpp b/src/common/rendering/hwrenderer/data/hw_mesh.cpp index 46036c8ba..b66793dcf 100644 --- a/src/common/rendering/hwrenderer/data/hw_mesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_mesh.cpp @@ -35,7 +35,6 @@ void Mesh::Draw(FRenderState& renderstate) origState.applyData.RenderStyle = renderstate.mRenderStyle; origState.applyData.SpecialEffect = renderstate.mSpecialEffect; origState.applyData.TextureEnabled = renderstate.mTextureEnabled; - origState.applyData.AlphaThreshold = renderstate.mSurfaceUniforms.uAlphaThreshold; origState.applyData.FogEnabled = renderstate.mFogEnabled; origState.applyData.BrightmapEnabled = renderstate.mBrightmapEnabled; origState.applyData.TextureClamp = renderstate.mTextureClamp; diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index 6df23029e..9030656b6 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -63,7 +63,6 @@ void MeshBuilder::Apply() state.applyData.RenderStyle = mRenderStyle; state.applyData.SpecialEffect = mSpecialEffect; state.applyData.TextureEnabled = mTextureEnabled; - state.applyData.AlphaThreshold = mSurfaceUniforms.uAlphaThreshold; state.applyData.DepthFunc = mDepthFunc; state.applyData.FogEnabled = mFogEnabled; state.applyData.FogColor = (mFogColor & 0xffffff) == 0; diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h index dbe095e0f..db32dfe06 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h @@ -12,7 +12,6 @@ struct MeshApplyData FRenderStyle RenderStyle; int SpecialEffect; int TextureEnabled; - float AlphaThreshold; int DepthFunc; int FogEnabled; int FogColor; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index e112b2695..6ffd01147 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -446,13 +446,21 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) state.SetDepthMask(false); state.EnableTexture(false); state.SetEffect(EFF_PORTAL); + + if (!gl_portals) + state.SetColorMask(true); // For debugging where the query is + for (HWWall* wall : portals) { state.BeginQuery(); - wall->MakeVertices(state, false); - wall->RenderWall(state, HWWall::RWF_BLANK); - wall->vertcount = 0; + // sector portals not handled yet by PutWallPortal + if (wall->portaltype != PORTALTYPE_SECTORSTACK) + { + wall->MakeVertices(state, false); + wall->RenderWall(state, HWWall::RWF_BLANK); + wall->vertcount = 0; + } state.EndQuery(); } From 4b0d4a210a47f48862efcf1b6ff1b4e861a438dc Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 1 Sep 2024 23:47:16 +0200 Subject: [PATCH 226/414] Remove unused class --- src/CMakeLists.txt | 1 - .../rendering/hwrenderer/data/hw_mesh.cpp | 111 ------------------ .../rendering/hwrenderer/data/hw_mesh.h | 20 ---- .../hwrenderer/data/hw_meshbuilder.cpp | 33 ------ .../hwrenderer/data/hw_meshbuilder.h | 2 - 5 files changed, 167 deletions(-) delete mode 100644 src/common/rendering/hwrenderer/data/hw_mesh.cpp delete mode 100644 src/common/rendering/hwrenderer/data/hw_mesh.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7c43b850b..6d62f05ab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1122,7 +1122,6 @@ set (PCH_SOURCES common/rendering/hwrenderer/data/hw_collision.cpp common/rendering/hwrenderer/data/hw_levelmesh.cpp common/rendering/hwrenderer/data/hw_meshbuilder.cpp - common/rendering/hwrenderer/data/hw_mesh.cpp common/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp common/rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.cpp b/src/common/rendering/hwrenderer/data/hw_mesh.cpp deleted file mode 100644 index b66793dcf..000000000 --- a/src/common/rendering/hwrenderer/data/hw_mesh.cpp +++ /dev/null @@ -1,111 +0,0 @@ - -#include "hw_mesh.h" -#include "v_video.h" -#include "cmdlib.h" - -#define USE_MESH_VERTEX_BUFFER - -void Mesh::Draw(FRenderState& renderstate) -{ -#ifdef USE_MESH_VERTEX_BUFFER - - if (!mVertexBuffer && mVertices.Size() != 0) - { - static const FVertexBufferAttribute format[] = - { - { 0, VATTR_VERTEX, VFmt_Float4, (int)myoffsetof(FFlatVertex, x) }, - { 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(FFlatVertex, u) }, - { 0, VATTR_LIGHTMAP, VFmt_Float2, (int)myoffsetof(FFlatVertex, lu) }, - }; - mVertexBuffer.reset(screen->CreateVertexBuffer(1, 3, sizeof(FFlatVertex), format)); - mVertexBuffer->SetData(mVertices.Size() * sizeof(FFlatVertex), mVertices.Data(), BufferUsageType::Static); - } - - if (mVertexBuffer) - renderstate.SetVertexBuffer(mVertexBuffer.get(), 0, 0); - -#else - - auto pair = renderstate.AllocVertices(mVertices.Size()); - memcpy(pair.first, mVertices.Data(), mVertices.Size() * sizeof(FFlatVertex)); - -#endif - - MeshApplyState origState; - origState.applyData.RenderStyle = renderstate.mRenderStyle; - origState.applyData.SpecialEffect = renderstate.mSpecialEffect; - origState.applyData.TextureEnabled = renderstate.mTextureEnabled; - origState.applyData.FogEnabled = renderstate.mFogEnabled; - origState.applyData.BrightmapEnabled = renderstate.mBrightmapEnabled; - origState.applyData.TextureClamp = renderstate.mTextureClamp; - origState.applyData.TextureMode = renderstate.mTextureMode; - origState.applyData.TextureModeFlags = renderstate.mTextureModeFlags; - origState.surfaceUniforms = renderstate.mSurfaceUniforms; - origState.material = renderstate.mMaterial; - origState.textureMatrix.loadIdentity(); - - int applyIndex = -1; - int depthFunc = -1; - for (const MeshDrawCommand& cmd : mDraws) - { - bool apply = applyIndex != cmd.ApplyIndex; - if (apply) - { - int newDepthFunc = mApplys[cmd.ApplyIndex].applyData.DepthFunc; - if (depthFunc != newDepthFunc) - { - depthFunc = newDepthFunc; - renderstate.SetDepthFunc(depthFunc); - } - - applyIndex = cmd.ApplyIndex; - Apply(renderstate, mApplys[cmd.ApplyIndex]); - } - -#ifdef USE_MESH_VERTEX_BUFFER - renderstate.Draw(cmd.DrawType, cmd.Start, cmd.Count, apply); -#else - renderstate.Draw(cmd.DrawType, pair.second + cmd.Start, cmd.Count, apply); -#endif - } - -#ifdef USE_MESH_VERTEX_BUFFER - if (mVertexBuffer) - renderstate.SetFlatVertexBuffer(); -#endif - - for (const MeshDrawCommand& cmd : mIndexedDraws) - { - bool apply = applyIndex != cmd.ApplyIndex; - if (apply) - { - int newDepthFunc = mApplys[cmd.ApplyIndex].applyData.DepthFunc; - if (depthFunc != newDepthFunc) - { - depthFunc = newDepthFunc; - renderstate.SetDepthFunc(depthFunc); - } - - applyIndex = cmd.ApplyIndex; - Apply(renderstate, mApplys[cmd.ApplyIndex]); - } - renderstate.DrawIndexed(cmd.DrawType, cmd.Start, cmd.Count, apply); - } - - Apply(renderstate, origState); -} - -void Mesh::Apply(FRenderState& renderstate, const MeshApplyState& state) -{ - renderstate.mRenderStyle = state.applyData.RenderStyle; - renderstate.mSpecialEffect = state.applyData.SpecialEffect; - renderstate.mTextureEnabled = state.applyData.TextureEnabled; - renderstate.mFogEnabled = state.applyData.FogEnabled; - renderstate.mBrightmapEnabled = state.applyData.BrightmapEnabled; - renderstate.mTextureClamp = state.applyData.TextureClamp; - renderstate.mTextureMode = state.applyData.TextureMode; - renderstate.mTextureModeFlags = state.applyData.TextureModeFlags; - renderstate.mSurfaceUniforms = state.surfaceUniforms; - renderstate.mMaterial = state.material; - renderstate.SetTextureMatrix(state.textureMatrix); -} diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.h b/src/common/rendering/hwrenderer/data/hw_mesh.h deleted file mode 100644 index 3c6313574..000000000 --- a/src/common/rendering/hwrenderer/data/hw_mesh.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "hw_meshbuilder.h" - -class Mesh -{ -public: - void Draw(FRenderState& renderstate); - -private: - void Apply(FRenderState& renderstate, const MeshApplyState& apply); - - TArray mApplys; - TArray mDraws; - TArray mIndexedDraws; - TArray mVertices; - std::unique_ptr mVertexBuffer; - - friend class MeshBuilder; -}; diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index 9030656b6..d36f33c5f 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -1,6 +1,5 @@ #include "hw_meshbuilder.h" -#include "hw_mesh.h" #include "v_video.h" MeshBuilder::MeshBuilder() @@ -79,38 +78,6 @@ void MeshBuilder::Apply() mDrawLists = &mSortedLists[state]; } -std::unique_ptr MeshBuilder::Create() -{ - if (mSortedLists.empty()) - return {}; - - auto mesh = std::make_unique(); - - int applyIndex = 0; - for (auto& it : mSortedLists) - { - mesh->mApplys.Push(it.first); - for (MeshDrawCommand& command : it.second.mDraws) - { - command.ApplyIndex = applyIndex; - mesh->mDraws.Push(command); - } - for (MeshDrawCommand& command : it.second.mIndexedDraws) - { - command.ApplyIndex = applyIndex; - mesh->mIndexedDraws.Push(command); - } - applyIndex++; - } - - // To do: the various mesh layers have to share the vertex buffer since some vertex allocations happen at the Process stage - //mesh->mVertices = std::move(mVertices); - //mVertices.Clear(); - mesh->mVertices = mVertices; - - return mesh; -} - std::pair MeshBuilder::AllocVertices(unsigned int count) { unsigned int offset = mVertices.Reserve(count); diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h index db32dfe06..eca48c522 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h @@ -105,8 +105,6 @@ public: void EnableStencil(bool on) override { } void EnableDepthTest(bool on) override { } - std::unique_ptr Create(); - struct DrawLists { TArray mDraws; From abd869a7e1dc30a49c070be569cecc1cc54b99e9 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 2 Sep 2024 14:08:26 +0800 Subject: [PATCH 227/414] We don't have GLES2 --- CMakeLists.txt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ccc1806e..432c44df7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -225,7 +225,6 @@ if( ${TARGET_ARCHITECTURE} MATCHES "x86_64" ) endif() option (HAVE_VULKAN "Enable Vulkan support" ON) -option (HAVE_GLES2 "Enable GLES2 support" ON) # no, we're not using external asmjit for now, we made too many modifications to our's. # if the asmjit author uses our changes then we'll update this. @@ -248,10 +247,6 @@ if( MSVC ) set( ALL_C_FLAGS "${ALL_C_FLAGS} /DHAVE_VULKAN" ) endif() - if ( HAVE_GLES2 ) - set( ALL_C_FLAGS "${ALL_C_FLAGS} /DHAVE_GLES2" ) - endif() - # Use SSE 2 as minimum always as the true color drawers needs it for __vectorcall #set( ALL_C_FLAGS "${ALL_C_FLAGS} /arch:SSE2") # This is already the default @@ -281,10 +276,6 @@ else() set( ALL_C_FLAGS "${ALL_C_FLAGS} -DHAVE_VULKAN" ) endif() - if ( HAVE_GLES2 ) - set( ALL_C_FLAGS "${ALL_C_FLAGS} -DHAVE_GLES2" ) - endif() - if ( UNIX ) include(CheckSymbolExists) check_symbol_exists( "fts_set" "sys/types.h;sys/stat.h;fts.h" HAVE_FTS ) From a6b0d461553ad71f051adf92b2a73937f3452ce7 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 2 Sep 2024 15:21:13 +0800 Subject: [PATCH 228/414] GZD survey is irrelevant to this project --- src/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6d62f05ab..c7c431476 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -539,11 +539,11 @@ add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) -option( SEND_ANON_STATS "Enable sending of anonymous hardware statistics" ON ) +#option( SEND_ANON_STATS "Enable sending of anonymous hardware statistics" OFF ) -if( NOT SEND_ANON_STATS ) - add_definitions( -DNO_SEND_STATS ) -endif() +#if( NOT SEND_ANON_STATS ) +# add_definitions( -DNO_SEND_STATS ) +#endif() # Project files should be aware of the header files. We can GLOB these since # there's generally a new cpp for every header so this file will get changed From e836ff4cccead86e6cf460a46eb6d8440f76b1f8 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 2 Sep 2024 15:28:07 +0800 Subject: [PATCH 229/414] Woops --- src/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c7c431476..315a02798 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -539,11 +539,11 @@ add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) -#option( SEND_ANON_STATS "Enable sending of anonymous hardware statistics" OFF ) +option( SEND_ANON_STATS "Enable sending of anonymous hardware statistics" OFF ) -#if( NOT SEND_ANON_STATS ) -# add_definitions( -DNO_SEND_STATS ) -#endif() +if( NOT SEND_ANON_STATS ) + add_definitions( -DNO_SEND_STATS ) +endif() # Project files should be aware of the header files. We can GLOB these since # there's generally a new cpp for every header so this file will get changed From d77b9c1e2ba869b61d0110dad931d1cfce40cebd Mon Sep 17 00:00:00 2001 From: dpjudas Date: Tue, 3 Sep 2024 01:09:50 +0200 Subject: [PATCH 230/414] Include 3d floors in level mesh limits --- src/rendering/hwrenderer/doom_levelmesh.cpp | 41 +++++++++++++++++---- src/rendering/hwrenderer/doom_levelmesh.h | 2 + 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 6f6a93fa7..7e1bfc46c 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -161,13 +161,7 @@ EXTERN_CVAR(Float, lm_scale); DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) { - // Try to estimate what the worst case memory needs are for the level - LevelMeshLimits limits; - limits.MaxVertices = (doomMap.vertexes.Size() * 10) * 2; - limits.MaxSurfaces = (doomMap.sides.Size() * 3 + doomMap.subsectors.Size() * 2) * 2; - limits.MaxUniforms = (doomMap.sides.Size() * 3 + doomMap.sectors.Size() * 2) * 2; - limits.MaxIndexes = limits.MaxVertices * 10; - Reset(limits); + SetLimits(doomMap); SunColor = doomMap.SunColor; // TODO keep only one copy? SunDirection = doomMap.SunDirection; @@ -187,6 +181,39 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) SortDrawLists(); } +void DoomLevelMesh::SetLimits(FLevelLocals& doomMap) +{ + // Try to estimate what the worst case memory needs are for the level + LevelMeshLimits limits; + + for (const sector_t& sector : doomMap.sectors) + { + unsigned int ffloors = sector.e ? sector.e->XFloor.ffloors.Size() : 0; + + limits.MaxVertices += sector.Lines.Size() * 4 * (3 + ffloors); + limits.MaxIndexes += sector.Lines.Size() * 6 * (3 + ffloors); + limits.MaxSurfaces += sector.Lines.Size() * (3 + ffloors); + limits.MaxUniforms += sector.Lines.Size() * (3 + ffloors); + + limits.MaxSurfaces += sector.subsectorcount * (2 + ffloors * 2); + limits.MaxUniforms += 2 + ffloors * 2; + + for (int i = 0, count = sector.subsectorcount; i < count; i++) + { + limits.MaxVertices += sector.subsectors[i]->numlines; + limits.MaxIndexes += sector.subsectors[i]->numlines * 3; + } + } + + // Double up to leave room for fragmentation + limits.MaxVertices *= 2; + limits.MaxSurfaces *= 2; + limits.MaxUniforms *= 2; + limits.MaxIndexes *= 2; + + Reset(limits); +} + void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) { LastFrameStats = CurFrameStats; diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 09f8730e6..d8eacde39 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -122,6 +122,8 @@ public: Stats LastFrameStats, CurFrameStats; private: + void SetLimits(FLevelLocals& doomMap); + void CreateSurfaces(FLevelLocals& doomMap); void CreateLightList(FLevelLocals& doomMap, int surfaceIndex); From db5f47d14ff809f54c268c9c4b43852a5d4cb496 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 4 Sep 2024 02:26:46 +0200 Subject: [PATCH 231/414] Fix SSAO not working in gl_levelmesh --- src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp | 2 -- src/common/rendering/vulkan/vk_renderdevice.cpp | 4 ---- src/common/rendering/vulkan/vk_renderstate.cpp | 7 +++++++ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index d36f33c5f..a3cdcc74e 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -73,8 +73,6 @@ void MeshBuilder::Apply() state.material = mMaterial; state.textureMatrix = mTextureMatrix; - state.surfaceUniforms.uVertexNormal = FVector4(0.0f, 0.0f, 0.0f, 0.0f); // Grr, this should be part of the vertex!! - mDrawLists = &mSortedLists[state]; } diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 9898b2a9b..3303c78b6 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -739,10 +739,6 @@ int VulkanRenderDevice::GetLevelMeshPipelineID(const MeshApplyData& applyData, c pipelineKey.ShaderKey.LightMode = 1; // Software } - pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; - pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows == 2; - - pipelineKey.ShaderKey.GBufferPass = false; pipelineKey.ShaderKey.UseLevelMesh = true; for (unsigned int i = 0, count = levelMeshPipelineKeys.Size(); i < count; i++) diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index f5bcfbc64..478036583 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -898,7 +898,13 @@ void VkRenderState::GetQueryResults(int queryStart, int queryCount, TArray void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader) { + // Global state that don't require rebuilding the mesh pipelineKey.ShaderKey.NoFragmentShader = noFragmentShader; + pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; + pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows == 2; + pipelineKey.ShaderKey.GBufferPass = mRenderTarget.DrawBuffers > 1; + + // State overridden by the renderstate drawing the mesh pipelineKey.DepthTest = mDepthTest; pipelineKey.DepthWrite = mDepthTest && mDepthWrite; pipelineKey.DepthClamp = mDepthClamp; @@ -909,6 +915,7 @@ void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip pipelineKey.CullMode = mCullMode; if (!mTextureEnabled) pipelineKey.ShaderKey.EffectState = SHADER_NoTexture; + mPipelineKey = pipelineKey; PushConstants pushConstants = {}; From 4655b02f06163cad0625742b8dd526a7e27412f1 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 5 Sep 2024 00:15:59 +0200 Subject: [PATCH 232/414] Fix using wrong surface for the extra BLAS structures for trace hits Add gl_raytrace for ray tracing the level mesh --- .../hwrenderer/data/hw_renderstate.h | 2 + src/common/rendering/vulkan/vk_levelmesh.cpp | 213 ++++++++++++++++++ src/common/rendering/vulkan/vk_levelmesh.h | 35 +++ .../rendering/vulkan/vk_renderstate.cpp | 18 ++ src/common/rendering/vulkan/vk_renderstate.h | 2 + src/rendering/hwrenderer/hw_entrypoint.cpp | 18 +- .../shaders/lightmap/binding_viewer.glsl | 94 ++++++++ .../static/shaders/lightmap/frag_viewer.glsl | 59 +++++ .../shaders/lightmap/polyfill_rayquery.glsl | 4 +- .../static/shaders/lightmap/vert_viewer.glsl | 21 ++ 10 files changed, 464 insertions(+), 2 deletions(-) create mode 100644 wadsrc/static/shaders/lightmap/binding_viewer.glsl create mode 100644 wadsrc/static/shaders/lightmap/frag_viewer.glsl create mode 100644 wadsrc/static/shaders/lightmap/vert_viewer.glsl diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 63b57d5e3..18f138682 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -704,6 +704,8 @@ public: virtual void EndQuery() { } virtual void GetQueryResults(int start, int count, TArray& results) { } + virtual void RaytraceScene(const FVector3& cameraPos, const VSMatrix& viewToWorld, float fovy, float aspect) { } + friend class Mesh; }; diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index fd3dc6d2e..9b79e9b80 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -24,13 +24,17 @@ #include "zvulkan/vulkanbuilders.h" #include "vulkan/vk_renderdevice.h" #include "vulkan/commands/vk_commandbuffer.h" +#include "vulkan/descriptorsets/vk_descriptorset.h" +#include "vulkan/pipelines/vk_renderpass.h" #include "hw_levelmesh.h" #include "hw_material.h" #include "texturemanager.h" +#include "cmdlib.h" VkLevelMesh::VkLevelMesh(VulkanRenderDevice* fb) : fb(fb) { useRayQuery = fb->IsRayQueryEnabled(); + CreateViewerObjects(); SetLevelMesh(nullptr); } @@ -196,6 +200,24 @@ void VkLevelMesh::BeginFrame() .AddMemory(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT) .Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); } + + WriteDescriptors write; + write.AddBuffer(Viewer.DescriptorSet.get(), 0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetSurfaceIndexBuffer()); + write.AddBuffer(Viewer.DescriptorSet.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetSurfaceBuffer()); + write.AddBuffer(Viewer.DescriptorSet.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetLightBuffer()); + write.AddBuffer(Viewer.DescriptorSet.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetLightIndexBuffer()); + write.AddBuffer(Viewer.DescriptorSet.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetPortalBuffer()); + if (useRayQuery) + { + write.AddAccelerationStructure(Viewer.DescriptorSet.get(), 5, GetAccelStruct()); + } + else + { + write.AddBuffer(Viewer.DescriptorSet.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetNodeBuffer()); + } + write.AddBuffer(Viewer.DescriptorSet.get(), 6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetVertexBuffer()); + write.AddBuffer(Viewer.DescriptorSet.get(), 7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, GetIndexBuffer()); + write.Execute(fb->GetDevice()); } void VkLevelMesh::UploadMeshes() @@ -336,6 +358,7 @@ VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(bool preferFastBuild, int indexOffset, .Create(fb->GetDevice()); blas.DeviceAddress = blas.AccelStruct->GetDeviceAddress(); + blas.InstanceCustomIndex = indexOffset / 3; buildInfo.dstAccelerationStructure = blas.AccelStruct->accelstruct; buildInfo.scratchData.deviceAddress = blas.ScratchBuffer->GetDeviceAddress(); @@ -452,6 +475,7 @@ void VkLevelMesh::UploadTLASInstanceBuffer() auto data = (uint8_t*)TopLevelAS.TransferBuffer->Map(0, sizeof(VkAccelerationStructureInstanceKHR) * DynamicBLAS.size()); for (BLAS& blas : DynamicBLAS) { + instance.instanceCustomIndex = blas.InstanceCustomIndex; instance.accelerationStructureReference = blas.DeviceAddress; memcpy(data, &instance, sizeof(VkAccelerationStructureInstanceKHR)); @@ -462,6 +486,195 @@ void VkLevelMesh::UploadTLASInstanceBuffer() fb->GetCommands()->GetTransferCommands()->copyBuffer(TopLevelAS.TransferBuffer.get(), TopLevelAS.InstanceBuffer.get()); } +void VkLevelMesh::RaytraceScene(const VkRenderPassKey& renderPassKey, VulkanCommandBuffer* commands, const FVector3& cameraPos, const VSMatrix& viewToWorld, float fovy, float aspect) +{ + auto& pipeline = Viewer.Pipeline[renderPassKey]; + if (!pipeline) + { + GraphicsPipelineBuilder builder; + builder.RenderPass(fb->GetRenderPassManager()->GetRenderPass(renderPassKey)->GetRenderPass(0)); + builder.Layout(Viewer.PipelineLayout.get()); + builder.Topology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP); + builder.AddVertexShader(Viewer.VertexShader.get()); + builder.AddFragmentShader(Viewer.FragmentShader.get()); + builder.AddDynamicState(VK_DYNAMIC_STATE_VIEWPORT); + builder.AddDynamicState(VK_DYNAMIC_STATE_SCISSOR); + builder.RasterizationSamples((VkSampleCountFlagBits)renderPassKey.Samples); + builder.DebugName("Viewer.Pipeline"); + pipeline = builder.Create(fb->GetDevice()); + } + + /* + RenderPassBegin() + .RenderPass(Viewer.RenderPass.get()) + .Framebuffer(Framebuffers[imageIndex].get()) + .RenderArea(0, 0, CurrentWidth, CurrentHeight) + .AddClearColor(0.0f, 0.0f, 0.0f, 1.0f) + .AddClearDepth(1.0f) + .Execute(commands); + + VkViewport viewport = {}; + viewport.width = (float)CurrentWidth; + viewport.height = (float)CurrentHeight; + viewport.maxDepth = 1.0f; + commands->setViewport(0, 1, &viewport); + + VkRect2D scissor = {}; + scissor.extent.width = CurrentWidth; + scissor.extent.height = CurrentHeight; + commands->setScissor(0, 1, &scissor); + */ + + float f = 1.0f / std::tan(fovy * (pi::pif() / 360.0f)); + + ViewerPushConstants pushconstants; + pushconstants.ViewToWorld = viewToWorld; + pushconstants.CameraPos = cameraPos; + pushconstants.ProjX = f / aspect; + pushconstants.ProjY = f; + pushconstants.SunDir = FVector3(Mesh->SunDirection.X, Mesh->SunDirection.Z, Mesh->SunDirection.Y); + pushconstants.SunColor = Mesh->SunColor; + pushconstants.SunIntensity = 1.0f; + + commands->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, Viewer.PipelineLayout.get(), 0, Viewer.DescriptorSet.get()); + commands->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, Viewer.PipelineLayout.get(), 1, fb->GetDescriptorSetManager()->GetBindlessSet()); + commands->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.get()); + commands->pushConstants(Viewer.PipelineLayout.get(), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(ViewerPushConstants), &pushconstants); + commands->draw(4, 1, 0, 0); + + //commands->endRenderPass(); +} + +void VkLevelMesh::CreateViewerObjects() +{ + DescriptorSetLayoutBuilder builder; + builder.AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + if (useRayQuery) + { + builder.AddBinding(5, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + } + else + { + builder.AddBinding(5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + } + builder.AddBinding(6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.DebugName("Viewer.DescriptorSetLayout"); + Viewer.DescriptorSetLayout = builder.Create(fb->GetDevice()); + + Viewer.DescriptorPool = DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1) + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 6) + .MaxSets(1) + .DebugName("Viewer.DescriptorPool") + .Create(fb->GetDevice()); + + Viewer.DescriptorSet = Viewer.DescriptorPool->allocate(Viewer.DescriptorSetLayout.get()); + Viewer.DescriptorSet->SetDebugName("raytrace.descriptorSet1"); + + std::string versionBlock = R"( + #version 460 + #extension GL_GOOGLE_include_directive : enable + #extension GL_EXT_nonuniform_qualifier : enable + )"; + + if (useRayQuery) + { + versionBlock += "#extension GL_EXT_ray_query : require\r\n"; + versionBlock += "#define USE_RAYQUERY\r\n"; + } + + auto onIncludeLocal = [](std::string headerName, std::string includerName, size_t depth) { return OnInclude(headerName.c_str(), includerName.c_str(), depth, false); }; + auto onIncludeSystem = [](std::string headerName, std::string includerName, size_t depth) { return OnInclude(headerName.c_str(), includerName.c_str(), depth, true); }; + + Viewer.VertexShader = ShaderBuilder() + .Type(ShaderType::Vertex) + .AddSource("versionblock", versionBlock) + .AddSource("vert_viewer.glsl", LoadPrivateShaderLump("shaders/lightmap/vert_viewer.glsl").GetChars()) + .OnIncludeLocal(onIncludeLocal) + .OnIncludeSystem(onIncludeSystem) + .DebugName("Viewer.VertexShader") + .Create("vertex", fb->GetDevice()); + + Viewer.FragmentShader = ShaderBuilder() + .Type(ShaderType::Fragment) + .AddSource("versionblock", versionBlock) + .AddSource("frag_viewer.glsl", LoadPrivateShaderLump("shaders/lightmap/frag_viewer.glsl").GetChars()) + .OnIncludeLocal(onIncludeLocal) + .OnIncludeSystem(onIncludeSystem) + .DebugName("Viewer.FragmentShader") + .Create("vertex", fb->GetDevice()); + + Viewer.PipelineLayout = PipelineLayoutBuilder() + .AddSetLayout(Viewer.DescriptorSetLayout.get()) + .AddSetLayout(fb->GetDescriptorSetManager()->GetBindlessLayout()) + .AddPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(ViewerPushConstants)) + .DebugName("Viewer.PipelineLayout") + .Create(fb->GetDevice()); + + /* + Viewer.RenderPass = RenderPassBuilder() + .AddAttachment(VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) + .AddSubpass() + .AddSubpassColorAttachmentRef(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) + .Create(fb->GetDevice()); + + Viewer.Pipeline = GraphicsPipelineBuilder() + .RenderPass(Viewer.RenderPass.get()) + .Layout(Viewer.PipelineLayout.get()) + .Topology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP) + .AddVertexShader(Viewer.VertexShader.get()) + .AddFragmentShader(Viewer.FragmentShader.get()) + .AddDynamicState(VK_DYNAMIC_STATE_VIEWPORT) + .AddDynamicState(VK_DYNAMIC_STATE_SCISSOR) + .DebugName("Viewer.Pipeline") + .Create(fb->GetDevice()); + */ +} + +FString VkLevelMesh::LoadPrivateShaderLump(const char* lumpname) +{ + int lump = fileSystem.CheckNumForFullName(lumpname, 0); + if (lump == -1) I_Error("Unable to load '%s'", lumpname); + return GetStringFromLump(lump); +} + +FString VkLevelMesh::LoadPublicShaderLump(const char* lumpname) +{ + int lump = fileSystem.CheckNumForFullName(lumpname, 0); + if (lump == -1) lump = fileSystem.CheckNumForFullName(lumpname); + if (lump == -1) I_Error("Unable to load '%s'", lumpname); + return GetStringFromLump(lump); +} + +ShaderIncludeResult VkLevelMesh::OnInclude(FString headerName, FString includerName, size_t depth, bool system) +{ + if (depth > 8) + I_Error("Too much include recursion!"); + + FString includeguardname; + includeguardname << "_HEADERGUARD_" << headerName.GetChars(); + includeguardname.ReplaceChars("/\\.", '_'); + + FString code; + code << "#ifndef " << includeguardname.GetChars() << "\n"; + code << "#define " << includeguardname.GetChars() << "\n"; + code << "#line 1\n"; + + if (system) + code << LoadPrivateShaderLump(headerName.GetChars()).GetChars() << "\n"; + else + code << LoadPublicShaderLump(headerName.GetChars()).GetChars() << "\n"; + + code << "#endif\n"; + + return ShaderIncludeResult(headerName.GetChars(), code.GetChars()); +} + ///////////////////////////////////////////////////////////////////////////// VkLevelMeshUploader::VkLevelMeshUploader(VkLevelMesh* mesh) : Mesh(mesh) diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index 9bdad073e..1d8e8382a 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -4,8 +4,11 @@ #include "zvulkan/vulkanobjects.h" #include "hw_levelmesh.h" #include "common/utility/matrix.h" +#include class VulkanRenderDevice; +class ShaderIncludeResult; +class VkRenderPassKey; struct CollisionNodeBufferHeader { @@ -62,6 +65,17 @@ struct LightInfo float Padding3; }; +struct ViewerPushConstants +{ + VSMatrix ViewToWorld; + FVector3 CameraPos; + float ProjX; + FVector3 SunDir; + float ProjY; + FVector3 SunColor; + float SunIntensity; +}; + static_assert(sizeof(LightInfo) == sizeof(float) * 20); class VkLevelMesh @@ -72,6 +86,8 @@ public: void SetLevelMesh(LevelMesh* mesh); void BeginFrame(); + void RaytraceScene(const VkRenderPassKey& renderPassKey, VulkanCommandBuffer* commands, const FVector3& cameraPos, const VSMatrix& viewToWorld, float fovy, float aspect); + VulkanAccelerationStructure* GetAccelStruct() { return TopLevelAS.AccelStruct.get(); } VulkanBuffer* GetVertexBuffer() { return VertexBuffer.get(); } VulkanBuffer* GetUniformIndexBuffer() { return UniformIndexBuffer.get(); } @@ -94,6 +110,7 @@ private: std::unique_ptr AccelStructBuffer; std::unique_ptr AccelStruct; VkDeviceAddress DeviceAddress = 0; + int InstanceCustomIndex = 0; bool NeedsUpdate = false; }; @@ -109,6 +126,12 @@ private: BLAS CreateBLAS(bool preferFastBuild, int indexOffset, int indexCount); + void CreateViewerObjects(); + + static FString LoadPrivateShaderLump(const char* lumpname); + static FString LoadPublicShaderLump(const char* lumpname); + static ShaderIncludeResult OnInclude(FString headerName, FString includerName, size_t depth, bool system); + VulkanRenderDevice* fb = nullptr; bool useRayQuery = true; @@ -142,6 +165,18 @@ private: std::unique_ptr AccelStruct; } TopLevelAS; + struct + { + std::unique_ptr DescriptorSetLayout; + std::unique_ptr DescriptorPool; + std::unique_ptr DescriptorSet; + std::unique_ptr VertexShader; + std::unique_ptr FragmentShader; + //std::unique_ptr RenderPass; + std::unique_ptr PipelineLayout; + std::map> Pipeline; + } Viewer; + friend class VkLevelMeshUploader; }; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 478036583..e7836519d 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -829,6 +829,24 @@ void VkRenderState::BeginRenderPass(VulkanCommandBuffer *cmdbuffer) mClearTargets = 0; } +void VkRenderState::RaytraceScene(const FVector3& cameraPos, const VSMatrix& viewToWorld, float fovy, float aspect) +{ + ApplyMatrices(); + ApplyRenderPass(DT_Triangles); + ApplyScissor(); + ApplyViewport(); + ApplyStencilRef(); + ApplyDepthBias(); + mNeedApply = true; + + VkRenderPassKey key = {}; + key.DrawBufferFormat = mRenderTarget.Format; + key.Samples = mRenderTarget.Samples; + key.DrawBuffers = mRenderTarget.DrawBuffers; + key.DepthStencil = !!mRenderTarget.DepthStencil; + fb->GetLevelMesh()->RaytraceScene(key, mCommandBuffer, cameraPos, viewToWorld, fovy, aspect); +} + void VkRenderState::ApplyLevelMesh() { ApplyMatrices(); diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index 9cf1fdb5d..76d2efab0 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -63,6 +63,8 @@ public: void EndQuery() override; void GetQueryResults(int start, int count, TArray& results) override; + void RaytraceScene(const FVector3& cameraPos, const VSMatrix& viewToWorld, float fovy, float aspect) override; + // Worker threads void FlushCommands() override { EndRenderPass(); } diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index 8a2a2bc8b..bc216dbb7 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -54,6 +54,8 @@ EXTERN_CVAR(Bool, cl_capfps) EXTERN_CVAR(Float, r_visibility) EXTERN_CVAR(Bool, gl_bandedswlight) +CVAR(Bool, gl_raytrace, false, 0/*CVAR_ARCHIVE | CVAR_GLOBALCONFIG*/) + extern bool NoInterpolateView; static SWSceneDrawer *swdrawer; @@ -174,7 +176,21 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou vp.Pos += eye.GetViewShift(vp.HWAngles.Yaw.Degrees()); di->SetupView(RenderState, vp.Pos.X, vp.Pos.Y, vp.Pos.Z, false, false); - di->ProcessScene(toscreen, *screen->RenderState()); + if (gl_raytrace) + { + VSMatrix viewToWorld; + di->VPUniforms.mViewMatrix.inverseMatrix(viewToWorld); + + auto DEG2RAD = [](float deg) { return deg * float(M_PI / 180.0); }; + auto RAD2DEG = [](float rad) { return rad * float(180. / M_PI); }; + float fovy = (float)(2 * RAD2DEG(atan(tan(DEG2RAD(fov) / 2) / fovratio))); + + RenderState.RaytraceScene(FVector3(vp.Pos.X, vp.Pos.Z, vp.Pos.Y), viewToWorld, fovy, ratio); + } + else + { + di->ProcessScene(toscreen, RenderState); + } if (mainview) { diff --git a/wadsrc/static/shaders/lightmap/binding_viewer.glsl b/wadsrc/static/shaders/lightmap/binding_viewer.glsl new file mode 100644 index 000000000..8701703db --- /dev/null +++ b/wadsrc/static/shaders/lightmap/binding_viewer.glsl @@ -0,0 +1,94 @@ + +struct SurfaceInfo +{ + vec3 Normal; + float Sky; + uint PortalIndex; + int TextureIndex; + float Alpha; + float Padding0; + uint LightStart; + uint LightEnd; + uint Padding1; + uint Padding2; +}; + +struct PortalInfo +{ + mat4 Transformation; +}; + +struct LightInfo +{ + vec3 Origin; + float Padding0; + vec3 RelativeOrigin; + float Padding1; + float Radius; + float Intensity; + float InnerAngleCos; + float OuterAngleCos; + vec3 SpotDir; + float SoftShadowRadius; + vec3 Color; + float Padding3; +}; + +layout(set = 0, binding = 0, std430) buffer SurfaceIndexBuffer { uint surfaceIndices[]; }; +layout(set = 0, binding = 1, std430) buffer SurfaceBuffer { SurfaceInfo surfaces[]; }; +layout(set = 0, binding = 2, std430) buffer LightBuffer { LightInfo lights[]; }; +layout(set = 0, binding = 3, std430) buffer LightIndexBuffer { int lightIndexes[]; }; +layout(set = 0, binding = 4, std430) buffer PortalBuffer { PortalInfo portals[]; }; + +#if defined(USE_RAYQUERY) + +layout(set = 0, binding = 5) uniform accelerationStructureEXT acc; + +#else + +struct CollisionNode +{ + vec3 center; + float padding1; + vec3 extents; + float padding2; + int left; + int right; + int element_index; + int padding3; +}; + +layout(set = 0, binding = 5, std430) buffer NodeBuffer +{ + int nodesRoot; + int nodebufferPadding1; + int nodebufferPadding2; + int nodebufferPadding3; + CollisionNode nodes[]; +}; + +#endif + +struct SurfaceVertex // Note: this must always match the FFlatVertex struct +{ + vec3 pos; + float lindex; + vec2 uv; + vec2 luv; +}; + +layout(set = 0, binding = 6, std430) buffer VertexBuffer { SurfaceVertex vertices[]; }; +layout(set = 0, binding = 7, std430) buffer ElementBuffer { int elements[]; }; + +layout(set = 1, binding = 0) uniform sampler2D textures[]; + +layout(push_constant) uniform PushConstants +{ + mat4 ViewToWorld; + vec3 CameraPos; + float ProjX; + vec3 SunDir; + float ProjY; + vec3 SunColor; + float SunIntensity; +}; diff --git a/wadsrc/static/shaders/lightmap/frag_viewer.glsl b/wadsrc/static/shaders/lightmap/frag_viewer.glsl new file mode 100644 index 000000000..d77d6ae2b --- /dev/null +++ b/wadsrc/static/shaders/lightmap/frag_viewer.glsl @@ -0,0 +1,59 @@ + +#include +#include +#include +#include +#include +#include + +layout(location = 0) in vec3 FragRay; +layout(location = 0) out vec4 fragcolor; + +void main() +{ + vec3 incoming = vec3(0.1); + + vec3 origin = CameraPos; + vec3 L = normalize(FragRay); + TraceResult result = TraceFirstHit(origin, 0.0, L, 10000.0); + if (result.primitiveIndex != -1) + { + SurfaceInfo surface = GetSurface(result.primitiveIndex); + vec3 surfacepos = origin + L * result.t; + + if (surface.Sky == 0.0) + { + incoming += TraceSunLight(surfacepos, surface.Normal); + + uint LightStart = surface.LightStart; + uint LightEnd = surface.LightEnd; + for (uint j = LightStart; j < LightEnd; j++) + { + incoming += TraceLight(surfacepos, surface.Normal, lights[lightIndexes[j]], 0.0); + } + + // incoming *= TraceAmbientOcclusion(surfacepos, surface.Normal); + } + else + { + incoming = SunColor; + } + + if (surface.TextureIndex != 0) + { + vec2 uv = GetSurfaceUV(result.primitiveIndex, result.primitiveWeights); + vec4 color = texture(textures[surface.TextureIndex], uv); + incoming *= color.rgb; + } + else + { + incoming = vec3(0.0, 0.0, 1.0); + } + } + else + { + incoming = vec3(1.0, 0.0, 0.0); + } + + fragcolor = vec4(incoming, 1.0); +} diff --git a/wadsrc/static/shaders/lightmap/polyfill_rayquery.glsl b/wadsrc/static/shaders/lightmap/polyfill_rayquery.glsl index 83f0f514a..425a99301 100644 --- a/wadsrc/static/shaders/lightmap/polyfill_rayquery.glsl +++ b/wadsrc/static/shaders/lightmap/polyfill_rayquery.glsl @@ -30,7 +30,9 @@ TraceResult TraceFirstHit(vec3 origin, float tmin, vec3 dir, float tmax) result.primitiveWeights.xy = rayQueryGetIntersectionBarycentricsEXT(rayQuery, true); result.primitiveWeights.z = 1.0 - result.primitiveWeights.x - result.primitiveWeights.y; - result.primitiveIndex = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true); + result.primitiveIndex = + rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) + + rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true); } else { diff --git a/wadsrc/static/shaders/lightmap/vert_viewer.glsl b/wadsrc/static/shaders/lightmap/vert_viewer.glsl new file mode 100644 index 000000000..4d82f47d3 --- /dev/null +++ b/wadsrc/static/shaders/lightmap/vert_viewer.glsl @@ -0,0 +1,21 @@ + +#include + +layout(location = 0) out vec3 FragRay; + +vec2 positions[4] = vec2[]( + vec2(0.0, 0.0), + vec2(1.0, 0.0), + vec2(0.0, 1.0), + vec2(1.0, 1.0) +); + +void main() +{ + vec4 viewpos = vec4(positions[gl_VertexIndex] * 2.0 - 1.0, -1.0, 1.0); + viewpos.x /= ProjX; + viewpos.y = -viewpos.y / ProjY; + FragRay = ((ViewToWorld * viewpos).xyz - CameraPos); + + gl_Position = vec4((positions[gl_VertexIndex] * 2.0 - 1.0) * vec2(1.0, -1.0), 1.0, 1.0); +} From 6b3803cb3b5181406580c28aaed4e66dd4f866f9 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Thu, 5 Sep 2024 10:14:23 +0200 Subject: [PATCH 233/414] Fix descriptor pool size --- src/common/rendering/vulkan/vk_levelmesh.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 9b79e9b80..5dd616a2e 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -566,12 +566,19 @@ void VkLevelMesh::CreateViewerObjects() builder.DebugName("Viewer.DescriptorSetLayout"); Viewer.DescriptorSetLayout = builder.Create(fb->GetDevice()); - Viewer.DescriptorPool = DescriptorPoolBuilder() - .AddPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1) - .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 6) - .MaxSets(1) - .DebugName("Viewer.DescriptorPool") - .Create(fb->GetDevice()); + DescriptorPoolBuilder poolbuilder; + if (useRayQuery) + { + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 7); + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1); + } + else + { + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 8); + } + poolbuilder.MaxSets(1); + poolbuilder.DebugName("Viewer.DescriptorPool"); + Viewer.DescriptorPool = poolbuilder.Create(fb->GetDevice()); Viewer.DescriptorSet = Viewer.DescriptorPool->allocate(Viewer.DescriptorSetLayout.get()); Viewer.DescriptorSet->SetDebugName("raytrace.descriptorSet1"); From 5a1c8131c51230fcfce12a57fd1e68aaa757c45e Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 7 Sep 2024 00:42:49 +0200 Subject: [PATCH 234/414] Move inlined functions out of the class definition for better readability --- .../hwrenderer/data/hw_levelmesh.cpp | 24 ++ .../rendering/hwrenderer/data/hw_levelmesh.h | 403 +++++++++--------- 2 files changed, 222 insertions(+), 205 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 5f9fb459c..78ca51cc8 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -21,6 +21,30 @@ LevelMesh::LevelMesh() Mesh.MaxNodes = (int)std::max(Collision->get_nodes().size() * 2, (size_t)10000); } +void LevelMesh::Reset(const LevelMeshLimits& limits) +{ + Mesh.Vertices.Resize(limits.MaxVertices); + Mesh.UniformIndexes.Resize(limits.MaxVertices); + + Mesh.Surfaces.Resize(limits.MaxSurfaces); + Mesh.Uniforms.Resize(limits.MaxUniforms); + Mesh.Materials.Resize(limits.MaxUniforms); + + Mesh.Lights.Resize(16); + Mesh.LightIndexes.Resize(16); + + Mesh.Indexes.Resize(limits.MaxIndexes); + Mesh.SurfaceIndexes.Resize(limits.MaxIndexes / 3 + 1); + + Mesh.DrawIndexes.Resize(limits.MaxIndexes); + + FreeLists.Vertex.Clear(); FreeLists.Vertex.Push({ 0, limits.MaxVertices }); + FreeLists.Index.Clear(); FreeLists.Index.Push({ 0, limits.MaxIndexes }); + FreeLists.Uniforms.Clear(); FreeLists.Uniforms.Push({ 0, limits.MaxUniforms }); + FreeLists.Surface.Clear(); FreeLists.Surface.Push({ 0, limits.MaxSurfaces }); + FreeLists.DrawIndex.Clear(); FreeLists.DrawIndex.Push({ 0, limits.MaxIndexes }); +} + void LevelMesh::AddEmptyMesh() { GeometryAllocInfo ginfo = AllocGeometry(12, 3 * 4); diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 1af04da67..b9cba5d75 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -92,98 +92,16 @@ public: TArray Portals; - GeometryAllocInfo AllocGeometry(int vertexCount, int indexCount) - { - GeometryAllocInfo info; - info.VertexStart = RemoveRange(FreeLists.Vertex, vertexCount); - info.VertexCount = vertexCount; - info.IndexStart = RemoveRange(FreeLists.Index, indexCount); - info.IndexCount = indexCount; - info.Vertices = &Mesh.Vertices[info.VertexStart]; - info.UniformIndexes = &Mesh.UniformIndexes[info.VertexStart]; - info.Indexes = &Mesh.Indexes[info.IndexStart]; + GeometryAllocInfo AllocGeometry(int vertexCount, int indexCount); + UniformsAllocInfo AllocUniforms(int count); + SurfaceAllocInfo AllocSurface(); - AddRange(UploadRanges.Vertex, { info.VertexStart, info.VertexStart + info.VertexCount }); - AddRange(UploadRanges.UniformIndexes, { info.VertexStart, info.VertexStart + info.VertexCount }); - AddRange(UploadRanges.Index, { info.IndexStart, info.IndexStart + info.IndexCount }); - AddRange(UploadRanges.SurfaceIndex, { info.IndexStart / 3, (info.IndexStart + info.IndexCount) / 3 }); - - Mesh.IndexCount = std::max(Mesh.IndexCount, info.IndexStart + info.IndexCount); - - return info; - } - - UniformsAllocInfo AllocUniforms(int count) - { - UniformsAllocInfo info; - info.Start = RemoveRange(FreeLists.Uniforms, count); - info.Count = count; - info.Uniforms = &Mesh.Uniforms[info.Start]; - info.Materials = &Mesh.Materials[info.Start]; - - AddRange(UploadRanges.Uniforms, { info.Start, info.Start + info.Count }); - - return info; - } - - SurfaceAllocInfo AllocSurface() - { - SurfaceAllocInfo info; - info.Index = RemoveRange(FreeLists.Surface, 1); - info.Surface = &Mesh.Surfaces[info.Index]; - - AddRange(UploadRanges.Surface, { info.Index, info.Index + 1 }); - - return info; - } - - void FreeGeometry(int vertexStart, int vertexCount, int indexStart, int indexCount) - { - // Convert triangles to degenerates - for (int i = 0; i < indexCount; i++) - Mesh.Indexes[indexStart + i] = 0; - AddRange(UploadRanges.Index, { indexStart, indexStart + indexCount }); - - AddRange(FreeLists.Vertex, { vertexStart, vertexStart + vertexCount }); - AddRange(FreeLists.Index, { indexStart, indexStart + indexCount }); - } - - void FreeUniforms(int start, int count) - { - AddRange(FreeLists.Uniforms, { start, start + count }); - } - - void FreeSurface(unsigned int surfaceIndex) - { - // To do: remove the surface from the surface tile, if attached - - AddRange(FreeLists.Surface, { (int)surfaceIndex, (int)surfaceIndex + 1 }); - } + void FreeGeometry(int vertexStart, int vertexCount, int indexStart, int indexCount); + void FreeUniforms(int start, int count); + void FreeSurface(unsigned int surfaceIndex); // Sets the sizes of all the GPU buffers and empties the mesh - virtual void Reset(const LevelMeshLimits& limits) - { - Mesh.Vertices.Resize(limits.MaxVertices); - Mesh.UniformIndexes.Resize(limits.MaxVertices); - - Mesh.Surfaces.Resize(limits.MaxSurfaces); - Mesh.Uniforms.Resize(limits.MaxUniforms); - Mesh.Materials.Resize(limits.MaxUniforms); - - Mesh.Lights.Resize(16); - Mesh.LightIndexes.Resize(16); - - Mesh.Indexes.Resize(limits.MaxIndexes); - Mesh.SurfaceIndexes.Resize(limits.MaxIndexes / 3 + 1); - - Mesh.DrawIndexes.Resize(limits.MaxIndexes); - - FreeLists.Vertex.Clear(); FreeLists.Vertex.Push({ 0, limits.MaxVertices }); - FreeLists.Index.Clear(); FreeLists.Index.Push({ 0, limits.MaxIndexes }); - FreeLists.Uniforms.Clear(); FreeLists.Uniforms.Push({ 0, limits.MaxUniforms }); - FreeLists.Surface.Clear(); FreeLists.Surface.Push({ 0, limits.MaxSurfaces }); - FreeLists.DrawIndex.Clear(); FreeLists.DrawIndex.Push({ 0, limits.MaxIndexes }); - } + virtual void Reset(const LevelMeshLimits& limits); // Data placed in GPU buffers struct @@ -263,123 +181,12 @@ public: void AddEmptyMesh(); - void UploadPortals() - { - UploadRanges.Portals.Clear(); - AddRange(UploadRanges.Portals, { 0, (int)Portals.Size() }); - } + void UploadPortals(); + void UploadCollision(); - void UploadCollision() - { - UploadRanges.Node.Clear(); - if (Collision) - UploadRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); - } - - int RemoveRange(TArray& ranges, int count) - { - for (unsigned int i = ranges.Size(); i > 0; i--) - { - auto& item = ranges[i - 1]; - if (item.End - item.Start >= count) - { - int pos = item.Start; - item.Start += count; - if (item.Start == item.End) - { - ranges.Delete(i - 1); - } - return pos; - } - } - I_FatalError("Could not find space in level mesh buffer"); - } - - void RemoveRange(TArray& ranges, MeshBufferRange range) - { - if (range.Start == range.End) - return; - - auto entry = std::lower_bound(ranges.begin(), ranges.end(), range, [](const auto& a, const auto& b) { return a.End < b.End; }); - if (entry->Start == range.Start && entry->End == range.End) - { - ranges.Delete(entry - ranges.begin()); - } - else if (entry->Start == range.Start) - { - entry->Start = range.End; - } - else if (entry->End == range.End) - { - entry->End = range.Start; - } - else - { - MeshBufferRange split; - split.Start = entry->Start; - split.End = range.Start; - entry->Start = range.End; - ranges.Insert(entry - ranges.begin(), split); - } - } - - void AddRange(TArray& ranges, MeshBufferRange range) - { - // Empty range? - if (range.Start == range.End) - return; - - // First element? - if (ranges.Size() == 0) - { - ranges.push_back(range); - return; - } - - // Find start position in ranges - auto right = std::lower_bound(ranges.begin(), ranges.end(), range, [](const auto& a, const auto& b) { return a.Start < b.Start; }); - bool leftExists = right != ranges.begin(); - bool rightExists = right != ranges.end(); - auto left = right; - if (leftExists) - --left; - - // Is this a gap between two ranges? - if ((!leftExists || left->End < range.Start) && (!rightExists || right->Start > range.End)) - { - ranges.Insert(right - ranges.begin(), range); - return; - } - - // Are we extending the left or the right range? - if (leftExists && range.Start <= left->End) - { - left->End = std::max(left->End, range.End); - right = left; - } - else // if (rightExists && right->Start <= range.End) - { - right->Start = range.Start; - right->End = std::max(right->End, range.End); - left = right; - } - - // Merge overlaps to the right - while (true) - { - ++right; - if (right == ranges.end() || right->Start > range.End) - break; - left->End = std::max(right->End, range.End); - } - - // Remove ranges now covered by the extended range - //ranges.erase(++left, right); - ++left; - auto leftPos = left - ranges.begin(); - auto rightPos = right - ranges.begin(); - ranges.Delete(leftPos, rightPos - leftPos); - } + void AddRange(TArray& ranges, MeshBufferRange range); + void RemoveRange(TArray& ranges, MeshBufferRange range); + int RemoveRange(TArray& ranges, int count); }; struct LevelMeshTileStats @@ -391,3 +198,189 @@ struct LevelMeshTileStats Stats tiles, pixels; }; + +inline GeometryAllocInfo LevelMesh::AllocGeometry(int vertexCount, int indexCount) +{ + GeometryAllocInfo info; + info.VertexStart = RemoveRange(FreeLists.Vertex, vertexCount); + info.VertexCount = vertexCount; + info.IndexStart = RemoveRange(FreeLists.Index, indexCount); + info.IndexCount = indexCount; + info.Vertices = &Mesh.Vertices[info.VertexStart]; + info.UniformIndexes = &Mesh.UniformIndexes[info.VertexStart]; + info.Indexes = &Mesh.Indexes[info.IndexStart]; + + AddRange(UploadRanges.Vertex, { info.VertexStart, info.VertexStart + info.VertexCount }); + AddRange(UploadRanges.UniformIndexes, { info.VertexStart, info.VertexStart + info.VertexCount }); + AddRange(UploadRanges.Index, { info.IndexStart, info.IndexStart + info.IndexCount }); + AddRange(UploadRanges.SurfaceIndex, { info.IndexStart / 3, (info.IndexStart + info.IndexCount) / 3 }); + + Mesh.IndexCount = std::max(Mesh.IndexCount, info.IndexStart + info.IndexCount); + + return info; +} + +inline UniformsAllocInfo LevelMesh::AllocUniforms(int count) +{ + UniformsAllocInfo info; + info.Start = RemoveRange(FreeLists.Uniforms, count); + info.Count = count; + info.Uniforms = &Mesh.Uniforms[info.Start]; + info.Materials = &Mesh.Materials[info.Start]; + + AddRange(UploadRanges.Uniforms, { info.Start, info.Start + info.Count }); + + return info; +} + +inline SurfaceAllocInfo LevelMesh::AllocSurface() +{ + SurfaceAllocInfo info; + info.Index = RemoveRange(FreeLists.Surface, 1); + info.Surface = &Mesh.Surfaces[info.Index]; + + AddRange(UploadRanges.Surface, { info.Index, info.Index + 1 }); + + return info; +} + +inline void LevelMesh::FreeGeometry(int vertexStart, int vertexCount, int indexStart, int indexCount) +{ + // Convert triangles to degenerates + for (int i = 0; i < indexCount; i++) + Mesh.Indexes[indexStart + i] = 0; + AddRange(UploadRanges.Index, { indexStart, indexStart + indexCount }); + + AddRange(FreeLists.Vertex, { vertexStart, vertexStart + vertexCount }); + AddRange(FreeLists.Index, { indexStart, indexStart + indexCount }); +} + +inline void LevelMesh::FreeUniforms(int start, int count) +{ + AddRange(FreeLists.Uniforms, { start, start + count }); +} + +inline void LevelMesh::FreeSurface(unsigned int surfaceIndex) +{ + // To do: remove the surface from the surface tile, if attached + + AddRange(FreeLists.Surface, { (int)surfaceIndex, (int)surfaceIndex + 1 }); +} + +inline void LevelMesh::UploadPortals() +{ + UploadRanges.Portals.Clear(); + AddRange(UploadRanges.Portals, { 0, (int)Portals.Size() }); +} + +inline void LevelMesh::UploadCollision() +{ + UploadRanges.Node.Clear(); + if (Collision) + UploadRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); +} + +inline void LevelMesh::AddRange(TArray& ranges, MeshBufferRange range) +{ + // Empty range? + if (range.Start == range.End) + return; + + // First element? + if (ranges.Size() == 0) + { + ranges.push_back(range); + return; + } + + // Find start position in ranges + auto right = std::lower_bound(ranges.begin(), ranges.end(), range, [](const auto& a, const auto& b) { return a.Start < b.Start; }); + bool leftExists = right != ranges.begin(); + bool rightExists = right != ranges.end(); + auto left = right; + if (leftExists) + --left; + + // Is this a gap between two ranges? + if ((!leftExists || left->End < range.Start) && (!rightExists || right->Start > range.End)) + { + ranges.Insert(right - ranges.begin(), range); + return; + } + + // Are we extending the left or the right range? + if (leftExists && range.Start <= left->End) + { + left->End = std::max(left->End, range.End); + right = left; + } + else // if (rightExists && right->Start <= range.End) + { + right->Start = range.Start; + right->End = std::max(right->End, range.End); + left = right; + } + + // Merge overlaps to the right + while (true) + { + ++right; + if (right == ranges.end() || right->Start > range.End) + break; + left->End = std::max(right->End, range.End); + } + + // Remove ranges now covered by the extended range + //ranges.erase(++left, right); + ++left; + auto leftPos = left - ranges.begin(); + auto rightPos = right - ranges.begin(); + ranges.Delete(leftPos, rightPos - leftPos); +} + +inline void LevelMesh::RemoveRange(TArray& ranges, MeshBufferRange range) +{ + if (range.Start == range.End) + return; + + auto entry = std::lower_bound(ranges.begin(), ranges.end(), range, [](const auto& a, const auto& b) { return a.End < b.End; }); + if (entry->Start == range.Start && entry->End == range.End) + { + ranges.Delete(entry - ranges.begin()); + } + else if (entry->Start == range.Start) + { + entry->Start = range.End; + } + else if (entry->End == range.End) + { + entry->End = range.Start; + } + else + { + MeshBufferRange split; + split.Start = entry->Start; + split.End = range.Start; + entry->Start = range.End; + ranges.Insert(entry - ranges.begin(), split); + } +} + +inline int LevelMesh::RemoveRange(TArray& ranges, int count) +{ + for (unsigned int i = ranges.Size(); i > 0; i--) + { + auto& item = ranges[i - 1]; + if (item.End - item.Start >= count) + { + int pos = item.Start; + item.Start += count; + if (item.Start == item.End) + { + ranges.Delete(i - 1); + } + return pos; + } + } + I_FatalError("Could not find space in level mesh buffer"); +} From d2958d83666946db7d09ac5fd1cc21aa41b4cba9 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 7 Sep 2024 03:11:36 +0200 Subject: [PATCH 235/414] Change how visible surfaces for a tile are collected by the light mapper --- .../hwrenderer/data/hw_levelmesh.cpp | 71 +------------------ .../rendering/hwrenderer/data/hw_levelmesh.h | 3 + .../hwrenderer/data/hw_lightmaptile.h | 3 - .../rendering/vulkan/vk_lightmapper.cpp | 5 +- src/common/rendering/vulkan/vk_lightmapper.h | 2 + src/rendering/hwrenderer/doom_levelmesh.cpp | 63 +++++++++++++--- src/rendering/hwrenderer/doom_levelmesh.h | 3 +- 7 files changed, 66 insertions(+), 84 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 78ca51cc8..243f23fa1 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -148,75 +148,6 @@ struct LevelMeshPlaneGroup std::vector surfaces; }; -void LevelMesh::BuildTileSurfaceLists() -{ - // Plane group surface is to be rendered with - TArray PlaneGroups; - TArray PlaneGroupIndexes(Mesh.Surfaces.Size()); - - for (int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) - { - auto surface = &Mesh.Surfaces[i]; - - // Is this surface in the same plane as an existing plane group? - int planeGroupIndex = -1; - - for (size_t j = 0; j < PlaneGroups.Size(); j++) - { - if (surface->SectorGroup == PlaneGroups[j].sectorGroup) - { - float direction = PlaneGroups[j].plane.XYZ() | surface->Plane.XYZ(); - if (direction >= 0.999f && direction <= 1.01f) - { - auto point = (surface->Plane.XYZ() * surface->Plane.W); - auto planeDistance = (PlaneGroups[j].plane.XYZ() | point) - PlaneGroups[j].plane.W; - - float dist = std::abs(planeDistance); - if (dist <= 0.1f) - { - planeGroupIndex = (int)j; - break; - } - } - } - } - - // Surface is in a new plane. Create a plane group for it - if (planeGroupIndex == -1) - { - planeGroupIndex = PlaneGroups.Size(); - - LevelMeshPlaneGroup group; - group.plane = surface->Plane; - group.sectorGroup = surface->SectorGroup; - PlaneGroups.Push(group); - } - - PlaneGroups[planeGroupIndex].surfaces.push_back(surface); - PlaneGroupIndexes.Push(planeGroupIndex); - } - - for (auto& tile : LightmapTiles) - tile.Surfaces.Clear(); - - for (int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) - { - LevelMeshSurface* targetSurface = &Mesh.Surfaces[i]; - if (targetSurface->LightmapTileIndex < 0) - continue; - LightmapTile* tile = &LightmapTiles[targetSurface->LightmapTileIndex]; - for (LevelMeshSurface* surface : PlaneGroups[PlaneGroupIndexes[i]].surfaces) - { - FVector2 minUV = tile->ToUV(surface->Bounds.min); - FVector2 maxUV = tile->ToUV(surface->Bounds.max); - if (surface != targetSurface && (maxUV.X < 0.0f || maxUV.Y < 0.0f || minUV.X > 1.0f || minUV.Y > 1.0f)) - continue; // Bounding box not visible - - tile->Surfaces.Push((unsigned int)(ptrdiff_t)(surface - Mesh.Surfaces.Data())); - } - } -} - void LevelMesh::SetupTileTransforms() { for (auto& tile : LightmapTiles) @@ -227,6 +158,8 @@ void LevelMesh::SetupTileTransforms() void LevelMesh::PackLightmapAtlas(int lightmapStartIndex) { + LMAtlasPacked = true; + std::vector sortedTiles; sortedTiles.reserve(LightmapTiles.Size()); diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index b9cba5d75..9957f4a33 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -103,6 +103,8 @@ public: // Sets the sizes of all the GPU buffers and empties the mesh virtual void Reset(const LevelMeshLimits& limits); + virtual void GetVisibleSurfaces(LightmapTile* tile, TArray& outSurfaces) { } + // Data placed in GPU buffers struct { @@ -171,6 +173,7 @@ public: uint16_t LightmapSampleDistance = 16; TArray LightmapTiles; + bool LMAtlasPacked = false; // Tile sizes can't be changed anymore uint32_t AtlasPixelCount() const { return uint32_t(LMTextureCount * LMTextureSize * LMTextureSize); } diff --git a/src/common/rendering/hwrenderer/data/hw_lightmaptile.h b/src/common/rendering/hwrenderer/data/hw_lightmaptile.h index 2793252ac..7f803f5a8 100644 --- a/src/common/rendering/hwrenderer/data/hw_lightmaptile.h +++ b/src/common/rendering/hwrenderer/data/hw_lightmaptile.h @@ -44,9 +44,6 @@ struct LightmapTile LightmapTileBinding Binding; - // Surfaces that are visible within the lightmap tile - TArray Surfaces; - BBox Bounds; uint16_t SampleDimension = 0; FVector4 Plane = FVector4(0.0f, 0.0f, 1.0f, 0.0f); diff --git a/src/common/rendering/vulkan/vk_lightmapper.cpp b/src/common/rendering/vulkan/vk_lightmapper.cpp index c569ce742..9e0d2e9b0 100644 --- a/src/common/rendering/vulkan/vk_lightmapper.cpp +++ b/src/common/rendering/vulkan/vk_lightmapper.cpp @@ -194,7 +194,10 @@ void VkLightmapper::Render() bool buffersFull = false; // Paint all surfaces visible in the tile - for (int surfaceIndex : targetTile->Surfaces) + + visibleSurfaces.Clear(); + mesh->GetVisibleSurfaces(targetTile, visibleSurfaces); + for (int surfaceIndex : visibleSurfaces) { LevelMeshSurface* surface = &mesh->Mesh.Surfaces[surfaceIndex]; pc.SurfaceIndex = surfaceIndex; diff --git a/src/common/rendering/vulkan/vk_lightmapper.h b/src/common/rendering/vulkan/vk_lightmapper.h index ac2944cf8..2cfd75502 100644 --- a/src/common/rendering/vulkan/vk_lightmapper.h +++ b/src/common/rendering/vulkan/vk_lightmapper.h @@ -149,6 +149,8 @@ private: TArray selectedTiles; TArray> copylists; + TArray visibleSurfaces; + struct { std::unique_ptr Buffer; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 7e1bfc46c..523297313 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -171,8 +171,6 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) CreatePortals(doomMap); CreateSurfaces(doomMap); - BuildTileSurfaceLists(); - UpdateCollision(); Mesh.MaxNodes = std::max(Collision->get_nodes().size() * 2, (size_t)10000); @@ -921,19 +919,25 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMesh { int index = it->second; - LightmapTile& tile = LightmapTiles[index]; - tile.Bounds.min.X = std::min(tile.Bounds.min.X, surf.Bounds.min.X); - tile.Bounds.min.Y = std::min(tile.Bounds.min.Y, surf.Bounds.min.Y); - tile.Bounds.min.Z = std::min(tile.Bounds.min.Z, surf.Bounds.min.Z); - tile.Bounds.max.X = std::max(tile.Bounds.max.X, surf.Bounds.max.X); - tile.Bounds.max.Y = std::max(tile.Bounds.max.Y, surf.Bounds.max.Y); - tile.Bounds.max.Z = std::max(tile.Bounds.max.Z, surf.Bounds.max.Z); - tile.AlwaysUpdate = tile.AlwaysUpdate || alwaysUpdate; + if (!LMAtlasPacked) + { + LightmapTile& tile = LightmapTiles[index]; + tile.Bounds.min.X = std::min(tile.Bounds.min.X, surf.Bounds.min.X); + tile.Bounds.min.Y = std::min(tile.Bounds.min.Y, surf.Bounds.min.Y); + tile.Bounds.min.Z = std::min(tile.Bounds.min.Z, surf.Bounds.min.Z); + tile.Bounds.max.X = std::max(tile.Bounds.max.X, surf.Bounds.max.X); + tile.Bounds.max.Y = std::max(tile.Bounds.max.Y, surf.Bounds.max.Y); + tile.Bounds.max.Z = std::max(tile.Bounds.max.Z, surf.Bounds.max.Z); + tile.AlwaysUpdate = tile.AlwaysUpdate || alwaysUpdate; + } return index; } else { + if (LMAtlasPacked) + return -1; + int index = LightmapTiles.Size(); LightmapTile tile; @@ -1237,6 +1241,45 @@ BBox DoomLevelMesh::GetBoundsFromSurface(const LevelMeshSurface& surface) const return bounds; } +void DoomLevelMesh::GetVisibleSurfaces(LightmapTile* tile, TArray& outSurfaces) +{ + if (tile->Binding.Type == ST_MIDDLESIDE || tile->Binding.Type == ST_UPPERSIDE || tile->Binding.Type == ST_LOWERSIDE) + { + int sideIndex = tile->Binding.TypeIndex; + int surf = Sides[sideIndex].FirstSurface; + while (surf != -1) + { + const auto& sinfo = DoomSurfaceInfos[surf]; + if (sinfo.Type == tile->Binding.Type) + { + outSurfaces.Push(surf); + } + surf = sinfo.NextSurface; + } + } + else if (tile->Binding.Type == ST_CEILING || tile->Binding.Type == ST_FLOOR) + { + int subsectorIndex = tile->Binding.TypeIndex; + int sectorIndex = level.subsectors[subsectorIndex].sector->Index(); + int surf = Flats[sectorIndex].FirstSurface; + while (surf != -1) + { + const auto& sinfo = DoomSurfaceInfos[surf]; + int controlSector = sinfo.ControlSector ? sinfo.ControlSector->Index() : (int)0xffffffffUL; + if (sinfo.Type == tile->Binding.Type && controlSector == tile->Binding.ControlSector) + { + FVector2 minUV = tile->ToUV(Mesh.Surfaces[surf].Bounds.min); + FVector2 maxUV = tile->ToUV(Mesh.Surfaces[surf].Bounds.max); + if (!(maxUV.X < 0.0f || maxUV.Y < 0.0f || minUV.X > 1.0f || minUV.Y > 1.0f)) + { + outSurfaces.Push(surf); + } + } + surf = sinfo.NextSurface; + } + } +} + void DoomLevelMesh::DumpMesh(const FString& objFilename, const FString& mtlFilename) const { auto f = fopen(objFilename.GetChars(), "w"); diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index d8eacde39..75f4edfe1 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -113,6 +113,8 @@ public: DoomSurfaceInfos.Resize(limits.MaxSurfaces); } + void GetVisibleSurfaces(LightmapTile* tile, TArray& outSurfaces) override; + struct Stats { int FlatsUpdated = 0; @@ -159,7 +161,6 @@ private: void SortDrawLists(); TArray DoomSurfaceInfos; - TArray> PolyDoomSurfaceInfos; TArray Sides; TArray Flats; From e65b3058cf323433931e1ed9948ce288192e9ff5 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 7 Sep 2024 04:14:22 +0200 Subject: [PATCH 236/414] Fix mesh builder not getting cleared correctly --- src/rendering/hwrenderer/doom_levelmesh.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 523297313..471b5b03c 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -686,6 +686,10 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh { for (HWWall& wallpart : list) { + state.mSortedLists.clear(); + state.mVertices.Clear(); + state.mIndexes.Clear(); + if (drawType == LevelMeshDrawType::Portal) { state.SetEffect(EFF_PORTAL); @@ -769,9 +773,6 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh *(uinfo.Materials++) = applyState.material; uniformsIndex++; } - state.mSortedLists.clear(); - state.mVertices.Clear(); - state.mIndexes.Clear(); FVector2 v1 = FVector2(side->V1()->fPos()); FVector2 v2 = FVector2(side->V2()->fPos()); From 1b8effe1ea332526cefa085bbdacae6a93182656 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Sep 2024 02:32:01 +0200 Subject: [PATCH 237/414] Make linearized depth data available to translucent material shaders via the texture name SceneLinearDepth. Does it work? Who knows! --- .../postprocessing/hw_postprocess.cpp | 63 ++++++++++++------- .../postprocessing/hw_postprocess.h | 29 +++++++-- src/common/rendering/v_video.h | 4 +- .../vulkan/textures/vk_hwtexture.cpp | 11 ++++ .../rendering/vulkan/textures/vk_hwtexture.h | 4 ++ .../vulkan/textures/vk_renderbuffers.cpp | 17 +++++ .../vulkan/textures/vk_renderbuffers.h | 2 + .../rendering/vulkan/textures/vk_texture.cpp | 4 ++ .../rendering/vulkan/vk_postprocess.cpp | 11 ++++ src/common/rendering/vulkan/vk_postprocess.h | 1 + .../rendering/vulkan/vk_pprenderstate.cpp | 2 +- .../rendering/vulkan/vk_renderdevice.cpp | 24 +++++++ src/common/rendering/vulkan/vk_renderdevice.h | 6 ++ src/common/textures/texture.cpp | 9 +++ src/common/textures/texturemanager.cpp | 5 ++ src/common/textures/textures.h | 16 ++++- .../hwrenderer/scene/hw_drawinfo.cpp | 7 ++- 17 files changed, 183 insertions(+), 32 deletions(-) diff --git a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp index 784a1aefc..0bf7f9234 100644 --- a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp +++ b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp @@ -639,6 +639,44 @@ void PPTonemap::Render(PPRenderState *renderstate) ///////////////////////////////////////////////////////////////////////////// +void PPLinearDepth::Render(PPRenderState* renderstate, int sceneWidth, int sceneHeight) +{ + auto sceneScale = screen->SceneScale(); + auto sceneOffset = screen->SceneOffset(); + + LinearDepthUniforms linearUniforms; + linearUniforms.SampleIndex = 0; + linearUniforms.LinearizeDepthA = 1.0f / screen->GetZFar() - 1.0f / screen->GetZNear(); + linearUniforms.LinearizeDepthB = max(1.0f / screen->GetZNear(), 1.e-8f); + linearUniforms.InverseDepthRangeA = 1.0f; + linearUniforms.InverseDepthRangeB = 0.0f; + linearUniforms.Scale = sceneScale; + linearUniforms.Offset = sceneOffset; + + IntRect viewport; + viewport.left = 0; + viewport.top = 0; + viewport.width = sceneWidth; + viewport.height = sceneHeight; + + renderstate->PushGroup("lineardepth"); + + // Calculate linear depth values + renderstate->Clear(); + renderstate->Shader = gl_multisample > 1 ? &LinearDepthMS : &LinearDepth; + renderstate->Uniforms.Set(linearUniforms); + renderstate->Viewport = viewport; + renderstate->SetInputSceneDepth(0); + renderstate->SetInputSceneColor(1); + renderstate->SetOutputSceneLinearDepth(); + renderstate->SetNoBlend(); + renderstate->Draw(); + + renderstate->PopGroup(); +} + +///////////////////////////////////////////////////////////////////////////// + PPAmbientOcclusion::PPAmbientOcclusion() { // Must match quality enum in PPAmbientOcclusion::DeclareShaders @@ -692,8 +730,6 @@ void PPAmbientOcclusion::CreateShaders() #define NUM_STEPS %d.0 )", numDirections, numSteps); - LinearDepth = { "shaders/pp/lineardepth.fp", "", LinearDepthUniforms::Desc() }; - LinearDepthMS = { "shaders/pp/lineardepth.fp", "#define MULTISAMPLE\n", LinearDepthUniforms::Desc() }; AmbientOcclude = { "shaders/pp/ssao.fp", defines, SSAOUniforms::Desc() }; AmbientOccludeMS = { "shaders/pp/ssao.fp", defines + "\n#define MULTISAMPLE\n", SSAOUniforms::Desc() }; BlurVertical = { "shaders/pp/depthblur.fp", "#define BLUR_VERTICAL\n", DepthBlurUniforms::Desc() }; @@ -712,7 +748,6 @@ void PPAmbientOcclusion::UpdateTextures(int width, int height) AmbientWidth = (width + 1) / 2; AmbientHeight = (height + 1) / 2; - LinearDepthTexture = { AmbientWidth, AmbientHeight, PixelFormat::R32f }; Ambient0 = { AmbientWidth, AmbientHeight, PixelFormat::Rg16f }; Ambient1 = { AmbientWidth, AmbientHeight, PixelFormat::Rg16f }; @@ -749,15 +784,6 @@ void PPAmbientOcclusion::Render(PPRenderState *renderstate, float m5, int sceneW int randomTexture = clamp(gl_ssao - 1, 0, NumAmbientRandomTextures - 1); - LinearDepthUniforms linearUniforms; - linearUniforms.SampleIndex = 0; - linearUniforms.LinearizeDepthA = 1.0f / screen->GetZFar() - 1.0f / screen->GetZNear(); - linearUniforms.LinearizeDepthB = max(1.0f / screen->GetZNear(), 1.e-8f); - linearUniforms.InverseDepthRangeA = 1.0f; - linearUniforms.InverseDepthRangeB = 0.0f; - linearUniforms.Scale = sceneScale; - linearUniforms.Offset = sceneOffset; - SSAOUniforms ssaoUniforms; ssaoUniforms.SampleIndex = 0; ssaoUniforms.UVToViewA = { 2.0f * invFocalLenX, 2.0f * invFocalLenY }; @@ -789,23 +815,12 @@ void PPAmbientOcclusion::Render(PPRenderState *renderstate, float m5, int sceneW renderstate->PushGroup("ssao"); - // Calculate linear depth values - renderstate->Clear(); - renderstate->Shader = gl_multisample > 1 ? &LinearDepthMS : &LinearDepth; - renderstate->Uniforms.Set(linearUniforms); - renderstate->Viewport = ambientViewport; - renderstate->SetInputSceneDepth(0); - renderstate->SetInputSceneColor(1); - renderstate->SetOutputTexture(&LinearDepthTexture); - renderstate->SetNoBlend(); - renderstate->Draw(); - // Apply ambient occlusion renderstate->Clear(); renderstate->Shader = gl_multisample > 1 ? &AmbientOccludeMS : &AmbientOcclude; renderstate->Uniforms.Set(ssaoUniforms); renderstate->Viewport = ambientViewport; - renderstate->SetInputTexture(0, &LinearDepthTexture); + renderstate->SetInputSceneLinearDepth(0); renderstate->SetInputSceneNormal(1); renderstate->SetInputTexture(2, &AmbientRandomTexture[randomTexture], PPFilterMode::Nearest, PPWrapMode::Repeat); renderstate->SetOutputTexture(&Ambient0); diff --git a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.h b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.h index aebf02f58..cd08fa45a 100644 --- a/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.h +++ b/src/common/rendering/hwrenderer/postprocessing/hw_postprocess.h @@ -60,7 +60,7 @@ public: enum class PPFilterMode { Nearest, Linear }; enum class PPWrapMode { Clamp, Repeat }; -enum class PPTextureType { CurrentPipelineTexture, NextPipelineTexture, PPTexture, SceneColor, SceneFog, SceneNormal, SceneDepth, SwapChain, ShadowMap }; +enum class PPTextureType { CurrentPipelineTexture, NextPipelineTexture, PPTexture, SceneColor, SceneFog, SceneNormal, SceneDepth, SceneLinearDepth, SwapChain, ShadowMap }; class PPTextureInput { @@ -176,6 +176,11 @@ public: SetInputSpecialType(index, PPTextureType::SceneDepth, filter, wrap); } + void SetInputSceneLinearDepth(int index, PPFilterMode filter = PPFilterMode::Nearest, PPWrapMode wrap = PPWrapMode::Clamp) + { + SetInputSpecialType(index, PPTextureType::SceneLinearDepth, filter, wrap); + } + void SetInputSpecialType(int index, PPTextureType type, PPFilterMode filter = PPFilterMode::Nearest, PPWrapMode wrap = PPWrapMode::Clamp) { if ((int)Textures.Size() < index + 1) @@ -216,6 +221,12 @@ public: Output.Texture = nullptr; } + void SetOutputSceneLinearDepth() + { + Output.Type = PPTextureType::SceneLinearDepth; + Output.Texture = nullptr; + } + void SetOutputSwapChain() { Output.Type = PPTextureType::SwapChain; @@ -634,6 +645,18 @@ struct LinearDepthUniforms } }; +class PPLinearDepth +{ +public: + void Render(PPRenderState* renderstate, int sceneWidth, int sceneHeight); + +private: + PPShader LinearDepth = { "shaders/pp/lineardepth.fp", "", LinearDepthUniforms::Desc() }; + PPShader LinearDepthMS = { "shaders/pp/lineardepth.fp", "#define MULTISAMPLE\n", LinearDepthUniforms::Desc() }; +}; + +///////////////////////////////////////////////////////////////////////////// + struct SSAOUniforms { FVector2 UVToViewA; @@ -735,8 +758,6 @@ private: int LastWidth = 0; int LastHeight = 0; - PPShader LinearDepth; - PPShader LinearDepthMS; PPShader AmbientOcclude; PPShader AmbientOccludeMS; PPShader BlurVertical; @@ -744,7 +765,6 @@ private: PPShader Combine; PPShader CombineMS; - PPTexture LinearDepthTexture; PPTexture Ambient0; PPTexture Ambient1; @@ -870,6 +890,7 @@ public: PPCameraExposure exposure; PPColormap colormap; PPTonemap tonemap; + PPLinearDepth linearDepth; PPAmbientOcclusion ssao; PPPresent present; PPShadowMap shadowmap; diff --git a/src/common/rendering/v_video.h b/src/common/rendering/v_video.h index 721347e87..67fd1effe 100644 --- a/src/common/rendering/v_video.h +++ b/src/common/rendering/v_video.h @@ -103,7 +103,7 @@ protected: class IHardwareTexture; class FTexture; - +class FSceneTexture; class DFrameBuffer { @@ -179,6 +179,7 @@ public: // Delete any resources that need to be deleted after restarting with a different IWAD virtual void SetTextureFilterMode() {} virtual IHardwareTexture *CreateHardwareTexture(int numchannels) { return nullptr; } + virtual IHardwareTexture* CreateSceneTexture(FSceneTexture* owner) { return nullptr; } virtual void PrecacheMaterial(FMaterial *mat, int translation) {} virtual FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags); virtual void BeginFrame() {} @@ -204,6 +205,7 @@ public: void SetClearColor(int color); virtual int Backend() { return 0; } virtual const char* DeviceName() const { return "Unknown"; } + virtual void UpdateLinearDepthTexture() {} virtual void AmbientOccludeScene(float m5) {} virtual void FirstEye() {} virtual void NextEye(int eyecount) {} diff --git a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp index d09fc6185..016afee1e 100644 --- a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp +++ b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp @@ -43,6 +43,12 @@ VkHardwareTexture::VkHardwareTexture(VulkanRenderDevice* fb, int numchannels) : fb->GetTextureManager()->AddTexture(this); } +VkHardwareTexture::VkHardwareTexture(VulkanRenderDevice* fb, FSceneTextureType sceneTextureType) : fb(fb), mSceneTextureType(sceneTextureType) +{ + mTexelsize = 4; + fb->GetTextureManager()->AddTexture(this); +} + VkHardwareTexture::~VkHardwareTexture() { if (fb) @@ -66,6 +72,11 @@ void VkHardwareTexture::Reset() VkTextureImage *VkHardwareTexture::GetImage(FTexture *tex, int translation, int flags) { + if (mSceneTextureType == FSceneTextureType::LinearDepth) + { + return &fb->GetBuffers()->SceneLinearDepth; + } + if (!mImage.Image) { CreateImage(tex, translation, flags); diff --git a/src/common/rendering/vulkan/textures/vk_hwtexture.h b/src/common/rendering/vulkan/textures/vk_hwtexture.h index 19dd71dc5..1bb1e5691 100644 --- a/src/common/rendering/vulkan/textures/vk_hwtexture.h +++ b/src/common/rendering/vulkan/textures/vk_hwtexture.h @@ -21,12 +21,14 @@ class VulkanImageView; class VulkanBuffer; class VulkanRenderDevice; class FGameTexture; +enum class FSceneTextureType; class VkHardwareTexture : public IHardwareTexture { friend class VkMaterial; public: VkHardwareTexture(VulkanRenderDevice* fb, int numchannels); + VkHardwareTexture(VulkanRenderDevice* fb, FSceneTextureType sceneTextureType); ~VkHardwareTexture(); void Reset(); @@ -51,6 +53,8 @@ private: void CreateTexture(int w, int h, int pixelsize, VkFormat format, const void *pixels, bool mipmap); static int GetMipLevels(int w, int h); + FSceneTextureType mSceneTextureType = FSceneTextureType::None; + VkTextureImage mImage; int mTexelsize = 4; diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index 979422850..45005cb5a 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -174,11 +174,13 @@ void VkRenderBuffers::CreateScene(int width, int height, VkSampleCountFlagBits s SceneDepthStencil.Reset(fb); SceneNormal.Reset(fb); SceneFog.Reset(fb); + SceneLinearDepth.Reset(fb); CreateSceneColor(width, height, samples); CreateSceneDepthStencil(width, height, samples); CreateSceneNormal(width, height, samples); CreateSceneFog(width, height, samples); + CreateSceneLinearDepth(width, height); VkImageTransition() .AddImage(&SceneColor, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true) @@ -252,6 +254,21 @@ void VkRenderBuffers::CreateSceneFog(int width, int height, VkSampleCountFlagBit .Create(fb->GetDevice()); } +void VkRenderBuffers::CreateSceneLinearDepth(int width, int height) +{ + SceneLinearDepth.Image = ImageBuilder() + .Size(width, height) + .Format(VK_FORMAT_R32_SFLOAT) + .Usage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT) + .DebugName("VkRenderBuffers.SceneLinearDepth") + .Create(fb->GetDevice()); + + SceneLinearDepth.View = ImageViewBuilder() + .Image(SceneLinearDepth.Image.get(), VK_FORMAT_R32_SFLOAT) + .DebugName("VkRenderBuffers.SceneLinearDepthView") + .Create(fb->GetDevice()); +} + void VkRenderBuffers::CreateSceneNormal(int width, int height, VkSampleCountFlagBits samples) { ImageBuilder builder; diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.h b/src/common/rendering/vulkan/textures/vk_renderbuffers.h index 4e9cab4da..2a22dd10a 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.h +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.h @@ -34,6 +34,7 @@ public: VkTextureImage SceneDepthStencil; VkTextureImage SceneNormal; VkTextureImage SceneFog; + VkTextureImage SceneLinearDepth; VkFormat PipelineDepthStencilFormat = VK_FORMAT_D24_UNORM_S8_UINT; VkFormat SceneDepthStencilFormat = VK_FORMAT_D24_UNORM_S8_UINT; @@ -53,6 +54,7 @@ private: void CreateSceneDepthStencil(int width, int height, VkSampleCountFlagBits samples); void CreateSceneFog(int width, int height, VkSampleCountFlagBits samples); void CreateSceneNormal(int width, int height, VkSampleCountFlagBits samples); + void CreateSceneLinearDepth(int width, int height); VkSampleCountFlagBits GetBestSampleCount(); VulkanRenderDevice* fb = nullptr; diff --git a/src/common/rendering/vulkan/textures/vk_texture.cpp b/src/common/rendering/vulkan/textures/vk_texture.cpp index b75158f97..b10cfc948 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.cpp +++ b/src/common/rendering/vulkan/textures/vk_texture.cpp @@ -114,6 +114,10 @@ VkTextureImage* VkTextureManager::GetTexture(const PPTextureType& type, PPTextur { return &fb->GetBuffers()->SceneDepthStencil; } + else if (type == PPTextureType::SceneLinearDepth) + { + return &fb->GetBuffers()->SceneLinearDepth; + } else if (type == PPTextureType::ShadowMap) { return &Shadowmap; diff --git a/src/common/rendering/vulkan/vk_postprocess.cpp b/src/common/rendering/vulkan/vk_postprocess.cpp index ae4b93c4c..22ba1fea0 100644 --- a/src/common/rendering/vulkan/vk_postprocess.cpp +++ b/src/common/rendering/vulkan/vk_postprocess.cpp @@ -244,6 +244,17 @@ void VkPostprocess::DrawPresentTexture(const IntRect &box, bool applyGamma, bool renderstate.Draw(); } +void VkPostprocess::UpdateLinearDepthTexture() +{ + int sceneWidth = fb->GetBuffers()->GetSceneWidth(); + int sceneHeight = fb->GetBuffers()->GetSceneHeight(); + + VkPPRenderState renderstate(fb); + hw_postprocess.linearDepth.Render(&renderstate, sceneWidth, sceneHeight); + + ImageTransitionScene(false); +} + void VkPostprocess::AmbientOccludeScene(float m5) { int sceneWidth = fb->GetBuffers()->GetSceneWidth(); diff --git a/src/common/rendering/vulkan/vk_postprocess.h b/src/common/rendering/vulkan/vk_postprocess.h index 138113837..8eab87c11 100644 --- a/src/common/rendering/vulkan/vk_postprocess.h +++ b/src/common/rendering/vulkan/vk_postprocess.h @@ -26,6 +26,7 @@ public: void SetActiveRenderTarget(); void PostProcessScene(int fixedcm, float flash, const std::function &afterBloomDrawEndScene2D); + void UpdateLinearDepthTexture(); void AmbientOccludeScene(float m5); void BlurScene(float gameinfobluramount); void ClearTonemapPalette(); diff --git a/src/common/rendering/vulkan/vk_pprenderstate.cpp b/src/common/rendering/vulkan/vk_pprenderstate.cpp index 6d2cbe372..8b4a9093a 100644 --- a/src/common/rendering/vulkan/vk_pprenderstate.cpp +++ b/src/common/rendering/vulkan/vk_pprenderstate.cpp @@ -66,7 +66,7 @@ void VkPPRenderState::Draw() key.OutputFormat = fb->GetTextureManager()->GetTextureFormat(Output.Texture); else if (Output.Type == PPTextureType::SwapChain) key.OutputFormat = fb->GetFramebufferManager()->SwapChain->Format().format; - else if (Output.Type == PPTextureType::ShadowMap) + else if (Output.Type == PPTextureType::ShadowMap || Output.Type == PPTextureType::SceneLinearDepth) key.OutputFormat = VK_FORMAT_R32_SFLOAT; else key.OutputFormat = VK_FORMAT_R16G16B16A16_SFLOAT; diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 3303c78b6..c5c60406b 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -355,6 +355,12 @@ IHardwareTexture *VulkanRenderDevice::CreateHardwareTexture(int numchannels) return new VkHardwareTexture(this, numchannels); } +IHardwareTexture* VulkanRenderDevice::CreateSceneTexture(FSceneTexture* owner) +{ + mSceneTextureOwners[owner->Type] = owner; + return new VkHardwareTexture(this, owner->Type); +} + FMaterial* VulkanRenderDevice::CreateMaterial(FGameTexture* tex, int scaleflags) { return new VkMaterial(this, tex, scaleflags); @@ -535,6 +541,7 @@ void VulkanRenderDevice::BeginFrame() mTextureManager->BeginFrame(); mScreenBuffers->BeginFrame(screen->mScreenViewport.width, screen->mScreenViewport.height, screen->mSceneViewport.width, screen->mSceneViewport.height); mSaveBuffers->BeginFrame(SAVEPICWIDTH, SAVEPICHEIGHT, SAVEPICWIDTH, SAVEPICHEIGHT); + UpdateSceneTextureSizes(); mRenderState->BeginFrame(); mDescriptorSetManager->BeginFrame(); mLightmapper->BeginFrame(); @@ -622,6 +629,18 @@ void VulkanRenderDevice::SetSaveBuffers(bool yes) { if (yes) mActiveRenderBuffers = mSaveBuffers.get(); else mActiveRenderBuffers = mScreenBuffers.get(); + UpdateSceneTextureSizes(); +} + +void VulkanRenderDevice::UpdateSceneTextureSizes() +{ + for (auto& it : mSceneTextureOwners) + { + if (it.second) + { + it.second->SetSize(mActiveRenderBuffers->GetSceneWidth(), mActiveRenderBuffers->GetSceneHeight()); + } + } } void VulkanRenderDevice::ImageTransitionScene(bool unknown) @@ -634,6 +653,11 @@ FRenderState* VulkanRenderDevice::RenderState() return mRenderState.get(); } +void VulkanRenderDevice::UpdateLinearDepthTexture() +{ + mPostprocess->UpdateLinearDepthTexture(); +} + void VulkanRenderDevice::AmbientOccludeScene(float m5) { mPostprocess->AmbientOccludeScene(m5); diff --git a/src/common/rendering/vulkan/vk_renderdevice.h b/src/common/rendering/vulkan/vk_renderdevice.h index 106e36d85..414d51658 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.h +++ b/src/common/rendering/vulkan/vk_renderdevice.h @@ -63,6 +63,7 @@ public: void BeginFrame() override; void BlurScene(float amount) override; void PostProcessScene(bool swscene, int fixedcm, float flash, const std::function &afterBloomDrawEndScene2D) override; + void UpdateLinearDepthTexture() override; void AmbientOccludeScene(float m5) override; void SetSceneRenderTarget(bool useSSAO) override; void SetLevelMesh(LevelMesh* mesh) override; @@ -73,6 +74,7 @@ public: void SetActiveRenderTarget() override; IHardwareTexture *CreateHardwareTexture(int numchannels) override; + IHardwareTexture* CreateSceneTexture(FSceneTexture* owner) override; FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags) override; IBuffer* CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs) override; @@ -101,6 +103,8 @@ private: void PrintStartupLog(); void CopyScreenToBuffer(int w, int h, uint8_t *data) override; + void UpdateSceneTextureSizes(); + std::shared_ptr mDevice; std::unique_ptr mCommands; std::unique_ptr mBufferManager; @@ -117,6 +121,8 @@ private: std::unique_ptr mLightmapper; std::unique_ptr mRenderState; + std::unordered_map mSceneTextureOwners; + VkRenderBuffers *mActiveRenderBuffers = nullptr; bool mVSync = false; diff --git a/src/common/textures/texture.cpp b/src/common/textures/texture.cpp index af335ca31..40165ca56 100644 --- a/src/common/textures/texture.cpp +++ b/src/common/textures/texture.cpp @@ -574,3 +574,12 @@ FWrapperTexture::FWrapperTexture(int w, int h, int bits) SystemTextures.AddHardwareTexture(0, false, hwtex); } +//========================================================================== + +FSceneTexture::FSceneTexture(FSceneTextureType type) : Type(type) +{ + Width = 1; + Height = 1; + auto hwtex = screen->CreateSceneTexture(this); + SystemTextures.AddHardwareTexture(0, false, hwtex); +} diff --git a/src/common/textures/texturemanager.cpp b/src/common/textures/texturemanager.cpp index 1173f61be..2681c85bb 100644 --- a/src/common/textures/texturemanager.cpp +++ b/src/common/textures/texturemanager.cpp @@ -1211,6 +1211,11 @@ void FTextureManager::Init() mt = MakeGameTexture(new AnimTexture(), "AnimTextureFrame2", ETextureType::Override); mt->SetUpscaleFlag(false, true); AddGameTexture(mt); + + // Linear scene depth texture for translucent shaders + auto scenedepth = MakeGameTexture(new FSceneTexture(FSceneTextureType::LinearDepth), "SceneLinearDepth", ETextureType::Override); + scenedepth->SetUpscaleFlag(false, true); + AddGameTexture(scenedepth); } void FTextureManager::AddTextures(void (*progressFunc_)(), void (*checkForHacks)(BuildInfo&), void (*customtexturehandler)()) diff --git a/src/common/textures/textures.h b/src/common/textures/textures.h index 8fcdd3b23..b692047c5 100644 --- a/src/common/textures/textures.h +++ b/src/common/textures/textures.h @@ -268,7 +268,7 @@ public: Height = BaseTexture->GetHeight(); } - // This is only used for the null texture and for Heretic's skies. + // This is only used for the null texture, for Heretic's skies and scene textures. void SetSize(int w, int h) { Width = w; @@ -358,6 +358,20 @@ private: } }; +enum class FSceneTextureType +{ + None, + LinearDepth +}; + +// Hardware textures with data from the frame buffer +class FSceneTexture : public FTexture +{ +public: + FSceneTexture(FSceneTextureType type); + + FSceneTextureType Type = {}; +}; // A wrapper around a hardware texture, to allow using it in the 2D drawing interface. class FWrapperTexture : public FTexture diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 6ffd01147..53332b9f9 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -1126,7 +1126,10 @@ void HWDrawInfo::DrawScene(int drawmode, FRenderState& state) applySSAO = true; if (r_dithertransparency && vp.IsAllowedOoB()) { - vp.camera->tracer ? SetDitherTransFlags(vp.camera->tracer) : SetDitherTransFlags(players[consoleplayer].mo); + if (vp.camera->tracer) + SetDitherTransFlags(vp.camera->tracer); + else + SetDitherTransFlags(players[consoleplayer].mo); } } else if (drawmode == DM_OFFSCREEN) @@ -1161,6 +1164,8 @@ void HWDrawInfo::DrawScene(int drawmode, FRenderState& state) RenderScene(state); + screen->UpdateLinearDepthTexture(); + if (applySSAO && state.GetPassType() == GBUFFER_PASS) { screen->AmbientOccludeScene(VPUniforms.mProjectionMatrix.get()[5]); From 5895f9b1b134445ad78949d544a96ab5828a12bf Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 7 Sep 2024 23:09:18 -0400 Subject: [PATCH 238/414] - implement +SQUAREPIXELS flag --- src/playsim/actor.h | 1 + src/rendering/hwrenderer/scene/hw_sprites.cpp | 2 +- src/scripting/thingdef_data.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 30fdc55e8..5aa23b573 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -503,6 +503,7 @@ enum ActorRenderFlag2 RF2_CAMFOLLOWSPLAYER = 0x0040, // Matches the cam's base position and angles to the main viewpoint. RF2_NOMIPMAP = 0x0080, // [Nash] forces no mipmapping on sprites. Useful for tiny sprites that need to remain visually crisp RF2_ISOMETRICSPRITES = 0x0100, + RF2_SQUAREPIXELS = 0x0200, // apply +ROLLSPRITE scaling math so that non rolling sprites get the same scaling }; // This translucency value produces the closest match to Heretic's TINTTAB. diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index ba4b67983..05207f8c4 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -1036,7 +1036,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 * thing->isoscaleY : sprscale.Y * thing->isoscaleY); - if (thing->renderflags & (RF_ROLLSPRITE|RF_FLATSPRITE)) + if ((thing->renderflags & (RF_ROLLSPRITE|RF_FLATSPRITE)) || (thing->renderflags2 & RF2_SQUAREPIXELS)) { double ps = di->Level->pixelstretch; double mult = 1.0 / sqrt(ps); // shrink slightly diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 3993cd745..5bbb35fae 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -386,6 +386,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(RF2, CAMFOLLOWSPLAYER, AActor, renderflags2), DEFINE_FLAG(RF2, NOMIPMAP, AActor, renderflags2), DEFINE_FLAG(RF2, ISOMETRICSPRITES, AActor, renderflags2), + DEFINE_FLAG(RF2, SQUAREPIXELS, AActor, renderflags2), // Bounce flags DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags), From c62bb7a0f03284d7419991daaa58e77ebe69e989 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Sep 2024 20:32:30 +0200 Subject: [PATCH 239/414] Add RenderState.SetDepthFadeFalloff --- src/common/rendering/hwrenderer/data/hw_renderstate.h | 6 ++++++ src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h | 2 +- src/common/rendering/vulkan/shaders/vk_shader.cpp | 2 ++ src/common/rendering/vulkan/shaders/vk_shader.h | 3 ++- src/common/rendering/vulkan/vk_renderstate.cpp | 2 ++ wadsrc/static/shaders/scene/binding_rsbuffers.glsl | 2 +- wadsrc/static/shaders/scene/frag_main.glsl | 5 +++++ wadsrc/static/shaders/scene/layout_shared.glsl | 1 + 8 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 18f138682..a6804d0e4 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -193,6 +193,7 @@ public: mSurfaceUniforms.uLightFactor = 0.0f; mSurfaceUniforms.uFogDensity = 0.0f; mSurfaceUniforms.uLightLevel = -1.0f; + mSurfaceUniforms.uDepthFadeFalloff = 0.0f; mSpecialEffect = EFF_NONE; mLightIndex = -1; mBoneIndexBase = -1; @@ -263,6 +264,11 @@ public: mSurfaceUniforms.uDesaturationFactor = 0.0f; } + void SetDepthFadeFalloff(float falloff) + { + mSurfaceUniforms.uDepthFadeFalloff = falloff; + } + void SetTextureClamp(bool on) { if (on) mTextureClamp = TM_CLAMPY; diff --git a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h index 5705c9a8d..a56f953c6 100644 --- a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h @@ -44,6 +44,6 @@ struct SurfaceUniforms float uAlphaThreshold; int uTextureIndex; - float padding2; + float uDepthFadeFalloff; float padding3; }; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index b73d9ba8c..f7f84f892 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -185,6 +185,8 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (!key.AlphaTest) definesBlock << "#define NO_ALPHATEST\n"; if (key.GBufferPass) definesBlock << "#define GBUFFER_PASS\n"; + if (key.DepthFadeFalloff) definesBlock << "#define USE_DEPTHFADEFALLOFF\n"; + if (key.Simple2D) definesBlock << "#define SIMPLE2D\n"; if (key.ClampY) definesBlock << "#define TEXF_ClampY\n"; if (key.Brightmap) definesBlock << "#define TEXF_Brightmap\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 595a90299..cd68de891 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -79,7 +79,8 @@ public: uint64_t UseLevelMesh : 1; // USE_LEVELMESH uint64_t FogBalls : 1; // FOGBALLS uint64_t NoFragmentShader : 1; - uint64_t Unused : 42; + uint64_t DepthFadeFalloff : 1; + uint64_t Unused : 41; }; uint64_t AsQWORD = 0; }; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index e7836519d..75203782b 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -258,6 +258,8 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.Detailmap = (uTextureMode & TEXF_Detailmap) != 0; pipelineKey.ShaderKey.Glowmap = (uTextureMode & TEXF_Glowmap) != 0; + pipelineKey.ShaderKey.DepthFadeFalloff = mSurfaceUniforms.uDepthFadeFalloff > 0.0f; + // The way GZDoom handles state is just plain insanity! int fogset = 0; if (mFogEnabled) diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 59742e767..5356fb66d 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -68,7 +68,7 @@ struct SurfaceUniforms float uAlphaThreshold; int uTextureIndex; - float padding2; + float uDepthFadeFalloff; float padding3; }; diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index f0274aa1a..189658b36 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -27,6 +27,11 @@ void main() if (material.Base.a <= uAlphaThreshold) discard; #endif +#ifdef USE_DEPTHFADEFALLOFF + // To do: add linear depth sampling here + // material.Base.a *= clamp((depth.r - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); +#endif + FragColor = ProcessLightMode(material); #ifdef DITHERTRANS diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 882e11a42..2426f5757 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -69,6 +69,7 @@ layout(push_constant) uniform PushConstants #define uLightDist data[uDataIndex].uLightDist #define uAlphaThreshold data[uDataIndex].uAlphaThreshold #define uTextureIndex data[uDataIndex].uTextureIndex +#define uDepthFadeFalloff data[uDataIndex].uDepthFadeFalloff #define VULKAN_COORDINATE_SYSTEM #define HAS_UNIFORM_VERTEX_DATA From 8f9cc1bc6585814788305047e913de3aac1b65c5 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 9 Sep 2024 02:38:22 +0800 Subject: [PATCH 240/414] Prepare to add Actor depth fade --- src/playsim/actor.h | 1 + src/playsim/p_mobj.cpp | 1 + src/scripting/vmthunks_actors.cpp | 1 + wadsrc/static/zscript/actors/actor.zs | 12 +++++++----- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 1adccf81c..09fe25e3a 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1128,6 +1128,7 @@ public: DVector2 AutomapOffsets; // Offset the actors' sprite view on the automap by these coordinates. float isoscaleY; // Y-scale to compensate for Y-billboarding for isometric sprites float isotheta; // Rotation angle to compensate for Y-billboarding for isometric sprites + float DepthFadeFalloff; // [Nash] "soft particle" fade factor DRotator Angles; DRotator ViewAngles; // Angle offsets for cameras TObjPtr ViewPos; // Position offsets for cameras diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index e84783c33..3782e9857 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -394,6 +394,7 @@ void AActor::Serialize(FSerializer &arc) A("WorldOffset", WorldOffset) ("modelData", modelData) A("LandingSpeed", LandingSpeed) + A("DepthFadeFalloff", DepthFadeFalloff) ("unmorphtime", UnmorphTime) ("morphflags", MorphFlags) diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index acf253807..6130886ec 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2130,6 +2130,7 @@ DEFINE_FIELD(AActor, UnmorphTime) DEFINE_FIELD(AActor, MorphFlags) DEFINE_FIELD(AActor, PremorphProperties) DEFINE_FIELD(AActor, MorphExitFlash) +DEFINE_FIELD(AActor, DepthFadeFalloff) DEFINE_FIELD_X(FCheckPosition, FCheckPosition, thing); DEFINE_FIELD_X(FCheckPosition, FCheckPosition, pos); diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 2658a052f..0aa08e631 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -368,10 +368,11 @@ class Actor : Thinker native property ShadowPenaltyFactor: ShadowPenaltyFactor; property AutomapOffsets : AutomapOffsets; property LandingSpeed: LandingSpeed; - - // need some definition work first - //FRenderStyle RenderStyle; - native private int RenderStyle; // This is kept private until its real type has been implemented into the VM. But some code needs to copy this. + property DepthFadeFalloff: DepthFadeFalloff; + + // need some definition work first + //FRenderStyle RenderStyle; + native private int RenderStyle; // This is kept private until its real type has been implemented into the VM. But some code needs to copy this. //int ConversationRoot; // THe root of the current dialogue // deprecated things. @@ -457,7 +458,8 @@ class Actor : Thinker native RenderRequired 0; FriendlySeeBlocks 10; // 10 (blocks) * 128 (one map unit block) LandingSpeed -8; // landing speed from a jump with normal gravity (squats the player's view) - } + DepthFadeFalloff 0.0; // [Nash] "soft particle" fade factor +} // Functions From 166d69164dd22cb261b37486577641b4df224fa0 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 9 Sep 2024 02:53:31 +0800 Subject: [PATCH 241/414] Set the depth fade render state from sprites --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 9304e09c3..bdb6688e6 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -130,6 +130,8 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetRenderStyle(RenderStyle); state.SetTextureMode(RenderStyle); + state.SetDepthFadeFalloff(actor->DepthFadeFalloff); + if (hw_styleflags == STYLEHW_NoAlphaTest) { state.AlphaFunc(Alpha_GEqual, 0.f); @@ -325,6 +327,8 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.ClearDepthBias(); } + state.SetDepthFadeFalloff(0.0f); + // [Nash] hitbox debug if (actor && r_showhitbox) { From b8248a77446c5f7bf040ce0d2c7d9336b2d4d782 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 9 Sep 2024 03:13:46 +0800 Subject: [PATCH 242/414] Fix improper export of the DepthFadeFalloff variable --- src/playsim/actor.h | 2 +- wadsrc/static/zscript/actors/actor.zs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 09fe25e3a..840fb39af 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1128,7 +1128,7 @@ public: DVector2 AutomapOffsets; // Offset the actors' sprite view on the automap by these coordinates. float isoscaleY; // Y-scale to compensate for Y-billboarding for isometric sprites float isotheta; // Rotation angle to compensate for Y-billboarding for isometric sprites - float DepthFadeFalloff; // [Nash] "soft particle" fade factor + double DepthFadeFalloff; // [Nash] "soft particle" fade factor DRotator Angles; DRotator ViewAngles; // Angle offsets for cameras TObjPtr ViewPos; // Position offsets for cameras diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 0aa08e631..20f719bb5 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -262,6 +262,7 @@ class Actor : Thinker native native uint freezetics; native Vector2 AutomapOffsets; native double LandingSpeed; + native double DepthFadeFalloff; meta String Obituary; // Player was killed by this actor meta String HitObituary; // Player was killed by this actor in melee From cc0629493297d315cdb29a5fab72c9551f44862b Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Sep 2024 21:18:22 +0200 Subject: [PATCH 243/414] Remove linear depth from texture manager again (this wasn't a good idea) Add linear depth texture to the fixed descriptor set --- src/common/rendering/v_video.h | 2 -- .../descriptorsets/vk_descriptorset.cpp | 18 +++++++++--------- .../vulkan/textures/vk_hwtexture.cpp | 11 ----------- .../rendering/vulkan/textures/vk_hwtexture.h | 4 ---- .../rendering/vulkan/vk_renderdevice.cpp | 19 ------------------- src/common/rendering/vulkan/vk_renderdevice.h | 5 ----- src/common/textures/texture.cpp | 10 ---------- src/common/textures/texturemanager.cpp | 5 ----- src/common/textures/textures.h | 15 --------------- .../static/shaders/scene/binding_fixed.glsl | 9 +++++---- wadsrc/static/shaders/scene/frag_main.glsl | 4 ++-- 11 files changed, 16 insertions(+), 86 deletions(-) diff --git a/src/common/rendering/v_video.h b/src/common/rendering/v_video.h index 67fd1effe..9bdb2ab4b 100644 --- a/src/common/rendering/v_video.h +++ b/src/common/rendering/v_video.h @@ -103,7 +103,6 @@ protected: class IHardwareTexture; class FTexture; -class FSceneTexture; class DFrameBuffer { @@ -179,7 +178,6 @@ public: // Delete any resources that need to be deleted after restarting with a different IWAD virtual void SetTextureFilterMode() {} virtual IHardwareTexture *CreateHardwareTexture(int numchannels) { return nullptr; } - virtual IHardwareTexture* CreateSceneTexture(FSceneTexture* owner) { return nullptr; } virtual void PrecacheMaterial(FMaterial *mat, int translation) {} virtual FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags); virtual void BeginFrame() {} diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 00343c9d5..387a5a794 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -57,8 +57,6 @@ VkDescriptorSetManager::~VkDescriptorSetManager() void VkDescriptorSetManager::Init() { - UpdateFixedSet(); - RSBuffer.Set = RSBuffer.Pool->allocate(RSBuffer.Layout.get()); LevelMesh.Set = LevelMesh.Pool->allocate(LevelMesh.Layout.get()); @@ -112,15 +110,16 @@ void VkDescriptorSetManager::UpdateFixedSet() WriteDescriptors update; update.AddCombinedImageSampler(Fixed.Set.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); update.AddCombinedImageSampler(Fixed.Set.get(), 1, fb->GetTextureManager()->Lightmap.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.AddCombinedImageSampler(Fixed.Set.get(), 2, fb->GetBuffers()->SceneLinearDepth.View.get(), fb->GetSamplerManager()->Get(PPFilterMode::Nearest, PPWrapMode::Clamp), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); if (fb->IsRayQueryEnabled()) { - update.AddAccelerationStructure(Fixed.Set.get(), 2, fb->GetLevelMesh()->GetAccelStruct()); + update.AddAccelerationStructure(Fixed.Set.get(), 3, fb->GetLevelMesh()->GetAccelStruct()); } else { - update.AddBuffer(Fixed.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetNodeBuffer()); - update.AddBuffer(Fixed.Set.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetVertexBuffer()); - update.AddBuffer(Fixed.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetIndexBuffer()); + update.AddBuffer(Fixed.Set.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetNodeBuffer()); + update.AddBuffer(Fixed.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetVertexBuffer()); + update.AddBuffer(Fixed.Set.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetIndexBuffer()); } update.Execute(fb->GetDevice()); } @@ -234,15 +233,16 @@ void VkDescriptorSetManager::CreateFixedLayout() DescriptorSetLayoutBuilder builder; builder.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); if (fb->IsRayQueryEnabled()) { - builder.AddBinding(2, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(3, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); } else { - builder.AddBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); } builder.DebugName("VkDescriptorSetManager.Fixed.SetLayout"); Fixed.Layout = builder.Create(fb->GetDevice()); @@ -271,7 +271,7 @@ void VkDescriptorSetManager::CreateRSBufferPool() void VkDescriptorSetManager::CreateFixedPool() { DescriptorPoolBuilder poolbuilder; - poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 * MaxFixedSets); + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 3 * MaxFixedSets); if (fb->IsRayQueryEnabled()) { poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 * MaxFixedSets); diff --git a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp index 016afee1e..d09fc6185 100644 --- a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp +++ b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp @@ -43,12 +43,6 @@ VkHardwareTexture::VkHardwareTexture(VulkanRenderDevice* fb, int numchannels) : fb->GetTextureManager()->AddTexture(this); } -VkHardwareTexture::VkHardwareTexture(VulkanRenderDevice* fb, FSceneTextureType sceneTextureType) : fb(fb), mSceneTextureType(sceneTextureType) -{ - mTexelsize = 4; - fb->GetTextureManager()->AddTexture(this); -} - VkHardwareTexture::~VkHardwareTexture() { if (fb) @@ -72,11 +66,6 @@ void VkHardwareTexture::Reset() VkTextureImage *VkHardwareTexture::GetImage(FTexture *tex, int translation, int flags) { - if (mSceneTextureType == FSceneTextureType::LinearDepth) - { - return &fb->GetBuffers()->SceneLinearDepth; - } - if (!mImage.Image) { CreateImage(tex, translation, flags); diff --git a/src/common/rendering/vulkan/textures/vk_hwtexture.h b/src/common/rendering/vulkan/textures/vk_hwtexture.h index 1bb1e5691..19dd71dc5 100644 --- a/src/common/rendering/vulkan/textures/vk_hwtexture.h +++ b/src/common/rendering/vulkan/textures/vk_hwtexture.h @@ -21,14 +21,12 @@ class VulkanImageView; class VulkanBuffer; class VulkanRenderDevice; class FGameTexture; -enum class FSceneTextureType; class VkHardwareTexture : public IHardwareTexture { friend class VkMaterial; public: VkHardwareTexture(VulkanRenderDevice* fb, int numchannels); - VkHardwareTexture(VulkanRenderDevice* fb, FSceneTextureType sceneTextureType); ~VkHardwareTexture(); void Reset(); @@ -53,8 +51,6 @@ private: void CreateTexture(int w, int h, int pixelsize, VkFormat format, const void *pixels, bool mipmap); static int GetMipLevels(int w, int h); - FSceneTextureType mSceneTextureType = FSceneTextureType::None; - VkTextureImage mImage; int mTexelsize = 4; diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index c5c60406b..873214bb7 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -355,12 +355,6 @@ IHardwareTexture *VulkanRenderDevice::CreateHardwareTexture(int numchannels) return new VkHardwareTexture(this, numchannels); } -IHardwareTexture* VulkanRenderDevice::CreateSceneTexture(FSceneTexture* owner) -{ - mSceneTextureOwners[owner->Type] = owner; - return new VkHardwareTexture(this, owner->Type); -} - FMaterial* VulkanRenderDevice::CreateMaterial(FGameTexture* tex, int scaleflags) { return new VkMaterial(this, tex, scaleflags); @@ -541,7 +535,6 @@ void VulkanRenderDevice::BeginFrame() mTextureManager->BeginFrame(); mScreenBuffers->BeginFrame(screen->mScreenViewport.width, screen->mScreenViewport.height, screen->mSceneViewport.width, screen->mSceneViewport.height); mSaveBuffers->BeginFrame(SAVEPICWIDTH, SAVEPICHEIGHT, SAVEPICWIDTH, SAVEPICHEIGHT); - UpdateSceneTextureSizes(); mRenderState->BeginFrame(); mDescriptorSetManager->BeginFrame(); mLightmapper->BeginFrame(); @@ -629,18 +622,6 @@ void VulkanRenderDevice::SetSaveBuffers(bool yes) { if (yes) mActiveRenderBuffers = mSaveBuffers.get(); else mActiveRenderBuffers = mScreenBuffers.get(); - UpdateSceneTextureSizes(); -} - -void VulkanRenderDevice::UpdateSceneTextureSizes() -{ - for (auto& it : mSceneTextureOwners) - { - if (it.second) - { - it.second->SetSize(mActiveRenderBuffers->GetSceneWidth(), mActiveRenderBuffers->GetSceneHeight()); - } - } } void VulkanRenderDevice::ImageTransitionScene(bool unknown) diff --git a/src/common/rendering/vulkan/vk_renderdevice.h b/src/common/rendering/vulkan/vk_renderdevice.h index 414d51658..a4d9559bb 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.h +++ b/src/common/rendering/vulkan/vk_renderdevice.h @@ -74,7 +74,6 @@ public: void SetActiveRenderTarget() override; IHardwareTexture *CreateHardwareTexture(int numchannels) override; - IHardwareTexture* CreateSceneTexture(FSceneTexture* owner) override; FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags) override; IBuffer* CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs) override; @@ -103,8 +102,6 @@ private: void PrintStartupLog(); void CopyScreenToBuffer(int w, int h, uint8_t *data) override; - void UpdateSceneTextureSizes(); - std::shared_ptr mDevice; std::unique_ptr mCommands; std::unique_ptr mBufferManager; @@ -121,8 +118,6 @@ private: std::unique_ptr mLightmapper; std::unique_ptr mRenderState; - std::unordered_map mSceneTextureOwners; - VkRenderBuffers *mActiveRenderBuffers = nullptr; bool mVSync = false; diff --git a/src/common/textures/texture.cpp b/src/common/textures/texture.cpp index 40165ca56..38e0a561d 100644 --- a/src/common/textures/texture.cpp +++ b/src/common/textures/texture.cpp @@ -573,13 +573,3 @@ FWrapperTexture::FWrapperTexture(int w, int h, int bits) // todo: Initialize here. SystemTextures.AddHardwareTexture(0, false, hwtex); } - -//========================================================================== - -FSceneTexture::FSceneTexture(FSceneTextureType type) : Type(type) -{ - Width = 1; - Height = 1; - auto hwtex = screen->CreateSceneTexture(this); - SystemTextures.AddHardwareTexture(0, false, hwtex); -} diff --git a/src/common/textures/texturemanager.cpp b/src/common/textures/texturemanager.cpp index 2681c85bb..1173f61be 100644 --- a/src/common/textures/texturemanager.cpp +++ b/src/common/textures/texturemanager.cpp @@ -1211,11 +1211,6 @@ void FTextureManager::Init() mt = MakeGameTexture(new AnimTexture(), "AnimTextureFrame2", ETextureType::Override); mt->SetUpscaleFlag(false, true); AddGameTexture(mt); - - // Linear scene depth texture for translucent shaders - auto scenedepth = MakeGameTexture(new FSceneTexture(FSceneTextureType::LinearDepth), "SceneLinearDepth", ETextureType::Override); - scenedepth->SetUpscaleFlag(false, true); - AddGameTexture(scenedepth); } void FTextureManager::AddTextures(void (*progressFunc_)(), void (*checkForHacks)(BuildInfo&), void (*customtexturehandler)()) diff --git a/src/common/textures/textures.h b/src/common/textures/textures.h index b692047c5..34dbdd504 100644 --- a/src/common/textures/textures.h +++ b/src/common/textures/textures.h @@ -358,21 +358,6 @@ private: } }; -enum class FSceneTextureType -{ - None, - LinearDepth -}; - -// Hardware textures with data from the frame buffer -class FSceneTexture : public FTexture -{ -public: - FSceneTexture(FSceneTextureType type); - - FSceneTextureType Type = {}; -}; - // A wrapper around a hardware texture, to allow using it in the 2D drawing interface. class FWrapperTexture : public FTexture { diff --git a/wadsrc/static/shaders/scene/binding_fixed.glsl b/wadsrc/static/shaders/scene/binding_fixed.glsl index 387ed6d16..8bfcae2c4 100644 --- a/wadsrc/static/shaders/scene/binding_fixed.glsl +++ b/wadsrc/static/shaders/scene/binding_fixed.glsl @@ -1,10 +1,11 @@ layout(set = 0, binding = 0) uniform sampler2D ShadowMap; layout(set = 0, binding = 1) uniform sampler2DArray LightMap; +layout(set = 0, binding = 2) uniform sampler2D LinearDepth; #if defined(USE_RAYTRACE) #if defined(SUPPORTS_RAYQUERY) -layout(set = 0, binding = 2) uniform accelerationStructureEXT TopLevelAS; +layout(set = 0, binding = 3) uniform accelerationStructureEXT TopLevelAS; #else struct CollisionNode { @@ -17,7 +18,7 @@ struct CollisionNode int element_index; int padding3; }; -layout(std430, set = 0, binding = 2) buffer NodeBuffer +layout(std430, set = 0, binding = 3) buffer NodeBuffer { int nodesRoot; int nodebufferPadding1; @@ -32,7 +33,7 @@ struct SurfaceVertex // Note: this must always match the FFlatVertex struct vec2 uv; vec2 luv; }; -layout(std430, set = 0, binding = 3) buffer VertexBuffer { SurfaceVertex vertices[]; }; -layout(std430, set = 0, binding = 4) buffer ElementBuffer { int elements[]; }; +layout(std430, set = 0, binding = 4) buffer VertexBuffer { SurfaceVertex vertices[]; }; +layout(std430, set = 0, binding = 5) buffer ElementBuffer { int elements[]; }; #endif #endif diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index 189658b36..ddc844f66 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -28,8 +28,8 @@ void main() #endif #ifdef USE_DEPTHFADEFALLOFF - // To do: add linear depth sampling here - // material.Base.a *= clamp((depth.r - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); + float behindFragmentDepth = texelFetch(LinearDepth, ivec2(gl_FragCoord.xy)); + material.Base.a *= clamp((behindFragmentDepth - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); #endif FragColor = ProcessLightMode(material); From b586fe4b3d8915de1e13bf3fd75a152793a640f3 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Sep 2024 21:26:22 +0200 Subject: [PATCH 244/414] Fix shader compile error --- wadsrc/static/shaders/scene/frag_main.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index ddc844f66..71f714438 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -28,7 +28,7 @@ void main() #endif #ifdef USE_DEPTHFADEFALLOFF - float behindFragmentDepth = texelFetch(LinearDepth, ivec2(gl_FragCoord.xy)); + float behindFragmentDepth = texelFetch(LinearDepth, ivec2(gl_FragCoord.xy), 0); material.Base.a *= clamp((behindFragmentDepth - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); #endif From 827360e5e2f14d383de63bd957e5882a903a6156 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 9 Sep 2024 03:42:05 +0800 Subject: [PATCH 245/414] Fix shader compile error (for real) --- wadsrc/static/shaders/scene/frag_main.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index 71f714438..6fe89fe10 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -28,7 +28,7 @@ void main() #endif #ifdef USE_DEPTHFADEFALLOFF - float behindFragmentDepth = texelFetch(LinearDepth, ivec2(gl_FragCoord.xy), 0); + float behindFragmentDepth = texelFetch(LinearDepth, ivec2(gl_FragCoord.xy), 0).r; material.Base.a *= clamp((behindFragmentDepth - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); #endif From afcd38907c07848a0ab3b7e710d91bea833a5305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 8 Sep 2024 17:01:51 -0300 Subject: [PATCH 246/414] add SpawnMultiCoopOnly mapinfo flag to spawn **only** coop spawns in single-player --- src/gamedata/g_mapinfo.h | 2 ++ src/gamedata/g_skill.cpp | 12 +++++++++++- src/playsim/p_mobj.cpp | 5 +++-- wadsrc/static/zscript/constants.zs | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index 73b46d7e0..8f311f6a2 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -510,6 +510,7 @@ enum ESkillProperty SKILLP_PlayerRespawn, SKILLP_SpawnMulti, SKILLP_InstantReaction, + SKILLP_SpawnMultiCoopOnly, }; enum EFSkillProperty // floating point properties { @@ -555,6 +556,7 @@ struct FSkillInfo int SpawnFilter; bool SpawnMulti; bool InstantReaction; + bool SpawnMultiCoopOnly; int ACSReturn; FString MenuName; FString PicName; diff --git a/src/gamedata/g_skill.cpp b/src/gamedata/g_skill.cpp index 8a0f69fb3..e8d7849ba 100644 --- a/src/gamedata/g_skill.cpp +++ b/src/gamedata/g_skill.cpp @@ -77,6 +77,7 @@ void FMapInfoParser::ParseSkill () skill.Aggressiveness = 1.; skill.SpawnFilter = 0; skill.SpawnMulti = false; + skill.SpawnMultiCoopOnly = false; skill.InstantReaction = false; skill.ACSReturn = 0; skill.MustConfirm = false; @@ -198,6 +199,10 @@ void FMapInfoParser::ParseSkill () { skill.SpawnMulti = true; } + else if (sc.Compare ("spawnmulticooponly")) + { + skill.SpawnMultiCoopOnly = true; + } else if (sc.Compare ("InstantReaction")) { skill.InstantReaction = true; @@ -408,9 +413,13 @@ int G_SkillProperty(ESkillProperty prop) case SKILLP_SpawnMulti: return AllSkills[gameskill].SpawnMulti; - + case SKILLP_InstantReaction: return AllSkills[gameskill].InstantReaction; + + case SKILLP_SpawnMultiCoopOnly: + return AllSkills[gameskill].SpawnMultiCoopOnly; + } } return 0; @@ -550,6 +559,7 @@ FSkillInfo &FSkillInfo::operator=(const FSkillInfo &other) SpawnFilter = other.SpawnFilter; SpawnMulti = other.SpawnMulti; InstantReaction = other.InstantReaction; + SpawnMultiCoopOnly = other.SpawnMultiCoopOnly; ACSReturn = other.ACSReturn; MenuName = other.MenuName; PicName = other.PicName; diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index d216d30d8..442f101f5 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -5757,6 +5757,7 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) AActor *mobj; bool spawnmulti = G_SkillProperty(SKILLP_SpawnMulti) || !!(dmflags2 & DF2_ALWAYS_SPAWN_MULTI); + bool spawnmulti_cooponly = G_SkillProperty(SKILLP_SpawnMultiCoopOnly); if (mthing->EdNum == 0 || mthing->EdNum == -1) return NULL; @@ -5837,9 +5838,9 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) { mask = MTF_COOPERATIVE; } - else if (spawnmulti) + else if (spawnmulti || spawnmulti_cooponly) { - mask = MTF_COOPERATIVE|MTF_SINGLE; + mask = spawnmulti_cooponly ? MTF_COOPERATIVE : (MTF_COOPERATIVE|MTF_SINGLE); } else { diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index b4f2d85b7..f22204cbf 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -1024,6 +1024,7 @@ enum ESkillProperty SKILLP_PlayerRespawn, SKILLP_SpawnMulti, SKILLP_InstantReaction, + SKILLP_SpawnMultiCoopOnly, }; enum EFSkillProperty // floating point properties { From b2040a0892b69e4e52f8ea4407469eea38722b6d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Sep 2024 22:25:24 +0200 Subject: [PATCH 247/414] Add support for the poor souls on a 386 that can't afford to use full screen --- src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h | 3 +++ src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 2 ++ wadsrc/static/shaders/scene/binding_rsbuffers.glsl | 2 ++ wadsrc/static/shaders/scene/frag_main.glsl | 2 +- 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h index bdbc91707..fed7827fb 100644 --- a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h @@ -20,6 +20,9 @@ struct HWViewpointUniforms VSMatrix mNormalViewMatrix; FVector4 mCameraPos; FVector4 mClipLine; + + int mViewOffsetX = 0; + int mViewOffsetY = 0; float mGlobVis = 1.f; int mPalLightLevels = 0; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 53332b9f9..78bae4534 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -111,6 +111,8 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni VPUniforms.mProjectionMatrix.loadIdentity(); VPUniforms.mViewMatrix.loadIdentity(); VPUniforms.mNormalViewMatrix.loadIdentity(); + VPUniforms.mViewOffsetX = -screen->mSceneViewport.left; + VPUniforms.mViewOffsetY = -screen->mSceneViewport.top; VPUniforms.mViewHeight = viewheight; if (lightmode == ELightMode::Build) { diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 5356fb66d..bdddc0f4f 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -9,6 +9,8 @@ layout(set = 1, binding = 0, std140) uniform ViewpointUBO vec4 uCameraPos; vec4 uClipLine; + ivec2 uViewOffset; + float uGlobVis; // uGlobVis = R_GetGlobVis(r_visibility) / 32.0 int uPalLightLevels; int uViewHeight; // Software fuzz scaling diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index 6fe89fe10..ebaf25c66 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -28,7 +28,7 @@ void main() #endif #ifdef USE_DEPTHFADEFALLOFF - float behindFragmentDepth = texelFetch(LinearDepth, ivec2(gl_FragCoord.xy), 0).r; + float behindFragmentDepth = texelFetch(LinearDepth, uViewOffset + ivec2(gl_FragCoord.xy), 0).r; material.Base.a *= clamp((behindFragmentDepth - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); #endif From f8f4ef5cbbd61d996e4bd262cc7a459d9518ab0f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Sep 2024 22:29:41 +0200 Subject: [PATCH 248/414] And the AMD image transition fun (Thanks AMD!) --- src/common/rendering/vulkan/vk_postprocess.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/rendering/vulkan/vk_postprocess.cpp b/src/common/rendering/vulkan/vk_postprocess.cpp index 22ba1fea0..199698c7f 100644 --- a/src/common/rendering/vulkan/vk_postprocess.cpp +++ b/src/common/rendering/vulkan/vk_postprocess.cpp @@ -146,6 +146,7 @@ void VkPostprocess::ImageTransitionScene(bool undefinedSrcLayout) .AddImage(&buffers->SceneFog, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, undefinedSrcLayout) .AddImage(&buffers->SceneNormal, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, undefinedSrcLayout) .AddImage(&buffers->SceneDepthStencil, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, undefinedSrcLayout) + .AddImage(&buffers->SceneLinearDepth, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, undefinedSrcLayout) .Execute(fb->GetCommands()->GetDrawCommands()); } From f41e7f044a84efd01467211b3916d1071483bd77 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Sep 2024 23:15:48 +0200 Subject: [PATCH 249/414] Fix SceneLinearDepth texture using wrong size --- src/common/rendering/vulkan/textures/vk_renderbuffers.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index 45005cb5a..c9c602006 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -78,6 +78,12 @@ void VkRenderBuffers::BeginFrame(int width, int height, int sceneWidth, int scen if (width != mWidth || height != mHeight || mSamples != samples) CreateScene(width, height, samples); + if (sceneWidth != mSceneWidth || sceneHeight != mSceneHeight) + { + SceneLinearDepth.Reset(fb); + CreateSceneLinearDepth(std::max(sceneWidth, 1), std::max(sceneHeight, 1)); + } + mWidth = width; mHeight = height; mSamples = samples; @@ -174,13 +180,11 @@ void VkRenderBuffers::CreateScene(int width, int height, VkSampleCountFlagBits s SceneDepthStencil.Reset(fb); SceneNormal.Reset(fb); SceneFog.Reset(fb); - SceneLinearDepth.Reset(fb); CreateSceneColor(width, height, samples); CreateSceneDepthStencil(width, height, samples); CreateSceneNormal(width, height, samples); CreateSceneFog(width, height, samples); - CreateSceneLinearDepth(width, height); VkImageTransition() .AddImage(&SceneColor, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true) From 6c57283b253f9e6f87edbde50bd02ac2ecfca7f3 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Mon, 9 Sep 2024 02:08:33 +0200 Subject: [PATCH 250/414] Fix null pointer crash when there is no actor --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index bdb6688e6..b01b83bbc 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -130,7 +130,8 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetRenderStyle(RenderStyle); state.SetTextureMode(RenderStyle); - state.SetDepthFadeFalloff(actor->DepthFadeFalloff); + if (actor) + state.SetDepthFadeFalloff(actor->DepthFadeFalloff); if (hw_styleflags == STYLEHW_NoAlphaTest) { From 27058efe85207c27232eebb471af3217b65ec9b8 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 9 Sep 2024 17:06:04 +0800 Subject: [PATCH 251/414] Rename "depth fade falloff" to "depth fade threshold" as it makes more sense --- src/common/rendering/hwrenderer/data/hw_renderstate.h | 6 +++--- src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h | 2 +- src/common/rendering/vulkan/shaders/vk_shader.cpp | 2 +- src/common/rendering/vulkan/shaders/vk_shader.h | 2 +- src/common/rendering/vulkan/vk_renderstate.cpp | 2 +- src/playsim/actor.h | 2 +- src/playsim/p_mobj.cpp | 2 +- src/rendering/hwrenderer/scene/hw_sprites.cpp | 4 ++-- src/scripting/vmthunks_actors.cpp | 2 +- wadsrc/static/shaders/scene/binding_rsbuffers.glsl | 2 +- wadsrc/static/shaders/scene/frag_main.glsl | 4 ++-- wadsrc/static/shaders/scene/layout_shared.glsl | 2 +- wadsrc/static/zscript/actors/actor.zs | 6 +++--- 13 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index a6804d0e4..b407bd3e7 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -193,7 +193,7 @@ public: mSurfaceUniforms.uLightFactor = 0.0f; mSurfaceUniforms.uFogDensity = 0.0f; mSurfaceUniforms.uLightLevel = -1.0f; - mSurfaceUniforms.uDepthFadeFalloff = 0.0f; + mSurfaceUniforms.uDepthFadeThreshold = 0.0f; mSpecialEffect = EFF_NONE; mLightIndex = -1; mBoneIndexBase = -1; @@ -264,9 +264,9 @@ public: mSurfaceUniforms.uDesaturationFactor = 0.0f; } - void SetDepthFadeFalloff(float falloff) + void SetDepthFadeThreshold(float falloff) { - mSurfaceUniforms.uDepthFadeFalloff = falloff; + mSurfaceUniforms.uDepthFadeThreshold = falloff; } void SetTextureClamp(bool on) diff --git a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h index a56f953c6..9524e4f12 100644 --- a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h @@ -44,6 +44,6 @@ struct SurfaceUniforms float uAlphaThreshold; int uTextureIndex; - float uDepthFadeFalloff; + float uDepthFadeThreshold; float padding3; }; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index f7f84f892..0d1e9b730 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -185,7 +185,7 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (!key.AlphaTest) definesBlock << "#define NO_ALPHATEST\n"; if (key.GBufferPass) definesBlock << "#define GBUFFER_PASS\n"; - if (key.DepthFadeFalloff) definesBlock << "#define USE_DEPTHFADEFALLOFF\n"; + if (key.DepthFadeThreshold) definesBlock << "#define USE_DEPTHFADETHRESHOLD\n"; if (key.Simple2D) definesBlock << "#define SIMPLE2D\n"; if (key.ClampY) definesBlock << "#define TEXF_ClampY\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index cd68de891..6048a993d 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -79,7 +79,7 @@ public: uint64_t UseLevelMesh : 1; // USE_LEVELMESH uint64_t FogBalls : 1; // FOGBALLS uint64_t NoFragmentShader : 1; - uint64_t DepthFadeFalloff : 1; + uint64_t DepthFadeThreshold : 1; uint64_t Unused : 41; }; uint64_t AsQWORD = 0; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 75203782b..fdfc8fe09 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -258,7 +258,7 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.Detailmap = (uTextureMode & TEXF_Detailmap) != 0; pipelineKey.ShaderKey.Glowmap = (uTextureMode & TEXF_Glowmap) != 0; - pipelineKey.ShaderKey.DepthFadeFalloff = mSurfaceUniforms.uDepthFadeFalloff > 0.0f; + pipelineKey.ShaderKey.DepthFadeThreshold = mSurfaceUniforms.uDepthFadeThreshold > 0.0f; // The way GZDoom handles state is just plain insanity! int fogset = 0; diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 840fb39af..b9321f43d 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1128,7 +1128,7 @@ public: DVector2 AutomapOffsets; // Offset the actors' sprite view on the automap by these coordinates. float isoscaleY; // Y-scale to compensate for Y-billboarding for isometric sprites float isotheta; // Rotation angle to compensate for Y-billboarding for isometric sprites - double DepthFadeFalloff; // [Nash] "soft particle" fade factor + double DepthFadeThreshold; // [Nash] "soft particle" fade threshold in map units DRotator Angles; DRotator ViewAngles; // Angle offsets for cameras TObjPtr ViewPos; // Position offsets for cameras diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 3782e9857..40b66192d 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -394,7 +394,7 @@ void AActor::Serialize(FSerializer &arc) A("WorldOffset", WorldOffset) ("modelData", modelData) A("LandingSpeed", LandingSpeed) - A("DepthFadeFalloff", DepthFadeFalloff) + A("DepthFadeThreshold", DepthFadeThreshold) ("unmorphtime", UnmorphTime) ("morphflags", MorphFlags) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index b01b83bbc..c741e56ad 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -131,7 +131,7 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetTextureMode(RenderStyle); if (actor) - state.SetDepthFadeFalloff(actor->DepthFadeFalloff); + state.SetDepthFadeThreshold(actor->DepthFadeThreshold); if (hw_styleflags == STYLEHW_NoAlphaTest) { @@ -328,7 +328,7 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.ClearDepthBias(); } - state.SetDepthFadeFalloff(0.0f); + state.SetDepthFadeThreshold(0.0f); // [Nash] hitbox debug if (actor && r_showhitbox) diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 6130886ec..225fd8f08 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2130,7 +2130,7 @@ DEFINE_FIELD(AActor, UnmorphTime) DEFINE_FIELD(AActor, MorphFlags) DEFINE_FIELD(AActor, PremorphProperties) DEFINE_FIELD(AActor, MorphExitFlash) -DEFINE_FIELD(AActor, DepthFadeFalloff) +DEFINE_FIELD(AActor, DepthFadeThreshold) DEFINE_FIELD_X(FCheckPosition, FCheckPosition, thing); DEFINE_FIELD_X(FCheckPosition, FCheckPosition, pos); diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index bdddc0f4f..304aefc51 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -70,7 +70,7 @@ struct SurfaceUniforms float uAlphaThreshold; int uTextureIndex; - float uDepthFadeFalloff; + float uDepthFadeThreshold; float padding3; }; diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index ebaf25c66..8b30d6dbb 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -27,9 +27,9 @@ void main() if (material.Base.a <= uAlphaThreshold) discard; #endif -#ifdef USE_DEPTHFADEFALLOFF +#ifdef USE_DEPTHFADETHRESHOLD float behindFragmentDepth = texelFetch(LinearDepth, uViewOffset + ivec2(gl_FragCoord.xy), 0).r; - material.Base.a *= clamp((behindFragmentDepth - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); + material.Base.a *= clamp((behindFragmentDepth - pixelpos.w) / uDepthFadeThreshold, 0.0, 1.0); #endif FragColor = ProcessLightMode(material); diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 2426f5757..063fdaaf4 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -69,7 +69,7 @@ layout(push_constant) uniform PushConstants #define uLightDist data[uDataIndex].uLightDist #define uAlphaThreshold data[uDataIndex].uAlphaThreshold #define uTextureIndex data[uDataIndex].uTextureIndex -#define uDepthFadeFalloff data[uDataIndex].uDepthFadeFalloff +#define uDepthFadeThreshold data[uDataIndex].uDepthFadeThreshold #define VULKAN_COORDINATE_SYSTEM #define HAS_UNIFORM_VERTEX_DATA diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 20f719bb5..487d073e3 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -262,7 +262,7 @@ class Actor : Thinker native native uint freezetics; native Vector2 AutomapOffsets; native double LandingSpeed; - native double DepthFadeFalloff; + native double DepthFadeThreshold; meta String Obituary; // Player was killed by this actor meta String HitObituary; // Player was killed by this actor in melee @@ -369,7 +369,7 @@ class Actor : Thinker native property ShadowPenaltyFactor: ShadowPenaltyFactor; property AutomapOffsets : AutomapOffsets; property LandingSpeed: LandingSpeed; - property DepthFadeFalloff: DepthFadeFalloff; + property DepthFadeThreshold: DepthFadeThreshold; // need some definition work first //FRenderStyle RenderStyle; @@ -459,7 +459,7 @@ class Actor : Thinker native RenderRequired 0; FriendlySeeBlocks 10; // 10 (blocks) * 128 (one map unit block) LandingSpeed -8; // landing speed from a jump with normal gravity (squats the player's view) - DepthFadeFalloff 0.0; // [Nash] "soft particle" fade factor + DepthFadeThreshold 0.0; // [Nash] "soft particle" fade factor in map units } // Functions From 58fecd4b9256bf5b3133fe9c9b4f0f94c353eae5 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 9 Sep 2024 18:08:10 +0800 Subject: [PATCH 252/414] Move depth fade definition to GLDEFS --- src/common/rendering/hwrenderer/data/hw_renderstate.h | 5 ----- src/common/rendering/vulkan/vk_levelmesh.cpp | 2 ++ src/common/rendering/vulkan/vk_renderstate.cpp | 2 ++ src/common/textures/gametexture.h | 3 +++ src/playsim/actor.h | 1 - src/playsim/p_mobj.cpp | 1 - src/r_data/gldefs.cpp | 5 +++++ src/rendering/hwrenderer/scene/hw_sprites.cpp | 5 ----- src/scripting/vmthunks_actors.cpp | 1 - wadsrc/static/zscript/actors/actor.zs | 3 --- 10 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index b407bd3e7..d5fddf554 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -264,11 +264,6 @@ public: mSurfaceUniforms.uDesaturationFactor = 0.0f; } - void SetDepthFadeThreshold(float falloff) - { - mSurfaceUniforms.uDepthFadeThreshold = falloff; - } - void SetTextureClamp(bool on) { if (on) mTextureClamp = TM_CLAMPY; diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 5dd616a2e..0164cd9fc 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -865,10 +865,12 @@ void VkLevelMeshUploader::UploadUniforms() { auto source = material.mMaterial->Source(); surfaceUniforms.uSpecularMaterial = { source->GetGlossiness(), source->GetSpecularLevel() }; + surfaceUniforms.uDepthFadeThreshold = source->GetDepthFadeThreshold(); surfaceUniforms.uTextureIndex = Mesh->fb->GetBindlessTextureIndex(material.mMaterial, material.mClampMode, material.mTranslation); } else { + surfaceUniforms.uDepthFadeThreshold = 0.f; surfaceUniforms.uTextureIndex = 0; } } diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index fdfc8fe09..d64f5323c 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -413,9 +413,11 @@ void VkRenderState::ApplySurfaceUniforms() mSurfaceUniforms.uTextureIndex = static_cast(mMaterial.mMaterial)->GetBindlessIndex(mMaterial); mSurfaceUniforms.uSpecularMaterial = { source->GetGlossiness(), source->GetSpecularLevel() }; + mSurfaceUniforms.uDepthFadeThreshold = source->GetDepthFadeThreshold(); } else { + mSurfaceUniforms.uDepthFadeThreshold = 0.f; mSurfaceUniforms.uTextureIndex = 0; } mMaterial.mChanged = false; diff --git a/src/common/textures/gametexture.h b/src/common/textures/gametexture.h index a63dc1b37..e7b04afc2 100644 --- a/src/common/textures/gametexture.h +++ b/src/common/textures/gametexture.h @@ -118,6 +118,7 @@ class FGameTexture FVector2 detailScale = { 1.f, 1.f }; float Glossiness = 10.f; float SpecularLevel = 0.1f; + float DepthFadeThreshold = 0.0f; float shaderspeed = 1.f; int shaderindex = 0; @@ -258,6 +259,8 @@ public: float GetGlossiness() const { return Glossiness; } float GetSpecularLevel() const { return SpecularLevel; } + float GetDepthFadeThreshold() const { return DepthFadeThreshold; } + void CopySize(FGameTexture* BaseTexture, bool forfont = false) { Base->CopySize(BaseTexture->Base.get()); diff --git a/src/playsim/actor.h b/src/playsim/actor.h index b9321f43d..1adccf81c 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1128,7 +1128,6 @@ public: DVector2 AutomapOffsets; // Offset the actors' sprite view on the automap by these coordinates. float isoscaleY; // Y-scale to compensate for Y-billboarding for isometric sprites float isotheta; // Rotation angle to compensate for Y-billboarding for isometric sprites - double DepthFadeThreshold; // [Nash] "soft particle" fade threshold in map units DRotator Angles; DRotator ViewAngles; // Angle offsets for cameras TObjPtr ViewPos; // Position offsets for cameras diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 40b66192d..e84783c33 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -394,7 +394,6 @@ void AActor::Serialize(FSerializer &arc) A("WorldOffset", WorldOffset) ("modelData", modelData) A("LandingSpeed", LandingSpeed) - A("DepthFadeThreshold", DepthFadeThreshold) ("unmorphtime", UnmorphTime) ("morphflags", MorphFlags) diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index d4bc5d393..8b62885fc 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -1346,6 +1346,11 @@ class GLDefsParser sc.MustGetFloat(); mlay.SpecularLevel = (float)sc.Float; } + else if (sc.Compare("depthfadethreshold")) + { + sc.MustGetFloat(); + tex->DepthFadeThreshold = (float)sc.Float; + } else if (sc.Compare("speed")) { sc.MustGetFloat(); diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index c741e56ad..9304e09c3 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -130,9 +130,6 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetRenderStyle(RenderStyle); state.SetTextureMode(RenderStyle); - if (actor) - state.SetDepthFadeThreshold(actor->DepthFadeThreshold); - if (hw_styleflags == STYLEHW_NoAlphaTest) { state.AlphaFunc(Alpha_GEqual, 0.f); @@ -328,8 +325,6 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.ClearDepthBias(); } - state.SetDepthFadeThreshold(0.0f); - // [Nash] hitbox debug if (actor && r_showhitbox) { diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 225fd8f08..acf253807 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2130,7 +2130,6 @@ DEFINE_FIELD(AActor, UnmorphTime) DEFINE_FIELD(AActor, MorphFlags) DEFINE_FIELD(AActor, PremorphProperties) DEFINE_FIELD(AActor, MorphExitFlash) -DEFINE_FIELD(AActor, DepthFadeThreshold) DEFINE_FIELD_X(FCheckPosition, FCheckPosition, thing); DEFINE_FIELD_X(FCheckPosition, FCheckPosition, pos); diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 487d073e3..6984bcd20 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -262,7 +262,6 @@ class Actor : Thinker native native uint freezetics; native Vector2 AutomapOffsets; native double LandingSpeed; - native double DepthFadeThreshold; meta String Obituary; // Player was killed by this actor meta String HitObituary; // Player was killed by this actor in melee @@ -369,7 +368,6 @@ class Actor : Thinker native property ShadowPenaltyFactor: ShadowPenaltyFactor; property AutomapOffsets : AutomapOffsets; property LandingSpeed: LandingSpeed; - property DepthFadeThreshold: DepthFadeThreshold; // need some definition work first //FRenderStyle RenderStyle; @@ -459,7 +457,6 @@ class Actor : Thinker native RenderRequired 0; FriendlySeeBlocks 10; // 10 (blocks) * 128 (one map unit block) LandingSpeed -8; // landing speed from a jump with normal gravity (squats the player's view) - DepthFadeThreshold 0.0; // [Nash] "soft particle" fade factor in map units } // Functions From ab9c6c0f633b3ccfa7ce93e6eb01ad2dd8752199 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 9 Sep 2024 20:16:25 +0200 Subject: [PATCH 253/414] Use SSE2 for the sqrt as the other thing is super slow --- src/rendering/hwrenderer/scene/hw_clipper.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp index 09031f8d4..14062e5cd 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.cpp +++ b/src/rendering/hwrenderer/scene/hw_clipper.cpp @@ -39,6 +39,11 @@ #include "g_levellocals.h" #include "basics.h" +#if defined(__SSE2__) || defined(_M_X64) +#include +#define USE_SSE2 +#endif + //----------------------------------------------------------------------------- // // RemoveRange @@ -433,7 +438,17 @@ angle_t Clipper::PointToPseudoPitch(double x, double y, double z) } else { +#ifdef USE_SSE2 + __m128 mvecx = _mm_set_ss(vecx); + __m128 mvecy = _mm_set_ss(vecy); + __m128 mvecz = _mm_set_ss(vecz); + __m128 dot = _mm_add_ss(_mm_mul_ss(mvecx, mvecx), _mm_mul_ss(mvecy, mvecy)); + __m128 notsignbit = _mm_castsi128_ps(_mm_cvtsi32_si128(~(1 << 31))); + __m128 fabsvecz = _mm_and_ps(mvecz, notsignbit); + double result = _mm_cvtss_f32((_mm_div_ss(mvecz, _mm_add_ss(_mm_sqrt_ss(dot), fabsvecz)))); +#else double result = vecz / (g_sqrt(vecx*vecx + vecy*vecy) + fabs(vecz)); // -ffast-math compile flag applies to this file, yes? +#endif if ((vecx * viewpoint->TanCos + vecy * viewpoint->TanSin) <= 0.0) // Point is behind viewpoint { result = 2.0 - result; From aacc4d7278a62ad226a4aa3556df84ee42d59fc6 Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Mon, 9 Sep 2024 19:24:15 -0600 Subject: [PATCH 254/414] PointToPseudoPitch() was being called even when viewpoint was not allowed out of bounds. And its sqrt was slow even when it was necessary (thanks dpjudas for the speedup code). --- src/rendering/hwrenderer/scene/hw_bsp.cpp | 61 +++++++++++-------- src/rendering/hwrenderer/scene/hw_clipper.cpp | 15 +++++ 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index fafa680d4..0904a0207 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -324,25 +324,28 @@ void HWDrawInfo::AddLine (seg_t *seg, bool portalclip) return; } - auto &clipperv = *vClipper; - angle_t startPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->floorplane.ZatPoint(seg->v1)); - angle_t endPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->ceilingplane.ZatPoint(seg->v1)); - angle_t startPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->floorplane.ZatPoint(seg->v2)); - angle_t endPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->ceilingplane.ZatPoint(seg->v2)); - angle_t temp; - // Wall can be tilted from viewpoint perspective. Find vertical extent on screen in psuedopitch units (0 to 2, bottom to top) - if(int(startPitch) > int(startPitch2)) // Handle zero crossing + if (Viewpoint.IsAllowedOoB()) // No need for vertical clipping if viewpoint not allowed out of bounds { - temp = startPitch; startPitch = startPitch2; startPitch2 = temp; // exchange - } - if(int(endPitch) > int(endPitch2)) // Handle zero crossing - { - temp = endPitch; endPitch = endPitch2; endPitch2 = temp; // exchange - } + auto &clipperv = *vClipper; + angle_t startPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->floorplane.ZatPoint(seg->v1)); + angle_t endPitch = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), currentsector->ceilingplane.ZatPoint(seg->v1)); + angle_t startPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->floorplane.ZatPoint(seg->v2)); + angle_t endPitch2 = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), currentsector->ceilingplane.ZatPoint(seg->v2)); + angle_t temp; + // Wall can be tilted from viewpoint perspective. Find vertical extent on screen in psuedopitch units (0 to 2, bottom to top) + if(int(startPitch) > int(startPitch2)) // Handle zero crossing + { + temp = startPitch; startPitch = startPitch2; startPitch2 = temp; // exchange + } + if(int(endPitch) > int(endPitch2)) // Handle zero crossing + { + temp = endPitch; endPitch = endPitch2; endPitch2 = temp; // exchange + } - if (!clipperv.SafeCheckRange(startPitch, endPitch2)) - { - return; + if (!clipperv.SafeCheckRange(startPitch, endPitch2)) + { + return; + } } if (!r_radarclipper || (Level->flags3 & LEVEL3_NOFOGOFWAR) || clipperr.SafeCheckRange(startAngleR, endAngleR)) @@ -734,7 +737,7 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) int count = sub->numlines; seg_t * seg = sub->firstline; bool anglevisible = false; - bool pitchvisible = false; + bool pitchvisible = !(Viewpoint.IsAllowedOoB()); // No vertical clipping if viewpoint is not allowed out of bounds bool radarvisible = false; angle_t pitchtemp; angle_t pitchmin = ANGLE_90; @@ -751,15 +754,21 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) angle_t endAngleR = clipperr.PointToPseudoAngle(seg->v1->fX(), seg->v1->fY()); if (startAngleR-endAngleR >= ANGLE_180) radarvisible |= (clipperr.SafeCheckRange(startAngleR, endAngleR) || (Level->flags3 & LEVEL3_NOFOGOFWAR) || ((sub->flags & SSECMF_DRAWN) && !deathmatch)); - pitchmin = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->floorplane.ZatPoint(seg->v1)); - pitchmax = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->ceilingplane.ZatPoint(seg->v1)); - pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + if (!pitchvisible) + { + pitchmin = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->floorplane.ZatPoint(seg->v1)); + pitchmax = clipperv.PointToPseudoPitch(seg->v1->fX(), seg->v1->fY(), sector->ceilingplane.ZatPoint(seg->v1)); + pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + } if (pitchvisible && anglevisible && radarvisible) break; - pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->floorplane.ZatPoint(seg->v2)); - if (int(pitchmin) > int(pitchtemp)) pitchmin = pitchtemp; - pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->ceilingplane.ZatPoint(seg->v2)); - if (int(pitchmax) < int(pitchtemp)) pitchmax = pitchtemp; - pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + if (!pitchvisible) + { + pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->floorplane.ZatPoint(seg->v2)); + if (int(pitchmin) > int(pitchtemp)) pitchmin = pitchtemp; + pitchtemp = clipperv.PointToPseudoPitch(seg->v2->fX(), seg->v2->fY(), sector->ceilingplane.ZatPoint(seg->v2)); + if (int(pitchmax) < int(pitchtemp)) pitchmax = pitchtemp; + pitchvisible |= clipperv.SafeCheckRange(pitchmin, pitchmax); + } if (pitchvisible && anglevisible && radarvisible) break; } seg++; diff --git a/src/rendering/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp index 94713f107..6b256851b 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.cpp +++ b/src/rendering/hwrenderer/scene/hw_clipper.cpp @@ -39,6 +39,11 @@ #include "g_levellocals.h" #include "basics.h" +#if defined(__SSE2__) || defined(_M_X64) +#include +#define USE_SSE2 +#endif + unsigned Clipper::starttime; Clipper::Clipper() @@ -440,7 +445,17 @@ angle_t Clipper::PointToPseudoPitch(double x, double y, double z) } else { +#ifdef USE_SSE2 + __m128 mvecx = _mm_set_ss(vecx); + __m128 mvecy = _mm_set_ss(vecy); + __m128 mvecz = _mm_set_ss(vecz); + __m128 dot = _mm_add_ss(_mm_mul_ss(mvecx, mvecx), _mm_mul_ss(mvecy, mvecy)); + __m128 notsignbit = _mm_castsi128_ps(_mm_cvtsi32_si128(~(1 << 31))); + __m128 fabsvecz = _mm_and_ps(mvecz, notsignbit); + double result = _mm_cvtss_f32((_mm_div_ss(mvecz, _mm_add_ss(_mm_sqrt_ss(dot), fabsvecz)))); +#else double result = vecz / (g_sqrt(vecx*vecx + vecy*vecy) + fabs(vecz)); // -ffast-math compile flag applies to this file, yes? +#endif if ((vecx * viewpoint->TanCos + vecy * viewpoint->TanSin) <= 0.0) // Point is behind viewpoint { result = 2.0 - result; From f0c018fdc693ff1805d7ac55f5e62739a30c0608 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 11 Sep 2024 01:39:26 +0200 Subject: [PATCH 255/414] Update light level in level mesh --- .../hwrenderer/data/hw_levelmesh.cpp | 2 + .../rendering/hwrenderer/data/hw_levelmesh.h | 8 +- .../hwrenderer/data/hw_surfaceuniforms.h | 15 ++- .../descriptorsets/vk_descriptorset.cpp | 18 +-- src/common/rendering/vulkan/vk_levelmesh.cpp | 19 +++ src/common/rendering/vulkan/vk_levelmesh.h | 4 + .../rendering/vulkan/vk_renderstate.cpp | 8 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 114 +++++++++++++----- src/rendering/hwrenderer/doom_levelmesh.h | 18 ++- .../shaders/scene/binding_rsbuffers.glsl | 66 +++++++--- .../static/shaders/scene/layout_shared.glsl | 19 ++- 11 files changed, 222 insertions(+), 69 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 243f23fa1..85c6880d6 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -28,10 +28,12 @@ void LevelMesh::Reset(const LevelMeshLimits& limits) Mesh.Surfaces.Resize(limits.MaxSurfaces); Mesh.Uniforms.Resize(limits.MaxUniforms); + Mesh.LightUniforms.Resize(limits.MaxUniforms); Mesh.Materials.Resize(limits.MaxUniforms); Mesh.Lights.Resize(16); Mesh.LightIndexes.Resize(16); + Mesh.DynLights.Resize(16); Mesh.Indexes.Resize(limits.MaxIndexes); Mesh.SurfaceIndexes.Resize(limits.MaxIndexes / 3 + 1); diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 9957f4a33..578f07bce 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -34,6 +34,7 @@ struct GeometryAllocInfo struct UniformsAllocInfo { SurfaceUniforms* Uniforms = nullptr; + SurfaceLightUniforms* LightUniforms = nullptr; FMaterialState* Materials = nullptr; int Start = 0; int Count = 0; @@ -115,11 +116,13 @@ public: // Surface info TArray Surfaces; TArray Uniforms; + TArray LightUniforms; TArray Materials; TArray LightIndexes; // Lights TArray Lights; + TArray DynLights; // Index data TArray Indexes; @@ -143,8 +146,10 @@ public: TArray Surface; TArray UniformIndexes; TArray Uniforms; + TArray LightUniforms; TArray Portals; TArray Light; + TArray DynLight; TArray LightIndex; TArray DrawIndex; } UploadRanges; @@ -178,7 +183,6 @@ public: uint32_t AtlasPixelCount() const { return uint32_t(LMTextureCount * LMTextureSize * LMTextureSize); } void UpdateCollision(); - void BuildTileSurfaceLists(); void SetupTileTransforms(); void PackLightmapAtlas(int lightmapStartIndex); @@ -229,9 +233,11 @@ inline UniformsAllocInfo LevelMesh::AllocUniforms(int count) info.Start = RemoveRange(FreeLists.Uniforms, count); info.Count = count; info.Uniforms = &Mesh.Uniforms[info.Start]; + info.LightUniforms = &Mesh.LightUniforms[info.Start]; info.Materials = &Mesh.Materials[info.Start]; AddRange(UploadRanges.Uniforms, { info.Start, info.Start + info.Count }); + AddRange(UploadRanges.LightUniforms, { info.Start, info.Start + info.Count }); return info; } diff --git a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h index 9524e4f12..ad40bb137 100644 --- a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h @@ -13,11 +13,11 @@ struct SurfaceUniforms FVector4 uTextureModulateColor; FVector4 uTextureBlendColor; FVector4 uFogColor; - float uDesaturationFactor; // HWDrawInfo::SetColor + float uDesaturationFactor; float uInterpolationFactor; float timer; int useVertexData; - FVector4 uVertexColor; // HWDrawInfo::SetColor + FVector4 uVertexColor; FVector4 uVertexNormal; FVector4 uGlowTopPlane; @@ -37,7 +37,7 @@ struct SurfaceUniforms FVector2 uClipSplit; FVector2 uSpecularMaterial; - float uLightLevel; // HWDrawInfo::SetColor + float uLightLevel; float uFogDensity; float uLightFactor; float uLightDist; @@ -47,3 +47,12 @@ struct SurfaceUniforms float uDepthFadeThreshold; float padding3; }; + +struct SurfaceLightUniforms +{ + FVector4 uVertexColor; // HWDrawInfo::SetColor + float uDesaturationFactor; // HWDrawInfo::SetColor + float uLightLevel; // HWDrawInfo::SetColor + int uLightIndex; + int padding; +}; diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 387a5a794..c88b3f85a 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -90,9 +90,10 @@ void VkDescriptorSetManager::UpdateLevelMeshSet() .AddBuffer(LevelMesh.Set.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Viewpoint.UBO.get(), 0, sizeof(HWViewpointUniforms)) .AddBuffer(LevelMesh.Set.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->MatrixBuffer->UBO(), 0, sizeof(MatricesUBO)) .AddBuffer(LevelMesh.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetUniformsBuffer()) - .AddBuffer(LevelMesh.Set.get(), 3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Lightbuffer.UBO.get(), 0, sizeof(LightBufferUBO)) - .AddBuffer(LevelMesh.Set.get(), 4, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Fogballbuffer.UBO.get(), 0, sizeof(FogballBufferUBO)) - .AddBuffer(LevelMesh.Set.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, rsbuffers->Bonebuffer.SSO.get()) + .AddBuffer(LevelMesh.Set.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetLightUniformsBuffer()) + .AddBuffer(LevelMesh.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetDynLightBuffer()) + .AddBuffer(LevelMesh.Set.get(), 5, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Fogballbuffer.UBO.get(), 0, sizeof(FogballBufferUBO)) + .AddBuffer(LevelMesh.Set.get(), 6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, rsbuffers->Bonebuffer.SSO.get()) .Execute(fb->GetDevice()); } @@ -208,9 +209,10 @@ void VkDescriptorSetManager::CreateLevelMeshLayout() .AddBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) .AddBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) .AddBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) - .AddBinding(3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) - .AddBinding(4, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) - .AddBinding(5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT) + .AddBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) + .AddBinding(4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT) + .AddBinding(5, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) + .AddBinding(6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT) .DebugName("VkDescriptorSetManager.LevelMesh.Layout") .Create(fb->GetDevice()); } @@ -251,8 +253,8 @@ void VkDescriptorSetManager::CreateFixedLayout() void VkDescriptorSetManager::CreateLevelMeshPool() { LevelMesh.Pool = DescriptorPoolBuilder() - .AddPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 4) - .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2) + .AddPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 3) + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 4) .MaxSets(1) .DebugName("VkDescriptorSetManager.LevelMesh.Pool") .Create(fb->GetDevice()); diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 0164cd9fc..413cdff93 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -57,6 +57,7 @@ void VkLevelMesh::Reset() deletelist->Add(std::move(NodeBuffer)); deletelist->Add(std::move(SurfaceBuffer)); deletelist->Add(std::move(UniformsBuffer)); + deletelist->Add(std::move(LightUniformsBuffer)); deletelist->Add(std::move(SurfaceIndexBuffer)); deletelist->Add(std::move(PortalBuffer)); deletelist->Add(std::move(LightBuffer)); @@ -290,6 +291,12 @@ void VkLevelMesh::CreateBuffers() .DebugName("SurfaceUniformsBuffer") .Create(fb->GetDevice()); + LightUniformsBuffer = BufferBuilder() + .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) + .Size(Mesh->Mesh.LightUniforms.Size() * sizeof(SurfaceLightUniforms)) + .DebugName("SurfaceLightUniformsBuffer") + .Create(fb->GetDevice()); + PortalBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) .Size(Mesh->Portals.Size() * sizeof(PortalInfo)) @@ -307,6 +314,12 @@ void VkLevelMesh::CreateBuffers() .Size(Mesh->Mesh.LightIndexes.Size() * sizeof(int32_t)) .DebugName("LightIndexBuffer") .Create(fb->GetDevice()); + + DynLightBuffer = BufferBuilder() + .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) + .Size(Mesh->Mesh.DynLights.Size() * sizeof(FVector4)) + .DebugName("DynLightBuffer") + .Create(fb->GetDevice()); } VkLevelMesh::BLAS VkLevelMesh::CreateBLAS(bool preferFastBuild, int indexOffset, int indexCount) @@ -706,6 +719,8 @@ void VkLevelMeshUploader::Upload() UploadRanges(Mesh->Mesh->UploadRanges.SurfaceIndex, Mesh->Mesh->Mesh.SurfaceIndexes.Data(), Mesh->SurfaceIndexBuffer.get()); UploadRanges(Mesh->Mesh->UploadRanges.LightIndex, Mesh->Mesh->Mesh.LightIndexes.Data(), Mesh->LightIndexBuffer.get()); UploadRanges(Mesh->Mesh->UploadRanges.DrawIndex, Mesh->Mesh->Mesh.DrawIndexes.Data(), Mesh->DrawIndexBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.LightUniforms, Mesh->Mesh->Mesh.LightUniforms.Data(), Mesh->LightUniformsBuffer.get()); + UploadRanges(Mesh->Mesh->UploadRanges.DynLight, Mesh->Mesh->Mesh.DynLights.Data(), Mesh->DynLightBuffer.get()); UploadSurfaces(); UploadUniforms(); UploadPortals(); @@ -734,9 +749,11 @@ void VkLevelMeshUploader::ClearRanges() Mesh->Mesh->UploadRanges.Surface.clear(); Mesh->Mesh->UploadRanges.UniformIndexes.clear(); Mesh->Mesh->UploadRanges.Uniforms.clear(); + Mesh->Mesh->UploadRanges.LightUniforms.clear(); Mesh->Mesh->UploadRanges.Portals.clear(); Mesh->Mesh->UploadRanges.Light.clear(); Mesh->Mesh->UploadRanges.LightIndex.clear(); + Mesh->Mesh->UploadRanges.DynLight.clear(); Mesh->Mesh->UploadRanges.DrawIndex.clear(); } @@ -947,9 +964,11 @@ size_t VkLevelMeshUploader::GetTransferSize() for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.SurfaceIndex) transferBufferSize += range.Count() * sizeof(int); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Surface) transferBufferSize += range.Count() * sizeof(SurfaceInfo); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Uniforms) transferBufferSize += range.Count() * sizeof(SurfaceUniforms); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.LightUniforms) transferBufferSize += range.Count() * sizeof(SurfaceLightUniforms); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Portals) transferBufferSize += range.Count() * sizeof(PortalInfo); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.LightIndex) transferBufferSize += range.Count() * sizeof(int32_t); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Light) transferBufferSize += range.Count() * sizeof(LightInfo); + for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.DynLight) transferBufferSize += range.Count() * sizeof(FVector4); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.DrawIndex) transferBufferSize += range.Count() * sizeof(uint32_t); return transferBufferSize; } diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index 1d8e8382a..1a70de15f 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -96,6 +96,8 @@ public: VulkanBuffer* GetSurfaceIndexBuffer() { return SurfaceIndexBuffer.get(); } VulkanBuffer* GetSurfaceBuffer() { return SurfaceBuffer.get(); } VulkanBuffer* GetUniformsBuffer() { return UniformsBuffer.get(); } + VulkanBuffer* GetLightUniformsBuffer() { return LightUniformsBuffer.get(); } + VulkanBuffer* GetDynLightBuffer() { return DynLightBuffer.get(); } VulkanBuffer* GetPortalBuffer() { return PortalBuffer.get(); } VulkanBuffer* GetLightBuffer() { return LightBuffer.get(); } VulkanBuffer* GetLightIndexBuffer() { return LightIndexBuffer.get(); } @@ -145,9 +147,11 @@ private: std::unique_ptr SurfaceIndexBuffer; std::unique_ptr SurfaceBuffer; std::unique_ptr UniformsBuffer; + std::unique_ptr LightUniformsBuffer; std::unique_ptr PortalBuffer; std::unique_ptr LightBuffer; std::unique_ptr LightIndexBuffer; + std::unique_ptr DynLightBuffer; std::unique_ptr DrawIndexBuffer; std::unique_ptr NodeBuffer; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index d64f5323c..3ee0d446e 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -941,21 +941,19 @@ void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip mPipelineKey = pipelineKey; PushConstants pushConstants = {}; - pushConstants.uDataIndex = 0; - pushConstants.uLightIndex = -1; pushConstants.uBoneIndexBase = -1; + pushConstants.uFogballIndex = -1; VulkanPipelineLayout* layout = fb->GetRenderPassManager()->GetPipelineLayout(pipelineKey.ShaderKey.UseLevelMesh); uint32_t viewpointOffset = mViewpointOffset; uint32_t matrixOffset = mRSBuffers->MatrixBuffer->Offset(); - uint32_t lightsOffset = 0; uint32_t fogballsOffset = 0; - uint32_t offsets[] = { viewpointOffset, matrixOffset, lightsOffset, fogballsOffset }; + uint32_t offsets[] = { viewpointOffset, matrixOffset, fogballsOffset }; auto descriptors = fb->GetDescriptorSetManager(); cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, mPassSetup->GetPipeline(pipelineKey)); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptors->GetFixedSet()); - cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetLevelMeshSet(), 4, offsets); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetLevelMeshSet(), 3, offsets); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, descriptors->GetBindlessSet()); cmdbuffer->pushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &pushConstants); } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 471b5b03c..2b205f870 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -220,20 +220,34 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) // To do: we don't need to always do this. UpdateLevelMesh should tell us when polyobjs move. for (side_t* side : PolySides) { - UpdateSide(side->Index()); + UpdateSide(side->Index(), SurfaceUpdateType::Full); } for (int sideIndex : SideUpdateList) { - CreateSide(doomMap, sideIndex); - Sides[sideIndex].InUpdateList = false; + if (Sides[sideIndex].UpdateType == SurfaceUpdateType::LightsOnly) + { + SetSideLights(doomMap, sideIndex); + } + else // SurfaceUpdateType::Full + { + CreateSide(doomMap, sideIndex); + } + Sides[sideIndex].UpdateType = SurfaceUpdateType::None; } SideUpdateList.Clear(); for (int flatIndex : FlatUpdateList) { - CreateFlat(doomMap, flatIndex); - Flats[flatIndex].InUpdateList = false; + if (Flats[flatIndex].UpdateType == SurfaceUpdateType::LightsOnly) + { + SetFlatLights(doomMap, flatIndex); + } + else // SurfaceUpdateType::Full + { + CreateFlat(doomMap, flatIndex); + } + Flats[flatIndex].UpdateType = SurfaceUpdateType::None; } FlatUpdateList.Clear(); @@ -490,65 +504,63 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) void DoomLevelMesh::FloorHeightChanged(struct sector_t* sector) { - UpdateFlat(sector->Index()); + UpdateFlat(sector->Index(), SurfaceUpdateType::Full); for (line_t* line : sector->Lines) { if (line->sidedef[0]) - UpdateSide(line->sidedef[0]->Index()); + UpdateSide(line->sidedef[0]->Index(), SurfaceUpdateType::Full); if (line->sidedef[1]) - UpdateSide(line->sidedef[1]->Index()); + UpdateSide(line->sidedef[1]->Index(), SurfaceUpdateType::Full); } } void DoomLevelMesh::CeilingHeightChanged(struct sector_t* sector) { - UpdateFlat(sector->Index()); + UpdateFlat(sector->Index(), SurfaceUpdateType::Full); for (line_t* line : sector->Lines) { if (line->sidedef[0]) - UpdateSide(line->sidedef[0]->Index()); + UpdateSide(line->sidedef[0]->Index(), SurfaceUpdateType::Full); if (line->sidedef[1]) - UpdateSide(line->sidedef[1]->Index()); + UpdateSide(line->sidedef[1]->Index(), SurfaceUpdateType::Full); } } void DoomLevelMesh::MidTex3DHeightChanged(struct sector_t* sector) { - // UpdateFlat(sector->Index()); + // UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } void DoomLevelMesh::FloorTextureChanged(struct sector_t* sector) { - UpdateFlat(sector->Index()); + UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } void DoomLevelMesh::CeilingTextureChanged(struct sector_t* sector) { - UpdateFlat(sector->Index()); + UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } void DoomLevelMesh::SectorChangedOther(struct sector_t* sector) { - UpdateFlat(sector->Index()); + UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) { - UpdateSide(side->Index()); + UpdateSide(side->Index(), SurfaceUpdateType::Full); } void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) { - /* - UpdateFlat(level, sector->Index()); + UpdateFlat(sector->Index(), SurfaceUpdateType::LightsOnly); for (line_t* line : sector->Lines) { if (line->frontsector == sector && line->sidedef[0]) - UpdateSide(line->sidedef[0]->Index()); + UpdateSide(line->sidedef[0]->Index(), SurfaceUpdateType::LightsOnly); else if (line->sidedef[1]) - UpdateSide(line->sidedef[1]->Index()); + UpdateSide(line->sidedef[1]->Index(), SurfaceUpdateType::LightsOnly); } - */ } void DoomLevelMesh::SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) @@ -559,21 +571,21 @@ void DoomLevelMesh::SectorLightThinkerDestroyed(struct sector_t* sector, class D { } -void DoomLevelMesh::UpdateSide(unsigned int sideIndex) +void DoomLevelMesh::UpdateSide(unsigned int sideIndex, SurfaceUpdateType updateType) { - if (!Sides[sideIndex].InUpdateList) + if (Sides[sideIndex].UpdateType == SurfaceUpdateType::None) { SideUpdateList.Push(sideIndex); - Sides[sideIndex].InUpdateList = true; + Sides[sideIndex].UpdateType = updateType; } } -void DoomLevelMesh::UpdateFlat(unsigned int sectorIndex) +void DoomLevelMesh::UpdateFlat(unsigned int sectorIndex, SurfaceUpdateType updateType) { - if (!Flats[sectorIndex].InUpdateList) + if (Flats[sectorIndex].UpdateType == SurfaceUpdateType::None) { FlatUpdateList.Push(sectorIndex); - Flats[sectorIndex].InUpdateList = true; + Flats[sectorIndex].UpdateType = updateType; } } @@ -682,6 +694,42 @@ void DoomLevelMesh::CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) } } +void DoomLevelMesh::SetSideLights(FLevelLocals& doomMap, unsigned int sideIndex) +{ + for (UniformsAllocInfo& uinfo : Sides[sideIndex].Uniforms) + { + for (int i = 0, count = uinfo.Count; i < count; i++) + { + // To do: calculate this correctly (see HWDrawInfo::SetColor) + // uinfo.LightUniforms[i].uVertexColor + // uinfo.LightUniforms[i].uDesaturationFactor + if (uinfo.LightUniforms[i].uLightLevel >= 0.0f) + { + uinfo.LightUniforms[i].uLightLevel = clamp(doomMap.sides[sideIndex].sector->lightlevel * (1.0f / 255.0f), 0.0f, 1.0f); + } + } + AddRange(UploadRanges.LightUniforms, { uinfo.Start, uinfo.Start + uinfo.Count }); + } +} + +void DoomLevelMesh::SetFlatLights(FLevelLocals& doomMap, unsigned int sectorIndex) +{ + for (UniformsAllocInfo& uinfo : Flats[sectorIndex].Uniforms) + { + for (int i = 0, count = uinfo.Count; i < count; i++) + { + // To do: calculate this correctly (see HWDrawInfo::SetColor) + // uinfo.LightUniforms[i].uVertexColor + // uinfo.LightUniforms[i].uDesaturationFactor + if (uinfo.LightUniforms[i].uLightLevel >= 0.0f) + { + uinfo.LightUniforms[i].uLightLevel = clamp(doomMap.sectors[sectorIndex].lightlevel * (1.0f / 255.0f), 0.0f, 1.0f); + } + } + AddRange(UploadRanges.LightUniforms, { uinfo.Start, uinfo.Start + uinfo.Count }); + } +} + void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sideIndex) { for (HWWall& wallpart : list) @@ -771,6 +819,13 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh *(uinfo.Uniforms++) = applyState.surfaceUniforms; *(uinfo.Materials++) = applyState.material; + + uinfo.LightUniforms->uVertexColor = applyState.surfaceUniforms.uVertexColor; + uinfo.LightUniforms->uDesaturationFactor = applyState.surfaceUniforms.uDesaturationFactor; + uinfo.LightUniforms->uLightLevel = applyState.surfaceUniforms.uLightLevel; + uinfo.LightUniforms->uLightIndex = -1; + uinfo.LightUniforms++; + uniformsIndex++; } @@ -1051,6 +1106,11 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state *uinfo.Uniforms = *uniforms; *uinfo.Materials = *material; + uinfo.LightUniforms->uVertexColor = uniforms->uVertexColor; + uinfo.LightUniforms->uDesaturationFactor = uniforms->uDesaturationFactor; + uinfo.LightUniforms->uLightLevel = uniforms->uLightLevel; + uinfo.LightUniforms->uLightIndex = -1; + int uniformsIndex = uinfo.Start; int vertIndex = ginfo.VertexStart; int elementIndex = ginfo.IndexStart; diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 75f4edfe1..3f6263d9d 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -54,6 +54,13 @@ struct DrawRangeInfo int DrawIndexCount = 0; }; +enum SurfaceUpdateType +{ + None, + LightsOnly, + Full +}; + struct SideSurfaceBlock { int FirstSurface = -1; @@ -62,7 +69,7 @@ struct SideSurfaceBlock TArray WallPortals; bool InSidePortalsList = false; TArray DrawRanges; - bool InUpdateList = false; + SurfaceUpdateType UpdateType = SurfaceUpdateType::None; }; struct FlatSurfaceBlock @@ -71,7 +78,7 @@ struct FlatSurfaceBlock TArray Geometries; TArray Uniforms; TArray DrawRanges; - bool InUpdateList = false; + SurfaceUpdateType UpdateType = SurfaceUpdateType::None; }; class DoomLevelMesh : public LevelMesh, public UpdateLevelMesh @@ -129,12 +136,15 @@ private: void CreateSurfaces(FLevelLocals& doomMap); void CreateLightList(FLevelLocals& doomMap, int surfaceIndex); - void UpdateSide(unsigned int sideIndex); - void UpdateFlat(unsigned int sectorIndex); + void UpdateSide(unsigned int sideIndex, SurfaceUpdateType updateType); + void UpdateFlat(unsigned int sectorIndex, SurfaceUpdateType updateType); void CreateSide(FLevelLocals& doomMap, unsigned int sideIndex); void CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex); + void SetSideLights(FLevelLocals& doomMap, unsigned int sideIndex); + void SetFlatLights(FLevelLocals& doomMap, unsigned int sectorIndex); + void FreeSide(FLevelLocals& doomMap, unsigned int sideIndex); void FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex); diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 304aefc51..289385a05 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -28,7 +28,7 @@ layout(set = 1, binding = 1, std140) uniform MatricesUBO mat4 TextureMatrix; }; -// This must match the SurfaceUniforms struct +// This must match the C++ SurfaceUniforms struct struct SurfaceUniforms { vec4 uObjectColor; @@ -74,22 +74,13 @@ struct SurfaceUniforms float padding3; }; -#ifdef USE_LEVELMESH -layout(set = 1, binding = 2, std430) buffer SurfaceUniformsSSO +struct SurfaceLightUniforms { - SurfaceUniforms data[]; -}; -#else -layout(set = 1, binding = 2, std140) uniform SurfaceUniformsUBO -{ - SurfaceUniforms data[MAX_SURFACE_UNIFORMS]; -}; -#endif - -// light buffers -layout(set = 1, binding = 3, std140) uniform LightBufferUBO -{ - vec4 lights[MAX_LIGHT_DATA]; + vec4 uVertexColor; + float uDesaturationFactor; + float uLightLevel; + uint uLightIndex; + uint padding; }; struct Fogball @@ -100,6 +91,47 @@ struct Fogball float fog; }; +#ifdef USE_LEVELMESH + +layout(set = 1, binding = 2, std430) buffer SurfaceUniformsSSO +{ + SurfaceUniforms data[]; +}; + +layout(set = 1, binding = 3, std430) buffer SurfaceLightUniformsSSO +{ + SurfaceLightUniforms lightdata[]; +}; + +layout(set = 1, binding = 4, std430) buffer LightBufferSSO +{ + vec4 lights[]; +}; + +layout(set = 1, binding = 5, std140) uniform FogballBufferUBO +{ + Fogball fogballs[MAX_FOGBALL_DATA]; +}; + +// bone matrix buffers +layout(set = 1, binding = 6, std430) buffer BoneBufferSSO +{ + mat4 bones[]; +}; + +#else + +layout(set = 1, binding = 2, std140) uniform SurfaceUniformsUBO +{ + SurfaceUniforms data[MAX_SURFACE_UNIFORMS]; +}; + +// light buffers +layout(set = 1, binding = 3, std140) uniform LightBufferUBO +{ + vec4 lights[MAX_LIGHT_DATA]; +}; + layout(set = 1, binding = 4, std140) uniform FogballBufferUBO { Fogball fogballs[MAX_FOGBALL_DATA]; @@ -110,3 +142,5 @@ layout(set = 1, binding = 5, std430) buffer BoneBufferSSO { mat4 bones[]; }; + +#endif diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 063fdaaf4..56cafd54a 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -7,11 +7,12 @@ layout(push_constant) uniform PushConstants { #if defined(USE_LEVELMESH) - int unused; + int unused0; + int unused1; #else int uDataIndex; // surfaceuniforms index -#endif int uLightIndex; // dynamic lights +#endif int uBoneIndexBase; // bone animation int uFogballIndex; // fog balls }; @@ -45,11 +46,9 @@ layout(push_constant) uniform PushConstants #define uTextureModulateColor data[uDataIndex].uTextureModulateColor #define uTextureAddColor data[uDataIndex].uTextureAddColor #define uFogColor data[uDataIndex].uFogColor -#define uDesaturationFactor data[uDataIndex].uDesaturationFactor #define uInterpolationFactor data[uDataIndex].uInterpolationFactor #define timer data[uDataIndex].timer #define useVertexData data[uDataIndex].useVertexData -#define uVertexColor data[uDataIndex].uVertexColor #define uVertexNormal data[uDataIndex].uVertexNormal #define uGlowTopPlane data[uDataIndex].uGlowTopPlane #define uGlowTopColor data[uDataIndex].uGlowTopColor @@ -63,7 +62,6 @@ layout(push_constant) uniform PushConstants #define uNpotEmulation data[uDataIndex].uNpotEmulation #define uClipSplit data[uDataIndex].uClipSplit #define uSpecularMaterial data[uDataIndex].uSpecularMaterial -#define uLightLevel data[uDataIndex].uLightLevel #define uFogDensity data[uDataIndex].uFogDensity #define uLightFactor data[uDataIndex].uLightFactor #define uLightDist data[uDataIndex].uLightDist @@ -71,6 +69,17 @@ layout(push_constant) uniform PushConstants #define uTextureIndex data[uDataIndex].uTextureIndex #define uDepthFadeThreshold data[uDataIndex].uDepthFadeThreshold +#if defined(USE_LEVELMESH) +#define uVertexColor lightdata[uDataIndex].uVertexColor +#define uDesaturationFactor lightdata[uDataIndex].uDesaturationFactor +#define uLightLevel lightdata[uDataIndex].uLightLevel +#define uLightIndex lightdata[uDataIndex].uLightIndex +#else +#define uVertexColor data[uDataIndex].uVertexColor +#define uDesaturationFactor data[uDataIndex].uDesaturationFactor +#define uLightLevel data[uDataIndex].uLightLevel +#endif + #define VULKAN_COORDINATE_SYSTEM #define HAS_UNIFORM_VERTEX_DATA From d96dd8e7ba4476a7df205f3a9cbc09b2cb133cda Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 11 Sep 2024 01:58:34 +0200 Subject: [PATCH 256/414] Fix using wrong location for the light update --- src/rendering/hwrenderer/doom_levelmesh.cpp | 22 ++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 2b205f870..bc3097fae 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -556,9 +556,9 @@ void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) UpdateFlat(sector->Index(), SurfaceUpdateType::LightsOnly); for (line_t* line : sector->Lines) { - if (line->frontsector == sector && line->sidedef[0]) + if (line->sidedef[0] && line->sidedef[0]->sector == sector) UpdateSide(line->sidedef[0]->Index(), SurfaceUpdateType::LightsOnly); - else if (line->sidedef[1]) + else if (line->sidedef[1] && line->sidedef[1]->sector == sector) UpdateSide(line->sidedef[1]->Index(), SurfaceUpdateType::LightsOnly); } } @@ -788,6 +788,10 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh UniformsAllocInfo uinfo = AllocUniforms(numUniforms); SurfaceAllocInfo sinfo = AllocSurface(); + SurfaceUniforms* curUniforms = uinfo.Uniforms; + SurfaceLightUniforms* curLightUniforms = uinfo.LightUniforms; + FMaterialState* curMaterial = uinfo.Materials; + int pipelineID = 0; int uniformsIndex = uinfo.Start; int vertIndex = ginfo.VertexStart; @@ -817,14 +821,14 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh } } - *(uinfo.Uniforms++) = applyState.surfaceUniforms; - *(uinfo.Materials++) = applyState.material; + *(curUniforms++) = applyState.surfaceUniforms; + *(curMaterial++) = applyState.material; - uinfo.LightUniforms->uVertexColor = applyState.surfaceUniforms.uVertexColor; - uinfo.LightUniforms->uDesaturationFactor = applyState.surfaceUniforms.uDesaturationFactor; - uinfo.LightUniforms->uLightLevel = applyState.surfaceUniforms.uLightLevel; - uinfo.LightUniforms->uLightIndex = -1; - uinfo.LightUniforms++; + curLightUniforms->uVertexColor = applyState.surfaceUniforms.uVertexColor; + curLightUniforms->uDesaturationFactor = applyState.surfaceUniforms.uDesaturationFactor; + curLightUniforms->uLightLevel = applyState.surfaceUniforms.uLightLevel; + curLightUniforms->uLightIndex = -1; + curLightUniforms++; uniformsIndex++; } From 77519332e8ed232619417ebbf6eb01e4b58236f5 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 11 Sep 2024 07:18:07 -0400 Subject: [PATCH 257/414] - deactivate appimage for now, don't have enough interest looking into what's causing it to fail --- {.github => .github-inactive}/workflows/appimage.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {.github => .github-inactive}/workflows/appimage.yml (100%) diff --git a/.github/workflows/appimage.yml b/.github-inactive/workflows/appimage.yml similarity index 100% rename from .github/workflows/appimage.yml rename to .github-inactive/workflows/appimage.yml From a663d97961e736a56d362c1b09622114cb4504ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Wed, 14 Aug 2024 04:53:49 -0300 Subject: [PATCH 258/414] load id24res if present --- src/d_iwad.cpp | 37 ++++++++++++++++++++++++++++---- src/d_main.h | 3 +++ wadsrc_extra/static/iwadinfo.txt | 20 +++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 7f9bc60fe..3ad6ed004 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -111,6 +111,12 @@ void FIWadManager::ParseIWadInfo(const char *fn, const char *data, int datasize, iwad->prio = sc.Number; } } + else if (sc.Compare("SupportWAD")) + { + sc.MustGetStringName("="); + sc.MustGetString(); + iwad->SupportWAD = sc.String; + } else if (sc.Compare("Config")) { sc.MustGetStringName("="); @@ -562,6 +568,18 @@ void FIWadManager::ValidateIWADs() static bool havepicked = false; + +FString FIWadManager::IWADPathFileSearch(const FString &file) +{ + for(const FString &path : mSearchPaths) + { + FString f = path + "/" + file; + if(FileExists(f)) return f; + } + + return ""; +} + int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char *iwad, const char *zdoom_wad, const char *optional_wad) { const char *iwadparm = Args->CheckValue ("-iwad"); @@ -802,11 +820,11 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char D_AddFile (wadfiles, zdoom_wad, true, -1, GameConfig); // [SP] Load non-free assets if available. This must be done before the IWAD. - int iwadnum; + int iwadnum = 1; if (D_AddFile(wadfiles, optional_wad, true, -1, GameConfig)) - iwadnum = 2; - else - iwadnum = 1; + { + iwadnum++; + } fileSystem.SetIwadNum(iwadnum); if (picks[pick].mRequiredPath.IsNotEmpty()) @@ -818,6 +836,17 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char fileSystem.SetMaxIwadNum(iwadnum); auto info = mIWadInfos[picks[pick].mInfoIndex]; + + if(info.SupportWAD.IsNotEmpty()) + { + FString supportWAD = IWADPathFileSearch(info.SupportWAD); + + if(supportWAD.IsNotEmpty()) + { + D_AddFile(wadfiles, supportWAD.GetChars(), true, -1, GameConfig); + } + } + // Load additional resources from the same directory as the IWAD itself. for (unsigned i=0; i < info.Load.Size(); i++) { diff --git a/src/d_main.h b/src/d_main.h index 49e9846be..0d4a33079 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -76,6 +76,7 @@ struct FIWADInfo FString Name; // Title banner text for this IWAD FString Autoname; // Name of autoload ini section for this IWAD FString IWadname; // Default name this game would use - this is for IWAD detection in GAMEINFO. + FString SupportWAD; // Optional support WAD, load if present (initially implemented for id24) int prio = 0; // selection priority for given IWAD name. FString Configname; // Name of config section for this IWAD FString Required; // Requires another IWAD @@ -133,7 +134,9 @@ class FIWadManager void CollectSearchPaths(); void AddIWADCandidates(const char *dir); void ValidateIWADs(); + FString IWADPathFileSearch(const FString &file); public: + FIWadManager(const char *fn, const char *fnopt); const FIWADInfo *FindIWAD(std::vector& wadfiles, const char *iwad, const char *basewad, const char *optionalwad); const FString *GetAutoname(unsigned int num) const diff --git a/wadsrc_extra/static/iwadinfo.txt b/wadsrc_extra/static/iwadinfo.txt index 8eb7f1522..985df8b5d 100644 --- a/wadsrc_extra/static/iwadinfo.txt +++ b/wadsrc_extra/static/iwadinfo.txt @@ -338,6 +338,7 @@ IWad "DMENUPIC", "M_ACPT", "M_CAN", "M_EXITO", "M_CHG" BannerColors = "54 54 54", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -356,6 +357,7 @@ IWad Load = "extras.wad" BannerColors = "00 7c 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -374,6 +376,7 @@ IWad Load = "extras.wad", "soundtrack" BannerColors = "00 7c 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -388,6 +391,7 @@ IWad MustContain = "SMOOSHED", "ANIMDEFS", "LANGUAGE", "MAPINFO", "ENDOOM", "M_DOOM", "TITLEPIC", "TEXTURES" BannerColors = "a8 00 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -404,6 +408,7 @@ IWad "DPHOOF","BFGGA0","HEADA1","CYBRA1","SPIDA1D1", "E4M2", "E1M10", "SEWERS" BannerColors = "18 18 18", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -420,6 +425,7 @@ IWad "DPHOOF","BFGGA0","HEADA1","CYBRA1","SPIDA1D1", "E4M2" BannerColors = "54 54 54", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -436,6 +442,7 @@ IWad "DPHOOF","BFGGA0","HEADA1","CYBRA1","SPIDA1D1" BannerColors = "54 54 54", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -449,6 +456,7 @@ IWad MustContain = "E1M1" BannerColors = "54 54 54", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -463,6 +471,7 @@ IWad MustContain = "MAP01", "REDTNT2", "DMAPINFO" BannerColors = "00 7c 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -478,6 +487,7 @@ IWad BannerColors = "a8 00 00", "a8 a8 a8" Load = "extras.wad" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -492,6 +502,7 @@ IWad MustContain = "MAP01", "REDTNT2" BannerColors = "a8 00 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -506,6 +517,7 @@ IWad MustContain = "MAP01", "CAMO1", "DMAPINFO" BannerColors = "00 7c 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -521,6 +533,7 @@ IWad BannerColors = "a8 00 00", "a8 a8 a8" Load = "extras.wad" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -535,6 +548,7 @@ IWad MustContain = "MAP01", "CAMO1" BannerColors = "a8 00 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -550,6 +564,7 @@ IWad BannerColors = "a8 00 00", "a8 a8 a8" Load = "nerve.wad" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } IWad @@ -565,6 +580,7 @@ IWad BannerColors = "00 7c 00", "a8 a8 a8" IgnoreTitlePatches = 1 Load = "extras.wad" + SupportWAD = "id24res.wad" } IWad @@ -580,6 +596,7 @@ IWad BannerColors = "00 7c 00", "a8 a8 a8" IgnoreTitlePatches = 1 Load = "nerveunity.wad", "extras.wad", "soundtrack" + SupportWAD = "id24res.wad" } IWad @@ -596,6 +613,7 @@ IWad IgnoreTitlePatches = 1 Load = "nerve.wad" DeleteLumps = "M_EPI1", "M_EPI2", "M_EPISOD" + SupportWAD = "id24res.wad" } IWad @@ -609,6 +627,7 @@ IWad Compatibility = "Shorttex", "nosectionmerge" MustContain = "MAP01", "WIOBJ" BannerColors = "ff ff ff", "a8 00 00" + SupportWAD = "id24res.wad" } // Doom 2 must be last to be checked because MAP01 is its only requirement @@ -624,6 +643,7 @@ IWad MustContain = "MAP01" BannerColors = "a8 00 00", "a8 a8 a8" IgnoreTitlePatches = 1 + SupportWAD = "id24res.wad" } From ce24849adf2a0a94db1e073abb3e6bb67507158f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 19 Aug 2024 15:00:27 +0600 Subject: [PATCH 259/414] Add support for fire textures in ANIMDEFS --- src/CMakeLists.txt | 1 + src/common/textures/firetexture.cpp | 139 +++++++++++++++++++++++++++ src/common/textures/firetexture.h | 17 ++++ src/gamedata/textures/animations.cpp | 110 +++++++++++++++++++++ src/gamedata/textures/animations.h | 10 ++ 5 files changed, 277 insertions(+) create mode 100644 src/common/textures/firetexture.cpp create mode 100644 src/common/textures/firetexture.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 37d5d4839..789bea954 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1022,6 +1022,7 @@ set (PCH_SOURCES common/textures/multipatchtexturebuilder.cpp common/textures/skyboxtexture.cpp common/textures/animtexture.cpp + common/textures/firetexture.cpp common/textures/v_collection.cpp common/textures/formats/automaptexture.cpp common/textures/formats/brightmaptexture.cpp diff --git a/src/common/textures/firetexture.cpp b/src/common/textures/firetexture.cpp new file mode 100644 index 000000000..4a89622f7 --- /dev/null +++ b/src/common/textures/firetexture.cpp @@ -0,0 +1,139 @@ +/* +** firetexture.cpp +** PSX/N64-style fire texture implementation +** +**--------------------------------------------------------------------------- +** Copyright Cacodemon345 2024 +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +/* Algorithm based on https://github.com/fabiensanglard/DoomFirePSX */ + +#include "bitmap.h" +#include "firetexture.h" +#include "m_random.h" +#include "imagehelpers.h" + +#include "engineerrors.h" + +static constexpr int32_t FIRESKY_W = 64; +static constexpr int32_t FIRESKY_H = 128; + +FireTexture::FireTexture() +{ + SetSize(FIRESKY_W, FIRESKY_H); + Image.Clear(); + Image.AppendFill(0, Width * Height); +} + +void FireTexture::SetPalette(TArray& colors) +{ + Palette.Clear(); + Palette.Append(colors); + + /* This shouldn't happen in any circumstances. */ + if (Palette.Size() > 256) + { + I_FatalError("Fire palette too big!"); + } + + for (unsigned int i = 0; i < Width; i++) { + Image[(Height - 1) * Width + i] = (uint8_t)(Palette.Size() - 1); + } +} + +void FireTexture::Update() +{ + for (unsigned int y = 1; y < Height; y++) + { + for (unsigned int x = 0; x < Width; x++) + { + uint8_t srcPixel = Image[y * Width + x]; + + if (srcPixel == 0) + { + Image[(y - 1) * Width + x] = 0; + } + else + { + int XRand = M_Random() & 3; + int destRand = M_Random() & 1; + + Image[(y - 1) * Width + ((x + 1 - XRand) % Width)] = srcPixel - destRand; + } + } + } +} + +FBitmap FireTexture::GetBgraBitmap(const PalEntry* remap, int* trans) +{ + FBitmap bitmap; + bitmap.Create(Width, Height); + uint32_t* pixels = (uint32_t*)bitmap.GetPixels(); + + for (unsigned int y = 0; y < Height; y++) + { + for (unsigned int x = 0; x < Width; x++) + { + pixels[y * Width + x] = Palette[Image[y * Width + x]]; + } + } + + return bitmap; +} + +TArray FireTexture::Get8BitPixels(bool alphatex) +{ + FBitmap bitmap = GetBgraBitmap(nullptr, nullptr); + const uint8_t* data = bitmap.GetPixels(); + + uint8_t* dest_p; + int dest_adv = Height; + int dest_rew = Width * Height - 1; + + TArray Pixels(Width * Height); + dest_p = Pixels.Data(); + + bool doalpha = alphatex; + // Convert the source image from row-major to column-major format and remap it + for (int y = Height; y != 0; --y) + { + for (int x = Width; x != 0; --x) + { + int b = *data++; + int g = *data++; + int r = *data++; + int a = *data++; + if (a < 128) *dest_p = 0; + else *dest_p = ImageHelpers::RGBToPalette(doalpha, r, g, b); + dest_p += dest_adv; + } + dest_p -= dest_rew; + } + return Pixels; +} diff --git a/src/common/textures/firetexture.h b/src/common/textures/firetexture.h new file mode 100644 index 000000000..3ea6d967d --- /dev/null +++ b/src/common/textures/firetexture.h @@ -0,0 +1,17 @@ +#pragma once + +#include "textures.h" + + +class FireTexture : public FTexture +{ + TArray Image; + TArray Palette; + +public: + FireTexture(); + void SetPalette(TArray& colors); + void Update(); + virtual FBitmap GetBgraBitmap(const PalEntry* remap, int* trans) override; + virtual TArray Get8BitPixels(bool alphatex) override; +}; \ No newline at end of file diff --git a/src/gamedata/textures/animations.cpp b/src/gamedata/textures/animations.cpp index d40f2c7c5..6df649789 100644 --- a/src/gamedata/textures/animations.cpp +++ b/src/gamedata/textures/animations.cpp @@ -62,7 +62,12 @@ static FRandom pr_animatepictures ("AnimatePics"); void FTextureAnimator::DeleteAll() { + for (unsigned int i = 0; i < mFireTextures.Size(); i++) + { + mFireTextures[i].texture->CleanHardwareData(true); + } mAnimations.Clear(); + mFireTextures.Clear(); for (unsigned i = 0; i < mSwitchDefs.Size(); i++) { @@ -348,6 +353,10 @@ void FTextureAnimator::InitAnimDefs () TexMan.GameTexture(picnum)->SetSkyOffset(sc.Number); } } + else if (sc.Compare("firetexture")) + { + ParseFireTexture (sc); + } else { sc.ScriptError (NULL); @@ -782,6 +791,84 @@ void FTextureAnimator::ParseCameraTexture(FScanner &sc) viewer->SetDisplaySize((float)fitwidth, (float)fitheight); } +void FTextureAnimator::ParseFireTexture(FScanner& sc) +{ + FString picname; + FFireTexture fireTexture; + TArray palette; + uint32_t duration; + + sc.MustGetString(); + picname = sc.String; + sc.MustGetStringName("tics"); + sc.MustGetValue(true); + duration = uint32_t(sc.Float * 1000 / TICRATE); + + FGameTexture* gametex = MakeGameTexture(new FireTexture(), picname.GetChars(), ETextureType::Wall); + // No decals here. + gametex->SetNoDecals(true); + if (sc.GetString()) + { + if (sc.Compare("allowdecals")) + { + gametex->SetNoDecals(false); + } + else + { + sc.UnGet(); + } + } + while (sc.GetString()) + { + if (sc.Compare("color")) + { + uint8_t r, g, b, a; + sc.MustGetValue(false); + r = sc.Number; + sc.MustGetValue(false); + g = sc.Number; + sc.MustGetValue(false);; + b = sc.Number; + sc.MustGetValue(false); + a = sc.Number; + palette.Push(PalEntry(a, r, g, b)); + if (a != 255 && a != 0); + gametex->SetTranslucent(true); + + if (palette.Size() > 256) + { + sc.ScriptError("Too many colors specified!"); + } + } + else if (sc.Compare("palette")) + { + uint8_t index = 0; + sc.MustGetValue(false); + index = sc.Number; + PalEntry pal = GPalette.BaseColors[index]; + pal.a = pal.isBlack() ? 0 : 255; + palette.Push(pal); + + if (palette.Size() > 256) + { + sc.ScriptError("Too many colors specified!"); + } + } + else + { + sc.UnGet(); + break; + } + } + + fireTexture.texture = gametex; + fireTexture.Duration = duration; + fireTexture.SwitchTime = 0; + static_cast(gametex->GetTexture())->SetPalette(palette); + mFireTextures.Push(fireTexture); + TexMan.AddGameTexture(gametex); +} + //========================================================================== // // FTextureAnimator :: FixAnimations @@ -1040,6 +1127,29 @@ FTextureID FTextureAnimator::UpdateStandaloneAnimation(FStandaloneAnimation &ani void FTextureAnimator::UpdateAnimations (uint64_t mstime) { + for (unsigned int i = 0; i < mFireTextures.Size(); i++) + { + FFireTexture* fire = &mFireTextures[i]; + bool updated = false; + + if (fire->SwitchTime == 0) + { + fire->SwitchTime = mstime + fire->Duration; + } + else while (fire->SwitchTime <= mstime) + { + static_cast(fire->texture->GetTexture())->Update(); + fire->SwitchTime = mstime + fire->Duration; + updated = true; + } + + if (updated) + { + fire->texture->CleanHardwareData(); + delete fire->texture->GetSoftwareTexture(); + fire->texture->SetSoftwareTexture(nullptr); + } + } for (unsigned int j = 0; j < mAnimations.Size(); ++j) { FAnimDef *anim = &mAnimations[j]; diff --git a/src/gamedata/textures/animations.h b/src/gamedata/textures/animations.h index aa6b00e4e..1b3a11dbc 100644 --- a/src/gamedata/textures/animations.h +++ b/src/gamedata/textures/animations.h @@ -5,6 +5,7 @@ #include "textureid.h" #include "tarray.h" #include "s_soundinternal.h" +#include "firetexture.h" struct FStandaloneAnimation { @@ -17,6 +18,13 @@ struct FStandaloneAnimation static_assert(sizeof(FStandaloneAnimation) == sizeof(uint64_t)*2); +struct FFireTexture +{ + uint32_t Duration; // Duration before updates. + uint64_t SwitchTime; // Absolute time before update. + FGameTexture* texture; +}; + struct FAnimDef { struct FAnimFrame @@ -77,6 +85,7 @@ class FTextureAnimator TArray mAnimations; TArray mSwitchDefs; TArray mAnimatedDoors; + TArray mFireTextures; void ParseAnim(FScanner& sc, ETextureType usetype); FAnimDef* ParseRangeAnim(FScanner& sc, FTextureID picnum, ETextureType usetype, bool missing); @@ -84,6 +93,7 @@ class FTextureAnimator void ParseWarp(FScanner& sc); void ParseCanvasTexture(FScanner& sc); void ParseCameraTexture(FScanner& sc); + void ParseFireTexture(FScanner& sc); FTextureID ParseFramenum(FScanner& sc, FTextureID basepicnum, ETextureType usetype, bool allowMissing); void ParseTime(FScanner& sc, uint32_t& min, uint32_t& max); From 38290b6615848c0c52ff8b71051869fce5153fbe Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 12 Sep 2024 00:25:52 +0600 Subject: [PATCH 260/414] Truecolor sky: Draw opaque black background on transparent texels Fixes HOM effect --- src/common/textures/image.cpp | 3 ++- src/gamedata/textures/animations.cpp | 5 ++++- src/rendering/swrenderer/drawers/r_draw_sky32.h | 16 ++++++++++++++++ .../swrenderer/drawers/r_draw_sky32_sse2.h | 16 ++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/common/textures/image.cpp b/src/common/textures/image.cpp index 83f7450eb..95ee7d23c 100644 --- a/src/common/textures/image.cpp +++ b/src/common/textures/image.cpp @@ -306,7 +306,8 @@ void FImageSource::EndPrecaching() void FImageSource::RegisterForPrecache(FImageSource *img, bool requiretruecolor) { - img->CollectForPrecache(precacheInfo, requiretruecolor); + if (img) + img->CollectForPrecache(precacheInfo, requiretruecolor); } //========================================================================== diff --git a/src/gamedata/textures/animations.cpp b/src/gamedata/textures/animations.cpp index 6df649789..7b7a1049b 100644 --- a/src/gamedata/textures/animations.cpp +++ b/src/gamedata/textures/animations.cpp @@ -1146,7 +1146,10 @@ void FTextureAnimator::UpdateAnimations (uint64_t mstime) if (updated) { fire->texture->CleanHardwareData(); - delete fire->texture->GetSoftwareTexture(); + + if (fire->texture->GetSoftwareTexture()) + delete fire->texture->GetSoftwareTexture(); + fire->texture->SetSoftwareTexture(nullptr); } } diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32.h b/src/rendering/swrenderer/drawers/r_draw_sky32.h index ea9dff4f7..ab11948bd 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32.h @@ -64,6 +64,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; dest += pitch; frac += fracstep; } @@ -90,6 +92,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; @@ -110,6 +114,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; frac += fracstep; dest += pitch; @@ -121,6 +127,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; @@ -189,6 +197,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -222,6 +232,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); @@ -245,6 +257,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -262,6 +276,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h index bc2411b83..739bf298e 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h @@ -64,6 +64,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; dest += pitch; frac += fracstep; } @@ -90,6 +92,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); @@ -108,6 +112,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; frac += fracstep; dest += pitch; @@ -119,6 +125,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); @@ -173,6 +181,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -218,6 +228,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); @@ -241,6 +253,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -258,6 +272,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); From ed39413532ad13c6e875c3b9b73047cbdff2ab11 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 12 Sep 2024 08:47:00 +0200 Subject: [PATCH 261/414] Render the bottom sky layer always with full opacity in the SW true color renderer. No need to add explicit checks for color (0,0,0,0) here. --- .../swrenderer/drawers/r_draw_sky32.h | 24 +++++++------------ .../swrenderer/drawers/r_draw_sky32_sse2.h | 24 +++++++------------ 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32.h b/src/rendering/swrenderer/drawers/r_draw_sky32.h index ab11948bd..5a1d0ec53 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32.h @@ -64,8 +64,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; - if (*dest == 0) - *dest |= 0xff000000; + *dest |= 0xff000000; dest += pitch; frac += fracstep; } @@ -92,8 +91,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; @@ -114,8 +112,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; - if (*dest == 0) - *dest |= 0xff000000; + *dest |= 0xff000000; frac += fracstep; dest += pitch; @@ -127,8 +124,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; @@ -197,8 +193,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } *dest = fg; @@ -232,8 +227,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); @@ -257,8 +251,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } *dest = fg; @@ -276,8 +269,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h index 739bf298e..487ac924c 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h @@ -64,8 +64,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; - if (*dest == 0) - *dest |= 0xff000000; + *dest |= 0xff000000; dest += pitch; frac += fracstep; } @@ -92,8 +91,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); @@ -112,8 +110,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; - if (*dest == 0) - *dest |= 0xff000000; + *dest |= 0xff000000; frac += fracstep; dest += pitch; @@ -125,8 +122,7 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); @@ -181,8 +177,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } *dest = fg; @@ -228,8 +223,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); @@ -253,8 +247,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } *dest = fg; @@ -272,8 +265,7 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; - if (fg == 0) - fg |= 0xff000000; + fg |= 0xff000000; } __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); From 98e58bf340675c9265b67c70c65f9e9f6ad149c8 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Fri, 13 Sep 2024 02:21:03 +0200 Subject: [PATCH 262/414] Create images and buffers needed for finding dynamic light visibility on the GPU --- .../vulkan/textures/vk_renderbuffers.cpp | 45 +++++++++++++++++++ .../vulkan/textures/vk_renderbuffers.h | 5 +++ 2 files changed, 50 insertions(+) diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index c9c602006..a3ccf6946 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -78,6 +78,12 @@ void VkRenderBuffers::BeginFrame(int width, int height, int sceneWidth, int scen if (width != mWidth || height != mHeight || mSamples != samples) CreateScene(width, height, samples); + if (width != mWidth || height != mHeight) + { + CreateSceneZMinMax(width, height); + CreateSceneLightTiles(width, height); + } + if (sceneWidth != mSceneWidth || sceneHeight != mSceneHeight) { SceneLinearDepth.Reset(fb); @@ -273,6 +279,45 @@ void VkRenderBuffers::CreateSceneLinearDepth(int width, int height) .Create(fb->GetDevice()); } +void VkRenderBuffers::CreateSceneZMinMax(int width, int height) +{ + width = (width + 63) / 64 * 64; + height = (height + 63) / 64 * 64; + + for (int i = 4; i >= 0; i--) + { + width >>= 1; + height >>= 1; + + SceneZMinMax[i].Image = ImageBuilder() + .Size(width, height) + .Format(VK_FORMAT_R32G32_SFLOAT) + .Usage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT) + .DebugName("VkRenderBuffers.SceneZMinMax") + .Create(fb->GetDevice()); + + SceneZMinMax[i].View = ImageViewBuilder() + .Image(SceneZMinMax[i].Image.get(), VK_FORMAT_R32G32_SFLOAT) + .DebugName("VkRenderBuffers.SceneZMinMaxView") + .Create(fb->GetDevice()); + } +} + +void VkRenderBuffers::CreateSceneLightTiles(int width, int height) +{ + width = (width + 63) / 64; + height = (height + 63) / 64; + + // Make room for 16 lights plus the lightdata header + size_t blockSize = (1 + 3 * 16) * sizeof(FVector4); + + SceneLightTiles = BufferBuilder() + .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) + .Size(width * height * blockSize) + .DebugName("VkRenderBuffers.SceneLightTiles") + .Create(fb->GetDevice()); +} + void VkRenderBuffers::CreateSceneNormal(int width, int height, VkSampleCountFlagBits samples) { ImageBuilder builder; diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.h b/src/common/rendering/vulkan/textures/vk_renderbuffers.h index 2a22dd10a..e90bb36e7 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.h +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.h @@ -36,6 +36,9 @@ public: VkTextureImage SceneFog; VkTextureImage SceneLinearDepth; + VkTextureImage SceneZMinMax[5]; + std::unique_ptr SceneLightTiles; + VkFormat PipelineDepthStencilFormat = VK_FORMAT_D24_UNORM_S8_UINT; VkFormat SceneDepthStencilFormat = VK_FORMAT_D24_UNORM_S8_UINT; VkFormat SceneNormalFormat = VK_FORMAT_A2R10G10B10_UNORM_PACK32; @@ -55,6 +58,8 @@ private: void CreateSceneFog(int width, int height, VkSampleCountFlagBits samples); void CreateSceneNormal(int width, int height, VkSampleCountFlagBits samples); void CreateSceneLinearDepth(int width, int height); + void CreateSceneZMinMax(int width, int height); + void CreateSceneLightTiles(int width, int height); VkSampleCountFlagBits GetBestSampleCount(); VulkanRenderDevice* fb = nullptr; From 4b2cdd375a9271006372de00fe5cea0f89e403be Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Fri, 13 Sep 2024 16:56:55 +0800 Subject: [PATCH 263/414] Enable `DisableAlphaTest` feature inside Material blocks. Needed for some custom materials that need to do stuff with the material alpha. --- src/r_data/gldefs.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index 8b62885fc..fc8d5961c 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -1361,6 +1361,12 @@ class GLDefsParser sc.MustGetString(); usershader.shader = sc.String; } + else if (sc.Compare("disablealphatest")) + { + tex->SetTranslucent(true); + if (usershader.shader.IsNotEmpty()) + usershader.disablealphatest = true; + } else if (sc.Compare("texture")) { sc.MustGetString(); From 17d7006d72069942a9a05168d9d1efe48c53e369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 10 Sep 2024 23:10:08 -0300 Subject: [PATCH 264/414] replace naive interpolation logic with more exact logic --- src/playsim/actor.h | 4 ++-- src/playsim/p_actionfunctions.cpp | 12 ++++++++--- src/r_data/models.cpp | 33 +++++++++++++++++-------------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 5aa23b573..37e9eb645 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -702,8 +702,8 @@ enum EViewPosFlags // [MC] Flags for SetViewPos. enum EAnimOverrideFlags { - ANIMOVERRIDE_NONE = 1 << 0, // no animation - ANIMOVERRIDE_LOOP = 1 << 1, // animation loops, otherwise it stays on the last frame once it ends + ANIMOVERRIDE_NONE = 1 << 0, // no animation + ANIMOVERRIDE_LOOP = 1 << 1, // animation loops, otherwise it stays on the last frame once it ends }; struct AnimOverride diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index 4a647af4e..1612c7516 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5128,7 +5128,7 @@ enum ESetAnimationFlags SAF_NOOVERRIDE = 1 << 2, }; -extern double getCurrentFrame(const AnimOverride &anim, double tic); +extern double getCurrentFrame(const AnimOverride &anim, double tic, bool *looped); void SetAnimationInternal(AActor * self, FName animName, double framerate, int startFrame, int loopFrame, int endFrame, int interpolateTics, int flags, double ticFrac) { @@ -5218,7 +5218,13 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s if(!(flags & SAF_INSTANT)) { - self->modelData->prevAnim.startFrame = getCurrentFrame(self->modelData->prevAnim, tic); + bool looped = false; + self->modelData->prevAnim.startFrame = getCurrentFrame(self->modelData->prevAnim, tic, &looped); + + if(!looped) + { + self->modelData->prevAnim.flags &= ~ANIMOVERRIDE_LOOP; + } int startTic = floor(tic) + interpolateTics; self->modelData->curAnim.startTic = startTic; @@ -5272,7 +5278,7 @@ void SetAnimationFrameRateInternal(AActor * self, double framerate, double ticFr return; } - double frame = getCurrentFrame(self->modelData->curAnim, tic); + double frame = getCurrentFrame(self->modelData->curAnim, tic, nullptr); self->modelData->curAnim.startFrame = frame; self->modelData->curAnim.startTic = tic; diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 866e538c3..3c2ed56d7 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -258,7 +258,7 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translatio renderer->EndDrawHUDModel(playermo->RenderStyle, smf_flags); } -double getCurrentFrame(const AnimOverride &anim, double tic) +double getCurrentFrame(const AnimOverride &anim, double tic, bool *looped) { if(anim.framerate <= 0) return anim.startFrame; @@ -268,6 +268,7 @@ double getCurrentFrame(const AnimOverride &anim, double tic) if((anim.flags & ANIMOVERRIDE_LOOP) && frame >= duration) { + if(looped) *looped = true; frame = frame - duration; return fmod(frame, anim.lastFrame - anim.loopFrame) + anim.loopFrame; } @@ -277,15 +278,26 @@ double getCurrentFrame(const AnimOverride &anim, double tic) } } -static void calcFrame(const AnimOverride &anim, double tic, double &inter, int &prev, int &next) +static void fixFrame(const AnimOverride &anim, double frame, double &inter, int &prev, int &next, bool looped) { - double frame = getCurrentFrame(anim, tic); - prev = int(floor(frame)); + int startFrame = (looped ? anim.startFrame : anim.loopFrame); + + if(prev < startFrame) prev = anim.lastFrame; + inter = frame - prev; next = int(ceil(frame)); + + if(next > anim.lastFrame) next = startFrame; +} + +static void calcFrame(const AnimOverride &anim, double tic, double &inter, int &prev, int &next) +{ + bool looped = false; + double frame = getCurrentFrame(anim, tic, &looped); + fixFrame(anim, frame, inter, prev, next, looped); } void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpriteModelFrame *smf, const FState *curState, const int curTics, FTranslationID translation, AActor* actor) @@ -325,17 +337,8 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr { inter = (tic - (actor->modelData->curAnim.startTic - actor->modelData->curAnim.switchOffset)) / actor->modelData->curAnim.switchOffset; - double nextFrame = actor->modelData->curAnim.startFrame; - - double prevFrame = actor->modelData->prevAnim.startFrame; - - decoupled_next_prev_frame = floor(nextFrame); - decoupled_next_frame = ceil(nextFrame); - inter_next = nextFrame - floor(nextFrame); - - decoupled_main_prev_frame = floor(prevFrame); - decoupled_main_frame = ceil(prevFrame); - inter_main = prevFrame - floor(prevFrame); + fixFrame(actor->modelData->curAnim, actor->modelData->curAnim.startFrame, inter_next, decoupled_next_prev_frame, decoupled_next_frame, false); + fixFrame(actor->modelData->prevAnim, actor->modelData->prevAnim.startFrame, inter_main, decoupled_main_prev_frame, decoupled_main_frame, actor->modelData->prevAnim.flags & ANIMOVERRIDE_LOOP); } else { From b1318e4b22c15eb08f402e0a55b6bf4046e75e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 13 Sep 2024 12:12:15 -0300 Subject: [PATCH 265/414] quick fix for interpolation, TODO better fix --- src/playsim/p_actionfunctions.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index 1612c7516..bfed28fcb 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5176,9 +5176,23 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s return; } + + if(self->modelData->curAnim.startTic > tic) + { // force instant switch if interpolating + flags |= SAF_INSTANT; + } + if(!(flags & SAF_INSTANT)) { self->modelData->prevAnim = self->modelData->curAnim; + + bool looped = false; + self->modelData->prevAnim.startFrame = getCurrentFrame(self->modelData->prevAnim, tic, &looped); + + if(!looped) + { + self->modelData->prevAnim.flags &= ~ANIMOVERRIDE_LOOP; + } } int animEnd = mdl->FindLastFrame(animName); @@ -5218,14 +5232,6 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s if(!(flags & SAF_INSTANT)) { - bool looped = false; - self->modelData->prevAnim.startFrame = getCurrentFrame(self->modelData->prevAnim, tic, &looped); - - if(!looped) - { - self->modelData->prevAnim.flags &= ~ANIMOVERRIDE_LOOP; - } - int startTic = floor(tic) + interpolateTics; self->modelData->curAnim.startTic = startTic; self->modelData->curAnim.switchOffset = startTic - tic; From a23581be3db51a549de258bf03000179eb88f35e Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 13 Sep 2024 19:49:10 +0200 Subject: [PATCH 266/414] Add support for textureLod --- wadsrc/static/shaders/scene/layout_frag.glsl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/wadsrc/static/shaders/scene/layout_frag.glsl b/wadsrc/static/shaders/scene/layout_frag.glsl index 925436afd..0cf2b01e0 100644 --- a/wadsrc/static/shaders/scene/layout_frag.glsl +++ b/wadsrc/static/shaders/scene/layout_frag.glsl @@ -41,6 +41,11 @@ vec4 textureGrad(int index, vec2 P, vec2 dPdx, vec2 dPdy) return textureGrad(textures[uTextureIndex + index], P, dPdx, dPdy); } +vec4 textureLod(int index, vec2 P, float lod) +{ + return textureLod(textures[uTextureIndex + index], P, lod); +} + vec4 texelFetch(int index, ivec2 P, int lod) { return texelFetch(textures[uTextureIndex + index], P, lod); From 2ba2c24f6bc15c9c804fc93f3fab74256ff8ac13 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 13 Sep 2024 20:45:36 +0200 Subject: [PATCH 267/414] Add shaders for light tiles --- .../descriptorsets/vk_descriptorset.cpp | 2 +- .../rendering/vulkan/shaders/vk_shader.cpp | 27 ++++++++++++ .../rendering/vulkan/shaders/vk_shader.h | 12 ++++++ .../static/shaders/scene/comp_lighttiles.glsl | 43 +++++++++++++++++++ .../static/shaders/scene/frag_zminmax0.glsl | 17 ++++++++ .../static/shaders/scene/frag_zminmax1.glsl | 16 +++++++ wadsrc/static/shaders/scene/vert_zminmax.glsl | 14 ++++++ 7 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 wadsrc/static/shaders/scene/comp_lighttiles.glsl create mode 100644 wadsrc/static/shaders/scene/frag_zminmax0.glsl create mode 100644 wadsrc/static/shaders/scene/frag_zminmax1.glsl create mode 100644 wadsrc/static/shaders/scene/vert_zminmax.glsl diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index c88b3f85a..9a73a3297 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -91,7 +91,7 @@ void VkDescriptorSetManager::UpdateLevelMeshSet() .AddBuffer(LevelMesh.Set.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->MatrixBuffer->UBO(), 0, sizeof(MatricesUBO)) .AddBuffer(LevelMesh.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetUniformsBuffer()) .AddBuffer(LevelMesh.Set.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetLightUniformsBuffer()) - .AddBuffer(LevelMesh.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetDynLightBuffer()) + .AddBuffer(LevelMesh.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBuffers()->SceneLightTiles.get()) .AddBuffer(LevelMesh.Set.get(), 5, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Fogballbuffer.UBO.get(), 0, sizeof(FogballBufferUBO)) .AddBuffer(LevelMesh.Set.get(), 6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, rsbuffers->Bonebuffer.SSO.get()) .Execute(fb->GetDevice()); diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 0d1e9b730..d5f916f95 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -32,6 +32,33 @@ VkShaderManager::VkShaderManager(VulkanRenderDevice* fb) : fb(fb) { + ZMinMax.vert = ShaderBuilder() + .Type(ShaderType::Vertex) + .DebugName("ZMinMax.vert") + .AddSource("VersionBlock", GetVersionBlock().GetChars()) + .AddSource("shaders/scene/vert_zminmax.glsl", LoadPrivateShaderLump("shaders/scene/vert_zminmax.glsl").GetChars()) + .Create("ZMinMax.vert", fb->GetDevice()); + + ZMinMax.frag[0] = ShaderBuilder() + .Type(ShaderType::Fragment) + .DebugName("ZMinMax0.frag") + .AddSource("VersionBlock", GetVersionBlock().GetChars()) + .AddSource("shaders/scene/frag_zminmax0.glsl", LoadPrivateShaderLump("shaders/scene/frag_zminmax0.glsl").GetChars()) + .Create("ZMinMax0.frag", fb->GetDevice()); + + ZMinMax.frag[1] = ShaderBuilder() + .Type(ShaderType::Fragment) + .DebugName("ZMinMax1.frag") + .AddSource("VersionBlock", GetVersionBlock().GetChars()) + .AddSource("shaders/scene/frag_zminmax1.glsl", LoadPrivateShaderLump("shaders/scene/frag_zminmax1.glsl").GetChars()) + .Create("ZMinMax1.frag", fb->GetDevice()); + + LightTiles = ShaderBuilder() + .Type(ShaderType::Compute) + .DebugName("LightTiles.comp") + .AddSource("VersionBlock", GetVersionBlock().GetChars()) + .AddSource("shaders/scene/comp_lighttiles.glsl", LoadPrivateShaderLump("shaders/scene/comp_lighttiles.glsl").GetChars()) + .Create("LightTiles.comp", fb->GetDevice()); } VkShaderManager::~VkShaderManager() diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 6048a993d..5e2230630 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -119,6 +119,10 @@ public: void AddVkPPShader(VkPPShader* shader); void RemoveVkPPShader(VkPPShader* shader); + VulkanShader* GetZMinMaxVertexShader() { return ZMinMax.vert.get(); } + VulkanShader* GetZMinMaxFragmentShader(int index) { return ZMinMax.frag[index].get(); } + VulkanShader* GetLightTilesShader() { return LightTiles.get(); } + private: std::unique_ptr LoadVertShader(FString shadername, const char *vert_lump, const char *defines, bool levelmesh); std::unique_ptr LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *lightmodel_lump, const char *defines, const VkShaderKey& key); @@ -134,4 +138,12 @@ private: std::map programs; std::list PPShaders; + + struct + { + std::unique_ptr vert; + std::unique_ptr frag[2]; + } ZMinMax; + + std::unique_ptr LightTiles; }; diff --git a/wadsrc/static/shaders/scene/comp_lighttiles.glsl b/wadsrc/static/shaders/scene/comp_lighttiles.glsl new file mode 100644 index 000000000..38dae0930 --- /dev/null +++ b/wadsrc/static/shaders/scene/comp_lighttiles.glsl @@ -0,0 +1,43 @@ +layout(local_size_x = 32, local_size_y = 32) in; +layout(binding = 0, rg32f) readonly uniform image2D zminmax; + +layout(binding = 1) readonly buffer Lights +{ + vec4 lights[]; +}; + +layout(binding = 1) buffer Tiles +{ + vec4 tiles[]; +}; + +layout(push_constant) uniform PushConstants +{ + int normalLightCount; + int modulatedLightCount; + int subtractiveLightCount; +}; + +void main() +{ + ivec2 zminmaxSize = imageSize(zminmax); + ivec2 tilePos = ivec2(gl_GlobalInvocationID.xy); + if (tilePos.x >= zminmaxSize.x || tilePos.y >= zminmaxSize.y) + return; + + const int maxLights = 16; + const int lightSize = 3; + int tileOffset = (tilePos.x + tilePos.y * zminmaxSize.x) * (1 + maxLights * lightSize); + + vec2 minmax = imageLoad(zminmax, tilePos).xy; + float zmin = minmax.x; + float zmax = minmax.y; + + int tileNormalCount = 0; + int tileModulatedCount = 0; + int tileSubtractiveCount = 0; + + // To do: cull and add lights + + tiles[tileOffset] = vec4(ivec4(tileNormalCount, tileModulatedCount, tileSubtractiveCount, 0)); +} diff --git a/wadsrc/static/shaders/scene/frag_zminmax0.glsl b/wadsrc/static/shaders/scene/frag_zminmax0.glsl new file mode 100644 index 000000000..4347f539d --- /dev/null +++ b/wadsrc/static/shaders/scene/frag_zminmax0.glsl @@ -0,0 +1,17 @@ + +layout(binding = 0) uniform sampler2D Texture; +layout(location = 0) out vec4 FragMinMax; + +void main() +{ + ivec2 size = textureSize(Texture, 0) - 1; + ivec2 pos = ivec2(gl_FragCoord.xy) * 2; + float z0 = texelFetch(Texture, min(pos, size), 0).w; + float z1 = texelFetch(Texture, min(pos + ivec2(1,0), size), 0).w; + float z2 = texelFetch(Texture, min(pos + ivec2(0,1), size), 0).w; + float z3 = texelFetch(Texture, min(pos + ivec2(1,1), size), 0).w; + vec2 zminmax = vec2( + min(min(min(z0, z1), z2), z3), + max(max(max(z0, z1), z2), z3)); + FragMinMax = vec4(zminmax, 0, 0); +} diff --git a/wadsrc/static/shaders/scene/frag_zminmax1.glsl b/wadsrc/static/shaders/scene/frag_zminmax1.glsl new file mode 100644 index 000000000..1b3387025 --- /dev/null +++ b/wadsrc/static/shaders/scene/frag_zminmax1.glsl @@ -0,0 +1,16 @@ + +layout(binding = 0) uniform sampler2D Texture; +layout(location = 0) out vec4 FragMinMax; + +void main() +{ + ivec2 pos = ivec2(gl_FragCoord.xy) * 2; + vec2 z0 = texelFetch(Texture, pos, 0).xy; + vec2 z1 = texelFetch(Texture, pos + ivec2(1,0), 0).xy; + vec2 z2 = texelFetch(Texture, pos + ivec2(0,1), 0).xy; + vec2 z3 = texelFetch(Texture, pos + ivec2(1,1), 0).xy; + vec2 zminmax = vec2( + min(min(min(z0.x, z1.x), z2.x), z3.x), + max(max(max(z0.y, z1.y), z2.y), z3.y)); + FragMinMax = vec4(zminmax, 0, 0); +} diff --git a/wadsrc/static/shaders/scene/vert_zminmax.glsl b/wadsrc/static/shaders/scene/vert_zminmax.glsl new file mode 100644 index 000000000..bead3156a --- /dev/null +++ b/wadsrc/static/shaders/scene/vert_zminmax.glsl @@ -0,0 +1,14 @@ + +vec2 positions[6] = vec2[]( + vec2(-1.0, -1.0), + vec2( 1.0, -1.0), + vec2(-1.0, 1.0), + vec2(-1.0, 1.0), + vec2( 1.0, -1.0), + vec2( 1.0, 1.0) +); + +void main() +{ + gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); +} From 1429e224411ec139adfa2906bb0f0ec939f2ce64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 13 Sep 2024 15:09:57 -0300 Subject: [PATCH 268/414] rework interpolation to allow for precalculated frames --- src/common/engine/serializer.h | 4 +- src/common/models/bonecomponents.h | 36 ++++++++++++++ src/common/models/model.h | 5 +- src/common/models/model_iqm.h | 3 +- src/common/models/models_iqm.cpp | 24 +++++++++- src/playsim/actor.h | 22 +-------- src/playsim/p_actionfunctions.cpp | 36 +++++++------- src/playsim/p_mobj.cpp | 64 +++++++++++++++++++++++-- src/r_data/models.cpp | 76 ++++++++++++++---------------- 9 files changed, 186 insertions(+), 84 deletions(-) diff --git a/src/common/engine/serializer.h b/src/common/engine/serializer.h index ae25853d9..99ffb72dc 100644 --- a/src/common/engine/serializer.h +++ b/src/common/engine/serializer.h @@ -9,6 +9,7 @@ #include "palentry.h" #include "name.h" #include "dictionary.h" +#include "bonecomponents.h" extern bool save_full; @@ -247,7 +248,8 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FString &sid, FString FSerializer &Serialize(FSerializer &arc, const char *key, NumericValue &sid, NumericValue *def); FSerializer &Serialize(FSerializer &arc, const char *key, struct ModelOverride &mo, struct ModelOverride *def); FSerializer &Serialize(FSerializer &arc, const char *key, struct AnimModelOverride &mo, struct AnimModelOverride *def); -FSerializer &Serialize(FSerializer &arc, const char *key, struct AnimOverride &ao, struct AnimOverride *def); +FSerializer &Serialize(FSerializer &arc, const char *key, ModelAnim &ao, ModelAnim *def); +FSerializer &Serialize(FSerializer &arc, const char *key, ModelAnimFrame &ao, ModelAnimFrame *def); FSerializer& Serialize(FSerializer& arc, const char* key, FTranslationID& value, FTranslationID* defval); void SerializeFunctionPointer(FSerializer &arc, const char *key, FunctionPointerValue *&p); diff --git a/src/common/models/bonecomponents.h b/src/common/models/bonecomponents.h index 1e65389ea..556b28769 100644 --- a/src/common/models/bonecomponents.h +++ b/src/common/models/bonecomponents.h @@ -4,6 +4,8 @@ #include "TRS.h" #include "matrix.h" +#include + class DBoneComponents : public DObject { @@ -14,3 +16,37 @@ public: DBoneComponents() = default; }; + +struct ModelAnimFrameInterp +{ + float inter = -1.0f; + int frame1 = -1; + int frame2 = -1; +}; + +struct ModelAnimFramePrecalculatedIQM +{ + TArray precalcBones; +}; + +enum EModelAnimFlags +{ + MODELANIM_NONE = 1 << 0, // no animation + MODELANIM_LOOP = 1 << 1, // animation loops, otherwise it stays on the last frame once it ends +}; + +struct ModelAnim +{ + int firstFrame = 0; + int lastFrame = 0; + int loopFrame = 0; + float framerate = 0; + double startFrame = 0; + int flags = MODELANIM_NONE; + double startTic = 0; // when the current animation started (changing framerates counts as restarting) (or when animation starts if interpolating from previous animation) + double switchOffset = 0; // when the animation was changed -- where to interpolate the switch from +}; + +static_assert(sizeof(ModelAnim) == sizeof(double) * 6); + +using ModelAnimFrame = std::variant; diff --git a/src/common/models/model.h b/src/common/models/model.h index 7d5746e33..f25a3df1a 100644 --- a/src/common/models/model.h +++ b/src/common/models/model.h @@ -9,6 +9,8 @@ #include "tarray.h" #include "name.h" +#include "bonecomponents.h" + class DBoneComponents; class FModelRenderer; class FGameTexture; @@ -94,7 +96,8 @@ public: virtual void AddSkins(uint8_t *hitlist, const FTextureID* surfaceskinids) = 0; virtual float getAspectFactor(float vscale) { return 1.f; } virtual const TArray* AttachAnimationData() { return nullptr; }; - virtual const TArray CalculateBones(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const TArray* animationData, DBoneComponents* bones, int index) { return {}; }; + + virtual const TArray CalculateBones(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) { return {}; }; void SetVertexBuffer(int type, IModelVertexBuffer *buffer) { mVBuf[type] = buffer; } IModelVertexBuffer *GetVertexBuffer(int type) const { return mVBuf[type]; } diff --git a/src/common/models/model_iqm.h b/src/common/models/model_iqm.h index 464f5c13a..c0c4916eb 100644 --- a/src/common/models/model_iqm.h +++ b/src/common/models/model_iqm.h @@ -120,7 +120,8 @@ public: void BuildVertexBuffer(FModelRenderer* renderer) override; void AddSkins(uint8_t* hitlist, const FTextureID* surfaceskinids) override; const TArray* AttachAnimationData() override; - const TArray CalculateBones(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const TArray* animationData, DBoneComponents* bones, int index) override; + const TArray CalculateBonesIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const TArray* animationData, DBoneComponents* bones, int index); + const TArray CalculateBones(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) override; private: void LoadGeometry(); diff --git a/src/common/models/models_iqm.cpp b/src/common/models/models_iqm.cpp index 891a19647..047d3226d 100644 --- a/src/common/models/models_iqm.cpp +++ b/src/common/models/models_iqm.cpp @@ -560,7 +560,29 @@ static TRS InterpolateBone(const TRS &from, const TRS &to, float t, float invt) return bone; } -const TArray IQMModel::CalculateBones(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const TArray* animationData, DBoneComponents* boneComponentData, int index) +#include "printf.h" + +const TArray IQMModel::CalculateBones(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) +{ + if(inter <= 0 || !(std::holds_alternative(from) || std::holds_alternative(from))) + { + return CalculateBonesIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, animationData, bones, index); + } + else if(std::holds_alternative(from)) + { + auto &from_interp = std::get(from); + + Printf("CalculateBones({%d, %d, %f}, {%d, %d, %f}, %f)\n", from_interp.frame1, from_interp.frame2, from_interp.inter, to.frame1, to.frame2, to.inter, inter); + + return CalculateBonesIQM(from_interp.frame2, to.frame2, inter, from_interp.frame1, from_interp.inter, to.frame1, to.inter, animationData, bones, index); + } + else if(std::holds_alternative(from)) + { //TODO + return CalculateBonesIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, animationData, bones, index); + } +} + +const TArray IQMModel::CalculateBonesIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const TArray* animationData, DBoneComponents* boneComponentData, int index) { const TArray& animationFrames = animationData ? *animationData : TRSData; if (Joints.Size() > 0) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 37e9eb645..bbf2eaf98 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -700,24 +700,6 @@ enum EViewPosFlags // [MC] Flags for SetViewPos. VPSF_ORTHOGRAPHIC = 1 << 4, // Use orthographic projection (hardware renderer only). }; -enum EAnimOverrideFlags -{ - ANIMOVERRIDE_NONE = 1 << 0, // no animation - ANIMOVERRIDE_LOOP = 1 << 1, // animation loops, otherwise it stays on the last frame once it ends -}; - -struct AnimOverride -{ - int firstFrame; - int lastFrame; - int loopFrame; - double startFrame; - int flags = ANIMOVERRIDE_NONE; - float framerate; - double startTic; // when the current animation started (changing framerates counts as restarting) (or when animation starts if interpolating from previous animation) - double switchOffset; // when the animation was changed -- where to interpolate the switch from -}; - struct ModelOverride { int modelID; @@ -753,8 +735,8 @@ public: int overrideFlagsSet; int overrideFlagsClear; - AnimOverride curAnim; - AnimOverride prevAnim; // used for interpolation when switching anims + ModelAnim curAnim; + ModelAnimFrame prevAnim; // used for interpolation when switching anims DActorModelData() = default; virtual void Serialize(FSerializer& arc) override; diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index bfed28fcb..1b780a194 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5128,7 +5128,8 @@ enum ESetAnimationFlags SAF_NOOVERRIDE = 1 << 2, }; -extern double getCurrentFrame(const AnimOverride &anim, double tic, bool *looped); +double getCurrentFrame(const ModelAnim &anim, double tic, bool *looped); +void calcFrame(const ModelAnim &anim, double tic, ModelAnimFrameInterp &inter); void SetAnimationInternal(AActor * self, FName animName, double framerate, int startFrame, int loopFrame, int endFrame, int interpolateTics, int flags, double ticFrac) { @@ -5150,7 +5151,7 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s if(animName == NAME_None) { - self->modelData->curAnim.flags = ANIMOVERRIDE_NONE; + self->modelData->curAnim.flags = MODELANIM_NONE; return; } @@ -5165,12 +5166,12 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s int animStart = mdl->FindFirstFrame(animName); if(animStart == FErr_NotFound) { - self->modelData->curAnim.flags = ANIMOVERRIDE_NONE; + self->modelData->curAnim.flags = MODELANIM_NONE; Printf("Could not find animation %s\n", animName.GetChars()); return; } - if((flags & SAF_NOOVERRIDE) && self->modelData->curAnim.flags != ANIMOVERRIDE_NONE && self->modelData->curAnim.firstFrame == animStart) + if((flags & SAF_NOOVERRIDE) && self->modelData->curAnim.flags != MODELANIM_NONE && self->modelData->curAnim.firstFrame == animStart) { //same animation as current, skip setting it return; @@ -5184,14 +5185,15 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s if(!(flags & SAF_INSTANT)) { - self->modelData->prevAnim = self->modelData->curAnim; - - bool looped = false; - self->modelData->prevAnim.startFrame = getCurrentFrame(self->modelData->prevAnim, tic, &looped); - - if(!looped) + if(self->modelData->curAnim.startTic > tic) { - self->modelData->prevAnim.flags &= ~ANIMOVERRIDE_LOOP; + //TODO + } + else + { + self->modelData->prevAnim = ModelAnimFrameInterp{}; + + calcFrame(self->modelData->curAnim, tic, std::get(self->modelData->prevAnim)); } } @@ -5206,19 +5208,19 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s if(startFrame >= len) { - self->modelData->curAnim.flags = ANIMOVERRIDE_NONE; + self->modelData->curAnim.flags = MODELANIM_NONE; Printf("frame %d (startFrame) is past the end of animation %s\n", startFrame, animName.GetChars()); return; } else if(loopFrame >= len) { - self->modelData->curAnim.flags = ANIMOVERRIDE_NONE; + self->modelData->curAnim.flags = MODELANIM_NONE; Printf("frame %d (loopFrame) is past the end of animation %s\n", startFrame, animName.GetChars()); return; } else if(endFrame >= len) { - self->modelData->curAnim.flags = ANIMOVERRIDE_NONE; + self->modelData->curAnim.flags = MODELANIM_NONE; Printf("frame %d (endFrame) is past the end of animation %s\n", endFrame, animName.GetChars()); return; } @@ -5227,12 +5229,12 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s self->modelData->curAnim.lastFrame = endFrame < 0 ? animEnd - 1 : animStart + endFrame; self->modelData->curAnim.startFrame = startFrame < 0 ? animStart : animStart + startFrame; self->modelData->curAnim.loopFrame = loopFrame < 0 ? animStart : animStart + loopFrame; - self->modelData->curAnim.flags = (flags&SAF_LOOP) ? ANIMOVERRIDE_LOOP : 0; + self->modelData->curAnim.flags = (flags & SAF_LOOP) ? MODELANIM_LOOP : 0; self->modelData->curAnim.framerate = (float)framerate; if(!(flags & SAF_INSTANT)) { - int startTic = floor(tic) + interpolateTics; + int startTic = int(floor(tic)) + interpolateTics; self->modelData->curAnim.startTic = startTic; self->modelData->curAnim.switchOffset = startTic - tic; } @@ -5264,7 +5266,7 @@ void SetAnimationFrameRateInternal(AActor * self, double framerate, double ticFr EnsureModelData(self); - if(self->modelData->curAnim.flags & ANIMOVERRIDE_NONE) return; + if(self->modelData->curAnim.flags & MODELANIM_NONE) return; if(framerate < 0) { diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 442f101f5..e8a6c247a 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -1443,7 +1443,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, AnimModelOverride &amo return arc; } -FSerializer &Serialize(FSerializer &arc, const char *key, struct AnimOverride &ao, struct AnimOverride *def) +FSerializer &Serialize(FSerializer &arc, const char *key, struct ModelAnim &ao, struct ModelAnim *def) { arc.BeginObject(key); arc("firstFrame", ao.firstFrame); @@ -1458,6 +1458,64 @@ FSerializer &Serialize(FSerializer &arc, const char *key, struct AnimOverride &a return arc; } +FSerializer &Serialize(FSerializer &arc, const char *key, ModelAnimFrame &ao, ModelAnimFrame *def) +{ + arc.BeginObject(key); + if(arc.isReading()) + { + if(arc.HasKey("firstFrame")) + { // legacy save, clear interpolation + ao = nullptr; + } + else + { + FString type = "nullptr"; + arc("type", type); + if(type.Compare("nullptr") == 0) + { + ao = nullptr; + } + else if(type.Compare("interp") == 0) + { + ModelAnimFrameInterp tmp; + arc("inter", tmp.inter); + arc("frame1", tmp.frame1); + arc("frame2", tmp.frame2); + ao = tmp; + } + else if(type.Compare("precalcIQM") == 0) + { + //TODO, unreachable + ao = nullptr; + } + } + } + else // if(arc.isWriting()) + { + if(std::holds_alternative(ao)) + { + FString tmp = "nullptr"; + arc("type", tmp); + } + else if(std::holds_alternative(ao)) + { + FString type = "interp"; + arc("type", type); + arc("inter", std::get(ao).inter); + arc("frame1", std::get(ao).frame1); + arc("frame2", std::get(ao).frame2); + } + else if(std::holds_alternative(ao)) + { + //TODO + FString type = "nullptr"; + arc("type", type); + } + } + arc.EndObject(); + return arc; +} + void DActorModelData::Serialize(FSerializer& arc) { Super::Serialize(arc); @@ -3862,7 +3920,7 @@ void AActor::Tick () special2++; } - if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & ANIMOVERRIDE_NONE)) + if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & MODELANIM_NONE)) { modelData->curAnim.startTic += 1; } @@ -3915,7 +3973,7 @@ void AActor::Tick () special2++; } - if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & ANIMOVERRIDE_NONE)) + if(flags9 & MF9_DECOUPLEDANIMATIONS && modelData && !(modelData->curAnim.flags & MODELANIM_NONE)) { modelData->curAnim.startTic += 1; } diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 3c2ed56d7..9a710cd9a 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -258,7 +258,7 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translatio renderer->EndDrawHUDModel(playermo->RenderStyle, smf_flags); } -double getCurrentFrame(const AnimOverride &anim, double tic, bool *looped) +double getCurrentFrame(const ModelAnim &anim, double tic, bool *looped) { if(anim.framerate <= 0) return anim.startFrame; @@ -266,7 +266,7 @@ double getCurrentFrame(const AnimOverride &anim, double tic, bool *looped) double duration = double(anim.lastFrame) - anim.startFrame; - if((anim.flags & ANIMOVERRIDE_LOOP) && frame >= duration) + if((anim.flags & MODELANIM_LOOP) && frame >= duration) { if(looped) *looped = true; frame = frame - duration; @@ -278,26 +278,37 @@ double getCurrentFrame(const AnimOverride &anim, double tic, bool *looped) } } -static void fixFrame(const AnimOverride &anim, double frame, double &inter, int &prev, int &next, bool looped) +void calcFrame(const ModelAnim &anim, double tic, ModelAnimFrameInterp &inter) { - prev = int(floor(frame)); + bool looped = false; + + double frame = getCurrentFrame(anim, tic, &looped); + + inter.frame1 = int(floor(frame)); + + inter.inter = frame - inter.frame1; + + inter.frame2 = int(ceil(frame)); int startFrame = (looped ? anim.startFrame : anim.loopFrame); - if(prev < startFrame) prev = anim.lastFrame; - - inter = frame - prev; - - next = int(ceil(frame)); - - if(next > anim.lastFrame) next = startFrame; + if(inter.frame1 < startFrame) inter.frame1 = anim.lastFrame; + if(inter.frame2 > anim.lastFrame) inter.frame2 = startFrame; } -static void calcFrame(const AnimOverride &anim, double tic, double &inter, int &prev, int &next) +void calcFrames(const ModelAnim &curAnim, double tic, ModelAnimFrameInterp &to, float &inter) { - bool looped = false; - double frame = getCurrentFrame(anim, tic, &looped); - fixFrame(anim, frame, inter, prev, next, looped); + if(curAnim.startTic > tic) + { + inter = (tic - (curAnim.startTic - curAnim.switchOffset)) / curAnim.switchOffset; + + calcFrame(curAnim, curAnim.startTic, to); + } + else + { + inter = -1.0f; + calcFrame(curAnim, tic, to); + } } void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpriteModelFrame *smf, const FState *curState, const int curTics, FTranslationID translation, AActor* actor) @@ -308,17 +319,11 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr int smf_flags = smf->getFlags(actor->modelData); const FSpriteModelFrame * smfNext = nullptr; - double inter = 0.; - double inter_main = -1.f; - double inter_next = -1.f; + float inter = 0.; bool is_decoupled = (actor->flags9 & MF9_DECOUPLEDANIMATIONS); - int decoupled_main_prev_frame = -1; - int decoupled_next_prev_frame = -1; - - int decoupled_main_frame = -1; - int decoupled_next_frame = -1; + ModelAnimFrameInterp decoupled_frame; // if prev_frame == -1: interpolate(main_frame, next_frame, inter), else: interpolate(interpolate(main_prev_frame, main_frame, inter_main), interpolate(next_prev_frame, next_frame, inter_next), inter) // 4-way interpolation is needed to interpolate animation switches between animations that aren't 35hz @@ -326,24 +331,15 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr if(is_decoupled) { smfNext = smf = &BaseSpriteModelFrames[actor->GetClass()]; - if(actor->modelData && !(actor->modelData->curAnim.flags & ANIMOVERRIDE_NONE)) + if(actor->modelData && !(actor->modelData->curAnim.flags & MODELANIM_NONE)) { double tic = actor->Level->totaltime; if ((ConsoleState == c_up || ConsoleState == c_rising) && (menuactive == MENU_Off || menuactive == MENU_OnNoPause) && !actor->isFrozen()) { tic += I_GetTimeFrac(); } - if(actor->modelData->curAnim.startTic > tic) - { - inter = (tic - (actor->modelData->curAnim.startTic - actor->modelData->curAnim.switchOffset)) / actor->modelData->curAnim.switchOffset; - fixFrame(actor->modelData->curAnim, actor->modelData->curAnim.startFrame, inter_next, decoupled_next_prev_frame, decoupled_next_frame, false); - fixFrame(actor->modelData->prevAnim, actor->modelData->prevAnim.startFrame, inter_main, decoupled_main_prev_frame, decoupled_main_frame, actor->modelData->prevAnim.flags & ANIMOVERRIDE_LOOP); - } - else - { - calcFrame(actor->modelData->curAnim, tic, inter, decoupled_main_frame, decoupled_next_frame); - } + calcFrames(actor->modelData->curAnim, tic, decoupled_frame, inter); } } else if (gl_interpolate_model_frames && !(smf_flags & MDL_NOINTERPOLATION)) @@ -543,14 +539,14 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr if(is_decoupled) { - if(decoupled_main_frame != -1) + if(decoupled_frame.frame1 != -1) { - boneData = animation->CalculateBones(decoupled_main_frame, decoupled_next_frame, inter, decoupled_main_prev_frame, inter_main, decoupled_next_prev_frame, inter_next, animationData, actor->boneComponentData, i); + boneData = animation->CalculateBones(actor->modelData->prevAnim, decoupled_frame, inter, animationData, actor->boneComponentData, i); } } else { - boneData = animation->CalculateBones(modelframe, modelframenext, nextFrame ? inter : -1.f, 0, -1.f, 0, -1.f, animationData, actor->boneComponentData, i); + boneData = animation->CalculateBones(nullptr, {nextFrame ? inter : -1.0f, modelframe, modelframenext}, -1.0f, animationData, actor->boneComponentData, i); } boneStartingPosition = renderer->SetupFrame(animation, 0, 0, 0, boneData, -1); evaluatedSingle = true; @@ -559,14 +555,14 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr { if(is_decoupled) { - if(decoupled_main_frame != -1) + if(decoupled_frame.frame1 != -1) { - boneData = mdl->CalculateBones(decoupled_main_frame, decoupled_next_frame, inter, decoupled_main_prev_frame, inter_main, decoupled_next_prev_frame, inter_next, nullptr, actor->boneComponentData, i); + boneData = mdl->CalculateBones(actor->modelData->prevAnim, decoupled_frame, inter, nullptr, actor->boneComponentData, i); } } else { - boneData = mdl->CalculateBones(modelframe, modelframenext, nextFrame ? inter : -1.f, 0, -1.f, 0, -1.f, nullptr, actor->boneComponentData, i); + boneData = mdl->CalculateBones(nullptr, {nextFrame ? inter : -1.0f, modelframe, modelframenext}, -1.0f, nullptr, actor->boneComponentData, i); } boneStartingPosition = renderer->SetupFrame(mdl, 0, 0, 0, boneData, -1); evaluatedSingle = true; From 79dacdf1b73e10147f6a2c629dbc13b410ee0f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 13 Sep 2024 16:56:07 -0300 Subject: [PATCH 269/414] Properly fix double interpolation for IQM models --- src/common/models/bonecomponents.h | 4 ++ src/common/models/model.h | 2 + src/common/models/model_iqm.h | 6 +- src/common/models/models_iqm.cpp | 108 ++++++++++++++++++++++++++--- src/playsim/p_actionfunctions.cpp | 43 +++++++++--- src/r_data/models.cpp | 39 ++++------- 6 files changed, 154 insertions(+), 48 deletions(-) diff --git a/src/common/models/bonecomponents.h b/src/common/models/bonecomponents.h index 556b28769..313b0832e 100644 --- a/src/common/models/bonecomponents.h +++ b/src/common/models/bonecomponents.h @@ -50,3 +50,7 @@ struct ModelAnim static_assert(sizeof(ModelAnim) == sizeof(double) * 6); using ModelAnimFrame = std::variant; + +double getCurrentFrame(const ModelAnim &anim, double tic, bool *looped); +void calcFrame(const ModelAnim &anim, double tic, ModelAnimFrameInterp &inter); +void calcFrames(const ModelAnim &curAnim, double tic, ModelAnimFrameInterp &to, float &inter); diff --git a/src/common/models/model.h b/src/common/models/model.h index f25a3df1a..2be1f54cc 100644 --- a/src/common/models/model.h +++ b/src/common/models/model.h @@ -97,6 +97,8 @@ public: virtual float getAspectFactor(float vscale) { return 1.f; } virtual const TArray* AttachAnimationData() { return nullptr; }; + virtual ModelAnimFrame PrecalculateFrame(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) { return nullptr; }; + virtual const TArray CalculateBones(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) { return {}; }; void SetVertexBuffer(int type, IModelVertexBuffer *buffer) { mVBuf[type] = buffer; } diff --git a/src/common/models/model_iqm.h b/src/common/models/model_iqm.h index c0c4916eb..c16e8372a 100644 --- a/src/common/models/model_iqm.h +++ b/src/common/models/model_iqm.h @@ -120,9 +120,13 @@ public: void BuildVertexBuffer(FModelRenderer* renderer) override; void AddSkins(uint8_t* hitlist, const FTextureID* surfaceskinids) override; const TArray* AttachAnimationData() override; - const TArray CalculateBonesIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const TArray* animationData, DBoneComponents* bones, int index); + + ModelAnimFrame PrecalculateFrame(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) override; const TArray CalculateBones(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) override; + ModelAnimFramePrecalculatedIQM CalculateFrameIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const ModelAnimFramePrecalculatedIQM* precalculated, const TArray* animationData, DBoneComponents* bones, int index); + const TArray CalculateBonesIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const ModelAnimFramePrecalculatedIQM* precalculated, const TArray* animationData, DBoneComponents* bones, int index); + private: void LoadGeometry(); void UnloadGeometry(); diff --git a/src/common/models/models_iqm.cpp b/src/common/models/models_iqm.cpp index 047d3226d..1384debce 100644 --- a/src/common/models/models_iqm.cpp +++ b/src/common/models/models_iqm.cpp @@ -562,27 +562,106 @@ static TRS InterpolateBone(const TRS &from, const TRS &to, float t, float invt) #include "printf.h" -const TArray IQMModel::CalculateBones(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) + +ModelAnimFrame IQMModel::PrecalculateFrame(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) { - if(inter <= 0 || !(std::holds_alternative(from) || std::holds_alternative(from))) + if(inter <= 0) { - return CalculateBonesIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, animationData, bones, index); + return CalculateFrameIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, nullptr, animationData, bones, index); } else if(std::holds_alternative(from)) { auto &from_interp = std::get(from); - Printf("CalculateBones({%d, %d, %f}, {%d, %d, %f}, %f)\n", from_interp.frame1, from_interp.frame2, from_interp.inter, to.frame1, to.frame2, to.inter, inter); - - return CalculateBonesIQM(from_interp.frame2, to.frame2, inter, from_interp.frame1, from_interp.inter, to.frame1, to.inter, animationData, bones, index); + return CalculateFrameIQM(from_interp.frame2, to.frame2, inter, from_interp.frame1, from_interp.inter, to.frame1, to.inter, nullptr, animationData, bones, index); } else if(std::holds_alternative(from)) - { //TODO - return CalculateBonesIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, animationData, bones, index); + { + return CalculateFrameIQM(0, to.frame2, inter, 0, -1.f, to.frame1, to.inter, &std::get(from), animationData, bones, index); + } + else + { + return CalculateFrameIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, nullptr, animationData, bones, index); } } -const TArray IQMModel::CalculateBonesIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const TArray* animationData, DBoneComponents* boneComponentData, int index) +const TArray IQMModel::CalculateBones(const ModelAnimFrame &from, const ModelAnimFrameInterp &to, float inter, const TArray* animationData, DBoneComponents* bones, int index) +{ + if(inter <= 0) + { + return CalculateBonesIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, nullptr, animationData, bones, index); + } + else if(std::holds_alternative(from)) + { + auto &from_interp = std::get(from); + + return CalculateBonesIQM(from_interp.frame2, to.frame2, inter, from_interp.frame1, from_interp.inter, to.frame1, to.inter, nullptr, animationData, bones, index); + } + else if(std::holds_alternative(from)) + { + return CalculateBonesIQM(0, to.frame2, inter, 0, -1.f, to.frame1, to.inter, &std::get(from), animationData, bones, index); + } + else + { + return CalculateBonesIQM(to.frame1, to.frame2, to.inter, 0, -1.f, 0, -1.f, nullptr, animationData, bones, index); + } +} + +ModelAnimFramePrecalculatedIQM IQMModel::CalculateFrameIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const ModelAnimFramePrecalculatedIQM* precalculated, const TArray* animationData, DBoneComponents* boneComponentData, int index) +{ + ModelAnimFramePrecalculatedIQM out; + const TArray& animationFrames = animationData ? *animationData : TRSData; + + out.precalcBones.Resize(Joints.Size()); + + if (Joints.Size() > 0) + { + int numbones = Joints.SSize(); + + int offset1 = frame1 * numbones; + int offset2 = frame2 * numbones; + + int offset1_1 = frame1_prev * numbones; + int offset2_1 = frame2_prev * numbones; + + float invt = 1.0f - inter; + float invt1 = 1.0f - inter1_prev; + float invt2 = 1.0f - inter2_prev; + + for (int i = 0; i < numbones; i++) + { + TRS prev; + + if(precalculated) + { + prev = precalculated->precalcBones[i]; + } + else + { + if(frame1 >= 0 && (frame1_prev >= 0 || inter1_prev < 0)) + { + prev = inter1_prev <= 0 ? animationFrames[offset1 + i] : InterpolateBone(animationFrames[offset1_1 + i], animationFrames[offset1 + i], inter1_prev, invt1); + } + } + + TRS next; + + if(frame2 >= 0 && (frame2_prev >= 0 || inter2_prev < 0)) + { + next = inter2_prev <= 0 ? animationFrames[offset2 + i] : InterpolateBone(animationFrames[offset2_1 + i], animationFrames[offset2 + i], inter2_prev, invt2); + } + + if(frame1 >= 0 || inter < 0) + { + out.precalcBones[i] = inter < 0 ? animationFrames[offset1 + i] : InterpolateBone(prev, next , inter, invt); + } + } + } + + return out; +} + +const TArray IQMModel::CalculateBonesIQM(int frame1, int frame2, float inter, int frame1_prev, float inter1_prev, int frame2_prev, float inter2_prev, const ModelAnimFramePrecalculatedIQM* precalculated, const TArray* animationData, DBoneComponents* boneComponentData, int index) { const TArray& animationFrames = animationData ? *animationData : TRSData; if (Joints.Size() > 0) @@ -619,9 +698,16 @@ const TArray IQMModel::CalculateBonesIQM(int frame1, int frame2, float { TRS prev; - if(frame1 >= 0 && (frame1_prev >= 0 || inter1_prev < 0)) + if(precalculated) { - prev = inter1_prev <= 0 ? animationFrames[offset1 + i] : InterpolateBone(animationFrames[offset1_1 + i], animationFrames[offset1 + i], inter1_prev, invt1); + prev = precalculated->precalcBones[i]; + } + else + { + if(frame1 >= 0 && (frame1_prev >= 0 || inter1_prev < 0)) + { + prev = inter1_prev <= 0 ? animationFrames[offset1 + i] : InterpolateBone(animationFrames[offset1_1 + i], animationFrames[offset1 + i], inter1_prev, invt1); + } } TRS next; diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index 1b780a194..ea7090c1d 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5128,9 +5128,6 @@ enum ESetAnimationFlags SAF_NOOVERRIDE = 1 << 2, }; -double getCurrentFrame(const ModelAnim &anim, double tic, bool *looped); -void calcFrame(const ModelAnim &anim, double tic, ModelAnimFrameInterp &inter); - void SetAnimationInternal(AActor * self, FName animName, double framerate, int startFrame, int loopFrame, int endFrame, int interpolateTics, int flags, double ticFrac) { if(!self) ThrowAbortException(X_READ_NIL, "In function parameter self"); @@ -5177,17 +5174,39 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s return; } - - if(self->modelData->curAnim.startTic > tic) - { // force instant switch if interpolating - flags |= SAF_INSTANT; - } - if(!(flags & SAF_INSTANT)) { if(self->modelData->curAnim.startTic > tic) { - //TODO + ModelAnimFrameInterp to; + float inter; + + calcFrames(self->modelData->curAnim, tic, to, inter); + + const TArray* animationData = nullptr; + + int animationid = -1; + + const FSpriteModelFrame * smf = &BaseSpriteModelFrames[self->GetClass()]; + + if (self->modelData->animationIDs.Size() > 0 && self->modelData->animationIDs[0] >= 0) + { + animationid = self->modelData->animationIDs[0]; + } + else if(smf->modelsAmount > 0) + { + animationid = smf->animationIDs[0]; + } + + FModel* animation = mdl; + + if (animationid >= 0) + { + animation = Models[animationid]; + animationData = animation->AttachAnimationData(); + } + + self->modelData->prevAnim = animation->PrecalculateFrame(self->modelData->prevAnim, to, inter, animationData, self->boneComponentData, 0); } else { @@ -5196,6 +5215,10 @@ void SetAnimationInternal(AActor * self, FName animName, double framerate, int s calcFrame(self->modelData->curAnim, tic, std::get(self->modelData->prevAnim)); } } + else + { + self->modelData->prevAnim = nullptr; + } int animEnd = mdl->FindLastFrame(animName); diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 9a710cd9a..41166a0e8 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -530,43 +530,30 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr } // [RL0] while per-model animations aren't done, DECOUPLEDANIMATIONS does the same as MODELSAREATTACHMENTS - if ((!(smf_flags & MDL_MODELSAREATTACHMENTS) && !is_decoupled) || !evaluatedSingle) + if(!evaluatedSingle) { + FModel* animation = mdl; + const TArray* animationData = nullptr; + if (animationid >= 0) { - FModel* animation = Models[animationid]; + animation = Models[animationid]; const TArray* animationData = animation->AttachAnimationData(); + } - if(is_decoupled) + if(is_decoupled) + { + if(decoupled_frame.frame1 != -1) { - if(decoupled_frame.frame1 != -1) - { - boneData = animation->CalculateBones(actor->modelData->prevAnim, decoupled_frame, inter, animationData, actor->boneComponentData, i); - } + boneData = animation->CalculateBones(actor->modelData->prevAnim, decoupled_frame, inter, animationData, actor->boneComponentData, i); } - else - { - boneData = animation->CalculateBones(nullptr, {nextFrame ? inter : -1.0f, modelframe, modelframenext}, -1.0f, animationData, actor->boneComponentData, i); - } - boneStartingPosition = renderer->SetupFrame(animation, 0, 0, 0, boneData, -1); - evaluatedSingle = true; } else { - if(is_decoupled) - { - if(decoupled_frame.frame1 != -1) - { - boneData = mdl->CalculateBones(actor->modelData->prevAnim, decoupled_frame, inter, nullptr, actor->boneComponentData, i); - } - } - else - { - boneData = mdl->CalculateBones(nullptr, {nextFrame ? inter : -1.0f, modelframe, modelframenext}, -1.0f, nullptr, actor->boneComponentData, i); - } - boneStartingPosition = renderer->SetupFrame(mdl, 0, 0, 0, boneData, -1); - evaluatedSingle = true; + boneData = animation->CalculateBones(nullptr, {nextFrame ? inter : -1.0f, modelframe, modelframenext}, -1.0f, animationData, actor->boneComponentData, i); } + boneStartingPosition = renderer->SetupFrame(animation, 0, 0, 0, boneData, -1); + evaluatedSingle = (smf_flags & MDL_MODELSAREATTACHMENTS) || is_decoupled; } mdl->RenderFrame(renderer, tex, modelframe, nextFrame ? modelframenext : modelframe, nextFrame ? inter : -1.f, translation, ssidp, boneData, boneStartingPosition); From 521e2ed39c7f3c2e1b1093e40408e15e85bba787 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 14 Sep 2024 04:59:39 +0200 Subject: [PATCH 270/414] Run the light tiles compute shader --- .../hwrenderer/data/hw_renderstate.h | 1 + .../hwrenderer/data/hw_viewpointuniforms.h | 2 + .../descriptorsets/vk_descriptorset.cpp | 33 +++++++++++++++++ .../vulkan/descriptorsets/vk_descriptorset.h | 14 ++++++- .../vulkan/pipelines/vk_renderpass.cpp | 18 +++++++++ .../vulkan/pipelines/vk_renderpass.h | 11 ++++++ .../rendering/vulkan/shaders/vk_shader.h | 7 ++++ .../vulkan/textures/vk_renderbuffers.cpp | 4 +- .../rendering/vulkan/vk_renderdevice.cpp | 2 +- .../rendering/vulkan/vk_renderstate.cpp | 37 +++++++++++++++++++ src/common/rendering/vulkan/vk_renderstate.h | 1 + .../hwrenderer/scene/hw_drawinfo.cpp | 2 + .../shaders/scene/binding_rsbuffers.glsl | 2 + .../static/shaders/scene/comp_lighttiles.glsl | 31 +++++++++++++--- wadsrc/static/shaders/scene/frag_main.glsl | 5 +++ .../static/shaders/scene/layout_shared.glsl | 3 +- 16 files changed, 162 insertions(+), 11 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index d5fddf554..3ad41688d 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -699,6 +699,7 @@ public: } // Draw level mesh + virtual void DispatchLightTiles() { } virtual void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) { } virtual int GetNextQueryIndex() { return 0; } virtual void BeginQuery() { } diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h index fed7827fb..89cb6aac0 100644 --- a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h @@ -33,6 +33,8 @@ struct HWViewpointUniforms int mLightBlendMode = 0; + int mLightTilesWidth = 0; + void CalcDependencies() { mNormalViewMatrix.computeNormalMatrix(mViewMatrix); diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 9a73a3297..4090beed5 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -43,9 +43,11 @@ VkDescriptorSetManager::VkDescriptorSetManager(VulkanRenderDevice* fb) : fb(fb) CreateLevelMeshLayout(); CreateRSBufferLayout(); CreateFixedLayout(); + CreateLightTilesLayout(); CreateLevelMeshPool(); CreateRSBufferPool(); CreateFixedPool(); + CreateLightTilesPool(); CreateBindlessSet(); } @@ -59,6 +61,7 @@ void VkDescriptorSetManager::Init() { RSBuffer.Set = RSBuffer.Pool->allocate(RSBuffer.Layout.get()); LevelMesh.Set = LevelMesh.Pool->allocate(LevelMesh.Layout.get()); + LightTiles.Set = LightTiles.Pool->allocate(LightTiles.Layout.get()); auto rsbuffers = fb->GetBufferManager()->GetRSBuffers(); WriteDescriptors() @@ -81,6 +84,7 @@ void VkDescriptorSetManager::BeginFrame() { UpdateFixedSet(); UpdateLevelMeshSet(); + UpdateLightTilesSet(); } void VkDescriptorSetManager::UpdateLevelMeshSet() @@ -97,6 +101,15 @@ void VkDescriptorSetManager::UpdateLevelMeshSet() .Execute(fb->GetDevice()); } +void VkDescriptorSetManager::UpdateLightTilesSet() +{ + WriteDescriptors() + .AddStorageImage(LightTiles.Set.get(), 0, fb->GetBuffers()->SceneZMinMax[4].View.get(), VK_IMAGE_LAYOUT_GENERAL) + .AddBuffer(LightTiles.Set.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetUniformsBuffer()) + .AddBuffer(LightTiles.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBuffers()->SceneLightTiles.get()) + .Execute(fb->GetDevice()); +} + void VkDescriptorSetManager::UpdateFixedSet() { fb->GetCommands()->DrawDeleteList->Add(std::move(Fixed.Set)); @@ -250,6 +263,26 @@ void VkDescriptorSetManager::CreateFixedLayout() Fixed.Layout = builder.Create(fb->GetDevice()); } +void VkDescriptorSetManager::CreateLightTilesLayout() +{ + LightTiles.Layout = DescriptorSetLayoutBuilder() + .AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .AddBinding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .AddBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .DebugName("VkDescriptorSetManager.LightTiles.Layout") + .Create(fb->GetDevice()); +} + +void VkDescriptorSetManager::CreateLightTilesPool() +{ + LightTiles.Pool = DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1) + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2) + .MaxSets(1) + .DebugName("VkDescriptorSetManager.LightTiles.Pool") + .Create(fb->GetDevice()); +} + void VkDescriptorSetManager::CreateLevelMeshPool() { LevelMesh.Pool = DescriptorPoolBuilder() diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h index 90ccbb458..bef21dc79 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h @@ -21,17 +21,18 @@ public: void Deinit(); void BeginFrame(); void ResetHWTextureSets(); - void UpdateLevelMeshSet(); VulkanDescriptorSetLayout* GetLevelMeshLayout() { return LevelMesh.Layout.get(); } VulkanDescriptorSetLayout* GetRSBufferLayout() { return RSBuffer.Layout.get(); } VulkanDescriptorSetLayout* GetFixedLayout() { return Fixed.Layout.get(); } VulkanDescriptorSetLayout* GetBindlessLayout() { return Bindless.Layout.get(); } + VulkanDescriptorSetLayout* GetLightTilesLayout() { return LightTiles.Layout.get(); } VulkanDescriptorSet* GetLevelMeshSet() { return LevelMesh.Set.get(); } VulkanDescriptorSet* GetRSBufferSet() { return RSBuffer.Set.get(); } VulkanDescriptorSet* GetFixedSet() { return Fixed.Set.get(); } VulkanDescriptorSet* GetBindlessSet() { return Bindless.Set.get(); } + VulkanDescriptorSet* GetLightTilesSet() { return LightTiles.Set.get(); } VulkanDescriptorSet* GetInput(VkPPRenderPassSetup* passSetup, const TArray& textures, bool bindShadowMapBuffers); @@ -45,11 +46,15 @@ private: void CreateLevelMeshLayout(); void CreateRSBufferLayout(); void CreateFixedLayout(); + void CreateLightTilesLayout(); void CreateLevelMeshPool(); void CreateRSBufferPool(); void CreateFixedPool(); + void CreateLightTilesPool(); void CreateBindlessSet(); void UpdateFixedSet(); + void UpdateLevelMeshSet(); + void UpdateLightTilesSet(); std::unique_ptr AllocatePPSet(VulkanDescriptorSetLayout* layout); @@ -90,6 +95,13 @@ private: std::unique_ptr Pool; } Postprocess; + struct + { + std::unique_ptr Pool; + std::unique_ptr Set; + std::unique_ptr Layout; + } LightTiles; + std::list Materials; static const int MaxFixedSets = 100; diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index c5c601761..f7c1a8797 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -64,6 +64,8 @@ VkRenderPassManager::VkRenderPassManager(VulkanRenderDevice* fb) : fb(fb) } PipelineCache = builder.Create(fb->GetDevice()); + + CreateLightTilesPipeline(); } VkRenderPassManager::~VkRenderPassManager() @@ -154,6 +156,22 @@ VkPPRenderPassSetup* VkRenderPassManager::GetPPRenderPass(const VkPPRenderPassKe return passSetup.get(); } +void VkRenderPassManager::CreateLightTilesPipeline() +{ + LightTiles.Layout = PipelineLayoutBuilder() + .AddSetLayout(fb->GetDescriptorSetManager()->GetLightTilesLayout()) + .AddPushConstantRange(VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(LightTilesPushConstants)) + .DebugName("VkRenderPassManager.LightTiles.Layout") + .Create(fb->GetDevice()); + + LightTiles.Pipeline = ComputePipelineBuilder() + .Cache(PipelineCache.get()) + .Layout(LightTiles.Layout.get()) + .ComputeShader(fb->GetShaderManager()->GetLightTilesShader()) + .DebugName("VkRenderPassManager.LightTiles.Pipeline") + .Create(fb->GetDevice()); +} + ///////////////////////////////////////////////////////////////////////////// VkRenderPassSetup::VkRenderPassSetup(VulkanRenderDevice* fb, const VkRenderPassKey &key) : PassKey(key), fb(fb) diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.h b/src/common/rendering/vulkan/pipelines/vk_renderpass.h index aeba5adb7..0b559650d 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.h +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.h @@ -115,7 +115,12 @@ public: VulkanPipelineCache* GetCache() { return PipelineCache.get(); } + VulkanPipelineLayout* GetLightTilesLayout() { return LightTiles.Layout.get(); } + VulkanPipeline* GetLightTilesPipeline() { return LightTiles.Pipeline.get(); } + private: + void CreateLightTilesPipeline(); + VulkanRenderDevice* fb = nullptr; std::map> RenderPassSetup; @@ -124,6 +129,12 @@ private: std::map> PPRenderPassSetup; + struct + { + std::unique_ptr Layout; + std::unique_ptr Pipeline; + } LightTiles; + FString CacheFilename; std::unique_ptr PipelineCache; }; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 5e2230630..d545f3d7c 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -53,6 +53,13 @@ struct PushConstants int uFogballIndex; // fog balls }; +struct LightTilesPushConstants +{ + int normalLightCount; + int modulatedLightCount; + int subtractiveLightCount; +}; + class VkShaderKey { public: diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index a3ccf6946..259e67999 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -292,7 +292,7 @@ void VkRenderBuffers::CreateSceneZMinMax(int width, int height) SceneZMinMax[i].Image = ImageBuilder() .Size(width, height) .Format(VK_FORMAT_R32G32_SFLOAT) - .Usage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT) + .Usage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT) .DebugName("VkRenderBuffers.SceneZMinMax") .Create(fb->GetDevice()); @@ -309,7 +309,7 @@ void VkRenderBuffers::CreateSceneLightTiles(int width, int height) height = (height + 63) / 64; // Make room for 16 lights plus the lightdata header - size_t blockSize = (1 + 3 * 16) * sizeof(FVector4); + size_t blockSize = (1 + 4 * 16) * sizeof(FVector4); SceneLightTiles = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 873214bb7..770bd4858 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -236,6 +236,7 @@ void VulkanRenderDevice::InitializeState() mPostprocess.reset(new VkPostprocess(this)); mDescriptorSetManager.reset(new VkDescriptorSetManager(this)); + mShaderManager.reset(new VkShaderManager(this)); mRenderPassManager.reset(new VkRenderPassManager(this)); mLevelMesh.reset(new VkLevelMesh(this)); mLightmapper.reset(new VkLightmapper(this)); @@ -245,7 +246,6 @@ void VulkanRenderDevice::InitializeState() mSkyData = new FSkyVertexBuffer(this); mShadowMap = new ShadowMap(this); - mShaderManager.reset(new VkShaderManager(this)); mDescriptorSetManager->Init(); #ifdef __APPLE__ diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 3ee0d446e..c0d48ad73 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -867,6 +867,43 @@ void VkRenderState::ApplyLevelMesh() mCommandBuffer->bindIndexBuffer(fb->GetLevelMesh()->GetDrawIndexBuffer()->buffer, 0, VK_INDEX_TYPE_UINT32); } +void VkRenderState::DispatchLightTiles() +{ + EndRenderPass(); + + auto cmdbuffer = fb->GetCommands()->GetDrawCommands(); + + // To do: run the zminmax pass + VkImageTransition() + .AddImage(&fb->GetBuffers()->SceneZMinMax[4], VK_IMAGE_LAYOUT_GENERAL, true /* false */) + .Execute(cmdbuffer); + + PipelineBarrier() + .AddBuffer(fb->GetBuffers()->SceneLightTiles.get(), VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_SHADER_WRITE_BIT) + .Execute(cmdbuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + + LightTilesPushConstants pushConstants = {}; + //auto mesh = fb->GetLevelMesh()->GetMesh(); + //pushConstants.normalLightCount = mesh->Mesh.NormalLightCount; + //pushConstants.modulatedLightCount = mesh->Mesh.ModulatedLightCount; + //pushConstants.subtractiveLightCount = mesh->Mesh.SubtractiveLightCount; + + auto pipelines = fb->GetRenderPassManager(); + auto descriptors = fb->GetDescriptorSetManager(); + cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, pipelines->GetLightTilesPipeline()); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, pipelines->GetLightTilesLayout(), 0, descriptors->GetLightTilesSet()); + cmdbuffer->pushConstants(pipelines->GetLightTilesLayout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, (uint32_t)sizeof(LightTilesPushConstants), &pushConstants); + + cmdbuffer->dispatch( + (fb->GetBuffers()->GetWidth() + 63) / 64, + (fb->GetBuffers()->GetHeight() + 63) / 64, + 1); + + PipelineBarrier() + .AddBuffer(fb->GetBuffers()->SceneLightTiles.get(), VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT) + .Execute(cmdbuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); +} + void VkRenderState::DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) { ApplyLevelMesh(); diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index 76d2efab0..8b59716ca 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -57,6 +57,7 @@ public: void ResetVertices() override; // Draw level mesh + void DispatchLightTiles() override; void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) override; int GetNextQueryIndex() override; void BeginQuery() override; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 9d929a962..9d609a5a0 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -114,6 +114,7 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni VPUniforms.mViewOffsetX = -screen->mSceneViewport.left; VPUniforms.mViewOffsetY = -screen->mSceneViewport.top; VPUniforms.mViewHeight = viewheight; + VPUniforms.mLightTilesWidth = (screen->mScreenViewport.width + 63) / 64; if (lightmode == ELightMode::Build) { VPUniforms.mGlobVis = 1 / 64.f; @@ -442,6 +443,7 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) state.SetColorMask(false); state.SetCulling(Cull_CW); state.DrawLevelMesh(LevelMeshDrawType::Opaque, true); + state.DispatchLightTiles(); state.DrawLevelMesh(LevelMeshDrawType::Masked, false); // To do: properly mark wall top/bottom as opaque so we don't need this if (gl_portals) { diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 289385a05..b090d0009 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -19,6 +19,8 @@ layout(set = 1, binding = 0, std140) uniform ViewpointUBO int uShadowmapFilter; int uLightBlendMode; + + int uLightTilesWidth; // Levelmesh light tiles }; layout(set = 1, binding = 1, std140) uniform MatricesUBO diff --git a/wadsrc/static/shaders/scene/comp_lighttiles.glsl b/wadsrc/static/shaders/scene/comp_lighttiles.glsl index 38dae0930..5dc613c56 100644 --- a/wadsrc/static/shaders/scene/comp_lighttiles.glsl +++ b/wadsrc/static/shaders/scene/comp_lighttiles.glsl @@ -1,12 +1,12 @@ layout(local_size_x = 32, local_size_y = 32) in; -layout(binding = 0, rg32f) readonly uniform image2D zminmax; +layout(set = 0, binding = 0, rg32f) readonly uniform image2D zminmax; -layout(binding = 1) readonly buffer Lights +layout(set = 0, binding = 1) readonly buffer Lights { vec4 lights[]; }; -layout(binding = 1) buffer Tiles +layout(set = 0, binding = 2) buffer Tiles { vec4 tiles[]; }; @@ -26,18 +26,37 @@ void main() return; const int maxLights = 16; - const int lightSize = 3; + const int lightSize = 4; int tileOffset = (tilePos.x + tilePos.y * zminmaxSize.x) * (1 + maxLights * lightSize); vec2 minmax = imageLoad(zminmax, tilePos).xy; float zmin = minmax.x; float zmax = minmax.y; - int tileNormalCount = 0; + int tileNormalCount = 1; int tileModulatedCount = 0; int tileSubtractiveCount = 0; // To do: cull and add lights - tiles[tileOffset] = vec4(ivec4(tileNormalCount, tileModulatedCount, tileSubtractiveCount, 0)); + tiles[tileOffset] = vec4(ivec4( + 0, + tileNormalCount, + tileNormalCount + tileModulatedCount, + tileNormalCount + tileModulatedCount + tileSubtractiveCount)); + + vec3 pos = vec3(-316.0, 64.0, 621.0); + float radius = 200.0; + vec3 color = vec3(1.0, 1.0, 1.0); + float shadowIndex = -1025.0; + vec3 spotDir = vec3(0.0); + float lightType = 0.0; + float spotInnerAngle = 0.0; + float spotOuterAngle = 0.0; + float softShadowRadius = 0.0; + + tiles[tileOffset + 1] = vec4(pos, radius); + tiles[tileOffset + 2] = vec4(color, shadowIndex); + tiles[tileOffset + 3] = vec4(spotDir, lightType); + tiles[tileOffset + 4] = vec4(spotInnerAngle, spotOuterAngle, softShadowRadius, 0.0); } diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index 8b30d6dbb..def4164b3 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -21,6 +21,11 @@ void main() if (ClipDistanceA.x < 0 || ClipDistanceA.y < 0 || ClipDistanceA.z < 0 || ClipDistanceA.w < 0 || ClipDistanceB.x < 0) discard; #endif +#if defined(USE_LEVELMESH) + const int lightTileSize = 1 + 16 * 4; + uLightIndex = int(uint(gl_FragCoord.x) / 64 + uint(gl_FragCoord.y) / 64 * uLightTilesWidth) * lightTileSize; +#endif + Material material = CreateMaterial(); #ifndef NO_ALPHATEST diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 56cafd54a..a994c66c8 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -73,7 +73,8 @@ layout(push_constant) uniform PushConstants #define uVertexColor lightdata[uDataIndex].uVertexColor #define uDesaturationFactor lightdata[uDataIndex].uDesaturationFactor #define uLightLevel lightdata[uDataIndex].uLightLevel -#define uLightIndex lightdata[uDataIndex].uLightIndex +//#define uLightIndex lightdata[uDataIndex].uLightIndex +int uLightIndex; #else #define uVertexColor data[uDataIndex].uVertexColor #define uDesaturationFactor data[uDataIndex].uDesaturationFactor From 27782250486f3d7465444b9a1fe4466650e67ae7 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 15 Sep 2024 01:44:34 +0200 Subject: [PATCH 271/414] Run the ZMinMax pass before the light tiles compute shader --- .../descriptorsets/vk_descriptorset.cpp | 37 +++++++++ .../vulkan/descriptorsets/vk_descriptorset.h | 12 +++ .../vulkan/pipelines/vk_renderpass.cpp | 36 +++++++++ .../vulkan/pipelines/vk_renderpass.h | 13 +++ .../rendering/vulkan/samplers/vk_samplers.cpp | 9 +++ .../rendering/vulkan/samplers/vk_samplers.h | 2 + .../rendering/vulkan/shaders/vk_shader.cpp | 8 ++ .../rendering/vulkan/shaders/vk_shader.h | 2 +- .../vulkan/textures/vk_imagetransition.cpp | 4 + .../vulkan/textures/vk_imagetransition.h | 2 + .../vulkan/textures/vk_renderbuffers.cpp | 23 +++++- .../vulkan/textures/vk_renderbuffers.h | 1 + .../rendering/vulkan/vk_renderstate.cpp | 79 +++++++++++++++++-- src/common/rendering/vulkan/vk_renderstate.h | 1 + .../static/shaders/scene/frag_zminmax0.glsl | 9 +++ 15 files changed, 231 insertions(+), 7 deletions(-) diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 4090beed5..d505d5c39 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -44,10 +44,12 @@ VkDescriptorSetManager::VkDescriptorSetManager(VulkanRenderDevice* fb) : fb(fb) CreateRSBufferLayout(); CreateFixedLayout(); CreateLightTilesLayout(); + CreateZMinMaxLayout(); CreateLevelMeshPool(); CreateRSBufferPool(); CreateFixedPool(); CreateLightTilesPool(); + CreateZMinMaxPool(); CreateBindlessSet(); } @@ -63,6 +65,9 @@ void VkDescriptorSetManager::Init() LevelMesh.Set = LevelMesh.Pool->allocate(LevelMesh.Layout.get()); LightTiles.Set = LightTiles.Pool->allocate(LightTiles.Layout.get()); + for (auto& set : ZMinMax.Set) + set = ZMinMax.Pool->allocate(ZMinMax.Layout.get()); + auto rsbuffers = fb->GetBufferManager()->GetRSBuffers(); WriteDescriptors() .AddBuffer(RSBuffer.Set.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Viewpoint.UBO.get(), 0, sizeof(HWViewpointUniforms)) @@ -85,6 +90,7 @@ void VkDescriptorSetManager::BeginFrame() UpdateFixedSet(); UpdateLevelMeshSet(); UpdateLightTilesSet(); + UpdateZMinMaxSet(); } void VkDescriptorSetManager::UpdateLevelMeshSet() @@ -110,6 +116,20 @@ void VkDescriptorSetManager::UpdateLightTilesSet() .Execute(fb->GetDevice()); } +void VkDescriptorSetManager::UpdateZMinMaxSet() +{ + WriteDescriptors() + .AddCombinedImageSampler(ZMinMax.Set[0].get(), 0, fb->GetBuffers()->SceneDepthStencil.DepthOnlyView.get(), fb->GetSamplerManager()->ZMinMaxSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) + .Execute(fb->GetDevice()); + + for (int i = 1; i < 5; i++) + { + WriteDescriptors() + .AddCombinedImageSampler(ZMinMax.Set[i].get(), 0, fb->GetBuffers()->SceneZMinMax[i - 1].View.get(), fb->GetSamplerManager()->ZMinMaxSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) + .Execute(fb->GetDevice()); + } +} + void VkDescriptorSetManager::UpdateFixedSet() { fb->GetCommands()->DrawDeleteList->Add(std::move(Fixed.Set)); @@ -273,6 +293,14 @@ void VkDescriptorSetManager::CreateLightTilesLayout() .Create(fb->GetDevice()); } +void VkDescriptorSetManager::CreateZMinMaxLayout() +{ + ZMinMax.Layout = DescriptorSetLayoutBuilder() + .AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT) + .DebugName("VkDescriptorSetManager.ZMinMax.Layout") + .Create(fb->GetDevice()); +} + void VkDescriptorSetManager::CreateLightTilesPool() { LightTiles.Pool = DescriptorPoolBuilder() @@ -283,6 +311,15 @@ void VkDescriptorSetManager::CreateLightTilesPool() .Create(fb->GetDevice()); } +void VkDescriptorSetManager::CreateZMinMaxPool() +{ + ZMinMax.Pool = DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 5) + .MaxSets(5) + .DebugName("VkDescriptorSetManager.ZMinMax.Pool") + .Create(fb->GetDevice()); +} + void VkDescriptorSetManager::CreateLevelMeshPool() { LevelMesh.Pool = DescriptorPoolBuilder() diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h index bef21dc79..2dc87b8a9 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h @@ -27,12 +27,14 @@ public: VulkanDescriptorSetLayout* GetFixedLayout() { return Fixed.Layout.get(); } VulkanDescriptorSetLayout* GetBindlessLayout() { return Bindless.Layout.get(); } VulkanDescriptorSetLayout* GetLightTilesLayout() { return LightTiles.Layout.get(); } + VulkanDescriptorSetLayout* GetZMinMaxLayout() { return ZMinMax.Layout.get(); } VulkanDescriptorSet* GetLevelMeshSet() { return LevelMesh.Set.get(); } VulkanDescriptorSet* GetRSBufferSet() { return RSBuffer.Set.get(); } VulkanDescriptorSet* GetFixedSet() { return Fixed.Set.get(); } VulkanDescriptorSet* GetBindlessSet() { return Bindless.Set.get(); } VulkanDescriptorSet* GetLightTilesSet() { return LightTiles.Set.get(); } + VulkanDescriptorSet* GetZMinMaxSet(int index) { return ZMinMax.Set[index].get(); } VulkanDescriptorSet* GetInput(VkPPRenderPassSetup* passSetup, const TArray& textures, bool bindShadowMapBuffers); @@ -47,14 +49,17 @@ private: void CreateRSBufferLayout(); void CreateFixedLayout(); void CreateLightTilesLayout(); + void CreateZMinMaxLayout(); void CreateLevelMeshPool(); void CreateRSBufferPool(); void CreateFixedPool(); void CreateLightTilesPool(); + void CreateZMinMaxPool(); void CreateBindlessSet(); void UpdateFixedSet(); void UpdateLevelMeshSet(); void UpdateLightTilesSet(); + void UpdateZMinMaxSet(); std::unique_ptr AllocatePPSet(VulkanDescriptorSetLayout* layout); @@ -102,6 +107,13 @@ private: std::unique_ptr Layout; } LightTiles; + struct + { + std::unique_ptr Pool; + std::unique_ptr Set[5]; + std::unique_ptr Layout; + } ZMinMax; + std::list Materials; static const int MaxFixedSets = 100; diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index f7c1a8797..53ad0b07e 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -66,6 +66,7 @@ VkRenderPassManager::VkRenderPassManager(VulkanRenderDevice* fb) : fb(fb) PipelineCache = builder.Create(fb->GetDevice()); CreateLightTilesPipeline(); + CreateZMinMaxPipeline(); } VkRenderPassManager::~VkRenderPassManager() @@ -172,6 +173,41 @@ void VkRenderPassManager::CreateLightTilesPipeline() .Create(fb->GetDevice()); } +void VkRenderPassManager::CreateZMinMaxPipeline() +{ + ZMinMax.RenderPass = RenderPassBuilder() + .AddAttachment(VK_FORMAT_R32G32_SFLOAT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) + .AddExternalSubpassDependency( + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) + .AddSubpass() + .AddSubpassColorAttachmentRef(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) + .DebugName("VkRenderPassManager.ZMinMax.RenderPass") + .Create(fb->GetDevice()); + + ZMinMax.Layout = PipelineLayoutBuilder() + .AddSetLayout(fb->GetDescriptorSetManager()->GetZMinMaxLayout()) + //.AddPushConstantRange(VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(ZMinMaxPushConstants)) + .DebugName("VkRenderPassManager.ZMinMax.Layout") + .Create(fb->GetDevice()); + + for (int i = 0; i < 3; i++) + { + ZMinMax.Pipeline[i] = GraphicsPipelineBuilder() + .Cache(PipelineCache.get()) + .RenderPass(ZMinMax.RenderPass.get()) + .Layout(ZMinMax.Layout.get()) + .AddVertexShader(fb->GetShaderManager()->GetZMinMaxVertexShader()) + .AddFragmentShader(fb->GetShaderManager()->GetZMinMaxFragmentShader(i)) + .AddDynamicState(VK_DYNAMIC_STATE_VIEWPORT) + .AddDynamicState(VK_DYNAMIC_STATE_SCISSOR) + .DebugName("VkRenderPassManager.ZMinMax.Pipeline") + .Create(fb->GetDevice()); + } +} + ///////////////////////////////////////////////////////////////////////////// VkRenderPassSetup::VkRenderPassSetup(VulkanRenderDevice* fb, const VkRenderPassKey &key) : PassKey(key), fb(fb) diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.h b/src/common/rendering/vulkan/pipelines/vk_renderpass.h index 0b559650d..9f9854ae5 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.h +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.h @@ -118,8 +118,14 @@ public: VulkanPipelineLayout* GetLightTilesLayout() { return LightTiles.Layout.get(); } VulkanPipeline* GetLightTilesPipeline() { return LightTiles.Pipeline.get(); } + VulkanRenderPass* GetZMinMaxRenderPass() { return ZMinMax.RenderPass.get(); } + VulkanPipelineLayout* GetZMinMaxLayout() { return ZMinMax.Layout.get(); } + VulkanPipeline* GetZMinMaxPipeline0(VkSampleCountFlagBits samples) { return ZMinMax.Pipeline[samples > 1 ? 1 : 0].get(); } + VulkanPipeline* GetZMinMaxPipeline1() { return ZMinMax.Pipeline[2].get(); } + private: void CreateLightTilesPipeline(); + void CreateZMinMaxPipeline(); VulkanRenderDevice* fb = nullptr; @@ -135,6 +141,13 @@ private: std::unique_ptr Pipeline; } LightTiles; + struct + { + std::unique_ptr RenderPass; + std::unique_ptr Layout; + std::unique_ptr Pipeline[3]; + } ZMinMax; + FString CacheFilename; std::unique_ptr PipelineCache; }; diff --git a/src/common/rendering/vulkan/samplers/vk_samplers.cpp b/src/common/rendering/vulkan/samplers/vk_samplers.cpp index b35c69f75..9d48a42cb 100644 --- a/src/common/rendering/vulkan/samplers/vk_samplers.cpp +++ b/src/common/rendering/vulkan/samplers/vk_samplers.cpp @@ -129,6 +129,7 @@ VkSamplerManager::VkSamplerManager(VulkanRenderDevice* fb) : fb(fb) CreateHWSamplers(); CreateShadowmapSampler(); CreateLightmapSampler(); + CreateZMinMaxSampler(); } VkSamplerManager::~VkSamplerManager() @@ -316,3 +317,11 @@ void VkSamplerManager::CreateLightmapSampler() .DebugName("VkRenderBuffers.LightmapSampler") .Create(fb->GetDevice()); } + +void VkSamplerManager::CreateZMinMaxSampler() +{ + ZMinMaxSampler = SamplerBuilder() + .AddressMode(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) + .DebugName("VkRenderBuffers.ZMinMaxSampler") + .Create(fb->GetDevice()); +} diff --git a/src/common/rendering/vulkan/samplers/vk_samplers.h b/src/common/rendering/vulkan/samplers/vk_samplers.h index 1b2eba348..1579d02d6 100644 --- a/src/common/rendering/vulkan/samplers/vk_samplers.h +++ b/src/common/rendering/vulkan/samplers/vk_samplers.h @@ -28,12 +28,14 @@ public: std::unique_ptr ShadowmapSampler; std::unique_ptr LightmapSampler; + std::unique_ptr ZMinMaxSampler; private: void CreateHWSamplers(); void DeleteHWSamplers(); void CreateShadowmapSampler(); void CreateLightmapSampler(); + void CreateZMinMaxSampler(); VulkanRenderDevice* fb = nullptr; std::array, NUMSAMPLERS> mSamplers; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index d5f916f95..c80f5670a 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -47,6 +47,14 @@ VkShaderManager::VkShaderManager(VulkanRenderDevice* fb) : fb(fb) .Create("ZMinMax0.frag", fb->GetDevice()); ZMinMax.frag[1] = ShaderBuilder() + .Type(ShaderType::Fragment) + .DebugName("ZMinMax0.frag") + .AddSource("VersionBlock", GetVersionBlock().GetChars()) + .AddSource("DefinesBlock", "#define MULTISAMPLE\n") + .AddSource("shaders/scene/frag_zminmax0.glsl", LoadPrivateShaderLump("shaders/scene/frag_zminmax0.glsl").GetChars()) + .Create("ZMinMax0.frag", fb->GetDevice()); + + ZMinMax.frag[2] = ShaderBuilder() .Type(ShaderType::Fragment) .DebugName("ZMinMax1.frag") .AddSource("VersionBlock", GetVersionBlock().GetChars()) diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index d545f3d7c..1b2c6636f 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -149,7 +149,7 @@ private: struct { std::unique_ptr vert; - std::unique_ptr frag[2]; + std::unique_ptr frag[3]; } ZMinMax; std::unique_ptr LightTiles; diff --git a/src/common/rendering/vulkan/textures/vk_imagetransition.cpp b/src/common/rendering/vulkan/textures/vk_imagetransition.cpp index 5701a1871..2f0cfd888 100644 --- a/src/common/rendering/vulkan/textures/vk_imagetransition.cpp +++ b/src/common/rendering/vulkan/textures/vk_imagetransition.cpp @@ -57,6 +57,10 @@ VkImageTransition& VkImageTransition::AddImage(VkTextureImage *image, VkImageLay srcAccess = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; srcStageMask |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; break; + case VK_IMAGE_LAYOUT_GENERAL: + srcAccess = 0; + srcStageMask |= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + break; default: I_FatalError("Unimplemented src image layout transition\n"); } diff --git a/src/common/rendering/vulkan/textures/vk_imagetransition.h b/src/common/rendering/vulkan/textures/vk_imagetransition.h index a7c179e01..2cd181878 100644 --- a/src/common/rendering/vulkan/textures/vk_imagetransition.h +++ b/src/common/rendering/vulkan/textures/vk_imagetransition.h @@ -25,6 +25,7 @@ public: for (auto& view : LMViews) deletelist->Add(std::move(view)); LMViews.clear(); + deletelist->Add(std::move(ZMinMaxFramebuffer)); deletelist->Add(std::move(DepthOnlyView)); deletelist->Add(std::move(View)); deletelist->Add(std::move(Image)); @@ -38,6 +39,7 @@ public: VkImageLayout Layout = VK_IMAGE_LAYOUT_UNDEFINED; VkImageAspectFlags AspectMask = VK_IMAGE_ASPECT_COLOR_BIT; std::unique_ptr PPFramebuffer; + std::unique_ptr ZMinMaxFramebuffer; std::map> RSFramebuffers; std::vector> LMViews; std::vector> LMFramebuffers; diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index 259e67999..fcaf41b66 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -118,6 +118,27 @@ VulkanFramebuffer* VkRenderBuffers::GetFramebuffer(const VkRenderPassKey& key) return framebuffer.get(); } +VulkanFramebuffer* VkRenderBuffers::GetZMinMaxFramebuffer(int index) +{ + auto& framebuffer = SceneZMinMax[index].ZMinMaxFramebuffer; + if (framebuffer) + return framebuffer.get(); + + int width = ((GetWidth() + 63) / 64 * 64) >> 1; + int height = ((GetHeight() + 63) / 64 * 64) >> 1; + + width >>= index; + height >>= index; + + FramebufferBuilder builder; + builder.RenderPass(fb->GetRenderPassManager()->GetZMinMaxRenderPass()); + builder.Size(width, height); + builder.AddAttachment(SceneZMinMax[index].View.get()); + builder.DebugName("VkRenderBuffers.ZMinMaxFramebuffer"); + framebuffer = builder.Create(fb->GetDevice()); + return framebuffer.get(); +} + void VkRenderBuffers::CreatePipelineDepthStencil(int width, int height) { ImageBuilder builder; @@ -284,7 +305,7 @@ void VkRenderBuffers::CreateSceneZMinMax(int width, int height) width = (width + 63) / 64 * 64; height = (height + 63) / 64 * 64; - for (int i = 4; i >= 0; i--) + for (int i = 0; i < 5; i++) { width >>= 1; height >>= 1; diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.h b/src/common/rendering/vulkan/textures/vk_renderbuffers.h index e90bb36e7..4f2aa8502 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.h +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.h @@ -29,6 +29,7 @@ public: VkSampleCountFlagBits GetSceneSamples() const { return mSamples; } VulkanFramebuffer* GetFramebuffer(const VkRenderPassKey& key); + VulkanFramebuffer* GetZMinMaxFramebuffer(int index); VkTextureImage SceneColor; VkTextureImage SceneDepthStencil; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index c0d48ad73..c3ef50672 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -867,17 +867,86 @@ void VkRenderState::ApplyLevelMesh() mCommandBuffer->bindIndexBuffer(fb->GetLevelMesh()->GetDrawIndexBuffer()->buffer, 0, VK_INDEX_TYPE_UINT32); } +void VkRenderState::RunZMinMaxPass() +{ + auto pipelines = fb->GetRenderPassManager(); + auto descriptors = fb->GetDescriptorSetManager(); + auto buffers = fb->GetBuffers(); + auto cmdbuffer = fb->GetCommands()->GetDrawCommands(); + + int width = ((buffers->GetWidth() + 63) / 64 * 64) >> 1; + int height = ((buffers->GetHeight() + 63) / 64 * 64) >> 1; + + VkImageTransition() + .AddImage(&fb->GetBuffers()->SceneDepthStencil, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false) + .AddImage(&fb->GetBuffers()->SceneZMinMax[0], VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true) + .Execute(cmdbuffer); + + RenderPassBegin() + .RenderPass(pipelines->GetZMinMaxRenderPass()) + .RenderArea(0, 0, width, height) + .Framebuffer(buffers->GetZMinMaxFramebuffer(0)) + .AddClearColor(0.0f, 0.0f, 0.0f, 0.0f) + .Execute(cmdbuffer); + + VkViewport viewport = {}; + viewport.width = (float)width; + viewport.height = (float)height; + cmdbuffer->setViewport(0, 1, &viewport); + + VkRect2D scissor = {}; + scissor.extent.width = width; + scissor.extent.height = height; + cmdbuffer->setScissor(0, 1, &scissor); + + cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines->GetZMinMaxPipeline0(mRenderTarget.Samples)); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines->GetZMinMaxLayout(), 0, descriptors->GetZMinMaxSet(0)); + cmdbuffer->draw(6, 1, 0, 0); + cmdbuffer->endRenderPass(); + + for (int i = 1; i < 5; i++) + { + VkImageTransition() + .AddImage(&fb->GetBuffers()->SceneZMinMax[i - 1], VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false) + .AddImage(&fb->GetBuffers()->SceneZMinMax[i], VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true) + .Execute(cmdbuffer); + + RenderPassBegin() + .RenderPass(pipelines->GetZMinMaxRenderPass()) + .RenderArea(0, 0, width >> i, height >> i) + .Framebuffer(buffers->GetZMinMaxFramebuffer(i)) + .AddClearColor(0.0f, 0.0f, 0.0f, 0.0f) + .Execute(cmdbuffer); + + viewport = {}; + viewport.width = (float)(width >> i); + viewport.height = (float)(height >> i); + cmdbuffer->setViewport(0, 1, &viewport); + + scissor = {}; + scissor.extent.width = (width >> i); + scissor.extent.height = (height >> i); + cmdbuffer->setScissor(0, 1, &scissor); + + cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines->GetZMinMaxPipeline1()); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines->GetZMinMaxLayout(), 0, descriptors->GetZMinMaxSet(i)); + cmdbuffer->draw(6, 1, 0, 0); + cmdbuffer->endRenderPass(); + } + + VkImageTransition() + .AddImage(&fb->GetBuffers()->SceneDepthStencil, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, false) + .AddImage(&fb->GetBuffers()->SceneZMinMax[4], VK_IMAGE_LAYOUT_GENERAL, false) + .Execute(cmdbuffer); +} + void VkRenderState::DispatchLightTiles() { EndRenderPass(); + RunZMinMaxPass(); auto cmdbuffer = fb->GetCommands()->GetDrawCommands(); - // To do: run the zminmax pass - VkImageTransition() - .AddImage(&fb->GetBuffers()->SceneZMinMax[4], VK_IMAGE_LAYOUT_GENERAL, true /* false */) - .Execute(cmdbuffer); - PipelineBarrier() .AddBuffer(fb->GetBuffers()->SceneLightTiles.get(), VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_SHADER_WRITE_BIT) .Execute(cmdbuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index 8b59716ca..80020db86 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -90,6 +90,7 @@ protected: void BeginRenderPass(VulkanCommandBuffer *cmdbuffer); void WaitForStreamBuffers(); + void RunZMinMaxPass(); void ApplyLevelMesh(); void ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader); diff --git a/wadsrc/static/shaders/scene/frag_zminmax0.glsl b/wadsrc/static/shaders/scene/frag_zminmax0.glsl index 4347f539d..7292c9355 100644 --- a/wadsrc/static/shaders/scene/frag_zminmax0.glsl +++ b/wadsrc/static/shaders/scene/frag_zminmax0.glsl @@ -1,10 +1,19 @@ +#if defined(MULTISAMPLE) +layout(binding = 0) uniform sampler2DMS Texture; +#else layout(binding = 0) uniform sampler2D Texture; +#endif + layout(location = 0) out vec4 FragMinMax; void main() { +#if defined(MULTISAMPLE) + ivec2 size = textureSize(Texture) - 1; +#else ivec2 size = textureSize(Texture, 0) - 1; +#endif ivec2 pos = ivec2(gl_FragCoord.xy) * 2; float z0 = texelFetch(Texture, min(pos, size), 0).w; float z1 = texelFetch(Texture, min(pos + ivec2(1,0), size), 0).w; From a885833db2a02a73c55acb9b3a47f36339902147 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 15 Sep 2024 04:12:19 +0200 Subject: [PATCH 272/414] Add more code to the shader --- .../rendering/vulkan/shaders/vk_shader.h | 11 +- .../static/shaders/scene/comp_lighttiles.glsl | 109 ++++++++++++++---- 2 files changed, 92 insertions(+), 28 deletions(-) diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 1b2c6636f..1ad568202 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -55,9 +55,14 @@ struct PushConstants struct LightTilesPushConstants { - int normalLightCount; - int modulatedLightCount; - int subtractiveLightCount; + int additiveCount; + int modulatedCount; + int subtractiveCount; + int padding; + float rcpF; + float rcpFDivAspect; + float twoRcpViewportSizeX; + float twoRcpViewportSizeY; }; class VkShaderKey diff --git a/wadsrc/static/shaders/scene/comp_lighttiles.glsl b/wadsrc/static/shaders/scene/comp_lighttiles.glsl index 5dc613c56..a0e6128b3 100644 --- a/wadsrc/static/shaders/scene/comp_lighttiles.glsl +++ b/wadsrc/static/shaders/scene/comp_lighttiles.glsl @@ -1,4 +1,8 @@ + +#define TILE_SIZE 64 + layout(local_size_x = 32, local_size_y = 32) in; + layout(set = 0, binding = 0, rg32f) readonly uniform image2D zminmax; layout(set = 0, binding = 1) readonly buffer Lights @@ -13,11 +17,25 @@ layout(set = 0, binding = 2) buffer Tiles layout(push_constant) uniform PushConstants { - int normalLightCount; - int modulatedLightCount; - int subtractiveLightCount; + int additiveCount; + int modulatedCount; + int subtractiveCount; + int padding; + float rcpF; + float rcpFDivAspect; + vec2 twoRcpViewportSize; }; +struct Tile +{ + vec3 aabbMin; + vec3 aabbMax; +}; + +bool isLightVisible(Tile tile, vec3 lightPos, float lightRadius); +Tile findTileFrustum(float viewZNear, float viewZFar, uint tileX, uint tileY); +vec3 unprojectDirection(vec2 pos); + void main() { ivec2 zminmaxSize = imageSize(zminmax); @@ -25,38 +43,79 @@ void main() if (tilePos.x >= zminmaxSize.x || tilePos.y >= zminmaxSize.y) return; - const int maxLights = 16; - const int lightSize = 4; - int tileOffset = (tilePos.x + tilePos.y * zminmaxSize.x) * (1 + maxLights * lightSize); - vec2 minmax = imageLoad(zminmax, tilePos).xy; float zmin = minmax.x; float zmax = minmax.y; + Tile tile = findTileFrustum(zmin, zmax, tilePos.x, tilePos.y); - int tileNormalCount = 1; + const int maxLights = 16; + const int lightSize = 4; + int tileOffset = (tilePos.x + tilePos.y * zminmaxSize.x) * (1 + maxLights * lightSize); + int outLightOffset = tileOffset + 1; + + int tileAdditiveCount = 0; int tileModulatedCount = 0; int tileSubtractiveCount = 0; - // To do: cull and add lights + if (isLightVisible(tile, vec3(-316.0, 64.0, 621.0), 200.0)) + { + vec3 pos = vec3(-316.0, 64.0, 621.0); + float radius = 200.0; + vec3 color = vec3(1.0, 1.0, 1.0); + float shadowIndex = -1025.0; + vec3 spotDir = vec3(0.0); + float lightType = 0.0; + float spotInnerAngle = 0.0; + float spotOuterAngle = 0.0; + float softShadowRadius = 0.0; + + tileAdditiveCount++; + tiles[outLightOffset++] = vec4(pos, radius); + tiles[outLightOffset++] = vec4(color, shadowIndex); + tiles[outLightOffset++] = vec4(spotDir, lightType); + tiles[outLightOffset++] = vec4(spotInnerAngle, spotOuterAngle, softShadowRadius, 0.0); + } tiles[tileOffset] = vec4(ivec4( 0, - tileNormalCount, - tileNormalCount + tileModulatedCount, - tileNormalCount + tileModulatedCount + tileSubtractiveCount)); + tileAdditiveCount, + tileAdditiveCount + tileModulatedCount, + tileAdditiveCount + tileModulatedCount + tileSubtractiveCount)); +} - vec3 pos = vec3(-316.0, 64.0, 621.0); - float radius = 200.0; - vec3 color = vec3(1.0, 1.0, 1.0); - float shadowIndex = -1025.0; - vec3 spotDir = vec3(0.0); - float lightType = 0.0; - float spotInnerAngle = 0.0; - float spotOuterAngle = 0.0; - float softShadowRadius = 0.0; +bool isLightVisible(Tile tile, vec3 lightPos, float lightRadius) +{ +/* + // aabb/sphere test for the light + vec3 e = max(tile.aabbMin - lightPos, 0.0f) + max(lightPos - tile.aabbMax, 0.0f); + return dot(e, e) <= lightRadius * lightRadius; +*/ + return true; +} - tiles[tileOffset + 1] = vec4(pos, radius); - tiles[tileOffset + 2] = vec4(color, shadowIndex); - tiles[tileOffset + 3] = vec4(spotDir, lightType); - tiles[tileOffset + 4] = vec4(spotInnerAngle, spotOuterAngle, softShadowRadius, 0.0); +Tile findTileFrustum(float viewZNear, float viewZFar, uint tileX, uint tileY) +{ + uint tileWidth = TILE_SIZE; + uint tileHeight = TILE_SIZE; + uint x = tileX * tileWidth; + uint y = tileY * tileHeight; + vec3 tl_direction = unprojectDirection(vec2(x, y)); + vec3 br_direction = unprojectDirection(vec2(x + tileWidth, y + tileHeight)); + vec3 front_tl = tl_direction * viewZNear; + vec3 front_br = br_direction * viewZNear; + vec3 back_tl = tl_direction * viewZFar; + vec3 back_br = br_direction * viewZFar; + Tile tile; + tile.aabbMin = min(min(min(front_tl, front_br), back_tl), back_br); + tile.aabbMax = max(max(max(front_tl, front_br), back_tl), back_br); + return tile; +} + +vec3 unprojectDirection(vec2 pos) +{ + // float f = 1.0f / tan(fovY * 0.5f); + // float rcpF = 1.0f / f; + // float rcpFDivAspect = 1.0f / (f / aspect); + vec2 normalized = vec2(pos * twoRcpViewportSize) - 1.0; + return vec3(normalized.x * rcpFDivAspect, normalized.y * rcpF, 1.0f); } From b43f84def6ccb745f34d90b40901d0be88057d0a Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 16 Sep 2024 01:04:53 +0200 Subject: [PATCH 273/414] Hook up light tile visibility test --- .../hwrenderer/data/hw_renderstate.h | 2 +- .../rendering/vulkan/shaders/vk_shader.h | 11 +++---- .../rendering/vulkan/vk_renderstate.cpp | 16 ++++++++-- src/common/rendering/vulkan/vk_renderstate.h | 2 +- .../hwrenderer/scene/hw_drawinfo.cpp | 2 +- .../static/shaders/scene/comp_lighttiles.glsl | 29 +++++++++---------- 6 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 3ad41688d..788947768 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -699,7 +699,7 @@ public: } // Draw level mesh - virtual void DispatchLightTiles() { } + virtual void DispatchLightTiles(const VSMatrix& worldToView, float m5) { } virtual void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) { } virtual int GetNextQueryIndex() { return 0; } virtual void BeginQuery() { } diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 1ad568202..7428f1f46 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -58,11 +58,12 @@ struct LightTilesPushConstants int additiveCount; int modulatedCount; int subtractiveCount; - int padding; - float rcpF; - float rcpFDivAspect; - float twoRcpViewportSizeX; - float twoRcpViewportSizeY; + int padding0; + FVector2 posToViewA; + FVector2 posToViewB; + FVector2 viewportPos; + FVector2 padding1; + VSMatrix worldToView; }; class VkShaderKey diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index c3ef50672..457cd990a 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -940,7 +940,7 @@ void VkRenderState::RunZMinMaxPass() .Execute(cmdbuffer); } -void VkRenderState::DispatchLightTiles() +void VkRenderState::DispatchLightTiles(const VSMatrix& worldToView, float m5) { EndRenderPass(); RunZMinMaxPass(); @@ -951,12 +951,24 @@ void VkRenderState::DispatchLightTiles() .AddBuffer(fb->GetBuffers()->SceneLightTiles.get(), VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_SHADER_WRITE_BIT) .Execute(cmdbuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + float sceneWidth = (float)fb->GetBuffers()->GetSceneWidth(); + float sceneHeight = (float)fb->GetBuffers()->GetSceneHeight(); + float aspect = sceneWidth / sceneHeight; + + //float tanHalfFovy = tan(fovy * (M_PI / 360.0f)); + float tanHalfFovy = 1.0f / m5; + float invFocalLenX = tanHalfFovy * aspect; + float invFocalLenY = tanHalfFovy; + LightTilesPushConstants pushConstants = {}; //auto mesh = fb->GetLevelMesh()->GetMesh(); //pushConstants.normalLightCount = mesh->Mesh.NormalLightCount; //pushConstants.modulatedLightCount = mesh->Mesh.ModulatedLightCount; //pushConstants.subtractiveLightCount = mesh->Mesh.SubtractiveLightCount; - + pushConstants.posToViewA = { 2.0f * invFocalLenX / sceneWidth, 2.0f * invFocalLenY / sceneHeight }; + pushConstants.posToViewB = { -invFocalLenX, -invFocalLenY }; + pushConstants.viewportPos = { 0.0f, 0.0f }; + pushConstants.worldToView = worldToView; auto pipelines = fb->GetRenderPassManager(); auto descriptors = fb->GetDescriptorSetManager(); cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, pipelines->GetLightTilesPipeline()); diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index 80020db86..28a31eabf 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -57,7 +57,7 @@ public: void ResetVertices() override; // Draw level mesh - void DispatchLightTiles() override; + void DispatchLightTiles(const VSMatrix& worldToView, float m5) override; void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) override; int GetNextQueryIndex() override; void BeginQuery() override; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 9d609a5a0..6592e2a20 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -443,7 +443,7 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) state.SetColorMask(false); state.SetCulling(Cull_CW); state.DrawLevelMesh(LevelMeshDrawType::Opaque, true); - state.DispatchLightTiles(); + state.DispatchLightTiles(VPUniforms.mViewMatrix, VPUniforms.mProjectionMatrix.get()[5]); state.DrawLevelMesh(LevelMeshDrawType::Masked, false); // To do: properly mark wall top/bottom as opaque so we don't need this if (gl_portals) { diff --git a/wadsrc/static/shaders/scene/comp_lighttiles.glsl b/wadsrc/static/shaders/scene/comp_lighttiles.glsl index a0e6128b3..295907710 100644 --- a/wadsrc/static/shaders/scene/comp_lighttiles.glsl +++ b/wadsrc/static/shaders/scene/comp_lighttiles.glsl @@ -15,15 +15,17 @@ layout(set = 0, binding = 2) buffer Tiles vec4 tiles[]; }; -layout(push_constant) uniform PushConstants +layout(push_constant) uniform LightTilesPushConstants { int additiveCount; int modulatedCount; int subtractiveCount; - int padding; - float rcpF; - float rcpFDivAspect; - vec2 twoRcpViewportSize; + int padding0; + vec2 posToViewA; + vec2 posToViewB; + vec2 viewportPos; + vec2 padding1; + mat4 worldToView; }; struct Tile @@ -57,10 +59,12 @@ void main() int tileModulatedCount = 0; int tileSubtractiveCount = 0; - if (isLightVisible(tile, vec3(-316.0, 64.0, 621.0), 200.0)) + vec4 testLight = vec4(-316.0, 64.0, 621.0, 200.0); + + if (isLightVisible(tile, (worldToView * vec4(testLight.xyz, 1.0)).xyz, testLight.w)) { - vec3 pos = vec3(-316.0, 64.0, 621.0); - float radius = 200.0; + vec3 pos = testLight.xyz; + float radius = testLight.w; vec3 color = vec3(1.0, 1.0, 1.0); float shadowIndex = -1025.0; vec3 spotDir = vec3(0.0); @@ -85,12 +89,9 @@ void main() bool isLightVisible(Tile tile, vec3 lightPos, float lightRadius) { -/* // aabb/sphere test for the light vec3 e = max(tile.aabbMin - lightPos, 0.0f) + max(lightPos - tile.aabbMax, 0.0f); return dot(e, e) <= lightRadius * lightRadius; -*/ - return true; } Tile findTileFrustum(float viewZNear, float viewZFar, uint tileX, uint tileY) @@ -113,9 +114,5 @@ Tile findTileFrustum(float viewZNear, float viewZFar, uint tileX, uint tileY) vec3 unprojectDirection(vec2 pos) { - // float f = 1.0f / tan(fovY * 0.5f); - // float rcpF = 1.0f / f; - // float rcpFDivAspect = 1.0f / (f / aspect); - vec2 normalized = vec2(pos * twoRcpViewportSize) - 1.0; - return vec3(normalized.x * rcpFDivAspect, normalized.y * rcpF, 1.0f); + return vec3(posToViewA * (pos - viewportPos) + posToViewB, 1.0f); } From 83009db3ec82c3b05db817b98da7f3efcb2dafdf Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 16 Sep 2024 01:45:44 +0200 Subject: [PATCH 274/414] Fix zminmax not being linear depth --- .../descriptorsets/vk_descriptorset.cpp | 8 +++--- .../vulkan/descriptorsets/vk_descriptorset.h | 2 +- .../vulkan/pipelines/vk_renderpass.cpp | 2 +- .../rendering/vulkan/shaders/vk_shader.h | 8 ++++++ .../vulkan/textures/vk_renderbuffers.cpp | 2 +- .../vulkan/textures/vk_renderbuffers.h | 2 +- .../rendering/vulkan/vk_renderstate.cpp | 11 ++++++-- .../static/shaders/scene/frag_zminmax0.glsl | 26 +++++++++++++++---- .../static/shaders/scene/frag_zminmax1.glsl | 8 ++++++ 9 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index d505d5c39..711fea0a0 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -110,7 +110,7 @@ void VkDescriptorSetManager::UpdateLevelMeshSet() void VkDescriptorSetManager::UpdateLightTilesSet() { WriteDescriptors() - .AddStorageImage(LightTiles.Set.get(), 0, fb->GetBuffers()->SceneZMinMax[4].View.get(), VK_IMAGE_LAYOUT_GENERAL) + .AddStorageImage(LightTiles.Set.get(), 0, fb->GetBuffers()->SceneZMinMax[5].View.get(), VK_IMAGE_LAYOUT_GENERAL) .AddBuffer(LightTiles.Set.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetUniformsBuffer()) .AddBuffer(LightTiles.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBuffers()->SceneLightTiles.get()) .Execute(fb->GetDevice()); @@ -122,7 +122,7 @@ void VkDescriptorSetManager::UpdateZMinMaxSet() .AddCombinedImageSampler(ZMinMax.Set[0].get(), 0, fb->GetBuffers()->SceneDepthStencil.DepthOnlyView.get(), fb->GetSamplerManager()->ZMinMaxSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) .Execute(fb->GetDevice()); - for (int i = 1; i < 5; i++) + for (int i = 1; i < 6; i++) { WriteDescriptors() .AddCombinedImageSampler(ZMinMax.Set[i].get(), 0, fb->GetBuffers()->SceneZMinMax[i - 1].View.get(), fb->GetSamplerManager()->ZMinMaxSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) @@ -314,8 +314,8 @@ void VkDescriptorSetManager::CreateLightTilesPool() void VkDescriptorSetManager::CreateZMinMaxPool() { ZMinMax.Pool = DescriptorPoolBuilder() - .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 5) - .MaxSets(5) + .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6) + .MaxSets(6) .DebugName("VkDescriptorSetManager.ZMinMax.Pool") .Create(fb->GetDevice()); } diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h index 2dc87b8a9..d85ca280f 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h @@ -110,7 +110,7 @@ private: struct { std::unique_ptr Pool; - std::unique_ptr Set[5]; + std::unique_ptr Set[6]; std::unique_ptr Layout; } ZMinMax; diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index 53ad0b07e..8c63b586d 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -189,7 +189,7 @@ void VkRenderPassManager::CreateZMinMaxPipeline() ZMinMax.Layout = PipelineLayoutBuilder() .AddSetLayout(fb->GetDescriptorSetManager()->GetZMinMaxLayout()) - //.AddPushConstantRange(VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(ZMinMaxPushConstants)) + .AddPushConstantRange(VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(ZMinMaxPushConstants)) .DebugName("VkRenderPassManager.ZMinMax.Layout") .Create(fb->GetDevice()); diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 7428f1f46..ba46c50e6 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -53,6 +53,14 @@ struct PushConstants int uFogballIndex; // fog balls }; +struct ZMinMaxPushConstants +{ + float LinearizeDepthA; + float LinearizeDepthB; + float InverseDepthRangeA; + float InverseDepthRangeB; +}; + struct LightTilesPushConstants { int additiveCount; diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index fcaf41b66..57dab614a 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -305,7 +305,7 @@ void VkRenderBuffers::CreateSceneZMinMax(int width, int height) width = (width + 63) / 64 * 64; height = (height + 63) / 64 * 64; - for (int i = 0; i < 5; i++) + for (int i = 0; i < 6; i++) { width >>= 1; height >>= 1; diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.h b/src/common/rendering/vulkan/textures/vk_renderbuffers.h index 4f2aa8502..16ce615b2 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.h +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.h @@ -37,7 +37,7 @@ public: VkTextureImage SceneFog; VkTextureImage SceneLinearDepth; - VkTextureImage SceneZMinMax[5]; + VkTextureImage SceneZMinMax[6]; std::unique_ptr SceneLightTiles; VkFormat PipelineDepthStencilFormat = VK_FORMAT_D24_UNORM_S8_UINT; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 457cd990a..ee26209e8 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -877,6 +877,12 @@ void VkRenderState::RunZMinMaxPass() int width = ((buffers->GetWidth() + 63) / 64 * 64) >> 1; int height = ((buffers->GetHeight() + 63) / 64 * 64) >> 1; + ZMinMaxPushConstants pushConstants = {}; + pushConstants.LinearizeDepthA = 1.0f / screen->GetZFar() - 1.0f / screen->GetZNear(); + pushConstants.LinearizeDepthB = max(1.0f / screen->GetZNear(), 1.e-8f); + pushConstants.InverseDepthRangeA = 1.0f; + pushConstants.InverseDepthRangeB = 0.0f; + VkImageTransition() .AddImage(&fb->GetBuffers()->SceneDepthStencil, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false) .AddImage(&fb->GetBuffers()->SceneZMinMax[0], VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, true) @@ -901,10 +907,11 @@ void VkRenderState::RunZMinMaxPass() cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines->GetZMinMaxPipeline0(mRenderTarget.Samples)); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines->GetZMinMaxLayout(), 0, descriptors->GetZMinMaxSet(0)); + cmdbuffer->pushConstants(pipelines->GetZMinMaxLayout(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(ZMinMaxPushConstants), &pushConstants); cmdbuffer->draw(6, 1, 0, 0); cmdbuffer->endRenderPass(); - for (int i = 1; i < 5; i++) + for (int i = 1; i < 6; i++) { VkImageTransition() .AddImage(&fb->GetBuffers()->SceneZMinMax[i - 1], VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false) @@ -936,7 +943,7 @@ void VkRenderState::RunZMinMaxPass() VkImageTransition() .AddImage(&fb->GetBuffers()->SceneDepthStencil, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, false) - .AddImage(&fb->GetBuffers()->SceneZMinMax[4], VK_IMAGE_LAYOUT_GENERAL, false) + .AddImage(&fb->GetBuffers()->SceneZMinMax[5], VK_IMAGE_LAYOUT_GENERAL, false) .Execute(cmdbuffer); } diff --git a/wadsrc/static/shaders/scene/frag_zminmax0.glsl b/wadsrc/static/shaders/scene/frag_zminmax0.glsl index 7292c9355..bb13ca4d4 100644 --- a/wadsrc/static/shaders/scene/frag_zminmax0.glsl +++ b/wadsrc/static/shaders/scene/frag_zminmax0.glsl @@ -7,6 +7,16 @@ layout(binding = 0) uniform sampler2D Texture; layout(location = 0) out vec4 FragMinMax; +layout(push_constant) uniform ZMinMaxPushConstants +{ + float LinearizeDepthA; + float LinearizeDepthB; + float InverseDepthRangeA; + float InverseDepthRangeB; +}; + +float normalizeDepth(float depth); + void main() { #if defined(MULTISAMPLE) @@ -15,12 +25,18 @@ void main() ivec2 size = textureSize(Texture, 0) - 1; #endif ivec2 pos = ivec2(gl_FragCoord.xy) * 2; - float z0 = texelFetch(Texture, min(pos, size), 0).w; - float z1 = texelFetch(Texture, min(pos + ivec2(1,0), size), 0).w; - float z2 = texelFetch(Texture, min(pos + ivec2(0,1), size), 0).w; - float z3 = texelFetch(Texture, min(pos + ivec2(1,1), size), 0).w; + float z0 = texelFetch(Texture, min(pos, size), 0).x; + float z1 = texelFetch(Texture, min(pos + ivec2(1,0), size), 0).x; + float z2 = texelFetch(Texture, min(pos + ivec2(0,1), size), 0).x; + float z3 = texelFetch(Texture, min(pos + ivec2(1,1), size), 0).x; vec2 zminmax = vec2( min(min(min(z0, z1), z2), z3), max(max(max(z0, z1), z2), z3)); - FragMinMax = vec4(zminmax, 0, 0); + FragMinMax = vec4(normalizeDepth(zminmax.x), normalizeDepth(zminmax.y), 0, 0); +} + +float normalizeDepth(float depth) +{ + float normalizedDepth = clamp(InverseDepthRangeA * depth + InverseDepthRangeB, 0.0, 1.0); + return 1.0 / (normalizedDepth * LinearizeDepthA + LinearizeDepthB); } diff --git a/wadsrc/static/shaders/scene/frag_zminmax1.glsl b/wadsrc/static/shaders/scene/frag_zminmax1.glsl index 1b3387025..bdcd56329 100644 --- a/wadsrc/static/shaders/scene/frag_zminmax1.glsl +++ b/wadsrc/static/shaders/scene/frag_zminmax1.glsl @@ -2,6 +2,14 @@ layout(binding = 0) uniform sampler2D Texture; layout(location = 0) out vec4 FragMinMax; +layout(push_constant) uniform ZMinMaxPushConstants +{ + float LinearizeDepthA; + float LinearizeDepthB; + float InverseDepthRangeA; + float InverseDepthRangeB; +}; + void main() { ivec2 pos = ivec2(gl_FragCoord.xy) * 2; From 5992fa44ddb40ee8194e8168e7ba998221473f8e Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 16 Sep 2024 02:04:23 +0200 Subject: [PATCH 275/414] Fix culling bug --- wadsrc/static/shaders/scene/comp_lighttiles.glsl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wadsrc/static/shaders/scene/comp_lighttiles.glsl b/wadsrc/static/shaders/scene/comp_lighttiles.glsl index 295907710..18734e47c 100644 --- a/wadsrc/static/shaders/scene/comp_lighttiles.glsl +++ b/wadsrc/static/shaders/scene/comp_lighttiles.glsl @@ -89,6 +89,9 @@ void main() bool isLightVisible(Tile tile, vec3 lightPos, float lightRadius) { + // Negative Z go into the screen, but zminmax is positive Z + lightPos.z = -lightPos.z; + // aabb/sphere test for the light vec3 e = max(tile.aabbMin - lightPos, 0.0f) + max(lightPos - tile.aabbMax, 0.0f); return dot(e, e) <= lightRadius * lightRadius; From 76536be8041c7c904ad6e9032b25149dcb45635f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 16 Sep 2024 18:06:21 +0200 Subject: [PATCH 276/414] Use the dynamic lights from the level mesh in the light tiles shader --- .../hwrenderer/data/hw_levelmesh.cpp | 2 +- .../descriptorsets/vk_descriptorset.cpp | 2 +- .../rendering/vulkan/shaders/vk_shader.h | 4 - .../rendering/vulkan/vk_renderstate.cpp | 4 - src/rendering/hwrenderer/doom_levelmesh.cpp | 53 +++++++++++- src/rendering/hwrenderer/doom_levelmesh.h | 3 + .../static/shaders/scene/comp_lighttiles.glsl | 81 ++++++++++++------- 7 files changed, 107 insertions(+), 42 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 85c6880d6..62c9203ab 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -33,7 +33,7 @@ void LevelMesh::Reset(const LevelMeshLimits& limits) Mesh.Lights.Resize(16); Mesh.LightIndexes.Resize(16); - Mesh.DynLights.Resize(16); + Mesh.DynLights.Resize(50'000 * 4); Mesh.Indexes.Resize(limits.MaxIndexes); Mesh.SurfaceIndexes.Resize(limits.MaxIndexes / 3 + 1); diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 711fea0a0..aa63ac417 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -111,7 +111,7 @@ void VkDescriptorSetManager::UpdateLightTilesSet() { WriteDescriptors() .AddStorageImage(LightTiles.Set.get(), 0, fb->GetBuffers()->SceneZMinMax[5].View.get(), VK_IMAGE_LAYOUT_GENERAL) - .AddBuffer(LightTiles.Set.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetUniformsBuffer()) + .AddBuffer(LightTiles.Set.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetDynLightBuffer()) .AddBuffer(LightTiles.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBuffers()->SceneLightTiles.get()) .Execute(fb->GetDevice()); } diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index ba46c50e6..6ad43464c 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -63,10 +63,6 @@ struct ZMinMaxPushConstants struct LightTilesPushConstants { - int additiveCount; - int modulatedCount; - int subtractiveCount; - int padding0; FVector2 posToViewA; FVector2 posToViewB; FVector2 viewportPos; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index ee26209e8..f55bdb0f0 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -968,10 +968,6 @@ void VkRenderState::DispatchLightTiles(const VSMatrix& worldToView, float m5) float invFocalLenY = tanHalfFovy; LightTilesPushConstants pushConstants = {}; - //auto mesh = fb->GetLevelMesh()->GetMesh(); - //pushConstants.normalLightCount = mesh->Mesh.NormalLightCount; - //pushConstants.modulatedLightCount = mesh->Mesh.ModulatedLightCount; - //pushConstants.subtractiveLightCount = mesh->Mesh.SubtractiveLightCount; pushConstants.posToViewA = { 2.0f * invFocalLenX / sceneWidth, 2.0f * invFocalLenY / sceneHeight }; pushConstants.posToViewB = { -invFocalLenX, -invFocalLenY }; pushConstants.viewportPos = { 0.0f, 0.0f }; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index bc3097fae..67a36829a 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -9,6 +9,7 @@ #include "a_dynlight.h" #include "hw_renderstate.h" #include "hw_vertexbuilder.h" +#include "hw_dynlightdata.h" #include "hwrenderer/scene/hw_drawstructs.h" #include "hwrenderer/scene/hw_drawinfo.h" #include "hwrenderer/scene/hw_walldispatcher.h" @@ -65,7 +66,7 @@ ADD_STAT(levelmesh) auto& stats = level.levelMesh->LastFrameStats; FString out; if (level.levelMesh) - out.Format("Sides=%d, flats=%d, portals=%d", stats.SidesUpdated, stats.FlatsUpdated, stats.Portals); + out.Format("Sides=%d, flats=%d, portals=%d, dynlights=%d", stats.SidesUpdated, stats.FlatsUpdated, stats.Portals, stats.DynLights); else out = "No level mesh"; return out; @@ -253,6 +254,56 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) CreateLights(doomMap); UpdateWallPortals(); + + UploadDynLights(doomMap); +} + +void DoomLevelMesh::UploadDynLights(FLevelLocals& doomMap) +{ + lightdata.Clear(); + for (auto light = doomMap.lights; light; light = light->next) + { + int portalGroup = 0; // What value should this have? + AddLightToList(lightdata, portalGroup, light, false); + CurFrameStats.DynLights++; + } + + // All meaasurements here are in vec4's. + int size0 = lightdata.arrays[0].Size() / 4; + int size1 = lightdata.arrays[1].Size() / 4; + int size2 = lightdata.arrays[2].Size() / 4; + int totalsize = size0 + size1 + size2 + 1; + int maxLightData = Mesh.DynLights.Size(); + + // Clamp lights so they aren't bigger than what fits into a single dynamic uniform buffer page + if (totalsize > maxLightData) + { + int diff = totalsize - maxLightData; + + size2 -= diff; + if (size2 < 0) + { + size1 += size2; + size2 = 0; + } + if (size1 < 0) + { + size0 += size1; + size1 = 0; + } + totalsize = size0 + size1 + size2 + 1; + } + size0 = std::min(size0, maxLightData - 1); + + float parmcnt[] = { 0, float(size0), float(size0 + size1), float(size0 + size1 + size2) }; + + float* copyptr = (float*)Mesh.DynLights.Data(); + memcpy(©ptr[0], parmcnt, sizeof(FVector4)); + memcpy(©ptr[4], &lightdata.arrays[0][0], size0 * sizeof(FVector4)); + memcpy(©ptr[4 + 4 * size0], &lightdata.arrays[1][0], size1 * sizeof(FVector4)); + memcpy(©ptr[4 + 4 * (size0 + size1)], &lightdata.arrays[2][0], size2 * sizeof(FVector4)); + + AddRange(UploadRanges.DynLight, { 0, totalsize }); } void DoomLevelMesh::UpdateWallPortals() diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 3f6263d9d..4aeb89331 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -127,6 +127,7 @@ public: int FlatsUpdated = 0; int SidesUpdated = 0; int Portals = 0; + int DynLights = 0; }; Stats LastFrameStats, CurFrameStats; @@ -170,6 +171,8 @@ private: void RemoveFromDrawList(const TArray& drawRanges); void SortDrawLists(); + void UploadDynLights(FLevelLocals& doomMap); + TArray DoomSurfaceInfos; TArray Sides; diff --git a/wadsrc/static/shaders/scene/comp_lighttiles.glsl b/wadsrc/static/shaders/scene/comp_lighttiles.glsl index 18734e47c..a6ded965c 100644 --- a/wadsrc/static/shaders/scene/comp_lighttiles.glsl +++ b/wadsrc/static/shaders/scene/comp_lighttiles.glsl @@ -17,10 +17,6 @@ layout(set = 0, binding = 2) buffer Tiles layout(push_constant) uniform LightTilesPushConstants { - int additiveCount; - int modulatedCount; - int subtractiveCount; - int padding0; vec2 posToViewA; vec2 posToViewB; vec2 viewportPos; @@ -53,38 +49,61 @@ void main() const int maxLights = 16; const int lightSize = 4; int tileOffset = (tilePos.x + tilePos.y * zminmaxSize.x) * (1 + maxLights * lightSize); - int outLightOffset = tileOffset + 1; - int tileAdditiveCount = 0; - int tileModulatedCount = 0; - int tileSubtractiveCount = 0; + ivec4 inRanges = ivec4(lights[0]) + ivec4(1); + ivec4 outRanges = ivec4(0); - vec4 testLight = vec4(-316.0, 64.0, 621.0, 200.0); - - if (isLightVisible(tile, (worldToView * vec4(testLight.xyz, 1.0)).xyz, testLight.w)) + int count = 0; + int offset = tileOffset + 1; + for (int i = inRanges.x; i < inRanges.y; i += 4) { - vec3 pos = testLight.xyz; - float radius = testLight.w; - vec3 color = vec3(1.0, 1.0, 1.0); - float shadowIndex = -1025.0; - vec3 spotDir = vec3(0.0); - float lightType = 0.0; - float spotInnerAngle = 0.0; - float spotOuterAngle = 0.0; - float softShadowRadius = 0.0; - - tileAdditiveCount++; - tiles[outLightOffset++] = vec4(pos, radius); - tiles[outLightOffset++] = vec4(color, shadowIndex); - tiles[outLightOffset++] = vec4(spotDir, lightType); - tiles[outLightOffset++] = vec4(spotInnerAngle, spotOuterAngle, softShadowRadius, 0.0); + vec4 inLight = lights[i]; + vec3 pos = (worldToView * vec4(inLight.xyz, 1.0)).xyz; + float radius = inLight.w; + if (isLightVisible(tile, pos, radius)) + { + tiles[offset++] = inLight; + tiles[offset++] = lights[i + 1]; + tiles[offset++] = lights[i + 2]; + tiles[offset++] = lights[i + 3]; + count += 4; + } } + outRanges.y = count; - tiles[tileOffset] = vec4(ivec4( - 0, - tileAdditiveCount, - tileAdditiveCount + tileModulatedCount, - tileAdditiveCount + tileModulatedCount + tileSubtractiveCount)); + for (int i = inRanges.y; i < inRanges.z; i += 4) + { + vec4 inLight = lights[i]; + vec3 pos = (worldToView * vec4(inLight.xyz, 1.0)).xyz; + float radius = inLight.w; + if (isLightVisible(tile, pos, radius)) + { + tiles[offset++] = inLight; + tiles[offset++] = lights[i + 1]; + tiles[offset++] = lights[i + 2]; + tiles[offset++] = lights[i + 3]; + count += 4; + } + } + outRanges.z = count; + + for (int i = inRanges.z; i < inRanges.w; i += 4) + { + vec4 inLight = lights[i]; + vec3 pos = (worldToView * vec4(inLight.xyz, 1.0)).xyz; + float radius = inLight.w; + if (isLightVisible(tile, pos, radius)) + { + tiles[offset++] = inLight; + tiles[offset++] = lights[i + 1]; + tiles[offset++] = lights[i + 2]; + tiles[offset++] = lights[i + 3]; + count += 4; + } + } + outRanges.w = count; + + tiles[tileOffset] = vec4(outRanges); } bool isLightVisible(Tile tile, vec3 lightPos, float lightRadius) From b79deabab1b2e3ab38c9699be3ff35412b839346 Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Mon, 16 Sep 2024 09:43:15 -0600 Subject: [PATCH 277/414] Prevent console from laying open when intro cutscene plays on some systems. --- src/g_game.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_game.cpp b/src/g_game.cpp index 105b16aa7..e80a5cfd2 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1236,6 +1236,7 @@ void G_Ticker () case ga_intro: gamestate = GS_INTRO; gameaction = ga_nothing; + C_HideConsole(); // On some systems, console is open during intro break; From c3f65fecdb553ce28250891599081eb50c8999c2 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 16 Sep 2024 21:58:10 +0200 Subject: [PATCH 278/414] Half the scene (all upper and lower walls) is drawn as masked unfortunately --- .../rendering/vulkan/shaders/vk_shader.cpp | 1 + .../rendering/vulkan/shaders/vk_shader.h | 3 ++- .../rendering/vulkan/vk_renderstate.cpp | 21 +++++++++++++++++-- src/common/rendering/vulkan/vk_renderstate.h | 2 +- .../hwrenderer/scene/hw_drawinfo.cpp | 5 +++-- wadsrc/static/shaders/scene/frag_main.glsl | 4 ++++ 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index c80f5670a..81797f201 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -219,6 +219,7 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (!fb->GetDevice()->EnabledFeatures.Features.shaderClipDistance) definesBlock << "#define NO_CLIPDISTANCE_SUPPORT\n"; if (!key.AlphaTest) definesBlock << "#define NO_ALPHATEST\n"; if (key.GBufferPass) definesBlock << "#define GBUFFER_PASS\n"; + if (key.AlphaTestOnly) definesBlock << "#define ALPHATEST_ONLY\n"; if (key.DepthFadeThreshold) definesBlock << "#define USE_DEPTHFADETHRESHOLD\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 6ad43464c..035a1a60e 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -97,7 +97,8 @@ public: uint64_t FogBalls : 1; // FOGBALLS uint64_t NoFragmentShader : 1; uint64_t DepthFadeThreshold : 1; - uint64_t Unused : 41; + uint64_t AlphaTestOnly : 1; // ALPHATEST_ONLY + uint64_t Unused : 40; }; uint64_t AsQWORD = 0; }; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index f55bdb0f0..9961a64ef 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -874,6 +874,8 @@ void VkRenderState::RunZMinMaxPass() auto buffers = fb->GetBuffers(); auto cmdbuffer = fb->GetCommands()->GetDrawCommands(); + fb->GetCommands()->PushGroup(cmdbuffer, "zminmax"); + int width = ((buffers->GetWidth() + 63) / 64 * 64) >> 1; int height = ((buffers->GetHeight() + 63) / 64 * 64) >> 1; @@ -945,6 +947,8 @@ void VkRenderState::RunZMinMaxPass() .AddImage(&fb->GetBuffers()->SceneDepthStencil, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, false) .AddImage(&fb->GetBuffers()->SceneZMinMax[5], VK_IMAGE_LAYOUT_GENERAL, false) .Execute(cmdbuffer); + + fb->GetCommands()->PopGroup(cmdbuffer); } void VkRenderState::DispatchLightTiles(const VSMatrix& worldToView, float m5) @@ -954,6 +958,8 @@ void VkRenderState::DispatchLightTiles(const VSMatrix& worldToView, float m5) auto cmdbuffer = fb->GetCommands()->GetDrawCommands(); + fb->GetCommands()->PushGroup(cmdbuffer, "lighttiles"); + PipelineBarrier() .AddBuffer(fb->GetBuffers()->SceneLightTiles.get(), VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_SHADER_WRITE_BIT) .Execute(cmdbuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); @@ -986,6 +992,8 @@ void VkRenderState::DispatchLightTiles(const VSMatrix& worldToView, float m5) PipelineBarrier() .AddBuffer(fb->GetBuffers()->SceneLightTiles.get(), VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT) .Execute(cmdbuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + + fb->GetCommands()->PopGroup(cmdbuffer); } void VkRenderState::DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) @@ -998,7 +1006,7 @@ void VkRenderState::DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentSha int pipelineID = it.first; const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID); - ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader); + ApplyLevelMeshPipeline(mCommandBuffer, key, drawType, noFragmentShader); for (MeshBufferRange& range : it.second) { @@ -1009,6 +1017,8 @@ void VkRenderState::DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentSha void VkRenderState::BeginQuery() { + if (!mCommandBuffer) + ApplyRenderPass(DT_Triangles); mCommandBuffer->beginQuery(mRSBuffers->OcclusionQuery.QueryPool.get(), mRSBuffers->OcclusionQuery.NextIndex++, 0); } @@ -1039,8 +1049,15 @@ void VkRenderState::GetQueryResults(int queryStart, int queryCount, TArray } } -void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader) +void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, LevelMeshDrawType drawType, bool noFragmentShader) { + if (drawType == LevelMeshDrawType::Masked && noFragmentShader) + { + // We unfortunately have to run the fragment shader to know which pixels are masked. Use a simplified version to reduce the cost. + noFragmentShader = false; + pipelineKey.ShaderKey.AlphaTestOnly = true; + } + // Global state that don't require rebuilding the mesh pipelineKey.ShaderKey.NoFragmentShader = noFragmentShader; pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index 28a31eabf..163ce72bf 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -92,7 +92,7 @@ protected: void RunZMinMaxPass(); void ApplyLevelMesh(); - void ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader); + void ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, LevelMeshDrawType drawType, bool noFragmentShader); VulkanRenderDevice* fb = nullptr; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 6592e2a20..5129bb326 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -443,8 +443,7 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) state.SetColorMask(false); state.SetCulling(Cull_CW); state.DrawLevelMesh(LevelMeshDrawType::Opaque, true); - state.DispatchLightTiles(VPUniforms.mViewMatrix, VPUniforms.mProjectionMatrix.get()[5]); - state.DrawLevelMesh(LevelMeshDrawType::Masked, false); // To do: properly mark wall top/bottom as opaque so we don't need this + state.DrawLevelMesh(LevelMeshDrawType::Masked, true); if (gl_portals) { state.SetDepthBias(1, 128); @@ -481,6 +480,8 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) state.SetDepthMask(true); int queryEnd = state.GetNextQueryIndex(); + state.DispatchLightTiles(VPUniforms.mViewMatrix, VPUniforms.mProjectionMatrix.get()[5]); + // draw opaque level so the GPU has something to do while we examine the query results state.DrawLevelMesh(LevelMeshDrawType::Opaque, false); state.DrawLevelMesh(LevelMeshDrawType::Masked, false); diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index def4164b3..8f8acc813 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -32,6 +32,8 @@ void main() if (material.Base.a <= uAlphaThreshold) discard; #endif +#ifndef ALPHATEST_ONLY + #ifdef USE_DEPTHFADETHRESHOLD float behindFragmentDepth = texelFetch(LinearDepth, uViewOffset + ivec2(gl_FragCoord.xy), 0).r; material.Base.a *= clamp((behindFragmentDepth - pixelpos.w) / uDepthFadeThreshold, 0.0, 1.0); @@ -63,4 +65,6 @@ void main() FragFog = vec4(AmbientOcclusionColor(), 1.0); FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); #endif + +#endif } From faead1c7339a9fb20dd18e26608ddb05ff8855ae Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Sat, 10 Aug 2024 20:27:12 -0700 Subject: [PATCH 279/414] Fix bug where down arrow does nothing after clicking the main menu This issue was previously fixed in 0c2ed71cdd2676af6aecf6e26b0ab1a692e66d71, but that change added a bug that would trigger an infinite loop on scrolling in a list without any selectable items. Then 4fdbe81a132c472532985d31143c0dc26605283a restored the old behavior, reintroducing the issue. This new fix does handle lists without any selectable items correctly. --- wadsrc/static/zscript/engine/ui/menu/listmenu.zs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/engine/ui/menu/listmenu.zs b/wadsrc/static/zscript/engine/ui/menu/listmenu.zs index ed3c2ef16..2489e41a4 100644 --- a/wadsrc/static/zscript/engine/ui/menu/listmenu.zs +++ b/wadsrc/static/zscript/engine/ui/menu/listmenu.zs @@ -188,11 +188,12 @@ class ListMenu : Menu override bool MenuEvent (int mkey, bool fromcontroller) { int oldSelect = mDesc.mSelectedItem; - int startedAt = max(0, mDesc.mSelectedItem); + int startedAt; switch (mkey) { case MKEY_Up: + startedAt = mDesc.mSelectedItem < 0 ? 0 : mDesc.mSelectedItem; do { if (--mDesc.mSelectedItem < 0) mDesc.mSelectedItem = mDesc.mItems.Size()-1; @@ -203,6 +204,7 @@ class ListMenu : Menu return true; case MKEY_Down: + startedAt = mDesc.mSelectedItem < 0 ? mDesc.mItems.Size()-1 : mDesc.mSelectedItem; do { if (++mDesc.mSelectedItem >= mDesc.mItems.Size()) mDesc.mSelectedItem = 0; From 1c3538d77e17cc41e0e8e24d570bcb39969df432 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 16 Sep 2024 22:53:01 +0200 Subject: [PATCH 280/414] Draw the particles --- src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 5129bb326..22eac85c8 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -527,6 +527,16 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) sprite.Process(this, state, thing, thing->Sector, in_area, false); } + // Draw particles + for (uint16_t i = level.ActiveParticles; i != NO_PARTICLE; i = level.Particles[i].tnext) + { + if (Level->Particles[i].subsector) + { + HWSprite sprite; + sprite.ProcessParticle(this, state, &Level->Particles[i], Level->Particles[i].subsector->sector, nullptr); + } + } + // Process all the sprites on the current portal's back side which touch the portal. if (mCurrentPortal != nullptr) mCurrentPortal->RenderAttached(this, state); From c8fbe43dc0fbadf8c00ed4d92d27f6dad9474a1e Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Sat, 10 Aug 2024 21:13:21 -0700 Subject: [PATCH 281/414] Fix load/save menus not starting scrolled to the selected entry Fixes https://github.com/ZDoom/gzdoom/issues/2645 --- wadsrc/static/zscript/engine/ui/menu/loadsavemenu.zs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/engine/ui/menu/loadsavemenu.zs b/wadsrc/static/zscript/engine/ui/menu/loadsavemenu.zs index e15ca266f..82b5ea4bf 100644 --- a/wadsrc/static/zscript/engine/ui/menu/loadsavemenu.zs +++ b/wadsrc/static/zscript/engine/ui/menu/loadsavemenu.zs @@ -483,8 +483,8 @@ class SaveMenu : LoadSaveMenu { Super.Init(parent, desc); manager.InsertNewSaveNode(); - TopItem = 0; Selected = manager.ExtractSaveData (-1); + TopItem = MAX(0, Selected - listboxRows + 1); UpdateSaveComment(); } @@ -623,8 +623,8 @@ class LoadMenu : LoadSaveMenu override void Init(Menu parent, ListMenuDescriptor desc) { Super.Init(parent, desc); - TopItem = 0; Selected = manager.ExtractSaveData (-1); + TopItem = MAX(0, Selected - listboxRows + 1); UpdateSaveComment(); } From 9c4814350f888a209fc6b671757cbdb29ab5902d Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sat, 14 Sep 2024 16:29:25 +0800 Subject: [PATCH 282/414] Fix broken corona when the sprite contains alpha --- src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 22eac85c8..224cda34b 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -848,6 +848,9 @@ void HWDrawInfo::DrawCorona(FRenderState& state, AActor* corona, float coronaFad state.SetTextureMode(TM_NORMAL); // This is needed because the next line doesn't always set the mode... state.SetTextureMode(corona->RenderStyle); + // no need for alpha test, coronas are meant to be translucent + state.AlphaFunc(Alpha_GEqual, 0.f); + state.SetMaterial(tex, UF_Sprite, CTF_Expand, CLAMP_XY_NOMIP, 0, 0); float scale = screen->GetHeight() / 1000.0f; @@ -1040,6 +1043,7 @@ void HWDrawInfo::DrawCoronas(FRenderState& state) DrawCorona(state, corona, (float)coronaFade, dist); } + state.AlphaFunc(Alpha_Greater, 0.f); state.SetTextureMode(TM_NORMAL); state.SetViewpoint(vpIndex); state.EnableDepthTest(true); From 0c3ebf451fafd4df372185715f81deeaef6200cc Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Tue, 17 Sep 2024 05:44:01 +0800 Subject: [PATCH 283/414] Fix missing serialization for `skyspeed1` and `skyspeed2` --- src/p_saveg.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index e58124759..970cc9aa5 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -986,6 +986,8 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) ("flags2", flags2) ("flags3", flags3) ("fadeto", fadeto) + ("skyspeed1", skyspeed1) + ("skyspeed2", skyspeed2) ("found_secrets", found_secrets) ("found_items", found_items) ("killed_monsters", killed_monsters) From f193e2134de33cc9dfd96409b264a235575e8c3f Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Tue, 17 Sep 2024 06:10:13 +0800 Subject: [PATCH 284/414] Bump ZScript version --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index be420e5ed..5e4b042e0 100644 --- a/src/version.h +++ b/src/version.h @@ -55,7 +55,7 @@ const char *GetVersionString(); // These are for zscript versioning. #define ZSCRIPT_VER_MAJOR 4 -#define ZSCRIPT_VER_MINOR 12 +#define ZSCRIPT_VER_MINOR 13 #define ZSCRIPT_VER_REVISION 0 // This should always refer to the VkDoom version a derived port is based on and not reflect the derived port's version number! From 712dd1133d18436ee7e9a5a4c3208e57ddfe0c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 17 Sep 2024 14:12:45 -0300 Subject: [PATCH 285/414] Fix typo --- src/r_data/models.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 41166a0e8..780d420fb 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -290,7 +290,7 @@ void calcFrame(const ModelAnim &anim, double tic, ModelAnimFrameInterp &inter) inter.frame2 = int(ceil(frame)); - int startFrame = (looped ? anim.startFrame : anim.loopFrame); + int startFrame = (looped ? anim.loopFrame : anim.startFrame); if(inter.frame1 < startFrame) inter.frame1 = anim.lastFrame; if(inter.frame2 > anim.lastFrame) inter.frame2 = startFrame; From 686320c94d05592c82cee0bf054e880a8008723b Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Wed, 18 Sep 2024 20:00:31 +0800 Subject: [PATCH 286/414] Don't light decal from lightmap tile if it's supposed to be fullbright --- src/rendering/hwrenderer/scene/hw_decal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_decal.cpp b/src/rendering/hwrenderer/scene/hw_decal.cpp index 944ce6c8b..7813531b8 100644 --- a/src/rendering/hwrenderer/scene/hw_decal.cpp +++ b/src/rendering/hwrenderer/scene/hw_decal.cpp @@ -422,7 +422,7 @@ void HWWall::ProcessDecal(HWDrawInfo *di, FRenderState& state, DBaseDecal *decal auto verts = state.AllocVertices(4); gldecal->vertindex = verts.second; - if (lightmaptile >= 0) + if (!(decal->RenderFlags & RF_FULLBRIGHT) && lightmaptile >= 0) { LightmapTile* tile = &di->Level->levelMesh->LightmapTiles[lightmaptile]; float lightmapindex = (float)tile->AtlasLocation.ArrayIndex; From ec4dd5d1c28be9fe6a812ed6ac13375cd48b5d56 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Thu, 19 Sep 2024 03:00:51 +0200 Subject: [PATCH 287/414] Limit occlusion queries to 32k as that's what MoltenVK can handle --- src/common/rendering/vulkan/buffers/vk_rsbuffers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/rendering/vulkan/buffers/vk_rsbuffers.h b/src/common/rendering/vulkan/buffers/vk_rsbuffers.h index 1eaddf676..396e958e1 100644 --- a/src/common/rendering/vulkan/buffers/vk_rsbuffers.h +++ b/src/common/rendering/vulkan/buffers/vk_rsbuffers.h @@ -64,7 +64,7 @@ public: struct { - const int MaxQueries = 64000; + const int MaxQueries = 32000; std::unique_ptr QueryPool; int NextIndex = 0; } OcclusionQuery; From 5347cdf56919c6e15ea5ef01a88df4b61759104b Mon Sep 17 00:00:00 2001 From: Gene Date: Wed, 18 Sep 2024 16:16:24 -0700 Subject: [PATCH 288/414] Fix billboard facing camera only taking effect when used with XY billboarding --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 05207f8c4..205ccb121 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -425,7 +425,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) float yy = -center.Y + y; float zz = -center.Z + z; // [Nash] check for special sprite drawing modes - if (drawWithXYBillboard || isWallSprite) + if (drawWithXYBillboard || drawBillboardFacingCamera || isWallSprite) { mat.MakeIdentity(); mat.Translate(center.X, center.Z, center.Y); // move to sprite center From de87493c41394afb45b648d702b2422aa8df3cd0 Mon Sep 17 00:00:00 2001 From: Gene Date: Wed, 18 Sep 2024 17:25:27 -0700 Subject: [PATCH 289/414] Fix incorrect boolean logic for `drawBillboardFacingCamera` --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 205ccb121..aebe8a9b0 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -404,8 +404,8 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) const bool drawBillboardFacingCamera = hw_force_cambbpref ? gl_billboard_faces_camera : gl_billboard_faces_camera - && ((actor && (!(actor->renderflags2 & RF2_BILLBOARDNOFACECAMERA) || (actor->renderflags2 & RF2_BILLBOARDFACECAMERA))) - || (particle && particle->texture.isValid() && (!(particle->flags & SPF_NOFACECAMERA) || (particle->flags & SPF_FACECAMERA)))); + || ((actor && (!(actor->renderflags2 & RF2_BILLBOARDNOFACECAMERA) && (actor->renderflags2 & RF2_BILLBOARDFACECAMERA))) + || (particle && particle->texture.isValid() && (!(particle->flags & SPF_NOFACECAMERA) && (particle->flags & SPF_FACECAMERA)))); // [Nash] has +ROLLSPRITE const bool drawRollSpriteActor = (actor != nullptr && actor->renderflags & RF_ROLLSPRITE); From 3524d06813cd4841056901111bf649b023274255 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 29 Jan 2024 16:55:59 -0500 Subject: [PATCH 290/414] - export `FFont::GetChar()` to ZScript --- src/common/scripting/interface/vmnatives.cpp | 20 ++++++++++++++++++++ wadsrc/static/zscript/engine/base.zs | 1 + 2 files changed, 21 insertions(+) diff --git a/src/common/scripting/interface/vmnatives.cpp b/src/common/scripting/interface/vmnatives.cpp index 730465a34..8a5674afd 100644 --- a/src/common/scripting/interface/vmnatives.cpp +++ b/src/common/scripting/interface/vmnatives.cpp @@ -770,6 +770,26 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetDisplayTopOffset, GetDisplayTopOffset) ACTION_RETURN_FLOAT(GetDisplayTopOffset(self, code)); } +static int GetChar(FFont* font, int c) +{ + int texc = 0; + auto getch = font->GetChar(c, CR_UNDEFINED, nullptr); + if (getch) + texc = getch->GetID().GetIndex(); + return texc; +} + +DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetChar, ::GetChar) +{ + PARAM_SELF_STRUCT_PROLOGUE(FFont); + PARAM_INT(mchar); + + if (numret > 0) ret[0].SetInt(::GetChar(self, mchar)); + if (numret > 1) ret[1].SetInt(self->GetCharWidth(mchar)); + return min(2, numret); +} + + //========================================================================== // // file system diff --git a/wadsrc/static/zscript/engine/base.zs b/wadsrc/static/zscript/engine/base.zs index f24b71d01..f55919116 100644 --- a/wadsrc/static/zscript/engine/base.zs +++ b/wadsrc/static/zscript/engine/base.zs @@ -657,6 +657,7 @@ struct Font native native BrokenLines BreakLines(String text, int maxlen); native int GetGlyphHeight(int code); native int GetDefaultKerning(); + native TextureID, int GetChar(int c); } struct Console native From 8c10ac6f381cba2d5f56493beccaab923a4e737d Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sat, 17 Aug 2024 11:29:23 -0400 Subject: [PATCH 291/414] Added GetDecalName() --- src/gamedata/decallib.cpp | 5 +++++ src/gamedata/decallib.h | 1 + src/playsim/a_decals.cpp | 17 +++++++++++++++++ wadsrc/static/zscript/actors/actor.zs | 1 + 4 files changed, 24 insertions(+) diff --git a/src/gamedata/decallib.cpp b/src/gamedata/decallib.cpp index 8dee4e7fd..6243502f8 100644 --- a/src/gamedata/decallib.cpp +++ b/src/gamedata/decallib.cpp @@ -205,6 +205,11 @@ const FDecalTemplate *FDecalBase::GetDecal () const return NULL; } +FName FDecalBase::GetDecalName() const +{ + return Name; +} + void FDecalTemplate::ReplaceDecalRef(FDecalBase *from, FDecalBase *to) { if (LowerDecal == from) diff --git a/src/gamedata/decallib.h b/src/gamedata/decallib.h index d077c6c46..ac07b252f 100644 --- a/src/gamedata/decallib.h +++ b/src/gamedata/decallib.h @@ -53,6 +53,7 @@ class FDecalBase public: virtual const FDecalTemplate *GetDecal () const; virtual void ReplaceDecalRef (FDecalBase *from, FDecalBase *to) = 0; + FName GetDecalName() const; protected: FDecalBase (); diff --git a/src/playsim/a_decals.cpp b/src/playsim/a_decals.cpp index 1d9aa9b26..1c0fd4712 100644 --- a/src/playsim/a_decals.cpp +++ b/src/playsim/a_decals.cpp @@ -934,3 +934,20 @@ DEFINE_ACTION_FUNCTION_NATIVE(ADecal, SpawnDecal, SpawnDecal) SpawnDecal(self); return 0; } + +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + +static int GetDecalName(AActor* self) +{ + return self->DecalGenerator != nullptr ? self->DecalGenerator->GetDecalName().GetIndex() : NAME_None; +} + +DEFINE_ACTION_FUNCTION_NATIVE(AActor, GetDecalName, GetDecalName) +{ + PARAM_SELF_PROLOGUE(AActor); + ACTION_RETURN_INT(GetDecalName(self)); +} diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 584b466af..31dc08052 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -715,6 +715,7 @@ class Actor : Thinker native native void ClearFOVInterpolation(); native clearscope Vector3 PosRelative(sector sec) const; native void RailAttack(FRailParams p); + native clearscope Name GetDecalName() const; native void HandleSpawnFlags(); native void ExplodeMissile(line lin = null, Actor target = null, bool onsky = false); From 326480cb3143dd80a25005e36348220f9a5f4486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Wed, 25 Sep 2024 18:56:50 -0300 Subject: [PATCH 292/414] Fix typo --- src/r_data/models.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index 780d420fb..a13d56998 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -538,7 +538,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr if (animationid >= 0) { animation = Models[animationid]; - const TArray* animationData = animation->AttachAnimationData(); + animationData = animation->AttachAnimationData(); } if(is_decoupled) From 2c25cc1d9b380c5d03787165cfa62aace90b349d Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 28 Sep 2024 15:55:10 -0400 Subject: [PATCH 293/414] - well ... this was a lil redundant --- src/playsim/p_enemy.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index cf15cbf38..45df68ac1 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -1835,14 +1835,6 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) if (!P_IsVisible (actor, player->mo, allaround, params)) continue; // out of sight - // [SP] Deathmatch fixes - if we have MF_FRIENDLY we're definitely in deathmatch - // We're going to ignore our master, but go after his enemies. - if ( actor->flags & MF_FRIENDLY ) - { - if ( actor->IsFriend(player->mo) ) - continue; - } - // [RC] Well, let's let special monsters with this flag active be able to see // the player then, eh? if(!(actor->flags6 & MF6_SEEINVISIBLE)) From 1e23dcee7c186ed47f87ba0ae4d9c9b118d16086 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 28 Sep 2024 22:17:17 +0200 Subject: [PATCH 294/414] Some initial decal rendering --- src/levelmeshhelper.cpp | 21 ++-- src/levelmeshhelper.h | 25 +++-- src/playsim/a_decals.cpp | 8 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 96 ++++++++++++++++--- src/rendering/hwrenderer/doom_levelmesh.h | 28 ++++-- src/rendering/hwrenderer/scene/hw_decal.cpp | 77 ++++++++++++++- .../hwrenderer/scene/hw_drawinfo.cpp | 11 +++ src/rendering/hwrenderer/scene/hw_drawinfo.h | 2 +- .../hwrenderer/scene/hw_drawlistadd.cpp | 4 +- .../hwrenderer/scene/hw_drawstructs.h | 11 ++- .../hwrenderer/scene/hw_walldispatcher.h | 7 ++ src/rendering/hwrenderer/scene/hw_walls.cpp | 33 ++++--- 12 files changed, 252 insertions(+), 71 deletions(-) diff --git a/src/levelmeshhelper.cpp b/src/levelmeshhelper.cpp index 1b1fdc6eb..d5906094a 100644 --- a/src/levelmeshhelper.cpp +++ b/src/levelmeshhelper.cpp @@ -3,20 +3,21 @@ struct NullLevelMeshUpdater : UpdateLevelMesh { - virtual void FloorHeightChanged(struct sector_t* sector) {}; - virtual void CeilingHeightChanged(struct sector_t* sector) {}; - virtual void MidTex3DHeightChanged(struct sector_t* sector) {}; + void FloorHeightChanged(sector_t* sector) override {} + void CeilingHeightChanged(sector_t* sector) override {} + void MidTex3DHeightChanged(sector_t* sector) override {} - virtual void FloorTextureChanged(struct sector_t* sector) {}; - virtual void CeilingTextureChanged(struct sector_t* sector) {}; + void FloorTextureChanged(sector_t* sector) override {} + void CeilingTextureChanged(sector_t* sector) override {} - virtual void SectorChangedOther(struct sector_t* sector) {}; + void SectorChangedOther(sector_t* sector) override {} - virtual void SideTextureChanged(struct side_t* side, int section) {}; + void SideTextureChanged(side_t* side, int section) override {} + void SideDecalsChanged(side_t* side) override {} - virtual void SectorLightChanged(struct sector_t* sector) {}; - virtual void SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) {}; - virtual void SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) {}; + void SectorLightChanged(sector_t* sector) override {} + void SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) override {} + void SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) override {} }; static NullLevelMeshUpdater nullUpdater; diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index b4e4a7d29..3ba0b2cde 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -2,22 +2,27 @@ // level mesh helper // this is a minimal include to keep the other source files a little bit leaner +struct sector_t; +struct side_t; +class DLighting; + struct UpdateLevelMesh { - virtual void FloorHeightChanged(struct sector_t *sector) = 0; - virtual void CeilingHeightChanged(struct sector_t *sector) = 0; - virtual void MidTex3DHeightChanged(struct sector_t *sector) = 0; + virtual void FloorHeightChanged(sector_t *sector) = 0; + virtual void CeilingHeightChanged(sector_t *sector) = 0; + virtual void MidTex3DHeightChanged(sector_t *sector) = 0; - virtual void FloorTextureChanged(struct sector_t *sector) = 0; - virtual void CeilingTextureChanged(struct sector_t *sector) = 0; + virtual void FloorTextureChanged(sector_t *sector) = 0; + virtual void CeilingTextureChanged(sector_t *sector) = 0; - virtual void SectorChangedOther(struct sector_t *sector) = 0; + virtual void SectorChangedOther(sector_t *sector) = 0; - virtual void SideTextureChanged(struct side_t *side, int section) = 0; + virtual void SideTextureChanged(side_t *side, int section) = 0; + virtual void SideDecalsChanged(side_t* side) = 0; - virtual void SectorLightChanged(struct sector_t* sector) = 0; - virtual void SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) = 0; - virtual void SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) = 0; + virtual void SectorLightChanged(sector_t* sector) = 0; + virtual void SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) = 0; + virtual void SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) = 0; }; extern UpdateLevelMesh* LevelMeshUpdater; diff --git a/src/playsim/a_decals.cpp b/src/playsim/a_decals.cpp index 1c0fd4712..e2878e3a5 100644 --- a/src/playsim/a_decals.cpp +++ b/src/playsim/a_decals.cpp @@ -156,7 +156,8 @@ void DBaseDecal::Remove () { if (WallPrev == nullptr) { - if (Side != nullptr) Side->AttachedDecals = WallNext; + if (Side != nullptr) + Side->AttachedDecals = WallNext; } else WallPrev->WallNext = WallNext; @@ -164,6 +165,9 @@ void DBaseDecal::Remove () WallPrev = nullptr; WallNext = nullptr; + + if (Side) + LevelMeshUpdater->SideDecalsChanged(Side); } //---------------------------------------------------------------------------- @@ -262,6 +266,8 @@ FTextureID DBaseDecal::StickToWall (side_t *wall, double x, double y, F3DFloor * else wall->AttachedDecals = this; WallNext = nullptr; + LevelMeshUpdater->SideDecalsChanged(wall); + sector_t *front, *back; line_t *line; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 67a36829a..c75bb2f1e 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -318,6 +318,44 @@ void DoomLevelMesh::UpdateWallPortals() } } +void DoomLevelMesh::ProcessDecals(HWDrawInfo* di, FRenderState& state) +{ + for (int sideIndex : level.levelMesh->SideDecals) + { + const auto& side = Sides[sideIndex]; + + Plane p; + if (side.Decals[0].Size() != 0 || side.Decals[1].Size() != 0) + { + if (side.FirstSurface == -1) + continue; + p.Set(Mesh.Surfaces[side.FirstSurface].Plane.XYZ(), Mesh.Surfaces[side.FirstSurface].Plane.W); + } + + for (int onmirror = 0; onmirror < 2; onmirror++) + { + for (const HWDecal& decal : side.Decals[onmirror]) + { + HWDecal* gldecal = di->AddDecal(onmirror == 1); + *gldecal = decal; + + if (di->Level->HasDynamicLights && !di->isFullbrightScene() && decal.texture != nullptr) + { + gldecal->SetupLights(di, state, lightdata, p, level.sides[sideIndex].lighthead); + } + + auto verts = state.AllocVertices(4); + for (int i = 0; i < 4; i++) + { + verts.first[i] = side.DecalVertices[decal.vertindex + i]; + } + gldecal->vertindex = verts.second; + } + } + } +} + + void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) { if (LightsCreated) @@ -525,6 +563,9 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) Sides[sideIndex].Uniforms.Clear(); Sides[sideIndex].WallPortals.Clear(); + Sides[sideIndex].Decals[0].Clear(); + Sides[sideIndex].Decals[1].Clear(); + Sides[sideIndex].DecalVertices.Clear(); } void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) @@ -553,7 +594,7 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) Flats[sectorIndex].Uniforms.Clear(); } -void DoomLevelMesh::FloorHeightChanged(struct sector_t* sector) +void DoomLevelMesh::FloorHeightChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); for (line_t* line : sector->Lines) @@ -565,7 +606,7 @@ void DoomLevelMesh::FloorHeightChanged(struct sector_t* sector) } } -void DoomLevelMesh::CeilingHeightChanged(struct sector_t* sector) +void DoomLevelMesh::CeilingHeightChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); for (line_t* line : sector->Lines) @@ -577,32 +618,37 @@ void DoomLevelMesh::CeilingHeightChanged(struct sector_t* sector) } } -void DoomLevelMesh::MidTex3DHeightChanged(struct sector_t* sector) +void DoomLevelMesh::MidTex3DHeightChanged(sector_t* sector) { // UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::FloorTextureChanged(struct sector_t* sector) +void DoomLevelMesh::FloorTextureChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::CeilingTextureChanged(struct sector_t* sector) +void DoomLevelMesh::CeilingTextureChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::SectorChangedOther(struct sector_t* sector) +void DoomLevelMesh::SectorChangedOther(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::SideTextureChanged(struct side_t* side, int section) +void DoomLevelMesh::SideTextureChanged(side_t* side, int section) { UpdateSide(side->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) +void DoomLevelMesh::SideDecalsChanged(side_t* side) +{ + UpdateSide(side->Index(), SurfaceUpdateType::Full); +} + +void DoomLevelMesh::SectorLightChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::LightsOnly); for (line_t* line : sector->Lines) @@ -614,11 +660,11 @@ void DoomLevelMesh::SectorLightChanged(struct sector_t* sector) } } -void DoomLevelMesh::SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) +void DoomLevelMesh::SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) { } -void DoomLevelMesh::SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) +void DoomLevelMesh::SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) { } @@ -676,6 +722,30 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) wall.sub = sub; wall.Process(&disp, state, seg, front, back); + auto& sideBlock = Sides[sideIndex]; + + // Grab the decals generated + for (int onmirror = 0; onmirror < 2; onmirror++) + { + if (result.decals[onmirror].Size() != 0 && !sideBlock.InSideDecalsList) + { + SideDecals.Push(sideIndex); + sideBlock.InSideDecalsList = true; + } + + for (const HWDecal& decal : result.decals[onmirror]) + { + int oldvertindex = decal.vertindex; + int newvertindex = sideBlock.DecalVertices.Size(); + for (int i = 0; i < 4; i++) + { + sideBlock.DecalVertices.Push(state.mVertices[oldvertindex + i]); + } + sideBlock.Decals[onmirror].Push(decal); + sideBlock.Decals[onmirror].Last().vertindex = newvertindex; + } + } + // Part 1: solid geometry. This is set up so that there are no transparent parts state.SetDepthFunc(DF_LEqual); state.ClearDepthBias(); @@ -684,16 +754,16 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) state.AlphaFunc(Alpha_GEqual, 0.f); CreateWallSurface(side, disp, state, result.list, back ? LevelMeshDrawType::Masked : LevelMeshDrawType::Opaque, true, sideIndex); - if (result.portals.Size() != 0 && !Sides[sideIndex].InSidePortalsList) + if (result.portals.Size() != 0 && !sideBlock.InSidePortalsList) { // Register side having portals SidePortals.Push(sideIndex); - Sides[sideIndex].InSidePortalsList = true; + sideBlock.InSidePortalsList = true; } for (HWWall& portal : result.portals) { - Sides[sideIndex].WallPortals.Push(portal); + sideBlock.WallPortals.Push(portal); } CreateWallSurface(side, disp, state, result.portals, LevelMeshDrawType::Portal, false, sideIndex); diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 4aeb89331..4b5b84d92 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -15,6 +15,7 @@ struct FLevelLocals; struct FPolyObj; struct HWWallDispatcher; +struct HWDrawInfo; class DoomLevelMesh; class MeshBuilder; @@ -67,7 +68,10 @@ struct SideSurfaceBlock TArray Geometries; TArray Uniforms; TArray WallPortals; + TArray Decals[2]; + TArray DecalVertices; bool InSidePortalsList = false; + bool InSideDecalsList = false; TArray DrawRanges; SurfaceUpdateType UpdateType = SurfaceUpdateType::None; }; @@ -94,6 +98,9 @@ public: void BuildSectorGroups(const FLevelLocals& doomMap); + void ProcessDecals(HWDrawInfo* drawinfo, FRenderState& state); + + TArray SideDecals; TArray SidePortals; TArray WallPortals; @@ -103,16 +110,17 @@ public: void CreateLights(FLevelLocals& doomMap); - void FloorHeightChanged(struct sector_t* sector) override; - void CeilingHeightChanged(struct sector_t* sector) override; - void MidTex3DHeightChanged(struct sector_t* sector) override; - void FloorTextureChanged(struct sector_t* sector) override; - void CeilingTextureChanged(struct sector_t* sector) override; - void SectorChangedOther(struct sector_t* sector) override; - void SideTextureChanged(struct side_t* side, int section) override; - void SectorLightChanged(struct sector_t* sector) override; - void SectorLightThinkerCreated(struct sector_t* sector, class DLighting* lightthinker) override; - void SectorLightThinkerDestroyed(struct sector_t* sector, class DLighting* lightthinker) override; + void FloorHeightChanged(sector_t* sector) override; + void CeilingHeightChanged(sector_t* sector) override; + void MidTex3DHeightChanged(sector_t* sector) override; + void FloorTextureChanged(sector_t* sector) override; + void CeilingTextureChanged(sector_t* sector) override; + void SectorChangedOther(sector_t* sector) override; + void SideTextureChanged(side_t* side, int section) override; + void SideDecalsChanged(side_t* side) override; + void SectorLightChanged(sector_t* sector) override; + void SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) override; + void SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) override; void Reset(const LevelMeshLimits& limits) override { diff --git a/src/rendering/hwrenderer/scene/hw_decal.cpp b/src/rendering/hwrenderer/scene/hw_decal.cpp index 7813531b8..912db4c7d 100644 --- a/src/rendering/hwrenderer/scene/hw_decal.cpp +++ b/src/rendering/hwrenderer/scene/hw_decal.cpp @@ -39,6 +39,9 @@ #include "flatvertices.h" #include "hw_renderstate.h" #include "texturemanager.h" +#include "hw_walldispatcher.h" +#include "hw_dynlightdata.h" +#include "a_dynlight.h" //========================================================================== // @@ -189,7 +192,7 @@ static float mix(float a, float b, float t) return a * (1.0f - t) + b * t; } -void HWWall::ProcessDecal(HWDrawInfo *di, FRenderState& state, DBaseDecal *decal, const FVector3 &normal) +void HWWall::ProcessDecal(HWWallDispatcher* di, FRenderState& state, DBaseDecal *decal, const FVector3 &normal) { line_t * line = seg->linedef; side_t * side = seg->sidedef; @@ -448,7 +451,7 @@ void HWWall::ProcessDecal(HWDrawInfo *di, FRenderState& state, DBaseDecal *decal // //========================================================================== -void HWWall::ProcessDecals(HWDrawInfo *di, FRenderState& state) +void HWWall::ProcessDecals(HWWallDispatcher* di, FRenderState& state) { if (seg->sidedef != nullptr) { @@ -465,3 +468,73 @@ void HWWall::ProcessDecals(HWDrawInfo *di, FRenderState& state) } } +//========================================================================== + +void HWDecal::SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& lightdata, Plane p, FLightNode* node) +{ + lightdata.Clear(); + + // if (RenderStyle == STYLE_Add && !di->Level->lightadditivesurfaces) return; // no lights on additively blended surfaces. + + //float vtx[] = { glseg.x1,zbottom[0],glseg.y1, glseg.x1,ztop[0],glseg.y1, glseg.x2,ztop[1],glseg.y2, glseg.x2,zbottom[1],glseg.y2 }; + //Plane p; + // auto normal = glseg.Normal(); + // p.Set(normal, -normal.X * glseg.x1 - normal.Z * glseg.y1); + + // Iterate through all dynamic lights which touch this wall and render them + while (node) + { + if (node->lightsource->IsActive() && !node->lightsource->DontLightMap()) + { + iter_dlight++; + + DVector3 posrel = node->lightsource->PosRelative(frontsector->PortalGroup); + float x = posrel.X; + float y = posrel.Y; + float z = posrel.Z; + float dist = fabsf(p.DistToPoint(x, z, y)); + float radius = node->lightsource->GetRadius(); + //float scale = 1.0f / ((2.f * radius) - dist); + //FVector3 fn, pos; + + if (radius > 0.f && dist < radius) + { + /* + FVector3 nearPt, up, right; + + pos = { x, z, y }; + fn = p.Normal(); + + fn.GetRightUp(right, up); + + FVector3 tmpVec = fn * dist; + nearPt = pos + tmpVec; + + FVector3 t1; + int outcnt[4] = { 0,0,0,0 }; + texcoord tcs[4]; + + // do a quick check whether the light touches this polygon + for (int i = 0; i < 4; i++) + { + t1 = FVector3(&vtx[i * 3]); + FVector3 nearToVert = t1 - nearPt; + tcs[i].u = ((nearToVert | right) * scale) + 0.5f; + tcs[i].v = ((nearToVert | up) * scale) + 0.5f; + + if (tcs[i].u < 0) outcnt[0]++; + if (tcs[i].u > 1) outcnt[1]++; + if (tcs[i].v < 0) outcnt[2]++; + if (tcs[i].v > 1) outcnt[3]++; + + } + if (outcnt[0] != 4 && outcnt[1] != 4 && outcnt[2] != 4 && outcnt[3] != 4)*/ + { + draw_dlight += GetLight(lightdata, frontsector->PortalGroup, p, node->lightsource, true); + } + } + } + node = node->nextLight; + } + dynlightindex = state.UploadLights(lightdata); +} diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 224cda34b..71543d30d 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -507,6 +507,17 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) } } + // Draw Decals + { + level.levelMesh->ProcessDecals(this, state); + state.SetRenderStyle(STYLE_Translucent); + state.SetDepthFunc(DF_LEqual); + DrawDecals(state, Decals[0]); + DrawDecals(state, Decals[1]); // Mirror decals - when should they be drawn? + Decals[0].Clear(); + Decals[1].Clear(); + } + // Draw sprites auto it = level.GetThinkerIterator(); AActor* thing; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index 6114ec2b8..bebe4593e 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -327,7 +327,7 @@ public: void AddSubsectorToPortal(FSectorPortalGroup *portal, subsector_t *sub); void AddWall(HWWall *w); - void AddMirrorSurface(HWWall *w, FRenderState& state); + void AddMirrorSurface(HWWallDispatcher* di, HWWall *w, FRenderState& state); void AddFlat(HWFlat *flat, bool fog); void AddSprite(HWSprite *sprite, bool translucent); diff --git a/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp b/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp index a44bc4e35..bb083ff27 100644 --- a/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp @@ -67,7 +67,7 @@ void HWDrawInfo::AddWall(HWWall *wall) // //========================================================================== -void HWDrawInfo::AddMirrorSurface(HWWall *w, FRenderState& state) +void HWDrawInfo::AddMirrorSurface(HWWallDispatcher* di, HWWall *w, FRenderState& state) { w->type = RENDERWALL_MIRRORSURFACE; auto newwall = drawlists[GLDL_TRANSLUCENTBORDER].NewWall(); @@ -87,7 +87,7 @@ void HWDrawInfo::AddMirrorSurface(HWWall *w, FRenderState& state) { newwall->SetupLights(this, state, lightdata); } - newwall->ProcessDecals(this, state); + newwall->ProcessDecals(di, state); newwall->dynlightindex = -1; // the environment map should not be affected by lights - only the decals. } diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index 9d62f9242..ea22d0b7e 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -281,8 +281,8 @@ public: float fch1, float fch2, float ffh1, float ffh2, float bch1, float bch2, float bfh1, float bfh2); - void ProcessDecal(HWDrawInfo* di, FRenderState& state, DBaseDecal* decal, const FVector3& normal); - void ProcessDecals(HWDrawInfo* di, FRenderState& state); + void ProcessDecal(HWWallDispatcher* di, FRenderState& state, DBaseDecal* decal, const FVector3& normal); + void ProcessDecals(HWWallDispatcher* di, FRenderState& state); int CreateVertices(FFlatVertex*& ptr, bool nosplit); void SplitLeftEdge(FFlatVertex*& ptr); @@ -427,8 +427,9 @@ public: void DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent); }; - - +struct FDynLightData; +struct FLightNode; +class FRenderState; struct DecalVertex { @@ -455,7 +456,7 @@ struct HWDecal FVector3 Normal; void DrawDecal(HWDrawInfo *di, FRenderState &state); - + void SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& lightdata, Plane p, FLightNode* node); }; diff --git a/src/rendering/hwrenderer/scene/hw_walldispatcher.h b/src/rendering/hwrenderer/scene/hw_walldispatcher.h index 23d934534..1c7717d1b 100644 --- a/src/rendering/hwrenderer/scene/hw_walldispatcher.h +++ b/src/rendering/hwrenderer/scene/hw_walldispatcher.h @@ -14,6 +14,7 @@ struct HWMeshHelper TArray portals; TArray lower; TArray upper; + TArray decals[2]; }; @@ -77,4 +78,10 @@ struct HWWallDispatcher mh->portals.Push(*wal); } + HWDecal* AddDecal(bool onmirror) + { + if (di) return di->AddDecal(onmirror); + mh->decals[onmirror].Reserve(1); + return &mh->decals[onmirror].Last(); + } }; diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index 92f04b892..efc385122 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -524,24 +524,23 @@ void HWWall::PutWall(HWWallDispatcher *di, FRenderState& state, bool translucent { flags &= ~HWF_GLOW; } - - bool solid; - if (passflag[type] == 1) solid = true; - else if (type == RENDERWALL_FFBLOCK) solid = texture && !texture->isMasked(); - else solid = false; - - bool hasDecals = solid && seg->sidedef && seg->sidedef->AttachedDecals; - if (hasDecals) - { - // If we want to use the light infos for the decal we cannot delay the creation until the render pass. - if (ddi->Level->HasDynamicLights && !ddi->isFullbrightScene() && texture != nullptr) - { - SetupLights(ddi, state, lightdata); - } - ProcessDecals(ddi, state); - } } + bool solid; + if (passflag[type] == 1) solid = true; + else if (type == RENDERWALL_FFBLOCK) solid = texture && !texture->isMasked(); + else solid = false; + + bool hasDecals = solid && seg->sidedef && seg->sidedef->AttachedDecals; + if (hasDecals) + { + // If we want to use the light infos for the decal we cannot delay the creation until the render pass. + if (ddi && ddi->Level->HasDynamicLights && !ddi->isFullbrightScene() && texture != nullptr) + { + SetupLights(ddi, state, lightdata); + } + ProcessDecals(di, state); + } di->AddWall(this); @@ -631,7 +630,7 @@ void HWWall::PutPortal(HWWallDispatcher *di, FRenderState& state, int ptype, int if (gl_mirror_envmap) { // draw a reflective layer over the mirror - ddi->AddMirrorSurface(this, state); + ddi->AddMirrorSurface(di, this, state); } break; From 9fdd01736e0fb12fbde73369de6fdd0e8899e7f0 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 29 Sep 2024 01:13:23 +0200 Subject: [PATCH 295/414] Don't store HWDecal directly as they may move and animate --- src/rendering/hwrenderer/doom_levelmesh.cpp | 58 +--- src/rendering/hwrenderer/doom_levelmesh.h | 3 +- src/rendering/hwrenderer/scene/hw_decal.cpp | 309 +++++++++++++++++- .../hwrenderer/scene/hw_drawstructs.h | 28 +- .../hwrenderer/scene/hw_walldispatcher.h | 8 +- 5 files changed, 337 insertions(+), 69 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index c75bb2f1e..899f8f55b 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -323,39 +323,22 @@ void DoomLevelMesh::ProcessDecals(HWDrawInfo* di, FRenderState& state) for (int sideIndex : level.levelMesh->SideDecals) { const auto& side = Sides[sideIndex]; + if (side.Decals.Size() == 0) + continue; - Plane p; - if (side.Decals[0].Size() != 0 || side.Decals[1].Size() != 0) + int dynlightindex = -1; + if (di->Level->HasDynamicLights && !di->isFullbrightScene() && side.Decals[0].texture != nullptr) { - if (side.FirstSurface == -1) - continue; - p.Set(Mesh.Surfaces[side.FirstSurface].Plane.XYZ(), Mesh.Surfaces[side.FirstSurface].Plane.W); + dynlightindex = side.Decals[0].SetupLights(di, state, lightdata, level.sides[sideIndex].lighthead); } - for (int onmirror = 0; onmirror < 2; onmirror++) + for (const HWDecalCreateInfo& info : side.Decals) { - for (const HWDecal& decal : side.Decals[onmirror]) - { - HWDecal* gldecal = di->AddDecal(onmirror == 1); - *gldecal = decal; - - if (di->Level->HasDynamicLights && !di->isFullbrightScene() && decal.texture != nullptr) - { - gldecal->SetupLights(di, state, lightdata, p, level.sides[sideIndex].lighthead); - } - - auto verts = state.AllocVertices(4); - for (int i = 0; i < 4; i++) - { - verts.first[i] = side.DecalVertices[decal.vertindex + i]; - } - gldecal->vertindex = verts.second; - } + info.ProcessDecal(di, state, dynlightindex); } } } - void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) { if (LightsCreated) @@ -563,9 +546,7 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) Sides[sideIndex].Uniforms.Clear(); Sides[sideIndex].WallPortals.Clear(); - Sides[sideIndex].Decals[0].Clear(); - Sides[sideIndex].Decals[1].Clear(); - Sides[sideIndex].DecalVertices.Clear(); + Sides[sideIndex].Decals.Clear(); } void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) @@ -725,27 +706,14 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) auto& sideBlock = Sides[sideIndex]; // Grab the decals generated - for (int onmirror = 0; onmirror < 2; onmirror++) + if (result.decals.Size() != 0 && !sideBlock.InSideDecalsList) { - if (result.decals[onmirror].Size() != 0 && !sideBlock.InSideDecalsList) - { - SideDecals.Push(sideIndex); - sideBlock.InSideDecalsList = true; - } - - for (const HWDecal& decal : result.decals[onmirror]) - { - int oldvertindex = decal.vertindex; - int newvertindex = sideBlock.DecalVertices.Size(); - for (int i = 0; i < 4; i++) - { - sideBlock.DecalVertices.Push(state.mVertices[oldvertindex + i]); - } - sideBlock.Decals[onmirror].Push(decal); - sideBlock.Decals[onmirror].Last().vertindex = newvertindex; - } + SideDecals.Push(sideIndex); + sideBlock.InSideDecalsList = true; } + sideBlock.Decals = result.decals; + // Part 1: solid geometry. This is set up so that there are no transparent parts state.SetDepthFunc(DF_LEqual); state.ClearDepthBias(); diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 4b5b84d92..8866f5dd2 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -68,8 +68,7 @@ struct SideSurfaceBlock TArray Geometries; TArray Uniforms; TArray WallPortals; - TArray Decals[2]; - TArray DecalVertices; + TArray Decals; bool InSidePortalsList = false; bool InSideDecalsList = false; TArray DrawRanges; diff --git a/src/rendering/hwrenderer/scene/hw_decal.cpp b/src/rendering/hwrenderer/scene/hw_decal.cpp index 912db4c7d..d7b358bf5 100644 --- a/src/rendering/hwrenderer/scene/hw_decal.cpp +++ b/src/rendering/hwrenderer/scene/hw_decal.cpp @@ -192,7 +192,260 @@ static float mix(float a, float b, float t) return a * (1.0f - t) + b * t; } -void HWWall::ProcessDecal(HWWallDispatcher* di, FRenderState& state, DBaseDecal *decal, const FVector3 &normal) +void HWWall::ProcessDecal(HWDrawInfo* di, FRenderState& state, DBaseDecal *decal, const FVector3 &normal) +{ + line_t * line = seg->linedef; + side_t * side = seg->sidedef; + int i; + float zpos; + bool flipx, flipy; + FTextureID decalTile; + + + if (decal->RenderFlags & RF_INVISIBLE) return; + if (type == RENDERWALL_FFBLOCK && texture->isMasked()) return; // No decals on 3D floors with transparent textures. + if (seg == nullptr) return; + + + decalTile = decal->PicNum; + flipx = !!(decal->RenderFlags & RF_XFLIP); + flipy = !!(decal->RenderFlags & RF_YFLIP); + + + auto texture = TexMan.GetGameTexture(decalTile); + if (texture == NULL) return; + + + // the sectors are only used for their texture origin coordinates + // so we don't need the fake sectors for deep water etc. + // As this is a completely split wall fragment no further splits are + // necessary for the decal. + sector_t *frontsector; + + // for 3d-floor segments use the model sector as reference + if ((decal->RenderFlags&RF_CLIPMASK) == RF_CLIPMID) frontsector = decal->Sector; + else frontsector = seg->frontsector; + + switch (decal->RenderFlags & RF_RELMASK) + { + default: + // No valid decal can have this type. If one is encountered anyway + // it is in some way invalid so skip it. + return; + //zpos = decal->z; + //break; + + case RF_RELUPPER: + if (type != RENDERWALL_TOP) return; + if (line->flags & ML_DONTPEGTOP) + { + zpos = decal->Z + frontsector->GetPlaneTexZ(sector_t::ceiling); + } + else + { + zpos = decal->Z + seg->backsector->GetPlaneTexZ(sector_t::ceiling); + } + break; + case RF_RELLOWER: + if (type != RENDERWALL_BOTTOM) return; + if (line->flags & ML_DONTPEGBOTTOM) + { + zpos = decal->Z + frontsector->GetPlaneTexZ(sector_t::ceiling); + } + else + { + zpos = decal->Z + seg->backsector->GetPlaneTexZ(sector_t::floor); + } + break; + case RF_RELMID: + if (type == RENDERWALL_TOP || type == RENDERWALL_BOTTOM) return; + if (line->flags & ML_DONTPEGBOTTOM) + { + zpos = decal->Z + frontsector->GetPlaneTexZ(sector_t::floor); + } + else + { + zpos = decal->Z + frontsector->GetPlaneTexZ(sector_t::ceiling); + } + } + + // now clip the decal to the actual polygon + + float decalwidth = texture->GetDisplayWidth() * decal->ScaleX; + float decalheight = texture->GetDisplayHeight() * decal->ScaleY; + float decallefto = texture->GetDisplayLeftOffset() * decal->ScaleX; + float decaltopo = texture->GetDisplayTopOffset() * decal->ScaleY; + + float leftedge = glseg.fracleft * side->TexelLength; + float linelength = glseg.fracright * side->TexelLength - leftedge; + + // texel index of the decal's left edge + float decalpixpos = (float)side->TexelLength * decal->LeftDistance - (flipx ? decalwidth - decallefto : decallefto) - leftedge; + + float left, right; + float lefttex, righttex; + + // decal is off the left edge + if (decalpixpos < 0) + { + left = 0; + lefttex = -decalpixpos; + } + else + { + left = decalpixpos; + lefttex = 0; + } + + // decal is off the right edge + if (decalpixpos + decalwidth > linelength) + { + right = linelength; + righttex = right - decalpixpos; + } + else + { + right = decalpixpos + decalwidth; + righttex = decalwidth; + } + if (right <= left) + return; // nothing to draw + + + // one texture unit on the wall as vector + float vx = (glseg.x2 - glseg.x1) / linelength; + float vy = (glseg.y2 - glseg.y1) / linelength; + + DecalVertex dv[4]; + enum + { + LL, UL, LR, UR + }; + dv[UL].x = dv[LL].x = glseg.x1 + vx * left; + dv[UL].y = dv[LL].y = glseg.y1 + vy * left; + + dv[LR].x = dv[UR].x = glseg.x1 + vx * right; + dv[LR].y = dv[UR].y = glseg.y1 + vy * right; + + zpos += (flipy ? decalheight - decaltopo : decaltopo); + + dv[UL].z = dv[UR].z = zpos; + dv[LL].z = dv[LR].z = dv[UL].z - decalheight; + dv[UL].v = dv[UR].v = 0.f; + + float decalscale = float(decal->ScaleX * texture->GetDisplayWidth()); + dv[UL].u = dv[LL].u = lefttex / decalscale; + dv[LR].u = dv[UR].u = righttex / decalscale; + dv[LL].v = dv[LR].v = 1.f; + + + // now clip to the top plane + float vzt = (ztop[UL] - ztop[LL]) / linelength; + float topleft = ztop[LL] + vzt * left; + float topright = ztop[LL] + vzt * right; + + // completely below the wall + if (topleft < dv[LL].z && topright < dv[LR].z) + return; + + if (topleft < dv[UL].z || topright < dv[UR].z) + { + // decal has to be clipped at the top + // let texture clamping handle all extreme cases + float t0 = (dv[UL].z - topleft) / (dv[UL].z - dv[LL].z); + float t1 = (dv[UR].z - topright) / (dv[UR].z - dv[LR].z); + dv[UL].v = t0 * dv[LL].v; + dv[UR].v = t1 * dv[LR].v; + dv[UL].z = topleft; + dv[UR].z = topright; + } + + // now clip to the bottom plane + float vzb = (zbottom[UL] - zbottom[LL]) / linelength; + float bottomleft = zbottom[LL] + vzb * left; + float bottomright = zbottom[LL] + vzb * right; + + // completely above the wall + if (bottomleft > dv[UL].z && bottomright > dv[UR].z) + return; + + if (bottomleft > dv[LL].z || bottomright > dv[LR].z) + { + // decal has to be clipped at the bottom + // let texture clamping handle all extreme cases + float t0 = (dv[UL].z - bottomleft) / (dv[UL].z - dv[LL].z); + float t1 = (dv[UR].z - bottomright) / (dv[UR].z - dv[LR].z); + dv[LL].v = t0 * (dv[LL].v - dv[UL].v) + dv[UL].v; + dv[LR].v = t1 * (dv[LR].v - dv[UR].v) + dv[UR].v; + dv[LL].z = bottomleft; + dv[LR].z = bottomright; + } + + + if (flipx) + { + for (i = 0; i < 4; i++) dv[i].u = 1.f - dv[i].u; + } + if (flipy) + { + for (i = 0; i < 4; i++) dv[i].v = 1.f - dv[i].v; + } + + HWDecal *gldecal = di->AddDecal(type == RENDERWALL_MIRRORSURFACE); + gldecal->texture = texture; + gldecal->decal = decal; + + if (decal->RenderFlags & RF_FULLBRIGHT) + { + gldecal->lightlevel = 255; + gldecal->rellight = 0; + gldecal->dynlightindex = -1; + } + else + { + gldecal->lightlevel = lightlevel; + gldecal->rellight = rellight + getExtraLight(); + gldecal->dynlightindex = dynlightindex; + } + + gldecal->Colormap = Colormap; + + if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) + { + gldecal->Colormap.Decolorize(); + } + + gldecal->alpha = decal->Alpha; + gldecal->zcenter = zpos - decalheight * 0.5f; + gldecal->frontsector = frontsector; + gldecal->Normal = normal; + gldecal->lightlist = lightlist; + memcpy(gldecal->dv, dv, sizeof(dv)); + + auto verts = state.AllocVertices(4); + gldecal->vertindex = verts.second; + + if (!(decal->RenderFlags & RF_FULLBRIGHT) && lightmaptile >= 0) + { + LightmapTile* tile = &di->Level->levelMesh->LightmapTiles[lightmaptile]; + float lightmapindex = (float)tile->AtlasLocation.ArrayIndex; + + for (i = 0; i < 4; i++) + { + FVector2 lightmapuv = tile->ToUV(FVector3(dv[i].x, dv[i].y, dv[i].z), di->Level->levelMesh->LMTextureSize); + verts.first[i].Set(dv[i].x, dv[i].z, dv[i].y, dv[i].u, dv[i].v, lightmapuv.X, lightmapuv.Y, lightmapindex); + } + } + else + { + for (i = 0; i < 4; i++) + { + verts.first[i].Set(dv[i].x, dv[i].z, dv[i].y, dv[i].u, dv[i].v, 0.0f, 0.0f, -1.0f); + } + } +} + +void HWDecalCreateInfo::ProcessDecal(HWDrawInfo* di, FRenderState& state, int dynlightindex) const { line_t * line = seg->linedef; side_t * side = seg->sidedef; @@ -459,10 +712,38 @@ void HWWall::ProcessDecals(HWWallDispatcher* di, FRenderState& state) if (decal) { auto normal = glseg.Normal(); // calculate the normal only once per wall because it requires a square root. - while (decal) + if (di->di) { - ProcessDecal(di, state, decal, normal); - decal = decal->WallNext; + while (decal) + { + ProcessDecal(di->di, state, decal, normal); + decal = decal->WallNext; + } + } + else + { + while (decal) + { + HWDecalCreateInfo info; + info.decal = decal; + info.normal = normal; + info.seg = seg; + info.frontsector = frontsector; + info.type = type; + info.glseg = glseg; + info.ztop[0] = ztop[0]; + info.ztop[1] = ztop[1]; + info.zbottom[0] = zbottom[0]; + info.zbottom[1] = zbottom[1]; + info.Colormap = Colormap; + info.texture = texture; + info.lightlist = lightlist; + info.lightmaptile = lightmaptile; + info.lightlevel = lightlevel; + info.rellight = rellight; + di->AddDecal(info); + decal = decal->WallNext; + } } } } @@ -470,16 +751,15 @@ void HWWall::ProcessDecals(HWWallDispatcher* di, FRenderState& state) //========================================================================== -void HWDecal::SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& lightdata, Plane p, FLightNode* node) +int HWDecalCreateInfo::SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& lightdata, FLightNode* node) const { lightdata.Clear(); - // if (RenderStyle == STYLE_Add && !di->Level->lightadditivesurfaces) return; // no lights on additively blended surfaces. + // if (RenderStyle == STYLE_Add && !di->Level->lightadditivesurfaces) return -1; // no lights on additively blended surfaces. - //float vtx[] = { glseg.x1,zbottom[0],glseg.y1, glseg.x1,ztop[0],glseg.y1, glseg.x2,ztop[1],glseg.y2, glseg.x2,zbottom[1],glseg.y2 }; - //Plane p; - // auto normal = glseg.Normal(); - // p.Set(normal, -normal.X * glseg.x1 - normal.Z * glseg.y1); + float vtx[] = { glseg.x1,zbottom[0],glseg.y1, glseg.x1,ztop[0],glseg.y1, glseg.x2,ztop[1],glseg.y2, glseg.x2,zbottom[1],glseg.y2 }; + Plane p; + p.Set(normal, -normal.X * glseg.x1 - normal.Z * glseg.y1); // Iterate through all dynamic lights which touch this wall and render them while (node) @@ -494,12 +774,11 @@ void HWDecal::SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& li float z = posrel.Z; float dist = fabsf(p.DistToPoint(x, z, y)); float radius = node->lightsource->GetRadius(); - //float scale = 1.0f / ((2.f * radius) - dist); - //FVector3 fn, pos; + float scale = 1.0f / ((2.f * radius) - dist); + FVector3 fn, pos; if (radius > 0.f && dist < radius) { - /* FVector3 nearPt, up, right; pos = { x, z, y }; @@ -528,7 +807,7 @@ void HWDecal::SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& li if (tcs[i].v > 1) outcnt[3]++; } - if (outcnt[0] != 4 && outcnt[1] != 4 && outcnt[2] != 4 && outcnt[3] != 4)*/ + if (outcnt[0] != 4 && outcnt[1] != 4 && outcnt[2] != 4 && outcnt[3] != 4) { draw_dlight += GetLight(lightdata, frontsector->PortalGroup, p, node->lightsource, true); } @@ -536,5 +815,5 @@ void HWDecal::SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& li } node = node->nextLight; } - dynlightindex = state.UploadLights(lightdata); + return state.UploadLights(lightdata); } diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index ea22d0b7e..1fa1b8daf 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -281,7 +281,7 @@ public: float fch1, float fch2, float ffh1, float ffh2, float bch1, float bch2, float bfh1, float bfh2); - void ProcessDecal(HWWallDispatcher* di, FRenderState& state, DBaseDecal* decal, const FVector3& normal); + void ProcessDecal(HWDrawInfo* di, FRenderState& state, DBaseDecal* decal, const FVector3& normal); void ProcessDecals(HWWallDispatcher* di, FRenderState& state); int CreateVertices(FFlatVertex*& ptr, bool nosplit); @@ -456,7 +456,31 @@ struct HWDecal FVector3 Normal; void DrawDecal(HWDrawInfo *di, FRenderState &state); - void SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& lightdata, Plane p, FLightNode* node); +}; + +struct HWDecalCreateInfo +{ + void ProcessDecal(HWDrawInfo* di, FRenderState& state, int dynlightindex) const; + int SetupLights(HWDrawInfo* di, FRenderState& state, FDynLightData& lightdata, FLightNode* node) const; + + DBaseDecal* decal; + FVector3 normal; + + seg_t* seg; + sector_t* frontsector; + + uint8_t type; + HWSeg glseg; + float ztop[2], zbottom[2]; + + FColormap Colormap; + + FGameTexture* texture; + TArray* lightlist; + int lightmaptile; + + short lightlevel; + short rellight; }; diff --git a/src/rendering/hwrenderer/scene/hw_walldispatcher.h b/src/rendering/hwrenderer/scene/hw_walldispatcher.h index 1c7717d1b..678186294 100644 --- a/src/rendering/hwrenderer/scene/hw_walldispatcher.h +++ b/src/rendering/hwrenderer/scene/hw_walldispatcher.h @@ -14,7 +14,7 @@ struct HWMeshHelper TArray portals; TArray lower; TArray upper; - TArray decals[2]; + TArray decals; }; @@ -78,10 +78,8 @@ struct HWWallDispatcher mh->portals.Push(*wal); } - HWDecal* AddDecal(bool onmirror) + void AddDecal(const HWDecalCreateInfo& info) { - if (di) return di->AddDecal(onmirror); - mh->decals[onmirror].Reserve(1); - return &mh->decals[onmirror].Last(); + mh->decals.Push(info); } }; From 7e83d726ca10a4315843f0e6c5c183ca72641c58 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 29 Sep 2024 14:21:57 +0200 Subject: [PATCH 296/414] Improve light level updates --- .../hwrenderer/data/hw_surfaceuniforms.h | 47 ++++++++++-- src/rendering/hwrenderer/doom_levelmesh.cpp | 76 ++++++++++++++++--- src/rendering/hwrenderer/scene/hw_drawinfo.h | 3 + src/rendering/hwrenderer/scene/hw_lighting.h | 37 +++++++++ .../hwrenderer/scene/hw_setcolor.cpp | 18 +++++ .../shaders/scene/binding_rsbuffers.glsl | 4 +- .../static/shaders/scene/layout_shared.glsl | 1 - 7 files changed, 169 insertions(+), 17 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h index ad40bb137..263c47421 100644 --- a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h @@ -50,9 +50,46 @@ struct SurfaceUniforms struct SurfaceLightUniforms { - FVector4 uVertexColor; // HWDrawInfo::SetColor - float uDesaturationFactor; // HWDrawInfo::SetColor - float uLightLevel; // HWDrawInfo::SetColor - int uLightIndex; - int padding; + FVector4 uVertexColor; + float uDesaturationFactor; + float uLightLevel; + int padding0; + int padding1; + + void SetColor(float r, float g, float b, float a = 1.f, int desat = 0) + { + uVertexColor = { r, g, b, a }; + uDesaturationFactor = desat * (1.0f / 255.0f); + } + + void SetColor(PalEntry pe, int desat = 0) + { + const float scale = 1.0f / 255.0f; + uVertexColor = { pe.r * scale, pe.g * scale, pe.b * scale, pe.a * scale }; + uDesaturationFactor = desat * (1.0f / 255.0f); + } + + void SetColorAlpha(PalEntry pe, float alpha = 1.f, int desat = 0) + { + const float scale = 1.0f / 255.0f; + uVertexColor = { pe.r * scale, pe.g * scale, pe.b * scale, alpha }; + uDesaturationFactor = desat * (1.0f / 255.0f); + } + + void ResetColor() + { + uVertexColor = { 1.0f, 1.0f, 1.0f, 1.0f }; + uDesaturationFactor = 0.0f; + } + + void SetSoftLightLevel(int llevel, int blendfactor = 0) + { + if (blendfactor == 0) uLightLevel = llevel / 255.f; + else uLightLevel = -1.f; + } + + void SetNoSoftLightLevel() + { + uLightLevel = -1.f; + } }; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 899f8f55b..f33f56ff5 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -10,6 +10,7 @@ #include "hw_renderstate.h" #include "hw_vertexbuilder.h" #include "hw_dynlightdata.h" +#include "hwrenderer/scene/hw_lighting.h" #include "hwrenderer/scene/hw_drawstructs.h" #include "hwrenderer/scene/hw_drawinfo.h" #include "hwrenderer/scene/hw_walldispatcher.h" @@ -168,6 +169,13 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) SunDirection = doomMap.SunDirection; LightmapSampleDistance = doomMap.LightmapSampleDistance; + // HWWall and HWFlat still looks at r_viewpoint when doing calculations, + // but we aren't rendering a specific viewpoint when this function gets called + int oldextralight = r_viewpoint.extralight; + AActor* oldcamera = r_viewpoint.camera; + r_viewpoint.extralight = 0; + r_viewpoint.camera = nullptr; + BuildSectorGroups(doomMap); CreatePortals(doomMap); CreateSurfaces(doomMap); @@ -178,6 +186,9 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) UploadPortals(); SortDrawLists(); + + r_viewpoint.extralight = oldextralight; + r_viewpoint.camera = oldcamera; } void DoomLevelMesh::SetLimits(FLevelLocals& doomMap) @@ -218,6 +229,13 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) LastFrameStats = CurFrameStats; CurFrameStats = Stats(); + // HWWall and HWFlat still looks at r_viewpoint when doing calculations, + // but we aren't rendering a specific viewpoint when this function gets called + int oldextralight = r_viewpoint.extralight; + AActor* oldcamera = r_viewpoint.camera; + r_viewpoint.extralight = 0; + r_viewpoint.camera = nullptr; + // To do: we don't need to always do this. UpdateLevelMesh should tell us when polyobjs move. for (side_t* side : PolySides) { @@ -256,6 +274,9 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) UpdateWallPortals(); UploadDynLights(doomMap); + + r_viewpoint.extralight = oldextralight; + r_viewpoint.camera = oldcamera; } void DoomLevelMesh::UploadDynLights(FLevelLocals& doomMap) @@ -785,6 +806,35 @@ void DoomLevelMesh::CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) void DoomLevelMesh::SetSideLights(FLevelLocals& doomMap, unsigned int sideIndex) { + ELightMode lightmode = getRealLightmode(&doomMap, true); + + side_t* side = &doomMap.sides[sideIndex]; + + // Global modifiers that affects EVERYTHING. + // We need to find a way to apply this in the shader. + int rel = getExtraLight(); + bool fullbrightScene = isFullbrightScene(); + + // To do: we need to know where each uniform block came from: + sector_t* frontsector = side->sector; + FColormap Colormap = frontsector->Colormap; // To do: this may come from the lightlist + bool foggy = (!Colormap.FadeColor.isBlack() || doomMap.flags & LEVEL_HASFADETABLE); // fog disables fake contrast + float alpha = 1.0f; + if (side->linedef->alpha != 0) + { + switch (side->linedef->flags & ML_ADDTRANS) + { + case 0: + case ML_ADDTRANS: + alpha = side->linedef->alpha; + } + } + float absalpha = fabsf(alpha); + + // GetLightLevel changes global extra light. Used for the fake contrast: + int orglightlevel = hw_ClampLight(frontsector->lightlevel); + int lightlevel = hw_ClampLight(side->GetLightLevel(foggy, orglightlevel, side_t::mid, false, &rel)); + for (UniformsAllocInfo& uinfo : Sides[sideIndex].Uniforms) { for (int i = 0, count = uinfo.Count; i < count; i++) @@ -796,6 +846,8 @@ void DoomLevelMesh::SetSideLights(FLevelLocals& doomMap, unsigned int sideIndex) { uinfo.LightUniforms[i].uLightLevel = clamp(doomMap.sides[sideIndex].sector->lightlevel * (1.0f / 255.0f), 0.0f, 1.0f); } + + SetColor(uinfo.LightUniforms[i], &doomMap, lightmode, lightlevel, rel, fullbrightScene, Colormap, absalpha); } AddRange(UploadRanges.LightUniforms, { uinfo.Start, uinfo.Start + uinfo.Count }); } @@ -803,17 +855,25 @@ void DoomLevelMesh::SetSideLights(FLevelLocals& doomMap, unsigned int sideIndex) void DoomLevelMesh::SetFlatLights(FLevelLocals& doomMap, unsigned int sectorIndex) { + ELightMode lightmode = getRealLightmode(&doomMap, true); + + // Global modifiers that affects EVERYTHING. + // We need to find a way to apply this in the shader. + int rel = 0;// getExtraLight(); + bool fullbrightScene = false; // isFullbrightScene(); + + // To do: we need to know where each uniform block came from: + sector_t* frontsector = &doomMap.sectors[sectorIndex]; + int lightlevel = hw_ClampLight(frontsector->GetFloorLight()); + FColormap Colormap = frontsector->Colormap; + FSectorPortal* portal = frontsector->ValidatePortal(sector_t::floor); + double alpha = portal ? frontsector->GetAlpha(sector_t::floor) : 1.0f - frontsector->GetReflect(sector_t::floor); + for (UniformsAllocInfo& uinfo : Flats[sectorIndex].Uniforms) { for (int i = 0, count = uinfo.Count; i < count; i++) { - // To do: calculate this correctly (see HWDrawInfo::SetColor) - // uinfo.LightUniforms[i].uVertexColor - // uinfo.LightUniforms[i].uDesaturationFactor - if (uinfo.LightUniforms[i].uLightLevel >= 0.0f) - { - uinfo.LightUniforms[i].uLightLevel = clamp(doomMap.sectors[sectorIndex].lightlevel * (1.0f / 255.0f), 0.0f, 1.0f); - } + SetColor(uinfo.LightUniforms[i], &doomMap, lightmode, lightlevel, rel, fullbrightScene, Colormap, alpha); } AddRange(UploadRanges.LightUniforms, { uinfo.Start, uinfo.Start + uinfo.Count }); } @@ -916,7 +976,6 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh curLightUniforms->uVertexColor = applyState.surfaceUniforms.uVertexColor; curLightUniforms->uDesaturationFactor = applyState.surfaceUniforms.uDesaturationFactor; curLightUniforms->uLightLevel = applyState.surfaceUniforms.uLightLevel; - curLightUniforms->uLightIndex = -1; curLightUniforms++; uniformsIndex++; @@ -1202,7 +1261,6 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state uinfo.LightUniforms->uVertexColor = uniforms->uVertexColor; uinfo.LightUniforms->uDesaturationFactor = uniforms->uDesaturationFactor; uinfo.LightUniforms->uLightLevel = uniforms->uLightLevel; - uinfo.LightUniforms->uLightIndex = -1; int uniformsIndex = uinfo.Start; int vertIndex = ginfo.VertexStart; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index bebe4593e..ce6f7836e 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -396,3 +396,6 @@ bool CheckFog(FLevelLocals* Level, sector_t* frontsector, sector_t* backsector, void SetColor(FRenderState& state, FLevelLocals* Level, ELightMode lightmode, int sectorlightlevel, int rellight, bool fullbright, const FColormap& cm, float alpha, bool weapon = false); void SetShaderLight(FRenderState& state, FLevelLocals* Level, float level, float olight); void SetFog(FRenderState& state, FLevelLocals* Level, ELightMode lightmode, int lightlevel, int rellight, bool fullbright, const FColormap* cmap, bool isadditive, bool inskybox); + +struct SurfaceLightUniforms; +void SetColor(SurfaceLightUniforms& uniforms, FLevelLocals* Level, ELightMode lightmode, int sectorlightlevel, int rellight, bool fullbright, const FColormap& cm, float alpha, bool weapon = false); diff --git a/src/rendering/hwrenderer/scene/hw_lighting.h b/src/rendering/hwrenderer/scene/hw_lighting.h index f4cc44380..f21adf1fa 100644 --- a/src/rendering/hwrenderer/scene/hw_lighting.h +++ b/src/rendering/hwrenderer/scene/hw_lighting.h @@ -19,3 +19,40 @@ inline int getExtraLight() return r_viewpoint.extralight * gl_weaponlight; } +inline int isFullbrightScene() +{ + player_t* cplayer = r_viewpoint.camera ? r_viewpoint.camera->player : nullptr; + if (cplayer) + { + if (cplayer->extralight == INT_MIN) + { + return true; + } + else if (cplayer->fixedcolormap != NOFIXEDCOLORMAP) + { + return true; + } + else if (cplayer->fixedlightlevel != -1) + { + auto torchtype = PClass::FindActor(NAME_PowerTorch); + auto litetype = PClass::FindActor(NAME_PowerLightAmp); + for (AActor* in = cplayer->mo->Inventory; in; in = in->Inventory) + { + // Need special handling for light amplifiers + if (in->IsKindOf(torchtype)) + { + return true; + } + else if (in->IsKindOf(litetype)) + { + return true; + } + } + } + return false; + } + else + { + return false; + } +} diff --git a/src/rendering/hwrenderer/scene/hw_setcolor.cpp b/src/rendering/hwrenderer/scene/hw_setcolor.cpp index f8b150f67..2b277313a 100644 --- a/src/rendering/hwrenderer/scene/hw_setcolor.cpp +++ b/src/rendering/hwrenderer/scene/hw_setcolor.cpp @@ -56,6 +56,24 @@ void SetColor(FRenderState &state, FLevelLocals* Level, ELightMode lightmode, in } } +void SetColor(SurfaceLightUniforms& uniforms, FLevelLocals* Level, ELightMode lightmode, int sectorlightlevel, int rellight, bool fullbright, const FColormap& cm, float alpha, bool weapon) +{ + if (fullbright) + { + uniforms.SetColorAlpha(0xffffff, alpha, 0); + if (isSoftwareLighting(lightmode)) uniforms.SetSoftLightLevel(255); + else uniforms.SetNoSoftLightLevel(); + } + else + { + int hwlightlevel = CalcLightLevel(lightmode, sectorlightlevel, rellight, weapon, cm.BlendFactor); + PalEntry pe = CalcLightColor(lightmode, hwlightlevel, cm.LightColor, cm.BlendFactor); + uniforms.SetColorAlpha(pe, alpha, cm.Desaturation); + if (isSoftwareLighting(lightmode)) uniforms.SetSoftLightLevel(hw_ClampLight(sectorlightlevel + rellight), cm.BlendFactor); + else uniforms.SetNoSoftLightLevel(); + } +} + //========================================================================== // // Lighting stuff diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index b090d0009..3abe60a43 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -81,8 +81,8 @@ struct SurfaceLightUniforms vec4 uVertexColor; float uDesaturationFactor; float uLightLevel; - uint uLightIndex; - uint padding; + uint padding0; + uint padding1; }; struct Fogball diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index a994c66c8..9160e4588 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -73,7 +73,6 @@ layout(push_constant) uniform PushConstants #define uVertexColor lightdata[uDataIndex].uVertexColor #define uDesaturationFactor lightdata[uDataIndex].uDesaturationFactor #define uLightLevel lightdata[uDataIndex].uLightLevel -//#define uLightIndex lightdata[uDataIndex].uLightIndex int uLightIndex; #else #define uVertexColor data[uDataIndex].uVertexColor From 85ae8f81941c668d0374be1af5f7c774d381e6f2 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 29 Sep 2024 10:05:16 -0400 Subject: [PATCH 297/414] - flat sprites are already square, no need to adjust them --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index aebe8a9b0..70da581cb 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -1036,7 +1036,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 * thing->isoscaleY : sprscale.Y * thing->isoscaleY); - if ((thing->renderflags & (RF_ROLLSPRITE|RF_FLATSPRITE)) || (thing->renderflags2 & RF2_SQUAREPIXELS)) + if ((thing->renderflags & RF_ROLLSPRITE) || (thing->renderflags2 & RF2_SQUAREPIXELS)) { double ps = di->Level->pixelstretch; double mult = 1.0 / sqrt(ps); // shrink slightly From ca9ab7bd5b5e89ed2efff148a25382c3789e9d31 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 29 Sep 2024 16:04:00 -0400 Subject: [PATCH 298/414] - rename 'restart' ccmd to 'debug_restart' since it is in a broken state right now --- src/d_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index c14149196..fb25fa00f 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -3936,7 +3936,7 @@ void D_Cleanup() // //========================================================================== -UNSAFE_CCMD(restart) +UNSAFE_CCMD(debug_restart) { // remove command line args that would get in the way during restart Args->RemoveArgs("-iwad"); From 89ce70fd0ba83a7aca214acb7c9c160505a8934c Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 20 Sep 2024 10:33:40 -0400 Subject: [PATCH 299/414] - implement `SPAC_Walking`, mostly useful for teleports or for line crossings that should not happen when the player is falling or flying - update UDMF spec entry --- specs/udmf_zdoom.txt | 1 + src/doomdata.h | 1 + src/maploader/udmf.cpp | 4 ++++ src/namedef_custom.h | 1 + src/playsim/p_spec.cpp | 7 +++++++ 5 files changed, 14 insertions(+) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 73e94ea8a..35b23418d 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -114,6 +114,7 @@ Note: All fields default to false unless mentioned otherwise. // texture to behave like an impassable line (projectiles // pass through it). checkswitchrange = ; // Switches can only be activated when vertically reachable. + walking = ; // Crossing activation checks if creature is on the ground, and fails if they are not. blockprojectiles = ; // Line blocks all projectiles blockuse = ; // Line blocks all use actions blocksight = ; // Line blocks monster line of sight diff --git a/src/doomdata.h b/src/doomdata.h index 12a286921..49ba77421 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -199,6 +199,7 @@ enum SPAC SPAC_UseBack = 1<<10, // Can be used from the backside SPAC_Damage = 1<<11, // [ZZ] when linedef receives damage SPAC_Death = 1<<12, // [ZZ] when linedef receives damage and has 0 health + SPAC_Walking = 1<<13, // Can only be used when standing on a floor (not falling or floating) - only for line cross, not use SPAC_PlayerActivate = (SPAC_Cross|SPAC_Use|SPAC_Impact|SPAC_Push|SPAC_AnyCross|SPAC_UseThrough|SPAC_UseBack), }; diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 725b95b91..ad33538ab 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -1002,6 +1002,10 @@ public: // This switch contains all keys of the UDMF base spec which only apply to Hexen format specials if (!isTranslated) switch (key.GetIndex()) { + case NAME_Walking: + Flag(ld->activation, SPAC_Walking, key); + continue; + case NAME_Playercross: Flag(ld->activation, SPAC_Cross, key); continue; diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 59752245b..082a254c9 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -670,6 +670,7 @@ xx(Missilecross) xx(Anycross) xx(Monsteruse) xx(Monsterpush) +xx(Walking) xx(ZDoom) xx(ZDoomTranslated) diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index ba2036971..3b63839fe 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -254,6 +254,13 @@ bool P_TestActivateLine (line_t *line, AActor *mo, int side, int activationType, return false; } + if ((activationType & (SPAC_Cross|SPAC_PCross)) && (lineActivation & SPAC_Walking)) + { + // not on floor + if ((mo->Pos().Z > mo->floorz) && !(mo->flags2 & MF2_ONMOBJ)) + return false; + } + if (lineActivation & SPAC_UseThrough) { lineActivation |= SPAC_Use; From 994078feaef07b57bdcc431b0dcb64dc4be3919e Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Fri, 30 Aug 2024 13:06:26 +0300 Subject: [PATCH 300/414] Added FloatBobFactor This adds a new actor property: `FloatBobFactor` (default 1.0). This will be a multiplier for level.time in `AActor::GetBobOffset`, which finally allows to control not only the range of float bobbing (which is FloatBobStrength) but also the frequency of bobbing. --- src/namedef_custom.h | 1 + src/playsim/actor.h | 1 + src/playsim/actorinlines.h | 2 +- src/playsim/p_mobj.cpp | 1 + src/scripting/thingdef_properties.cpp | 10 ++++++++++ src/scripting/vmthunks_actors.cpp | 1 + wadsrc/static/zscript/actors/actor.zs | 2 ++ 7 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 082a254c9..3144d46f9 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -625,6 +625,7 @@ xx(ScaleY) xx(FriendlySeeBlocks) xx(Floatbobphase) xx(Floatbobstrength) +xx(FloatBobFactor) xx(Target) xx(Master) xx(Tracer) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index bbf2eaf98..40be0c599 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1304,6 +1304,7 @@ public: uint8_t FloatBobPhase; uint8_t FriendPlayer; // [RH] Player # + 1 this friendly monster works for (so 0 is no player, 1 is player 0, etc) double FloatBobStrength; + double FloatBobFactor; PalEntry BloodColor; FTranslationID BloodTranslation; diff --git a/src/playsim/actorinlines.h b/src/playsim/actorinlines.h index 939807c98..bbc173801 100644 --- a/src/playsim/actorinlines.h +++ b/src/playsim/actorinlines.h @@ -69,7 +69,7 @@ inline double AActor::GetBobOffset(double ticfrac) const { return 0; } - return BobSin(FloatBobPhase + Level->maptime + ticfrac) * FloatBobStrength; + return BobSin(FloatBobPhase + Level->maptime * FloatBobFactor + ticfrac) * FloatBobStrength; } inline double AActor::GetCameraHeight() const diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index e8a6c247a..7df73be6d 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -289,6 +289,7 @@ void AActor::Serialize(FSerializer &arc) A("inventoryid", InventoryID) A("floatbobphase", FloatBobPhase) A("floatbobstrength", FloatBobStrength) + A("floatbobfactor", FloatBobFactor) A("translation", Translation) A("bloodcolor", BloodColor) A("bloodtranslation", BloodTranslation) diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index bedd66cd3..f6cd07335 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -642,6 +642,16 @@ DEFINE_PROPERTY(floatbobstrength, F, Actor) defaults->FloatBobStrength = id; } +//========================================================================== +// +//========================================================================== +DEFINE_PROPERTY(floatbobfactor, F, Actor) +{ + PROP_DOUBLE_PARM(id, 0); + if (id <= 0) I_Error ("FloatBobFactor must be above 0.0"); + defaults->FloatBobFactor = id; +} + //========================================================================== // //========================================================================== diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index acf253807..53fc0a062 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2035,6 +2035,7 @@ DEFINE_FIELD(AActor, DamageType) DEFINE_FIELD(AActor, DamageTypeReceived) DEFINE_FIELD(AActor, FloatBobPhase) DEFINE_FIELD(AActor, FloatBobStrength) +DEFINE_FIELD(AActor, FloatBobFactor) DEFINE_FIELD(AActor, RipperLevel) DEFINE_FIELD(AActor, RipLevelMin) DEFINE_FIELD(AActor, RipLevelMax) diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 31dc08052..7a9a53929 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -178,6 +178,7 @@ class Actor : Thinker native native name DamageTypeReceived; native uint8 FloatBobPhase; native double FloatBobStrength; + native double FloatBobFactor; native int RipperLevel; native int RipLevelMin; native int RipLevelMax; @@ -413,6 +414,7 @@ class Actor : Thinker native FloatSpeed 4; FloatBobPhase -1; // randomly initialize by default FloatBobStrength 1.0; + FloatBobFactor 1.0; Gravity 1; Friction 1; DamageFactor 1.0; // damage multiplier as target of damage. From 96ec9b9dbdff5c31205f3e2da33b0d65ebe15013 Mon Sep 17 00:00:00 2001 From: HHonzik <87828740+HHonzik@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:40:48 +0200 Subject: [PATCH 301/414] Add another soundfonts search directory for *nix This adds another soundfont search directory for the convenience of the user. --- src/gameconfigfile.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gameconfigfile.cpp b/src/gameconfigfile.cpp index a0f27899e..82179217c 100644 --- a/src/gameconfigfile.cpp +++ b/src/gameconfigfile.cpp @@ -180,6 +180,7 @@ FGameConfigFile::FGameConfigFile () SetValueForKey("Path", "/usr/share/doom/fm_banks", true); SetValueForKey("Path", "/usr/share/games/doom/soundfonts", true); SetValueForKey("Path", "/usr/share/games/doom/fm_banks", true); + SetValueForKey("Path", "/usr/share/soundfonts", true); #endif } From 1e96ed31aa91acc2c036ac2429da81fcd2740a5d Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sun, 29 Sep 2024 17:31:06 -0400 Subject: [PATCH 302/414] Exported DPrintf Allows for custom debug message handling using the built-in --- src/common/scripting/interface/vmnatives.cpp | 11 +++++++++++ wadsrc/static/zscript/engine/base.zs | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/common/scripting/interface/vmnatives.cpp b/src/common/scripting/interface/vmnatives.cpp index 8a5674afd..2b57ceb25 100644 --- a/src/common/scripting/interface/vmnatives.cpp +++ b/src/common/scripting/interface/vmnatives.cpp @@ -1162,6 +1162,17 @@ DEFINE_ACTION_FUNCTION(_Console, PrintfEx) return 0; } +DEFINE_ACTION_FUNCTION(_Console, DebugPrintf) +{ + PARAM_PROLOGUE; + PARAM_INT(debugLevel); + PARAM_VA_POINTER(va_reginfo); + + FString s = FStringFormat(VM_ARGS_NAMES, 1); + DPrintf(debugLevel, "%s\n", s.GetChars()); + return 0; +} + static void StopAllSounds() { soundEngine->StopAllChannels(); diff --git a/wadsrc/static/zscript/engine/base.zs b/wadsrc/static/zscript/engine/base.zs index f55919116..c4322918f 100644 --- a/wadsrc/static/zscript/engine/base.zs +++ b/wadsrc/static/zscript/engine/base.zs @@ -143,6 +143,15 @@ enum EPrintLevel PRINT_NOLOG = 2048, // Flag - do not print to log file }; +enum EDebugLevel +{ + DMSG_OFF, // no developer messages. + DMSG_ERROR, // general notification messages + DMSG_WARNING, // warnings + DMSG_NOTIFY, // general notification messages + DMSG_SPAMMY, // for those who want to see everything, regardless of its usefulness. +}; + enum EConsoleState { c_up = 0, @@ -665,6 +674,7 @@ struct Console native native static void HideConsole(); native static vararg void Printf(string fmt, ...); native static vararg void PrintfEx(int printlevel, string fmt, ...); + native static vararg void DebugPrintf(int debuglevel, string fmt, ...); } struct CVar native From a4c98d8dd939d9e98cebfc7aef560a0e1ec1ae10 Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Sun, 4 Aug 2024 16:06:55 +0200 Subject: [PATCH 303/414] Add RADF_CIRCULARTHRUST and matching XF_/RTF_ flags --- src/playsim/actor.h | 11 ++++++- src/playsim/p_local.h | 3 +- src/playsim/p_map.cpp | 40 ++++++++++++++++++------- wadsrc/static/zscript/actors/attacks.zs | 1 + wadsrc/static/zscript/constants.zs | 5 +++- 5 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 40be0c599..906fe2c1b 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1524,9 +1524,13 @@ public: { return Z() + Height; } + double CenterOffset() const + { + return Height / 2; + } double Center() const { - return Z() + Height/2; + return Z() + CenterOffset(); } void SetZ(double newz, bool moving = true) { @@ -1603,6 +1607,11 @@ public: Vel.Y += speed * angle.Sin(); } + void Thrust(const DVector3& vel) + { + Vel += vel; + } + void Vel3DFromAngle(DAngle angle, DAngle pitch, double speed) { double cospitch = pitch.Cos(); diff --git a/src/playsim/p_local.h b/src/playsim/p_local.h index cde45f403..6d02d2a56 100644 --- a/src/playsim/p_local.h +++ b/src/playsim/p_local.h @@ -408,7 +408,8 @@ enum RADF_OLDRADIUSDAMAGE = 32, RADF_THRUSTLESS = 64, RADF_NOALLIES = 128, - RADF_CIRCULAR = 256 + RADF_CIRCULAR = 256, + RADF_CIRCULARTHRUST = 512, }; int P_GetRadiusDamage(AActor *self, AActor *thing, int damage, double distance, double fulldmgdistance, bool oldradiusdmg, bool circular); int P_RadiusAttack (AActor *spot, AActor *source, int damage, double distance, diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index af8df92a7..589204993 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -6236,24 +6236,44 @@ int P_RadiusAttack(AActor *bombspot, AActor *bombsource, int bombdamage, double if (!(thing->flags7 & MF7_DONTTHRUST)) { thrust = points * 0.5 / (double)thing->Mass; + if (bombsource == thing) { thrust *= selfthrustscale; } - vz = (thing->Center() - bombspot->Z()) * thrust; - if (bombsource != thing) + + if (flags & RADF_CIRCULARTHRUST) { - vz *= 0.5; + auto dir = bombspot->Vec3To(thing); + dir.Z += thing->CenterOffset() - bombspot->CenterOffset(); + + if (!dir.isZero()) + { + dir.MakeUnit(); + thing->Thrust(dir * thrust); + } } else { - vz *= 0.8; - } - thing->Thrust(bombspot->AngleTo(thing), thrust); - if (!(flags & RADF_NODAMAGE) || (flags & RADF_THRUSTZ)) - { - if (!(thing->Level->i_compatflags2 & COMPATF2_EXPLODE1) || (flags & RADF_THRUSTZ)) - thing->Vel.Z += vz; // this really doesn't work well + thing->Thrust(bombspot->AngleTo(thing), thrust); + + if (!(flags & RADF_NODAMAGE) || (flags & RADF_THRUSTZ)) + { + if (!(thing->Level->i_compatflags2 & COMPATF2_EXPLODE1) || (flags & RADF_THRUSTZ)) + { + vz = (thing->Center() - bombspot->Z()) * thrust; + if (bombsource != thing) + { + vz *= 0.5; + } + else + { + vz *= 0.8; + } + + thing->Vel.Z += vz; // this really doesn't work well + } + } } } } diff --git a/wadsrc/static/zscript/actors/attacks.zs b/wadsrc/static/zscript/actors/attacks.zs index db9da6f35..1965be0b1 100644 --- a/wadsrc/static/zscript/actors/attacks.zs +++ b/wadsrc/static/zscript/actors/attacks.zs @@ -609,6 +609,7 @@ extend class Actor if (flags & XF_THRUSTLESS) pflags |= RADF_THRUSTLESS; if (flags & XF_NOALLIES) pflags |= RADF_NOALLIES; if (flags & XF_CIRCULAR) pflags |= RADF_CIRCULAR; + if (flags & XF_CIRCULARTHRUST) pflags |= RADF_CIRCULARTHRUST; int count = RadiusAttack (target, damage, distance, damagetype, pflags, fulldamagedistance); if (!(flags & XF_NOSPLASH)) CheckSplash(distance); diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index f22204cbf..641d90a12 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -267,6 +267,7 @@ enum EExplodeFlags XF_THRUSTLESS = 64, XF_NOALLIES = 128, XF_CIRCULAR = 256, + XF_CIRCULARTHRUST = 512, }; // Flags for A_RadiusThrust @@ -276,6 +277,7 @@ enum ERadiusThrustFlags RTF_NOIMPACTDAMAGE = 2, RTF_NOTMISSILE = 4, RTF_THRUSTZ = 16, + RTF_CIRCULARTHRUST = 512, }; // Flags for A_RadiusDamageSelf @@ -1254,7 +1256,8 @@ enum RadiusDamageFlags RADF_OLDRADIUSDAMAGE = 32, RADF_THRUSTLESS = 64, RADF_NOALLIES = 128, - RADF_CIRCULAR = 256 + RADF_CIRCULAR = 256, + RADF_CIRCULARTHRUST = 512, }; enum IntermissionSequenceType From 5cc718ec7728acb3093f91992023935ba4c73594 Mon Sep 17 00:00:00 2001 From: Hexadec <164735227+Hex4dec@users.noreply.github.com> Date: Mon, 30 Sep 2024 01:06:49 +0300 Subject: [PATCH 304/414] Search more paths in SHARE_DIR (#2610) * Search more paths in SHARE_DIR Makes it more compatible with more exotic systems such as Guix or NixOS. (one day we'll have a gzdoom without patches) * Make more places search in SHARE_DIR. --------- Co-authored-by: Rachael Alexanderson <18584402+madame-rachelle@users.noreply.github.com> --- src/gameconfigfile.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gameconfigfile.cpp b/src/gameconfigfile.cpp index 82179217c..b61279ebc 100644 --- a/src/gameconfigfile.cpp +++ b/src/gameconfigfile.cpp @@ -125,6 +125,9 @@ FGameConfigFile::FGameConfigFile () SetValueForKey ("Path", "/usr/local/share/games/doom", true); SetValueForKey ("Path", "/usr/share/doom", true); SetValueForKey ("Path", "/usr/share/games/doom", true); + SetValueForKey ("Path", SHARE_DIR "/doom", true); + SetValueForKey ("Path", SHARE_DIR "/games/doom", true); + #endif } @@ -143,6 +146,8 @@ FGameConfigFile::FGameConfigFile () SetValueForKey ("Path", "$HOME/" GAME_DIR, true); SetValueForKey ("Path", "$HOME/.local/share/games/doom", true); SetValueForKey ("Path", SHARE_DIR, true); + SetValueForKey ("Path", SHARE_DIR "/doom", true); + SetValueForKey ("Path", SHARE_DIR "/games/doom", true); SetValueForKey ("Path", "/usr/local/share/doom", true); SetValueForKey ("Path", "/usr/local/share/games/doom", true); SetValueForKey ("Path", "/usr/share/doom", true); @@ -180,6 +185,10 @@ FGameConfigFile::FGameConfigFile () SetValueForKey("Path", "/usr/share/doom/fm_banks", true); SetValueForKey("Path", "/usr/share/games/doom/soundfonts", true); SetValueForKey("Path", "/usr/share/games/doom/fm_banks", true); + SetValueForKey("Path", SHARE_DIR "/doom/soundfonts", true); + SetValueForKey("Path", SHARE_DIR "/doom/fm_banks", true); + SetValueForKey("Path", SHARE_DIR "/games/doom/soundfonts", true); + SetValueForKey("Path", SHARE_DIR "/games/doom/fm_banks", true); SetValueForKey("Path", "/usr/share/soundfonts", true); #endif } From bbeaea1ea75ef466b2f0e08b433af43bb8d89f45 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson <18584402+madame-rachelle@users.noreply.github.com> Date: Sun, 29 Sep 2024 18:09:07 -0400 Subject: [PATCH 305/414] - implement anamorphesis proof-of-concept (#2431) Co-authored-by: Rachael Alexanderson --- src/rendering/hwrenderer/scene/hw_sprites.cpp | 53 +++++++++++++++++++ wadsrc/static/menudef.txt | 1 + 2 files changed, 54 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 70da581cb..61c120f31 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -81,6 +81,8 @@ EXTERN_CVAR(Float, r_actorspriteshadowfadeheight) CVAR(Bool, gl_usecolorblending, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, gl_sprite_blend, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); CVAR(Int, gl_spriteclip, 1, CVAR_ARCHIVE) +CVAR(Bool, r_debug_nolimitanamorphoses, false, 0) +CVAR(Float, r_spriteclipanamorphicminbias, 0.6, CVAR_ARCHIVE) CVAR(Float, gl_sclipthreshold, 10.0, CVAR_ARCHIVE) CVAR(Float, gl_sclipfactor, 1.8f, CVAR_ARCHIVE) CVAR(Int, gl_particles_style, 2, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // 0 = square, 1 = round, 2 = smooth @@ -1117,6 +1119,56 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t if(thing->renderflags2 & RF2_ISOMETRICSPRITES) depth = depth * vp.PitchCos - vp.PitchSin * z2; // Helps with stacking actors with small xy offsets if (isSpriteShadow) depth += 1.f/65536.f; // always sort shadows behind the sprite. + if (gl_spriteclip == -1 && (thing->renderflags & RF_SPRITETYPEMASK) == RF_FACESPRITE) // perform anamorphosis + { + float minbias = r_spriteclipanamorphicminbias; + minbias = clamp(minbias, 0.3f, 1.0f); + + float btm = thing->Sector->floorplane.ZatPoint(thing) - thing->Floorclip; + float top = thing->Sector->ceilingplane.ZatPoint(thingpos); + + float vbtm = thing->Sector->floorplane.ZatPoint(vp.Pos); + float vtop = thing->Sector->ceilingplane.ZatPoint(vp.Pos); + + float vpx = vp.Pos.X; + float vpy = vp.Pos.Y; + float vpz = vp.Pos.Z; + + float tpx = thingpos.X; + float tpy = thingpos.Y; + float tpz = thingpos.Z; + + if (!(r_debug_nolimitanamorphoses)) + { + // this should help prevent clipping through walls ... + float objradiusbias = 1.f - thing->radius / sqrt((vpx - tpx) * (vpx - tpx) + (vpy - tpy) * (vpy - tpy)); + minbias = max(minbias, objradiusbias); + } + + float bintersect, tintersect; + if (z2 < vpz && vbtm < vpz) + bintersect = min((btm - vpz) / (z2 - vpz), (vbtm - vpz) / (z2 - vpz)); + else + bintersect = 1.0; + + if (z1 > vpz && vtop > vpz) + tintersect = min((top - vpz) / (z1 - vpz), (vtop - vpz) / (z1 - vpz)); + else + tintersect = 1.0; + + if (thing->waterlevel >= 1 && thing->waterlevel <= 2) + bintersect = tintersect = 1.0f; + + float spbias = clamp(min(bintersect, tintersect), minbias, 1.0f); + float vpbias = 1.0 - spbias; + x1 = x1 * spbias + vpx * vpbias; + y1 = y1 * spbias + vpy * vpbias; + z1 = z1 * spbias + vpz * vpbias; + x2 = x2 * spbias + vpx * vpbias; + y2 = y2 * spbias + vpy * vpbias; + z2 = z2 * spbias + vpz * vpbias; + } + // light calculation bool enhancedvision = false; @@ -1335,6 +1387,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t { lightlist = nullptr; } + PutSprite(di, hw_styleflags != STYLEHW_Solid); rendered_sprites++; } diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 0d099afb6..4ac0a00ff 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2392,6 +2392,7 @@ OptionValue "SpriteclipModes" 1, "$OPTVAL_SMART" 2, "$OPTVAL_ALWAYS" 3, "$OPTVAL_SMARTER" + -1, "$OPTVAL_ANAMORPHIC" } OptionValue "EnhancedStealth" From 391f4965128f2f5e2c07d764d42f363c67d9ed1c Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Fri, 29 Mar 2024 20:55:50 +0200 Subject: [PATCH 306/414] Added SECMF_HURTMONSTERS, SECMF_HARMINAIR and NOSECTORDAMAGE. - Added SECMF_HURTMONSTERS, which allows monsters in the flagged sector to be hurt with the same behavior as players (i.e damage leaking). - Added SECMF_HARMINAIR, which allows players (And monsters with SECMF_HURTMONSTERS) to be hurt when they're inside the sector in general, instead of only when they're walking on it. Replicates the behavior of the DAMAGE_IN_AIR flag that SectorDamage() uses. - Added NOSECTORDAMAGE, which makes actors with the flag immune to any harmful floors. --- specs/udmf_zdoom.txt | 2 + src/gamedata/r_defs.h | 2 + src/maploader/udmf.cpp | 8 ++++ src/namedef_custom.h | 2 + src/playsim/actor.h | 3 +- src/playsim/p_3dfloors.cpp | 18 ++++----- src/playsim/p_3dfloors.h | 3 +- src/playsim/p_mobj.cpp | 8 ++++ src/playsim/p_spec.cpp | 65 +++++++++++++++----------------- src/playsim/p_spec.h | 4 +- src/playsim/p_user.cpp | 9 ----- src/scripting/thingdef_data.cpp | 1 + wadsrc/static/zscript/mapdata.zs | 8 ++++ 13 files changed, 76 insertions(+), 57 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 35b23418d..78ccd05b4 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -307,6 +307,8 @@ Note: All fields default to false unless mentioned otherwise. leakiness = ; // Probability of leaking through radiation suit (0 = never, 256 = always), default = 0. damageterraineffect = ; // Will spawn a terrain splash when damage is inflicted. Default = false. damagehazard = ; // Changes damage model to Strife's delayed damage for the given sector. Default = false. + hurtmonsters = ; // Non-players like monsters and decorations are hurt by this sector in the same manner as player. Doesn't work with damagehazard. + harminair = ; // Actors in this sector are harmed by the damage effects of the floor even if they aren't touching it. floorterrain = ; // Sets the terrain for the sector's floor. Default = 'use the flat texture's terrain definition.' ceilingterrain = ; // Sets the terrain for the sector's ceiling. Default = 'use the flat texture's terrain definition.' floor_reflect = ; // reflectiveness of floor (OpenGL only, not functional on sloped sectors) diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index 943893c66..d6453b6f8 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -504,6 +504,8 @@ enum SECMF_OVERLAPPING = 512, // floor and ceiling overlap and require special renderer action. SECMF_NOSKYWALLS = 1024, // Do not draw "sky walls" SECMF_LIFT = 2048, // For MBF monster AI + SECMF_HURTMONSTERS = 4096, // Monsters in this sector are hurt like players. + SECMF_HARMINAIR = 8192, // Actors in this sector are also hurt mid-air. }; enum diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index ad33538ab..38ec2a0f9 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -1978,6 +1978,14 @@ public: Flag(sec->Flags, SECF_HAZARD, key); break; + case NAME_hurtmonsters: + Flag(sec->MoreFlags, SECMF_HURTMONSTERS, key); + break; + + case NAME_harminair: + Flag(sec->MoreFlags, SECMF_HARMINAIR, key); + break; + case NAME_floorterrain: sec->terrainnum[sector_t::floor] = P_FindTerrain(CheckString(key)); break; diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 3144d46f9..4545e8746 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -810,6 +810,8 @@ xx(damageinterval) xx(leakiness) xx(damageterraineffect) xx(damagehazard) +xx(hurtmonsters) +xx(harminair) xx(floorterrain) xx(ceilingterrain) xx(floor_reflect) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 906fe2c1b..a96e7f316 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -442,7 +442,8 @@ enum ActorFlag9 MF9_DOSHADOWBLOCK = 0x00000002, // [inkoalawetrust] Should the monster look for SHADOWBLOCK actors ? MF9_SHADOWBLOCK = 0x00000004, // [inkoalawetrust] Actors in the line of fire with this flag trigger the MF_SHADOW aiming penalty. MF9_SHADOWAIMVERT = 0x00000008, // [inkoalawetrust] Monster aim is also offset vertically when aiming at shadow actors. - MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states + MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states + MF9_NOSECTORDAMAGE = 0x00000020, // [inkoalawetrust] Actor ignores any sector-based damage (i.e damaging floors, NOT crushers) }; // --- mobj.renderflags --- diff --git a/src/playsim/p_3dfloors.cpp b/src/playsim/p_3dfloors.cpp index dd5a2bb0a..505bfa794 100644 --- a/src/playsim/p_3dfloors.cpp +++ b/src/playsim/p_3dfloors.cpp @@ -198,15 +198,15 @@ void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags, int //========================================================================== // -// P_PlayerOnSpecial3DFloor -// Checks to see if a player is standing on or is inside a 3D floor (water) +// P_ActorOnSpecial3DFloor +// Checks to see if an actor is standing on or is inside a 3D floor (water) // and applies any specials.. // //========================================================================== -void P_PlayerOnSpecial3DFloor(player_t* player) +void P_ActorOnSpecial3DFloor(AActor* victim) { - for(auto rover : player->mo->Sector->e->XFloor.ffloors) + for(auto rover : victim->Sector->e->XFloor.ffloors) { if (!(rover->flags & FF_EXISTS)) continue; if (rover->flags & FF_FIX) continue; @@ -215,22 +215,22 @@ void P_PlayerOnSpecial3DFloor(player_t* player) if(rover->flags & FF_SOLID) { // Player must be on top of the floor to be affected... - if(player->mo->Z() != rover->top.plane->ZatPoint(player->mo)) continue; + if(victim->Z() != rover->top.plane->ZatPoint(victim)) continue; } else { //Water and DEATH FOG!!! heh if ((rover->flags & FF_NODAMAGE) || - player->mo->Z() > rover->top.plane->ZatPoint(player->mo) || - player->mo->Top() < rover->bottom.plane->ZatPoint(player->mo)) + victim->Z() > rover->top.plane->ZatPoint(victim) || + victim->Top() < rover->bottom.plane->ZatPoint(victim)) continue; } // Apply sector specials - P_PlayerInSpecialSector(player, rover->model); + P_ActorInSpecialSector(victim, rover->model); // Apply flat specials (using the ceiling!) - P_PlayerOnSpecialFlat(player, rover->model->GetTerrain(rover->top.isceiling)); + P_ActorOnSpecialFlat(victim, rover->model->GetTerrain(rover->top.isceiling)); break; } diff --git a/src/playsim/p_3dfloors.h b/src/playsim/p_3dfloors.h index 05d222137..2dba7f713 100644 --- a/src/playsim/p_3dfloors.h +++ b/src/playsim/p_3dfloors.h @@ -113,8 +113,7 @@ struct lightlist_t -class player_t; -void P_PlayerOnSpecial3DFloor(player_t* player); +void P_ActorOnSpecial3DFloor(AActor* victim); bool P_CheckFor3DFloorHit(AActor * mo, double z, bool trigger); bool P_CheckFor3DCeilingHit(AActor * mo, double z, bool trigger); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 7df73be6d..c9bf3dd37 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -4431,6 +4431,14 @@ void AActor::Tick () // must have been removed if (ObjectFlags & OF_EuthanizeMe) return; } + //[inkoalawetrust] Genericized level damage handling that makes sector, 3D floor, and TERRAIN flat damage affect monsters and other NPCs too. + if (!(flags9 & MF9_NOSECTORDAMAGE) && (player || (player == nullptr && Sector->MoreFlags & SECMF_HURTMONSTERS))) + { + P_ActorOnSpecial3DFloor(this); + P_ActorInSpecialSector(this,Sector); + if (!isAbove(Sector->floorplane.ZatPoint(this)) || waterlevel) // Actor must be touching the floor for TERRAIN flats. + P_ActorOnSpecialFlat(this, P_GetThingFloorType(this)); + } if (tics != -1) { diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index 3b63839fe..d72b14e96 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -100,7 +100,7 @@ #include "c_console.h" #include "p_spec_thinkers.h" -static FRandom pr_playerinspecialsector ("PlayerInSpecialSector"); +static FRandom pr_actorinspecialsector ("ActorInSpecialSector"); EXTERN_CVAR(Bool, cl_predict_specials) EXTERN_CVAR(Bool, forcewater) @@ -419,21 +419,20 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType) } // -// P_PlayerInSpecialSector +// P_ActorInSpecialSector // Called every tic frame -// that the player origin is in a special sector +// that the actor origin is in a special sector // -void P_PlayerInSpecialSector (player_t *player, sector_t * sector) +void P_ActorInSpecialSector (AActor *victim, sector_t * sector) { if (sector == NULL) + sector = victim->Sector; + + // Falling, not all the way down yet? + if (!(sector->MoreFlags & SECMF_HARMINAIR) && !victim->isAtZ(sector->LowestFloorAt(victim)) && !victim->waterlevel) { - // Falling, not all the way down yet? - sector = player->mo->Sector; - if (!player->mo->isAtZ(sector->LowestFloorAt(player->mo)) - && !player->mo->waterlevel) - { - return; - } + DPrintf(2,"P_ActorInSpecialSector(): %p is not touching the floor and HARMINAIR isn't on, so they won't be harmed by the sector.\n",victim); + return; } // Has hit ground. @@ -445,7 +444,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) if (sector->damageinterval <= 0) sector->damageinterval = 32; // repair invalid damageinterval values - if (sector->Flags & (SECF_EXIT1 | SECF_EXIT2)) + if (victim->player && sector->Flags & (SECF_EXIT1 | SECF_EXIT2)) { for (int i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) @@ -464,7 +463,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) // different damage types yet, so that's not happening for now. // [MK] account for subclasses that may have "Full" protection (i.e.: prevent leaky damage) int ironfeet = 0; - for (auto i = player->mo->Inventory; i != NULL; i = i->Inventory) + for (auto i = victim->Inventory; i != NULL; i = i->Inventory) { if (i->IsKindOf(NAME_PowerIronFeet)) { @@ -476,28 +475,28 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) } } - if (sector->Flags & SECF_ENDGODMODE) player->cheats &= ~CF_GODMODE; - if ((ironfeet == 0 || (ironfeet < 2 && pr_playerinspecialsector() < sector->leakydamage))) + if (victim->player && sector->Flags & SECF_ENDGODMODE) victim->player->cheats &= ~CF_GODMODE; + if ((ironfeet == 0 || (ironfeet < 2 && pr_actorinspecialsector() < sector->leakydamage))) { - if (sector->Flags & SECF_HAZARD) + if (victim->player && sector->Flags & SECF_HAZARD) { - player->hazardcount += sector->damageamount; - player->hazardtype = sector->damagetype; - player->hazardinterval = sector->damageinterval; + victim->player->hazardcount += sector->damageamount; + victim->player->hazardtype = sector->damagetype; + victim->player->hazardinterval = sector->damageinterval; } else if (Level->time % sector->damageinterval == 0) { - if (!(player->cheats & (CF_GODMODE | CF_GODMODE2))) + if (!(victim->player && victim->player->cheats & (CF_GODMODE | CF_GODMODE2))) { - P_DamageMobj(player->mo, NULL, NULL, sector->damageamount, sector->damagetype); + P_DamageMobj(victim, NULL, NULL, sector->damageamount, sector->damagetype); } - if ((sector->Flags & SECF_ENDLEVEL) && player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) + if (victim->player && (sector->Flags & SECF_ENDLEVEL) && victim->player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) { Level->ExitLevel(0, false); } if (sector->Flags & SECF_DMGTERRAINFX) { - P_HitWater(player->mo, player->mo->Sector, player->mo->Pos(), false, true, true); + P_HitWater(victim, victim->Sector, victim->Pos(), false, true, true); } } } @@ -506,14 +505,14 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) { if (Level->time % sector->damageinterval == 0) { - P_GiveBody(player->mo, -sector->damageamount, 100); + P_GiveBody(victim, -sector->damageamount, 100); } } - if (sector->isSecret()) + if (victim->player && sector->isSecret()) { sector->ClearSecret(); - P_GiveSecret(Level, player->mo, true, true, sector->Index()); + P_GiveSecret(Level, victim, true, true, sector->Index()); } } @@ -652,13 +651,13 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GiveSecret) //============================================================================ // -// P_PlayerOnSpecialFlat +// P_ActorOnSpecialFlat // //============================================================================ -void P_PlayerOnSpecialFlat (player_t *player, int floorType) +void P_ActorOnSpecialFlat (AActor *victim, int floorType) { - auto Level = player->mo->Level; + auto Level = victim->Level; if (Terrains[floorType].DamageAmount && !(Level->time % (Terrains[floorType].DamageTimeMask+1))) @@ -668,7 +667,7 @@ void P_PlayerOnSpecialFlat (player_t *player, int floorType) if (Terrains[floorType].AllowProtection) { auto pitype = PClass::FindActor(NAME_PowerIronFeet); - for (ironfeet = player->mo->Inventory; ironfeet != NULL; ironfeet = ironfeet->Inventory) + for (ironfeet = victim->Inventory; ironfeet != NULL; ironfeet = ironfeet->Inventory) { if (ironfeet->IsKindOf (pitype)) break; @@ -678,20 +677,18 @@ void P_PlayerOnSpecialFlat (player_t *player, int floorType) int damage = 0; if (ironfeet == NULL) { - damage = P_DamageMobj (player->mo, NULL, NULL, Terrains[floorType].DamageAmount, + damage = P_DamageMobj (victim, NULL, NULL, Terrains[floorType].DamageAmount, Terrains[floorType].DamageMOD); } if (damage > 0 && Terrains[floorType].Splash != -1) { - S_Sound (player->mo, CHAN_AUTO, 0, + S_Sound (victim, CHAN_AUTO, 0, Splashes[Terrains[floorType].Splash].NormalSplashSound, 1, ATTN_IDLE); } } } - - // // P_UpdateSpecials // Animate planes, scroll walls, etc. diff --git a/src/playsim/p_spec.h b/src/playsim/p_spec.h index cc7d990a9..ebb5d93f9 100644 --- a/src/playsim/p_spec.h +++ b/src/playsim/p_spec.h @@ -90,8 +90,8 @@ bool P_ActivateLine (line_t *ld, AActor *mo, int side, int activationType, DVect bool P_TestActivateLine (line_t *ld, AActor *mo, int side, int activationType, DVector3 *optpos = NULL); bool P_PredictLine (line_t *ld, AActor *mo, int side, int activationType); -void P_PlayerInSpecialSector (player_t *player, sector_t * sector=NULL); -void P_PlayerOnSpecialFlat (player_t *player, int floorType); +void P_ActorInSpecialSector (AActor *victim, sector_t * sector=NULL); +void P_ActorOnSpecialFlat (AActor *victim, int floorType); void P_SectorDamage(FLevelLocals *Level, int tag, int amount, FName type, PClassActor *protectClass, int flags); void P_SetSectorFriction (FLevelLocals *level, int tag, int amount, bool alterFlag); double FrictionToMoveFactor(double friction); diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index fefb0f943..43cc67bd8 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1181,15 +1181,6 @@ DEFINE_ACTION_FUNCTION(APlayerPawn, CheckMusicChange) void P_CheckEnvironment(player_t *player) { - P_PlayerOnSpecial3DFloor(player); - P_PlayerInSpecialSector(player); - - if (!player->mo->isAbove(player->mo->Sector->floorplane.ZatPoint(player->mo)) || - player->mo->waterlevel) - { - // Player must be touching the floor - P_PlayerOnSpecialFlat(player, P_GetThingFloorType(player->mo)); - } if (player->mo->Vel.Z <= -player->mo->FloatVar(NAME_FallingScreamMinSpeed) && player->mo->Vel.Z >= -player->mo->FloatVar(NAME_FallingScreamMaxSpeed) && player->mo->alternative == nullptr && player->mo->waterlevel == 0) diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 5bbb35fae..bc62f2250 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -353,6 +353,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF9, SHADOWBLOCK, AActor, flags9), DEFINE_FLAG(MF9, SHADOWAIMVERT, AActor, flags9), DEFINE_FLAG(MF9, DECOUPLEDANIMATIONS, AActor, flags9), + DEFINE_FLAG(MF9, NOSECTORDAMAGE, AActor, flags9), // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), diff --git a/wadsrc/static/zscript/mapdata.zs b/wadsrc/static/zscript/mapdata.zs index db217e7cc..080e05f32 100644 --- a/wadsrc/static/zscript/mapdata.zs +++ b/wadsrc/static/zscript/mapdata.zs @@ -435,6 +435,11 @@ struct Sector native play SECMF_UNDERWATERMASK = 32+64, SECMF_DRAWN = 128, // sector has been drawn at least once SECMF_HIDDEN = 256, // Do not draw on textured automap + SECMF_OVERLAPPING = 512, // floor and ceiling overlap and require special renderer action. + SECMF_NOSKYWALLS = 1024, // Do not draw "sky walls" + SECMF_LIFT = 2048, // For MBF monster AI + SECMF_HURTMONSTERS = 4096, // Monsters in this sector are hurt like players. + SECMF_HARMINAIR = 8192, // Actors in this sector are also hurt mid-air. } native uint16 MoreFlags; @@ -452,6 +457,9 @@ struct Sector native play SECF_ENDLEVEL = 512, // ends level when health goes below 10 SECF_HAZARD = 1024, // Change to Strife's delayed damage handling. SECF_NOATTACK = 2048, // monsters cannot start attacks in this sector. + SECF_EXIT1 = 4096, + SECF_EXIT2 = 8192, + SECF_KILLMONSTERS = 16384,// Monsters in this sector are instantly killed. SECF_WASSECRET = 1 << 30, // a secret that was discovered SECF_SECRET = 1 << 31, // a secret sector From 9b8c79d1823e96102cb3be146259642a592daa90 Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Fri, 29 Mar 2024 21:10:36 +0200 Subject: [PATCH 307/414] Added check for hurt floors in P_IsUnderDamage(). --- src/playsim/p_enemy.cpp | 6 ++++++ src/playsim/p_spec.cpp | 3 --- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index 45df68ac1..1d49f4b3a 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -465,6 +465,12 @@ static int P_IsUnderDamage(AActor* actor) dir |= cl->getDirection(); } // Q: consider crushing 3D floors too? + // [inkoalawetrust] Check for sectors that can harm the actor. + if (!(actor->flags9 & MF9_NOSECTORDAMAGE) && seclist->m_sector->damageamount > 0) + { + if (seclist->m_sector->MoreFlags & SECMF_HARMINAIR || actor->isAtZ(seclist->m_sector->LowestFloorAt(actor)) || actor->waterlevel) + return (actor->player || (actor->player == nullptr && seclist->m_sector->MoreFlags & SECMF_HURTMONSTERS)) ? -1 : 0; + } } return dir; } diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index d72b14e96..3ee5fe871 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -430,10 +430,7 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) // Falling, not all the way down yet? if (!(sector->MoreFlags & SECMF_HARMINAIR) && !victim->isAtZ(sector->LowestFloorAt(victim)) && !victim->waterlevel) - { - DPrintf(2,"P_ActorInSpecialSector(): %p is not touching the floor and HARMINAIR isn't on, so they won't be harmed by the sector.\n",victim); return; - } // Has hit ground. From 4c27b55eb940a94e7de3c624c3bcc68e0b3dda30 Mon Sep 17 00:00:00 2001 From: Jon Heard Date: Sun, 28 Apr 2024 19:39:45 -0400 Subject: [PATCH 308/414] SetSkin and GetSkinCount added to PlayerInfo class --- src/playsim/p_user.cpp | 23 +++++++++++++++++++ wadsrc/static/zscript/actors/player/player.zs | 2 ++ 2 files changed, 25 insertions(+) diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index 43cc67bd8..a98a7c523 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -520,6 +520,23 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, SetFOV) return 0; } +DEFINE_ACTION_FUNCTION(_PlayerInfo, SetSkin) +{ + PARAM_SELF_STRUCT_PROLOGUE(player_t); + PARAM_INT(skinIndex); + if (skinIndex >= 0 && skinIndex < Skins.size()) + { + // commented code - cvar_set calls this automatically, along with saving the skin selection. + //self->userinfo.SkinNumChanged(skinIndex); + cvar_set("skin", Skins[skinIndex].Name.GetChars()); + ACTION_RETURN_INT(self->userinfo.GetSkin()); + } + else + { + ACTION_RETURN_INT(-1); + } +} + //=========================================================================== // // EnumColorsets @@ -773,6 +790,12 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, GetSkin) ACTION_RETURN_INT(self->userinfo.GetSkin()); } +DEFINE_ACTION_FUNCTION(_PlayerInfo, GetSkinCount) +{ + PARAM_SELF_STRUCT_PROLOGUE(player_t); + ACTION_RETURN_INT(Skins.size()); +} + DEFINE_ACTION_FUNCTION(_PlayerInfo, GetGender) { PARAM_SELF_STRUCT_PROLOGUE(player_t); diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index 69e534b70..c2da5f46c 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -2867,6 +2867,7 @@ struct PlayerInfo native play // self is what internally is known as player_t native clearscope int GetColorSet() const; native clearscope int GetPlayerClassNum() const; native clearscope int GetSkin() const; + native clearscope int GetSkinCount() const; native clearscope bool GetNeverSwitch() const; native clearscope int GetGender() const; native clearscope int GetTeam() const; @@ -2878,6 +2879,7 @@ struct PlayerInfo native play // self is what internally is known as player_t native bool GetFViewBob() const; native double GetStillBob() const; native void SetFOV(float fov); + native int SetSkin(int skinIndex); native clearscope bool GetClassicFlight() const; native void SendPitchLimits(); native clearscope bool HasWeaponsInSlot(int slot) const; From 41c69736b1544158816c9254a5837afd79b06209 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 30 Sep 2024 01:51:55 -0400 Subject: [PATCH 309/414] - fix some issues with ClearInventory() that sometimes caused script errors --- wadsrc/static/zscript/actors/inventory/inventory.zs | 1 + wadsrc/static/zscript/actors/inventory_util.zs | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs index 52009f2e1..f41880a3c 100644 --- a/wadsrc/static/zscript/actors/inventory/inventory.zs +++ b/wadsrc/static/zscript/actors/inventory/inventory.zs @@ -940,6 +940,7 @@ class Inventory : Actor } else { + Owner = null; Destroy(); } } diff --git a/wadsrc/static/zscript/actors/inventory_util.zs b/wadsrc/static/zscript/actors/inventory_util.zs index 011ca134f..e47172a49 100644 --- a/wadsrc/static/zscript/actors/inventory_util.zs +++ b/wadsrc/static/zscript/actors/inventory_util.zs @@ -333,8 +333,13 @@ extend class Actor // destroy something we already processed, we've already destroyed it, // so it won't have anything to destroy. - let last = self; + if (player != null) + { + player.ReadyWeapon = null; + player.PendingWeapon = WP_NOCHANGE; + } + let last = self; while (last.inv != NULL) { let inv = last.inv; @@ -348,11 +353,6 @@ extend class Actor last = inv; } } - if (player != null) - { - player.ReadyWeapon = null; - player.PendingWeapon = WP_NOCHANGE; - } } From 0b3ee04025d62de65c3a8337f5ee595e7fa9881c Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 30 Sep 2024 02:09:52 -0400 Subject: [PATCH 310/414] - bail out if `shape` is null in `F2DDrawer::AddShape` --- src/common/2d/v_2ddrawer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/2d/v_2ddrawer.cpp b/src/common/2d/v_2ddrawer.cpp index 717d607c6..10f4869b9 100644 --- a/src/common/2d/v_2ddrawer.cpp +++ b/src/common/2d/v_2ddrawer.cpp @@ -592,6 +592,10 @@ void DShape2D::OnDestroy() { void F2DDrawer::AddShape(FGameTexture* img, DShape2D* shape, DrawParms& parms) { + // bail if shape is null (shouldn't happen but it might) + if (!shape) + ThrowAbortException(X_OTHER, "shape is null"); + // [MK] bail out if vertex/coord array sizes are mismatched if ( shape->mVertices.Size() != shape->mCoords.Size() ) ThrowAbortException(X_OTHER, "Mismatch in vertex/coord count: %u != %u", shape->mVertices.Size(), shape->mCoords.Size()); From 8e1b25803e6c65630b06be8d39188f9eafeb2564 Mon Sep 17 00:00:00 2001 From: Boondorl Date: Sun, 29 Sep 2024 19:55:13 -0400 Subject: [PATCH 311/414] Fix for NoLocalRender not snapshotting between hub levels --- src/playsim/p_mobj.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index c9bf3dd37..e39db44cb 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -217,6 +217,7 @@ void AActor::Serialize(FSerializer &arc) A("angles", Angles) A("frame", frame) A("scale", Scale) + A("nolocalrender", NoLocalRender) // Note: This will probably be removed later since a better solution is needed A("renderstyle", RenderStyle) A("renderflags", renderflags) A("renderflags2", renderflags2) From 18c068fd1f803e97d96224994145f950bd78b82e Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 30 Sep 2024 03:27:39 -0400 Subject: [PATCH 312/414] Revert "- fix some issues with ClearInventory() that sometimes caused script errors" This reverts commit 41c69736b1544158816c9254a5837afd79b06209. This introduced more bugs and so the fix was not valid. --- wadsrc/static/zscript/actors/inventory/inventory.zs | 1 - wadsrc/static/zscript/actors/inventory_util.zs | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs index f41880a3c..52009f2e1 100644 --- a/wadsrc/static/zscript/actors/inventory/inventory.zs +++ b/wadsrc/static/zscript/actors/inventory/inventory.zs @@ -940,7 +940,6 @@ class Inventory : Actor } else { - Owner = null; Destroy(); } } diff --git a/wadsrc/static/zscript/actors/inventory_util.zs b/wadsrc/static/zscript/actors/inventory_util.zs index e47172a49..011ca134f 100644 --- a/wadsrc/static/zscript/actors/inventory_util.zs +++ b/wadsrc/static/zscript/actors/inventory_util.zs @@ -333,13 +333,8 @@ extend class Actor // destroy something we already processed, we've already destroyed it, // so it won't have anything to destroy. - if (player != null) - { - player.ReadyWeapon = null; - player.PendingWeapon = WP_NOCHANGE; - } - let last = self; + while (last.inv != NULL) { let inv = last.inv; @@ -353,6 +348,11 @@ extend class Actor last = inv; } } + if (player != null) + { + player.ReadyWeapon = null; + player.PendingWeapon = WP_NOCHANGE; + } } From 568a39d20335cc4c6b1260f8a5102e1fec028166 Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Mon, 30 Sep 2024 07:58:43 -0600 Subject: [PATCH 313/414] Removing pre-clipping of Frustum if pitch > 46 degrees and viewpoint is not allowed out of bounds. This is like old behavior. --- src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index b7c02a841..3453b6e50 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -366,6 +366,7 @@ angle_t HWDrawInfo::FrustumAngle() { // If pitch is larger than this you can look all around at an FOV of 90 degrees if (fabs(Viewpoint.HWAngles.Pitch.Degrees()) > 89.0) return 0xffffffff; + else if (fabs(Viewpoint.HWAngles.Pitch.Degrees()) > 46.0 && !Viewpoint.IsAllowedOoB()) return 0xffffffff; // Just like 4.12.2 and older did int aspMult = AspectMultiplier(r_viewwindow.WidescreenRatio); // 48 == square window double absPitch = fabs(Viewpoint.HWAngles.Pitch.Degrees()); // Smaller aspect ratios still clip too much. Need a better solution From d69d190dc35c731851720c446017db9229ccd1e8 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 30 Sep 2024 18:48:48 +0200 Subject: [PATCH 314/414] Add savelightmap and deletelightmap ccmds --- src/common/rendering/v_video.h | 1 + .../rendering/vulkan/textures/vk_texture.cpp | 37 ++ .../rendering/vulkan/textures/vk_texture.h | 1 + .../rendering/vulkan/vk_renderdevice.cpp | 5 + src/common/rendering/vulkan/vk_renderdevice.h | 1 + src/rendering/hwrenderer/doom_levelmesh.cpp | 416 ++++++++++++++++++ src/rendering/hwrenderer/doom_levelmesh.h | 4 + 7 files changed, 465 insertions(+) diff --git a/src/common/rendering/v_video.h b/src/common/rendering/v_video.h index 9bdb2ab4b..1a34170a0 100644 --- a/src/common/rendering/v_video.h +++ b/src/common/rendering/v_video.h @@ -227,6 +227,7 @@ public: virtual void PostProcessScene(bool swscene, int fixedcm, float flash, const std::function &afterBloomDrawEndScene2D) { if (afterBloomDrawEndScene2D) afterBloomDrawEndScene2D(); } virtual int GetLevelMeshPipelineID(const MeshApplyData& applyData, const SurfaceUniforms& surfaceUniforms, const FMaterialState& material) { return 0; } + virtual void DownloadLightmap(int arrayIndex, uint16_t* buffer) { } void ScaleCoordsFromWindow(int16_t &x, int16_t &y); diff --git a/src/common/rendering/vulkan/textures/vk_texture.cpp b/src/common/rendering/vulkan/textures/vk_texture.cpp index b10cfc948..eee217749 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.cpp +++ b/src/common/rendering/vulkan/textures/vk_texture.cpp @@ -267,3 +267,40 @@ void VkTextureManager::CreateLightmap(int newLMTextureSize, int newLMTextureCoun .AddImage(&Lightmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false, 0, 1, 0, LMTextureCount) .Execute(cmdbuffer); } + +void VkTextureManager::DownloadLightmap(int arrayIndex, uint16_t* buffer) +{ + unsigned int totalSize = LMTextureSize * LMTextureSize * 4; + + auto stagingBuffer = BufferBuilder() + .Size(totalSize * sizeof(uint16_t)) + .Usage(VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_CPU_ONLY) + .DebugName("DownloadLightmap") + .Create(fb->GetDevice()); + + auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); + + PipelineBarrier() + .AddImage(Lightmap.Image.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, arrayIndex, 1) + .Execute(cmdbuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + + VkBufferImageCopy region = {}; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.baseArrayLayer = arrayIndex; + region.imageSubresource.layerCount = 1; + region.imageSubresource.mipLevel = 0; + region.imageExtent.width = LMTextureSize; + region.imageExtent.height = LMTextureSize; + region.imageExtent.depth = 1; + cmdbuffer->copyImageToBuffer(Lightmap.Image->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, stagingBuffer->buffer, 1, ®ion); + + PipelineBarrier() + .AddImage(Lightmap.Image.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, arrayIndex, 1) + .Execute(cmdbuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + + fb->GetCommands()->WaitForCommands(false); + + uint16_t* srcdata = (uint16_t*)stagingBuffer->Map(0, totalSize * sizeof(uint16_t)); + memcpy(buffer, srcdata, totalSize * sizeof(uint16_t)); + stagingBuffer->Unmap(); +} diff --git a/src/common/rendering/vulkan/textures/vk_texture.h b/src/common/rendering/vulkan/textures/vk_texture.h index f829503d9..f79163e31 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.h +++ b/src/common/rendering/vulkan/textures/vk_texture.h @@ -24,6 +24,7 @@ public: void BeginFrame(); void CreateLightmap(int newLMTextureSize, int newLMTextureCount, TArray&& newPixelData); + void DownloadLightmap(int arrayIndex, uint16_t* buffer); VkTextureImage* GetTexture(const PPTextureType& type, PPTexture* tex); VkFormat GetTextureFormat(PPTexture* texture); diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 770bd4858..c4f9f485a 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -649,6 +649,11 @@ void VulkanRenderDevice::SetSceneRenderTarget(bool useSSAO) mRenderState->SetRenderTarget(&GetBuffers()->SceneColor, GetBuffers()->SceneDepthStencil.View.get(), GetBuffers()->GetWidth(), GetBuffers()->GetHeight(), VK_FORMAT_R16G16B16A16_SFLOAT, GetBuffers()->GetSceneSamples()); } +void VulkanRenderDevice::DownloadLightmap(int arrayIndex, uint16_t* buffer) +{ + mTextureManager->DownloadLightmap(arrayIndex, buffer); +} + int VulkanRenderDevice::GetBindlessTextureIndex(FMaterial* material, int clampmode, int translation) { FMaterialState materialState; diff --git a/src/common/rendering/vulkan/vk_renderdevice.h b/src/common/rendering/vulkan/vk_renderdevice.h index a4d9559bb..df2868c07 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.h +++ b/src/common/rendering/vulkan/vk_renderdevice.h @@ -94,6 +94,7 @@ public: int GetBindlessTextureIndex(FMaterial* material, int clampmode, int translation) override; int GetLevelMeshPipelineID(const MeshApplyData& applyData, const SurfaceUniforms& surfaceUniforms, const FMaterialState& material) override; + void DownloadLightmap(int arrayIndex, uint16_t* buffer) override; const VkPipelineKey& GetLevelMeshPipelineKey(int id) const; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index f33f56ff5..fbc70832b 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -94,6 +94,20 @@ CCMD(invalidatelightmap) Printf("Marked %d out of %d tiles for update.\n", count, level.levelMesh->LightmapTiles.Size()); } +CCMD(savelightmap) +{ + if (!RequireLightmap()) return; + + level.levelMesh->SaveLightmapLump(level); +} + +CCMD(deletelightmap) +{ + if (!RequireLightmap()) return; + + level.levelMesh->DeleteLightmapLump(level); +} + void DoomLevelMesh::PrintSurfaceInfo(const LevelMeshSurface* surface) { if (!RequireLevelMesh()) return; @@ -1769,3 +1783,405 @@ void DoomLevelMesh::CreatePortals(FLevelLocals& doomMap) } } } + +class LumpWriter +{ +public: + LumpWriter(size_t size) { buffer.Reserve(size); } + + void Write(const void* data, size_t size) + { + if (pos + size > buffer.size() || size > 0xffffffff) + I_FatalError("LumpWriter ran out of space!"); + memcpy(buffer.data() + pos, data, size); + pos += size; + } + + void Write8(const uint8_t val) { Write(&val, sizeof(uint8_t)); } + void Write16(const short val) { Write(&val, sizeof(uint16_t)); } + void Write32(const int val) { Write(&val, sizeof(uint32_t)); } + void WriteFloat(const float val) { Write(&val, sizeof(float)); } + + TArray DeflateCompress() + { + TArray output; + + enum { BUFFER_SIZE = 8192 }; + uint8_t Buffer[BUFFER_SIZE]; + + mz_stream Stream = {}; + int err = deflateInit(&Stream, 9); + if (err != Z_OK) + I_FatalError("Could not initialize deflate buffer."); + + Stream.next_out = Buffer; + Stream.avail_out = BUFFER_SIZE; + Stream.next_in = buffer.data(); + Stream.avail_in = buffer.size(); + err = mz_deflate(&Stream, 0); + while (Stream.avail_out == 0 && err == Z_OK) + { + AddBytes(output, Buffer, BUFFER_SIZE); + + Stream.next_out = Buffer; + Stream.avail_out = BUFFER_SIZE; + if (Stream.avail_in != 0) + { + err = mz_deflate(&Stream, 0); + } + } + if (err != Z_OK) + I_FatalError("Error deflating data."); + + while (true) + { + err = mz_deflate(&Stream, Z_FINISH); + if (err != Z_OK) + { + break; + } + if (Stream.avail_out == 0) + { + AddBytes(output, Buffer, BUFFER_SIZE); + Stream.next_out = Buffer; + Stream.avail_out = BUFFER_SIZE; + } + } + mz_deflateEnd(&Stream); + AddBytes(output, Buffer, BUFFER_SIZE - Stream.avail_out); + + return output; + } + +private: + static void AddBytes(TArray& output, const void* data, size_t size) + { + int index = output.Reserve(size); + memcpy(&output[index], data, size); + } + + size_t pos = 0; + TArray buffer; +}; + +class MapLump +{ +public: + FString Name; + TArray Data; +}; + +TArray LoadMapLumps(FileReader* reader, const char* wadType) +{ + char magic[4] = {}; + uint32_t numlumps = 0; + uint32_t infotableofs = 0; + if (reader->Read(magic, 4) != 4) return {}; + if (memcmp(magic, wadType, 4) != 0) return {}; + if (reader->Read(&numlumps, 4) != 4) return {}; + if (reader->Read(&infotableofs, 4) != 4) return {}; + if (reader->Seek(infotableofs, FileReader::SeekSet) == -1) return {}; + + TArray lumps; + TArray offsets; + lumps.Reserve(numlumps); + offsets.Reserve(numlumps); + + for (uint32_t i = 0; i < numlumps; i++) + { + uint32_t filepos = 0, lumpsize = 0; + char name[9] = {}; + if (reader->Read(&filepos, 4) != 4) return {}; + if (reader->Read(&lumpsize, 4) != 4) return {}; + if (reader->Read(name, 8) != 8) return {}; + + offsets[i] = filepos; + lumps[i].Name = name; + lumps[i].Data.Reserve(lumpsize); + } + + for (uint32_t i = 0; i < numlumps; i++) + { + if (reader->Seek(offsets[i], FileReader::SeekSet) == -1) return {}; + if (reader->Read(lumps[i].Data.data(), lumps[i].Data.size()) != lumps[i].Data.size()) return {}; + } + + return lumps; +} + +void SaveMapLumps(FileWriter* writer, const TArray& lumps, const char* wadType) +{ + uint32_t numlumps = (uint32_t)lumps.size(); + uint32_t infotableofs = 12; + for (uint32_t i = 0; i < numlumps; i++) + infotableofs += lumps[i].Data.size(); + + writer->Write(wadType, 4); + writer->Write(&numlumps, 4); + writer->Write(&infotableofs, 4); + + TArray offsets; + offsets.Reserve(numlumps); + + uint32_t pos = 12; + for (uint32_t i = 0; i < numlumps; i++) + { + offsets[i] = pos; + writer->Write(lumps[i].Data.data(), lumps[i].Data.size()); + pos += lumps[i].Data.size(); + } + + for (uint32_t i = 0; i < numlumps; i++) + { + uint32_t filepos = offsets[i]; + uint32_t lumpsize = lumps[i].Data.size(); + char name[8] = {}; + memcpy(name, lumps[i].Name.GetChars(), lumps[i].Name.Len()); + writer->Write(&filepos, 4); + writer->Write(&lumpsize, 4); + writer->Write(name, 8); + } +} + +void DoomLevelMesh::SaveLightmapLump(FLevelLocals& doomMap) +{ + /* + // LIGHTMAP V3 pseudo-C specification: + + struct LightmapLump + { + int version = 2; + uint32_t tileCount; + uint32_t pixelCount; + uint32_t uvCount; + SurfaceEntry surfaces[surfaceCount]; + uint16_t pixels[pixelCount * 3]; + }; + + struct TileEntry + { + uint32_t type, typeIndex; + uint32_t controlSector; // 0xFFFFFFFF is none + uint16_t width, height; // in pixels + uint32_t pixelsOffset; // offset in pixels array + vec3 translateWorldToLocal; + vec3 projLocalToU; + vec3 projLocalToV; + }; + */ + + LMTextureData.Resize(LMTextureSize * LMTextureSize * LMTextureCount * 4); + for (int arrayIndex = 0; arrayIndex < LMTextureCount; arrayIndex++) + { + screen->DownloadLightmap(arrayIndex, LMTextureData.Data() + arrayIndex * LMTextureSize * LMTextureSize * 4); + } + + // Calculate size of lump + uint32_t tileCount = 0; + uint32_t pixelCount = 0; + + for (unsigned int i = 0; i < LightmapTiles.Size(); i++) + { + LightmapTile* tile = &LightmapTiles[i]; + if (tile->AtlasLocation.ArrayIndex != -1) + { + tileCount++; + pixelCount += tile->AtlasLocation.Area(); + } + } + + const int version = 3; + + const uint32_t headerSize = sizeof(int) + 2 * sizeof(uint32_t); + const uint32_t bytesPerTileEntry = sizeof(uint32_t) * 4 + sizeof(uint16_t) * 2 + sizeof(float) * 9; + const uint32_t bytesPerPixel = sizeof(uint16_t) * 3; // F16 RGB + + uint32_t lumpSize = headerSize + tileCount * bytesPerTileEntry + pixelCount * bytesPerPixel; + + LumpWriter lumpFile(lumpSize); + + // Write header + lumpFile.Write32(version); + lumpFile.Write32(tileCount); + lumpFile.Write32(pixelCount); + + // Write tiles + uint32_t pixelsOffset = 0; + + for (unsigned int i = 0; i < LightmapTiles.Size(); i++) + { + LightmapTile* tile = &LightmapTiles[i]; + + if (tile->AtlasLocation.ArrayIndex == -1) + continue; + + lumpFile.Write32(tile->Binding.Type); + lumpFile.Write32(tile->Binding.TypeIndex); + lumpFile.Write32(tile->Binding.ControlSector); + + lumpFile.Write16(uint16_t(tile->AtlasLocation.Width)); + lumpFile.Write16(uint16_t(tile->AtlasLocation.Height)); + + lumpFile.Write32(pixelsOffset * 3); + + lumpFile.WriteFloat(tile->Transform.TranslateWorldToLocal.X); + lumpFile.WriteFloat(tile->Transform.TranslateWorldToLocal.Y); + lumpFile.WriteFloat(tile->Transform.TranslateWorldToLocal.Z); + + lumpFile.WriteFloat(tile->Transform.ProjLocalToU.X); + lumpFile.WriteFloat(tile->Transform.ProjLocalToU.Y); + lumpFile.WriteFloat(tile->Transform.ProjLocalToU.Z); + + lumpFile.WriteFloat(tile->Transform.ProjLocalToV.X); + lumpFile.WriteFloat(tile->Transform.ProjLocalToV.Y); + lumpFile.WriteFloat(tile->Transform.ProjLocalToV.Z); + + pixelsOffset += tile->AtlasLocation.Area(); + } + + // Write surface pixels + for (unsigned int i = 0; i < LightmapTiles.Size(); i++) + { + LightmapTile* tile = &LightmapTiles[i]; + + if (tile->AtlasLocation.ArrayIndex == -1) + continue; + + const uint16_t* pixels = LMTextureData.Data() + tile->AtlasLocation.ArrayIndex * LMTextureSize * LMTextureSize * 4; + int width = tile->AtlasLocation.Width; + int height = tile->AtlasLocation.Height; + for (int y = 0; y < height; y++) + { + const uint16_t* srcline = pixels + (tile->AtlasLocation.X + (tile->AtlasLocation.Y + y) * LMTextureSize) * 4; + for (int x = 0; x < width; x++) + { + lumpFile.Write16(*(srcline++)); + lumpFile.Write16(*(srcline++)); + lumpFile.Write16(*(srcline++)); + srcline++; + } + } + } + + FString fullpath = GetMapFilename(doomMap); + if (fullpath.Len() == 0) + return; + + Printf("Saving LIGHTMAP lump into %s\n", fullpath.GetChars()); + + FileReader reader; + if (!reader.OpenFile(fullpath.GetChars())) + { + I_Error("Could not open map WAD file"); + return; + } + + TArray lumps = LoadMapLumps(&reader, "PWAD"); + if (lumps.Size() == 0) + { + I_Error("Could not read map WAD file"); + return; + } + + reader.Close(); + + int lightmapIndex = -1; + int endmapIndex = lumps.size(); + FString strLightmap = "LIGHTMAP"; + FString strEndmap = "ENDMAP"; + for (int i = 0, count = lumps.size(); i < count; i++) + { + if (lumps[i].Name == strLightmap) + lightmapIndex = i; + else if (lumps[i].Name == strEndmap) + endmapIndex = i; + } + + if (lightmapIndex != -1) + lumps[lightmapIndex].Data = lumpFile.DeflateCompress(); + else + lumps.Insert(endmapIndex, { "LIGHTMAP", lumpFile.DeflateCompress()}); + + std::unique_ptr writer(FileWriter::Open(fullpath.GetChars())); + if (writer) + { + SaveMapLumps(writer.get(), lumps, "PWAD"); + } + else + { + I_Error("Could not write map WAD file"); + } +} + +void DoomLevelMesh::DeleteLightmapLump(FLevelLocals& doomMap) +{ + FString fullpath = GetMapFilename(doomMap); + if (fullpath.Len() == 0) + return; + + Printf("Deleting LIGHTMAP lump into %s\n", fullpath.GetChars()); + + FileReader reader; + if (!reader.OpenFile(fullpath.GetChars())) + { + I_Error("Could not open map WAD file"); + return; + } + + TArray lumps = LoadMapLumps(&reader, "PWAD"); + if (lumps.Size() == 0) + { + I_Error("Could not read map WAD file"); + return; + } + reader.Close(); + + int lightmapIndex = -1; + FString strLightmap = "LIGHTMAP"; + for (int i = 0, count = lumps.size(); i < count; i++) + { + if (lumps[i].Name == strLightmap) + lightmapIndex = i; + } + + if (lightmapIndex == -1) + return; + + lumps.Delete(lightmapIndex); + + std::unique_ptr writer(FileWriter::Open(fullpath.GetChars())); + if (writer) + { + SaveMapLumps(writer.get(), lumps, "PWAD"); + } + else + { + I_Error("Could not write map WAD file"); + } +} + +FString DoomLevelMesh::GetMapFilename(FLevelLocals& doomMap) +{ + const char* mapname = doomMap.MapName.GetChars(); + + FString fmt; + fmt.Format("maps/%s.wad", mapname); + int lump_wad = fileSystem.CheckNumForFullName(fmt.GetChars()); + if (lump_wad == -1) + { + I_Error("Could not find map lump"); + return {}; + } + + int wadnum = fileSystem.GetFileContainer(lump_wad); + if (wadnum == -1) + { + I_Error("Could not find map folder"); + return {}; + } + + FString filename = fileSystem.GetFileFullName(lump_wad); + FString folder = fileSystem.GetResourceFileFullName(wadnum); + FString fullpath = folder + filename; + return fullpath; +} diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 8866f5dd2..b1271fa10 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -109,6 +109,10 @@ public: void CreateLights(FLevelLocals& doomMap); + void SaveLightmapLump(FLevelLocals& doomMap); + void DeleteLightmapLump(FLevelLocals& doomMap); + static FString GetMapFilename(FLevelLocals& doomMap); + void FloorHeightChanged(sector_t* sector) override; void CeilingHeightChanged(sector_t* sector) override; void MidTex3DHeightChanged(sector_t* sector) override; From a5099699e8a82758ab3bd05c3c41f7e81344bc9d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 30 Sep 2024 19:49:23 +0200 Subject: [PATCH 315/414] Extract the call stack from the minidump file and display the call stack if PDB files are available --- src/common/platform/posix/cocoa/i_system.mm | 3 + src/common/platform/posix/sdl/i_system.cpp | 3 + src/common/platform/win32/i_crash.cpp | 123 ++++++++++++++++++++ src/common/platform/win32/i_system.h | 2 + src/d_main.cpp | 12 +- 5 files changed, 140 insertions(+), 3 deletions(-) diff --git a/src/common/platform/posix/cocoa/i_system.mm b/src/common/platform/posix/cocoa/i_system.mm index 267bac31d..d4c28624c 100644 --- a/src/common/platform/posix/cocoa/i_system.mm +++ b/src/common/platform/posix/cocoa/i_system.mm @@ -195,3 +195,6 @@ void I_OpenShellFolder(const char* folder) [filemgr changeCurrentDirectoryPath:currentpath]; } +void I_AddMinidumpCallstack(const FString& minidumpFilename, FString& text, FString& logText) +{ +} diff --git a/src/common/platform/posix/sdl/i_system.cpp b/src/common/platform/posix/sdl/i_system.cpp index 2c28368b0..3f2dd6a8c 100644 --- a/src/common/platform/posix/sdl/i_system.cpp +++ b/src/common/platform/posix/sdl/i_system.cpp @@ -388,3 +388,6 @@ void I_OpenShellFolder(const char* infolder) free(curdir); } +void I_AddMinidumpCallstack(const FString& minidumpFilename, FString& text, FString& logText) +{ +} diff --git a/src/common/platform/win32/i_crash.cpp b/src/common/platform/win32/i_crash.cpp index e8f77cc76..2cca66e96 100644 --- a/src/common/platform/win32/i_crash.cpp +++ b/src/common/platform/win32/i_crash.cpp @@ -30,6 +30,9 @@ #ifdef _MSC_VER #include #include +#include + +#pragma comment(lib, "dbgeng.lib") class CrashReporter { @@ -404,3 +407,123 @@ const BYTE CrashReporter::patch_bytes[5] = { 0x33, 0xC0, 0xC2, 0x04, 0x00 }; #endif #endif + +template +class DbgPtr +{ +public: + DbgPtr() { Ptr = nullptr; } + DbgPtr(const DbgPtr& other) { Ptr = other.Ptr; if (Ptr) Ptr->AddRef(); } + DbgPtr(DbgPtr&& move) { Ptr = move.Ptr; move.Ptr = nullptr; } + ~DbgPtr() { reset(); } + + void reset() { if (Ptr) Ptr->Release(); Ptr = nullptr; } + T* get() { return Ptr; } + + static IID GetIID() { return __uuidof(T); } + + void** InitPtr() { return (void**)TypedInitPtr(); } + T** TypedInitPtr() { reset(); return &Ptr; } + + DbgPtr& operator=(const DbgPtr& other) + { + if (this != &other) + { + if (Ptr) + Ptr->Release(); + Ptr = other.Ptr; + if (Ptr) + Ptr->AddRef(); + } + return *this; + } + + operator T* () const { return Ptr; } + T* operator ->() const { return Ptr; } + + T* Ptr; +}; + +void I_AddMinidumpCallstack(const FString& minidumpFilename, FString& text, FString& logText) +{ + DbgPtr client; + HRESULT result = DebugCreate(client.GetIID(), client.InitPtr()); + if (FAILED(result)) + return; + + DbgPtr control; + result = client->QueryInterface(control.GetIID(), control.InitPtr()); + if (FAILED(result)) + return; + + DbgPtr symbols; + result = client->QueryInterface(symbols.GetIID(), symbols.InitPtr()); + if (FAILED(result)) + return; + + result = client->OpenDumpFileWide(minidumpFilename.WideString().c_str(), 0); + if (FAILED(result)) + return; + + result = control->WaitForEvent(0, INFINITE); + if (FAILED(result)) + return; + + ULONG eventType, processId = 0, threadId = 0, descriptionSize = 0; + char descriptionText[1024] = {}; + result = control->GetLastEventInformation(&eventType, &processId, &threadId, nullptr, 0, nullptr, descriptionText, 1024, &descriptionSize); + if (SUCCEEDED(result) && descriptionSize > 0) + { + std::string description(descriptionText, descriptionSize - 1); + text = description; + logText.AppendFormat("\n%s\n", description.c_str()); + } + + DEBUG_STACK_FRAME frames[20] = {}; + ULONG filled = 0; + result = control->GetStackTrace(0, 0, 0, frames, 20, &filled); + if (FAILED(result)) + return; + + for (ULONG i = 0; i < filled; i++) + { + char nameBuffer[1024] = {}; + ULONG nameSize = 0; + ULONG64 displacement = 0; + result = symbols->GetNameByOffset(frames[i].InstructionOffset, nameBuffer, 1024, &nameSize, &displacement); + if (SUCCEEDED(result) && nameSize > 0) + { + std::string name(nameBuffer, nameSize - 1); + std::string module; + size_t moduleend = name.find('!'); + if (moduleend != std::string::npos) + { + module = name.substr(0, moduleend); + name = name.substr(moduleend + 1); + } + + ULONG line = 0; + char fileBuffer[1024] = {}; + ULONG fileSize = 0; + ULONG64 displacement = 0; + result = symbols->GetLineByOffset(frames[i].InstructionOffset, &line, fileBuffer, 1024, &fileSize, &displacement); + if (SUCCEEDED(result) && fileSize > 0) + { + std::string file(fileBuffer, fileSize - 1); + size_t lastpart = file.find_last_of("/\\"); + if (lastpart != std::string::npos) + file = file.substr(lastpart + 1); + + logText.AppendFormat("Called from %s at %s, line %d\n", name.c_str(), file.c_str(), line); + } + else + { + // logText.AppendFormat("Called from %s in module %s\n", name.c_str(), module.c_str()); + } + } + else + { + // logText.AppendFormat("Called from %d\n", frames[i].InstructionOffset); + } + } +} diff --git a/src/common/platform/win32/i_system.h b/src/common/platform/win32/i_system.h index b70efb78b..bd9e5a74f 100644 --- a/src/common/platform/win32/i_system.h +++ b/src/common/platform/win32/i_system.h @@ -84,3 +84,5 @@ FString I_GetCWD(); bool I_ChDir(const char* path); #endif + +void I_AddMinidumpCallstack(const FString& minidumpFilename, FString& text, FString& logText); diff --git a/src/d_main.cpp b/src/d_main.cpp index 8e6cf8633..4c91a2319 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -3745,6 +3745,9 @@ static int D_DoomMain_Internal (void) if (Args->CheckParm("-showcrashreport")) { + FString text; + text.Format("%s has performed an illegal operation", GAMENAME); + FString minidumpFilename = Args->GetArg(2); FString logFilename = Args->GetArg(3); @@ -3766,15 +3769,18 @@ static int D_DoomMain_Internal (void) if (fr.OpenFile(minidumpFilename.GetChars())) { minidump.resize(fr.GetLength()); - if (fr.Read(minidump.data(), minidump.size()) != (FileReader::Size)minidump.size()) + if (fr.Read(minidump.data(), minidump.size()) == (FileReader::Size)minidump.size()) + { + fr.Close(); + I_AddMinidumpCallstack(minidumpFilename, text, logText); + } + else { minidump.clear(); } } } - FString text; - text.Format("%s fatally crashed!", GAMENAME); ErrorWindow::ExecModal(text.GetChars(), logText.GetChars(), std::move(minidump)); // Crash reporter only uses -showcrashreport on Windows at the moment and there seems to be no abstraction available From 4d934ab310e4ab68bdff52666fb823e6007793e3 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 30 Sep 2024 20:13:50 +0200 Subject: [PATCH 316/414] Add missing declaration on posix systems --- src/common/platform/posix/i_system.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/platform/posix/i_system.h b/src/common/platform/posix/i_system.h index 4d800d53b..e9e3f2a97 100644 --- a/src/common/platform/posix/i_system.h +++ b/src/common/platform/posix/i_system.h @@ -74,3 +74,5 @@ bool I_ChDir(const char* path); void I_OpenShellFolder(const char*); #endif + +void I_AddMinidumpCallstack(const FString& minidumpFilename, FString& text, FString& logText); From c64b5bb2cb6a857f0b9b6b0547ac470dcd7ec30e Mon Sep 17 00:00:00 2001 From: dpjudas Date: Tue, 1 Oct 2024 01:01:46 +0200 Subject: [PATCH 317/414] Fix ccmd message --- src/rendering/hwrenderer/doom_levelmesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index fbc70832b..f988ebefa 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -2119,7 +2119,7 @@ void DoomLevelMesh::DeleteLightmapLump(FLevelLocals& doomMap) if (fullpath.Len() == 0) return; - Printf("Deleting LIGHTMAP lump into %s\n", fullpath.GetChars()); + Printf("Deleting LIGHTMAP lump from %s\n", fullpath.GetChars()); FileReader reader; if (!reader.OpenFile(fullpath.GetChars())) From 2c9b8f4eec82e32b0b7771048b3027e213fe5c5e Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Tue, 1 Oct 2024 17:17:48 +0300 Subject: [PATCH 318/414] Fixed problem in CheckForShadows(). Fixed a regression in CheckForShadows() that made it always return a +SHADOW or +SHADOWBLOCK actor even when there were none. Causing monsters to always have messy aim if +DOSHADOWBLOCK is on. --- src/playsim/shadowinlines.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/playsim/shadowinlines.h b/src/playsim/shadowinlines.h index 574abd251..b36b051ac 100644 --- a/src/playsim/shadowinlines.h +++ b/src/playsim/shadowinlines.h @@ -88,6 +88,7 @@ inline AActor* CheckForShadows(AActor* self, AActor* other, DVector3 pos, double if ((other && (other->flags & MF_SHADOW)) || (self->flags9 & MF9_DOSHADOWBLOCK)) { AActor* shadowBlock = P_CheckForShadowBlock(self, other, pos, penaltyFactor); + if (other && !(other->flags & MF_SHADOW)) other = nullptr; //Other doesn't have MF_SHADOW, so don't count them as a valid return. return shadowBlock ? shadowBlock : other; } return nullptr; From e88d912892646e8048131fd2d3555a6b87d1f5b9 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 15 Aug 2024 23:32:54 +0600 Subject: [PATCH 319/414] ID24 interlevel lumps implementation --- src/common/audio/music/music.cpp | 18 + src/common/audio/music/s_music.h | 3 + src/common/engine/serializer.cpp | 27 +- src/common/engine/serializer.h | 2 + src/gamedata/g_mapinfo.cpp | 49 ++ src/gamedata/g_mapinfo.h | 7 +- src/gamedata/umapinfo.cpp | 12 + src/wi_stuff.cpp | 548 ++++++++++++++++-- .../zscript/ui/statscreen/statscreen.zs | 4 +- 9 files changed, 605 insertions(+), 65 deletions(-) diff --git a/src/common/audio/music/music.cpp b/src/common/audio/music/music.cpp index 13837e93e..01b3a5da3 100644 --- a/src/common/audio/music/music.cpp +++ b/src/common/audio/music/music.cpp @@ -130,6 +130,24 @@ static FileReader OpenMusic(const char* musicname) return reader; } +bool MusicExists(const char* music_name) +{ + if (music_name == nullptr) + return false; + + if (FileExists(music_name)) + return true; + else + { + int lumpnum; + lumpnum = mus_cb.FindMusic(music_name); + if (lumpnum == -1) lumpnum = fileSystem.CheckNumForName(music_name, FileSys::ns_music); + if (lumpnum != -1 && fileSystem.FileLength(lumpnum) != 0) + return true; + } + return false; +} + void S_SetMusicCallbacks(MusicCallbacks* cb) { mus_cb = *cb; diff --git a/src/common/audio/music/s_music.h b/src/common/audio/music/s_music.h index cddfd36d6..629f6f95d 100644 --- a/src/common/audio/music/s_music.h +++ b/src/common/audio/music/s_music.h @@ -45,6 +45,9 @@ bool S_StartMusic (const char *music_name); // Start music using , and set whether looping bool S_ChangeMusic (const char *music_name, int order=0, bool looping=true, bool force=false); +// Check if exists +bool MusicExists(const char* music_name); + void S_RestartMusic (); void S_MIDIDeviceChanged(int newdev); diff --git a/src/common/engine/serializer.cpp b/src/common/engine/serializer.cpp index dcf930842..97ded1adf 100644 --- a/src/common/engine/serializer.cpp +++ b/src/common/engine/serializer.cpp @@ -197,7 +197,10 @@ void FSerializer::Close() } if (mErrors > 0) { - I_Error("%d errors parsing JSON", mErrors); + if (mLumpName.IsNotEmpty()) + I_Error("%d errors parsing JSON lump %s", mErrors, mLumpName.GetChars()); + else + I_Error("%d errors parsing JSON", mErrors); } } @@ -331,6 +334,28 @@ bool FSerializer::HasObject(const char* name) // //========================================================================== +bool FSerializer::IsKeyNull(const char* name) +{ + if (isReading()) + { + auto val = r->FindKey(name); + if (val != nullptr) + { + if (val->IsNull()) + { + return true; + } + } + } + return false; +} + +//========================================================================== +// +// +// +//========================================================================== + void FSerializer::EndObject() { if (isWriting()) diff --git a/src/common/engine/serializer.h b/src/common/engine/serializer.h index 99ffb72dc..40b6ab706 100644 --- a/src/common/engine/serializer.h +++ b/src/common/engine/serializer.h @@ -94,6 +94,7 @@ public: void EndObject(); bool HasKey(const char* name); bool HasObject(const char* name); + bool IsKeyNull(const char* name); bool BeginArray(const char *name); void EndArray(); unsigned GetSize(const char *group); @@ -225,6 +226,7 @@ public: int mErrors = 0; int mObjectErrors = 0; + FString mLumpName; }; FSerializer& Serialize(FSerializer& arc, const char* key, char& value, char* defval); diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 3d9bc8bd9..6cd4fdcdf 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -164,6 +164,20 @@ bool CheckWarpTransMap (FString &mapname, bool substitute) // //========================================================================== +bool SecretLevelVisited() +{ + for (unsigned int i = 0; i < wadlevelinfos.Size(); i++) + if ((wadlevelinfos[i].flags3 & LEVEL3_SECRET) && (wadlevelinfos[i].flags & LEVEL_VISITED)) + return true; + + return false; +} + +//========================================================================== +// +// +//========================================================================== + static int FindWadClusterInfo (int cluster) { for (unsigned int i = 0; i < wadclusterinfos.Size(); i++) @@ -280,6 +294,8 @@ void level_info_t::Reset() RedirectCVARMapName = ""; EnterPic = ""; ExitPic = ""; + EnterAnim = ""; + ExitAnim = ""; Intermission = NAME_None; deathsequence = NAME_None; slideshow = NAME_None; @@ -1256,6 +1272,20 @@ DEFINE_MAP_OPTION(enterpic, true) info->EnterPic = parse.sc.String; } +DEFINE_MAP_OPTION(exitanim, true) +{ + parse.ParseAssign(); + parse.sc.MustGetString(); + info->ExitAnim = parse.sc.String; +} + +DEFINE_MAP_OPTION(enteranim, true) +{ + parse.ParseAssign(); + parse.sc.MustGetString(); + info->EnterAnim = parse.sc.String; +} + DEFINE_MAP_OPTION(specialaction, true) { parse.ParseAssign(); @@ -2601,6 +2631,7 @@ void G_ParseMapInfo (FString basemapinfo) { int lump, lastlump = 0; level_info_t gamedefaults; + TArray secretMaps; int flags1 = 0, flags2 = 0; if (gameinfo.gametype == GAME_Doom) @@ -2717,5 +2748,23 @@ void G_ParseMapInfo (FString basemapinfo) { I_FatalError ("You cannot use clearskills in a MAPINFO if you do not define any new skills after it."); } + + // Find any and all secret maps. + for (unsigned int i = 0; i < wadlevelinfos.Size(); i++) + { + if (wadlevelinfos[i].NextSecretMap.IsNotEmpty() && wadlevelinfos[i].NextSecretMap != wadlevelinfos[i].NextMap) + { + secretMaps.Push(wadlevelinfos[i].NextSecretMap); + } + } + // ...and then mark them all as secret maps. + for (unsigned int i = 0; i < secretMaps.Size(); i++) + { + auto* li = FindLevelInfo(secretMaps[i].GetChars(), false); + if (li) + { + li->flags3 |= LEVEL3_SECRET; + } + } } diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index 8f311f6a2..b07e6e442 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -269,8 +269,9 @@ enum ELevelFlags : unsigned int LEVEL3_NOSHADOWMAP = 0x00010000, // disables shadowmaps for a given level. LEVEL3_AVOIDMELEE = 0x00020000, // global flag needed for proper MBF support. LEVEL3_NOJUMPDOWN = 0x00040000, // only for MBF21. Inverse of MBF's dog_jumping flag. - LEVEL3_LIGHTCREATED = 0x00080000, // a light had been created in the last frame + LEVEL3_LIGHTCREATED = 0x00080000, // a light had been created in the last frame LEVEL3_NOFOGOFWAR = 0x00100000, // disables effect of r_radarclipper CVAR on this map + LEVEL3_SECRET = 0x00200000, // level is a secret level }; @@ -389,6 +390,8 @@ struct level_info_t FString EnterPic; FString ExitPic; + FString EnterAnim; + FString ExitAnim; FString InterMusic; int intermusicorder; TMap > MapInterMusic; @@ -488,6 +491,8 @@ level_info_t *FindLevelInfo (const char *mapname, bool allowdefault=true); level_info_t *FindLevelByNum (int num); level_info_t *CheckLevelRedirect (level_info_t *info); +bool SecretLevelVisited(); + FString CalcMapName (int episode, int level); void G_ClearMapinfo(); diff --git a/src/gamedata/umapinfo.cpp b/src/gamedata/umapinfo.cpp index 08e16d9f8..50757e734 100644 --- a/src/gamedata/umapinfo.cpp +++ b/src/gamedata/umapinfo.cpp @@ -52,6 +52,8 @@ struct UMapEntry char endpic[9] = ""; char exitpic[9] = ""; char enterpic[9] = ""; + char exitanim[9] = ""; + char enteranim[9] = ""; char interbackdrop[9] = "FLOOR4_8"; char intermusic[9] = ""; int partime = 0; @@ -186,6 +188,14 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) { ParseLumpName(scanner, mape->enterpic); } + else if (!pname.CompareNoCase("exitanim")) + { + ParseLumpName(scanner, mape->exitanim); + } + else if (!pname.CompareNoCase("enteranim")) + { + ParseLumpName(scanner, mape->enteranim); + } else if (!pname.CompareNoCase("nointermission")) { scanner.MustGetBoolToken(); @@ -443,6 +453,8 @@ void CommitUMapinfo(level_info_t *defaultinfo) if (map.partime > 0) levelinfo->partime = map.partime; if (map.enterpic[0]) levelinfo->EnterPic = map.enterpic; if (map.exitpic[0]) levelinfo->ExitPic = map.exitpic; + if (map.enteranim[0]) levelinfo->EnterAnim = map.enteranim; + if (map.exitanim[0]) levelinfo->ExitAnim = map.exitanim; /* UMAPINFO's intermusic is for the text screen, not the summary. if (map.intermusic[0]) { diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index dddc37c31..8a5c7945c 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -57,6 +57,9 @@ #include "texturemanager.h" #include "v_draw.h" +#include "serializer.h" +#include "s_music.h" + CVAR(Bool, wi_percents, true, CVAR_ARCHIVE) CVAR(Bool, wi_showtotaltime, true, CVAR_ARCHIVE) CVAR(Bool, wi_noautostartmap, false, CVAR_USERINFO | CVAR_ARCHIVE) @@ -109,6 +112,8 @@ class DInterBackground : public DObject { ANIM_ALWAYS, // determined by patch entry ANIM_PIC, // continuous + ANIM_FRAME, // determined by frame properties + ANIM_NONE, // frozen (used for infinite duration frames) // condition bitflags ANIM_IFVISITED = 8, @@ -137,13 +142,41 @@ class DInterBackground : public DObject FString Level; }; + struct frame_t + { + FTextureID image; + uint32_t type; + // In tics! + int duration; + int max_duration; + }; + + enum ECondition + { + COND_NONE = 0, // None. + COND_GREATER = 1, // Parameter is greater than current map number. + COND_EQUAL = 2, // Parameter is equal to current map number. + COND_VISITED = 3, // Map number corresponding to parameter is visited. + COND_NOTSECRET = 4, // Current map is not a secret one. + COND_SECRETVISTED = 5, // Any secret map was visited. + COND_TALLY = 6, // Tally screen. + COND_ENTERING = 7, // "Entering" screen. + }; + + struct condition_t + { + ECondition condition; + int param; + }; + struct in_anim_t { int type; // Made an int so I can use '|' int period; // period in tics between animations yahpt_t loc; // location of animation int data; // ALWAYS: n/a, RANDOM: period deviation (<256) - TArray frames; // actual graphics for frames of animations + TArray frames; // actual graphics for frames of animations + TArray conditions; // conditions to display the animation // following must be initialized to zero before use! int nexttic; // next value of bcnt (used in conjunction with period) @@ -162,9 +195,15 @@ class DInterBackground : public DObject } }; + struct in_layer_t + { + TArray anims; + TArray conditions; // conditions to display the animations. + }; + private: TArray lnodes; - TArray anims; + TArray layers; int bcnt = 0; // used for timing of background animation TArray yah; // You Are Here graphic FTextureID splat{}; // splat @@ -174,12 +213,14 @@ private: int bgwidth = -1; int bgheight = -1; bool tilebackground = false; + FString muslump; public: DInterBackground(wbstartstruct_t *wbst); bool LoadBackground(bool isenterpic); + bool IsUsingMusic(); void updateAnimatedBack(); void drawBackground(int state, bool drawsplat, bool snl_pointeron); @@ -242,6 +283,70 @@ private: } } } + + //==================================================================== + // + // Draws the splats and the 'You are here' arrows + // + //==================================================================== + bool ConditionsMet(int state, TArray& conditions) + { + for (auto& condition : conditions) + { + switch (condition.condition) + { + case ECondition::COND_NONE: + break; + case ECondition::COND_EQUAL: + { + auto* li = FindLevelInfo(state != StatCount ? wbs->next.GetChars() : wbs->current.GetChars()); + if (!li) + return false; + if (li->levelnum != condition.param) + return false; + break; + } + case ECondition::COND_GREATER: + { + auto* li = FindLevelInfo(state != StatCount ? wbs->next.GetChars() : wbs->current.GetChars()); + if (!li) + return false; + if (li->levelnum <= condition.param) + return false; + break; + } + case ECondition::COND_VISITED: + { + auto* li = FindLevelByNum(condition.param); + if (li == NULL || !(li->flags & LEVEL_VISITED)) + return false; + break; + } + case ECondition::COND_NOTSECRET: + { + auto* li = FindLevelInfo(state != StatCount ? wbs->next.GetChars() : wbs->current.GetChars()); + if (!li) + return false; + if (li->flags3 & LEVEL3_SECRET) + return false; + break; + } + case ECondition::COND_SECRETVISTED: + if (!SecretLevelVisited()) + return false; + break; + case ECondition::COND_TALLY: + if (state != StatCount) + return false; + break; + case ECondition::COND_ENTERING: + if (state == StatCount) + return false; + break; + } + } + return true; + } }; DInterBackground:: DInterBackground(wbstartstruct_t *wbst) @@ -270,11 +375,13 @@ bool DInterBackground::LoadBackground(bool isenterpic) { const char* lumpname = nullptr; const char* exitpic = nullptr; + const char* exitanim = nullptr; char buffer[10]; in_anim_t an; lnode_t pt; FTextureID texture; bool noautostartmap = false; + bool id24anim = false; bcnt = 0; @@ -284,8 +391,17 @@ bool DInterBackground::LoadBackground(bool isenterpic) level_info_t* li = FindLevelInfo(wbs->current.GetChars()); if (li != nullptr) { - exitpic = li->ExitPic.GetChars(); - if (li->ExitPic.IsNotEmpty()) tilebackground = false; + if (li->ExitAnim.IsNotEmpty()) + { + id24anim = true; + exitpic = li->ExitAnim.GetChars(); + tilebackground = false; + } + else + { + exitpic = li->ExitPic.GetChars(); + if (li->ExitPic.IsNotEmpty()) tilebackground = false; + } } lumpname = exitpic; @@ -294,8 +410,17 @@ bool DInterBackground::LoadBackground(bool isenterpic) level_info_t* li = FindLevelInfo(wbs->next.GetChars()); if (li != NULL) { - lumpname = li->EnterPic.GetChars(); - if (li->EnterPic.IsNotEmpty()) tilebackground = false; + if (li->EnterAnim.IsNotEmpty()) + { + id24anim = true; + lumpname = li->EnterAnim.GetChars(); + tilebackground = false; + } + else + { + lumpname = li->EnterPic.GetChars(); + if (li->EnterPic.IsNotEmpty()) tilebackground = false; + } } } @@ -382,12 +507,251 @@ bool DInterBackground::LoadBackground(bool isenterpic) } lnodes.Clear(); - anims.Clear(); + layers.Clear(); yah.Clear(); splat.SetInvalid(); + if (!id24anim) + layers.Resize(1); + if (id24anim) + { + try + { + int lumpnum = fileSystem.CheckNumForFullName(lumpname, true); + if (lumpnum == -1) + { + I_Error("Intermission animation lump %s not found!", lumpname); + } + auto data = fileSystem.ReadFile(lumpnum); + FSerializer jsonReader; + jsonReader.mLumpName = fileSystem.GetFileFullPath(lumpnum); + lumpname = jsonReader.mLumpName.GetChars(); + if (jsonReader.OpenReader(data.string(), data.size())) + { + FString type = jsonReader.GetString("type"); + if (type.Compare("interlevel")) + { + I_Error("Interlevel lump %s is not interlevel!", lumpname); + } + if (jsonReader.BeginObject("data")) + { + FString music = jsonReader.GetString("music"); + if (music.IsEmpty()) + { + I_Error("No music lump specified for intermission animation %s!", lumpname); + } + muslump = music; + if (!MusicExists(muslump.GetChars())) + { + I_Error("Music lump %s not found!", muslump.GetChars()); + } + + // Check for background lump. + FString backgroundimage = jsonReader.GetString("backgroundimage"); + texture = TexMan.CheckForTexture(backgroundimage.GetChars(), ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny); + if (!texture.isValid()) + { + if (backgroundimage.IsEmpty()) + { + I_Error("No background image specified for intermission animation %s!", lumpname); + } + else + { + I_Error("Texture %s not found!", backgroundimage.GetChars()); + } + } + + if (!jsonReader.IsKeyNull("layers") && jsonReader.BeginArray("layers")) + { + int size = jsonReader.ArraySize(); + + if (size == 0) + I_Error("Zero-length 'layers' array in %s", lumpname); + + for (int i = 0; i < size; i++) + { + if (jsonReader.BeginObject(nullptr)) + { + layers.Reserve(1); + auto& layer = layers.back(); + if (!jsonReader.IsKeyNull("conditions") && jsonReader.BeginArray("conditions")) + { + int condition_size = jsonReader.ArraySize(); + if (condition_size == 0) + { + I_Error("Condition array empty and not null for layer %d in lump %s", layers.Size(), lumpname); + } + for (int j = 0; j < condition_size; j++) + { + if (jsonReader.BeginObject(nullptr)) + { + ECondition cond = COND_NONE; + int param = 0; + ::Serialize(jsonReader, "condition", (int&)cond, nullptr); + ::Serialize(jsonReader, "param", param, nullptr); + layer.conditions.Push(condition_t{ cond, param }); + jsonReader.EndObject(); + } + } + jsonReader.EndArray(); + } + + // Read anims. + if (jsonReader.BeginArray("anims")) + { + int anim_size = jsonReader.ArraySize(); + if (anim_size == 0) + { + I_Error("No animations defined for layer %d in lump %s", layers.Size(), lumpname); + } + + for (int j = 0; j < anim_size; j++) + { + if (jsonReader.BeginObject(nullptr)) + { + layer.anims.Reserve(1); + auto& anim = layer.anims.back(); + + anim.Reset(); + anim.type = ANIM_FRAME; + anim.ctr = 0; + anim.data = 0; + + ::Serialize(jsonReader, "x", anim.loc.x, nullptr); + ::Serialize(jsonReader, "y", anim.loc.y, nullptr); + + if (!jsonReader.IsKeyNull("conditions") && jsonReader.BeginArray("conditions")) + { + int condition_size = jsonReader.ArraySize(); + if (condition_size == 0) + { + I_Error("Condition array empty and not null for anim %d, layer %d in lump %s", layer.anims.Size(), layers.Size(), lumpname); + } + for (int k = 0; k < condition_size; k++) + { + if (jsonReader.BeginObject(nullptr)) + { + ECondition cond = COND_NONE; + int param = 0; + ::Serialize(jsonReader, "condition", (int&)cond, nullptr); + ::Serialize(jsonReader, "param", param, nullptr); + anim.conditions.Push(condition_t{ cond, param }); + jsonReader.EndObject(); + } + } + jsonReader.EndArray(); + } + + if (jsonReader.BeginArray("frames")) + { + int frames = jsonReader.ArraySize(); + + if (frames == 0) + { + I_Error("No frames defined for anim %d, layer %d in lump %s", layer.anims.Size(), layers.Size(), lumpname); + } + for (int k = 0; k < frames; k++) + { + if (jsonReader.BeginObject(nullptr)) + { + double duration = 0.0; + double maxduration = 0.0; + anim.frames.Reserve(1); + auto& frame = anim.frames.back(); + + ::Serialize(jsonReader, "duration", duration, nullptr); + ::Serialize(jsonReader, "maxduration", maxduration, nullptr); + ::Serialize(jsonReader, "type", frame.type, nullptr); + + FString image = jsonReader.GetString("image"); + if (image.IsEmpty()) + { + I_Error("No image defined for frame %d, anim %d, layer %d in lump %s", anim.frames.Size(), layer.anims.Size(), layers.Size(), lumpname); + } + + frame.image = TexMan.CheckForTexture(image.GetChars(), ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny); + if (!frame.image.isValid()) + { + I_Error("Texture '%s' not found!", image.GetChars()); + } + + frame.duration = round(duration * (double)TICRATE); + frame.max_duration = round(maxduration * (double)TICRATE); + + if (frame.duration <= 0 && duration > 0.0) + { + frame.duration = 1; + } + + if (frame.max_duration <= 0 && maxduration > 0.0) + { + frame.max_duration = 1; + } + + if (anim.frames.Size() == 1) + { + if (frame.type & 0x1000) + { + frame.type &= ~0x1000; + anim.nexttic = 1 + (M_Random() % frame.duration); + } + else + { + + switch (frame.type) + { + case 0x1: + anim.type = ANIM_NONE; + break; + case 0x4: + anim.nexttic = 1 + M_Random(frame.max_duration - frame.duration + 1) + frame.duration; + break; + case 0x2: + anim.nexttic = 1 + frame.duration; + break; + } + } + } + + jsonReader.EndObject(); + } + } + jsonReader.EndArray(); + } + + jsonReader.EndObject(); + } + } + + jsonReader.EndArray(); + } + + jsonReader.EndObject(); + } + } + jsonReader.EndArray(); + } + + jsonReader.EndObject(); + } + jsonReader.Close(); + } + } + // This is deliberate. Errors coming from here shouldn't cause a console abort. + catch (CRecoverableError& error) + { + Printf(TEXTCOLOR_RED "Failed to parse intermission anim definition %s: %s.\nFalling back to non-anim definitions.\n", lumpname, error.GetMessage()); + + if (isenterpic) + li->EnterAnim = ""; + else + li->ExitAnim = ""; + + return LoadBackground(isenterpic); + } + } // a name with a starting '$' indicates an intermission script - if (*lumpname != '$') + else if (*lumpname != '$') { texture = TexMan.CheckForTexture(lumpname, ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny); } @@ -520,18 +884,20 @@ bool DInterBackground::LoadBackground(bool isenterpic) if (!sc.CheckString("{")) { sc.MustGetString(); - an.frames.Push(TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny)); + auto textureId = TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny); + an.frames.Push(frame_t{ textureId, 0, 0, 0 }); } else { while (!sc.CheckString("}")) { sc.MustGetString(); - an.frames.Push(TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny)); + auto textureId = TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny); + an.frames.Push(frame_t{ textureId, 0, 0, 0 }); } } an.ctr = -1; - anims.Push(an); + layers[0].anims.Push(an); break; case 13: // Pic @@ -542,8 +908,8 @@ bool DInterBackground::LoadBackground(bool isenterpic) an.loc.y = sc.Number; sc.MustGetString(); an.frames.Reserve(1); // allocate exactly one element - an.frames[0] = TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny); - anims.Push(an); + an.frames[0].image = TexMan.CheckForTexture(sc.String, ETextureType::MiscPatch, FTextureManager::TEXMAN_TryAny); + layers[0].anims.Push(an); break; default: @@ -554,6 +920,7 @@ bool DInterBackground::LoadBackground(bool isenterpic) } else { + Printf("Intermission script %s not found!\n", lumpname + 1); texture = TexMan.GetTextureID("INTERPIC", ETextureType::MiscPatch); } @@ -585,27 +952,59 @@ void DInterBackground::updateAnimatedBack() unsigned int i; bcnt++; - for (i = 0; itype & ANIM_TYPE) + S_ChangeMusic(muslump.GetChars()); + } + + for (auto& layer : layers) + { + auto& anims = layer.anims; + for (i = 0; i < anims.Size(); i++) { - case ANIM_ALWAYS: - if (bcnt >= a->nexttic) + in_anim_t* a = &anims[i]; + switch (a->type & ANIM_TYPE) { - if (++a->ctr >= (int)a->frames.Size()) + case ANIM_NONE: + break; + + case ANIM_FRAME: + if (bcnt >= a->nexttic) { - if (a->data == 0) a->ctr = 0; - else a->ctr--; + if (++a->ctr >= (int)a->frames.Size()) + a->ctr = 0; + + switch (a->frames[a->ctr].type & 0x7) { + case 0x1: + a->type &= ANIM_CONDITION; + a->type = ANIM_NONE; + break; + case 0x4: + a->nexttic = bcnt + M_Random(a->frames[a->ctr].max_duration - a->frames[a->ctr].duration + 1) + a->frames[a->ctr].duration; + break; + case 0x2: + a->nexttic = bcnt + a->frames[a->ctr].duration; + break; + } } - a->nexttic = bcnt + a->period; + break; + case ANIM_ALWAYS: + if (bcnt >= a->nexttic) + { + if (++a->ctr >= (int)a->frames.Size()) + { + if (a->data == 0) a->ctr = 0; + else a->ctr--; + } + a->nexttic = bcnt + a->period; + } + break; + + case ANIM_PIC: + a->ctr = 0; + break; + } - break; - - case ANIM_PIC: - a->ctr = 0; - break; - } } } @@ -656,51 +1055,59 @@ void DInterBackground::drawBackground(int state, bool drawsplat, bool snl_pointe ClearRect(twod, 0, 0, twod->GetWidth(), twod->GetHeight(), 0, 0); } - for (i = 0; itype & ANIM_CONDITION) + if (!ConditionsMet(state, layer.conditions)) + continue; + + for (i = 0; i < anims.Size(); i++) { - case ANIM_IFVISITED: - li = FindLevelInfo(a->LevelName.GetChars()); - if (li == NULL || !(li->flags & LEVEL_VISITED)) continue; - break; + in_anim_t* a = &anims[i]; + level_info_t* li; - case ANIM_IFNOTVISITED: - li = FindLevelInfo(a->LevelName.GetChars()); - if (li == NULL || (li->flags & LEVEL_VISITED)) continue; - break; + switch (a->type & ANIM_CONDITION) + { + case ANIM_IFVISITED: + li = FindLevelInfo(a->LevelName.GetChars()); + if (li == NULL || !(li->flags & LEVEL_VISITED)) continue; + break; - // StatCount means 'leaving' - everything else means 'entering'! - case ANIM_IFENTERING: - if (state == StatCount || a->LevelName.CompareNoCase(wbs->next, 8)) continue; - break; + case ANIM_IFNOTVISITED: + li = FindLevelInfo(a->LevelName.GetChars()); + if (li == NULL || (li->flags & LEVEL_VISITED)) continue; + break; - case ANIM_IFNOTENTERING: - if (state != StatCount && !a->LevelName.CompareNoCase(wbs->next, 8)) continue; - break; + // StatCount means 'leaving' - everything else means 'entering'! + case ANIM_IFENTERING: + if (state == StatCount || a->LevelName.CompareNoCase(wbs->next, 8)) continue; + break; - case ANIM_IFLEAVING: - if (state != StatCount || a->LevelName.CompareNoCase(wbs->current, 8)) continue; - break; + case ANIM_IFNOTENTERING: + if (state != StatCount && !a->LevelName.CompareNoCase(wbs->next, 8)) continue; + break; - case ANIM_IFNOTLEAVING: - if (state == StatCount && !a->LevelName.CompareNoCase(wbs->current, 8)) continue; - break; + case ANIM_IFLEAVING: + if (state != StatCount || a->LevelName.CompareNoCase(wbs->current, 8)) continue; + break; - case ANIM_IFTRAVELLING: - if (a->LevelName2.CompareNoCase(wbs->current, 8) || a->LevelName.CompareNoCase(wbs->next, 8)) continue; - break; + case ANIM_IFNOTLEAVING: + if (state == StatCount && !a->LevelName.CompareNoCase(wbs->current, 8)) continue; + break; - case ANIM_IFNOTTRAVELLING: - if (!a->LevelName2.CompareNoCase(wbs->current, 8) && !a->LevelName.CompareNoCase(wbs->next, 8)) continue; - break; + case ANIM_IFTRAVELLING: + if (a->LevelName2.CompareNoCase(wbs->current, 8) || a->LevelName.CompareNoCase(wbs->next, 8)) continue; + break; + + case ANIM_IFNOTTRAVELLING: + if (!a->LevelName2.CompareNoCase(wbs->current, 8) && !a->LevelName.CompareNoCase(wbs->next, 8)) continue; + break; + } + if (a->ctr >= 0 && ConditionsMet(state, a->conditions)) + DrawTexture(twod, a->frames[a->ctr].image, false, a->loc.x, a->loc.y, + DTA_VirtualWidthF, animwidth, DTA_VirtualHeightF, animheight, DTA_FullscreenScale, FSMode_ScaleToFit43, TAG_DONE); } - if (a->ctr >= 0) - DrawTexture(twod, a->frames[a->ctr], false, a->loc.x, a->loc.y, - DTA_VirtualWidthF, animwidth, DTA_VirtualHeightF, animheight, DTA_FullscreenScale, FSMode_ScaleToFit43, TAG_DONE); } if (drawsplat) @@ -731,6 +1138,23 @@ DEFINE_ACTION_FUNCTION(DInterBackground, drawBackground) return 0; } +//==================================================================== +// +// +// +//==================================================================== + +bool DInterBackground::IsUsingMusic() +{ + return muslump.IsNotEmpty(); +} + +DEFINE_ACTION_FUNCTION(DInterBackground, IsUsingMusic) +{ + PARAM_SELF_PROLOGUE(DInterBackground); + ACTION_RETURN_BOOL(self->IsUsingMusic()); +} + IMPLEMENT_CLASS(DInterBackground, true, false) //==================================================================== diff --git a/wadsrc/static/zscript/ui/statscreen/statscreen.zs b/wadsrc/static/zscript/ui/statscreen/statscreen.zs index 4b50f0cf7..3ae9cf447 100644 --- a/wadsrc/static/zscript/ui/statscreen/statscreen.zs +++ b/wadsrc/static/zscript/ui/statscreen/statscreen.zs @@ -6,6 +6,7 @@ class InterBackground native ui version("2.5") native virtual bool LoadBackground(bool isenterpic); native virtual void updateAnimatedBack(); native virtual void drawBackground(int CurState, bool drawsplat, bool snl_pointeron); + native virtual bool IsUsingMusic(); } // This is obsolete. Hopefully this was never used... @@ -825,7 +826,8 @@ class StatusScreen : ScreenJob abstract version("2.5") virtual void StartMusic() { - Level.SetInterMusic(wbs.next); + if (!bg.IsUsingMusic()) + Level.SetInterMusic(wbs.next); } //==================================================================== From 59b567689a8cc971c43e513fc5ae5a692516b441 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 1 Oct 2024 16:38:14 +0200 Subject: [PATCH 320/414] make the broken ID24 levelnums work somehow so that Legacy of Rust's intermissions play. --- src/gamedata/g_mapinfo.cpp | 4 ++++ src/gamedata/g_mapinfo.h | 1 + src/gamedata/umapinfo.cpp | 14 ++++++++++---- src/wi_stuff.cpp | 4 ++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 6cd4fdcdf..eb65e6943 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -2401,9 +2401,13 @@ static void SetLevelNum (level_info_t *info, int num) for (unsigned int i = 0; i < wadlevelinfos.Size(); ++i) { if (wadlevelinfos[i].levelnum == num) + { wadlevelinfos[i].levelnum = 0; + wadlevelinfos[i].broken_id24_levelnum = 0; + } } info->levelnum = num; + info->broken_id24_levelnum = num; // at least make it work - somehow. } //========================================================================== diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index b07e6e442..8b2706ed0 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -324,6 +324,7 @@ struct FExitText struct level_info_t { int levelnum; + int broken_id24_levelnum; FString MapName; FString NextMap; diff --git a/src/gamedata/umapinfo.cpp b/src/gamedata/umapinfo.cpp index 50757e734..d6a2c47ee 100644 --- a/src/gamedata/umapinfo.cpp +++ b/src/gamedata/umapinfo.cpp @@ -58,6 +58,7 @@ struct UMapEntry char intermusic[9] = ""; int partime = 0; int nointermission = 0; + int id24_levelnum = 0; // note that this one's semantics are massively screwed up. Only to be used for ID24-style intermissions. }; static TArray Maps; @@ -124,7 +125,7 @@ static int ParseLumpName(FScanner &scanner, char *buffer) // // ----------------------------------------------- -static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) +static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape, int *id24_levelnum) { // find the next line with content. // this line is no property. @@ -254,6 +255,7 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) epi.mEpisodeMap = mape->MapName; epi.mPicName = split[0]; epi.mNoSkill = false; + mape->id24_levelnum = *id24_levelnum = 1; unsigned i; for (i = 0; i < AllEpisodes.Size(); i++) @@ -324,15 +326,16 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) // // ----------------------------------------------- -static int ParseMapEntry(FScanner &scanner, UMapEntry *val) +static int ParseMapEntry(FScanner &scanner, UMapEntry *val, int *id24_levelnum) { scanner.MustGetToken(TK_Identifier); val->MapName = scanner.String; + val->id24_levelnum = ++(*id24_levelnum); scanner.MustGetToken('{'); while(!scanner.CheckToken('}')) { - ParseStandardProperty(scanner, val); + ParseStandardProperty(scanner, val, id24_levelnum); } return 1; } @@ -348,12 +351,13 @@ int ParseUMapInfo(int lumpnum) FScanner scanner(lumpnum); unsigned int i; + int id24_levelnum = 1; while (scanner.GetToken()) { scanner.TokenMustBe(TK_Map); UMapEntry parsed; - ParseMapEntry(scanner, &parsed); + ParseMapEntry(scanner, &parsed, &id24_levelnum); // Endpic overrides level exits. if (parsed.endpic[0]) @@ -455,6 +459,8 @@ void CommitUMapinfo(level_info_t *defaultinfo) if (map.exitpic[0]) levelinfo->ExitPic = map.exitpic; if (map.enteranim[0]) levelinfo->EnterAnim = map.enteranim; if (map.exitanim[0]) levelinfo->ExitAnim = map.exitanim; + levelinfo->broken_id24_levelnum = map.id24_levelnum; + Printf("%s: id24 levelnum = %d\n", map.MapName, map.id24_levelnum); /* UMAPINFO's intermusic is for the text screen, not the summary. if (map.intermusic[0]) { diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index 8a5c7945c..3af0a7829 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -302,7 +302,7 @@ private: auto* li = FindLevelInfo(state != StatCount ? wbs->next.GetChars() : wbs->current.GetChars()); if (!li) return false; - if (li->levelnum != condition.param) + if (li->broken_id24_levelnum != condition.param) return false; break; } @@ -311,7 +311,7 @@ private: auto* li = FindLevelInfo(state != StatCount ? wbs->next.GetChars() : wbs->current.GetChars()); if (!li) return false; - if (li->levelnum <= condition.param) + if (li->broken_id24_levelnum <= condition.param) return false; break; } From f13bc09840c1c215587fba2fd40e22f16a9c076b Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Mon, 3 Jun 2024 01:47:41 +0300 Subject: [PATCH 321/414] Add bIsPuff flag --- src/playsim/actor.h | 1 + src/playsim/p_mobj.cpp | 3 +++ src/scripting/thingdef_data.cpp | 1 + 3 files changed, 5 insertions(+) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index a96e7f316..ebdfeebaa 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -444,6 +444,7 @@ enum ActorFlag9 MF9_SHADOWAIMVERT = 0x00000008, // [inkoalawetrust] Monster aim is also offset vertically when aiming at shadow actors. MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states MF9_NOSECTORDAMAGE = 0x00000020, // [inkoalawetrust] Actor ignores any sector-based damage (i.e damaging floors, NOT crushers) + MF9_ISPUFF = 0x00000020, // [AA] Set on actors by P_SpawnPuff }; // --- mobj.renderflags --- diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index e39db44cb..e004c4a46 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -6289,6 +6289,9 @@ AActor *P_SpawnPuff (AActor *source, PClassActor *pufftype, const DVector3 &pos1 // Angle is the opposite of the hit direction (i.e. the puff faces the source.) puff->Angles.Yaw = hitdir + DAngle::fromDeg(180); + // [AA] Mark the spawned actor as a puff with a flag. + puff->flags9 |= MF9_ISPUFF; + // If a puff has a crash state and an actor was not hit, // it will enter the crash state. This is used by the StrifeSpark // and BlasterPuff. diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index bc62f2250..b8cfd8d74 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -354,6 +354,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF9, SHADOWAIMVERT, AActor, flags9), DEFINE_FLAG(MF9, DECOUPLEDANIMATIONS, AActor, flags9), DEFINE_FLAG(MF9, NOSECTORDAMAGE, AActor, flags9), + DEFINE_FLAG(MF9, ISPUFF, AActor, flags9), //[AA] was spawned by SpawnPuff // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), From 83165dccbf345172464c677391b2dc530f277e1e Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Mon, 3 Jun 2024 12:25:12 +0300 Subject: [PATCH 322/414] Add damagesource --- src/playsim/actor.h | 1 + src/playsim/p_mobj.cpp | 4 ++++ src/scripting/vmthunks_actors.cpp | 1 + wadsrc/static/zscript/actors/actor.zs | 1 + 4 files changed, 7 insertions(+) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index ebdfeebaa..34e5d7110 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1233,6 +1233,7 @@ public: TObjPtr alternative; // (Un)Morphed actors stored here. Those with the MF_UNMORPHED flag are the originals. TObjPtr tracer; // Thing being chased/attacked for tracers TObjPtr master; // Thing which spawned this one (prevents mutual attacks) + TObjPtr damagesource; // [AA] Thing that fired a hitscan using this actor as a puff int tid; // thing identifier int special; // special diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index e004c4a46..df6661871 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -168,6 +168,7 @@ IMPLEMENT_POINTERS_START(AActor) IMPLEMENT_POINTER(target) IMPLEMENT_POINTER(lastenemy) IMPLEMENT_POINTER(tracer) + IMPLEMENT_POINTER(damagesource) IMPLEMENT_POINTER(goal) IMPLEMENT_POINTER(LastLookActor) IMPLEMENT_POINTER(Inventory) @@ -6286,6 +6287,9 @@ AActor *P_SpawnPuff (AActor *source, PClassActor *pufftype, const DVector3 &pos1 if ( puff && (puff->flags5 & MF5_PUFFGETSOWNER)) puff->target = source; + // [AA] Track the source of the attack unconditionally in a separate field. + puff->damagesource = source; + // Angle is the opposite of the hit direction (i.e. the puff faces the source.) puff->Angles.Yaw = hitdir + DAngle::fromDeg(180); diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 53fc0a062..527bd9178 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2005,6 +2005,7 @@ DEFINE_FIELD(AActor, strafecount) DEFINE_FIELD(AActor, target) DEFINE_FIELD(AActor, master) DEFINE_FIELD(AActor, tracer) +DEFINE_FIELD(AActor, damagesource) DEFINE_FIELD(AActor, LastHeard) DEFINE_FIELD(AActor, lastenemy) DEFINE_FIELD(AActor, LastLookActor) diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 7a9a53929..eebfbe329 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -148,6 +148,7 @@ class Actor : Thinker native native Actor Target; native Actor Master; native Actor Tracer; + native Actor DamageSource; native Actor LastHeard; native Actor LastEnemy; native Actor LastLookActor; From f8b68a692768a3eb91b9a4c49fef473aa6255d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Mon, 3 Jun 2024 10:37:25 -0300 Subject: [PATCH 323/414] Serialize damagesource, fix bad character in actor.zs --- src/playsim/p_mobj.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index df6661871..e863445f2 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -401,7 +401,8 @@ void AActor::Serialize(FSerializer &arc) ("unmorphtime", UnmorphTime) ("morphflags", MorphFlags) ("premorphproperties", PremorphProperties) - ("morphexitflash", MorphExitFlash); + ("morphexitflash", MorphExitFlash) + ("damagesource", damagesource); SerializeTerrain(arc, "floorterrain", floorterrain, &def->floorterrain); From 1392db2f5bd9e821aefcb174a7438592c8633d43 Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Mon, 30 Sep 2024 16:00:44 +0300 Subject: [PATCH 324/414] Made DamageSource and bIsPuff readonly --- src/scripting/thingdef_data.cpp | 2 +- wadsrc/static/zscript/actors/actor.zs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index b8cfd8d74..cc97b1a2d 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -354,7 +354,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF9, SHADOWAIMVERT, AActor, flags9), DEFINE_FLAG(MF9, DECOUPLEDANIMATIONS, AActor, flags9), DEFINE_FLAG(MF9, NOSECTORDAMAGE, AActor, flags9), - DEFINE_FLAG(MF9, ISPUFF, AActor, flags9), //[AA] was spawned by SpawnPuff + DEFINE_PROTECTED_FLAG(MF9, ISPUFF, AActor, flags9), //[AA] was spawned by SpawnPuff // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index eebfbe329..cae1d161b 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -148,7 +148,7 @@ class Actor : Thinker native native Actor Target; native Actor Master; native Actor Tracer; - native Actor DamageSource; + native readonly Actor DamageSource; native Actor LastHeard; native Actor LastEnemy; native Actor LastLookActor; From 70ec8ce71198f71a3cb27f44b5653d5b3a1bcc2a Mon Sep 17 00:00:00 2001 From: jekyllgrim Date: Tue, 1 Oct 2024 12:30:22 +0300 Subject: [PATCH 325/414] Fixed MF9_ISPUFF overlapping with MF9_NOSECTORDAMAGE --- src/playsim/actor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 34e5d7110..c83a7f229 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -444,7 +444,7 @@ enum ActorFlag9 MF9_SHADOWAIMVERT = 0x00000008, // [inkoalawetrust] Monster aim is also offset vertically when aiming at shadow actors. MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states MF9_NOSECTORDAMAGE = 0x00000020, // [inkoalawetrust] Actor ignores any sector-based damage (i.e damaging floors, NOT crushers) - MF9_ISPUFF = 0x00000020, // [AA] Set on actors by P_SpawnPuff + MF9_ISPUFF = 0x00000040, // [AA] Set on actors by P_SpawnPuff }; // --- mobj.renderflags --- From 9f7a8188c573ae415c017db9b564c152fa6442e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 1 Oct 2024 11:59:05 -0300 Subject: [PATCH 326/414] Fix broken if statement in ParseFireTexture --- src/gamedata/textures/animations.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gamedata/textures/animations.cpp b/src/gamedata/textures/animations.cpp index 7b7a1049b..b0dce0a55 100644 --- a/src/gamedata/textures/animations.cpp +++ b/src/gamedata/textures/animations.cpp @@ -832,8 +832,10 @@ void FTextureAnimator::ParseFireTexture(FScanner& sc) sc.MustGetValue(false); a = sc.Number; palette.Push(PalEntry(a, r, g, b)); - if (a != 255 && a != 0); + if (a != 255 && a != 0) + { gametex->SetTranslucent(true); + } if (palette.Size() > 256) { From 896c73b1e5aa968e679ba102a4b40b1abcbef7e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 1 Oct 2024 12:05:49 -0300 Subject: [PATCH 327/414] Fix compilation --- src/gamedata/umapinfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gamedata/umapinfo.cpp b/src/gamedata/umapinfo.cpp index d6a2c47ee..5582c29d4 100644 --- a/src/gamedata/umapinfo.cpp +++ b/src/gamedata/umapinfo.cpp @@ -460,7 +460,7 @@ void CommitUMapinfo(level_info_t *defaultinfo) if (map.enteranim[0]) levelinfo->EnterAnim = map.enteranim; if (map.exitanim[0]) levelinfo->ExitAnim = map.exitanim; levelinfo->broken_id24_levelnum = map.id24_levelnum; - Printf("%s: id24 levelnum = %d\n", map.MapName, map.id24_levelnum); + Printf("%s: id24 levelnum = %d\n", map.MapName.GetChars(), map.id24_levelnum); /* UMAPINFO's intermusic is for the text screen, not the summary. if (map.intermusic[0]) { From d455f57346a681938ce59240eb3fc2f38c57118e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 1 Oct 2024 17:28:42 +0200 Subject: [PATCH 328/414] remove test code. --- src/gamedata/umapinfo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gamedata/umapinfo.cpp b/src/gamedata/umapinfo.cpp index 5582c29d4..e5de4fbec 100644 --- a/src/gamedata/umapinfo.cpp +++ b/src/gamedata/umapinfo.cpp @@ -460,7 +460,6 @@ void CommitUMapinfo(level_info_t *defaultinfo) if (map.enteranim[0]) levelinfo->EnterAnim = map.enteranim; if (map.exitanim[0]) levelinfo->ExitAnim = map.exitanim; levelinfo->broken_id24_levelnum = map.id24_levelnum; - Printf("%s: id24 levelnum = %d\n", map.MapName.GetChars(), map.id24_levelnum); /* UMAPINFO's intermusic is for the text screen, not the summary. if (map.intermusic[0]) { From 2decf10863d6a44b69b747a431babb20885df0c1 Mon Sep 17 00:00:00 2001 From: Professor Hastig Date: Tue, 1 Oct 2024 14:35:27 +0200 Subject: [PATCH 329/414] add missing 'author' and 'label' UMAPINFO fields. --- src/gamedata/g_mapinfo.cpp | 8 ++++++++ src/gamedata/g_mapinfo.h | 1 + src/gamedata/umapinfo.cpp | 20 ++++++++++++++++++++ src/scripting/vmthunks.cpp | 8 +++++++- wadsrc/static/zscript/doombase.zs | 1 + 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index eb65e6943..22981062b 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -268,6 +268,7 @@ void level_info_t::Reset() Music = ""; LevelName = ""; AuthorName = ""; + MapLabel = ""; FadeTable = "COLORMAP"; CustomColorMap = "COLORMAP"; WallHorizLight = -8; @@ -1028,6 +1029,13 @@ DEFINE_MAP_OPTION(author, true) info->AuthorName = parse.sc.String; } +DEFINE_MAP_OPTION(label, true) +{ + parse.ParseAssign(); + parse.sc.MustGetString(); + info->MapLabel = parse.sc.String; +} + DEFINE_MAP_OPTION(secretnext, true) { parse.ParseAssign(); diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index 8b2706ed0..5d3309f4a 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -350,6 +350,7 @@ struct level_info_t FString LightningSound = "world/thunder"; FString Music; FString LevelName; + FString MapLabel; FString AuthorName; int8_t WallVertLight, WallHorizLight; int musicorder; diff --git a/src/gamedata/umapinfo.cpp b/src/gamedata/umapinfo.cpp index e5de4fbec..9ba72e61b 100644 --- a/src/gamedata/umapinfo.cpp +++ b/src/gamedata/umapinfo.cpp @@ -41,6 +41,8 @@ struct UMapEntry FString LevelName; FString InterText; FString InterTextSecret; + FString author; + FString label; TArray BossActions; bool BossCleared = false; @@ -139,6 +141,16 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape, int *id24_l scanner.MustGetToken(TK_StringConst); mape->LevelName = scanner.String; } + else if (!pname.CompareNoCase("author")) + { + scanner.MustGetToken(TK_StringConst); + mape->author = scanner.String; + } + else if (!pname.CompareNoCase("label")) + { + scanner.MustGetToken(TK_StringConst); + mape->label = scanner.String; + } else if (!pname.CompareNoCase("next")) { ParseLumpName(scanner, mape->nextmap); @@ -417,6 +429,14 @@ void CommitUMapinfo(level_info_t *defaultinfo) levelinfo->LevelName = map.LevelName; levelinfo->PName = ""; // clear the map name patch to force the string version to be shown - unless explicitly overridden right next. } + if (map.author.IsNotEmpty()) + { + levelinfo->AuthorName = map.author; + } + if (map.label.IsNotEmpty()) + { + levelinfo->MapLabel = map.label; + } if (map.levelpic[0]) levelinfo->PName = map.levelpic; if (map.nextmap[0]) levelinfo->NextMap = map.nextmap; else if (map.endpic[0]) diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 4cc048843..3153a4eab 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2263,7 +2263,12 @@ void FormatMapName(FLevelLocals *self, int cr, FString *result) bool ishub = (cluster != nullptr && (cluster->flags & CLUSTER_HUB)); *result = ""; - if (am_showmaplabel == 1 || (am_showmaplabel == 2 && !ishub)) + // If a label is specified, use it uncontitionally here. + if (self->info->MapLabel.IsNotEmpty()) + { + *result << self->info->MapLabel << ": "; + } + else if (am_showmaplabel == 1 || (am_showmaplabel == 2 && !ishub)) { *result << self->MapName << ": "; } @@ -2767,6 +2772,7 @@ DEFINE_FIELD_X(LevelInfo, level_info_t, Music) DEFINE_FIELD_X(LevelInfo, level_info_t, LightningSound) DEFINE_FIELD_X(LevelInfo, level_info_t, LevelName) DEFINE_FIELD_X(LevelInfo, level_info_t, AuthorName) +DEFINE_FIELD_X(LevelInfo, level_info_t, MapLabel) DEFINE_FIELD_X(LevelInfo, level_info_t, musicorder) DEFINE_FIELD_X(LevelInfo, level_info_t, skyspeed1) DEFINE_FIELD_X(LevelInfo, level_info_t, skyspeed2) diff --git a/wadsrc/static/zscript/doombase.zs b/wadsrc/static/zscript/doombase.zs index 54c44f821..1ef97188c 100644 --- a/wadsrc/static/zscript/doombase.zs +++ b/wadsrc/static/zscript/doombase.zs @@ -345,6 +345,7 @@ struct LevelInfo native native readonly String LightningSound; native readonly String Music; native readonly String LevelName; + native readonly String MapLabel; native readonly String AuthorName; native readonly int musicorder; native readonly float skyspeed1; From 9cd2f7530d81fb94da5b01390c95a52f21132a2a Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Wed, 2 Oct 2024 00:54:19 +0800 Subject: [PATCH 330/414] Change default LightmapSampleDistance value to match the default value in UDB --- src/common/rendering/hwrenderer/data/hw_levelmesh.h | 2 +- src/maploader/maploader.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 578f07bce..3749370cc 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -175,7 +175,7 @@ public: int LMTextureSize = 1024; TArray LMTextureData; - uint16_t LightmapSampleDistance = 16; + uint16_t LightmapSampleDistance = 8; TArray LightmapTiles; bool LMAtlasPacked = false; // Tile sizes can't be changed anymore diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 06de343ea..eb4e19c0d 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3210,7 +3210,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) // Reset defaults for lightmapping Level->SunColor = FVector3(1.f, 1.f, 1.f); Level->SunDirection = FVector3(0.45f, 0.3f, 0.9f); - Level->LightmapSampleDistance = 16; + Level->LightmapSampleDistance = 8; Level->lightmaps = false; // note: most of this ordering is important From 5ac0b1b84cf8a674f75a65ecc79ad99b2620bb93 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Wed, 2 Oct 2024 01:37:30 +0800 Subject: [PATCH 331/414] Apply limits to the ZDRayInfo `lm_sampledist` value --- src/common/rendering/hwrenderer/data/hw_lightmaptile.h | 3 +++ src/maploader/maploader.cpp | 2 +- src/maploader/udmf.cpp | 10 ++++------ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_lightmaptile.h b/src/common/rendering/hwrenderer/data/hw_lightmaptile.h index 7f803f5a8..627b13c51 100644 --- a/src/common/rendering/hwrenderer/data/hw_lightmaptile.h +++ b/src/common/rendering/hwrenderer/data/hw_lightmaptile.h @@ -5,6 +5,9 @@ #include "vectors.h" #include "bounds.h" +#define LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MIN (int)4 +#define LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MAX (int)64 + struct LevelMeshSurface; struct LightmapTileBinding diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index eb4e19c0d..3ea84000c 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -2967,7 +2967,7 @@ void MapLoader::InitLevelMesh(MapData* map) if (map->Size(ML_LIGHTMAP)) { // Arbitrary ZDRay limit. This will break lightmap lump loading if not enforced. - Level->LightmapSampleDistance = Level->LightmapSampleDistance < 8 ? 8 : Level->LightmapSampleDistance; + Level->LightmapSampleDistance = std::clamp((int)Level->LightmapSampleDistance, LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MIN, LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MAX); if (!Level->lightmaps) // We are unfortunately missing ZDRayInfo { diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index f71f60fa6..c813cc4a4 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -810,14 +810,12 @@ public: break; case NAME_lm_sampledist: CHECK_N(Zd | Zdt) - if (CheckInt(key) >= 0 && CheckInt(key) <= 0xFFFF) + if (CheckInt(key) < LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MIN || CheckInt(key) > LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MAX) { - Level->LightmapSampleDistance = CheckInt(key); - } - else - { - DPrintf(DMSG_WARNING, "Can't set the global lm_sampledist to %s\n", key.GetChars()); + DPrintf(DMSG_WARNING, "Current lm_sampledist value, %x, on the ZDRayInfo thing is out of range (min: %i, max: %i)\n", + CheckInt(key), LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MIN, LIGHTMAP_GLOBAL_SAMPLE_DISTANCE_MAX); } + Level->LightmapSampleDistance = CheckInt(key); break; default: From ad4eef3b6c7806680032b95d95f199b5febb7e64 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 1 Oct 2024 17:38:29 -0400 Subject: [PATCH 332/414] - SPAC_Walking should check for SPAC_MCross not SPAC_PCross --- src/playsim/p_spec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index 3ee5fe871..9c3fde6f4 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -254,7 +254,7 @@ bool P_TestActivateLine (line_t *line, AActor *mo, int side, int activationType, return false; } - if ((activationType & (SPAC_Cross|SPAC_PCross)) && (lineActivation & SPAC_Walking)) + if ((activationType & (SPAC_Cross|SPAC_MCross)) && (lineActivation & SPAC_Walking)) { // not on floor if ((mo->Pos().Z > mo->floorz) && !(mo->flags2 & MF2_ONMOBJ)) From c0bbe3a43a6666ecd70a38a3e13eec7f8ea1e010 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 3 Oct 2024 02:37:08 +0200 Subject: [PATCH 333/414] Hook up some more PBR stuff --- .../ZVulkan/include/zvulkan/vulkanbuilders.h | 2 + libraries/ZVulkan/src/vulkanbuilders.cpp | 13 + .../descriptorsets/vk_descriptorset.cpp | 22 +- .../rendering/vulkan/samplers/vk_samplers.cpp | 18 ++ .../rendering/vulkan/samplers/vk_samplers.h | 4 + .../rendering/vulkan/textures/vk_texture.cpp | 257 ++++++++++++++++-- .../rendering/vulkan/textures/vk_texture.h | 18 +- .../rendering/vulkan/vk_lightmapper.cpp | 4 +- .../static/shaders/scene/binding_fixed.glsl | 10 +- .../static/shaders/scene/layout_shared.glsl | 2 + .../static/shaders/scene/lightmodel_pbr.glsl | 51 +++- 11 files changed, 340 insertions(+), 61 deletions(-) diff --git a/libraries/ZVulkan/include/zvulkan/vulkanbuilders.h b/libraries/ZVulkan/include/zvulkan/vulkanbuilders.h index 4e1167669..1078acc2e 100644 --- a/libraries/ZVulkan/include/zvulkan/vulkanbuilders.h +++ b/libraries/ZVulkan/include/zvulkan/vulkanbuilders.h @@ -119,6 +119,8 @@ class ImageBuilder public: ImageBuilder(); + ImageBuilder& Type(VkImageType type); + ImageBuilder& Flags(VkImageCreateFlags flags); ImageBuilder& Size(int width, int height, int miplevels = 1, int arrayLayers = 1); ImageBuilder& Samples(VkSampleCountFlagBits samples); ImageBuilder& Format(VkFormat format); diff --git a/libraries/ZVulkan/src/vulkanbuilders.cpp b/libraries/ZVulkan/src/vulkanbuilders.cpp index 0e7c03a59..07129d16f 100644 --- a/libraries/ZVulkan/src/vulkanbuilders.cpp +++ b/libraries/ZVulkan/src/vulkanbuilders.cpp @@ -276,6 +276,18 @@ ImageBuilder::ImageBuilder() imageInfo.flags = 0; } +ImageBuilder& ImageBuilder::Type(VkImageType type) +{ + imageInfo.imageType = type; + return *this; +} + +ImageBuilder& ImageBuilder::Flags(VkImageCreateFlags flags) +{ + imageInfo.flags = flags; + return *this; +} + ImageBuilder& ImageBuilder::Size(int width, int height, int mipLevels, int arrayLayers) { imageInfo.extent.width = width; @@ -1759,6 +1771,7 @@ std::vector VulkanDeviceBuilder::FindDevices(const std:: enabledFeatures.Features.shaderClipDistance = deviceFeatures.Features.shaderClipDistance; enabledFeatures.Features.multiDrawIndirect = deviceFeatures.Features.multiDrawIndirect; enabledFeatures.Features.independentBlend = deviceFeatures.Features.independentBlend; + enabledFeatures.Features.imageCubeArray = deviceFeatures.Features.imageCubeArray; enabledFeatures.BufferDeviceAddress.bufferDeviceAddress = deviceFeatures.BufferDeviceAddress.bufferDeviceAddress; enabledFeatures.AccelerationStructure.accelerationStructure = deviceFeatures.AccelerationStructure.accelerationStructure; enabledFeatures.RayQuery.rayQuery = deviceFeatures.RayQuery.rayQuery; diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index aa63ac417..4343612b9 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -143,17 +143,19 @@ void VkDescriptorSetManager::UpdateFixedSet() WriteDescriptors update; update.AddCombinedImageSampler(Fixed.Set.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - update.AddCombinedImageSampler(Fixed.Set.get(), 1, fb->GetTextureManager()->Lightmap.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.AddCombinedImageSampler(Fixed.Set.get(), 1, fb->GetTextureManager()->Lightmap.Image.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); update.AddCombinedImageSampler(Fixed.Set.get(), 2, fb->GetBuffers()->SceneLinearDepth.View.get(), fb->GetSamplerManager()->Get(PPFilterMode::Nearest, PPWrapMode::Clamp), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.AddCombinedImageSampler(Fixed.Set.get(), 3, fb->GetTextureManager()->Irradiancemap.Image.View.get(), fb->GetSamplerManager()->IrradiancemapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.AddCombinedImageSampler(Fixed.Set.get(), 4, fb->GetTextureManager()->Prefiltermap.Image.View.get(), fb->GetSamplerManager()->PrefiltermapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); if (fb->IsRayQueryEnabled()) { - update.AddAccelerationStructure(Fixed.Set.get(), 3, fb->GetLevelMesh()->GetAccelStruct()); + update.AddAccelerationStructure(Fixed.Set.get(), 5, fb->GetLevelMesh()->GetAccelStruct()); } else { - update.AddBuffer(Fixed.Set.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetNodeBuffer()); - update.AddBuffer(Fixed.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetVertexBuffer()); - update.AddBuffer(Fixed.Set.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetIndexBuffer()); + update.AddBuffer(Fixed.Set.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetNodeBuffer()); + update.AddBuffer(Fixed.Set.get(), 6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetVertexBuffer()); + update.AddBuffer(Fixed.Set.get(), 7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetIndexBuffer()); } update.Execute(fb->GetDevice()); } @@ -269,15 +271,17 @@ void VkDescriptorSetManager::CreateFixedLayout() builder.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); if (fb->IsRayQueryEnabled()) { - builder.AddBinding(3, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(5, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); } else { - builder.AddBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); - builder.AddBinding(4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.AddBinding(7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); } builder.DebugName("VkDescriptorSetManager.Fixed.SetLayout"); Fixed.Layout = builder.Create(fb->GetDevice()); @@ -343,7 +347,7 @@ void VkDescriptorSetManager::CreateRSBufferPool() void VkDescriptorSetManager::CreateFixedPool() { DescriptorPoolBuilder poolbuilder; - poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 3 * MaxFixedSets); + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 5 * MaxFixedSets); if (fb->IsRayQueryEnabled()) { poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 * MaxFixedSets); diff --git a/src/common/rendering/vulkan/samplers/vk_samplers.cpp b/src/common/rendering/vulkan/samplers/vk_samplers.cpp index 9d48a42cb..6c34464b8 100644 --- a/src/common/rendering/vulkan/samplers/vk_samplers.cpp +++ b/src/common/rendering/vulkan/samplers/vk_samplers.cpp @@ -130,6 +130,8 @@ VkSamplerManager::VkSamplerManager(VulkanRenderDevice* fb) : fb(fb) CreateShadowmapSampler(); CreateLightmapSampler(); CreateZMinMaxSampler(); + CreateIrradiancemapSampler(); + CreatePrefiltermapSampler(); } VkSamplerManager::~VkSamplerManager() @@ -325,3 +327,19 @@ void VkSamplerManager::CreateZMinMaxSampler() .DebugName("VkRenderBuffers.ZMinMaxSampler") .Create(fb->GetDevice()); } + +void VkSamplerManager::CreateIrradiancemapSampler() +{ + IrradiancemapSampler = SamplerBuilder() + .AddressMode(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) + .DebugName("VkRenderBuffers.IrradiancemapSampler") + .Create(fb->GetDevice()); +} + +void VkSamplerManager::CreatePrefiltermapSampler() +{ + PrefiltermapSampler = SamplerBuilder() + .AddressMode(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) + .DebugName("VkRenderBuffers.PrefiltermapSampler") + .Create(fb->GetDevice()); +} diff --git a/src/common/rendering/vulkan/samplers/vk_samplers.h b/src/common/rendering/vulkan/samplers/vk_samplers.h index 1579d02d6..8623cfe37 100644 --- a/src/common/rendering/vulkan/samplers/vk_samplers.h +++ b/src/common/rendering/vulkan/samplers/vk_samplers.h @@ -29,6 +29,8 @@ public: std::unique_ptr ShadowmapSampler; std::unique_ptr LightmapSampler; std::unique_ptr ZMinMaxSampler; + std::unique_ptr IrradiancemapSampler; + std::unique_ptr PrefiltermapSampler; private: void CreateHWSamplers(); @@ -36,6 +38,8 @@ private: void CreateShadowmapSampler(); void CreateLightmapSampler(); void CreateZMinMaxSampler(); + void CreateIrradiancemapSampler(); + void CreatePrefiltermapSampler(); VulkanRenderDevice* fb = nullptr; std::array, NUMSAMPLERS> mSamplers; diff --git a/src/common/rendering/vulkan/textures/vk_texture.cpp b/src/common/rendering/vulkan/textures/vk_texture.cpp index eee217749..c5f642119 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.cpp +++ b/src/common/rendering/vulkan/textures/vk_texture.cpp @@ -32,6 +32,8 @@ VkTextureManager::VkTextureManager(VulkanRenderDevice* fb) : fb(fb) CreateNullTexture(); CreateShadowmap(); CreateLightmap(); + CreateIrradiancemap(); + CreatePrefiltermap(); } VkTextureManager::~VkTextureManager() @@ -192,32 +194,64 @@ void VkTextureManager::CreateLightmap() CreateLightmap(1, 1, std::move(data)); } -void VkTextureManager::CreateLightmap(int newLMTextureSize, int newLMTextureCount, TArray&& newPixelData) +void VkTextureManager::CreateIrradiancemap() { - if (LMTextureSize == newLMTextureSize && LMTextureCount == newLMTextureCount + 1 && newPixelData.Size() == 0) + TArray data; + for (int arrayIndex = 0; arrayIndex < 6; arrayIndex++) + { + data.Push(0); + data.Push(0); + data.Push(0); + } + CreateIrradiancemap(1, 6, std::move(data)); +} + +void VkTextureManager::CreatePrefiltermap() +{ + TArray data; + int size = 1 << MAX_REFLECTION_LOD; + for (int arrayIndex = 0; arrayIndex < 6; arrayIndex++) + { + for (int level = 0; level < MAX_REFLECTION_LOD; level++) + { + int mipsize = size >> level; + for (int i = 0; i < mipsize; i++) + { + data.Push(0); + data.Push(0); + data.Push(0); + } + } + } + CreatePrefiltermap(size, 6, std::move(data)); +} + +void VkTextureManager::CreateIrradiancemap(int size, int count, TArray&& newPixelData) +{ + if (Irradiancemap.Size == size && Irradiancemap.Count == count && newPixelData.Size() == 0) return; - LMTextureSize = newLMTextureSize; - LMTextureCount = newLMTextureCount + 1; // the extra texture is for the dynamic lightmap - - int w = newLMTextureSize; - int h = newLMTextureSize; - int count = newLMTextureCount; + Irradiancemap.Size = size; + Irradiancemap.Count = count; + + int w = size; + int h = size; int pixelsize = 8; - Lightmap.Reset(fb); + Irradiancemap.Image.Reset(fb); - Lightmap.Image = ImageBuilder() - .Size(w, h, 1, LMTextureCount) + Irradiancemap.Image.Image = ImageBuilder() + .Size(w, h, 1, count) .Format(VK_FORMAT_R16G16B16A16_SFLOAT) - .Usage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) - .DebugName("VkRenderBuffers.Lightmap") + .Usage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT) + .Flags(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) + .DebugName("VkTextureManager.Irradiancemap") .Create(fb->GetDevice()); - Lightmap.View = ImageViewBuilder() - .Type(VK_IMAGE_VIEW_TYPE_2D_ARRAY) - .Image(Lightmap.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) - .DebugName("VkRenderBuffers.LightmapView") + Irradiancemap.Image.View = ImageViewBuilder() + .Type(VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) + .Image(Irradiancemap.Image.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) + .DebugName("VkTextureManager.IrradiancemapView") .Create(fb->GetDevice()); auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); @@ -231,7 +265,7 @@ void VkTextureManager::CreateLightmap(int newLMTextureSize, int newLMTextureCoun auto stagingBuffer = BufferBuilder() .Size(totalSize) .Usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY) - .DebugName("VkHardwareTexture.mStagingBuffer") + .DebugName("VkRenderBuffers.IrradiancemapStagingBuffer") .Create(fb->GetDevice()); uint16_t one = 0x3c00; // half-float 1.0 @@ -247,7 +281,7 @@ void VkTextureManager::CreateLightmap(int newLMTextureSize, int newLMTextureCoun stagingBuffer->Unmap(); VkImageTransition() - .AddImage(&Lightmap, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, true, 0, 1, 0, LMTextureCount) + .AddImage(&Irradiancemap.Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, true, 0, 1, 0, count) .Execute(cmdbuffer); VkBufferImageCopy region = {}; @@ -256,7 +290,176 @@ void VkTextureManager::CreateLightmap(int newLMTextureSize, int newLMTextureCoun region.imageExtent.depth = 1; region.imageExtent.width = w; region.imageExtent.height = h; - cmdbuffer->copyBufferToImage(stagingBuffer->buffer, Lightmap.Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + cmdbuffer->copyBufferToImage(stagingBuffer->buffer, Irradiancemap.Image.Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + + fb->GetCommands()->TransferDeleteList->Add(std::move(stagingBuffer)); + + newPixelData.Clear(); + } + + VkImageTransition() + .AddImage(&Irradiancemap.Image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false, 0, 1, 0, count) + .Execute(cmdbuffer); +} + +void VkTextureManager::CreatePrefiltermap(int size, int count, TArray&& newPixelData) +{ + if (Prefiltermap.Size == size && Prefiltermap.Count == count && newPixelData.Size() == 0) + return; + + Prefiltermap.Size = size; + Prefiltermap.Count = count; + + int w = size; + int h = size; + int pixelsize = 8; + int miplevels = MAX_REFLECTION_LOD + 1; + + Prefiltermap.Image.Reset(fb); + + Prefiltermap.Image.Image = ImageBuilder() + .Size(w, h, miplevels, count) + .Format(VK_FORMAT_R16G16B16A16_SFLOAT) + .Usage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT) + .Flags(VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) + .DebugName("VkTextureManager.Prefiltermap") + .Create(fb->GetDevice()); + + Prefiltermap.Image.View = ImageViewBuilder() + .Type(VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) + .Image(Prefiltermap.Image.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) + .DebugName("VkTextureManager.PrefiltermapView") + .Create(fb->GetDevice()); + + auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); + + if (count > 0 && newPixelData.Size() >= (size_t)w * h * count * 3) + { + assert(newPixelData.Size() == (size_t)w * h * count * 3); + + int totalSize = 0; + for (int level = 0; level < miplevels; level++) + { + int mipwidth = std::max(w >> level, 1); + int mipheight = std::max(h >> level, 1); + totalSize += mipwidth * mipheight * count * pixelsize; + } + + auto stagingBuffer = BufferBuilder() + .Size(totalSize) + .Usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY) + .DebugName("VkTextureManager.PrefiltermapStagingBuffer") + .Create(fb->GetDevice()); + + uint16_t one = 0x3c00; // half-float 1.0 + const uint16_t* src = newPixelData.Data(); + uint16_t* data = (uint16_t*)stagingBuffer->Map(0, totalSize); + for (int i = w * h * count; i > 0; i--) + { + *(data++) = *(src++); + *(data++) = *(src++); + *(data++) = *(src++); + *(data++) = one; + } + stagingBuffer->Unmap(); + + VkImageTransition() + .AddImage(&Prefiltermap.Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, true, 0, miplevels, 0, count) + .Execute(cmdbuffer); + + int offset = 0; + for (int level = 0; level < miplevels; level++) + { + VkBufferImageCopy region = {}; + region.bufferOffset = offset; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.layerCount = count; + region.imageSubresource.mipLevel = level; + region.imageExtent.depth = 1; + region.imageExtent.width = w; + region.imageExtent.height = h; + cmdbuffer->copyBufferToImage(stagingBuffer->buffer, Prefiltermap.Image.Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + + int mipwidth = std::max(w >> level, 1); + int mipheight = std::max(h >> level, 1); + offset += mipwidth * mipheight * count * pixelsize; + } + + fb->GetCommands()->TransferDeleteList->Add(std::move(stagingBuffer)); + + newPixelData.Clear(); + } + + VkImageTransition() + .AddImage(&Prefiltermap.Image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false, 0, miplevels, 0, count) + .Execute(cmdbuffer); +} + +void VkTextureManager::CreateLightmap(int newLMTextureSize, int newLMTextureCount, TArray&& newPixelData) +{ + if (Lightmap.Size == newLMTextureSize && Lightmap.Count == newLMTextureCount + 1 && newPixelData.Size() == 0) + return; + + Lightmap.Size = newLMTextureSize; + Lightmap.Count = newLMTextureCount + 1; // the extra texture is for the dynamic lightmap + + int w = newLMTextureSize; + int h = newLMTextureSize; + int count = newLMTextureCount; + int pixelsize = 8; + + Lightmap.Image.Reset(fb); + + Lightmap.Image.Image = ImageBuilder() + .Size(w, h, 1, Lightmap.Count) + .Format(VK_FORMAT_R16G16B16A16_SFLOAT) + .Usage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + .DebugName("VkTextureManager.Lightmap") + .Create(fb->GetDevice()); + + Lightmap.Image.View = ImageViewBuilder() + .Type(VK_IMAGE_VIEW_TYPE_2D_ARRAY) + .Image(Lightmap.Image.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) + .DebugName("VkTextureManager.LightmapView") + .Create(fb->GetDevice()); + + auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); + + if (count > 0 && newPixelData.Size() >= (size_t)w * h * count * 3) + { + assert(newPixelData.Size() == (size_t)w * h * count * 3); + + int totalSize = w * h * count * pixelsize; + + auto stagingBuffer = BufferBuilder() + .Size(totalSize) + .Usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY) + .DebugName("VkTextureManager.LightmapStagingBuffer") + .Create(fb->GetDevice()); + + uint16_t one = 0x3c00; // half-float 1.0 + const uint16_t* src = newPixelData.Data(); + uint16_t* data = (uint16_t*)stagingBuffer->Map(0, totalSize); + for (int i = w * h * count; i > 0; i--) + { + *(data++) = *(src++); + *(data++) = *(src++); + *(data++) = *(src++); + *(data++) = one; + } + stagingBuffer->Unmap(); + + VkImageTransition() + .AddImage(&Lightmap.Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, true, 0, 1, 0, Lightmap.Count) + .Execute(cmdbuffer); + + VkBufferImageCopy region = {}; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.layerCount = count; + region.imageExtent.depth = 1; + region.imageExtent.width = w; + region.imageExtent.height = h; + cmdbuffer->copyBufferToImage(stagingBuffer->buffer, Lightmap.Image.Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); fb->GetCommands()->TransferDeleteList->Add(std::move(stagingBuffer)); @@ -264,13 +467,13 @@ void VkTextureManager::CreateLightmap(int newLMTextureSize, int newLMTextureCoun } VkImageTransition() - .AddImage(&Lightmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false, 0, 1, 0, LMTextureCount) + .AddImage(&Lightmap.Image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false, 0, 1, 0, Lightmap.Count) .Execute(cmdbuffer); } void VkTextureManager::DownloadLightmap(int arrayIndex, uint16_t* buffer) { - unsigned int totalSize = LMTextureSize * LMTextureSize * 4; + unsigned int totalSize = Lightmap.Size * Lightmap.Size * 4; auto stagingBuffer = BufferBuilder() .Size(totalSize * sizeof(uint16_t)) @@ -281,7 +484,7 @@ void VkTextureManager::DownloadLightmap(int arrayIndex, uint16_t* buffer) auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); PipelineBarrier() - .AddImage(Lightmap.Image.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, arrayIndex, 1) + .AddImage(Lightmap.Image.Image.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, arrayIndex, 1) .Execute(cmdbuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); VkBufferImageCopy region = {}; @@ -289,13 +492,13 @@ void VkTextureManager::DownloadLightmap(int arrayIndex, uint16_t* buffer) region.imageSubresource.baseArrayLayer = arrayIndex; region.imageSubresource.layerCount = 1; region.imageSubresource.mipLevel = 0; - region.imageExtent.width = LMTextureSize; - region.imageExtent.height = LMTextureSize; + region.imageExtent.width = Lightmap.Size; + region.imageExtent.height = Lightmap.Size; region.imageExtent.depth = 1; - cmdbuffer->copyImageToBuffer(Lightmap.Image->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, stagingBuffer->buffer, 1, ®ion); + cmdbuffer->copyImageToBuffer(Lightmap.Image.Image->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, stagingBuffer->buffer, 1, ®ion); PipelineBarrier() - .AddImage(Lightmap.Image.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, arrayIndex, 1) + .AddImage(Lightmap.Image.Image.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, arrayIndex, 1) .Execute(cmdbuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); fb->GetCommands()->WaitForCommands(false); diff --git a/src/common/rendering/vulkan/textures/vk_texture.h b/src/common/rendering/vulkan/textures/vk_texture.h index f79163e31..64ab929ea 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.h +++ b/src/common/rendering/vulkan/textures/vk_texture.h @@ -23,7 +23,9 @@ public: void BeginFrame(); - void CreateLightmap(int newLMTextureSize, int newLMTextureCount, TArray&& newPixelData); + void CreateLightmap(int size, int count, TArray&& data); + void CreateIrradiancemap(int size, int count, TArray&& data); + void CreatePrefiltermap(int size, int count, TArray&& data); void DownloadLightmap(int arrayIndex, uint16_t* buffer); VkTextureImage* GetTexture(const PPTextureType& type, PPTexture* tex); @@ -41,14 +43,22 @@ public: int GetHWTextureCount() { return (int)Textures.size(); } VkTextureImage Shadowmap; - VkTextureImage Lightmap; - int LMTextureSize = 0; - int LMTextureCount = 0; + + struct + { + VkTextureImage Image; + int Size = 0; + int Count = 0; + } Lightmap, Irradiancemap, Prefiltermap; + + static const int MAX_REFLECTION_LOD = 4; // Note: must match what lightmodel_pbr.glsl expects private: void CreateNullTexture(); void CreateShadowmap(); void CreateLightmap(); + void CreateIrradiancemap(); + void CreatePrefiltermap(); VkPPTexture* GetVkTexture(PPTexture* texture); diff --git a/src/common/rendering/vulkan/vk_lightmapper.cpp b/src/common/rendering/vulkan/vk_lightmapper.cpp index 9e0d2e9b0..57826c2ba 100644 --- a/src/common/rendering/vulkan/vk_lightmapper.cpp +++ b/src/common/rendering/vulkan/vk_lightmapper.cpp @@ -378,8 +378,8 @@ void VkLightmapper::CopyResult() if (pixels == 0) return; - VkTextureImage* destTexture = &fb->GetTextureManager()->Lightmap; - int destSize = fb->GetTextureManager()->LMTextureSize; + VkTextureImage* destTexture = &fb->GetTextureManager()->Lightmap.Image; + int destSize = fb->GetTextureManager()->Lightmap.Size; auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); diff --git a/wadsrc/static/shaders/scene/binding_fixed.glsl b/wadsrc/static/shaders/scene/binding_fixed.glsl index 8bfcae2c4..902665a2c 100644 --- a/wadsrc/static/shaders/scene/binding_fixed.glsl +++ b/wadsrc/static/shaders/scene/binding_fixed.glsl @@ -2,10 +2,12 @@ layout(set = 0, binding = 0) uniform sampler2D ShadowMap; layout(set = 0, binding = 1) uniform sampler2DArray LightMap; layout(set = 0, binding = 2) uniform sampler2D LinearDepth; +layout(set = 0, binding = 3) uniform samplerCubeArray IrradianceMap; +layout(set = 0, binding = 4) uniform samplerCubeArray PrefilterMap; #if defined(USE_RAYTRACE) #if defined(SUPPORTS_RAYQUERY) -layout(set = 0, binding = 3) uniform accelerationStructureEXT TopLevelAS; +layout(set = 0, binding = 5) uniform accelerationStructureEXT TopLevelAS; #else struct CollisionNode { @@ -18,7 +20,7 @@ struct CollisionNode int element_index; int padding3; }; -layout(std430, set = 0, binding = 3) buffer NodeBuffer +layout(std430, set = 0, binding = 5) buffer NodeBuffer { int nodesRoot; int nodebufferPadding1; @@ -33,7 +35,7 @@ struct SurfaceVertex // Note: this must always match the FFlatVertex struct vec2 uv; vec2 luv; }; -layout(std430, set = 0, binding = 4) buffer VertexBuffer { SurfaceVertex vertices[]; }; -layout(std430, set = 0, binding = 5) buffer ElementBuffer { int elements[]; }; +layout(std430, set = 0, binding = 6) buffer VertexBuffer { SurfaceVertex vertices[]; }; +layout(std430, set = 0, binding = 7) buffer ElementBuffer { int elements[]; }; #endif #endif diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 9160e4588..f1fef42cc 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -38,6 +38,8 @@ layout(push_constant) uniform PushConstants #define glowtexture texture4 #endif +#define BrdfLUT 0 // the BRDF convoluted texture is always in this texture slot + #define uObjectColor data[uDataIndex].uObjectColor #define uObjectColor2 data[uDataIndex].uObjectColor2 #define uDynLightColor data[uDataIndex].uDynLightColor diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index c87cbf52f..1ccf9ce5c 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -66,8 +66,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) { vec3 worldpos = pixelpos.xyz; - vec3 albedo = pow(material.Base.rgb, vec3(2.2)); // sRGB to linear - ambientLight = pow(ambientLight, vec3(2.2)); + vec3 albedo = material.Base.rgb; float metallic = material.Metallic; float roughness = material.Roughness; @@ -168,28 +167,50 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) } } - // Pretend we sampled the sector light level from an irradiance map + // Treat the ambient sector light as if it is a light source next to the wall + { + vec3 NN = N; + vec3 VV = V; + vec3 LL = N; + vec3 HH = normalize(VV + LL); + + vec3 radiance = ambientLight.rgb * 2.5; + + // cook-torrance brdf + float NDF = DistributionGGX(NN, HH, roughness); + float G = GeometrySmith(NN, VV, LL, roughness); + vec3 F = fresnelSchlick(clamp(dot(HH, VV), 0.0, 1.0), F0); + + vec3 kS = F; + vec3 kD = (vec3(1.0) - kS) * (1.0 - metallic); + + vec3 nominator = NDF * G * F; + float denominator = 4.0 * clamp(dot(NN, VV), 0.0, 1.0) * clamp(dot(NN, LL), 0.0, 1.0); + vec3 specular = nominator / max(denominator, 0.001); + specular = metallic * albedo * 0.40; + + Lo += (kD * albedo / PI + specular) * radiance; + } + + float probeIndex = 0.0; // To do: get this from an uniform vec3 F = fresnelSchlickRoughness(clamp(dot(N, V), 0.0, 1.0), F0, roughness); vec3 kS = F; vec3 kD = 1.0 - kS; - vec3 irradiance = ambientLight; // texture(irradianceMap, N).rgb + vec3 irradiance = texture(IrradianceMap, vec4(N, probeIndex)).rgb; vec3 diffuse = irradiance * albedo; - //kD *= 1.0 - metallic; - //const float MAX_REFLECTION_LOD = 4.0; - //vec3 prefilteredColor = textureLod(prefilterMap, R, roughness * MAX_REFLECTION_LOD).rgb; - //vec2 envBRDF = texture(brdfLUT, vec2(clamp(dot(N, V), 0.0, 1.0), roughness)).rg; - //vec3 specular = prefilteredColor * (F * envBRDF.x + envBRDF.y); + kD *= 1.0 - metallic; + const float MAX_REFLECTION_LOD = 4.0; + vec3 R = reflect(-V, N); + vec3 prefilteredColor = textureLod(PrefilterMap, vec4(R, probeIndex), roughness * MAX_REFLECTION_LOD).rgb; + vec2 envBRDF = texture(BrdfLUT, vec2(clamp(dot(N, V), 0.0, 1.0), roughness)).rg; + vec3 specular = prefilteredColor * (F * envBRDF.x + envBRDF.y); - //vec3 ambient = (kD * diffuse + specular) * ao; - vec3 ambient = (kD * diffuse) * ao; + vec3 ambient = (kD * diffuse + specular) * ao; vec3 color = max(ambient + Lo, vec3(0.0)); - - // Tonemap (reinhard) and apply sRGB gamma - //color = color / (color + vec3(1.0)); - return pow(color, vec3(1.0 / 2.2)); + return color; } From 3e0fbff0cc3755189cc7e69c6e39932ffc0aa053 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 3 Oct 2024 02:59:27 +0200 Subject: [PATCH 334/414] Removed some unused code --- wadsrc/static/shaders/scene/lightmodel_pbr.glsl | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index 1ccf9ce5c..317aaf6a2 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -169,25 +169,16 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) // Treat the ambient sector light as if it is a light source next to the wall { - vec3 NN = N; vec3 VV = V; vec3 LL = N; vec3 HH = normalize(VV + LL); - vec3 radiance = ambientLight.rgb * 2.5; + vec3 radiance = ambientLight.rgb * 2.25; - // cook-torrance brdf - float NDF = DistributionGGX(NN, HH, roughness); - float G = GeometrySmith(NN, VV, LL, roughness); vec3 F = fresnelSchlick(clamp(dot(HH, VV), 0.0, 1.0), F0); - vec3 kS = F; vec3 kD = (vec3(1.0) - kS) * (1.0 - metallic); - - vec3 nominator = NDF * G * F; - float denominator = 4.0 * clamp(dot(NN, VV), 0.0, 1.0) * clamp(dot(NN, LL), 0.0, 1.0); - vec3 specular = nominator / max(denominator, 0.001); - specular = metallic * albedo * 0.40; + vec3 specular = metallic * albedo * 0.40; Lo += (kD * albedo / PI + specular) * radiance; } From 8354c4a5c360460cbcc53e141da32ec2684601e4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 3 Oct 2024 12:24:16 +0200 Subject: [PATCH 335/414] Replaced MISSILE(EVEN)MORE with a real property and added related Dehacked options from Crispy Doom. This also adds proper deprecation messages to the deprecated flags which were missing due to a bad definition macro. --- src/gamedata/d_dehacked.cpp | 30 ++++++- src/playsim/actor.h | 5 +- src/playsim/p_enemy.cpp | 3 +- src/playsim/p_mobj.cpp | 1 + src/scripting/decorate/thingdef_parse.cpp | 2 +- src/scripting/thingdef.h | 8 +- src/scripting/thingdef_data.cpp | 36 +++++---- src/scripting/thingdef_properties.cpp | 81 +++++++++++++------ src/scripting/vmthunks_actors.cpp | 1 + src/scripting/zscript/zcc_compile_doom.cpp | 7 +- wadsrc/static/zscript/actors/actor.zs | 2 + .../static/zscript/actors/doom/cyberdemon.zs | 2 +- wadsrc/static/zscript/actors/doom/lostsoul.zs | 3 +- wadsrc/static/zscript/actors/doom/revenant.zs | 2 +- .../zscript/actors/doom/spidermaster.zs | 2 +- .../zscript/actors/heretic/hereticimp.zs | 4 +- .../static/zscript/actors/strife/acolyte.zs | 14 ++-- .../static/zscript/actors/strife/crusader.zs | 2 +- .../static/zscript/actors/strife/sentinel.zs | 2 +- 19 files changed, 138 insertions(+), 69 deletions(-) diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index 77e9d1320..e10f78dfb 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -1153,7 +1153,7 @@ static const struct DehFlags2 deh_mobjflags_mbf21[] = { {"NORADIUSDMG", [](AActor* defaults) { defaults->flags3 |= MF3_NORADIUSDMG; }}, // doesn't take splash damage {"FORCERADIUSDMG", [](AActor* defaults) { defaults->flags4 |= MF4_FORCERADIUSDMG; }}, // causes splash damage even if target immune {"HIGHERMPROB", [](AActor* defaults) { defaults->MinMissileChance = 160; }}, // higher missile attack probability - {"RANGEHALF", [](AActor* defaults) { defaults->flags4 |= MF4_MISSILEMORE; }}, // use half distance for missile attack probability + {"RANGEHALF", [](AActor* defaults) { defaults->missilechancemult = 0.5; }}, // use half distance for missile attack probability {"NOTHRESHOLD", [](AActor* defaults) { defaults->flags4 |= MF4_QUICKTORETALIATE; }}, // no targeting threshold {"LONGMELEE", [](AActor* defaults) { defaults->meleethreshold = 196; }}, // long melee range {"BOSS", [](AActor* defaults) { defaults->flags2 |= MF2_BOSS; defaults->flags3 |= MF3_NORADIUSDMG; }}, // full volume see / death sound + splash immunity @@ -1174,9 +1174,10 @@ static void ClearBits2Stuff(AActor* defaults) defaults->maxtargetrange = 0; defaults->MinMissileChance = 200; defaults->meleethreshold = 0; + defaults->missilechancemult = 1; defaults->flags2 &= ~(MF2_BOSS | MF2_RIP); defaults->flags3 &= ~(MF3_NOTARGET | MF3_NORADIUSDMG | MF3_FULLVOLDEATH); - defaults->flags4 &= ~(MF4_MISSILEMORE | MF4_QUICKTORETALIATE | MF4_FORCERADIUSDMG); + defaults->flags4 &= ~(MF4_QUICKTORETALIATE | MF4_FORCERADIUSDMG); defaults->flags8 &= ~(MF8_E1M8BOSS | MF8_E2M8BOSS | MF8_E3M8BOSS | MF8_E4M8BOSS | MF8_E4M6BOSS | MF8_MAP07BOSS1 | MF8_MAP07BOSS2 | MF8_FULLVOLSEE); } @@ -1437,6 +1438,27 @@ static int PatchThing (int thingy, int flags) } DPrintf(DMSG_SPAMMY, "MBF21 Bits: %d (0x%08x)\n", info->flags.GetValue(), info->flags.GetValue()); } + // New fields from Crispy Doom + else if (!stricmp(Line1, "Melee threshold")) + { + info->meleethreshold = DEHToDouble(val); + } + else if (!stricmp(Line1, "Max target range")) + { + // [crispy] Maximum distance range to start shooting (zero for unlimited) + info->maxtargetrange = DEHToDouble(val); + } + else if (!stricmp(Line1, "Min missile chance")) + { + // [crispy] Minimum chance for firing a missile + info->MinMissileChance = DEHToDouble(val); + } + else if (!stricmp(Line1, "Missile chance multiplier")) + { + // [crispy] Multiplies the chance of firing a missile (65536 = normal chance) + info->missilechancemult = DEHToDouble(val); + } + else if (linelen > 6) { if (stricmp (Line1 + linelen - 6, " frame") == 0) @@ -3861,7 +3883,7 @@ struct FlagHandler #define F4(flag) { [](AActor* a) { a->flags4 |= flag; }, [](AActor* a) { a->flags4 &= ~flag; }, [](AActor* a)->bool { return a->flags4 & flag; } } #define F6(flag) { [](AActor* a) { a->flags6 |= flag; }, [](AActor* a) { a->flags6 &= ~flag; }, [](AActor* a)->bool { return a->flags6 & flag; } } #define F8(flag) { [](AActor* a) { a->flags8 |= flag; }, [](AActor* a) { a->flags8 &= ~flag; }, [](AActor* a)->bool { return a->flags8 & flag; } } -#define DEPF(flag) { [](AActor* a) { HandleDeprecatedFlags(a, nullptr, true, flag); }, [](AActor* a) { HandleDeprecatedFlags(a, nullptr, false, flag); }, [](AActor* a)->bool { return CheckDeprecatedFlags(a, nullptr, flag); } } +#define DEPF(flag) { [](AActor* a) { HandleDeprecatedFlags(a, true, flag); }, [](AActor* a) { HandleDeprecatedFlags(a, false, flag); }, [](AActor* a)->bool { return !!CheckDeprecatedFlags(a, flag); } } void SetNoSector(AActor* a) { @@ -4112,7 +4134,7 @@ static FlagHandler flag2handlers[32] = { F3(MF3_NORADIUSDMG), F4(MF4_FORCERADIUSDMG), DEPF(DEPF_HIGHERMPROB), - F4(MF4_MISSILEMORE), + DEPF(DEPF_MISSILEMORE), F4(MF4_QUICKTORETALIATE), DEPF(DEPF_LONGMELEERANGE), { SetBoss, ClearBoss, [](AActor* a)->bool { return a->flags2 & MF2_BOSS; } }, diff --git a/src/playsim/actor.h b/src/playsim/actor.h index c83a7f229..daa60f45f 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -262,8 +262,8 @@ enum ActorFlag4 MF4_STRIFEDAMAGE = 0x00000100, // Strife projectiles only do up to 4x damage, not 8x MF4_CANUSEWALLS = 0x00000200, // Can activate 'use' specials - MF4_MISSILEMORE = 0x00000400, // increases the chance of a missile attack - MF4_MISSILEEVENMORE = 0x00000800, // significantly increases the chance of a missile attack + // = 0x00000400, + // = 0x00000800, MF4_FORCERADIUSDMG = 0x00001000, // if put on an object it will override MF3_NORADIUSDMG MF4_DONTFALL = 0x00002000, // Doesn't have NOGRAVITY disabled when dying. MF4_SEESDAGGERS = 0x00004000, // This actor can see you striking with a dagger @@ -1255,6 +1255,7 @@ public: // but instead tries to come closer for a melee attack. // This is not the same as meleerange double maxtargetrange; // any target farther away cannot be attacked + double missilechancemult; // distance multiplier for CheckMeleeRange, formerly done with MISSILE(EVEN)MORE flags. double bouncefactor; // Strife's grenades use 50%, Hexen's Flechettes 70. double wallbouncefactor; // The bounce factor for walls can be different. double Gravity; // [GRB] Gravity factor diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index 1d49f4b3a..55f501488 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -373,8 +373,7 @@ static int P_CheckMissileRange (AActor *actor) if (actor->MeleeState != nullptr && dist < actor->meleethreshold) return false; // From the Revenant: close enough for fist attack - if (actor->flags4 & MF4_MISSILEMORE) dist *= 0.5; - if (actor->flags4 & MF4_MISSILEEVENMORE) dist *= 0.125; + dist *= actor->missilechancemult; int mmc = int(actor->MinMissileChance * G_SkillProperty(SKILLP_Aggressiveness)); return pr_checkmissilerange() >= min(int(dist), mmc); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index e863445f2..0cbcb813b 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -320,6 +320,7 @@ void AActor::Serialize(FSerializer &arc) A("wallbouncefactor", wallbouncefactor) A("bouncecount", bouncecount) A("maxtargetrange", maxtargetrange) + A("missilechancemult", missilechancemult) A("meleethreshold", meleethreshold) A("meleerange", meleerange) A("damagetype", DamageType) diff --git a/src/scripting/decorate/thingdef_parse.cpp b/src/scripting/decorate/thingdef_parse.cpp index a1cc7702e..19c8f38ab 100644 --- a/src/scripting/decorate/thingdef_parse.cpp +++ b/src/scripting/decorate/thingdef_parse.cpp @@ -475,7 +475,7 @@ void HandleActorFlag(FScanner &sc, Baggage &bag, const char *part1, const char * AActor *defaults = (AActor*)bag.Info->Defaults; if (fd->structoffset == -1) // this is a deprecated flag that has been changed into a real property { - HandleDeprecatedFlags(defaults, bag.Info, mod=='+', fd->flagbit); + HandleDeprecatedFlags(defaults, mod=='+', fd->flagbit); } else { diff --git a/src/scripting/thingdef.h b/src/scripting/thingdef.h index 34cd34666..f12cca99d 100644 --- a/src/scripting/thingdef.h +++ b/src/scripting/thingdef.h @@ -66,12 +66,13 @@ struct FFlagDef int structoffset; int fieldsize; int varflags; + VersionInfo deprecationVersion; }; void FinalizeClass(PClass *cls, FStateDefinitions &statedef); FFlagDef *FindFlag (const PClass *type, const char *part1, const char *part2, bool strict = false); -void HandleDeprecatedFlags(AActor *defaults, PClassActor *info, bool set, int index); -bool CheckDeprecatedFlags(AActor *actor, PClassActor *info, int index); +void HandleDeprecatedFlags(AActor *defaults, int set, int index); +int CheckDeprecatedFlags(AActor *actor, int index); const char *GetFlagName(unsigned int flagnum, int flagoffset); void ModActorFlag(AActor *actor, FFlagDef *fd, bool set); bool ModActorFlag(AActor *actor, const FString &flagname, bool set, bool printerror = true); @@ -229,6 +230,9 @@ enum DEPF_DOOMBOUNCE = 11, DEPF_INTERHUBSTRIP = 12, DEPF_HIGHERMPROB = 13, + // all that follow need ZScript emulation! + DEPF_MISSILEMORE = 14, + DEPF_MISSILEEVENMORE = 15 }; // Types of old style decorations diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index cc97b1a2d..8f19bab54 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -75,8 +75,8 @@ extern float BackbuttonAlpha; #define DEFINE_FLAG(prefix, name, type, variable) { (unsigned int)prefix##_##name, #name, (int)(size_t)&((type*)1)->variable - 1, sizeof(((type *)0)->variable), VARF_Native } #define DEFINE_PROTECTED_FLAG(prefix, name, type, variable) { (unsigned int)prefix##_##name, #name, (int)(size_t)&((type*)1)->variable - 1, sizeof(((type *)0)->variable), VARF_Native|VARF_ReadOnly|VARF_InternalAccess } #define DEFINE_FLAG2(symbol, name, type, variable) { (unsigned int)symbol, #name, (int)(size_t)&((type*)1)->variable - 1, sizeof(((type *)0)->variable), VARF_Native } -#define DEFINE_FLAG2_DEPRECATED(symbol, name, type, variable) { (unsigned int)symbol, #name, (int)(size_t)&((type*)1)->variable - 1, sizeof(((type *)0)->variable), VARF_Native|VARF_Deprecated } -#define DEFINE_DEPRECATED_FLAG(name) { DEPF_##name, #name, -1, 0, true } +#define DEFINE_FLAG2_DEPRECATED(symbol, name, type, variable, version) { (unsigned int)symbol, #name, (int)(size_t)&((type*)1)->variable - 1, sizeof(((type *)0)->variable), VARF_Native|VARF_Deprecated } +#define DEFINE_DEPRECATED_FLAG(name, version) { DEPF_##name, #name, -1, 0, VARF_Deprecated, version } #define DEFINE_DUMMY_FLAG(name, deprec) { DEPF_UNUSED, #name, -1, 0, deprec? VARF_Deprecated:0 } // internal flags. These do not get exposed to actor definitions but scripts need to be able to access them as variables. @@ -210,8 +210,6 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF4, ACTLIKEBRIDGE, AActor, flags4), DEFINE_FLAG(MF4, STRIFEDAMAGE, AActor, flags4), DEFINE_FLAG(MF4, CANUSEWALLS, AActor, flags4), - DEFINE_FLAG(MF4, MISSILEMORE, AActor, flags4), - DEFINE_FLAG(MF4, MISSILEEVENMORE, AActor, flags4), DEFINE_FLAG(MF4, FORCERADIUSDMG, AActor, flags4), DEFINE_FLAG(MF4, DONTFALL, AActor, flags4), DEFINE_FLAG(MF4, SEESDAGGERS, AActor, flags4), @@ -410,6 +408,11 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG2(BOUNCE_NotOnSky, DONTBOUNCEONSKY, AActor, BounceFlags), DEFINE_FLAG2(OF_Transient, NOSAVEGAME, AActor, ObjectFlags), + + // Deprecated flags which need a ZScript workaround. + DEFINE_DEPRECATED_FLAG(MISSILEMORE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(MISSILEEVENMORE, MakeVersion(4, 13, 0)), + }; // These won't be accessible through bitfield variables @@ -417,24 +420,25 @@ static FFlagDef MoreFlagDefs[] = { // Deprecated flags. Handling must be performed in HandleDeprecatedFlags - DEFINE_DEPRECATED_FLAG(FIREDAMAGE), - DEFINE_DEPRECATED_FLAG(ICEDAMAGE), - DEFINE_DEPRECATED_FLAG(LOWGRAVITY), - DEFINE_DEPRECATED_FLAG(SHORTMISSILERANGE), - DEFINE_DEPRECATED_FLAG(LONGMELEERANGE), - DEFINE_DEPRECATED_FLAG(QUARTERGRAVITY), - DEFINE_DEPRECATED_FLAG(FIRERESIST), - DEFINE_DEPRECATED_FLAG(HERETICBOUNCE), - DEFINE_DEPRECATED_FLAG(HEXENBOUNCE), - DEFINE_DEPRECATED_FLAG(DOOMBOUNCE), - DEFINE_DEPRECATED_FLAG(HIGHERMPROB), + // Note: Although deprecated since DECORATE times, they were never actually flagged as deprecated before 4.13.0 and no message was output... + DEFINE_DEPRECATED_FLAG(FIREDAMAGE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(ICEDAMAGE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(LOWGRAVITY, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(SHORTMISSILERANGE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(LONGMELEERANGE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(QUARTERGRAVITY, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(FIRERESIST, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(HERETICBOUNCE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(HEXENBOUNCE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(DOOMBOUNCE, MakeVersion(4, 13, 0)), + DEFINE_DEPRECATED_FLAG(HIGHERMPROB, MakeVersion(4, 13, 0)), // Deprecated flags with no more existing functionality. DEFINE_DUMMY_FLAG(FASTER, true), // obsolete, replaced by 'Fast' state flag DEFINE_DUMMY_FLAG(FASTMELEE, true), // obsolete, replaced by 'Fast' state flag // Deprecated name as an alias - DEFINE_FLAG2_DEPRECATED(MF4_DONTHARMCLASS, DONTHURTSPECIES, AActor, flags4), + DEFINE_FLAG2_DEPRECATED(MF4_DONTHARMCLASS, DONTHURTSPECIES, AActor, flags4, 0), // Various Skulltag flags that are quite irrelevant to ZDoom // [BC] New DECORATE flag defines here. diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index f6cd07335..4969765a7 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -176,7 +176,7 @@ bool ModActorFlag(AActor *actor, const FString &flagname, bool set, bool printer if (fd->structoffset == -1) { - HandleDeprecatedFlags(actor, cls, set, fd->flagbit); + HandleDeprecatedFlags(actor, set, fd->flagbit); } else { @@ -214,7 +214,7 @@ INTBOOL CheckActorFlag(AActor *owner, FFlagDef *fd) { if (fd->structoffset == -1) { - return CheckDeprecatedFlags(owner, owner->GetClass(), fd->flagbit); + return CheckDeprecatedFlags(owner, fd->flagbit); } else #ifdef __BIG_ENDIAN__ @@ -270,65 +270,92 @@ INTBOOL CheckActorFlag(AActor *owner, const char *flagname, bool printerror) // Handles the deprecated flags and sets the respective properties // to appropriate values. This is solely intended for backwards // compatibility so mixing this with code that is aware of the real -// properties is not recommended +// properties is not recommended and may not do what is expected // //=========================================================================== -void HandleDeprecatedFlags(AActor *defaults, PClassActor *info, bool set, int index) +void HandleDeprecatedFlags(AActor *actor, int set, int index) { switch (index) { case DEPF_FIREDAMAGE: - defaults->DamageType = set? NAME_Fire : NAME_None; + actor->DamageType = set? NAME_Fire : NAME_None; break; case DEPF_ICEDAMAGE: - defaults->DamageType = set? NAME_Ice : NAME_None; + actor->DamageType = set? NAME_Ice : NAME_None; break; case DEPF_LOWGRAVITY: - defaults->Gravity = set ? 1. / 8 : 1.; + actor->Gravity = set ? 1. / 8 : 1.; break; case DEPF_SHORTMISSILERANGE: - defaults->maxtargetrange = set? 896. : 0.; + actor->maxtargetrange = set? 896. : 0.; break; case DEPF_LONGMELEERANGE: - defaults->meleethreshold = set? 196. : 0.; + actor->meleethreshold = set? 196. : 0.; break; case DEPF_QUARTERGRAVITY: - defaults->Gravity = set ? 1. / 4 : 1.; + actor->Gravity = set ? 1. / 4 : 1.; break; case DEPF_FIRERESIST: - info->SetDamageFactor(NAME_Fire, set ? 0.5 : 1.); + actor->GetClass()->SetDamageFactor(NAME_Fire, set ? 0.5 : 1.); break; // the bounce flags will set the compatibility bounce modes to remain compatible case DEPF_HERETICBOUNCE: - defaults->BounceFlags &= ~(BOUNCE_TypeMask|BOUNCE_UseSeeSound); - if (set) defaults->BounceFlags |= BOUNCE_HereticCompat; + actor->BounceFlags &= ~(BOUNCE_TypeMask|BOUNCE_UseSeeSound); + if (set) actor->BounceFlags |= BOUNCE_HereticCompat; break; case DEPF_HEXENBOUNCE: - defaults->BounceFlags &= ~(BOUNCE_TypeMask|BOUNCE_UseSeeSound); - if (set) defaults->BounceFlags |= BOUNCE_HexenCompat; + actor->BounceFlags &= ~(BOUNCE_TypeMask|BOUNCE_UseSeeSound); + if (set) actor->BounceFlags |= BOUNCE_HexenCompat; break; case DEPF_DOOMBOUNCE: - defaults->BounceFlags &= ~(BOUNCE_TypeMask|BOUNCE_UseSeeSound); - if (set) defaults->BounceFlags |= BOUNCE_DoomCompat; + actor->BounceFlags &= ~(BOUNCE_TypeMask|BOUNCE_UseSeeSound); + if (set) actor->BounceFlags |= BOUNCE_DoomCompat; break; case DEPF_PICKUPFLASH: if (set) { - defaults->PointerVar(NAME_PickupFlash) = FindClassTentative("PickupFlash", RUNTIME_CLASS(AActor)); + actor->PointerVar(NAME_PickupFlash) = FindClassTentative("PickupFlash", RUNTIME_CLASS(AActor)); } else { - defaults->PointerVar(NAME_PickupFlash) = nullptr; + actor->PointerVar(NAME_PickupFlash) = nullptr; } break; case DEPF_INTERHUBSTRIP: // Old system was 0 or 1, so if the flag is cleared, assume 1. - defaults->IntVar(NAME_InterHubAmount) = set ? 0 : 1; + actor->IntVar(NAME_InterHubAmount) = set ? 0 : 1; break; case DEPF_HIGHERMPROB: - defaults->MinMissileChance = set ? 160 : 200; + actor->MinMissileChance = set ? 160 : 200; break; + case DEPF_MISSILEMORE: + if (set) + { + if (actor->missilechancemult == 0.125) actor->missilechancemult = 0.0625; + else actor->missilechancemult = 0.5; + } + else + { + if (actor->missilechancemult == 0.0625) actor->missilechancemult = 0.125; + else actor->missilechancemult = 1; + } + break; + + case DEPF_MISSILEEVENMORE: + if (set) + { + if (actor->missilechancemult == 0.5) actor->missilechancemult = 0.0625; + else actor->missilechancemult = 0.125; + } + else + { + if (actor->missilechancemult == 0.0625) actor->missilechancemult = 0.5; + else actor->missilechancemult = 1; + } + break; + + default: break; // silence GCC } @@ -344,7 +371,7 @@ void HandleDeprecatedFlags(AActor *defaults, PClassActor *info, bool set, int in // //=========================================================================== -bool CheckDeprecatedFlags(AActor *actor, PClassActor *info, int index) +int CheckDeprecatedFlags(AActor *actor, int index) { // A deprecated flag is false if // a) it hasn't been added here @@ -368,7 +395,7 @@ bool CheckDeprecatedFlags(AActor *actor, PClassActor *info, int index) case DEPF_QUARTERGRAVITY: return actor->Gravity == 1./4; case DEPF_FIRERESIST: - for (auto &df : info->ActorInfo()->DamageFactors) + for (auto &df : actor->GetClass()->ActorInfo()->DamageFactors) { if (df.first == NAME_Fire) return df.second == 0.5; } @@ -387,10 +414,16 @@ bool CheckDeprecatedFlags(AActor *actor, PClassActor *info, int index) return actor->PointerVar(NAME_PickupFlash) == PClass::FindClass(NAME_PickupFlash); case DEPF_INTERHUBSTRIP: - return !(actor->IntVar(NAME_InterHubAmount)); + return actor->IntVar(NAME_InterHubAmount) == 0; case DEPF_HIGHERMPROB: return actor->MinMissileChance <= 160; + + case DEPF_MISSILEMORE: + return actor->missilechancemult == 0.5 || actor->missilechancemult == 0.0625; + + case DEPF_MISSILEEVENMORE: + return actor->missilechancemult == 0.125 || actor->missilechancemult == 0.0625; } return false; // Any entirely unknown flag is not set diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 527bd9178..18cd8aa32 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -2044,6 +2044,7 @@ DEFINE_FIELD(AActor, Species) DEFINE_FIELD(AActor, alternative) DEFINE_FIELD(AActor, goal) DEFINE_FIELD(AActor, MinMissileChance) +DEFINE_FIELD(AActor, missilechancemult) DEFINE_FIELD(AActor, LastLookPlayerNumber) DEFINE_FIELD(AActor, SpawnFlags) DEFINE_FIELD(AActor, meleethreshold) diff --git a/src/scripting/zscript/zcc_compile_doom.cpp b/src/scripting/zscript/zcc_compile_doom.cpp index 4becfc4fe..3563967e5 100644 --- a/src/scripting/zscript/zcc_compile_doom.cpp +++ b/src/scripting/zscript/zcc_compile_doom.cpp @@ -795,13 +795,14 @@ void ZCCDoomCompiler::ProcessDefaultFlag(PClassActor *cls, ZCC_FlagStmt *flg) auto fd = FindFlag(cls, n1, n2, true); if (fd != nullptr) { - if (fd->varflags & VARF_Deprecated) + if ((fd->varflags & VARF_Deprecated) && fd->deprecationVersion <= this->mVersion) { - Warn(flg, "Deprecated flag '%s%s%s' used", n1, n2 ? "." : "", n2 ? n2 : ""); + Warn(flg, "Deprecated flag '%s%s%s' used, deprecated since %d.%d.%d", n1, n2 ? "." : "", n2 ? n2 : "", + fd->deprecationVersion.major, fd->deprecationVersion.minor, fd->deprecationVersion.revision); } if (fd->structoffset == -1) { - HandleDeprecatedFlags((AActor*)cls->Defaults, cls, flg->set, fd->flagbit); + HandleDeprecatedFlags((AActor*)cls->Defaults, flg->set, fd->flagbit); } else { diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index cae1d161b..a29b912c5 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -187,6 +187,7 @@ class Actor : Thinker native native Actor Alternative; native Actor goal; native uint8 MinMissileChance; + native double MissileChanceMult; native int8 LastLookPlayerNumber; native uint SpawnFlags; native double meleethreshold; @@ -339,6 +340,7 @@ class Actor : Thinker native property WeaveIndexXY: WeaveIndexXY; property WeaveIndexZ: WeaveIndexZ; property MinMissileChance: MinMissileChance; + property MissileChanceMult: MissileChanceMult; property MaxStepHeight: MaxStepHeight; property MaxDropoffHeight: MaxDropoffHeight; property MaxSlopeSteepness: MaxSlopeSteepness; diff --git a/wadsrc/static/zscript/actors/doom/cyberdemon.zs b/wadsrc/static/zscript/actors/doom/cyberdemon.zs index d795fc31a..b18861bf9 100644 --- a/wadsrc/static/zscript/actors/doom/cyberdemon.zs +++ b/wadsrc/static/zscript/actors/doom/cyberdemon.zs @@ -16,8 +16,8 @@ class Cyberdemon : Actor PainChance 20; Monster; MinMissileChance 160; + MissileChanceMult 0.5; +BOSS - +MISSILEMORE +FLOORCLIP +NORADIUSDMG +DONTMORPH diff --git a/wadsrc/static/zscript/actors/doom/lostsoul.zs b/wadsrc/static/zscript/actors/doom/lostsoul.zs index 7feb8553b..0712a6d49 100644 --- a/wadsrc/static/zscript/actors/doom/lostsoul.zs +++ b/wadsrc/static/zscript/actors/doom/lostsoul.zs @@ -14,8 +14,9 @@ class LostSoul : Actor Speed 8; Damage 3; PainChance 256; + MissileChanceMult 0.5; Monster; - +FLOAT +NOGRAVITY +MISSILEMORE +DONTFALL +NOICEDEATH +ZDOOMTRANS +RETARGETAFTERSLAM + +FLOAT +NOGRAVITY +DONTFALL +NOICEDEATH +ZDOOMTRANS +RETARGETAFTERSLAM AttackSound "skull/melee"; PainSound "skull/pain"; DeathSound "skull/death"; diff --git a/wadsrc/static/zscript/actors/doom/revenant.zs b/wadsrc/static/zscript/actors/doom/revenant.zs index 36599e3a9..90492727a 100644 --- a/wadsrc/static/zscript/actors/doom/revenant.zs +++ b/wadsrc/static/zscript/actors/doom/revenant.zs @@ -15,7 +15,7 @@ class Revenant : Actor PainChance 100; Monster; MeleeThreshold 196; - +MISSILEMORE + MissileChanceMult 0.5; +FLOORCLIP SeeSound "skeleton/sight"; PainSound "skeleton/pain"; diff --git a/wadsrc/static/zscript/actors/doom/spidermaster.zs b/wadsrc/static/zscript/actors/doom/spidermaster.zs index 3ad0b8846..62701e395 100644 --- a/wadsrc/static/zscript/actors/doom/spidermaster.zs +++ b/wadsrc/static/zscript/actors/doom/spidermaster.zs @@ -13,9 +13,9 @@ class SpiderMastermind : Actor Mass 1000; Speed 12; PainChance 40; + MissileChanceMult 0.5; Monster; +BOSS - +MISSILEMORE +FLOORCLIP +NORADIUSDMG +DONTMORPH diff --git a/wadsrc/static/zscript/actors/heretic/hereticimp.zs b/wadsrc/static/zscript/actors/heretic/hereticimp.zs index 3a938b4ed..5ea8b063e 100644 --- a/wadsrc/static/zscript/actors/heretic/hereticimp.zs +++ b/wadsrc/static/zscript/actors/heretic/hereticimp.zs @@ -13,12 +13,12 @@ class HereticImp : Actor Mass 50; Speed 10; Painchance 200; + MissileChanceMult 0.5; Monster; +FLOAT +NOGRAVITY +SPAWNFLOAT +DONTOVERLAP - +MISSILEMORE SeeSound "himp/sight"; AttackSound "himp/attack"; PainSound "himp/pain"; @@ -159,7 +159,7 @@ class HereticImpLeader : HereticImp { Species "HereticImpLeader"; Health 80; - -MISSILEMORE + MissileChanceMult 1; AttackSound "himp/leaderattack"; } States diff --git a/wadsrc/static/zscript/actors/strife/acolyte.zs b/wadsrc/static/zscript/actors/strife/acolyte.zs index 5aeb0e63a..c86a6e5d3 100644 --- a/wadsrc/static/zscript/actors/strife/acolyte.zs +++ b/wadsrc/static/zscript/actors/strife/acolyte.zs @@ -155,7 +155,7 @@ class AcolyteTan : Acolyte { Default { - +MISSILEMORE +MISSILEEVENMORE + MissileChanceMult 0.0625; DropItem "ClipOfBullets"; } } @@ -166,7 +166,7 @@ class AcolyteRed : Acolyte { Default { - +MISSILEMORE +MISSILEEVENMORE + MissileChanceMult 0.0625; Translation 0; } } @@ -177,7 +177,7 @@ class AcolyteRust : Acolyte { Default { - +MISSILEMORE +MISSILEEVENMORE + MissileChanceMult 0.0625; Translation 1; } } @@ -188,7 +188,7 @@ class AcolyteGray : Acolyte { Default { - +MISSILEMORE +MISSILEEVENMORE + MissileChanceMult 0.0625; Translation 2; } } @@ -199,7 +199,7 @@ class AcolyteDGreen : Acolyte { Default { - +MISSILEMORE +MISSILEEVENMORE + MissileChanceMult 0.0625; Translation 3; } } @@ -210,7 +210,7 @@ class AcolyteGold : Acolyte { Default { - +MISSILEMORE +MISSILEEVENMORE + MissileChanceMult 0.0625; Translation 4; } } @@ -243,7 +243,7 @@ class AcolyteShadow : Acolyte { Default { - +MISSILEMORE + MissileChanceMult 0.5; DropItem "ClipOfBullets"; } States diff --git a/wadsrc/static/zscript/actors/strife/crusader.zs b/wadsrc/static/zscript/actors/strife/crusader.zs index f08d0f847..daee0d2e9 100644 --- a/wadsrc/static/zscript/actors/strife/crusader.zs +++ b/wadsrc/static/zscript/actors/strife/crusader.zs @@ -11,10 +11,10 @@ class Crusader : Actor Mass 400; Health 400; Painchance 128; + MissileChanceMult 0.5; Monster; +FLOORCLIP +DONTMORPH - +MISSILEMORE +INCOMBAT +NOICEDEATH +NOBLOOD diff --git a/wadsrc/static/zscript/actors/strife/sentinel.zs b/wadsrc/static/zscript/actors/strife/sentinel.zs index 0acc8580f..0987cc018 100644 --- a/wadsrc/static/zscript/actors/strife/sentinel.zs +++ b/wadsrc/static/zscript/actors/strife/sentinel.zs @@ -11,6 +11,7 @@ class Sentinel : Actor Radius 23; Height 53; Mass 300; + MissileChanceMult 0.5; Monster; +SPAWNCEILING +NOGRAVITY @@ -18,7 +19,6 @@ class Sentinel : Actor +NOBLOOD +NOBLOCKMONST +INCOMBAT - +MISSILEMORE +LOOKALLAROUND +NEVERRESPAWN MinMissileChance 150; From 3798fd815f7f1c227ec6b9ca522e08fe4f4d0b32 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 3 Oct 2024 12:32:09 +0200 Subject: [PATCH 336/414] the MISSILE(EVEN)MORE flags still need to be accessible by ZScript for backwards compatibility. Since these do not exist anymore an internal interface to Handle/CheckDeprecatedFlags was added. --- src/common/engine/namedef.h | 2 + src/common/scripting/backend/codegen.cpp | 261 ++++++++++++++--------- src/scripting/thingdef_data.cpp | 12 ++ src/scripting/thingdef_properties.cpp | 16 ++ wadsrc/static/zscript/engine/base.zs | 2 + 5 files changed, 190 insertions(+), 103 deletions(-) diff --git a/src/common/engine/namedef.h b/src/common/engine/namedef.h index 7f98beba0..13827382c 100644 --- a/src/common/engine/namedef.h +++ b/src/common/engine/namedef.h @@ -278,6 +278,8 @@ xx(BuiltinNameToClass) xx(BuiltinClassCast) xx(BuiltinFunctionPtrCast) xx(BuiltinFindTranslation) +xx(HandleDeprecatedFlags) +xx(CheckDeprecatedFlags) xx(ScreenJobRunner) xx(Action) diff --git a/src/common/scripting/backend/codegen.cpp b/src/common/scripting/backend/codegen.cpp index 5b1a975a6..b14fb267c 100644 --- a/src/common/scripting/backend/codegen.cpp +++ b/src/common/scripting/backend/codegen.cpp @@ -2828,83 +2828,104 @@ FxExpression *FxAssign::Resolve(FCompileContext &ctx) // Special case: Assignment to a bitfield. IsBitWrite = Base->GetBitValue(); + if (IsBitWrite >= 0x10000) + { + // internal flags - need more here + IsBitWrite &= 0xffff; + } return this; } ExpEmit FxAssign::Emit(VMFunctionBuilder *build) { - static const uint8_t loadops[] = { OP_LK, OP_LKF, OP_LKS, OP_LKP }; - assert(Base->ValueType->GetRegType() == Right->ValueType->GetRegType()); - - ExpEmit pointer = Base->Emit(build); - Address = pointer; - - ExpEmit result; - bool intconst = false; - int intconstval = 0; - - if (Right->isConstant() && Right->ValueType->GetRegType() == REGT_INT) + if (IsBitWrite < 64) { - intconst = true; - intconstval = static_cast(Right)->GetValue().GetInt(); - result.Konst = true; - result.RegType = REGT_INT; - } - else - { - result = Right->Emit(build); - } - assert(result.RegType <= REGT_TYPE); + static const uint8_t loadops[] = { OP_LK, OP_LKF, OP_LKS, OP_LKP }; + assert(Base->ValueType->GetRegType() == Right->ValueType->GetRegType()); - if (pointer.Target) - { - if (result.Konst) + ExpEmit pointer = Base->Emit(build); + Address = pointer; + + ExpEmit result; + bool intconst = false; + int intconstval = 0; + + if (Right->isConstant() && Right->ValueType->GetRegType() == REGT_INT) { - if (intconst) build->EmitLoadInt(pointer.RegNum, intconstval); - else build->Emit(loadops[result.RegType], pointer.RegNum, result.RegNum); + intconst = true; + intconstval = static_cast(Right)->GetValue().GetInt(); + result.Konst = true; + result.RegType = REGT_INT; } else { - build->Emit(Right->ValueType->GetMoveOp(), pointer.RegNum, result.RegNum); + result = Right->Emit(build); } - } - else - { - if (result.Konst) + assert(result.RegType <= REGT_TYPE); + + if (pointer.Target) + { + if (result.Konst) + { + if (intconst) build->EmitLoadInt(pointer.RegNum, intconstval); + else build->Emit(loadops[result.RegType], pointer.RegNum, result.RegNum); + } + else + { + build->Emit(Right->ValueType->GetMoveOp(), pointer.RegNum, result.RegNum); + } + } + else + { + if (result.Konst) + { + ExpEmit temp(build, result.RegType); + if (intconst) build->EmitLoadInt(temp.RegNum, intconstval); + else build->Emit(loadops[result.RegType], temp.RegNum, result.RegNum); + result.Free(build); + result = temp; + } + + if (IsBitWrite == -1) + { + build->Emit(Base->ValueType->GetStoreOp(), pointer.RegNum, result.RegNum, build->GetConstantInt(0)); + } + else + { + build->Emit(OP_SBIT, pointer.RegNum, result.RegNum, 1 << IsBitWrite); + } + } + + if (AddressRequested) { - ExpEmit temp(build, result.RegType); - if (intconst) build->EmitLoadInt(temp.RegNum, intconstval); - else build->Emit(loadops[result.RegType], temp.RegNum, result.RegNum); result.Free(build); - result = temp; + return pointer; } - if (IsBitWrite == -1) - { - build->Emit(Base->ValueType->GetStoreOp(), pointer.RegNum, result.RegNum, build->GetConstantInt(0)); + pointer.Free(build); + + if (intconst) + { //fix int constant return for assignment + return Right->Emit(build); } else { - build->Emit(OP_SBIT, pointer.RegNum, result.RegNum, 1 << IsBitWrite); + return result; } - - } - - if (AddressRequested) - { - result.Free(build); - return pointer; - } - - pointer.Free(build); - - if(intconst) - { //fix int constant return for assignment - return Right->Emit(build); } else { - return result; + VMFunction* callfunc; + auto sym = FindBuiltinFunction(NAME_HandleDeprecatedFlags); + + assert(sym); + callfunc = sym->Variants[0].Implementation; + + FunctionCallEmitter emitters(callfunc); + emitters.AddParameter(build, Base); + emitters.AddParameter(build, Right); + emitters.AddParameterIntConst(IsBitWrite - 64); + return emitters.EmitCall(build); } } @@ -2934,23 +2955,40 @@ FxExpression *FxAssignSelf::Resolve(FCompileContext &ctx) ExpEmit FxAssignSelf::Emit(VMFunctionBuilder *build) { - ExpEmit pointer = Assignment->Address; // FxAssign should have already emitted it - if (!pointer.Target) + if (Assignment->IsBitWrite < 64) { - ExpEmit out(build, ValueType->GetRegType(), ValueType->GetRegCount()); - if (Assignment->IsBitWrite != -1) + ExpEmit pointer = Assignment->Address; // FxAssign should have already emitted it + if (!pointer.Target) { - build->Emit(OP_LBIT, out.RegNum, pointer.RegNum, 1 << Assignment->IsBitWrite); + ExpEmit out(build, ValueType->GetRegType(), ValueType->GetRegCount()); + if (Assignment->IsBitWrite == -1) + { + build->Emit(ValueType->GetLoadOp(), out.RegNum, pointer.RegNum, build->GetConstantInt(0)); + } + else + { + build->Emit(OP_LBIT, out.RegNum, pointer.RegNum, 1 << Assignment->IsBitWrite); + } + return out; } else { - build->Emit(ValueType->GetLoadOp(), out.RegNum, pointer.RegNum, build->GetConstantInt(0)); + return pointer; } - return out; } else { - return pointer; + VMFunction* callfunc; + auto sym = FindBuiltinFunction(NAME_CheckDeprecatedFlags); + + assert(sym); + callfunc = sym->Variants[0].Implementation; + + FunctionCallEmitter emitters(callfunc); + emitters.AddParameter(build, Assignment->Base); + emitters.AddParameterIntConst(Assignment->IsBitWrite - 64); + emitters.AddReturn(REGT_INT); + return emitters.EmitCall(build); } } @@ -7728,56 +7766,73 @@ FxExpression *FxStructMember::Resolve(FCompileContext &ctx) ExpEmit FxStructMember::Emit(VMFunctionBuilder *build) { - ExpEmit obj = classx->Emit(build); - assert(obj.RegType == REGT_POINTER); - - if (obj.Konst) + if (membervar->BitValue < 64 || AddressRequested) { - // If the situation where we are dereferencing a constant - // pointer is common, then it would probably be worthwhile - // to add new opcodes for those. But as of right now, I - // don't expect it to be a particularly common case. - ExpEmit newobj(build, REGT_POINTER); - build->Emit(OP_LKP, newobj.RegNum, obj.RegNum); - obj = newobj; - } + ExpEmit obj = classx->Emit(build); + assert(obj.RegType == REGT_POINTER); - if (membervar->Flags & VARF_Meta) - { - obj.Free(build); - ExpEmit meta(build, REGT_POINTER); - build->Emit(OP_META, meta.RegNum, obj.RegNum); - obj = meta; - } - - if (AddressRequested) - { - if (membervar->Offset == 0) + if (obj.Konst) { - return obj; + // If the situation where we are dereferencing a constant + // pointer is common, then it would probably be worthwhile + // to add new opcodes for those. But as of right now, I + // don't expect it to be a particularly common case. + ExpEmit newobj(build, REGT_POINTER); + build->Emit(OP_LKP, newobj.RegNum, obj.RegNum); + obj = newobj; + } + + if (membervar->Flags & VARF_Meta) + { + obj.Free(build); + ExpEmit meta(build, REGT_POINTER); + build->Emit(OP_META, meta.RegNum, obj.RegNum); + obj = meta; + } + + if (AddressRequested) + { + if (membervar->Offset == 0) + { + return obj; + } + obj.Free(build); + ExpEmit out(build, REGT_POINTER); + build->Emit(OP_ADDA_RK, out.RegNum, obj.RegNum, build->GetConstantInt((int)membervar->Offset)); + return out; + } + + int offsetreg = build->GetConstantInt((int)membervar->Offset); + ExpEmit loc(build, membervar->Type->GetRegType(), membervar->Type->GetRegCount()); + + if (membervar->BitValue == -1) + { + build->Emit(membervar->Type->GetLoadOp(), loc.RegNum, obj.RegNum, offsetreg); + } + else + { + ExpEmit out(build, REGT_POINTER); + build->Emit(OP_ADDA_RK, out.RegNum, obj.RegNum, offsetreg); + build->Emit(OP_LBIT, loc.RegNum, out.RegNum, 1 << membervar->BitValue); + out.Free(build); } obj.Free(build); - ExpEmit out(build, REGT_POINTER); - build->Emit(OP_ADDA_RK, out.RegNum, obj.RegNum, build->GetConstantInt((int)membervar->Offset)); - return out; - } - - int offsetreg = build->GetConstantInt((int)membervar->Offset); - ExpEmit loc(build, membervar->Type->GetRegType(), membervar->Type->GetRegCount()); - - if (membervar->BitValue == -1) - { - build->Emit(membervar->Type->GetLoadOp(), loc.RegNum, obj.RegNum, offsetreg); + return loc; } else { - ExpEmit out(build, REGT_POINTER); - build->Emit(OP_ADDA_RK, out.RegNum, obj.RegNum, offsetreg); - build->Emit(OP_LBIT, loc.RegNum, out.RegNum, 1 << membervar->BitValue); - out.Free(build); + VMFunction* callfunc; + auto sym = FindBuiltinFunction(NAME_CheckDeprecatedFlags); + + assert(sym); + callfunc = sym->Variants[0].Implementation; + + FunctionCallEmitter emitters(callfunc); + emitters.AddParameter(build, classx); + emitters.AddParameterIntConst(membervar->BitValue - 64); + emitters.AddReturn(REGT_INT); + return emitters.EmitCall(build); } - obj.Free(build); - return loc; } diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 8f19bab54..129c06b78 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -920,6 +920,18 @@ void SynthesizeFlagFields() { cls->VMType->AddNativeField(FStringf("b%s", fl.Defs[i].name), (fl.Defs[i].fieldsize == 4 ? TypeSInt32 : TypeSInt16), fl.Defs[i].structoffset, fl.Defs[i].varflags, fl.Defs[i].flagbit); } + else if (fl.Defs[i].flagbit == DEPF_MISSILEMORE || fl.Defs[i].flagbit == DEPF_MISSILEEVENMORE) // these need script side emulation because they have been around for many years. + { + auto field = cls->VMType->AddNativeField(FStringf("b%s", fl.Defs[i].name), TypeSInt32, 0, VARF_Native); + if (field) + { + // these are deprecated so flag accordingly with a proper message. + field->DeprecationMessage = "Use missilechancemult property instead"; + field->mVersion = MakeVersion(4, 13, 0); + field->Flags |= VARF_Deprecated; + field->BitValue = fl.Defs[i].flagbit + 64; + } + } } } } diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index 4969765a7..2154f4db5 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -361,6 +361,15 @@ void HandleDeprecatedFlags(AActor *actor, int set, int index) } } +// the interface here works on object, but currently all deprecated flags affect subclasses of Actor only +DEFINE_ACTION_FUNCTION_NATIVE(DObject, HandleDeprecatedFlags, HandleDeprecatedFlags) +{ + PARAM_SELF_PROLOGUE(AActor); + PARAM_INT(set); + PARAM_INT(index); + HandleDeprecatedFlags(self, set, index); + return 0; +} //=========================================================================== // // CheckDeprecatedFlags @@ -429,6 +438,13 @@ int CheckDeprecatedFlags(AActor *actor, int index) return false; // Any entirely unknown flag is not set } +DEFINE_ACTION_FUNCTION_NATIVE(DObject, CheckDeprecatedFlags, CheckDeprecatedFlags) +{ + PARAM_SELF_PROLOGUE(AActor); + PARAM_INT(index); + ACTION_RETURN_INT(CheckDeprecatedFlags(self, index)); +} + //========================================================================== // // diff --git a/wadsrc/static/zscript/engine/base.zs b/wadsrc/static/zscript/engine/base.zs index c4322918f..18fe1b363 100644 --- a/wadsrc/static/zscript/engine/base.zs +++ b/wadsrc/static/zscript/engine/base.zs @@ -760,6 +760,8 @@ class Object native private native static Class BuiltinNameToClass(Name nm, Class filter); private native static Object BuiltinClassCast(Object inptr, Class test); private native static Function BuiltinFunctionPtrCast(Function inptr, voidptr newtype); + private native static void HandleDeprecatedFlags(Object obj, bool set, int index); + private native static bool CheckDeprecatedFlags(Object obj, int index); native static uint MSTime(); native static double MSTimeF(); From b06649097f9b403f3e8cc5d9c565b84c214affae Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 3 Oct 2024 16:55:01 +0200 Subject: [PATCH 337/414] Use inverse square distance attenuation for PBR materials --- .../static/shaders/scene/lightmodel_pbr.glsl | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index 317aaf6a2..7c7f252a8 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -45,23 +45,22 @@ vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0); } -float quadraticDistanceAttenuation(vec4 lightpos) -{ - float strength = (1.0 + lightpos.w * lightpos.w * 0.25) * 0.5; - - vec3 distVec = lightpos.xyz - pixelpos.xyz; - float attenuation = strength / (1.0 + dot(distVec, distVec)); - if (attenuation <= 1.0 / 256.0) return 0.0; - - return attenuation; -} - float linearDistanceAttenuation(vec4 lightpos) { float lightdistance = distance(lightpos.xyz, pixelpos.xyz); return clamp((lightpos.w - lightdistance) / lightpos.w, 0.0, 1.0); } +float inverseSquareDistanceAttenuation(vec4 lightpos) +{ + float strength = 1500.0; + float d = distance(lightpos.xyz, pixelpos.xyz); + float r = lightpos.w; + float a = d / r; + float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); + return (b * b) / (d * d + 1.0) * strength; +} + vec3 ProcessMaterialLight(Material material, vec3 ambientLight) { vec3 worldpos = pixelpos.xyz; @@ -97,7 +96,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = linearDistanceAttenuation(lightpos); + float attenuation = inverseSquareDistanceAttenuation(lightpos); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); if (lightcolor.a < 0.0) From b667b930a3247b3f5240148dfab15a37ef8902da Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 3 Oct 2024 22:30:09 +0200 Subject: [PATCH 338/414] fixed logic bug with HitFriend and Refire functions. The old code was essentially ineffective and useless, this is how MBF had it and how it was supposed to be. --- wadsrc/static/zscript/actors/doom/possessed.zs | 6 +++++- wadsrc/static/zscript/actors/doom/spidermaster.zs | 6 +++++- wadsrc/static/zscript/actors/strife/sentinel.zs | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/wadsrc/static/zscript/actors/doom/possessed.zs b/wadsrc/static/zscript/actors/doom/possessed.zs index 4fa9e0f7e..26966e1f0 100644 --- a/wadsrc/static/zscript/actors/doom/possessed.zs +++ b/wadsrc/static/zscript/actors/doom/possessed.zs @@ -342,12 +342,16 @@ extend class Actor void A_CPosRefire() { + if (HitFriend()) + { + SetState(SeeState); + return; + } // keep firing unless target got out of sight A_FaceTarget(); if (Random[CPosRefire](0, 255) >= 40) { if (!target - || HitFriend() || target.health <= 0 || !CheckSight(target, SF_SEEPASTBLOCKEVERYTHING|SF_SEEPASTSHOOTABLELINES)) { diff --git a/wadsrc/static/zscript/actors/doom/spidermaster.zs b/wadsrc/static/zscript/actors/doom/spidermaster.zs index 62701e395..c2685f480 100644 --- a/wadsrc/static/zscript/actors/doom/spidermaster.zs +++ b/wadsrc/static/zscript/actors/doom/spidermaster.zs @@ -73,12 +73,16 @@ extend class Actor { void A_SpidRefire() { + if (HitFriend()) + { + SetState(SeeState); + return; + } // keep firing unless target got out of sight A_FaceTarget(); if (Random[CPosRefire](0, 255) >= 10) { if (!target - || HitFriend() || target.health <= 0 || !CheckSight(target, SF_SEEPASTBLOCKEVERYTHING|SF_SEEPASTSHOOTABLELINES)) { diff --git a/wadsrc/static/zscript/actors/strife/sentinel.zs b/wadsrc/static/zscript/actors/strife/sentinel.zs index 0987cc018..84b9c3f0c 100644 --- a/wadsrc/static/zscript/actors/strife/sentinel.zs +++ b/wadsrc/static/zscript/actors/strife/sentinel.zs @@ -164,13 +164,17 @@ extend class Actor void A_SentinelRefire() { A_FaceTarget (); + if (HitFriend()) + { + SetState(SeeState); + return; + } if (random[SentinelRefire]() >= 30) { if (target == NULL || target.health <= 0 || !CheckSight (target, SF_SEEPASTBLOCKEVERYTHING|SF_SEEPASTSHOOTABLELINES) || - HitFriend() || (MissileState == NULL && !CheckMeleeRange()) || random[SentinelRefire]() < 40) { From 6aa71184f790be7b9bf02ed5f3a2da2fc4dd5d0e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 3 Oct 2024 23:01:09 +0200 Subject: [PATCH 339/414] fixed: MBF21's flag functions did not call the special wrappers for MF_FRIENDLY. --- src/gamedata/d_dehacked.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index e10f78dfb..69874529b 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -3961,6 +3961,7 @@ void SetFriendly(AActor* a) { if (a->CountsAsKill() && a->health > 0) a->Level->total_monsters--; a->flags |= MF_FRIENDLY; + a->flags3 |= MF3_NOBLOCKMONST; if (a->CountsAsKill() && a->health > 0) a->Level->total_monsters++; } @@ -3968,6 +3969,7 @@ void ClearFriendly(AActor* a) { if (a->CountsAsKill() && a->health > 0) a->Level->total_monsters--; a->flags &= ~MF_FRIENDLY; + a->flags3 &= ~MF3_NOBLOCKMONST; if (a->CountsAsKill() && a->health > 0) a->Level->total_monsters++; } @@ -4123,7 +4125,7 @@ static FlagHandler flag1handlers[32] = { { SetTranslation2, ClearTranslation2, CheckTranslation2 }, F6(MF6_TOUCHY), { SetBounces, ClearBounces, [](AActor* a)->bool { return a->BounceFlags & BOUNCE_DEH; } }, - F(MF_FRIENDLY), + { SetFriendly, ClearFriendly, [](AActor* a)->bool { return a->flags & MF_FRIENDLY; } }, { SetTranslucent, ClearTranslucent, CheckTranslucent }, }; From 7df842bbed69b57308f42e7544d2623ff0639164 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 4 Oct 2024 02:46:07 +0200 Subject: [PATCH 340/414] Add the shaders needed to create convoluted PBR maps --- src/CMakeLists.txt | 1 + .../rendering/vulkan/vk_lightprober.cpp | 426 ++++++++++++++++++ src/common/rendering/vulkan/vk_lightprober.h | 88 ++++ wadsrc/static/bdrf.lut | Bin 0 -> 1048576 bytes .../lightprobe/comp_brdf_convolute.glsl | 109 +++++ .../lightprobe/comp_irradiance_convolute.glsl | 50 ++ .../lightprobe/comp_prefilter_convolute.glsl | 87 ++++ 7 files changed, 761 insertions(+) create mode 100644 src/common/rendering/vulkan/vk_lightprober.cpp create mode 100644 src/common/rendering/vulkan/vk_lightprober.h create mode 100644 wadsrc/static/bdrf.lut create mode 100644 wadsrc/static/shaders/lightprobe/comp_brdf_convolute.glsl create mode 100644 wadsrc/static/shaders/lightprobe/comp_irradiance_convolute.glsl create mode 100644 wadsrc/static/shaders/lightprobe/comp_prefilter_convolute.glsl diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 54647c13c..1352bfa92 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -739,6 +739,7 @@ set (VULKAN_SOURCES common/rendering/vulkan/vk_pprenderstate.cpp common/rendering/vulkan/vk_levelmesh.cpp common/rendering/vulkan/vk_lightmapper.cpp + common/rendering/vulkan/vk_lightprober.cpp common/rendering/vulkan/commands/vk_commandbuffer.cpp common/rendering/vulkan/buffers/vk_rsbuffers.cpp common/rendering/vulkan/buffers/vk_hwbuffer.cpp diff --git a/src/common/rendering/vulkan/vk_lightprober.cpp b/src/common/rendering/vulkan/vk_lightprober.cpp new file mode 100644 index 000000000..a58d1fc39 --- /dev/null +++ b/src/common/rendering/vulkan/vk_lightprober.cpp @@ -0,0 +1,426 @@ + +#include "vk_lightprober.h" +#include "vulkan/vk_renderdevice.h" +#include "vulkan/textures/vk_texture.h" +#include "vulkan/commands/vk_commandbuffer.h" +#include "vulkan/descriptorsets/vk_descriptorset.h" +#include "zvulkan/vulkanbuilders.h" +#include "filesystem.h" +#include "cmdlib.h" + +VkLightprober::VkLightprober(VulkanRenderDevice* fb) : fb(fb) +{ + CreateIrradianceMap(); + CreatePrefilterMap(); +} + +VkLightprober::~VkLightprober() +{ +} + +void VkLightprober::CreateBrdfLutResources() +{ + brdfLut.shader = CompileShader("comp_brdf_convolute.glsl", "shaders/lightprobe/comp_brdf_convolute.glsl", "VkLightprober.BrdfLut"); + + brdfLut.descriptorSetLayout = DescriptorSetLayoutBuilder() + .AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .Create(fb->GetDevice()); + + brdfLut.pipelineLayout = PipelineLayoutBuilder() + .AddSetLayout(brdfLut.descriptorSetLayout.get()) + .Create(fb->GetDevice()); + + brdfLut.pipeline = ComputePipelineBuilder() + .ComputeShader(brdfLut.shader.get()) + .Layout(brdfLut.pipelineLayout.get()) + .Create(fb->GetDevice()); + + brdfLut.descriptorPool = DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1) + .MaxSets(1) + .Create(fb->GetDevice()); + + brdfLut.descriptorSet = brdfLut.descriptorPool->allocate(brdfLut.descriptorSetLayout.get()); + + brdfLut.image = ImageBuilder() + .Size(512, 512) + .Format(VK_FORMAT_R16G16_SFLOAT) + .Usage(VK_IMAGE_USAGE_STORAGE_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT) + .Create(fb->GetDevice()); + + brdfLut.view = ImageViewBuilder() + .Image(brdfLut.image.get(), VK_FORMAT_R16G16_SFLOAT) + .Create(fb->GetDevice()); + + WriteDescriptors() + .AddStorageImage(brdfLut.descriptorSet.get(), 0, brdfLut.view.get(), VK_IMAGE_LAYOUT_GENERAL) + .Execute(fb->GetDevice()); +} + +void VkLightprober::GenerateBrdfLut() +{ + auto staging = BufferBuilder() + .Size(512 * 512 * 2 * sizeof(uint16_t)) + .Usage(VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_GPU_TO_CPU) + .Create(fb->GetDevice()); + + auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); + + PipelineBarrier() + .AddImage(brdfLut.image.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, 0, VK_ACCESS_SHADER_WRITE_BIT) + .Execute(cmdbuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + + cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, brdfLut.pipeline.get()); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, brdfLut.pipelineLayout.get(), 0, brdfLut.descriptorSet.get()); + cmdbuffer->dispatch(512, 512, 1); + + PipelineBarrier() + .AddImage(brdfLut.image.get(), VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT) + .Execute(cmdbuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + + VkBufferImageCopy region = {}; + region.imageExtent.width = brdfLut.image->width; + region.imageExtent.height = brdfLut.image->height; + region.imageExtent.depth = 1; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.layerCount = 1; + cmdbuffer->copyImageToBuffer(brdfLut.image->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, staging->buffer, 1, ®ion); + + fb->GetCommands()->WaitForCommands(false); + + std::vector databuffer(512 * 512 * 2); + auto src = staging->Map(0, databuffer.size() * sizeof(uint16_t)); + memcpy(databuffer.data(), src, databuffer.size()); + staging->Unmap(); + + std::unique_ptr file(FileWriter::Open("bdrf.lut")); + file->Write(databuffer.data(), databuffer.size() * sizeof(uint16_t)); +} + +void VkLightprober::CreateIrradianceMap() +{ + irradianceMap.shader = CompileShader("comp_irradiance_convolute.glsl", "shaders/lightprobe/comp_irradiance_convolute.glsl", "VkLightprober.IrradianceMap"); + + irradianceMap.descriptorSetLayout = DescriptorSetLayoutBuilder() + .AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .Create(fb->GetDevice()); + + irradianceMap.descriptorSetLayout = DescriptorSetLayoutBuilder() + .AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .Create(fb->GetDevice()); + + irradianceMap.pipelineLayout = PipelineLayoutBuilder() + .AddSetLayout(irradianceMap.descriptorSetLayout.get()) + .AddPushConstantRange(VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(IrradianceMapPushConstants)) + .Create(fb->GetDevice()); + + irradianceMap.pipeline = ComputePipelineBuilder() + .ComputeShader(irradianceMap.shader.get()) + .Layout(irradianceMap.pipelineLayout.get()) + .Create(fb->GetDevice()); + + irradianceMap.sampler = SamplerBuilder() + .Create(fb->GetDevice()); + + irradianceMap.descriptorPool = DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 6) + .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6) + .MaxSets(6) + .Create(fb->GetDevice()); + + for (int i = 0; i < 6; i++) + { + irradianceMap.images[i] = ImageBuilder() + .Size(32, 32) + .Format(VK_FORMAT_R16G16B16A16_SFLOAT) + .Usage(VK_IMAGE_USAGE_STORAGE_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT) + .Create(fb->GetDevice()); + + irradianceMap.views[i] = ImageViewBuilder() + .Image(irradianceMap.images[i].get(), VK_FORMAT_R16G16B16A16_SFLOAT) + .Create(fb->GetDevice()); + + irradianceMap.descriptorSets[i] = irradianceMap.descriptorPool->allocate(irradianceMap.descriptorSetLayout.get()); + } +} + +void VkLightprober::GenerateIrradianceMap(VulkanImageView* environmentcubemap) +{ + auto staging = BufferBuilder() + .Size(32 * 32 * 8 * 6) + .Usage(VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_GPU_TO_CPU) + .Create(fb->GetDevice()); + + WriteDescriptors write; + for (int i = 0; i < 6; i++) + { + write.AddStorageImage(irradianceMap.descriptorSets[i].get(), 0, irradianceMap.views[i].get(), VK_IMAGE_LAYOUT_GENERAL); + write.AddCombinedImageSampler(irradianceMap.descriptorSets[i].get(), 1, environmentcubemap, irradianceMap.sampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + } + write.Execute(fb->GetDevice()); + + auto cmdbuffer = fb->GetCommands()->GetDrawCommands(); + + PipelineBarrier barrier0; + for (int i = 0; i < 6; i++) + barrier0.AddImage(irradianceMap.images[i].get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, 0, VK_ACCESS_SHADER_WRITE_BIT); + barrier0.Execute(cmdbuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + + cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, irradianceMap.pipeline.get()); + + // +x, +y, +z, -x, -y, -z + + FVector3 dir[6] = { + FVector3( 1.0f, 0.0f, 0.0f), + FVector3( 0.0f, 1.0f, 0.0f), + FVector3( 0.0f, 0.0f, 1.0f), + FVector3(-1.0f, 0.0f, 0.0f), + FVector3( 0.0f, -1.0f, 0.0f), + FVector3( 0.0f, 0.0f, -1.0f) + }; + + FVector3 up[6] = { + FVector3(0.0f, -1.0f, 0.0f), + FVector3(0.0f, 0.0f, 1.0f), + FVector3(0.0f, -1.0f, 0.0f), + FVector3(0.0f, -1.0f, 0.0f), + FVector3(0.0f, 0.0f, -1.0f), + FVector3(0.0f, -1.0f, 0.0f) + }; + + for (int i = 0; i < 6; i++) + { + FVector3 side = dir[i] ^ up[i]; + + IrradianceMapPushConstants push; + push.topLeft = FVector4(dir[i] - up[i] - side, 0.0f); + push.bottomRight = FVector4(dir[i] + up[i] + side, 0.0f); + + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, irradianceMap.pipelineLayout.get(), 0, irradianceMap.descriptorSets[i].get()); + cmdbuffer->pushConstants(irradianceMap.pipelineLayout.get(), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, sizeof(PushConstants), &push); + cmdbuffer->dispatch(32, 32, 1); + } + + PipelineBarrier barrier1; + for (int i = 0; i < 6; i++) + barrier1.AddImage(irradianceMap.images[i].get(), VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); + barrier1.Execute(cmdbuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + + for (int i = 0; i < 6; i++) + { + VkBufferImageCopy region = { }; + region.bufferOffset = 32 * 32 * 8 * i; + region.imageExtent.width = irradianceMap.images[i]->width; + region.imageExtent.height = irradianceMap.images[i]->height; + region.imageExtent.depth = 1; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.layerCount = 1; + cmdbuffer->copyImageToBuffer(irradianceMap.images[i]->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, staging->buffer, 1, ®ion); + } + + fb->GetCommands()->WaitForCommands(false); + + std::vector databuffer(32 * 32 * 8 * 6); + auto src = staging->Map(0, databuffer.size()); + memcpy(databuffer.data(), src, databuffer.size()); + staging->Unmap(); +} + +void VkLightprober::CreatePrefilterMap() +{ + prefilterMap.shader = CompileShader("comp_prefilter_convolute.glsl", "shaders/lightprobe/comp_prefilter_convolute.glsl", "VkLightprober.PrefilterMap"); + + prefilterMap.descriptorSetLayout = DescriptorSetLayoutBuilder() + .AddBinding(0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .AddBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT) + .Create(fb->GetDevice()); + + prefilterMap.pipelineLayout = PipelineLayoutBuilder() + .AddSetLayout(prefilterMap.descriptorSetLayout.get()) + .AddPushConstantRange(VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(PrefilterMapPushConstants)) + .Create(fb->GetDevice()); + + prefilterMap.pipeline = ComputePipelineBuilder() + .ComputeShader(prefilterMap.shader.get()) + .Layout(prefilterMap.pipelineLayout.get()) + .Create(fb->GetDevice()); + + prefilterMap.sampler = SamplerBuilder() + .Create(fb->GetDevice()); + + prefilterMap.descriptorPool = DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 6 * prefilterMap.maxlevels) + .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6 * prefilterMap.maxlevels) + .MaxSets(6 * prefilterMap.maxlevels) + .Create(fb->GetDevice()); + + for (int i = 0; i < 6; i++) + { + for (int level = 0; level < prefilterMap.maxlevels; level++) + { + int idx = i * prefilterMap.maxlevels + level; + + prefilterMap.images[idx] = ImageBuilder() + .Size(128 >> level, 128 >> level) + .Format(VK_FORMAT_R16G16B16A16_SFLOAT) + .Usage(VK_IMAGE_USAGE_STORAGE_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT) + .Create(fb->GetDevice()); + + prefilterMap.views[idx] = ImageViewBuilder() + .Image(prefilterMap.images[idx].get(), VK_FORMAT_R16G16B16A16_SFLOAT) + .Create(fb->GetDevice()); + + prefilterMap.descriptorSets[idx] = prefilterMap.descriptorPool->allocate(prefilterMap.descriptorSetLayout.get()); + } + } +} + +void VkLightprober::GeneratePrefilterMap(VulkanImageView* environmentcubemap) +{ + auto staging = BufferBuilder() + .Size(prefilterMap.levelsSize * 6) + .Usage(VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_GPU_TO_CPU) + .Create(fb->GetDevice()); + + WriteDescriptors write; + for (int i = 0; i < 6 * prefilterMap.maxlevels; i++) + { + write.AddStorageImage(prefilterMap.descriptorSets[i].get(), 0, prefilterMap.views[i].get(), VK_IMAGE_LAYOUT_GENERAL); + write.AddCombinedImageSampler(prefilterMap.descriptorSets[i].get(), 1, environmentcubemap, prefilterMap.sampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + } + write.Execute(fb->GetDevice()); + + auto cmdbuffer = fb->GetCommands()->GetDrawCommands(); + + PipelineBarrier barrier0; + for (int i = 0; i < 6 * prefilterMap.maxlevels; i++) + barrier0.AddImage(prefilterMap.images[i].get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, 0, VK_ACCESS_SHADER_WRITE_BIT); + barrier0.Execute(cmdbuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + + cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, prefilterMap.pipeline.get()); + + // +x, +y, +z, -x, -y, -z + + FVector3 dir[6] = { + FVector3( 1.0f, 0.0f, 0.0f), + FVector3( 0.0f, 1.0f, 0.0f), + FVector3( 0.0f, 0.0f, 1.0f), + FVector3(-1.0f, 0.0f, 0.0f), + FVector3( 0.0f, -1.0f, 0.0f), + FVector3( 0.0f, 0.0f, -1.0f) + }; + + FVector3 up[6] = { + FVector3(0.0f, -1.0f, 0.0f), + FVector3(0.0f, 0.0f, 1.0f), + FVector3(0.0f, -1.0f, 0.0f), + FVector3(0.0f, -1.0f, 0.0f), + FVector3(0.0f, 0.0f, -1.0f), + FVector3(0.0f, -1.0f, 0.0f) + }; + + for (int i = 0; i < 6; i++) + { + FVector3 side = dir[i] ^ up[i]; + + PrefilterMapPushConstants push; + push.topLeft = FVector4(dir[i] - up[i] - side, 0.0f); + push.bottomRight = FVector4(dir[i] + up[i] + side, 0.0f); + + for (int level = 0; level < prefilterMap.maxlevels; level++) + { + push.roughness = (float)level / (float)(prefilterMap.maxlevels - 1); + + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, prefilterMap.pipelineLayout.get(), 0, prefilterMap.descriptorSets[i * prefilterMap.maxlevels + level].get()); + cmdbuffer->pushConstants(prefilterMap.pipelineLayout.get(), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, sizeof(PrefilterMapPushConstants), &push); + cmdbuffer->dispatch(128 >> level, 128 >> level, 1); + } + } + + PipelineBarrier barrier1; + for (int i = 0; i < 6 * prefilterMap.maxlevels; i++) + barrier1.AddImage(prefilterMap.images[i].get(), VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); + barrier1.Execute(cmdbuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + + int offset = 0; + for (int i = 0; i < 6 * prefilterMap.maxlevels; i++) + { + VkBufferImageCopy region = { }; + region.bufferOffset = offset; + region.imageExtent.width = prefilterMap.images[i]->width; + region.imageExtent.height = prefilterMap.images[i]->height; + region.imageExtent.depth = 1; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.layerCount = 1; + cmdbuffer->copyImageToBuffer(prefilterMap.images[i]->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, staging->buffer, 1, ®ion); + + offset += prefilterMap.images[i]->width * prefilterMap.images[i]->height * 8; + } + + fb->GetCommands()->WaitForCommands(false); + + std::vector databuffer(prefilterMap.levelsSize * 6); + auto src = staging->Map(0, databuffer.size()); + memcpy(databuffer.data(), src, databuffer.size()); + staging->Unmap(); +} + +std::unique_ptr VkLightprober::CompileShader(const std::string& name, const std::string& filename, const char* debugName) +{ + std::string prefix = "#version 460\r\n"; + prefix += "#extension GL_GOOGLE_include_directive : enable\n"; + prefix += "#extension GL_ARB_separate_shader_objects : enable\n"; + + auto onIncludeLocal = [](std::string headerName, std::string includerName, size_t depth) { return OnInclude(headerName.c_str(), includerName.c_str(), depth, false); }; + auto onIncludeSystem = [](std::string headerName, std::string includerName, size_t depth) { return OnInclude(headerName.c_str(), includerName.c_str(), depth, true); }; + + return ShaderBuilder() + .Type(ShaderType::Compute) + .AddSource("VersionBlock", prefix) + .AddSource(name, LoadPrivateShaderLump(filename.c_str()).GetChars()) + .OnIncludeLocal(onIncludeLocal) + .OnIncludeSystem(onIncludeSystem) + .DebugName(debugName) + .Create(debugName, fb->GetDevice()); +} + +FString VkLightprober::LoadPrivateShaderLump(const char* lumpname) +{ + int lump = fileSystem.CheckNumForFullName(lumpname, 0); + if (lump == -1) I_Error("Unable to load '%s'", lumpname); + return GetStringFromLump(lump); +} + +FString VkLightprober::LoadPublicShaderLump(const char* lumpname) +{ + int lump = fileSystem.CheckNumForFullName(lumpname, 0); + if (lump == -1) lump = fileSystem.CheckNumForFullName(lumpname); + if (lump == -1) I_Error("Unable to load '%s'", lumpname); + return GetStringFromLump(lump); +} + +ShaderIncludeResult VkLightprober::OnInclude(FString headerName, FString includerName, size_t depth, bool system) +{ + if (depth > 8) + I_Error("Too much include recursion!"); + + FString includeguardname; + includeguardname << "_HEADERGUARD_" << headerName.GetChars(); + includeguardname.ReplaceChars("/\\.", '_'); + + FString code; + code << "#ifndef " << includeguardname.GetChars() << "\n"; + code << "#define " << includeguardname.GetChars() << "\n"; + code << "#line 1\n"; + + if (system) + code << LoadPrivateShaderLump(headerName.GetChars()).GetChars() << "\n"; + else + code << LoadPublicShaderLump(headerName.GetChars()).GetChars() << "\n"; + + code << "#endif\n"; + + return ShaderIncludeResult(headerName.GetChars(), code.GetChars()); +} diff --git a/src/common/rendering/vulkan/vk_lightprober.h b/src/common/rendering/vulkan/vk_lightprober.h new file mode 100644 index 000000000..89bf86f76 --- /dev/null +++ b/src/common/rendering/vulkan/vk_lightprober.h @@ -0,0 +1,88 @@ +#pragma once + +#include "zvulkan/vulkanobjects.h" +#include "vectors.h" + +class VulkanRenderDevice; +class FString; +class ShaderIncludeResult; + +struct IrradianceMapPushConstants +{ + FVector4 topLeft; + FVector4 bottomRight; +}; + +struct PrefilterMapPushConstants +{ + FVector4 topLeft; + FVector4 bottomRight; + float roughness; + float padding1, padding2, padding3; +}; + +class VkLightprober +{ +public: + VkLightprober(VulkanRenderDevice* fb); + ~VkLightprober(); + +private: + void CreateBrdfLutResources(); + void CreateIrradianceMap(); + void CreatePrefilterMap(); + void GenerateBrdfLut(); + void GenerateIrradianceMap(VulkanImageView* environmentcubemap); + void GeneratePrefilterMap(VulkanImageView* environmentcubemap); + + std::unique_ptr CompileShader(const std::string& name, const std::string& filename, const char* debugName); + + static FString LoadPrivateShaderLump(const char* lumpname); + static FString LoadPublicShaderLump(const char* lumpname); + static ShaderIncludeResult OnInclude(FString headerName, FString includerName, size_t depth, bool system); + + struct + { + std::unique_ptr shader; + std::unique_ptr descriptorSetLayout; + std::unique_ptr descriptorPool; + std::unique_ptr descriptorSet; + std::unique_ptr pipelineLayout; + std::unique_ptr pipeline; + std::unique_ptr image; + std::unique_ptr view; + } brdfLut; + + struct + { + std::unique_ptr shader; + std::unique_ptr descriptorSetLayout; + std::unique_ptr descriptorPool; + std::unique_ptr descriptorSets[6]; + std::unique_ptr pipelineLayout; + std::unique_ptr pipeline; + std::unique_ptr sampler; + std::unique_ptr images[6]; + std::unique_ptr views[6]; + } irradianceMap; + + struct + { + enum + { + maxlevels = 5, + levelsSize = (128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8) * 8 + }; + std::unique_ptr shader; + std::unique_ptr descriptorSetLayout; + std::unique_ptr descriptorPool; + std::unique_ptr descriptorSets[6 * maxlevels]; + std::unique_ptr pipelineLayout; + std::unique_ptr pipeline; + std::unique_ptr sampler; + std::unique_ptr images[6 * maxlevels]; + std::unique_ptr views[6 * maxlevels]; + } prefilterMap; + + VulkanRenderDevice* fb = nullptr; +}; diff --git a/wadsrc/static/bdrf.lut b/wadsrc/static/bdrf.lut new file mode 100644 index 0000000000000000000000000000000000000000..22f4a3fb7a1f6eee65f99624b53b9e225c82b7f4 GIT binary patch literal 1048576 zcmZRT{bF6J{LtD!?VNRh#xCnN&E?j+w5C|U)^4=!)ycC~){VB_q3dDoqi1G)Ur)ul zKwr?B!Qj7@hrwH`euFz!R}D^CNgM98N-$h*wbXE$)l0)xD_x@!s{*5BtIbBiR$q;r ztjvs!tjdj*taca+T75TWvXVCWWNB^k$TG_0l4YgIVaw?zTP(MkEU~;|GS%{vNt-3V zX@#Y(X{M!@X_RHUsgGr|sh#BlQ+>-lrizv~Ooc7Kn6g^(oBgoRGJ9p=YIfHm!R)+6 zmDwSSsb*U()|;)cIB7Q9;*nXO#UHaq3sLh@3qA7;3peu^i+J+@i*j=pi+*zpi{<7z z7W>T=EUuZ0SiCdmuwb(IWzK8y#9Y$ithtKCc5{7;1?E;3UFNP9CFTJZ@#fJMp600* zCguee^5#_*T;?qn-^}_g9-7UxIBT}pVyD?!i=}4UEhd^Bu&6UTWszle#UkA7u7!)) za|=VW4;J!fKP`C7m@I#pa$CMI6|uZ#Dr}d7F$ldCpk+0P$qhPDeMiEwX zjN+_XjZ&=gjWVqwjq?Dl^HI#N-|tytniJ*6VeBtY_%@TQ}(jS!e5pT8HXJSljDH zS!?OWT8rw&TQle;S-;jvwZ5*CZhcrM%X+;|j`eJvJnIgfLhDkUV(TQGGHZXG3Ts=P zDr;?>8f!_NdTVx_M(a1)&DN*1Tdh}Uw_CSqcUq@vcU!w^_gbrJ_gk}SPqcofHQD;O z)>P}2TGOq&wPsr9Y0a_@)S6>$qBYN2LTiEbAI*i<4>cECAJbfFy;^gb^+e4T*5#V3 ztYbA-Tf1nkwbs#GXDzI`!TPtxM(f8Ko2}1iY_Z;|vCVqE#&+utjUCoS8oR7xHFjIO zYwWQ$(%5G$r?KCfOXGm`8})kgGW*7+)Tt;1CAS=*`HvsP2NZ_TIj!1}%N z1M5S|53Q#vKeEnJer#>8{McGl`HA&wr6<;hm7ZG9R(fV#qV&w#PwBa}hSGCuW~CR_ z_Z44S?^b+iJyY?Ob(!KT>rlnl)+UOttwj{ySbtG?V|`WOt@U<=x7ITi-dWcuyt9s1 zcxUab@ZMTo;k`AF!UyZ8@*k`>%73)3lmBS#EC112M*fraTe(lx`{X`ZPn7#?og(+y z+CuKLHJ{uU>nE~btarr|vy7mt#^q2wQdppYaJ;1 z*IHimul0M8zt#su{#s8K`D>jn^4Ho{KT0;M;D4(tWOI3vz{vO&pJuqpS6*|KWk=z|JJMd z|67Of|F>q~|8KpX@4s~--+yZ{zW>%|dH-9t^ZvJX;r(yT!u#L)7|(y}E}s9^fjs}M zrFi~ZpXUB=oyz^+nuYtn^>VKN)_z?7t$%XzcnA{f9qo$|E-%i{#!e8 z{I_Q2_;20M{@+@T{lE1lw*S`NZ2zravHrL2W&Lk$%KG2>AO;dJe;X>t2Tc*7Xek zt&17{TcZyn6=-`b1ezqJ#?e`_m-|JKF~|E+Zy{#$D>{I^zS_-`%8@ZVaB z;lH&w1A~nS1A~nq1A`48!+&cYhX2-F4F9b;82($cGyJz^WB6~)%JAQsh2g(7GsAyt zCNO5OVPrsH1_lNj;_-iL1_l^L*7sZHiFJYU9cw+c)7JhPJFHtZms;=Cnq>V-yWYA- zC)Zj@Hws+;d+V86-_uiu*Z=MYZ>{qSbbA{m*D6ZSv95 z3R?eHfb0LwX!U;G*S^?%f8{ZFO(UvtRS|KT|6 z|3f6!|0joS{ePK?_5Y*M`hT?kALjM{e`^tj|JH&G|E-Cy|NmPPU;l&ZdQd$NqR}x( z9EP9E9I;MQzG$tfcEs9OV~cgO<|6BDS`(~aXxCbI>ttIi>PA>^({;1<(lfEXtEXh0 zr!QdrU;m$#yTKc)K7(6UR}4;CNf~apiZ@(lwZw3$)eFNGD;=X^t9+wmD@gtCXk}__ zXjNv6UjIL|j5N7qSz&U>a=OW8%dI9$EH9f(wfqR~|Cd|pm}Xjfnnqcsf&2fqmh++g z|Ldm0mXP}Yy9K2Ge+SnGY( z)}1;T)(W~|)?0O5tUdIMtZ(ZnSm)~VS^w4lW94S>+N#&!rqyMG6IPOj+pOXZms%}0 zoMQFDu-Qu6sK_eMD9LK0QJ~dlBT)TsU{z+UV71Ly!0MYZgOwDx{|~DFFM{j;Y2f;Q zvE^lxDM;E`&e~WT+ME$?dTpm3Bk6iytSe!9eu|V(t$C<XUke`pzYHD!ht&UaIL7}snd+g9{|8`<|AXp(Zlv-5J0`IDe>rsgpK$%J zVDc3{{{PXK(+X7o?*)(l%Mcv@KWP+fwFy4{p9~%UN3Q?t;N$<;>i<$h(D?sq`1rr3 z;ZC&i|Ii-&~@qfze|GU<>$Nx#|{}ZnN-{Kknr=N^t!D zIhOJNGenL5|Ds_0|IeTp{}&w{|Hm`_Pj3AW8Up}fSpOXt4eIlQS&eP6rOx?Ly5T2?p6dXuiBwVR&4^-Vol>nwd9>)-mn ztXvIVTJ;!Qx4L9-%u2#=t5uxg601dqldYZ`Hd$#I6iOX=(DnGQ#AdWx2^g%V{Q?EVr0I>i-WWt(JVIWtQ5ep!z@3GS$@E zvdPrOa=xja2>mY+;nEFty(OKAOn&Z5%nparb{KW;Y5;-Oiu#V>IGA5#Cj znnzoJ>i;rxXNx{_bBkr>+7_Vt|Ejr&1*HD}Y0hi$*c?>r|Zfj8gA6Ean>q}W{qs;%~s{gI5)%0ww`ScvDzv((# z-_u2{{~O`+|JeHfi28pWbpF3xr_dU`{?`J}|D*Q*mlHMrKLhLh{{zj%)<;q1|5w82 z|FQS~an=8O!Snyb*Z-%j(d+-8;Q9ZH*1J_NSdm>4lMNIeKw$%tF)Do?fMQCnbb zr!mXAM6=I&g;u@wP3;2f7M*x&DP2G7^}4p!&U!l5*Yu>U)Ac#6f9U_PayEEo)n#zi z>Y~9BD{;fkRxyT)tQHzhw0dgTV5MnPV3lJOZ?)dY-|C~0y_J!%o>j52oYfX%KC92h z|1Bj=-dkFl+_#J{xnNmta=>z`$wtd9CW|aDnM}6)VA5jA3$FjuEj>&lEK^Or!1ez; zQ$5RFrV5tVp!Gkm**6OfvzHdmX16Wk%pmpuWV0<6Yt5EhAnN}H3t{sT3mx-x3sC(Z zYwmA>T>tMim$$fTE^P6}oWp|A0#yG$GMBJ8ZLVyw)m+bFzPTm1{x62s{~qQk7LfYC z(t^{x#R6OXKf&yPMXlLMi%hf27GY+0ES$|i{eMvX|HFdYjL8yF|I1h&HdVC*)&C1j z%`K7Z{}|HotxXCR`Px$)3cb2gFpVfrP3ex}Qw}SQm zyNs2<^?wAG^?whHe5_#g|7`I5KcxR3VFc>`7h6Hb|3Ur#X7KtySpRi@4e z>;DkzP+dg*F9KixmtuWQC*2y<|3|O?6Lk>d|A_j(0lfYXH2zPx{-0*utp%z71K{ib z=7ZP&;jaJJSfkeeo1p9ekn8`QNbCPdtN-Vzf$IM=*3oKbt*z9~Sxc&&xBjVm!TOde zYW<&xb^YH>l=Xjk;ProZt!;6v|I1V+w*L>S|6k%*|M$jv8+iTSTWf6f{}b@~KWf(h z-_X|oeYYmm|2M+9{twdsKZAAs-){oz|48ZoQ=|U>hjsnmX#G#m`k$COA6X5k?gwE{ znUhw6%H`JoRQs&WHF~XcHCwC~YL#1G($2JQ(22Ab*Y&hsqibpHpr>JdNl)B5MW4<3 zi~d(DCxa(eod%b!&Kn%E5;fdt6=k@pJojfLgvL5+UDsNF6Pk|vF3gjrRGi+z2;^XOU<<`K=uC>b770u z=Ij=X7C+2+EFL1&|MSc(Ejr9yEI{>tta+pbYW?4A@x`pq0@VLMZMMi_yV)8GQ2&2| z*?x-}wEEw`3|9X$TK+WUvV3kTYE%%x%w_Ink&T_s9X#5}4{|D9or!7-WE?YwC{|A=VCeJPPOmNr#i;ZQhAoah7 z6|DYOH@3Fo2e1EkvqG)^W35_^lCAQLGOR%LzmpN7{%0}*)&Ctj^ zgbt|x-(dY(yU7~8{&&&twN}Ac{|~AEbG2q!W3T_0fY<*|0I&at_5We@|9a^9e{$;o z!{GJ*f$GPsb)f72VdMYwsQ(W_*Z*U$|DR%6|Bqh(zXGrS7gl@?UH?yN{r}PW4RrlK za{r$fW&Qsbr1k&k{eSw^|F`h2{~w6@{~yNs|IzxN9`!$RolXiHRQH4MdYMcsUgZGm zuc~F%h8i{2X`1EMv$S%pPirSy*XjgW3+p;tuh2ENw$W3zKBp&SouJQT{Xzeum4m?p zt9FA6R%Z?NTL~Mkvx+dBYczUP)>it)+ExX|(pDRc zd8|Gd|FIM|d1GmAa@R7<$v(>|ChILXnJlopU^3D2ok^1=k7;LcI`d{4Ql(~|{7IQrd zSp8pQ?q?BW9%BSo@XIzUTMK$4yylqE$*95w>WLK&|i+^uY10ZzZd2s?f4b!v z6Xg1TtK~!!{jUqH|AkC`TY~!kAB;Jyt{L-N?J*X$LaqPxtn7_V ztkjLItoV%`tiBr|*Z<*GvyEb{S}^MW3M+A=IxA59|JD#v{~tlB|2vTCe?PJKV}8#|AXrP%T{X)VB`O=`u~Mhguxpt4}%X@76xCeG!4+}e|Bp`{~xvf z=hp|-|H{^g`d`<&3%dU=T+iIvP7l)mht>agF~h!}6z=~6_5U&J|KYa(?;=(A|50oFpOiWuSuLpU2jOBFL916v zTGo$M{kK-O z26wGm49-}cHrQh&Xt>%c%y72VY{M?A`-W9k%0^jMX-1J&D~&v@UK?3j=@@HT8Ehn3-v)pJh-}1c41k1N3jh5V|#g-bTDVDCL zVU|gz9+vf{mX@`d`qz$U@6J&BDn%$|Bm_*P__m(W2Yj)MBx@mc?#!Ig3l?LKd&g z*)13>K=uCvb8(B4=1LZu&2=s2np;@3n>$++LhFAw^JEJ{^E?X~^9peN|Je*u|DQ5j zXt52c{;xJWVUb}5s{e0WIGH`Q&^LQ$A#3*Cg3FB2@`ovxC8++tVk%>K$W+A=RR7O6 zHM8t9wX>`>b+^nh1=auImazI?%e25!%Cy3g3ts>CTi!N-)&I+&{r|0&6HNA4Hkll; zEH(l4|FPBoUo5fL|I${S#!6NN#-RQ`_WJ*XQJ~dEBUt^P1nvLlT7mliI!2)Szm{PA zpJ=$s%Fl4Ul{Jp~|C|A={=aTD+W<8GPfY#KY<)u?R{!%^H|QhR|1#Fd_5VISE$bzE zp!(kcy#JqY{qJYpsEb_xM_Oy@qSyav(D8rd`oG8;(f_Z+(*Fn5|83T7+8x%Z+FjNz z+CA1P+I`ln+7qmwYE8mf|BJ)x|3%hEHDUGta_cfpV*3Ax`aecv7j*wWX#9U4miqsQ zHKqN37x@1F>((DtNUi@LT7&xkcFK>fMU*k?e_y3%)`wh2c{(tQCKd&5h z>VHe{{(nUMpCa|s8h`!&%Np1C|1I&~c=rE;`v0WX|9?r^|BpKV53B$Gq3r)3ZvFq^ zS^wXVIcWJ*>7Uh2RcC8OjR@;7&1mZmtuX7I+P>B$I!@MHx~A6ib=9nm^u(=?>Ty_y z>;JHNuK&Wy+Tey&lfenAlLkAi_zYKAg&5ATnrYZ>b=R=mO3^6YD#a+=YMGI{)k`CD zD=lMnt88Nlt2M?PR9>4i(qPGD zT4SkGIYGFCcRLgRksf^_%Q+~^Lri_+cW}huo&7N5}nBBC9Hal%m zYPQd!-)y7BDzhaPhs~y2+%@aA_-wk9hCW}vIJr?)Ordz=3|3zk7Ec(p$S-|T55HnEy{{&qB%Yf^D2Fo9&oR-f_g)Fa_ zN`veF4W_!5^G!{m^}idq{*N{V)&KF9R;KBei2A?Y@|Q`wbcv z|J97GtoWe)|NBPXRlqYA?p7oD^UOchGDN2djG$~aH$n){lCKs(*Hkb z^~nI#|377gT>sB9xNX&C0IB~o3{d<38u0%Af2*(h%+}YT_5U1wKI?jL{Vxg~|3|L> z)vS^0{{lT@>u^0YaQ|Ob&(<2X|Le?QXte^CD)RR15PX#5{v{ok%~+d5AL(f?Ofxo6F% zav!PxPwV>s9rXMkH=|8rzFt}n>Z*auw zn86k+9>XP8freA8rWv+a-7+k(k~2!NN;C?wT4Lm4^~}iBO5Ir1D#KXRYNauo)l1`V zmLew4EsafXSO%M%v@9~&WjVoQwdHz~IhJQldM#g@)LU|x7Fep8CRsY023sbWx?0wn znp@5^)wJAdDs6eul+W_5DT5`4*(VDXv!@pJW;ZM%%}!aAnC-RbGuvRX!fdg{A+zZg zcg(shzM9oq@S7J}Xqcy3IG9IRM4J0p6q-9&befx3EHu}!*l8|nalu^B;)OY@#eeg! z=G+$d%*8B@n=4vuG}p11ZEkMSYVKrFVD4)XWgcPSYMx|aV4iCsZC-A{2Ce_^noYAf zX|}*(tJx}xh0yxH%IvsBy4ghwQ2p;{_QXQZ?5zc;{^vAfu>5YyY5CMt$nvtOwB
        ;GStEGCRr?~U25K=uD_V-YJ*{oi4% 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

        {HZL-6 zHJ@wTW`5GR-Ta$zySboAo4JNbtGT^Nvw4_Fqj|1Loq3B%mH8Z#QuECw1?Hzsvdtfv zq?-RSi8mKAjWE|V4KQ~!^)Qbxbuce5wJ`56)iXT(k9No6Q!Roidwl_Q0&$?3-D=8IO69nUZ;$ znT2_znXkF8S+coKy@ zdrg%sHkj&KEH*W_m}cr|(P`>!QDYink#8Djkz|@~5o%g!;bB^3VQt!Mp=;V}pn}k{ZFpjl+Xq;+! z$~ebzvvINIT;poXcH<_?0^?50DB}s1F2>U>^^NCQN*XV^KLy|Gj^`eZ3+^uzL>;XljQhAdV$47se1 z8VXo#HWam5Xee#fZ>VThYp8COZKz`vWoTsOVQ6k;ZfI+zX6R%kV(4zgV(4S_*&xX3 zkwLiCC4(5Ng9eFK8x7K|78+z*O*F{2YBDIXDl(|FN;aso3NdK1ay4kTGBfD5Qa6}j zC1EhdipyZ8)pz~5R=4#RS?$+fX0=#UvMC`1M{`{m^}5^+@-<)oI;N zR$FzyS6$s#b((qBshS1WKAMHrCYr_8vYMsVteWN4 z?=&i{uWM9WAJnL|Uae7QJyoN@x)GlPt;^LXSqG_4vDR0gYR#iQ-TI~44C~`+v#gh@&9-h)n`@n{HqY8wZN9a# z+Cpmj5k{Y+(@^%<4* z)|*u}SkF}1WZj^$**ZgIi*<=xil%6qJB zmG@eUDDSg=t+dbjh|+%Rxk?AD%asmV2Pz%1)=@fa&7pL}`l;d(>qCl1trsXBv#wJ- zZXK(5!rE5xgte^VN$YyTQoVGrwaN2r_!Wrv!g|pV#3TLhT70y|kD4e&JR5)+_ zU;cvi8TpIWv*a&YXUbo)wv@kY%_V=?`nKE^>veKhtefPnT8GJ9wbqflX3Zpb-TId7 zb?Z&CH>|s5Z&;_w-n6!ty=g5id&~N}%q{CHGPkWa$=tS{D09cUK<18hfXrQMLz%nQ zLNfQPUrOJzUN3#mx=i}MwY~IxYYyoL)|aIoSTB%zV4W-V(Aq}op*4@xBkQ}8kF3{A zKC*6-d~6*q`Pf=V^076uKo*OFXsim3V5MF7edbS>lpfyGtQ*B%SbK=Quoe`1X?-&Q5td|MCx6T!OZ*4C4-kM49z4bYP57u)9K3L}ne6Y3?_+Tw4@WJ{t|3~XG z{*TtG{2#5a^L@1L=KE;v#P`YiH}5Cw?Yy6?OL;$8oAG|K{>k&%dOy!+>vo>c)&V@9 ztz~#VTVLh=Y+cIz#ae>DwRQr}a92)Zj!A9_X*=$t^Fz<;{x?70p`=Rn2D@YMHM$G%!DDXm0+*(AJ#E$i-aA z$lKi6D9Aj`D8jtUDAs&~QIh#Jqcrn>Mp@=+#(Cxe#s%h8#zp2!jf>4M7?+s;F)lF| zF)1>qpEYGQe`5N_?6>JBGa<7VW}0Sq%^b`wnT4Aj zH_J8KZPsG8!EBb<60?nFGt7>g^_bl?YcTt4R$|6!o?#|$9&Kh~?r-L0?qrr=Ze~_$ zu4UF`E^9X5T)=FLIkVYG^Y5nj%wL&)GQVreY;oR{*W!?=xW!geMT-@t+7`1-O)dIN z?JXKjJuFI0gDf&kV=SUgQ!V^V^DP`rD=bV*8!a?UyDX$lr&#cr&b44PU1sscWWB|6 zlkFC_O%7O`GdXE-$mEj6Hj`TxD@`6-%r$v!G126UMT^NFiwYAK%N!FP%LEfq%McS; zOHUJ3OIs6NOG6VAOEnW4ODPi(O%2dMn^2C8=bOjHo9P$ zZ*<)<+UTyOyU}Ay6Qfs_3Pv9+d5ykV{xbYy`P`7n>WU$U)geP(tM!J$R&xy{t-1~6 ztSSvvtkMm&tilZSty~RFt&9z=tdtBLtb`0*tr!ixtUeg{TRkucwK{JQWwqZR-fF!; ziq(9B46A;FT&o6yBC7&}a;rpx8ml0K1}kTSRx1;OPAgS|J}Ys9Nmd*N)2+Vf&$hau zzrbpb{t~MN`YWtj_19Qs>2I*|*WY4gs=vcZN`J2vgZ@FQ=Xyu2&gq@7+NyWPYL4Co zs}{X0Ryle%tU~l|TiNK{w^G%6Y{jSd%<8-DE2{^(Z>>)0eze-G`^9RW?suyW-QQNl zy8oj+vu))BG3pd)U*S4YZvm5!|S3>^jQRvl&Q zVjVT>L>*1*03B^>I~_f1T^&PfX&qy0E*&%LFWQ#Ym$j{}H)-2hPtta@F4lIo4%K$E zHrMvBmelsP{;lO}eOD{M`hZrD^vpYh>ujw^Yk#e1YZI+lYYD9c>wlU_){iw) ztWRpDS#QwHu%4!wWnHV8W1Xs*XYHd|U~QsVWG$;%V$G^qX8lg1!uq;KrS(CLYU|Y+ zwboNL>a80z8mzN5nykY#TC5#4+N^ao+N~uuI;~kXx~!k7_gL>&@3Wq%-fvx^KG8Zr zeUi0~`V?y}^{Lh`)TUb>Q=4JERBe`Zi`s1KWVN~0&T8|lRn+ENv#Kq$ex|y}`h@CY z>s6{tt$S6MSr@1-w+>NVVQrzh%34-+wKbFK8tdmOYpu_!th3&tvfg@@$_DEum5tV! zDx0kXRkm1Lscf}YQrTwBqq5!lwek+@{mMJ7rzr2T&Q#uQZLhq?T1!`9Cg4_hBmJYu~_@u+o!;xX$4#pBlYipQx=RitmnyJw9b{k zXl*Nh$(m38lJx_*%hsFZu2{FpU9paqyJ~G9ch#Cr?wa*I*=yF@WUpKI%U-w6l)Yi? zEPK;hUiPN-Z<$-xH)L*EZtLBX)+RD{ti@#RT7QtfYrReSo^`GC zJ!@C#`_}x@_pNV9-M3yQ^}xDV>VdVB)I)0_sfX5&B_CREm3(B~A^FHUM)I+>k>q1* z4#~&X4F(TkGqB@2nRJzO&8| zd}nPT_}-dD@V)gVf%n#n1m0U034E}25%^#&F7UznCjSTPR{jsxCj1|*pYeUPp2hdk zI*{+9H8*KtitXp|MS-bImvgYLdWPOh3ll4@d&(`rgpRKidK3jj}{%k#g`?Iw% z_ZRD1TwknPxV~5$aec9V%=yK72Im)RfA}20SL+Uruh!liU#$f>zFKc)|7PvU{>}O^ z+c)cGwr|#IY~QTUvwpL#X8mTZ&HCN?KFfFO=`7!^gIK;>3$lE-zRdjHdM5LC>qO=s z);i2TtbZ~6us+T7!+IXm59<=9AJ#rhKfrqdn3#TAKVudAO;fdA_Nnd7G)A`CL;D^DUWdHy1XWW6o~2!Tgu$QS*1Ex6B`!zB9jK z%4l)il-pvLsi?(TQ+bO8rkWO0OpPttOl>TxOx-MUO#>_vOd~BqOp`6#O>-=)P0K9w zOzSNaO*uA1z#IB9a+Vvosriw!0>ES8u&u$W=; z(xS)YqeX+sFN+crCd&*HF3T7bARFz}M=oL6Fs1gK(?81~FD^4HB*98l+kE8f07585CIM8I)SZ8&p{Z7}Qxg z8Z=uO8MIp|8}wL-8ceWaH<)VmQGce@RsDHZJM|Y?&C_3I)ug}5DqVk_m9PFLDth`owI7xyJVHAcg-qD@1~WN-d!tYy@ysjdQYsr z>b|hLr~BIKgzkH*O}d|~=IDO2YSaB`RjB*NDn|FemAfvpwXrUnwVW=eHJ2`r^*0@U z>&H4m*5`FZt@r3iSg+KPww|UVXWgQsXkDbEVx6F)ZtbU|Wo@gYW38j3Z!M)`WX+{x zV*N?m-1?%nmGwq#8|#VM_SS{kj@CiiF4o4{Zq_2&p4Q*Aysd9)`C0GP3b06QS6>jaT6=`jx6=N-~6=(fdGr{_iW|H*@%@phPnrYV4G&8JgHM6W!G;^$dH1n)Y zGz+X{G>fcRHA}4DX_Q%C*Ql^Qs8MCTTBF8#sz$AKgGRk|wnn3Mm`0PeqehFhu11@+ zq(-|nn?|SgQ}u4^{pvl|v()>nOV#_W1Joy4>#9$(=2V|z{akIT^%1q{){E6N4w4)#cWfsw=GJR99Lv ztFE?wp|ZyMoXT43tt#uRXREBYZdTb~ou#tTI!I-+wYAC?YZaBP*1Rg)tluhcw?3%6 z!+M(XPU{@yUDi&@yR9XacUyl@+GBlEX|MGnrG3^lO8c$Dlnz)MDjl@uRXSw-O7XDu zamB;dOBIh;H!B{sPEtH(?WB0zT1oM^HM8Og>n92)t&b_3vRy-W6*^<>%W*159Rt=(mBSS!oku>LP|)B29gP3xU9x2$K#+_Em0 zxosUTbKBZN=8m)nzMt@|V&Stm(8vNo4|WX&h}*!ro&W9xkqkFBRmJh3j4cw+4<@x)qF z;;A*e#8c~2;!mwR#GhGvh(ELD5`SiWR_wX;B(dk#kz&uS6~$gyzZQLAy-oCmb+hOT z>p;<$){3Gptv`vpv_2y8%6f*#E9+d5SJuuVudJm-URysGer-Kl__cMQ@M~)>;WySt zgx**;3cay*5PDB?aGEzY%z6eOTa~^-O{H*0}=jt(^qk zTT2MMx4z5&!Mcb4gS9RH2kQ@fAFP-0eYB3{`)DoB_tE+a??>xNydSNDc|Tc;^M10v z!}G~{G0!LKT%J$XmOP)W*?2x%ui^e|?Z^Gu`YYFG>-k(?tbMq?SpVhxV!eU$i*-8Z z7i%TXFV^=tzFN=c_-dWV@zq+5|d>U*uPn?V*6(8%l6Is3+p%Q`K;fp z{aC+QGqQfO-of(Sx|rp=wE@d_>rc$zt+z3Mx2|RWZtVeG2k?~XhxK-*AJ#ogKdh6P zepuTu{jio``eFTz@u&4w#-G;P8Gl;OV*F`c&-l|ijq#_oALCDJbH-oRN{qj(`5Av% z|6%xL{hHyI^(}^9)~6YMS?^`|WxWAQ8vr&Jkjd~Hd`2*6UqA@MA8S7b$X!7$(E9=* z^8tUYVPgTHa{@FO{#wJ<1%S>9kZ1U3Ez9uFTAJY>)^>mp18A?ne`|h*|JHmAkahr~ zEnsOJVzJvu(jw02j=7}K9P{Ufx#ouqz06k_8k$cxlsE4)6gKZRjr7f%jZDm!8d;j3G_o~+XXI!u zV(emWZR}y5Z0v2`ZR~5l)!5JczOlbKi;2Ivl!>3Yfr+2Fn~9HkjER?dk%_x`r-_UC z0ux8`Z6>znXH6{3pO_e#|2EMz7cx~h*ECfycQBPQ4>uJu&okvRZ#88ypJV#VY_sV{ zvs0!o%pRKFH~V3F&5YmdjG3z0Au}7Z9cIC1>&!CE7MsW^rcB=0RqX=5A(s=2m9T=6Yt4=1OLH=3-{e=3Hho%>SCMHUDUO$o#44HS-&$ zug%Yx{x{!m%4xC5RM=vfsjS6JQ+10TQ$ve-Q!9%iQx}UgQ$LGH({KwP(?kmg(<}>P z(_#yC(^?B@(>4n}(|!vk(-{_DO%__bG+AYF$7Hj`1(Q7%hfR)HY&SV;vD)OS#e9={ z7L!b#S+tqFx2QJxZjo>D-y+$B!!q1Nz|z}9!qUM+!P3M;!&1{k-%{4Z+)~KI-jdD4 z-SWG!pXEd2Fw0ZMv6fqmQ!VEi=U8?a7h4t^S6RjxH(7cZcUl@7Pq36To^Hu$JkRor z(Gtu1MyoAP8*Q@OX0*d{kiE$Al_=0L5fwkL8eu;L7r8PL9tb=LAjNm zL5-EYL8Fy{L93OLL6?=VL7x??!DOp<`qQm0>Cd*>roX^yw*C^Udi@nvDf(-yy!1C% z8R&1d64l>n^+#{7)g!$FRwwn2SZ&ZdVKrUvj8(nf1*>$uD^~t`*R9O;Zd)nn-M8Y@ zdt~)l_nFll-IrF!bl+NS(EVUFOZSUatL}HJ0^MI$(YpVv+;kbO4Ru+pWp&xDId!?L zzv}Q>KhzPhKBpsWy<11jdWDXp^;8`h>t-E!>p~qR>v$biYhN7=Yik`XYb_mJYe^jg zYYrV_>krzd*5|b?tk-K>S@&z(S{GQtz=YRqwM7RG(n2t3J`1OMSBSbG0efN7bfUFIJmw z-J~|dI!SGowWHc>YbCWg*34@2te>dPw?3x2zB_s;sr1qq5GrS!KO-w#o+UV3m#5HY%H}RaG`y^QmmHey_aE z`mpkL>lw;Btn-w2Si30iw3b%hW&K%cxAkeIJ=RN<_FC5|?X!+l+HY;5bii6b>7ex+ z#Y5I76%Sc2S3GRps(8dYMe(S$i{deB6~$xLtcu62pDUcOKB;ihdbPqy>pq23)xl7jla+j@> z(>&GtPe{(ww^2T*t%Tev2~Ed z6Kj2mC)PX?Ppz+rKee7D{?s~1{He8w_%rM4V$ZDSh&{7T5_@i~CHCCt=#90H&>L%Bp*Pm&1>aat5qxVME%?@2S@5m(JAt>>y9C}^cL=<*4i|W5 zts(Hv`aAzS>ka(xtqb_yTkG(@w|>s|!Fmzj2kSV#57yFrAFOZjezcy&`_Vd<_oKBU z??>zBJfE!B^L(D-^K`M5t@@8J4uoyzsuT9oUH^-0bz z)(xCrtSvdeSbyXAV!f5)i**IZS8E%NuhuLaU#;h`f3-Gc|7v}S?W=VO+c#?|wr|!) zSie~pvwpKyW&LJ-o8_DJ6qfJSfzUC4tIXf6XET4dPG$aXZOHuHnt}O;^+l#1)=Qaw zSl2N9unuARVXe>f!xTc$ zUK=u-Ga7N2OBwN+n;Hq32N{W*7aGZ$Pc%|C-)y9Ae$7b7{FjlwxxBHlxvR0Md5*D# z`BY;o^S#D4=Fg37%{feL&1Fq&%#BT~%{@%4%;QWf%u7tn%)3pD%@>;Jo9{5uF+XRb zZvNCn$^4IrjJc4hn7O8@fVqPymwC7;vw5EBZ?hKD&t|htUz=?*eQb8p^p@Fu(~D-` zOplxKn(Z@FG23cpWwzQZ&}^Yuy4iHITC*Or$!3jaE6vKx_M2s!T{Vk0du<|a5asyur$rE&@nBvP%y2s5HW4B z;4tmA_-!)H;=Rdyi^nD_EUueuv^Zt5(_){=A&X5Wr!AJ5T(+2Ha>t_Ax^bpuqj8~Sj&X%$m~p+Oqj8(1j&ZN0xbYNAX5-nG?~E2%-ZENgdDLjV z8_HV68Y)})7;0Eq8|qnU85&zj8d_L!7}{BVH*mIk zZs1{c&A`{{m_d-$HiHPOq6|u{dRqz()w^nCs&~^$PVcT2yWRt<54umRZs|U^ zI->j9YMt&os~NhVteSPdTIK2fu!_|EW96dz-^xIj$y!F2)tW<>!}^O3kM#o`e(SS3 zLe{%ZCZESs3 z+st~6wxxBiwzYMxww<+~wu7~SwzIX6wyX6QEf4E!T3*&WwS27SX!%<=Xa!oQXa!q) zXoXtqXhm2HYDHOp*Nm~gqZwy?STn(Tm1eT_B+XRoD$R83M9oZVFU@RgBh6fEY0Z3V z7R^HIw;ILP*ECA44``HIuhOWno~lu0-Jnrpovl%49j4J>?WECYt*g;&Ev3oWCT>mc<$Yd!S|*4*k7tzW23wmzmd#d?X_H0x%y>DI|=GpwD| zW?3t%&9-Jyn`8Y{b)NNc)%n&dRTo(Is4lY3S6yr!th&V7Ty?3njOsFLM%5M8&sA1h zpHo?7y;Wtk^&FM8*3ByGtg}_tTZgD@u(nazXsxQU$(mnfv-L;iE!Ibsw_49q-ez5( zyxrPOd55*E@=oioO1rGjD($vjuC&LxL20jbw9-CnGo}63LP`g$-zy%lKBIWhdZpqa z>kh@k*6E5ztlbrlTB|D_wdPPfX8ls(xbGXxBPi)8Tkv=Z{;pnACS9fJz4IOb%xv}Yg@U?*1~d^ ztzXGru|6bw)q1wU3Wo}x>%iOZI zm$_xFD0ADIS?0F&Y3V!GlceuhM@iqcR+heN{Z8tx^)9J<*6mXFtV5;lTdPXlxBe>m z!1}o41M69m53KVfA6h$0KD3sUd}#eq;*s@9iAUCpBpzGWNIbTVka%ouBJsppP~wU8 zJ@F^jbHtxo$A~|*mKA?${Xp!Q^-{5C*4bjutc}HqLRK){a}5N_k(pe?+5Ep-jCLDydSM!@O-r1#PiX* zj_0Gb56>rSX`WBk*SSAgS95=|R^t9_eU|I9bv4&#Yi+L2*7rF-TTkQsY#qS)#hQon zi}e|fFV=k=U#x>TzF13ge6>Et{?$5;{j2qFwy)N6*uGjjvVFCF#rn;92J1I#Pu6eN z|5(0RZ)f>tUCi>$+KA=5^;hQa*1MR$TQ@U*xAtTHZY{(7-TE!lck2U8Kdh%Q{jknu z`eE(C^ut<(>4!BF(+}%Mj6bZ8F#fb&&IsBM@YA}O@uzh(<4#-G*(j6bbqpz8sD zF#NK9fu#)qx+icJ!*6TQ`9Pq30ksUjtxFkxTjw(TwoYUCV;v9O9|)Td0G$gTc zMtl|vjZT?I8+Dtj8O56aH?%Z=Y$$Jj(U8~tsNsLJ1BTzs4jO(iJ7)OK?7ZPyvpa_G z&E6P(H2ZJ(#Z1)bhncR?Uo&?jCi7$?cJoFf9`gl8LgojJ#LOQXNtv@7%b9B%E1Cxw zE1Q=atC`O;)-XS2tY!Y*Sj(KpMB7}^M9bXFMAO{cM8iDMM9sY1M8&+nEo;gH~nmuYx>5l#q^2UY|}et8%?j6oiIIZ zcF**%*;mtDX53~Q%#_TQn^~C6GxIl_VwP&wWmaw0U^daL)NHv~mf2pjc(co9A!aYk zJk0)@*_sKP8=7gDtD4!GOPK|MZxCWKt1q?kHbgqwO8HCeoJLCd!ryCR&yvCPtQ=CRUbzjh!r?8+%$_ zG!C@fZ5&~_)HvR<-#Fc}$~ez5)wt9$z_`ZJ%DBZ+)ws)2(0HQdAEOzT&yD6=UN%~0 zx!-85dkH8itgHMF++ zV&G`?#K6t!ih;M)5rY7$Ee4@hOAMl{rWnLqwHl;Yl^SGPr5WT|MHm!Yc^Z^kSsBz= z=@>Lx$r`j;@f&nmF&gw)J=dRXby|PA)q4HeR#WsBSXJsTv5M1QVdbK~#!5?ngOz~( z7OQW1JFM>N?Xfzdcfe}3-Vv+GdMB)^^v+l%>0Pk$*1K$Ftasf?M(?&2tKL1Uce;

        I;8v3YK`t2t7*C)tQvJcTjl6}vkKS!W#y#%*Gf;9!CFd}*_ut4-TIRbm-T%e zUh6YD0@gcqgsqq9h*?k8k+g2qk+II#k+Y7~QMC5fQL(ntQMcC6(XtlT(XnRN(YJo1 zZDf5~+r)acwz+k;wxxBpwvDxqww<-Ewxcz_wzKs|EjQ~cS{~NhwY;roYx!E&Y57|x zX$4ukYlT?rXoXn|YDHLo(~PpdqZwm;NHgAgg=V64zh<&^nP#eWoMyVUn`Wl9zGk+y zgl4WalV-m4YmGwds~W}D`!!0fS89}7PtmBfuGgrt&eEu{4%4W!cGPIF*41dVmegpr zX47c3ex}}LeL%g#dbWC(b(wm%b&z_mwVryPHMjZ%>z8U1t&giswqB|>#kxgpnsu_; zbZcj|8P+Olv#eRwW?Mf~onw7Mb)NMq)%n)Fstc?OR2Nx?s4lj)P+ejztGd*hNp+d^ z3zZet=Tuf&Z&6ugJzHh9b(6{(>nxSE)x=Znpb*AEBYfr@^)|!e(thp4ATEA8}W_?!Sxb+5w-Vykt&huIv0fm1#kx}Vs&$C$Rcn3OYu4Pd*Q{U2T(>?dbHjRx%nj>inVZ(h zGB>TAWo}uk$lS7KleuMmN&2?+OzGR!iPCqhwWRM@f0epxeNgJIb)VEd>lmqf*4k3{ ztp7;fw>~R*-+F=M1M3pW2iBgF53J=SA6kExcxZiI;*s?ViAUB=5|6B7B_3N_N<6j} zlXz_XQv8Yaa`7kDY2r_;)y1D$zY=?Dy-w_@b*b1hYa6j=)~sUBtS^W@x1J;V+&WA2 zxwWO}b89Zq7uI(~URbXed12iw^3pm|jM6F*0TKXtk3bivu@&hZ*9T%-uff&d+Rm4@2#_V-&rmCTi@sSV!e>#i**{u7i(RPFV^qazgV}if3;R(|7v}R?W=V<+gED=wy)NES-)E6 zvVOBxV*O@)i{+d3RF-en!7SgbMOnUC-(vo5y@>g{bq@1)YfI+u)||}Wt?w{>x8A_? z!@7g%hjk)!9zc@mhxJd!AJ(@Re^~Ej{As-qx)vax@uzhJ<4v^TJW;kR`?_^trZIf0P90Z9yhtU>bupnHP@pnC*C zV*#Lb0d@?3t*sdTTAMLI<^+)20qP8YtyLNRS>ta9{I>?R14N*00YQd&#ts&W#+(+1 zj1HJr8#SA|8HJe385x>08i|{~Gh{Y@X!zCaw&5GI+lEig?i)Tbdv5s9?6ct`GbW=a zW+Fz<%ruQ&nK>A}GmA9(Y*u3Q-E5-KZ?g?XjOG`NSj|5gahi)5^O~C*^P9&Q3z;_= zi}MA*FFM8JHh39tEX6HfDs zCamVqO&HDpn*1>nG5uzyW%|L)!St0`xaniFT+=&dEv8q^W|^Kd+h}^s?6~P(v%98S z&AynfG2=2@Y^Go~)6C3lf|;*byIHbXty!g6v01-arrA=nII~@5A!ZlMJk6e&*_r(| zGcpq}S2t5Nmo~F9=Qr~=XE94L|6y8b{>HS={DJ8r^Q)%Y%}<)1Hs5P{-+ZI#XY-|| z%oa0Ec`bTP#Vs056)j3kwJkDCO)O$e?JNRJ-7Q>911-!=qb#&dQ!M07b1j5S%PiPT z>n(nnbXdGInP~CIWR}G>lf@RNOx9TJGudjf*<`Q9a+6~gvrW!h^qX9_Xg0ZTQDO4J zBFE%|MS{r>ix3kAOHUIHOIs5GOCu8rOEnV(OKB4gO92xDOI8ze%P+?EmiLU^El(Kx zS#CBCvz%)jYuRC(Vp(LIZ5eA^Z0TWKWoc~OXen>pVaa9OZ~4t=n&m^Ixt3>*7F+Hx zT4lM^XrtvsqwSV;M*A$YjE-1_8=bavF}i4JV07J5*65xkm(df;ABL|ipBjF!ylnW* z@_^wV%XNl~R&xy5t-1_(ttt$Kt6?2&+j3u~tn6Nmj)M=~gKQ*;b(j1y*hbrB>z!RaTk? zbym^_%~rey?No2o%)L&(#uD{NTSAUb$ z7rkv(xAb;d9n{-rwNmep)dam`Ruy`utP=FjS$XPRv@+DYY9*z2(~4Q|j@2982Ugc~ zA6p&JeQvc%_m$NY-FH^?x*x5wbiY`I>i)2D(EV+tqx;WFLYL8+MVH0;qYj7lT^(-g zQ#yRs+jRu3m+FXEPtp;$ZqSjk&eM^#j?s~~_R>+Zw$xFz*3i+g7T3|XX4BENeywd_ zeM;NNdX=`Rb(gkq}a0)?2kat!HR?Ti0m$S|?}) zSi5QkS!-#9So3RzS%1}xw7#twZGBKP)_R3zymh~3qIH>OvURLxs-3a$5O6k9LXD7BuXQEpwUQE8p2QDq&XQDg0(QD?2A(O@m9(P+)4 z(QN%xz18}FdYkoZ^$zPY^)Blm^=@lD^E+Rn}RnsI0fkCRdtye1TvTjz|Z5^ky$J$D1kF}W6Uh7Ya`>Zc0?zdj2 zc)+?x@t}3K;vs8q#Y5KGiifRv6pvWHQ#fjULE)J7CWT|xQx%R|S1O#aj#W5m?WAzh zT3z9kHLt>H>lgB;t+&aav2Kw+YaJqg)>>8mob@-k^VTQj&RfrsyI@@?chTBS?xMAf z+$HPJvX`t+%U-r#B751oR`!Z@gzQyoW7(_L{Ib`q-^g6EJ}GnEdWFn&>vowN)@d>~ ztled9T5HJMwC0kzWqnKfmh}SZ+twMW=jksk_!mQg^M5r0!WW zN!_!)B6;6>x#WH8D#`oS{*n)@RV5!-|B-lLeO2P2^*V`%)*TX$tdk`kS=&oIvX+r} zZ2d+2vGqpr$JPbnPpl2apICnpdt$vq?5TB~*i&mav8UGjV$ZB^iaxVmD*DX2SoFEI zljw76A<^g7Peh(uZx?xC-7WIMI#J|>wS~w_YXOm$)|Z7}T6YM)w6+(1W&K0wmGu^( zSJp*BudI!PUR!?=d~Lm5@U?ZV;A?AF!8g`?f^V#E3B0jhF7U>>OyI4xo4{LZ34yoP zH~8OLH}Su`ZdRA>-8L;txGw+Sle=Zv1aG^V!fRGi?s{;7we~NU#+{?zFHfzeYJkT`qg>@ z>sMoZK> ztrszUx2|IPVI9i!!`g`HhqVCH59^PNKddh^{;=N0_yfEru$l3vbvENq>rlp@)((t6 zt#ufGT1zti1h)acBaH)`VfbaepW&DFW`35fZP`ZIx84-MnE>h zAMkuY9Q2$3&{zQSx&Q};zt%Pkf2}PTAaepn41cXb`vhQX1JoJ*S*tMovsS`69`N5< zi~-gT*l%oU;bhEg@x*Am`5dDv^E4wLb6X<~b9o~^b8e$wW`7Oen0+&RX!h0cme~)( zYi9oqubOcgT{V+1x@M+nbi>Tn=(bs~(S5TVqsL}#M$gR_8ND_;VD!Q4zR?#m2IC)Q zipGD;T#WyjWf(J>_Zl;sZ#HHzziG^7&S1iBE@HxNu3^G%ZfnA39%RC5o^HZyUSq;& zKGEdA*>aOVW_wJ2m|ZgYV)nx1gV{fmH)bNH&&;$i`ynMEY6!Ov^Zk2(qf0nCW|#DyDb))9I=>c za>k;|hGdI>vRD;>N9(%*H*I z?~Nu~-Zq+LdE98B z9$J1jd~W&B@U7)J!_Ss`41Zd#GW>5j!;sag&5+Bg)KI`G*-*?X$WYqK(NNLKz);Of z-cZMi&(P57pMjaxTLT-by9SO{XARt}_8E9vtuqL)nr9Gd)o&1GRc{b)RbY@}m1vM@ z6=aZSaKpD)gk>!R?GFLTlMJAwkpz}Zxyb; z#L8BGg_W}Y8Y?dS4OSoYwpd-)+hMg&Z;#b7y#rQ#dPl5E^-fsD>7BN6(>rgauXou> zLhqUtquwp6SGxDCuIN6r+Nb-}YK86#tI4`=tZH@NTV?2evI^GyW@WGY(@IPCkCmA2 ze=8z*uH|W6t>t4KujOa$tQBCbp%rA!s}*AXSu@=Fre>t|0nKRZWty?peVXysrJ9M> zv6{)&u9~UVx|-?MqMDi3|1`3#Uufi7U)0FA-mOt+y;P&vdV)r&b(Kb$b(%(nb)ZI- zwVg(dwU$PmwYWxuHH${0^<(vB>wW62)-%=HtV`89tOM1%to78pt+~~EtzW41Ssz!M zV7*jrqIHYfWa|{QDb_A()2vn1rdzYA&9Hv1I?MW`>TK&Zs&lOSRp(h3sm`|!Q(a(f zrMl2sUUjiGi|P{VS1L=bFQ_cD-lnqLdalY!>lT$&);TJxtwU7SSlg(qwN_PGXU(s& z-uk2R2J55B8?9$4Z?Y~>-fZoryv15pd8_qTrES({m9|?iQ`%wOsI=2MR%w^DrP6L| zF{M4$pB497Ur^jm0=c);@{{t#uU-S@S6#wtla0#QLJb5$i1qN3EwT z9J8)gIBp%UaKhR};e@rO!bxj>g;UmVW9hwU^ulYX!NB*573>TA!D_WW7T6vUQ{EW$PH(E7s<+SFD9)uUdbQxoUk@ z=9=|tnQPWvGS{uMWUgC#%iOTmk-1^bCv(&Kq4Z7b<wZ0{J&w8!oJ?lov`_`e7_pP-h?^`oTKCr$e@xXes#6#;| ziHFu15)Z9iBpz8SN<6auC;rHKxANAAb%5Y&Ye~V^)=vfASZ@?~ zW8EO|#yUXYjkS`%TkF^SZ>^{DzqNMae{21T@2&L`zIWD9eDAD<_}*Ec;eBV_$@|XQ zllQ$fH}8Av3q0?wr}4bEj^}xAt;O@f`aSmt>pt!e)&|@ktgmr>u&(F&XsyHb(fTgu zN9&24AFXpaKUq6*ezF$i{A7KP}no{=@p!dM)c$>qOSC){?AWtuM2DwVufG%{qwXo3$9rH|x91->jE0f3q%P z{$}mS{M}lJ`MdQqrtj9fnZ8?3X8LZO%k7MWYjD`bH2z3n7Ns4 zGqW~3ZDwfpz)aojo0*Imx4EF1f;pR+srheHPxJStapq4HHiK(xJrfHak ztZBT3plOB$t7(zNPm^kkwIB7D^Vz0?^i%ljQES8zhnjngdsjB_n5jY}+5jB6|fjGHb07vbLnf;xLk_D#Lq4l`Lt!gFLrE)JLpduQLlrA& zLrp7gLw&1X1}0Xo3@oi~8Q58!GH|ilW#DPG%D~TRwn4B}k3oc0jX|tcu0fJjoI$!( zfI+sEqd|d{kwK}Iib187m_eNtyFruHXZ?1o8~WW=d-Nw*E!3Z4)viC&Dp!B5Rj~d- zD@*;QR`U9*tl0F|S-sWUWOYSvo7HZ;T~>?r_E~l59kMFcJ8BiJchbsP@2r)M-bE`> zy(?D#bZ=O_(7kPSN%y|h9^J=Q%XFVvP1Jp9RjvEhDoyu;RgmsyD_h;~R+_rMtVDJH zS~2P}SijX_w!WpqZhc&b%X*6ruk}J50qcGpVe1+lG3zWH3F}B5X=`^KIcqZ=MQc?Z z6>AY4b!!$KP3z~{I@ZUu^{tm_8(Oz(n^>o7n^}8kTUu*rTU&E$+gZQUaRE;w0K#dA( z8;vS!4UHOWQH@$_MvZ#wyXuYBJJp-5r>eJD7pk{e`>A(WYpZu!bE;?ab+XzdYZtXC)+%aKty$HkTR&HwVSQ3{ru7=t+1CB4bF7P0=URuU&bPKw zU0^M*y3m?Mb&>Tel_k~}RF+zAS6OB~Pi47vtI7)NT$Pp9p(?AbZB^D-tEsHD=2ux~ z{aJav^>O75)^n6MS{EvBvi4BkY%Q<6#rnI_R_pUh+pJe8ZMSYx+F>25wA0!`X{WV_ z(k|-{io31PDekdeqqx_)M{%EZw&H$kAH@UKx{3#_`4kUXe^5ANeM#Z4^;U%=)-x22 zTGuEXvrbevX6>qQ+*(`Vgtef;3G4UrC$0C&pR(?eKW!Z?f7)6{{*3iMxwF<6fd)b-e6lYb)8y)?%_(tUt?KvA!sC z)q1_mRqH;PYu0%(*R1_yu3PKNT(=gKxnccW`iAv7>6_N2(l@Q`q;FYsO5d`+B6Zt( zq10{be5pIuc2ak&`K0bxKajj@y-D(}b(`cp>uAY))`pVztvMv`TR)JvZ@oj}f%PPb z2iCa~53D^U9$KqOJhWz(cw~K4{E>CD_#p%Q&te5e>u@2&YYt6|2)_M!yTkA}|x7G@LZ>?|hzO$ar`_4L? z_nox_?>p-|JnyX+^Srmt=6P>z#`E5q8N}!QVC~BN!TJ@~2kXgPAFLg?K3Ko!{Aj(H z^P_bn=SOQ{&X3j?I6hkUb9}T8;`n53!12jigyWO-WA@M1Q`tXTyRv__{>=8-dJ)?f z>tMDo)~sw_taq_~u`Xo&YOTfk)%rQhSL*7Vfto$k?Fhj3a0PYO-$ddSg&CG zVcpO8!@8XDhjk+3Pir5>pVpR)Kdsdme_D$${qn0dijeXkB0p!*6R?8z7zGH~7q8C(Vu+oiTf0bl&Wr z(PcAP=4$f9EYjq$ zS+2=LvnG@KX46gXnyoRpWp>cyy4f|8%Vw`l&YLlso;DLVJ!Yn3deF?tbdOnt=~lBm z)AeS}rYp>5nl3b3Z#v8DsOcoL+os)SA5ELg*v+cUWXuZ9jLb63Jj~+FV$H(Lip_k? zI?SBS=9yWVZ8p<4J87nBcF#=O?6aAm8HYKWnXLIAQzP?_rtap?Ory#XpmLi%%vM7SBu?EpD51S)4bSY;o9Rj>UG9r53AA)>Q+$#IKXlk*luCO0h7O&(apn7p(IH2G-ZYVy;<%7oEU--Odr#YE6j(nP|N z&qTqJ*+j$ggRz0-En{=bBgXcY>x|tjXBzujwit(6<{QUYMjIzvx*2C%8X6Z_${JT% zau_#Qelcpdd|=dPdB$jpR+sfVt+wm;TFud)Xw|4c z%_?1gmX)vmJS$`U#a2@K%dHsoS6jW%TW@t^>$me>+QG7*E?(#u6NwZ zLGP56rrtR#A-zjhzjd!#J=MKwbzb+b)lS_9R*Q9?SoP^Xx2n{AWtF1)&dOi+qm{Mp z7b|t$A6CM;zpei3{Ihzk!)Sd&hsFA+4!iXx9WLwnI=t4sIs(?!I>OeOI%3x0I+E6| zIx^NKI`Y=aI*QgpIx5yoI_lO>w6&}cYwK7q*4DRf(KfP9(KfMm(>AwO*S56g)V8sH ztz~C@PRr4Hqn5Mv6fIZl3M~)o7%eYrM=c*~H7!4DZmmG;51PT&*EB<|_h^P&FV>8- z?$V65F4T;*j?|2|cGOI?*3?Y47Sc?${;iR2{Zu2<`n*QA^-hgk>%|)R)_od<)|DE? z)+rjL)&Ux2*47#o*6JEn)*>3!)(jf8*0s*x;)}bmZt!-6S zS*xk6wiZxXWBplqt@Ux`b=Gr~*IO4UZ?N`I-e@hayvh2z(q`)mN?WW~Ds8oHR@!DA zr?lPLQfY^^sM1dBkBYmj&nfP?}Dt+^EsSiey?XnkJc zp!H^jL)Oz34qI0%9I;MNIBM;xaLig;;h43c!g1^O@+YkK%Ac_Akw0l2BY(p!yRt*^*luwE;B!Ma`cqIII|MQa<`OV$#y zm#x3bT(-U}bH#e2%oXbiGFPn&WUg8V$Xv5Fl(}XtEOXuZwe)rCP0}~4E2VE(J4xTP z=9Ru_eM9P&^-`%@*2Pk{t(~N9TMJ3uwtgac$9kLO9qTU1yVmiNcdbn%?^<(9-m`uz zanE{>#C_{&68EhOCGK1MNIbCClz3pxF7eR%wD?2oF7b!fUgD3edBh)CUl4m_Jx%Pf zb*$K9YgMtw*6&51Snn2nV%;J7#5!E`skOT3Q|lihPpwajJhPrB^31wK}Rmgr8fl5`J!-DEz`&O8ABK6`>c_6NO$_2MWEk77}`CeO2(K^(?`c)`^0zthEGR zS$`3DWqnZKm36SeoPk7#0ui|-UUBvUw+J@(yH7Cz|>-F64tpm8uIcCtRq;zSWB^fvA)Cd#d-nD7wa^ZuhzOOU#-6} zf3-fy{MEXj`Kxst^EYb)=5N+4%-^hUGJUh&$n?#+o9UZ%I@5P+7pCvl%1qy_S(v_C zKV$rEeTwlrcnn}V;}7e4#vj(1j6bY{8Gl&YGybsFW&CL^&G^%ri}9!RFNUAiuNi(? z-(~n|eSzVp^*KuG=n#~QRp(1PKQHFEtA+aG|~C-~1Ad7q#Z!#``#xmZ8Jb0#xtRr-#h7`T6`DDiwVRol%`ww8+i0e2 zcHB(L?2eg$*+(;0GdAi(pe_3lCEr3ma223qw4gbr-_{9Ut=}P7sk4l zmyAs<_ZZt)E;n|uoM`NASz{bznQk0q8El+rX=j{asb!pRDP~+|$!J__`PQh#@}^O@ zotE}S2P}1rj#)|>owZ~)x@`H?@TTQs z!~2#O4WC->H+*fm*6^d{9K-LHU50-xD-D^gG7LGa!VUSX+zdsmObsQiR1D>oXR%HeeR_O*YRuKk?R$c~a zR@MgDR=NfSR&oXFu;?*4t~9t#`mGMDK`|t=WuC!tL?h?tQP7%wCd4)YE`cL!YWDkjg_zNdn-%bPgbhBU#$dne_H+3 z`D67`=fBl89VY9;I;_?kbU3W%>2O+o4u>Ihn=>xfu~>4;mq=tx-`>&RLw>Bw6P z>L^(==%`vh&{ntJudQXhKwHGaKx$4h}*4s3)tru$KTK8z=TbFATS|@1~S^H^}SX*h7 zS*vMOSPN@ZTK`wCw!W!eYrRFi&bnW{!8%L5$=Xf5*;-k>)tW)Q&HA2NhxHz{PV3of z-PYA=J=W1`ebzQ=6Rc&`CR#J7O}2idI>q{^>Qw6$s?)8zRcBb|tIo0xR-J8ap*qJ} zR&}m5v+8{77b**^&#Nr7-m0?5dXCBx>lT%z);TK6tV2|mTidFvuvSx9Y0a;)%KDS? zYU^XlYpiE0ud^;xUT^K8yun&td874rrA^l7l{Qnz1R)}D%cthE&PT5~Jzvwown-};=w0qczl2dt+k9JH=b zIAk58aM;>W;jp#3!Vzmeg`?K5wV&J>YZbY(*1u)XT3?YpXT3)Dymg!GdFw>k3)VKW7px^@FIs<!ngR zt&62@T02SIv=)-OW&K$4mi0Et+tyu@x2@wO?^v5i-m&JEykq@X;;!``iM!TQCGJ@l zNZhmbk+^5ADRJMLP2#@wDe?Q(o#GFyJ;fhbbBjN;J}>srdWzUX>u9k@)+%C;tlx<~ zvfd^7*t%Wxv302EV{28>$JXCOo>-q0d15_R)+gOt!Hq*v$o`ZXMK1-dZIoUp1Z(#js z9nJdDnv39;Ud{N;dLrXD z>k7ti)`^VYt-Tq)TbnU{w^nBSZY{w0-TEKHck6cyKdkRD{II^j@Wc8L!w>7N3_q+_ zGW@Wf%kaZ`62njH4u+rB^$b6)%NTxI=Q8}XPG$IM9mnv?I-KE`bpXRJYcGah)-DXc ztnC?oSz9suvNmP-ZEeW#+gg|5x3wn2Z);VC-_}YDzpdpNep|~h{I-^4_+u@`@W)z& z;g7Wt!yjt_hCkMP41cV782(suG5odWWcX{%&hXco4UCmcWGzk_-!jiKo?xzE9A^I9 zNYi|m5u5o;qt|8)M%T>pjgFe780|ERH`-tpXSB*J$!M8brqN=v5~IatjYf;jCK@d< zTVk}#Y^Tu*vkOM6&0ZL-Gh;U1XeMX8+04dxn_0B+F0*RmJ!W%^_nGZ8K4A91_@Eh+ z$sscllS5|eCWp=9zskO*dmT zi#L-t3pX<`^D}cbb2W=LvoR|$Gd62A(=wZ7rf9a_Ox)~<8K2orGZwRVX1`3C%|Dn* zm_IYsHNRu(XnxT&%>1}%miZpjI`fUDlgyWzE;FBHy34%Z^qhIK=|l4h)34^arYsgo zrhFD*rs5XfrivE!rdk#zrY07ernVNcrfwEOrU4f0rjZuEO_D4=m}FZ#F)6XQX;N!( z&ZN!akV(JAc9R(vt4$VIEHGJVF~ww)MW@Lwi#n4-7DXnfEz(UcTf~^$wg@zNV&P`; z#=_d8(D5Kwz8aW>}c6#>}gqQ z9AKGX9B%1t9A{~6oNB3LoNLKvTw?jlsM_+GQIq9mqYlgcM*Wtnjiy=7Fq&)GYP8t0 z$Y_;iywL_rAEWJ-mPUIm)r^i9<&|*YC8NqTg#(r9aUsUVoaEtNtu29sPM$Li&rWe(Ei=dZ4$;>bTxI ztMz)DtfuL0v#QtIWtFbC&niIgkd>w0F)L-gQ&v2BXRW^JUbK3kd)4Zc?hUIgx_7MR z>)yBO(tT`Is{70;LHCuFx9(djbKMVC%DP{y_;tTq{n7bl^+M;b)m0q^>q9!s*6VfH ztmo=*T6gL2SXb!qTc_y=S%>O~T084VSR3g`TPy0wSqtbWSpU~nw!W{eX1z~a!+M^! zwsoDho^`yofwhCSv9*%6sWq#%h4phSE9+BQw$|&k?5!tiIa!x#xmZVOxmnw3d0H!L zd0TU8`C7lz^tZmE8ECy*GsJqKW|(z{W`uQtW|Vb=W{kCiW}LN#W`eb#W|H+UjTGz0 z8fn&NH8QNXYh+n3)X28(*2uLk)5y0@(kQg{)hM>M)F`o5)hM$T(x|Zhr(R`!Q@z@H zvwE#{zk0oOmU@G=yLywgvU;;Mqk60LJ+(ILy=ooSv(-AStJS)#qttq=t=0OhrPcba z|Ef;3zOOpT`jF}r>!qqwtvghwS?8+Guntn4X>G1L+ge6-jy03&T>P^?WMfV zT2Xnu^-rY@)|ZqvTCY~xWZkN?**ZaKi?y}VR%>ykZPs5Dw_9IS++n?5ai?{!;x6kP z#a-4uio30K6!%#3D(%sO2DxV5_caqHi5C#=uQowQyecgng_?v!q8QEt>;MGwJwvmYaJwU&styNo;8oeJ?m@Y z_pPUh-?t7Ce_$;p{=oW{*aPeNVh^p;#2#Afi9NLbA^OPri0C8h38Igz<3%4^>xn+L zW)OXBeM#hr^)its*3}|UtOG@!SZjzpwPqA~YQ0VPsdcXKGiz1hXV&+Ho>|WkdS)Fh z^xRrn=(+Vh!ROYC1z%Wa3cj#55`1C(N8p9^34xc^(*#~xrwY8ZHWPSh%_;E8dN=oopX)}s8ctdH@%wyxrPZEeW++WHmmYwKmaudP#g-&m{hzOjDE^Tv7|&l~G9p10Nx zJa4Uec-~rX<$h}&%Kg^*C)Ydc1zhi}y}905|KfaSy@vChbt30`Ybnn6*4H@RTTkJ5 zZyn0<-dc*|gY`l757r^qqNK){oZetRJm!vV64eXZdLD z!SczPjpdW|G3HO!UCf`XYneY=moR^}j%WUC?Zo`qT9NsS^*^RB*0-3xSZ`js9O*5wR8t@9XuTBkAm zw2o)^WgWrr%Q}eRm$f&;FKai3U)Bx`zpSkpep#C_{I)h?_-(Dn@Y`C8;kUIKN*mx0 zxD6nVwGHqW+y>x)w*iby#4KJLpEvI|ZZmf@_BCfWRxrP1^w(^M(Ic~YMrX`=jP{r{ z7_B#}GFoOY+Gw^}qtOhrZlh^tGmNI2EjOBOw$o^a*;%7mW{-{Ln*BDKZzf{A z$V}gOiJ6b_anQSr(G}&a9 zYO>L+!eoP4kI6c-1tx3EwwSCmJ7KcS?5@dTvri`T&Dcz5n@O8aH#0DuWaetxYZhhN zVOC(;Y}RU8V>ZjQ%xt}BzS&XJ46|FN31;t2Bh6UM0?nk%Jk9jY9L-$JEX^X#49xP( z)XiGVQw<9pQzHvS zQ)>$`Qx^*^Q$LIUCgB!eOcE?!nq*qsH7T;VWKwN$+@!@~k4dk^29s$POHJlk%raSS z(QmTeqS<7JMTN-$i(HeF7D*--Ey7H0T6mj0v~VzaX<=&e(L&4Qr-gzEqot?`rzMw( zpe2Keq~&X4Mayf(8kPr*4J_9fTUbsvwzq6DcC*Yi_OpyM4z+YKja$4CM z@>}T|ide}QN?Gw3%3J+0P_=qvpk;N(K;P=DfvMGA11qbw2KH9-3|y@G4Lq$H4E(GL z4T7zb3?i(84Pvca3=*x(4AQLB4YI8y4GOHd4N9#3=vP`j(66;Rs^4U_O25r&f_}GE zseZpzwEko(C;b^#8v1jr`1Kc9ebZZFbyshN)e*flR%`S&SWVH}VpXHJ!zx8@kCm_9 z0V^}T!&dTo$E`T^PFsD_J#Tea_mb6d-D_5xbZ=SB(YK}6m>sY@#%iG`la*3>bcHut1CMHtPbihTCdY#v7W8NZr!QFWnHerYn`eiU>%|( zZ0)2YW^Je=X|13mW6iH4XZ=rG(fY2oiuGP?b?dp>n%1@2I@WR8de-*ZhSrMO#@5W* zX4X%&EUZsxSzE8xvbFBla1TaKGr)S6W{~wl z%@FGj%`oc%%?Rso%_wVo%@}J9%{Xg8%>?UT8cEiVHBzk4YNT0j*T}G5sF7veqmg4> zu90V*q>*p!t5IlesZngLs!?h!q)}%5SG~gex_XuMM)hjzUiDh*O!azeH}wWm{m_t=m)%T2t*n(Ub)v#SYd3|1*4he(tOXSgTYr#0V!c=Xh;@(rQR^7_W7azI z$E^R!9k;$9cfxv!+zIOnxs%p@a;L0SkksQtxrhYv0fx`$GTSHu62aOU29W`yVgPy_pBd^-?LsIe&0Gl{Jyo4_-8d!ty@H%SVxIG zu{IQWV$CJ;)cUyaQ|nscr`D#zPp#hzJ+odd^vpU_=$W;a&~xiIg3qlt3O=_k7kqAQ zFZjZmQ}BiLRe=}Qiv(U+7Ye+zb`p4LEh_NR`Xc{J>l*%7)>{0ptZ(zZvhL%1W$nuM z+WIf=YwMl7udT~@Ut62=zOnwr^Tv8V&l~GDo;TJ3Ja4R}dEQ!I;(lvg#QoM4pq zZmzf1X!UCH^*+K}^|^&5`&)~h()TW4{+x7Oo$Z~cP(y>%7)2WtWL z57w*MK3IFReX#z(`oVf8>ql!h){oZTSUy^>X8CBH!t&8tf#sw11LjZGi&J^%ArU#v5jzF7M)eYG}b`f4rC^ws(g z<5%lPj9;x!Fn+V%!1&F22IDvDM#gW}*^J+;!x+C=J28H@)@S@~Ez9`bnw#;v^>2pn z)^8YoSl?y%VU64dSjF(edOpJs>nRLBt-Bb0S~oKMw60+IXjCUr*$I3FY73V zU)I44zpQ;3ep$OS{IYgr_+@Rw@XOkq;kUIh!*6SSXd6JC;kUIi!*6Q^hTqn*41cVp z82(rjZUZ=*2w1S095G*OTw|VO>|(BNEMfl3=&RW^qnl=Xj1HTvG}>%7$7q?^RHHd& zlZ~dDO)=^>n`P8vw%Dl4Y@Jb;*W)F>e&Au7+neiG=G*dI4Z02A*)hxz% zx>=?1EVCKLbIi6I&ojGWyuj?I@j^2`lZ9sTCX37rO%|Csn=CR5Gg)YsX|m9)#$HQio4K3TnMIpcniZNBo3)wd znawuMFxz07Xm->z%IubDklA}vZ!;D%7c)sS8#6sK6EkNs9kU2CWwTr}X|pCXA+zab zoMvmx{+k{&`(}F8?2YLwv&W|Y&2E|sn_n>1Fh6E$W4^~UzQMY_o`ix`vh7J(+$E!<4*TUeVsw=ghyZ=q`P-9p;rzlDGayCtg$zvVY$am$Cs za+YU})hu@y>sc-~Hnr?GwzaG>cCkz|_O=W(4zjd0jO@7|pXxHCk#JWVG7S!Dy4EuF(!lX`}s?oJL12zZ;&m zd}?^n^0MJ|%Y%k@EjJiGww!PH(z4I+y=AT8SIZp3-tSa@kStaW2vhvc~Yh|o=&`L({ zs1=*uNvrp|XRL1OUa&f%d&O#;btY_)4S$F7gT9@hYSf}XlSqJL~T0829SR3ew zTg&T6S@Y}2TL0CSx4xsTWW7gQ)q0M$x^<1VmUXPQuC<-EzO{n3ku{UHiS<)0bL-<; zme#AatgZXB?5vBl9IV5%oUN_3T&)$g+^yNPysY17`dDAq^t0Zn8DPCYGswC_GsHSy zGu%2{Gt$~#Gum21GuB!_Gv4}_Mxym&jb!Vy8mZRXHPWmXYGhdVXk=NJYvfobY2;b^ zY7|&oY7|4C|Ecy_KTz$rKBPL)da3Fp>kie));X$Etpil2 zS(~U%x0Y0$Y5h-Smh}^r+1963=2&l1nP)vqWxjQj$^z>wm4(*9DvPacRF+t)sVub? zP+4aEMR~dPN#&K+^OaXwmnyHe_EBDAt)jfv`j65&>#IuZt=B7Uuf( z9k*U7cig&G?u2!)+(~Oqxs%oma;L1X%bvF0AbZ-nOZJR)itHI{d)c$r(z55Qf61J) zz9DnodWXyf>*+EVtSe+LT1U!Uw6>DDWGy3e+4{fqW$RYDXVscY8lQrE4+q^?`5OWm;kA$i04l;ln8d6GA+izIJadr020mXo|?{Y~Pw^?8Zg z)+;3LST{@Dv5u3tV{I*Q*IGj2uJv2-d)8~j?^$Py-?P>gzi<6P?7sC@vHR9FVh^lc z#2#4liaoHtA^OmIspv!NV$p}zPNI*jg+(7(KNWdoy+h=&b+5={>tvC~)>a}^B4J+rnHdS?Aw@R{{~!ROYkg3qme1)p1s3qH4g zB=Ev|y}%3WI)N9~egZG76$D;dzvO>uJ(>TdwFCc4>koXdtQYgWvX10?Wi80}%K8lN zYwIrF*VbOVudR7_Ut3?`d1F1D=Z$p&&l_uPo;TJXx!+h%;C^du#QoO#2G?8bMy|Kk zdR*_U?{mJhp2Ydi+LQC0H8bZs@Ekw`$9rpMj`!A_9Ph0cvA?%AXa8V*k?n(ZKHCRt zVYUy}yI4P1r?Gyp7GwQreUjy)btB71Ya5o2*1woPTJK^0WZlU8$=Z|oleH-GC+kN{ zpR6}CeX?$2`fMG;^x4{k>9aK-(`Rc=rZ3jQOkb?|n7&vuF@3fE$oSRz9^+T*lZ;=j zw=jOSp3nHrx{L9fbs6I~>mvT; zwE?y<{IFil@WXlm!w>7J3_q=V7=BteG5oZyV)$uY$neuTli{az62mX+Xog?bAq>B) z{TO~(docX6c4qixZO8E2+LGb7wF$Hhpv~~x8q@|*0k;AEptJ!*QRV{vT5~hN#sPv& zI4#6Xc9@?tE;4U6wleoH<~Nr#eq;94=z`fTqg`glj8>ZMG@4_!(P)y{T5z4;Vz$|+ z(QLO-o!L>NIdd|x)thk{H<~FJHv}O(vOnm`pN@HkoLaYcj#C!KB}8ibO|pYcq{En{66tw!t*m?5L@a z*)3C7v-hTUW-MlAW|C(5W_o7oW=>}EX5nVyW;tejW{qa7X4B06n65JWY`Wj z*s{&o%CgAV(K621)6&y8z|zz>+)~jv&XU(S)$*rNj^$IMV#`ZLRhIjV8ZB2Fby!X} z>a%Pynrc~SG{-XDXpyCl(Mn4zqxF^=M%ye!jrLeF8y&LzXn4Z%zTtVxbB0$f_ZZ%` zTy6N!a+cw9%MQc0mgR<@Ez=EuScVz?vvf0Lu`)H}vQjnVw-PZFwPG=pvif46VD-d6 z)#|E&meo-M1FLNYrdG=gtgNOR*jsfNxL8#hcv@u}_*umm1Y7wTL|EAy#9A2|Bw8sO zq*;j?WLvQtCLygs<*^yuigr)rFv_udi6F~mFaD3p$ztn=OK zg3d3ieL8=wR_icW&(vYDZr5SAF4f_(PS)YI4$|SbcF+;B*4GiWmeY~2=F^e3{;e%% zeM?)xdY87c^(<{Q>uPNc>lkfqYg=tyYk6%0YesD&>nB>K*2lHXtygJTS@&t#SQly8 zTZd^mT3c&5TPtX}TC-|-Sijcvvc9P4W4%Mu&w9RQpmm#OuyvkhsCAfTxV61zq_w(c zw6%a{to2Wgc$g%d*$g{T6D6m%3D6$sP zD7OBmUTS?qz1(`UdWChLdX;sidX2T4dabpRdc8G+dV}>{wI=I5YR%TO)LN~p)Y`10 z)HoY2|tv9L6v7V_i*Sb+y^t7F+YFEVcfqyv+KT@^b4r z$}6mkl~-DOE3dLvR$guWM`^9~Ri$;->y_49cPVYKPF31y?WnZLT2^VZ^)JOO*4Guc zSZ`I_YCT19n{~0`cI#lp9o8m_JFP_(cUgZ^*lm47VYl^eg+12u6!uy-DeSXOQ`m3q zt+3zPK;eM3n8HEpU-E~nPsks#o+f|TI!*qFwYmIJYYzFN*0<%3S+A2jZrvnz+&V(; zgteaBNo!WQlh$`+Pg!r3J!Rb|d)hiv_KdZQ>=|nX*|XMvWX@XOk~wF+L*|_IbeZ$k zWil76!(}d5TgqItmXWz={a^Z$^>OLT))S;JTSrM>u~wD7V*OF-s`WmptJXbI*Q{ft zu376yUAO)xdENSg#N#3+pmAqyBN8*m+VlcS_v0PLa4{ z?I>}_T2A7Q^-uA;*4xGJT9=F8v$hn!XZ=U)p7jB-`_}DZ_pSZK?psTUJ+OW(`oMa< z=tJvT(TCPPq7SWQMITwe7kOlTNaT_AG?B;FIUoDOb z*8IXxtxpR*weA#pYV9HP%$iH+ne{orXVy~$pIJu>KDSm8d~W?-;JNi4ffv@@0xzti z1zuR|3cRpp5O`_5ivOi`IR8s)cK(;vJNaH&=kdL=R^xkR{ebtC^<3W9*0H>=t>t)M zTR-A?ZM~A`wRIuS8*3Y$H`bgyZ>-mIzp)PBerx@e>#g-XuD8}+TyL#^alW-)%lXba zne&~s4Cg!R8yxSfr*pisj^uc6EywZR`ZW7{>v;C})<4+ZTTf;CU~SI!!TK)i2kQ>j z57y?aAFN-pe6*g=^3ghy<)gJY%SY=Q%pa}iFn_X6X8vTY%lygu7t<%}lT4qi=P-S; zE@b*_?ZNcfT9N6q^*x|rdobvDCK>lB7x*0Bt~tiu@4*982wwqp1VUK3!z@Y`C4 z;kUI0!*6R)8$glak2Uf*0HO`>*P53B(gxsUNHJluP&Zj){@ysle2KB4d4@5Yxux-A zGZEwCW3l( zm^7LBnKYRtm^7LdnKYQSn$(-kFsUl&!o!il1aJQQiHYT?%3{4(esF}RBkTLme zA!zc;g3W}<@`o{(%wR&ivWOdO%!|ITMuGJ<3Bdf&*=2lY- zY^_=ioUF=wtgh;wvD&YD-fE@pWveN=*R1MwZ&_vO z-n9zTeQ4#R`@~95_l1>|?rSS{-FH@BbUs-<)cI<4PUnZ!9-ZG-D|P-^P1j+xZq;G6 zF4p0&PSWAF4$$GXw$~A`*3%KTmemon=GBq3{;4fveN$V`dZ)Ic^-OIQ>nd$E>u7CF zYa4AHYdLK_YX)sY>&IHg*2lEWtXFDTSodmKSr=;AT8C=cTU%*4TFYy>ShH%mS-;lw zu)e72WxZX~*Lt3&zjdo-pmnZhuyv?rsI{$TxV4&Qq&2^0wDnJoSnEd`@z!TF60Nss zBwH`kNVV?KNVhK6$h1z<$hP*=$hEf8$g@_{D6kgND6;;qUSfSyz0`WMdbxGKdZl%i zdX=@CdX2TRdaX61dcE~MwMOf`YE9O&)mp5p)mp8i)!MAB)jF(Y)H<#Is&-r7SM9Mr zsM=?}RJGr_Lv^Bcj_M@qK-J0Crm9n|rB$a{GpJ6tex@?R`i#mf>&+^&t!Jssv2IeC zYn`Ps&pJqDfwi^DLTeS3Mb^A3i>==)FR?zNywrM@@-pi}=|oD*|XO7WX@XekvV5QTjrc~waj_zXqofYHZm8iyl!19 zdBZwb@`kmRB3K}6@;Hy-xhjeJyYnZb%fAUYbl|p z)^`P;SuYZNW}PMY%-UG+ne|_R=hmkLo?Filcy65`@WR?s;Dt4hzzgfc{4cEY`CnSg z@xQdb!1vO+h3}=cHQy`iue`6UH}Sr*F5rD-ZN&T9`YX?C>)kxBt($pXTl@07v6kd{ zV|{`9jdcO{8*35nH`aT&-dd+~y|otOdTV`x^R0C)=R0dN&Ue-yIo?@s;CN?U$nnnF zl;geiclP(zUF`3z71`fg?`3;$9n1E?nu+a$^%~X>){(3qthrb}SRY{dXkEeb(b|;d zqxBc&kJj6nKU&u@f3$XI{$wr8{K@(ubPS-K>63LV(`Rc_rq9*_OrNdaGJdu`!}!^H zE#qhF35;K?OBlacM=^e}c4GWut;_h;+Jo_{bs*zc>j1`Y)}D;ttR2Ah|2Jz5#&6cr zjNh$!8NXXIFn+iG%<$d%8N+w$TMR#}&q3D%fZ70S7=BnUV)$V_gW;!jAHz@UR)(L} zwG2P4OX2GRe}UHpg4P5CLe~Vig4YE6wzg*Y4PFy~x-RgKHK+|B$MDBm8afvMYXk5z zz}f&MCg030Oct7Rn8cbNHP$fiF#c;6X?)Af*m$3rnDGiTM&s#bpNu-qUV!`grDl(e z^39$aWtqJ;N;msrlxoIcoNC5zoN6X-oN8udoNDH7oNg9toMBdKoMqN;oNcz!ILGXm zah};@<9stllR`5AlOi((lVUSNlVUR`lVY=AlOnTJlR~p{lLE6&lYFx|CV6J-O>)c* znPiz=HOVl0VUl9@$0X5Az%6-DFIhwJWg_->|%`*FHT5tB&bh6nK)8%G&O!t^w zHoahW%JhlZLDL^*+f8}R*O@AsFEKSWpKa=CKFKuJyu-A>yw0@6yu@^dd6wyF^90lV z=3%Cn%zaFsnmd{PFgG`4wa_)?w@@;bun;#@wBRw-wqP_hvG`_UYw^a!&Elbnzr{6^ z2#eDui53S!WHMUxj6;wB#~cuam+Fqtq|zBlHuyk*R9dDK|ka)Ys)!>L z*|OWH%d)~~f@P}Fbju*4xt0z_ODuJbR#{3LZLs7t+HU#XaIfVv!^4(W3{P4fHoRcD z$?%%x0>e9&{f3V$>kMC5<{7@Vj5Yjh>0|iQ(#G(=rH&zsm5d>m6^|jm)gJ>MgdKr?=dyO>ebTzTSGPaJ|h|4tm?IwDfjciRkUK`m1}$>V@tx zt4q2kt@h}iwOX!w(Q1*@$v%jk$$^XQ0M zf7h0>zOF4}yeswY9dEwXC*|^?xmW>qlCK)RJG5#L$%*JM|FaAfa)Y`6V=JqQmRv| z8C0iPKU0}*eO6_L^%j*`*0WV+TQ{rBvCdYRYaOgI&)P<1fwij2LTi4NMb;mc7h4}w zUSd64d8u`w@-k}=<>l7$$}6nDE3LG?sI#d5Lt*0t(u`X5IY8|S$&Dum74}-2D(thCR@iUNsBpmgqWl5t1@Z^23*--3JIEil7Lq?~{Y37F^$xkC);)4Z ztrO*rS)0opx8{>OZv9O5g!O*elh!k2Pg)nrp0f6pJ!P#ad)k^!_KfvonKRZ0WzJeJ zkU48zFLTa1LFSybgUoqrC7BD>EHW3Y&r4slo+f?KI$rvcwWjnX>n~E5tq(|Dw(gU< zVjUxO#ac(|s`X#VtJaq!uURjbyk=b|dEGih^18K-U$s5-9ByL*okhp0*S>l#; zp2RI{Z;9L1ni99I*(GjUpB2Aj-6MX-+E4thwV?Q2>uX|nt>=i{vrZAaXRRxC-};B> zed{Bl_pK+2KCn&@ePC@U`oNk=^r7`tk%!hRMIKt$i#)Op6?tT>EAq&iP2{olA>qf? z6~d3L4TYarzY%(3y;A6jb%xMWYfYi2)^7!$T5l43YF#1t%-T`#nKh5#GwT}y&#jjU zJhv_tcy8@3@Z4Hb;Dz-a{ukEm{4cD{_+MB*=X+^AoA0G{Am2-CZoZe+$9Z2_xAMNS zcH@0z&B^=9`W(+|>#01it>bxKTWj;Yw*JKZ#(E<68*3BpH`ceg-dMMCy|p&xdTafZ z^R4wv&bQWqoNukUIp0~I~ZS3!@ec0byKWBSy-NyFbT9fU) z^+nbX*0ro3to2wwSU+U>U_F!NgLMeYM{8l0kJeY2KU&XX{%D=V{1H3`@SEwA^=YP0 z*7KM?Sr;>Xvi4^BWUb2d*_x5*v-N$(&(`}HKU*(k{A}II_{BPl@r!jJ;}>fy#xK?? zj9;wz8NXQnVfbqOmf@>4C*xOZVa9LPqKx0H1sT6tb1{CmW`vFbykYom{fOba^>v0H z)@K-gSRZ8gVGWuKfVBZ;GW@ij!0^+$o#Cf-9dvI%9>Xu|bcSEn2@JoiBT?1_{I+&v z_-$>&@Y@=+CIGfB5VAMmkF^rRA8R?JHUMN_z+Y=n8-RzQ#pI>AhsjiPNt0mnXU1~o zD~&&!RTy713o_nnW@LnGW(CGkX6?q&W($mC&2|~bnO!rEH~VCqV8&sRWF~HsY^H9K zVrFiVV&-9zY!+#fY?ft`WL9I6Xx3+vV79;{&TO+utl2S>XtNt85oT{pLe2i01epn$ z`kASjdYM_7x|#WzI+-Pz+L@J^T9|d28k@~C)ic{qOpVMZn7Wy_n?{+}n&z38m^PYcnNBrNFkN9DZo0?Z*Yv!(v*{yqOVh9BdZsKE zDyF;^Ql{b-{H6*PET)5*+ zhOaFn3_n_W7=E)fH~eF%ZpdUMZpd!MZpdr(-9X6dg@J_C4Fg%LlLpFGy9_j}RvYMA z%`q^t>NPO8sxz>)Dll-eN;Gh{3O4Yuaxn<7GBXIZ(lCg!k}`<5;x$OI`lp{^^;kdG z>V$rw)jIt$t10?bR#p1-RtfseR&M$oR=WBeszw zRjqr?DoyvMRgmr-D?8l>R$97`t;BSnTQTdtvU;!c*6NPV2dh&$U#zz4e79Pv^UG?o z&R?rW9R}-s9cJq|9X4xU9ZqW-9Ug0K9e!(R9U*Hj9Z~DA+7i}RwWX}LYRg(r)mE@B z(^j^Q&{nm!($=t+(bls5r=@HCP)pzXh?bG{axD|-ic<)?FGY)@2%L)`=SF*1j5<)|MLC)@mBL)}l}b+R>s>J;l|DpRe`s7$xstTMxT zw#rQFW|i62*(!6aLsaHk+p5g7R#Ta8&9Ab+`m^#P>l4b0t>-E)u`X6#YVD=G%vwo# zx%Drl71o!PR$8x7T4mj)wAwmRX^pk5(pqaNrFGWd71vu|Roq~`MRB9`WW`O^#fqD) zgB7<}n<#Fz7E|12{X=29^=*Y6*83H9S}#`EW!dH2 z_E}$*-*3G{{(yC{{6T9M`GeMC@`tQn${n`eBX`7lqTCVdG`XYJHgdxXs z)~h71TGvTlvksBGX00W8-I`JIy7g^|8`j$-Zdgy2xM^J=anssY;+D0x#4T$siQCqf z#cx|r5x;F6CVt0SQv8nfJ+ZsiOU3S5=Zf96HWRyN%_w%y`mE@E>)E3Bt+Pb$TU&`f zu;vkcV0};If%RsQht?e;53S=w9$K4;JhJ8&d1QTA_>py|@MCKy;m6j0g&te)5_)1? zDfGnJQs{~GAHk>A2L+#6cL+YU4iJ25EhYHO`kBBp>n#G$teXX%TZafdw^kE)ZvB=2 zx%C467uJ6KFRcIby|CWI_rf}Z@1?aO-%IN|yf3Y1@xHQ-;(cW;%lpdu5zi~@l{~Mk zi+EmJ+w#1&=Hhv6y_x&9btv~6>)%{&te0}Vu@2&TW6i|%)_NP~TkBlTx7KQ$Z>=A5 zytQ7;@yl(%{)=7+Cti2e&SQ|5bv6f@}V$H?)#riwLSLEt z@YVV#!#C@@4BxDuGkgP&|AYGf4;a2%-(>i1eSzV-^>KzD*88A)1J^*u0bp%_4(Q$h z$hyE^)|m{yu&fFAZSBPH+uD}lx3vXyT_9v{z#nTh25fDBzt(~bf35i#rkdO~k2L8t z*EI1oXEqTrKWY5RY=-d(vqIxFX2HhO%xsKX%(RWm%oL2X%p{Ey&BTnO%p{CM&18%N z%v6m1%=CLu((2U8#7xg5#LUhl)XdK$#4O$<#H_$1*sRec$ZWDnfZ0+Lf3xi-zGf#)yv^>Ic$&R8 zaWi8wbv6?Jq)mA&1WiRP*iGdu{+Os+d@?bxcy3~8amU2T;*yEC#c`7mi@heX7Mo1c zELNE0Tg){nx0r0wV9{aHX;Eh~(W2O7mPMw?B8xba)fOQpn=QOdc3aq+9I-GpIb)%1 za>YWyK;k67+7JY~7e@Pg%3!)ul; zhIcGW3?Er08@{j%HhgF4Z1}~}*zl*Nvf+PAVMA6cW$f(*WGLNQ1_tK8Qr5++jLJ@ zEz~_@)uVgCszUd&Rf_I)D}UWvR@S=rtTc2VT8ZdBv0~JHVf9YuwbgB%cUC8KK3Z+n z`D(RT=ZDoqo!?gVI{&P4br`K*agSD)z zEwpT`<+SXqnYA3PUursAU(j^5-lpkcJy+Aqx>eK1I!DvbIz%(T+Ez2jT2(W|nol## z`nyJi^+Sy)>(d%B)>}2=tQTk`Sa)e8S(j?0SSM#5za4%-Tb}+*(z=(wbSl+WMhdjrD%DI_r6A_11N2jn;8$P1bg5 zE!OgCt=0@`?beS}JFJhYc3Cf1?Y8b#?Xk{N?XwP2?YA~ponS4aI?0+*b+Ywyl_}O| zRi;{RQJHQ%TV;lIv&u~CY?WEo!78(@ZB*u3tEtSh7EqaQ{Y80!^-1N0*7KDYTbC*? zvG!43YOSKY%=(Yga_g%~E3DTkt+eh`T4kN0wA$KUX^pkC(pu{uitDVeDz3NQthm8? zlHx||BE?PC!HS!$O%%6Siz#lg{-Lnd`j)~r>%9uwtrsfnux?e@X`Q98%Q`?|x3!tV z9&1^JJ=QD=d#$g@@3USezu&q{{(!Z+`~ho8`GeMPuT8()?uGRerq%T+(NMEqFlD=roDt*!VqSPhpc~Y0GbEPg@+elru z=9Ri)eP8m5^(M(H)@_nkt)nHcS{q7Uv*wh%X8lm&y7exJ>()~wZdm6_+_3hRxM8g! zanqVj;->Wl@mtoD#cx@Mi{G}E5x;HyNbHXFDzQ7(#bS4@ZN=_dbBNuwzAAdpdXeZo z>mt$n)=r}LtwludTR#_hV7*)9f%OED2iEB#53TJ*9$HI?JhXly{K$Hi@FVMB;YZfI z!jG*_2|c#%5PEFwDfGmeN9c+51;HoQ(*>Ve#|u8S))ahd{YBuJ^&x?0))NJuStklS zvo;ZUZp|+6+&>R-RYZ0X(m*Wq4j&U*~>pUBUg@T9*5b^--=j)b$`#Wm~_IK8I*xp;$vc0!fVta3Wn)SVP zCF^@@E!Gd#_gOwz&j61Be6SW_`CxsW`J?q*=8x8?%pa`{nLk?pXZmP;f$5X=5~feq zRZO3(gP1;9>o9$?=4AS8{haZ$^$Et$)~gslTlX=3wk~G;44wyY2G0Y0v6f)`V$I6< z#riYDSL;U%U#%}Oe6>Ez@YQ-N!&mDS3}3D1FnqIK$MDVi0K<3dW8k{~yY&%<@7DVn zepv5h_+h<~0dhV7XgvU^4KNY9KM=Gxpc1?;@RxNK!!PS(hF{h(&@}=648N>B8Gc*4 zF#N_?7pTR6+6F-E3;1g-z_8Thta+wMow=2Xow=|HxA{xshh{sB_nS>HUSd{g+-nwT zTy5rIoMUEVoM2{R9ByW4>~Cgh>}6(Z>}qCX>}2L@>|hpTY;TreY;RUzY-iSNY;QK* z*xqc7v4hzWV@I>Q#!hD6jGfFlO`OfdO`OeCOdrLUQ=w9@j2;d;yG zhTAN!8t$-=g@)%WCm3F_tT()6nQ!>OGS2X+rJvzzOFP4lmU@QYE#(aV zSn?S%S^YEMuzGL6Yjxj1*y@6Tgw;UCLcOr8mcFvfcu#YP}^^DS9iceD&5?nd@z^ zQqbFC#ih61>Wl7ft9!cptxo73vf8YB%xa$QDXT8svsR_L7p)R?uUPr$-mtRNy=|qc zd*4b(_mS0qoo7~WbY5EB)OlldOy|AT7M)L4i*&wO_3Qk!s?+&nm80|DDq4rh+Ea(s z+CqoJT3v_RT3m-E}_))Ta4tP8c}tb?@`txdI6tR=M7tbc21 zTHn*su|BA!XT4O*(7IF0*g99s%sNQR!rENR%34;-)|yGn-uk7cqxE@B7wc`BZq{=( zJ*-Mx1rGMuK&j zMv`@+MvAqsMw+#yMuxSjMwYdZMz-}|^<3-g>iO22)C;Zq)QhaM)k~~B)XS_@)yu7! z)hn$Zs#RMbP^+DU#d*DKCd#xdYj5r>$xh^ty@%PSm&tBv<^|3Wo@f6 z+geR!j9SNTbC$quntk&Xl!g&o!b3OlV$6?R$6DD1XoQrKgCS$?ne68XK>rSki%-R1XN zOUWOwek*s-`jFf~>*;cbtaIcJTRY1gv6hlMV*N?>sP$>tW7bP$k6G8t9=DE?Jz;Go zd%{{+_N4U(nUmJ%WKLPHl{szQBXin1SLTehpUfF+eVMb?f->iw99i zt(S=1w$2l~V{I*V$C^Xzj`cOsyVlD@?^>6M-m`WWy=N^cdf)o3$bIWWBKNJQi#)K- z6M10mCi1{qUgV+mXW@s|D}^6gCka2YmJxnreN*U>^$elM))7LFt)+z?Ti+LaV!c%G ziFK~v6Kiw9r`F7ZPpvNqJhh%D@XR`2;F-0fz%y$RfoIm2`JY=i@ISZK=YMYfi0_5< zbiNnX{(LX2Ir&~#ALD&#-OBsY+Ku<6H5czo>kB-utY`4NvQFlCWv$Qi%KA6=YwOwE zudVI5Ut2%tdTl+4>y5P|*Bk54oNugGaK5ol;CyQ>&H2{)CdXUrSsZVzV>#YhD|5WF zzRCX1I-mWWH5dCk>y>Qpt$o?vTYqJJZ@rN9y>%e#d+->*9+nT*pRDDXK7rQ)-eLS~y$?PQ z@YygN#xK?yj9;up7{6FEGJdgs&+ygyKEqe*^9*0D4>EkU-pugTdO5>a z>)8z7tS2yhvu=ap1q|Ps;l&3ueq&Ag56&HRk5%|eXL&0>vB z%`%LQ&B~08%-W2N%%&R~nXNW9GTU!#WOmKi*zBFLi5atriJ72@shOOKshO^cnVF4= zxtX_#xmmP{xmmV}nOU`osacPSiP>BeBeQiThGqv$^vy1r=$bt-(Kh>LqG85qs%j=< zs$`~TDre?sDrFX8DrS~pDr8n|%4^nV%3-$1l-X>X=|9txraw&Yntn3 zlc}V6rKyg2fvJOex@oX^oN2mwsA-kCw`s4rlj#C;OViEf`liRs)l6@i%b30~7dHK8 z&S}bF@!v$q;;V_Y#Tye9i$^B97S~P8EY6zPTO2m=u-Iu5XtB;D(qf58lEqAuY>R%A zVvAOj8jEU^R*M3YUW+u7X%;ai^DKf)mRY!)thcZ=*=}KMvfo0}mJLRgmU%|?mN7X8Fl*t>r_*&6XDocUtZ<+;6$o@Tlb+!_$`Ch8HcX46j>e8Q!&w zG<zs!!Ae2D)rwue)9RgGuhliZiB|jcrdlo2n`zar zH`l6MZ=qF!-clut6AsJqkZw(cIQW4Z^dHs~I)nyq`>s$KWA zRgvy_t2o_DR$jW-tju(8S}Ez?vEtW#VD(4mvDHhR=T_HrURfQ{d26*v=Y!P(ozGT% zI^V5obbeW7>HM{d)M2pp&|$VV*I~0()8Vuh)8V#e)#0;#tu1JMT3f_=wYIo*uePLh zp0b&IBlb&jT&b%>^~wT-5~wW?;IHJ@g%^>>X>>xUZQ z)~7Wht+#4KTQAUvweHr4w=UC2v`*AWvi8+Tv9{DmvsTr}uolwDvi_%@ZGA&M*Lt&h zzIC5^p>>vek+r*eiM5J)nKh$&x%C6JO6&b<)za63{>aFe78m$%7nyi`B zTCAU_wpt%oZMR;j+F{+R+G$;=+HD=G+GB00+Gj1N+HcLGI>Gvt%0%l6DwD0Zt4y(; zr!v*LO=X&Op2`gCFqN6s_A0ZiHB@F>3#!bq{;oXN`n2+V>jlaStjm-aTKg(5vQ|-E zZ2d=RiS;$5rPdpimRWZzEw@frT4C+1w9;B$X_fUK#nslg6xUeqP+V(0U2&atnc{lu zFvShl=87AwB@{PV|5Vs)eMe!7^*)6y){7LjTDK}}v(8f3ZtbtI!`f6~r?rg2E^B6m zUDj9ScUv!&-(y`Wzt`GLexJ33{66c~a{I0K%N?+uDtFL2NA94tv)mzTX}QDJUu2J1 zpOrmgysZ-i)|Rrzt;J+dSbvr|VSP#Fr1eIbQ`Qq?PFWYooVE^>Ic;q$ zbH-X!=B)Kc>9f{5q|aG5NT0Lzl0I)ODt+Giq0|NIby63sYo#t)`$%21mX*3>{a*5t z^+CzY)>9=fTW3jLv38KWVl6It)%v}}RqK-y*Q^&yT(ho~xNaROaoyTX;<~kn#0~4G z;y0|9h~KnM6~Ae%E`H1Uwb(7|4Pv*f%f)V6JBZ!3<`TPYeO2_1^&-(b)`g;Xt(`>g zT8oR`vwkCT&-$>)J?mK__pOUW?pu3_Jg`;~d0_od_<{9S;fL0F!Vj%Ag&$f!6MAI5 zROpd)n$RO_4WY-@Zv`J)Zx(!PT`l;;+Ewt0wSeFg>$?I^t=9-VwXP9(YV9ZR%vw?4 zne`j~XVx?MpILkGKeztH_uP6t-*f9Uz8BUCd@ro;@V>B~&HKVShWDklJnu{Er#vsM z*YLcwF5`J+?ZorST7c)3^?vSG)=Av2tvR`0TW{fdZJo&V+FFR~jrB3kH`aBWZ>%ji z-&lX;cx%0t+T8ia^^-TPGvw|7x>%Sn*q`Wa9}{*8-Usd0PPC^of9a^ zaMWazd6!9=d9;b9xrxblGf|UsX5Wq1nw>YEWVX(@+H9(EhFOzwlv#=90n%Qh)HM2Fws%HC)Rn0CNtD3zuRyAWVQ8VK) zQ8SY?Q8!aFQ8zO&Q8#lo(J%`#(J)Ii(J(7CQ8#NeQ8SxpqH4CtM8#~giIUk-69uzt zCURykOk~V{nMj)Pn2MXpn+ls5nhKb?nDUr~n{t?CnX;JGn*KMPVEW5+iRo9Ho^3+S%>LIvwBk&^Kw&h^E^{+^Hfti^H|eB^AOV%b8pjfb4SxIa|_eC=K7`^ z%vDVfo6DG9GZ!{}Y0hc-+nm9a-Qt^xfW;dVNsGrON)|Uwv@On?m{=S&v9;K3;%2eY z#NT4MNrc5*lLU)NCYcr;CPfx?CRG+CCe0RECfybZCX+2fP3Bm5n=G+#G+AR|ZnD)v z*JQ7SvdK{kNt3e{{3cf|SWWI)d^dh-@x=J8#RcOp7JH5VSgbT=v7BnmZP{cjY?*H? zWf^U(Wa(k7X=!R~V5wwmVaaD~Z~5EE&GLnjujN&v5X-|x(Uu#Gk}T&MWmt9_XWw_mPr{P}96^4f` zryHKMY%@G>S!#IIGS%?5Wr*PeOBcgumL`U8EL99YT8bEcw`4K=Yx&iH$?B;Aht)L$ zUaR8dY{U$3W{Whyt zdfir+^!lxK=}op;q&MBFTW_{iiQasxSiQwoZhFhD4D?o8N$Rb)V%FPi^;UPA)eYTU zR)=->S*_DOWHnRws8x&ZNvnL_Ggi^M7p&ZMFIySwUbj-vy=BF#d(Y~p&O@u`I!~;w z=sdSNsPo!tz0NzUxjG-MdUU>6Rq1@U%GCL76|VEo%1wvS+DwPVT2+V5T11D_nnj1l z`h_;X^+|0Z>y_G~)?M1-*4f%p*1p=Z*81A=)e&f!5zOf~_BFgj%202)Ev<5ox_ZBig!KBi6c1Bi=euBhlJdBiY(gBgI-x zBh6Y!Bg6W?dY1J~^&IOh>bcha>iO2$>V?)G>P6P7>Lu1p>Sfjs)XJ^*t5sUhQ>(JB zRjaX%Q>(MKSF5*HP;0biQfsn)qS|78T(#ADm1?_npK6D7p=zgfm}W*f@-fd zt7^aXYn2Js7gZ)&?@*a+Jzr&tb-T(`>wJ}I*5N8MtQ}NlT5GDzvKCgEZT(Amj`ca^ zxz>x7=UG=OFR%_!UTCeZyvX{$(qiiyN=vLaDJ`|`QCeo5rnKDJNoj?(ywXbRzly7@ zZ!500-l@38dWPa!>k7qn))9*9tt}NdSW78xwEm;8$@-qcChLO=o2{29Y_aZ8*lL}l zu+2J9VY{`t!ggyJg&o$+3OlW@$nUaVEWg{jRDQR$yZjz&DfzwDZ{_w`AC%i~Jxy-E zb&lKtYbUvb)>3kZtUt*fvOXny*m{}l5$i_TBi6C9N3E@7k6DY$9=HA~bKLrh%n9qw zGAFGk%bc_>mN{h|Ds#%(Oy;z;q|6!XAJS*6_e-C(?vOrf9VmUyT1NVu^$V%<*4v~m zShq-Bunv*BXssf3(fXU@CF_%tm#pVXUbZfhylm|udBs{@@{09$i7VC@B(7SolDKN! zB5}<+LE@UVt;BU}X^HFBpT%!jZxp{_T_k?P+C==O^>?wG)_cWnSvQN_vi1?XWi2Ll z+xnsCZR>TScdTnf?^t__-m#Vuy=(nWj^)!ek=6Qdacky>wKX{)=b?cw*fl@YFg=;HkB)z*B1`foIkm_@7zF^FOl|$nnN{GRIr%2#&Yb@*HoiFR{P1&SHOO&Bp%D zdO6!WYah0E*56p)SubXNZymz=-kOv3z4alM_tteRAFORzK3M-}{$PEC`Ga*Y^9Sn) z=8x8D%pa}4F@3Z?$@I~B9@9tbGNw<~{!E{&wZZcMpR8XnezHEr_}Ln?A7B#WXX^^a z&(;ZypRGL^zgU|vez8_y{9?_^_{I7+!x!sU3}38oGkmo^!|>I5AH!GcjSOF{m*Qvx znaMfgq`D~LY^K272a~G4hW~wGf&A3gLn7uRZG&^ftWVYEj-fX^c zfZ0T27qfO_OS48}L$i8gEwe^rRkK!OMYCRGIkRcT(q@Z{rOY-OOPU=tmN2_)EMfM{ zSitEOk&!D({Yg2CjL#T(;C7B`GvSsXR~WUzsLImUsL|5KsNGV_sLxW;Xo@Af(QM0ah6^p98ZNiIVz|!o zu;CWV&4#-y7a1O~oM?E=veEF2Wr5)(%LKz4mH~$MEbR@SSn3`?)sn&R zm*oco2CIh#tX3BdxU3Et2v}_~5VcxrAZ<0xK*6fRK-H?!K+7uIK;J6Xz{JYmz|zXm zz|P9pz}ZUGz{5(yz}Je)Ajs;sez?^G{b;LW`UzHR^i!=S>t|Y3>gQP{=oeYJ>z7;U z=~r8c>DOER)oZbOs@Gw4R)f+?qVve=qRvyR{W>qK*6O^mnyvHRs#E8aRfW!1t2CV-R-rn-tz32fS()fC zS}W_YSPSd0TQlo$SwGX}wLYdTV7**h*t$bo)H+jJ!rEI~+FDmz)|y{i!TOVylJ!+B zRqLHv8rJi)w5*%7bgk31^sRlgjI52cOsple%&q@vT3SEVw6;E@X=lAz)4_U{rjvD( zrmJ<9rn_~Jrl+;Frnj|)M8o}15HA1boYJ^)a(1^6|)`+$)(}=ZB z)QGqC)kw6q)JV2g(@3=z(nz!ZubyFjOFheat9p+01od3&9QAx_PxV4;HT5EEX7v*5 zhiYZk2h_@~=c`p(*Qr%m$Enp=+pE=DE2!05GpaRMKT&P6KCaqqy-Ky!x=*#ux=6Ld zI!v|G+FG^ST0ynPnoYIW`i)Az^(B=F);m=uS}#DJmR zGp$8bW?BDLo^5?md5-lm<+;{1%JZy)mFHV)DKD^QQeJ3%TWPWNR;4A@{Yp!%vy_%u zyDBZWR#aMH{ZDbF^=-wK);kqfSjQFot*6QDv(Ay*Z|x#?z*<`Ffb|#IgVtwd4_PmlJ!IV^d)PWw_K3Bm>=A1* z*`wBicTgaTUmX zKaqRZY9jZn8AR?`Zxz08og;kTT21)A^+TZt)=PyRSZ518v^ElYX#G?0k@X?LN7g-p zkF3K5A6u&kKDPcS@YwpGz!U390#B?{1fE!%3p};v5qN5Sl>e!93I8)|HU4MTxA~q~ zPvm=U?alYxnw{^t^-jJr7 zS^IOpvi{EX%6c)^YwKXH*Ve3DudR1;zP2vmd}FQ8`NsMk#~bVQ9B-_PIo?`Za=f)> z;&^L4oBge|8T(u7Yi#eVtJvOIE3v(^KF9jbx{md|wISlZBVtrxSrw@zevZ>_}g z!TK5V2kW)WAFRunKUljkf3Oy2{%HM_>7(^drjOPWm_Ax(GJUdkX8L5U!1T%bKjSCs z`;4Eg4>5kWUdH&@x|{K{brIud>uAQ$)~<}7tqmBzSj#}y1O8z6V*P^Qi}g*0uhyp- zzFO}^YXkH{=K*S=;{c#GKq|v`>o|t*))5Tft%Df8Tjw(Tu&!kI0p1f>3q2#K47wfw zG#3CG2LQDJKzjp%7%`9%}N~ z%+zF$nY77lGd7b3v)9I%W*3da%=Q?&o2@mrGFxnHU^d5C-E5Yzg4rx%DYJRTVrEN? zh0N9&3z+RR<}*8P%xiYdn8)n7F}K+-V{S8c6K*ph6K*qE6K*pt6K*pz6K*pX6K=CW z6K=Bv6K=D76K=CQ6E3q}6Hc?aCLCsKP1w!$nXsCjGhsHnZ^CHy(d3^glj$E*5!0Wh zYNp>zElfX~dYOJOjWvB^ns55tw8`|b=@ip@rprxln(i{aYI@f6yy*keQ>I@`kC?KX z?K71!+hM9}w#n4dY_(~K*;3PVvw5b~X46gk%qEyFH0vb@KpID|2^KUvqoY1amXfVsl;7HggrzndZ`_tIdT>_nC8=UNC1ceQf^C zkc9wsv^>`WF|n3}Ax&^Fm%p=h$hLfqtl1+U2o3ucoG z7GI2SSUfa-U~$&?g~cx84;IUfzgtW({%_G}%x0Nq%x4*GENbatENf|MtYWETtZgY^ zY;5`0$jb7yk)!1eBM-}CM*fzYjlwJ!8pT@n8>Lv*7-d;z85LSa7*$xh8P!>u8ns#~ z8+BU>8BMZeFq&cc-f*7fJ;SAz=L}a{?ls(KxyEq2}8ZPe?tnx!|% zs!4B}RgT^)t5CgpR`z;}tTgqOSqbZ{vihsL&g!}DCaX)jTdnr$?zCE=yVq*6?g6Vh z-6K|6x+ko{bWdA3>7KXJ)4gORt$WpqL-(fDSDiank8~bbo!5D6wO8kv)oPuWRx@?p zSheeXuqxB}Y?Y$(%_>;urmnsp(+dpy_O#sp)DRsOfHPrRiy{tm$pdqv>n?O~c>% zfku$^DUA^8tr}t0^ED!@yELM#%QT{`6E$M3eKq2(Ej1FY)ijc=g*8&G88p(ZZ>eWk zZ&lB-o~WKw2|H>v**)YX`L&YeltM zYi6~2>!+#>*2h(wtXHWvTlcEAS{JIeS%;~1SX--hS}Uk_S+lA3Sie>2wZ5#CR<0TOtp4anP#n{GTmBKWrp>C<(bx3lxJJ7RGwp9uRPZ}OnIKQ zuJU|qR^q+6*gKgSJ-6Tt+2_uKw-0WsKOR&YlW@WiVEAT z*%h{1-<98Cy+(eAb&dQ^YhU?Y)^hT@tv|}`wmu@a$9ksRUh6!$ebz2=`>dtq_FI3F zJz#xS_JH*Y*@M>2vWKkWWe;0h%O19tkUe7kP3EZe6`7;fn`Mq!PnJ1uT`Y6lIz;A# zwVBLGYblwN)_b$j~)Ol-W zsSDQEBrjO6lDueLFL}{ARPvIwj^rh47Rk%jcO@=cZ4S)UfaX5B4*-P%|Dy0w7#4eP67H>_ui-Ly^?yJ@W}cGLQY=q>9bqPMIkiQcwO z6uoV2BzoJLMf8sKb&)&Pt3~cuH;UY~ju5$PZ6I>jnp5PS^$Fp7*7d^otu2J_TYnb1 zZ@oe2fpvk<18YN}2i9K%A6oAcd}!S$_|V#4@R7B=;3Mk~0*|Z@2|Tu*BJkKcL*R+E zt-up&A%Q2>m-(Msx9~r;HsgP4{hIHY^pqS**1;Tatfe{LTAyWqYn{ga)|!?5t@U!Yx7L1a@2r2a zzO!D=`p!C%^_?|8>wD{yEbpz`Sl(N^vb?wEWcgryp813IbmkA%$;=n5g;)-g;Utu2^7S&K1!vi`>S$@)6uC+l5|pRDJD_XK{n&Sm^;9me?C z+JW)2wGQJKYe~j0*6fU5tiLgQv3|zz#ritKSL>4uU#<5re6`-d@YQ+=!&mE>3}3C0 z+W@5u->h>PzFDU+e7BBAY6JK(e76o}_+g#F@WUE(Mlk4nAkaC1pgRLV`vOvs<^qu0 z0EqPff2{Qw{#a`={IOOB?+g5D(rLci#L2wJgws6L?51x`B}`wNYMH(;wK08a>Sy}UG{N+q zX_4tI(-zaKrqfL?nyxfGW4g!mxaoP*L#B^R_kw2wILtPhN}H`V)iYaa>S#9KG{kI% zX}Z}Y(`vJB(>}8n(}iX=rd!NPO^=)9n%*)?HGOLqYsz3AYAS5*YpQ1MYHDe2YwBZe zVj5?zV_ImgY}#TjWjf7V&~&9ahv{zf|0d_mznMHRe{1r|{D}#Z#cdOAi%TXV7AH(( zE%uwJS!^@Ww^(ChVX@f6(PEZ~m&F8=Ad7aBXp35t6pLb$9E(ho5{m?rT8l7~Rtq1K zUJECaX%-eH^DOjCmRYEnth10d*=8YVvd@Cu7Egg(%EcJ|QEq@tKwR~wf$MS~Z zBFp23D=fDeuD4ufxYcs1;cm-T!-JNkhQ}>a4bNJJ8eX<^HN0tQYIx65&G3n(nBgl+ zHpBOp-wnQ6zA*T0dBcFg>ZAdy)h+{WtJMYqR&xwQt@;e4tm+LEtO^ZOt&$D2tU?X+ zt=tVvtSk*It#l0RtmF)wtpp7`tXK?ut={SfT3yx;v)ZX2Z8cv%-l|PM#VS`n!zx5S z*UDPI&`Mdq%!*sT%IdRTz13~KW~(E5?N)2_x~-<_^;^~HO|eSXn_(5GH^<6KZ-JGH z-V!T*z2#Ovbyr(G(OqwKPIt4_PTlQROLccyP0-zERjqr-DqZ)eRj}?!D|_8DRyw*D ztR!?VTe0e1v-+fS%j&+)U8}P?53F|UJh57#^W18>&MT`{owruSIv=c(bUs@J>U_6y z(D`L$p!3&CUWdV&Ux(THpEj%YeQgfw1KQly3$^*Io3sV3Q?x~_-L%E5HMJ$JxwU1i z-)qTPU(!;v-lnBuJxfc?x=u^eI$2BG+Cxj%T2ITsT3E}-`lqI;^#e_F>*Jc1*6THG ztfy((S=VVgSf^_`Tl;IeT3cwkTPtaLT61f9TYuH?wZ5+rV0}^}$a;%Li1mDpFzYUj z2DF7-Gpr}7XIbZ}=U98G=US_) z=UcO?7g|47E3!VQR${$St<1VXt=u|6tGG#Z;zSGpNk4zNS3WdbRQ_>n7zn))C5ctqqjtS#v1Qw|=O!z&jN7F&BOEwNTtT58Rrw9NXU;&SW#iYu(=DXz4xRa|8qtGL?QR&kBBoZ?#R{|f7@ zA1SP}KBBPRdbz>|>u!aO*7*vXtV0zxTU#q^u~t&pYR#dr)%t<_HtY5B+pX*6cUT9= z@3dBu-)a3-ZkP25x!u-t<@Q(?$?dWBklSl5FSpP7yX=1J3$pvISIQo+Zk9c09VdIx z+Di72wS??p>u)lLt*^=)vEC|k)OxDSQR_09W7gp^$E_`8j$2F1oUr~YebV}<^hxVp z=~LF>(xt@Ld)=`od ztqmnFT60QXvVJ6S$$F2(W$Wn@m#vE>u2=_1T(Q=bxN6NKan<^o_%-Wk;@7Mr#IIRP zi(j{XAa>n)x!4Wse6btW7GgK8nZ<5epBKGpJy-OWb&lvQYa7wq)_kJ3tsjcqw%#go z$GThOj&+jA9cwF*yVk-Ycdc&;-?g47e9ziT_?|VZ@O|q;Liep3h3;EB2|ci86?$NO zQt*NG1i^>ak%AAcl?5MKzZZCDy;tCob&tR!>sWzD)+Pdvt$76=Tc78DV%@_3#M+Ag ziS;MGr`D_ao?55#J+)ThduIKZ_nGxl-e=Ysyw9z5d7oQ<;dySokLQJTC(jG(P@Wgo zDm*W&Uva;*?&E%GZN~l5`XSdV>j_-1tR1;tS%2evWxba3wRHyPYim``*Va!tURy8c zcw?Qz@y6POaw<-N5Q%X{nh%sdWd307&-}q!j`@T2N2U+fN0~la&tdv#UCQ*)I)Le; zwJy^~Yi_1b)^8X;S)XJ4WW9;;ll2V7&(`&fpRLmwKU)Vfezvw@{A>+c4=Bp`#hL}Y zC*X_q6NWF=R~f!oA7}V#y^Gj7Z<0zi8MjTrt|>p<57 zDlo8`R-2zTF*BcI^3SZ)Yf-$4nRpURVca49VJ~#eu`q}uaDTB!uQx22Qrh+D)Or=adnyQ$5 zG}SlxU}|mh!PMR4gK3D#2h&88_ojI!?@Vh=-kElryfd9;^44^v$s5z1Ca+CTn!Gf< zY4Y6krO6Z1UnY-CxlQkz%9!3U)ib?iYHxboG|=?2X|m}B(^AtjrtPLDOlO)NHeF-7 z&vc*ZPScB~TTCCDt~dQ=y2_N(Y>BCi**sHyvl*t2W|K@q%(_j}&00;X%<4>g%_>Y6 zm=&6CHp?_UW|m}n(=5vLjaiWCe={#rA#*2FRdXv-b8{n8FLN!^SaT)Qd~-?DCUXJP zDdy~^%gz6r>@@#oa@zc@$zAg&CLhdin=o2jGU2i~VIpj?-$ce@n~93WS`%H1B_?JT zvrX(RCYpFybeIHK)SESes0-Ffy5Ap<%Mb zLe6B3g{a9E3vQD=7K|oGEIt^YvAAn|#p0ClZHw*3k1duMzqXiY{K=xu_?JbFF_UGa zF{h=Qv4EwCv4o|PvAiX}v6|&yBR$L4My8fGjchEB8#!BUHS)4tY!qlY(I~>Q-YDKO z*C^F8#wf?q%c$7W!l=?x-KfD*%&5(h#i-Zvv*BdRM}{*kFB;CbJYcxYa)aR-%lU?z zEc*?2Sk@cvv&=Uh@X7MA!4JzT z27fJ&8ZcXJGvKgVZoq3b(?Hm&%Rs`a+CbJS*FecC-ay?d&_Kt^*}%}s)WFP2!@$}~ z%D};j*TB_^!NAMvnZCc(8U0|Z&H52mGxcMw8uSyb()H7<{PeS|O!f1vWc7=!SoO=T z-s;s@UDa!_+NalIwOp^$YJy&`Ri)lUt7N^YR=#>Ot<3c1S}Eu)wBpuVYV}ojrPTx7 zwN|HfH&|`c-D0&+cZXH4?jEZO-ThW6x`(X-bdOot>YlRF)IDn@rhCzfS@(+72c7Fy zcXe)Coz}T$wL|Bj)iRwYR#S9dST*aswkp(lXO*Dy(aK-vi) zv{bBXwA8E3X%XAN)byBfaMCo}@AH){l0&(jF8?$ijgF4c&zPSA+5_R)y3 zw$zBVR@I2N7Sc$x{;!^FeM>#ndaHW6^+fdy>s<9LYcKU2YjyQpYgYAq>&I$^)`!%J ztQV@4SU0MbStqKMTRW*$S}UtnS+lCuSU*>-wLYm@Z@osf!Mb0y$+}pz**ZeC#o9)- z&00~l-I`ss!}_gCm-S_pZtGntJ=P0V`m8%u`mKvpCRj(QOtN-SnQX1AGR0b4WvVr! z%5>`+$}_CjD$lfTR-R=Yr99i(NO_Jmm-1Ze$4c|8_bM&0p02dex=3k}wXf1*Yb~WE z)@({kt)D0^vp%G_+}}e6xLh! zDQvJVQrKu6uCUSCMq!h+lEP+d4uvh&_vN=*ub1Cu-5|fsI!J!IwTk=>>+fZkU3<1 zRpzku7Ma7=Q)G@yy$atS3pIw2qNJX{|1O%KD4c zDeHq$r>!SQowkmbI%91hb=I0m>a6t*$#d3gCC^#6NS?Qjmb_qXEP272NAjZeQ;Cb# z2P7_8&z87kT`qCiIz-~KwUNXXYXONX)(^z5S}zd4YMms0)ml~jn)NHOYt|dZu3J}% zUAJ};yJ5{McEkFn=nd=TqBpI}L~mNViQcl75WQvnTI81Xev#YOQ$%iCXN%mib{4r~ zEiH1#`i<~i>qWwMt)qnRT8j$bv%VyB&w8TJJ?lWB`_>{t_pNUV-nX7F_`o_{@PW0V z-~;Qw0uQZE2|To(De%xbOW={Ujld&o0f9%>r}-aSSMWc!*5H3^eVgxz^-R7e*3o=V ztmXKgT0i7{YQ2p2nRO2DGizhsXV!mso?9Q|d2T(4=eczP&vR>io)^{(JTI)5a=)yUC;T-+J^JB^&gJc*84bKTQ_sOw)Wz9V=cn* z#(F>d8|!HHH`agH-dZnUdu#2<_SX6<>s#xktZ%_%00OM{$S0;{K5Jz(+BI#OdqVfnLb*lGJUjmWcp|=&-BsyKjTO1 zhm4=Bk1&3+Udi~$x}Wirbs6Jl>v+b`)?SRCtxXv}TPrbswg#;S{LcW|6Y$0Q0mB#T ziws|^k1%|--p=sVdJV%@>jey7t*0@3weDf~YTeB6&AN)=n{^R*O(1AJz&G%EfN+NI z)`1M)t$i52Te~xSw{~LqZf(o(!`g%4hjk?Q&Op$;fj_N5X9Y*1+!+8l9{_YtAn5*J z&^!QW3_yuN)HKihwu!d+8k5gvttLm!QcdQYd7IRmnVO`SDVzA2iJDlOahYhFF`CGk zeKQs|duPmP_R^Ti?1k}f)0f8IOy3!QGW}}&&h(%0Yf~1Jm!{k%FHD6^o|{UWJTp}> zd1|U>^2F5Af3QLX-QZ8%*w*?l-w> zdfw!=={=L1rteLznf^DqVk%&I$yCAgys44t8B=G|lcpi2M@`dA51Ce&?lbK&-DNt* zberiq(~YJFOxKuRHeGJ|)O3;QchkA1TxQcvWz8m;>YMeLI+?YahMLuzW|&o)R+$x< z_L^mzE-*_q-E01)u+0yBG40dsRxWpjN~GjnxQ4|93bXmfGXTyuWY z26HykN#_4dmY9Dv*>3*Ex=rnP&XfW}&C^reW$Tdl@NHNKpLH!ao}KeU)>{L-S$_=81>@ehkc zm}rmXV)jhf%0y zxlxQ|s!_6Kh*74cvr&Pip;5V|f>Es{zfp_jKf^A|w}ule?-)+EJZ(7Fa+l#^%aw*J zEoU08x9l|BYFTNx+cMMepk<`taZ69bvzAtdmo2pnZ(2$l-nZm2d}8^>;FaZDgAbPX z48B^PH~4LNz<|MOlL4F6VgqigDFy;oZ3d!N6$VmPnFb10(FUqkz6M%W_6GV^h6ct~ zDh3u-Vg|NWoCZ!-KlRc3v8)pNZ{s|$LyRy*{XtQP9ES#{}kS(WJZS;gs1vhvWIW@V%|%SuLXo)w$kBCC(O z%dGC`uCh9=yUuEp?k20bx?8O}b$42o>h85l)IDJ3t9!)CO82;xn(k>UVcm0947!)B z-s)Vnx~+4=>V(c6t8F^>t(NFKvYMpx)T&YErB%Mp8>={-_g20-pR8wS}yev_-60wZ*MpXh~V0(UP&= zpe1iTRZGdbN=wB$UQ6BDMN89KOH0REKugd1o2G&FT}@-_Bbuhxt2NE7Cu>?+S8Li> zCu`bSduuvan`k;)%W1k=vunCrf7I}_zOCVHeN4mGdZUKF^&E{r>kf@z>tc;C>v)ZD zYafkBYYUBNYgLU{Yaxwz>woHr);HCYt+%MBT2D|#QfJHdvRaHd;rh zHe1`Owpc5vwpw$jwp+hb>9D?{(rLY0rQ3RuN{@AyO0RX1O22iq$^>g?m5J86DwC|m zRHj%ns!X-Mt~||pt@3p17Udb%(aN)|jg@Cx^C-`;eyTLrdY{rf>zPXPtxJ>^So1ci0hr3&krL`otQ+OGS_jE*vsRYhZv9Pe zyY*?g9o7rvc3PLq?Xvcj+ik5Xx7+%!>>lfDvU{yJ$nLf7lHF&WD!bp>QTBkfoa_PX z-!ccSZ^|6B-XU|ydb-SE>vEaH))6vCtSx1ZT1(3uwf-x8%=)r0-u=8!yZ z{aE6H^?r#9*0UupT31M1v<{WHWNj>Q$y!L_vh`E(%ht=puUKb@U$NE^ziRza?5gz+ zv1`^1V%My_#I9S5h+VgSD0 zt-VBUTPus)w*Do2$9kji9qUZtyVlCWcdZ`?-L;-4bk90o=$^Hr&^_yCg7>Z02;R3Y z5xj40C-}gcQ}BWHHGv1#O9dWUmkKt6mx);9c)t>5!KwqC;b z*gBf;v9&1Q6YER7Ppl{MKCuqseQGVw`_%d!&r|EYJkP9qd7fFvf$RV0)=WIlt=Dot zw+`oiVa>w*!g>qW3+r^Qm)0^|FRia|zO?S=d}Zy!`O2Dy^Of~Ej#t)`IbK^walE!x z;dpI*pZ&FUHTxTDDfTzk``F%Cr?I`U7GisAeUSC7bqVWRYi-uI)=ya8SubRHXPw0I z&RUh_o%L(x_tu-4-&@x+zqj^fes3+y{NDNl6KD+JgY_Jy57uQ&AFKnJK3eNBeYECf z`e^-*@uT%c#*fxp89!OiV*F&?$oR=Ri}90nFykj{JI2q}T8y8qB^WJbb zIuG#0`Xs{_>pcu#tT!-xfvyMqYCVDBt92X0SL<4auhxipfN$3E4BxCH7`}nm0{EcR z|KF`G8NOSaGW@W%V)$Y0%ka}WnBk{&2*Xcn&^f`Ndjmmt204N64TPK%tk3Y<8gxFO zB7=%)g86F`dGkFcFU+Qy>^3VknPwJkQfB6A5^ZK|;%cU1Vq_+1qGTpuB5KBI!fD20 z!eGW^^23zTJMwnbPO)vmGTmZYZMxC4*L02PeA5-C8%>v( z9x|P8dewB6>2uSmraw(5m~xwSnaY{9ni`nZn>w3SnueMcn`W5hm{yymnf98+n=UYm zFx_kxWO~%h+w_K+i|H#f8`HmLCZ_!6x~59zs-`C9vZn6lqNb7NyrwzktfqD5e@rHr ze=%8P{@P@V`D2q~=C@34m|rw`Wq!iskNE);c8l#M0v78`BrKMiC|b-h(XyCqVr6X?;xt3Z+C6=ve6)7+NV9m{|!M zSX;3g*js(ncd@#z?`gGH-_L4^evnnSez;YUevDO=eu9;weyWwGex{Y6exB7&y&|iJ zdSzCp^s22k>(yJ$(QCG9)oZuP)9bd1(CfEy(wl6hqc_7!TyKsQquv6mH@b_huInzh zI;^|eYMt(StC_l+ty*=rSrzK;vWnH+XXT}P(8^5rsFkwr2`d5JGgg0f&Rf0KxomYq z=bF_qotsu$bnaR$(s^JtLFchmz0NbMT%DIzF*w2si`v9{Lcx0cfuvS!p4wSJ-{Zhb;a%6hGqjP*n< zdFwJQCF>Y16>CQ=b!&AkO=~_a9qTWede*l!4Xh7o8e6Z_G_{_nX>MJqX=R0m9R>155S>1zF6!`=F(hNtxr4R7o98ot)EH2kgGGy<&)HG-{UHA1buG{UXT zG$O5)HKMHrG-9p)sK;AhS5LIwte#}uubyI^t)6D>sh(l2rk-WZqMmL2SS{E3kXpX= zLbU?xMztdAM73gTC$&;*Wwml^R<#Q2=c-lKr&O!0*Q(Z9Pf)G1E>W$wj#O>5wo`4g zR#t7X=1^_5ey7rAeO0BydXGw{^u!}E>tdB&>u8leYZsM%Yh9Iz*5WFYtQl1% zTVGe6V!cLrs&$j{H0vnk8P-P1Gp)ImXIVd0nr*#bX^!lX^EtWPVfwqB>O#(I*% zTI(`}b=J`e>#ZFW)?2G7Y_R50*l7J+ev|c9`OVg?@>{G!<+oU?%Wt**DYwn~jNEqX z1#;W1OXYT0d&}*#R+8Ig{YQ3}^;Oy3)*EE^Sa-?pwN8`WYwaYv&stt~zx5xP{noc- z4p{G$IcPmo=Ad<@%pvP2nZwpLGKa0@WR6%f${eviA$`<(qVzHADCuL?s?x`;KS&+7 zJ|K0%dZN@x>m;d@)+SP?tl6bbS>KX8ZM|OdjCG6T8S5y?v(`qEXRWy;&sjf~IA^_A z;=J_?iSyPa5*MrkBraI%NnEt%m$+#CK>U*RBJoSsY2ufywZ$)6e-yi7y;JOpb(7dt zYag+z*5YEkz3a4 zBDbs=MQ&T~6uxa;Bz)UiNBEBQ3!yvK%Z2V*rwiS+))cyH{Z8r$Sl){Z<+t@(MLT3_aVX5Gg9%-WLs zx%FGF=hln3o?Az9J+~I(dSQK*^M!R6=L>63&X?9)oG-1)2mg%dx+!Yl1tSeaGSnIRCv3|kw)_N(+TkBMox7O+` zZ>`@lzq8)T{LZ?8`JJ^N^E+!faQ*+@`Y6+T>p4vCtxK8STl+J8u-0MvV9m|+!TL4h z2kWzpAFVesezcy(_|dwS@uPJr<40>h#!uFkjGwGk89!MIF@CaUVEknLp5e3geTL80 z7Z^TUA7c1yy@lbk^$LbB)^ixXSWjg5V%^U0#k!W^i**UZSL+;xuhuCHU#(*pzFLPe ze6{vt_-5_F@Xgwp;hVKB!#8UShHuu!4BxEv8NORli`Q8HNy{U zM~0tZY{&4^+LGaywF$#7Yh8w4*6Iwu!1n}8GMJbKoBuWuHa}x>*KC=|MzdCv9Ibv?@akjo}2QSJT&DuxnnA1a>G>2 zwAw7nwAU=ybb*1utl6nj76wPiiM9! zu7#6HsfDFUt%ZR}n}xbbpM{*sGz(Fac@{h-%Pg2o)>(Wq-ez&%c%Q`?famJr5yp4ZZSQ;}~svC1!iW&=8G8;=+eln7`d|;$zdCo}J za<7qzYBZF6#mkmBx9yR!Cxy|6W21HR;~srRu%@DR$2ynRwL3f*ZFDnUi**LdF}sJ8?+g%Cu*};7i+UyhiG$I zn``q}OKS65|J4$*exM~{eMC##dWDvhb+49;b&;05b%d6ZwXK$lwX&AFHJ6sA^+!z| z>l>PS*84RLte0yVTlZ_4T9<2@TgPi!S$k;OSQ~2ESxad;ShHw4S-;b8vA&_{lTxEhaqsm0<8_JWc*D6o3ZdRUZ9i=?Y+DLi2HJ9=X z>&Hqnt@kR;vYw$d+qy()u62OYJZl}L`PN)Y3#^|jF0?+TxX5~`;$rI-#U<7$ic76s z6_;77DK58WS6pHJN@1n-8HH8W8x&SqPgYoMU7@hXI!0lwwUfd+YYm0<)_e*ZtY67* zu-+lR(Yix^lXZmrW@|0^E!KbJwpgE++iJa7Zku(5+;(d}x$V}fayzX5%I>tjD!bEq zo$M~_4%yw-DYAR49cA}e%gOGw{v)%``nJq|>s>PYt!K#`u&$ChXdNwc(Ark!khQ$b zA!{a?!`5e{k62HUK4Kjwebic0`l$66sbkg$rH)%qkUDN1FLlCNU+RQ4qtr?3Ymz6e z*GQhSZk9Z49VL0%+DP(@HMis$>n9Rtt@lZswVow$&bmzEoOO`Id20iS^Va+l7p(7y zU$CAde$hHk{Gzp@_$BKXVwbEpiCwm?6}xQhDR#wLRP2iNW6`VDn?$c#H;G=e4i>#; zttxum`lrZs>$4))trv^ju&xrhVI3rL(^^~PrZua`E$f5Ax2!9LZ&{lN-?siBblZBp z&~58{p*z-wLU*jc3Es8dBY4-kS@5p4ui!mv3Bh~TPX+E-Zx*<3-7Ik5I#l4kwT8e0 z>tFm2te5dWuny&aXwA<5(0VuDL+c{Ght}GBkF1~bKC)iQ`^Y+t_p!Am?_=wCJddrn z@;tGw=Xql7#q-2kg6E0#Iqs*{h1^fA#krqaAK-dwoy+yiT9xaW^()Tj*6TQ*TNiOY zw>IZ|Vf~lmh4m4R7uG!-FRjBkURo=0ytKa0{?fXR{gt%>`zz~XY_F{I*pjeGt=pO3T8A>fvsPh#XZ?-o zo%Ly^ch(D;-dk5Py|)fwdT(vO^xm4E>Am%P#t+sP7(ZBVVfy5~G{%qC z{)`{3tr$OAt1^BB*Z=<+K3TtG_+)*L;gj`whELW97(QEXX83HqjN!BOEQZh4{S2S2 zTNu7rS229CE@b#(ox$+MI)UMfbp*p#>p+ID)?N%>tz8(tTH7&vwYFsVW^Dql`@dOh zF?_RDWB6vR#PHo(p5eQ-G{bjm324} z@XK0^!P(T+oZFP${I1Dmvu!5J&8C_(nN^u2o28g|ngyB|n>m>%n3t5 zGgUBoV=8O%#8lekuBo)ibyFFWOQv!r=S-DMPMNBi95>Z5IcjQba@f?$SE4d8fN~(B*XlJNtO8v zlOFR2CiBd1m~1dVZ*s`|xXBgseI`%Mx0!r5Uu(i*vDAduVvdQJ#bgsXi*6HjizX9& zi%Jsx7Z@hyvT<3|>$#xE^`jXzpA8vn4+ zH~w!SYs_xRZOmu+(@50vg^`TqH6sU%HKfN%E>^<%EUn3O5H%mO47i< zipRjz>Yu)q)f0Vtt5fJJ0Hz z?joz5y34GV>aMh!sJqsxR(GRSrtVg&Fx?$iPP%)n^mPwd$><)o;?zBE^=be?B&POXToiA2w zI^V6{X#cW0tNq7no%VmLer+b}LTy&-U~LX-Q*AD532k2M-&z9J_q2qp4{3>7FVm8+ z?$VO7&exK)4%L#kw$f6vR@73lX4g`;ey6EveN|J(datIQ^%6}(>t0P`>rzcq>o`pd zYj;g6YXeOiYe`KzYi3Oc>$e)t*4H&$tq*CqTd&pdw4R~iZQZQlYn`v*Zyl`>Xzi{M zY;CL&YOSCVZq2I^Y5h$-%KDOejP*M8IO{I;1nYG5Bx_go6l-PmRBJ}{bn6Fdnbrr? zvaJ`Wsd;(tV@+c?&EvT^0`h)y>>wWSYto!6QTF1$6vNn+4Y|SLU+4`#7 z7VDLATdnKlwpoYBZL`*v+iuMyx5N6j><;TKvOBH&WOrF-%I>yyk=<>rAiKxX>!9)NyNbspHn1QYWl$OP;V^FL~0sMe?L|q~s}U1Ig3Y+>)oQpGusu zJ}7aq?2U*5MN8tW71(TMJ8^w|*vm!Fsv)1?x=l3)VW~7p*^vU9{dVcFDS4 z?2@&o*kx;BvCG!?MXy+|7rkQLBzo04MD(h)hUhixKO)zxFNs{YULkVbx@Q(E)!MoNm zf_JUe1@Bsa5x8f4NZ_9JB!PR@$pZJS%>?dSa|ztHKFI&TI-mc6wF3VG>nnT@t-JXi zTD$N)wEoZg$a*jDBkNk;N7nYdkE~gEA6uX1d2Bs}=dpDh&l78Ho+s8{xt~~1<9=#w z&HdE+3D;BWey*q1_FT`bKXN{^Ue5Wzf?Utygh8x31xMVeQND!djl= zrS&8Bm)7mv-M1d&(?hmU$C?RzG7(uAo~A$45)1YIixm# zD8mnHb%r0{x*t^k>oEL;_WyrbOELtTT9`|l{x*ASa>DGG$y~FgCY5GgCQ)X^CJtta zCR%2JCgNtUCTwQbCO=J$P2QU7nLIYtGPz}{VRG42!{n@~hRF$2EtA8hdM5i#jZF5K znw#u0wKLga>T0sh)W>9tX{gC&(>RljrWqz1Op8s{o7S1EGwn24YdY0rjp-tj)u!uB zR+{cHSz&t0WVz`LlVzsQO_rE`Gg)NHYP!Hw#B`pivgvG7W78R?&ZbjMLrf=`rkM7d zmYQ~(wwiXBPBU#WU18c_y3@4A^pt6Z=^fKz)3>I1rvFVdO$E$SOqI;yO-;-qP2J3b zO(V?wOtZ{9Ol!=XO#95NO&6G%nr<@FGd*IaVS3F>(e$O6l<99XVN+gn9#eU9R#QXs zzb4M+Urj>I-9P*UZoJE4tMNgL#l|NsCK_L`s5ic0 zkz@S8BFgx=g@^Gw3v=Ud7OKX7Erg9(EE$b?EI$|tTi!F0vOH^~Xt~=+!*Z38zU53K zGs_MmTgx&d7t1swZ_7}lAWIjc2uow5cuQrYG)p0)97`snV#|+)m6i_;8!Rsvwpku9 z?6KTnIN5T6;Y`a3hVv~O4VPLL8m_iXG~8$zXt>?d$#Acwk>O!WWy2GeB8KNISq!gO zel@sh`OM(HA(>Cw1prZPi_DwNQ7tRj=-9t4iHh}9RJ6IPFOPFtPVIcK$3=aSVLovT)}bZ%I6>fEua(7A7wuJgz$Oy{YU ztIi86Q=QjVDmw42M07q`vFLoUda3>0>Xh~`tJT_nt$MW?tn;;*tpl~$tc|rfti`ms zt$%9qS>M$Xus)zAY`s)V%(_!c!a7e&+B#TE*4jc#!CFpB$(lt=#rn0Ty7eVZP3v8n zI@XIc^{l%z4Xukbjjf|KO|4xuEv)r4t*j+9ZLFCz?X2HuI9gxRaJD|E;cC4`!`*ti zhNpG2hPQQ|hOc#$hQGDDMxeE^MzFPlMyNHfM!5A?^$6<=>QUBf)MKnW)#I$w)Dx_o z)sw6h)sw9m)KjhRtEF4-Q_HlTua;$9ua;w-pq6LtsFrW7tX62vs#a|MLbb&Dv}&34 zI@NOPNvf6BWvW%y(W*7p4yv`*s;c$Y+^P-MA5|KyZ>Tg|?^kKDUZ&D!-KWxSU8d4u z9k0@9?V-|bZK%>?Ev?dP&8pI8eP4Nk^%muc)?LbztP_4(X|DAv#d+2z6z5wnS6pD-uDH-TU2&1MhvH&uEyX3) zJc>)L-zhA!zNoO=daJ?;>zN8Gt!oulStlv1wsu!oW38*O##%&St@Stgb=F7Z*IQ4K z-(a00ztP%Eexo&q{3h$$a+|H!%Wbi4k=tq=CAZbuP;Q$whun7Shq61YcggOso+7)` zI!|_&wU_KJYc<*3*37bdtRKqkvEDDU*Lt4JKI=M}eb(_Z`>h>h4p=M89I$4WIcR-d z`jGVk=|k4p(ub|hq>orLNguJkAa&Gwp43t6JgH;Wc2dWz1*DE!KbAaUy-o6jb+_b6 z>qN*1trq zTAvfSX1z@08o2(C6uE9~B68iDU*v}M4dENslZ0@jtMB%lE)~G2a907`}(r;(QOSukb#!p2GXcI*j*`wG{6o>jylKtyl6qwl3y* zY;Di;*qV>$iS-`tC)NqvPpmn(pIUF`dTO1>_0(F3>#6l|&S%#3oX@N+IiFd7=Xh?t zo#VN66~}XHdyePU>>Mww7qh>x_GN!z&B^}K`ViYo>q@ql)`o1atY5LdvR=aa$~uAd zwY4nkYwNo#udU~^ys=JZd1I}`^2YiT^Be2E%x|r`nBQ7QF~7CeW`1k^kLjKD6{dIA ztC`+ew=%u6PGEX(ZOioDT88Pp^&iIf*7q1cSRZ8kV7-j-gLMz%2kR2X57x1aAFbUP zKUy0xezcZn{AkU?_{sV=!zb%k44q>?%)&nrHzFULZ08$L!t;HF>TZ=IKu$E=`VXejR(;8I& zYcl+@R%ZBREzOW*s%5Ti`rho1$zHQ-CX>y!n&g|!G6^tiHZeCVFi|v1FyS)`G5Kri zY4YCG$>fQtjma%j3zLhcrY0v%O-v4(nwso2H8fk(|e|ArXNg`Oc~8$O@+)NOjXQ+OwG)EP2J7hO(V^mOtZ~wOl!@| zO#96YOc$DInr=2zHa%h{V|vX@%=CpBzv(YC4pSa;MpHTSUnU0TpG}<1Uz>!OKQT!& zzhhEve#NBI{EW$L^CKo}%=eh=Gv8uz!F-L$L-QpjpUvl(Fj-7C;j-v95w>VDk+!HZ zQL!jA(Y44hF||lAv9$;{akKC@@w0F<3AeB{iMKE{Nw?53$+u88sj!eXX|ND7>9F85 znP95n%k(!p``O zg^uwT3u)uu7M#XRmfwxIET0((T3#`dusm!eZ@I}x&2piUuH^(H6U%xdYs)+%C(BqP z4@(~-e@h#qFiUNtSW79RWJ@liEX!Yp1(vT2%Pnsi)>@u4Y_{BK*k!rWaDwGb!)caX zhI1^d3>RBw8?LmBHe7G%W4P7Q#&DOVuHgYoIm2U?e1>N%{~KJi{9th1@{z$^%gY9j zERPtxu-sOuexQ}3ewdY}ew3AFL)N8PE)@!xW)9bX7)a$ik)|+VcPIs!+ zE!~+`M|I~~ZPZ<0HCK0uRj2L>t5V%HR*Aant^9O1TUqOFx6;tvWhJV+&x%?1kktpB zqgMBHPFkJOIb*e3=e*TQoy%4;bgo&o>D;s`)wyGpqVvEiSm&{ov(7UsW1W{)N;+?> zgmm6pG3$J?dZzu=>bUj~tCiZnt-7@TS>ef3nwX7Ft>R7jH>RA_P z8d^tc8e2PQnp$gXT3Cx}T3P?su(5unVP}0+!_j)bhO_l*4Oi=F8t&Fj8lKj<8s64X z8ot(U8vfSC8iCgG8o}1Q8ll!-)WfYWs7G3_R*$moP>-=rQIE5BQcti}P*1Y{ua<0m zPc7AYuUfkGT(wN=I<+k8IJF#W2emwFCAEBOR<%Ow7pg_pr&UX=*Qu6SPf{(nE?2Fz zj#jO*c2upgR#UCD=25M){-n}ieN&~;`hZHa^$L|1>wcA1>k5^2>jae!YfqIqp9c*4vf)t^1TGTBj&avbIs4Y%QWZ#rmz%RO{nP)2tUNO}DO5nrR)O zG|SpVX|}bX(j4n|igT^cD9*E9tvKJhOL2j9mf}KdFU3XH+KP*Sl278v`$f2W$mS~%Gy9-wY8YS8tdQkYpqYoud|*dzur1aeuK4*{03`2 z`Hj{OBAybHMtR^a1Nd(g&@xr4LzK zNFTChl|F2JMe2z4VyPq6#ZpJDU8Ig#i%A``ekpm}davYh>q(L)tTQA}SldgUv=);* zY5iW}l=Vr8Q`UZ;6TN{dAv1SpyVtqs8s`XlttJcjT z*Q}#Ou2~z4T(jmCxo&+y__}q!@C|D};TzU`!Z)qY3*EGyBy`I@E)~3E?I3u^npg0S^&Nq`)~f~XTGtBPwGI%tXRRV|&-x4hed|U1_pO8Y?_0C- zKd|1-_rSWC?}4=*-$U!yybrBc@jkT9;eBXr!28Jh8_y%_y*!Vs+j$;a2lG6(R^)kX z{h0fSbsP5+YaQ+<*4Mb6ShsLJwKm~;YW;%qsr7u$XV#IN&#Xl`pIKkwcxF9~#;?aunjT7dPH^$nKS z)(cr)TW7Jnwl-mTW6i+w#`-Mt8|yjDZ>)2f-&)%7DgKrgzq}nBG~J zF}<@6VtQ|F$n@S?kmwLx!))9;!t(_S^TI(}@ zw3cD~XwAj=$@&MwC+imspR8{(e6l{p@Y#AV!)NOa44s3`0748utkoEPT5B-;v{q#R%>fjd%9>l7J~rbq-DLL6 zq{Hl}Nvhc@6L+)8Cc0+zCgNuKCM;%2CSOb=OrDtrnA|e;GPz*tYI5Av*<`<|qsdNF zCzH+KI^WG?m8qx6a#KH(#iqd~3r(X;=9?y(%r(t4nQdBRGSjr$WQJ+0$#m0xlc}b& zOs1GFGns6<$z-DGK9dQir%n1yZT6nU8f#i%nrm8WT5DQp+H0C;I@dJIbe(CM>3-8B(+j3?rVmY{Oh1{1nlhUOnu?lv zo2r?)nVOq9ntGa9n?{+LndX=onAVwTnf9Bhm@YJvGu><^VS3a|(Da%ax9JNr7Sms5 ze@%GIznRFHzc(>3e_`Ti{?H`Y{H95&`6ZJw^HU}r=7&sXn(s1MZNAxLkNIkobLNXp z?wijx`CvZTgwdkggwvwQM98AbM9QMjMA;(KMB5_4#Ka=P#Kywk#Kpqh#Mi>kB-Fyp zB-TRLB-KL2B+o*|q|8Ftq|Sodq|JiKq|f5B@idD^#`7#L8ZWarV7$&^o$*$SxyE}f zdW?@+R2iSK$TYrU5pI0P!qxb(g^BSi3nk-E76QgUE&dxZSiUo2x4dJ-XL;I4%yO5J ztmR5070Ve$+LrA`hL&YU7M7_-_Ld<=Zk8@azLv&D!IsKKQI6V`i^DG}3 zmRMdgthPL4*l4-Qu-$U8VV~t>!zq@{hO;b73>R3Y7%sC6HC$uqX1K}H%y5ULy5T-c z3B$vdoQ5YYe;J&&d~I;W@~*)x%X0<~EDsnwwcKd%%5t&62g|7jUoG1Wep^-=Fj!?9 zuv*0$a9ITy@LM?E&8Y*DJJY&?~jd(yOux z(W|qv(`&NQ)N8X6*6XtRr`u=sN_UdgRo!V;2X$vztm0eyg`ShpcYv9J4y9bJA+N&RMHvIv1>_>RhpE(YbC_ ztaHmMN$0Lrpw0s;N1Z2D20G8J6m(u$3Fy4FV$}Iy^+@}()e-G)R!g;iTD5EcvC7o` zZ{?%SXsxf!VlAZ2Zv9n@%lf7kkM&+He(Qx=Le_0sBG%bj;?{v$lGbKgGS)I$a@NdR ziq6^jX=*L3X<_|W!^--(hK=GpQ#pFpHwZfUaMMSJxR6Hx=gj)I$E{D+EKO2T1~aunpd^f`m;)%^(~bK>w_wd z)+<$-tS6|nSXZjFS|_TsS$nB;SevMHTFa?)S#zlLSU*+nwce%NXFXB5-#SBig0;Q! zBx?!f$<`m0rdXd+nrgjNX_|F|(sb)+r5V=dN;9oRlxA6fRGeddUU9DVI>mX`y^8a# za}^g@`zkK9)>B+$Eugr_`jf(9>#GV&tam6ZwVti8%(_8gxpk_-3TtnLmDWZItE?py zR$Kp$j4}tPe>Zvz{(_+&WkCxV4Mq32Pb2lh$7)PFkOrIAy&`;*@o(#A)k9iPP5h5@)Ps zCC*rX7e8ygUHq(dh4?vZEAeyI|HaN*9}zom-6wXzI$G?4wT9S5>u;hLt&fUcvYsk> z$vRE+vbCk?WosVME7lK0u2^psxnkWTa@9ITq^1f)^38gtwjXySU(ZCW4%S-j&+;B zUF#@;yViOFcdc0j?pbf=zh|Anf8Sb~|GxD_zWdgld=IQ$_#Rj@@;$IV!28g;k@ums zEAK;VF5XAhmv|mo&*6DwozC;v+LY(9H4D#U>($(ktpmBASpVXBV!fQ}iFG*FQ)@1+ zr`G#9pITRNKD9RCd}jTbobh+tv5l}0yHpwu+C)s zU>(Bv(b}HzqqR2UM{7yOkJjvrpRB(ze6oJV@X7i*!zb&L44Y?_-YMm19&ogMOh1I#PH2pm*JbWCc}4Y6^8HD3Jl+^L2Up@hVRy5 z4BxGV8Gcv`F#NPuX838X23`Z$XewatWqRFA#&o&aSCcxkt0vKAJ5B7sXYu!&@R`+_ z{5CB#d2O0za@RD@!W6EJ#Z7OD3X{u^kZfas$V(M&KWEy0eZ<=VDZCYrWVcKY#YC6$0 z(R86{tm!7xDAPlxVWyW&gG`^8`kH<<^)zKOb1@Y+vp3Z+vof_bGd1-x(>IMV(=yF9 zQ!%YKlQW%QCTY6JOxSd@8IS2vGd9!fW(=k;%zm2uGW%r0ZT{Ls*8GWyzWF^9NAv3@ zLFVU8Qp``7l$swfX*1txGQ)hM$x8E;CcDiSnw&A8X>!+mlF2*sE)xceCKC>eDicAA zLK8`gOcO@5VhA&y1&7Ts59!am09u#U|r577L9xTTC$CZBcK0*dovPltrxZB?}+pn-X7)e>qH&V3hH`1`IGt#%rH8Qh| zF|xJvF>iO-G+6Rs|{N%XB&1~ z_83mItTCK!nQJ)LGR|>*p@F!S zih+!kxPhV-mw}qqZ+&g6NBRabzLvX>VRIF)k?i=t4VtKRyBIXR%v?WR{na`R+f78Rw{bUR(yKxRzG#S zt)A-kTV2qdY_&&sy44EZ*;Z3@=UX-CF1E_mU2YYryUNN+G?5sdK>Uy3S#%qdLc}w&3u~HL|Ix6pex_k%eNn^4dXI*k^>Pgd>q#0;)^!@L z)>#_v)?pf+*3KH<)&?5B)^ZyD*4!F_)}PdatD)(AXQSP(OR_?cUQl4Nftvu2Ci_&E4b4pXJS13)j zZdRIR9j7$i+FEIbwS>}4>#vHltS>9hw%(*T$9kgTT$a# zwX6I(YYF-F*01F@SRatvU_DiCqjk32CTl0T&DN4~TdY6IZm~WsyVZJ$>^AFq+3nWR zvfHiAWp`MM$nLcMD6`Z0g3K=K^)kDy`($=o=gaJ|4v^VvZ6veTT0~}_^?T|4*4w1_ zTh~h;u=bQbU@anj(E5SYA?tNghpcO*4qN+39k!O0I%54^@`&{z$)naYB#&7aNFKBH zkUVa!AbG<2m&6I{D-tKI*GrtV?v^-Zoi1_8+C}2DwX(!%YbJ>^)`!K=dBaO&Rc7VU9kQpdcpdz=tb+Pq8F_*L@!y}h+eW55WQ^uROGVt zZjme2lSQsrXNz31b`iO1Ehlo-`jhZA>s7+ntdoVWTgwYyx4tWM-FmLj4eL0e8`g?K zH?5xu-n3pTc+fnGxgT50aX+y>#r4FxlIw}JHrEsD2b@o>XK+5X4(5DnEy(%I z`Xa|O>nR-1tfM%dfyV%DvOl*jVt;PU&;G)CBijq>aJCoLjBGEg*R#H~PGEg$Ez0`R z`Yg*!>rR$e)*dXcthrcTS)XTqWj&qwwRJl4YimE|H`a#CZ>$BG-&lWy*8l67-dguD zy|vC`dS~s=^v>FV>7BJO(|hahjPI@QFuu1w$oSrR1>*6p$jV>K-? zdukG7cGASeY@>;^**p_gvtE-=rVS>KOiN9!nC6(AFikbtYnouP#WdDrjcK&WQqyRY z`KB=@vrOYmrkW<2Of*e3=`+nT={7Ae=`bxbX)~=gX)$dxX)^6IX)v8`Qg6D@q}Fte zNww*AlPc3gCKaaVOv+7fnUtD7GbuLxY*J{-Xqs=zZ<=Q+Yno%KZJK3jX_{f`VVY_h zZklA8W*To=W*TkUY8qiW)il&}scE3;R#RWoW2T;_*GyeapPM?G{xG#QryooL2uy4Z}}bc-3I=`pk4CfCirn!GT3XY$MJ zxe2%VLlar^TPAwumrWeZ&zJ<7A2mrf-)B-{zTKqNe7(tZ^A#p5%omvKG@oH|%6x*! zZSxM3H|C8df6XgR*ewc8_$@L`BrFn56f7c4G%W&53@toNEG_I!94*XEye#xhf-KZb zqAcW0k}SkbvMhK_iY!=7sw{pQH(9(e?y|UHJjvp?@hppN#)~YL8n3dLV!Y9!#dxPh zvGGBRB;yknfyNgs9E`79=o{a+kT-s2!E5~1;*Zf+i`PbfEN&SwTb?xHvfN=LXt~@- z!g89Cyk)DAnq{exu4RgmiDih9m8G+hqouKthozE{zon2-s3nt8jO8c8B+EyJnUmRW8#tg&2T*kn1yu*0&|u-~%GaH?gR;cUxr!-bX}hRZE24cA&~8E&?eHr#2+ zYq-zypTQB!_Xejd9~zvuylimQ@`%B0%WVb^ELRvjwVY+}+Oo&sgJqq;H_HNp-F{8qXKB323pl2*b7a#m~x%2uECHLPyw>slSuH?mr(Z*Da~-^Qv! z-@z(D-_^=P-_y!K-_J@yKiG;vKiul2UbNLEy#%Y>dMQ>*^fIh^^>VDr^$M*L^-8V0 z^(w7Q^=hpY^ctULT^(CxK4tvk_byY5u0#kw=C`gP}6)#xs;%Ftb66{@?! z%1L*%mA>wJD_PymR$RK)f}})_G(lqw~~?N9TprPwm%Mx3u3`?a}^dHBbACRfG0-t0e7T zR<7EAtu(Y5ta-GVtUqY6T3^xPu->V~Z9P|u*Sbkdz&b-q*xFZ1)Y@1}!dgm8%9=q- z*7~`oy!AOvMeA*vD%Nu~)vQ}JHLdeBwXMT6b*=3+^{q8EjjV+4R>oN4Nq%*4R3214PR?c4S(zR>Vej$)q|~9 zsE1m&s)t!8sYh5ls7G1LsmECVRg1H}qn2R3M=jBMj#{#HjasU8tXi72y;_E~f?Ad} zlUla*Q`KDS6RLUEYg7xYC#V)#m#P+9N2!)tJE)dftEyI5^Qcx@e^RNozNu1UeNd&& zdZkLe^+c5h>nfEd>tvN?Yaf+XYcrKLYXy~dYc7>e>sQKM)(4ckt*0sXSm!GDS-UFt zTgxd=u>P(z(fXp&BqQDntlJfqT4yUPvkp{PZf&Np+*(Fq zg*CInO6#lgtE`vEueL6gUt{eqzt&nxex3C@xpmfu<UF5oZKes zZ?c=MFUW4OUM0KLxjjcWtxF}3T6;?#vsRKkX8lXzxb;SJ#A)ku;-{_q#m`s=iJ!3+6F+NxN9?TiVzG19Ib!Fm&BV@IGl`wIJ|}v?dXDG? z>m1RG*0!P-t@%YSSw9xJWW7h^vh@^^%hq`!SFAlmu2?IJT($lyeARlJ@Kx(V;cM2q z!q=={3thKfEp**FSLlYdfzS=>Z-O_h_Xys!ZWX*~?Js!KT3Yay^$USp*4qVcTXzWD zwvH0GZLKG8$C^Xnj`cDAyVf=Qcdd>2?^?g%yJx+e@1AuE-+gN(zWdgXc<);;<$YkC z$@{=spZ9_Fcb*?H&tsS@@TfgRdY(0zXiM0>c z6Ke*pC)PVSpIR4jKDE~8d}{rk>z+)*D$~TIaL8vesvLW&N4?mGv&>SJutUudV%= zUt7yEzqWqI^xFCm(;MqWOmD0wFuk>|W_oL#%=FgUi|L)UA=5i+ai(|He;MCdKY@+` zY+-zFJ(ux=bsOUc>q5p4)-jA9tUVY%TAMO{v{nZ13HWHu$oR?nBf}@_M+~2=uP}VF zKF09bdMCqY>$MD@trs$Uww}iD*}9wIi*+Nz7i(A>AdTUxbsWQ2YveY76T>%a8-{Pz zpf-RZ!#8UkhHuuOHUMZpAo897SQ|hLJPt75^s8B>>3%aC(}`xHrdeiROgzkPm}r|F zG!ZgeYx2i*j>${Yev_M~%_gT!t4#Kr7MpA_%`;hTnr*V!G{a=JX@<#E(+rad;5t9o zq}{Z@q}jC8q`|bxq}H_2q}sH@q|$VPNxA6^lTy=#CdH^p&Zp=`T|QQ*JXIQyDXLQynuUQ(H4xQ$I5a z(|9vs(*iSI(?&CP(@AEGri;z~m~1usW^&BzgUNNXS0*pb9-I6!yKBO2e$7P2{Je>t z`3Vzy^Ft;9=DSUj%(s{no3Ax#F<)jf)qI}GGV|#sJIwn{PMWuy+%&H@d1YQ<^4q+? zgv}zugwGB+-J;B-4V; zq|oAzafQWe;|7ac#vK-?j3-#^G@fCx(s+Tz4C56R9meY|%8j>Mq#5tG2s1ur;c9%& z!qoVxg^KZA3t{6Y7R<)4Ej}52ws>gt%i@9&qvd`h4$E~${Fd{K#4LM_WG!oqR4j9h zv@N5J3@yElEG(^!>@Bs7+$^Pxd@Q+)f-Qd;Mq0iyOt8FVm}Ys}FxPUoVX@^J!%E9J zh7FdzhHaL0hCP<~hLbGg4QE&e8qTwHGF)P5Y`Dr&#c+eAsNptCcEdfEKMW38zA`v& zdE4Nu(DAa2EPAY;X3plJ14U(M>0zLwQaeSNEi`X*K#`j%D&`gT^4`c77k`tDYm z`rcMT`TRhsl)VXHmsdLlH zLg$W^rp|pUNu5VloI1~}zG%O+x~BccYKQiFt6AEgtZKBsTE%PsuyWG=Wu>b9*NQ`% z!TOCBv-L$SHtTI#9M-e7xUCzs_^ea41gyQagsly=M6D&XB&`2yN?AYCl(jyqDQ~?+ zQ^|Ucriyiorn+^mrlxh6rna@crmnSyrh&DPrjhj@4HN5U8fMlPG%T!lYgkz?)3CLk zs9|qitKn#!so`uLs^MzwsNrs{r{QTWt>JCWq2X)&R^8wFgnEGWQuQF~CiM{Oc=a%A zTlENQ8TBaZ-)b?|x7FgTcdNx)&sIycu2D<2j#W#swo^;9R#3~ZW>(9zeyW;neNr{o zdW~wH^#s)d>r&N1>qymNYkSoaYgN@UYi`wY>rX0`);CqEtPiTxSg%m2wVtR_Z(XU< zV4bYeXzioYY;C5}Vy&RkX3eeAZv9%h!}_3dr}YfwZtHyI9&2~yUTX#AKI@-K6Ra;Q zO|)L8G|9SCX|i>y(iCe)rK#3(O4F?WD9*6Hr8v`ihvF>j8H%&5D-`EgM<~v-!1|tq&oCLJ>@o7E6Q!O{w2G~`iksk>vghQ ztUG15Sf|KtwRV)#0l#hi4)eI5+|)SB~Ds%N}RI3B7Vwx zy7+19Xz?@F3gTz1pNXBdUMF_ex?Jp>wWHWMYaX%l);C4ZTQ3(qZ(S~W!P-Ogg0++VR&b#QtYZalT5Ag4wEiY=%lfFmE$e9lx2!V+Zd+Rm+_n}F zxNUug|BiJv{~c>x{yWwW`R-cJ=euj2$al|LneU$UbKd*bt9kER7xCV=w&ZzO+LrmXH81mP>-$Wv zt+z0}vF>JiW1YTWemXx7Pm|-&wzBd}n=^@tyTa#`o4+8Q)tkWPESk z%lO{9lJSFe8si7+V8##D4vZhI^%y@|%QAkn=4Jc{-V^YS;gj`!hELWP89rGbVfbvl zo#C_fYKG6&3m86IPep12lrwy>&SUsu4Qm60F?_Z5XZULE!SK}@)&?+R_+|}h13=CM z0PPDztOxu7UJoe9@Y7m>VV&s%`TX5n(Z<9Y`WUy zf$3b63#OAy4w-hEY%^^%S#4Tlve2}`WTt7E$t2TKlWx;elQz>blSb1@lUmanlS0MJD)3>G?rhiRUO!>?dOy$g^P4&&hOdZUGOash#O%u)7O^eK! zOqtvr8u2=4VV~%#WJrn(s5QH{Wg& zV7|d5(R`Ijk@;eiX7f2FQ_QEDEH&>n*=F8ma@@SmRCg~RcjPott8kbw# zHLkZfW87}B$GFd8wed8I*~arMx{a4vR2#3g$THq)5oNsB!qfPOg{AQs3k~DT781s{ zEjWxHS$sEoY4P0XgT-~D9~Q@q{#$G_VzXRo#A`XlNW`+mNZPX4NXatUNW(J7NZ-=Q z$js8n$ktNH$k|fJ$jg$+D8TZQVYuZZ!&uA9hAEbZ4YMq_7#3PCF)X*7YFKO8X4q_5 zZrEv=VK~7u(r}ukm*E^sYr{pBI)*DOD*4MDwq_1l=Q{T|4QQyoeQ{UPuP~YClO5epwN#E0oTi@5} zi(Zh`J-sli<9g9n8}#C>X6YqcwdiG7<>}>EMd%e+Iq8*H>FQNjiR;x^G3hl}z13~8 zx}n=)bwszvYJ=_stJ%6!tlD*_Tb1a}wo1^QZ{@4I$jVB0nU%WkDl1XlwN}i!8?8R* zY_+ zC8qPhicROS)qCw{Ru{BiT5ZyPV>MO#y;X(wC#z`fuU2;2KdcnBe_OF?|Fe3j#bA9- zi`jaU7Mt~SEl%rNEpF>%Ek0{cEkSF2En#ahEivoAniAGeG^MRiYsy-0)>N>bt*K<) ztf^|9qp5Bks;Oyhr>SkNuBm4&sA*vRTf@lusfLO51r0On-5QqG%QUR5Cu-PQ*J{{X zXKFZFhiW)mJ8HOE>uI=KOKW&qb7**5zft$KKCbR>y+l30xz!(`)-%=Ot*g`$t)tbFtZmg&tmW0xteMm@te>i8TAxtOwqB!}V?9AN z&$?8#z&c8`(Ar+L*jiP!#F|^R%=(i`x%EwzO6vnERn{w2s;wug)LK`n)LAE~G+6tn zG+LXgG+E25v{-Ygv|7JbZnHk5++jUaxzoB(xy#y9xyM>bx!3x)QlIrzrGD!TN)xQR zl_puID^0d`QJP|{s5I63pW-y@yNc7TcPq}Yo~=03x>|9Tb+qDaYa7Km)^dt-tr-;O zSwB*kZ+%Q*f%Qs-h1Puvi>!+j7F&laEU~s#SZb}Tu*{lEVY&5V`4!fiC*eGjimQk|C8EpeOl^(^(?6a)|pZVt*xXETJuO9vc4yI$a<6HVe59uBi6B! zN32aGk6QCc9<_cVam;$3#4+oc634AeB#v7LN}RCPlQ?0`D{<2LhWJVA8RDm`W5rKf ztB9Yrel2#!dW+Z@>pHQs)}CT#twqJoSw9jzXT4GMymh1KdFvq23)U*47p%XFT(mwT za?yIB$VKZ4kxSMABA2W+MJ`)2i(IzeD}2SeRQQUuf$$aUFG5$XcM4s#t`oXu?ILu| znp^0)^<}~9)^i1KSZ4^{ur?LEVa+6X)B2LYP3uJhx2#J9ZdrQ>+_IJxxNZH6|F-p1 z{yWxg{CBK>@!hfB$amK|lkcvzD&Jk}N4)o}7xCV+PUpR6ZNhusnvwUu^?9BL*7JBC zSm*IPu(s!UXf4F^(E2p@BkMBmN7hQ*kE}0oJ+^M)dTedU_1O9&=M(GIoKLLNIiFao zb3V0x!SU334aZaKVveWQ)*R2Q**KnAFK2&d?aKb#`Z?Qk>t43!*5+(4te>*Ju%5>H z!rGhlg*7wlOY40sFRg1>URv9-ytHOyd1ZZq`IYq~=2zBn%&)C=nO|G~V|s0Uk?FPd za;7)d^-OQ9BbeS;n=rkx7Gip9{gLsl^(Dr))>|0gS}$UJXFZ$oo%KY<_twpf@2yK2 z-&?0Ley|Q@{9x_M_`%wg@q;z!TmUh~kJfCAAFY2de6)Va@Cm#x@EpS@@Yz6H89rOD zV)$%5kKwcR6o${%oeW>B8yLP=mqFVAsSIDOV;R0$gW3Ro;5NWFYe$A}*47N)tW6od zSsO5X1D^||#_%0{HUMZX0BAj+7{d?nS^yD-y{5O#I!u?FMVnTenV5!}37eXjeK(OX zdtmb4^t8z<(_JRlP1l$lH(g+|({#GY8q%_8%=6Vn@q}0 zTTO~hJ52ISdrY!TCz@oKPBTe0ookY8y2K>Wbd5=z=@ye1)4e89rpHVoOfQ&(ncg-D zF@0tdZ2Hk8(Dbi~zbU7wuc?@+m#MO;hpB<7o2jj-i>bG%lWC->gK4^{t!bI5m1(P~ zx#<*BW7EZ^2Bw=#bxaSMYM5R$RWW^Ns$lxTRK}FiOu|&qOvF^tjNjDIjN8=7jLkI2 zjL|gN?2k!_**B9GvyUcI&0d=X-R!=}akE<{H_Wb>yfiy!^2_Xm3Agz{6B+Z} zCc5TZOzh0pn)sV9Gf6OCU{Yv4)1=9KlF4NAZj&YEEhbydYfX-smzrEN&og;$o@VmH zJkEs0BHV<>!rw&1!resH!oft30%ejUn zmc546mUV`WmidP5mWhVFmO+M-Eu9T#TACQnw^TD+YAJ5G+LF_7qvdad?Urv0_E_FC zIAnRj;DqHNgR_=f3@%$PGq_Gu4 zrDwolrD(uwC1N0C#cm*O^-W*K>W;pG)nR>AtJV5iR+IGgt*Z2mt&;RDti1GXt&H^@ zt)%tctXTBDt={VSTV2-+u{x+1VYNyx#%hXQqE($sHD-x2%M9?pm?vJg|DH{lx0D_H(PX+OMo8Xuq{8*8X4>rv2Hyw(& z)*ChDtY>N}ST|`ZS!ZjiT8C(=Tia@CTB~X5SPN+CS^v^7uzspxWPM)4)OweOx%E;F zOY4am*4DKew$>RM_ST^qj@FJE&enPwuGZ2T?$#U{p4M;Fy{%8E`&uti_qT3P53r6^ z53;sa53!b153~NE7GZruEz)|sTD0{HwOH#)wRr0&wM1(hwIpjfwG?YcwKVG|s_E9p zRWq$ut7cjEtL9jjsODKmspebTs}@?Tsuo#utCm=QQYp2*sZwrzK&8TZg-Vt61eI#* zN|hSxB$YaAAC-D*GnGbb1(haiE|q5M*UGKd2bJ5bXDGK@7btgHdn$KXD=Bwd|556( zzNXY?y-}&(x>sp}b*9opYd57y*2+p#tQnQ2THjZkX1z~wy7fH88P;`*Gp*wkXIa}T z&bC%moMX+bIM@1_!aVDf3iGYkDlD*`sIbtwOkt6Aw8CO*M};NU>IzG(c@>sfzmi{W zy;FXnQn^);jX5tpCfcw!SR4#(KHj8tYoQwbsFM>#Vip)>|{lZLq#AyTN*^ z>_+Q;*-h42vYV~lWH(!@$ZoM_mfdRoNM@V$L7DB=3uU%jH_7a@+ zHMh)e>wD6>t(Qyhu`ZO}Yi%vP*P26mpY>I#{nm@6_FETA9k6zmI$$j-bPFvTBow4>2J7X;=cGmiZ=vnI>qUWqTM9*1AiJrIC z5j}6sAbP?2s>lWFRU#Ly8$~W!M~YmsHWImH%_DNj`hxIf>ki?|)=t7#tp5vLvED0m z#kyALskI2=EHAAWv%IuUW_f9?#`4no4f8AOt<0~i8<<~N`!c@* z&jWm5dTo7#>9zH2rZ?8bOmD3HnBG`xGrh6qWO{4;lJTweX~wtK>loi!PiA~)UCH>) zI+5|6wIAbqYj4K))~<~2t!)@TSQ|2auvTIGU@gJ;(V81P2Jq4P1H(t_$I$hFrx-x{ z0zZMz2U^bX*?JDcXX{A}pRGF>zF5~Ye6cQN_+p*Q@CEIBz^~Ts4BxCB7`|Csp_~u& z9c51dWIZ5g9N>)UIkV}ev(2(h3(QgLuE`A3=_dWAlTF%8Cz#Zm_L)?e_L&r!_M7B_>-@vv&BZEUlt3E7%e9naauMS@mm%eiCHEZ$yx>)saQH1X3@a?l4eKm33|lNC4ZAG8 z4JTUK7*4m;Gn`{7Z@9=(&~Sw%v*9|+F9usIpBe13ykW54@|3|*%e@AtE!P`duv}wU@^$o3}_06oD^{uRQ^zE%g^_{K$>3LW^*YmNupciPh zOE1)FiC&adpI)3*gJh_UN`- ztvPFR>ryutrT>ZTJhKwO9&^c`tpmWa3LFb~CfzDMc1)UpKf;zXY7npp>k744>qxbDYiqRxYgx4nEzI*2h)TtyimNTKB7FS(m8hSVyYn zTHCAUTdS%TSaYiuS$|R~w!W!SYJEVZ%zA}Nh4n<0O6y9MYU?DG8f$NrT5D64dTV)= z25T;rChOPA&DMvMTdZd)w^bAb7)MLF-sn@z!sn0q~X@a%8 z(nM<&rAgLIN|UW0Do(LJpg7fff#Njl2E`fHiHb9=ofKzTt0>O4W>cJF{Ze7B^%;eE z)*BS&TTf9~U|p%O&^k_Gk+qA$Vrwmh#nyrfORPW0FSXt;zs!1q{Br9=`4!g2@++;` zy<2vJ^;Fr7)&;VgtbJrRS!>E} zwq}#vV*NyBi}hidt=3Cqwpq8zY`0FA*l-^_Q zBE832Pm!l}t!GLevd))0WbGz-*jiTd zi1jy#Bi837j#{shIBMN0am+eN;+VC)#Bpm`iR0Ek#7|gn7e8TLA%4=@TKuH-f3Z{6 zN5xKA_llji4i!6Xtsr*B`nBj8>m8zJtvf}}TE~i>vo;hxXU!&h-ukx4dFxFg7pyx) zE?6guT(q_pxo9maa>@Fk@FnY6!k4W>gfCkQ2w%27FLcGaU+9W;pwLxoQK75Ww*;?R zFA}_Foh^9H+D!1eHK*Wp>pKEBtTzbUux=5!X&ohS)7n7brZv03E$jXKx2y~KZ(FPJ z-?qNXciVaz-yQ2fzB|_Ze0QzS@!qwbzk>6 zSkL8nVx7kE)Y^#Ssr5hhr`B`WpIO_nKeK+q_6$4*V9EB}`X%dg>p841tbk`Iy)-jCltlb#jSsO6Ex0Ydi zZ_NY7AFMeUKUgy{ez5+@0IC0zxdrz=?_y@Q+6{3Q*pCDChBHCOw7$bo4A|3Hwia;Ws+|8)TG?(fk}tiZIc;hS4~!$ zT`<{ccFN?W*%6alX8TNDo9!_9ZMMmT$9#>6tobq%UGoJdcIGop{LLqu#GCh+6qvV~ zG?>?!Of)YyS!7;lve`V##xU7(u3@HSpJBdbyoxMx{x@YpiV;H71x!8=PIgU^=s20tu~4E|ZF8ZcW)8gN+g81Py#7zkNC*B7@s zr!Q@_RbRnsuD+^OtGd=d}D$+}^iq%W8^3cn$GSWprq)ehZOt0lS} zRugo4tZH>9SY_%?u?o|jVdbnl+sZ(9zLl)*A}em)WmZ3QR$4vNS!;DgXM@#Yoh?=y zb+%hA(AjO(ud~mpPUoOiuFg@bSe+AAzB;F^Y<13C>FQjvlGV9t#iw(_>aX@~tNYsb ztqy8GvRb13)T&MUg;l2ZYbzh^cUA`4AFM>QKU@9K`et=k>!;Nrtv^=Fwf)t)`^)R848?I!!t2bWH{808M3U zD@|2v6-{+(K20s_9~wH=k2UnH&uJJ~@6<51UZP=YJwe0Vx<m};m){W}E)^Y0o);8(^)>7(0)<4xktZ%4=S?^Gb zu%4k7XbnAZA4C@lrEbBotT1|1LHHYFX>(>git zf!s>#Epn@@yX00|C&;a_HkVs#%`dms`i1N|>w~iEt>?&Yur8O~U>zj8(OO@2lQoa* zX6sino2^gEY_VP;v(>soW}9`U%rOM}hxiF=Z}F4X{Ng9AuZW$p zo-KCDIz{ZXwVv2%>z|^ht&fSGv7RD&#yUmxthK4=S!;IDbJn*-&RK5}Id9!7a^5;k z$OUU@k&D*vg)dsK5WZxcEPTmYLHM%ueWA1>tw#$){1<0tRM2;v0lu3*E*f|uC*@jUF)wr_pJBx+_UcDxn~{0bKhE>=f3rO z?)%nLxF1;Ca6hnq!S%p;I@d#M53YySe>opoZ{d7oUCH^#+L`mQH81C5>l+-8trv4V zvCijsVr|Ru)S8Fmsr4@Qr`B=o&#YP5pINVGduAQW_RN|WJO=RGx}5d7wE^o3>$fZ~ ztkG*v()uU!OY1|-FRlBSUs=a6zp~b4er3(T{Mz~o(`)P1Os}n5m|k1Q zGrh64W_n{S$@IqhC*xb|+l+6m_krgD-dcAszO&9}d}kfO_|Dpi@tw6U<9lmK#`o52 zjPI?#Fub>Z%<#eb7Q+YYI}9JJZ!&zezQXX)`YgjoYf$~ahvAd;CWcSeD;Yjp&xfuD z?1i2aT+Q&sx`^S6br!={>m-J+)=>;!t%Di9TKh13wRUCrW^D((BLK1|;5){8KuLyI zrd!OmnYNg9nnsx=o0^$9nTngKnf^BAGks$E)8xGAbCW%$H%!);o-vtcddOs==}wb2 z)6FKert3^fOjnuYn65BMHC=8JZ@Szh%5H!(2fGSxE`HPtp%Fx52GF;zFUFjX~m zF;y}RG?h1vGnF;XHkCH5G?g%IGZizPVk&I9*i^uDqbZN+0aH%XbEd4OcTE{h-vn?jC&DNRxFYp38RIr373VLiI9b!iIj!9iIRo9iI#=9 ziIIhXiIoM1iIWARiI>G^<3Nii#*r3Rj1w)68fRK;H7>MRYFuG4)wsc;)wsi=%(&ko z&3L*+nDIOdH{)d%X2xqR)Qz`Vh#T**U^hN&@x$n}#S5cL7B`J0f@P<{HOp#) z+m?9-4=oc7o>_(%ytZ^V_+V*e@Xb=s;J2ls0fUu@0jm{<0hiTxeSWL^`XW}x^d+s< z>C0J7)mO5r)mOJl)7P=`(>Js-(>Jw}*SE6b(6_VtsOM~TOV8cvh@OwtI=uj^8G0dB zO?r`5IeM{H;d+TyPI{?Ux_Vhw5_)-7EP6#&A9TyC?&wxoozShb+M?TJwLrJcsz#PpwY_eLXv(;*@ z&JL>{ojq37I{U4%bPicX=^V52(m82mrE|tgOXs|ml+I-vp){j^%F^~b7H>%UdL7L#?T z7K^ow7Q3~w7MC@b7LWBOO@8ZJnnKoxG)1geX^LA<)|9la(Uh@H)s(aL(^Rmw&{Vco z(p0tP(bTa1rlDp1P(#Q1jE0`|4h=)=#Tv%e{Tim$)f(p3=^B>SAsW`!4jQ)Bx*GP@ z(i)D|92(BnZ`56_PpG?FFID%nZdCWSj#u}!wpI7HmR1k6{-qXVeN!#OdWTw=^-Q%0 z>q@mq>nOEoYa6v#YdN(zYX-Fh>&L1|*2h$ntyih0TKB1@Sr@BjSVyR4S=*^*TdS(( zT63%BS$|R~u)d{IXnjzn*m|W(iS;CvGV3apa_eN3N^2jLDr+;9YHJ0RT5B$qI_uZU z_0|WK8?9$3H(3`bH(Prsw^%DGw^{#IYPY_o)M33zsmr=gsoOeBsmIz~sn=Rnsn42O zX@d15#fjDj6(?CQRGe(xq&USoS#hehtKxKPb;TLhT#7TT-zvzN93 zt?Lx#Stl#ZxAs(6U~QnV&{|Akk@X+>#nxx!msrn{Ut*mrztq}Zewnq9{BrAOax1KN z%dNDYAh*goO>VWdt=wvBQMonN?_}3npO9T=y-0Swb*=1r>qyxR)~2!>t%YPaS$~k( zWPM&{v-LWeE!KT9TdebCwps_sY_m3!*={W=v)%fm^bYHt(mSnNq<2~eNbjq+giW|Z1*eN}S5^(x5&)(w&et-~Y_TI)$3vSyb&Wc@(m zu=Q?mt!J)=r{ltwlu7T0a*#XT3+{ob@D;bJiIm=dB$@ z&RffhT(JHke8GBy@I~uf;fvPV!k4UH3th5aBXrq1U+A*6vCtLkpMqDc4+>tf?h?Fe z9V&R$T2b(t^?QM9*82pmTlWiGw@wteZfzoP!_g z^$za))(PAXthu=#SnuR|V4cPF&{~e`q4ibHht~a^kF32pA6av8KC(W;@z{C-$7AaR zj>p!f98avdIG$MVV}EL$!T!`*l>MpoVYX-1C2Y^E)!Cj|-(h`jJ%#nTwIAzqYi`yT z)~8usSogBLunuH-VJ*S(()uCuOY61FFRiPYUs-#D=K)?>e`I=XeVpmF^?at+)|E`J ztwWgJSQ|0Du@+={WBrNojrA4Ax7Irt-&)UQd~4mz_|7_;@tt)D<2!3R#&_15jPI?* z7~fknGrqU}#PHtwA;SmjOAH^Z4>NqQ-U`Mat+z3JwBF3{$$A~bC+igqpTPS8KxYI` z1kVF}wg#;Q0PP8YoDuldIsxU3K*T*kh&=&_^?;x~0Wu6fO_!S;HLWn4Vd`&IWU6Bp zXv%A5YWm4k*7TMshv_lXZzh{fpPMW;y=5}h^nyu;>2Z@<(*q{Orn^nDO}CpQn{G9U zG2LPkYP!WFz;vsLx9N5hH`84vPNw@z>`V`tSeqU6GaPg6HN<#6GICQ6AKFl69jojhH;-or14Y>Pvf~3R>n&#w2W6< zNEvUo;5Oc6@!RO2#T%oO7I%y;Se!MwZn4kkp2a$&XBP8~-dapB`eM;w^xLA)h{-a^ zh|@CINWjv?NX*jINY+x-NX1gjNZXR#$k6hKp@rp3Lp#e`hOU;U481LP8wOdfF^sUB zYZzzQXP9bPZr!@Y2%B z;GLzJ!DmZNgCCYM27fID44AB#4cM*T>+@J$(-*Ybr!Qu;OkdinPhY{ROkdS1USHG7 zU0=`2K;PI(Qs3N)N#DlmwVs336+Kt0eR`f&EA)J=Cg}xP)#!y;rRzmm1?t6H+2|!( zsq3X%3F~EB{nO32dZk-zbxpV2>X2@=)q34}tJ%8ERvo(SR;9Y#R!O@3R{pw^t!#9s zS!wCcvJ%&wXT_?!(CV|!QmcnLE3D4ztg+gwv)*cr&StCGI@_$ebaq-*>g=`3&^cfg zu5;MRUFVpUxy~sob)B`AFZxxeX-i5_1$W|)-S78tv^=TTK}yAwV13ev{wb-rMw79I_ zY4TcM)8x0_rzvE;TvNn)f~L52rKY5HlBSHckEWcpnWmz(f~K-Hm!_)qR}Bs8`x;u- zr!{n}w`u5EFVZly?$a=~uF^2IPSY^A4%V==cF?f4*441JmeR1d=Fo7oexvSeeL~&U zdWpKbb)&kcb-cQ_wXM3ZwY0jw^)Iym>zisp);rZgtY@l)Sy!n=SVyZxTHC5cTg$7( zS~IG}SwB%tus*JuXuVoB*}7jf)w)p7l+Y0_%e+ zh1M%oimfN9lvr1*lv<~#lw13%R9KsnL7saX8>Wb5>xfG{czg3uFeNkbi^)`iB*0U65TQ?}ou})Q(YwfKt&)P^~ zzO|&n0&50^h1M747g;ZqUu<0@zr@;AeyO#D{4(n|a?7m`$gQxRCbz;mM{cFHv)n3c zX}Q(bUu4%v-Aq*4DBctR-YOSbvk*Xnj>?ll2yv&DK+7Hd~j< zY_SfL*=lVev&~vsW}Ee2>Fw4>rFU5ON$;?ZkltynEWOM6gVZkTeNwxv`=$0+Cra(H zHj&zE%`Uai`i|s2>y488t=lCJSjR~our`xCXw4^i(E5eMA?rgDhpp#H9Ja2KIAR?x zam3nG;;6NV#8K<#;>WC)iyyPj6hCgQD}LPilh_IConj}f8^umqdyAd4785&V{Ydnb z^#;+?*7c&Ntph~QSSyO2vHl`**7~H#S?hTs=d4Rb&RP44oVQjJId9D%a^8BI@CEC9 z;S1I}!WXUI3thC{EOg1bT|t)Z&=&#-?aY7chh<~-%aaezFXE>e7CGW@ZPrG z&U@Rsp7)Nm2k#wgA>KRIcX{qwuj09DUBPqD+JonwwIt6y>l@tntsA-TTkCM&x4y;o zz`C33fweu?1M9Dx53Sd6KD5r_d}yu7`N;Ye$0O^t9FMGvIUZYEb3C?Y<9KYnl>Ldd z6Z;eEpKMR8x3WF8&S!gSt;P1t`YG!(>qV^3tP@zDTPv_Ww|>a-+`8_{RDy<6G-ZjBl-{GrqO1V|;6!&iKwcfbpHRHRC&LHOBYW!i?{&85!SOe_(iT zeV^fj^#z6x)(06rSZ`+dV7-jtqxCF?kJeKeK3dOU_yopN7(RjT3F>6{Y~9T8*%~wk zPy$^GkP6)w2wD#a+7sZ(@C{{8fC2QLK-hXfc?Nc~*=AQvbIewlx|lVYDw-vlGMl-W zzA)7>y=W?Ky4RG|bd~8hlUb%OO?pi4nbezJH7PMYXOd-l(j>|Bs7aLRA(LR!gC;(v z2Ta^d51Kfd9yYNxJ!)cMdeX$i^sI@Y=_M0g(;Ft*ruR%VOrM&ln!YtrHvMX%VEWHQ z&XnC$+El<)(p1V++*H+6)YQOK$kf_Yz|_r@&os!C+ceIU!!+BJ&9vN<*|gP^!E}=8 zKa&NfzfIPf{xI2X`qkv5=|__rrteIinZ7dlYWmEC+3b;tkl8&GMYCHb24+`H9Lz47 z_?w+Ei8ni8l4o|^3-US!Zz3vcTY)Ws1RV%W#8-mR<(WENu;5TN)aC zuv9VlW+`Ft+mhRW!RntrtJO1oE~|6;{8roaMXcuOOIWq(%Ub2@D_Mo>t6MqfYg=jR z8(0bHn_B(Wv$T4uXJ>Uz&&g_so}1MoJ#VWXJ%6h*yXusV)vdHzsatC`O}EjiS+~`yK)1sxR=3B>TX%w$h3*t9HQgCj zBD%A!m~`h`eb8BCbx&uR)ft_YR=ai9TCLRCU^PQ$i&eYMcB?X-T~=v2`>aBB4qCbD z9I-OhIc}w@bIM9o=d2a0&PA)Y+E=X3YhSn8sC~<7iuPTra_t9JQQD8K?6jX*DQUm7 zV$*(O^;+w_)dj7OR$H~cSk2b@Zq=yu%PL*#ua%$He=8F$CTnReR%>Q0cI#J~T-KK~ zd98PA@>?&_6teEo6tOPT6t|Aol(hELl(9C}l(Ux8RJ7*MRJQ)Cp=y0kL&N%{hL-gf z4IS$R8hX|}8iv*t8phVC8m87k8s^sa8kW{N8rIfQ8n)K#8ur$&)g7&mt2b$*CsY%x*Qh31Pf$&^E>%snj#5ptwpY!tR#nZk=2p$N{-ly)eN!dR`k+d_^-7gO z>xn8w*3~K{)+s8b)_y8w))p!i)=Das);ucJ*6)>TtdA+zTF+Ikw=Pj`u=Z7Mv{qAY zvi`5sVtrGo)q0Ckn{~fZyLGlwr?rPtm$j-=w>6VekM%>vUh9L3ebx&VCs;QrPP9%| zoMi2)IN4fVaf&sU;#BLm3e&7FDonTDsxZ@fmclIS28G$yX$o_!eH7+e8!ODSmQt8+ z&7`ov`ilHQ>!tFGtjpyWTYJhcv6hivV*OEWsr6C0W!AIhmRlFet+4i#TWPH*x61mL z>}u=Fva7Av$*!^PlwE6`BD>DoQFgtxoa}n*KQbGvZ_8}7-X*iidX~&4>uQ|=yY)=z?bgZCJFNAjcUu3J+G%}4YM1qNsa@9TQoF4!r1n^I zN$s(|FS*xxtK>fG9?5;yDU$oGZ6ps^i%K4_elKy*`lQ4m>!lKhtQ#c`TgOQpwziQt zVl6Fk#QLlFQR{8u$E+*Fk6GJ@AGc-{KW=?O?1c3Mu@lyjVkfOt#7^ zujpy(Skcqg`l4s78AZ=nUlTcNy;|g~b)(2x>qwDv)p#ddI|px>oEQs)?EBItPk?tw65a2X>H1P%lb3#E$dCZx2#Ke zZ(FrdSGtY>rIv-aS=Z~dL?zV!;O2i7rM z53Gf`9$25@d}!Ul`Ow;p^Px36=OgP=9FMH~IUZSub3C?Ik!sw)-tTmte>(xw_eBc+`63QxwR9^3u``>7uI)} zUs$hZera99{L`mFcy064PsI2c|dH@=R~68JON! zKVp1ieT?y~^=ihq){_|DT30f@wN7GuXYIrI&f1*uowYLKdusv4_tyUy-dn$AcyE1| z;e+)#h7Z;U7(Q5UV)$Ual;NZGOoorvy$m0%n;1S?*D!ptZUp1c*7XdZt*aP5gVzFr z&IZb4_yV2>Kwb-gxgPMlwHCv7Yfu|NnL*5~&+M^jqSJm(^S*HCWWTIOzKR(n{=CgHJM@h$z-YN2b0aF zZ%q!EzBD;!`po2x>0^`EruR*Ln%*|yFuQIdW_H;`)$F{9iPi>0(-mnE;^1k3*h(=0z4%&~lIu+Z|V!E(zJ25T*M8Emp# zW3a<=zQJD0Nd|{4TMbTFRv4VK%r>}e8E0_QGSJ|jrK`bXOACXSmO2LSEaeS8TM8Te zuw*y*Yxzx|$?C2?yVX&B9;>zbf>zV?#jNV|rLEHS<*fqrRje%aHLaBNb*;GdjjX=v znOoh{v$i^+XK%Gh&&6tvo`+SNp08D*UZ7QsUZ|CuUZj}qC3$_Nq4H1fbLAIe>!ul z-smi_x~;R=>ZHzcs~tM4td{Gnvzn%}(W+Hvt5u244yzQM-B!Um`>mXH4p|xN9JNx` zIbkKNbJ~hU=bY6`?Tc2YwXayM(Y|iguYJp^Nc*l;sP+RZOYO&2vf9tA7`0zoJ=1z) zbz1Aa)kdvPR@1b;TGeQMw@TLfW#y^$*UC_f!CFF#$@;%0tMzkD4(s!pT-Mt)d94>{ z@>_Rm3RxFvide^Jid(yBN?IFe%2-Ql%2~5&Dq4TgP`19Kp=y0xL&JKrhL-g_4IS%l z4L$2}4Fl_B4P)y74O44d4RdR44NGeY4Qp#Q4O{D%>h{*h)E%uCt2X- zsC!yVt9x7jQuDRGrRHzFOD({9mRgW?wOWXEtXi10om#lHf?A|Cvs$$EGu0UDld5sn zYgH4hC#fb{m#HRON2{h-JF2ExtEr}2^QvZAe^$w|zNM05eMlwOdZkLf^(2)7>nfEZ z>lBq@YhRU8Yjc${YbBKmYhIN~>krCR*2k4=tmi4$T9+x;S^FzDSZgRZS~Dp(S>I7= zw%)GPYCTD*%{ou1-P&8J!&*bB)0$1G+xm%OkM&{2UhBn*eb&v2{np8f6RceoCt7PL zPO|1woNWD8VXE~-g=yB?6sB9xR+wSkpfJ-qO<|U`kHTzgV}&`^QVMgenH1((Uz4A2 zy&c*#0b@Upd~;ALxW!7J8x1+G|c5V&gHEO6C2Lg1RU zp1?J0R)Oo*yZEnL=ki~-R^-27eS`0Y^+dj#);@eUt-1JaTA$**W!=qt%i5p!mbEDF zZR@){x2>1++_A3Vxnmu~bJtpf=dSf%?z`5jx$jv=ao@A%;l6LZpX6UvbN@UWX;a;*m@QFV{1?L$JTGyo>)(2 zdtzr?A_tWT|jS)W>Svp%yv#`4U%pXHf#D$8?gOP1%>yeu!QA27eL-opIC zx`X+pbu9BsYZK;|*4)gmte-Hwvfjt^%6cZ#YwI$m*VZ9SudPj(UR#SYy|Mnz_{RDc z;~VS!jBl-%GQPF$VSH;{!uZxYj`5wf2je?y6UKMe3XJcq`550@|6zD<{hHyu^=*a^ z)@K+#Snp%_V7-CigY^<{|NoSHxD(bH}^N`H}^D|XYORO&fLaipSh{YIdeUed*&J@@5~iV{+dgf zuvrM3@LBMhh*_|i$XWa|R_4O1+m4YMqL z4GS#o49hGH3~MZv44W)P3_C2@4Erp97)-W&Z7|dFuEBiE^9D;T4;ieo++wi7a=F1) z%b5ndEqe?OSk@aHvn(<=ZJB0p(K6EDnx&7yZA*KDhnB_$&n(pqURz2Te6Zv*_-e^y z@XPXz{(s9W`Ycv^^*ODU>hoFk>I++y=}TC}>&ses=qp+o>Z@5v>1$iD=<8d((=)NU zp=V)rNYB=4jh>^`G(9(~Mm;a9Y&}1#Fuh9ldBP3B7nLX1!#q_qyp;w{^3v zj_c-IZPqQeTA*8Q)uUT&RjFHVm8RQl6{6d2<*3_jrLWs(C96Bhid%P@)i0e{Rxfns zT3y#!Xmw0yiPct}6;?}hR$EQhS#Q;(v&pJZXPZ@`&Q7a9ojq2LI{U2*bq-r8>KwBY z)H!Lzq;tmVnf7_Be0Som8X5%Dp32Lm8teaD@pAqR)4jgTRqZxWp!NZ zjnx{h_g0g%K3P?0eYJ|$`eEg&^~*{}>#voF7K8O~O(yHdnyl7mG&!udXmVN4)#SBq z)8x0#*A%jj)D*FH))cqa)s(cB(3G)e(v-7)tD#_hQ$yMMsD`Tb1`Q4CIT~8lofuR+i>sYlAYkRdYYeltiYZkRg>*uP`)~8fstkDa?7kW<(6AB%dN1!BfHXiyX-3K zNwTY~^JG_Bd&{n|){tFm%`Usn`l-x1>!UL3t(VGdux^#vXq_&z(b`jHleMmL&PtuIOJw_Yc4z`9%FpmnCiL2D0*L)PjNhpgEp4qIOk zKVm&u{D^h9_)%*a@uSv{#g1987CUBLB6i%`UhKFvx7Z2mo1!PJmy4dXE*Cvz?J0W7 zT3Yn9^?Q-i)<;B6Th9_XV_hh6#@b8dthKVpS?fQ-=d3pipR>*pK5wldeBS!0&;{!y zLKm#lgf3WX3SG2*CwS3%i{K^eTER=!?t+)Cg#|BLKM=TVyu7()#8ZdfPs-LRJDyJ>x&_onqi-ka8`ytk~icyC#M z;<;_Thv&9+JI`(F5S}~M$~yupfted#*TibHoxBkg_ z-+DXe1M70m2iBIH53T=lJhVQ{@zA=98154rdQU>nO<49GQF}+WqNJx%JkY=jp?;DC(|42H;iwr zFEYNd-p=^edLH9j>o&%>*7=NYts@!VS-XJu1iZ7BWqfDN#rWR(C&PQ|mkjT%Z!&za zKE?3CdJn?~>-7vDtQRqSw4TQB(Yl-AqjdwrN9!_%Pu4jMpRAJ^K3PXIe6o&V_-viP z@Yy<^;fr-F!x!sFhA-g#0HAXLJQ=>i?+E~{1puuF1nmjXVlXx-zM6oKTJ$aznR#Xem3zi{b&+o`pzWQ^o>b|=}VJh)8{7jrcX?|O&^*} zH@#=F#PqhwM$;Q6`%JHyoHo5|a?|v@$urY4CSOcXm@t_gH4!j7Xd-8}*F@KBhl#b> z785VC4JMIht4-3)mYbBBEi!2{n`biBY^KQ)vneK<&H7Can{}C7GHW$?WY%Ev(X85p z(Y(||&^+Hn!93H%z&zQ+-aO94-#pwT-aODG-`v}z&fL|c&)nW*p1GyTI&))_z2-V5 zXU)}2?wZS+yfv3F`C~3bW<1S;-FU9W52K|P zFOAk%+%np1aoT8?#U7)B7Hf@8Sj;y%Z!y8>nnk10U5g^4Cl<*@uPs81K3TXK{j@MQ zVzAUSVz-nw;!Dq|g`adim>;JVptXmM))ivErt3$fER_k;Nt!C?%T6O4FT9xY7S|#Z=So!O=SlQ}!SZV9_ zSV`(muwvJpZ1q)Vy44e%*;bcz=2;!mS!A_QXQ|Z!ot0MoI%}-zbv9V#>uk1))7ft2 zr?bn-PG_%`p3VU)d7Z;n{5r?27<5iqJ<>jFbwvAu)iUkNR-M|{tg^LlTKQ?;u`<%W zZzZPv(CU}g6RUe#&#ew?y|P-N_13CS>w{H^)+eiIt*=&&T0g8bw0>I&X#KVNp~+zV zK$F?}geI%?MokXuS(;qd&6>Q{Ihy>|VVXkL4w@p?TAJe4BASxc|21T+Uuno$U(-;q zKBS>+y-q{bdX|Q|b(@Bkb+Lwyb%KVTwXcSOwY7$kwT6bNwU~yvHH(I&^%He#>x1gH z*7MZut!vaBt)tbQt*z8uttHjnt$(U{THjRjw%)1cV?9gF&$?PIz&chf$l6{l#9C1; z)S5*t-1@m{r1fdlDC_mAG1ik+^(_)2zR#q+8!r$+SMI zl4ZSCCC7TIO0IRSN}hF^N`ZBNN};u-O0l)FN{Ka}N~!fn<#Oxe$`#i0lq;>vm8-4& zm20dum20h8lYc}QfjoGrqpa*tkhy1pww!utJG%At<-M)O0m=Wq+*x#O2uyL zPQ@PUEX7`HZ^b@qUB!NDe#HsapA;rpUsafFy;EU|^<0Ii)=di2tTPm*Tl*`_ur^hg zX)U8L%bG=Dw)GA9Io2!X=UP|E&$ITGpKq-ozrgy7+(PS9a*M1N$}P68lv`pQB)7y` zTW+Z}tK2f{`?AZecge1>o+i7}x=41FwZH6YYaQ7&*4(mdtY68jwLU4c&U&THdh0Hk z_0~Bu8?60gHd-6VY_b-S*<}4*db9No=`Gex(p#V>wtOF(YT5C$~wPuvuXMI~@pY=A0{nisD_FLyl z9I*D5IB2aUanPDe;*j+X@x#`0#1C61iXX977e8YCPVA`lHnF4D4PwWvy~U1OONbq} zekyvxdW+}@>lV?I)}f*&tu;hXS^pL}Wqm>9wDmHP)7G^jXRO0S&RFYw^N9ttSawu}&7aVr?#P#hP2-s`W|!tJcl@*Q{;$uUUWRyKcRi@49s%-wkU6z8lsb zd2d*6=DlfM!F$u%j`x-|8}BXa^E|h#XY<^)&fvLiZO(Jsnw{s4^%m|s)-l|7t=YKm zT5sXHYhA&0&)S;np7meO`_>0I?_0NUKCt%Sd|=JT`M~-r$3yFR91pECIUZV@ay+tT z=6GbijQtUK4B$Q6W9yl0kFDL+flePX?m^@(*n>r-n<)~D82S)N)?VR>d9#`4Ts zn&p}GBj)GUYnY!~S1>=fc4K~SEzbPH`Ules>w8Qutq(K3v|h&a(z=uBm321LD{DWd z*VaZ%udT(HUR(cSd}I9pJP+{3dM)D{>#5MS02z#Lt%DigS=%$dv({#OXD!M2&YGR^ zz4bSS_twuC-dkU1_+Wj4;e+)qh7ZVQ6_-r818Ns0Q0U>PwN3#qwelt6>C#I5S z`%HhB&NaPb+Gu*nG{ba_X|U-GQwP&_Qv=g-Qzg?(Q*qN6Q(n_RQ&v-V)Bh%RroT)~ zO~0AwnSL=*H~nOyX!^-S+Vr!DnCTZ2LDTOhyr#cQI8FbVu$nTPGMRFi{xjh-{cR#* z`qM1Pvd(+?&lrteH_O<$Y1nZ7g$FnwkcW%}48)%2lBzUe)aYSTL=ZKgL( zCYfF{nP+<0WR>X!lkKKwO^%qJGP!7a+~l6=5tG-Z2TgvO?loaI+hrnZw#`J@Y?Fzh z**X(@vy~>kW=l=veGP5p|ZDy?|N6i{cu9#JuJTWUX z`D|8T!epLpB4nOwqG+CAVrU*^;$R+P5@7CU5^wHdl5g&0QfF>s(r0dFGSA$=WUaZT z$zF41le6ZsCU?xmOx~CanEW>9G-0)1GU2uOVJvF#%2>wYuCa>61!EnHL&nAyTa2wO zmKi%+%rN${=rRtns5XwY$Td#1h%?Tx2rw?Na565pFfp#TP&IC|5I63%;543U@ylqA z#cQL*7I%$SS)4Q4XtCdDhs8#t0~U*nj$2GNI%m;hbk(BF=#E9Y(IbmUqn8$5MjtG! zjlNsx8vV17Gh(q6FygjkG7_@`P!i0@}9vI z%L@jxEDswju-s;_)N+NvYRlOM8!Y<_wplhB?6xd1IB1z}aLh8=;IyTm!9`0)gKL(i z2DdFW4IWy`8a%TUFnDdrV(`K8qyAURTl&8&59$B6T&>SyHCdn2sz#sBDotP5%3ojH z%0gepN=aYQid$dR>Z_iX)qOpEtCM=hR$KHetmf<4Sas?-Se59xTE**mT6ydFTAAqu zSt;s;S@G&cS^dMXXJqqEGaM`x8)jm}!DY@Ll( z(K=hKymhu)+34)H($U#xC8KlDidW}|)gSHSR`;||TOH6oXSGQCqE)N*6{`&G>sH>{ zx2*KF?^p?I-?#d%^~mau)>EqkS}&}YX}z-Q)_QAIsP(}rTv~Nt>r72v>tIcOYg>%SV3)-N=q ztuJfHS?||SuwJd9WIbI&)w)GP-MThi|$J$#%&)P!6z*>!?4peHk)>mq^=2dF5exulKeOj@@ zdbMJwb&q1Vb&g_>wVz_IwSi)vwUA=J^;d-n);AO;TJKSqWW7*fvURJ%6zgn-sn!7s z)2z)Erd!J?%&=xtm}z}SewOuG`PtU>@^h?%s_+Ttf$E?w=R}lVI3&D(pq13l{K&IYU?*LYpl=6thHV% zv(~y#W}S7u%zEn}nGMz^G8?QVWHws=klti{PPy zx?gI$b%N9mYa^*0)~r%Ht#3%~vR*5>%eq-|w{?`{ZfhgSJ=R>3d##^H?6ux6vCn#z z#D42CiT&2W5(lgeB@S2%NF20&Ab!w#q4*)|RPn>sy5fhezlt5P-Y<5M|^b*R`e zYbCK`)*nQVTkjV=Zrv|>!a7m(gtf8gNo#h|lh$`cPFZgfIc41`a@smkE*?O_SW$RLb%hnzOSFB|Ou2?_eziK^+|Eje!|5fX6eAlcu@m;en;k#~a z&UfAVH}4JW{k%7S;WtUY;dTTAlXw!XoA$GV>T zjpZr{*79smtS_-XvF>1fV(rNK)cOz0Q|sL< zPpxZMo>@DvJhNtFd1if{`MLEh=I7QK%+IYYn4ep7F@x&=7uH*tURd`qy|m6}dTAZQ z^vc?e>6NuU(<^HUrq|XCOs}n9Fuu0F!1%^`2jd&-MT~E(yBXhFmodJzPGo#*?aTPi z+7i4T@SU|N<2&%4fY0E4f$y!aFnq8+#_+*<2g3*J)eIl3=QDh?p3Lykx`W}PbsfV; z>k@`f)>#antP>eNSw}K_vJPbUZ0*JH+1i=mv$ZF~7i({ZFVO;4LFF+E|j!StxfUeiM+Cr$U8Tr=Hc^4N5z$w$*|CjU$~ znQ)t}H<2`3ZK7_r+{Dyuv5B+Ue3L-4Stbc)(@gTrCYjWl^_p~>b(qXDYcW}AR&TPy ztjgrLS*gi2vqF=nW;rHb%+gF)%o9z7&0|cI%)?BK%mYju&Am(l%w0_q%XHJW8{-)N!51*4S~hm1B@Y&P0%vD9dv#WbU%79B=sEGmsITVxyE zvWPKyXyIq{+```IorR&%R|_ShKNccJOqOg$oR&Wf1uS0~ido(hF+Grh5?rGhGCY0hOw3|hRK#@hMAU{hWVD#hNYIghSin~ zhK-h=4B9N88uVCRH<)C3%3y}&UW2)o>kSrLE;3kQIn`jDWrx9L%Nm27miY$zERzh5 zScV#$wDdGMXK7<_+0ww^rlqpMJxg(e$Clg%FD(D-zqNd!|H<-#{&&lr`hP4J>N8q( z>9bjt=yO}e>I+!8>5Ez!=u28j>C0KM=qp>j(^I#)p{HYYNYB7(t)8jX3_VM$W<5Kr zJUu6?NIiEe7d>w)13iB$8NFaD4!sDgFS;>S4|Ef(&giCC?aE>c38()mxoOR(Eu!TAkLJX|+pduGLDN1y(b3 zmRNP@EVruAS#6b}v(73)XQP#e&Q>c+ogG%1I=ii;boN_u>m0KBu6@+%mi7s&J=&+O z=4+p`YSg}Hm8yNk%0v6Qm5%l;D*^4hR$sIpSl!fmY_(78nbl&g7gn8GudVX6-dTle zeXz3D`fR17_05V)>xb1x&EHlxHUC*1)MT(;rO9kPS(DYeMw7!jRg=rwUz69`N|WDO zMN`O{UsJ^Tmxj3YQw>S$3mVeado<*%S7<0$Ptj1aZq!h<&eKr0j@Hn$_R!F_Hq+3v zR?#r97Sb@XX3#LPzNc#J&R*4xxP ztf#AaSy!t0SVyb*S=*@vSSzRnTC=DHTR&F~wLYyHZoNS@!g`8oly#+QjCH(fthK9Z zytTG!g0-M(lJyUj6zc~nsn*9;(yiC4WLVEo$+B)x$+pf^$+Zqv$+Naq$+uQlDYO<; zDYE{dTw;Arxzu{8a+!6la=CS=a;3GNa+Ni^a<%nCrCRGfN_E!LmFlgFl^U!Am71*e zl$x!1m0GOdDz;jmQEazftJq=PtJrCsr`Tm3pxA9~q}XFEs@P}!L!saLw!#GK{R$JU zmnclK?o^m;ou@FxIz(ZrwUxp&Yej|W)*K2mtRKkFwB8^;%eqN^wsold9BWPaxz_*W z=2>5sn{T~RZh>`!+yd)xxrNsHa*M1v);dIHowd2ldTVK!4c7mqH(H;N-e^5pdXsgW z^k!>q=`GejrM6ffm)dGQU22m}c_FGFz9I*ZDeD}OQ`W8`r>*5hPFsHyK4ZOJ_>6U?@L6j$;j`9Hgw9zn5jtm`E_B{nOX$4y z2f+*0I|MISHws>~_7=QoEg^W(`kBBb>#YKptlI=GTSp39w$>H6Y|SKa#d;I}73(Da ztJb3YSFKO;UA1oFyJl_6cg^}2?{({ayw|NecyCw-^WLzQ=e=qDn&+nVPM(|A?L4=v z!+CC5Yx3N-{?2{ddI9%sYj5s5)<3xJSg+)|YaPRN*IJ0{uJviod)957_pDtw?^&~O z-nTx>ao>6o#{=s!jtADB91pBzI38L*WPfPg$^OXNg#D5AL$*iO6WAVGJFz{s{>J*) zdJXFn>onFU){3l8tRJvEwO+{b)H;RbskIi%GwV;x&#d<_KeO&+er_GX{M=fT`MLEU zrWe+im|j?~WO`xU1g`&IT3a%`v=(Q2WzE3!%K9VYE9(c0udUB9zP8@Q_}Y3I;~VQq zjBmjE0kRq2T8A^fwRUBEYi-2%&RUW2oi#t>JL~@p@2%f6ytjV9@ZS0&17u&|Hii$@ zD;Yjm&t>>%J(1y~bsKm+;798s=vsgThELWJ44VHRuui$e5Ky3h1hFCLyGaWN^Ge$FJvpc3wOm~}}Fr9C@-n7khmT7@$n`x|Rsj07N zs;RwcxT&$Jx2dM7y{V$9si~Byj;V;Lim8C9j47|Fs40&rzbUsVrzy87vnh}1e-l2_ zUnYX4-%LbIKbc6FzB7?EePyC-`rJg*^ofbS=|dAU)B7fNrgu!-OmCX_nO-vqH@$3< zXnN5k%k-Q{iRo#Rdef68ourB3xt~OydTW%s?w!}ovY=Mck*&Gu~vl%AtW>ZW;%_f*6oAsC!nzfrWm^GX9nbn!h zHLEmPZB}Zs%dEiUq*=Df4YM?p=Vpl}-^^l6Sk1#tM9hOsRLp%$jLqFmoXj0f0?n;W z63k6a3e5FQ>diGx`plJ0=9a*P8k;*7&B0*vD;U?^gF$xzzz zh@qn8HbV`|6^442vkgrwdkw8E>kS<(3k}^ZQw;qq!wf?#Jq@EQZ447E^$gQ26%BJN zMGT89*$gWze;U+TzAHgWHzE1`jOR44ztk)qibyPyd7EG5xQW z>-B$G&d~p7*{IKKm95WV6{62;Wv4G>rJ*lwC8RHH^+!*^>Y1LZ)kQr`tKE8fR?GB^ ztS0K2Th-`UTczvSTLtO4SlQ`$SZV3`Sc&NcS~2N`TD{Yaw7R7mYjs>V(Q1oss?`GB zOsihqT&pVGLaPkjQmatiN-JmGS}Q}{1}k~p7As!e4y)ff-BvGk`mJv0Otw0%GtFw7 z&Md2?I&-b2>MXQs(OF_uqO-y(MQ62Dh|YQ|SDj5(raD`#)O2=QiRncq)>tsz1 zYhO(+YjaIrYeh|dYi>;;>+c#O){ivAt9jrgA zIayy;bFto{=4L%j&BMA}&C5Dc&BxkC&DUC9&EJ|yEztUzYOwWb)llp8s$tesR3oe_ zRimuqRimw4Rb#ESRpYINR1>U!sw7!IR7tizp^|F7K_$(4rb>o&lS-y_wo0~jh)RyN zol2gyhDyG*uu6gTZ{;HEOUlL8E0s&F8psPH>wLuy>p;aWYZJw8YjMRM>t71J z*7p?ptPd&lTQ5_XVBM`S(YjD!l6APkWNTZ6sn#kA)2z7_rdvOkpKiTfeuj02{7ma8 z`B~Pw^0TcO<>y#mlbdV3MsA*Ui`;zcXt@Q}CUOg{dF2*aKbKu>eNc9Z^<3E{)|IkL ztwUv(SsTeNw-%6HVf{g7rS%1wRn{A2R#{JyS#4b+v&K41X05fQ%sOisnRV6-GV85R zOK-5AF1^t@S$dp!ALtxt;{wVo?_%(_tYn6-=OacfD@ znVa4tm6bPSZfJhwEiJ*(fYW+CF>aim#nh{E?L_NT(%Y# zxNLoy|B7`J{}pQ!{wvlm`L0?o;Ja!a#dpnGjPIKD72a#sQ+cmjNAO;^mgT)+{gUT~ z^=_V<*1bG8t>bxaS{w7+vS#PGWxbR8wsk7^ZEF$kJJ!dz?pRlG-LW>{x@-NC^RD$0 z&b!u0ocFAiIPY0M;kakLlH!oau ztfSZ-TMM#1wm!xB*t(VViM12!6Kh7+C)S5po?5rDJhk>_d1@`p^33`!^E2yJ%+IVr z^8g;q&#k4IpIg6YdSQKx>4o(?rWe)~OfRg1nO<5OGQG4GV0vl&f$^2~CB|3Q+ZbP2 zFJpXdJ&WsrP)*13#ttYaA8T6;6TwYFk>Ypn&H2jFCUXZ?%ez4a@G_ttk9 z-dmqzcyE0Gx-W1!!w2ix3?Hrg89rLKGJLeIV)$rX$neQJo#B&pJi{mJaE4FT{tTb3 zJs3V)J2HH>wr2QjZNc!x+MeNyHK_h~VEAfn%kb6Of+5??+05EZ+DyRghv{q6o2I8s z_nEFUU1mDfbb@KUX{~9FX^v@(X^g3_sh_E%sgtR>shO!B_>>-HQzcVrQ(04CQz=s( zQwdWxQ*l!UQ*qN@CK9G!O{7den#h>GF_AZYVWMpM#6-jNp^2{PUGOSFOVjHn4yIR3 z+)Xc;_?w$>f&# zPve*7Z;XGKKQLyoxNOXAam-lQVyCf`#TsKJi}}Wy7L$w(En1B&EXs`?EV7K@#^DMR-Ewxx_ zw8mn#(H4tdqg@vDMh7hljZRo38=bcZF}h~qW^~uW!sv;GmeDH<8KaLDd`3Sk7>xc| zd@^LUd}7FLdCgGB@`Ry;ROHG?abQU*6I`3&w^ zG8sI!e53!u@~Zw@%f0%aESKqjx9r#dV_BikXqBYTX63EVWo4?*ZzZoUV#TR1Y4t@< z*6N;~lGRB)HLERp+E(-R46M5JOsq=vEUXgrY^{9s9IY($T&=uEIWtTV-Glg@OjMLM&sChE+yYSdX|Rj9MnDp6;pRiMrqD@UF6Rz^CT zt(0}PSqbaxv|`oSYxPF^fYo{J!&aNLk6BICK512{ea0$Q`+}9D_GK$o?Q2$?+BdA; zY2CKEtaZ<7r`AKOd0J1bTC|>9Wof;%3e1ye6`R%UTZE*e(Nt9Le>v7M66G1h*@vfkhET` zA#FWDL)N-RL%}*zL&-W!L&e%fL(SSyL(^JbL))5HL)ZGdy1w-lbwle->c-X+)lIDn z)Ge(2)vc`c)orZ#)$Od`t2tO-P;;{0q~>BhSb+bx_b&g7=b*M_VwY^G?wU$b*wTMc-^*`kT>#NE|)@ziDty`2!tYehRtWA~6 zt@)HItY0csS|3)bww|w4V_mIOYaOmsXKkv~U@fH7X#G*K$@+p~v-Nt#7VCb+R_g-A zcI!aJ4r>#|PHS<+F6-Y4-PZRNdaVyD^jWV^=(p}um|$J3Fwr_vVUo3j!enc8g(=p2 z3RA7$%1^W2D?i=3Pkx4VqWny2WBFOu?DDg%@5s%u-Y7TMx?OIbb)4LMYje5z)`D^i ztY6D6v_2-g$aq}CbtQSdbwl0?1V(lum z)ml<&tMxm{ZPte+w_DGY+-_Ycxx?C1a;LSD(O8WQ`g*(LT_Ul8AKJxTn4b(r`8YiaR=){n#vTCWm2WL+$F$l6Zqur-(15$hYG zN355N9l2muIk*5hVTHj@RXg!bZp>-_VBWr24N7lDkA6w64eQX`c`q)~U^@;U8mM7MWSe{yE zvOKjmWO-`+hxwWH3Fc?k)0m%Gr!zmdwq$;8&CC4U`VrG}>s?GQtS2+Qu+C$8VeQ5A z(pr=0r8NiBOY2vRudL57zOvrH_{w@3<7?|0#@E&+X0|?fUnk;43%bPW}apOX7XllO@Er6H@#`P z#dNRf9MdJH?WTREC8pJ;$);JRA*L~=Zl?aGmZq+zdZsp}D&P?SeN!P*EmJO2b?_{} zUlSG6?1vamrYlU2m@YNBV7k!c zw&^^R7pAjKzL?H1VKAF&!fQ6kM9QqsMBS|0#MG?a#L2AL#NVvmB-X6jB-^aqq|&U& zq}?pfWU5(~$zroqlZ|ExCi~4|OwO5wo7^!AGI?$0Yx2v?!-Uh^*+ksj&P2`J(!|u< z#Kgs1&m`Df(T2l{@nPb`EBDL z=I4!>Ee;uTTWm8HvRG*>WiiKC(W2j2!=lO9z@pUH+#I3p z7%aCeH&|ntWw6mQ&S1M`purwXSA&C=mIlWybq&r~DjHn06g9YJ$!T!g^0)p2%g6dp zEzjt`vfQHo-g2(~7t1#NpO*Rh|12Z*nXR1lIjnT`d91|s1+5tM#jM`wNn2ghleapk zr((56Ps3`uo~~81o}pEqo|#pYo|ToWo}HDUp0ky#p1T#Np10LEU4N@bx*=BQbtA0y z=*C#B)J?FOrki5bteas~sGDOIuUlZ{qg!HSrCV;Lp<8Vwrdw~ts@rV!S*OkFkxrM@ zMV&sY13D9}*6U2Qnx`|vs!wN*Rjtl^t6ZJMRl_HnCX?Ne3}+Gnk7v@cjGXkWHs)xKu+O6#W81+6<) zTea?6&DMHk)u{EvDnskJm7mrtD^snvRx(=etyr`^S-sZ$Vs%;byVY*ZUsg*r|5){E z{ds_R>?Q#Z8kQ8%{ERyVcwQa88O zQn$3`R=2i(t!8U|M$O)OotmTd1T|;tVl`LmP&IdJ3pGz`88vTf1~p&nC#rtdCsYHh z*Qy3tPf`uBE>{h;j#Uk}c2SMA)>e(S7E+C|{;3jY{ZJ*|`lL#t^+uIs>scx(*3Bwu z*10O_)?q4{)($FJ*4ipL)}ku8)(k3n*4LE_tk)|STDL0~TgNMxSX(HUS_>(cTfb4N zus*I-X}w6P%DPUe#yVQ5*4jd;&RR^V-ujDTqxEIQChN_L&DN6@TdYeITdhMC+pNtL z+pQ%PJFI^zbXnh5=(awh&||$)q1U=!q0hQhq2D@MVS=@j!X#@=g~`@}3RA2<$xpRD zBtOl1iu`ozH2E3Umhv;LdF5wWKa!hey+dxcb)VcE>r}b9*0yr>2i7hBuNF0q!9U26SPW|{R(ndR0yWmZ_vl38h8Ewj=(R%Vs8z07KB zWtlbBY%*)CZ%D7TUM#)NI$wIdwXO69Yi{Wc*0-cKTCbAYWL+(_+1giXv$cZM7V9sP zTdhw@Znd5#xy`y%a=W#!tyl$)*9jmtlx_ru--0q(7I9VptZNyA!`Y-!`4ql4_j{$J!0J= zdc-)S$Stmg@xu}%^?YppJH*808RIqU6$=d7Cq&s+Nnp0}13ykPxG;DYrofs58X z0vE001uj|}3tY116u4x4kpHrE5&vatHU2BsclfSYPvN^_?az1BnuqVI^%>r4*1f#f ztOI$kS&Q>tx4zGF-FgMj4eJt~8`e%dH>?GDZdxDZzGcpYjckK)+`+Nt(UVuu=Zeo zVEvZuf%R0jht`g453L#49$BAdePlhI^^tWv>tky**2mWGSe{sKV|ij-&+^3Di{+`c z7|T=Z$IMTyH!(l6Zeo6B9m4#~T7&ty^*^TP)>oOHTd!k!Vco&>!a9ZNg|!pYOKU}@ zm)49-FRdRlzOp{X_{w@U<16cljIXRK7++f_Fuu0-WPELH!uZBoo$-yeBI8?YNyfL< ze2j0cnHk?%e`k1S{fgn8^4DZ2f0oE{p)&qWk?+IuG?+g5Boy+jaIu*Ph z;FEO-!zXKBhR@b+44o5J zVY=G%wCQBiO{R6Gb4;^MJ58fZD@?sjvrKJGV@(ZBgH2UUy-cM|olJ#HZA>{$%}p6i zO-z587@B@DF))2+qHp>Fe9E7p={;~?-^}!?iKXd96VT}ZPNt_!+)a;}_?jLz2{t`o z5@ovAB*}D_Nv7#`lS0!iCRL^zO`1*DoAj8jF_~t%(qw_@GLu!Ni%qtgE-*P@I@jd1 z=`53LrqfLxnNBfzXF9>;muasFn^~8Muvxo_yjhEhj#-0=rCF_sn^~nvh*_ygqFJFy zzFDqGjai0CmsyI*46}HXWoFSPTg<{t4w(g+Trl%Bxo_rS^484RT-@i!3G> zt+Z$|+F(&?wA~`zXrD!t(NPN@qcawEMwcxNjBZ*e8$GZPHF|ErZuHjTr{NciH-^6~ z?in&#UNB_0JZ#8kxz$j_a=D?j zW?FU`%(tvFSYladu*x#kV7+C8!4^v&gI$&m2Ky~d431c87@V|}F*t82U~t8f#o(sp zNBw)2xAY%d9@c+hxmy3NTHLD4FT2|G1`c~_HXo>m`peXZ{3 z23noe4Yk^)8)>yzH`Z#RZlYD4ZmLy|Zl+a~ZmyMwZlRT#ZmE@uZl#rwZjBYAZiCf( zoffNmIvrMLb-Jzg==58y(V1j5TW6Y8x6VwfDxJAjSvm`>qI8y6dFd>-vesE;rLD8h zN=9d+6|c?~tH0XYtsZFawmPi6&uW?WL8~t9BUX9Z$E||2Pg$93pS6^M?PV13Xiq=yrZ><+rMq00|q_o~zF=~CVda3!z>Z0aXt6iGk ztrltivg+3SV^yO0-zrX%(b`>;#oADl&00p2)0$0_+xnvhuk{@b0qYYQLe`r#M64HR zh+Fq)NLp8DNL#0B$XW+!$XnZMC|T=js8~yDs9AGrXjp$x*RnpVu4BDgUEjJ>-OxHi z-Pqb)-PBr5-Q1c@-O~EGnzi)_HCyXdYWCJWYL3?VYR=X{YOdC%YVOvOY97{qRlTeq zs`^+TQ}wf6tr}oGQ8mcAOf}d#Mm5yhSvA~RQ#Ha`KsCzxhf0j~1C?0olPdAn8&wjm zXQ?DvH>;#r=c=SyhpVJpJE~+@YpY~gi>YK=GpgiT-%`%A-l&{!-Kkt?oupi3ZLM5l zEvj5<{a&fe`jk?I^)jVO>n5ct>v*MVYa69nYbm8V>mQ2s*4GsqthXyRT2EJOwk}s} zv5r)1wYE}hvzAe8xBjotVf{#<)B2b~m-Q-zZtH%99_vztKI<5Tersoi3D#N)6Rm|5 zCRu-#pKN_xev0)B`Ki{~^3$yC<)>Q<%g?ZWAve={uiPx_DRQ%|v*qSkJIl?rmXVuh z{Z)3p^?BL()~jR}ShvY8v`&&;WNk0I*jiS0iS=KZrPg<4mRawWS!O*?X1R5P%nIuy znU&TqGOMgLWL8;o%dED3Aic(VmGoNcQt7qUj?(L_1*F$oKakpBy+LZDb(7Ra>kz3; z*6LE5t^Y`FvA!s|#d^8qR_i*+ZPuZZ+pP5@w_CGI?y!C&vBP?=#7^s(61%L+Bz9Q` zOYF8blGtr6B(cZ(srX*&72r8;S3?{wcQK`jFTG>mIQK*5P6Yt(C|LBFC+*MNU|YiJY*0CVbL* zsqjhb6ya0Ws=}wNp9`I~UM+Omx%W3$t&aula@)&{)Stbg!aw?4>o-MWY8x^*Pa4Qmaa8`ht=Z(2{|zG-d8ebf3C z*DdQAT(_)!xo%qvaox7Q&UxEAdM9w?b>YR72-*Mcv-p+B)x{>3awJ*m#YblQV z)|c7uTbHumx0YgmV10<~fpsq118W(!ht}s*Gw%trs%Au&!l# zVI9Tv0=yPLg6XC8FUFVFcNkw;A7FfCy_E5lbr0h!>te>&)-jB)t=$-3TN^UIv6f|g zW6j0*#`+h-TkG!(Z>>Ktyt976@Xq=k!#nFM43IH^eGKox=L4<)uLbyEJqc+&U@5~# zlzoB044=Sz0#MrkpRLUpK3f|xOf{1;OEvpxYHfDIRNQR0={M7brngMHOb?otnyxlY zGM!->XxeV-WLjZrVwz*BVVYU|Fqk!)@R-$`NSM`_sF+on7@C!t*qIfXc$?*!M3`lpq?)Ch6q_ZRG?>Mi^qEDO z%r*-(S!ot%vfa$b3oUnoKZfFqvom#dxjxOXEG}ca2Y(Uo^gHe$@Dd`A*~S=4*|a zEEXDbSxhw+wCFUJu&6OsuqZHAw@5bDvj{Ubv+y#uwXijIu`n?9u~0S+wh%LpvfwmM zwD@C`Ve#Imz~Yfnxy2QuI*a2*trokCdMwr$O}3bCG|OV5(L#%6qZJlqM(ZsyjkZ}t z8||_1GdgVHV06mD*yy5#n$Zml38Q-!Tt-hV{u;ivcyIX0;-TSBiz|lzEshzoTJALD zv0QB^WI4}J(sH7qyk)bYs%4p>j%B8yk!7@@g{7aNou#9pi=~O7m!*bbpry27xFw%q ztRdm2GcED4CYu?7%Z~P zHdt;MZ?M)f*kF^TyTNu#D}z0jdIpCql?;wsiW!`-H1k6)(x`Spc`g2 zPdD1CTQ}aSQa9NuO*h>tL^sRINjJ~RP`AiRUboDOPq)hIk4~M{Yn?``TRN>)Cv`fl zcIfn2t+DEN?wNF?XYM-_e(>`bQN9&^1L#-=T$F;6ot<}0^ zHAU;LRh8BQt3<6wRvubUt@O2CScz-Bw)(I6*6O+D2dnd%pRIOiezjVl`NOJH^Osez z=3lEA&Hq+znoQOPnk?4Rnrzmrnw-`jG`OvAYw%eg(-5%Uq#poR~>k`#K>uA+rYbVuEYYo*fYXQ{=>+dR2*7sGSt&gk3T5nK^x1OnzVBM^eWSy&$ zY#pwWYVD|!X04-=VJ)tbY0adPZGBrg$9l7Jo^`i!zIBRnfwir2k+ryTvGpgVQtPuy zW!5W|%B@?KDy)-~s;upms;y;}YOMb#)>_|Ithe5!*kC)6#A^S75c4(6ed`Ilb>jPLVl9< zZ22kHdGb@Oo#dxki_1^9ej_)-`jFgA>zQ)1tPA93S$oLMwpNszWBprpuJu*fdDa_b z=Uey4F0js!U1;qpyU1Euc9Aus>|*N&GE1xv$Sk#9D6`DES!TI)n#>AoPni|gIx;J* z1!PuPzmi^Uy+wMBb-nZ&Yj5eb))La|te;D*x85eT-nva{gLS0TMr&QEP1a0Oo2;)( zZnj=0xy8Cwa*K7Wk9F`*0$n%t(nF5S)UTyZ#`LTzjd700c&ls1J*x94_coTJ!Cyo^pJJ7 z=wWL+(Zkk4qDQQsiyX1uD{|C&ipVkR9Fb$zZX(C66-16({}4W5y;1mtb&l{!YYpL( z)~|(5S#K0NWnC_G+S*>|v^9s&8S6`eXRYT6p0&;rJZEhoc+Q$#@SODxf%Dd@1kPL6 z3S6)b6u4lmE^yKMFaJgBwfvW?6ZkJ#i}GK#KFfF6x}EQ`wKLxpYbL%c)`xhnTDS6E zwf5q@W-Z8j&H5(KHR~lj*R2b9u3Ovl+_2{7xnX^X`-XKU_f2bI?wi&Jxo%n)a^134 z<+^2koAb8yRLlluE*4iBRtiQA0v!2a<-`bJ= zzV$1%2iDWr9$34wJ+S`H`p|kc>qF~g)`!-ztdFd3u{^S##q!v?h~=@hFUw*m% zytTf{@Yeb=!#nG94DYOuGrY6j&+y)Q8^e3+H4N{q7cqRWp2_gRx}V_#cr8E;!$<2P zhL0$F0)iMmS$i{lvUX+oY;6x-3-HNWpW(B$0mEW5A+ut$x29fZXH8YjHkz`UO*egM z+F*L#G{}_GX}`%~(;ky^rky4? zOxsKzn>L%gH?24MWm;pxW>#S$XjW<>YgTBYWtL}RW|nQ@Y?fgXV3uMMYnEV=Wfo&n zZWdwEVisaD$t=KRzL}57S~GW(U1rWEC(P_ju9;byJTWsh`DA8b!eFj#!e_2#B5ST_ zqHQi?VredJ;$bdi5@yb8l4{OwQf$s-(q#V2c!K#m{qZ1YyM&~W0jILSm8r`vAFnVn9$?%oMQ^OAy*A2g0 zoHG1tvDc8ra=js!}6+;W#et>rp{X3K>Jot9G#`YbyQ zrdZY*%(5&rm~WYCu+%crV3nn>!Fo$agRPdP2D>aZ4fb2g8XU0{G&p6+W^mr}i~beM zyZSdRkLlmDT(AGwa;E+Z%O?G|mO1*LEW`A_Svu(dw$##RuoBT{wfd*WY4uW%&+4+C zkkvjtajTVj(pFRT6s#KbRIPIKG_4}^bgf+UjI0dw%&cVftgSfp?5)1(I$J%~b+@{p z>tnT7H^6GOZiv+k-3Y5T-59H4-2|&d-4rW--3%*R-5e_&-2y8q-C`?F-EylRI@MOs zb?U9I=`>j#)oHWZs?%k)M5otkiq1r<7M&?pB|0;#Qgmiph3L$;a?x32Wva8(N=;{_ zmAK9tD-NCYR-d#tSzXoMX0=0mr`2rjJy!MF`>m3-4_UcuAGOlaK4B%OecI}~);X&? zS{JPjXU>WSt%tFxLPthQ=? zwwkB;)v8_dhgG5GZ>wm{zgDiA|E=^jnXDx>S*%$!*{$Dea9ZEe;I=-h!DqcuL%@2j zhLClqhNyL!hPZXIhNN|XhP1VKfL|)U~Wz)OD!_NqbF>Z&2ue5zsA-&De_@2NyuA6JRCUat~k zJyRvlx=AI$I!7hZI!qvIb2)|(VMtfwn>SbHe+TI(zHS&J$3 zTmP1yV0~JCqV*j4N!I!DldWCkr&vqMPqlt8H_iH}+;r=?ax<(;Xt+Mm1C(6#Z&Xb*Q?Jc{&T2pqRHM{I0>t`~Ht&hnpv0f&##JXK(sdc8z zGHY*{<<|N#E3AcOR$70QUTM8YdX;s%^lIx6={44h(rc|hNUgQrFSX8kg4BBJB&iM7 zCQ=)$*`+pG-;vy8y-9MDb(iF3>m zc3L}0?6g*t*k#QqvD^Bn_-^YC@jcc);(M%x#P?d?65D6JNNk^VuGoHS3$gvytYQbO zFN+?qUL<)p(wX5hMYYEZA*6&0PTOScQVm(LXh;@m`QENYuW7e7?$E;aIj$0oR zK5ktre8SpF_=NROp_A6Tgic!52%WNa5ISYeEp*!Yy5MQ+C4y(Hiv-VFI|`n)77{#X z{aE0f^;UuN)|~?9t>XkPSepo3u;v!HV11nbqIDJjMQa28OV-c%E?F<+yKEiHciCE+ z?~3&u-YeGgc&}I|@m{so{HAZk}t_?L615LwT-StMXj8e#?EsdNTJ7Yg_J{ z)-SnkTF>OVY3UtoP;-NE|M+KKg{^?#N}*85o=SvRsg zvUX*8Y|X>+*!nT^6YFElPpp?PKe29Perg@d{M6cl`I)sa^E2!BOwX)OGd;In!Svj^ zjp;df9>9g^g|#Zv3u|`pT7Z|<=NVsGZ()38J&W;`bra(&>nz6C)*+0qt?d|JTWc}C zu@+-|W6i?&#`+V(8|z05Z>=veytO{e@YZ@8!#nG(4DYNrGQ785&G6oO3B!BqISe1H zCo_Do?qc`=J|7UY7NCIPqjd(uM{C%gfIx;%)?N&steqJ?Sz9xFwAN$zWUa}t(TvTk z$?TD7gxO(J6SHNeB4)j&-%ZO+@0liQmbeTz^>0*;|(*-7VrgKeNO=p?(m`*pDVmifSj_CxGrKY_m>rA^% zwwrdC95ih)Ic?f#a@DlnzsCLLy8CR5GaOct9tnQSn#HQ8roX>!`k#N?)#fyr|- zZIdr%Y9>tPiY5Z)GA8oo5+=Il!Y0<{d?udeoF)snYCn^C_g&@?)3A!Bsbg5T(h1(VTj zi?4Ny=wr!c7-ad^Aj0yaL7e4NgA~gf23eM84Dv1a8s;6cZsHbgZtEX?Jsb_2@ zre|Trq-SIGUf03uj;^cKDP2#i?Yh2JOLYUSCh3M+HRwiK<>|&+#potldFiHFS?Fe3 zsq5xiiRuYz@u)kd9ms|7mURugpktQvGCSrzC^wMx*L zX%(n5$I4M>zLk;AVk>2xWmY0OE3H^{)>^&Q-e7fJd$ZMM?QK@mw0BxnY45R$(>`G3 zq*UHh07kM>Eck6LG}u4|pQ+N*WRYKhiWt1hh@R)t!(tRl7US~+Mvu+q?aY$c%e z%<6~c3#*5kudPmLzO&k_`N3+A=4Y!`&2Luunm?=}HGf+PE^;ic2L)|mRC2h{;y_a{Xosc`klQUD>oheR zYfm*hYaKOvYkoCH>(8pr*4I^Ct@o(9TQ5}gux?lNvd&ZWu?|)Bv$jzUuvS(LvgTF| zw*I0LYJEo~-1?|Wr1d(LDC_AeG1iSLvDVot@z$X#iPjD(N!D5_Db`{tsn(1t>DITE zGpsi&XIb|sXIrN!=UO``=UGcB7g&E)Dzv_+RAjwYsl>WVsnj}Msm$6%slr-WsnVKJ zsml7HVzu=F#aioyigngaiuKmXiVfDTijCIlicQvBiY?Y}6tIYb+q&g>uKVaL8_FF#^Jz%|2^ni7v=t1jX(Sz1%qKB-1i5#*%FLKy=naE-5 zT9G5xVIoJY4MdJwbBP?aJ|}$4x>NYLwY%_fYc}B%)+dBcSa%7XwDuP|X)P*r%KEP0 zDeGl|r>zSGPg^?+p0O4cJY)Sr;H>o?fpgXq1AV3H%qW z-S{tB|Kq!8y@T(PbqU`kYh%94)}MJVTW{sPVqL|1#oB@Qsx=4iRqIPUSFPvqT(i#R zxn^y}bKRPo=eqS??(5d6+&8QRxo=n>0FMFOv{vJ~X?>UTmh}wITh<|*x2;7uZ(CpE zxNSX)k@Yv`$JPg#A6xe`Ke5hWeq!y<{KVRX`Kh%i z^Hb|@OwX*ZF+H>1%JkfND${f8GN$L&VN5TqEtpS*z`Vr$x>*I_st=BTX zvYx{D%DRT}m3129YwG~U*VfjIudUS?Ut0?^zOiOxd}IBA;f?iuhPT$|8QxkSWO!@6 ziQ%pFQigZd^BCS)&t-UTJ(J-3X>euB_@TY3rtE)=bBWT&NOK>oo3Q*I@zSpbb`rL z(_WLgrd=jWP1{Y@nzop1Gi@~4Z(3(^(zMFtl4-fg9n%t%XQqWFA5HU2{+MQ)u$yI= z2$`jr$eJaZXqv^En3_eIIGTl-_?iWqM4APdq?!4c6q|XN)SJ1O^q4uA%rvtxS!QNo zvc=5AuZCq;p(746?n(-v_)5Z(T4;rsC-)g+qe3kKO^ZCX%%_kc_H}5e1W?o~=WKm$u zX^~i_s;E?}j%mUK!rExNG>#;)3B@i^GPWEw&l{v{-4#U^&N-&9dK+ z$Fj*#*s|16(lWzP-ZI)y)zZ&U+tSg{$kNo%!cxP~&QjXY#gfm^%aX}3!1Aj>nB_}@ zXv@0>iIx`((k+h|XWpw4o#L5pR(L8oQ4LBD0b!4%76gISgl2J$+KO)b+BOr|W0cqZ?#Z zr5k3Ip&MltrWe1=3s?q7U%GH@{6{|DN%2#Kmm7UI9D}9{>Rth>xtORwITQTXZvU;w)*6Nh@ zMyqw&TdXE(Z?`Jd-enc3z1PZ4`+${__F*e_?PFGNwN6@H(mG?cQ|r9de634XZCY2Y za7TZM9zWoz+auk5)~ZpRIBRXYDim)Ysgx&YA9GgS68w=s;*+aNL|gkL0!W-UR}%DPF=@ZPF>IXpPGU7 zJvAfi{c0xG3)Rf5o7F6=Q`M}jJ=CnNwbg8``PA&KKdCxeUsrXu-mU6ty+GB?x=q!? zI$PDtI#AWy+CtUWT3*%PnnN|v`h!Za^-Yx!>q9DG)~i(_tf#6(TGy*YTW6`nT8F5_ zS=*~5SZk>yS&OP9TQjPpTHjPov)-hfVco5qX`QN^ZEdfdV=bkeXZ=kn-};hLf%Q72 zBI|CYV(Sd05^Fc5GHX?(a%&c)3hT#;Rn~_UtF0F+)>yYF)>@}2)?0fhHdt#ZHd^y4 zHd%jEXtutp&|iH%_=w3`l0MB>%FqGt!K*4 zu`ZLHYaJpx&)P_Kp0%LteCrP~3#>25EVSMzv&edq%wp>jnI+a?GE1y2WtLjY$}F>H zlv!?lMtX(ybmatuMaY`kUAu>-}PTtUJZ_T8E15wN?__XZ=BRzx966{nq`W2dooC z4_KRs9<=5VJ!pMbP7ddMEO!%nveBoo((Za{9C4`S# zUl%%VJwxb(b+ph4Yk8rQ*3Se_T5k|MWnCk9%Gy)#w6(b4Y3t_#XRLP#oUxuLaMn6g z;GDIiz&UGaf%Dd{_|IF<=f7Yb#(%+Dfd8WPX}*ir9ekIp-S{q9v-4fDKE-?4x{vp= zbtvx@Ygyha*3WsaT5saHYTdwd&Dx*mnzaJYHR~tb*R6ZFuUngQ->`nlb;EiZ*9~hg zuAA13TsN(Eao(~n+yT^zTq8#wM*dvM&b7UH;Ly`TNAbqxDmYex3F z)`!^cSvRuXv$kiuZ~ce$zV$BF2iBFW53H?NA6Wlpd1$?#<)L*8%Oh)VmPgj2ERU=o zFh90l%lz27hWW9zFY^;?1?DH#f0&+Hzhru9eUa&@^>(Ib)^nJiS=Tc?w@zkyZtceO z+**t2g*6}33+vB}FRgDfzO>%Y_|keA<16bv##h$mjIXQ{8DCj@GrqPqXMAm~%=p?` zfbos>KZZBfZyDZL-(`4feU{;^^*)BT)*Be!S}$gJXFZ+aopm=DzqjsWcyHax@WHyC z;e&N0!w2X*z(?z3hL6_K3?Hq77(QCNGkmnRWB6!o&hXLNkl~EkJJY#lXG}}X)|v*G zO)@nwt1=ZaOELXz8esa=)Xwyxsh;TpQ+d;krb4ERP1#ImnEo>9GyP!FX8PQu&h(y1 zrRg=364Uc01*RuV@=Onzm@3o7tJPm|2@lFf%uqYi4Y+%1qy6yP1~B5i>QDOJ<5D_swKY-k3?4{4x_ZVK?VD z5jE#BQ8s5aF*Ii|u`~Z}>|_4cILiF7afbO#<8t%!#;xW@jVGJ$GG1uD-gv$FQscem zGmTH1_Zi7s}*YcSj zqt!({HmkjQ+*T{}_^qbsiCER^Nmym;$y$Z$DOx$}saomlX<13@=~;2;8CiYRHMe@C zYi)I2*WPNcuCvuDU3aS)y53f8x&c-tx*=9cx)D}^x-nMvx(QZ#x+zw&y6ILty4hC0 zb@HuV=@eVt)G4<*p;KkGL#NJag-(;z44qc14xLV`3Y{LS44ny9kvfyDymY2pS?kQQ z($Se`C9AX0ice>W)qm|3Ru8pTTOHM2XSG6mqg9Xg7OMj79abUQyR9s>_gTqlAGBiD zK4SG!>$uf9ty5N8w9Z=1);e$1sCCIIL+h$lfYuEw3$5E$3R?H9IJ6#Geb9VtbyM@1 z)gjH7R%fXEey0*(eN83E zdcR7D^$L|x>q#o%)-@`T*6Auy)p2)(k31);E+>tT!sBT6Za@ zTc;>zSlcOQSxYKsTYpi?wZ5p7XT46Tz`9$h&^lA8$l6`0#9B?M)S6YP%=)Qfh4oRz zO6z5cRo3l_HP#u5wbovWb=JCy_0|H44c1>2nyhaqG+XacXt7?X&}!YL&}N;Z&~6>9 z&|z(<&}prx&}Ge`&~5!tzQ=l#e4llTe7|+L`~+()`H9y5o1b)tWQa#my$RX!RmoUu+5IAd)iaMoH};H>p?{&Us~_|I8K^PjgC=f7Zm zh3|s(WWI~m!F(63MfomS-{ieyJ&*UYbt>;=Ydzk})<1ZzSRdiJVm*oHs&yjIRcj-j zYt}40*Q_^iU$>6tzHZIQecgH|*A44jt{c|MTsN)naNe|@&Uw>1l=GIg80RhPn;f^T z=W*P&PUE<3t&fhQtc}_4T3=_oYhA~7&svM^p7ndyd)7Nx?_1Zi-nVvT zePGSQ`oQ`!%R}o~EDx7>CBIpJRM!y^Zmu^*qLx z;I#mSjIXSt8DD|d0~#^Dww7mnZOzO0#`-tI8|zmLZ>(=IytO{f@YZ?{!&~e13~#L$ zGQ6{%%J9y*li{6pJ;OWe8ix1Q)eP^gD;Pdl7c+dY&Sm&uoyPFNI*#FkbqK=;YcGZm z*3Jwct!)@STAMN4G<#&a+U%fdli6a^c(V>ud$R&lC9`N#PBVAY&!(oP_f1tz&zXvw z?lNxqqdNsXDQNr#!C$y764lZ9rQChN>pO?I0p znw&6`F}Z3cVe-gK*yOz#zsX-SE)y z3s_hhi(BX#%ULKIt6GQ|>sW9Z8(aJ{va0P6pXf72pjFT zU^hBs@yqap#aqMk77q-sT3j)_V{zQ@k;QJqmlo>`-&-s){AMxL@Q+1@A(Lf|A*W@& zA-`pkp{Qk;p|qu^p`xXYp}M7kp{}K}p|Pd7p`|64p}pll16RvW2HuuW4FWB18iZS( zHHfu5Xpm&N)gZ%ir9qzMT!RwJi3XLHtp@d$RR%4Vc?MmUNe2CvVFptzy$xnr+8Zpe zG%;9esbR3nQr2LDrI5i^OLl`@mf!XFTRzl3YI$1!l;u|a^Op1VuUK~K-?S{&zh@bz z|H#rq|GA}+{u@hK{g0L$`d=+S>HV_2r}y9Tq#m=?7CjED1$w+zJ$iyx6?$S;DSA>? z0ebRQHhRidntJM1qI%j^OnL@Z?{rP9ZtGfDozS(h+NSGZwM5s|YLc#}RfDdtRi193 zRg7+^mA7uBm8EX1m4y;EVBBkz0~TC_6n>0+N-S= zYp=Iz*WP56t-aMMKzoOkiS}+QN$q`B|FsTUJ<&R1bxP~F)dsCoR@1f4TGeS?uu9ds zY~`bM&B|EohLyC|Z7UY7dsc5XA6i}0d}6g<^O@BO&6ie_G~Za&Xuh*b)BI=^p!vnh zTJxKgn&wX{LCxP*e>MJDz0hE=zM{cweL#cNdW{CV^-K*e>sAdO>mm(4>v#!<3n)`!&?C0v30VVskNJ$xwWR6r8SS5we<&8TkET;_SU;p9jxc8I$5`#qa zx>*ORx?7v8dRoh=dRw!p`dGhH@w2|B5@5YgCD3}gO0e|=l~C&{l`!iRl?ZEpl_+Z~ zm1t{Kl~`**l{o9)$_dt2l#{I2DJNUEE2ml~DW_T6C}&tpC}&!KR?4=%pp;|1Mk&v_ zODW$vL#e>pU8%@gO{v(LRjJhasbZP+F~xH0<%$*79g0=fS&G%xK8iKg`iiyILW=d) z-xM0GZz(id?^kHDUZT)!-Ko%Gov+Yl9j4H3ZL82>t)kFr&7;s|{X)LmdZ&Dkb+>%4 zb)0;kwV`~!HLLst>)Ub@tvAX|vTm1~Y#lE*#oAnMs?~_D+1b{jvU9Az$;`FBE;G-1hs=EISuzW(Yh)H$$IC3Tc9vOettPYBnpx;rith9q=kcGl4&*;)&Ch?%`Yhjh>j`}4twZ=OSWEINr;=X3B!F}EOCf9ZA9 z^*ZK9)(y;$t%I2#TWc^sw*JTT#QGZ36YKR%PprF`o?53fJ+%&CdS>m!^vv3T>AAHG z({pQfrsvil7++Z5VtiqJnDM3c8pfB_(->b`H-Ogyys{2sd}Zy(_}W^J@wK%y<7;b9 z#y8eK7~WVvXLw_MgW-+!Nrt!9yBOYDuVr{^y@27Z^<;*3)*TG*tZNzGSr;?Bv(9ID zZ(YFf-a41zy>&Xnd+Ruc_ts$yAFTZuK3Kame6V(80L=qDGrMNG(`=jR1hW~Yxn^~y zzGi8rhGv1L;%0WHjAlBfZ%t)P@0jwLo;77O-EaEUWV7ijla;3TO%|A5Gnr|6)?~8j zQIkH?eI{L|+fCX{H=4AXt}?FOpW<1w2Z|pn;*61>#Q~#Gi!DYm7AuUBEan(xT1+r1uxK_awu(QWw4qRx=PvdEC#GS!gRGSX1k($`SZ(!o&P(!@~JQr%G7QrghalF!iG zlF884@|%IPzRV#iyO{?F!x>hfA4Xv)~npqvz zwX)ivYiBi2*U73|*UhR**UKtH*Uu_UH^|CWH_XaJH_A#`H_l2(H_3`oH_hsUPL|aJ zom{I6I)zsIbxN()>r`6J*Qv4U*J-e7&}p_R&}p|y(CM-Y)akQw(wS&wtTWY0MQ4VU zn9dw4cAfcFpR^ZQUDIA>wNrbg)m-g0R*l;0tRZSSf3Mv*OeIY4uCvx79O^e^!??7_9ecFk7$E zV6~pE!EW86!DU^j!DAh#!DsEQAz*E(A#AO#A!;qEA#TmAA!+?YUE2DPx~%nlbp`7> zbtUTMb*Z7r>dRxJXHtl7F8$fEL9il0999Ob5(b1IaN< zFINe)o}dzJU8NFYovadO?WYoMZJ`ort*jDd&94$;{Y^Q}`n+t^L7>saL! zYfI%+YfyJvA*5{P6tXC^#TX!nuTBj@JS-UC~SgR-%TC*q>SwB@Qu|B3)YQ0>s z%(_#t!a7^A(%Mh4%Gyw|##%(N*7}D+o%J1sdh3G<4c5yPnyh;inyrfzTC5`!TCMFB z+N{+T+O7E&I;`KxcUte4@3NjK-(#I3-)n6l-)GGu-*5d;Zi4l8xrx?&a+9pn7~}b(#x!+rI%a3l3HQCOKPQc zx714OSgBRk22!i7S)|rj-;`Wqyp01E)@G9Htpz1FSihCnXnj&*qxEu$ zP1Y?Eo2`>2wpcq!Y_V37*lNurvCaB~_%`cq@$J@u;@hpo#dlcW7u#vQLTsmXvDhwa z2eIAO0%E(ZAByg=-Xyx$x>aXnwTN?|UvE~#wV||eStaTCpS!*@^v(|U`&RI|4 zJ7*orcivix@4WRx-V4?%crREN@LsgGH>~?OZ&>?r-n16rylH)v${9EtWPq&u-?k}!g?X& zOY0uSm)7NsFRhaqUs?MzzOuGqd}Xc4_}W^W@wGK8<7?=ifH&4x8QxeQV|Z)5gW;|9 zDu%b#^BCS*Phxm$-Nx|Fx|-pgbs@t$>vV>9)+r3{tdkhtS;sQGw~kDVe+f>B#l_{&~Ez=(+ zXHDOj95j7svd#3m$vV@sCd*8Znk+EgYck7ptI0Ie^(K=|SC~vRU1T!BbdE{C>2#BR z(@7>1OnXfxnRb{=F>NuKZrWfn+qA}HzG;QYV$%|n6{dwI>r8V^wwPv_>@rO^IcS<< za>6vxStv6{RzV>J0@_RE;r{DZN8`Ez4g^Lxfx=2wi(%}*P+>9n#SQ$;X&^4N8p=h+!Leyxr1*g#_i$8`tEIt_S zw|HWB)Z)6~8H>|~mn`-f-n7_cc;8~F;Zuv5hHor-4L?~l8vd{-G5l|lVaRG3W5{h8 zU?^zmY$$GNZYXQ1ZK!N1XQ*i@WTOZnn(0^{pt^daIo8AY@M|xi^&+7fM+@bf+a)}t57{rD@Q#^ zD?L3qD``C?D-Jz1tFOA+R*!V`t-6~1f+bTfU z-^yM$*h)_~+)7qA+KNXv-s-nbvej#ybgNrB*;c1?@~n306j`m(DYKfbQ)$($Q)^YN z(`c2W(_$5)(_!VS(`{v^({H7(Gs#L(XPT9e&P*#7ojF#owHH{O*IsP3S$mn)bnTT^ zHQH;f60|p1xoU5=($d~$C7`|2>Z{fstJ_-ptqy4&vRa{a)T&?WgjJc=X{%VRb5^ce z7p-)(u2_j`U9Yd*AEsQJXITl2Y9spd}Rst(qfs!rAc zs?OHts;<^@s_xdTsvg#FRlKaPsrXp$Q}MN4uHtV!K_$?-N+rlTStZ2UPbJjaLM7Z< zStY`nUnR==t8%pUS>;&kWyzY&eymtzeMGU?dYNL0b%$b^b(UhewXb4@wV`5_wWwmX^-qNw z>$?iI)`t}8tyd^CSobM3T9+s^Sw|~0TRSPVSZgY@Sqmz(TYr}Cus$l^X+2%O%Q{QG z+uBaP$683f*ZPHApY=Yue(R}n6RdOOCR)47O|q7gn{5307Hb+XKSYj>IX*4i=)tOaBiTECHA zWW7^*v2~mD66;{;rPfN)%d9_1Ewer(wcL7&)C%h~sg>52Qmd@_q*hr!mRxPUQ*w=U zzvNo$bjh{W4wCDvB_-Eef0kHpeO_XN^=gTY)}0cYtTQAwS$jxqw$_l?V$CVB#rm4~ zR_j^f+pOcow^^%+Z?}FYw!?b6*beI^v7Od_V!N!R#dcZ065VaRQ*^g=x9A@0c+tJq zrlNbTxkdL`KN8t*y-Q@j^<K0$a<&nVe3-i!`8;aN31^! z9kJdjbkw>+=%}@=&@pQkp<~u(1dm%!6FhF6BzVGFU+{$WUxAa>X9Z4L&lfmlT_|wM z+D+iJwY0!#>!rGtOth2eU zS*vngw|>NV-FhMC4eKP%8`i3vH>_WA+_c`vanrhr78?vfsAm zV!va(neC2sJlkDsKDN8o2U+i0m$BZn)@QwE{hH;T^-7le*4Zrgt@T+RSpR2!V11AI zf%Putht^Y>A6n-#KeF~xJ!1TmAkLiiEAJbE7J*KDD z{7lcRKQTVDzQOp+`Xb|V>!Xa%t+z40uwKge!g?~}OY26)m)3cVFTwKw9*nQ7%@|)< zt1!N{7GivD&B*xL`Xj>|>xT?)tS>RVu|CZ3#(FEmTk91JZ>?uDytVFUcx&Cl@YcG5 z;jMKp!&~b_hPT$?4DYNX8Qy{G|4@ea;4uJC@H_yc`F_(YW(!Q$m^GVrnq`@0ngyHs zn%SG0nCY0xnn{~-nQ@!`F#T)t!t{g5ZPOB>lWB&@cGDD-y{3sKhfU*5PMJoTTr>?gxnUY&^1w9Exrx_PPbQuA!%P3DQl2h78b&zk!f z-!^wLeraxQ{LNg)n8`xXn8QNMnBRiiSj^(Tk*viRBNdC6M%os4jSMX=8Ch5yGqShX zZRBRL-pI#diBYh{45KKE9-~ByMx%6#QlmVJOruhZSfd(?K%*uLSEEh~OQQ)Ex<=D1 z6piLuh#D=n;51rg@z-#J#Ye;K7EcWKTHG)^VsXasl*IwVixyi9uUjlPylXMr@QFpg z;VX+K!w(i^hTko+4F6ih88TZ28FE^>8S-0N8H!r!8A@9!87f+e8LC@y8R}a8GcdON zXkcmi)WF{ImVv9~IRkIYLk0ns+YG`iR~f`u&NE1~oNSP8*=~?)S#3~cSzu6MnPO0D z8EMdL>1WVk>15DnX>KstQpaG1rJ}(+OEH7RmfQv_EEx>eTE5cXWO+q@hvk0#y_PHW z4_QvpKWA$pmr}xhCrrsyZqk7*hH|YJb zoTJBJ)uG2~Riejfm8i#O<*O%TWu+%>rLHG!C88&9#i*xZ^-fpA>b9Z~$!nyeypTCF^FI<2g9daQJG`mJPjCR_38 zOtWIpnPv4vd#=?9?FCkAw3k>-&|Yp;s=dl8N_(x9z4itxRqZWS+}hi%K5FfLOI^r zSUJ&}UpdM8wNi@p38hr)rAq16%}N>8NlIDPj!N0qib}cGj7oXdj}-H*4=Wa0FHtPA zZc{9=&QvV5_E9XeHc+gv7E!FU{-IE1eOIB{`mjQ+^-6_0>wblL>r#aV>llS5YiEUK zYi)%VYhi^}>mTxM)+goLt>?&hSm(=kT06^kSxd-wTfdd-wLT)(XFXf4-?~U{g0;8Y zL~9kfN!I^lCt2T+oou~Dc8c``*{RmKveT@+WT#te$j-24mz`<-OlFq#F`3!c%Vp+R zcgW1K&XSpH?ISbKT3=?qwXnkrZkt#?Z=wC<2zWF0QO*jinBiS>7>rPe2ywcOfKYK66^)Jp5ulB=u_O0Kq^A-USRKyr<>r{r2|CCRnceet$ignS?fw{vgVW6Z2eGti}f<`t=2i>Tdj@7w^{!d+irbSY`gUYu^rYi zVmqxh#dcc%5Zz^cTy&T94AI@zS)zNaZAJH33yJQvej&2g`k=@@>sccEtxHArTL*|7 zu+|YdXw4yV(E5zf;w+NiFju1Fytt)WannmEW^$z|s)>-^#tmXO7SYP8i zYdwMQthG1aIcrY7bJnML&s+EKp0^I*y*bu+tur~VTkCP&u>Q(%!+Iab z4eJh$o7N#5H?5U8ZdpHJzh&Lde%o4y{kHX0w%gWCYr0Reqi0e{Lngu`JuHd^FwP@=10~n%#W-eF+H|E z!1UO9KGS3CI;JPqaZFFF?U|lhD>6N`W?_12{etnC^;yPe)|(igSubULZatUrx%EWG z7uL;;FRY8fV*oF$gBV|0J21Yo)@OWWEywuEnwRml^@rHvzeetzZtK|Y%?yCWoB$9o6ML^_M81TK5h2h_`2D9$68;xzuR~UPm&od4)pK6?J-fdi9-e_EBUT)lN zo@YG6JjHmKd6e;H^8n+6=5EI4%x#SCm>U|uG*>tNZZ2cYWFchCX~AyHZ}G=S%;JNQ zti@9!6^mO&S{CPx3@wfrSy=2ava?uYQMHAOQKN;0QHO<&QJ;l^(Nqgjqd69wMvE-|8m_eXXt>_uso^$@n}&NV&Ke%F zIB0m%VyoeKiCv6yK1$fCvYg++zody5>yuNDc0zb!%x87(~w*)44hc`XeM zg)LPLB`qZlCt`7-U(N7!+7$8kAbb8dO^b88leB8?;&47<5}27)-EKHJD~8WiZ=Pz+izT ztHCnMFZ!!3@9S@{JgL9caQrYB%!q$gq}uP0%} zqbFVQtB)drm$s|7j*RugqftQvJHtcrB1t&(-> ztwMB~tXy^4tju*ftu%Cctt53OSaIu2vHGb!-RiFPEUSas^Q@L?FSP2?USgH6z1%89 zd$pCN_Btzh?TuEf+FPt%Yi+l>q_xXxht^)J`C138+O!T^%H; z6`$5ct8bcDtnO=Gw>qJD%W9+M9jn=z_pMqrA6eyVKCz0_d~W5U`O->X^Np31=6fqv z&5u?eHNIHg)%a$0O5>;1HjUp_i#7gPP0(PluGL_&&emYHj?iGYcGKXrHqqd*R?^_J z7Ss^1X3!9_zNao~y+>W#dbYZxb(Olbb)>qiwWYeewWPYD^-ncr>sxB7*1Ofzt>>y~ zTGy*-TPLaMTDz#}TdS)XT63!zTfbK|wZ5!sX1znz!g{W%m36bKjdiA~t+l_Zy|tOD zqqVH6vo))#i}hO-H|wh^9@hI*Jgt|jcw0|U@wKi}@v}}*39$B83ADCU3AR>I3AGkb z3A6sL9ASM$1`xI)eOBL#@V-y;!T@)IvbrhPcMHHH?f62F4pOtU5o-f~ST`b>W?JnPG zEhFD${YkFd`h;AM^#ZwG>k7F(>j1faYc076)+}-pt?$WBvfd>-*?OAn6zgKysn!9q z)2#Jmr(5&N&ai$XGsF6f%uMUGGPA7vWM*3z$jq@0mYHj9CNs}kQf8j@AL;ql$D|in zPmo?{9V5NST3dRt^)IQ#)~BVGSkIGMYF#9?%-T(AxwVYc3hR%OE38jQuC$&nxyrgi zar(M8*0$nXt=Yu4T3-~~W<5u2yLG16c55@S9oDR3JFTyZ?zCPey34vkbhov)=x%Fy z(LL5*MfO;q7TIgPNMxUNwa7l}P?7!CMk4#I1w;;5-w{4&JxlnYb)@hiYboJF)^~&s zTQ3kgVx1~<#9Bw_sPz}Yqt^Qbk6CvL9H3%yq?jCf8N#K(4FS z++0_!k8@tLZsojY?Z$cCnv?Uo^;wP^)>AlcSjTeQu-4$XY5ku4ru9_zTh?~$x2#{W z-L{^=cH7#M?Y8w_);rc)SnpWpvfj1UWW8(soaL_d3YL4;IV|_Ajacqm|6;yxeU$mW z^+e_e)(OlHtc{o-S_?2gwEoHT$od}BBkMy4~*I(-Ui9 zrl;258J}9;WqfLVnDLqQO2%i_6B(ad*D^l0u3&s&ozM8fI)(9tbr|DIYj?(%))tH} ztu+{5SxYd!vgTlXW&MNUwe?Ge*VeZfUR$4Lcx}Cx;f?irhBwv=8Qxe=W_V-W#_-0v zis6lQ0mB>XRED?KF${05gBjjh`!Kw-4gikW%4OsAUcFzq+lX4+}8#kAREvuUl#CesR&O{T>rTTJszwwh*{Y&T6a*=3q!vd=Wu zgJ{oyiYVYZC@D3lk1A6B9u* zLla3eJrgA}Z4(_cbrVxF6%%_iMH5dmS(9KhDU&!eagz))VUuDrev>*g9+OTp4wETn zEGF~K7)(~1{W9Ke_SyKb*&E~YW>1W7o82*fZg$1^v)LJA2J^$lJm$NNCCxV(tD3Jg zHZoseY;Qiz*vGurIMTe?IMuw$xX8S~xZXU?xYs<^c$Rsv@p5xd<1OY6#)r(!jL)0v z7~e5hG=60+Zv5Sx*Oh8iyEUyi$bG#i!`G&izuU93xA_x3umJ$3v;6e3mv0&3k9QI3lXC! z792*iEdCfSwD@Sa+~TR>I*XfzTP)5Q?zT8&c+g^-;c<&qhUYBi8D6oNWO&P>&G3Om zmEm)XJj1sZNrs;-!VG^}cp3h;us3A2G&bb6R5ui~ls1&G6fl&tWHD5>{9&MJ`Nlxs z@}YsL+iL!(?4XHsejxuME{JXgZ@QJ9sR48;`+BNnf32mzSnzVd0X$L<#D~YmRs~bSuW7~ zZrP*v+pQ=jTwXIg_ z>RZjwHMVNgHMc6!wXsUpb+8K5b+K~Lb+^*j^|q4J^|#{H4YvBD6K?fJC)(<^PMpI%!s`b+W8x>*QMX=oDJj=#*OJ>Qq?8>C{;H>oiz7>NHy!>9kv^=yX|$>hxK$ z>rAxzq&>yzn)VE!g*U))^}F zGc@m7HEG_r%F%pe6{h*b%2D&Vm5$~sD{;*?R?M33t=?&Tw7RA7#p<}mH>=GWKdlyM z{I=@V_-9qE!C;-C!DJn#!D{WI!ESA&!D+3i!DG#@!DszfUBLRbx{&owbrI_s>f+Yr z>XO#s>eANc>ay12>hjh<)D*36swrFVR#UZ}qo!_Mucm38sHSc0qNZ!DuBLCzt!8Nb zUe(z8imHkA4plSjd8!uH&8k+`nX1;-{;IatW~%nqa;lEjtg24dZ&h5Zud29N?^AKN zUasP4Jwe6Wx=O{zIz`3L+FvEW+EOLZT2&?3T0kYl`iF9u^#$c{>lMn8)=kP$*3rr_ z)~3p_)&k0L)~}TktdA=tS}##bwr*5Pv5r?tv$j)8x0Y4Pu>Pl*WqnUE+j_rZj`c#t zJnLq~eCssDLTfL@B5OUxVrwDAQtR&uW!85T%B>G7R9G)psIu-=sJ1RqsIiV#sI_)h zsJGTpXs{MhXte$<-(-DGzQuZ>e5-Y-e4DkGe7m*0e24W{xlZdda$VL-&-GV zt*6M$vM!UEZ5=5y+uBBEjU-6FcvI$U&@wT|d+Yev!C);C1vm z*@8!{(*=)Nn+YDXW)(bceNEuF^$LL#)-?hrtOEs3TB{43wEoL~%6dKjDeENu)7BFF zr>!sWow4rbJ7ev^ch;Jn@2vF+-gDO7yyvU~c+Xpl^PabUz;nTRHO~d>3Z4trZaf#Q z#dt1SU*f)G-N}8)+JXDB^>?nz)*HC4SZ8rvu~y@{YW*&jvLm395<~Gu-~*!V83b2!hXwo4cjg2aJF04tZcWf_psi!u3)`m zZN_@X`a8>A>s>5&t?O9sTD!8`v*u&DXMKzLzV&kE`_^U5_pRNTA6QE>Kd}D5^w9bk z(?jd^OpmN*F+H+wW_o0u&Ggthkm<3tInxtsS*9n}%uG+LUot+mzQFj@dOPDY>jjL@ ztUDN=Sr;)rw~l3eZXM3}!a9KQg|$253u|k}m)5$BFRkSnUs?+=zOrUyd}aNK;g$6h zhF8{C8D3i-V|Z=7o#D0h3WnF#vl(7n_cOenMh|)`1Lf ztvwmuS^F`(v-V=pFrQ=k$E@D;s#%KZCNm$?$!6xJ%cmDJCaPdrgj-wwoL>Z7?|i-oIB0 zUdO-BG}~mqX`0Ca(?pX)rm-eRO(RWCn1-61F%2}iVCrjf)zs7EmZ_V`eN!isr>6EM zZ%l1WKABpY{4_N+VKg%`;V{!P5irv>kucLRQ8ZIE(K1ssF*cJku`!c2aWfM)2{02e zi82#3NipL!$ur|JsWf9VX*Odr=`;IhJk#u(@e;H5#v9C@8}BxIV0_%{rtxL7OUC!j zP8q*8J7oObY?m>!`6gol^OeRj<_nEA&1V>!n)ewynYSAInb#Ocn-?2rm}eT7nkN`H znui(pnfn;eHg_^!VQy)>&0OF3u(_)71#@ZRyXJz%uguwvf0+L@VzT&T#A)%uh~MI_ zk(kA0BUy_RM#>g@jkGK_85vkCH!`=FV`OJB(a6Q3)yUhT$|%qx&nUto*(ly3!YI|k z*C@xr(WuD6%&5{r%c$N$-l)w&*r>;X!)UU_AH$gz9}E{*JT+Wqano?E#W};x7KaRX zT5K~sV6ocpn8kds>=NklA zPBsX&>@bM7tTjlmEHp^7Of$%~j5a8=^fxH8bTO#0v@~e6)H7(aR5s|blrWfR$!9Rl zlG$LkOHi)r1#8npWbWBReJ9&r|W&OY|;B^S)ljVGFFet%1e*U%3P1jN=1*~ zN>ESO>YuK-)f-(ItDCwCR>yT!thVZESS{Aov6`rBXjQLkYL%yJX%(w$YvrTsXl1SI zYNe&?X(g%aYsH}(X!Ttu#Ok?Dgw-{j7^`DC30B*5lC75Mq+3nb$+l|O$+N1^DYDAc zDYJ^wskHLeskO4vX|U4MX|a;mX}1#8>9%6l>9cyRJ<004_Ef7a+B2+XXwSB))t+ya zq`k<>U3;mOuJ#HmVeQpcKeg6dJz3Ggj|4&s*KlykvDy^QzTq&FfZEHE&tfYu>fW)VyyMqWQ?mUh}DymgaLS zQO#FY44QAO-e|nHx}ovW>WIb{tBo4ptmbL_wCdLQZB?Q1*D6he!8$~P$=XSS)!IOV z-CACQ)0$U<+xn+EpY;uO0qbq*Le^8&MXXEI#jHcrC9O@=rL9HPWv#!d$y;AnQ?%Zx zrffZ1P1U+iP2D;{P1D*%P1{;sP1l-RP2c*xs)6+tRU_-2swUR+RL!hgR4uHtR4uIo zRIRPeRc)>1RPC)fJ%_{59JW+i^`$atCYj7o0TK1W0j+<&6T6Ag_L8h-zmjepHzysUZ#|2-K>;k zov4&zZLgGSEvuAf{Z}!=`krE@^?t=H>jjEA*3F8!)~Skl)*gxl);fxX)`E(~)?XD$ ztZyrnS|3y>vtF)HVcn}xX_qEY z*-6&XvXiYXWv5t6$WFEXE;H5ohRihU9Wv9cXUWX4u92B(9Vau(+EHelBG~)-Dq3tyLs8ShGrO zus$ok(Rz~jChKtVP1f?_o2{RVZL!`cw#B+eY^$}0*fwhkv2E5bMYmh;7TsapC%VHr zNpz>Rx#%uyUeR6Fk41J{?-to(Jw;@Xb*{)>YY&mV*2*ILtQkc1S??C!Z(S~Yz}i&! zfc00QgVsBR4q7(~9kTWmI&3X0blCcy;1TOpf=8^&1&><02_Cf;6Fg@9T;RC%PJ!dr zy#gn!lLSs!TL_%A<`+0=eV+f6bu<4dYYYC<)*tvzTd(3fW1Yr###)u{to2jgv(_uX zV*ux@jd{;m|K>SweT?V4^(3AP)(Jcpto3;=S~K!ov|hn|(K?X(lJ#G%OV&HNE?ZY{ zUADI1x?=r<^NRIO&a2inoL8+KIImf=a$d7O!*ShuD#vx}1dbclIvh8wzp>x2p2mLD z+LHaI^?kNm)}3s(tj*bOSwCmJZ9SXywsj!uZEJ4UJJ!cp?pU|6+_m;#xoa)La@YD1 z^F8a0%=fIDnD1MMGT*n>WWI0xpXq`1HKqsF>zN)}cQHM*PGfpx9m({_+MVf?=?=rlyKF9FNdOyP}>x~Srtd}snww}T8 z+Pa(JwRHo-8|zYrH`ZAUZ>$p;-dKk-ytVdYcx&wr#-`>IO*zd=Odpv=nI156GF@n< zYuaiiWtwBgVH#@o-Ne!Cg^9k|Z4-I3b0&gjhfG+^c9{G$U1##abcxAx)7d5uOedS% zGVL+BYT9aY(X`IwoN0y08Pg(@Q>M8lCr#5$PMRi}oHC6yIc*wga@I7|<|5n4L8~V|L8=y4il?$7VZ>--V;A!h<3RIl<5=?~<1F(C<8pI<<7RVL;|bzZ6S|l2UTZ9?KS$G?zSlAn7TbLLXS!fznSjZXGSqK@mTCf{+Tl_Yh zWbwgphQ$-Z`4%?~ms*@PTy1g4aFfM0!yOi@4fk0rFg$88#qhL6hv7wwTEpuWg@$)6 zQVkzlL>a!a@H6~i;cWQL!rbtWg|;D+rGg=crHCP)C8wc?94b#sK42= zR)2?OhW=j55dA}z4*JI|we?S1itAsnWY)iG`Cjjq{Di4aHb(uuS> zq!VkkNhi^2kxq)$B%KVaW}O_XVx4@e6rEzLP@OU>H=Qag3!PdkO`S$7X`L1;UY!oB zf7;zvkF@)(j%!b{TBAMHYNGZ`t1|65Rx#T1tsJ!%S*dF;v*OiWY4urajnyr!^;QS9 zHd(FE+G^FWwZp1hYqwRr);=qDt%FtuT1TuTw2oUbYMrurt$Eh!ispH%y_%P-mTO+M zny7ihs#^1wRhs5qt3b^MRyLZCtkgB1S_x@BxB92?%IcNI8>?#?@2w7Le6(7x@x^M6 z#y6`@jh|L!8o#ZQHU3%!YA{&aYcN^sX|Pz!Xs}yzYj9eBRp++8tj=e>SzW+-lDd#} zk-CU=kh++)k-CJnu)4JM7d2Vyt7`Jr+tn1UXR0Y%*Qlvl$E&GZJF970tEp*QbE)ZC zzgN|>zM^Viy;If5dY-C@b&IN*b(X5Rb%3g+wYjRbwVbN0HJhrP^*a>@>uV}b*85bP ztyieHT2EAQx2{(4uufI+vi4W;wzg97wN_Q}w-!(du>PqWWPMRN*m{+6sCBb)n01_T zgtdioq_wbewDo(X80*tYan>u8;;mbi60DPzlB^w-lC2e#Qmy|hrdi)tOt;>zm|?v@ zG0VD1G21#-F~{0NG0$2@G2dE1vB3JPLXq_?g<|Ui3MJOd6w0i76w0lO6)LQw6)LTr z6{@YZ6>6+S6l$%1$=6w*m9Mv6Am34C`c>nbz(yGp)5`W?A#g%(i|ZJ;!>p^jzzD>3P;Z((|pQq~}||lv-fD zQ);1gm((KbSgFO<22zWyS)`U&-;`Wxyv+lK)|QehtVJYOT7QsOWqnR! zmGv5l)z)1SYpk;*)>?Z>thLsXSZB>GvEKT&_y+6w;v1~f#5Y>&if^+1Dz?dbzu0E$ zF0n1v;bL2?Rm8She-_)!EtnEd2Sc{47w0#qXGtWO9Wvz{Yx+`3TUxV5{$32Qll6V~tePg*bHKWQD# zf6AJl|CIGfzSGvNe5b9Q`Oa7~^PRCi%6rzjllQE(Kkqqfao%&*4|&d8ui-gwUBz?3 z+LPykwIt64>l@q`tsA&6T5EG(vcAc6$-0Z{vb7!8W$XW(SFDe6Ua{`xylNf9dDU8q z^Q!e@j%(IyIj&h(a9p=`<+yGw!g0g;1p5u^Z1$VhLhLuKceCBJPG`GiEzWk!`V{MJ z>w4DP))uU{tv|EevEImX$GV8+jcdZXI-?i>zzGofHe9u~&`MxzH^L^{v zO!uv~F+H%J#Pq9Z>TX!(Lwyp)Q1$bkf&hW-Mmf?+c zFvA;b4~93^jtq|GZKh)8nWi7i0!+`ES(>ghQ!$-nCSY1=_TMDg?7fM<*#i?>vr8tr zX2(qA&32gxnXNZrH(P4**L04_7t_fmZ%w;Ro}0FqJTk2{xocWxa?7;9wjMF68jMXI8 zjL9U;?5}Zw*>~eAvk%5CW-pEV%^n)hG`nTI#O#vsdb88UyUY$7A2r);e8Fss@g1|Z z#?Q@`8GkmLXZ+u6nlZO|pRu@ko3XNaow2@osj;rm> zz+%6Vn8j8jS&LOh$`%WZv@E6?8CY}~nOoEw*;8ZNOoWVp&=o8bnF z)rQ+G78vfem|}R?qSNrCMV;XViz35o7U_m}ETRn`Sp*oquy8SaXJKjh#X{HcmxYoc zgQb`unQA@4p+Cp+u>L~Jb^6OJXX&rDY}MajS*X9&GFE?=rKkRWOH=(LmWui(EqV3N zS^m_!WcgI@y5&W^JC^(O9$K!}dulmD@0De%-h0a;z0a2MdOs|E^!`{{=`mWV>#Ty{y>+xBA&=s<}rz>uCMpxQum#)0k3SDKZX}aoGt-9J)#k%@dNxCLhfw~q}4!Sm0 z`nnEQa=Ok|e7f#de|5aA-s<>U-PH-UI;#_IwO1#~YOPM3)m)t=tTms!2jT4{AfYmL=zt@T!mv^H6FX>GMC(%NAarM272No${# zw$?!_VXY%pe>IO=J<~j8bwTs2)lSU|R*N++S@mgNwW`p(VU?_T%gRslu9cB#qxz{u+O+Y&96H zbu^f)r8HQqIW^dltba)>Uds*0E|T){bgw)~ae6)|_fu*6&nxtS_tTS?^Fau%4%CWZj}_Vx6UG zY8|L*Zf&7zX)Uj6ZOyJ~WBpFW&icBFgY|wDN9z?T&ejuET&=5B+^kboJgfs$ysWKM zysgz#e60ml{H%W|2UuTH4zyma9Bkd99AX`(9A<5)9BwV59BKVQDa!h+QjGN~rC95B zrFiR9r37mir9^9GrDSU+r4;K&imBFz6w|F2D`r@?DrQ=zD`s1JD&|=0DCSxVDCSvz zQ7Ev!sZeOWU!ll)sX~c$k3y++u|k=3v_iSHvqGh{wnCM)h(fjXFZmklv+{M;3+3yr z%j6rZz2zIN73G_(f5kZ6?=gEhyJz{YJLi`h;wc^-|eh z>n7Pg>qOapYX{j0*7C9wt^dnRvVI^l+4`W&6zjz@Q>|NNrdemmOtDktMrDt1rO3$$llb&m>B0bOgv($X+BT@^jr%ElbPM2C}Z6&qHnonx6^<&8; z);lGaSWl2#YMmju%-T_MxwVw!a_g@WE37X`th8P)vC6tvVwH8S#A<6_i8a=G5^Jpm zB-U9!6<=q)T712Aq4)-COYx1?OyV1@&xmcZo*}l`Iz?==wUO8sYeuoH))z&$S}zja zW?dq>-P%KRyS0qy4(l%>JFU-(?6h7cvdg+rWVdyU$Zl&3kv-O;B73Z#3GcODEWFP; zQFx!VqVRs}$3pw9mkAxP&K5doZ6tKi`j_A#>%)SFtosEITSp5Xw$>3mV*Ov>sP$!m zqt+_~j#<|U9J3A)IBu;YaNL?z;Dq%){u93bY*2j3xSx@FUZ=J+*-r9)gf;9`z1?%youR*JbPLoR_U9abB^G;Jjk3%6ZlLBga+ieH_=UyE(2|M{!)Y*5bHs z{gwT?^-T5~)(-49tY5L+w4TOx)7q8omh}(TTh?n>Z&|0X-nN!!y={Gm<+k-~mOIvQ zEO)GxSngWCV!ms=nfb1DJ@Y+lU*>z(a?JOvKQP_5KFW08dJfZl>k_61)_zP6to4~5 zSPL;dwEoWc(E1MJBkRkIkE~BHKDOS?_}F?i;}h#yj8CjP8J}2}Gd{IWWqfKK%=pyW zk@1AXz`Xj>&>t_rvtZy;Av_8l1()tj?OY5x+ zudG)vyt1Cd@XC4u!)xmnhS%1W46m*87+zZ^gU0|~TYECRwzgyNGp{mLHjg*`YvyKp z+f3hdkC~L|0yB2gcC&9Lg=Wu8V$H6bc$u9tu`=6hqGPtnMBZ${sdFuP~mWp>?os@VnO`DQ1K zSDGC(-eR`Xc)!_3<5OmBBrN(OJImSlj zDaLl@(Z*ip!Ny_cUdGAhj>h@s=El|Ldd3~*s>V~yrHvPw3mLC9=P=%7{?F)``B$UM z=C6$&m_IUlYktG%m-#s(W{V?6oEE!`1S~cfiCHW&lC_v)q--(KNXw$#$iSk;$jqY1 z$krm=$k`&s$jc(oD8RzaDBQx@DAvNjDA_{QD9b|1sKA2XsLX=JsMg}AVY9_M!!C=* zh7&Aq7*4Y|YdFW^py6VRZH6l?RvWIjSYWu-Vv6A&i%!Es7IlUvEQ$@!S!5Vqv4}Ce zWf5rjz{1V&nT3_%8w-8IPZlbMKP)5+|5@-FvRE=1a#?;e5U_l0AZGc%K*sW_fuiL} z19i)N2D+A;4U8>U7+6@&HL$asWZ+`iZs2KIW8iODXb@tVW)Ni=Z4hr6Xpm~@W{_oR zZBSroU{GqQYEWe^EN%7oSZeAYv=q}nX33;~+VZ{L13y|y(feg-sQ1rOUXR&|SC8H5w=TEUOI-o0>$)OVM|CBvHtWh-Ez(uA znxLy{Rj;dQm8+|36{Blt<*jRKWuV=Mv)eW5hs}njQ zRy%YetXAkmTg}vox9ZeMwyM%ev&z=VvWn5kwer;|w6fDFwbIwAuu{~iwi4Esqdv{qSd z(^_jaS8Ib+tJY?#T&-oF1C94w6t5)%vH>|ugZ(EsZ-nCNHd|<_^`N-<0##5`O8qcjRYP_=Ar}4&WwZ?m^ z=^7ucS~b2{6={64O3?Ue<)`u6%0}a_m6isBwWJ1l|>(lBS)~nRHt-I8D zt+Ukmt-aL+t+mxfta;VNtlz0gSYK3=vfivFV?9kx&bm@f!8%4w$=X3p#acy8&6-0^ z!}^V?mh~l79qa9?de(DQ4Xm404Xv|OjjaP!O|30d&8_8CEv?yAt*qax*jQgzv9ms) zVsE`t#nF0_inDc%ii>rciko$Siifqeil?=jinq0pijVbgWk2i7%Kp}Clmo3>m4mF~ zl|!tpltZmWmBXz+Dn(eIRf@7+r4()5p%iPKrW9xGs+3@@qLgUOqLgI)L@~wssA8)1 zGQ~9OcEt?qOvOxVAH^(deZ_2RA;nzlZwh(Vw-oZN4=5B^FI6bA?olYVE>bA5j#4PK zc2X#})>5dj7FMXV{v}^!eOA84dZB!+b(wsfwYPk|wW553^$)p5>kD$t)+^*%tQ+N8 ztz+cctj*=xt%c+|tl!CYTA!BfvR)zEZQUl@W1S+~YwaxCXRRdLZ_Ok-!TOQRMC-#c zldPA@Ot$WjnPQzSGu7H(W}3CJ%yesUnHko&0Rltqa69S=)(iw&oSvY<*93i}iZZt=5gATdhMyw^?h7Znyp~vfcWc$PVkZB0H_y zMRr;zi|n#?5ZP@lE3(`AyYL?Ct-^b)ON94Yn+Wf-{wB1~dY90C>w2LB)^0)vtoeiv zTHg>nXuVkQkafP`A!}Q~!`3{4hpq1l9I;+6aMZd@;HY(+z%grcfn(MJ0>`bd@gKMD z;Xh&R%74=OKi^5~J$$FEtN2b?Tk)N?{>^*ZdOzsH<~);_#vtwnjyT0h`9XT65! zoOLzNIcqPT^VTvv=dJH?U$AcHzF=+4ebM?6*G20oT$ijpxh`2Va9y(A#d+Dfob$4^ z8Rr%2?;KaG4|80#p2~66I-TR1wI#1Sg zo7Oj2Z&~-V-m>;&y=BeHdfWO4%Wdm6mOIv7EO)F0SngQgWWH;?nE9@CA@f~p2j+X$ zg3R}ujb6)^1D>td*D^STiy`uztw+(E2drL+fRXkE~}hKC+&| z_}IFe@v(J1<74YW#wXUvj8CkC8J}1?Gd{I8W_)U`%=pw=nDMDK6XR3sPYlnj-!MG0 ze#P+I`U%5x>pKiDtS>RV0FMFeW_W46p5dkSVun}N(-~e_cQd@Qu4i~{UCi*>I-TLQ zbtJ=UYafQ!*3Jyk=J}=u<{_qB<~F7;%v4QJnhBb&Gy7*U)$FZFo!MQJEVJ__5oQNX zJj}M5SemUe(J`BEqG&eNMBJ>$gwL$mgx###gu$%D zn7lFdH+f^~Y4XO@#pI2tgULHnYm*PA<|dy^jZMCq>YMxk*Zb-w3}(tEtY-2iTxK#R z0%j5>VrHTyGG;<1N@jc}nr7T4hGrZl7G^9a4rYud9%jFd1I)e}N1DAePBeRNoMraF zxY+Ebajn^9<94$%#uLnr8qYG@XS~#GyYYIn^~O8RRu~^KTVQsSGnX^& zG8Z+TX3lNA*qq6Dz4;HL-RAF&PMAM6x?+CE=%M)~qj%;fjDDH#H)6KfYQ$x++DO1+ zp^=!ybR$`dUL$3TW+N?&N+Sb{JR>uU6eC-UNF!$pKO;{I7oz|ROQSFgJ);;4Wus&Z z38PF4UZZ>qCZjToABHs+Zw;F)9vOC8TsQ2uIAb`~;-KMdi*1IBELIz?uvlQY&SHw; z7K={9T^4nQ2P}#Wk6UCIp0$WIylfF(%vA$(!?OwQq!Q=Qr@7#QpBLvlGC8c@}GW(v8L#)w(pT@3rM2F7OHIAsmg0I0R;+p~ zR-bh_tsd&~TAkMwwA!aDX0=9F%4)W*oK=^ul2wJSnpL{4mQ|Rpo|UVvk(G(AnU#vJ zm6forofWgLlhr33H>*cFURIZM{HzY^1X^v@3AI|H6KOR?C)TP}C&8*rC&emVC*3MS zC)>(XC(p`Cr^rfMr_@STr_zdFr^bp=r@`u(cC*zf?KZ3R+Fe#tw0o_pv?o}_YfrIq z)t+vptv$<1NPDi;Ppt)3544t8ozPltwO(tL)pV`3R`psNtkShMTLoxsv$D|IX{D&O z$BIj9ztv~WLsoY+k6InqJZ`m7^OV(W&9hdmnis4JG%s02YhJZ-*Suk6qD+XR$u1&St$_ox{3aoy$5+o!8o3o!?qRUC^3SUD*1ynyB?zH3{nt zYEssd)nu&8)a0zA)D*1k)Re51)Ksk5)zqwCt7=$ZRMoQHrmAB-M^)FlNmbuEQ`OKq zK-JjVT-DTCUe(;1UDd++y^59f4HX;f11h%Gt5oc*C#yJG*Qz*Kr>nSF2dcPP+o-r( ztE+fg3#oWn|55g_zM|}Fy;j-Zx?MTYI#D^u+FCi-T1+|A`jb+a^*N;o>orP|)}2bx z*6B(y)^191)~ZVJ)~rei*3T4^tdA=uTdz<|vF=h#v(8aWxAs@eur^Z6vKCd$w*IM* zV|`B{*ZPn`zV!-)0_$FdLhBNRBI{^{VrwUbQfn=RGHYRla_b-R71n3uE3FsES6i3L z*I0YY*IFyd*IECRtGB)=*J!;`uF1MduGu<9uEp9+uGLyduFd+LY`gVo*$(TKvR&5g zvfb8cvOU(Wvc1--vVGR9vi;W2WF}Z2mzik2Qf88MkIZE2JeeuhK{8XV&19xpOUX>L z{x3b<`n2>6>lxBBt<$7uS(`}Dwq}u@V|`U>uJtmhdDfLu^Q?WO=36UDEwKJ3xzPHI zfK z>o4M~t#^vAv2GAwYwa$+&RR%(o%KDj_13G!Hdt4RZM60f+h{E=w#oX1=w|C(qFbzc zMYmWdif*+w72RgdExOJ6k;r!IT_W49CyDH^&Jo#Z?Jly@T3KY5HKWLG>qEl3t(%1R zSi1=CwPqLIYkgX1pY=qcebx~|`>hp(4p_euJYc<5@St^*;6dvE!9&*af`_d?2pqOP zByhxfs=yKJOo5};_5w$(#RZO8KjS}UJ)i%$btL}@Yf=6a)|dEBT2JIVX&uOS%36f) zl=ThX)7Eo&Pg|$*p0U>BJ!AcY=dATnp0n1IdCplU@tm_Z<~eW8#&h0!EB6KK1nvvg zeB2kT_j6seF6O#ut;u!C`Vr?P>v^1)tz$SZTg!4@v3|gD#d;~n73&<1tJbz0SFJ@j zu32Aazh>Rae%;!H{kruNwj0*d*lt*RvE8)(&wA5(JL^sBLe^W>daSps->}@aUdwXZ zx`5@jwHeDD>wnC5tWPlCwVuL!*E)&$uC)>KJ!@9xd)7CZ?pd#Ax^LaVbl*CO>Atls z(*tX1rU%x)7#~>QVtin|hw-8H0>+2dt&9(?^B5mlr!hXVj%Ivh9mM$9+Jo`2wGHEA zYkkHi){2Zztc4h#ShFxbwf@HN)cOU(Q|sFd&#Z4UJh#5i@Z9<$!wc(^3@@zrGrX|g z!tm01CBsYWxePC@Co;UUZe@67UBU3mI+Nj*bqvER>mY{L)*cM$<|(GO=3b`a=7y$U z&7@7Qo3WejHv4L_$n1$pkJ(j|3bSJ-X=Xc3Le18ixSK6Bu`-)(qG#4?qGHx!B5hV} zB5YP{!fTde!fpmSmp{(rpJ{~2Z_^-?pQb)0KTO?BzMDFld^fc*`EF`q^3&AVNq*=f56|;8ZduH{8KXz$hm78v?=<>tzTSw%Vwn+_#T+96i%CY}7M(`27WGET7Ntg77Fk9H770dX z7GXxV7CuJK7LG=q7G_5N7CJ^@7K%nO7Gg$87Cc6o7K}#u7T*j@EnXW|TRbpqvbbv4 zVR729&*FgL6pO8fvn*B_F0`0$xZGlj;aZDM!_5|ThC3~a4fk7Q7#_8VH9Tz*WO&iS z-SE1Fjp1DjL&L`wYKAW@qz&I&2pE2~U^V=0@ymeG^1T7OWm1UEGgJrpat7Wc%w`Gz+fMvKrn5C~lw55|lqNRmF znx(EmwxyCmfu)2&nI*45wI#DbgXJgvR?EBkU6v>GCs=OLpK3W@f0kvp{(Q@F{Uw&k z`YSE{_19Ti>uxkc}aD7ENk>0 zS!U`zw+z>NZRw)-!O}?Yi=~3zPfI?%zm|V=nXF#xvRU2K<+3`V%Wt(!SJ-N)uDI0{ zU1_UkT?MNmT@|ZDT@9-MT^%cXT>~q9T@x!gT?;EdT^p;vIu2HEb)2p4>bP5-)$z94 zr{iz6PAAxEzD}4`zfP1@gHD`Pp-!Szl1{2sh)#x;t4@xUnNGfyhEB1Sq)wR?w@#JS zZ|z#E``QgwhqYU*R%o|d^=fxn6>0ZbMQBg7veTYorJ_CEid%b@)hDfaRyVa4S{=|@ zVzokRxzz-%RaTW+YpoKsHduLSZMHJj+GZuAwbP1KYme1?&HYw4G!I!F(mZOlM)SDU zG|f|1jhbhzax^bkg==26a?-qNrKfqrN=oy#6`ST=t4|satnO<(vO1&j)M|&ubE~Bq zudF6(ys>J~cyE=b@zE+qQ);5tYt_W9C#XqU7pqBIhpWk2TdT=iE2t@2 zv#Kduzfx7TKCh~7y;W7ydbX;zb)%}Tb%v_GwZE#NwVA51wVbMnHJhrL^?MZy>+333 z)(2IrtyihoT2EH7x2{!ju+C6%vJO&lv9?ulwboE^w-#3Mu>P;?Wqn=Q$9lc8uXTsA zzjcywfVHi1khO$zu=N+EQ0ogyVb*Jv!mYcMBCRu&qO9GOVyxAbVy)Sf;;f%5CRm?P zOtfC9m~7pxm|~r$m}(uUm~L&Nm|-oUm}&h-AW7m9MZ~AYW-+B41_gC0}i=C|_g!L$22PqFlZ8D!B&h zX1PY|Sh*%^3%O=%VYwFT_p+_lr)Ar$SIBl)x65`~r^$9%yUBK2tI76Qv&;5czmVy( zJ|)v{y+&q&b-&C+>mr#+)?qS}t*vCHSj)>ywPul-W_?9^y7dC-8P>VdGpuc-XIgVh z&$7NPHQRcP)Ew)2skzp{QuC}eq~=-wm7H&VS#p8(YRQGx&610(VK-1)=MOoSvN^6w@#E;VeKHX(po`cr8T3(D(fTStF1f5*H{ONud$XAUu*qT zY@PK+vGvxqV(YDa#Wq;WiEXt0AiBx=kmx4sX`-90vqZO8+ly|o78TuU{Z?d~^-+;+ z*7HQRTbGOMunrR0VXY^!)0$gkr}ahQUDkcVyRH3%cUuby@3FoiwAXsR&|d3wp?%f{ zLi??M3GTN(CV0Slvfu&hM8SjBhJuHz83hknUlurQyp+1c)*1pwtr-N4 zT5sY%W}VJ|%vy>6xb;K66V{9PPFSb#owU~AJ8Auf_muT!-c#1qyr->Qcu!mN^PaK3 z&2z?jCC^#wN}jXUUOeZlWq8h6Kjc1d-NSv}+LHT%^-Hb`)^oTnS_g4mwC3WvWPOzL zl64d3C2J?n%hoKMm#t55T(R!wxMCf_an)Lh%e-?je9bkF)6(>?2@O!utonC@FgGTpZ}Wx8)I%=Eze6XOHxD~u1Uw=q7j zp2hgkx`FYbbsFPCYd^+^*6xgttZf+|SsOAwvQ}n%WG%}0*qV#+u{8tZ6YDPwPpn@u zJhi^d@YMPO!&B=c49~2OGd#CG!tmUBAHxglZ4580*D$=WUdZs$dMd+9>kfvO)>RBI zt#cV(Stl{PvJPi>W$njMY#wRqWo~b(VyvCF69n)5iH` zM~o}X_8B*tZ8z>R+h9D|Y^CvBvqi?s%w`*JFq>k$%dFS=|!RWO4aii7V<`+79vJ5 z7Mw;&7XJ-1EWQ}#S-dhVvAAzoZE?l0(c+|GyTyLPUW+Y;lPy*n&a{|sxWHnH;WCR( z!!;IlhMO#k4R=^%81A!(H9TSwWO&NL!|;NIt>HBbBf~ou>V}UjWDH+e2pYb#U^o0? z@yFno#Ycnx7S9Y=EpHoeTV5~_v^;7cX1U8i#&W%ZlI2nZb<0@>x|aP0MwTrG7M4{8 zc9!`D&X%bLo|aJtewG0SA(pNNk(Sm5ah3)KDVAymnU*pJd6t3(C6??4m6kvC>nxw@ zH(OrN@37pX-)p%-f0E^7{pptV`g1I^^%q)(>o2o()?aODpufRVMt`d%r~WR>Z+iPJ zAL$*oJg;}ca*y6w%T;=pET`*TvuxG7ZCRxEz%oJaiKU<3OG_KQx0YIZpDe}ozFD&B z{j&U```_}BF0<7|T@I@Qx;$3vbp@>E>55qO>PlMG=*n7U>nd7B>8e_J>1tY8>grl) z>Ka-}=$cw_=vrF+(6P08q2p+EL&w$XgpP;RP8}bsl{x`dvvfkNx^=>>YILHla&_XZ z;&hU%{B_c-9Cb3SjC69XRCEfg#B@rmICRRbzGzoj-O#SH+N<4YwNSgos!hAYDo4B9 zDp0%6%3OP*m7MleD;Dh;Rr&fzKo?A`Ocx6?m@y04!9N%IZAUEb4sLPt^pi zkE;n=uT&GY?okuBE>M%S4pEb~wosF`mQ|CtW>QnMey*x)eO6V~db6s!^(<9Q>jqVA z>vUCJYd=+eYco{?YdKXTYc^FA>vt+<*4I_ctq-VJTCY;Eww|nFYh9;eXPu$qU>&UD zWNoM7Y^|x{YAvGTX3e1DVSQ8C%X*`-w{^F&uXU=jpS8VmfVGrzp!HX!VCzdtA=c}a zLalq1!mYEFBCI`?qO3KPqOCcUVy#~&##x_KjJIB;m}uRjm}H%=m~0)Sm}+gRm}V`h zm~Q<~A=CP?LYDOjg>37!3OUx374odB6!NVT6$-396bh~N6^g9I6-ulb6iTfx$(LC# zkuSHdl&`S%m9Ml`manq@DOYWML9W(%g)EsMlskzoH zQuC~DNzS+4C^_G{Q*wcIlH@{b8_7l1;*yK4KS?aMJ}n@39))^AZt=%P- zTWd(Hu;!3hX?;a}mGunqRn~FhtF2YV*I2(3TVuUbY^`;h*gES_vGvv}V(YEHif*tz zCc4pjw&*770?|#@Zlas5Wkt7Ge-+tceNJSn^>UGI){P?DtYbvBTU&_iuoe~BVf{>a zr}bjtUDip$yR4OjcUwOZ+HJjDXpeQF&|Yh6p}p4ZLi?<*2=2FDD7fFcK=6RIgWv&c zLBWI8j|C1{Zx=XZ-7Rp~I#J-TwS~YDYXN~H)|dH@TDS8bwYK9wX8oP-xb-H!ng4b)<#?xt>187v|hn^$vU0$lC=isW$QN_m#sH)T(+*{ zxMJ>{qS-v0by?$#%`Ug6+Ds8QXR1FRVALH?iKZE@ZuFZNz%h z`U}e~>m4k&tm{~AS-Y~_w&r8GZGDsZj`cF;JJzMlcdXr*?^;VR-?e_rbl3VY(>?3i zO!urynC@8zFx|J-Wx8+8&2-=THRFBjvy2a{H!wc1p2GORx{C3Ebt2;fYY)Z;)`pA^ ztu+}RS}QU>vKD82WX;X^$oenCW9ttLkF6guJh8sU@WlEo!&B?S3{S0hGCZ~3!tl&` z8^d$!O$^ViS2H}fUc~UidK$wE>kft&*0l^Tt&135T4yl4w2ozXWgX1WVD4ucZfrO!&+UO?b_8O!&;yP58`| zO$5y3Oa#rOOhnAYOvKHEOr*^COytbCOq9&nOw`PnOtj7Z85^2?H#Rf-U~FUd%GlZL zv9YJw9peDAtH$AG=ZxdcjvJ?$9Wc%_+htsCw%NGeY>jb;*;3;PX7h|^nawa>Y&Ow& zjairRHnV2q17ubAZ;-!n@!eqk18{Mjtb_^+9tF^9REv9P(lv7EWNv8K6! zv5C2+v4gpyvA4N|ak#mFagsTQah^GYah3UZqgL~GMib4S8qGDoW33^ zYz@y_7#Uu*P&d47A#3=+Ldfu$1-s!Ji@ye+EIt|huy}6p&*H8Dv*jfNPRrv4{FZwR zL@hTNNLem7P_Ue1plUhEK-;q2z|gYBz|6A9z{WD&z|k_+z}+&)z{k?VAkfmzAl%Z} zAjVSDAjwkRAl*{bAjgu+pwN=Rpxp9}evRb~{YJ|p`fZjQ^t&zR=ufb0*Pm)xtUt># zL4UrbkNy%%3;mUrs`~3J1@$*u{?prT`C4y}fTZwB=viher)#|C%468F* zv#qvh&9j=Vwa}_rYpGR^)(Wc-t<_exTI;OTwKiG_Xl=3jrMcbeiRLb=bDDdsc53do zTC91Tji*+<8qck&HC|a|YP_)u*LZK`s`1gvMB}rSlEybHL5&|)j2geJ9;pAd+OPiK zYQ8$7b-g;Xb-X&8wY@rrwSqdAHIq7z^!WG{)+^M6th?1jtn<{wtOL~~tWDLV zt)Y`sxc)q1+Bx^>iakSP{akds!aj|ApakIXq>|woG z+0(jL+1ol@*~i*Z+0R-=+28tyQlRw}r6B8#N+H&LN}<*{N@3RCN)gstN|DxFO3~J@ z6l1JUE5=%{QH;0lQ%tZfP)xKAR!p`wS4^>%QcSh}uaIv2L?OfaltQNUdWCH3X$m>k zH43@b$qISaUJ3=)Mhb=2QVK=Z%nHTUH{?sKSId`L*U6Vz2gz4htIJnf|COtc^$I!><6+Cr}0T3D{Z`n_zE^;y|w>(#O?)?Ko#)|s+x)*iC$)*7-M)*P~( z)-PqctWV2yTd$Srv7R8)Yh5bSXB{ciZ*3$TETtZSsFT6;@R zvzC^gZv94ThV@>lnbs4eW?835&9=6Xnq$o?HOKm~joS*jj6Cv31seMb}%O7hP|?NOXgBndnAqZ_$m`ilUpWe~E0i zzAUoEdY#A?>kg5v)+r*}tQ|$RS<8uRxBel#!+NXm4(n3koz|wpyR5$p?Xuo2wA;Et zXpgnK&>m|6p}p331ov967TjlDEx6y>M{vKjoZtcLj{*m+j|v>Lo+WU|x{qO3uwS*dV!vvA zpY57;C)+h^Q?~2Ye^{?uA7Z_3-Nt&u+MD%;wE*i)>#Hm`t>>`ZvQA;SWv$0@%laqt zZR=yqx2>l#-?2_*zGH39e8-xb`L6Xtrn}ZVnC@CnWV&aa&2-P&o#~#nD$_k{7N+~w zPZ;l8A7i|4y^`_1bsyt>>te?H)=`WPteqJjSnD!Au$EwaXf43_(3+F+ku?M3BkL~= zkF8%YJhr~g@Ywns!xQTR3{R{#Gd!_g$?(*AA;VMaB@EB37c)Gwp2P6WdNRXv>u!b@ z){P7=tjif*Sm!dlv`%7pX&u4PWA1F4Y_4T$XD)0iYyRKlzu9Y($7Z)oPMMuD*fn0+ zkFkN-S7TGNx5idx&y4NO?i;(B-8A+#yJQ?>cG@_??1*u^**@bmv+c%tW*dyl%vKuL znJqGIGn;MPXEw!nx>=v`0<$*bm1Ygbo6IVW_m~wKA2rK1K5v#{eA6t(__0~2@mn)r z(^Uu*Ke_0tlw$buis}`qd(a)Lw|;4i2htlNBu>Xy86p3rSw-@vg>cK{H(Xt@`2ti z%X51BEO+Z2wp^ii!g8A48Ovt9iD?2r2EhEpe~cu23>Zm`MTUzeY*TswYtJqxw_(3vAQx=KDr84Ho7WSI=UKG zGP*ieJh}!}e{@W&-s)Ib-PN(NI;UfAwNJ;{YQ2uT)qEXqs|h-OR*gDARz*5tR>?Y% zR-rnvR&F{8Ru(!bR$4k4Rx&!-R(v}7Rt!2tR!_A{txjoITCLZvv6`w~Z&jt;Y?Ywh zX635gX{D{*V|E`+_E~Tao1|S#sjN48jq~HG@e?OYdp6~(|BbSqVdMcS>v6R zp~gom1&z;E{2Je^{;L15x}*NfYLEI~tJ&)Rt*X@-tz*=gt!>mx4?tpBTVSwB?c zu|BNEXT3~Kz`9dS$T~+zDt%-Tdv!dgO2%KERWjP)Z`IqMUu3fAjXm8_?#s#w>k zs#zziYFK-#YFQhr>R8LD>RGd>>RZ26F|@v>Vr+dt#ngJGin;Y<6$|TH6)Wou6&ved z6G+ zq7-C3Q7PCuUn$huS1HU|M=9KzM=8?!jbfDbS;ZLZb&9dp6BOgDixd;ALlqOPEfkZi zWfW7a85L8lpDLtTpH@h>-l&jiJzXKox=tb6I#nUp+E*dZ+EgLmT2`UJnoXh5`ks8T z^#=J8>lXP^>j?QWYhC$rYi9Wh>zi_w)*IxitUKkZt&`+xt!?D$ti|Q(tv|^&Sf7(^ zv|cUSWZfy-Y@H$7V(lT@YON{TX3ZtrZv9%O!}_dDr}cW7F6&7$-PUC?J=T#jz1DUz z{njcn6Rf#pCR#s|o@Bj2da`xB^b~7<>8aKV(o?NJN=>sqEH&MFy3`EoY^j;n_ENK~ zMWtq2zm}Y1eMoYy^(@J`*2R+ZtbHZtTdPYhux656Xnjv&q4jQwMbA`lGrNid19-rv&7a|TZpZ-W*1v) zeO+{&^$OAT)-|H*t%F22SZj)Iv}O?9WPL+qll4ZC&DK34TdXrhwphD~Y_(Pq*=Efw zvd#L4@OJAK;T_hl!aJ-vgm+q>5!z)vNobdKq|k0_C80gmZv^*PZx`Ha-6FWxI#_U@ zwYuPb>)!(VtuF{1uwEu`(7Hz8pmm7AA!}WML)L7dwE_G`tSkACSR3&lwSLQY)Or=) zG3!jeW7e8{$F1M+9=G1Wd&0V$_k^`Q?@4P;-jmihc}`ic<~eO$&vV*3nCFbO2G1Gm zzuaf7S971Wj^RFM&Ch+#`Uux~>uRp^)}~w+tUq#IuwKu3(K?^=qO~FCMeA=Im#p`2 zT(WNExNPmuaoJji{qNM*{@n3WV>pe!*98P@C89jw=_Ls@TF zE3n?Me#LUbdJD@<>w1=()?O^Pti@PvSwCUEWxbjCwskY}ZR=3xJJy=acdY+0-LbyH zbjNxP(_QN}rn}aOOn0sAnC@E3Fx|8M!+6j74&y!ReT?_47ct(mZfCr2oyU0JI+XFg zwH@OFYfZ)n)*_4#tQi;|TK{5rX#IuZk@YKvN7fG*9$Q~wcx-)~;j#5DhR4=x8J<|r zXLw>gk>QDT55rUI2@KDy`x%~DcQHJ-Zf1CHUB&Rix{%?8bvnaK>llU^<`$*}<_f0X z=3J&)=3h;C%paM2FuQ1S!|b5RL9Hj24;iGg@c9)o7>r8l$7; zi;OOs&osJYKEddPdArdU^Ex92ixML?i)Y^7HWQ@YjMP|*kYGqrNsur zdW&U-troKlyDcUfPPAw40l`D8XmMTHaupb zVR*(u&hV0ju;C30PQ!Z^{|ug3d@*=w@zUVE#eIXX7FP^@TbwdrusmSEX1UdX$8xoS zpydJsam#52GM3#2N|ucV>XzjOx|TTxMwUqi7M9@#wwAsI&X&#w9+s8{zLt6h!Imlp z5tdR0v6cb`$(C#e8J55Fb1k3g7g=7?FSp#MUt_sSzsYjCe!FF}evf6o{zS_d{i&9o z`m-!e_2*kE=`XS5*I#M*M{k|wOTEpO*Yvhq9@g7qxl!++EUWa+Tc+z> zwhYy~Vd<=Q$I?jep{0V}Q%iomSC)Tu-&wxV{cL$#_q*jO-QSiwbs4Ny=(1Q%*X6Kk z)8(-$(-pKz)fKf0)s?hz)s?j})m5}o)m60;)77+M)77>5rekRJT*uVvx{jsQ2_0Lj zojQ(ID|K9~X6blXb?f+8)#~_L<>>@l#p{Gy1?WUsIqAe%ndl^1sp+IzN$6x)ap~k( z{nXC4x~E-iby&O1YK3;CRiAdPRk3!1Rit*am4kM>m6~>!6_0kW)n}~nS@-+`xMQa|la??CvWu$r9N?!A<6}RREtM3|@t)6IHwYsQr!)l+#EvwZU zcdce>+_!4ecw|+g@x&@g&0q()@^D6)>&#o)_!Ut)<$Y# z*5Yas)_+u`tRJe%SRYrFvtFaBU_Dt?$+}Wi#X3<{&Dv8{-P%x9(^^VZ+nPyL*ZPf$ zzV%fVL+kx2#?~uUOsprXm|54VSXgJMSXl?FSX}uVo>~5W@>|yPq>}9Q>>}~x=$=CX(lArZ9r2y;6N`cmeO2O6vN+H(zN}<;LO5xV; z6(g+AD@IvwP>i;oq!?pesu*V-p%`y%t(agfub5=bte9;5Tp`8!j6$0ACWUnCnF<-! z^$MBRX$slaehN9(W(v91@(Ov@90~>2kK_xjx5^h;cgh!A$H|vi8_SnkbIO-n-Z-7i;Voi0~x?I>4cEiG4T{av=s`m$`j^?KO`>t5ML>ulL3Yfsr`Yfae}Yfjl# z>(?@E)@NlptT)JXT2GPbvM!hDwvLhMv38K@wN{nsv*woRw|*==!FrSQMC(TBN!EeV zldTn{r&xcHnreMqYMS+Isp;1FQq!$nrDj-5OU<%$TYtrtoxvaXj{WF055*xF8FiM71MQfmf@rPfEpmsxj;FSqs= zUtujSzQX!}*h=fwVympn#8z25i>aNOZ0BX3@3QZKCU}qeRzR>xr(nW)o|df z*5(2St%U>*S>NJ6WIc)hu(db;5o>n-Bi2Xwj#@YK9kq7hJ7&$scg*@U?{VviyvMC0 zc~4j?@t&}L$8*wpH_u7yPM%ZN(LATEjd)I5bMc(9KE{2&IN@tY>qb zvkv7tZ!O4m-ugV}1?vf%7p#LgFItOnUbMc$amjiK$0h4Lj!V{79G9&*I4)anV83D= z%znlCC)-u)#cWrt1K6%wGq7E=-pqQvt^It@pFsup6_~tQ#5cTW2udw+>*uZ*9f+z*>dzfi*wl1M5Ew53FA@ zJhXns@X-1`!z1f!43Df&Gd!~1&+yoKBg13s#SD+Fr!zdZ?q+ym-OTXBx`pAXbrZug z>jrTB|J=Hm;e~Y;!wc(ph9%~DrZwhbrV-{0rsn2vOeD>3n*238Ve-^$hsk-fRVKU4 z=9sK7>o=Kh)?(6WR%udgmT!`8mTHn>7Gn}^7Ge@)=40Y*=3?S%W@}<^W@ch-W?*7& zre$Jcreb1bCU0V3CTXH?CSsy*CSam(#%*F?#%5w@#$;k__Q%-N?2EC5*&AbPvnR&( zW_OI8&8`@`o1HcGF*|A;XtvKd%xt@HjM)a`B(qhK^vb-#=$m=I5u-(#5t~Jf z5syW%k&uO_k%WbVk(`COk&1<`k(Pyuk%5J@k(q^{k&Ok1k(0$gLl28DhJF^W3_~m) z8b(=MH%zcNYnWzn$S}uZhhdS$I>QQ!C5CktvkY4-`VG4*S`8;yR2xpSC^Vd7k!HBa zBF1oqMWEq23wOgU7Pf}FEQ}5JTWA;_wU9GBZ6RWK(SpIQ+9vIb$6!UoZnoCXP&|Mk->U+ZUE-q0_wJfdG} zxlzB$a-M#@WtV=7Wx0N*WwL&sWq|%2FufW zTP=6$?Xp~^x6g8l-eJooy%UxNdS@)-^e$TZ=v}q6(z|7;p?A+xT<@_Zo8EKFFS>6m zAM1XwyrlcZ@{sON%Z<8!Ef?rAT20Vpv#QtSvdY)xvx?Idvhvdvv$E5bveMI)vy#(Q zvf|fOv-+>2W%WTv&+37Wk<~>VGpj>7R#uyJ?5vjPI9W~AakXmG@wBSY@wLj-3ABpV z39<6giLkQMiMBG(iMLYJNwN~rNwZ?p$+Y^YoojVXyTEF1i#q z64zR3#h|su>Xqg?t1Frtt@dkfv0ACQ-D-;FE~|RYy;fP82du(04_P^B9<|cbJYglJ zdCH1i^Q_fpjSE%}G%i`4)wpW4OXG&s3XNMYP{ANYW&tdYJ%1VY9iL6YGT&ER3)q*s7hHMRh710ttx9hNmbsu zLRHZ^URBxJT~*auUsc^&TvgMWK~>xOm5Q$QWfeW^y($LQ%TmG- z2dP+E+o@PvYpU2-i>laJGpaaP-%)n7-lptqJwe&kI!oEj+Ev-ZT0z;<`md6=^(`eI z>+MQ@)>D=It&5cct%H<;tPPbytOb=qtv@P;Szl6&u->c~X+2dj%DP-J#yV0l*4kDv z&RS71!J1Vu(fXA_lJ$9o6zi=Dsn)X<(ySX5(ycQTGOYs?vaBr>vaJ;qa;!NO@~of9 z=UeZTFR<>FFSJgQFSfRjFR|v6FSULuS7yCOuH1U6T!nS6T&1{w6iq`lQqp>$y@>tqY~5S-VS3 zx0aKdVf|HdhV@y=nbylBXIVE$&bE${oMUY&IoDcHa-Q{DiTT#2B<5SMkXT^dF0s%$ zO=6L?o5W&kHHpR691=^cuZSyKh9tapp8v~Cw$X&o%K%34Wm zwe?5Q)z$|^*H}*$U2B~ty4KoCbe%Q7=z8m?BI~X9ifpi+CbH4GNMxh6zsM$QU6IY! z+#*}7uLy6ko+7-}I#hU@wUqES>xV+ytyc=|ur3nXVQnk4)0#tQm-Q9FUDk^PcUu<< z?y+_h++!^yxYzoLz+USe0{g6c1@>Df3+%VH6*yomDR9vGHUB~DCH#l16Zj8V%kUqz zzQuRMdKTXi>uA2C)^dDDtsnCqvtG%2%({^GxV1I!acef-6V{h`PFOGGIcZ(UbJE(0 z=ajW5&nfH6+^4NOxzAWTa-XsO#dX$t3)fle0t7rftq*ZrwC>@!WF5hA$y$};lJzV0%huiOm#q!iuUOw?yJFqScGcR1?W*-N)~nXD zS+7|KvtG02W4&g5n&rB6AIo*?RF)goRxCHH`B-jRKV-gXy_NZp13H*2c`Y zthtzPSwCdDZM}=>w)GUI+tvk4x2=7c?pSLx-Ld9kx?}yC@vik*#=F)V8Shz7W4vcw z!+6g+neo20H{*S46UO`2@{ISbxfmZ`WO#0!&G6hho?(NzvT27o zw`q#`Hxp;`M<#0K7fiU#_nUk&+hB6XY@x|F&8TXi#8&5GSFrICeX}s7h$#}I{jPVw;P~$yj ze#S@5+>OtfIT&9zvowBSW@P-zOxyUgnX>U;GZ|xcb5Uafb6#U9b5>(j^S?&==HHAg z&EFZhm_IY}GrwmPX@1=(#r%R%zWE8GD)R$It>!z7CYo zEyWB%EO`tfEtw4BEI;ZeTi(^rv^=GsXSrR!*m8+}h2;eOTFYAfCd(}ScFS=69!nSf ziI#@?(=6rmXIpaXFR=Wnx5V<9-b%|Wdh09?>TR}MueaTDj@};2F1-Vm6?#W4)AUYR zhUlHMbke(QX{dMIQeN+lC7<2{%fGr$Enn-tw7jkR*7B6@C(E6>-z-mkr(s>a{DZQnjnCytV7BjIXAUTAe&o!9EK z+O9RxYQEMKt9GsFR{2`9tirYCS~+Mfu+r38Y$c?%%<7NkN~>p@YpgD4uD9Byxyfp& z<`%1d&Fxmzn!BvhH1}EsX&$h$)jVXSrFqm!O!I^lv*u~54;p8!?r2=FI;C;RYP-f& ztECz@tR`vPvTD${Yn7*Q-zrAqk(IZ`6Dv!NXI2^-FRdgrUR$wiyt8_z{=w?3`X{Tk z>R+w;)W2KhtN*kLQ2%3PsQ%ANSe?Q8s~VH_4K)_)-D>RC^VB%4o7A|iQ`LB_z0~-v z_0$Bdh1G*p$3))!TDtaq#ESua&Fu%4h|XkD#hY@McJY8|LzZf&b#VXdiRWi6^=W6h{yXMIQ6 z-g=v|qxA%3C+low7i%|VH)|zjck6#jp4PXOysUR9`B+a=^0h8e^0y9F3a~a-3bGbf z3by{N7-D@zG0b|aVz~8m#YpQa#VG3-#b|4L#aL@)#W-tr#dzyC3W?Si6_TvCD-k_A)jl#M?TMbf_%PpntY+PjeL={kbJTA zOSuy3gL0+Tv*gOGi{&b;edH>w)#a+JndGXi@5*+FW)>Sg?)^Rc&)=n~=)*3Qh)_gME)-R=dthY<|TDM8} zS%*pYTdPY?u>L7E(fYL1B-77KQI!9uGwXeiNYh8&&*8CEStsjXmwq7B= z#5zxWskNE-GHV9$<<_UfmRnB~TVb6nw$j>AY^61W*edIbqN}YJiLSOT6vjAGt#kMfT5IzkvVP5X$a)RmVe5RpBi6=zN34JF9<|=j zd(^s}_n37c?=fo`-s9FUd5&9e=Q&~B&U4Z_lINtgHqR;R|Jqf4#){b0ft(m#bSs&#*XWhwp-rA4zytOFj1?zhp7pzxsT(mCXxM=OjamiYM zRW&UVFGg6)d+8P==TO{`a~ZCI~a|6sXhy`ANnbtTJn zYg?A<)&eZotzR+Uus+Ou!+I9;4eLVYo7SGpH?0+zZ(9Fkx@moh>6Y~xrd!q>Ot-C5 zm~LA;G2OOSWV&O`#B|5{G2>n9V~lsLS25nT?q|GbUCMaRI+pRCwJYO2YkkK1){>0( ztyviFTYqG@Z+(~HzV&H_2iAue9$4>Vcxb(y;i2_9hDX**7#>;AWO!`d$MD#?nc=Z@ z1;Z2TDu$=lWeiWP^BJC5r!zdWj$zniE@3*=oYAz<{EbO~`Arie^W!Gs=G#pEn=Lna zX*Sd3idnbGA+vguO=cw~i_J1krkcf@bee^l)S3C1l$g1gWSiNTq?nnS#G2`ugqx|G z1e+xSMgAxSFw=xSBDTxSD-8b~Srv>}K}V*u(6Ov6tBuV;{3K z#{OnUjDyVf7>Ai{F^)1@V;pC;)HvB}o^giRbmLsJ3C6`{oyL`BO~&jHZ|`Fq&^Z!)TTH1f#9y?M4U8>y6Hsml<6*&og>to?`UQJlg1|d5{s4 zg{KjRg@X~Fg}ITig`Sb5g^H29g|v~Xg^-c91&5KL#eYLHi*JTD7HcV+ITi~Hi!7!YmRs}~)>dcG(2hX-{8E(SA#1SuMKWlJT!P< zaoyml#aV;b7KaT!SnM$PX0guTkHr!LM$1_S?3NP@cr4otge+?e#4U>qWGyoclq};6 zG%Q05bS=FMj4T}tEG*3oY%O&RoGg_L+$|*xd@cD5f-G4L!Y#k)$5=knPqaL*pJus7 zKgV*VexcnF{Vq!j{eDYT{VA5h`ZFvU^ygZ>)mvnFTW`7L zNxjvU+w?YAF45a+IZ1D)WrN;6%RIfqmN9zAExq;5SX$~`u+-4IYAL37(~?#1p5+(a zN0yIupIKhgeQkMA_r2vt-OrW_bbnY*(EVdsughSSughYUpv!3$pv!CJpetx)pet&n zpet!5s4Hv5sHe6wrs?l+=%GL3( zir4YB3e@qpa@Gm5GSvyQQrC&HlGKT{;?_yD`lFp<^-w$A>X>%6)f(+QtBKl0R^{5I zR&m-DRxaArR@&P2RzliMR=>1btsZK1Se?}BvD&EBZ#7eEl2xPDRI4nl8CJnsv#qSP z=2@v~Ewtj(T4MEGbD7mc&6QTCHP={e(_C-0Ky#B-x8_!>GR^H)Nt(N?d^Pu4S!y1z zQq??UC8T-O>Yv65tJfN*t!`?ZwK}G8!D@@fC98!RSFQRrZdlc7+_K8nxN8-qao@^A zZ2Ni^%XTH>+NbR*0a>utn1V`tdrEZtliakt##D+tp(Ktt-q-XTi;O?wLYXOZoNWP z(z;(&+PX|t);d;I&e~N~!CF^U$y!uZ#rmI$n)P!P4eJXkTGl&Nw5=Db=vw!w=v!B+ z7+R;O7+VLZm{?n@m|1J6SXhgwSXncwSXDtllme~4Dh63!Qw*`*t{7@PQ!(7SMlr%V zUNO?zNio`5O)vFj=>p;13YaO`? zYj(Lx>&LQH*863vt>?(rSXar`T1Uv%S)0q&TZ_v!Sbvvkw7xFWWW7_S*?Nvli*>zB zt96o0o3)!vyS27VhqZuAr}Z1@F6&*=-PWDbJ=T%Zz1CXNeb#@Z`mN7NO|V`hHPO0U zYLc~&)MRUAsVUaKC8t_nk(_3|R&u&^yW|Y(B*~f9wvw}~B_(HBf0LMPeOY3T^(KkA z))OV>SrxizgW)fX%eN$we^+u6()?Fg&ty4rc zSlf$iu$C6tX#HMzqxEXxP1f1Mo2~VPw^)A?+G4#!XsdO-&{k`Ap>5WJLfftH32wJu zE4ahDUT~*%px`cRRl!}>KLvJMpA*<)y+mM-b+y1=>tKPs*4hI5tXT#2TOZ`#Z(YfM zz}krafb}Q7gVx*l4p~?89kO=hJ8aFtcf|Sv?-A>nyhp85c#m2e@E)`N%X7^749{`v zIXuU$b9qi!JMf&e7U4N*eVO}|btCsFYeVkS){nVPThHV=V;#VC#+r}oto0Snv(~dX z&sisNp0n2GJa7Gly4~etg~3JTC1{NwSLTU)p{|@HS08%Yt}j}*Q`G?U$Z{QeBF8h^L6VQ z=Ihqs%r~qJnQvJ0FyFL(&UDlI5YtWTc}%ygtC?5^EwqUw#Ex~l#`X}QZ>)VWX ztoJeAv0lV@*Sdr8u5}*cUF$H$d)9W0_pH?!?^z2n-n0J0aL@WB!+q=P4EL>%F+8x| z#_+&;E5k$U^$ZWKSAfR=9$8Oecx2tl@YuSJ;jwiw!xQT=h9}mA3{S1o7@k^3Fq|;w zGhJx@-K5t1kx8uic@ul{eI_dAYfX5}=b3ynn_%+Ltl8weS-HtRvuu;~W{Dp8#Y_y8g^JD8}?a58cwnBH=JeRYPi6{+Hk3bq2X!^b;FGovWD9&gbnvt za2g)6_-}B+;;X?~i`NF1Egl-&w770?&*H4X6N|$JuPk;Nyti0y@YQ0e!7q#11`L)H z4OlJP4Y)094FoJp48$z645Td+3=}QH4Ad-r474qs3=AzT49qO`4XiCy4IC_`4csgR z4ZJPc4FW9x=!aUq(2ugbsvmE8P(Q_Toqnd}Z2f%84*e3#GW|-+Wc@nJK>cP*JN3$+AOlyJeZ)9?KNH1D3&h zM=c%oPFfo1owJnFyJX3$cir-j?rqE0y7w(_={~VMsr$lmr|uie6}lfSXXt*lY}fs1 zS+4unGF_L+Dnggd%0rjS%0idVN>f+JN>W$Mic43@>bH)Z)oUFkt2;VsR%dmztoG^X zS*_PGvRbHPW;I#I%Bn@j)~Za$(JDj7)hbHI)5=H3$I4D8z{)@;*h)z!+)7j@%8Fel z&gzSHqSa09RIB~k8CFZQbF8|w^Q{WBi>$)6%dBj*E3H(tYpl4n>#aU(HCx@*YO^}5 z)oHa_tH)}xR=-t^)+DP`t*KUiS~IN7wPsr>Xw9?Y(pqTsS#yciUCrfI$2C`3ZPHw8 zHAi#3RlDXUt0K*s z#s#Z+8kekkG_G1zXtYU8cU)j?7 zrn0s57G)djeq}rBY-I;)H)Tg_Wo2h;24xrPyGm}>yOlhwXDWGGmn(T&hbj43n<@EP ziz)eAe^(5!zOEQ#y;CvRdbVPyb**BUb%J8JwToh;wT5DpHIHJn^+$zR>uU;e)_WA< ztrsaIT6ZWUS?4PxTZbv6SlcP2S*t6gTMH;;Sbvhwv_2}IZ9PLi$2wO&*V;)w&ssu0 z-}=2=f%S2@BI^Zm#nx4FCDx&GrPc;=W!Bts<<`$-E3J>nR#`8Ut+uY0t+9@it+lq5 zt+SSqt+)Ow(_np9rqO!8Oq2COnP%%|nHKAGnO19WnKo;EnRaVYnGWl((w)`^rMs;A zq`R$Sq`R$krF*RZOZ8e`lIpWwCe?3UEj7V9Kx(43n$#rgzmk)!uS!m_UMD%#x>ItR zb&BM4YX`|0*0Pc_t$#_(vc4fP%X*u{Z0o5KbF51x=30kJ%(FI=m~Sm9vB3Jf_yX&F z;tQ?Y#1~oni!Zj86klTfL~M!m2C=2qwPMSxeZ-bqON%YHej~cVdY|Y@>j|Q(tW!i+ zSzC&(w&oXIWBp8IjrBf}wbs)`)>#*dth4qJS#PZ&vcZ}~WP|ll;f>Z!!kereg*RC< z3U9VPDzwGAS7?iMn9x>hMWJohZv?kl?-1N>-6pu*I#h6nwVL2g>t6yptuG4fvR)yu z+qywuw{@hz9&2NPz1DmJd#x|?@3ZdV-*4^4zu%gf|A6&Dz5~{cdmZ)v*6KVbtbcN!v|h%2(mI^` zlr<;!DeHY)r>#r5PFw49owk0>dB%Dr=Nap4&a>9$oad}rIL}#M)c1 zdyWg%0vs2tkFj60&SSr5Ey;e#`WV|K>oT^>)|zaWt?#j3ww}g%#X6AniZvhW73;Gs zSFQV5u387PT(y>BxoZ80`Kt9==4;kf%-5`=n6Fz~F<-ZqWWHhjo#}@46{efk8<}oe z_cPtJ&SSb|?aOq_T9@gzH80a`>-UVetuHa&vEIsf$9fjy9qW3=JJxB8cddOH?^>HO z-nEuzyl2hDc+dJf!#(RK4EL=sGu*d6#BkqwGs6Sx)eH};S1>%ZUdZs!dM3jo>wbnu z)-4Q=tt%NGTjw)8wk}|JVx7wH#5#)MiaE3CTJyIio#r=9GR=>f_?T}sF*ILlB56L& zgxS2qr(7=1FgH~MRCX2fEl zYs6`xV#IGDZ6sZSRU7pwcMhgWVuj3 z-Lg+V$Ff?#&@w~6%rZ>B+R{b8!O~E_)ly!+%aT{W-}1NK6w8--GcB*{&9ywLx5#p{ z-g3)@daEt_^)^`6>20;l(c5VmrMJ)0Q}2+ah2C*XHNDf8qIwrBS@f=0e%8Hd`AGM! zlj=0=$Kp8=~!D8=-62$={Q-1 z=(t(A>v&pO>iAk|>jYZK>4aDb=tNjC>qJ|<){eKjsGVfBT|3Qcu6CwXvv!VErgni< zfOfH!nRc0#tahapt9Gr`8?6SbD_YG~d$iiDmS}Za^=kE4m1#||ir1QK<)Jmr%1CRb zm9*9zD^{)fR_`?zTHVxKVs%(^xz#$&RaP@J*IG4eZm`PN++-D{xz);5bBC3Y=58xF z&AnD!ng^`DYaF(EqH)yfqQ(iUeHy2%)@Yoynx%2Uszc+FRhh0>e>OZVr zs{OV)qxRQoz1n}P$!d(&m4fU){9g$t$S6ptjkq& ztdmsqtbJ7stSwaxtyNWwtp!y~t^X*SSzlMSu->R_W!^;4X#HQw z$@;F6i}h|LSL>Nd?$#Ab9@gPXUe@MH-qsRIzSch!{j6^)23YS_478rB7;Igy7-F5I z7;5dN7;dep7-7w)7-{`kA=>(eLX7o3g;?t)3h~z63JKOl3W?T{3dz=v3Mtl_3aQqD z3Tf8gK%4b^7mCv#+lFznwm(Q`5mCv*OBA0J{TCTu)iCm#|tz40HxLmQdkz9#2 zpIn*sYuR$^6S5W7OJysqTV$)OlVq!{on&jQ6=iF!nPls%AIsERACYOWUMACM-6_*# zog>q1?Jv_}Z6ecZEh*Dx{a3o(`jm8s^$h7w>on;uYg6fNYc}Z~>+4dz)+?p@tm~xu ztwW?HSZhg5v}Tf;Xnjj^lJzFZ$<{rRQ>@b@r&>EoPP3MioNoO`Vutl?iJ8{BBxYI9 zl$dQ@DKXnRN@9++wZvR&S&4bp|HbE99~EC<-7CJpI!t__wW9bU>$hTyt#^tov2GVz zVjU*7)LKn!ne}(k<<=)fS6I&xU141yy3*QJbd|M?=ql^aBCD-Wi>$F;BC^)HR%ESp zgvdH;6Or}Sf+Fj!?+S0Qo+Z4&I#PI}wUqEC>pMc5tmg}DwoVn=Vy!E*#rmhv_yq zt#g>KS=%sQvzBDOZvB_(y7hgg8`k@oZdlJ}x@ld{bkjPX>87>?qqmmUB~dqx`^SCbtc1O>okTZ*6|GY&3~Hg zG=FR|&HTJcnfYFm2=g^2cIIq5c{IQXc`5hx^^Q%Ux=I4y`%#RycnC~}oG~Z$5 zZN9-M)O>|ey!is7O!JvW#pV-@YRx;1I?S7lCYe_m%{4DJT4A1Tw8=c#Xs>y+(FyZl zqs!)AM)%B}j9!{s8GSJ~H2QC@X~b%wV8mr1ZX{sAXC!LDY9wv($57GYv!R;BD?=TN zhlWNL*A2}r&KcTT95r;d*kkBnvDwhiVwGWt#X`dP8eFqDVsOV|m%&4e4F=CGmKnUUm}~IKVzR+^i%x^T77YeW zmSqMUmN^EzmPrOemXQV$mi`8^mTm^hmNo_&mPQ7;mYN1emhuJ`mSP6BmOKVdmdpn3 zmY?)}Ebr?FTAtAlv)rX0ZMj@O!E%azs%4{omSvuPzGbw2iKVB0rKP!kou#UNv!$?p zhb5zaujPBaNtSo@rdgiWn{ByEZ-M0sy``4Z^;TN8>aDXZ*4t#6q_^ENKySCDz1{&! zJ-wrrvU(>idGyX&{?@%@`AYYim%V{O0%WK80D`@pcN7U-Aj-=H+9a*dMI*L{YbyTf3>1bLl z*3q$=s$*c)u47_Vp<`i{rDJUsqhoL7uj6dxsN-&Btm9>+rsHQNsS{+ytrKeXS3A<` zv388r3GD={_1ei+Q?=8qs^(Gu4!1C7I0=QNI5?bbM9wL;^R z)ijN>R;?Nrtco=*StV&)wF=OTj)L)!$p$tADgoRR3bdtp3gFnc5GllWM=L)~NllnxOXIszi;^Izo-v+E$I# zT1k!FnnR7#`kgAb^%YfK>)opS)(ceytvghOtqW8|ts_*$tsPV)tu<7otp!zOt$(S= zTR&D&v_7k%WW8NQ#d@KNnstwghIN^WmUWVfj2L?PZfS|QQeSs}?dWCGcb-QeZb((CYwVP~} zwVG_THJfa$^>djz>yt9|)~jV2tovjdtqWzEtV3m*tu19*tmR}{t(j$7tuINpSp$1)(PSZthK}!Sbr5;Xnjy@k#(QgV(U1uCDwXkORO2hmResHU1q&Zbh&l4=nCrq z(G}KeqARWciLA1|CbG(Uy~t|oPLVa%DI#mF9Yoez%ZjYC{wloQdXw;a>jL2o)`r3x ztv?HGwB9DP$+|{pleLr3W@~PtE!I~Aw^%O_+-hAYxXs#GaGSNL;CAa50z0ht3hc0+ zB(T#uQ(&jHgTO9pNrBzgZ}@jxFXP{1oy5P#TAqKe^*z3Q*7NxGS;zD3w^rucZ~cn* zfb}NcgVr^?2d&+C4_Qm_9=3kNbJ+R-&k^gXJV&gvd5&5;@*K04;5lafko&mxWbWhE z?%XG=|8kwM-pX~-x`6AXwGP)Q>sOqotXFZKw$9-^ZEe7L#`+t_8S8x=&#Lvt6(*XS-mn$9B>B8S6#s1*{jXV_7d+OS4|G zzQc0KdOpi#>lBvD);cU#tiLi}u|B|j#k!CAs&y>$Rck%wYt~H6*R1a{UAI2MblrLd z({<}^rW@9|OgF6knQmGeFx|8kV!CPlh4H5Kb;euPyBTj;FJQcF-OhO1I*;*=br|Cv zYkS5!)|!lWtwk8`S~D=-vwq8P&-ymQJ?m2p_pNs^+_zrEaNl|k!vpJ?3=gcQFg&#G zVR&fW$nem*gyEreI>RIDbcV;)$qcW}-`%(&hx&$t;}@5dW=n?)E;Fbg!EYUXJ?%go7mftii*GBZ=-HD-Fo zo6IzfcbX|0A25?LK5iy#e9ny9_^KI;@m;fjMo-PY8@)CAVD#1OrO`jLM@DSsw~hGC zuNX;~pEXi6KW3z5zR$?me7lj2`3565^A$$^<_nD?&1V`Vn@=>#HSaPiH*Yd(G_Nx1 zHZL-oW}a=dz&yohwRw!uR`U>}1Li(Pr_EiAuA18zJuo*hdTp+4^vzt^h`~bIh|NOC zh}(kGNYH}8NX+89p^U|QLq&^chUyk~4RtK87#dleHngxfXlQG(!_e7cy`iVYGDAO$ zxrQMYQw*alx((wknhaAdDh;zO3JeP@(hSQiVhw97LJS)%ybRkd91VLd%nc`5=o!wi zP%)fmA!WGOLeOxf1-s!oi+=`NEWQ}*vUp{%-{PUcQH$#ar!3AIT(CG|aMfa$!EK8T z1`jNj8$7d^Yw+4)ior*VE`x6t4FOcH-abney+fA5ddDr9^-f!U(mikaQ1^=EMco^g z2XyaPZqR*bIbZjwWxwuA%X;0nmifA$EE9CUSqA9-vUJe>XKAR*WTm9bW+kM{WyP$^ zXZ1x#$m*GnnALS1DXSAYa#p)^l&se1s9DX`(X#5-(X(pQF|;byF||t7v9t=;v9a>h zaj>%1ak0|V@vu_V@wO7y@wZ~r39|aE9cFb?JJRZacC6Jh?F6e{?G&qG?R2Xs?JO%t z?K~?D?LsR7?Gmf+TIE*vwW_U-Yt>n;*J`wyq19s5sMT(jsnul_tkr8}qcy=wO>451 zfYvmtUz#(mo@&mqx}Z7VYM16BtEHMtttM!$u&U8qZI!OM)+$(YgO$DJW-D#YZC2u% zJFJ*BcUyhX*lTrH%#=)i_}_S>u#dqsCdQ0*wn+aT=Gbd^N6G*=St1 z($=_TC9QGCid*BJ)i?ErR@c-YTWwc=W;I>?g;j<6E2}8=w^r8b@2zCjKU)1)`)u_{ z?VHt6wI5b1)qYv^s{OGlRQqQYs>Wb#rN(3}uf}T4s>W{pT9woKqAIub4pm<3`KtWZ zZK{ISd8)$JVXC6mcBZ+2~0;QBo zIzdI#+DAp(+CoLwT17?AT0q6X`j@hi^<`ya>vhVe)*Z^`*2&5i)(*;6*0Rbr*1wc& zt#2yXTW?o#w4ScyWL>7@VjZsJYHhCMZY`nYY5h~t%lfvWkM&+fU+V>me%8&30oG}X zf!1D%!Pa_;A=W~QVb7mrJ)>yGeIgi%EA{KbPvV-X+y#-6z#; zog~#`Z7$Vo%`4Ss{aCW!dbi{R>&cQ6t@9)&S$j!NwpNpzV$Cc$#rmPdRO|f`)2!!7 zOt-F+m|-0!G1J;XVwSa%#B6IeiP_dy#OGMg6`yOJEsz8rtk;SzwQdq!W*s5A+*)6Bg*BV#3hVnKE3J2mtg@agvdTJ7 zWVN-I$Qo;Pk+s&WB5SRW3$L?o6JBraCcNI7LwJMr8KI5V6NNTfM+j}QRuI}`{Yr4N z^;W?x){TN&to;SITFVP=v;HEm&HALkcI){9JFLqDc3Arf?6g)F*lEouu*-S}|8DDi z{@vEP{Clk5^6jx+&$rjQh;N^@Ip03(KfL>`5A*J~?%_RP9madmT9Nml^*f$J)_Zvl zSx@0PY@Ne%#M+hTh_xKgQR@%fN3EA~AG40;K4vYI+m zZ#{|aytOymd23d-^VSDhFId;HUa+=hy=eWP<)ZZ=mP^*{ESIePST0+Ovs|`*#C+L$ z9rG3ITIMU(zRXvx6_~GDe_^_6eUj;#^-`v5*1b&EtxK4$TSqWmx3*@wVJ**e!IbA`)1r}_R6@`?4EIx*=6H;vy;ZPX8Vk5 z%(fU;o2@pkHd|<1Z8pQW+N|HW)~wyQ&aB?J!K~c4*(~3<)hyk((=6V&$1L1OyuQ1awUT3Ciyv0o3c$b-k@c}bI+ z)#!=YJEPZT&y7BtJuv!hcFTyx{E`um`Dr5&^CL#G=6j9Q%(ofoo3A&rFkfNhXuijo2+%jCd^m7z$c^HWasbWhi6u&``GdW{Xz_ zJ1rgOGyKLO92BDOLhZG%isET zmM`?3EwAZ&S{~N-v)rg3Y&lOq!m>v{*0NGR$ueC(%`#L!+tNwDz|ug!)KX5r%92OF z-tw1Tv*ioD4$JF$y_QGyCRuLLn`XIKZ?@$`y#8-Q$)!SrgtGC@! zM{l>KwB7+rF1;g`KXp%9zSKQyc|-T2k!8E?bIWqw*OuwJ z?=2&AKU;d}ez&yL{cWkK``=PZm)VM2m)+`*4v*Da9e%6(I>J^Lbi}O=>PTB{){(bb zs-tW*T}R!jQ%BpXT1Ve1SI5XIUdPNTP{+#3MaS04OvlkmL&w!hTF1kRPshiKQ76Fa zrFO8@1?_OFZQ4;*bG75FTC@|bvb9sJg0wTNthBSO6t(lLIJJwcK5CU(-PEeEI;d4` zwNk6jYLZr?Rkc>DRf<-Jm9JK}mAO`*m4enpD{ieRR$n!zTiw^3Wpzq(uGLn}`Bn=w z7g_aaF10GxTw#^0x!THKbDfp7<_0Tu&COOKn%k@xGTj&1)ZbhEQTu3hU+uHiA+@hoOVz$xb*lZc%2WGe6{Pmh z%3O`XT2_t8nn{ht`h_Z+^*L1z>#eF>)^k*OtXow1taDTatV2|VtZh_9tW{OTtoc+W ztiP*BSwB>fu|BOLXT4QL!Fs-ml69AgvURD7s&#^jy0y28rnR|>mbJ2qj< zee280hSqD9jjcPBO{|lZ&8+Q}Ev%)LEv6n(6l75%K!75%Nf6$7pH6@#or6oajQDui0!QwXy@ zq7Y%dS|QSUqC%8)g+jD-f&-GX*3)Eat*d0}tm9jhQCs_MSPPEpNoMg==IobM!kp5>u@gOH8$HmY8OpEHT~MMPi1vn#4?N4$%4l z@!8f3#b;Y*i_ft(6Q66%EI!ZrqS$=v1!4=V3&a*$JBTf`77|-z{X}%J^>)!E*4?5@ ztP@3-TAPb5v*r_BZv9MTx%B~&71pywR$7;dtg;RkS!Hb?vf7$YWR3ML;kDK?h1Xg~ z39qx35ngZoKxn=7QlSmjIYJw)O@uaD{}bF~eNu3<^;E&l*2#iftc?V>SThT5wZ1B_ z&3c8vHtR-#?beY3JFJZbc3ATY?6khbztg&lf0wlj|8DF5e7mjp^6jy%xDdrtc!RKS-bKawwB{LZ2gh@i1l*r zBi2dWN3CVKk6GX1I%Ykc>$r6|*Kuoct`pWbIZs&6b>pu1~)~4)dtRJ$SwVuaz);fmmoV66&IqRFO=dEY5p0|!- zy+00k0ZJ4iE^D|$ue!_Is zdKc4G>q$&kt@D_!Sw}Hlvvy*-Zmq?1-CBU@hV?hb8`gIiZ(1K>ylK6H@s@Qz<1OoQ z#@p8MjJK^l7;jq}G2XG3VZ39_!FbpD3&UOOM+|qZFEHG*-p_E)dL6?(>v;_Ktos=5 zS+_CV2iO1A3=gae86H@tGd#3TV_>wnWpc;-n8_~l%_g(V7n;>gHDfnfX2xJL-|UO= zEVJjvQ_XH0Pc%Dk+-r8kxXWypafjJ@<94&9#%*SEj9bkn8Mm5s8n>A>8n>HO7NBU|&CMsDVli~`KNj3UjOjgri(jdILOj7rUOjOxu(j5^I@jV7Ci z8qGELHCk@&X0*}V&SPENC<&B=2iyM6~=QsLg&ThnH@!ycc;=3WQ z#XCbGi)V%s7IzJ0Ev^_UTbwr3usCd}XR*uB*kYrhg~bX(JB#^-&KA=QJuP|-{VZAx zLoBKdqb!OH<1I1`Q!Nqz-Z?MDSn!#R+vj&GP4jY`X*ky3eVuQhDi{%D4E#?~B zvzTJ=*rMCurA4E`JBtc~&ldRxKP^%X{#nErFk1#0a9VmA@L4(-2wR#NNLcC`$XTiw zC|gPyXjlpw=vs0Z7+L<)x3GMpZ)3TCQ+w|sI zmg+6COwn6z8LYS3(phhVrIFqiOC`OXmV$bFEgAI=S$@zxX8Az(wB>o-^OpN{FI%qH zy>2;Q_l{-1?gPtu-6xj$x-Tpfbl+G8=zg?x(EVy@sQc4WN%ya%ur8w&i!Q6xR~=5P zXF9xA*L4J~PU?tS?beaBTB9RtHBU#uYJ!f6Rg;c}RjH1SRl1IWRiuuwm5+|Om7R{Y zm7$KEm9mbLm6(p36{n7;)emi7tNYpkR!6l%tk!6UTTRi9wyM^Svr5uVvhvbSwKCMs zu#(iyv0~KDw|b>jWOYfa)M}SjrPX4s8mk_ydaF{cCaXBDRx5X{4l6^gZYyc6J}XwO ziB|75r&!(6oNjegbC%Tx&AC>yH5XX5Yc94b)?8{8uerj?TXVIQx#l`670r!S0-Bqx z{%UNqdZn?`>bk~mt0NlwtTt&Juv(yT*s53Ks8x-|39BrPQ&y20XRSOm&RdylT(VNr zxMC%$aovhlLwDMQ`ZDpeN*Gfu_!J0vh$@-Zpi}e{*HtWr*9M-c`xvU#i zd8{*4`K$v~1+1-9g{+lTMXY&L#jL-oNLb%jk+MFiB5l1{Mb>(rioA8FilTLiin4XQ zimJ7@ikh{#iiWkaik3CMijMUUWnJsb%KFx8l?|;sl#Q%YlufK1l+CPVl+CSwDp^`z zSF*C+s$^q5S;^MANXgzhNXgOKSjov+M9Ibao1&}rO+|O>J&GRI^A)|Un-smR(-eKJ zy%qhe^%VoGMHB-F+U*3I%M){*k5*81{k)@<_W*7xKxthdQ!S@+9jTW8AUSUbz*TFc4h zS^tvFx4tf0V7*ng$a=DDv2~$riFJT%skMP@nYDmyx%Eex3hPTUmDXEjs;p??s?GY0RJ-+jsSfKR zsZMKmsV-|7sc!4fl0DX^C3~%xNcLIRO7>evNcLMBOHQ!nlbmS%T4Iv*35m(p%Os{) zw@OU4PM4Tw?IAJET1#TOHLt`B>xbeqtyhZAvMv;#ZEYhy$C^`oj`cOMxzu=tArLqKmAjh%UCy5?x~LAiBg_Ty&}R2a#pgCq`_ zI#Oh%wVB8&Yf+I^)-Q!uTdx#eW1S_u)>>D1t@THtb=KR3)?3#Jt+#d)+F&gpw9)#u z;702ef}5<%1UFl|3U0O*72IO|Twsg!E`hDq{Q}#pQv|kITMKNr78lrV{fvKy^#cB# z*3tYst;P9wSzqJZWj&Q|w{qM?&){0!mtewPR2tlL>GSO>CPw3cDHX#Ilu zlJz#`OV(}7m#o8?FI#IeU$*|sblLhc(-rI0OjoR1nXXzVFkQ8_XS!ys%XH0JoawqX z1Je!b7mPQo&okbz-o|*-dLH9V>o&$))_IJ#tiu^^TRSk`w$@_2Z7s@p$C{Dxj`drH zJJz=u?pmK;xw{FsxsAzhGb59?W*R0B&E!q4 znu(j7Hsd!rXvS``(~QAnli4TZ)n-qPmzv!$USM{{c#hdY9yFmT5f6EYWz1S)}navq0k+W}e2g%^Z#An^_t!0@wRm z#;eSfjn|vW7;iQcG2Us$YrM~l-S~(ZgYikTpGFtVJ{w&#dt-FR?5WXXvwKFb%&r@K zG`nE*)9j=XgZUvN4)fhc0_IzcB+S!5WME2AeFd8f>>X zW3boau)!gVod(A(HW-|>SZ;91Vy?k;izxGfL9)thA5qc`2MT5q;xmfix(NWCSNo_Z@SE%eq}YUpjU6xZ8k z$*#BC^1JSS%jddBEU)RFuso)F#&VnPMayNnS1qUM-n4Afy=z&n`^Yj~_nBpc?kh_V z-FKFjx}PkybiY|j>Hf0h*8OMsSBJ^!oerDTeH|{Vi#mK(hjfIjw&;jiEz^;*nxP|S z)up3kRimS7m8YX=m8hd@6|7@u<)&j|WvOFfrLALQC8uL=C8*Z-P{ z)o$%Tt3}!&R$bZ=R)yNpR*~BAR*u?9R+`#rR)X4@RzJ0JtR89QTb+eXPPbaEIm>FA=3J{L z%>`C@nv1QXG?!VqX|Av`)?96+pt;V9M{}dqPmRr1&o#DLUD4QSbx>os)q0J6R&zBD zSaoY0wyM-PYL%{W!YWMTl$EQ-St}Eb^H$0lm#l;}u2?Z^T(^3ve$(oh`faOa>i4YL z)gM@8sz0*wR)1=xtNz?dQ2nLV7qvH5*VW!x?N<9>HDB$sRg2nJs|>a8R=#RKt&G%u zTS=(>wfd|2-|Dd{qxC6OX6ucrtkyGB*{$nUIjz%Gxvl+Gd95u}`K=XH1+6(%g{?oU zh+5xO5w||BB5A!zMcR6fimY|JioA8Pih^~VijuXLii)+Fikh{OiiS16il+4sWo_$A z%DUETmG!JUlnty?l#Q$%l#Q)rl})XGDVbZ}P_nSzretM3MakN_M9J1VSjo=XSjoX! zM9I{@bwyX}U5akja}_n-vL)*bRm)^YO5)+X{P z)?D(b){o@Utar&}SWlMAw9b{wvUZotwpNzQvHmBUYkgZb-+G5^f%P=mLhDl5BI^*@ zVrvuG5^GV}QtNLrW!Bea%B^?GR9MfJskE+_sj^O%sj>EuskPRVsk0W5skim(*w_ee~(&XJg6?ISVOT32G4wSdGl>lfnF ztv8C#u&xrHY3(9D%UVEuw)GvcIo7Mh=2%yY&9(Lsn`bR2HsAWA=mP5_q6@5NiY~Oy z7hPoSF1pxSUUZ4|50NF-7e$s@uMt^h-7d1+I$317wS&kCYgv(%)<1+-S#J|wWnCt` z+S*chjrBjFHP%Oj)>`)nt+NglT5l~cwBGu);0Eg*f*Y;d1UFiT32w4h6WnC|LtwM@ zX@M=)3k0@UmkMmP_7T`-ts=0^`WOFp>-GHGt#kNySZnd`w0_06(|R@EF6&&rUDk$t zyREkV8-tc$pgSetSkwf@0*)Oru+G3zGIW7eLW$E*c8k6Yj7IBvb1 zXFkP{p%XG!Mg6WEN2-8(-L#C_NB23q;nVGIzzhk^^eS`6a^&!R^)~gtAT2E%Y zXjImmbD+_Eo%$L+tx~qx2<^@Z(ILhxNZHE;g0o1hC9}K8SYrGVYp*GhvBYu zFT-8ydWL(})eQHn%Ng!l=Q7;4j%VPpIA-$Me3Qu~^93fG&HGKJnb(`tm=~I)m?xX~ znTMHJnR}UNnA@9(o12($m}{B*GE+2pYbIgx(2U>Yx*5C4IWq>6qh=qC_nAF5-fniy zc%#`#<27b`jhCBkGG1b~+<2kc9OHRrlZ@w>br{b!t23TuR%$%UEXR13S+enLvnb;^ zWjm^m3QGP5#XYG!1-0^Hw6)cf1bc#Zd%u^AsU`)72_?7Pt!vyVm>&0ZN@ zH+yV!*X*v*6SHeZuguOHeKb2^^uz3+(SNgDM(pOBjrh#h7>SuLHIg%*XQXC6-AK=T zf{~edr;)vRlaYscwNZe1iBY6^u2GVCno+iSoKdNHxKW+CzfrrnhtWiH2cuc$7Dh|V z4UN{BYZ~n^S2Q|gE@gDaT*&B}Ik(XRb7rGg=6?*ontw6;Z~n%R#o~z}m&I*Eev8Y7 zA{M6&r7R8`%3JI*RI%7(sA;j%P~T#Kp^3!|LraT(Lwk#MLl=uWLobU`Lw}1L!w`#P z!zha=!+488!&D1T!z>F2!vYI)!%_=9!)gmP!v+gk!&VCs!)^<1!wD8lhSMy58qBu% zV6f2Qxxq4vdj@MPt{7~zIBl@a;*h}}i=74sEjAb&vsh+u#$v9)MT;p0*DbmY?pQP# zJhZ4VcxI7r@Wvv|;G;#X!8eN#gWncj28@=D25goV2HckV1_G992BMa-2GW)y1`3wk z2C9}!23nS%^z|(t=$lxc)3>zTqi<)qO5fRXroM+|yS}ewseX`Uihj6dkbaD%gMOl= zo_?C8tbUdyw|>6mFTE1W7kZVJ*Y#>GkLfj8ZqaMET&&k^IZ1DVWux8{%L2WbmhpP? zEdBHrS=#9>x75{JZ7Hj_!ID>Ri{)S4otAHP_gdc7J!pAW_n75g-BXrpbtTnpKpJmX)uLo|S`+k(IHIsg;_J zrInw7R7B+G@Mn zJFD4hAFLYGK3S!zeX;UV`);ML_R~sK?YGr$)xTB`RsUO^P-V1UugYvaO_kNUR+Zg4 zRh84)SC!k^OqJJKUX|aPLsiiFql&QgZ52`Lqbg$78&o8$XRAnAx2ecj7pllv$Eqk; zd#Wf|o2n>VE2^kk^Qov?e^=JDzNoBay+&Ebx+MPw)>D-%txJ`xtwWS-tWA~dtVNaVt-mQcTHjD~vficWVm(*U)w)s9-8xm#!`f5P z%UVy-+ge1?*ZP-&pY;QU0PEulf!6C3f~==1gjm-qgj%O6gj@S6L|B_DL|V%!L|bzx z#8^L;kG0+*A7|YwpJ1INpJ;6%pJdH1pKSeHF2#DkT$=R^xpeD7xeRM>xlC&{xh!iY zxoqqEvbolKWb>?N$>v*E$QD?K%NAN&$QD^k$QE1wlqs>kEmLN_SEk&0flP&UvrMIR zx=fX|w@kIQflQ6Hm`ttpPw6`AQxulz|??|;+Z;)!WZjoxU zj+AP*)|2Y6W|iu+z9ZRXy+yLix>vH>I!&_2+EKFCT1K+Z`lm#{^>v8})>|beT2GOf zXk9EZ$vQ-0vbBlC6l*bwsn#FGr&(_kpJrVzKHb_&e1^5S_)P03VzaC_iOsfd6q{om zC^pAhS!}NLH_>_4r$y&mFA!Z|T_(D~+E;X;wW{bM>%St4t*?tLvEC%I#JW#psdbjf zGHVZ!<<@E<%dJ^NR#=}9UTNJayvo{Jc$GDu@M`PJLTjvN3aznD6k2PoEws-1hu}Kv zqk`+LrwDGaP7&N-Z7R6Ynq6>{^(}!-*6Rf}Tek>ov5pqlVr?w2)tX0OtMys_ZPv~F z+pTT*w_E?<+hM(nZ-;dq-%e|1zFpQ_e7meK^6s{t#k<=&g?Ep&KJOmuKRkP_PxI`v zp3Ae(x|nCbwI|PhYXzPI)*rbKSTEu}XdT9V(3+e3ko94%L)JB1hpp|n4qLNw9kD*k zdBl1u=Mn2T&ZE}qoJXxcaU8YY$8pTMo8y>uB*$@UO^)N%U)fJs&tgAe?ZST2`U~4h z>t$@GtfSdZSqrkAwm!vr+PanXjI|T%8EZz?v)1QW&RWl7IcJ^Aa?aX@<(xGy%X#a2 z%onUTFki54X1-`0&V12Yhxw8I;7ZheCBy7gwp8`g6fZ&r#e$*0~J#tdkjpEcTfEH(zOT z*L=FkKJzw{Mdsxu9p)J(1?JHv(dK?8?&eM=Cg$cQ%H}#IBIZgaZ03?CKg|S8-kEWj zJT_x6xn=gz_@dckw0nuQoIHS;lEX69_X!pz!urJ1qu8Z&L>^uuhY(SNf| zMr`J*jd;zM7>SzCHIgx(W~5@?Z=_@1VPs<7Xk=qvW#nRBY~*X6V-#kdY7}Q4XOwOp zZd70%U{q=DY1CxyXw+kFWi-{?$Y`FqmeC4xWuuMe(nh<@g^iAy^BA2sXEC~I{@3ua z`B%fY=I;!@n?EyTu()T)W^v7s+v1#|fWI(90sz(BC4#Fw`R4Fv`NuFy6w=FxA4=Fw4TkFyBJku+&1? zu*yQpu)#vmu+@Uou-k&caDv5mgQ*tp3}#zAHCSMA$6%SoWrNigrwle&95mQwvBO}u z#d?DS7RwBdSr;T>Kj?^*EhFZt8ZgD zTi?;LOW)11Qs3J$T|dAwOh44pRX@toSU=uUNk7F>KtIFszh188JG~;yJ9_1or}e5W zcj+})uGDL_oT1lg*{;`TS*AD1GF5N7Wr*HvOBcNbmd1KZES2?ES_Rz!d)4ge#rhC^iT=$`+hwf8LOWl{2 zTDos7rFB1A^5}lG{HycR@}16K%Lh7)Ru^?xtq$vOT5Z+gwOXztXf;zu)T&!Y!m3tB z#wuS&!752d#VSNc-O61@+saBu-%3}<$Vx%S%t~0t%8E_L*6NG4qt$I~SF1zX9#$*0 zeXJ&E`&*T32U*2yhgrF4M_TD=$6ASNCs_U0O165Tm2P!OE6ZxPR<6|&tpck)trDvW zt#Yd*ttu-Yty(KHtp+Ovt!683tv0K#nw?e;G<&R0YxY}h)0||rP;;tPujUM^3eDM8 zDVlSw0yP&{*=jDf($ZXJC9b*BibZp^)klqWR`)eFTAkI{Vzpaio7GBIOR<)r?=N=5yV6}$Qqt5<5ztj?*uwA!Th+G?8GTdQid4_1k4pRC-}zF6s~eX|l$ z`(gD%^_SIs)jw9pRR3G8Rb{lEqRMPtqsnTXtjccfqsnP*qRM40tIA`|rpjmiK}Ep& zmWq(|5fu^Zbt+=kGgTz4TU4a1^Hrp+qg7uE~n)}>08)}cyP)@DjJ*5XRG z);|>Ot#2wiSnpAEvYw~tY~85nYMrX+X6>oyVXdd=X)UbiZT(Zh$NGVSuk~>Sf9rJ$ z0oKzLf~@Nlg00gOLaqH2!mP~|!mSk)BCWX;qO4!YM_ccakFlO8A7`B=A8&0dpI|K_ zpJ@GBF4_99T#EG^xm4>ixisqlxpZr7xeRM|xh(6)vf0)LWOJv(u$mUr`%jR2K z%NAHm%NAPyktwpiCsSg5P^Q#+iA~^Hqs5&{L+oqkEEKcw@EcycS*Ha$4j+Zn@P1<^GLN@KauRP-Xqy*Jyo*H zI$yHe+EcRIT2->gno+XX`mRKu^=^rN>sb;Ltg9p@T1QDtvbL6(WGyQ(+4{fu6zikn zQ>}Z%r&))HPqUU4pKkq1Y=-rAv6}#eg6Lf9rK0n!YeeT; z2a7JS))8G`%__Rk`o72_>zyKtt*3}Au`Uoq!EetTP2RTRRGDww4muV*QeTtMz>Tt=19z+pLB7w^^U(+iu;Z-=!6 z-%jg?ygRK|^X{@Pv{HCH}LGW4&vEot--U;nu%w>^$za+ z)_L3qtW~)WSl{D1Xg!nbpmiwML2F^IL)Mo$4_VLSJY=24dDz;V^RP7w=Mn3R97nAe za2&PH=Qw8Vz;Vo4kmI=ZN%rH`h3qG+W!O(xpJY2>UCDORTAS^p^?lY;)-zd8S%(>2@ z*R3lVZ&;@=-mvy%ykTw5c+*;u@uoEw<4x;t47aQwGu*Piz;N4oAH!|yH4L|{=P=x{ z?q;}SUCnUEI*;M5bsob#>r4i5i%ll17V}MBn)jKUGOsmRXP##=#XP~J);!20-Q3M2 z*xbs*(Oloez+BZt!Ccxz$Xw8b)tuAhml=b}d$W(m&&(bf-!;2peAVoj@j0`d#wX0y z7#}uUV7$+4s_`zfF5~TH^~PJwN{u&}WgBlaOElhK7Gb>J%-?vunVa!?Gh5>gW~Rm) z&2)@6o2eLYHIp^oVJ2$4%Z%4}FSNgZ6kPAWH#%$f!sw#eL!)bEw~TI^T{e1XcE;$r z*-@i6X8Vmko9!_AX|~bmzu77yHuJ?syykO^M9ileNt^c>DVet$X_+?~8JSlZS(z6b zIhp4ed6}mg1)0YgMVp5kC7TBr<(PXKm6|&m)tOrvwVN9oO)%FnnrW_Lw8&h>XpOn3 z(N=R_qy6TrMkmbw8D28~W_ZW^z2P(S=Y}859~k~JzhTH^anX?7;-n#u#X&nz@o#@)S}+d+M>+R!6MJl)gsN%%Och=z#_yj)WXLw z%EH+&-onZ-)xyv)%R zV1dOYgQXTH4OUqkFxX(R-C(Q5I)hynOAQWK%rQ7>G1=ghMVG;Oi$;U178M4!EbedIgpj^hz!F>s4B=*Q>Lfr`K%RtJiK>qt|1ZtvA6kT5qbQm)=ZE zOTBrPntF>YCH0nDa_X(N{HeR%@}=$;%bU78EKln0vD~S9&~laTQOnu7CoQ{m&so;! zUb4*9y=EDwd&|;a_nxJL?qf?s-RG7{y00yTb>CaE=zg~Rrt{tMxz2CPn>zn3Pw6mO z?a^VgTBpNhwLpi@YLbqSRf~?8Rk@C&Ri=)tRg8|Jm7k8Pm7|V^m5GjymAa0Bm6VRL z6|auD6@!ko)eCJqs|(srR@=2*t>$ZcTD58WSmkL4ScPc^TiI!cS*dA9S@CJdT7B0_ zuzH}CVs%n0-D;Comem}sJgYXXLaPF;600b!aw}J@Dl2`hS}Q57Mk`jW7OM}M?N+xn zyR43B_E>Gy?6;b$ImxO+bE;K|<_xO@&DmByn)9qIH5XW^YA&`C(p+Z6pt;iOt;TAr z+ZyYvPHJql+ODzLYN^IHtH~NWt(r7;TNP^Tvr5o7VCAoI*vd}hsFkk92`gERQ&v10 zXRUsypSQZ9e#vU5`W360>esBQ)NfkFsNc4-Q@?AasD9syS^bgKbG0W{r_`QVty6np zHA(HYRk_+*s~ENSR!(Xktu)lWSn;WSv-+y~!|IOeFRR0xi{%3&>|%4N-}%47Xrh0pqiih%WD6(Q@jDk9c1R79tu&qpWBBOUc0chLVx> zb|qu$X-cNnrAlVjp-L9kW=fXU;!4)mKNW4QZ!6ka?^SfLUZCh`-K^+rou=qw?WO2y zt*_{AEu!dQ{Y$~i`hkMC^)Urs>val#)>9P%tZNklt2tSuBmtrZo*thp5; ztY6DVS|5;)vYsj*W1TG@YwaW-XDuloZ~aj&(fXuZlJz3FWa}Ea6zed#RBJ=IbZcI@ z4C|M&nbyZ-v#b}(W?MJP=2$1l=33j!=2^?j=36t!7Fa)&DY8B+Q*6CVro_5Srqnu5 zrp!86rrg>>roviQrqY^4rpo$?bhY&&=^E=o=~`3Zv@QVrHSr5dgKq?)W# zq?)a*rCO|oq*|?CNw!%ZmTb44BiUhHCfR8nDA{GLBiU`uDcNKFOrpp7utcx*LWw@> z28n*_1c?dOjuI2Cl_e%wvq?;{z9c@`dZzdk>m>21*4pCJtiOp(w>~5`-MU|FhIO3S zOly6yS=LNqv#qa*&bD47I>)+Ebgp%T=satE(fQV#q6@5_h%B()FS5{jw#Xvu3X#Ru zp(2Z|jYXDN3yCbXek{Dqda>{_>r~<8)>^_VtUm~?wB8}K(z-!tm9>}9YHLxU)z*&$ z*I2I?Tx(q?xYpWFaGkY+;Cky%0_&}h32d;QEwItLSYV^IkH98tRe{ac3<8_2xASkY zF5ur{tt%e~tke0nTWj)dw|>jJ!+IO<4(n##oz{W8yR7ATcUiyZ*=>D* zXSekvo;}v7JbSDydG=cK@$9ue#l6?MhI^m28TUTxPh9)0*K_T+&fz*>t;2P|`Yq=H z>-C%mt&2GiTHA0QvgYMHY<-X8u=RS5Bi0QZN34T5j#{g79JT()e$09{`!Q=b_T$!H z*p6E-W;VNO<7M_e`Yyly_w~-bs5WPYX_Dy*4!*-tRFI; zwcgEq&Uz~IIqN*;^VS~B=dBf)FIfL(x@dik>7w;Urc2g+OqZ;)nJ!s-GF`UTV7hG0 z$#li~72_4_GmKZQH!xncUc`9KdLrXB>pI5k)>(|#twR{ETiY?-u-0U}VJ*UV)0%mPH4`)5Z^mbQ(2ULah}nOm<7VHDPMLjx*ZWt^ zZW-M&yJU3V?6lEivm-_?&Gs6-Guv+T#cYGoFSAuf4CafC*v#h`@tRLH5;5;Hk}_{M zQZjEa(loC$GB7VPvM|p!axhOZayO4P@;47NiZJ&#N-*~@$}o2{Dm1q;sxmh=YBJX` z>NZz3nqn?zG}m0rXqh>`(FSvNqn+me4G)?BFg#=a!SJg23&Z>74-H?M-!%Mee#!8! z`DsIDi^GN-7JCeNEw&g6S*$S>w^(8*V=>22(PE0Bx1p+&W!nMJXowMCYp zgGG{|n?OqTKn z?3Q8%JeGV0f|jfXVwOMkr7fT9D_CCBSG7E%uVuMeU*B?(zKP`oeM`%FeLKrMeP_!U zeGf}-eP2r}{Xk1i{V+>O{b)-L{RGSJda0Jr^fE24>g8D;(JQvxqE~LYSg*!%l3t@_ zlU}Q3pUEYIt1vpk@? z%W{M6KFfu=hb<@S9=B}LJ#AU6d)_id_ljkx?hQ*f-8+`%x(_Thb)Q&D>AtY!)_r67 zSLcJ}JDo3<4|IN5Ueftvd0237Ry{iWR&_eURs}lZR>?ZjR-rm_ zRvtP^R@ORdR(d*`R*E{hRw6ovRvbDeR^PNOtnO-CTOHN5w_2m^WHm+G&8kM*(<(*V z*UDErz{*rR#7b5>+=@**%IdvVoYf7jM5}{ZDORhr(ygXwWn0y0i zM01{%qUJ&?KF!5ezcrRwz0_D~bxmWn)e((#R+}|8S}oMrY}K!^&8kjgr&X@TZmSrL zeOBHY2du0$4qIty9JP|tIAO)5amwn8`dOgTPts$aC4rhdh$T>Y9=g!&CDEA`t} zvg&uO{;S=$daU-)>bTkytJP}HtoqenSe2-~vWirDYh|bQ-bzL7qZOChXRD8@U#)Ja zez!WH`qOH;>L06q)qhsystnc%s!Y}%sw~!qs%+L$svOoVs$AA@Rd}qgtMFPMRN=Q? zqatWMT}9ZsNk!B;S4G@9QboerRYl6$P({XCRz=R5OGUx@y|SY9X=P>W<;tqo&C2T5 z@yZ(3Hp*JoQp!5kKa}*WuPfxGK;)-8$-))|UU);@~P)`p6%)?$io*1r`ztRE_PS|3;NvRu_7Y_7GcY@Rin zY`*n#nF8w*GKJQwWQweNWs0o}WlF3=WlF8BWy-7-WXi4CWGbw0OIKR2l&-R_kgm4& zkglTdJom7*xm{ha%JINO76Oygg3nkmEYb4vP!zDYc zjU_v+`6auo-%4~_pOWaYUMbOQ-67FyogvX@?IF=`ttm0VnpR$40xt+IY6xY~NJ;A-n0!8O(~f@`hy1lL+K3a+!hDzMIamB4!I z27wLM;Q|}1^#wLsa|&#-KFPnyx|x5owLSl4>%V+ktoQJ3wXWgYYHiQA&6=5SoApWF z?bZ`{w_8W??y%P6-C_NUXQ%a9o}JbUcy?Kr@a(eo=-o>@ox|(aBwJp~^YX+|U)<-xGSa)$AunyonXf45c(E1U_A?qz1hpam}4qL}@ z9JV&*IAYDgam0EL`%&vm_M_Gk?8mH6upP6mVLNVZ$adWN1?vgxg{&v6V_8pHOS7J| zzRhyVdM?W;>qM5**6J*$tv@iIvEIde#=4XFtaUo`IcqoObJoht=dBr-&s*PPx?sJV z>4No4ri<3)Oc$-gm@ZkHFj=hc)-H_KtqmBjTgx!su;yUAVf~rmhV^}ho7SfpZd&hPxMjVZ;g>Z%W-E=Knawf2Z#KdBmRXDORkI4? zi)OjTXU&q0Pnks+pD^<`K4#`>eALX^_=uU2@ewmk<0EE@#z)K~jE|ZL7#}m^Fg{_% zV0_B#htXNH4@MWjuhAQ`ZAKr>)*F2@TVeFuY@rdO z`D`P0^C?EW=DkKD=50n&<_$)Q=9NYo=0!&O=GjJO<|#&Y=CMYu=3z#@=Ke;Z<{n0| z=8i_G=2k|z=Eg>4<~l}o=Bh^R=5j_8%*BmnnhO{$H0Ll{WzJ}{#r&t?Uh_|e$IM?D zo;QDNc+>p0;Un|QhHuQz7=ATBV));DuOW-YHbYK}b%uNv%MFDs<{L^_OgEIZ=r>fd zXg5^1s5jKLC^s~+$Tu{%NH?^xh&Ob!2s3oE@H6zba5W6Dur&;`Ffoj_&@oJ~P&Q1p zkT%S+5HifS;500?U^J|<_+e0Q@xh?Q;<-VW#eIW*i)#i`EY2Csv^Z)o-(s)95{oSc zD=pR-tg~2bu*G7Q!A^@w2Ky{J4Gvp07@V*uH#ldJZ*bWn&ESSbtifH25Q9e+J_gS% zoDJSsSQ&h>Ff{mXp<(dHLcxI1Qrv*elFxwKlFdNC@|V7-#z*d>#=mzn`mjOH`P*AZDRG2Jbe+jMtWF4x^-IYak=Wryxj%SzpomRY)IEu(cWTKec- zwY1Z{X{oP!&r(76k)@FCGfNiTSC(IO-dR4^`DA%h=bPneonMxFbpBed*I~3;sKaVC zS%=fARfpHATt~nvOGm^iR!73hUq{BuNk`twR7crLLr2|8T1U%@Pe;#+NypIYwYI6% zWo=8VUD`HQi?kiAI<=jx3boy>qO`rNoVER|w6z1RM6^S!{%S>7J=2P|x}X(jwNoq6 zYLQl|RgYGNRhd?{Rf1NYmA6)*m6=wlm7-RK6^~Z6)pyN0tH+v+R_8QZtafR(TP@S< zvYMpXYgMN?!75vGvQ@a|G%FX)8CC|Gv#n$`=UH)SF0}ftvDoUV#xkqR8Y`_1Xsotc zud&W*uEs{I9*xabRT|r@GBtKuMQZG}^3d34WubAvN?qfymAJ-HD|U?&R`1nMSzS;+ zYqe4RywxQ2i&n+zSFA$SuUVO^->{NWzh(7D?XJ}Wwfk0w)gD?cS9@&LqxQ_IK<$N9 znA$5VYqd94ifZqy*wsE*y;c2ebw%~7)o#`AR*O}CTJ@;@wklEmYZa^d-^xvu(OO@X z*;-PS)tX6_-TI9Rr}Z@zZtDXoywlM7Lrzv<_*D3f|rz!YZ`z!ccTPOrtD=7q7^C$#czm*TQJ}e(* zJySlyx(z4c)~#|0)(LV+);4m<))I0l)?Z{(tuM-^ zS+AGPu_ENAXG4yyBCsZ;DN^UM@D(x=d`EwVT*)(PatxpK9vYsZm z$~s+ewY8<-8f#v`HP#OW)>>~DSZCcUu+BPFV7;}izzQeoKdI|3~>s;P#))u_mtyy`uTVLkcVZDN9hjks# zPU{e!oz~hsJFS^{c3JP>-esN5z1v!Wd$;vjaKN))pLxtOYp^TVG;7Y~8|s#M+Ggi1kahqt^4- zj#-DY9kb?TJ8pfP^|*C2>j`TI))UqYtS7Axv7EGSWjST-&2q|GnB}zf9p=;4E11t% zmolHRc4a)TA{tame=x1P;(-nxeAf^{s@1#3H|i`Mc?7p)nYE?GZj zykvch@sjl_#>>`yjF+uT7_V5TFK0Q?#4MUkSS^Z7-kK+yTrv+a z*$Dy#=_>uj5*D>8#9=% zH2z^W+xVkdpYdz6M&qYurN$4;vW)MT#T(x+3pKuK=4E`@%)$7gnYr%w8E?gU;{YF}rMZ-|P&yzyHi^uhDC>ZAS0S z)*F2>TVeFWY@yLVvsp&W=97&$&3laa&D)Gb&FhV%%`1!)%?ph*%(IO2&6ADH%wvpf z%|ne`%>9kL%{`2Q%^i)R&8>`*%#Dq*%yo>4%~g%6&E<@m&Bcv+%ms|5m~$GRu9p-Ng51KzQJY{~@@Ur<;!#n2Z44;}GGkkBp-|&a|c0)#s4TfwMD-5|U z78>$f%rX?Qm}Dqv(Pb!S(PXG>QEjMUQEaGdk!@&Xk!)yg5p8H|5p3vW;brJ<;biDz zVQCm>VQ3g;p=lUxp=g+3Az_$mAz+wg!ERV!@!z1-;+sL0#an}Vi>C%H7IzFfEv^{! zTbwbNVsY4Drp0c9c@~=t7F(<`SZT4yV4cNGgUuEb40c#_80@vEH#lrjZg9dP&)}>@ zs=+0TScB^pAqICWybT^&I2$~(urhdUVQBEdLet=@g@VCv3vmMmOMU}ZOEv>8%Rl=3 zmap`MEpO^eSf0?AwcM_+WVuXV-EykFj%AC!p=GhYnPrl`wPm2by``hRi=~0Sr=`5U zpCzAuu;o9!aLc!PF_w4r5-rc_rCRRM%d%Xfmv1>ouh_CjufnoguhueKuhBAEug%h1 zuglU}uisKzZ?dJd-gHZDy*ZY@br)E^)?I3OM|Y*=8Qry(dvrHiuGQUUIZt<&WuNXo z%X-~ImIb=UEt7OlTL$Z%w{+3HY-y@{-BMlmwxxvbeM>Ig$CiI|o?E`vd2M-L=e^}c zozIqsb-r6})%k6?Lg&BbEFEU69vwETdL1sSLLEM<6dfU}Fdb1VPaR1s8y#6IeH{fW zB^?zjQ5_8{P91HlpW6CX544S}j%%A)t=G1+nyzhYRj=(}m9Fh#6`<{IWufhDrKs&^ z#jPD=^+hYx>Yi4F)p4z8tBqRmR*;t@N~ttR%Hctyr`w ztUhQ~TiwyDvpS*KXthPN#cF|OyH$^7msO=^uT`q%1gjv;$yWB7)2wtfXIe>W&bDIH zoM-h#W1-bUjU`s+HI`ZJ)mUk@T4S}5x16Ak+kMik+y!PENgv2S>vZ}S1 zvbyybB~9zgN?O*Nm2|8pE9qGmE9qN@C>dItDj8dgE16jTR5Y``qiAluPtnqPk)oA# ztD=o{rlPI2pQ63Bv7&>ugrbx6KLuy&Ckn3Crxo0+H!65o&s6ZVZcy;D&QS2N4p8v5 zwp8%5R#FJC=1~Z=ekUJneONxkdZv7+b)kH?wWoZ9wW55a^)I<->nn0G*6ZYAtvlu7 ztW)F?tR3VMt!3nrtbfWTTVIn+vECw^W<6Op-MUCN!#Yql)7nrr%UVb_+xoLij`dZU zTXVeRIPQHRGqbtRK2y5RD<XIXz1nQeVm zWRCR;k-63_B6F>iMCMsLip;lG5LsZ&AhOWN7xQhhPUhQWt;V<6`W5eH>rK2{tZR9< zSbOkpwHD*uYW;*~oAnl+ZPu+k+pHsbwp$zVY`5m&*%X6V5%>OF8#iXL0VeHsjo9&CI#q`Xa}E>-ik}t@Ak!Sle?Pv=-zz zXnm9Yko83N!`7bchpidek674Noh#*5ac882FIV7z2KmGP2w4dW&2B*x3u{)|_wofxlJ z8#7+DR%X0vEyQ@unt}1U^*e^^)^`|gSf6INVZDptru9mOo7S@!ZdrFT+_J7?xMf|+ zpli`>B5hG+!flah^3y!Z3ws56weC^J;C$TQTmNHf&4h%+>{2sgB_ z@He!za5r?aus3wKFf;VA&@&9QP%{j(kTs095H(D+;5AIMU@^?L_+wCD@x`Fj;c@`@S7F#SZSYa{UV68>J!6u7#gB=!i z274{a3=Uc38XUJsH8^7tV{p+T#Ne8Rx4~@-CxZtTRt8Tk3=LjcXd1k?P%!vnAz|>- zg5Thu1-k*WlAu-YmAFWtr{)%M9HkmXW$AEWLEkSlZ}bwA9tTYALUK(^5e9t|gQ1 zL(4BZPc5J6ytKTb^Vaf|&PU5VI$tc;>HM%Rwhp&doDRQL zfR3=0vyPaRnU0i|rjDGItd63UfR3savyP_KJ8d1StJ(%ud$o1%sfNoadpF>3o;z0wM@x}p_owNES3YK2ye)g-NWt6Hrjt8}e2t01jR zD;upGD|M}WDJl~6{E%>t0(G5t&XZ6w_2`#%BoZSj8(S!c`IM_ zi&h5em#u`=uUUOlyJ2-p?UvPEwL4Y|)$UuhsXesHQhRI_p!U?tRPDKywAxE6Mzz;g zFI3-Iomc%}wN3St)jZWNR&A=^tnyTUScR+pva(nGW2LG3&q`R8!TPTXll2P~7VAqY zY}R{KIILHwa9K}L;jyk);j_+G5wH$d5wvzz5w_M>5w(_45x3@4k+goREMdCbDj8Y- zP&Br_t!Qe!Ptn|Zk)nlltD=>4mZG(_pQ5d`v7()|q@siMKLtnYrwY#2XB1qlH!HYV z&r)!=Zc^~D&QkEQ4pQ*8wpQ@5R#EV?=2P&uelH(jeN;ZkdbWJ9b&-6CwWoZTwW55u z^>4Wd>#K56)*Ixat-Ix7tkdPxtstpCa;THlgQw%#F|Vm)0p)w)bJ%{ojr z-P%kx!&+Q6)B2}Ow)HKU9P7O@xz-D0@~oR>@~zWl3aq_l3at%fimb(CimiW0mslT> zF14N{U1psqU2bh4U17~AU1@z)s>*t$RJC=TRE>3rRIRm^RGl@WRK4|0$p-69l8x5g zl1*5^d0S}zuzW?dmV z-P%udhP9gLOzVFlGp(^&`P$)|&*ETQ>==unrbnVXY>(()y>s zD(iCstE`s@thTNaSZy67u*Okm9ztPk>Rv7XGc)jEx5tF;x+Hfw&KZPr(~ zw_Epd@33~~-eJwez0-Oh*G}siu3gsFT)V7)bMCg@%emXSfpd?wE9V|-9?reiH#qiL zujJTgUCpuI+K*$uwIas>>(}fDt*5acwDx8{WX;8X*!nozVe3}5Bi2rAN30pxj#}?$ zJ!W0cdd%8^^|&=N>v8MjEGMjcSWZ|6vz)Y+VL562jQN!HX694Y4a}#k1DH=+D>9$9 z{=#&|`UKM%>qSgwty`GRTBkCdwRU4VXRXF`&YGR+y!8vl^VX*rFIaD2ykI?@@uGDd z<3;N<#!J@zjF+q}882HKFkZ1%VZ353#(345jq#fGSB7iWPZ+LSUuL*&eTdf#9p+jli_PUs`ptz+ zYRx%Ja?Jl4$C|%3_BX$2>}Y<%*vx!~v9|e2V@2~>#uDZ|#{A~>#vJBF#!Tj^#(&Hr zjlY@s8GkZ!HhyPjVf@-m&-jIzit#fuY2znmg2s={IE){e{Wp4K_TA`_**oyLJx|Q; z89g<-X7tSLoY70OV@9vd_Jim5KbmbY0`>R5n=Lf@Z8pp3zu6=s7V~Z+4)YcxUh`Tb zA@g!03G)IYS@TRIW%FbsP4gHdee+NwQ*%Ef8*>jMCv!(5Pjf4y0CQubaC04_cym>w zG;=wlJaciQQgZ>LT60dLR&yq!Uh_YOQ_a5`&NF{!xXk>y;X3mNhTF|=7#=XcXn4~6 zl;K75!-luacN;!7-(vX2e2w8(^QDIW&F31jSWGkIu;?@7wP-gKvS=_Ax2Q0bu_!cD zu*fu2wMa75vWPO&w+J#cvG6jqv~V`Gv#>UFwlFsIu+TR2wNN$;vXC+iw-7RnvEVXH zv|ut!v-oL{ZSm2dz~ZGrsl`KsDvKKi^%fTlS}cwmbXx2;=(E^vFxg_A!3>LK26HXu z87#J#X0XDd*I=zhtHCCVT7&HtB?fyeatsbyq!=8th&DKF5o~b5!rS1gg_FT83oC>B z7KR2-EHn*XS|}L2vyd?OY{75v!-C!5uf;!oCd;?_?3Q=*c`Q%s3tH~d7qeWYFKszf zU*57qU&XRqU(+&OU(Yg3-`LVk-`vtv-^Nl^-_cT3-_4Rm-^=ogp1m^w()=RUTte0)stXE)JqE}*>qE~4dqE~C_s@G&`s@GB-EobX)wCvH{YFVqh%Q8=QpJlx6AWW0p?3 zr!0+i&snPKUa}O|y=KXwd&}~d&OOUFI*%;x={&Q%p!3S|kj^{Htva79m+O49oT>B6 zvPb8yWxWogRiO^6Rf-O$Rk#kXm6wiym9375m4S|gm9mbsmAH<)6_<{Z)gNs&tH;`! zR;RRetu|>JSk2Nlv1-ybx60PGwhGp^v$D~4vQpJ{wc^wEu==j$WA#wW-|DnhkkuBg zFsu1mkyf2rF;*p730Co1$yQ!kX;!9MnN|u~Iab_S`BvXFi>w}LmRgW`|XjW|x(_X0Mfr<^(Gx&B<2$n$xWQYRt5Htue>yrp7$0;~ERC zwrMP}TB5PcYO=;kt457ARs|aCtl~8`TKQ{iwzAXMW~HaG!%9|Tw-ukpUaLRq2dwU? zAF|r7e$;BA`f;mf^;1@9>SwGx)X!OIt6#L@SHEoaN$slDHMJX7yVP!3%~!i))vR{U zDnspom9N@kD`T~%RuXE@t^TXNw0f%g+UktzTdOUq@2zI5eza;<{cM$^`qe5#^}Cg= z>Q5_m)!$YEs(-D1srUWM6uw+gHEG8J~~Nh+MywJO}!nJT>2p(^~=PAY=d zdMd)!(ki0X94cbgZjEV$>i{JkYa=B+YY`=V>u-vN);AT6t@kRLST9gCvu;&1x6V|wwDwc9vNln) zv6fV{wf?VQZ~auk!TOAXll5i=XY1JtuGY;8Zr0ff9@ZfWp4PSsUe;;~KGp&XzSdvl z{j5*O2UyRQ540|p53=@_53yF354HXy7iN7;F5G&9T%>ikT$FW&T(q@|T&%UCT%7fP z*?8-_vI*9EWRt9C%O+b_$);FG$);Lc%cfb&$YxmolgYGxAd_W%NG98QsZ5S_r%bMO zu1ubFpiI8CnM{GTj7*_5lT4BI1?ghzdD11;xzeT9w$f$Rywc^?_oXVVH%e7nw@Ou6 zM@dy%8%ot!b4t}(Ka{Mq-X&RYJw>v?I#06E+EcR0T2->ynn|+R`o2Vq^$wtb z)^!r?)(H|F)=m*tmljOT4#v&S{sS?S^pF3w>~8{!Fq<+MC&xM ziPmOfldRdrCR^VWonpOObgFfu=v3=)(P`HDqSLL}MQ2z)5Sd}UQ)H&~6p>lh`69Ee zeMDwkYl_UV<`9`{eNlLx^uIlSU(e5XuV!&p>>VWB5N<9#nzHSORQfC zF0tMvxYW8^aG7r;H|tb6#@Tl@2^w-(`BZ+)A0gY{zG4c0ll8?DWGH(E3EZnD0} zv&niP&t~f)p3T-SJX@@#c(z(U;ofRJm3y1DC-*jM4({#NC%Cp-cW~{n_T<`O&CRvb z`aI_@>nWVOtfM%0TPtzyv3||5$9fybUh5`~z1ATd`>eG%_FFS>?6+Ree!x18{eU$; z`$6j?Y=^8n*$!FzupPGMXFFnjk@bl66xO5G5v)h8Wmu0{KV&&(y`1H^bw0~+YYUbW z)=VrXtj{r@w4Tj;(mIRzl(iM}DQh0)Q`YyHPFrtbI&Iy>blN(F>5R1p(-~_WrnA=k zOlPe>GM=-(!g$Vl2jh9`xr`UAn;0)xXEI*24q?1#ZO?egT8r_rwH)JRYf;84)*Osi zt$#6GwSL8L&H5I@b?Z|M*R6Lk+^}B7aKm~w!wu^mh8xy34CWRUCTbSxCSn#5CL9)? zCST00O>Ud(nH(`!G+A#hW-{BH+oaQ+(WJusopGl59pfnTQ^vmLJB=O9R~nm{&ob6A z?=e<3uQQf5FEkc0Pch~-4>x8v_cmrScQF2IW@`M?OxyUInS$|WGjZb&X1vDl%~*`z zn*B0*WA@SLjoC}1H)aov-k9AmdTVyU=$+XKqYq{Wj6Rv|F#2M)(dfI`N~51Ze`?YZfq1_u45Etu4)u(E@zZtE^d@#E?`t_&Sg|>&TQ0V{>QM({Hx(4^LK`` z%%2-BGJjyW+We;BX7fviyUkA<9x*>+c-DNc;Z^f(hWE_Z89p~(Zur4`zTr>v8HS7& z6AW1`It{rj8V&g^stkoKiVYj5u*Ra=V53E`!8VI*gWVR% z1_v#o431d@8JxE8GPq#jWN_8O(%_bbp}~C%O@qf43I;DMBn;kK@Ed%xU^n<~@lXGc z#an$w%e(q)mS^<2E%)dPSgzI=v7DtZY1ySOXIZJQY?-OAVHu&XW9gx9XlbEuW~r`k zZ7HsAZ^^FjV)#*e3>$Uu?JJIru?ljB0y0a|L>CUs(OAp;6mX^9FEVXsdSjy^Nu;kahV#%O;!}62P9m}UW z4=k_iJh42f^TKks&Kt{hIv*?-=zO-Etn=NnRp+;5h0cG=Y#k=6I2|^tKpieC7acw; za~(k|EgexSIUPwWK^++@RviVakJ`#sH?-BQ4rpsxten{3s?avIO3=2j^3=Am zGSarUlGb*zV$pW9dZ*=SbwkU?>Y!GD)f%l}t7%$cRt;K_R@qvyR$*ERR!&;UR=Qeg zRuWp7RxDb%Rv$DAtZr)-TOHRdv)Zg#X*FN7#;QlN-l|fw$tq2=)hbxC!^%;!+e%Nf z*Gfinf)$tMWUC(<)2yCp%(S|yF~{n##yqP{8Vju!Xe_bn*H~s%r?Jv1S7VJ;jK(@E zAB~Mx)*73wv^BO_No(w|;?~%0^-X=R)phj)Ry)-XSmH7p&f?UADTUcGYT|+I6ehYPYN!)b3cNs@=2lR(oJ&p!Ud0Oznx)U)ASUk5yk< zol<>mwNdr0)lAj*R*kA3tuj?VTLr0pwX#>=+I!D3PI#j{k+D^g4T3x}*T2R5;`n$Z3^%;3T>qYYZ))n#r*8cK=)@t&>*8k)} ztZ&GLT5pmIx9*jTu+Ef=w04z?vR0Cdv1X8qwZ1PKXT480!FsN2qIIool69PHvbDWz zinW4lnl+Pby7d#84C~`EnbxahvaI`LvaO3`a;(E-a;eBqEYWJ6EYW7|D$#DOA<<#YBhhL7P`t}} zm3X&xiFl8-y?C!Rw|KAh4Y5A!rDFZoC1Mk-UBo6@i;7LOel9x6dY9;A>psyb)=8pM ztSv;RS__I!vwkHq-TH{g4D0zKGpwscW?F}f%(6BSnPn{`GTZu*@Eq%f!gH;Ygy&kT z3(vEDD>UDFtI&MwdZ7i@-a-qlC50AQzY<(zy+?4db-&;e>tw;D))ss{>otaI7-TPv|2u)fZAz`Bp^ptT#@L2Ev?L)O<>4_nV? zJ#3xEdc<0n^@#NsmZR2tSdLk@vK+JaXE|mq#d6&G8S`=L&CDmP8<|g72Qr_uR$@MB z{e|hI^$Dg^)^nLoS(h@Mw)SN@ZLQ68##)%^jP*~(v)1<+&siT~JZHU%@x1i}#`D(Y zj2Eoq7%y16F>w^r}tv51U zw_e0>-Fh;^b?XKOTZ?=X9g8><84G_CUJC~k1`8vT=jLiA7tAG1cAN8=EH`I1nQH#o zxW)Xwaf$g^<23W##*yZ$jeX5$8#|fz7+aXv8S9%D7^|5l8_S!A8B3UZ8Vi}*8uOYP z8FQGc8?%_p8Z(#+8~-)qH2!V&-{_~=H>2-nZ;ig2Ju&)bcH8Ki*=3_|W~Yq4n;kOx zVYbWYr`aZ>-)5_f{+cZ|Vlba=#AH6jh}FCorQR1YFEElY&oq)XPcl+6k2X>_4>8g) z_cby!cQ-OOcQCRww=!}zH#YJ#*D>-pS2YSVmothr7dJ{a7cj~)=Q1iZXEv%d|6|x- z{?)L<{Jmkn`3uA8<_`_$o8K~AZhqNtz4;l#?dC@f518*WJYl}w@S^z!!<*(S4Ih~= zG<7P}2vEH)c-TC6hYvsh#>*{%d`5dmV5NMEZ6AsS6kL4-70Lxu^p_Z%kqAX|W#aVXg zC0kbOrCVm}MpQcrn}T~y6#HL4&AkuRk|B3vvs#x#_I00^wZsEX|H?8(opx9rLyiROA+03 zmTbD0EPv=+vwW>{%kr+yJ-@AV)cIqX zqQhVnuES#GrNeGztHW(&sKaliq9bG_p(AF+ts`aiPg~aNnYNbYGtL_VWpwjZ6&7JYsI2D!RnL7WUGf7)2z;G%(U94F~@4H#yqPz8Vjwu zHI`UaX)LqK)L3a1sjL)B+iCsbcpZBTt>HC^?MRlVvvt8~>5RspJ?tSnW(SShJ~v*JuPyF>tK0*Yc2UeYbN<1>)Ud{)?4L5to!A{th439t=;7!tX1TqtQqB^t?$dmSnrdK zwVo#%Z(T2&V4WbFXzeJQWUVZlV$CX>YW+ec&HA)Vy7fAl4C_fUnbu`8S=P}q+13s+ zxz=hjdDc8K`PR>*3#_+F7h1PS7g>i$7h9`Hmso$3Dz!c-Rc1X$s@%Fjs>0e;s?u6o zs?z$CWR>+P$!hCGk~P*flC{?1l6BU`lJ(XCk`31HBpR*HN;FxomT0!_mT0lgmT0y1 zk!ZEnm1wgTkZ8AlF5Y3iNxaj#R=msFL%iEsRJ_Ofu~@J5MzLP&2C+WtK(T&nC9w(C zUqmNb9~YfyJzI2=b%E$)Yd6s;*0Q2gtiOs(wLU8{&3dKCbn8};>DGxNGpy}JW?IXN z%(DI=Jj;5A@NDY};W^e;!gH+u3C*=WEHux$S7@GfxX^rSWuXPu?*$iF9}rwoji#c{%7jf*icIMb)Ey}US`aJty>k9V0)~f9LtRJxLx1Pne z-#U!#fVB|Y0qgUu2d!ta9#&g!qjOVSh8827|GhVQ^X1r*v%6QS5pYf9QABIcT-xw}izh$^$ z{gB~`^%aJz*2fsGS#M{!X1#*pn)M8ZYu3#SP8MkcQ)U_}(G_ue$G`CPUw6Tykbg+;xbhQvL^s?YE^tWI% z46*oW5MlArAlBlgL6XHogLI3V200cN4GJwz8kAWaG^n!JX;5#m(V)d*r9r2~0)sw_ z83vOrCK$}H=rEXT(O|I1qQYRgMS;O;i*$nx7V!pKEy4|USp*pDx9~7HV&PzL(!$)} zoQ1x@WeatK8y4~gcP+#X9$D}kJhxyscx~}d|AWOl{jU~x^?zBM)&Fm?SD(dljXsCv z9DQEP9(^Ip8hvrg9DQla7<~mxAAMCz8+|QH9eq7Z8GU0*9(@bTKYBKnZ}c23@94Q& zp3(EN+^gqrxmGXOa;{#4WuIP*Wu0E4WxigjWxQUNWq@9urGs9vrJ-KArIKEarLbOu zC5v8*Qd6si@7g_e{F1M`LU2R#YyWTQMce7=P z?siL8-QAYvy8A6Pbq`xg>mIk{(LHVXPv^YlN1e--k9DqFUe&p6c|zyDbAyYt5X`&tafV5v|6Dt+iJSTJgYX1g;r%6ORQ2gmRW^rth92~SZ!shvCc|WV}q5b z#%3#4jjdL1)OT2&Ro`W`UVX3CMD_hv#p;KwLe-C0S*Rbgl2Jct^JzJDs?V&}slKq9s`|>R zR`rcln(8|%Kh+Ob=Bl5p6ji@iajAZ@`l9l~>b}Y^tCK2!thT89vs$3SVBM|4WL>Vp zVx6qQYVEJWZf&E&X|1WkZ7rt4Yt5p04 zui#>>so-iYtl(z-Ti(O^qP(Z|a(Qp-I(Z-KPy0vL)>CEDt*c}*tm9>}tX*ZYt+i!xtOaFqtv^WTS?`n1x9*cJu#S^1wAPm{ zvSySnw!SP?V!d3d)Vf-#%sNo2+*)0#!uqddrS(a8zJG+1wvXtbUr(PUjD(QF+o(PC{X(P}L&(Q5rwyv=&Ic)NA8c!#yWc&D|D zc$f8Sv2N>KVm;PfVm;Q;V!hV7Vtv*OV*S>aMJHIV5S?IMD>~6SSag!Lmgr<_CebO@ zw?(E{ZxNYl-7hlDI!k1lwTH-bYju$s)@&j(tx=x$tb6#ETYK;?w`SvCVSS8mg>^gMN^4KPRn~lbtE{i^uC|`T zyV^R9ca60n?;7jBJZr5_^Q^U=&9lxrk7vELGtYW!NuCYX54bm4PvqWc?aaN&`Ulr$ z>-Ailtuwf`SSxdFv3|h0)p|bXHtTfGZPsR-+pXC+cUWKN*kQebW2bc$$1ZChj$PLB z9J{Tbv+uT^$iBzgmVJ-)8@9dHbJ+G-hq3Lm7H8XUeS>ws^(@u{)-kLHtkqc$TK{A@ zWPOt5ko63f!`5jmhpkOm4qG#^9I?K{eAIdg^HJ+E=3~~L%*U){nU7n4W;$VglIeu? zLZ*|}RZJ(XLzzxl8#0};=3_c-{f6<3^+m=r*1H+cS}$QdYu(Fu&bo~8ymdU|d24sZ z3)Y5=7p$cjFIuxPUbOziaLM{L!)5FH44191GF-7f$#B(rH^WuywG3CS=P+Eg?qqPc zh%qs<@G()hur-me&^O_>P%`;vE^6}JoXg~r`CsFG<}Zxbm|r!XZGOnO$9#ivt@%9T z0`orO6!SXcNb>??fAb_`H}eoGYT-5FbXplG>S3jGDhto4B0HQ4Y@2*4EZc#423O14aF_|3}r0b3>7Tw4OJ~H47Dr_4fQOv42><6 z3@t3A4Q(uh4IM3b4BaeP481M>8u(j$H3+eIXAo)e%plIwVxB>##WaIHi#~(N7HtMIEb0vAT9g?qw8%49W|3yF+9J+i zgGHFZRtrCaT^4Qz`z`DYj#!u(oV3t0IBTJ1aLGc>;JSsF!5s@egNGLE2G1=1>A$vk zr~lsKuKpK`v-&?R_Uiw$SgX%uIaihswOpVVWI0hU%(780+OkM5-ZEJ) z#WGkg!_q}B$I?`<&{9pW)KXlp%92B`&hn>jljSSjcFQ}u-Iix{`z`nDPO;peJHv9J z?i|a>x(h5@beCF|>8`X)*IjEFsk_nATX(Cat?o`secip5in<3ag>{cwvg)3+{H}A> z@}w648pYV$e#odZU?Qbwe}V>ZoRx)ke)+tNEG*Ry~@QUcom8ZVn zDp38Pm5KThD{=K>R=?FwSlw4UZFNNLtknv&^HzOom#m7_u2@B?U9)mfyJ4lKcH4?q z?XJ}q)%#X=R3BO$R())>TJ@>bWYyn!)>ms>eYd^UVYc07@Yj(MC>!-32)`w*ytry8g zSvSc>TPMrLTD!=`S*yy%TXV=JSihD@vOX`9Y`s|~#d?NJs&%bQnst&)y0wQ)rnR0- zmbIu%w)GF`9P8uKxz^LA^Q_aQ^Q|qU3#_@N3$5=;6w_Ybt!Il&u`U;xY8@;x)!IO0nl+!u zbnCmqGpy$e&#+Dso@uQvJj?ox&@AiCLbI)_h2~hh2+gtP7n*B*TX3%R3c-2SRf6-Z zeFW!Q%L^{B{w%P-`lP@@>qPOj-*W3jz7^K0d@HP9^RBes%)8RMhIf^<8}DjsA>P&24|vvCuj5&3UC*=D zI)G=LwKC5->kr)Ptru`_unytgV9mw7(fSbAChHomP1fdIo2|ccZnoaaxy8DibE~x# z=T>Vb&TZD0IJQ|Y=Gbms#<9cNn`4KyBF9ea_w2i@=d$mz_F>;`{fBM0^?J5F*2!#p ztR>m@T3=w@YdxKHpLHzjK5J#x{njs84p{GCIbhw-a?m=3<)F0%%OPtXmc!QfnGaiU zWs4>r<*S{?lhlZTw~r~Twq>coNAtA9AzG29BA%l>|t(c>}alI zY-O%sY-}!StY^+?tZDwwNX7h%k%IXvBU$qYMpEY2jU>#^8i|=7F%mW3Z6sp8*+|%Y zm65RdA|ny=SwbByH8Q;d|%V~teJ!;Cb|{f%_Y zJ&X*@9gIxOEsZSAjf`x~b&Q2QC z|6o{V{?f3<{E=a^`EA24^DBlE&CeOmFh6cM-~52#GV`5=>&!P9ZZltFxYvBC;ZgH> zhG)&E8(uY^V0hQO)9|Tzli@q_YQt~lC5HdZa}Aj-(hS)x;thE$!VLv10t`hgJPjo+ zoD5|xtPGVbj1AQ+bPTmER1NhlI1HUE7!2Jlej0dNd@=~Icx4c3 z@yH;`;cl-I8Bl+mb=w!19BhspUgGOUsLTc9w_qoGdr# zxmzyQ^R}F<7hu_<7h+ke7ipQM7i$@=mt^Uomu6|Hmu;z~mv1SpS8U0xS7G^Ax5o0F zZiD50-B!zsx}BDXbbBqg=uWa+raR4Yy6!B?PThHy)w+u;b99$m#_6uM4A5O~>7={a z(nNQ=rJC+;O9|cmmR!1rE&u8qw|uX2+VY{!dCMz0mo1O!T({h*bIWqI&OOU{I*%+T z>O8Y-(RpQAuJg_^OXs6yoX%IvK%JkKE;@fKEp!;Hv~^glwu;sAv+~pmv@+2OwNlWEu;S5*w)&wNXZ1ug(dwdRiq&4t zbgNaGSyt0EbFEr53#^JXi>=}{%dC7gE3K?GYpgUi>#f8!o2*zhTdh88bXYyo=(f6` z(QCC|V}jK>jmcJXHKtkhYRs^z)tGISqcP7aMq{CskH%svTa9H_x*992Vf)Zt3&Ert(K_ouxeA^WtFME$I3^2zm>lFK`UYP!&cwbj#=GSJ7Kk7?UdCL zwX;^8YUi!;)h=3vs$I6SR=Z}Uq;|uKQ|*@32h}@PH&pLi9Z-E}wL1&sKL-zFHkq`EIpQ<)_sgmETq!Du1m?RQ_8f zs4!Ujs4!Vus<2qAsjyj#sBl;_s&HA~Q|7kbrOazRO_|@iL|M=}SXtQGP+8PkKv~TC zgOY^x1tlr#4N5ZB6O?4F3zg)pgOn7lO_Y?Z#gtU6e<-S2-&Rz&-lwQ(y+~2Zx=m5X zI!jU4+Fw!M+Cn#cv*0U8Xt(z6BtaB7>tV0!St?d-- ztu+)Jtc4YvtpCV6TVIlQwO%RjX5A?7ZXF@-X>BO)Wz8k;ZT&>f*Lt6vpY<#`f9q1Y zKyOeMp(DXMp~!JMp?Vb##n2}##(d9##z6WiMPHW zlW4s~CdqoHOtN*IOp0}iOsch)Oq#W!Oop|DOs4gJ=`8DW(%IJYq;stErE{$vrSq(X zrSq+yOBGn}k}9s_L~))PhhtTROWtQ|!AttCV!Sbq|k zXnjUxlJ#{nQHw>c$)P_;c3=I!qctIg=bj*6`EmvRA{Dk zuh1;(aG_b&N%-BFS1_Ezt}pPe~GmY{}StWd`qo2@GZ42;ag^H#kbs=k#D*6N!}IK zlXzEJ$MUYU*5qAf{f%d}^--SH)>C=bSf}%>v9{t_Yt6^A&iXj_I_pyI_0}rf>#eVI zZLsd=+Gy>~wb7b`Ym@bH&P~=GoSUt^IX7DiaBi`_&au^cA;(th5{_-w9vs`OWjVH6 zKVjctJ(YcjwI};d>%VL}tv9pnvd(1NWv$4z+xiac9_tybd#uA)_gc%a?zMi&vd?-e z%YN%7mi^XYEC;NOSPoiqvmCO1%zVgt7xQ83iOff=GnkK9+cO`v7GpkU{f_CF^>L=- z)(e=9TURrkunuQBX>H7O(pr$|l=TP3Q`Q$5Pg`$dJZ(Ld@r-p7<5}x`#vas5t>-gbww}ZgXyIkz zXkleyXrW`GY$0bNW+7<8Wx;Cl*Zhm|3-kNNSItiuA2#1^yvclt@nZAI##7CkjN8qN zjH}I)j0?;|jML2BjAP6#j6=+|jeX4Jja|)!jqS|YjV;ap7#W*?G}1SJZlrB~$4JBc zvXQF!Nh2lm14atw+l}PS*BQx~FEx@ipKBy*KGjIpyvIn+yv0b~yv9huywph1Jl9Cs zJk3beJkChNJlsgzJitiL+|$U=+|kIy+{(zp+}Oy*T*t`4T-C_cT+YbTT*AoDT+k@k zoXaTEoW&^4{I6k(`FF!C^ACmv<}VG)%pV)pnBOsMGQVorX@1Udg86a7Y32tE=bG;_ zTw=c2aE=d6@%jzG6rWXL<}xk@ETmRU^Td9@mv4C#cTa17I*YtTAa~; zYq3}Vlf_#7?-q0Q|5)_tGg#K?vs&iqb6Lje^I7`q3tQUjOIRA{%UCMtD_RQbt6DPZ zYgvBM)3dajn!^t>$F_53U=^nxuj^};Qq^kOW%^%5*? z^inK!^)fBx^l~lv^@=PR^~x+i=~h`j)~&O=qT6hFOt;-~yKcATO5F*TvvsFf_Ug{C ztk<1mS*W|fGFf+tWvK2-OLyJ1mX^93Ewy#GTFUC~v=q?YYssX0(DIAUQOoB#CoOO3 zoV7fobHQ@I&K1jzIyWqr=-jcKuJgdMOXrDYtYc_idTojicyEh>Xo*D)g^6Vt6kdSR*SWzth%*jtxB{NtzxxRtlYFU ztn{_Dtt7PdteCWotlnsuT3yq!usWb+ZM90v-fF6rlU2Qzt5uekhgGPSx0QpIzm<+w zkd=g1s1=J=gw+SlXsbJ#aaJca6RoytrdTb~Otbv?{tDEW@taht!vYMy9)v8f_yH$$%E-QES zJyu%k`>puY4_bXvJ8X4L?WommwG&ng)J|Eos-3aQRy%JMsCLoHT=pu%o_N14-l zhcdVIRApZ4B4s{ne`Nt{J!K(lUS$#Mw@PBxXO+aQ*C|O__bEwR7bwYC2P(-~8!IVT ziz+Ev|4>x6zOATgy-!iidXb`rb(^B5b+)3mb%3I-wW*?>wX~vvHKU@T^$P_f>vIYw z*4q?Jt>-G3Tem7$Sm!EOS%)cDTiYwxSZgZSSqm%JTmP1Kw7w+oWW7?}#kxV>)jCq% z&Du!b!q<0O^Gh^ZKND}VUMJpcT`t~i?I_-2%_H7weM79xdbwD;b(vU)wVPOnwS-uw^()aX z>;0nL*3(6Mtn)>CtldR>trbQ4tbdF2TVEBKV7)@h!8y&AZ%s8SirILf#eDw!AB?xp`Mw-{M(iy_#p0bq&vI zYk!_K*2+9~(BZLn72+F*T`bEEY<&W+ZIoSUrG zIX79q<=AY!jbn>-1IHF?Z;q|javWQ&U$Sqrp2oh-+Le8~^;fp-*2~#;SSPdXv{qo- zX?>q{m-Rf>UDk1|yR8*j_gFt=*<-ziWv_J|%RcJ>mi^XBEc>m0GasqY#p0ZxTc-p#y@w9aT;~DFC#ssUT&meo^PaSo^GUNo?xV79$}u509A zu4d$7E^p*vE@9+jE@%{J&Sey4&SDg8{?{8tylrWO&@X+wh!utKl{C zI>USB<%ZA93k=_yXBvJrPd5B#9%IOC5o*Y8;b+Kg;cm!pVQ(mGVPPm?VQ460p=GFG zp=_vPA#JE>A!4X&!E0z_!DeV?@!!DO;)j8~#YY1di&q977LN>kEp8hGSzIv)vp8cA zZE@5f-eRvoip4gAOpEmfxfaU}iYyiwlv~U&sJ573&|uMF&}z|O&}mU=&}UI-Fxev0 zV1`Aa!5oVygM}7B2FonG3|3h<8LYRkGT35aWU$jh%V4jCvcVw>X@lby!Um@;xD75? zuozsm_^E%(;+6hAi(C4SEl%sdu-K#j)?$tRM~k`o-z@s{e_Pb)|F_83XR(ae=d|?K z=e2au7qT?a7qe8UmgJ>G@h_>jhfI=!IJP>P1=F>&00b=p|b!>ZMx>>1A88=oMIg)h)4nu3KSwL$}uQ zly0NtZrxVPwYr^_^L2YIC+beJY}TD-S*knBGF^9`Wt8qBOCQ~3mUgp zwiMOfZpp5@+wzyre#0Gm%t8>e8g3evbW}SzY zWjaqSGj(2C#_GJW4AA*t>7w(+(n9BlrMAv*OL?9DmclwrR_r=#R^PR`tnO>`S{>IG zv|6t%Vl_is!m3eQ+A2$1&MH`2$;w7s)k;-c!-`*9$Lgn+zSUzbBdfDoW>(v^EUgx4 z*;w^x*;|!sIawuXxmo#Yd0JU$`BAFeV^4kwS!id)DBy1S37DoNA0*( zliDe(bhR^9zG~;JOw=w|NvU17VpO|o^-}e^)kW2tRy$R1TP;+*Yt^Otz^YjFkyVW9 z6Dv2>XIA>EFRY|gUsDxa*@t9-GVrSi?HP34DGk;*TtIF;X4 zUMhdB%vJtdsi-ho3#u?%|5IkQzNyS^y-k_Jda^Q?b%8REwVyJdwT?2sHMg>$^(!S| z>r+ai)~l4ntb3FstaFv5to@Z_tc{dptwogNt-mWOTHjVwvfihtV!cRF)w*3#-8x%Q z(>g#=%i2s)$67{F*P2OD-}?{57}&cphkoTv31IdAIHR*Kg719~jRnnQ(zS3FN3ewru zU!`)aPfF!l&zH)xE|to+_K_;ER*@>S{v%mreO0p9dc9+2F#*4reit*1)VSeHuFScgi~TANAKSxZRNTYnR8u-+ryXx%E_WE~*hWGyY; zZ2erU#d@n)t97$jn{}{Qo3)BqyY)BG4(n5*o!0Y2yR1t@yR3agyRFqkd#o8nd#&$? z^jYr^>9d|H(r;ZPGQm1PWP-Jx$V6*CkxACKg(q3h6`pJzFFeIsS$K-|3!$mj>xHIT zmkCX?b`+Xs%`Y_F`mW$~>otNitZM~lTKfskv{n$DW&K59mh}mN+1B#}=2({q%(3{`uBb{0pqj`4?FK;ag~Zgl~~`FW+M8Fuujs@_b9IU-2%r-paeo zx`}t0wLkB2YgyhE)^B-MSnuOmY2DAW$~uW>m9-hqYHJ>z)z(M2*H{;GueDa?UTb}m zYn^o;*E(xAuJzW8TqYEat;5;3T642+v)<3P&AOCryR{D64(q3^JFFM6?zB!}-DR!8y36`4%WmtTZKQWxQzRz&p`U1mw>thTTthX~VH9Hi#>mh7p^>NgH6s`EGe!>Phm35@cNkfk zuQxI`UuI-#KG(?De2S5gdAE_Fd9#s$c@_AKenaytBSZ5fBO~)DBV+SmBU5v4BXe^X zBTI8zBO7xwBRg|FBS&*}BUf_;BM);)BOh}iqX2VmqY!fzqX_eVhOy?~4U^127^a)Q zG|Vx7Y*=W1$FSV|nqjT^dBZ02lZGAUhYb78cN9 zMVmo`MV&#bMY%zjMZQ6wMY_Rciv)ui77+$>ECLJ`T6h>Nvv4$6WnpQs-onsei-o4a z4huzty%tgihb)8)j#+RSoVH*#xM1;3|BA(P{hJmy^zT`m)PH2LOaHmWYW+7BbM!x0 z^y+`LsMG&tk*EL9B3_@_GC-f*(ovts(okQ}Qb}LbQdnQgl38EQ@{69bwrTGRt$i)t38p>n%6xHd`*%ZMU4N+ilsVJHfJ2cZy}U?hMOV z-8q&4x(h6wbeC9~>aMU<*Ii>NrMtnBM|X?mf1MqcA9eOvKG8W~d0pp-g{V7XZ5isdw&>z185w=HXQ?px;TJhn{Md1e`=^UBgo=bfdk&PPi_ov)UvIzKHX zb^ciL>M&R_>abY7)@HZ5tj%q;N1M-TskV?+pSGw~nYM&gg0_s6r?$M6k+!mxjJBE; zo3^Ia2Q6KzTUrKIN3@Ks)@zwr&D658YSFT_%GYwRiqdkna@BIPGSu?4lF{<9;?VN9 z`l1a1p@)h^8#t7V$;R+BZ8tQs{_t@1Q8tYS2?t-LhztSmGOt<*G&twc1- zte7<`tv+egSUuFJx4NLwWOYEJ)oQ&)ht)idE~`F`UaLBd308R;ldR%2rds)F%&@Z4 zm}RA}G1p37V}X@`#v&^wjipx4)K^%YR9|JaMt!YSzxsNsV)ac{;p$tgtkt($$*b?Q zVo~31^+Ii*)mgOzR-4rhTg^~AYE`Fp+$u%wq?MQ287l*|b5`PN7p(rNUb1?sdd2Fj z>UFEFsyD6Xsou6~Q@v|dpnBgbQuU#glj>tD9o45+;;PTB7*$_dy-|5>bzSAH)ghJl zR%=y0TFq4XY}Kmr)v8eCyH%{pPb*KA-&STSf31{N{#yyCFj)UlX0pDn%woM+naz5F zGKY1ZGN-kVGPkvsGOsnKGQagpB?0RbNG zDau*jR8+9utEgzbNKx6kO;Oc4TT#tAP*KC$Oi|NXMp4_ESy9LOrGlRIMFoB99SVll z3lxm3I}}W;3l&VQqZG`oofRysbrdYE#T2Zq85C@+ugTk5uaUR6ZkBhjj*@q>Hj;O? z=8<=?ekSK;eNfKbdaj&@b)}q_b(oyDwXvL!wV<4z^?O-=>vOUJ*6U;gt@~tyt@C9= ztOI02t&L>EtVLuatiQ=bTHln3vfe8bZM{$?#=2D|);dcj-a0@g!P;CV(OOO>$(mIr z+4`1riuG#gRO?#lbn5`=3~LqXOzWRgS=Q&IvaOd$?i964lo664llY5;fLJ z61CPW5_Q(+#p|u7i8olsi8okliZ@z+6Kk?QEY@s2Nvy>>Nvy@%NUYVGMXb&GnrOTA zD$x$>deIK+FwstHUC}OUHqmbDha%n9`$T%IXN&Y&SBmsmhl})Cn~C&Wi-}CIek(k| zdcE*O>muQa)@H(!tp5m2wmu{@*}6+;igk$46l*!5sn)Lqr&{k6oMzo6INdr%aJsd= z;0$YK!I{=K1ZG;V6PRV)A~4H3MqswJslXg-K7qN`m-**f_w&!Q_T`^%&BH(6`V8L! z>ps4P){%URtX26IS%2bPY`vd%iFGgUQtKGrrPeyU%dG$KEVn+#v)pWt<1H~`ab76>v^2(t>ZY?TPt#I zuzt$1(RvNXM(YxeP1g1to2>acHd`NJ-)x=EzQtOIeT(&3wyoCfY}>4z*tS{!W8H4O zi*<)}1?vuLbJm^K-&uB9?`PR%-N~}sI+$gTwLHrn>o?4Mtq(Bov!2Pk&$@_tzjX-n z0c#89gVvJF2d#fG9kRZ~bl7?q(-G@gOh>FMnT}dVFdehDU^-?k!F1gEC*yJJ+l(iy z_c5NdUdVXTx{dLabvENE>mbI{*0zkNt@RksSj#e=vF2txYyFeqto1X7bJmv_&RHK} zIB&h1;k@-4hV$0b84@h?O#&w+E?ruES+`@R0xt4LexvX)WIlpnKIkR!D`8T69^Vdf4=J$;v z&94}Rn4dKAH{WmMZNAmW-F&r?i}@lWNAnp*_U03eY|Yz^tj+6;tj)`etju$btjtr5 ztjuGLtjt4=tifmZxEa}*+Zj2Sn;SWq8yLBmYZ|$mD;as2OBwl^3mXNP^B9Ggvx4jW z81wIj3FaRSQ_No(W|}`X%rn1hSZsdHu)_R;VXgT|!)EithMnen4ExQu8csD|Z#dh0 zh2cW;g@((`XB)0FpJKSxyw`BIdAs2u^9I9{=9PvQ&5I3hnCBSYH%~QuZXRd&&OE~K zn|Yw&KXWfbCJSdnHVa!rE(aftSS@1AmL72Ei8l3?eMH8^l+iVmO-AyB!gm$Zi5Po7K0j#8iPiQQiE2DT!Su)RD(W?ScAzHVFoiS{0!z;xEn0A zus2v{VPUY!!oXm?g@(aq3k8E67Lo>gEd&h?T5uX1vtTkfW${)2yv0-fD;C%EZ&)1H zziY8W|B=N?{bv@l^j}+a>%X_C(f?wRr~lI;UjMH}fIgF@qduFZkv_Mjvc7<&u)c^T zi@v1gS3OzFXL?GO*Y(saPv~h|?$Xn@T&-tpIY-aJvRBW>vQE#@vOv$(GEvXVGDy$Q z(nT-G(o`?pQe7|FQbI4@l1nee@{ewY?wOp>-XgO22 z)v{Z+%d%Ft&oW%+R|L-y`{F!XG=MqZR?EdoQ_I~-RLjeXQOnort!9ALP0e7dW13-Bn=~V>=4-}S^=QUhRcR(!rE8{I zg=%J4IcsKH8EWQP$!iu`@oAP={naS5daY4ubxWhh>ZC@!)lQ8jtCbq9Rx>r)tvWTj ztSU8ntui$xSVd|~vhviJYGtW0!%9nImX)-|Tq_=p`BuNw7g^m^UutzgeYw>V^;K5w z>T9gB)z@43t8cV2QQu-EslLtXui8$l$7;K+PN?m*TB~-zYO>lPt4g&aR`F`bt=!a3 zTIs5twh~r5YxP_8g4H9{OID{;uUKtTy=FB_^@dfm>Mg4r)jL*Us`sqyRUcYusy?<7 zQGIIlPvyDQOO=;aS5#hG9Z-2|wOZx9)pV7QR?RA(t@2gATE(b*xAIW=VP&fF%SuV* zkClMRKdax$4A$3_8Lc-dGh6p7vs&jUvs-&9b6RUCb6K-1^H@Ju;B6;-SQ6jiOw6xFR| z6g8}w6}7BiDQH_?RM55Fsi1GYP{F{uQ^C->NWs`TTEWEHMZwHkPr=+;Lc!9SNx{nc zmb|s~26jN^8)=OlftUG0* zt@C7Jtb=9ZtSx2YtrcVvtl4D}t?x@GS#OX|wr-S8u?~?=wN{r-xBerQVSQ05(|Uze zmUX>Uwsp8vjw1Ai>-AfORTvhORZl@lvy8_ zD7RiNQDNOKQE8nnQDyBZQDvr zR;1fHMx@8uMx@tTMx@vJw{V~JKH)y=CgFZ-ci{=vyuuT#uLw=Fo+C8TI!$PjwV}{t z>%W4NtxpL~v7RY7)jC6PsDJE#rd#h3m|;CxV5W7pz$|MQfmzma0<*0@ z^3Sne!9T}3iGQxO9RED)`+W1P7xB%vPUBl(tqESYtS9p>woc()Vr|O1 z#G0LVsr4V=+^ei*xmR0X=2~st!?niR zjcbiH6W3bn1Dxxu8#vclJ8`bJX5(CMeTHL$^%RZ`*0CHLtu;9|TEAuAWZlia$=Z;8 zv-MrJE!I73TdjTBwp#PDZL>bhy4|{$b-T4c>kex{)}7W@Saw>^WZ7jM&$7!}lV!K{ zPv$+=CzvXT5>pob^nGR0}nePzwnYHw!KkON-yeIu?(O z6)esei&|_q=CW91%xKYX{K34&_`Z3T@dfip<3r}2##_v-j8~Xz8_zYDHJ)V7Z`^6l zWZYo>)u_V!rBQ+TU85}XOGYW?$Bp95_ZUT*Z!!usUtttzKF`R{e5#SRd5@8&d9#tb zd6ki?d7+Vud8Uzzd4iF%d4!R(d4Q3Nxu=nfxucP*xuuc2xsj2Fxt5Waxw4V3xr~v& zxu{W)IiFFeIlEDWIfGG*`A@@m^G}A!=C2LY&7T9o z7V|xZUFO>i`^`5PPBmX?INN-Y;X?B{hRe;T8m=|(Gu&d{Zn(?5(eR*omEj5V62tT6 zxrW!w(+uyLCm234k2HL39%T60+}rS%xvL?gg`FX*g}EVzg`pvjg_fa!g|eZDg^Zzu zg{Yy71)rgU1-qfD1%sic#ZLoWi%$lI7OxFVEuI)yS==?Sv$$s9WO3fW-Qt9Sx5Yt& z0E=A)Ar_krA}rPz#9AyhNVJ$|kY+K>Aj_iPAm5_HpxC0(pu(ckpvI!epwS}Rpv@xL zpvxl0px+|IV6uge!3+ymgE7<|FH1a z|6}2x&uD3=&uXcx&t)m1&u7W1FKqcuPu%jko{Z%UJq62?da9PY^)xNl=;>L`)ibi} z*E6$h(6hEI(zCZr)^o88(eto$)AO-3*9)}N)C;wg){C^{)r+(Ir<-K?K{w6vk#3gd z72SNxW4gtbJ9Nt}SLs$;&e5&6?9*+wY}D#*+=$y8ktaIM7 zUFWi8mCkj`Je^yXNjmo|LvTEnjK> zx4f*)WVJ_|&1$JOr&Yf;uT_P%fK{Tlu$8yAxRt54l$E@;oE4|GqSa?D6|1{i8dfK? zw5>L4=~>OyGPLT@GO;SrvapKRvbOTlva>SNa1Fjy)7R>fW`Nax z&0wq5nqgKmG$XBAHDj!bHRG)kG?T3SG*hi?G&8KUG_$QFHS?_4H4Cl2X_Qz!)hM&N zqETseM5D%PvqrtuB8?`iNg6FyO&aZ1#Ts2!$r`;@AsYQwE*g`pOf{xjscB5N64RJv z#jY{e>XZ6>tE=jZthTE!v6`*E+^SxErB$-}8Y>U=byhm+8?6M@H(PyE+h%n~ZHLt% zwcS=L)b?8SsqMEaQ9EQ6t#-u9N$r@GrrHTB0kzXs-&N0A-B&$tbzJqL)q2&-Rx?zu zSv9EMu*y`uWfiP?$I4dqo|U@l11mw*M^=ASo>)Csd1iG<<%QK=l~-0PRo+-lRe5LC zsPe%oSLKscl*$(?ca?8eCMrLy6jgp%@vHo{`lZAwqHEU)?4eM75n%0*Tw5@k4=vXgQ(6jDR(6=sD zFtmqw_qGf1aeUzJL;UM-bj-7J-99VL}zZ7h{-%`25-{aiBF`jBLv^*qUZ z>nh0t>oCbeYZJ*LYeC6k>kkqo*5@Tkt=CDES@%nnTjxtuSO-c}SQ|@JT8m0lS$`6* zw%#dTW8EZPYwaywYb_>TXZ=X5-g<*rgLR!)gSD?%qqV$Pll3RjX6s|3&DOI;TdWI2 zTdmzi+pOh8+pNEfv|C>gX}4Y_(qY{y(rKM2(rN7=(q*k6(rwKo(rtZ0xW~FzxW_tJ zxYt@*xX=2rP`~vWp?>Q!p$XQGLKCg|geF?w7Mx_gN^r7umEdG+Z^0?nvVv2sKMG8< zJ|Qs8dcMGP>k5Gx)`0>ut+fSaTC)kvvOdZ`+q#Z_wzVby9P4jz-UZgvco$ly@-DPC=UrsY&AZt80nZZaZ9Ge?dw7;wC-E$^w&YoEEy%On z`YQJd>kjUf*0$U$t-o-svR=cr$~v8EwY4(W8taFgYpfS?uC-3)Tx+eyxz74E$2#lH z9P6!XI5t?jb8N5{;n-+>lzpRh8v7<|F80mV8`(BnN3(6Q=4ab#eT8+a^-R`n)^V)c ztyNgJTfb!4VZDK6r*%2YPHP92UDli|yREM>@3vmdyvMqnd5^UZ^ImIJ=6%+z%=@jM zG3~d$$aKJZC(}Xe`Amnbo0tw+r!pP3c4s%&ApA! znp+zmFxN5OY%XiO!kpiDt~sOe6!Wh}-R3Whn$7PRRhwThDltE5lxM!nDARnsQHuFe zqj>Y#M$zUIjUvoDj6%)pje^a~i~`Mbjr`41jQq@FjC{>QjC{>~jC{>qjC{>)jQq?^ zjQq@Xi~`J6jRMVOje^a^j6%)%jUvoBjH1jLjbhDz877#2HcU2uW0-FK)G*upo?*WE zb;Dxwi-zUqrwnV%4;wa`?=@^Q-)7itzQJ&U`AWlS=8Fwyo6j{|XgVG32sPHRQ99GZeBAHx#oFG?cR7GL*AmHdM0sW1wd7)j-SQoq?Xka|2_G2L|RA zHw~;UE*aQcoHlT_IAY*ovDd)IVw*vL#d?EKixmcu77GpHEM^%bSxh!av*()dY_{Mx*lxjYu*ZVI;Go4v{i7C-^iNq_)<0))ME|nIR{iT1%k=M9OxJ&4 z(V_p;qDudzMYjGsi&*_n7JmBQE$sDwTNvsySSsnWSc>R#TC(c%T7J_LvV5T@W_eRj z+VYg1yyYG}Wy`gC8kY0)bSx+68Co{#nOYX>Sz4y**;$6^Iazw>xmjB2d0T4h`CH2B z1zYm#MOZTG#aMpUO|X2bn__ugH`DT@Zm#8S-9pQ?x}}!$bt^3=>DF4d=r&oF>9$#B z>ULR1>-Jgt=}xkA(4A&!tUJq6O?RH9gzh3sZrx>;|8!Pae$rWI`BZ0<Qbe>yk z>AbR((|Knpr1Q~|P3NoSSM8sc_q6|59@l2D+MvyBHA|b_s#%-MDp#A&DqLI8%28Xy zN?TjPN>p3g>c5tp)hjI}t1DWnR{OOytX661SWVT^w`$NbvdY#nwF=j=uyWF}w$jtG zx02FwvSQP6wfd~-VRc{A+v>EYpVbb{K&z#iAy$(#!>#HyqpWf?W38ez|1qGpvL)v#l64^Q=B-6k6TaD6u-HQD(JIqta@vMvc{6je4tIjYg|ljTWn1jdrV8 zjV>!cjUFp|jeaWwjY(FD8dI!wOTb);VYPDPCh1D{ZS5}i%-dNSEytT?vd2bb=^3lpw<+GKM%2z7|mG4%(DnG5h zEC05-to+w%gYrMCUS$UBEM+EZ4`mi>HDy+7R%LeUCrX^whn2XkmniXAw<_^jrzr_o zdngH7Ybyy`^C^j1e^eB+zN#o;y+cvTdak0hb(5m3b-JRwwV$GbwTYsVwX~wLHIt&M z^-BeH>x&8+);krntQRS0TX!kwS{EzmS;r_CSi310S{o=BSxYIHShFgaT0fLGx85#q zVcjQhX`Lo-ZEYuSV=XRkXZ=CW-ujfBgY^^~lS;FW zlS;QXm&&jfkjk=tEtze7R5HhUkz}rQon)SMv}C@urDTD%xMZRAH;E$as}jZ5TO~@Y zr%9ApmrImdM@W=eTS=5#%Su#OGe}fgpA@gMo+Msn9V1?Ctu9_;{aLKm`hZxSb)Q(B zb(~newVqgm^?%U@>r0}I*2_hktZPM^twThct+hp4tXV``t?!DoT5lI=vz{c(|U?p zPv@Uy9n3$=T7ZAH^*O#d)_r_)tONMwT8r?_v%bSS&w4rUeCuM~1=bF{3#;0Uots6PlSi5qrwdUenYki4ho%Jk^_138z>#YqrHdy~>-(WqDeWSG_`zGsW zY@4k6**05Svu(D1#k$3M4(nFyB-X9gI;`8Qzp-q$KESfwx|3yxbqLE&Yk8KP)~}g& zS?^@tZQa4V+d6`IkF^%_9&2Xiz1H`b_E{fd+HbvzX}|S!rUTXuOb4ygnGRX|G99uu zWIAju%5=o~2jdazJB&xI4=^6JUcz|Hx`XkUbuQy^>tM#?)>e!stQ8qgSaUL-u>Qet z()ty{N$cATr>svioU-1@aN2q;!x`)O4EYu!Ch->RCV>`TjGZlR8=F}iHrBFOYb5m%`E#Rb=C_Ud z%+DLOnIAT)H{W4YX};E|*nE*up7{);Eb~62H1igtB=c&cc=IBoSo2JyX!8W4Nb?Az z2y=g&DhzPX>_Gjk8a zx8{z9U(Brx|CpN?GFs>wvRbGaa#|=D@>ob33RnmkidgU%N?5QO%2@m}P_X!6pkndS zK*QpdfsVyv0|SdY1|}9)4J<6q8Q54HH*l~xVBl)8)46ZI+vn@C1=36e( zEw-GhTW;B|TVq+J+hCca+hQ57+hG}~+hggXJHgUicZ#K!?hH#=-8q*0x(h6sbeC9u z)mdTrLT8QT9i0u9=XJJN9@g1zxlL!c=Zz(g&U;G+ozIppwZBGi@O&1#M9)Zf!}cuUaxz547a1PHQP!ZPQY-TBxOI)uW|j zRj#FPm8@lK<)>w4Wu;|lrKV+LC8T9<^b0h;)eTJ#tD~CURvR__tmbJ3TJ>m# zSXF9wtA(JXLVDf(CUOniPa8`GOOhp zl~&U=YOLBd>aEH(8m-bbTC5^8+O0e^I;|`T|4?tIxCQR$pk9ufEtSSbdq5h58CB8THjxOzLZ`UZ`!bI;XbDYKz)dt66H>ts2#K zS!Jm0vGP~jXJxK-&`MtIuoauyQLFc=$E~ibp0e7ndd6yn>N%^4su!%PR4-X2t6s74 zRlROyu6ol-QT4VJkLq2kZz}h#9;!UFI-~N~YKO{Gt0gMWttP0vw5nBkZI!9=)+$Wp zy_K`dM=L{>&sK6OU#xgkzFB=${$X`d`Ipr?GWFDl=QND6?8W zR${Y0ti)lxSc%KJMTy%wRf*TyU5VdXQ%S&@M@h)~gQAG_6-80&9g5=Ca}*`58x^Ij z(-dW_eH7)ajTPmsB^4E|85NbRUnr!NSI#xl~+Fe24 z+EBs3T3W%-noYsj`jNbe^-g&+>xuH_)|v8_){gR4)>87;)?egotvgUbgXrXfbfWcLsU+*oQpwg`QYqF+QmNL~QfbyAQt8(3Br~i}N@iLwmCUkkl+3n{lgzQU zmCUu4mdvyMEs<}1TcW^vw?v`!9El?9T8U!oc!?5gM~PBv6^Sxy4vBK>8{*~G3&ks} zv&Ac|&BUv$nZ&EDFNjrJ&l9V$&K0Y*wiBzf<`=88ek59Ny;Zcqx>K~lI$pHV+FZ2J zT0peP`lU#-^vR@c*5M+p)+Qot)bgSZfJ)T7MSm zvfeM$ZQUc(V;w2fYppKSYyDlY&-$2Pzx8y%3D%i{6Rm9oCtC9hPO^R?Fxh&Sz!d8V z0#mFr1g2U$2u!n<5twHEiGRBFTK*Z)}MLj zTJPeWYu(H{&pMEIzO@4H0_zVv3##eV`Z?God$dt>-ZBvd(4RZEerI+ggZukM%RAJ=S}f_FB(n z+GpL&wBNdzX}@&>(*bL5ri0eTOoyzcm=0MpFdepj%6P>36yp)=^^8ZYr!XG1u4FuB z9nW~o+LiH`wGQJkYazzt*1s5zTfbsBVSSt7g!L(glh!*JPFgQxIAuMLp~Qm6B*o&d zahSzpV-Jhd#x@pPj14U28LL`!8cSQ08Vgz^8*^9$8Z%fp7=JX^H-2m`Z+y*M!1$y& zlkq&EE-8{x9#XQ6)+1%SG(cIZ6!Q9#?!Q99w-dxKl-dx!z!CcxX!CcrV(VPc- zc2A1=U&A!>Z-yD>?+vrfUl`_^KQt^bzhzi#e%Y|h{ET6h`7y&f^ZkZR<~t1A%r_c# znXfkNH(z2n*?g|y4D;!RbIm6hE;8>jTw&f~xYoSZaI<;2;ZE}c!~N!2hDXhl4NsfL z8eTLHGrVr@Z+Oq#)9|Ueli_P~8^cfLriMSw^$i&;Gz^(76b;!eqz$<(L=5>X_zZei_JFd^S+Dcw?Yy@ytNe;=X~d#SH^Pi;D)P7N-m>Ee;#lTI?}!ve;_i zX0gt|%VN2KpTz=$Ad8s>;TDq&qAhw1;w@SYQY`8WGAzmsax4lA3N11XN-dHMDlMW7 z>MTMGnk;+`+AQ1*x-IMt`YkLBrdSvn%&^cjm}{YAu+T!zbu6G|5>o;Gg*GqW4C;v$8C92Pr&lDo`~gMJqgS8da{-a^%N~9 z>8V<_=xJG&>FHUf>ls-_>X}=5>sedc>e*ZB>$zAe>UmfS>-ku+>IGPS*A20Jr5kB^ zM>p2;oNl7!LETi#&AOSEOLcQCXXqALcIlQ`*6LPS=Ihp3Ch0a=hU&IidgyjpTIu## z>grCiRM4GfDXcrol1+D>HSw7HNWqDa=t>rPDjh4G~wpy;!*=e~@XRqZ{ zor9L0I!7&Qbxv3o>YTAm(Yat5p>x^NN9VewgU)SB6PpJkIalU0s3t5ujbr0DO=6ZQnzZ>(z43e(zS}#GO%*fGPW|(GP9D?vb5sXvbFlI>0tFl z)7k2xrkmA1O;4-Unm$%DH2tkwHG`~*HAAfuG{dd@G^4C+G-Iu_G!v{OG?T5^HPfuV zYGhbF(a5&CtdVDRNTbkdlSZ-CLX9%3i5itwjT$vpMH=;1Ng9n-!5S@A&Km7jCK{bq zsv133VjBHc92yg?zNk;Jx~@LWYPb4KtNH44teVy5S*5ElwDMM8Y-OOn%t};!h1D;$ zRaOtw)><7?TW_^SZIjhxwJlavYTK<6)plBWs_nKiRNH4Isdm7MQSFe`OVy)RmsF2i z?N&W$wM6x_Rj=w%j%2D9jp5)_pDB-Jh0lP z^2lnD$`h+Tm1kB}Dle?kRbE+zsJyXqRC#Bmukyi4M&*+gx5^i*Ps-n{&MSYnTBH2a zs#E#5Rl4$DD_7a#q%tg^m&*iO$I66QJIjPxYs-XN z3&})Sf02%~J}Mn$Jxw~=Izu|f+FCl+nqNB3`iWG$^-ie->wc*u>olokYdfhFYjLSm z>rawt)@LQttyf59Shq@MS|>?nSvyE(Tgyx4SpSpAwZ12jXT4t{-+F;WfpwEap>>Kx zk+r)-v9*>&u{EDWiS<+QQtNf%W!9DA<<>6Z71n~{71sB}Dy`RwRaw`FRayIrRa?u6 z)mVQJt+75LT5CN+w9YzDw9eW^wBA};wBGuQNQ3oxkw)uPB8}Eq_n=)@IyGt-o+Bv);tD+`5QsxwSFZ3hS?&E3J2M zuC%V@TxIRdx!RhGbB*<7jy2YEIo4Wda;&p9<5*|S%CX*h4f}fQ0QL>m-`F-vgP~t&>@|SWB~RvA)K#)p`NTHtTGbZPsQi+pRfRc39tH-eJ9ld8c(9 z^G@qP=3UmR%)70BG3~a#z_iDDIny5N2By8%2~7K}eVF!J+cWLA)@3?iEy;Aynu+O< z^()3h))yHMTW@DPY(1Cph;=jL5$jCGqt^b6N3Bg6k6KGJ9mE<}(aunNKvFZ{BUV#Jt6DrFosi-@S3@o;aziQ!^h^fhOf-c3_q9~7=Aa`H2i0- zY{+CGW5{M9X2@y5Z^&!GVJKk1WGG_s+d#tNtAUKgI|F%(7Y51}4-M2UZW(A>TrtqM zIBQ^Ram>KnV!wg4#SQ~|i;V`(7OM>0EfyPiTg)}^x0q%SY|(EJZqZ>7W6@}kU{P(5 zVo_p{X_0G?YmsJ9Xc2EvY7t>jWf5plXW?zoWZ`VkZee54ZDD3G!9w3)iiNtt3=0K= zxfYTJ3oV2UmRfKdtg>J>SZDD=f3w9a{p}Wa^mkjF)jwddU;l{32K|#3i}cT0OxC|> z(V~CNqD=pmMY{eyi%9*)7T)^LEo}7PSm^10uu#zdVj-yi(}G$5ufbSw{DB2ooB_*itYqUaos7FT)HzX|LV-K{HU|Q@`=t8%j-JJ zEl=sJw%n()-g2YPX3M2I+bw76?6&OH*>BmXbI7t(=a^-t&MC`SopY9fIu|Wnb*@@k z>fEr@)wyG-r1QX1Oy{vBx6X6R|JtuCUueIxyr})ra<}$Z%O%=BEc>+oSe9%5w@lP# zw({0yvoh1>v{KOKwc^$mu==JYV)al<-0F;$l+|`ES*yibidKDEDpplm>Q-r5T2?_? zdRBH?hE`fyCRXBF=2pyFR#qQ0ZLRKTI#`|5bhg^2>1MS=)6;6ArjJ#jWnzK8ktt-G_tMsYUEk1(I~Wr_o}iuhC|upwVe1sL^A^tkGxnQhlP;S@kJa8`Y;-O;ev~ zRi!@LDqek_m5cfUD^2yqR($G9tv;)*u)3+X%4)yb8mnb$>#cg!Hd+;{ZLx}0+h*mY zw!=zGZMT(>+Fq;Qs{5@Ts~)mCqk6<@o9Z#E`Kl+ZI#o|w6{()Jicvjp<)(Vk%24&P zm9*+rD>l{ZRv%SvTHR5(ZFNHBuGMCh`&RQ+9$Iy)JhrM(d1{ra^4uy&<)xLq%4;iK zmA6(>D(|g0R6bh0Q~qpqTKTKhO6BiX?aDu_Qk8#MxhVg!Qd0hB#iYz&{ZNU~`j8T{ z^&%x!>t-c3>l7spYd0k>YYioCYi=c8>vxL$))y58thXu(Sq8Pb){7-_ty?AXtTQC?t-U1*to0=dt%W6utlx_lTkjMvwr&wGu?`R~ zwU!kxvwkgBX1za4ej)LTywX|T=}X|(nhX|mQ7X|m=JX|}#7++saRxYasDxYb%hxXt>mP`mXK zp$_XDp$=lmi0^CS=O6) zXIt0s&armqontM+JJt=ltg#N@ zSZgiMvCjHF`#S3;_Vv~p>>I2vvTd-gW!q@2&9>3{4(lfC39Or~-B~wVGq7&4-ovuR zx`t(|wHM1aYYCQZ*3X!?TW?|BZr#be!#a+6r?m<5PHQgaUDgkoc3bac+HF0FX^(Xd z(;jPgroGmhO#7^5nD$xoG3~eh%Xq;0CF4Qs%ZvxD_b?u^Ucz|Dx{L9!bs^(n>oCT{ z*0zjCtW_D0So1I*wf@R*)cP*NQR_1d$EV)=SEk|ZyKF6 zKV!7t{D9Fm^DRc}%vTsKGoNEL-+ZFc4D)uQ$>udiz2-$m9p)KEE#`4X4d$UnwdOuX zRp!n{73S7PW#&dkCFWX2#pX&zMdngQMdm_AMdn;aMdnOKMdrT^i_Je9mYBaWEH!^( zSZ;pTu+sdRVYT^r!&>tbh7IP244ch&8@8EmG3+#7YuIbP%y5GF0>dfhGYw~$Pcocq z-eb7Xywz}-dA;E(^9sZD=0%2E%(D%5nWq}=H;*?wY948L$~?&Mg1L|3HFHG0Vw%(w41y@|G2P%9dGr z>XtEjI+lKV29^$bCYDBe7M3b{HkM*~j+UHyu9m-bJuTnr`dU8F4Ya(h8)kV_H_CE{ zZk**R-6YGox@ngEx>=S@x_OqRxc5bx^> zx|1v!b*EW=(V1oWLT8@kZJkAy=XI7^9@1H9xlL!S)_!Ao zRQtWbjPQ)gdhj zt94q^Rx`EatXj1ctqQeNtzxw_tUR@}t<1Fatdz72t@yP}tbS{nTfNYi`86BcdITU~y+)hAjlSD$Rvqdv{5Kz)W)nEGrhYxTKSis}oj*whzUy-{0gbxCcx z)ef~)R`b=?ShcCGv&vQ5XceNi*~&(3tCfn{4l5qDT~=RJ_gLLi-EVbV^`O-T)x%b^ zRF7IUtDdmRRXt@Dp?b#3N%fqSuIdFV3Drwh%&J$d-l<%-x~X#0>Zr&uS zx9U`RXjP{2*eY4&sg=LVb1Pew7gky-udF0g-dM4zyt8_x{K4wD@+YgM%3rLSmA_df zDgUr?RQ_qDp#0m4LHV!M1Ev2~2bCDC7b-DXHz~1Lrzo*myD70-YbbGAb1QLMzft_lw*5?%DthXu1ThCWe zv~E{WvMy9mv5rD7Fu$ETPvSw4zwtgb7YrR`u&w7fyfpxCDp|zX5k+p)n ziS;izQ|qg8=GGhKEUbIwEUmNTtgYSUY^+t~Y^|B)?5!WkI#?f+b+le6>tx+1>ujAQ z>uT*R>t?MY>u$|1>tX#$#?$(&jJNeh86WFuGQQT;GJe*HGXB;cG6B~5GC|g2GQrk= zr9-UGN{3p{mkzTok`A|am5#8Ml8&@~FBNTlL@LI5wp6TjkyM9pGag{AC<_mUM`Vs-6@f6oh^}L?I)3I zZ6uLrEhdp~{aw7k`jB{`b)R^lb(DCKwT5`H^*6B+>!V^N)>Fkwt<%KHtS!XKthvR? zt?!FgSZ@}su*C4gSD|pgSC)I zqxDnaChO(G&DNR1E!MiiE!LlfTCH~qwOKa`wOe}&by$lDbyz`ECjS&`HU6pA zPx+=0lx4H^B9<-INi18eHCVP<|6tx`eUf>b^(^M?*4fP4 zt!)#AVtRFEPu|Cdl#CjLQ zQR_7f$E@cvG+8_~F19#roNBSzINV~kvA0F5vAsosv8hF@v9^Vmv7&{!v4n-1v4Dk` zF{cHaF{8zIqi^Ofj9!`FGP-Ae#^{Rqexp<7n~e^dFE`p@KHF%6`2?et=B-AH&8v*& zn&%r$H%~R1Y#wdYXC7qKW$tOzZth^zVs38KWUgn_V6J9VXD(+{Yc6V3W6o<-ZO&>` zZT`=&+WebgwfTF)8uRCdwdM~D>&$N$)|+26Y&1Uw-pki&zQ?e`e5+x%`Fg`X^A&~@ z%@-O@F`s2P!+eV2Z1Y~j`Q~kgOUxS#SD05Ct}!n*+-RO-xXnDxaJPB9;Q{kV!=vWG zhNsPa4KJ9x8D2AYFuY@KY536G*zmczj^R6VHN!9F@`k_6B@G!YgbbN2cnsMsSPi)> z{u}UG{4fx-_+%hr@!CMb;;Dg*#XSRgiyH>Y7MBdvElwL~SsXFYv)E@~WU<}A%wnT~ zmBlIpJB!5zjuvwaTrH*=cv|!u_*!%r1X?s2gj!S?L|POZ#98DTBw3^xq*=rpWLZQS zL?=6`0KU;j!`)=_}@3+MbJqF8DdMuWE^f)Zn>+xDH z)DyIvtS4&OswZh#p(kgVrKe;WtEXn^ucu|{sHbmfqGxQWre|&`p=WK$rDt#XSJ&C{ zy{?DlBV8ZME4l%e$8|$2cj-o0uF;LLoUfZ;IY~FgvQ;<3vO+hI3b#_@6>g=;j)j4PxsdLoQPv@kilg?R7bDay8+B#P(6?AS` zis;<7KV zvs!U$b69=T;0Yv!=UMp{AEryr!>}pJsrSjb^Zw zmS(7xq-KN_hi0_Zca1o!XBvrCS2dEYj%cJ=ZPv)NTC9;{HCZFis!5~Jsz{^6Dp{k< zDp;e^%0;8v%0#2iN>!uLN=&2KibJE#>a%)>)phl5t6l1SR`b*+ST(Cpwn|r@YUQIo z!^%i~mX(D1T&sU-^R1q!EwVbTw!~_q+H$KIYAdbk)mB@jsjai}Q`=x=rncEiPHn3d zo7#4(_o_RsZm90DI;gtOYPISCtEsAot?E^eT4kypw+dE0X=SH++DcRPtd)rB1*`um zm#ki?T(P>Qa?R?H$_=Y^Dz~g=sob$@SGi|Ztn$DrLFJK^ugViEYn5kK8Y(ZW#8h5c zv8cSZdZzr=>WK1ttA)xRts0a+Tg54VwX#$GZY8Vy!|I>XFROb>f2{T^{j*x2#9-a1 z#AuzY#BA-V#A>af#AeN{#9{qTk<0p`BDeKcMPBP!ihR~}iUQUtibB?&io(|VilWwH zielD(6(p>mDo9$NRgkvcsvv7UPeIPQT|vRRP(jf;Nx(iT)>~yft!K%2 zTi46@Sf|MNT6@X(SsTjuTT99WSTo85T3?b5wq7h9VqGd7YV9cq&y0)+vHr*5-oU*4%>K){g~xtal6aT2B$^v(6XjxAqq3 zw^kRJV9g>h(fSDgBqO|jm`H`TgqHm-!yA(zUkK2c&A%0;+>9jmRLXGTxz|ZbD4ED=W=T|&gIrZoGYyFbF8#p%dyJ3hGUhr565b2 zS&lW<_t@81x3I6Z)?r^~eVuKcbt~I?Yg4uj*3VftSkGbIXdTSD(VCZall4iK&DI?( zo2@-rwpjD9Y_Yzo3v4_GHK9^9D{SZo|)(PJE7QD*FF zk!WmX;b&}MVQs8tp=m5_L!C}m2@xzGS;-wLT#ciW6=4Xvwn(sHdXTHhkiup35 z)8?~`4x9HG?KW>V+G1W|wAMV=Xt{Z^(IWFmqq*k(Ml;M^ji#8}7)>-cHtI9iHtIH4 zGU_y!GHN#$G-@;FG-@?xG-@&bY1m@^$*{%zm0^qdBg0nn+lH;?R}9&42GN*zYKURz8DBtyfqNEcy1tW@xVaJ;+BD&#bpCUi?ar*7RL=V zEDjjxSnM<~u-I&1VzI`+++vx5wZ(h`dyAO{&K8pl+%38dye(P`{4MGXf-TAo!Ym35 zqAfBF;w_R5k}YBk(k(&_vMu}#@+~|JiY=TB$}Ox7sx3?m8Z7h-S}fEJIxG|ndMqRj zCRhj=Ots)Km}$XkFxTR*{z8lQ`pYaH>aVi6tiR6UsQxC4?fTm-R_gDzn61CxqF4X0 zMZNwBi$eV~7RmY-EJF3KTDa@qw6N5_YoV?G&_Y)KsRh6OD+@;bcNU-ZK3P1~`(|-n z@3+NCz5f<_^q4Kz>9Jcb(BrY3tS4aEswZMup(kOPr6+3{tEXt`ucvD1q^D_Vs;6tI zu4iN^rDtZzqi1FLPuI@!qpp+XV_i4PYr0;RCw2WS_vi*$uG0;-T&NpuIYl?#vRyaX zvPw7IGFLa-GC?=rGFZ3R(oMJA(n`15QdhU$QbD)LQbf1Sl3lmU^0!W(_XRT$g&IZdyoh_E7Iy)>gb@o`s>g=}+)H!VF zrgPlVTIZCdzRo#I6`f0#k~&u{d3A1DGU?p0e6Rh$@`meI-vs?*4`%F`&ciqj~u^4BP{ve&4zGSH~DQq-uk64Ge2V%BK3dZpfGbymH@ zYNL9$)l~Ift19&gR`KeStX$NmT4}0Jx8hfyW%X5Uj@50o`BsP27Fw-RTVgd)ZJAYt z+DfYgwbfQ0YHO_w)HYa2sBN-hP}^elQgyr4CDol)dsKH@EmhrX)vtQMs#5ikRf_5n zD?im^R+g$KtW;D_TM4M1wfe1c-s-u^MXSpym#y}zT(w%Qa@}f%%1x^lmD^T@DtE2o zRPI}Ot30%_RC#Qrrt;KEMCG{^v&u`WN6N3Q4k*8|nydWIsz&*PRkZRaD=XzMR#M8} ztbQqdx4NzL(`t{>Z>xDqf2|sn{#zv}F<84OF5{v0A@XWVgPk$Z5S*k;{6P zB9C>wBCmCdBEPk#qM)^bqL8(iqKNfh1ySoK3gXsh6eO&-C`eh)RgkuBSCF+XP>{2Z zQc$pVQBbtjS5UT=Qc$sGRZz2jB(HA0OJ37@lDw96j=YYwo4l^Ig1o-vD$H zo8^qH`{himbLC8}z2wZTHRLR;+2t&)pUGNVACtAQUM_2E-7afyohj>J?Ir7Itt0DX z%`fY0{Yl2v`l^hZ^-dXg>v=LB)=e^=))_Kh)_yYH)+RE(*3vS5*32^g*4L#2tXD_} zT31U4S^G%`TPsP2SbviWwLT*iX1!P{+`3vS(mF&c%34<{+L~P|#`>XTto0trIO`db z@zy1h@z#No3D$a&iPk)lN!G6hNV6`KNVg7=NVhhZ$gq}?$h2mZ z$g(~so^3r_Jli@$JjdEpJlC34JlFcFSf2HAv3%=Fu>xx!u|jKku_Eg)qQ%xHMN6#b ziEHw4?QmkYLAmkD-Qy9;(&OA2;b zzZdATJ}S^{Jy)Q|xq-0*tpoWdS_|?|vcAkW*?Jn^ zWa}utDb@;nQ>~x#PP1OmJKegLce=F??+j}h-kH{Kd1hJf*ZVvty8%cS!;7Gw*JJq*m@V|66+?;rPh9&%dBNN zms`K(SZ=+CV}*4u$4cusj#bwB9ILFEI96M)VP9h%%D%>$k$tW8I<|Gzact|X1=!YG zA7R~KUCp||+JtqZ^?R0$)@xZdS?98BveswWZ2g6Ki}h~iE!MrvTdk9sw^~~;Z?ooQ z-e&!nX}k4KrtQ`fnRZy`FzvMVV%lk~$+XLwgK3xb3&vg6Cm45IZ)4nTy_|86^;E{a z)~$^Dtcw}s&fHf22LF-ox2d%F#9J1ceaM*ey!(r2v`;9)EZ!&smzSQWx`Anm0=DkK|&6|vlnwJ^vGtV~KZk}kg(LCH}jk%A}a&u>+ zMdp@9^UMv5W}B-U%`lfUnrbd)G})ZjXrei*QNQ_L!#?w`hP~!*4SUU>8TOjrGwe0L zX4q?f-mnjRUhe_J3FbQuCz)?DoMOJ(aGLoN!x`rD3}->t_AM~)G+b=nY`Dz4#&DH+ zso^^Fe8WxV8HU@;lMHv6M;q=l4>de&?q_)1+{5sUxs%~Vb8Exv=B9>s%=HZ)nrj+9 zH&-%zV=iO($z06vhdICDKXXn)CJQD*R*OFd92Q> zfsDm@0|ko{2FezP4Ad?57-(5+HPEwIZ(wAx!obvGk%6VfYy(@1sRj-feFiQT9R?m2 zjRrmzRR#eTB?ciDxdssyX$CPC@dgPNkp?LiK?WHX-Uc}qt_B4bb_OLD76ug-h6Xhj z+6E04Dh4eUvIZR%;s(7I0tOQ;I1Q#+FdNLY_@O`7;{uzs4{REE@G(SK;cr~lM~ zLI0)2C%v~8PxL-nT+{nzaZ>M>#csWS7HjpGEEnjpTTasBwrthox2(_;w#?EKw~W=3 zvGmtduyoQ>u{71wu+-4gv6Rv?u;kSdde_s58fMi_Uz@6*`M8=jbfAoS?JXvQ=lDWu?w0 z%UqppmWet$EyHy7T6*amw6xPXVri^%!cs%$jHRs3c}qc^%a&|9*DSwl-?DtDeb4f= z_Cw39+D|MOXuq)R(td4OqW#`7PWzLkr}j5X6YZat^4fnaxwRRrzG*RAJ{vs$BRX*EmJ#;QZp-l|N~$tp$D)hbBS!^%<9+e%;4*Gf(^z=~Hh*y@i)nAK~I zNUPf#F;=HE;;eRQBwDT1NU@r!k!IDYk!e+_kzK#_S>Rnbv>b+Ls>it&M>XWP#)u&jot53Ijt2Wc> zvf3Q0U25~J7OE|@>Qq~7Rj9ViDpGBQm804!D^0bvRzhm)t$wL)w0f+%#p;aeHmhx_ zJFFI{?y~Aq-D_2%y5A~J^`Mof>R~HW)uUDlswb?tRZm%cS2<(#Smm76d6f%RyHze( ztx&mQHAUr`Rinxct2~ukRxv7ftUOijS(&Rmuu@fdWF@5X#EMbnnbm#e7gl?eUs=sk zer;8u{MIU5`Ms5y@<%H%<v~0Q>l8&EYcEAUYXe0AYcWMZ>%R)Z)=v~ftj{Qj zS#MDgx1OUQY2BtEWu31eV;!j=Ywe;SZ>^`GU@fVjWX-CeZ2eGP)q01#n)O6^4eM-q zO>0+qEo%jN9qZq6y4Kg_^sP6`8CXw{Gqlc?Gq(1YGqKi`GqvWBGq-*rYhis{*3x=~ zthIHgtc`WHtgW@Lti83qtb?_XtfTc;87J$TGS1d}Wn8Qm$+%g!$+%nR$aq)>$#_~@ z$aq=H%XnL}$@o~`mG-q>C+%n5ARS;GEFEaAE*)h3M=IF*qEv|W3aL=*dZ{q$FsX2B z1E~mWE~!ZCr;<_D2PLDe=Ss#{S4zfOhe^g+n@Gl43rWUXf0RhDz9^Asy-^~`dZI+K zb+JUUb(lnowUtDwwVXtnHM2yz^(FCi>-pjt*16)D*4E-#*4*OR*0;rStk;O;TGxr? zSqF*bTdRo`SpOC+w7w`>WW7SP*t$Wq#5zK>#M)4_)S64Q%=)QFx%B~&3hOx{mDZIa zRn}o5)z&5=HP*r+wbsvsYps_H*I8!@*IVlfH&}lXYP8-X)MVWz)MOnf)NCy))MEWw zu+@5(V4HQPV4HQ6V7s-BV2Aa8fe!1-0-e^Y1iGx71-h+c1iG!w1$wMS1bVHX@b_6S zxnPso)|$N2t$*{( zus+K((|RG#EbCI9S=Qb>v#k|*=2(B^o@>33d#-gb_dIJ3?)ldHxE5GfaV@a6=2~d| zmvfQzQO?EI6F3)JM{_Q*R_9!5{h4E#^-+%H)-yPkTW52uu(sn^X)VOD%K9ApD(g!2 z)z+%)Ypk!Zt+8%lTWf8`w$Az$>pJU&tn00#Sl3&Nux_xv$gSUUd+7NI*)mawHxymYgy*4)?b*mS)XRwX1$ncyLC0wcIyzP?biBCJFNMcc38h> z+-ZG*ai{f0#+}wP70SnnkX0ltqNGzlDpji-n=Fm4&>qp#`t8 zhQ%Kv1&cRE5*Bxj1TD@Paa$ZPVzt<0^v`^$(P#4+Mla2Kj2@Ub7~L>0HM(G)Wpu(k z-sq5dh|wN%FQaYd4n`Zz&5YKV>l&>vS20>@E^V~XT*zp?IhWBKb4H_C=06Q*ntwE$ zZvN76n)yS+Y38>Krj&oo?M zKFM&AdAH$G^A^Ju=5>av&C3nfnHLytG|w{JYMyMk(>&I2k9nBkLGu8^qvoE5C(WG= z&zaj8UN$!~yl!q_c-LIZ@R7NS;d66Y!?)(*hM&v@4S$$(8U8hAF=Vv(XTW0d-GJTV zg8{e2D+4}@CkBERcMU`=t{aG3Tr`ljIAtJbal}B$VxNJk#dZS?i;V_47OM;lES4A; zTg)>sx0r5VWiipf&Z5h}$)d%;&7#)8)1utK*P_56&?3_y)FRm+(jvwn)*{Rx(Zb&# z#lpiN!@|iR$HLm6z{13!#6r)Y(n8&!)aVj{qQA*vn*Mf+4*lI0)%yD_a`g{e#Ooio2-H7q z;i7-R!c6~)g@*nO3u*m37QFfoEdJ{~wfLy_(&CBUTZ?OYA1zMkeYM!7_tRpn-d~IP zdQ6s+^w=z0^tdd`_4q8a^n@&9^~5aw^`tGG^yDo~^^`3&^wce-^|USd^zvUr*i*yq#Q+1OqBXrX( zeRQ)e?RE1ljdhDH)pW}(C3UMUd3Eb88Fia2zv{GGzR>Biyra`+c|m8AyYq2&~vrIsB!D=lku)>szmY_Lq#*#&( zbWU1|>YTOY(z$5)U;B#XOYIw$SF~?i?$f?+xl;R)xs6Xqs6~(zLW{(6q72*R;2a)pWA* z(R8)4()6&>)bzHJ(Dbun*9@@wrV(uQR3pslsz#*M5setDEgErFOEeO#rf8&CwP>VU zm1<;KrE26@g=yqjxoH$ynQN3-X=s#LNorJDacNXr{ZOy7x~<+|wNJg-YLR-YRhxQ; zRhD{}mA`tgm5F-4m6ZAYMP6%hMSkml3If(o6@;wMDhOL|RS>nFs~~3GrXX&euOMk1p&(`LtRQ2p zs~~GFsUUC7qM%^?KwimuhrF`&M0r)~EO|9+7kLe9d3jCiUvk>k*W`4pH_7Q*Pmt5M z&XqH;_LeiW){--}=9DwBej#gWeNxukdZny|b(gHAb&jmHwV$kwwV|x7wTP^p^$!^b z>pL=z)(2#qte46-TX)I0SQp5+T8GKFS=-2XSS!nTT64*GSwE5Xw%#J`W8Eh0YaJo& zXRRacZ_OwjV0}$0(0Ywjkadexuyu@7h_$Iys5PHdnDqHvq*(?qDZB+y-1a{oJh6xAK_~2y}~ut^}@B* z&cb!p9K!Y1=Y$%prwKJ!Cki!M>j^bk{}F7qJ}uZ{JzKEFI!Cb8+D@>|T2Qdv`l&#> z^)7)9>xlxL))@kw*3JT5)^Y;f)?fL1tT*xZS{L#6SsU^9S%2p1x8BA#!McWTqO}X( zBx@eN$=26+CtEM%onoEKJJs5XcbYXP?=maTL*8E%xtgmn`w4TMe$U22{v9%HBVrxduCDs=> zmRir}SY}?^IOvahsuVP9qag>ALSM!VA^K=g>k#}WybB+TN!s)&tTkPUBkH3x{z^~bqeEd z>tM#+*7l5hto0c8SW7eRwPt7BXZ@LBzx6$a{nn=#4p?tzIB30=VT#2f<5r6<;|hyn z<7|sK<9G{C;}8o|V^0euV|xn$V>65YM!FX7jZ`h}8_8K*FcP;oXe3~<*@(+xsS%6C z45NSMJw{*5>y2KSml!=V&oH`W9&2>jJlN=rxrfm)b33C0<|anF&9#iSnJXG?GM6w~ zXU=c5+MLa3h50|jW#(TEmzcjbTx9;#aH08K!v*Ho4CkAlGn{9B%y6Fhe#80Z+YRTN zZ!lb7zS3}^`69zb=Cci#m`^cWX5MSK!o1CJm3h748uLm+(AvID=Glf@%~K6`n8z9J zF^@1jU><0A*xcLjxVekrX>&Wn3+CpASIi9!Z<=cx-ZNJ*d~7af_`+Pm@U6L!;U{w* z!yo2shJVff8!%e@G+?p#Y`|{u#(>M>nE|iGeFFiDn+C!bmkq=$&KO8p95ax$IAEY) zvC}}sVzYs|#To-Gi)99S77GjvEoK>*T1+;uu;?|gv1l`JuxK!Fwx}|2wwXiqHw6HM9wJP2KG>b?2vn;OY&$BqLzsO>j{xXZT`l~D!=&!Swq`%ps zRe!rhh5l}fEdBi!vHFKC{PmApIO?CaFwsA6p{9SuLQ?;R1-Jeki+_3#EI#Nxv3RWa z!s4pl8;cWqA1rq1eYIGt_tRp&-d~GJdW@DWdaRb^dYqP7dc2k~dV-ezdZLz2dQz6A zdUBQ;dP$bd4;Z>zY~K*0r)cr)y_{mHa$PUWS-O6f zy}Ch`4Z2~LCAv|T>AG>2QMyT%e!6Lvj=EWvrn-5Snz}`nGPd0c0L+2t zY_bf}*=p&gv(wUAXOE?U&H+nRog#;fbWU3`>zuRvsC~)uw)R!aW7;<@H)`Lp zoTL4~vQ7K3Wuf+S%NXrfmhRebEseB4TFPpFvEa#cfrq#b=eNC1e$*C2HlQC1ItnC2b|6C1=H{rD*kCQ^o3urn=Q7O)aYfntE32 zG!3ohXqs4cX_{MAYFb&PYuZ|cY1&)4YC2gNYr0w~X?j=*X?j~RYWi7y&0! zUL(wEzec3hdW{&X`5JLn{Thi@^%^Nw1sdsA2^yJJff_khP8xYu#u|lIDjFqLq8epZ z>>8C;AJnU@uBg{pZC7uwnyub!Rj=M^m8{-j<)PkXrK{d!C9K|W^+Ro<)qS-oR!7yQ zS*=lwUQmRL!tEw^G;TWR%Hb+y$s)pb?}R5w_yQr%=V zMRki+z3O(WOx2xMA*#Er>{a(#X{jEt5>q{7#i)A3>aEH#t6M53td6Oivf8Y2#%h7e zIjdfki&oVtm#s2Xu3CkuT(@#jxoKsja@$Hl<*pT<%6+Tf$`7n=C_l2=ru@Weit;n7 zV&xZBLCUYJ43*zl2`ay}`lR&U>XOn&t1U{Ot)?n{u_{;kW)-FM!^&3amz9FjZz~q1 zzg905|683?WVGI_$Yec3k;S@Jk<~g`k=@!$k<;2hk;__Kk;nR<0jlb5&NF0W`kL0-u^OJ3R9 zMPAifPF~IWr<{iMRXI)TO>$b+{c<|ixpKPJ-g5fZT5<-~oN|WNFJ+CbPs*BDuaY&j z?v^#P&Xu*W_LsG^Hj=fn7L~QJ{wZT?eOJcL`jCvh^>P^p>s}cr>tY#a>qr?FYkL`2 zYc&}+Yd#rw>(|mA)_bHqt$U@ttmCDDS#Of^x9*e*uuhZ;w6>HA zvKE#Kwtg!aVtqm~)Ov|zn013>xOJ>#gtd)igtfF}r1fu!DC^r2(bjt;Vyx#%#8}r! z#9Ajx#92E_#9OOLBv^AvBwF7SPqJPmo@`wvo?`7Ho@y;Do@V`6EZusmScY|{Sf+KX zSeCVsShh8XSdR5Q(Om1TqIuRmqWRWoq6O9tqJ`GdqD9u}R@zX`NjpB8AdUMSFRT`ACE9VpOYttHTD%_h)geVo7B zx|zSn+KIo{nw7uL`UGE}buVAPbuixqYiYiT)=zjRS#RK-WL?WU+1i_TinSE)RO?qf z)2w&%OtbFgnQooJGsD`3XQs6%&n)XZ+_S7Fa?iGQms_u3Utt}^ zzQUT9eWmq5wpG@pY^$xc*;ZRWW?f@Fhjop0IO|$#Vb*olmsr+WPhweb9m2BST7qSR z^*!bd*2|bTS{E>Hw6dnuBq#^>>E7)=wDr zSzltNXBA|k*LKoBYuk+Mw}MiMl2TfM*qxR{FmV-^G}BB&0iX>HGgQh+We;BD)UQ* zE6qq;5q(C!vp5QhKJ3443C?;8J;q?H#}!gE9+ggDMLVgE|X7gC+|OgEk9BgD#8j`h6C!^e0)|)t_c@L4TITVf}d) z+w>P%tkhp-Frzw1tZPc?)s< z%NCsa*De0&-L`nI_rT(j-V=)}dM_-F>%FnqrT4*NjoufF`FcMrChGmMXwhS^EZ1YP z%+%wsjM3w<^w$%xbkY;CG}V)|)Xu?)~nuyoN)u{77su+-Mg zv6R;>uoTiQv1HS&u>7S{ZTU{8-tv)7v*k6NcFR*b-In`w`Ybo;OtM_2GtF|g&P>aG zow=6HItwi;be3A?=&Z0z)LCO0sqpUszgezqVA@erGA9{mJs5 z)>q4yT0bnWYW=Z1sP*4+trnBjOf6QcHZ4x8Vl5u41TB6mA1xs(OD$0=H7yA%VJ#Ue z1}%B3cbZC8w>4F*PHJjcZP(PcTBfOIHAU0Vs!7wts!-G1DnZlA%3ssg%2w0CN=MV# zN=DPoid)me>X(MM)hi7@t6Lg@Rwp$=tafUIS*_HFw3?|AW7VY*Z&js{XqByzVim2C zZsntqX=SUCW2L8&XQiM~XeFpoV#TacX7y6N(&~(QwbcgoI;$z_4OSKE%~rAMtyYfe z?N(~)T~<8mJyxI8`mJuLO|;slHrZ;a+BB;kwHa0=YO}1O)#h3`tIfC4R$FK#thU7J zkLoh3r>ZNg&a1Ar+NrwMYO(5it3K6@R+Xw-tddo?S^25%u(DF!Wu>aR*Gf=zztvxr zgH|t94qIJSIcjxC<+#;)m6KL;R8CuUs+_YbSGi!7qH@V9Nac!^qslcaeU%$lvMRT% zcvS9KeO10^by@ko)h6YKRuhyTTjeW1wenYfZl$OE(uz;{wbgs2H&z#v-dSx_`d~F# z>62Bd(r2p(rLR`jO5d&Ilzv(vjbp>p}$)>nH_LYZnD^Ydr-CYe@x3 zYi0#$>$~zY)?4M}to!8Utuy2mt)1kRtYzhut$)g?T3?k@v)(ADVcjREX`LgdW$h)W zW345pYt1RAXZ=#v!1|P|q4jE6BkLYn6YD%#Q|ka(Gizg6b89hKOY2`UR@V1qtgR2r z*jTTWv9<1#v9~Ujaj=e-akO@lakAEwakdteak2g+?P`5k+Rb{3w7Yehw1>5&w5K(% zw3qcmDR1lTQa;vwQohz{QhwHUQvTKwQUTVVBm=F_N(Nc4kPNnNl?=8{k_@qSkPNk! zlMJ)|ClPLaPa@oUzeI%fLWxN0W{D{4REcP74~ZCS9f??L0f{*4SK{&3Tf`Hr>&26- zeZ-TkrNvXMUx}q!?-5J0?h{M5P87?qHWSOV<`&Dcek_`8y-PI5da`J)b&hDBwX0~p zwSs7Y^&gQ!>l-3P)>}o2ttX3=SQm+uS_g`hSsRFyTMLSmTR#@AuwEuyX`L-xWo;l_ zZT(%S#(KX{jdh1mt#y!4owb}$z4dFs2J4-I4c1+Pjn=V(P1Xj2&DN}fE!MXMTC6t; zv|4uxv{@$#v|C#VbXbcDbXY&&@3fxD-(?-a-)$|<-(!7)uh)7mU$1ovU!S!OU%&M? z-U-$RcqdwS^G>vm;GJZx!8_UdC(jh?(>znH=kiRmF65bJ?Zz|RT8?Li^+)cR*2}qP zTE}zGvKHr_ZGDkzj&(2B9BVJGxz-$9^Q=#D&bRL3oNw*NxxiYKbD{Mkj)m46ITl&B zaV)lu=2&8_&#}asm1C*(R`zAqY3$3bW!RTnUtwEe-OaYr+L>*Y^&i$%*4tTETNkme zw$^7|WBrb0t@S#VwblhJ>#U7g)>;2#UT=MXdA)Tf^9Ji+<_*>g%p0xWF>SOy#I(_R z9@8f4N~TTL!AzU2^_ezXb2DwRe!;lK`WWL@>!platy>wlS!XbAv-W4)Ztcjp!`hs2 zr?nR2PHQQ~UDh0oyRCmR?6H2yu-Ezq!#?X{4EwCNFwC`RGVZs?Hg2>CF)p>RH_o)s zHjcB9Fb=k0GxoIjV&q`)*vP`-vXOzs5hD$YtwxF#%Z;QgW*UiD^ceA3)EjYH6dAEt zq#6A;k2d;d9$@s&+|}s0xs}laa|5GW=4wV)%w>$un+qA8GUqfpYR+JE$o#wEKJ#~m zyUm{&?l8Y+xXt{U;TH3AhMUcg8E!J)XSmUPo8boY^@bbFmm6*{UtqYwe5T<>^GSxA z%)1RYo3|KlF|Re;W?p8v-8|oLmwATa9`hu_edf`I2hBqbk3i@6PnkO!o-?;Lyl8G> zc-36b@TR%C;azh@!-wWlhEL5!3}2b^8NN5?F#K%JWcb7UkHJ6lZw8DO9}HM5UK+4l zJT~C8xNE>;am|3=;(~#Y#VG?(i^B#I7JCh(Ew&rTS!^^=v{+@JVzI`4;j9#TF6<{xpky`m-!H>d&)SqQA&uy8beYF8x&&wfgHV3iLNyr08$A2-n|j;ibRd z!dCyVg@OKY3nl&27NYv+EjaWqTl~_yZt+&{w#5Uz`xck=9$OsKdv38)@3qBhz4sRL z^gdfm)cbDHqW9aPOz*!%rXI6pj2?%jzaEdJlb(R3sh)_XhMt6_w4RJ5pPqsxlb(v@ zS6vOu7rHu@cXSOb&+D349@e$6+@@<|xk}f;a;~n61?z#*V$^R zqqDzm~%t)G_LwEkEw)?%>g*J8G+(PFd8(BiZT z)#9;o))KHX&=R(i)e^Jf){?aPp($haR8!vSvZj*NK}}Vw^_m)1b2YWCdNlQ{sx%F) zGBr)CA~emd+%>JN%rtGS)HEHeL^YkQSTxR$3Z4R?-@IR=gU8R)5uttsbhESshic zuv)2JZPlw@YgMS;U=^m`WM!@1YNepwZpEhFW%XLE$Lf+=pVbbviB|K~CR??sO|{BX zn_(5EHp|LRZH|?i+I%ZMwS`vSRTo=5P+e+uQgwyZX4O?zb5++^wX3ePDpK8O6|1`0 z%2Rc#m5J(hD+Se^R@|z4tbVBMvwEU(!0Lj^A*;PAN32$<9J89Pa>A-r<&;&C%2}%f zmGf49Di^J6RW4g;t6a5`Qn_x$sdCfmgYs>wbINzE)+*n#>QR1Rm96~9%3Jw~mA3LT zD<0(+R&SJES)EmSZM9zMt<^-O_g2M9AFaZaK3Q2ReX){J`ewzT^uy|@;!mqniodPa zEB>{bqWI6MN|C`jQIW~oLy_59Uy;>XOp(p{p8|*VGX*Z|a|+zn+ZA}N=PU48cPI#0 z7byr@M=Jnn&_ODTw3vnohfKaiKQ-Yzd~-6t<&oh~nD?I162EiJEL{asGU z`m&s|^#(ar>pnR(>ufo7Yfm{%YYjOqYYsVW>ld=R)+c54tXIkETldHsTIb0cSqI7* zTbsz5Sc}V=S^t(Xx4ti9VSPl#(t4$gm36<2jdiJvt#yoyowbXMy|uQCgSD`XqxE-b zC+ic^&epS}U95AZU9BCY-K<5V-K}3rd06k0^0b~J=wNJLp1 zNJLwUO2k-y5s$UrFCJ&zB_3}bE}memBA#gdSuDx=uvoJ7RIwE646!t88?kh2L9q<$ z=c1X``$e;?r;BD=7l`Iqdx_>+tBU4XGm7S0-xVpa-X&6KJwv3>x?H5lI$WgK+FYc> zT0*4M`jc>(^)}&h>uTW&Ye(TqYYyQm>kC3v*0Y4Fty6?*tPO-}t^W$vTAvoIvz{$j zZ=EgJU~MbdXe}(*Wc^a0+4_J$v-Na=7V83mR%=gzHft4ucI$uq9oF0UJFE-%JFRv2 zyR6^xbz5)X>#;87>#?@t>$PU(>$ASV+iyLGcY<{m??h`0-ig-iypyc2^Gvp0#WTga zo@c6c2+ve&ZJue?Ogz)Aw{y?1F5sSFt<62t`Z?Du>m^*Xt&_OsSSxbPv3|rk*Ln%( zJnIb3dDgm|^R2&dEU@0ovB0{QW1)2%$0BPpj>Xoz9E+__u`jW%Vqa>l#lFn?Hrq1m z>1@lbgV|PC^Rcb4KFzw)x`TC@TX(RmvG!(JV=ch4*7`d0TI>1D z>#Q@G*IAn|ueWAoUT=MYX}$GArVZBhOdG9Zm^NBlF>SJzVA^E;jd8Q}RmRQMTNt-k zPhs3*UCOxCI-GHafHPWBR`90My?jujBG8A8JSvaH`29OVWeg; z%Shg$$4Jtm-bmP@$cWD(&4|+?%813n&xpao+31J4h0#ZIJ)>9VDn?JtrHt;G3mDxn zXEVBD{@3ul`4_{}=C2J;m_If=YJSV`kohIU{pP0(_n99u++)7WaJTs;!(Ha94R@L^ zHr#1G$8e|lRKuO-y@or@+YEP^*BkCOuQ1$WUTC<_JPUk&&q4E8!^7rbhR4hU3{RMQ z8lHyE@n1AIGrVf9Z+OF8)9{YDlHq-G8NKga~ggyXEyw5{@38A`8R`q z<{u0gEnXY2SUfdgx437(X>r4V$KsL!zr`5?L5pJsA{P4%#4UCjNLg$$khNH2pkT4g zK-pq}fttlE11*cm2D%o#1_l=G2F4bR2Idx3238g&26h&C296dP1}+v!1|AmC2HqB- z2L2ZQ2Ei5{24NOX22mC^25}aq28kB>2B{XB2ALL0200co1_c(P1|=5!1{D?@2Gtf! z2K5%-^_wkT>$h9n)9<#pq~C9GRDZI?PW|Z?YxQSaEYP2CF(Xx95~QKt9XB2(|bMT{P^rN17#rIQ}FrKujjrG}oc zrL>;7C7+(OC6k`Ks8I(?Q?btYMM=}fb%)0t^mtTWd#Lua97jLs6v zK%EtqZaS+it##I08t81cRMpvLDW$W^l3!=9C5z5M%g@?JEbnQbuso@K+H$k@Im>z4 zmn=KAuUeL9-?WU^zGLaFec#et`?006_A^Uc6{p2+<*mhKWvRt$rKTldC88y4#i%7_^aM1&)oD!ytDTz4 zR?9Wjtfp#eTD55ESQTmNTP125Sp{gCS~+N%Tj^_BS;=YITJdQ*SpCy*wtB1KW_4G? z)9S2-x7A(^KdW^bfmZW0Lah2V!ma8xBCQHEVyqH1;;jNT60MvyQmjlg(yUZ9GOffl za;!Ks@~pn97h2s^FSgpNUS_pWy~3(Zz1k{Ez1GTKy}`;vy~#>Sy~T<_z1`}WTBp?+ zwH~WYYJFBS)h1Xqs7vTi#j0}6>Xq^htCPyNtX3%B zv1(VoYn85i-^yM2p_RJwV=E5jr&ceOo?D$#dTF&r>6KNV(i^KnrFT{#N*}Dul|EWY zD}A>5ulUvKvEnzY6N*2q)++w8nymQSs#5Wp?3Yh6VqYf(iO>%R)D)=w4K zt!(qR?j+5R^K{M*1+0C*3ep9*4X-wjEVIF8B^<{GG^ARWz4N7$XHsJ$yiy( z%2->w$k4PukJCP}<4bRodBFO4`Nxy_Bo<5h*w8*;4M- zMN%HtUQ(XcN>ZNIza_n_uSt4aZKwTVQewS+{J^>6WL>*L}v)|16!trNuKto6j>t^bN8Sf3S3 zw4N)LWSuXTZ0#(TVl6I~YW+?$&HAWly7gSq4C_+SOzQyAENgAiY-={r9P7s-xz_td z@~r2I6j(=#6k6Me6j{rP6kGojF0no&Tx#7RTxRVrTxKmUTyA||sKR=sP^EQ= zP?fc#P_;FmP>uB+!5Zr|g0m_VUts~i%S&OqRv%bc<+nDtxtdB5mwqC-x*}8>si*+jF7Hdz&t=77X+pHBBw_8gx?y%-(+-c3g zxYPOr!!GLw47;r_G3>EE$gs>J$#{l^w{e$+nQ@(kl5vp*pK-dyZ=+a?S4P1WH;ue3 zP8c~^>@c#jSZQQrG22MnqSr{pqTWc(qR2?nBF#wHBGQP@!qcng2GtYyQ#jruhrQtLFC&FPdLBJZFB+@U;0c!;|Lw43C>{ zGdya(-tdU|a>GOB^9>J~&oDe_KGE=?d8gq)^CrVX=GBIW%u5Upo97xHF;6o*W*%>N z+&seYq)JGv*xab7tHMpFPU2yUNtu~ykV|wc*k7D@V>d6;UjZ#!)NA#hOf-I z4d0ow7=AMUXYkGZhrw_2PX_Fw@^{p{c*$LRSBV31w)ca)- zqxa9kUysSsNsrCaRFBJ2Lyyl=T2IK5Ur)@ENl(i1tFD~oOI;<)JGyF?7j!i(59{h$ zZr3%mT&-(rIbYY(a+0pCWt*;}WtFb0WuC65Wsx z36_mIQ!LALrdwv~%(hI>nQs}Qv&hm@XPKp)&Pq#Towb%4IvXuzb+%Xv>+G=P(AjPI zTYJCdQ|&{R7qpLB?$$nOxlH?v6i6yi4 zbIbQyuPtwDy|X-__0e*x))&i#T0boNw0>JwYyGp#&| z(h{`#p($eZOjF$Iil&s+Ax&AUjhYHp^EH*NdNtLoYBV*ivNUz9A~p4`JT#50EHq86 z)HN-v#5Jw0*fnjfzH2yGJ=buyx~}17bzH;KYP*Jy)d~$is~H-BR-GClR#h6|R#_U6 zR?!+UR=yhXR(2YRR{9z#R*D*FRzez?RxBFXR&UhvtS+b*T5VM?wwkG4W>u$NVU?_2 zZRMd}Yo(`NZzZhWWc5?6#p=FVyVWtZPOG(Q-By#;`mCzeCRin@O|tS*n_^|8Hr+}} zZKf5o+H9*gs`IR_sV=bEue!);rRox^$*Rk&YE@TSrK_&C3Q}EbWvja0N>g>Cm5AzQ zD@N6AR&P~ySlv?DWp!L-kJVtqR>zf| zS*=uhZq=>y(kf5swN;?fTPqW#cUBTgAFTc=ezJO~_{Hj&;#aHHir=j!D*m)8SNvra ztN6#tMe(ndj^ckSVMRvk-wI6DPZU_J&nmE4Z&P5mp0B`Z-KoH3U8KNc9jm}=?XJLY zZKxn%Eu$c4&7mM{{Y+lOdY`pXc0Yj=4mYeji!>)&!R)>q}^tT)QZTldN- zSZB#8T6@STTWiRvShLHiT0fUnw>}}OVZBmT)4EGm%Q{z9$2ve(*Vn;w>EbcgX5z8dtm1Lj*Tmwjmy0D>SBfQCdy6Gm%Znvje-TZwJ}sJRy+}08 zx>_{dI#e{nT3`h`fg^-+-=>%}6u)=eUL)`=qd)(#^1)`}tp)=VOW)~AJw ztS1T=TSp3)SStyaTE7u0v)(3DZrvnQVeKzeX)P;MW&K*P+IqKOwRMkRjdh%0t+k#$zH z*J+)^*JZ87*KPfQx7&IbZ;y2wZ?APQZ=baaZ@=|7o__0-JQJ+v@JzHW9m~4RT9I|R^)r?g)~i`oSQoLZw6SCGX4+u=nQ^1_CB}``n;17)PiEX?UCOxG zI)ZVFwGHDIYemMb)Q)h)A|X+F6(OyyR45ftg;9)o?~HS+;5?7 z+-xCiTyDW&oMZ9UD9PfEQG~^5BY%tCM(!4?jqEMv7@1r285vkK7-?A)8!20)8Od2h z8cA6A8VOrC8u3|}8F5)?8?jj^7%^Fh8T~WoG5T)KWc1Pehv6IZ_lD2SpBX+fziW8U z{EFdi^V5dc%?}%1G2d-?$$Ycn1@qO0=gb!yo-vMVD4U29AZHra| zJ&Sq+LyJlS6N_R4bBkO9D~mJ(JBtJZM~f%}7mE-B4+}p7Zwn6te+wsrAPZ}QPzzIo zNDF;~7z<5<1Pf(@6bl)HbPF+qYzqN{JPS^PA`51NGK*jOl@@RHYb_q=H(FfLZ?!nC z-(j&!zsF*o{sfCf`co{X>d&y~)SqKft3ThOP=B#SivDto2>sO--umk;?DaQW80l}f zP}ARSA*sLLf=BN;eHH(9Kw=A~k-LqJ(_sC+F-ZP6n zy;l~EdhaYs^gdZ+=zX(@*864Qr}xjoNsrOeRFBnCLyyx^T94O~Ur*4INl(=BtFENw zOI=yZySj>&7j#uEkLYSxZr9bZT&-(hIbYYrag=?9tG&nahV}u=L)wQe*J&TOoT+`vvPJuxWr6lZ%V_N@ zmhRd&ERD5qTgqwQv*gl#X!%X+spVs>7nT>aUR&yzblt*@3XT0blcwfWS~Zoe zN;K81k~KB0f;4rk95wZ=3^a|b6f{k(1T-zI7&NV|K4{okJW|81s~0L;t*)wUw>qS<(`voSZmT&ed#$=u_FI*! z9JESRIcycIa@5L6<+zoB%1JAEmD5&yDrc?!D4(~wt$fjHm-1z+S;|+fs+6x=MJwO5 zvQfTmC98bb>c7%`tA|PttqvZD}J*oRs3!hqxjRxS@E}(mf{~PA;o`IzZCvkJyKw_KCQrPy+wh= zdY%HCb%z4Gb&&$6b&LX+wYvh3wUGj^wX6caHHU(L^$U4H>jUz_)-&WqtPADEti9yL ztySbDtpCYLS>KeCw%#fyV?9w$);d>C-r7q}!CFI3(VAUO$@+z?iuDOuRqK_qYS!Jd z>ejikn$`ibTGqz0+ScN-I@Z5s^sFDq=vyC?F|b}OV`x25#>l!t#@ISu#>Co9#?)F* z#>`qw#@za^w1xF~X-n&c($?0c(l*v!(zezL(stJ0r0lKFO4(a4k#exEk#e*Sm2$Gy zlXAA^kaDqpEa_&wPtx6brlf~;nWU$6u%wr@fuy%Jzod`#dkH`53ljd;8zlm)Crboc zmr4X#M@R%)TT6sk%S(h>vq*$lUl9+tUML=6oi83~Z7UvS%_AOTeMc>r0}^)+21dSf3Qhv|b^SW!)~4 zZJjQXW9=@IYpo%YXU!>+Z+%s`z=|Ak+r69vGo_B66*s(rPjSdW!6zb<<^=) z71lolE3HomR$9*ztg_A#thTlntg#jrthIhAP-negpx%0#K!bIjK!dfrK%=#?K$A6t zK(qB8{ub*>{#I*q{#NVnd~Mb{_}ZFwaD5EuM+iOgxjUw{lOm&fuP6Ez3Q{`ZCv4>wd0j*1lZR zt@*j8TVLaxVLgv?rga+UENgwvS=K)}W?LWOm}5PGV~%w!$6RY|j(OJK*ymZ#WS?*C z!oI-z2ipScZEOpzi`f=g8?Y_1e#^SpdNu13>rB=q);g?9t-rD?v);?H+`5frxwSvb z3Tp|L71ocLS6Z)QUTIy;yvo{>d9}3!^J?ptOlz$7Fs-%jXIg8W%CyefhH0I(EYo`H ze~jy`?=x<&KESxqdJ*GB>lVgM)@h8Jt-TmGTkA7!u@+_AV$IID&6<&MyY&x-?bfdt zc39tJ*kOHwVV#AO@d687L&EGm5p?YZPL!*2u?Vo{@`1 zzmbhaqmijav5~$-nvsS@q>-|PuaT^UqmhJ#sgbaSmJz>&yb-sBh!ML5ml2BvgAs$p zH^blNZw)2FXujR>p80yi+vdv+Z<^0Hyly_j@T&O) z!z<>UhL_D74KJHl8D26kHoRn>V|d9t)$p=;oZ)5jaKkI+0ftx2Jq@p$I~m?Ew>G?G z4%)}BXL#RS!|!4YVv84RkH44Gb(w4U8@F4a_Vu4J<8^4Qwo83>+-N44f?j4BRZd z3_LAd416u@3<4}H41z6;48kpR45BPl4dN{14H7LR4N@(H4Kgfv4RS2l4e~7*42mtj z=$Bi((66$%tzTzxUcbrWkbbMhHvLYEmHNFFbM+@$OwgZV(V{=YqC$U;MUMUgiv;~8 z79sj8EZp^1TUhI_x6sqyY@wvT-9k)%w*{yEev7|)hb=zn9kY0%cgo_1-Z_iYdY3Hr z>s_BP|7WV=dWq6D@z~q*%Vw z$*_E+lVf>JC*Sh4PO;^FopQ@9I#re{b?PkV>NHtS(rLA9*XgvZ(do4;)R|zJsx!qh zN@u#Izs_t+7oB;QRyvC;^>vn7s_3k=l+;;c$*;4)l0|2;x+qE(KjidD3xx|NrvmX(#Jj+LgSzLkWgkrjugsnrh+ z3#%6z)>bz)?5s{|I9lz}aJE{d;bt{k!_%rq!^f&t!_O*DBhV^dBg86DBh1Q4Bht!5 zBgRTqBhE@(BhiXeBgN{QdYaWO^-Qb%>e*IH)bp%5)C;Wg)Qhcx)l01`)hn#z)vK&n z)oZNYsMT9tR%^7{sn%k(P_50XL#@LqU#-h3T&>s2Uaj9sLv5m!fZ7zRpQ_WW9;wc- zI;}d(YOCrTtNE()tvXc~T9v3Swu)C>YUQQ6+{#pSrImu}8Y>>vbyh!AHdsAT*<^J= zWsB8bm2Fn5RCZWRSJ`FNsY4J&cwTUI}n?pWPcx@Wad>4DWkrH586N{_A5 zm7ZF8D?PW;S9)P3tn|w2yW$(GJBshD4k^C3TCVufs#o!|Rf*ykt0={9R*s54tTYsV zS_vrrw)&y)$LgWNKdVy;4Az?!7_H|hFk81Nuvix=uvteduv@z+a9SHGa9PVL@K|#w z@LIo==eIs6FJL`OUeLN&Uf9}4Uc_2mUeuaVUflYQoP_lbIZ5j&a?;j?ax&I_a-myy)-{su){&AP*5;C) z)}oSL)?XyNt*=Pz$FXzd^oWUV3*Y|SYVVtrdY)Oxvin01MG zxV5u*gtf4Er1cZADC@0a(bnx^G1gIHvDW%xan>wi@z%FQ6RbCiCR%rhCRrznCRh7B*&UhB-i?paGv#Y;e6{n;R0(@ z;X>vP-_ ztsA)~S(|fDvVO}o*?Jk*6zc@8Db_MvQ?2iEPP1OjIo&#sbGo%9=L~CB&Y9MiIA&ST z=a^-k$1&U5mSc`JFUK6~ee83sliBB4^RUme-orNEx}0r+wH4b!>p!dut@pAnvaV-c zZ0*3h*qWJjiS==orPh;KmRiTNEVI^PS#JG}dAapr<`vcxnO9mTFt4=MXI^E^z`WY} z64PqyWlU?VtC`kV2Qsa-)?iv|&CayW`ZeQv>$8mOtv4`ku%5)Y(Ylmzqjd!1CTm;9 z&DKhco2_{mw^;vW*lPWqVVm_^hHcjO7`9uVVAyP7Y`oM$)_8^mr*V(PH=_oN$3~?V z7mczl4j3g_Y%q$nSYQ-jG117wqRGh7qQuC`BF)IyBGO3L!q-T{!of(%!o*0{LeogX zLe5CULfA;ag2RZ%;-4Xh#TP?Xi&utB77q>oo8K_}Wq!`^tNBsGkLG&~-E`G&X6GYoH;Cm7x~k2Jh(9%OjO z+{f^axvSw_b34QP=H`YE%nb}5nQIw7F;_NxW-e>^!d%?&wYh-dJ993>59Ta}pUwXo zd^i7Y@XP$8!9Vj?1`HNY445qL8L(K~FkrK|WWZr@#(>-6r~$9Vegl4sod!Y{TMR@j z))|OdtT2$YSY#k$F~>m8Vw!=X#RLNti!K8-i)I5&i&_I6i*f^fi$VhP3oe5!3l@W1i{JW%7Vq^-EFS4sSX|Suwm79pJNfNzrey@e~E>&{t63o{WTWa`s*#^^fy}w>2J4S)8B3JOK-o$ zTfM^;5A}{&T-7^eaYFB$#U8y&78~@gSuD}JWiegvo<+CbLyJ1SrxrzeFD+8_-daTJ zeYEh=`)c8!_tU~e?~jGL9)qQ{9*ZTv9)~599*^ZWT>;CNy26%sb;T_&>PlN4(UrH{ zp{s1UMpw;pfv%S26kR>b4qYS58eKEX0$oeX6kS`(NL@!uUtL#AM_o@#Q(YfRE!_Z1 zIo%LTVciHzcHL;pKRWT2A9Ru}pX#Jp-qgvmJgbvuc}SZ zEIV~tEbDaIEsJ%!Ei-ibEMs*hSqAA$wRG2+X=$r7$I?h=fu*|6VoMpF<(5J^t1Q`d z)>;12-e~z$d#mLI?H!hTwD(vp*WPbAS^JP>z4kH7EbWt)VcKUcowP4l>S#wD% z7K4?r7PA$j7Ms<3O-`%3nmksgHTkV}X$o1b&=j?rt|?*FrYUVzswrocqN!*Vtf^w< ztf_8gq^V`4q^WBqq-kKqsA**NQNz^gp@xOkMGb4KLmGBgn>8G*mS{LzP1SI-YSZwv zD%bF_%Fyt$iqZ(Q^418kvegK)($k2vQqYL864HpXV$n#ndaIsnbxA$VYMXk7)ok@_ zs|NL4t2FfjD{u88D?{~CD+%>-tAA=$R!`Mxtj?&_S#4Hpw3?;XY}KUJYL%tdVHKp- zWo4z-W2L0lZ^f-P(dvupWUITXQ>~7xPPf{iI?HO7>Kv;U)p=I=stc^5R2NyfsxGlI zR9$W*qq@?HLv^*)7nQYE4^-A$omJUrwNquY)iRZ>R+Ck>TQ#Wcw8~T2Z56As*UDRE zzm=8BK`Tv_!&VY1N3GaZj$6G|K52DU`Lxv<<+D~j%IB?el`mTPDqptJQ@&~?pnTox zlhRGAD@wPlb|~Gknyqxts$S`VRg%&pD|e+QR@zEWt@xFmTYXV{X?0Wawbg#bH&#m( z-&u7ley}Q3{Ad-S_}R){@vD`(;x{XP#UEDR6@FUXSNLspLgA0qMumS?vlSSuTNN0s z^A(t_qZC-IT@~1@4HVd|WfVBAITX08U&!-VAC%{{o+Zy`T_P`F?I$m2tsyUD%`7is zeP2%0dbgaI^>jH2>k>Ih>p(dvYkfIsYd$#{>$kFU)@Nkpt=GsZSog{*TIb0sSqI80 zTbszLT1&{PS^tqyw|*$2VSP+S(|Waxmi0s#ZR<)IUF!rHJ!=mceQN_518WHxLu*DE zBkQZu#?~vOO{{CAO|1i^&8*d=&8`1PSy*3^vb0_)Wo_LgWn&#JWovCFWoIoQjgrE);U5&)|NuW)|^5m*0%&p zt=9;aSvLrlTZaf%SZfMaS~Cb%Szi;Vwq7StZQU+VW1S#SYi%u1XDudBZ~cV7!FnEl zqjeO2qqPiwll48mX6r?KE!Js#t=2kxZPs6S+pPESwp+LHc321Uc3R8vc3QvX>9Rh+ z(``MOr^h;jr^nisr`KAHr_cH!cfa*C?g`eu+!L(XxF=fg=bB_)%{AHDoNKc6H_j>6 z+c>9Mmvc_Fw&$E?&Br<2`Yy)|>opuRtZO)CTKjO!vXjLXu)`iwVtc$G0Sr=K~W?5{#kY%xT2Fns_bC#vnY%I&H zuQD&QUc$WGx`cU!wF~nKYcb}P)-RY=S?^|AWj%puwRI}fYHJ&&HP)g`YpuU9uC>0& zxXyYH<9h1_j2o<*88=v`F>bW>X546Pz_`g;jB%4SGvj9KZwyX1d@V|i+$_?K>@A{< zEG&GDj4T|CbSzAa)GaiOlq_V8WG#e@BrVvDL@oXr3R-+J~vW58hX%z(+_fdPxfEdy4I%LeQgXAL+ljvH`W95mpy z*li$SvDHAxV!eTg#YzKli^T?#7IO_`EM^$USxhoewCFKVwrDd@vuH5Tw5T-Du_!js zv&c0tv`9BFu}Cy9w}>{dvIsS>weUA^u<$f+ws1CZv#>Srv@kdDwJ94R*(_dpDrN6;~ zPk*xolm2##Z+g2eUg_<(xTkm6;*#Dmi=%p{EOzRhvskNl$zq}2HH)cww=6pK?poC9 zJ+vs$duoxQ_tGLl@2!Qm-UkbNy)PC9JdW)8)2&smpJ9 zS6A5bqOO?bQC%s^ow{5PSMr0?9kP6WHCvn{oB z=2^?e&(|wKrQH(%xpdPJ5T-EbYCPt=b1H3$>3}#%dq8 z^wd6OX{LS7Qc3%wC7<>c%imfzEMI8dw!Er!&+?$wL(6qqPb_C^y|C=idTm*%_0BR` z>!W3$))z~At?!n)TE8u&wfQt*Ws?)8esm`=& zP@Qd+r8?ItRCT_UgX$tH9n~dP5~|CrSX5V7eNb6tbysDL)k&3gR@+oISS?oBWHmu$ zi&d@4Hmhuv9afPlyR6(*_E?#z?6Xo;IbbECa>$BV<%rcYq>ZeDrH!pMrA@5=OPN_;lQOqnCuL#X zCS_?ICuMDIA!TDNEM;r`UeeC`w4}ZD3Q0%nR!Jx8WJzahM@biJ1xZ)y{}OK2_a)q| z4@h`eFO=}KZj$h_PLc4jc9-zA)|T+I7Lf3_ek~qgyq%na)@fo9*4AQ?)`DVD*3U(wt@nw>SWgp;waycbvvwDaw^kBOu>LEOXnj*8 z$$Fbevh@^^6zgJoflBKM0#(*o z0@cj18a)_h!(tj}{!ww}m2#X5v@inSEyRO?3^)2z2}Ot)_1m~I`(F~eGi zW2Q9&$1Lkr?6a&x*k@Zau+Onx&o;+8o^7tRAlp3a)2#EXC$i4Bj%Hn8t-`v%`VGrM z>n$vctZP^nTf4F>wiaMnV*QADsr6>&W!A0C%dEqhms@Kxudx2jw8Hv4(@N{bOe?J` znO0c`Fs-)MWLj;_%(TY(A>&%>(Nv3@Mx7SNjp{A78kJfsHOjV_YLsNr zY7}KrZWLsZVdQNQZRBF%Yh-KTU}SD#Vq|EcVWeXrW29~&XryGpW+Z3v+fd5lqoJ6^ zb3-AEyN3K0mkoI=P8o7q95iIJ*kQ#XQ45=2H!Sn)e!hGjB8eVqRzX z$-K<)gL%H;JM(nIx8@0kZ_FbN-IOj;iUy$;(gqP0q6X0x{08wBoCZl2%m%3zzx6XM-s|UBJl4;*xUOGpaazC3 zV!wWs#b*6li{<)_7PItQEc*02ESmJYEz0!!Ewc0{Tg2&4vk26mW#Otn*TPbNp@pvg zQVT`>6&7OpYb?0*H(31B+hXxaZ@a}az1rW&Nbi`%Hoa38tMtxU%+tGM zF-h;LMVsDDiz>al7I}IPEt2$}T7>Dnu<+7*V_~QF!NO4Qi-oG*cMD0q-xj=j|1B8x zm@U8RvRl5?<+8l1%V&8}SIF|Hu9)RcT}jKey0VrFbrmhA>Z)3H>S|cl>gre)>Ka(4 z>Ka={>6%;m=~`Pl>DpVG>pEF#>$+Jg=z3X->iSx8>IPc=(+RcwtP^SZLMO)Zj!uH* zMV%DOV>;=UyLGZHH|XS9F4ZZroT*c4*{4%!*{oA*S)tQlnXA)cnWWQh8Lrc9>8sOc z>7+Bs(p+b%rLN9QOC_B-mJ&J(EO~VnTQch`v;3sJ%JQ!ETFaB#8!fkLZ?RmUz1^}$ zd$(nU_CCuL?Sqy9+D9#IwNF@TYM-_g(>`y>q$QYa&%2&^@3RTatvR2QvQc};i;!rQL zdaqVubxp0zYOh+Q)l#);t6sHQt5UTFt5~%rD_6A^D?PP#D{-|>D+aZ0t5>SMR+m*L zSnXAvWVKv%iq%BbX;w9=Gpy27XIllT&b6{poo}U~y3k5kb+Ofdm8Dj1RF+%aR9R_t zRAsf*CY7~T3slxy^{Q;Ns#4i(m7%iLDoka&m5a(wD?Vb!Ym(ke&swNP2t6n&vo|)|+Letf$CITbIhpScl8XT3gD>S0RREo&wjZR;D-y4Gu?^{gAD^{qpt4Xm}L zjjS1^jjeA=nOJX>GPCZKGPh2avaq(1va}YLvaJ@a30Lc*5^mPZCETq$Bs{FMB|NSDB)qH*CA_UgC48(ui~Cyd6Zf<3 z5%;%_5)ZJ}6c4oiAr@qPQY_edmRN{&j##L*y;zvFh*-GwYtabn!=jPavqhty1LW*7ZVp)_y|y)^b7x*6#!ht@jHST2B-#vQ8B&wzd>3vE~;n zwSFd0X1!0K+|7orL~Vhm9>UIwKc0iwe?Z{8tW$hT5AXXI_v*@_0|XZ8myc7 z8m+zf8m)!-nyl~gHe0XcZLu!pZMAmdZL=2SZL@yB({8aK5TobHSxh7aY=bUK0igS{69_M6h6VA!jzd5E@ zALf{9-On-2I)P)FwHe2BYi^Di)`!_=S{Ja-w3cI^Wqpoqwsk$*Y-=O7Io8iu=UC5W zoogMG%_%36$Rwe?5F)z;@3*H~|3Tx>ah-J|<2vh9 z#`V@-jO(op7&lmpF>bK_$FR}*J;O%p2Mn96FEi}7U^U)k@zH3h#a*MB7N?E+EOr_- zTdXjuw3u#GV9{=rZc$+rZ;@pbZV_V?VBu%vY2j$(WMN`tW1(SWW+7u_Xdz&vW5H^q zZt=@d$>P1CoW)Z^DT~{N;uaSTg)L4P3Rvtj4u&-}Xqg9T_m-zx(qizfyw7WWKT zEv_4|TU<2YusChNWpUJi$6~($pT$lCev3^8f);BGge{gCh*~T#kg%9#AZ0PdK*plq zK+dAmK+&SvK-r?!K+U4UK*OTQK-(h6K-VJ8z`!EGz}O>Yz{^6*z}G^>AizS-AlO2}Ak0F@Aku=zAl8D-Ai;vcAlc%pe!9g= z{Va>S`neVt^$RVI>6cjS(l57Ir(bQcNWacvntqc-r+%wNt$wFPp?;4=s{RCvNd3tc zzWUQG9Q9{enCj27(9~aOA*;XCLQsFD1*`rVi(h&hEZ*sDv3R7n!{WN$Zi~};`z`kC z9k$r4cg$kB-YJXOdgm!& zsOWvRkkI>X!K3%vfGfQV(D@zMqTT2~XM@vOrS4&Y{4@)jxAItwb z0hV8Mf-PU_gj?RziMG6?6K8o`C&_ZJPMYN=olMK+I=Pl}bP6md>XcZv>6BYm>r`77 z=+s%J>NHtK>9kt<>vUSW>hxGz=}fTH*O_dosx#eET4$D}fX+NiHl2l*KeU%xKGt4g zd0u<9wE&B37}Q;#R(zQdTyaGFCd8 z@>VjMN>)6Ys#bqAG_2leXj|RY(6u_NVPLgS!`N!QhMCm@4GXJ@8rD`#8g^F28je;e z8qQW>8g5n|8lF~G8s1hq8h%!C8i7^<8o^e~8evwi)g!Dfs7G6ERgbfpt)5`jsGe+< zuAXY;tDa$Hte#~hrJiHOsGe{2Laos1yjqFXHnlRVd1@6_ZEDq4d1|#*;cE3(_G(R5 z8fq<8f@*D6zf?P{o~U+Pom1_#+M(KSwMccMRgdaqt8&$8R!OQetbA2xSy`ygu~Jc; zXT`6&!0NZkBCF>rORTP_EVDYOvchVe$||clDr>AdRn}RRt8B1JRoP?}tg^+*QDvKz zfyxdmIh9>jyefOFek$*?x~_b{YP<3wtLe%|tSXd`Sw$+Ju(DD8e$}(lx7Kr5je}O1G?Jl^PEsBq=W-C6i zYEpb=m8tl`DnRk2m4)JKD+R^3Rve1&tUfAyu)3x2(dw|mXR9>|U#zAne6wm$_->W0 z@Y5)j~uV{EIB^w3ORo3a5+J1GdUq^Q8{7jud*W6S7pVlx5WW|oz;ekLPleM&~&dcBN-^;8)p>uMQg>tq=fYcCm9Yas!)V)@!A;t(&BEt;41DtaYXJty!cEtZz#hS#Opyw(gcPu}+mTwYHZsx0aH!u>K}# zX?;=B%6growRN|ojdiA^owbLgy|ucegEfbwqxB03C+kxZ&ep3XT&#N~+^h>E+^vHp zJgm(nJgucAysZC=dt09r_pzQL?rWVO?q{tp?r+T?9$1qT$vHL?f&#MI)_)MWd|sM5C=aMPsa=io{wU5{a{(FA{HEE0SOxEs|($ zEs|s{Ba&?WM>xg$kZ`JXhj5y8fN;9Cv~Y&?GoeiD%|cn$%|hAM!9qFKDnhx|Uj_55 zj|=8o&k`)K&J!%Ob`~tMmJlqqelJjBeN3R#dVxThb(KK5b*MnOwV^q-38)`9#r)`I-C)|dI}tf%qSSx52JTPyH2Sij_LwBE|wWZlf$Y#qqkY^}iCV*P=q z)%qY$oAqR#cIz~rc57>%4r>9PPV1}OUDn;)-PX?B-PXUkdaSo{^;(y5^;w&9^;`eu z?6=;}Il;PxbE363=Ok+(&Pmp{IVM{#<(Oh!$T7v*fn%z*2*)(*OYGCFo7tyZo3PKY ze#SP_dM4XUYhSim*34|Pt#`A|wk~0vW3A6R*ZM2VJnLgD^Q@<_%(qTqSzv9%ve24= zWuf&s=0(pzT7zk&H8ayH z>-&tWt@kmmwqDA(#=3`bt#u*eTI(>zb=EeF>#P+S*ITnQuDAZou-^I+!v^ci42Lbg z8Evz8WVF)aywN<1Jw}r(RvUF#%rdI8=rSs`s4~j2$Tmu`h&76_@HYyva5VC@Ffnqs z&@ghekTJ5h5HK>cU@)|IED%|C&1+ z{xP>P{9|rv_}g61@VB|T;U9Aa!$0OyhJVe44gZ<*82&eBGi0!UoY~80@yUS6;*9~b z#WMp|iw6d57B>ypEiM~yTAVfDvN&$QV*wfK=eO8uAZW49K*(Z+fr!N-12Ky^1`-z2 z45Tb37|2?58OU3-8Yo)S8z@^;8mL(m8)#VM8E9K%80cCg85mf^7#LZE8JJoG7+6?% z8CYAm7}#3a88}#27&u!P8Ms;K78UQK{c%k)z*f zk)Ype5u!iA!b5+Gg{}T{3q$?c7OML5EF|?8S@7yFvtZO;Y4KHWt;I{d4HozGwpd)& z+hK8BZ@0y6z5Ny&^bT7r(K}`_L+_MDkKQ?pM!icGrFvH_GWBj+#OmF(2-16C;imV* z!b=fH6|h{Z zD`L4&SHg0tuC!&BuDoTPuCis3u9{`Ku9juAuAZg8uA!xiuBoM^uBD}}u8pOVu7jnR zu8SqNuDd0JuD9h^9Y4!gIzg8Ab;2yK=tNqc)QPp+r;}*8StrGEg-(X$T%Byo$vXL# z9XdspwK`>%MLLz1={mKRu{sTwK{_p#?mF$3HagvwMml|#8ak6KWp$=n3hT_Up~u4VJCin=K2qw_C<)@3QpL-fL;5eb7=_`-r80 z_HoO}He=JXG{X&s{plHD@(O{D=hRRB-R+ZIO#VYHp z5>+->1*mMavQyb?rK_^lN?K*R6_?6Rt1rsCtu86=wc4b--)f@rL90ULLsmh`N34vM zk6DQ-pRoF&bjs?M(iy9LO6RN=DqXN@Rk~=EsdU-OPwA?avC?%b38kA>e-&?8JyyJ9 zbyD%3)q2JIR?`(9TGc5&wn|leYUQi=%*s^pg_W%0ODi_T*H-To-dbH(cxQD`;e*vG zg^yNK6h2$kDSWZYRQP5UqVV0yUg4*emclP9F@@h&ObUOk?#chN+AhyvJyD*~I!B(# z+FhQ-T3Mdenn9l3`mP*@^=>&%>zQ)g))jI**5Puz)@E}2)?#u3*570Wt*^-nS#OsW zww@^~YF#ZWW*sXlZf!3sVXY)9Y0V}pW&KJ<+WMS~jP+(2S?d`xa@Msn^42Lbiq_sT zO4i0Q%GNS6s@AMBYSwq8)vY&3Yg#u;YgtD~Yg_9}>sYf%>sjBG(zo6wWnkSWWoVr) zWo+#zWnwKOWorFH(#-mbq`CD*NlWW~Nh|9dNo#9wNgHb|Nn2}fNjvM;5)Rg9Bpj{R zNjO+M1r)@?$W z)}caK*6Kpp*1rUEtj`MOS}zpLvn~_NxAqY%uvQW*wEihjWPL%P*m|Wvv2~L`iFK?% zskNm*nYEZex%CVF3hO2OmDWl8Rn|)U)z**rs;!ss)mUfo)mj_y)mi`Gt+zhN+hE

        ;o>uEJo>psbo;GU*o_6c^+#S~QxjU`Hxx1_dxx1{- za&=pGa`jldbM;zta`jrD=j^kd#@TNj$2q}TopYk~2abu>yE!IVw{uLk4&j(=t;{jS z`W5?B>*?%MtzFrtS$|`jZoP(Wx^*(!3~On&nbucWXIb~N&a(Dqoo&s*I>-7r%N*%8HOz~weVG?ot1vIN{>!w)`YO{>>$ObFtlOBD zS;sRix3*+jVJ*V6!ukW_O6#+XtE|^DuC|`axZ1jgagB8n;~Hys##J$YddA$YjB9$Yj9@zMqfT;z}rIBz|TV5Akae4AjE>lAl!n@ zAj*QlAlBlGeuBjd{bY-~`e_yy^)oGw>gQPO(l4-Br(bNbSij6-x_*^Kw|=cfy?%p5 ziGGVkhJL$6jDD9zfPSBai~d9l3;n4UI{Gs#6!hm0Pu)*Sl&Ft#{MH zU+<2Ei{1kZ3%w^6x_Zwo6!l(Pi0Qqz;L`hK@lW@g#b@1L7SDD6THMxUv^=lNYI#_f z!*Yi%kL6lj0n3HD!j@BY#VxyZr7i1p!evu(aEyx)XBB1*D16t(J8Ua(y6eF*QvG)(W$re(rL1^*J-sh)#IJf^+Ga+CIQ%X!+XExWYWS(a;Wv`p6CY8jxt!_roJ zx22Z$K1(s}Lzc|iM=d{Uov^&8b=vZ@)_KbvT9+)BXRvOJ*q*K)lkgVlUZW~)9;Hmf>K zPODr^9;;YQek)&1AuC%=Q7c_daVuF(DJx!0S*w2<3Rdqll&$V*s9K%Z(6Bn7p>4HM zL(giFhJn>&4P&bo4Ku4U4NI$Z4Qs1N4Ld6@4M!^*4QDGo4L2(V4G$|}4R0$}4L_@o z>H${Q)Pt?|sE1lDQjf6eP>-_8Q;)R@Rgbr_QBSf`QctnsQct(~sFrDUQ!U5pfLfl_ z3bg{OiE71Gm1?C{iE8CmUTRfV#%eWIGHP{JY-){GA5@#IZmG6f9Z_w!TBq7+HAA(> zs#&$qDo=HSRix@9D_7MiRtBomtYlPYSaGP%vihPj$LgWVe5srLxINQe}%3hsrjqcgj1g&MNP+TC2Rrsz-UB zRgUt0D_`Y9UoO z(p9S;ir1~~Dc-a?s(8z4wc;JCNs9NZDi!ZrB`Q9&@>G0mWu*ATN=osW6|>?Ct2YWS zt*$D(w%V`o#%iU)JFCeG@2zSTK3b(Ke6k8s_+n+N@YPB~;hU9+!VfD(g`ZZp<$qgk zk^f`WFaOUfQ~tk|t30E%qCAuJUpZ#$TXL+{JLK4`r^&Hfm&tKjhstqTo62!pi^}m> zf0O02zAnpey+c;OdX}u9b&af$b-b*wwWF-4wW_R`HHWOY^;;PU>x(jy*4t#HtY^!} zSU1YZTBpm%S^LSzTbs%#TFc5PS+mM0Ti=sbwcaGHX5A*OZXGSHVQnC-Wz8NV)gsZ>T_Q2oSt7C4o+5G9S|ah*+#(6qH-!_e=L#oTCkrQ8YYHb@ ze-TQxJ}8uG-6xc09V3)(ts|6S{ZBB{`l4W#^)kV1>uSLq>mb2gYYo9XYX-r5>l*?E z)*A&1t-A$^tWyPwtsMnQtYrmCt-tb@S#Rbqw=Uu@w>ILhu>Qa?EA)ny&S)om@y)op!`v&VWdXRmcGXP>n>XTLQQXTSAXjtSPY zI3`+Wa7?r|=a^*8&N10~1N&s_X!a@AyzEo0_p?p4E@qo%t;;su`UUF@>!qwStdm%0 zS}U^7vVOoa+j#Z5_n8 z+S;6PwY3!EYU{rYYpkC$tg*h%aN6RA(LRf#Mw=`)87;F|U^LsJ-)N#my-~YGzEPb; zf>EhOpi!=cvr(#rnNggDrctcH!{Uhnr^P)3E{p31+!hxNcq~pE@LC)-;Ir5dUe_;ZvDrY#VvT_a zbgW<8VwQoV#S{Z6i#`Jxiw*-hizWjFiy8wZi*f@Mi$Vi6i);f;i&O(`i+BTFizovF zix2}N3x5Ms3r_=c3ugl>3tIyl3v&Z|3qu1Z3vB}z3pE3G3k3r&3n>F%3lRf<3qFG& z3l4)&3uc1|i(mTD7Vq@qEFS46T3pvpu{f=tZn0lK+hU7;p2Z6NLW{ZjB^DF)%PrdU zt1YVZ>n!s08!eLcTP?!%J1o5QyDc2_`z=iLCs}CdPqmQIpJ^eWKgWVqe}TnMy~P%9 z^_E*a(pzP5O>dpWDZPyr`}DS2Y}VUhu|jW;#azAp78CUjTeRsNx2V=TWs$FU<zc zqD6$>RSRFen--3GcPz~G9$0AUJ+_e7du}1D_u7I(@14b8-A@)Db-!6W)BS02OZTtE zd0j@!!@4Y%+jTiC*XVLvF3{z-oT@8q*`+IHS*I&yS*$B-nXap78KbLe8K|pa>8h(^ zX{D=gsjq8nsjO>mDWPj+$*XH;$)xLO`CZ4=@{Nv%Lzs%5uMhGm0Jj%ArnzGb#fv1Ou8nPs?6m8FkPt)-JrgQdAni>0nk zyQPv&x21$mpCzBpL`xQ(sg_@~XIS3Xo^5$Xd%ook?M0SLw3k{=&|Ya-tG&iDQ+vH- znD%B%XYFm42HHCM>xCt+)@#e(n(r-NX@0W2srkk7gywh4?V7(VmuddB zoT|xS)vC#CRjSEmm8!{U6{^W&<*LbVWvVG;rK%}vC8jB1#il83^<6{O>bZu3)eQ}0 zs}mY(Ry#E`tX64gTg}$cv+B_>w5roEwkpstvr5#kvwaIFq zYKzrM)pn~Xs-0GKs@+zZs=ZdBs{K|DsuQhrR3}?Ws7|wDQJrD+L1mWJU6najr&Q)y zZC6=fwM1o+)kKvgR`n{&ta4RWSVgIOD<86Yt8~QbywXvtO-jeDrYfDZs#H2{6{~c{ z%1P;*mAcXeD_*5bR-YBGSlv{-YIQ*Iy47;Un^t{_x2#GP?^wku-m`L5ylWoIj@3F? zj?LOwj>B3+j??<9ESL2)S#Ikcvb@%_WcjRXW%;e+Wd*FAWd*I(WQDD{WJRps%ZOTE zmJzewDI;M$Pe#(ZMMlaxOGd^zP)63;LPpM7K}O!1T}HwBfwYqKW@%;Xc4-ys7-=q`>W)|(}4tfxuXT31TgS;tD)TRTcPSgT1mS#wJ`TR#$a zv0g9kYF#7lX6-HRZY?G5Vf{+X(|VVfmvxVrk9EA5ueFhwpEbLfzx6%Q0PAg{f!6(^ zLDm_f!PZWqA=a{@q1Hb{!mO`|gj;VEiLmY$iL}laiL&+=iMBQniLn+EiM4(q9A~{o zINrKQIKkRdIMJF(ILZ37P_p$jp%m*Bp;T)Vp)_k&p>*r(f*IDU1v9Pd1+%Qf1hcL6 z1aqv}1#_(*2;^Ds6v(%pB2ZwRCs1hZB~WCoCQxk6EKqEHkiW#bj=$8}j=#*Bk-yyf zC|`wj7hk1y0AH201YfoFL*8oZ)x0&nhG3YbVYg zYktmN>pL8M)~h)Btt&bDtvxs?q$rdT_&O||~X zI?Z|u>vZc9*6G$JtTU{?vdpyJ!7|gjnq`)?1Iuh{ewI1bFPP_A?`NKCJ(YQ$br$n{ zYkTGe)*{RctzR-Nv_8bN$a)^rV(TiVCDvg~ORbHVmRj>OEwg^ZxZL^_<8tejj4P~r z7*|-AFs`(YW?X6Qz_`j)8dVxi^W4jdy8v^ zRu-oXO)U-@8d_{O)U{Y^sAaLlP|aetp|Zs!Lj{XYLs^RkLure0LkWv~LothVLlKL3 zLt%?>LqQ9FLjenSLp}=!LtYC@Lmmr5Lv9N#Lv9OYLoN#$LoN$ZLoN$GLrx10Lrx1u zLoSP723!_j47e=b8gN@YH{iB-V8CN>%Yet?vH`EfSpz#FMV*17MWunVMX`aZMXrImMY@5eMWTVWMYMsg zMVNtsMSy{kg|~r;g{y(Ng}s5Lg_VJgg^7Wkg`R<RJVe2eM&MHb!q zr4|kPl@_J?H5Qrr^%k-EO%_4=Z5HnOofg*mJr?@<{T3?vlPx6lr&;jm&$3|9pKI|| zZ-K>2y(Jd+^p;y((pznDOmCgVZoQ2b>-Dx;EYaIxF+*>UMX%lgizdCp7Ug=!Epqfu zStRP6vk29@XyK)I)xuuyriHQI9SaS;2Ntq=k1YiCo?Ec#y|VbN`_AIM?k9^Ux?e4B z>i)DitNX{|kS>Gec3l?B)w=AK3v{_Hr|9xocIpaQ*6E5_7VAn{rt8XD#^@?o2I{I< zy6LK0TIp(A>g(!Rs^}V7O6rPP`AEmz^16<<g`-WT~ptW+|=HX(_1FW67p7!Sbi}WXq@8(=0D)&$8UBJ=b!j_5#ak+KVllw3l1v zYp=45(Ozrmp}o=4RC|l1lJ<5>0qtFuf3@~nzS25qc|+@n6qdS=O__0saA<{Qfgn(r+yXnwNXuldz- zo#qeAxthN%do=%9)@U+X1y&@$!ZE&@o9=${nL=JdaogE z^*}?;>Y|2%)gcXKtIZl}R!cNAtfp#cTeWHESygBlT4ib&TSaS_S@~*MTG?w@TN!HD zSt)BcScz#kTXAT(T76UZu)3}8ZFNB1*J`jFq5z zywy*&M5~8tDOM-d(yTVBWmwHr%eHD#%eBf@%eM+qE3&dxE3r~nE3*<%tF-#1T5a`2 zwbtsKYQ5D?)h4UOsx4N1s%=(PsvTCTs$EtAsy$XVs(n@(suQh5R3}?8s7|$dt1{i{ zrpipKV=A+)Hml6FTBtJLs!wI1RgKDGt1OkJRuL-8t=v>rTA8Y>vQk!AV4?=trDIm5 zN++x$l}=jODxJ1cQaWqJp>)pbo#F+nD~gw_b}L@7TBLZ@s#Ed0RiWZdt4PILR*s5y zth5yGS_vuMxB8>-(CVqeBdhZYPpoz-JhfV)@Z73T;iXlj!Yiv3g*R3K3U95f72aE^ zD}1mLR`_W3PyVyjb@?w=8|1%Pb;*CXN|pa%(K3Xsicv0h@^?Nv81WBkffRQX9;ubD-ssg+axTlXGmCCS4&u1$4l5+yGYnsYf9K# z^GP^ZzYuq{-YV{7-6ZZ}9VqTkKh3Ya20dYXLDI>t~|A z)_X+#t*3|vSm%ibT6>BHS*wT!TQi7;SlIBR#|cxwUS1nXNuiPlSmlB^4alC5opQmlD}QmyX^rde+kOt)?o z%&?9Y%(ONV%(CVZ%(i|ikYl}HAlG`9K%RA(K)!X5K!LTsK!G){K%wN)C@>N=Y;;ppa!&_zD&RcCA%v)ov$Xjdufv3*;08gFu zB%XTf44wvS2cAZ2NuDO_=iJTKv$>nCgScC)xwu=c4|BCy*KxI5TXVHr|L5$mKEl~) z-Obr$9mLsXEzQ|&{gk7}dMihdbt^}&br?sVwFXDO^;hpAQbtX!nN!t(%z^Stl|rwzgwhVlBh8#QG=WQtKOx z%dEFCF0-D-xZJvmak+I8<8o_v#ue6Dj4P~p8CO`pXIN={o8hv>ZlhxsD~xtoOfy<< z(Q35BqQq#HMT*e`i%_F>3pb-W3k#z%3oWBO3t6Ld3jw193l^g&iywv|7H%id*;?idwiBidfhh3R{>O3R>tH3RtKc3Rox@@>@t6@>vKO@>y^j@>#GL z@>={g;I;T}z-#frfY0Kk0iVTV13rtp2K>-_dIT&^8VFh(HW0GdYanc~-9W@*qk*W! zY6CHgB?jUa^T6x+r7R{JNL%z8$Xc`;$XhfTC|Fb*C|Q&ms95A1s99thXjmj0Xj#M> z=vYJ;=vf3A7+Cli7+JU(m|8d*m|IvISX!7F*jN}C*jZ>9I9jM0I9tdYxLHUVcvuJ< zcw6uq_*rlm1XwT`1Y7*n53_iyA8GMOKgQyke!RtL{X~oX`Y9G$^wTX?=x15X)z7t< zs9#{wre9)FrC)B5uU}=6qF-wfq2FNPtKV$lsNZg3rr%|ut>0@QuRp;;M1P6}hyHYn zKYFt)KI+Z0c&fM1;+EbLi*tG_EDr0fw%D$>&SH(;CW{4nTP>#Q?X>9B+hb9ucfg`p z@32LN-f@dqy;BxJdgmdKXqSOyw!bY z@ksZh#dY1U7H4#SSRB;-W3f$_!E%)@v*mnUcFQTcT$UZWe3rGkf|fXrt&T9zuhdX|#9hL(J~rk2dQ7M4GBY%JgE*jqlcm+#>m*rL=%iZa>10}_=;T;N>Ev7b>l9nM z>Xcbp>r`19>eO1Q>oi)*>a$F>P>U3NF)9$l;r9IK|n)VdSL)tSe*K5zVoUJ|2 zvO{~3WvTX3%S7!JmVVl+Ev>cJTWV-;vJ}1+3UK zg{;17h+4hSkg&R`A#HU^L(XcqhJw`^4P~pj8fsSk8k$xO8roJx8hTdA8irP(8pc-c z8fI3O8WvVM8rD{F8g^C!8V**>8qQX4)LpGEs(V;%SNF1-qwZ_ftnP1>sUBn%s2*Zv zp&o9fpdM+(p&n!PK`qYehFYT40kveSm1?P06V)=Ts?@TqlGSppeAV);%+w046x52X zxYWw5zNl7M-BYcyI;mP?wOO^^YMyGNRi|pRRf%e=Rf1}}m5*wtmAPtWBPFTq+owQ<6I&Jk*@vPN(#dB8M6faoKRlH=?s(9Hd zNAapvh~jlCTg4kzYKph4_!aM1{ZP1T^+@5q)ft5cR@)RFSuIp}V%4MY)T&(JxmA+F z3oAc`S5}q^udP%S-dYJMytDc%|K94F{70+x@}I1_yWCH! zD{{ZAHp%_AnjrVbDqrrOm7m;yD?K>|YkoN<>kqQb))!@2tT)TDT2GT@x2}@qu#S`E zvUZZ?wpNqnwdR)Pv;H8%Z+%rp(0aFwko7_tVe1YVQR_SzG3ziHacf%{No!RZDQjLC zY3n!AGS>T~<*X-2%Uh>ND_C1dD_ZkND_K95QnB7GrD{DzO3gY?O5NH+O2b-NO3V7c zq_*`PNgeB*lDgJ2B=xMzBn_;?Bn_?2B#o@aB#o`VNtjsQkTA90DPe9sN5aCoUc%Bk zNy5t7O~Tq*Tf)X#K*G-Yow&XAZgB_ePH{);2yrKCb#Z6wA7ZZ7r^MW>=ZLvm7l?US zyNG#OONx0}zZdnkJ}T;CJxA2nxvA~IS!qs9uk*mep zkE_+1m#fYC9A~@rG|qPGc+L)MP0mj1&m5iB`#HL-dpWwT<2ib)jX8R)**W^Gx3TwG zC$jfj^RiE{-o-Y-I*V)Wi8t!J`Mwhm{VVlB=()%rTiRO{I+)2x$Ord#W> z%&`8>Jk$CR^DOJB%(JYEnP*%3G0(BqV4iEu#5~XX7Snv|%}fidyO|bPr!y_Ic4t~- zt;V$2nw4p>^%KS=)`uCFSTAB+YTd}V)HHTB(x}-&+o;+?&ZyWz&?v`(#VFO{hhdz> z8^Z{T2Zq5GR}FnFP8oVw>^F3_*lK8RvC7ceVxghA#dJesi#|hri&jG&iyA{si(*4H zi!4JGizGuui%3Ixi$FtJ3r|C73r9mK3oAnj3nN2u3vEL&3uQx53mHQZ3sFO13qC_3 z3wA>x3r0gBi(dwU7M~3SE#4RiT0Aolw772|WO36#$l{WLki{7TVdyg zftE#-fsRFpfu4n*fuV(mfw6_NfvJV9fw_gbfu)6!fsKWZft`iAfrEvjfwP6Qfvbg> zfro{FftLlBfv*LtL4d_S{UD1^`k@xj^&>29>qlE$(2un^s-Ix7Q$N{aoqn3dV*N~u z>H0YqJ^J|;4f;hErTV27nfetLar)I3!TNO;9{PK(W6(>rD1qIb^1QtzULp59dpWxX2~5_)$mc=YaDFzP+F_@?{J z;wNm)EjTSI{y| zSHv<}SHdztSK87|SKiWESIN>qSItsYSJP5TSJ#qX*T9lR*TnLtj=AMK9V^QxI(C*f zbsR0v>9|@R*7301spDh0PRHMJu}-k%Or0>xKAlL*7M)njDxCz&e4P}_RGoCoXq{}! zK%G2Gcb!5@Tb)u%W1R|1O`U2>d7XMoQJp4BZk;wuMx9Q}_u4&{ceML0PiRlJ+@d|r za)I_t%U2w~gC(c-X3K9{+bo}G?X@VGP3yd6sMaM*XRWK2Mp`#46}4_#@@w6*{IB`Y@}1@r z%e$J-EzfAavfQKj)^d&J2g})-pDnvJzgbpm{hJe+34PmPX8lqMgH6*MKX-Hdb(U7xRs-b8#T|?QbLqpA~N<-5sM?>2x zRzuIqU&GMKQN!5EM8nKVO~b-ULc`jMTf^4skGg}^Lv?4X8XcUiK&NK{Zosydaf32bzUvbYKK~a)dIC-t4_64t0J{@s~EK`D_6A~ zD}A**D@nBiD`vG~tGBA9RyS13tq!YJS*=yAv6`V;XVs$GV3n`hWEHL2V&$gVZe^_6 zX(g}PZN;tHYxP5=-|DH#M5{|GldblvOto60GTmyH%1o;cmDyIMDs!z;ROVX+sVuZ| zR9S4Lud>uiPGy-DugVImU&^bjZYr;_+M&G8YKHO#t4igKR#D2Et*n)|TFEMJw_;G< zY4u2Hm(@|FJyt7}_E~i+9k9w*I%pNFblA#V>8O>A(lIMWr4v@q6i->5Q9Nz6N%5@J zOvQ6n4T=}6G88Xa1t?y&vQ)fkrKEV>id*r9)mMdER`(U|Se;b3YqeS7zSTU12UeX5 zkE}`*9$UpLJhk#xcxGj;@WM((;iZ*;!fUHv@^7rJ$iKB(C;#56Q~rZhiu^|_d-=~+ z((+%dzRP{Jx+3?@YLna#s|j*Ht@7l4S^3KSvC@_MYsDw`&+5JGf2#|!jMkfEnXISC zvRIePvRX&WvRgaIa#*X#a$0lBa$CQb;jz9d!)Lu)hTnRjjDU5AjF5G{jIedMjEJ?J zjF`2WjJP$wjD+qTNN)}>;u)?Q-n)(T=C*55=utjSuYXwwyqWRu?`dUwKfp-v*r@@w|*uPV0}a+ z(0Z{*kad$tuyvA1h_#bQsI{_4m^F(?xb+#~2Eq0y)-F0=d>-`17o{@aJ2X@)uZ}^A}qG<}0$^&sS{S!dGJL%~xtI#8+y4o43q* z1#h`^DQ|_f3vZ>h2yd13Q=V$;Z9LW1ojf(xu{^cbMm%-a96WW_hq>#mE4dr24Y(Vv zUvf2CFXn2pPULE~R^)22e#qHky@a#XI-Rr4+K98=`X5KT^=Xa{>zN##))^dK))pMy z)_fe@)+gC}tjpMYtyS3jtS__mS+}tDTbr>>uzt-t!Fn0%MC)|cN!FUIldWH~OtD_a zGR3-xWvaCW%QR~img&|PnP*tfW1eB1!#va4hk2H@7V~UtcIG+OkC^6K?`4{2J)LQu zbs^JyYagZs*1Aj!t@)T1TEAmlWPO%#k@XtJ#n#=7i>)&mmskfeF0nReTw*Q7xYYU| z!!qk947V-j8J)A}F*;;XWwhNQ%V>>7l+hv!FQb_j)>un0F)v+y@mv2Zt3vamN)urN22v(Pt`vCuG-woovXvXC^Cv=B0s zu;4Znw_q_8xAu{bGw0{W6P4{Ynd8{Td4={dx;?{U!??{Wc3l{Z0!p{T>T0 z{eFx8dXp@^=uNeFsW;Q&uHGDrOM3Gyj_ED3*sZtBVuRjFizRw%EN1Ghx9HQ`Y|*T@ z&7xdyr$vt5UW-J%0~TR=M=ZScj$1hBow6|1J7=M#chN#Y@2Z8U-VF;by*n2Fb?;kz z(S2<3Qump~J>6Fpmv!G-oY4Jfu~+wt#U|Y!7Rz;iTg=t{Z!t-i$+BIS&9X+9)3Q*P z$1+V zI%$?cI+>OpIyshhIt7*{I>nY+I%Sp$I#rh9I<=O(I*pdhIxUu8wA(EoXm?qj)$X(0 zsXfthnf4UR$=cH`>$PWF=4j8ejMQFe>88EJ(nNc?rK0v~OMdNjmVdN1TE5cSVtHL_ zyX8@>U6z}*_F68~I$+tab;Pnx>$qi()+x(qt+SS%S{E!Wv@Tn!YhAMx)4FNNs&&Wm zi{^dH$C{5UFKa%vJgoV`a+Bt3%SD>+EGKDxv~1G+Vp*j5-7-n@r)7}lA4_M=|CYv@ zOjgR8tX3kL99FEFTvlH-c&(mm2w2_F5Vkt0A!fB(L&9o}hP2f@4LPd`8j4m;8p>A1 z8fsRl8k$z&8roK#8hTbX8U|K+8pc)%8fI3)8WvWp8rD`H)orb=t2$gu3CiEF|}x`^=h$JGt?5S8r71lveZ(n zLe$c&?9?)?G}N-Kgw*n^{-_pMJy$KVx~N)WwMVtwYPo8q)nwIbt2)(Mt1Q)et1#6@ zD<{^)e%(6;U znPcUzGSA9ZWr3BB$|5UimBm)vDod@tDlfOXqP)^-i}Gr#DavcDN|e`Gg(`2bGE?4U zC84~<>bKH1tGi0utqv;fv|6IH+p1k@k5#tPJ}ZBv16C$V2dyNP4qN?GJZkks@tD;q z#S>N=6i-=AS3GT1r+C&XRq>paui^zOQ^iYGa*CI&*cGo@eN?z+bz9+v)lr38RvQ#< zTg_IuYt^Q3&#F-2fmN)+Ln{x3$5y5aPplLbo>}oJJh%ET|I+HB{41+9@~^Gh<=#i#U(7Qe~DXJ9~ZZ_o+55zog{8+Z6t1I z%`EO0x(>r0~U)~iK5teZu>tYbyJt<6P!tc65< zt>23HS)UZ~w_Yw1VBIDXXq_e!WbG~zY^@;@V$CHIYJEdE%zB=1xOIwfgteY37#73``oqG z6S(WF-MQS8_F4n{hQ-f8%Vj-p<)lXHIYZLY!>!)lz*3;Q~t-aa$tQpz*taq^XTNkoUur^_x zX#JCAlJ!28$<{3_ldZj2rdSKHOtrqvJk5F)^K|Pf=IPd6%rmT2m}gqEG0(Do$~4>h zFw-3C1x$0StC{9nhcnHyHfEY{EzC6E`YYoC>#K|lthX>Ow4Thk(7K3mp>;6hB5Nzg z#nuXpi>=uhmsr1KxNkAR=#oX9(J_l$qumxUMjI`BjFwy28qKxPGn!(dVANwFWYl88 zYE)zK!?4uijbWa}1H%l9D~5>{CkrLw(&Ds%q{UGKNsE03 zQWiVFck@bHtTB+bSZW|+G2cMeVy1zd#bg6{i(Uf-i*^G=i$?Ieer1bN16A-?f0luU zMT&u@MVx`QMTCK_MUa7>g^z)Og}Z@~g`DnHG)uIToe*`4(CFMHcb;r4}Lj6&4=))fTq;brweYjTY+qEfzBR z?G}RiT^4Nmy%xXpCRn`Jn{4q!Z<@tTy_pv0^yXR|)>~k)U2n0)8ogx}3-wl7Ox0U! z(WSS+qF!&aMTy>ai%h*;7IAueErRt9Sa|3iv9QrQZegf*+Cp9LoP~_uMGHZ_s}}5f zH!S|>-m&b|r%ru)`nx9$gvjk;efmg#=Cn63NUVuJ2Ji#A;* z%W7R#%K}{v%T!$+%V=GG%K%+rOIKYnODkO|OMP8gOBG!OODSCyOMYE-OIBTN%U?Qr zmhW|pET8I_THeyJu)LsSV|i4^-g38&v*iXIH_K%@o|dz9d@U#H1X#A|1Y6eVgj*Kr zL|JC GGbBw7aRq*!|DWLVnkWLui)_ilv+yYR9N!qR9mv@)LVYnZnAu$ z-D-JJyVG)?c8}$1?S9J{+LJ6>wWnDYY0tEb*PdhPqdni!QhSl5n)Xsl5$%YKl&#`5)T{zEG_9O9w5`lE^sF>A46LLzjIDSzOsyC+EUccXTUnh^ zx3$`=Zf`YH-N~v!-NhwNR@)Y7tgT)uOEW z)nctG)Z(p@)Do?H)KaX>)Y7aJ)H1BN)UvImifWBjfNGtUjcTKnrfRd5sA{VflWM!wdzDVBJ1X5)r&M~awyX48EmfIlHCbh{ zRinyOt9+H|RUSZX*ywa*b zd9_ub@>(k+<@Hv=${Vb{DQ&X4p|r(nkJ2`)`AXZZnw551Whm{o@=@ArWvH~zN=)g1 z)o;Z^Ru2^qTOC(CYPC-BnAH@;6IRuVr>v3{Pg{8_p0zSoJZB}Xc)^NA@sia$h09hq z6s}qwQn+TdM&X9lbcLH%%?h`z@)Yh^MJe2~a#Of(Wu)-XN?zfS6}Q4;t55Pzt_$|y|=m|_rYqD+()Yka-Xd7<-S>&r46*1Kdl ztryC0S$D|rSQp6fT1Uw6TRX@ISZl}#S_{euS$~rju|6p+YCT6<%(_ro+}cfA(pp+t z%KDR(wDn0T8S4d7veuPS^45V;3f9_Eiq@=BO4bh~m96(ms#?#MRI{#>RJV?l)UdXc z)UuY8)VBU5p<{hlLeKhugueA+2?OhP2}A2_31jO32@`8m2~%q+2{UU333KZ+;uhAk z#I39|#jUL^#BHoO#ci!`iP>4N6SKE&6mzf+6LYfG7IU^{6mzk@A?j+qLDbEOTdYxdrb)#T{b(mnHwYFfA zHIrbn^-X~k>rDcw);$7g*69N2*3JUy)(Qd{*8ll4tq<^LTetG(SbOv5SPSy!THoNy zvtGcLZ=K0kU~R-#X#JPB$od3tvGr8m66+-1QfmX=Qfmg@GV4n`<<`r1Dy*w{Dy;)~ zDy`Lds;vKUS6i>=uCY$!uCW&7uC>0%RcGDLRd4ObRd3D5)nI*|v(b7IXOndpXOp!w zXS4Majuz{U9Ie((9BtMi9BtNW9PQSh*gLFevUgg$vUghlVC%A8!`5w`$kt;m!PaYi zp0(GygSF4viM8LFk#&Og36_c06Ido%N3u+^R$`fK{hE1-^)}`y)=kV)twWfnS*tTo zxBkmC!}=l9OzXo;v#b|0&9ZJ}nr$7=G{@S8X^yo7(_HHxjPtB-G0wBz#W>G;CgXhT z3dZ@?VT=o`Z5bC@t1~XL=4D)D{hr~GMU&Arivpul7V$>=E&PqPTG$({wlFYSXrW{@ z!$QPpf(4sVhs96B28%a_l@<>Si!81f=2)CCOtaW)m|(HVFxp~;VVK2S!$6D4hCUXZ zh8`C6hAtLmh7K0FhPD3AhAI|3hDsJJhKd${4HPWC8OU3_H;}h@X&`6u$Ux5Gwt=k0RRdXza|W^&Ck$jQ z4jRZ>>^6|K*lHkavCcrwVugX6#UcZFi#Y}g7E=urEcy);EjkU9plA4~Sd<&6S`-p4NNU849qNy3@j{k46H2F4QwnF4eTtW z4IC}R44f?l3|uX^4csl*47@BD416rU>HAr{)(^CJpdV~;RX@z)q<)0OKK*Em&HAwx z%k>j1=IAF|Ow>=cXw%QIsMgQ6DA3QdNYyW}h|({%@YgT1aMrK1u+Xou(ABTEP||O* z5Z7uq@mg=9#RI)57FYD9Tb$CHWwBpxuEiF;g%&IHmRQWyTW&E) zZFu)c*V}91s&~-BO7Dn;p5Ac_WxdlDl6vPX`1CGX zFza2l_^Ert;+^gtizmAGEpF;QvN*5%%;JddON*VlZ!Om8ey~`g``Kcq?stnm-Cq_h zy8kRHbr~)5by+M^bU7@ebh$14b@?q_bcHOfbj2+7btNrTbY(0hbrmf6b(Jkybk!_> z>1bKL*U`0ns$*z*TgSxmf{wZ6F&%5m-8y!b8+9Blm+QD%&e8F(oTTGp*`ecaS*sId zS*#OgnW+8+D&>8O)tX|9uLsjHJ~sjO3ADWy|vDWFqs$);0f`AfUj z^0{_{)!Jq`TWhCfm)0K33a$N?=~{;@L$!`tx@euSG}bz8 zsibwzQc&xnC8O3A%MY5@Egxv!vOKSO*K)t+1IzWAk1gkGKC|rCd}&#)`NlF|^Sxz) z<|oSl%`cXYn%^xAHGf$uY5uho)?~0^(PXyzs=;dYOoPMfx(2t^New=$T^a&bYczzd z=4psoP0*0AYSNIlD$$U$O4CrZiqKHD^43tZvenSAGSJYrQqs_~64fxU;?OX*`lfDb zbw}O8>X5pX)e3c6tA2HRt1@*bt5|gxD_3=QD;;%DD-m^Xt3PUfR!`Idtj?$fS#41Z zwVJCIZq=q1X_c=QV-=|uXXT=nXr-r?Y$c(VYQ?OUZuL$z%j%|Tj@1#>JgfDp1y-|F zi>=yJORb7j%dO&6E3Ld#tF6pcYpqmN8>|FWo2>q-v{=1TX|uYa(qVN}rORrwN{`h- zl|HL}l?hh0DwC|TRi;=)sZ6u-RGDFAp)%7-U1heFn95u$R+afyuap;Bol;(GwMu!3 zRhRNIt8C>JRzAwBtn`%ESP3YvwfdyA-s+0dMyu^go2+IlZLz9X+Gdrkw8P3nX{VL0 z(rznZrM*@^757=)Q#@dGRPm72YQ@7=lN66yRVp5{N>n^y<*9he%24sNm89ZXD<;Kr zR<9KxxaLdYB;kK25!d)vFg?m<<3JayG$tBrE+tR~34x5}6MXyq^W z$x2V|ixt1zSE~=Q->ojn{;=9C`^##o>~E_I**{j%vj42?W&c~L$TC`U$}(BMlVP^L zBExFEONPyQp$vz0hYY86fee>*qzsR>qYSULmJFY@u#AB9PiaBxGtxrV3#5guOQl7v zy`;sg6{N+jze`D2pOccbUMeMRT_+`D9WEtnZ73yY%`K&1{Y+BP`jDiO^*l*s>l#T_ z>u5pv1&*7qc|tq(}(STB*#wQiTtx6Y9;unv?kv^JA4vX+rBwq}wr zwZ0^7X1ze%+&WL(!rE5c(wa})%KCwrjrArmTkBRaJL_mMduszR2WxgQN9%i{PS)E* zovr&sU98hZU9BBO-K=FqJ*=D;UMcu;b3bg;Sg&c;ZW-vLSfcRgu<;0g(9sTg`%v5grcn<3&vP)6O6U)6pXWu z6O6Yu6-=<^7EH8$ERbluTOi4Lia@e;zCen#w?L}3hCrG%n?SntN&XD$PX0`5AO0+B z5&mrJdwe<8EBJD)i}>=aZTa%8Irs{!uksdJFXAn-F5oS)cHk|x7T_(he#ld5y_u)X zx{asII+my0+JvXVnun*-`V@DibuD+5wGnr<^$V^V>xEo3)`?uT*2-LU)=xR>tyge1 zSm$y!S{rjVTL0o`vOdhwY~9PzY#qbVVr{_DYR$sYX1$5M%{rF7-I|lV!+H-}r*#Qi zm$eRCxAimDZtDfCJ=QU-z19+}eb(1m`mN`&^joL1Ot3a&nP~l+d6M-p=E>HRm?vAu zF;B79Wu9uy#5~pd2Gca_JxtTB7ckARZep5goy0WL+L39NwLH^o>pzUMt#2{TvEIWt z$9gW~Ti3*lU<&vB@yiV!2_w#T>&Zi%Eu| z79ECx7IlWc7A1zB7TJcb7DlwY;oT}$>N5AqQyl6MT^r0iWWx< z6fO1{C|YbcP_)=+plGq$K+$5Ufg<#7UL}i32Feya1}YY92C5bf2C5cS25J^12I>}h z2AUQb23i(L2HN2Dec=Xr7J&x(7T(~oej^J90}~4?12YQ~19J;K14|1{18WOq16vC@ z1A7Yz14j!X17{0f16K=n19uB1122nT`aTx#_5CcK=m%Kb)DN~erypu@SU?g!G#&*!9~i{^)gDeAMf)c&68Haa(Va#Ra{o7Dx4FSnSf9ZLwZ&p2ZTqg%&gQ zmRR)Zt*~g;TWwLHx6UG0Z=*$$-WH2+z3mo0db=$g_4Zkq=^eDt(K}+HsCU9bOz*S> zx86Am2EB_GUv;lqyw<&8@lf}+#Wmgg7H4!HSsc=RX0cuOrNtWEHx`R@KUhrH{cO>z z`^}sT}I1fT^7p-U3N=9U2aQfT|P@oT|rAdT~SLFT?tD`T^UP$U3p6u zT_ww(I%<~hbu=xX>gZVB)-kZWpkr)#OvlV}kB*h)CLLSLg!}!s_JB0O6%lV3hESDa_E#= z{?)Fqe5GA&d0o5S@`!emxL~rIs(WR#;xsT5WkmYn|n0t&NrowYFGJ(AsWUr?ty6S8K0jjMf25FRjCt zmRiRwHMCAziff&*WY;=x`AzeZF~XmS_lAP16vz>d+9gs?w0K%GHpzir0{{3er%pa?wz>GS^VE($dhdlF`t%;@8l% zV$v|MdaZ6`by3~aYKOYH)jV}8t5$Uzs~mNEt6+6UD{FNZD`j;zD{gg9tIulQR=3rB zt&XS#SglbDvYM(EVpXRWZk4VUX%(mzZDp+%Yo(@^U?rfIWc6D$#p;=Ay46M1Osl=B z*;Xr5bFHSR7Fac?7Fp$}mRLoomRY%~R#+LTR$0lZ)>v_?)>-{fX|#H((rk5ErPb=7 zO1srMl}@WUD&1DyD!o>fD*aX&Dif{3R3=-ws!XvmQJH3?qB6ruSY?(Kv&tN+r^@rJ zjw;W$TB^Lzs#SThRhsfrD|hAPR+`Eythkj|S-n$QV|7t!oz)hl^;XlBHd<9HZMKS6 z+G6FRw9QIWX@?cR(k`p7io30DEAF*Aq`1#&rQ!jr35tiT$`ub=#Va1Qa#K8JrLTCx zN?h@z6@%hwt5*tVtS&2@v)Ze0-fFqRMXN~)m#k_PE?Z?NT(t^OxMt;`aKlPh;ii?8 z!fh*dg*#R+mcMT`PyV4*mHZ>CaQVkprt(j%gyf%DeUy7)bwTc>)q1(tR(*1B ztn%dES^3F*u+o$JXvHu0+3JJr7pqIMU#+&tez%$?`@^bI_Lo(x>~AXv*}qn*vj40& zW&c~fmtnNNBEw|8TZY+sp$w~arwp5QfegEKqztFEqYRg|whWK8hzzgwA89`83)1}7 zOQZ#@E2V|3{iTJiRi#C&e@ls3UzQTLUM(eI-7F<#9V;bmZ7wBaEhr^x{YFyG`h=u{ z^%6-%>qbc>>v&0JYgwgmJ*7qeetPe?OS}&E*w(gYBvCfsywGNWdv$l{h zu$GfBv}Tbovc4{EY`s+6#JW`6%-TiV+*(xJ!upw*rS%RmE9)LHYwH9t8*5WBTWcOM zd+W!d4%T}_9j&K|I$7t5I$L{+x>zfVx?2AiakIWH;%>b|#KU@;h^KX_h_`j9h>x|I zh_AJ{h@bUGVSnrG!U5KG!hzNv!a>%;!ok)LghH&>3WZu%358jE3WZxs2t`=G7L2ss zCm3ZtNifw`SS)>C*&tTTB^t?hWqti^cBtRHZfTTkV#u=eJzv}WS2vfj;AWnIQqZEeI= zWBr}8)_ON*opmE;owWyNy){2)gY^xLM(f2Kjn;V_P1e>N&DMMz&DKZQTda%NTdft? z+pI6JwOco`by!=mby|O8?Xup?+GSn9+HI}R+GG8WrPq2rORse?OP{qpOTRTY%LMD| z%oDAbFi*5DVxDB}z&zQSpLw$N1Ewj~+nAK0cG)GW>!s9GF1 zP_;N{plY$pK*eHm`LHBhzaH&CGEj$}*RN?& zV4!7@WuR@5YM=w&%O7c=XAx|mZ{Z7G-)CguWME=pV_<4wW?*h%XkcNXZD3`gYG7lb zU|?qaDiO(pzT{ueZq}L~pBwr``?=JH6c&#(MiKH1rNy$mt!m z5Y{_k!J&8B;;-&Gi_f~3EMDkdwYaN$!{V~;ZHtq-_bvA8KC;-N`_y8U?n{dWx^FC| z>b|$=*8ObJp!?0DO!ucnj_zNJL|q2Ua9w6gA6<4!CtWT}3tc`-JzYUdWnB?VNnHs` zeqCux7F{{ZUpk7G?{!oypXz8>-qO*wyr83Rc}&O1a*vLw zTXyQWS=Q@#T9)egSZ3=4SSIQOTZZd|S^DZkS-R-NT3YEOSQ_XgTdL`#S<32USqkgq zT5{?XSTg7oTfWsUx4flYWqCro)^e+MgXJRaX3GiM?Ur@gU6$F}y_Qkh6D&QnCtI3n zPqS3fo@FVhJ=gNT)&k47T8k}jYb~=prM1#>ht?X)Wm@Ykr)q7oY|+|kS){eYGEr-{ zWq{T`OM9(@mik&pEakM0Tk>k1vizfY*7A+!1ea%mn3YuRn1vP(IGHL#{{G##K@~H-c)pZSK zs}mY*R=YGftk!67Tg}zrv+CCnuxiv0wkp;Tvr5yDu!_)-w({1Hv$E4rurkn4wo=wm zwGz|Nu;SFvw)&~AYxO|g!0MQ~k=0stQ>!WJ=2q3}R#r*sHdbEhc2RtuEpSv4vzuu4*1WaX^9*h*D-sTI5Oa;sNLE3M8dt+Lvnw8mllr~$bDQ&glR@!FuQE`XW4aHqn`xSRvEmPcU)vLJAszmXCRgB_6 zD;LGXR=SEutV9)$S^ZNuZuLUpq}4@*Q&zhb&R8u|IBPXQ;ha^q!Ud}|g^N}}3YV?y z6s}llDO|G>SGaD)qHxpdiTo|A{qlFLX3O8TDwn@!6(aw@%25816~FvrtG9AbtT%sP4>4Hx9lIQ4>JF(uF3qj+9Shgy-0@1x>JVPx=@DII#Pzs+EIqxT3d$GT11A+ z`mZ#%^(AQ@>*dmX)-}@n){9h`3qL6LGh$ z5%I8&7V)&U7V)x{5%ISEE9_%^NZ8l9L)gzcKsdl!N;uH^sZfyhW}#r~CZQ1PK%r1; zC803u&w}CBM+76RX9z}G=Ltqxy9h>GO9{qUe-enbJ|z%my+k11x?Ui`I$9vn+FT&X zT0|hp`U!us^%DLR>s0(_kg*6aB)tSk63t)2O@tOfb9tsnB{Sa0IZwQlCk zvku|SvsUBHxBkgfV10(C(0UL`&p3XGcx|C^(bu80VYX_#O z){0Eitp77kv%bqX-Fi3U4C^_JGpw5#XIf`4&a(DqoNcYkILBI=ajrEJ<6DaeqlXsm zM%OINjZRx=7#*~bG}>;#Wwg%XkKs~__l9#V9vM!xxN6vIani8OVy|I?#YV$Qi)Dtz z7PAfWEG8IcShN`?ThtiFSri#YS!5W7S;QL#S%ew-S@;@yS-2RwTUZ;qSQr~RT4)>E zStuLYSV$XMS_m7OTW}kiS}+?LTl_IFviM?PVDZ*K-{P5puEl)=9g7 zXjvRF(6rcRplPw)K*M6AfriB@0}YEM1{xOg3^XjJ8)#TeG|;r@Hqf+aHPE!EH_)=E zG|;vvHqf@nHPEq0H_)|6G|;n%Hqf^S1@GlIwD2-8vT!jlv9N=#?=v>Au+TNIvd}QF zwoo##wU9Bew-7gQun;tGvfwdrv0yWBvtTsvu=uX;W${Me$Ks*BpT#x(0E^T5K^6z~ zLoK%Hhg+=CkF;2*A7e31KhC0CKf$6wKiQ&GKh+{jKf@wkKg%LSKi9%jzreyyzsSN^ zztlogzrsRJzsf>bzt)07zro_KUbDq#y*7&%dL0&b^|~!C>GfG0*PCduM{kP7CcWtv z%k^ei%+Z@`F;Q=UMZ4Z&iyFOU7KM5%Ezt40EpnJpOnC@+h-MaTJHtIgISg!lj zVy^B>i^;lgEIM`HTh!@(vMAC0W|5`)(;{B?k4301gQd4Fv!$aho28j9m!*y_uceZ% zfTe`4h$Ww{xFw6Ol;uwyS7XbwVv&bs{XSb)qc|b>b~GbdoIP zbW$xvbTTZtb+RoPb@DAgXct-D)h@L>tzBWcL%Z5?nRdP9WbG!)M(tM1eC-a)SnY00 zZ|y!yOYMo4>e^E+#k6NwvS`n?{G>I{@}bs3%kx@GEca?Hw_KyO%5s+0TFXwY4VD#J zn=R9|wpoU0?X+~&+GA;=wck=j>yV|e)=^6)trM1?G*4ST(mZE*QS+kZLCwpS8#S+4 zF4VkfIZ^YDWs~N8%OcH3mdTn=ErT_mTe@hzvNY9vYpJIB!BSlFvn7Y-SIb`-KP+Es z{IeP0Xz*E8X$V;5Y6x4!Ylv9|YDieQXh>U` zYsgt?X((99YA9O?XsB8-YiL-#RoAk*qONPTTV3C3k-Cvpr@Dz%p}M(Mgu11bgSw5C zhPs`VfVzX#4>f12hia}?r_|i7HmiAA%~A8QYE|>I%2x}tickx-a#9Pm(oqYy5>tz^ zVpNNV>X2%()jHKwt68e)R&A=8R>i8>R`IHNRz9i)Ru-y7R;sEcR>G=f zRt%~YR&Q0RtZu8+Se;aK-D$lpFS6*PHsJzIES$T=oGo@u# zCzY04tx;NOH9={$Rf*CXt4O7FR<=qTtdx{CT5%|CwtA*hRrf}5iyuxv-T?!|xmMEOE>Q^{zRi$v& zDplc}Re-_;D;tH2RvHSItV9*ASTQMFwYo2V-DGDfhz4OYW7Gw%ltgUb(kc?`7XvU6lP`wMF)$)pXg< zR@Jg!tm0(9S~#Gvf2{V({Igmt^WUmlhQYc>hRHfghS}Ol zhQ(T2hRs?;hTZzFG>7#iX)f#K(%jZ{(!AE8(tOrB()`ve(t_4^q=c-uN(o!{Nr_r# zNQqfHNr_v_N=aD%kd(5%A}MXXQBuabPg2%8M^et(OH#pFQ&Q2ILsH55g@m&8NeLC} zRT8S!y%Oryg%TRpArhL_mJ(Xl@)FwCtP;A`x5V|VSBmRfSBV=~`-mG_%ZVFXe-tyZ zJ|bpnJwwdQI#I-f>jk2=)>Wc*)}f;I)`p^v*1V!l)~`gI ztxt%!ST7TCwQd!0vrZ9lw{{WnuvQWAv}P6YvOXv5Z9PTU$2wZr*IGr`&-$H^zx8gR z0P9YnKp!{v_){{$y)o{uJx)e5uxZ`O>VL`O>Vt_|mOK`7*2@ z@n%|Y=FPHh<;}K^;LWkt=FPQc;LWwZ!josciYMQ?fv3PajHl3AkEh6*ji=apA9t~J z5qF8TI(Mn{W3Dpm`CR4Jv0N3_vRoC`cR4Gq=W|wBr*c+X8*o-z|K_N%KF(2VJ(;7< zI+3H^+JK|Mnt`LidJ%i0wGVrf^&hro>$Pkx)(LDa*1~M9)~8w9tlL@Jt-V+~toc|w ztuL{3T2Eu?vW{WtwpL>4v3|?kW4({L*Se3n&pMvD-&&u!-j8>-#J%v<$2* zR19n^TFlaqwwRzFXVI#kU{R%?WRb6*YLTj+ZV{!QW#O-%W8tEoZ(*rl zXrZTHVxg>GZXu~(X~CyoW5KLnZ}C&F(c+z6i^XHTc8eQ&T^48cdMpm>^;_)Fn`E(8 zZ>q&&y%`oW^k!T1>dmug)>~*%p|`{$S8usRvfe6-2)(ryetH`$ob@(aSm% zp`^FRLR@dZ1+U&A3nsmz7C&@PSiIFeWARw`yu}UOOBUyJuUZ_|y!I!d{oj(o~ntQd^hP zQc;)3Qe0QSl2=#Ql37>G@~4iZ<$E1j%cnXDmbZ13EidS(Ssv5TvfQJiYq?3sz;cC- zvE@7+bIU0@R+e2lww8@L4wmIQE|$4E?v}|qUY3zMzLo(xftGGMA(l2e;g-faQI?uI zv6k{W36^3yDV97s>6XkoS(cx*b1ffe7g(OtF1FmQU2eHjyUKE!cCBTLc7tV+cC%%I zcAKT2cBiF{cCV$j_5@2w?a7uL+S4q*Y0b2Jsx`;*iq?F~Lt2Y0H)<`lT%fhWvQKNZ zWv$ja%N(tZmeE>UEWNb0TUu%DveeYtYbmL9z>-7ju;mZUW0o&8Pg-8rJZ*Vg^PJ^& z&5M@HHLqCC(7bNhp?S-)Li4U=rsjRiD9uNfUYbuWtuS(^Ql+}D|$*1|jl0oyc z2CG#X%vN(X*sS_BIIJ2qxUGsc_^i@21gs)7gsr?a z#H?&JB&-ZHq^*=SWUa(B6s)*3l&pTMt6Du&SGPK$u4T1BUB_y=y1rGtx}jB?x`~ya zx|x-kx}}wzy0sOXx~Q&RMa#S;{B2=@iTvc)dH1zt3H)Rt6G(2s~nY9t7w&WD=(E! zD=U?5D@~OiD@m0;D^8UOR-cq7SzT71Vzotin$=Y08CGS=v#cVNXIoh*&$W_Ko^SPE zX`$64rA1apm6lkoP+DfyqqN+rKxw5_sM2aHE2TA7@=EKhSd}(dy;j_4by0D%)po@# zR`V6NS+yx{x5`u8X%()x%gSDHkClevUMoSx{Z_ve4p===IAnEB;jq;Xg`-xB6pmT- zDx9#YP&jFoqHx;EU*U|EwZb_ob%pa*A_^C+7!@vA-I2dywO#(I)nxhWR{8QbtbFBf zS!v1NvEr1!YxP|2zSS|g2Ubhv9$B@@J+VrYdurt__uNWD?u8YX+$*cMvahYq%f7YR zEc?!Cn(POwD%p=#ak8JSoMpdQsmp$~;*tGs^-1Q3)eV`SR{LarTP>COW7Q+`*Q!|N zzg4shgSCqcqqU9<8S6thAjku0=wYZ+OueiRo zytsk&XE8(T<6_3vbHq%ni^NQ=J;cnc<;2XbzlmB{pA)sRUM6a7T`y{59VKdOZ7OPK zEhK7h{a(bu`mBhf^%@ap>uwPj>ueEMYi|)ZYaJ1HYhDo#>wChU){BL`tTTnZtqp{I ztbYmlS|1Vevz{R2ZyhfbU~M22Xw4`TWPL?2*m|X4h;^M{sCBSln6;K*xHY3-g!OHK zNb9WvQPvX#qOG$9VyxW-Vy#sK;;b13;;j$yCs;S~Cs;f2Ct9=cCt085OSYcKmtq~s zmujudmuCHzH{E&{Z@P6SZ-#XYZ>F^YZuJnA))~w_)>h2D);!F;*7uqE ztT!?BS+_FvTSqeWTN^S>u$Ew&X#J0IlJ#T8$=1ghCtELPoMPRP6(y~TF}TZ{JwHWn`otSlZFSXkUNFt@m5 zU}|yNz{KLHfw9Ft10##=21XVe4Gb+-85meBF)*;0YhYk8-N3+NqJh3ew}HMzi-Cbf zoq>Txg@J)Zk%56lj)9>?nt`E3f`O4ml!38Dh=H+%pMi;mr-7-3vw<0SFTaHWXfMB& zg^qzW()vDo3o!#n3jqTs3vL4!3swU+i~suW7GLx|Enez-Tin<8wYZ}1Z*fvT&|;r{ zu*GKmP>YrN;TH4sBQ2)rM_Y92$6D0uCs>r|Cs}0ar&z@6r(1;RXIgmbXIt3o=UJHO z7g%WO7hA~bms$wxS6FcBS6lqktF`#7*I@Bdui4_BUaQ3wy$*|$dfgWL^!hBe=uNO# zsW;hTp58QzDS9(4I`!sQ)a%W+DA8MFk)^lPB3^H~MTp)i3opI37WR4@EKKz_TWINR zvry36X(6h&$AU|5zr}yuLl$3kk6FCZJ!$bk_l(6=-SZZwbuU>Q)V*r4P4|Yy8r|C# z3w7^XOxJy6(X0E^qFMKaMWya*i+tVp7HPVlEMj!OS_J9-uyEJ?V_~cN-@;gz$x>67 z)ly!U!%|e2$C6u@-;z;R$nuAdsO38yNy{fXGM2Y=iI?k3UI&PLxI-ZsRIzE=}I{ucnIzg5uI$@St zI+2!&Ix&{wI`Ni#I!Tr+I;oc5v@FTBzn?)ve}cRifr$6{qHH<)P+l zWvu3JC94)_#i15r^;tE{>Yi$Z)k)PTt1YTARtr?)ta?-vttwQLtx{A|tpZikt?X4Z zt#nkgtt3@*t=Lubt-h!fT0K%JvAUpAX0=bH!fK65mDOyOYO5}lTB{0`daHDmMyqg@ zW-B+9Rx2}=b}LntPAgHBZYx%mUaQy2{Z?m`Ct9slo@~{xJjJR&d74#_@(e3e(Q1z3CaY$}EmqlzTdhJAw_DjL?yyo-+-1eDxX0>;!d|OK3j3|jC>*fbrf|q= zp~7LS9)+V;ch_pM+ihS~b6G>i30X*TP6X?E*SX%1^$X)bG4X>RNL zQoPnXrTDBTOYvLhNeNneNeNl2N(oytNr_nBlN7VwBPnh@Q&PgZLQ>K?Oj6p~Oj5>L zR8rRZn}nS8H3@m^9TJMxvm}(PYb2Dd<0VwAog`GP)g{!dc_cKfpNeZ*Zxq+Et{2y~ z4iML|Rub2<{wk(#eNxQ8dY+h}b*Y$&v3%)@wv9tlLB_trJA8 zt*u3Eti?rbt-pxaSzi>fx85M)U_C*^(Yipy$vRNP+1g0N#acwf&HAmdyY(hv59wy->o&FqYdf|^>u;=0 z*6UfDtutAhtyNfCtRJ$pS}$j5vo2t1v$kSsw`O7Kus+Y+VLgkv(>jN_%i4jt%UXoF z+xi7lkM(Y*9_v1)9_u8gUTbrvUTYzyKI$<#c9Kp7W)hr zS!^<#WwFd~vc)XJUW0*h$FY>ObnbPEr|WD9%4cndSb zXbWA#a0^w#5DOW@KnoE=KMNj1ZwnSf4~strZWdn+TrA!iI9WV3aIm;%U}tgNz{cXd zfwjd6151lT1{M~(4a_aJ7?@eCGcdJSZeVJ$(7?oEmVt@I6a!<6J_BQmb^~LJMgwDu zY6D}7QUha)d;?>POal{(WCIh6SOZgwa063|Km#)iZv%4+R|5+R2LlTWD+5al69X#? zeFGZ{O#@pCWdl3-`aWR;CktK!XA5=%R|_TscZ;9;9v1KPy(}K<`&iu2_q8~y?{9HP zKhR=_ez3(_{ZNZV`r#Hc^dl{L^`kAC^Z!s^$RRi^ouMc^-C@I^vf-n^{Xs?>eX1h)2p|5qSt6~Q?JG1yk5J-5xq`}U3xth z>-G9Amg-Hin58$xVuIdui&ni^7FBw4EeiA&SfuGKvWV7OY7wZn!op2&wS|q|ItxR+ zjTY*9TP$Stwp$44?XqCk+iUSx_khJG-NP2ob&pxx)jer(S@(>^3ElG+`*bf^Y|*`H zu~PSj#eCh{7E^WaTXgF_vS`qKYEh>9!Xj7qwMDY-JBvu&PZs{VUoG5pe^}V){u9M=_pz5(NVSB zq@!WELPy(jo{pa7R2?JBZXHw0MjZ>wavf{SJRLjB6dgy)XdPF}KphWD4;^nyI~_ku z6P-XyZJiKHC7lRM37u$5ew{c=R-Hu4pV}#w&$QDmuV`mk9@NgYT(4bVIaj;bvRk{{ zvQoRsGF`jYGE}?4(pkIN(onn2QbD`Zl25zG@~>9E)|m z%bG_l4{IK`+^l)Za*5_y%PE={EL$}%S(a*EwM^5zVHvJ@+tNexuBD~s14}K<$ClEX z&n$T~Us(Rtcy0M!j=V@HY)2vigGpvMFv#c0YbFAK}Sl{PCul@2RLl`g9%$~{&`m3yt0Dfe4-C{MJ?Ql4z( zqde70UwOKfkn#+xuS&D5ZYa&M+M_hrYJt*xt5&6jR#{4mto)RgSeYm-vyxO=ZuMVr zrPWi#RaR#d*H~>$f7!}i{)&~V{52~k`Ri5>eROB96 zvC2KRdLjGN>a^@LtM#%ktR~C8v?`Z!Flot2vGdn+E#K3Uz6`E0dc z=Bw2*nQvCTGC!$?)N*83#ntQSbgTQ^H6TBk`US$j$-TkA@wSPMz0TE7!l zv)(PPVcjXNX&oW1WvwBuZT(YB$NH?8uJuAOed}^D18YAqLu)lLBkO;n#@5$GO|3VI znpt;?np>xdT39=ZT3XABT3P=Tv9`V@Vq?8U#Ljw(h`n`*h=X;gh@-W+h?BLXh_m$% zVHfLt!mie>!fw`n!tU1M!XDNSg*>g-2zgmo2zgt(3i((I3;9|<5%ja(Cg^Y7B^Y2G zFBoWTDi~zVCm3w~Tp+~ypg^eg9Dy+Fa)EH`5P=A5BY{Y3L4hdihy2mj3;1KK6Zm7S z75QVWpYX+5ui}fhF62wFw&F{)X5mY;zQ~(oy?{5_I-fVi+KxBXT7Wmr`Uy|E^&XxK z>nS{$);T;`)~-C+)(Sj1*5A2vtk-krT4!+QSu1hpTi@j>u%5|PXdTW~Xf4K7WPOdZ z*m?$MiFE>JskH`Yne|7Ga_c=D<<=b>71mK4mDV~ORo4I6tF4!@*I4_p*INH%tF>Or zR%ac=R&UM4)?j^vwZXccwb9y|waNMiOSAPhmS*cpmKJMAmR4&{mR9R)%x%_-nA@%M zncJ-$m^-Y+m^-XrGj&=YVCuA<%G70@#nf%>z|?Im!PH~@m9f|Q7Gt0F5ypP&Rg4p? zCooR5E@7Nx9nLt}+KzFuwKC%rYi`Cr7D`4REQE}nS}+^kviNFv(c+omaf_RV`z%fy zZnM~LxYlBm;WCS5hVv|D8BVw8H=JnEV%Tj_Y1nF!Z&+`UVpwGnWmsYnXjow3ZkTOh zXP9nbYM5-HV;FCtY#41JWf);0WEg6}Wf)|^Waw}4%fQFtlYy7TYXc99#|CZ|cMM!C zt{6C3oHcN;IA&mPvERVfVuyi^#YO{bi`52J7E25)E#?|nT1+>vu$X9IVbNt^ZqZ_3 zZc%4oZc$-iZc$`lZjobPZjokSZjoSMZV_c*VG&|rVc}{kyZSyBm-PKC zj_U_l?9mUh*r*?Dv0OjYVvc^e#YFu`i+25JiyHk{iz5AaiwylFi&*^>i(vgU3s3zF z3p@QR3lsfZ3r+oe3wixQ3laSi3r_tqi~o9+7GLzLEne!?S=`rau(+bvY;j7j)#89& zhs9RCZj04=y%r1fCRj|MgTy)>~;| zp|{3DPj9`2iryv*NxiKW{CYbqSoL;W{L^1#Z%qG7PobeSzORPX>m;VjKyx< z^A;O*FIg8Z8a(o$=krH0l;uESk?OziPa+e6I1@@}|Z+%TpR3E%#`Awp^$2&2oXp56j6Kzb#ue z{#jONFj!@2Fk8iHuvrCYa9BBOa9f#a@LFkU2w2H#2w4eeh+45|h+Dl^m$JI1E@QP< zUEXSmx}sH&x{6h)x|&t2x~7$zy0(>`x~`SDx`7pgx{=jOHB+lgYUWmZ)GV!*saad~ ztJzsqsySFCt2tTuskvHNsJUAyt9e@Ssd-!dRQ0ubq8eazK{d!~w`z#ha@8=a$*K`n z^{P=;*{U&C5vp-kE~*JuhN?+ca;hm-JgVtdzf>}*s?Q8;ELsBpsS zkNioi>++|qHp!p0>Xkodl_`J0%1!>Fm9qS0D@OS%R`=zuS?!a%ZZ%i#rd6%nEvq=W zJ5~;IcdZoV?pv|QJ+OKv`^f5~>|?7nvQMoh$Ud_wm3?6qCHvCKUiP(>s_YvpZrOKM zA7$QK-H`ccwO{6w)iRkcR(&#Gt;%G+S;fixuyT|6X{9go+e%XAj}^1bU#nZv|E<k1KD>qrqh zYbz0ZYgrLTYX%V~>l4Dx))RzXtRsb8t(An`tltW`TkjO|ux=IdvXvQ`rEw*DyS zV|_@_*Lt#`pLM#RzqPHPzqN>9fb|=JKLaZYNLaogN!mLFF!mVHP zM_8}nkF?I^kFqx4kGB5I7j3J-ehZO z-W2P%JSo-(c~Y&X^Q2i9@}yh)@MKu4@nl*v@?=@>;?A}%<<7A-tu;HD{sqI?f{NBFThl%{eNpc{nPq53*NT zXR}vXi?df-A7-nuE@G>-R${BQzRp@_J%zR2I*7HwT7b2|`W#E6bstNUwLeRfwFFDE z^&{pM>$S`+)|Jey*6z%$*5b@<*6*0wtdBCaThC_dur6fku=Zf;v{qp1vi`x?ZGDZg z$9gYguk{MXKI;jL{nllS6Re{cCs^AtPPA5GoMg?-_}@a*=!*rb(MyYOhW9L97+$fs zWq8`+tl=Sx{f4_NHXClVSZ27&Vz%KTi+;m77A=NTEh-KBE%FRIEm91dEuswTECLKG zE!+%CENl$(EsPDbEwl{NEffutEhG&SECdW=EI14!Ef@^LEPfaSTYNAGw0L3QXYtU$ z$Ks}em&GLm4~tU@74594wR!94%xGoGio*oGpY5Tr7CNd-@>j`+n$qTD;ZwvUsHLV{u*I z*W!%6zr{iQK#OhqK^Cj^Lo62RhgnS1kFe<0kFsdgkG3e&kG06rkGDwFPqYZvPqFaT zPqT2=&#$O{K(Cf5Vrq^RJN3Y*vlHNp%cD*SUwR+Pniu7h$Wa!PYh|`;I5v;e+!c%XF zg}vT#3sb#S7Fv31Efn-NScvIuvf$C%YQdYlY&uY18_iSA{KS-RIOCg|R@Xw$u8QKNg`qDc3VMTYKEi#XjE79qN?ExdH! zSvcr^v@qBGVxg=1-9kn8mxYw>KMO%!MoV^G7R$dn?3Q12xGZ1k@LE355wN_jBVu`0 zN8IwTj+Est9a+nbItrG{b(AgV>8M#w(b2N(*3q?W)G@HE&@r~m(=oG5)v>gU*0He+ z)Umhp&~dV~*KxBn)A6*_(ebfV*73KL(h0H@)Csj@*NL$Fs~v6mT0742rgoy`aqSe# zE!ydpi?p*WCurwd)@v77=4uyPMr)T@dTLi%T4>i;s%h6-ifT7mvS_zje%9)+e5BQF zc~Ps+@_^Pv%k^4QEaz)Yx9roJWm%^+*D_aYfn}`LVoP7GWtO&DD=l@k)>z7Ft+(XW z+GP1xbBpC$&Fz+VHFsH_)!b{jSMz}7I?cnD^EHoJ_G_N7Y|uPyS*Ur=GD-8IWw7RD zOBc;+mS&naE!8z|TS{o&v*glzX!%FuiRD|3XO{OhURqw%cx`!D;ZB&=BnyD^l)u^s$m8q_56{xOeWu>lRrL3-H#jCDs^-WFR>b{zh)k!rI zt4(TVR&&%WtlHG9tqRm^t)kWJtz6X{tqjy$tfbZ4tk~2%tUjuGS>09ju{xpZZ?#1= z&}xBduvL$0s8xk(xK*lZq*ah=w3VG|td+KEyp@D%q7|EJvejpmRI7(7=~fq1vaI&2 zElqXreQkraaPHC#uCZ*|C)0Jje)hNxf zN>rL-<*qc>N>^#Vm9WwRtDlOCtR5&Xu{x%>)M~Bba;vF|E39f2S6QVhuCek}Tx(^f zxZX-$af20y;wGz)3Y)END{Qqos<6#!gTfB0*$O+Y+7)(N6)Ehsic{EU<)v`I%1q&q zm9oNND*=V0R=?zrSzVPsVYNa2lvR)XX{!wRvsSM1=d6_EFIX|iU$nX>ciC!>+!d=i za@VYC_g2efK3et4e6lK&`C=6(^VP~-=9`s)%nvI`nV(k7 zGQX{EOaHOjApO^>P5Qr8tTcnQu{5JKw=}c$6Dbz!y;5w})1}z03#B-$eWkdpHKn+% z*`#=^pGfjqAC}~|UMwkK-6Sbwog^u2?JOx`ts*IA%_=Ew{aixA`lN)U^=b)e>plq? z>mmtR>o5s9YbyzPYk3JpYZeJ5>nq~Q)(gZ{tn2Bta-%Mt?!CyT5k~3vThO6 zwvG_fvDOpQwPqF5v%W8CV7*h+(0Yofk#)YPv9*t=iM58PsWq#pne}543+sa-mevbI ztgP!rtgYikY^)tbY^@bV?5vqZ?5)oWJ6O*UcC=0ucCywHcDDX5kcag@K~L-Rf?n1O1ih_`1%0gD1%0ih1^ukQ2>4r{6$r3iE)ZzlBoJgBClG9H zEf8!iDG*})kw4UW6MvX>8GpF76@P^Ff4)fTBYaWT-F(s3!F(~+GJG-C&v;|4H}S?< zH}b|?2k<6XEAu8=f9FZEKFyPCy?`ghx|Ao?+K(sAT8k&$nw=-z`Z#xnbt8ACwGDTc z^$)IW>m6J<)|Fhj)>d43)_*zktq*V(ShsQ(SbK98S_^R&S>NI)wqDLrVqMBnYVE>N zW-Y=|W_^{t+`5Uq!djob()u1-m31Fmm9;%vwe?5V8tbL3wbse3wbsh4b=Hqr>aCZs z)LW;rG+3*%G+Mu7ZnWOT++^L#++-cZ+-xn++-&`xsm1yvQ>*ntrZ(#;rZ(#!rgm#B zrVeW+rcUd-jGfkd8M~~PGIm?{Gxk`QGxl1?F!ov7G4@-lF!oz>Ffv zb_;*QCJR@?S_^B#3JW8{5(`bkdJ9qAcDSgj+l_ z2(`Fp5M*)PAi(0hfuF?*10Rcn23{7s3_L708@OAnF>tk5YT#lq&%oJYx`C6$L<2{Q zZUYC476W^WIs`w)DFYYq`F(r_ZWf#d?iMTt9u|M~JuN=zds#f! z_p!L6?`v^U-_PQhet^Yp{UD1C`oR`U^+PRY>xWrP(2uZa)sM2M){n6$(2ui7(@(I7 z)=#ns)K9T+*H5#s(a*3j($BKc(9f}u)6cUI(J!#z)GxO9uUBgERj=IQm0p#_1HBrH zt9o@7r}Y{w4(K&oY}0GASfkfru~4tuV!B?hMX%lji)Ot^7L|HaE%NkcSfuF9vWU`~ zYvHfAz`|8;k%hJ1QVT=96&C7xt1V>p)>#PYZLr|b+idYqcbml*-JKS%boW?1(A{rw zP4}S1Y270h2X&8IY}Y+yu}1f-#UkAc7Bh4&TlDE(vuM%1X;Gzn$D%;@zD1huBa0Z_ zrxroFFDyKCUt8GezOyjV{b-@B`^7?0_q&CJ?k@{|-M<#Bx(t?obeJta>9AYA)Zwzc zufuD3O-I1;jE=D7VI48cojQ`18+2qWm+8n`&ec(}oT8&<*`=dt*{GvqS)rqEnWtl9 znW|%I8LeYs8Kh%v>8WF9X|LmGX{O_1sjK5|siNa;DXrsYDX0@@$)OWs`CmKS@~w81 zw1wY1i*u+-A7wv^DWvt-w9 zwEU*kV)<07-SUc7m*rutUdzo|6D${LO|qP%HPy0FYldZ^)@;i}t$CJ#S_>^5wU$^K zYAv@^)LLaJsI}ITNo#}UC(TWkk2JShUe?@Ud02C|bCzD37cH$duUP78UbB?bylE+*dB>7b^Pc5rjfa*`HJ(^r*LY@mQsbrN zZjCpVYc<|k&e!;8IZ5NQWsAl)%QB50mYEvAEn_tPS^8@*SUG7hTbXLGT4`u-SjlK` zS@CP|S}|+zTfI{kvbv@&Vzp0Q+-j-1q*brFv{k9PoK>8T2~; z)!piV; zsU%t5QAx2nrIKc~LnXs%xk{GRG?g5yHkCZ9Qk4R$RFxvDP?ZuZ7nL$A6O{@p6_qM0 zQI#4iR+T!dH_8oGXO)|*)+;w#O;m2RDpqc{3RCX1vQ+N2l2PulVo>h0dZIMJ>V(oH ztF=m#ttKf=wJKMdZWXIE!^&A{mX)T`Y%6}HxmMp4=Ud%TTwrxXago((#U)mg6qj06 zDK584Qe0u>t+>j{L~*s1tm0ZLHpO*T9~3rN-BQ?Sbwpva)jEZ(Rx=g0S+ywauqsg4 zWfh~a+sZ>>ua&97ek&z~16KSBhpc|cAF;YDf7EK7{Bf%;`4d)Y@~5nvKIGImY z?lNDj3}n7qNy&V(Vv+e_bw~QA)kf*xR_)S%tm35qTA4}zx8jp#uzn`RWPL!2*?N`~ zi*>0Kn{|K`yS0uKhc$;3m-RDAZtEkGJl2aP`K+5I`K?nV1*}~qg{;*ig{?UxMXX;* zh*_VN5VzhSAz?jPLejciLfSf7LdM!&Le^SELe82?Lf-m;xT5u1aV6_2ab;^yaTRL` zaaHRVVrteq#ni2P#WbuF#k8!=#k8$?#dNG6i|ShM5!JJvE~;-`ENWowFKT41D{5@b zC2C^*QpD8yxQLncauIXuHW3T!G!aW{cM&UV4H0W=E)g5+8^X5M^M&oLGld$L)Y)*S-=)+qu3)(!%J*75>D)_?eetatMVTUYakSljc5TC?(pS)b(#x1P!uVI9X8 zX|2H*W&N2q+Ik;vjCD6}taT)BoV6Bjy!9WRc%CSDrnQJ|jGtWAjGv8X7v%vZd zN1^pLjw0(Ojw0(oj$&&ijuPt^?4{Nd*~_e**vqXyvz1#fVXLqXXREa4Vym*=&st?& z%35u0$Xa9lnWe^hD@(0)IZLgz6-%A^-{)8>psRV>oUe}>sZDfYX`<2Yh}h> zYc57M%io5-E#4S@u()gZ%;LP^9g9PTmo2s$p0ZeBc+g_D;ZBQw!%Y?~hN~?q43}8s z8qT#yHk@t|VK~vk&#>FV#jwr7%COPG(6Gir!?40a&al`*%rM`A*D%L|#W2I-k3p)% z7lTBLHwJMQPYj|h?ifT`Tr~)@IBO7Mam*mdVxK{P#dZTfiwy=o7Ap{u^WRYRuWRYaxXc1%JXc1=MXc1uGXyIkx zXyIbuXkl;QWMOIGWMORJY@uu5Yyr8S*Tq5xd{>W~g`k1E1-F5R1)G7V1%rW?#W#I# zi`U>ieZCgg^!+SO>jzjI&=0iOsvm5zN|^KK%j<7X2cNUwS1L@Ab+pp6XRv z+}5kMxTsfWaZInlVvk;v#YVkWi{*Ol7IXEwEGFsoSaj(1Th!@Iv?$S=Vv(gc%_2c> zrbU?EYzrT~c@~a(3oXp`7F+1*EwfP8TWKMwx5k2BZ=D6J-bRbxx?3zh>Tb7quDjFX zuI?U-%ewn5PU;@A*spukVyo^6i&eU(Ef(mWwV0-R!JD=`*8OYoONYVogATLh za~(Fzdpew!S9EwRPwVho9@G)C+@T|Cxn4)Ya;c8A_1meD#UmO(n^mYzCRmJT|$mS#E*mbyC5mMS`KmeM+&mO?r{mYh2NmJB*U zmhZGfE$?baSf197w%n;5XSrNE(Q>MGie-y-x@D1emSv)LuBE?rfu)^xv8AqdnWc<& zr6rekjpa|RddnADO_n#bS}l)jby#lG>b6{_)n_?XYocYV))dQ9t!b7iS~D#}wB}g4 zXwA1Y)mmh!ss;VMXYA3i&-_QOIl^AOIro0%UW5hD_E(h zD_QZXt5|(gQ@47crfGFbP1|aVnx55sH3O?oH6yDMH502iHFGOZHA^cKHESz*HCrn# zHG8XXs!mo9Rb8yks=8V2RQ0f0s_JDmQPsz)PSwvUTQ$%sLN(aRRW;PgNHyF_UNzE+ zS2fz|w@R$l3zc}QYbuFWM^%!oHmjssEmTRjny8X#)u57XRiKhX>q!)e7YXt1jgxt6b$4D}UuyD3Cxt6xgp zR`-;8tPU&nSuIzZVAZ2E(W*#kvQ>oAR4Y5BX;vyqGpx9kW?6kwoNaYeajw+?#rak% z6c<=cP+VkHp}5#8L2;>-r{Z!eL&X(V(uymsSQJ-Vy;E3gbwgpj)ggrqR%;bDST~@{ld#n@`_FC~O?6>+Vf6(fJ{2{9~@<*&X{F|^GS958$h@%HE%VZ9vCM0$9+@{* zB{J`ou~_R%u~~CVv0J~85SO=Z z6IZYf5m&NS5m&bUBBo+}R7}-+x|o`EmYBM=y_klzsF^)(>}>m@>t*2O|j*3LrC)*?bK)=vdpt+xxhS$7M%TgMA}SQ`s^ zT5}3|Sw9f)vfeJ>Z9PH2$2v>E*V;|M&ss&m-> znw`1c`UX>j^$Mm&>jtJK>lmhHYYV0pYZ0ba>-UVU)~6ZUtd}#kTlX+_SeGz%SjRAS zT01j#S!*zMTMIC9TD~*3=CT>)C?OeWDRR9L<}n|xD87zm<z#btw7i_->C7KaTYEcO_LS!^{3u~=siWU<^Jz+!=c zzr{=gUyDfwJ{H{u-WII}o)&cm9u^e_9u`Fg?iSewZWgHqZWi$dt`?C7t`@-tt`@!q zt`_bFt`?34t`^n?t`=qnt`-Ict`=GbZWbyAZWi(e?iP{;?iRuZ9u|BCo)#PiUKY#- zUKYRgy)8cI`&c~H_p`XA?{9HIAGD`0&|;TQWTV=tmx5k1|Z@tBL-Axv6 zb+=kP(cNxwOLv#W1>Li)F& zuJgy@oeqQLQypf@J34HZmvuNTPwMbk9?;>p+^!>JxmHKia*2+FAmeD!}mO(nkmYzChmJT|WmgYJ(mU=q&mMS_O*~t?8B?TC*%IwB}lBXf3dm)LLxGskO}Vm*xt~*P5#>Z)>izJfpeMal zG;Ucw(zs)JMdQBZagB$TJ2jqIuGV;NIZxxI|= zYGzj2Y8F;vYF1WEYBpByRPC&8sybR7Rdu%7sOoApSJmCBOV!h=T-DnuMb+0TP}Sec zPBq9%M>WJsQZ>wqT{Xh$t4fsBW0e@Iiz;ze2UHTQ)~O^}%~eUU>QPCvs#eLc%2LU) zic-n3@>0pOvQjCq(pD+7l2$3U;!!EJ`lVcMbw|06X;yC) zXINcToMp8~akkYG#kp2Jiu0^W6&F~=DlW2eQ(SDNuej7oQgOKzli~`iHwvq)t|_ds zI;gPLYK_8rtLX|Gt(p`zS>-Bhv5HjKYUQf1-O5m5rSij=!xWhHmfN?Pu+ z)nC~wRu5#aSsj+WZnaGIrd5~hEvr1)J66H6cdaaC?_0^sKCohyePs1U=CRdfnWt8} zWS&_ql6hg(CG*m%Smw1=jLaJ=H<@=<`ZDjWBxOEYvB-R~x+nd`YK!z&t8VGnP*#AU1xipyH}i_2NZi_2T$O7m*0n+o*1kfH)^b9Q)*l3&tPcq~ zTTc~qvCa~7wYC>@vlbO}w|*nwVSQM@(|V48r*)}-m$koux3#u_k2QyYuk|^8KkHt8 zf9nAL0BceHK@%z@;Ykg&{>qMqTYa6CUYYC<%>o1JW))yIDtk*HN zTK6)xT9+`kS;sK8Te~rKSnDu$T8l99T0S&nw7hKi-QuX>TZ`?6k1bXi-m;i$c+p~l z;Yo`Y!-E!;hPy0s4L4gP8LqJiH(YArYdGJ+*>I+XrQs9{eZxKrRl`mT8N*f!VZ#Os zF2foNM#Bn=p9Uos9}EgCUKr$BJTS<#xM7fHals(P;-o>M#X*BOi(LjW7Ml&CELIyt zSS&FJvzTiTVlmAi$fDmM(4x~Iz@o{(&!Wb_*P_(G$0Far+alAz+ak%p%Ob|W(<02k z(;~pY)56QZ!@|YD!@|zM!@|PA!@}6W!$Q}fcl-U5}9d($FJ_l|{+?tKd<-A5J{x=$_ibzfMh>b|y+)_rRsr2D~wL-(`Af1Pg@ zUv++3ywUk%@mS}-#Vs8s%L_WJmdABCEcfYfTW;0ivs|MiXt`KN#B!F7xaCA0Da#HW zS<8AI15LHOpijP0J`99m_x+eM?UrBTEMzQ%iFl3rjs6YfDufJ4+cIM@wNH z7fUW3cS}YcFUt?wzLxj311!&K2V3sZ4zpaX9cejJJI1m@JKnNfJIOLtJJm8oJKfS* zJIm5YJJ(WCyTDRFyV&x-R+;5{txC&#S~ZquwdyVRYBgD|(Q2`rqt$NNqt#_uqt$Df ztu?_iT5GbUx7Jik8?70ZI$ESrDe6o8_PV6cb177A1y;P zK3lqLe6zID_+hE1@!L{SMU0G)!D6%sdHMbSLe2xuFhxGpe|sQ zsV;04q%LY@tuAh*qAq2{r!HglT}{sFp_-!AX*Ff5t!k=P^VQU?y419+O4W3%64dmp zywwb>%+-vol+;YE_|(j;eyUnpJyo@~x~OVvwO7@_YL%*!)ihNXt7cUwS!^%}9%gR(G$4XTt&q_?Cz=~a^$m*kViPdH0Qmbvs#S6j8>~2$o2=d`HCtU$YPH&~)NVCLsne=Ssmm%usmIDssn5zpX@Zrs(nKpp zrO8$=6sKBUP@HD9Lve=H0>znDor<%q3Ki#CMJdj+a#mbmrK`BeN=$Ky6@%hZt5*uk zt*$7nwA!z*%4(Iu8mp-a>#Q0S)?4K$Y_y6{*kt9Ru*J$iVVjk#!gebzg`HOK<#$<~ zlHX&sOn$Fbv;2Om1o?wjcJha;q~(uT{gOLsbwlpB)pofPR@3E9SyjlLwu+EDYh@{S z&PrPDg4JKyi&pn#FIydwy<)Xg_L^0v>~*VL*_&2DvbU_vW$#$Y%HFkNk-cyATIQkE zC7DN7yJVhNEtGj`)hYAbsz~OARkX}2D_5D$ zFIGv?U#+a9zgr1Q|FC)^_0#H@)NiW=Qh%(frT$rkOZ~SpmSV6LkYciaE6HqqT9U|rX+{8rzDrPmL#_|k0g)vI|*LvOA`Fn+av_6XGsWJ*GmXnr$~rcdr62| z8%T&-i%CdW{}z|DJ}E9`JwsgDI$d1W+Cp5;np0ff`nH&Y^;$7S>qapp>rgReYb`Mq z>;Ix^*4ISUt=EcbShtC4S|^HXS=)$eTT6)QSbq`GwZ0^xXT3>8-+Ho$fpv+9k#(4e zv9+a$iM5P~sWpR$ne}mDbL$Dh7S@r%me$I`R@U!?tgUwm*;uy=*;1j^a+R7UfQ~zQ~niJ(Vlj zI)*F7T7@gs`ZZ^o^=8g=>l)5zf=|)+;!&t;;!btlcFH}JEFH1M+s zHt@CZHSn=;H}J7=H1M&oHt?}9HSo4DFz~j}GVrlbG4QdFGw`vHH1M$yHt@CJGw`+G zFz~ZrGVrtbrSEU?UOxbOW`Cf?IsG7u!}`G%JM}{>*6D{@EYT0Qn5iFO(Wf5??(V9T=bJItn^bY4D{12RP{3~r1i5b1od+)*!A-){^}K2e9|kjc&S%nabK^@ z;;LSS#c91Ni-USK7TfjeEY|8ZSS;3SvY4sYYSFLPZqcgOX;H1$ZBeM#XOXTq!6H^~ zl0~rIR0~hN=@#~Svn)*Y=2&R!&9_j}TWBGnx5R=^Z(hi#56jEf(n>v6!iQ%%WfSq(!Ul8H*a-^A<(A7cDY$ zuUN$CUbhI*y=CF0d&j~-_r8U>?js9b-KQ4Hx-TrGbYEKt=)SdJ*ZpAeSLd_E7oBew zuXKJ|Jk2rGwYn|i zwfZdmwI*8HYfZ5<(3)ncpf%G{Kx>XAqt<-OPnwG?A8RhLyrQ|>@~Gx2%Wax#EthMq zx16E5$+Amxt7Wz34$BC9M8s{zF zXk4+EElV_BTBd8fv5eAqXX&f) z(b7TVv!#i~S4(w`AC^)YzbyGQ{#r6={I`6q&S-U6oyBUGI-AuZbq=d8b#AL-bzZ9& zbpb0kbs;N#brCB`b#W^ubxEr?YSLEM)MTv=s3};jR#UQ?s-|Mqpr&S(rKV{Ws-|t_ zsHSVBtEO)ysb*-!s%B#KQPs@quBwIANmVPWZK}3bi&X8c`c)mRYE+%AGF4rz!c^U@ zoK-!o3{}0Yu_QZWXRv zX=SBcZ6&8%W5ujoXZ2jE!Rm}slhsD07OUw>tyVQk?N&)jomL)7T~_)^Jyv2$eO7-J z`>mcRPP96sIN558;uNbniqouG6=zuGD$cSBQ=Dz(pg7k`Q*pkPu;N0izY2@2UMMWF zx}>noYOlg_s}%|>ttKn1wyINDW0j?_&MHh{y_K`VMk{@V%~moBTdX)0wpqQE-)?n6 zey7zE`CV2G@_Vde<@Z`y%kQ_6ls{ngL++5(b-5!}+vJW~O_MurRVH`BDqQZAm4)1C zD=E3NR)1vATiuhrV0BRTlGRe#%T^t-SFLhouUQ4j-mo&4y=f&Yd)tah_Kwv{nR`|j zW$s(;ka=jeQ09?Ur_2+pBAKUF(K64iTx4EY>B+pZl8||A#VqsI>aO%VtIg6Mth%K? zS|v$;va*u?VkIp7)#|O(cdO%4Kdcr>{j{o;`fU{{^~cIo>YtU6)PJk@k_^`8B$=$& zNHSY@OR`vJOR`z}NU~e&N^)59Npf0$kl?nyEWu;FO@h~YwgkU*gM@%}nuMUWw}gIG^TZ{s^TegB?Zu_71;u5oAB)LaZxfTZ?h;e5juTU~HW5>@ z<`Pr3ejuu1y+c&hdV;8$b*8AgwTq~RwY;dN^&b&!>zg7v*4ssNt*43TS(l6GTStl* zSX+x2TFZ+VSu=|mTVD`1v7RYxYMml%X00!5Zv9Kh!uq(7rS%jcE9+z-YilDR8*3&Z zTkETWcGjx|?XBwt9jrqI9j$c)ovfJ!ovd#QI9qQKaIx+caJ5bsaI*9Cxg>40oLMEv|U$nOq6h zkz9$^id;$7Z#a{!w{fOeH*%(0`*5aNi*u%1Kjuic-oTMzUCWVa?aPs6Ezgl{{fIr= zx`RE(+JHUR`X*bhbqiabwFO(g^+(nM>kX_0)_JUj);g?3)~{HKtXHxWTW7MASZlMC zSbt?MwLZXHX5GVFZXLl~VXewsY5ke0%K8LTwe?)4YU^UA8fy=xT5A=iI%`Izdh2_P z_13!>8?0wCHdVv)&^26Wp<+14LdtNOg`nX?3l76x zi~j~47T*k7EZ!P4SUfeTvAAncVR6Nv)Z(l`k;PGiJd3>sITqUtGA-5_q**LCNU>O8 zkYq8_Al_nA%u;=5jf#aq21i^qB;7B}_E zEY9mySRB)prqj(tTge_Zj#4Kxc zBrS_|WGu6Em~Y%IBS z>@AseoGd?SyIMZf_OLv!?QOYF+t+f9c7WwkXDbSvsS;QvDPF@6|E_jB3jceS+!VGWntN*t=uFhz+UY*%$x;mRxy*h_g zx;mFtfI6?0r8>WrvbvxZuez|+cQrAqhiVd5r`4pawyDWlEl`uU>Q+;o#| z@=?>UGFQ{GQdZNk;#bqN`mJhc^+MIy>WZqV)j?Hrt97cDRu)3rYWOYC##A>}tnALoh2&+DoD63kP z7^_^BII9?y1S=nvBr6-0WGfw&R4W;kbSqw!Osn6@*;aRzbF2<1=UFXQF0g7>F0#r} zF0t}cF10dNF1Hd_uC)52RBiP@sn+VKQk~Umr3R}BN=;T}N-b8gO08DTO6^u!N}X1M zN?lez6nm^5DE3+%SM0aipg7TLhT>$aM#ZUCS&GxFf)!_2*(lDkQd68`C7?Lh>X*WN ztEUPJtu81mw%V<*#A=zsGOLLS%dKh^R$65!thNeOSYzd=u+B+n#N_u`eU;m9bw%!=)fTx!R#W7TSe42hwF;Fx zZe=ES!b(E!l+|z9GgfzH&srUjJ#V!{_JUQ1>?NyQ*~?aevRAFlWUpDt$lkDGlD%p5 zQs%bR1(`cm+hy)q&6l}v)gklHs!-;URg}yVD;JrkR(dkett4b#STV`Gvbrt(+G>;Z zTdOYVcUDQ#AFQmUKU#@Mf3kWj^~LJA)K{xTQs1rWq<&aMN&U1km-=lbBK61WqvT(! z3zGk>)=M&2_enBZ=SebK`$@7`>r1j)3rezEf0p2|zAC|Ky;FkAdX5B-b)y8Yb(#d9 zwXcMLwXuYtwUmUAHKT;E^(App>qX*X*2UuD)~@0b*5cw)*002*t@nw^SWgm@wN4k4 zv$heFw-y#tuzn?~Xnjyr*?N|!igmH5s(G3&*x(;#^-DOh}X}01FyezJ#T<@ z0B@kRGH;Oecb;JD(>x*83wT1UOL@Yqy?Mf|m3Shozi~%eujG!jj^mE9mg0`KzReY5 zJ(nxiI-V=eT9GT>`Wa_}^(M|l>juswYhTV}YiZ6D>lYlU*4sEzty?+LtV1}`tyMTO ztlzL_SWjWkw6Ar1Q{-G6=T_F$lBpGYGYC zHwd+GGzhVMV@|~ zMT&lcMWlYB1*FfP0`2psLHqof76SU&7Hs;t7Ju~eEI#QKSiI0Hvbd*LVsS;U%;J<@ zxy1p!N{elJ)fQ{@YAqJ))mzNeYqXf4*J9D8*Je?p*I`kl*JY8R*JBZ{*Jlx`H_^gd zZ?c7>-c$>7z3CRZdb2E)_2yVe>dm(h&|7H1rnlJQukJF7&$=rtUh1y4c%Zx1;+pOT zi!-{LEDq~#wb-e0Yu3(7kHmu6y0WR`-^LiSAtsE!_te3c8Oh#B`rp@an#>VAg$Y@k{5e#Rr`a7SDA) zTinz6W^q;Lr^RWV-xh~-{#oqQVYJ+!!(zEyhuw0X4wvOr9bU^G9e&Fe9U;qV9Z}07 z9SO@!9cjx%9XZPg9Ysrj9TiJA9d%1P9W6^!9UV&@9eqn>9V1I=9aBpo9Sch?9cxQQ z9XrcU+K!eFwOuSPXuDhP*Y>nrr|n}oSKHsRTRX_IN;}jtOFP0cQajqxQ#;nuLOa1y zLp#}0TszH@T|3kAn^unHGp#(!t6GJYN3}{Uw`!GJF4d~CoT^o0*{W4890XX{Oa{sjfA_Qe11YC5P5j%b%JvEMIBPw!E!5*Yb?!0?WOci!Ik_F0)*q zxx#Xy=4#7k&2^R~nj0+BG&fsDXl}Fg(%fNbqq*BsPjjE8g608BA<*LqQrKiqgC9ckA#i%Y|^;%8X>Z+Qk)d4ketJP|fR@2mEtQytita8*8tisil zten+Ut@PB?t)$d6t=QDGtv;#hS>01LusW@3WVJ)p#A=zUnbl-f3#$fIYpYyUTdQbQ zdn*rBM=LW`XDby|S1Tb^cPj=}Ppfw--d1;2e67x?_*?B#3A9?J5^Ob7CDf`zCETh) zCDJNGCCVy7CC18KCCa*M)t4nhGtTxH*x0)n((5hJOuvLiM z5i2vfV^-pF$E|+Jp0v6nd&=s7>=~=YvgfSYWzSpX$X>Jxl)YqSCVRz7M)s-|lk9b? zmohi3F38-n+Aee3YQD@}t9F@tRs}K-tRiI|S~<%+w$hb(VkIH-)QU;wxz%my7gigk zUs-iXzqU${ershV{mx26`h(RwsgG7Cq&`_Kmil55e@4W z5l!n95iM&M5p8QV5gls|5nbz>!g|(Agbl0vmpW z>u_E_Yjs|K>)$*9))#pKt(WrzS=aIeTZiz3SZniyTC?zkS?}Twx6b8`uvX%Zu)fI^ zX+4uG$~u-S+FFS##`*%PEz_EXEz5d4YnF9BYqqrkYmW6-mR#%IEP2+A zEcw>%ECtrQEQQurn2W3zF&A4GGnZI9F_&5kF_&3CW-7DZ!c=bE#Z+OP#8hc*#Z+Z2 z#8hSdk+ItPJY$XZTE<%IZpK>cEXF$PK*k1Z2gXKgZAK}}^@jYG3k_KR zW?FnUm}>FbV1mUXgC2`p1|1d`4O%Qt8Z=lOG^n-MX;5jg$)L<)l|iw^VuM19*#>zQ zQw(w}dJQry+6>Yy>J3sYDh!e>iVTu0vJDa}QVilP;tXOf!VO|90u7=qybYo(Tn!>E z>#0)|$1PnqgxC}xqSPjA~{_BTXe9;fH zc&Q&|aZf+o;fgi@o}h7Mt`VEtcy?Sor?6>a|*w>$O|t>2+G9==E4c>GfFz=uNP2 z*PCQvt2f2MSZ}(8rrt~odA->dqIz>Jc=Q%nFzGF__^G?p;=S&2i)XqkE$-;9vACqW z&f=u*MvMKrn=Q8KZnIdUyTf9!?rw{jx_d1q=pL|W(>-iat9#U5PAM~BUFiVmk`w+@eGlMcUSrH+tg zp^m6!hK__~f{v7BxQ?u)pN@j1n~t)jt&W8TxQX{jA! zsi_@rDXE=g$)TNM`9mw+@`YBG)m&!Trn%CxLUXlcmgYLk7|o5Aewv#t9W=LD8fosdRMFgRDWVR=d8wB=EavzFU6E?BP8xMVq3{Hp%N@}By4%VX+4E!V04ww$K^&$3>f z!74+Y$tqBt#mY*Z-AY-V(~4J}+v=Mduhj!J0jpDLLRMSVM64F5iCJ~4Nm`YuNn0hU z$y)iTDOg#mDOstisaOfBsagG1)v$W0s%3ReRoCi}s=n0*RYR+}s>W7bs-{*Is^(T{ zs#aFPsy0@Rs&-cTst#7Ns!mossxDT)RNSmys(4skSMjnsrs89@RmIP0iHg6~WR*ax zW|d&8B9&09B$aThV3kNKXO(CxW0hDdWtBK95tRfh7L_Ec*UHIOXO&Z})+?u5O;XOZ zDpAh1icrqAvQf^nQdBOmVpA@%dZScgby2CzYP(Xo)m)`Ys}`kdt1P7&t3ahXD|4j= zD|w|RD>kJTt9Od6R@W5Ut@bH)S}jxTw(3{xwW?6;vr1B&VCAhi$;wo5ij}m~C}RVUE>Sg?UyB73N#@C@i$9P*`l0s<6Z=P+^&sox*Y}ZH1Lq5(=xW zSQXY-J(XW)bx?kT)jau)R@L&Gts>;NSeeRivl5oyVf9gNr`1Kd-Bugq_F7Gl+h`9$4wfJhT#*d2Gcb^Tg_w z^fRlC($B3rq+eJiNWZeOlzwd`B>mRvt<*cK6H*_n7E67!YLNP56(jY<%2Mj9m6+5w zt1ps2tS(FbwAv*3%W9(JAFD#izg9t#|Ex?T8LY)58LfXvFj?Q0V6omO!D_uog3Y>3 zg55e>g3~%cg3H=Wg4t9eMO5B8PE^6#QdH4eR8-0OqlmKgIT01> z)gr3aT_Wn%St1(N-XfaTIwD%ud?MP`kA=0ZR|)G_mk8@wI|%Dr^9dVR-xD&lUMFN^ zT`y#89Ux?4tt4b>{Z-J+`h=jl^&CM9>q0?GYd1kFYZ*an>n{Q}*5?Fltyc=zTDJ(; zStknETiXgaSW62yT7TqsvR=pUY@N&RVy(mPYWN-qy*yKGuf3zSc~&M1X*+Q1Y4it4zaG|4z)Jn z4zqsE6>hzRE8IGsE5cfVE7JNYXO#6?&S>j0&KPTZ&KPT6&RFY*9C6lLIO454I1;R* zITEe)Ig+fIIg+i{v8Px^u%}ovv!`0GXG^nAWJ|LaVN16@$(mtZ&zfm%!J1|LlO@~w z5KE4AH%qQ{FiW1b3`@TCQ|1Eeb;VJ3d|+epO{Llk1&;5Ph%>x&SfgM zc4MlrmSd{0{=ryjeUq`udIw{*^)$w6>teoCSzYZt~kYkfvp%f*I5mQxKmEISPU zS=1PQwa7PoW07q5#3I7*j)jlm6$?khvlixt$1HRV_gg3#?zE6F+-$*TxYmNzaJj{A zgGCmf4CY$AGMHiU&|r$i4TA|57YuqVP8f7p>^Eq!*kRCUvB99$VueAK#X^H}iQyEm{n6Eou$2Ey@fsE%FW0Eiw&KEs_jUETRpPEJ6(uE&L1;EIbV2ESwBt zEo=;8EzAsJEDQ{yEwl`xEL04lEaVI#EhG&hErbmsEqDzgE!YhrEtm`}pTD;Sb zw0Nu^X>mh8%Hphkl*J+aD2wg-(H3j3)kG1I0kF#jfkFzM(kGIIxPq0YV zPqc{8PqOgSPquK;PqnbpPqWb1N1o?L@ADU0+|w(zxT05LaZ0bu;(%U-#WuYvi#2-H z7K`+1EoSP~TlDKSTD0mlTh!>aS`_KETV(2WTEy#hTZHNLTKMSoTR7=Ww6N5hY@x3= z%|caghK01=EDIsMITjpx^DX}AF0}ZnyV&Bj?lOx>%6ddr}Nt4iOyS#+d3aCF6n%> zIH~j1V!zH0i)}i;E!OJ%vsj|TU^!cd*>aK&n`NgCr)7fa9c1aP9cpQ%9bu`Z9c?M49c#&@ zonZM(E7|guR+{B4txU^PTG^JnwDK%hX%$+|(kij+(kip8(yFw~)~d0L)~d7g(Q34` z(Q2{O)oQnt)9SS3*Xprk(CWARpgGa(W3%bL?Ik7&-c+^RXpa=GSw%Nd#rExRx@vCs0O#zD&`8iy^f zX&kdWsd2(`kH%@s^%`d_7inCuoT72bvR&h5^q`Zvo(>OU;I)PGwRtN*o(QU7o0 zs?KDkug+p6sm^A_q|RaWMvcqrni{Xw0X2TB)oOxPQ`Lm68q~zBa?~WOBGja;T-0Q& z4AkVUWYiR`IMkG_zNo5NJycbz$#ZI z$SPJP#L8DC)XGjJ+)7U+(n?+>+KOK##)?5D&g!vpg4I#wB&+4hDOO#|X;!()=~e;C znN}vs*;bOuxmJIb@~j>!6pnW+kSu!iq&bC4rt9`P^tQN_huxgV%X_YN|+R9({jFqYEIV)+|^Hz+q7p-2% zT(UYZbH!@A%vG!TGS{uzWo}sI%iOYxl(}u?By-nFN9LZDn9Kt!Mwy3JH>Dq2ZIFIq z)gk@VDna_Wm8J9xD}si+D}}-T1i~c`kR=L^=UC->xE(>*5zVi z)_!8*)~aF>)_+AMt*?nnS#J=Pw(b&@u}&40vvv@bx0VrAu>L8cXnjpY$$E>3vh^ep z73)F~RqH?zHESagb!!n34eR&9n$}x|wXAD}wXEHQwXKDOb*vu>=~{0T(z9+BGO!L6 zGPKqZGP3?7Xl#8!(8PMFps970pqX`mpt-fWpoR560ZZ#^0#?==1gx#Q1#GO-1#GQd z1Z=I91njIC1?;U4@H<%7^E+DG^E+8H@H<-{;&ZWX<8!t4=5wvDxzzvB$I-ozPUUBww`?aUcv&CeNaeTO5)dOb(1bt^}#bu>quwIN5m zH9JRw^-lIg>ooQxYhm^z>w|2`)&*=S)(UK?*4J6ntS7LhTYIslTeGodSRZD|vYx<_ zZ5_>$W39%LYyFWq&w3AYo^=OvzI8ZrfweYsq4j^JBI}Dx#nwxhO03J7O04~vO06}S z%B)$K%B>$VR#+cmth8RhSZQ6ySY;i{SZ(dbSYvI%s9-tWP}H*1klV7>kjb*Z@P|c; z;RlNd!{-*hhW9NT4R2VO8D6l^F+6FZXn5E{+;Fc2pW${37Q>AezYSJfd^A{Q@xoxC z#RG#m7S|1CSe!GMVsXr%-(sIZkHt2F4vTdLEf&iR8ZG7<)LBe7sJ573P+`$&P-f9& zP;60cP-szNkZ+M|kZX}&IH`)sMBi}ccKrm48vO)|BK<^*bbZj-y~!5A`Y9G3`l%Ln z`e_y>`so&0`WY4q;I;j*d45=*zX00jFSa$O_s>a|;>=yh5|>2+HK>h)T9==EFJ=}ojS(VJ|ctvA&|QE$41 zgx*XGKE2r%EPC@Se(Nr<_^7+c;<@e;i+j4uEw1RUv^cH1+TxJzI*T2;8!XoAZnjva zyVYWj?skjGy1Oj8boW>^=g^=z&3l7}}7XNh~TYS@bYVlU*g~el?*A};Q-dbGL`CxHe=d;B= zov#*Kb$(c^(fMt$Sm&?BEFA{Ri8{=d9Xf25^*S7uWjfrJc{+TSsXBs|F*?GQAv$7~ zK01M6k~&(Jf;zgE96I`z3_3=ZAGA#^?`vCFp4Yav z+^218xlY@`a-O!cWv{lIWv#ZSWv;fjWsJ6;rH^)?rHyuorM7mMrL=aWCAW5r0P)lx{S-I7_W%kqn6ujNzCe#>i`lPr&GPPN>rIo)!V<}AxOnsY6CHRoH_Yc8@Z z)LdejthwAWRCAT3yXG28OU?C`+L{|JmjnJS)E9V*^d6)HYf87h8O z5h?*z9x6dr7AhfDnku1IQYztA+$xb)Ka``bZYjrF?NyGqTA-X@)vTOkm8P6x<*A%z zrK_B7C8(Tf^-U?;>b6p@)j_2^tK~`sR=r9^RwYU$RxwItR?bQlR@zFHR>DfvR=*W% ztsX1ZTb)*HwA!rLY&BQ0#i~uQ%_?89!zxm-%gR}?+e%ll*GgQm--=0bqSaf4Nme%$ zrdS73NqaD9p3+RajtUrLfRSU1716h{94UCWYlz59C)^ z?U7$)HB)|#Rhj%+t6=%{R)+E$tOVpYS-qFrVs%b#tJONW?N)tqJFN2Lc3B0;?XfbH z+iN8vx8LfU>;bErvWKkp${w*=D0|eZP4>7|mh1^Df7w%3rn0B4q-4)pG02{?dMb%TFt8Frut>(#Gv1*sOW|c2<-6}%nhLw}dEh`8k$PcuTq5j-6~Y_r307+*33h7^2@dNA;+)p&#ks8O#ks8m#d)oj#rdp%i1AyW6BDprA|_~EB_?bg zBqn05B_?XkBqnBkTU6Y7tEhx^zo?{jmZ-F~o2ZPnlBlfpe-SzByCU+|yG0bNXNo9V zSBfZEM~Em}TZ*VyONppj{}NWSJ|L`S-65=Q9VDz_EhDUH{ai@PdaIDOb*qrBb-0k8 zwYHGHHG`0W^;JPb>(zor){TP3))9gx*7|~`*6f02*7pU>t#=4mSWgnLw9XT-vi26R zvepo=wq^&74e;Aq_wn0V`}5md3-UWyU*&VOp2_EA9mnTvt;*+O{g&6&dK<5sbrY|< zbpWr2wLGtf^?M#q>jOMq){}U=tP{%z4&E%=y+F%mvnWnF_5pG8J04G8I`zG8J1JGnH8L zGnHDuVl1;h$yjE+lCj*nld-}&gR#=uo3YZ`oKe}b+fc%?&XCWt(2&(K)$or+q~T`^ zU&GfHPKJ*y%nWZ^=ontHP&7PiA#Qlwg4ghX1+(EUi(dv?Ej}2mw|H)_%Hp2EQj2Q_ z3oOnW%&|CXFx_IW!DNdq2K^Rm40;7LYmjbXZjfeSXpm~5ZIEK2YLILp zZ;)gmX^?0kY>;TdYmi{UVUS?KWRPI-Q$OC~oqoKMU#G#MY(>GMUH;5MUsAsMYw({^z7br3rqbB3w`}e3swCr z3n~3<3jzHcw0VByK7Xmj0ljjIZF-d!YxJrt7U|Vk%+#y3=+~>aXw_@9sL^Y-DAH@S z$k1!Eh}Y||2-EAb@X_nBaMtUyu+*DiVW2n3LS1i)g{F>Eg1CXT71`? zZ}C=lp~Vy3#TK`8ms(uZU14!tca_CH-8B|lb=O<0(cNgVNO!ZvOx?E!=d^SlH^GvoO)UXrZlp#X?Eb$nNp!3$^n9c`_y*i&Qw&;AdSgrHJVv){o zi)f zS!(JiS}N)&TT1AtSqkWAT5{;E6cUoHkNa>?Jaw? zoh)m$T`hC9-7RCay)1pTeJyRZ11xp4gDhpVLoIom0)>BE7@|d zR+{BntqjX~TG^KUT6vcBS_PH`TE&(LT4k1jS{0T~TGf`uT6LBxS`C&WTFsVhT5Xo! zH9IU{Xm(rP)azx7R#R++b!Q{?6kbEvB&a~#y-oV8V4fbG0)qh#)tN*c-RR3qmtj=Kd zR*l)}x*Dt1AvJcZwQ8JJGt_vjn$`HM^3(*ZBGrVfT+~FY4AjJ|WYi?BIMk%AzN*Sv zJyMmoI%Ph!vYknALmb2&;?AkycxjqphYZ$68e@$6LiICs;WtCt0Z}r&w_-r&+yM zO1HYAlxek7DcfqkQm$32Ql3?gQh`;7QjwLlQi+waQkfOEQiatQ#VV`2iZxb873-|l zDb`y}S8TLuP;9o!Qf##fQEaoaQ|z$PQ0%f2R_w9*r_gKlQla1Kio!&z0}7L@Rx3=g znyxU-szqUjRe{1xt5}8ER$dBot;`kXTd686uo6;OWW}Jc#Okj6Qmb9^%dMu%ue2(W zUu6|2zs5>mew`Js{CcamavQDA$ZfJ(Be%t>S8khCuH1Gjf4QAj26DTsgyi;EeU;s3 zbwhT))gIY{RtsbgS+&R>vC5J?YUM9`+{#4ugq4)+DJurq(^k)A&RU(5IcK#^=7QBc znTu9!GMBCLWv*C7$Xv5>lDTfBBXh$_Oy-sqgUoHK8`5{J)=A&9YL$Lq6({}B%3S)9 zm7w$!t2a_lt&U4Qw^}6i!m3W{rB$@lYby(>H&$X&@2tK`zPGw6`N3+76#RiOlfb(jRBwT%RmwXy_@ zHJ1dd^%HS6>n-B!)~(_k)?wmY)*9m6*1yGgtj~+_S}zmhv#u2runrXywAK|9vSt$# zw!SYaV!cyT)Ow1jn03CWxV5*aq_w)Jlr@W}wDltq8S8^0vepYklX+dN<9S`J^?2Q^ z|MR$8U*PeuUc}>RUB=^S?Zx9|t;FMP{f*nldOf$Vbtbo;wFp5J3){$I+ z))HJn);BnVt!HtDSjTXNTB~w~TEF86v);uKZr#BVVI9E{VXe&(Y0b(JWxbC*+PaWE z##)&@*7_P-oOKslytO@Bg7sI{MC-MzN!Dqs$<_+2Dc1K{Qmq%Vq**7kq+4sVWLW=U z&a^(uoMkljX zGnQCyWGuCw%vfe!%vfd}$XIS|&ZuTtZzye9WGG~rYRF+3Y53p5*YKN#li@oHbHisA zI)?Wx6b)}!h#OwC;59sD!EAWM;-|qriw_1nES?!`wzzAs&f==UN{cfFODql>EU?&Z zFxz6Y!E}q&29qro8%(g6ZO~&e#h}xo$Dqxk)u7p;&Y;1f+@RK?z@XY9)1bm4$)L<4 z+MvWD)S$@1&!E7<-5}q>(ID5t+91cm#30K;&mhx6!yv;#$spZA#vsi?%plc5z#!Fv z+aSe))gZ;*rT6hu~9$CV!3{@#T@-)i;4Ql z7VY{e7B%`Q7Df807U}w_7P0zi7D4*y79RTP7Iyj>7RLIS7Ml857V`Sp7NYt&7To%| zNNf9H^Ze+2{z{AGdes*5^lB`o=+#+t>D5~_=rvlD>or^C>a|*==(Sly>2+8H>UCMT z>-AXJ>GfHd>P@iF(VJwUq&LMvQg51tfZhxXHoaLEe|6_reAb<3@k)1r#RJ_%7T0x` zSe(^eZgE6+rNu7Y)fO9d*IKO5-C!|acaz05-7OY9y4x+9b$41+>F%~D)ZJ&1p?kn0 zUiYv?sP0hyB5|7mMmzSGvTysK?sc~;xla<8_T_3isgK*bjt}^ znU;-OIhI9Q`Ibpqg_gluC6+E)<(8&em6mE+HJ0L9^_Co3jg~((TP$B|wprfM?6f?q z*<-n1v(Iva=0wXynv*T3Xil?i)0|;hp*h_f;&c z&Z}5i?NhO_TBl-XHCM&Ks#nFys#e9tDp$qTDptka%2&nH%1*`GN>9btN?yg^NZx*w)d}S=tJTU8R{hG6Rz=FuR$S#4Iz zu$rNiX;r6`ZI!B&YvrSqZ)KuXXeFamY{jBfYV}sJ%<7tAh1Gt=DytQWHCB@p>#V93 z8>~_l8?F2mo2@JrTdhxbXh%B=&`z>&}+3vq2FqS!bGbn3X`oG6sB6` zDonGAQkY@ot}x5WRAG*llEPdo0fqTif8`fi-IQNswM~AB)nxf)R)z8_to-FyTItEJ zw&IarWA$2Yoz-c%4OXkx6MjlZikhi+)k@6vb(LW%kHt-ExXTZ zzU+RhX4!*Q8M240{A7<bcA*t8+4^t+vUWwVEq)&ZoZ( zMXLyz%T|suSFE&Uu3Cx7T(@G7xnXr(`j*u?>DyMV(s!-mr0-doN#C~;kbY?OO6rl- zF{vk3i=>`f)k!_Gik5m|Wg+#_N=)jt)mOx=PQbBYOAKN1zR-YY6( zJwsI3x>!`i+Fw-ET1Qmenp0H5`niat^-&Qi>!l*n)~zBk)~O=0)@~wl)*2%6)?6YA z);EO}t>+6XS*HstTN?_iSpN}HwLU4NW<6a<-8xN3!`e(p)0#s_%lfvUw)I9q9qSH3 zUF$?aJ!@-0eQOax1M7DJhSnzqjI5Uk7+W_8m{`XMm|9y1m|2Snm|MT%x3FHtZ)u&) zZ)L5=Z*BdB&&GNepRIKxpPjWQpS`sZpM&)sUPtR?yiV3dyw2A4ye`&!ye`)Fd0eeG z@wi#H@wi(@@pxG4^LSdb@pxMA=k~HLfEoY$h zdd@)WBF-RdbIxGve;gs!Cpki_r*ec^Cv${Zn{b3%vvP!6?_!Uz&SQ_XR%4H{zQ-10 zJ(Vri+J`O9nuRUidJk)Ybs1}-wE=6Q^&6HX>(wmD)_E)`*2XNU)_<7Otj{v1TQ6YF zur6lKw02?6vKD2|wtmT!V||Dz*LoIHo^>HpzO@HazO@2Vf%PB8LhGB1Mb+rf zmRQ#?mRLtImRMUdYFZW>%3G!xidse)a$EWtGFdtq{<1JP{A8hH_{u`j@R5a>;cW{Z z!z&g{hUYAP7@V+pZ*a)snZX{5I|kb=t{7~zIBl@T;*h}#i(LkbEjAg!(_*(NDElsGnvrT|dpDM?cM?Q9sS1TtD3+M?c*n zNk79PLO;X8S3lFjSw9ncUr)A$ihhoTlzy&-fPS6@n|{8+e#AWgLA`Q| z?Rpg!YxSxu7VA}8K>GZ37Oi>>7BzZ}7Dal^78!c27V&y*7GZiF7Cw4i7S4J-7M6N_ z76y9#7V3HvE#&kjTZrmSwcys9Zo#BC)8eP@Y>W50b1k0f&bPR$yU^mY?h=bry2~sM z>aMWZuDi-&o$eZoCA#Y@X6tUWn54VeqEmOPMT72ki*nsv7J0gREK+s%Tg2!dv7vzd(+~l&K-*nI`=G|>pZl$ zr}Nn2s?IZuvpO#XvV`wJh&w>sp@C*0wy!0hc7WwStzgUdTA`NrwIVFfYeicg(2BL(pp{^`P%FuDqE@P9lU9ah zu~wF4idL>=s8)fcn^uvfxmKyArdEZelvb4`w^ps?AI*BpcbZL>_cdEBFKD(~9@6Zx z+@jfIxm2^?a=PY3%TCQHmercmEORwyTE=V6whYvqXX&iD(9%qEv89IQGD~UA6_&i3 zt1THc*IItoSa11EW0U1gjV+dEG`3sr*Vt*fNn?-YGL3zfGc^uc_GlcoY|uDrS*&rw zGF{`8WwgdwOFxbCmQETMEzLBpSZZlpvy{`gVJW0>+mcP=uH`rN`aQ*H)Zbc0sDH3@R{vzFtNz7OT>YCRllo7~w`#vFZ>asXJgoNLa-ABJ z)l4-Os}?mjt9&&Mt7tVYD|a;>D`Pc2D|t0RD{eJmtM96!R!>yLtuClaTJ2Spwpyhs zYc)ev-l|Pi(W*pM*(ym@)ha+$-O5f?(@IxW+e%th*NRJ3-|DA|q16i&W2+k~rdG#Q z%&oSoSXwPtv9g-3Vq?{=VrNyZ;$W4b;$#(};$r2Y;$~&3;$fww;%OzN;%&vP;%oIw z+287pa-h|IU7AjU+bt_g`l`7U) z#VgiXc_}tnnJ6||$tyNnaVfT1eN||;dZ5s0bw;7fYKKCP)e?n1s|gAdtZEe|S!F3q zwhC96YUQFZ-O5N|rj@+HEGu4xIaWX9=UH8qUtqOKexcO_`NdYb@=L9J6U9m7v@lLs4_X<^9bccd$(L4FBwtx=mV9kBMe?mxspLDWaLEr=mXaT> zWF$XX{g?P`^+@8Y)iH^0R;whwTlGu)uqu)GWfdv$+sZ-WkCmFlUn^dT|5mTW8LW4S zGg^0xGg-%ovsfF5vs$x=vsvE|W4B%_#$nwo#%UcX#$|0N#$(MT#%ujll+XHrD8Ka_ zQ32};Q9p^%DozL2W5gOHlFppd%tV?hn;?Sh)tJ%U=+ z$%5L}wt_m=5`wzcp9S=+&k5*TuM#k@ZWl1LP7yG&b`&tSmKQLw{>^V{y_4U}x{BZ2 z+LqtKnvvhq`Z%AJbw8iAbp)S{wGyAL^&4J0>m9uI)-Aja)`7f^)(X5%*6(?otq<_H zSWn?`vCiaiwYKANvliuXx4y~kVcpH`Y3<1EW&MxK+j=*bw{;DdkF_nAul0XUKkGxB z{?=`r0oLA}0oH|54YA~kFb8s7HK_; zEy_BWE!vuoEynsJYpiuEYn-(sYrOS8mIUiPEQ!|DEJ@ZjEXmf)EGgD!nNzLjF{fFV zFsEC4FsEC~FlSi5XUeob#*}5fkSW``iYdoBh$+`viz&~Vi7DUuA!EMv0mcIBMT~{k zEsRChiHt?owv0NK>4r*{(S{P1eun&(&W3E3=7xVQbPT^*C>p-C5Hoyc!DD#eg30iP z#Seo^7VivBTRb&5YH`QlfW>8lT^6SdwptuC*kG~KV2#BFgXI=03>I4~Fqm&K!(g_> z1cT`ood#1Z8Vx2`R2lSI6dQC|HB=7#NgTXc`n-C>s=7$Ql$_h#TZv2pZ&Ba2w=Wuo~o8Fc@T8e9_Ogc&VRdaZf+X z;gPi@o}p7Mt`lEtczNSj^GSu$ZWyY0<8qX;Gt}X;Gw~X_2m^Yay?nXCbPeXThbPZ^5WvVDVkA5W1hg7{0dum|nTX9=!^S zO?s6UE1-S;sd}{*-Fo#Fjd~3h<$6sPxq8hODSE9IQF`qbfqESl9(r9Cc6vP)rh2^= z+IsyKN_rD5B=sg+2&@lSWA#aG?g7O!>ZT0GL7Z*fz1p~VH=#TLhOms;%A zU2d^OccsN@-PINgb=O+V&|PoQue-^jO?Qh$t?o9965SmZ*}A(el63c4MC$Ih2+%!b z;jVkc!cO;?g{kgI3mx6l7RtJ3Eu?fWSP1G~vf$9YYVlv^y2W>$TNdwh?pQq4xo>et z=b^=AohKHjb)H!q(s^mIQ|GnCMxA#SD|9|s%-8vBF-_;IMX$~eix!<<7S%d`EsAyi zTV&}lStjbRSVrowTL$QGS-R`+Sla9GTbk(zTI%VDSgPuXTgvK4T8iq(Sn}$~S+eRV zTK>{jv3#YiZh1>v)AE$Ij^!?GealtahL*FnO)R^$%`L07EiJRPZ7gH7?Ja$@9W8CN zT`YCA-7RIcJuUgPeJuZJ`CGo%3bcHn6=HcoE8Oy+R;1-7tr*KiT5*<>wGu5`v{Ecf zwbCrpv@$KjwX!WewDK%1wF)h@wTdlew8|`bwJI$CYgSu+(5$n3q}gD3S+m*lsAj9> zHq8#p6`Ea^vow1xdo=qk>og}>7HCefOwycg8KODU(p__orKRRPOKr`CmU5blEd@1~ zS+Z!Zu>7X6+VZ8wTFW~c8!XRjY_dG0vBh$m#&*k<8aplLXza0^ps~-gMdP4lxyE73 zY>lIq@fs&AgEdZBx@(-VwAMIpsjqR-Qd#4&rMSj5OKy!DmjBgnS-w!eYk5)qzU40U zhn7p!pIG*(KeMb*e_@%V{>suv{jH^$`g==7^^ca^>R&9sseQA2sP@D1jM^{D9cq6p z7pwiZ>{ny7s#0UNN>gLC3RGjavQ^`>(o*BL5>w-|Vp0>Zdao*Ebz4=$>V&G8)mBvr zt3|3(RufcZtZG%|tg=-VtfEwvtUOdztjtx_tW;GstVC3`te91GtUjseT0KefowpK|h_EteE4pz=8PF5x=E>@~4ZdPI{9#-rs zUREEJy{#@Q`&w;N_P3g)9B5Um9AuTK9Af3B9A>4Z9AU+;9A))YDaPuSQmoYhrFg5Q zN{LoIO37A5N~ulN?&1`m8`;aD{h6ER-fc&TV0T!YqeH>o>jN}0;??fMOGg2i>=h< zms+vQFSmLwx5DbU+$yUTa;vR6&)t902tRz9-(tc+y$TS>?swE8b|$m*HQ5v#K@N3FKX9JiV$bHb`k=9E>w z%xS9#nX^`oGUu$cWzJiP%3QSiFMY}Cn)DT`wbECuTBNUA#Y*3>GL^n*#V>u^>ZQ~j zt0Pi(trke#x2lnPU==C#$jV&mv6YzA6RR(h&#bOUKDXK;`NC?7>CTn(aX6rj*EY=&vSgkw6*sSBk*saaPIIa1_xU8Rxa$6r1 z<*}Y8%4=OM%4Z!R%5QBdDqt-vDro&lM9BK0h_Lkr5fSSNB4XABBI4G8A`;fdB9hjk zB2v~Lgr%)_2+LSE2+LY~3d>mw3(H&I6H>5VEu?5&C8T8SDWq&IC8T2gR#4UYfS{W7 z6hU?CY(WicCqYeXX+bUPuL9cEmjraI*9+)b_Xy})X9*Zsdk7d>s|y%evk4empXN8Q z?&deO_Te|P7T`CxzRG7|J%`WII)%^5TA$C_`WLT_^)X&s>&d*f)``4!)&{)x)(pH3 z))#pktrzh)S(ouRTl?_1SS$0mT7TzuwO+yPW*x=tZY{v=VSSp*)4H3>%i5dE%bJhN z+xilxkM(p;U+Y*-KWi0EKkGLf{?=PL0<0T20<8l$f~*xdf~_C3hgf&9hgzGmhgrX7 z3%6dz7Ga&h7HKWX7G-^fHQIUtYmBuoYpgX7Yn=5NmU!zPmUwGFmIP}-mPG4o%t_V@ zn3JuGm{Y9XnNzLhnA5DkGNoIeV#=^y!jx&}-!<1wFf-%?n1Y@4{ za>jh?F2;Q8bjEyZM@D_i7(-P{e?w_YXG0-N3qwvz9YaP-MZ+H!Vul|rcnn`!Fd9Cx z_-=5=;+?@&izf!>Ep8i}w76t&*y5zYK8pheJ1w>wY_V8xu-;<1!D@^72Fom_8!WQu zH<)kHZZO-T!C<;Yg~1eyLW7AGSq6O;$p+mPF$NtLp$2Uheg@4J9tMpTjt2D>RtB{e zCI;0OdIpsi>IM}SiUwsC(gvj#q6Q@v{02o9oCbv!%mxJ(zx4Ah-s|UEJkigyxT&9O zaaKRq;*frh#diH1i?#YW7K`+AET-${SoG-USTySASd{DMSmfyESS0D^SVZXOSorGa zS~%MYvy>Md&Z8ZC&~&br#sK$s_p`dGrEf`4(l$l z*rmJ7VuS7qi{-kjEavI1v6!m6&Z0+mgGH0>W{XPQtri8k+bz;{cUr{h?zRZi-Dlye zd%(g)_mG9P?okUP-QyOTx+g6ZbkA6b>z=dV)4gE9rhD1qug+DAFFMyP-ss%2c&u~B z;+D>Ri;FrBEl%n@u{faf%woIFON;e7uPv78ytA06^TA@O&S#4rov#+nIzKF`b$(eC z>HM|G)cJ3bpu=Ptp~GV7ufuNXuES|*r^91uro(5ct0QQssv~SEqa$W1q9bX^qa$s} zq9bSdLtDY}g|@Qg4Q(~c6WSVQ@*Y*2q}nWg^JGF1JArM>zqOD**`mZIwKEdQ&0w0x!Z+47p&SIdKH z-!0du{j!{)_Q$eC?Vn|V8iQ4g8k3cW8jF>Q8k?1Z8iy6H8n@L?RbH!Ss{B@$RRygM zs0v%HRTZ_Gr7CXKp(<%rrYdcftSVy_s48dWpsHY{uc~AvtEytfqpD{0TSdd_wThP2 zEfpQBlPY>vJ5}_pR;n0U%~UbA>Qphcs!}nx%2u(oidM0<@=>w1vQ@FS(o=D?l2>uI z5>#=qVp4IldamqYbxPUGYOS)j)kI}qt5Riut4QTQD?8<2D<$PnD-PvwtG7xKR+p8c ztad2HSj|(4vuagJu*y+NvIkwN?y@^;WMH8m+D?G+7;1Xt7$a&}KD9p~I?E zq06dFq1!51q1P%vq2J0*VWO3`!elE+g(+4X3e&9K%FnPmB|p<@h5T%*Hu~^ar*&SBtvb(H&WOrK`%I>w2klknXPiDW>Q<;NSXJrmqZIwA0M-s+n4MXNQ^m#kW(FI&Y(U$ruozGlTQ zeZ%Ud)J>}+Qn#!YNZqljk-BRYDRtkl#sR>nKqkYYS0cYjIIN>u)0b)>lOYthb5?Sx*%awk{J9u?`mz zwYC%yvz8VSxBeq6VSQLw(z;7n$~r_?+FD*%#`?98to3#wIqOy-dFv1%1#49yMeA>Z zO4cU@m96Iqs#q5bs#<#rs#z-us$2gS(6GKLpk=*LK-;=sK*u^yK-bz=K+jr7K;N22 zz`*(@zoGRkek1D`eq(ESeiQ4*e5Tf`_{^+}_{^|!8MlkIHn*$wLoPS#SzPYc zQCuF@vRt0l4>&!omvMSo=W=>mn{xVC|KsqrKEdH(y+b)|qT!*6M8G){j{utQW9GTF09iw0*cP8b}w*l%#iVw=Gpi**J&ES4E;wwPA&Fx4W_V3I|YLBBOCL8FDXLA`~lL9Kla#_&@Z&ut6yNTNx#5ixqiOIT>X5DN&5K~?fUr^HTwA$Mf&*`>H7H=vHJNILHhX? z9{TwfcKQVt#`*;on)(G6^7@4qqWVP^-1-sqKBJk~3Y#eUtz7Ta`}TCCMwZm~pnrNwOB)fSU<*IIPwuD7Vy-DFXwyTu|`cbi3u?hcD+ z-CY(zx_d0VboX00>K?SP&^>ISuY1%&P4|R_obD+LQQb2ZJi6yBm~}5&{L;B>@k!^Z z#Y>$V77ui8S=`XMYjIxZzQu8!hZg&Eo>*+vd1kRz=cUCGo!1s~blzD^*7;!3t@GKU zN$0CYmCg@~LY-e089IL~5_JAsgzGR``suJ(y6Lc4+Ujsxn(A;{>gw=Ws^|z<%IFAN zis*=0a_dM~GV4fNe$$q&k}bWp(kyMXGA#A9vMuGcaxDe53M`qmiY&iqmRdg3 zEVsO&S!H=jv(|EtX1(P)%_hqQnk|--G}|m&G&?QJG`lS`H2W;0H78j5YEHIv(41;% zq&dSE0be$ZHA`B-C_#VgXLn4O_tL& zwpey+Y`3h_*lAg$vD-3DW1nS|#sNz|jl-7C8b>Y7HI7?qYn-%H&^Ti$qH)fWL*s(w zFZIiokJYbQo>9MUxlR3+<$U!!mYwSNEQ{42SjMV9w)9YcYH6hY+)`Hkr6q^@8_UmX z?=0`DeXu;G_Q`Uq+84`(YTqq;)qYx5s{OW1Rr_lhr1sy^PL0t@OO4q|T#eO=MUCC+ zgDRKRT~!{dQ>uJcJ5&X%mZ}O`O;#1QYETum%2O4$icyuc@=}$yvQU+^QdgC?5>r*Q zVpUbP`l6z0^;kvC>avQ4)nOGat4%68R*O{htR|@#ST(5_Srx08Sf!|#S%s=tSh=ZK zS(&R?TWP4+T1lzcTXCy6TK!UXwz{kAVs%j2&1#9VhgFBNmsO6kk5!wgP^;5Q;Z_@!BCTd9MO)P=#ag8*#aa0%C0H3NC0R);rC2d3rCPmGOt-qM zm}#|JG23d1Vvbd>VxCpGVu4knVv&`PVu_WxVwshaVucl-VwKe|g&M183bj_36zZ+^ zDKuKGR%o`Gq0nm8qR?(tsL){*uh3=XqtIhzrO;=kq0nz7rZCZpMPahlGx@1jN93nj zEs~#M)hIv9DnWj>mA(92D|z|(R{!M|SlyRfWOYDpiPb{6rB=;y%dJx7R$95st+LXR zTVus5x7O-|?0T!qvKy?n%WkroExX04QFg0Un(THfAK4vNhO)b?BxHA6{gc^i^;Bk` z)mfSSR$FBbTFsR?WYs2f#42Crs8xi_aVsa86IMDhr>w+ePFpd`oUytgea>o~^m(gR z>5Epe(wD4Er7v6YOJB8mDRs^2h}3nf1yVPyYNT#iMM~YVGMBn*B`S5#>Wkz9tILuP zt+q%$vYIOS#Hvj4sa3e-Gb<~}7gn;8FRd6PUs*ktcx`oD;;q#hiFa0$B;H$9NPM)4 zllWxiD)HG$N8*c>u*6rZuj1dWj*9=VnkN3!DqZ}Sm6iB!D?ahRR*%L0S?v`2Z`Cix zV4Wt$Xl*CPWGyDfZ2du$#rl*etMw95HtPma4(k|EPHRh1E^7%-bEpJ@`zmh55{^ zAMl!6ui>?@uHm(`_Tja%mgTj!e$QiLeTc`_dMb~dbtaF!wH=SWwFr-c^=)oP>wa!0 zYZq>3>)%|?)?2t-taG_st+lz_tUqwNTW{m^u&&|suy*G3wC3gXvcAFLZM}rU$GVWi z*V>N5&zg_J-}*3nfOR%|ptT5lkoA7HVCw?55NkcQQ0sTBVb<$d!>w~!Bdm2;BduSv zL|Lz9iL%aPiMBRmiLw659BaLcInKI?Io{fbIl)?qIl=k|Q=;`HrX=gtOv%IWBA{K(eS&)cY_ZWZw+2rJT`b_ansyFM|md z&IY{}wg%l6W(FM=1_o^wng%Tv$_7mqvIY$nVg~gV0tU4fTn053ECy8;fAuRZKI&Ik zJk>9^xTRlaaZbO~;;??H#SZ-vi?#a27K`+YEvD-iS@h}`Sv2VvS(NJ+S>);$StRKf zSw!d;S@`M~Svcz#Sy<{9S?K8(S*Yk2TS(~_TL|cvSg`4rSp3l|wfLl0YVks^%;KJ2 zxy2Q|3X4;El@d z5w6!};j7nS;iA`RVWrn?VW`(*p`q7jA*a`GA*wggf=6$%1+(51i(k6aEI#PYuy~<6 z)8fAFY>R8Ub1ly5&bK(CyU=2{?qZ8gx=Srq>Mplfpu5syy6!5AKHW7It-9+hYIHYR z6zgub$kN?vk*K@fB0_hkg}?4@3pd@p7IwP(ElhO}S?K5yG6RrFN=7cKNev+|1JD<7%g3OSS)RI*ep$S zI4yN_xGhz5_$;M$1T2Mhge|#sL@k+hBrLybOIbeEmbJX9EpK^LTgh^(wuomhGCYmX(_Amf4z} zmT{UrmI0c5md=_JElo8iTWV-dwUpMJVacmG%aTEJuH|Qq`IgT#7FyoaSYmlrW0~av zjg^+0HC9_L*H~*gTVsP|pT;K3CXFqYWg6Qpvov;E#%b)f4AR(V>85eO(n{lyrM|{d zOJ$AYmJ%8#EqOG~STbsyvwWj|!Sbs5CCmNlS1nhlU$>m3e$%o>{kCPA`aR14^#_*L z>W?hd)Sp-isz0~zAO3RqRB3R$J8idcoH zidi|UN>~}HN?9qWN?Y-%%3A$Zk+*uQqG)wTMcL|%imKHf6?LmMDwubLD?`O%D;dR7 zD-OkSt1k)_Ru2@atj;LZSnX7(vs$LmU^Q8x$*Mu2*(z6|)hb${-O59u)5=Vt+e$^D z$4XeC&x%oDg4F~0Nml#hCtJ;tpK4VtKiw)yeukBm{46Ue`8ig<b>k5t4p%$thURpx0)@x(W*gqlU1th7AtSr ztyYGz+pQ#IcUb+C*=6-qX1CQ@nY~t9W%gOkl{sM5CUej#U*?cigv=2uCz+#GIx@$t z#AQxcG0L2>x+#6yYJ>C{t9I#gR`Js3t<0q_SP4j9vU(+T+3Kj&6{`hO*Q{!!u3JS) z-LNu~x@9FQb=&HT>^|{JWK% z_zx>V@t;=D#C}=r5&L5`S?sS>me@ZlC$axlQeq6&Uql(L&xtZwuM}mrZWU#v|DB>qHTLYZnm#YjqJpYc3HX>$}3j)=Py& ztn-9Ltu2MctXYJ`tuF{kSkD!bw9XQevbGYEw&oU+vA!!PXT3pC-nvy#!8%${(b`Z@ z$(l=0+4`}7iuGOrRqL4oYSyI!>efL58rDVvn%2SsTGlW5wXN6j>sS}_>snjz>skNf z)3-j#XJFmSXJ{SDXJjqUXKek3*Ti}!uc>thubFi?uer4buZ8t*9!u+UJXY3=c&x3< zd2FnGd2Fqfd2Fq}a@$!ibs;dZbV;dZn>%jIO<&gEq7%;jv&z~y3nnA6p|o72rY znA6=_hSS6P8HcC!W)3gwMhsaPkYjx&0 z>)%ZA)|Z(Qtk*FmShq7JS|>6kSvxW%Tgx-0SpQ*6wZ6faX1#?m&3Y1Jx^)p_hIJ65 zxuvC{uBEP_ilvgFw57PAkR^{HmnEYiljV1V-xhBTK3hCCcx!Rf;F-k*g9jGJ3~pNN zHMnB2#o(O98iSJ-iw%xg%r@9>G1*|3MYq8=i)Mq37S#r8Es70RTI3ikvq&{qWD#pH z-y+Olj)lL$ObZW#X%*NG+A&M zG+Hnj)LZ<}ud{fgUu*GDzuMxeewD>Z{Yr~{`jr-&^(!n^=$Bi})i1M{q+e#yp0p7XNgo zSbWu;X7NUMhQ(vunHINnXIos8Z zbnC9MXwqG0QK`GZqCj_(MY`@5i#XkF7NNR3EPQl#Svc$Nv9Q+NXJMp!z(P~^kcFb| z5eo_3;}-n7CoR}@Ph0%cIcxDv=Yqvsol6!^bgo$3(Ya=ES?8w3X`R~^hji{*?9zE) zu~Fxd#Y&wg77KNrTg=dTX)!_PwMDzmJBxaq4;JM*pDprqzFMT|e7A_x`DGER^T)zh z=f8!E4x^=w4zs0+4x6R64u_?(4!5PW4zHzMO)3XRa?WdR9o9JO>#J1r;6`&urR7qr|h4{CW@Zr1X#T%zS?IZZ3jvRy00vQjI|GD|DcGDa)f(oZYS z(q1dU(oieeQb{Y-Qba4ml1(ei^1Eh^Q^jV z)vsITtKYPYRKIQMqJGy>PyN27r1~RE7WF5V@711J-d1~Id0g$4WsfwD_R26lrRuxUFG8JvBG!@%bydmVYPV9L)gq-J zt4^g5s{*Akt8k?VD|@9VD|Mx4D}JR|tM7{ORu2>ttxhN=TWwTKwVI`vZq=fgVU??x zWfiWNW96urXQi!JU?rwlXvL&hZ1ql|)asT(xz#a+N~_HZ)m94>YOQ(|>a4028muxE znykVUTC7|Y+N_Ke+N~56I<5E>x~=}m_gdYO@3Yz=Kf!96{3NSV`6*T*@>8u$#b5{H(GhgZn83v-C`v!yVdHS%yz4%GCQo!%Ivb*Dzn>auFPJmHko}^ z`7-;hB4iF)ImsNd(vdl0B`$N+ib>|U)h+20RvV>HT6IdFwn~&fV`U|M)=F6Vyww}2 z3s%RZE?O;;x@=V|b;T-D>Z+Bw)O9OSsT)?GC2v|?mb`7XS@Mq66v?|*rIPop!XzJ9 zSxP>%l9haH#US~_>WRcts}mB>tkz1ru$nCK(yBt@l~tU?Yb#fYw^lk5@2o^6-dp_= z|6p}S{FBu@@y}KT;$N(s#lKpKiGQRaHxr+UF+1x85VdVLeZT%eqm7+d4&r$J$+l z*IG-2&zet!-};%bfc1J|LF-CkA!`?5VQT?l5$n4`qSmW~#H}lYB&^+qB(24Tq^w^E zN?Y#|l(Fs;l(kM0l(V)Hl(!ZXRIq*}plE$WK*@T(fUGk{94xb{5sa`{JPfX`Sh%3@abD8@fld_@)=tH;5D*7!fR|jnb*WRnb*YH zgxA!Xjn~ZjCXc!GIvxw_W*$rHNFFO|10HK@4jvopgWR^(#oV^mTHJQlPq^%@=W{t& zM{_w^OL93{-{5qzp26vCoyh58t;6YN{hh-p?H z*6!@S)?eBDte3F)TZga(ShKPPTJK^FvaV+hwsvI=vF2nAwLZ%dYCVA^%sPZ6+**Pq z!ul?Ar1cW!DC<1tXlo1RXloYc80#BMvDWLE;;cKF;;mDe60Dt=60Mb)lB^k+lC1AA zCR=Y~OtzlHm||Vbm}(u)Xl1EqXke*isBS54C}+uIC}zoM$ZPrCfYtJi!9R;f2H!1i z8ho%gZ}8IMn89O!u&~LQ3qu*e0LBHPOsD7QrPW@Vob^0|Hi}kB5 zX6RR0^y*hxH0f7bROnY)u<2J={L!nl_@q~9@j|c4;+|fW#TC73i&J{l76-t0_0>Yp?XR<#rB`n;L9fB0 zU9ZuiR((AF%)a$j7*Xy$o)0<$yt2fbt zMQ^gjFWo5?A9bf$ywIItabI_)#Wmg87H4(mSRB!vXR$|jfyHLsMHZ`cmsl*)U1~8? zce%v`-IW&Yx~nbfb=O*y>8`iP)!k^3qPy85T6e2OknVO1FWsFMj=H-oEOhr;=C zEkbmDS@`Juv2fA(XJM_wXlbm&Y^kloW~rpZVJW4->R<$hA*04;~*0K!K*0prg*0(g*HnP;zHnEh_ zHn-%~wzT}CWn=kP%g*w?mZRkbEoaMvT5gt`wLC1BXn9*s)$+A$*9x$#)C#i9(h9YV z(F(Wp(~7cm(2B7%(u%iK(Mq%w(@M5v*GjYeshMHRMhOZ6w#b$$*wuY z@|VUm%eNXcEFWmhw!ES-*Ydc=e9PS$i!9e^EU{dqvCML+#!Aahjn$U58fz^JHP&0E zYHYHM)YxL_tFg_}Nn@v_nZ|BQEsedF@)`#$MKlgsa%dc}{H=b>@~Qes%k%1|EqAJ) zwOp)z-m+Kyl4XVZ70V>`YnHz1H!RK7Z&@m--?ijbzi;_N?V;skwa1p{)Sg=IQhRQ> zOzoxRWVJVz^=j`dv(-LWMyP$VbXEIeX{h$iQeN$cC6C%K%b%)$ET60Xv%I3pV0B29 z$!dcti`6_;Hme?04y!6vE~^Yx9;+}_UMp8sek&7IK`SLyVJksZQ7Z;jajW+#l2-Rs zq^-`W$Xe}Fk+WK-qF^;oMaim9Ma8OKMa?Q-MZ+pVMbj!!Mcc|rMc2w$Mc+zA#n4Jj z#mI_X#l-5fvYFL&Wecl4%2rkjm2IrrloqhgHJEyXyi!-@%3YZQ~L zrYWXa)hni1Wh$my1uJG+*(zpRsVnAM2`T1T{Z%NidZAEcbw#1X>YzfI)mnuLtJw;b zRvik}R%HscRw)YgRzV7lRt^fyR(c98Rp)2$t|=}lv`}YD!0Vy zrR*}RbFwR}Hp{NGnjyQ|s!n!|RkG|lD^J<=RtB;gt;A$ES^bsSV)ayJtJPVV?N(c5 zc391o*=5xxv)d|PW{*{b%swk8nf+EeG6${1We!;}$sDn|Eq&B#lk_pGF6k3iNzx~+ ztffy`iAtZbdM|a>>ZH^;t0htwtQw>)TE$3Rva*!AVkIVZ)#{7nHLJ^#*R3{7-n5!5 zdCRI)^0rl&*6RZ2X!ikEm{}2wm8irUtKZ^pt_7LH+))nEl78K#Jek;stylPtV z>kuI^YZW1J>#u?m*2e`Ut!D{JS?38#TRRKNSW5}YT7MFdvpy{#Z@o-F!MagE(K=2* z$=XIh*;-ma#rhk+s`Yk$HS21Ab!#VnO=}*0E$eH1+SUvCbgXmubgj+#^sHI<^sO)O z8d%TcHMGvTE*tADT(;JQTz1w5T=v%QIUTGwa5`ESaXMLBa5`JFaJpDuW+wOGQeKQM<`Z)Xm-u49g{_F#^*7G{pLe#jJMy^Sf_x|b=&I+H2Z+LbBJ zTA3-{nwcry`T=8t^-jhF>q(4>)+LO|*0GGXmdb|4mg0t5mOO@vmW+mymfsBoEZ-P# zT0Syhw7g;P%i^5DXN#i-Z!Pv1JhRwr@W5h~!EK9$23IX+8eFiLU~t-^!{C@jgTXztLiq zeuKq4{d$YZ`gIl^`n48y`n49t`ZX3A`ZX4D`qdV}`qdVm`qdV8`c)Pt`c)QM`c)S4 z`c)R9`c)R(`qdVU`qdWS^{Or2>Q!4j)~m6&saIohL9f>0m|m^L9=$r~U48Wy^Yt1m zrs_3X^yoENH0d>2RO&TbkGc7LZ&bBzIJICUn?mUYfx(h7U>n^ld zrn}f;p6*hMsk+N8dURJSlH?A zvM|-%W1*wF&q77_fQ7W~AqyehBNkk`$1E6iPgwlaIc4!d=ZwV*opTlsbS_$4*STzQ zUgxUCF`erc`*dzvY}L7Au~z4v#ZsLI7ISnSSxnJ+YSE+f+@eM2rA3X-8;fF{cNW3 zSRU5Qv)rm#V7Xkg*m9O;sb#Nbg=M{Fm1U7;jb*B4y=8=EqoucIv!$J8o28*U zx23pduO*jezvW+zNtPcprdU4Fm}YrhW2WUPjoFs_H0D}v)R=F%RAZ6lOpPU$y&B6b z8#Pv1mT0WD%+y$G8LP40GEifarK`pkODm0SmUK83T)h}B*s9&?xR=;5>rhdzkQT>kP8?}3u z*VP_a9#(r~xlZkgoqb`@!>W7l6)qN#5tD{ODR%?{JtR^e@SXC+cStTk3Sa~W1Ss5yYSV<{`SurVvTfJ6{ zw7Q}gZM9c1)@r$8ywya-M5}7WWUExgR4aeQG%HKR3@a7IEGs_69IKxSxmHgV@~ti? z6k6?3D7IRuP--*-x6_eaTt7o!{txn4>vDzTJ%xbFa3ae__l~zfztF1g_*I4PxuCo%8U2pYQ zW~0>;nN3z_WVTpsk=bfBS7y6ao6HWYe3_kAkutljoMiS`>B#J}5|`O;#UyjU>bCSD ztIg7ft-7U;S|v*#v$BysZY3st(&~fMDXY^`r>&MtowaI`I%gFxb>7Na>Y|mT)FrF$ zl9#QnNnWwqDtXOns^oR6GRYfO;gYwkEG2JS$w=O@`Y&aoOqs}m9rtky|9w3;IE z*s4n6iB*EcQ!96gXI6R=&#lBHURwPTe`R$}{I%5r@i$h*;%}`y#NS)Vihr>BB=*tj zgxDvm`C^}~%EZ1{`HFqBQWN`b^-uJN)pgOIR+~kCSxpfAZIvtf*UC%upOuE_e=BxT z2J2@cjMm3Qn5>tHFk82auvlk^uvvSFuv_bia99hAa9V#5=Ca-+%x&Ev%wruY%xkSA z%y0ccNWgl(kf3#+kdSq}kg&DBkcc&-kf`-#K{4y)g5uWIf)dvLf|Ay%f>PGM1*EO7 z2*_Bk6Ogs;6p*t{5sT*K5Ky#c5Kyu{#IJ1K!mncO!LMq~&#!KMlTX8XDW9fw z5ucW|J)gEU51)?pEnZ#gmArb^mAv}ap1cOu(!7S&?|F=@5AzsX&*U+-&f_t$cH=R% zmgh0E{>W`^y_DO+I*QxUT9Dhy`XraNbqkk`wF{T6H4B%W^)XI+>kdu_YadPrYe7y& z>$@Dz)@wLitgAU(ti3o~t))2Jtgo}XTi3FCSgWynT3=-IvTkJawl-z+v3|wsV?CeM z*E)>V&svz(-}*jFfb~k2KpB=!>!*jMOg1= zim;x_6ltBy6lLwn6m6}_6l2Z86l496G1huFW1RIg#(3)r#supGMte&MLo-VrLtRTo zLlw*K1~Qg!3`8s+8Sq%%FkrDfXYkkJsKGaj-3A{lHW|FKSZVOYVu8Uuix~ztEcy*D zTeKUTv#2*XX;E%))FR*DfJKJE9*YEn9Tt%WTPy+%HduHWthI19SY=^ju*|~LV6las z!2$~ngLxK;2D2@s4Q5)17)-O^Gnit*VKB*p$zX!T5B)xiH~Kvm5A?e&uIP7KoY3#E z*rVTOu|dDpVyS+M#Vq}1i+=qkix&Mxi%R`Qi#+`Xi)8(Ji%9)?3qSoj3m5%53oHFP z3w`}s3swDE3u*mY3jzIF3pV{)i$8j`7N7L$EMDlYq2QNYqiMMYqLnyYqyBd>#*?G>$Gsw>$0%b z>$Wh~>#@+%>$OnS>$8y1n_$7GH_?JsZ<56y-6F&1B(%oyJsJq`nLieDBfbL-ncHN^E|8$O9eA78; z@lNNo#Z#TL7I$^dTU^z-XmLj8vc(ads}_57Zdh#Axn;3h=Z?ic8!cpg^g{96P3qzfM7MeN? zmWn#emXbQGmV!F$mYh0VmJB*PmLIkGEFWqMT3*x^wmhgUYPnHc!g7(el;tFCS<5DE zdCOvLMayJu70VE9HA`1*4NFsPZA&$6T}ugV14~YABg98t!PV5 ztvJiynhBQgG?OhKXr@|T(oDBJs+ncET{FjWrDne69L++@KFwmwM$IzI63q(Bbj>Qu zD9u_+U(I?;2hAo+W6c&zHO)3lNzG169?fn`2F+f}&l>%f&ow4l-qM(2c}`=R^ zmRmJuTdvTUYdJ?_zU2gsMV2iZODroimRaU#th7wfSZx`ivDVU4W4)!V#wJT6jV+ey z8rv+THFj7EXzaFR)!1wKS$)6dUG;;OC)AHvZc;yHIamFJWxM(*%OdqNma*#REj`pP zS{kcgwv4IcHeTb+C$5Jwa1p#YELaQ)LvMIs=cyw zQhQ^mulCMTM(u+or`jjW@2X!cpQwJdyrlZw@__13%k`?iE$6EKwd_{?Z&{_vXqBnT zY!$A`YUQTNZe^;XZ1-%!0Mrjkkv&M5vzkLVpbbfB&-&yNLfu( zk+y17k+mvPk+(`xQM3wHQL=JTQL!>pQL|E4(Xf(K(X!%F(XslWtY>vc*}&?6vXRwN zWfQATWizXMWeclNWh*OdWg9CcWjiYlWqYglN{&|7l$@>hD!E!MQF6EHR`RqeR`Rxr zR`RuSQu4RbQVO&ZRtmQIqZn%SR58rzoMMF4cEu>Gg^Dp&-HLHmrHTnw35rQpUW&<9 zri!Un3X17g+=`i2-xRW~9xCKmomI%Q+Nn@rwN#eqRgOZrRg^-dm4`x= zm6<|~m8wFWm54%v6|+L4)l>Oqt0VHQR*U7^t(xRJtdiurteoU~td!;ZtXSmxt)9wF zv^p*~*=nWS6svBzX;yi1GpqvTW?Grb&9;)1n`8A?cAnKE*#%a|Wfxklm0fH#Np^`< zh3qn`c-iGvZn7(_bY)jtiO8<8`Yp50>aomvtJ5+Yt+vQ)vYI2a*{W4$t5u%NHmeAk z9ac^t~X(ub^4qz_x!N*}Qjmp*3oN$R-OS*a6N zE2U0ZwMw0~N|ZWdWiNHkN=E9u)i22lRyQRtTJ4a$Y&ApjidBW=RjWwJYgX2hH>_kO zZ(1=(-m-ckaog&I#9gbk68EeoOWe1rlz3p3Ao0k`L*lWOzQhwNafzo^|HPkJofm&$ zwNU(}RjK$ZD^Ky)Ru9-Y?8y-6PCt9VyIZts%@~{auLH`j`-(^>iVA>vSOjYfB+PYi=PS>wAL2 z)|&)HtlI=dt)m6StPKUltvLiGtnUj*TJI2$vYsd)ZJjG1W9=m%YppIIXU!%cZ+)6y z!Mc}U(K?7<$y%IW+4>%ziuDRURqGNyb!#U+4QnAjP3woeTGktRwXK_Yb*zJVb*)u- z^{jvJ=v$xRF|c05V_;p$V`v?~V`QztV{FaHV`9CN+tfOr+ss;>+uZsAmxc9gE=%h$ zE-PzsE^F(XoHo{TIc=>IIqj^~Iqj|AayVFT=Ww)c=Ww!);BdCq~CTUouWb6I_?)meS4AF=pZuVeAIu3`zWc4Y~$=4T1C zzQG)1y^uNBI-5Df+Jrg8nt?gg`V3Q;^<1WK>k_7LYj36qYYnDIYZj(R>qm@H*83Qv zt!FdFSl2SfS|>3&S@IfMS~3|LSbjH9w|rwDZ~4eT-13G2zvVdt4$C7343@hMepzfZ z_-wJl;H|}cgXb304IWzb8QigGGq`S1XK>M?%;2m=p1}!=G=n1+@do=X!VPv?1Q_hF z@HE(B;b^eI!pdN+g|WdZ3tfZd7HS4dEaVLqT1Xnqvk)?vW5HuE%Yw~dx&?#5REsbA zlP#X>PqetLKf&UHexJn={T_=Q`rQ_5^t&t;>UUU7)o-`x(r>e<*Kf5b(QmQH)Niqf z({Hv2(QmTw)Nit|*Kf2i)o--W(r>g-&~LC1({Hfg(QmL|(r>W%uGe7kR|g_>TUg{)q`g^1n+3ogA$7L0n6Eq>@uv3RdL z)#91%bc?&XGb}Fa&aybAJKN%*?i`Dqy7MeH=+3uTuDj4;p6+6cX}U`+dUcmswCJv| zsL@?%QKGxrB3pN@MY8UCizwX<7D2k3EIf6$SUBo#v#`+JVPT-V%R*gukAJ_|A3 z{T95s2Q6514_o}vIco7)=eWgdos$-ibxvE{(m7{wN#}yaDV<9ehjgx3?9{ntu~FxS z#Y&x977KOmSj^D5Z!tmVp+$$zV~Ylzrxq1D&n*gcURh-5ys=2od1n!!^T8rO=d*=} z&Q}Wuo$nSFIzKH8bpBXq==`%#&|$EY&|$U|&|$UY&|$Y^(BZWFpv`0XK%3921<$f(|%Z*yLmW#CsTdHVW3}+)Q?(LsvoyZQ9otruYShTTK$}*n)(GxA@xg^f7Py7zErzrc~$L(Ici)s-G-RsD82B zruxltsp=2Q$*R9Bn^gZ;7OMWUOi*R8@>6B9vQuTT(p6=%l2K*1;#TFf`mMrk^-6`; z>Xr(>)hQK0t6eI>R;yG*tY)c*S#_yMSXHY?S!Jt8Tg9lzTKTHTTiK~7S{bM)TPdoj zS_!MDTd}HWTD?`)wz{aSYqd>T-)gq9p;f)Iu~mw)iItbKnU#UEg_XFnmDN8b8>^>E zc2;MV9IUn|Ia$qCat@O-IwdLIw;p~wODSVRh!&ot4z5mR=#r6tPJF4Sc%Hb zwE8JK+v=X|9IL~!^Q>0NF0ksCU1(J*yVxp5c8Qg<>@q7Y+2vM(vMa5A%B-?_B(uiq zl+0SI%`)q)X3K1_YL(e!l_#^=Dne$fm6OaiD_xl#R^l={t(awYS>2J|W3^d&uT_uq zKC2Yz16Fp@2dyNe4_kefI%0KB>ZsK!spD2{QYWmErA}HoN}aZnmpWthSMsdY9m#W6 zyCpAJ&6d1qRV{hRDn|0Mm7U~OD+S4GR!oxDt)5BTusS7i(`voMZL7%=cdRNU?pno5 z+_Q3*cwnV3@z6?K;*k}D#AB5jm9E$aD|WF@Ru4r#TkR43Vl`d#t5vb+H>&{A?^e2^Kdg8}e_6c|`E7MZ zu7#?YXyD<>t}q5*6aC{tSk7GtzG$4 ztws3Mte^6#TW{mluu^7S^vgt*qB^T3eTJT3cIj+E_Dk+FGCD zu(O`bVQ-zp;b3jb;b_gy;bgs)-Pt;Z-Nl-f-PL*>o2zv!o0~Nso4fT1RuAhYR!?hN zRxj%xEZ){zSbVH&S$wU1Sp2LdS^TY^F#B7tXAZEgVh*%+We&0yU=Fgr!xU`2k}1Tx znkmFOh$+-sgDK3Kg(=MX5o5UZVa7=7#f*{G4UAFN$&9X+OorB$-wli`-xz3FJ~B|W zylx<6dDcM4@`wSqdB47OWX8f>vJGT30DZLrot#bA|%tif^%af2lm zf(DB$xD4i7uo%p>_@h7D;)DK7i^uxYEw1ZNwK%Om+2VlyM2ju@6D(Hf_gT!*@3oky z-(%6H-(^v)-)T{x-(iue-(eA@-)`Zr-)7;e-)do{-)do?-(sPr-(n%H-(n%C-)zCI z-)!+$ui4_WUbDqZy=II1dd(JB^_neC>or>()N8ibq1R%uPOrsciC&AvY`s>CiF&OT z9eQmRb$V?UrF!ia*?JuoNqU_Y5qg~#{(4;&ZhGAowt77lCVHT=eEKXD_4+M9eSUtu zi56^nlPvz~PPX`>JJsT~?lg->y3;Lg>dv&dpgYUrxbAF=eY$fkw(8EaSfjhZVzKT* zi`lx1EhgzMvFOxYX3?m-+@eBvrA2}6YKwH;H5T!@>ny@_H(2=TZnALG-E3j2yVb%} zce{m-?oJC8-Q5;4x_d2zb@y3t>mIOR(miDHQ|E}qN1bC9FLX{=JkU91aYN^f#d)1` z7RPliSnSuiWU*c6ip6@JYZl9OZd%OKxot5`=dMMc&V7qEore~6I*%>Nbe>w|={&bc z(|KhPr}M@lOy`}2pUwvhH=WNGb~;}z%yhn6=;{2lP}BKiA+Ph#LR^Qzl3$0(l3j<@ z^1n8_<$G;T%lq2gmKU`7EDvZ4SZ>f3vRt4oVmVP;+_F(y(y~Zf+A>L7&N5hA!O}%r z$t0?TxbMV8STODqF4mRY)Jtgy7ySZ%4RvDQ*aW4)!g#zspXjV+dp z8rv-2sPC}6roPMap!y!m)$02!r>P&bY*0UJnXP`*GEDurrIY$eOI`KTmXhjcEm_si zTYgl#Xn9xdvgJv&YnEHpZdfi)&(c(t z!AeDy$x1|(#fn9h&FZrXht*>hF00EbJXVKQc&#?8@LMfb5wx13B5c*7B4SmlB4(AU zB4HJ#B4y>SB4cHtB4?$gqF^PhqGZLZqGI)5S?Rx5^BO;rrDs#lD#%2JH73RR4;a!`!3(pHSO5?4&L zVp2@DdZ&X<@?)h2~3tN98!R^1A@Ruu~QR;dbwRzV6yRt^d!R(c9$Rx%0| zR@@4eR$t|-tuD*gT5XoEx0)>9U{xaDWECRcVr44dY9%J$ZuMQR)9R*Nm(^~$9;>-> zeO3)}{Z`3x6Rq6kCR=ICO|cS?n`ZSzcDmI~*_l@RWoKJ0m7QbNEj!PuPat6$_+^(_eV18obzf$s)d`tZRvTs3Sk01IYtD^YT(tEA!rT1A$N*}QLB6ZN}ywoA9)lx^SI;4(T zrAi&Ma+W$_r6_gM>c8YEt9z2Ct@cTtwVEe+&ZA#uk_U*fKnxWqjx28jn&m&6}hEfs%cRU!V^ z%18XEm4f&)tFL0utwrC-U9uoX8KW^&-ElCW!pDDiZl)6(;i6%2MQ?m8=MZHKPcl z^%-F%>uJKw)``L_)_TIM*8haqtj`OvTQ3yiv@RCnvUU^Vww4s)v3@7WYkgRd&w7R+ zzjeN#fVG>TkhQF!u=Q5~5$kgTqSh+}#H^bH#I0im#H}p^B&@{*B&}caOIa`Hm$uH} zm$BC7m$m-DCuhBrPu{wTPr=%UPtjVOPs#c@ud?+{URCREUN!4@UUh2|UJYvwUJdJe zJet;y zkJH?GKc|It3#X;EH>Z`gFsHTk9S$4oWgIrvg&ell_8fNBLLBziXW1RB%h(;Q71*7u zPq8^$m$SK8tFpOT-(+>Qp3LfI?a%6N&BN+peUin~x`V~b+MmVST8_oX`Yp4M^)6;# z>vm>8>tJSoYkB4X>o-gR);pL2ty`IbtRtC%taX`!tQnbttsgRmS|4W&vtG#urt_aVQ#S7!oXm= zg{Hw43uS|i7BU9wEJO`fTkspKu;4IQYQbc%*y4x&0*g2L^DOS`&#}0yKg;5{{tSyf z`qL~n=ufp+qCeSUhW;drUi}Fcjr#o-W%_*<+4{W}3Hm)2q59nx-uhh@4*H!IrurQg z+WH+9iu&yq;`;3tJo;@GO!{pWKlIux-s!bjJke{jxTV)-aY3)m;<#R$#a_KOi_Lm% z7Ay7IEEedsTTIhyx9HVtw`kVuu&C1Ouqe>$v`E+Mw20N~vIx=Zw(!>Lv2fJuv9QqV zwb0k=vryCPw~*DFU?HM6(SloVk_D6AWQ(7=Q!GB{PPKThJKf@*?hK2ox-%`#=+3e@ ztUJeIm+oAPjk@zJR_HFUSfIPmV!G~Pi$2{Y7OlF=ENXR^Ta@Uow8+t2Ws$7A#v)pG zokg(jdJAvejTTP2n=Pz#w^|tKZnMzT-C?1qyURjScaMdD?mi0+-TfB-bq-p5*EwwQ zUgxOAGo9lW_jFELT-7;kaaQN7#ZjH}7JGCqT5Qp|Y_Ue?s>KqW>lSl#Zdy#yxoy#- zbJwCp=e|Xa&O?h5oyQhAI?pUpbY57*=)AHB(RpLxqw~(fMdyQst|(`B$68@|`xjvap=2Wo_B2WouckWpA0OEedUbDb5NVCY&RkPI6LbKdbTeH$qUbDthShLQOO|!xBmqwH2JB?P$hZ^mcS2a2< zPik~q?$zkC+^8|Za;e57%b6NeEPFMkTQ+ITv@Fw@ZJDJp*D_vXfn~79B1;dAC6+cC z%Pb8wR#>WOthSWWSZm3zvEGtJW25C~_05)d)wf!nP~Ty>Nqv{)T=hMc9qRimi`5TU z#;G5&^i)4$X`+72QbGNMC6D?k%O7fIEuW~Jx4fWs(Q=R4Wy_UnS1qTiUAJsfyJ?xH zcH1&q?XIPV+C58CwFj0;YL6`W)t*@XRefgpO7(^14b@kc$5h`~ZdH9}xmfkRkDr;J`DQjEhDC<}SD(hL9D;rqJDjQibE1OuoQZlo;sAOTaQ_0F| zp^}YNr;?pjk&=T|l#-K`vyzLIj*^>|sFH`(KSeLA7m7Ys7Zv@ib}RZ@EmaJ(>Q@Z5 zs#FZMN>L2A@>h(svQmt)Qd5kv5>$+{`m2y&^->|p>Y74|)ggsctMv-$RD^Y6(tE7FNbR$_Ahq9Wjno0FPN_pyX;O!+T%?XzDM=l(Vw5^=^+583)d9(qRtqFg zTQy3au}YFWYvm$&&Pq-4f)$74MXNUwm#of9T(;UQam8we#8sF68UPiN#vW= zWRV|Mr6NDA!bN^rS&RI(k{9`7#Uk?8>XPt(tGU7q)|tYL)~3Qt)=a|8))$3Xtd|I} zT9*s4TYC#}Sj!7>T7MDbvOX!uZ9QL*$GS|A*Vom&Drg(pRhStPhxYlc3^X|{=n*Ny_nU-I*!%FT9(z- z`VNbm^=uY*>u44aYeg1M>yOM{)(4rrttT*hTgNf`SnDwRTK{D7vp&Y;XFZ9@-#UTG z-`bcdz?y?8(E15uko8H%VC!{^A=bT&q1G9UUY2hS94#LiSXf>+(6>Bmpl*5CK;Ckv zfrRA-13}B>23(eN4VW#b82q*9G5BuLZ1B;d+TgWCvB5KoEQ1FY$p&{Uq7ANF1RGqk z@G&@N;bL&g!q(uJg_*%23w?uq78(Y-Effv5TSysfu@E-cXu)f+&VtQgwFQI0N{cW0 z%Pd~#FR{3zztG~m{(OtW`g1LI=+CxTqd&`Hf&L7Osru6_I`yYo)ap;RDAJ!~k*+_{ zB1V6LMWBAag`0k#g|&XKg`s|rg_?f1g^Yf;g^+%i1&4l@#Xr4Hi!XYe7O(U=EgtA~ zSX|TVusEaFVR1;W!(xYChs8R*4vVFFoffn8IxQyYby{@jbz0Qxby<|^by?)-bz3Cs zbz4O0^;iVx^;o#+^;+2K^;wwc^+V6^od7+{XOaawd|%&Gi#NK{EFSAlx45M{!{Uwj&av38JJ({J?tF`-x(h7k=q|LFth?BvTX%^?lkPH$O5Noag}N&(GIUp2 zBi!d-Wxg}v@33p3p<7J9ndEYx(jTgd6|v=G(ZZNaO%*Me1dpT%FD z0~TL&4q3d>Ib!id=a|K9of8(9bxv8F);Vo)Naw7@E}iohn{+N(tkSt`u}J5t#Vnoc z7L#;tT6F2$wrJA1Yf+{1z@kX!kwuoy6N@CBXBJU9FD!y|URikQys>c7d1qm*^TEPc z=d*>j&Q}W+o$nShIzKH$bbed#==`-{)nTywt<7ZlMw`X*jy9X+S#3_secIfX>$G_- z=WFv@_G=4THfW1j7HW%GCTdGq25C!KI%~^VnrO>gs%k4*ifJobvTLha{?O8}e5Ivj zd0R`z@{E?AOtx&- zOtq}i%&^SW%(6_-%&`p7%(HaYEVQ)JEVk6uEVWeBEVmTVtg__Ltg-x~QD^yHqrvjA zMziI0jaJLk8ts<*H99S~X!KaF(CD+AqcOp9g2p7v7L6&El^WA6b2VmKCTYyJ4AYov z>8&x}(q3bcrHRH8OHGYsmU0>^EQK{zS#oHsvHYdJ-tvk1M$2>Rn=N;$Z?#;azTL84 zeWzuW`fkfq^}Ut>>iaEi)DK#!s~@oxRzGI>U+skDYqe9B*VWEg9#K1Ixk2rMEX&lcSthI9unbVUX=$r=+frNYuBC+9eM?rghnAmJA6q_DeQJ45^||F<)t8p5 zRbN@oQhj6Dq596UT=j!xn(8OZP}MJ%E~?)wO;mqaDy#mo6juFX$*lU%^0Nwq)e{v) zt1BwZR!3A=t+uMLTP;=Lw3?>EZPlj2V^yxgXO*EMU=^t%WaX_QVr8QuW~HklVI{93 zWhJO0W5uK*XZ2E9!RoBClGP?<6|3pWYF0JM>Q+h0npPgl+E#kXx>h2}`c}V`46Pn2 z8C#uDGPPQ-WNtNG$8j9q7ZL&Q6a%?x=Es?LV zYLTz9N|CR&a*?mKQkAc_VwZ2UdMVdrbw;kmYQ0>W)g-xgt5Ug6t4O(SD_gl9D@D0J zD>k`)tJksVTDt)Ilp{sY6ywQb(*F zNglO2Bzeqgk>qi!X33LQDUzqG+$2w1X-b~4;+8yX^-kiv)g_4wR@)>lTFsWYWYr*X z*(z1yij}v-H7g^D>sC?{H>{W>ZdzRxzh$*d{Ek(X_+2Z1@q1P(;`gn7i9NKsAoj>= zx!7Z?da)-~;bKp%48)#Uaf`jMdM5hP>Y(T=t9hcYt*S-eSVfAywXzU>ZzV4J!RnjH zN2_ZhpRBfte72e<^2Mq`nQ?))&&AW);D%R6@)U5M))U7>u zG^~|)G_8MdYgupP*0#>!*0EOS*0p}jrDwf>OW!(<%fMQm%h37}r;+tCPGjpVP7`Yb zPE+e&9A?(XILxglaadT#b68sIa#&h_XScGR%WiG$$!=r)lg-w8C7YdfB%8f87n_6i z9#%)|0#+w$O;#uCS1iuft65yEb68xh^;q1jzcRa9A7S>ep2qB9ozCoOZN}_n&BE+$ zeUZuAdM=ZXbtaRKwKbEkwJ?*P^(#hy>l2It)*BcDttT=DS!Xl)T0Syxw!Cg&ZF$zf z$nvm(mgPQi}uni!HY3FR)mlKi^`G{#=WR`m-%s^=DdC>Cdpp z)1PLMtUuKvLVt>dul{5UC;dql=K2#Ybo3`!DCzfGNa*)j@ap$jFzfeP{M75Uc(2!E z@l>zJ;F%%)(%ogjrMt(1Nq3*c zFP;4sA9W5|ywo{t@lfZe#Z8^#78i9+TAa{1WpO~~jKvO}a~A7$E?6wrxnwb4=ZeL2 zoog2TIyWrZb#7TS=-jcW(79((p!2{YL+6o2g3c3*2%TpZ0Xi=%Jat}KIO@Eyu+({H zVW{)LLQChfg_6!!3n`uN7Q#9|Ex2`lTQKYVwfLd^-{Pe(Q>mC*YdFB((<n;Uen+5k!GOfRm~8~6PjU`yEP*$*J(yuF4T;*oT3?T z*{+#rS*@93nWvd%nWULv8LF9O>7kixX``8MsjpdRsjOLSDW+L!$)#Cg`B$UL@}owL z7w_K&sX*o}$$8xeppJlto1j}lTNtOi~Q!G<7rdvj8 z%(V2=m~H8#G1t;uW4@)1#v)5ajU|?18p|xXHC9+MXsoh)t-i+cs`@(11L_+rSF3Nb zoT|RXvO#^jWsdqz%W(DGmd@&XE%ns*TS}=Pv}991Z23v;sO3GiUa4U#dQ^ysrAl@~G+) z%gw6KEElOhx16B*(z0IlwPl{_TgzD0_m)1YA1!TEKU-?6ezlZV{cg#v`or?K$}h{; zDt|0*tNgP(qrzadSB1%HtqP0PJQX&peiaU@1{E%=LKPmXBo#iZU=@BVR~11kGZkSg z4HZ!4lB!Btx#69>Qz>@DpFRpicnU!vQyTyQdQQr;#StR z`lO_1byLZ}>VT4w)p8{ht9~Ujt8yg^t9T_VD-R_bD?=qaD`_PMD^?{ZtM`g7RyP&h ztPU%BSglp`w3?ylZPldcYn7|$Zxx{!XyvRJY^ARlVkM;*X2qr$Vf9HN%IdyCjMZs{ zSgRch@m5O}60IgHBwIBoq*&!Cq*=u%WLSABWLcRjWLv2zXO=Rl`gf{%2jHgm9o@+ zD`u$!R*xhPSsj)A3R=>sW zT3r&mXSGu7fmNf}L#rsUM^?sSkF9vco>)B>eQI@B^qJKH(HB-VqA#tYL|<81ioUjz z5Pf6yL*$*+4UzX&J4HTN%@X-&RW0(#DpusPm4nDvD;1G%RvaSVt!@ebuv#Mg)2dMT zx0Su{A1glLzgG8z{#mUP`fpV)#9$pD#AvM|#BBXbkj46rR_9T(X5vw|-ove7UB<0xZOpA@{eer{dOeqpbsm?lwH}wA^?Ocz>n)rH z)>WK_)()IT)*PJ1))zTUtmku>TIX_@SzB|MTXS<*SZ`;yw2oo7vgTyBvfj;RZJozv zW39kuYkh^)&bouu-rA1U-uf$xgY^y;N9!sUCu=(vXKO|l7wZ$uF4i-dU9Gd3-K=ex z-L1KqJ*;msc~~!F^0Y2x^0Ibg^0t;`^0xlU=wp3`(bswdqo4I;Mt|!9Mt{re25y#T z4QwqB8<<+|G|;tNZ=hCIe>6N`t=^g$Ca(G7LUiBpAH0 zh%k6=5oqwp!qeccg_FTe3oC;w7RCk_EOZRcSg0DDu#hu2Y9VfL&_cjqp9Pn}ZVP6E z9Tq?Jw_3c_-(>MXf4#*O{k0Y+^jBHz(O+S)L4TRW68$9>GxQf(^y)9LXw;u)QKmoF zB1?a^MZEqjixB-87M}XkE$sBCSs3e2wb0O?Vj-tL*+N)S z*KhGauixUDUcbdzy*`V>dVLl<_4+K<>-AYI)9bUCqt|CKNw3eMQ?JjWUa!xhOs~%( zSFg_^S+CzBO0VA{P;Y{Thu#DWJH3e(rg{^>_w*|3O|pR8*)zq0U2m$zKi#Po-*l&0 zyw#l!-`9t{#&3u2T#F65^DLI@F0h!VyU=2q?jnm`-NhCyx=Sspb(dKb>n^v*(p_nh zsJqG{Qg^jQfbLog58ZVZ4!RpG%ylZIgR_DCMQk{zyb9F9T zOx3w!(W`UKqE+XHMXk;)i&C9C7I`}NEYfrySj6c(vIx_8V&Sjz%)(vgg@wJ&D+_a- zHx>pu?<_QQK3FK|e72C(`D!7k^WB0==cfge&Torv+J7ycY5%vlq0MM{Qk%tcmo}T_ zYHbe7Ioe#7z1lpMb=rKE`Pu@O3EIMzf!d;$PTJy@#@dpWD%#SPqS~^S?Ai*JKeUuA zUuvmX-qupHJfo#yxlc>Wa=n(WmeE>PmcCjxmJV8W zmPT3*ma1CLmf~8jmRwrymVY!oE#GVUSU%G9v%IPqV0l6_$a0TnsO5UiaLYxSk(N_6 zqb)l$V=Zem6D;#JlPr@pQ!K+Y(=5F-Gc9d3vn>rZb1hXh^DQMb3oUsxODq{Q%Pc=@ zR9HUOsIt7RQDb>tqt5cMMx*6+jb_U=8m*QKG} z&T@|W2FrH!O_oLKTP)+$w^@3s@31sg-({(&zQ>YReV^q|wF8z<)ec!+QafU~PwklH zYPA!VGt^F5wyK@6EK)mXnV@#T(pT-0rIp%cOAWQFmSSqxEt%DBT7Fc$ZFyhyuH{+P z`<8oDA6l+beQY^H^@(M>>NCqS)fbkjs;?|VRNq*-sJ^o_R{db9toq4PSoO0dv+7sN zPb%LnAFKSdysYxu@`%b`%dIN^Etjbuu@VHvJz1dv0_sZv-+ScVRcnm%4(;wjMY44Ijd%61*=SDB`ber6)RI^H7jXl z4J#&PEvuJGI#w5y^sKfk8CcC%GPG(}GPcTBGPMdBpF)CFwL+p*rb4n+xI(Ixn?jnEi9&{zl0uf1phC74gF>#= zJ^6gAJ@N%sv*e4cD& z%1^Gv%1ExwN?fkp>W^%v)g#$%tK+ggR%>PZtft8JTUEBc3Qbg z?Xpsl+GE8mwb$ygOY(@7j^r^be#zrjpCwLMU6(j% zwOitp)dGn#R;?0et+FM~Sp`a*x3ZA9U?nec$%;+lveg~&D^}~ouUa*TU$Y7pzhR{= ze$(oY*e$EeVz;eUi`}tm7Q1T|BX-})OzeRbzt}^oSE7%sj*33ES}6L&s!sHoRgCC! zD=X0#R+6GGt$vEUvbrhq+G>}`TdO%D@2u)X-diPze6VsB`Dmps^4W@8Q&DE!Onq0n!uO+tUHT7>>ug$ez$(iHk{^+%Aw`jQ}{^(sMT>lQ&4 z>sUcnYjZ(1Ye7MF>o)=%*2e`ntrrV$S=S42TgM3SSX&D4T8j(tS-<7yw_d|9V4cG+ zXsyRDWc`6p*m^6Uh;m!@?!mzK2+m$vmk zP95umoVwPnoO;&2och*coCenSISj2=aTr-wa2Q*AaF|$2aF|+OW;e4gXE(Q&VYje8 z&1PX;$7X45%w}c%g4No3E~|}o2&;`XH><7nVHP{oUeb z%d-X^mWK@-EO#1MSgtoPuv}`OVL8V@(Q>kZlx3HJuw|nGk7b1cn`MCkgJp)nFN=7C zuNL73?=1ohURih;JhgBzcwk{^aL2;P;D&{k!DS0&gYyrb;_(VuGZOK*zB2ffJ_ z&-5l++|iq4aY=8I#Rt^d?z2>rJw-(wk&qs5jX{LvON$yxtTG&^^68dQ&Z!^`=?; z(w%PcQFpq4y2~u`b(dSD>#nqj(_Li|rn}n0S9h(2i|#rL8{G{SCb}CfbaXdcsOWC7kk;L1 zA*{RIf?Ic|1+(sMi$6MhEI#Y(vv{p@z~ZsaL5tfuhb=Da9JM&DbKK&v&Iya%I;Si) z>zuJzt#i&|vCesm**X_3ChJ_b=+?Pv(X4abqFU#sMX}Cpi)@{{7AZRSEn;*YT7>94 zvhdY;V&SUu%)(aZg@u{UD+@iHHx_C-?=0kXK3a(De74}%`D($T^WB0$=cmPI?cWwp zwEtRM)&6gBOqAj@lxY#@b?* zD%uj3qT14yY}&GxKeXg6Uur2@-qupKJfo#*xlc>oa)XwZfmcCk+mJV9hmPT5(ma1Czmf~8DmRwpcmVY(fEI(*^SU%G9vb?J4V|h~3 z-*S&;pyhhaV9Q0Cp_bD$!!0{CqbzGQV=N0a<1CXk6D-3ulPtY8Q!VW@(=ClOGcDCL zvn{1Gb1nHa^DP-Qi!8rtlvuvhD6_n)QDJ#eqssEAMvdi8je5&<8jY5VG@31^YqVN+ zYqVQ7XmnYYX!KZSYV=vgX-u#T)|h1Jp)tkMR%4o_k;Y6*b&c7UG8%I&1vTbdvS}=| z{I0&(@{#&d%QNcBEw`($v|OaV+Ok)Dt!1V9ddn2`jg|rGn=NhBw_0kbZ?_at-)YI9 zzT5JR+Fr|>YWppZsvWf4q;}YHzS>dC9<}3^m1-v~)6`B|hNzvjbW%HKX`pt&QdaGf zCAZoY%b%*(ET601u)L~z%kqfo9m`Fs_beBxKCtXpeP~&y`q(m8^{Hiy>T^qP)t8pm zs;@1zRNq)islK!1QvG20OXZX0Yn3mSw^hDbo>uu`xku%f=b*l$TnpVe^w5`@F=~_)!(zmKtGO$WlGP3el zGO@ByGP6=tvasS(va zx+Yg?wNtLjYK~luRlQuDRkB>YmAhP{m5yAKm5^ME)pyx8tGlx8R)=Lftyao*Sxu1b zu_}}8vx<}Lw{n%8Xr(JV$x2jqiq$`vsaDTrrdwT*nPIg{W|q|wnb}r-GIOmeWae2V z%Pg?+lUZnGC9~K{Rc48mpv*F>-_pyiu1K%2S|`2AszZ9URg&~tD_iMxRuaRT z!RnFtMXOEXm#kXEFI$C+U$N2_ziP!Ge$DEt*bS@IVmGZ?#BN!|iruy{7rSF6BzD*8 zt>}HL6QU2SmWV#IY7l*76({=G%0~35m9*$HtKTBet!|6Fu-YT?(rTW_YpVv4H&#g^ zZ>`)!-dSmiytm>N`Dpb-_>o`FsYfC|9Yf(WK>kk5~)@KCRtXB%KTek{uSSJf` zT001ES<4G>TmRach5G32P-@N$c-CQr2g9q^%e7$XZwN$XSQ*$Xo04C|GmzC|Y0SR^xI4n6Db9QxMH90t}w z9ER2^97fi!*^R9yu$x$$v71=mV>7kxWizvOU^BP=!D?Z>p4HMijn&dxp4H0w28*@z zBo-U%5Eff&Nfuk{`^S&+d+_%s)xNV_iaNR=M z;If5?!FdZ_gVPpl1}7{S431cQ)<0#XZ3ej9MIopu|CLcsqc`2+k=`_m>w42H&go6HIHEVzVwc_&iw$~HESBp{wwS9o*H zYy1{j^yx0PXwzL{QLDSuqEvUeMUL(Yixl0J7SXz^EP`~`Sa|8KwQ$s3XJM(k!NO2? zqlJdboN_3&^c&vL+6miMV%uS zCv}cl9Mm~(u~X-y#YUae7AtkmS}fE#XE9Ufg2hCgOBS6vS1cNJu31#-T(>CHxoMH9 zbK4?G=dMMR&V7p@ore})I*%=!b)H&S>pZtG(Rpd1qx0HARp+gRtj>E2QJs$#d^(>k z*mS;H{L}t!@m~9<#Y64i7MHaDS{&B?Z?RRI(Q=tKv*mPcR?ALpcFQVlPRkr^Zp&D0 zUQ2&%0ZRvMAxk4|5ldxlF-uWx2}?F@Da-F#GL|p38DVi~s5t{Lq z-kOP)_L|9-#+s>?>YC}6(wdo;{F>R8%$j+Y-!%#>UuzUu-q$FxysS}Xc|xPYa*sx} z}^`(|8)t6gNQD13UufEzcTYar%nEHB4 zC-se%dg_}krPQ}tva4^m{H(Ua^1j+G%QI?wEO)Byvs|Wjz;d$MAp$1J1O zPFQ-Vow77jJ8h|=cGgl@?Yt$U+C|Ivs+TSAs$R7`qk7$Pm+DQ+m8!Qbr>owzY*W2w zS*rTLGDY=~Ww7cKOJ~(*mPV@2EtOPXS_-MYwq#O$Yxzm#z2zg7kCvBJK3g79`D(dE z<-6rlm7kW=RDN5wtNgXBRQYe2rNU?xqrzr5eq|A>rOIMfUCI(x1bjz})j>rYt2K&tR?`(7 zteO;^tnw6HtfCa%tlShmtc(=BtmG8Et+*6@t-dSxTRm0?w7Q@WWVKfz#A=m7nALQJ z2&-0wNULInXsbkpSSx>pcq==F1S=hdBr9o!6f16pRI4xY=~kEJGp#nsXIV{@&#@|$ z&$9}Y&$lv^FSHVrFS7b1S7LQpuFPtST)EYBxk{@lxhktTxf&}cxjHK~xq2%exkjr` zvQ1VuWLvEE$+lT7m2J1`mhH4ElI^mJlI^i_lV zbwqNf)e^~FR&A2ItuiF{Sb0nCwbGN^ZzU*s!0M~SL91I5hpqNY9I;v=an!0);+R#w z#Br-IiIY|~5~r+GBu-m#OPsNKE`HW(hxmD`PVoy?(c%}a^u;e(F^gZex+!+WYQ5N1 zt2VJ~R&ioCtjxu3S_zBYvU(?a+v=3)U907y_pDk(?^`8`KCrSAeP|^s`q=8P$P=r( zB2TUMi9EAfAoAR*N#vzfs>mxV50TeaIwEhZ1Vr9iy%K(BwMF=YRlV>>D<9!cR#L*B ztzHU!vDzv0)v8PAn^mmP4=Y2VpH^%_zpQQx{%e{k+1~y}TmU(Y&J8TD)S`|9Hf$FY!oNui%liZs3u!4(E}v zHsX=B=I4>KzRoRgJ&9YvI)GcznwMM2`V5z{bvKuawJ(>dwGfw@^$kvS>v^0S)~TGD z*1DWp*55d^tq*bNSod@2TE}weS?h4uwKe;Xzj~xX#I`N$a(>rv9&*&i8V8u zsr4RKGwU)|Giw7@bL&?u7S>ByEUgn+EUlGUtgN3iTU)PZwy`c_wy}0(wzU>xwzGc4 zWN&?d$-#OGlcRMylasX-le0B1lZ*9pMi=Y7jIP$x8QrZL8N)1h82DPQGjO$BYG7+Q z+rZRvl7X&er-7PfgMqwdxq+l*o`H~MngNexoB^9t@&@gypp=fZ=LdxKlg|NXj3m$_@7OV#6EdJ`Bw)mib+~TqR5sPd32Q5zO@3Yve zzuRJ?{!WV}`r9mK=x?#;)!%5*sK4H#RDZ2Smi}ssc>R?Y!TKvKJoJ}Y*y=B_Fw$Ra zp{~EsLPmdqg`oa?3wHf^7Ju~ST71%*WAQ?7w#8k&Sr(V|W?G!on_;nEZ-&KIz3CQf z^rl-Z(wk;6Q*W9@zuq*9R=sH!HF{Gmiu9&hWa>?|NYI;V5vDiQ!dGvag^S)a3v0b; z7Djs0EHw3|TPWyFw-DExZo#KF!-7?BhQ%M~S6C$IuC$2IU2Wm7 zyT-y@cddn;?m7!I-3=Ccx*IK2bvIea>Tas+*G z*STy_uXDwsT<4lazRnGcbe&rk@j7=bB6RLr1nAti@X&c^;i&W2!cym{g^|v43oV_O z7RoxWEu?kcT8QYpx8TwFXu+!U+2XhMSBp2=-!1NG|Fk%-{oCSz_Fs!l+W##UYcpC- z)n>MA(`L1-&}O&H(&n^`*5t|e*tLQC56 zmX@6587&3Ny;@3^>$OxY7iy_lPS(<}Y}L}TEZ5Sp%+%7ejMg%+^wTo3bkH)fG}bb= zRMoPyl+d!a*ZRw*KYw4gFZ)u{LXsMx@Y$>CeYAK+ZVacMIW%*Mh$MUU4 zp5;T00?Vr!MV6;DN-Xzjlv{4nsI*+JQEfR}qt>!tqu#PbqtUWbquDY~qt!A=qunxG zqs!7qqsP)wqtDV@V}hlQ#w1HcjVYF58q+L!G-g;bYRs~Ht3Jo_rusa~BkBt**Q+nG zoTa|RvQ2%NWuf{C%UJbQmY(WsEKSwdSt_b;u;f+WWcf>Ni{&%5ZI+kSc32)z+hw^% zZMWqtwY`?@YWpoq)DBuEsU5cTS37EHt9IN{TkWK!q}nM-&D_8K2g13d0F+6 z{t0=*`V^vvQXuZWwOdY%TN^tD|Zzp zD@zp?D{U1vD_Io|D*+WQD<%~lt5?c=R_B!kthOi%SFXl>Q6XlqriXm6FS=x7zJ=xk-L=xU{{=x!yU=wZd8=wS1-W9YjdCScljX{+ z%H+zeBIPQrY~`w~l;mox*yZZ1-pJNlU6O6I+9}&)wLrGTs$I6#Do?iEDonP+%1*Y+ zN=>%gichxJ>bp#z)dQIcRwrd9T5Xn@Y&BPAidBcqG^-++=~i(vGp#&jW?7la%&}6C znQO%>GvDg7^a86h(hIGYNiVi)lwM*LBfZSZTza{ci1Z4p4^peF&PuJeS|zo{szYk6 zRhra#D;KE^R?1Qvt(c@XSv{8AVs%(@tJPA;ZB}iP+pRJrcUpN%?y}O8+-)T!x!3BO z#6GKA68o+8OB}FTDsjlFTjH=)p~MlZaEYT>u(~65(Q32UC95v6%T`HZSFEhWu38C;UAKBCdc*3p=uN8?qPMKt zMDJK7i{7kwUz*@HJ1RJ z^;Ld$>uLNP){*?2)-wED)(`o(t(WofSm*NbTAT9mS^wwdw?4%yU_FCZ&^n!0$l8oo z*qWVJ#QG+WsP%dtG3z!SaqBo932Sp6NozqKY3n=OGS)M=WvxTG<*Y@x<*l!9DOgYC zQnU`^QnHrhQntR&sbam1Q`I_;Q_b3fQ{9@0Q^WcUho<#(4lV064sB~Q4jpSY4jt>Q z?7G(R?0VLm?E2PQ*bJ-_*$k}(*$l0Zvl>}9vKm|4vYJ@`U@^7c!eVA!z+z^t%VKW* zk=ep}8?%LVJ+q~?C$p8c1hcjEJ0=_J!%TM8vzhFz3z+P!U6~xLC72wo-!eK`A7gZ~ zp2O&3-NG1Yxy~TKa*2V5mZ1im zmOci|maYc>ENl&aSeP1ow$L+pZ=q)J%0k}YsfC2WLkmHJyB1sqH!YYAu3G%kzhv=N z|D44G{nHkg^^aQ|(?4RdQ~#jFTK)YN3-$L{Ox53M(W$@PqE>&aMUnm{i!}WW7Sa0a zECTe`Sh(n~wy@M+X`!dT+(KD@nT4eO5(_^4#TLx^i!6TVEwp&2H{ark-aLz&dh;yK z>&>+|syD}Cx87`vje4^!mg~*3n5Q?(Vv62Oi*CJ{7L9r{EGqP7Smf!=ut?RLVG*r2 z!y-s;hJ~lz3=0Rn85U-GGc0uVW>~1`&9so#n`t4WH`9VsZ&~`# zraQ;tuI?O*E4p(nPV3IIIIKI*VwdiGi;cPqELQ3+v{<0K$YO@>VvBz08ozqorQkJw zdAchsQgv5a#OkiH2-RI};iJ38!bNwjg|+T_3uE047TUTSEtGUOSxD(_u@KVTYQd?y z&4NjHhs7_Qofe;Tc3ZsC*<&Ql8wo#z&cIxj6GbzWNt>Abbz)_HHitn<<0hxTWSm)c(~Zfk$D zIHUc;Vz2fui}l)nEEZ`0vzVmKVA-P0WLc)oVwtYZW*Mo?Vd<^SZE35`YpJizZ>gv) zXep#EY{{Z6YWYn|-13E%q~$FwY0J}EvX*U| zrEM9brEBS@rElq=WoT)vWo)UcWo9X%Wnsy!Wo7wK)5h|nrk&+uO$W>CnogFdG+iwB zYPwl&(Dbletm$PrUDMaHOVi)7PBYN5P&3#vRWsBwQZwArS2NPmQ8U`oR5R96Q#0OD zRx{C3P&37nRWr@hzQD3aeUW8_`Vz|&^<|d+>MJa*)mK`otFN{cQD1Ax zpuXPnt=dM*n`)aakEw07+^n|Ua)H`T%RaSTmep!|EHl;iS%#?{uyj#7WND;!#8N@+ zm?fXu3ClmKrz~Hqp0>QDde-u!>Uql@suwMnt6sL8rh3(~RrR`MiRul@WYt@iL8^Bw zomB5x8mZp5R8)OvDX99`l2P@kqS#_m)dlK3Yyw`E1#) z^3}3Z<-28;%1_G}mEV?rDt|2kFX@>9~XvQW~tQdH8l;#ShP`l@JXbzjlg>ZGEn)n-L=t9gnRR-KAgRwaryR`H5< zR^EyZRu+m*Rw|0lR)UJIR{s>-tzIj5THRFewmPQZW3^eq&uXDUfK|UjkX5ZhuvNA~ zs8yswxRtv?q?MUMl$EMNjFpH&oE5V|ywx-LM609n$yQ6{Q>m}9*;=bD zvh`N8WE-uTWSgwAWLvC)WLvGQWZSKjWIL?5WxK4t$aGuXmFcxQCevrNL1u#0ESZT` zEi#j=@@1x2MafLHa+8^EWh67hN={~$6_?Cxt9R0KtxibKvsxrQ->O!6p;e^xA}bT= z#a4pSORe5YEwef;wcKi@)Jm&%sZ~~~Qmd_8q}Es|ORckFmRfK1NOFVKVabhFOC&d2 zwMlNV%8=Y@6f!m7wHKtFIEftZqr{vDz=O*J`Q6KC5nt{Z>U12dyF{4p})! z9JW%IIAX;wan$Oa_%W*k;wP*oil4Mf5kF;RE`HjINBoS{L$R|~+r`dX^@?4vN)@|k zWhZvYN?h!+)ko2*R%b-7S*;MgZq+7w!zxwumX)*UZ7XHbJ624hcdZ_Y+_O3?^1y0| z$V00(kw;b;B9E=SMV?sci#)Xw5qWO)S@?z3KH-;EUBa)d!i8U3sS3Zb`YiO$>afsz zt0_VstkQ)(T3HHxvf>r`Z1qs^i`5RnuU7qn->fnOe^@yP{i3k5%_QABfwy-E5K;YE5KxZm!H{s0Y8g%3O}p020y#?TRsl!Eqt8T)qGsm z&V1a~JbXOX*LZoY7xD607xMC3JMs!x3-JnCKj9Iw-p(Uz-NPedoysF>ZObEOEzTou z{fJw_dJeawbriRhwIsK+^$ji=>)Bkg*700&)=FIR*3UT=t=DlXS(kGvTRU>9SaWl# zT3_W*vtGoZW}VNWZf(b*Va?B>X?=)Y%Q~A~+ggHM$NDInj&%{6uC*eYp7mu`ed}&k z18Y}SLu)2hBkKb!M%HyK#@040Cf2{1O|1_yn_71;n^^}jn_J5fwjM0`$41z3Y8+chxG;p%)FtD<$H!!v= zGtjZjHBhxoF_5#2F_5qfF%Yu!G2pRuF<`T_F<`VbG5BqvYw*oN)!>tboWWZQaf25Y z0tQbkI1L_HFd5vj_^yA$;+6hYi@W+4EiUMvvpB4O+G3mjaf?;@M=j>+AF`OJzu%%& ze~(3#{w|9={T&ub`dcl+^*3Ai=x?-e)L(C5roYZYTYrs(g8nKCQT>$`T>8r`{_8EX z_^P+m;+5WFiwAm(EUxM;v^cG|z~Z3Z0*mc>^DWlu&9hjnH`ijO-du|bdUGt=^yXO9 z>dm$&)|+jSr8nCmQE#?IxZW%aKfPHNu6na9Z1iSX80pQj(A1l4p`bV0LR@dQ1)tt* z3s${37Jqf;SbWi)WAR#duEitWxfVBd=UH6Poo8`EcfQ4b-31ogbQf5x(_Lt>RCkfZ zT;0VMQ*;+w^yn_JXhvD%x56Sxccn#??kbBw-PIPJ(D8l?-Srj*x*IGsbT?Ya>u$0T z*WF^lue;TPU3Z(sKb;*G-*k3bywllj@myz*#eJQ<7T0z5Tb$Q9U~ydMki`L=!xlSq zj#_NcIc~91=Y+*Vol_PwbxvDM(m89w~)|zX(6EV+JaN(tp$_LdyB8y zA1$6~f3~=x{ng^6_BV^&+CMDTX#cX9r~SvGU;Cd$qc($Ou{M)ssy2&dxHg-mr#6SB zwKkWft~QUQyf&YuptgV|v$l}sS1l3C=UQTxH?<@zPisk8?$wg9T(2c(xll{Na)pCiZyXACEPs?siZ_7GOU&|s*f6Fw@K+7o2U`t=kP)kS6 za7#1IC`&EP7)v?LI7=bT1WPu}B+FkKDVFaw(kvfqWLVzN$g(`Ek!yKSBj0kHMxo_u zjbh9B8l{#~G|DYIH7YIZG^#C&G-@r=HR>&6G#V`fHJUBmG+HgKHQFr=H99TTG`cON zHF_-tHTo^tG$va9RG)15M188|dG+a*yVYk}E>oXvIZ1u4Wu5wb%PjSUmSO6PEuGYt zTI#7Ux0F&}Y00j>+VZp78p{W2>nzWzZLr*>w#jn2+7`$^`Yf2mB*H^RGwJgQh8>1TIGf1Zk1P- zYgFD?&Q*D5*{|}!vO(pOWs%Ak%Vd>rmZ2&?EZtRpSz4<6vD8-iXDO?~U?rf!WW}t) zV)a^?&FZ2uht+mvE~~l9JXX!hd{$Y?0#*UaLRRL=B35$BVpgom5>{`Oq^zzeNn7nv zlC@f*ByZKDq-a&Dq-+(Zq-y1^q;6%Pq-iCoq-Djdq+|6~QP1kSqJh;RMI);Y5y745BL6&=E)~o z)ypSaCCH~(Im)M5DamJ8vB+myJ(J6}Iw6;1wMs6}s#mVSsz9#LDp;=A%3Q9*N?NYW z>c4Ec)f3rDt5dR7RvTn%tftA~-V+iI;$kJSvBKC32~eyd!W304s@ldPO&CR^#tOtq4hnP$ZyGsEhY^h~QG(zC4Q zNzbvWl%8u9Dm~B2Pah3`t103~tK6tqesTS&51~w)!gk#Ok2%Gpjz~=T_0e zFRV0$Ut0YTdS!J&=(W{Mp*L1pLhr2Xgx*^T34O47F8I-EkKiY($%3D)vIW0bxd?u> zk`w%9^+Vvh)n$PnR_g?QT6GKjvdR|tW91|8*GgC5pB2Brf2&9Q4A#r|8LhMVnXC=@ znXSL`v0CrrW3z7KW4HF_KX&B>}~eUe4rx`V~Q+JnW=nv=!Q`ZTkV^<-va>sV$J zYYk>o>u*eE)@PW^t(P!aSXVPyS_d;(S!*&`TmNUYvA)h|YrT=t&bpT|)^e6XsO3Zh zAIo+FSIasBTgy@dQ_CC!J16;(!XJGR{x5{0sV^>oAu9GEZ0A6 zF-!l1MW6mrizfX;7G?SeEVA_XTEy$`wg}eWVd0^_&B9iHi-nQ?CJS}_jTSQc>n#NJ z*IKaYud(=}x60z9-b#ySdMhmM=qZ1G zEPC|jTQup-x2V*cXOXWr&mv84o<*$QT#I16xfWh}b1fY8=2}?j&9%_en`@z}H`hW& zZ?1)~-dqbVy}1^Qdh;xP>dv$HpgYgvx$b<6d%E*2uIbLVIIFwB;)w17i`}{lq4)JI zvRDW{yMKwr1l^?;9lA>`8g!Rgl)f@l*12zCtn0&1cD|EnxXsOUUx6mWbsIEiubeS`wCfw4^N8 zX-Qiy)RMKFtR-*Rs-sHJUbtfgzIrloHwsby%%qh)OQ zPt(-$qo%p#6HP12>zX!}r#0;?_h~vIYZOUvPaXyvR>26vRKo{GELLZ zGD-^0!8U@v-*TZwq2)ALJVLsz)rZsUEXDs(RdVi|R?s z#j2+*C#jybY*IaMS)_WwGD-E4WuWR6OGnjfmWHY~EEQF6SqiG&v1C-eXZcCxf#oBW zN0ygWo>(4Md1kpq<%Q)^m6w*&R9;)QtGuYg&Q)e&V@tJTWvRuh#uttynct>Tq=tz4D)t#p+ItwfZC zt$r(sT0K@0w>qsPX|-8N+G@6vj8%)0oK>!pf>o%Jl9j!Zij{_vnw5}}hShIHO{-^$ z+Ey17b**+Q>RT;UG_;ziXlzxZXkwMFXl50xXklfqXl13XXk#U=XluoyXm9mV!O`lT zg0s~b1sAJb3T{>_6g;e^DR^16D)?9xEBIO^D)?IkCDgAg(sQi1q~}^amzr;NRBD0MVyT5zO;U@k z5~Y?{IZ7?HQj}V5#U!=D>apZXt0R)Dt(Hozv1*rGYn3Uv-pWUEgO$GIMk`^-O;$f7 zwpiVf*lKl9Vw=@+iS1Us5<9GlC3aawN$j?Al-OgXDY4f|NMfJWSMmK;$HWg>%@jXm zl`VeQ%3l14m9Y3RtCwQOt@ewZu$n4%(kfT%l$ER487n!lvsT|l&skj(J#V#6^nz8l z=q0NR(aTn@qF1bxMXy>hi(a#ODssc>n8;156(YB+xFlNKgURcc)dTEs}^vcRf=(Uxo&>O4Qf^V%3 z3ck0RA^5>6U+|-qyWl4)MZwQje+0f*-4OU{wOQbs)dYd>R=EN{th@w%T4@XXvf>l? zZS|P{uhmNae^&YY|EDFwb)gyud=CGx3j5RTd}EIzh%|1UdXCx9mc9$%JZ))~x(*2c_6*8iD|tD(5u;yU0w7$z| zWxb2h%6bB0g5?B*aLaZBf6F=pcgs=(d&?XH3(I5!L(3=wEz2MS6-zGzSxYAaaZ4)$ zAxk3z9!o6)c1vXgMoSrkKNcbeKP-3+K3lLEytnwT|H|T{{xgdw`j0HG>)*3DrGMLE zul{w54ftw7U}wjEu!@gSOn_~+y)_m$^j2A%(_3kASZ{^JPQB$8>-Cmd zEY(|TF})_frY=`0t+|21s1k?3oK0Z z=38j#&9_k0n{OeZH{XI^Z@vYa-h7L{x(h76>MpQ&qr1T3vF-wkTe=G^F6l0`IH|kH z;(+cViygX)E!OKUwpgaS#A2TA5{s$2OQC1?FSDotpX0Z}B3pN*MY8THi)h`|7Qwn} zEWCBsS~%&hv#`=#Z(*dn!9oi@-oM#GNOy|`r|wn@M%`@|KXrCkeAL-#@lt1(#Y3Il z7B_YFT3poGXK_;JfW<+bgBH7V4q0r{IbyL&=cvVEo#Pg>bxv4J(K%(&qjTD#Rp+cl zt_L3rn557DhVvEwpqVS}5y0 zvXIt!Vj-gQ%z{_vg$1k5D~rF{uPxqbzqNRv{odlD_D74u+Mg}9YJaggnEf;7>TTarFwQSXrw=CCEw9M2}wv5qIwe-_cw{+Cfv^3Vz zwp7#7wUpG-v*gh-u>7xSWcf+c#PX@8ndJ>l3(M1*R+jrTZ7erw+F35ubg-PM>15fX z>0;TS>1J81>0z0!>17$M>0{}y>1XMz8DMFy8Dy!g8Dc4~8D=T08DYtx8EyGTBi8bx zM!e-yjYP{^8p)RDHBv1PYouH5(8#o0tC4NFNF&#Bx<wKbM~YU?a()HYaVsco{1P}^eZrnb$}L~VzqlG-jyLABkM|5f)|zEjP^dEDz`0Psob@^t#aS;w8}%vJt~ha*Qz|VoTu{KvR~z;WrNCV%OaJxmMJRl zEkjj4TDq%zwzN|DYN@00-BM2Fr=_6EZ%byCKbCKl|5;vAX0Y0!%w#oBnZ>GAnawIk znZqhrnaj#rna4^=na_$#S-|R(l91I+B@wGbN@7;4lq9SsD@j>ZD@j|WD9Kv+D#=@! zD=AtjC@EWUDXCh0QB=3Or>J3dQc=rlv!agGJViaLE=2>YQbj|nL`7pOUqw?ZOGR@l zRYglHK}9R8e+o8MuNCa9ZYVfd9aC_$+M?iWwMfC$YJ!5hRlS0TRi1*ERjh)KmA8VQ zm6d|Om6k%Fm83$j6^BBI)kpa-s|)fGRvY9attQAvTNTR3SOv+)S((TuSc%CeTK$kq zwz@5sYPC-;&1#`shE=Ovrd5Vqwv~@uj+LQYo|ULvzSS?;LaY0-MOH^-ORQGPmRe1a zEw?I@t+0xdt+H~Jt+vvYt+5i7t+VOq10fnHH<%GObnrVkfMW z#7Z!;TtK%Y9tyYR$x9SnO zVU;g((<)fxmX*24Z7XS!yH@{&?^&G^zHc>6_<>cD@Ixzo;YU{ggdSU+7kXl~Q0SRe zvCwlXH=!3+l0q-7-U+_4IwJVmYPR4Tt75^oRz8C7tW*WxTm2XKV0BC2qt$kSPgYX| zK3f$Ee6{iy_-3Ui@ZE}6;D^-%{-0LM`F~mE^Z&83;QwpI$p6pkG~a)#seBC934Dy! zI($slKX{p~kMgouPv&K{PUK~?HsocuX5{6tzQn_6y^M#;x|)aEI*^CQT7!qznt_MU zdIvYZbrH9KwH~*i^-C@x>t$TR))`zP);e6G)}J}Wtao#YTeosbSO;)QT1#_ES-;?r zw%*PmW8KanYaPxZXRXd5Z~cy4!FmF_g0%^|qV-)iCF^cBWovsj73;68s@AJn)vS|P z)vYC2HLP#2Xj;!;(Xx(V(Xv)#(YAidtYf{JS=YLdSKwQ*}(b+lcDu$CL`-s zCS&VZCKGFOCR1wxCNt}2jONw{8O^PyFeX{H8$?>x8U$LF7h zf7rrN|Dc7L{yqyW{XG`)`nxPd^>2I_6uea6Wi{567S9%*Q?(1!^xT?3_;*{Q6 zivxOVEVk;cwpgvV%3`73N{i`wD=d2TmRq#wEwiZ7TWV3Dx6~qCZ;3^$-V%!ty~P&Z zdW$Wb^cGoI>MgP`&|74ornksKR&SAoh~6R#ZoNeoOnQqfe(El=_^7+c;)U)ai~G8Z zEUxJ;wm7G|*y5<}VvD`HODwkNF0ojxyVPQ_?ox|cy2~sk=`OSA)Lm}TsJp_VLU)Bl z0rVWdc-_?&;kt-5e)hWSEX;M+Tj=XYTLb z)H!X@q;tliTIZZavCesm9G#06DLR)dVs)-qgz8+g@YA_&;ihxb!d~Z=g@w)?3j>{d z7MeQuEfjSgT1e?Uwh+>JV!^HR%z{Pdg~d%@O6^}3+1h_BVzvKS_-p^SaMWhBG}dOeRMlp+l+b3kST#OWa+1+ zV(F-*W@)0OVX3C2WhtqpW67hXXZc@K-|~~Dq2*IeW6K+wrk1BQ%`Nw9T3T+>w6&g)6+6Q)7#QT)7R2M)8A4@Gtg2&GuTo@Gt`n( zGu-m8Mx^B@jcChf8nKqQHR3HVXe3%5)kwD7rIBj6P9xoNu|}rl42^8dK8;+ssAawCamzf_la_I+r!DUGOcDmN`3sob`_ta8Wlh{`?7ttt;Jm#I9moUZc3vP0#W zWtGYc%WRcbma!^tEd5p9SvsnGuryZrWT~q1#Zp4$nIkfOTPT18E(8H(Cg&5F8K`HFg0 zQHlmuZi+@$#)>9Z@``3wJc{O4KNKvjo+?;dT~e^II-p=@wNAmoYL0@FRhNRZRi%Qf zRfdAQRk(tum79W>m6?K%m8ycDm8gQh6^lZk)l2zctCR8}Rx9PhtUBc*tg_@It-R%< zt#svMtoY^QtUk#lSY4G%wAvw;Y&Bah#j0K|%_>DM!^%T0(@Iw^+e%0-$LhOmp4A=M ze5*sU1y;*ti>!KOi>*pzORb`1%dDJaE3C9+E3JfOtF3;^)L1={skJ&MQ*X6Hron2l zOp{fgOtV#`OsiFjOq*4JOuLnhOsAEGOqZ32Ot%%IOs~~#={~Ei(*0Kb(i5$+r6*ar zNl&&?mY!nRQmZz}WmcJzE3AAZS6UfJuCfx5Ty6D3VvW^ZiFHk6btvtl{S;>m;xB4V@!0Lq9A*=af zhpo!Qj#&AL9ko&yJ7&cocHHW==t-+>qNl7TiJrE~6Fp<)BYM_KTlBmYm*@qnmm(Lf zPKsQzS|xJXs#oNyRe{Jgs}PavR+b_+tYk%QS}}>-vN|t($7;6lU8@Y?dsb$`_pMlj zA6Q)xdT6yo=#f>K&|@nvp(j>yLQkze3qG?tA^6;Cp5P0sGQn3?{(`TqGzH&SF$=!6 zx+n0?YL~!!tLXwCtV#twS_KPyvN96*Y$YV{)#?fVH>+j*->q`_e^{CG|FmM_|7CTC z?~m0CzQ0zzri-p@m)-LRF*00&*t*5dnSi7(( zTK{BKvfj+9WSzsRY^}07rk8CWMV8CqL28Ci=l8C$<&G_gL;XktB!F~zdhAjY!9AjC4;z{fJl zz{N7sz}7O*z|7Laz`)YMK-1E~K-tp3K-N;jK-^N%K*&Pmay&V?M^tM^t*4tun zQE#)walMTed-OI~Y|>kAu|jX1#XP;W7E|=rSaj*FwrJ2>Wl^TL(jr%Hg+;R7a*HUv zY%PidWmRZ>8EwwP!TWX=Lx70#OZ;6GZ-VzG|y(JdxdP^++=`OMOrn|)At?m+w zC%Q{4ZtE_wxU9Rx;*{=Ei-WpLEq3ZIwb-D$%wmP^GK=}T%PpqsF1P5@U18CtyTYPY zccn!s^z8l=-PO=@{MK0b!1we+*7)h@ZnRL=-DDxHyV*imcZ&tL?p6zC-E9`Xb+%i4 z(b-|~MrWtRW1U?Vw{><~T+!KUaYkpK#SxwT7JGCKSZvWbWU)r)u*FiHBNlUYj#*6A zId0LXbJC(s=afag&KZjeowF7NI_E4hbuL&W>0Gji(z$FAtaH`EN9US_i_Q%TTb-L0 zW;(Ym^mOi8sO#Lbkk@%&A))ioLQv(AFD(wsw_045_qBK|FKO{v9@P@C+^!{Lxk^jKa;}z`&(E|xKxu9g9s?v^f^o|cxH-j=$WzLtub z{+6PeftFmF!Iu9tLM=aQgj+t>h_t+;5p8)?R+P7Ts;FpnK~dRix1x&GGDS73 ziHaIlHHunR8HzeqA&RFmUpB2ok9w=B?omH^3+O1%1wL-zx zYMO$*RjY!7Rk4DTRg!{>Rgi+4m7{{Ym7#*Cm4bq|m4Jee6@!AG)kFCJtAp}^R*U3= zt(xUSty1K}tX$(}FORUso%dGfi%dLLMR9Zcf zsj@mPQ*E_Xrq*h{Or2GyOubd9OruqzOp}$bOpBGJOskcuOq-RUOo!DU=}xO_(p^>? zrF*P;qrTeU$r6*X)OHZ`=BQ?qDmedrhol;Y+rb|t;DwmpJ6)rW?%3Nx;m4wtB ztDll{t!_)sx7sVYz-ocyLaS!U#a8K(ORT&lms;sdF0&GrTw(P?Vx`qxiB(pIBvxCk zkXU2YC$Y||RARkVti%Q@7l}<)Iue_$L?pIY{TAP9byj@4)k5(dR;A)Qt-Qo{Tgi*> zvHB*q*XoSeKC8uI`>m?Q4q63^9kS99J8Z=&cEsv|=uxZPqQ|YKi=MD57CmVdAbQG5 zPxQ1Eujm=8w<71P&WfD3S|@VBs$b-yRiVfwt5A{4R+b`Ht>i?mS+R&*x4I&H!)k%> zO{-ktTUOS>x2?E@?^@jwx@WaY=)P5r&;u(!p@&vVLXWJz3qH0wEBM4}vEWmyYQbk# zL4wb%bOc{mu?xPmdL;15YM;Oxt62hXtttfGS%nL{w=xs>U?nE-(dsS#C#&`RpRJ1c zzgk)Ff3srZ|88}b?}ybazModzy2;)*T#T)=?bd*18-L){GpI)~nd1tb^F4 ztbemfTQ6agu?}F9wPs|Kv);ifZ(Yc$V6DrlX#J8!$$B}9vUL`VinTtAs`YnfHR}V+ z>eiji8rDI~n$~j6TGnrww5@kD=~#C$=~|~S=~+84>03)N8CZX1G_*d&XlOm3G0n2r zAkH$&Aj~q+z|S($z}+&yz`@ePz|zv*z{t|vK*v(wK+RI!K*3VMK+00WK*UnefZvkK zfXkA}fYtK5K7-{;{XZ6W^uJr2)BkL7Q2)Kf7X8;2%k`gI%+h~i(Wn2wqEY{@MXCNR zi%k9N7P0zQECTf}TDa<;v#`=XZK1D!(n4APxP^rN5er`ZLl#W>2P}T*?X!5Rx5wg< z-Y$z9dOI!7>TS0;thdc#r`{He^?I8vmgsG=n5DPDVuId!i#EM=7BzZnEsFHkSY+z0 zwuskTZ4suo%ECu)rG>NJN((E!6&411D=gIYmRrc_Ew>QWTW-Otx7>n7Z<)n!-DMV^ zbeCDY)LmxrKzEtNb=_qa=XIA^9MfHHu}^oo#a7+r7Hf5vTP)FCVKGN{g~epul@{H) zD=nIIS6Ni)uCgf9U2T!6yV@dAca24a?pmaC{MK7o=x%_o@l(*wGZuL|=Pc56&RfLmT(pSLxnvQjbH&0_ z=cfE)E)46XUrt`ppU+0kpht6XQ2A!uCpR}J_Jkfq( zaaH@3#c}O77CW`yTCCQ7Z!uTN@)LQBwcwwADEpO&a) zqn5a3iI${gx|XzMl$NZepO&1Zqn3iDiI$S3x|WKil$M$$ua<@-gO--%XH6Z;XPUZ} zH#PMw&uAK29?&$l+^lJ8xm?rSa+ap0WuKMZ}LH(0(XR*1)TdYqs!y~0r#8d#wc0Gpn`*NykEzYI+@dz$a*^6X%YL=RmbGe2Ewj~@ zSw^X?u=G${Wof3i#!^LXou#nadP_#Njg}u&H(TCU-D-JGb-U$W)g6{=Rd-p=QQc$N zqq@(sM)iPYw(23vXw@T@KB~toZB&n2>ZqQylvO=#$*X$S@}J6i%l9f5Egz~}w!EZr z)$*{)b;~U(H!YW`+_s#qa@Vp`<-TRL%0tT>mB*HGDo-r~RGwQpsl2o_QF(2trt;QO zQsuoRx5`J$zsjF2A1i;gJgNNMa=r2o%W2BLENhkjSf(idv-DPGurg9+vXW9}v0_qY zvwEe(VRc!F%W97jkJVBoUaLMOeya*4L90Y1VJmMXQ7cm=aVt3`2`f$|DXY(lGFJB# z<*ZI9Dp+k+RI-|{sBG1xsA^TFsBV>{sA=V=sAXlPsAHw3sAnatXkf*lXlV6T!Px4S zf~nOB1v9H{3Kmw26|Af#D%e;xDA-!%DcD=ZDmYsCC^%W!D7aW@E4W!nE4W*6D|lM{ zkoUH_A@5_gQ{K;NmVAI!wS1setbDMQy?m&ZqI{SYvwVcrGr35slXB5kYvp3BCdkEE zmCD6iMam^w*~ukYDa)l;amuAyy_Ze5x+m*gC)xsr3O8YJgirARKY@{n9;r7OAEN=R~v z)pv=dR(B+pSsjvCVYNbHrB$EADyve7HCC|_Ypq-))>-LFY_JlQ*l6`fe3R9A@y%9? z#J5_NiEp#=7T<2AD89q$yVx$P^J2TLmWl1Lsu$a96)v{l%0TRZ6_?mSt0$s|toDl@ zwwf(^)T%=Cm{q9gaVuld6IOzvC#^n+oU*zga>i7P)98 zFLKF>MdY&8HQ}pPi-oUQ6$)RsvKPK##V35z>YmUotMx*+tr~^yScM4PwNe+lXZ2g~ zzSTv+2UaTtA6eB4KDG)Md}3uF_|%G1@R`+9f#+5S1zuRq6L@J=E%4eZO5lx^rNCP& zNr87(U-;i!ZRh`BRmK0&%AWs|6$}4ot8;u`t!DFmv&!WAZe`B*!-|dXr`0vyUslU_ ze_NIF{;~4l{c9z~`_JkP&wr}}JPg)Tco?lSd6=y2d6=!mcv!3-aI;!Z;byb;K z;O4O2!NqA^!Np~5#l>a)my_H2ASaJ?2Pdy}04JZdG$+6H3l0J6Z5)Eu9UMZ|Q5?e7 zx*Q_bOdO)t8`#CHqu9l*+1MqlH?c`t$FoUU^RP)xs;&)-lX#)@sb^)?b)3tdB5hT2E%uv`%BvwsvCDv6f}h zwf@1VYkiJU&w43ihGmvPf@PvXgk^+5pryZor=`1rlcl|ZwWXPXsimHQo~62hhNZlL zlBKwTtfhc~xFv^ykR_u5ujN;L4$J5I%$7Ix|682V|7EdH|C_}|{ZAH4^xs*`(0^so zt^eGjUjMO0k^TdVH2u34QTn$m{PeF|IO$)pFxS6mp{;+;LP7tGg{b~13oiZR7XS5* zT71zvZ1Ga>pv8T?{T5gB_FA0M+heg`Z-^|o6q)Z1n;U2ls;uij>hCcRA- zm3kX3^7S@Yr0T7=h}K(Y5u~@)!b5MZg}vSy3p2gd7P@+?EtK_ESxD)vvJlc+Wx=Vp z(t<&6rNwvMl@{-GS6V#PU1@PgccsM@-IW%nbyr#((p_n>OLwKkM%|SbD|J^|EYMwL zF++Ei#RT0|7VWyLE$VewTa@drw#d_6W09u2)*@DStwpHrItyRjbr!C=>n&_`H&~eJ zZm`hRh3)CzY$2+<#e!FNs|Bm>HjBSH+bzCgjQ8)cIH$AM;+W1pi~TzLEw<|%uvo8i z&|zucU(Yas|s&mo8 zPv^3QyUrC02c2sc7CP5040Uc=XzARtP}aF)A+2-QLPY1j1+UIS3pSlc7XP%LSbWfa zYVlC}xy2>zmlj8~Us-I^eq*sh`<=xs?e`Wv+8-_Iv_D%EXn(Ot(*9-pmNT^k zEqkq#f#nuWBg^HQCYG}`%`E#gEi9WfEiKD5tu3=OZ7t(8?Ja{e z9WC87oh_|2T`l!A-7S?hJuSsGy)Ah(eJvR@{Vl(01X#Y(2(rAV5n_2+Bh2!IMug>F zjVQ}a8Znm3HR3GiXe3xp)JU>y(@3$b(MYo_)X1<**T}St(a5$8(#W-R*T}cD)hM(y z)+n~r)F`!-(-EqAKTwp^|@*K(@bJj-Ua z1(tYcoY)p>bOtBvyBR+Hp?tV-nltit32tSsaMt)%3Gt^Ue|SUr#nvpOsn zVYOT?(yCi7+A3cz#wtWE&dO3Q-b!9B(TYVb$?BDCiq%EgRIBZ>=~nY(Gpt%=Gp%xE zv#mm8bF6G+^Q=^4^R0Mf3#`7%6j|MsDYiN;Q)0D2rp#)#Ou1F7Oodf}OqEr%OtqDp zOpTS1Or4dSOuZGiOoP=Y=_ac)(#=-OrCY3;rQ59HrQ5Bnr8})8q`R!XNp)LYmg=?I zDAi{*L8{*>UuvRNfYc-_1F6YYf>KkhK1)usx+*!{YP;kNt67q>tZF4^TO~@)v2vB1 zYo#SQ--=&yfz?-ug;uvE7F!*ZSYow8VwqK+#B!@ri4|6{5-Y7-BvxDLO02OGl~`-_ zSA4zI1@R45i^Vrum5Xn(@)6%+r6j)9>ZjN?s|#Y=tyYNbv}zRFWfdj1+sZ_2j}@QT zKC73a`>l?M9KX(FerDn-s% zMT?xZvJ*LHr6h9Rie2P_)lK1xR!fC1SrrRkwsI1_VkIPe)#{PZHLJ}+*R5KGZdyeM z-LldVx^2ZMbjRwN;9aZLg7>VN1@Bu$3qG(i5qxOHC-}(fg}@W5!vasO76?4EsuOr_ z6)W(<%0}R&m5jhEt6%(YtoHK1wQAshXXVQO-in9+gVklek5+T|K3Qe*eYUdT`(nkx z_tokK?>DQJyx*;=d4E{>@&2+>;Qej&h3Aje37)@Jb9nw)74rPIa_3>Nmg8Zte#6aZ zy?~p^I*gmynva{s`ZyP>bpschwLKTRH8U57^>I#4>t0SS>kv*ZYk5v?>(?AS*1I@( ztvfjQtRp%2t#vsBtQk23tv9d>TgS1BSo5%pTJL5Pwa#J_x0YfPw?4xvVcozgX>H9a zW&Mjq#(EcvtaT-eoV68;yfrh6g7s-;MeAwIO4dot%GP?!D%L-lRIN`jsanrwQnSux zQnz+u(y&%w(zO1?sAYYDQQLYIW0qxtL6T*-L6oJxL9nHpfsdt~fvcsNft{tEfw`rc zfuW_GfwrZXfvP3HfxIQVfs`eKfvDwYeF4j-`rMY+_1P>>>N8sI(f@0)UjL`XBK@xx zQ}sVubm+gesL_9Ak+1*EB3b{jMY#Tb3vc~97WVo#Ell*UTWIKCv5?ijXd$S7-hxg4 zjKy!gQx+ffPFOtCJ7#fP?})`ky+anq^bT0;(c5RSNpG*ka=qOabMyFWt+Du{yT;aMo9sk_?Zg6?XI;*rvPMVx8`4i>11& zE#~U3wwR*3#-c}ejYW&@8jEV(wHC#?Yb~;M*IFd&uCs{JU1t%byWYY}cY}qa?gk4> z-HjH8x*IJtbvIck>Tb4>gzo9*(%ovoq`S@Hm(F&JPdYm+UL%e7U)I@UaYkpa#Sxu- z7JGE|TWrxeV6jH$pv6+1!xnROj#y09Icm|TbIhVm=eR|k&Pj`Mol_PCI;Sl%bk15N z>YTHP(m8Jtq;t{2Tj!F6i_R4bTb-*GW;)j_^mT4nXz1LuP}I3?A*pl6LP+PH1-H(9 z3l^P+7QeI~TfEVJVsTIVnZ*U|=N1RGUs`O|er2&#`;EnP?ROTP+V3r@wLec|(iU^0XGaTvTS{sv zTJmTqSu$v;Sbo-2vwWthVR=ha%kr$Iw&g)hUCS++`j#s+4J~JD8e8^jnp!q%npu`> zT3BXlT3N%}cx>`zTx?A#UdRj7SdRu*Bop^;`8tC3+D ztdVKysgZ4Ir;%%EqLFW@rBP_9piyiorcr9iqfutbq)}n{LA}cIj(Uyd3H3V5t?Kob z3)LGf`_!8)tJGU9)79H7gVj4M9n`xl_0)STrPX^aIn?_tzo|{Me5^Lv@}k;Q%l&H8 zEZ3^du$-+n%d%5#j%B&pJj+zI`IfMF}Os%tE7 ztFE&=rMlj7m+D5#m8zR9XR2{Q)uS*g0yGE;T8Wu)p}OHbAPmR70o5rO68Vij>;X& zc$IsWfhrFyomC!LnyNgp)KGb5DW&qll2_%GC4{%gsq{Lk{85`)z>B_^x=N-S0@l-R5$DsfmYm!g!_Qbif735v2-HHz|98H$QlA&SaY z4vH#Px{7L6Qi>W@?21}eUlg>h9xCWsombGe+N)q-wOYZ*YNmpTRl9Zm7s#76{CW))f0IatE2L6R?Fo*tUBdAt+M64t^DMDtPJG+ ztc2wQtiH(wTHTThw%RKfVzp2%%&JW;+$u{h(#l^h%F0A8#!5;q)`~$c-s+ibg4G$> zB&*G`$yT#uQ>~h0)2uRO)2#w!Gp#ITv#gY4bF8>zbFDth&qOsQ3#Oqo@rOof%JOr@29OqG?4OtlqcE2Pimso2gylRmn0`!ZIPU6 zHA8ZmRkh@Ft9Z#7R?d>MtTZHNTk%THwfZD6&+4Yce5(Tz3$2z*EVAm8SZq})vD7M7 zVwshz#BwWLiIrBO605BKiLbW0AilSec9Mv=S2AW%X8ckJSm$y;e&^_gOWH?zf5)Jz!-mdeBNr^sv=Wkt0?& zMUGnS6gg%!OXRp!jmQbBIFXZ9P9mqQ)I?5OafzIV11n*nD z6?kBELg1m*5`jln4FXTB;su^s*$F(ek`s7t^_TyJ)j|H3R&D&Rti1VOTM6>NvAW6k z)@l*oJF6VN_f{5sAFVj}K3U!5{cN?G_ls36?^mk;-fvbayx*;U^8Bzm%k$G}G0!in zN}k_V{ycxI)Oh|{{pJ2=wT}D0RU$WowInyA^<^$b>pm_fYcDQlYYr|J>$9A!)>Amy ztfM&Dt(7@Btlx2PTJPcDvhL>KwvOT8vDW3_wPxhtvtG~6Z=Jv{U@gQhXnllD$hwS8 z*jj^4#QHX?sC7T9n6(S5xHTiIg!Lg7N$X}7DQj02X=`>C8S4woveq-1<*d_~<*kjG z6|5PU6|K)PDOoRMQnoH)Qn7YnQnglKQnUWWsBV3kQNwyIV~%CGL5iiHL9C^lL8zsz zfuE(RfxD%yfrF*0ft97Kfw85ifvzQ=frcfUfs*BaeOb#7`r?+4^o1<1=<`}0*XOj{ zsn24$MxViQzWyJJN%}u5TJ^tJRO)}Q$kBgek)Z$5B1He0g@^tl3mg6W7KZwFEL8Px zT1e_&x8T#iV!^C`$>N9Jd5gDtXDuG-owm54chcgl-f@e=dPgmG=pD9Lr+3g|iQWN= zS$g{{Cg|<4Xw%zmQKPrZqDXItMTXvXi#WY)79o0DExh%%SUBo!wy@CKWTB_G$wF0c zqlJv#1`A=m4HjH_>n#}d)?570U1#xLcb&yE-E|iCbk|y3)m>|GMt7~n5#6;GyLH!E zY|>q8u}XKX#X{Y+7Bh9%T1?bkYtf;*&Z0qgokfN2I*WYW^%m*6>n-AS*IR_^Zm{sz z-C*ISyV1f29^))7@&prn}AJzs`1x?>ajy-s|kN zc%ie?;(^XCiyJz-EiUNnu{f!-*W#egK8u|?`zm0S{ z);VU;qI2A$M(2b@iOwmDT%FSvX*y>t;&jehgzKEQ2++A;;i+@c!b#_{g_X_~3lp7d z7CJiDEmU=GSjg$zvJls~Z6Tm@*Md{$o&}T61B>t44=rA3Keo7~{lwyo_A`rp+RrUE zXuq^rr2X1riuN0eHtly7725ADva~;1#AtuE@Ynug;i&!1!bJPKg_`zH3rX$Y7Tnr@ zEdFWzv-qgRVEIIg$?}>Ov*k%GR?9tF?3U}bI4l=waam5);<4<|;qiJ9{LDR^xS<~3ET+`GtThrV!UenStSkv0lL(|sMM$_KXK-0le zMbpVrQq#qfSJTasNz=pfyM~wLYYiXE2O7SXS2g@CPiX{N?$-#m+@cX`xl$wCa-K${ zmJie`EYGS}S?*M?wp^-SYdJ~1-m*@;(K1`T$udH{#nM&1&C*D{ z-BMn?(~?)c+wzxMujLE1KFe!r6D*IYO|smiHpOy*+BC~Pwds~MYBMdf)n;2ps?D|Z zP@8XQrnbORRc(=_h}sfMX0>IOpH!DyK2lw2c~Nz>Jzy!MddQMl^@!ycm1CAqRZdu5Q#oaMLgkF* zPL*?(t5q&o&Q-Z&*{^cNvQg!lWwFW)%T$$HmJupVu+?)g47) ztK*8IR+|*Xt>!68T6HQ)S(PfvSS2dTS@|g{SXn75TB$24TL~+wS}`c9S-n%xu)3|F zWpz?P$7;KRuGLZneXA)7hE`1qMplIiCRPawW>)?R=2mtJmR7n7R#vhKHded}c2+;- z?X7OfJ6i3Qcea`2|&d=(yoWIp}xj?JgazR!N zav@f!a-mjUa^Y6`auHUda#2>lWuvVg%Enrqkd3oiFPmUBO*YZ0PBz&pO*X~KPd3%c zOg7z0UN*yuLpICmqfEBdEtwpvBQkkbYi07SrppvqHOdrP<;WCUh0By!Im?t<>C2Q^ zNy}7NvCC9iy^yZ9IwW0VHCMXUs#3b%Donb;%2>M5NYY@J)fuT)t5s6%R$WpZ zR+&`2&r&*~<&amQ^ zoN4tzVwTl4i8)q#CFWW!k(h7QBeB4$L}H;;jKpFq7l|cSx)MvR#3Ytk{S#kdby0k! z)l%_QR+Zvwto+5-TB(Y!v-%^p-s-a0MyoYqo2**JHe1DsZMCu#+h!#qw%zK3=nkth zqC2fti0-y(72RW%EV|dqQFNb`yy$+be>mAtXxHo zTWN}%u;LRrY4uF_l+{Mz(^j>@XRN%1&ss?dpR;-;blz&W&_%00p-WbYLYJ*fg|1j} z3SG6jFL=#ro8Wb;Ucnnyse(7HYz1#yi3#4Z`XF%E>WsiWs}%zGty%>hSS1NOv~m=9 zWThbR*or~miPaJQXI35j&#nCVUs#FpzqGo?_sVJ+-)pM^zBg7jd~dBd_}*FF;C*kk zn)icM9q&i0Al^?_YP_GVe)D{>y1?_*YB|q0t2&B}@v|7+^fO4ebTx>#v^5B~G%*OU)G_e1R55V2lrgZe6frQf{w)gz{p%KA^{!aF(z|4FU+;p& z6}@v7r}R!+?AJSKu~qN5#cI7{77O%_SWMG9WYME{(4t9izeR=KK8rlPJr=2YyDg&i zc3A}K?X+;$+hJj+x81@-Z<~d--c}1my)70JdYdiy^)_3u>20$3tGmhKi|$5?*SZ@m z9_wzfxTU+n;-c;bi<7z=EDq?dx7e<`-eSG(dW&Vc>n-N#uD6(~yWXN#cfCcc?s|(F z-3=Bcx*IHVbT?R}=x(rx(cNefqPx+;TX&O%v+gDfYu(MzyLz`+D1-0q*=ixIyVZhQ zcbf&X?skjc;6442HGWTYc3Irj*==!EXOG2M9msh9K9uqPLlz5k4qMF7IbtzU=cq-e z&M}Kdo#Pf&IwvfObWU1i>zuYo);VJlqjT0GROg(9ug(PvH=Tm{DN8XeX-h6GS<8Q#@|K@86)m4>Dp}stRIxm(sb+al zQ^Rtrrk3SOO>N6Ln!1(~H1#c8Gz~2)G>t5CG)*iMG|enSG%YMWG_5RcHLWcTHEk_b zHSH~>G#xGZG@UJ(HC-)#Xt-Iv(eSW*sNrRKO~c3Xw1%JM0gV95tr|g=t2Kfx7iff9 zPSpsv?9zy|tk;OPEY*my%+iRnOwdTM4An@o^wvnRbks<-G}lPC)YZteRMN<{l+?(z zOwK#EBvkE^b*+@`w9a+&HH%W10XEL&AK zSeB}8vP@ImVi~5o&C*SEho!mdE=vv7-IkK7do8(C_gnr}IcWJt<*?;lm7|vDRE}F7 zP&sM2QRTGdVwJO&Q&rAewyRvUtW>#dnWJ*mGEU{XWuVGUOJ|kamS!qV+b| z)n!EitNn^XR;v|7tfnc7Sv4t&TjeQAT16{LTe&OBTA3)ySt%+iSn(<mIc`c^p#hE~xEMpj-5CRUaTW>%UC=2j94mR1}J zR#qS7ZLBWJ+gWXrx3`)i?`Tyf?_?Dz?_y;m?`EYS?{38+?`icy&dchIoR8H8IbW-( za{gA8asgIxazR!ua=})ba-mlIa$#0qWh1Qa$VOTnmW{SrB^zTkNjA=^N;cjqNjAaC zOE$^MST@;8S~k^+MK;aqolLsbb(u`7gECoGt7WpSrpe@5HOS;yWy|DSg~=3HIm#4S z>B94ZibuNM>XlT3)d{I4tL0M7 zR&7!(R%ueLR&G-5R_an6Rvc2DR<9(xtd=eR)59TSX~iYYqeHvy;Ymo2CD?IjaF7-o2*2|wpe`> z-D-7Cbeq*`(d||pqC2e8M0Z-bite^j5#3|OEV|d~k;p!)Ln8aF7Kt1f}NRv7~K ztlR|dTd4>^CsvaDPpuyDJ+oTF_uQ(C?}e2k-%Be#zE@Va zd0$(t=6z#T%lpnMi1)pf2JZ)}e>@+puJC-aTE+9(s*&f5RTR%xDQv;j+Nhf8LNPG9IK$U zIIEELMHXS}2`nPkVJxE7QY>QD_nF15moiIO7cfg$TQN&ob1_R<-(-@uUcn?|UCktG z?Z+f%Ezcxx{ew}#`YNNM^+v`*OBaJoOB;hkOA~`AOKpQ7OJxHeOKAgFOA!NmOCAFY zOBMqo%isFCmT&acE$`_oSzgeWwLGLRVYx+L*mAi(pXDrlF3VnhR?7x`M$2OTzZU8G zKP{s4zghU{f3k4We`jH)|Jp)J|AmFT{!fN#UsCUcancj7aJ9<|w zF6v#fIHq^OVvpWAi;a3`ESBq?vY4xP!eX-Caf?p9qZajghb>C=4q0UD9k58$+iwxB zx6i^)Z?A=m-fjyky$du>20?V)!S~tqqoh1S#PVwFWs#cA9c4_ywKfZ zabI_{#Wmf{7Uy&~Ssc~fWU)tglf@R@O%|(lH(D&#-DojOccaB5-HjGqx*IJTbvIg6 z>Ta|s)ZJu}sk_M{L3fiygzhGb0Nu?N9=e+?9CSBZSmK$m+@eC~ghheQNsCOKQx=Ijr!As%&RPWNoU`!OId9>jbHTz^=aPk~&SeWd zohugVI#(?ebgo-S>D;go*12WDqjTGWRp*YyAMJY<@3rq+Jk)+@aasG3#Zm3Y7TdL- zTCCK5W-&+mg+-tCON$2W*A_+EZ!A)^-&urfzqjzz{%B#X{mDX4`-_F5_BRV*?e7+B z+CMFRYW=c!qxHw)zScjBOIrUej%qPl?$BbkT&=}oIZunta-tT8WvdpaWrY^EWwsWt zWxN)jWssJDrJI(JrKOgLrLLB!rJ|O&rKpyqC8w6Ol9z+^yDaxl*mya)w&JWt-YW%Tl#TmdR>U zEQ8dhSvsoCuryGcX(_KZ+mc^xuH`?~`Ic{07g*j^U1WJib&2I3)n%4zR99HeQC(%( zqq@ejMs=NKj_L->7}brIzN(uoZB@5g>ZxwGlvmwpDWJOBl2LW9mXB2qT3%H- zYgvJ(Na|T zljUEfFP6`gzFD4A`eC_4>6hg~r9YP4N`Ea&l>S@BDKT1kDluCbE3sP1DY02`DsfnS zQRK3^ugGI{T9MaknT}5dtDMeW;c13xs zuL=rQj}(-wE-0v2?Nd;-TBD$DHA_L$szX7`s$4V>?e)k%3Pt5xzgR^9TpR=M)_R{rviR>ty9R$}rlR=?z2t?tXYTOE<} zuv#hSWz{F=V^u8YYZW2qZ)GPJV5K4#XvHNLZ1q7l#Ok_inAJYnaI2-VkygF3QC6k0 zF;=m%u~u%faaQ`W304xaiB^oVNmj3AQmn4Zq+0EhNwZohlVLSkCex};Cd(>QCdVp7 zCfCYACeKP+roc*ErqGH-rpW4%bcxj-=~Aod(q&df(&biu(v? zNYz;_k*c?9mTI(0mTIzcmTIB}1a=^+^%1-F4m9Wq`s~3Xjt@aCEu$m@#$tqv)vXzJ66)Ppdt5$ynu36m>xNfys;D%Md zz)hGI0=KQS1nyXI3f#52%zw{n8vlK(DE|03Z>_HJyt7)z^WLhB=Yv%o&qphBo=;YS zJfE$ubAPew<^F2r!u`$a57&3Atz18>3b=k+>2v+E`oQ_yY9r?#s}jz?Ru-K9te80e zTb<)zu%5-iXr0c%WNpF0Y|X{NV!el*)jE@%&036|-TEjShjkSjr?nXym-Rg{e4YDnb4U#Rj4Pq>n4MHuY4g4&H4cslc z4IC|*4XiDH>YG}=($}}VqpxLoR$s;PfWExtCVeT(CHkV4)Aa={yYzW1YxOxS3-nnm zQ}h`uBlQ1Rc`evUsO=-{P^}9g7=! zw=B---LN>UchzEt-erq*dKWF0=$*HirFYh%U+=UaQ+JES2Hhc&oF^;+f8F=$`&P7Uy;LS{&EeXK_Ghzr_xn{T3T_4p^)N zkM|$4n5A>rVzSN=iyob$7A-o*ENXR*Ta@aYu*lOnX_2OL$|7Fpv_*u@8H)g&a~7UD z=Pev{E?8LUT(mIOxn!ZEbHzec=c)f{Zp?%llmG(W0 zyV?&d&TBukIH>)|VvF_@i)GqREoNvxx9HY>VNt97$|7I;wMCNlTZ<6wcNXs2?=38~ zKU!#Of3lF%{$e4h{mp_|`@6+At)CVzwSHOL(fVU?UhA*LA+7%w+q4)hS86d?&e3AA z?AKzmY}R78EYsq&%+%txjMd_?4AA1UbkP#9w9pc?)YcNVl-Clq6xI^6WY?0g{H-Zv z`Ce1n^0B6@<#kPY%QKpamIpMIEVpQ?Sgz1ivz();VL4G#)3Q}l+pRFaA)N?Gas^?lBQqQ+suU=?5SH0M> zOTEOhLcPo~RlUM8NWIe1LA}~iSH0F!O1;jKL%qTBt6G!gW3?8`i)yWw`_{9EotW@i>%ut(P8Ll?T(oJo$rK#FfOBJ>0mLh61ESc42S$3GH<&ve7$`wmfm1~w7DmN^pRc=}Gsob$-Qn_dOTKT@^MdgQ5pZo z(mzXkB?c=kB_=CTC1xuIC047~itJX`6gjO9DRNn@Q{=IlrO0R1rYK-ltSD%epeStR zt0-z^sVHuxt|(z8q9|p>s3>FgUP0FCj)J_^DFsEV9STZT%N10trYfjeH7lrF6)9+1 zB`RoH1t{oPIVk8^=_}}4$txII@hccv{g*efx-V~PbwJ+SYN5QPRkOU6RjRy=m502o zm6p7{6|cO5)kiret7~%3R=ed~trp0+S+&V|SmnrhSp~{@TUp5YSjoxxS+U6ZTfLSI zw7Mi4WVKT^#A<g zBwH<$NwJzJlWJ8XlWvtRlVKGklWAoqlWnCXlVc?&lWWB!lW%oTy1;6ObfMK`>0+yV z=@Kh%=~62V=`t%;=?beyQk7N*q^hhINYz-?OVwH>NYz<6O4VB_N;O(BOEpem8a-tD^1a@ zR-B^StX_$1w>mAd!)lGlPODy#T~-AmyRCvm_E?#U?6r~<*=O}zc)!&#;e%Eag%4T9 z3Lm!87CvJ2Tj;3OX`y3QbA*mtaE}ztHXk4t!4|Jvnm!mZ{;I+ z!Aec=q7|dyWvjaaSFCmlT(z1iaLuYn;JTH+zzr)sftyx*0=KO0^53?a$A8BviT|#Z z2LC;)cYOD)w(>o&s^fcT<;C~NN`mjP)id5FR$F@dakclHeBDV z{&0S`+RypJs)_Tbl{@DzD<00@R@XTGSS{xGYgNec&&q-0zm)(7gY_|XM(aFwCTkgX zX6rL-EY`Jbtkx!M?A9MxIjq;Sa$4uGa#?G#a$7%R;jv!K!fTzt!e_0-!f*YWS-^TT zv!Hb~vyinLvyinAv#|AjCK2oPOrq8eOk&m{Oybt+OcK_=7$vQ*GfG)+Wh}8YGRU>m zGDx*lGKjO3G6=U6G6=BbGVrowHgLB5u5WAkLf_o-mcEhYX?-2bz542w8}yYd7wOAd zPSuyNY}XgItk&nZ%+u$#Ow?zy4Ap10^wj@vVWa=s!a)DKg{uA+3rYQt7QFgzEtvFQ zS$x-fZt+_0sl@}mM;2H0?pvJFyK8Yk@0P_@y&D#*^{!bg(7R$WP4ALLkKP4~CcSeO z6?$hZ^7Kwwr0AWrh|)W55vX^}!d>r(g{|IU3lqIV7Fv1-EEM(jTZrrJv*6R)Yr(3w z$KsFf9*fVqyDeVn?y`8OyVK%^?oNyIx;re6>F%)Dr@P%^tL}D-wYu9amgsJ?n4`PR zVzTZwi*DU*7R|cbEUI+3S`_JSwaC)lYLTS7%_35Fn?<1RHVaSPZ5EEY+bk?~w^Fl!jq_fN7mCkO9$2xl~ZtLu^xD4OZ zzt3W?&VGxnItMJ)>44VvAF`OQbI4+b&S8rQI!7!zb&gsz=^V4D(m8HXtaHL5Tj!)j ziq0vESe?@rp*m+Q{B+J*xa*v=u-Ca@VWD%;!cgaug_h1`3uT=v7BV_lEkt#$Tkz@J zuwd7@X~Cd#+v2nK9gAn$cP(yc-?uoe{lH?c_Ct#e+K(+3X+N=;s{PcWUHiF3mG%pZ z9PL*Y@!GE~0=3^-xM;t#Fw_2Ep{f1RLR$Ni1)ug83r6j)7N51gTRhkLX>m*Im&IAF zKNbhH{#tC-`fssJi@|c17L#SK7K>%07OQ267Q1DJ7KdfD7MG>J7LTQ~7O$n57QdyI zmY}7amXM{8mWU;rmYC%)O>xV2nv#}}G^H)CY06lh(v-8@uc=_USyRz+g{HFQ98Fcr z37YDbt(qE^m6}?XxtcnbNt$|=VVe4uUYdrM_L|0)#+oLU8k%O7GMW~af|^#AY?{`V zzcp+v-)q=gKGATrys6=2c}~N{^00=RTJ~!ASvG3~SXO8R zS>|bkSf*%%T1IJvTl#B6TDodPSz2qvSQ=`?S*mL!SjuW7S_*3<(7u(m6r1ARhB&JHI~2B z>MUQVHCSF#YqUI~)@->+t<`dYTDxVxT8Cw=T9;*xT90M4TCb(ITEC^0+C)oDwaJ!} zYEvvZ)TUYfP@Q4mK~}~Eh|))TV|@Rw2V|; zZRw@D*3w#ay`{G5MoSsh&6d2XTP^>oY`6TNvcvMB$}Y>xDtj!Cs_e7ergFe?g~}nz zSt>^?dsL2D)~lSbEL1sVnXGcgGEC*1rH9G|OKX*jmU=3eEfrO+T8gS%x8zW{Y586G zw&gwLyOu|l?^~`_erP#G`H^L{@)OHs-$s*{Af)vO?*HWs=e_OCP1*mS#$SEftmiTkeyLRLnKB325DqE@_$;#R*EB&}X3NLgJ|kg+Elee{cDQ9POR?fj{lboZ~bUA0MS~(Z1 zWH~o0FFAKB136DCaXBxmf3iMSPi1|r&dB;(ZIKPInk^e>)hruql`R`$6(SpEWh)zQ zr6wC;B_JDR^-Ct&>WNH@)j63stDQ3OR*Pj4tomezM;)gQ5iR#(IpTdfsaV%09T)GASInU#&$aw~DMl~$icS6N*U zU2U~abd6Py=vu36(e+kdq8qHVL^oP-iEgrbEwb6_tjHFt^&(rXCW>scDi+yc6(+LN z%2H&Pm8{5aD@Kt$R%e9wT1^+;XO$wn-^x(lHXt%L-wSv}>yZnd2MhE+EIO)Gu=TUOurZd>i=yJOYCch@SA@4l5R-vg^xybrB* z@jkNZ;(crt&HKbkm-ngFf1YPnS9zXWt>t-P)xq=9Dw*e%l^xG(D@mR=Rxi2VS}o*$ zXBEl)-b$GJgVlMik5)ZgpRByNK3j2eeX%;p`PHhA^P5#L=XWbf&L36}IeuEL=J;h* z$?@CDljDz-B*$N?tL*=*YT5r=sj)LyUuI*pZee4xHfLkDe#gpUy_S{LI+vBrT8EXx z`V9+*^=cMQ>r56dYfTnz>vzmN);pMats9y7ti71|ttFTRte-LoT5n|%vTkJ(vJPbu zw$@@2vHr&>YJH1Q+m9L>(>rV-qIbxGTkoI+quv3FAG-T3-s|qOc&5A8;;!x+Y~9*WF=}ue;qMO?SIRobGmuFx~AI ze!4p>+;n$X*y--DFw@;(p{KjULQQw4g`DnA3o+fD7W}%qEZB8-S^U@8W$|5Sx5ay% z-4-u&_EfE&WqkYTbo%U^uhuU{6u4v!0IIex)VyE^4i#6JhEaquH zwwS2>#G+aInMIlQbBj#vmliSFuPpquUt2h8zqK&YerKVk{lP*~`=bSq_9u&fT3;+a zYJIhMqV?V4y4DYiQ(C_)_G$gL*r@f_Vu{v&iy2xBmfc!Rmi1c9mPJ~umT6jSmQh+9 zmcCkCmX2E7mZn;~mYQ08mNHrbmI7KrmMmJrmOnH_E#GL0TRzm3u)L}%WqDFl+H#+! ztmP(6dCO&*3YN1ql`Q);RV-UH)hsJD)h%;1H7%1gwJpOmbu7I#^(^f*4J=JGjVv`Z zjV)z0O)Z5q%`MqAEi8X)SXqA1u(5oqVP|?r=DVYTRqM4gnGK=R`pEFMe5m>{pvZEHR^emS?c+g5$c7OZtBIB zChDb@O6p~n0_qi(|J151->B7C-cqZzJfT)^xm~T%a;aLAU_&y z)rFRIs*5f2RF_)Dt1h<;P+e*1sJhzHNOg^+lIl835!DTrtg4$Vzo~4oe6F(1@}|lT z%Tp@5EcdAFv0SIJ&vJpv0n14$hb&uFj#!qf9J9<)Ic^!Fa?;XY<+P=v%2`VjmGhSB zDiON_*`fTvvOxKfWrXr$O9$nrmKw^> zEd`ZdTK-geZTU#)jpb>jca~d}K3L9G`efOr^x3jN>8oX=(sxT|r5~1hO1~^6mHt>V zEB&*4ulV2cmLj9oF-2ypO^U2m^Ay>vx)eFA$`!e+k`=kF0u*_z>=gN}v=s%cBou|L z*c3&qz9@)VJyH<2x}YFwwNF9HYOR8d)ocYht1bn3t4ak$s|*Dtt8fJsD|ZDoD>DUk zD>Vg8D=`HvD>elktGDvHR_EmPt=7vMSWT2SvMQE0whEOuwKA7Cvyzgxu=*!wY4u3X z+Ul5`jnyhSJF9*t|Ib>u;4N8(`%x8)Ri68*HU08)C&R8)o%YCfw@2Or+H*nJBBRGSOBGWMZwlW#X*L zWfH8CWD>3XWRk3`WKyiuWKyk!WzwwvOQ&1il+Lu;ES+W5E1hkXA)RaGBAsWYD4lQh zPpZJ`u2hlLZmD9cSyCldl~QF^ky7PWR#FvK(o$7ceZwGh)oFcU zvQm|pY{f4z)#{V@G^=Cc)2-%+&$KEQpJnAOKHExJe2&#`v3XWk#O7PA6#LQ{ElbOr9m6^-hpP9#6 znwi)74HK{RE+#(fZYF-~XeI$`JtjeGRwg0qyNtrtdl@S%6$}b3B@8kx1q_lbISryM z84W@#KkNHhKGFBEyr%DDd0gMda;LtTdvEY0;fEVcDnEamkXEQR&|T5#z9wD_a<&ElipXN#wLA1rR^y|p;6_sZgk z-gApxdQUCZ>pikqqW8dJmfl^933|6JTJ>&PRO?;0DAc=Zk*;^yB3AFBMTp*c3opHM z77lu6EX?&zTj=VYv{2DIVIie=+(Jh8BVp}WswzwTa(?Yes{*6HrCSf;zjVy^CPi>bQ1EqZi!TeRrzvZ&GBWl^HL%OYEM zmqoJfE{ka0ofg5mJ1x9*cUm~>?zFJh-DP2{yURjbcbA2-?k)>y-CY*Ky1Om7b$45^ z=}ylr*pz0UFW1lyv`|$2%XawfjVa_ymZc5IO&|Tu+}+m zVWM-vLRaUag__PK3wfQ(7UDWrEd+F~S#auHw_wt_Vev!zro}7mTNZb;?^vAIzH4zv z`<}&C?fVuhv>#f`(tc#otNqxbLHnsivGy~IRPE;$5!x>;ytQ9h*lEAEFwlN$p{)JR zLQMOE1*i5$i$7YQEZ%EjhZr+OEu*zXK5-}_Gv0wHft(dR%ohP=4z^0CTeO}hG}Y9 zdTVN1I%w)znrP}T?pWa+LEY-y_z zYH6YoZmFdaVX2@IWhtf+W67ftYssV$Z~0L@!SbGZlI3aj6w4jzsg_IC(=8{dXIM6< zXIbW|XIn<8=URHG=UbYo7h0;Q7g-9cmsm2Ymsx&LtFXMMR%v-wt=e+8TCL?OwK~fg zY7Lg{YE719YR#6ZYOR(bYVDTJY8{qFYF(B}YCV>MYJHZBY7;C!s!p_gs5;s5qUu!3 zgR0XlH>u9FT%*<^WNWsBuSm2H-XRCZWyQQ2j=Ol7y_43)i>-75PnYgG& z8LD#J(nIB>rIpHQOI?*SmI^B8EJaioTBvJvQFuvWxCQQ z%Rr?smNrV?EY+00TM8)swEV63+w!^MU&~91|19?@GFYurWU`v3$ZXZD$ZD0Z$Zi#* z$YJHF$Yo`w$YZ6V$ZI8}$Zz#uLD1^0f{@j11re)L3Sw3}6vVBTD@a;RRgki3QIN4J zR*dx-RQxwO`iVYK5$))dX2Dt4djKt3+8}D=%3;D`Q!ID_Pkm66s}C|ER<~tB zt&YirS#6Ywu$m(iY1J+hZB;B2V-+tGYvnByZ)Gl%V5K6HXeB6DzXZfDzP$`Dz%c3Dzo}2 zSz&csveIgwWR=w-$r`IR$y%!{$vP`P$p$N9$wn&)$tJ765-nDbC0eacO0-#Rkm#_Q zF41Y#Akk%&A<<(MAkk}OCDCW4EHS}~S7M^od+|wDN5rRC%@m(%l`lTc%1wN_mAv>& zs~=*stS*VowpuMV$ErhX_d@F0Q1y*8W3#~qjF0#5Hy4Y&1=u)e0(PdUyqRXwk zL|0g8iLSKb7F}iaMr4iEIgzzi8${MwO%YjdRW7o@Dq3WtmA%L&D`k-_RvaQ*t!@i% zvsxy+-KtP{hn21HPAhKVT~@b+c3Z6$+G|xSw9hI)Xup-R&;hHTf(Nb62_CXqDtOqc zPVk6TxZqJML&0NKJc1{zo(r6`IxKL?YJtFMt6G6GRxtu+t!xC&S;+{TxBAI{!D=`E zMXOr=OI8m2m#x_NuUMVsyJ|I!@0wKt-*qcpzMEFRcyC#q;Js}%o%fDa2Jc-fOWu1{ zyuA0V9`HP{+Q#$Hs+;GLRWi?GD?6SiR?<9Atv+!-vs%af+$xj%g_SDzORGm*udL>C zy|#+udSfNa_15Y>=R2!KobRpDI6qkFa(=Y>#_`GO0LN#mZjLWj;T&JB)HuFbeP;h| zHIw~^l>_@vt2b=FtY)$Ow(?^8WA%^quhk~je^wc+|E)Ax8LVHkFj}u;VX`h_VYW77 zVX^+n%xb-dna#S5ncX^+nZsIW5oC(hsn_qVHvSRNuvNyS|;}N_|Vq+4{zoefoNq z4f>jv#ri6iY5EG5k^0h>zWU;p4*EitCi;Aq8v0z8GWzV60{YCBtor{ge(L?Pc&GQ% z;<4UWi|cxyEY9e?w>YTx)?&NfD~mOH&n*_}J++vw_sF70?}0^=-aU&7z1tRfdN(an z^sZY(>0Px5(7R&cu6N18R_}s^vEF$LExofAih5@(#Pv>D@adhjVAVTe@mu$}#V6fk z7B6*=T0GD_VsTyfu*EsuLl#GM4_fTeJz%j}_khJ}-TfAeboW`z(%okh zM%}#@6}o#Y3Uv2aWa#d(NYLG55uv-sB0zVyg}d%<3wzz&7UsIUE%bGFTWIL+u~5+6 zVxc z)8d)-EsGo4w=GU<-?7-Meb-`x_I-=R+7B$IX+N~+)P7`9qy5ApU;C*=lJ+x;Q0*5M z?%FRcth8TQ=xV>QP|$vBA*}t*f=&B_#ZRq|7H_mZS=`t9VsTmPtHm*`?-o0?epsy0 z`em^|>$k;Zt-luSTK_Dnv=}V&v=}Xuw3sc!v{)=Xwb(3ewb(5UwKy$RwYV%LwRkLf zwRkNVwfHT+X$n}r(iF11rzvcCNmJDFn5MYpZcPcx^_o(aOEje|XKKn?_G-#oHfbtY zmTM|m=4h%|CTgl$hH0u>dTVN0+G}cAnrP}+YHI3P%4zCb3Tql#a%dV`{?#zC{G?%K z`CP-o@{We33 zt<>^@TDj$ZwMxr%YE_nV)oLtz)aop&)#@!X)fz1$)S4|l)LJaf)!Ho8)H*E1)VeI$ z)OswxsrFhvQ|-6BraIB`nCfK9ZK_i(m#a>DvD8ytW+|__!cstWl_itv8q3cr>nxwDY_PnpvdQv<%4W-5DqAhrsBE{Kr?S&> zg34~oW|h5`r7HU^GgJ;*MynjQ^i?@x>8Ntd(nRHirMk)~ODUBzmb@zGEE!bJTfR`f zXn8^TvgLN=tCsVXuUob&-?S`HzGWGqe8w4idC|7s+GNTx|NJ{hSg80Osi{B*;ZSma;zpx zbbn%H+x#E+oT*N0^NsCXl`Yblh>a5sws}*81teVAUS;dLXwz3kNVVfbktJT7rt;&VBSh)yqvl0^CZuLNDht&q5omNdkyR1Tl zc3Wu(?XmhRxYz2E;6AIBf(NV`1rJ(92_CXC5jvmAt@dD+YnHR)_h|S+((>xANk@V8zdW(dsJSC98RSm#xzIu2>oKUA1E5 zyJmHs_qx@5-WyhVyf>{JcyCz=^WL_4&U43V56@kzNj&$gGI;J=Iq*ENlHz%2^^yCL z)q3v7R=M0ythBkGS-s+VZncu@g;fUEODj#TS5~h$Ut6u=d}CF>`PRym^PSaSj`vn4 zI6hcS;rM8k!12jSm*cb5U-mCnOW40!`LTbq`oZ?yYAM?ft1z~oRvc`o6i<5d^E%xbsve=^c-eRTR8;f~*uPmnMJ-6u8 zdumay_sF7D?}0_O-aU&%y*n1+dbccm^=?==>s_<3(z{||pm*6qUGJiWtlk9+5xsL3 z+Fr{LnpR@m}|&#WUR#7I$@zTU^mSW^r2gsKp`OBNjV#4_j=|J#4XD_mIVW z-Gdg>bPrne=^n6X(>-8OtGnN#RCm8cuI@gIRNZ|RF}nLKLUi|8_~`DlaM9gsVWYd( z!bEqkg^uoC3l-hH7BaefEkt$qS@7!avtZTTXYo&GpT#$weHQO@_FFvD*>7=QXTQaD zodXsZbPiaY&^c&vKKee+@c(5ygv~>-hbM{N9T-% ztIk;qJDqbD<~rvs40JA7XzEW!L0qx;+xh7i&t77E$(W4vbdo2#o~z8SBvdh-z`>Y{jiv; z_0wXa)^Cdztv?nOTK_C^wEkNpXfaxbXfauOXt7vYYq47DYq49ZXmMCdXmMHcXmMLI zXz^Np(d4syp($W_S5wgPqNcFrQB4ucU7BK+>omnJ7i&sdPS=#S?9r65Y}AyqEYp;? z%+^%2Owd%e4AoSz^wLzbwAa+IG||+w)YR0rl+)C;6xP(U@wOp=YXE{g1!E%y@qh-5>vt_M@t7Vafn`MTEhh?0G zr)7wSx22bcucf_)pQV{bfTfN`prw*Vu%(1Xh$X*9m?f)5gynbjNXsYc(Uuq0V=VWn z$62mckGGtmo@m*oo@809o?@A(o@VK(R%Rjar3QERZYQERf)R%@}8R%^55QtPn% zrP^uvO10bamTIr%Y1Mwq-KrBU*QidmoTEC$vR8GQWu58_%Y4;Ymhq}{ECW>MSvsjM zuryX(WT~RM#8OOknI*gG3d^4=t1Mrutg*bKvexpP%6iKKDjO{~scg1fqO#R;y2^IT zPL-XO)hfFz^Hla&CaCPQ3|2W{>85hX(o*G!rH;xmO9hqVmclA0E!kC0TYgbKYk6Dw zyyao#3zn;uFIi4jzG7Lee9bah`G%#B@-0hK<=d8W%6Bcy(~Z&QN+`*`)N+GDqpPWth@iOGl-5mO4rwEX9;QSu!epwtS=b)$)eocgw?yKP=ZP z{<55{_{Xwc@vmjE;(yBoMMf)MMJ6k2MHVX!MK&ujMRqF|MNX?v3S3qX6nL!8EAUzE zRp7T;qabKCTS3^WOF_h{QbEirQ$gG+LP65XLqW>QLP5q#LqXO`LP6e&LqWmnqr8&U zWqD<*E%K^X)8y5xD&#e+qU1HLY~{7B6y$ZRSmgDrUdZWNosl!J+9+paHC4{os!Gn( zDnZW7%2m$XN=MGpN=VMi>Zh!=)dN{us}r(zRvTm;tY*qOS~bZ!S!K(*ScS^ETG`9G zTWQLASP9E|TK$#rwt6n(V|7W!&uXuXztswv0ISI|L00uL!B*KaAy(lsVOB0O;Z}w+ zkydgtQC8eC(N-U&W3A3g$62kAj<;%&POwUlPO`F*PPUSiPOZ8~st5af=trm+-v8orFW)&?q-O5~ShLwoeOskKg zv#idG&aqk}I@hXObe>g~=zJ?r(FInTqKmA!L>F7V7Fl9-R%EHw29ae}lSP(Wm5Z#f ziWXUAyZy6}QM*t4G4?t=0=~u&NQ>Xyqlm$x1?av(Ld4k ztJT~Ota7*?TIq5>vU!<#=nA#qrL{g5$jvJI4pBP3#}7qS-%Laj<{3+QRn5DuwNuVnKUVfEf2~+p{#l)2{%g&r`D(j0|it7toa_jS3 z{@3HN{G!KU`9hDy@~$4Eh-cySVy~h@DdJio^^zK=B>D{q#(7SD6u6NTySMR!oir!TVDZMKef_j%M*!3=2 z{L?*e@m2Sn#T(tT7LRpLTint;WpP3Gq{VUF6Bhe*k6UchJ!Y|1_n5^J-J=$BbdOj} z);(;|t$Wy_N%xRNmF^*nBHe=)nYsrp5_Jz+MCu-}2-H1b;i-GT!cq5tg{AI(3q#%g z7Mi;IEfjV4TS)5ew-D6bZ^5Oz--1bZzr`<|0~Vik4p_X_IbiWv=YYi>or4xvbPiga z)j4Q!ROgVzKAl4r+jI^?@9aBlu>g98??j!W7F{~Wz-#=fb&gw<=$x>~)j462hB4lM z#==?Wtc8uvISW&r^A>tK7cA6uE?Ow)T(XeVxojb%bH##N=c)yZ&NYi)+Se`KXy357 zr+w4ng7z(o!`inkwrbz8SfPE_VwUzji(c*f77f}DEsC`tS)^+}wusVxV&SX()WSjg zxrMRz3k!AamljgmuPk`A-&inczqR1mR4HKmU>#OmP%S|mSS2QmRwq# zmj5)lEkA4WSU%U}v%IazZ+Sse(DI0;kmXKIVav6eqLzy^#Vx04N?3MlN?A5&N?Vp{ z%35Y=%3H>3Dp-bSDp`7JDqGrVs#+Rrs#|JmYFNr?YFP?vYFlz>>RSHO(6{`oVPN?} z!^rZkhOy-(4O7b#8s?UJH7qPQX;@jV(6F|gt6^(7S;NkbM{O4pEK^UgOi@p=3{p?AbWl&V)KgEllu^&L`CKi} z@|s${oYBb(&?0>I}!~9hPY-yDTGB_E`F;?6b62*>7p2a?ny$<*=os%27)mmE)ESDkm*p zD4()CuYAUGoANo!dCC_o+mtU_<||*e3|GEt>7abwQd9Y+rLgiX%RfqYET1Xev%H}6 zz;c(;L(3&fk1hL@o?2EaJ-19&dSU6O^vcpg>5Zkb(pyVDrT3OU6+c=&Rs3XmLGg>_ z9>s5#D-^$5PEq`6*`WB#GDq=`Wu)RiOE<;;md1*VR*H(uR{V-AR(}=PtX?ayTisIN zv^t@{ZM9v2$7-1ZpVd?aeydgmL8}r4A**Bs5vyPYF)L>UaVuj5Nh@UqDJx+G87pQ5 zS*w@w@>Zwh6|C0CD_Zr*D_a%Ft5^lgt67=Jt6NFRYg+x4)3SOfr)_mqPSlC`y}mbJ4=k#(^0 zlXbMRkaf0FmUXe>m36cFA>(fKNXEnJtc;h{4jFH&#WKED{W5-5)iVB8=`w*@wk2ucRZbj!8#ZEtZb9s+W$nijj`9vXoA+5|d7}`XZHNbxA74 zYJ*g&Rlii4Ri0Fam7i3mm7Y|V6~9!D)kn!(t1FUuR@)>CtY%3TTGdJxStUxASh-1- zT4_s`SqVs1SbdkMw7M%%WpzZN#%i@ht<_|SI;$#)daGoKMk{ZLCMy$(W-D2V7Atm% zHmk?t?N&R)JFNP|JFU{hyRGcRd#uF7d#&D!^;w+|>$h4YHqoj^Y?4)&*kmhXu_;yp zVpFZ&iB7XRBRa!swdhQ%PSIIbnWD3;JVfVMX^PIX;u4*2^;%?s)mf2+R_jF;SxpjI zY*i+*)GA73nU%fBaw}Dl6;@m#tE?UiueRDCyvC|dc&(MM@H#6Q;q_K;gf?335!z(c zE40}vUTBMzq0m+<7NKocw*V3CRl|G9%8&Q5l_KvIt1moPtxoY=vs%D&-Kw1DhLs=BO)GVt zTUHD_x2?8v-?7T&zH6n&eb4F>*8{7qTo0`(xgJ^Bay_049x$n zE-*1#FJWS`u3%!e_F-bNR$^kc{>8{b-Y<*AdfzQ(=zX#1)B9-AtoPoc zQtypLzTPW~6usvbQF>1;0`(qSxa&Q%u+_V7VXSx8LQC(qg@WEq3vs<07JPcwELile zTKv|%Z1G9=lEq8i3lxRMq0S+Tn>vRqF6tbz zIHhyg;*ic^i`_bhEjH^Mu~?&X#A1og5sSGxM=hr5K+f<5?dfmOIc`y@bHbuf=Y&O; z&Pj`8ol_PuI;Si`bxvFO!N>d0T3G6wvoO**Z=tPo!9qpnqJ^x^B@1z#%N7DUS1dSn zu2?YXT($V7ea+&9_H~Qf+BYoDYTvZjuYJp6llEx0E< zt&bM_wLV#F()wbtOzW$~Os#Jgy;?sk8nu2}lxY33$k6&@5u^3jB0%fEg^L!0rG*xw zrH&S}rGgfVrHB@rC5INfXt&9 znwA`zT9$t`bSyt>=vuze(6_v+VQ6_-!^rZ4hKc1q4O7d_8s?TOH7qRWX;@iK(Xh7c z)UdUz*RZoJ)o`%P(r~m)&~Ua4({Q!)(QvbL((tgf(D1a>)9|)b(eSa9((tns)bO`t z*9frutsZ3gQa#x6ntG_^Vf8S}jp`AW^VB0Pd(@*XE7fBy)79fFL)8;3oz;^p4b_t^ z<<(Oy`P9=b|EOhHzE;b!yrq_Hc|tAMa=Ti-mLh5mmMm(GmY-FdEg!44T3%6Yw>+ZSX}LwU%W|n|kL5JgKFfC1 z36>SAlPoh;r&va*PP6n@ondLKI?GZ|b&jQi>O4z9)%ljpstYZ@sw}pAuCmnfrpj{5 z(<&=1_o}S6T(7d$a*@h9%PA@wEZbE!SyriRvCL7~W*M)t!!k%^r=_dPZc7W5y_VW4 z`z_^E4q6JS9I|9pIb!)q`IzM`+OEDpo@B zs#f3R)U9sGX;|%()3jPFr)||Cr(=~Tr)w1=r*CB?XJDluXK2MHXKeLW*2L`_e(5l)InohUmC}(` zVbal7CekrhLejBTAEe@~&PgR$t(8i&>XAye%8^R3@{vll(veEH;+4v*=nnJi&eLHt5u?SyOpJQhn0|cr`2n*E~}$r z-Bt_4dabI&`m935`mGGbCRp)`O|*I?I?3vU=oG8vqEoHfMW&trMANHA!TFRjJ5At0<90R`w!`tyDyoT5*XivwA4J+-kk>3afhI zl~#VjtE}XN*I2z5T5EMcXr0w0q4icNLL02ig*IAo3vIHxFSyxii{KWk9>J|vDT3Rq zYz22%NeJ$=`Yf=^>b$^it2F|9thxmDT4f6CxAGJ?V5KQ=(27gokkvK*!&bBSk66X? zAGK2FKW6ow@3_@Yz7tl>d?&5^_)b|#@}0JN#(TzU3-4L0X5MpFA-w0UGwy&~*F&rGoR6%gaXz++<$PkL!uizd4aYO9tsKv->N#Fm`EtCplI3`1b%*`6RUP{q zD^>QlR_EE?S~ak}voc_NZ}o`vgVik7k5)mfpRD*;KUJhvHYbcVfju^#PYG8pyhQvUduCjoR$am*eti{FG~=#Sh)<7VmYhT0GOeVsTgZvc(nMix#JKFIXJXJ#Vp7_ngHB z-Ln?Ub-l5P4|>VukJ~U7TpsTHM%D(N_3A~Wa}QcNY*`O5v_aFB3SpRg}3fe z3uoOU7S_5)ER1!JSZM1WwoukRY$2_C*g{zMum!j7VG9=B!xn#Z4qJTDIc)J(=di_7 zox>J)bq-rx(>ZK$PUnclah)R;`*n_3?9e%4u~Fx!#Y&x{7K?O_TFlZpW-(dkm_?7y zaqtRv~O9g)4px7K>LoxWbL~a zZQA!NDz)!hioviPO-+TyL& z8;gfpZ!NBBy|*}_^}%9~)<=sCTAwTyYkjepuJzTTTkD%ez19zlBCVemX$*#p}`CF6S^1UX9`=viLY(6>CPVQ9He!^m=rhKc1$ z4O7ec8s?T$G%PH;G^{KeG^{PlG;A%iHS8=CH5@F%H5@H{HJmM-HC!w$HQX%qHQX&# zH9Re4G`uW@G<+;MG<+@psry^LRu8bep&n>?R6W>ovwDc-LiI4qKJ^I88uduaEcIy1 z2=y3CH}yD6Q}qN(W%Wc$LG@%y2K5xncWP;tchxd1&!}Zu?pDjTT&0#{Ia4jqvO}%F zvO=xUGF`3MGF+|H(nGDx(n77mQbVoEQbMi9l0&V|@`q}@&bH)Gooo3^ zWxnMbm4%k~R2ExaP+4kuNM)JjR+SZ&%T-oc&Qe)p*`u<~vR-9_Ws%B8%T$%kmJupj zExlE?TiU7Yv@}%NWvQaF$5LEnpCz}-0n5M2hb*5eAGSQJeAIHQ@^Q<#$|o&bl}}mb zDW9 zyy7=YAH^S*mWn?u)f9hQiYWfEWK#TR`9a~o(7ED&uP^1Ihjg&jROt|_BI!^of9Y^5J?RK59_c8n*HY0|r=()7R!PNKbxOrsWlAMlc}gW& zX-OqpaZ9CIy^&0_IwzTKwLvn&YKml*RfS}>Rg7egm7`>ym6~L}6}M!8)kld!s~Zx< zR{JDMtd>cXTJ=ekTa`&vSj99LTCqsfS=|+{x7sA$VAU?(WECgg zY-J|iV#O!kYV}O4&FY|7yVV@APOEaUE~{X%ZYzDU9xEQPUaJ?P{Z_|BCs-{NooLk} zI>{ufqSLKjip;P&Ei%(;oycsfNg{KsN=4>cMTyL_vKLukr6RJ> zic4gX)g$4>RvUzuSk(zHv+@&OZY3|g!s?^YN~^;{tE{F8t+vV(T4QA^wAM;cXuZ`l z!3|cs1vgqv6x?K$A-LJfNpOpmjNn$Q?*iMbE(`3i+90sgs#jo_Rj$BpD<6S9R=NUv zt@s4?S>5N~Z?%~Jpj8I{AuB!p!&cw;j#wSwJ8IR%cg!k`@3@sR-wCS^yeF;p@t(5k z;XQ2?%X`L3pZBa46Yn{z8$9Q&*701hYUR0T70YwU%ADu2l>pBbtE=2st-86dTRC&z zu=>k&(`q-@Evq`N+g7ezcdU51?pj^ryk|9!^S)IY=L0K!&WBb%I38IY;&^P;%kji2 zg5#-`8pkuM_w3KDCbPe=vS5E{^?>b_RWI9XD|@y#R-ahkS}kLJXO+PE-b#}7gVi;b zk5*GzK3Rpbe72Hh`C|2y`K#4x=C4*o%-^i6nZH}HGykx^0a=bAwodS5K!^*&mJ=)Je_(tBg!p!dqc zTz=citb5j?OZSXLqwZ;oO5M{Ig}SFKGIUQ`B^cg}v@^3v=CL7W%r!EHreFSt#fpwUE#~Y9XL|)Ph6zs0E|$QH!5C zM=d_;9JP3*bJXII&QXh7I!7%o>m0Q>qjS{ah|W=qy*fuNw(1Qg`f5#3rFq87AD$H zEY!81T1aa@v*6c$Zo#bm(&C%eD~nfJuPyFry|K8Y_15B;)_aScS|2RdYJId=sP)NW zs@4~aPOYyNHCo>+3bejkq-g!Lh|v0F;iL82!a?h=g^AWb3k|LR7BX6lmI7K#maJOL zmOnLFE#GOfSw7Nax4f>&X?a?c%kqFGkL4CkUdxr5e3tVx1uQ3P3R-q(3R~7{idYtD zidm*>id)8LN?HbLN?E#T%2--!%32y~%3G>wDp*QuDp?9@DqFH?s#^ZhP_z7`p<(%4 zL(}rEhPLHp4IRsq8hV!dH1sXEXc$_q(lD}|uVG?2Rm0S>Tf^M4QNzNrOvB1DN5k4O zNyFAMLc`9|Ps72|MZ?k3O2gUGP{YMiUBlHR#=Si{4TOT){OLBrefow~2(ZFN7( z6YBn!Th#+C7pn(ZPEZfAtXB`S%vBG!j8>1d^i+?wv`~++R8x<$6jhJ6WL8hK{G^s- z`9Lkj^1ND_)EUVRWEwk0~Eu+*5Expu=Ev?i_EVb3jETz>d zEP2$bEdQw1SiV)QwY;lZZ+TX=(Q=<^v*kL~R?GRSZI%;MJ1iSiyDSS;dn}Vw`z%9L zCs?|wPO>ytonon}I@MBIb-E?5>P*XjDzhy=s?4=~tTNy7s>(vk<0^|Rcd0C~T%)qg za=yw6%ZVzhEL&7oTb8S=waijkZyBqy(K0|~v!%1j7E3dgZI)UpJ1k{Yc3BFj?6zc4 z*=zYhdB5d#<%5>{l@D32P(ETgLHU?vh4Kl@MCFr~-pZ#fO_a}C$||3?WK+Ii`9bND zl8m&W-ETOj8Ob+>8kkE(pd4ErGnxQOFqS)mcJE# zTfS8IV|hd2pXD)y|CU=77_F8lFj-AjV6kdaV6!SxV7E$A;Is--;IeX3;IT4R;I&d# z;I|S{5U^rZ5VCqBFKl&AUc_pHyqMJ_d2y>!c}c4Xc_}Mvd1)(od08uFc{!`+atc;w ztXQeKcV8tPoX!S}m$?A+`iq$&FRI7=S zX;!6@=~j`FnO1g^Syn2N*;bsAxmNEb@~o~&0QDoIEQEXK#QDPM%QEKHX zQD&ttQDG$^QE9~_QDt>gyxMBLc#T!7c%4v~K7h5R^ zFR}V0wAAXT&@!tTLMyCtgjQNP3azpd6IyNcT5yfkLBX|FGX&RJbJmVtLp+=thNYjwVEif&8k3PyOqDdPAda}T~>kuyRDw_@3C6Vzt^gOf1i~Z|9-1~ zdNG3u4`6pT-U8UxNcYpaNV@J z$$8sqG3OntT+X{z7M%C2m^klSo#l97HIw6^RVv3LD9PCvb?uaX8B; zRm`8QoS45@@iBk3y3h2@Y9rHkt5&8TR&h)}txTAHS#dM{wtC3eVtG=()^eAAndKV& z0?WDjnU?+f$(D`!v6jX9;g)IoftHc_-j+W4ZkG1?j+RFHHkPXT=9ZHBMwYz#dX|j( znwDSnR4rfXDO%puleN60CuwM>eY>;1DR z(EDSNruWk#M(>+Nklq&y5512Tc6#qEO!VGbXz9JOP|$l}A+Gn#f=};>1&iJzi{H8r zEk5bqw|J?0*W$kJ9gAzaw=B-;-n2NPd);D>?lp_ex>qe$>0Yr|sC&s`hVDg+3Az_7 z+I7!c)ajnHDAPS>k*9msB31W{MXc^=i%{Lu7QVWtEL?O?S=i{Fv@p>72E&*8#2XKWBj$@4sLnt8>vpT<4O7fX-zLPMymZ zOgdLAerR8{c%^;K;;!~}i}TtyEDmYkwAiA3(_*>yEsI&&w=H_K?^x7p-?b>xzGso5 zecvKn`+z9R{)^7_V ztv?oOTK_DhwEkQ0X)#zbYcW}V*JQSQqse0VK$Fe#swTVTDNPQ`eVSaBn>D#DS7`EB z&e7zvoT$lf*`_IIS*8dGdX{9M`X`m@%sj4YwDXl4Q zDWIun$)>4f`CCK9@}q{T<#P>n%R3qxmX|cNEKg`?Tkg})wcMhiXSqtlz;c0xq2*K! zW6N$06U#;oQ_FG1et zJkP)oDySIe-hSIe@@Q_HrD zQ_HpVQ_HusQ!BL8Q!BERQ!BCLS1YspuUcXGLABEIp=!0|Mb%o%L#p+bn^hYvm#8*d zPEl>KY*lTuEK}{UOjqr)j8N^d^iu7!v{s#9sjE8CQeJhkrJ(9mOJ>#SmS0t7T0U2q zZFy5=j^!DZd6xTB7FcdnS!B6HWr^i9m8F)QD$6ZvR90H%tE{$6Qdw&msHCoDCTPgx2opRxR{bk6dr(s|4CN*676DqXf*taQb)PwARvrP2+{6s4P%0ZO+m zt(ERtsw>^I6jpj*`CsvonuSC(ChuPw_J-&&?9zPAii z{9tLP_{ma7@w26r;#W&{#c!5h6@FMgR`_XoN#VEU0fj%7>lOZ4&Qthr*{i^4RinUU zm7~C76{Emv<)grEWuw4hrK`YYC8xk`#izh)^XE#F)e(6?tL5@SR-N)9Ryp#b zR{rwhR>txYR^sxKR=?$>tscn9SRIvQ8GEZt83(H{87C`e8D}d)8CNSg88<6#8F#DC(wT|6eTmP*d;Tq-b!RyU6IJP z+AWc5wMZh*s!Jl@sz{>1DoUcz%2}e=N=Kr^N=%~Eib0~x>Y8}D)oSqyt0wU(t4Q%` zD?{-bD^BrRt4Ct>R(r%6tfq@KS`~^lS^0`JTWN~5TCt0@Sv?hPw>l!)VYOJa)2d0d z+bU7C$I3~x*GgHm&x%!ag4J`8iB_jXCRwc&nQS#tWQtX($TX`ck?B_UA~UR1L}prX ziOjNkBs|Azqwrj-2H|;D0mAdGl!O;peGyt@bxdfn)hwYUR{26ptz3kbSxE{lw|XzQ z((0JtDyw;dtF1}}*I4-puC-DZTxZ1~xZdivz(%X>0-LO+3T(D25!hlCB(T-WNMM_l zu)ub!*Ze!IHuCSZD(By2WyinUij9Ad)j7VsRx|kaTcz+FurlI1XvM&H$m$&LVXJw( zN38OBk6JnK9W+;rj;${Eh|pW+g8^&?pQ76xNB9w zanH(@<_JC*dJLjvp=?4$M(c3hV7{pAKNplBdpJ@YFJ-bnXtaJ`pELi zY8}gKt6Y{hR(dRNtUfWnwc5q}&Z>#|y_FC12P-k=k5-SFK3Q#J`eN11^wlbf>6?`$ z(|0QYrtely7~3p&=+|4W(yy?btzT%_tDkLIub*mJs2^{cq917)t{-gasqbfLqwis9 zpzmy{tZ!#2u5W3{rEhBaPtU;elb(*{Gd*?7+j`2D=k??*kLXET?$nd8T&E{uxmZuo za)utSWv?EWWs@GeWrZG#Wu6|RWwPEsi%7lS7XEraEnM}!Sy=0Ru`ty8XrZq6-a=OI zt%Zo*YYQ&DmllkA&n)x|CrF+NXpzdvpow~OyHt624 zSgw2BVxI0bi>bO-EqZmYShVO~vZ&U*Xi=7KOst#i`iv(5>N*E%OGp6Hyg zxTABz;;POGi?cc>ERN}%u-K<_!eYD535yLnCoERzoUmA^bJAj#&Pj_&Iwvi$Syxtv42%wcc4Q*LrU;TkC^Gzt%^K7OhVf6WO-kc#qzQytK|tzHp{)5 z9F`k3IW3oIa#_yS~DPrlbDQ4-SDQ;=0DQT&% zDP^gmDQzjGDQn5EDQC&5sbKj_L(%eshO*@|4He5f8fuo8G}JARYiL;R)zGrsqM>cM zN<-Ijfrg&tGz|mG9t}gwCJkfD3Jnv>JPlLJ6b*CBC=CnC01YckHw|k`8x0#vV+}h? zO$~cXc?}0kF%2h69t~$pW(`-%&+2ZL57gZ)&#HS`?pF7*T%qn`IZfTyvPIqBvPeC^ zGC@7a(oa3a(pEjxQd>RTQc69-l2bj(@`qZq<#V-I%WGgwOU@4?lWXYsfV)ElXLY+m@V4cP+mv-nV?D_`vd<;v>u5icc(8C_c5Es`%Wp zN%4hczTzv(7{%9?UW#um%@yBUsw#f46juCX$*B0*^1Z@W%exBSEYB$Xu-v8a({iQ4 zZ_619e=OS-{#uqR{I^U~V6X~PV6t*kV74+-V6{?LV6&1?;IQIU;I#T8&uw*Gp2upJ zJg?PUd48(~c>${wc_Axzd0{JUc@Zmqc`>Wca^hAulasRw zk(0NwmQ%1&lvA?ekW;pLFRNm8T~^I%zpT2|a#>BQ39?#Nm9pAaNwT_D-m-dDCbIfg za|3w zN=nAribKZ5>aDb^)k$f0t7Xz2R?X60RteJHR(8@pRYy#Okbk#2TzL#2T$w#hR=h zi#A&w6m79uAlhctAlhz~AlhN&DB5YIB-(AoEZSrBOr+Q9q)4CDT9FA>6GbLkm5NNV ziWHe_WiK+tN>yZ<6}QNAtH;7KtTqVGw5k`LWfdSi+e%4zuGJTzc~-}T=3C7cT3}Tm zw9v{;Xt9-y&=RZ9f=jJV2`;l*B)HtFN^qrBu;3~y9l_OBY=Ud79ty0r+9R;eYKFji zt8#%2R$&4gt;_^AS&0d3wtCOM#cC`6Hmhp>?N-kGJFIy4cUoQJ+hw(YZ?{zz-ySP- zzP(m#eEY1f@$R=;#(Ti3jQ60G2k#*(Y2G7N?|6<{9pX7=HG}84RRPZlD-WKNR!Tgl ztbTK!w%W{n#ww5dtd%DBIjbjJ=dBiUU9gJdx@aZGb;;@x=Vhx^oL8($Ij>ncabCCL z#BL&#ZQ{Jh!T3d0}P6^3v)L^DC=^%&)C_nBQ21GrzS`V18%yis`-8 zE~XDw{Y)RNQkgzk*)n~$5@Pyd^@6d(a)o}Q|0OGSNGOA&nsOAdW&%RhSNmLK$tET8DDjovOKG&YI#sk$#R>X zoaJggDa!?VVwO|&ge|-D1S}i$cq~ixI4!gF*enzDm@UKf7%YAC{#iKb{kE{s`(dG{ z_sv2@?~8?$-bV{Tz4sREdT%ZM>Atr3s{7L7jqY=cN4iffZt6a^xS;#U;<)Yui+#HH zEw<_2wOFfr$6|@@EsNQ@H!UXX-mvJ>y>8K{d(EO!_o_vK?iGs+-OCp7x|b}%buU`@ z>t3*M*FA4xr+ePQO!u6Hp6)pdHQlooa=K?M#C6YD@avwjVAnlu@n7e(#Sfj+79Vs@ zS-j9WW${qwl*LV*Qx=zWPFbANIc0HJ=aj{6ol_QDbWT~U)j4IcROgh%Je^Y(({)Z+ zOwc)H(W!IVqEY9xMU~EJi(;MA7CAa+EK=e3^`5l|&^c@2p>xi{QRf`=JRi__{{;&* zoeLK7Iu|V@z~lXwz~lWa;PL(|7VovMT0GLeW^qOPy2Wwr>lVATZ&<9=zG<;Q`aa>w`t3)<=s{txp!2TAwXq zwZ2*eX??SB)B0{mb*3CEH`MfTQ1e)u$-mIW!bOEZP}v9YgwtuXPKwTZ<(wqXc?g?Wa+0VZ0W2i zYH6Vy4Fk&x4MWR34I|4G4HL^K4O7cN4RcF(4GT+K z4NFU74Qop+4I4`Z4O>fb4SP#o4F^jW4M)qb>duyr)LkqusJmJ2Rd=^st?p?#Q{Bt5 zUERmBRNdDyS>4|8h4#X{wfOsj8N1DXNxd$);9d`AxOR^0{h> zf9F--O@hZzKgH%>nx~Z(Pv{YGbsjITqQbA?CrHIM~OAeJymOqrYSUynRW_eP1 zyX8jZot86|cUv|p@3G8M-e(!Ce8AF1`Jknm@?lE><)fCrl#W?GQ95CHPU)284yDtU zimWtW>&SnWA*b(qHL{rM1#kOEsnImO@H5EdMLsvV5(0$MS~aUCX12_boRm zKD3;#_{g$H@rh-n;#13X#pjkGiZ3jk6kk~yD89CoQ+#X5qxjD9m%<0jmkJ*(uPc1E zJf`r)a;w5O%f$-cEhj1bv}{uNWm%~3$1+jjuVtXZe@jON1}j4aMk_@HW-B2D7As~2 zHmjHN>{e&wIjz>qb6HK6=e8=7=e3HK=d-ex=eJUp7qnuR7qWUICv0_5PSk3foS4;Y zIdQ8-IZ3N@IVmeYIcX~sIaw=dIXNpPIR&d%vWixhWRVfddKnX|*)pb9?J{OoB{CLP2{M*e zzB1NU)-pC$8ZvfPVlwttEHVyO&!nBK4of>*Es%D#s+D%Lik5b_vXu6;l92YY`Yz>T zbzREWYP*!5)eNZst4gUrt0<`;D;ud0D>tH+WNR>veGtyW1!S@lXrTNO&i zT7^o+Sy@WPTggc#STRc`TD_D=wmL77Vzo^o)oPwZnpK-bx>cS;rd7B^mX(7yM#i>-9TORZSM%dGB-m0N8WtFW3RR%w+hR&C`e zR%4|mR%^u~R%i84wBG7~XrtA9(I%@p(PpbS(H1Lv(KahZ(RM3l(GIJpBAr$zM7ph3 zi}YCai}YHRi1b-Siu7CAiA=Oo5t(GgEi&2avG5eDO~O;H8il7>1qjcuQWBnN^;Kw= z)d`{5R&#{rS``Y-vvL!fZzU_V!0M~uLaVcai>;OlF0rZ;Txu0AxXj8>aJdz?;0mi} z0xPW!3aql4E3n$CN??sugups0OM&%Pk^&p7zVdIh+QGlcs-Azdl{^0yD*^tkR=4@K zSuNw+ZdJs$!^)0trxiEfZmZk8d#u**?zO7r-Dl;`yWdKQ_kh(mo`Y7Wcn(=D;5lqn z#&g8VkLReB2G21oW}f3#d$~_qm2sc4GUh&Q^?~b*)jF=TRykbfthBk#TfO1DV6}ns zqE!XwB`a6X%T_|1SF9d#T(#Q3am}iZ733u-~@QV83H^neDDs zJ=;AiZMOSXcUd1;O<{d#<;(iWij(!R)lrrwR;?^gtXx^1TCuS_vpUWE+-eH*3#$a? zmsZ-$udKc?y|y~Q^u}s3(_5q2FZLsb6hbtzT-HtDkR~ zpr2tGq@QHzsvm1AAYkCHjr}T6z z_v>j`Zq`$=T%o66Iag1{a+02;Wrv=qWv!l&Wsx4gWriNNWt<*|Ww0KrrKcXVrM(`5 zrK#Ru3vIpM7K(a5EF|>4S@7w7v0%~rXz^S3y~QWpw-zsTUt8SQeQ9w`_qoMc-Deg@ zbe~x4)_r8LS@)sED&6}Q3w7^V%+S4SF+umXMZ4}Ti+bIg7G=6OEOK?PTcqkYTNBt8>QUna&xDdpc(YTMm(m87pt#j5Q1bkobISV(P^A`3x z=PfLB&RZDjT(HnWTHi0GbIF1qX}teCc)b6r#a-=d78kUyTO8KDZm~`KhQ&(ln-+7l zZ&~zf-?C`ZzHL#eea9k0`>sW__B{(f?fVvv+7B#Dv>#ZgYd^G*(tc#Yr~TN1QTvI- zSFNWOFSVXo+|hb&aY5^a#SyKS7CW?FS*+1|ZLv`6t;JNWcNSe*?=9-IK3EiKeY8l| z`eYHU_1VH->#K!});9|at?w2(T0bllwSHQNYW=d{()wfZPxG(EXU%^W&o%#B+}32U zyr9Wwc|?=ha;GMX5fup=(*8p=X(=VPKi6VQ3kxVPqMoVPfg7 zVQOioVPMoY+)Lkv- zsJmNss(V!?IL)mt~ytZcBINy_N>b`z@uE4_LA&AF_O>bj0$8(oxGp zO2;kNDxI{Pp>)c!S?P>rp3+&%NTu_Zu1Xgz4U{ff$|zm2_}o%c@r9+h;wwv5#n+Z!6y91s zQg~;1QQ?E-0fmp2>lHp*&Qthe*{kr)vPR*%WsbrR%NT`UmOcumG8V6{ym(Q2+lvQ?`@idC*es#Tao znw7mox|OCxhLw;+menuuY^(F)IaW)=bFHex^Q;2J3#>H73$2*Mi>z*o6kWg;r65i>yoq z7h4GkF130su*~Y1z;dg_0xPWQ1y)+c3aqlS7Fca1EwIMwH~(6z{ru~!n)%mTdGT+s z65-!yb&qe8)hfO%R^@zKtz7uFSqbrNw|c<4!)gQXPOB!~T~?vIyR9^N_gMYq*=Kc; zXTQ~QoOJO`~pc@A0W@*K9};5lM-g8Qgd1NSj2EAHb~Ke^H0)vE8(qz;?^Zj_tP9Th=>P^I7j&MX=tp5@x+`b%Eu9RUgYks{ocqR)Q>#t*$XY zv6{>L)GD3%nUx9ib1O#X7glGOURcdwdTEu-^vcSK>9v(4(;KU|jNO(U`Yo1~`n8rh z`sJ2!`URE&`dOCF`YD!X`tg>U`jM70`XQDA`hJ$o`kt2G^;|4p>p587*R!^~tY>a{ zLeI!@kDi|8Mm;UdWqN9sv-OlLC+Nvpw(3b+R_Tdb7U+psrs@e=M(goe2I_HJy6JIP z+UT)b8tE}vYU(jq%Ip2L5Y_u_!L9ehf=Tb2#Sh&t7VmXGSv=EyZ*fQWt;J>CHx{RK zUs)W~ePOXf_nE~8-KQ4Ibst;I(|u$yRri5KukL+|7TtRmHM(~!igj;WWb59tNYcG& z5v6;>B2f3bg{ST{3rF3n7M8kKEDUuoTWIQDwouf)WFe`0(Lzx7q6Me!1q(*q3l=|h z&RcxaIdAbw=e)&ZopTnqbQJu3Edv(rQY|}Ywu}xqfQRfoM`hGT@D;5kou<`z@7B{u8LC5>ATWr$4VX;*Ero{~HTNd5g zw=C+kZ(9^<-?2#1zH1S#eb>TE`<{iZ_I(RO?FSYr+7B(nwI5k+F(ELLj0wwSB+#$uAzTZ=ZWcNW!J?=AARK3Jq^eYA+s z`efm&_1VHv>x+e%);9|+t?w4{T0bm=wSHP~X#KMIqxsw7qvjurr<(sPZfX9vIIqcI zd03Ota)&09El&p=sHup=DXFp>3I`p=+6G+eVQA^0VPt8i zVQgutVQQ(ZVP>hMVQwj*VQI;)VP(mtVQu+S-Ny2{x}D`!b$iQ0>W-Eh)SWEnsk>PA zsJmKLsk>WdsC!t3t9x0xs(V|SsQX$fsry+9s{30qs0UiUR|~Sdrxs#)RxQ+WuUfd} z8np<^IciasJ!;XGHEOYzIco8i(P{~nK59vpHfkxBI%=twGHU6TylR=2e^s+B->K$U z-dD}DJg-_{c|f(ua-(XomOoUwEnlnjSl(6Xvplad!SayGM9VEIlP#C4OtqY)GTpLQWrk&= z$}Gzgl{uE_D)TI(Rpwjzt1Ps1Qdw+irn1yhOJ$j*oXQGIA(d5@Y$~fQzbLP@yraC{ z@~H9#%XP||ET<`Nv8-3#YMH6L-7-jdr=_*>E=yJAJ(hgR`z(Jb?YDfSbkOpw(qYT( zN=GagDIK%yRXT22p>)zRMd`GqztR~?Yo&9R>PqJ=g_SN^{#U$Y`C9RcxNb65$=b6S0qjZ$76L+ zj?Zej9KThsoPbraoRC$NoUoOHoT!z$oR}5AoVe9DSxKvVvQk#ZWu>jw%gS2Kkd?D) zkd?Q}lvT6}mQ}K{l~uM1teoI?fU6;1D+A3{hHCfuusz}=2DnQ!NN?+Q^ zieK8<>YbFU)j26Qt94TDR{c_*Rs~XCRzXtURwh!uR^n2AR=*_ut?o$%SRIrMvRWn? zY}F+hVwEo$Y85OQZe<}EVI?OSX~iNLW%WuT+UkNttkpJ&IIFo5@m4Jo30650iB_Q! zNmlj}DOMU1sa8S~X;weQ)2+^lXIL!}&$6l#&$bE_&#}@F&$VI{&$GHEmT$FHtk9}o ztjH=$tk}v`ti(!5tkmkiXt~v0(F&_QqLo&&MXRlL>sLh zi8NUq6=}9wDbixqE7EFJB+_mbF4AFTE7EDDEYfAgCDLv6NVwN(qi~;9gK)o9pzs7M zW#LIyUxg-Hoe-L0HAiTwRgus%D-WR=R&qi!t-cA)vN|s~+iHd29IGb5xmGcP^R3JU z7gz}kF0^_lu*mAPz+$WA0!yq~1(sSR2`sa65Lj*{FR;SuKmSUr!~CnPI{8;y`SY)_ z660TI^?+}^)f&DHR#ki(tvvWPS&8#)wtCLH#cCVxR;za2?N*VzJFN70cUm#??y|bU zv)gJN&mOB5p1oEvJo~Inc=lWI@*J?bz>(zJ+pFVdTu4j^up>BV~=Hpeye4ce!XRk zeubre*Tz)w8tR zrDtNfPS3z{v7V0Q3_T6YUOg4dCOt*V3O!lNTs7}D?Kht z13h+2H9Zzf89gRTA-(?=oO*vP{_Fm-_^SKE;*IV%i^sZOEN<$4vbdo8!Q!~?JBxj~ zZ!EUyzOq=W`@&+0?sJRTx=$@8>prpQ(tTvnsQb{OQul#Hf$lwv4BfjH3A%SI!gX(3 z`0L)XaMQhMVW)e;!c6zNg`Vy;3pL%V7IL~*EyQ%MSn%mywqVn}Z1GR$lErtOOBU~S zE?PX-xoGh~=YquzoeLHhbuL(()H!c)Nawu8Zk_WMn|01xtkF4du|(&b#ax|p7SnXj zS@i3ivuM{jXVIW@&Z1K1yhV}Dd5dhF^A;&O=PhD&&Rc}(oVW1TxnSX;bHTz<=YoZ` z&P59oor_54_g}J*0H5arTHk-gf(1O@f7Rlh_En3A;PL)z7Kriw8x{++Z(2;&zGcy_ zeaoUs`?f`{_8p4^?K>7B+IKD7weMM2Y2UZd(|%x~sQth~MEjuyhxQ|j-&&6?-fKOv zc&zo*;+oboi&I+9E%s@>u-K&a(qfs`D~nlLuPyqt-dHqiy|pOUdS{WN_1+>;>w`t8 z)<+93txpzqTAwY9wZ2$rXnnPi(fVc~sP)5wP3xz{FU?;T?=^p0Jkk7PaYOU3#aYdN z7Kb$dTWr^4v|O#pWVt|-*>b8Ti)EK4n`ONwyJe{+hh>%~r)9h*w`Hg%kENF;ucf^v zpQWj$fTgykprwMQkfoTWh$XkCs3oJOnB{j3am%+Fl9rD(q%3c0NL!xQkhMIjA!oT; zL*8k2kHB2leHOwppG|Vm8H7qQDt6N&WRJXRgrfy?-MBUDEle)d-0(D2r zesw3yT6Gu8Y;{-5NOd<$4|NYqGj&f(RdsJm5p^F+W_3TyPip>_57h!JFQ^4s9#9Lm zT(1^tIbSWzvQI6-vQ911GEXhqGEObl(qApk(q1jWQeQ2}Qb8@*Qa~-$l0hxq@}p{| z%gd@cmPb_cEVrr_ST0j7vYf73Y}u(=YFVXPZkeN6X&I+lWf`DaW9g(?XKA9^ zV5zR!Xep`MY{{+KYWY{C-SWLkhvh?+F3T$_J(kB*`Yd;<^joe`nP@p*WwPZYl_{33 zD$^`0RAyLatIV>DSD9@YtTNZqO=Z5NmC6E3J(We4N-9e%#Z;DBa;Yr0{Hwgu@|p5# z%X7+WEVnDKvs|FO!Ln0%qh+!3X3H4mEtYP|+bs2!cUVd)@3drA-fj6-X|LsVrG1u% zlnz*~Q95WjUFoo8v(iz^Jf&lnkxC~lU6oE+8Y-Q(lvO%o$*FYC@~h$n%SVbAEzc`n zw%o0F#d4+MHOpy=*DYHVZ(0^9-m*+kykqI7c-PWK@xGEa+1P3%SMIwmW2u*EE5$zSq3V6wschZYH6hK%~DC> zyQQ$gPfHesUzV@re_NiB|7*EU{-5O}`Tv%s@{CrI@=R8C^2}CB@+?;D@@!Ub<=Cw* z$#Gikl;g6RFUMomCdX@)BgbbIEGJ-PB`0X5C?{;iDJNp}K~~i2hOD^NL0Ji_m9mmn zlVqi>s%2%YQe|bW{AA^=EMyg|lw=jHcx08VzRRdsJ(5wiIxC}YwNpmJYN?Et)kGO> zt6CWyt4tX^t1uaTD`y!)D+3uLD_I$1D;^nBt1r@KRu`o$tky|eTJ=apJk!>wLQL|9#rh_u=+5oI+`BHF4|BE~9L zBF-vQBHqeYBEd>sBGF1vBFXB9c#73I@l>lN;%Qb@;^|gF;u%(&;+a;A;@MWW#B!{* zh~--Ki{)8mi4|D6i4|HYi4|G>7cI8BD_UZ;TeQq-rf9iUm1u=kv}mQ3jcApXtZ0qZ zf00_NMV(h)t2sgwtqO%ETe%BOv62^>YV}QUn$>y1=~gQRXIM20&a#RX zoNZ+(ILAsc|ECNfdPVz6a>fv8* z70kcVN}7L_)f2weR_plISXJ|_wesRyXC=kA-s%-s*UTg zl^53$D?YBHR+l)BSxx6WZWYUU!b*knq}4l)Q&zh=&(=*)LhGW4mk>$#%txo9(LAKGthi1+3Ss)LE}vJ!H9IwSeWORT9fBD^-@; zR&<>8aIM#y-mo{dUVJ z{RT@P{VGd){Sr$f{X9!m{R~S9{Ul3n{aDNYdf}Fz^@1#)>G@jT((|x9ujgWUSkK;a zyPmb>8a*@1g?dJoQ}y&LyY;jz8}!sIOZAj3v-IRG6ZB*(L-iyrz4b&b9rc7P&Gq;# zb@g~GmGw9+CH2@X`Sn;V+4Pt!|LFd=_^kWa;-&5{iwC+tEUxQ*vpB2!#o~zWCyPD0 zA1pTOzOz`R`^I9S?rVz~x-Tsz=sve-*L`MDulvNJO!u)xp6(-yRNV&_vAXvyLUiw0 z_~_oXaM8VEVWWH7!dUl~g|_ZZ3uWCK7Sg)cErfNiTX5@MvtZV}YVk+ss>K(bD;95b zE?Yd+xomM)=aR)$ol6$ybS_yO*STo1U+1F54xNh@8+0yOtkk(+u}J5F#cZ7m7L#=@ zSoG*zuxQn}U{R-Y!J=H}f<=MO1&d6b3l>Q_7c8Q6E?9)s*1K=K~qm@%~#DW!kqbGPUnm#Ax5K2++Q3 z;jDen!d&~lg_ibx3pwov7J}LjEm*Z5S^Us?Z1G0xvBd+eCl*($$~x ztrr%HwO(3G*Lr2qqxIUNLFu{wWyYjRn7YI0lJY4TW_X!2QVYVupkYYJG3Y6@C% zX$o61Xo^^V(-5_MqakMbNJGN%hK8i&ISnbxBN{T6yEJ4iH)zONF4K^=oU5T|Iax!= zvQtCZvOz=DvP?tGGFL<0GFd~zGD<_sGEhU?(nCYX(q2Q)(o{p=Qb)tUQdz^$QcAZYi$rY00MUW%*Uj$MT7qujOSmKg+{v0hXK80xcJ*1zS#33$bie3$rX# zi?B>oi?j?>i?(!9i?uXTi?dW#ORyAHOR{89OSb%~nrit}HQn->YNq9J)hx>$syUXc zRP!uns}@-Hs1{n*sTN!2tCm_Os+L;@t5#ULsa9E9sMc6&sn%J_sMcHZt2SCPsy17G zQE9b&rqX74L#4y=v`UxdUX^ak4Jy5si&gq9r>RV^>{OX#S)($=vOs03WwOe2%W##M zmR>5eE$vk1SQ@F!vs6=AU@4`t(2`GOu_d$0Qp@+s%Pg-eudqCzyvlN=@@mV;%4;oa zl-FCPDQ~d!SKef4sl3@zS$V4^ukv=wA4)qcA1Up!JfpPRa=X%A%SB52Eqj#?SXL+< zvP@ArZ0WCb)Y4k%n5DYX2}@z6Qe;swjiiWe;xC|iag)f$T3STY%$$z(eApgVi zu>4QUW%9o)JLUga=E(oG43Ph4X)4cPB_+>j^WLhS)hRhvs||AOR@3A-tZL=B ztWxE;t$gHotc>OOtfb}mt(fEltX|0qSzVSDw%RQ#Vzoq8%&J#b+^S4g!YV;l%F0Vt z+R8*$#!60B&Wb};-s-cAqSZYaC99J%%2r!tRIL`us9E*OXjoOsXj-MoXjuiz=vX<( z=vwK@=vzt27+7)07+SrRHnut?ZDO@T+SIB|+T1Ed+QQ0N+R{o{+S-a)+Q#aMl&#ef zDSNA>QVv$_QjS&`QqERhQZ80HQm$6~QtnotB|WUJOL|)Emh`fkFX>~|D(P#LCFy77 zFX?Y(Dj8@cBN=4HBpGb=QX<6ayhNzgHiJo8Q zf)epo-^CNG&Wa~mEf!C*suEAJ3KUPZ(h^UzVir%gx+9ihwN)(3s$VSIDoZTK%1tcS zN?9z=ib1Tv>aJ*^)o#%ut68GOR+XY9R*|BmR@S2BR@cZmZ)$ zJyvss`m73t`mNlBCRoV|O|<$dILYd~;AE>6f>W)U1gBZW2~M}N6r5otCOFgTv%oB? z3j(vP)(On9>JgZ0l`Sye%1dB@m8QT#D^7t$R+sq~TTSI(Vim!^)Jl$jnbixvc zR#?^Yt+evyTV*B9x5nx&Uyz8tc@UFK?=G|ar&b!fyi+7XN1D?%R+j+KF_491C z%HY{%<-oJuN|I-X)pPD$R&%*`TZM4%u@dCoYjuHZpH)BCek*^j16Cqj2d!>#9sGofH>^H0-?ZAve9NkV`L>l8 z^BpS*=DSwUnC@C_V!CHl%XHt$i|K)tJkvv~UyS{h5&9jLUiwXzw)!=e2KuFz%KG`1 zV)|K@ocbx2fA!)mKj=kTKG6%YyrJiBc}CC6@_?S32n--k9H!K)+Z&>`)xo+`M=bFVUoog14bgo+5(z$AJS?7wyX`L$; zM|3V*?9sVwu~p}?#X6l!7Rz)lSs+$1)wyJ0rgOw|@*)<+9Htxpz8TAwY% zwZ2&JXnnO{)cR)eP4m0OYt0`P4>W&TT-E$#aZ2;I#eU5{7F#s`TCCLkZ!u4k!E&-D zqh*IClVzOWn-!gt~?0Hg!wOCF<6elhti38`W(s3)Jl`T zZPcADwbWfKCDq+5In>=PzpHszK3DUyyr$-Dc~s5Ea;uu3HI_oEwU(@^^_D+W z8ZBR`G+EwNX|X)7(q?%`rQLF?N~h%tm2S(~Dm|8cDt(rXDibVAR3=)ct4y|xR+(z) zuQJWjNo9tmnaV6nEtT1paw>Bzg;eHSva2kx{I0yn@`3Ua%ah7WEjKAIx16KA(y~=~ zm1Vy28p{afb(T)b>n(MaH(H7-Z?a@m-eUPiX`AIWrR|mnm3CULQQBoWU1^VHlhR(x zT&4Y%kxB(11^~BwD@j=?D;8N9tM@XpR<~s2t&YklSZ$P1w3;iUY}F~FVpS%iW|btPZsjkd zVPzwuWu+yfZ6z+FW5p_?XZ2iK-|Dcmfz?83BddC8W2-o66DwP3Gb>qXbF05nmR9$q ztgQA+Sz9fTvbAcGva?E&vbS=Va0)(R(#>kSq`TD|Ne`<=Nl&YE zNiQp3Ngpd?Nna~TNk1zFNq?*75&>4{C4#KBNd#NXlL)bDlL)oSlL)s8lZddgmx#2| zkchGpl!&(aE*@ibT0G8bk$AjSrFeo>pm?H{mUxmClX!~N9kEoaZDMIw6UEZ4vc)p2 z+{Lo2l*O{G7{zj|?uq7F?G??lnk`yjRV`X*6(w3^Wi484B_mp5^Y+%v)e(^j zs}&-ZR=pxsR)r$fR$(HwRyHDaR*E9^RvaP?R`-M(t=0-RTh$7;SosULS}6**S$z>| zw>mD=X*EZv%c@YQ+sa+2$4XA9*XpZapVe8xeyinz6RnyACt1Y`PPVcXoMI&=IMwR2 zz%;9i0@JNF2+XwV7no(0CotQ}S745nuE1O?UV(X5clhU9&F5cWmB_!)N{xS!)f>LW zR@?ZNST*r2v-0CxZY9mP!s-q0N~?XmtE?vSuC_|$U1Md%yVi=Icb(M}p7mBcc{W&0 z;@N1G&9m9cm1m2UJkM6E&)nOrR&Z~(is#;8CCRKfNBtLa?3ts=PgSV?j1wYtx_ z&uTg6eye=W16CHC2dx-64_Te&IBYe8B59LKGWu%EChWIt&o%YMr0 z6x(U5a<(&8Dr{%1F0-Dq>S8@_<;Z%$>Ich3t1T>-tcqAJTbZz2vHHn;)#@PgHLFhM z>sEoxH>_ltZ(6-#x@EPK>6TRs(`~CjraM+jOn0sRF;2Af(C@Oe)^E1d)33Eu)GxOb z(J!=Q*Uz^6rI%*;PA|dokzTarHN7y)Q+k1x`}BM)H|u#=F4uFmoTF!NIZ@BbvQ5v- zvRco`vOrJYGF4C8GFngFGC)to(oIjn(ne3#(nwFrQbSMNQch3AQbbSCl1q=zl0lE# z^1CjFY8u$6~+kFNb|w8)O}-7p!>=qL-(acg6?yRaNTDX{<=>s+;tyY*y}#BFw=c#p{M)6LQVI+ zg`Dm^3o+fh7JRyQEZB5!Tl~|xW${htmc@IWn-0E`L-+$HOkM=d_c|O zqD||iMU~boi+ruu7Rg#~EF!etTKH(avvAaUZ(*wS!9q*xqlJRjCks)n&lX%-Uo8G> zezo|l`OV^m=68#`nm;TqYyPx2q4~>VujX%yO`3l!mTUgCn4|g6Vxs1Mi*`*$%Nk84 z%R)_N%QQ_E%VSmV9)GaKhs#{t%t6NzXsoPj4sM}iltJ_)HsXJKesykZB zs5@D5tGihKQggL@spe*RQ_aKjgqo-24mEGfzEMrEysMgIc}_Lia=&V-T`$*{i(FvRrwEWuo#* zOK;`XmZr*UEESa3S#l|Fu>7jD(ei=PX3Nt`TP(LJZL?gcw8OGTX{Tj{(r(LSr9GDZ zO8YFWmG)bzD;=~HRyt(KpmfCYt>RJ3TZ+dmk1L+A+@g5Oa-rgB%YMbPmNkm!EVC3Z zSVkybv~*LvWND&!#Zp=Es-=+PbxTIY8c!g({0SYfH9TZ+#8Y;Z9R8n|jDXj3;l11U2l?S}P-GHB&~xs#QkOsz^r3Do#el%11`k%2Gzn zN?k_7N<>D}ib+Px>Y=ob)jnxmtJ%_eR+Z8QRuR&MR_4-1R^rkoR^O#et!_w}S?!dv zu$nDpX;mv_WtAXhW91}eYo#h>XT>39Z}mpf(dvSvlhqbUXRDc#E>?Atu2w0M?p9us z9##gDo>tFPdewS2Wvdj%bcmjcBe_jA)*fjcC4=tZ1Rte~}`qha$yRM@34kR*IBb z^@@~R6^T?>g^N^L*@#qGDT!2Daf;Mh-50L2S|?m@RVUnFV#0M z)f}NVt0JLxD-WR#D|w+#tM7tcR_6tKtdk87LNY_9EAaa=pBl(=?UJ>%SEwT5%I zRSD-FD|^npR-BystgdkEx0=s!z$%yHpp^~BAuE24!&ax*k64wlAGK0pKW24>?YLDl z+X*Wpwv$$mSWj6^W<71?&3eX)h4rk}K9+Mvm-Y6A0Rs|e;R zR*KA5t==Y#S4J%Ein^p`=lPoRuyDfF}TP@}F>n(-!D=k^|i!FcX zbY9>={Z_9>)BXV=vi3i>X}$3 z>ls=`=;>Pe>1kRz>#12<>M2?3>&aWH>d9D2>q%M)>WNvh>j_)_(-pA%qRVUfT9@1M zp)QBz4P7?N^SaEIM|Bx3_vrq&*sS}prv))_q{X zt$W{sS@)jBADz1vUv%zRywSOB@kHmg#a*3S7FTs{TAbCnX>m;FhQ&Ue8y4Gju3K!- zxo)vS=bFVroog1ebgo%U*12lYqjS}wMdzwTt=VHdTOy*>#4o?34$?6lrl7;C+^P}llkA*1!tLP+bA1-sT~ zi$9uQEIw*}wRooa)#A41H;W6J-z|=6{;=4s`O{*9=5LFontv>2Y5ujCp!v_DRr9|^ zl_rB_fhMD6swR_Vv?jA!eFEs=#?`sHJUeyq?Jgp&Yc~C>ta)*YPyTxW6Krlrk2yx%`98h%`HpREiIGOttr*^sG4ATNHxiFi)ymvQq@$; z>8k0L9jY0YRjOH*IjT99ajLnN0jl|yPO62LCaOi2YN{oc5~^jE+^Xf4|5Pe1KdMw) zK2fQ$yslDbc}k_ha<590o@;qXdA{WuDjv05t$5sWrs4_9HpNqx zC5opllN8Tb1}L7hv{O89sjGO=Qd;qnC70qA%byBYEng~Jv%H~j!}5f}P0Q^Hw=I_| z+_9XlaM!X!;l5>s!UM|;g-4c=3Xd(l6rNaGDLk{(R(NhHtMI~-PvMp2fBDyz59Qxj z9+7`*xkCQEWw-nX%Y6BdmcjC$EzRY>SjxzMvt*S2Zuv~^hvgZ$UzVHXep}9v`(s%z z_s=p-?!Tp<9HW(~9Fvu-9J3Xx9E;UkSvIR{vg}p|WI3!>%5qsvlI6Clk>#~YljXAt zkQK19k`=U4l@+q$mld)4EhB36Oh(-5qKt&qUKvTNl`_&+Q)OhVnq*|H@?_+#qGc4U zJY*EDOl6dJLs>XVeA z)g>uot1VI{R#T-+t;(g$t)iqXtZbz$trVrKtXQOMtX@dkTAh)!v)U+WZ#7lY(W+X~ z$tpq8*~(qg#Y$Jw%}PYl-Rh5oht*>VPpi`s-d39>e5~e3_*%6{_*vyj_*;cZ1X?*r z1X*cH1X~G9gjoF&54Acc9%i*zJi@9{JklyaJjzN#Jlcv;JjUv_Se(^1v3RSAVhL6` zVu@CsVo6qNVkuV4VyRXSMANMHiKbi470s}!70t4W70tG?6V0)b7tOU|6wR}GERt_^ zRHV>qrAU!gpGdJ)kw}SEgh;8Ctw_0*ib#bOmq?}6BjGBm4Z_t{^};n){=&6Zio*3) zUxXU0P6#zx%@Jy{DiUh8@(^mVk{4>V`YzaRbwRMhYNcSORkL81RjgpQm8D>hm6%|! z)fa(2t4jj?RvQH-T1^m`WK}3I*(y+Aij|STR4WmIX;!cKr(3P(pJ`RhKg-IJf40?s zzByLM_~u&m@y)Xe=bLY(!neTc6YoN+L%fTuCh;z|O5jg<<|S}R7LbymB%*ISivZ?Mwi-e~obYm?PduFY1-TwAQvxVBoo z;oN4miF3PECFc$+XU?5g{G7Y2ZgcFmTF$Y@s)S>&l{3daD`AfPR_ECdSXHwhw9;Zf zWObA6uvItP5i47^qgL-&k6A5XJ#H1kdcumA^`zAamQz+OET^qpS~OyJ~3UgI>>a%Y68<`t9Yg>Rt8L0t(ci6TWaa|TFUCTSqkVkSTgHZ zS$@+iv3#YMZ+TZQ)AFKTisezgc*|XSQI_lULM<2R1z1kk^S12KbGK~NbG9tgv$M?B zv$9OkGqViSGq&{B)3sSIF{( zF2Ch{U0%zpx?GlLbU7>!>#|zz)Md8Zpv!2vT=&1lJl#JQ({z7X^y>bwXwm&{QKS3S zqFDE{MYiroizM9-7E!wIEP{03T6pTdws6#aWnroN(!x;pxrL_gGYduCrxudBPb>s= zA6szhKC)oceQ5Dh=YhpXo%y9M-vIu}9~Y#TK2L z7Hf5GS}fDKVKGnVhQ)N98x|9Eu3L2KT(@Y_xo%OdbIqbe=bA;X&NYiPoog2HI@c^B zbgo$h>Rh$((z$BktaH`EM(3)9sm?VEeVuC-8amf36m_myNb6j)5Yf42!K-u4f?emj z1%u9Yi_hBEEuLv#x45Z&!{Utg4U7HSH!L=3-?V_N?}v={*K5PZ`)`BC`+c?VSU70k zwJ_1XYoVci&q7A~zJ-AHeG6vo2NplH9$LK7dT8-L>ygD3t;ZH8v>sdR(RyOBLF=i- z60K(zGqj#r^lCk~Xw-UPQL6RQB2(*?MV!_viy*Dn7VcVaENryiS{P`(vryG~Zy}}i z!Gd4wqXmoBM~k1DpDf;Keztg``NiU<=2wezn%^uAYks%bq4~pNo#s!A#hSk?W@`Sn z=+pdT(X9E`qEhp}MV=;uWr`-FWuzvPrN1V#rHdwurIjYDrM@PcrK%>orIaRzrGO@< zC7UL<$XI4;$XX_9$XP~c$XohrC|J5_C|cTTC|jCns90)is9Gv%s98#C zs9OqXXjpP+Xj%SK*S37Cu48#eUC;8gy1wNubwkUQ>PD6`)Qv6M)lDo*)y*tZ)Xgn} z)h#TY)U7NH)vYZR)NL&J)$J_*tJzz=S97qur{-vRPR-eJubPYHS~WMzxoYl~y=tD8 zwQAm$xoSR^v1)#nzH0uKc4~o^`f9I%V5=POIOugOAFO}OD)v`OBvN7OMcZ7 zOGedF%P%VBmd{lxEpMq*S)Ns?u{@|!XSqeC-g3E0qvdRsX3IX67Rx4;Hp^0#cFRna zPRkgTZp#3b9!qDHK1*|zeoJkYiI(yzlP!f+rdYD8Otbu(w&Ir7v3et=XLVLe-)fzdfz<>lBda1QW2;ap6DtcTQ!8mHb1McZ3#%uRmR2Vv zt*q8c+E`7Jw6&^`w6ltpw6}7WbhOfvbg~kZbhi2_;bQer!p-WWguB&72@k7T5}sDg z65duh5i68=`g5&>4f#e=LahzDCO6%Vnh77w)w6c4k~6pyfC6pysJ zB^G71RV>?}Ij#!+PhgiIonplDrvsj|lL(wFw1EMKb^F&jv>O|A5;zZM}>_juH z6ht$vm_)O!o`~dF9T&;9S|yTa)hCi~RV-3y6(Le&WhYW>r6N*d#Vt~5^;EdbYO`>K zRg-X~RgiF%m9lWP)mNb!tCK>tR&#~wtcrx{tvrPqtmK87tiB62TU`)rv05eAYSkjx zW)&~kZe=CdVI?NmY4t^*%j%LqkJUzjUaN@$eO846{Z>H&6Rb=GCR&LJOt$*SKgDVr z|5U4L{%KZD{L`&C_-9yM;G1bRgKw5qBHwH)ZN52HKX~U_9p{~AHJx|9RVMEOD;wU0 zR)V~XtX}XewmQJG)M_TrGOHq<NvMpxpQu{65`xub)RFq)f$c+R@EFktvoq)SxIv2 zwz|%~$EtySua!RgKC63d`>p!f4p=#}9klw+ddO-G>tU+|)+1KptVgXbu^hANV>xc+ z%W}espXH?0CFWCB)0t0OB{H9}(q=wu^_A(I)e)xiR#TWRSfw&uurg!1XvNMn)lyo& z&yr8S!;(?I$?}U{jpYlyGRxa~1(xUavMmqmrCDy*OR!v{7j3yfFWhpfUXW#{p08z{ zo~LE8o~vbso`Yqao{eR&o`t2So~fmso}s0Qp01^qo|dJ8o|>hYp0Xv6o`NNlo~-2$ zT`9}=y5g2kbww=i=n7h1*5$W6smo(|K$pvMyDq!sI$c)FrMk?Pb95OkC+q&R=+gaT z(WLv^qEh##MS<>jiwxbb774naEy8s_S@`RIuyEIXZ(*D+@KRh+*)46Wpu5;bOQRljamCkhwW1Z_3Iy%=a)O4;}$m?9UkkGkqA*6HN zf?Mah1&hvgi$B^oEZ%G1uy~|>!{Vy;4T}@nH!XH+-?Uh#ebZv0_AQGk(DnV*+PA^u z{Ylz)EJC&KSa^cR`|ny9Xy3C?(Y|LPp?%+iNBh17gZ2Z9FIo>QUT8hExTE#R;-c0g zi=$ePEp}=>u~@71)MAm=Q;TU@&n&vMo?FyuJ+~;y<@-)@utFt=ATo zT5l}$wBA}MX}z-$*LrWkqxHdpQR{=nH_eY0uQfkeJk^PfeM=6{O_O$JL}O-4&+O(siAO=e3y zO%_WPO;$@OO*Tt@O%6*|O-{?-8eEniHMlLGYw%d!)!?fQEqOHVr|` zH5x*ei#0?nXKILAPS6muY|{|8tksaPEY^^;%+ipuOw^FJjL?v^^w*HHbk&fzw9!zo zG}chG)Y4G0RMJqkl+;kM6wpw!WYzncs;QQ#s%e(tsu`A^s#%uS zs@ayhs=1a5s(F?|ss)y;szsLHRf;WNsgzpYRVlZ;pi*IZSf$ExyGpg?DwSHxc`Egm zlT;ckTUDAYD^*%7b5&X`6I9wQLsU8}Jyg0ZZB)7~^;LQ;l~wvJB~&I@@~BL*WKfxG z`AT`J91;$iK3Tm49vNDF4P% zUH+XVkNkVfk8&R@ugQI~+#~nda*^B@%TBp(mIZR(EyLx0SlY?`v{aM(ZOJe9$MU=E zU&{xw|1D3-GFWYrWwM$h%WTyu%W9P`%VrfN%WmZ&%W0)A%Vi}c%VWhV%WL&fhR^Db zjDXb%89}QpGQw61WkjrcWkjv2WW=q~WhAUZWF)N|Wu&e2Wn`>mWn`_mW#p|sNh?^L zmsYe|E3IVJEv;geDXnVdA+2VmF0En3F0E$P_a#lOj!2qYt&+5`>X)>%DwVXdik7soa+I{SQkS%|;*+$u`X=FM zbx*>{>X?MH)p`jRs~Hk*R*e$wR@o9BRv{9eR(29zR+Bg#R=>sltS*ZCTP+h0 zu&NagvI-Utw$c_4v0@SrwYn`9X0=r;!m3{^(kfdl%F075+DcU{#)?@i&g!9Pyww5G z1giz2iB|QZNmlWq$yWBFsaA@jX;w_4=~hogGOSLBWLm8j$+qej$+0RC$+e0U$+NN( z$+uD!DX`)ZDYAMlTx_*XxWuYWxYR04xXemjxZLW8P=(cLp-QXyLRD5JLN!)iLbXg%cJWWNYUH0}<-tGMN`QZg)lI&sR*U$iS>^Cew=(0KVa3EZ z)9M`WEUS6Ev#s)Z=U6%M&b1Qbop1G;XMxpWo`qJkc@|lf@+`LU=UHN<$+Ogog=d-7 zLGI;NHQXz#EV)-&edk(bwT)}FRVmjRD^squR^K?+S?%ClZ`H`T!OEL+qm?M^rTD*mqeyX4`EwnQf1iJKJ8XzpVSLwy^HE z%3?iWrNDa7>K4l(tLZFrb%!uh(h$Nw3-Rsa~z+O}%ofE)MsdL9-lFl8AZk^i}EjqU?YISZ| zl7>i(s9b7Ct&REL?SNSlH>@urSxTVPU9q!$M2vhJ~`u z4GUSF8x~?ZH!S#dZdh>Y+^}HMxnc1``=-Tf?VA?&v~OBm)V^tPMEj=2cI{ghtF&)f z%+LTX1OKxA>#=z~Y0} z1B<6x4=rwLJ+e5f^~mC&)?|DAoL9k*)dHB2n|7MVRJ) z3m;7eOD9c6OLI*oOI=N7OJz+KOG!;uOMXo@OBPLb%U>ECmLD`YEuU#{S>Dm$w!Eal zV|h}8*K)rGpXF8!e#C|D|LC|XKrC|L?N=J))O9U8)b%aP)eS7u)eSAf)Qv6O)J-f+)lDr`)XgkK)GaKT)h#VQ zt65n-QnR+aq-JY*NX^c2lbVC&A~i?LNovlP&1x=|#cFPr$!hMF!D^nCE^6MErfNQx zs%n0gVru@D>}r9QKU9M)U#f;!-c}8>Jfj+6xmPvPa=mJ_^imcLaBEZ?aVT0T@Mw!ETJVtHJp z%yO4Xh2>h6O3Q^R)s|CLYAicc>MUzi8Y~M`8ZA>)nk^$#S}c83+AJMZIxJ08IxRI+ zx-Df?dMpK0`Yc&h`Yk^xPqe(PJjwE?@)XN;%2O?8C{MR+Ql4prswnUoh^;gV&u z!ez@6g{zh+3fC+{6|P&lDcrC$SGZ-Vp>W$$O5u(rx57QkU-I`Y@5(>4JShLja;f}d z%P#q+mU;5eEQ94=SX#)xw3L;9Wyvi6#`2}yTg&ru?<}{a))ga4gl_kq;6(Y-GWhcvO zr76p9B`V8d#URUN^;(A8>beY%)nOSvtMxMcR&!(otU6_ctjc7Bt&(L#tO8`jtn6gO zt#o80tfXY5tT<$(t=>w@Se=rVvsx}KZ`CTTV3jPbXyq)eY^5ZvV#Oq_YV}A;&FZj} zhSd@&O{-QZEvpPEZ7XjnT`N5)Ju4w8eXDPh23EHvjjZ-d8e1)uG_mTIG_@*}G`9+u zw6L<1w6s!{w6fxnw6XduVQY0;!p`cjguT@o2}i4`5>8h263$kc5-wK35^h$u67E*& z5*}7U5}sDS#l5XAiu+hC7x%TQ6Zf+U75BH&6%Vvx6%VqyD;8|ET`a_EqFAU^wpf^z zhgi6ks#v5IvsjeXL(yof1EMij3q)hB8bsr*5=0ZM97PkYlth!Pm_?JVo{6MdofJv4 zS|gHfH9;i9s#GM?DoP~F%3dVfN>wD+ibo{R>bY>f)pp?ms}A8pt4QG@D{bLotG_~} zR_BGvtQHBCTa^n{SosQ7S}6-vS^W~Mwz@1>W3@)G)~Zdg&MHB$-pWR>!AerF$?BUx zv(*)W7OPDHtyU8S+N_EM+O2{FI;~6ux~#+nx~;zO_gL-W@3m^-@3Zpd@3#`;pI~*L zZ=%&ozR6Z4d{e9(_@-L%@J+M2$ve$z8Sf0MGTxb1p1iZHWO!#=ec+j6b)09e)qI|L zRuw$+t%7+LSn2XCwBq1dWOagju~h^25-VHorB;8qmRarLT5eUtwZh7lYo*nH&Q(?i zIagb?aIUfPne!MV=r3CDV?O&lAn8aXyv1#)b%Qs&rf^^$#yRUi9SD+~5*R!`Wr zTg_nGVdc%X(~5y@m(_OG-Btyxd#p5B_gXz<*=IG6WxrJn%K z&V1O)fcc2kU#6p0Cz+00&1E`aRls!8%8BWel?c;x%fEUPEkEdWTRzrnwY;uZZ+Tj; z(sI9EvE^pHJj>;JnU-_(QY|SJCo;uAJp{U1`g+x)PR0bVV(9 z>k3pDw#)t1hc$jV`lgi7ta>w(ft6WZl0OQM$h^f^>gc zclF;C~d#dMu}787*t zS#;{$wP@72Yf+_h$D&y0jzx~nZHrW$+ZJ&;w=KeTZdnBA+_Lb}xn<$3bIZa;=az-3 z&P@wFotqXKIyWs8b#7Wn>D;ss(Ya~Ct8>$WUFW6+gU(HhFWNUPo@?K-xT$^1;;i;9 ziv!xXEH-Q3vRI~l%VMTB=g`{ct4BweT$!34=mnlJ+OGF_0Zy~) z?=3!RzPEU$`N870=0}T*nx8C=X@0iYt@+tvqvjWj<(gkD=4yVkn56mLqC@kCMV;nP zi(<`R7MYsAE#fu*ScGc+weZsXXW^jv-@;6j!BR()(Nam1$x=d-*^*C_#gbW*)$*qX zo8@~AcFU(49G15=I4v(~a9N(v;I`bS!DG2agV%Dk2A}0Z4SvfR8UmJm8iJOs8bX%U z8X}fO8lsk&8e*0S8se7W8WNVi8j_YS8d8?l8q$`=8Zwqz8nTv(8giBr8uFI>8VZ)| z8cLRb)s-#ZsH<4sR#&q;rLJzdQ(ePyg}SEY40UbGc6A-ga&=wHbag$;aCHMqH+4fx zGj$_NHFaZ4F?CZ*R&_JWuWII&Pt`0euc%pB9#ONl+@fY{xkSy*a;lnxWviN_WvQC8 zWty6cWtf_qrMsGkrG=WOrG}cfrKFmVC6}6?02tDo?Q7t~}9lf%0U_ zF6AkfCCbw*%oWdnbe}yZS4hmN-4Hd3gDk785|nVW`XTOabza=VYPq z!Ah$R!78g{!D=fz!5S+`!8)t&0`*o`1sbfj2sBzv7HG065@@yx7HG9H6=<^(7ihQo z!rx)FhriRRg}=+nkH6bWlE265316SpdcJs2gwSjkvRXy)i zD}UZ;R?587t-kZjusXvt(`qr#EURjs*;b)EbF2(`=34Rc%(J@8J>ROEdx4cJ_d+X1 z?nPDyxE5PAaV@cO;aY0N&b7?y6z6iQKF$?Z!JI3tq&ZhvJ?B_$wUuLyRSU;jt5A-0 zR;nE9tv;}Cu$soc(aM&6lhsSM%~mtmwpjVGZM9-%+h(kcbD)}2-_Saw-0 zV%cq#$g;;uk!7#d1Ll2JOPKdrWiju!GGabp^`GgG)p@4FRtuSqSd}szweny(W+lZm z!}6WpB+G|-J(gGX+AL4%HCXP|tG3*zS8BObufTGqUY2E_UaDoYUZQ2WUW{dqUbtnV zUa)1Do}ZfE-F*ST#Wp>xYZQ0JBfx6UmK7M)ubf3$B| zyw|>E@ksl&#Z~Rw7ALfCTkO%kZLwbaw#6dt+ZI!`Z$t0yxnq&9ea9kM`;J8z_$ z7Pi`VEey5qS*U8?vyjxjZ^5g5--1#5zQtFq2No~29$4JfdT4P;>!HOltw$ESwH{ln z*LrNRSnG+!46P>?y;@H#8nvETlxaP)$kuvp5wG>!B1G$jg@@Kl3tO$17DigHEY!7L zTS#lYu@KODW5KHR*5a4uJB#<4?=7BazPGrk`N86x=0}Sonx8CoYJRd|QLXvIqEPdvMY`rMi&)Ly7Qvc-EIc*;TG(s;voO*8Z=t2hV5y+V zU@4}_Xvw3=WXYt-Z23cj#qym7tK}07Hp^QY?3NcbI4qBAa9Zxw;IiDJ!EL!pgU52A z2CwCG4L-|04SvfO4FSt)4MEEy4I#@64Pnc84H3&Q4N*&94KYg>4RK3r4GBvl4Jk`a z4QWe74H-)b4OvTm4LM6T4SCBy>I#;x)s-x7sViHaR9CUwsjh0dLS5Z*y1IsCySk=j zxw@8Rn!1i+lGDFSLGE&Xi(o4 z%Ll6dmX}lmEf1>(TW(biv0SbiW;sJO+_FnG(y~T1$}&$i#xg-Q&N5gv-qKYy(b8Ns z$x=%-#ZpE!)skN|-I7T)!}6<2mgNhT9Lw7(xt8Zt@+}Xl6j*LiDY9IlQfxU}rPQ)t zrOdKPrNXjIrOGl(rP?x1rPeZ7rOwh_rNPohrP0zrrP)$drNvTGrOlF0rNfd*rPK1Q za+l?G$hBg32>3|0>P4e4#YQ z@`}IB z#r2jq6*pQQQ`}^^MRBv`BE_wi6BM^u)+uhc%vIcJ8Lha>(o=DdrG?^NOLfJ4mSTzr zEZGzfT7FeHWcgI#h~*W9qn1Y$j#+L|IBvN_;iTnMg;SQT3a2eg70y_uDV(zmS2%C! zp>V;{QsI)Nw!&pg8HFpBdW6KY6Pc5&@J+s^^_uO)c+)K-DxmT7&a<46;tUa-QrD%MRI}mc_EaEn{W>SbE6*wKSIfZz(6sV8tcNX!TWw z+3KMTi`7{fR;!&d>{iQUIIJeia9TCUa9icd@K{C3@LGAu@LQS52w17e2wDlr2wO4A zh*&+47PZ~TFS~oTE7TeG(Q{%OxzW`X#KaDkW^Jk|k`d{3PtGEF|o$R3sd&_$8dIzKT0r zofUVnS}N{lRV(gp6(;Usr6=xb#Ubux^-#>mYPXoL)ig0bs{%29D{rv?D|N9zD;BX} ztB0Z?RtH2wt>%k{S=Eb%TP27_SUHMDSt*M~Td|79SiKO5wK^>lXSGfw-fEIaf>oJF zl2x=wvX!Gqij}%ZsuiC|n$;`ebgP}h8CG4wSys`)*;cy3IaUn9xmH(&@~l<~yD0?k(6_*<;@^0!*G^0!&}@wZz^@po7~$2YFpmc)v&yzt7>^dSIKg}uDsxx)T(iO7o z)aAEq(B-u(*X6d%)8({G(`B=a)n%~^)n&5u)n%}B(fw~>qx;vwMEAFaj_ywj72O{e zGP>U^M0CGe@aTTFVA1_#@ki&Q#TT9T7H@UlSv=KwYjIcSjm0&c*B0k=URfN|d1~o#z%Cbe>tP(0OXHQ0IxoES<*|lXMH=Z*!F&K-*%+P5uUYu~oGr+vrbqV^q&BieT?wrk(9Sgn1>VxIOLi;3EIpm+D& zwaC%FYZ0$~*CJT^u7#U6=q$f`7JAzEEEKixS%_-ix8T&iZ}C^_fyGCy2Nut?9$4Jc zdT4P@>!HPAtw$EywH{fl(RysLKa?C(6l*=R$k2Lb5u^3oB2epv zg`3t33u~>H7W!JREL5~!Sx9QVw&2rxW5KNT#^Q(OTZ^}v?<^i^zO%Tl`QGA;<_C*| znjbB;Ykss?qxs2Vk>+QM>6%|GdNsdVG;4mdsMP#!k+1o~B31K;MYQHmi$Kj^7VetA zEo?RaSQu;mwb0c3XCbfo-$GQA!IE2((UMV<$@04fv*lY27Rx6Ztd_Sl*eow-uvs3{ zV7J_(!C|>sgVS=Q2AAam4Q|V68a$T08oZV*8hn=38vK@p8UmIX8iJPb8bX#~8p4*o z8X}f18lslg8e*148se6k8WNTY8j_ac8d8@08q$_*8nTvu)a5K+tIJ#7Qdh7%sjg(X zLtWW&g}RF6bahqBc6Bw&GIb5hG<8kOFm)|UH+5}GGj$zHb#*;Uadmx5c69^G?`npY zFVu`JZ>X7Ao=`Kh+@WS}xl+x-a;BPrO6<(864D=gWRR$6{mTy6PKagF79#dVf@6xUm>R@`7YQ*o1JyW(ccQpGKnDT>=H zgA})0Ix6n4G*H}SDX+NOl237u%PjfZmI3m2EKTL_T1v~`w`7!mVEJ6`q2)QbN0wXUo>tsJ$PM7^+*(m$XGDr5iWw`85 zODEZ1mb$XPEhT0DTC&Lgv-}|Q-|~(Oqtyu+CabM7%vK9!SgrbG*sQ8$*sU^TIIY5D zxU5`cxUGz2c&rp;_^kM4_^p0R3s~Kh7P8tdEo?PaTEwbETGT37THMN5TEa?LTGHyX zl$6yKDQT;%QnFUlq~xqBrR1%mr4+2}q?D`_rIf8$rBtk5NUB<$l~l9ZB&lIFLsHYK zPEyM%MN-?!TT<7`NK(&AQc~ZFQPRNbm4ugBIt0$rXRtH4`trmy|Sv81;SS5&tS~-e_St*N#Td|5p zSiKO5v^p&kWwl-;#%i)itW~*4oK=iSyp@wkf|Z6yq7|P=lGSVBWUJl6sa9RWX;v}9 z=~jBe8CFcfnO0YYvaD7KWm`1}0p!q;xq#MfaJ$k%D5z}IEpT;!*6~cTYUP=170WZl%A9Aal@QM~tNYy3t!8u2u!`WGX(h@%%jy!>Y^w=ebF6~6 z=30qx&9l0}Ip1n7=K`w~&V^RmoQteJb1b&n$Fan!n`5a}G{-V49gbyI|JheqEn{D4 z<;%Xx>O0$Nt0in}tU}n8( z^H!_1%-gI=nYUZnFz>M9WZq?UlWDir3Z^|)HB5W00+{w$DKX8qyr?(T@`zr)LSa#|aTh{62Sr+SMT4v~_SjOtbTL$SxTe|CoS=#CaSsLm2S!(Ec zS<33USqkepS#s*xS^n3xviz!RZuv&n*z%FCf#nTdUCZ;jT9(Ij)h+kvs#tE;RkU2C zD`&Y-SK4xhuB2tZu9#(;u83u=uApV9F27}tF0W;>E|+DrE{A21E}Ny7E{mm;E|aCD zE~BNP?tcqS-Mi)3c)ctP3sQcC8m(CZ9PdcA0Ug>u{fgh+G3B+D~qiw@V?YkBSwC`GM*1l`8 zT>GxYEbY4%z1nvz8ny3QlxW|z0NvdaqkYf9U;Cbgv-Uj;Gwpj8khA>mTL@|2w_wx0 zZ}Cg(fyFzm2NsXC9$H+}dT4Q4>!HPdtw$DHv>sWk(0Xh!SL?CGM6D+lZCXz(seKgXmDFLYw%cBY4BPW zYVcWRXz*LcYY13|Y6x2TXb4$4YY1CfX^2=FYKU5DYKU1XXoy>iYe-n~Ye-tMX-HZA zR+qMXr7mlEOI^miB56mIi80mWpc5mO^T-mMm&+mS0spET5@*THa9gwmhloW4T+^&vK2b zzvVpDK+6fLL6%LbA(kbop_b{Y;g*rA5tiPnQI>Y9(Uu0Pv6jlJ@s?t$36`9yNtS<9 zk}cn>q*^{wNwd7Fl3{s5CDU@ZO19;Cl^n}ODtVUERPrsmR0=KYREjJMRZ1*VRZ1-* zRmv@WRVpkURjMq_RH`ktRcb92RO&26RT?ZgRT?e-DmPm`S8lPqsN80`Te;nGsdA@f zzjBvlrE<4rvU0DbuX3NIh4KVTCFO~hyvma;e<)3{e4;ef^1RY?%iT&dESD?IvYf0m z+p`Ic@<3oVV67FjANEwSWNT59=Qahc^y#TAy<6<1mwRa|AcS#gc! zLdCU~{fg@?>l8Ow<|uBoj8@!i>7}^E(o%7&rH0}*OL4^=mTZbUEx#)4vV5wr$MUMe zUdy8j`z*IA?6+L1aL{s^!Xe9cg~OKR3P&t66pmR&Djc`;QaE90t#HaxSK+j!oWfa4 z0flpxObX{MU&vpyJS%_6a+CaJ%W3jgEvx0PStiI|w{(-gVW};D%TiGOw&i!ZJC^t4 z?pYp{yKlKh?t$fGxkr{&a*r*ONGTc_5rFpF`O7mH5kmk4Q zmlm|jlNPe_l@_+rl@_t$l@_&nCnaumUP{7hgOsGzBq=GY5-Dk`FezCpODQ=kSt)rd zMkxiWr;ZO_o%(s+3f-N|4mBa+lP!(v#G(5|z}p`YWMh^;AO7>YRkW z)piL3tA!FqR^1ZDRwWW9R&f%hRvr@OR>l$*R&o-SR$LNRR&T^@td5A=TFn)=vnm(2 zw+awZLTOg3h0?7Wg)*!ngfgx4g|e*J zg|e;g3+7tw5X`fhD41`RC0JnPCRk{tBv@qiPoUW9wm^y1PJvRZ=>p|eWdape;R2Ob z76MgPQUcXhKly8{_Vd?Tb@10&1@YHg$?!K=z2s}O+RE2#)y&so70lOarOel6^_jQb z>IiR#)l}Y2t90HjD@)#PD<0k+tNT2?R-1YHth#vmt&(^qSXuK-v=Zf+Wc8SPvei89 zDONGuQ>~=Ar&-ceytN zP2gBy700pAN{?fa6(h%Dt2OLPtU}qBTK#8RZnc_ig;f;WN-JKrRaS>sS6kJwuCcOU zU2FA;Wv$gZmUUKnEbFcGST|D`loRmWTAFS#HytV7W@K%W|Gxi{)g!ddqgbO3NC(63arpe9Kh5EXydpRLcOp zL`zq_7)vX?2ulOKU`tg!e@kgSZ%aWvcT09XXUo634wj#FZ7g5vT3SBPHMP8^Yh-y= zSKsomu8!p{T@A~Px@wjybd@dV=_*)G)s?mE)s?nv(Uq{Q))loZ(iOJM(iOB!)aAE~ z(B-iV(B-mp*X6LZ*JZOb*JZKP*JZL)*JZSn*ZprHuKU-5U-yp%yY4TG|2jV`zUzFq zc(3!#;)Tu^iw8QNEpF(1vbd=8!Q!OOdy7Ll?<{udytUY@^TuMe&TES$I!HPEt%nvTv>sXP(RyUDLFDyBD>b++3p98v(=~W4<23jzLpAs{!6U$yTGs`+PbIUw6OUrmQE6V^i8%swuTT3G~drM_C2TKt(CrdUpXUp%Zu9h!V z-7IgZdRU%O^|ail>TS6})yHz7s-NX#Re#G?)j-Q~)ga3()ey@V)lf@+)o@Ek)d))y z)hJ6f)o4pe)mTd&)i}%lDhZaKR1z(psw7+9P)V^oqmpL1UnSjglS-!LGL6YzEGb~G#W?3dG&9?MYnqz6LG|y5)X}+bX(n3pSrA3w> z6c=0GQ(S6!Msb}VYlTvg*}$@6!u#7E9|qZS2$okI;456(xv&V+@<-g)TITiIHZNFUP=jDostrY=2Z)iFtVtJRVURud!@tx6@8tzslqtehoP zt+XW7tOO<1t$s>qT0N4`vN|Q9ZM8*0*J`eWo>jYqzEz=wfmMuzk(HZ-v6Z2OiIt3m zsTI3~xz#gq3#85ec=b6bZA66A8C+5s9$U6p6GF5Q(;WCmdt7S2)(HS2)fpPB`AmKsdpQSvb+^ zx=@nU8lhyXCZQCo2%%If1EDl44xtRIhk}__y9BeWrU+(RMwtV)gk^$t4{tZt04YrD_Q;;tCxJW zR@?dNty=jStU~x2tyK7$tiJI!TbKG zZmV>j9xDf)UMne{KC2hp{Z@;)Cs@UEPqdQbo@8~OYqHe>t|?ZDTvM%-xu#h?=bUb} zmUD(xG3QJx8_ro)ES$5f&T`DQn$9uDDw$)hl_AGGD`t-QR%_W8SVgffv|?jlWVMNH zu~h=w5-TCLrB)|cmsvHiF1NB{U19Z$Wu?_NmQ_|IEUT?dS=Ly6XI^Wyk9nO{GxK^Y zZ{`hFBFr1D9x!dPTFbIMmRt0uTdvTXXgNo(+j4?ln`NtBgJqRo zwPl`OnPswGp=E?#j-{_&x}~#TlBI=SoTaW_q@}W6sHLP{pe3K4uO*9~r{ynQSIdvO zPL|Jg?JV!=T3KGvHMcyaYhrm&*T8bSuCC=eT`kL{y6Tp5bX6=T>nd4x>B?I+>dIJF z=t@}@=!#pW>xx>&>k3hf8->hf6H>T+3{=yF)<=(1U==(1SK=rUP~=rUUJ z=>E50(fw=jN9T{lSDjxLZ*_iJJk|MbaZl%)#WkI;7Uy(6TO8N%6jP(Rpc6tMkI5Oy{{pzRq)t44r2di8@a$qI8~G z1nWGp@X>i<;i~i4!cOP0g}Kfn3qzep7Fs$FEtGX0TFB@;v=GyIV8O5Rz=Biffd!M! zeTyI3_bpy)-?zA@ec$4u_I-;Z+V?GXXy3P3t$p8Op7woV2y?qZYE@(ZpIHL8)VyD(4 zi?v#hEf#4#wwR{%*rHqOiA96f6N^%>HIJ+tu8dTwE>_1wZp>xG57 z)(Z<6t(O);S}!fwwO(2L(R^j`QS-IMGtD;^w>95bT+n=LaZK~A#cs`a78^9*TP)Lj zZ!uf*gT+M6j~4BkpDb!LKUoxMezwTa{9+NO`PCvs^P7d2<~Ium&F>cGnm;UbHGf(t zYyPs3()?{9p!wT^P4kb%UyZ*OpEdqjywdn@@j!#Y^1242QnR#lRSrRrq)TGiR|uBxl$c~v*dgQ^~un^Zk5m#BJMPE+-<>`?W!tWx#2%vBArj8_e^ z3{nlYbWshpG*=C?)KZPGlu?be{HhXX`9dY$@{UTP<$0AP%fl)umfKWP zEmx|fTh3LbE?jG{JJa(nQO}N|P-oC{3}fQJQ9%p)}nxRB48#lhQ0peWlr! zvPyF-xs>Kv{!pB6`Al(v?_NB**BI^vTrS2 zWZzlp%YLwwmi=hSCi}_qlgt;(doo`wPs@C>+#&PBa;eNu%gHjoEE{BgTjt69wTzMZ zXXz#L-_k;c(MnB*$x2j)*@{_)#p;PPtJPs?cB_Tb999j|oK^|aTviU!+*XRxyjG0T zd{&R8_^pme30N(Y60+)$61K{g60!1=616gv60;JKlCb(ADQR^_Qp)O}q_ov?Ng1mi zNja+`NqMUXNd+r=NkuC)No6ZONfoPa5~^1BB-E^qOK4bakkGW6DWPT6ETL_cC!uQ< zA)#mGETM0uCt+YEC1GU6Dq(E(NZiC~m$<3bBylsVTyYC44{=K?WpOL3|6f>oqYqLragvK6OLiq#{*RI5FLX;#w&)2#{x zGpu|BGp*DGv#gi}bF3Z;zuZcWzryMjU!~P{zG|yhz8b4gzFI3azB;S#y!BQmc^jS+lIL z`p>-5>Im~Ht8V7iRzb{btYn$jT0Lc2XSIoGy;U>Q2CGn}jaC{=^DLL?&9I!MH_5V3 zuh+6!uidg-uhB9`uf{S_uiP?BugKC{FW1sRFT>JIFU3+@FWyp7FWOQ}FWizxFW8bv z&)@QguD9hoU3beTy3Urjbsa1(>e^VI(6zMOr)z4tRoBRJjjq1sVqG1}S-P5*6Lr-r zJ9Jen>va_^%XH-|b9H4bQ*|XRV|2wWLv%$fy>*2wopl8)t#tV;jdXb|wRE{Gm2^2Q zC3V>>g>+dgxpbK@EN<)kw79JE!{Ut2H;W@WUoH0P ze6iT3^VwpZ&PR*oIv*_N>%6y^q4UmSqRv~3PMtRvO**eFs&!sll<2&&$klmik*f2; zB2MSIMYzs$i$I-c7G65fESz#ZU)qY@cK>LBk7VQTX%e5a^%+h{f(Wm{uqEY*S zMXB}!i%jhY7BSinECRG2Sh#3Eu&~g6V4#0S6)-wxN zt!EZiTF))?wVqq3XuYtI(t2URul3S`MeC)-Pt8{r?=@drJkfk@aZ~e+#W~G47DqJS zTI|$(Yq3uAoy8K(_ZBlX-&^!+ez0iO{Af|7`O%_4^OHrI=4Xo-%`X-~nqMqDG{0Kd zX@0XX(fn?qt@*=3QS*m|gyv5RKFwbiteU?qerx=(_@wd2;)TXvi~Ab?EUs$&w>YE0 zV0l=B(Q>B-ljQ~tCd=g-%$9RCSS+V#uv&I&uvs>0uv=DWuv_M9a9E~ka9YM{a9M_E za9et7@K`!&@LF1G@L3va@L6hT@LS4j2v~}12wL)K2wAdf2wVPA7qNV)E@pW{UEK1x zx`gF+bxF%*>Qa`|)TJ%k)MYHo)MYKx)a5M0)a5PR)D@VTxzzKe^l))->N!T-dA<9yr}AId05rea;vJF<#JVb%bBX4mffme zmbI!rmIbQ5mPxAqmZ7QvmhP%SmR734mO84Tmh!4$mO`rGmTan#mOoXZEZ?ZaSl(BO zwY;PfZ+T25!E&cclI2>JWXpvrsg_ez(kwev(k*LLGA#>KvMf_nax5cMaxHyT@+}=z z3M@@k3N5u%iY?_-N-Tv{$}HJc$}N8?S6Dt)uChFTAoy#Z@FD@f#ovAg_ctk7g;td zF0m|9Txyx9xXdy@afPM5;z~<>#Z{JaimNU86xUk*Q&?yDPGP;}U4;#n=M*+s?o-%o zxlUn=<$Q&$mi-FbEgKYeSQaYmv`kXiZ5gbv$I?|{ucev7eoGC71C~+>2Q7IN4qN__ zKVtbn{;1^<`D2zVcW0 zG^4UxG^f>XDK4u!QruSiqaO_NZwYLL*d%97Bu3YE~Za*)ur(w5M%5|_}kVv^9ex+`vAwN2d6s!!b5Dns1F z%1PYRN><#=>X(>>)ip6otIc9oRujdnt@6cetbE1nthB}Kt+>P-tX_&bTAdJevRW?c zY}GF6YLzbPX5}vGZlxjWVZ|ltY4t|L%j&#{x78*QAFJsizE(9NepU%0{#I@xfmS*q zK~_Q{!B(GzL#z%8hgwY#4zo%S4!1HCj<8}8j@bN`MwVj)fVn{ zs~qkQD|PNpt7lwYR?E10tg^Uzt@OEit-f&fS?%QPx2oryVCBv^(Mo`GlGSaF$yUob zrdSnoOtrG-m}bSxG2Ln}`wXij_L){Z?6a))u+6s0W1C~8z&6+FGV466Zr1r$F02cz zm{=ED9cEc%)xxsa%7tZ#6)Ve9t5eL&tR^upw~At3VWrHx(&`Ps8I zt+mo-nr}HnZ>D9B-ek*0y*|rQy$;JPy=KdJy*kSfy$VZDy<$r{y?je!y(~*jy;Ms% zy+lh9y;w^wy$DMNy%5W9x&fANbbTxz>3Uk;&~>#uuj^=eRM*aOkFJ&FCS7yOmAWRD z3v>-Fr|arj_UUR{w(4qF*66BQmgp*5X6q_gCh5vrM(Ijh2I@*$dg_WU^@8rt{IFPv?V0yUu%y2Ay{nl{#-N z3U%ICWa+%NNY;5}5u@|UB2?$4g`ds~3lE(a7LGd4Ev$5&Ss3d)v(V9bYN4w0)Iwh8 ziG_sD6AK}o#}?c=k1beq9$Wm;eq`}p`;o#cV)P88ONBg102JMFyi?ttG zOw)d7(WU*+qE`E%MWOZsi&X6g7LnQyEPS*dSU6}uv@p?rXrZC~&_YK0p@o3CI^~}Ot>$!!F)^iIbtrr&JS}!bkv|d^;YQ41huKCL1jpi$hhnlY~u4}%w zIHUQ-;-Kami|v|kE!JqhwOFM2&SJXedy8Jp_ZH2XA1o>~KU(BzezZu@{A3ZO`Pm{s z^RtDU<`)Ya&94?ln%^umHNRQNYks#7)BIt1m@T_BSS%YgSS>3w*evrk*ep{u z*ezo;I4pxTI4!+2xGbGCxGgO;xGfDdcq}zEcrE2M_$XMeN>Qa`a>e7~}>N1w0>avz@>T;H5>hhLq>I#-( z>WY@^>PnX1)s!t?sHs}sR8zA&rKWDVTTRn)jhdF_Ts0lbJ~ds-1~om)LNx=+WHm#} z5H({`y&T@lFg5?sGM9Uc}NtQh-DV7Z?sg@-w>6RHP8J00B zS(X7R*_JLUIhK|xd6v2=`Ibs51(xC}MV8zu#g+^zrIxRh%Pg-bms{>ruC!dKTxB^$ zxyG_yxz;jUxy~|7xxvy&xzSQrx!F=uxy6!Ixz+NcQoH3Hr4GvzN}ZNll)5b!DD_zO zDD_%aD)n2YDowBqQkrOKuQbV0M`?o->`>TjS*ftqGD~5bWwgR}OCN=umUareEcF$3TPiB- zwG>v^XUVFt-}1fuLCY)hhb(u>AGVw)f5fs`{+MN^{BcWv`4g6=@~13i@!O%*%y|ovM((KWM5hSk$G+TLguaI6`6OI z2V~w`u9f*&XrAw$<1xct`*+{5cX-H^V2}@{M{TJ7^x*@J( zwNYHxs!LqoDn;DD%1+$SN>bd&>Wi3()kQH=tMy`LR=r~8R@q_}R-R&3RvKc~RvcnB zR?kIkt&WS@SuGcJuxb}|w8{{5vhoylw$c)HvEmkWwR$JwW_3Zt-DE2V0p4hgh)*hg#hf3bR@(6mHcd z6k!!96lrB36m7*R6l3*BFxG0XV4T%-!Fa1;!2~OR!9*(^!DK5A!4#`!0;yI<1k$V) z38Y&!31nC$31nJ131nF*3uIfd3FKH^;Lo+1#-C>u$DePd#$RCdk+0Bd4_}d0CttBu zIA4jCI$x>P58g7XQ@rI?^LQ(*ig~N7Jb0_EJ3+$)oQMGs~oNlDs~?^mYr&@`#PqRA2Hr=X(ZHARP+f1ul zth228SZ7;#u+Fh!VV!GrjAfoxC(C>*ZX&NDBvn$En~DuH>4l?L-ttItf! ztoAZ3x9VbAZWYe7(n^nMfn}H8EXz8*sg}ih{gxSeot80rEtY|L^_K2>RhBk-rIv6SuzNtPUXah88|qbxt`hFQMU4YGWo>t}gQ*UR#ZuDj)7U1!Ukx(=2b zbZsn`>sngQ(>1f4s%vc7qibN zrz>G;rYmNtt1Duusw-$ItIKaGs>^H1tIKW4s>^BlSBJy$s}7sxTOAh5r#j4*_jDL7 zuj%}^IIr{1;<(Nqivv2pEq3Vqve>Be!(ye*cZ)?j-z;Y9e6^UY^Tnb^=aWUN&PR(n zoevgeI`1v=b>3NI=)AK?)Ol+WrSrxjSm(8ckIpL#SDjZDb~-ODEOcI280x&R(9(Hs zp{(=VLRROQg_zDW3x1ua7MwayEtqtkSp3j_V)0u0iN$^G#}=2gA6p#Ner&Nr`;o;O z?MD{#wI5kb(tc#orv1pGQu~obuJ%KVMD2$bq1q2EJhdNM*lIttFw}l%p{o7RLQ?yo z1+Vra3r6in7GJ^l_C2z=tM$m@lGY=Xy?slx9$U=NdTi0F^~9n{>xo6V))R|tt)~_V zT2C!PwVqmdX+5*B*Lr4QqV>!|OY6CXyw-CI5v>;%oLVm|{%O9n_@epJ;-%&*i~E|d zEUsw2wm7Bv+G4-v8;h-)Z!A`6zO`7O`PO2p<~xgS&36`!n(r;jH9uJ7XnwFr()?%< zq4~+ePxF(7i{@twE6pz!hMHe3)HT0a$ZCGG5Z3%|!KL}#f>HB_#dnRL7Vk8ESv=MF zWpPL2x5XumKNcr7{#qQ+_-CC z(_pns)nK)Z(O|O-)?l~v(%`Uk)ZnzV(BQH((BQIE*Wk94*Wj@f)8Mt_)8MmY)!?`M zr7mFkQeDvUhPsgDadlzKZR#SH%hW|Jr>cutwyKL;ma0owrm9O?hN??hx~fZCnyJfJ zs;SFbimA(4va2gt{!ml2e4(afc~ec<@|2pY{|0_7^p808vEcja13W952FdF2L6ZskVH?@G;6Tj*XIL&)oMkylakgcn;vCC-#krR8it{b~6c zZxohW-c?v(c~)VSpSCbdf)5sU?5h zQc(VcPp?z-g{ z*&CMkWN%rXkiBiWN%oHAT-ke;?XveRi)0^I#>zgj^pJgQX(Ic?QeO6{CAaKz%kMHT zEFa6fv^+2K%5sm)8_N|kZ!M?Fyt8bUd2d-D^U*S1=98tb%x6m*nJ<>wGT$tvWWHN+ z%KWhWApO(wy!0>2b<%$Vg!D)g~!ct0_`! zR^?J0R?$+NR(4WcR!UObR%}u{R<9*_tu9FNTWysTu$nC?Xw@JoWR)f@;xF$=4wqLx-iMXjxtiP~7Ti`rUch}v0sirQOgi#k~GiaJ`o7jd$>B;stf zRm8<=riiOmt%#ddl8C#Nhlr<@o`{!~sED`KPhlUc6T-e$(}n%4(uMu4EQABBxP$|( z?g#~0trrTmY7q*tiV_O5G7t*4;uMOodMFrawMQ_@YPw*wRk2`aP(UFbM#rsar9f=W}jeH$3D?Ym3@-cIkw4G z)ofF&blIj_J!G9`HH~$el^5#_D-PC~R>xUpS@p2YwhCaGVw8-iZ(;}-rro~p#OiQc`nHE~s=*_k))SG6RsyD$hO0V0}U$52DMX$lq zQm@)lU$4wkMX%6ON-x)vUoXRwRWHTzw{C*vN8M=4=epsRcXfj;ujmF?p3?QPJfQ1g zxn0-Qa-FWDDlq?WY#Ew4Yj>(|%%cQ2U9+ z7VRe%E3_Y5%+`Kv(Xaj3qDlL)MVak;_gzVlj-Ee>lvw%D%q7`(S{q1I#Y-o7raCl>Wu zPb^Bbo>*jPJ++9{dTJ4*_0+;$>zRd()-wx3t!EbMTF)(Hw4PfCYCX4L(|Td?NArcn zN6nWO&oy6K+|hhxaY^%)#c|Eo7JD^cTWr>RW3fW>jm138w-%E%-&%BPzO$&;d}mRr z`Q9R1^MggA<_C*#&5ss7nx8D3H9uKcYJRrR*Zgdus`A zG#D-GH5e_+G?*-NHJB|^G*~R7HCQZzHCQdZG}tU1HP|gJG&n5vH8?EQH8?HhG`K9q zG`KB!HFzvpHFzz5s`FXCROh$6p)O!~TwTy|o4SzYGIe3gsp=w@t?HtdrRrjqsp{gE zq3RNruIiGOrs`6bYU{M#AELG~TOj7E!^jGS#v{CA|)Ku!V6jSQ6WKrt3 z{G>R+@`2(c%d?7;E%zu+v0SA%)pDldbjuFK8J6XWGcD5;XIX|S&bD+>oNH;KIL}f= zalWOn;sQ%%#f6q%6c$@PQCMPmMPaGsQHAA}TNPGVE>l=(IbC6uWrxBV%Swf{mRSnx zEMpWlSo$h#w6s^)WNDzV*-}YitEGs-HcK{z?UtY9cUoST-(|T+ez)a9`Ms9y^7|}v z<@Z|#%OA9~ls{ytAb;4BP5!9mJGo<)SLKdd?v*=fxm50yWv|>B%QCsMmT_|DEZyZU zSQ^S*w3L#&WXUXd#qzD}Rm*F#*DMdn-mqLPd((2N>@CX%**limvUe@RWbauz$=~_hg<~o|1WPxn1UkkuN&m4_m;P(XA^p$t zrPP1RQ&J38Yor*h`lOhx3Z+=ALZw)(ET!12WTn`xn4~zZo=I|9otEUb+9=6mHC>X= zs#cQUDp^v%%2QI%%0N=cNc51j)e8wRtBVriR=Xr5tQJd1S@lRrTa`)3SS3ox zTKP!GS(!^HSSd*;TJcFJS$z>#wmKuOVzpFU&8l8p-6~RC!^%Wl(@H>G%j%7oj@1b< zU8|*HdR9$h`c{cz238JYMpg=9##RhsCRPtcO|1@znp-UvwXkXxwX{kXwX*UQwYJh0 zwXxzAwYB;nVrO+(#NKL~h=bKE5l5>!5htr;5oaq;5f>|c5mzfQ5qGO!!X8#9g*~li z342*(3wvAH2>V#^3Hw?-5c0FyEaY$1E)-}LBNSw1Bou7LB@|-yNHElDk6@V9bir_| zBEbkNf5AvA9lIh$!)daq5s~El>r) zNwCbcy2CunYCiL9t5oJWR))-TtbQ@gwK~o;&uS9We5*vJ1y&|Zi!Af?=2#}{O}C8D zn`r5)*JJ6V*KTR9*J!D$S7WK9S79lkS8U0vmuJbWmu2}=H`VgJZldK=-B`=px{;O_ zbwe#r=muKu)AhC7s_SLBTG!2Tk*>4lOkI1+3A#3x?Yfqhb-HGjrMkwJIl2axDZ09r z(YjieLAn~2Ub?E5j=IX0mbwa-hPrZ=n!3`K3c8Y(61w7+0=lA>9J<1m47!4rKXmvl zKj`pUzR=;ee5k`|c~ghO@}dr#3p#8*ZE-Kq4VCtQRkh7 zmCjoWW1Tk^x;k$x)O223$m_hakkol)A*A!tf?MaM1*^^ri@(}0EIw#Iw|K1m+~S({ zGmBH&&n)(8KegDP{nTQK_EU@L+D|RIwVznjX+N$wGs)(eZD znlCKgYre2}qWRL|mgY-~^O~b#cM)%h%stMglKQx~vYrY>kXOZI_oyjau2oaA zoTsK@*{`N**{G&wS)`_6nWCm?8LFmj>8_?@X{n}bsja4ODXV5+DWGO#$)sj%`9;;l z^0}&+CEBu9CC0K)CC)NUCEhYhCBf2PCCSoRCE3zKCB;%lCCyS%CEZd?CBu?i zCCidQCEN0qa*pK{L7RDHmI2DwkM>D3@9~D3@DmD_2;GD_2@F zD_2{7P^z)Kqf~2oQmNi@n^J@2Vx>mQ2}(_tHA*d(nM$pe;Yw|mE=ui|hDx25a!Os6 zJWAb`KNWi{pDXrSURCV3Jghjua+Bgj%LR&)Ec+EFTh=K~waitVW*MV6-O^iehNZRQ zOiOLW*_Kj@b1b(JOD%;BmNE*PEcp~RTQVqYv3x4O)$)}5cFPU&J1nQl z@3gFz-))&FzsJ%;ey^pT{C-PO`2&`J>W#W*}Im)viB_i%RI1rBlFPmrpzPDqcV>zH_1G;oG zwMLTDYLXzeL4XeXqnpO+Nw5;mHw5?*rbgZn!^sJ=C^sWAg8d%*GHMH6%YGgHE)WoVu)YK|P z)Xd6V)Z9u-)WV8a)Y9sMh?Ui45o@dMA~sgDMQp9=MeM9nMC`4+L>#R2MI5cfM4YXD z3%gjI7Iw9oE$n8MBkXQvC+uM*DC}wVM99l(yO57nw~((@f{>q;nUKE~k5GWs6Tv{M zy@Ekj(*=XAiUdQf`~^d;bOgh!xCFzkUI;{3oe+q$S}qV})h-Zil_3ygs;p|cs;%s}YOEN!YORiO)>-v&)>}n$Hd?83Hd%e5X zk7bfoAj@PcNtP*A516M~En%K!mCiif%7}S})jy`0R%e)ISxsY_ZI#Y6$I60fv1Ov( zT+1-M8J6C9lPn$ddM!=$IxMyHnk^Od>MTX|DlNJ7N-P=m3M{|tW?R11O}Bikn{0Vg zH_r0BZj|Lw-7w2Ny1|y4bp0(?>Uvu)(DksKuIpmitLtdlqHAYaqibzhtZQMJrE6-L zsB2^ysjF`ppsQo)p{r?Wud8lpuB&3Hr>kVCrYmnLrz>kIrYmj9rz>g6rYmOoPe;V^ zn~sp>I~@VbXFB|r_jGtIuj_DIp4Z{DJg&oTc|eEFa;FZ9VFk43A_Z;LvepBCjhKP(D#zFTDKe6vW>`DziZ^Ti@W=d*>c&L;~uosSmw zIv*@7blzJS>b$ei)_G^4qVv{5R_Bd{xXv330iD+toI0;8m~~!R{M3GF@kaZl#eMA; z7MHYNSRB)SZn0DQxy2go=N1dJpIJ=SerD0G{mi0D`>92q_EU=_?WY!D+D|RKw4Yem zX+N2`O@N$<|~UGny)O@X}-2tqWRilrsivle$6))t(tEwsx{wQ6l%V+ zNY{L45v%#$B3Sdig{S5R3wzBE7N(jXEp#+LStx0KvXIdHY{9Sj*@9K`i^Xq^uNI#) zzFNH0_-1imZ&wEY$dIF+<~zMZd;hi#CnF z7PT7xEJ`%~TV!i6SSD*QSVn0uS_Wz`S$b$NSvqJiTbgUISn6xATB>QVTFPp$S&C|~ zTk>ddSh8qvTK-VyvV5-2ZFyat$MTpuujMv%KFek5{Fc+y1uR?D1uRR|1uaw6g)BqW zg)LpxMJ&zKMJ?6T#Vp0t#Vy&@B`m+INm{;8leWC6CS!R@P1bUcnw;fYH3iFgYKoQ< z)RZh6)l@8t)l@B0)YL4))HEzT)HE%v)U+*i)O0N6)O0Nc)buTx)C?@Ysv227S2ec0 zrD|e%M%B!6zpA+s9snIe{sman?soBy(sl`%Fsm)SYsoj!M zsl)QUVyER@#V*U!ianM)6?-jLDE3)SQ|z~FRh(d1qBzkqS#h#ukm3|eC&j6jhKkcH z6&0sj3M$UDWK^7G`AK26w)`n`$MTuXUCYZd_bm^|Jg{6V^U!jZ%p=PVna7r;GEXg&Wu93E z$~?EUmw92SEA!G)M&^|zx6B*MZ_;lquS&nO+$#Ova;o$P%QERtmf_N$EiI(KSV~HN zwfrsh&GN3)56k^hKP?wY{jzM4`fZsZ^~cg%>Yt^))PGB1DF&DiFT|y-4vNcK%@UWhDiN2r@)uXI(h^s+Vii}m zdL*V|wO>rtYL1wiRh5{!RfL#^mAROfmAII;)pt=Hs~e)aR=Y&?tY(YqTh)mgS|x}Y zS-FTBTd9khSaFM*TD=!Bv$`x|Zna&+!fLjNrB#E7l~t;UwUw8Mjg_H@ot3zVz11IK z2dmS%U95zKU9FxAxm)cP^04X`^0Z13^0KlL^0pEX^09g@=xeoK z(9de7pubhIV1SjMV4#(bV2~B3V6fE-fe@?X0-;tb1j4L31j4N{1tP4x1R|}p1){8Y z1){C)@yA##<&U+><&U#6<&U@e&zE3ziZ9V>I$x4i3SY97F<*)m6JM&;Mcy>4MZD=& zWxN?y-n^Msio97?KX|gOF7V`7t>DSEYU0VWis8w(GUq9<65=Vey2D*$HHEv_%8$Fm zii5k<>IhevRWnz)l?zve6+2g@)fvtztI3?zRxzA4R$82ORzEoEt&VauSWV_=v`Xe^ zvNGmqwqoIEv0BaEY8A-dYW1D1&1ybdyOj@Hht)6EPOA;9T~=wV-Bz-!JyzFPdaWk1 z^jQV7^jk@?Ot5;$Jke?e^CYWW=E+vZ%u}qGn5SBuXPRa;hiST1F4GJvTc#zJA$s#H zJ@sZ<+UZTUG}i00)X?j+l+$am6xOS^e{8_Nt`OUrm&Gs`et zV@p3>LrYg(Jxg0%ZA%kf4NDzeHA@v;WlI@dMN1J~c}s3x8B1neDa+qF5|*EJ#4O+F zh*&<+5wg6aBVc(&htKk?4v*zg9d65gI-Hi#$ia*I}_-pu=oAQ-{%Vk`9Aq zm(G8SW}UwlH9CJRN_Bo)X=4ijLn4taKqFMX7MY;BKi!AMD7IE6oEP}M3S-5FGwXo8DYN4n7 z)Iv%7sfC#KQwuKbrxyRUo?3j?dSdZh>xso3ttS>2w4PWT)p}yFOY4cnI;|%bi?yCw z%+Pvj(E~om_o+ph)>E8w{hC_OEabp*{m(5pwVqr2(|m66Me~KlOU)M+_cdQwT+w`K zaZ2;0#R1Ki7TYvmS*+H4WwB86wZ(MJ*A~5+uPvH2-&j;?zOl&Hd~1=a`PL#@^PNSY z=6efw&G!~|njb7oG(T8qX@0a&(EMm2uKCG=SM!qvv*u@uUm9O5K5Bfic&_o);-1D= zi>n&nEKX~Dw>YHn-D0Q44~vZ&KP^^h{Ir;_@ylYG#&3&Wjo%in8h1m*VMTzkEwH8ZdK>8T&m7%IaQt4vQ?eWvQ(YlGF4r`GE802(oJ2+(o9|0 zQcYdNQe0isl3iWQ@`swZ)x}aw z)y(SMj&ptP)_kTqV$Qwo0&Nzeh02>`~6PtWeIiOjgdb^i$5av{EjxR8=mr6jUy@{Hs)A`BJIW@~Tp~ zn%6RZ?K#$zsa&zezRqY{1!_u z`E8bl^4l#X%;GnT7l&st8AJ#X0{d%-eW_M&B&>?KPl*(;WMvR5so zWUpDW$zHeoEOXQHfy^z-vog0WcgftbTrP9ha;nUI%VwDemIX2oE#qV!S^CI4wzQUc zVyP+f%u+(;xh1>I3(L3CFD=hVzp`8-{o1le`mJTI^gBy`>Gzff(jP2^q(51Hk@{?T zP3nu~PN}b!bELjm)=Pc2Op^L(=_d8dQcLQ$C7;wE%g>VkEN@8ux7;hqV6|A1(W+CD z$*Mq-#VTBq)yhti%}Py@-HK0=!|Iy^r`0_PE~{e_JXY%^c&%ng@L4rU@LT0b2v~(n z2w6Ev2wUk&h*(KTh+45oh*>=n7q{9iE@?GYT*@k6T-wT0T*gXOT-J(FT;A%gn1aqNw>PllVP=rC)28#C(A01C)>)BC&x;JC)esBcb?TO?tH6Y?gA@5?n0~6 zTt!x$T*X#iTqRb#T%}f*ILoYNa+X^qa#mPrb5>gY>Z~1B4_G>_X0dcxMX+>R zNwM@;J!bB;TFu;NRmj|DWx+hbiiLTC)g`7$R*RV?TNN`+v2tNrYU!po-_lxdmZhQI z6iYR|eoJY+E=xhZR!cU$2FpLX)s~-h%Pn8%7FpiY&9l6sn`wDUH`Vf>ZldLO-B`jqg)()F|K)b+M(&~>*g*LAVX({;2=)wQ#X)wQ+^(Y3Jj)-| zTNLa3waC%=W09)!+agZqmqobFPm2JZ9~PcE-z}VUzFAo7e6=vq`C_4~^VvdO=aYqk z&PNMLoevhmIv*@}blzLA>b$e~ul?5IllEJSr`m5UZfL);IIaEKVxRUai;dc^ES74& zvY4U$(xONErA58=3yWgy7Z&N-FD#<9pIi88Keuqwer{o={mepJ`{Zt+p`g~fBt7Z!IkUsznyd|`1y^QFaJ&6gINHD6k+ z)O=+zU-Om4RL$2G-I}j08Z}>Alxx1R$klvfk*xXFB2x3Mg}>%I3pdSo7B-siEsQkZ zTWDy0u#ngMU?Hmc(Slp^qXm=ZCyO5%pDo^Ne71O|@x|hf#utmr8ec6=X?(LdsPWBW zhsJk{^%~zTmTCO3n5*&AVyebZiyn<%7R?&JEvhwsTNG*hvB=c;W09!w*CImWpM}51 zKMQw_{}y%{43=gZ43@eYjFzezOqQ}5%$6b=ES5YPESAg~td`%^*({%_vs+$O=de7g z&S|+-oy&5mI=AIib#BX6bso!7bzaLYS1T{U$}c{L47K{ZWFW;Jcguc|thFI06cZ>#ECo>MijJfLc5xmnfNa+#`$92 z&GL}KbjwW&GcA`W%(9%SFx#?CVXkGl!aU1Nh544z3JWZK6&6|AD=fA&R9IrE ztgzHlRAIR#yTS^~FY+rbZ_2N>+%Lbza;f}U%WnDgmWA>gEW_nDTH48Pwp5efV#zDN z)$*&{cFVhRJ1mdN?X+Agx7%{6+#bt1xxJR@a{DX;jmKCyRER$u=S^CSKx3reMV5u&9(Nb9UvL%D;70Wj= zS1oVKT(dkTbKP=_%ni$hGPf-IWo}#6%G|Ncmbq&gC3DZxL*{{{nao2=RhdVYA~KIH znPr|>K9zoIc|`iTWgKJ)K^Ofsc)95Qr|5(rG8qzll*0QMe?`hPRT!(^CkaUwo3lD%#mcU3YKKF zvXW%7Qj%o0;*w;s`Xs?>bz6en>WBn~)mjNot7#HkR`n9xR+$n!R>2Z{R(2BnR+R7!L z(X~1!qHncD#K3B%h@n-zh>=yQh_RKoh^dv4h?$jyh`H5&VGFBs!j@L^gsrUdg{`d| zgl()ugl(-}2-#Wf6|%RQEaYgFDdc43AmnT%F63hMUeML*xS*TWd_gy>3PE?PU_lQn zJwZ<^EmI?S-wF~%LWe5aVc?$$u=?Vl{2?zvRJ>w6tTEib|Rm2}= zWyK$E#ljz9b)GNMYBpb#RR&+Ql{sIG6&qiy)eYV_t5v-5RyDi{R{p$+R?56dRzG=? ztuFGUSgqnowQAu>vx?_Qx3c2NuoC0Rw0h2+Wwn4i%PN{X+e(Z($LcayuGIvte5(Mi z0xKb|LaS?>MOJe;i>*>QORNkyORau!lv$nRD7Tu$QDK$MQE6q(QDw!;QEhdQy~Zk? zz1E74z0PVETfJ2(TZ5GdTcg!c)+Vb8)@Cas))uSREUi{cSz4_USlX-TdvWKw_KzfZ8=jn+;W0$ zuw}b$fMuPok7cQ@r)7?=n`N@DlVy~yy=9QDjislqrKO{;nWcrUiKT(Ap{2U6o~695 zj-|M+rX|0wx+S}=isgSDCCl$R3YPD6WG$cTNL$|5k+i&_BW`&?N7V9!jT zIs%rPboeY+>F`)C*5S6Cqr+)AMTgz8SBK5AO^3y@UWeJTLWjw+P=~=XOXt5uvd%w? z7@a>Bp*p`U{B(X#cTd-(9xA>v;%;JsKGmD2> z&n&KLJ+nBa^~_?Q)-#LETF)$2Xg#x-tM$xclGZbeHmzqC)mqOi3bdYCq-s60h|+py z;ji@!JlAij^~^#KX|A6iJlFr+;-}_w=v@B`i(8s6EG}riusEvu(qgyfON)(~FD;g9 zzOuOAm&Ol^CXJsKl^VY+3N?ONWN7@hh}ZaI5w7va!cXI` zg`37-3phTc~I-SjuQHT8d~eS#oPITQX~~SbkGyv3#b^YI#+i&GM)^ zyX97O4$CF#oR(A6IW1e&xhzZ7xh+%Gc`U=!c`e=4`7F)V`7G7d`7I^X1uQw#1ucK7 z30b~W6S2IdCTe+FP0VtSnz-d!H3`dkYEqUH)TAvN)nqJ-)#NNw)#NS1)f6l})f6qQ z)s!uD)l@9y)l@A7)zmFn)HE!=scKrjRMoP)t*T>rPF2_PpsJqb7F7ew<*J63vs8^N zdsR&=8&pj#i&f1m(^V}jqf{*|eO0Y29aL>BO;l|y)m7~*rBv-L`BWV(8C9Juzp6M} zzEE+syrbe~c|pb9@`#FuSn8@oS}LhTS&FMfTk@#HS~9A{S-w+_x4fyGV0lD2(Q>_VvgIu0 z6w6lSRLcV8G|On^3`=+AOiN?sEK7OiY)fwC9Lw)Yd6tir@-5FR6Q|z%6Q|z^5Q|z<+rqFNsOktws zb%jZmCln@I?o^m!xk_Q0{;^3pFYnWSG?K9zcHc|z)q9< zl7B7DB>!2;N&dHFlVq@ZFTrGWU4q%_fCP)xDhXDr$r5ZN)i{gvJ)4vk`foS`X(l3by-ZpYJ-@hRiBuY zRgRdnmA9CTm6n*S6_=Qt)hkhXtJ9(iR%=9+tolTitqMd{tb#>Vt;|H#tfWQNtr$c# zte%Q!TAdQnw%Q<~V>L}g*Q!=T&nj6&-^xqG(8^H6$Vx)Q*or~K#Ol1TsnvX8Gphn& zb1O$-3o8*}ORE<`R#tn3tgR*s*;r)?*;+XY*;z>n*;{=Sbg()l=xDWA(8;Ps(Ag?X z(8bC?(AA1Z(9P0^U}h0zOtc0=`xP0)AG{`Tecd@dsFy z@dsMj@dsJ4^9Ng9;tR2w#}{gq%@<~6$rodE#pqJO5{$rlI6~@y2X`gHIpmL zDuOH9N`fob>NaPd)k4mEt4z)UD`U<=tA89tR;M_Mt!8nQSmkn*TG?}ySqXBKTb*RD zuqtA&w3248vO3CEZB@ipW2L}WYju&e&Z>pA&dQ3l-s&q$gVhF>MyqU=CM!*rW~*1s zEmoVDTdiuD+pJuf+pTz*JFIRnby}@r>awb1>bCM{T5hSMx6o2iZ;qw7-ZV=dy@{4g zdOemublWZ8={8wD(XF$*rCVuvLATWMm~MgP9^D+v&AJ(uD|J&W7w9HfPS=gG?A491 zY|#z1tkw;*EYkI}%+&R=Ow@I^jL>zl^w)K?bl0`Bw9~b=G}E=P)YUb$RMj=Il+`t` z6xG$WAYPnrU z*mAv&pydi3e#?bAe3mnHcq}LBa9MWia9XzLuv^yZuvwPsuvq5lFk7bUFj*$(Fjz+F z{I>|!`Dfvy^Vh;v=Z}S*&Mymdou3v4IzKG5biP|C>wL42(fMj2s`J%?U+0Sjht6jU zCY?_f-?cwlywd()aaa3;#Rcv67KgRpS!~ySXR%8At;JmJw-yt%-&nM0zp<#$er=JX z{n{d4`;|qo_A3i_?UxqT+Al5iwO?AOXuq(K(0*aTqy55yLHmWpSFPt3FSVXq+|_z+ zaY^gB#WAht7Q3~cTWrvJX0cT3nZ+!vXBK^0&n%j?o>^3AJ+sKwdS;QN^~@q%>lt)k z|8oo2zJAoX{^u6oHJ^j$`X6b&u(+Z5!s4vv3yZ^=FD!OyzO-1U`O;#E=1YrNnlCLT zXuh&&(|l!7qxssRNb|Ktrsivlc+EE!p_*?jd^F!$IBCAMu+V&Kp|APQLRIsfg|y~- z3n9(-795%%EdFbJu=u9&(c+E9M~lZApDb=^e6qNp@!8_I#%GIt8ec57YJ9O+qw&>Z zvBp=6SsLFgCTe`Q=+yXb(V+3eqFm#LMZU&Qi*${j7I7NCEW$K?Tli}Hws6(>V_~E5 z*TO{OuZ51rKMNI&{}$33|1E?y7%aIp7%iDKm@L1kGh04YXSTem&SH5~oz-%yI-BJZ zb#}`s>g<*+>Kv9O>YSFT>Rgs#>fDxY>fDy*>O7X}>b#Z`>U@@*>im{J)dVbGsR>%% zRui&3qb6dxS54G%otl{Cd^K^)32Ks-O=?n>#cI-)scJHo;c9Z0o@(-z)@lltx@wA+ z3Tn!hLTW0OENZHj-&NHtU#eHQ!Y!p#A}sk;A}v`|qAb5CM_b-gjIa-wCK zabYN6w6kHsg`95(=0O-W>`ik%(V1Tm}P0FFx%2VVXmc;!aPe+ zh542o3JWa1$}h6KEx*|Efcz56W%A1`d*qi}7Rj%$jFewx=^($_QeA$HC7=9S%Wrb) zE$_)~uskNW(Q>`qX3H6JTPz#pwpwP%ZMO`T+hJ)dx6@KhZkMHi+#bu{vU@F`%I>qg zAiLjkx9kDSWwM7XC(0hStd%`tnJIhJGF0}srK9W#OI_KMmXflkEZJmFTYi=~WBEYl zoaI@W^On10E?6#?xoA06=8|Qz%w@|$nX8rwGS@8qWv*M=%G|Kjk-2FpBXir5Tjq}C zSLwT!SETP*ZjrukIYs(`Wr_47%Mj_umZs8AEXAdtTK<%JW_d^Ix#fPTmzImAURicX zy|&DedSe+N_0G~%>b<3u)CbG|k{>OfNPew1*}BG1+6}c30a*J6Si6{CTi6oCT5i` zCT`^>CSj#2CTYbgCS~O(x716MoETU;uC8A}OD57oUA);etAfjs}E~0PsU)aFvys)9wd|@N20%2n- zCt(vSQDIZ77eZ!MdxgxcCJ9+sWeQnZISN@>NeWq8eG;^>IxT2xwN%i~s$S6EDpJtF z%0$r7ieJ#l>a~Eg)ky&ttK|Z&R&4@qR_OxnR-OVLR@wrdR(t|pR?qmot=9AVSXJ=* zS~>FjS#k6GTV3M|uv*9$XqCqoWM#t_Y{ktNVs(o*)M^cHm{mP*xK#*mgq0?5q}4y3 zD61I0~#BI0~&qIEt(;uoqiZ zv6ot@vX@z1WGlC-Wvj5#Wvj5d!&+%IfwjuYm9^UHA4`qZE|yxWQkFU^BbIurFU$>A z+nF1!nwXocyqTM=M3`Hw?lQGntz~MnYGP`)3SwGeDX+K4QdDoQC70fGO9s73mfv)H zEnn+)SU%KkvAnKZZ+T9)%JPVAndL6sBFl}sxt7ayGcD)ordm$XO|uA1=*UxIP*t>+eNwVqon)Ov0)P3yTux7Kru2Ce57rCQG|vb3ICfbQ%K)p~B>rS;sxUhBDq ziPm!qP58ck$Xx$_=v@CR%@-CAG+$U;)qG)bTJwd)LCqHy+caNVtkHaFu}Jf!#SG1t z7JZtpELt>QSyXAhvMA7eZIQ0|+9Fo-wMDSz8w*d(Hx>?>Z!F9--&*KuzO_)+d}kr0 z`OZQ>^SuST=6j338t*N>Xne4Et?|L)p~gpx8yX)i&TD+KIHvK*Vz0($i!B#bTz$SBnW6UoF}-zFE|3e6uLi_->J_@!cX-vyTw8lRRA&q|)TpIr^m^2tHzp67@K2>M3ysFM*c|@Jra*H~P zYW7swS4ss%DmEs^*qjsuq@Vs+N{Qs@9gQsy3ECRctNas@PdR zRB^Dps^VyQLdD5)kBYP9Mim#!r7CWgGgaIz`&2wEn^Zh4%T>HBvsHX76I6UHLsa}M zJyrZI?NkCSja7myHB^EvWmQ5fg;YW<*;T?Ve=0{v-7 z*RobA&oWCX-!ej}z|vKz(9&3`$Wl?M*pgqV)bgKVndMu>a?3l46_%$JD=l{^R#~o8 zthSt?SZmp#SZ7(TSZ|r8*kBo^*l6jh*koy{*lek)*lH=N*k;M9*lzh%p~Lc-LZ{_5 zg>K8^3O$zF6?!dKDD+v*ROq+tR+wm6t1!tjPhqlUg2EKbAcbj`E(+5v%@t-?YAVdM zlvbE+$)_;Kl2Ku<<#YM@mS^P`SZPq{6Y#&X*%W#zV8vditT{3yHA z@{a6o%j2?pEH}ySwVW%v&$3f?zh$ZHLCZwhLzcd>hb=8-k65b79<>yfJ!bh|=7i-N znUj_`WlmWhlR0gDOEH=2 zmTWRNEZ<1qv^*ny%W{qM9m^i+yOuf9_bh#-?_26gKd|JNerWko>apb&sVA1(rJh>O zmU?DcFZJ9qMe3!cr_?J;J*n50!cuQ6e@ec!yf69A@~Gqo%hi$}EhkETvaFE&Y#A^4 z#nMgktEHagcS|wJAC~_lep)`4_+@!P;U%ftk% zTEv8`lEj3q9K}Se6vafX7{$b_9*T-v9TJtWS}ZDQ)g~%sl_4r^r6($9B`hj$ z^<6~4>W+w_)gcijtCb?kR{bKXR%Ie;Rsg;9}nU#c)xz$HO3#-$DmR8FIt*jaa zt*v4NZLG`%ZLNd_?X2Dl*jt?uaIjh_;Aqt$;AE99;B4g~;9{jM;A+Ju;AZuN-`#30 zzlT*hzo(TGzn2v+zqi#*J|C;4e7;tNe12B;e12AZeEwGVcmu4~^9EWq@CI3h@&;RJ z@rGJ4@P=Al=Lxe~#}jVV&J$skz!Pa@%@buM!4qxuhC9}3C3l=v26w!bI(LHAbFM_I zJD3xRVQ1ql{s69)eF{AtJ$n&R)MVLR_v@5R)<+Ctr}RWtZZ4T ztbQ|BTkU7Av1(g{6?*VoMIad6xflXIOsL zooxA1x6ksvZl~o{-B!!fx($|xbgM0Q=$2cq(=E1Ks+(^)TQ}Qsl5V6UZW*J)W*Mr(V(F*D zZ0WAUWa+5GXlbSM-@;hupM{RjUkf#zKNj*jzbzzmepv|V{IuZK`C-AL^WEZ)_BV_7 z+FvamX@9Y}s{O^{r1ocvJ=&iv)@y&XSgifgVw&~`i!SZ=7PZ>%Eef^YS)^#cvxv}s zYvH5)*1|#ijfIK!8w(BX*A}wcuPp?%Us<97PVS0EQ++ATcm3}w}{nxZV{yQ+`?V!xrGh* z4FBiwef>gO&n?)sKy&>sEIvW!`tNGKu(+)G!s4Xn3yXc4FD$lbzOY!O`O;#6=1Yrd znlCMSG+$aYX}+?k(0pZ)r}@evMf0^qwB~DzK+V?{?wW5b>@?q4m}tJS(AIowp{V)R zLPGPc1;6Gy3s%i{7JoF}TYT1dZ}C#&gT(`l4;I%oK3JU7_-Jud@q{Tg2^+BCje)M|XSDAo98k)!d=B3a|RMYP6ui(ri(7Ty{^ESxod zT3BiPvM|#4Wuc|<+d@g>w}q6(9}6LkzZP5?|16j^{#krc|8Ma`ox$>oI-}(gbwP(hP)R`@(sIyqMsIyp>sIyw8s9zs&iZZQsc3F zt;TD4M~%<&tQx=NelZ!?CDyYd>3aiOmvZ^Uq{!mr4e5I;vc~@1%@`9?WEoZB0S@x@H zTQ;fcSeB~lS!Sr}TgIpwSO%yXTDqtjTbiqySZb@9TFR@MSqiIKShA~HTK-nCvV5;% zZTVQm#`3y~o#km2d&~VQ4wjo$94(itI9bkCaj~4B;%eEV;$~T?;%=Fz;%S+r;$<1G z;%(`p;$!Kk;%jND;%BL)5@4yI5@;!^5@gAx5^VWjImGgna+u{+<#5Xb$`O{Ul_M>u zDMwj0DMwr8D#uzzD#uy6D#u$IDkoUVDJNQTDJNNeQ%bgctdwebK`G60k5anjN~H|T zX-b)vElOFIg-Y3$@k%+CK1#WkR!Vu6>Pq>RVoHUUEJ{U|pA?HNA1anuUQjHx+^<+> zxn8l{a-L#^WuIb|WvybhWv*h4WvpVYrH^8rrHx{}rH*2wrHo>eC68jW%eM-x zmUk7}EYB%)SngNowA`T3Ww}tH+j5dZk7ct$pJk~+zh%0@1j|T;iI(09lPzr(rdaAL zOtn-}m}V)eFvF5vVW#C5`B|2?%3QW&l(}O0NcyVfA?fRui==N@HcQ{MOp(52=_-BOQce1fC5QAq%U4qOEzd|j zu-qW^&~mcWBg=BBCzdf%Pc0p#o>{6(J-6hQdSUrl@}=cX$=8tcF@7rQiHcaw7ZtT?5*4#b5f!&`7nQKm z7L~N(7nQd9EFxodLqyhUpNO2*5)pZ;ZV?5mA`vC4C=q2VM-de(EfG~KArUpJZ^G(U zCxkVuW(#XtVu%M)oDQ! ztEGZwR*iz@RR+fU6R-%HIR-Xi{tj-HqTdftavFZ}AwaOH*v+@+Mx6&4Hu;LYP zw0gwvWVM>#*{YP^#mbT2)ryzj&FUtfyVY_&533SBPb()rFDpSlZ>vYVK31D~eXUw~ z{j9=y{jGF(1FV>M1FdfH1X*q53AXCu39(A%3AM823A2*q3AcK~9bvVSJJKqHJK9Qv zJI3l2SFF_-;=18|H=E$&e z;mEWS1bJA*U_*%ucKypTu0gRfR3W&4jp;R4LY)x zD|MtT7wSk_&e9RLoU9{e*{vgD*`gz4S*s&pS*F8pnXkiZnW4jDnW)2M8KuK%8LY!@ z>7&DD>8itGX|KaVl-z+X^f3rBM{ncWJ_7{sa+Mg}vYk#tsto_NNP5YxomG%dVTwl{G!s0e`uK$?k3yVFPFDy1`zOY!K`O;#Z=1Yqy znlCN7G+$aYXuh;4(|l!-qxs4rN%NIOq~>c2f6dnxZkn$xY&2h67-_z-(A0cmA+Pzy zLQM0m1+V5?3l`0H7QZy!S$x!ZXYoSgy~TZv_ZC+*K3JU5_+W8Zy*|eHx!FS~b2{)M$LMDAxF5k*)F7B1z+`MU=)ji$INU7M>d4EgUs| zSXgTOurSp4X`!j{(?U_>mxZLpZwo<<-xi!2e=Ha^{#txe|7-C`{h!5U_5T)!)fp@| zt20e3%E>aV;oUA5f*{UXNS*9jpnV}|X8L1|2>8&PVX{#n_ zsjntwsi-DxDXb=A$*Lx2`9oFS^0lghRhXsM%WWT~KPY$>8@YRRE$X8A|O-138p zh2;|!OUoN7)|O{gY%C9|*jjE?v9nyMVsAN5#nEz-ij!rVinC?4ii>4|imPR+ikoGm ziif42il?QsikGE@inpb%ijSp|im#=(ioYeVN`NJkN}%O?#3!qm*FzQYq2$no^SGA*E!?^-3w0 zbCpspyOh!_%azhCQuOe=6o%K36QTyrx)ac~r5; za*JZI6qCRs`=Ot$1xm}<$OFwOG0{B+B+@-rn?L4J;9y8Jv#Kl%BVX7URx zW#t!IvdS;Ed@Hxa@~YfY%e`{TESJhHx9pQ!X<06}$}&-IwWXKb8cP$owU%;n>n%Cu zHdua<-Dr7Vc9Z2P+0B+)Ww%-`klkk4BfH(QLUxB`itJ9y0NGuZHnMvxHD&i&iplP? zWRcx(`BCP8<$alhmSF%GM8F;1&+F)k}}F>WhyF&?WQqP$i&Mft3DiSk>`5f!wm6BV*b5EZs^ z78S8l7ZtVQ78SGlAR=LPRYcNimxz?r0ugDeb`cq?JP}!|FcCQ`I}v#+H4#NCei0?B z55me;hlN$FrU|QBWeTfV*$S&$2?=XhJrmNj+AXAIHBm_0Dnm%e%3esVu%Z z)k#4Et0jVlRt zvEmi5wR*^JXSI^w-l~}2!OEWB(Ta!P$?6uLv(*Yd7ppQpS1VUOH!D#-cdMto9#-3V zJ*_%IpeHaIOD9mIODAZITNhza3oqS=SZ?D z<4Csh;7GBO$(~_l!JcXLoGr_0CR?_ZH(QR?U)CI}b*#Bo$*g%+(yaMb zS6K?I`dJFC0$7Ty1Xzl#&NG)-O=d2&iexUc(qJyP`pi^ewTG#~s*|bGDx7JRvR+? zm+Qz|&exH(oS`FaIZ;Q_vQtOgvPnnOvRX&jvP4J7GFL~yGEIliGG2$*GD3&jGEj%h z(o2WK(piVy(pHDf(oBcNQeTJJQbUKyQb~u=Qd)<>QdH-k1)t7e3wE797K}Q-Exv01 zvUs8W)8e-F4~ui!KP(Pvf4A7G{mo*9_E(G9+FvaCwLe=lYk#&V)Ba?UrTx(&PWz)p zkoE@)SM3iLmfG(vbhY1EC~Cj65Yv8Z!KMAy;-A)Ai_cnbES_tt{TCXg6wO(2@X}z>4*LrD@qxI4vQR}5exYkPxAFUS_j#@7) z%(Y%v=xDt_I>Y~k1(VhbiyxXVEZ%Cquy_oe>p!RY!s3YL3yWQvFDy1_zOY!P`O;#x z=1Yr-nlCNdHD6lPX}+{5(R^u^cNSMP-dmj3cyDn?;DAM?Bk)`p)B2nXuMWn`8ivW$U79JYk zEF3hxSy*U%w=mH7ZlR&^!$LvhhlPa3PYVH!Ultr1zbqIuep`H0|6}n`{jbGE^}iN} z)c;v*QvYwUSpC1nWOWA1W_3o(5_Lw)6m=%cP<3WYH+2?EGj$eAb#+!tadkFJ4s~|R zpK2VIuhlp$@2GKEo>Swt+^@!CxlxVRa*-Opc)OA$3GOExuW%b%(;makQ1E$^wyTV7OEusouwXt`Zg$#RvdvgKS= zRm%ygYL?Ba>XzlI8kSkAnwD{@T9$#TI+m`gx|WuzdX_q>`j(2S29~0#MwXna#+H9o zOe{aDm|8wlF|)j-Vqtks#nSSyik0Pd6>H1YDmIo2RBSD$sMuR}syJBIsyJE}sW@4t zt2kT6sJK`Ls<>IYskmEOt9V!%sCZhcs(4vSsd!uRtN2*5s`y%dRra@hpd4U%S~<{i zn{trlLgiq~UgZ$WO65??ROK+s0Obfv8|6q#P30&{QRQe$Cgm8*_e!yrca-8RPbkG( zZc|FIT&$F6IYBAOvQ{bCGFvIdGEync(p@Rt(nKl4Qdud}Qcx+&^1ouX zmZuf-EO#m9Tdq_ru$-w_XxXV)WLc?LVwtH}Y8k0mX6dO|ZfU7lVX3KDWhtdtZONrr zWBFU5*7CJNo#h>cddss4jh6cqnk?5VG+QoEXtA86&}!MN&~90(&|#UT&}kW=&}HeR z&~0g>&}*ru&}XTr&~GWCFu{^dVUp!%`N@{I#pzW!GCCklkRpMs}m+blFXo&9a*<^JTYKM$2xq^pM?dX(GGB zQc-rNC7!i3Tnl8#~ zRVB)26(h=TY|8<)pijvtGOcLR?Q+3R#_sFR)Hc?R#qa? zR>~qWRy-oIRj~wt6h2VzpC9&1!;>x>cHxhLxR= zrj?kGmeqSfZL5=lI#!DXb*<_I^{k==^{p%f4Xnfj4XwTi7+GBsFt*w#U}7~vz|<;V zz|6{Dz}!k-z`{yEz{2V=zopeGek-eDerqdRej6(;ep{=XeD+o=_#CXt`5dj>`JAl8 z`JAm@@VZ#-`;dQf0;B~h$;dQs-;PtS&%j0RamB-7fkH^Oq5X zD|dj^I_^NLEbbsHE$(2eH(ViB>$pO#O1Q$TthmCh7`P&=j&Vj>^>9X61#?DQNpZ$l zJ>rP9TE`J*Rm~A^<;{^`CCia$^^iTus*^q0%91_B>NQ)c)f~1os{poiD;Bm4s~xPF zRynL$R?4i|R`*zPtY)y}T7|LXSxK0sLx0=aZV3ojJXr;qkWc7=w*y<2diB%6% zsZ|WqYRk8}OD!MiF0j0zJKOS{?ljAzx)UvT>-Jb~)a|fbq1$XZPq*H3s&18Kk8YV| zlWvh^rEZ>Ofo_&%x^9|foNlsZm~OnKuWq!Zi*AIajc%x=v2LKHwyvM0lCHOT;v zXX&rQYw4lGZRx1PWofO$VQHenZmFxoW~rvbVyU3RY$>V3WGSq}Xvw3)V9BQQ-{Qaa zKZ{S=e=MGA|F*cH{mbIC_AiTl+CMEeYX7iUs{P$!hW0m$ZtbrY_1a%7inYI3q-lS) zh|>OK;ivt{!b$t1g_-sT3oY#r7INC}Erhh+Td-@tv-qv`&f>k+TZ<=JZ!KBCd||Ox z^QFaN&6gH4HD6lvYreE-)qH7DqxsUJNb{vdhUQC)IL%iUp_;EOyft50IBCAJu+V&M zp{M!ULRIs%g^cEF3t`PS7Mz-IEEqK3SbW!bYw=Fwt;JJ~w-$Fa-dSAMcxQ1+QKj+8qEO?LMW)7Qiv*3&77-es zE&MgUSh#C^v9Qn}wRjHw!t9?-t@3KP>n)eps+;{IvM5{>$RM`Y((7 z>c1^6sQ88$PX{OF(sjkj! zDWT3{$*In2`Adz>^0gYfwB>zO8Ow{RvX)0wjhCk&2b&G!<*hZWUY0 z1{FKY5*2&POce*qI2A|BU==4z4;5!iTNPJJBNaDGbrp9@SrrdUAr((cb`>wnU&`K= zPnCTvFDUz3?pF4xMvt(0B zxBQ}*Vfk1w)AFKXmgND(Y|HhEIhOMkb1nN6^DOHW3oP>#3oYXmi!A*Vi!JRHODy#j zODz=?%Pj>ID=ZlmD=j}MR9QY&sJ6VUP-}Taq0VxvLcQg3g$BzR3XPUs3Qd;P3N4no z3ays$3T>8w3hkE83LTcF3SE}!3f-1c3O$xQ3cZ&9<@+t4%1^L7BR|n{ll&yhnetOC z8|0^2rpr&W^p~G*X(m6zQcixBC7b+g%Xe~fEU(MWwcIZ^&vJ#_0?UbV3oWbU7Fj0C zEw=QPTViP@x71QWZn-75+zQLDvMVhg$gZ+HExX!so9r6PMY3xx`()Q!R>^L#Oq1Pc z86>;O(q4A6rHaoIRm+)D*DPzLu3IKb-LQ0%x@oB;b<0vf>bB)K z$vc*JB=1=smb`DdO7el_B*}-CRg#Y^lO!KodPzRDG?sj3DI@vZl2!7BqMncb4@M?=3SWK3IlGe6)0s_++Uq@!3*b;)^A-#8=A);@>QHh<~@7 zB>uxPNBpOyoA_@_Me#qDf5iS;-Vpm|xkc>1l%s{%1bD?c$ND_t>WD;_Zxt2d&o zR_8?7tTu?UTTK?_uqqYhw2Bbrwz3iBv62_%wPF_Kvw9)IZ*^8gz-qIIpw&zfA**^3 zVXHI|5i36tF)K3>aVvQd2`df}Nvp@gQdZlArLDS!Wvmi}Wvxtw<*c}b<*gnFDOhb2 zQncz7QnE@BQns=YQn3;dQnh*~sAhFsP~B>gpoUegpr%!%pq7=npthBWppMmN0bQ$0 z0(w@P1oW*Y3K&=w3K&`i2^d)!2^d=m3z%5FMd7*)dsFWs}imtD{HP`D<-ZGt5ckz zR+BixtfDx>t&}(;tX^|OT5aWsvTEdrw({qQu~OiOwR*uGYc+vA&dQ2C-s&}5g4H~> zB{WGha#6s!HLDORPdsaD#oX;x2I(ybP-WLU+rWLn9yWLZ6A&bC^_oMV;FoNJ}e zoM-iqDc|Y@Q@&L{Q-M_?(`w5Hy2~uD=`OT9qdUj)knVKLow}1O*X#CLF4OI_oTJ-f zIa#;CvQxL(vO%}pvRt>=GEX<(GF3O*GDbJUGFUgo(pxvd(n&Yg(o#3l(oi?dQbRY` zQbE_>QbO0qQb5vBV}2jBVn1TBW9VT zBVrk?BWxL>BWUTXBVg&K!)Ix)!)s}w!)#!)Wrn4Li$bl}7HL|qEMl}? zSp;gmvT)OSWnrWB%ED0VrG>iIOA8sTmli@=FD=-$URwOsd};An^QFZL&6gJUG+)Bc z^x3cZ(qgOTON-T-FD({ozO0S^QA?z=1Yr8&6gGhnlCNVG+$c8Xuh-v)_i5* zsrkynUh|cOndU1CUCq}P%9^h&q%>b!2x`8zVAp(O@lWH8#aE3t7H>4(SUlEvYjI2C zt;I!+w-zTf-dXI|cxSOquC6m&ON+MvV^^l^P!{3N$`i zWN3V{h}ZaJ5w7vc!cXI~g`37_3pEOa%#TBvG#wUE{LW+AHa&4O3sy9JxZ zcZc1`4tN*rGp#H~VqWWKpCiTA-Me6@7lGXoPgsA_w za8+lpG*f4^R99!Tlu&1~TCw~SE}u=Gy^5oyiHeh@ri!zryo#%( zh>Dvfmx{aPe`OELSIVB2SCzdi4=8(Eu2J@}oT2P%*`n-cnXl|`8Lb>(>7g8GX`&o# zsi+)c$*UY{`AaFx^0`vDUnDImMa@}JCR%hxhnEN{wewLC7f&2pQ} z4$CDnJ1r;6?6Pc<*=<=Uv&S+)X0N5c%zjHdnFE%3G6yYXWe!>L${e=*DSgE9ru0$E zUDC%aXG@>3tdTxx87Fv4(R{Xo=Pq81CSHyl=ZWQ}v*(dhfGDqx> zrI*-WOHHx=mKAuDMSVJj995v$w6qE;J(#jIL|#jT=* zC9DjDrL5S5rLFD?$yjX>lC|mLZu8)kZEK zt1>QMD;q99D<&>~tJ9nTR#Q0xt>QU@tTZ@-tv+#tSncHqwd&vqvkKz~w^HGVuzJfL zX*HES%F3QS+UhM^jMW0RSgTOBI4f?pc&j6<30BptiB?9eNmj2|lC74rq*$f0q*|%4 zq**;@PPbacoNkrNoMC0coN2|toMm;EDcfo?Q;t8YD)>7biv zX|5Y*sjnMlsiqrlDW@A^DW)4}$*b#U$*SvR`B%ro@~e)k+j}YPny>$a1@mf#n7rUCR|Z+LjA-G%aW9s9R3bQMK&WQMPQ>QM9blk+&?> zk+sazk+w|Nk+e+E5x0!g5wi@^5wY~v5wdjA5wx_`;kPu?;j=W*;jz@z;kH!L;j)y` z;jk3dVYlShVYB4WVXwEtOb*Zym9`MX>fa3wQ0W7S`HdEcCU%Sg2@!wvf>NWWl5T$$~-q zqs3RP4;C-AK3Lq%GM>t#=l?wcc55(0XUFRO_w9EUmW|{aSA{g}de}3p>qM7ABgnEVMOWStx40vXIbxZNabk+Ja5iwWw#EgIDSSQM)Nu}D(? zYZ0ve&%#ChpM{zFe+zYW21^Nb21`zLM$2DnOqQ?Jm@V(Bu~?o{W3}9`#%8%ujoosQ z8i(Z+H7?6GHEzoaH6F_>HD1dYH9kv!HGWG+H33UwH9<>NH6cq0HDOCGH4)1{s-l+f zRmChHs)}1)QI)hjt}11@Q&rk>jjD|0d{tS?Nvd*|t*Y{tm8uGsIjV}5393q#A*#xj z9;&LA)~afj`l{-d%BmWc;;NdK+^SlZ|5datzo_U~zEIJ%ysM&bc~Ql{@|cRDTXTWYH~ zSSqSGT8gPSS@NhjTQaJ+SiVQp~c9Qp~pWQp~ZmQp~l~R?N4QQ7o|JRV=jpr%+`1UZL3XfkKJpMTIiU!wTh= zTNElRmnu|RPFJY1>`p!{%gwjsm0Mu>Lw2F%W7$QP=VTXK z?v!0(xkPrUn)$iY_Pm2 zv&nM5%x24VGFvR?$ZWOjmf2=mC9~Z!OJ;{Wt+wsk4?{ zQs*r5q|RFgOI@(Ekh*9oD|N||N$QH_3(2dN=OnLLZk4=lIa~6EWwYc>%WTP8mLZaN zENvz4TB=Fjv*ee&Z~0T=f#qX~hn8n09$9Xecw)Iw;;Chi#52n>iRYGy5-%)$C0<%u zNW8LCk$7z>Ao0fXr}$gT%i`}W*NVTl>=6H8nI!(v(pLPFrKI?0%dcWzEH8?EwOl9m z&9YnUyJd#h4@)<(pO&g(zb#qC{#ZT{{cCwt^q=K2(f^hmq6}8qqKsC4qD)rCqRdv} zqAXUwMOdvKh_G256XCF0Ey8IvNrcO)LWJ8YL4?Q3U4++4Uxd#}LWJLnK}5jnim;&7 z3Sl9uT47Vklp)dm4|tBC>{Rz(7uRv`jfR%Qa)RuTd_ zR$uvbt#^Q*wpIsu?5t+;*jp9yI9Pe{I9jRjI9W0BI9u)GcCo7BcC|9+ zcC-4%CZ#1?L~kS)S0oGsFdmo3WbC~LG;J!_1W1#7I;N0vCN zH7xN~*(?cGnkYU6!r7ZI(5KI$D)iJbOrlW5;Uq{z+x{j9R1RV{_P8~JNMjaK) zDjg-uVjTs`9345!R2>=1I2|d=a2-j@03C5lPaRQ9Cmj(>YaJm=6CFWIJso~absauS z1sxtsDIIQ0VI59OUL6igHXU|L1|2rb&)O`O&$O8>Z)r1Gp4DcwJfO{BxkdZG#d7U` z7PGYfTJ&lEv1ru(ZBeTI%OX?zr$vnR4~qcp?-nlF-z_Y(zgg&Lf3;B1{$e4j{l$V) z`?JMgtxp!8v_4rp)B0#}OY5V>d94o?hqXRf?9h5|u~zH7#UibD7SpxfS@dYVwP@6O zYf+~4)*@T$jYXo?8;dZlHx}MnuPq$4UR#)Hy|&QNdTpVo^~yqA>y-tM)+-AptydO5 zG+$Y~(|l#|So4*|P4N9aFEP&anXCEIVzTB-i%!j#7WJAhElM?CT4Za!v`Er?X%V6M z(!yW!rG=~JOA8y#R~AN^uPih*Us=d&zOoS0d}YC_`Pza-^R>lqjn@{RG+tZ0)Oc<2 zK;w=@jgJ;C8XqleG(K9GXneBJ(fDMctntZ0TH~{Yu*Me) zZjCP%EE-=eeyD%7c%lBy;->mHi&N^~Eq1H_uvnx1!(y)bPm4bFpBDA%zbp#We_JG~ z|F#HH|6}2z{>Q>p{jY_Z`acVC_5T)}>I{~@)EF$^s4-gJRb#R|r^ak~K#j$6qZ+H_ zVl_6)DQX;+ZEBpB6>40TS!&#tv1&Y){%X9Ij%s|CCTjeaYH9+Ol4^pM+-gFW|5Sx7 zKd6dWK2{aAys9c@c|uj(a<{64}+{T*~N03va97HWjD({Wp~R;We>|VWlzf> zWiLy6Wp7JuWgklkWnW8HWk1VLO8%Djl>#i!CODWn?LMg_QT`AV`n_`^hQ^k18D~bu0hZPeoHz_7rE>cXkoT!*$ z*{GOmS*Vz1nV^_%8K9V9>7bZpX{eZOsic@=DXf@l$)cEN`Bfp`@|i+`<#mN3%aaPl zmb(;6EY~QMTFzA{v+P$Ww`^3Xuq;-nvP@B^whULOvGi1^wX{~Kv(!^)uvAcJv=mlo zvSd?ew)`aDVtGTp&2pc7yX8{(4$E%&PRk~IeG?Lk2sU)-0Qb=Z( zC6mk^%O}!%Essd=vs@~@-?B~mfMtgCK}#>`LzX(yhb{S~k6M0`I%auQ>bT`jsS}oS zrA}HlN}aMylR9nbEp^7yKa-HO5%c+uAENdjMTBb-| zv-Fj`VQD6L(^6jYmL;d;ZOcy*cP#Hp+_gL|anEw2#C^*-5)UlfB_3H8Nj$cUm3U(5 zA@S7GMBZtq@_c>JwqLDivX~iVI9 zS{)ITvYIa_ZB->GV-+qaYh@xRXC){oZ}mYy!Row#qSblQ+DaHLUjWYg)DPYgzg7Yg>u(>sa06)3sW`r)O2lr*GxTXJ949XK3}3*T`x= zud&q>UK6VL=61CD$>n6Vo6Fg%hRemuj?2}GjmypIJg2+W3{DTLWKK^jeNHc{-yGgn$2okg zrf~RLC35F2VpF>nM}EoKk2@?sCN`pyKJRdRU>PJl?`j8 z)pwRCtBowtR(UKjR{AV4Rv(ySt+q19SyeH|TiG!uSTQpvT3ujDvYOA7Y?aBh)^d;T z3d>Epi!E2^&a<4aJJWKi?i9-&-3gY>y4{vly6u*Qy3Ljux^c58x@DHWxiAl|)bX->sN-&V zQ^&>fqK=d0DII&uLpnB=yL7B9H|v;NuGTTNT%u!SIY-C9a;lD=WuK0YWxI~1WxbBN zWrdEaWucC;WtNVjWwMUEWsHuTWvGsfrJs(JrMr%VrGt*RrKOIjrIC)XrH+n}rK*mA zrMwQmrGyTzrJxRvCASW@C5sNH_Sf12ow%n`DWVu0`(Q=74 zgXMJX{}x@^|19dX|5_Ak|FKBb{%sMd{ma5v`=^DY_74kF?H?AJ+TSf?wZB;iYJat0 z)BbAlOY4ipJFU+akF`EqT-W+!aYpN-#R0947F)GGSgg|eU@=eYy~Sj$_ZFR6?=0%H z-dPlDy|c*BdTSA<_0}R->#c={)*A~utv43NT5l{gwO(7uX}z`((RyvcrS;n4zve58 zubQtcUTeOxc&Pcx;=1N5i?f=qEDmde?(adI>4Ut^uU7M=MX}~fi%iXz773a!Ey6Tk zTKH>yjgJ=E8Xql`H9lHMYkaa0*7#(> zt?}7{S>vHAPM>QTx6E$8-H8nmdJgF*bxkpvZa=og!Qm|8}um|6O(m|ME4SXf%ASXvsW zSXrv7SX)Y~*jNgv*jlow*jav8wzqt&>|l9L+0k;BvXkX9WoOGt$}X05%C45#%5Ik7 z%I=oV${v;m%AS_8%3hXS%HEdWm3%CpDEV4mRPwXjujFsJMk&B@mQtW)hfsnGF&m$(p@pl(p)j!QbRGrQbIA)l2b9u@|Qxk2ZT z&XPx=-txbEgXL5CM$0qu&6b$SWg*JpW9uHSN%+yu)hauY3U}V%W}5#Zp#|!J(h9Odo3NL_gN}QAFyPVK4|$;>X79bsl%2V zq>fllkveKwDRs;;PU^U&v(yPo4XIO>d{U<^zet|3yd`y~dMZdhKExM_J%;+ExViQAUbB<@%?O5C-~mAG#i zA@RV{MdG2Qfy5(A8HvZ191>3~Ux`1pJR<(ga=!R;%PR2~mZ9P=Ee*wAS@Ma$wtOx2 z#`1*NTgzo)?<`xy-diS#eXw*C`)DaI_Q~?U=x57&qF*idi+;0QAo|_1N%V(his(;E zH_=~~TB5%#`9%L%eir#_c|+u%zX_YU`W#uBwZ6z(tWA#~x*XpzopVbl}eychm0jmfhK`Ub+VJluC z5vv!1qE?3m#jNHFid$6)N?3&nN?I8UN?8dCN?W}bkg+;1AZxW=K+dXPK;EiAK*1_l zK+(!fK*>r{K-uaizlzlXepRauel@E=eswD;ehsU~e418k`LwJm`LwKD`LwOX`E;ya z@akIa=GC{F#A{%c$!lokz-weB&TDM-j>p967>}vdJRUQvavpQ5KpqP#Z5~T2HXbXh zL)_L@wcIvVHr%#Wf4JNJOk)eH_#t27QTD^m_{D^?C~t99%?Rzd8(R)5(1tX8r4TSc%1Sn;w2S{-K%vT9@v zwz6jpvHHytYPF3e%&L$j+{%b0!s-iiq}2}QD62Z=Xe%e?Xe)N+7^_Q6u~ti%;;izS z)>&@QU1_;YcZua(-T9W2b!S<2=}xt5)SYNquG?dor`utfs@q~2qg!toqFZh0ty^yC zq+4uhsas%asGDP{p_^f;pqpwbp_^#QuN!B{t{ZLnUnku1yH1GZd!0bb=Q@6t_jSB2 zuj_bNp4V}+JfY)kc|ga(a)*wcR1i<4TPE%s`Cve=~c$zr+IM~gXHA1x+meXwZL`e0G5 z_1>aD>%B#));o)6t#=jyTJJ1ewcc7-YrVBF)Our~ruD``M(d4*pw=4;cCFVIe>GoQ zeAawz@j~;p#XZee7FRT1S)9^*WpP0Bl?CYjo;8}Ukk0gZ30~({t@+ZTQ1hilI(VJm zON$WAmlocdFD)E3Us_mbzO>NOd}*Po`N~2@^Oc3L<|_*>%~uu-ny)OrYrL{}r}4_- zsm3ddI~uPou4ufrIIZ#8;*iE`i=7&;EjDPpu~?z;#$vw48;j{0Z!G#W-deP2ytSy+ zcxzFr@zx?ojdvEo8t*K;HQrk|X}q_v(s*xSr19QDOXGuulEw!MDUFX7 zLK+_}xHLXlFll_U_^STd;;H&)i>vBiERLyvvDmKu)nbMESBshI-z>V+zgbkPf49h0 z|85bd{=*_b{ilVa`cDgE^c1?+)PGyBtN*e1srJ|6wc0<6J8J(e&Z#k29#CVn z+@!{2xmbDweNRR4pHZBoDms=ERdg-eRP-!sRP-$iRSYcCR17VnRg5eHRZJ}1R7@>x zRLm?5Rm?5bRV*xJR4grpRIDsHRIDw3E8AE;SGKjhtZZkwPubpbm9m57bY(}&W@RVK zd}U|L7-bhr4`mliQ)O36C1p2Der0#dKS~~!FO@tkuPb?39#QhP+@$1Vxj@O+vRBE^ zvRcXCGE*tQGD0cP(oHGI(o`wfQdud)Qb;M(l2Iwl@`GZyH36k8@Mlvsu-lv;Wylv!FSlw0a5 zR9Y%1R9OlsR9mtt)L4F$ueH1(UuU^bzTR@Fe4}NLe3NCde6wYge2b-%e5<9Fe4C|^ ze7of@xem+6a-EiEF*V12ho~4cKd`nH)1(ss63oTh> z7g>IkS!{V_nPrx{WtLm6l38InLuRFAyUZ%fGMUwusWNLULuJ-ly2z}vG?7_v zsUow{QbcBxC9BM4%Qw{7=q-%6gayexUra+l;O%Y~As zEjuL7SQbd0wTzHFXXzk$!BRu=qNSkZCClFumo1-4T(LYaan*8{#5K#M64xy!O5Cul zk+^A@A#uwxSmL&&y~G_$ZHc><5)$_;StK44ZuwN~h2>$fmzE2~URlMyt2N%vJ}4S*)fAvsz^evsu{*vs;M>b6C9=;Mxh2)qXB3t41zsD>p71D{d}ZtBag=Rx>&6tx`E1 ztPD9Ft^RX3S)Ju@wwlf1VwKI|YGuXYX2r?jZnc%&!z!BH(~6PZ(`r4NmsK2_w-rB| zkJT|&U#lioKPx*{f2+SN0am+M01R^52ZzdA9NUv(la-|B=~KGg}b zysP7Hc~!^9@~n=RGa5 zxAsqq|5`sRzG!{7c%k*p;;z;=i;G%cEskk@vDmHk#bUkIXNx6TpDbo-eX{7&`e@Ot z_0gh2>w`tE)(49ut@joYTJJ4OABSqmljf*FD(Q$Us-TyzOwkQ z@yg>OPEtaW&v6!y@ z#iB#~t3{>ySBq@*Zx%7?-z@ypzgyU=f44AH|6!r5{?kH4{g(xs`Y($gYQHUBsr|9I zqxRS0tlB?|{c8U$HmWgLE>>f-oT|oT*{;THS*gZinWM&P8K=f(8KA~)>7>SCX`;qy zsjkLlDXGS7$)m<&`CpaC@{=mBF!ZJct($Ys&%F;nq+R|86#!_8X)>2wk&XQkM-jZ2W!SaWSqU9SE zCCi5@%9dAER4h-as9Nq*QM25vqHeiDMZZB}6&=eW6c6%$K26;n$Q6*EgN6?4n~$`+Qdl`So=D_dC}R<^cW zuWVyETiMpKUD?jEMA_alLD|95SJ~0hO4-R$UD?@EMA^lXQQ6hmmnwN#PFC`^Y*g~G%vbWYj8*cp^ilG&v{Lf7)Km(vlu!z^WLFBZ{H7Re`BX8) z@~UE} z+bngZw_6HG@38zVwbSyt)Go_iQoAkZOYO02mfCBXA+^uaSL%SJvD86JNvT7Y|0NGw zK9xLTc}DW6~TQ*6au*{M?X&ESa%F;^mw55{dSxauobCzEv&RgD-xL|ow z;-cjiiA$FAB`#ZbOI)!mlelV`Byr8sPvW|zwZsieb%~pnA`-VO86|F8-VwiJxlR18 z^9lJ-3V!dtqrQ_R>;P?3Lv& z(btx@MBiBM7JX|uNA#U#t>}Bpc+n4*PNE+zRYgBpa*BSod?WJ3@}kIB%k3iHEa!@R zw`>vlVVN!R(=tfpm!*}+Z%ZYSKbG7ge=T1K|FhgB{NJ)qn87MZn9<5Yn8}JynAz&7 z5R27bAy%ttLTpxrLL64!LY!9WLR?nNLflpl1bM9X3i4Xb66CY05ahQC6%?>C78JA+ z6cn<0FCc7nPC&$Joq(uSpMaQEzJRz@pn!yxv4EtNxPX+^H-2fW1N<^pUHr0Eq5N`I z^8E5vulW?Lw(%)iHS;N1`SU4T$?~aKz2;T5+QX}6HGx;%Duq|W%8FOhN`zO->Mf79 z)o~sjtA#weR@FRuR-rulRt7u_{tp0JCTJ7gDvuffpw{qjM zu;Ssew7SA+Wi^}A+A4+9#>$Y>*6Kfpoz-~`d#iaI4pzAw4pw#?j#hjePFDNaovo7C zU933SU9C2;xmhK%xm$^_c~~81^|Y#I^|G>M^|t!W;$yX&#n-Be#n;N5#n0*ov%l3| z<^Zck=0Gb?<{&Ep=3uLvOd(b)nL@29nbup*&|PKOue;Q;O?QE1jqYsAV%_PMS-O)f z6LtG6BXqkg{dHR{-E|u+?R0A`O?4|Rb#+TERdkCiWpwi_g>|zmxpmVmnRSybf9oVz ze%6V#e615@`B*2+^0rQ}jAwOp&?WVuww!E&CCt>rWw zYs-Ee3(F22Gs{LD6U#~+L(3u^eambeUCR_5ZOd34P0KJHbxVI8RZ9;YWlKjLMN2Ck zc}rs*IZIs~8A~-CDNA`B2}?;GaZ4c`QA-{j5ldDbA!U@y)(4AFtq&GnTJJ3!wBB2oYQ4A6)_P~5sP)c5 zOzW)$kJeiYCat#?KQ!N1yw!YT@mTYX#ZApO7UwlzTO8GVZLwSPwZ%rw*A^=@Us=r4 zd}T33^OZ%H<|~T^%~uxXny)N!HD6jJL)ZBQXuh;?*L-PVtNGHxMDwMEmgY+fMa`EM z5}Ge9_%&ZzuxY-u_^a{C;)}*Bi`N>jEFNjRvbd@7%Ho2?D~l5vuPpX!yt3G)@ycSI z#%qhE8m}$pXuP(VqVd|ITjRAwv&L(SYK=D*MH+7`vNYaUBx<~|h}3vv5vcLj!c*g| zg`>t>3k!|676uycEHpIUStw|{vyjkuXCa{R-hxBpy#<5D2aAvDA1ofJf3&!y{?X#F z`X`Gm>Ypr@sDHAUs{YxcP5rY)x%wB2O!Y4oQR-hUeAK^M*r|WB&{zLvp{V}dLRkHW z1*`f`i|=YbEnceqvbe4G+v2R+AB+8Je=Rnu{j*rC_TOTv8iQrK8lz>U8k1#?8nb1b z8jEFs8mpzV8k?o58oQ;s8oQ;G8iys18mHxdRW8d22~NuVpUPgG*vOnC{=MwKUE1!M^#BnQ&lNTO;u@2SydTJ z0aaN`7F9XRpDOZ}Z&eg5AF3!?UQ94Mw>+k7VYyk^(sI7Cm1VcGwPm@ojb)0mt!1FHou!?!y`{FYgQbMBqa~}d zqvdBMC(8#)&X(ttTrBq}xmvDLa*R*bdOQH-;cRgAafRZOt_r;up*ULncyfkLw7MTHd0!wRXETNKhPmno!M&QQp- z>{iIKtX0UiEKta?Oj5|T3{}XpbXUl?v{ERv)Kw_5lvgOW6jCU$WK}4&{3u^$d0oET za-V#KpXDjpe#>pL6D=3XPO|Ki zoorbpJH;|xcB*Bt>@-Vz+3A)#vNJ3tWoKHl%g(a=A~W0ak<1*+3o>&p_sPt&Tq`r* za<GhUX(i<#er8inSNN=)Kmfmd1F1^L_mDEz?Z+TDhfaOuigO+O~4_Qu;JZxDbdBieV@~EYc3sMr%rQ?aL(qGHc1zllD#ye|5}a);y&XQg9 zz2$3>50)21K3Z-S`D8guFD@7qztG|M5R<{H>tab=; zT1^w=vMLeewh9*Hu`(3owGt5IvwAPUZ*@*Uz-q04pjDrMkX62buvLJ7h?TK`sFj$2 znAK-~ajU)j5?1Z}l2*a|l2-EkQdV#Hq^)-H$yl}V$yx>T$yq7!$y_5RTHz1l{d4ml?bz+)qN&^tJO>aRy9oPEqirWSvKn~ zv#ioxXj!N`$1+2Ax@ElXWXmw!eoJ57E=w2PHcK1bCQD=8I!kTcDoZ8ZGD|7lVoO2Y zd`nKMRIzE=0bUZCr z>$q7i)^V|%qvL2fMaRyvSI5S(O~=ZzUdP$}BPt#1}9wZ2)*)B0*LS?h~Mht?O1TCL9(MOvRN(zQNW#ActNGG`Mf0V_Z;h80pEO=tywrGU@lfNH#SM*D7UwlySsc@NWwBS| zmBm(#R~BnDURf;Bcx5qLs`-r|A! zdy9+eA1n^4f3Vo3{?THw`bUc?>YprH)jwI3seiIaSO07gq5j#zOZ|(5wfYweUG=XP z^6K9#1l7M;FspyJ_^S59;nie=XH*m{52`3yZdFmTT&1FHIbTJ^ za*B$oWv7aoWxa~JWr>QqWu}UTWxR@}Wr&KFrI(7frGtu&rKyUprM8NmrJ{*zoFQLk*&ttTnJ!;p=`UYtX)a%7sUTlt$su2B`BARU@}^w9 zg>EQ94*E$!smEH&lYEk)!yEdR@PTE3R;vb-kSZFxwx z$8xP~ujNeHKFe0we#;`+36}A)6D_@ECs|s^PO(&#ooXp0JI(UH%yi4QGBYf1%gnSq zDKpD*yUc9Mr809Yr^w8;Y?hg4StK*xGD&8EWuVMLOGlYSmWDEmEfr;!SPIH4wPci8 zX8A;Vh2=5nm6j`{S6OyTueQvSUSk<3z1GrHdYz@D^m@y`QX4EEN^P_}Dz(XSrPLP7 zKB=viMN-==!=<)c+Dh%PRF>Ll$tAVR@`L1V%j=SREcZ$7wOlH>&$3r?zh$Z90n1p) zLzZrmhb{Fbk64OJ9<^kUJZAYy;<)7%i4&IlBu-kckT_*IS>m*1ox~Z-EQzz0;S%R8 zT_nz18cJNSl#{q<$t`io@`Lzg%hTdlESHO4wQLr@W*IMj!_r#(rlo}VEz7TBw=FM= z-Lc##cGq%(*gea9vHO<(Vh=10#2#7-iaoOYB>LF$vgi}bt)fpYr;9$btQ38286*0_ z(q8nXrIP3?OIFd>mM=x#Se_GkYq?qEo#jlC_m=e{A1u>EK3e*Ue6lnZ`D`gC^2L%( zWUz<)h0m}s|kXvRt17=R{nzQR(gUQR(yh-R__G3tj-B=Tdfn|vFa1xwaORZ zvkDO4w=xnCuo4pxwEE01WVM@L*s7IZ#434g*ISs7la2i^ra~fG0avEFx z&3n#FAaN!1BLNj^%fqOw0E=sg}=mk}U7*#9Ln1iLpGd6KQ!|C(LrcPO#+; zodC-XI=+@Gb-XMW>bP6Z(s8w%q~m1St>a+XqGM}Wt7C0hs$*f9r(to(pH<<(ombpQdOJLQc|12l2`k`1(Wtai*H(gEnaE;vAD1G+v2j; zFN+geKP~oZ{j}Jq^}}MB)_059THh=tXnnJ2)%t2trS-)kU+arSs@7+VD6P*H{#u_b zT(v$~SZRHWf8CO+9F)zwS~XNYYTUc*B15~uPw|qUR&sCys=Qzcw-@_@y0?-NFBbgjUo9Bbzgm1z`)2V>?YqSdwI3Fz)P7p*Rr_VJUhTKV zLbX2@Q`G)gw5k2Is8suBk*)UMB2JCLGC+;d(pink(oBunQbUc!Qd*70l247*l0l8l z^0O+tWGv6B$XXs! zk+a;UB5%1`MZt1`ilXII6(!4V6=ll?6&1@;6;;bD6*bEQ6*bFH6?IE*6%9)V6-`Ss z6)j606>Uo;6&*_n69WQrXq@qkN0sa>H!Im&E>v=`>{oKM ztW|Qd%u#Z-j8<~7^ip!Qv{Z7l)KGG_6jyS$WK;6A{Ho|>`Bc%{@`|F5!p`lCP}Zbbd_FdsVTk6l23ZI zRVw>&TU zz;dJLL(3_mk1WeXA6rI>KC!eFeQK#7`pl9=^tt5=kr$R{MP6EN5_xGkL*$iZt;lQ3 z6p=TU-Xd=;jYZyB%80zTWEJ^fd0Y6S_Q>#*TGb}Yj>*~zMn z+1bjM*~Lnd+12U^lbh9gCU>iPrVW;5x~na7b(dSF=q|F1)}3n^q&w5nQ+JA`gYE=N zbKM?GeccXAHQg3VIo$?JG2I$VUfl{yR^1ZIzdD7MUv+XV-|A#pKGjLHysMLJc~vLD z@~lp*civZa)c zqNT8oyd|%WtR;2i&!4e7P8!;Eoix1TflO*HlJm` zHm_xqHjibQHkW0VHm7BrHiu=9HoK*pHk+lDHmjwcHnXLYHj|~8Hlrn%HiPAVt^XFE zwfKN_%_3Lp zt3{I57mIMMFBZO9pDmoUK3kY;eX`Ki`edQ3_0d8?>!Ssq)&~m~tq&HzG~Zi%(0p(4 zRP&w19nE(Zmo(p5oX~u0u}|}@#TLys7OOPhSS-+dV=-OxjYY5KYl~*h*A`WpuPq8R zUs$QFvPjc-Wf7K`pE)jwKjseiJNQU7GYr~cW3LH&!xC$+B@Pt?9zTvPjIaZ>HO z#cs797VFf0S}aieWieUpw?(VkABzgLKNi_)e=TCw{#gX5{kL#dW3V(+W3<#zW3rT1 zW47c|W42^eW3l|A%4+#smCf>&D!b)bRSwGos+^XaRkT&N;vIZZ|0vPVV1vQb6RvP?zEGFwI2GEqgvGE7Cq z(nm$r(osdt(p*K|QddR8QdvdQQc^|Bl3zvJl2t{=^1HIG9Q zHkM13Y%M1%*;zIz*;y7U*;~ddIavBBIa=B(Ia%r`Ia^9Axma>5xmx~GbhCV==x%va z(ZlkjqNn9fMK8;hir$tp6@4r_6@4u$75yx;6#Xru6ay^16$3486oV{v6@xA16hkce z6+st{#)Tp`+Wr$UV7YK2(KISO%>eG2iG4GIaCMGA?QsR~J! z;R?x?UJ9v}whC#M1`6qxDhe5v;tH9TTnbs1f8?_*AIs-ho|4bC+$5i8Ia5C0vO&JU zGDE)5(qF#F(pSvJU3TV~1CScb~g zTH4FiS!&7ETZ+mxSTe{pTE3BOvb-VNYKFfy^ z`z=pP9I)IfanN$U#39QriNltq5=Sf(C5~G9N*uGalsImwCUL@2SmLB5qr@r8`{Ji9 zcZ;8~oGyOWvPAs6WuW*4OFi+6mOSE@EMJLTwmczr#d5jWRm(Q9YnG{E*Dc+|Zdj^` z-LzyEyJh)O^tR<`(L0vwMDJQo5WQzvEPCHET=apZmFPoDInhU!%%YDipNl-UJR|bN za-+yo%jqJ|ENexcTPBOVu=EmnX=y0(%2HC~wI!3t8_OHQZ!Omdzq70tes38p{J~N~ z_@m`Np-+}qg+5!Z5&B};BJ|ZVR_L3hnb3DjL7^X(Zv}r^o)r9LxlHi4Wvk#H%M`)C zmM((-EL8;mTe1l;d{*1}_^sOc1gygO1g$jqgsgt?3R|7#6|tJjD{581D`w@) zD{dvmD`EATN7CvrkCfFM9%-v`9vQ1(9$70x9yu$19(k)<+zM9HxD~B}xs|MhxRtFg zaVc9(;!?2+=2Ep1;Zn1@!KrRFk5j`cjZ@RgkWxsk50{U1K$~>Si^wa$+^N`o&^lwS~pfs+h&f z%96#}>OZrM)nR5^t9E8Ps{m$uD=B6Nt7lA(R-2fdtQwd$T4w34u}sumZW*Dw$TC28 zo~66)OiMf6sg|a?6D@Uhdo5LTJ1k{%TP%fj8!fqYYb}{|D=mNPlv;k)DYAU6lV|x@ zC)@J2PP*k~ofON{I*FEtb>b{{>qJ{_(TT8JqZ4YmR42%Cu8zOuG#wwyJ{>R1b{%)i z1|1j6N*yQ5A{~3nEFD|RWF2eE7#$1CP#rT%KOGZGcO4^3M;(1jD;-@+V;yZv9UV$k;1tzQ;XwSHQ3Y5lNh z(E4Ffs`cF>OY56Oyw*31P_3^PURqx)?6tmFm}-5t(9-&Bp`i82LQLzU1-I5m3r4LE z7T+~LSiIHzVDVVTfLGsK2qeqyEO?tomDvz3Oi*)~Ua>n6LiMVuJcRi$?W#7Dejs zEt1vWTZF2=w{TPcU}3KQ!9r90gN3yEM++YHPZs~wK3RNF`)u(@?Tf`#wXYV()xKHm zQu}7HM(w-Be6=4I6V-lNw5a{EC|CP!k)`(AB3A8>g}>Tg3n#UI7N%L zE&0?KEg99AEWfBSTRvB1vAm_qYI#07 zc`UP3c`f5q`7DD}`7GU3`7Nzf1uXSc1ud0Sg)GHXg)O;MMJ)fTh+2MD5w(1-B4&9< zMcnd&iiG7+6-mpTDpHo~RHQ8zt4LeUP?53hRgtx9QjxPPSCO~ORZ*}^Qc<)FS5dO` zRZ+5ZQchtQ_-~isjO-FOj*nFva+`2eq|lYHOjh{ zGnMr$+m!V!iMB%OE8?OGhPpO9Lf)O9dqdOMWFs%m0c_mhTi@Ebl40 zTAovMv)rfXZn;j;!*ZUYr)8g_mt~!zw`IPfk7c}~uVsLupQWRszon64fTglxprxo{ zkR_X9u;q7!5X+Yep_aE5!Yt1ygj?=Yh_KwC5NWwcAwLZYRULXxGaLb9c%LW-q~LaHUdLYgJBLb~NU`3%de@|l)<<+Ci8$Y)#j$mdv= z$md$d$mdzQ$md(?$QM|O$QN4vl`FD*CRc2EUarJ)hg_-UBDpfl9=USMGPw%N1i4B} zZ@DTtrdry`OtaLJnQkd3GsBWkW~Svo=~ny)WuD84;xxw;~nJ9MI(oyV+ zrJ~qXOJ=camQO^lTOJd=VYyQDre%-lEz1JY+m<1scPuSL?^w!+-nC>Dy=VDM^jB6?tS?E%MkhN#u#8r^r)FLy>2e5+ctn8AM)KUJ-t2xkC7rWsUG_%Ru2b zmTJOpE&m9;v%Dnq-g2eT2g^pGkCstFpDay;K3nn$eX)Eg_|@{5;5W-fg5ND01b^fGp?7CJO?7CK$+4QVx+4QZn*$k}iuo_zRu^L&qu^L8d-=(nfcdrLpcbOKshWmP)$4mQuQ%mV&yimYlkcmW;Z!mOpi>EI;a$S-#XMwtT3Q zZ+TNE$MT|1hUH0}RLg@pNtQcx;w?An#8|GzjqG)>jK7tuGcDT3;+=wLV)2Ykjuh)cR!cU-P5I z7tN0ruQWecJkb1LaZU5R#Tm`_7Kb(8TkO<)XR%)MoyAhkw-$3W-&#!4d~4C6`NpDN z^NmHR<{OI~&DR!5ny;aE_r0=k(|l!Ni*cSG@;bkl7GE@8TD;bHY4KR&rNu3cmlhW_ zURs>ccxiD!w-Qy&5kqS~Xr;)M&i4DA9Onk)!d_ zB1Pk+MYP6Ci(rkH7Ty{!Eu1x8T3Bnmv@q6qX`!w0(n49|rG<>fOA8T=R~9@PuPj(J zURnH7e{Jzf{k6qy_16|>)L&cdQGa8xR{f2|JoPsg{pxQm8r0uf6so_qNK$`i5v=~s z!d3m9g_-($3k~)67Lw{8EV$J_So~G{Xz^a{lf^@|PZpQeK3g1B`(m*}?W@IVwQm-4 z)xKFwQ2TDttoFmAOzo#drrIxyXtm!KermrhoYekUn5zA?&`|qlA+7e`f=`XXl2MJp z@{1~?<#Sag%iF5VmgiJiEDx%(T5eHgwOpafW;t7x-LhYm!?H=0)3QvJ%Q8!q%Q8-t z+cHR%$I?xe*V0Or&r)BN-%?psz*1aQz>-H*(2_w_$nuMdu;oh?5zD(OqL!Cb#4L}g zh*|Dd5x3l+B4N2yMbdJnij-xainL|3inL{gii~BRimYX_ikxMnioB(tih`w!ih`x3 zilU{yijt+Oin67&ii)M6imD~MikjtbWi`te%IcO^l{G96DQjA;SJtweqpWS&sjOpJ zrmSO`tgLGpsH|scr>t+Ot!!W^scdM;u54)eMajtWk&?0H1tk;9eM+X5Yn99_XDgXo zb}3m{Rw`LoW++)&hAUZFx+z&(nkv~?swml73M<)JGAr3zepYm_e5~kbd0ElP^01<_ zJce5Pf(e3oT^ ze72>9e2%4pe6A&@e4gb;xqQo8as`%0IDY8wLfwIk(cCsy& zInQnIa>WV#y&h&GM7A99F z((^1iq~}|{ky>DRQEH*(HmOCHbEFnqHcKtB%#>PY86dUX(p+kVrJU4COIE2>mTx3i zTV9b|W4T*$t>t3Lb(Yn)2VH(166nmhZ(6S)LX@Y`H@G zh-ItzQOjiUW0sEMCoJW~Pg?#HJ7sxC?6l<`u``x)#LimQh@G>H5j$^bBX+@3R_vnX zKhaB;4@56p9umD`xm5IuWryfh%N)^bmI0#IEloskSW1fCwEQP>%kr_vZOfA)cP!V7 z+_jt{a?i3_^l*h&-{pDE!oNiSRSa3gPFLe!?#-RfJz! z{t|j+c|qv4<#M4nmi0n!EF*;8S{e$yv*Z?fZ~08{gXJN?kCyWVKUvlaezuGj{9wUeLG zs+ph3%8#GfN|K+&>KPxa)fPTBt7blSs}Md8D|J3jt6#iaR%dy+trqg~Se5YdT6yyF zS;_J8TYcscusX>jXf>Zl$f|-z*eaMu*h-&A#EO?k)anMenALP{ajP(H2`h1KNvrEz zQdYCLq^)APWULgpWUZcX%2}=8l(Wj?l((|rRIp;?RJ1zBp=33eL)j{qL&eIDL)A)% zL(S?OySh~^yM~oEyQb9*HZ7|bHZ3bdHf^hitU6XxSaq#DS@o=#S@o^*5-eBf#9A)YiL#uj6K*+4C&aQ_C(yE4$Ir4x$H%f%$I~)T z$IUWb$Hg*1$I&uE$KEnf$JWwY$I8-0$HLN9$IQ}9$HY=!$H-DsN8eION7qtXN83_V zN6V5=N5hg`N6nH^N5%51wvy!wZ3WBQ+VYm?wPh_2X-ivf)0VPasV!kSS6ke2g0`q- zi?)bmg|?7oj<%p>g0_HVh&G?4hc>UJjW&;^fi}0LiZ-XEq&9~ouQt0Sqc)r6H!W7n zS6VEV_qCWUFKaPbp3q{n+@r-{xl!xC#WJmb7PGbfT1?RTW6`Sh+oDSAw?)3zFN+kd zpB7PCKP>#UzFW9zeYddE`etFE_0>XE>#K#d))xywtuGdATAwZcXnwNzr1{C>h2}?# zdzv3Du4sO+IHmc);(+FRi*1_kE!JqhvskS8&SIwKJBxnJw-#-hZ!Kyx-&hoDzOl&E zd}EQI`Pw2}^RTfNA)ZbdT zsK2!^Rex)tuKvzKLj9cum->5)KWgtS-l=`Cc%b&t;*#1Yiz8~EEVikAwpgk5#bS=y zSBpNiZx)Se-z-YhzFVZL{ji8q`)T2;_RGRS?U#j#+HVVWwLcb8YJV+w)&5y9s{Ob4 zqWa(BxhjL@ZB<6gbE-_12UVFZx2iH*u25yMoTJKW*{{lG*{sTLS+2@%nWf5M8K=r= z8LY}>>8{FcX|2j*sjtdosiMkjDWS?|$)n0|$*3w|`Bg>G@|B99EXx$aEi)A&ETa`7E&UXt zEFBf1Elm_+EY%faEu|FVEO`~;Eg2LNEMLkeT3(b-vfL@3Y`IWA#j;aA)v`!F%`!?p z-O^b;!%{~+(^6DE%krOGw&gRqY|9IBIhH%+axE9j2#j(ek;(Cd-Qw zn=SW9Y_VJ}vDI>t#5T)XiS3q|5<4tIC3admO6;=KmDp`5C9%hnO=7R*3-NuHhs5_= z&J#aiSuK9hGE)4IrMdWFOL6fdmfysVT3!`9Zn;(LgymGRla{4or!2$7PFtFbowk$^ zJ7f7v^sMC_(Q}sjM9*6;6un^CB6`s>L-dlRkLYDfL(waiVxm_qe~VnRd?<3=^0>$i z%e5jmEhmfIvaAxhZJ8i)$I@NouBE=nJxg(s`pCq@FPnv;m4K= z!cQ!}3q7?wC-ls6nb32~TA>$~VL~r0^@Uzpatgh+d?NV9a=+kP%Q=GYEGq=xTZRjM zurw3=XelQ6$@06vXUiJ`pDlL@e6gG(@YS+G;G1QNzz<7LfuEMT0>3PU1b$n-XCuwUC#?s+5=0 z%8QrNN`aTl>MIYo)fpZhtHnILR#iNFRv|q6R{A^wRy;g{R@bcd7 z3RXfKidN^@m8`1Rm94bcRjh8Ysakcgsact`saZW`RkxbSs$u2Js%gc>s%3SUMcb-@ zMaRmXMc0afMbGLuv%b{?W&^8mWaMkP&|PV1p}WLV zUw6Kxn(k~%Io;`&V!D$pd3F0OS#`TD|LU|`e${EVe5+G$`BbOc@~%#W$)|S>fmX;-+LmlOnwI~y)h$11t6DzQR<^vMt!Q~#TfuU_ww&cAZ5hjD+R~OYwIwZkwIwVY zwZ$w;wM8v6wS_HXw1q4Kv;{3)wfQYAwfQV{wRtTSwYe=twYe<0v^g#RX>nM7)?&AO zuEl0~M~l_+f)$Dgx7i%$C&d~aA(W~{(qDkwoMY+}=iyW=r7D-ya zEW)*ZS@>xEv~be;VPUTI-9lIEyM?mWHwy`^uNHh-UoBX)zF7Ry{A}@F^RvZM%}*A$ zH9uKg)ck01T=S#FUd;~{TQomdtkQgMu|V^^#dOVg7QLG9ELt?*T2yJiwJ6klYmu(` z#v)GhjYWv&YYT79*A`BiuPrP!UxUx{Q`3B9A*=Zce4ZbV<|_+k&6gIxG+tUDuk*XE z@zUZPc%9!1i@h2zEVgL8uvnwYw2x+{q;L>YiR4fU56C)HnB>{5Sav0D9=#ccIg7QO1PE$Y-?TjZ<1wn$KaZ4s#c z#==?sjfIK&8w)k{Hx}aRZ!I|0-&y=tduQ=h?Y+f)wGS2-)jn7pR{LnNRqd0-3bjub zv(!FY^s0TaXi)oVQLOgOB2Dd^MWoty3m>%~7WQgCEsWHDTBxc0vXE5!ZNaPd$AUra zuf=E8zZTC`|5@Bp{cmwjmBI3mDx>9ARYuE|s!W!1RGBR&sIpi#tFl^_tFl^VtFl?f ztFl`Lt8!Snt8!Xet8!WzsB&4VsB&9Ms`6O!s`6Sgsq$KWQ{l6Gt-^2lKt;gvii)7+ zNfklMeJVnhn^lA@SEz_s&QTGyoTwsd*`^|9S)(FuS*RjmnWiFP8Lc8|8K@#<>82uW zX`>=zX`~`!si7ikDXSu9DXb!I$*H1X$)KWO`9@jM@}{zq?EyLyV zEFIjisJ!jiroioh6rSz2y&?2FqtMjh0tsnk)~?G+SZmrrk1M zrrk15ro+-trqj|^rpr=SrrT0hrpJ<3rq}Y1bf4v2>3++7(i1EfNKdqEmY!^xCOyT{ zOM0rMuJklZLFwt1U!`VP-jbSWxnF9QcJ^z>-I5 zq2(9JMV5CZ7h4{cTw=Laa;fDs$z_&xlFKdAC0AGmNUpTBlw4)0EV#~M6Oy+6uD+uA#&X^LF9&|yU0yTJ&{|MVj{OK{|Vo=ydZqXa*^;|%TnQc zmY%}*EoFrtSbi3IXn9)bk>z5c$ClMXPb@=(o?7Y(J+ovNdS>}Z@VVta!55Y@1z%d0 z3BIxn7JO}KB>2WsNbs%YXMuN?R|MW$ZWH)mIaA=HWwpR3%Xop$mM#KcEHwqbTJi~e zvwXq--EuSk56gP~pO#+yzbwW0e_KA``(wF@@2_Pe-#^PhzW8~{qTB*jH@F0?W^)Ny#d8T;sd5Qhz2+3L+QcbpRmCZ0<;W>+#my;Ub)7@fYB7hD zRS}1@l@o`wl?aE7)p>SVs~UDWD@}HJtJ`b}Ry}NrRyJ%(R&QCAt>&?+ScR~vTJf-| zS)F82vua~ew{m0AuwrA;v^veKWi^>u+bWt_$4Zr1*Xk3Kp4C1keXAa(O_p}L>nu%m zS6b@oF0oY6U0^ArJI7L3ce*9F?qo}5-G0m8I^C9^b=oao>oi+F(rK`~ty5!pS*ODC zv`(qzVVy$D-8y-eTXeE5*XU$eF40M`oU4;)IaMdlvQH=4vRx;_vR)_5vO*`=vQQ_$ zGE2wTGFivlGDgS4GE~RS(oe_P(p|^V(m}`G(o)C9(n!b3Qb)(aQdP&yQclOjQbNbj zQcy?Vl3PdDl0`?`@{hKb<$G-n%SYO3mRGe^EKg`FS?<G7bSUlGJ zY;jZbv&DJMPZmctKU(b8{AjUJ^Ml25%?}pyG~ZiH(R^>wt@+NPQS+Teh2}epJk7Tj zshV#sqBY-G1Zlpp@YH-`;h_22!W?>UuZrd?3u&bD{1`P~!Pogc*LZ1h4{4p>5seoX zyER@|Y}R;Tu}b5G#UhOt7Be+oSWMJ-VbQ7a!lF^*g++zNbBh9v=N1_n&n*%(o?Ap{ zJhuqYcy8gL@!Y~eesqw;sQR9Wh7xfnw zPt{*oTvLBxaa{eS#SZnC7Aw_XTFg>^Y0<6z%A!X7l|`QVD~ovbR~7;4uPvO^Ut1Wf zzqU|Se{CVA{>Fks{f)&hwYL^;)ZSX$Q+sD|LG8W8VYLqyTh%^TELZzzF;nf6MUUDi zi+Z)s7KLhGEK=0IT7;{8weVK^W?`rH-NI1qhlQ%z4+{ykpB6l7zbyW%{K}_+s(&rcss6J#sQTYxtLlG?m8uMub5$8FC#W)6wx}{&R;V&t=BTn*CaAJn2CK4J zx~sBT+NiQy8mMwus;F{WN~&^N@~LuJGO2P~eplhKe51l^`9Ou&@~R4- zmRnQ=Emx`tTFz4uvYf0UY}uhAVp*#qVp*gjYMG%TW*Ms@ZW*K^Zt0;SVQH%(X=$t? zWvQtmWht*BZ7HfEW67-|Yssi0XZc=P&hoahyyXdH14N~V_o70oQ)E1Fy0SG2G^uV`txU(wQX zy`q)n0!3@fiHbIsjf%FGMT&No$%^)tA&L%`u8NM9=88_18j8-Al8P>t+={N2e-zv- z-zm6T-dFIjyr|%5c|^g>a+`v;jWm}rd z%hElTTcvv~r%U%)R!a9<#z;@Fw3nV} zsVqIol0$m3nU=m%vn)-dW?M>2&9P*bnrr!5 za-QWC$pw~sB^O#QlU!ukC%M?NTyn8xqT~`wFUh5r#*)h{WhIwevP-V8{3x-~@{YtR z%i|KOEjLN5v79Th*0NJ#on?u{ddmcf4VJzV8!as*Hd(4lY_=4V*kbule5>V6@okn{ z#J5}ai|??^5#MR)A->B}ReZN4i})VP$6|XekBIHFTq?HTvQ6xOWxCiwOHZ*wmRe$m zEqTO_SiToMYI#ZYnB`W{bl);q=z*n<&_hc$p+}Yv1Rq=O5qx4fL-46(so*oq zAi?LB`hw3b`2=5Bz883Dc|qWncXK63+-cm*2gC&>1N6Ux& zpDow&f3d9M|7z*R|IJc_|GVWwzVDVB_BE zEaLrd>BY-nrO3-@^^=Fm>H-h5)e0UKt41DHt0*2eD`OsZD_$OUtE=1`Ruj27t%A6@ ztVFrFt!{AfSk2+$wMyjTvr^;Yw|d7ZV6}}?(5jwO$jY5l$Vz}y*y=Wih}8-XQL8cz zF)KF?aVrT939GB@5>|EWl2+R6QdW1^q^rv$~ZAvxe1ICQYk@Oj=eGnKoM*>#noZ)?I0- zq`TBoN_T;!pza(?PTd)njJi`Sf9g!I{HW7o`9i0|@_|l^K9<2co|Zm3?v}1PE|zvWPL}36_Lhb^ww78t)|SdTmXupPS#?w?9gJgtkq($EYkXKk*@X6B1Y@4MUd7X z3wN#G7B*VHEsV5&S!ihew2;&KVIi#b!-7-myTyOaZx&xQzgfK2{A%$~^NYoG%`X;b zH9uP%*8F6#Q}dI>dd-g(OEo`Q%+~y1F-h}-MTh2li+auX7Nwf+EOIp8StM(|wTRSw zYZ0LN#=>3mjfI`&8w(T7*B08EuPu}`Ut36OzOoS1L_N>%oyJRxry4IU?r6NUxT5jW z;xu@j-wTUf8ZRt1YP_&msqw;MfyN7q85%Dv`Zb)L&Q}RexczUHyf{3iTHjGu2;Mbg93zs8)Yzk*ogFB2N9Kg}?es z3rF==7Dno?EL7BAS%|8?wqRF(ZShm>jm2xVHx_r*-dbExduMS-?VZIIwf7dw)IM0u zRQq7jt@hEPPVJLLq1q>lWVO#0VQOD2Jk`Eh*s6WCFi`tup{(}ZLR{^;1((_ni+`#= zEk3FKvUsZc%i^Z$Z;P|4e=H8F{OYG)s{bt}s4`f#s4`eqs4`mSs4`h5 zs4`oIs4`o6sIpkvsIpobsIpnAs8T=W zX|Ez?X`&)-sih)esh}cZDW)Q6$)h4=$)qA}`AJ#Y@}9Dc| zG_^deXlA)Z(cE&0qJ`xYMN7+8MJvlPMQh7+MQh6lMH@>`MO#a2MLSC!MSDv*MF&fM zMMq0UMJLP83eJ{K6kIH?DY#mmP;j%{rQmM4M!~~!zJjOaLz_LoV&@x@N z$TC>A*wRt9#8OYT)KW&a%#usC-14VPh2;yGO3Q09RhCC(sx7z3)L1T&sj-|aQ)}5I zQ)gKuQ*W6h(_k4S(`e}=(`0ER(`>0E(_$$s(`v~q(`NZXy2J9Mbf@KN=`PDY>2Avc z=^o2q>0V1S={`$I>3++9QWGp6OHH&qAvMWzt<+@8$x>4+E2O4c#!F4Jbd{QJsUtPR zQdnxHGe84@cknubeak(9 z4=kq(KCmnid}tXc_{dUU@UbPY;1kO?0#7Z^2t2b~C-B^IqQDEw5`mYN5dyC)Z3JFh zDhj-@WD|I6d5iy@<#PV_mZkh3ES>p3S_<-ivb@jt*>WA<7t1=nua^FN-z*jQzFU6g z{b6~G_owA7-d~payuU5odH+}{@cy;@$@ACp63;)&)ja<#TX-0(VtE*?%z2os1bLXP zZgR6&P2py>3gTw966R*Jy1~V6HJ6LSDv68JN|TGr>OCj7)ecS`t0qofD<4iiD=|)f ztA`u{R%0t5x0=W%Vdc&yY4w*?%4!p< zv{f3bw3RHYjMY^ZS*wXGa#les@>aqu3RYK{6|H77D_Ny7D_iL@t5|(!Qnfn9q-HgZ zX|tuK?m9~a-Bp$nx=Stjbr)K)>&~_OuQS8)yUrBLcRCX+pXu~i-qY!@yspz~d0wZ{ z^0-c|<$j$i%k4U4mK$`6Em!CiST5Abv7D)sX*o$J&9X};*|J$D!Lmjt*0Mw=$}(3c z+%iok)G}Tt$TC95-!f3g*V0SJ%hFlL!_r2_)zVDI*-~G}!BRuV&Qejw#!_0x%2Gtf z+>%en)RJAt*pgAl(DJLczU2#TUCZ0r+Lq_EwJZ;5Yglg8R|Zt+6%o5elN zuNGG{zgnEq{9*=N5<6pIdBIe{Qi%{kg?-_2(9y>Mty+)L&R+tG}>_RexdO zr~bmiLH(tLk@`yuW%ZX9qUtX#*wkNH{7`#k@k;Hr#T~Ub7U$I7SR7P)Yq44Foy9V> zcNR0$-dl95eXyui`(RO^_R%6)?UO~A+9wN7wa*qdYF{k$)xKCLseQE&Q~PGYsrJp{ zuj+S;kE%Z`o~Zt`xS{&f;*9Dqivy~^Ew-rsu~?z{$6}7^UyBK<|14Tm|5;S1{}M@7_9Nkz<3Tt&>1S4G^CMMc8$i?XEULuEmUETVEqjzSEUT3?Ewhv~EhCk*EIpL8EiIIEEY+2CEyb1eEZLRxEx#!mSUyuU zw7jNhWO-cC*mAp~vE>Ry6U&*3rk0(GW|mco=9bxt7M3xJmX^MXR+jdP)|Li}HkL|? zwwA(*c9yJ)_Lkoj94ucdI9lFTaI!qB;B2{H!P#=7f{W#11y{>y3T~Di3htKG3Lchu z3Z9mU3SO2W3f`6;3O<(B3ci+l3VxPK3jUU&3IUd!3W1it4Wln=JtC?8@u zQ$EzPQ9jHvQ$E}>NIt^ST0YWJRX)m+Pd?i6hg^*1W4Tz%vvP5k+vVad7s(}9_R1w% zmdhnsCdnmP`pP9+TF9kXs>r2U^2?=J{*q0%d?uS=c}X_Ya-VFLan~j)oZy=s?TzXRKI1H)C9`{sfm_hQj;ug zr6yadNKLWimYQn$NphOyEy?MYhb3oNu92K+IaP9&Wu4?~%M8gmmO+wpEo~&{S*lCU zw-l6IVEJ2Of#oxag_aj27Fq6=SZujmVu|HsiKUkH63Z;JC6-%;ORTVTkyvSID6z^? zPGYqsx5OIDkK$`B&xo(HTrR%evRQnCWxV)COB?Y`mXhL|Ex(IxvAim_)pCp2Hp|Ik z+bv7Pc36gq?Xa{I+i58yw#)Lr=x)nLqI)cliSD&rDZ0~--aM6R7)}n_j z6+{nPvWXtCd?Rwy^0LS=%bg;}Efqw56lS8A~mZvzEdl=PZ8- zpSL_Ce8Fx1@9@2|T*LR?vX<|Ir7zz{ zOL@LemLGXPTOQ^8VmXWVt7Sg#H%nLE@0N1BKP-Rn{ItBt^UHD#&u_~%oHFI)U z`EznwNpW&nJ>%fE+Qh+QRnNg|<Jgie)f6^iD^E5N zD<(EktDUT3R{5;rR;sKLR`*yWtY)xCT1Bu(SxK-+Tis!nv0A_^Yn8<;XJy1JZ}p2w z!RjQFqSZ{M&6aYy>n+7}S6TAvF0*9SU1<4NXRhT}otc(zbf#K9(V1v@N2k~Fs!pfn zS)EqPqdHBNdv)q8x9U_|uG1;ET&7cEIbWy1a=K2gW4TXT%W{*prsYy?b<3IBs+K+4 z%9ah&4#WT(C z7I!qiSzOZmW^qFEtHnOeFBV%gzgVo&{A{sM^OMDN%}*A+njbA%G(TEYX@0OM)cjzP zuKC^~PV=2bsOCEhZ_T$BPMU8mEH&R+7-+t+P}h88A*cD;LR9m$1>)Y`R~DZ&URk`- zcxCZW|0bJhKSVcxK_F@yxYCN?N z)p%;br}5N+P2;J>KlNu8@714KJWzjTaZ&x5#Ub@)7Ms&${=z~@{e^{y`U?v-^_Lbu)LvS=QhQ}_N9~oxIkndo z2h`qJY*Kq;u~hA?#dNi|7F}xZENa!>TjZ;~w@6a^U=gbJ(ZWORqlLBFCks8b&lZYm zpDjeyzF2UmeYNNkrgs^2ZHtNyS!t@^`azv@qm&8ojFmaG1v{X}NvXoL~w&Yi3v1C?dvHYRJ zYWY@$&GL~7o8@&CcFQv=9F_-FI4!rSa9XZb;j&z)!fiQCh1;@Qg~zf{h1ar7h1W7i zh0iikh2JtqNHH? zSV__Hl9H0;K_w;24NA(E^OaOA`;}BJ>y%V2bCuLAW0lk`eUvmTt(7z_wUx9irIoZT zxs`M*e=F)*zEae+yrrmTd0J85a<`&^D=!FPQ?%mokNx*JX+< zkI58SZj~vvTq;vyIaQ|AvQ?(cvP7obGDW7sGE}D0(p9F)(p09#Qcb4TQcR}Kl3k|W z@}qQv_uf+e%mM9bHblPoVwPPW`FImL2`28eC3G!)xvDI&Jb@`vbl%R8bwEDwn8v|J*(%d$gs zw`H#A9?Kxny_V*p`z&Qe_ggZH9I5@48IXJCev2$5XWaqZB zX6Lbb&cRJmHHT@lrLgXLOK#m&mdv`#EPv}Pvizho*YcIlOv^_) zQ!Q`lOtieL(`$KJr_1uNPMhU!ohHjII`x)obgC_v=u}wF)hV%@s#9p$r;}&du9Iz9 zuajX}p_6J^sFP%wr4w(Nq!VKqtrKY(q7!E6s}o}BrW0uCpyOw0spDg5q~mF+t>bQ~ zs^elQr{iQPuH#@SsAFfzrDJW$qGM_KTie|7owljvLv3TrE82#ZC$#k~cWdifuGiMK zT%@gOIZa!`vQt~lvQ}HgvOrtOGDTa_GD2J4(nnj)(m`9s(o|c@Qd3*fQdV2sQczpW zl1*FG@|Tvd<$En5%g0)RmN&HcEzfH4Ssv2jwcMt~W4T(3%W|O>r{y#)4$E#WcFP7W zHp@~iR?93c7Rz`oX3G#QCQC0ZMoW7w21`?|{}x(W|11=={#uA>{juQD`fb6e_1ogR z<}Zu4nm;WbYyPmfsrlXFg64ONW18PA_Go^!*rfT@Vuj`xi}{+LEv9OIw&>RUWYMJg z(V{~0qeY(P2a8nA4;C?+?=6Bf-&=TUzO!)9d}m><`PM>D^R0!d<{Jwc%{Lapnr|$) zHD6mWX}$*E+xt=DmBkBlw{}T8b|K}Fn8qY17HJ)2k zYdp6o)_7)-rSZ%nN#mJCl*TiQAdP1hUK-CVoHd?WSZh4BFxGf#p{?=MLPg`Lg^b2i z3lWW{7Q7lyEm$?4TKrLeYVlV6sl`3@rxxecpIRJHe`>K&{i(%b^=B4S)Sp?jsz0+R zSAS-ass79&O8uFIkNPtUJN4%l2I|i(6xE+w2&+H0U{!x%@m=kO#Y?r97Pr-2TAWpT zWwBrFmBl8t*A`3E-dIdmdt=e5_ST|C?X5+=+B=IRwf7dGYVR#P)IL~Pt9`W4Q~PM4 zsP@T1MD3FWhuUY0->P3M-m8AGc&z%>;+pC=i&LuKEcU5>x7eim!(y504~yBVKP~!I ze_1rE{`o|(c^{+*!>R$^_)qfUts{bvFRR3G3t1?(ht1?;&s4`lzs4`jp zRAIJ!tHNygNQK4nx(ci185LH`gDPy6+f~>t*Qjtz*LoUX!Y*`vZ`*{H&0S+2ru znXAHMnWVyF8KJ^!>8HYH>8!$MX{o|*sjnhnsj4DiDXk)CDX1c3$*v+~`Ab>Y@|m)T zqORq7MP17Uih7n474pc|_jFa*e#NvmiOgC zEl{LwW?E{>W?72MW?8bzW?O!i$+3JS zlWTcFCeL!eOupqhnF7nXGKH4CGDViPGR2m;G9{LAGNqP&GG&%_GUb-~G8L8zGL@Es zGF6sLGS!yPq-!isNY`4fmaenxldiWcly0yLm2R}OkZ!V+k#4qRly0$nD%EOvN~+Cr zy;Qs96sZo&N~uoEc&RQ+H>qw*U8!zM5vd-_Ka#zcPbB*+&q(%LZjqc|IahL`Wt-$A z%Y4bnmXVTEEL|k0TIxwovy_yaZpk7!!}5c~Ov~F6vn-EE%(mPlF~@SQ#9YfxiFuZ# z67ww+B^FrvNi4LqmRMw|A+gv}Ok#;8v&2%%$Kp#Z_lqyHoGrfGvO;`?WvKW{OC#}B zmIC6dE#HZ)u{n**-HdyM2ZM5VQ+hqAsbhG6Z(JhucMYmec z6WwOnEV|t?Lv)9wujo!oW6@oflA^mU|BLLgd@8cn@{Gtn%grMDEoX}yuxt`JXqhE) z$TC>uu%(U25ldB(qn7+4M=d`IAG16reB5%j@CnNT;ggnb!lx{yg-=_46gp#hT=EkE$SvOL23+HxlE8_PW2x0bHF?<{3_-&=m+ z`CxgL=cDCHo{yHTJfAERc|Kd(@_ezB;`wU%miwFKa_;YziQGRdWw?J>-s1XcIfv_) zWjxn!OAW3+mY+EPTJGljXW7R2-!hPs!Ah2s!Rj>!qt#9hCaZQ1W~(p`7ArLlR;y3! zY*sVa*{z(}Ijr8Zaazq~SHr)Ln1MsJq(or_M6V4?2r1U+B!U ze4sPS@`lbd%ZoabEKln6Ssv8svfQcDX1PhH*>aUmz2zdE8q3)_6_%5AN-cYIiY!}o z@-1t1vMtMWGA#3TQY|xdk}MN-;w__eVl9JpqAY!M!Yy5OLM-icf-KE-{4EW1d@VI~ zyeyS@1mdY%ITPTUox+wy?aXZDx5<+r;vSwvpuyZ3D~I z+Ip7rwRJ2fX=_=wX=_+kX{%f2YO7i%YAaiYYAacKYAaaUYRg#~YRg)xX-iv5X-ir1 zX-il#Yl~Zc*AlgSqa|YbKug&2s+OSTDJ=oZ{aXB%TeNsBS8DNC&eP(yoUFxV*`dX0 zS*yiiS)|2gnW4pM8LP!&8KlK*>8{0OX{*I(X{5zqsiF1XLRRaag|OB?3r?-S7XLN> zSbWv|ZSh+3m&HTPpBC3Oe_EW?{9$oe^Si|^&2JVPG{0Fa)BI{NNArutWX&%YotmF5 z>NP)Elxcpl$kF_0k*xW_B2x2%MS$je3wO=;7IvENEKD`uS?FlKwNTc4Yayli#zIi@ zjRlA18w&=_*B0M3UR%7^cxCZS|HC}Kt?|4ACpExI(G zTQq4rx2V*3Zc(W5%pz0cnMI<;GmA)#XBL4PPc1w(o?19+JhiaYcxqv!@zg>~Ehecy zwP;a)YEi2G)FNH|sYRsvQwuNkrxrHq&n)!RpIIoVKeG^0e`dj={@mi5+H;E+YR@fh zslBi`tM<}jzuHTSjcTtf7OTCon5OpHqC@SqMYY-+i#)Zr7Kv(aEke}ZS-7jcv#?To zZ=tL9!9qdpgN2CNM+GS%-E zvsAxZ^r`-^Xjc7cQLg&aB3t#BMS|*YixAb{7M`kqENoT(S{SMRwNO|6XCbZn-$Fq3 zzXhu*gXK>ZM$309jFyj8m@IFoFk7BgVYWP^!eY5yh1GJ63ajNJ6*kN1D(sfMD(sd` zDjb#-Djb%%Dx8+dDqNP4D%_U-D%_SXDm<1}Dm<13D!i6zDtwkQDtwkgD*TolDgu^& zl?5zcDGOR&Qx>v3tSn@?URl_3jxYgwkK zYniU7XBnxeZ|S9IU}>XhXsN4cWGSy`Y$>2#U~5^eU}u@9U~ieI;9wb|;9%*l;Am;B;AE+%;B2X+;9@DJ z;A+XG;AZ(p-re$vyocpkc~8r&@}8FSTr8VlIYBnjvQ{?9GD|keGF&#<(p5Ia(pWatQc*U|l3zC6 z@}EqGOFcBqvzfNKUj=mz-oNBstmgpTrc)ml9JguS!g_JSZ{Ua;?M+ z%b5~0En6jKSr$snwv3gSW9cO^*V0^Ko~4S!d`m%z1(yHC7h2vHUud~qe39i8@x_*f z;!7<3#g|&@iZ8R|7GG}pQf!6g39*%y%f(h&wu!B>OcPse=`Oa$QbTO5C8yXr%QvFy zEzgT?u-qiN(Q>-zCd*pU&6Y``TP!_9w_56nZnG2--ER3yWQXNLk)4(&M0Qzj5ZP@x zU1X1Cy~tk643WK-0V4Y>Ek*WQDvKPj747f@dvv37)f@E_mLuMDT)Tu;4{Y zL%~ay0)m$<-wRx^JST9)a-G0c%YK1tmIVUWErSJaSegplw3HOMW%--`w&hX&JC>99 z?^-7C-?P-`zi;`E?}6oczK52J_#Ro7@;$cn;Co^z!}rwk1MgGIBfQTnXYf9^%;SAw z>B{@kQkM6Xw_KU%Kh{$!cP{n=89 z`-|m$uCJE!xxQK^a(%N@&6%Px+8 zmQfu4EwwlptbVXFS}kB_vhreQw))1#Vzq>g)hd*Y&5DbS-RdwahgA(LrT?rYw4vEW$COFVQHfiYH6wy zWT~eUV5yHng0ht#8?{t!vq=t!-JZt!bI1t!^2ot!5ddtzzk>tz>DXt!SyIEpMr; zEo&*REn~^8EoI4|Eou2hOWg9MmYC&TEm6x$TEdpcwS+A9XbDDGEeA4`5@j~;r#XZg67FRWYS)A7VX>m~VhsAcy?-pw{zgsNP{AMvr^Q*-~ z&94^inqMqxH9uRFXnwND()?tRsQJ+%T=S!apXLV(SIzepHk$7(j5Oa_XllN*P}F>D zA))!!f?xBE1)Js@i+>t#EWT>Iws@=Y8hmf>9gSBOmo;92*ZCdRcxkZ=@)e`4`c{fWgb^(Pjm)t^}GQGa5wPW_3+ zeDx<56V;zsG^szaC{cf6k*fa0B3%86g{S&c3v2bK7P{(BE#%doS_rB?wP03%YVlR= znZOT&CySG+pDp&PezDl7 z`o&_Y>Q{@Is^2X7RKHm?seZR8Q~hp{t@^_vUiGI%i0V%ZPt{)*wyM7^j8uPHsH^_5 zkXHR`A)xx#f>rgO#V?hA7VlO5TRc%=u)LwdV0l)B(ejWAljU|5Cd;)d%$AE(m@TKP zuvqr0uv#{&uv%8AuvzA*uv@06uv9cWid-$WiiV?O5&EUlq4)~DoI$LP?EIVt|Vo-Oi9Xes*<#2tCEamsgkT^s*;># zh?2aei;}#hiIRe)s*<9msFIQ;tCF(iS49=eXNoG8*A!JPk148IZdX*dT%o98Ia5)? zvQtshvPx0QGFwsGGDcCy(oa#>(q2)|(oj*~Qdv>oQbf_fl1xf(y~Fp%CcC&+A>YS#xhdD*3w78&eC4N&eB-H z-cn7$!BR@W(UMQW$&yLI+47CNi{({$SIfQfu9nN>-7Nd%-7PERJuH*tJuSWEy(~@T zy)EVCeJnZUeJwxB`C8tU^RqlI=Wn@DF2Hh*T%cvUT##jvT(D)FT!^KYT&Sg)T&Sgz zT$m-lT)5?L*$B($vXPcoWTPw(%0^qRm5s5SB^zVeE*ooEDjR2+BpYuTAe&%mE1PJk zEt_O1DVuD`A)8|PO(xaysZ5&X6`3^4!!qfXn`AO97s_N>PLRp6Y>>&eERe~uOpwX7 z43NpQbd<@rG?FQ>RF)~U6p<;iWR)qld@EgIc|p3=aqUvNKCbCkeFtfBQf1FQeuXso5V~@V~JUo3KFv|c_rppeixr>d0Bj} z<$CdXmObM0EwjWISbB&rv{VycWXUSN*z$?k63fG4ODq?QEwyYCTV|Ogw%pQ5Y=xz= z*h))Qu~nAOMORy%5?y1tPIRs1B++%2WuogXV?;MtI*D$y)D+!h$uGLu@|(yO%ex|5 zEsuz7wOk{z&2oy!cFP)(9hNB~J1u=hc3GN_VeGcjOD*+sl$KE@(`^3_f_lczp?^DaKJkKo8@jSO&&hx^uiRYzdJkKjj8=lvel00uL-*dmQ zT*Lj=GL!qAr5g8p%O_kPEEjWqv`pdpXsOQi$?_fNXUm#Lj-Qs@9KS4MIDT8|a{RIU&;G}98T(($0QP^Df7t$8u4ZGfieh85;$>s9I>O3q z)xgSPWy8v9^@D}YY6}aSRS^rjl_3j<)hA|7t8L6&R@KbhR!+=3R(#AnR@az#trjwE zvHYU5!SapHYRe}&%PsHdEVjI&GvD&8&MeELI@2xp>P)uWs?%?|PN&;)nNGXqe4Q4{ z={gOT6Le}VJ9Mfn8+FPot8|Jji*yPsvvqPUQ*^Q{V|CIk!*o(C{dE#8J#^wM9d)8D zt#l$Rjdj8-b#;O*)pP*bEd34+@S#?}2|7kl}e$;lbe4=e zEoNwbv*^?OYSF6s)uLMSi$#&%n*|7RBY8qX}!HJ(|-Ydo_E(|Bs(r}5OnP2;JBy~a}ubB!k!`WjCx z)HR-1C}=#fkkEKyA*k`#f>YzM1(U{Oi?8aBEuO1Cwz#4G*y5!6V~bttk1f`yKem{w z{@9{l{jo)Z`eTbC^(Pi7>Q5}f)SpEfcg^)CiN#4U(}vj zJX3pWaZ~M?#c8!?7W>qmTWnB!Zn0SHg~e307Zx3AFDMsjv z)!!BZs=qB*RsUH0Qu$-?UgfXF6P14!H&y;woKyL4aaiTQ#SRq)%e5+umWx#wEoZ1O zS@x#B{@rRC3#B@B?ZeLiVBu56%{RSDk@o?QdG9wrKn=LT2aMvj-sk% zucDe|ouayBzM_U@f})0HkfNrgv!a%zsiL-}nxc-Sgrcq`m!h8K9|e8OcMAHJ4-^b6 zFDn>Y9#t^1+@WA>xk|yra;}1@FwvhkKevI&+9vI&;&WfCp#$s}2xl}WbTBa>peS|-(UmQ0#umrS~4rA&rprc9<~ zq)e8jmrS;$l}wJMwoI<2j7**-uS~w>Kj{L?hth?XN2H4^S4bCIc1xF7=1Z4a21}P& zT1b~$%1W18GD%lhK9{PrJR?4rG!+2<$uXW z%jc3!mggm#Ew@XyST2xkwd|B^vn-Nqw~UtTuymE|v^0?Hw3L$UvSgL)w)`N`V|hoS z*Ybo!pXFAGe#?at6D<2ACR$cYOtQ?7m~0s;F~!nJVydOS#57A8iRqS{5;H8{i_f$? zBRMV?9mVHb%8Spl{3kZw@}Agy%Y9-CEa!|fg5?yEcQDnX4 z4Ur9&2Shent`ON|IYDHzWrfHV%S4f_mR=&;ER99BTgr-Tw`3RDVfjdSr{xaeU6y^q zyDd|N_gLBp@3j;b-e>tnXustVq5YO~g$`Jj2_3Zb7dm9ADRkJ9S?Gx6eZixay9JM0 zP8U38St5AcGDz@*rGel{O98=CmLCL8TV4=2W4Te_tmPzubC$&d=PW}7&Rd!bT(Fc9 zxM=x@|B~fV{>zpV_^((-^Ix^pX3>7t0=wua8x4fjY*z%Ole9OZ+vn_Y)Ot;*uGud*DPQT?6ogT}%Ivti% zby_U@bQ&$&bZRZ@b*d~YbjmFYbxJHVbqXw#baE}Db+Rl&bkZ$-by6(dbP_G?b>b~8 zbz&@ybRsRab;2xFbV4lUbOJ5Kb^I*_bbKtibi6E?bv!J8X}em!)poXgsO@NZMcdx; zxVDYuZfz^eb=nq|i?q!wr)ry6c4`}0)@mDA7HaERrfBO}MrdnW`e|0dJhcebcxvIR@zlaqzxTgNt;<)-_iyi8ZEmo;N zwwSH{*rHecu|>W5V~Yay#}-NIk1ayfA6vMoKen(?e{7+p{@6lB{jmj~`eO?Q^~V;U z)t*>9ReNG_L+z=>DYd5-d)1yZ!Cn=-dM1yy|wtM`p)95>N|^vs_!kXsJ^#2q58pMkLm}D z4XPh4mZ*NTn4$W~qDS?!MWgCxi&E7u7FnuaEaFtZS_G?pv+z*;W?`fH-NI1yyM>zS z4-0A49~J_tKP^~Qe_8xe`DO85<+sHXmERV(RQ_0;SNUskMCGr=PL+Qa>s0<(ELQn% zF;j)XvQLG*6*Vli6g4en6g4gR6tyfF6tyisDd<=} zRnWD(uApamQbFHxkAlACIt2sEg$jn2QxuFW+ZBv0s}xKu^At=h6BSG?Llw*{Jrv9> zZ4@jl^%X2Fl@+Wk#TBe9xfQG}|H<1}K9je#JST5wxn17ga)G?PWv9G@Ws$t2WsJO& zrJKC7rGdPQrIfs@C9Axf<$F0d%Ug2pmPh40EH}t`TF#R5vTT*}wk(wMv5b-Pv2>U7 zwKSIVvs94tx8#uvu>2_-X!%Sw(DJfukmW(yV9Rx~A(pdcLoGXH!z{~W!!1)}BP@et zBQ5P^qbzl0qby})qb<2)V=RBl#9BU=iL<;W6K{D`Cc$#6OrqrynIy|8GRcZCTVW~39l~U!F{ZbW{rBaoaF;Z2Q&QjHuT2eKZ zf>O1XKPBrdA4=9)o|LS&+$h;#IZLw9vPrVZGDou6GE}m~(q6LFQd6?cQbe-d^1nof z+td}Z0h`P$N- z^Npn(=UdCS9PcdmaJ;wd;rL(~$MMn9kmHjj3&&^64eVbmqu9S%va)}(+|2gPGL`MS zr8wIU%QLJ$En8TBSvs=*w*1fX$8s;rU&|Vnf0ouP|15tq|F_)B%wW~X%xLAs%w#3X z%w%ry(-zAIIvXr+=&Z54ptIcagwA5igF5pqck0Zx+^93%a+S_x%SAd9ENAQV zSWedIuc7CstJEnGC7SlDPhu`tniVxgfdtz}??TN)6wWk*A)Sg-_RC{JIMeUhIo7!`WO10+}IchH~;?-VQ1gX8S za8-M0VWIZYLR;;Xg`CU)bNsvj(7sD7~MQT=Gqp!(6GRP~cZrs`*lIMvS7QcRi8l2w_{^0N}Z`QdG{zl2Ojb@|~=&)k9 zI@dBvI@i)(I?qx?I^U8*y1??CRH5Y+sUpi=QpJ`Fq)IH?q)IJwrAjSBq{=L|086(kc=_S!)X(7>TsV329DI(Et z$s{qs@}c-d%e~?gEoX^OvMd*$Y#Am##nME4s->{_G|Nw7(=9KFO}E@6Hp6m~*i6e} zv00X(VzVvH#O7E^h|RV9B|6XYj_7>LeWD927m6;hY!zK-nJK!+(ob};rLpJ|OG(kC zmj6YTSw0h4Zh1~*h2=Jpm6r2GR$8`;tg)<+#|Hza+=U~%R-?YmOer|E!Bl~SuzRj zw!9~}$8x9OUdw5M`z%WY_ge-D9E0*5U(3LLSVEO6AaRN$Cp zguro2D}fW1vH~Y983j&Sp5i}cIf?(YWi0<0OD+DhmOuE;Ssv#*XE}rKyk$1u1xq`= ziSHDrnABFoX#4{V>&A=_vsbz#tk!7Gxo~4&gwxzR9hNX>8 znx&~uvZbC*f~AH|tfit(l%AZ_DS}o|d>Sa23nk!YFZqYGFt4G zf?8~r>{_gre>GVwKWj2uzSLy0ysyb~NJJhkxFcxvIS@x;Pf zNMURnsMy|Q3Ydu8!M^|i$t)z=meRNq)!QGH`^ zT=lKRZq>II>s8-bEKz-DF+=seMUU!xiw4yX7A2}5EHYI;TEwb;vF zMoVoKMoUE%CQES@CQCjQW=j?oX3KBNES8UzSuHOpvs&&`X0u$a%w{=LnccEYnccEP znZq(knbR^rnbXovnaff~nafg2ncI>>naA>*5|8CmC0@%bO1zebmG~?-De+q_RN}Xs zpd?^fuOw)huOws{rzB+QrzC7?rzB#jrzC1ArzC30uOw#qUs2rhgQA4xBSi_z%Zieg zM--(jw<=0oE>o1YoUSNi*{LXNS*0jvnXM>q8LKF7>943@>7b}+X{4xRsiLTCDW<4m z$)TuX`Ab37@~wiJ<$VQp%ZmycmPZscEVnCYTCP;kvYex!ZP~A&W7(vjV_B-8YniE_ zXBnfQZyBIqVCkY@XlbEfXsM%MWT~KFY$>8(V#%RkYWYLn)bgRcndM1&bIVQg7M8Q+ zEiGH*EiH59tt`Xktt}noZ7j9qZ7oIR?JWPx*;~Gnv$wn|=U{n2&e3v>oRj5rIcLje zITy=(ITy<)Iaff>*w@jGjOPO%X8!{1=CuAZmx64FY zE|-b2oF)@(*(MWXStb)}nI;ow87>oV=`NFCX(5wnsUeeODJhd|$t9Cw`CU52@|JX} z)bh1tndN24a?3rE6_!gSD=m8^t1QbUt1S~GYb?Da zYb;G9Yc1s@>nu4X>n%S^G+5r3XtX>f(PX(zqSqM3*JMM7QN1@gB>Y;=PvJ#Ct6#i}zU;iuYUkiBGW96`yFyD?Z8cjo4(% zGh&l1*N9EA>=m18nI|^Q(qC-4rJ>jiOJT8@mfu8YS>6<#ZMj=?w>0IhIYLb1hRv z=UIA*&bQPTU0^99y3q2s$U@6UB8x0fiY&I=D6+(ImdH}eCXr>9IU>s~Lq%3t+Ka5P z)D&51DJ-(e^0)A6%L~G5ESCwdwX79hXBi^A&QeEsy(NqA2Ftrb8!fjBZL*vswAnI8 zXp5zX&{j(op>387Lfb9x3huDnDY(;en&3{$V!>UOfr7g&4FvaC@(b>@d@r!i@`AvA z%Z&mDEGG*bv@8`kWEmlF$kJNiu%*1f5lbe4qn79Rk6BLVKW>@8f80`=|AggFzLS>6 z`A%6*=R0kg$#=%mhVQJUAm3Tbr@ZGZck!OLoXC5@GL!eBr6cbpODW#VmS1=-Tb|>& zV!49ns$~n$HOqLO>y|b=H!LN2Zd$(OzG=CN`<7)6_ial(?mLzrxb9kR;<{&9!gbHm zg6qEJAI=As2RR>Fc5ptj4B&ihDZ}~1@(ssR%Y7WrEc-d0TPAWmw>0K>Vad+%(sDcd zE6YUo*Ool&Z!CASy|v6{duJ)n_RjJu>wC*C)(@60tRF2ISwC4GV)<;@$nwR~k>!ge z6U$f2!_40-JDI;*1~C7ylwkg0`IzaaVAC6;S-7FaIR znPWLmXNKi;ohg?6Iuk5Abb2itbviApblNP7beb%)b?PlsbZRVPbt){wbV@D#b&4!K zbn-17b#g4NbTTcCbb`~bfPVVbRsOdb;2xJb%HJbY6n_=(Dt)@ ztnFiYUE9m@l(xI&K5bXajoQwZOSBy=XK345_GsH!HfUQ}7HeBrrfZv7Mr)f``fD3m zI%^wPT4?KA>S*g)Drjq4ifC(Ea%iht{?$^m{HUd3`Akd6@|KpO<#{c6%OhHHmOHg% zEZ1sDTQ1U)w4AObVcDxCX4#}AYFVx&Vws~QWSOKTXc?|0VCk#HXX&KHYiXgyW2vXb zZKZpo^}X8Bu_)$*ezi{*1oX3M*pOqQ2587)t0GFa}{{BN;U^Pj~U z&A%3lH2+x4(EM%DuldWORr8lcjpk2_V$B~GnVR1%5;VVAglm4a@YDQi;iCD)!dmmQ zg^}hb3r)>W77CglEyOiHSnz3nuwd1EZ}CUty~P)ecNVWT-da4?cx!P>YtPEYx^uF;nBE1>!7UY-{|Vg4g(aX*{)X(s*KFrSZhV zNaKlxw#H)%WsS!c(i)E~L^K{*@IdSSU+NDn-l#vcxU2rq;+*MQ>JKdbs6DiJ zulCU5q1r=>D{7A{j;TGe*s1o|VvX8ki}`AgEhecwv1nC$Vo{;?)FNB$sYRUHGmAjA zXBIAM&n(Q0x5!j|ZxO5d!6HcYgN3{5M+1!rSi?v3{(=ZbW{?wG*l9@R8$hO6jBnlWKt5b{H!Qq`9x9F@~Wbkg1 zmMaw{EN3Z7TJ|VPS=K5_TjncDTP7&VSOzJ|TDmC8S(+)zTWToETS_S^Sn?<;TK-c| zvizW+Z24G0+48D_iscCfRm)upYL;si)GZe%s9R1}(6DS%(6p>l(6Y=`(6&ra(6$Uw z(6RJT(6zKy(6iK6(6>}p(6^LOFtFrNFtlV)FtU6pZ)|x<-q>=tyou!!c~i??c{9s0 zd2`DId2>roc?(Npc}q)Kc`HkHd27p0a@Ll2=pgipmCBvd9KmewGQgd?XWWc~K_B@_UM2+Q5iCW8}5_OgvBo+r=hYW{OR+^b(tFsUtSUl3#49nwYP)>~!>t+#X$ z+F+?5w9)df;3mskf}1V33vRKTD!A3MNN}5FfZ%pZeZd`;{DM0z-wW)rJTI`za-+a* z%Si%zEK3FUT1E)$v$Pi2Zz(Tuz>-Ng-@Ey0b<~w1@&v(-D3GXS(UA(6(C-9!OOy@mg>A-u|Qj+(avt{awHxo%okaNV-B;ksqX z$aUND80Q_!9?rX#p`7KFD(_>URvH@eP!9t`r6Ws^^GMH>s!l1EblCvSl(MYv%I%tVfkQr zjQOKwH}faUAm-1OQp}$%pE7;1+{CoS@{rC3%iTI_EH~?{uw1RP#Bzzw0?Ro%b1bLo z%&_d!nPSC*4v-C&f}$C(%+|C(cqpC&rRXC(@ExC(QDfc8KL$?Lf;1+WwZ8wS6s* zYkOJl()O@ir|o9BP}|vZs3mf~7m zmb_Y=mP}e4mOnJvE#GOfT0YTavAm_pYLl>JKb_t39xItM<~rxwm? zPc6*Vo>^$AJ+qKidu}19_S}L+?YYGd)fX18RbN=#SAA)5N%f`0G1XTVyHsCUtXF+) zu~_xB#dOs-7Tv0EEE-hbSd^%~wa8R`YZ0sZ<+lorRm~dkbsT_Z9}KA1qW=KUheq zezf3M{b<3W`pM#_$|sBWDxWQ$sC>4#rSiq%yvi4gqbgr5cBy=|*r4*wVwuV}i`gpQ zEhegbw`f=SVNt8{!=hN_r$vU!Pm4H}Ult)Mzbw2|ep@)G{I)Pt`D3A@^2b71<*$XL z%0CMMm46m&D*r8hEC086q0C@;Rhhx^urj0N24zOedCE+dJ<3d$mCDSP>B`KOVahC) zF3PNyM#`*~3d(Gj{K{;Wf0fuR-zc$L-d5tUJgLNCxkHK5a=8+h<#Z)3%Qhu$%Q7V% z%Ty&^%TOg=OIIa6OH(C&OI0O)OHm~OOI9U8%WsN;md_N0EUzmHTb@u9vD~F7V!2vT z)N-z(m}S4BxMhQ)xMh)|gk_4Nq-B_*l%>0(w56q@w57J9jHRritR=sqoF$W@yyX`K zdCO-C3YIq&6fMsvC|T}PP_o>pplrEBLB(>qf~sYgf|_NWf|_Nag1Tj@f`(;;f~KX9 zf~KXtf|jMRg0`i)f{vxMg03aMg03Ztf}Z6^d40=U@&=ZN*Z`Lv*m0p z!{zKOo#pH;4dfgwW#t?!IprKJzsWjTK9+U1yddjhxmVWJa+R#B}EpN#LSe}vzwA?8ZWVuo%*m8zU zh-HUNsAYvrm}RC+xMieFxTTj&gr&7iq@}h@l%gr&zw0O0~Qwm1em^D&2CPREA}%RHkK)RF-A1 zRFnIztB=_uY|sUY5I`CqKd^1fJ?<$kel z%LQURmQ7;4mdRp$maby`mg-^?EV;xcTD}#XWO+e!lI3R6$(GYar&v~tPPI%Boo4AG zI^9xJbh;&<=nTs*A~P*-iOjM*C^E}(rO0f{2_kbWD@Ep7CW*|m^bwhFX(qD3QbA;a zCAY{z%QwP{EDs4Uwwx)v#IitmsilYTGD`*F<(9vMmRnvCT4A|PXr*PR&??Imq1Bf5 zLTfB#gw|UA6kKO{U2whS7QqdclLa?g77A{%3=rI8sVBJEl234pStPRj^^U6$4YyDa4ec3ZLt?6JJWzt?gO|31q!{(Y84{QE8c@g1-{&3Djp zCf^~;Ouj>wR(yvodHIf5KIT1Yxs&&pWk2t6%QW8OmiD|SEG2kPT7Kd=WqF3@wB>T1 zGnUOfXDt(W&RW{?oU@eTIdA!y`-0^L?u(Xr+!rl%xi49M;<{|Pjq8eKHP=;32d-GWFW>vUPB>$F)W=rmhK>NHpe>C{+y>r`60=#*L7=@eU<>l9cT z=;T^z>SS3e>7-lA=%iSR>Lgk6>%?1f=)_nu=|ow6*ABOQr5$2C`9@3A@`0ARY%CbgF(y~ZP+%jED%raI>)G|m**wRBw$kJ9z(9&3o-%?YH&r(i{*HT1_$C68n z%aTEh)AE}phvgehcFRYaY?e1PSuM|LvREF~WVYO`$z-`vlhJayCWGZX&HoltH2+z2 zYyP!p)cj*nq50b)PxF^Ws^(9N7|kCR!J6MKJT<>tIB0&eFxUKQp{M!9LRIs#g^cEB z3t`Pq7F?PiEtoVvSp3xZVDUlYy~PWS_ZIgx-dSANcx!P^hRDWP`O8tSw9`y$nYteZ(*Q*-$F_KzJ-YTeG7K=`xZad?pwT3 zyKiw%?Y_lDwFeeQ)E-!DS9@r&O6{S=9JPlQ{c4Xan$#Xyl&L+o$W(i55u^6l!e8x) zg|pfd3p2H+7Mf~LEo9Z6S_r5;vtUtsX7NMyxy5VM=N9)>pIcl~ePMA-^@YVQ)t46Q zR9{*wQhjAHUG=byNh)70+Eu<;)T(^5C|3Dyk*V_CB3|W(MX1UT3vZR57LF=EEi6=iS?HzEb43ysao;d0J7xa*v{* zmY<{}Ew4&P zS?-jMwwxm!V_7d9W0@iyYw0N+XQ?M0Zz&?3VEIcb(ei;*lI3x!B+GSD$(B>4QY>qv zQZ19E(k#8D(k+doGAyN}GAx;;GA& zoWLf_^#YqMCkkw~ED_jZ87{EZ(pq4frM$p)OBR70mY4W*l%hH5@wplR0i$nseN;=ZA23mraYFYx8GFp6=LR!3* z>{>jQe>J%+KWlPXzSQKfe4xp0c}&N|J+)v_dus7r^{K^c)n^v>Ri9a0Qhjc5O!c|NF4gB2>r`J@EK+@8 zF-`TQMVIPJi+a_U7R9QsEHYGIS;VTowg^;xZQ-W+#==_ljfH{g8w*v{w-!>WZ!P#$ z-&wGzzO(qL^4{W|%6p3^DjzIvs(i3Gukyj-sLDr+T`C_fHmH2ESf=vHVvfpZi%BY< zEjm=bSk$R}u_#gbYLTV#)gnRVn?;z)Hwzz??-ouf-z_XvzFX+4{IF0}`C%cg^3y^{ z<);OQ$}fw5%D*h$DF3#&sr=jGxbh#1t;&Ba7Aya?n5g{MqF(u*MXvHci)iKl7M{xg zEi9B7EY*}5EJc+WEm@QqEk7wSSw2)^vb>;4oe#)PD>pnE=w6DE=wLIZp*)lJeF@2c`WZK@>-r(7HW zqJZUOMFGoJMM2AQMIp;fMPbWmMPW-{MG;E}MNvy5MKMbiMR7|pMR7|`MG4E_3X+!Z z6eKMlC`egeR*<$lrXXXvQ$faZje@M@d<8knNec3otqSs%l?n=$ISPuF2?|P_^*)OkcSt+k$ znJlks=_{{iX(6v~sU)v&$s=!I`CZP?@{yd8|()^eq+o#k{{d&?GC2g@Q^ zN6Q3RM@xTMCrdk7XG>jK7fTsgS4$pQH_P8L?v}4*JS=a^cv_y8@v__{<88T0#@lk1 zjE`lPjIU*tjGtw;jK5{HOn{}2OrWK$OrWKnOpv9#Ot7VZOo%0uOsM5^=`hPv(qWeC zq{A&IN=I0hN=I5oN=I4RNk>^KOGjIBO2=5fmx{H#DivqBM=IWOu~dR(w^V{%z?2yc|ERxK&jF!x?bd$`n zG?dJ>l#$G{WS7jh{3KCec~7Fy@}xwemQ@m^mgy3umLU>lmW~qT zmiiJEmNF8RmRu5*mY>9{EH8*xTdo(cvFsDCwagQ*v-A_Mx6~JJuoMt)wEQ5}Xn9er z$#Roev*l#57RyqxR?9H4HcLyfc1szt4$J?d9hQ$pJ1vikc3G|#?Y8U}?XfHo?Xip$ z?X|QM?Xy%C?YHCEi&1%SY(Q2w8&IT7m;a}dLq*; zB}ArMGKmPx{MEUks-T8aqIvwSNw&+@p?e9J{b3oPq|7FtFL zEwVHdT5KsSw8ZkG;8M$Tg3Bz|3NE+o5nN%JBe>GiM{t#;j^Jub9>LX?Zv@s@o)uVY zxlUl6{J?X-@-)vu z%Vj)=ESq=^TgLGmv9#tnVkyaU)bbyuG5w- zTxTqKxXxN$;XG$Khx5E;D(3}DJpjcEEcYy%SngZ8uspEj zV0mbHhWU}@B<9DK;mnUM6_}q`zF~T5xtnQ=h)^@c_*LJpy)^@b?*S5EG*0!~@(6+YJ(YCZy&^EUe(KfZ@ z)Hb&Kt7T~UNlV}InU=2QZ7prf3tC#1N3=97cWS9wuG3PrT&$&RIYUd)vR6yNvPnzM zvRq5nGDl0=GD%CyGF(f-(pO8|(n(9y(n3qbQcp|RQdvvTQc_F6l3$D8l2wb(^0y|B z^XeAW19@mAx5#S@JW7I!q>TU^$7Z*f}VoyB2|w-&oJ-db$Zcw@0jbPjmH*p8jmc*H6B^;Ydo^x(0FLUpz+Y+v-$&zC+ZI@uBtzc?^)=m-?NZYzh@z+e$Rqg{jS9~ zwYwHC)$Uo`R=a0$PVJt>LA84pTh#7bELXd4F-z^fMX%Zeiw3m^7A0yAEYj5;T12Tm zwD41VWZ|gx$ihVJk%flZV+$Fz#}@o*k1d$ho>+WWePZ!S^@+tj)u$GhRG(TLQ+;N! zOZAz>I@M7iw>1f7IiA0EJ{>9TV$zxwn$L z-z?NrzFEkse76u*`EJ3b^4)?#<%h*P%LaK(%Pe_K%TReOOM7{3OD%aFOHp|pO9pve%U5!GmRIHUEf31+Tdt8a zu$&=hXxS`hXqhi(WEm}IZ0Rm%Vre30VyP%+YRM;OX8Bvz-13F2h2=F_3(F(2mX;f3 ztt{uuT3hzY+E`Z0+FEAH+FFLo+F82E+FP2)I#?>pI$8?LI$1KwI$M5{aj|?P<7#TSUSYAT{_eF<#fqZ z%SOpG%WTPX%TUP-OMA&oOD)MvOHs)zO9sho%Qq4^mNz7FEssd#S#FTXvz#N5Z`mnP zU|A|rXqhBYXz4FeWN9N&Y^fztVksd}YRM*1YWY&U%<`Ccx#d#v3dMU1_)m!$6HCX0}HChIUHCY;oHCc*@HCz4^ZLz#7+G=@F zw9RsvXuD;%XuD;BXoqE}Xs4yMXqTmeXqP3MXt(7Xksiy-BE6P7Mfxlki1b-@i1b?) zh)l4I5SeJ{C^FGfTV#@@sK{hX29YV2SB0lqt`VMQ*&;m6GDdj1rHSwiOJ3obmd}M| zSsoOcZ8=A1j%B&fT+0xld6tGk^DX&=7FfO!TxfYpaG~W&!9|uGf{QIP1eaKP2rjkM z6kKM>CAi%3wZIC?GXg6u*9xq(>=#&NStPL9GE`uVrKP}HOId-nmP`WcEYI_=x17zt z!7_t?qopbTMoVV?O_rDVHd`*>+hSS3x7E^-Z>yyc-!{u9yxT2z@b0ke<=tVK%)8Ul zhIf~xDDQ5|_dI(nPx0)rT*|Z8vXN(>WgO3bOKYA3mXbUNE#Gq=v|Pu1$TFY%u%#jQ z5z8-JM=iH=9kZ!js%&Xbl4I8Rw-a-Oy{<~(Ehm*cGENshCY(>cyr zrg5CNwBWd4$;WZg@&x-O%M$iWmI~~bEzh%Ev20+wYH7%J&GHfJHOuL&*DZZnZ&-4% z-mpB%a?`Sj<(8!j%WX?8mOGZ`neSRoX1-?`#eC0Fnfboud!`4LdziLZ&e7RmIaOzk zWv|W(%Ql@Qmi0OdEX#G~S{CTcw9M3*YMG=n$ue4}&oV@(+tOF3-O^2`#nN7<(b7Vv z&eBMy%2HdW+)_oS#8OtL&{A9{&r(1q+mcHs(~?;y&GMIavgKRt1j`57ah8|0qb-kX zM_TUE4zpaR9b&mqJJ52fw!dYkwvT0vwwGmrwufbkwwq;ywzH*=wxgwkw!NjPwymY6 zwzZ|Kwxy+zwz(ynwyEWBEn~~~T85TSv9Sz5A|@meyLp;}UwURsit4qD=tW?EvF+FGKPidw>!;#xwM zyjlX5%v$`GKQ;L*-)r((KGo#5ysgP)c~O(o^0+34cEf;DsTTa(x zvh34jv~1C2u&mbnZ&9fE&mu$fuSLA(AB!-}-xfZazbu?Je_B{+{W4|*fbtm{8xWy@j?B8#Uu3x7MIl@SR7Tq zZ?R4NzQqdl`xZ0R?^|@M-?yk$zh{xJe$OIN{hmdz`aKI*^?MfP>US-))bCozsNc2V zSHEk)q<+`pi`rd_=W2H?ZmHe1IIDKo;(*#ci_L2HES9O=vzV!N-=atDzD2#-eTyQs z`xa?x4=f_p9$5IOJ+N?4duU;z_RvCI?V*LV+9L~owMQ0AYL6_wsXn%NrTW<7p6U~e zOR7&Sj;TJe*roc^Vx8(!i$$tWEvBhHv*=QNW>K&D%%WKJxkb9_bBh?&7Z!o4FD%?t zUszbHzO*nMIKt)z=n3RbE@XQ+aLiMCFaeO_etm=T+WX98q~| zu}kHh#Ripk7RyxLS2HR{3hdsPfI?gYq|vyUO1!PAh-6*s1)(V!84U zi>b;#Et-{oS`;b&v`A3?W#O;<%fe3iw}p=KZwqPVKNeide=L3~{k3?Z^w;9L(m#u1 zO8+gkD*d-us>EP9MTx<(MTya}M2X2VS&7LqSc%!vS&7-wSc%0_S&7wBM2XdsMTyPw zt0J4_Q$=>mYl<9}#}zp&cPMgNu2kf*oTbQR*`vs9S*yrnnXkxenW)HX8LY@>>8i+Y zX|Bj`sii1jDXS=G$*(A6$)qS``Bg#K@`Zwkw{%9eBGRV>@(RV|C;)huJ=)hylR)h!L>H7sT1H7(iYH7!5MX<6Qr z)3!V*r){}KPRDYAoUUb$oStQcoStQhoW5m%oPni{oS~(roS~(toRKAyoU!ExSrf~< zvL=?NWlb%2%9>d&mo>MXDr;fcENf|5Bx_}vAZummCu?nKD{Et^BWr6ZC2MENC2Mc_ zQ^vvarHq5+O&LealQK@0J7t_LSIM|o&XRGp?3Qt}tdViE%#m@ojFs`Q^po+lw3qR+ zG?4MORFv_y6q50=WRdZ;d@b!~d0yJzaDJ; z#Y-%!#7ixs#LFzL#LFzD#mg=Kh*enL6RWg5AXa6$NUYkjRjkG`U98s9ORUyXSFFxb zK&;;KvuK0mbBUJ&WD z+%D2-IZvd^vQ4DhGEbz(GEAh$(q5$3QbVNAQb?rV@~7|w%k#n$ESCvSw5%1LWEm9%(u}}ly9TubKXss zJ9#%-_VaGBOyS*PY0bOUQiOM# zWad0!d5+_x(7u{_Cs*0P-atfeaZIm=6I=Pg^m^Hn*2|Whtd}j1vs|%kVYzDQ#&XS)hvmBEMdllp)0l5s#xvivRA;_r`GM&+ zxc;B4v%#`kXN_fx&I-#~oh6o~ItwlHbmm&7>&&!F(3xr(sWZtkNT<)zTc_L7MW@5k zR;R_%T&K~}K&Q@9Q>WTeNvFb6MyJ$LRHw+2Unk#^Lnp_QNhj0tyLOu8EA3>;SWv;fjWumr+WvI5BrKh%wrJc5u zrIEISrJA;#rIfafCBL?nC9}4Lb<4?GYL@LfQLY53#f|lPj1uWla@>xF8^Z1Ga#lf^@gj}|vHK3H7P_+W8D&h~oN5*h z)#nygs?RO-Ri9g^sJ^g}RDEH=ulmx0MfIh{PnDMz?^Rw|JW+XNaZ}}$#d($27DrWH zTkKMKW3fTyjm0vRHx_eL-dapjd27+3^3I}8<()-|$~%i}mG>5jD(@}ARX$kwseG_- zQTb?Lt@6>rQ01eAhRP=kIh9WqqAH&)cvL=HFsXdD_^kZJ;(_uPi?hmKEp{t^wOFbA z&0@OpH;Y!~?-s?%-z}1qzgq+<|FCdS{$Zi7{L?~C`KJZ1@-K@&O1~^#EB&^(rS#k4 zq|zUYol1W#Rw(_on4$E~qFw2qMY+;{i*zLh%Wx$IOLrwkOLHYgOLZkCO9>?=OAaMw z%O8p?mM;}qEN>~YTAo&9wcMk~X1P|8-Ey8HhvfuC4$DSGPRn9NF3S`}F3T`QZc7hE z9!o1l9!p(CUQ2mJK1(4*K1)_be#;*U0+z281TF6=2wGlL5VAa?AZ)o^LD+JYf{5i@ z1yRe13Zj-R3SyS!3gVX83gVXW3KEt<3X+y?3X+yq3R0GO3euKJ3euM13Nn`53bK|A z3UZb&<>f3d$;(^rkyo%>Dz9MKFRy4>DX(OiEU#?oC$DU2A+KVoEU#+GFRy0#OHR%5 zshqmyML7-2J#reBE95jSr^snp*2`&GX3J??M#$+{y2$BT8p`Qf%F5|ka>?miewQ_{ zd@5^Tc}dpL@_?+77t1giS4(#p zH%ki{H%mnrJ#7R9DjF>9kZ6>9Q0M>9YJH+--SMxW{t7aIa;V zaG#~WaKELxaK9y^@C3`-LK7{w2~Dz`C^XqJM`((rhtO0@RiSB?OhVHw9}3Q}JRms3 za=ze9%X-0CmI;EhEgb~sSSkq4wPX^UXZciMzU2vl`If5$7FhNQEVL{TSY#P2u-MXE zV6mmNz!FOafu)vb_?KDE;9qW;%D>#wn16*O6aPxfOMI&=7xAsKEaqEn>B6_hQjBk{ zDS@!d;w@l^TU}?j%f*}rE%P}K zSz2=*vSjBxYV_P}Z}S+^pv;Pq3V~Y-hP(>A`Z*l85Dz8aCi>8#Uj zX`|C&X{ys|si)IusjgFJsi;$JDWy|kDWX$q$*WUj$)=NU$)J;C`B^*D^0{`p055p(zRTs zrENJ|OVe_KmWE}kmYQXimWpM*ma=7vmZD{pmV%|fmYk)lmW-vfmb9gTmXxKMmV~8@ zmbj&mmZ&9%mWbs)O<~I~nu322BpjWt!}k zb2Zs4Cu_1=c4@L$HfSXBKW6&){eI8fZL$uk!<~@dvH*u0^c+T?>EpyB1FBcP&iR?^vj*-?5NX zzhl9ze#hdU+8v9JYPT((sNJ@>u6D=bl-eDOy=r$XHmKdPSgdx}Vw&1ri%zw>7PV@3 zEeh1`StP67vj|taXW^xG&%#dazJ-z6eG65!`xcUF4=i}q9#}A{J+Szy`oQ9)>O+gW zst+wLsy?(hs`|)cr|Kh%b*hgn7O6hAn5O#JqD%F$MZM}1i(=I$78$BfEMiojS_G;- zwQyB^YGI}N%tBxFnT3k#GYd)8=N5db&n;L~pIiJ?d13KR<%Pu)l@}H_RbE=0S9xi1 zROO|`E|pgn8&qCdEK_-HF-PUK#Uz#279A>YEb3I=Sd^%|vB*|=Ymun()*@WxorRyu zI}2BpcNW$v?=6f}-dkv>e6WyL`CuWY^1*^v<)a0&%14W@%AYJADSxuKp#0flpYmsm z)ykhOW-5QNXjlGXQL6maB1QSDMX>T$3n%4o7KX~-EEJT#TktD?xA>>@!{VLN4~x4> zKP}EE{j}Jl^vhzk(r=5|O1~|-mHt>%DgCj?Qu=EVrS#9jOX;75mC}C;ZKeMf(n<`L zJW33fe-s%l-zqX%-cw|-Xc|eiba-$-PmK=&amcJEvE#E2dT0T_Zv%I3fZ+TpS-*T6NfaN*` zLCb{-f|gSige*H0ge|KTge~(GL@bjPL@mP~Jyn>~cyrQL;ypkoO zyt3sRIc3Wmaw?WbQ zFRNquMpoDImaMMj30XbMt+M)-OJof!C&?OGHpm)T=F1vc#>pC6`pTME+Q^z(YRj5g zO39jAa>|-p{*d?90Lc|*p^@`Q}FEDdFxEtOg;=sm zg<8Io470o;8E$zln4)J`;mtqB$r^N~_*NPQcP7o`$EEX%a z3>Pc0v=%G1loua)W54%PP?-%LLJCOLx&4OI^`gOA*mJ z%ikh(mXAd0El-IwSZ)$&w45cY#AidVrebXVyPn1YRMBrE=xt>Zp&XnJ(gF6dM!5y^;vcc^;@P3^; zgQX?UMoV#?O_uMtH(Rdd-eQ@k;o51*!?nxu3g>Ri zg`9gV^Evlg+H&r-9kcw%dfaju>j}#!){~ZktS2o`v7EB(W;t!?#d5}ym*uSG73Oo6bC}Or zCNrP6)MdV4`HktKAX_g*3 zlPn!|`Yo+=x-E@$IxKZ`S}oOdnk?mY>MSL6sx5_dDlEBmN-bG+iY)(X=UaZz&b553 zon?7lJKge>c8cX*?Ig>M+VPf4wPP%2Xh&K0Xop)iXop&sXa`%SYX?|HYx`OHYx`Kb zXnR^(XuDhLXuDb}XggbqYCBqTYTH}>)3UYvq-AaST+7n(wwAf&1uav{qguw6yR-}~ z*K6rpF45ApoT;T_*{7vt*{r2uS)rw7nX9F0nWUv`8Lp*d>8qt+>8vGZX`v-+si!4v zsiGxiDWxT0$*(1D$*Lu0`CC)O@}s7(<#SCz%e$HamRB_SEl+9kSsu{jvD~i7ZMjyH z%W{b(r{ye74$Fy}Y?d9Gtd@0}ES9C3%$7NtOqNNSjFyp_43+_!|1I1#|5?~-{{GvQu|fTw#Uk~47E{#kS+uF&v#3zNYmudX*CIy!u7#iaT?+^GI~GRj zcPv!Z?^uYd-?rdXzishH?Y6~xwc8et)NWf`Rl99*LhZK2ZnfJM>(p*rEL6K=F-7f; zMTgoQi)yty7Wry-Et1skT7;?HweVECYhkN)&%#jco`s6qJqro7`xZQE_bnLI?pu6O zy>IbC^?}75)dvt30Biw>1n7IiAGEJ{>fS!Aiawn$WY zZ4s{W#==kKjfJbq8w+cdw-!b!Z!I)c-dQN9yt5Efd1t|^^4@|)<-Nr><@Xj(ls{Np zQvP6ZK>4G^I^~ZRbCf??bSZzbs8If7k*56FB2@Xag|qT!3nS$(7D~!rECiLmS}-bq zwfLa)&EkR5H;eO1-!1kl{jgZ4^uuDF(oc&%rJojcO1~`flzv&nDgCzaQ~GUTr}W1{ zPwB6PywYC_ex-jF3`+kjJ}UmVc%=B>;*uhRW2z%PCl%mQ%FcE~jX@SWd~ZUryPwT293>Lr%pqL{8PxQBKWL zS5D1RN>1I9T~5RDi>#*QBUw$$^Ril&du6pPSIg>H&Xm=)Y?sxuER)r5*>aV%i)FvG zt7VC_t7W9Lo29+9yQPY>hb6bPr{zZ}Ps{64UY2{Mye*eV`B-*K`B)Z7`C3Lw`B^$j z`CDpA1y~A61z7%;477YA8Dx1*GT3s5WQgTr$q>t4$xzD*$uP@g$#6?Q$p}kJ$p}jo z$w*59$tcU;6492=C88}aOT<|2mx#4oEfHrqLn6+yRU+Q9NFu>9K_b!8S0d5US|Z6( zQzF??Tq4DiO(NCurFg34aq%?ErQ+$9&EgrBN#dE7j^de?isD(84C2|A55;mU4~gYk zE)mPMY!}P3%o5AD^b;$vG!iSc6c;P9{4H8!`9QST@~CKuXIxJTTby~Ixby+3~bz9mA z^;k*^^;-TE?6bTk*k`#_u-|fu-~`K3!HJe(f|D%G1t(id3Qn>7EilFMuE12w{Q}c0 z7Yj_cY!{eenJqBGGC*LarHQ~SOG$y*mVf!@Sf1dYV>yL?u4NMcJWB)q`Ii6r=3AcU zTVT16Z=q!o-y%yFzD1Vee2Xn#@h-94%e&Na67N#W4BlmycD&0iMR`|PzT;V8d5mYJ zH(Gw++GM$fYqMoF*Jev+ zt}T{4Tw5)#a&EJn&$-<)mve`u4d)I^ZqA*SH#v4$uHe{hS;n#3(v@S6r6|W<%QNhI zEz8*VS*o$`x4gl2z_Od|prsw#LCepqhb&jI9=1$iJz^=rdc^V~%TddImSdLwEXOVR zSx#79VLoX&pZTO^D)T8zedg1aKbX!~9%9;JS+29evOs5zWv0#w%Oss8meD#3EkktX zTKekDv~<&%W@)c8$XW-cmrP#*#~?(vn%H%<`9Z zvE^Is0?P;5xt3S7vn-Emr(5pQPPJU8on*O4JKl1tcC2Nmc9dnUc7$c2cBo~lcCcln zcA%xNwx6Y=wvVN$wwI-*wuhyhwyUL(wzDOhwxi{5EqlxNTDF!?w5%;}YFS#I(=xX_ zq-AQkUCY>Vjh3P1LM;Q!XKQ+ZH-)o9mKGhVqysar@c~Miq@`NV8F~@!jI9#y5*M8ec7*Xne7_t?}97 zvc_kN(;A;F4rzR}*roBoVw1)Pi&Yx$Ef#6KvzVpv)?$*zTZ=A@Hx^AAuPv%HURxAt zyt2sBcxjQO@xmfXZn5IHi8yVvqWLi*@SvEEcHWvzVlQ&!R>Bu0@&pU5gC$yB1OEcPxC=?^xKY z-?1=Mzhj}Se%nG!{k8>%`fZEfYPT%js@<}9pmxjRvf3?+V`{f7cBFWyJzuV z^`6CN)q57tRqtEeQN3?*LG`}H5!L$^J5(Q7tW|wru~7Aa#Wd9i7G0_jE$UStS`@23 zw8&6>WD%qK$Rbenk%gP;BMWQQ#}@jkk1bSGA6rPOKDOXfePY3^`o!X=$`gxsDo-t* zs64f}sq)m~yvj3+qbkoVcB?$I*r4*rVWVUouWVWU1y0L@3S5?36u2x`C~#ZOR^YMhSKzU1R^YWPSKzbEQsA?UQ{cA@QsB3AQxLGU zQV_J%QxLRNRuHljR}i-3RuHyiP!O?vDKBbyNnX@)kGz=WGI?>!etB`rDtQUZ6nRNY ze|bquD|snP6?th(etBuj-*PgR&*Wq*FUiST?vsldgmPcjPEjP<*ST2;+wCtDFvaFTWw#<>$ zwv3k5vGkJFwX~Ggv(%K;x0I08x8#sDu>2uoX!%0M$nu7avE>OFW6K>fCYCE?Of6@~ zm|1qpm|0fIm|JGcSXjo&SX%nYSXnyASXmm%SX(N~*jS3n*jlp7*jj#)wzIq@ZEv|- z+QD+Zw1Z`{w4-H)w3DT;w6mqLw6mq8w2S3`DOby9Qf`)KrQ9qxOSxOllJc-@lJd07 zl=8F;l=8B)kn*-vkn*wQl=8LwDCui?Thh<+sHDH;ddUFGnUaB)Es}wj`I14F(UQTI zZjvFEhLRzcvXY^e9Fk#{UnIgUA4r5-o|TBO+$j-hxlAI;a*{-pWxYhSWsXFQWt2p$ zrH4eUrI|#WrHVwnrI18|C8I>5OD#W&lv&;sDYHB%Qf|3Qq{4ENNTp@9NTp?pNR_3p zNVTQ8NR6d}NUbH8NUh}y;X2Db!u6Jugc~d~g&Qp$gqtiSgqtis2sK-t5^AwrBGhWx zAk=0VE!1vlA=GXuCe&g1S+LXcl3e0Kr~MBf&mP5y5`T?*bDn zZwgGX+#@j2a=ySM%VvSemKg$5EPVy0S{eyVwUiK;X8DVMy5&*+8J3gyXIRGb&$QI# zpJn-%Z?@%GzS)-Z_~uv^^3An$;hSeE&Nt8U74Lk@eY^`SC-W|}%;a5YY0taJQjB-8 zv;3u)M;)!?Kcnr==?UF3am|yDhuf_Epsg=*8P^UtOqP_upF?Q z%yQ5&nB|bAFv}s!tIUTj=QAI%%wRrhsn2}O@)y%_%VSJiEc0|WSf=Z&u}sieVHv5j z#4<={p{2LZTuT?7nU=OX(=5$&CRrNj^jm7`^jIqCbXdyhv|5VlG+FZN)LU}s)L1g< zR9b%5F0*{4U2J(*yTI~-cCO_S?JUdf+8LIswNowUX(w4u(oV2!(~h;Q(vG&w(~huA z(hjo>(+;-u(hjt=)AqMC()O`b)Aq8I*7mUE*LJgH(RQ)?q2*}#R?FVH zjF!%t43<`!|1AtP|5<2g{48ZRv(HC|W*YP_)U)Oc>;r18wcO5>S@vBpyiZH*@uDjH8LU}yRA zX*{xEhpzGer2fF-F?fyteT(Dj_bqm+-?Lb)e$QgA`aO$&^}7~L>US+l)bCoPso$}P zP`_j0t$xSCR{f5JzWQwoCH31DBI>s-*wt@Y{8YPT@kZ^I#eKC~78liSSsYQjWwAr; zmc?qdTNd-wZdpuHyJgX;cH5#-?Y2dZ+HH#jwc8fKYPT)i)$UkWtKG5CSG!}Oq;|(b zOzn;Zm)c#6f2wyaKB?Zdc&>Wa;C&c`oN-C^?^l(>H~`y)dv=Vst+yPR3BPct3I?aP@kHgZ#Z8qb7Uxx-SR7S(VzEo*sl^7Brxwdpo?6UNd1^69<(Wl?$}@{P zm1h>ED$gylRi0ZUsyw%dPz44-0Xn9~SINKP`SJ{NLBoA5w6H!>8Z$IX`{$!si(+fsi4SYDWu43$*Ra= z`9p!l@|6Os-Bl(DI|apyh3OAleD}kCuw<9PReqloV4X!Icdu- zIT_0`Ia$kOIXTM!IXO#PIeAMhIR#5`IR#5rIYrA)vPzcsWtA<@%BooImQ}G_DXVHZ zT~^JqRaV`ySXSLKNmj!$P*&5@K~~GsKvvsQURK+ZUslKRzl^Tsdl@~;`!f2L=VkOQ z_sbYqZjdpwTp(j)IZ?*QvQfs^vPj0nGFisdGE~OY(oM$9(n7}EQcK3dQbxwYl269c zl0nAG@~O17b|N6492t5;2xP#bYh6iN{)Q5s$N+EFN!JB%WXy zD4u9(D4u93Af9CTQ7qZ=l30r6X0a5@sbZ;?WnyWTkz#3&1)V7Wl3!LnMY(K1}9$XMtrc&qB*co<){sJc}(wd6rnd{~6bv2C;LV%uivz_#7;JL?Y1b*wur zGgx<7DzomkyvwrNawf|j%P^L`mJ%#`EpIXJvz*7g-!g;wfTce3LCZf(hb&JqZLv(% z*P)lL)0u3kuG4R+sMBL9rPFCCtkY`A ztJ7r3rc-appi^V{S-aBmxptZ5E$w28>4OX{{Y-sjuyCsiN&`DWUCU$)oLI$*ApS`Blrs@|Bj8 z<$Wy&%gb7JmM64qEca?zS#Hv@uw1TXW;sX8#B!pRk!72ffn~Lpo@Jqyu4S5*wq>-I zre%PZhNYX9nx(atilw2JvZcC~qNR+MyrqzqoF#{rjO9N~Y0EE~l9sPDB`hCkidkOQ z6tz67DPnn8Q^<0srl92pO##bgntYaXHF+(kX!2NgX>waOYI0guXmVKQYqDFWYO-0z zXtG)cYcgAUX);+lYBE|{XfjypYyP)T)BI;4tNGVLMDvdYx8`pPX3bv~zchYYeAM`1 z@lxZv#RH9R7B@7$TAbJTVsTvKv&DXmPZrxXK3S~S_-L_Q3s3di7S`&wE%elHTPUdCwh&goWx=X`%i@RHEsNJ`H!bd}-L$x% zcGKdp+D(gXYBw!bs@=4ht9H|3g4!*M7PVUzR+8I~KQ8?^>Kwy=!q;^{&Ns)w>pJRPS0W zP`zg{RrQ`lr|Lb6I@Nm?#j5u$(pB$U#Hil42vogq;ime)!dmr#g@Nh=3suzz7E-DY zE%;R*TCk`-wD_s=(BhrSBa0_0k1TGgJhC{i^2p+-%43UNDvvETs64h;2@ zNh(h)I#ixm)T=zTC{=lCk*)I7B1z?`MTE*T3qO@-7OpDKENoPsTNtT4x6o91ZlR#^ z!a`i-g$19=3kz12mli*jUs^m@era({`IW^H*j}}XnK3Ysu z`ef0j^vR-3>9a+;(r1fsr7sp9N?$B2l)hSMDt)z(Qu=1Wt@O>}x8iq;H;Uga?kfJU zIH&l-;(+2$i;arEEEXyLvY4Xy+oDzRw?(<)AB#-IKNiu7e=U3!|5?~8{ERh$ojFT6#^pqF2G?o{(l#>^+1#qUC&9CCgq}Wy=~_70WDH70XCjRZ9<9HA{0@bxSo_bxSc>4NEpzP0MdG zT9(gbv@Ng6Xj>ka(XrevqieZBM$dAFjGkqujJ{=+jDcmgjDcm0jG?8kjFF|CjIpJG zjIpJ%jESYFjHxBNjG5(UX*0_k(&mPoTAmS) zv|KG7W!WVjZJ8+^W9ca#W2q?~Yso1dXZcbr-tv@Kyya@K1j}BrM9X}!M9UztBui7V zWJ?LL6wAM&DVC2!Q!P)3rdh5NO}CsPnr>MwnqiqFnrZ1Nnq{dknq?_2nr-<{B**fp zNUr5MkzC7dB6*hcMe;2>MG7p7L<%iqM2alkM2aj8M2an?L`p1KMM^F23zu1L6)v;v z5-zt)5U#K^7p}Av5U#R(Ayj2~NT}L!j!=zdxlpZTuuz?)zEGVdk5IkkE5QcK6M~JF z%LSV(+XR~|(*&C>-341L)dgEEIR#rS-w3o>o)>7h+$_*xIYXe+vPPiOGEtz*(oLY- zQd^+MQb?fJ@*{t*<$nG?%O3uI%P9VSOHKX>mOuC=TAtvWWI2;>l4TCxWJ`O#DVD-~ zQ!QWcPP5#{JI!(m?{v#7-Wiq-yfZ8%cxPIE;F)E4l4rK%VxBpcwLEhyBYEapn(@rD z6ycd~`GR|a<#O%?mKod&Ew#B9S-#_1Y`K|hiDf0%5=(oorIu`5%PcQ&F1MV+xxzAw zbA_cj=SoW!&Q+GzI96M(;8<;0&9TPPmt(D^JjXiAN9^k?+t}Az>alOIyur4?vV(1- zr32e0%O9+pEjO@kvCL-OYN^J$&GI43Hp_V|+byG5c34WY?6ADYywh?K^DfIQ=G~S? z%)2fBG3~KD%e2KZMrVU%sLmQoKb;kp?m9~>9ds62TItNSG}f7EsiQN^QcY*FrMynR zrG!q8rI1diCAUtiC96)80>vO|-{vR;$hvP_fH zGDnlcGFg+|GD?%pGEkG%(nFKQ(q5Cv(oB=lQdg6~QbqH>g|y~B3n9(F7F?QtEEqL^ zTl~=YW${7dr^R!P9~SpCzFS<=_-1iVjsHE1 zW$O1VW~kq_=vKdLQLBE}B47QEMUwg*ixBlY7Vhe|EiBbM=?S{o6wHp>&)oxm>P`ha{TkWPrzuHZUCbgRuWokDqGSzNc z#H!u02voae;i`7a!cy&)g^t=S3k9`X79wi5EjZL}Tl`VIZShg{w#8G`+ZH!fZ(E#I zy<>4m^^V0h)jJleRqt5LSG{X7MfI*lr|MmcTGhK2MXGl#(pB$S#Hil02vogi;ih`e z!dms7g@NjQ3su$o7E-GBE%;UMTd=4;u=uI+z~a5i1B)jr4=iq~Jg_*g^3dX_%0r7? zDi19-s64b-rt-*Qj>;p8Nh*&lI#eE8)T=zUC{=lEk*)IBB1z?mMTE)|3xAa-7OpB! zENoPsS{SQ5wa`>~YN4R=%tBn{nFXK9GYeLg=N3PepIbaver|D1`Gv(%Zg8#ZRR-7B7_ET3lCp zYjIrZoyB&gcNWW)-doI2dT-I8^ueN1>4Qb4(npIZrH>X~N}nvOl|EVMD1Ek&Rr+kf ztMu98zv35*4~kzc9x8sdxTN^a;;`a3i>->^EtV;Mx0tT@!=h91r$x2mPm5f|Ul#F- zzbpb3e_J>!{``F0Y*1jaEKy*!%urypj8$N>3{+sVbX8!tv{GQV)KlQFR94`$ z6j$K1 zmV)wvmVe}gEMLe8SzeYCw%ji#Y`I!a#Bzq5sAY?ssAZv?m}RV-xTUw8xTS@hgr%yS zq@}Q&lqG|ll;t~FY0EpZGM1-gWi5Be%2_U#m9v~GD{t8>t6*6qt7w@ht7sV@t7K^} zt8A$!t70iDt76G3t7`dIM$PiAjJoAr8FkCEG8&fqWHc?;%V=88m(jAEAfs*BD5GOp zB%@=QETd}~Dx+uVCZlI*E~9U$DPv$MEn{fOCu3;IAY)|tOxoD;w6uxk25A$^Y0{>a z)zW5`iPC14?$YL#y3!Vw!qS$OKcy@!?@L)(9+R@RTq|W`IaSKWvR2C0GF8gX(pSpf z(oD+UQclXjl3mKt@`I$K{+2Nk0hV48ftD5$ zL6&L~L6#yC!In%CA(oHDLoE-9hgvQa53_6#54TJZkFc~CkFZn_kF;bIkFtCy7G-%z zEZTC3Sd3+xSd3+cSgfVDSe&JvSe&JxSiI#|(FDs|qKTIKMH4NTi6&Y0h$dSWi>6pc ziKbXOiKbd=il$i#il$rs5J|UuAd+EuLL}32qezzJERk%>7LgpwT#+2haFJX~N0B^B z9g%!XaghQ`CXqtRo5F>b8-$B2+k}fPV}(mBjfG1rxrIwDp9qy%?h`7voFP?_r zXY4C2d)QZ5ny|07yvMfMvYTyQx6EPPV5z~n!SX4~M$3gPn=BJp zHd`vNY_@#Nyv1@k^H$4T=53bd%-bv(n73P=XWDETth3(IM`w+ttIi5bdz~eg7CH+p z4Rz*PYU#|hRMDAcDXTNtQe3CsQb4E2l1r!4l3AzC@|Sj#VwhGngGnq{GOvSq4vqGhCZoTaaJjHRP?q@}5LxTThM zh^3r%kfo4zfF--OujOwoZ_5u_o|aFw+%0cvxmupna<)9I<+T85U1TKbk@TDq1#S~`}FT3VLoS{jx*T56U`TB?>3TFRDu zT1uA8S_+mwHRUWnXv$hX)0DQnqbX&1NmIh|gr>OVeoax!t(qd1t2Ko!7ikJw&d?OF z?APSCY}4emtkvYPEY{?<%+lntOw{DCjL>Aa^w(swbkk(DwAEy>G|^kf=lQlkAbZfk~Xx4aVQKRwJqD14ZMUKWBixiF57BL#HEJ8J2 zTKH%bnT4LlGYfT%rxx-WPb?%fo>&NKJO-cT%cSuLe3tJ^@Hzeu zEY7Omx7e?K-(sWsJ?I+$yA~blcP*;b?^xuj-?2zgzhe=ke%r!T{kDa<`fUp>^;;IQ z>bEQe)Nfiaso%8ts&>=jh1v~^+iEu~&Z*t7IH-2RVvE`hi{)xJEM}?Qu;^90VbQ2| z!=gm(rbUL@O^X<{n-&3TH!YmiZd#bD-L%kFyJ;b>cFRIo?Un_*+AWLUs<$jYsNS-8 zqI%2XhUzVgv#Pf(4yxX^*s6NlVwLJ`i}|XzEhekpvFK2}V^OPm$D&B}jzzla9gAqy zyA}becP(61?^;-?-nB4Ly=$SWde=fq^_~U4>OBh<)q57dRPI^4SGjNTMCHE4EtUHg z=T+`o996k*u}kHF#RioJ7Ryu~SjpY zII8^2VvF)Ki^a;%EG8*Gw`f#;Zc(88+#+82g@wQJ3ky5t7Z$q8FD+!0Us~`ezqI(R z^vdFu(kqKwO0O+WDZRGXsr1HTrP3RVnM!Xhx|H5pR4Ki)$X0r15u^0p!dL0Ng`Ls| z3w@;z779uqECiK4S}-bowD_d>$>NFPXN#+fpDm6nezDl0_{CzC;#Z5=ieD{y6~9^3 zDSopkQ2cI@r1;$;MDd4(o8k`(3&o!n+KRs{WEFo|2q^xxU{?HX@lD~6#S4W$7Pl4t zTAWw-YjH^7pT$;%{}wA0{#(pZV6g00V6bdfV6-e(V6@CuV6u!?V6qHRV7By7V6n7S zV6ik(V6{|JV6~K1V6zlZV7FvZV7L4%&tZ8-p2PB(Jg4Obc`nOY@?4fJ^4ymB^4yk@ z@;sI<@;sJ$^1PN(@_d%8@_d#bZ5WRX>}{34@l`9wz9@`{X#k%x4a>( zZ@E|6z;dy)p=GDEp=G|bk!7f~v8A=NiKUXXi6y7BspWeqGs|mI=9YV<%q^ElSy*;U zSy~oLSz1O*Sy{SBSzGE#*;tB6*;xLUw6%O8X=iy+(#~?Xq`l=*Ne9b5Ne9acNk_{h zNheERNheDSNoPwHNf%2&Nmt9i60VjnCEP5pNw`}cmT+r%N?Sz zmUBhpEL%k5Ewe@AErUc8EUiQnEtN!*EV)FJEI)}PTizB)u{xt1%1^DG;M^DQHU^DPa83oJQ=3oRcA z6q;!5YiQ0=1S$1!^r<2-I2j3e;N`2{c$n2sB#S2{c-&2sBx82{ca$lqqE$lq@Hk+0qI5MPJo6uwT&G`=oNE50sEKE7_t$Gkn3yLfvoC-U}MX7ct~ zI`H;eO7Kpw{KzxG@)XZR%OyOMEbDnDTSoCru{7tIVkyEi)$%F#G|Q#j(=AiEr(0@p z&#-*WHPdnf*DT92u346LT(d3NxaL@%=bURflXI?RD(5^)W6t@OOq>fWFL5leT*R@^ zvYca)r8mc7OL>kZmM_?sSWaMHYH7*7%<>7_GRp~U%Pk$*R#^UEU1_uO6a z*438JS=LxCV_9pN#*m1UjfbLRDytC=@g<}+`wv|`?9$;`aT@*>k_OD~=EmM%K0 zEp2sHSeof9vDDXDV5zAy*HTGmrlqvbG)qyP$(DRN{gxa$J(i3*otEFV+bmycH(TD- zuD86XU1NDfyV7!pcDdzh?GnrR+J%;rweu|7w6iU%v@ihw1X^Jv;!=EYWZ2d)$+D{q~&ROUCZ6_jFzkA0WD|Cty+$j ztF-Jb=WE$oPSLWq?9{Tftk*KPEYUKx%+xZrjMp->4AIiJ^wiR`wAa$HG}Y3w)Y8(h zRM1kl6w^|*0O}lcl02qosrX*{(M*LY&VukqM|L*uap zqsAkPFY2JPd>>le0H5OzS?9N2{hq}_^?MeR)$dxgso%AzP`_i5t$xQMR{f4efck9< zXZ70_rs}sWG}LcdNUPtn;8VY8!Ki-I;)~i1i|1-LEN-dYusExB-D1Dmb&E}E*DaQ* zUALI2cEh4a?S@6Y+6{|hwHp>`YBwyR)NWY#sok(}QoCVcrgpTQcc)!PSXA#?{8G7V z@m}Sw#Z#5L7PnOHT3k@MXK_^Jp2cpJdlnm1?pZ8Txo0s)<-WxvmHQSQD)%kwRqk7q zsywjBR(W8Nr1HQbQsse#zsds(H7ch<);<_%Fit9m7iJY zD?hW4Q+{s2r~KUFuhI*Pw@NQ8?kK&qIHUB^Vvo{Gi#1BGEaoV^vglEIZBe82+9Fr! zjYXW&8w-D>w-ydcZ!HX!-dZRry|WNjdS}6+^xoo|;(LqdiXSX)D1NXwsrb=ix8f&@ zwThoC<|%%*n4tLCqDk?KMTz1Ui!{Zr77>bHExZ)JS=cCkv(Q)kZlS37-9lLLhXtGB z4~w4)KP}!U{Is~Q@XO+o!f%VC3coFOD*UlnqwvRKzQSLN$qIih+7 zR@`#2tc2wxSqaNVSxL(RSt-kSSt(0DS!qjKSs6V)0n~b`pg^Y%!ri_NA zw2Y=DuZ))Ee`zhtC(_!MC#7{P*GubIPLtNPtdZ8UOp?~O^pw`OG>|s16qh!%{3m5( z`Bcit@{E+R2cz`9Zc%bDwu|UfUVnLRh#DXoShy`1gi-lN5iiKF(h=p1z zh=o})i-lW07Y(;OBN}13Q8dzWnrNhDjcAl*vS_rWmuQTok!XyilxVCavuK>C3l36&%@{Ulhx6{&|x64w3x7+d~Pmkp(o*v63JiV6nJbjkYJpGpDJQFNM zcqUjr~L%&{!ym}}|DG0#$-W1i&;_W72R*%w&avM;oJ!M4zHI@=;k zSGL8LzgU-8Zed+&na{e^Qk!*|0XT7Dh&T2~&ofVdPI!i3obrx7E=*+d0(wS)~tTWA$S7)*%n@+za zgHDg-XYEeQ=h|(Sx3rrr&uTYV9@MV2+@f7&xk9_#a*lS1zO&QB0 zno^d#G$k!JXo_1d*A%myt0`hRMN`P?F+sy8iG zs@}Ait9sL7lIl&1Hr1OJ)vC8F3RG`dq^jPsh*G^};jenj!d3N_g_Y_p3w_nw7AmT@ zEhJTMTkxyiwqQ}cZShOxw#9puI~Gq>?pWMXxnprb<&MQMl{*%@Rqj}9RJm)hOy#b{ z9F@BklT_|nbg105s8_jXQL1v!B3tF2MUu)ri%6Aw7XB*tE!4inT(o2hcrI!{7O0O&em0npmDZR2VR(frrqV(EAROyWcyV4trABt}+ zUMaq{xUKlk;;iC3i+zgkEjB2=w^*q7!D6!F2a8t4j~3;MA1yK!KUqX8ezNdY{A}T% z_}Rip@r#A3;ui~X#jh4zir*~$DtxneukhXCk-~S2s|r6XPAdGc*rV{%VuQj@i^U4R zET${`vglIyZBeK2+oDL}k42ioAB!l3zZQN9e=VF8{#lqS{Ik$e_-~=8z+fq+z+lO( zz-Y;!z-akOp2_lxJd@>qd1lL%^30Y~7W<=HJo<=HJ6 z#wG@$2wPce~v-~8jZh2i=-Ez0IhUG$OP0J2xEz3M< zEz3}8ZA)8e9ZMByT}y6hUCU2WdX~4O^eqoc>07RpGO(N|WoTI`Wn`HsWn}3oWo&6A zWnw8UWn#%9Wor3O(#-OPq?zR*Nps6Jk`|WJB`qu)B`qzpC9N#OB&{qRC9N%WB&{vQ zC2cI3C2cL=OW0c8mawxtAz^R1O~S!)v4n%=1PMpWIteGs90_O3XbERaPYD-G3kg?C zH3>IMQ3*Fo772ID7vdh4$HYA>mx_B@wupOKCX0JnI*WT-DvSGAvWWXwJ`?k`JTB&E zxl+u}vRlmGGEXePGDs}I(o`(aQc^6)@{eec?V4md;!92_9g87!^f(4f0f(4f5f`yh6f<>0U1d1*13KU!J z7bvk@EKq9MCQxdbB~WJRCs1x_EKqJKB~W3>C{Ss6k-y4vA%B%+A%C@{BY%yhFn_J( zQ@&cuoqTncJ$&_+@q7)I#(a&I9DI$IcX^vEx9~Pw_VBh?rtr2{+VZwqiu1Nve&lJl zJk8T#xs<2FvVo`5GMcB$(t@YkQk19L@)>uJgJmTS2tSe9^2 zu(aWtXvxAg$?`1cB+D6`lP!}tr&#K9PO<#UG1c-c$280N9Mdg}IA&P7am=)o<(O&t zl6{utRQB1Hj_h+R-?7cHoXs}Z(uZxHmRnipTNbh|u+(E+X!(X^k>whe#g@4& zi!Jq7mRP=LUTV3Sd8uUu^D;{Z=H-^$%quLfFm1N9)LCz7q_f&mM`yXEs?HKid7TB8 z5;}7&1$Aaxa_da9WYw8$`B%H&@`HAd0mZ!9vE%#|RSZ>s=wOp!QWjRy3 z+_G1@#IixV(6U53&oV%92Yv-15Ix zsO4v^V9OU;0hV{Q{46hN`B)y)^0M5mEfY&uEh9@SEdxsfEj>#$Egef~Ep1CdElo>yEp^MknrfDxHB~HM zYARXY*HpB;swr=IT2t2Ykfw~~4oxY`b()fvOEtwUXKRXCPSO;$?9ddptk)E>EYlRQ z%+=(#Owr`CjMn6_4ASJb^wi|CbkO9qG}mOe)YD|MRMlj)l+|Rh6wzd|iZe7D%9@y%kL##f7F8ec8uX?(Gm zrt#ULPvetCyT(V0dW{bjSZHfJw@}u2W+9{T)Ivn#i3P956ALzt#}BE;)m*Wi?^!REgq^~x45c$!{U_c z4U2uMH!L=*-mqAqdc$Il>J5vDsy8g!RBu>RtKP6EP`zo9s(RBRO7*6Nzv@j37uA~< zmZ~=`^i*$JsHonwkW{^8!LNGDf<^U~#V?gx7VlMVSv*y_WpPX8w#5aN+ZM-EZd>eD zxoxpg<+jCgmD?6`Rc>2MR=H!*sdC4nUgeHOsmdLT9F;p3Nh)_OB315M_^aHta8tQ! zVXJc2!bIh+g_g=a3q_TC77{A=EcjLKS+J?xxA>!c-{O_>eTy5)_brYqKd{)U{J>&~ z@&k*>$`34>lpk0WDnGPHRDNg?sQl2vLHUt|f$}2@1?5K;0?Lmq7?dAdd{BB~@lffB z#YLqj76+A{T5ME$YOzr1nZ-n4k-w(n||* zrI!|*O0O(_DZa9Jqxjn5p5kkZ^NMdQ4l2H}*sS>0Vu|8gi)o7QEIJh5SyU;$x5!a^ zZxOHf!6H!cgN3u=M+-B>j}{t=pDd&mKUwf8ezssx{A}@A;fuvHg)bI26~0=WQTS@H zU*Vg@W`%DS%N4#`%u@Jn(WmgkqDkS0MVZ1+i!6no7I6x{EP@n%S-2_uwy;w8ZK1F5 z$3j`*kA;N7UkhG^zZT32|13Vp|F^g$|KH-MJcH#1c?Qc_@{E?P@{E=R@=TV|@=TU) z^30Zo^30Yp@+_7d@+_90@w3ZdM)RGmml#&&*%k5G+mh+`_E!(AZ zEeoXdEF+}!EghxwEj6VKEQO>DE&oUwT0WIDvOF(oWVuVy*m8-aiDkc}sb!UufOUsuMR+d*KtSk>nSX-`_u(6ygVPn}PVQX0-VP}~p zVQ(2KVQ=Xy;b3Vb;b^HS;bbWw;bi$=+}ZN3xQpdpaTm)u;;xp};%=7F;%=7K;_jBx z;_jAz#5^qTig{Y@7xT1SDCT9^BIa$GCgyGFCFWzPC+2G@B<5@RP1MiwmZ-nweo=qR zC87bAU7~@O`J#cAp`t;SHlo3nDxx8l+@c|tUqnJJ?}~(39uo<-+#nKRIZGtMvPC4) zGEXGRGD0NU(pe3BVVR=@-24@;^43{)@YY)< z@-|pn@ithB@HSe$=V`J$#nWuLl&8hAfv3eXhNsoif~U<=l&8(|8F#zo67CMmWbRH& z74A;U7hGMIYq+{Ci@3Tit+;wDnYnr`&v5oyPUq~iOy=yj)aUHC{L3-H@(jmB%Xu7= zEDJd%Te@;gwv^(SV)=}Hs^wJnX_hYR(=9)-O}AXYHp4QIZKfqN+bqi+tg|eOSZ7=6 zv(B-6$1>M)9m`zHJeGNu1}yU}KQS+`+{V1XvYL6Jr4#caOFrgBmY10}SsLoBx75;E zZKxme51a)y?RWv`Z# zWs{b@Wx1BEWv-UBWs;VaWw@4wrLUHmrIVJ4rG=J}rJk07rLvZurKFawCBK%oC99UE z@n~@>vFG@>sfSa$DMIa#@;ca$4$WvRf)^vRO)NvRVph zvRHCyGFdWeGFtx7V6gn4@!#UP#y^Yu8hOPWYMbe$)Z-{qeZF42a7z7_ZDdy?=0dp-dcofys_}tcx~aK z@!G;c~tsCM1rirRIH6KdBicB@^pSf_T)Vv*W4i>YeYEIQS$ zS=6XqvnWuzW|6FR%_3awnuV9zH48hnYZgXo*DTc3u31Q_U9;d*yJo?pcFp3u>NShk zs@E(Ys9v|YqI%upr0R8xeX7?jHmP2>Sgv~AVz%maiwUaNEm~EtTU4oDx5!t$ZjqvT z!y;1khJ~N%4GU-08y1$TH!Sp2Z&)a+-ms8Vy+# zOXa4;1(ll?$5d`w>`}RCu~Frg#d4Kf7IRf@Sxi>BWznf}%c5T8mPM(`EsGqL+ZIVG zw=E)7Zd>@P+_rF2xou&qa@)d0<&K56${h5;`HrAHQrlpb4bR(fo)Sn09FWTht-ElN);N|c^hq$)kN2vvG& z;imM=!d&T@g@)2I3rVHt7FM$Q3g0Xe6~0@9 zDtx!_QutwEr|`qVNa3f2y24KjX@y@F0t&w@SQUO-e3k!g@j(8M#cBCJ7F*^2S}c(N zYtb$L&!SxZpGA`Ve+ysv{}vYV43;YL43_-zjF!LUm@J>mFU4i z9E)X(9IIu49GhjV9Gj(=9J{5t9EYWf9EYWl9H%9N9GB%gSuV>vvfP%ZWO*!i$nsb& zm*usbCd+5pD$8$KBFk@?EGu9cBr9O)Br9lXBr9a8C@W+sC@XBqC@W(5QAWh_p^T{I zMHw;6Lo#BPn`Oi;7t4rSPLYwYY?YC;ER&J6%#e|?jFgeK^p=sfw3U&u)R&R9RFsjm z6p@j$WRsD%{3I=Jd0kq;a*wovmW633@Yx!AH*Yd8Up5<{# zeanrK`j&Gf4J_Lw4K0f#4J~6OjVwJSjV(qY!UUb%o6pr3=s9RG#B-^loR#0WD^ard?ylU zc}*n9a=%EBpmcb(7mUbfHmYO0FmLejNmj8vLEUybkS*{n3 zw(Jm&u}l(O zDVFO5Q!V=h(=77@(=7c2(=GJ{Gb{xKGb}#~WLjPo$g{zA(H{z6Mb{vu0e{$k6kd?l8v_)0A6`ARKA_{uD` z_{uFA_$n-~@m5%_<*l@A<*l-e<*l|f=dH06rW&$(JH*KoC27IC#%T5z>nGIDiTp5g4UoX**4 znatT`X~@}a`H!R9@+?P>_8?>A(OSK#Se5$Etd0SJ(@}j1)<#A0#%e|WNmRmICELUmD zST59*ww$ghY1yYKVcDW7W?8K%YFVTyY?-MkWSO8TXc?}_Z|SGWXX&cRYiXm&ZE38@ zWvQjfX{n^iZYinBW+|Y_YRRF=V)&v#&3%w z8ow-dYy7m>tntHQwZ?ag#Twr%W@~)4n5^-|qFdv$MYF~yiyDoO79|=VEOInHSfpsY zw}{nvXA!FL*1}KYjfI=WYYTggR~F_PFD(o-URY>oys%Kzcy1x7@ytR< zjVBgA)gN2DR)1u1NByD2IrWDY2h<x7H`z9TijQ>ZgE-dn#D1-YZg1zu34;AyK1pO z?W)BTwW}8GYF90))vj9Psa>^5QoCvqrgqiBQ|+pSt=d%!L$#|Gs%lp)B-O53@Ty(4 zU{t$i@m2Mj#Vgfo7WY)ISzK1VW^qFGn#Eq#YZe<-uURZpy=F06^_oS$>NSfN)oT`& zs@E*?RIgbit6sB+P`zg1t9sqSS@pVwh3a(+UDfLr%Bt5bBvh|k@Tp$6U{<|u@l)lx z#e0?O7Ee@eSlm*%VR1p_hQ%?J8y0(1ZdhzoxnZ$f<%Y#vl^YgQRBl>ysob<^P`PPQ zrgGCFN9CqPvdT@1NR^uw0V+2w+*EE^*s9#JFj2W>p`~)mLQ&vDc`klRK9Cr zsC>^tQTd*Qpz=KnM&4^o8(o>6nicc-xD?YP$sQAp{vf^`#ql(Wh zwky7{SgH8JVvgbqi$2Ad77dCoEs7LhS)?kyvItjvZQ-T(+QLThjfKAA8w(}Hw-%y` zZ!Opr-&y=pcxUle;l0HJh4&U$6y94LSNLGDOW}jXI)#rG3l%6tcMA@M?-sx1e^@+~|6y@K z{-?!m`JWcccQ>BmdhXL;kl#u>2njd-*>W+VX!b#N_{3Fvsew|p$i zVR=!O!}5SEr{y|XF3Y*HT$bIk+?G|c+?H9gJeHBNyq2D_yq1=-e3lxr{FV~3{FWTD z0+v5y1T0_32wL8h5wbifBV@T#M%Z$djIiZw84=4K8Bxnx8Bxo888OQQ8F9-X8F5Qz z83{{M83{{u8A(ei87WI187a$u($bcXrDZHnO3PTTmzK4hDlKPOEiGr6C@pX4A+2Dk zC#_&9Dy?YwS4zq9nUu2SIVok!?NTb13#3#nJEc@Di=@;nqovd>U8U45^`tZ`#icYX z8KpEWUrTCPUXj$Y+%KtZxl&Tca*CvmWu2t1WtOC_WvHZ{rK6<2rLLsDrKF^RC99;N zS}pb)Xj2}sJrD1QFqH)Q4h-$QBO-RQ7=nF zQ7=mgQEy8IQ6I|}BEFUvMSLxHiTGJA7V)?26$!Ac5DBzQ5(%{Q6$!Gm6bZIe5ec#6 z7YVWaCLC&cPB_eRxp25;y>Pf?q;Q0#iEyMPzi^c0E1@XMqe9V^i-ck<>x5z~ql98D z&4l7Cg@xiQKM2NKo)t{6TrHSj*(I20nJJiL=_QzCsV$gn$t##*`CcH!@}fYhaSZeX-TK?tBvpmn2 zZ@Gvs-?EIaz|xnm&{CPN$nqC&vE@bHV#}4hC6AoXwWgIa@4KI9n|ZINL1$bF^8W<7l^>&(UF7z|mpp%+YBn!O>-To4wnz zm%Yc*k-f+AD_gJSa<)Fp2)2GpF1CKl{j3u#%UCB`8nRBZ{J=8Fay`pr%OaL3mc}eo zEWa^NwcO1-&9aesx}^v6bW1_z8J4%0Hd!j@th1EVS!F4#v)qzLXR#%l&H_sYojI1D zwP#vB)1GE|OM8;#S?zwygW5foTeLeZS7^6c&e3kRoS@xc*`i%*S)pBJnWJ59nV?-_ z8KPZi>7ku(X``KEX`r2Hsj8iBDXE=e$)}xU$)p```CTj4@{LxMMBn`Nz*i)FEvlVygMgJrCion^3=jirZ{m8G4Q zg{85UnWd(diKV=jk)^1XfhD(=z9oZ}uH`pPZOgZsnwF0>H7svxs#%`bRIxm&scgAh zQ_*shro80}O*zYXnlhGCHKi?kG$k#YG$kx6HN`9oG(|1bHH9tXG=(ffH3cnwH2E!^ zHTf*9G9~#Y^=^7Pr(NS)5USXt7WIfyD;(`xcAT?}N|sZCAf*QK^2{ zB1ip>MV$I=i$L|;7B1?yEX>t!S!k)>w2)Q5X(6C~!-84;hQ)Wa>lUxnu3OwyyJm4w z?V80AwW}68)UH~rR=a93U+t>JB(h@NL0IO5vq38!b9zKV{s}^@vuUcGEy=rkx^{T~g)vFd8RIger zRlRC4OZBQnzv@+sX4R_}6{=S)a#gQdB&%Mvh)}(1;j4Pp!b$b2g}LfA3tiP~7D}qu zEF@H~S@5b}vtU-eX7N+yn#DVnYZgybu36ktxn^-e<(kDYm1`DzRIXcWQn_xiLgl)} zJeBJfQ&g^7bg5joXi&LsQLb{`B3I?QMY75bizt;F76B?ZEZkIXSlFuEurN`%VWF*Z z!$L{rhJ~ccO$z~)n-=UUH!c1u-?Vt6eAD8V@-2&#%C{_bDBrSJu6)a4n({4+R^?k3 zCCaxgQj~971S{XRa8|x;VWfP=LP`0Kg^=App~(tV2xr3V(7N)Ifelpa`kD?PNZQF>^htMt%9PU(>aztSTM2BpUq z9~B>4JXU;SaaHk&#c{`y+<%K4IR?u}IR;BNIYvtp zIVMX*IVMYfIcCehvdosRWmzn5%CcG>mu0owCd+2IM3&uhvMjr0lPrg2p)7}Gf-I+{ zzbu!fy)2idzAU$;yezjRzbudCe;HoO4>G)#4`lc(FUas&9+cs?+$bYpxkyI9a{PgTZT%@SXxWVSSm@&T5?LuS$>p~v%D!KZ+S>c!E&{fg5?w`Max<# zCChXvCCdOQWlJk5WlI$)6-z!TRm&fes+Nx=)hy3Qs#|W8RJU9xsbSe8sbN_zscD%c zsb%Rasby&?scoqysbeW5sbl$1Lf7)Ogr4Pf2|ddr68e@KBn&L)N*GvnNf=sINElkC zNf=p%NEll>OBh=kNtjqFN|;&-NSIpw6F0NGCvI-JPu$#cp16f&ow$W%oVcZ>y||U7 zqPUeMleo3z6ESPcV`4UzE5vLqyToiQbH(f|1H|ktO~mXiCBz&o|A;zRJ`{DdJSOU7 zxmwiOa-yiSWx1$}Wt^z1rK_l`rH-hZrLd^GHVV1Lm!Y#{%A}m9NA}o!BA}#raqAcGEMp>Q`jJ8}M7-QKk7-N|x7;EV! z7-y+27-z{T7;pJnAi?sSK!W8)fkewG0*RIt0!fxJ0?C$+0?C%@0x6cf0;!fS_|q)6 z@~2t0@TXgb@Ml=6@Ml$(Ln0moMA0kT2WPl`qFqhA-FhGjE>dY2JLxCA|5T zHM|9uVZ4Qw`n*M!oV>-BPkD+h5Au{)&f_Vytl=rMjN&P?wBRYX6yvF|e92v5xs1Eg zGL^f^QkA>P@&#A5gTAt@< zvYgM+Y+1mTW-|uv0SR%X*pB7&9Ya! z*|Jf)!Ln4l)-qGO$}(2F+%izR#L`u}(9%*n-%?LI$5Kf<(^6bJ-I7~7#gaig$?}U< zyyZ)+Sj&4_QI?mrA}o(o) zEho!pEeFd0Ejvp$EgMT4Eh|eyEelI^Ei+45EfY&2Eh9?~EknzHn);SsG<7XsX=+JKaysNc7Mo#k5&KF9x#MU47w3xD<77EbE7plkeZT1czkwBS>}VZo?=!{UqDb&D5j z*DY?VU9&i^cFp3D+Et5fYF8~*s$I31t9Hd=g4z{}7PTuD6>3*3a@4L^#H(Gg2v)md z;jVVY!dmT$g}&Mq3uUz{7UF7GEV$LKSo~MLV)0q^ip6u)D;9TDuUK4Ay<%}x^@_zV z)hib3Rj*hqQN3a@Q}v2PpXwEhX4NYe6{=S(a#gQbB&lAp2v@yg;iG!R!b$atg}Le# z3mw%f7D}pDEW}l>TJWk~wO~@cYVkwms>M5%s}@gGu3FquxoUAi<*LOom8%weRIXZV zQn_leLglK(Je8{!Q&g^5bg5jkXjHjoQLb{$B3I>_MT*KbiztlW-P*Dd}kU$=OpeBI)<@(qhq$~P=_D&MeJp?t$) zy7CQ+Hsu=@rOG!gQk8F7gec#%a8bT#VXS=9LRtBig|PB13ufh87N3=FTRc{}ZE;2E zw#5;pI~H4&?pQ2Sx??e2>8?eG(p`&6rMnhcO7|>clU2VynVyixmp5E#@e^v6!In#-c^xtwn{xTZ?RkcNXyq?<_(T-dT7kytlAbcyD2- z@WDb&;e&;g!bb~!g^w023ZE=K$$zrABmddrxcp~}jq;x@=E#4sXqW$DQ7r$}B2NCR zg_ry{3p4p|7E1EpE%@ZWTl|*$Vewq2WXCimZhMUKJplPsg<16fAPbFxg9du5p{SIaV6&XQ%Z?387( ztdM23OqXS~43lNEbdzPbG?QhwRFmbf6qDt!WRvBz{3gR``CNv}@`enz{TgJ=qTL#JqSUSrHSenWRTB^$kSxU+XS#rw=TmF$2 zwtOTlVtGPZ)N-A)sO1!CG0SRcamyrWaZ68W2}=WMNlS5QNy~pyQkKu8q%F@%Nn37} zlChj8C2QFsC2LtIC1)8eC1>d>C2y%OrC=#3rC`Y-rD*w1QpxhBq>|-fNoC7*lFF7d zBvmY%B~>l+Bvmb=B-Je4B-JbpCDkouB{eL$BsDC*OK4g?kv{Vyyvg8wWw)`sMY|(hp&-iwpWL4g5)#0sP69iu@^-pZHQNkMgBj&g4t8%;ihBbmB|56z9vZ ze8-zwU!Gw>MRR6>MUJ2>MbQW8Z2+JH(0i_H(HvpH(9=AYqng>)?yjO z)?&%e)@pf#wav1cwawCqwcYYPONZqKmJZ7TmQG7kmM+Vm%-xoInY%5UnR_g~nR_h- znR_koGi|iw*I8@Hsk6$GNoSemPwmB)Z?xxIKG2?Hd0Bgg<#Fw)mbwN`)3Qsu&9Y9r*|JEx!7@#|)-p=F%F<7}+|o(A#L`^5&{A7F-%?&X$5KQ)(~?6w z-SV$iisdJ*B+F-7@s_u>Vl6LdMOz-#im=?J6=u0!E5ve%R-olfEq}{CEnmxKEpN+8 zEf32)EjP<#Ef>p3EhkGqEeA^%Ejvp~EgMUHEh|e^EelI2Ei+32EfY&NEn~|+nueC2 zH1#cCXzE(t)6}-Ss;OmpT2sUFpr)GTc1=~wb(+eSOEeWNXKN~0PSljM?9i04tkaaX zEY*~>%+ZvvOx6^$jM5af4Ad01^w1QtwAU20G}Gj_)Yas(RMF(Il+on26xQUjh~=ssNb^yo#k7qe%B&h{f=%LQL(l1((`oi+`$@Ek3DUws@|3+2Xe9 zWsCEwmo1K{Ubfh&df8&F>Sc>Xs+TRMt6sL~RlRJ{qZh|$`y-EDpxF4s9dp_r*g$&ipmv>Zj~z*jVf0x%2lpdMI$YZh;muUXtyzGiVs z`I^N}M+s`7PS_ z;)~KviziAqEv_itv^c7C%VL|-EsJGJw=8BT-L~jdx@}RVblW0Z>9$3z(j5ywr8^e( zN_Q*_mF`+7Dc!XYR=R7!s&vodo8mo-7mD{SZYtilIIVc!Vz1%@i*`-`Nu}0yg#e9XA7LyfTTC^*?vZz*gWs$G&+9FxuwMDqX z8w+oRHx>>GZ!Am{-dboXytR;1cxNH3@Xmr=;l0IA`S%u&<= zepvL%{jjK#`)QFO_tPR&?w5tL+;0m5x!)FYa(^ti<^EXwl>KY*T=t*EHQ9d_M`Zt7 zY?A$Nu~3%5a)K2#%eOLY zmiJ`XEziraTON?%u-quaVYx_#({i#5mt~6#mu0C8w`H0Pw`GJ3kEN#!ucfsNucfXG zpQVBfpQVrtza@(dzvVk=0n01Wf|k3a1uYjy3t6^H3tQ$&3tNUti&)x7i&`p6i&}C^ zi&=h_60^J|C2o00O2TrLl!WDEDM`y3DM`yTDJjbUDQQb9DQQa;DH%(CDOt;(lCqXh zB;_p6OUha9l9abxDyd*OK~ll8T2j$6O;XV^NK(ntPEy%YOH$cVOj5;?NmAAFy@aae z9SJqdQxfWy+a=U3mq=(>PLj~Dte4QV%$3lxjF!-{^pw!HG?&n}RFlxL6qV4mWR=jh zd?~JHc~V@@a)r3QWrw)FWu~}+rI)yYrH;6vC9k-V<$EzB%S&R$mRrS4EN6(BSXPUf zTE>Z)S~`iDS*nSdTXKn6SiTpvu)HE_X}L?(%5uJ_m1V1_wPm)bjb)Iijisfit)-%< zoh65;o#h7+d&?Ul4weT+94%LgI9g5?ak8uxakfksakdN;aj~=!akbPCakCT_akFF) zakso7>|wc4*u%10*wZpq*vryh*vnE%*xT}}kdNg>As@?iLcW&WLVlK+LVlL+LjIPj zLIIX6LIIYK1p_S)2?kj%6b!O#6b!aZ5Dc+&5Dc+Y6b!Xw5)8F`A`oVIOd#BHl|Z;< zpFo6Vu|T9{gg~UFtw5Bel0dX2hd{LDJ^mQWHT#PTd>iRDbrQp*(1GD{=QGD}9za?6Vx6_yJ)DlCgQDlJ_(sw^cqsx5D`S6jBR z*I1gc*IGVjtFv6dR%aQ(R&UAA)?j&*wZXE6wb9aqwaM~5OOxd~mS)RBmKIB6mR8H3 z%&nGtncFN|nASPD*I8@HsI$`YtM)R>m)eUg?`Y4ryr4bD^04*{ z%kA1zEmvz#vYfBoZ#h}J+p=A|!?Iet)iPhZ$ue2H-ZEUf*3w(M%FEf-54EhkGSEeA_;EjvqHEgMTEEh|e2EelIN zEi+3NEmO;1n#PtNGz~4EY3f_v(bToPq^WIrQd7%vzov%eR!ud_HJYlHi!_xjXKE^1 z_G>CwwrR>))@aID7HdjdW@$=VCTdDpMrevz`fG|>x@ihq+G+|}nrI4IYHRXaDrxdr zN@?;~3Tkp&a%yr}GH7yG{?K5ze6PV~`CNn5^1cSMFw5k1URh~@B)bCj|s^7CHR=;bJst!5F-%I_rg{}H6 z3j_6A7Ru^3EyUDsT5zi0u=t~P-Qt7Vb&JPp*DS89U9&i)cGY5^+Et59YF8|ls$H>| zsdmMpSM9PzquOPQQnkw#8ETg;V$?2M1gKrMa8bK#VWD=}LPzbgg`(PJ3sJSp7MyCA zE&i%rw)m)e+2Wb%C5v0Cmn_b!Ua~l>ddXtD>LrUcs+TMls$Q~~rh3VuTlJDfgX$%V zGSy2K*{YW;5>zi)gsNV$@K(KK;h=iS!c_H=g|_M?3kB6n7GkQGEO=BeSumOcbC5y)@mn?3oT(UT?a>?ST$|Z~4Dwixas$8~Mp>o+`p2}s5DJqvOx>YV)G^$*- zC|9{`k*9LmB1Pr0MYPIgi$Imj79J{>E$me;TbQa`w$M?zY@w`j*+NR?vW1|^6$=iP zD;EEhuUNcQzG87(`HICU83@M z(oKsTrJEM9N;fV1m2O!$DBZF!Qo3cKtaRH#ROz+_yV4ztABuM@UMb$OxTAR2;;iCb zi~WjsEjB9NvskQn&tj_LeTxpo`xaG-_bqZ2A6O(PKClQ@d}!gO_|U>i@sWkD;v)+M z#YYyxijOVW6dzmsQh03fR^f@o1BE9RR}`LFoKSdbv0LG(#d?Kj7K;_0Sxi@WX3?ea z+@fCLxka(U3yXAx7Z%Y9FD?8PURt;)ytJ@Tcx9oZ@XA6_;kAXB!fOj|h1V7g3U4f4 z$-l9%$8SWm@SXVuvl)FVYOT#!)iHGhRw2DhRw1@hTSqx zhQl&mhQl&YhSSnXhSSnShRae-hRae?hTD=`hTHOwG>_#&Xyr1>l-OY>V+ zO7mMLNDElHOAA=)OAA_xOAA^4mlCpkE+uSvUP{<Z z7b$T|eJKe`Nht|S7AZ-~_mYy9w^%mK!9LE$2z7SawUOSXN4?TBb{=S%yle zSvpIoTN+8ITPjFsSn^9~SpE~&w7e&-X}M2a%W|H$wq>2Twq?Ayj-`XRj-{fwt|ha$ zp5-$!JdpMC>e+ zMC>hnL>w&5MI0=ZMI0^pM4T+Y3OiYz6Lz*-A?#w=BzW@QXvn^W+6|@L?JIrdm%4NIU#S$zk)uNcLaSb_Xzr0&JpyptQGXLj1}~^v=t1n zloJfF{4Wq_`A{Ix@`yl?<#K^w%Wi>S%Y12OE!UU%bWb+mdp7g zEX(*KE#3K}EG77(EMM_OTkhqHv7E>kW0}SmYiZ3FXDP@RZ~1~Z-f};0g5`AHM9V_n zBuj7JBuiD^WJ?C#6w5n2DV95UQZ1+Qq*)g8q+15@q+1&CWLOIEWLiGs&a_<4on@KH zoo%Vboo)GsE5~vjSFU9VSFWWsSDqy^SH9(0&V0+6oCTI?oQ0OgoQ0N5oJE$GIEpP7 zaTHq?bCg)Ra+F$1a+F%$WiPYrU@x~cVXv@!!d789o2}9^l=m#y0JC~LK44Qq|1 zDQk`8dzMU|$UtXOSF6~Gqt=ewYBUl6|`(D#k8y}d9*AnnY7F-e`uOozSA_ee4=S+c}r8@@`9$W<#A0N%e|Uf zmYX#-ELUl&SuW62wVbZ0Y}u=+XxXBvU|FRpXIZEzW0|2TZ5gjAX&I&|Vd<+WX6d3S zYH6)0Y-yw^WT~ksXsM{lZz-Y4XUVV0W67?`ZTU}w%krBBhvi!hcFU(4Y?gO5SS+t- zFk7C{V6r@-!DzWhQ5{#sXw+jqW;KYoBBhG73vQxW~tw|=uy9KQLlc_ zqEP)VbdCQV3lH_%7S`&wEcDcGStzRCv=C9hX~C|3!{V3PbqmNE|7#Xk)UH{aP`hfe zN9~HmdbKMSi`6b$Ojo;X(XDpbqF(K?MX}mti*&Wi7SU>#E&SCkTR5v-vM^V>WTCBg z$wFT3l7)!cB?}IT5zjg zv|v=dXz^X;qQx7Pix!VmE?V4BxoB}t<)Xz=m5Ua;RW4d=RJmxeT;-z0Je7+UQ&cWm zbgNvnXjHjqQK53tB2VR_MXJh0i)fXL7C|Z(Ej(2&S=g&wvM^J*WTC5a$wEctl7+O& zB@027OBNg|mn{A(U$S_oe97XD@+FJY%9kv5DPOW!seH*|hVo^LcIC?!<;s^W(v>e; zgehOPa8tf)VWxc9LQVOKg_!ac3pV8|7T=YwT0B>}YH?lZs>N}os}?(yu34;5x@Iv` z>6%5C(lv`}rRx?sO4lvol&)L&D_ys6RJvhdtaQUdMd^lxn9@xP4yBtGzZ7p;yivSm zaZmA<#RbLN7KapXTWnUmZLv)8j>QbcI~HAvcPwfY?^@(5-nB?lyk`-rc+bK^@t%dX z;(ZH!#rqaYiVrMA6(3k|Dn79Iqwvt;gTh0L#|jTEt}8sUIHmB&VxPiei%klTEtV-f zwwR^x#G+5(iA9sb6N@s1rxsZXPc7mUo>>GdJhO0DcxGXv@Z7>c;kkvX!V3#Yg%=il z3NI{}6<%6=lz(Y)TmGfRQTbOE8{}VE%#wd?(JKGiqCoz&MYQ}I3wQZ97Dn=KE#&0i zT5!w1v-lzR-r|Yedy9*5A1wCCeXv*~_t9de+((Nxxla})a-S`djng14dWEd>Z$}m{&m0`48FT-fLK!(Y3 zq71WTvkbFksSJx{nhc9&gbb^tmkg_=jSQQmo(!9%f(*N*kPL?2wn=ka=1B8c221l;T1oR-DoOKNa!K=9ev;z1ye-9Vd00xoa*dRLmQN(bEH6lkS?-n;w_GkMZaGO(!m>_M z(lSd@(lSg^%F;P`1>OP_~qoP_g8aP_g_Zu4;KnT-9=uxSHi;aW%^ladpd3 zaScl|aScleaZSr#Vw#qB#I!8;i)mXf64SP96VtKG64SNx6VtUc7Spp77t^==BdTxt zP}IQkxTvA!8c{>b$)ZMO$38Kc9?xH4^dZMP5qN1jje?`nJpNW`To)|K9=_dd@Tc%v<+@Wxo?^2S=a^Tt{#@y1#H<%zev$rEq6jVHl!GEbsq0Z)>pKTndSK2NeG zKTnF~L+%vIrQE5O8Qf`>+T3ZD@3_(}H*#fImU3lS+HhrBvT|ivp5x52oXMGOna-JG zY08;n$;_E+d6^^6atTMCWhqC#r8`G~r4&bjSwv@Fu{w@laawT#vBwhYqp zwDiz&x3txAu{73lveeXau$0rXvlP*?vE7WJZuv&j)bf$0vE>a-L(6lT z`j$sEbuD*m>R4{n)UsTmsbM)!Q_XU!rmAJPrm|&|rlMt~rh;X@rkrJ(ri^8*rnF^< zrlh5}ri7)FrkJIrrl_TXrm&^DrjVt)rhuiGCch=GCZ8p%CXeMG4Q|UX8eEodG&n3D zYp`41)?l-|tifV=N`u+*kOq_GE)53DO&b3#R%!gRSfugSVwT2li%A;4EV?v)S~O|= zu&CDfZc(i9%_3Xlt3|TL7mFB;&lVvXpDcVeK3ceHe6X<7cyD2*@yv(Rgn0Q~jC6YxSoVch#R*oL7HraZvq{#TNC47R%HhTFg*? zV9}+1-=bFio<+X;U5g~}8h_Y1{p{S!k(U zvXE1|WFe$>(Slv=qQ!63ix%%yFIqfNy=ZYm^`gaD)r%GfRWDj>Q@v;bs{7}wUbL8^ zdcmSo^@2s6>II8p)e9CGsuwKcR4-Trt6s41RJ~wfr+UG{MD>D&rs@R?dDRORqN*1x zxKuA#FsNRz_@;8f;*H7$i$^LKEN-Y=usEl3!QzO@1&duO7c4faT(DTKa=~J*$_0xl zDi{_77QvEEZ!?$u(+#y!QzbaMT_0a7cEvPU$mI1e9@vq`JzR+@u%lrLJCDPOWsQ@&&&u6)UYUHOv5ccse~FO)7@+)%n~aZ>5B#ZINm7ORx5 zSjAJ;l#p@Pt z6|Y;|SG-|yQSpYw5yhJp+Z1nFtWdmZF-!55MUUbwi+aUd7KMtpEm9P3TZAdzw(wNE zV_~a!$HGAIu7!%?T?=u=yB6Gv_bmP?+_U(kaL?kI!hMUI3imC}D%`g?sPMpItHJ|| zl?o3m<|;h2n5gj3qE+FMMWwK6HLiVf0HrcNhOJ%=VOp*O&(JcGjqDc0; zMUw0fi$K{Q7LKw%EevFTS}4f=vJjO0Wx*)>+v20lZ;MAVe=IJ`{IxhD^Vedl%s-1| zGXE@Q$o#kHl=*K_EyG}$E5l$JFT-dVD8ppwEW>1JD#L84F2igoDZ^sPEyH5@N1E00 zp){-IacMToHPY;slcm`$E2TLs6QnsT-K9A#^`tp1MWwkc|4MOLK9l0MJSW9txm}9K za)A`DWv3LcWw8{WWsDS`rK=RbrM?uurKFUAC9{;E*0we*t|v$T>Fw^Wl9w-lC?u>3C}VfjWv((=Da$Pq(w2)P zq%9{%$XM1%$XMn`$XZ5A$Xa?y$XQxQ$XlvQ$Xkj@C|I&eC|JG}SFk)Tu4uVjT*ty{QPjXvQ`FE>K-AFkhlr8o0}*4( zlOo2Jn?y`3=ZKhCwu+cq=8KqFMv9nOI*XWF>WNrbN{U!mvWi$*J`%RF+%0TnIYrpo zGEdmr(o@*RQdQX2l2O>!@~)7bFDUY2bFUY1z`-j@CX z-j=2UK9f7Oqsw^PH)c zGda^N(>T*DO*zvoSvWH+FLPvCF6GFyEaS+s^yJ94l;Oy>e8`?-*~gx1X~Ujt`Gzge zau!>@r5{_qB^O(PgOAaj?%YT|ymR~e2EMIAwTRzYW@!Aen4t07qEq9S zMWe<~i%N|j7KIw$EwVJeStMzEwTROAY!R&S$--OXqlJsc2MZgG_ZFra?=18*-dd<> zys?nicx@q}@ybF_&qUwMbCEYZ0V=2Yimd1$d1==p2908vmOX%<4BRzNsPB_+L=F z3SHxW#bUMEWsCW0mn|l%UAAafyJS(VcF7`N?UF^Z+9iu{wM!P>YL_e=)Gk_>s9m(s zP`hX$t9H>sQ0<}xtJ+12U#b@^-l<-+c&vKC;=1Yui!-VhEDoq%u-K}4!D5x_1&jHr z7c3^LUa;s;yUoP8)$&s)q=K5x;feBPo$ z`MgEC@_CDJSH57uu6)7bhtdU$7fKf`ZYo{0IH`2eVwciI zi`7b(EaoU(vglE|WKpYh$s$kbl104IWs5+i%N9;bmn}?`E?cN7U9k{Xx?;hpbj9M2 z;#G@xidQWjC|tXjiyzQKN9*qCnw+MXJIBi%5kB7QPA(Eu0h{T9_+5w9r;~ zWTBw&$U;=%kp-8+V~cV9bjg0U zsFeL;ktzGdB0~17g@^1{3v=0T7V5I!EW~BMTd>Q1xA-CR!{UX^4~v^JKP^tl{Iu9D z^UGqb%x{Z%GQTY*$o#Qrl=)*(Ec4eQRpzfnxXeEbPnmxf)-wMs^kn{9D9A8a3dt~7 zvdS=8zL#dQyduqHxl5Yaa)C6nWt%jMWv(=fWw11>rIj?RrIIw8C6_dt1uW|&1uU~A1uY{ag)Chpg)9vvg)QYIg)O-yMJ#_vh*& zLd2`NiO3293~3293P2^q`#;xd-| z#APk#ipyHoipyEXiOX9$h|60li7QyLiYr(?7gMx6C8lJ#R!qrqqL{K}iI|FIq?n4O zt(dB%l9-w$yO^5g8&P%3OQIT_QW!W!eZJ8@%ZRss!W2q%%Yso2O zYxz>p&hnI?o#kpld&?d{2g^J`2g?9KM@u6?Crc4QC(G{w&XzX?TrBqrxL7U_aJ6g} zaI?%1aI^FkaJMuPaJQ5Y@UZ;H?`e6K-_vpqzn5h;zqh3ozqchfzmMfzK3~iAe7=?~ ze14V@eEybtd;ykhd;yksc>^uC@djD;@djCD@CI8t@`hN-@P=4^=LxmE!V_k>ktfWu zk0;zRhbO|)n@gD znx>YgG>t6}Xc}5>*VMOMtEp?bL{rCdmZp~FL`@CL4ox-7I!#r}QcY#c98E>bBuxd& zNKHA*08JT7cTH(aJ55PTQ%wm=9ZfMy6-`k~X-#2EAx$AmE=>VTMooUppBlWDA2fI@ zUubY!KG5K_ysp7vd0vCv^0)@8<$eto%k3J>mg_YbEthLBSkBk@Z!ultuSLJcAB%R4 z-xl>6zbq;=ep(c0{IJN-_-2u)@zo+yevMZa92zez7&Ts4d{uvL@l5@h#SQhR7N^voSnO4QY_VSbk;Ovw zhZa-RA6T@h-?yk#zi*MPe$OIK{jNoz`W*|mo4V1UACC0cFCeu?UF^M+9iuzwM!O>Y8Nd+)h=3isa>?NQ@dzkq;}Cl zUG1WUwAuv=ezgl0ENT}leyCosc&mEB;*shFi)*SEEKY;#{__@FRL@(iR6TDoPxZXT zWYzN)?W*T3YE;i#6sn%LNK-v$5v_X8B2e|5g`4U*3mesQ7KWqyIg76<=PX{UoU?eSa?awq%2|uEDrYSYtDLpirE=C{gUVTpWh!Sa=Bk{v zn5=TvqD$qhMT5#&i*l8-7I`XXEmBp^TEwWFwFpuz=q%4aRkE1$L4t9;gCjq+KG*~(`vx|GjaR4Sjf z$WT6O5utq6!d>~Cg}L%M3w7ml7UIh1EI5?US^Q8sZ}C#;yv0qW^A@L+&RgtOI&ZN? z>4L>vr3)5)N*65Zl`dEmC|$5fRJvdhq;%23S?QvMsnSIYHKmId5=xgWxRfqg{87AQ z@lNrw#Y4r*7MB$-TO3ooVzE>4ip6ThD;Dz;-bPWi=zs+EOsf} zwpgcd+hUQzZHs9NcPzRT?pV|*+_5NDxNDKFaMvP6;jTr1!aWODg?koO3imAZ6z*Fn zE8Mq`P`GcwtMI^rN#TLTd-(?zx8xsM9Fc!$u}=P>#Z37}7OnD+EDGcwTSUu0ws4n! zVqqlz#6nK~i3OMZQ;TnMPc0tHJ+nA3_uOKS+;fYSaxW~V$-S^>k$Y)TB=^!HLGG1> zpWG`88@bmOT5_)~B;?*$u*}Lx(+0PbyvR^Fz%Y3nTFZ0#nzRXvP3o_p<4#|A8 z*evtiVu{Rmi>Wd{EZSv$SX9dVw8)nEX%Q>)%fesgmxZIuZwnKd-xg{ze=HW*EX`n9CCy-&AkAp$F3o7EC(UFjCe38|SBly4nH00- zIVl#)?NTh33#3>rJEd4Hi=@~rW2D$D-K5wp4W!sDrKC74S*18E-%D~@-jd|9JSxd$ zxj~ZKa*iaoWrrk>WvL{OWuhdnrJp39rL`oVrG_NGrKlvoC9|Y}2L^Ui~ zMKvwoifCG16VbBVFQRR^LPXngqKJ-VwTO;onuxAtfQX)@wTPajnuxxopoqTZFJS}A zi^7JMtAq_LTZD})dz=^|uqsVrn+ z$t+}P`B>1>@`#|7-XIYkO zPq)n0o?@AxJ<&2myVue~yUWs6yWP@IyVX)nyU9{YyWWytyT+15yVCN9R+;5ntrE*e zT7{O^wel>_XysTQ)XKEnrj>5FS}VnJfmV{`RIPZ+Zmn3$2CZnzQmqKfY^^ZM1g#Lu zFs(pKZ!LdIM=f7Vb1iR69W75wB`tSL2`v{(J}oCp7A*(MUz&E7A2e+&pJ`fI-qEzM zyrgMvc|z0Fa-XKL7vUZ~0z> z*YcSLkL5iLF3W2goR()bI4qB9uvzZaV71(;!D6{qgUNEK2BYO%4F=1p8viVMHU3(( zYW%UN)A(&srt!-nU*m^Gy2f{lc#Urs5gK1D0yMr@cxrsMaMbu@VWsiW!dT;jg|^0f z3l)vG7P1;|EJQV4TkvVTvS8PEX~CfJ!s3(qbBibH&n&K~Keafa{={OJ`eTc=>W?hu zt3R@sr2f#NMg4(Ax%z#JO!a#fG3s|M{MGMRII7>aFj2p4p{{<*LQ4In1+V%|3kLNY z7N6BXYy7WUfY$h*L0RK}*#OQoCUBUG==h8`bj`4^+=vTva`9aZ2^P#eUWE7MoSi zTdYt$XE9gxoW&&7a~AEY=PYVe&sh|zo`cr?XDtF$&sw;up0%)6J!@g0de%Zs^{j=A z>RAgR)w32Hs%I_!shqX=qH@;amC6~52P$VQuBn`{IHPjL;;_mYi=8TGEHZ z#$t}j8H>p(XDm8Z&R8_4oUtfZIb)Hha>gP><%~tN${C9wl`|HeDrYPlRL)qKtDLdW zQ#oUys&d9cM&*o!h{_oYZk00@Oe$wAJ}aNGc%*#B;)3!Si~Y){E!HWYwwR-Q#-dyK zj76358H+6CGZvA`XDmFG&sbO}pRv$TK4T%Fe8z%9`HaO+rLz_x` zaNT0J!VQZJ3O6j4DBQ4^p>WfpSK+2bqrxqVQiWRSSTFa)VvgKXi!QmR7Ugo! zEK=p3Sp>^Hw{VnuZebwz!a`2&g$1wNON-yKFD+ilzOuL}`^w^k>}!kdvacrjT#W$Ic7SCipSzMR- zWN|{~v&BxC&lam>zF5qW`C`#4^VOnW=Bq`a%r}cwa7%W#yFWGV5@`_7Xeh`zeyeuYZxm`@ka<-V1 zWxbfRWr~=zrH7b|rLLH)rI47cXyAC8kXfE8kUJ7nwCBynwDlFT9!&8 zT9&*b+LoV%bu3Q_>sT%p*0rn=*0l^1*0VGe*0bah*0+2iWMFwj$iQ-ukfCLxkdbA) zkddXGkg=t#kg??-K@-b6f~J;x1x+pI3z}Ir2%1?Y3z}QH30hcc3R+n52wGac7qGIt zEMR51UBKFMwt$Ugy?~8nvVg6nhk&i6u7I7TuzEnB@%4aLW|Va7!c32unuJNXttck(Nt1qAbffqAk5R zqAle)Vk}><$68KekF~UCkF$Kw7H_$TE#5MWEy0qDEx~d>YocWxYm%i6Ym((pmSoE< zEXkI|EGd@8EUA`1m{TqHF{fF!F{fJwFlSiGFlSgkXIf{uL3@?u67A)dGqe|5_GmA# zY|x%-S)x75GDCZsWvupO%Ruc3maf{pmR8zbmU`Olmde^KmJ-^HmOR?^mWD$wvAm*HXn9gA&vKtuj^$>pOv{y8>6Y`fQYj$tNK@KUQ&ZAXK~us~TvN=FUsJ@AO;gzNpN632 zR}BHnw;KGGPc?Wg?`ZH?UeVyPJfp#Bc|?QVa<>MXo5m}Pf9fwSKB&L2c%=T^;)?n+i(~3fEq16s zu~?=4*kZ2wBa43ZhZarh4=hU6?^~p+-?NBPziZ*Ee#gRI{f>o^`fUqU^;^*WeK#%s zsok*nsCM1riQ0AW8voPaHU3wiYy2-;%v8H%(W`dJqEYRlMXB0Fi%hkP7O`pf`x?Ic?%x3^A?P1=Pkafp0{|Vdfwu`>UoPRs^=_Ds-Cmh zt9s62lj=E(<*Mf_=BS>tn5cTzqD}RzMYZZ#ivrcN7OARdEuvJxsGPQ#ta93-Q{}WpgUV@(a+OmSxhkhDQdCY^M5~;#2vRv^;i+=U z!a?Pfg}KTp3q6%n7HTS|EM!$qS%|2dvfx%ZWx=F!%HoUiDT~L-rz|cipRzche9B_I z@+pgX%BL)Pl}}mJD4(*(Rz77BrF_c5OZk+ArSd5YP32P-lFFwnIF(OZ{8Tz^@k;5m z#Vw`N7N?a?TkKIfZLwDAw8cE7GZy_yXDk|&&R7&Gov}z(I%5%{bjHF>>8yph(pd{l zrLz{&N@p#2l+IcFQ#@z!LGhf$BgJzTR~64&99KMVu}ks1#ahJ+77G+FSWH&DV9};{ z(V|lEqD7A4MT>aFixxqOmn>WrFIiY9Ub4_uylf$_c-cZo@v;T0;$@4U3Rf)NC|t34 zpm4?Fioz9(6AD)?_9|Sp*r;&TVyVJ4i&+ZSEcz9$Su`tLx2RCKZjqyK-6B!phDDgd z4GS-Y8y5BoH!VyQZdzz6+_aEWxM?A*aLa;2;g-d3`CAsx7N!J z(!VSWq<>k6OaHd`C-vLnnbaSP^HP5-woCoBSRnP+qEqUhMUm7$ix{bY7H(4iEexdo zTS!SUSh7knSbmUXw7f0JXn9PM$#RnKh ziHTUA6ce>vD<*0=QB2ITOibJ|T1?#1K}^C@RZP;7OH9)8gQ%3{HBo8HJ)+WU}2dkU}5PdU}>o>U}-5RU}gE9-`a8? zzqMsAzl~)qzpbSnzpW($zn$e}K6}e$eD;==d=8erd=8e%e2$hsc%3XS@H$zp;B~fa z;z1Xr=dx2%4_8iMp?U|NQ+S4rkv?p6SX-}{;*Y35{(eAQT&~CRB)o!um z)NZu=r&VY9S*ynKg;u5IU9B?9OIpR2$F&MA_h{u=Zq&-LT&9(2Ia@2ua-vp>Wt&!# zWwlnkWuaEAWtvu$WsFvYWuR7=rMp&$rHxjgrID7urG}QTrJR;EN^JqSf10gvOJ<`VYy4w%yOfqspWD_W6OD(hL%$_^)0(KbuF7T zwJj?(wJh^BH7wIK)huH*RV+g^l`XwB6)l}KdO&b3!sx|&v6l?sp$kzB}k)rX_B1YqfMX1Ji3qOr-7H%3} zEbKKtTbOHnvM|v2XrZa`!9r2vy@iyxzwf%mHMMINC)FTp{5Pmwu~?#Z*6AsI(kY7~rBfEkN~bJB zl}=f>E1j~iP&#d)rF7atM(MN#pVDay2Bk9=pA^qnJW)JjaZT~8#RwwSGO* zS1j@ru3983T(yW$xN706aMi+5;hKe+!ZizRg=-cH3fC>f6s}uvD_pl=P`GaKTKAtdYNIF+={QMYH@Zi+uT87E$uIEZpR8TNugTwvdy*W5FeV$Kt!(U5m$Z zcP%c+-Lu#uch6#_+`Mz~*;f{yWnNi4k$G)#RpzzDF_||O+hyKZtdMzYF-zvHMYqg5i&~j? z7Wp#oED~kjTLjCzw{VsDU|}Ki!9q*sqlK)@M+*U&PZrEFpDf-=f3~Ki>XpSE$XCx zS)@z-vIvy=ZDB3-+d@_9kA;BLAB$g-e=VL${}idTLy{=TbhfBSjvcrS~7`= zTD}k!vpgp%X1P^V+;X<4gk`g+gk_efq-Bt(l%jjJ~rwABXRtXqe#tWEO zx(Jw9Y6+NH@(Y++zUDWx+`(^d*}-pa8NqL1smX6?`G?Qa@;slFeGIo|ZXWUY6!u-j+;U-j-)M zeJp2i`dB7&`daF9`dR+t@UuL};cvNsBfzqRBf!#=BhXTgBgpa@dywT6_FzjV_F&8R zY$2A5*g`GC*g`G&*upH2vW8jKu!dV&u|`<_Vu`Ta$r5QlTe54nSpLy!wEUn|XZcjC+VYlGrR908GRq@c#g;p@3N6=ZpiM6>Ax(6=mtK6=CVB6=rFr6>Mps6=pY zU zs+uyEvYJwsBASwx+?wK+%$j1BzcfTFKWPYCzSI!3e5fH{c~gVW@}dT>Zvgqh*H%gJq+}e~U_ue-?!re=M>zep@7I{IZDF z_-PTM@x#JLF{jPbERJ)o)pFsNY1p!w0gzZ@1bNi*;&OEEcI zqHAGf%yeB9!Y@^Ooe%Ev7hC?B`zS3Yi0uYBAhPx-h-oboXXU*%&KHp<5> zbd--<$S5DT;8s3v@ki;n#T%vL7I&16TbxxoZn014xWzi9;}-LkPFPG(I$_bMbi$%o z>4Zg!(g}+&r4ttJN+&EVl}=h{E1k5ERXSIG}LBVvE8BixmnNEaoa)w3w)H z(V|V^qD8gBMT-K3OBSgLmn@MS}cw3m^F#78de1EL7xgS_sJB zwD>D`%i^WnEsJY%w=E9K-L}{uciUpF+#QQ9xjPo+a(69K`ndcU-WS(2xmU&@uM&^aZUYVB`>t$YAERcC= zF;V7~MYGH+i&B}_7HKlCEh1&!Sa{34v9OhSYhfVs)z~HN&c}&lKgAoFZtKPTJoQThU7mBQOW-n%#!~tK1wiH-j`soJS)LqxkrN0 za+L(5&S@Mf>TYeJbvAinAW4T?7*K(E^uVtMWpJkF5pQVQw zzoo92fTggQfaNbyLCXiCLYBuxg)G;J3R_MQ6|t-l6|qbf6}9vh6}2=L6|O zTg$~fww8@Nc9!ux_Lg=$_Lg!y4wiqp9W3{8J6bkyJ6XDNJ6UpbJ6m4ja>P7h0cPEX4}9G;eEIlL_Ab9h@8ad=z0bNE=wa`;$2 zWB0Y3!tQ73!tQ7Jna$sF5u3kdI9q@vA6ua1an?Y~de$IIOV(h^-z>qFdssp&Ygj@p z?N~xB8Ck+Ck1>Z?_A-ZChA~H2DlkV_zGqrv*`&SFvP^raWw!Pr%XsbimLb}6EIqVm zSlVh&wKUY8WT~dzZz-kSW67`GY00A9X8BXA+47xMqvd0*I?Eec)s|o2R;Fd6R+?qGR*GegR-$E+R=j1nR*a>uR+OcaR)nR6R+y!p zRT1ecs%XkuN^8nk3TaANa%oChGHQxj{?rh){GcIX`9ed;^1g7Ryi|W_aa;X`#aZ>|7W>toS!`5)YOzH9iN!Sa#}=LHk1VRyA6n$8 zKd?wtzi$z&e$T>9{jPbEU~)o)p_so#X(;qw4~hY#xhzA0*#EIQOK zTGXgrv?x%!V3DGB!6HKKf`yOTc?$=%^A@IR=PfkV&RfW-owE>9J7>YJcFy9D>N$%K zs%I^ps-CsDrFz!lyy{ttBdTXCcB-DSSf_f%VzKHOiy5k?E&5bXTQsYlwy01&ZIP>b z+9Fx?ltqNC-I$_a}DDkm(qshqG_t8(08iOO+{St`dZCaN5_=ukOsQLl2`qEzL$ zMUKibi)58!7Evn4ECN-IS$L=%v#?h=W?`;!%tBA)n1!m!F$-ChV-_MR$1J#2j#@CQ z9JTnWeAMEJ@==S+%112@D<8Gkq^s%RXS!7rgY50L+O}>mC|tw9i`(Ia!SW71eA_jFex3k_@a2i;+f(Ji<^okEKVz) zu-L13(qe<+NsGmbCoQHbp0wytJZVv_c*-JA@svf9;wg(z#ZwlZil;4X6i-_iD4w=Z zQ9NxSu6V|RTk(v=e}yv^pB2tnJX1JhaZBN>#W{tu7KaqhT5MA|Yq3hN)xu8xs)d&PH48EM zYZlD%*Dc=5UAMR+cirNo+zpFuayKj%%iXk?D0kDMPVSaPw%jd?NV!`U?sB&+OyzD{ zD9hck5R|)P!60|X;=Sx$i+i$nEzZi`v)C(p&ti@2eTzA=_bqy4?_1Q!KCsA^eP9tS z`_RHi_MwH1>_ZD3*+&+#vX3nIWFK4nmw9aQLFS3YLzyQQmt>w=9F}=%u~p`&#WI;^ z7Bgg?S#-)gx2TqRZjmeV+#+7)g+-vu3kzqNmlmcnFD*1=URg-Xyt3evd2PWc^V;I2 z^c#x{(r+xbNx!j}C;ir zE!IkXw3sIK$)aBBlSQV~CyOAd&lWaPpDom+zE}uIeX;m0`PJg7-jl#V?897B3|JSX`6%V{t^{ zkHuz*zZQ!m{#s0w_-D}|@y{Y(;=e__#D5Dv2?k3$2?k4D2}Vm<2}VmE2`0;*;!Kt| z#hER4iL+SF7H6@n5ofiG7iYC}6lb$k7H6|$6=%16A;xZbT8zVTofxO(Br#6QQZX*e zNHH!;J27rc6)_%5E-@a=os=EEN^7j1?8MbP*M_)D;!7 z6cZJ){4XMG`9eh4@}h`{(u zmVbmLEw2bmS*{h9wrm%cwoDL~v9uPJu@n=QwfrO`Yk5vc&T^HIoMnfQyk(k@yrrv< zf~AU(f+e$%qU9q&CCkHtN|s9nl`T62l`XRbRV;l3RW0=eRV{@C)hxdWs9D|?P`5lF zpkcX8K*O>}K-02FK+7^hK+DozK-*GPK*y3tK*#bKzpmwGeqGBZem%=TemzS?etpZ& zdhpV!2)g4fhCkk`~whu6%KgV)^h z36HtuAs!3M1w0m(bv%}qu{>6mHau3AGCbCnKe??fcXQiV)^gigI&#}uvT@s4p5wB! zoW^BunZV^>sl(-9`IFPp@;IlX0xX$X0xeH62U<>K4zi474zg5a4z~QrwA!**dxd3&_EO6j?M0RW+Vd=3 zwP#yeY0t3K)1GRntUbw6Lc8CRN4v+8QM=Rfn^v3UYprI>2U-o5SG8&_Pia+K?$@fY z+@e)#xl*gxa=uo9DlfvAm?|WO+iRV=M>RKjhYFkEVYFhehs$05gs#)4< zs#uz6Dp_i4Dq1RO%3Dfm%32C)%2;w}N?HEbkg)u&A#V9jL)7w_hKS`o4I#^`8iJN* zHTW%$YVcX^)!?z*s=;l!R)f=WsRoDTTn#qMsT!=7y&5c*tr|?0wHl0;Wg7o2@-+Tg zq-*@Oh}ZaI5ux$RB0%G(g{Q_33nz{57SV(Lzk)g9X3F zdkYSYw-$^VZ!Es5zqWX;{>tK}`b&$`>Mtzzsz0|_ul~$pq54ycDe6xw+SDIgRH{F+ z$Web_5wCvVB2fLFg^T)K3v=~57Fz0eEM(PhTL`M(vS3laY4Kg{hQ({O8y5G}u3Lca z@Hwgmy2Iy+#TvCM7W2XT`z~3ut6j9HQoCr8r*^?2N$r9~nA&*@FSYX)_G;%XjMdIr zsH>f`kWo8lA)t27f>rIT#V^&f7VlNhT0B-gYjH#MjKx{iGZu$b&sc0%J!7#}^|Zwz z)zcQ!RZm;=sGhcHQaxo+u6oKMNA;9NlIkgoaMhC*KB^}zoK#O*n5&+&&{YN1{UTWnQ1X0b-)n8jk1 zV-~Yij#*4lIcCwWa?GMm<(NgO%2A6Pm7^BPDn~7%RE}B%svNcOP&sO0uX5DFOy!7$ zp2`smRh1(aGAc(bL{yGgaH|}#U{*O|@m2YV#S`Tt7FU#ySR7V9Y_UoCu*D+f!xj^j z4_h=UAGRn^K5UVoeApsD`LKn(@?i^o<-->8%7-oZl@D9|S2}F*Ug@yKeWfE7=ar6F z98fx9u|esG#X_Yc7L$~YSTrjgu_#eGVv(kF#3Eejh=r%p5esXjBNjSJM=j)(j#>yR z9kpOqI%@G%@u-SNec$WlNMhTPFcKAIAw81;grP% zg;N$s6i!*}P&jR|M&Y!@0)^8SQx#5IbSj*&s8cv&QLJ#rB3CdS{Nyuvrtz!XCb3-&O%7xoCUkWd5d52=PjPfpSQRmf5Bpp`~`~@@)s;7%U`sp zm%nI{Eq~D>T>g@Uv-~9sefi54GV+%#IOVTce3iRm@ks89#d*1_7JKBbTC9}2W-(3f znnjD;HH#v->lX2H*DZYIZdh2$-LTM~CMaG9qTo-$7@ ztYw~A=*c{@P>^|MAuRLUf=%YR#b@ak7Pq8dSR9moX|Y23rA5E=ON(;pR~GTouPof9 zUt8!)zqSyUeq+HP{l?;j)EkS7Qg1DGNxijLB=ydsTk4%fsnk1*IH~s*9#ZcujHEtT z$Vh##V3Yc2@lo=l#U05{7RMz&S!|O0Y%x#rvqhKWXNxk)FBVCXUo8A3zgpNxeznk) z{AM98`OShw^1H<+iSHKoC4N|(mH1(?N8*RYYKfl~vm}06bV~fPsF3(&kuLGuB3$CP zg}cNb3v-D-7HSfIEyN`LTChp{vv@21&*H53e~WeE43-nb87vFM87+gw87)o4nJgv5 znJj;cFXsfe(pqKJqkuZXDSXJJvxGs0q)%Y?-&>xIQFqlCpRO@t*Z z`GqAcUkgcE9v70dTp}c8*(fAsnII%>X)h#gDJLXj`A<;R@}8iq}mb`+BmLCO_EUyYES?(54wp<{fV%aXBVwo$TY8fJ+W@#;;W~n5g zZpkH}Zuy8`!*V0Prey=arlmi>mZbu}mgPr2ZObEkI+oMRBG;)wi6>t8ZD#YhdZmYiOy-YiP;BYh?M5$H;OYkFn((9%IXD9uv!G9#cyz9#cz6 z9y80Y+-8>Bxy>!Bxh*X1xGgN1xh*YEaameU;=d!l^!f9i9h||V$BB!lo zBB!0D0jHhie-3-ga~uwqb2%I=3pgAtT{s*qB{`fdAG14KPG)zubY^$4{L1EHxq{8r zGK$U3Qh?3P@&v29Wecmjr30&nG zS;lH5TLx<-T6$>3S=wpESej@>S!!v8TPkRUT8e4~TXJg!S~6<+TYlH{v3#rPW%)$Y z!}6AEX=OQ0)55Y>)6B9()5Nk$)5x+=)4(!A zQ_nJ9Q`a&~Q`^#4Q`6E#Q{B>9Q_a#yQ^itKQ^`_6Q^8U~Q{IwaQ`VAAQ`+*MhLq)3 z4GGJ)8se5uG(;`$Xoy%|(Gapcqak2gBk*e{}B2MG4MVQ8K3xADY79JWuEgUp{SXgR&voO;5 zYN4(1#X?2nvxSVtCks)H4;FkH?=9Fh-dQkcytVkG{>I{o`fH18>Mt!$sK2n-t^V9% zt@<;I`RY$CCaFKMXiv5;23ZNaa8 z%YsS$ro~sa8x}9sZdlw=yKZqo?V815wW}7})vj2qQoCX?PwleBB=G*eix!n?7cFwt zE?6Y0owo>8J8$8scHY8P?VN?7+Bpj~wR09yYUeEY)y`TltDUv@p?cQht?C(zN2+Hm zuB)E0IHP*T;-Knji*2f>Emo_ZwpgHg%3_-8DT{8^Qx*-Xr!2};Pg-QFp0r3%J!ugJ zuKQ0|II5noFjqZcp`&`jLP-@=_aC?5Q$23Mta{wyr^<1Q_bSIMo~j(PxUF)`;-bni zixVoxEcU4!wb-I^)MB;DQHwo*5UgfZbnaW`cU6sQYsw#&qWK<4Y2&){n;8rbB88I{(-lrybSs>+s8={? zQKE3tB2(d%MV!JZi(rLQ79I+xENm4{TNo>xw$M;GZ6T*{+CoI(j0LB{8H<1NXDnXH zpRu?qf7arl{8@`N@@Fk($e*)lkw0fqAb;K>M*h5ohx~a96Zs1kit-mM_~b8I{Fb|D z@j~vR#Z|dW7Kh|6S*(}4Y%xdfvPGBNWs7pTD;BA8S1f|%u2?wAUA54cyJ{gPcg=!F z?wZAK*=rWBWUpJ?kiBkkT=u%fcG(*i%Vcj@Oq0E7(I$J-qD=OtMY`-Qi*VUn7VfgQ zEi7bjTWHAMwvd#)W5FeR$KtolU5hs|cP;M9+_g9-bI;;{%sq>ZGWRSN%iOn^Ds$hW zUFLyBrOX41Y?+4^u`&-W{AC_mILbV-Fp+s=p(gX#LQ>|j1&_>Qi+|EjES^X|u{bUL z)MAtLQ;V6>&nz0HpIKx|KeGswer{nY{oF!P`h^9T^b3p6QZFp-NWHW;D)rK0ozyFf z=~AyO8l+xXWJ$fY2$p(nVJr2Og^<)+i$9WYEuKrhwYVht&SJ0RJByW)?=7ZC zzPD(Q{9utQ`N1Mm@}q^DkY?k<9 zu}I>p#YBm(7L5|$ED9vPStLk&xA2$vZecI+!$M!;hlRYvPYVHwpB4-fzbqb#|F$?J z{@Y@)_#cZF@jn)6;(skX#Q$1oi~qCW6aQ!NQS86PRk8mTJH;3*=ZG;{Hi$7=riw9H zdWtbw>WML13X3sY{t#ucyf4aXc}$ema;+$v`Je3&>kG3Mg1+2q;(v2q;>b3n*F23n*E#3n*LO<5#v^%dcWt$FFMX$FFKB$FFAj zfltly5TCl`R6cdfEItiOdp=D|Q9ez}x4c@GM|ia?=kRJ}vvVuq7GJ?mz(t^jpQi8|O@&mV_pxEJ4+{ad&@6u_LeKz94uqm94rOc94$|>I$5@`I$1igI$Qo{ak1Rb z;$qp%;%e#6;%3Ro;%0e{+1+v~v%6&+vxlVyvxns;rd5_<+RH7yw3k@gYcH@g(VlCm zp*_n|R(raokoFWycI}Clf3*56KWcSbKGW*3ysg!0c|ohm@~BpWrio>~rjccurh#Rwrk-VprjDhzrnaS%rlzH(rn;q}rmCfe zri!J!rjn(Yrh+A}ro1JqrmW>34Qb0S8d8?8H6$z_YlvCi))2M4q#i|*`&c@S*^irS**cinXSQKnWFLEB1Yq{ zMX1If3tx@j7H%59EbKLYSXgL$w=mH7W}&I^)j~<*i-oktCkqjcj~2WdA1v53-dp@r ze`oPQ{f)&V_16|x)L&T~Q-5i(L;Z!tYW3$9bJd?&^s7IyXi|S{QL6sPB3=EVMU?sj z3t#p777pt7ER5CfTBxbtv5-{1ZNaO4%Ys4urp0Hqn-yKZq#?V80wwW}6e z!T0xFv6!QF*XE?C5?owo>9J8$8xcHY8T?VN>y+BpjqwR0Ad zYG*BY)y`Tlshzd>rh3NWwdxs*2dZZ*uBx84IHh{pV!!HXi!G|BELN(XvY4-W%3_M@ zDT_|klNR-=CoM`;Pg-QDp0J2lJz){5dcwj>^@N3k>TwG*)#DaAs>dx9RgYVUs~)%D zRXt|Gta{Air^+#C-G9{Lw#re9iz-Jgj;kEC*sF5HVvEWVi&ZK|EEcL9v6!K9#G+s2 zh((*qVT)Ro!xkkfhb^*I4qGIt9JYv5Ib;!_a>&A6<&cG)${`Cgl|vS~Du*moR1R9m zs2sEqRykJ zB}xY@rYaq z_$VH>uva`{VXSz>LQV0Ag_PnE3qHjo7EFpqEWRlmwRoj))Z)IvQH#q8M=g#k9JSc3 zaLi(Z!ZC{_3dbyFDjc)uRXAqRsBqk(OyRgiw!(3Xc!lE@AqvMWycAAY*ejf{Fi|*R zp`~!bLSEs7g{ZN`Lh;k@@FlC<_)}u}JQMMZeqyi(0vh z7TIzaEh6PETDZ$yvM`goWT7H=$wEl(vIV2uWsCQ+mo4teUa>eUd&Od}>=lbOvR5r; z%U-qUmc3?CEql!(NA{XUjO=v_U)k#xwz4-Y^ki>X$jjca;FrB=!619n;-kz>i^npz zEUw7hvN$Sp+hV)SZHpB$w=HJL+_C79xnof$bH}1U=B`Du%w3C6nR^!QGWRU3WbRw& z$lSM(m$`2tDD%LAMdpFUd+7%jSEV0X?2&$Gu~_<%MYr@Liz4Yq7SYm=Eu5tvTWCu^ zu@I4dV)0k%iN!Oirxxd>o?7gbdSX}84)H91Rspl5)QqL_srCwMVOTDm=m3m>p zA@$PYv*b&QyOOUgPD;MA*dqDbVu9pqi*Cu+7Uhy}ERrSPSOiGEwXl_ZYoR6i&O%)B zodt{JJBv>e?=2okytg26#HkPCidTgTkOBZM^OgLYoZL6dqo*7 zmxwZ1_J}fBmWnc4#)&dpx{0z_8i=x3N{X^tGKsQUz7b)wyeh(OxnG3ca-|4|HfOBN9x%SXaImV1PGEvE_dS{4ZNS$YZcS*i*1 zTQUmsTiz2Au-qjiU^!h#(6UrW&@xy^$kI?q$WlN^*z%*Gu;nE|5zEbjqLxzyMJ>w& z#VjKP#VoA_#VzFp#VwfyB`lu{NLro|khI(=AZ0mCK+3XKK-w}{K*rKrK*rKoK-N-P zK+cj`K+f_yzr5uNetF9(eg#W!enm?eenrc7d`gxF_>?Rs^C??q@F`o`@~Kz~^QlgSoX48S~{>>T7G7;vRuw) zZ5hjEZ7IxVV|kL*#R@@r4CWYL~%`BQ6x1BCF z)5G$xrkmwXO&81cnvRysH0>?tXxds%*0i?l)U>p0(6q2D*EF-t(=@S6)ikn<)-9{ zLk$Vbn;K%47d1pJPihET9?%f9+@T?0xj}=^a)k!38MEIT#WEgLmh zEh{xxEDJT5EweNjEt51DETc94Sp;kRweZpSW8tdt+rn1kr-hlu4-0*b?-m*w-z*e0 zzF0_Ue6|qQ_+-JO@zH`+-HU)Zbb>P=8}_N&U6O5%pIV+tgoJtWep0b#$deUN&>Pd?Z)sq&rswXUpRZm!CsGhKhQ$1l3qI%rIQ}wuoz3OobQ`KV@ z+N#Ga6jhH|h^Zd4;88tl!K8ZB;)lvni+3tVEuN?xvACsj#NwjL5sTw0N5FOeW|hMh zt5gnKEL1scFW27F*;` zSS*k~VbLRh!lF|Cq(!RyNsB=FlNNUJr!2JPPg#h|pSEC;KW*_*?zF{yxic1L^ zlsjXwT<)yJRJpSj&2r}~3gymO#L1nr@R2)jVJ&ywLR0R%g@oJ%3wF5+7T;tqSUi!v zXmMHgqQxQEix!(?FIg;}88W*~=D*vX?D_WUp8_$zHKAmc3%3B74WPKD)DsI$sV5e~Qco@ZNj|lBDf!IeisUnk{gTfuR!Kg$m?rt$qDk_FMV{mf zi)hIg7VeTSElea|S}01svfz_^W${PimBlNG*A_P5&LcNO7xG#dC@->+eH6b%n|)-(IWcKB1iPUMX2b13p-H;OLb8OOF>aa%iki5 zmQO{PEYFKDS?&~Jwp=X2Y}qHmVp%D|VwobsY8fEHYH1_FW~m{U z@manSkJP}uUXfUxBw0TIjN0-}~{1w<_; z35Z!%2#8t63y52~2}oG#2}oFq2}oN0WgkRdyonOXMl3&L14WF## zem+^tNqlmaX?${))_n4oLVWU;FL)I!5ArHl&f-=>(w=WAu06++M|-9v zqxLk*Z(5TrUu#XUe4y29c~z^+@|0G)kPw{+41??~)6sI4roH7vO4_K zO-svCO>@f}O;gKcO=HU_O(V-dO#@30O+8C{O&v=!O)X1ZO$|#GO?68dO;t-_O=U|i zO+`y4O$E!J8giB&HDoMbXh>T=(2%sep&@R0UPH|CxQ2-3ehp#E?HYoX>oo){muv7@ z&e!0zoUXxb*{{KA*{;E1S+BuvS)svdS)jpUnW4dCnW({N8L9E#B1q$(g_p)(3uler z7B(8cEKD_iTIgx~uu#+ZW+AWf)j~q!i-n-ZXA3Tkj~2`tA1r>Vzqfd;{?6jA`df<& z>aQ&hslT$=qW;oinfeQhnd;9iy49ar)TuwQC{%xJk*xm6B24|Eg{S%h3mf(O7W(S< zER@vmT8OFNvEWp{ZShC#mc<9Pn--7NZdhDXyKZqx?V80twQCle)UH}U?(e&dw736) zMW)&Xi&(Yu7J+K#EL_#jSy-x_v(QyLYoVxi)S>Ehs;4ZDtDdshqk76>qv}bEWvVAF=BS>un5cTfqD}RLMUCnSi$c}o7U`GoUX_CuEh+~ss#OkJ6sa7v$W%FCk)U$GB0}YW zg}=%H3pbSm7Pcz;ElgGRTj;3lw@^{pZy~L+-$Gbrp9Po7J_{z5eHNdU_gOqv-e+-1 zd7s50<-HagmG@dKRNiYbQF*ULqw-#hLgl>{Ny>XIf|U1KI4SS7FjC%Yp{%^uLRfjP z1+(&Ai!VxhEuJdvwYaLZ*W#GcUW@HYdo5Nd?Xj4lw8x@TX^%yf(jJR!r9BogN_#B) zl=fQKEA6!~RN8Byq_o#UL}{-Do6=s3pNe}eUMudkxTm<+;)3Eni^GchEVe4{vsj_H z&tkUXK8rrZeHM+1`z%To_giEr?zf0m+;8EhxZlD_aleJB;(iNF#r+ntiu)}D6!%-O zC?2r*p>V+Bjluzo2MPx)t|}a`IH_>JVxPhRi%kj#EtV@Bw3wrC&|-qZL5o&}gBDc^ z2QBgx4p}5C9I}W|IAr0gaLB?*;gE&7!XXPCg~Jv~3WqHu6b@VPDjc?8RybnuS^kK{ zefc96r{#}YY?nW3u|)o;#RU1I7B%w6EHdSfS%k_Tw{Vg_ZlN!K+(JhFgaxPk35#!X zCoCSzowT?pchX{?+)0Zya;Ge2$(^$3kUM2jCU@E*Meejkklbkt2e~sA`f_J1WaZ9S z@W`FD_$__rPr*^3rZvX?BlWiMI$k-22?R_3zBeVNM^7i2D59FnwWyZ4W|1p%%_2eOnnjSzbqiOS>lWrR*DbVUZdl05+^`UkxoN>HbJOCj^i7M) z(zh&jO5d_rAbrcCUHY~~zVvO2aOv9?_R@DO)TQrO2uR*h@aO(3X5^Au0LHf=%+7#TSX^77rz!TU?NMZn00| zg~b|)7Z$T6URrcXytJs2cx90(@ya4X;8-&CpVq&Cv1;tC3|Z ztFfgMtFa{$tBK_y78A=B7E?=47BfqJ7BkB$%;uIenawQ|m@O=Im@O>7F|DxF(q3vQ zuf51pM0>s^r}k{ie_AsvKWk03e4#bT@~&3D&@xUd-!eoi$I?qH%hEwB-O^Mm)lyq4$x=}(!BSi+ z){<8%+LBo-((1nxD)7^57rmN*5O=ruQ znvRzJn)a4$nzoj;n%0)ZnwFMXn&y^?nx>W!n#Pv?nueBcn);TuntGNdnmU%+np&31 zni`f;nrfDUnyQwZn#z_8nu?Y`G~_McYsgtX*O0Niry*r|O+(W1oQAmNF%2=xy&58x zTQ!6%*J=n_F4f?-oU6fSIaPzlvR8xKvQ2~2vQC4;vP^@`GGBw$GF^k&GG2qpGD3sF zGC$>TfLetG~9`r2ficiTVqR>FUodI@O<9)TlqT$X9=2k*NOIB1HX> zg}eF#3oG^e7P{*9EELr5T8OCMv0zufZShO(mc=`@n-&k%ZdhDZyKZqp?YhMtwQCj| z)UH}AQM+O>9ejTu^4|Un7SU?wEdtceS-7a3v#?M*YoVid)zDmBSW~RSsL+R5@gELFJIeF_l9WdsGftY*smFu~Oxr#R8Rs7SmJ?TJ)+MuxL>^ zU{S4dz@kv)fJKJNev1T^{TAUW`z`!b_FK5A?6a^{*=J#*vd=e6VxjULi;2p6EE<(}TNEnqwn$Xo zZ4sor+rmkCw}r9tZVP4Q-4?>iyDeChcUyc_+HLVvX}85SrQH_Cm3CX~P}*&=Qfarv zET!ER-AcPHYLs?cm*^#ZQI37Vi}HT0BzNYjI6spT#MKeHQx__E~IJ z*k`dqVV}iZg?$#26!u%RDeSkXR@iS*ps?Q}RbjtHl)`=se}w}UE(!-MEENt|=qVhq zP*FHwA*pb{f?wf)1&hK#i?8wrEgs4rv^Xn&$YPiLA&X`5hb$(`AGTpphvkl0Y>+!{F;DKeMUUKZiz>Mj z78!CUEW+hZSh&iav@nr7X`w84(n3(~lm&y_DU0{Ar!4Nvp0YS6d)i{J>}iX&vZpQP z$eyw2kv(HkBYVaoNA|2mjOyknadVlGM6oEWv*E0 z%UrQglDTRjDs$C>Q|7A059wXyY6soNHHQnxKKr0!S*OWm=sle%M}A$8Y6 zSn96DKgoL*uO#nTT$Q|MaX|9E#Tv=`7BeL8TeL_%uqcpxU=btvz`|4Vp@o^`Lknfe zM-~E-k1YO4JhFHr@z~;~#AAyS5|1smNj$MwD)Gc(vcyx1CW)sOMH0^}5+$Bl1WG)& zaFlp%VJPv!LQ&#{g^p{aa;6@ z#Uarz7Ar)*TJ(#4wI~z)W)Ua)&B9gmyM>}8#v^4piAUP9 zfJfTWk4MH*k4MImpGVg6F}JMc3T`>eTy8l_BW`)iA6)X5`?(Y>JGc}rgSZqeWw?|q zpK~f%Zst_BY~WO}4B%9;RN_>%{K}zfd6GlTavq1eWif}kr8|d)r8I|z<$ZQd%N}-3 zOB;4A%lB+rmdn_*Eo0cUEk)RLEYGs)TDG(5S~{}oSu(KdSsr51w`^fCu=HRtu;gPg zw7kk}XgQnN$TE@H$Wn*d*zyO{3QHO7C6~8MUGnXxXA^Z&|HrYgwdeZJD8IX&J9+ZW*R& zYU!(KZ0VwDXlbpfZ)vQlYpJEFZKWGt_0NLilIkgz^(Pkb>W?jg)E`;6sz0=_P=8>dt$yD^PW_&Rkop}9R`uH!Kh$nn zyivPp@j&gS#bvb{7RS}DTkKN1X0cA~s>LF;D;Cq#E?ab|U9zZCyJ%6QcF`gYytn_n zg`e6v3n#U67UpVaEwt6nTF9%Nu@F%^W5J5ddlLw>M4sO zswXXWs-Co1r+UI-iRuZ9nW`r&`c#iwG^-xBs8l^}k*9jhB1QF>MU?6>3xCz47OtvC zEv!|KS{SMxu~1h%Vj-(~#6np0umz{;VG9P;!xrCE4q3cWIb`ujbz+%420gGuW2P}G3_FFWo?6;^=*>6#(vdyDSQncUdGV@3II~-f7{aywk!+d8dW4@=gm8<((ER z$~!H-D($p*rnJ-Iy3$UI6G}TRb}H?(Sf#YnVz$ywiyoz&7PU${E%KFiS|lj#v_XMXcg3i$KL)7A}grEG!gvTj(h6wvbocZ6U0<+k#zj zx5aOT-4^c^c3V7F*llrLVYkI;h20hh6n0x|QP^X#Qelt9JcT_LlNI(@bSUhxs8!fw zQKYcPB3)sxMU28;i$I0F7H$fAEvyyxS{NwowNO*oYay+$&q6?9p9P!3K8qjn`z)Tw z@3*)hzu#hy{Cg@(*U3u&2)7JM?7EEr`jS-h0K zWN|_Ivc-1k%NFycFI%)pU$MxQzG4v~eZ|5?`ig~$^i>O9>8lpsq^?@rm%3(gLh72u zCaG%{bEU3Zv`byLD3ZEi5hHcO!d>cyg^|=v3t6d~7MxPIEWSwIvbZmK%i^@;ZHsM^ zw=EV)-nQtIykk)iNCPW6@O_VDE`voo7gLhTVk&*_KCf=SSzA1oG%ezfQm{b*4j`q3gn z^pk~y=qC#e(a#nFqMt2(iF~nmD)PnRg2-2kT_RsCmWh0`m?-kiqE_U)MTW?Cix80? z7WN`PEVM;_T1bfev|ttaW${$_m&JbJUly~3e_NCa|F#Ge{$rsd{KtY*_^-uNp}!V~ zh5lJA6#8dTFZACcR_MQljSz#Sv=D>kZ$U=O+k%Xidjy#*=L#}e)(J9OCI~WHIt#K` zstdAO@(8k8eh^@@yehzExl4fEa=rk&Wvc*(WsU%+Wv~FJrIi4erIG-bC6@rV*ixBS#PUCnh~;e_QOoT-qL!0+#4Pi9#4LSz#4UAs#4UMwBrNZ8 zOIR-EmbA>|mb5hBma_cDC2hHnOWLxXOU5#QOU6=~OV;u^r<~vm78Wf_cNT3+J{E1uE6h5Uvzc`)lbLlbb(r-m ze=;q%#qzAyM9V{3eU>}4x-Hjgby_acYO|c7 z)oj_T)nM7IRcl$PRc)E4RbiQ;RcaZfRcz_6Rbc6=m1k+Km2GLLm1(K2m1Zfcm0~HZ zm1xPS6>s@pGuHB}W|ZY?%?Qg!nqihVG(#-UX$D#z)%3UAt?6sIQPbOUg{G(FJWY4Y zshX~qJ(^CIO_~mtm6~>z1)4UN>6%uSahevEp_*ovKANVM&YH%SR+@&EhMM}88k)M6 z@|xO~;+mS4e3}}TY?^A8e>GGrzi22~zR^&$e4-(5d0Ru)^0J1sfiyJd<7t7WVPi)E+= zlck>qqote1e+zq!e-;)Re=Q6&ep_g2{IXEe_-P@n@!dj1{fqcu~z-H#RBzL7L(LpShT7?wiA8|= zBMWEshZbh)4=gm*?_0>K-?I=Xlood%C z)~H>zSfF;rVv5>jiw?C*7By;@EDF>vLihHcxA0XvXW^)J&camftc8}^SqnL}GZsQ> zXDry&PFws|J#Fzp^_0aE)l(KXRZm%*Q$1;MSoNgE4%HJDYgJEJEK)sTF7P)WSveh=rBv5eoy=BNl3^hb?4O4_gSS9=706 zJ!J7;<&ec!l|vS{dAduKQQ0?6;V&vfpBw%6^L; zm3%7Ol7ZyugV?^7nMC0)+&1}j8%49XsPVBP*T}# zA*Hh0LQrM51*gg`3kH>479W*&Sv*wUWpP1yr^Nx~ofaFEcUmk^-f1yGd8b8#@(zmv zCo+<6HxURI_;)K$6i=9f_ zEmkRQx0s`}-J(}%yG5PSc8da~?G}kj+bx2Xwp+L;ZMQH}+HRq)wB15dX}blt(sql# zirX#TD{i-VsJPwYvf>VlV~RU0b|~(!Sgp9jVxHm-i;0RmELs$ISd=U7u*g>2VG*ae z!y-^|hlQ)+4hu`g9Tqx@J1i6wcUXuh?y%rc+-dPgVW-6hg`E~p6n0wNP}pg4R$-^b zL4}g}VHH3laJK7EJQ{E#Au=u(&ICz~Z#r0gIh-2Q8M%9kiG# zchI6)?vO>H+#!nuxkDCya)&HzGGC%pzU(m_@kkaSM0Z;}#aO$1OBuPgqFGp0MDOJz?=j z=7hytnUfaxWlmaLkU42_NamEq7MW8P%VbVj%#b;4(Jgb@qE_a#MZU}#izJyd79lcc zEZk+zT3E@Pwa}G0YoQ=>&O%t`oCTZAIg8KI=PhnYpSL(9ecocF^m&Vk(ibc$q%T+` zNMEq7E~gY-ps>NT)YZfmhuUTA`yl!z&^18)Z$?Fy~C2v@?O5U(2lDuINCwbGt zTk@ubh2%{ORmocx!jiWv7$k35ypy@xVe@;(-N=#6yc$;tws(h(EGeFaF44viM_*GV#Y2 zQQ}W5?8Ki~D2YF{U=x38@k;EO#d)!37F)!gTg()DVNoac!XjDhrG=;1OA7;Q1$jfi} zmq)Tru%e&G_c z+`}bi*~%qu>CYu@Da9pW`HWN2axJ zEnPWeEu}f+EFZJWS@yHbTiUV9TfS#guw25XU>U=vXeq{~WO;#A$+C-8+0u z#quDFie(Fns--)NswEGLn&o9?HOpDd>XymO>XzEf8kWD9mRT}rFSh)uwZQVV)?CX6 zTC*&#YE8F1r8UL!fYwCIty+DStF*c;7ie`@PSt9)?AB_sY}9J7EYqsB%+ac{Owy{b z4A&~P^wlb|bk-`cwA9MA)Yrn_T}x3-ZA%_aO-mL{b<5uxs+ONM zR4iXL)P-7hP35D4N1$L8WNTpHN-4eYKT}a)DX6usUc`NQA5D8 zQ-ja4NrTt2N`u?7NQ2WdOM}BQS%b|oT7%UxM1$GVM}x`IRfECOPUF9YnZ`d0eT_dB z8XCVX6g7TXNNN1A5Z3r^!K3lbf>q;-#UJ(07Vp(RSv*w#U~yUfy~Q#0cNRO;-&(9z ze{C^W{guT8^_LdS>Mtxx)t^~ps6VxcR)1pQr~cT&QT>sHiTXneb@lre((3mt_|)%O zFsk3N_^Ni>;)U8Ri#uvJEzYamusE!C-D11iHH+11S1snLU9p&?cG;p$?XpFc+9iuT zwTl+XY8NcR)y`XZtDUp3S37HAqIT9oL+y-(tlAk1LA5g$Y-*=1eyN_ec&~cO;<4%} ziyNvZEzYW*v^b=C!eYDX35zwVCoC4K9=DjLdfcL0^_WGY>M@Hl)ngVpsz)u7RF7JO zs~)lNRXt+ita`-4QuVNfzUpBMRn@~5(yE6n1XT}Nu&W-j_zPNhuX51h6}av{U~ygL z0J!cyqO#v&x5|EtjVk*sR;cW=n6I+WVyenMiyoD|7R@SqEvi)ZS`?`4u}D|hV-csa z$0Af^w}p?&ZVMNc-4@m=yDf}Vc3Eht?6Oc)*<~TAvdcnHWv2y)%1#Rgm7NwJly_P@ zP~Ks2UU`Sbe&rn&>y>v{%vauS(XYJSqF#BsMZWTOiv;EE76HoJEF6`$Sr{sBvrtmr zW+AM+&4NXFo5fe9Z5Gdzwpm&v)#XrTZ79SP2Sv*$UW^q+vurmEtxFUBzt{ii+DT zL>0GLa4K%I_^YtZ;-kVgi>C_PEN&@mvpA=)-QtkKc8l!_+bvcrY`0jTu-#&+!gh;J zh3yvg3fnD86t-JrDr~oiQ`lhQ7X6JB1LY$MUdQn3rD#F z76x($Eac@5Sn$amu=po?(BiG^L5sVx2QALX9<>-QUvWG0XWe;1_$R4)H zkv(h?BYW7wSN4d7t?UsCJ=r4`^0G%P1Z0m|Fv=da_#|`G;<3yzi>ornERM?@v)Czf z%wo07af`V!$1VD0j$1UzoUka7Ibo45bHXB0=A?y>%t;G-nUfYqGN&w5WKLN~$egm^ zmN{+lPx`dQQ|Z$dXQWSCY?eM_F-!W4MU(Uyi!AB07D3WyEv%)_S}04OwcwUMXYobq zoW&ifa~4OX&ReXPI&U#k>bym>)CG$?sS6g7QWq>-q%K+*NL{p$mbzrYE_KP`v*aa< z`;wO}PD@_4*e-e5Vu|DxiwTlfENUgMSY%3GwFr~EYT+z-)xtpXnuV<7H4ARZYZgBw zu3J2lxNdPp;=09Qi5nIhC2m+Okhp2lFLBeNPU5CTuEZ^i7>QdJJ`%SrY$R@5=t$hL zkde4!!7Fjc;5qn}0CHBO^LF}o8n%GkdUa@BuUqqi-+!1|laai=Z#cI(P z7L!F^SX7I?v`7|xY2hvU%ECnSm4%GxD+^Z9*B0+YURzujd1G-<2-} zvfxjPQo&yq;ex*{tOS2s$O`_kU=;jg@l@ci#c6@R78?ZqSxguBXHhHg-y&JyzlE0o zgQcMWgQcVZqa~97qvch8Cd=jgOqNyr%$9!q%$CahES5j{SS-)+v05(WW3{a1W3vq9 zW3$xdW4C1GW4FA=%VD{Vm&3B3m(wznm($Xjm&;O~m&@`O54YtF9&XF6JUo_@d3Y=f zcz7)Rcz7*!cz7+jc=#-@ar0Tu;^wzZ;O4i~;1;m_$R%jGi%Zb5g-giNmrKY}l1td~ zDW{0#W=;{yMov-708UX$c}`Kw_Z(uDhd9J6r*Vi|=5UBxI&(-^N^wY9K4zD+oWL$+ zX~!;Q`GHN^axt5v}m`IdLJ=2%|RnrV4LYntU=t;v>~v?f@t z(CW3EtJP&WS*zW$L#x%YPOHhXM62F1Q>(@@UaQJ7RIA+5TdUO4QLD((Tr1yFS1Z?2 zSu4v@QY*ufUn|X$RV&%@w`QW{N6k3P=bAB=_cWs{uV{u_p3)4pJg6CLxm`2Ra-F8X zVEORv-ER!|uETc4SECV&IEIl+WEbTSTEX_4d zEcG;vELAlPEM+wHEJZYREV(tcEtxbmEq`gKTYl6~wS1|eZ23?_$?}GVg5?DbIm;6o zGL{E4q%C)7NLp^t5Vu^RA!fNiL&S21hLGh14MEEe4Svf84L-{X4Iaxv4Q|U!4Nl8M z4R*^Y4K~Xl4Hipp4Q5Lh4Ms~F4F*e7jsF&U8hM`>h~>p)bCmRSG!~JS?#vPGqqb5x72Q0oK?GF zaZv5L#a6Xz7Aw`RTFh0uYB5pmibbp1WedpNy%#MK)h>Yd_Is(Fv#?V;Yhk2z)Pd_1swXYZsGhVqsCvR;o9YRR)vCuW7N{P# zn5ufrqD%FdMT6=wi&E927TKytEfQ3ZScIt_vG7qnY~iGO*uq@(u!XMbAqy4NLl#o1 zhb#nC4_dIP9<=zQa=_xV$^na)DhDhcsO-16rn2AStjd0i!z%kMcB$;M*r>A4V!6s* zi+L)0EvBmMwdhgVW6`9t$D&eYk41sXZi{r4-4<~wyDdUhc3JqS?6PoH*=1p+veUvy zWv7Lv%1#Rfm7Nw6DmyF$RCZW!sO+#{P}yPeUU|F4edX;I=asix>{H%mu}*oL#XRM0 z7JbUwEb5iFS>!8kwTM^VY7wBk)xtq}tA(NRRtqKNtrkMcTP>KCw^)2p+G6ocX^X{m zr7adGl(tyxQrcp%T4{^LT%|1*eM(y_8kDwJ6e?}DNLJcx5vsJ=!d+>zg@w`<3oWHB z7BWg(EcleRSTHDUvG}C8#o~$L7K`hOTP#j0Zn4;{xW!_f;uedAid!ruD{ir9Q`}-v zskp@=S8?*kZ9pVT;8=g{>CT6t-G)D{QrBP}piws<71}OJS=;yuwzC z5QVK4UJ6?+>=m|Jm?~_w&{o)Hp`ftMLQG+s1&_iu3r2-)7VqV^TilZ0ZgEV0yTvB? z?H2Row_9|}@31JB-(is=zr!L(ey4@K{7wrU`JEP0@;fa!d`%n^%9 znWGjtGDj`qWR6+{${e+DkvV2zE_2L6OXiq`tjuu>0h!|#%reI<-bo*~xF&tVVz2ZG zi>1;hEPA9*T9iniw1|;DY2hk;(n44Il!ch|DU1J7rz~DbowB$nb=qQ=)M<;wQl~9? zrOsHCOP#Suk~(AID|ObwLh7uAiqts^0jYBqe{V zV9_pl!JsYQ(FQwvwo zrxtpm&n(16pII=7KDT%&^4#K*$a9N5A}=hKiM+6wDDu*xR^+8crpPOcFp*alP9m=@ z^hI7<$cVhQ;1qdd@mBba#R=iJ7K?=6TGR@^vxpRaXJIb<-a71nKEbaR1%lr!f(5@>mU>O=jC@R%w|JQ? zH}f)E_VBV;rtz{^I`Xnw%J8yU{@`J=yvoC7xtWLEauN@_WdRSnr5_K6r7jPLB{vVJ zauLpYPYP>YOyTT zYP3w(s<({Qs<8~#s=qZweiSkupPrlybO1Whl?Hcb!9T1_|0 z5=|G&Y)wbYBu#tENKISI08ML4cTG!6J56&-Q%zG#9ZeHUWlbYXX-xx5Ax%9?PE8$4 zMolft9~v5#A2if0pKGXE-q%pJysn{Wd0s=_@|cF4uZ5h(ZwqmaUlsxyKP@;lzFRP9e6#qj{?+1@`e%zf>YpsmseiOM zsQ%t!v-&%WW$JG&W~#ro=uv-VQK$aWqEP*XMT+_}i*WU)7GCO4ENs;uTNtQ6vQSok zU?Hx4--1j1p2a`4yA~hS?pQokyKQkp?UuzEwVM|E)oxg9R=aMoTM4u2 zs;4X-s-CpCrh3xiwCV|q1F9!1wyGYtSgCs4V!rAziz%wdEIL(>S=6Z>wJ1?NYLTUS z#3Ekxh()OCVGA$S!xj#zhb_!h4_WA_9H&-2DhDh+sqD9S zp|aoNp2~iUt19~}&Zz9OIHa=AVyDVpiw!D!!FB&!l|2?yRQ6bOtL(ODQrT@$sj}Om zKxLOjy2>t#IF(%%p(;Bqd{lN?IIHZmuu|D!VW_ghLQ`djg@Vd<3kj9&7W^vPE!b7I zTl`brX7NsWo5ellZ5HR0w_5B|-fFQ{d8@@-<*gQd%3Cbzl($&qDQ~feSKeabue{m9 zL3y){Qrfu})!= z#Uh1G7Sk0rS@bAuvS?J;WKpKD$s$`}lSP8UW{XgT%@*DYn=Kp^Hd~k}Y_`x**leMs zu-QUfVY3CV!e$F*P`g5Yi^VOMbh>54r6Y&*ZjST$S5laaeAL#YVXu77OHdSoF#5w5XNaX^|th z(;`Z4r-i57P74dUT^8zcyDY@yc3H5=?XvhPyW8Ta>~4!Ivb!yg$nLh-BD=?8sq7w$ zsj_=4T4ncGl*;b4NR!=b5hlCW!d-T+g@x=s3r*R57E-eNEVyO&S^SaNZ}CoMzr}r- z{T3Hw_FEj1Ibg9x=77aAnFAIxWDZz#%N(?*l{sipAal?nS>}*Mn9LyyPnkm&HZq4S z^koiPD9IeQ5S2M>!69?R;)nDRi~G_?ERIPZu~;X4)MA?SQHwh1qZVn>M=kuNk6D;Y zAG1)9K4!rweazyM)NzYDQpYWhN*%XYFLlCVhSUj*CaDt^IZ`Jr!lh1HI7*$g(3Lu6 zAt80jf<@|-#RtjL7I!62Tbz_UZLv-AjKyNfGZqsh&sfw-p0&u5JZljldDg;J@~nlC zADY@sJ{#X?@Be7c+C&X@9tQEU$F0T8N0~2>@N0{gLa!~33%#*eCiKRlRp^aHiqKmN7ooQnDnjop zScTqOJQaLzaZK=o#R|a>7F~iLEOG=tTKEZmv@jI>WFac}$>N8=XNx-mpDhjue6d(2 z@WrA>;HyQkz*mbXfo~R$0^ck&1-@Gd3VgTt%>TpUDE|+O>HI$}viN^m*zy0g5a$17 z@sjVC#R0zG7Ss8DTjcZovGCygW1-0R*WwrNUyG}}|18$?{*ixmhfybF*4TakE(}aI;yy z;9|Gj%*Ae5&&6Ts&Bb9U&c$i@h?CQD11Fbd9VeHiA1Ak^94EKs2M!*~gB(1TQ#g1n zGdOrH?K$`?#X0ya@3He+_ObI@I~J(nrgXNYm(&*t$xcstscu}txn5Itv1Vit!B$qtwzgetvbs9t!hg*tx8K9 ztujj^trANOtwKvVtvpK+tsF~ktt?AMt#r%pnyHp=HIpnKYbIFU(u}jbpc!p>Tr<*g zuV%RA7R?aLRhmJT3pE2Qr)&CI_G$W9wrYA>R%^Oj7HPU#W@R&CMtADY$ss7pGjQU55ed-@9Hmbk3Sfc*cVw(CJi%#{| z7B%WGE%Mc0SR|=Gw+K~#X5pd!#KKzrv4x)cBMU|KhZdsh4=gy;?^*m&yKC`Y?T*D` zwc8fg)NWavQoCufPwj@qMz!k}OVzGf%v8H-(W`dFqEYR#MVZQ9ENHp?2DWSM9U~liDeZ@2aOPUaOw8c%XXH;;QNii&Ls6EcUA&x7Y%$ z`{$`1vzV-U%%Vf}s70;nQHx^LBNiE|M=au04_kz&9=7mQJ!E08ddR|5^^k?O>Ol)d z)q@t|ss}9iR1a9NsP4D;rLy1Rqso4Z=PLUw?yBswxT3Pp;2D{r*;qO{TC zsnSM^Yf2j}PAF}(*r~M9Vztsni#bXgEc%o-STrbYuqaa6V3DG6gOC$QQTm$UvY!QM#T*lOB6R)Ojq1s z(W$t>qDFCpMZV$&izLMj7Ga7TEIbuASlB9VurO5IV4guDZ9hshU^ZD6S6xjcF69uSRuR9Vy5g)i%!{{7FDu4EwW^HSwze3vhbGO zWnm+`%R*Onw}rgyZVLg~-4=|pyDdJ;?6!C!v&Z6^%pQy5GJ7m`%IvXNEwk5RuFPJG zewn=%O)~o|N@Vs~q|5BHh?3c7;VZM>!a-)gg|WQuy`qb zz~Z9xL5m&I2QB7HAGGL@K4?)OeaIqG`jCaA^dSo^=|dL6(uXbnNFBC#CUw~2ywnkk zol-|E7E2wm=#@HZQ7(1VB2nt7g^$!x3p1%>7D`gbEO@1kS^ShdZt+y|xWy&O;}-iR zPgtyxJYg|Y@`Od3OE%L>#TZD?;u&@!kVWBK`(}GLvro~6mTNXD(Z&@4^y=}2l^tQz$(c2c) zqIWD(MDJMmir%#_7rkqtAbQt=OZ1+_7m<4w_eAbnoDjKhu}S2<#T=0b7HuLAEDA*) zSj31twD1&pXkjYy$U<4V#fc#0tH%uoZe~At&_8;-BCvi~EAFEe;C4wpb+i#-dg5 zjYYcP8w)SNw-&mBZ!H7_-&uSScxQ1#;Jw9Of%g^*1wL4`3w*H16Zl{eD)7<5R^X$B zs=y};UV%>*ulPS(?BV}x(a-3vT|e77zKpTI}HaW-)>9n?(lScMC_p z?-o*gKP8Dj|>7rF_X{A+RX`oeRsiswIDWg?jDWsKW$)S~P z`Cl{B@~dXLL(+1NhJ@u54Kd3e4H3&04Pna~4MEFN4FSts4L-|M4Iaxl4Q|UY4Ngmc4Gv3p z4K_;$4Hioa4Q5M24Ms~X4F*ePjsF%h8h`}X6u|e&+#S*n^ z7Sq+PTJ)%0v1m}cY*C_i$s$ATqD73_1&ctn^U%HhXD#&9&R8g^ov{#CJ8i+EcG`kL z?Ucn=)l(L)R8LymS3PNQMfHTmN!1e;`&5rxY*syPu|oBj#az{67L!zuTC}SkwWv`& zVo{`e#3EhwutluuVT)kZLlz#Yhb-(=4_cV09<J!qkzdcZV6Am)%_Mf zRrXoDSJ`LrOl6m&Ih2T^3y` zyDS=2c3M=Z?1a|+J1k;Vc36a{Y`5@M*>2&avfaW;Wt)Ye$~FrPm8}*EDqAhYRkm92 zt8B4gQ`utiM|q3IYvs)rx0N?roL1g!v0Hhw#cJhE7ITz0S@bAxvZztsXpyVD(IQrP zqlKUHMhko84Ho*!8!Qx*H&_TNZ?Ire-eB=rX@kWRr41I>l-64uS6XkeQ)#`$Dy8)n zbClLw^eL^kXi!>bQKYoaB1LJPMVQh$3lF7r7FJ5@EOeCCS;#A`vk+8TXThwr&f=Tm zI*S*I>nv_7uCq9+xX$8$;yR1Xit8+vDz3Abp}5YXTXCI5o#Hx+LdA6!DT?bX!WGw9 zcq^{6uv1)TVWha$LQQe4g{0zI3tq*w7L1B(ExszOwRokl*5aPRT8m2xYb}l|thLy! zu-0OO!di=^3TrK9Dy+5WQ&?-!tgz0aLSdanuEIKtB!zVr5en-pd==JNI4i8PuuxcM zp{KCULPcSng`~nd3x0)l7OV>EEWXRHw|FAI-r|D%dW*gC>n&EwueX>gzrmtOeuG7x z{056?`3)8x@*6Eo_Cp*&excB{o**{v35WVc%E zk=<&sMs}OUT-j|Fy|UXZ>SVWBnOzoBWOiA!$?USIl-XsGEwkGqPG+}7 zpv-OySDD=w7BYJ*v}N{K$jj`p5R%zr!6viU;VzEW?h{Zz5BNlyOUJZj-8dCbCC@|cC9SD(C5~IXkvL&-OX7sZ35gRH+a*p~ER#5CF;(KE zMT^8Ki(-jW7ReH)EP^CXTR2IawlI=7W1%E*#zIKqj0LmAS&Qf5XDv>OpR-ske$Jv- z{G3IB_<4(9@$(jD;ukEW#V=U=7rSWjMC_u)DX~iy8^kVIOcT3oQ7d-YB3bORg}2xh z3nQ^B7LsCDEf~bETD%awW^qCEn#B&$YZePcuUmAAUbiR`y}A6PgDKeUh)erWMa=#j+@p+^?mgdST=6MAe> zCiKK2Oz4S)nb1=UaiOOcKLnpy+!TCfv0L!D#azMX7WIP9Es_LZShxzlu+R{EX~84- z(&B@_D~qcFuPk;7yt0@l@Y3;#Qd zHvab(QT*>M^!YznF!O(~xXJg?Vguhtiw?d|7KwbHEUfrGSqSrews_0?+2RE67mFpl zUo7f*zgk4|ezh>?{bnJ|`_1A5&v%QnJl`!=^Zc;rf?8=GYm z8@r_t8@uIMRu0Q9Rt`%~R!&O}R!+;~EL@gtEL@iEEL@h{EZmltn0YK`GxJ!cGxJ&+ zG4opfVOnIlM{B<2CapP^E3{@>&efV`IazD6WvA8z%Q~%I%Mz__%Pg%9%LJ`f%P_4b zOCPNUODC;bOADN4bh7l;bg*>Nw6nC-w6QeMw6av!w6K)dG_w@bG_mBO#`L)Y?+ zhPLHn4Nc428tRspG*m55X((GB(onM8rJ-QCNkh(Zm4=MvA`NNFSsId-lQhIFyEVit zn>9o%t2Klyi!}r-b2RuZQ#5!jV>EayLp8W8eKj~O-89%O?KM~}%{5po4K$c6H8mJ5 z6*c}_NNN1D5YhN+!K?Axf=%O>#Xt2Q79Z5VTRc+#W^q;hi^XyE&lbDXKU%C&|6nm+ z{k_E`^|uzS>TfK{)n8j=slT*{Q-5I*sQ%o-Mg5tDx%v|eE%nD1a_WyP1l1o}u&Up; z_@Q>s;*Hu}i~DMKEH10vvN*1G(_**U4U2VZ*DV&QU9*^`cGaRw?TSU6+GUF(wM!Q1 zY8Ne{)h<~0tDUz%?Cn2ep{RDoLQL(n1((`si~p*pEWW6ovUsU_(&C=#35(0BCoE2= z9=F)5dfZ}@>M@Jus>dwms2;VLsCv|*P4$RHwdxUzLe;|-X{v`UVpI=V1gajga92HO zVXJ!3!dUfyg{JBO3whN87NV;AEx1+pTQI5av-qL1&*GiRUW=zHdo6CO?6J6{vd7{i zxbEL=u}x*S#afkJ7E4riSn-e**IVc-ueVT8UT-0& zyv~A2d7Z^)rF9lhl-5~XRa$3pTxp%f4yCmgtCZGS%u!lv(WkW5qF!mOMWNDKixj1` z7GX+jEj*OgSXe2ovCvgoVp~l^@?jOiWJvaq$#ekh*Vr-;iI_5!a;Ghg|Xsl3w6cS7E+3< zE%+2yTQDoGw)n2F+TyjsYK!{{t1T`othP9zu-ame!fK0+3ac%aDXg}bt+3i+g2HNx z7KPOol?tmZ@)cHFq$sSmh*Vf@;is_L!bM@Vg{8u33w?#v7OD!XEu3j;M)~y?@8s57+>u*vaawM@#ZI~P7Axd7SWK7OV9_SG!J<@dgGGwm28$56jTX*w z8!e3GHd-jjZL|=Q+i1Zkx6$IG>?VtcvYRX}%5JhaD7(pGqwHpjg|eG1CdzKMXp-G* zQ7pUJB3X8eMTqPc3s>1K7G|JZRA(dC;Or@}Nb6#9@vxt#6Zs8+w z+`>lUxP`XF2@4sC6BaxYCoO)7pR~9we$ryE_$iC|;-@T{#7|qKil4Ud5I4XR)&uH^k0b>=Qd@u|({gMYq^_i$byU77=3SEgZxySg4C#u;3TFXz^Y2qQ!mD zix$U4FIlV?y<{<6^s+^R=w*vc(aRP=qE{?zM6Xz=iC(b~6uoNkTjZ+6Gm&c+7e%gF z>=C(Uu}tK;#YBM({@Er>?;X4*0!gnn`3Ej20Aau`SozOjtUZMLIxkC3X{DdA@=m|Zr5D62Pc2>xJhiwW@YG_fz%z^4 z0?#ZO1)f`^2|Ty(6?kr8BJjdOTHu8Ri@-~ZTl_CA*6_cwsN;WS5y=0_LXH2m#UH-c z7MJ+mSghcCW6{9()*_Pct%VWaTMHh(cNWii-&q{weQz*R()*SyV1Udd$TxS1o(az3bY0J)F`H_v$aw!|5Wh5Jur63!VNXt`c%p5;=l z*_N}lW>`+pnrhjmHOaC@Yl3BwRTB9qs%ctT%4%9zifWo!@@Se^GHV)H{?;(C{H&p8`AS2_@{xv?kp;i{Lknj02NvJd?pwT4yK8Y*?T*Dowc8d) z)oxkrRJ&=hR_%txLbdA_Q`N3nbgEsos8zdcQK)vwB3138MWosV3qQ5qZSiX zk6N^X>;A(Q1*(TFQdJLGM5`XM2v9v};ih`f!bbIgg^}t33k}u%7ILclEksoJTX3oF zvtUr&XYpNSuf7O5)REMio)Sp=(WweV8eYT=}^)xuI`i-m#877GoP z%@*=1n=QmuHe2wiY_ece*<|rsd85TE<&74%ls8(ORNi2*Q+b2MO63g}GnLm{bSkg6 zs8U{Uk*&PWB3gN!g^%(&3tQ!N7JABSE##HgS_mkwwO~|UYw<~Gt;G|iH5ONu)>s@< zT4S+8X^q7yr8O3_mDX7FDy_DtS6XdRsI=N5S!uOJsM2Z+52e)>R!XZabd^?H$SbY3 z5K>xg!J@R<;=AH1i&u)PEbb_-vN*4}%HojXDvPa(t1MP1uCkb|xXPkWag{}*;wp<0 z#Z?yRimNQ56jxdJDXy|`R9tCcqPWsRLvf{rjN(cQ0mYRTEQ%{FekiQ8c%!h=;(@|S zi>nGNElw(|wAiPx(qfasN{i(RD=p?IthAV@u+pMUVWma2!b*z*g_Rbm3M(z56joXU zD6F(_Raj|ZrLfY%Kw+hYn!-v88HJS=LJBJ_I22Y|{E=T}@j`x;#TEHg76;{5S*(*^ zWid;Bl|{S!YKv0&)fP$et1bNHS6kS~ueQ*XUu_{Szs7<^evQQ^xiuCKn)DTuD94KyWV1{>;{WzvKuVgWH(rp%Wkkpm)&3yA-mDSQ+A_;mFz|f z9odZ*va%a3_+>X*FvxDQ_$0H*;<3yoi>or5ERM@;ve+rJ*wFr~kXW=5b&%#J@pM`?tehYrd{T6>E4p_XAIAC#G;()~| ziGvn9B@SAwkT_^DUE+{Mo5UfDGKoVLsS<}RLM0AcxJn$hFqJrBp(=62LQLX_1)IcC zi?`xOEzXM{v)Cwp%wmf8F^e+s;}((P$1QBdPgp33pRiyNKVk7g?4-q6v6B{?#ZFnw z5Ibd2FLv4@P3*LVuh?k|Q?WA^vSMc}SjEm-ycIobaaHuJ#Xiw<7RyA>S@esZv#1a~ zZ;>c^-oi`tyoIso1q(UR3l&>XpU4#pE0HS}Y9d!HghZ}d{1d)vaZ~u3#a7{K7L$apTjUF0x9}CdVWA^@!-7lr zhQ&*vn-(X8ZdxoCx@FNSbju=D=(dHc&}|Dfp*t2FLU$})3Es6hBY4+ho#0)IiGuem zN(Ap&gbUucuok>;At(62f?4o^#dCoN7H0$=T5J?}Xfa*jkwvY*Ba38#M;2ZJk1Y%Y z9$QEVJh5O9cw%vh|B1yC{-+k@{7)^s`JYmRFe>EoU<`T4pdaSsF4kS^j5QV7W+ZuH_7^S(bfT(=D5|rdn2NO|s0_ z>bFeQ>amR0>a+~hYO{3LYO%D{YP2-gsv-X%CbX4!m>d_%(6m5)Ur@R*fLW?&@xFwz%ojM&oW4Z$I@Ga+tNjY)6zzR z!_riP%~Dr`#Zpa!*-~DE(NaQ#!BSA;p9Po3Ukhf9-xfdBe_6a%|7meg{kz2l^=}r3 z)xTJ5RsU?ULj9A)Z1oQoz3T5R8r0uf6sy0nNK=1p5vl&t!bkmug}wT73uE=C7HaBG zETq&QTkxtsvS3tyVDUxmzQqf*dlq-p?pmBzyKQk;?Uu!MwVM{J)oxhKSG#U8S?!ud zyV_NYYPBmC`D&LflGQF*M5tY~@KL*9;iz`r!c^^?g_hbG@ZNr5wbK?HYNsszsGhR; zsCv@knd(W4+o~rlE~uWcII4QwVwdVMi}k9H!OD)dLoWs{1X}Rrg!Ss_wH8R^4a839kG1T6|O4Yw<>9kHuq^Jr*}rc3WIf z*==!LWtYW1m0cEFRd!meR@rH>NM(n`OqCrL6I6Csw5x2ls8iW)QKquZB3EUbMT*K+ zi)fXt7Qrf8EWA{CJQl@O%{AA8!gyWHd_2v-eB=c zd4t7G8S6WEPue9KhUup4GZl%Rzxs?_d{^R1*|iqcvTH4}W!GB7$gZ{Um0f3HC%ewVKz5ylqU<^gVcB&SEVAn?zR9e&cpli6hPReF=fUFpph$D}t~tdrhsFa z%fd=>w}pn}ZVPeA-4<+;yDh#*?6G((vB%<)#9oU-5_>H+O6;{*AhFM4g2X z!xnzxhb@f6k64I_AF=o)cGTjY*innaVn;1jh#j-&6FX*6B6iFoTI{%mlh|$|6$qw1t!CX$u|EGZtc^XDk>* z&se+`IcsrESGwr~=@Y@r~0*@8j%ip71QD;E2Ou3F3!x@u7;bj>18 z=$eI{&~*zrq3ae5LN_cP3Er?cB6!1Mx!_HUF2S1?d4jhrf&_0_mCXx5ZrMKNjiC ze=Llc|5`9IFR+}dHP^CRYnElB)^y8qttpndS`#gkwfZb0wYn|+wK^OH*{T_0S)&96T->89yw zX{+gMX`<<9siSFcsjO*hDWz#`DX3{_$*E~>$)IU!`9s6l@`Hw<<#P>v%ljI-me)13 zEzfCaS{~ETu-vDiX1Ps6#d4j7lI1cD1o9crCp&cr2YXxGb$TI4w;y*e!K5SS?jGSS;le%5X7w)?%hW$v%uxSm(XIa8qE7vt zMWOmzixl<2rP>XPxoX!fCaPVtXj8jtQKfdpB2VqIMUvVji!il|7T#(X zEbP_JTbQVwv(QjG3*Or=q;}eZUG0>`Z`D&4A5>3TJXJkmaZB}t#d+1^7DrT%TkKRl zX0cB7n8jk%qZTt&k684n9nwIC zud`U8yw+ld@>+`y<+TEri(^VFEw(GIv{R#+q}t*{7HT4CX? zwA{iKcN%py~9nMJJPGK&DkWfm@qOD)V5ms)5mF13(XTxubtxYUA8 zajC^Gg{2nn6qZ^%QdnwnU16!kX@#X02NafAY*kodu~K1)#XN;27Lyg0Sac{Xv8Yv8 zVo{{9#3Ef`iAAi!5{n>(B^DkEODt>^mRJ}oEV0l~SYjcku*5<{VTlEo!V(Jxg{2m6 z<(FFAlwWFbOn#}wX8ENS^W~RX^vEx@sFGi1kuJZ?B1C?fg_Ha;3w`-z7P9ioEV$*D zS^Sh+Zt+}hxy4nvUaw{xi}rc&GOI1#$gHurC$q-lg3KC=Lo#bD zw#clpST3{HVy4VmiyoP^7IiXfEed7UTBOLVvj~@2XW=EY&caq^orQtSItyi)br#|> z>nyls)?56QUT^VCdcDOt>Gc-drPo_5kltX?A-%z(PKJi+xg?ELKQuvY0Hj$)Zkbvqh%VW{VK1%@+1jn=Q1ZwpfTuZLwgM z+G6oua*M@n$t@PgCAV5^mfUJFUvjHOkK|U1O37^&X_DJ4LL|3YI7)7}Fp%7CAuqYz zf>(08#UF_s7Oy3CSlp7>VR1@gr^QZ*ofa!4c3RAk*k#cnvCE=DVwXj_#BPgliQN|N z61y$TCH7coNbIqYkl1U%DY4h$i}+rPYvTJXc8Kq@m?gg7qE>vrMS}Q#3uo~I7V6>$ zEV#uFSiBcIXmLgCpv6wHgBJ6|4p}sd9kR$2J7f_ccG$vP?68Hr*kKEHu_G2AM2}e9 z5It&fQ1qz9YSE(>Q$&wh)QTRnNEbb35g>Zp!b^o0UbeU;c-dmF;1!Dnf>$hB1g~183tqMG7QAXw%Et>*kUfv6N_4&Cl;|hPc3YDo?6K9JhNcnd1i5x`?*CA_j8M2 z?iUu)+%GI1bG@`!#r4vni0h?=CD$tpX0BHj7dc;9%;S7*QNa1y!kP1pg$U;xi{~6~ zEp~Cdwdmt`YmvzD&cdAIodrL~dyBK|?=5QCKUnCqf3SGQ_R(Si+eeECwoeuUY@aNS zvwpH@Wc_U6!1~#Of%S{UQI;aYX<4E*%`!`CvSotS1j{h3UP~XXE=wn^4oeHIR!cptCQDVV21{wJT1!E# zDoYNn3d?_*rIuebi!EPk7Fa&i%(J|qnQeJaGt=^@W}4-0%@oT`nu(SxHRCPkYsOkm z(~P$4)r_!g(G0V!(hRXI)C{uB(Db*A*Yvdv)AY9V)%3J<(R8=8(R8&m)^xJe(sZy? z)U>md)U>e_(6q8-*R-(wuVH5SUBkrkoraO+GYtdFdm8$dS2c7k&uVB}9@Wsa+^eB( zxkW?Oa*c+vnbEaNqVEF&}o zECV$7Ej=}OEgdzuEv+=TER8fcEVVV*ELAjEEoC*BEyXmLEcrDUEIBm(TQF+;wfLg` z$Ksj#FN>S%KP}Fvf4A7D{>@^e`WK7E>Ypv9seiKQRR3U6qyF9^U;V8`lKLBqQ1#aq z9_lYGtkqvw=&3)mP*Q(tA*%kwf>Zsm#b33D79Z6fSUgd?Z*fEIuEiO(I~E7jZd+_o zyJfLL?WV;Xwd)oW)UH{ys9m+FP`hH0qjuRMQSFjNsMjMUCqsH>f| zkb&>*KV|Vt^_0bX)sq%aR8LskR6SvFPW8COVb$XnJ5-NZtW`Z~u}Jl(#SGOW7QL!R zESgmhTU4kXvdB|CWRa|T&>~XxpoO360Sgz^0~S`Q`z`cU_gko{?z50q-D@ETuKV{` z{8QOu@kM2~#cP$_77tZ+S=>P*7ZKA)>h0fMHUAY7FldlSY)wEVUfjrg+&%q6c$-@DlD?7Q&?nCqOiy!Q(=)soWdfD5QRk+ zo(hXB>=hPSm?$i=&{9}rp`ftHLR4Xq1-HT?3r2-S7VqU3S=^CdWN|`%k;PW|#TJX? z7hCkpFSe+WUu=;nzt|#NezAqC{9+3u`6U(#@=GlE%EPmEdI%?u=pUe!s3z4N{cHpD=m)6thCrEv(jR<%u0*7GAk`6$gHwx zmRV&{CbP;SQ)ZP#jLa$vf0~y@#XIRW7T2WL zSnQWxW3fVdjm1RiH5OIUYb=tb*IM{UueC6fUTYyQz1D(LdY#2*sdW~2rPf&-ms)4B zNou{t9I5pd?NaM4ilo+C#7eEV@RZtMVIsA`LP2VS1&`DQiyx93ES^Yiw74L-(PFRU zMvIk_8!e_uZnS8U++>k2xyd3{a+8IZdeEXv z^q@tF=plq8QRIll9g!mz$3>1(|34#|aTm>&$XbN7m;1j%L@mb)K#Z7@r7W)J)TPzW{Y|$-n#iCH)ibaIL z6$?9oD;8=3S1tGiu3Eg|ziP3U|C&WV|22yw{_7T|{MRkG_^(?$;Jab5mG6c{H{T75 zB)*##R(v-tMEGu5yyLxPaf0`j#S-4z7LB~OE#i6aSlII3v5@AyYw?rkuEkBBdlox+ z?pe&_xo=U)bKfG8=YfS4&jSl-o`)7cxgT2W<9=k(!u`m?hx@UG824j~`&^GLR&YJB zDByZxVafHxf{E*?#aYg$7IQeCT4ZxRv#{fQW+BA++~O(6bBi4uFD!aEURWe@ytFXo zcxl1Q@yg;9`zwoT_E#3V?5`~zvAwpK&GyD3jO~qu0NY!OldNwonpodj*s;E|_|Njr z;tXwc3p9f* z(=`Jv<23y(Lp6OZeKfr+oi#lytu);%4K-aXH8hYSZ>x(w_L5EYPncL*>bjqqUB@_ zdCP7MS<4m;8Os_CDa#TK3Cmm!G0Rj9QOh_DVaqTLK}&xP0ZVrcK1&A;9!pCNZc9TA zPD?Efc1vXqHcJ@|7E2KgW=mcTMoTu0{}v1y|13VK|FL+Y{@dcZ`Y(%<>OU;@sDHOu zum06yq52n#De9jr+SNZ=RH?tW$W?!5k)Zz8B3S*kg`4^-3rqDE7CP$BEfmzBSqQ5? zv0zt!Z1G#|k;OZ;2NsXi?ps__yJvAq?XJZ>wc8e()NWZUQ@d#~OYMe5pW1bcCber8 zO;<4%p ziyNvZEY7MPw>YGF%woIhF^e^-M=chr9<`XRdc>kf^{_>w>S2p=)k7A!s)sC+R1aE2 zs2%{<{m!cUEiA!x|30L;e~$&b>K==~D!ajT|0|VU;JW|1%1&_Ie?(=6#cq`y7MoPI zTdY*sZm~dRo5ggMZ5DkhTP<2uwp!GvY_TX-*N%ixbLgEOscb zwpgLO+G2+CYKso#RTdS>t1L2eOtl$Kk( zS6XiIP-(fvC8cE+N0gRXY*Sihv0Q1H#Z0B87TroqE$Wn(S`;WPwMbH0ViBUW#KKK! ziG`)o5({mmB^Gi@ODqJHmRPVTEwT8nxY**A;$n-tii<5SC@!`*thm@>o8n@NRf>x( z<|;0>n4q}GqD66$MY-Z4i)_V37IBJ;EP@mlS-2@Kw6IiMXrZgP&_Yphp@pd8LJLmC zg%*Dm7Fv8%SZMK7VS&X>g#{Mp6c$(PSw{TFHZ(*h|-$GkqzJ;Q~0t<141s1#t3oMuw7Fc|e zUtn=heu2el`2`j`TdYNSw3uTsBOp#e;(Jr&xqDp4DMXt^!kTx)Sla;?QN$+Z@nCD&RkkX&ccBe~9^QgWR|n&di*V9E6sj*{yw^d;9@ z$V#ra;FjEA@k?TZ#Y>3|7B?g|TAYyBXt6_Lqs0n|O%~H7Hd(YwY_ceq*ldv@vDqR* zVzY&(#1;!ni7ggd5?d^!B(_>`OKi3HA->Jxw)i%Sz2e&}7Km@RXcpgYktV*~!b^OI zg|7Gx3qkQ67T?5nTHF@fX>mYor^QmSofchUyDSRCc3Fgp?Xs{H+ijsNw%dYBY`4WH z(cKoeME6)67Tsg9Ms$zGG|{~l4WfH3vPAb;go^I7uovBDp(VQCLPT`G#eb3g7OzAO zSX>o3U~xd?fW>N&0~XUo4qCK`9JDA9Ib;zla>&9<Cqy>l2NsCv4r!3A0p0Zdcc-ms3;Ax9e!P6Fzf@du31kYF~3!b&$5Ik$~PT;J? zWr1@RI|a^J%ojLk(I#--B3IzNMTo$83u}Q37D@saEVu+NSUlsuXtACDqD2S)MT;o@ zOBVY4mn@k1FIn8+yKJ$Z@3KW3-xZ5kzAF|cd{-=Z`L0?#5aGRH@tNm_#U-Ab7Mpo)T1?@&Wl_p=%OaHLwuKqbZ3}UpI~Je0?^tZ- zzH3p-eb>U3`>q8)_dSc7T=y&%bKSSd_RJ!f z?YRXX+jEPPtS>BDSYKG!v%a+W$MVwR0Lv?jc9vHb{w%L8L|I;2+-81bv6%UdMK<#r z3p3`o7EH`@E%UWzS*B`Dw~W@BVi~A4(b8S3&(c<_$I?Wr(^5;T%~C>UHEk_fG_5WFXjoc)(J;4stzl~USi{)zwuYhQB@KPcQyO}fhct97cWG!@ zZqm@OT&1CAxky9Ba+ZdYqKP`5uf45kp{>@^(`WK5y>YpuI)jwHOsDH4?R)231r~cL=Q2mXC zi~1`IbM==NTIw$>)NQoCs3u6Dt~TJ5}rf!a9>6}7V# zl4@rx_~3i{Pg=ZDJ!$b!^@PPW)#DbYRgYU7R6S;~P4$??YSp6_3sjF-OjA8#(G9Nq z4_TC{9V6AQ-EX0~&q7aipM{F*UJEJJy%qwhdo0*gcZ2Kx z&nmktUaIV}c%ZV=;+o1%i?b>_EFg9Nc8iTF+bve8Y_piJvdv0yTxGq5p2~U)HI;Q1vMTGKb^lrmR+Y6D zKb6;5yi{IeaYK2v#R=ur7CV$zS*%cAWidl}rA3GGN{b5Rl@=MwD=Z?ES6Fx|FSoE% zUT&eKyxc-sd6@-|@-mCRO3N(XDJ`>jptRKDlG0L(!%9mnwkj>LSgy3hVy4m(i*BVQ z7PU%?E%KEXTO=wiwg^#LY~iM~*uqk2k%hL>A`3aCMHYfei!7Lx7Fm2#Tx9W5agoIx z#f26Z6c<_?R$OSYO>v>cD#e8sa}^g_OjKNG(W1D(qC#Ae2bZK^DWxt z=3A7>&9_LEn{N>!H{ZfpZh?id+yVp@pIBA`4~NMHZs6i!9h= z7g_v}S!D4_W|74mnMD@oWENW-kXdZ8S!S`tGMU8|Gh`N9bjvKZsFPW2Q7E&-B1LA2 zMYzlo3on@^7IrdAEDU9qSg6V@v5=HmV!Yms;$QUTU#WdZ|U1 z^iqpr>17tN(#tH|q?cJ3N-wjJmR@ebD!ts|z0`7xn^Mayjz}%HSSPi@Vy4szix#OB z7Wq;uETW}WShz{8urQKZX(1=I(t=BBrNuYNl@^aBS6ZBxTxqdKa+SqO$yFB9Bv)B9 zORlmgkX&sME4kXjOLDb^h2&}rHOVy=B9dz?m?YO&e3V#Y@jzm&#d(Rf7W*aETCA5? zXE9%5okhRII*WRV^%nUO>n-9X)>{NfY_M>Y*kEBKvB5%FVxxty#6}AiiH#Po#Wz`; z6W?U9QGAod6!Fa#<>H$yqQy5`*o$wmP!``}!7jeV;|Z5GC2+byKTwp%cYZMS$Sy4~V}=njjWqB|@WiSDrI5#4D~Cc4uiL3F2u zx9BblGtpfZilVzLctm$wd>7em@knI1#W|5Z7CS}uSS%IUV=+NwuSJc>UW-hTy%u32 z`z)MA_E{K+?6Z&)*>Axkvftvf@P3Q)!Urr?2_LX%6Fy*(Bz(}qPWYgOwD3WT??Q(x zt_mHp*eZ0`Vye(#i!!0Z77;>6EUbi%SjY$+wfHZ1)Z&rgQHvvj$1Ii$9<%5YJZ6z6 zc-$gL@VJG!;0X&E!4notf+sAV3!Jn#D{#_ci@-^XSpugl8U;>SWC)zH@E163VJ>jm zLSEps1-rl*i~Ia%EH?0;v1sByYZ1zS)_ikzG-oZ>!!tAuA3H_T(>Mt zxNcc6aNV*v&3W5mI_GVRRL(mVW}J5{I63cF+~c@wv6thQC*2flqS)N!NV0mKE z!t&I@m*uI27|Sz@JIv24mM}lJ$Yp+RVb1*Af{A&KWs=rR%LuJ$mi}6kEnT%HSXyiK zSsH3}TWV-^SjuU&T8d~jTXJhPSTbtWT7K88wtS~qVfjR}%<{HovE?PrLdz4Hd6xS% zb1b)MW?HV%Ot)ODnPNFhGs$wIW`bphW~^nMX0&CgW~60~W|(ENW{72!W{_o|W`L!q zrk|yQrnjZJrl+Nzrn{x8rmLl_rn9AprlTc~roAPzrmf{~4QtC!8kUx?G|Vj@X_#8x z)G)TZs9|V%QbXVJpoXsHP7Q6#jT)MkD>T$C7ig$j&d^Y?oT#B>*{Pvm*{C6BS*amo zS)?ItnWZ6VnXDmh8Lc5|8KNO#>7yZJ>8c@MX{W(wX{NzzsjtCpsiDDXsi?tWDXGC` zDWt(-$*sX`$)dq%`CFaA@~!$miwEj|EiS45wm7Q(%VN9w4~tdm-!0~7qM z{gXwh`bUdQ_4gJr>hCQ4)!$k;slT=`Rexonss6%3M*X=3zxq=PX7wi)-_;&lyi$8; zaZl}m#U-`-7RS`?TI^E0W3f){w#6c~TNcyRZdi1yUAL%LyJk_WcGV(7?TST=+GUGC zwM!PRY8Nc5)XrPzshzV>Ry%7Up>_tmx1Uk%l*KpIlhAX0PFP%3J#KMI^|-};)ngW0 zRgYS%Qax%hU-gK^6xG8PU8;vI8dMKil&T)G$W}dQk)V3OB24vwg^%if3n$h67LdAs zFSPF81F!r4sO+-%1g`scTHFWM{W~nqsO+#ftg_u=mkOxv-)6BwWvj(}m8}+2Rkm34 zs%)`nQQ2%!t+LsoNM(~nCb;h3Xb}Of`!`s)gX{kF7G^5zEc8^?S*U{R{@m6li>R$6SaRcW!sGNr{9 zGn5utbSW*es8L#Ek*BoCB2j6fMX=IB3pb^O78XhiEwq&uTF5Cav=C5QV8N`kz~Yu3wqR43ZSg~Xw#8HV*%lY&XIt!(pKY;9ezwJQ`PmjN z@^dT-<>y$$$B|pbPLw=5hnEV_I7Wp|ApXBCPJd~Sbab9kY#Xh+?7Hj3^ zSj>@|Ytbz?*P=>pu0^KYT#E>~xfbqnb1lr|=31!9&9xAfn`^-;H`n5;>|BedvU4r2 z$BSbj(u*y=OD(o|B(=oitke>V?NUoD z7D+9!=#^SxQ6aU&B1LMcg}>BN3u~#R7V1(YVk&LnZ*ssWfn&zmsxC* zTxKy}a+yVskR5lFKbZB$rz_Nv^Qamt0{XE4jjgTXKcPPl**4FCvpsthJDqSZl!} zvDV^`_&SSw;_EC9im$U+BEH_DU3|Sow)lDrfAI|##^M_+B*ZsZ{1Mw=@lb4|#WAss z7OTZJT1*t%Xi+Y<$s$&4lZCU`CJQaGO%{S;n=O8bZnk(Jy4m7{=oX6&qFXFxh;FfH z65V2vBf8ZhOmwS-qv%!(9nozT;-cFum_@f)ycgMSaZ6;o#W9iX7MnzNSj-dIVbLYB z!=g-Nr$v&;P78mLofbACyDYRsc3Fsv?6P1L*=6xuc(=t7;oTMsg!fp~3h%Lq6y9TD zCcM`|Sa`3+2cf+dXNC4ztP$F0(Id3qB1dSyg`d!V3j?787D7S?EWQdJu(%<3&|;6^ zL5ul<2Q8Wf4_TxO9NsBXlCoLB7 zowBIpJ7p2TcgjMO@3aLI-)W26yr(U;@}9AnzTvsjra$dDK$$8CU8s{~OWX@|A#+=tJSUIm-+~l}nv7Y0GMJvZm zi)fCU7DgPmEI2uCSsY})Wl_j}+d`fFw#8kx+ZL1A?pXM+-Lc?eyK8Zr^{zz=>pcrc z)_WHJS?*aJV7YJ6%yQqto8^IpD9ZzjJIoI)mM}lG$YXwFVb1)>f|+@?Wti3sOCPPN zmQGreEG@PAE%mi}EmgI;EM>IXErqmNEjhHBEdOiPTYlB7wS1#lW%)?6-14SospSRD zBFkf%1(tg?b1k=MW?Qb(%&=UjnPxddGsUuBGtsh5Gv2aRGuE<1Gs-esGr}@SGt4ql zGsH4LGtkmq)8Eog)7R2e)7w&4)6-H#)7?^9)5TI))5(%c)4`HS)6VjzhK=P%4J*qR z8WxrhG|Vh-XqZ@D&@i$*p6xwreO_ zHfYFOR%pmt7HG&=W@<=TCTd7nMrnvy25X2~dTR(S^#;s%vmr zDrj(8N@%cK3Tm)ga%r$wGHWnd{#0kQe69Z9;;#BXiwo+1EDovvw%Drv(_)4C4~yCA z-z<97zgje?f3_%A|74M-{=p(j{k?^+`dbSJ^*0vA>aQ%+)n8gjsXw>iRexr|sQ%RA ztJ-6W7iy0z?x;PqxS)35;)vQkiydlrE!L>rwpgfk%VMh9O^Z&o8y2-{*DQ+Eu3Dt2 zU9pH#yKLdFcFDq7?V^Q++64<;wR09qYG*CP)XrFN!_W0O2|m{cw736?>T!#cs>dz% zsUEY~ta{X9rRq_Od8$V&CaWH{=u|yyQKx#yqD1weMV9J8i+I%o7NM&9Exc9tTR5uj zvoKfPXQ8XQ*Fsr!kAyDcDf|4xe+DmyLisqC=0ssgI}w_6-i*=Dg* zWt+tYm8}-bRkm8pQ`rKp`+HP2TQsX|wy09sWKpQH(IQi2qeX(s28#%l4Ho_?>n+?> z)?3)AtOM8mx+-feR8`hm$f~Td5K&oU!K1R;f<nY6rNwsT z6&A~tS6EC}UT)E$yxgKfd6`9q@-mA^<)s#$%1bS*l$Tm)DKD{*R$gMkqrAl8uhL?R zcS?&b?kg>}xS+Ji;*ioJi!DlvES4!Pw3wl^(4tFep+$|-0*gGQ1r`ZP3oL?_7Ff6{ z&9|^nns1@4G~Ys2X}*Pk(tHbMrTG@$6z5sIRGepVM{%CTdBu4ahZW~pY*UYmuWk$09*-jzxΗP{ITkjGb1V!LXIrQ!&bE+HoNd9Q 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

        =t(NY!>?RtQPX}EEWRt%oYstOco#I7%d*k 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

        wYJT$%>8^9f}SXwThs+-_{~s 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�#_463@)$OFS`~ zEb-W^UE-lxwZsFnJc)Z|NfLL=!X$2+c}v_hvzNGGW-M{dOkLuNnT*6`GeL=qW^57{ z%)W`AGkYk0#_Y8CX|rwOC(Ra$pD^ncKW0`Te$*^k{IHq7_#rcE@dIY+;`_~n#rK;1 z7u#d@Mr@ba4Y8eON5!_AZ4%pNHcxDeS-03`vkI||W~pKu%!0($nK_89HPaPaZ6+GHJ%6rE?*AUfA9Uv#!vyyz@5KhYUx zcB0eG^hBqc$%#%e;}e~1_FrV8*?W-*W)DRA%`S-anjIABG20~4WwuzP(`>3phgrKw zn^~nut68>4vstW2lbOFrgPEg9y_vB{t(mGwjhVPel^K^vrP)v6a_6oS0trl=In| zRx03RmMq|C79`+c<|JTeW+Y&1rYK-zCMaNS#wcKE_K4rY>@dH%*%E#;vlf0+vowBV zGf#daGi`oDGd_L;vyXgwW>@)i&35wXn9b$WHf!Y5G)v{vF!SV7H`C)&GZW!cHT%h{ zY<7=V$?Pz%qS*>w1+zY0d9xB;IkPBUSu;mo88Z!DDKmavNwe=f5@z>##LbTLh?%YD z5jC5^BVyLXBW#w#BV-oJBWPyNBVeYc{!RRG0I+DIe!I)At--P0w?DF@Q3|ust{3%l6E)o9(G-B-;~H4YtRo-&r4-o?v}wI*avz zX+GzzHWM&`Ksw6=BuVP z%vVe!m@k_eGhZ?lV7_SjhUtRo38wR=%b3oYwljUV;8Xi*!J_ur;+N`2iw~;rEuN{q zwYa1D#^RFdD~l7VFD&+{g2wzo{eD>8e-C_~e>3zXEdD5g z`u)k!et!bE-w&$$*TU=m2#XFSP~9JDk*@@*`-3dPlt6XAzlEI=sP6Z%P*Vcc{hk(l zO70fSN}#&m#p1OhsP1>PxS|NE`|T|DDT3;LYm4QIpt|3}Vxl6b?l-llRs_}kMiyy` zpt@h*B2W=j_v=9GeoYH?MGXsCMNr+Z3a$H^@6G4QzcKHVe`Q`T|H3?9 z{;7F_{A2S#`G@9C^7qY+e6QR| z^YwDa%@@iYHJ>bZ$h=MNfO&=7KJ#q3-R7}!JIw>+wwpW4Z80~M+hndGx4~RmZml_= z+-h@1xs~Q$WtW-1kX>SaTXvE8dD;2qhh*oPZM26?`AfVU(NI+Kbt8^el!!2d~e1s`PS^G#2d3W60gkeOS~|XN(iyt*xCVtp#qWB@RTJZyB8RGlRLd5r) zIf(Bu(-GfgCLzAlj75CA*$1(0W_QK5n4J>aY_?r&quCO%4Q3O?)|u6btu@OLTWuC8 zw#v*+Y=xPz*m5&Pv887GVoS{aiY_vHBf8M+mgs!5lcMv?c8Ja~TP`}=Y?|myvo_Hg zW~HLj%u+QemboQf4M6Qfek3Qf$T~ zQe^f@xWMd!aK70#;asyh!Z~Km!r5k7!kK1)!Wm|k!s%v8!l`Cl!YO8-g_6zg2ql>v z6-qGMAQW#lODN8)RVdc1Kq$s6N+`+&0++s%)A6F%q#`W%`^qf%p?U&%{T>&&A#v(nO)&G zG~2>&U^bOs&#a7J*DQix$IOaf+f0^U(~N;%!|XAiy4i6)HM7-xDrOV-l+8-`l*}Ue z6wK`SzBgs#d}sQCdXGnREqt9=`*(brd!zVnKrTAH4S9D zW2(S*+w=qLEz<+6H%%w8-Y`vLy>4pDdd*ar^{VL$mMf-vST39Pvs^MwWw~f-!*an? zl;ynXJLYqy$C=NX&SySjTFHFcG?e+2sR8pzQ(op1rZ1U}n;vI6X1bK=sA&rmwz~hd z#U<63@VbAC>Jy7qs>pT!9gAkwTj2BjL3Mu`Qor9*6*S)u8uJJB`$2X8aSKV+qwq6* ziK+V`=lZR&n4^NN?q6V$r7{oiI)Bi7KXTpAtpe%y|5OI``yqAzS>;*_P``hJa+L+5 z?k_}h{s`~>hyp;ScY?XX143$82zn6uS5~S{DQgXHUt_Z68oh%+G zg6e*Ii<63=y5GiPlOm|@x3rj}2&((dEZP)7b-%Gip`xKhnxcV4jG~@JprWpYyP~#* zjiQ!?ks_$>SGSN=RI?CPRI%VxRJQo90IK^HEZ!){TRc(#)%`LS=M3UMbsao-5mJo+R689wysv?j_q|ZYSGhZYzqziAueq{}x4EQ@r@4TPhdG;!oB1zk7xNd= zPUhF79n6nN+naBawl!ZMZEfBsZE0RBZEl_|ZDt-NZDQ^zZDejCZD6h;t#2+at!vIE zt!@5IO4IzQl!p0LDK+yWQYz+Kq?F8;NGX_4m6A7am6A0tlae-1my$G(kPA#o)=W(DwHc@6OS3-`FU;OcJTrSF z@x<(!#ACCQ5)aMxNZdEuAaT!ZiNqbV84|b5dL(X|HAq}HE0MTrmLYM)EJoszS%Abv zGgpc8W|k6X&GaPBm?=q|G830LVa6?S+>AlusM#y=!)8~+51H*3KVY^>e81T=@x5k^ z;(N?;#dn!Si0?FW72j@VD89{1R(y*Yr}$>GZ((Jlvz212&8Ca3 zG;0xCVOA)%%q(7PshN-1VlykTMP}+^3(Q2t=9@8#%{BWdI>+pR=q$7IqBG6*iB30L zD>}_=j_4G#ZqdnR)uI#4vP37CMTz#Ad5QL#S&DX>X^M84Nr`rvaf!B@{Ss+2do9vp zc1NVy?5s$W**=j5v-KkNW(!1W%_fP|m^F)3nU#uEnx%`Bn?;J0nfZv6nAwRGn;D7} znkkDEn2CwxnQ@5Zntd0}HoGI7Wp+q7!)%3cx>=uas#%F}idnR9vYE4RqM5dEf|;;z zyxAY2ShJ@>F=pq4qRqAoMVT!WiZJUD3O6eg3NuR-3N`Z;3O2J43Nlj`3N+&v3NZUE z=x_E+(AVseppV%;L2t8_f}Unm1wG6f1>MbZ1l`Oc1YOKr1f9(c1f9%e1Rcyc1ntef z3fP%F60kKpFJNu9SHQ|_wScABOaXJV4goW>G67SwQ~?vS5CJ1IX8}VqBLM?5MFBlC zK>=MeMgbkOC;ZxGNBOnPmho$twezc+W$>$+dGV{5>F_I?@$)O0edbd%yT&JPwu?{B zY#yJiSu>xsSq7h!nJ=HDnGv6anK+-g*&kj}v&Xz5W+!=t%{K4~nN8yrG^^niFiYa) zH}mA>Gc(}jH52FMG5gQMW%ith)9gGChuIDucC&>%Y-U|NtY*bLEM~Dh%x3O9jAn*B z3}!Ms|4rF>{+T}E{%g9M`;X~l?%$@_+&@iSxqq0-bALDe&GpUn2G>{9tz2JBCvkl? z&ExuH>cjQXREz7qDF@d((`TG-O^o3091l&?IUbmLaNIZ51wuXrd4cLO+DDIm`bo+Hhsx@$#fU%MbmE93#M_b=S@vm&zW+wo;7{Ma>jH! z%W2atmQ$wjEGJFPSWcMovm7^l!F?ti6>T=!R7VAlOb7FoBR}OxkGD9k1giUEEY>PTTP#qDw3wm7NENSo1(MDYegrE`-%=0R}?{YzpceyMNr*uWwBh*!eWl1 zxy3|9Q;Rl56N_p^BMV5~uWu0zuKRVMb-$*Ck)no$x+19VSB2L7N*4bW6fM3g$XmQo zkh6HCAZu|$LE7THf|SKk1xbtD3gQ-<6vQl6Du`OlR}i+CrXXYis{30M_${gw_@H$^ zw?(`H7r5^CQ((7nRbaD#)cwpBS_(`SN(zh?k_!LL1r`39b13{WXHfWV{$Bp8`F;6M z=I7);nD3K+YranYwfQ{x7v}x)&&=!PADb7*KQvF2zi%ESf7jee{+7A1{0(ze`D^B4 z@|Vro_YPwvh&Sv%g!}FFFVWp zupC>!fe3ERxd7Esnd6jIpd7f;Cd6I0Kd6;aAxwmYSxxH+?xv^}m zxrS`Dxr}Uuxu9&BIh$;W`7fD5^Y=3O=1*jD&2PwLo1c}*G(RMhZoXY6)qIUilKDcJ z1oLS!apv7JG3JdjQRZbb5#~8EVdjZ4A?D#SLFT?P0p`v!e&&`kKIZx|UgoMY9_G?A zZsvkAF6Qhq&gOrl9nD`!+nZmPwlzO0ZEe0;+R}WHw1xQuX*2VBX%q8YX(RI(X#;a_ zX?=4mXD^!X-#tuX$|x5QflVUrBuwXODUNjlTt9>CM9paOiI>#nv}G8yOgAP zxs$wpQ|w*#gO5W|Jg;n6*fLGb@+;VwNfS$t*_lgPEV?doxGLw`RtYug%mXUz$lu zJ~!i$d}{Vz;)&TOiAQEnB_5dFkho`dM&hp7eu>*=nkbg zW>>^knjI8dVYW_enb~ZyrDmOCi_OZ#7MZ1pEielbn{VbIHrGr~Y>t_<*eo+nv6*Jy zMW>rR6P;#uMRbbUVbRHEn?xs?EfSqzHc_%wM#_%wDwJOkcFs zOkT9bOhB~Bj6t-~?4wA%*+Y>!vr8hiW`{+p&9;bCnJp8kFqX~rj#ZpJ8*X7)lj#q6ALve{IL-8@&xqE zVg+=}d<3-3tOc~pv;{QGqy*H>I0e+qKJ%-ZUEx?xn5*-1VLv$cF;W)t~D&C2*h%wqV2%^dlJ%+&Y<%y{_t%|7z-nO*1Q zHQUF_W44r++pLF|%dD7}!z_}Q-OPcP%}kw_)r_B)#q2u|v)O$fCbQ!_jAk2n7|dq! z{4;Il`D>cP^T#xd=eMZ?&o5JLo}Z?oJU>hsc)pq5;Qng5p8Jbw8~10^c46(pP0_#d~90D z`N%Yq^P#CF=L1s-&ikf6IqsR>;<#(No8yk@JdWF@4IDR3lQ?dex^P@KRpq#5%Fc1s z^fLPu)4A-IO*7apnVPa+G-YMKV0wk^yy+sgbEbuCXH6a0&X@|aoi=^QddhS&>q*lV z))S`TtjA4tSdW=9vmQ0Q#d5@SBg(;3Wr zOpBOzoBA>DGSy<i%h}=ym@!i!{|M7BSFu{;+<(nJT2;udE8|_k-&GgBJf(_FH@<>P%nE zem`d2Kg%LWWd{6QKhW7eq}2WUltFcWCAi-|S-H%jRk_5XT)D_16I}P_S@-0cKh1(u8C3TtTf9>O)%^(;SCl|?f2_qWB~aZTWdW)C!!6pCLM^J5Ky`nR zMUoPz?)SIwR07rgJ{E>bpt|1^sqS~NfYkkt(7NBw;-n&|?zgtsq-Y7P`^}(rzp(|R z?l-VVQv}uhx)yqRMx_bWi_ep!o03Np~T zU(({Jf&{eg7qwWaAOfxX1uc3N1T0z<_$;awcrA()cq}p%xGWMBI4!~zI4t}W*eqNX zSS@T6SS(Bwm@Kpv7%h|(7%Zd|{+bIa{5I!Q_+ieV@Xh>#{Acs~@*m94%fB<`B&Nb<}YODnBS3|Wqw|EhWTOHspi{cC!4R5 zooGH!w%>e`Y>#=HY?pbJY=?QCY@2zqY_oZ|Y@@liY`wXIY^}M8Y?ZmDY=yb3Y?--` zY_U1JY@zvYnSApPGCAf?WwOj~$z+(Hmq{}}B9mgiQzprLolJuHVwqU;88Xr4y)u#J z%`)NU6*8gbxiZ1#$ufcFkuv_~elou1E;8QcRx+OE1~TsEYBH|oGBVEQ!ZMELoHF+2 z|E2BB-$>h--;%a6KQ3)yzE#@He6h5N`6Ov$^9E@{^L%N2^Ehc;b6;s~a~o+bb8Tr2 zb7^Tcb1rEW^Pf^m<}alb&2LJ{o1c)9HQym6ZN5TE(tL)LxOs<^sClK7hmvdi}`0sCiAC~4CXf^|CybV{A0F9@|W3q$scA5 zCBKvNSrmxl{jsd zC~?XxRN{o0m&7qMJBg!a#uA6kG$an1$w(Y96O`Cz#wM}H?3?&*vj^fk%}$B$Fxw)& z&1}B-7PBt#&1R+I8_g2MH<Mke5Kicu@z=-#Fm-e5L;??RBW-? zX0b(P3&a+f^@`0ms}`GUmMJ#JEL?1snXA}LGh?yoW{P4{&G^NpnEex-WcEgMqS-Cc zezTLJeP%mEd(4)LcAHHT?KEo>?Jz49Z8J+1Z8ZxOZ8mciZ89?zZ7@?6tv3@DtuSMh~$|SiR7B4h-90EiDa31 zh-8>qiKLt9ilmw;h@_YaizJz`i6okR5{@^!DI90EUpU5Wsc^Jew{WCck#K}rq;R;I zgK(&shH!`(zi_bG51~M_2SNd6Cx!gYHVgTh%@y)7YZvl1D-`lFix%=Qa}#nmGZJz$ zlNE9?;}mi>`zq*U_E6B#?5v=@*)Bmlvt@#|W|IYN%<2WL%yI-R%_0OX%v=S{%nSuh z&Ey14%(w)N%)Sd4nmrLPFuN$AXSPp3*KCb|j@c{$Ewc^*O|voq4YO1MHM0-_RWla> z6*FT2Wiw>~MKd7*1v4fAd9x?{vSvs4Wz3fGOPh7@OPXczOPKlai<{~3i<$}Yiw!AFr7|AGet)AD5XFAEy}uABWj9UUsvyysT!Md0EV6 z@iLn=@-mra@-mtQ@G_X0^ZqxLpZ_q_w)QTUBUCibRy4p(`ue? zrl~w%P5pU3n_BUFGF9REXv)v?!SpNld(+e0Z%r3*zcH=ier+1e{mN8_`=u!x_Y2cU zT+dDSay>Jh&Gp2zitDjy1lJ=|Gp>iG!dwqbKXcwQz07&nbQ9+t(@C7SO$#}1nFey+ zG&SVBVJgUZ-SiX3HPg!+S53EaTrr)_aoMzreOtGF{Dj(6p9yzi9yL zep40JeWt%z_L^Q|*<-qjWw&V~%TCiUmK~ev-rt_KBnAS19vv{id2443cSAA}=R~1(GKeWJB_ZO(b z>i$a>!KxQ6h^zbeTD(!&ZSffIT|R3p=0eB(dsHCv{kZG?X%i#&3<4T~qKiXog z5~%Kvu$ZC*tNVj3@{~Yze}F}plD~zglCOoW5~%L?vQSk5)&1@kyh^SXOiG}--^t>Y zBB<`Sx45EcXK_N&#$vCc6}0X*x0s^{s{2hW+7v-`zoA8;BB<`yvxrs%)&1Jgx?jV> zND)-`t3vC3B@0ePMT`Fm@)lne;olg|fmwb18*C z=7I`8%{djmnKLSUG5;w4(fon@d-DtOZ_M}0zcgPj|J;1O{1fwj`A6pU^7qXPGZu2Q}JI&kWwwqVVZ86W5+hiUmx4}F>Zmqeq+-h?(xfSM`a?8wR9#epq(0`8L^!=Bs4;%;(AWm`{@JGH;XZFt3trHP4rA zHcysqG!K`pGxw3LF?W!yGB=g2FxQkVHJ6huHW!vHFlU#|Gyfx#WBySl)BKrCy7_IH zRPzfm$>v9863utX#G9{|i8Ws$6Ky_ACc?a5Cd|A=Cd9l-CdfQrCcr#Z#?L%T#>YHB z#>?DI#>3o3#?9PF#>HGi#>rex#=%@f#?G8e#>Sjc#>)J?w1xQ{X>;>a(x&FyrH##( zN*kI_mex0KlGZgZl-4m%kk&Hym)0=1lU6g=l~ysAkybY6kybSSEhTUMT1wXZwv@E_ zDJer1hjD@d`J3rR7V zGfOd;f0g`a_Du4R*$v5GW~U^7nC+GPX0~4Pi`gQ{Pi9jjKbW;kzB8+md}Ed)`PwXA z@}*gj61&YrBzBo`O6)NEBfib-nfO+-3*wv2c8PB?TOz)}tY3VcS(W%&vsCfbW`W|X z%xuM1m}!YGGZPbEYQ`+S*zAMYBD1?<3(QW5%{SXFHrH&4*c`J-VzbQZ#b%i0icL3* z7Mp73DK^E-LTr+mn%G1$QL%nAX0blAPoh0$4@A4o&Wm=M?GtS`TO-VeN+pJY2)2v)1!z@!I%`93Z)y!8U*~~#C$;?P3!Aw;o&P-e+){I*u z+U$>Tl-Xn92(y#I;bt3zL(QfMhnUq02b-k`2by^c2bdWP`EzbJYP+p@q95o&-2-I2hS(dg*+ckyLjH4mhikYjpKQ1>cR8I)R^bBsT|Ks zQ%;^2rZ2dko9^d+W;%`gsc9bf6H|BYN2Utg4^4k@Jutn>b>DOo*FDodt~;i=T(?bq zxNezhbKNxM<*4c5+@Z&E&jn>dAT0RFm_9DHrE?)7Kp5OwVwf zHC@MX#&iP5Y10ypQ>Nh@Crzz6j+@GH95ZF)IBI&F{fKD~`(e{C_Cuyh><3LhupKZx z$hO~fBHKRGM7F)AhHQIG8QFH5USi#4x`cIyX*uh5Q%}}yrn0PCO+T}2F+I()*>o|> zCevz`jix~?8%#A=)|)c0tTVmIyw-Fp^BU6$%&SeanOB**F|RaLW?o^+z`We_KGQPO zeN0PD=P)fXtzmj&aZB|TxZe+}`!|F8{h+%4zQr`vyB58wh%tZEy8nWOr|LNid)2cR z$o+mP@O(dVzaLij@3gq3vK_}ge&p2slPru>CRl*R{FRZ``6JKwgU0;P>;8qxpt`@* zqE)#V-tR}P`!g&cb$_Y_r!uJSPqKKY1giVvEv_hm>i!suT}q(3Khk1>QiR21r7#Of zzaLch2U;X4f$DxgXx;B^VWi$SNvZ z2rGi>eg$aVFKh8eLB`^df|SJ#1xbtZ3KAAa6~rv|D2PJqej$tb3WCtOpUuyD2bR*eWntm?$t>=qUU*S629AE~W6xTu9-&Ij6!G zb4Gn?IC)YkpDwmH7er=jI#apPDa_e`G#E{(*Ue{9W?``P=4+@;A+c}!k-uoJDu3QwO#ZAnhx{q?pK>S6U&|dezaw|p{G8lD^8<4G%s0yIF<&gV(|oGj zcJp?*E#{SSo6K|MHkilBtu+snTW#(vx5C^^Zkf5J+!AvcxrOHZa`VlZ=E<^k<`J?r z=038O=8m%E=BBcx=325v=5n$H=EAah<{Yxw=6_`}%|FScn?ILHF~1{|WPVX5!Tgv^ zocV5<81s!XQRd5JBFtyYgqcs22{vz&2{f;k@i#A&@ikAE@ivc<@iY&TaX0snaW%J< zaW*%WaWvPIu{W2Ou{9Tyu{P(Cu{39rF*pAtZEAjB+SvSzw2}EPX#?{W(t768q;q*cxBrIpR~r4`NPq~*YsG!czauSf&1&eUtoc z_CoTf*)7TMW~U{;n(dSPY_>u2quC|`P?i)@~K&{&78!SnCXfy zGLsTtV8$*!-|Vy4T(bvabIi_(%`)39Hq&gS*mSdLVpGjp#HN@PiA^#~5SwV`C)RIf zBi3i8E!JZuDb{7iA=YX3U9{conP{8YRnZo+Bcjb_n?xJU7K%2QO%Sa!YY?q5%NMOS zix;gl3lOa^a}X^vGY~B`QxGjN6BI2nV-zhk`y`TY_E;p(?6OFX*%6T}vuz@oX3Is= z&1Q^J?zzSs01`ySJF_T8p_?7K{**ms&fXWL=Aoo%~m zC)+mDNVct}nrvH4f3a>hJ;S=mbS~=#(*oA@rY@}OOvPE(n!aIKV|tinwdov|Ri>pZ zD@}b_R+y@=EI0kbyv+0}^HS4|%u7srm=~L7FfTH7W?pD2&%D6&FVlR}J52LT_b|;h zoy9cAw2JAK#Rb(D7ROYdf&2ZSx__lAqVDfey=~E~defp(^@atuy5B+djD?x%DGOcI zlNO*ce^A{osEV)d-)eC}WwQn99lqG>{$ds6`F_}#Kdj#mtNZ&blvR2xq*YM&_<`2? zy;5$pz+d+lg2((pb-%ANtltl+`_nAMl|glXvc(^zB#ZY-2^J5PKy`nt#c?H2-5+JK zRtZ%1hePZB5Q{3MAd5UDP~Gou5vl~L`+Y2Il|XgBr-iB#tnPQQU{V6r{f-u|6hU>r zoyBEE8))5cX|YKWRQH=%%uxi@{l*q;ilDmRz@ku5&mv7x*CJX`8(Q~kK0Xx*=5 zA*`rq!Ko;3@n1pC;;RCv?w5wv{Sp@E6~v)+zlg;q1!0So3PKhO6a*}$DeznLD)3sg zDDXh*eol)_1rBK4&uZbXz+&O1z+_>oz-VErz+j=H@Yh^f;kUW8!VhyHg|FsZ3ZKmx z6+W1MmVayhNdC3?Mfn%z2j!ocZwc5 zJLEQ*SIKQK&yibe9w)cjJWy_>xr^K~b2GUm=9+Q~&1K}~oAb-fF=vvSW&TZehWSg` zspfZNC!1f8onU@gw$FUKY>)YB*-rC$vhC)RWLwSKWSh*ZWgE=%W$Vn7Wvk62WGl^m zWXsJRWlPM>WQ)wTWDCsYWpm9%WV6jVWi!qH%A}cpmPs*xA(Lc&S0>*4l1!}mahYiI zJu;Ezn`FYxm&=5j&yfi>pCl7#-Y(;BUMu5cUM%Bfo+0C59w*~w9wOsn?kVGBZZG3t zZYpDEt}SC@t|((=E-qtX&MRYP&LU%C{#Dw@{E@VQ`FUwQ^S#nK=BuQ&&1Xn!nzu=- zo0m$fnkP#un+HiNnmbC%n;S^WnJY-knDa|Zng5rPFn=c{W`0jf#QdC;u=zeILGyJ| z{O0qec+LBzxXtUOIL-5=*v%89Sj_{Zn9Uuf7|o5O{+lUF{WTMj`fbK0_0#N!*n1#Fv;AiZ3#Y7GG%QE zX{ImMZYC?%X2v7dV)k3K+3dAwquDLd2D6i*b!Iz6Ys{95R+~)|tu$*BtuQMUEi+3M zEj0@jEjDu%Eiy9|Eih9P%{LPh%{5~e%`y8fl4bTnB-8AsNV?f6ku z&87-!nl%Y(m=y@Bo5c#Mnt2PVm{|%co2dyZnu!Q1m@x^;o4ps1HM=VyV|GeF%4~;# zq}eh73A4!pVrGp3qGkmGB4%*{LT0`Kf@U@X0%qC*d}h)Dyk^`2+-BeSxy-KfbDHho zXE&S4&t_J|&uSLK&unJP&t#^+&uGTN|KIcl-#^nce1A9Yf}^6SEjPO zFHPBaUzon*d1iW@=c(y_o+qX&c^;ci;(26R!}Gv2jpx2;0M9*BE1tWisyw$%1$l0n z{^Y)CdXf8v=?d=arVZTJOe46jm>P0lHs#{JWcq~bqUnCF^QN=7&Y6~Toiz>RI%8_g zb;?wj>!j%y&J(6rIFFld;XGzKh4ZLsDd!Q>aL&V~mYj!7r8p0o{^mGfdWU15={}CV zrVBXsm^O3lHcjK$W$MMT)6{@thp7n1cGFMn+e~+{Z#8XV-(u>?zR6UOeWU4pwhg9h z+18uZv#m1?WLs;h#J0xtGwW*8qpYh;r?aj!&0<|{YR9_FRETw{>2sDPrh8Zxn@(j} zWSY;i(A1q}fvG&peADmD^Gq)?&oy1cJjb+?dA4aP^DI*b=9#84%ri`XF-IPgp3c9SrjR7SY#@&TO=y5SwtwXSokY2 zgX?}f1qKUKg@5Kc3V+O16n>gZD||B-R`_hrrSQ?5N#ULOXZbhgkL6#QUy^@jen|d_ z`6l^?=8NR-nNO6zW8Nfx)4WLjx_OfP74u;EOXe=}7tBrM&zh^rpEehlKVi-xf6V-s z+!6EFatF=t%I!BlC%4D^fZQ(gO>*1Km&k23pC-4-yhCn-d6nEc^BlR==J9eX%>(6@ znY+j>F*lc6Xs#(Y-&{s+jyb>FEOREg8Rp+)r<%W%oos$bc7pi@**^2bvfbv}WjoDR z%eI@(mu)ehEZbz>F56&UEn91zFI#P%EL&+FAzNNHyE3unmt~^NPsl`=@0AHN-z*bizCtF*e4b2z`D7VC z^G+Eb^Ew$X^AZ_%^DG%x^8^`Z^H3Q_b8i`Yb4M9lb8{JMb6purb7dKGb4eLfbAB0P zb5as=1-+{%`Z!9n;($YG+!&NZa!OD&Ad}u#k^cv$vjP3!8}A-&fHmA#@t9+ z%3M)e!dyUF+?+vL)ck{#u=xWiLGuez{N@Lwc+EFRahorY;xwNq#ctjx#cEz8#cZA= z#b_QZ#bE9%_0P;i>bIGy)K4=psqbd&QeVw}N`5wbE&0*xj^ul@bCPe(4oJQ>+a&qY zY>DJ^v+0sg%{nC?o7G4@G|QK~ZwwZ_IO*0$G>t_0rSIv|pFPn)X5|vQ z&9WtSn#D_OHw%&2X67NW#mq)xlbNB!1~WB@^=8r%Ys~~CR-3U(tTOv5zQXK*_%gH8 z;!Dl8i7z%=D8A6FM|^=>`~ znjI4BH`^fAXEs-?$E;hd+pJQo(=0=*!z@g!&CErt#mrc&*-S~S(M&+B!R)_io!NWQ z8nb(%)n;c!E6w(bR+z03Ei;=VT58rUT5MJ=T4nrG%Enrmhynr)^fnq?*} znqkHxnr`-2B-QMlNQ&7#ktDMVB8g@PMdHmiiNu;M7Kt&NDiUSZCK72@ArfwuB@$*9 zBNAffClX}lC=zI9EaGpbCgN)*DdJZ@S9Z%@R?-@ z@R)@OaGSXbaG9A1aF{6zu$u`Bu$eInu$VpPXEr;*&t$fepTVq~|G#Mt|6fx-{y(M$ z{J%|w_N_o3-uo(HDScL6gOpkD1FrCYN-n5ka zoT)GOSyMIc)20mEr%Z2hoiyFTb;5K4*D=!^uA`=&Tt`ebxDK1LaUC*!&Uw)E1m}L! zm7M!byEylnW^?W__2t}cYQVY6RFHG0>1U1|rdK$&n{MaWYC4l+i)jtVX43?YO{Oj! z8%;GiHkk5rtT%nZzRq+L`&!d#_BEz1?5j@z=-N(AfbRz3Q(`459rWUO8OnF)7nm%HgW4fJXwrL;BEYl2@nWl~`Gfbsfrkj3d zo@RQMd8+9O<|(GF%#%$MnJ1arGEXp-VD2~l&eUgmjj7jk8&i+z6sB&|5~gPspt^q( zxbA;oF<xejH%AA8-OYvHS$4V~|Y_4`3}f0D%?B~aZTZ}CtGRQJbN99II> z{gD=Hl|XfW7_{yWwy07Hw8&Ee)%|`Jp-P~--`m1g2~_ucSg0z&>V9Wv-S1%WN)c4| z+ge;!w6-{*2&(%nEFg8iDY)*RplD>#rf2}I`*khS6hU>rmPMcoUsP31B*8LI|Hx$Gz&MSyo990m3*8PGOD-{Hwbw95~uL6%n zivpKLwE`!!?q{<|RA7bH{Y(~a3XB$Z3jfVb75b@O8RtLDk_m&`-tFPOW? zpEEa=KW(lif6`oB{+Kz3{1NkCatF;{%k4M6E4SDDyxcDH19CgeH_2@^Um~~Je45+_ z^A5Rn=GAhm&2!~en#ap6GY^tmV(uch(A->ZzPXm%Tyq(@S>^(AGt8Ogrka0~ooxP6 zc7pjG**^0NvfbuKWIN5b%eI@ZmTfVgFWY23S+>EvUAES|TDICeU$)XbS+>kPLbk-* zSGLI9Q8wS)Og7hCTQ0pXPG$jmohQt_hh2XFUv%jpOgtT z-zO7nzC|X`e5H)P`Ft5)^C>dk=3O$L<_$9L=A|;O=Gih%=7};6=HW7S=DspE=FT!! z=9V%R=K3;b=BhF#=F&1o=7KT?=IkYrJt)E_f9sb6O1Qa{YprM{U-NPRKml=@`$OY(!+ z8_9QO_axt#U66cfc1ZHM*%ryCX3HcWo6V4XXx1fp->g>hu33TPZL?&_n`U8>*Uda7 zubSCNUN$q3ylAE@dEQK1@|+o$URvl55R4oVy}+bXf& zY=y)=vpEub%qB?eGHaFCVOA-z-7HsPt68GNX0tGfjb>gF8_et_)|r_|tTEG&SY;+F zvC>RPV!0WI#8R_g;!Dh)iZ3#|AimISm-u|MW#V(qCW_B7s}Y}NmM%WSELeP+nVtAl zGcEDSW}@Pg%oxQdn7tM2GrJ|$Yj#Ym+ibH~r`bZW4zqr-HnUo>RU@@~3U^degU^J5vU@+qm_-Fcq|F7u{ z{y(NW`G1+t=KpD0!~erHp8uPvBmY-Z75>krZ2X^0U-Er4J;V3jbR*w8(`kHfO>6kx zm?rYQGIis7X{y8b!c>Uwx#>^dXQmH$pO~KDeQdg(_mSyz-iM|Qybnw>c<-AA@ZK}E zFq=`5ZrrY$^|P4jpznnv(kFm>iRZ>q<0 z&Qy};j42DxY10SXr%ZQnpERAweZn-8`(rn>KK6Gfm{&V(QGf*;I{llPM?XM$^|E z8%)n~tT$cHvCecd$6C`ejy0xH9IH(2I98e}bF47s86IP(@fb}r<&en znPR$$WwL1p%OukzmWie|EE7ycS^7=iGxwREWbQRx!rWupz}#&b%iL*d#oS>k#@ufD zg{jT-5>u<`CZ-nCiA>F=g-lN@Q0x9X7NEMn2|VV1-6CHVQuoKIUbF~SJ#XQqdd>p9 z?w3}D)%^!7{;TY>_@;td_g_-kYH?C!vjuY9zYJRUPgPlN(WA1|0=@1}R-v@+ud&#t zTxGFAxzYk(-EXg)XMu zQiw&nQV_K6_qRw=0@eLK7M@C=y5G~nP|3qWRmsglQpv@FR|!=2J6e2G1l9d^7WWll zb-$&>UPVydZ)UMf5mfgZTTDwX0bVMTchPDNRZ{|Yh|UlpV*-Y7^~JW>GF{bJC%U)W-gf{?`~1yJ43Z?Qmu&tkd) zk43KnH?;2OuqaYsx5!dpwMbN8v4~J$w(wVAv~X8ou&`73Yi_FW+gw-Shq;QvS92MK z&*s7kAI!NG-kLKhyfXhP|HAx<{8RHQ@{i4r$UiXOEPvO0vHWfG$?`YMo8_;Xm&ji> zPm#Z19x8v%+*SUxxtaV)b9MRS<`VKp%sJ%`ng5d8Z~jJZulZfMUFPTIc9I>TJv_JK67vYzLUUi)d~-+HTyrzoEOTwy408q9RC7_;WOFXrMDzbLapqrSV$5I4M4I1| z2{*qY6KZ}^CfIzxOrZG|89(z?GCt<>WxUL%%6OP}%ea|0%D9-9%Q%_m$T*lM$=I4l z$XJ{E$yl1Z$e5d3$(WiO$QYZe$rzf;%IKR5%jlYO%4nPam)10YBduSj-LhQP6-r(= zOOd>47AASw%uDj3nXTk`GXu%9W-5|r%)}*6nQ=>=F#9iY%c0@GKY>Q~F*%Hxg zvnirkW-X!_W+kF&W+|enW+9@38W^AG{X5U4k%wC8@nB5Wy zH#;p7YPLrt#B7~NklB2Z0JDiA{$|Z0zGfvNK4xhmUS^RZ9%kMm?q;?ku4V=z&Spv? zPG+Ja4rUx8_GUkXZO!fr+n5~{wlZ5IY-u({*xamI*vu?h*woBh*x1ZO*vL#)*uacU zSl{fuke=BMAsw@WLfU4lgtW{i3u&0u3aOi=38|U|2&tG^2`QPW3MrcL3n`fW7L+r4 zCMaumNl?aYzo3-aYC%b}8G_TJb$HRp5JQ%EtG=^eyi_(<{7pP51ELFa5O*G%bDK|Ci-ZFr8Gs`DH(72-K+`iJ|7=@st7rfawlnznEsFpcBhZ)(B4&s30mkLhc! z-KIymc9|~V+F@GFwcRwFYn!PF*H%*@uFa+&IX9VJ;M{1sk#mFTWX|=brJU0^!+rpGvzo37+oX4=EC)U<$OiD@v$Vp9u_MW(VG3r(3g7MNaQ zpKm&!eV%DH`y5kq_SvRP?6XYIu+21`#x}z=jcuB#8QWA-PPQqgcUdQ!Ze*Qg+QK@~ zG=g=4sWxk$DFbV->2;PK)3q$!rY$U8rZFs?rsgairh+W(rmvaXOph|Rnl4~&F|A>4 zGL2+zG&N^#FcoI5H~q*|XL_Eg)^t5njcFfKwP`-nLyHxvkbeJERZ!i3%c4p3hDD_+ zwz~hUg@fv83sApbPZiSd2i5&T;C?@>?%!kaR%MsP6P2A7w^g=Vpx6EDRn}Ty*8Phu zYE%|l6syd)0QLJpb$_%9;eNje(wIMLzrV&}Ke+C%uvnyAW-(d0#G+NX$f8^sHs%lM z_uGT({&Wi!!fRTO3yc)%_6`Yn8$+7Al1z)%^h$c}k$V-`65c z2~_ucS=cIp>V9{my5GryNeNW<+grR+1l9dE7MB&REKVqb>V9*Jjf$YU-^60Jq7k(2 z*SDxv1l9dI7HNv0x?j^GP*ELP_p3nbenkseMNr)@2d(?1p>@B6#UllAiyI1}7Uva2 zERHG&S?o~|wAiE|V6jqx&ticBFSzdSQ{b{_QQ)+wQDCo9D?bF;9?NWF9Ox z-`rJhuDONWEORZn8RoKbQ_ThBCYv+MO)&o^+h_h#w%h!!Y^V7J**5bdvMuJ@Wt+@b z%hsFEm#sCQEL&~fE?Z$>aSUw)NiwLsh?&U zQs2!Yq`sPYN_{r7milO>BlX@)R_d)8pVVu!|B^4wK1e<@dnEb9?6Tw|v!jv^%(hA1 zGg~Qn$85IbEwf(98)glX*UX9}ub8DuUNVc2ykO=ndCtsE@{F0G%$rEN0lE=(= zB#)T=mpEkhS>k}%bBTRsw;KTW@{w2nJtjmVm3u$lUawv2D4g; zb!LSUYt7OmR+~jhtTgkNSZ?MbvCPauVu_iq#3C~#i3Mij67$V?B<7kiO3XHUCqB#U zruYoABjVG{){9Ryn=L-stWA8PS)up@vsm#yGY|0|GZXP{GX?QZGhXp_v!7yZW>3Xh z%r1&Gne7v6Fk2;7Z#F}$)~r>m#;i!J$}B;w!pvW++{{+2)J#XL*i2fi$c$U8!0eZ3 zzS&FBT(cXZ*=8q1v&?pgW|*xIO*5MznrhY|nrv1fnq-zKnqU?w8gJ$)8f#`H8e^s< z8f7Le8ezsQ8gBMSB-HG!NQl`zksz}RA^~OxMf}Y+i};!?5%DpbCgNq*A>v_HCE{+D zBjRcnC*o`tAmU`^B;sIZDq?4*A!2JLC1P#HD`I8FAYx(mT-e;~oUp0cR$&vfxxz+f zEy9LoIl}s8A;NlQHp04Qs>0f4e8O60--R^I9tx?Oof1+r+ajc5Hdjd5tX)XStUyS? zEJ{e;%tc7nOkYUGOj1b7j73P&?7g6b*=<2Fv*UuIW}5|t%@zm>ne_?^npFz&o23i# znS}`Qm^le@n;8glnaK%qnDGj-oBbAGHG3(*Vs=x2$?SvxquF)=2D4=X|4gR}{55S6 z_-$G&@XItw;HPPzz;{yzfp4bz0$)t!1wNbd34AjB!~enb4*z@8z5H)Y=kdQWt>=Gj zn#BLo)P?_rsXG5NQ!f6ertkQkm|o<2WV(g#q3I012d1@r_e_)c?wWe=-7(eUyKO4M zcgyrQ?+w#Oyw^=n@?JCD$a~dvChrx~M&8S&S-clbgLyBQ+VGw?RpUKp%Flb&^asyr z(?>j~OwaI~G~LE?!gL|eG1G3Iqo!p%M@$oV4x4)O95glKIbf>Dv)`15XP@Z@?mea_ zxObZ_;NE3g$-UDwhGI-P5yX%W|YQ$MbCrdnKUO*y#M zm_FxRZF-DzmFY6h6{a1W%T2R5mznxWIcA3_(cA5sUc9^QMwwwN9X*IpT(qg)trP;KerO7mm zrP0)orNNYkrQY;8bDily=33J^%+;n9%vGkL%$26b%oV1B%;l!i%=exa$4_ zi%jJ_i)dwRb$_x2mvW-TA0<$~A5{0pSb*yO6H1X5yOcn6e;Bmx54LDm3bd$J0@eL~ z7D-B=y5HNvQwdb}dsrAMf$Dx&3rQts3qB=K-S1%WO%YW0+gjXLw1(FG78ZLIL3O{W z#WF=>3rO8>V9}}ws{3^<3KVrLQWdoE{@s)darsP0#?&`?ygkW-Ym5LT46 z;8c{c_^%*s@l8R};*A2R?iYjB{ld_?U%+CM0zb6w=dqZsz-`f|z-iH{zyYoMSuL^@ zSS%71m@Fa`7%c+8b^l*;JB457W(wcUbrrsvt15glmr;0cE~4<`7`EW@~6z*<&T?N$R9P= zls{xHDSyD6OMajEZ@Jy(Z{>EH-;>*BenD=F`9Zmj=9}f#n=h4HV?JGOm3gP!a`PIw zrRI5Zi_8<`7MKUi%{6zGn{93(H^W?8ZkoBA++=eBxrye?a((9CWP8kC$#$CGm2Ee_ zAlqVoM7GI%hitw1YS~)z`Lb2!lVvN++hxnlYh;Vf3uFt;Q)KhaBV}{UePy%Eon+I^ z&16%}wPlmd6=W04MP=j6xn!fw|I0+0e~}3@e#=W1c5tWu78qVIC!8Y91(KZ0;^&Xl^T`Z*DB3 zYpyAyZLT1rX)Y$CZq6g4YR)X9Z2nnV(fon5y!lyaS@Ye}(&j6qCC#Tvi<>t~i<%co z3!5iM3!3{$^PAgB^O|c*bDK*^bDDEXvzz~rVl#g(#bSP4ipl(#6odITsefk6r2d#q zm-=PaF7?B#Lh74Yrqma+D5+0o-cldTY^2_r=}Nselb3pFCLs0Pj8W>T*=NbeW=|v^ znq8B;Z+2Yrj@eGhTV|^yZ#c1L2T*#(L1W=ABpn(dI-Y_?Wnli5Ov z4Q5j%)|qultTC&TSY=i$vC=GEV!2t2#8R_BiN$7a5{t~NBo>(IOUyGii^O!ZPvX*O*UICnq)RxG{LM}G~TR6G}bIfG}crNX*qy}~+XrNUZfvBH{WuEH8-dctaEV#2Cs|AmyzUJ5ChT^3R_+bbk* zwp>WgY@(2iS(T8qS&ERPnV*n^nWd1pnX-_m8K01d*$+V>vnPUrX6FU@&2|g&nJpLO zHJc*HZPqBrWtJz%VHPdOZssY-YGy9TVx}s{Y$hzoXvQSSVD?eqpXq&pzozE|ew*$U z_+`3Q;HT*vf$ye00^dxl1-_VO3w$<>68L25De%G6QsBL*hQM1>34u4J>;kV%-}ApT zJ# zQzPCJrZT+8O<8%5n!e{bVtSM3u<2o*L#Ata4w%m1*>Bp+v(Ge-XRm1_&u&u}o?WK; zJUdOLc($9e@oY1F!oAgW5BC<+soa}P^SC#fx^r(ZRpef0`iE<+>2d7n|c(xn#3{1)SY9psW!(XQ$dc2rf=CNnC@inH|=2WGYx0& zHC1KrG5yTeZF+#M)3k@J!!&}e-Bg{e)$}K8i|HBGX48eNO{Qh6ji%nL4W80 zYE4hE)R-<}sWz=*sWJ^>sWjDQsW4?{DK~x0TxPnLxzuzzbFpbLbCGEPbD^m|bAc%z zbH3?oraaS=Ou42jm~u=znX*l@nC@CkRlRM|tqSY+!|MJ^7O|=qEFfe4XDu96LH&M6 z-LI;8)IwVIumz~!532haR6%3@uzo+R?%!f@Qe~6HL6wab$aVibm6aBtG5=ohm_MZ7 z532ifRM6}GsTR&ElP#=OCR!M)^jm1F^n%y<%cyi&!0LWhl@^QN%1st;lp8GWD%V+{ z*ZouA{eD>8pJU;xoMqvF((i}W{qYv>m0~R(DS_(#C<{>CzgsEXVx1DG?hmn;q6Dk^ z{Vnp8Ky|;5MVOMeg_n}2g{=~(?sv0LRdTVA0@wYH7EDT@y5G*?wIZbMzoKYqaY7MP z_nTR4QZ#|q{e~736hU>ro<+4HsP5OcNLAE?*8OT0Zi=9~U)jP)5mfgpSjZ{LLF;~L zi~kBz7T**kEZ!)HTRc(_wYZ@mVsTypRQC&7>`@S~*sQ>3u~LE8Vu1p;#dHNOXx-0l zQKP_SQLMmXk)^;4t@{})0u=t4yDR)Qw^R6GZl>_fTvy?H<-!k7Of5Uv4{8jU5@|Vop5i{!VVY`F*)9<`?8PnIDo{Z@yV>jrmf!Rp!&> zmYa9UEj6!^TV$Rmx4=A6ZmxN-+-!3McF3vBeM18J7jCk*T`0x&zG$*pDbHu-Y#2gUL#v*ULc!io+6uL9x0n; z?kk&a?j)OPZZ4Z-t}UBjt{@w0E-D*s&LtaZ{$D1{{EJM8`74<~^ZPRX=2vBW%}>dA znIDkxFyAKQX1-d+#eAWRllgQRd-GlyTk~caYx7DOOY?jgbMsUgQ}bvUWAh*x19J}< zJ##x59di>IEpu%d4Rb{qHFI$p6>~lrC36-T1@mvxa^{bvWy~*1OPTMJmM~u}EoMGb zTEx6vTFAUqTEIM6n$J8?n#bHhn#){In!{XHn$4U?n#KIL6qETYDF*YKQvb|OO8qh0 zA@$2_h13tT8B*WOI;FmtRZ4v_%aZzF7A^J8%tz{tnXS|-GkvKSW(rcz%mk&Lm@!K| zGW#NV-|U&>U9%gKx6MvU-Za}SdEIQS0#wIb@?7R3xvq$0+%+84SnQa&EF_^35W| z^32@Ca?DJ`vdomkGR*|V(#;seQq4YyrkLFqO)@(#nrOCPG~R5zXsp?M(HOIS(I~Te z(Fn5w(QvZ_(NMEM(GW8y(I7Kp(Lgg5QGYX0QC~AQQ6IDKB3@=ML_ExHinyDd5^*)# zBjRGVPQ=M|P4~4bOP6%t6trylXn<}hsRx7M(mMW}b<|nLVW+tp?CNHdD#vv?c_EAXI z?6#1!*-;@Wv-LufW;2Dv&6P%$S6D&E5*~nB5fQ zGCLy3X|_R--E58^n^~tIi&>cL~Ei)KK7ssiMGh zQ$c~JrVIj4Ods+;GCjoq&~y?1ebZ+Cd#0)UcT7F_Z<}iI-!kRnzhU~3@4D$#zN@A? z`L3AG<-2U!#CORwjqie~H{W?v1HN;nVti*!|MH$Teaw5x^fd2D(@nf5OlR>PH*MlQ zYMRY^#59EWu&FKYAyakUgQkMK`%VAw>@$7Fv)A+j&u-IQJiAPn^6WI7z_Y`&nrEA7 zI?qC8jI57Mr$kEiz5uT3~9+HQ!W{Yo6&h&bg*nIOmvd=A30ZnRBLTG3N}^5YFkQ z=A6?^r8%dX{^yu%`j}&q>2Z#UrfWDRm`>#AH!bJrGmYlxHFe- z%vq*B%$cS-%o(QK%;}~tn9@v-F{PR=WlAw^XG%8BU;@?sH!Ye}uUk~AqSyWBEWA|D zVATCG;JW{y1*htM3sBwvU1g8OJC$7)PgQnU+)>$Paam=H#VK&zzrkXM$~uenDr+p3 ztE{%bSNEr&^!u^Z{oNKaDxDT0D(&EP{nU z(H2*gKy`nF1*Gl|wOFVGs{4a1I+Ow|s+B->zpq7-5~%L?0@wX^O70d$N^TZv;JV+* zf=>xl_uE^1Qv}uhHWv34tt=pQzq!R;MOfW$WHDP2RQKy!v?_w?ejSSfMJ;IEuWk{b z2&(&4ENm2&EQ}NtEi@G6Eo8xUzl;T^qO=8rqND|+?iYjB{lXUK6@)B~DhOEYQQ)`O ztiWrrQh^6r_j6kGDR5Y{DzI79D6m57ekO}V1xAYqh5zOO3V+Pq6@Ho9DSS6KQ}|-8 ztMJiWRpFhvtil^}5rvoLJPOauSri_df0ut~{#^c^`E~i*=Evo4ns1lCX1-khviWrR z3+CS*KW6SJf7skg{-C**{62GO`90=5@;lA{%567)FSo_~f!rqZ zi*oDD56i7J-y*lle3{$|^BHnW&Aa3lo7c!KFwd8pXPziG+dM>Wrn#HkG;>S2DdyU8 z6V2u1`ppI9ddykmI?cb!wwu3_Z85(m+hl%Gw%+`RY_0hY*(&ojvK8hFWJ}Gb$QGNo z%NCl~$mW?B$mW=*$Yz>H%BGw9$)=h+$tIbb%O;rX$i|v0$VQus%0`%T$%dK#mkBZd zDidh_O2*&(zKoCgRT(ey(=s0B2V`8$x5+r0uaR*yUnFC1K10UVyidl;yhX;syh_H* zyg!r^DENg<_D!k&DTo{o6nUNH1Cq;H?NT9HBXb~HV={JGkHs_aS zH2){{-|Vf_U$Z+>zs*id{WRMx_1$c>)K|0FQlHJbr9PTfOT9PCk$P(uBlX(MSL&si zoz!zP1F0uwic*ivgry#su}IxB`zCqE?1khlvzwAP%uY*QHQOtB*=)V!MYDyH=glTd zo;7QgJZ)AkdD1LX@|anSrWwuyih1qn8WoA7ROUxQ27MYbwEHulKm~R#@ zG1n|aVz!y5#4IyAi5X_b64T5yB&L|jN=z~nmY8V9A<=L4TfEoonRt)cMe#1PJ>nf^ z%f;KwCW*J2)rmKoWr;VMg^AajIf>Vq>5JExNsCvRafnx%eGw}+dni_Fc22C=Y`0jE z*$S}&v#DZvW=&$bX8B^-X0c+KW?o_$W)@;;X6j-oW};%rW-MZfW}ijl%^r)!nOzc% zF*_t0WwuE)(rl4vxY;DpP_t&y5VK;@AhQ(FK(kO$e=|2xUo&%2A2SV6FEdF|Pctr2 zceCFju4ZpVT+Hr?IGLRnaWFe5VsExd#MW$yh_%@?5i7F}5eu_w5i_$~5mU2x5o5C; z5koT<5d$-G5j`_a5gjub5p6Sm5lu5D5e>7~!fIxhgjLOU2rHY-7gjQB7gjLK6P7m% z6P7iz6P7Vk7nU{?5SBFiDI{U`SV+w5jF70=HX&iNg+fAR-9mz9WkURBi9&p4-a+bPIowp5VOY@*lR_rrCmjOd|w;o4N`9 zG&K?YVX7$j%~U|}tLZ<1&!%q$KAGMT_+WZk;JxWCfp?~>1m2j=6nJggDe%&?Qs9MY zroeO4NP(xOo&rxyEd?H#Y6?6wl@xej$|-Qq^fUim(<}V9O}FshGM&nQ!?cY5x@iRe zRZ}beE2gsimrWV@FPc8#yI^{P@0{sczO$wi`OcV@@trn}<~wQXz<0t_mG8JIH{Vgy zkGw}rZ}1*AJ-~a&bUE)q(|+FlrWL&VOcQwbntJl?F*WAhZ7R#V)0CZehv_Gt?WT8l zwwfO2*PS*GD!Gfj=TW|#_cO*ehV zIo0$G=M>Y`oRdwvI47BAb51bz=Il4soA4iwzVvY{ePL6id zJdQTg5RO(;OO6&(d5&gN7LF# z?q6jwPi2M0G?ir*pniX=3TnR}RQJcg$NW+2ejSxw3l$Ya-OsDiYQd_~Z1G#U5#H}V zuUunsK)K2Sx$bXMF0!alhV=VmlyfXl>;4oAab-x||5pjt?+4ZWkrpSEKy`nZ#X2QW z-5+c*MJW(k_xoAoD}m~MZ;LP`P~Gog0jc|4E!32pEu@q{b-#lJlajr~cST!^*NWEA zy5GX$gd(W!H?`QLXl$`u(a2(sqJhN(MSY7lMO}+(MQv!^uVE3b2&(&4E!-59!F9i( zqJo7wxbBy=5LT42;8K*bU{I8>_@*Fk@kRku_lsEEQ~=feg3!934_fzgTP#rEvY4*G zVbQ0+4z2rHEQ%GFEwU6CEfN(NEFu*CnFlERHg{L}VQ#PR)!au(PUv9Q}qTEdL5V>jQ?s8MiE#)Sf>&W$+%ggnc3(0kv zv&yxb|B!7pe=XZ&eowZ+{Gx2F`BB*_^BuAk=4)h2%@@cPn@^D~H1CkjGp~`&F)xtK zG*6LDH;RYxjFowxjD>lNjH!8*jInuvjG=kDjJ|oS zjIMdGjJCO#jE1>`jGDQbjEcFgjFP#sjDoq8jGVcEjEp(EjFkBwX$kX}(qiVm5fQTmVB2dQ6X z_oaTAos;@zwomGd*;=VjW^<)JnDt7%Gpm()ZI&nX(kxEuxtYJzQ!@vt$7Y6756zUM z?wg57-8EyCx^4Dd@`l+<$!lh}C9jyBmAquOU-E+4M#-~gizQE+O_e-p)-HM6tWxr* zS+?Y1vpC6vW`UCX&739onwd%NHq(^cX(lVV-Aq7os~NN8X0z`S8_ixztT($avDWOe z#A>tS5-ZJiORO+kFR{#QiNq4K84`=kdLuY4%dQ-Rz2Zo7n;J7PHmjO=i=?8_b%- z>&^1SYt5p>tIgcRtIUkVE6n7@%glJhOU!S<#mT$ISEZ1y}SdQ5&u`IK8 zu?({kv2?Q}u~f4Fv1Bt_u_QBXu>>Liym8iR!wy2w#tf-3_pQw`=gQ%m~M-h9o z$0D|7S43>gj)_>AZ5OdHTPb30He1BhtXIU?tX{;(tWdi@VDtK!C$8Bf60sUj*KmJ{EXwdP(4w=|O=PrW*vFn=TM|YC1vSiD`qtBhvzbho%Vv4@?6D z?wL9W+%+{2xNWK^aLZIs;D#xaz;)B7{MSs6@n11r&VSjoga4vw7XJlPZ~k+py8LHN z1^7>!e&IW1dV}wz=^no0rVIIwnYQsAHO=NbVj94A$kdeYps6(90aHf4eWuTO_nMyL z-DA3ycem+W-d(1xygN*DdAFN}@oqD<=iO?m$-CK9n0J%uU!IMoFL>6QUglY6x{qhA z=}Mk8rc-!Unbz~HG|l2!VH(D>%+!fzsi{8C5>siO#ir~$3r(MMFEHKDJ>PUD_gvE= z?m4DD+_O#9xM!L&a?dcm!!_M>2iH{7DO^)b3%Mqn`f*J%)#939%E8rd`joTJ^e|_y z=_1Z<(H zsQWKk#HgOP2v$YZ{TAT5|CoiU>JbZA-Or`E--1zfFSPF8Y4KELJ4(O*kje&&ohs`r zV0Hg|Xx-nZvc#fQWsya#$^r}6m_MxU4^f$J;iEFu!bN4Wg^kKY3lo)o3tV;oALT}i zx61Vv_mpcb&MQ}298j*b*rZ%;u~@mx0@Uw^)%{t@c^25~{v-=7=s{7q6jFeoUb-$wppAx9#w(7IpD;*El+#Ulk_i<=5U7UvZNERHGgTkKKbwb-n{W3f_!%VL27C$#QovuIUd zwWv{GwkTF$g4X^2%_9~5mjcgUYIuarM-o+*FCJWBqM zxwrg&b8Gp%<~s7b%w^?wnDfbRHUBTS+5Ds22J=U9>&!39tu{X@x6*u@+%oeOa!br- z$}KeSmYZi@D>uiyKyIdalH7Fj5VpU6b>w=@<>k7}h2+}JS>;;If5F@GiFY5qXQ-TbPIi}`68 zC-Z|c4(8ir?9A85Seq}Bu{56{V{YCjV`|x@{&Zb<>Pp z>bltv$*X3sBrluYk-TVjPV$`D0m(CFn&<>htTlThvD)l`#7eU(63fj_NGvnk zBeBG6gTx}Ur4kFwW=hO6>ywyc)+{mGtXyKIS&qbXvqXuhW?>SO&AcThnK?*IFf)_r zGt-vnF;kG}G82>NG~rx1!jN5^2}a|<(gd=%QibAmT9(8EW>QRSejXnSc+MdSdv+~ zSfW{|SiG6DSge_$Sd5vxSdHDM1##viUykP6b&$2De7l7Q`E<- zOVrz}O4QRVTh!ewM%2yBSJcJKPSn{-$m<0+8nOO=8nkfnMn{f&A znSB=GF}owgZFWqE(`HKOu-MPVS?{Xodw^T8VbHKl^1+v$}9NN z^tZrs(^mq|Om7N2F+Cyh*mS$VL(}B~4@{>C+%s(xxNBM_aN9IZ;Ff8)z)e$kf$OH` z0@qA61g@A$2wXPh6u4;mmH&e2HU9IaJNVC<&g4I1TFrmTG=~4AsXhO3Q$_w`rY!tN zOrP@|Ha*RE$aDkW0n@2``%SC(_L;`>?KO4f+ij}Nx64$JZ>Q;Z-W{fQdAFG!;oWMw zns`{1xM!Mf;+}5W!#&M3jeDx8 z1NUT8Y3@m;-?%24UgGLEUB}gD+Qrptn$Fd2>cZ7!s>Ic4`k%AI^e$(c>2A(e(^;G? zrj?w{rcs=Yrq-Mdrm~#%rvEwWOdoO7njYtnrs@znq;cWnqbPx8gF`sCC+pUORQ-RON?nUOSGviOO&YuOQh*1=5W)q z%weXhnL|xGm_tlcn1f9nn1f8^nFCD!Gx?j|XYw=M$K-1|kIBchj>+3Jf$0jg-w&(% z&sun?p0;pQJ!Ju^`}I{}b^jp?Vbuc`u)6<;%5IDIDmyKnscg5ntFqPNippk-(<&P+ zkn8>xDyu9&b^mmgWfsVFf2qnmiyW0X7AY#TEI|GK5CV0-s7kv9tly7b_aB7U{iPOD zm5VLflnX5?l=CgJ(CU6;Wzd*^iiLzStnQDq_@ESH@klAk;;Is;-w&$$LoL=Rg;*?7 z3bL506kySz-u%Z;S?iaWCrU0t@MWA)RAhho1gVz1r7OTK@KZnJ11$K)*1y+kz1r})C z&uEdQz+jQ2@Yg(2;g@-U!VhzIg|FuJ3ZKl)6yBTbDZDXPRd{JGtMJTRRN;v^kHSN9 z7KMA}Kjm+mzmUISenbA6`3d>U<~!ssn6HpOXFgN@w0Woe3G+(%qvl!ihs~qq514z) z?=`oP-)*idzr$Qkew#VJ{AP0o`HkkE^8)mL38*DBn8)(ig>u1g&>tp^^#?$*85i@bGEU~FWgN^8 z%GjE3m$5cqBV%d4NXE>3hKz}Mzl@Q2tBiqpwTzy5p^Ub9x{RiIoQ%48h>WVaw~Vs6 zql|*Ng^ZlJo{WsSs*IGmjEsc2u#A{Fr;La>gN%^*duajlJJNjSr=)qzcSv)YFO%jl zpCZj>-XzUpULehA9xwgh%vbuanYHw9GfnBAW)jlh&Df>CnthY{Z1z;@quCXy_hyHs z-kNQedTq8?>ZREvspn=*Qcul_q#m0kOFc9Tmbz!=B6Y{iRO*(Qn$!(5aj9!&98y=z zeo0<5do6k1?5^Zlv-6Ut%??VQG}|nB%xszD5wjVRhs?Sp517?T?la4m++&s`xzj9E za=V$kORhCzmt1Z3OJb$jJBj6H4<(kFU6oj3c2Z)I*U}-mRY~V46|m5>1GuYQ_XTECYvQmOf(CZ=r{9`=rePa=rJ>w=rYrh z=rB{1XfqR+Xf@-JXf|V#Xf%5-UT=0=yw2>Hc#YX6@hY=<;uU6{;$>!~;-zLu;>Biu z;)P~b;`wH3;(2Dm;yGpv;#p>I#WKupi=~^L5KA@NCYEfrSS-nGqF91iomiY%j#!LY zlvuQxhghVUnOL})idd+bkXVQrqgasHd(i;1d!qhk=R|$Y_KJF&trhh&nCMs%a#x81Z_Cv(X?3IX#*&PuhvvVSb zW(P#{%{GbXnk^C0F`Fi$W!530VOAxgW|k|WY8Ee|Y!)Pf8b^;en z^##tGDhQl46%aUM$|!Kk^eO*I)8qUnOjq(BGwtR-YMRS`*wml@kf{;>0aH=_{iZ+o z_L<)1+he+)Z@1|ZzFnrBd^=3@__mvd@NF}-;@e`Xz_;0yoo|!rTi%VPmwDHl?&4i% zx{!CRX(#U*(?Z@=rct~rO`UmHnCkE@GZp1sYWkmNiRmkzMW$DI7MdR5Szx-FXP)Ua zp1Gz?JabI*cxIVK@ys-JW^| z)P%dol%KoH^fgzf>2a=D)@V~d)+kdo)=1O8ED@$xS;9=$v4onov4oh$u>_l%vjmw6u>_jFWA-;a z!R%+cjM>+;nc2rQf!W*ChS|$hirLfj7n8f`Z6-I<-At~gbC_IAYnYr(V7qFzaLij@3UZ3-D82f?q6@QOJ%LaMwK-d=yiV^wBHY^`*Y!S{|t)| zm1!0}DpRob`(;%+Ensy&n@Y3AU*$%Ncgpn^_myicE+|)9fa?Cu%H@B9g_jbj?sv5?QgXIXQ*yG9R&s#W{k9h06|F7afa`t>iz|wty5H1dpQ5qF zCPh%)Z(uP;5mxtWTU0B8>V6H2G(|ON-LGunrUuH&0UdV;-sS(>y@oo4JR=XLEan59VeHZ_V`-UYV;YyfBwlcxo=H@W`B3 z;l4SG!X5LU^0&-i%3n9XDSyTMr2Iwmo$}|*SIVC;pDBORyi@*|d6oQO^KAKp=F#%| z%zfl{o7>9oG}n{gW-c$k#auvsqdBAedh<_mYs{a>tuntVx7_@=+*0!$a*NDY$;~&P zEjQP^S8kShz1$4*Lb<8t$#Rp-!{jEId&u>gTg!Eu>&kVQE6BB(3(GZ|v&l7>|CFsW zeRkg(wyeIrP<9_ zO0$|zmu5C^m1Zz6mi}j!B>l%MK>C-No%9bgUFmOTGSXknxTHUs{gnD(_Co5N*>$Nm zX2+ynnQfDLVYXE2nb}mSCuXfukIYJ??wh4b-8Bo9x^3nrb<@mT>bjY_)KxP{sY_;D zQWwmAOP(`(D|yE3zT_#h3zEmp4oMz0+bVh3Y`Nq?vze0n&3YvFnAJ({GAoqaVU{Af z%`8lEi&%oS*O-Y)t}^40Tw(S{Vwu@{i6v%_B^H@omsntSN@AYb zK8ZPInSTEY!?eEZ9s_EYM6s%-@Vn%+KtrsE^rWQ7^Mgq8?@kMcvIdin^LD6m>S6 zDC%U^DC%HVC~9YxBx-9GENX4$B5G-7CTd}(E^1~bA!=&IC2DN;N5s(Voru2KeGxsg ziy}H^hefo^wuxw(tq@T+nbZ^&1!_X%u<9o%zT8|%}j(@&18jH z%vgn)%-#zzn%xlkZ+b}RpXq9$Kc-WKew)?{{WQ%I`e7O>^v%>k=&PxY&}UO|p--kP zLLW>&2);MHBlyP19=vH%yNTTr=GwaMg5)z-7}Z0+&o%1TLDE2%I-f5jbZWB5=mk zRp7L#nZQX?b%7J65(39eIRuWHe&#=7dX@i>=??ybrnC6>o7VF0GmYopW9r1e+fj4%0V$+fC2&Z8hD@x5ab@-)7TVzKy0yd>c$X_|}{1^Q|=%cqW9jksz|1-PnA-*Z-)p5?4C zUCmi$+QnIFn#EaS>cv@Xs>NAo%EMV;`ko`-^b$v&={AmB)7c!^rVSifrl}m6ral}Q zrp6rUrqUc~rc4~ErdQZgOc%2!nHI7qnmV#4m}I-v+10d;*~K)5+1b>R*~wIl+0pbHlY{9ECVSHzOtz*onQTlenXFBt znJ!qwsGhS3R)zKZVRipe3pLfl7P6{`EJRcfSa7TEvtR<({ktsQtLy;x`|qi2wYaLX z+2V}KMvKELu)2S>#R`>`77J9CTY&og{VGc=Ky`ne$^r{m-Jhy5%OX}~hD9i}?srw0 zWMQi^!NOFf&q7zF$3j)5%K}#S^Qp92V5|ENDOXy+>i%iU#TKBtzfw8hB3n7vB33!u z!XK&bR|D7mi5A@8F@H$EAGPieu~@GZ1g-o1EjpDzb-#~Az7nYJ_p}IC0@eL)7IsQ5 z;JRO3$q`!j+gUIx*;@Pn*Zr0j4-_pdt}2>YoK!Rc*ZrFn4K0={g6e)fi;0Rl7Hx{4 zx?j_xP*ELP_p4Y0DuU{MMGG56d2rpYp(q2b`z0;76vd%+zX-JM7lhXReBio&uL3u; z?&q*rsK9P9U4hl2Pl3gvRRL7@GlJ{>Y=yt(NeaKrBNe`z2Pk|o_fYs~Zm;m(++5*} zxt_vHb2Wu$=CTTp%|#U+nDZ*!HD^`0ZT?gKhWShRtL8W5FPWc|KX1NM{;c^*`BUbz z%w=VS%td4b%(-Rw%$a0( z%s)$WnLm`~Fh4KNX1-UN#eB6ille^P|7IQ1f6dCIf19OB|1=Ah{%+q5 z^hYy3>Gx)Tq~4mnmU?Y=OX{WBNvY>%JEfkQt&nAr_J6=o-lhLdCcsRFf!R}ud1f~x=9rz4m}PcAVuslkiD_mlB&M3pk(g{YQDUN5t3_&1Q;)o3)FDnU#u#m?et^nFWdkm^p~~o9T)9n#qWHn{kVIn*9>>FncNL zW_DfF#q5}ZOvLmZOlqVt;|wIEzH71&CT3JP0cJtjm@+~jm%_3 z4a|5&_00Z@=$d^L(KdT5qG@(jMBVJTh??0>5f!u5B1&fSL=?;>h{&5Yi^!Ulib$Jf zh)9}6i%6LHiinvxh=`aOiwK*ki3plWi3phSitw2+itw7f6y`R&Ak1mDU6{jczA&3v zn=q?co-ngnm@t!>oiKx$n(%*9e&N5SKZO36J{0<8dRpkG=@y~yrt^fpnRW_&F)bGQ zY#J-{(bPlegQ>C5J5za~x2D`euT8%TzA}9*_`>vp;B(VGf=^9X3O+HNCiuv-S@5B0 zf#7}9Si!rdUV?W_%>{3nstVpT6%xE|${={n^qs&J)4KwfP0t8iG~F$5!E}|tIn!AJ zXHB~VPMcN2JP`ruX?am>%X^XS$qkt!WS68q-3)RiT|co&&2=Urgh$2;G&jCY=CEbkmsH{RK%`n)qu zC3$C)bHtkpam1N^WsfyI${u4nl|9-tg+0>LggwHP zg+1K#DqE=OQnnD&a<*VoAGRP<1-3xbFRcEi$65VMXR`X5=CJyh+Ov9@in4l|zGLw) zJ3(K=)7i{+rd7E@2fJ!0(;%x zVIiv0X2GY@V!@`;WbseA!Q#Dgy~P9NT8oRy)fS+-e~WUt#Zu)`3sBwPpZ^5r*XThRmWAQ`L%HoZprNu)^)F{I0epQQTMNr+ZWZ|x;0ImCFEkJd@oT8M4h@u3v?iaQArU0t@g)AN`fa-pJ zi}MPgx}V1aQulLOtWp5g{cIL96j&|#6__nr6__k)6&Nf^6#kiKEBrQ3Qut{esqoD_ zP~o$=hr$PQdxf{=<_fRO^%S0)t0_D&ms5CXE~;?PoLAwFIjh1=^I!7U%wNi1Hoqx< z!ThBBIrCler_EQ%pD>>#f7HBN{;+wq`~mYE`Mu_`^1IA^<+q#L$!|5+m)~TrAiu#} zNPew3v;1oFFLEo)pUEvVzb?1f{G{9h^IdZD%-6`xHlHgu)4X49nt7w#WbxRl*(~#gvgzhiWmC;NWs}TnWfRN`Wn;}#WuwibWFyS|WW&szWrNMlWdqH1Wc|z) zWqr)WWIfHfW!=pgWL?a^$~c+7ma#W~AY)^GO~%UnjEsf(K^ar??J~yZYh?`07t83G z&y>+I@0ZasZ>PiDr_AIy}b-V?@osb^+qrJk7Wk$PmdTI#;pY^l3u z-BP#Bs-hnU2&sGg+xKW_(ho%>GLrH~S!Y)a;SuVYADU z2hEO3?lapixyNj!qREuL-`A)adHBA#q!D4u90C!S!& zEgom~LoCMZsaTZRC9w#z17hK3>%>CM=7c1P5~?6jzz*=|uAvsI#2W-~=C%{oQR%_>Dr%`!zz%%Vh% z%)CSm%&bNA&2&X|&E!P2%>+cX%$P(q%)W@InLQIxHM=3AY<5aS(QJ>1yxDpYIkSZ# zGG&!?6#j1dO6Z&E6`?Pt zdxbukE*JV}I#KAoX^qf3({!OXrh!7QO>Kl;nyL%EFclVhX8KR?sp)IM$EMc>ADJEz zd|B!Mmp2g11d81aFz93f?dc61;BeAb8bOSMZ9dwBRLEPQeSN-vrK^J{34? zdRgF%=^=qrrW*xLnl2PLZaPumm}!H+5z|6}!={M>hfIS64wyO%>^C(Q*lVgHu*XzX zV3#Soz)sVT{M${h@NYBS&cDTU7XN0`TKp^w`i^gv=_S6E zrrY^en9ku_X4=5F)HIcEiK#c=B2z=Yg{I&NqF=JJ<9a?;O)@yt7T`^3F7E z<(*-g%RAjPly|DBE$8KyOy>83H9 zsiroZDW)=<$)^7}l1%S&B$yuNh&Nr%5og-X5o=n=5p5dI5oK!25oxN#5n;;35pMc~ zJ=An7dx&Wpd$4I3dyuIbdw}T=HhUiEtphyTVU4xn=H<%Y_K?@vd&_+%32Fp-M>&}xdo!`UuaRUGT)+1Wv)e@ z${dR{q<%lHx?fJE!$J(B?ys|Wpj=~dQMtLY zGcBBy(=D*o{U4R0EuJVvT3lBOw>YH~X0cZ(#A1U|ki}vpP~Gom(W&HXQLE$)uKQDz zJS@VM+@N*8Gqmn^u#i>))%~^>EK1hky8o@B1+?xrwK%0{Y_VSvRQDTLAnJZ?Xx*=2 zQK+b9k*26>5u>PV5vZsLt^4IHj1)n2zqEy%q9nBL7qehc1l9e*7H<>;EgmZfSlm?L zv$&wZYjI40+hVT*m&IlU4vSR^>=p|ZSS@BKuvqjfFj=%IFhcA8zvkHrzs!>qzMDrX zd@&DH_-O8-@Xp*`;kCKB!V7afg=gk!3Xjd@6dst1D%>^aRk&r&s&L)>m;4p;SMnFl zZ^@rGKP7+0e3$%5^HuW4%xB9VG4GZ?XkH_~&pbzdw|T7m4s$>GZRYm!o6Qa6H<&BR zuQL~tUv17Jzta4x+%ofLa!br_$SpKKDL2o2x7-}_wQ@7f=gCbspCC8Iyh(1Nd5K)V zdAeMWd8AyYxwl-qxvgA_xq)1hxsqJHxu{%?Ifq=8`ES{B^LMf(<_~3y%&*Aio1c)) zHQz0pWxifE-F%U3s`)h8B=auW1oJxCSo0#;X!A7L2=ge}FmpfIU~^~LKywROKXV;f zA9F=nPjfL@cXMu87jp(#C-bi|_U5l;Y|S6aSeajwF*iRWV`_d##@KwjjDh)D89npG zGCJlnWi-wEWz@}EWmL^;WR%Q{WE9LZWaP}_Wn|1lWu(k~WW>##Wkk&_WrWQQWCYFC zW%$hHWO&R)Ww^|FWH`*3W!TKWO0$?hk!CW#B+X!cK>DBAdg(uAbESWp^+@)a;?uW3vlV56$*V-7{M+b;oR; z)Gf0DlyaSg~W8TI}%gP&Pz--J1jBLY`a9i*&2ynvjq~} zW>X|O%{nF8&1xmu%!(vh%+e&9%%UY4%mO6p%-keu%&aA<%nT$d%+w^x%%mks%>*Ti z&DbRh&3=jJn>`iJHM=C9W42E`%WRc+hS@anG_xl06tg_>WV2}TL^F5scrz36STjZO zXfr$Mi<+6u6E!jG6E!xg6E!r;71cM3 z6V)^G6V)-Z7u7N|5Y;qO6je795>+*05mh$(E}~@iQbfV*wuqeBSrJ*Y{UXw4n?xkd zmWYU(O&1Y0>k<($s}T`0%NG$aOA_HT3l-rt^AzDWvk~Dm(-+||Qxah_6BS`K;}Bss z`zg$5_CT1y?1b1n~+raJ_0nl2T*VLD0hnrXe@RnuI-%cfC+mrOkbFPNGMo-u<*PE{3Uu)XKzs5A5f0b!4|4LIc{uQQD{L4)L@hvrd z#JAY=7~dk(ReTFg`}yXZmhjCpjpCbYYR@;vRF!X*DG%RF)6cv!OmFi}Gd;{Z)pRxQ z6w}GPlT2%PCz_`4_M7_f_L-XS_L|D_cAK*DcA38C=`g*;({6f%r_FRdPmAd+o@UcF zo<`Fmo(9u+o_bSno?252o*GkCo@!Geo=VgI+!dy`xXVqqaF?3)bC;Ora2J_+au=Ga zaTk~}bLX2r;L0`K%avm~i!0l-f-B23j4Q*`ge%=tge%STGiQqFWzJ;N&74W5Q#cb% zOE}|ALpkG2O*vyt#W-V3zjH*H-sFfh-OUkUI-euVw1p$oG=n3=)Sn~R)RZI0RGK5e zl!?RN^fJ4j=@NDy(=v8%Q+IYRQ%QDD(^qWnrhD1kO#9hfO%vH%OikFFO}W?{O&_p2 zm~LgYH|=7zGmT@lF*RhhHf3YAGQG=UX}X=o!gLagxoHlInW;OAiK!BcvFRUXBh%~5 z2Buq>^-U)+>zNiX>zW2I>zL{@Yn$>gYnr}h(l9;4q;9&NNzHU3ld5SklZt656R6)0 ztNV{wsHq;ZkX1#m`*&J=P}y$rLS>u9eU&X1*Hn<}{xuexRaRN7QdwyMs{3cEEVY;b z?)O9L{&H~LKieWrWu`@(%5;lRm8llUb-$TPpM{=EkA<2_mj!a&&#uyB@n5;Y;)8OX z#Y5#9i%ZIox__&3nZ+{Y5{ntiMHZdP1s2uHc@{a!ITmrsStxbCx^l7wsNc_{4C(iO zM5+5jE%qt}qtyLfNrrbUgSI=JpnS5!f&`{gZc6+v~sjD?1x6twOa zx8PC))%_wC-xP!_-YS6Vetu}(&jYRdIiYnw8?^3chSvQI7PSih%u5u0n`bNhFi%qW zY96KV$vjZugSm&oTXP46SLWsl&&~A}o|vmCJT#Y6xMwb=aNC?$;f6V@!d3HM@|VqD z$zL$PC4biZl>904UGm4xSIHkSpDlmLyjy<1d5!!Y^IZ9z=5g}d&Hd%Km^;XCG&huA zXRai_##~r_r8$fIa`SI;OU$3kEi}I=H{bk}+#K^ga$o!Cuf%$eBJ@d6P z+UAR8G|gwqsGIl8sF=6PD4EyDD3}+?$eL%!NSnvYNScSqh@1P!h?+ag2$@^S2$&nn z@R@7K@R-ZXaGHzCu$%MBu$r^TFq?mqW;A~){om}e^k1_>(!b3%NdGjOFa6D|Px^~l zt@J0eZ0QeXQPS_sJf+{5SxCP!Q2IZm|d2-Yj#-bw%I1B zn`R58uA5Dix@y)ab=j;y>VjE<)H$<2sWWDdQm4#}q>h^@NgXv4mO5<4B6ZO0tK>ej zXOer&u1oGRJ1M!{Y?tI#v$c|&&E`vPG@B^7-mF=2jaixGDzi+<6=pG#%gp>GmzX(8 zE;KWhoNuNnIoC`^a<-X(79>$+<}OiTW+PE%W++i&rY=!zCL>X3 zCM1z>#vzew_D4M1?74WB*=6wzvjgI3W^2S#%w~uunYD^1m=%i0o5hL8nt6#wo0*G8 znyH9~n+b}Cnf((BF?%f*WOh?5!0fn~pV<~MU$aGG-ewcTJk9FG+|6>uT+L#{T+F=1 zoXjl69LzMt?93#@Y|Yrktj)fOTADo-H8;B=YHD^w)WmGFsFB%XQ3JEdqIzb{qPk{9 zqS|IjqMBwwq8et-qH1O)qAF&pqDp3BqKanhqVi@xMP$uhi%6T@6_GN#AR=LQNJPwR zi-?HXauH#(St5dFy(0W(4I;c|#UearX(C)^ks=&sJ|b*p4kD~(#v;sSY9dT#k|GRd zydwWh8ASe?z7YOxdO`S?=?>u^rVE6>n|2C+H7yeUVj3m<$<$f+qp6PYds9*2cc%Y@ z-k3fYdS!Y+=%wi{q35Pcgr1r92|Y2b5PD>qEcDRSPw2j>rO-W76`?z(0z$VUuv4jzr@s)f03ys|3Xt< z{`saK`R18k<(q4|i*L5+Jib|`&3rRWGx(;P`teOOHQ}3TD#bV1l#y?e=?mV8rssM4 zO}F#*nJ(b%HSOf>HZA1sGL7QxFm>i_H`V5CGZo=&G5yQaZ2F9+(ewgOgXwObI@4u5 zwWbq!YD{Z*s!TI@DosOqDomYt%1rfnN=;>XN=&(UicH^g7n+{p&Np4kooCv}oogD) zoo#Bxon0t`yT;t|U`$u0&HUt^`vqt~k?|oUx{-IAcs# zaYmbVb4Hrxa7LK=afX}fbB37;aE6$EPHsxeiGJV0MXnKN4!E`l~ylEektZ4z0 zjA;{R+K(CdD2l{O20l@<$7-Or$csQWJ~ zS6LiUuCM^r{mY?se;2gw&sEN`h*!?C2vp9na8^#UFjY>mP*+Z}kW@~v;8BjV_^%Xe zfxYezv{<6#Z!ulT*8)=ads!4Jf$DyDiwGrG3m+v=-S1>!tOTn2?JZ=KY@v0(mBmj* zP~C5C@kkL;_n%fYve>T(s{8dVRx0XR%mdf`S{Ch!nijQ+>J~+csuqyCU&$g!QNhAp z5mfifS{N%zL+gGC3lT+7-7jjvpePKj`voi>D}d^LUW*F~+!n_axGeT6a9C_nV7FMM zz-qBjfyH8m0+U6*0;5Hn!hiExg+Jyc3ct*=6~3D%D||7JQut^dsPN9*L*cc#gTf1Q zbA_ko`U;QC)fDcV%PHJ37gM-p&Z}_UoK@k9`EU7)=C9??nctQ_ZGKw*g!yjyqvosS z51Y@HKVaS?zt_B0ewTT!{0{Rt`K{*u@|(;ZWIjo5f_aNvuX&kVmwBdKhk3MItGTaSlevRj zgSnAht+}dPwYj)lg*lg8srg^oV)GBO1?G=sbIq^GW}Bas%`o31n`*v6Hraf!Y=Zf8 z**NoV*=X~6*$DGu*)a2T*D0StoNIS$lIv zSzGgOGFIlVWz5YV%9xs8lQA+sBV%BGNJiIuhm5xQIvGv##WHHzx z*T~447s*JQXUa&L$IFPBhslVT`^pHJJIe@|TgmX68_IB-Yshe#%geBti^;H<^U5%p zv&b-*f0zDe_DuSZ*%j$uW{0JJm~E2&X0}lJvsu6NN3%NV_hz}$Z_Q$)Uz>SLzcjOw zer~2I{nSiS`mq^@^h2}nQuocCOWiTMCUwi~sMHO!ty0&_mP%bQn<90|tVQa)S&7tH zvt+5$W+751&0M68nVCo(F;kT~WF{tcz>HmLui1CW-DWQ(cbeUj+-7!Ka*Nqs$xUYK zB{!HYlw4~zS#q^mo8(Hf3d!YW*^*1lVkH-u1xPM1bCH~9W-d9$OiOZ>nVjSdGeOB| zW~`D^%zj8rGJ7L2!R&!VpV?)J9<$>TU1qx_I?UEfw3#iIXfc~E(PY*m(O}jnQD;^v zQDc@RQDqh{QDGJ=QD){LQDSB*QEX-`QD~+ik#8m|k!vO_k!{8)k!ki%Jl*W2c$(Q& z@f5Rz;z?%f#1qVBiN~3>i^rH1i$|L!h)0_Fiiew7iHDl0iwB#DhzFW6iU*jz7xOc_ zBj#gvO3ce_yO@XBQZaY4DPpc>O=8Yw1!9h7@nZI7zG8M}HexnrI$~C4(qa~7Tw>;C zKSfQ=UWyu<-4Hc2J0YrXwnJ3UY`Lh8*>q7YvvyGpvvN^&vvg5avv5&mGj~x%GYe4# zGfh!BGbvFSGj35Svp*t|X75DA%^rw|nq3kRHajXJWVT&Iz-*NWpV=G{9P zPO~x*cC$|Zkp-{T{o2wx@O8Ebj9?8;APW0f)`Cs2%b0HB6!Yp zq2L+QKEczb)q*EYGX;;Eh6^4ubrC#bY9x5rR8jDtDZk);)4u}yOkWG^F})?Q+w`Qs zPSYI%J4}}eY%`rIu+_9xV6$ndz$VjFfeogi0_#oP1lF3G39K9^hYWx|n~VX$SuT(_H>}ra}C3P0jdcn@aP~GG*YOY5J6Jy6H*2X{PJ= zrkYOXn`~OaH_0@XZ=$IaU%#maU!N&IU$5y`-fq*oyj`Y8csoqj@V1*yuCZ2NBxjbd29XzF`#XQBP@jOMQ zK0F1cmOS~UYCL(SB0M>!Og!19_qj7ocX4N!PUB8DE#^)&_2*78)#gq%<>XE@ea@9& zdW3_~}(+8YkrUy7fO&4+on>KR>nWk_Cn!0fY zm}+qPnR0Uan!e`nF+IcKWx9^T({v(-hiNH?yJ-}MtEmHri>Vrivnel!qv=a_2h(lr z_NJ}uwx(h1Hl~{F)~0{hEKSd|S(q+jGdC?~Gc)yOGc}cGGdBIqYGitn)zEYitAS}H ztG=l}tFEaktB&a}7H!k>ELx_^Su{f?0K!1$y0oU1g)iIhFMmu)2SX$|{T1Dv-K=mdX-~i7JaMI#d=|G^otCs8E?} z0jm4cRc2bmt4z1RtowT{^i;Yn)KxkykS{rv$3|JuFg{+@N*8vxS3_lZAlon5?K}(V?heQLCs1t^1WNViXm@b-#zAoQ18T47l#s zRFt%kQv}uhVisJAA{LB_!WQ2Z1TEewfa-oei(3jj(7K-!TKBU->wacv-Opgrrtr_a zR^hjKiNX)_9EGpu$qJv$qZHno2P(WV_f&Xk?x678+(O}rxxT_fb9IG#=5h+R&BYXM znDZ%IHD^<}Wd2+Jy!mVSGv>GDPnw^WKW@HT{)qW%`Ge+js~?CYVo_>oaea>o%{D>oCufYcr3LYc}_jYcO||t1~y2t2S4Yt1y?4D>LVoD>nZp zTVVb{HqZRAY_|Dz*-Z0OvT5dfWs}V}$|jmGk&QE-AscPpBO7VnARA_0A{%0!Asc8O zBkOM-DC=YHD(hu#DeG>oC+lLaBoNxB zXJmBE56Nho?~u_jUniqxzC=dFe3p!&`2-nx^EMe-^BNf`^CB4u^Gq2r^LQB%^Dr4f zb6**Lb7vV|b1NAxb3+*pa}60bb9osSb1@l4b3U2>W~?%Q&3;J#HhV7p)9kABce5kX zU(Gg4e>Phr{lRRa^gFW#={IKi(yz?oq+gi%NLB z+HWQ)wa1K8YM0qB$sJ~|CAXQ~mE3H0PI9B!0m=1d8ztA6EtXtmHdS(kS-a#ivnt8O zX1S6J&Eh5Jn*~YEHFK4mZDt`k!%RnVnwh-h6fbgLsVD9Puc#PVoq{ zQt@!JB=Jx)fAL^58}UFhEpdM{adBTW7I7c5k78bC_r*NS&WgF2?G|$}TPfyjHeJlo ztX0h3tXRy}EJ@7TEI`cC%wEjGOi#?rOis+ij91La?2o9S*&9)Pvpb@?W@kjT&Gv|D znynGlFq0pxIRsezW5uykKprnW_svF%=MgWco|!q3L6x`=)1w?wM{Ex?{RP=$2`>&`r})q3fmzLf1^a zgszyH3SBl;5V~l}BXr*Mhu}HWCxT~8F9@D8-6MF?bfw^N(`kaoOq&Idm=*{gGK~{F zXzDGv-_%lYpQ(o69#b*FU8XF8J54_eY&U%*u+8*>z!uZ}0-H_O32Zc-E3m<|S74oK zjlf#d9D&uQF#;=1eFRpR+6pW))e~51Dlf3uR6t;nDU-kg(--{nP0#SpHQm5J$8-w+ zEYk}9nWnM)(@mZDr@U@w~;%za#$lGkXlefuqA#a0eCvUxJ5pS(&G;fWmD{qylK5wO|ByYJX z6K|R68=g|rYdpoK`+15?SMn5?PT|Qnt>?)#&Em;14dcl+b>_)5HQ>oGmE}n{<>pB> z{mh+WdY(JUbTxOPX*+kkX)<@5sRMVcsVsMl>2Izm)0O#`yD1Z=o9Pn{SJPu0 z&Za9loJ_kp98L2$>`j9?>`W~=Y)$1jtWDWCtW0mSTbQn5H#e`hFRM5B(s$1Qf5ihCT4NdBxW&FM`lq|C1w#* zW@cg2M@)jIhnNIRmoV|0b};doW-;-a`Y?g&{(}~>s{6tHenj2B!{VdLHj9@kTPz-^ zY_>qu{cA1us;suyqOuZP_b*miW&x}FJHd7TJc|mIITi&fvn*hBf4It23xAc#7VhwV zf3Jl;THP<8(rm$@(rCe;Qg87|xz^&ba<#=33sV0AyQa-0Q&GIHG?W^r06#A2UP5WMc6q2y};srx-Gij>^Jb$_Ii zi-nI8sP1=!*8O%CGDR&AM;v;pXQ|s-^_Cq zKAR^id^C?zcxN7@@Y>u{;f1+_!c%h#g-7Q43ir*`74DeJDcm#{Q@Cc%r*PSvP2qz1 zANjN9Z{$y#-&zYH zSDPEjuQXSYUuG^Uzu25jexdmfxq0R<| z-X_;+ULn_Jo-Nm69xK;q?k`to?j%=ZZX#D{t}a(*E+toD&LdZ7{$DoF{F7{s`BT|U z^Bb~h=BH&-%=gJAns1VgGhZqjV?I+h(!5tT%)C)H#Jp5C&^%Mt-#k{<$2?Hh%iK-Y z-P}sn)m&fJ$y{01-dsY~)|^+?%A85o!u-38srefjWAjHc2Ikjgbj{DoXqz9B(JDgDFjh4eSGYtmoLj!J(r+amqJY_aq^ zvq{pg%^Ia&niWVtH;b2kYUVHf*vwA)p_#7qeKT3zvZRihMM)hp^OibbW-YbPOj~M?nY7eSGajk! zW`8BOn!S_UWcEOEgV{yNb!LYoSDS5-TxqsUa=FoA zB01B{U2?jamE=@2UCGI2ijot}L?rvoI3#<`eoJ(ly_e`Pdo0mrc3q;y?6gFa*?x%z zv&|B9X3HgN&1Oqfn@y0YG;5J4H>;2+HOrMKHcOHyGz*u=H}jFmHFK26HZzmRG}D$y zH&c{IH4~FaHsh8^GGmlTFncE+XLd_G#_X7Ql-VZn2(x+OVP;+8A!g;`!DcDqfo6f? z{$_UKzGgb&-e!{Go@VUg9%f&}+{_+{xtLuLb28f}=3ur)%-(F4n5|idn6+8Cn59{& zn7LVqn5mhQn2DL8n30)+n1Pvqn4TGfn2yjKf7gaW!FREnL zFREZxFDhqNASz>)AS!JZAS!9*C@OAdBr0mABr0qsEGlHiA}V0^RfNy%xd@Nh4G}K0 zQzD#ZdqmjH){C&3EfirknG0rk*0-O>ITKni`0F zF;x-yWGW%@(UeEzy(xppTho`qZ%i)=zcSq^{L*xh@N?5H;b*2r!cR=2g&&)`3O_W} z6TWXMA$-r2N%)TG8=>2#*Mx4G9uT^2x=QGp=@g+WrgcJ>O*4cpng$DO&{>qnI7k@Fhq6Tz;lrT)w7ST;8T! zTwbQHIXz8Jb9$Jr;dC?Y<8(DG;B+w!=5#hS<#aTa;B+wk&0%kPkHgmV0Edm~Vh(H5 zHV#YEOb!cEUk-CqBMwtj2@Vs}zwAb)XW0!+=dv4^=CbRV+OX@I^0Mog-e=P?-OQ$G z+QFt_8pEb;YQ&~y%E6{$dXH7vbPKDJX*a8)X$q@?sV%FVsTixQ>01^V(<3a>rn6b3 zOp940O#NBJO?6qsOgULZO`kCfn;u~nGF`wdXj;cCU>d{BZ)(HLYbwjkWBQ+o+w?vY zm+5{cPSXWU?4~VDY^LcTU~W)twf z-r|@Fr0(CUveIIW%5savDoZV9t1PjYq_W5YRQETk%(JM3*8LeOGb|ERrdfomOtJ7+ znFOx;?N$0M%vDh9ehHOU3s~LHs8Vn78Cv&WRj#x+rd)2ZUAfd^g>tdQEagIr9_4&+ z-Jh?VW09zwWf82LVd1KrW?`;CzQS{73jH7q(6)h+52RV|7YVRgTPMX(~M?w7T&QTHfY_?Y_SMj_cK`ZEBrHWSNLsSr|`qPRN0GN zWQF(UQ3`L&gA`txdn!CLcT{+6ZlUnN+(6;3xw^t_b9sdu=3)w0&G{5AnX@UJH~%Al z#{7-^N%K4M$IQ>jA2#13f53c={9g09^1IA?<#(9Z$!|5!m)~TbAiv%`P=1ZMll&@k zWBKLgD)LLr#pD;7v&+vn|0y@e{FU5H^E-0W&CkkBG2bsY$$X<+zxiUh9`mVkUFPj_ z?dFwoE#^6LP3CcO_2vO`HRjH8mFA{$<>nf4CFas{MdrM6`Q{9AIp&{bv&^5#rkmfC zO))fFb*+}zQvf<`^vLWV;vVrEMvi{~-vOeZvvvhL>YvaaUV zvQFmuvJU1dvbN@uvexE&vKHpdvZm%gWQ@(<${3hGlF>82E~9OJRz}18u#B4dP8ntM zbuxHoGqU(d?M?d$X<5Z_SoSzc!mJ z{lctC`k7gw^b@m0=|^S((htlWr0<#OOW!e*m%e4jCw<-QpVU>ecT$(l?nzxVJ1ceG zY_HT=v$ayE%;rj+Fzb~%W>zb8#4K0pkXfA6eltI*y=Hb&yUp~ac9_XaZ8H;)+G55a zwbAUOy?~uRxdf%tWa{6S+e8|voOhN zW}cE$%xoklndwXRn<+{5nu$qvn{i5Zn*Eh%H~T2jYW7s3+3co7quE)Bdb5KPwPsr- zs?AnPRGQ6|C^wrVQEJvEQEXN%QD~Mgk#CkFk!uzyk!|KDk!j{Ek#1%ok!q$Zk!+?c zkz^(zkzmFv5og9M5o7jIJj(2@c!b$W@i4Qk;vr@W#e>Xx#RJSL#r@6F#C^?z#l6iO z#68XQ#NExL#a+!f#a+z4i#eG+6>~7VBxYxJK+MK$y_l8RTro?t9x-#XDlt>DOfh4# za4|zOH!*!PQ!za=6)_z%VKFT;W-$%3PoipOk3?0?E{Q6e9THVE+axM)wn$XgY_h0~ zS+l5=S&68GS&FEbS*WO}nX9O~>8K)?Z*)I_;v)3XVW_Lu`%+86h zm>m#dGTS7=Xtq@3zv*<5zouOxzfEgJewr4F{4h-s`DPj+^2O9!3{wyrjPh1n;zw#Xu67jf@wd0pJ@qyuW2NI zx2YX}m#GSWrzt0YyXgnMHq&c-t)_eVnoSq;HJNtuHJTRi)tiR#)tTDx)tD;rRhx3~ zRhho$tuVdDTW-3Sx72hAZ;5FSZ;@#UZ=q={Z@#H3Z=R_>Z;q)XZ?-85Z>H&co($8Q zJZYv!cv4N*@uZl}j=ZQCs;)yeLVeJ&rm3W4YW-?YP`b<+xl- z|8qK>3x`@->w1v~oG@aAd)RWWNREN{bl%Lbm^fQNr>2(e>(_I{oA3 zl4&)YqNzWdyr~MCoat{?S<_3bGNvn8rA!-GB~2q)B}|Q3#Z7rx#Y~^Eh??$W5jLI5 zB4nD!B53NtB4Dbp+W-il8W)9PEW_D9^W;Rm^W>(W*Of06i znV3xXFfp3WWnwUGVES*8%=FL1ooSy1YTdux;*-i&Xup4x#SL)Xzs};A${LG(DyuDE zb^j7@-M`pkvdTh>E|vKfP0+f(P-T_{tnQCcnPL&3GReY2WrBshN}q+fN)Nc-uc6Xu zp`g-k0jv8tRT?cob^jOTT8k&j)fS+-|G09w#SZ0Ciu;-*rV#Tlg#i~UML7Kpmv$D&8c%c5S% z!=hNp-2zniM=3d5KVew1R3|#j=Ry4M_t_Z684J-~S z>RCYQer*dx-LD3%`;{#+6csJv6hU>roP~#?47Bc-w9rx%ht~Zf7Tk)Ux?j-Zy8^$( zJ8<34V{uD?%ihD+XuLr z9dfPaRdP+{IdTo=@p851fpS&mE^_7OW^$$GnsP{Z=BF9I%y%<3nJ;F)r9YXyl>T6LL;9WBap^Z^+oWHaEtP&@ zHbwfGS+n$GvtsFoW=Ycb&4Q%wnmJ0}HZzpIX{I23-Aq9GiW!6SC9@Aw7t9_=oin>2 zb;j&~)G4zKQpe2}NF6nsAa&TRLF%Acfz&>;M5#Syfl|B7oTPS`8A)w5Qnl zj74gl*;mOmX3r#7nO&D$ZgxU)so5^cMP_Rx7nseJoM+ZAImfI~a;8~{h5W+jnirZ16T zrYaFmZSni+^Yo5_khnQ@CdnEe#9GkY#(V|G={%IvV1h1n)CGqVL^re=L&#%8r*hGscp z`exB$x@MkY+GZAFT4owz8fM~RYG!O=DrVnAmCT-rDwtgpl{Y&kDr>e)RN8ErsHE96 zQE{_&Q8BX$Q4zBYQ6aNPQ2{eAQGPRPQC>40QEoF?QBE^HQFgQcBCKW~L|DuoiZGd7 z7GW?uBJ$64yT~8Yl_I}PXN&wW?GyQK+9>kXv_#~yX}ZWq(`ba zHq{b&X(}i3!c<7)nJK%-6Vq?Pk4^6jKQuid{J?ah@IBL6!goxYg>ReY2;Vdf6~19= zCw$FRL->lRpzvkW-$EBnp9x(sy&!bXbhpqM(`7=ZO(zJQG_4joZki@^%rrpgh^e*E zVN*4sgQh}4`%V7}?lXNUxX1LW;4agHf;&yu3T`)@CAihJU2wB$so*BlB*6`)0fOsI zZ3WkwY74G5l@eTK$|1PI^t-@v(`N!pO|J?pF+C!%$aIUq0@K9;^GzoU%r$Kim}6Qb zFv~PaV5Vu1z;sh5fvKj(0#i(t1tyt_2uw6(73ep8&);WyiND8mD}T4?O#V*Odj1a6 z6#h0-FaB0j1O8@HQT`^=-+Yax5Bcg%Pw>^5uIH;YoyJ#fTFX~un!;CM>cv-XYRFe+ zD#2G``j5BR^eJzl=^5Sv)6Kkjrn7l-O`CbMO|yBkOoMqdOl^46O;veQP5F6KOn>nt znLg!7G`+wRZ@QZ&&U6`1tm#CaXwzz*DARPF2-6^*a8o;;P*W|Q5K}RpAX8?ZK+{Lu z0jB%7{Y>X@`A$m!oL_mxHMh zm%XVlm#yg+P8-v!oYtn>IW0|Ra9WsFahjXPa+;YsaGIDZa~hkna~hex<}ffl&!KO+ znM2QX8i$T)6^FKI9EX;v6NiSW8i%?mH;1a}6LuBTP3%ghP3(%MA?ymKs_b&6-`HeL zPq4|D&SH}?&0~`^b!L+=m0%M$ea9+ldW==XbRMg)X&I}KsUNGLsU|DGDKjgd>0K6H z)9oxgrW07WO*2?HO`TXcOyyYEP5&~pnciY%HQmX~Y&xBp$+U!-(KML(zljm^KNDf* zzb0Rq{+Qfg`fak4>6ghYrXMCXOy5lsn7)~~GVQV8QQZaZ_y1Ob)%}|-9;$4F*Zs%A zb^j`httu-l)~YPG0M-3-R3LSKH@NPfYf+^#+oDiqrbVX842wjSX%@(Jzk^Djg@sCw zg@HanJW~p{xTzFsaYiZFV!u)#xb9!3 z60Wi33xb-$E_iJ}C!?pIJ0 zwGdMjvEWe@vS3mau=oM4`*|&%C~#Zc2G{)@7RMFXEcPj|T5MHdwpgveWU)wr!D6Pu zKl2F+zs=hfewf!Od^Ims_+*}=@ZLOG;f;B;!b|fYg=gko3Xjbl6&{#dD%>?UP`G8T zp>W+?Ug3(lxWYwqeuZ=9Yzn8%|H_{*e=C2~{I2|A^Rw~?%=gOgHD4>g%Y2^vcJn^@ zE#~#|8_f&k*O@2CuQ3mlUuo_nzs%f3ezCc#`~q_^`MKsC^0Uo<$;~i-EjQKtuH0nv z^Kui+56bnKZs>+*PjB++42MTuZLN zTvjgEoL?^6oJlUj{HtuL`3u=3^V_ls=I3N%%@4^&nQxViFkc}XYCcCc$h==Rz`R-3 z*SuWT%RF1w!#rNr)jUMj+1x|c!Q4jH&fHMe+FVW6!dyz$%$#4=*qlYy(EO*2p7}c& zZSyBGn&vlU)XdMxD4QRVQ8eEvBWJ!|M#g-pjHLN&8FBN8GNR_~GD7BcG6Lo$GQ8&5 zGTi2gGMwfSGHm94GA!n>sYX3M0XnoX5{Y}P9Mz^p|2o>{W=9kXERTV~GEH_VKrubC-H zUojJszG%iIectSo)LFAfQm4%>Nu4x1Bz4?ulhhHjMN)^%CP^JIYnIw)RxGvKELm!& zS%}njGgqlCW~Ne`%+#bdn2AfRHDi}rZT3TQrP)i#WoEY|mzbTFTx7Oaa=zJm$+>0= zBxjpVlAK}IB00^hOmd1@rsPDkXvuyvKgnJ*2gz97 znV4-6Gd5c+W@t81Oy8_QOxG-5Oxr9@Ow-I)Ox?^zOwCMNOvOw}Ov#K(Ou_7zsGQkL zQ5mzFqEcojMJ3I4ii(@95*0O@B`R#zEh=bMEh=D^Bg$tME6QW$C(31JFUo0VAj)p0 zD9UOkB+6{YBFbp?Rph_vGm(F$H$?uJo)r0Ix?ALj=~|I*rt?LMnfA)Ij)xsg&?JQ)c0_rtgGKo8AyQX?j@bgy}k= zW2Q5Oj+nLx9X8DuI%patbimYAXrHNp&>mB1pqi0@FJJ^G#0+ z%r)IDFxzyMz%0{Q0y9jz1g4u-2~0K36qsTfDKN>@OJIVjl|a9#wm`3`v_Ow3k3g5{ zZ~hL`d;IODhxl7fm+`llcJViv=J7Y0hVVC-TJzVLD)QHwvh!D)zU8Yjz06l>x{I&e zbRl1vX(wN)X#rocX*gezsXbqTsTyCtDKB51=@;G{)7!k+riXYlO;_<|m`>zPGp*uH zF-_u4Hud67G&SZ;FqPqrGiBqAHT}R7ZF-w0%Jdjdr0FJ}aMQUwVWyotA*Llf!KU#% zfu`O(0jB0Wex}MizNY*<-ljjfy-Y82dz!A}b~o+jb~DZ7b}{wfb~aV#b~0t>b~Js) zWp8?v%g%HOm#t|tm$hj!mzAjtm!+vHmxU=imzn8HPE*sgO~qOMn|x#bXL6PK zugPZSKPHoyf14CA|1|Mu{$ZlW{N03)`J2fHrmrSfm_D0qW%^_?jp?IFCDR9!Sf+O- GPD}s_B7`RZ literal 0 HcmV?d00001 diff --git a/wadsrc/static/shaders/lightprobe/comp_brdf_convolute.glsl b/wadsrc/static/shaders/lightprobe/comp_brdf_convolute.glsl new file mode 100644 index 000000000..ab648c415 --- /dev/null +++ b/wadsrc/static/shaders/lightprobe/comp_brdf_convolute.glsl @@ -0,0 +1,109 @@ + +layout(local_size_x = 16, local_size_y = 16) in; +layout(binding = 0, rg16f) writeonly uniform image2D colorBuffer; + +const float PI = 3.14159265359; + +float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness); +float GeometrySchlickGGX(float NdotV, float roughness); +vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness); +vec2 Hammersley(uint i, uint N); +float RadicalInverse_VdC(uint bits); + +void main() +{ + uvec2 colorBufferSize = imageSize(colorBuffer); + if (gl_GlobalInvocationID.x >= colorBufferSize.x || gl_GlobalInvocationID.y >= colorBufferSize.y) + return; + + vec2 uv = (vec2(gl_GlobalInvocationID.xy) + 0.5) / vec2(colorBufferSize); + + float NdotV = uv.x; + float roughness = uv.y; + + const uint SAMPLE_COUNT = 1024u; + + vec3 V = vec3(sqrt(1.0 - NdotV*NdotV), 0.0, NdotV); + vec3 N = vec3(0.0, 0.0, 1.0); + + float A = 0.0; + float B = 0.0; + + for(uint i = 0u; i < SAMPLE_COUNT; ++i) + { + vec2 Xi = Hammersley(i, SAMPLE_COUNT); + vec3 H = ImportanceSampleGGX(Xi, N, roughness); + vec3 L = normalize(2.0 * dot(V, H) * H - V); + + float NdotL = max(L.z, 0.0); + float NdotH = max(H.z, 0.0); + float VdotH = max(dot(V, H), 0.0); + + if (NdotL > 0.0) + { + float G = GeometrySmith(N, V, L, roughness); + float G_Vis = (G * VdotH) / (NdotH * NdotV); + float Fc = pow(1.0 - VdotH, 5.0); + + A += (1.0 - Fc) * G_Vis; + B += Fc * G_Vis; + } + } + + A /= float(SAMPLE_COUNT); + B /= float(SAMPLE_COUNT); + + imageStore(colorBuffer, ivec2(gl_GlobalInvocationID.xy), vec4(A, B, 0.0, 1.0)); +} + +float RadicalInverse_VdC(uint bits) +{ + bits = (bits << 16u) | (bits >> 16u); + bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); + bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); + bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); + bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); + return float(bits) * 2.3283064365386963e-10; // / 0x100000000 +} +vec2 Hammersley(uint i, uint N) +{ + return vec2(float(i)/float(N), RadicalInverse_VdC(i)); +} + +vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness) +{ + float a = roughness*roughness; + + float phi = 2.0 * PI * Xi.x; + float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a*a - 1.0) * Xi.y)); + float sinTheta = sqrt(1.0 - cosTheta*cosTheta); + + // from spherical coordinates to cartesian coordinates + vec3 H = vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta); + + // from tangent-space vector to world-space sample vector + vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 tangent = normalize(cross(up, N)); + vec3 bitangent = cross(N, tangent); + + vec3 sampleVec = tangent * H.x + bitangent * H.y + N * H.z; + return normalize(sampleVec); +} + +float GeometrySchlickGGX(float NdotV, float roughness) +{ + float a = roughness; + float k = (a * a) / 2.0; + float nom = NdotV; + float denom = NdotV * (1.0 - k) + k; + return nom / denom; +} + +float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) +{ + float NdotV = max(dot(N, V), 0.0); + float NdotL = max(dot(N, L), 0.0); + float ggx2 = GeometrySchlickGGX(NdotV, roughness); + float ggx1 = GeometrySchlickGGX(NdotL, roughness); + return ggx1 * ggx2; +} diff --git a/wadsrc/static/shaders/lightprobe/comp_irradiance_convolute.glsl b/wadsrc/static/shaders/lightprobe/comp_irradiance_convolute.glsl new file mode 100644 index 000000000..e293a569d --- /dev/null +++ b/wadsrc/static/shaders/lightprobe/comp_irradiance_convolute.glsl @@ -0,0 +1,50 @@ + +layout(local_size_x = 16, local_size_y = 16) in; +layout(binding = 0, rgba16f) writeonly uniform image2D colorBuffer; +layout(binding = 1) uniform samplerCube EnvironmentMap; + +layout(push_constant) uniform PushConstants +{ + vec4 topLeft; + vec4 bottomRight; +}; + +const float PI = 3.14159265359; + +void main() +{ + uvec2 colorBufferSize = imageSize(colorBuffer); + if (gl_GlobalInvocationID.x >= colorBufferSize.x || gl_GlobalInvocationID.y >= colorBufferSize.y) + return; + + vec2 uv = (vec2(gl_GlobalInvocationID.xy) + 0.5) / vec2(colorBufferSize); + vec3 FragPos = mix(topLeft.xyz, bottomRight.xyz, uv); + + vec3 normal = normalize(FragPos); + vec3 right = normalize(cross(vec3(0.0, 1.0, 0.0), normal)); + vec3 up = normalize(cross(normal, right)); + + float sampleDelta = 0.025; + float sampleCount = 0.0; + + vec4 irradiance = vec4(0.0); + + for (float phi = 0.0; phi < 2.0 * PI; phi += sampleDelta) + { + for (float theta = 0.0; theta < 0.5 * PI; theta += sampleDelta) + { + // spherical to cartesian (in tangent space) + vec3 tangentSample = vec3(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta)); + + // tangent space to world + vec3 sampleVec = tangentSample.x * right + tangentSample.y * up + tangentSample.z * normal; + + irradiance += texture(EnvironmentMap, sampleVec) * cos(theta) * sin(theta); + sampleCount++; + } + } + + irradiance = PI * irradiance * (1.0 / sampleCount); + + imageStore(colorBuffer, ivec2(gl_GlobalInvocationID.xy), irradiance); +} diff --git a/wadsrc/static/shaders/lightprobe/comp_prefilter_convolute.glsl b/wadsrc/static/shaders/lightprobe/comp_prefilter_convolute.glsl new file mode 100644 index 000000000..15f646c20 --- /dev/null +++ b/wadsrc/static/shaders/lightprobe/comp_prefilter_convolute.glsl @@ -0,0 +1,87 @@ + +layout(local_size_x = 16, local_size_y = 16) in; +layout(binding = 0, rgba16f) writeonly uniform image2D colorBuffer; +layout(binding = 1) uniform samplerCube EnvironmentMap; + +layout(push_constant) uniform PushConstants +{ + vec4 topLeft; + vec4 bottomRight; + float roughness; + float padding1, padding2, padding3; +}; + +const float PI = 3.14159265359; + +float RadicalInverse_VdC(uint bits); +vec2 Hammersley(uint i, uint N); +vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness); + +void main() +{ + uvec2 colorBufferSize = imageSize(colorBuffer); + if (gl_GlobalInvocationID.x >= colorBufferSize.x || gl_GlobalInvocationID.y >= colorBufferSize.y) + return; + + vec2 uv = (vec2(gl_GlobalInvocationID.xy) + 0.5) / vec2(colorBufferSize); + vec3 FragPos = mix(topLeft.xyz, bottomRight.xyz, uv); + + vec3 normal = normalize(FragPos); + + const int SAMPLE_COUNT = 1024; + + float totalWeight = 0.0; + vec4 prefilteredColor = vec4(0.0); + + for (int i = 0; i < SAMPLE_COUNT; i++) + { + vec2 Xi = Hammersley(uint(i), uint(SAMPLE_COUNT)); + vec3 H = ImportanceSampleGGX(Xi, normal, roughness); + vec3 L = normalize(2.0 * dot(normal, H) * H - normal); + + float NdotL = clamp(dot(normal, L), 0.0, 1.0); + if(NdotL > 0.0) + { + prefilteredColor += texture(EnvironmentMap, L) * NdotL; + totalWeight += NdotL; + } + } + + prefilteredColor = prefilteredColor / totalWeight; + + imageStore(colorBuffer, ivec2(gl_GlobalInvocationID.xy), prefilteredColor); +} + +float RadicalInverse_VdC(uint bits) +{ + bits = (bits << 16u) | (bits >> 16u); + bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); + bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); + bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); + bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); + return float(bits) * 2.3283064365386963e-10; // / 0x100000000 +} +vec2 Hammersley(uint i, uint N) +{ + return vec2(float(i)/float(N), RadicalInverse_VdC(i)); +} + +vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness) +{ + float a = roughness*roughness; + + float phi = 2.0 * PI * Xi.x; + float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a*a - 1.0) * Xi.y)); + float sinTheta = sqrt(1.0 - cosTheta*cosTheta); + + // from spherical coordinates to cartesian coordinates + vec3 H = vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta); + + // from tangent-space vector to world-space sample vector + vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 tangent = normalize(cross(up, N)); + vec3 bitangent = cross(N, tangent); + + vec3 sampleVec = tangent * H.x + bitangent * H.y + N * H.z; + return normalize(sampleVec); +} From 5b1f0fdc86a8b91e41938c8c8ece680b053bfa36 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 4 Oct 2024 18:31:04 +0200 Subject: [PATCH 341/414] bFriendly should not be set from scripts because this omits needed bookkeeping. --- wadsrc/static/zscript/actors/attacks.zs | 2 +- wadsrc/static/zscript/actors/doom/painelemental.zs | 2 +- wadsrc/static/zscript/actors/strife/acolyte.zs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wadsrc/static/zscript/actors/attacks.zs b/wadsrc/static/zscript/actors/attacks.zs index 1965be0b1..c1cb445e1 100644 --- a/wadsrc/static/zscript/actors/attacks.zs +++ b/wadsrc/static/zscript/actors/attacks.zs @@ -250,7 +250,7 @@ extend class Actor else if (originator.player) { // A player always spawns a monster friendly to him - mo.bFriendly = true; + mo.A_SetFriendly(true); mo.SetFriendPlayer(originator.player); Actor attacker=originator.player.attacker; diff --git a/wadsrc/static/zscript/actors/doom/painelemental.zs b/wadsrc/static/zscript/actors/doom/painelemental.zs index 244261303..75f90a02a 100644 --- a/wadsrc/static/zscript/actors/doom/painelemental.zs +++ b/wadsrc/static/zscript/actors/doom/painelemental.zs @@ -218,7 +218,7 @@ extend class Actor { if (target && IsFriend(target)) { // And I thought you were my friend! - bFriendly = false; + A_SetFriendly(false); } A_NoBlocking(); A_PainShootSkull(spawntype, angle + 90); diff --git a/wadsrc/static/zscript/actors/strife/acolyte.zs b/wadsrc/static/zscript/actors/strife/acolyte.zs index c86a6e5d3..b982d8429 100644 --- a/wadsrc/static/zscript/actors/strife/acolyte.zs +++ b/wadsrc/static/zscript/actors/strife/acolyte.zs @@ -118,7 +118,7 @@ class Acolyte : StrifeHumanoid void A_BeShadowyFoe() { A_SetRenderStyle(HR_SHADOW, STYLE_Translucent); - bFriendly = false; + A_SetFriendly(false); } //============================================================================ From ccbebfcf34b761b94cb504a50b6dd39b922c33eb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 4 Oct 2024 18:33:53 +0200 Subject: [PATCH 342/414] fix kill count management in CopyFriendliness when used on corpses. --- src/playsim/p_mobj.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 0cbcb813b..8d34e6c73 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -803,7 +803,7 @@ DEFINE_ACTION_FUNCTION(AActor, GiveInventoryType) void AActor::CopyFriendliness (AActor *other, bool changeTarget, bool resetHealth) { - Level->total_monsters -= CountsAsKill(); + if (health > 0) Level->total_monsters -= CountsAsKill(); TIDtoHate = other->TIDtoHate; LastLookActor = other->LastLookActor; LastLookPlayerNumber = other->LastLookPlayerNumber; @@ -818,7 +818,7 @@ void AActor::CopyFriendliness (AActor *other, bool changeTarget, bool resetHealt LastHeard = target = other->target; } if (resetHealth) health = SpawnHealth(); - Level->total_monsters += CountsAsKill(); + if (health > 0) Level->total_monsters += CountsAsKill(); } DEFINE_ACTION_FUNCTION(AActor, CopyFriendliness) From 2b2e85005c8299ac8736f07056b645375bd83f9a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 4 Oct 2024 18:34:32 +0200 Subject: [PATCH 343/414] fix MBF21 ClearCountItem --- src/gamedata/d_dehacked.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index 69874529b..8ddcc7935 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -3952,7 +3952,7 @@ void ClearCountitem(AActor* a) { if (a->flags & MF_COUNTITEM) { - a->flags |= MF_COUNTITEM; + a->flags &= ~MF_COUNTITEM; a->Level->total_items--; } } From f0676cdf019f65f17ea917acb3f65be08718a00f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 5 Oct 2024 10:22:05 +0200 Subject: [PATCH 344/414] fixed a few memory leaks --- libraries/ZWidget/src/widgets/lineedit/lineedit.cpp | 2 ++ src/common/scripting/core/types.cpp | 3 ++- src/common/startscreen/startscreen.cpp | 7 +++++++ src/common/startscreen/startscreen.h | 2 +- src/common/widgets/widgetresourcedata.cpp | 1 + src/d_main.cpp | 2 ++ 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp index 5c90e68e1..9065ccde4 100644 --- a/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp +++ b/libraries/ZWidget/src/widgets/lineedit/lineedit.cpp @@ -18,6 +18,8 @@ LineEdit::LineEdit(Widget* parent) : Widget(parent) LineEdit::~LineEdit() { + delete timer; + delete scroll_timer; } bool LineEdit::IsReadOnly() const diff --git a/src/common/scripting/core/types.cpp b/src/common/scripting/core/types.cpp index 8e13dcc52..b70783f3e 100644 --- a/src/common/scripting/core/types.cpp +++ b/src/common/scripting/core/types.cpp @@ -330,7 +330,8 @@ void PType::StaticInit() TypeVoidPtr = NewPointer(TypeVoid, false); TypeRawFunction = new PPointer; - TypeRawFunction->mDescriptiveName = "Raw Function Pointer"; + TypeRawFunction->mDescriptiveName = "Raw Function Pointer"; + TypeTable.AddType(TypeRawFunction, NAME_None); TypeVMFunction = NewPointer(NewStruct("VMFunction", nullptr, true)); TypeColorStruct = NewStruct("@ColorStruct", nullptr); //This name is intentionally obfuscated so that it cannot be used explicitly. The point of this type is to gain access to the single channels of a color value. TypeStringStruct = NewStruct("Stringstruct", nullptr, true); diff --git a/src/common/startscreen/startscreen.cpp b/src/common/startscreen/startscreen.cpp index b71949f46..56a179526 100644 --- a/src/common/startscreen/startscreen.cpp +++ b/src/common/startscreen/startscreen.cpp @@ -372,6 +372,13 @@ FStartScreen* GetGameStartScreen(int max_progress) return nullptr; } +FStartScreen::~FStartScreen() +{ + if (StartupTexture) delete StartupTexture; + if (HeaderTexture) delete HeaderTexture; + if (NetTexture) delete NetTexture; +} + //========================================================================== // // ST_Util_ClearBlock diff --git a/src/common/startscreen/startscreen.h b/src/common/startscreen/startscreen.h index afac6c759..c90d092f9 100644 --- a/src/common/startscreen/startscreen.h +++ b/src/common/startscreen/startscreen.h @@ -70,7 +70,7 @@ protected: FGameTexture* NetTexture = nullptr; public: FStartScreen(int maxp) { MaxPos = maxp; } - virtual ~FStartScreen() = default; + virtual ~FStartScreen(); void Render(bool force = false); bool Progress(int); void NetProgress(int count); diff --git a/src/common/widgets/widgetresourcedata.cpp b/src/common/widgets/widgetresourcedata.cpp index 85ee3e249..13f151932 100644 --- a/src/common/widgets/widgetresourcedata.cpp +++ b/src/common/widgets/widgetresourcedata.cpp @@ -21,6 +21,7 @@ void InitWidgetResources(const char* filename) void CloseWidgetResources() { if (WidgetResources) delete WidgetResources; + WidgetResources = nullptr; } static std::vector LoadFile(const char* name) diff --git a/src/d_main.cpp b/src/d_main.cpp index fb25fa00f..c00f2231c 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -161,6 +161,7 @@ bool M_SetSpecialMenu(FName& menu, int param); // game specific checks const FIWADInfo *D_FindIWAD(TArray &wadfiles, const char *iwad, const char *basewad); void InitWidgetResources(const char* basewad); +void CloseWidgetResources(); // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- @@ -3844,6 +3845,7 @@ int GameMain() M_SaveDefaultsFinal(); DeleteStartupScreen(); C_UninitCVars(); // must come last so that nothing will access the CVARs anymore after deletion. + CloseWidgetResources(); delete Args; Args = nullptr; return ret; From 6b5be653dce78e1ab5bf7a7bb37c3fefc14c05a6 Mon Sep 17 00:00:00 2001 From: Blue Shadow Date: Sat, 5 Oct 2024 10:40:07 +0300 Subject: [PATCH 345/414] - set a default value of 1.0 for `MissileChanceMult` property --- wadsrc/static/zscript/actors/actor.zs | 1 + 1 file changed, 1 insertion(+) diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index a29b912c5..5c4dc376e 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -407,6 +407,7 @@ class Actor : Thinker native RenderStyle 'Normal'; Alpha 1; MinMissileChance 200; + MissileChanceMult 1.0; MeleeRange 64 - MELEEDELTA; MaxDropoffHeight 24; MaxStepHeight 24; From 413aefb0abce28f7123ac33291fe28d736ae1302 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 5 Oct 2024 12:36:55 +0200 Subject: [PATCH 346/414] added CVAR to select the preferred MOD player and SNDINFO option to set it per song. --- bin/windows/zmusic/include/zmusic.h | 1 + src/common/audio/music/music.cpp | 9 +++++++++ src/common/audio/music/s_music.h | 1 + src/sound/s_advsound.cpp | 21 +++++++++++++++++++-- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/bin/windows/zmusic/include/zmusic.h b/bin/windows/zmusic/include/zmusic.h index 7422b58da..90cb80e25 100644 --- a/bin/windows/zmusic/include/zmusic.h +++ b/bin/windows/zmusic/include/zmusic.h @@ -151,6 +151,7 @@ typedef enum EIntConfigKey_ zmusic_snd_mididevice, zmusic_snd_outputrate, + zmusic_mod_preferredplayer, NUM_ZMUSIC_INT_CONFIGS } EIntConfigKey; diff --git a/src/common/audio/music/music.cpp b/src/common/audio/music/music.cpp index 01b3a5da3..9664c5458 100644 --- a/src/common/audio/music/music.cpp +++ b/src/common/audio/music/music.cpp @@ -74,6 +74,7 @@ float relative_volume = 1.f; float saved_relative_volume = 1.0f; // this could be used to implement an ACS FadeMusic function MusicVolumeMap MusicVolumes; MidiDeviceMap MidiDevices; +TMap ModPlayers; static int DefaultFindMusic(const char* fn) { @@ -93,6 +94,7 @@ EXTERN_CVAR(Float, fluid_gain) CVAR(Bool, mus_calcgain, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // changing this will only take effect for the next song. CVAR(Bool, mus_usereplaygain, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // changing this will only take effect for the next song. +CVAR(Int, mod_preferred_player, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)// toggle between libXMP and Dumb. Unlike other sound CVARs this is not directly mapped to ZMusic's config. // CODE -------------------------------------------------------------------- @@ -769,6 +771,7 @@ bool S_ChangeMusic(const char* musicname, int order, bool looping, bool force) { int lumpnum = mus_cb.FindMusic(musicname); MidiDeviceSetting* devp = MidiDevices.CheckKey(lumpnum); + int* mplay = ModPlayers.CheckKey(lumpnum); auto volp = MusicVolumes.CheckKey(lumpnum); if (volp) @@ -781,6 +784,12 @@ bool S_ChangeMusic(const char* musicname, int order, bool looping, bool force) CheckReplayGain(musicname, devp ? (EMidiDevice)devp->device : MDEV_DEFAULT, devp ? devp->args.GetChars() : ""); } auto mreader = GetMusicReader(reader); // this passes the file reader to the newly created wrapper. + int mod_player = mplay? *mplay : *mod_preferred_player; + int scratch; + + // This config var is only effective when opening a music stream so there's no need for active synchronization. Setting it here is sufficient. + // Ideally this should have been a parameter to ZMusic_OpenSong, but that would have necessitated an API break. + ChangeMusicSettingInt(zmusic_mod_preferredplayer, mus_playing.handle, mod_player, &scratch); mus_playing.handle = ZMusic_OpenSong(mreader, devp ? (EMidiDevice)devp->device : MDEV_DEFAULT, devp ? devp->args.GetChars() : ""); if (mus_playing.handle == nullptr) { diff --git a/src/common/audio/music/s_music.h b/src/common/audio/music/s_music.h index 629f6f95d..3c5a092cc 100644 --- a/src/common/audio/music/s_music.h +++ b/src/common/audio/music/s_music.h @@ -74,6 +74,7 @@ struct MidiDeviceSetting typedef TMap MidiDeviceMap; typedef TMap MusicVolumeMap; +extern TMap ModPlayers; extern MidiDeviceMap MidiDevices; extern MusicVolumeMap MusicVolumes; extern MusicCallbacks mus_cb; diff --git a/src/sound/s_advsound.cpp b/src/sound/s_advsound.cpp index f48e6855e..8717c4b9e 100644 --- a/src/sound/s_advsound.cpp +++ b/src/sound/s_advsound.cpp @@ -147,6 +147,7 @@ enum SICommands SI_EDFOverride, SI_Attenuation, SI_PitchSet, + SI_ModPlayer, }; // Blood was a cool game. If Monolith ever releases the source for it, @@ -236,7 +237,8 @@ static const char *SICommandStrings[] = "$edfoverride", "$attenuation", "$pitchset", - NULL + "$modplayer", + nullptr }; static TArray SavedPlayerSounds; @@ -571,6 +573,7 @@ void S_ClearSoundData() MusicAliases.Clear(); MidiDevices.Clear(); HexenMusic.Clear(); + ModPlayers.Clear(); } //========================================================================== @@ -1109,10 +1112,24 @@ static void S_AddSNDINFO (int lump) sc.RestorePos(save); sc.MustGetString(); } - if (lumpnum >= 0) MidiDevices[lumpnum] = devset; + if (lumpnum >= 0) MidiDevices.Insert(lumpnum, devset); } break; + case SI_ModPlayer: { + sc.MustGetString(); + int lumpnum = mus_cb.FindMusic(sc.String); + int player; + FScanner::SavedPos save = sc.SavePos(); + + sc.MustGetString(); + if (sc.Compare("XMP") || sc.Compare("libXMP")) player = 0; + else if (sc.Compare("dumb") || sc.Compare("libdumb")) player = 1; + else sc.ScriptError("Unknown Module player %s\n", sc.String); + if (lumpnum >= 0) ModPlayers.Insert(lumpnum, player); + } + break; + case SI_IfDoom: //also Chex case SI_IfStrife: case SI_IfHeretic: From 2e795bebb40c811ac744bbb4cc36dcf21ad7aecd Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 5 Oct 2024 12:53:21 +0200 Subject: [PATCH 347/414] added a menu option for switching module players. --- wadsrc/static/language.0 | 1294 +++++++++++++++++++------------------ wadsrc/static/menudef.txt | 6 + 2 files changed, 660 insertions(+), 640 deletions(-) diff --git a/wadsrc/static/language.0 b/wadsrc/static/language.0 index 8dc54bbd1..59341001d 100644 --- a/wadsrc/static/language.0 +++ b/wadsrc/static/language.0 @@ -1,9 +1,9 @@ -default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,ja jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr,uk,bg -,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,,, +default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hr,hu,it,ja jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr,uk,bg +,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,,,, Press Y or N.,PRESSYN,,,,Stiskni Y nebo N.,Tryk på Y eller N.,Drücke Y oder N.,"Πάτα Y ή N -",Premu Y aŭ N.,Presiona Y o N.,,Paina Y tai N.,Appuyez sur Y ou N.,Nyomj Y-t vagy N-t.,Premi Y oppure N.,YかNで答えろ,Y키 또는 N키를 누르시오.,Druk op Y of N.,Trykk på Y eller N.,Wciśnij Y lub N.,Aperte Y ou N.,Carrega Y ou N.,Apasă Y sau N.,Нажмите Y или N.,Притисните Y или N.,Tryck på Y eller N.,Y veya N tuşuna basın.,Натисніть Y або N.,Натисни Y или N. -Yes,TXT_YES,,,,Ano,Ja,Ja,Ναι,Jes,Sí,,Kyllä,Oui,Igen,Si,はい,네,Ja,Ja,Tak,Sim,,Da,Да,Да,Ja,Evet,Так,Да -No,TXT_NO,,,,Ne,Nej,Nein,Όχι,Ne,,,Ei,Non,Nem,,いいえ,아니요,Nee,Nei,Nie,Não,,Nu,Нет,Не,Nej,Hayır,Ні,Не +",Premu Y aŭ N.,Presiona Y o N.,,Paina Y tai N.,Appuyez sur Y ou N.,Pritisni Y ili N.,Nyomj Y-t vagy N-t.,Premi Y oppure N.,YかNで答えろ,Y키 또는 N키를 누르시오.,Druk op Y of N.,Trykk på Y eller N.,Wciśnij Y lub N.,Aperte Y ou N.,Carrega Y ou N.,Apasă Y sau N.,Нажмите Y или N.,Притисните Y или N.,Tryck på Y eller N.,Y veya N tuşuna basın.,Натисніть Y або N.,Натисни Y или N. +Yes,TXT_YES,,,,Ano,Ja,Ja,Ναι,Jes,Sí,,Kyllä,Oui,Da,Igen,Si,はい,네,Ja,Ja,Tak,Sim,,Da,Да,Да,Ja,Evet,Так,Да +No,TXT_NO,,,,Ne,Nej,Nein,Όχι,Ne,,,Ei,Non,Ne,Nem,,いいえ,아니요,Nee,Nei,Nie,Não,,Nu,Нет,Не,Nej,Hayır,Ні,Не "You can't save if you aren't playing! Press a key.",SAVEDEAD,,,,"Mimo hru nelze ukládat! @@ -14,15 +14,17 @@ Tryk på en tast.","Du kannst nicht speichern, wenn du nicht spielst. Drücke eine Taste","Δεν μπορείς να αποθηκέυσης αμα δεν παίζεις ! -Πάτα ενα κουμπί.","Vi ne povas konservi se vi ne ludas! +Πάτα ενα κουμπί.","Vi ne povas konservi kiam vi ne estas ludanta! -Premu klavon.","¡No puedes guardar si no estás jugando! +Premu ajnan klavon.","¡No puedes guardar si no estás jugando! Presiona una tecla.",,"Et voi tallentaa, jos et ole pelissä! Paina jotain näppäintä.","Vous ne pouvez pas sauvegarder si vous ne jouez pas! -Appuyez sur une touche.","Nem tudsz menteni játékon kívül! +Appuyez sur une touche.","Ne možeš spremiti ako ne igraš! + +Pritisni tipku.","Nem tudsz menteni játékon kívül! Nyomj meg egy gombot.","Non puoi salvare se non stai giocando! @@ -53,8 +55,8 @@ Bir tuşa bas.","Ви не можете зберегти гру, не почав Натисніть будь яку клавішу.","Не може да запазите играта, ако не играете! Натиснете клавиш." -Do you really want to do this?,SAFEMESSAGE,,,,Vážně to chceš udělat?,Vil du virkelig gøre dette?,Möchtest du das wirklich tun?,Θέλετε πραγματικά να το κάνετε αυτό;,Ĉu vi vere volas fari tion?,¿Realmente quieres hacer eso?,,Haluatko varmasti tehdä tämän?,Voulez-vous vraiment faire ça?,Biztos ezt akarod tenni?,Sei sicuro di volerlo fare?,本当に実行するのか?,정말로 정하시겠습니까?,Wil je dit echt doen?,Vil du virkelig gjøre dette?,Naprawdę chcesz to zrobić?,Você deseja mesmo fazer isso?,Desejas mesmo fazer isso?,Ești sigur că vrei să faci asta?,Вы уверены?,Да ли заиста желите то да урадите?,Vill du verkligen göra det här?,Bunu gerçekten yapmak istiyor musun?,Ви дійсно хочете цього?,Наистина ли искаш да направиш това? -Not set,NOTSET,,,,Není nastavené,Ikke indstillet,Nicht gesetzt,Δεν έχει οριστεί,Ne agordita,No asignado,,Ei asetettu,Pas paramétré,Nincs beállítva,Non assegnato,セットされてない,정하지 않음,Niet ingesteld,Ikke innstilt,Nie ustawiono,Não definido,,Nesetat,Не задан,Није намештено,Inte inställd,Ayarlanmamış,Не встановлено,Не е зададено +Do you really want to do this?,SAFEMESSAGE,,,,Vážně to chceš udělat?,Vil du virkelig gøre dette?,Möchtest du das wirklich tun?,Θέλετε πραγματικά να το κάνετε αυτό;,Ĉu vi vere volas fari tion?,¿Realmente quieres hacer eso?,,Haluatko varmasti tehdä tämän?,Voulez-vous vraiment faire ça?,Želiš li ovo stvarno učiniti?,Biztos ezt akarod tenni?,Sei sicuro di volerlo fare?,本当に実行するのか?,정말로 정하시겠습니까?,Wil je dit echt doen?,Vil du virkelig gjøre dette?,Naprawdę chcesz to zrobić?,Você deseja mesmo fazer isso?,Desejas mesmo fazer isso?,Ești sigur că vrei să faci asta?,Вы уверены?,Да ли заиста желите то да урадите?,Vill du verkligen göra det här?,Bunu gerçekten yapmak istiyor musun?,Ви дійсно хочете цього?,Наистина ли искаш да направиш това? +Not set,NOTSET,,,,Není nastavené,Ikke indstillet,Nicht gesetzt,Δεν έχει οριστεί,Ne agordita,No asignado,,Ei asetettu,Pas paramétré,Nije postavljeno,Nincs beállítva,Non assegnato,セットされてない,정하지 않음,Niet ingesteld,Ikke innstilt,Nie ustawiono,Não definido,,Nesetat,Не задан,Није намештено,Inte inställd,Ayarlanmamış,Не встановлено,Не е зададено "Quicksave over your game named '%s'? @@ -85,7 +87,11 @@ Paina Y tai N.","Sauvegarde rapide sur le fichier '%s'? -Appuyez sur Y ou N.","Felülírod az alábbi mentésedet: +Appuyez sur Y ou N.","Brzo spremiti preko tvoje igre pod nazivom + +'%s'? + +Pritisni Y ili N.","Felülírod az alábbi mentésedet: '%s'? @@ -175,7 +181,11 @@ Paina Y tai N.","Voulez-vous charger la sauvegarde '%s'? -Appuyez sur Y ou N.","Betöltöd az alábbi mentésedet: +Appuyez sur Y ou N.","Želiš li brzo učitati igru pod nazivom + +'%s'? + +Pritisni Y ili N.","Betöltöd az alábbi mentésedet: '%s'? @@ -235,646 +245,650 @@ Y veya N tuşuna basın.","Завантажити швидке збережен '%s'? Натисни Y или N." -%s cheats,TXT_X_CHEATS,This is a gender sensitive message where %s represents the player,,,%s podvádí,%s snyder,%s schummelt,@[art_gr] %s απατάει,%s trompas,%s hace trampas,%s hace trampa,%s huijaa,%s triche.,%s csal,%s imbroglia,%s はチート使用,%s 이(가) 치트를 사용 함,%s bedriegt,%s jukser,%s oszukuje,%s está trapaceando,%s está a fazer batota,%s trișează,%s использует чит-коды,%s вара,%s fuskar,%s hileleri,%s чітерить,%s измамен код -Messages: OFF,MSGOFF,,,,Oznámení ZAP.,Meddelelser: FRA,Meldungen AUS,Μηνύματα ΚΛΕΙΣΤΑ,Mesaĝoj: MALŜALTITA,Mensajes DESACTIVADOS,,Viestit POIS PÄÄLTÄ,Messages désactivés.,Üzenetek: KI,Messaggi DISATTIVATI,メッセージ: オフ,메시지 끔,Berichten UIT,Meldinger: AV,Wiadomości WYŁĄCZONE,Mensagens DESATIVADAS,,Mesaje OPRITE,Сообщения ОТКЛЮЧЕНЫ,Поруке ИСКЉУЧЕНЕ,Meddelanden: Av,Mesajlar: KAPALI,Повідомлення: ВИМКНЕНІ,Съобщения: Изкл -Messages: ON,MSGON,,,,Oznámení VYP.,Meddelelser: TIL,Meldungen AN,Μηνύματα ΑΝΟΙΧΤΑ,Mesaĝoj: ŜALTITA,Mensajes ACTIVADOS,,Viestit PÄÄLLÄ,Messages activés.,Üzenetek: BE,Messaggi ATTIVATI,メッセージ: オン,메시지 켬,Berichten AAN,Meldinger: PÅ,Wiadomości WŁĄCZONE,Mensagens ATIVADAS,,Mesaje PORNITE,Сообщения ВКЛЮЧЕНЫ,Поруке УКЉУЧЕНЕ,Meddelanden: På,Mesajlar: AÇIK,Повідомлення: УВІМКНЕНІ,Съобщения: Вкл -Say:,TXT_SAY,,,,Říct:,Sig:,Sage:,Πές:,Diri:,,,Sano:,Parler:,Üzenet:,Parla:,発言:,,Zeg:,Si:,Mów:,Dizer:,Diz:,Vorbește:,Чат:,Пиши:,Säg:,Söyle:,Чат:,Пиши: -Press any key or click anywhere in the window to quit.,TXT_QUITENDOOM,,,,"Pro ukončení stiskni libovolnou klávesu, nebo klikni kdekoliv v okně.",Tryk på en vilkårlig tast eller klik et vilkårligt sted i vinduet for at afslutte.,Drücke eine Taste oder klicke mit der Maus ins Fenster zum Beenden.,Πάτα οποιοδήποτε πλήκτρο ή πάτα οπουδήποτε για να κάνεις έξοδο,Premu ajnan klavon aŭ alklaku ie ajn en la fenestro por forlasi.,Presiona una tecla o haz clic en cualquier lugar de la ventana para salir.,,Paina mitä tahansa näppäintä tai napsauta minne tahansa ikkunaa lopettaaksesi.,Appuyez sur une touche ou cliquez pour quitter.,Nyomjon egy gombot vagy kattintson valahova a kilépéshez.,Premi un qualunque tasto o fai un click ovunque nella finestra per uscire.,何かのキーを押すか、ウィンドウのどこかをクリックすると終了する。,아무 키를 누르거나 아무 곳이나 클릭하면 종료됩니다.,Druk op een willekeurige toets of klik ergens in het venster om te stoppen.,Trykk på en hvilken som helst tast eller klikk hvor som helst i vinduet for å avslutte.,Wciśnij dowolny klawisz lub kliknij myszką by wyjść.,Aperte uma tecla ou clique em qualquer lugar na janela para sair.,Carrega numa tecla ou clique em qualquer lugar na janela para sair.,Apasă orice tastă sau apasă click oriunde în fereastră pentru a ieși.,"Нажмите любую клавишу или нажмите по окну, чтобы выйти.",Притисните било који тастер или кликните било где на екрану да одустанете.,Tryck på någon tangent eller klicka någonstans i fönstret för att avsluta.,Çıkmak için herhangi bir tuşa basın veya pencerede herhangi bir yere tıklayın.,"Натисніть будь яку клавішу чи натисніть по вікну, щоб вийти.","Натиснете който и да е клавиш или щракнете където и да е в прозореца, за да излезете." -,,Savegame,,,,,,,,,,,,,,,,,,,,,,,,,,, -,NEWSAVE,,,,,,,<Νέο παιχνίδι αποθήκευσης>,,,,,,<Új mentés>,,<新規セーブ>,<새로운 게임 저장>,,,,,,,<Новое сохранение>,<Нова сачувана игра>,,,<Нове збереження>,<Нов запис на играта> -Game saved.,GGSAVED,,,,Hra uložena.,Spillet er gemt.,Spielstand gespeichert.,Παχνίδι αποθηκέυτηκε.,Ludado konservita.,Partida guardada.,,Peli tallennettu.,Partie sauvegardée.,Játék mentve.,Partita salvata.,セーブ完了。,게임이 저장됨.,Spel opgeslagen.,Spillet er lagret.,Gra zapisana.,Jogo salvo.,Jogo gravado.,Joc salvat.,Игра сохранена.,Игра сачувана.,Spelet är sparat.,Oyun kaydedildi.,Гру збережено.,Играта е записана -Time,SAVECOMMENT_TIME,,,,Čas,Tid,Zeit,Χρόνος,Tempo,Tiempo,,Aika,Temps,Idő,Tempo,"時間 +%s cheats,TXT_X_CHEATS,This is a gender sensitive message where %s represents the player,,,%s podvádí,%s snyder,%s schummelt,@[art_gr] %s απατάει,%s trompas,%s hace trampas,%s hace trampa,%s huijaa,%s triche.,%s vara,%s csal,%s imbroglia,%s はチート使用,%s 이(가) 치트를 사용 함,%s bedriegt,%s jukser,%s oszukuje,%s está trapaceando,%s está a fazer batota,%s trișează,%s использует чит-коды,%s вара,%s fuskar,%s hileleri,%s чітерить,%s измамен код +Messages: OFF,MSGOFF,,,,Oznámení ZAP.,Meddelelser: FRA,Meldungen AUS,Μηνύματα ΚΛΕΙΣΤΑ,Mesaĝoj: MALŜALTITA,Mensajes DESACTIVADOS,,Viestit POIS PÄÄLTÄ,Messages désactivés.,Poruke: ISKLJ.,Üzenetek: KI,Messaggi DISATTIVATI,メッセージ: オフ,메시지 끔,Berichten UIT,Meldinger: AV,Wiadomości WYŁĄCZONE,Mensagens DESATIVADAS,,Mesaje OPRITE,Сообщения ОТКЛЮЧЕНЫ,Поруке ИСКЉУЧЕНЕ,Meddelanden: Av,Mesajlar: KAPALI,Повідомлення: ВИМКНЕНІ,Съобщения: Изкл +Messages: ON,MSGON,,,,Oznámení VYP.,Meddelelser: TIL,Meldungen AN,Μηνύματα ΑΝΟΙΧΤΑ,Mesaĝoj: ŜALTITA,Mensajes ACTIVADOS,,Viestit PÄÄLLÄ,Messages activés.,Poruke: UKLJ.,Üzenetek: BE,Messaggi ATTIVATI,メッセージ: オン,메시지 켬,Berichten AAN,Meldinger: PÅ,Wiadomości WŁĄCZONE,Mensagens ATIVADAS,,Mesaje PORNITE,Сообщения ВКЛЮЧЕНЫ,Поруке УКЉУЧЕНЕ,Meddelanden: På,Mesajlar: AÇIK,Повідомлення: УВІМКНЕНІ,Съобщения: Вкл +Say:,TXT_SAY,,,,Říct:,Sig:,Sage:,Πές:,Diri:,,,Sano:,Parler:,Reci:,Üzenet:,Parla:,発言:,,Zeg:,Si:,Mów:,Dizer:,Diz:,Vorbește:,Чат:,Пиши:,Säg:,Söyle:,Чат:,Пиши: +Press any key or click anywhere in the window to quit.,TXT_QUITENDOOM,,,,"Pro ukončení stiskni libovolnou klávesu, nebo klikni kdekoliv v okně.",Tryk på en vilkårlig tast eller klik et vilkårligt sted i vinduet for at afslutte.,Drücke eine Taste oder klicke mit der Maus ins Fenster zum Beenden.,Πάτα οποιοδήποτε πλήκτρο ή πάτα οπουδήποτε για να κάνεις έξοδο,Premu ajnan klavon aŭ alklaku ie ajn en la fenestro por forlasi.,Presiona una tecla o haz clic en cualquier lugar de la ventana para salir.,,Paina mitä tahansa näppäintä tai napsauta minne tahansa ikkunaa lopettaaksesi.,Appuyez sur une touche ou cliquez pour quitter.,Pritisni bilo koju tipku ili klikni bilo gdje na prozoru da izađeš.,Nyomjon egy gombot vagy kattintson valahova a kilépéshez.,Premi un qualunque tasto o fai un click ovunque nella finestra per uscire.,何かのキーを押すか、ウィンドウのどこかをクリックすると終了する。,아무 키를 누르거나 아무 곳이나 클릭하면 종료됩니다.,Druk op een willekeurige toets of klik ergens in het venster om te stoppen.,Trykk på en hvilken som helst tast eller klikk hvor som helst i vinduet for å avslutte.,Wciśnij dowolny klawisz lub kliknij myszką by wyjść.,Aperte uma tecla ou clique em qualquer lugar na janela para sair.,Carrega numa tecla ou clique em qualquer lugar na janela para sair.,Apasă orice tastă sau apasă click oriunde în fereastră pentru a ieși.,"Нажмите любую клавишу или нажмите по окну, чтобы выйти.",Притисните било који тастер или кликните било где на екрану да одустанете.,Tryck på någon tangent eller klicka någonstans i fönstret för att avsluta.,Çıkmak için herhangi bir tuşa basın veya pencerede herhangi bir yere tıklayın.,"Натисніть будь яку клавішу чи натисніть по вікну, щоб вийти.","Натиснете който и да е клавиш или щракнете където и да е в прозореца, за да излезете." +,,Savegame,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,NEWSAVE,,,,,,,<Νέο παιχνίδι αποθήκευσης>,,,,,,,<Új mentés>,,<新規セーブ>,<새로운 게임 저장>,,,,,,,<Новое сохранение>,<Нова сачувана игра>,,,<Нове збереження>,<Нов запис на играта> +Game saved.,GGSAVED,,,,Hra uložena.,Spillet er gemt.,Spielstand gespeichert.,Παχνίδι αποθηκέυτηκε.,Ludado konservita.,Partida guardada.,,Peli tallennettu.,Partie sauvegardée.,Igra je spremljena.,Játék mentve.,Partita salvata.,セーブ完了。,게임이 저장됨.,Spel opgeslagen.,Spillet er lagret.,Gra zapisana.,Jogo salvo.,Jogo gravado.,Joc salvat.,Игра сохранена.,Игра сачувана.,Spelet är sparat.,Oyun kaydedildi.,Гру збережено.,Играта е записана +Time,SAVECOMMENT_TIME,,,,Čas,Tid,Zeit,Χρόνος,Tempo,Tiempo,,Aika,Temps,Vrijeme,Idő,Tempo,"時間 ",시간,Tijd,Tid,Czas,Tempo,,Timp,Время,Време,Tid,Zaman,Час,Време -Load Game,MNU_LOADGAME,,,,Načíst hru,Indlæs spil,Spiel laden,Φώρτωσε παιχνίδι,Ŝargi ludadon,Cargar partida,,Lataa peli,Chargement,Játék betöltése,Carica partita,ロード,게임 불러오기,Laden spel,Last inn spill,Wczytaj Grę,Carregar jogo,,Încărcare Joc,Загрузка,Учитај игру,Ladda spelet,Oyun Yükle,Завантажити,Зареди игра -Save Game,MNU_SAVEGAME,,,,Uložit hru,Gem spil,Spiel sichern,Αποθήκευσε παιχνίδι,Konservi ludadon,Guardar partida,,Tallenna peli,Sauvegarde,Játék mentése,Salva partita,セーブ,게임 저장하기,Opslaan spel,Lagre spill,Zapisz Grę,Salvar jogo,Gravar,Salvare Joc,Сохранение,Сачувај игру,Spara spelet,Oyunu Kaydet,Зберегти,Запази игра -No Picture,MNU_NOPICTURE,,,,Bez obrázku,Intet billede,Kein Bild,Καμία εικόνα,Neniu bildo,Sin imagen,,Ei kuvaa,Pas d'image,Nincs kép,Nessuna immagine,画像無し,사진 없음,Geen beeld,Ingen bilde,Brak obrazka,Sem imagem,,Lipsă Imagine,"Нет +Load Game,MNU_LOADGAME,,,,Načíst hru,Indlæs spil,Spiel laden,Φώρτωσε παιχνίδι,Ŝargi ludadon,Cargar partida,,Lataa peli,Chargement,Učitaj igru,Játék betöltése,Carica partita,ロード,게임 불러오기,Laden spel,Last inn spill,Wczytaj Grę,Carregar jogo,,Încărcare Joc,Загрузка,Учитај игру,Ladda spelet,Oyun Yükle,Завантажити,Зареди игра +Save Game,MNU_SAVEGAME,,,,Uložit hru,Gem spil,Spiel sichern,Αποθήκευσε παιχνίδι,Konservi ludadon,Guardar partida,,Tallenna peli,Sauvegarde,Spremi igru,Játék mentése,Salva partita,セーブ,게임 저장하기,Opslaan spel,Lagre spill,Zapisz Grę,Salvar jogo,Gravar,Salvare Joc,Сохранение,Сачувај игру,Spara spelet,Oyunu Kaydet,Зберегти,Запази игра +No Picture,MNU_NOPICTURE,,,,Bez obrázku,Intet billede,Kein Bild,Καμία εικόνα,Neniu bildo,Sin imagen,,Ei kuvaa,Pas d'image,Nema slike,Nincs kép,Nessuna immagine,画像無し,사진 없음,Geen beeld,Ingen bilde,Brak obrazka,Sem imagem,,Lipsă Imagine,"Нет изображения",Нема слике,Ingen bild,Resim yok,Немає зображення,Без изображение -Different Version,MNU_DIFFVERSION,,,,Jiná verze,Anderledes version,Falsche Version,Διαφορετική έκδοση,Malsama versio,Versión diferente,,Eri versio,Version Différente,Eltérő verzió,Versione differente,"別バージョンの +Different Version,MNU_DIFFVERSION,,,,Jiná verze,Anderledes version,Falsche Version,Διαφορετική έκδοση,Malsama versio,Versión diferente,,Eri versio,Version Différente,Druga verzija,Eltérő verzió,Versione differente,"別バージョンの データ",다른 버젼,Anders Versie,Annen versjon,Inna Wersja,Versão diferente,,Versiune Diferită,Другая версия,Другачија верзија,Annan version,Farklı Versiyon,Інша версія,Различна версия -No files,MNU_NOFILES,,,,Žádné soubory,Ingen filer,Keine Dateien,Καθ΄λου αρχεία ,Neniu dosiero,Sin archivos,,Ei tiedostoja,Pas de fichiers,Nincsenek fájlok,Nessun file,ファイル無し,파일 없음,Geen bestanden,Ingen filer,Brak plików,Vazio,,Niciun fișier,Нет файлов,Нема фајлова,Inga filer,Dosya yok,Немає файлів,Няма файлове +No files,MNU_NOFILES,,,,Žádné soubory,Ingen filer,Keine Dateien,Καθ΄λου αρχεία ,Neniu dosiero,Sin archivos,,Ei tiedostoja,Pas de fichiers,Nema datoteka,Nincsenek fájlok,Nessun file,ファイル無し,파일 없음,Geen bestanden,Ingen filer,Brak plików,Vazio,,Niciun fișier,Нет файлов,Нема фајлова,Inga filer,Dosya yok,Немає файлів,Няма файлове "Do you really want to delete the savegame? ",MNU_DELETESG,,,,Opravdu smazat tuto uloženou hru?,Ønsker du virkelig at slette det gemte spil?,Willst du diesen Spielstand wirklich löschen?,Θέλεις όντος να διαγράξεις το αποθηκευμένο παιχνίδι;,Ĉu vi vere volas forigi la konservitan ludadon?,"¿Realmente deseas borrar la partida? ",,Haluatko varmasti poistaa tallennetun pelin ,"Voulez vous vraiment effacer cette sauvegarde? -",Biztosan törlöd a mentést?,Vuoi veramente cancellare il salvataggio?,本当にこのセーブを消すのか?,저장된 게임을 정말로 삭제하시겠습니까?,Wil je echt de opgeslagen spel verwijderen?,Vil du virkelig slette lagringsspillet?,Czy naprawdę chcesz usunąć zapis gry?,Deseja mesmo excluir o jogo salvo?,Deseja mesmo apagar o jogo,Vrei să ștergi salvarea?,Вы действительно хотите удалить сохранение?,Да ли стварно желите да избришете сачувану игру,Vill du verkligen radera sparfilen?,"Gerçekten kayıt oyununu silmek istiyor musunuz? +",Želiš li stvarno obrisati ovu spremljenu igru?,Biztosan törlöd a mentést?,Vuoi veramente cancellare il salvataggio?,本当にこのセーブを消すのか?,저장된 게임을 정말로 삭제하시겠습니까?,Wil je echt de opgeslagen spel verwijderen?,Vil du virkelig slette lagringsspillet?,Czy naprawdę chcesz usunąć zapis gry?,Deseja mesmo excluir o jogo salvo?,Deseja mesmo apagar o jogo,Vrei să ștergi salvarea?,Вы действительно хотите удалить сохранение?,Да ли стварно желите да избришете сачувану игру,Vill du verkligen radera sparfilen?,"Gerçekten kayıt oyununu silmek istiyor musunuz? ",Ви дійсно хочете видалити це збереження?,Найстина ли искаш да изтриеш запазената игра -,,General,,,,,,,,,,,,,,,,,,,,,,,,,,, -Off,OPTVAL_OFF,,,,Vyp.,Fra,Aus,ενεργοποιημένη,Malŝaltita,Desactivado,,Pois,,Ki,Disattivo,オフ,끔,Uit,Av,Wyłączone,Não,,Pornit,Откл.,Искљ.,Av,Kapalı,Вимк.,Изкл. -On,OPTVAL_ON,,,,Zap.,Til,An,άπενεργοποιημένη,Ŝaltita,Activado,,Päällä,,Be,Attivo,オン,켬,Aan,På,Włączone,Sim,,Oprit,Вкл.,Укљ.,På,Açık,Увім.,Вкл. -Auto,OPTVAL_AUTO,,,,,Automatisk,,Αυτό,Aŭtomata,Automático,,Automaattinen,,Automatikus,Automatico,自動,자동,,,Automatycznie,Automático,,,Авто,Аутоматски,Automatiskt,Otomatik,Авто,Автоматично -Options,OPTMNU_TITLE,,,,Možnosti,Indstillinger,Optionen,Ρυθμίσεις,Agordoj,Opciones,,Asetukset,,Beállítások,Opzioni,オプション,설정,Opties,Alternativer,Opcje,Opções,,Opțiuni,Настройки,Подешавања,Alternativ,Seçenekler,Налаштування,Настройки -Customize Controls,OPTMNU_CONTROLS,,,,Ovládání,Tilpas kontrolelementer,Steuerung einstellen,Προσαρμογή χειριστηρίων,Adapti regilojn,Personalizar controles,,Ohjausasetukset,Modifier les Contrôles,Irányítás testreszabása,Personalizza i controlli,キー配置変更,조작 사용자 지정,Instellen van de controle,Tilpass kontroller,Ustaw Klawisze,Personalizar comandos,Configurar Controlos,Personalizare Setări Control,Управление,Контроле,Anpassa kontrollerna,Kontrolleri Özelleştir,Керування,Управление -Mouse Options,OPTMNU_MOUSE,,,,Myš,Indstillinger for mus,Mauseinstellungen,Ρυθμίσεις ποντικίου,Muso-agordoj,Opciones de ratón,,Hiiriasetukset,Options de la Souris,Egér beállítások,Opzioni Mouse,マウス オプション,마우스 설정,Muis opties,Alternativer for mus,Opcje Myszki,Opções de mouse,Opções do rato,Setări Mouse,Мышь,Миш,Alternativ för musen,Fare Seçenekleri,Миш,Мишка -Controller Options,OPTMNU_JOYSTICK,,,,Ovladač,Indstillinger for controller,Joystickeinstellungen,Επιλογές ελεγκτή,Ludregilo-agordoj,Opciones de mando,,Peliohjainasetukset,Options de la Manette,Játékvezérlő beállítások,Opzioni Joystick,コントローラーオプション,조이스틱 설정,Controller opties,Kontrollalternativer,Opcje Kontrolera,Opções de controle,,Setări Controller,Контроллер,Контролер,Alternativ för styrenhet,Kontrolör Seçenekleri,Контролер,Контролер -Player Setup,OPTMNU_PLAYER,,,,Hráč,Spilleropsætning,Spieler einrichten,Ρυθμίσεις παίχτη,Ludanto-agordaĵo,Configuración del jugador,,Pelaaja-asetukset,Options du Joueur,Játékos testreszabása,Settaggio giocatore,プレイヤーの特徴,플레이어 설정,Speler instellen,Spilleroppsett,Ustawienia Gracza,Configurações de jogador,Configurações do Jogador,Personalizare Jucător,Игрок,Играч,Inställning av spelare,Oyuncu Kurulumu,Гравець,Играч -Gameplay Options,OPTMNU_GAMEPLAY,,,,Herní mechaniky,Indstillinger for gameplay,Spieleinstellungen,Επιλογές παιχνιδιού,Ludado-agordoj,Opciones de jugabilidad,,Pelattavuusasetukset,Options du Gameplay,Játékmenet beállítások,Opzioni Gameplay,ゲームプレイ オプション,게임 설정,Gameplay-opties,Spillalternativer,Opcje Rozgrywki,Opções de jogabilidade,,Setări pe timp de joc,Игра,Гејмплеј,Spelalternativ,Oynanış Seçenekleri,Ігрові механіки,Игра -Automap Options,OPTMNU_AUTOMAP,,,,Automapa,Automap-indstillinger,Automapeinstellungen,Επιλογές Automap,Agordoj de la aŭtomata mapo,Opciones del automapa,,Automaattikartan asetukset,Options de la Carte,Térkép beállítások,Opzioni Automappa,オートマップ オプション,오토맵 설정,Automap-opties,Automap-alternativer,Opcje Mapy,Opções de automapa,,Hartă computerizată,Автокарта,Аутомапа,Automap-alternativ,Otomatik Harita Seçenekleri,Автокарта,Автокарта -HUD Options,OPTMNU_HUD,,,,Rozhraní a HUD,HUD-indstillinger,HUD Einstellungen,Ρυθμίσεις HUD,Agordoj de HUD,Opciones del HUD,,Tilanäytön asetukset,Options de l'ATH,HUD beállítások,Opzioni HUD,HUD オプション,HUD 설정,HUD opties,HUD-alternativer,Opcje HUD,Opções de HUD,,Setări HUD,Интерфейс,,HUD-alternativ,HUD Seçenekleri,Ігровий інтерфейс,Интерфейс -Miscellaneous Options,OPTMNU_MISCELLANEOUS,,,,Ostatní,Diverse indstillinger,Verschiedene Einstellungen,Διάφορες ρυθμίσεις,Diversaĵaj agordoj,Opciones misceláneas,,Sekalaiset asetukset,Options Annexes,Egyéb beállítások,Opzioni Miste,その他のオプション,그 외 설정,Diverse opties,Diverse alternativer,Różne Opcje,Outras opções,,Setări diverse,Дополнительно,Разно,Diverse alternativ,Çeşitli Seçenekler,Інше,Други настройки -Sound Options,OPTMNU_SOUND,,,,Zvuk,Lydindstillinger,Soundeinstellungen,Ρυθμίσεις ήχου,Sono-agordoj,Opciones de sonido,,Ääniasetukset,Options du Son,Hang beállítások,Opzioni Suono,サウンド オプション,음향 설정,Geluidsopties,Lydalternativer,Opcje Dźwięku,Opções de som,,Setări sunet,Звук,Звук,Ljudalternativ,Ses Seçenekleri,Звук,Звука -Display Options,OPTMNU_DISPLAY,,,,Grafika,Visningsindstillinger,Anzeigeeinstellungen,Επιλογές οθόνης,Ekrano-agordoj,Opciones de visualización,,Näyttöasetukset,Options de l'Affichage,Megjelenítés beállítások,Opzioni Display,ディスプレイ オプション,디스플레이 설정,Weergaveopties,Visningsalternativer,Opcje Wyświetlania,Opções de vídeo,,Setări afișare,Экран,Приказ,Visningsalternativ,Görüntüleme Seçenekleri,Екран,Екрана -Set video mode,OPTMNU_VIDEO,,,,Obrazový výstup,Indstil videomodus,Videomodus,Άλλαξε λειτουργία βίντεο,Agordi videoreĝimon,Modos de vídeo,Modos de video,Aseta videotila,Choisir Mode D'Affichage,Videó beállítások,Settaggio modalità video,ビデオ 調整,화면 설정,Videomodus instellen,Angi videomodus,Ustaw tryb wideo,Definir modo de vídeo,,Setare mod video,Видеорежим,Видео мод,Ställ in videoläge,Video modunu ayarlama,Відеорежим,Видеорежим -Reset to defaults,OPTMNU_DEFAULTS,,,,Obnovit původní,Nulstil til standardindstillingerne,Auf Vorgaben zurücksetzen,Επαναφορά σε προεπιλεγμένες ρυθμίσεις,Restarigi al defaŭltoj,Valores por defecto,,Palauta oletusasetukset,Réinitialiser les paramètres,Alapértelmezett beállítások használata,Reimposta ai valori di default,初期設定に戻す,초기화,Terugzetten naar standaardinstellingen,Tilbakestill til standardinnstillinger,Resetuj do domyślnych,Redefinir para configurações padrão,,Revenire la setări implicite,Сбросить все настройки,Врати подразумевано,Återställ till standardvärden,Varsayılanlara sıfırla,Скинути налаштування,Нулирай до стандартни -Reset to last saved,OPTMNU_RESETTOSAVED,,,,Obnovit naposledy uložené,Nulstil til sidst gemte,Auf gespeicherte Werte zurücksetzen,Επαναφορά στην τελευταία αποθήκευση,Restarigi al lasta konservita,Últimos valores guardados,,Palauta viimeksi tallennettu tila,Recharger dernière config.,Legutóbbi mentett beállítások használata,Reimposta ai valori salvati l'ultima volta,最後に保存した設定に戻す,이전 설정으로 초기화,Reset naar laatste opgeslagen,Tilbakestill til sist lagret,Resetuj do ostatnio zapisanych,Redefinir para a última configuração salva,Redefinir para última configuração gravada,Revenire la ultimele setări salvate,Возврат к сохранённым настройкам,Врати задње сачувано,Återställ till senast sparade,Son kaydedilene sıfırla,Відновити останні збережені налаштування,Нулирай до последно запазената игра -Save current settings,OPTMNU_WRITEINI,,,,Uložit současná nastavení,Gem de aktuelle indstillinger,Aktuelle Einstellungen speichern,Αποθήκευσε της τορινές ρυθμίσεις,Konservi nunajn reĝimojn,Guardar los ajustes de ahora,,Tallenna nykyiset asetukset,Sauvegarde des Paramètres Actuels,Jelenlegi beállítások mentése,Salva le impostazioni correnti,現在の設定を保存,현재 설정 적용,Huidige instellingen opslaan ,Lagre gjeldende innstillinger,Zapisz aktualne opcje,Salvar configurações atuais,,Salvează setările curente,Сохранить текущие настройки,,Spara aktuella inställningar,Geçerli ayarları kaydet,Зберегти поточні налаштування,Запази сегашните настройки -Go to console,OPTMNU_CONSOLE,,,,Otevřít konzoli,Gå til konsol,Öffne Konsole,Μπές στη κονσόλα,Iri al konzolo,Ir a la consola,,Mene konsoliin,Ouvrir la console,Konzol megnyitása,Vai alla console,コンソールを開く,콘솔로 이동,Ga naar de console,Gå til konsoll,Przejdź do konsoli,Abrir console,Abrir consola,Mergi la consolă,Открыть консоль,Отвори конзолу,Gå till konsolen,Konsola git,Відкрити консоль,Отвори конзолата -Network Options,OPTMNU_NETWORK,,,,Síť,Netværksindstillinger,Netzwerkeinstellungen,Ρυθμίσεις Δικτύου,Reto-agordoj,Opciones de red,,Verkkoasetukset,Options Réseau,Hálózati beállítások,Opzioni Network,ネットワーク オプション,네트워크 설정,Netwerkopties,Nettverksalternativer,Opcje Sieciowe,Opções de rede,,Setări de Rețea,Сеть,Мрежа,Nätverksalternativ,Ağ Seçenekleri,Мережа,Мрежа -Reverb environment editor,OPTMNU_REVERB,,,,Editor zvukové ozvěny,Reverb editor,Hall-Editor,Επεξεργαστής περιβαλλόντων απόσβεσης,Redaktoro pri resonmedio,Editor de amb. de reverberación,,Kaikutilaeditori,Editeur environement de révérb.,Visszhangkörnyezet-szerkesztő,Editor ambiente reverb,リバーブ環境エディタ,울림 환경 편집기,Reverb-omgeving editor,Reverb-miljøredigering,Edytor pogłosu środowiska,Editor de ambiente de reverberação,,Setări Reverb,Редактор реверберации,Уредник одјека у околини,Redigerare för reverbmiljö,Reverb ortam düzenleyicisi,Редактор реверберації,Редактор на среда за реверберация -,,Customize controls,,,,,,,,,,,,,,,,,,,,,,,,,,, -"ENTER to change, BACKSPACE to clear",CNTRLMNU_SWITCHTEXT1,,,,"ENTER pro změnu, BACKSPACE pro smazání","ENTER for at ændre, BACKSPACE for at slette",ENTER: Editieren BACKSPACE: Löschen,"ENTER για αλλαγή, BACKSPACE για διαγραφή","ENTER por ŝanĝi, BACKSPACE por forigi","ENTER para cambiar, RETROCESO para borrar","ENTER para cambiar, BACKSPACE para borrar","Aseta ENTERILLÄ, tyhjennä ASKELPALAUTTIMELLA","ENTREE pour changer, RET. ARRIERE pour effacer.","ENTER a változtatáshoz, BACKSPACE a törléshez","INVIO per modificare, BACKSPACE per ripulire",Enter で決定、BackSpaceで無効化,"바꿀려면 ENTER키, 지울려면 BACKSPACE키를 누르시오","ENTER om te veranderen, BACKSPACE om te wissen.","ENTER for å endre, BACKSPACE for å slette","ENTER by zmienić, BACKSPACE by wyczyścić",Aperte ENTER para alterar e BACKSPACE para remover,,"ENTER pentru a schimba, BACKSPACE pentru ștergere","ENTER — изменить, BACKSPACE — очистить","ENTER за промену, BACKSPACE за чишћење","ENTER för att ändra, BACKSPACE för att radera","Değiştirmek için ENTER, silmek için BACKSPACE","ENTER — змінити, BACKSPACE — очистити","ENTER — промяна, BACKSPACE — изчистване" +,,General,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Off,OPTVAL_OFF,,,,Vyp.,Fra,Aus,ενεργοποιημένη,Malŝaltita,Desactivado,,Pois,,Isklj.,Ki,Disattivo,オフ,끔,Uit,Av,Wyłączone,Não,,Pornit,Откл.,Искљ.,Av,Kapalı,Вимк.,Изкл. +On,OPTVAL_ON,,,,Zap.,Til,An,άπενεργοποιημένη,Ŝaltita,Activado,,Päällä,,Uklj.,Be,Attivo,オン,켬,Aan,På,Włączone,Sim,,Oprit,Вкл.,Укљ.,På,Açık,Увім.,Вкл. +Auto,OPTVAL_AUTO,,,,,Automatisk,,Αυτό,Aŭtomata,Automático,,Automaattinen,,Automatski,Automatikus,Automatico,自動,자동,,,Automatycznie,Automático,,,Авто,Аутоматски,Automatiskt,Otomatik,Авто,Автоматично +Options,OPTMNU_TITLE,,,,Možnosti,Indstillinger,Optionen,Ρυθμίσεις,Agordo,Opciones,,Asetukset,,Postavke,Beállítások,Opzioni,オプション,설정,Opties,Alternativer,Opcje,Opções,,Opțiuni,Настройки,Подешавања,Alternativ,Seçenekler,Налаштування,Настройки +Customize Controls,OPTMNU_CONTROLS,,,,Ovládání,Tilpas kontrolelementer,Steuerung einstellen,Προσαρμογή χειριστηρίων,Adapti regilojn,Personalizar controles,,Ohjausasetukset,Modifier les Contrôles,Prilagodi kontrole,Irányítás testreszabása,Personalizza i controlli,キー配置変更,조작 사용자 지정,Instellen van de controle,Tilpass kontroller,Ustaw Klawisze,Personalizar comandos,Configurar Controlos,Personalizare Setări Control,Управление,Контроле,Anpassa kontrollerna,Kontrolleri Özelleştir,Керування,Управление +Mouse Options,OPTMNU_MOUSE,,,,Myš,Indstillinger for mus,Mauseinstellungen,Ρυθμίσεις ποντικίου,Agordo de muso,Opciones de ratón,,Hiiriasetukset,Options de la Souris,Postavke miša,Egér beállítások,Opzioni Mouse,マウス オプション,마우스 설정,Muis opties,Alternativer for mus,Opcje Myszki,Opções de mouse,Opções do rato,Setări Mouse,Мышь,Миш,Alternativ för musen,Fare Seçenekleri,Миш,Мишка +Controller Options,OPTMNU_JOYSTICK,,,,Ovladač,Indstillinger for controller,Joystickeinstellungen,Επιλογές ελεγκτή,Agordo de regilo,Opciones de mando,,Peliohjainasetukset,Options de la Manette,Postavke kontrolera,Játékvezérlő beállítások,Opzioni Joystick,コントローラーオプション,조이스틱 설정,Controller opties,Kontrollalternativer,Opcje Kontrolera,Opções de controle,,Setări Controller,Контроллер,Контролер,Alternativ för styrenhet,Kontrolör Seçenekleri,Контролер,Контролер +Player Setup,OPTMNU_PLAYER,,,,Hráč,Spilleropsætning,Spieler einrichten,Ρυθμίσεις παίχτη,Agordaĵo de la ludanto,Configuración del jugador,,Pelaaja-asetukset,Options du Joueur,Postavljanje igrača,Játékos testreszabása,Settaggio giocatore,プレイヤーの特徴,플레이어 설정,Speler instellen,Spilleroppsett,Ustawienia Gracza,Configurações de jogador,Configurações do Jogador,Personalizare Jucător,Игрок,Играч,Inställning av spelare,Oyuncu Kurulumu,Гравець,Играч +Gameplay Options,OPTMNU_GAMEPLAY,,,,Herní mechaniky,Indstillinger for gameplay,Spieleinstellungen,Επιλογές παιχνιδιού,Agordo de ludado,Opciones de jugabilidad,,Pelattavuusasetukset,Options du Gameplay,Postavke igranja,Játékmenet beállítások,Opzioni Gameplay,ゲームプレイ オプション,게임 설정,Gameplay-opties,Spillalternativer,Opcje Rozgrywki,Opções de jogabilidade,,Setări pe timp de joc,Игра,Гејмплеј,Spelalternativ,Oynanış Seçenekleri,Ігрові механіки,Игра +Automap Options,OPTMNU_AUTOMAP,,,,Automapa,Automap-indstillinger,Automapeinstellungen,Επιλογές Automap,Agordo de la aŭtomata mapo,Opciones del automapa,,Automaattikartan asetukset,Options de la Carte,Postavke autokarte,Térkép beállítások,Opzioni Automappa,オートマップ オプション,오토맵 설정,Automap-opties,Automap-alternativer,Opcje Mapy,Opções de automapa,,Hartă computerizată,Автокарта,Аутомапа,Automap-alternativ,Otomatik Harita Seçenekleri,Автокарта,Автокарта +HUD Options,OPTMNU_HUD,,,,Rozhraní a HUD,HUD-indstillinger,HUD Einstellungen,Ρυθμίσεις HUD,Agordo de la HUD,Opciones del HUD,,Tilanäytön asetukset,Options de l'ATH,Postavke sučelja,HUD beállítások,Opzioni HUD,HUD オプション,HUD 설정,HUD opties,HUD-alternativer,Opcje HUD,Opções de HUD,,Setări HUD,Интерфейс,,HUD-alternativ,HUD Seçenekleri,Ігровий інтерфейс,Интерфейс +Miscellaneous Options,OPTMNU_MISCELLANEOUS,,,,Ostatní,Diverse indstillinger,Verschiedene Einstellungen,Διάφορες ρυθμίσεις,Agordo diversa,Opciones misceláneas,,Sekalaiset asetukset,Options Annexes,Razne postavke,Egyéb beállítások,Opzioni Miste,その他のオプション,그 외 설정,Diverse opties,Diverse alternativer,Różne Opcje,Outras opções,,Setări diverse,Дополнительно,Разно,Diverse alternativ,Çeşitli Seçenekler,Інше,Други настройки +Sound Options,OPTMNU_SOUND,,,,Zvuk,Lydindstillinger,Soundeinstellungen,Ρυθμίσεις ήχου,Agordo de sono,Opciones de sonido,,Ääniasetukset,Options du Son,Postavke zvuka,Hang beállítások,Opzioni Suono,サウンド オプション,음향 설정,Geluidsopties,Lydalternativer,Opcje Dźwięku,Opções de som,,Setări sunet,Звук,Звук,Ljudalternativ,Ses Seçenekleri,Звук,Звука +Display Options,OPTMNU_DISPLAY,,,,Grafika,Visningsindstillinger,Anzeigeeinstellungen,Επιλογές οθόνης,Agordo de ekrano,Opciones de visualización,,Näyttöasetukset,Options de l'Affichage,Postavke prikaza,Megjelenítés beállítások,Opzioni Display,ディスプレイ オプション,디스플레이 설정,Weergaveopties,Visningsalternativer,Opcje Wyświetlania,Opções de vídeo,,Setări afișare,Экран,Приказ,Visningsalternativ,Görüntüleme Seçenekleri,Екран,Екрана +Set video mode,OPTMNU_VIDEO,,,,Obrazový výstup,Indstil videomodus,Videomodus,Άλλαξε λειτουργία βίντεο,Agordi videoreĝimon,Modos de vídeo,Modos de video,Aseta videotila,Choisir Mode D'Affichage,Postavi video način,Videó beállítások,Settaggio modalità video,ビデオ 調整,화면 설정,Videomodus instellen,Angi videomodus,Ustaw tryb wideo,Definir modo de vídeo,,Setare mod video,Видеорежим,Видео мод,Ställ in videoläge,Video modunu ayarlama,Відеорежим,Видеорежим +Reset to defaults,OPTMNU_DEFAULTS,,,,Obnovit původní,Nulstil til standardindstillingerne,Auf Vorgaben zurücksetzen,Επαναφορά σε προεπιλεγμένες ρυθμίσεις,Restarigi la defaŭltojn,Valores por defecto,,Palauta oletusasetukset,Réinitialiser les paramètres,Vrati na zadano,Alapértelmezett beállítások használata,Reimposta ai valori di default,初期設定に戻す,초기화,Terugzetten naar standaardinstellingen,Tilbakestill til standardinnstillinger,Resetuj do domyślnych,Redefinir para configurações padrão,,Revenire la setări implicite,Сбросить все настройки,Врати подразумевано,Återställ till standardvärden,Varsayılanlara sıfırla,Скинути налаштування,Нулирай до стандартни +Reset to last saved,OPTMNU_RESETTOSAVED,,,,Obnovit naposledy uložené,Nulstil til sidst gemte,Auf gespeicherte Werte zurücksetzen,Επαναφορά στην τελευταία αποθήκευση,Restarigi la lastajn konservitojn,Últimos valores guardados,,Palauta viimeksi tallennettu tila,Recharger dernière config.,Resetiraj na posljednje spremanje,Legutóbbi mentett beállítások használata,Reimposta ai valori salvati l'ultima volta,最後に保存した設定に戻す,이전 설정으로 초기화,Reset naar laatste opgeslagen,Tilbakestill til sist lagret,Resetuj do ostatnio zapisanych,Redefinir para a última configuração salva,Redefinir para última configuração gravada,Revenire la ultimele setări salvate,Возврат к сохранённым настройкам,Врати задње сачувано,Återställ till senast sparade,Son kaydedilene sıfırla,Відновити останні збережені налаштування,Нулирай до последно запазената игра +Save current settings,OPTMNU_WRITEINI,,,,Uložit současná nastavení,Gem de aktuelle indstillinger,Aktuelle Einstellungen speichern,Αποθήκευσε της τορινές ρυθμίσεις,Konservi nunan agordaĵon,Guardar los ajustes de ahora,,Tallenna nykyiset asetukset,Sauvegarde des Paramètres Actuels,Spremi trenutne postavke,Jelenlegi beállítások mentése,Salva le impostazioni correnti,現在の設定を保存,현재 설정 적용,Huidige instellingen opslaan ,Lagre gjeldende innstillinger,Zapisz aktualne opcje,Salvar configurações atuais,,Salvează setările curente,Сохранить текущие настройки,,Spara aktuella inställningar,Geçerli ayarları kaydet,Зберегти поточні налаштування,Запази сегашните настройки +Go to console,OPTMNU_CONSOLE,,,,Otevřít konzoli,Gå til konsol,Öffne Konsole,Μπές στη κονσόλα,Iri al konzolo,Ir a la consola,,Mene konsoliin,Ouvrir la console,Idi na konzolu,Konzol megnyitása,Vai alla console,コンソールを開く,콘솔로 이동,Ga naar de console,Gå til konsoll,Przejdź do konsoli,Abrir console,Abrir consola,Mergi la consolă,Открыть консоль,Отвори конзолу,Gå till konsolen,Konsola git,Відкрити консоль,Отвори конзолата +Network Options,OPTMNU_NETWORK,,,,Síť,Netværksindstillinger,Netzwerkeinstellungen,Ρυθμίσεις Δικτύου,Agordo de reto,Opciones de red,,Verkkoasetukset,Options Réseau,Postavke mreže,Hálózati beállítások,Opzioni Network,ネットワーク オプション,네트워크 설정,Netwerkopties,Nettverksalternativer,Opcje Sieciowe,Opções de rede,,Setări de Rețea,Сеть,Мрежа,Nätverksalternativ,Ağ Seçenekleri,Мережа,Мрежа +Reverb environment editor,OPTMNU_REVERB,,,,Editor zvukové ozvěny,Reverb editor,Hall-Editor,Επεξεργαστής περιβαλλόντων απόσβεσης,Redaktilo de resona medio,Editor de amb. de reverberación,,Kaikutilaeditori,Editeur environement de révérb.,Uređivač odjekivanja okoliša,Visszhangkörnyezet-szerkesztő,Editor ambiente reverb,リバーブ環境エディタ,울림 환경 편집기,Reverb-omgeving editor,Reverb-miljøredigering,Edytor pogłosu środowiska,Editor de ambiente de reverberação,,Setări Reverb,Редактор реверберации,Уредник одјека у околини,Redigerare för reverbmiljö,Reverb ortam düzenleyicisi,Редактор реверберації,Редактор на среда за реверберация +,,Customize controls,,,,,,,,,,,,,,,,,,,,,,,,,,,, +"ENTER to change, BACKSPACE to clear",CNTRLMNU_SWITCHTEXT1,,,,"ENTER pro změnu, BACKSPACE pro smazání","ENTER for at ændre, BACKSPACE for at slette",ENTER: Editieren BACKSPACE: Löschen,"ENTER για αλλαγή, BACKSPACE για διαγραφή","ENEN por ŝanĝi, RETROPAŜO por forigi","ENTER para cambiar, RETROCESO para borrar","ENTER para cambiar, BACKSPACE para borrar","Aseta ENTERILLÄ, tyhjennä ASKELPALAUTTIMELLA","ENTREE pour changer, RET. ARRIERE pour effacer.","ENTER za promjenu, BACKSPACE za čišćenje","ENTER a változtatáshoz, BACKSPACE a törléshez","INVIO per modificare, BACKSPACE per ripulire",Enter で決定、BackSpaceで無効化,"바꿀려면 ENTER키, 지울려면 BACKSPACE키를 누르시오","ENTER om te veranderen, BACKSPACE om te wissen.","ENTER for å endre, BACKSPACE for å slette","ENTER by zmienić, BACKSPACE by wyczyścić",Aperte ENTER para alterar e BACKSPACE para remover,,"ENTER pentru a schimba, BACKSPACE pentru ștergere","ENTER — изменить, BACKSPACE — очистить","ENTER за промену, BACKSPACE за чишћење","ENTER för att ändra, BACKSPACE för att radera","Değiştirmek için ENTER, silmek için BACKSPACE","ENTER — змінити, BACKSPACE — очистити","ENTER — промяна, BACKSPACE — изчистване" "Press new key for control, ESC to cancel",CNTRLMNU_SWITCHTEXT2,,,,"Zmáčkni novou klávesu, nebo ESC pro storno","Tryk på ny tast for kontrol, ESC for at annullere",Drücke eine Taste oder ESC um abzubrechen,"Πατήστε το νέο πλήκτρο για έλεγχο, ESC για ακύρωση","Premu novan klavon por regilo, ESC por nuligi","Presiona una tecla para el control, ESC para cancelar",,"Valitse näppäin toiminnolle, ESC peruuttaa","Appuyez sur la nouvelle touche pour l'assigner, -Appuyez sur ECHAP pour annuler.","Nyomj meg egy gombot, ESC a törléshez","Premi un nuovo tasto per il controllo, ESC per cancellare","登録したいキーを押すか, Escでキャンセル","명령을 얽으려면 아무 키를, 취소는 ESC키를 누르시오","Druk op de nieuwe toets voor controle, ESC om te annuleren.","Trykk på ny tast for kontroll, ESC for å avbryte","Wciśnij nowy przycisk by zmienić klawisz, ESC by anulować",Aperte uma nova tecla para o comando e ESC para cancelar,"Carrega a nova tecla para o comando, ESC para cancelar","Apasă tasta nouă, sau ESC pentru anulare","Нажмите новую клавишу, ESC для отмены","Притисните ново тастер за одређивање контроле, ESC за отказивање","Tryck på ny tangent för kontroll, ESC för att avbryta","Kontrol için yeni tuşa, iptal etmek için ESC'ye basın","Натисніть на клавішу для її призначення, ESC для скасування","Натисни нов клавиш за управление, ESC за отмяна" -Controls,CNTRLMNU_CONTROLS,,,,Ovládání,Kontrolelementer,Steuerung,Έλεγχοι,Regiloj,Controles,,Ohjaimet,Contrôles,Irányítás,Controlli,操作系統,조작,Bedieningselementen,Kontroller,Klawisze,Comandos,Controlos,Control,Управление,Контроле,Kontroller,Kontroller,Керування,Управление -Fire,CNTRLMNU_ATTACK,,,,Střelba,Ild,Feuer,Πυροβόλα,Pafi,Fuego,,Tuli,Tirer,Tűz,Fuoco,撃つ,공격,Vuur,Brann,Strzał,Atirar,,Foc,Атака,Нападни,Eld,Yangın,Атака,Атака -Secondary Fire,CNTRLMNU_ALTATTACK,,,,Sekundární střelba,Sekundær ild,Alternativfeuer,Δευτερεύουσα Πυροβόλα,Pafi duarange,Fuego secundario,,Vaihtoehtoistuli,Tir Secondaire,Másodlagos tüzelés,Fuoco secondario,セカンダリ,보조 공격,Secundaire vuur,Sekundær ild,Strzał Alternatywny,Tiro secundário,,Foc Secundar,Дополнительная атака,Секундарни напад,Sekundär eld,İkincil Yangın,Додаткова атака,Допълнителна атака -Weapon Reload,CNTRLMNU_RELOAD,,,,Přebít zbraň,Våben Genopladning,Waffe nachladen,Επαναφόρτωση Όπλου,Reŝargi armilon,Recargar arma,,Aseen lataus,Recharger Arme,Fegyver újratöltése,Ricarica dell'arma,リロード,무기 장전,Wapenherladen,Våpen Reload,Przeładowanie Broni,Recarregar arma,,Încărcare Armă,Перезарядка,Напуни,Ladda om vapen,Silah Yeniden Doldurma,Перезарядка,Презареди -Use / Open,CNTRLMNU_USE,,,,Použít/otevřít,Brug / Åbn,Benutzen / Öffnen,Χρήση / Άνοιγμα,Uzi/Malfermi,Usar/Abrir,,Käytä / Avaa,Utiliser/Ouvrir,Akciógomb/Nyitás,Usa/Apri,開く / スイッチ等使用,사용/열기,Gebruik / Openen,Bruk / Åpne,Użyj / Otwórz,Usar / Abrir,,Folosește / Deschide,Использовать/открыть,Користи / Отвори,Användning/öppna,Kullan / Aç,Відкрити / Використати,Използвай / Отвори -Move forward,CNTRLMNU_FORWARD,,,,Vpřed,Flyt fremad,Vorwärts bewegen,Μετακίνηση προς τα εμπρός,Moviĝi anatŭen,Avanzar,,Liiku eteenpäin,Avancer,Előre mozgás,Movimento in avanti,前進,앞으로 이동,Voorwaarts bewegen,Gå fremover,Idź do przodu,Mover-se para frente,,Deplasare în față,Движение вперёд,Крећи се напред,Flytta framåt,İlerleyin,Рухатись вперед,Движение напред -Move backward,CNTRLMNU_BACK,,,,Vzad,Bevæge sig bagud,Rückwarts bewegen,Μετακίνηση προς τα πίσω,Moviĝi malantaŭen,Retroceder,,Liiku taaksepäin,Reculer,Hátra mozgás,Movimento in indietro,後退,뒤로 이동,Achteruit bewegen,Gå bakover,Idź do tyłu,Mover-se para trás,,Deplasare în spate,Движение назад,Крећи се уназад,Flytta bakåt,Geriye doğru hareket et,Рухатись назад,Движение назад -Strafe left,CNTRLMNU_MOVELEFT,,,,Úkrok vlevo,Flyt til venstre,Nach links bewegen,Μετακίνηση προς τα αριστερά,Flankmovi maldekstren,Moverse a la izquierda,,Astu sivuun vasemmalle,Aller à Gauche,Balra oldalazás,Movimento laterale a sinistra,左移動,왼쪽으로 이동,Verplaats naar links,Strafe venstre,Unik w lewo,Mover-se para a esquerda,,Deplasare diagonală stânga,Движение влево,Крећи се лево,Strafe till vänster,Strafe sola,Рухатись вліво,Движение в ляво -Strafe right,CNTRLMNU_MOVERIGHT,,,,Úkrok vpravo,Flyt til højre,Nach rechts bewegen,Μετακίνηση προς τα δεξιά,Flankmovi dekstren,Moverse a la derecha,,Astu sivuun oikealle,Aller à Droite,Jobbra oldalazás,Movimento laterale a destra,右移動,오른쪽으로 이동,Verplaats naar rechts,Strafe til høyre,Unik w prawo,Mover-se para a direita,,Deplasare diagonală dreapta,Движение вправо,Крећи се десно,Strafe till höger,Strafe sağa,Рухатись вправо,Движение в дясно -Turn left,CNTRLMNU_TURNLEFT,,,,Otočení vlevo,Drej til venstre,Nach links drehen,Γύρνα αριστερά,Turni maldekstren,Girar a la izquierda,,Käänny vasemmalle,Tourner à Gauche,Balra fordul,"Gira a sinistra +Appuyez sur ECHAP pour annuler.","Pritisni novu tipku za ovu radnju, ESC za otkazivanje","Nyomj meg egy gombot, ESC a törléshez","Premi un nuovo tasto per il controllo, ESC per cancellare","登録したいキーを押すか, Escでキャンセル","명령을 얽으려면 아무 키를, 취소는 ESC키를 누르시오","Druk op de nieuwe toets voor controle, ESC om te annuleren.","Trykk på ny tast for kontroll, ESC for å avbryte","Wciśnij nowy przycisk by zmienić klawisz, ESC by anulować",Aperte uma nova tecla para o comando e ESC para cancelar,"Carrega a nova tecla para o comando, ESC para cancelar","Apasă tasta nouă, sau ESC pentru anulare","Нажмите новую клавишу, ESC для отмены","Притисните ново тастер за одређивање контроле, ESC за отказивање","Tryck på ny tangent för kontroll, ESC för att avbryta","Kontrol için yeni tuşa, iptal etmek için ESC'ye basın","Натисніть на клавішу для її призначення, ESC для скасування","Натисни нов клавиш за управление, ESC за отмяна" +Controls,CNTRLMNU_CONTROLS,,,,Ovládání,Kontrolelementer,Steuerung,Έλεγχοι,Regiloj,Controles,,Ohjaimet,Contrôles,Kontrole,Irányítás,Controlli,操作系統,조작,Bedieningselementen,Kontroller,Klawisze,Comandos,Controlos,Control,Управление,Контроле,Kontroller,Kontroller,Керування,Управление +Fire,CNTRLMNU_ATTACK,,,,Střelba,Ild,Feuer,Πυροβόλα,Pafi,Fuego,,Tuli,Tirer,Pucanje,Tűz,Fuoco,撃つ,공격,Vuur,Brann,Strzał,Atirar,,Foc,Атака,Нападни,Eld,Yangın,Атака,Атака +Secondary Fire,CNTRLMNU_ALTATTACK,,,,Sekundární střelba,Sekundær ild,Alternativfeuer,Δευτερεύουσα Πυροβόλα,Akcesora pafado,Fuego secundario,,Vaihtoehtoistuli,Tir Secondaire,Sekundarno pucanje,Másodlagos tüzelés,Fuoco secondario,セカンダリ,보조 공격,Secundaire vuur,Sekundær ild,Strzał Alternatywny,Tiro secundário,,Foc Secundar,Дополнительная атака,Секундарни напад,Sekundär eld,İkincil Yangın,Додаткова атака,Допълнителна атака +Weapon Reload,CNTRLMNU_RELOAD,,,,Přebít zbraň,Våben Genopladning,Waffe nachladen,Επαναφόρτωση Όπλου,Reŝargi armilon,Recargar arma,,Aseen lataus,Recharger Arme,Punjenje oružja,Fegyver újratöltése,Ricarica dell'arma,リロード,무기 장전,Wapenherladen,Våpen Reload,Przeładowanie Broni,Recarregar arma,,Încărcare Armă,Перезарядка,Напуни,Ladda om vapen,Silah Yeniden Doldurma,Перезарядка,Презареди +Use / Open,CNTRLMNU_USE,,,,Použít/otevřít,Brug / Åbn,Benutzen / Öffnen,Χρήση / Άνοιγμα,Uzi/Malfermi,Usar/Abrir,,Käytä / Avaa,Utiliser/Ouvrir,Upotrijebi/Otvori,Akciógomb/Nyitás,Usa/Apri,開く / スイッチ等使用,사용/열기,Gebruik / Openen,Bruk / Åpne,Użyj / Otwórz,Usar / Abrir,,Folosește / Deschide,Использовать/открыть,Користи / Отвори,Användning/öppna,Kullan / Aç,Відкрити / Використати,Използвай / Отвори +Move forward,CNTRLMNU_FORWARD,,,,Vpřed,Flyt fremad,Vorwärts bewegen,Μετακίνηση προς τα εμπρός,Moviĝi anatŭen,Avanzar,,Liiku eteenpäin,Avancer,Kretanje naprijed,Előre mozgás,Movimento in avanti,前進,앞으로 이동,Voorwaarts bewegen,Gå fremover,Idź do przodu,Mover-se para frente,,Deplasare în față,Движение вперёд,Крећи се напред,Flytta framåt,İlerleyin,Рухатись вперед,Движение напред +Move backward,CNTRLMNU_BACK,,,,Vzad,Bevæge sig bagud,Rückwarts bewegen,Μετακίνηση προς τα πίσω,Moviĝi malantaŭen,Retroceder,,Liiku taaksepäin,Reculer,Kretanje unatrag,Hátra mozgás,Movimento in indietro,後退,뒤로 이동,Achteruit bewegen,Gå bakover,Idź do tyłu,Mover-se para trás,,Deplasare în spate,Движение назад,Крећи се уназад,Flytta bakåt,Geriye doğru hareket et,Рухатись назад,Движение назад +Strafe left,CNTRLMNU_MOVELEFT,,,,Úkrok vlevo,Flyt til venstre,Nach links bewegen,Μετακίνηση προς τα αριστερά,Flankenmoviĝi maldekstren,Moverse a la izquierda,,Astu sivuun vasemmalle,Aller à Gauche,Kretanje ulijevo,Balra oldalazás,Movimento laterale a sinistra,左移動,왼쪽으로 이동,Verplaats naar links,Strafe venstre,Unik w lewo,Mover-se para a esquerda,,Deplasare diagonală stânga,Движение влево,Крећи се лево,Strafe till vänster,Strafe sola,Рухатись вліво,Движение в ляво +Strafe right,CNTRLMNU_MOVERIGHT,,,,Úkrok vpravo,Flyt til højre,Nach rechts bewegen,Μετακίνηση προς τα δεξιά,Flankenmoviĝi dekstren,Moverse a la derecha,,Astu sivuun oikealle,Aller à Droite,Kretanje udesno,Jobbra oldalazás,Movimento laterale a destra,右移動,오른쪽으로 이동,Verplaats naar rechts,Strafe til høyre,Unik w prawo,Mover-se para a direita,,Deplasare diagonală dreapta,Движение вправо,Крећи се десно,Strafe till höger,Strafe sağa,Рухатись вправо,Движение в дясно +Turn left,CNTRLMNU_TURNLEFT,,,,Otočení vlevo,Drej til venstre,Nach links drehen,Γύρνα αριστερά,Turniĝi maldekstren,Girar a la izquierda,,Käänny vasemmalle,Tourner à Gauche,Okretanje ulijevo,Balra fordul,"Gira a sinistra ",左を向く,왼쪽으로 회전,Draai naar links,Sving til venstre,Obróć się w lewo,Girar para a esquerda,,Întoarcere stânga,Поворот налево,Окрени се лево,Sväng vänster,Sola dön,Повернутись ліворуч,Обръщане в ляво -Turn right,CNTRLMNU_TURNRIGHT,,,,Otočení vpravo,Drej til højre,Nach rechts drehen,Γύρνα δεξιά,Turni dekstren,Girar a la derecha,,Käänny oikealle,Tourner à Droite,Jobbra fordul,Gira a destra,右を向く,오른쪽으로 회전,Draai naar rechts,Sving til høyre,Obróć się w prawo,Girar para a direita,,Întoarcere dreapta,Поворот направо,Окрени се десно,Sväng höger,Sağa dön,Повернутись праворуч,Обръщане в дясно -Quick Turn,CNTRLMNU_TURN180,,,,Rychlé otočení,Hurtig drejning,Schnelle Drehung,Γρήγορη γύριση,Rapida turno,Giro rápido,,Pikakäännös,Faire un 180,Megfordulás,Rotazione rapida,背後を向く,빠른 회전,Snelle draai,Rask sving,Szybki Obrót,Giro rápido,,Întoarcere rapidă,Быстрый разворот,Брзи окрет,Snabb vändning,Hızlı Dönüş,Швидкий розворот,Бързо обръщане -Jump,CNTRLMNU_JUMP,,,,Skok,Hop,Springen,Πήδα,Salti,Saltar,,Hyppää,Sauter,Ugrás,Salto,ジャンプ,점프,Springen,Hopp,Skok,Pular,Saltar,Salt,Прыжок,Скок,Hoppa,Atlama,Стрибок,Скок -Crouch,CNTRLMNU_CROUCH,,,,Kleknutí,Kryb,Ducken,Σκύψιμο,Kaŭri,Agacharse,,Kyyristy,S'accroupir (tenir),Guggolás,Abbassarsi,屈む,숙이기,Hurken,Huk,Kucnięcie,Agachar,,Ghemuire,Присесть,Чучни,Huk,Çömelme,Присісти,Клякане -Crouch Toggle,CNTRLMNU_TOGGLECROUCH,,,,Přepnout kleknutí,Krybbe omskifter,Ducken an/aus,Εναλλαγή σκύψιμο,Kaŭrobaskuli,Alternar agachado,,Kyyristymisen vaihtokytkin,S'accroupir (alterner),Guggolási kapcsoló,Attivare/disattivare abbassamento,屈む切替,숙이기 토글,Hurken Toggle,,Przełącz kucnięcie,Agachar (alternar),,Comutator ghemuire,Присесть/встать,Чучни (без држања),Växla huk,Çömelme anahtarı,Сісти/встати,Клякане постоянно -Mouse look,CNTRLMNU_MOUSELOOK,,,,Pohled myší,Musens udseende,Maus-Blick,Κοίτα με το ποντίκι,Musrigardo,Vista con ratón,,Hiirikatselu,Vue à la souris,Egérrel való nézelődés,Modalità vista col mouse,マウス視点上下化,마우스 룩,Muis-look,Museblikk,Rozglądanie się myszką,Visão com o mouse,Vista com o rato,Privire în jur cu mouse,Обзор мышью,Гледај мишем,Musens utseende,Fare bakışı,Огляд мишкою,Поглед с мишката -Look up,CNTRLMNU_LOOKUP,Look doesn't change the aim! It only alters the view pitch,,,Pohled vzhůru,Se op,Nach oben schauen,Κοίτα απάνω,Rigardi supren,Mirar arriba,,Katso ylös,Regarder en haut,Felfele nézés,Guarda sopra,視点を上げる,위로 보기,Kijk omhoog,Se opp,Patrz w górę,Olhar para cima,,Privire în sus,Смотреть вверх,Гледај горе,Titta uppåt,Yukarı bak.,Подивитись вверх,Поглед нагоре -Look down,CNTRLMNU_LOOKDOWN,,,,Pohled dolů,Se nedad,Nach unten schauen,Κοίτα κάτω,Rigardi malsupren,Mirar abajo,,Katso alas,Regarder en bas,Lefele nézés,Guarda sotto,視点を下げる,아래로 보기,Kijk naar beneden,Se nedover,Patrz w dół,Olhar para baixo,,Privire în jos,Смотреть вниз,Гледај доле,Titta ner,Aşağı bak.,Подивитись вниз,Поглед надолу -Center view,CNTRLMNU_CENTERVIEW,,,Centre view,Vystředit pohled,Centreret visning,Ansicht zentrieren,Προβολή στο κέντρο,Centrigi vidon,Centrar vista,,Keskitä katse,Recentrer Vue,Nézet középreigazítása,Sguardo centrato,視点を戻す,중앙 시점으로 보기,Middenaanzicht,Midtstilt visning,Wyśrodkuj widok,Olhar para o centro,,Centrare privire,Отцентрировать взгляд,Централизирај поглед,Centrerad vy,Merkezden görünüm,Центрувати погляд,Центриране на погледа -Run,CNTRLMNU_RUN,,,,Běh,Kør,Rennen,Τρέχα,Kuri,Correr,,Juokse,Courir (tenir),Futás,Corri,駆け足,달리기,Rennen,Kjør,Bieg,Correr,,Fugă,Бежать,Трчи,Spring,Koşmak,Біг,Бягане -Toggle Run,CNTRLMNU_TOGGLERUN,,,,Přepnout běh,Skift Kør,Rennen an/aus,Ενεργοποίηση τρέξιμου,Baskuligi kuron,Alternar «Correr»,,Juoksun vaihtokytkin,Courir (alterner),Futás kapcsoló,Abilita/disabilita corsa,常時駆け足切替,달리기 토글,Rennen aan/uit,Veksle Kjør,Przełącz bieg,Correr (alternar),,Comutator fugă,Бежать/идти,Трчи (без држања),Växla springa,Değiştir Çalıştır,Бігти / ходити,Бягане постоянно -Strafe,CNTRLMNU_STRAFE,,,,Pohyb do stran,Strafe,Seitwärts,,Flankmovi,Desplazamiento,,Astu sivuttain,Pas de côté,Oldalazás,Spostamento laterale,横移動化,양옆으로 이동,Zijdelings bewegen,,Uniki,Deslocamento lateral,,Deplasare în diagonală,Движение боком,Кретање у страну,Strafe,,Рухатись боком,Странично движение -Show Scoreboard,CNTRLMNU_SCOREBOARD,,,,Zobrazit tabulku skóre,Vis resultattavle,Punktetafel anzeigen,Εμφάνιση πίνακα αποτελεσμάτων,Montri poentotabulon,Mostrar marcador,,Näytä pistetaulu,Afficher Scores (tenir),Eredményjelző megjelenítése,Mostra la tabella punteggio,スコアボード表示,점수창 표시,Scorebord tonen,Vis resultattavle,Pokaż tablicę wyników,Exibir placar,,Afișare tabelă de marcaj,Таблица очков,Табела,Visa resultattavlan,Skor Tablosunu Göster,Таблиця лідерів,Покажи резултати -Action,CNTRLMNU_ACTION,,,,Akce,Handling,Aktion,Δράσεις,Ago,Acción,,Toiminta,,Akció,Azione,アクション,동작,Actie,Handling,Akcja,Ação,,Acțiuni,Основное,Радња,Åtgärd,Eylem,Дії,Действие -Customize Action Controls,CNTRLMNU_ACTION_TITLE,,,,Nastavení ovládání akcí,Tilpas handlingskontroller,Aktions-Steuerung einstellen,Προσαρμογή των χειριστηρίων δράσης,Adapti agajn regilojn,Cambiar controles de acción,,Toimintaohjausasetukset,Changer Contrôles Action,Akció beállítások testreszabása,Personalizza i controlli di azione,アクション操作設定,사용자 지정 동작 컨트롤,Aanpassen van de actiecontroles,Tilpass handlingskontroller,Ustaw Klawisze Akcji,Personalizar comandos de ação,Configurar Controlos de Ação,Personalizare schemă acțiuni,Основные клавиши управления,Контроле радње,Anpassa kontrollerna för åtgärder,Eylem Kontrollerini Özelleştirme,Налаштування елементів дій,Персонализиране на контролите за действие -Chat,CNTRLMNU_CHAT,,,,,,,Μίλα,Babili,,,Keskustelu,,,,チャット,채팅,,,Czat,Bate-papo,Conversar,Conversație,Чат,Ћаскање,Chatt,Sohbet,Чат,Чат -Multiplayer,MNU_MULTIPLAYER,,,,,,Mehrspieler,,Plurludanta,Multijugador,,Moninpeli,Multijoueur,Többjátékos,Multigiocatore,マルチプレイヤー,,,Flerspiller,Tryb Wieloosobowy,Multijogador,,Joc Online,Сетевая игра,,Flera spelare,Çok Oyunculu,Гра в мережі,Онлайн игра -Say,CNTRLMNU_SAY,,,,Říct,Sig,Reden,Πές,Diri,Hablar,,Sano,Parler,Üzenet ,Parla,発言,채팅하기,Zeg,Si,Powiedz,Dizer,,Vorbește,Сообщение,Пиши,Säg,Söyle,Написати повідомлення,Съобщение -Customize Chat Controls,CNTRLMNU_CHAT_TITLE,,,,Nastavení ovládání chatu,Tilpas chat-kontrollerne,Chat-Steuerung einstellen,Προσαρμογή ελέγχου συνομιλίας,Adapti babilajn regilojn,Cambiar controles de chat,,Keskusteluohjausasetukset,Changer Contrôles Chat,Chatbeállítások testreszabása,Personalizza i controlli della chat,チャット操作設定,사용자 지정 채팅 컨트롤,Chat-controles aanpassen aan uw wensen,Tilpass chattekontroller,Ustaw Klawisze Czatu,Personalizar comandos do bate-papo,Configurar Controlos de Chat,Personalizare control scriere,Клавиши управления чатом,Контроле ћаскања,Anpassa kontrollerna för chatt,Sohbet Kontrollerini Özelleştirme,Клавіші керування чатом,Персонализиране на контролите за чата -Customize Weapon Controls,CNTRLMNU_WEAPONS_TITLE,,,,Nastavení ovládání zbraní,Tilpas våbenkontroller,Waffen-Steuerung einstellen,Προσαρμογή ελέγχου όπλων,Adapti armilojn regilojn,Cambiar controles de armas,,Aseohjausasetukset,Changer Contrôles Armes,Fegyverbeállítások testreszabása,Personalizza i controlli delle armi,武器操作設定,사용자 지정 무기 컨트롤,Wapencontroles aanpassen aan uw eigen wensen,Tilpass våpenkontroller,Ustaw Klawisze Broni,Personalizar comandos de arma,Configurar Controlos de Armas,Personalizare control arme,Клавиши управления оружием,Контроле оружја,Anpassa vapenkontroller,Silah Kontrollerini Özelleştirme,Клавіші керування зброєю,Персонализиране на контролите за оръжия -Customize Inventory Controls,CNTRLMNU_INVENTORY_TITLE,,,,Nastavení ovládání inventáře,Tilpas kontrol af inventar,Inventar-Steuerung einstellen,Προσαρμογή Ελέγχου Απογραφής,Adapti inventarajn regilojn,Cambiar controles de inventario,,Varusteohjausasetukset,Changer Contrôles Inventaires,Eszköztár beállítások testreszabása,Personalizza i controlli dell'inventario,インベントリ操作設定,사용자 지정 인벤토리 컨트롤,Inventariscontroles aanpassen aan uw wensen,Tilpass beholdningskontroller,Ustaw Klawisze Ekwipunku,Personalizar comandos do inventário,Configurar Controlos de Inventário,Personalizare control inventar,Клавиши управления инвентарём,Контроле складишта,Anpassa kontrollerna för inventarier,Envanter Kontrollerini Özelleştirme,Клавіші керування інвентарем,Персонализиране на контролите за инвентара -Customize Other Controls,CNTRLMNU_OTHER_TITLE,,,,Nastavení ostatních ovládání,Tilpas andre kontrolelementer,Sonstige Steuerung einstellen,Προσαρμογή άλλων ελέγχων,Adapti ekstrajn regilojn,Cambiar otros controles,,Muut ohjausasetukset,Changer Autres Contrôles,Egyéb irányítás testreszabása,Personalizza altri controlli,その他の操作設定,사용자 지정 그 외 컨트롤,Andere bedieningselementen aanpassen,Tilpass andre kontroller,Ustaw Inne Klawisze,Personalizar outros comandos,Configurar Outros Controlos,Personalizare scheme de control diverse,Прочие клавиши,Друге контроле,Anpassa andra kontroller,Diğer Kontrolleri Özelleştirme,Інші клавіші,Персонализиране на други контроли -Weapons,CNTRLMNU_WEAPONS,,,,Zbraně,Våben,Waffen,Όπλα,Armiloj,Armas,,Aseet,Armes,Fegyverek,Armi,武器,무기,Wapens,Våpen,Bronie,Armas,,Arme,Оружие,Оружје,Vapen,Silahlar,Зброя,Оръжия -Next weapon,CNTRLMNU_NEXTWEAPON,,,,Další zbraň,Næste våben,Nächste Waffe,Επόμενο όπλο,Sekva armilo,Arma siguiente,,Seuraava ase,Arme Suivante,Következő fegyver,Arma successiva,次の武器,다음 무기,Volgende wapen,Neste våpen,Następna broń,Arma seguinte,,Arma următoare,Следующее оружие,Следеће оружје,Nästa vapen,Sonraki silah,Наступна зброя,Следващо оръжие -Previous weapon,CNTRLMNU_PREVIOUSWEAPON,,,,Předchozí zbraň,Forrige våben,Vorherige Waffe,Προηγούμενο όπλο,Antaŭa armilo,Arma anterior,,Edellinen ase,Arme Précédente,Előző fegyver,Arma precedente,前の武器,이전 무기,Vorige wapen,Forrige våpen,Poprzednia broń,Arma anterior,,Arma anterioară,Предыдущее оружие,Претходно оружје,Föregående vapen,Önceki silah,Попередня зброя,Предишно оръжие -Weapon 1,CNTRLMNU_SLOT1,Todo - make game specific,,,Slot zbraně 1,Våben 1,Waffe 1,Όπλο 1,Armilo 1,Arma 1,,Aselokero 1,Emplacement D'Arme 1,1. fegyver,Slot arma 1,武器スロット 1,무기 슬롯 1,Wapenslot 1,Våpen 1,Broń 1,Arma 1,,Arma 1,Первое оружие,Оружје 1,Vapen 1,Silah 1,Зброя 1,Оръжие 1 +Turn right,CNTRLMNU_TURNRIGHT,,,,Otočení vpravo,Drej til højre,Nach rechts drehen,Γύρνα δεξιά,Turniĝi dekstren,Girar a la derecha,,Käänny oikealle,Tourner à Droite,Okretanje udesno,Jobbra fordul,Gira a destra,右を向く,오른쪽으로 회전,Draai naar rechts,Sving til høyre,Obróć się w prawo,Girar para a direita,,Întoarcere dreapta,Поворот направо,Окрени се десно,Sväng höger,Sağa dön,Повернутись праворуч,Обръщане в дясно +Quick Turn,CNTRLMNU_TURN180,,,,Rychlé otočení,Hurtig drejning,Schnelle Drehung,Γρήγορη γύριση,Turniĝi rapide,Giro rápido,,Pikakäännös,Faire un 180,Brzi okret,Megfordulás,Rotazione rapida,背後を向く,빠른 회전,Snelle draai,Rask sving,Szybki Obrót,Giro rápido,,Întoarcere rapidă,Быстрый разворот,Брзи окрет,Snabb vändning,Hızlı Dönüş,Швидкий розворот,Бързо обръщане +Jump,CNTRLMNU_JUMP,,,,Skok,Hop,Springen,Πήδα,Salti,Saltar,,Hyppää,Sauter,Skok,Ugrás,Salto,ジャンプ,점프,Springen,Hopp,Skok,Pular,Saltar,Salt,Прыжок,Скок,Hoppa,Atlama,Стрибок,Скок +Crouch,CNTRLMNU_CROUCH,,,,Kleknutí,Kryb,Ducken,Σκύψιμο,Kaŭri,Agacharse,,Kyyristy,S'accroupir (tenir),Čučanj,Guggolás,Abbassarsi,屈む,숙이기,Hurken,Huk,Kucnięcie,Agachar,,Ghemuire,Присесть,Чучни,Huk,Çömelme,Присісти,Клякане +Crouch Toggle,CNTRLMNU_TOGGLECROUCH,,,,Přepnout kleknutí,Krybbe omskifter,Ducken an/aus,Εναλλαγή σκύψιμο,Baskuligi kaŭradon,Alternar agachado,,Kyyristymisen vaihtokytkin,S'accroupir (alterner),Prekidač čučnja,Guggolási kapcsoló,Attiva/disattiva abbassamento,屈む切替,숙이기 토글,Hurken Toggle,,Przełącz kucnięcie,Agachar (alternar),,Comutator ghemuire,Присесть/встать,Чучни (без држања),Växla huk,Çömelme anahtarı,Сісти/встати,Клякане постоянно +Mouse look,CNTRLMNU_MOUSELOOK,,,,Pohled myší,Musens udseende,Maus-Blick,Κοίτα με το ποντίκι,Rigardi per muso,Vista con ratón,,Hiirikatselu,Vue à la souris,Pogled mišem,Egérrel való nézelődés,Modalità vista col mouse,マウス視点上下化,마우스 룩,Muis-look,Museblikk,Rozglądanie się myszką,Visão com o mouse,Vista com o rato,Privire în jur cu mouse,Обзор мышью,Гледај мишем,Musens utseende,Fare bakışı,Огляд мишкою,Поглед с мишката +Look up,CNTRLMNU_LOOKUP,Look doesn't change the aim! It only alters the view pitch,,,Pohled vzhůru,Se op,Nach oben schauen,Κοίτα απάνω,Rigardi supren,Mirar arriba,,Katso ylös,Regarder en haut,Pogledaj gore,Felfele nézés,Guarda sopra,視点を上げる,위로 보기,Kijk omhoog,Se opp,Patrz w górę,Olhar para cima,,Privire în sus,Смотреть вверх,Гледај горе,Titta uppåt,Yukarı bak.,Подивитись вверх,Поглед нагоре +Look down,CNTRLMNU_LOOKDOWN,,,,Pohled dolů,Se nedad,Nach unten schauen,Κοίτα κάτω,Rigardi malsupren,Mirar abajo,,Katso alas,Regarder en bas,Pogledaj dolje,Lefele nézés,Guarda sotto,視点を下げる,아래로 보기,Kijk naar beneden,Se nedover,Patrz w dół,Olhar para baixo,,Privire în jos,Смотреть вниз,Гледај доле,Titta ner,Aşağı bak.,Подивитись вниз,Поглед надолу +Center view,CNTRLMNU_CENTERVIEW,,,Centre view,Vystředit pohled,Centreret visning,Ansicht zentrieren,Προβολή στο κέντρο,Centrigi vidon,Centrar vista,,Keskitä katse,Recentrer Vue,Centriraj pogled,Nézet középreigazítása,Sguardo centrato,視点を戻す,중앙 시점으로 보기,Middenaanzicht,Midtstilt visning,Wyśrodkuj widok,Olhar para o centro,,Centrare privire,Отцентрировать взгляд,Централизирај поглед,Centrerad vy,Merkezden görünüm,Центрувати погляд,Центриране на погледа +Run,CNTRLMNU_RUN,,,,Běh,Kør,Rennen,Τρέχα,Kuri,Correr,,Juokse,Courir (tenir),Trčanje,Futás,Corri,駆け足,달리기,Rennen,Kjør,Bieg,Correr,,Fugă,Бежать,Трчи,Spring,Koşmak,Біг,Бягане +Toggle Run,CNTRLMNU_TOGGLERUN,,,,Přepnout běh,Skift Kør,Rennen an/aus,Ενεργοποίηση τρέξιμου,Baskuligi kuron,Alternar «Correr»,,Juoksun vaihtokytkin,Courir (alterner),Prekidač trčanja,Futás kapcsoló,Attiva/disattiva corsa,常時駆け足切替,달리기 토글,Rennen aan/uit,Veksle Kjør,Przełącz bieg,Correr (alternar),,Comutator fugă,Бежать/идти,Трчи (без држања),Växla springa,Değiştir Çalıştır,Бігти / ходити,Бягане постоянно +Strafe,CNTRLMNU_STRAFE,,,,Pohyb do stran,Strafe,Seitwärts,,Flankenmoviĝi,Desplazamiento,,Astu sivuttain,Pas de côté,Kretanje u stranu,Oldalazás,Spostamento laterale,横移動化,양옆으로 이동,Zijdelings bewegen,,Uniki,Deslocamento lateral,,Deplasare în diagonală,Движение боком,Кретање у страну,Strafe,,Рухатись боком,Странично движение +Show Scoreboard,CNTRLMNU_SCOREBOARD,,,,Zobrazit tabulku skóre,Vis resultattavle,Punktetafel anzeigen,Εμφάνιση πίνακα αποτελεσμάτων,Montri poentotabulon,Mostrar marcador,,Näytä pistetaulu,Afficher Scores (tenir),Prikaži ploču s rezultatima,Eredményjelző megjelenítése,Mostra la tabella punteggio,スコアボード表示,점수창 표시,Scorebord tonen,Vis resultattavle,Pokaż tablicę wyników,Exibir placar,,Afișare tabelă de marcaj,Таблица очков,Табела,Visa resultattavlan,Skor Tablosunu Göster,Таблиця лідерів,Покажи резултати +Action,CNTRLMNU_ACTION,,,,Akce,Handling,Aktion,Δράσεις,Agoj,Acción,,Toiminta,,Radnja,Akció,Azione,アクション,동작,Actie,Handling,Akcja,Ação,,Acțiuni,Основное,Радња,Åtgärd,Eylem,Дії,Действие +Customize Action Controls,CNTRLMNU_ACTION_TITLE,,,,Nastavení ovládání akcí,Tilpas handlingskontroller,Aktions-Steuerung einstellen,Προσαρμογή των χειριστηρίων δράσης,Adapti regilojn de agoj,Cambiar controles de acción,,Toimintaohjausasetukset,Changer Contrôles Action,Prilagodi kontrole radnje,Akció beállítások testreszabása,Personalizza i controlli di azione,アクション操作設定,사용자 지정 동작 컨트롤,Aanpassen van de actiecontroles,Tilpass handlingskontroller,Ustaw Klawisze Akcji,Personalizar comandos de ação,Configurar Controlos de Ação,Personalizare schemă acțiuni,Основные клавиши управления,Контроле радње,Anpassa kontrollerna för åtgärder,Eylem Kontrollerini Özelleştirme,Налаштування елементів дій,Персонализиране на контролите за действие +Chat,CNTRLMNU_CHAT,,,,,,,Μίλα,Babili,,,Keskustelu,,Čavrljanje,,,チャット,채팅,,,Czat,Bate-papo,Conversar,Conversație,Чат,Ћаскање,Chatt,Sohbet,Чат,Чат +Multiplayer,MNU_MULTIPLAYER,,,,,,Mehrspieler,,Plurludanta,Multijugador,,Moninpeli,Multijoueur,Više igrača,Többjátékos,Multigiocatore,マルチプレイヤー,,,Flerspiller,Tryb Wieloosobowy,Multijogador,,Joc Online,Сетевая игра,,Flera spelare,Çok Oyunculu,Гра в мережі,Онлайн игра +Say,CNTRLMNU_SAY,,,,Říct,Sig,Reden,Πές,Diri,Hablar,,Sano,Parler,Reci,Üzenet ,Parla,発言,채팅하기,Zeg,Si,Powiedz,Dizer,,Vorbește,Сообщение,Пиши,Säg,Söyle,Написати повідомлення,Съобщение +Customize Chat Controls,CNTRLMNU_CHAT_TITLE,,,,Nastavení ovládání chatu,Tilpas chat-kontrollerne,Chat-Steuerung einstellen,Προσαρμογή ελέγχου συνομιλίας,Adapti regilojn de babilado,Cambiar controles de chat,,Keskusteluohjausasetukset,Changer Contrôles Chat,Prilagodi kontrole čavrljanja,Chatbeállítások testreszabása,Personalizza i controlli della chat,チャット操作設定,사용자 지정 채팅 컨트롤,Chat-controles aanpassen aan uw wensen,Tilpass chattekontroller,Ustaw Klawisze Czatu,Personalizar comandos do bate-papo,Configurar Controlos de Chat,Personalizare control scriere,Клавиши управления чатом,Контроле ћаскања,Anpassa kontrollerna för chatt,Sohbet Kontrollerini Özelleştirme,Клавіші керування чатом,Персонализиране на контролите за чата +Customize Weapon Controls,CNTRLMNU_WEAPONS_TITLE,,,,Nastavení ovládání zbraní,Tilpas våbenkontroller,Waffen-Steuerung einstellen,Προσαρμογή ελέγχου όπλων,Adapti regilojn de armiloj,Cambiar controles de armas,,Aseohjausasetukset,Changer Contrôles Armes,Prilagodi kontrole oružja,Fegyverbeállítások testreszabása,Personalizza i controlli delle armi,武器操作設定,사용자 지정 무기 컨트롤,Wapencontroles aanpassen aan uw eigen wensen,Tilpass våpenkontroller,Ustaw Klawisze Broni,Personalizar comandos de arma,Configurar Controlos de Armas,Personalizare control arme,Клавиши управления оружием,Контроле оружја,Anpassa vapenkontroller,Silah Kontrollerini Özelleştirme,Клавіші керування зброєю,Персонализиране на контролите за оръжия +Customize Inventory Controls,CNTRLMNU_INVENTORY_TITLE,,,,Nastavení ovládání inventáře,Tilpas kontrol af inventar,Inventar-Steuerung einstellen,Προσαρμογή Ελέγχου Απογραφής,Adapti regilojn de inventaro,Cambiar controles de inventario,,Varusteohjausasetukset,Changer Contrôles Inventaires,Prilagodi kontrole inventara,Eszköztár beállítások testreszabása,Personalizza i controlli dell'inventario,インベントリ操作設定,사용자 지정 인벤토리 컨트롤,Inventariscontroles aanpassen aan uw wensen,Tilpass beholdningskontroller,Ustaw Klawisze Ekwipunku,Personalizar comandos do inventário,Configurar Controlos de Inventário,Personalizare control inventar,Клавиши управления инвентарём,Контроле складишта,Anpassa kontrollerna för inventarier,Envanter Kontrollerini Özelleştirme,Клавіші керування інвентарем,Персонализиране на контролите за инвентара +Customize Other Controls,CNTRLMNU_OTHER_TITLE,,,,Nastavení ostatních ovládání,Tilpas andre kontrolelementer,Sonstige Steuerung einstellen,Προσαρμογή άλλων ελέγχων,Adapti aliajn regilojn,Cambiar otros controles,,Muut ohjausasetukset,Changer Autres Contrôles,Prilagodi ostale kontrole,Egyéb irányítás testreszabása,Personalizza altri controlli,その他の操作設定,사용자 지정 그 외 컨트롤,Andere bedieningselementen aanpassen,Tilpass andre kontroller,Ustaw Inne Klawisze,Personalizar outros comandos,Configurar Outros Controlos,Personalizare scheme de control diverse,Прочие клавиши,Друге контроле,Anpassa andra kontroller,Diğer Kontrolleri Özelleştirme,Інші клавіші,Персонализиране на други контроли +Weapons,CNTRLMNU_WEAPONS,,,,Zbraně,Våben,Waffen,Όπλα,Armiloj,Armas,,Aseet,Armes,Oružja,Fegyverek,Armi,武器,무기,Wapens,Våpen,Bronie,Armas,,Arme,Оружие,Оружје,Vapen,Silahlar,Зброя,Оръжия +Next weapon,CNTRLMNU_NEXTWEAPON,,,,Další zbraň,Næste våben,Nächste Waffe,Επόμενο όπλο,Sekva armilo,Arma siguiente,,Seuraava ase,Arme Suivante,Slijedeće oružje,Következő fegyver,Arma successiva,次の武器,다음 무기,Volgende wapen,Neste våpen,Następna broń,Arma seguinte,,Arma următoare,Следующее оружие,Следеће оружје,Nästa vapen,Sonraki silah,Наступна зброя,Следващо оръжие +Previous weapon,CNTRLMNU_PREVIOUSWEAPON,,,,Předchozí zbraň,Forrige våben,Vorherige Waffe,Προηγούμενο όπλο,Antaŭa armilo,Arma anterior,,Edellinen ase,Arme Précédente,Prethodno oružje,Előző fegyver,Arma precedente,前の武器,이전 무기,Vorige wapen,Forrige våpen,Poprzednia broń,Arma anterior,,Arma anterioară,Предыдущее оружие,Претходно оружје,Föregående vapen,Önceki silah,Попередня зброя,Предишно оръжие +Weapon 1,CNTRLMNU_SLOT1,Todo - make game specific,,,Slot zbraně 1,Våben 1,Waffe 1,Όπλο 1,Armilo 1,Arma 1,,Aselokero 1,Emplacement D'Arme 1,Oružje 1,1. fegyver,Slot arma 1,武器スロット 1,무기 슬롯 1,Wapenslot 1,Våpen 1,Broń 1,Arma 1,,Arma 1,Первое оружие,Оружје 1,Vapen 1,Silah 1,Зброя 1,Оръжие 1 Weapon 2,CNTRLMNU_SLOT2,"only show appropriate slots per game -",,,Slot zbraně 2,Våben 2,Waffe 2,Όπλο 2,Armilo 2,Arma 2,,Aselokero 2,Emplacement D'Arme 2,2. fegyver,Slot arma 2,武器スロット 2,무기 슬롯 2,Wapenslot 2,Våpen 2,Broń 2,Arma 2,,Arma 2,Второе оружие,Оружје 2,Vapen 2,Silah 2,Зброя 2,Оръжие 2 -Weapon 3,CNTRLMNU_SLOT3,,,,Slot zbraně 3,Våben 3,Waffe 3,Όπλο 3,Armilo 3,Arma 3,,Aselokero 3,Emplacement D'Arme 3,3. fegyver,Slot arma 3,武器スロット 3,무기 슬롯 3,Wapenslot 3,Våpen 3,Broń 3,Arma 3,,Arma 3,Третье оружие,Оружје 3,Vapen 3,Silah 3,Зброя 3,Оръжие 3 -Weapon 4,CNTRLMNU_SLOT4,,,,Slot zbraně 4,Våben 4,Waffe 4,Όπλο 4,Armilo 4,Arma 4,,Aselokero 4,Emplacement D'Arme 4,4. fegyver,Slot arma 4,武器スロット 4,무기 슬롯 4,Wapenslot 4,Våpen 4,Broń 4,Arma 4,,Arma 4,Четвёртое оружие,Оружје 4,Vapen 4,Silah 4,Зброя 4,Оръжие 4 -Weapon 5,CNTRLMNU_SLOT5,,,,Slot zbraně 5,Våben 5,Waffe 5,Όπλο 5,Armilo 5,Arma 5,,Aselokero 5,Emplacement D'Arme 5,5. fegyver,Slot arma 5,武器スロット 5,무기 슬롯 5,Wapenslot 5,Våpen 5,Broń 5,Arma 5,,Arma 5,Пятое оружие,Оружје 5,Vapen 5,Silah 5,Зброя 5,Оръжие 5 -Weapon 6,CNTRLMNU_SLOT6,,,,Slot zbraně 6,Våben 6,Waffe 6,Όπλο 6,Armilo 6,Arma 6,,Aselokero 6,Emplacement D'Arme 6,6. fegyver,Slot arma 6,武器スロット 6,무기 슬롯 6,Wapenslot 6,Våpen 6,Broń 6,Arma 6,,Arma 6,Шестое оружие,Оружје 6,Vapen 6,Silah 6,Зброя 6,Оръжие 6 -Weapon 7,CNTRLMNU_SLOT7,,,,Slot zbraně 7,Våben 7,Waffe 7,Όπλο 7,Armilo 7,Arma 7,,Aselokero 7,Emplacement D'Arme 7,7. fegyver,Slot arma 7,武器スロット 7,무기 슬롯 7,Wapenslot 7,Våpen 7,Broń 7,Arma 7,,Arma 7,Седьмое оружие,Оружје 7,Vapen 7,Silah 7,Зброя 7,Оръжие 7 -Weapon 8,CNTRLMNU_SLOT8,,,,Slot zbraně 8,Våben 8,Waffe 8,Όπλο 8,Armilo 8,Arma 8,,Aselokero 8,Emplacement D'Arme 8,8. fegyver,Slot arma 8,武器スロット 8,무기 슬롯 8,Wapenslot 8,Våpen 8,Broń 8,Arma 8,,Arma 8,Восьмое оружие,Оружје 8,Vapen 8,Silah 8,Зброя 8,Оръжие 8 -Weapon 9,CNTRLMNU_SLOT9,,,,Slot zbraně 9,Våben 9,Waffe 9,Όπλο 9,Armilo 9,Arma 9,,Aselokero 9,Emplacement D'Arme 9,9. fegyver,Slot arma 9,武器スロット 9,무기 슬롯 9,Wapenslot 9,Våpen 9,Broń 9,Arma 9,,Arma 9,Девятое оружие,Оружје 9,Vapen 9,Silah 9,Зброя 9,Оръжие 9 -Weapon 10,CNTRLMNU_SLOT0,,,,Slot zbraně 10,Våben 10,Waffe 10,Όπλο 0,Armilo 10,Arma 10,,Aselokero 0,Emplacement D'Arme 0,0. fegyver,Slot arma 0,武器スロット 0,무기 슬롯 0,Wapenslot 0,Våpen 10,Broń 10,Arma 10,,Arma 0,Десятое оружие,Оружје 0,Vapen 10,Silah 10,Зброя 0,Оръжие 10 -Inventory,CNTRLMNU_INVENTORY,,,,Inventář,Inventar,Inventar,Άντικείμενα,Inventaro,Inventario,,Varusteet,Inventaire,Eszköztár beállítások testreszabása,Inventario,所持品,인벤토리,Inventaris,Inventar,Ekwipunek,Inventário,,Inventar,Инвентарь,Инвентар,Inventarium,Envanter,Інвентар,Инвентар -Activate item,CNTRLMNU_USEITEM,,,,Aktivovat předmět,Aktiver genstand,Gegenstand aktivieren,Ενεργοποίηση αντικείμενου,Aktivigi objekton,Activar objeto,,Aktivoi varuste,Activer objet,Eszköz használata,Attiva oggetto,アイテムを使用,선택한 아이템 사용,Item activeren,Aktiver gjenstand,Użyj przedmiot,Ativar item,,Activează obiectul,Использовать предмет,Активирај предмет,Aktivera föremål,Öğeyi etkinleştir,Активувати предмет,Използвай предмета -Activate all items,CNTRLMNU_USEALLITEMS,,,,Aktivovat všechny předměty,Aktivering af alle genstande,Alle Gegenstände aktivieren,Ενεργοποίησε όλα τα αντικείμενα,Aktivigi ĉiujn objektojn,Activar todos los objetos,,Aktivoi kaikki varusteet,Activer tous les objets,Minden eszköz használata,Attiva tutti gli oggetti,全てのアイテムを使用,모든 아이템 사용,Activeer alle items,Aktiver alle gjenstander,Użyj wszystkie przedmioty,Ativar todos os itens,,Activează tot inventarul,Использовать все предметы,Активирај све предмете,Aktivera alla föremål,Tüm öğeleri etkinleştirin,Активувати усі предмети,Използвай всички предмети -Next item,CNTRLMNU_NEXTITEM,,,,Další předmět,Næste genstand,Nächster Gegenstand,Επόμενο αντικείμενο,Sekva objekto,Objeto siguiente,,Seuraava varuste,Objet suivant,Következő eszköz,Oggetto successivo,次のアイテム,다음 아이템,Volgende item,Neste element,Następny przedmiot,Item seguinte,,Următorul obiect,Следующий предмет,Следећи предмет,Nästa objekt,Sonraki madde,Наступний предмет,Следващ предмет -Previous item,CNTRLMNU_PREVIOUSITEM,,,,Předchozí předmět,Forrige genstand,Vorheriger Gegenstand,Προηγούμενο αντικείμενο,Antaŭa objekto,Objeto anterior,,Edellinen varuste,Objet précédent,Előző eszköz,Oggetto precedente,前のアイテム,이전 아이템,Vorige item,Forrige element,Poprzedni przedmiot,Item anterior,,Obiect anterior,Предыдущий предмет,Претходни предмет,Föregående objekt,Önceki madde,Попередній предмет,Предишен предмет -Customize Map Controls,MAPCNTRLMNU_TITLE,most are not used yet but will be,,,Nastavení ovládání mapy,Tilpas kontrolelementer til kortet,Automapsteuerung einstellen,Προσαρμογή στοιχείων ελέγχου χάρτη,Adapti map-regilojn,Cambiar controles del mapa,,Kartanohjausasetukset,Contrôles Carte,Térkép irányításának testreszabása,Personalizza i controlli mappa,マップコントロール カスタマイズ,미니맵 단축키 설정,Kaartcontroles aanpassen,Tilpass kartkontroller,Ustaw klawisze mapy,Peronalizar comandos do mapa,,Personalizare schemă de control a hărții,Клавиши управления автокартой,Промени контроле мапе,Anpassa kartkontroller,Harita Kontrollerini Özelleştirme,Клавіші керування автомапою,Персонализиране контролите за картата -Map Controls,MAPCNTRLMNU_CONTROLS,,,,Mapa,Kontrolelementer til kort,Automapsteuerung,Έλεγχοι χάρτη,Map-regiloj,Controles del mapa,,Kartanohjaus,Contrôles de la carte,Térkép irányítása,Controlli mappa,マップコントロール,미니맵 조정,Kaartcontroles,Kartkontroller,Klawisze mapy,Comandos do mapa,,Schemă de control a hărtii,Автокарта,Контроле мапе,Kontroller för kartor,Harita Kontrolleri,Автомапа,Контроли за карта -Pan left,MAPCNTRLMNU_PANLEFT,,,,Doleva,Panorere til venstre,Nach links,Μετακίνηση προς τα αριστερά,Alturni maldekstren,Mover a la izquierda,,Panoroi vasemmalle,Aller à gauche,Balra igazítás,Sposta a sinistra,左に振る,왼쪽으로 이동,Pan links,Panorer til venstre,Przesuń w lewo,Mover para a esquerda,,Mutare spre stânga,Сдвиг влево,Лево,Panorera till vänster,Sola kaydırın,Зсув вліво,Преместване наляво -Pan right,MAPCNTRLMNU_PANRIGHT,,,,Doprava,Panorering til højre,Nach rechts,Μετακίνηση προς τα δεξιά,Alturni dekstren,Mover a la derecha,,Panoroi oikealle,Aller à droite,Jobbra igazítás,Sposta a destra,右に振る,오른쪽으로 이동,Pan rechts,Panorer til høyre,Przesuń w prawo,Mover para a direita,,Mutare spre dreapta,Сдвиг вправо,Десно,Panorera till höger,Sağa kaydırın,Зсув вправо,Преместване на дясно -Pan up,MAPCNTRLMNU_PANUP,,,,Nahoru,Panorere op,Nach oben,Μετακίνηση προς τα πάνω,Alturni supren,Mover hacia arriba,,Panoroi ylös,Aller en haut,Felfele igazítás,Sposta sopra,上に振る,위쪽으로 이동,Pan omhoog,Panorer opp,Przesuń w górę,Mover para cima,,Mutare în sus,Сдвиг вверх,Горе,Panorera uppåt,Yukarı kaydırın,Зсув вверх,Преместване на горе -Pan down,MAPCNTRLMNU_PANDOWN,,,,Dolů,Panorere ned,Nach unten,Μετακίνηση προς τα κάτω,Alturni malsupren,Mover hacia abajo,,Panoroi alas,Aller en bas,Lefele igazítás,Sposta sotto,下に振る,아래쪽으로 이동,Pan neer,Panorer ned,Przesuń w dół,Mover para baixo,,Mutare în jos,Сдвиг вниз,Доле,Panorera ner,Aşağı kaydırın,Зсув вниз,Преместване на долу -Zoom in,MAPCNTRLMNU_ZOOMIN,,,,Přiblížit,Zoom ind,Reinzoomen,Μεγέθυνση,Zomi,Acercar,,Lähennä,Zoom avant,Ráközelítés,Ingrandisci,ズームイン,줌 확대,Inzoomen,Zoom inn,Przybliż,Ampliar,,Apropriere Cameră,Приблизить,Увеличати,Zooma in,Yakınlaştır,Наблизити,Приближи -Zoom out,MAPCNTRLMNU_ZOOMOUT,,,,Oddálit,Zoom ud,Rauszoomen,Σμίκρυνση,Malzomi,Alejar,,Loitonna,Zoom arrière,Távolítás,Rimpicciolisci,ズームアウト,줌 축소,Uitzoomen,Zoom ut,Oddal,Afastar,,Depărtare Cameră,Отдалить,Одзумирати,Zooma ut,Uzaklaştır,Віддалити,Отдалечи -Toggle zoom,MAPCNTRLMNU_TOGGLEZOOM,,,,Přiblížení vyp./zap.,Skift mellem zoom,Zoom an/aus,Εναλλαγή ζουμ,Baskuligi zomon,Alternar zoom,,Zoomauksen vaihtokytkin,Zoom On/Off,Közelítés átkapcsolása,Abilita/disabilita zoom,ズーム切替,표준배율 조정,Omschakelen van de zoom,Veksle mellom zoom,Przełącz przybliżanie,Ativar/desativar zoom,,Comutator Zoom,Приближение (перекл.),Укључи зум,Växla zoom,Yakınlaştırmayı aç / kapat,Перемикач наближення,Приближи постоянно -Toggle follow,MAPCNTRLMNU_TOGGLEFOLLOW,,,,Sledování hráče vyp./zap.,Skift følge,Folgen an/aus,Εναλλαγή ακολουθίας,Baskuligi sekvon,Alternar seguimiento,,Seuraamistilan vaihtokytkin,Suivi On/Off,Követés átkapcsolása,Abilita/disabilita scorrimento mappa,追従切替,추적모드 조정,Schakelen volgen,Veksle følge,Przełącz śledzenie,Ativar/desativar seguimento,,Comutator urmărire jucător,Привязка к игроку (перекл.),Укључи праћење,Växla följning,Takip etmeyi değiştir,Слідувати за гравцем,Следвай постаянно -Toggle grid,MAPCNTRLMNU_TOGGLEGRID,,,,Mřížka vyp./zap.,Skift gitter,Gitter an/aus,Εναλλαγή πλέγματος,Baskuligi kradon,Alternar cuadrícula,,Ruudukon vaihtokytkin,Grille On/Off,Rács kapcsolása,Abilita/disabilita la griglia,グリッド切替,그리드 조정,Kiesnet,Veksle rutenett,Przełącz siatkę,Ativar/desativar grade,,Comutator grilă,Сетка (перекл.),Укључи координатну мрежу,Växla rutnät,Izgarayı değiştir,Увімкнути сітку,Включи координатна мрежа -Toggle rotate,MAPCNTRLMNU_ROTATE,,,,Otáčení vyp./zap.,Skift til rotere,Rotation an/aus,Εναλλαγή περιστροφής,Baskuligi turnadon,Alternar rotación,,Kääntämisen vaihtokytkin,Rotation On/Off,Forgás kapcsolása,Abilita/disabilita la rotazione,回転切替,,Toggle rotatie,Veksle mellom rotasjon,Przełącz obracanie,Ativar/desativar rotação,,Comutator rotire,Вращение (перекл.),Укључи ротацију,Växla rotera,Döndürmeyi değiştir,Ротація мапи,Завъртане (превключване) -Toggle texture,MAPCNTRLMNU_TOGGLETEXTURE,,,,Textury vyp./zap.,Skift tekstur,Texturen an/aus,Εναλλαγή υφής,Baskuligi teksturon,Alternar textura,,Pintakuvioinnin vaihtokytkin,Textures On/Off,Textúra kapcsolása,Abilita/disabilita le texture,テクスチャ切替,미니맵 텍스쳐 조정,Toggle textuur,Veksle tekstur,Przełącz tekstury,Ativar/desativar texturas,,Comutator mod texturat,Текстуры (перекл.),Укључи текстуру,Växla textur,Dokuyu değiştir,Увімкнути текстури, -Toggle automap,CNTRLMNU_AUTOMAP,,,,Otevřít/zavřít automapu,Skift til automap,Automap an/aus,Εναλλαγή automap,Baskuligi aŭtomatan mapon,Alternar automapa,,Kytke automaattikartta päälle/pois,Ouvrir/Fermer Carte,Térkép ki/bekapcsolása,Abilita/disabilita l'automappa,オートマップの切替,오토맵 조정,Automap aan/uit,Veksle mellom automap,Włącz mapę,Ativar/desativar automapa,,Comutator hartă computerizată,Автокарта (перекл.),Прикажи аутомапу,Växla automap,Otomatik haritayı değiştir,Відкрити автомапу, -Chasecam,CNTRLMNU_CHASECAM,,,,Kamera z třetí osoby,Chasecam,Verfolgerkamera,,Ĉaskamerao,Cámara de seguimiento,,Seurantakamera,Caméra 3ième personne,Külsőnézetű kamera,Telecamera di inseguimento,背後視点,3인칭 카메라,,,Kamera Śledzenia,Câmera em terceira pessoa,Câmera em terceira-pessoa,Cameră urmăritoare,Вид от 3-го лица,Чејс-кем,,,Вид від третьої особи, -Screenshot,CNTRLMNU_SCREENSHOT,,,,Pořídit snímek obrazovky,Skærmbillede,,Στιγμιότυπο,Ekrankopio,Captura de pantalla,,Kuvakaappaus,Capture d'écran,Képernyő lefényképezése,Cattura schermo,画面キャプチャ,스크린샷,,Skjermbilde,Zrzut ekranu,Captura de tela,,Captură ecran,Снимок экрана,Усликај,Skärmdump,Ekran görüntüsü,Скріншот, -Open console,CNTRLMNU_CONSOLE,,,,Otevřít konzoli,Åbn konsollen,Konsole öffnen,Ανοίξτε την κονσόλα,Malfermi konzolon,Abrir consola,,Avaa konsoli,Ouvrir Console,Konzol megnyitása,Apri la console,コンソールを開く,콘솔 열기,Open console,Åpne konsoll,Otwórz konsolę,Abrir console,Abrir consola,Deschide consola,Открыть консоль,Отвори консолу,Öppna konsolen,Açık konsol,Відкрити консоль, -Pause,CNTRLMNU_PAUSE,,,,Pauza,,,Πάυση,Paŭzo,Pausa,,Tauko,,Szünet,Pausa,ポーズ,일시정지,Pauze,,Pauza,Pausar,,Pauză,Пауза,Пауза,Pausa,Duraklat,Пауза, -Increase Display Size,CNTRLMNU_DISPLAY_INC,,,,Zvětšit velikost obrazovky,Forøg visningsstørrelsen,Anzeige vergrößern,Αύξηση μεγέθους οθόνης,Kreskigi ekrangrandon,Agrandar ventana,,Suurenna näytön kokoa,Agrandir l'affichage,Képméret növelése,Aumenta la dimensione del display,画面サイズを拡大,화면 크기 늘리기,Vergroot het display,Øk visningsstørrelse,Powiększ Rozmiar Wyświetlania,Aumentar tamanho da exibição,Aumentar Tamanho do Ecrã,Mărire ecran,Увеличить размер экрана,Повећајте величину екрана,Öka skärmstorleken,Ekran Boyutunu Artırın,Збільшити розмір екрану, -Decrease Display Size,CNTRLMNU_DISPLAY_DEC,,,,Zmenšit velikost obrazovky,Formindsk skærmstørrelse,Anzeige verkleinern,Μείωση μεγέθους οθόνης,Malkreskigi ekrangrandon,Reducir ventana,,Pienennä näytön kokoa,Réduire l'affichage,Képméret csökkentése,Riduci la dimensione del display,画面サイズを縮小,화면 크기 줄이기,Verlaag het display,Reduser visningsstørrelse,Pomniejsz Rozmiar Wyświetlania,Reduzir tamanho da exibição,Diminuir Tamanho do Ecrã,Micșorare ecran,Уменьшить размер экрана,Смањите величину екрана,Minska visningsstorleken,Ekran Boyutunu Azaltma,Зменшити розмір екрану, -Open Help,CNTRLMNU_OPEN_HELP,,,,Nápověda,Åbn hjælp,Hilfe öffnen,Άνοιγμα βοήθειας,Malfermi helpon,Abrir ayuda,,Avaa ohje,Ouvrir Aide,Segítség előhozása,Apri la guida,"ヘルプを開く +",,,Slot zbraně 2,Våben 2,Waffe 2,Όπλο 2,Armilo 2,Arma 2,,Aselokero 2,Emplacement D'Arme 2,Oružje 2,2. fegyver,Slot arma 2,武器スロット 2,무기 슬롯 2,Wapenslot 2,Våpen 2,Broń 2,Arma 2,,Arma 2,Второе оружие,Оружје 2,Vapen 2,Silah 2,Зброя 2,Оръжие 2 +Weapon 3,CNTRLMNU_SLOT3,,,,Slot zbraně 3,Våben 3,Waffe 3,Όπλο 3,Armilo 3,Arma 3,,Aselokero 3,Emplacement D'Arme 3,Oružje 3,3. fegyver,Slot arma 3,武器スロット 3,무기 슬롯 3,Wapenslot 3,Våpen 3,Broń 3,Arma 3,,Arma 3,Третье оружие,Оружје 3,Vapen 3,Silah 3,Зброя 3,Оръжие 3 +Weapon 4,CNTRLMNU_SLOT4,,,,Slot zbraně 4,Våben 4,Waffe 4,Όπλο 4,Armilo 4,Arma 4,,Aselokero 4,Emplacement D'Arme 4,Oružje 4,4. fegyver,Slot arma 4,武器スロット 4,무기 슬롯 4,Wapenslot 4,Våpen 4,Broń 4,Arma 4,,Arma 4,Четвёртое оружие,Оружје 4,Vapen 4,Silah 4,Зброя 4,Оръжие 4 +Weapon 5,CNTRLMNU_SLOT5,,,,Slot zbraně 5,Våben 5,Waffe 5,Όπλο 5,Armilo 5,Arma 5,,Aselokero 5,Emplacement D'Arme 5,Oružje 5,5. fegyver,Slot arma 5,武器スロット 5,무기 슬롯 5,Wapenslot 5,Våpen 5,Broń 5,Arma 5,,Arma 5,Пятое оружие,Оружје 5,Vapen 5,Silah 5,Зброя 5,Оръжие 5 +Weapon 6,CNTRLMNU_SLOT6,,,,Slot zbraně 6,Våben 6,Waffe 6,Όπλο 6,Armilo 6,Arma 6,,Aselokero 6,Emplacement D'Arme 6,Oružje 6,6. fegyver,Slot arma 6,武器スロット 6,무기 슬롯 6,Wapenslot 6,Våpen 6,Broń 6,Arma 6,,Arma 6,Шестое оружие,Оружје 6,Vapen 6,Silah 6,Зброя 6,Оръжие 6 +Weapon 7,CNTRLMNU_SLOT7,,,,Slot zbraně 7,Våben 7,Waffe 7,Όπλο 7,Armilo 7,Arma 7,,Aselokero 7,Emplacement D'Arme 7,Oružje 7,7. fegyver,Slot arma 7,武器スロット 7,무기 슬롯 7,Wapenslot 7,Våpen 7,Broń 7,Arma 7,,Arma 7,Седьмое оружие,Оружје 7,Vapen 7,Silah 7,Зброя 7,Оръжие 7 +Weapon 8,CNTRLMNU_SLOT8,,,,Slot zbraně 8,Våben 8,Waffe 8,Όπλο 8,Armilo 8,Arma 8,,Aselokero 8,Emplacement D'Arme 8,Oružje 8,8. fegyver,Slot arma 8,武器スロット 8,무기 슬롯 8,Wapenslot 8,Våpen 8,Broń 8,Arma 8,,Arma 8,Восьмое оружие,Оружје 8,Vapen 8,Silah 8,Зброя 8,Оръжие 8 +Weapon 9,CNTRLMNU_SLOT9,,,,Slot zbraně 9,Våben 9,Waffe 9,Όπλο 9,Armilo 9,Arma 9,,Aselokero 9,Emplacement D'Arme 9,Oružje 9,9. fegyver,Slot arma 9,武器スロット 9,무기 슬롯 9,Wapenslot 9,Våpen 9,Broń 9,Arma 9,,Arma 9,Девятое оружие,Оружје 9,Vapen 9,Silah 9,Зброя 9,Оръжие 9 +Weapon 10,CNTRLMNU_SLOT0,,,,Slot zbraně 10,Våben 10,Waffe 10,Όπλο 0,Armilo 10,Arma 10,,Aselokero 0,Emplacement D'Arme 0,Oružje 10,0. fegyver,Slot arma 0,武器スロット 0,무기 슬롯 0,Wapenslot 0,Våpen 10,Broń 10,Arma 10,,Arma 0,Десятое оружие,Оружје 0,Vapen 10,Silah 10,Зброя 0,Оръжие 10 +Inventory,CNTRLMNU_INVENTORY,,,,Inventář,Inventar,Inventar,Άντικείμενα,Inventaro,Inventario,,Varusteet,Inventaire,Inventar,Eszköztár beállítások testreszabása,Inventario,所持品,인벤토리,Inventaris,Inventar,Ekwipunek,Inventário,,Inventar,Инвентарь,Инвентар,Inventarium,Envanter,Інвентар,Инвентар +Activate item,CNTRLMNU_USEITEM,,,,Aktivovat předmět,Aktiver genstand,Gegenstand aktivieren,Ενεργοποίηση αντικείμενου,Aktivigi aĵon,Activar objeto,,Aktivoi varuste,Activer objet,Aktiviraj stavku,Eszköz használata,Attiva oggetto,アイテムを使用,선택한 아이템 사용,Item activeren,Aktiver gjenstand,Użyj przedmiot,Ativar item,,Activează obiectul,Использовать предмет,Активирај предмет,Aktivera föremål,Öğeyi etkinleştir,Активувати предмет,Използвай предмета +Activate all items,CNTRLMNU_USEALLITEMS,,,,Aktivovat všechny předměty,Aktivering af alle genstande,Alle Gegenstände aktivieren,Ενεργοποίησε όλα τα αντικείμενα,Aktivigi ĉiujn aĵojn,Activar todos los objetos,,Aktivoi kaikki varusteet,Activer tous les objets,Aktiviraj sve stavke,Minden eszköz használata,Attiva tutti gli oggetti,全てのアイテムを使用,모든 아이템 사용,Activeer alle items,Aktiver alle gjenstander,Użyj wszystkie przedmioty,Ativar todos os itens,,Activează tot inventarul,Использовать все предметы,Активирај све предмете,Aktivera alla föremål,Tüm öğeleri etkinleştirin,Активувати усі предмети,Използвай всички предмети +Next item,CNTRLMNU_NEXTITEM,,,,Další předmět,Næste genstand,Nächster Gegenstand,Επόμενο αντικείμενο,Sekva aĵo,Objeto siguiente,,Seuraava varuste,Objet suivant,Slijedeća stavka,Következő eszköz,Oggetto successivo,次のアイテム,다음 아이템,Volgende item,Neste element,Następny przedmiot,Item seguinte,,Următorul obiect,Следующий предмет,Следећи предмет,Nästa objekt,Sonraki madde,Наступний предмет,Следващ предмет +Previous item,CNTRLMNU_PREVIOUSITEM,,,,Předchozí předmět,Forrige genstand,Vorheriger Gegenstand,Προηγούμενο αντικείμενο,Antaŭa aĵo,Objeto anterior,,Edellinen varuste,Objet précédent,Prethodna stavka,Előző eszköz,Oggetto precedente,前のアイテム,이전 아이템,Vorige item,Forrige element,Poprzedni przedmiot,Item anterior,,Obiect anterior,Предыдущий предмет,Претходни предмет,Föregående objekt,Önceki madde,Попередній предмет,Предишен предмет +Customize Map Controls,MAPCNTRLMNU_TITLE,most are not used yet but will be,,,Nastavení ovládání mapy,Tilpas kontrolelementer til kortet,Automapsteuerung einstellen,Προσαρμογή στοιχείων ελέγχου χάρτη,Adapti regilojn de mapo,Cambiar controles del mapa,,Kartanohjausasetukset,Contrôles Carte,Prilagodi kontrole karte,Térkép irányításának testreszabása,Personalizza i controlli mappa,マップコントロール カスタマイズ,미니맵 단축키 설정,Kaartcontroles aanpassen,Tilpass kartkontroller,Ustaw klawisze mapy,Peronalizar comandos do mapa,,Personalizare schemă de control a hărții,Клавиши управления автокартой,Промени контроле мапе,Anpassa kartkontroller,Harita Kontrollerini Özelleştirme,Клавіші керування автомапою,Персонализиране контролите за картата +Map Controls,MAPCNTRLMNU_CONTROLS,,,,Mapa,Kontrolelementer til kort,Automapsteuerung,Έλεγχοι χάρτη,Regiloj de mapo,Controles del mapa,,Kartanohjaus,Contrôles de la carte,Kontrole karte,Térkép irányítása,Controlli mappa,マップコントロール,미니맵 조정,Kaartcontroles,Kartkontroller,Klawisze mapy,Comandos do mapa,,Schemă de control a hărtii,Автокарта,Контроле мапе,Kontroller för kartor,Harita Kontrolleri,Автомапа,Контроли за карта +Pan left,MAPCNTRLMNU_PANLEFT,,,,Doleva,Panorere til venstre,Nach links,Μετακίνηση προς τα αριστερά,Movi maldekstren,Mover a la izquierda,,Panoroi vasemmalle,Aller à gauche,Pomicanje ulijevo,Balra igazítás,Sposta a sinistra,左に振る,왼쪽으로 이동,Pan links,Panorer til venstre,Przesuń w lewo,Mover para a esquerda,,Mutare spre stânga,Сдвиг влево,Лево,Panorera till vänster,Sola kaydırın,Зсув вліво,Преместване наляво +Pan right,MAPCNTRLMNU_PANRIGHT,,,,Doprava,Panorering til højre,Nach rechts,Μετακίνηση προς τα δεξιά,Movi dekstren,Mover a la derecha,,Panoroi oikealle,Aller à droite,Pomicanje udesno,Jobbra igazítás,Sposta a destra,右に振る,오른쪽으로 이동,Pan rechts,Panorer til høyre,Przesuń w prawo,Mover para a direita,,Mutare spre dreapta,Сдвиг вправо,Десно,Panorera till höger,Sağa kaydırın,Зсув вправо,Преместване на дясно +Pan up,MAPCNTRLMNU_PANUP,,,,Nahoru,Panorere op,Nach oben,Μετακίνηση προς τα πάνω,Movi supren,Mover hacia arriba,,Panoroi ylös,Aller en haut,Pomicanje gore,Felfele igazítás,Sposta sopra,上に振る,위쪽으로 이동,Pan omhoog,Panorer opp,Przesuń w górę,Mover para cima,,Mutare în sus,Сдвиг вверх,Горе,Panorera uppåt,Yukarı kaydırın,Зсув вверх,Преместване на горе +Pan down,MAPCNTRLMNU_PANDOWN,,,,Dolů,Panorere ned,Nach unten,Μετακίνηση προς τα κάτω,Movi malsupren,Mover hacia abajo,,Panoroi alas,Aller en bas,Pomicanje dolje,Lefele igazítás,Sposta sotto,下に振る,아래쪽으로 이동,Pan neer,Panorer ned,Przesuń w dół,Mover para baixo,,Mutare în jos,Сдвиг вниз,Доле,Panorera ner,Aşağı kaydırın,Зсув вниз,Преместване на долу +Zoom in,MAPCNTRLMNU_ZOOMIN,,,,Přiblížit,Zoom ind,Reinzoomen,Μεγέθυνση,Zomi,Acercar,,Lähennä,Zoom avant,Približi zum,Ráközelítés,Ingrandisci,ズームイン,줌 확대,Inzoomen,Zoom inn,Przybliż,Ampliar,,Apropriere Cameră,Приблизить,Увеличати,Zooma in,Yakınlaştır,Наблизити,Приближи +Zoom out,MAPCNTRLMNU_ZOOMOUT,,,,Oddálit,Zoom ud,Rauszoomen,Σμίκρυνση,Malzomi,Alejar,,Loitonna,Zoom arrière,Udalji zum,Távolítás,Rimpicciolisci,ズームアウト,줌 축소,Uitzoomen,Zoom ut,Oddal,Afastar,,Depărtare Cameră,Отдалить,Одзумирати,Zooma ut,Uzaklaştır,Віддалити,Отдалечи +Toggle zoom,MAPCNTRLMNU_TOGGLEZOOM,,,,Přiblížení vyp./zap.,Skift mellem zoom,Zoom an/aus,Εναλλαγή ζουμ,Baskuligi zomon,Alternar zoom,,Zoomauksen vaihtokytkin,Zoom On/Off,Prekidač zuma,Közelítés átkapcsolása,Attiva/disattiva zoom,ズーム切替,표준배율 조정,Omschakelen van de zoom,Veksle mellom zoom,Przełącz przybliżanie,Ativar/desativar zoom,,Comutator Zoom,Приближение (перекл.),Укључи зум,Växla zoom,Yakınlaştırmayı aç / kapat,Перемикач наближення,Приближи постоянно +Toggle follow,MAPCNTRLMNU_TOGGLEFOLLOW,,,,Sledování hráče vyp./zap.,Skift følge,Folgen an/aus,Εναλλαγή ακολουθίας,Baskuligi sekvadon,Alternar seguimiento,,Seuraamistilan vaihtokytkin,Suivi On/Off,Prekidač praćenja,Követés átkapcsolása,Attiva/disattiva scorrimento mappa,追従切替,추적모드 조정,Schakelen volgen,Veksle følge,Przełącz śledzenie,Ativar/desativar seguimento,,Comutator urmărire jucător,Привязка к игроку (перекл.),Укључи праћење,Växla följning,Takip etmeyi değiştir,Слідувати за гравцем,Следвай постаянно +Toggle grid,MAPCNTRLMNU_TOGGLEGRID,,,,Mřížka vyp./zap.,Skift gitter,Gitter an/aus,Εναλλαγή πλέγματος,Baskuligi kradon,Alternar cuadrícula,,Ruudukon vaihtokytkin,Grille On/Off,Prekidač mreže,Rács kapcsolása,Attiva/disattiva la griglia,グリッド切替,그리드 조정,Kiesnet,Veksle rutenett,Przełącz siatkę,Ativar/desativar grade,,Comutator grilă,Сетка (перекл.),Укључи координатну мрежу,Växla rutnät,Izgarayı değiştir,Увімкнути сітку,Включи координатна мрежа +Toggle rotate,MAPCNTRLMNU_ROTATE,,,,Otáčení vyp./zap.,Skift til rotere,Rotation an/aus,Εναλλαγή περιστροφής,Baskuligi turniĝo,Alternar rotación,,Kääntämisen vaihtokytkin,Rotation On/Off,Prekidač rotacije,Forgás kapcsolása,Attiva/disattiva la rotazione,回転切替,,Toggle rotatie,Veksle mellom rotasjon,Przełącz obracanie,Ativar/desativar rotação,,Comutator rotire,Вращение (перекл.),Укључи ротацију,Växla rotera,Döndürmeyi değiştir,Ротація мапи,Завъртане (превключване) +Toggle texture,MAPCNTRLMNU_TOGGLETEXTURE,,,,Textury vyp./zap.,Skift tekstur,Texturen an/aus,Εναλλαγή υφής,Baskuligi teksturon,Alternar textura,,Pintakuvioinnin vaihtokytkin,Textures On/Off,Prekidač tekstura,Textúra kapcsolása,Attiva/disattiva le texture,テクスチャ切替,미니맵 텍스쳐 조정,Toggle textuur,Veksle tekstur,Przełącz tekstury,Ativar/desativar texturas,,Comutator mod texturat,Текстуры (перекл.),Укључи текстуру,Växla textur,Dokuyu değiştir,Увімкнути текстури, +Toggle automap,CNTRLMNU_AUTOMAP,,,,Otevřít/zavřít automapu,Skift til automap,Automap an/aus,Εναλλαγή automap,Baskuligi aŭtomatan mapon,Alternar automapa,,Kytke automaattikartta päälle/pois,Ouvrir/Fermer Carte,Prekidač autokarte,Térkép ki/bekapcsolása,Attiva/disattiva l'automappa,オートマップの切替,오토맵 조정,Automap aan/uit,Veksle mellom automap,Włącz mapę,Ativar/desativar automapa,,Comutator hartă computerizată,Автокарта (перекл.),Прикажи аутомапу,Växla automap,Otomatik haritayı değiştir,Відкрити автомапу, +Chasecam,CNTRLMNU_CHASECAM,,,,Kamera z třetí osoby,Chasecam,Verfolgerkamera,,Sekvanta kamerao,Cámara de seguimiento,,Seurantakamera,Caméra 3ième personne,Prateća kamera,Külsőnézetű kamera,Telecamera di inseguimento,背後視点,3인칭 카메라,,,Kamera Śledzenia,Câmera em terceira pessoa,Câmera em terceira-pessoa,Cameră urmăritoare,Вид от 3-го лица,Чејс-кем,,,Вид від третьої особи, +Screenshot,CNTRLMNU_SCREENSHOT,,,,Pořídit snímek obrazovky,Skærmbillede,,Στιγμιότυπο,Ekrankopio,Captura de pantalla,,Kuvakaappaus,Capture d'écran,Snimka zaslona,Képernyő lefényképezése,Cattura schermo,画面キャプチャ,스크린샷,,Skjermbilde,Zrzut ekranu,Captura de tela,,Captură ecran,Снимок экрана,Усликај,Skärmdump,Ekran görüntüsü,Скріншот, +Open console,CNTRLMNU_CONSOLE,,,,Otevřít konzoli,Åbn konsollen,Konsole öffnen,Ανοίξτε την κονσόλα,Malfermi konzolon,Abrir consola,,Avaa konsoli,Ouvrir Console,Otvori konzolu,Konzol megnyitása,Apri la console,コンソールを開く,콘솔 열기,Open console,Åpne konsoll,Otwórz konsolę,Abrir console,Abrir consola,Deschide consola,Открыть консоль,Отвори консолу,Öppna konsolen,Açık konsol,Відкрити консоль, +Pause,CNTRLMNU_PAUSE,,,,Pauza,,,Πάυση,Paŭzo,Pausa,,Tauko,,Pauza,Szünet,Pausa,ポーズ,일시정지,Pauze,,Pauza,Pausar,,Pauză,Пауза,Пауза,Pausa,Duraklat,Пауза, +Increase Display Size,CNTRLMNU_DISPLAY_INC,,,,Zvětšit velikost obrazovky,Forøg visningsstørrelsen,Anzeige vergrößern,Αύξηση μεγέθους οθόνης,Pliigi ekrangrandon,Agrandar ventana,,Suurenna näytön kokoa,Agrandir l'affichage,Povećaj veličinu prikaza,Képméret növelése,Aumenta la dimensione del display,画面サイズを拡大,화면 크기 늘리기,Vergroot het display,Øk visningsstørrelse,Powiększ Rozmiar Wyświetlania,Aumentar tamanho da exibição,Aumentar Tamanho do Ecrã,Mărire ecran,Увеличить размер экрана,Повећајте величину екрана,Öka skärmstorleken,Ekran Boyutunu Artırın,Збільшити розмір екрану, +Decrease Display Size,CNTRLMNU_DISPLAY_DEC,,,,Zmenšit velikost obrazovky,Formindsk skærmstørrelse,Anzeige verkleinern,Μείωση μεγέθους οθόνης,Malpliigi ekrangrandon,Reducir ventana,,Pienennä näytön kokoa,Réduire l'affichage,Smanji veličinu prikaza,Képméret csökkentése,Riduci la dimensione del display,画面サイズを縮小,화면 크기 줄이기,Verlaag het display,Reduser visningsstørrelse,Pomniejsz Rozmiar Wyświetlania,Reduzir tamanho da exibição,Diminuir Tamanho do Ecrã,Micșorare ecran,Уменьшить размер экрана,Смањите величину екрана,Minska visningsstorleken,Ekran Boyutunu Azaltma,Зменшити розмір екрану, +Open Help,CNTRLMNU_OPEN_HELP,,,,Nápověda,Åbn hjælp,Hilfe öffnen,Άνοιγμα βοήθειας,Malfermi helpon,Abrir ayuda,,Avaa ohje,Ouvrir Aide,Otvori pomoć,Segítség előhozása,Apri la guida,"ヘルプを開く ",도움말 열기,Open hulp,Åpne Hjelp,Otwórz Pomoc,Abrir ajuda,,Deschide Ajutor,Экран помощи,Отвори помоћ,Öppna hjälp,Açık Yardım,Відкрити екран допомоги, -Open Save Menu,CNTRLMNU_OPEN_SAVE,,,,Uložit hru,Åbn menuen Gem,Speichermenü öffnen,Άνοιγμα μενού αποθήκευσης,Malfermi konservmenuon,Menú de guardar partida,,Avaa tallennusvalikko,Ouvrir Menu Sauvegarde,Mentés menü előhozása,Apri il menu di salvataggio,セーブメニューを開く,저장 화면 열기,Menu opslaan openen,Åpne Lagre-menyen,Otwórz Menu Zapisu,Abrir menu de salvar,Abrir Menu de Gravação,Deschide meniul de salvare,Меню сохранения игры,Отвори сачуване игре,Öppna sparmenyn,Kaydet Menüsünü Aç,Меню збережень, -Open Load Menu,CNTRLMNU_OPEN_LOAD,,,,Načíst hru,Åbn indlæsningsmenuen,Lademenü öffnen,Άνοιγμα μενού φόρτωσης,Malfermi ŝargmenuon,Menú de cargar partida,,Avaa latausvalikko,Ouvrir Menu Chargement,Betöltés menü előhozása,Apri il menu di caricamento,ロードメニューを開く,불러오기 화면 열기,Menu laden openen,Åpne Last-menyen,Otwórz Menu Wczytania,Abrir menu de carregar,,Deschide meniul de încărcare,Меню загрузки игры,Отвори игре за учитати,Öppna laddningsmenyn,Yük Menüsünü Aç,Меню завантаженнь, -Open Options Menu,CNTRLMNU_OPEN_OPTIONS,,,,Nastavení,Åbn menuen Indstillinger,Optionsmenü öffnen,Άνοιγμα μενού επιλογών,Malfermi agordmenuon,Menú de opciones,,Avaa asetusvalikko,Ouvrir Menu Options,Beállítások menü előhozása,Apri il menu delle opzioni,オプションメニューを開く,설정 화면 열기,Menu Opties openen,Åpne Alternativer-menyen,Otwórz Menu Opcji,Abrir menu de opções,,Deschide setările,Главное меню настроек,Отвори мени опција,Öppna alternativmenyn,Seçenekler Menüsünü Aç,Головне меню параметрів, -Open Display Menu,CNTRLMNU_OPEN_DISPLAY,,,,Nastavení grafiky,Åbn menuen Visning,Anzeigemenü öffnen,Άνοιγμα μενού οθόνης,Malfermi ekranmenuon,Menú de opciones de visualización,,Avaa näyttövalikko,Ouvrir Menu Affichage,Megjelenítés menü előhozása,Apri il menu del display,ディスプレイメニューを開く,디스플레이 화면 열기,Displaymenu openen,Åpne visningsmeny,Otwórz Menu Wyświetlania,Abrir menu de vídeo,,Deschide setările de afișare,Меню настроек видео,Отвори мени приказа,Öppna visningsmenyn,Ekran Menüsünü Aç,Параметри відео, -Quicksave,CNTRLMNU_QUICKSAVE,,,,Rychlé uložení,Quicksave,Schnellspeichern,Γρήγορη αποθήκευση,Rapidkonservo,Guardado rápido,,Pikatallenna,Sauv. Rapide,Gyorsmentés,Salvataggio rapido,クイックセーブ,빠른 저장,Snel opslaan,Hurtiglagring,Szybki Zapis,Salvar rapidamente,Gravação rápida,Salvare rapidă,Быстрое сохранение,Брзо-сачувај,Snabbspara,Hızlı Tasarruf,Швидке збереження, -Quickload,CNTRLMNU_QUICKLOAD,,,,Rychlé načtení,Quickload,Schnellladen,Γρήγορη φόρτωση,Rapidŝargo,Cargado rápido,,Pikalataa,Charg. Rapide,Gyorstöltés,Caricamento rapido,クイックロード,빠른 불러오기,Snel laden,Hurtiglasting,Szybkie Wczytanie,Carregar rapidamente,,Încărcare rapidă,Быстрая загрузка,Брзо-учитај,Snabbladdning,Hızlı Yükleme,Швидке завантаження, -Exit to Main Menu,CNTRLMNU_EXIT_TO_MAIN,,,,Odejít do hlavního menu,Afslut til hovedmenu,Zurück zum Hauptmenü,Έξοδος στο κύριο μενού,Eliri al ĉefa menuo,Salir al menú principal,,Poistu päävalikkoon,Sortie Menu Principal,Kilépés a főmenübe,Esci dal menu principale,メインメニューに戻る,메뉴로 나오기,Afsluiten naar het hoofdmenu,Avslutt til hovedmeny,Wyjdź do Głównego Menu,Sair para o menu principal,,Revenire la meniul principal,Выход в главное меню,Изађи у главни мени,Avsluta till huvudmenyn,Ana Menüden Çıkış,Вихід в головне меню, -Toggle Messages,CNTRLMNU_TOGGLE_MESSAGES,,,,Povolit/skrýt oznámení,Skift mellem meddelelser,Nachrichten an/aus,Εναλλαγή μηνυμάτων,Baskuligi mesaĝojn,Alternar mensajes,,Kytke viestit päälle tai pois,Messages On/Off,Üzenetek kapcsolása,Toggle messaggi,メッセージ表示の切替,메시지 토글,Berichten aan/uit,Veksle meldinger,Włącz / Wyłącz Wiadomości,Ativar/desativar mensagens,,Comutator mesaje,Переключение сообщений,Таглави поруке,Växla meddelanden,Mesajları Değiştir,Увімкнути повідомлення, -Quit Game,CNTRLMNU_MENU_QUIT,,,,Ukončit hru,Afslut spil,Spiel beenden,Στάματα το παιχνίδι,Mallanĉi ludon,Salir del juego,,Lopeta peli,Quitter le Jeu,Kilépés a játékból,Esci dal gioco,ゲームを終了,게임 종료,Stop het spel,Avslutt spill,Wyjdź z Gry,Sair do jogo,,Ieși din Joc,Выход,Изађи из игре,Avsluta spelet,Oyundan Çık,Вихід, -Adjust Gamma,CNTRLMNU_ADJUST_GAMMA,,,,Nastavit gamu,Juster Gamma,Gamma-Anpassung,Ρύθμιση Γάμμα,Agordi gamaon,Ajustar gama,,Säädä gammaa,Ajuster Gamma,Gamma állítása,Aggiustamento Gamma,ガンマ値を調整,감마 조정,Gamma aanpassen,Juster gamma,Dostosuj Gammę,Ajustar gama,,Ajustare gamma,Настройка гаммы,Подесите осветљење,Justera Gamma,Gama Ayarlama,Налаштування гамми, -,,Mouse,,,,,,,,,,,,,,,,,,,,,,,,,,, -Enable mouse,MOUSEMNU_ENABLEMOUSE,,,,Povolit myš,Aktiver mus,Maus aktiv,Ενεργοποίηση ποντικιόυ,Ebligi muson,Habilitar ratón,,Ota hiiri käyttöön,Activer Souris,Egér engedélyezése,Abilita il mouse,マウスの使用,마우스 사용,Muis inschakelen,Aktiver mus,Włącz myszkę,Ativar mouse,Permitir uso do rato,Activare mouse,Использовать мышь,Укључи миш,Aktivera musen,Fareyi etkinleştir,Увімкнути миш, -Enable mouse in menus,MOUSEMNU_MOUSEINMENU,,,,Povolit myš v nabídkách,Aktiver mus i menuer,Maus aktiv in Menüs,Ενεργοποίηση ποντικιόυ στα μενού,Ebligi muson en menuoj,Usa ratón en los menús,,Ota hiiri käyttöön valikoissa,Activer Souris dans les Menus,Egér engedélyezése a menüben,Abilita il mouse nei menu,メニューでのマウスの使用,메뉴에서 마우스 사용,Muis in menu's inschakelen,Aktiver mus i menyer,Włącz myszkę w menu,Ativar mouse nos menus,Permitir rato nos menus,Activare mouse în meniuri,Использовать мышь в меню,Укључи миш у менијима,Aktivera musen i menyer,Menülerde fareyi etkinleştir,Увімкнути миш в меню, -Show back button,MOUSEMNU_SHOWBACKBUTTON,,,,Zobrazit tlačítko zpět,Vis tilbage-knappen,Zeige Zurück-Knopf,Εμφάνιση του κουμπιού επιστροφής,Montri reen-butonon,Mostrar botón de retroceso,,Näytä taaksenäppäin,Afficher le bouton retour,Vissza gomb mutatása,Mostra il bottone per tornare indietro,戻るボタンを表示,뒤로가기 버튼 보이기,Toon terug knop,Vis tilbake-knapp,Pokaż przycisk powrotu,Exibir botão de voltar,,Afișare buton de întoarcere,Расположение кнопки «назад»,Прикажи тастер за назад,Visa bakåtknappen,Geri düğmesini göster,"Кнопка ""назад""", -Cursor,MOUSEMNU_CURSOR,,,,Kurzor,Markør,,Δρομέας,Musmontrilo,,,Osoitin,Curseur,Egérmutató,Cursore,カーソル,커서,,Markør,Kursor,Cursor,,,Курсор,Курсор,Markör,İmleç,Курсор, -Horizontal sensitivity,MOUSEMNU_SENSITIVITY_X,,,,Horizontální citlivost,Vandret følsomhed,Horizontale Empfindlichkeit,Οριζόντια ευαισθησία,Horizontala sentemo,Sensibilidad horizontal,,Vaakasuuntainen herkkyys,Sensibilité horizontale,Vízszintes érzékenység,Sensibilità orizzontale,水平感度,수평 감도,Horizontale gevoeligheid,Horisontal følsomhet,Czułość pozioma,Sensibilidade horizontal,,Sensibilitate orizontală,Горизонтальная чувствительность,Хоризонтална осетљивост,Horisontell känslighet,Yatay hassasiyet,Горизонтальна чутливість, -Vertical sensitivity,MOUSEMNU_SENSITIVITY_Y,,,,Vertikální citlivost,Lodret følsomhed,Vertikale Empfindlichkeit,Κάθετη ευαισθησία,Vertikala sentemo,Sensibilidad vertical,,Pystysuuntainen herkkyys,Sensibilité verticale,Függőleges érzékenység,Sensibilità verticale,垂直感度,수직 감도,Verticale gevoeligheid,Vertikal følsomhet,Czułość pionowa,Sensibilidade vertical,,Sensibilitate verticală,Вертикальная чувствительность,Вертикална осетљивост,Vertikal känslighet,Dikey hassasiyet,Вертикальна чутливість, -Smooth mouse movement,MOUSEMNU_SMOOTHMOUSE,,,,Vyhladit pohyb myši,Jævn bevægelse af musen,Mausbewegung glätten,Ομαλή κίνηση του ποντικιού,Glata musmovo,Mov. fluido del ratón,,Sulava hiiren liike,Lissage Souris,Egérmozgás simítása,Movimento del mouse liscio,マウス操作を滑らかにする,부드러운 움직임,Vlotte muisbeweging,Jevn musebevegelse,Gładki ruch myszki,Suavizar movimento do mouse,Movimento fluído do rato,Mișcare mouse fină,Плавное перемещение,Глатки окрет,Smidig musrörelse,Pürüzsüz fare hareketi,Плавний рух миші, -Turning speed,MOUSEMNU_TURNSPEED,,,,Rychlost otáčení,Drejehastighed,Umdrehgeschwindigkeit,Ταχύτητα περιστροφής,Turnorapido,Velocidad de giro,,Kääntymisnopeus,Vitesse pour tourner,Fordulás sebessége,Velocità di rotazione,旋回速度,회전 속도,Draaisnelheid,Dreiehastighet,Szybkość obracania się,Velocidade de giro,,Viteză rotire,Скорость поворота,Брзина окрета,Vändningshastighet,Dönüş hızı,Швидкість повороту, -Mouselook speed,MOUSEMNU_MOUSELOOKSPEED,,,,Rychlost pohledu nahoru/dolů,Hastighed for mus-look,Mausblick-Geschwindigkeit,Ταχύτητα εμφάνισης ποντικιού,Musrigarda rapido,Veloc. de vista con ratón,,Katselunopeus,Vitesse Vue Souris,Egérnézés sebessége,Velocità di rotazione della vista,上下視点速度,마우스룩 속도,Mouselook snelheid,Muselook-hastighet,Szybkość rozglądania się myszką,Velocidade da visão com mouse,Velocidade de vista com rato,Viteză privire în jur cu mouse,Скорость обзора,Брзина гледања мишем,Hastighet för muspekning,Mouselook hızı,Швидкість огляду, -Forward/Backward speed,MOUSEMNU_FORWBACKSPEED,,,,Rychlost pohybu vpřed/vzad,Hastighed fremad/tilbage,Vor/Rückwärtsgeschwindigkeit,Ταχύτητα προς τα εμπρός/πίσω,Antaŭa/Malantaŭa rapido,Veloc. de avance/retroceso,,Eteen-/taaksepäin liikkeen nopeus,Vitesse Avancer/reculer,Előre/Hátra sebesség,Velocità avanti/indietro,"前進/後退速度 +Open Save Menu,CNTRLMNU_OPEN_SAVE,,,,Uložit hru,Åbn menuen Gem,Speichermenü öffnen,Άνοιγμα μενού αποθήκευσης,Malfermi menuon konservi,Menú de guardar partida,,Avaa tallennusvalikko,Ouvrir Menu Sauvegarde,Otvori izbornik spremanja,Mentés menü előhozása,Apri il menu di salvataggio,セーブメニューを開く,저장 화면 열기,Menu opslaan openen,Åpne Lagre-menyen,Otwórz Menu Zapisu,Abrir menu de salvar,Abrir Menu de Gravação,Deschide meniul de salvare,Меню сохранения игры,Отвори сачуване игре,Öppna sparmenyn,Kaydet Menüsünü Aç,Меню збережень, +Open Load Menu,CNTRLMNU_OPEN_LOAD,,,,Načíst hru,Åbn indlæsningsmenuen,Lademenü öffnen,Άνοιγμα μενού φόρτωσης,Malfermi menuon ŝargi,Menú de cargar partida,,Avaa latausvalikko,Ouvrir Menu Chargement,Otvori izbornik učitavanja,Betöltés menü előhozása,Apri il menu di caricamento,ロードメニューを開く,불러오기 화면 열기,Menu laden openen,Åpne Last-menyen,Otwórz Menu Wczytania,Abrir menu de carregar,,Deschide meniul de încărcare,Меню загрузки игры,Отвори игре за учитати,Öppna laddningsmenyn,Yük Menüsünü Aç,Меню завантаженнь, +Open Options Menu,CNTRLMNU_OPEN_OPTIONS,,,,Nastavení,Åbn menuen Indstillinger,Optionsmenü öffnen,Άνοιγμα μενού επιλογών,Malfermi menuon de agordoj,Menú de opciones,,Avaa asetusvalikko,Ouvrir Menu Options,Otvori izbornik postavki,Beállítások menü előhozása,Apri il menu delle opzioni,オプションメニューを開く,설정 화면 열기,Menu Opties openen,Åpne Alternativer-menyen,Otwórz Menu Opcji,Abrir menu de opções,,Deschide setările,Главное меню настроек,Отвори мени опција,Öppna alternativmenyn,Seçenekler Menüsünü Aç,Головне меню параметрів, +Open Display Menu,CNTRLMNU_OPEN_DISPLAY,,,,Nastavení grafiky,Åbn menuen Visning,Anzeigemenü öffnen,Άνοιγμα μενού οθόνης,Malfermi menuon de ekrano,Menú de opciones de visualización,,Avaa näyttövalikko,Ouvrir Menu Affichage,Otvori izbornik prikaza,Megjelenítés menü előhozása,Apri il menu del display,ディスプレイメニューを開く,디스플레이 화면 열기,Displaymenu openen,Åpne visningsmeny,Otwórz Menu Wyświetlania,Abrir menu de vídeo,,Deschide setările de afișare,Меню настроек видео,Отвори мени приказа,Öppna visningsmenyn,Ekran Menüsünü Aç,Параметри відео, +Quicksave,CNTRLMNU_QUICKSAVE,,,,Rychlé uložení,Quicksave,Schnellspeichern,Γρήγορη αποθήκευση,Rapidkonservi,Guardado rápido,,Pikatallenna,Sauv. Rapide,Brzo spremanje,Gyorsmentés,Salvataggio rapido,クイックセーブ,빠른 저장,Snel opslaan,Hurtiglagring,Szybki Zapis,Salvar rapidamente,Gravação rápida,Salvare rapidă,Быстрое сохранение,Брзо-сачувај,Snabbspara,Hızlı Tasarruf,Швидке збереження, +Quickload,CNTRLMNU_QUICKLOAD,,,,Rychlé načtení,Quickload,Schnellladen,Γρήγορη φόρτωση,Rapidŝargi,Cargado rápido,,Pikalataa,Charg. Rapide,Brzo učitavanje,Gyorstöltés,Caricamento rapido,クイックロード,빠른 불러오기,Snel laden,Hurtiglasting,Szybkie Wczytanie,Carregar rapidamente,,Încărcare rapidă,Быстрая загрузка,Брзо-учитај,Snabbladdning,Hızlı Yükleme,Швидке завантаження, +Exit to Main Menu,CNTRLMNU_EXIT_TO_MAIN,,,,Odejít do hlavního menu,Afslut til hovedmenu,Zurück zum Hauptmenü,Έξοδος στο κύριο μενού,Eliri al ĉefa menuo,Salir al menú principal,,Poistu päävalikkoon,Sortie Menu Principal,Izlaz u glavni izbornik,Kilépés a főmenübe,Esci dal menu principale,メインメニューに戻る,메뉴로 나오기,Afsluiten naar het hoofdmenu,Avslutt til hovedmeny,Wyjdź do Głównego Menu,Sair para o menu principal,,Revenire la meniul principal,Выход в главное меню,Изађи у главни мени,Avsluta till huvudmenyn,Ana Menüden Çıkış,Вихід в головне меню, +Toggle Messages,CNTRLMNU_TOGGLE_MESSAGES,,,,Povolit/skrýt oznámení,Skift mellem meddelelser,Nachrichten an/aus,Εναλλαγή μηνυμάτων,Baskuligi mesaĝojn,Alternar mensajes,,Kytke viestit päälle tai pois,Messages On/Off,Prekidač poruka,Üzenetek kapcsolása,Toggle messaggi,メッセージ表示の切替,메시지 토글,Berichten aan/uit,Veksle meldinger,Włącz / Wyłącz Wiadomości,Ativar/desativar mensagens,,Comutator mesaje,Переключение сообщений,Таглави поруке,Växla meddelanden,Mesajları Değiştir,Увімкнути повідомлення, +Quit Game,CNTRLMNU_MENU_QUIT,,,,Ukončit hru,Afslut spil,Spiel beenden,Στάματα το παιχνίδι,Mallanĉi ludon,Salir del juego,,Lopeta peli,Quitter le Jeu,Izađi iz igre,Kilépés a játékból,Esci dal gioco,ゲームを終了,게임 종료,Stop het spel,Avslutt spill,Wyjdź z Gry,Sair do jogo,,Ieși din Joc,Выход,Изађи из игре,Avsluta spelet,Oyundan Çık,Вихід, +Adjust Gamma,CNTRLMNU_ADJUST_GAMMA,,,,Nastavit gamu,Juster Gamma,Gamma-Anpassung,Ρύθμιση Γάμμα,Agordi gamaon,Ajustar gama,,Säädä gammaa,Ajuster Gamma,Prilagodi gamu,Gamma állítása,Aggiustamento Gamma,ガンマ値を調整,감마 조정,Gamma aanpassen,Juster gamma,Dostosuj Gammę,Ajustar gama,,Ajustare gamma,Настройка гаммы,Подесите осветљење,Justera Gamma,Gama Ayarlama,Налаштування гамми, +,,Mouse,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Enable mouse,MOUSEMNU_ENABLEMOUSE,,,,Povolit myš,Aktiver mus,Maus aktiv,Ενεργοποίηση ποντικιόυ,Ebligi muson,Habilitar ratón,,Ota hiiri käyttöön,Activer Souris,Omogući miš,Egér engedélyezése,Attiva il mouse,マウスの使用,마우스 사용,Muis inschakelen,Aktiver mus,Włącz myszkę,Ativar mouse,Permitir uso do rato,Activare mouse,Использовать мышь,Укључи миш,Aktivera musen,Fareyi etkinleştir,Увімкнути миш, +Enable mouse in menus,MOUSEMNU_MOUSEINMENU,,,,Povolit myš v nabídkách,Aktiver mus i menuer,Maus aktiv in Menüs,Ενεργοποίηση ποντικιόυ στα μενού,Ebligi muson en menuoj,Usa ratón en los menús,,Ota hiiri käyttöön valikoissa,Activer Souris dans les Menus,Omogući miš u izbornicima,Egér engedélyezése a menüben,Attiva il mouse nei menu,メニューでのマウスの使用,메뉴에서 마우스 사용,Muis in menu's inschakelen,Aktiver mus i menyer,Włącz myszkę w menu,Ativar mouse nos menus,Permitir rato nos menus,Activare mouse în meniuri,Использовать мышь в меню,Укључи миш у менијима,Aktivera musen i menyer,Menülerde fareyi etkinleştir,Увімкнути миш в меню, +Show back button,MOUSEMNU_SHOWBACKBUTTON,,,,Zobrazit tlačítko zpět,Vis tilbage-knappen,Zeige Zurück-Knopf,Εμφάνιση του κουμπιού επιστροφής,Montri reen-butonon,Mostrar botón de retroceso,,Näytä taaksenäppäin,Afficher le bouton retour,Prikaži gumb za povratak,Vissza gomb mutatása,Mostra il bottone per tornare indietro,戻るボタンを表示,뒤로가기 버튼 보이기,Toon terug knop,Vis tilbake-knapp,Pokaż przycisk powrotu,Exibir botão de voltar,,Afișare buton de întoarcere,Расположение кнопки «назад»,Прикажи тастер за назад,Visa bakåtknappen,Geri düğmesini göster,"Кнопка ""назад""", +Cursor,MOUSEMNU_CURSOR,,,,Kurzor,Markør,,Δρομέας,Musmontrilo,,,Osoitin,Curseur,Pokazivač,Egérmutató,Cursore,カーソル,커서,,Markør,Kursor,Cursor,,,Курсор,Курсор,Markör,İmleç,Курсор, +Horizontal sensitivity,MOUSEMNU_SENSITIVITY_X,,,,Horizontální citlivost,Vandret følsomhed,Horizontale Empfindlichkeit,Οριζόντια ευαισθησία,Horizontala sentemo,Sensibilidad horizontal,,Vaakasuuntainen herkkyys,Sensibilité horizontale,Horizontalna osjetljivost,Vízszintes érzékenység,Sensibilità orizzontale,水平感度,수평 감도,Horizontale gevoeligheid,Horisontal følsomhet,Czułość pozioma,Sensibilidade horizontal,,Sensibilitate orizontală,Горизонтальная чувствительность,Хоризонтална осетљивост,Horisontell känslighet,Yatay hassasiyet,Горизонтальна чутливість, +Vertical sensitivity,MOUSEMNU_SENSITIVITY_Y,,,,Vertikální citlivost,Lodret følsomhed,Vertikale Empfindlichkeit,Κάθετη ευαισθησία,Vertikala sentemo,Sensibilidad vertical,,Pystysuuntainen herkkyys,Sensibilité verticale,Vertikalna osjetljivost,Függőleges érzékenység,Sensibilità verticale,垂直感度,수직 감도,Verticale gevoeligheid,Vertikal følsomhet,Czułość pionowa,Sensibilidade vertical,,Sensibilitate verticală,Вертикальная чувствительность,Вертикална осетљивост,Vertikal känslighet,Dikey hassasiyet,Вертикальна чутливість, +Smooth mouse movement,MOUSEMNU_SMOOTHMOUSE,,,,Vyhladit pohyb myši,Jævn bevægelse af musen,Mausbewegung glätten,Ομαλή κίνηση του ποντικιού,Glata musmovo,Mov. fluido del ratón,,Sulava hiiren liike,Lissage Souris,Glatko kretanje miša,Egérmozgás simítása,Movimento del mouse liscio,マウス操作を滑らかにする,부드러운 움직임,Vlotte muisbeweging,Jevn musebevegelse,Gładki ruch myszki,Suavizar movimento do mouse,Movimento fluído do rato,Mișcare mouse fină,Плавное перемещение,Глатки окрет,Smidig musrörelse,Pürüzsüz fare hareketi,Плавний рух миші, +Turning speed,MOUSEMNU_TURNSPEED,,,,Rychlost otáčení,Drejehastighed,Umdrehgeschwindigkeit,Ταχύτητα περιστροφής,Rapido de turniĝo,Velocidad de giro,,Kääntymisnopeus,Vitesse pour tourner,Brzina okreta,Fordulás sebessége,Velocità di rotazione,旋回速度,회전 속도,Draaisnelheid,Dreiehastighet,Szybkość obracania się,Velocidade de giro,,Viteză rotire,Скорость поворота,Брзина окрета,Vändningshastighet,Dönüş hızı,Швидкість повороту, +Mouselook speed,MOUSEMNU_MOUSELOOKSPEED,,,,Rychlost pohledu nahoru/dolů,Hastighed for mus-look,Mausblick-Geschwindigkeit,Ταχύτητα εμφάνισης ποντικιού,Rapido de musrigardo,Veloc. de vista con ratón,,Katselunopeus,Vitesse Vue Souris,Brzina pogleda mišem,Egérnézés sebessége,Velocità di rotazione della vista,上下視点速度,마우스룩 속도,Mouselook snelheid,Muselook-hastighet,Szybkość rozglądania się myszką,Velocidade da visão com mouse,Velocidade de vista com rato,Viteză privire în jur cu mouse,Скорость обзора,Брзина гледања мишем,Hastighet för muspekning,Mouselook hızı,Швидкість огляду, +Forward/Backward speed,MOUSEMNU_FORWBACKSPEED,,,,Rychlost pohybu vpřed/vzad,Hastighed fremad/tilbage,Vor/Rückwärtsgeschwindigkeit,Ταχύτητα προς τα εμπρός/πίσω,Rapido de (mal)antaŭeniro,Veloc. de avance/retroceso,,Eteen-/taaksepäin liikkeen nopeus,Vitesse Avancer/reculer,Brzina kretanja naprijed/natrag,Előre/Hátra sebesség,Velocità avanti/indietro,"前進/後退速度 ",전진/후진 속도,Voorwaartse/achterwaartse snelheid,Hastighet forover/bakover,Szybkość chodzenia do przodu/do tyłu,Velocidade de deslocamento para frente/trás,,Viteză deplasare față/spate,Скорость передвижения,Брзина окрета напред/уназад,Hastighet framåt/bakåt,İleri/Geri hız,Швидкість руху вперед/назад, -Strafing speed,MOUSEMNU_STRAFESPEED,,,,Rychlost pohybu do stran,Strafing-hastighed,Seitwärtsgeschwindigkeit,Ταχύτητα καταδίωξης,Flankmova rapido,Veloc. de mov. lateral,,Sivuttaisastunnan nopeus,Vitesse Gauche/Droite,Oldalazás sebessége,Velocità movimento laterale,横移動速度,좌진/우진 속도,Zijdelings snelheid,Hastigheten for stansing,Szybkość uników,Velocidade de deslocamento lateral,,Viteză deplasare în diagonală,Скорость движения боком,Брзина стрејфа,Hastighet för strafe,Strafe hızı,Швидкість руху боком, -Always Mouselook,MOUSEMNU_ALWAYSMOUSELOOK,,,,Vždy se rozhlížet myší,Altid mus-look,Mausblick immer an,Πάντα κοίτα με το ποντίκι,Ĉiam musrigardi,Siempre mirar con ratón,,Jatkuva hiirikatselu,Toujours vue Souris,Mindig egérrel nézelődés,Vista col mouse,常に上下視点をオン,마우스룩 사용,Altijd Mouselook,Alltid muselook,Zawsze zezwalaj na rozglądanie się myszką,Visão com mouse sempre ativada,Vista com rato sempre ligada,Privire în jur cu mouse permanentă,Обзор мышью,Гледање мишем,Alltid muspekande,Her zaman Mouselook,Огляд мишкою, -Invert Mouse Y,MOUSEMNU_INVERTMOUSE,,,,Vertikálně obrátit myš,Inverter mus Y,Maus Y invertieren,Αντιστροφή ποντικιού Y,Inversi muson Y,Invertir ratón Y,,Käännä hiiri Y,Inverser Souris Y,Y tengely megfordítása,Mouse Y invertito,視点操作反転,마우스 방향 전환,Muis-Y-as omkeren,Inverter mus Y,Odwróć Myszkę - Oś Y,Inverter eixo Y do mouse,Inverter rato,Inversare axă mouse Y,Инверт. мышь по вертикали (Y),Инвертуј миш Y,Invertera mus Y,Fare Y'yi Ters Çevir,Інвертувати мишу Y, -Invert Mouse X,MOUSEMNU_INVERTMOUSEX,,,,Horizontálně obrátit myš,Inverter mus X,Maus X invertieren,Αντιστροφή ποντικιού X,Inversi muson X,Invertir ratón X,,Käännä hiiri X,Inverser Souris X,X tengely megfordítása,Mouse X invertito,視点操作反転,마우스 방향 전환,Muis-X-as omkeren,Inverter mus X,Odwróć Myszkę - Oś X,Inverter eixo X do mouse,Inverter rato X,Inversare axă mouse X,Инверт. мышь по горизонтали (X),Инвертуј миш X,Invertera mus X,Fare X'i Ters Çevir,Інвертувати мишу Х, -Upper left,OPTVAL_UPPERLEFT,,,,Vlevo nahoře,Øverste venstre,Oben links,Πάνω αριστερά,Supra maldekstre,Sup. izquierda,,Ylävasemmalla,Supérieur gauche,Bal fent,Superiore sinistro,左上,왼쪽 위,Linksboven,Øvre venstre,Lewy górny róg,Esquerda superior,,Stânga sus,Вверху слева,Горње лево,Övre vänster,Sol üst,"Кнопка ""назад"": Зверху-ліворуч", -Upper right,OPTVAL_UPPERRIGHT,,,,Vpravo nahoře,Øvre højre,Oben rechts,Πάνω δεξιά,Supra dekstre,Sup. derecha,,Yläoikealla,Supérieur droite,Jobb fent,Superiore destro,右上,오른쪽 위,Rechtsboven,Øverst til høyre,Prawy górny róg,Direita superior,,Dreapta sus,Вверху справа,Горње десно,Övre höger,Sağ üst,"Кнопка ""назад"": Зверху-праворуч", -Lower left,OPTVAL_LOWERLEFT,,,,Vlevo dole,Nederste venstre,Unten links ,Κάτω αριστερά,Suba maldekstre,Inf. izquierda,,Alavasemmalla,Inférieur gauche,Bal lent,Inferiore sinistro,左下,왼쪽 밑,Linksonder,Nedre venstre,Lewy dolny róg,Esquerda inferior,,Stânga jos,Внизу слева,Доње лево,Nedre vänster,Sol alt,"Кнопка ""назад"": Знизу-ліворуч", -Lower right,OPTVAL_LOWERRIGHT,,,,Vpravo dole,Nederste højre,Unten rechts,Κάτω δεξιά,Suba dekstre,Inf. derecha,,Alaoikealla,Inférieur droite,Jobb lent,Inferiore destro,右下,오른쪽 밑,Rechtsonder,Nedre høyre,Prawy dolny róg,Direita inferior,,Dreapta jos,Внизу справа,Доње десно,Nedre höger,Sağ alt,"Кнопка ""назад"": Знизу-праворуч", -Touchscreen-like,OPTVAL_TOUCHSCREENLIKE,,,,Jako dotyková obrazovka,Touchscreen-lignende,Wie auf einem Touchscreen,Οθόνη αφής,Tuŝekraneca,Pant. táctil,,Kosketusnäyttömäinen,Style écran tactile,Érintőképernyő-szerű,Come il Touchscreen,タッチスクリーン式,터치스크린 같게,Touchscreen-achtige,Berøringsskjerm-lignende,Jak ekrean dotykowy,Estilo touchscreen,,Precum touchscreen,Как сенсорный экран,Као додирни екран,Pekskärmsliknande,Dokunmatik ekran benzeri,Як сенсорний екран, -Simple arrow,OPTSTR_SIMPLEARROW,,,,Jednoduchý kurzor,Simpel pil,Einfacher Pfeil,Απλό βέλος,Simpla sago,Flecha simple,,Yksinkertainen nuoli,Flèche simple,Sima nyíl,Freccia semplice,シンプル,기본 커서,Eenvoudige pijl,Enkel pil,Prosta strzałka,Seta simples,Cursor simples,Săgeată simplă,Стрелка,Стрелица,Enkel pil,Basit ok,Стрілка, -System cursor,OPTSTR_SYSTEMCURSOR,,,,Systémový kurzor,Systemcursor,Systemcursor,Δείκτης συστήματος,Sistema kursoro,Cursor del sistema,,Järjestelmän osoitin,Curseur Système,Rendszer egérmutatója,Cursore di sistema,システム,시스템 커서,Systeemcursor,Systemmarkør,Kursor systemu,Cursor do sistema,,Cursor simplu,Системный курсор,Системска стрелица,Systemmarkör,Sistem imleci,Системний курсор, -Default,OPTVAL_DEFAULT,,,,Výchozí,Standard,Standard,Προεπιλογή,Defaŭlta,Por defecto,,Oletus,Défaut,Alapbeállítás,Predefinito,デフォルト,기본 설정,Standaard,Standard,Domyślne,Padrão,,Implicit,По умолчанию,Подраз.,Standard,Varsayılan,За замовчуванням, -,,Controller,,,,,,,,,,,,,,,,,,,,,,,,,,, -Configure Controller,JOYMNU_TITLE,,,,Konfigurace ovladače,Konfigurer controller,Controller konfigurieren,,Agordi ludregilon,Configurar mando,,Peliohjainasetukset,Configurer Mannette,Kontroller testreszabása,Configura il controller,コントローラー構成:,컨트롤러 구성,Controller configureren,Konfigurer kontrolleren,Konfiguruj Kontroler,Configurar controle,Configurar Comando,Configurare controller,Настроить контроллер,Конфигурација контролера,Konfigurera kontroller,Denetleyiciyi Yapılandırma,Параметри контролера, -Controller Options,JOYMNU_OPTIONS,,,,Ovladač,Indstillinger for styreenhed,Controlleroptionen,,Ludregilo-agordoj,Opciones del mando,,Peliohjainasetukset,Options Mannette,Kontroller beállítások,Opzioni del controller,コントローラー設定,컨트롤러 설정,Controller opties,Alternativer for styreenhet,Opcje Kontrolera,Opções de controle,Opções do Comando,Setări controller,Настройки контроллера,Подешавања контролера,Alternativ för kontroller,Kontrolör Seçenekleri,Налаштування контролера, -Block controller input in menu,JOYMNU_NOMENU,,,,Zakázat ovladač v nabídkách,Bloker controller input i menuen,Blockiere Controllereingabe im Menü,,Blokigi ludregilan enigon en menuo,Bloq. entrada de mando en menú,,Estä ohjainsyötteet valikoissa,Bloquer manette dans les menus,Kontroller ne működjön a menüben,Blocca l'input del controller nei menu,メニューではコントローラーを無視,메뉴에서 컨트롤러 끄기,Blokkeer de controller in het menu,Blokker kontrollerinngang i menyen,Blokuj wejście kontrolera w menu,Bloquear controle no menu,Bloquear comando no menu,Blocare comenzi controller în meniu,Отключить контроллер в меню,Блокирај улаз контролера у менију,Blockera inmatning av kontroller i menyn,Menüde kontrolör girişini engelle,Відключити контролер в меню, -Enable controller support,JOYMNU_ENABLE,,,,Povolit podporu pro ovladače,Aktivering af controllerunderstøttelse,Erlaube Controllerunterstützung,,Ŝalti ludregilan subtenon,Activar soporte de mandos,,Ota käyttöön peliohjaintuki,Activer support contrôleur,Kontroller támogatás engedélyezése,Abilita il supporto del controller,コントローラーサポート許可,컨트롤러 지원 허용,Controllerondersteuning inschakelen,Aktiver støtte for styreenhet,Włącz wsparcie kontrolera,Ativar detecção de controles,,Activare support controller,Включить поддержку контроллера,Омогући подршку за контролере,Aktivera stöd för kontroller,Denetleyici desteğini etkinleştir,Увімкнути підтримку контролера, -Enable DirectInput controllers,JOYMNU_DINPUT,,,,Povolit ovladače DirectInput,Aktivering af DirectInput-controllere,Erlaube DirectInput-Controller,,Ŝalti DirectInput ludregilojn,Usa controles DirectInput,,Ota käyttöön DirectInput-ohjaimet,Activer contrôleurs DirectInput,DirectInput kontrollerek engedélyezése,Abilita i controlli DirectInput,ダイレクトインプットコントローラー許可,다이렉트 인풋 컨트롤러 허용,DirectInput-controllers inschakelen,Aktiver DirectInput-kontrollere,Włącz kontrolery DirectInput,Ativar controles DirectInput,,Activare controlere DirectInput,Включить контроллеры через DirectInput,Омогући директинпут контролере,Aktivera DirectInput-kontroller,DirectInput denetleyicilerini etkinleştirin,Увімкнути контролери DirectInput, -Enable XInput controllers,JOYMNU_XINPUT,,,,Povolit ovladače XInput,Aktiver XInput-controllere,Erlaube XInput-Controller,,Ŝalti XInput ludregilojn,Usa controles XInput,,Ota käyttöön XInput-ohjaimet,Activer contrôleurs XInput,XInput kontrollerek engedélyezése,Abilita i controlli XInput,Xinput コントローラー許可,X인풋 컨트롤러 허용,XInput-controllers inschakelen,Aktiver XInput-kontrollere,Włącz kontrolery XInput,Ativar controles XInput,,Activare controlere XInput,Включить контроллеры через XInput,Омогући Иксинпут контролере,Aktivera XInput-kontroller,XInput denetleyicilerini etkinleştirin,Увімкнути контролери XInput, -Enable raw PlayStation 2 adapters,JOYMNU_PS2,,,,Povolit ovladače PlayStation 2,Aktiver rå PlayStation 2-adaptere,Erlaube Playstation 2-Controller,,Ŝalti krudajn adaptilojn de PlayStation 2 ,Usa adaptadores de PlayStation 2,,Ota käyttöön raa'at PlayStation 2 -adapterit,Activer adaptateurs PS2 bruts,PlayStation 2 adapterek engedélyezése,Abilita gli adattatori raw PlayStation 2,PlayStation2 アダプター許可,PS2 어뎁터 허용,Raw PlayStation 2-adapters inschakelen,Aktiver rå PlayStation 2-adaptere,Włącz adaptery PlayStation 2,Ativar adaptadores de PlayStation 2,,Activare adaptoare PS2,Использовать адаптеры PlayStation 2 напрямую,Омогући сирове Плејстејшн 2 адаптере,Aktivera råa PlayStation 2-adaptrar,Ham PlayStation 2 adaptörlerini etkinleştirin,Використовувати адаптери PlayStation 2 напряму, -No controllers detected,JOYMNU_NOCON,,,,Nenalezeny žádné ovladače.,Ingen controllere er fundet,Keine Controller gefunden,,Neniu ludregilo detektita,No hay mandos detectados,,Ei havaittuja ohjaimia,Aucun Contrôleur détecté.,Nem érzékelhető kontroller,Nessun controller trovato,コントローラーが見つかりません,인식된 컨트롤러 없음,Geen controllers gedetecteerd,Ingen kontrollere oppdaget,Nie wykryto kontrolerów,Nenhum controle detectado.,Nenhum comando foi detectado,Niciun controller detectat,Контроллеры не обнаружены,Нема детектованих контролера,Inga kontroller upptäcks,Denetleyici algılanmadı,Контролерів не виявлено, -Configure controllers:,JOYMNU_CONFIG,,,,Nastavit ovladače:,Konfigurer controllere:,Controller konfigurieren,,Agordi ludregilojn:,Configurar controles:,,Mukauta ohjaimia:,Configurer contrôleurs:,Kontrollerek konfigurációja:,Configura i controller:,コントローラー構成:,컨트롤러 설정:,Configureer controllers:,Konfigurer kontrollere:,Konfiguruj kontrolery:,Configurar controles:,Configurar comandos,Configurare controlere:,Настроить контроллер:,Подешавања контролере:,Konfigurera kontroller:,Denetleyicileri yapılandırın:,Налаштувати контролери, -Controller support must be,JOYMNU_DISABLED1,,,,Pro nalezení ovladačů musí,Der skal være støtte til controlleren,Controllerunterstütung muss aktiviert sein,,Ludregilo-subteno devas esti,El soporte de mandos debe estar,,Ohjaintuen täytyy olla otettu,Le Support de contrôleur doit être activé,A kontroller támogatásnak,Il supporto ai controller deve essere,コントローラーサポートは,감지하려면 컨트롤러 지원을,Controller ondersteuning moet ingeschakeld zijn,Støtte for kontrollere må være,Wsparcie kontrolera musi być,A detecção de controles deve,Suporte a comandos devem ser,Supportul pentru controller trebuie,Включите поддержку контроллера,Омогућите подржавање контролера,Stöd för kontroller måste vara aktiverat,Denetleyici desteği şu şekilde olmalıdır,Включіть підтримку контролерів, -enabled to detect any,JOYMNU_DISABLED2,Supposed to be empty in Russian and Serbian.,,,být zapnuta jejich podpora.,aktiveret for at registrere enhver,um welche zu finden,,ŝaltita por detekti iun ajn,activado para detectar alguno,,käyttöön ohjainten havaitsemiseksi,avant de pouvoir en détecter un.,"engedélyezve kell lenni, hogy érzékeljen bármit is.",abilitato a trovare ogni,検出しました,활성화 해야합니다.,om eventuele regelaars te detecteren.,aktivert for å oppdage en hvilken som helst,Włączony by wykryć jakikolwiek,ser ativada para exibi-los.,,activat pentru a putea fi detectate, \n, \n,för att det ska gå att upptäcka några,tespit etmek için etkinleştirildi, \n, -Invalid controller specified for menu,JOYMNU_INVALID,,,,Vybrán nesprávný ovladač pro nabídky,Ugyldig controller angivet til menuen,Ungültiger Controller für Menü ausgewählt,,Nevalida ludregilo specifigita por menuo,Mando inválido especificado para el menú,,Epäkelpo ohjain määritetty valikolle,Contrôleur invalide spécifé dans le menu.,Hibás kontroller van a menühöz osztva,Controller invalido specificato per il menu,メニューではコントローラーを使用しない,메뉴에 특정된 컨트롤러가 아닙니다.,Ongeldige regelaar gespecificeerd voor het menu,Ugyldig kontroller spesifisert for menyen,Niewłaściwy kontroler określony dla menu,Controle inválido especificado para o menu.,Comando inválido,Controller pentru meniu invalid,Недопустимый контроллер выбран для меню,Невалидан контролер специфиран за мени,Ogiltig kontroller har angetts för menyn,Menü için geçersiz denetleyici belirtildi,Для меню вибрано невідповідний контролер, -Overall sensitivity,JOYMNU_OVRSENS,,,,Celková citlivost,Samlet følsomhed,Allgemeine Empfindlichkeit,,Tuta sentemeco,Sensibilidad general,,Yleisherkkyys,Sensibilité générale,Teljes érzékenység,Sensibilità generale,全体的な感度,전체 민감도,Algemene gevoeligheid,Samlet følsomhet,Ogólna Czułość,Sensibilidade geral,,Sensibilitate în ansamblu,Общая чувствительность,Уупна сензитивност,Övergripande känslighet,Genel hassasiyet,Загальна чутливість, -Axis Configuration,JOYMNU_AXIS,,,,Nastavení os,Konfiguration af akserne,Achsenkonfiguration,,Akso-agordoj,Configuración del eje,,Akseleiden säätäminen,Configuration des axes,Tengely konfigurálása,Configurazione assi,軸構成,축 구성,Asconfiguratie,Konfigurasjon av akse,Konfiguruj Oś,Configuração de eixo,,Configurare axă,Конфигурация осей,Конфигурација осе,Konfiguration av axlar,Eksen Konfigürasyonu,Конфігурація осей, -Invert,JOYMNU_INVERT,,,,Obrátit,Invert,Invertieren,,Inversigi,Invertir,,Käännä,Inverser,Megfordítás,Inverti,反転,순서 바꿈,Omkeren,Invertering,Odwróć,Inverter,,Inversare,Инвертировать,Инвертовано,Invertera,Ters çevir,Інвертувати, -Dead zone,JOYMNU_DEADZONE,,,,Mrtvá zóna,Dødzone,Totzone,,Mortozono,Zona muerta,,Kuollut alue,Zone neutre,Holttér,Zona cieca,デッドゾーン,불감대,Dode zone,Død sone,Martwa strefa,Zona morta,,Zonă moartă,Мёртвая зона,Мртва зона,Dödzon,Ölü bölge,Мертва зона, -No configurable axes,JOYMNU_NOAXES,,,,Žádné nastavitelné osy,Ingen konfigurerbare akser,Keine konfigurierbaren Achsen,,Neniuj agordeblaj aksoj,No hay ejes configurables,,Ei säädettäviä akseleita,Aucun axe à configurer,Nincs beállítható tengely,Nessun asse configurabile,軸構成を無効,설정할 방향키가 없습니다.,Geen configureerbare assen,Ingen konfigurerbare akser,Brak osi do skonfigurowania,Nenhum eixo configurável,,Nicio axă configurabilă,Нет настраиваемых осей,Нема конфигурационих оса,Inga konfigurerbara axlar,Yapılandırılabilir eksen yok,Немає настроюваних осей, -None,OPTVAL_NONE,,,,Žádný,Ingen,Kein,,Neniu,Ninguno,,Ei mitään,Aucun,Nincs,Nessuno,無し,없음,Geen,Ingen,Żaden,Nenhum,,Niciuna,Откл.,Ништа,Ingen,Hiçbiri,Вимк., -Turning,OPTVAL_TURNING,,,,Otáčení,Drejning,Umdrehen,,Turnanta,Girar,,Kääntyminen,Tourner,Fordulás,Rotazione,旋回,회전,Draaien,Dreie,Obracanie się,Girar,,Rotire,Поворот,Скретање,Vridning,Dönüş,Поворот, -Looking Up/Down,OPTVAL_LOOKINGUPDOWN,,,,Dívání se nahoru/dolů,Kigger op/ned,Hoch/runterblicken,,Rigardanta (mal)supren,Mirar hacia arriba/abajo,,Ylös/Alas katsominen,Vue haut/bas,Fel-/lenézés,Sguardo Sopra/Sotto,視点上下,위/아래로 보기,Omhoog/omlaag zoeken,Ser opp/ned,Patrzenie w górę/w dół,Olhar para cima/baixo,,Privire Sus/Jos,Взгляд вверх/вниз,Гледање горе/доле,Titta uppåt/nedåt,Yukarı/Aşağı Bakmak,Дивитись вгору, -Moving Forward,OPTVAL_MOVINGFORWARD,,,,Pohyb vpřed,Bevæger sig fremad,Vorwärtsbewegung,,Movanta antaŭen,Avanzar,,Eteenpäin liikkuminen,Avancer,Előre mozgás,Movimento in avanti,前進,앞으로 전진,Voorwaarts bewegen,Beveger seg fremover,Poruszanie się do przodu,Mover-se para a frente,,Deplasare în Față,Движение вперёд,Кретање напред,Rör sig framåt,İleriye Doğru,Рухатись вперед, -Strafing,OPTVAL_STRAFING,,,,Pohyb do stran,Strafing,Seitwärtsbewegung,,Flankmovanta,Desplazarse,,Sivuttaisastunta,Pas de côté,Oldalazás,Movimento laterale,横移動,양옆으로 이동,Strafelen,Straffe,Uniki,Deslocamento lateral,,Deplasare în Diagonală,Движение боком,Кретање у страну,Strafing,Strafing,Рухатись боком, -Moving Up/Down,OPTVAL_MOVINGUPDOWN,,,,Pohyb nahoru/dolů,Bevægelse op/ned,Auf/abwärtsbewegung,,Movanta (mal)supren,Moverse hacia arriba/abajo,,Ylös/Alas liikkuminen,Mouvement haut/bas,Felfele/Lefele mozgás,Movimento Sopra/Sotto,前進後退,위/아래로 이동,Naar boven/beneden bewegen,Beveger seg opp/ned,Poruszanie się w górę/w dół,Mover-se para cima/baixo,,Mișcare Sus/Jos,Движение вверх/вниз,Кретање горе/доле,Rör sig uppåt/nedåt,Yukarı/Aşağı Hareket Etme,Рухатись вгору/вниз, -Inverted,OPTVAL_INVERTED,,,,Inverzní,Omvendt,Invertiert,,Inversigita,Invertido,,Käännetty,Inversé,Felcserélve,Invertito,反転する,반전,Omgekeerd,Invertert,Odwrócony,Invertido,,Inversat,Инвертировано,Обрнуто,Inverterad,Ters çevrilmiş,Інвертовано, -Not Inverted,OPTVAL_NOTINVERTED,,,,Neinverzní,Ikke omvendt,nicht invertiert,,Ne inversigita,No invertido,,Ei käännetty,Non Inversé,Nincs felcserélve,Non invertito,反転しない,반전되지 않음,Niet omgekeerd,Ikke invertert,Nieodwrócony,Não invertido,,Neinversat,Прямо,Не обрнуто,Inte inverterad,Ters Çevrilmemiş,Не інвертовано, -,,Player Menu,,,,,,,,,,,,,,,,,,,,,,,,,,, -Blue,TXT_COLOR_BLUE,,,,Modrá,Blå,Blau,Μπλέ,Blua,Azul,,Sininen,Bleu,Kék,Blu,青,청색,Blauw,Blå,Niebieski,Azul,,Albastru,Синий,Плава,Blå,Mavi,Синій, -Red,TXT_COLOR_RED,,,,Červená,Rød,Rot,Κόκκινο,Ruĝa,Rojo,,Punainen,Rouge,Vörös,Rosso,赤,적색,Rood,Rød,Czerwony,Vermelho,,Roșu,Красный,Црвена,Röd,Kırmızı,Червоний, -Green,TXT_COLOR_GREEN,,,,Zelená,Grøn,Grün,Πράσινο,Verda,Verde,,Vihreä,Vert,Zöld,Verde,緑,녹색,Groen,Grønn,Zielony,Verde,,Verde,Зелёный,Зелена,Grön,Yeşil,Зелений, -Gray,TXT_COLOR_GRAY,,,Grey,Šedá,Grå,Grau,Γκρί,Griza,Gris,,Harmaa,Gris,Szürke,Grigio,灰,회색,Grijs,Grå,Szary,Cinza,,Gri,Серый,Сива,Grå,Gri,Сірий, +Strafing speed,MOUSEMNU_STRAFESPEED,,,,Rychlost pohybu do stran,Strafing-hastighed,Seitwärtsgeschwindigkeit,Ταχύτητα καταδίωξης,Rapido de flankenmoviĝo,Veloc. de mov. lateral,,Sivuttaisastunnan nopeus,Vitesse Gauche/Droite,Brzina kretanja u stranu,Oldalazás sebessége,Velocità movimento laterale,横移動速度,좌진/우진 속도,Zijdelings snelheid,Hastigheten for stansing,Szybkość uników,Velocidade de deslocamento lateral,,Viteză deplasare în diagonală,Скорость движения боком,Брзина стрејфа,Hastighet för strafe,Strafe hızı,Швидкість руху боком, +Always Mouselook,MOUSEMNU_ALWAYSMOUSELOOK,,,,Vždy se rozhlížet myší,Altid mus-look,Mausblick immer an,Πάντα κοίτα με το ποντίκι,Ĉiam rigardi per muso,Siempre mirar con ratón,,Jatkuva hiirikatselu,Toujours vue Souris,Uvijek pogled mišem,Mindig egérrel nézelődés,Vista col mouse,常に上下視点をオン,마우스룩 사용,Altijd Mouselook,Alltid muselook,Zawsze zezwalaj na rozglądanie się myszką,Visão com mouse sempre ativada,Vista com rato sempre ligada,Privire în jur cu mouse permanentă,Обзор мышью,Гледање мишем,Alltid muspekande,Her zaman Mouselook,Огляд мишкою, +Invert Mouse Y,MOUSEMNU_INVERTMOUSE,,,,Vertikálně obrátit myš,Inverter mus Y,Maus Y invertieren,Αντιστροφή ποντικιού Y,Inversi akson Y de muso,Invertir ratón Y,,Käännä hiiri Y,Inverser Souris Y,Obrni miš Y,Y tengely megfordítása,Mouse Y invertito,視点操作反転,마우스 방향 전환,Muis-Y-as omkeren,Inverter mus Y,Odwróć Myszkę - Oś Y,Inverter eixo Y do mouse,Inverter rato,Inversare axă mouse Y,Инверт. мышь по вертикали (Y),Инвертуј миш Y,Invertera mus Y,Fare Y'yi Ters Çevir,Інвертувати мишу Y, +Invert Mouse X,MOUSEMNU_INVERTMOUSEX,,,,Horizontálně obrátit myš,Inverter mus X,Maus X invertieren,Αντιστροφή ποντικιού X,Inversi akson X de muso,Invertir ratón X,,Käännä hiiri X,Inverser Souris X,Obrni miš X,X tengely megfordítása,Mouse X invertito,視点操作反転,마우스 방향 전환,Muis-X-as omkeren,Inverter mus X,Odwróć Myszkę - Oś X,Inverter eixo X do mouse,Inverter rato X,Inversare axă mouse X,Инверт. мышь по горизонтали (X),Инвертуј миш X,Invertera mus X,Fare X'i Ters Çevir,Інвертувати мишу Х, +Upper left,OPTVAL_UPPERLEFT,,,,Vlevo nahoře,Øverste venstre,Oben links,Πάνω αριστερά,Supre-maldekstre,Sup. izquierda,,Ylävasemmalla,Supérieur gauche,Gore lijevo,Bal fent,Superiore sinistro,左上,왼쪽 위,Linksboven,Øvre venstre,Lewy górny róg,Esquerda superior,,Stânga sus,Вверху слева,Горње лево,Övre vänster,Sol üst,"Кнопка ""назад"": Зверху-ліворуч", +Upper right,OPTVAL_UPPERRIGHT,,,,Vpravo nahoře,Øvre højre,Oben rechts,Πάνω δεξιά,Supre-dekstre,Sup. derecha,,Yläoikealla,Supérieur droite,Gore desno,Jobb fent,Superiore destro,右上,오른쪽 위,Rechtsboven,Øverst til høyre,Prawy górny róg,Direita superior,,Dreapta sus,Вверху справа,Горње десно,Övre höger,Sağ üst,"Кнопка ""назад"": Зверху-праворуч", +Lower left,OPTVAL_LOWERLEFT,,,,Vlevo dole,Nederste venstre,Unten links ,Κάτω αριστερά,Sube-maldekstre,Inf. izquierda,,Alavasemmalla,Inférieur gauche,Dolje lijevo,Bal lent,Inferiore sinistro,左下,왼쪽 밑,Linksonder,Nedre venstre,Lewy dolny róg,Esquerda inferior,,Stânga jos,Внизу слева,Доње лево,Nedre vänster,Sol alt,"Кнопка ""назад"": Знизу-ліворуч", +Lower right,OPTVAL_LOWERRIGHT,,,,Vpravo dole,Nederste højre,Unten rechts,Κάτω δεξιά,Sube-dekstre,Inf. derecha,,Alaoikealla,Inférieur droite,Dolje desno,Jobb lent,Inferiore destro,右下,오른쪽 밑,Rechtsonder,Nedre høyre,Prawy dolny róg,Direita inferior,,Dreapta jos,Внизу справа,Доње десно,Nedre höger,Sağ alt,"Кнопка ""назад"": Знизу-праворуч", +Touchscreen-like,OPTVAL_TOUCHSCREENLIKE,,,,Jako dotyková obrazovka,Touchscreen-lignende,Wie auf einem Touchscreen,Οθόνη αφής,Tuŝekranece,Pant. táctil,,Kosketusnäyttömäinen,Style écran tactile,Poput ekrana na dodir,Érintőképernyő-szerű,Stile Touchscreen,タッチスクリーン式,터치스크린 같게,Touchscreen-achtige,Berøringsskjerm-lignende,Jak ekrean dotykowy,Estilo touchscreen,,Precum touchscreen,Как сенсорный экран,Као додирни екран,Pekskärmsliknande,Dokunmatik ekran benzeri,Як сенсорний екран, +Simple arrow,OPTSTR_SIMPLEARROW,,,,Jednoduchý kurzor,Simpel pil,Einfacher Pfeil,Απλό βέλος,Simpla sago,Flecha simple,,Yksinkertainen nuoli,Flèche simple,Jednostavna strelica,Sima nyíl,Freccia semplice,シンプル,기본 커서,Eenvoudige pijl,Enkel pil,Prosta strzałka,Seta simples,Cursor simples,Săgeată simplă,Стрелка,Стрелица,Enkel pil,Basit ok,Стрілка, +System cursor,OPTSTR_SYSTEMCURSOR,,,,Systémový kurzor,Systemcursor,Systemcursor,Δείκτης συστήματος,Musmontrilo de la sistemo,Cursor del sistema,,Järjestelmän osoitin,Curseur Système,Pokazivač sustava,Rendszer egérmutatója,Cursore di sistema,システム,시스템 커서,Systeemcursor,Systemmarkør,Kursor systemu,Cursor do sistema,,Cursor simplu,Системный курсор,Системска стрелица,Systemmarkör,Sistem imleci,Системний курсор, +Default,OPTVAL_DEFAULT,,,,Výchozí,Standard,Standard,Προεπιλογή,Defaŭlta,Por defecto,,Oletus,Défaut,Zadano,Alapbeállítás,Predefinito,デフォルト,기본 설정,Standaard,Standard,Domyślne,Padrão,,Implicit,По умолчанию,Подраз.,Standard,Varsayılan,За замовчуванням, +,,Controller,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Configure Controller,JOYMNU_TITLE,,,,Konfigurace ovladače,Konfigurer controller,Controller konfigurieren,,Agordi ludregilon,Configurar mando,,Peliohjainasetukset,Configurer Mannette,Konfiguriraj kontroler,Kontroller testreszabása,Configura il controller,コントローラー構成:,컨트롤러 구성,Controller configureren,Konfigurer kontrolleren,Konfiguruj Kontroler,Configurar controle,Configurar Comando,Configurare controller,Настроить контроллер,Конфигурација контролера,Konfigurera kontroller,Denetleyiciyi Yapılandırma,Параметри контролера, +Controller Options,JOYMNU_OPTIONS,,,,Ovladač,Indstillinger for styreenhed,Controlleroptionen,,Agordo de ludregilo,Opciones del mando,,Peliohjainasetukset,Options Mannette,Postavke kontrolera,Kontroller beállítások,Opzioni del controller,コントローラー設定,컨트롤러 설정,Controller opties,Alternativer for styreenhet,Opcje Kontrolera,Opções de controle,Opções do Comando,Setări controller,Настройки контроллера,Подешавања контролера,Alternativ för kontroller,Kontrolör Seçenekleri,Налаштування контролера, +Block controller input in menu,JOYMNU_NOMENU,,,,Zakázat ovladač v nabídkách,Bloker controller input i menuen,Blockiere Controllereingabe im Menü,,Malebligi enigon de ludregilo en menuo,Bloq. entrada de mando en menú,,Estä ohjainsyötteet valikoissa,Bloquer manette dans les menus,Blokiraj unos kontrolera u izborniku,Kontroller ne működjön a menüben,Blocca l'input del controller nei menu,メニューではコントローラーを無視,메뉴에서 컨트롤러 끄기,Blokkeer de controller in het menu,Blokker kontrollerinngang i menyen,Blokuj wejście kontrolera w menu,Bloquear controle no menu,Bloquear comando no menu,Blocare comenzi controller în meniu,Отключить контроллер в меню,Блокирај улаз контролера у менију,Blockera inmatning av kontroller i menyn,Menüde kontrolör girişini engelle,Відключити контролер в меню, +Enable controller support,JOYMNU_ENABLE,,,,Povolit podporu pro ovladače,Aktivering af controllerunderstøttelse,Erlaube Controllerunterstützung,,Ebligi subtenon de ludregilo,Activar soporte de mandos,,Ota käyttöön peliohjaintuki,Activer support contrôleur,Omogući podršku za kontroler,Kontroller támogatás engedélyezése,Attiva il supporto del controller,コントローラーサポート許可,컨트롤러 지원 허용,Controllerondersteuning inschakelen,Aktiver støtte for styreenhet,Włącz wsparcie kontrolera,Ativar detecção de controles,,Activare support controller,Включить поддержку контроллера,Омогући подршку за контролере,Aktivera stöd för kontroller,Denetleyici desteğini etkinleştir,Увімкнути підтримку контролера, +Enable DirectInput controllers,JOYMNU_DINPUT,,,,Povolit ovladače DirectInput,Aktivering af DirectInput-controllere,Erlaube DirectInput-Controller,,Ebligi ludregilojn de DirectInput,Usa controles DirectInput,,Ota käyttöön DirectInput-ohjaimet,Activer contrôleurs DirectInput,Omogući DirectInput kontrolere,DirectInput kontrollerek engedélyezése,Attiva i controlli DirectInput,ダイレクトインプットコントローラー許可,다이렉트 인풋 컨트롤러 허용,DirectInput-controllers inschakelen,Aktiver DirectInput-kontrollere,Włącz kontrolery DirectInput,Ativar controles DirectInput,,Activare controlere DirectInput,Включить контроллеры через DirectInput,Омогући директинпут контролере,Aktivera DirectInput-kontroller,DirectInput denetleyicilerini etkinleştirin,Увімкнути контролери DirectInput, +Enable XInput controllers,JOYMNU_XINPUT,,,,Povolit ovladače XInput,Aktiver XInput-controllere,Erlaube XInput-Controller,,Ebligi ludregilojn de XInput,Usa controles XInput,,Ota käyttöön XInput-ohjaimet,Activer contrôleurs XInput,Omogući XInput kontrolere,XInput kontrollerek engedélyezése,Attiva i controlli XInput,Xinput コントローラー許可,X인풋 컨트롤러 허용,XInput-controllers inschakelen,Aktiver XInput-kontrollere,Włącz kontrolery XInput,Ativar controles XInput,,Activare controlere XInput,Включить контроллеры через XInput,Омогући Иксинпут контролере,Aktivera XInput-kontroller,XInput denetleyicilerini etkinleştirin,Увімкнути контролери XInput, +Enable raw PlayStation 2 adapters,JOYMNU_PS2,,,,Povolit ovladače PlayStation 2,Aktiver rå PlayStation 2-adaptere,Erlaube Playstation 2-Controller,,Ebligi adaptilojn de PlayStation 2 ,Usa adaptadores de PlayStation 2,,Ota käyttöön raa'at PlayStation 2 -adapterit,Activer adaptateurs PS2 bruts,Omogući PlayStation 2 adaptere,PlayStation 2 adapterek engedélyezése,Attiva gli adattatori raw PlayStation 2,PlayStation2 アダプター許可,PS2 어뎁터 허용,Raw PlayStation 2-adapters inschakelen,Aktiver rå PlayStation 2-adaptere,Włącz adaptery PlayStation 2,Ativar adaptadores de PlayStation 2,,Activare adaptoare PS2,Использовать адаптеры PlayStation 2 напрямую,Омогући сирове Плејстејшн 2 адаптере,Aktivera råa PlayStation 2-adaptrar,Ham PlayStation 2 adaptörlerini etkinleştirin,Використовувати адаптери PlayStation 2 напряму, +No controllers detected,JOYMNU_NOCON,,,,Nenalezeny žádné ovladače.,Ingen controllere er fundet,Keine Controller gefunden,,Neniu ludregilo detektita,No hay mandos detectados,,Ei havaittuja ohjaimia,Aucun Contrôleur détecté.,Kontroler nije otkriven,Nem érzékelhető kontroller,Nessun controller trovato,コントローラーが見つかりません,인식된 컨트롤러 없음,Geen controllers gedetecteerd,Ingen kontrollere oppdaget,Nie wykryto kontrolerów,Nenhum controle detectado.,Nenhum comando foi detectado,Niciun controller detectat,Контроллеры не обнаружены,Нема детектованих контролера,Inga kontroller upptäcks,Denetleyici algılanmadı,Контролерів не виявлено, +Configure controllers:,JOYMNU_CONFIG,,,,Nastavit ovladače:,Konfigurer controllere:,Controller konfigurieren,,Agordi ludregilojn:,Configurar controles:,,Mukauta ohjaimia:,Configurer contrôleurs:,Konfiguriraj kontrolere:,Kontrollerek konfigurációja:,Configura i controller:,コントローラー構成:,컨트롤러 설정:,Configureer controllers:,Konfigurer kontrollere:,Konfiguruj kontrolery:,Configurar controles:,Configurar comandos,Configurare controlere:,Настроить контроллер:,Подешавања контролере:,Konfigurera kontroller:,Denetleyicileri yapılandırın:,Налаштувати контролери, +Controller support must be,JOYMNU_DISABLED1,,,,Pro nalezení ovladačů musí,Der skal være støtte til controlleren,Controllerunterstütung muss aktiviert sein,,Subteno por ludregiloj devas esti,El soporte de mandos debe estar,,Ohjaintuen täytyy olla otettu,Le Support de contrôleur doit être activé,Podrška za kontroler mora biti,A kontroller támogatásnak,Il supporto ai controller deve essere,コントローラーサポートは,감지하려면 컨트롤러 지원을,Controller ondersteuning moet ingeschakeld zijn,Støtte for kontrollere må være,Wsparcie kontrolera musi być,A detecção de controles deve,Suporte a comandos devem ser,Supportul pentru controller trebuie,Включите поддержку контроллера,Омогућите подржавање контролера,Stöd för kontroller måste vara aktiverat,Denetleyici desteği şu şekilde olmalıdır,Включіть підтримку контролерів, +enabled to detect any,JOYMNU_DISABLED2,Supposed to be empty in Russian and Serbian.,,,být zapnuta jejich podpora.,aktiveret for at registrere enhver,um welche zu finden,,ebligita por detekti iun,activado para detectar alguno,,käyttöön ohjainten havaitsemiseksi,avant de pouvoir en détecter un.,omogućena kako bi se otkrili kontroleri.,"engedélyezve kell lenni, hogy érzékeljen bármit is.",abilitato a trovare ogni,検出しました,활성화 해야합니다.,om eventuele regelaars te detecteren.,aktivert for å oppdage en hvilken som helst,Włączony by wykryć jakikolwiek,ser ativada para exibi-los.,,activat pentru a putea fi detectate, \n, \n,för att det ska gå att upptäcka några,tespit etmek için etkinleştirildi, \n, +Invalid controller specified for menu,JOYMNU_INVALID,,,,Vybrán nesprávný ovladač pro nabídky,Ugyldig controller angivet til menuen,Ungültiger Controller für Menü ausgewählt,,Nevalida ludregilo specifigita por menuo,Mando inválido especificado para el menú,,Epäkelpo ohjain määritetty valikolle,Contrôleur invalide spécifé dans le menu.,Nevažeći kontroler je naveden za izbornik,Hibás kontroller van a menühöz osztva,Controller invalido specificato per il menu,メニューではコントローラーを使用しない,메뉴에 특정된 컨트롤러가 아닙니다.,Ongeldige regelaar gespecificeerd voor het menu,Ugyldig kontroller spesifisert for menyen,Niewłaściwy kontroler określony dla menu,Controle inválido especificado para o menu.,Comando inválido,Controller pentru meniu invalid,Недопустимый контроллер выбран для меню,Невалидан контролер специфиран за мени,Ogiltig kontroller har angetts för menyn,Menü için geçersiz denetleyici belirtildi,Для меню вибрано невідповідний контролер, +Overall sensitivity,JOYMNU_OVRSENS,,,,Celková citlivost,Samlet følsomhed,Allgemeine Empfindlichkeit,,Tuta sentemeco,Sensibilidad general,,Yleisherkkyys,Sensibilité générale,Ukupna osjetljivost,Teljes érzékenység,Sensibilità generale,全体的な感度,전체 민감도,Algemene gevoeligheid,Samlet følsomhet,Ogólna Czułość,Sensibilidade geral,,Sensibilitate în ansamblu,Общая чувствительность,Уупна сензитивност,Övergripande känslighet,Genel hassasiyet,Загальна чутливість, +Axis Configuration,JOYMNU_AXIS,,,,Nastavení os,Konfiguration af akserne,Achsenkonfiguration,,Agordo de aksoj,Configuración del eje,,Akseleiden säätäminen,Configuration des axes,Konfiguracija osi,Tengely konfigurálása,Configurazione assi,軸構成,축 구성,Asconfiguratie,Konfigurasjon av akse,Konfiguruj Oś,Configuração de eixo,,Configurare axă,Конфигурация осей,Конфигурација осе,Konfiguration av axlar,Eksen Konfigürasyonu,Конфігурація осей, +Invert,JOYMNU_INVERT,,,,Obrátit,Invert,Invertieren,,Inversigi,Invertir,,Käännä,Inverser,Obrni,Megfordítás,Inverti,反転,순서 바꿈,Omkeren,Invertering,Odwróć,Inverter,,Inversare,Инвертировать,Инвертовано,Invertera,Ters çevir,Інвертувати, +Dead zone,JOYMNU_DEADZONE,,,,Mrtvá zóna,Dødzone,Totzone,,Malviva zono,Zona muerta,,Kuollut alue,Zone neutre,Mrtva zona,Holttér,Zona cieca,デッドゾーン,불감대,Dode zone,Død sone,Martwa strefa,Zona morta,,Zonă moartă,Мёртвая зона,Мртва зона,Dödzon,Ölü bölge,Мертва зона, +No configurable axes,JOYMNU_NOAXES,,,,Žádné nastavitelné osy,Ingen konfigurerbare akser,Keine konfigurierbaren Achsen,,Neniu agordebla akso,No hay ejes configurables,,Ei säädettäviä akseleita,Aucun axe à configurer,Nema konfigurabilnih osi,Nincs beállítható tengely,Nessun asse configurabile,軸構成を無効,설정할 방향키가 없습니다.,Geen configureerbare assen,Ingen konfigurerbare akser,Brak osi do skonfigurowania,Nenhum eixo configurável,,Nicio axă configurabilă,Нет настраиваемых осей,Нема конфигурационих оса,Inga konfigurerbara axlar,Yapılandırılabilir eksen yok,Немає настроюваних осей, +None,OPTVAL_NONE,,,,Žádný,Ingen,Kein,,Nenio,Ninguno,,Ei mitään,Aucun,Ništa,Nincs,Nessuno,無し,없음,Geen,Ingen,Żaden,Nenhum,,Niciuna,Откл.,Ништа,Ingen,Hiçbiri,Вимк., +Turning,OPTVAL_TURNING,,,,Otáčení,Drejning,Umdrehen,,Turniĝi,Girar,,Kääntyminen,Tourner,Okretanje,Fordulás,Rotazione,旋回,회전,Draaien,Dreie,Obracanie się,Girar,,Rotire,Поворот,Скретање,Vridning,Dönüş,Поворот, +Looking Up/Down,OPTVAL_LOOKINGUPDOWN,,,,Dívání se nahoru/dolů,Kigger op/ned,Hoch/runterblicken,,Rigardi (mal)supren,Mirar hacia arriba/abajo,,Ylös/Alas katsominen,Vue haut/bas,Gledanje gore/dolje,Fel-/lenézés,Sguardo Sopra/Sotto,視点上下,위/아래로 보기,Omhoog/omlaag zoeken,Ser opp/ned,Patrzenie w górę/w dół,Olhar para cima/baixo,,Privire Sus/Jos,Взгляд вверх/вниз,Гледање горе/доле,Titta uppåt/nedåt,Yukarı/Aşağı Bakmak,Дивитись вгору, +Moving Forward,OPTVAL_MOVINGFORWARD,,,,Pohyb vpřed,Bevæger sig fremad,Vorwärtsbewegung,,Antaŭeniri,Avanzar,,Eteenpäin liikkuminen,Avancer,Kretanje naprijed,Előre mozgás,Movimento in avanti,前進,앞으로 전진,Voorwaarts bewegen,Beveger seg fremover,Poruszanie się do przodu,Mover-se para a frente,,Deplasare în Față,Движение вперёд,Кретање напред,Rör sig framåt,İleriye Doğru,Рухатись вперед, +Strafing,OPTVAL_STRAFING,,,,Pohyb do stran,Strafing,Seitwärtsbewegung,,Flankenmoviĝi,Desplazarse,,Sivuttaisastunta,Pas de côté,Kretanje u stranu,Oldalazás,Movimento laterale,横移動,양옆으로 이동,Strafelen,Straffe,Uniki,Deslocamento lateral,,Deplasare în Diagonală,Движение боком,Кретање у страну,Strafing,Strafing,Рухатись боком, +Moving Up/Down,OPTVAL_MOVINGUPDOWN,,,,Pohyb nahoru/dolů,Bevægelse op/ned,Auf/abwärtsbewegung,,Moviĝi (mal)supren,Moverse hacia arriba/abajo,,Ylös/Alas liikkuminen,Mouvement haut/bas,Kretanje gore/dolje,Felfele/Lefele mozgás,Movimento Sopra/Sotto,前進後退,위/아래로 이동,Naar boven/beneden bewegen,Beveger seg opp/ned,Poruszanie się w górę/w dół,Mover-se para cima/baixo,,Mișcare Sus/Jos,Движение вверх/вниз,Кретање горе/доле,Rör sig uppåt/nedåt,Yukarı/Aşağı Hareket Etme,Рухатись вгору/вниз, +Inverted,OPTVAL_INVERTED,,,,Inverzní,Omvendt,Invertiert,,Inversigita,Invertido,,Käännetty,Inversé,Obrnuto,Felcserélve,Invertito,反転する,반전,Omgekeerd,Invertert,Odwrócony,Invertido,,Inversat,Инвертировано,Обрнуто,Inverterad,Ters çevrilmiş,Інвертовано, +Not Inverted,OPTVAL_NOTINVERTED,,,,Neinverzní,Ikke omvendt,nicht invertiert,,Ne inversigita,No invertido,,Ei käännetty,Non Inversé,Nije obrnuto,Nincs felcserélve,Non invertito,反転しない,반전되지 않음,Niet omgekeerd,Ikke invertert,Nieodwrócony,Não invertido,,Neinversat,Прямо,Не обрнуто,Inte inverterad,Ters Çevrilmemiş,Не інвертовано, +,,Player Menu,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Blue,TXT_COLOR_BLUE,,,,Modrá,Blå,Blau,Μπλέ,Blua,Azul,,Sininen,Bleu,Plava,Kék,Blu,青,청색,Blauw,Blå,Niebieski,Azul,,Albastru,Синий,Плава,Blå,Mavi,Синій, +Red,TXT_COLOR_RED,,,,Červená,Rød,Rot,Κόκκινο,Ruĝa,Rojo,,Punainen,Rouge,Crvena,Vörös,Rosso,赤,적색,Rood,Rød,Czerwony,Vermelho,,Roșu,Красный,Црвена,Röd,Kırmızı,Червоний, +Green,TXT_COLOR_GREEN,,,,Zelená,Grøn,Grün,Πράσινο,Verda,Verde,,Vihreä,Vert,Zelena,Zöld,Verde,緑,녹색,Groen,Grønn,Zielony,Verde,,Verde,Зелёный,Зелена,Grön,Yeşil,Зелений, +Gray,TXT_COLOR_GRAY,,,Grey,Šedá,Grå,Grau,Γκρί,Griza,Gris,,Harmaa,Gris,Siva,Szürke,Grigio,灰,회색,Grijs,Grå,Szary,Cinza,,Gri,Серый,Сива,Grå,Gri,Сірий, Dark gray,TXT_COLOR_DARKGRAY,,,"Dark grey -",Tmavě šedá,Mørkegrå,Dunkelgrau,Σκοτεινό γρκί,Malhelgriza,Gris oscuro,,Tummanharmaa,Gris sombre,Sötétszürke,Grigio scuro,鉛,치색,Donkergrijs,Mørkegrå,Ciemnoszary,Cinza escuro,,Gri închis,Тёмно-серый,Тамно сива,Mörkgrått,Koyu gri,Темно-сірий, -Dark Green,TXT_COLOR_DARKGREEN,,,,Tmavě zelená,Mørkegrøn,Dunkelgrün,Σκοτεινό πράσινο,Malhelverda,Verde oscuro,,Tummanvihreä,Vert sombre,Sötétzöld,Verde scuro,深,흑녹색,Donkergroen,Mørkegrønn,Ciemnozielony,Verde escuro,,Verde închis,Тёмно-зелёный,Тамна зелена,Mörkgrön,Koyu Yeşil,Темно-зелений, -Brown,TXT_COLOR_BROWN,,,,Hnědá,Brun,Braun,Σκούρο,Bruna,Marrón,Marrón/Café,Ruskea,Brun,Barna,Marrone,茶,갈색,Bruin,Brun,Brązowy,Marrom,,Maro,Коричневый,Браон,Brun,Kahverengi,Коричневий, -Dark Blue,TXT_COLOR_DARKBLUE,,,,Tmavě modrá,Mørk blå,Dunkelblau,Σκοτεινό μπλέ,Malhelblua,Azul oscuro,,Tummansininen,Bleu sombre,Sötétkék,Blu scuro,紺,,Donkerblauw,Mørkeblå,Ciemnoniebieski,Azul escuro,,Albastru închis,Тёмно-синий,Тамна Плава,Mörkblå,Koyu Mavi,Темно-синій, -Light Red,TXT_COLOR_LIGHTRED,,,,Světle červená,Lysrød,Hellrot,Ανοιχτό κόκκινο,Helruĝa,Rojo claro,,Vaaleanpunainen,Rouge clair,Világospiros,Rosso chiaro,丹,옅은 적색,Licht Rood,Lys rød,Jasnoczerwony,Vermelho claro,,Roșu deschis,Светло-красный,Светло црвена,Ljusröd,Açık Kırmızı,Світло-червоний, -Yellow,TXT_COLOR_YELLOW,,,,Žlutá,Gul,Gelb,Κίτρινο,Flava,Amarillo,,Keltainen,Jaune,Sárga,Giallo,黄,노란색,Geel,Gul,Żółty,Amarelo,,Galben,Жёлтый,Жута,Gul,Sarı,Жовтий, -Purple,TXT_COLOR_PURPLE,,,,Fialová,Lilla,Violett,Μόβ,Purpura,Morado,,Purppura,Violet,Lila,Viola,紫,보라색,Paars,Lilla,Fioletowy,Roxo,,Mov,Фиолетовый,Љубичаста,Lila,Mor,Фіолетовий, -Olive,TXT_COLOR_DULLGREEN,,,,Bledě zelená,Oliven,Blassgrün,,Olivkolora,Oliva,,Haaleanvihreä,Vert pâle,Olíva,Verde pallido,苔,암녹색,Saaie groen,Oliven,Matowa Zieleń,Verde oliva,,Măsliniu,Мутно-зелёный,Тупа зелена,Oliv,Zeytin,Темний жовто-зелений, -Beige,TXT_COLOR_BEIGE,,,,Béžová,Beige,,Μπέζ,Flavgriza,Beis,Beige,Beesi,,Bézs,,淡,담갈색,Beige,Beige,Beżowy,Bege,,Bej,Бежевый,Беж,Beige,Bej,Бежевий, -Light Green,TXT_COLOR_LIGHTGREEN,,,,Světle zelená,Lysegrøn,Hellgrün,Ανοιχτό Πράσινο,Helverda,Verde claro,,Vaaleanvihreä,Vert clair,Világoszöld,Verde chiaro,葵,옅은 녹색,Licht groen,Lysegrønn,Jasonzielony,Verde claro,,Verde Deschis,Светло-зелёный,Светло зелена,Ljusgrön,Açık Yeşil,Світло-зелений, -Light Blue,TXT_COLOR_LIGHTBLUE,,,,Světle modrá,Lys blå,Hellblau,Γαλάζιο,Helblua,Azul claro,,Vaaleansininen,Bleu clair,Világoskék,Blu chiaro,空,옅은 청색,Licht blauw,Lyseblå,Jasnoniebieski,Azul claro,,Albastru Deschis,Светло-синий,Светло плава,Ljusblå,Açık Mavi,Світло-синій, -Light Gray,TXT_COLOR_LIGHTGRAY,,,Light Grey,Světle šedá,Lysegrå,Hellgrau,Ανοιχτό Γκρι,Helgriza,Gris claro,,Vaaleanharmaa,Gris clair,Világosszürke,Grigio chiaro,鉛,옅은 회색,Lichtgrijs,Lysegrå,Jasnoszary,Cinza claro,,Gri Deschis,Светло-серый,Светло сива,Ljusgrå,Açık Gri,Світло-сірий, -Light Brown,TXT_COLOR_LIGHTBROWN,,,,Světle hnědá,Lys brun,Hellbraun,Ανοιχτό Καφέ,Helbruna,Marrón claro,Marrón/Café claro,Vaaleanruskea,Brun clair,Világosbarna,Marrone chiaro,褐,옅은 고동색,Lichtbruin,Lysebrun,Jasnobrązowy,Marrom claro,,Maro Deschis,Светло-коричневый,Светло браон,Ljusbrun,Açık Kahverengi,Світло-коричневий, -Gold,TXT_COLOR_GOLD,,,,Zlatá,Guld,,Χρυσό,Orkolora,Dorado,,Kulta,Or,Arany,Oro,金,금색,Goud,Gull,Złoty,Dourado,,Auriu,Золотой,Златна,Guld,Altın,Золотий, -Bright Green,TXT_COLOR_BRIGHTGREEN,,,,Jasně zelená,Lysegrøn,Hellgrün,Φωτινό Πράσινο,Brilverda,Verde claro,,Vaaleanvihreä,Vert clair,Fényeszöld,Verde chiaro,鮮,밝은 녹색,Helder groen,Lysegrønn,Jasnozielony,Verde claro,,Verde Deschis,Ярко-зелёный,Светла зелена,Ljusgrön,Parlak Yeşil,Яскраво-зелений, -Rust,TXT_COLOR_RUST,,,,Rezavá,,Rostbraun,Σκουριά,Rustokolora,Óxido,,Ruoste,Rouille,Rozsda,Arrugginito,錆,주황 적갈색,Roest,,Rdzawy,Ferrugem,,Ruginiu,Ржавый,Рђа,Rost,Pas,Іржавий, -Name,PLYRMNU_NAME,,,,Jméno,Navn,,Όνομα,Nomo,Nombre,,Nimi,Nom,Név,Nome,名前,이름,Naam,Navn,Imię,Nome,,Nume,Имя,Надимак,Namn,İsim,Ім'я, -Team,PLYRMNU_TEAM,,,,Tým,,,Ομάδα,Teamo,Equipo,,Joukkue,Equipe,Csapat,Squadra,チーム,팀,,Lag,Drużyna,Equipe,Equipa,Echipă,Команда,Тим,Lag,Takım,Команда, -Color,PLYRMNU_PLAYERCOLOR,,,Colour,Barva,Farve,Farbe,Χρώμα,Koloro,,,Väri,Couleur,Szín,Colore,色,색상,Kleur,Farge,Kolor,Cor,,Culoare,Цвет,Боја,Färg,Renk,Колір, -Gender,PLYRMNU_PLAYERGENDER,,,,Pohlaví,Køn,Geschlecht,Φύλο,Sekso,Sexo,,Sukupuoli,Genre,Nem,Sesso,性別,성별,Geslacht,Kjønn,Płeć,Gênero,,Sex,Пол,Пол,Kön,Cinsiyet,Стать, -Male,OPTVAL_MALE,,,,Muž,Mand,Männlich,Αρσενικό,Vira,Masculino,,Miespuolinen,Masculin,Férfi,Maschio,男,남성,Man,Mannlig,Mężczyzna,Masculino,,Masculin,Мужской,Мушко,Man,Erkek,Чоловіча, -Female,OPTVAL_FEMALE,,,,Žena,Kvinde,Weiblich,Θηλυκό,Ina,Femenino,,Naispuolinen,Féminin,Nő,Femmina,女,여성,Vrouw,Kvinne,Kobieta,Feminino,,Feminin,Женский,Женско,Kvinna,Kadın,Жіноча, -Neutral,OPTVAL_NEUTRAL,,,,Neutrální,,,Ουδέτερο,Neŭtra (Ri),Neutro,,Sukupuoleton,Neutre,Semleges,Neutrale,中間,중성,Neutraal,Nøytral,Neutralne,Neutro,,Neutru,Нейтральный,Неутрално,Neutral,Nötr,Нейтральна, -Object,OPTVAL_OTHER,,,,Objekt,Objekt,Objekt,Αντικείμενο,Objekto (Ĝi),Objeto,,Olio,Objet,Tárgy,Oggetto,物体,기타,Doel,Gjenstand,Obiekt,Objeto,,Obiect,Предмет,Предмет,Objekt,Nesne,Предмет, -Gameplay Options,GMPLYMNU_TITLE,,,,Nastavení herních mechanik,Gameplay-muligheder,Gameplay-Optionen,,Ludado-agordoj,Opciones de jugabilidad,,Pelattavuusasetukset,Options Gameplay,Játékmenet beállításai,Opzioni gameplay,ゲームプレイ オプション,게임플레이 설정,Gameplay-opties,Spillalternativer,Opcje Rozgrywki,Opções de jogabilidade,,Setări de Joc,Настройки игры,Подешавања гејмплеја,Spelalternativ,Oynanış Seçenekleri,Налаштування гри, -Always,OPTVAL_ALWAYS,,,,Vždy,Altid,Immer,Πάντα,Ĉiam,Siempre,,Aina,Toujours,Mindig,Sempre,常に,언제나,Altijd,Alltid,Zawsze,Sempre,,Mereu,Всегда,Увек,Alltid,Her zaman,Завжди, -Never,OPTVAL_NEVER,,,,Nikdy,Aldrig,Nie,Ποτέ,Neniam,Nunca,,Ei koskaan,Jamais,Soha,Mai,しない,없음,Nooit,Aldri,Nigdy,Nunca,,Niciodată,Никогда,Никад,Aldrig,Asla,Ніколи, -Autoaim,PLYRMNU_AUTOAIM,,,,Automatické míření,,Automatisch zielen,,Celasisto,Autoapuntar,,Automaattitähtäys,Auto-visée,Automatikus célzás,Mira automatica,自動照準,자동 조준,,,Auto-celowanie,Mira automática,,Autoțintire,Автоприцеливание,Аутоматско циљање,automatiskt sikte,,Автонаведення, -Always Run,PLYRMNU_ALWAYSRUN,,,,Vždy běžet,Altid løbe,Immer Rennen,Πάντα τρέχα,Ĉiam kuri,Siempre correr,,Jatkuva juoksu,Toujours courir,Mindig fusson,Corri sempre,常に駆け足,달리기 토글,Altijd lopen,Kjør alltid,Zawsze Biegaj,Sempre correr,Correr Sempre,Fugă în permanență,Постоянный бег,Увек трчи,Alltid springa,Daima Koş,Постійний біг, -,,Display,,,,,,,,,,,,,,,,,,,,,,,,,,, -Screen size,DSPLYMNU_SCREENSIZE,,,,Velikost obrazovky,Skærmstørrelse,Bildschirmgröße,Μέγεθος οθόνης,Ekrangrando,Tamaño de pantalla,,Näytön koko,Taille de l'écran,Képernyő mérete,Dimensione della schermata,画面サイズ,화면 크기,Schermgrootte,Skjermstørrelse,Rozmiar Ekranu,Tamanho da tela,Tamanho do ecrã,Mărime ecran,Размер экрана,Величина екрана,Skärmstorlek,Ekran boyutu,Розмір екрану, -Vertical Sync,DSPLYMNU_VSYNC,,,,Vertikální synchronizace,Lodret synkronisering,Vertikale Synchronisation,,Vertikala-sinkronigo,Sincronización vertical,,Pystytahdistys,Synchronisation Verticale,Függőleges szinkronizálás,Sincronia verticale,垂直同期,수직 동기화,Verticale Sync,Vertikal synkronisering,Synchronizacja Pionowa,Sincronização vertical,,Sincronizare Verticală,Вертикальная синхронизация,Вертикална синхорнизација,Vertikal synkronisering,Dikey Senkronizasyon,Вертикальна синхронізація, -Models,DSPLYMNU_MODELS,,,,Modely,Modeller,Modelle,Μοντέλα,Modeloj,Modelos,,Mallit,Modèles,3D modellek,Modelli,モデル,모델,Modellen,Modeller,Modele,Modelos,,Modele,Модели,Модели,Modeller,Modeller,3D Моделі, -Scale crosshair,DSPLYMNU_CROSSHAIRSCALE,,,,Velikost zaměřovače,Skalerer trådkorset,Fadenkreuz skalieren,,Skali reteton,Escalar retícula,,Skaalaa tähtäintä,Mise à l'échelle du viseur,Célkereszt méret,Scala del mirino,照準スケール,조준점 크기,Dradenkruis schalen,Skala trådkors,Skala celownika,Escala da mira,,Scară țintă,Размер прицела,Размера нишана,Skala hårkorset,Ölçekli artı işareti,Розмір прицілу, -Brightness,DSPLYMNU_BRIGHTNESS,,,,Jas,Lysstyrke,Helligkeit,Φωτηνότητα,Brileco,Brillo,,Kirkkaus,Luminosité,Fényerő,Luminosità,明るさ,밝기,Helderheid,Lysstyrke,Jasność,Brilho,,Luminozitate,Яркость,Осветљење,Ljusstyrka,Parlaklık,Яскравість, -Gamma correction,DSPLYMNU_GAMMA,,,,Korekce gama,Gammakorrektion,Gammakorrektur,,Gamaa korektado,Corrección gamma,,Gammakorjaus,Correction Gamma,Gamma korrekció,Correzione gamma,ガンマ値,감마 조정,Gamma correctie,Gammakorreksjon,Korekta gammy,Correção de gama,,Gamma,Гамма-коррекция,Корекција светлости,Gammakorrigering,Gama düzeltme,Гамма-корекція, -Contrast,DSPLYMNU_CONTRAST,,,,Kontrast,Kontrast,Kontrast,,Kontrasto,Contraste,,Sävykkyys,Contraste,Kontraszt,Contrasto,コントラスト,대비,,Kontrast,Kontrast,Contraste,,,Контраст,Контраст,Kontrast,Kontrast,Контраст, -Saturation,DSPLYMNU_SATURATION,,,,Sytost,Mætning,Sättigung,,Satureco,Saturación,,Värikylläisyys,,Telítettség,Saturazione,サチュレーション,채도,Verzadiging,Metning,Nasycenie,Saturação,,Saturație,Насыщенность,Сатурација,Mättnad,Doygunluk,Насиченість, -Status Bar Scale,DSPLYMNU_SBSCALE,,,,Velikost stavového panelu,Skala for statuslinje,Statusleistengröße,,Skalo de stata breto,Escala de barra de estado,,Tilapalkin skaalaus,Mise à l'échelle HUD,Állapotjelző mérete,Dimensioni Status Bar,ステータススケール,,Statusbalkschaal,Statuslinjeskala,Skala paska statusu,Escala da barra de estado,,Scară bară de stare,Размер строки состояния,,Skala för statusfältet,Durum Çubuğu Ölçeği,Розмір строки стану, -Messages,DSPLYMNU_MESSAGES,,,,Oznámení,Meddelelser,Nachrichten,Μηνύματα,Mesaĝoj,Mensajes,,Viestit,,Üzenetek,Messaggi,メッセージ類,메시지,Berichten,Meldinger,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке,Meddelanden,Mesajlar,Повідомлення, -Center messages,MSGMNU_CENTERMESSAGES,,,Centre messages,Oznámení na střed,Centrerede meddelelser,Nachrichten zentrieren,,Centrigi mesaĝojn,Centrar mensajes,,Keskitä viestit,Messages centrés,Üzenetek középre helyezése,Messaggi centrati,メッセージを中央に,메시지 중간에 위치,Berichten centreren,Sentrumsmeldinger,Wyśrodkuj wiadomości,Centralizar mensagens,Centrar mensagens,Mesaje centrate,Центрирование сообщений,Централне поруке,Centrerade meddelanden,Merkez mesajları,Центрування повідомлень, -Pulsating message Display,MSGMNU_PULSEMESSAGES,,,,Pulzující oznámení,Pulserende meddelelser Visning,Pulsierende Nachrichtenanzeige,,Pulsanta mesaĝ-montrejo,Mostrar mensajes pulsantes,,Sykkivät viestit,Messages pulsés,Pulzáló üzenet,Mostra messaggi pulsanti,取得時等の文を明滅,,Pulserende berichtendisplay,Pulserende melding Display,Pulsujące wyświetlanie wiadomości,Exibir mensagem pulsante,,Afișare Mesaje Pulsante,Пульсация сообщений,,Pulserande meddelande Visning,Titreşimli mesaj Ekranı,Пульсація повідомлень, -Message Scale,MSGMNU_MESSAGESCALE,,,,Velikost oznámení,Skala for meddelelser,Nachrichtengröße,Μέγεθος μηνύματον,Skalo de mesaĝoj,Escala de mensajes,,Viestien skaalaus,Mise à l'échelle Messages,Üzenet mérete,Dimensioni Messaggi,メッセージスケール,,Berichtschaal,Meldingsskala,Skalowanie Wiadomości,Escala de mensagem,,Scară Mesaje,Размер сообщений,,Meddelandeskala,Mesaj Ölçeği,Розмір повідомлень, -,,Automap,,,,,,,,,,,,,,,,,,,,,,,,,,, -Select Color,MNU_COLORPICKER,,,Select Colour,Výběr barvy,Vælg farve,Farbe auswählen,Επιλογή Χρώματος,Elektu koloron:,Elige un color,,Valitse väri,Choisir Couleur,Szín választása,Scegli il colore,色選択,색상을 고르시오,Selecteer Kleur,Velg farge,Wybierz Kolor,Selecione uma cor,,Alege o Culoare,Выбор цвета,Изабери боју,Välj färg,Renk Seçiniz,Вибір кольору, -Rotate automap,AUTOMAPMNU_ROTATE,,,,Otáčet automapu,Rotere automap,Rotiere Automap,,Turni aŭtomatan mapon,Rotar automapa,,Kiertyvä automaattikartta,Rotation de la Carte,Térkép forgatása,Ruota l'automappa,オートマップの回転表示,오토맵 회전,Automatisch roteren,Roter automatisk kart,Obracaj mapę,Girar automapa,,Rotire hartă computerizată,Вращающаяся автокарта,Ротирај аутомапу,Rotera automap,Otomatik haritayı döndür,Обертання автокарти, -Follow player,AUTOMAPMNU_FOLLOW,,,,Následovat hráče,Følg spilleren,Folge dem Spieler,Ακουλούθα το παίχτη,Sekvi ludanton,Seguir jugador,,Seuraa pelaajaa,Suivre le joueur,Kövesse a játékost,Segui il giocatore,プレイヤー追従,플레이어 추적,Volg de speler,Følg spiller,Podążaj za graczem,Seguir jogador,,Urmărire jucător,Привязка к игроку,Прати играча,Följ spelaren,Oyuncuyu takip et,Прив'язка до гравця, -Line alpha,AUTOMAPMNU_LINEALPHA,,,,Průhlednost čar,Linje alfa,Alpha für Linien,,Travidebleca de linio,Transparencia de línea,,Viivan alpha,Translucidité des lignes,Vonal áttetszóség,Traslucenza delle linee,線の半透明度,선 반투명도,Doorschijnendheid van lijnen,Linje alfa,Przezroczystość Linii,Transparência da linha,,Transparență linii,Прозрачность линий,Транслуценција линија,Linje alfa,Çizgi alfa,Прозорість ліній, -Line thickness,AUTOMAPMNU_LINETHICKNESS,,,,Tloušťka čar,Linjetykkelse,Dicke der Linien,,Dikeca de linio,Grosor de línea,,Viivan paksuus,Épaisseur des lignes,Vonal vastagság,Spessore delle linee,線の太さ,선 두께,Dikte van lijnen,Linjetykkelse,Grubość Linii,Espessura da linha,,Grosime linii,Толщина линий,Дебљина линија,Linjens tjocklek,Çizgi kalınlığı,Товщина ліній, -Customize Map Colors,MAPCOLORMNU_TITLE,,,Customize Map Colours,Nastavení barev mapy,Tilpas kortfarver,Automapfarben einstellen,,Adapti mapkolorojn,Personalizar colores (mapa),,Värien mukautus,Couleurs Carte Personnalisées,Térkép színeinek testreszabása,Personalizza i colori della mappa,カスタム色を決める,미니맵 색상 설정,Kaartkleuren aanpassen,Tilpass kartfarger,Ustaw kolory mapy,Personalizar cores do mapa,,Personalizare culori hartă,Настройки цветов автокарты,Промени боју мапе,Anpassa kartans färger,Harita Renklerini Özelleştirin,Налаштування кольорів автокарти, -Restore default custom colors,MAPCOLORMNU_DEFAULTMAPCOLORS,,,Restore default custom colours,Obnovit původní vlastní barvy,Gendan standard brugerdefinerede farver,Standardfarben wiederherstellen,,Restaŭri defaŭltajn laŭmendajn kolorojn,Restaurar colores personalizados,,Palauta oletusvärit,Couleurs par défaut,Eredeti színek visszaállítása,Reimposta i colori personalizzati al default,カスタム色を初期化,기본 색상으로 복구,Standaard aangepaste kleuren herstellen,Gjenopprett egendefinerte standardfarger,Przywróć domyślne kolory,Restaurar cores personalizadas padrão,,Revenire la culorile implicite,Вернуть стандартные цвета,Врати уобичајене разне боје,Återställ anpassade standardfärger,Varsayılan özel renkleri geri yükleme,Повернути стандартні кольори, -,,Sound,,,,,,,,,,,,,,,,,,,,,,,,,,, -Sound enabled,SNDMNU_SNDENABLED,,,,Zvuk zapnut,Lyd aktiveret,Sound aktiv,Ήχος ενεργοποιημένος,Sono ŝaltita,Sonido activado,,Ääni päällä,Son activé,Hang engedélyezve,Abilita gli effetti sonori,サウンド有効,,Geluid actief,Lyd aktivert,Dźwięk włączony,Som ativado,,Sunet activat,Звук включён,,Ljud aktiverat,Ses etkin,Звук увімкнено, -Music enabled,SNDMNU_MUSENABLED,,,,Hudba zapnuta,Musik aktiveret,Musik aktiv,Μουσική ενεργοποιημένη,Muziko ŝaltita,Música activada,,Musiikki päällä,Musique activée,Zene engedélyezve,Abilita la musica,音楽有効,,Muziek actief ,Musikk aktivert,Muzyka włączona,Música ativada,,Muzică activată,Музыка включена,,Musik aktiverad,Müzik etkin,Музику увімкнено, -4000 Hz,OPTVAL_4000HZ,,,,,,,,,,,,,,,,,,,,,,,4000 Гц,,,,4000 Гц, -8000 Hz,OPTVAL_8000HZ,,,,,,,,,,,,,,,,,,,,,,,8000 Гц,,,,8000 Гц, -11025 Hz,OPTVAL_11025HZ,,,,,,,,,,,,,,,,,,,,,,,11025 Гц,,,,11025 Гц, -22050 Hz,OPTVAL_22050HZ,,,,,,,,,,,,,,,,,,,,,,,22050 Гц,,,,22050 Гц, -32000 Hz,OPTVAL_32000HZ,,,,,,,,,,,,,,,,,,,,,,,32000 Гц,,,,32000 Гц, -44100 Hz,OPTVAL_44100HZ,,,,,,,,,,,,,,,,,,,,,,,44100 Гц,,,,44100 Гц, -48000 Hz,OPTVAL_48000HZ,,,,,,,,,,,,,,,,,,,,,,,48000 Гц,,,,48000 Гц, -64 samples,OPTVAL_64SAMPLES,,,,64 vzorků,,,64 δείγματα,64 specimenoj,64 muestras,,64 näytettä,,,,,64 샘플,,64 samplinger,64 sample,64 amostras,,64 monstre,64 семпла,64 узорка,64 samplingar,64 örnek,64 семпла, -128 samples,OPTVAL_128SAMPLES,,,,128 vzorků,,,128 δείγματα,128 specimenoj,128 muestras,,128 näytettä,,,,,128 샘플,,128 samplinger,128 sampli,128 amostras,,128 monstre,128 семплов,128 узорка,128 samplingar,128 örnek,128 семплів, -256 samples,OPTVAL_256SAMPLES,,,,256 vzorků,,,256 δείγματα,256 specimenoj,256 muestras,,256 näytettä,,,,,256 샘플,,256 samplinger,256 sampli,256 amostras,,256 monstre,256 семплов,256 узорка,256 samplingar,256 örnek,256 семплів, -512 samples,OPTVAL_512SAMPLES,,,,512 vzorků,,,512 δείγματα,512 specimenoj,512 muestras,,512 näytettä,,,,,512 샘플,,512 samplinger,512 sampli,512 amostras,,512 monstre,512 семплов,512 узорка,512 samplingar,512 örnek,512 семплів, -1024 samples,OPTVAL_1024SAMPLES,,,,1024 vzorků,,,1024 δείγματα,1024 specimenoj,1024 muestras,,1024 näytettä,,,,,1024 샘플,,1024 samplinger,1024 sampli,1.024 amostras,,1024 monstre,1024 семпла,1024 узорка,1024 samplingar,1024 örnek,1024 семплів, -2048 samples,OPTVAL_2048SAMPLES,,,,2048 vzorků,,,2048 δείγματα,2048 specimenoj,2048 muestras,,2048 näytettä,,,,,2048 샘플,,2048 samplinger,2048 sampli,2.048 amostras,,2048 monstre,2048 семплов,2048 узорка,2048 samplingar,2048 örnek,2048 семплів, -4096 samples,OPTVAL_4096SAMPLES,,,,4096 vzorků,,,4096 δείγματα,4096 specimenoj,4096 muestras,,4096 näytettä,,,,,4096 샘플,,4096 samplinger,4096 sampli,4.096 amostras,,4096 monstre,4096 семплов,4096 узорка,4096 samplingar,4096 örnek,4096 семплів, -Auto,OPTSTR_AUTO,,,,,Automatisk,,,Aŭtomata,Automático,,Automaattinen,,Automatikus,Automatico,自動,오토,,,Automatycznie,Automático,,,Авто,Аутоматски,Automatisk,Otomatik,Авто, -Mono,OPTSTR_MONO,,,,,,,,Monofonia,,,,,Monó,,モノラル,모노,,,,,,,Моно,Монотоно,,,Моно, -Stereo,OPTSTR_STEREO,,,,,,,,Stereofonia,Estéreo,,,Stéréo,Sztereó,,ステレオ,스테레오,,,,Estéreo,,,Стерео,Стереотоно,,,Стерео, -Dolby Pro Logic Decoder,OPTSTR_PROLOGIC,,,,,Dolby Pro Logic-dekoder,,,Malkodilo de Dolby Pro Logic ,,,,,,,ドルビー プロロジック デコーダー,돌비 프로 로직 디코더,,Dolby Pro Logic Dekoder,,Decodificador Dolby Pro Logic,,Decodor Pro Logic Dolby,Декодер Dolby Pro Logic,,Dolby Pro Logic-dekoder,Dolby Pro Logic Dekoder,Декодер Dolby Pro Logic, -Quad,OPTSTR_QUAD,,,,,,,,Kvadratofonia,Cuádruple,,Dolby Pro Logic -dekooderi,,,,クァッド,쿼드,,,Cztery kanały,Quadrifônico,,,Четырёхканальный,Четвородупло,,Dörtlü,Чотирьохканальний, -5 speakers,OPTSTR_SURROUND,,,,5 reproduktorů,5 højttalere,5 Lautsprecher,,5 Laŭtparoliloj,5 altavoces,,5 kaiutinta,5 enceintes,5 hangfal,Surround,5 スピーカー,5 스피커,5 luidsprekers,5 høyttalere,Głośniki 5,5 alto-falantes,,5 boxe,5 динамиков,5 спикер,5 högtalare,5 hoparlörler,5 динаміків, -5.1 speakers,OPTSTR_5POINT1,,,,Reproduktory 5.1,5.1-højttalere,5.1 Lautsprecher,,5.1 Laŭtparoliloj,Altavoces 5.1,,5.1 kaiutinta,Enceintes 5.1,5.1 hangrendszer,Surround 5.1,5.1 スピーカー,5.1 스피커,5.1 luidsprekers,5.1 høyttalere,Głośniki 5.1,Auto-falantes 5.1,,Boxe 5.1,Динамики 5.1,5.1 спикер,5.1-högtalare,5.1 hoparlörler,Динаміки 5.1, -7.1 speakers,OPTSTR_7POINT1,,,,Reproduktory 7.1,7.1-højttalere,7.1 Lautsprecher,,7.1 Laŭtparoliloj,Altavoces 7.1,,7.1 kaiutinta,Enceintes 7.1,7.1 hangrendszer,Surround 7.1,7.1 スピーカー,7.1스피커,7.1 luidsprekers,7.1-høyttalere,Głośniki 7.1,Auto-falantes 7.1,,Boxe 7.1,Динамики 7.1,7.1 спикер,7.1-högtalare,7.1 hoparlörler,Динаміки 7.1, -Playback device,OPENALMNU_PLAYBACKDEVICE,,,,Přehravací zařízení,Afspilningsenhed,Wiedergabegerät,,Ludado-aparato,Dispositivo de reproducción,,Äänitoistolaite,Sortie sonore,Visszajátszó eszköz,Dispositivo di playback,プレイバック デバイス,재생 장치,Afspeelapparaat,Avspillingsenhet,Urządzenie odtwarzania,Dispositivo de reprodução,,Dispozitiv de redare,Устройство воспроизведения,Аудио уређај,Uppspelningsenhet,Oynatma cihazı,Пристрій відтворення, -Enable EFX,OPENALMNU_ENABLEEFX,,,,Povolit EFX,Aktiver EFX,EFX aktiv,,Ŝalti EFX,Permitir EFX,,Ota käyttöön EFX,Activer EFX,EFX engedélyezése,Abilita EFX,EFXを有効化,EFX 켬,EFX inschakelen,Aktiver EFX,Pozwól na EFX,Ativar EFX,,Activare EFX,Включить EFX,Укључи EFX,Aktivera EFX,EFX'i Etkinleştir,Увімкнути EFX, -Resampler,OPENALMNU_RESAMPLER,,,,,Resampler,,,Respecimenilo,,,Näytteenottotaajuusmuunnin,,,,リサンプラー,재배열 기기,,,,Reamostrador,,,Передискретизатор,Ресемплер,,Yeniden Örnekleyici,Ресемплер, -Sounds volume,SNDMNU_SFXVOLUME,,,,Hlasitost zvuků,Lydstyrke,Effektlautstärke,Φονή ήχων,Sona laŭteco,Volumen de sonido,,Äänitehosteiden voimakkuus,Volume des Sons,Effektek hangereje,Volume suoni,効果音音量,효과음 음량,Geluidsvolume,Lydvolum,Głośność Dźwięku,Volume de sons,,Volum efecte,Громкость звука,Јачина звука,Ljudvolym,Ses seviyesi,Гучність звуків, -Menu volume,SNDMNU_MENUVOLUME,,,,Hlasitost nabídek,Menu-volumen,Menülautstärke,Φονή μενού,Menuo-laŭteco,Volumen del menú,,Valikon äänenvoimakkuus,Volume du Menu,Menü hangereje,Volume menù,メニュー音量,메뉴 음량,Menu volume,Menyvolum,Głośność Menu,Volume do menu,,Volum meniu,Громкость меню,Јачина менија,Volym för menyer,Menü ses seviyesi,Гучність меню, -Music volume,SNDMNU_MUSICVOLUME,,,,Hlasitost hudby,Lydstyrke for musik,Musiklautstärke,Φονή μουσικής,Muzika laŭteco,Volumen de la música,,Musiikin äänenvoimakkuus,Volume Musique,Zene hangereje,Volume musica,音楽音量,배경음 음량,Muziekvolume,Musikkvolum,Głośność Muzyki,Volume da música,,Volum muzică,Громкость музыки,Јачина музике,Musikvolym,Müzik sesi,Гучність музики, -MIDI device,SNDMNU_MIDIDEVICE,,,,MIDI zařízení,MIDI-enhed,MIDI-Gerät,MIDI συσκεύη,MIDI-aparato,Dispositivo MIDI,,MIDI-laite,Sortie MIDI,MIDI eszköz,Dispositivo MIDI,MIDIデバイス,MIDI 장치,MIDI-apparaat,MIDI-enhet,Urządzenie MIDI,Dispositivo MIDI,,Dispozitiv MIDI,MIDI-проигрыватель,MIDI уређај,MIDI-enhet,MIDI cihazı,MIDI програвач, -Sound in Background,SNDMNU_BACKGROUND,,,,Zvuk na pozadí,Lyd i baggrunden,Sound im Hintergrund,Ήχος στο παρασκήνιο,Sono en fono,Sonido en segundo plano,,Ääni taustalla,Son activé en arrière plan,Háttérhangok,Suono di sottofondo,バックグラウンドでのサウンド,배경화면에서도 소리 재생,Geluid in de achtergrond,Lyd i bakgrunnen,Dźwięk w Tle,Som em segundo plano,,Sunet pe fundal,Звук в фоне,Звуци у позадини,Ljud i bakgrunden,Arka Planda Ses,Звуки на фоні, -Underwater reverb,SNDMNU_UNDERWATERREVERB,,,,Ozvěna pod vodou,Undervandsreverb,Unterwasserhall,,Subakva resono,Reverberación bajo el agua,,Vedenalaiskaiku,Reverbération sous l'eau,Vízalatti visszaverődés,Reverb sott'acqua,水中反響音,수중 울림효과,Onderwater nagalm,Undervanns romklang,Pogłos pod wodą,Reverberação debaixo d'água,Reverberação debaixo de água,Reverb subacvatic,Эффект затухания под водой,Подводни одјек,Undervattensreverb,Su altı yankısı,Підводний ефект, -Randomize pitches,SNDMNU_RANDOMIZEPITCHES,,,,Náhodné výšky tónu,Randomisere tonehøjder,Zufällige Tonhöhe,,Malcertigi son-peĉojn,Tonos aleatorios,,Satunnaista äänenkorkeuksia,Tons sonores aléatoires,Hangmagasság keverése,Rendi casuale il tono,ランダマイズ ピッチ,음높이 무작위화,Willekeurige plaatsen,Tilfeldig tonehøyde,Losuj tonacje,Tons aleatórios,Tons aleatórios,Ton sunete aleatoriu,Случайная высота,Рандомизација тонова,Slumpmässiga tonhöjder,Sahaları rastgele ayarlayın,Змінювати висоту звуків, -Sound channels,SNDMNU_CHANNELS,,,,Počet zvukových kanálů,Lydkanaler,Soundkanäle,Κανάλια ήχου,Sonokanaloj,Canales de sonido,,Äänikanavat,Canaux sonores,Hangcsatorna,Numero canali del suono,サウンド チャンネル,음향 채널,Geluidskanalen,Lydkanaler,Kanały dźwiękowe,Canais de som,,Canale de sunet,Количество каналов,Звучни канали,Ljudkanaler,Ses kanalları,Кількість каналів, -Sound backend,SNDMNU_BACKEND,,,,Zvukový systém,Lyd backend,Soundsystem,,Sonoservilo,Sistema de sonido,,Äänijärjestelmä,Traitement Son,Hang backend,Backend suono,サウンド バックエンド,음향 말미,Geluidsarme achterkant,Lyd backend,System dźwiękowy,Sistema de som,,Sistem de sunet,Звуковая подсистема,Звучни бекенд,Ljudbakgrund,Ses arka ucu,Звукова система, -OpenAL options,SNDMNU_OPENAL,,,,Nastavení OpenAL,OpenAL-muligheder,OpenAL Optionen,OpenAL ρυθμίσεις,OpenAL agordoj,Opciones de OpenAL,,OpenAL-asetukset,Options OpenAL,OpenAL beállításai,Opzioni OpenAL,OpenAL オプション,오픈에이엘 설정,OpenAL opties,OpenAL-alternativer,Opcje OpenAL,Opções de OpenAL,,Setări OpenAL,Настройки OpenAL,OpenAL подешавања,OpenAL-alternativ,OpenAL seçenekleri,Параметри OpenAL, -Restart sound,SNDMNU_RESTART,,,,Restartovat zvuk,Genstart af lyd,Sound neu starten,,Rekomenci sonon,Reiniciar sonido,,Käynnistä ääni uudelleen,Redémarrer moteur sonore,Hang újraindítása,Resetta il suono,サウンド再起動,음향 재시작,Herstart geluid,Start lyd på nytt,Zresetuj dźwięk,Reiniciar som,,Reinițializare sunet,Перезапустить звук,Поново покрени звук,Starta om ljudet,Sesi yeniden başlat,Перезавантажити звук, -Advanced options,SNDMNU_ADVANCED,,,,Pokročilá nastavení,Avancerede indstillinger,Erweiterte Optionen,Προχήρημενες ρυθμίσεις,Altnivelaj agordoj,Opciones avanzadas,,Edistyneet asetukset,Options avancées,Haladó beállítások,Opzioni avanzate,高度なオプション,고급 설정,Geavanceerde opties,Avanserte alternativer,Zaawansowane Opcje,Opções avançadas,,Setări avansate,Расширенные настройки,Напредна подешавања,Avancerade alternativ,Gelişmiş seçenekler,Розширені налаштування, -Module replayer options,SNDMNU_MODREPLAYER,,,,Nastavení přehrávače modulů,Indstillinger for modulafspiller,Modul-Spieler-Optionen,,Agordoj por modulreludilo,Opciones reproductor de módulos,,Moduulisoitinasetukset,Options lecteur de module,Modul lejátszó beállításai,Opzioni Module replayer,モジュールリプレイヤー オプション,모듈 재생 설정,Module replayer opties,Alternativer for modulavspiller,Opcje Modułu Odtwarzacza,Opções de reprodutor de módulos,,Setări de redare a modulelor,Параметры воспроизведения модулей,Подешавања модулног риплејера,Alternativ för modulåterspelare,Modül yeniden oynatıcı seçenekleri,"Параметри ""Module replayer""", -Midi player options,SNDMNU_MIDIPLAYER,,,,Nastavení MIDI přehrávače,Indstillinger for Midi-afspiller,MIDI-Spieler-Optionen,,Agordoj por MIDI-ludilo,Opciones de reproductor MIDI,,MIDI-soitinasetukset,Option lecteur MIDI,Midi lejátszó beállításai,Opzioni Midi player,Midi再生のオプション,MIDI 플레이어 설정,Midi speler opties,Alternativer for midispiller,Opcje Odtwarzacza Midi,Opções de reprodutor MIDI,,Setări player MIDI,Настройки MIDI-проигрывателя,MIDI плејер подешавања,Alternativ för Midi-spelare,Midi oynatıcı seçenekleri,Параметри MIDI-програвача, -Sound in Menus,SNDMNU_MENUSOUND,,,,Zvuk v menu,Lyd i menuer,Sound in Menüs,,Sono en menuoj,,,Ääni valikoissa,Son dans les menus,Hang a menükben,Suono nei menù,メニューでのサウンド,,Geluid in menu's,Lyd i menyer,Dźwięk w Menu,Som em menus,,Sunet in meniuri,Звук в меню,,Ljud i menyer,Menülerde Ses,Звук в меню, -Advanced Sound Options,ADVSNDMNU_TITLE,,,,Pokročilá nastavení zvuku,Avancerede lydindstillinger,Erweiterte Soundoptionen,,Altnivelaj sonaj agordoj,Opciones avanzadas de sonido,,Edistyneet ääniasetukset,Options Sonores Avancées,Haladó hangbeállítások,Opzioni avanzate dei suoni,高度なサウンドオプション,고급 음향 설정,Geavanceerde geluidsopties,Avanserte lydalternativer,Zaawansowane Opcje Dźwięku,Opções de áudio avançadas,,Setări de sunet avansate,Расширенные настройки,Напредна подешавања звука,Avancerade ljudalternativ,Gelişmiş Ses Seçenekleri,Розширені налаштування звуку, -Sample rate,ADVSNDMNU_SAMPLERATE,,,,Vzorkovací frekvence,Samplerate,Samplerate,,Specimenrapideco,Frecuencia de muestreo,,Näytteenottotaajuus,Cadence de Sampling,Mintavételezési ráta,,サンプルレート,샘플링레이트,Steekproeftarief,Samplingsfrekvens,Częstotliwość próbkowania,Taxa de amostragem,,Frecvență de eșantionare,Частота дискретизации,Фреквенција узорковања,Samplingsfrekvens,Örnek oranı,Частота дискретизації, -HRTF,ADVSNDMNU_HRTF,,,,,,,,,,,,,,,,머리전달함수,,,,,,,,,,,3D звук у навушниках (HRTF), -OPL Synthesis,ADVSNDMNU_OPLSYNTHESIS,,,,Emulace OPL,OPL-syntese,OPL Synthese,,OPL-sintezo,Síntesis OPL,,OPL-synteesi,Synthèse OPL,OPL szintézis,,OPLシンセサイズ,OPL 합성,OPL synthese,OPL-syntese,Synteza OPL,Síntese OPL,,Sinteză OPL,Синтез OPL,OPL синтеза,OPL-syntes,OPL Sentezi,Синтезатор OPL, -Number of emulated OPL chips,ADVSNDMNU_OPLNUMCHIPS,,,,Počet emulovaných OPL čipů,Antal emulerede OPL-chips,Anzahl OPL Chips,,Nombro da imititaj OPL-blatoj,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,Emulált OPL csipek száma,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 수,Aantal geëmuleerde OPL chips,Antall emulerte OPL-brikker,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,Număr de cipuri OPL emulate,Количество эмулируемых чипов OPL,Број емулираних OPL чипа,Antal emulerade OPL-chips,Taklit edilen OPL çiplerinin sayısı,Кількість емульованих OPL-чіпів, -Full MIDI stereo panning,ADVSNDMNU_OPLFULLPAN,,,,Plné MIDI stereo,Fuld MIDI stereo panorering,Echte MIDI-Stereoeffekte,,Tuta MIDI-sterepanoramado,Balance estéreo MIDI completo,,Täysi MIDI-stereopanorointi,Latéralisation complète MIDI,Teljes MIDI sztereó tájolás,,Full MIDIステレオパンニング,완전한 MIDI 스테레오 패닝,Volledige MIDI stereo panning,Full MIDI stereo panorering,Pełne efekty stereo dla MIDI,Lateralidade estéreo completa para MIDI,,Panoramă stereo pentru MIDI,Полная стереопанорама для MIDI,Пуно MIDI стерео каналисање,Full MIDI-stereopanorering,Tam MIDI stereo kaydırma,Повне панорамування MIDI, -OPL Emulator Core,ADVSNDMNU_OPLCORES,,,,Emulační jádro OPL,OPL-emulatorkerne,OPL Emulatorkern,,OPL-imitilkerno,Núcleo de emulador OPL,,OPL-emulaattoriydin,Cœur émulateur OPL,,,OPL エミュレート コア,OPL 에뮬레이터 코어,OPL Emulator Kern,OPL-emulatorkjerne,Rdzeń Emulatora OPL,Núcleo do emulador de OPL,,Nucleu de emulare OPL,Ядро эмуляции OPL,OPL језгро емулације,OPL-emulatorns kärna,OPL Emülatör Çekirdeği,Тип OPL, -MIDI voices,ADVSNDMNU_MIDIVOICES,,,,Počet MIDI hlasů,MIDI-stemmer,MIDI Stimmen,,MIDI-voĉoj,Voces MIDI,,MIDI-äänet,Voix MIDI,MIDI hangok,Voci MIDI,MIDI ボイス,MIDI 최대 음색 양,MIDI-stemmen,MIDI stemmer,Głosy MIDI,Vozes MIDI,,Voci MIDI,MIDI-голоса,MIDI гласови,MIDI-stämmor,MIDI sesleri,MIDI поліфонія, -FluidSynth,ADVSNDMNU_FLUIDSYNTH,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Global,ADVSNDMNU_GLOBAL,,,,Globální,,,,Malloka,,,Yleinen,,,Globale,グローバル,전반적,Globaal,,Globalne,,,,Общие,Глобално,,Küresel,Загальні, -Freeverb,ADVSNDMNU_FREEVERB,,,,,,,,,,,,,,,フリーバーブ,프리버브,,,,,,,,,,Freeverb,, -Global Freeverb,ADVSNDMNU_GLOBAL_FREEVERB,,,,Globální Freeverb,Global Freeverb,Globales Freeverb,,Malloka Freeverb,Freeverb Global,,Yleinen Freeverb,Freeverb Global,,Freeverb globale,グローバル フリーバーブ,전반적 프리버브,Globale Freeverb,,Globalny Freeverb,Freeverb global,,Freeverb Global,Глобальный Freeverb,Глобални Freeverb,,Küresel Freeverb,Глобальний Freeverb, -Patch set,ADVSNDMNU_FLUIDPATCHSET,,,,Nástrojová sada,Patch-sæt,Patch-Set,,Flikaro,Set de parche,,Patch-asetus,Banque de Sons,,,パッチ セット,패치 세트,,Patch-sett,Zestaw łatek,Banco de sons,,Set patch,Патч-набор,Печ сет,Patch-uppsättning,Yama seti,Патч-набір, -Gain,ADVSNDMNU_FLUIDGAIN,,,,Zesílení,,Relative Lautstärke,,Akiro,Ganancia,,Vahvistus,,Visszaverődés,,ゲイン,쌓기,Relatief volume,,Wzmocnienie,Ganho,,Amplificare,Усиление,Појачање,Relativ volym,Kazanç,Підсилення, -Reverb,ADVSNDMNU_REVERB,,,,Ozvěna,,Hall,,Resono,Reverberación,,Kaiku,Réverbération,Visszhang,,リバーブ,리버브,Nagalm,,Pogłos,Reverberação,,,Реверберация,Одјек,,,Реверберація, -Reverb Level,ADVSNDMNU_REVERB_LEVEL,,,,Intenzita ozvěny,,Hallintensität,,Nivelo de resono,Nivel de reverberación,,Kaiunvoimakkuus,Niveau Réverb.,Visszhang szintje,,リバーブ量,리버브 강도,Nagalm niveau,Reverb-nivå,Poziom pogłosu,Nível de reverberação,,Nivel Reverb,Уровень реверберации,Ниво одјека,Reverb-nivå,Reverb Seviyesi,Рівень реверберації, -Chorus,ADVSNDMNU_CHORUS,,,,,,,,Koruso,,,,,,,コーラス,코러스,,,,,,Cor,Хор,Корус,,Koro,Хорус, -Timidity++,ADVSNDMNU_TIMIDITY,,,,,,,,,,,,,,,,,,,,,,,,,,,, -ADLMidi,ADVSNDMNU_ADLMIDI,,,,,,,,,,,,,,,,,,,,,,,,,,,, -OPNMidi,ADVSNDMNU_OPNMIDI,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Timidity config file,ADVSNDMNU_TIMIDITYCONFIG,,,,Konfigurační soubor Timidity,Timidity-konfigurationsfil,Timidity Konfigurationsdatei,,Agorda dosiero de Timidity,Ruta al archivo config. Timidity,,Timidity-config-tiedosto,Fichier de config. TiMidity,Timidity konfigurációs fájl,File configurazione Timidity,Timidity コンフィグファイル,Timidity 코딩 파일,Timidity++ configuratiebestand,Timidity konfigurasjonsfil,Plik konfiguracyjny Timidity,Arquivo de configuração do Timidity,,Fișier configurație Timidity,Файл конфигурации Timidity,Timidity конфигурациона датотека,Timidity-konfigurationsfil,Timidity yapılandırma dosyası,Файл конфігурації Timidity, -Relative volume,ADVSNDMNU_TIMIDITYVOLUME,,,,Relativní hlasitost,Relativ lydstyrke,Relative Lautstärke,,Relativa laŭteco,Volumen relativo,,Suhteellinen äänenvoimakkuus,Volume Relatif,Relatív hangerő,Volume relativo,相対音量,비교적인 볼륨,Relatief volume,Relativt volum,Względna głośność,Volume relativo,,Volum relativ,Относительная громкость,Релативна јачина,Relativ volym,Bağıl hacim,Відносна гучність, -WildMidi,ADVSNDMNU_WILDMIDI,,,,,,,,,,,,,,,,,,,,,,,,,,,, -WildMidi config file,ADVSNDMNU_WILDMIDICONFIG,,,,Konfigurační soubor WildMidi,WildMidi konfigurationsfil,WilfMidi Konfigurationsdatei,,Agorda dosiero de WildMidi,Archivo de config. WildMidi,,WildMidi-config-tiedosto,Fichier config. WildMidi,WildMidi konfigurációs fájl,File WildMidi config,WildMidi コンフィグファイル,WildMidi 코딩 파일,WildMidi configuratiebestand,WildMidi konfigurasjonsfil,Plik konfiguracyjny WildMidi,Arquivo de configuração do WildMidi,,Fișier configurație WildMidi,Файл конфигурации WildMidi,WildMidi конфигурациона датотека,WildMidi-konfigurationsfil,WildMidi yapılandırma dosyası,Файл конфігурації WildMidi, -Select configuration,ADVSNDMNU_SELCONFIG,,,,Vybrat konfiguraci,Vælg konfiguration,Konfiguration wählen,,Elekti agordojn,Seleccionar configuración,,Valitse kokoonpano,Sélectionner configuration,Konfiguráció kiválasztása,Seleziona la configurazione,構成選択,설정을 고르시오,Selecteer configuratie,Velg konfigurasjon,Wybierz konfigurację,Selecionar configuração,,Selectare configurație,Выбор конфигурации,Изабери конфигурацију,Välj konfiguration,Yapılandırma seçin,Вибір конфігурації, -Advanced Resampling,ADVSNDMNU_ADVRESAMPLING,,,,Pokročilé převzorkování,Avanceret resampling,Erweitertes Resampling,,Altnivela respecimenado,Resampleo avanzado,,Kehittynyt näytteenottotaajuuden muuntaminen,Resampling Avancé,Fejlett Resmapling,Resampling avanzato,高度なリサンプリング,향상된 리샘플링,Geavanceerde herbemonstering,Avansert resampling,Zaawansowane Próbkowanie,Reamostragem avançada,,Resempling avansat,Продвинутый ресэмплинг,Напредно ресампловање,Avancerad återampling,Gelişmiş Yeniden Örnekleme,Розширений ресемплінг, -OPL Bank,ADVSNDMNU_OPLBANK,,,,OPL sada,,,,Banko por OPL,Banco OPL,,OPL-pankki,Banque OPL,,,,OPL 뱅크,,,Bank OPL,Banco OPL,,Bancă OPL,Банк OPL,OPL банка,OPL-bank,,Банк OPL, -OPL Emulator Core,ADVSNDMNU_ADLOPLCORES,,,,Emulační jádro OPL,OPL-emulatorkerne,OPL Emulatorkern,,Imitilkerno por OPL,Núcleos de emulador OPL,,OPL-emulaattoriydin,Cœur Emulateur OPL,OPL emulátor mag,,OPL エミュレートコア,OPL 에뮬레이터 코어,OPL Emulator Kern,OPL-emulatorkjerne,Rdzeń Emulatora OPL,Núcleo do emulador de OPL,,Nucleu de emulare OPL,Ядро эмуляции OPL,OPL емулационо језгро,OPL-emulatorns kärna,OPL Emülatör Çekirdeği,Ядро емуляції OPL, -Run emulator at PCM rate,ADVSNDMNU_RUNPCMRATE,,,,Emulátor používá PCM vzorkovací frekvenci,Kør emulator ved PCM-hastighed,Emulator benutzt PCM Samplerate,,Ruli imitilon laŭ rapido de PCM,Ejecutar emulador a velocidad PCM,,Aja emulaattoria PCM-taajuudella,Emulateur utilise cadence PCM,Emulátor futtatása PCM rátán,Esegui l'emulatore con rate PCM,PCMレートでエミュレート実行,PCM 속도로 에뮬레이터 실행,Emulator maakt gebruik van PCM Samplerate,Kjør emulator med PCM-hastighet,Uruchom emulator w częstotliwości PCM,Rodar emulador em taxa PCM,,Utilizare cu frecvența PCM,Использовать с частотой PCM,Покрени емулацију на PCM стопи,Kör emulatorn med PCM-frekvens,Emülatörü PCM hızında çalıştırın,Використовувати з частотою PCM, -Number of emulated OPL chips,ADVSNDMNU_ADLNUMCHIPS,,,,Počet emulovaných OPL čipů,Antal emulerede OPL-chips,Anzahl OPL Chips,,Numbro da imitaj OPL-blatoj,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,Emulált OPL csipek száma,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 개수,Aantal geëmuleerde OPL chips,Antall emulerte OPL-brikker,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,Număr de cipuri GUS emulate,Количество эмулируемых чипов OPL,Број емулираних OPL чипова,Antal emulerade OPL-chips,Taklit edilen OPL çiplerinin sayısı,Кількість емульованих OPL-чіпів, -Volume model,ADVSNDMNU_VLMODEL,,,,Model hlasitosti,Volumenmodel,Lautstärkemodell,,Modelo de laŭteco,Modelo de volumen,,Äänenvoimakkuusmalli,Modèle de Volume,Hangmodell,Modello di volume,音量モデル,모델 볼륨,Volume model,Volummodell,Model głośności,Modelo de volume,,Model volum,Модель громкости,Волумски модел,Volymmodell,Hacim modeli,Модель гучності, -OPN2 Emulator Core,ADVSNDMNU_OPNCORES,,,,Emulační jádro OPN2,OPN2-emulatorkerne,OPN2 Emulatorkern,,OPN2 Imitilkerno,Núcleo de emulador OPN2,,OPN2-emulaattoriydin,Cœur émulateur OPN2,OPN2 Emulátor Mag,,OPN2 エミュレート コア,OPN2 에뮬레이터 코어,OPN2 Emulatorkern van de OPN2-emulator,OPN2 Emulatorkjerne,Rdzeń Emulatora OPN2,Núcleo do emulador de OPN2,,Nucleu de emulare OPN2,Ядро эмуляции OPN2,OPN2 језгро емулације,OPN2-emulatorkärna,OPN2 Emülatör Çekirdeği,Ядро емуляції OPN2, -GUS Emulation,ADVSNDMNU_GUSEMULATION,,,,Emulace GUS,GUS-emulering,GUS Emulation,,GUS Imitado,Emulación GUS,,GUS-emulaatio,Emulation GUS,GUS Emuláció,,GUS エミュレーション,GUS 에뮬레이션,GUS-emulatie,GUS-emulering,Emulacja GUS,Emulação de GUS,,Emulare GUS,Эмуляция GUS,GUS емулација,GUS-emulering,GUS Emülasyonu,Емуляція GUS, -GUS config file,ADVSNDMNU_GUSCONFIG,,,,Konfigurační soubor GUS,GUS-konfigurationsfil,GUS Konfigurationsdatei,,Agorda dosiero de GUS,Archivo de config. GUS,,GUS-config-tiedosto,Fichier Config. GUS,GUS konfigurációs fájl,File GUS config,GUS コンフィグファイル,GUS 코딩 파일,GUS-configuratiebestand,GUS konfigurasjonsfil,Plik konfiguracyjny GUS,Arquivo de configuração do GUS,,Fișier configurație GUS,Файл конфигурации для GUS,GUS конфигурациона датотека,GUS-konfigurationsfil,GUS yapılandırma dosyası,Файл конфігурації для GUS, -Read DMXGUS lumps,ADVSNDMNU_DMXGUS,,,,Načíst DMXGUS soubory,Læs DMXGUS-klumper,Lese DMXGUS,,Legi DMXGUS Masojn,Leer archivos DMXGUS,,Lue DMXGUS-tietoja,Lire fichiers DMXGUS,DMXGUS lumpok beolvasása,Leggi i lump DMXGUS,DMXGUS ランプを読む,DMXGUS 럼프 읽기,DMXGUS-klonten lezen,Les DMXGUS-filer,Czytaj pliki DMXGUS,Ler lumps DMXGUS,,Citire fișiere DMXGUS,Читать файлы DMXGUS,Читај DMXGUS фајлове,Läsa DMXGUS-filer,DMXGUS dosyalarını okuma,Читати файли DMXGUS, -GUS memory size,ADVSNDMNU_GUSMEMSIZE,,,,Velikost paměti GUS,GUS-hukommelsesstørrelse,GUS Speichergröße,,GUS Memorampleksoj,Tamaño de memoria de GUS,,GUS-muistikoko,Taille mémoire GUS,GUS memória mérete,Dimensione della memoria per GUS,GUS メモリーサイズ,GUS 메모리 크기,GUS-geheugengrootte,GUS-minne størrelse,Rozmiar pamięci GUS,Tamanho de memória do GUS,,Memorie alocată pentru GUS,Размер памяти GUS,GUS величина памћења,GUS minnesstorlek,GUS bellek boyutu,Розмір пам'яті GUS, -Number of emulated OPN chips,ADVSNDMNU_OPNNUMCHIPS,,,,Počet emulovaných OPN čipů,Antal emulerede OPN-chips,Anzahl OPN Chips,,Nombro da imititaj OPL-blatoj,Número de chip OPN emulados,,Emuloitavien OPN-piirien lukumäärä,Puces OPN émulées,Emulált OPL csipek száma,Numero di chip OPN emulati,OPNチップエミュレートの番号,에뮬레이트된 OPN 칩 개수,Aantal geëmuleerde OPL chips,Antall emulerte OPN-brikker,Liczba emulowanych czipów OPN,Número de chips OPN emulados,,Număr de cipuri OPN emulate,Количество эмулируемых чипов OPN,Број емулираних OPN чипова,Antal emulerade OPN-chips,Taklit edilen OPN çiplerinin sayısı,Кількість емульованих OPN-чіпів, -Use custom WOPL bank,ADVSNDMNU_ADLCUSTOMBANK,,,,Použít vlastní WOPL sadu,Brug af brugerdefineret WOPL-bank,Benutzerdefinierte WOPL Bank,,Uzi laŭmendan WOPL-bankon,Utilizar banco WOPL personalizado,,Käytä mukautettua WOPL-pankkia,Utiliser Banque WOPL perso,Saját WOPL bank használata,Usa WOPL bank personalizzato,カスタムWOPL bankを使用,사용자 지정 WOPL 뱅크 사용,Gebruik de aangepaste WOPL bank,Bruk egendefinert WOPL-bank,Użyj niestandardowego banku WOPL,Usar banco WOPL personalizado,,Utilizați propriul bank WOPN,Использовать собственный банк WOPL,Користи прилагођенуу WOPL банку,Använd anpassad WOPL-bank,Özel WOPL bankası kullanın,Використовувати власний банк WOPL, -WOPL Bank file,ADVSNDMNU_OPLBANKFILE,,,,Soubor WOPL sady,WOPL Bank-fil,WOPL Bank-Datei,,WOPL-Bankodosiero,Archivo de banco WOPL,,WOPL-pankkitiedosto,Banque WOPL,WOPL Bank fájl,File WOPL Bank,WOPL bankファイル,WOPL 뱅크 파일,WOPL Bank-bestand,WOPL Bank-fil,Plik banku WOPL,Banco WOPL,,Fișier WOPN bank,Файл с банком WOPL,WOPL фајл банка,WOPL Bank-fil,WOPL Bank dosyası,Файл з банком WOPL, -Use custom WOPN bank,ADVSNDMNU_OPNCUSTOMBANK,,,,Použít vlastní WOPN sadu,Brug af brugerdefineret WOPN-bank,Benutzerdefinierte WOPN Bank,,Uzi laŭmendan WOPN-bankon,Utilizar banco WOPN personalizado,,Käytä mukautettua WOPN-pankkia,Utiliser Banque WOPN perso,Saját WOPN bank használata,Usa WOPN bank personalizzato,カスタムWOPN bankを使用,사용자 지정 WOPN 뱅크 사용,Gebruik aangepaste WOPN-bank op maat,Bruk egendefinert WOPN-bank,Użyj niestandardowego banku WOPN,Usar banco WOPN personalizado,,Utilizați propriul bank WOPN,Использовать собственный банк WOPN,Користи прилагођену WOPN банку,Använd anpassad WOPN-bank,Özel WOPN bankası kullanın,Використовувати власний банк WOPN, -WOPN Bank file,ADVSNDMNU_OPNBANKFILE,,,,Soubor WOPN sady,WOPN Bank-fil,WOPN Bank-Datei,,WOPN-Bankodosiero,Archivo de banco WOPN,,WOPN-pankkitiedosto,Banque WOPN,WOPN Bank fájl,File WOPN Bank,WOPN bankファイル,WOPN 뱅크 파일,WOPN Bank-bestand,WOPN-bankfil,Plik banku WOPN,Banco WOPN,,Fișier WOPN bank,Файл с банком WOPN,WOPN фајл банка,WOPN Bank-fil,WOPN Banka dosyası,Файл з банком WOPN, -Aliasing,OPTVAL_ALIASING,,,,,,,,Krenelaro,,,,,,,エイリアシング,에일리어싱,,,,,,Dedublare,Сглаживание,Преклапање,,Takma Adlandırma,Згладжування, -Linear,OPTVAL_LINEAR_1,This setting is duplicated threefold in order to allow for different grammatical gender endings,,,Lineární,Lineær,,,Lineara,Lineal,,Lineaarinen,Linéaire,Lineáris,Lineare,リニア,선형,Lineair,Lineær,Liniowy,,,Liniar,Линейное,Линеаран,Linjär,Doğrusal,Лінійне, -Linear,OPTVAL_LINEAR_2,,,,Lineární,Lineær,,,Lineara,Lineal,,Lineaarinen,Linéaire,Lineáris,Lineare,リニア,선형,Lineair,Lineær,Liniowa,,,Liniar,Линейная,Линеаран,Linjär,Doğrusal,Лінійна, -Linear,OPTVAL_LINEAR_3,,,,Lineární,Lineær,,,Lineara,Lineal,,Lineaarinen,Linéaire,Lineáris,Lineare,リニア,선형,Lineair,Lineær Lineær,Liniowe,,,Liniar,Линейный,Линеаран,Linjär,Doğrusal,Лінійний, -Nearest,OPTVAL_NEAREST,,,,Nejbližší,Nærmeste,Nächster Nachbar,,Plej proksima,Cercano,,Lähin,Nearest,Legközelebbi,Il più vicino,最寄り,가까이,Naast,Nærmeste,Najbiższe,Mais próximo,,Cel mai apropriat,Ближайший,Најближе,Närmaste,En yakın,Найближчий, -PCF (Low),OPTVAL_PCF_LOW,,,,PCF (nízké),PCF (lav),PCF (niedrig),,PCF (Malalta),PCF (Bajo),,PCF (matala),PCF (Low),PCF (Alacsony),PCF (basso),PCF (低),PCF (하급),PCF (Laag),PCF (lav),PCF (Niski),PCF (Baixo),,PCF (Scăzut),PCF (низкий),PCF (ниско),PCF (låg),PCF (Düşük),PCF (низький), -PCF (Medium),OPTVAL_PCF_MEDIUM,,,,PCF (střední),PCF (medium),PCF (mittel),,PCF (Meza),PCF (Medio),,PCF (keskitaso),PCF (Medium),PCF (Közepes),PCF (medio),PCF (中),PCF (중급),,PCF (middels),PCF (Średni),PCF (Médio),,PCF (Mediu),PCF (средний),PCF (средње),PCF (medelhög),PCF (Orta),PCF (средній), -PCF (High),OPTVAL_PCF_HIGH,,,,PCF (vysoké),PCF (høj),PCF (hoch),,PCF (Alta),PCF (Alto),,PCF (korkea),PCF (High),PCF (Magas),PCF (alto),PCF (高),PCF (상급),PCF (Hoog),PCF (høy),PCF (Wysoki),PCF (Alto),,PCF (Ridicat),PCF (высокий),PCF (високо),PCF (hög),PCF (Yüksek),PCF (високий), -Cubic,OPTVAL_CUBIC,,,,Kubická,Kubisk,Kubisch,,Kuba,Cúbico,,Kuutio,Cubique,Négyzetes,Cubico,キュービック,큐빅,Kubieke,Kubisk,Sześcienny,Cúbico,,Cub,Кубическое,Кубан,Kubisk,Kübik,Кубічне, -Band-limited step,OPTVAL_BLEP,,,,Omezené krokování,Båndbegrænset trin,Bandbegrenzte Schritte,,Bendo-limigita paŝo,Paso limitado por banda,,Kaistarajoitettu askel,Step limité par bande,Sáv-limitált lépés,Passo limitato dalla banda,帯域制限ステップ,제한된 단계별 밴드,Bandbeperkte stap,Båndbegrenset trinn,Krok ograniczony pasmem,Passo limitado por banda,,Limitare frecvență pas-cu-pas,Ограниченный полосой пропускания шаг,Постепено ограничење фреквенције,Bandbegränsat steg,Bant sınırlı adım,Покрокове обмеження частоти, -Linear (Slower),OPTVAL_LINEARSLOW,,,,Lineární (pomalejší),Lineær (langsommere),Linear (langsamer),,Lineara (Pli malrapida),Lineal (más lento),,Lineaarinen (hitaampi),Linéaire (Lent),Lineáris (Lassabb),Lineare (più lento),リニア(遅め),선형 (느리게),Lineair (langzamer),Lineær (langsommere),Liniowy (wolniejszy),Linear (mais lento),,Liniar (Mai lent),Линейное (медленнее),Линеаран (спорије),Linjär (långsammare),Doğrusal (Daha Yavaş),Лінійне (повільніше), -Band-limited linear,OPTVAL_BLAM,,,,Omezená lineární,Båndbegrænset lineær,Bandbegrenzt linear,,Bendo-limigita lineara,Lineal limitado por banda,,Kaistarajoitettu lineaarinen,Linéaire limité par bande,Sáv-limitált lineáris,Lineare limitato dalla banda,帯域制限リニア,밴드 제한 식 선형,Band-beperkt lineair,Båndbegrenset lineær,Liniowy ograniczony pasmem,Linear limitado por banda,,Limitare frecvență liniară,Ограниченное полосой пропускания линейное,Линеарно ограничење фреквенције,Bandbegränsad linjär,Bant sınırlı doğrusal,Лінійне обмеження частоти, -Cubic (Slower),OPTVAL_CUBICSLOW,,,,Kubická (pomalejší),Kubisk (langsommere),Kubisch (langsamer),,Kuba (Pli malrapida),Cúbico (más lento),,Kuutio (hitaampi),Cubique (Lent),Négyzetes (Lassabb),Cubico (più lento),キュービック (遅め),큐빅 (느리게),Kubieke (langzamer),Kubisk (langsommere),Sześcienny (wolniejszy),Cúbico (mais lento),,Cub (Mai lent),Кубическое (медленнее),Кубан (спорије),Kubisk (långsammare),Kübik (Daha Yavaş),Кубічне (повільніше), -Sinc,OPTVAL_SINC,,,,,Sinc,,,,Seno cardinal,,,,,,シンク,싱크,,,,Seno cardinal,,Sinus cardinal,Кардинальный синус,Синк,,,Функція sinc, -Note on/off only,OPTVAL_NOTEONOFFONLY,,,,Pouze začátek/konec noty,Kun note on/off,Nur für Note an/aus ,,Nur noto ek/for,Solo notas de Activ./Desact.,,Vain nuotti päällä/pois,Note on/off seulement,Hangjegy ki/be csak,Note solamente ON/OFF,ノート オン/オフ のみ,노트를 끄거나 켰을 때,Alleen toon aan/uit,Merk kun på/av,Tylko dla włączonych/wyłączonych notatek,Somente notas ligadas/desligadas,,Numai la activarea/oprirea notelor,Только при включении/отключении нот,Само током укључења/искључења ноте,Endast anteckning på/av,Yalnızca not açma/kapama,Лише для нот, -Full ramping,OPTVAL_FULLRAMPING,,,,Plný náběh,Fuld rampe,,,Plena pligrandigado,Aumento completo,,Täysi kerrytys,Rampe complète,Teljes ramping,Ramping completo,フルランピング,최대 램핑,Volledige helling,,Pełne zwiększenie,Rampa completa,,Creștere completă,Полное наращивание,Пуно појачање,Full rampning,Tam rampa,Згладжування різких змін гучності, -Master volume,MODMNU_MASTERVOLUME,,,,Celková hlasitost,Master-volumen,Grundlautstärke,,Ĉeflaŭteco,Volumen maestro,,Yleisäänenvoimakkuus,Volume maître,Fő hangerő,Volume master,全体音量,마스터 볼륨,Hoofdvolume,Hovedvolum,Całkowita głośność,Volume geral,,Volum general,Общая громкость,Глацни звук,Huvudvolym,Ana ses seviyesi,Загальна гучність, -Quality,MODMNU_QUALITY,,,,Kvalita,Kvalitet,Qualität,,Kvaliteco,Calidad,,Laatu,Qualité,Minőség,Qualità,クオリティ,품질,Kwaliteit,Kvalitet,Jakość,Qualidade,,Calitate,Качество,Квалитет,Kvalitet,Kalite,Якість, -Volume ramping,MODMNU_VOLUMERAMPING,,,,Křivka hlasitosti,Lydstyrke-rampe,Lautstärkeverhalten,,Laŭteco-pligrandigado,Aumento gradual de Volumen,,Äänenvoimakkuuden kertyminen,Rampe du volume,,Ramping volume,音量ランピング,볼륨 램핑,Volume-aanvulling,Volumramping,Zwiększenie głośności,Rampa de volume,,Creștere volum,Наращивание громкости,Појачавање звука,Volymrampning,Hacim artırma,Нарощування гучності, -Chip-o-matic,MODMNU_CHIPOMATIC,,,,,,,,,,,,,,,チップ オー マチック,칩-오-매틱,,,,,,,,,,,, -MAME OPL2,OPTVAL_MAMEOPL2,,,,,,,,,,,,,,,,마메 OPL2,,,,,,,,,,,, -DOSBox OPL3,OPTVAL_DOSBOXOPL3,,,,,,,,,,,,,,,,도스박스 OPL3,,,,,,,,,,,, -Java OPL3,OPTVAL_JAVAOPL3,,,,,,,,,,,,,,,,자바 OPL3,,,,,,,,,,,, -Nuked OPL3,OPTVAL_NUKEDOPL3,,,,,,,,,,,,,,,,,,,,,,,,,,,, -MAME YM2612,OPTVAL_MAMEOPN2,,,,,,,,,,,,,,,,마메 YM2612,,,,,,,,,,,, -Neko Project II Kai OPNA,OPTVAL_NP2OPNA,,,,,,,,,,,,,,,,,,,,,,,,,,,, -MAME YM2608,OPTVAL_MAMEOPNA,,,,,,,,,,,,,,,,마메 YM2608,,,,,,,,,,,, -PMDWin OPNA,OPTVAL_PMDWINOPNA,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Opal OPL3,OPTVAL_OPALOPL3,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Nuked OPL3 v1.7.4,OPTVAL_NUKEDOPL3174,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Nuked OPN2,OPTVAL_NUKEDOPN2,,,,,,,,,,,,,,,,,,,,,,,,,,,, -GENS YM2612,OPTVAL_GENSOPN2,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Auto (Use setup of bank),ADLVLMODEL_AUTO,,,,Auto (použít nastavení sady),Auto (Brug opsætning af bank),Auto (Benutze Einstelliung der Bank),,Aŭtomata (Uzi bankagordaĵon),Auto (Usar config. del banco),,Automaattinen (käytä pankin asetuksia),Auto (Utiliser paramètre banque),Automatikus (Beállított bank használata),Automatico (Usa le impostazioni del bank),自動(bankのセットアップ使用),자동(뱅크 셋업 사용),Auto (gebruik instelling van de bank),Auto (Bruk oppsett av bank),Automatycznie (Użyj ustawień banku),Automático (usar definições de banco),,Auto (configurare din bancă),Авто (настройка из банка),Аутоматски (користи намештену банку),Auto (använder bankens inställning),Otomatik (Banka kurulumunu kullan),Авто (налаштування з банку), -Generic,ADLVLMODEL_GENERIC,,,,Standardní,Generisk,Allgemein,,Komuna,Genérico,,Yleinen,Générique,Általános,Generico,一般的,전형적,Algemeen,Generisk,Ogólne,Genérico,,,Общий,Генерично,Generisk,Jenerik,Загальний, -OPL Native,ADLVLMODEL_NATIVE,,,,Nativní OPL,OPL Native,OPL Nativ,,Nativa OPL,Nativo OPL,,Luontainen OPL,OPL Natif,Natív OPL,,OPLネイティブ,고유 OPL,,,Natywne OPL,Nativo OPL,,OPL propriu,Встроенная OPL,OPL домаћи,OPL inhemsk,OPL Yerli,Вбудована OPL, -"DMX (Accurate, with AM bug)",ADLVLMODEL_DMX,,,,"DMX (Přesný, s AM chybou)","DMX (nøjagtig, med AM-fejl)",,,,,,,,"DMX (Pontos, de AM buggal)",,,데이터 마이닝 확장,"DMX (accuraat, met AM bug)","DMX (Nøyaktig, med AM-feil)",,"DMX (preciso, com bug de AM)",,"DMX (Precis, cu probleme în AM)","DMX (Точная, с ошибкой АМ)",,"DMX (exakt, med AM-bugg)","DMX (Doğru, AM hatalı)","DMX (Точна, з помилкою АМ)", -"Apogee (Accurate, with AM bug)",ADLVLMODEL_APOGEE,,,,"Apogee (Přesný, s AM chybou)","Apogee (nøjagtig, med AM-fejl)",,,,,,,,"Apogee (Pontos, de AM buggal)",,,어포지,"Apogee (accuraat, met AM bug)","Apogee (Nøyaktig, med AM-feil)",,"Apogee (preciso, com bug de AM)",,"Apogee (Precis, cu probleme în AM)","Apogee (Точная, с ошибкой АМ)",,"Apogee (Exakt, med AM-bugg)","Apogee (Doğru, AM hatası ile)","Apogee (Точна, з помилкою АМ)", -Win9X-like (SB16),ADLVLMODEL_WIN9X,,,,Jako Windows 9X (SB16),Win9X-lignende (SB16),Wie Windows 9X (SB16),,Kiel Win9X (SB16),Como Win9X (SB16),,Win9x-kaltainen (SB16),,Win9X szerű (SB16),,Win9X式 (SB16),Win9X 같게 (SB16),Win9X-achtig (SB16),Win9X-lignende (SB16),Jak w Win9X (SB16),Estilo Win9X (SB16),,Similar cu Win9X (SB16),Похожая на Win9X (Вариант SB16),Као у Win9X-у (SB16),Win9X-liknande (SB16),Win9X benzeri (SB16),Схожа на Win9X (Варіант SB16), -Win9X-like (Generic FM),ADLVLMODEL_WIN9XGENERIC,,,,Jako Windows 9X (Generic FM),Win9X-lignende (generisk FM),Wie Windows 9X (Generic FM),,Kiel Win9X (Generic FM),Como Win9X (Generic FM),,Win9x-kaltainen (Generic FM),,Win9X szerű (Általános FM),,Win9X式 (Generic FM),Win9X 같게 (Generic FM),Win9X-achtig (Generic FM),Win9X-lignende (Generisk FM),Jak w Win9X (Generic FM),Estilo Win9X (FM genérico),,Similar cu Win9X (Generic FM),Похожая на Win9X (Вариант Generic FM),Као у Win9X-у (Generic FM),Win9X-liknande (generisk FM),Win9X benzeri (Jenerik FM),Схожа на Win9X (Варіант Generic FM), -DMX (Without AM voice bug),ADLVLMODEL_DMX_FIXED,,,,DMX (Bez AM hlasové chyby),DMX (uden AM-stemmefejl),DMX (Ohne AM-Stimmenfehler),,DMX (Sen cimo de AM-voĉo),DMX (Sin bug de voz AM),,DMX (ilman AM-äänivikaa),DMX (Sans bug canaux AM),DMX (AM hanghiba nélkül),,DMX(AMボイスバグ無し),,DMX (zonder AM voice bug),DMX (uten AM-stemmefeil),DMX (bez głosowego błędu AM),DMX (sem bug de voz de AM),,DMX (Fără probleme în AM),DMX (Без ошибки АМ),,DMX (utan AM-röstfel),DMX (AM ses hatası olmadan),DMX (Без помилки АМ), -Apogee (Without AM voice bug),ADLVLMODEL_APOGEE_FIXED,,,,Apogee (Bez AM hlasové chyby),Apogee (uden AM-stemmefejl),Apogee (Ohne AM-Stimmenfehler),,Apogee (Sen cimo de AM-voĉo),Apogee (Sin bug de voz AM),,Apogee (ilman AM-äänivikaa),Apogee (avec bug canaux AM),Apogee (AM hanghiba nélkül),,Apogee(AMボイスバグ無し),,Apogee (zonder AM voice bug),Apogee (uten AM-stemmefeil),Apogee (bez głosowego błędu AM),Apogee (sem bug de voz de AM),,Apogee (Fără probleme în AM),Apogee (Без ошибки АМ),,Apogee (utan AM-röstfel),Apogee (AM ses hatası olmadan),Apogee (Без помилки АМ), -IBM Audio Library Interface,ADLVLMODEL_AIL,,,,,,,,IBM Aŭdbibiloteka Interfaco,,,,,IBM Hang Könyvtár Interfész,,,,,,Interfejs Biblioteki Dźwięków IBM,Interface de Biblioteca de Áudio IBM,,Interfață de Bibliotecă IBM,IBM AIL,,IBM Audio Library Interface (gränssnitt för ljudbibliotek),IBM Ses Kitaplığı Arayüzü,, -HMI Sound Operating System,ADLVLMODEL_HMI,,,,,,,,HMI Sonoperaciumo,,,,,HMI Hang Operációs Rendszer,,,,,,System Operacyjny Dźwięków HMI,Sistema Operacional de Som HMI,,Sistem Sonor HMI,HMI SOS,,HMI-ljud Operativsystem,HMI Ses İşletim Sistemi,, -"HMI SOS (Old, with bugs)",ADLVLMODEL_HMIOLD,,,,"HMI SOS (Starý, s chybami)","HMI SOS (gammelt, med fejl)","HMI SOS (alt, mit Fehlern)",,"HMI SOS (Malnova, kun cimoj)","HMI SOS (Viejo, con bugs)",,"HMI SOS (vanha, vikainen)",HMI SOS (vieux et buggé),"HMI SOS (Régi, bugokkal)",,HMI SOS(旧式、バグ含む),,"HMI SOS (oud, met bugs)","HMI SOS (gammel, med feil)","HMI SOS (Stare, z błędami)","SOS HMI (antigo, com bugs)",,"HMI SOS (Vechi, cu probleme)",HMI SOS (Старый вариант с ошибками),,"HMI SOS (gammalt, med fel)","HMI SOS (Eski, hatalı)",HMI SOS (Старий варіант з помилками), -Unlimited,OPTVAL_UNLIMITED,,,,Neomezené,Ubegrænset,Unlimitiert,,Senlima,Ilimitado,,Rajoittamaton,Illimité,Végtelen,Illimitato,無制限,무제한,Onbeperkt,Ubegrenset,Nieskończone,Sem limites,,Nelimitat,Без ограничений,Бескрајно,Obegränsad,Sınırsız,Необмежено, -256K,OPTVAL_256K,,,,,,,,,,,,,,,,,,,,,,,,,,,, -512K,OPTVAL_512K,,,,,,,,,,,,,,,,,,,,,,,,,,,, -768K,OPTVAL_768K,,,,,,,,,,,,,,,,,,,,,,,,,,,, -1024K,OPTVAL_1024K,,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Postprocessing,,,,,,,,,,,,,,,,,,,,,,,,,,, -Uncharted 2,OPTVAL_UNCHARTED2,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Hejl Dawson,OPTVAL_HEJLDAWSON,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Reinhard,OPTVAL_REINHARD,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Palette,OPTVAL_PALETTE,,,,Paleta,Palet,,Παλέτα,Paletro,Paleta,,Paletti,,Paletta,Palette,パレット,팔레트,Palet,,Paleta,Paleta,Palete,Paletă,Палитра игры,Палет,Palett,Palet,Палітра гри, -Low,OPTVAL_LOW,,,,Nízká,Lav,Niedrig,Χαμηλό,Malalta,Bajo,,Matala,Bas,Alacsony,Basso,低,낮음,Laag,Lav,Niskie,Baixo,,Scăzut,Низкое,Ниско,Låg,Düşük,Низьке, -Medium,OPTVAL_MEDIUM,,,,Střední,,Mittel,Μεσαίο,Meza,Medio,,Keskitaso,Moyen,Közepes,Medio,中,중간,Middel,Middels,Średnie,Médio,,Mediu,Среднее,Средње,Medelstor,Orta,Середнє, -High,OPTVAL_HIGH,,,,Vysoká,Høj,Hoch,Υψηλό,Alta,Alto,,Korkea,Elevé,Magas,Alto,高,높음,Hoog,Høy,Wysokie,Alto,,Ridicat,Высокое,Високо,Hög,Yüksek,Високе, -Extreme,OPTVAL_EXTREME,,,,Extrémní,Ekstrem,Extrem,Ακράιο,Ekstrema,Extremo,,Äärimmäinen,Extrême,Extrém,Estremo,最高,매우 높음,Extreem,Ekstrem,Ekstremalne,Extremo,,Extrem,Максимальное,Екстремно,Extremt,Aşırı,Максимальне, -Obverse,OPTVAL_OBVERSEFIRST,,,,Vpřed (obvers),Forside,Obvers,Παρατήρησε,Antaŭa,Anverso,,Etupuoli,,Ellentétes,Dritto,正面,앞면,Obvers,Forside,Awers,Obverso,,Avers,Прямой,Супротно,Framsida,Ön yüz,Прямий, -Reverse,OPTVAL_REVERSEFIRST,,,,Vzad (revers),Bagside,Revers,Αντίστροφο,Inversa,Inverso,,Käänteinen,Inverse,Fordított,Contrario,反転,반전,Revers,Baksiden,Rewers,Reverso,,Invers,Обратный,Обрнуто,Baksida,Ters,Зворотний, -Postprocessing,GLMNU_POSTPROCESS,,,,,Efterbehandling,,Μετα-επεξεργασία,Postprocezado,Postprocesado,,Jälkikäsittely,,,,ポストプロセッシング,포스트프로세싱 적용,Nabewerking,Etterbehandling,Przetwarzanie końcowe,Pós-processamento,,Postprocesare,Постобработка,Пост обрада,Efterbehandling,İşlem sonrası,Постобробка, -Tonemap Mode,GLPREFMNU_TONEMAP,,,,Režim tónovací mapy,Tonemap-tilstand,Tonemap Modus,,Reĝimo de Tonmapo,Modo de mapa de tonos,,Sävykarttatila,Mode Tonemap,Színleképzés módja,Modalità Tonemap,トーンマップ モード,톤맵 모드,Tonemap modus,Tonemap-modus,Tryb Mapowania Tonów,Tipo de tonemap,,Mod Tonemap,Режим тонового отображения,Тонирано-мапни мод,Tonemap-läge,Ton Haritası Modu,Режим тонального відображення, -Lens distortion effect,GLPREFMNU_LENS,,,,Efekt distorze čočky,Objektivforvrængningseffekt,Optischer Verzerrungseffekt,,Lensdistorto-efiko,Efecto de distorsión de lente,,Linssinvääristystehoste,Effet distorsion de lentille,Lencsetorzulás effekt,Effetto distorsione della lente,レンズの歪みエフェクト,렌즈 왜곡 효과,Effect van de lensvervorming,Linseforvrengningseffekt,Efekt zniekształcenia obiektywu,Distorção de lente,Efeito de distorção da lente,Efect de distorsionare,Эффект искажения линзы,Дисторзија објектива ефект,Linsförvrängningseffekt,Lens bozulma efekti,Ефект деформації лінзи, -FXAA Quality,GLPREFMNU_FXAA,,,,Kvalita FXAA,FXAA-kvalitet,FXAA Qualität,FXAA ποίοτητα,Kvaliteco de FXAA,Calidad FXAA,,FXAA-laatu,Qualité FXAA,FXAA minősége,Qualità FXAA,FXAA品質,FXAA 품질,FXAA-kwaliteit,FXAA-kvalitet,Jakość FXAA,Qualidade de FXAA,,Calitate FXAA,Качество FXAA,FXAA квалитет,FXAA-kvalitet,FXAA Kalitesi,Якість FXAA, -Dither output,GLPREFMNU_DITHER,,,,Dithering,Dither-udgang,Dithering,,Apliki punktojn al eligo,Dither de salida,,Sekoitussävytyksen (dithering) ulostulo,Dithering,Árnyalás kimenet,Dithering,ディザー出力,떨림 효과 출력,Dither output,Dither-utgang,Dygotanie,Dithering,,Putere Dithering,Дизеринг,Учестаност трептања,Dither-utgång,Dither çıkışı,Дитеринг, -Tonemap Palette Order,GLPREFMNU_PALTONEMAPORDER,,,,Pořadí palety tónovací mapy,Tonemap-palettens rækkefølge,Palettensortierung für Tonemap,,Ordo de Kolormapo-Paletro,Orden de la paleta en mapa de tonos,,Sävykartan paletin järjestys,Ordre des palettes tonemap,Színleképzés paletta sorrend,Ordine della Palette Tonemap,トーンマップパレット順序,톤맵 팔레트 순서,Tonemap Palet Orde van het Tonemap-palet,Tonemap-palettrekkefølge,Kolejność Palet Mapowania Tonów,Ordem da paleta tonemap,,Ordine paletă Tonemap,Порядок палитры тонового отображения,Тонирано-мапни палетни ред,Tonemappalettordning,Ton Haritası Palet Sırası,Порядок палітри тонального відображення, -Tonemap Palette Exponent,GLPREFMNU_PALTONEMAPPOWER,,,,Exponent palety tónovací mapy,Tonemap-palettens eksponent,Palettenexponent für Tonemap,,Exponeto de Kolormapo-Paletro,Exponente paleta en mapa de tonos,,Sävykartan paletin eksponentti,Exponent des palettes tonemap,Tonemap Paletta Exponens,Esponente della Palette Tonemap,トーンマップパレット指数,톤맵 팔레트 지수,Tonemap Palet Exponent,Tonemap Palette Eksponent,Wykładnik Palet Mapowania Tonów,Expoente da paleta tonemap,,Exponent paletă Tonemap,Экспонента палитры тонового отображения,Тонирано-мапни палетни експонент,Exponent för tonemappalett,Ton Haritası Paleti Üsteli,Експонента палітри тонального відображення, -Multisample,GLPREFMNU_MULTISAMPLE,,,,Multisampling,,Multisampling,,Plurspecimeno,Multisampling,,Moninäytteistys,,,,マルチサンプル,멀티샘플,,,Multipróbkowanie,Multiamostragem,,Multisampling,Мультисэмплинг,Мулти-узорак,,Çoklu Örneklem,Багатовибіркове згладжування, -Bloom effect,GLPREFMNU_BLOOM,,,,Efekt bloom,Bloom-effekt,Bloom Effekt,,Lumŝmiro-efiko,Efecto Bloom,,Hehkutehoste (bloom),Effet surbrillance,Bloom effekt,Effetto Bloom,ブルーム エフェクト,블룸 효과,Bloom-effect,Bloom-effekt,Effekt Bloom,Bloom,,Efect Bloom,Свечение,Мутан вид ефект,Bloom-effekt,Çiçeklenme etkisi,Ефект сяйва (Bloom), -Ambient occlusion quality,GLPREFMNU_SSAO,,,,Kvalita ambient occlusion,Omgivende okklusionskvalitet,Ambient Occlusion Qualität,,Kvaliteco de media obstrukceco,Calidad de oclusión ambiental,,Yleisvarjostuksen (ambient occlusion) laatu,Qualité Occlusion Ambiente,Ambient occlusion minősége,Qualità occlusione ambientale,アンビエント オクルージョンの品質,주변 환경 가림 효과 품질,Kwaliteit van omgevingsverduistering,Omgivende okklusjonskvalitet,Jakość okluzji otoczenia,Qualidade de oclusão de ambiente,,Calitate ocluzie ambientală,Качество глобального затенения,Оклузија амбијента ефект,Kvalitet för omgivande ocklusion,Ortam oklüzyon kalitesi,Якість імітації тіней, -Portals with AO,GLPREFMNU_SSAO_PORTALS,,,,Portály s AO,Portaler med AO,Portale mit AO,,Portaloj kun Media obstrukceco,Portales con OA,,Yleisvarjostuksen portaalit,OA pour les portails,Portálok AO-val,Portali con l'OA,AOを伴うポータル,주변 환경 가려진 포탈,Portals met AO,Portaler med AO,Portale z okluzją otoczenia,Portais com oclusão de ambiente,,Portaluri cu ocluzie ambientală,Порталы с глобальным затенением,Портали са AO,Portaler med omgivande ocklusion,AO'lu Portallar,Портали з глобальним затіненням, -Menu Blur,GLPREFMNU_MENUBLUR,,,,Rozostření pozadí v menu,Menu sløring,Menüunschärfe,Θόλοση μενού,Malklarigo de menuo ,Difuminación de menú,,Valikon sumennus,Flou menu,Menü mosódás,Blur del menu,メニューブラー,메뉴 흐림 효과,Menu vervagen,Meny uskarphet,Rozmycie w Menu,Desfoque do menu,Desfocagem do Menu,Neclaritate Meniu,Размытие фона меню,Блур мениа,Menyns oskärpa,Menü Bulanıklığı,Розмиття фону в меню, -Environment map on mirrors,GLPREFMNU_ENVIRONMENTMAPMIRROR,,,,Mapa prostředí na zrcadlech,Miljøkort på spejle,Lichteffekt auf Spiegeln,,Medimapo sur speguloj,Mapa de entorno en espejos,,Ympäristökartta peileissä,Mappage environment sur les miroirs,Környezet tükröződés,Ambiente mappa sugli specchi,マップオンミラーの画像表示,거울 주변의지도 활성,Milieukaart op spiegels,Omgivelseskart på speil,Mapa środowiska w lustrach,Mapa de ambiente em espelhos,,Efecte suplimentare pentru oglinzi,Карта окружения на зеркалах,Околинска мапа на прозорима,Miljökarta på speglar,Aynalar üzerinde çevre haritası,Карта оточення на дзеркалах, -Rendering quality,GLPREFMNU_RENDERQUALITY,,,,Kvalita vykreslování,Renderingskvalitet,Renderqualität,,Kvalito de bildigado,Calidad de renderizado,,Hahmonnuslaatu,Qualité du rendu,Renderelés minősége,Qualità resa grafica,レンダリング品質,렌더링 품질,Het teruggeven van kwaliteit,Renderingskvalitet,Jakość Renderowania,Qualidade de renderização,,Calitate video,Качество обработки,Квалитет рендовања,Renderingskvalitet,Render kalitesi,Якість візуалізації, -Speed,OPTVAL_SPEED,,,,Rychlost,Hastighed,Geschwindigkeit,Ταχύτητα,Rapido,Velocidad,,Nopeus,Vitesse,Sebesség,Prestazioni,速度寄り,성능,Snelheid,Hastighet,Szybkość,Velocidade,,Viteză,Скорость,Брзина,Hastighet,Hız,Швидкість, -Quality,OPTVAL_QUALITY,,,,Kvalita,Kvalitet,Qualität,Ποιότητα,Kvalito,Calidad,,Laatu,Qualité,Minőség,Qualità,品質寄り,고품질,Kwaliteit,Kvalitet,Jakość,Qualidade,,Calitate,Качество,Квалитет,Kvalitet,Kalite,Якість, -Sector light mode,GLPREFMNU_SECLIGHTMODE,,,,Režim osvětlení sektorů,Sektorlystilstand,Sektorlichtmodus,,Reĝimo de sektorlumo,Modo de luz de sector,,Sektorivalojen tila,Mode de lumière Secteur,Szektor fény mód,Modalità luce di settore,セクターライトモード,섹터 조명 모드,Sector lichte wijze,Sektorlysmodus,Tryb oświetlenia sektorów,Modo de luz de setor,,Mod iluminare sectorială,Режим освещения секторов,Секторско светло мод,Sektorljusläge,Sektör ışığı modu,Режим освітлення секторів, -Fog mode,GLPREFMNU_FOGMODE,,,,Režim mlhy,Tågetilstand,Nebelmodus,Λειτουργία ομίχλης,Reĝimo de nebulo,Modo de niebla,,Sumutila,Mode du broullard,Köd mód,Effetto nebbia,フォグモード,안개 모드,Mistmodus,Tåkemodus,Tryb mgły,Modo de neblina,,Mod ceață,Режим тумана,Магла мод,Dimläge,Sis modu,Режим туману, -Radial,OPTVAL_RADIAL,,,,Radiální,Radial,,Ακτινικό,Radiusa,,,Säteittäinen,,Sugaras,Radiale,放射状,방사형,Radiaal,,Promieniowe,,,Radială,Круговой,Радијално,,Radyal,Радіальний, -Standard,OPTVAL_STANDARD,,,,Standardní,,,,Norma,Estándar,,Normaali,,Szabvány,,標準,기본,Standaard,,,Padrão,,,Стандартный,Стандардно,,Standart,Стандартний, -,,Texture options,,,,,,,,,,,,,,,,,,,,,,,,,,, -Texture Filter mode,GLTEXMNU_TEXFILTER,,,,Režim filtrování textur,Tilstand for teksturfilter,Texturfiltermodus,,Reĝimo por Teksturfiltrado,Modo de filtro de texturas,,Pintakuviointien suodatustapa,Mode de Filtrage Texture,Textúrafilter módja,Modalità filtro texture,テクスチャーフィルター モード,텍스쳐 필터 모드,Textuurfiltermodus,Teksturfilter-modus,Tryb Filtrowania Tekstur,Modo de filtro de textura,,Mod Filtrare Texturi,Фильтрация текстур,Текстурни филтер мод,Texturfilterläge,Doku Filtresi modu,Тип фільтрації текстур, -Anisotropic filter,GLTEXMNU_ANISOTROPIC,,,,Anisotropické filtrování,Anisotropisk filter,Anisotropische Filterung,,Anizotropa filtro,Filtro anisotrópico,,Anisotrooppinen suodatus,Filtre Anisotropique,Anizotropikus filter,Filtro anisotropico,異方性フィルター,이방성 필터,Anisotroopfilter,Anisotropisk filter,Filtr anizotropowy,Filtro anisotrópico,,Filtrare Anizotropică,Анизотропная фильтрация,Анизотропни фолтер,Anisotropt filter,Anizotropik filtre,Анізотропна фільтрація, -None (nearest mipmap),OPTVAL_NONENEARESTMIPMAP,,,,Žádné (mipmapa - nejbližší soused),Ingen (nærmeste mipmap),Aus (nächste Mipmap),,Nenio (plej proksima mipmapo),Ninguno (mipmap cercano),,Ei mitään (lähin mipkartta),Aucun (mipmap proche voisin),Semmilyen (közeli mipmap),Nessuno (mipmap più vicina),なし(最寄りミップマップ),없음 (밉멥에 가까움),Geen (dichtstbijzijnde mipmap),Ingen (nærmeste mipmap),Brak (najbliższa mipmapa),Nenhum (mipmap mais próximo),,Niciuna (mipmap de apropriere),Нет (ближайший MIP-уровень),Ништа (најближи мипмап),Ingen (närmaste mipmap),Yok (en yakın mipmap),Відсутня (найближчий міпмап), -None (linear mipmap),OPTVAL_NONELINEARMIPMAP,,,,Žádné (mipmapa - lineární),Ingen (lineær mipmap),Aus (lineare Mipmap),,Nenio (linia mipmapo),Ninguno (mipmap lineal),,Ei mitään (lin. mipkartta),Aucun (mipmap linéaire),Semmilyen (lineáris mipmap),Nessuno (mipmap lineare),なし(リニアミップマップ),없음 (선형 밉맵),Geen (lineaire mipmap),Ingen (lineær mipmap),Brak (liniowa mipmapa),Nenhum (mipmap linear),,Niciuna (mipmap liniar),Нет (линейный MIP-уровень),Ништа (линеаран мипмап),Ingen (linjär mipmap),Yok (doğrusal mipmap),Відсутня (лінійний міпмап), -None (trilinear),OPTVAL_NONETRILINEAR,,,,Žádné (trilineární),Ingen (trilineær),Aus (trilinear),,Nenio (trilinia),Ninguno (trilineal),,Ei mitään (trilineaarinen),Aucun (mipmap trilinéaire),Semmilyen (trilineáris),Nessuno (mipmap trilineare),なし(トライリニア),없음 (삼선형),Geen (trilineair),Ingen (trilineær),Brak (trzyliniowe),Nenhum (trilinear),,Niciuna (trilinar),Нет (трилинейная),Ништа (трилинеарно),Ingen (trilinjär),Yok (trilineer),Відсутня (трилінійна), -Bilinear,OPTVAL_BILINEAR,,,,Bilineární,Bilineær,,,Dulinia,Bilineal,,Bilineaarinen,Bilinéaire,Bilineáris,Bilineare,バイリニア,쌍선형,Bilineair,Bilineær,Dwuliniowe,,,Biliniar,Билинейная,Билинеарно,Bilinjär,Bilineer,Білінійна, -Trilinear,OPTVAL_TRILINEAR,,,,Trilineární,Trilineær,,,Trilinia,Trilineal,,Trilineaarinen,Trilinéaire,Trilineáris,Trilineare,トライリニア,삼선형,Trilineair,Trilineær,Trzyliniowe,,,Triliniar,Трилинейная,Трилинеарно,Trilinjär,Trilineer,Трилінійна, -2x,OPTVAL_2X,,,,,,,,2-oble,,,,,,,,,,,,,,,,,,,, -4x,OPTVAL_4X,,,,,,,,4-oble,,,,,,,,,,,,,,,,,,,, -8x,OPTVAL_8X,,,,,,,,8-oble,,,,,,,,,,,,,,,,,,,, -16x,OPTVAL_16X,,,,,,,,16-oble,,,,,,,,,,,,,,,,,,,, -32x,OPTVAL_32X,,,,,,,,32-oble,,,,,,,,,,,,,,,,,,,, -Texture Options,GLTEXMNU_TITLE,,,,Nastavení textur,Indstillinger for teksturer,Texturoptionen,,Agordoj de Teksturoj,Opciones de texturas,,Pintakuviointiasetukset,Options Textures,Textúra Beállítások,Opzioni Texture,テクスチャー オプション,텍스쳐 설정,Textuur Opties,Teksturalternativer,Opcje Tekstur,Opções de Textura,,Setări Texturi,Настройки текстур,Подешавања текстура,Alternativ för textur,Doku Seçenekleri,Параметри текстур, -Textures enabled,GLTEXMNU_TEXENABLED,,,,Povolit textury,Teksturer aktiveret,Texturen an,,Teksturoj ŝaltitaj,Texturas activadas,,Pintakuvioinnit otettu käyttöön,Textures activées,Textúrák bekapcsolása,Texture abilitate,テクスチャー有効,텍스쳐 사용,Texturen ingeschakeld,Teksturer aktivert,Tekstury włączone,Texturas ativadas,,Texturi Activate,Включить текстуры,Текстуре омогућене,Texturer aktiverade,Dokular etkinleştirildi,Увімкнути текстури, -Enable hires textures,GLTEXMNU_ENABLEHIRES,,,,Povolit textury ve vysokém rozlišení,Aktivere hi-res teksturer,Hochauflösende Texturen an,,Ŝalti Altdistingivajn Teksturojn,Activar texturas de alta resolución,,Salli korkean erotuskyvyn pintakuvioinnit,Activer Textures haute résolution,Magas felbontású textúrák bekapcsolása,Abilita texture alta qualità,ハイレゾ テクスチャー有効,고해상도 텍스쳐 사용,Hoge-resolutie texturen op,Aktivere høyoppløselige teksturer,Włącz tekstury wysokiej jakości,Habilitar texturas de alta resolução,,Texturi de înaltă rezoluție,Текстуры высокого разрешения,Омогући текстуре велике резолуције,Aktivera texturer med högre upplösning,Yüksek çözünürlüklü dokuları etkinleştir,Увімкнути текстури високого розширення, -High Quality Resize mode,GLTEXMNU_HQRESIZE,,,,Režim zvětšovače textur,Tilstand til ændring af størrelse i høj kvalitet,Texturskalierungsmodus,,Reĝimo de Altdistingivigo-Skalilo,Modo de ajuste de alta calidad,,Korkealaatuinen kuvakoon muutostapa,Mise à l'échelle haute résolution,Magas minőségű újraméretező mód,Modalità resize alta qualità,高品質リサイズ モード,고퀄리티 리사이즈 모드,Textuurschaalmodus,Høy kvalitet Endre størrelse-modus,Tryb Wysokiej Jakości Zmieniania Rozmiaru,Modo de Redimensionamento de Alta Qualidade,,Mod Redimensionare de Înaltă Calitate,Режим высококачественного масштабирования текстур,Промена величине високог квалитета мод,Högkvalitativt storleksanpassningsläge,Yüksek Kalite Yeniden Boyutlandırma modu,Масштабування текстур, -High Quality Resize multiplier,GLTEXMNU_HQRESIZEMULT,,,,Faktor zvětšovače textur,Multiplikator for ændring af størrelse i høj kvalitet,Texturskaluerungsfaktor,,Obligilo de Altdistingivigo-Skalilo,Multiplicador de ajuste de alta calidad,,Korkealaatuisen kuvakokomuutoksen kerroin,Multiplicateur de mise à l'échelle,Magas minőségű újraméretezés szorzó,Moltiplicatore resize alta qualità,高品質リサイズ乗数,고퀄리티 리사이징 승수,Textuurschaalfactor,Multiplikator for størrelsesendring av høy kvalitet,Mnożnik Wysokiej Jakośći Rozmiaru,Multiplicador de Redimensionamento de Alta Qualidade,,Factor de Scalare,Множитель высококачественного масштабирования,Промена величине високог квалитета мултипликатор,Multiplikator för storleksändring av hög kvalitet,Yüksek Kalite Yeniden Boyutlandırma çarpanı,Множник масштабування, -This mode requires %d times more video memory,GLTEXMNU_HQRESIZEWARN,,,,Tento režim potřebuje %dkrát více paměti,Denne tilstand kræver %d gange mere videohukommelse,Dieser Modus benötigt das %d-fache an Videospeicher,Αυτή η λειτουργία χρειάζετε %d περισσότερες φορές μνήμη βίντεο,Ĉi tiu reĝimo bezonas %d-oble pli da ekranmemoro.,Este modo requiere %d veces más memoria de vídeo,,Tämä tila vaatii %d kertaa enemmän videomuistia,Ce mode nécessite %d fois plus de mémoire vidéo,Ez a mód a jelenlegi videó memória %d-szeresét igényli,Questa modalità richiede %d volte la memoria video,このモードでは %d 倍以上のビデオメモリが必要です!,이 설정은 비디오 메모리의 %d 배가 더 필요합니다.,Deze modus vereist %d keer meer videogeheugen.,Denne modusen krever %d ganger mer videominne,Ten tryb wymaga %d razy więcej pamięci wideo,Este modo precisa de %d vezes mais memória de vídeo,,Acest mod necesită de %d mai multă memorie video,Данный режим требует в %d раз больше видеопамяти,Овај мод тражи %d пута више видео меморије,Det här läget kräver %d gånger mer videominne,Bu mod %d kat daha fazla video belleği gerektirir,Цьому типу потрібно в %d рази більше відеопам'яті, -Resize textures,GLTEXMNU_RESIZETEX,,,,Škálovat textury,Ændre størrelse på teksturer,Texturen skalieren,,Regrandigi teksturojn,Ajustar texturas,,Muuta pintakuviointien kokoa,Mise à l'échelle textures,Textúrák újraméretezése,Resize delle texture,テクスチャー類のリサイズ,텍스쳐 리사이징,Texturen schalen,Endre størrelse på teksturer,Zmień rozmiar tekstur,Redimensionar texturas,,Redimensionare texturi,Масштабирование текстур,Промена величине текстура,Ändra storlek på texturer,Dokuları yeniden boyutlandırma,Масштабувати текстури, -Resize sprites,GLTEXMNU_RESIZESPR,,,,Škálovat sprity,Ændre størrelse på sprites,Sprites skalieren,,Regrandigi mov-rastrumojn,Ajustar sprites,,Muuta spritejen kokoa,Mise à l'échelle sprites,Sprite-ok újraméretezése,Resize degli sprite,スプライト類のリサイズ,스프라이트 리사이징,Sprites schalen,Endre størrelse på sprites,Zmień rozmiar sprite'ów,Redimensionar sprites,,Redimensionare sprite-uri,Масштабирование спрайтов,Промена величине спрајтова,Ändra storlek på sprites,Sprite'ları yeniden boyutlandırma,Масштабувати спрайти, -Resize fonts,GLTEXMNU_RESIZEFNT,,,,Škálovat fonty,Ændre størrelse på skrifttyper,Zeichensätze skalieren,,Regrandigi tiparojn,Ajustar fuentes,,Muuta kirjasinten kokoa,Mise à l'échelle texte,Betűk újraméretezése,Resize dei font,フォント類のリサイズ,폰트 리사이징,Lettertypen schalen,Endre størrelse på skrifter,Zmień rozmiar czcionek,Redimensionar fontes,,Redimensionare fonturi,Масштабирование шрифтов,Промена величине фонта,Ändra storlek på teckensnitt,Yazı tiplerini yeniden boyutlandırma,Масштабувати шрифти, -Resize model skins,GLTEXMNU_RESIZESKN,,,,Škálovat skiny modelů,Ændre størrelsen på modelskins,,,Regrandigi haŭtojn de modeloj,Ajustar texturas de modelo,,Muuta ulkoasujen kokoa,Mise à l'échelle des skins des modèles 3D,Model fazon újraméretezése,Ridimensiona skin modello,モデルスキン類のリサイズ,,,Endre størrelse på modellskinn,Zmień rozmiar modelu,Redimensionar skins de modelos,,Redimensionare modele,Масштабирование обликов моделей,,Ändra storlek på modellskinn,Model kaplamalarını yeniden boyutlandırma,Масштабувати текстури моделей, -Precache GL textures,GLTEXMNU_PRECACHETEX,,,,Přednačíst GL textury do cache,Precache GL-teksturer,GL Texturen zwischenspeichern,,Antaŭkaŝmemorigi GL-teksturojn,Precaché de texturas GL,,Kirjoita GL-pintakuvioinnit välimuistiin,Mise en cache des textures,Előcachelt GL textúrák,Precache texture GL,プリキャッシュGLテクスチャー,지엘 텍스쳐 미리 캐싱함,Precache GL texturen,Precache GL-teksturer,Tekstury GL pamięci podręcznej,Precachê de texturas GL,,Preîncărcarcă texturile GL,Кэшировать GL-текстуры,Прикеширане GL текстуре,Precache GL-texturer,GL dokularını önceden önbelleğe alma,Кешувати GL-текстури, -Video Mode,VIDMNU_TITLE,,,,Režim displeje,Videotilstand,Videomodus,Λειτουργία βίντεο,Video-reĝimo,Modos de vídeo,Modos de video,Videotila,Mode Vidéo,Videó mód,Modalità video,ビデオ調整,화면 설정,Videomodus,Videomodus,Tryb Wideo,Modo de vídeo,,Mod Video,Настройки видеорежима,Видео мод,Videoläge,Video Modu,Налаштування відеорежиму, -Scaled (Nearest),OPTVAL_SCALENEAREST,,,,Škálován (nejbližší),Skaleret (Nærmeste),Skaliert (nächster Nachbar),,Skalita (Plej proksime),Escalado (Lo más cerca),,Skaalattu (läheisin),Mis à l'échelle (Proche Voisin),Átméretezett (Közeli),Scalato (più vicino),スケーリング (最寄り),확대 (가깝게),Geschaald (Dichtstbijzijnd),Skalert (nærmeste),Przeskalowany (Najbliższy),Redimensionado (mais próximo),Redimensionado (Apróximado),Redimensionat (Cel mai aproape),Масштабировать (ближайшее),Скалиран (најближи),Skalad (närmast),Ölçeklendirilmiş (En Yakın),Збільшення (ближнє), -Scaled (Linear),OPTVAL_SCALELINEAR,,,,Škálován (lineární),Skaleret (lineær),Skaliert(linear),,Skalita (Linie),Escalado (Lineal),,Skaalattu (lineaarinen),Mis à l'échelle (Linéaire),Átméretezett (Lineáris),Scalato (lineare),スケーリング (リニア),확대 (선형 식),Geschaald (Lineair),Skalert (lineær),Przeskalowany (Liniowy),Redimensionado (linear),,Redimensionat (Liniar),Масштабировать (линейное),Скалиран (линеарно),Skalad (linjär),Ölçeklendirilmiş (Doğrusal),Збільшення (лінійне), -Letterbox,OPTVAL_LETTERBOX,,,,,,,,Leterkesto,Barras negras,,Mustat reunat,,Levágott,Bande nere,レターボックス,레터박스,,,,Barras pretas,,Ecran Parțial,Экранное каше,Поштанско сандуче,Brevlåda,,Техніка каше, -Stretch,OPTVAL_STRETCH,,,,Roztažený,Stræk,Strecken,,Streĉi,Estrechado,Estrecho,Venytetty,Etirer,Nyújtott,Disteso,伸縮,늘림,Rek,Strekk,Rozciągnięty,Esticado,,Lărgire,Растянутый,Растегнуто,Sträcka,Esneme,Розтягнутий, -Render Mode,VIDMNU_RENDERMODE,,,,Režim rendereru,Rendertilstand,Rendermodus,,Bildigo-reĝimo,Modo de renderizado,,Hahmonnustila,Mode de Rendu,Render Mód,Modalità rendering,レンダラー,렌더링 설정,Rendermodus,Gjengivelsesmodus,Tryb Renderowania,Modo de renderização,,Mod Video,Режим обработки,Рендер мод,Renderläge,İşleme Modu,Режим візуалізації, -Fullscreen,VIDMNU_FULLSCREEN,,,,Přes celou obrazovku,Fuld skærm,Vollbild,Πλήρης οθόνη,Plena ekrano,Pantalla completa,,Koko näyttö,Plein écran,Teljes Képernyő,Schermata piena,全画面,전체화면,Volledig scherm,Fullskjerm,Pełen Ekran,Tela cheia,Ecrã cheio,Ecran Complet,Полный экран,Цео екран,Fullskärm,Tam Ekran,Повноекранний, -Retina/HiDPI support,VIDMNU_HIDPI,,,,Podpora Retiny/HiDPI,Retina/HiDPI-understøttelse,Retina/HDPI-Unterstützung,,Retino/HiDPI subteno,Soporte para Retina/HiDPI,,Retina/HiDPI-tuki,Support Retina/HiDPI ,Retina/HiDPI támogatás,Supporto Retina/HiDPi,Retina/HiDPI サポート,망막/하이DPI 활성화,Retina / HiDPI-ondersteuning,Retina/HiDPI-støtte,Wsparcie Retina/HiDPI,Suporte para Retina/HiDPI,,Suport Retina/HiDPI,Поддержка Retina/HiDPI,Retina/HiDPI подршка,Retina/HiDPI-stöd,Retina/HiDPI desteği,Підтримка Retina/HiDPI, -Aspect ratio,VIDMNU_ASPECTRATIO,,,,Poměr stran,Aspektforhold,Seitenverhältnis,,Ekran-proporcio,Relación de aspecto,,Kuvasuhde,Rapport D'Aspect,Képarány,Proporzioni,アスペクト比,종횡비,Beeldverhouding,Bildeforhold,Wpółczynnik proporcji,Proporção de tela,Proporção de ecrã,Aspect Imagine,Соотношение сторон,Однос гледишта,Bildförhållande,En boy oranı,Співвідношення сторін, -Force aspect ratio,VIDMNU_FORCEASPECT,,,,Vynutit poměr stran,Tvinge formatforhold,Erzwinge Seitenverhältnis,,Devigi ekran-proporcion,Forzar relación de aspecto,,Pakota kuvasuhde,Forcer Rapport,Képarány kényszerítése,Forza le proporzioni video,アスペクト比に従う,강제 종횡비,Geforceerde beeldverhouding,Tving sideforhold,Wymuś współczynnik proporcji,Forçar proporção de tela,Forçar proporcção de ecrã,Forțează aspectul imaginii,Принудительное соотношение сторон,Присили однос гледишта,Forcerat bildförhållande,Kuvvet en-boy oranı,Примусове співвідношення сторін, -Forced ratio style,VIDMNU_CROPASPECT,,,,Vynucený poměr stran,Stil med tvunget forhold,Modus für erzwungenes Seitenverhältnis,,Stilo por devigita proporcio,Relación de aspecto forzada,,Kuvasuhteen pakotustapa,Style de Ratio forcé,Kényszerített képarány stílusa,Forza lo stile delle proporzioni,比率の形式,강제 비율 스타일,Geforceerde verhoudingsstijl,Tvunget formatforhold-stil,Wymuszony styl współczynnika,Estilo de proporção forçado,,Forțează tipul proporțiilor,Тип принудительного соотношения сторон,Присиљен стил односа,Stil för tvingat förhållande,Zorlanmış oran stili,Тип примусового співвідношення сторін, -Enable 5:4 aspect ratio,VIDMNU_5X4ASPECTRATIO,,,,Povolit poměr stran 5:4,Aktiver 5:4-billedformat,Erlaube 5:4 Seitenverhältnis,,Ŝalti 5:4 ekran-proporcion,Activar relación de aspecto 5:4,,Ota käyttöön 5:4-kuvasuhde,Activer Rapport 5:4,5:4 képarány engedélyezése,Abilita le proporzioni 5:4,5:4アスペクト比を可能にする,5:4 비율 사용,Schakel 5:4 beeldverhouding in,Aktiver 5:4 sideforhold,Włącz współczynnik proporcji 5:4,Ativar proporção de tela 5:4,,Activează formatul 5:4,Включить соотношение сторон 5:4,Омогући 5:4 однос гледишта,Aktivera bildförhållandet 5:4,5:4 en boy oranını etkinleştirin,Увімкнути співвідношення сторін 5:4, -Resolution scale,VIDMNU_SCALEMODE,,,,Škálování rozlišení,Opløsningsskala,Skalierung,,Distingivo-skalo,Escala de resolución,,Resoluution skaalaus,Echelle de Résolution,Felbontás mérete,Scala di risoluzione,画面スケール,해상도 크기,Resolutieschaal,Oppløsningsskala,Skala rozdzielczości,Escala de resolução,,Scară rezoluție,Масштабирование,Резолуцијска скала,Upplösningsskala,Çözünürlük ölçeği,Масштабування, -Scale Factor,VIDMNU_SCALEFACTOR,,,,Faktor rozlišení,Skalafaktor,Skalierungsfaktor,,Skalfaktoro,Factor de escala,,Skaalauskerroin,Facteur d'échelle,Méretezési Faktor,Fattore di scala,スケール倍率,축척 펙터,Schaalfactor,Skaleringsfaktor,Współczynnik Skali,Fator de escala,,Factor Scalare,Значение масштаба,Фактор скалирања,Skalfaktor,Ölçek Faktörü,Значення масштабування, -Use Linear Scaling (Fullscreen),VIDMNU_USELINEAR,,,,Použít lineární škálování (přes celou obrazovku),Brug lineær skalering (fuld skærm),Lineare Skalierung (Vollbild),,Uzi linian skaladon (Plenekrane),Usar escalado linear (Pant. completa),,Lineaarinen skaalaus (koko näyttö),Mise à l'échelle Linéaire (Plein écran),Lineáris Méretezés Használata (Teljes képernyő),Usa lo scaling lineare (a schermo pieno),リニアスケールを使う(全画面),선형 스케일링 사용 (전체화면),Lineaire schaalverdeling gebruiken (volledig scherm),Bruk lineær skalering (fullskjerm),Użyj Liniowego Skalowania (Pełen Ekran),Usar escala linear (tela cheia),Usar escala linear (ecrã cheio),Folosește Scalarea Liniară (Ecran Complet),Линейное масштабирование (полный экран),Користи линеарно скалирање (цео екран),Använd linjär skalning (helskärm),Doğrusal Ölçeklemeyi Kullan (Tam Ekran),Лінійне масштабування (повний екран), -Custom Pixel Scaling,VIDMNU_CUSTOMRES,,,,Vlastní škálování pixelů,Brugerdefineret pixelskalering,Benutzerdefinierte Skalierung,,Adaptita rastrumero-skalo,Escalado de píxel personalizado,,Mukautettu skaalaus,Résolution Personalisée,Egyéni Pixelméretezés,Scaling dei pixel personalizzato,カスタム ピクセルスケール,사용자 지정 픽셀 크기 조정,Aangepaste pixelschaalvergroting,Egendefinert pikselskalering,Niestandardowe Skalowanie Pikseli,Escala de pixels personalizada,,Scară Pixeli Personalizată,Масштабирование пикселей,Пиксел скалирање,Anpassad pixelskalning,Özel Piksel Ölçeklendirme,Масштабування пікселів, -Custom Width,VIDMNU_CUSTOMX,,,,Vlastní šířka,Brugerdefineret bredde,Benutzerdefinierte Breite,,Adaptita larĝeco,Ancho personalizado,,Mukautettu leveys,Largeur Personalisée,Egyéni szélesség,Lunghezza,カスタム 幅,사용자 지정 너비,Aangepaste breedte,Egendefinert bredde,Niestandardowa Szerokość,Largura personalizada,,Lățime Personalizată,Длина,Ширина,Anpassad bredd,Özel Genişlik,Довжина, -Custom Height,VIDMNU_CUSTOMY,,,,Vlastní výška,Brugerdefineret højde,Benutzerdefinierte Höhe,,Adaptita alteco,Alto personalizado,,Mukautettu korkeus,Hauteur Personalisée,Egyéni magasság,Altezza,カスタム 高さ,사용자 지정 높이,Aangepaste hoogte,Egendefinert høyde,Niestandardowa Wysokość,Altura personalizada,,Înălțime Personalizată,Высота,Висина,Anpassad höjd,Özel Yükseklik,Висота, -Apply Changes (Windowed),VIDMNU_APPLYW,,,,Použít změny (v okně),Anvend ændringer (vindue),Änderungen anwenden (Fenster),,Apliki ŝanĝojn (Fenestrite),Aplicar cambios (Ventana),,Ota käyttöön muutokset (ikkuna),Appliquer Changements (Fenêtre),Változtatások Elfogadása (Ablak),Applica le modifiche (a finestra),変更を適用(ウィンドウ化),변경 적용 (윈도우),Wijzigingen toepassen (in venster),Bruk endringer (vindusbasert),Zatwierdź Zmiany (Okno),Aplicar alterações (janela),,Aplică Schimbările (Mod Fereastră),Сохранить изменения (оконный режим),Примени промене (прозор),Tillämpa ändringarna (fönsterskärm),Değişiklikleri Uygula (Pencereli),Зберегти зміни (віконний режим), -Apply Changes (Fullscreen),VIDMNU_APPLYFS,,,,Použít změny (přes celou obrazovku),Anvend ændringer (fuld skærm),Änderungen anwenden (Vollbild),,Apliki ŝanĝojn (Plenekrane),Aplicar cambios (Pant. completa),,Ota käyttöön muutokset (koko näyttö),Appliquer Changements (Plein écran),Változtatások Elfogadása (Teljes képernyő),Applica le modifiche (a schermo pieno),変更を適用(全画面化),변경 적용 (전체화면),Wijzigingen toepassen (Volledig scherm),Bruk endringer (fullskjerm),Zatwierdź Zmiany (Pełen Ekran),Aplicar alterações (tela cheia),Aplicar alterações (ecrã cheio),Aplică Schimbările (Mod Ecran Complet),Сохранить изменения (полный экран),Примени промене (цели екран),Tillämpa ändringar (helskärm),Değişiklikleri Uygula (Tam Ekran),Зберегти зміни (повноекранний режим), -Choose Resolution Preset,VIDMNU_RESPRESET,,,,Vybrat přednastavené rozlišení,Vælg forindstillet opløsning,Auflösungsvoreinstellung,,Elekti antaŭagorditan distingivon,Elegir resolución predefinida,,Valitse ennalta määritetty resoluutio,Choisir paramètre personalisé,Felbontási Sablon Kiválasztása,Scegli preset di risoluzione,解像度プリセットを選ぶ,해상도 사전 설정 선택,Kies een vooraf ingestelde resolutie,Velg forhåndsinnstilt oppløsning,Wybierz Zestaw Rozdzielczości,Escolher resolução predefinida,,Alege Rezoluția Predefinită,Выбор шаблона разрешения,Резолуцијска подешавања,Välj förinställning för upplösning,Çözünürlük Ön Ayarını Seçin,Вибір пресету роздільної здатності, -Custom Resolution Presets,VIDMNU_RESPRESETTTL,,,,Vlastní přednastavení rozlišení,Brugerdefinerede opløsningsforudindstillinger,Benutzerdefinierte Auflösungsvoreinstellungen,,Viaj antaŭagorditaj distingivoj,Resoluciones predefinidas personalizadas,,Ennalta määritetyt mukautetut resoluutiot,Résolutions Personalisée,Egyéni Felbontási Sablonok,Preset di risoluzione personalizzati,カスタム解像度プリセット,사용자 지정 해상도 미리 조정,Vooraf ingestelde aangepaste resoluties,Egendefinerte forhåndsinnstillinger for oppløsning,Niestandardowe Zestawy Rozdzielczości,Predefinições de resolução personalizadas,,Rezoluții Personalizate,Пользовательские шаблоны,Резолуцијска подешавања,Anpassade förinställningar för upplösning,Özel Çözünürlük Ön Ayarları,Користувацькі пресети, -Preset Resolution Modes,VIDMNU_RESPRESETHEAD,,,,Přednastavená rozlišení,Forindstillede opløsningsmodes,Vordefinierte Auflösungsmodi,,Reĝimoj pri antaŭagordita distingivo,Modos de resolución predefinida,,Ennalta määritetyt resoluutiotilat,Choisir mode de Résolution,Felbontási Sablon Módok,Modalità preset di risoluzione,解像度モードの調整,해상도 미리 조정 모드,Vooraf ingestelde resolutiemodi,Forhåndsinnstilte oppløsningsmoduser,Tryby Zestawów Rozdzielczości,Modos de resolução predefinidas,,Rezoluții Predefinite,Доступные разрешения,Постављени резолуцијски модови,Förinställda upplösningslägen,Önceden Ayarlanmış Çözünürlük Modları,Доступні роздільні здатності, -4:3 Aspect,VIDMNU_ASPECT43,,,,Poměr stran 4:3,4:3 Aspekt,4:3 Seitenverhältnis,,4:3 proporcio,Aspecto 4:3,,4:3-tilat,Rapport 4:3,4:3 Arány,Aspetto 4:3,アスペクト比 4:3,4:3 비율,Beeldverhouding 4:3,4:3 Aspekt,Proporcje 4:3,Proporção 4:3,,Aspect 4:3,Соотношение сторон 4:3,4:3 гледиште,4:3 aspekt,4:3 Görüntü,Співвідношення сторін 4:3, -5:4 Aspect,VIDMNU_ASPECT54,,,,Poměr stran 5:4,5:4 Aspekt,5:4 Seitenverhältnis,,5:4 proporcio,Aspecto 5:4,,5:4-tilat,Rapport 5:4,5:4 Arány,Aspetto 5:4,アスペクト比 5:4,5:4 비율,Beeldverhouding 5:4,5:4 Aspekt,Proporcje 5:4,Proporção 5:4,,Aspect 5:4,Соотношение сторон 5:4,5:4 гледиште,5:4 Aspekt,5:4 Görüntü,Співвідношення сторін 5:4, -16:9 Aspect,VIDMNU_ASPECT169,,,,Poměr stran 16:9,16:9 Aspekt,16:9 Seitenverhältnis,,16:9 proporcio,Aspecto 16:9,,16:9-tilat,Rapport 16:9,16:9 Arány,Aspetto 16:9,アスペクト比 16:9,16:9 비율,Beeldverhouding 16:9,16:9 Aspekt,Proporcje 16:9,Proporção 16:9,,Aspect 16:9,Соотношение сторон 16:9,16:9 гледиште,16:9 aspekt,16:9 Görüntü,Співвідношення сторін 16:9, -16:10 Aspect,VIDMNU_ASPECT1610,,,,Poměr stran 16:10,16:10 Aspekt,16.10 Seitenverhältnis,,16:10 proporcio,Aspecto 16:10,,16:10-tilat,Rapport 16:10,16:10 Arány,Aspetto 16:10,アスペクト比 16:10,16:10 비율,Beeldverhouding 16:10,16:10 Aspekt,Proporcje 16:10,Proporção 16:10,,Aspect 16:10,Соотношение сторон 16:10,16:10 гледиште,16:10 aspekt,16:10 Aspect,Співвідношення сторін 16:10, -21:9 Aspect,VIDMNU_ASPECT219,,,,Poměr stran 21:9,21:9 Aspekt,21.9 Seitenverhältnis,,21:9 proporcio,Aspecto 21:9,,21:9-tilat,Rapport 21:9,21:9 Arány,Aspetto 21:9,アスペクト比 21:9,21:9 비율,Beeldverhouding 21:9,21:9 Aspekt,Proporcje 21:9,Proporção 21:9,,Aspect 21:9,Соотношение сторон 21:9,21:9 гледиште,21:9 Aspekt,21:9 Görüntü,Співвідношення сторін 21:9, -Normal,OPTVAL_NORMAL,,,,Normální,,,,Normala,,,Normaali,,Normál,Normale,通常,기본형,Normaal,,Normalny,,,,Обычный,Нормално,Normal,,Нормальний, -Lowest Possible Scale,OPTVAL_LOWEST,"This describes vid_scalemode 1, which represents the lowest possible scaling to fill the allocated screen area",,,Nejmenší možná velikost,Lavest mulige skala,Kleinstmögliche Auflösung,,Plej malalta ebla skalo,Menor escala posible,,Pienin mahdollinen skaalaus,Echelle la plus faible,Lehető legkisebb méret,Scala minima,可能な限り最小,,Laagst mogelijk schaal,Lavest mulig skala,Najniższa możliwa skala,Menor escala possível,,Cea mai Mică Scară Posibilă,Наименьший возможный масштаб,,Lägsta möjliga skala,Mümkün Olan En Düşük Ölçek,Найменш можливий масштаб, -Custom,OPTVAL_CUSTOM,,,,Vlastní,Brugerdefineret,Benutzerdefiniert,,Agordita de vi,Personalizado,,Mukautettu,Modifié,Egyéni,Personalizzato,カスタム,사용자 지정,Gebruikergedefinieerd,Egendefinert,Niestandardowe,Personalizado,,Personalizat,Польз.,Прилагођ.,Anpassad,Özel,Корист., -Max FPS,VIDMNU_MAXFPS,,,,Maximální FPS,,,,Maksimumaj kadroj laŭ sekundo,Límite de FPS,,Kuvataajuuden rajoitin,,,FPS Massimi,最大FPS値,,,Maks FPS,Maksymalna ilość klatek,FPS máximo,,Cadre pe secundă,Максимальная частота кадров,,,Maksimum FPS,Макс. частота кадрів, -60 fps,OPTVAL_60FPS,,,,,,,,,,,60 kuvaa/s,,,,,,,,,60 FPS,,,60 к/с,,,,60 кадрів, -75 fps,OPTVAL_75FPS,,,,,,,,,,,75 kuvaa/s,,,,,,,,,75 FPS,,,75 к/с,,,,75 кадрів, -90 fps,OPTVAL_90FPS,,,,,,,,,,,90 kuvaa/s,,,,,,,,,90 FPS,,,90 к/с,,,,90 кадрів, -120 fps,OPTVAL_120FPS,,,,,,,,,,,120 kuvaa/s,,,,,,,,,120 FPS,,,120 к/с,,,,120 кадрів, -144 fps,OPTVAL_144FPS,,,,,,,,,,,144 kuvaa/s,,,,,,,,,144 FPS,,,144 к/с,,,,144 кадри, -200 fps,OPTVAL_200FPS,,,,,,,,,,,200 kuvaa/s,,,,,,,,,200 FPS,,,200 к/с,,,,200 кадрів, -Preferred Rendering API,VIDMNU_PREFERBACKEND,,,,Upřednostňované renderovací API,Foretrukken Rendering API,Bevorzugtes Render API,Προτιμούμενο Rendering API,Preferita bildigado de API,API de renderizado preferida,,Ensisijainen hahmonnuksen ohjelmointirajapinta,API de rendu préférée,Előnyben részesített renderelő API,API di rendering preferita,優先レンダリングAPI,기본적인 API 랜더링,Voorkeur rendering API,Foretrukket Rendering API,Preferowany interfejs API renderowania,API de renderização preferida,,API Video Preferat,Предпочтительный API обработки,Преферред АПИ приказивања,Företrädesvis API för rendering,Tercih Edilen Rendering API,Бажаний інтерфейс візуалізації, -OpenGL,OPTVAL_OPENGL,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Vulkan,OPTVAL_VULKAN,,,,,,,,,,,,,,,,,,,,,,,,,,,, -OpenGL ES,OPTVAL_OPENGLES,Rendering backend,,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Miscellaneous Options,,,,,,,,,,,,,,,,,,,,,,,,,,, -Merge left+right Alt/Ctrl/Shift,MISCMNU_MERGEKEYS,,,,Kombinovat pravý a levý Alt/Ctrl/Shift,Flette venstre+højre Alt/Ctrl/Shift,Linke und rechte Umschalt/Strg/Alt zusammenfassen,,Kunigi maldekstran kaj dekstran Alt/Ctrl/Shift,Combinar Alt/Ctrl/Mayús izq. y der.,Combinar Alt/Ctrl/Shift izq. y der.,Yhdistä vasen ja oikea Alt/Ctrl/Vaihto,Combiner Alt/Ctrl/maj gauche & droite,Bal és jobb Ctrl/Alt/Shift egyként érzékelése,Unisci sinistra+destra Alt/Control/Maiusc,左と右のALT/CTRL/SHIFTキーを統合,양쪽 ALT/CTRL/SHIFT키 합병,Samenvoegen links+rechts Alt/Ctrl/Shift,Slå sammen venstre+høyre Alt/Ctrl/Shift,Połącz przyciski lewo+prawo Alt/Ctrl/Shift,"Unir as teclas Alt, Ctrl e Shift esquerdos e direitos",Juntar Alt/Ctrl/Shift esquerdo+direito,Combină Alt/Ctrl/Shift stâng+drept,Не различать левую/правую ALT/CTRL/SHIFT,Споји лево+десно Аlt/Ctrl/Shift,Sammanfoga vänster+höger Alt/Ctrl/Shift,Sol+sağ birleştirme Alt/Ctrl/Shift,Не розділяти лівий/правий ALT/CTRL/SHIFT, -Alt-Enter toggles fullscreen,MISCMNU_WINFULLSCREENTOGGLE,,,,Alt-Enter přepíná celou obrazovku,Alt-Enter skifter til fuld skærm,Alt-Enter schaltet Vollbild an/aus,,Alt+Enter baskuligas tutekranan reĝimon,Alt+Enter alterna pantalla completa,,Alt-Enter kytkee täyden ruudun päälle/pois,Alt-Entrée alterne plein écran,Alt-Enter teljes képernyőre kapcsol,Alt-Invio attiva/disattiva lo schermo pieno,ALTとENTERで全画面に切り替え,ALT+ENTER키로 전체화면 조정,Alt-Enter schakelt het volledige scherm aan/uit,Alt-Enter veksler til fullskjerm,Alt-Enter przełącza na pełen ekran,Alt+Enter ativa tela cheia,Alt-Enter ativa ecrã cheio,Alt-Enter comută modul ecran complet,Переключение полного экрана по ALT+ENTER,Alt-Enter пребацује на цео екран,Alt-Enter växlar till fullskärm,Alt-Enter tam ekrana geçiş yapar,Перемикання повного екрану на ALT+ENTER, -Command-F toggles fullscreen,MISCMNU_MACFULLSCREENTOGGLE,,,,Command-F přepíná celou obrazovku,Command-F skifter til fuld skærm,Cmd-F schaltet Vollbild an/aus,,Komando-F baskuligas tutekranan reĝimon,Cmd-F alterna pantalla completa,,Komento-F kytkee täyden ruudun päälle/pois,Command-F alterne plein écran,Command-F teljes képernyőre kapcsol,Command-F attiva/disattiva lo schermo pieno,Ctrl + Fキーで全画面表示,COMMAND+F키로 전체화면 조정,Command-F schakelt het volledige scherm aan/uit,Kommando-F veksler til fullskjerm,Command-F przełącza pełny ekran,Command+F ativa tela cheia,Command-F ativa ecrã cheio,Command-F comută modul ecran complet,Переключение полного экрана по Cmd+F,Command-F пребацује на цео екран,Command-F växlar till fullskärm,Command-F tam ekrana geçiş yapar,Перемикання повного екрану на Command+F, -Enable autosaves,MISCMNU_ENABLEAUTOSAVES,,,,Povolit automatické ukládání,Aktiver autosaves,Automatisches Speichern,,Ŝalti aŭtomatajn konservojn de ludadoj,Activar autoguardado,,Ota käyttöön automaattiset tallennukset,Activer Sauvegardes auto,Automentések engedélyezése,Abilita i salvataggi automatici,オートセーブを有効化,빠른 저장 허용,Automatisch opslaan inschakelen,Aktiver automatisk lagring,Włącz autozapis,Ativar salvamento automático,Permitir gravação automática,Permite salvări automate,Автосохранения,Омогући аутосејвове,Aktivera autosparande,Otomatik kaydetmeyi etkinleştir,Автозбереження, -Number of autosaves,MISCMNU_AUTOSAVECOUNT,,,,Počet automaticky uložených her,Antal autosaves,Anzahl von automatischen Speicherständen,,Maksimuma kvanto da aŭtomataj konservoj,Cantidad máxima de autoguardados,,Automaattisten tallennusten lukumäärä,Total de sauvegardes auto,Automentések száma,Numero di salvataggi automatici,オートセーブの最大数,빠른 저장 수,Aantal auto-opslagen,Antall autolagringer,Liczba autozapisów,Número de salvamentos automáticos,Número de gravações automáticas,Număr salvări automate,Количество автосохранений,Број аутоматских чувања,Antal autosparande,Otomatik kaydetme sayısı,Кількість автозбрежень, -Save/Load confirmation,MISCMNU_SAVELOADCONFIRMATION,,,,Potvrzení o uložení/načtení,Bekræftelse af gem/indlæsning,Laden/Speichern bestätigen,,Konfirmo de konservo/ŝargo,Confirmación al guardar/cargar,,Tallennuksen/Latauksen vahvistus,Confirmation C/S,Mentés/betöltés megerősítése,Conferma Salvataggio/Caricamento,セーブ/ロード時に確認,스크립트로 스크린샷 생성 허용,Opslaan/Laad bevestiging,Bekreftelse for lagring/innlasting,Potwierdzenie zapisu/wczytania,Confirmação ao salvar/carregar,Confirmação ao gravar/carregar,Dialog de confirmare la Salvare/Încărcare,Подтверждение при сохранении/загрузке,Потврђивање током чувања/учитавања,Bekräftelse av sparande/laddning,Kaydet/Yükle onayı,Підтвердження при збереженні/завантаженні, -Disable keyboard cheats,MISCMNU_NOCHEATS,,,,Vypnout cheaty z klávesnice,Deaktivere snyderier med tastaturet,Tastatur-Cheats deaktivieren,,Malvalidigi klavarajn trompojn,Desactivar trucos por teclado,,Poista näppäinhuijaukset,Déasctiver les codes de triche au clavier,Billentyűs csalások letiltása,Disabilita i trucchi classici,キーボードからのチート無効,,Schakel cheats uit,Deaktiver tastaturjuks,Wyłącz Oszustwa z Klawiatury,Desativar trapaças de teclado,,Dezactivează codurile din tastatură,Отключить клавиатурные чит-коды,,Inaktivera fusk med tangentbordet,Klavye hilelerini devre dışı bırak,Вимкнути клавіатурні чіт-коди, -Quicksave rotation,MISCMNU_QUICKSAVEROTATION,,,,Rotace rychle uložených her,Quicksave-rotation,Schnellspeicherrotation,,Rotacio de rapidkonservo,Rotación al hacer un guardado rápido,,Pikatallennuskierto,Rotation Sauvegardes Rapides,Gyorsmentés forgás,Rotazione del quicksave,クイックセーブ間隔,빠른 저장 간격,Rouleer snelopslag,Hurtiglagring-rotasjon,Rotacja szybkich zapisów,Rotação de salvamentos rápidos,Rotação de gravações rápidas,Rotație salvări automate,Менять ячейки для быстрых сохранений,Окретање брзих чувања,Rotation av snabbregistrering,Hızlı kaydetme rotasyonu,Чергування слотів швидких збережень, -Number of quicksaves in rotation,MISCMNU_QUICKSAVECOUNT,,,,Počet rychle uložených her v rotaci,Antal quicksaves i rotation,Anzahl Schnellspeicherplätze,,Kvanto da rapidkonservoj en rotaciado,Cantidad de guardados rápidos en rotación,,Pikatallennusten määrä kierrossa,Nombre de sauvegardes en rotation,Gyorsmentések száma a forgásban,Numero di quicksave in rotazione,間隔クイックセーブの数,빠른 저장 간격의 수,Aantal roulerende snelopslagplekken,Antall hurtiglagringer i rotasjon,Ilość szybkich zapisów w rotacji,Número de salvamentos rápidos em rotação,Número de gravações rápidas em rotação,Număr salvări rapide în rotație,Кол-во ячеек для быстрых сохранений,Број брзих чувања у окретању,Antal quicksaves i rotation,Rotasyondaki quicksave sayısı,Кількість слотів для швидких збережень, -Disable Menu Clean Scaling,MISCMNU_CLEANMENU,,,,Zakázat čisté škálování nabídek,Deaktivere Menu Clean Scaling,Gleichmäßige Menüskalierung deaktivieren,,Malebligi puran skaladon en la ĉefmenuo,El menú principal ocupa toda la pantalla,,Poista käytöstä valikon siisti skaalautuminen,Ne pas utilisé mise à l'échelle menu propre,Menü Tisztaarányítás kikapcsolása,Disabilita il fattore di scala pulito del menu,メニュー画面を伸縮させない,,Schakel uniforme menuschaling uit,Deaktiver ren skalering av meny,Wyłącz Skalowanie Menu,Desativar escala limpa do menu,,Dezactivează Scara Nouă a Meniurilor,Отключить чистое масштабирование меню,,Inaktivera ren menyskalning,Menü Temiz Ölçeklendirmeyi Devre Dışı Bırak,Вимкнути чисте масштабування меню, -Pause game in background,MISCMNU_PAUSEINBACKGROUND,,,,Pozastavit hru na pozadí,Pause spil i baggrunden,Spiel pausieren wenn im Hintergrund,,Paŭzigi ludon fone,Pausar el juego en segundo plano,,Pysäytä peli taustalla,Mettre le jeu en pause en arrière-plan,Játék megállítása a háttérben,Pausa il gioco in background,バックグラウンド時に一時停止,백그라운드에서 게임 일시 중지,Pauzeer het spel op de achtergrond,Pauser spillet i bakgrunnen,Zapauzuj grę w tle,Pausar jogo ao minimizar,,Pauză dacă jocul este minimizat.,Пауза при сворачивании окна,Паузирајте игру у позадини,Pausa spelet i bakgrunden,Oyunu arka planda duraklat,Пауза при згортуванні вікна, -Default Crosshair,HUDMNU_CROSSHAIR,,,,Výchozí zaměřovač,Standardtrådkorset,Standard-Fadenkreuz,,Defaŭlta reteto,Retícula por defecto,,Oletustähtäin,Viseur par défaut,Alap célkereszt,Mirino di default,デフォルトの照準,기본 조준점,Standaard dradenkruis,Standard trådkors,Domyślny celownik,Mira padrão,,Țintă implicită,Прицел по умолчанию,Уобичајени нишан,Standardkorshår,Varsayılan Nişangah,Типи прицілів, -Crosshair color,HUDMNU_CROSSHAIRCOLOR,,,Crosshair colour,Barva zaměřovače,Trådkors farve,Fadenkreuzfarbe,,Retetokoloro,Color de la retícula,,Tähtäimen väri,Couleur Viseur,Célkereszt színe,Colore mirino,照準色,조준점 색깔,Dradenkruis kleur,Farge på trådkors,Kolor celownika,Cor da mira,,Culoare țintă,Цвет прицела,Боја нишана,Färg på hårkorset,Nişangah rengi,Колір прицілу, -Crosshair shows health,HUDMNU_CROSSHAIRHEALTH,,,,Zaměřovač zobrazuje zdraví,Trådkors viser helbred,Fadenkreuz zeigt Gesundheit,,Reteto montras sanon,Mostrar salud en retícula,,Tähtäin näyttää terveyden,Couleur Viseur selon santé,Életerő jelzése a célkereszten,Il mirino mostra la salute,照準のヘルス表示,조준점과 체력 연동,Dradenkruis toont gezondheid,Trådkorset viser helse,Celownik pokazuje zdrowie,Exibir saúde na mira,Mostra vida na mira,Ținta afișează starea sănătății,Прицел отображает здоровье,Нишан приказује здравље,Hårkorset visar hälsa,Artı işareti sağlığı gösterir,Колір прицілу за станом здоров'я, -Scale crosshair,HUDMNU_CROSSHAIRSCALE,,,,Velikost zaměřovače,Skalerer trådkorset,Fadenkreuz skalieren,,Skali reteton,Escalar retícula,,Skaalaa tähtäintä,Mise à l'échelle du viseur,Célkereszt mérete,Fattore di scala del mirino,照準サイズ,조준점 크기,Dradenkruis schalen,Skalere trådkors,Skala celownika,Redimensionar mira,,Dimensiune țintă,Размер прицела,Размера нишана,Skala hårkorset,Ölçekli artı işareti,Розмір прицілу, -Standard,OPTVAL_YES_STANDARD,copied from elsewhere,,,Standardní,,,Πρότυπο,Norma,Estándar,,Normaali,,Alap,,標準,기본,Standaard,,,Padrão,,,Стандартный,Стандардни,,Standart,Стандартний, -Enhanced,OPTVAL_YES_ENHANCED,,,,Vylepšené,Forbedret,Verbessert,Ενισχυομένο,Bonigita,Mejorado,,Paranneltu,Amélioré,Fejlesztett,Migliorata,強調,고급,Verbeterd,Forbedret,Ulepszone,Melhorado,,Îmbunătățită,Улучшенный,Побољшани,Förbättrad,Geliştirilmiş,Покращений, -Language,OPTMNU_LANGUAGE,,,,Jazyk,Sprog,Sprache,Γλώσσα,Lingvo,Idioma,,Kieli,Langage,Nyelv,Lingua,言語設定,언어,Taal,Språk,Język,Idioma,,Limbă,Язык,Језик,Språk,Dil,Мова, -,,Reverb editor,,,,,,,,,,,,,,,,,,,,,,,,,,, -Undo Changes,TXT_UNDOCHANGES,,,,Zrušit změny,Fortryd ændringer,Rückgängig machen,Αναίρεση Αλλαγών,Malfari ŝanĝojn,Anular cambios,,Peruuttaa muutokset,Révoquer les changements,Változtatások Visszavonása,Revocare le modifiche,変更を戻す,변경 사항 취소,Wijzigingen ongedaan maken,Angre endringer,Cofnij Zmiany,Desfazer alterações,,Anulează Modificările,Отменить изменения,Поништи промене,Ångra ändringar,Değişiklikleri Geri Al,Відмінити зміни, -Select Environment,REVMNU_SELECT,,,,Vybrat prostředí,Vælg miljø,Umgebung wählen,Επιλογή Περιβάλλοντος,Elekti medion,Seleccionar ambiente,,Valitse tila,Sélectionner un environnement,Környezet Kiválasztása,Seleziona ambiente,反響選択,환경 선택,Selecteer omgeving,Velg miljø,Wybierz Środowisko,Selecione o ambiente,,Alegere Mediu,Выбрать окружение,Изабери окружење,Välj miljö,Ortam Seçiniz,Вибрати оточення, -Test Environment,REVMNU_TEST,,,,Testovat prostředí,Test miljø,Umgebung testen,Δοκιμαστκό Περιβάλλον,Provi medion,Probar ambiente,,Testaa tilaa,Tester un environnement,Környezet Tesztelése,Testa ambiente,反響テスト,환경 테스트,Test omgeving,Test miljø,Testuj Środowisko,Testar ambiente,,Testare Mediu,Проверка окружения,Тестирај окружење,Testa miljön,Test Ortamı,Тестувати оточення, -Edit Environment,REVMNU_EDIT,,,,Upravit prostředí,Rediger miljø,Umgebung editieren,Επεξεργασία Περιβάλλοντος,Modifi medion,Editar ambiente,,Muokkaa tilaa,Modifier un environnement,Környezet Szerkesztése,Modifica ambiente,反響編集,환경 편집,Omgeving bewerken,Rediger miljø,Edytuj Środowisko,Editar ambiente,,Editare Mediu,Редактировать окружение,Уреди окружење,Redigera miljön,Ortamı Düzenle,Редагувати оточення, -New Environment,REVMNU_NEW,,,,Nové prostředí,Nyt miljø,Neue Umgebung,Νέο Περιβάλλον,Nova medio,Nuevo ambiente,,Uusi tila,Nouveau environnement,Új Környezet,Nuovo ambiente,新規反響設定,새로운 환경 생성,Nieuwe omgeving,Nytt miljø,Nowe Środowisko,Novo ambiente,,Mediu Nou,Новое окружение,Ново окружење,Ny miljö,Yeni Çevre,Нове оточення, -Revert settings,REVMNU_REVERT,,,,Obnovit nastavení,Tilbageføre indstillinger,Zurücksetzen,Επαναφορά Ρυθμίσεων,Malfari agordojn,Revertir configuración,,Palauta asetukset,Réinitialiser les paramètres,Változtatások elvetése,Ripristina le impostazioni,設定を戻す,설정 되돌리기,Instellingen terugzetten,Tilbake innstillinger,Przywróć ustawienia,Reverter configurações,,Revenire la setările precedente,Сбросить настройки,Врати подешавања,Återkalla inställningar,Ayarları geri döndür,Налаштування за замовчуванням, -Environment Size,REVMNU_ENVIRONMENT_SIZE,Please translate only if you know how to properly name this technical jargon!,,,,,,Μέγεθος Περιβάλλοντος,Mediamplekso,Tamaño de ambiente,,Tilan koko,Taille Environnement,,Dimensioni dell'ambiente,反響サイズ,공간 크기,,,Rozmiar Środowiska,Tamanho do ambiente,,,,,Miljö storlek,,, -Environment Diffusion,REVMNU_ENVIRONMENT_DIFFUSION,,,,,,,Διάχυση Περιβάλλοντος,Medidifuzo,Difusión de ambiente,,Tilan äänen hajautuminen,Diffusion Environnement,,Diffusione dell'ambiente,反響伝播,공간 잔향 확산,,,Dyfuzja Środowiska,Difusão do ambiente,,,,,Miljö spridning,,, -Room,REVMNU_ROOM,,,,,,,Δωμάτιο,Ĉambro,Sala,,Tilan keskitaajuudet,Salle,,,,룸 효과,,,Pokój,Sala,,,,,,,, -Room HF,REVMNU_ROOM_HF,,,,,,,Δωμάτιο HF,Ĉambro (AF),Sala (Frecuencia alta),,Tilan korkeat taajuudet,HF Salle,,,,룸 효과 HF,,,Pokój (wysokie częstotliwości),Sala (alta frequência),,,,,,,, -Room LF,REVMNU_ROOM_LF,,,,,,,Δωμάτιο LF,Ĉambro (MaF),Sala (Frecuencia baja),,Tilan matalat taajuudet,LF Salle,,,,룸 효과 LF,,,Pokój (niskie częstotliwości),Sala (baixa frequência),,,,,,,, -Decay Time,REVMNU_DECAY_TIME,,,,,,,,Putriĝo-tempo,Tiempo de decadencia,,Häipymäaika,Temps Decay,,,,잔향 감쇠 시간,,,Czas Rozkładu,Tempo de decaimento,,,,,,,, -Decay HF Ratio,REVMNU_DECAY_HF_RATIO,,,,,,,,Putriĝo-proporcio (AF),Ratio de decadencia (Frecuencia alta),,Korkeiden taajuuksien (HF) häipymissuhdeluku,,,,Decay HF比率,잔향 감쇠 HF 비율,,,Wskażnik Rozkładu dla wysokich częstotliwości,Taxa de decaimento (alta freq.),,,,,,,, -Decay LF Ratio,REVMNU_DECAY_LF_RATIO,,,,,,,,Putriĝo-proporcio (MaF),Ratio de decadencia (Frecuencia baja),,Matalien taajuuksien (LF) häipymissuhdeluku,,,,Decay LF比率,잔향 감쇠 LF 비율,,,Wskaźnik Rozkładu dla niskich częstotliwości,Taxa de decaimento (baixa freq.),,,,,,,, -Reflections,REVMNU_REFLECTIONS,,,,,,,Αντανακλάσεις,Reflektoj,Reflejos,,Ensiheijastukset,,,,,룸 반사,,,Obicia,Reflexos,,,,,,,, -Reflections Delay,REVMNU_REFLECTIONS_DELAY,,,,,,,Καθυστέρηση Αντανακλάσεων,Prokrasto de reflektoj,Retraso de reflejos,,Ensiheijastusten viive,Délai Reflections,,,,룸 반사 딜레이 시간,,,Opóźnienie Odbić,Atraso de reflexos,,,,,,,, -Reflections Pan X,REVMNU_REFLECTIONS_PAN_X,,,,,,,,Reflektoj alturnas tra X,Desplazamiento en X de reflejos,,Ensiheijastusten X-panorointi,Orientation Reflections X,,,Reflections X定位,X축 룸 반사,,,Odbicia Osi X,Deslocamento X de reflexos,,,,,,,, -Reflections Pan Y,REVMNU_REFLECTIONS_PAN_Y,,,,,,,,Reflektoj alturnas tra Y,Desplazamiento en Y de reflejos,,Ensiheijastusten Y-panorointi,Orientation Reflections Y,,,Reflections Y定位,Y축 룸 반사,,,Odbicia Osi Y,Deslocamento Y de reflexos,,,,,,,, -Reflections Pan Z,REVMNU_REFLECTIONS_PAN_Z,,,,,,,,Reflektoj alturnas tra Z,Desplazamiento en Z de reflejos,,Ensiheijastusten Z-panorointi,Orientation Reflections Z,,,Reflections Z定位,Z축 룸 반사,,,Odbicia Osi Z,Deslocamento Z de reflexos,,,,,,,, -Reverb,REVMNU_REVERB,,,,,,,,Resono,Reverberación,,Jälkikaiunta,,,,,리버브,,,Pogłos,Reverberação,,,,,,,, -Reverb Delay,REVMNU_REVERB_DELAY,,,,,,,,Prokrasto de resono,Retraso de reverberación,,Jälkikaiunnan viive,Délai Reverb,,,,리버브 지연,,,Opóźnienie Pogłosu,Atraso de reverberação,,,,,,,, -Reverb Pan X,REVMNU_REVERB_PAN_X,,,,,,,,Resono alturnas tra X,Desplazamiento en X de reverberación,,Jälkikaiunnan X-panorointi,Orientation Reverb X,,,Reverb X定位,X축 리버브,,,Pogłos Osi X,Deslocamento X de reverberação,,,,,,,, -Reverb Pan Y,REVMNU_REVERB_PAN_Y,,,,,,,,Resono alturnas tra Y,Desplazamiento en Y de reverberación,,Jälkikaiunnan Y-panorointi,Orientation Reverb Y,,,Reverb Y定位,Y축 리버브,,,Pogłos Osi Y,Deslocamento Y de reverberação,,,,,,,, -Reverb Pan Z,REVMNU_REVERB_PAN_Z,,,,,,,,Resono alturnas tra Z,Desplazamiento en Z de reverberación,,Jälkikaiunnan Z-panorointi,Orientation Reverb Z,,,Reverb Z定位,Z축 리버브,,,Pogłos Osi Z,Deslocamento Z de reverberação,,,,,,,, -Echo Time,REVMNU_ECHO_TIME,,,,,,,,Tempo de eĥo,Tiempo de eco,,Kaikuaika,Longueur écho,,,,에코 시간,,,Czas Echa,Tempo de eco,,,,,,,, -Echo Depth,REVMNU_ECHO_DEPTH,,,,,,,,Produndo de eĥo,Profundidad de eco,,Kaiun syvyys,Profondeur écho,,,,에코 깊이,,,Głębokość Echa,Profundidade de eco,,,,,,,, -Modulation Time,REVMNU_MODULATION_TIME,,,,,,,,Tempo de modulado,Tiempo de modulación,,Modulaatioaika,Longueur Modulation,,,,전조 시간,,,Czas Modulacji,Tempo de modulação,,,,,,,, -Modulation Depth,REVMNU_MODULATION_DEPTH,,,,,,,,Produndo de modulado,Profundidad de modulación,,Modulaation syvyys,Profondeur Modulation,,,,전조 깊이,,,Głębokość Modulacji,Profundidade de modulação,,,,,,,, -Air Absorption HF,REVMNU_AIR_ABSORPTION_HF,,,,,,,,Aer-absorbo AF,Absorción en aire de frecuencia alta,,Korkeiden taajuuksien (HF) ilma-absorptio,,,,,대기 흡수 HF,,,Absorbcja Powietrza (wysokie częstotliwości),Absorção de ar de alta freq.,,,,,,,, -HF Reference,REVMNU_HF_REFERENCE,,,,,,,,AF referenco,Referencia de frecuencia alta,,Korkeiden taajuuksien vertausarvo,,,,HF参照値,HF 참조치,,,Odniesienie wysokich częstotliwości,Referência de alta freq.,,,,,,,, -LF Reference,REVMNU_LF_REFERENCE,,,,,,,,MaF referenco,Referencia de frecuencia baja,,Matalien taajuuksien vertausarvo,,,,LF参照値,LF 참조치,,,Odniesienie niskich częstotliwości,Referência de baixa freq.,,,,,,,, -Room Rolloff Factor,REVMNU_ROOM_ROLLOFF_FACTOR,,,,,,,,Ĉambro-Rolloff-faktoro,Factor de Roll-off de sala,,Tilan vaimenemiskerroin,Facteur de rolloff Salle,,,,룸 감쇠 양,,,Czynnik Zejścia,Fator de roll-off de sala,,,,,,,, -Diffusion,REVMNU_DIFFUSION,,,,,,,,Difuzo,Difusión,,Diffuusio,,,,,잔향 확산,,,Dyfuzja,Difusão,,,,,,,, -Density,REVMNU_DENSITY,,,,,,,,Denseco,Densidad,,Tiheys,Densité,,,密度,잔향 밀도,,,Zagęszczenie,Densidade,,,,,,,, -Reflections Scale,REVMNU_Reflections_Scale,,,,,,,,Skalo de reflektoj,Escala de reflejos,,Ensiheijastusten skaala,Echelle Reflections,,,Reflections音階,룸 반사 음계,,,Rozmiar Odbić,Escala de reflexos,,,,,,,, -Reflections Delay Scale,REVMNU_Reflections_Delay_Scale,,,,,,,,Prokrastskalo de reflektoj,Escala de retraso de reflejos,,Ensiheijastusten viiveen skaala,Délai d'échelle reflections,,,Reflections Delay音階,룸 반사 딜레이 음계,,,Skala Opóźnienia Odbić,Escala de atraso de reflexos,,,,,,,, -Decay Time Scale,REVMNU_Decay_Time_Scale,,,,,,,,Tempskalo de purtiĝo,Escala de tiempo de decadencia,,Häipymäajan skaala,Echelle temporelle Decay,,,Decay Time音階,잔향 감쇠시간 음계,,,Skala Czasu Rozkładu,Escala de tempo de decaimento,,,,,,,, -Decay HF Limit,REVMNU_Decay_HF_Limit,,,,,,,,AF-Limito de purtiĝo,Limite de decadencia de alta frecuencia,,Häipymän korkeiden taajuuksien raja-arvo,Limite HF Decay,,,Decay HF限度,잔향 감쇠 HF 한도,,,Limit Rozkładu Wysokich Częstotliwości,Limite de decaimento em alta freq.,,,,,,,, -Reverb Scale,REVMNU_Reverb_Scale,,,,,,,,Skalo de resono,Escala de reverberación,,Jälkikaiunnan skaala,Echelle Reverb,,,Reverb音階,리버브 음계,,,Skala Pogłosu,Escala de reverberação,,,,,,,, -Reverb Delay Scale,REVMNU_Reverb_Delay_Scale,,,,,,,,Prokrastskalo de resono,Escala de retraso de reverberación,,Jälkikaiunnan viiveen skaala,Délai d'échelle Reverb,,,Reverb Delay音階,리버브 딜레이 음계,,,Skala Opóźnienia Pogłosu,Escala de atraso de reverberação,,,,,,,, -Echo Time Scale,REVMNU_Echo_Time_Scale,,,,,,,,Tempskalo de eĥo,Escala de tiempo de eco,,Kaikuajan skaala,Echelle temporelle Echo,,,Echo Time音階,에코 시간 음계,,,Skala Czasu Echa,Escala de tempo de eco,,,,,,,, -Modulation Time Scale,REVMNU_Modulation_Time_Scale,,,,,,,,Tempskalo de modulado,Escala de tiempo de modulación,,Modulaatioajan skaala,Echelle temporelle Modulation,,,Modulation Time音階,전조 시간 음계,,,Skala Modulacji Czasu,Escala de tempo de modulação,,,,,,,, -Based on,REVMNU_Based_on,,,,Založeno na,Baseret på,Basierend auf,Βασισμένο σε,Bazita de,Basado en,,Perustana,Basé sur,Minta,Basato su,音響の元,음향 원본,Gebaseerd op,Basert på,Bazowane na,Baseado em,,Bazat pe,Основано на,Засновано на,Baserat på,Buna göre,На основі, -Name,REVMNU_Name,,,,Název,Navn,,Όνομα,Nomo,Nombre,,Nimi,Nom,Név,Nome,名前,이름,Naam,Navn,Nazwa,Nome,,Nume,Название,Назив,Namn,İsim,Назва, -ID #1,REVMNU_ID_1,,,,,,,,Identigo #1,ID Nº1,,,,,ID N°1,,아이디 #1,,,,,,,ИД №1,,,,, -ID #2,REVMNU_ID_2,,,,,,,,Identigo #2,ID Nº2,,,,,ID N°2,,아이디 #2,,,,,,,ИД №2,,,,, -Create,REVMNU_Create,,,,Vytvořit,Opret,Erstellen,Δημιουργία,Krei,Crear,,Luo,Créer,Készítés,Creare,作成,생성,Aanmaken,Opprett,Stwórz,Criar,,Creare,Создать,Направи,Skapa,Oluştur,Створити, -Save...,REVMNU_Save,,,,Uložit...,Gem...,Speichern...,Αποθήκευση,Konservi...,Guardar...,,Tallenna...,Sauvegarder...,Mentés...,Salvare...,セーブする...,저장 하기...,Opslaan...,Lagre...,Zapisz...,Salvar...,,Salvare...,Сохранить...,Сачувај...,Spara...,Kaydet...,Зберегти..., -File name,REVMNU_File_name,,,,Název souboru,Filnavn,Dateiname,Όνομα αρχείου,Dosiernomo,Nombre de archivo,,Tiedostonimi,Nom de fichier,Fájlnév,Nome del file,ファイル名,파일 이름,Bestandsnaam,Filnavn,Nazwa pliku,Nome do arquivo,,Nume fișier,Имя файла,Назив фајла,Filnamn,Dosya adı,Назва файлу, -Environments to save,REVMNU_Environments_to_save,,,,Prostředí k uložení,"Miljøer, der skal gemmes",Zu speichernde Umgebungen,Περιβάλλοντα για αποθήκευση,Medioj por konservi,Ambientes para guardar,,Tallennettavat tilat,Environnements à sauvegarder,Mentendő Környezetek,Ambienti da salvare,音響を保存,저장할 공간,Omgevingen om op te slaan,Miljøer som skal lagres,Środowiska do zapisu,Ambientes para salvar,,Medii de salvat,Сохранить окружения...,Окружења за чување,Miljöer som ska sparas,Kurtarılacak ortamlar,Зберегти оточення..., -,,Vulkan,,,,,,,,,,,,,,,,,,,,,,,,,,, -Vulkan Options (Experimental),DSPLYMNU_VKOPT,,,,Nastavení Vulkanu (Experimentální),Vulkan-indstillinger (eksperimentelt),Vulkan Optionen (Experimentell),Vulka Ρυθμίσεις (Πειραματικές),Agordoj por Vulkan (Eksperimenta),Opciones de Vulkan (Experimental),,Vulkan-asetukset (kokeellinen),Options Vulkan (Expérimental),Vulkan Beállítások (Kísérleti),Opzioni Vulkan (Sperimentale),Vulkan機能オプション(実験的),벌칸 설정(실험적),Vulkan-opties (Experimenteel),Vulkan Alternativer (Eksperimentell),Opcje Vulkan (Eksperymentalne),Opções de Vulkan (experimental),,Setări Mod Vulkan (În curs de testare),Настройки Vulkan (экспериментальные),Vulkan подешавања (експериментална),Vulkan-alternativ (experimentellt),Vulkan Seçenekleri (Deneysel),Налаштування Vulkan (експериментальні), -Vulkan Options,VK_TITLE,,,,Nastavení Vulkanu,Vulkan-indstillinger,Vulkan Optionen,Vulkan Ρυθμίσεις,Agordoj por Vulkan,Opciones de Vulkan,,Vulkan-asetukset,Options Vulkan,Vulkan Beállítások,Opzioni Vulkan,Vulkan機能オプション,벌칸 설정,Vulkan-opties,Vulkan-alternativer,Opcje Vulkan,Opções de Vulkan,,Setări Mod Vulkan,Настройки Vulkan,Vulkan подешавања,Vulkan-alternativ,Vulkan Seçenekleri,Налаштування Vulkan, -Enable Vulkan,VKMNU_ENABLE,,,,Povolit Vulkan,Aktiver Vulkan,Aktiviere Vulkan,Ενεργοποιηση του Vulkan,Ŝalti Vulkan,Activar Vulkan,,Ota käyttöön Vulkan,Activer Vulkan,Vulkan Engedélyezése,Abilita Vulkan,Vulkanを有効化,벌칸 렌더러 사용,Vulkan inschakelen,Aktiver Vulkan,Włącz Vulkan,Ativar Vulkan,,Activează modul video Vulkan,Использовать Vulkan,Омогући Vulkan,Aktivera Vulkan,Vulkan'ı Etkinleştir,Увімкнути Vulkan, -Vulkan Device ID,VKMNU_DEVICE,,,,ID zařízení Vulkanu,Vulkan-enheds-id,Vulkan Geräte ID,Vulkan ID Συσκευής,Identigo de Vulkan-aparato,ID de dispositivo Vulkan,,Vulkan-laitetunniste,ID du périphérique Vulkan,Vulkan Eszköz ID,Dispositivo ID Vulkan,Vulkanデバイス ID,벌칸 장치 아이디,Vulkan apparaat-ID,Vulkan Enhets-ID,ID urządzenia Vulkan,ID do dispositivo Vulkan,,ID Dispozitiv Vulkan,ИД устройства Vulkan,Vulkan ID уређаја,Vulkan-enhets-ID,Vulkan Cihaz Kimliği,ID пристрою Vulkan, -High Dynamic Range,VKMNU_HDR,,,,Vysoký dynamický rozsah (HDR),Høj dynamisk rækkevidde,,Υψηλό Δυναμική Εμβέλεια,Alta dinamika intervalo,Alto rango dinámico,,Korkea dynamiikka-alue (HDR),,,,ハイダイナミックレンジ,하이 다이나믹 레인지,Hoog dynamisch bereik,Høyt dynamisk område,Obraz HDR,Alto alcance dinâmico (HDR),,HDR,Расширенный динамический диапазон (HDR),HDR,Högt dynamiskt omfång,Yüksek Dinamik Aralık,HDR, -Warning: The Vulkan renderer is highly experimental!,VK_WARNING,,,,Varování: Vulkan renderer je velmi experimentální!,Advarsel: Vulkan-rendereren er meget eksperimentel!,Achtung: Der Vulkan Renderer ist noch sehr experimentell!,Προειδοποίηση: Ο Vulkan renderer είναι υψηλά πειραματικός!,Averto: La bildigilo de Vulkan estas alte eksperimenta!,Advertencia: ¡El renderizado por Vulkan es altamente experimental!,,Varoitus: Vulkan-hahmonnin on hyvin kokeellinen!,Attention: Le moteur de rendu Vulkan est très expérimental!,Vigyázat: A Vulkan renderer még teljesen kísérleti!,Attenzione: il motore grafico Vulkan è altamente sperimentale!,警告:Vulkanレンダラーは実験段階です!,경고: 벌칸 렌더러는 매우 실험적입니다!,Waarschuwing: De Vulkan renderer is zeer experimenteel!,Advarsel: Vulkan-rendereren er svært eksperimentell!,Uwaga: Renderer Vulkan jest bardzo eksperymentalny!,Atenção: o renderizador Vulkan é altamente experimental!,,Atenție: Modul Vulkan este încă în curs de testare!,Внимание: обработчик Vulkan в стадии тестирования!,УПОЗОРЕЊЕ: Vulkan рендерер је врло експерименталан!,Varning: Vulkan-renderaren är mycket experimentell!,Uyarı: Vulkan işleyici son derece deneyseldir!,Увага: рендер Vulkan на стадії тестування!, -These options will require a restart to take effect.,VK_RESTART,,,,Tato nastavení vyžadují restart hry.,Disse indstillinger kræver en genstart for at få effekt.,Diese Option erfordert einen Neustart!,Αυτές η ρυθμίσεις θα χρειαστούνε επανεκκίνηση για να ισχύσουν,Ĉi tiuj agordoj bezonos relanĉon por efikiĝi.,Estas opciones requieren reiniciar para tener efecto.,,Nämä asetukset vaativat uudelleenkäynnistyksen astuakseen voimaan.,Ces options nécessitent un redémarrage.,Ezen beállítások életbelépéséhez újraindítás szükséges.,Queste opzioni richiedono il riavvio per avere effetto.,これらのオプションを有効にするには再起動が必要です。,이 설정을 적용하려면 게임을 재시작해야 합니다.,Deze opties vereisen een herstart om van kracht te worden.,Disse alternativene krever en omstart for å tre i kraft.,"Te opcje będą wymagały ponownego włączenia, aby miały efekt.",É necessário reiniciar para que essas configurações surtam efeito.,É necessário reiniciar para estas configurações fazerem efeito.,Aceste setări necesită o repornire pentru a putea fi aplicate,Для применения этих изменений требуется перезапуск игры.,Морате поново покренути GZDoom да би промене ступиле на снагу.,De här alternativen kräver en omstart för att få effekt.,Bu seçeneklerin etkili olması için yeniden başlatılması gerekecektir.,Для застосування змін протрібно перезапустити гру., -Select Vulkan Device,VKMNU_DEVICESELECT,This is not yet implemented - but it is planned,,,Vybrat zařízení Vulkanu,Vælg Vulkan-enhed,Vulkan Gerät auswählen,Επιλογή Vulkan Συσκευής,Elekti Vulkan-aparaton,Seleccionar dispositivo Vulkan,,Valitse Vulkan-laite,Sélectionner périphérique Vulkan,Vulkan eszköz kiválasztása,Seleziona il Dispositivo Vulkan,Vulkanデバイスの選択,벌칸 장치를 고르시오,Selecteer Vulkan Apparaat,Velg Vulkan-enhet,Wybierz Urządzenie Vulkan,Selecione o dispositivo Vulkan,,Selectare Dispozitiv Vulkan,Выбрать устройство Vulkan,Изаберите Vulkan уређај,Välj Vulkan-enhet,Vulkan Aygıtını Seçin,Виберіть пристрій Vulkan, -,,Texture scaling,,,,,,,,,,,,,,,,,,,,,,,,,,, -ScaleNx,OPTVAL_SCALENX,,,,,,,,,,,,,,,,,,,,,,,,,,,, -NormalNx,OPTVAL_NORMALNX,,,,,,,,,,,,,,,,,,,,,,,,,,,, -hqNx,OPTVAL_HQNX,,,,,,,,,,,,,,,,,,,,,,,,,,,, -hqNx MMX,OPTVAL_HQNXMMX,,,,,,,,,,,,,,,,,,,,,,,,,,,, -xBRZ,OPTVAL_NXBRZ,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Old xBRZ,OPTVAL_OLD_NXBRZ,,,,xBRZ (starší),Gamle xBRZ,xBRZ alt,Παλίο xBRZ,Malnova xBRZ,Antiguo xBRZ,,Vanha xBRZ,Ancien xBRZ,Régi xBRZ,Vecchio xBRZ,旧xBRZ,구형 xBRZ,Oud xBRZ,Gammel xBRZ,Stare xBRZ,Antigo xBRZ,,Vechiul xBRZ,Старый xBRZ,Стари xBRZ,Gamla xBRZ,Eski xBRZ,Старий xBRZ, -,,Option Search,,,,,,,,,,,,,,,,,,,,,,,,,,, -Option Search,OS_TITLE,,,,Vyhledávání možností,Mulighed Søgning,Optionssuche,Αναζήτηση Ρυθμίσεων,Serĉi agordojn,Buscar opciones,,Asetushaku,Recherche Option,Beállítások keresése,Opzioni di ricerca,オプション検索,옵션 검색,Optie zoeken,Alternativt søk,Szukanie Opcji,Buscar opção,Procurar opção,Căutare Setări,Поиск настройки,Претрага,Sökning av alternativ,Seçenek Arama,Пошук налаштування, -Search for any term,OS_ANY,,,,Hledat jakékoli klíčové slovo,Søg efter et vilkårligt begreb,Suche nach beliebigem Begriff,Αναζήτηση για όποιαδηποτε λέξη,Serĉi iun ajn terminon,Buscar cualquier término,,Etsi mitä tahansa sanaa,N'importe quel mot,Keresés bármely kifejezésre,Cerca per ciascun termine,いずれかの用語を探す,용어 검색,Zoek naar eender welke term,Søk etter en hvilken som helst term,Szukaj jakiegokolwiek wyrażenia,Buscar por qualquer termo,Procurar por um termo qualquer,Căutare după orice termen,Искать любое из слов,Тражи било који термин,Sök efter valfri term,Herhangi bir terim için arama yapın,Шукати будь яке з слів, -Search for all terms,OS_ALL,,,,Hledat všechna klíčová slova,Søg efter alle udtryk,Suche nach allen Begriffen,Αναζήτηση για όλες της λέξεις,Serĉi ĉiujn terminojn,Buscar todos los términos,,Etsi kaikki sanat,Tous les mots,Keresés minden kifejezésre,Cerca per tutti i termini,全ての用語を探す,모든 조건 검색,Zoek naar alle termen,Søk etter alle termer,Szukaj wszystkich wyrażeń,Buscar por todos os termos,Procurar por todos os termos,Căutare după toți termenii,Искать все слова,Тражи сваки термин,Sök efter alla termer,Tüm terimler için arama yapın,Шукати всі слова, -No results found.,OS_NO_RESULTS,,,,Nic nenalezeno.,Ingen resultater fundet.,Keine Resultate,Δέν βρέθηκαν αποτελέσματα,Neniu trafo.,Ningún resultado.,,Ei tuloksia.,Pas de résultat trouvé,Nincs találat,Nessun risultato trovato.,見つかりませんでした。,검색 결과 없음.,Geen resultaten gevonden.,Ingen resultater funnet.,Brak wyników,Nenhum resultado encontrado.,,Niciun rezultat găsit.,Результаты не найдены.,Нема резултата.,Inga resultat hittades.,Sonuç bulunamadı.,Нічого не знайдено., -Search:,OS_LABEL,,,,Hledat:,Søg:,Suche:,Αναζήτηση:,Serĉi:,Buscar:,,Etsi:,Recherche:,Keresés:,Trova:,検索:,검색:,Zoeken:,Søk:,Szukaj:,Busca:,Procura:,Caută:,Поиск:,Претрага:,Sök:,Ara:,Пошук:, -,,Blood Bath Announcer,,,,,,,,,,,,,,,,,,,,,,,,,,, -%k boned %o like a fish,TXT_OBITUARY1,,,,%o byl@[ao_cs] vykoštěn@[ao_cs] jako ryba hráčem %k,%k udbenede %o som en fisk,%k hat %o zerlegt wie einen Fisch,Ο/Η %k ξεκοκάλοσε @[pro2_gr] %o σα ψάρι,%k senostigis %o kiel fiŝon,%k ha deshuesado a %o como a un pescado,%k deshuesó a %o como a un pescado,%k perkasi %o paran kuin kalan,%k a désossé %o comme un poisson,%k kifilézte %o -t mint a halat,%k ha dissossato %o come un pesce,%k は %o の骨を魚のように引っこ抜いた。,%k 은(는) %o 의 뼈를 발랐다.,%k mergelde %o als een vis,%k utbeinet %o som en fisk,%k odfiletował@[ao_pl] %o jak rybę,%k desossou %o como um peixe,,%k l-a dezosat pe %o ca pe un pește,%k пересчитал косточки игрока %o,%k је очистио %o као рибу,%k benade %o som en fisk,"%o, %k tarafından balık gibi kemirildi.",%k порахува@[adj_1_ua] ребра %o, -%k castrated %o,TXT_OBITUARY2,,,,%o byl@[ao_cs] vykastrován@[ao_cs] hráčem %k,%k kastrerede %o,%k hat %o kastriert,Ο/Η %k ευνούχισε %o,%k kastris %o,%k ha castrado a %o,%k castró a %o,%k kastroi %o paran,%k a castré %o,%k kasztrálta %o -t,%k ha castrato %o,%k は %o を去勢した。,%k 은(는) %o 을(를) 거세시켰다.,%k castreerde %o,%k kastrert %o,%k wykastrował@[ao_pl] %o,%k castrou %o,,%k l-a castrat pe %o,%k кастрировал игрока %o,%k је кастрирао %o,%k kastrerade %o,"%o, %k tarafından hadım edildi.",%k каструва@[adj_1_ua] %o, -%k creamed %o,TXT_OBITUARY3,,,,%o byl@[ao_cs] rozšlehán@[ao_cs] hráčem %k,%k smurte %o,%k hat %o eingeseift,Ο/Η %k κρέμασε @[pro2_gr] %o,%k kremigis %o,%k ha cremado a %o,%k cremó a %o,%k kermasi %o paran,%k a battu %o à plate couture ,%k elkente %o -t,%k ha cremato %o,%k は %o に反吐ブチ撒けさせた。,%k 은(는) %o 을(를) 양념시켰다.,%k pureerde %o,%k fløtet %o,%k spienił@[ao_pl] %o,%k fez creme de %o,,%k l-a transformat în cremă pe %o,%k взбил игрока %o,%k је истукао %o,%k gräddade %o,,%k розпуши@[adj_1_ua] %o, -%k decimated %o,TXT_OBITUARY4,,,,%o byl@[ao_cs] zdecimován@[ao_cs] hráčem %k,%k decimerede %o,%k hat %o dezimiert,Ο/Η %k αποδεκάτισε @[pro2_gr] %o,%k detruegis %o,%k ha diezmado a %o,%k diezmó a %o,%k hävitti %o paran,%k a décimé %o,%k megtizedelte %o -t,%k ha decimato %o,%k は %o の居場所を間引いた。,%k 은(는) %o 을(를) 망가뜨렸다.,%k decimeerde %o,%k desimert %o,%k przetrzebił@[ao_pl] %o,%k decimou %o,,%k l-a decimat pe %o,%k скосил игрока %o,%k је десетковао %o,%k decimerade %o,"%o, %k tarafından yok edildi.",%k зітну@[adj_1_ua] %o, -%k destroyed %o,TXT_OBITUARY5,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k ødelagde %o,%k hat %o zerstört,Ο/Η %k κατέστεψε @[pro2_gr] %o,%k detruis %o,%k ha destruido a %o,%k destruyó a %o,%k tuhosi %o paran,%k a détruit %o,%k elpusztította %o -t,%k ha distrutto %o,%k は %o を完全に破壊した。,%k 은(는) %o 을(를) 파괴했다.,%k vernietigde %o,%k destruert %o,%k zniszczył@[ao_pl] %o,%k destruiu %o,,%k l-a distrus pe %o,%k уничтожил игрока %o,%k је уништио %o,%k förstörde %o,,%k знищи@[adj_1_ua] %o, -%k diced %o,TXT_OBITUARY6,,,,%o byl@[ao_cs] nakrájen@[ao_cs] na kostičky hráčem %k,%k skar %o i tern,%k hat %o in Würfel zerteilt,Ο/Η %k τεμάχησε @[pro2_gr] %o,%k diskubigis %o,%k ha picado en cubitos a %o,%k picó en cubitos a %o,%k pilkkosi %o paran,%k a coupé en dés %o,%k kockára vágta %o -t,%k ha tagliato a cubetti %o,%k は %o を賽の目に切った。,%k 은(는) %o 을(를) 잘게 잘게 썰었다.,%k sneed %o in stukjes,%k skåret %o i terninger,%k pokroił@[ao_pl] w kostkę %o,%k fez picadinho de %o,%k cortou %o,%k l-a feliat pe %o,%k разрезал игрока %o,%k је исецкао %o,%k skar %o i tärningar,"%o, %k tarafından doğrandı.",%k наріза@[adj_1_ua] %o, -%k disembowled %o,TXT_OBITUARY7,,,,%o byl@[ao_cs] vykuchán@[ao_cs] hráčem %k,%k udkløvede %o,%k hat %o ausgeweidet,Ο/Η %k ισοπέδοσε @[pro2_gr] %o,%k sentripigis %o,%k ha destripado a %o,%k destripó a %o,%k suolisti %o paran,%k a étripé %o,%k kibelezte %o -t,%k ha smembrato %o,%k は %o の臓物を引きずり出した。,%k 은(는) %o 의 내장을 도려냈다.,%k ontleedde %o,%k sprettet opp %o,%k wypatroszył@[ao_pl] %o,%k estripou %o,,%k l-a eviscerat pe %o,%k выпотрошил игрока %o,%k је ампутирао %o,%k tog upp %o i bitar,,%k випотроши@[adj_1_ua] %o, -%k flattened %o,TXT_OBITUARY8,,,,%o byl@[ao_cs] zplacatěn@[ao_cs] hráčem %k,%k smadrede %o,%k hat %o dem Erdboden gleichgemacht,Ο/Η %k ησοπέδοσε @[pro2_gr] %o,%k platigis %o,%k ha aplanado a %o,%k aplanó a %o,%k lyttäsi %o paran,%k a aplati %o,%k kilapította %o -t,%k ha schiacciato %o,%k は %o をぶっ潰した。,%k 은(는) %o 의 코를 납작하게 만들었다.,%k plette %o,%k flatet ut %o,%k rozpłaszczył@[ao_pl] %o,%k achatou %o,%k espalmou %o,%k l-a făcut plat pe %o,%k сплюснул игрока %o,%k је изравнао %o,%k plattade %o,"%o, %k tarafından dümdüz edildi.",%k сплющи@[adj_1_ua] %o, -%k gave %o Anal Justice,TXT_OBITUARY9,,,,%o utržil@[ao_cs] anální spravedlnost od hráče %k,%k lemlæstede %o,%k hat %o anale Gerechtigkeit gegeben,Ο/Η %k γάμησε @[pro2_gr] %o @[pro3_gr] κόλο,%k donis pugan juston al %o,%k le ha dado justicia anal a %o,%k le dió justicia anal a %o,%k jakoi %o paralle anaalioikeutta,%k a rendu une justice anale a %o,%k Anális Igazságot adott %o -nak ,%k ha dato a %o Giustizia Anale,%k は %o のケツにぶち込んだ。,%k 은(는) %o 에게 홍콩행을 보냈다.,%k gaf %o anale rechtvaardigheid,%k ga %o anal rettferdighet,%k dał@[ao_pl] %o Analną Sprawiedliwość,%k deu Justiça Anal para %o,,%k i-a făcut jucătorului %o o Justiție Anală,%k устроил анальное правосудие игроку %o,%k је дао %o аналну правду,%k gav %o anal rättvisa,"%o, %k tarafından dümdüz edildi.",%k влаштува@[adj_1_ua] анальне правосуддя %o, -%k gave AnAl MaDnEsS to %o,TXT_OBITUARY10,,,,%o utrpěl@[ao_cs] AnÁlNí ŠíLeNsTvÍ od hráče %k,%k spildte %o,%k gab %o AnAlEn WaHnSiNn,Ο/Η %k έσκισε τον κόλο του/της] %o,%k donis pUgAn frEnEzOn al %o,%k le ha dado LoCuRa AnAl a %o,%k le dió LoCuRa AnAl a %o,%k teki %o paran AnAaLiHuLlUkSi,%k a donné la FOLIE ANALE a %o,%k SeGgBe KüLDtE %o -t,%k ha dato FoLlIa AnAle a %o,%k は %o のケツをガバガバにした。,%o 은(는) %k 의 찰진 맛을 보았다.,%k gaf aNaLe DoLhEiD aan %o,%k ga %o anal rettferdighet,%k dał@[ao_pl] %o AnAlNe SzAlEńStWo ,%k deu LoUcUrA aNaL para %o,,%k i-a dat NeBuNiE AnAlĂ jucătorului %o,%k устроил АнАЛ КаРнаВаЛ игроку %o,%k је дао АнАлНо ЛуДиЛо %o,%k gav %o anal rättvisa,"%o, %k tarafından dümdüz edildi.",%k влаштува@[adj_1_ua] АнАЛ ГуЛяНнЯ %o, -%k killed %o,TXT_OBITUARY11,,,,%o byl@[ao_cs] zabit@[ao_cs] hráčem %k,%k dræbte %o,%k hat %o getötet,Ο/Η %k σκότωσε @[pro2_gr] %o,%k mortigis %o,%k ha matado a %o,%k mató a %o,%k tappoi %o paran,%k a tué %o,%k kicsinálta %o -t,%k ha ucciso %o,%k は %o をブッ殺した。,%k 은(는) %o 을(를) 죽였다.,%k doodde %o,%k drepte %o,%k zabił@[ao_pl] %o,%k matou %o,,%k l-a omorât pe %o,%k убил игрока %o,%k је убио %o,%k dödade %o,"%o, %k tarafından öldürüldü.",%k вби@[adj_1_ua] %o, -%k made mincemeat out of %o,TXT_OBITUARY12,,,,%o byl@[ao_cs] namelen@[ao_cs] hráčem %k,%k gjorde hakket kød af %o,%k hat %o zu Hackfleisch verarbeitet,Ο/Η %k έφτιαξε κυμά με @[pro2_gr] %o,%k farigis farĉon el %o,%k ha hecho picadillo de %o,%k hizo picadillo de %o,%k teki jauhelihaa %o parasta,%k a fait de la viande hachée de %o,%k ledarálta %o -t,%k ha triturato %o,%k は %o をミンチにした。,%o 은(는) %k 에 의해 분쇄됐다.,%k maakte gehakt van %o,%k laget kjøttdeig av %o,%k zrobił@[ao_pl] mięso mielone z %o,%k fez carne moída de %o,%k fez carne picada do %o,%k a facut tocătură din %o,%k сделал отбивную из игрока %o,%k је направио млевено месо од %o,%k gjorde köttfärs av %o,"%o, %k tarafından kıyma haline getirildi.",%k зроби@[adj_1_ua] відбивну з %o, -%k massacred %o,TXT_OBITUARY13,,,,%o byl@[ao_cs] zmasakrován@[ao_cs] hráčem %k,%k massakrerede %o,%k hat %o niedergemetzelt,Ο/Η %k δολοφώνησε @[pro2_gr] %o,%k masakris %o,%k ha masacrado a %o,%k masacró a %o,%k verilöylytti %o parkaa,%k a massacré %o,%k lemészárolta %o -t,%k ha fatto di %o carne tritata,%k は %o を虐殺した。,%k 은(는) %o 을(를) 참살했다.,%k slachtte %o af,%k massakrerte %o,%k zmasakrował@[ao_pl] %o,%k massacrou %o,,%k a fost masacrat de către %o,%k устроил бойню игроку %o,%k је масакрирао %o,%k massakrerade %o,"%o, %k tarafından katledildi",%k влаштува@[adj_1_ua] для %o бійню, -%k mutilated %o,TXT_OBITUARY14,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] hráčem %k,%k lemlæstede %o,%k hat %o verstümmelt,Ο/Η %k ακρωτηριάσε @[pro2_gr] %o,%k mutilis %o,%k ha mutilado a %o,%k mutiló a %o,%k silpoi %o paran,%k a mutilé %o,%k megcsonkította %o -t,%k ha massacrato %o,%k は %o をバラバラ死体にした。,%k 은(는) %o 의 팔다리를 절단했다.,%k verminkte %o,%k lemlestet %o,%k rozszarpał@[ao_pl] %o,%k mutilou %o,,%k l-a mutilat pe %o,%k изуродовал игрока %o,%k је мутилирао %o,%k lemlästade %o,"%o, %k tarafından sakat bırakıldı.",%k знівечи@[adj_1_ua] %o, -%k reamed %o,TXT_OBITUARY15,,,,%o byl@[ao_cs] proděravěn@[ao_cs] hráčem %k,%k skændede %o,%k hat %o aufgerieben,Ο/Η %k δέσμισε @[pro2_gr] %o,%k alezis %o,%k ha escariado a %o,%k escarió a %o,%k porasi %o paran,%k a découpé en fines lamelles %o,%k seggbe rakta %o -t,%k ha squartato %o,%k は %o の穴を大きく広げた。,%k 은(는) %o 을(를) 크게 혼냈다.,%k holde %o uit,%k maltraktert %o,%k rozwiercił@[ao_pl] %o,%k esquartejou %o,,%k l-a transformat într-un top de hârtie pe %o,%k рассверлил игрока %o,%k је наоружао %o,%k har gjort %o illa.,"%o, %k tarafından öldürüldü.",%k просверли@[adj_1_ua] %o, -%k ripped %o a new orifice,TXT_OBITUARY16,,,,%o má novou díru od hráče %k,%k flåede %o en ny åbning,%k hat %o eine neue Körperöffnung verpasst,Ο/Η άνοιξε μια νέα τρύπα @[pro3_gr] %o,%k ŝiris novan truon en %o,%k le ha hecho a %o un nuevo orificio,%k le hizo a %o un nuevo orificio,%k repi %o paralle uuden aukon,%k a ouvert un nouvel orifice a %o,%k új szájat csinált %o -nak,%k ha aperto a %o un altro orifizio,%k は %o を切り裂いて新しい穴を作ってあげた。,%k 은(는) %o 을(를) 죽여 뜯어서 작품을 만들었다.,%k scheurde een opening uit %o,%k revet %o en ny kroppsåpning,%k rozerwał@[ao_pl] %o nowy otwór,%k abriu um novo orifício em %o,,%k i-a făcut jucătorului %o un nou orificiu,%k проделал новое отверстие в игроке %o,%k је исцепао %o нови отвор,%k slet upp en ny öppning i %o,"%o, %k tarafından yeni bir delik açıldı.",%k зроби@[adj_1_ua] в %o нову дірку, -%k slaughtered %o,TXT_OBITUARY17,,,,%o byl@[ao_cs] zavražděn@[ao_cs] hráčem %k,%k slagtede %o,%k hat %o geschlachtet,Ο/Η %k έσφαξε @[pro2_gr] %o,%k buĉis %o,%k ha sacrificado a %o,%k sacrificó a %o,%k teurasti %o paran,%k a meurtri %o,%k lemészárolta %o -t,%k ha macellato %o,%k は %o を屠殺した。,%o 은(는) %k 에 의해 도살당했다.,%k slachtte %o,%k slaktet %o,%k zarżn@[irreg_2_pl] %o,%k abateu %o,,%k l-a măcelărit pe %o,%k устроил резню игроку %o,%k је заклао %o,%k slaktade %o,"%o, %k tarafından katledildi.",%k прові@[adj_1_ua] різню %o, -%k smashed %o,TXT_OBITUARY18,,,,%o byl@[ao_cs] zmlácen@[ao_cs] hráčem %k,%k smadrede %o,%k hat %o zerklatscht,Ο/Η %k τσάκισε @[pro2_gr] %o,%k frakasis %o,%k ha destrozado a %o,%k destrozó a %o,%k murskasi %o paran,%k a enfoncé %o,%k földbe döngölte %o -t,%k ha distrutto %o,%k は %o をぶっ飛ばした。,%k 은(는) %o 을(를) 내팽개쳤다.,%k vermorzelde %o,%k knust %o,%k stłukł@[ao_pl] %o,%k esmagou %o,,%k l-a spart pe %o,%k размазал игрока %o,%k је поломио %o,%k krossade %o,"%o, %k tarafından ezildi.",%k розмаза@[adj_1_ua] %o, -%k sodomized %o,TXT_OBITUARY19,,,,Hráč %k se dopustil sodomie na hráči %o,%k sodomiserede %o,%k hat %o sodomisiert,Ο/Η %k γάμησε @[pro2_gr] %o,%k sodomizis %o,%k ha sodomizado a %o,%k sodomizó a %o,%k anaaliraiskasi %o paran,%k y a sodomisé n %o,%k szodomizálta %o -t,%k ha sodomizzato %o,%o は %k にカマを掘られた。 ,%o 은(는) %k 을(를) 위해 등을 보였다.,%k sodomiseerde %o,%k sodomisert %o,%k spenetrował@[ao_pl] %o,%k sodomizou %o,,%k l-a sodomizat pe %o,%k содомировал игрока %o,%k је изјебао %o,%k sodomiserade %o,"%o, %k tarafından sodomize edildi.",%k зґвалтува@[adj_1_ua] %o, -%k splattered %o,TXT_OBITUARY20,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] hráčem %k,%k sprøjtede %o,%k hat %o zerspritzt,Ο/Η %k έσκασε @[pro2_gr] %o,%k disĵetis %o,%k ha rociado a %o,%k roció a %o,%k roiski %o paran yltympäri,%k a explosé de %o,%k szétloccsantotta %o -t,%k ha spiaccicato %o,%k は %o にばら撒かれた。,%k 은(는) %o 을(를) 박살냈다.,%k splette %o,%k sprutet %o,%k rozbryzgał@[ao_pl] %o,%k explodiu %o,,%k l-a împrăștiat pe %o,%k разбрызгал игрока %o,%k је спљоштио %o,%k sprutade %o.,"%o, %k tarafından parçalandı.",%k розбризка@[adj_1_ua] %o, -%k squashed %o,TXT_OBITUARY21,,,,%o byl@[ao_cs] rozmáčknut@[ao_cs] hráčem %k,%k kværnede %o,%k hat %o zerquetscht,Ο/Η %k πάτησε @[pro2_gr] %o,%k premplatigis %o,%k ha aplastado a %o,%k aplastó a %o,%k litisti %o paran,%k a écrabouillé %o,%k eltaposta %o -t,%k ha schiacciato %o,%k は %o に潰された。,%k 은(는) %o 을(를) 짓이겼다.,%k plette %o,%k knust %o,%k zmiażdżył@[ao_pl] %o,%k espatifou %o,,%k l-a strivit pe %o,%k расплющил игрока %o,%k је згњечио %o,%k krossade %o,"%o, %k tarafından ezildi.",%k розчави@[adj_1_ua] %o, -%k throttled %o,TXT_OBITUARY22,,,,%o byl@[ao_cs] zaškrcen@[ao_cs] hráčem %k,%k kvæler %o,%k hat %o erdrosselt,Ο/Η %k κομμάτιασε @[pro2_gr] %o,%k strangolis %o,%k ha estrangulado a %o,%k ahorcó a %o,%k polki %o paran,%k a étouffé %o,%k megfolytotta %o -t,%k ha strozzato %o,%k は %o に絞られた。,%k 은(는) %o 을(를) 목 졸라 죽였다.,%k wurgde %o,%k kvalt %o,"%k udusił@[ao_pl] %o +",Tmavě šedá,Mørkegrå,Dunkelgrau,Σκοτεινό γρκί,Malhelgriza,Gris oscuro,,Tummanharmaa,Gris sombre,Tamnosiva,Sötétszürke,Grigio scuro,鉛,치색,Donkergrijs,Mørkegrå,Ciemnoszary,Cinza escuro,,Gri închis,Тёмно-серый,Тамно сива,Mörkgrått,Koyu gri,Темно-сірий, +Dark Green,TXT_COLOR_DARKGREEN,,,,Tmavě zelená,Mørkegrøn,Dunkelgrün,Σκοτεινό πράσινο,Malhelverda,Verde oscuro,,Tummanvihreä,Vert sombre,Tamnozelena,Sötétzöld,Verde scuro,深,흑녹색,Donkergroen,Mørkegrønn,Ciemnozielony,Verde escuro,,Verde închis,Тёмно-зелёный,Тамна зелена,Mörkgrön,Koyu Yeşil,Темно-зелений, +Brown,TXT_COLOR_BROWN,,,,Hnědá,Brun,Braun,Σκούρο,Bruna,Marrón,Marrón/Café,Ruskea,Brun,Smeđa,Barna,Marrone,茶,갈색,Bruin,Brun,Brązowy,Marrom,,Maro,Коричневый,Браон,Brun,Kahverengi,Коричневий, +Dark Blue,TXT_COLOR_DARKBLUE,,,,Tmavě modrá,Mørk blå,Dunkelblau,Σκοτεινό μπλέ,Malhelblua,Azul oscuro,,Tummansininen,Bleu sombre,Tamnoplava,Sötétkék,Blu scuro,紺,,Donkerblauw,Mørkeblå,Ciemnoniebieski,Azul escuro,,Albastru închis,Тёмно-синий,Тамна Плава,Mörkblå,Koyu Mavi,Темно-синій, +Light Red,TXT_COLOR_LIGHTRED,,,,Světle červená,Lysrød,Hellrot,Ανοιχτό κόκκινο,Helruĝa,Rojo claro,,Vaaleanpunainen,Rouge clair,Svijetlocrvena,Világospiros,Rosso chiaro,丹,옅은 적색,Licht Rood,Lys rød,Jasnoczerwony,Vermelho claro,,Roșu deschis,Светло-красный,Светло црвена,Ljusröd,Açık Kırmızı,Світло-червоний, +Yellow,TXT_COLOR_YELLOW,,,,Žlutá,Gul,Gelb,Κίτρινο,Flava,Amarillo,,Keltainen,Jaune,Žuta,Sárga,Giallo,黄,노란색,Geel,Gul,Żółty,Amarelo,,Galben,Жёлтый,Жута,Gul,Sarı,Жовтий, +Purple,TXT_COLOR_PURPLE,,,,Fialová,Lilla,Violett,Μόβ,Purpura,Morado,,Purppura,Violet,Ljubičasta,Lila,Viola,紫,보라색,Paars,Lilla,Fioletowy,Roxo,,Mov,Фиолетовый,Љубичаста,Lila,Mor,Фіолетовий, +Olive,TXT_COLOR_DULLGREEN,,,,Bledě zelená,Oliven,Blassgrün,,Olivkolora,Oliva,,Haaleanvihreä,Vert pâle,Maslinasta,Olíva,Verde pallido,苔,암녹색,Saaie groen,Oliven,Matowa Zieleń,Verde oliva,,Măsliniu,Мутно-зелёный,Тупа зелена,Oliv,Zeytin,Темний жовто-зелений, +Beige,TXT_COLOR_BEIGE,,,,Béžová,Beige,,Μπέζ,Flavgriza,Beis,Beige,Beesi,,Bež,Bézs,,淡,담갈색,Beige,Beige,Beżowy,Bege,,Bej,Бежевый,Беж,Beige,Bej,Бежевий, +Light Green,TXT_COLOR_LIGHTGREEN,,,,Světle zelená,Lysegrøn,Hellgrün,Ανοιχτό Πράσινο,Helverda,Verde claro,,Vaaleanvihreä,Vert clair,Svijetlozelena,Világoszöld,Verde chiaro,葵,옅은 녹색,Licht groen,Lysegrønn,Jasonzielony,Verde claro,,Verde Deschis,Светло-зелёный,Светло зелена,Ljusgrön,Açık Yeşil,Світло-зелений, +Light Blue,TXT_COLOR_LIGHTBLUE,,,,Světle modrá,Lys blå,Hellblau,Γαλάζιο,Helblua,Azul claro,,Vaaleansininen,Bleu clair,Svijetloplava,Világoskék,Blu chiaro,空,옅은 청색,Licht blauw,Lyseblå,Jasnoniebieski,Azul claro,,Albastru Deschis,Светло-синий,Светло плава,Ljusblå,Açık Mavi,Світло-синій, +Light Gray,TXT_COLOR_LIGHTGRAY,,,Light Grey,Světle šedá,Lysegrå,Hellgrau,Ανοιχτό Γκρι,Helgriza,Gris claro,,Vaaleanharmaa,Gris clair,Svijetlosiva,Világosszürke,Grigio chiaro,鉛,옅은 회색,Lichtgrijs,Lysegrå,Jasnoszary,Cinza claro,,Gri Deschis,Светло-серый,Светло сива,Ljusgrå,Açık Gri,Світло-сірий, +Light Brown,TXT_COLOR_LIGHTBROWN,,,,Světle hnědá,Lys brun,Hellbraun,Ανοιχτό Καφέ,Helbruna,Marrón claro,Marrón/Café claro,Vaaleanruskea,Brun clair,Svijetlosmeđa,Világosbarna,Marrone chiaro,褐,옅은 고동색,Lichtbruin,Lysebrun,Jasnobrązowy,Marrom claro,,Maro Deschis,Светло-коричневый,Светло браон,Ljusbrun,Açık Kahverengi,Світло-коричневий, +Gold,TXT_COLOR_GOLD,,,,Zlatá,Guld,,Χρυσό,Orkolora,Dorado,,Kulta,Or,Zlatna,Arany,Oro,金,금색,Goud,Gull,Złoty,Dourado,,Auriu,Золотой,Златна,Guld,Altın,Золотий, +Bright Green,TXT_COLOR_BRIGHTGREEN,,,,Jasně zelená,Lysegrøn,Hellgrün,Φωτινό Πράσινο,Brilverda,Verde claro,,Vaaleanvihreä,Vert clair,Svijetlozelena,Fényeszöld,Verde chiaro,鮮,밝은 녹색,Helder groen,Lysegrønn,Jasnozielony,Verde claro,,Verde Deschis,Ярко-зелёный,Светла зелена,Ljusgrön,Parlak Yeşil,Яскраво-зелений, +Rust,TXT_COLOR_RUST,,,,Rezavá,,Rostbraun,Σκουριά,Rustokolora,Óxido,,Ruoste,Rouille,Hrđava,Rozsda,Arrugginito,錆,주황 적갈색,Roest,,Rdzawy,Ferrugem,,Ruginiu,Ржавый,Рђа,Rost,Pas,Іржавий, +Name,PLYRMNU_NAME,,,,Jméno,Navn,,Όνομα,Nomo,Nombre,,Nimi,Nom,Ime,Név,Nome,名前,이름,Naam,Navn,Imię,Nome,,Nume,Имя,Надимак,Namn,İsim,Ім'я, +Team,PLYRMNU_TEAM,,,,Tým,,,Ομάδα,Teamo,Equipo,,Joukkue,Equipe,Tim,Csapat,Squadra,チーム,팀,,Lag,Drużyna,Equipe,Equipa,Echipă,Команда,Тим,Lag,Takım,Команда, +Color,PLYRMNU_PLAYERCOLOR,,,Colour,Barva,Farve,Farbe,Χρώμα,Koloro,,,Väri,Couleur,Boja,Szín,Colore,色,색상,Kleur,Farge,Kolor,Cor,,Culoare,Цвет,Боја,Färg,Renk,Колір, +Gender,PLYRMNU_PLAYERGENDER,,,,Pohlaví,Køn,Geschlecht,Φύλο,Genro,Sexo,,Sukupuoli,Genre,Spol,Nem,Sesso,性別,성별,Geslacht,Kjønn,Płeć,Gênero,,Sex,Пол,Пол,Kön,Cinsiyet,Стать, +Male,OPTVAL_MALE,,,,Muž,Mand,Männlich,Αρσενικό,Vira,Masculino,,Miespuolinen,Masculin,Muški,Férfi,Maschio,男,남성,Man,Mannlig,Mężczyzna,Masculino,,Masculin,Мужской,Мушко,Man,Erkek,Чоловіча, +Female,OPTVAL_FEMALE,,,,Žena,Kvinde,Weiblich,Θηλυκό,Ina,Femenino,,Naispuolinen,Féminin,Ženski,Nő,Femmina,女,여성,Vrouw,Kvinne,Kobieta,Feminino,,Feminin,Женский,Женско,Kvinna,Kadın,Жіноча, +Neutral,OPTVAL_NEUTRAL,,,,Neutrální,,,Ουδέτερο,Neŭtra (Ri),Neutro,,Sukupuoleton,Neutre,Neutralni,Semleges,Neutrale,中間,중성,Neutraal,Nøytral,Neutralne,Neutro,,Neutru,Нейтральный,Неутрално,Neutral,Nötr,Нейтральна, +Object,OPTVAL_OTHER,,,,Objekt,Objekt,Objekt,Αντικείμενο,Objekto (Ĝi),Objeto,,Olio,Objet,Predmet,Tárgy,Oggetto,物体,기타,Doel,Gjenstand,Obiekt,Objeto,,Obiect,Предмет,Предмет,Objekt,Nesne,Предмет, +Gameplay Options,GMPLYMNU_TITLE,,,,Nastavení herních mechanik,Gameplay-muligheder,Gameplay-Optionen,,Agordo de ludado,Opciones de jugabilidad,,Pelattavuusasetukset,Options Gameplay,Postavke igranja,Játékmenet beállításai,Opzioni gameplay,ゲームプレイ オプション,게임플레이 설정,Gameplay-opties,Spillalternativer,Opcje Rozgrywki,Opções de jogabilidade,,Setări de Joc,Настройки игры,Подешавања гејмплеја,Spelalternativ,Oynanış Seçenekleri,Налаштування гри, +Always,OPTVAL_ALWAYS,,,,Vždy,Altid,Immer,Πάντα,Ĉiam,Siempre,,Aina,Toujours,Uvijek,Mindig,Sempre,常に,언제나,Altijd,Alltid,Zawsze,Sempre,,Mereu,Всегда,Увек,Alltid,Her zaman,Завжди, +Never,OPTVAL_NEVER,,,,Nikdy,Aldrig,Nie,Ποτέ,Neniam,Nunca,,Ei koskaan,Jamais,Nikad,Soha,Mai,しない,없음,Nooit,Aldri,Nigdy,Nunca,,Niciodată,Никогда,Никад,Aldrig,Asla,Ніколи, +Autoaim,PLYRMNU_AUTOAIM,,,,Automatické míření,,Automatisch zielen,,Celasisto,Autoapuntar,,Automaattitähtäys,Auto-visée,Autociljanje,Automatikus célzás,Mira automatica,自動照準,자동 조준,,,Auto-celowanie,Mira automática,,Autoțintire,Автоприцеливание,Аутоматско циљање,automatiskt sikte,,Автонаведення, +Always Run,PLYRMNU_ALWAYSRUN,,,,Vždy běžet,Altid løbe,Immer Rennen,Πάντα τρέχα,Ĉiam kuri,Siempre correr,,Jatkuva juoksu,Toujours courir,Uvijek trčiš,Mindig fusson,Corri sempre,常に駆け足,달리기 토글,Altijd lopen,Kjør alltid,Zawsze Biegaj,Sempre correr,Correr Sempre,Fugă în permanență,Постоянный бег,Увек трчи,Alltid springa,Daima Koş,Постійний біг, +,,Display,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Screen size,DSPLYMNU_SCREENSIZE,,,,Velikost obrazovky,Skærmstørrelse,Bildschirmgröße,Μέγεθος οθόνης,Ekrangrando,Tamaño de pantalla,,Näytön koko,Taille de l'écran,Veličina zaslona,Képernyő mérete,Dimensione della schermata,画面サイズ,화면 크기,Schermgrootte,Skjermstørrelse,Rozmiar Ekranu,Tamanho da tela,Tamanho do ecrã,Mărime ecran,Размер экрана,Величина екрана,Skärmstorlek,Ekran boyutu,Розмір екрану, +Vertical Sync,DSPLYMNU_VSYNC,,,,Vertikální synchronizace,Lodret synkronisering,Vertikale Synchronisation,,Vertikala sinkronigo,Sincronización vertical,,Pystytahdistys,Synchronisation Verticale,Vertikalna sinkronizacija,Függőleges szinkronizálás,Sincronia verticale,垂直同期,수직 동기화,Verticale Sync,Vertikal synkronisering,Synchronizacja Pionowa,Sincronização vertical,,Sincronizare Verticală,Вертикальная синхронизация,Вертикална синхорнизација,Vertikal synkronisering,Dikey Senkronizasyon,Вертикальна синхронізація, +Models,DSPLYMNU_MODELS,,,,Modely,Modeller,Modelle,Μοντέλα,Modeloj,Modelos,,Mallit,Modèles,Modeli,3D modellek,Modelli,モデル,모델,Modellen,Modeller,Modele,Modelos,,Modele,Модели,Модели,Modeller,Modeller,3D Моделі, +Scale crosshair,DSPLYMNU_CROSSHAIRSCALE,,,,Velikost zaměřovače,Skalerer trådkorset,Fadenkreuz skalieren,,Skali celilon,Escalar retícula,,Skaalaa tähtäintä,Mise à l'échelle du viseur,Skaliraj ciljnik,Célkereszt méret,Scala del mirino,照準スケール,조준점 크기,Dradenkruis schalen,Skala trådkors,Skala celownika,Escala da mira,,Scară țintă,Размер прицела,Размера нишана,Skala hårkorset,Ölçekli artı işareti,Розмір прицілу, +Brightness,DSPLYMNU_BRIGHTNESS,,,,Jas,Lysstyrke,Helligkeit,Φωτηνότητα,Heleco,Brillo,,Kirkkaus,Luminosité,Svjetlina,Fényerő,Luminosità,明るさ,밝기,Helderheid,Lysstyrke,Jasność,Brilho,,Luminozitate,Яркость,Осветљење,Ljusstyrka,Parlaklık,Яскравість, +Gamma correction,DSPLYMNU_GAMMA,,,,Korekce gama,Gammakorrektion,Gammakorrektur,,Gamaa korekto,Corrección gamma,,Gammakorjaus,Correction Gamma,Korekcija game,Gamma korrekció,Correzione gamma,ガンマ値,감마 조정,Gamma correctie,Gammakorreksjon,Korekta gammy,Correção de gama,,Gamma,Гамма-коррекция,Корекција светлости,Gammakorrigering,Gama düzeltme,Гамма-корекція, +Contrast,DSPLYMNU_CONTRAST,,,,Kontrast,Kontrast,Kontrast,,Kontrasto,Contraste,,Sävykkyys,Contraste,Kontrast,Kontraszt,Contrasto,コントラスト,대비,,Kontrast,Kontrast,Contraste,,,Контраст,Контраст,Kontrast,Kontrast,Контраст, +Saturation,DSPLYMNU_SATURATION,,,,Sytost,Mætning,Sättigung,,Kolorintenseco,Saturación,,Värikylläisyys,,Saturacija,Telítettség,Saturazione,サチュレーション,채도,Verzadiging,Metning,Nasycenie,Saturação,,Saturație,Насыщенность,Сатурација,Mättnad,Doygunluk,Насиченість, +Status Bar Scale,DSPLYMNU_SBSCALE,,,,Velikost stavového panelu,Skala for statuslinje,Statusleistengröße,,Skalo de statobreto,Escala de barra de estado,,Tilapalkin skaalaus,Mise à l'échelle HUD,Skaliraj statusnu traku,Állapotjelző mérete,Dimensioni Status Bar,ステータススケール,,Statusbalkschaal,Statuslinjeskala,Skala paska statusu,Escala da barra de estado,,Scară bară de stare,Размер строки состояния,,Skala för statusfältet,Durum Çubuğu Ölçeği,Розмір строки стану, +Messages,DSPLYMNU_MESSAGES,,,,Oznámení,Meddelelser,Nachrichten,Μηνύματα,Mesaĝoj,Mensajes,,Viestit,,Poruke,Üzenetek,Messaggi,メッセージ類,메시지,Berichten,Meldinger,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке,Meddelanden,Mesajlar,Повідомлення, +Center messages,MSGMNU_CENTERMESSAGES,,,Centre messages,Oznámení na střed,Centrerede meddelelser,Nachrichten zentrieren,,Centrigi mesaĝojn,Centrar mensajes,,Keskitä viestit,Messages centrés,Centriraj poruke,Üzenetek középre helyezése,Messaggi centrati,メッセージを中央に,메시지 중간에 위치,Berichten centreren,Sentrumsmeldinger,Wyśrodkuj wiadomości,Centralizar mensagens,Centrar mensagens,Mesaje centrate,Центрирование сообщений,Централне поруке,Centrerade meddelanden,Merkez mesajları,Центрування повідомлень, +Pulsating message Display,MSGMNU_PULSEMESSAGES,,,,Pulzující oznámení,Pulserende meddelelser Visning,Pulsierende Nachrichtenanzeige,,Montri mesaĝojn pulsante,Mostrar mensajes pulsantes,,Sykkivät viestit,Messages pulsés,Prikaz pulsirajućih poruka,Pulzáló üzenet,Mostra messaggi pulsanti,取得時等の文を明滅,,Pulserende berichtendisplay,Pulserende melding Display,Pulsujące wyświetlanie wiadomości,Exibir mensagem pulsante,,Afișare Mesaje Pulsante,Пульсация сообщений,,Pulserande meddelande Visning,Titreşimli mesaj Ekranı,Пульсація повідомлень, +Message Scale,MSGMNU_MESSAGESCALE,,,,Velikost oznámení,Skala for meddelelser,Nachrichtengröße,Μέγεθος μηνύματον,Skalo de mesaĝoj,Escala de mensajes,,Viestien skaalaus,Mise à l'échelle Messages,Skaliraj poruka,Üzenet mérete,Dimensioni Messaggi,メッセージスケール,,Berichtschaal,Meldingsskala,Skalowanie Wiadomości,Escala de mensagem,,Scară Mesaje,Размер сообщений,,Meddelandeskala,Mesaj Ölçeği,Розмір повідомлень, +,,Automap,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Select Color,MNU_COLORPICKER,,,Select Colour,Výběr barvy,Vælg farve,Farbe auswählen,Επιλογή Χρώματος,Elektu koloron,Elige un color,,Valitse väri,Choisir Couleur,Odaberi boju,Szín választása,Scegli il colore,色選択,색상을 고르시오,Selecteer Kleur,Velg farge,Wybierz Kolor,Selecione uma cor,,Alege o Culoare,Выбор цвета,Изабери боју,Välj färg,Renk Seçiniz,Вибір кольору, +Rotate automap,AUTOMAPMNU_ROTATE,,,,Otáčet automapu,Rotere automap,Rotiere Automap,,Rotacii aŭtomatan mapon,Rotar automapa,,Kiertyvä automaattikartta,Rotation de la Carte,Rotiraj autokartu,Térkép forgatása,Ruota l'automappa,オートマップの回転表示,오토맵 회전,Automatisch roteren,Roter automatisk kart,Obracaj mapę,Girar automapa,,Rotire hartă computerizată,Вращающаяся автокарта,Ротирај аутомапу,Rotera automap,Otomatik haritayı döndür,Обертання автокарти, +Follow player,AUTOMAPMNU_FOLLOW,,,,Následovat hráče,Følg spilleren,Folge dem Spieler,Ακουλούθα το παίχτη,Sekvi ludanton,Seguir jugador,,Seuraa pelaajaa,Suivre le joueur,Slijedi igrača,Kövesse a játékost,Segui il giocatore,プレイヤー追従,플레이어 추적,Volg de speler,Følg spiller,Podążaj za graczem,Seguir jogador,,Urmărire jucător,Привязка к игроку,Прати играча,Följ spelaren,Oyuncuyu takip et,Прив'язка до гравця, +Line alpha,AUTOMAPMNU_LINEALPHA,,,,Průhlednost čar,Linje alfa,Alpha für Linien,,Opako de linio,Transparencia de línea,,Viivan alpha,Translucidité des lignes,Linija alfa,Vonal áttetszóség,Traslucenza delle linee,線の半透明度,선 반투명도,Doorschijnendheid van lijnen,Linje alfa,Przezroczystość Linii,Transparência da linha,,Transparență linii,Прозрачность линий,Транслуценција линија,Linje alfa,Çizgi alfa,Прозорість ліній, +Line thickness,AUTOMAPMNU_LINETHICKNESS,,,,Tloušťka čar,Linjetykkelse,Dicke der Linien,,Diko de linio,Grosor de línea,,Viivan paksuus,Épaisseur des lignes,Debljina linije,Vonal vastagság,Spessore delle linee,線の太さ,선 두께,Dikte van lijnen,Linjetykkelse,Grubość Linii,Espessura da linha,,Grosime linii,Толщина линий,Дебљина линија,Linjens tjocklek,Çizgi kalınlığı,Товщина ліній, +Customize Map Colors,MAPCOLORMNU_TITLE,,,Customize Map Colours,Nastavení barev mapy,Tilpas kortfarver,Automapfarben einstellen,,Adapti kolorojn de mapo,Personalizar colores (mapa),,Värien mukautus,Couleurs Carte Personnalisées,Prilagodi boje mape,Térkép színeinek testreszabása,Personalizza i colori della mappa,カスタム色を決める,미니맵 색상 설정,Kaartkleuren aanpassen,Tilpass kartfarger,Ustaw kolory mapy,Personalizar cores do mapa,,Personalizare culori hartă,Настройки цветов автокарты,Промени боју мапе,Anpassa kartans färger,Harita Renklerini Özelleştirin,Налаштування кольорів автокарти, +Restore default custom colors,MAPCOLORMNU_DEFAULTMAPCOLORS,,,Restore default custom colours,Obnovit původní vlastní barvy,Gendan standard brugerdefinerede farver,Standardfarben wiederherstellen,,Restaŭri defaŭltajn adaptitajn kolorojn,Restaurar colores personalizados,,Palauta oletusvärit,Couleurs par défaut,Vrati prilagođene boje na zadane,Eredeti színek visszaállítása,Reimposta i colori personalizzati al default,カスタム色を初期化,기본 색상으로 복구,Standaard aangepaste kleuren herstellen,Gjenopprett egendefinerte standardfarger,Przywróć domyślne kolory,Restaurar cores personalizadas padrão,,Revenire la culorile implicite,Вернуть стандартные цвета,Врати уобичајене разне боје,Återställ anpassade standardfärger,Varsayılan özel renkleri geri yükleme,Повернути стандартні кольори, +,,Sound,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Sound enabled,SNDMNU_SNDENABLED,,,,Zvuk zapnut,Lyd aktiveret,Sound aktiv,Ήχος ενεργοποιημένος,Sono ebligita,Sonido activado,,Ääni päällä,Son activé,Zvuk omogućen,Hang engedélyezve,Abilita gli effetti sonori,サウンド有効,,Geluid actief,Lyd aktivert,Dźwięk włączony,Som ativado,,Sunet activat,Звук включён,,Ljud aktiverat,Ses etkin,Звук увімкнено, +Music enabled,SNDMNU_MUSENABLED,,,,Hudba zapnuta,Musik aktiveret,Musik aktiv,Μουσική ενεργοποιημένη,Muziko ebligita,Música activada,,Musiikki päällä,Musique activée,Glazba omogućena,Zene engedélyezve,Abilita la musica,音楽有効,,Muziek actief ,Musikk aktivert,Muzyka włączona,Música ativada,,Muzică activată,Музыка включена,,Musik aktiverad,Müzik etkin,Музику увімкнено, +4000 Hz,OPTVAL_4000HZ,,,,,,,,,,,,,,,,,,,,,,,,4000 Гц,,,,4000 Гц, +8000 Hz,OPTVAL_8000HZ,,,,,,,,,,,,,,,,,,,,,,,,8000 Гц,,,,8000 Гц, +11025 Hz,OPTVAL_11025HZ,,,,,,,,,,,,,,,,,,,,,,,,11025 Гц,,,,11025 Гц, +22050 Hz,OPTVAL_22050HZ,,,,,,,,,,,,,,,,,,,,,,,,22050 Гц,,,,22050 Гц, +32000 Hz,OPTVAL_32000HZ,,,,,,,,,,,,,,,,,,,,,,,,32000 Гц,,,,32000 Гц, +44100 Hz,OPTVAL_44100HZ,,,,,,,,,,,,,,,,,,,,,,,,44100 Гц,,,,44100 Гц, +48000 Hz,OPTVAL_48000HZ,,,,,,,,,,,,,,,,,,,,,,,,48000 Гц,,,,48000 Гц, +64 samples,OPTVAL_64SAMPLES,,,,64 vzorků,,,64 δείγματα,64 specimenoj,64 muestras,,64 näytettä,,64 uzorka,,,,64 샘플,,64 samplinger,64 sample,64 amostras,,64 monstre,64 семпла,64 узорка,64 samplingar,64 örnek,64 семпла, +128 samples,OPTVAL_128SAMPLES,,,,128 vzorků,,,128 δείγματα,128 specimenoj,128 muestras,,128 näytettä,,128 uzoraka,,,,128 샘플,,128 samplinger,128 sampli,128 amostras,,128 monstre,128 семплов,128 узорка,128 samplingar,128 örnek,128 семплів, +256 samples,OPTVAL_256SAMPLES,,,,256 vzorků,,,256 δείγματα,256 specimenoj,256 muestras,,256 näytettä,,256 uzoraka,,,,256 샘플,,256 samplinger,256 sampli,256 amostras,,256 monstre,256 семплов,256 узорка,256 samplingar,256 örnek,256 семплів, +512 samples,OPTVAL_512SAMPLES,,,,512 vzorků,,,512 δείγματα,512 specimenoj,512 muestras,,512 näytettä,,512 uzoraka,,,,512 샘플,,512 samplinger,512 sampli,512 amostras,,512 monstre,512 семплов,512 узорка,512 samplingar,512 örnek,512 семплів, +1024 samples,OPTVAL_1024SAMPLES,,,,1024 vzorků,,,1024 δείγματα,1024 specimenoj,1024 muestras,,1024 näytettä,,1024 uzorka,,,,1024 샘플,,1024 samplinger,1024 sampli,1.024 amostras,,1024 monstre,1024 семпла,1024 узорка,1024 samplingar,1024 örnek,1024 семплів, +2048 samples,OPTVAL_2048SAMPLES,,,,2048 vzorků,,,2048 δείγματα,2048 specimenoj,2048 muestras,,2048 näytettä,,2048 uzoraka,,,,2048 샘플,,2048 samplinger,2048 sampli,2.048 amostras,,2048 monstre,2048 семплов,2048 узорка,2048 samplingar,2048 örnek,2048 семплів, +4096 samples,OPTVAL_4096SAMPLES,,,,4096 vzorků,,,4096 δείγματα,4096 specimenoj,4096 muestras,,4096 näytettä,,4096 uzoraka,,,,4096 샘플,,4096 samplinger,4096 sampli,4.096 amostras,,4096 monstre,4096 семплов,4096 узорка,4096 samplingar,4096 örnek,4096 семплів, +Auto,OPTSTR_AUTO,,,,,Automatisk,,,Aŭtomata,Automático,,Automaattinen,,Automatski,Automatikus,Automatico,自動,오토,,,Automatycznie,Automático,,,Авто,Аутоматски,Automatisk,Otomatik,Авто, +Mono,OPTSTR_MONO,,,,,,,,"Unukanala (""Mono"")",,,,,Mono,Monó,,モノラル,모노,,,,,,,Моно,Монотоно,,,Моно, +Stereo,OPTSTR_STEREO,,,,,,,,Stereofonia,Estéreo,,,Stéréo,Stereo,Sztereó,,ステレオ,스테레오,,,,Estéreo,,,Стерео,Стереотоно,,,Стерео, +Dolby Pro Logic Decoder,OPTSTR_PROLOGIC,,,,,Dolby Pro Logic-dekoder,,,Malkodilo de Dolby Pro Logic ,,,,,Dolby Pro Logic dekoder,,,ドルビー プロロジック デコーダー,돌비 프로 로직 디코더,,Dolby Pro Logic Dekoder,,Decodificador Dolby Pro Logic,,Decodor Pro Logic Dolby,Декодер Dolby Pro Logic,,Dolby Pro Logic-dekoder,Dolby Pro Logic Dekoder,Декодер Dolby Pro Logic, +Quad,OPTSTR_QUAD,,,,,,,,"Kvarkanala (""Quad"")",Cuádruple,,Dolby Pro Logic -dekooderi,,4 zvučnika,,,クァッド,쿼드,,,Cztery kanały,Quadrifônico,,,Четырёхканальный,Четвородупло,,Dörtlü,Чотирьохканальний, +5 speakers,OPTSTR_SURROUND,,,,5 reproduktorů,5 højttalere,5 Lautsprecher,,5 laŭtparoliloj,5 altavoces,,5 kaiutinta,5 enceintes,5 zvučnika,5 hangfal,Surround,5 スピーカー,5 스피커,5 luidsprekers,5 høyttalere,Głośniki 5,5 alto-falantes,,5 boxe,5 динамиков,5 спикер,5 högtalare,5 hoparlörler,5 динаміків, +5.1 speakers,OPTSTR_5POINT1,,,,Reproduktory 5.1,5.1-højttalere,5.1 Lautsprecher,,Laŭtparolilaro 5.1,Altavoces 5.1,,5.1 kaiutinta,Enceintes 5.1,Zvučnici 5.1,5.1 hangrendszer,Surround 5.1,5.1 スピーカー,5.1 스피커,5.1 luidsprekers,5.1 høyttalere,Głośniki 5.1,Auto-falantes 5.1,,Boxe 5.1,Динамики 5.1,5.1 спикер,5.1-högtalare,5.1 hoparlörler,Динаміки 5.1, +7.1 speakers,OPTSTR_7POINT1,,,,Reproduktory 7.1,7.1-højttalere,7.1 Lautsprecher,,Laŭtparolilaro 7.1,Altavoces 7.1,,7.1 kaiutinta,Enceintes 7.1,Zvučnici 7.1,7.1 hangrendszer,Surround 7.1,7.1 スピーカー,7.1스피커,7.1 luidsprekers,7.1-høyttalere,Głośniki 7.1,Auto-falantes 7.1,,Boxe 7.1,Динамики 7.1,7.1 спикер,7.1-högtalare,7.1 hoparlörler,Динаміки 7.1, +Playback device,OPENALMNU_PLAYBACKDEVICE,,,,Přehravací zařízení,Afspilningsenhed,Wiedergabegerät,,Aparato por ludadi,Dispositivo de reproducción,,Äänitoistolaite,Sortie sonore,Uređaj za reprodukciju,Visszajátszó eszköz,Dispositivo di playback,プレイバック デバイス,재생 장치,Afspeelapparaat,Avspillingsenhet,Urządzenie odtwarzania,Dispositivo de reprodução,,Dispozitiv de redare,Устройство воспроизведения,Аудио уређај,Uppspelningsenhet,Oynatma cihazı,Пристрій відтворення, +Enable EFX,OPENALMNU_ENABLEEFX,,,,Povolit EFX,Aktiver EFX,EFX aktiv,,Ebligi EFX,Permitir EFX,,Ota käyttöön EFX,Activer EFX,Omogući efekte,EFX engedélyezése,Attiva EFX,EFXを有効化,EFX 켬,EFX inschakelen,Aktiver EFX,Pozwól na EFX,Ativar EFX,,Activare EFX,Включить EFX,Укључи EFX,Aktivera EFX,EFX'i Etkinleştir,Увімкнути EFX, +Resampler,OPENALMNU_RESAMPLER,,,,,Resampler,,,Respecimenilo,,,Näytteenottotaajuusmuunnin,,Uzorkovanje,,,リサンプラー,재배열 기기,,,,Reamostrador,,,Передискретизатор,Ресемплер,,Yeniden Örnekleyici,Ресемплер, +Sounds volume,SNDMNU_SFXVOLUME,,,,Hlasitost zvuků,Lydstyrke,Effektlautstärke,Φονή ήχων,Laŭteco de sono,Volumen de sonido,,Äänitehosteiden voimakkuus,Volume des Sons,Glasnoća zvuka,Effektek hangereje,Volume suoni,効果音音量,효과음 음량,Geluidsvolume,Lydvolum,Głośność Dźwięku,Volume de sons,,Volum efecte,Громкость звука,Јачина звука,Ljudvolym,Ses seviyesi,Гучність звуків, +Menu volume,SNDMNU_MENUVOLUME,,,,Hlasitost nabídek,Menu-volumen,Menülautstärke,Φονή μενού,Laŭteco de menuo,Volumen del menú,,Valikon äänenvoimakkuus,Volume du Menu,Glasnoća izbornika,Menü hangereje,Volume menù,メニュー音量,메뉴 음량,Menu volume,Menyvolum,Głośność Menu,Volume do menu,,Volum meniu,Громкость меню,Јачина менија,Volym för menyer,Menü ses seviyesi,Гучність меню, +Music volume,SNDMNU_MUSICVOLUME,,,,Hlasitost hudby,Lydstyrke for musik,Musiklautstärke,Φονή μουσικής,Laŭteco de muziko,Volumen de la música,,Musiikin äänenvoimakkuus,Volume Musique,Glasnoća glazbe,Zene hangereje,Volume musica,音楽音量,배경음 음량,Muziekvolume,Musikkvolum,Głośność Muzyki,Volume da música,,Volum muzică,Громкость музыки,Јачина музике,Musikvolym,Müzik sesi,Гучність музики, +MIDI device,SNDMNU_MIDIDEVICE,,,,MIDI zařízení,MIDI-enhed,MIDI-Gerät,MIDI συσκεύη,MIDIa aparato,Dispositivo MIDI,,MIDI-laite,Sortie MIDI,MIDI uređaj,MIDI eszköz,Dispositivo MIDI,MIDIデバイス,MIDI 장치,MIDI-apparaat,MIDI-enhet,Urządzenie MIDI,Dispositivo MIDI,,Dispozitiv MIDI,MIDI-проигрыватель,MIDI уређај,MIDI-enhet,MIDI cihazı,MIDI програвач, +Sound in Background,SNDMNU_BACKGROUND,,,,Zvuk na pozadí,Lyd i baggrunden,Sound im Hintergrund,Ήχος στο παρασκήνιο,Fona sono,Sonido en segundo plano,,Ääni taustalla,Son activé en arrière plan,Zvuk u pozadini,Háttérhangok,Suono di sottofondo,バックグラウンドでのサウンド,배경화면에서도 소리 재생,Geluid in de achtergrond,Lyd i bakgrunnen,Dźwięk w Tle,Som em segundo plano,,Sunet pe fundal,Звук в фоне,Звуци у позадини,Ljud i bakgrunden,Arka Planda Ses,Звуки на фоні, +Underwater reverb,SNDMNU_UNDERWATERREVERB,,,,Ozvěna pod vodou,Undervandsreverb,Unterwasserhall,,Subakva resono,Reverberación bajo el agua,,Vedenalaiskaiku,Reverbération sous l'eau,Podvodno odjekivanje,Vízalatti visszaverődés,Reverb sott'acqua,水中反響音,수중 울림효과,Onderwater nagalm,Undervanns romklang,Pogłos pod wodą,Reverberação debaixo d'água,Reverberação debaixo de água,Reverb subacvatic,Эффект затухания под водой,Подводни одјек,Undervattensreverb,Su altı yankısı,Підводний ефект, +Randomize pitches,SNDMNU_RANDOMIZEPITCHES,,,,Náhodné výšky tónu,Randomisere tonehøjder,Zufällige Tonhöhe,,Hazardigi tonaltojn,Tonos aleatorios,,Satunnaista äänenkorkeuksia,Tons sonores aléatoires,Nasumična visina tonova,Hangmagasság keverése,Rendi casuale il tono,ランダマイズ ピッチ,음높이 무작위화,Willekeurige plaatsen,Tilfeldig tonehøyde,Losuj tonacje,Tons aleatórios,Tons aleatórios,Ton sunete aleatoriu,Случайная высота,Рандомизација тонова,Slumpmässiga tonhöjder,Sahaları rastgele ayarlayın,Змінювати висоту звуків, +Sound channels,SNDMNU_CHANNELS,,,,Počet zvukových kanálů,Lydkanaler,Soundkanäle,Κανάλια ήχου,Sonkanaloj,Canales de sonido,,Äänikanavat,Canaux sonores,Zvučni kanali,Hangcsatorna,Numero canali del suono,サウンド チャンネル,음향 채널,Geluidskanalen,Lydkanaler,Kanały dźwiękowe,Canais de som,,Canale de sunet,Количество каналов,Звучни канали,Ljudkanaler,Ses kanalları,Кількість каналів, +Sound backend,SNDMNU_BACKEND,,,,Zvukový systém,Lyd backend,Soundsystem,,Sonservilo,Sistema de sonido,,Äänijärjestelmä,Traitement Son,Zvučna pozadina,Hang backend,Backend suono,サウンド バックエンド,음향 말미,Geluidsarme achterkant,Lyd backend,System dźwiękowy,Sistema de som,,Sistem de sunet,Звуковая подсистема,Звучни бекенд,Ljudbakgrund,Ses arka ucu,Звукова система, +OpenAL options,SNDMNU_OPENAL,,,,Nastavení OpenAL,OpenAL-muligheder,OpenAL Optionen,OpenAL ρυθμίσεις,Agordo de OpenAL,Opciones de OpenAL,,OpenAL-asetukset,Options OpenAL,Postavke OpenAL-a,OpenAL beállításai,Opzioni OpenAL,OpenAL オプション,오픈에이엘 설정,OpenAL opties,OpenAL-alternativer,Opcje OpenAL,Opções de OpenAL,,Setări OpenAL,Настройки OpenAL,OpenAL подешавања,OpenAL-alternativ,OpenAL seçenekleri,Параметри OpenAL, +Restart sound,SNDMNU_RESTART,,,,Restartovat zvuk,Genstart af lyd,Sound neu starten,,Rekomenci sonon,Reiniciar sonido,,Käynnistä ääni uudelleen,Redémarrer moteur sonore,Restartaj zvuk,Hang újraindítása,Resetta il suono,サウンド再起動,음향 재시작,Herstart geluid,Start lyd på nytt,Zresetuj dźwięk,Reiniciar som,,Reinițializare sunet,Перезапустить звук,Поново покрени звук,Starta om ljudet,Sesi yeniden başlat,Перезавантажити звук, +Advanced options,SNDMNU_ADVANCED,,,,Pokročilá nastavení,Avancerede indstillinger,Erweiterte Optionen,Προχήρημενες ρυθμίσεις,Altnivelaj agordoj,Opciones avanzadas,,Edistyneet asetukset,Options avancées,Napredne postavke,Haladó beállítások,Opzioni avanzate,高度なオプション,고급 설정,Geavanceerde opties,Avanserte alternativer,Zaawansowane Opcje,Opções avançadas,,Setări avansate,Расширенные настройки,Напредна подешавања,Avancerade alternativ,Gelişmiş seçenekler,Розширені налаштування, +Module replayer options,SNDMNU_MODREPLAYER,,,,Nastavení přehrávače modulů,Indstillinger for modulafspiller,Modul-Spieler-Optionen,,Agordo por legilo de moduloj,Opciones reproductor de módulos,,Moduulisoitinasetukset,Options lecteur de module,Postavke repriziranja modula,Modul lejátszó beállításai,Opzioni Module replayer,モジュールリプレイヤー オプション,모듈 재생 설정,Module replayer opties,Alternativer for modulavspiller,Opcje Modułu Odtwarzacza,Opções de reprodutor de módulos,,Setări de redare a modulelor,Параметры воспроизведения модулей,Подешавања модулног риплејера,Alternativ för modulåterspelare,Modül yeniden oynatıcı seçenekleri,"Параметри ""Module replayer""", +Midi player options,SNDMNU_MIDIPLAYER,,,,Nastavení MIDI přehrávače,Indstillinger for Midi-afspiller,MIDI-Spieler-Optionen,,Agordoj por legilo de MIDI,Opciones de reproductor MIDI,,MIDI-soitinasetukset,Option lecteur MIDI,Postavke Midi reproduktora,Midi lejátszó beállításai,Opzioni Midi player,Midi再生のオプション,MIDI 플레이어 설정,Midi speler opties,Alternativer for midispiller,Opcje Odtwarzacza Midi,Opções de reprodutor MIDI,,Setări player MIDI,Настройки MIDI-проигрывателя,MIDI плејер подешавања,Alternativ för Midi-spelare,Midi oynatıcı seçenekleri,Параметри MIDI-програвача, +Sound in Menus,SNDMNU_MENUSOUND,,,,Zvuk v menu,Lyd i menuer,Sound in Menüs,,Sono en menuoj,,,Ääni valikoissa,Son dans les menus,Zvukovi u izborniku,Hang a menükben,Suono nei menù,メニューでのサウンド,,Geluid in menu's,Lyd i menyer,Dźwięk w Menu,Som em menus,,Sunet in meniuri,Звук в меню,,Ljud i menyer,Menülerde Ses,Звук в меню, +Advanced Sound Options,ADVSNDMNU_TITLE,,,,Pokročilá nastavení zvuku,Avancerede lydindstillinger,Erweiterte Soundoptionen,,Altnivelaj agordoj de sono,Opciones avanzadas de sonido,,Edistyneet ääniasetukset,Options Sonores Avancées,Napredne postavke zvuka,Haladó hangbeállítások,Opzioni avanzate dei suoni,高度なサウンドオプション,고급 음향 설정,Geavanceerde geluidsopties,Avanserte lydalternativer,Zaawansowane Opcje Dźwięku,Opções de áudio avançadas,,Setări de sunet avansate,Расширенные настройки,Напредна подешавања звука,Avancerade ljudalternativ,Gelişmiş Ses Seçenekleri,Розширені налаштування звуку, +Sample rate,ADVSNDMNU_SAMPLERATE,,,,Vzorkovací frekvence,Samplerate,Samplerate,,Specimenrapido,Frecuencia de muestreo,,Näytteenottotaajuus,Cadence de Sampling,Stopa uzorka,Mintavételezési ráta,,サンプルレート,샘플링레이트,Steekproeftarief,Samplingsfrekvens,Częstotliwość próbkowania,Taxa de amostragem,,Frecvență de eșantionare,Частота дискретизации,Фреквенција узорковања,Samplingsfrekvens,Örnek oranı,Частота дискретизації, +HRTF,ADVSNDMNU_HRTF,,,,,,,,,,,,,,,,,머리전달함수,,,,,,,,,,,3D звук у навушниках (HRTF), +OPL Synthesis,ADVSNDMNU_OPLSYNTHESIS,,,,Emulace OPL,OPL-syntese,OPL Synthese,,Sintezo de OPL,Síntesis OPL,,OPL-synteesi,Synthèse OPL,OPL sinteza,OPL szintézis,,OPLシンセサイズ,OPL 합성,OPL synthese,OPL-syntese,Synteza OPL,Síntese OPL,,Sinteză OPL,Синтез OPL,OPL синтеза,OPL-syntes,OPL Sentezi,Синтезатор OPL, +Number of emulated OPL chips,ADVSNDMNU_OPLNUMCHIPS,,,,Počet emulovaných OPL čipů,Antal emulerede OPL-chips,Anzahl OPL Chips,,Nombro da imitataj blatoj OPL,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,Broj emuliranih OPL čipova,Emulált OPL csipek száma,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 수,Aantal geëmuleerde OPL chips,Antall emulerte OPL-brikker,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,Număr de cipuri OPL emulate,Количество эмулируемых чипов OPL,Број емулираних OPL чипа,Antal emulerade OPL-chips,Taklit edilen OPL çiplerinin sayısı,Кількість емульованих OPL-чіпів, +Full MIDI stereo panning,ADVSNDMNU_OPLFULLPAN,,,,Plné MIDI stereo,Fuld MIDI stereo panorering,Echte MIDI-Stereoeffekte,,Plena MIDIa stereo-panoramado,Balance estéreo MIDI completo,,Täysi MIDI-stereopanorointi,Latéralisation complète MIDI,Poptuno MIDI stereo pomicanje,Teljes MIDI sztereó tájolás,,Full MIDIステレオパンニング,완전한 MIDI 스테레오 패닝,Volledige MIDI stereo panning,Full MIDI stereo panorering,Pełne efekty stereo dla MIDI,Lateralidade estéreo completa para MIDI,,Panoramă stereo pentru MIDI,Полная стереопанорама для MIDI,Пуно MIDI стерео каналисање,Full MIDI-stereopanorering,Tam MIDI stereo kaydırma,Повне панорамування MIDI, +OPL Emulator Core,ADVSNDMNU_OPLCORES,,,,Emulační jádro OPL,OPL-emulatorkerne,OPL Emulatorkern,,Imitil-kerno de OPL,Núcleo de emulador OPL,,OPL-emulaattoriydin,Cœur émulateur OPL,Jezgra OPL emulatora,,,OPL エミュレート コア,OPL 에뮬레이터 코어,OPL Emulator Kern,OPL-emulatorkjerne,Rdzeń Emulatora OPL,Núcleo do emulador de OPL,,Nucleu de emulare OPL,Ядро эмуляции OPL,OPL језгро емулације,OPL-emulatorns kärna,OPL Emülatör Çekirdeği,Тип OPL, +MIDI voices,ADVSNDMNU_MIDIVOICES,,,,Počet MIDI hlasů,MIDI-stemmer,MIDI Stimmen,,MIDI-aj voĉoj,Voces MIDI,,MIDI-äänet,Voix MIDI,MIDI glasovi,MIDI hangok,Voci MIDI,MIDI ボイス,MIDI 최대 음색 양,MIDI-stemmen,MIDI stemmer,Głosy MIDI,Vozes MIDI,,Voci MIDI,MIDI-голоса,MIDI гласови,MIDI-stämmor,MIDI sesleri,MIDI поліфонія, +FluidSynth,ADVSNDMNU_FLUIDSYNTH,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Global,ADVSNDMNU_GLOBAL,,,,Globální,,,,Malloka,,,Yleinen,,Globalno,,Globale,グローバル,전반적,Globaal,,Globalne,,,,Общие,Глобално,,Küresel,Загальні, +Freeverb,ADVSNDMNU_FREEVERB,,,,,,,,,,,,,Freeverb,,,フリーバーブ,프리버브,,,,,,,,,,Freeverb,, +Global Freeverb,ADVSNDMNU_GLOBAL_FREEVERB,,,,Globální Freeverb,Global Freeverb,Globales Freeverb,,Malloka Freeverb,Freeverb Global,,Yleinen Freeverb,Freeverb Global,Globalni Freeverb,,Freeverb globale,グローバル フリーバーブ,전반적 프리버브,Globale Freeverb,,Globalny Freeverb,Freeverb global,,Freeverb Global,Глобальный Freeverb,Глобални Freeverb,,Küresel Freeverb,Глобальний Freeverb, +Patch set,ADVSNDMNU_FLUIDPATCHSET,,,,Nástrojová sada,Patch-sæt,Patch-Set,,Flikaro,Set de parche,,Patch-asetus,Banque de Sons,Set zakrpa,,,パッチ セット,패치 세트,,Patch-sett,Zestaw łatek,Banco de sons,,Set patch,Патч-набор,Печ сет,Patch-uppsättning,Yama seti,Патч-набір, +Gain,ADVSNDMNU_FLUIDGAIN,,,,Zesílení,,Relative Lautstärke,,Akiro,Ganancia,,Vahvistus,,Jačina,Visszaverődés,,ゲイン,쌓기,Relatief volume,,Wzmocnienie,Ganho,,Amplificare,Усиление,Појачање,Relativ volym,Kazanç,Підсилення, +Reverb,ADVSNDMNU_REVERB,,,,Ozvěna,,Hall,,Resono,Reverberación,,Kaiku,Réverbération,Odjekivanje,Visszhang,,リバーブ,리버브,Nagalm,,Pogłos,Reverberação,,,Реверберация,Одјек,,,Реверберація, +Reverb Level,ADVSNDMNU_REVERB_LEVEL,,,,Intenzita ozvěny,,Hallintensität,,Nivelo de resono,Nivel de reverberación,,Kaiunvoimakkuus,Niveau Réverb.,Razina odjekivanja,Visszhang szintje,,リバーブ量,리버브 강도,Nagalm niveau,Reverb-nivå,Poziom pogłosu,Nível de reverberação,,Nivel Reverb,Уровень реверберации,Ниво одјека,Reverb-nivå,Reverb Seviyesi,Рівень реверберації, +Chorus,ADVSNDMNU_CHORUS,,,,,,,,Ĥoro,,,,,Refren,,,コーラス,코러스,,,,,,Cor,Хор,Корус,,Koro,Хорус, +Timidity++,ADVSNDMNU_TIMIDITY,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +ADLMidi,ADVSNDMNU_ADLMIDI,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +OPNMidi,ADVSNDMNU_OPNMIDI,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Timidity config file,ADVSNDMNU_TIMIDITYCONFIG,,,,Konfigurační soubor Timidity,Timidity-konfigurationsfil,Timidity Konfigurationsdatei,,Agorda dosiero de Timidity,Ruta al archivo config. Timidity,,Timidity-config-tiedosto,Fichier de config. TiMidity,Konfiguracijska datoteka za Timidity,Timidity konfigurációs fájl,File configurazione Timidity,Timidity コンフィグファイル,Timidity 코딩 파일,Timidity++ configuratiebestand,Timidity konfigurasjonsfil,Plik konfiguracyjny Timidity,Arquivo de configuração do Timidity,,Fișier configurație Timidity,Файл конфигурации Timidity,Timidity конфигурациона датотека,Timidity-konfigurationsfil,Timidity yapılandırma dosyası,Файл конфігурації Timidity, +Relative volume,ADVSNDMNU_TIMIDITYVOLUME,,,,Relativní hlasitost,Relativ lydstyrke,Relative Lautstärke,,Relativa laŭteco,Volumen relativo,,Suhteellinen äänenvoimakkuus,Volume Relatif,Relativna glasnoća,Relatív hangerő,Volume relativo,相対音量,비교적인 볼륨,Relatief volume,Relativt volum,Względna głośność,Volume relativo,,Volum relativ,Относительная громкость,Релативна јачина,Relativ volym,Bağıl hacim,Відносна гучність, +WildMidi,ADVSNDMNU_WILDMIDI,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +WildMidi config file,ADVSNDMNU_WILDMIDICONFIG,,,,Konfigurační soubor WildMidi,WildMidi konfigurationsfil,WilfMidi Konfigurationsdatei,,Agorda dosiero de WildMidi,Archivo de config. WildMidi,,WildMidi-config-tiedosto,Fichier config. WildMidi,Konfiguracijska datoteka za WildMidi,WildMidi konfigurációs fájl,File WildMidi config,WildMidi コンフィグファイル,WildMidi 코딩 파일,WildMidi configuratiebestand,WildMidi konfigurasjonsfil,Plik konfiguracyjny WildMidi,Arquivo de configuração do WildMidi,,Fișier configurație WildMidi,Файл конфигурации WildMidi,WildMidi конфигурациона датотека,WildMidi-konfigurationsfil,WildMidi yapılandırma dosyası,Файл конфігурації WildMidi, +Select configuration,ADVSNDMNU_SELCONFIG,,,,Vybrat konfiguraci,Vælg konfiguration,Konfiguration wählen,,Elekti agordon,Seleccionar configuración,,Valitse kokoonpano,Sélectionner configuration,Odabir konfiguracije,Konfiguráció kiválasztása,Seleziona la configurazione,構成選択,설정을 고르시오,Selecteer configuratie,Velg konfigurasjon,Wybierz konfigurację,Selecionar configuração,,Selectare configurație,Выбор конфигурации,Изабери конфигурацију,Välj konfiguration,Yapılandırma seçin,Вибір конфігурації, +Advanced Resampling,ADVSNDMNU_ADVRESAMPLING,,,,Pokročilé převzorkování,Avanceret resampling,Erweitertes Resampling,,Altnivela respecimenado,Resampleo avanzado,,Kehittynyt näytteenottotaajuuden muuntaminen,Resampling Avancé,Napredno uzorkovanje,Fejlett Resmapling,Resampling avanzato,高度なリサンプリング,향상된 리샘플링,Geavanceerde herbemonstering,Avansert resampling,Zaawansowane Próbkowanie,Reamostragem avançada,,Resempling avansat,Продвинутый ресэмплинг,Напредно ресампловање,Avancerad återampling,Gelişmiş Yeniden Örnekleme,Розширений ресемплінг, +OPL Bank,ADVSNDMNU_OPLBANK,,,,OPL sada,,,,Memor-banko por OPL,Banco OPL,,OPL-pankki,Banque OPL,OPL banka,,,,OPL 뱅크,,,Bank OPL,Banco OPL,,Bancă OPL,Банк OPL,OPL банка,OPL-bank,,Банк OPL, +OPL Emulator Core,ADVSNDMNU_ADLOPLCORES,,,,Emulační jádro OPL,OPL-emulatorkerne,OPL Emulatorkern,,Imitil-kerno por OPL,Núcleos de emulador OPL,,OPL-emulaattoriydin,Cœur Emulateur OPL,Jezgra OPL emulatora,OPL emulátor mag,,OPL エミュレートコア,OPL 에뮬레이터 코어,OPL Emulator Kern,OPL-emulatorkjerne,Rdzeń Emulatora OPL,Núcleo do emulador de OPL,,Nucleu de emulare OPL,Ядро эмуляции OPL,OPL емулационо језгро,OPL-emulatorns kärna,OPL Emülatör Çekirdeği,Ядро емуляції OPL, +Run emulator at PCM rate,ADVSNDMNU_RUNPCMRATE,,,,Emulátor používá PCM vzorkovací frekvenci,Kør emulator ved PCM-hastighed,Emulator benutzt PCM Samplerate,,Lanĉi imitilon laŭ rapido de PCM,Ejecutar emulador a velocidad PCM,,Aja emulaattoria PCM-taajuudella,Emulateur utilise cadence PCM,Pokreni emulator brzinom PCM-a,Emulátor futtatása PCM rátán,Esegui l'emulatore con rate PCM,PCMレートでエミュレート実行,PCM 속도로 에뮬레이터 실행,Emulator maakt gebruik van PCM Samplerate,Kjør emulator med PCM-hastighet,Uruchom emulator w częstotliwości PCM,Rodar emulador em taxa PCM,,Utilizare cu frecvența PCM,Использовать с частотой PCM,Покрени емулацију на PCM стопи,Kör emulatorn med PCM-frekvens,Emülatörü PCM hızında çalıştırın,Використовувати з частотою PCM, +Number of emulated OPL chips,ADVSNDMNU_ADLNUMCHIPS,,,,Počet emulovaných OPL čipů,Antal emulerede OPL-chips,Anzahl OPL Chips,,Nombro da imitataj blatoj OPL,Número de chips OPL emulados,,Emuloitavien OPL-piirien lukumäärä,Puces OPL émulées,Broj emuliranih OPL čipova,Emulált OPL csipek száma,Numero di chip OPL emulati,OPLチップエミュレートの番号,에뮬레이트된 OPL 칩 개수,Aantal geëmuleerde OPL chips,Antall emulerte OPL-brikker,Liczba emulowanych czipów OPL,Número de chips OPL emulados,,Număr de cipuri GUS emulate,Количество эмулируемых чипов OPL,Број емулираних OPL чипова,Antal emulerade OPL-chips,Taklit edilen OPL çiplerinin sayısı,Кількість емульованих OPL-чіпів, +Volume model,ADVSNDMNU_VLMODEL,,,,Model hlasitosti,Volumenmodel,Lautstärkemodell,,Modelo de laŭteco,Modelo de volumen,,Äänenvoimakkuusmalli,Modèle de Volume,Model glasnoće,Hangmodell,Modello di volume,音量モデル,모델 볼륨,Volume model,Volummodell,Model głośności,Modelo de volume,,Model volum,Модель громкости,Волумски модел,Volymmodell,Hacim modeli,Модель гучності, +OPN2 Emulator Core,ADVSNDMNU_OPNCORES,,,,Emulační jádro OPN2,OPN2-emulatorkerne,OPN2 Emulatorkern,,Imitil-kerno por OPN2,Núcleo de emulador OPN2,,OPN2-emulaattoriydin,Cœur émulateur OPN2,Jezgra OPN2 emulatora,OPN2 Emulátor Mag,,OPN2 エミュレート コア,OPN2 에뮬레이터 코어,OPN2 Emulatorkern van de OPN2-emulator,OPN2 Emulatorkjerne,Rdzeń Emulatora OPN2,Núcleo do emulador de OPN2,,Nucleu de emulare OPN2,Ядро эмуляции OPN2,OPN2 језгро емулације,OPN2-emulatorkärna,OPN2 Emülatör Çekirdeği,Ядро емуляції OPN2, +GUS Emulation,ADVSNDMNU_GUSEMULATION,,,,Emulace GUS,GUS-emulering,GUS Emulation,,Imitado de GUS,Emulación GUS,,GUS-emulaatio,Emulation GUS,GUS emulacija,GUS Emuláció,,GUS エミュレーション,GUS 에뮬레이션,GUS-emulatie,GUS-emulering,Emulacja GUS,Emulação de GUS,,Emulare GUS,Эмуляция GUS,GUS емулација,GUS-emulering,GUS Emülasyonu,Емуляція GUS, +GUS config file,ADVSNDMNU_GUSCONFIG,,,,Konfigurační soubor GUS,GUS-konfigurationsfil,GUS Konfigurationsdatei,,Agorda dosiero de GUS,Archivo de config. GUS,,GUS-config-tiedosto,Fichier Config. GUS,Konfiguracijska datoteka za GUS,GUS konfigurációs fájl,File GUS config,GUS コンフィグファイル,GUS 코딩 파일,GUS-configuratiebestand,GUS konfigurasjonsfil,Plik konfiguracyjny GUS,Arquivo de configuração do GUS,,Fișier configurație GUS,Файл конфигурации для GUS,GUS конфигурациона датотека,GUS-konfigurationsfil,GUS yapılandırma dosyası,Файл конфігурації для GUS, +Read DMXGUS lumps,ADVSNDMNU_DMXGUS,,,,Načíst DMXGUS soubory,Læs DMXGUS-klumper,Lese DMXGUS,,Legi datumarojn DMXGUS,Leer archivos DMXGUS,,Lue DMXGUS-tietoja,Lire fichiers DMXGUS,Čitaj grudice DMXGUS-a,DMXGUS lumpok beolvasása,Leggi i lump DMXGUS,DMXGUS ランプを読む,DMXGUS 럼프 읽기,DMXGUS-klonten lezen,Les DMXGUS-filer,Czytaj pliki DMXGUS,Ler lumps DMXGUS,,Citire fișiere DMXGUS,Читать файлы DMXGUS,Читај DMXGUS фајлове,Läsa DMXGUS-filer,DMXGUS dosyalarını okuma,Читати файли DMXGUS, +GUS memory size,ADVSNDMNU_GUSMEMSIZE,,,,Velikost paměti GUS,GUS-hukommelsesstørrelse,GUS Speichergröße,,Memor-kapacito de GUS,Tamaño de memoria de GUS,,GUS-muistikoko,Taille mémoire GUS,Veličina GUS memorije,GUS memória mérete,Dimensione della memoria per GUS,GUS メモリーサイズ,GUS 메모리 크기,GUS-geheugengrootte,GUS-minne størrelse,Rozmiar pamięci GUS,Tamanho de memória do GUS,,Memorie alocată pentru GUS,Размер памяти GUS,GUS величина памћења,GUS minnesstorlek,GUS bellek boyutu,Розмір пам'яті GUS, +Number of emulated OPN chips,ADVSNDMNU_OPNNUMCHIPS,,,,Počet emulovaných OPN čipů,Antal emulerede OPN-chips,Anzahl OPN Chips,,Nombro da imitataj blatoj OPN,Número de chip OPN emulados,,Emuloitavien OPN-piirien lukumäärä,Puces OPN émulées,Broj emuliranih OPN čipova,Emulált OPL csipek száma,Numero di chip OPN emulati,OPNチップエミュレートの番号,에뮬레이트된 OPN 칩 개수,Aantal geëmuleerde OPL chips,Antall emulerte OPN-brikker,Liczba emulowanych czipów OPN,Número de chips OPN emulados,,Număr de cipuri OPN emulate,Количество эмулируемых чипов OPN,Број емулираних OPN чипова,Antal emulerade OPN-chips,Taklit edilen OPN çiplerinin sayısı,Кількість емульованих OPN-чіпів, +Use custom WOPL bank,ADVSNDMNU_ADLCUSTOMBANK,,,,Použít vlastní WOPL sadu,Brug af brugerdefineret WOPL-bank,Benutzerdefinierte WOPL Bank,,Uzi propran WOPLan memor-bankon,Utilizar banco WOPL personalizado,,Käytä mukautettua WOPL-pankkia,Utiliser Banque WOPL perso,Upotrijebi prilagođenu WOPL banku,Saját WOPL bank használata,Usa WOPL bank personalizzato,カスタムWOPL bankを使用,사용자 지정 WOPL 뱅크 사용,Gebruik de aangepaste WOPL bank,Bruk egendefinert WOPL-bank,Użyj niestandardowego banku WOPL,Usar banco WOPL personalizado,,Utilizați propriul bank WOPN,Использовать собственный банк WOPL,Користи прилагођенуу WOPL банку,Använd anpassad WOPL-bank,Özel WOPL bankası kullanın,Використовувати власний банк WOPL, +WOPL Bank file,ADVSNDMNU_OPLBANKFILE,,,,Soubor WOPL sady,WOPL Bank-fil,WOPL Bank-Datei,,Dosiero de WOPLa memor-banko,Archivo de banco WOPL,,WOPL-pankkitiedosto,Banque WOPL,WOPL bankovna datoteka,WOPL Bank fájl,File WOPL Bank,WOPL bankファイル,WOPL 뱅크 파일,WOPL Bank-bestand,WOPL Bank-fil,Plik banku WOPL,Banco WOPL,,Fișier WOPN bank,Файл с банком WOPL,WOPL фајл банка,WOPL Bank-fil,WOPL Bank dosyası,Файл з банком WOPL, +Use custom WOPN bank,ADVSNDMNU_OPNCUSTOMBANK,,,,Použít vlastní WOPN sadu,Brug af brugerdefineret WOPN-bank,Benutzerdefinierte WOPN Bank,,Uzi propran WOPNan memor-bankon,Utilizar banco WOPN personalizado,,Käytä mukautettua WOPN-pankkia,Utiliser Banque WOPN perso,Upotrijebi prilagođenu WOPL banku,Saját WOPN bank használata,Usa WOPN bank personalizzato,カスタムWOPN bankを使用,사용자 지정 WOPN 뱅크 사용,Gebruik aangepaste WOPN-bank op maat,Bruk egendefinert WOPN-bank,Użyj niestandardowego banku WOPN,Usar banco WOPN personalizado,,Utilizați propriul bank WOPN,Использовать собственный банк WOPN,Користи прилагођену WOPN банку,Använd anpassad WOPN-bank,Özel WOPN bankası kullanın,Використовувати власний банк WOPN, +WOPN Bank file,ADVSNDMNU_OPNBANKFILE,,,,Soubor WOPN sady,WOPN Bank-fil,WOPN Bank-Datei,,Dosiero de WOPNa memor-banko,Archivo de banco WOPN,,WOPN-pankkitiedosto,Banque WOPN,WOPL bankovna datoteka,WOPN Bank fájl,File WOPN Bank,WOPN bankファイル,WOPN 뱅크 파일,WOPN Bank-bestand,WOPN-bankfil,Plik banku WOPN,Banco WOPN,,Fișier WOPN bank,Файл с банком WOPN,WOPN фајл банка,WOPN Bank-fil,WOPN Banka dosyası,Файл з банком WOPN, +Aliasing,OPTVAL_ALIASING,,,,,,,,Grajneca,,,,,Alijaziranje,,,エイリアシング,에일리어싱,,,,,,Dedublare,Сглаживание,Преклапање,,Takma Adlandırma,Згладжування, +Linear,OPTVAL_LINEAR_1,This setting is duplicated threefold in order to allow for different grammatical gender endings,,,Lineární,Lineær,,,Lineara,Lineal,,Lineaarinen,Linéaire,Linearno,Lineáris,Lineare,リニア,선형,Lineair,Lineær,Liniowy,,,Liniar,Линейное,Линеаран,Linjär,Doğrusal,Лінійне, +Linear,OPTVAL_LINEAR_2,,,,Lineární,Lineær,,,Lineara,Lineal,,Lineaarinen,Linéaire,Linearno,Lineáris,Lineare,リニア,선형,Lineair,Lineær,Liniowa,,,Liniar,Линейная,Линеаран,Linjär,Doğrusal,Лінійна, +Linear,OPTVAL_LINEAR_3,,,,Lineární,Lineær,,,Lineara,Lineal,,Lineaarinen,Linéaire,Linearno,Lineáris,Lineare,リニア,선형,Lineair,Lineær Lineær,Liniowe,,,Liniar,Линейный,Линеаран,Linjär,Doğrusal,Лінійний, +Nearest,OPTVAL_NEAREST,,,,Nejbližší,Nærmeste,Nächster Nachbar,,Plej proksima,Cercano,,Lähin,Nearest,Najbliže,Legközelebbi,Il più vicino,最寄り,가까이,Naast,Nærmeste,Najbiższe,Mais próximo,,Cel mai apropriat,Ближайший,Најближе,Närmaste,En yakın,Найближчий, +PCF (Low),OPTVAL_PCF_LOW,,,,PCF (nízké),PCF (lav),PCF (niedrig),,PCF (Malalta),PCF (Bajo),,PCF (matala),PCF (Low),PCF (nisko),PCF (Alacsony),PCF (basso),PCF (低),PCF (하급),PCF (Laag),PCF (lav),PCF (Niski),PCF (Baixo),,PCF (Scăzut),PCF (низкий),PCF (ниско),PCF (låg),PCF (Düşük),PCF (низький), +PCF (Medium),OPTVAL_PCF_MEDIUM,,,,PCF (střední),PCF (medium),PCF (mittel),,PCF (Mezalta),PCF (Medio),,PCF (keskitaso),PCF (Medium),PCF (srednje),PCF (Közepes),PCF (medio),PCF (中),PCF (중급),,PCF (middels),PCF (Średni),PCF (Médio),,PCF (Mediu),PCF (средний),PCF (средње),PCF (medelhög),PCF (Orta),PCF (средній), +PCF (High),OPTVAL_PCF_HIGH,,,,PCF (vysoké),PCF (høj),PCF (hoch),,PCF (Alta),PCF (Alto),,PCF (korkea),PCF (High),PCF (visoko),PCF (Magas),PCF (alto),PCF (高),PCF (상급),PCF (Hoog),PCF (høy),PCF (Wysoki),PCF (Alto),,PCF (Ridicat),PCF (высокий),PCF (високо),PCF (hög),PCF (Yüksek),PCF (високий), +Cubic,OPTVAL_CUBIC,,,,Kubická,Kubisk,Kubisch,,Kuba,Cúbico,,Kuutio,Cubique,Kubik,Négyzetes,Cubico,キュービック,큐빅,Kubieke,Kubisk,Sześcienny,Cúbico,,Cub,Кубическое,Кубан,Kubisk,Kübik,Кубічне, +Band-limited step,OPTVAL_BLEP,,,,Omezené krokování,Båndbegrænset trin,Bandbegrenzte Schritte,,Paŝo limigita per bendo,Paso limitado por banda,,Kaistarajoitettu askel,Step limité par bande,Korak ograničen pojasom,Sáv-limitált lépés,Passo limitato dalla banda,帯域制限ステップ,제한된 단계별 밴드,Bandbeperkte stap,Båndbegrenset trinn,Krok ograniczony pasmem,Passo limitado por banda,,Limitare frecvență pas-cu-pas,Ограниченный полосой пропускания шаг,Постепено ограничење фреквенције,Bandbegränsat steg,Bant sınırlı adım,Покрокове обмеження частоти, +Linear (Slower),OPTVAL_LINEARSLOW,,,,Lineární (pomalejší),Lineær (langsommere),Linear (langsamer),,Lineara (Pli malrapida),Lineal (más lento),,Lineaarinen (hitaampi),Linéaire (Lent),Linearno (sporije),Lineáris (Lassabb),Lineare (più lento),リニア(遅め),선형 (느리게),Lineair (langzamer),Lineær (langsommere),Liniowy (wolniejszy),Linear (mais lento),,Liniar (Mai lent),Линейное (медленнее),Линеаран (спорије),Linjär (långsammare),Doğrusal (Daha Yavaş),Лінійне (повільніше), +Band-limited linear,OPTVAL_BLAM,,,,Omezená lineární,Båndbegrænset lineær,Bandbegrenzt linear,,Bendo-limigite lineara,Lineal limitado por banda,,Kaistarajoitettu lineaarinen,Linéaire limité par bande,Linearno ograničeno pojasom,Sáv-limitált lineáris,Lineare limitato dalla banda,帯域制限リニア,밴드 제한 식 선형,Band-beperkt lineair,Båndbegrenset lineær,Liniowy ograniczony pasmem,Linear limitado por banda,,Limitare frecvență liniară,Ограниченное полосой пропускания линейное,Линеарно ограничење фреквенције,Bandbegränsad linjär,Bant sınırlı doğrusal,Лінійне обмеження частоти, +Cubic (Slower),OPTVAL_CUBICSLOW,,,,Kubická (pomalejší),Kubisk (langsommere),Kubisch (langsamer),,Kuba (Pli malrapida),Cúbico (más lento),,Kuutio (hitaampi),Cubique (Lent),Kubik (sporije),Négyzetes (Lassabb),Cubico (più lento),キュービック (遅め),큐빅 (느리게),Kubieke (langzamer),Kubisk (langsommere),Sześcienny (wolniejszy),Cúbico (mais lento),,Cub (Mai lent),Кубическое (медленнее),Кубан (спорије),Kubisk (långsammare),Kübik (Daha Yavaş),Кубічне (повільніше), +Sinc,OPTVAL_SINC,,,,,Sinc,,,,Seno cardinal,,,,Sink,,,シンク,싱크,,,,Seno cardinal,,Sinus cardinal,Кардинальный синус,Синк,,,Функція sinc, +Note on/off only,OPTVAL_NOTEONOFFONLY,,,,Pouze začátek/konec noty,Kun note on/off,Nur für Note an/aus ,,Nur (mal)ŝaltataj tonoj,Solo notas de Activ./Desact.,,Vain nuotti päällä/pois,Note on/off seulement,Napomena uklj./isklj. samo,Hangjegy ki/be csak,Note solamente ON/OFF,ノート オン/オフ のみ,노트를 끄거나 켰을 때,Alleen toon aan/uit,Merk kun på/av,Tylko dla włączonych/wyłączonych notatek,Somente notas ligadas/desligadas,,Numai la activarea/oprirea notelor,Только при включении/отключении нот,Само током укључења/искључења ноте,Endast anteckning på/av,Yalnızca not açma/kapama,Лише для нот, +Full ramping,OPTVAL_FULLRAMPING,,,,Plný náběh,Fuld rampe,,,Plena kresko,Aumento completo,,Täysi kerrytys,Rampe complète,Potpuno pojačavanje,Teljes ramping,Ramping completo,フルランピング,최대 램핑,Volledige helling,,Pełne zwiększenie,Rampa completa,,Creștere completă,Полное наращивание,Пуно појачање,Full rampning,Tam rampa,Згладжування різких змін гучності, +Master volume,MODMNU_MASTERVOLUME,,,,Celková hlasitost,Master-volumen,Grundlautstärke,,Ĉeflaŭteco,Volumen maestro,,Yleisäänenvoimakkuus,Volume maître,Glavna glasnoća,Fő hangerő,Volume master,全体音量,마스터 볼륨,Hoofdvolume,Hovedvolum,Całkowita głośność,Volume geral,,Volum general,Общая громкость,Глацни звук,Huvudvolym,Ana ses seviyesi,Загальна гучність, +Quality,MODMNU_QUALITY,,,,Kvalita,Kvalitet,Qualität,,Kvalito,Calidad,,Laatu,Qualité,Kvaliteta,Minőség,Qualità,クオリティ,품질,Kwaliteit,Kvalitet,Jakość,Qualidade,,Calitate,Качество,Квалитет,Kvalitet,Kalite,Якість, +Volume ramping,MODMNU_VOLUMERAMPING,,,,Křivka hlasitosti,Lydstyrke-rampe,Lautstärkeverhalten,,Grada kresko de laŭteco,Aumento gradual de Volumen,,Äänenvoimakkuuden kertyminen,Rampe du volume,Pojačavanje glasnoće,,Ramping volume,音量ランピング,볼륨 램핑,Volume-aanvulling,Volumramping,Zwiększenie głośności,Rampa de volume,,Creștere volum,Наращивание громкости,Појачавање звука,Volymrampning,Hacim artırma,Нарощування гучності, +libXMP,OPTVAL_LIBXMP,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Dumb,OPTVAL_DUMB,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Chip-o-matic,MODMNU_CHIPOMATIC,,,,,,,,,,,,,,,,チップ オー マチック,칩-오-매틱,,,,,,,,,,,, +MAME OPL2,OPTVAL_MAMEOPL2,,,,,,,,,,,,,,,,,마메 OPL2,,,,,,,,,,,, +DOSBox OPL3,OPTVAL_DOSBOXOPL3,,,,,,,,,,,,,,,,,도스박스 OPL3,,,,,,,,,,,, +Java OPL3,OPTVAL_JAVAOPL3,,,,,,,,,,,,,,,,,자바 OPL3,,,,,,,,,,,, +Nuked OPL3,OPTVAL_NUKEDOPL3,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +MAME YM2612,OPTVAL_MAMEOPN2,,,,,,,,,,,,,,,,,마메 YM2612,,,,,,,,,,,, +Neko Project II Kai OPNA,OPTVAL_NP2OPNA,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +MAME YM2608,OPTVAL_MAMEOPNA,,,,,,,,,,,,,,,,,마메 YM2608,,,,,,,,,,,, +PMDWin OPNA,OPTVAL_PMDWINOPNA,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Opal OPL3,OPTVAL_OPALOPL3,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Nuked OPL3 v1.7.4,OPTVAL_NUKEDOPL3174,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Nuked OPN2,OPTVAL_NUKEDOPN2,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +GENS YM2612,OPTVAL_GENSOPN2,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Auto (Use setup of bank),ADLVLMODEL_AUTO,,,,Auto (použít nastavení sady),Auto (Brug opsætning af bank),Auto (Benutze Einstelliung der Bank),,Aŭtomata (agordaĵo de memor-banko),Auto (Usar config. del banco),,Automaattinen (käytä pankin asetuksia),Auto (Utiliser paramètre banque),Automatski (koristi postavke banke),Automatikus (Beállított bank használata),Automatico (Usa le impostazioni del bank),自動(bankのセットアップ使用),자동(뱅크 셋업 사용),Auto (gebruik instelling van de bank),Auto (Bruk oppsett av bank),Automatycznie (Użyj ustawień banku),Automático (usar definições de banco),,Auto (configurare din bancă),Авто (настройка из банка),Аутоматски (користи намештену банку),Auto (använder bankens inställning),Otomatik (Banka kurulumunu kullan),Авто (налаштування з банку), +Generic,ADLVLMODEL_GENERIC,,,,Standardní,Generisk,Allgemein,,Komuna,Genérico,,Yleinen,Générique,Generički,Általános,Generico,一般的,전형적,Algemeen,Generisk,Ogólne,Genérico,,,Общий,Генерично,Generisk,Jenerik,Загальний, +OPL Native,ADLVLMODEL_NATIVE,,,,Nativní OPL,OPL Native,OPL Nativ,,Operaciuma OPL,Nativo OPL,,Luontainen OPL,OPL Natif,OPL izvorni,Natív OPL,,OPLネイティブ,고유 OPL,,,Natywne OPL,Nativo OPL,,OPL propriu,Встроенная OPL,OPL домаћи,OPL inhemsk,OPL Yerli,Вбудована OPL, +"DMX (Accurate, with AM bug)",ADLVLMODEL_DMX,,,,"DMX (Přesný, s AM chybou)","DMX (nøjagtig, med AM-fejl)",,,,,,,,"DMX (precizan, s AM pogreškom)","DMX (Pontos, de AM buggal)",,,데이터 마이닝 확장,"DMX (accuraat, met AM bug)","DMX (Nøyaktig, med AM-feil)",,"DMX (preciso, com bug de AM)",,"DMX (Precis, cu probleme în AM)","DMX (Точная, с ошибкой АМ)",,"DMX (exakt, med AM-bugg)","DMX (Doğru, AM hatalı)","DMX (Точна, з помилкою АМ)", +"Apogee (Accurate, with AM bug)",ADLVLMODEL_APOGEE,,,,"Apogee (Přesný, s AM chybou)","Apogee (nøjagtig, med AM-fejl)",,,,,,,,"Apogee (precizan, s AM pogreškom)","Apogee (Pontos, de AM buggal)",,,어포지,"Apogee (accuraat, met AM bug)","Apogee (Nøyaktig, med AM-feil)",,"Apogee (preciso, com bug de AM)",,"Apogee (Precis, cu probleme în AM)","Apogee (Точная, с ошибкой АМ)",,"Apogee (Exakt, med AM-bugg)","Apogee (Doğru, AM hatası ile)","Apogee (Точна, з помилкою АМ)", +Win9X-like (SB16),ADLVLMODEL_WIN9X,,,,Jako Windows 9X (SB16),Win9X-lignende (SB16),Wie Windows 9X (SB16),,Kiel Win9X (SB16),Como Win9X (SB16),,Win9x-kaltainen (SB16),,Poput WIN9X (SB-16),Win9X szerű (SB16),,Win9X式 (SB16),Win9X 같게 (SB16),Win9X-achtig (SB16),Win9X-lignende (SB16),Jak w Win9X (SB16),Estilo Win9X (SB16),,Similar cu Win9X (SB16),Похожая на Win9X (Вариант SB16),Као у Win9X-у (SB16),Win9X-liknande (SB16),Win9X benzeri (SB16),Схожа на Win9X (Варіант SB16), +Win9X-like (Generic FM),ADLVLMODEL_WIN9XGENERIC,,,,Jako Windows 9X (Generic FM),Win9X-lignende (generisk FM),Wie Windows 9X (Generic FM),,Kiel Win9X (Generic FM),Como Win9X (Generic FM),,Win9x-kaltainen (Generic FM),,Poput WIN9X (generički FM),Win9X szerű (Általános FM),,Win9X式 (Generic FM),Win9X 같게 (Generic FM),Win9X-achtig (Generic FM),Win9X-lignende (Generisk FM),Jak w Win9X (Generic FM),Estilo Win9X (FM genérico),,Similar cu Win9X (Generic FM),Похожая на Win9X (Вариант Generic FM),Као у Win9X-у (Generic FM),Win9X-liknande (generisk FM),Win9X benzeri (Jenerik FM),Схожа на Win9X (Варіант Generic FM), +DMX (Without AM voice bug),ADLVLMODEL_DMX_FIXED,,,,DMX (Bez AM hlasové chyby),DMX (uden AM-stemmefejl),DMX (Ohne AM-Stimmenfehler),,DMX (sen cimo de AMa voĉo),DMX (Sin bug de voz AM),,DMX (ilman AM-äänivikaa),DMX (Sans bug canaux AM),DMX (bez AM glasovne pogreške),DMX (AM hanghiba nélkül),,DMX(AMボイスバグ無し),,DMX (zonder AM voice bug),DMX (uten AM-stemmefeil),DMX (bez głosowego błędu AM),DMX (sem bug de voz de AM),,DMX (Fără probleme în AM),DMX (Без ошибки АМ),,DMX (utan AM-röstfel),DMX (AM ses hatası olmadan),DMX (Без помилки АМ), +Apogee (Without AM voice bug),ADLVLMODEL_APOGEE_FIXED,,,,Apogee (Bez AM hlasové chyby),Apogee (uden AM-stemmefejl),Apogee (Ohne AM-Stimmenfehler),,Apogee (sen cimo de AMa voĉo),Apogee (Sin bug de voz AM),,Apogee (ilman AM-äänivikaa),Apogee (avec bug canaux AM),Apogee (bez AM glasovne pogreške),Apogee (AM hanghiba nélkül),,Apogee(AMボイスバグ無し),,Apogee (zonder AM voice bug),Apogee (uten AM-stemmefeil),Apogee (bez głosowego błędu AM),Apogee (sem bug de voz de AM),,Apogee (Fără probleme în AM),Apogee (Без ошибки АМ),,Apogee (utan AM-röstfel),Apogee (AM ses hatası olmadan),Apogee (Без помилки АМ), +IBM Audio Library Interface,ADLVLMODEL_AIL,,,,,,,,Son-biblioteka interfaco de IBM,,,,,Sučelje IBM zvučne knjižnice,IBM Hang Könyvtár Interfész,,,,,,Interfejs Biblioteki Dźwięków IBM,Interface de Biblioteca de Áudio IBM,,Interfață de Bibliotecă IBM,IBM AIL,,IBM Audio Library Interface (gränssnitt för ljudbibliotek),IBM Ses Kitaplığı Arayüzü,, +HMI Sound Operating System,ADLVLMODEL_HMI,,,,,,,,Son-operaciumo de HMI,,,,,HMI zvučni operacijski sustav,HMI Hang Operációs Rendszer,,,,,,System Operacyjny Dźwięków HMI,Sistema Operacional de Som HMI,,Sistem Sonor HMI,HMI SOS,,HMI-ljud Operativsystem,HMI Ses İşletim Sistemi,, +"HMI SOS (Old, with bugs)",ADLVLMODEL_HMIOLD,,,,"HMI SOS (Starý, s chybami)","HMI SOS (gammelt, med fejl)","HMI SOS (alt, mit Fehlern)",,"Son-op. de HMI (malnova, cimo-hava)","HMI SOS (Viejo, con bugs)",,"HMI SOS (vanha, vikainen)",HMI SOS (vieux et buggé),"HMI ZOS (stari, s pogreškama)","HMI SOS (Régi, bugokkal)",,HMI SOS(旧式、バグ含む),,"HMI SOS (oud, met bugs)","HMI SOS (gammel, med feil)","HMI SOS (Stare, z błędami)","SOS HMI (antigo, com bugs)",,"HMI SOS (Vechi, cu probleme)",HMI SOS (Старый вариант с ошибками),,"HMI SOS (gammalt, med fel)","HMI SOS (Eski, hatalı)",HMI SOS (Старий варіант з помилками), +Unlimited,OPTVAL_UNLIMITED,,,,Neomezené,Ubegrænset,Unlimitiert,,Senlima,Ilimitado,,Rajoittamaton,Illimité,Neograničeno,Végtelen,Illimitato,無制限,무제한,Onbeperkt,Ubegrenset,Nieskończone,Sem limites,,Nelimitat,Без ограничений,Бескрајно,Obegränsad,Sınırsız,Необмежено, +256K,OPTVAL_256K,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +512K,OPTVAL_512K,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +768K,OPTVAL_768K,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1024K,OPTVAL_1024K,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Postprocessing,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Uncharted 2,OPTVAL_UNCHARTED2,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Hejl Dawson,OPTVAL_HEJLDAWSON,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Reinhard,OPTVAL_REINHARD,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Palette,OPTVAL_PALETTE,,,,Paleta,Palet,,Παλέτα,Kolorpaletro,Paleta,,Paletti,,Paleta,Paletta,Palette,パレット,팔레트,Palet,,Paleta,Paleta,Palete,Paletă,Палитра игры,Палет,Palett,Palet,Палітра гри, +Low,OPTVAL_LOW,,,,Nízká,Lav,Niedrig,Χαμηλό,Malalta,Bajo,,Matala,Bas,Nisko,Alacsony,Basso,低,낮음,Laag,Lav,Niskie,Baixo,,Scăzut,Низкое,Ниско,Låg,Düşük,Низьке, +Medium,OPTVAL_MEDIUM,,,,Střední,,Mittel,Μεσαίο,Meza,Medio,,Keskitaso,Moyen,Srednje,Közepes,Medio,中,중간,Middel,Middels,Średnie,Médio,,Mediu,Среднее,Средње,Medelstor,Orta,Середнє, +High,OPTVAL_HIGH,,,,Vysoká,Høj,Hoch,Υψηλό,Alta,Alto,,Korkea,Elevé,Visoko,Magas,Alto,高,높음,Hoog,Høy,Wysokie,Alto,,Ridicat,Высокое,Високо,Hög,Yüksek,Високе, +Extreme,OPTVAL_EXTREME,,,,Extrémní,Ekstrem,Extrem,Ακράιο,Ekstrema,Extremo,,Äärimmäinen,Extrême,Ekstremno,Extrém,Estremo,最高,매우 높음,Extreem,Ekstrem,Ekstremalne,Extremo,,Extrem,Максимальное,Екстремно,Extremt,Aşırı,Максимальне, +Obverse,OPTVAL_OBVERSEFIRST,,,,Vpřed (obvers),Forside,Obvers,Παρατήρησε,Aversa,Anverso,,Etupuoli,,Suprotno,Ellentétes,Dritto,正面,앞면,Obvers,Forside,Awers,Obverso,,Avers,Прямой,Супротно,Framsida,Ön yüz,Прямий, +Reverse,OPTVAL_REVERSEFIRST,,,,Vzad (revers),Bagside,Revers,Αντίστροφο,Inversa,Inverso,,Käänteinen,Inverse,Obrnuto,Fordított,Contrario,反転,반전,Revers,Baksiden,Rewers,Reverso,,Invers,Обратный,Обрнуто,Baksida,Ters,Зворотний, +Postprocessing,GLMNU_POSTPROCESS,,,,,Efterbehandling,,Μετα-επεξεργασία,Posttraktado,Postprocesado,,Jälkikäsittely,,Naknadna obrada,,,ポストプロセッシング,포스트프로세싱 적용,Nabewerking,Etterbehandling,Przetwarzanie końcowe,Pós-processamento,,Postprocesare,Постобработка,Пост обрада,Efterbehandling,İşlem sonrası,Постобробка, +Tonemap Mode,GLPREFMNU_TONEMAP,,,,Režim tónovací mapy,Tonemap-tilstand,Tonemap Modus,,Reĝimo de ton-mapo,Modo de mapa de tonos,,Sävykarttatila,Mode Tonemap,Metoda prikaza boja,Színleképzés módja,Modalità Tonemap,トーンマップ モード,톤맵 모드,Tonemap modus,Tonemap-modus,Tryb Mapowania Tonów,Tipo de tonemap,,Mod Tonemap,Режим тонового отображения,Тонирано-мапни мод,Tonemap-läge,Ton Haritası Modu,Режим тонального відображення, +Lens distortion effect,GLPREFMNU_LENS,,,,Efekt distorze čočky,Objektivforvrængningseffekt,Optischer Verzerrungseffekt,,Lens-distorda efiko,Efecto de distorsión de lente,,Linssinvääristystehoste,Effet distorsion de lentille,Efekt izobličenja objektiva,Lencsetorzulás effekt,Effetto distorsione della lente,レンズの歪みエフェクト,렌즈 왜곡 효과,Effect van de lensvervorming,Linseforvrengningseffekt,Efekt zniekształcenia obiektywu,Distorção de lente,Efeito de distorção da lente,Efect de distorsionare,Эффект искажения линзы,Дисторзија објектива ефект,Linsförvrängningseffekt,Lens bozulma efekti,Ефект деформації лінзи, +FXAA Quality,GLPREFMNU_FXAA,,,,Kvalita FXAA,FXAA-kvalitet,FXAA Qualität,FXAA ποίοτητα,Kvalito de FXAA,Calidad FXAA,,FXAA-laatu,Qualité FXAA,FXAA kvaliteta,FXAA minősége,Qualità FXAA,FXAA品質,FXAA 품질,FXAA-kwaliteit,FXAA-kvalitet,Jakość FXAA,Qualidade de FXAA,,Calitate FXAA,Качество FXAA,FXAA квалитет,FXAA-kvalitet,FXAA Kalitesi,Якість FXAA, +Dither output,GLPREFMNU_DITHER,,,,Dithering,Dither-udgang,Dithering,,Apliki punktojn al eligo,Dither de salida,,Sekoitussävytyksen (dithering) ulostulo,Dithering,Izlaz sjenčanja,Árnyalás kimenet,Dithering,ディザー出力,떨림 효과 출력,Dither output,Dither-utgang,Dygotanie,Dithering,,Putere Dithering,Дизеринг,Учестаност трептања,Dither-utgång,Dither çıkışı,Дитеринг, +Tonemap Palette Order,GLPREFMNU_PALTONEMAPORDER,,,,Pořadí palety tónovací mapy,Tonemap-palettens rækkefølge,Palettensortierung für Tonemap,,Ordo de la kolorpaletro de ton-mapo,Orden de la paleta en mapa de tonos,,Sävykartan paletin järjestys,Ordre des palettes tonemap,Redoslijed palete prikaza boja,Színleképzés paletta sorrend,Ordine della Palette Tonemap,トーンマップパレット順序,톤맵 팔레트 순서,Tonemap Palet Orde van het Tonemap-palet,Tonemap-palettrekkefølge,Kolejność Palet Mapowania Tonów,Ordem da paleta tonemap,,Ordine paletă Tonemap,Порядок палитры тонового отображения,Тонирано-мапни палетни ред,Tonemappalettordning,Ton Haritası Palet Sırası,Порядок палітри тонального відображення, +Tonemap Palette Exponent,GLPREFMNU_PALTONEMAPPOWER,,,,Exponent palety tónovací mapy,Tonemap-palettens eksponent,Palettenexponent für Tonemap,,Eksponeto de kolorpaletro de ton-mapo,Exponente paleta en mapa de tonos,,Sävykartan paletin eksponentti,Exponent des palettes tonemap,Eksponent palete prikaza boja,Tonemap Paletta Exponens,Esponente della Palette Tonemap,トーンマップパレット指数,톤맵 팔레트 지수,Tonemap Palet Exponent,Tonemap Palette Eksponent,Wykładnik Palet Mapowania Tonów,Expoente da paleta tonemap,,Exponent paletă Tonemap,Экспонента палитры тонового отображения,Тонирано-мапни палетни експонент,Exponent för tonemappalett,Ton Haritası Paleti Üsteli,Експонента палітри тонального відображення, +Multisample,GLPREFMNU_MULTISAMPLE,,,,Multisampling,,Multisampling,,Plur-specimenado,Multisampling,,Moninäytteistys,,Višestruko uzorkovanje,,,マルチサンプル,멀티샘플,,,Multipróbkowanie,Multiamostragem,,Multisampling,Мультисэмплинг,Мулти-узорак,,Çoklu Örneklem,Багатовибіркове згладжування, +Bloom effect,GLPREFMNU_BLOOM,,,,Efekt bloom,Bloom-effekt,Bloom Effekt,,Lum-ŝmira efiko,Efecto Bloom,,Hehkutehoste (bloom),Effet surbrillance,Efekt sjaja (bloom),Bloom effekt,Effetto Bloom,ブルーム エフェクト,블룸 효과,Bloom-effect,Bloom-effekt,Effekt Bloom,Bloom,,Efect Bloom,Свечение,Мутан вид ефект,Bloom-effekt,Çiçeklenme etkisi,Ефект сяйва (Bloom), +Ambient occlusion quality,GLPREFMNU_SSAO,,,,Kvalita ambient occlusion,Omgivende okklusionskvalitet,Ambient Occlusion Qualität,,Kvaliteco de media obstrukceco,Calidad de oclusión ambiental,,Yleisvarjostuksen (ambient occlusion) laatu,Qualité Occlusion Ambiente,Kvaliteta ambijentalne okluzije,Ambient occlusion minősége,Qualità occlusione ambientale,アンビエント オクルージョンの品質,주변 환경 가림 효과 품질,Kwaliteit van omgevingsverduistering,Omgivende okklusjonskvalitet,Jakość okluzji otoczenia,Qualidade de oclusão de ambiente,,Calitate ocluzie ambientală,Качество глобального затенения,Оклузија амбијента ефект,Kvalitet för omgivande ocklusion,Ortam oklüzyon kalitesi,Якість імітації тіней, +Portals with AO,GLPREFMNU_SSAO_PORTALS,,,,Portály s AO,Portaler med AO,Portale mit AO,,Portaloj kun Media obstrukceco,Portales con OA,,Yleisvarjostuksen portaalit,OA pour les portails,Portali s AO,Portálok AO-val,Portali con l'OA,AOを伴うポータル,주변 환경 가려진 포탈,Portals met AO,Portaler med AO,Portale z okluzją otoczenia,Portais com oclusão de ambiente,,Portaluri cu ocluzie ambientală,Порталы с глобальным затенением,Портали са AO,Portaler med omgivande ocklusion,AO'lu Portallar,Портали з глобальним затіненням, +Menu Blur,GLPREFMNU_MENUBLUR,,,,Rozostření pozadí v menu,Menu sløring,Menüunschärfe,Θόλοση μενού,Malklarigo de menuo ,Difuminación de menú,,Valikon sumennus,Flou menu,Zamućenje izbornika,Menü mosódás,Blur del menu,メニューブラー,메뉴 흐림 효과,Menu vervagen,Meny uskarphet,Rozmycie w Menu,Desfoque do menu,Desfocagem do Menu,Neclaritate Meniu,Размытие фона меню,Блур мениа,Menyns oskärpa,Menü Bulanıklığı,Розмиття фону в меню, +Environment map on mirrors,GLPREFMNU_ENVIRONMENTMAPMIRROR,,,,Mapa prostředí na zrcadlech,Miljøkort på spejle,Lichteffekt auf Spiegeln,,Medimapo sur speguloj,Mapa de entorno en espejos,,Ympäristökartta peileissä,Mappage environment sur les miroirs,Karta okruženja na zrcalima,Környezet tükröződés,Ambiente mappa sugli specchi,マップオンミラーの画像表示,거울 주변의지도 활성,Milieukaart op spiegels,Omgivelseskart på speil,Mapa środowiska w lustrach,Mapa de ambiente em espelhos,,Efecte suplimentare pentru oglinzi,Карта окружения на зеркалах,Околинска мапа на прозорима,Miljökarta på speglar,Aynalar üzerinde çevre haritası,Карта оточення на дзеркалах, +Rendering quality,GLPREFMNU_RENDERQUALITY,,,,Kvalita vykreslování,Renderingskvalitet,Renderqualität,,Kvalito de bildigado,Calidad de renderizado,,Hahmonnuslaatu,Qualité du rendu,Kvaliteta renderiranja,Renderelés minősége,Qualità resa grafica,レンダリング品質,렌더링 품질,Het teruggeven van kwaliteit,Renderingskvalitet,Jakość Renderowania,Qualidade de renderização,,Calitate video,Качество обработки,Квалитет рендовања,Renderingskvalitet,Render kalitesi,Якість візуалізації, +Speed,OPTVAL_SPEED,,,,Rychlost,Hastighed,Geschwindigkeit,Ταχύτητα,Rapido,Velocidad,,Nopeus,Vitesse,Brzina,Sebesség,Prestazioni,速度寄り,성능,Snelheid,Hastighet,Szybkość,Velocidade,,Viteză,Скорость,Брзина,Hastighet,Hız,Швидкість, +Quality,OPTVAL_QUALITY,,,,Kvalita,Kvalitet,Qualität,Ποιότητα,Kvalito,Calidad,,Laatu,Qualité,Kvaliteta,Minőség,Qualità,品質寄り,고품질,Kwaliteit,Kvalitet,Jakość,Qualidade,,Calitate,Качество,Квалитет,Kvalitet,Kalite,Якість, +Sector light mode,GLPREFMNU_SECLIGHTMODE,,,,Režim osvětlení sektorů,Sektorlystilstand,Sektorlichtmodus,,Reĝimo de sektorlumo,Modo de luz de sector,,Sektorivalojen tila,Mode de lumière Secteur,Način sektorskog svjetla,Szektor fény mód,Modalità luce di settore,セクターライトモード,섹터 조명 모드,Sector lichte wijze,Sektorlysmodus,Tryb oświetlenia sektorów,Modo de luz de setor,,Mod iluminare sectorială,Режим освещения секторов,Секторско светло мод,Sektorljusläge,Sektör ışığı modu,Режим освітлення секторів, +Fog mode,GLPREFMNU_FOGMODE,,,,Režim mlhy,Tågetilstand,Nebelmodus,Λειτουργία ομίχλης,Reĝimo de nebulo,Modo de niebla,,Sumutila,Mode du broullard,Način magle,Köd mód,Effetto nebbia,フォグモード,안개 모드,Mistmodus,Tåkemodus,Tryb mgły,Modo de neblina,,Mod ceață,Режим тумана,Магла мод,Dimläge,Sis modu,Режим туману, +Radial,OPTVAL_RADIAL,,,,Radiální,Radial,,Ακτινικό,Radiusa,,,Säteittäinen,,Radijalno,Sugaras,Radiale,放射状,방사형,Radiaal,,Promieniowe,,,Radială,Круговой,Радијално,,Radyal,Радіальний, +Standard,OPTVAL_STANDARD,,,,Standardní,,,,Norma,Estándar,,Normaali,,Standardno,Szabvány,,標準,기본,Standaard,,,Padrão,,,Стандартный,Стандардно,,Standart,Стандартний, +,,Texture options,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Texture Filter mode,GLTEXMNU_TEXFILTER,,,,Režim filtrování textur,Tilstand for teksturfilter,Texturfiltermodus,,Reĝimo por Teksturfiltrado,Modo de filtro de texturas,,Pintakuviointien suodatustapa,Mode de Filtrage Texture,Način filtera tekstura,Textúrafilter módja,Modalità filtro texture,テクスチャーフィルター モード,텍스쳐 필터 모드,Textuurfiltermodus,Teksturfilter-modus,Tryb Filtrowania Tekstur,Modo de filtro de textura,,Mod Filtrare Texturi,Фильтрация текстур,Текстурни филтер мод,Texturfilterläge,Doku Filtresi modu,Тип фільтрації текстур, +Anisotropic filter,GLTEXMNU_ANISOTROPIC,,,,Anisotropické filtrování,Anisotropisk filter,Anisotropische Filterung,,Anizotropa filtro,Filtro anisotrópico,,Anisotrooppinen suodatus,Filtre Anisotropique,Anizotropski filter,Anizotropikus filter,Filtro anisotropico,異方性フィルター,이방성 필터,Anisotroopfilter,Anisotropisk filter,Filtr anizotropowy,Filtro anisotrópico,,Filtrare Anizotropică,Анизотропная фильтрация,Анизотропни фолтер,Anisotropt filter,Anizotropik filtre,Анізотропна фільтрація, +None (nearest mipmap),OPTVAL_NONENEARESTMIPMAP,,,,Žádné (mipmapa - nejbližší soused),Ingen (nærmeste mipmap),Aus (nächste Mipmap),,Nenio (plej proksima mipmapo),Ninguno (mipmap cercano),,Ei mitään (lähin mipkartta),Aucun (mipmap proche voisin),Ništa (najbliža mipmapa),Semmilyen (közeli mipmap),Nessuno (mipmap più vicina),なし(最寄りミップマップ),없음 (밉멥에 가까움),Geen (dichtstbijzijnde mipmap),Ingen (nærmeste mipmap),Brak (najbliższa mipmapa),Nenhum (mipmap mais próximo),,Niciuna (mipmap de apropriere),Нет (ближайший MIP-уровень),Ништа (најближи мипмап),Ingen (närmaste mipmap),Yok (en yakın mipmap),Відсутня (найближчий міпмап), +None (linear mipmap),OPTVAL_NONELINEARMIPMAP,,,,Žádné (mipmapa - lineární),Ingen (lineær mipmap),Aus (lineare Mipmap),,Nenio (linia mipmapo),Ninguno (mipmap lineal),,Ei mitään (lin. mipkartta),Aucun (mipmap linéaire),Ništa (linearna mipmapa),Semmilyen (lineáris mipmap),Nessuno (mipmap lineare),なし(リニアミップマップ),없음 (선형 밉맵),Geen (lineaire mipmap),Ingen (lineær mipmap),Brak (liniowa mipmapa),Nenhum (mipmap linear),,Niciuna (mipmap liniar),Нет (линейный MIP-уровень),Ништа (линеаран мипмап),Ingen (linjär mipmap),Yok (doğrusal mipmap),Відсутня (лінійний міпмап), +None (trilinear),OPTVAL_NONETRILINEAR,,,,Žádné (trilineární),Ingen (trilineær),Aus (trilinear),,Nenio (trilinia),Ninguno (trilineal),,Ei mitään (trilineaarinen),Aucun (mipmap trilinéaire),Ništa (trilinearno),Semmilyen (trilineáris),Nessuno (mipmap trilineare),なし(トライリニア),없음 (삼선형),Geen (trilineair),Ingen (trilineær),Brak (trzyliniowe),Nenhum (trilinear),,Niciuna (trilinar),Нет (трилинейная),Ништа (трилинеарно),Ingen (trilinjär),Yok (trilineer),Відсутня (трилінійна), +Bilinear,OPTVAL_BILINEAR,,,,Bilineární,Bilineær,,,Dulinia,Bilineal,,Bilineaarinen,Bilinéaire,Bilinearno,Bilineáris,Bilineare,バイリニア,쌍선형,Bilineair,Bilineær,Dwuliniowe,,,Biliniar,Билинейная,Билинеарно,Bilinjär,Bilineer,Білінійна, +Trilinear,OPTVAL_TRILINEAR,,,,Trilineární,Trilineær,,,Trilinia,Trilineal,,Trilineaarinen,Trilinéaire,Trilinearno,Trilineáris,Trilineare,トライリニア,삼선형,Trilineair,Trilineær,Trzyliniowe,,,Triliniar,Трилинейная,Трилинеарно,Trilinjär,Trilineer,Трилінійна, +2x,OPTVAL_2X,,,,,,,,2-oble,,,,,,,,,,,,,,,,,,,,, +4x,OPTVAL_4X,,,,,,,,4-oble,,,,,,,,,,,,,,,,,,,,, +8x,OPTVAL_8X,,,,,,,,8-oble,,,,,,,,,,,,,,,,,,,,, +16x,OPTVAL_16X,,,,,,,,16-oble,,,,,,,,,,,,,,,,,,,,, +32x,OPTVAL_32X,,,,,,,,32-oble,,,,,,,,,,,,,,,,,,,,, +Texture Options,GLTEXMNU_TITLE,,,,Nastavení textur,Indstillinger for teksturer,Texturoptionen,,Agordoj de Teksturoj,Opciones de texturas,,Pintakuviointiasetukset,Options Textures,Postavke tekstura,Textúra Beállítások,Opzioni Texture,テクスチャー オプション,텍스쳐 설정,Textuur Opties,Teksturalternativer,Opcje Tekstur,Opções de Textura,,Setări Texturi,Настройки текстур,Подешавања текстура,Alternativ för textur,Doku Seçenekleri,Параметри текстур, +Textures enabled,GLTEXMNU_TEXENABLED,,,,Povolit textury,Teksturer aktiveret,Texturen an,,Teksturoj ŝaltitaj,Texturas activadas,,Pintakuvioinnit otettu käyttöön,Textures activées,Teksture su omogućene,Textúrák bekapcsolása,Texture abilitate,テクスチャー有効,텍스쳐 사용,Texturen ingeschakeld,Teksturer aktivert,Tekstury włączone,Texturas ativadas,,Texturi Activate,Включить текстуры,Текстуре омогућене,Texturer aktiverade,Dokular etkinleştirildi,Увімкнути текстури, +Enable hires textures,GLTEXMNU_ENABLEHIRES,,,,Povolit textury ve vysokém rozlišení,Aktivere hi-res teksturer,Hochauflösende Texturen an,,Ŝalti Altdistingivajn Teksturojn,Activar texturas de alta resolución,,Salli korkean erotuskyvyn pintakuvioinnit,Activer Textures haute résolution,Omogući teksture visoke rezolucije,Magas felbontású textúrák bekapcsolása,Attiva texture alta qualità,ハイレゾ テクスチャー有効,고해상도 텍스쳐 사용,Hoge-resolutie texturen op,Aktivere høyoppløselige teksturer,Włącz tekstury wysokiej jakości,Habilitar texturas de alta resolução,,Texturi de înaltă rezoluție,Текстуры высокого разрешения,Омогући текстуре велике резолуције,Aktivera texturer med högre upplösning,Yüksek çözünürlüklü dokuları etkinleştir,Увімкнути текстури високого розширення, +High Quality Resize mode,GLTEXMNU_HQRESIZE,,,,Režim zvětšovače textur,Tilstand til ændring af størrelse i høj kvalitet,Texturskalierungsmodus,,Reĝimo de Altdistingivigo-Skalilo,Modo de ajuste de alta calidad,,Korkealaatuinen kuvakoon muutostapa,Mise à l'échelle haute résolution,Način promjene veličine visoke kvalitete,Magas minőségű újraméretező mód,Modalità resize alta qualità,高品質リサイズ モード,고퀄리티 리사이즈 모드,Textuurschaalmodus,Høy kvalitet Endre størrelse-modus,Tryb Wysokiej Jakości Zmieniania Rozmiaru,Modo de Redimensionamento de Alta Qualidade,,Mod Redimensionare de Înaltă Calitate,Режим высококачественного масштабирования текстур,Промена величине високог квалитета мод,Högkvalitativt storleksanpassningsläge,Yüksek Kalite Yeniden Boyutlandırma modu,Масштабування текстур, +High Quality Resize multiplier,GLTEXMNU_HQRESIZEMULT,,,,Faktor zvětšovače textur,Multiplikator for ændring af størrelse i høj kvalitet,Texturskaluerungsfaktor,,Obligilo de Altdistingivigo-Skalilo,Multiplicador de ajuste de alta calidad,,Korkealaatuisen kuvakokomuutoksen kerroin,Multiplicateur de mise à l'échelle,Množitelj promjene veličine visoke kvalitete,Magas minőségű újraméretezés szorzó,Moltiplicatore resize alta qualità,高品質リサイズ乗数,고퀄리티 리사이징 승수,Textuurschaalfactor,Multiplikator for størrelsesendring av høy kvalitet,Mnożnik Wysokiej Jakośći Rozmiaru,Multiplicador de Redimensionamento de Alta Qualidade,,Factor de Scalare,Множитель высококачественного масштабирования,Промена величине високог квалитета мултипликатор,Multiplikator för storleksändring av hög kvalitet,Yüksek Kalite Yeniden Boyutlandırma çarpanı,Множник масштабування, +This mode requires %d times more video memory,GLTEXMNU_HQRESIZEWARN,,,,Tento režim potřebuje %dkrát více paměti,Denne tilstand kræver %d gange mere videohukommelse,Dieser Modus benötigt das %d-fache an Videospeicher,Αυτή η λειτουργία χρειάζετε %d περισσότερες φορές μνήμη βίντεο,Ĉi tiu reĝimo bezonas %d-oble pli da ekranmemoro.,Este modo requiere %d veces más memoria de vídeo,,Tämä tila vaatii %d kertaa enemmän videomuistia,Ce mode nécessite %d fois plus de mémoire vidéo,Ovaj način zahtijeva %d puta više video memorije,Ez a mód a jelenlegi videó memória %d-szeresét igényli,Questa modalità richiede %d volte la memoria video,このモードでは %d 倍以上のビデオメモリが必要です!,이 설정은 비디오 메모리의 %d 배가 더 필요합니다.,Deze modus vereist %d keer meer videogeheugen.,Denne modusen krever %d ganger mer videominne,Ten tryb wymaga %d razy więcej pamięci wideo,Este modo precisa de %d vezes mais memória de vídeo,,Acest mod necesită de %d mai multă memorie video,Данный режим требует в %d раз больше видеопамяти,Овај мод тражи %d пута више видео меморије,Det här läget kräver %d gånger mer videominne,Bu mod %d kat daha fazla video belleği gerektirir,Цьому типу потрібно в %d рази більше відеопам'яті, +Resize textures,GLTEXMNU_RESIZETEX,,,,Škálovat textury,Ændre størrelse på teksturer,Texturen skalieren,,Regrandigi teksturojn,Ajustar texturas,,Muuta pintakuviointien kokoa,Mise à l'échelle textures,Promjena veličine tekstura,Textúrák újraméretezése,Resize delle texture,テクスチャー類のリサイズ,텍스쳐 리사이징,Texturen schalen,Endre størrelse på teksturer,Zmień rozmiar tekstur,Redimensionar texturas,,Redimensionare texturi,Масштабирование текстур,Промена величине текстура,Ändra storlek på texturer,Dokuları yeniden boyutlandırma,Масштабувати текстури, +Resize sprites,GLTEXMNU_RESIZESPR,,,,Škálovat sprity,Ændre størrelse på sprites,Sprites skalieren,,Regrandigi mov-rastrumojn,Ajustar sprites,,Muuta spritejen kokoa,Mise à l'échelle sprites,Promjena veličine spriteova,Sprite-ok újraméretezése,Resize degli sprite,スプライト類のリサイズ,스프라이트 리사이징,Sprites schalen,Endre størrelse på sprites,Zmień rozmiar sprite'ów,Redimensionar sprites,,Redimensionare sprite-uri,Масштабирование спрайтов,Промена величине спрајтова,Ändra storlek på sprites,Sprite'ları yeniden boyutlandırma,Масштабувати спрайти, +Resize fonts,GLTEXMNU_RESIZEFNT,,,,Škálovat fonty,Ændre størrelse på skrifttyper,Zeichensätze skalieren,,Regrandigi tiparojn,Ajustar fuentes,,Muuta kirjasinten kokoa,Mise à l'échelle texte,Promjena veličine fontova,Betűk újraméretezése,Resize dei font,フォント類のリサイズ,폰트 리사이징,Lettertypen schalen,Endre størrelse på skrifter,Zmień rozmiar czcionek,Redimensionar fontes,,Redimensionare fonturi,Масштабирование шрифтов,Промена величине фонта,Ändra storlek på teckensnitt,Yazı tiplerini yeniden boyutlandırma,Масштабувати шрифти, +Resize model skins,GLTEXMNU_RESIZESKN,,,,Škálovat skiny modelů,Ændre størrelsen på modelskins,,,Regrandigi haŭtojn de modeloj,Ajustar texturas de modelo,,Muuta ulkoasujen kokoa,Mise à l'échelle des skins des modèles 3D,Promjena veličine izgleda modela,Model fazon újraméretezése,Ridimensiona skin modello,モデルスキン類のリサイズ,,,Endre størrelse på modellskinn,Zmień rozmiar modelu,Redimensionar skins de modelos,,Redimensionare modele,Масштабирование обликов моделей,,Ändra storlek på modellskinn,Model kaplamalarını yeniden boyutlandırma,Масштабувати текстури моделей, +Precache GL textures,GLTEXMNU_PRECACHETEX,,,,Přednačíst GL textury do cache,Precache GL-teksturer,GL Texturen zwischenspeichern,,Antaŭkaŝmemorigi GL-teksturojn,Precaché de texturas GL,,Kirjoita GL-pintakuvioinnit välimuistiin,Mise en cache des textures,Predmemoriranje GL tekstura,Előcachelt GL textúrák,Precache texture GL,プリキャッシュGLテクスチャー,지엘 텍스쳐 미리 캐싱함,Precache GL texturen,Precache GL-teksturer,Tekstury GL pamięci podręcznej,Precachê de texturas GL,,Preîncărcarcă texturile GL,Кэшировать GL-текстуры,Прикеширане GL текстуре,Precache GL-texturer,GL dokularını önceden önbelleğe alma,Кешувати GL-текстури, +Video Mode,VIDMNU_TITLE,,,,Režim displeje,Videotilstand,Videomodus,Λειτουργία βίντεο,Video-reĝimo,Modos de vídeo,Modos de video,Videotila,Mode Vidéo,Video način,Videó mód,Modalità video,ビデオ調整,화면 설정,Videomodus,Videomodus,Tryb Wideo,Modo de vídeo,,Mod Video,Настройки видеорежима,Видео мод,Videoläge,Video Modu,Налаштування відеорежиму, +Scaled (Nearest),OPTVAL_SCALENEAREST,,,,Škálován (nejbližší),Skaleret (Nærmeste),Skaliert (nächster Nachbar),,Skalita (Plej proksime),Escalado (Lo más cerca),,Skaalattu (läheisin),Mis à l'échelle (Proche Voisin),Skaliran (najbliži),Átméretezett (Közeli),Scalato (più vicino),スケーリング (最寄り),확대 (가깝게),Geschaald (Dichtstbijzijnd),Skalert (nærmeste),Przeskalowany (Najbliższy),Redimensionado (mais próximo),Redimensionado (Apróximado),Redimensionat (Cel mai aproape),Масштабировать (ближайшее),Скалиран (најближи),Skalad (närmast),Ölçeklendirilmiş (En Yakın),Збільшення (ближнє), +Scaled (Linear),OPTVAL_SCALELINEAR,,,,Škálován (lineární),Skaleret (lineær),Skaliert(linear),,Skalita (Linie),Escalado (Lineal),,Skaalattu (lineaarinen),Mis à l'échelle (Linéaire),Skaliran (linearni),Átméretezett (Lineáris),Scalato (lineare),スケーリング (リニア),확대 (선형 식),Geschaald (Lineair),Skalert (lineær),Przeskalowany (Liniowy),Redimensionado (linear),,Redimensionat (Liniar),Масштабировать (линейное),Скалиран (линеарно),Skalad (linjär),Ölçeklendirilmiş (Doğrusal),Збільшення (лінійне), +Letterbox,OPTVAL_LETTERBOX,,,,,,,,Leterkesto,Barras negras,,Mustat reunat,,Crni rubovi,Levágott,Bande nere,レターボックス,레터박스,,,,Barras pretas,,Ecran Parțial,Экранное каше,Поштанско сандуче,Brevlåda,,Техніка каше, +Stretch,OPTVAL_STRETCH,,,,Roztažený,Stræk,Strecken,,Streĉi,Estrechado,Estrecho,Venytetty,Etirer,Rastegnuto,Nyújtott,Disteso,伸縮,늘림,Rek,Strekk,Rozciągnięty,Esticado,,Lărgire,Растянутый,Растегнуто,Sträcka,Esneme,Розтягнутий, +Render Mode,VIDMNU_RENDERMODE,,,,Režim rendereru,Rendertilstand,Rendermodus,,Bildigo-reĝimo,Modo de renderizado,,Hahmonnustila,Mode de Rendu,Način renderiranja,Render Mód,Modalità rendering,レンダラー,렌더링 설정,Rendermodus,Gjengivelsesmodus,Tryb Renderowania,Modo de renderização,,Mod Video,Режим обработки,Рендер мод,Renderläge,İşleme Modu,Режим візуалізації, +Fullscreen,VIDMNU_FULLSCREEN,,,,Přes celou obrazovku,Fuld skærm,Vollbild,Πλήρης οθόνη,Plena ekrano,Pantalla completa,,Koko näyttö,Plein écran,Puni zaslon,Teljes Képernyő,Schermata piena,全画面,전체화면,Volledig scherm,Fullskjerm,Pełen Ekran,Tela cheia,Ecrã cheio,Ecran Complet,Полный экран,Цео екран,Fullskärm,Tam Ekran,Повноекранний, +Retina/HiDPI support,VIDMNU_HIDPI,,,,Podpora Retiny/HiDPI,Retina/HiDPI-understøttelse,Retina/HDPI-Unterstützung,,Retino/HiDPI subteno,Soporte para Retina/HiDPI,,Retina/HiDPI-tuki,Support Retina/HiDPI ,Podrška za Retinu/HiDPI,Retina/HiDPI támogatás,Supporto Retina/HiDPi,Retina/HiDPI サポート,망막/하이DPI 활성화,Retina / HiDPI-ondersteuning,Retina/HiDPI-støtte,Wsparcie Retina/HiDPI,Suporte para Retina/HiDPI,,Suport Retina/HiDPI,Поддержка Retina/HiDPI,Retina/HiDPI подршка,Retina/HiDPI-stöd,Retina/HiDPI desteği,Підтримка Retina/HiDPI, +Aspect ratio,VIDMNU_ASPECTRATIO,,,,Poměr stran,Aspektforhold,Seitenverhältnis,,Ekran-proporcio,Relación de aspecto,,Kuvasuhde,Rapport D'Aspect,Omjer slike,Képarány,Proporzioni,アスペクト比,종횡비,Beeldverhouding,Bildeforhold,Wpółczynnik proporcji,Proporção de tela,Proporção de ecrã,Aspect Imagine,Соотношение сторон,Однос гледишта,Bildförhållande,En boy oranı,Співвідношення сторін, +Force aspect ratio,VIDMNU_FORCEASPECT,,,,Vynutit poměr stran,Tvinge formatforhold,Erzwinge Seitenverhältnis,,Devigi ekran-proporcion,Forzar relación de aspecto,,Pakota kuvasuhde,Forcer Rapport,Forsiraj omjer slike,Képarány kényszerítése,Forza le proporzioni video,アスペクト比に従う,강제 종횡비,Geforceerde beeldverhouding,Tving sideforhold,Wymuś współczynnik proporcji,Forçar proporção de tela,Forçar proporcção de ecrã,Forțează aspectul imaginii,Принудительное соотношение сторон,Присили однос гледишта,Forcerat bildförhållande,Kuvvet en-boy oranı,Примусове співвідношення сторін, +Forced ratio style,VIDMNU_CROPASPECT,,,,Vynucený poměr stran,Stil med tvunget forhold,Modus für erzwungenes Seitenverhältnis,,Stilo por devigita proporcio,Relación de aspecto forzada,,Kuvasuhteen pakotustapa,Style de Ratio forcé,Stil forsiranog omjera,Kényszerített képarány stílusa,Forza lo stile delle proporzioni,比率の形式,강제 비율 스타일,Geforceerde verhoudingsstijl,Tvunget formatforhold-stil,Wymuszony styl współczynnika,Estilo de proporção forçado,,Forțează tipul proporțiilor,Тип принудительного соотношения сторон,Присиљен стил односа,Stil för tvingat förhållande,Zorlanmış oran stili,Тип примусового співвідношення сторін, +Enable 5:4 aspect ratio,VIDMNU_5X4ASPECTRATIO,,,,Povolit poměr stran 5:4,Aktiver 5:4-billedformat,Erlaube 5:4 Seitenverhältnis,,Ŝalti 5:4 ekran-proporcion,Activar relación de aspecto 5:4,,Ota käyttöön 5:4-kuvasuhde,Activer Rapport 5:4,Omogući omjer slike 5:4,5:4 képarány engedélyezése,Abilita le proporzioni 5:4,5:4アスペクト比を可能にする,5:4 비율 사용,Schakel 5:4 beeldverhouding in,Aktiver 5:4 sideforhold,Włącz współczynnik proporcji 5:4,Ativar proporção de tela 5:4,,Activează formatul 5:4,Включить соотношение сторон 5:4,Омогући 5:4 однос гледишта,Aktivera bildförhållandet 5:4,5:4 en boy oranını etkinleştirin,Увімкнути співвідношення сторін 5:4, +Resolution scale,VIDMNU_SCALEMODE,,,,Škálování rozlišení,Opløsningsskala,Skalierung,,Distingivo-skalo,Escala de resolución,,Resoluution skaalaus,Echelle de Résolution,Skaliranje rezolucije,Felbontás mérete,Scala di risoluzione,画面スケール,해상도 크기,Resolutieschaal,Oppløsningsskala,Skala rozdzielczości,Escala de resolução,,Scară rezoluție,Масштабирование,Резолуцијска скала,Upplösningsskala,Çözünürlük ölçeği,Масштабування, +Scale Factor,VIDMNU_SCALEFACTOR,,,,Faktor rozlišení,Skalafaktor,Skalierungsfaktor,,Skalfaktoro,Factor de escala,,Skaalauskerroin,Facteur d'échelle,Factor skaliranja,Méretezési Faktor,Fattore di scala,スケール倍率,축척 펙터,Schaalfactor,Skaleringsfaktor,Współczynnik Skali,Fator de escala,,Factor Scalare,Значение масштаба,Фактор скалирања,Skalfaktor,Ölçek Faktörü,Значення масштабування, +Use Linear Scaling (Fullscreen),VIDMNU_USELINEAR,,,,Použít lineární škálování (přes celou obrazovku),Brug lineær skalering (fuld skærm),Lineare Skalierung (Vollbild),,Uzi linian skaladon (Plenekrane),Usar escalado linear (Pant. completa),,Lineaarinen skaalaus (koko näyttö),Mise à l'échelle Linéaire (Plein écran),Upotrijebi linearno skaliranje (puni zaslon),Lineáris Méretezés Használata (Teljes képernyő),Usa lo scaling lineare (a schermo pieno),リニアスケールを使う(全画面),선형 스케일링 사용 (전체화면),Lineaire schaalverdeling gebruiken (volledig scherm),Bruk lineær skalering (fullskjerm),Użyj Liniowego Skalowania (Pełen Ekran),Usar escala linear (tela cheia),Usar escala linear (ecrã cheio),Folosește Scalarea Liniară (Ecran Complet),Линейное масштабирование (полный экран),Користи линеарно скалирање (цео екран),Använd linjär skalning (helskärm),Doğrusal Ölçeklemeyi Kullan (Tam Ekran),Лінійне масштабування (повний екран), +Custom Pixel Scaling,VIDMNU_CUSTOMRES,,,,Vlastní škálování pixelů,Brugerdefineret pixelskalering,Benutzerdefinierte Skalierung,,Adaptita rastrumero-skalo,Escalado de píxel personalizado,,Mukautettu skaalaus,Résolution Personalisée,Prilagođena širina piksela,Egyéni Pixelméretezés,Scaling dei pixel personalizzato,カスタム ピクセルスケール,사용자 지정 픽셀 크기 조정,Aangepaste pixelschaalvergroting,Egendefinert pikselskalering,Niestandardowe Skalowanie Pikseli,Escala de pixels personalizada,,Scară Pixeli Personalizată,Масштабирование пикселей,Пиксел скалирање,Anpassad pixelskalning,Özel Piksel Ölçeklendirme,Масштабування пікселів, +Custom Width,VIDMNU_CUSTOMX,,,,Vlastní šířka,Brugerdefineret bredde,Benutzerdefinierte Breite,,Adaptita larĝeco,Ancho personalizado,,Mukautettu leveys,Largeur Personalisée,Prilagođena širina,Egyéni szélesség,Lunghezza,カスタム 幅,사용자 지정 너비,Aangepaste breedte,Egendefinert bredde,Niestandardowa Szerokość,Largura personalizada,,Lățime Personalizată,Длина,Ширина,Anpassad bredd,Özel Genişlik,Довжина, +Custom Height,VIDMNU_CUSTOMY,,,,Vlastní výška,Brugerdefineret højde,Benutzerdefinierte Höhe,,Adaptita alteco,Alto personalizado,,Mukautettu korkeus,Hauteur Personalisée,Prilagođena visina,Egyéni magasság,Altezza,カスタム 高さ,사용자 지정 높이,Aangepaste hoogte,Egendefinert høyde,Niestandardowa Wysokość,Altura personalizada,,Înălțime Personalizată,Высота,Висина,Anpassad höjd,Özel Yükseklik,Висота, +Apply Changes (Windowed),VIDMNU_APPLYW,,,,Použít změny (v okně),Anvend ændringer (vindue),Änderungen anwenden (Fenster),,Apliki ŝanĝojn (Fenestrite),Aplicar cambios (Ventana),,Ota käyttöön muutokset (ikkuna),Appliquer Changements (Fenêtre),Primijeni promjene (prozorski),Változtatások Elfogadása (Ablak),Applica le modifiche (a finestra),変更を適用(ウィンドウ化),변경 적용 (윈도우),Wijzigingen toepassen (in venster),Bruk endringer (vindusbasert),Zatwierdź Zmiany (Okno),Aplicar alterações (janela),,Aplică Schimbările (Mod Fereastră),Сохранить изменения (оконный режим),Примени промене (прозор),Tillämpa ändringarna (fönsterskärm),Değişiklikleri Uygula (Pencereli),Зберегти зміни (віконний режим), +Apply Changes (Fullscreen),VIDMNU_APPLYFS,,,,Použít změny (přes celou obrazovku),Anvend ændringer (fuld skærm),Änderungen anwenden (Vollbild),,Apliki ŝanĝojn (Plenekrane),Aplicar cambios (Pant. completa),,Ota käyttöön muutokset (koko näyttö),Appliquer Changements (Plein écran),Primijeni promjene (puni zaslon),Változtatások Elfogadása (Teljes képernyő),Applica le modifiche (a schermo pieno),変更を適用(全画面化),변경 적용 (전체화면),Wijzigingen toepassen (Volledig scherm),Bruk endringer (fullskjerm),Zatwierdź Zmiany (Pełen Ekran),Aplicar alterações (tela cheia),Aplicar alterações (ecrã cheio),Aplică Schimbările (Mod Ecran Complet),Сохранить изменения (полный экран),Примени промене (цели екран),Tillämpa ändringar (helskärm),Değişiklikleri Uygula (Tam Ekran),Зберегти зміни (повноекранний режим), +Choose Resolution Preset,VIDMNU_RESPRESET,,,,Vybrat přednastavené rozlišení,Vælg forindstillet opløsning,Auflösungsvoreinstellung,,Elekti antaŭagorditan distingivon,Elegir resolución predefinida,,Valitse ennalta määritetty resoluutio,Choisir paramètre personalisé,Odaberi unaprijed postavljenu rezoluciju,Felbontási Sablon Kiválasztása,Scegli preset di risoluzione,解像度プリセットを選ぶ,해상도 사전 설정 선택,Kies een vooraf ingestelde resolutie,Velg forhåndsinnstilt oppløsning,Wybierz Zestaw Rozdzielczości,Escolher resolução predefinida,,Alege Rezoluția Predefinită,Выбор шаблона разрешения,Резолуцијска подешавања,Välj förinställning för upplösning,Çözünürlük Ön Ayarını Seçin,Вибір пресету роздільної здатності, +Custom Resolution Presets,VIDMNU_RESPRESETTTL,,,,Vlastní přednastavení rozlišení,Brugerdefinerede opløsningsforudindstillinger,Benutzerdefinierte Auflösungsvoreinstellungen,,Viaj antaŭagorditaj distingivoj,Resoluciones predefinidas personalizadas,,Ennalta määritetyt mukautetut resoluutiot,Résolutions Personalisée,Odaberi unaprijed postavljene rezolucije,Egyéni Felbontási Sablonok,Preset di risoluzione personalizzati,カスタム解像度プリセット,사용자 지정 해상도 미리 조정,Vooraf ingestelde aangepaste resoluties,Egendefinerte forhåndsinnstillinger for oppløsning,Niestandardowe Zestawy Rozdzielczości,Predefinições de resolução personalizadas,,Rezoluții Personalizate,Пользовательские шаблоны,Резолуцијска подешавања,Anpassade förinställningar för upplösning,Özel Çözünürlük Ön Ayarları,Користувацькі пресети, +Preset Resolution Modes,VIDMNU_RESPRESETHEAD,,,,Přednastavená rozlišení,Forindstillede opløsningsmodes,Vordefinierte Auflösungsmodi,,Reĝimoj pri antaŭagordita distingivo,Modos de resolución predefinida,,Ennalta määritetyt resoluutiotilat,Choisir mode de Résolution,Unaprijed postavljeni načini rezolucije,Felbontási Sablon Módok,Modalità preset di risoluzione,解像度モードの調整,해상도 미리 조정 모드,Vooraf ingestelde resolutiemodi,Forhåndsinnstilte oppløsningsmoduser,Tryby Zestawów Rozdzielczości,Modos de resolução predefinidas,,Rezoluții Predefinite,Доступные разрешения,Постављени резолуцијски модови,Förinställda upplösningslägen,Önceden Ayarlanmış Çözünürlük Modları,Доступні роздільні здатності, +4:3 Aspect,VIDMNU_ASPECT43,,,,Poměr stran 4:3,4:3 Aspekt,4:3 Seitenverhältnis,,4:3 proporcio,Aspecto 4:3,,4:3-tilat,Rapport 4:3,Omjer 4:3,4:3 Arány,Aspetto 4:3,アスペクト比 4:3,4:3 비율,Beeldverhouding 4:3,4:3 Aspekt,Proporcje 4:3,Proporção 4:3,,Aspect 4:3,Соотношение сторон 4:3,4:3 гледиште,4:3 aspekt,4:3 Görüntü,Співвідношення сторін 4:3, +5:4 Aspect,VIDMNU_ASPECT54,,,,Poměr stran 5:4,5:4 Aspekt,5:4 Seitenverhältnis,,5:4 proporcio,Aspecto 5:4,,5:4-tilat,Rapport 5:4,Omjer 5:4,5:4 Arány,Aspetto 5:4,アスペクト比 5:4,5:4 비율,Beeldverhouding 5:4,5:4 Aspekt,Proporcje 5:4,Proporção 5:4,,Aspect 5:4,Соотношение сторон 5:4,5:4 гледиште,5:4 Aspekt,5:4 Görüntü,Співвідношення сторін 5:4, +16:9 Aspect,VIDMNU_ASPECT169,,,,Poměr stran 16:9,16:9 Aspekt,16:9 Seitenverhältnis,,16:9 proporcio,Aspecto 16:9,,16:9-tilat,Rapport 16:9,Omjer 16:9,16:9 Arány,Aspetto 16:9,アスペクト比 16:9,16:9 비율,Beeldverhouding 16:9,16:9 Aspekt,Proporcje 16:9,Proporção 16:9,,Aspect 16:9,Соотношение сторон 16:9,16:9 гледиште,16:9 aspekt,16:9 Görüntü,Співвідношення сторін 16:9, +16:10 Aspect,VIDMNU_ASPECT1610,,,,Poměr stran 16:10,16:10 Aspekt,16.10 Seitenverhältnis,,16:10 proporcio,Aspecto 16:10,,16:10-tilat,Rapport 16:10,Omjer 16:10,16:10 Arány,Aspetto 16:10,アスペクト比 16:10,16:10 비율,Beeldverhouding 16:10,16:10 Aspekt,Proporcje 16:10,Proporção 16:10,,Aspect 16:10,Соотношение сторон 16:10,16:10 гледиште,16:10 aspekt,16:10 Aspect,Співвідношення сторін 16:10, +21:9 Aspect,VIDMNU_ASPECT219,,,,Poměr stran 21:9,21:9 Aspekt,21.9 Seitenverhältnis,,21:9 proporcio,Aspecto 21:9,,21:9-tilat,Rapport 21:9,Omjer 21:9,21:9 Arány,Aspetto 21:9,アスペクト比 21:9,21:9 비율,Beeldverhouding 21:9,21:9 Aspekt,Proporcje 21:9,Proporção 21:9,,Aspect 21:9,Соотношение сторон 21:9,21:9 гледиште,21:9 Aspekt,21:9 Görüntü,Співвідношення сторін 21:9, +Normal,OPTVAL_NORMAL,,,,Normální,,,,Normala,,,Normaali,,Normalno,Normál,Normale,通常,기본형,Normaal,,Normalny,,,,Обычный,Нормално,Normal,,Нормальний, +Lowest Possible Scale,OPTVAL_LOWEST,"This describes vid_scalemode 1, which represents the lowest possible scaling to fill the allocated screen area",,,Nejmenší možná velikost,Lavest mulige skala,Kleinstmögliche Auflösung,,Plej malalta ebla skalo,Menor escala posible,,Pienin mahdollinen skaalaus,Echelle la plus faible,Najniže moguće skaliranje,Lehető legkisebb méret,Scala minima,可能な限り最小,,Laagst mogelijk schaal,Lavest mulig skala,Najniższa możliwa skala,Menor escala possível,,Cea mai Mică Scară Posibilă,Наименьший возможный масштаб,,Lägsta möjliga skala,Mümkün Olan En Düşük Ölçek,Найменш можливий масштаб, +Custom,OPTVAL_CUSTOM,,,,Vlastní,Brugerdefineret,Benutzerdefiniert,,Agordita de vi,Personalizado,,Mukautettu,Modifié,Prilagođeno,Egyéni,Personalizzato,カスタム,사용자 지정,Gebruikergedefinieerd,Egendefinert,Niestandardowe,Personalizado,,Personalizat,Польз.,Прилагођ.,Anpassad,Özel,Корист., +Max FPS,VIDMNU_MAXFPS,,,,Maximální FPS,,,,Maksimumaj kadroj laŭ sekundo,Límite de FPS,,Kuvataajuuden rajoitin,,Maks. FPS,,FPS Massimi,最大FPS値,,,Maks FPS,Maksymalna ilość klatek,FPS máximo,,Cadre pe secundă,Максимальная частота кадров,,,Maksimum FPS,Макс. частота кадрів, +60 fps,OPTVAL_60FPS,,,,,,,,,,,60 kuvaa/s,,60 FPS-a,,,,,,,,60 FPS,,,60 к/с,,,,60 кадрів, +75 fps,OPTVAL_75FPS,,,,,,,,,,,75 kuvaa/s,,75 FPS-a,,,,,,,,75 FPS,,,75 к/с,,,,75 кадрів, +90 fps,OPTVAL_90FPS,,,,,,,,,,,90 kuvaa/s,,90 FPS-a,,,,,,,,90 FPS,,,90 к/с,,,,90 кадрів, +120 fps,OPTVAL_120FPS,,,,,,,,,,,120 kuvaa/s,,120 FPS-a,,,,,,,,120 FPS,,,120 к/с,,,,120 кадрів, +144 fps,OPTVAL_144FPS,,,,,,,,,,,144 kuvaa/s,,144 FPS-a,,,,,,,,144 FPS,,,144 к/с,,,,144 кадри, +200 fps,OPTVAL_200FPS,,,,,,,,,,,200 kuvaa/s,,200 FPS-a,,,,,,,,200 FPS,,,200 к/с,,,,200 кадрів, +Preferred Rendering API,VIDMNU_PREFERBACKEND,,,,Upřednostňované renderovací API,Foretrukken Rendering API,Bevorzugtes Render API,Προτιμούμενο Rendering API,Preferita bildigado de API,API de renderizado preferida,,Ensisijainen hahmonnuksen ohjelmointirajapinta,API de rendu préférée,Preferirani API za renderiranje,Előnyben részesített renderelő API,API di rendering preferita,優先レンダリングAPI,기본적인 API 랜더링,Voorkeur rendering API,Foretrukket Rendering API,Preferowany interfejs API renderowania,API de renderização preferida,,API Video Preferat,Предпочтительный API обработки,Преферред АПИ приказивања,Företrädesvis API för rendering,Tercih Edilen Rendering API,Бажаний інтерфейс візуалізації, +OpenGL,OPTVAL_OPENGL,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Vulkan,OPTVAL_VULKAN,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +OpenGL ES,OPTVAL_OPENGLES,Rendering backend,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Miscellaneous Options,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Merge left+right Alt/Ctrl/Shift,MISCMNU_MERGEKEYS,,,,Kombinovat pravý a levý Alt/Ctrl/Shift,Flette venstre+højre Alt/Ctrl/Shift,Linke und rechte Umschalt/Strg/Alt zusammenfassen,,Kunigi maldekstran kaj dekstran Alt/Ctrl/Shift,Combinar Alt/Ctrl/Mayús izq. y der.,Combinar Alt/Ctrl/Shift izq. y der.,Yhdistä vasen ja oikea Alt/Ctrl/Vaihto,Combiner Alt/Ctrl/maj gauche & droite,Spoji lijevo+desno Alt/Ctrl/Shift,Bal és jobb Ctrl/Alt/Shift egyként érzékelése,Unisci sinistra+destra Alt/Control/Maiusc,左と右のALT/CTRL/SHIFTキーを統合,양쪽 ALT/CTRL/SHIFT키 합병,Samenvoegen links+rechts Alt/Ctrl/Shift,Slå sammen venstre+høyre Alt/Ctrl/Shift,Połącz przyciski lewo+prawo Alt/Ctrl/Shift,"Unir as teclas Alt, Ctrl e Shift esquerdos e direitos",Juntar Alt/Ctrl/Shift esquerdo+direito,Combină Alt/Ctrl/Shift stâng+drept,Не различать левую/правую ALT/CTRL/SHIFT,Споји лево+десно Аlt/Ctrl/Shift,Sammanfoga vänster+höger Alt/Ctrl/Shift,Sol+sağ birleştirme Alt/Ctrl/Shift,Не розділяти лівий/правий ALT/CTRL/SHIFT, +Alt-Enter toggles fullscreen,MISCMNU_WINFULLSCREENTOGGLE,,,,Alt-Enter přepíná celou obrazovku,Alt-Enter skifter til fuld skærm,Alt-Enter schaltet Vollbild an/aus,,Alt+Enter baskuligas tutekranan reĝimon,Alt+Enter alterna pantalla completa,,Alt-Enter kytkee täyden ruudun päälle/pois,Alt-Entrée alterne plein écran,Alt-Enter je prekidač za puni zaslon,Alt-Enter teljes képernyőre kapcsol,Alt-Invio attiva/disattiva lo schermo pieno,ALTとENTERで全画面に切り替え,ALT+ENTER키로 전체화면 조정,Alt-Enter schakelt het volledige scherm aan/uit,Alt-Enter veksler til fullskjerm,Alt-Enter przełącza na pełen ekran,Alt+Enter ativa tela cheia,Alt-Enter ativa ecrã cheio,Alt-Enter comută modul ecran complet,Переключение полного экрана по ALT+ENTER,Alt-Enter пребацује на цео екран,Alt-Enter växlar till fullskärm,Alt-Enter tam ekrana geçiş yapar,Перемикання повного екрану на ALT+ENTER, +Command-F toggles fullscreen,MISCMNU_MACFULLSCREENTOGGLE,,,,Command-F přepíná celou obrazovku,Command-F skifter til fuld skærm,Cmd-F schaltet Vollbild an/aus,,Komando-F baskuligas tutekranan reĝimon,Cmd-F alterna pantalla completa,,Komento-F kytkee täyden ruudun päälle/pois,Command-F alterne plein écran,Command-F je prekidač za puni zaslon,Command-F teljes képernyőre kapcsol,Command-F attiva/disattiva lo schermo pieno,Ctrl + Fキーで全画面表示,COMMAND+F키로 전체화면 조정,Command-F schakelt het volledige scherm aan/uit,Kommando-F veksler til fullskjerm,Command-F przełącza pełny ekran,Command+F ativa tela cheia,Command-F ativa ecrã cheio,Command-F comută modul ecran complet,Переключение полного экрана по Cmd+F,Command-F пребацује на цео екран,Command-F växlar till fullskärm,Command-F tam ekrana geçiş yapar,Перемикання повного екрану на Command+F, +Enable autosaves,MISCMNU_ENABLEAUTOSAVES,,,,Povolit automatické ukládání,Aktiver autosaves,Automatisches Speichern,,Ŝalti aŭtomatajn konservojn de ludadoj,Activar autoguardado,,Ota käyttöön automaattiset tallennukset,Activer Sauvegardes auto,Omogući automatska spremanja,Automentések engedélyezése,Abilita i salvataggi automatici,オートセーブを有効化,빠른 저장 허용,Automatisch opslaan inschakelen,Aktiver automatisk lagring,Włącz autozapis,Ativar salvamento automático,Permitir gravação automática,Permite salvări automate,Автосохранения,Омогући аутосејвове,Aktivera autosparande,Otomatik kaydetmeyi etkinleştir,Автозбереження, +Number of autosaves,MISCMNU_AUTOSAVECOUNT,,,,Počet automaticky uložených her,Antal autosaves,Anzahl von automatischen Speicherständen,,Maksimuma kvanto da aŭtomataj konservoj,Cantidad máxima de autoguardados,,Automaattisten tallennusten lukumäärä,Total de sauvegardes auto,Broj automatskih spremanja,Automentések száma,Numero di salvataggi automatici,オートセーブの最大数,빠른 저장 수,Aantal auto-opslagen,Antall autolagringer,Liczba autozapisów,Número de salvamentos automáticos,Número de gravações automáticas,Număr salvări automate,Количество автосохранений,Број аутоматских чувања,Antal autosparande,Otomatik kaydetme sayısı,Кількість автозбрежень, +Save/Load confirmation,MISCMNU_SAVELOADCONFIRMATION,,,,Potvrzení o uložení/načtení,Bekræftelse af gem/indlæsning,Laden/Speichern bestätigen,,Konfirmo de konservo/ŝargo,Confirmación al guardar/cargar,,Tallennuksen/Latauksen vahvistus,Confirmation C/S,Potvrda spremanja/učitavanja,Mentés/betöltés megerősítése,Conferma Salvataggio/Caricamento,セーブ/ロード時に確認,스크립트로 스크린샷 생성 허용,Opslaan/Laad bevestiging,Bekreftelse for lagring/innlasting,Potwierdzenie zapisu/wczytania,Confirmação ao salvar/carregar,Confirmação ao gravar/carregar,Dialog de confirmare la Salvare/Încărcare,Подтверждение при сохранении/загрузке,Потврђивање током чувања/учитавања,Bekräftelse av sparande/laddning,Kaydet/Yükle onayı,Підтвердження при збереженні/завантаженні, +Disable keyboard cheats,MISCMNU_NOCHEATS,,,,Vypnout cheaty z klávesnice,Deaktivere snyderier med tastaturet,Tastatur-Cheats deaktivieren,,Malvalidigi klavarajn trompojn,Desactivar trucos por teclado,,Poista näppäinhuijaukset,Déasctiver les codes de triche au clavier,Onemogući tipkovničke šifre,Billentyűs csalások letiltása,Disabilita i trucchi classici,キーボードからのチート無効,,Schakel cheats uit,Deaktiver tastaturjuks,Wyłącz Oszustwa z Klawiatury,Desativar trapaças de teclado,,Dezactivează codurile din tastatură,Отключить клавиатурные чит-коды,,Inaktivera fusk med tangentbordet,Klavye hilelerini devre dışı bırak,Вимкнути клавіатурні чіт-коди, +Quicksave rotation,MISCMNU_QUICKSAVEROTATION,,,,Rotace rychle uložených her,Quicksave-rotation,Schnellspeicherrotation,,Rotacio de rapidkonservo,Rotación al hacer un guardado rápido,,Pikatallennuskierto,Rotation Sauvegardes Rapides,Brzo spremanje u rotaciji,Gyorsmentés forgás,Rotazione del quicksave,クイックセーブ間隔,빠른 저장 간격,Rouleer snelopslag,Hurtiglagring-rotasjon,Rotacja szybkich zapisów,Rotação de salvamentos rápidos,Rotação de gravações rápidas,Rotație salvări automate,Менять ячейки для быстрых сохранений,Окретање брзих чувања,Rotation av snabbregistrering,Hızlı kaydetme rotasyonu,Чергування слотів швидких збережень, +Number of quicksaves in rotation,MISCMNU_QUICKSAVECOUNT,,,,Počet rychle uložených her v rotaci,Antal quicksaves i rotation,Anzahl Schnellspeicherplätze,,Kvanto da rapidkonservoj en rotaciado,Cantidad de guardados rápidos en rotación,,Pikatallennusten määrä kierrossa,Nombre de sauvegardes en rotation,Broj brzih spremanja u rotaciji,Gyorsmentések száma a forgásban,Numero di quicksave in rotazione,間隔クイックセーブの数,빠른 저장 간격의 수,Aantal roulerende snelopslagplekken,Antall hurtiglagringer i rotasjon,Ilość szybkich zapisów w rotacji,Número de salvamentos rápidos em rotação,Número de gravações rápidas em rotação,Număr salvări rapide în rotație,Кол-во ячеек для быстрых сохранений,Број брзих чувања у окретању,Antal quicksaves i rotation,Rotasyondaki quicksave sayısı,Кількість слотів для швидких збережень, +Disable Menu Clean Scaling,MISCMNU_CLEANMENU,,,,Zakázat čisté škálování nabídek,Deaktivere Menu Clean Scaling,Gleichmäßige Menüskalierung deaktivieren,,Malebligi puran skaladon en la ĉefmenuo,El menú principal ocupa toda la pantalla,,Poista käytöstä valikon siisti skaalautuminen,Ne pas utiliser mise à l'échelle menu propre,Onemogući čisto skaliranje izbornika,Menü Tisztaarányítás kikapcsolása,Disabilita il fattore di scala pulito del menu,メニュー画面を伸縮させない,,Schakel uniforme menuschaling uit,Deaktiver ren skalering av meny,Wyłącz Skalowanie Menu,Desativar escala limpa do menu,,Dezactivează Scara Nouă a Meniurilor,Отключить чистое масштабирование меню,,Inaktivera ren menyskalning,Menü Temiz Ölçeklendirmeyi Devre Dışı Bırak,Вимкнути чисте масштабування меню, +Pause game in background,MISCMNU_PAUSEINBACKGROUND,,,,Pozastavit hru na pozadí,Pause spil i baggrunden,Spiel pausieren wenn im Hintergrund,,Paŭzigi ludon fone,Pausar el juego en segundo plano,,Pysäytä peli taustalla,Mettre le jeu en pause en arrière-plan,Pauziraj igru u pozadini,Játék megállítása a háttérben,Pausa il gioco in background,バックグラウンド時に一時停止,백그라운드에서 게임 일시 중지,Pauzeer het spel op de achtergrond,Pauser spillet i bakgrunnen,Zapauzuj grę w tle,Pausar jogo ao minimizar,,Pauză dacă jocul este minimizat.,Пауза при сворачивании окна,Паузирајте игру у позадини,Pausa spelet i bakgrunden,Oyunu arka planda duraklat,Пауза при згортуванні вікна, +Default Crosshair,HUDMNU_CROSSHAIR,,,,Výchozí zaměřovač,Standardtrådkorset,Standard-Fadenkreuz,,Defaŭlta reteto,Retícula por defecto,,Oletustähtäin,Viseur par défaut,Zadani ciljnik,Alap célkereszt,Mirino di default,デフォルトの照準,기본 조준점,Standaard dradenkruis,Standard trådkors,Domyślny celownik,Mira padrão,,Țintă implicită,Прицел по умолчанию,Уобичајени нишан,Standardkorshår,Varsayılan Nişangah,Типи прицілів, +Crosshair color,HUDMNU_CROSSHAIRCOLOR,,,Crosshair colour,Barva zaměřovače,Trådkors farve,Fadenkreuzfarbe,,Retetokoloro,Color de la retícula,,Tähtäimen väri,Couleur Viseur,Boja ciljnika,Célkereszt színe,Colore mirino,照準色,조준점 색깔,Dradenkruis kleur,Farge på trådkors,Kolor celownika,Cor da mira,,Culoare țintă,Цвет прицела,Боја нишана,Färg på hårkorset,Nişangah rengi,Колір прицілу, +Crosshair shows health,HUDMNU_CROSSHAIRHEALTH,,,,Zaměřovač zobrazuje zdraví,Trådkors viser helbred,Fadenkreuz zeigt Gesundheit,,Reteto montras sanon,Mostrar salud en retícula,,Tähtäin näyttää terveyden,Couleur Viseur selon santé,Ciljnik prikazuje zdravlje,Életerő jelzése a célkereszten,Il mirino mostra la salute,照準のヘルス表示,조준점과 체력 연동,Dradenkruis toont gezondheid,Trådkorset viser helse,Celownik pokazuje zdrowie,Exibir saúde na mira,Mostra vida na mira,Ținta afișează starea sănătății,Прицел отображает здоровье,Нишан приказује здравље,Hårkorset visar hälsa,Artı işareti sağlığı gösterir,Колір прицілу за станом здоров'я, +Scale crosshair,HUDMNU_CROSSHAIRSCALE,,,,Velikost zaměřovače,Skalerer trådkorset,Fadenkreuz skalieren,,Skali reteton,Escalar retícula,,Skaalaa tähtäintä,Mise à l'échelle du viseur,Skaliranje ciljnika,Célkereszt mérete,Fattore di scala del mirino,照準サイズ,조준점 크기,Dradenkruis schalen,Skalere trådkors,Skala celownika,Redimensionar mira,,Dimensiune țintă,Размер прицела,Размера нишана,Skala hårkorset,Ölçekli artı işareti,Розмір прицілу, +Standard,OPTVAL_YES_STANDARD,copied from elsewhere,,,Standardní,,,Πρότυπο,Norma,Estándar,,Normaali,,Standardno,Alap,,標準,기본,Standaard,,,Padrão,,,Стандартный,Стандардни,,Standart,Стандартний, +Enhanced,OPTVAL_YES_ENHANCED,,,,Vylepšené,Forbedret,Verbessert,Ενισχυομένο,Bonigita,Mejorado,,Paranneltu,Amélioré,Poboljšano,Fejlesztett,Migliorata,強調,고급,Verbeterd,Forbedret,Ulepszone,Melhorado,,Îmbunătățită,Улучшенный,Побољшани,Förbättrad,Geliştirilmiş,Покращений, +Language,OPTMNU_LANGUAGE,,,,Jazyk,Sprog,Sprache,Γλώσσα,Lingvo,Idioma,,Kieli,Langage,Jezik,Nyelv,Lingua,言語設定,언어,Taal,Språk,Język,Idioma,,Limbă,Язык,Језик,Språk,Dil,Мова, +,,Reverb editor,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Undo Changes,TXT_UNDOCHANGES,,,,Zrušit změny,Fortryd ændringer,Rückgängig machen,Αναίρεση Αλλαγών,Malfari ŝanĝojn,Anular cambios,,Peruuttaa muutokset,Révoquer les changements,Poništi promjene,Változtatások Visszavonása,Revocare le modifiche,変更を戻す,변경 사항 취소,Wijzigingen ongedaan maken,Angre endringer,Cofnij Zmiany,Desfazer alterações,,Anulează Modificările,Отменить изменения,Поништи промене,Ångra ändringar,Değişiklikleri Geri Al,Відмінити зміни, +Select Environment,REVMNU_SELECT,,,,Vybrat prostředí,Vælg miljø,Umgebung wählen,Επιλογή Περιβάλλοντος,Elekti medion,Seleccionar ambiente,,Valitse tila,Sélectionner un environnement,Odaberi okoliš,Környezet Kiválasztása,Seleziona ambiente,反響選択,환경 선택,Selecteer omgeving,Velg miljø,Wybierz Środowisko,Selecione o ambiente,,Alegere Mediu,Выбрать окружение,Изабери окружење,Välj miljö,Ortam Seçiniz,Вибрати оточення, +Test Environment,REVMNU_TEST,,,,Testovat prostředí,Test miljø,Umgebung testen,Δοκιμαστκό Περιβάλλον,Provi medion,Probar ambiente,,Testaa tilaa,Tester un environnement,Testiraj okoliš,Környezet Tesztelése,Testa ambiente,反響テスト,환경 테스트,Test omgeving,Test miljø,Testuj Środowisko,Testar ambiente,,Testare Mediu,Проверка окружения,Тестирај окружење,Testa miljön,Test Ortamı,Тестувати оточення, +Edit Environment,REVMNU_EDIT,,,,Upravit prostředí,Rediger miljø,Umgebung editieren,Επεξεργασία Περιβάλλοντος,Modifi medion,Editar ambiente,,Muokkaa tilaa,Modifier un environnement,Uredi okoliš,Környezet Szerkesztése,Modifica ambiente,反響編集,환경 편집,Omgeving bewerken,Rediger miljø,Edytuj Środowisko,Editar ambiente,,Editare Mediu,Редактировать окружение,Уреди окружење,Redigera miljön,Ortamı Düzenle,Редагувати оточення, +New Environment,REVMNU_NEW,,,,Nové prostředí,Nyt miljø,Neue Umgebung,Νέο Περιβάλλον,Nova medio,Nuevo ambiente,,Uusi tila,Nouveau environnement,Novi okoliš,Új Környezet,Nuovo ambiente,新規反響設定,새로운 환경 생성,Nieuwe omgeving,Nytt miljø,Nowe Środowisko,Novo ambiente,,Mediu Nou,Новое окружение,Ново окружење,Ny miljö,Yeni Çevre,Нове оточення, +Revert settings,REVMNU_REVERT,,,,Obnovit nastavení,Tilbageføre indstillinger,Zurücksetzen,Επαναφορά Ρυθμίσεων,Malfari agordojn,Revertir configuración,,Palauta asetukset,Réinitialiser les paramètres,Povrati postavke,Változtatások elvetése,Ripristina le impostazioni,設定を戻す,설정 되돌리기,Instellingen terugzetten,Tilbake innstillinger,Przywróć ustawienia,Reverter configurações,,Revenire la setările precedente,Сбросить настройки,Врати подешавања,Återkalla inställningar,Ayarları geri döndür,Налаштування за замовчуванням, +Environment Size,REVMNU_ENVIRONMENT_SIZE,Please translate only if you know how to properly name this technical jargon!,,,,,,Μέγεθος Περιβάλλοντος,Mediamplekso,Tamaño de ambiente,,Tilan koko,Taille Environnement,Veličina okoliša,,Dimensioni dell'ambiente,反響サイズ,공간 크기,,,Rozmiar Środowiska,Tamanho do ambiente,,,,,Miljö storlek,,, +Environment Diffusion,REVMNU_ENVIRONMENT_DIFFUSION,,,,,,,Διάχυση Περιβάλλοντος,Medidifuzo,Difusión de ambiente,,Tilan äänen hajautuminen,Diffusion Environnement,Difuzija okoliša,,Diffusione dell'ambiente,反響伝播,공간 잔향 확산,,,Dyfuzja Środowiska,Difusão do ambiente,,,,,Miljö spridning,,, +Room,REVMNU_ROOM,,,,,,,Δωμάτιο,Ĉambro,Sala,,Tilan keskitaajuudet,Salle,Soba,,,,룸 효과,,,Pokój,Sala,,,,,,,, +Room HF,REVMNU_ROOM_HF,,,,,,,Δωμάτιο HF,Ĉambro (AF),Sala (Frecuencia alta),,Tilan korkeat taajuudet,HF Salle,Soba visoke frekvencije,,,,룸 효과 HF,,,Pokój (wysokie częstotliwości),Sala (alta frequência),,,,,,,, +Room LF,REVMNU_ROOM_LF,,,,,,,Δωμάτιο LF,Ĉambro (MaF),Sala (Frecuencia baja),,Tilan matalat taajuudet,LF Salle,Soba niske frekvencije,,,,룸 효과 LF,,,Pokój (niskie częstotliwości),Sala (baixa frequência),,,,,,,, +Decay Time,REVMNU_DECAY_TIME,,,,,,,,Putriĝo-tempo,Tiempo de decadencia,,Häipymäaika,Temps Decay,Vrijeme raspadanja,,,,잔향 감쇠 시간,,,Czas Rozkładu,Tempo de decaimento,,,,,,,, +Decay HF Ratio,REVMNU_DECAY_HF_RATIO,,,,,,,,Putriĝo-proporcio (AF),Ratio de decadencia (Frecuencia alta),,Korkeiden taajuuksien (HF) häipymissuhdeluku,,Omjer raspadanja visoke frekvencije,,,Decay HF比率,잔향 감쇠 HF 비율,,,Wskażnik Rozkładu dla wysokich częstotliwości,Taxa de decaimento (alta freq.),,,,,,,, +Decay LF Ratio,REVMNU_DECAY_LF_RATIO,,,,,,,,Putriĝo-proporcio (MaF),Ratio de decadencia (Frecuencia baja),,Matalien taajuuksien (LF) häipymissuhdeluku,,Omjer raspadanja niske frekvencije,,,Decay LF比率,잔향 감쇠 LF 비율,,,Wskaźnik Rozkładu dla niskich częstotliwości,Taxa de decaimento (baixa freq.),,,,,,,, +Reflections,REVMNU_REFLECTIONS,,,,,,,Αντανακλάσεις,Reflektoj,Reflejos,,Ensiheijastukset,,Odrazi,,,,룸 반사,,,Obicia,Reflexos,,,,,,,, +Reflections Delay,REVMNU_REFLECTIONS_DELAY,,,,,,,Καθυστέρηση Αντανακλάσεων,Prokrasto de reflektoj,Retraso de reflejos,,Ensiheijastusten viive,Délai Reflections,Kašnjenje odraza,,,,룸 반사 딜레이 시간,,,Opóźnienie Odbić,Atraso de reflexos,,,,,,,, +Reflections Pan X,REVMNU_REFLECTIONS_PAN_X,,,,,,,,Reflektoj alturnas tra X,Desplazamiento en X de reflejos,,Ensiheijastusten X-panorointi,Orientation Reflections X,Kretanje odraza X,,,Reflections X定位,X축 룸 반사,,,Odbicia Osi X,Deslocamento X de reflexos,,,,,,,, +Reflections Pan Y,REVMNU_REFLECTIONS_PAN_Y,,,,,,,,Reflektoj alturnas tra Y,Desplazamiento en Y de reflejos,,Ensiheijastusten Y-panorointi,Orientation Reflections Y,Kretanje odraza Y,,,Reflections Y定位,Y축 룸 반사,,,Odbicia Osi Y,Deslocamento Y de reflexos,,,,,,,, +Reflections Pan Z,REVMNU_REFLECTIONS_PAN_Z,,,,,,,,Reflektoj alturnas tra Z,Desplazamiento en Z de reflejos,,Ensiheijastusten Z-panorointi,Orientation Reflections Z,Kretanje odraza Z,,,Reflections Z定位,Z축 룸 반사,,,Odbicia Osi Z,Deslocamento Z de reflexos,,,,,,,, +Reverb,REVMNU_REVERB,,,,,,,,Resono,Reverberación,,Jälkikaiunta,,Odjekivanje,,,,리버브,,,Pogłos,Reverberação,,,,,,,, +Reverb Delay,REVMNU_REVERB_DELAY,,,,,,,,Prokrasto de resono,Retraso de reverberación,,Jälkikaiunnan viive,Délai Reverb,Kašnjenje odjekivanja,,,,리버브 지연,,,Opóźnienie Pogłosu,Atraso de reverberação,,,,,,,, +Reverb Pan X,REVMNU_REVERB_PAN_X,,,,,,,,Resono alturnas tra X,Desplazamiento en X de reverberación,,Jälkikaiunnan X-panorointi,Orientation Reverb X,Kretanje odjekivanja X,,,Reverb X定位,X축 리버브,,,Pogłos Osi X,Deslocamento X de reverberação,,,,,,,, +Reverb Pan Y,REVMNU_REVERB_PAN_Y,,,,,,,,Resono alturnas tra Y,Desplazamiento en Y de reverberación,,Jälkikaiunnan Y-panorointi,Orientation Reverb Y,Kretanje odjekivanja Y,,,Reverb Y定位,Y축 리버브,,,Pogłos Osi Y,Deslocamento Y de reverberação,,,,,,,, +Reverb Pan Z,REVMNU_REVERB_PAN_Z,,,,,,,,Resono alturnas tra Z,Desplazamiento en Z de reverberación,,Jälkikaiunnan Z-panorointi,Orientation Reverb Z,Kretanje odjekivanja Z,,,Reverb Z定位,Z축 리버브,,,Pogłos Osi Z,Deslocamento Z de reverberação,,,,,,,, +Echo Time,REVMNU_ECHO_TIME,,,,,,,,Tempo de eĥo,Tiempo de eco,,Kaikuaika,Longueur écho,Vrijeme jeke,,,,에코 시간,,,Czas Echa,Tempo de eco,,,,,,,, +Echo Depth,REVMNU_ECHO_DEPTH,,,,,,,,Produndo de eĥo,Profundidad de eco,,Kaiun syvyys,Profondeur écho,Dubina jeke,,,,에코 깊이,,,Głębokość Echa,Profundidade de eco,,,,,,,, +Modulation Time,REVMNU_MODULATION_TIME,,,,,,,,Tempo de modulado,Tiempo de modulación,,Modulaatioaika,Longueur Modulation,Vrijeme modulacije,,,,전조 시간,,,Czas Modulacji,Tempo de modulação,,,,,,,, +Modulation Depth,REVMNU_MODULATION_DEPTH,,,,,,,,Produndo de modulado,Profundidad de modulación,,Modulaation syvyys,Profondeur Modulation,Dubina modulacije,,,,전조 깊이,,,Głębokość Modulacji,Profundidade de modulação,,,,,,,, +Air Absorption HF,REVMNU_AIR_ABSORPTION_HF,,,,,,,,Aer-absorbo AF,Absorción en aire de frecuencia alta,,Korkeiden taajuuksien (HF) ilma-absorptio,,Apsorpcija zraka visoke frekvencije,,,,대기 흡수 HF,,,Absorbcja Powietrza (wysokie częstotliwości),Absorção de ar de alta freq.,,,,,,,, +HF Reference,REVMNU_HF_REFERENCE,,,,,,,,AF referenco,Referencia de frecuencia alta,,Korkeiden taajuuksien vertausarvo,,Referenca visoke frekvencije,,,HF参照値,HF 참조치,,,Odniesienie wysokich częstotliwości,Referência de alta freq.,,,,,,,, +LF Reference,REVMNU_LF_REFERENCE,,,,,,,,MaF referenco,Referencia de frecuencia baja,,Matalien taajuuksien vertausarvo,,Referenca niske frekvencije,,,LF参照値,LF 참조치,,,Odniesienie niskich częstotliwości,Referência de baixa freq.,,,,,,,, +Room Rolloff Factor,REVMNU_ROOM_ROLLOFF_FACTOR,,,,,,,,Ĉambro-Rolloff-faktoro,Factor de Roll-off de sala,,Tilan vaimenemiskerroin,Facteur de rolloff Salle,Faktor opadanja prostorije,,,,룸 감쇠 양,,,Czynnik Zejścia,Fator de roll-off de sala,,,,,,,, +Diffusion,REVMNU_DIFFUSION,,,,,,,,Difuzo,Difusión,,Diffuusio,,Difuzija okoliša,,,,잔향 확산,,,Dyfuzja,Difusão,,,,,,,, +Density,REVMNU_DENSITY,,,,,,,,Denseco,Densidad,,Tiheys,Densité,Gustoća,,,密度,잔향 밀도,,,Zagęszczenie,Densidade,,,,,,,, +Reflections Scale,REVMNU_Reflections_Scale,,,,,,,,Skalo de reflektoj,Escala de reflejos,,Ensiheijastusten skaala,Echelle Reflections,Skaliranje odraza,,,Reflections音階,룸 반사 음계,,,Rozmiar Odbić,Escala de reflexos,,,,,,,, +Reflections Delay Scale,REVMNU_Reflections_Delay_Scale,,,,,,,,Prokrastskalo de reflektoj,Escala de retraso de reflejos,,Ensiheijastusten viiveen skaala,Délai d'échelle reflections,Kašnjenje skaliranja odraza,,,Reflections Delay音階,룸 반사 딜레이 음계,,,Skala Opóźnienia Odbić,Escala de atraso de reflexos,,,,,,,, +Decay Time Scale,REVMNU_Decay_Time_Scale,,,,,,,,Tempskalo de purtiĝo,Escala de tiempo de decadencia,,Häipymäajan skaala,Echelle temporelle Decay,Skaliranje vremena raspadanja,,,Decay Time音階,잔향 감쇠시간 음계,,,Skala Czasu Rozkładu,Escala de tempo de decaimento,,,,,,,, +Decay HF Limit,REVMNU_Decay_HF_Limit,,,,,,,,AF-Limito de purtiĝo,Limite de decadencia de alta frecuencia,,Häipymän korkeiden taajuuksien raja-arvo,Limite HF Decay,Ograničenje raspadanja visoke frekvencije,,,Decay HF限度,잔향 감쇠 HF 한도,,,Limit Rozkładu Wysokich Częstotliwości,Limite de decaimento em alta freq.,,,,,,,, +Reverb Scale,REVMNU_Reverb_Scale,,,,,,,,Skalo de resono,Escala de reverberación,,Jälkikaiunnan skaala,Echelle Reverb,Skaliranje odjekivanja,,,Reverb音階,리버브 음계,,,Skala Pogłosu,Escala de reverberação,,,,,,,, +Reverb Delay Scale,REVMNU_Reverb_Delay_Scale,,,,,,,,Prokrastskalo de resono,Escala de retraso de reverberación,,Jälkikaiunnan viiveen skaala,Délai d'échelle Reverb,Kašnjenje skaliranja odjekivanja,,,Reverb Delay音階,리버브 딜레이 음계,,,Skala Opóźnienia Pogłosu,Escala de atraso de reverberação,,,,,,,, +Echo Time Scale,REVMNU_Echo_Time_Scale,,,,,,,,Tempskalo de eĥo,Escala de tiempo de eco,,Kaikuajan skaala,Echelle temporelle Echo,Skaliranje vremena jeke,,,Echo Time音階,에코 시간 음계,,,Skala Czasu Echa,Escala de tempo de eco,,,,,,,, +Modulation Time Scale,REVMNU_Modulation_Time_Scale,,,,,,,,Tempskalo de modulado,Escala de tiempo de modulación,,Modulaatioajan skaala,Echelle temporelle Modulation,Skaliranje vremena modulacije,,,Modulation Time音階,전조 시간 음계,,,Skala Modulacji Czasu,Escala de tempo de modulação,,,,,,,, +Based on,REVMNU_Based_on,,,,Založeno na,Baseret på,Basierend auf,Βασισμένο σε,Bazita de,Basado en,,Perustana,Basé sur,Bazirano na,Minta,Basato su,音響の元,음향 원본,Gebaseerd op,Basert på,Bazowane na,Baseado em,,Bazat pe,Основано на,Засновано на,Baserat på,Buna göre,На основі, +Name,REVMNU_Name,,,,Název,Navn,,Όνομα,Nomo,Nombre,,Nimi,Nom,Naziv,Név,Nome,名前,이름,Naam,Navn,Nazwa,Nome,,Nume,Название,Назив,Namn,İsim,Назва, +ID #1,REVMNU_ID_1,,,,,,,,Identigo #1,ID Nº1,,,,,,ID N°1,,아이디 #1,,,,,,,ИД №1,,,,, +ID #2,REVMNU_ID_2,,,,,,,,Identigo #2,ID Nº2,,,,,,ID N°2,,아이디 #2,,,,,,,ИД №2,,,,, +Create,REVMNU_Create,,,,Vytvořit,Opret,Erstellen,Δημιουργία,Krei,Crear,,Luo,Créer,Stvori,Készítés,Creare,作成,생성,Aanmaken,Opprett,Stwórz,Criar,,Creare,Создать,Направи,Skapa,Oluştur,Створити, +Save...,REVMNU_Save,,,,Uložit...,Gem...,Speichern...,Αποθήκευση,Konservi...,Guardar...,,Tallenna...,Sauvegarder...,Spremi...,Mentés...,Salvare...,セーブする...,저장 하기...,Opslaan...,Lagre...,Zapisz...,Salvar...,,Salvare...,Сохранить...,Сачувај...,Spara...,Kaydet...,Зберегти..., +File name,REVMNU_File_name,,,,Název souboru,Filnavn,Dateiname,Όνομα αρχείου,Dosiernomo,Nombre de archivo,,Tiedostonimi,Nom de fichier,Naziv datoteke,Fájlnév,Nome del file,ファイル名,파일 이름,Bestandsnaam,Filnavn,Nazwa pliku,Nome do arquivo,,Nume fișier,Имя файла,Назив фајла,Filnamn,Dosya adı,Назва файлу, +Environments to save,REVMNU_Environments_to_save,,,,Prostředí k uložení,"Miljøer, der skal gemmes",Zu speichernde Umgebungen,Περιβάλλοντα για αποθήκευση,Medioj por konservi,Ambientes para guardar,,Tallennettavat tilat,Environnements à sauvegarder,Okoliši za spremiti,Mentendő Környezetek,Ambienti da salvare,音響を保存,저장할 공간,Omgevingen om op te slaan,Miljøer som skal lagres,Środowiska do zapisu,Ambientes para salvar,,Medii de salvat,Сохранить окружения...,Окружења за чување,Miljöer som ska sparas,Kurtarılacak ortamlar,Зберегти оточення..., +,,Vulkan,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Vulkan Options (Experimental),DSPLYMNU_VKOPT,,,,Nastavení Vulkanu (Experimentální),Vulkan-indstillinger (eksperimentelt),Vulkan Optionen (Experimentell),Vulka Ρυθμίσεις (Πειραματικές),Agordoj por Vulkan (Eksperimenta),Opciones de Vulkan (Experimental),,Vulkan-asetukset (kokeellinen),Options Vulkan (Expérimental),Postavke Vulkana (eksperimentalno),Vulkan Beállítások (Kísérleti),Opzioni Vulkan (Sperimentale),Vulkan機能オプション(実験的),벌칸 설정(실험적),Vulkan-opties (Experimenteel),Vulkan Alternativer (Eksperimentell),Opcje Vulkan (Eksperymentalne),Opções de Vulkan (experimental),,Setări Mod Vulkan (În curs de testare),Настройки Vulkan (экспериментальные),Vulkan подешавања (експериментална),Vulkan-alternativ (experimentellt),Vulkan Seçenekleri (Deneysel),Налаштування Vulkan (експериментальні), +Vulkan Options,VK_TITLE,,,,Nastavení Vulkanu,Vulkan-indstillinger,Vulkan Optionen,Vulkan Ρυθμίσεις,Agordoj por Vulkan,Opciones de Vulkan,,Vulkan-asetukset,Options Vulkan,Postavke Vulkana,Vulkan Beállítások,Opzioni Vulkan,Vulkan機能オプション,벌칸 설정,Vulkan-opties,Vulkan-alternativer,Opcje Vulkan,Opções de Vulkan,,Setări Mod Vulkan,Настройки Vulkan,Vulkan подешавања,Vulkan-alternativ,Vulkan Seçenekleri,Налаштування Vulkan, +Enable Vulkan,VKMNU_ENABLE,,,,Povolit Vulkan,Aktiver Vulkan,Aktiviere Vulkan,Ενεργοποιηση του Vulkan,Ŝalti Vulkan,Activar Vulkan,,Ota käyttöön Vulkan,Activer Vulkan,Omogući Vulkan,Vulkan Engedélyezése,Abilita Vulkan,Vulkanを有効化,벌칸 렌더러 사용,Vulkan inschakelen,Aktiver Vulkan,Włącz Vulkan,Ativar Vulkan,,Activează modul video Vulkan,Использовать Vulkan,Омогући Vulkan,Aktivera Vulkan,Vulkan'ı Etkinleştir,Увімкнути Vulkan, +Vulkan Device ID,VKMNU_DEVICE,,,,ID zařízení Vulkanu,Vulkan-enheds-id,Vulkan Geräte ID,Vulkan ID Συσκευής,Identigo de Vulkan-aparato,ID de dispositivo Vulkan,,Vulkan-laitetunniste,ID du périphérique Vulkan,ID uređaja Vulkan,Vulkan Eszköz ID,Dispositivo ID Vulkan,Vulkanデバイス ID,벌칸 장치 아이디,Vulkan apparaat-ID,Vulkan Enhets-ID,ID urządzenia Vulkan,ID do dispositivo Vulkan,,ID Dispozitiv Vulkan,ИД устройства Vulkan,Vulkan ID уређаја,Vulkan-enhets-ID,Vulkan Cihaz Kimliği,ID пристрою Vulkan, +High Dynamic Range,VKMNU_HDR,,,,Vysoký dynamický rozsah (HDR),Høj dynamisk rækkevidde,,Υψηλό Δυναμική Εμβέλεια,Alta dinamika intervalo,Alto rango dinámico,,Korkea dynamiikka-alue (HDR),,Visoki dinamički raspon (HDR),,,ハイダイナミックレンジ,하이 다이나믹 레인지,Hoog dynamisch bereik,Høyt dynamisk område,Obraz HDR,Alto alcance dinâmico (HDR),,HDR,Расширенный динамический диапазон (HDR),HDR,Högt dynamiskt omfång,Yüksek Dinamik Aralık,HDR, +Warning: The Vulkan renderer is highly experimental!,VK_WARNING,,,,Varování: Vulkan renderer je velmi experimentální!,Advarsel: Vulkan-rendereren er meget eksperimentel!,Achtung: Der Vulkan Renderer ist noch sehr experimentell!,Προειδοποίηση: Ο Vulkan renderer είναι υψηλά πειραματικός!,Averto: La bildigilo de Vulkan estas alte eksperimenta!,Advertencia: ¡El renderizado por Vulkan es altamente experimental!,,Varoitus: Vulkan-hahmonnin on hyvin kokeellinen!,Attention: Le moteur de rendu Vulkan est très expérimental!,Upozorenje: Vulkan renderer je jako eksperimentalan!,Vigyázat: A Vulkan renderer még teljesen kísérleti!,Attenzione: il motore grafico Vulkan è altamente sperimentale!,警告:Vulkanレンダラーは実験段階です!,경고: 벌칸 렌더러는 매우 실험적입니다!,Waarschuwing: De Vulkan renderer is zeer experimenteel!,Advarsel: Vulkan-rendereren er svært eksperimentell!,Uwaga: Renderer Vulkan jest bardzo eksperymentalny!,Atenção: o renderizador Vulkan é altamente experimental!,,Atenție: Modul Vulkan este încă în curs de testare!,Внимание: обработчик Vulkan в стадии тестирования!,УПОЗОРЕЊЕ: Vulkan рендерер је врло експерименталан!,Varning: Vulkan-renderaren är mycket experimentell!,Uyarı: Vulkan işleyici son derece deneyseldir!,Увага: рендер Vulkan на стадії тестування!, +These options will require a restart to take effect.,VK_RESTART,,,,Tato nastavení vyžadují restart hry.,Disse indstillinger kræver en genstart for at få effekt.,Diese Option erfordert einen Neustart!,Αυτές η ρυθμίσεις θα χρειαστούνε επανεκκίνηση για να ισχύσουν,Ĉi tiuj agordoj bezonos relanĉon por efikiĝi.,Estas opciones requieren reiniciar para tener efecto.,,Nämä asetukset vaativat uudelleenkäynnistyksen astuakseen voimaan.,Ces options nécessitent un redémarrage.,Ove postavke će zahtijevati ponovno pokretanje kako bi stupile na snagu.,Ezen beállítások életbelépéséhez újraindítás szükséges.,Queste opzioni richiedono il riavvio per avere effetto.,これらのオプションを有効にするには再起動が必要です。,이 설정을 적용하려면 게임을 재시작해야 합니다.,Deze opties vereisen een herstart om van kracht te worden.,Disse alternativene krever en omstart for å tre i kraft.,"Te opcje będą wymagały ponownego włączenia, aby miały efekt.",É necessário reiniciar para que essas configurações surtam efeito.,É necessário reiniciar para estas configurações fazerem efeito.,Aceste setări necesită o repornire pentru a putea fi aplicate,Для применения этих изменений требуется перезапуск игры.,Морате поново покренути GZDoom да би промене ступиле на снагу.,De här alternativen kräver en omstart för att få effekt.,Bu seçeneklerin etkili olması için yeniden başlatılması gerekecektir.,Для застосування змін протрібно перезапустити гру., +Select Vulkan Device,VKMNU_DEVICESELECT,This is not yet implemented - but it is planned,,,Vybrat zařízení Vulkanu,Vælg Vulkan-enhed,Vulkan Gerät auswählen,Επιλογή Vulkan Συσκευής,Elekti Vulkan-aparaton,Seleccionar dispositivo Vulkan,,Valitse Vulkan-laite,Sélectionner périphérique Vulkan,Odaberi uređaj Vulkana,Vulkan eszköz kiválasztása,Seleziona il Dispositivo Vulkan,Vulkanデバイスの選択,벌칸 장치를 고르시오,Selecteer Vulkan Apparaat,Velg Vulkan-enhet,Wybierz Urządzenie Vulkan,Selecione o dispositivo Vulkan,,Selectare Dispozitiv Vulkan,Выбрать устройство Vulkan,Изаберите Vulkan уређај,Välj Vulkan-enhet,Vulkan Aygıtını Seçin,Виберіть пристрій Vulkan, +,,Texture scaling,,,,,,,,,,,,,,,,,,,,,,,,,,,, +ScaleNx,OPTVAL_SCALENX,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +NormalNx,OPTVAL_NORMALNX,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +hqNx,OPTVAL_HQNX,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +hqNx MMX,OPTVAL_HQNXMMX,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +xBRZ,OPTVAL_NXBRZ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Old xBRZ,OPTVAL_OLD_NXBRZ,,,,xBRZ (starší),Gamle xBRZ,xBRZ alt,Παλίο xBRZ,Malnova xBRZ,Antiguo xBRZ,,Vanha xBRZ,Ancien xBRZ,Stari xBRZ,Régi xBRZ,Vecchio xBRZ,旧xBRZ,구형 xBRZ,Oud xBRZ,Gammel xBRZ,Stare xBRZ,Antigo xBRZ,,Vechiul xBRZ,Старый xBRZ,Стари xBRZ,Gamla xBRZ,Eski xBRZ,Старий xBRZ, +,,Option Search,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Option Search,OS_TITLE,,,,Vyhledávání možností,Mulighed Søgning,Optionssuche,Αναζήτηση Ρυθμίσεων,Serĉi agordojn,Buscar opciones,,Asetushaku,Recherche Option,Traženje postavke,Beállítások keresése,Opzioni di ricerca,オプション検索,옵션 검색,Optie zoeken,Alternativt søk,Szukanie Opcji,Buscar opção,Procurar opção,Căutare Setări,Поиск настройки,Претрага,Sökning av alternativ,Seçenek Arama,Пошук налаштування, +Search for any term,OS_ANY,,,,Hledat jakékoli klíčové slovo,Søg efter et vilkårligt begreb,Suche nach beliebigem Begriff,Αναζήτηση για όποιαδηποτε λέξη,Serĉi iun ajn terminon,Buscar cualquier término,,Etsi mitä tahansa sanaa,N'importe quel mot,Potraži bilo koji pojam,Keresés bármely kifejezésre,Cerca per ciascun termine,いずれかの用語を探す,용어 검색,Zoek naar eender welke term,Søk etter en hvilken som helst term,Szukaj jakiegokolwiek wyrażenia,Buscar por qualquer termo,Procurar por um termo qualquer,Căutare după orice termen,Искать любое из слов,Тражи било који термин,Sök efter valfri term,Herhangi bir terim için arama yapın,Шукати будь яке з слів, +Search for all terms,OS_ALL,,,,Hledat všechna klíčová slova,Søg efter alle udtryk,Suche nach allen Begriffen,Αναζήτηση για όλες της λέξεις,Serĉi ĉiujn terminojn,Buscar todos los términos,,Etsi kaikki sanat,Tous les mots,Potraži sve pojmove,Keresés minden kifejezésre,Cerca per tutti i termini,全ての用語を探す,모든 조건 검색,Zoek naar alle termen,Søk etter alle termer,Szukaj wszystkich wyrażeń,Buscar por todos os termos,Procurar por todos os termos,Căutare după toți termenii,Искать все слова,Тражи сваки термин,Sök efter alla termer,Tüm terimler için arama yapın,Шукати всі слова, +No results found.,OS_NO_RESULTS,,,,Nic nenalezeno.,Ingen resultater fundet.,Keine Resultate,Δέν βρέθηκαν αποτελέσματα,Neniu trafo.,Ningún resultado.,,Ei tuloksia.,Pas de résultat trouvé,Nema rezultata.,Nincs találat,Nessun risultato trovato.,見つかりませんでした。,검색 결과 없음.,Geen resultaten gevonden.,Ingen resultater funnet.,Brak wyników,Nenhum resultado encontrado.,,Niciun rezultat găsit.,Результаты не найдены.,Нема резултата.,Inga resultat hittades.,Sonuç bulunamadı.,Нічого не знайдено., +Search:,OS_LABEL,,,,Hledat:,Søg:,Suche:,Αναζήτηση:,Serĉi:,Buscar:,,Etsi:,Recherche:,Traži:,Keresés:,Trova:,検索:,검색:,Zoeken:,Søk:,Szukaj:,Busca:,Procura:,Caută:,Поиск:,Претрага:,Sök:,Ara:,Пошук:, +,,Blood Bath Announcer,,,,,,,,,,,,,,,,,,,,,,,,,,,, +%k boned %o like a fish,TXT_OBITUARY1,,,,%o byl@[ao_cs] vykoštěn@[ao_cs] jako ryba hráčem %k,%k udbenede %o som en fisk,%k hat %o zerlegt wie einen Fisch,Ο/Η %k ξεκοκάλοσε @[pro2_gr] %o σα ψάρι,%k senostigis %o kiel fiŝon,%k ha deshuesado a %o como a un pescado,%k deshuesó a %o como a un pescado,%k perkasi %o paran kuin kalan,%k a désossé %o comme un poisson,%k otkošćuje %o kao ribu,%k kifilézte %o -t mint a halat,%k ha dissossato %o come un pesce,%k は %o の骨を魚のように引っこ抜いた。,%k 은(는) %o 의 뼈를 발랐다.,%k mergelde %o als een vis,%k utbeinet %o som en fisk,%k odfiletował@[ao_pl] %o jak rybę,%k desossou %o como um peixe,,%k l-a dezosat pe %o ca pe un pește,%k пересчитал косточки игрока %o,%k је очистио %o као рибу,%k benade %o som en fisk,"%o, %k tarafından balık gibi kemirildi.",%k порахува@[adj_1_ua] ребра %o, +%k castrated %o,TXT_OBITUARY2,,,,%o byl@[ao_cs] vykastrován@[ao_cs] hráčem %k,%k kastrerede %o,%k hat %o kastriert,Ο/Η %k ευνούχισε %o,%k kastris %o,%k ha castrado a %o,%k castró a %o,%k kastroi %o paran,%k a castré %o,%k kastrira %o,%k kasztrálta %o -t,%k ha castrato %o,%k は %o を去勢した。,%k 은(는) %o 을(를) 거세시켰다.,%k castreerde %o,%k kastrert %o,%k wykastrował@[ao_pl] %o,%k castrou %o,,%k l-a castrat pe %o,%k кастрировал игрока %o,%k је кастрирао %o,%k kastrerade %o,"%o, %k tarafından hadım edildi.",%k каструва@[adj_1_ua] %o, +%k creamed %o,TXT_OBITUARY3,,,,%o byl@[ao_cs] rozšlehán@[ao_cs] hráčem %k,%k smurte %o,%k hat %o eingeseift,Ο/Η %k κρέμασε @[pro2_gr] %o,%k kremigis %o,%k ha cremado a %o,%k cremó a %o,%k kermasi %o paran,%k a battu %o à plate couture ,%k kremira %o,%k elkente %o -t,%k ha cremato %o,%k は %o に反吐ブチ撒けさせた。,%k 은(는) %o 을(를) 양념시켰다.,%k pureerde %o,%k fløtet %o,%k spienił@[ao_pl] %o,%k fez creme de %o,,%k l-a transformat în cremă pe %o,%k взбил игрока %o,%k је истукао %o,%k gräddade %o,,%k розпуши@[adj_1_ua] %o, +%k decimated %o,TXT_OBITUARY4,,,,%o byl@[ao_cs] zdecimován@[ao_cs] hráčem %k,%k decimerede %o,%k hat %o dezimiert,Ο/Η %k αποδεκάτισε @[pro2_gr] %o,%k detruegis %o,%k ha diezmado a %o,%k diezmó a %o,%k hävitti %o paran,%k a décimé %o,%k desetkuje %o,%k megtizedelte %o -t,%k ha decimato %o,%k は %o の居場所を間引いた。,%k 은(는) %o 을(를) 망가뜨렸다.,%k decimeerde %o,%k desimert %o,%k przetrzebił@[ao_pl] %o,%k decimou %o,,%k l-a decimat pe %o,%k скосил игрока %o,%k је десетковао %o,%k decimerade %o,"%o, %k tarafından yok edildi.",%k зітну@[adj_1_ua] %o, +%k destroyed %o,TXT_OBITUARY5,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k ødelagde %o,%k hat %o zerstört,Ο/Η %k κατέστεψε @[pro2_gr] %o,%k detruis %o,%k ha destruido a %o,%k destruyó a %o,%k tuhosi %o paran,%k a détruit %o,%k uništava %o,%k elpusztította %o -t,%k ha distrutto %o,%k は %o を完全に破壊した。,%k 은(는) %o 을(를) 파괴했다.,%k vernietigde %o,%k destruert %o,%k zniszczył@[ao_pl] %o,%k destruiu %o,,%k l-a distrus pe %o,%k уничтожил игрока %o,%k је уништио %o,%k förstörde %o,,%k знищи@[adj_1_ua] %o, +%k diced %o,TXT_OBITUARY6,,,,%o byl@[ao_cs] nakrájen@[ao_cs] na kostičky hráčem %k,%k skar %o i tern,%k hat %o in Würfel zerteilt,Ο/Η %k τεμάχησε @[pro2_gr] %o,%k diskubigis %o,%k ha picado en cubitos a %o,%k picó en cubitos a %o,%k pilkkosi %o paran,%k a coupé en dés %o,%k sjecka %o na kockice,%k kockára vágta %o -t,%k ha tagliato a cubetti %o,%k は %o を賽の目に切った。,%k 은(는) %o 을(를) 잘게 잘게 썰었다.,%k sneed %o in stukjes,%k skåret %o i terninger,%k pokroił@[ao_pl] w kostkę %o,%k fez picadinho de %o,%k cortou %o,%k l-a feliat pe %o,%k разрезал игрока %o,%k је исецкао %o,%k skar %o i tärningar,"%o, %k tarafından doğrandı.",%k наріза@[adj_1_ua] %o, +%k disembowled %o,TXT_OBITUARY7,,,,%o byl@[ao_cs] vykuchán@[ao_cs] hráčem %k,%k udkløvede %o,%k hat %o ausgeweidet,Ο/Η %k ισοπέδοσε @[pro2_gr] %o,%k sentripigis %o,%k ha destripado a %o,%k destripó a %o,%k suolisti %o paran,%k a étripé %o,%k vadi utrobu iz %o,%k kibelezte %o -t,%k ha smembrato %o,%k は %o の臓物を引きずり出した。,%k 은(는) %o 의 내장을 도려냈다.,%k ontleedde %o,%k sprettet opp %o,%k wypatroszył@[ao_pl] %o,%k estripou %o,,%k l-a eviscerat pe %o,%k выпотрошил игрока %o,%k је ампутирао %o,%k tog upp %o i bitar,,%k випотроши@[adj_1_ua] %o, +%k flattened %o,TXT_OBITUARY8,,,,%o byl@[ao_cs] zplacatěn@[ao_cs] hráčem %k,%k smadrede %o,%k hat %o dem Erdboden gleichgemacht,Ο/Η %k ησοπέδοσε @[pro2_gr] %o,%k platigis %o,%k ha aplanado a %o,%k aplanó a %o,%k lyttäsi %o paran,%k a aplati %o,%k spljošćuje %o,%k kilapította %o -t,%k ha schiacciato %o,%k は %o をぶっ潰した。,%k 은(는) %o 의 코를 납작하게 만들었다.,%k plette %o,%k flatet ut %o,%k rozpłaszczył@[ao_pl] %o,%k achatou %o,%k espalmou %o,%k l-a făcut plat pe %o,%k сплюснул игрока %o,%k је изравнао %o,%k plattade %o,"%o, %k tarafından dümdüz edildi.",%k сплющи@[adj_1_ua] %o, +%k gave %o Anal Justice,TXT_OBITUARY9,,,,%o utržil@[ao_cs] anální spravedlnost od hráče %k,%k lemlæstede %o,%k hat %o anale Gerechtigkeit gegeben,Ο/Η %k γάμησε @[pro2_gr] %o @[pro3_gr] κόλο,%k donis pugan juston al %o,%k le ha dado justicia anal a %o,%k le dió justicia anal a %o,%k jakoi %o paralle anaalioikeutta,%k a rendu une justice anale a %o,%k pruža analnu pravdu %o,%k Anális Igazságot adott %o -nak ,%k ha dato a %o Giustizia Anale,%k は %o のケツにぶち込んだ。,%k 은(는) %o 에게 홍콩행을 보냈다.,%k gaf %o anale rechtvaardigheid,%k ga %o anal rettferdighet,%k dał@[ao_pl] %o Analną Sprawiedliwość,%k deu Justiça Anal para %o,,%k i-a făcut jucătorului %o o Justiție Anală,%k устроил анальное правосудие игроку %o,%k је дао %o аналну правду,%k gav %o anal rättvisa,"%o, %k tarafından dümdüz edildi.",%k влаштува@[adj_1_ua] анальне правосуддя %o, +%k gave AnAl MaDnEsS to %o,TXT_OBITUARY10,,,,%o utrpěl@[ao_cs] AnÁlNí ŠíLeNsTvÍ od hráče %k,%k spildte %o,%k gab %o AnAlEn WaHnSiNn,Ο/Η %k έσκισε τον κόλο του/της] %o,%k donis pUgAn frEnEzOn al %o,%k le ha dado LoCuRa AnAl a %o,%k le dió LoCuRa AnAl a %o,%k teki %o paran AnAaLiHuLlUkSi,%k a donné la FOLIE ANALE a %o,%k pruža AnAlNo LuDiLo prema %o,%k SeGgBe KüLDtE %o -t,%k ha dato FoLlIa AnAle a %o,%k は %o のケツをガバガバにした。,%o 은(는) %k 의 찰진 맛을 보았다.,%k gaf aNaLe DoLhEiD aan %o,%k ga %o anal rettferdighet,%k dał@[ao_pl] %o AnAlNe SzAlEńStWo ,%k deu LoUcUrA aNaL para %o,,%k i-a dat NeBuNiE AnAlĂ jucătorului %o,%k устроил АнАЛ КаРнаВаЛ игроку %o,%k је дао АнАлНо ЛуДиЛо %o,%k gav %o anal rättvisa,"%o, %k tarafından dümdüz edildi.",%k влаштува@[adj_1_ua] АнАЛ ГуЛяНнЯ %o, +%k killed %o,TXT_OBITUARY11,,,,%o byl@[ao_cs] zabit@[ao_cs] hráčem %k,%k dræbte %o,%k hat %o getötet,Ο/Η %k σκότωσε @[pro2_gr] %o,%k mortigis %o,%k ha matado a %o,%k mató a %o,%k tappoi %o paran,%k a tué %o,%k ubija %o,%k kicsinálta %o -t,%k ha ucciso %o,%k は %o をブッ殺した。,%k 은(는) %o 을(를) 죽였다.,%k doodde %o,%k drepte %o,%k zabił@[ao_pl] %o,%k matou %o,,%k l-a omorât pe %o,%k убил игрока %o,%k је убио %o,%k dödade %o,"%o, %k tarafından öldürüldü.",%k вби@[adj_1_ua] %o, +%k made mincemeat out of %o,TXT_OBITUARY12,,,,%o byl@[ao_cs] namelen@[ao_cs] hráčem %k,%k gjorde hakket kød af %o,%k hat %o zu Hackfleisch verarbeitet,Ο/Η %k έφτιαξε κυμά με @[pro2_gr] %o,%k farigis farĉon el %o,%k ha hecho picadillo de %o,%k hizo picadillo de %o,%k teki jauhelihaa %o parasta,%k a fait de la viande hachée de %o,%k pravi mljeveno meso od %o,%k ledarálta %o -t,%k ha triturato %o,%k は %o をミンチにした。,%o 은(는) %k 에 의해 분쇄됐다.,%k maakte gehakt van %o,%k laget kjøttdeig av %o,%k zrobił@[ao_pl] mięso mielone z %o,%k fez carne moída de %o,%k fez carne picada do %o,%k a facut tocătură din %o,%k сделал отбивную из игрока %o,%k је направио млевено месо од %o,%k gjorde köttfärs av %o,"%o, %k tarafından kıyma haline getirildi.",%k зроби@[adj_1_ua] відбивну з %o, +%k massacred %o,TXT_OBITUARY13,,,,%o byl@[ao_cs] zmasakrován@[ao_cs] hráčem %k,%k massakrerede %o,%k hat %o niedergemetzelt,Ο/Η %k δολοφώνησε @[pro2_gr] %o,%k masakris %o,%k ha masacrado a %o,%k masacró a %o,%k verilöylytti %o parkaa,%k a massacré %o,%k masakrira %o,%k lemészárolta %o -t,%k ha fatto di %o carne tritata,%k は %o を虐殺した。,%k 은(는) %o 을(를) 참살했다.,%k slachtte %o af,%k massakrerte %o,%k zmasakrował@[ao_pl] %o,%k massacrou %o,,%k a fost masacrat de către %o,%k устроил бойню игроку %o,%k је масакрирао %o,%k massakrerade %o,"%o, %k tarafından katledildi",%k влаштува@[adj_1_ua] для %o бійню, +%k mutilated %o,TXT_OBITUARY14,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] hráčem %k,%k lemlæstede %o,%k hat %o verstümmelt,Ο/Η %k ακρωτηριάσε @[pro2_gr] %o,%k mutilis %o,%k ha mutilado a %o,%k mutiló a %o,%k silpoi %o paran,%k a mutilé %o,%k sakati %o,%k megcsonkította %o -t,%k ha massacrato %o,%k は %o をバラバラ死体にした。,%k 은(는) %o 의 팔다리를 절단했다.,%k verminkte %o,%k lemlestet %o,%k rozszarpał@[ao_pl] %o,%k mutilou %o,,%k l-a mutilat pe %o,%k изуродовал игрока %o,%k је мутилирао %o,%k lemlästade %o,"%o, %k tarafından sakat bırakıldı.",%k знівечи@[adj_1_ua] %o, +%k reamed %o,TXT_OBITUARY15,,,,%o byl@[ao_cs] proděravěn@[ao_cs] hráčem %k,%k skændede %o,%k hat %o aufgerieben,Ο/Η %k δέσμισε @[pro2_gr] %o,%k alezis %o,%k ha escariado a %o,%k escarió a %o,%k porasi %o paran,%k a découpé en fines lamelles %o,%k razvlači %o,%k seggbe rakta %o -t,%k ha squartato %o,%k は %o の穴を大きく広げた。,%k 은(는) %o 을(를) 크게 혼냈다.,%k holde %o uit,%k maltraktert %o,%k rozwiercił@[ao_pl] %o,%k esquartejou %o,,%k l-a transformat într-un top de hârtie pe %o,%k рассверлил игрока %o,%k је наоружао %o,%k har gjort %o illa.,"%o, %k tarafından öldürüldü.",%k просверли@[adj_1_ua] %o, +%k ripped %o a new orifice,TXT_OBITUARY16,,,,%o má novou díru od hráče %k,%k flåede %o en ny åbning,%k hat %o eine neue Körperöffnung verpasst,Ο/Η άνοιξε μια νέα τρύπα @[pro3_gr] %o,%k ŝiris novan truon en %o,%k le ha hecho a %o un nuevo orificio,%k le hizo a %o un nuevo orificio,%k repi %o paralle uuden aukon,%k a ouvert un nouvel orifice a %o,%k pravi novi otvor na %o,%k új szájat csinált %o -nak,%k ha aperto a %o un altro orifizio,%k は %o を切り裂いて新しい穴を作ってあげた。,%k 은(는) %o 을(를) 죽여 뜯어서 작품을 만들었다.,%k scheurde een opening uit %o,%k revet %o en ny kroppsåpning,%k rozerwał@[ao_pl] %o nowy otwór,%k abriu um novo orifício em %o,,%k i-a făcut jucătorului %o un nou orificiu,%k проделал новое отверстие в игроке %o,%k је исцепао %o нови отвор,%k slet upp en ny öppning i %o,"%o, %k tarafından yeni bir delik açıldı.",%k зроби@[adj_1_ua] в %o нову дірку, +%k slaughtered %o,TXT_OBITUARY17,,,,%o byl@[ao_cs] zavražděn@[ao_cs] hráčem %k,%k slagtede %o,%k hat %o geschlachtet,Ο/Η %k έσφαξε @[pro2_gr] %o,%k buĉis %o,%k ha sacrificado a %o,%k sacrificó a %o,%k teurasti %o paran,%k a meurtri %o,%k kolje %o,%k lemészárolta %o -t,%k ha macellato %o,%k は %o を屠殺した。,%o 은(는) %k 에 의해 도살당했다.,%k slachtte %o,%k slaktet %o,%k zarżn@[irreg_2_pl] %o,%k abateu %o,,%k l-a măcelărit pe %o,%k устроил резню игроку %o,%k је заклао %o,%k slaktade %o,"%o, %k tarafından katledildi.",%k прові@[adj_1_ua] різню %o, +%k smashed %o,TXT_OBITUARY18,,,,%o byl@[ao_cs] zmlácen@[ao_cs] hráčem %k,%k smadrede %o,%k hat %o zerklatscht,Ο/Η %k τσάκισε @[pro2_gr] %o,%k frakasis %o,%k ha destrozado a %o,%k destrozó a %o,%k murskasi %o paran,%k a enfoncé %o,%k smrskava %o,%k földbe döngölte %o -t,%k ha distrutto %o,%k は %o をぶっ飛ばした。,%k 은(는) %o 을(를) 내팽개쳤다.,%k vermorzelde %o,%k knust %o,%k stłukł@[ao_pl] %o,%k esmagou %o,,%k l-a spart pe %o,%k размазал игрока %o,%k је поломио %o,%k krossade %o,"%o, %k tarafından ezildi.",%k розмаза@[adj_1_ua] %o, +%k sodomized %o,TXT_OBITUARY19,,,,Hráč %k se dopustil sodomie na hráči %o,%k sodomiserede %o,%k hat %o sodomisiert,Ο/Η %k γάμησε @[pro2_gr] %o,%k sodomizis %o,%k ha sodomizado a %o,%k sodomizó a %o,%k anaaliraiskasi %o paran,%k y a sodomisé n %o,%k sodomizira %o,%k szodomizálta %o -t,%k ha sodomizzato %o,%o は %k にカマを掘られた。 ,%o 은(는) %k 을(를) 위해 등을 보였다.,%k sodomiseerde %o,%k sodomisert %o,%k spenetrował@[ao_pl] %o,%k sodomizou %o,,%k l-a sodomizat pe %o,%k содомировал игрока %o,%k је изјебао %o,%k sodomiserade %o,"%o, %k tarafından sodomize edildi.",%k зґвалтува@[adj_1_ua] %o, +%k splattered %o,TXT_OBITUARY20,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] hráčem %k,%k sprøjtede %o,%k hat %o zerspritzt,Ο/Η %k έσκασε @[pro2_gr] %o,%k disĵetis %o,%k ha rociado a %o,%k roció a %o,%k roiski %o paran yltympäri,%k a explosé de %o,%k raspršuje %o,%k szétloccsantotta %o -t,%k ha spiaccicato %o,%k は %o にばら撒かれた。,%k 은(는) %o 을(를) 박살냈다.,%k splette %o,%k sprutet %o,%k rozbryzgał@[ao_pl] %o,%k explodiu %o,,%k l-a împrăștiat pe %o,%k разбрызгал игрока %o,%k је спљоштио %o,%k sprutade %o.,"%o, %k tarafından parçalandı.",%k розбризка@[adj_1_ua] %o, +%k squashed %o,TXT_OBITUARY21,,,,%o byl@[ao_cs] rozmáčknut@[ao_cs] hráčem %k,%k kværnede %o,%k hat %o zerquetscht,Ο/Η %k πάτησε @[pro2_gr] %o,%k premplatigis %o,%k ha aplastado a %o,%k aplastó a %o,%k litisti %o paran,%k a écrabouillé %o,%k gnječi %o,%k eltaposta %o -t,%k ha schiacciato %o,%k は %o に潰された。,%k 은(는) %o 을(를) 짓이겼다.,%k plette %o,%k knust %o,%k zmiażdżył@[ao_pl] %o,%k espatifou %o,,%k l-a strivit pe %o,%k расплющил игрока %o,%k је згњечио %o,%k krossade %o,"%o, %k tarafından ezildi.",%k розчави@[adj_1_ua] %o, +%k throttled %o,TXT_OBITUARY22,,,,%o byl@[ao_cs] zaškrcen@[ao_cs] hráčem %k,%k kvæler %o,%k hat %o erdrosselt,Ο/Η %k κομμάτιασε @[pro2_gr] %o,%k strangolis %o,%k ha estrangulado a %o,%k ahorcó a %o,%k polki %o paran,%k a étouffé %o,%k guši %o,%k megfolytotta %o -t,%k ha strozzato %o,%k は %o に絞られた。,%k 은(는) %o 을(를) 목 졸라 죽였다.,%k wurgde %o,%k kvalt %o,"%k udusił@[ao_pl] %o ",%k estrangulou %o,,%k l-a strâns de gât pe %o,%k задушил игрока %o,%k је угушио %o,%k tog strypgrepp på %o,"%o, %k tarafından boğazlandı.",%k вдуши@[adj_1_ua] %o, -%k wasted %o,TXT_OBITUARY23,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k spildte %o,%k hat %o verbraucht,Ο/Η %k σκότωσε @[pro2_gr] %o,%k malŝparis %o,%k ha desechado a %o,%k desechó a %o,%k kulutti %o paran,%k a décharné %o,%k elpusztította %o -t,%k ha distrutto %o,%k は %o に消された。,%k 은(는) %o 을(를) 쓰레기처럼 내다 버렸다.,%k maakte %o koud,%k bortkastet %o,%k roztrwonił@[ao_pl] %o,%k detonou %o,,%k l-a risipit pe %o,%k замочил игрока %o,%k је убио %o,%k slösade bort %o,"%o, %k tarafından harcandı.",%k загна@[adj_1_ua] у могилу %o, -%k body bagged %o,TXT_OBITUARY24,,,,Hráč %k narval %o@[psn1_cs] tělo do pytle,%k tog %o i en pose med kroppen,%k hat %o eingesackt,Ο/Η %k έχωσε @[pro2_gr] %o στη κάσα του/της,%k ensakigis %o,%k ha embolsado a %o,%k embolsó a %o,%k kääri %o paran ruumispussiin,%k a placé %o dans son linceul,%k összecsomagolta %o -t,%k ha mandato %o all'obitorio,%k は %o を死体袋にした。,%k 은(는) %o 의 장례식을 치렀다.,%k stopte %o in een lijkzak,%k lagt %o i likpose,%k spakował@[ao_pl] %o do torby na zwłoki,%k mandou %o para o necrotério,,%k l-a băgat în sac pe %o,%k упаковал игрока %o в мешок для трупов,%k је умртвио %o,%k dödade %o,"%o, %k tarafından öldürüldü.",%k запакува@[adj_1_ua] %o в мішок для трупів, -%k sent %o to Hell,TXT_OBITUARY25,,,,%o byl@[ao_cs] poslán@[ao_cs] do pekla hráčem %k,%k sendte %o til helvede,%k hat %o zur Hölle fahren lassen,Ο/Η %k έστειλε @[pro2_gr] %o στο δίαολο,%k sendis %o al Infero,%k ha enviado a %o al infierno,%k mandó a %o al infierno,%k lähetti %o paran helvettiin,%k a envoyé %o en enfer,%k elküldte %o -t a Pokolba,%k ha spedito %o all'Inferno,%k は %o を地獄に送った。,%o 은(는) %k 덕에 지옥으로 돌아갔다.,%k zond %o naar de hel,%k sendt %o til helvete,%k wysłał@[ao_pl] %o do Piekła,%k mandou %o para o Inferno,,%k l-a trimis pe %o în Infern,%k отправил в ад игрока %o,%k је послао %o до Врага,%k skickade %o till helvetet,"%o, %k tarafından cehenneme gönderildi.",%k посла@[adj_1_ua] %o до дідька лисого, -%k toasted %o,TXT_OBITUARY26,,,,%o byl@[ao_cs] upečen@[ao_cs] hráčem %k,%k skålede %o,%k hat %o geröstet,Ο/Η %k έψησε @[pro2_gr] %o,%k tostis %o,%k ha tostado a %o,%k tostó a %o,%k käristi %o paran,%k a grillé %o,%k megpirította %o -t,%k ha arrostito %o,%k は %o を焼却した。,%o 은(는) %k 덕에 맛있게 구워졌다.,%k roosterde %o,%k ristet %o,%k stostował@[ao_pl] %o,%k tostou %o,,%k l-a prăjit pe %o,%k поджарил игрока %o,%k је тостирао %o,%k rostade %o,"%o, %k tarafından öldürüldü.",%k піджари@[adj_1_ua] %o, -%k snuffed %o,TXT_OBITUARY27,,,,%o byl@[ao_cs] rozsápán@[ao_cs] hráčem %k,%k snusede %o,%k hat %o vernichtet,Ο/Η %k έσβησε @[pro2_gr] %o,%k snufis %o,%k ha aspirado a %o,%k aspiró a %o,%k sammutti %o paran,%k a crevé %o,%k kinyiffantotta %o -t,%k ha spento %o,%k は %o を処刑した。,%o 은(는) %k 에 의해 짓눌려졌다.,%k legde %o om,%k snuffet %o,%k powąchał@[ao_pl] %o,%k apagou %o,,%k l-a mirosit pe %o,%k прикончил игрока %o,%k је угасио %o,%k snusade %o,"%o, %k tarafından öldürüldü.",%k загаси@[adj_1_ua] %o, -%k hosed %o,TXT_OBITUARY28,,,,%o byl@[ao_cs] odstříknut@[ao_cs] hráčem %k,%k sprøjtede %o,%k hat %o eingetütet,Ο/Η %k έονιξε @[pro2_gr] %o σε σφαίρες,%k hosis %o,%k se ha cargado a %o,%k se cargó a %o,%k pesi %o paran,%k a arrosé %o,%k felhúzta %o gatyáját,%k l'ha fatta sopra %o,%k は %o にぶっかけた。,%k 은(는) %o 을(를) 패배로 씻겼다.,%k bespoot %o,%k spylt med vann %o,%k załatwił@[ao_pl] %o,%k metralhou %o,,%k a pus furtunul pe %o,%k расстрелял игрока %o,%k је упскао %o,%k sprutade %o,"%o, %k'in hışmına uğradı.",%o перепало від %k, -%k sprayed %o,TXT_OBITUARY29,,,,%o byl@[ao_cs] postříkán@[ao_cs] hráčem %k,%k sprøjtede %o,%k hat %o pulverisiert,Ο/Η %k ψέκασε @[pro2_gr] %o,%k ŝprucigis %o,%k ha pulverizado a %o,%k pulverizó a %o,%k ruiskutti %o paran,%k a pulvérise %o,%k szétporlasztotta %o -t,%k ha vaporizzato %o,%k は %o を撒き散らした。,%o 의 피는 %k 의 물감으로 쓰였다.,%k besproeide %o,%k sprayet %o,%k rozpryskał@[ao_pl] %o,%k pulverizou %o,,%k l-a pulverizat pe %o,%k распылил игрока %o,%k је испрскао %o,%k sprayade %o,"%o, %k tarafından püskürtüldü.",%k розпили@[adj_1_ua] %o, -%k made dog meat out of %o,TXT_OBITUARY30,,,,%o byl@[ao_cs] hozen@[ao_cs] psům hráčem %k,%k lavede hundekød ud af %o,%k hat Hundefutter aus %o gemacht,Ο/Η %k γύρισε @[pro2_gr] %o σε κιμά,%k farigis hundan viandon el %o,%k ha hecho comida para perros de %o,%k hizo alimento para perros de %o,%k teki %o parasta koiranruokaa,%k a fait de la pâtée pour chien de %o,%k döghúst csinált %o -ból,%k ha fatto di %o polpette,%k は %o を犬の餌にした。,%k 은(는) %o 로 개밥을 만들었다.,%k maakte hondenvlees van %o,%k laget hundekjøtt av %o,%k zrobił@[ao_pl] mięso dla psów z %o,%k fez almôndegas de %o,,%k l-a transformat în mâncare de câini pe %o,%k скормил псам игрока %o,%k је направио псеће месо од %o,%k gjorde hundkött av %o,"%o, %k tarafından köpek etine dönüştürüldü.",%k зтовк@[adj_3_ua] %o до псєчих харчів, -%k beat %o like a cur,TXT_OBITUARY31,,,,%o byl@[ao_cs] zmlácen@[ao_cs] jako pes hráčem %k,%k bankede %o som en skiderik,%k hat %o wie einen Hund geschlagen,Ο/Η %k πλάκοσε @[pro2_gr] %o σαν κοπρίτης,%k batis %o kiel hundaĉon,%k ha pateado a %o como a un perro callejero,,%k huitoi %o parkaa kuin rakkia,%k a battu %o,%k szétverte %o -t mint egy korcsot,%k ha battuto %o come un cane,%k は %o を狂犬の様に扱った。,%o 은(는) %k 에게 똥개처럼 맞았다.,%k sloeg %o als een hond,%k slått %o som en hund,%k pobił@[ao_pl] %o jak kundla,%k espancou %o como um cachorro,%k espancou %o como um cão,%k îl bate pe %o ca pe o jigodie,%k сделал игрока %o как худую свинью,%k је превио %o ко мачку,%k rostade %o,"%o, %k tarafından dövüldü.",%k відби@[adj_1_ua] печінки %o, -%o is excrement,TXT_SELFOBIT1,,,,%o je exkrement,%o er ekskrementer,%o wurde zu Exkrement verarbeitet,@[art_gr] %o είναι κόπρανα,%o estas ekskremento,%o es excremento,,%o on ulostetta,%o est une merde,%o ürülék lett,%o è un escremento,%o はもはや排泄物のようだ。,%o 은(는) 배설물이 되었다.,%o is uitschot,%o er ekskrementer,%o został@[ao_pl] odpadkami,%o virou escremento,,%o e excrement,%o теперь экскремент,%o је сада измет,%o är avföring,%o dışkıdır,%o тепер екскремент, -%o is hamburger,TXT_SELFOBIT2,,,,%o je hamburger,%o er en hamburger,%o ist Hamburger,@[art_gr] %o είναι χάμπουργκερ,%o estas hamburgero,%o es una hamburguesa,,%o on hakkelusta,%o est un hamburger,%o hamburger lett,%o è un hamburger,%o はハンバーガーになった。,%o 은(는) 고기 반죽이 되었다.,%o is hamburger,%o er hamburger,%o został@[ao_pl] hamburgerem,%o virou hambúrguer,,%o e hamburger,%o теперь гамбургер,%o је сада пљескавица,%o är hamburgare,%o hamburgerdir,%o тепер гамбургер, -%o suffered scrotum separation,TXT_SELFOBIT3,,,,%o prodělal@[ao_cs] separaci šourku,%o fik skrotumskæring,%os Eier wurden gebraten,Οι όρχις @[pro4_gr] %o βγήκανε,%o suferis skrotan disigon,%o ha sufrido separación de escroto,%o sufrió separación de escroto,%o kärsii kivespussin erotuksesta,%o a souffert d'une séparation du scrotum,%o heréi szétváltak,%o ha subito la separazione dello scroto,%o の陰嚢は剥離していた。,%o 은(는) 고자가 되었다.,%o onderging scrotumscheiding,%o led pungseparasjon,%o doznał@[ao_pl] oddzielenia moszny,%o sofreu separação escrotal,,%o a suferit o separație de șcrot,%o страдает от потери тестикул,%o му је исечена патка,%o fick pungen separerad,%o skrotum ayrılması yaşadı,%o постражда@[adj_1_ua] від втрати мошонки, -%o volunteered for population control,TXT_SELFOBIT4,,,,%o se zúčastnil@[ao_cs] čistky obyvatelstva,%o meldte sig frivilligt til befolkningskontrol,%o hat sich freiwillig zur Bevölkerungskontrolle gemeldet,@[art_gr] %o εθελώντησε για έλεγχο του πληθυσμού,%o volontulis por loĝantara regado,%o se ha hecho voluntario para control de población,%o se hizo voluntario para control de población,%o ilmoittautui vapaaehtoiseksi väestönhallintaan,%o s'est proposé pour un contrôle de la population,%o önként jelentkezett népességszabályozásra,%o si è offerto per il controllo della popolazione,%o は人口削減政策の実験台に志願した。,%o 은(는) 자연에 의해 낙태 당했다.,%o was vrijwilliger voor bevolkingsbeperking,%o meldte seg frivillig til befolkningskontroll,%o zgłosił@[ao_pl] się na kontrolę ludności,%o se voluntariou para o controle populacional,%o se voluntariou para o controlo populacional,%o a voluntariat pentru controlul populației,%o стал добровольцем в борьбе с перенаселением,%o је волунтирао за контролу популације,%o anmälde sig frivilligt till befolkningskontroll,Nüfus kontrolü için %o gönüllü oldu,%o борется з перенаселенням, -%o has suicided,TXT_SELFOBIT5,,,,%o spáchal@[ao_cs] sebevraždu,%o har begået selvmord,%o hat Selbstmord begangen,@[art_gr] %o έχει αυτοκτονήση,%o sin mortigis,%o se ha suicidado,%o se suicidó,%o on tehnyt itsemurhan,%o s'est suicidé,%o öngyilkos lett,%o si è suicidato,%o は勝手にくたばった。,%o 은(는) 한심하게 자살했다.,%o heeft zelfmoord gepleegd,%o har begått selvmord,%o popełnił@[ao_pl] samobójstwo,%o se suicidou,%o suicidou-se,%o s-a sinucis,Игрок %o самоубился,%o је убио самог себе,%o har begått självmord,%o intihar etti,%o самовби@[adj_2_ua], -%o received the Darwin Award,TXT_SELFOBIT6,,,,%o dostal@[ao_cs] Darwinovu cenu,%o modtog Darwin-prisen,%o hat den Darwinpreis erhalten,@[art_gr] %o κέρδισε το Darwin βραβείο,%o ricevis la Darwin-premion,%o ha recibido el Premio Darwin,%o recibió el Premio Darwin,%o sai Darwin-palkinnon,%o a recu la médaille Darwin,És a Darwin-díj nyertese: %o,%o ha ricevuto il Darwin Award,%o にはダーウィン賞が授与された。,%o 은(는) 다윈상을 받을 자격이 있다.,%o ontving de Darwin Award,%o mottok Darwin-prisen,%o otrzymał@[ao_pl] Nagrodę Darwina,%o ganhou o Prêmio Darwin,,%o a primit Premiul Darwin,Игрок %o получил премию Дарвина,%o је добио Дарвиново признање,%o fick Darwinpriset,%o Darwin Ödülü'nü aldı,%o отрима@[adj_1_ua] премію Дарвіна, -,USE_GENERIC_FONT,This is not a text to be translated but an engine switch for complex languages.,,,,,,,,,,,,,,1,1,,,,,,,,,,,, -,REQUIRED_CHARACTERS,This should list all uppercase characters that are REQUIRED for proper language display. If it is acceptable that accents get omitted a character should NOT be listed here!,,,ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ,ÅÆØÉ,ÄÖÜẞ,ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ,ĈĜĤĴŜŬ,ÁÉÍÓÚÑÜ,,ÄÖ,ÀÂÇÉÈÊËÎÏÔŒÙÛŸ,ÁÉÍÓÖÚÜŐŰ,ÀÈÉÌÒÙ,,,"ÉËÖ +%k wasted %o,TXT_OBITUARY23,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k,%k spildte %o,%k hat %o verbraucht,Ο/Η %k σκότωσε @[pro2_gr] %o,%k malŝparis %o,%k ha desechado a %o,%k desechó a %o,%k kulutti %o paran,%k a décharné %o,%k iscrpljuje %o,%k elpusztította %o -t,%k ha distrutto %o,%k は %o に消された。,%k 은(는) %o 을(를) 쓰레기처럼 내다 버렸다.,%k maakte %o koud,%k bortkastet %o,%k roztrwonił@[ao_pl] %o,%k detonou %o,,%k l-a risipit pe %o,%k замочил игрока %o,%k је убио %o,%k slösade bort %o,"%o, %k tarafından harcandı.",%k загна@[adj_1_ua] у могилу %o, +%k body bagged %o,TXT_OBITUARY24,,,,Hráč %k narval %o@[psn1_cs] tělo do pytle,%k tog %o i en pose med kroppen,%k hat %o eingesackt,Ο/Η %k έχωσε @[pro2_gr] %o στη κάσα του/της,%k ensakigis %o,%k ha embolsado a %o,%k embolsó a %o,%k kääri %o paran ruumispussiin,%k a placé %o dans son linceul,%k stavlja %o u mrtvačku vreću,%k összecsomagolta %o -t,%k ha mandato %o all'obitorio,%k は %o を死体袋にした。,%k 은(는) %o 의 장례식을 치렀다.,%k stopte %o in een lijkzak,%k lagt %o i likpose,%k spakował@[ao_pl] %o do torby na zwłoki,%k mandou %o para o necrotério,,%k l-a băgat în sac pe %o,%k упаковал игрока %o в мешок для трупов,%k је умртвио %o,%k dödade %o,"%o, %k tarafından öldürüldü.",%k запакува@[adj_1_ua] %o в мішок для трупів, +%k sent %o to Hell,TXT_OBITUARY25,,,,%o byl@[ao_cs] poslán@[ao_cs] do pekla hráčem %k,%k sendte %o til helvede,%k hat %o zur Hölle fahren lassen,Ο/Η %k έστειλε @[pro2_gr] %o στο δίαολο,%k sendis %o al Infero,%k ha enviado a %o al infierno,%k mandó a %o al infierno,%k lähetti %o paran helvettiin,%k a envoyé %o en enfer,%k šalje %o u Pakao,%k elküldte %o -t a Pokolba,%k ha spedito %o all'Inferno,%k は %o を地獄に送った。,%o 은(는) %k 덕에 지옥으로 돌아갔다.,%k zond %o naar de hel,%k sendt %o til helvete,%k wysłał@[ao_pl] %o do Piekła,%k mandou %o para o Inferno,,%k l-a trimis pe %o în Infern,%k отправил в ад игрока %o,%k је послао %o до Врага,%k skickade %o till helvetet,"%o, %k tarafından cehenneme gönderildi.",%k посла@[adj_1_ua] %o до дідька лисого, +%k toasted %o,TXT_OBITUARY26,,,,%o byl@[ao_cs] upečen@[ao_cs] hráčem %k,%k skålede %o,%k hat %o geröstet,Ο/Η %k έψησε @[pro2_gr] %o,%k tostis %o,%k ha tostado a %o,%k tostó a %o,%k käristi %o paran,%k a grillé %o,% prži %o,%k megpirította %o -t,%k ha arrostito %o,%k は %o を焼却した。,%o 은(는) %k 덕에 맛있게 구워졌다.,%k roosterde %o,%k ristet %o,%k stostował@[ao_pl] %o,%k tostou %o,,%k l-a prăjit pe %o,%k поджарил игрока %o,%k је тостирао %o,%k rostade %o,"%o, %k tarafından öldürüldü.",%k піджари@[adj_1_ua] %o, +%k snuffed %o,TXT_OBITUARY27,,,,%o byl@[ao_cs] rozsápán@[ao_cs] hráčem %k,%k snusede %o,%k hat %o vernichtet,Ο/Η %k έσβησε @[pro2_gr] %o,%k snufis %o,%k ha aspirado a %o,%k aspiró a %o,%k sammutti %o paran,%k a crevé %o,%k gasi %o,%k kinyiffantotta %o -t,%k ha spento %o,%k は %o を処刑した。,%o 은(는) %k 에 의해 짓눌려졌다.,%k legde %o om,%k snuffet %o,%k powąchał@[ao_pl] %o,%k apagou %o,,%k l-a mirosit pe %o,%k прикончил игрока %o,%k је угасио %o,%k snusade %o,"%o, %k tarafından öldürüldü.",%k загаси@[adj_1_ua] %o, +%k hosed %o,TXT_OBITUARY28,,,,%o byl@[ao_cs] odstříknut@[ao_cs] hráčem %k,%k sprøjtede %o,%k hat %o eingetütet,Ο/Η %k έονιξε @[pro2_gr] %o σε σφαίρες,%k hosis %o,%k se ha cargado a %o,%k se cargó a %o,%k pesi %o paran,%k a arrosé %o,%k prska %o crijevom,%k felhúzta %o gatyáját,%k l'ha fatta sopra %o,%k は %o にぶっかけた。,%k 은(는) %o 을(를) 패배로 씻겼다.,%k bespoot %o,%k spylt med vann %o,%k załatwił@[ao_pl] %o,%k metralhou %o,,%k a pus furtunul pe %o,%k расстрелял игрока %o,%k је упскао %o,%k sprutade %o,"%o, %k'in hışmına uğradı.",%o перепало від %k, +%k sprayed %o,TXT_OBITUARY29,,,,%o byl@[ao_cs] postříkán@[ao_cs] hráčem %k,%k sprøjtede %o,%k hat %o pulverisiert,Ο/Η %k ψέκασε @[pro2_gr] %o,%k ŝprucigis %o,%k ha pulverizado a %o,%k pulverizó a %o,%k ruiskutti %o paran,%k a pulvérise %o,%k raspršiva %o,%k szétporlasztotta %o -t,%k ha vaporizzato %o,%k は %o を撒き散らした。,%o 의 피는 %k 의 물감으로 쓰였다.,%k besproeide %o,%k sprayet %o,%k rozpryskał@[ao_pl] %o,%k pulverizou %o,,%k l-a pulverizat pe %o,%k распылил игрока %o,%k је испрскао %o,%k sprayade %o,"%o, %k tarafından püskürtüldü.",%k розпили@[adj_1_ua] %o, +%k made dog meat out of %o,TXT_OBITUARY30,,,,%o byl@[ao_cs] hozen@[ao_cs] psům hráčem %k,%k lavede hundekød ud af %o,%k hat Hundefutter aus %o gemacht,Ο/Η %k γύρισε @[pro2_gr] %o σε κιμά,%k farigis hundan viandon el %o,%k ha hecho comida para perros de %o,%k hizo alimento para perros de %o,%k teki %o parasta koiranruokaa,%k a fait de la pâtée pour chien de %o,%k pravi meso za pse od %o,%k döghúst csinált %o -ból,%k ha fatto di %o polpette,%k は %o を犬の餌にした。,%k 은(는) %o 로 개밥을 만들었다.,%k maakte hondenvlees van %o,%k laget hundekjøtt av %o,%k zrobił@[ao_pl] mięso dla psów z %o,%k fez almôndegas de %o,,%k l-a transformat în mâncare de câini pe %o,%k скормил псам игрока %o,%k је направио псеће месо од %o,%k gjorde hundkött av %o,"%o, %k tarafından köpek etine dönüştürüldü.",%k зтовк@[adj_3_ua] %o до псєчих харчів, +%k beat %o like a cur,TXT_OBITUARY31,,,,%o byl@[ao_cs] zmlácen@[ao_cs] jako pes hráčem %k,%k bankede %o som en skiderik,%k hat %o wie einen Hund geschlagen,Ο/Η %k πλάκοσε @[pro2_gr] %o σαν κοπρίτης,%k batis %o kiel hundaĉon,%k ha pateado a %o como a un perro callejero,,%k huitoi %o parkaa kuin rakkia,%k a battu %o,%k tuče %o kao nitkova,%k szétverte %o -t mint egy korcsot,%k ha battuto %o come un cane,%k は %o を狂犬の様に扱った。,%o 은(는) %k 에게 똥개처럼 맞았다.,%k sloeg %o als een hond,%k slått %o som en hund,%k pobił@[ao_pl] %o jak kundla,%k espancou %o como um cachorro,%k espancou %o como um cão,%k îl bate pe %o ca pe o jigodie,%k сделал игрока %o как худую свинью,%k је превио %o ко мачку,%k rostade %o,"%o, %k tarafından dövüldü.",%k відби@[adj_1_ua] печінки %o, +%o is excrement,TXT_SELFOBIT1,,,,%o je exkrement,%o er ekskrementer,%o wurde zu Exkrement verarbeitet,@[art_gr] %o είναι κόπρανα,%o estas ekskremento,%o es excremento,,%o on ulostetta,%o est une merde,%o je izmet,%o ürülék lett,%o è un escremento,%o はもはや排泄物のようだ。,%o 은(는) 배설물이 되었다.,%o is uitschot,%o er ekskrementer,%o został@[ao_pl] odpadkami,%o virou escremento,,%o e excrement,%o теперь экскремент,%o је сада измет,%o är avföring,%o dışkıdır,%o тепер екскремент, +%o is hamburger,TXT_SELFOBIT2,,,,%o je hamburger,%o er en hamburger,%o ist Hamburger,@[art_gr] %o είναι χάμπουργκερ,%o estas hamburgero,%o es una hamburguesa,,%o on hakkelusta,%o est un hamburger,%o je hamburger,%o hamburger lett,%o è un hamburger,%o はハンバーガーになった。,%o 은(는) 고기 반죽이 되었다.,%o is hamburger,%o er hamburger,%o został@[ao_pl] hamburgerem,%o virou hambúrguer,,%o e hamburger,%o теперь гамбургер,%o је сада пљескавица,%o är hamburgare,%o hamburgerdir,%o тепер гамбургер, +%o suffered scrotum separation,TXT_SELFOBIT3,,,,%o prodělal@[ao_cs] separaci šourku,%o fik skrotumskæring,%os Eier wurden gebraten,Οι όρχις @[pro4_gr] %o βγήκανε,%o suferis skrotan disigon,%o ha sufrido separación de escroto,%o sufrió separación de escroto,%o kärsii kivespussin erotuksesta,%o a souffert d'une séparation du scrotum,%o trpi odvajanje skrotuma,%o heréi szétváltak,%o ha subito la separazione dello scroto,%o の陰嚢は剥離していた。,%o 은(는) 고자가 되었다.,%o onderging scrotumscheiding,%o led pungseparasjon,%o doznał@[ao_pl] oddzielenia moszny,%o sofreu separação escrotal,,%o a suferit o separație de șcrot,%o страдает от потери тестикул,%o му је исечена патка,%o fick pungen separerad,%o skrotum ayrılması yaşadı,%o постражда@[adj_1_ua] від втрати мошонки, +%o volunteered for population control,TXT_SELFOBIT4,,,,%o se zúčastnil@[ao_cs] čistky obyvatelstva,%o meldte sig frivilligt til befolkningskontrol,%o hat sich freiwillig zur Bevölkerungskontrolle gemeldet,@[art_gr] %o εθελώντησε για έλεγχο του πληθυσμού,%o volontulis por loĝantara regado,%o se ha hecho voluntario para control de población,%o se hizo voluntario para control de población,%o ilmoittautui vapaaehtoiseksi väestönhallintaan,%o s'est proposé pour un contrôle de la population,%o volontira za kontrolu populacije,%o önként jelentkezett népességszabályozásra,%o si è offerto per il controllo della popolazione,%o は人口削減政策の実験台に志願した。,%o 은(는) 자연에 의해 낙태 당했다.,%o was vrijwilliger voor bevolkingsbeperking,%o meldte seg frivillig til befolkningskontroll,%o zgłosił@[ao_pl] się na kontrolę ludności,%o se voluntariou para o controle populacional,%o se voluntariou para o controlo populacional,%o a voluntariat pentru controlul populației,%o стал добровольцем в борьбе с перенаселением,%o је волунтирао за контролу популације,%o anmälde sig frivilligt till befolkningskontroll,Nüfus kontrolü için %o gönüllü oldu,%o борется з перенаселенням, +%o has suicided,TXT_SELFOBIT5,,,,%o spáchal@[ao_cs] sebevraždu,%o har begået selvmord,%o hat Selbstmord begangen,@[art_gr] %o έχει αυτοκτονήση,%o sin mortigis,%o se ha suicidado,%o se suicidó,%o on tehnyt itsemurhan,%o s'est suicidé,%o čini samoubojstvo,%o öngyilkos lett,%o si è suicidato,%o は勝手にくたばった。,%o 은(는) 한심하게 자살했다.,%o heeft zelfmoord gepleegd,%o har begått selvmord,%o popełnił@[ao_pl] samobójstwo,%o se suicidou,%o suicidou-se,%o s-a sinucis,Игрок %o самоубился,%o је убио самог себе,%o har begått självmord,%o intihar etti,%o самовби@[adj_2_ua], +%o received the Darwin Award,TXT_SELFOBIT6,,,,%o dostal@[ao_cs] Darwinovu cenu,%o modtog Darwin-prisen,%o hat den Darwinpreis erhalten,@[art_gr] %o κέρδισε το Darwin βραβείο,%o ricevis la Darwin-premion,%o ha recibido el Premio Darwin,%o recibió el Premio Darwin,%o sai Darwin-palkinnon,%o a recu la médaille Darwin,%o prima Darwinovu nagradu,És a Darwin-díj nyertese: %o,%o ha ricevuto il Darwin Award,%o にはダーウィン賞が授与された。,%o 은(는) 다윈상을 받을 자격이 있다.,%o ontving de Darwin Award,%o mottok Darwin-prisen,%o otrzymał@[ao_pl] Nagrodę Darwina,%o ganhou o Prêmio Darwin,,%o a primit Premiul Darwin,Игрок %o получил премию Дарвина,%o је добио Дарвиново признање,%o fick Darwinpriset,%o Darwin Ödülü'nü aldı,%o отрима@[adj_1_ua] премію Дарвіна, +,USE_GENERIC_FONT,This is not a text to be translated but an engine switch for complex languages.,,,,,,,,,,,,,,,1,1,,,,,,,,,,,, +,REQUIRED_CHARACTERS,This should list all uppercase characters that are REQUIRED for proper language display. If it is acceptable that accents get omitted a character should NOT be listed here!,,,ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ,ÅÆØÉ,ÄÖÜẞ,ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ,ĈĜĤĴŜŬ,ÁÉÍÓÚÑÜ,,ÄÖ,ÀÂÇÉÈÊËÎÏÔŒÙÛŸ,ČĆŠĐŽ,ÁÉÍÓÖÚÜŐŰ,ÀÈÉÌÒÙ,,,"ÉËÖ ",ÅÆØÉ,ĄĆĘŁŃÓŚŹŻ,ÁÉÍÓÚÀÃÕÂÊÔÇ,,ĂÎȚÂȘ,АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ,АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ,ÄÖÅÉ,ÖÜÇĞİŞ,АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ, -Full options menu,OPTMNU_FULLOPTIONS,,,,Úplná nastavení,Fuld menu med indstillinger,Alle Optionen,Πλήρες μενού ρυθμίσεον,Plena agordo-menuo,Menú de opciones completo,,Täysi asetusvalikko,Menu options complet,Teljes beállításmenü,Opzioni complete,全オプション欄,전체 옵션 메뉴,Alle opties tonen,Full alternativmeny,Pełne Menu Opcji,Menu de opções completo,,Meniu Setări Complet,Полное меню настроек,,Fullständig alternativmeny,Tam seçenekler menüsü,Повне меню налаштувань, -Simple options menu,OPTMNU_SIMPLEON,,,,Zjednodušená nastavení,Enkel menu med indstillinger,Einfaches Optionsmenü,Απλό μενού ρυθμίσεον,Simpla agordo-menuo,Menú de opciones simplificado,,Yksinkertainen asetusvalikko,Menu options simplifié,Egyszerű beállításmenü,Opzioni base,必要なオプションのみ,간단한 옵션 메뉴,Eenvoudig optiemenu,Enkel meny med alternativer,Proste Menu Opcji,Menu de opções simples,,Meniu Setări Simplificat,Упрощённое меню настроек,,Enkel alternativmeny,Basit seçenekler menüsü,Спрощене меню налаштувань, -Browse Game Config,OPTMNU_OPENCONFIG,,,,Procházet konfigurační soubory,Gennemse spilkonfiguration,Konfigurationsdatei anzeigen,,Foliumi agordojn de ludo,Abrir carpeta de configuración de juego,,Selaa pelin asetuksia,Parcourir configuration,Játék konfiguráció böngészése,Apri le Configurazioni di Gioco,ゲームコンフィグ参照,게임 환경설정 찾아보기,Door gameconfiguratie bladeren,Bla gjennom spillkonfigurasjon,Przeglądaj Ustawienia Gry,Abrir pasta de configuração de jogo,,Caută Configurația Jocului,Открыть файл настроек игры,,Bläddra i spelkonfigurationen,Oyun Yapılandırmasına Gözat,Перегляд налаштувань гри, -Browse Screenshots,OPTMNU_OPENSCREENSHOTS,,,,Procházet snímky obrazovky,Gennemse skærmbilleder,Screenshots anzeigen,,Foliumi ekrankopiojn,Abrir carpeta de capturas de pantalla,,Selaa kuvakaappauksia,Parcourir les captures d'écran,Képernyőképek böngészése,Apri gli Screenshot,クリーンショット参照,스크린샷 찾아보기,Door schermafbeeldingen bladeren,Bla gjennom skjermbilder,Przeglądaj Zrzuty Ekranu,Abrir pasta de capturas de tela,,Caută Capturi de Ecran,Просмотр снимков экрана,,Bläddra bland skärmdumpar,Ekran Görüntülerine Gözat,Перегляд скріншотів, -Browse Saved Games,OPTMNU_OPENSAVES,,,,Procházet uložené hry,Gennemse gemte spil,Spielstände anzeigen,,Foliumi konservitajn ludadojn,Abrir carpeta de partidas guardadas,,Selaa tallennettuja pelejä,Parcourir sauvegardes,Elmentett játékok böngészése,Apri i Giochi Salvati,セーブしたゲーム参照,저장된 게임 찾아보기,Door opgeslagen games bladeren,Bla gjennom lagrede spill,Przeglądaj Zapisy Gry,Abrir pasta de jogos salvos,,Caută Salvări,Просмотр сохранённых игр,,Bläddra bland sparade spel,Kaydedilen Oyunlara Gözat,Перегляд збережень ігр, -Swap mouse buttons,MOUSEMNU_SWAPBUTTONS,,,,Prohodit tlačítka myši,Udskift museknapper,Maustasten vertauschen,,Permuti musbutonojn,Alternar botones de ratón,,Vaihda hiiren painikkeita,Permuter les boutons de la souris,Egérgombok felcserélése,Inverti i comandi del mouse,マウスボタンを反転,마우스 버튼 바꾸기,Muisknoppen verwisselen,Bytt museknapper,Zamień Przyciski Myszki,Trocar botões do mouse,,Schimbă Butoanele Mouse-ului între Ele,Поменять местами кнопки мыши,Замените дугмад миша,Byta musknappar,Fare düğmelerini değiştirme,Поміняти місцями кнопки миші, -,,Additional menu texts,,,,,,,,,,,,,,,,,,,,,,,,,,, -Only modified,OPTVAL_ONLYMODIFIED,,,,Pouze upravené,Kun ændret,Nur modfizierte,,Nur modifitaj,Solo modificados,,Vain muunneltu,Modifié seulement,Csak módosított,Solo modificato,モディファイのみ,수정된 것만,Alleen gewijzigd,Bare endret,Tylko zmodyfikowane,Somente modificado,,Numai modificat,Только изменённый,Само модификовано,Endast ändrat,Yalnızca değiştirilmiş,Тільки в модифікаціях, -Unknown,TXT_UNKNOWN,,,,Neznámé,Ukendt,Unbekannt,Άχνωστο,Nekonata,Desconocido,,Tuntematon,Inconnue,Ismeretlen,Sconosciuto,不明,알 수 없음,Onbekend,Ukjent,Nieznane,Desconhecido,,Necunoscut,Неизвестно,Непознат,Okänd,Bilinmiyor,Невідомо, -HUD,OPTVAL_HUD,,,,,,,,,,,,ATH,,,,,,,,,,,Отображение информации,,,,Інтерфейс, -Automap,OPTVAL_AUTOMAP,,,,Automapa,,,,Aŭtomata mapo,Automapa,,,Carte,Auto-térkép,Automappa,オートマップ,오토맵,,,Automapa,Automapa,,Hartă Computerizată,Автокарта,Аутомап,,,Автокарта, -HUD + Automap,OPTVAL_HUDANDMAP,,,,HUD + Automapa,,,,HUD + Aŭtomata mapo,HUD + Automapa,,,ATH + Carte,HUD + Auto-térkép,HUD + Automappa,HUD+オートマップ,HUD + 오토맵,,,HUD + Automapa,HUD + Automapa,,Interfață + Hartă Computerizată,Интерфейс + автокарта,HUD + Аутомап,,,Інтерфейс + Автокарта, -This savegame needs these files,TXT_SAVEGAMENEEDS,,,,Uložená hra potřebuje tyto soubory,Dette savegame har brug for disse filer,Dieser Spielstand benötigt die folgenden Dateien,Το αρχείο αποθήκευσης χριάζετε αυτά τα αρχεία,Ĉi tiu konservita ludo bezonas ĉi tiujn dosierojn,Esta partida guardada necesita los siguientes archivos,,Tämä pelitallenne tarvitsee nämä tiedostot,Cette sauvegarde nécessite les fichiers suivants:,Ehhez a mentéshez a következő fájlok kellenek:,Questo salvataggio ha bisogno di questi file,このセーブデータには 必要なファイルがある,이 저장 된 게임은 해당 파일이 필요합니다.,Dit spel heeft de volgende bestanden nodig,Dette lagringsspillet trenger disse filene,Ten zapis gry potrzebuje tych plików,Este jogo salvo precisa destes arquivos,Este jogo guardado precisa destes arquivos,Acest joc salvat necesită următoarele fișiere,Данное сохранение требует следующие файлы,Овој сачуваној игри требају ови фајлови,Detta sparande behöver dessa filer,Bu kayıt oyunu şu dosyalara ihtiyaç duyar,Цій грі потрібні такі файли, -Multiplayer Options,OPTMNU_MULTIPLAYER,,,,Multiplayer,Multiplayer-indstillinger,Mehrspieleroptionen,,Agordoj de la plurludanta reĝimo,Opciones del multijugador,,Moninpelivaihtoehdot,Options multijoueurs,Többjátékos lehetőségek,Opzioni multigiocatore,マルチプレイ オプション,멀티플레이어 옵션,Multiplayer Opties,Alternativer for flerspiller,Opcje Trybu Wielu Graczy,Opções de multijogador,,Opțiuni multiplayer,Настройки сетевой игры,Опције за више играча,Alternativ för flera spelare,Çok Oyunculu Seçenekler,Параметри багатокористувацької гри, -Input Options,OPTMNU_INPUT,,,,Vstupní zařízení,Input-indstillinger,Eingabeoptionen,,Enig-agordoj,Opciones de entrada (input),,Syöttöasetukset,Options d'entrée,Beviteli beállítások,Opzioni di ingresso,入力オプション,입력 옵션,In1voeropties,Alternativer for inndata,Opcje Sterowania,Opções de entrada,,Opțiuni de intrare,Настройки ввода,Опције уноса,Inmatningsalternativ,Girdi Seçenekleri,Параметри введення, -System Options,OPTMNU_SYSTEM,,,,Systém,Systemindstillinger,Systemoptionen,,Agordoj de la sistemo,Opciones del sistema,,Järjestelmäasetukset,Options du système,Rendszerbeállítások,Opzioni di sistema,システムオプション,시스템 옵션,Systeem Opties,Systemalternativer,Opcje Systemowe,Opções de sistema,,Opțiuni de sistem,Настройки системы,Системске опције,Systemalternativ,Sistem Seçenekleri,Системні налаштування, -Light Options,OPTMNU_LIGHT,,,,Osvětlení,Lysindstillinger,Beleuchtungsoptionen,,Lum-agordoj,Opciones de iluminación,,Valoasetukset,Options de lumière,Fénybeállítások,Opzioni luce,光源オプション,조명 옵션,Licht Opties,Alternativer for lys,Opcje Oświetlenia,Opções de iluminação,,Opțiuni de lumină,Настройки освещения,Опције осветљења,Alternativ för ljus,Işık Seçenekleri,Параметри освітлення, -Sprite Options,OPTMNU_SPRITE,,,,Sprity,Sprite-indstillinger,Spriteoptionen,,Agordoj de la mov-rastrumoj,Opciones de los «sprites»,,Sprite-asetukset,Options des sprites,Sprite beállítások,Opzioni Sprite,スプライトオプション,스프라이트 옵션,Sprite-opties,Sprite-alternativer,Opcje Sprite'ów,Opções de sprite,,Opțiuni Sprite,Настройки спрайтов,Сприте опције,Alternativ för sprite,Sprite Seçenekleri,Параметри спрайтів, -Coronas,GLPREFMNU_CORONAS,,,,Záře,Coronas,,,Lum-ampoloj,Focos de luz,,Coronat,Corons,Coronák,Corone,光冠,코로나,Corona's,Koronaer,Korony,,,Coronas,Короны,Цоронас,Koronor,Koronalar,Корони, -Appearance,DSPLYMNU_APPEARANCE,,,,Vzhled,Udseende,Spieldarstellung,,Aspekto,Apariencia,,Ulkonäkö,Apparence,Megjelenés,Aspetto,アピアランス,외형,Uiterlijk,Utseende,Wygląd,Aparência,,Aspect,Внешность,Изглед,Utseende,Görünüş,Зовнішній вигляд, -Advanced Display Options,DSPLYMNU_ADVANCED,,,,Grafika (pokročilé),Avancerede visningsindstillinger,Erweiterte Anzeigeoptionen,,Altnivelaj ekran-agordoj,Opciones avanzadas de visualización,,Näytön lisäasetukset,Options d'affichage avancées,Speciális megjelenítési beállítások,Opzioni di visualizzazione avanzate,高度なディスプレイオプション,고급 디스플레이 옵션,Geavanceerde Weergave Opties,Avanserte visningsalternativer,Zaawansowane Opcje Wyświetlania,Opções de vídeo avançadas,,Opțiuni avansate de afișare,Расширенные настройки экрана,Напредне опције приказа,Avancerade visningsalternativ,Gelişmiş Görüntüleme Seçenekleri,Додаткові параметри відображення, -,,IWAD/Game picker,,,,,,,,,,,,,,,,,,,,,,,,,,, -Select which game file to run.,PICKER_SELECT,,,,"Vyberte, jaký herní soubor spustit.","Vælg, hvilket spil du vil spille",Bitte wähle ein Spiel aus.,,Elektu kiun ludodosieron ruli.,,,Valitse suoritettava pelitiedosto.,Sélectionner le jeu à jouer,"Válassza ki, hogy melyik játékfájlt futtassa.",Selezionare il file di gioco da eseguire.,実行するゲームファイルを選択します。,실행할 게임 파일을 선택합니다.,Selecteer welk spel je wilt spelen,Velg hvilket spill du vil spille,"Wybierz, który plik gry uruchomić.",Selecione o arquivo de jogo para rodar.,,Selectați ce fișier de joc să rulați.,Выбор файла игры для запуска.,Изаберите коју датотеку игре желите да покренете.,Välj vilket spel du vill spela,Hangi oyunu oynayacağınızı seçin,Виберіть файл гри для запуску., -Play Game,PICKER_PLAY,,,,Hrát hru,Start spil,Spielen,,Ludi Ludon,,,Pelin pelaaminen,Démarrer le jeu,Játék lejátszása,Esegui gioco,ゲームをプレイする,게임 플레이,Spel starten,Start spill,Graj,Jogar,,Joacă jocul,Играть,Играј игру,Starta spel,Oyunu Başlat,Запустити гру, -Exit,PICKER_EXIT,,,,Odejít,Afslut,Verlassen,,Eliri,,,Poistu,Quitter,Kilépés,Esci,終了,종료,Verlaten,Avslutt,Wyjdź,Sair,,Ieșire,Выход,Изађи,Avsluta,Çıkış,Вихід, -General,PICKER_GENERAL,,,,Obecné,Generelt,Allgemein,,Ĝenerala,,,Yleistä,Général,Általános,Generale,一般,일반,Algemeen,Generelt,Ogólne,Geral,,,Общее,Генерал,Allmänt,Genel,Загальні, -Extra Graphics,PICKER_EXTRA,,,,Grafické doplňky,Ekstra grafik,Extragrafiken,,Ekstra Grafiko,,,Extra Graphics,Graphiques supplémentaires,Extra grafika,Grafica extra,追加グラフィックス,추가 그래픽,Extra afbeeldingen,Ekstra grafikk,Ekstra grafiki,Gráficos extras,,Grafică suplimentară,Доп. графика,Ектра Грапхицс,Extra grafik,Ekstra Grafikler,Додаткова графіка, -Fullscreen,PICKER_FULLSCREEN,,,,Přes celou obrazovku,Fuld skærm,Vollbild,,Plena ekrano,,,Koko näyttö,Plein écran,Teljes képernyő,Schermo intero,フルスクリーン,전체 화면,Volledig scherm,Fullskjerm,Pełny ekran,Tela cheia,,Ecran complet,Полный экран,Цео екран,Fullskärm,Tam Ekran,Повноекранний режим, -Disable autoload,PICKER_NOAUTOLOAD,,,,Zakázat autoload,Deaktiver autoload,Autoload deaktivieren,,Malvalidigi aŭtomatan ŝargon,,,Poista automaattinen lataus käytöstä,Désactiver le chargement automatique,Automatikus betöltés kikapcsolása,Disabilita il caricamento automatico,オートロードを無効にする,자동 로드 비활성화,Autoload uitschakelen,Deaktiver autolading,Wyłącz auto-ładowanie,Desativar autocarregamento,,Dezactivați încărcarea automată,Отключить автозагрузку,Онемогући аутоматско учитавање,Inaktivera autoload,Otomatik yükleme yok,Вимкнути автозавантаження, -Don't ask me again,PICKER_DONTASK,,,,Již se neptat,Spørg mig ikke igen,Nicht nochmal fragen,,Ne demandu min denove,,,Älä kysy uudestaan,Ne me demandez plus rien,Ne kérdezz újra,Non chiedermelo più,二度と聞くな,다시 묻지 마세요,Vraag me niet opnieuw,Ikke spør meg igjen,Nie pytaj ponownie,Não me pergunte de novo,,Nu mă mai întrebați din nou,Не спрашивать снова,Не питај ме поново,Fråga mig inte igen,Bir daha sorma.,Не запитуйте мене більше, -Lights,PICKER_LIGHTS,,,,Světla,Lys,Lichtdefinitionen,,Lumoj,,,Valot,Lumières,Fények,Luci,ライト,조명,Verlichting,Lysdefinisjoner,Oświetlenie,Luzes,,Lumini,Освещение,Светла,Definitioner av ljus,Işık tanımları,Освітлення, -Brightmaps,PICKER_BRIGHTMAPS,,,,,,,,Helomapoj,,,Brightmaps,Cartes lumineuses,Brightmaps,Mappe luminose,ブライトマップ,브라이트맵,Heldermaps,Lyskart,Mapowanie świateł,,,,Карты освещения,Бригхтмапс,Ljuskartor,Brightmaps,Яскраві карти, -Widescreen,PICKER_WIDESCREEN,,,,,,Breitbildunterstützung,,Larĝekrana,,,Laajakuva,Écran large,Szélesképernyő,Schermo largo,ワイドスクリーン,와이드스크린,Breedbeeld,Bredskjerm,Szeroki ekran,,,,Широкий экран,Широки екран,Bredbildsskärm,Geniş Ekran,Широкоформатний, -Additional Parameters:,PICKER_ADDPARM,,,,Dodatečné parametry:,Yderligere parametre:,Zusätzliche Parameter,,Aldonaj Parametroj,,,Lisäparametrit:,Paramètres supplémentaires :,További paraméterek:,Parametri aggiuntivi:,追加パラメータ,환영합니다: %s!,Extra parameters:,Ytterligere parametere:,Dodatkowe parametry:,Parâmetros adicionais:,,Parametrii suplimentari:,Доп. параметры:,Додатни параметри:,Ytterligare parametrar:,Ek Parametreler:,Додаткові параметри:, -Welcome to %s!,PICKER_WELCOME,,,,Vítejte v enginu %s!,Velkommen til %s!,Willkommen bei %s!,,Bonvenon en %s!,,,Tervetuloa %s!,Bienvenue à %s !,Üdvözöljük a %s!,Benvenuti a %s!,ようこそ: %s!,에 오신 것을 환영합니다!,Welkom bij %s!,Velkommen til %s!,Witaj w %s!,Boas vindas ao %s!,,Bine ați venit la %s!,Добро пожаловать в %s!,Добродошли у %s!,Välkommen till %s!,S'ye hoş geldiniz!,Ласкаво просимо до %s!, -Version %s,PICKER_VERSION,,,,Verze %s,,,,Versio %s,,,Versio %s,,Verzió %s,Versione %s,バージョン %s,버전 %s,Versie %s,Versjon %s,Wersja %s,Versão %s,,Versiunea %s,Версия %s,Верзија %s,,Sürüm %s,Версія %s, -Rendering API,PICKER_PREFERBACKEND,,,,Renderovací API,,Render API,,Bildigado de API,API de renderizado,,Renderöinti API,API de rendu,Renderelő API,API di rendering,優先レンダリングAPI,기본적인 API 랜더링,,,API renderowania,API de renderização,,API Video Preferat,API для рендеринга,АПИ приказивања,API för rendering,,API для візуалізації, -Game,PICKER_TAB_PLAY,,,,Hra,Spil,Spiel,,Ludo,Juego,,Peli,Jeu,Játék,Gioco,ゲーム,게임,Spel,Spill,Gra,Jogo,,Joc,Игра,Игра,Spel,Oyun,Гра, -Enable this controller,JOYMNU_JOYENABLE,Option to enable or disable individual controllers/joysticks when configuring it in the Controller Options menu,,,Povolit tento ovladač,Aktivér denne controller,Diesen Controller aktivieren,,Ŝalti ĉi tiun ludregilon,Habilitar este controlador,,Aktivoi tämä ohjain,Activer ce contrôleur,Engedélyezze ezt a vezérlőt,Abilitare questo controllore,このコントローラーを有効にする,이 컨트롤러 활성화,Deze controller inschakelen,Aktiver denne kontrolleren,,,,Activați acest controler,Включить этот контроллер,Омогућите овај контролер,Aktivera denna styrenhet,Bu denetleyiciyi etkinleştirin,Увімкніть цей контролер, -Open Main Menu,CNTRLMNU_OPEN_MAIN,,,,Otevřít hlavní menu,Åbn hovedmenuen,Hauptmenü öffnen,,Malfermi Ĉefan Menuon,Abrir el menú principal,,Avaa päävalikko,Ouvrir le menu principal,Főmenü megnyitása,Aprire il menu principale,メインメニューを開く,메인 메뉴 열기,Hoofdmenu openen,Åpne hovedmenyen,,,,Deschideți meniul principal,Открыть главное меню,Отворите главни мени,Öppna huvudmenyn,Ana Menüyü Aç,Відкрити головне меню, \ No newline at end of file +Full options menu,OPTMNU_FULLOPTIONS,,,,Úplná nastavení,Fuld menu med indstillinger,Alle Optionen,Πλήρες μενού ρυθμίσεον,Plena agordo-menuo,Menú de opciones completo,,Täysi asetusvalikko,Menu options complet,Potpuni izbornik postavki,Teljes beállításmenü,Opzioni complete,全オプション欄,전체 옵션 메뉴,Alle opties tonen,Full alternativmeny,Pełne Menu Opcji,Menu de opções completo,,Meniu Setări Complet,Полное меню настроек,,Fullständig alternativmeny,Tam seçenekler menüsü,Повне меню налаштувань, +Simple options menu,OPTMNU_SIMPLEON,,,,Zjednodušená nastavení,Enkel menu med indstillinger,Einfaches Optionsmenü,Απλό μενού ρυθμίσεον,Simpla agordo-menuo,Menú de opciones simplificado,,Yksinkertainen asetusvalikko,Menu options simplifié,Jednostavni izbornik postavki,Egyszerű beállításmenü,Opzioni base,必要なオプションのみ,간단한 옵션 메뉴,Eenvoudig optiemenu,Enkel meny med alternativer,Proste Menu Opcji,Menu de opções simples,,Meniu Setări Simplificat,Упрощённое меню настроек,,Enkel alternativmeny,Basit seçenekler menüsü,Спрощене меню налаштувань, +Browse Game Config,OPTMNU_OPENCONFIG,,,,Procházet konfigurační soubory,Gennemse spilkonfiguration,Konfigurationsdatei anzeigen,,Foliumi agordojn de ludo,Abrir carpeta de configuración de juego,,Selaa pelin asetuksia,Parcourir configuration,Pregledaj konfiguraciju igre,Játék konfiguráció böngészése,Apri le Configurazioni di Gioco,ゲームコンフィグ参照,게임 환경설정 찾아보기,Door gameconfiguratie bladeren,Bla gjennom spillkonfigurasjon,Przeglądaj Ustawienia Gry,Abrir pasta de configuração de jogo,,Caută Configurația Jocului,Открыть файл настроек игры,,Bläddra i spelkonfigurationen,Oyun Yapılandırmasına Gözat,Перегляд налаштувань гри, +Browse Screenshots,OPTMNU_OPENSCREENSHOTS,,,,Procházet snímky obrazovky,Gennemse skærmbilleder,Screenshots anzeigen,,Foliumi ekrankopiojn,Abrir carpeta de capturas de pantalla,,Selaa kuvakaappauksia,Parcourir les captures d'écran,Pregledaj snimke zaslona,Képernyőképek böngészése,Apri gli Screenshot,クリーンショット参照,스크린샷 찾아보기,Door schermafbeeldingen bladeren,Bla gjennom skjermbilder,Przeglądaj Zrzuty Ekranu,Abrir pasta de capturas de tela,,Caută Capturi de Ecran,Просмотр снимков экрана,,Bläddra bland skärmdumpar,Ekran Görüntülerine Gözat,Перегляд скріншотів, +Browse Saved Games,OPTMNU_OPENSAVES,,,,Procházet uložené hry,Gennemse gemte spil,Spielstände anzeigen,,Foliumi konservitajn ludadojn,Abrir carpeta de partidas guardadas,,Selaa tallennettuja pelejä,Parcourir sauvegardes,Pregledaj spremljene igre,Elmentett játékok böngészése,Apri i Giochi Salvati,セーブしたゲーム参照,저장된 게임 찾아보기,Door opgeslagen games bladeren,Bla gjennom lagrede spill,Przeglądaj Zapisy Gry,Abrir pasta de jogos salvos,,Caută Salvări,Просмотр сохранённых игр,,Bläddra bland sparade spel,Kaydedilen Oyunlara Gözat,Перегляд збережень ігр, +Swap mouse buttons,MOUSEMNU_SWAPBUTTONS,,,,Prohodit tlačítka myši,Udskift museknapper,Maustasten vertauschen,,Permuti musbutonojn,Alternar botones de ratón,,Vaihda hiiren painikkeita,Permuter les boutons de la souris,Zamijeni tipke miša,Egérgombok felcserélése,Inverti i comandi del mouse,マウスボタンを反転,마우스 버튼 바꾸기,Muisknoppen verwisselen,Bytt museknapper,Zamień Przyciski Myszki,Trocar botões do mouse,,Schimbă Butoanele Mouse-ului între Ele,Поменять местами кнопки мыши,Замените дугмад миша,Byta musknappar,Fare düğmelerini değiştirme,Поміняти місцями кнопки миші, +,,Additional menu texts,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Only modified,OPTVAL_ONLYMODIFIED,,,,Pouze upravené,Kun ændret,Nur modfizierte,,Nur modifitaj,Solo modificados,,Vain muunneltu,Modifié seulement,Samo modificirano,Csak módosított,Solo modificato,モディファイのみ,수정된 것만,Alleen gewijzigd,Bare endret,Tylko zmodyfikowane,Somente modificado,,Numai modificat,Только изменённый,Само модификовано,Endast ändrat,Yalnızca değiştirilmiş,Тільки в модифікаціях, +Unknown,TXT_UNKNOWN,,,,Neznámé,Ukendt,Unbekannt,Άχνωστο,Nekonata,Desconocido,,Tuntematon,Inconnue,Nepoznato,Ismeretlen,Sconosciuto,不明,알 수 없음,Onbekend,Ukjent,Nieznane,Desconhecido,,Necunoscut,Неизвестно,Непознат,Okänd,Bilinmiyor,Невідомо, +HUD,OPTVAL_HUD,,,,,,,,,,,,ATH,Sučelje,,,,,,,,,,,Отображение информации,,,,Інтерфейс, +Automap,OPTVAL_AUTOMAP,,,,Automapa,,,,Aŭtomata mapo,Automapa,,,Carte,Autokarta,Auto-térkép,Automappa,オートマップ,오토맵,,,Automapa,Automapa,,Hartă Computerizată,Автокарта,Аутомап,,,Автокарта, +HUD + Automap,OPTVAL_HUDANDMAP,,,,HUD + Automapa,,,,HUD + Aŭtomata mapo,HUD + Automapa,,,ATH + Carte,Sučelje + Autokarta,HUD + Auto-térkép,HUD + Automappa,HUD+オートマップ,HUD + 오토맵,,,HUD + Automapa,HUD + Automapa,,Interfață + Hartă Computerizată,Интерфейс + автокарта,HUD + Аутомап,,,Інтерфейс + Автокарта, +This savegame needs these files,TXT_SAVEGAMENEEDS,,,,Uložená hra potřebuje tyto soubory,Dette savegame har brug for disse filer,Dieser Spielstand benötigt die folgenden Dateien,Το αρχείο αποθήκευσης χριάζετε αυτά τα αρχεία,Ĉi tiu konservita ludo bezonas ĉi tiujn dosierojn,Esta partida guardada necesita los siguientes archivos,,Tämä pelitallenne tarvitsee nämä tiedostot,Cette sauvegarde nécessite les fichiers suivants:,Ova spremljena igra zahtijeva slijedeće datoteke:,Ehhez a mentéshez a következő fájlok kellenek:,Questo salvataggio ha bisogno di questi file,このセーブデータには 必要なファイルがある,이 저장 된 게임은 해당 파일이 필요합니다.,Dit spel heeft de volgende bestanden nodig,Dette lagringsspillet trenger disse filene,Ten zapis gry potrzebuje tych plików,Este jogo salvo precisa destes arquivos,Este jogo guardado precisa destes arquivos,Acest joc salvat necesită următoarele fișiere,Данное сохранение требует следующие файлы,Овој сачуваној игри требају ови фајлови,Detta sparande behöver dessa filer,Bu kayıt oyunu şu dosyalara ihtiyaç duyar,Цій грі потрібні такі файли, +Multiplayer Options,OPTMNU_MULTIPLAYER,,,,Multiplayer,Multiplayer-indstillinger,Mehrspieleroptionen,,Agordoj de la plurludanta reĝimo,Opciones del multijugador,,Moninpelivaihtoehdot,Options multijoueurs,Postavke za više igrača,Többjátékos lehetőségek,Opzioni multigiocatore,マルチプレイ オプション,멀티플레이어 옵션,Multiplayer Opties,Alternativer for flerspiller,Opcje Trybu Wielu Graczy,Opções de multijogador,,Opțiuni multiplayer,Настройки сетевой игры,Опције за више играча,Alternativ för flera spelare,Çok Oyunculu Seçenekler,Параметри багатокористувацької гри, +Input Options,OPTMNU_INPUT,,,,Vstupní zařízení,Input-indstillinger,Eingabeoptionen,,Enig-agordoj,Opciones de entrada (input),,Syöttöasetukset,Options d'entrée,Postavke unosa,Beviteli beállítások,Opzioni di ingresso,入力オプション,입력 옵션,In1voeropties,Alternativer for inndata,Opcje Sterowania,Opções de entrada,,Opțiuni de intrare,Настройки ввода,Опције уноса,Inmatningsalternativ,Girdi Seçenekleri,Параметри введення, +System Options,OPTMNU_SYSTEM,,,,Systém,Systemindstillinger,Systemoptionen,,Agordoj de la sistemo,Opciones del sistema,,Järjestelmäasetukset,Options du système,Postavke sustava,Rendszerbeállítások,Opzioni di sistema,システムオプション,시스템 옵션,Systeem Opties,Systemalternativer,Opcje Systemowe,Opções de sistema,,Opțiuni de sistem,Настройки системы,Системске опције,Systemalternativ,Sistem Seçenekleri,Системні налаштування, +Light Options,OPTMNU_LIGHT,,,,Osvětlení,Lysindstillinger,Beleuchtungsoptionen,,Lum-agordoj,Opciones de iluminación,,Valoasetukset,Options de lumière,Postavke svjetla,Fénybeállítások,Opzioni luce,光源オプション,조명 옵션,Licht Opties,Alternativer for lys,Opcje Oświetlenia,Opções de iluminação,,Opțiuni de lumină,Настройки освещения,Опције осветљења,Alternativ för ljus,Işık Seçenekleri,Параметри освітлення, +Sprite Options,OPTMNU_SPRITE,,,,Sprity,Sprite-indstillinger,Spriteoptionen,,Agordoj de la mov-rastrumoj,Opciones de los «sprites»,,Sprite-asetukset,Options des sprites,Postavke spriteova,Sprite beállítások,Opzioni Sprite,スプライトオプション,스프라이트 옵션,Sprite-opties,Sprite-alternativer,Opcje Sprite'ów,Opções de sprite,,Opțiuni Sprite,Настройки спрайтов,Сприте опције,Alternativ för sprite,Sprite Seçenekleri,Параметри спрайтів, +Coronas,GLPREFMNU_CORONAS,,,,Záře,Coronas,,,Lum-ampoloj,Focos de luz,,Coronat,Corons,Korone,Coronák,Corone,光冠,코로나,Corona's,Koronaer,Korony,,,Coronas,Короны,Цоронас,Koronor,Koronalar,Корони, +Appearance,DSPLYMNU_APPEARANCE,,,,Vzhled,Udseende,Spieldarstellung,,Aspekto,Apariencia,,Ulkonäkö,Apparence,Izgled,Megjelenés,Aspetto,アピアランス,외형,Uiterlijk,Utseende,Wygląd,Aparência,,Aspect,Внешность,Изглед,Utseende,Görünüş,Зовнішній вигляд, +Advanced Display Options,DSPLYMNU_ADVANCED,,,,Grafika (pokročilé),Avancerede visningsindstillinger,Erweiterte Anzeigeoptionen,,Altnivelaj ekran-agordoj,Opciones avanzadas de visualización,,Näytön lisäasetukset,Options d'affichage avancées,Napredne postavke zaslona,Speciális megjelenítési beállítások,Opzioni di visualizzazione avanzate,高度なディスプレイオプション,고급 디스플레이 옵션,Geavanceerde Weergave Opties,Avanserte visningsalternativer,Zaawansowane Opcje Wyświetlania,Opções de vídeo avançadas,,Opțiuni avansate de afișare,Расширенные настройки экрана,Напредне опције приказа,Avancerade visningsalternativ,Gelişmiş Görüntüleme Seçenekleri,Додаткові параметри відображення, +,,IWAD/Game picker,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Select which game file to run.,PICKER_SELECT,,,,"Vyberte, jaký herní soubor spustit.","Vælg, hvilket spil du vil spille",Bitte wähle ein Spiel aus.,,Elektu kiun ludodosieron ruli.,,,Valitse suoritettava pelitiedosto.,Sélectionner le jeu à jouer,Odaberi koju igru želiš pokrenuti.,"Válassza ki, hogy melyik játékfájlt futtassa.",Selezionare il file di gioco da eseguire.,実行するゲームファイルを選択します。,실행할 게임 파일을 선택합니다.,Selecteer welk spel je wilt spelen,Velg hvilket spill du vil spille,"Wybierz, który plik gry uruchomić.",Selecione qual arquivo de jogo rodar.,,Selectați ce fișier de joc să rulați.,Выбор файла игры для запуска.,Изаберите коју датотеку игре желите да покренете.,Välj vilket spel du vill spela,Hangi oyunu oynayacağınızı seçin,Виберіть файл гри для запуску., +Play Game,PICKER_PLAY,,,,Hrát hru,Start spil,Spielen,,Ludi ludon,,,Pelin pelaaminen,Démarrer le jeu,Zaigraj igru,Játék lejátszása,Esegui gioco,ゲームをプレイする,게임 플레이,Spel starten,Start spill,Graj,Jogar,,Joacă jocul,Играть,Играј игру,Starta spel,Oyunu Başlat,Запустити гру, +Exit,PICKER_EXIT,,,,Odejít,Afslut,Verlassen,,Eliri,,,Poistu,Quitter,Izlaz,Kilépés,Esci,終了,종료,Verlaten,Avslutt,Wyjdź,Sair,,Ieșire,Выход,Изађи,Avsluta,Çıkış,Вихід, +General,PICKER_GENERAL,,,,Obecné,Generelt,Allgemein,,Ĝenerala,,,Yleistä,Général,Općenito,Általános,Generale,一般,일반,Algemeen,Generelt,Ogólne,Geral,,,Общее,Генерал,Allmänt,Genel,Загальні, +Extra Graphics,PICKER_EXTRA,,,,Grafické doplňky,Ekstra grafik,Extragrafiken,,Ekstra grafiko,,,Extra Graphics,Graphiques supplémentaires,Dodatna grafika,Extra grafika,Grafica extra,追加グラフィックス,추가 그래픽,Extra afbeeldingen,Ekstra grafikk,Ekstra grafiki,Gráficos extras,,Grafică suplimentară,Доп. графика,Ектра Грапхицс,Extra grafik,Ekstra Grafikler,Додаткова графіка, +Fullscreen,PICKER_FULLSCREEN,,,,Přes celou obrazovku,Fuld skærm,Vollbild,,Plena ekrano,,,Koko näyttö,Plein écran,Puni zaslon,Teljes képernyő,Schermo intero,フルスクリーン,전체 화면,Volledig scherm,Fullskjerm,Pełny ekran,Tela cheia,,Ecran complet,Полный экран,Цео екран,Fullskärm,Tam Ekran,Повноекранний режим, +Disable autoload,PICKER_NOAUTOLOAD,,,,Zakázat autoload,Deaktiver autoload,Autoload deaktivieren,,Malvalidigi aŭtoŝargon,,,Poista automaattinen lataus käytöstä,Désactiver le chargement automatique,Onemogući automatsko učitavanje,Automatikus betöltés kikapcsolása,Disabilita il caricamento automatico,オートロードを無効にする,자동 로드 비활성화,Autoload uitschakelen,Deaktiver autolading,Wyłącz auto-ładowanie,Desativar autocarregam.,,Dezactivați încărcarea automată,Откл. автозагрузку,Онемогући аутоматско учитавање,Inaktivera autoload,Otomatik yükleme yok,Вимкнути автозавантаження, +Don't ask me again,PICKER_DONTASK,,,,Již se neptat,Spørg mig ikke igen,Nicht nochmal fragen,,Ne demandu min denove,,,Älä kysy uudestaan,Ne me demandez plus rien,Više me ne pitaj,Ne kérdezz újra,Non chiedermelo più,再度聞かない,다시 묻지 마세요,Vraag me niet opnieuw,Ikke spør meg igjen,Nie pytaj ponownie,Não perguntar de novo,,Nu mă mai întrebați din nou,Не спрашивать снова,Не питај ме поново,Fråga mig inte igen,Bir daha sorma.,Не запитуйте мене більше, +Lights,PICKER_LIGHTS,,,,Světla,Lys,Lichtdefinitionen,,Lumoj,,,Valot,Lumières,Svjetla,Fények,Luci,ライト,조명,Verlichting,Lysdefinisjoner,Oświetlenie,Luzes,,Lumini,Освещение,Светла,Definitioner av ljus,Işık tanımları,Освітлення, +Brightmaps,PICKER_BRIGHTMAPS,,,,,,,,Helomapoj,,,Brightmaps,Cartes lumineuses,Svijetle karte,Brightmaps,Mappe luminose,ブライトマップ,브라이트맵,Heldermaps,Lyskart,Mapowanie świateł,,,,Карты освещения,Бригхтмапс,Ljuskartor,Brightmaps,Яскраві карти, +Widescreen,PICKER_WIDESCREEN,,,,,,Breitbildunterstützung,,Larĝekrana,,,Laajakuva,Écran large,Široki zaslon,Szélesképernyő,Widescreen,ワイドスクリーン,와이드스크린,Breedbeeld,Bredskjerm,Szeroki ekran,,,,Широкий экран,Широки екран,Bredbildsskärm,Geniş Ekran,Широкоформатний, +Additional Parameters:,PICKER_ADDPARM,,,,Dodatečné parametry:,Yderligere parametre:,Zusätzliche Parameter,,Aldonaj parametroj,,,Lisäparametrit:,Paramètres supplémentaires :,Dodatni parametri:,További paraméterek:,Parametri aggiuntivi:,追加パラメータ,환영합니다: %s!,Extra parameters:,Ytterligere parametere:,Dodatkowe parametry:,Parâmetros adicionais:,,Parametrii suplimentari:,Доп. параметры:,Додатни параметри:,Ytterligare parametrar:,Ek Parametreler:,Додаткові параметри:, +Welcome to %s!,PICKER_WELCOME,,,,Vítejte v enginu %s!,Velkommen til %s!,Willkommen bei %s!,,Bonvenon en %s!,,,Tervetuloa %s!,Bienvenue à %s !,Dobrodošao/la u %s!,Üdvözöljük a %s!,Benvenuti a %s!,ようこそ: %s!,에 오신 것을 환영합니다!,Welkom bij %s!,Velkommen til %s!,Witaj w %s!,Bem-vindo(a) ao %s!,,Bine ați venit la %s!,Добро пожаловать в %s!,Добродошли у %s!,Välkommen till %s!,S'ye hoş geldiniz!,Ласкаво просимо до %s!, +Version %s,PICKER_VERSION,,,,Verze %s,,,,Versio %s,,,Versio %s,,Verzija %s,Verzió %s,Versione %s,バージョン %s,버전 %s,Versie %s,Versjon %s,Wersja %s,Versão %s,,Versiunea %s,Версия %s,Верзија %s,,Sürüm %s,Версія %s, +Rendering API,PICKER_PREFERBACKEND,,,,Renderovací API,,Render API,,API de bildigado,API de renderizado,,Renderöinti API,API de rendu,Api za renderiranje,Renderelő API,API di rendering,優先レンダリングAPI,기본적인 API 랜더링,,,API renderowania,API de renderização,,API Video Preferat,API обработки,АПИ приказивања,API för rendering,,API для візуалізації, +Game,PICKER_TAB_PLAY,,,,Hra,Spil,Spiel,,Ludo,Juego,,Peli,Jeu,Igra,Játék,Gioco,ゲーム,게임,Spel,Spill,Gra,Jogo,,Joc,Игра,Игра,Spel,Oyun,Гра, +Enable this controller,JOYMNU_JOYENABLE,Option to enable or disable individual controllers/joysticks when configuring it in the Controller Options menu,,,Povolit tento ovladač,Aktivér denne controller,Diesen Controller aktivieren,,Ŝalti ĉi tiun ludregilon,Habilitar este controlador,,Aktivoi tämä ohjain,Activer ce contrôleur,Omogući ovaj kontroler,Engedélyezze ezt a vezérlőt,Attiva questo controller,このコントローラーを有効にする,이 컨트롤러 활성화,Deze controller inschakelen,Aktiver denne kontrolleren,Włącz ten kontroler,Habilitar este controle,,Activați acest controler,Включить этот контроллер,Омогућите овај контролер,Aktivera denna styrenhet,Bu denetleyiciyi etkinleştirin,Увімкніть цей контролер, +Open Main Menu,CNTRLMNU_OPEN_MAIN,,,,Otevřít hlavní menu,Åbn hovedmenuen,Hauptmenü öffnen,,Malfermi ĉefan menuon,Abrir el menú principal,,Avaa päävalikko,Ouvrir le menu principal,Otvori glavni izbornik,Főmenü megnyitása,Apri il menu principale,メインメニューを開く,메인 메뉴 열기,Hoofdmenu openen,Åpne hovedmenyen,Otwórz meny główne,Abrir menu principal,,Deschideți meniul principal,Открыть главное меню,Отворите главни мени,Öppna huvudmenyn,Ana Menüyü Aç,Відкрити головне меню, +,,New content,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Module replayer,MODMNU_REPLAYER,,,,Nastavení přehrávače modulů,Modulafspiller,Modul-Spieler,,Legilo de moduloj,Reproductor de módulos,,,Lecteur de module,,,Module replayer,,,Module replayer,Modulavspiller,,Reprodutor de módulos,,Redare a modulelor,,,Modulåterspelare,,Module replayer, \ No newline at end of file diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 4ac0a00ff..54aac3302 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -2060,11 +2060,17 @@ OptionValue ModVolumeRamps 2.0, "$OPTVAL_FULLRAMPING" } +OptionValue ModReplayers +{ + 0.0, "$OPTVAL_LIBXMP" + 1.0, "$OPTVAL_DUMB" +} OptionMenu ModReplayerOptions protected { Title "$MODMNU_TITLE" + Option "$MODMNU_REPLAYER", "mod_preferred_player", "ModReplayers" Slider "$MODMNU_MASTERVOLUME", "mod_dumb_mastervolume", 0.25, 4, 0.1, 1 Option "$ADVSNDMNU_SAMPLERATE", "mod_samplerate", "SampleRates" Option "$MODMNU_QUALITY", "mod_interp", "ModQuality" From 19e1d400e4c5b196d400154c2d84d0aa91d84f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 5 Oct 2024 23:03:05 -0300 Subject: [PATCH 348/414] Add bounds checking to GetMidTexturePosition, add assert to P_GetMidTexturePosition --- src/playsim/p_3dmidtex.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/playsim/p_3dmidtex.cpp b/src/playsim/p_3dmidtex.cpp index 0e2d7e10d..86937b53c 100644 --- a/src/playsim/p_3dmidtex.cpp +++ b/src/playsim/p_3dmidtex.cpp @@ -229,6 +229,8 @@ bool P_GetMidTexturePosition(const line_t *line, int sideno, double *ptextop, do { if (line->sidedef[0]==NULL || line->sidedef[1]==NULL) return false; + assert(sideno >= 0 && sideno <= 1); + side_t *side = line->sidedef[sideno]; FTextureID texnum = side->GetTexture(side_t::mid); if (!texnum.isValid()) return false; @@ -266,6 +268,9 @@ DEFINE_ACTION_FUNCTION(_Line, GetMidTexturePosition) double top = 0.0; double bottom = 0.0; + if(side < 0) ThrowAbortException(X_ARRAY_OUT_OF_BOUNDS, "side is negative"); + else if(side > 1) ThrowAbortException(X_ARRAY_OUT_OF_BOUNDS, "side is greater than one"); + bool res = P_GetMidTexturePosition(self,side,&top,&bottom); if (numret > 2) ret[2].SetFloat(bottom); if (numret > 1) ret[1].SetFloat(top); From 23d131f6c295e524aafd0dacd13fc0173ac015fd Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Sun, 6 Oct 2024 05:03:05 +0300 Subject: [PATCH 349/414] Made GetMidTexturePosition() const. --- wadsrc/static/zscript/mapdata.zs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/mapdata.zs b/wadsrc/static/zscript/mapdata.zs index 080e05f32..06a7bf3ea 100644 --- a/wadsrc/static/zscript/mapdata.zs +++ b/wadsrc/static/zscript/mapdata.zs @@ -238,7 +238,7 @@ struct Line native play native clearscope int Index() const; native bool Activate(Actor activator, int side, int type); native bool RemoteActivate(Actor activator, int side, int type, Vector3 pos); - native bool, double, double GetMidTexturePosition (int side); + native bool, double, double GetMidTexturePosition (int side) const; clearscope int GetUDMFInt(Name nm) const { From 4bb61bed9748b13103fcc43b0f7e12bcc2aa6645 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sun, 6 Oct 2024 22:20:05 +0800 Subject: [PATCH 350/414] Use `light_` prefix for soft shadows --- src/maploader/udmf.cpp | 2 +- src/namedef_custom.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 1820270d3..7ff310d28 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -792,7 +792,7 @@ public: th->friendlyseeblocks = CheckInt(key); break; - case NAME_SoftShadowRadius: + case NAME_light_softshadowradius: th->SoftShadowRadius = (float)CheckFloat(key); break; diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 7f7684d3d..6f2338009 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -868,7 +868,7 @@ xx(lm_dynamic) xx(lm_suncolor) // Light keywords -xx(SoftShadowRadius) +xx(light_softshadowradius) xx(skew_bottom_type) xx(skew_middle_type) From f5c06551e4a974cc326aac994ee6859138d322ac Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sun, 6 Oct 2024 22:05:41 +0800 Subject: [PATCH 351/414] Use a `light_` prefix for custom ZDRay stuff, and actually parse light_softshadowradius for map things --- specs/udmf_zdoom.txt | 5 +++-- src/maploader/udmf.cpp | 1 + src/namedef_custom.h | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 78ccd05b4..da83b7020 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -426,8 +426,9 @@ Note: All fields default to false unless mentioned otherwise. floatbobphase = ; // Sets the thing's floatbobphase. Valid phase values are 0-63. Default = -1 (use actor class default). lm_sampledist = ; // ZDRay lightmap sample distance for the entire map. Defines the map units each lightmap texel covers. Must be in powers of two. Default = 8 - lm_suncolor = ; // ZDRay lightmap sun color in hex. Default = "FFFFFF" - SoftShadowRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 + lm_suncolor = ; // ZDRay lightmap sun color. Default is white (0xFFFFFF). + + light_softshadowradius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 38ec2a0f9..1fd9869c3 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -791,6 +791,7 @@ public: th->friendlyseeblocks = CheckInt(key); break; + case NAME_light_softshadowradius: case NAME_lm_suncolor: case NAME_lm_sampledist: CHECK_N(Zd | Zdt) diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 4545e8746..dbf94dbaf 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -868,7 +868,7 @@ xx(lm_dynamic) xx(lm_suncolor) // Light keywords -xx(SoftShadowRadius) +xx(light_softshadowradius) xx(skew_bottom_type) xx(skew_middle_type) From f88decfd70c24a307de75b2ce5c84218b520993c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 5 Oct 2024 23:03:05 -0300 Subject: [PATCH 352/414] Add bounds checking to GetMidTexturePosition, add assert to P_GetMidTexturePosition --- src/playsim/p_3dmidtex.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/playsim/p_3dmidtex.cpp b/src/playsim/p_3dmidtex.cpp index 0e2d7e10d..86937b53c 100644 --- a/src/playsim/p_3dmidtex.cpp +++ b/src/playsim/p_3dmidtex.cpp @@ -229,6 +229,8 @@ bool P_GetMidTexturePosition(const line_t *line, int sideno, double *ptextop, do { if (line->sidedef[0]==NULL || line->sidedef[1]==NULL) return false; + assert(sideno >= 0 && sideno <= 1); + side_t *side = line->sidedef[sideno]; FTextureID texnum = side->GetTexture(side_t::mid); if (!texnum.isValid()) return false; @@ -266,6 +268,9 @@ DEFINE_ACTION_FUNCTION(_Line, GetMidTexturePosition) double top = 0.0; double bottom = 0.0; + if(side < 0) ThrowAbortException(X_ARRAY_OUT_OF_BOUNDS, "side is negative"); + else if(side > 1) ThrowAbortException(X_ARRAY_OUT_OF_BOUNDS, "side is greater than one"); + bool res = P_GetMidTexturePosition(self,side,&top,&bottom); if (numret > 2) ret[2].SetFloat(bottom); if (numret > 1) ret[1].SetFloat(top); From 354e5fed345a588f334f94eb6020f7ba73307677 Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Sun, 6 Oct 2024 05:03:05 +0300 Subject: [PATCH 353/414] Made GetMidTexturePosition() const. --- wadsrc/static/zscript/mapdata.zs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/mapdata.zs b/wadsrc/static/zscript/mapdata.zs index 080e05f32..06a7bf3ea 100644 --- a/wadsrc/static/zscript/mapdata.zs +++ b/wadsrc/static/zscript/mapdata.zs @@ -238,7 +238,7 @@ struct Line native play native clearscope int Index() const; native bool Activate(Actor activator, int side, int type); native bool RemoteActivate(Actor activator, int side, int type, Vector3 pos); - native bool, double, double GetMidTexturePosition (int side); + native bool, double, double GetMidTexturePosition (int side) const; clearscope int GetUDMFInt(Name nm) const { From 2a3fe915a4de8d48a4066c26b9e5ae14faca0b73 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sun, 6 Oct 2024 22:05:41 +0800 Subject: [PATCH 354/414] Use a `light_` prefix for custom ZDRay stuff, and actually parse light_softshadowradius for map things --- specs/udmf_zdoom.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 9a219fd41..0b0b50c99 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -426,8 +426,9 @@ Note: All fields default to false unless mentioned otherwise. floatbobphase = ; // Sets the thing's floatbobphase. Valid phase values are 0-63. Default = -1 (use actor class default). lm_sampledist = ; // ZDRay lightmap sample distance for the entire map. Defines the map units each lightmap texel covers. Must be in powers of two. Default = 8 - lm_suncolor = ; // ZDRay lightmap sun color in hex. Default = "FFFFFF" - SoftShadowRadius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 + lm_suncolor = ; // ZDRay lightmap sun color. Default is white (0xFFFFFF). + + light_softshadowradius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 From 23c97b5a7332651f68358de0e3b8bcfbbb16b14c Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Tue, 8 Oct 2024 19:21:01 +0300 Subject: [PATCH 355/414] Updated ZDoom UDMF spec changelog. Added additions that never got their own version change in the changelog. --- specs/udmf_zdoom.txt | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index da83b7020..9e4df5472 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -586,23 +586,29 @@ arg0str in dynamic lights. Added automapstyle and revealed linedef properties. Replaced tabs with spaces. -1.31 22.12.2019 +1.31 31.10.2018 +Added destructible level geometry properties. + +1.32 22.12.2019 Coloriation options added -1.32 28.06.2021 +1.33 28.06.2021 Blocklandmonsters MBF21 flag -1.33 06.11.2021 +1.34 06.11.2021 Added separate light levels for sidedef tiers (top/mid/bottom) -1.34 11.09.2023 +1.35 11.09.2023 Added/updated ZDRay/lightmap-related properties. -1.35 15.09.2023 +1.36 15.09.2023 fixed omissions: Blocklandmonsters and Blockfloaters line flags. -1.36 20.10.2023 -Sidedef skewing properties +1.37 20.10.2023 +Sidedef skewing properties added + +1.38 30.09.2024 +Hurtmonsters and harminair added. =============================================================================== EOF From f9a59a989bac8a350cc37d6ba535635fae678564 Mon Sep 17 00:00:00 2001 From: "Dileep V. Reddy" Date: Tue, 8 Oct 2024 10:31:50 -0600 Subject: [PATCH 356/414] Orthographic projection Widescreen aspect ratio horizontal clipping fixed. This one-line change only affects ortho viewpoints. Easy to verify in windowed mode. --- src/rendering/hwrenderer/scene/hw_clipper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp index 6b256851b..cef7b06b1 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.cpp +++ b/src/rendering/hwrenderer/scene/hw_clipper.cpp @@ -477,7 +477,7 @@ angle_t Clipper::PointToPseudoOrthoAngle(double x, double y) angle_t af = viewpoint->FrustAngle; double xproj = disp.XY().Length() * deltaangle(disp.Angle(), viewpoint->Angles.Yaw).Sin(); xproj *= viewpoint->ScreenProj; - if (fabs(xproj) < 2.0) + if (fabs(xproj) < r_viewwindow.WidescreenRatio*1.13) // 2.0) { return AngleToPseudo( viewpoint->Angles.Yaw.BAMs() - xproj * 0.5 * af ); } From 37a7907221e402601d0d8312f397f068a1d807e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 6 Oct 2024 14:28:21 -0300 Subject: [PATCH 357/414] Allow setting light attenuation mode from mapinfo --- .../hwrenderer/data/hw_renderstate.h | 1 + .../hwrenderer/data/hw_viewpointuniforms.h | 10 +++++++ src/gamedata/g_mapinfo.cpp | 30 ++++++++++++++++++- src/gamedata/g_mapinfo.h | 1 + .../hwrenderer/scene/hw_drawinfo.cpp | 3 +- .../shaders/scene/binding_rsbuffers.glsl | 2 ++ .../shaders/scene/lightmodel_normal.glsl | 27 ++++++++++++++++- .../static/shaders/scene/lightmodel_pbr.glsl | 16 ++++++++-- .../shaders/scene/lightmodel_specular.glsl | 27 ++++++++++++++++- 9 files changed, 111 insertions(+), 6 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 788947768..80be8c69f 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -647,6 +647,7 @@ public: matrices.mClipLine.X = -10000000.0f; matrices.mShadowFilter = gl_light_shadow_filter; matrices.mLightBlendMode = 0; + matrices.mLightAttenuationMode = 0; matrices.mProjectionMatrix.ortho(0, (float)width, (float)height, 0, -1.0f, 1.0f); matrices.CalcDependencies(); return SetViewpoint(matrices); diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h index 89cb6aac0..64d580b4a 100644 --- a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h @@ -13,6 +13,14 @@ enum class ELightBlendMode : uint8_t DEFAULT = CLAMP, }; +enum class ELightAttenuationMode : uint8_t +{ + LINEAR = 0, + INVERSE_SQUARE = 1, + + DEFAULT = LINEAR, +}; + struct HWViewpointUniforms { VSMatrix mProjectionMatrix; @@ -35,6 +43,8 @@ struct HWViewpointUniforms int mLightTilesWidth = 0; + int mLightAttenuationMode = 0; + void CalcDependencies() { mNormalViewMatrix.computeNormalMatrix(mViewMatrix); diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 27609e6da..e4aead7e6 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -325,6 +325,7 @@ void level_info_t::Reset() skyrotatevector = FVector3(0, 0, 1); skyrotatevector2 = FVector3(0, 0, 1); lightblendmode = ELightBlendMode::DEFAULT; + lightattenuationmode = ELightAttenuationMode::DEFAULT; tonemap = ETonemapMode::None; } @@ -1596,10 +1597,14 @@ DEFINE_MAP_OPTION(lightblendmode, false) parse.ParseAssign(); parse.sc.MustGetString(); - if (parse.sc.Compare("Default") || parse.sc.Compare("Clamp")) + if (parse.sc.Compare("Default")) { info->lightblendmode = ELightBlendMode::DEFAULT; } + else if (parse.sc.Compare("Clamp")) + { + info->lightblendmode = ELightBlendMode::CLAMP; + } else if (parse.sc.Compare("ColoredClamp")) { info->lightblendmode = ELightBlendMode::CLAMP_COLOR; @@ -1642,6 +1647,29 @@ DEFINE_MAP_OPTION(lightblendmode, false) } } +DEFINE_MAP_OPTION(lightattenuationmode, false) +{ + parse.ParseAssign(); + parse.sc.MustGetString(); + + if (parse.sc.Compare("Default")) + { + info->lightattenuationmode = ELightAttenuationMode::DEFAULT; + } + else if (parse.sc.Compare("Linear")) + { + info->lightattenuationmode = ELightAttenuationMode::LINEAR; + } + else if (parse.sc.Compare("InverseSquare")) + { + info->lightattenuationmode = ELightAttenuationMode::INVERSE_SQUARE; + } + else + { + parse.sc.ScriptMessage("Invalid light attenuation mode %s", parse.sc.String); + } +} + DEFINE_MAP_OPTION(notexturefill, false) { if (parse.CheckAssign()) diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index 3bdaaa0a3..6dfcc7dfa 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -431,6 +431,7 @@ struct level_info_t FString acsName; bool fs_nocheckposition; ELightBlendMode lightblendmode; + ELightAttenuationMode lightattenuationmode; ETonemapMode tonemap; CutsceneDef intro, outro; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index fdd6b9507..b36cccaa2 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -127,7 +127,8 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni } VPUniforms.mClipLine.X = -10000000.0f; VPUniforms.mShadowFilter = static_cast(gl_light_shadow_filter); - VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0); + VPUniforms.mLightBlendMode = (level.info ? static_cast(level.info->lightblendmode) : 0); + VPUniforms.mLightAttenuationMode = (level.info ? static_cast(level.info->lightattenuationmode) : 0); } mClipper->SetViewpoint(Viewpoint); vClipper->SetViewpoint(Viewpoint); diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 3abe60a43..e4ca07fe2 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -21,6 +21,8 @@ layout(set = 1, binding = 0, std140) uniform ViewpointUBO int uLightBlendMode; int uLightTilesWidth; // Levelmesh light tiles + + int uLightAttenuationMode; }; layout(set = 1, binding = 1, std140) uniform MatricesUBO diff --git a/wadsrc/static/shaders/scene/lightmodel_normal.glsl b/wadsrc/static/shaders/scene/lightmodel_normal.glsl index 894a3d972..ac510e027 100644 --- a/wadsrc/static/shaders/scene/lightmodel_normal.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_normal.glsl @@ -1,3 +1,28 @@ +float linearDistanceAttenuation(vec4 lightpos, float d) +{ + return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); +} + +float inverseSquareDistanceAttenuation(vec4 lightpos, float d) +{ + float strength = 1500.0; + float r = lightpos.w; + float a = d / r; + float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); + return (b * b) / (d * d + 1.0) * strength; +} + +float distanceAttenuation(vec4 lightpos, float d) +{ + if ( uLightAttenuationMode == 1 ) + { + return inverseSquareDistanceAttenuation(lightpos, d); + } + else + { + return linearDistanceAttenuation(lightpos, d); + } +} vec3 lightContribution(int i, vec3 normal) { @@ -14,7 +39,7 @@ vec3 lightContribution(int i, vec3 normal) float dotprod = dot(normal, lightdir); if (dotprod < -0.0001) return vec3(0.0); // light hits from the backside. This can happen with full sector light lists and must be rejected for all cases. Note that this can cause precision issues. - float attenuation = clamp((lightpos.w - lightdistance) / lightpos.w, 0.0, 1.0); + float attenuation = distanceAttenuation(lightpos, lightdistance); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index 7c7f252a8..d1e0f2f52 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -61,6 +61,18 @@ float inverseSquareDistanceAttenuation(vec4 lightpos) return (b * b) / (d * d + 1.0) * strength; } +float distanceAttenuation(vec4 lightpos) +{ + if ( uLightAttenuationMode == 1 ) + { + return inverseSquareDistanceAttenuation(lightpos); + } + else + { + return linearDistanceAttenuation(lightpos); + } +} + vec3 ProcessMaterialLight(Material material, vec3 ambientLight) { vec3 worldpos = pixelpos.xyz; @@ -96,7 +108,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = inverseSquareDistanceAttenuation(lightpos); + float attenuation = distanceAttenuation(lightpos); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); if (lightcolor.a < 0.0) @@ -136,7 +148,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = linearDistanceAttenuation(lightpos); + float attenuation = distanceAttenuation(lightpos); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); if (lightcolor.a < 0.0) diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index a9d99c779..534bdec64 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -1,3 +1,28 @@ +float linearDistanceAttenuation(vec4 lightpos, float d) +{ + return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); +} + +float inverseSquareDistanceAttenuation(vec4 lightpos, float d) +{ + float strength = 1500.0; + float r = lightpos.w; + float a = d / r; + float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); + return (b * b) / (d * d + 1.0) * strength; +} + +float distanceAttenuation(vec4 lightpos, float d) +{ + if ( uLightAttenuationMode == 1 ) + { + return inverseSquareDistanceAttenuation(lightpos, d); + } + else + { + return linearDistanceAttenuation(lightpos, d); + } +} vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float glossiness, float specularLevel) { @@ -9,7 +34,7 @@ vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float if (lightpos.w < lightdistance) return vec2(0.0); // Early out lights touching surface but not this fragment - float attenuation = clamp((lightpos.w - lightdistance) / lightpos.w, 0.0, 1.0); + float attenuation = distanceAttenuation(lightpos, lightdistance); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); From 04ee3c335e3cde6f4af2fca175a3f74dd35987b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 6 Oct 2024 19:54:37 -0300 Subject: [PATCH 358/414] switch from uniform to shader keys --- .../hwrenderer/data/hw_renderstate.h | 2 - .../rendering/vulkan/shaders/vk_shader.cpp | 23 +++++++++ .../rendering/vulkan/shaders/vk_shader.h | 4 +- .../rendering/vulkan/vk_renderstate.cpp | 5 ++ .../hwrenderer/scene/hw_drawinfo.cpp | 2 - .../shaders/scene/binding_rsbuffers.glsl | 4 -- .../shaders/scene/lightmodel_normal.glsl | 50 ++++++++----------- .../static/shaders/scene/lightmodel_pbr.glsl | 49 ++++++++---------- .../shaders/scene/lightmodel_specular.glsl | 45 ++++++++--------- 9 files changed, 94 insertions(+), 90 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 80be8c69f..a8c5f0a0f 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -646,8 +646,6 @@ public: matrices.mPalLightLevels = palLightLevels; matrices.mClipLine.X = -10000000.0f; matrices.mShadowFilter = gl_light_shadow_filter; - matrices.mLightBlendMode = 0; - matrices.mLightAttenuationMode = 0; matrices.mProjectionMatrix.ortho(0, (float)width, (float)height, 0, -1.0f, 1.0f); matrices.CalcDependencies(); return SetViewpoint(matrices); diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 81797f201..07af5fca9 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -221,6 +221,29 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (key.GBufferPass) definesBlock << "#define GBUFFER_PASS\n"; if (key.AlphaTestOnly) definesBlock << "#define ALPHATEST_ONLY\n"; + switch(key.LightBlendMode) + { + case 0: + definesBlock << "#define LIGHT_BLEND_CLAMPED\n"; + break; + case 1: + definesBlock << "#define LIGHT_BLEND_COLORED_CLAMP\n"; + break; + case 2: + definesBlock << "#define LIGHT_BLEND_UNCLAMPED\n"; + break; + } + + switch(key.LightAttenuationMode) + { + case 0: + definesBlock << "#define LIGHT_ATTENUATION_LINEAR\n"; + break; + case 1: + definesBlock << "#define LIGHT_ATTENUATION_INVERSE_SQUARE\n"; + break; + } + if (key.DepthFadeThreshold) definesBlock << "#define USE_DEPTHFADETHRESHOLD\n"; if (key.Simple2D) definesBlock << "#define SIMPLE2D\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 035a1a60e..34e8610ac 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -98,7 +98,9 @@ public: uint64_t NoFragmentShader : 1; uint64_t DepthFadeThreshold : 1; uint64_t AlphaTestOnly : 1; // ALPHATEST_ONLY - uint64_t Unused : 40; + uint64_t LightBlendMode : 2; // LIGHT_BLEND_CLAMPED , LIGHT_BLEND_COLORED_CLAMP , LIGHT_BLEND_UNCLAMPED + uint64_t LightAttenuationMode : 1; // LIGHT_ATTENUATION_LINEAR , LIGHT_ATTENUATION_INVERSE_SQUARE + uint64_t Unused : 37; }; uint64_t AsQWORD = 0; }; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 9961a64ef..7ef73a5cb 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -38,6 +38,8 @@ #include "hw_clock.h" #include "flatvertices.h" +#include "g_levellocals.h" + CVAR(Int, vk_submit_size, 1000, 0); EXTERN_CVAR(Bool, r_skipmats) @@ -305,6 +307,9 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.GBufferPass = mRenderTarget.DrawBuffers > 1; + pipelineKey.ShaderKey.LightBlendMode = (level.info ? static_cast(level.info->lightblendmode) : 0); + pipelineKey.ShaderKey.LightAttenuationMode = (level.info ? static_cast(level.info->lightattenuationmode) : 0); + // Is this the one we already have? bool inRenderPass = mCommandBuffer; bool changingPipeline = (!inRenderPass) || (pipelineKey != mPipelineKey); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index b36cccaa2..836d68611 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -127,8 +127,6 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni } VPUniforms.mClipLine.X = -10000000.0f; VPUniforms.mShadowFilter = static_cast(gl_light_shadow_filter); - VPUniforms.mLightBlendMode = (level.info ? static_cast(level.info->lightblendmode) : 0); - VPUniforms.mLightAttenuationMode = (level.info ? static_cast(level.info->lightattenuationmode) : 0); } mClipper->SetViewpoint(Viewpoint); vClipper->SetViewpoint(Viewpoint); diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index e4ca07fe2..1ff0fc290 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -17,12 +17,8 @@ layout(set = 1, binding = 0, std140) uniform ViewpointUBO float uClipHeight; float uClipHeightDirection; int uShadowmapFilter; - - int uLightBlendMode; int uLightTilesWidth; // Levelmesh light tiles - - int uLightAttenuationMode; }; layout(set = 1, binding = 1, std140) uniform MatricesUBO diff --git a/wadsrc/static/shaders/scene/lightmodel_normal.glsl b/wadsrc/static/shaders/scene/lightmodel_normal.glsl index ac510e027..553d5aadb 100644 --- a/wadsrc/static/shaders/scene/lightmodel_normal.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_normal.glsl @@ -1,9 +1,6 @@ -float linearDistanceAttenuation(vec4 lightpos, float d) -{ - return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); -} +#ifdef LIGHT_ATTENUATION_INVERSE_SQUARE -float inverseSquareDistanceAttenuation(vec4 lightpos, float d) +float distanceAttenuation(vec4 lightpos, float d) { float strength = 1500.0; float r = lightpos.w; @@ -12,18 +9,15 @@ float inverseSquareDistanceAttenuation(vec4 lightpos, float d) return (b * b) / (d * d + 1.0) * strength; } +#else //elif defined(LIGHT_ATTENUATION_LINEAR) + float distanceAttenuation(vec4 lightpos, float d) { - if ( uLightAttenuationMode == 1 ) - { - return inverseSquareDistanceAttenuation(lightpos, d); - } - else - { - return linearDistanceAttenuation(lightpos, d); - } + return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); } +#endif + vec3 lightContribution(int i, vec3 normal) { vec4 lightpos = lights[i]; @@ -83,22 +77,22 @@ vec3 ProcessMaterialLight(Material material, vec3 color) } } } + + #ifdef LIGHT_BLEND_CLAMPED + + vec3 frag = material.Base.rgb * clamp(color + desaturate(dynlight).rgb, 0.0, 1.4); + + #elif defined(LIGHT_BLEND_COLORED_CLAMP) + + vec3 frag = color + desaturate(dynlight).rgb; + frag = material.Base.rgb * ((frag / max(max(max(frag.r, frag.g), frag.b), 1.4) * 1.4)); + + #else // elif defined(LIGHT_BLEND_UNCLAMPED) + + vec3 frag = material.Base.rgb * (color + desaturate(dynlight).rgb); + + #endif - vec3 frag; - - if ( uLightBlendMode == 1 ) - { // COLOR_CORRECT_CLAMPING - vec3 lightcolor = color + desaturate(dynlight).rgb; - frag = material.Base.rgb * ((lightcolor / max(max(max(lightcolor.r, lightcolor.g), lightcolor.b), 1.4) * 1.4)); - } - else if ( uLightBlendMode == 2 ) - { // UNCLAMPED - frag = material.Base.rgb * (color + desaturate(dynlight).rgb); - } - else - { - frag = material.Base.rgb * clamp(color + desaturate(dynlight).rgb, 0.0, 1.4); - } if (uLightIndex >= 0) { diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index d1e0f2f52..603787df1 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -1,3 +1,24 @@ +#ifdef LIGHT_ATTENUATION_INVERSE_SQUARE + +float distanceAttenuation(vec4 lightpos) +{ + float strength = 1500.0; + float d = distance(lightpos.xyz, pixelpos.xyz); + float r = lightpos.w; + float a = d / r; + float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); + return (b * b) / (d * d + 1.0) * strength; +} + +#else //elif defined(LIGHT_ATTENUATION_LINEAR) + +float distanceAttenuation(vec4 lightpos) +{ + float lightdistance = distance(lightpos.xyz, pixelpos.xyz); + return clamp((lightpos.w - lightdistance) / lightpos.w, 0.0, 1.0); +} + +#endif const float PI = 3.14159265359; @@ -45,34 +66,6 @@ vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0); } -float linearDistanceAttenuation(vec4 lightpos) -{ - float lightdistance = distance(lightpos.xyz, pixelpos.xyz); - return clamp((lightpos.w - lightdistance) / lightpos.w, 0.0, 1.0); -} - -float inverseSquareDistanceAttenuation(vec4 lightpos) -{ - float strength = 1500.0; - float d = distance(lightpos.xyz, pixelpos.xyz); - float r = lightpos.w; - float a = d / r; - float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); - return (b * b) / (d * d + 1.0) * strength; -} - -float distanceAttenuation(vec4 lightpos) -{ - if ( uLightAttenuationMode == 1 ) - { - return inverseSquareDistanceAttenuation(lightpos); - } - else - { - return linearDistanceAttenuation(lightpos); - } -} - vec3 ProcessMaterialLight(Material material, vec3 ambientLight) { vec3 worldpos = pixelpos.xyz; diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index 534bdec64..721efee0d 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -1,9 +1,6 @@ -float linearDistanceAttenuation(vec4 lightpos, float d) -{ - return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); -} +#ifdef LIGHT_ATTENUATION_INVERSE_SQUARE -float inverseSquareDistanceAttenuation(vec4 lightpos, float d) +float distanceAttenuation(vec4 lightpos, float d) { float strength = 1500.0; float r = lightpos.w; @@ -12,18 +9,15 @@ float inverseSquareDistanceAttenuation(vec4 lightpos, float d) return (b * b) / (d * d + 1.0) * strength; } +#else //elif defined(LIGHT_ATTENUATION_LINEAR) + float distanceAttenuation(vec4 lightpos, float d) { - if ( uLightAttenuationMode == 1 ) - { - return inverseSquareDistanceAttenuation(lightpos, d); - } - else - { - return linearDistanceAttenuation(lightpos, d); - } + return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); } +#endif + vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float glossiness, float specularLevel) { vec4 lightpos = lights[i]; @@ -88,25 +82,26 @@ vec3 ProcessMaterialLight(Material material, vec3 color) } } } - - if ( uLightBlendMode == 1 ) - { // COLOR_CORRECT_CLAMPING + + #if defined(LIGHT_BLEND_CLAMPED) + + dynlight.rgb = clamp(color + desaturate(dynlight).rgb, 0.0, 1.4); + specular.rgb = clamp(desaturate(specular).rgb, 0.0, 1.4); + + #elif defined(LIGHT_BLEND_COLORED_CLAMP) + dynlight.rgb = color + desaturate(dynlight).rgb; specular.rgb = desaturate(specular).rgb; dynlight.rgb = ((dynlight.rgb / max(max(max(dynlight.r, dynlight.g), dynlight.b), 1.4) * 1.4)); specular.rgb = ((specular.rgb / max(max(max(specular.r, specular.g), specular.b), 1.4) * 1.4)); - } - else if ( uLightBlendMode == 2 ) - { // UNCLAMPED + + #else // elif defined(LIGHT_BLEND_UNCLAMPED) + dynlight.rgb = color + desaturate(dynlight).rgb; specular.rgb = desaturate(specular).rgb; - } - else - { - dynlight.rgb = clamp(color + desaturate(dynlight).rgb, 0.0, 1.4); - specular.rgb = clamp(desaturate(specular).rgb, 0.0, 1.4); - } + + #endif vec3 frag = material.Base.rgb * dynlight.rgb + material.Specular * specular.rgb; From a79ea9414b824886b0ce1e1db2377648d0b38aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 6 Oct 2024 20:27:21 -0300 Subject: [PATCH 359/414] inverse square lights for sprites had to add a minimum distance to make sure smaller lights don't completely blow out actors nearby --- .../hwrenderer/scene/hw_spritelight.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index 031262daf..866024653 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -112,6 +112,15 @@ public: // //========================================================================== + +float inverseSquareAttenuation(FVector3 lightpos, float dist, float radius) +{ + float strength = 1500.0; + float a = dist / radius; + float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); + return (b * b) / (dist * dist + 1.0) * strength; +} + void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLightNode *node, int portalgroup, float *out) { FDynamicLight *light; @@ -167,7 +176,14 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig if (staticLight.TraceLightVisbility(node, L, dist)) { - frac = 1.0f - (dist / radius); + if(level.info->lightattenuationmode == ELightAttenuationMode::INVERSE_SQUARE) + { + frac = (inverseSquareAttenuation(L, std::max(dist, sqrt(radius) * 2), radius)); + } + else + { + frac = 1.0f - (dist / radius); + } if (light->IsSpot()) { From f11ed26eb81fb8f59218b03b062e9043bb26f1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 6 Oct 2024 20:56:59 -0300 Subject: [PATCH 360/414] deduplicate code --- .../hwrenderer/scene/hw_spritelight.cpp | 4 +-- .../shaders/scene/lightmodel_normal.glsl | 22 ++-------------- .../static/shaders/scene/lightmodel_pbr.glsl | 26 +++---------------- .../shaders/scene/lightmodel_shared.glsl | 18 +++++++++++++ .../shaders/scene/lightmodel_specular.glsl | 22 ++-------------- 5 files changed, 27 insertions(+), 65 deletions(-) create mode 100644 wadsrc/static/shaders/scene/lightmodel_shared.glsl diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index 866024653..557dcbeec 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -113,7 +113,7 @@ public: //========================================================================== -float inverseSquareAttenuation(FVector3 lightpos, float dist, float radius) +float inverseSquareAttenuation(float dist, float radius) { float strength = 1500.0; float a = dist / radius; @@ -178,7 +178,7 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig { if(level.info->lightattenuationmode == ELightAttenuationMode::INVERSE_SQUARE) { - frac = (inverseSquareAttenuation(L, std::max(dist, sqrt(radius) * 2), radius)); + frac = (inverseSquareAttenuation(std::max(dist, sqrt(radius) * 2), radius)); } else { diff --git a/wadsrc/static/shaders/scene/lightmodel_normal.glsl b/wadsrc/static/shaders/scene/lightmodel_normal.glsl index 553d5aadb..519b71afd 100644 --- a/wadsrc/static/shaders/scene/lightmodel_normal.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_normal.glsl @@ -1,22 +1,4 @@ -#ifdef LIGHT_ATTENUATION_INVERSE_SQUARE - -float distanceAttenuation(vec4 lightpos, float d) -{ - float strength = 1500.0; - float r = lightpos.w; - float a = d / r; - float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); - return (b * b) / (d * d + 1.0) * strength; -} - -#else //elif defined(LIGHT_ATTENUATION_LINEAR) - -float distanceAttenuation(vec4 lightpos, float d) -{ - return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); -} - -#endif +#include "shaders/scene/lightmodel_shared.glsl" vec3 lightContribution(int i, vec3 normal) { @@ -33,7 +15,7 @@ vec3 lightContribution(int i, vec3 normal) float dotprod = dot(normal, lightdir); if (dotprod < -0.0001) return vec3(0.0); // light hits from the backside. This can happen with full sector light lists and must be rejected for all cases. Note that this can cause precision issues. - float attenuation = distanceAttenuation(lightpos, lightdistance); + float attenuation = distanceAttenuation(lightdistance, lightpos.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index 603787df1..bd0573130 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -1,24 +1,4 @@ -#ifdef LIGHT_ATTENUATION_INVERSE_SQUARE - -float distanceAttenuation(vec4 lightpos) -{ - float strength = 1500.0; - float d = distance(lightpos.xyz, pixelpos.xyz); - float r = lightpos.w; - float a = d / r; - float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); - return (b * b) / (d * d + 1.0) * strength; -} - -#else //elif defined(LIGHT_ATTENUATION_LINEAR) - -float distanceAttenuation(vec4 lightpos) -{ - float lightdistance = distance(lightpos.xyz, pixelpos.xyz); - return clamp((lightpos.w - lightdistance) / lightpos.w, 0.0, 1.0); -} - -#endif +#include "shaders/scene/lightmodel_shared.glsl" const float PI = 3.14159265359; @@ -101,7 +81,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = distanceAttenuation(lightpos); + float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); if (lightcolor.a < 0.0) @@ -141,7 +121,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = distanceAttenuation(lightpos); + float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); if (lightcolor.a < 0.0) diff --git a/wadsrc/static/shaders/scene/lightmodel_shared.glsl b/wadsrc/static/shaders/scene/lightmodel_shared.glsl new file mode 100644 index 000000000..5af9136cb --- /dev/null +++ b/wadsrc/static/shaders/scene/lightmodel_shared.glsl @@ -0,0 +1,18 @@ +#ifdef LIGHT_ATTENUATION_INVERSE_SQUARE + +float distanceAttenuation(float dist, float radius) +{ + float strength = 1500.0; + float a = dist / radius; + float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); + return (b * b) / (dist * dist + 1.0) * strength; +} + +#else //elif defined(LIGHT_ATTENUATION_LINEAR) + +float distanceAttenuation(float dist, float radius) +{ + return clamp((radius - dist) / radius, 0.0, 1.0); +} + +#endif diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index 721efee0d..cbebb7f3b 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -1,22 +1,4 @@ -#ifdef LIGHT_ATTENUATION_INVERSE_SQUARE - -float distanceAttenuation(vec4 lightpos, float d) -{ - float strength = 1500.0; - float r = lightpos.w; - float a = d / r; - float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); - return (b * b) / (d * d + 1.0) * strength; -} - -#else //elif defined(LIGHT_ATTENUATION_LINEAR) - -float distanceAttenuation(vec4 lightpos, float d) -{ - return clamp((lightpos.w - d) / lightpos.w, 0.0, 1.0); -} - -#endif +#include "shaders/scene/lightmodel_shared.glsl" vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float glossiness, float specularLevel) { @@ -28,7 +10,7 @@ vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float if (lightpos.w < lightdistance) return vec2(0.0); // Early out lights touching surface but not this fragment - float attenuation = distanceAttenuation(lightpos, lightdistance); + float attenuation = distanceAttenuation(lightdistance, lightpos.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); From f226d6a00f58eb09dd0293721002e3a7440c4cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 6 Oct 2024 22:54:13 -0300 Subject: [PATCH 361/414] improve strength for small lights --- src/rendering/hwrenderer/scene/hw_spritelight.cpp | 2 +- wadsrc/static/shaders/scene/lightmodel_shared.glsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index 557dcbeec..ff786e21d 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -115,7 +115,7 @@ public: float inverseSquareAttenuation(float dist, float radius) { - float strength = 1500.0; + float strength = std::min(1500.0f, (radius * radius) / 10); float a = dist / radius; float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); return (b * b) / (dist * dist + 1.0) * strength; diff --git a/wadsrc/static/shaders/scene/lightmodel_shared.glsl b/wadsrc/static/shaders/scene/lightmodel_shared.glsl index 5af9136cb..f2ca2947a 100644 --- a/wadsrc/static/shaders/scene/lightmodel_shared.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_shared.glsl @@ -2,7 +2,7 @@ float distanceAttenuation(float dist, float radius) { - float strength = 1500.0; + float strength = min(1500.0, (radius * radius) / 10); float a = dist / radius; float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); return (b * b) / (dist * dist + 1.0) * strength; From 159ae02a2a46c0116ca9a04c76e85f1f729e8577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sun, 6 Oct 2024 23:32:49 -0300 Subject: [PATCH 362/414] fix includes --- .../rendering/vulkan/shaders/vk_shader.cpp | 61 +++++++++++-------- .../rendering/vulkan/shaders/vk_shader.h | 2 +- .../shaders/scene/lightmodel_normal.glsl | 2 - .../static/shaders/scene/lightmodel_pbr.glsl | 2 - .../shaders/scene/lightmodel_specular.glsl | 2 - 5 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 07af5fca9..622041974 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -97,23 +97,24 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) const char* fp2; const char* fp3; const char* fp4; + const char* fp5; const char* defines; }; static const FEffectShader effectshaders[] = { - { "fogboundary", "shaders/scene/frag_fogboundary.glsl", nullptr, nullptr, nullptr, "#define NO_ALPHATEST\n" }, - { "spheremap", "shaders/scene/frag_main.glsl", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define SPHEREMAP\n#define NO_ALPHATEST\n" }, - { "burn", "shaders/scene/frag_burn.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, - { "stencil", "shaders/scene/frag_stencil.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, - { "portal", "shaders/scene/frag_portal.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, - { "dithertrans", "shaders/scene/frag_main.glsl", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define NO_ALPHATEST\n#define DITHERTRANS\n" }, + { "fogboundary", "shaders/scene/frag_fogboundary.glsl", nullptr, nullptr, nullptr, nullptr, "#define NO_ALPHATEST\n" }, + { "spheremap", "shaders/scene/frag_main.glsl", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", "#define SPHEREMAP\n#define NO_ALPHATEST\n" }, + { "burn", "shaders/scene/frag_burn.glsl", nullptr, nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, + { "stencil", "shaders/scene/frag_stencil.glsl", nullptr, nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, + { "portal", "shaders/scene/frag_portal.glsl", nullptr, nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, + { "dithertrans", "shaders/scene/frag_main.glsl", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", "#define NO_ALPHATEST\n#define DITHERTRANS\n" }, }; const auto& desc = effectshaders[key.SpecialEffect]; program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.defines, key.UseLevelMesh); if (!key.NoFragmentShader) - program.frag = LoadFragShader(desc.ShaderName, desc.fp1, desc.fp2, desc.fp3, desc.fp4, desc.defines, key); + program.frag = LoadFragShader(desc.ShaderName, desc.fp1, desc.fp2, desc.fp3, desc.fp4, desc.fp5, desc.defines, key); } else { @@ -122,6 +123,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) const char* ShaderName; const char* material_lump; const char* mateffect_lump; + const char* lightmodel_lump_shared; const char* lightmodel_lump; const char* Defines; }; @@ -129,21 +131,21 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) // Note: the MaterialShaderIndex enum needs to be updated whenever this array is modified. static const FDefaultShader defaultshaders[] = { - {"Default", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Warp 1", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp1.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Warp 2", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp2.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Specular", "shaders/scene/material_spec.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_specular.glsl", "#define SPECULAR\n#define NORMALMAP\n"}, - {"PBR", "shaders/scene/material_pbr.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_pbr.glsl", "#define PBR\n#define NORMALMAP\n"}, - {"Paletted", "shaders/scene/material_paletted.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_nolights.glsl", "#define PALETTE_EMULATION\n"}, - {"No Texture", "shaders/scene/material_notexture.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define NO_LAYERS\n"}, - {"Basic Fuzz", "shaders/scene/material_fuzz_standard.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Smooth Fuzz", "shaders/scene/material_fuzz_smooth.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Swirly Fuzz", "shaders/scene/material_fuzz_swirly.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Translucent Fuzz", "shaders/scene/material_fuzz_smoothtranslucent.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Jagged Fuzz", "shaders/scene/material_fuzz_jagged.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Noise Fuzz", "shaders/scene/material_fuzz_noise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Smooth Noise Fuzz", "shaders/scene/material_fuzz_smoothnoise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Software Fuzz", "shaders/scene/material_fuzz_software.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Default", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Warp 1", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp1.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Warp 2", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp2.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Specular", "shaders/scene/material_spec.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_specular.glsl", "#define SPECULAR\n#define NORMALMAP\n"}, + {"PBR", "shaders/scene/material_pbr.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_pbr.glsl", "#define PBR\n#define NORMALMAP\n"}, + {"Paletted", "shaders/scene/material_paletted.glsl", "shaders/scene/mateffect_default.glsl", nullptr, "shaders/scene/lightmodel_nolights.glsl", "#define PALETTE_EMULATION\n"}, + {"No Texture", "shaders/scene/material_notexture.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", "#define NO_LAYERS\n"}, + {"Basic Fuzz", "shaders/scene/material_fuzz_standard.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Smooth Fuzz", "shaders/scene/material_fuzz_smooth.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Swirly Fuzz", "shaders/scene/material_fuzz_swirly.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Translucent Fuzz", "shaders/scene/material_fuzz_smoothtranslucent.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Jagged Fuzz", "shaders/scene/material_fuzz_jagged.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Noise Fuzz", "shaders/scene/material_fuzz_noise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Smooth Noise Fuzz", "shaders/scene/material_fuzz_smoothnoise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Software Fuzz", "shaders/scene/material_fuzz_software.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_shared.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, {nullptr,nullptr,nullptr,nullptr} }; @@ -152,7 +154,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) const auto& desc = defaultshaders[key.EffectState]; program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.Defines, key.UseLevelMesh); if (!key.NoFragmentShader) - program.frag = LoadFragShader(desc.ShaderName, mainfp, desc.material_lump, desc.mateffect_lump, desc.lightmodel_lump, desc.Defines, key); + program.frag = LoadFragShader(desc.ShaderName, mainfp, desc.material_lump, desc.mateffect_lump, desc.lightmodel_lump_shared, desc.lightmodel_lump, desc.Defines, key); } else { @@ -162,7 +164,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) program.vert = LoadVertShader(name, mainvp, defines.GetChars(), key.UseLevelMesh); if (!key.NoFragmentShader) - program.frag = LoadFragShader(name, mainfp, desc.shader.GetChars(), defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump, defines.GetChars(), key); + program.frag = LoadFragShader(name, mainfp, desc.shader.GetChars(), defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump_shared, defaultshaders[desc.shaderType].lightmodel_lump, defines.GetChars(), key); } } return &program; @@ -205,7 +207,7 @@ std::unique_ptr VkShaderManager::LoadVertShader(FString shadername .Create(shadername.GetChars(), fb->GetDevice()); } -std::unique_ptr VkShaderManager::LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump, const char *defines, const VkShaderKey& key) +std::unique_ptr VkShaderManager::LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump_shared, const char *light_lump, const char *defines, const VkShaderKey& key) { FString definesBlock; if (fb->IsRayQueryEnabled()) definesBlock << "\n#define SUPPORTS_RAYQUERY\n"; @@ -352,7 +354,14 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (light_lump && lightBlock.IsEmpty()) { lightname = light_lump; - lightBlock << LoadPrivateShaderLump(light_lump).GetChars(); + if(light_lump_shared) + { + lightBlock << (LoadPrivateShaderLump(light_lump_shared) + LoadPrivateShaderLump(light_lump)).GetChars(); + } + else + { + lightBlock << LoadPrivateShaderLump(light_lump).GetChars(); + } } if (mateffect_lump && mateffectBlock.IsEmpty()) diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 34e8610ac..61dee3e72 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -145,7 +145,7 @@ public: private: std::unique_ptr LoadVertShader(FString shadername, const char *vert_lump, const char *defines, bool levelmesh); - std::unique_ptr LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *lightmodel_lump, const char *defines, const VkShaderKey& key); + std::unique_ptr LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump_shared, const char *lightmodel_lump, const char *defines, const VkShaderKey& key); ShaderIncludeResult OnInclude(FString headerName, FString includerName, size_t depth, bool system); diff --git a/wadsrc/static/shaders/scene/lightmodel_normal.glsl b/wadsrc/static/shaders/scene/lightmodel_normal.glsl index 519b71afd..4677544bf 100644 --- a/wadsrc/static/shaders/scene/lightmodel_normal.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_normal.glsl @@ -1,5 +1,3 @@ -#include "shaders/scene/lightmodel_shared.glsl" - vec3 lightContribution(int i, vec3 normal) { vec4 lightpos = lights[i]; diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index bd0573130..9ca4401df 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -1,5 +1,3 @@ -#include "shaders/scene/lightmodel_shared.glsl" - const float PI = 3.14159265359; float DistributionGGX(vec3 N, vec3 H, float roughness) diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index cbebb7f3b..6d684c218 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -1,5 +1,3 @@ -#include "shaders/scene/lightmodel_shared.glsl" - vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float glossiness, float specularLevel) { vec4 lightpos = lights[i]; From 56787bbc1778b45d33d305c52761e91a06faf32c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 8 Oct 2024 20:46:27 -0300 Subject: [PATCH 363/414] Add LightStrength to UDMF, move SoftShadowRadius from AActor to DynamicLight --- specs/udmf_zdoom.txt | 3 ++ src/doomdata.h | 1 + src/maploader/udmf.cpp | 6 +++- src/namedef_custom.h | 3 ++ src/playsim/a_dynlight.cpp | 32 +++++++++++++++++-- src/playsim/a_dynlight.h | 6 ++++ src/playsim/actor.h | 2 -- src/playsim/p_mobj.cpp | 16 ++++++++-- src/r_data/a_dynlightdata.cpp | 11 +++++++ src/rendering/hwrenderer/hw_dynlightdata.cpp | 9 ++++-- .../shaders/scene/lightmodel_normal.glsl | 2 +- .../static/shaders/scene/lightmodel_pbr.glsl | 4 +-- .../shaders/scene/lightmodel_shared.glsl | 9 ++---- .../shaders/scene/lightmodel_specular.glsl | 2 +- .../static/zscript/actors/shared/dynlights.zs | 2 ++ 15 files changed, 88 insertions(+), 20 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 0b0b50c99..acf3a36da 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -429,6 +429,9 @@ Note: All fields default to false unless mentioned otherwise. lm_suncolor = ; // ZDRay lightmap sun color. Default is white (0xFFFFFF). light_softshadowradius = ; // ZDRay lightmap light and raytraced dynamic light soft shadow amount. Higher values produce softer shadows. Default = 5.0 + + light_strength = ; // Light strenght for Inverse-square falloff lights. Default = 0.0 (auto) + friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 diff --git a/src/doomdata.h b/src/doomdata.h index 303e0eca7..8ef88effa 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -384,6 +384,7 @@ struct FMapThing int friendlyseeblocks; FName arg0str; double SoftShadowRadius; + double LightStrength; }; diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 7ff310d28..84ac00981 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -793,7 +793,11 @@ public: break; case NAME_light_softshadowradius: - th->SoftShadowRadius = (float)CheckFloat(key); + th->SoftShadowRadius = CheckFloat(key); + break; + + case NAME_light_strength: + th->LightStrength = CheckFloat(key); break; case NAME_lm_suncolor: diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 6f2338009..363c62add 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -320,6 +320,8 @@ xx(RedSkull) xx(DynamicLight) xx(SpotInnerAngle) xx(SpotOuterAngle) +xx(SoftShadowRadius) +xx(LightStrength) xx(lightflags) xx(lighttype) xx(InternalDynamicLight) @@ -869,6 +871,7 @@ xx(lm_suncolor) // Light keywords xx(light_softshadowradius) +xx(light_strength) xx(skew_bottom_type) xx(skew_middle_type) diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index b274d63c6..78e8b1f1e 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -99,6 +99,12 @@ static FDynamicLight *GetLight(FLevelLocals *Level) } +static inline constexpr float calcStrength(float radius) +{ + radius *= 2; // radius in shaders is actualy diameter, so multiply it here to match + return std::min(1500.0f, (radius * radius) / 10); +} + //========================================================================== // // Attaches a dynamic light descriptor to a dynamic light actor. @@ -115,7 +121,14 @@ void AttachLight(AActor *self) light->pPitch = &self->Angles.Pitch; light->pLightFlags = (LightFlags*)&self->IntVar(NAME_lightflags); light->pArgs = self->args; - light->pSoftShadowRadius = &self->SoftShadowRadius; + light->pSoftShadowRadius = &self->FloatVar(NAME_SoftShadowRadius); + light->pStrength = &self->FloatVar(NAME_LightStrength); + + if(*light->pStrength <= 0) + { + *light->pStrength = -calcStrength(light->m_currentRadius); + } + light->specialf1 = DAngle::fromDeg(double(self->SpawnAngle)).Normalized360().Degrees(); light->Sector = self->Sector; light->target = self; @@ -213,7 +226,6 @@ void FDynamicLight::ReleaseLight() FreeList.Push(this); } - //========================================================================== // // [TS] @@ -237,6 +249,11 @@ void FDynamicLight::Activate() m_currentRadius = float(m_cycler.GetVal()); } if (m_currentRadius <= 0) m_currentRadius = 1; + + if(pStrength && *pStrength <= 0) + { + *pStrength = -calcStrength(m_currentRadius); + } } @@ -254,6 +271,8 @@ void FDynamicLight::Tick() return; } + int oldradius = m_currentRadius; + if (owned) { if (!target->state || !target->ShouldRenderLocally()) @@ -345,8 +364,9 @@ void FDynamicLight::Tick() intensity = Sector? Sector->lightlevel * scale : 0; intensity = clamp(intensity, 0.f, 255.f); - + m_currentRadius = intensity; + break; } @@ -355,6 +375,12 @@ void FDynamicLight::Tick() break; } if (m_currentRadius <= 0) m_currentRadius = 1; + + + if(pStrength && *pStrength <= 0 && oldradius != m_currentRadius) + { + *pStrength = -calcStrength(m_currentRadius); + } UpdateLocation(); } diff --git a/src/playsim/a_dynlight.h b/src/playsim/a_dynlight.h index ad9a04ec4..4180e8ebb 100644 --- a/src/playsim/a_dynlight.h +++ b/src/playsim/a_dynlight.h @@ -131,6 +131,7 @@ protected: DAngle m_spotOuterAngle = DAngle::fromDeg(25.0); DAngle m_pitch = nullAngle; double SoftShadowRadius = 5.0; + double Strength = 0.0; friend FSerializer &Serialize(FSerializer &arc, const char *key, FLightDefaults &value, FLightDefaults *def); }; @@ -224,6 +225,7 @@ struct FDynamicLight bool IsActive() const { return m_active; } float GetRadius() const { return (IsActive() ? m_currentRadius * 2.f : 0.f); } float GetSoftShadowRadius() const { return (float)(*pSoftShadowRadius); } + float GetStrength() const { return std::abs((float)*pStrength); } int GetRed() const { return pArgs[LIGHT_RED]; } int GetGreen() const { return pArgs[LIGHT_GREEN]; } int GetBlue() const { return pArgs[LIGHT_BLUE]; } @@ -272,6 +274,8 @@ public: const LightFlags *pLightFlags; const double* pSoftShadowRadius; // Softshadows. Physical size of the light source + double* pStrength; // Softshadows. Physical size of the light source + double specialf1; FDynamicLight *next, *prev; sector_t *Sector; @@ -292,6 +296,8 @@ public: bool swapped; bool explicitpitch; + double tmpStrength; + // Locations in the level mesh light list. Ends with index = 0 or all entries used enum { max_levelmesh_entries = 4 }; struct diff --git a/src/playsim/actor.h b/src/playsim/actor.h index dcf739977..3b4efd0a8 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -1375,8 +1375,6 @@ public: // (note: this is put into AActor instead of the PlayerPawn because non-players also use the value) double LandingSpeed; - double SoftShadowRadius = 5.0; // Light source's soft shadow radius - // ThingIDs void SetTID (int newTID); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index d75f88f35..eca50a742 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -6181,8 +6181,6 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) if (mthing->fillcolor) mobj->fillcolor = (mthing->fillcolor & 0xffffff) | (ColorMatcher.Pick((mthing->fillcolor & 0xff0000) >> 16, (mthing->fillcolor & 0xff00) >> 8, (mthing->fillcolor & 0xff)) << 24); - if (mthing->SoftShadowRadius >= 0.0) - mobj->SoftShadowRadius = mthing->SoftShadowRadius; // allow color strings for lights and reshuffle the args for spot lights if (i->IsDescendantOf(NAME_DynamicLight)) @@ -6206,6 +6204,20 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) mobj->AngleVar(NAME_SpotInnerAngle) = DAngle::fromDeg(mthing->args[1]); mobj->AngleVar(NAME_SpotOuterAngle) = DAngle::fromDeg(mthing->args[2]); } + + if (mthing->SoftShadowRadius >= 0.0) + { + mobj->FloatVar(NAME_SoftShadowRadius) = mthing->SoftShadowRadius; + } + else + { + mobj->FloatVar(NAME_SoftShadowRadius) = 5.0; + } + + if (mthing->LightStrength > 0.0) + { + mobj->FloatVar(NAME_LightStrength) = mthing->LightStrength; + } } mobj->CallBeginPlay (); diff --git a/src/r_data/a_dynlightdata.cpp b/src/r_data/a_dynlightdata.cpp index bc692faec..cd043fc49 100644 --- a/src/r_data/a_dynlightdata.cpp +++ b/src/r_data/a_dynlightdata.cpp @@ -127,6 +127,17 @@ void FLightDefaults::ApplyProperties(FDynamicLight * light) const light->specialf1 = m_Param; light->pArgs = m_Args; light->pSoftShadowRadius = &SoftShadowRadius; + + if(Strength > 0.0) + { + light->pStrength = const_cast(&Strength); // casting const to non-const, but positive strength values will not be modified + } + else + { + light->tmpStrength = 0.0; + light->pStrength = &light->tmpStrength; + } + light->pLightFlags = &m_lightFlags; if (m_lightFlags & LF_SPOT) { diff --git a/src/rendering/hwrenderer/hw_dynlightdata.cpp b/src/rendering/hwrenderer/hw_dynlightdata.cpp index 258b6c9b3..adf2c57df 100644 --- a/src/rendering/hwrenderer/hw_dynlightdata.cpp +++ b/src/rendering/hwrenderer/hw_dynlightdata.cpp @@ -31,6 +31,7 @@ #include"hw_cvars.h" #include "v_video.h" #include "hwrenderer/scene/hw_drawstructs.h" +#include "g_levellocals.h" // If we want to share the array to avoid constant allocations it needs to be thread local unless it'd be littered with expensive synchronization. thread_local FDynLightData lightdata; @@ -140,6 +141,8 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f } float softShadowRadius = light->GetSoftShadowRadius(); + float strength = light->GetStrength(); + float *data = &dld.arrays[i][dld.arrays[i].Reserve(16)]; data[0] = float(pos.X); data[1] = float(pos.Z); @@ -156,7 +159,7 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f data[12] = spotInnerAngle; data[13] = spotOuterAngle; data[14] = softShadowRadius; - data[15] = 0.0f; // unused + data[15] = strength; } void AddSunLightToList(FDynLightData& dld, float x, float y, float z, const FVector3& sundir, const FVector3& suncolor) @@ -177,6 +180,8 @@ void AddSunLightToList(FDynLightData& dld, float x, float y, float z, const FVec float spotDirZ = 0.0f; float shadowIndex = -1025.f; // Note: 1025 disables shadowmap and the attenuate flag is in the sign bit of the float + float strength = 1500.0f; + float* data = &dld.arrays[i][dld.arrays[i].Reserve(16)]; data[0] = float(x); data[1] = float(z); @@ -193,5 +198,5 @@ void AddSunLightToList(FDynLightData& dld, float x, float y, float z, const FVec data[12] = spotInnerAngle; data[13] = spotOuterAngle; data[14] = 0.0f; // unused - data[15] = 0.0f; // unused + data[15] = strength; } diff --git a/wadsrc/static/shaders/scene/lightmodel_normal.glsl b/wadsrc/static/shaders/scene/lightmodel_normal.glsl index 4677544bf..03df92b54 100644 --- a/wadsrc/static/shaders/scene/lightmodel_normal.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_normal.glsl @@ -13,7 +13,7 @@ vec3 lightContribution(int i, vec3 normal) float dotprod = dot(normal, lightdir); if (dotprod < -0.0001) return vec3(0.0); // light hits from the backside. This can happen with full sector light lists and must be rejected for all cases. Note that this can cause precision issues. - float attenuation = distanceAttenuation(lightdistance, lightpos.w); + float attenuation = distanceAttenuation(lightdistance, lightpos.w, lightspot2.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index 9ca4401df..112cfa4e5 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -79,7 +79,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w); + float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w, lightspot2.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); if (lightcolor.a < 0.0) @@ -119,7 +119,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w); + float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w, lightspot2.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); if (lightcolor.a < 0.0) diff --git a/wadsrc/static/shaders/scene/lightmodel_shared.glsl b/wadsrc/static/shaders/scene/lightmodel_shared.glsl index f2ca2947a..296466a7a 100644 --- a/wadsrc/static/shaders/scene/lightmodel_shared.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_shared.glsl @@ -1,8 +1,8 @@ + #ifdef LIGHT_ATTENUATION_INVERSE_SQUARE -float distanceAttenuation(float dist, float radius) +float distanceAttenuation(float dist, float radius, float strength) { - float strength = min(1500.0, (radius * radius) / 10); float a = dist / radius; float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); return (b * b) / (dist * dist + 1.0) * strength; @@ -10,9 +10,6 @@ float distanceAttenuation(float dist, float radius) #else //elif defined(LIGHT_ATTENUATION_LINEAR) -float distanceAttenuation(float dist, float radius) -{ - return clamp((radius - dist) / radius, 0.0, 1.0); -} +#define distanceAttenuation(dist, radius, strength) clamp((radius - dist) / radius, 0.0, 1.0) #endif diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index 6d684c218..bd1914549 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -8,7 +8,7 @@ vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float if (lightpos.w < lightdistance) return vec2(0.0); // Early out lights touching surface but not this fragment - float attenuation = distanceAttenuation(lightdistance, lightpos.w); + float attenuation = distanceAttenuation(lightdistance, lightpos.w, lightspot2.w); if (lightspot1.w == 1.0) attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); diff --git a/wadsrc/static/zscript/actors/shared/dynlights.zs b/wadsrc/static/zscript/actors/shared/dynlights.zs index 664b6d1d9..f4ca60556 100644 --- a/wadsrc/static/zscript/actors/shared/dynlights.zs +++ b/wadsrc/static/zscript/actors/shared/dynlights.zs @@ -2,6 +2,8 @@ class DynamicLight : Actor { double SpotInnerAngle; double SpotOuterAngle; + double SoftShadowRadius; + double LightStrength; // used for Inverse-square falloff lights private int lighttype; private int lightflags; From 479e0c301ebddf7c83e3bb30936f11c0c115ac81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 8 Oct 2024 20:48:42 -0300 Subject: [PATCH 364/414] add light_noshadowmap/light_dontlightactors/light_dontlightmap to UDMF --- specs/udmf_zdoom.txt | 3 +++ src/doomdata.h | 3 +++ src/maploader/udmf.cpp | 12 ++++++++++++ src/namedef_custom.h | 3 +++ src/playsim/p_mobj.cpp | 15 +++++++++++++++ 5 files changed, 36 insertions(+) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index acf3a36da..b703de5df 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -432,6 +432,9 @@ Note: All fields default to false unless mentioned otherwise. light_strength = ; // Light strenght for Inverse-square falloff lights. Default = 0.0 (auto) + light_noshadowmap = ; // Disable shadows for light + light_dontlightactors = ; // Don't light actors + light_dontlightmap = ; // Don't light map geometry friendlyseeblocks = ; // How far (in block units) a friendly monster can see other monsters. Default 10 diff --git a/src/doomdata.h b/src/doomdata.h index 8ef88effa..a9f118a73 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -385,6 +385,9 @@ struct FMapThing FName arg0str; double SoftShadowRadius; double LightStrength; + bool LightNoShadowMap; + bool LightDontLightActors; + bool LightDontLightMap; }; diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 84ac00981..15f6227ca 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -800,6 +800,18 @@ public: th->LightStrength = CheckFloat(key); break; + case NAME_light_noshadowmap: + th->LightNoShadowMap = CheckBool(key); + break; + + case NAME_light_dontlightactors: + th->LightDontLightActors = CheckBool(key); + break; + + case NAME_light_dontlightmap: + th->LightDontLightMap = CheckBool(key); + break; + case NAME_lm_suncolor: CHECK_N(Zd | Zdt) if (CheckInt(key) < 0 || CheckInt(key) > 0xFFFFFF) diff --git a/src/namedef_custom.h b/src/namedef_custom.h index 363c62add..a9af0a077 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -872,6 +872,9 @@ xx(lm_suncolor) // Light keywords xx(light_softshadowradius) xx(light_strength) +xx(light_noshadowmap) +xx(light_dontlightactors) +xx(light_dontlightmap) xx(skew_bottom_type) xx(skew_middle_type) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index eca50a742..a6bee6c84 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -6218,6 +6218,21 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) { mobj->FloatVar(NAME_LightStrength) = mthing->LightStrength; } + + if (mthing->LightNoShadowMap) + { + mobj->IntVar(NAME_lightflags) |= LF_NOSHADOWMAP; + } + + if (mthing->LightDontLightActors) + { + mobj->IntVar(NAME_lightflags) |= LF_DONTLIGHTACTORS; + } + + if (mthing->LightDontLightMap) + { + mobj->IntVar(NAME_lightflags) |= LF_DONTLIGHTMAP; + } } mobj->CallBeginPlay (); From 4615a8e103be7617572f70df45ba7cca3f82dd31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 8 Oct 2024 20:54:00 -0300 Subject: [PATCH 365/414] update GetDynSpriteLight to use new strength field --- src/rendering/hwrenderer/scene/hw_spritelight.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index ff786e21d..f19ea0b12 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -113,9 +113,8 @@ public: //========================================================================== -float inverseSquareAttenuation(float dist, float radius) +float inverseSquareAttenuation(float dist, float radius, float strength) { - float strength = std::min(1500.0f, (radius * radius) / 10); float a = dist / radius; float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); return (b * b) / (dist * dist + 1.0) * strength; @@ -178,7 +177,7 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig { if(level.info->lightattenuationmode == ELightAttenuationMode::INVERSE_SQUARE) { - frac = (inverseSquareAttenuation(std::max(dist, sqrt(radius) * 2), radius)); + frac = (inverseSquareAttenuation(std::max(dist, sqrt(radius) * 2), radius, light->GetStrength())); } else { From c1442f1c216fe23756feae27894a43c1d257ebea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 8 Oct 2024 21:05:28 -0300 Subject: [PATCH 366/414] clean up HWViewpointUniforms --- src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h index 64d580b4a..04e4a31ae 100644 --- a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h @@ -39,12 +39,8 @@ struct HWViewpointUniforms float mClipHeightDirection = 0.f; int mShadowFilter = 1; - int mLightBlendMode = 0; - int mLightTilesWidth = 0; - int mLightAttenuationMode = 0; - void CalcDependencies() { mNormalViewMatrix.computeNormalMatrix(mViewMatrix); From d90de3a8a1e81dfedf79417c4a68c7f66655e97b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 9 Oct 2024 14:07:53 +0200 Subject: [PATCH 367/414] avoid floats in integer math. --- src/common/startscreen/startscreen.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/startscreen/startscreen.cpp b/src/common/startscreen/startscreen.cpp index 56a179526..ccca6d906 100644 --- a/src/common/startscreen/startscreen.cpp +++ b/src/common/startscreen/startscreen.cpp @@ -699,8 +699,8 @@ void FStartScreen::Render(bool force) twod->OnFrameDone(); } auto newtime = I_msTime(); - if ((newtime - nowtime) * 2.0 > minwaittime) // slow down drawing the start screen if we're on a slow GPU! - minwaittime = (newtime - nowtime) * 2.0; + if ((newtime - nowtime) * 2 > minwaittime) // slow down drawing the start screen if we're on a slow GPU! + minwaittime = (newtime - nowtime) * 2; } FImageSource* CreateStartScreenTexture(FBitmap& srcdata); From 15241cbe96c41862ae382c9189206520e8268465 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 9 Oct 2024 11:06:17 -0400 Subject: [PATCH 368/414] - use newer zmusic --- .github/workflows/continuous_integration.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index aa323c939..2bce96705 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -71,9 +71,9 @@ jobs: fi mkdir build if [[ "${{ runner.os }}" == 'macOS' ]]; then - export ZMUSIC_PACKAGE=zmusic-1.1.9-macos.tar.xz + export ZMUSIC_PACKAGE=zmusic-1.1.14-macos-static.tar.xz elif [[ "${{ runner.os }}" == 'Linux' ]]; then - export ZMUSIC_PACKAGE=zmusic-1.1.9-linux.tar.xz + export ZMUSIC_PACKAGE=zmusic-1.1.14-linux.tar.xz fi if [[ -n "${ZMUSIC_PACKAGE}" ]]; then cd build From 61bd3a739a0ca7509db46ddabbff1fc35bfd8908 Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:13:41 +0300 Subject: [PATCH 369/414] Added MF9_FORCESECTORDAMAGE. This flag forces non-player actors to take damage from hurt floors even if SECMF_HURTMONSTERS isn't true. --- src/playsim/actor.h | 1 + src/playsim/p_mobj.cpp | 2 +- src/scripting/thingdef_data.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index daa60f45f..eba4011a2 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -445,6 +445,7 @@ enum ActorFlag9 MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states MF9_NOSECTORDAMAGE = 0x00000020, // [inkoalawetrust] Actor ignores any sector-based damage (i.e damaging floors, NOT crushers) MF9_ISPUFF = 0x00000040, // [AA] Set on actors by P_SpawnPuff + MF9_FORCESECTORDAMAGE = 0x00000080, // [inkoalawetrust] Actor ALWAYS takes hurt floor damage if there's any. Even if the floor doesn't have SECMF_HURTMONSTERS. }; // --- mobj.renderflags --- diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 8d34e6c73..5dff4a0be 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -4436,7 +4436,7 @@ void AActor::Tick () if (ObjectFlags & OF_EuthanizeMe) return; } //[inkoalawetrust] Genericized level damage handling that makes sector, 3D floor, and TERRAIN flat damage affect monsters and other NPCs too. - if (!(flags9 & MF9_NOSECTORDAMAGE) && (player || (player == nullptr && Sector->MoreFlags & SECMF_HURTMONSTERS))) + if ((!(flags9 & MF9_NOSECTORDAMAGE) || flags9 & MF9_FORCESECTORDAMAGE) && (player || (player == nullptr && (Sector->MoreFlags & SECMF_HURTMONSTERS || flags9 & MF9_FORCESECTORDAMAGE)))) { P_ActorOnSpecial3DFloor(this); P_ActorInSpecialSector(this,Sector); diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 129c06b78..90ba65f00 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -353,6 +353,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF9, DECOUPLEDANIMATIONS, AActor, flags9), DEFINE_FLAG(MF9, NOSECTORDAMAGE, AActor, flags9), DEFINE_PROTECTED_FLAG(MF9, ISPUFF, AActor, flags9), //[AA] was spawned by SpawnPuff + DEFINE_FLAG(MF9, FORCESECTORDAMAGE, AActor, flags9), // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), From 411531026ba439ffe3180e1fc96b82442f904103 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 10 Oct 2024 12:58:07 +0300 Subject: [PATCH 370/414] - updated github actions workflow * fix macos jobs * fix warnings --- .github/workflows/continuous_integration.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 2bce96705..d451e47b7 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -26,14 +26,14 @@ jobs: build_type: Release - name: macOS - os: macos-12 - deps_cmdline: brew install libvpx webp + os: macos-14 + deps_cmdline: brew install libvpx build_type: Release - name: macOS - os: macos-12 + os: macos-14 extra_options: -G Xcode -DDYN_OPENAL=OFF - deps_cmdline: brew install libvpx webp + deps_cmdline: brew install libvpx build_type: Debug - name: Linux GCC 9 @@ -71,7 +71,7 @@ jobs: fi mkdir build if [[ "${{ runner.os }}" == 'macOS' ]]; then - export ZMUSIC_PACKAGE=zmusic-1.1.14-macos-static.tar.xz + export ZMUSIC_PACKAGE=zmusic-1.1.14-macos-arm.tar.xz elif [[ "${{ runner.os }}" == 'Linux' ]]; then export ZMUSIC_PACKAGE=zmusic-1.1.14-linux.tar.xz fi @@ -115,7 +115,7 @@ jobs: - name: Upload Package if: runner.os == 'Windows' # Remove to store packages of all targets - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: build/package name: ${{ matrix.config.name }} ${{ matrix.config.build_type }} From 6c4b25930b11fc7c365a9798b21c3c912236c953 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 10 Oct 2024 13:35:42 +0300 Subject: [PATCH 371/414] - moved appimage github actions workflow back it should be disabled in actions settings instead revert 77519332e8ed232619417ebbf6eb01e4b58236f5 --- {.github-inactive => .github}/workflows/appimage.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {.github-inactive => .github}/workflows/appimage.yml (100%) diff --git a/.github-inactive/workflows/appimage.yml b/.github/workflows/appimage.yml similarity index 100% rename from .github-inactive/workflows/appimage.yml rename to .github/workflows/appimage.yml From 24792913ca894aa6799ebaa01728eb0f91f225b5 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 9 Oct 2024 21:27:07 -0400 Subject: [PATCH 372/414] - don't spam the console log if there's math errors - mostly affects Linux/MacOS because there is no distinction from console apps or GUI apps so they put all the data in the console which can cause lag --- src/common/thirdparty/math/mtherr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/thirdparty/math/mtherr.c b/src/common/thirdparty/math/mtherr.c index 3f24da2b7..814383e23 100644 --- a/src/common/thirdparty/math/mtherr.c +++ b/src/common/thirdparty/math/mtherr.c @@ -106,7 +106,7 @@ int mtherr(char* name, int code) * which is supposed to be the name of the * function in which the error occurred: */ -printf( "\n%s ", name ); +//printf( "\n%s ", name ); /* Set global error message word */ merror = code; @@ -116,7 +116,7 @@ merror = code; */ if( (code <= 0) || (code >= 7) ) code = 0; -printf( "%s error\n", ermsg[code] ); +//printf( "%s error\n", ermsg[code] ); /* Return to calling * program From 74a49ca919e782586637740b607e7366d2d2a3a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Thu, 10 Oct 2024 16:51:09 -0300 Subject: [PATCH 373/414] change light strength to light linearity 0.0 = inverse square, 1.0 = linear --- src/doomdata.h | 2 +- src/maploader/udmf.cpp | 4 ++-- src/namedef_custom.h | 4 ++-- src/playsim/a_dynlight.cpp | 19 +++++++------------ src/playsim/a_dynlight.h | 9 +++++---- src/playsim/p_mobj.cpp | 4 ++-- src/r_data/a_dynlightdata.cpp | 13 ++++--------- src/rendering/hwrenderer/hw_dynlightdata.cpp | 15 +++++++++------ .../shaders/scene/lightmodel_normal.glsl | 10 ++++++---- .../static/shaders/scene/lightmodel_pbr.glsl | 12 ++++++------ .../shaders/scene/lightmodel_shared.glsl | 6 +++--- .../shaders/scene/lightmodel_specular.glsl | 10 ++++++---- .../static/zscript/actors/shared/dynlights.zs | 2 +- 13 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/doomdata.h b/src/doomdata.h index a9f118a73..c59c6af01 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -384,7 +384,7 @@ struct FMapThing int friendlyseeblocks; FName arg0str; double SoftShadowRadius; - double LightStrength; + double LightLinearity; bool LightNoShadowMap; bool LightDontLightActors; bool LightDontLightMap; diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 15f6227ca..d2a415340 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -796,8 +796,8 @@ public: th->SoftShadowRadius = CheckFloat(key); break; - case NAME_light_strength: - th->LightStrength = CheckFloat(key); + case NAME_light_linearity: + th->LightLinearity = CheckFloat(key); break; case NAME_light_noshadowmap: diff --git a/src/namedef_custom.h b/src/namedef_custom.h index a9af0a077..661de6665 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -321,7 +321,7 @@ xx(DynamicLight) xx(SpotInnerAngle) xx(SpotOuterAngle) xx(SoftShadowRadius) -xx(LightStrength) +xx(LightLinearity) xx(lightflags) xx(lighttype) xx(InternalDynamicLight) @@ -871,7 +871,7 @@ xx(lm_suncolor) // Light keywords xx(light_softshadowradius) -xx(light_strength) +xx(light_linearity) xx(light_noshadowmap) xx(light_dontlightactors) xx(light_dontlightmap) diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index 78e8b1f1e..4a4cb46fd 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -99,7 +99,7 @@ static FDynamicLight *GetLight(FLevelLocals *Level) } -static inline constexpr float calcStrength(float radius) +float LightCalcStrength(float radius) { radius *= 2; // radius in shaders is actualy diameter, so multiply it here to match return std::min(1500.0f, (radius * radius) / 10); @@ -122,12 +122,10 @@ void AttachLight(AActor *self) light->pLightFlags = (LightFlags*)&self->IntVar(NAME_lightflags); light->pArgs = self->args; light->pSoftShadowRadius = &self->FloatVar(NAME_SoftShadowRadius); - light->pStrength = &self->FloatVar(NAME_LightStrength); + light->pLinearity = &self->FloatVar(NAME_LightLinearity); - if(*light->pStrength <= 0) - { - *light->pStrength = -calcStrength(light->m_currentRadius); - } + light->lightStrength = LightCalcStrength(light->pArgs[LIGHT_INTENSITY]); + light->specialf1 = DAngle::fromDeg(double(self->SpawnAngle)).Normalized360().Degrees(); light->Sector = self->Sector; @@ -250,10 +248,7 @@ void FDynamicLight::Activate() } if (m_currentRadius <= 0) m_currentRadius = 1; - if(pStrength && *pStrength <= 0) - { - *pStrength = -calcStrength(m_currentRadius); - } + lightStrength = LightCalcStrength(m_currentRadius); } @@ -377,9 +372,9 @@ void FDynamicLight::Tick() if (m_currentRadius <= 0) m_currentRadius = 1; - if(pStrength && *pStrength <= 0 && oldradius != m_currentRadius) + if(oldradius != m_currentRadius) { - *pStrength = -calcStrength(m_currentRadius); + lightStrength = LightCalcStrength(m_currentRadius); } UpdateLocation(); } diff --git a/src/playsim/a_dynlight.h b/src/playsim/a_dynlight.h index 4180e8ebb..12c3c3ffe 100644 --- a/src/playsim/a_dynlight.h +++ b/src/playsim/a_dynlight.h @@ -131,7 +131,7 @@ protected: DAngle m_spotOuterAngle = DAngle::fromDeg(25.0); DAngle m_pitch = nullAngle; double SoftShadowRadius = 5.0; - double Strength = 0.0; + double Linearity = 0.0; friend FSerializer &Serialize(FSerializer &arc, const char *key, FLightDefaults &value, FLightDefaults *def); }; @@ -225,7 +225,8 @@ struct FDynamicLight bool IsActive() const { return m_active; } float GetRadius() const { return (IsActive() ? m_currentRadius * 2.f : 0.f); } float GetSoftShadowRadius() const { return (float)(*pSoftShadowRadius); } - float GetStrength() const { return std::abs((float)*pStrength); } + float GetLinearity() const { return (float)(*pLinearity); } + float GetStrength() const { return lightStrength; } int GetRed() const { return pArgs[LIGHT_RED]; } int GetGreen() const { return pArgs[LIGHT_GREEN]; } int GetBlue() const { return pArgs[LIGHT_BLUE]; } @@ -274,7 +275,7 @@ public: const LightFlags *pLightFlags; const double* pSoftShadowRadius; // Softshadows. Physical size of the light source - double* pStrength; // Softshadows. Physical size of the light source + const double* pLinearity; double specialf1; FDynamicLight *next, *prev; @@ -296,7 +297,7 @@ public: bool swapped; bool explicitpitch; - double tmpStrength; + float lightStrength; // Locations in the level mesh light list. Ends with index = 0 or all entries used enum { max_levelmesh_entries = 4 }; diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 9345e699a..6a8bae1a7 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -6214,9 +6214,9 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) mobj->FloatVar(NAME_SoftShadowRadius) = 5.0; } - if (mthing->LightStrength > 0.0) + if (mthing->LightLinearity > 0.0) { - mobj->FloatVar(NAME_LightStrength) = mthing->LightStrength; + mobj->FloatVar(NAME_LightLinearity) = mthing->LightLinearity; } if (mthing->LightNoShadowMap) diff --git a/src/r_data/a_dynlightdata.cpp b/src/r_data/a_dynlightdata.cpp index cd043fc49..e12febf58 100644 --- a/src/r_data/a_dynlightdata.cpp +++ b/src/r_data/a_dynlightdata.cpp @@ -118,6 +118,8 @@ FSerializer &Serialize(FSerializer &arc, const char *key, TDeletingArraylighttype; @@ -128,15 +130,8 @@ void FLightDefaults::ApplyProperties(FDynamicLight * light) const light->pArgs = m_Args; light->pSoftShadowRadius = &SoftShadowRadius; - if(Strength > 0.0) - { - light->pStrength = const_cast(&Strength); // casting const to non-const, but positive strength values will not be modified - } - else - { - light->tmpStrength = 0.0; - light->pStrength = &light->tmpStrength; - } + light->pLinearity = &Linearity; + light->lightStrength = LightCalcStrength(light->pArgs[LIGHT_INTENSITY]); light->pLightFlags = &m_lightFlags; if (m_lightFlags & LF_SPOT) diff --git a/src/rendering/hwrenderer/hw_dynlightdata.cpp b/src/rendering/hwrenderer/hw_dynlightdata.cpp index adf2c57df..325241402 100644 --- a/src/rendering/hwrenderer/hw_dynlightdata.cpp +++ b/src/rendering/hwrenderer/hw_dynlightdata.cpp @@ -120,7 +120,7 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f // Store attenuate flag in the sign bit of the float. if (light->IsAttenuated() || forceAttenuate) shadowIndex = -shadowIndex; - float lightType = 0.0f; + bool lightType = false; float spotInnerAngle = 0.0f; float spotOuterAngle = 0.0f; float spotDirX = 0.0f; @@ -128,7 +128,7 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f float spotDirZ = 0.0f; if (light->IsSpot()) { - lightType = 1.0f; + lightType = true; spotInnerAngle = (float)light->pSpotInnerAngle->Cos(); spotOuterAngle = (float)light->pSpotOuterAngle->Cos(); @@ -139,15 +139,19 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f spotDirY = float(-negPitch.Sin()); spotDirZ = float(-Angle.Sin() * xzLen); } + + float softShadowRadius = light->GetSoftShadowRadius(); + float linearity = light->GetLinearity(); + float strength = light->GetStrength(); float *data = &dld.arrays[i][dld.arrays[i].Reserve(16)]; data[0] = float(pos.X); data[1] = float(pos.Z); data[2] = float(pos.Y); - data[3] = radius; + data[3] = lightType ? -radius : radius; data[4] = r; data[5] = g; data[6] = b; @@ -155,7 +159,7 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f data[8] = spotDirX; data[9] = spotDirY; data[10] = spotDirZ; - data[11] = lightType; + data[11] = std::clamp(linearity, 0.0f, 1.0f); data[12] = spotInnerAngle; data[13] = spotOuterAngle; data[14] = softShadowRadius; @@ -172,7 +176,6 @@ void AddSunLightToList(FDynLightData& dld, float x, float y, float z, const FVec z += sundir.Z * dist; int i = 0; - float lightType = 0.0f; float spotInnerAngle = 0.0f; float spotOuterAngle = 0.0f; float spotDirX = 0.0f; @@ -194,7 +197,7 @@ void AddSunLightToList(FDynLightData& dld, float x, float y, float z, const FVec data[8] = spotDirX; data[9] = spotDirY; data[10] = spotDirZ; - data[11] = lightType; + data[11] = 0.0f; // unused data[12] = spotInnerAngle; data[13] = spotOuterAngle; data[14] = 0.0f; // unused diff --git a/wadsrc/static/shaders/scene/lightmodel_normal.glsl b/wadsrc/static/shaders/scene/lightmodel_normal.glsl index 03df92b54..266fef963 100644 --- a/wadsrc/static/shaders/scene/lightmodel_normal.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_normal.glsl @@ -4,19 +4,21 @@ vec3 lightContribution(int i, vec3 normal) vec4 lightcolor = lights[i+1]; vec4 lightspot1 = lights[i+2]; vec4 lightspot2 = lights[i+3]; + + float radius = abs(lightpos.w); float lightdistance = distance(lightpos.xyz, pixelpos.xyz); - if (lightpos.w < lightdistance) + if (radius < lightdistance) return vec3(0.0); // Early out lights touching surface but not this fragment vec3 lightdir = normalize(lightpos.xyz - pixelpos.xyz); float dotprod = dot(normal, lightdir); if (dotprod < -0.0001) return vec3(0.0); // light hits from the backside. This can happen with full sector light lists and must be rejected for all cases. Note that this can cause precision issues. - float attenuation = distanceAttenuation(lightdistance, lightpos.w, lightspot2.w); + float attenuation = distanceAttenuation(lightdistance, radius, lightspot2.w, lightspot1.w); - if (lightspot1.w == 1.0) - attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); + if (lightpos.w < 0.0) + attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); // Sign bit is the spotlight flag if (lightcolor.a < 0.0) // Sign bit is the attenuated light flag { diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index 112cfa4e5..ed3db3e4a 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -79,9 +79,9 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w, lightspot2.w); - if (lightspot1.w == 1.0) - attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); + float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), abs(lightpos.w), lightspot2.w, lightspot1.w); + if (lightpos.w < 0.0) + attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); // Sign bit is the spotlight flag if (lightcolor.a < 0.0) attenuation *= clamp(dot(N, L), 0.0, 1.0); // Sign bit is the attenuated light flag @@ -119,9 +119,9 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight) vec3 L = normalize(lightpos.xyz - worldpos); vec3 H = normalize(V + L); - float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), lightpos.w, lightspot2.w); - if (lightspot1.w == 1.0) - attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); + float attenuation = distanceAttenuation(distance(lightpos.xyz, pixelpos.xyz), abs(lightpos.w), lightspot2.w, lightspot1.w); + if (lightpos.w < 0.0) + attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); // Sign bit is the spotlight flag if (lightcolor.a < 0.0) attenuation *= clamp(dot(N, L), 0.0, 1.0); // Sign bit is the attenuated light flag diff --git a/wadsrc/static/shaders/scene/lightmodel_shared.glsl b/wadsrc/static/shaders/scene/lightmodel_shared.glsl index 296466a7a..4b570d2ad 100644 --- a/wadsrc/static/shaders/scene/lightmodel_shared.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_shared.glsl @@ -1,15 +1,15 @@ #ifdef LIGHT_ATTENUATION_INVERSE_SQUARE -float distanceAttenuation(float dist, float radius, float strength) +float distanceAttenuation(float dist, float radius, float strength, float linearity) { float a = dist / radius; float b = clamp(1.0 - a * a * a * a, 0.0, 1.0); - return (b * b) / (dist * dist + 1.0) * strength; + return mix((b * b) / (dist * dist + 1.0) * strength, clamp((radius - dist) / radius, 0.0, 1.0), linearity); } #else //elif defined(LIGHT_ATTENUATION_LINEAR) -#define distanceAttenuation(dist, radius, strength) clamp((radius - dist) / radius, 0.0, 1.0) +#define distanceAttenuation(dist, radius, strength, linearity) clamp((radius - dist) / radius, 0.0, 1.0) #endif diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index bd1914549..4c4b943f9 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -3,15 +3,17 @@ vec2 lightAttenuation(int i, vec3 normal, vec3 viewdir, float lightcolorA, float vec4 lightpos = lights[i]; vec4 lightspot1 = lights[i+2]; vec4 lightspot2 = lights[i+3]; + + float radius = abs(lightpos.w); float lightdistance = distance(lightpos.xyz, pixelpos.xyz); - if (lightpos.w < lightdistance) + if (radius < lightdistance) return vec2(0.0); // Early out lights touching surface but not this fragment - float attenuation = distanceAttenuation(lightdistance, lightpos.w, lightspot2.w); + float attenuation = distanceAttenuation(lightdistance, radius, lightspot2.w, lightspot1.w); - if (lightspot1.w == 1.0) - attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); + if (lightpos.w < 0.0) + attenuation *= spotLightAttenuation(lightpos, lightspot1.xyz, lightspot2.x, lightspot2.y); // Sign bit is the spotlight flag vec3 lightdir = normalize(lightpos.xyz - pixelpos.xyz); diff --git a/wadsrc/static/zscript/actors/shared/dynlights.zs b/wadsrc/static/zscript/actors/shared/dynlights.zs index f4ca60556..2cd64c09c 100644 --- a/wadsrc/static/zscript/actors/shared/dynlights.zs +++ b/wadsrc/static/zscript/actors/shared/dynlights.zs @@ -3,7 +3,7 @@ class DynamicLight : Actor double SpotInnerAngle; double SpotOuterAngle; double SoftShadowRadius; - double LightStrength; // used for Inverse-square falloff lights + double LightLinearity; // used for Inverse-square falloff lights private int lighttype; private int lightflags; From 4cb60265be439a1774c5e15d6a212d9948135182 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 12 Oct 2024 01:03:51 -0400 Subject: [PATCH 374/414] - language update --- wadsrc/static/language.0 | 2 +- wadsrc/static/language.csv | 3296 +++++++-------- .../static/filter/chex.chex3/language.csv | 165 +- .../filter/hacx.hacx1/after_iwad/language.csv | 332 +- .../static/filter/harmony/language.csv | 133 +- wadsrc_extra/static/language.csv | 3574 ++++++++--------- 6 files changed, 3789 insertions(+), 3713 deletions(-) diff --git a/wadsrc/static/language.0 b/wadsrc/static/language.0 index 59341001d..cf004c828 100644 --- a/wadsrc/static/language.0 +++ b/wadsrc/static/language.0 @@ -891,4 +891,4 @@ Game,PICKER_TAB_PLAY,,,,Hra,Spil,Spiel,,Ludo,Juego,,Peli,Jeu,Igra,Játék,Gioco, Enable this controller,JOYMNU_JOYENABLE,Option to enable or disable individual controllers/joysticks when configuring it in the Controller Options menu,,,Povolit tento ovladač,Aktivér denne controller,Diesen Controller aktivieren,,Ŝalti ĉi tiun ludregilon,Habilitar este controlador,,Aktivoi tämä ohjain,Activer ce contrôleur,Omogući ovaj kontroler,Engedélyezze ezt a vezérlőt,Attiva questo controller,このコントローラーを有効にする,이 컨트롤러 활성화,Deze controller inschakelen,Aktiver denne kontrolleren,Włącz ten kontroler,Habilitar este controle,,Activați acest controler,Включить этот контроллер,Омогућите овај контролер,Aktivera denna styrenhet,Bu denetleyiciyi etkinleştirin,Увімкніть цей контролер, Open Main Menu,CNTRLMNU_OPEN_MAIN,,,,Otevřít hlavní menu,Åbn hovedmenuen,Hauptmenü öffnen,,Malfermi ĉefan menuon,Abrir el menú principal,,Avaa päävalikko,Ouvrir le menu principal,Otvori glavni izbornik,Főmenü megnyitása,Apri il menu principale,メインメニューを開く,메인 메뉴 열기,Hoofdmenu openen,Åpne hovedmenyen,Otwórz meny główne,Abrir menu principal,,Deschideți meniul principal,Открыть главное меню,Отворите главни мени,Öppna huvudmenyn,Ana Menüyü Aç,Відкрити головне меню, ,,New content,,,,,,,,,,,,,,,,,,,,,,,,,,,, -Module replayer,MODMNU_REPLAYER,,,,Nastavení přehrávače modulů,Modulafspiller,Modul-Spieler,,Legilo de moduloj,Reproductor de módulos,,,Lecteur de module,,,Module replayer,,,Module replayer,Modulavspiller,,Reprodutor de módulos,,Redare a modulelor,,,Modulåterspelare,,Module replayer, \ No newline at end of file +Module replayer,MODMNU_REPLAYER,,,,Nastavení přehrávače modulů,Modulafspiller,Modul-Spieler,,Legilo de moduloj,Reproductor de módulos,,,Lecteur de module,,,Module replayer,,,Module replayer,Modulavspiller,,Reprodutor de módulos,,Redare a modulelor,Модуль-повторитель,,Modulåterspelare,,Module replayer, \ No newline at end of file diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index 81a41967e..eaa712791 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -1,11 +1,11 @@ -default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr,uk -,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,, -Press a key.,PRESSKEY,,,,Stiskni klávesu.,Tryk på en tast.,Drücke eine Taste,Πάτα οποιοδήποτε πλήκτρο.,Premu klavon.,Presiona una tecla.,,Paina jotain näppäintä.,Appuyez sur une touche.,Nyomjon meg egy gombot.,Premi un tasto.,何かキーを押せ,키를 누르시오.,Druk op een toets.,Trykk på en tast.,Wciśnij dowolny klawisz.,Aperte uma tecla.,Carrega numa tecla qualquer.,Apasă o tastă.,Нажмите любую клавишу.,Притисните било који тастер.,Tryck på en tangent.,Bir tuşa bas.,Натисніть будь яку клавішу. -A secret is revealed!,SECRETMESSAGE,,,,Nalezl[@ao_cs] jsi skrýš!,En hemmelighed bliver afsløret!,Ein Geheimnis wurde enthüllt!,Ένα μυστικό αποκαλύφθηκε!,Vi trovis sekretejon!,¡Lugar secreto descubierto!,,Sala löydetty!,Vous avez découvert un secret!,Egy rejtekhely feltárva!,È stato svelato un segreto! ,シークレットを解き明かした!,비밀 발견!,Een geheim is onthuld!,En hemmelighet er avslørt!,Znaleziono sekret!,Segredo revelado!,,Ai găsit un secret!,Обнаружен тайник!,Откривена тајна!,En hemlighet avslöjas!,Bir sır açığa çıkıyor!,Знайдено схованку! +default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr,uk +,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,,, +Press a key.,PRESSKEY,,,,Stiskni klávesu.,Tryk på en tast.,Drücke eine Taste,Πάτα οποιοδήποτε πλήκτρο.,Premu klavon.,Presiona una tecla.,,Paina jotain näppäintä.,Appuyez sur une touche.,Pritisni tipku.,Nyomjon meg egy gombot.,Premi un tasto.,何かキーを押せ,키를 누르시오.,Druk op een toets.,Trykk på en tast.,Wciśnij dowolny klawisz.,Aperte uma tecla.,Carrega numa tecla qualquer.,Apasă o tastă.,Нажмите любую клавишу.,Притисните било који тастер.,Tryck på en tangent.,Bir tuşa bas.,Натисніть будь яку клавішу. +A secret is revealed!,SECRETMESSAGE,,,,Nalezl[@ao_cs] jsi skrýš!,En hemmelighed bliver afsløret!,Ein Geheimnis wurde enthüllt!,Ένα μυστικό αποκαλύφθηκε!,Vi trovis sekretejon!,¡Lugar secreto descubierto!,,Sala löydetty!,Vous avez découvert un secret!,Tajna je otkrivena!,Egy rejtekhely feltárva!,È stato svelato un segreto! ,シークレットを解き明かした!,비밀 발견!,Een geheim is onthuld!,En hemmelighet er avslørt!,Znaleziono sekret!,Segredo revelado!,,Ai găsit un secret!,Обнаружен тайник!,Откривена тајна!,En hemlighet avslöjas!,Bir sır açığa çıkıyor!,Знайдено схованку! "Useless mode ON. ",D_DEVSTR,,,,Zbytečný režim ZAP.,Ubrugelig tilstand slået til.,Nutzloser Modus EIN.,Άχρηστη λειτουργία είναι ΑΝΟΙΧΤΗ,Senutila reĝimo ŜALTITA.,"Modo inútil ACTIVADO. ",,Hyödytön tila PÄÄLLÄ.,"Mode inutile ON. -",Haszontalan mód BE.,"Modalità inutile ATTIVATA. +",Beskorisni način UKLJ.,Haszontalan mód BE.,"Modalità inutile ATTIVATA. ",このモードは使わないでおけ,쓸모없는 모드 켬.,Nutteloze modus AAN.,"Ubrukelig modus PÅ. ",Tryb bezużyteczny WŁĄCZONY.,"Modo inútil ATIVADO. ",,Modul inutil ACTIVAT.,Бесполезный режим ВКЛЮЧЁН.,Програмерски режим УКЉУЧЕН.,"Oanvändbart läge på. @@ -17,7 +17,7 @@ dette fantastiske spil?","Willst du dieses großartige Spiel wirklich beenden?",Είσαι σίγουρος ότι θέλεις να κλείσεις αυτο το σπουδαίο παιχνίδι;,"Ĉu vi certas, ke vi volas mallanĉi ĉi tiun bonegan ludon?","¿Estás segur@[ao_esp] de que deseas salir de este juegazo?",,Haluatko varmasti lopettaa tämän mahtavan pelin?,"Voulez-vous vraiment -quitter cet excellent jeu?","Biztosan kilépnél ebből +quitter cet excellent jeu?",Jesi li siguran/na kako želiš izaći iz ove sjajne igre?,"Biztosan kilépnél ebből a nagyszerű játékból?","Sei sicuro di volere uscire da questo grandioso gioco?","本当にこの素晴らしい運命を 終わらせるのですね?",진짜 이 개쩌는 게임을 꺼버릴려고?,"Weet je zeker dat je wilt stoppen @@ -45,7 +45,9 @@ Presiona una tecla.",,"Et voi ladata verkkopelin aikana! Paina jotain näppäintä.","Impossible de charger une partie pendant un jeu en réseau! -Appuyez sur une touche.","Nem tudsz betölteni miközben net játékban vagy! +Appuyez sur une touche.","Ne možeš učitati dok si u mrežnoj igri! + +Pritisni tipku.","Nem tudsz betölteni miközben net játékban vagy! Nyomj meg egy gombot.","Non puoi caricare una partita durante una partita in rete! @@ -93,7 +95,9 @@ Presiona una tecla.",,"Et voi pikaladata verkkopelin aikana! Paina jotain näppäintä.","Chargement Rapide impossible pendant un jeu en réseau! -Appuyez sur une touche.","Nem tudsz gyorstölteni miközben net játékban vagy! +Appuyez sur une touche.","Ne možeš brzo učitati dok si u mrežnoj igri! + +Pritisni tipku.","Nem tudsz gyorstölteni miközben net játékban vagy! Nyomj meg egy gombot.","Non puoi fare un quickload durante una partita in rete! @@ -142,7 +146,9 @@ Presiona una tecla.",,"Et ole vielä valinnut pikatallennuslokeroa! Paina jotain näppäintä.","Vous n'avez pas choisi un emplacement de sauvegarde! -Appuyez sur une touche.","Nem választottál ki egy gyorsmentés mezőt még! +Appuyez sur une touche.","Još nisi odabrao/la slot za brzo spremanje! + +Pritisni tipku.","Nem választottál ki egy gyorsmentés mezőt még! Nyomj meg egy gombot.","Non hai ancora scelto uno slot per il quicksave! @@ -190,7 +196,9 @@ Presiona una tecla.",,"Et voi aloittaa uutta peliä verkkopelin aikana. Paina jotain näppäintä.","Vous ne pouvez pas lancer une nouvelle partie en réseau. -Appuyez sur une touche.","Nem tudsz egy új játékot kezdeni +Appuyez sur une touche.","Ne možeš započeti igru dok si u mrežnoj igri. + +Pritisni tipku.","Nem tudsz egy új játékot kezdeni egy hálozatos játékban. Nyomj meg egy gombot.","Non puoi iniziare una nuova partita @@ -252,7 +260,9 @@ Presiona Y o N.",,"Oletko varma? Tämä vaikeustaso ei ole edes vähääkään r Paina Y tai N.","Vous êtes sur? Ce niveau de difficulté est vraiment impitoyable! -Appuyez sur Y ou N.","Biztos vagy benne? Ez a nehézségi szint +Appuyez sur Y ou N.","Jesi li siguran/na? Ova razina vještine nije nimalo poštena. + +Pritisni Y ili N.","Biztos vagy benne? Ez a nehézségi szint távolról sem fair. Nyomj Y-t vagy N-t.","Sei sicuro? Questo livello di difficoltà @@ -331,11 +341,15 @@ Paina jotain näppäintä.","Votre version de DOOM est une version SHAREWARE. Pensez à commander la version complète! -Appuyez sur une touche.","Ez a Doom shareware verziója. +Appuyez sur une touche.","Ovo je shareware verzija Dooma. + +Moraš naručiti cijelu trilogiju. + +Pritisni tipku.","Ez a Doom shareware verziója. Rendeld meg az egész trilógiát! -Nyomj meg egy gombot.","Questa è la versione shareware di doom. +Nyomj meg egy gombot.","Questa è la versione shareware di DOOM. Devi ordinare la trilogia completa. @@ -402,7 +416,9 @@ Presiona una tecla.",,"Et voi päättää verkkopeliä! Paina jotain näppäintä.","Vous ne pouvez pas mettre fin à une partie en réseau! -Appuyez sur une touche.","Nem tudsz befejezni egy netjátékot! +Appuyez sur une touche.","Ne možeš završiti mrežnu igru! + +Pritisni tipku.","Nem tudsz befejezni egy netjátékot! Nyomj meg egy gombot.","Non puoi terminare una partita in rete! @@ -448,7 +464,9 @@ Presiona Y ó N.",,"Haluatko varmasti päättää pelin? Paina Y tai N.","Voulez vous mettre fin à votre partie? -Appuyez sur Y ou N.","Biztosan abbahagyod a játékot? +Appuyez sur Y ou N.","Jesi li siguran/na kako želiš završiti igru? + +Pritisni Y ili N.","Biztosan abbahagyod a játékot? Nyomj Y-t vagy N-t.","Sei sicuro di voler terminare la partita? @@ -477,10 +495,10 @@ Tryck på Y eller N.",Oyunu bitirmek istediğinizden emin misiniz? Y veya N'ye b Натисніть Y або N." Are you sure you want to quit?,RAVENQUITMSG,,,,Přeješ si odejít?,"Er du sikker på, at du vil holde op?","Bist du dir sicher, dass du gehen willst?","Είσαι σίγουρος ότι θέλεις να φύγεις? -","Ĉu vi certas, ke vi volas forlasi?",¿Estás segur@[ao_esp] de que quieres salir?,,Haluatko varmasti lopettaa?,Êtes vous sûr de vouloir quitter ?,Biztosan ki akarsz lépni?,Sei sicuro di voler abbandonare?,本当に終了するのか?,정말 종료하시겠습니까?,Weet je zeker dat je wilt stoppen?,Er du sikker på at du vil avslutte?,Czy jesteś pewien że chcesz wyjść?,Deseja mesmo sair?,Tens a certeza que queres sair?,Ești sigur că vrei să ieși din joc?,Вы действительно желаете выйти?,Желите ли сигурно да изађете?,Är du säker på att du vill avsluta?,Çıkmak istediğinizden emin misiniz?,Ви дійсно хочете вийти? -Only available in the registered version,SWSTRING,,heretic,,Dostupné pouze v registrované verzi,Kun tilgængelig i den registrerede version,Nur in der registrierten Version verfügbar,Μόνο διαθέσιμο στήν εχγραμμένη έκδοση.,Nur havebla en la komercaĵa versio,Solo disponible en la versión registrada,,Käytettävissä vain rekisteröidyssä versiossa,Disponible uniquement dans la version enregistrée,Csak a teljes verzióban érhető el,Disponibile solamente nella versione registrata,製品版でのみ可能だ。,정품 버전에서만 가능합니다,Alleen beschikbaar in de geregistreerde versie,Bare tilgjengelig i den registrerte versjonen,Dostępne tylko w zarejestrowanej wersji,Disponível somente na versão registrada,Apenas disponível na versão registrada,Disponibil doar în versiunea înregistrată.,Эпизод доступен только в полной версии,Само могуће у регистрованој верзији,Endast tillgänglig i den registrerade versionen,Sadece kayıtlı sürümde mevcuttur,Доступно только в полной версии -(Press Y to quit),DOSY,,,,(Stiskni Y pro odchod),(Tryk på Y for at afslutte),(Drücke Y zum Verlassen.),(Πάτα Y για να φύγεις),(Premu Y por forlasi),(Presiona Y para salir),,(Paina Y lopettaaksesi),(Appuyez sur Y pour revenir à votre OS.),(Nyomj Y-t a kilépéshez.),(Premi Y per uscire),(Y で終了),(Y을 누르시면 종료합니다),(Druk op Y om te stoppen),(Trykk Y for å avslutte),"(Wciśnij Y, aby wyjść)",(Aperte Y para sair),(Carrega Y para sair),(Apasă Y pentru a ieși),"(нажмите Y, чтобы выйти)",(Притисните Y да завршите),(Tryck på Y för att avsluta),(Çıkmak için Y'ye basın),(Натисніть Y для виходу) -,,Quit messages,,,,,,,,,,,,,,,,,,,,,,,,,, +","Ĉu vi certas, ke vi volas forlasi?",¿Estás segur@[ao_esp] de que quieres salir?,,Haluatko varmasti lopettaa?,Êtes vous sûr de vouloir quitter ?,Jesi li siguran/na kako želiš izaći?,Biztosan ki akarsz lépni?,Sei sicuro di voler abbandonare?,本当に終了するのか?,정말 종료하시겠습니까?,Weet je zeker dat je wilt stoppen?,Er du sikker på at du vil avslutte?,Czy jesteś pewien że chcesz wyjść?,Deseja mesmo sair?,Tens a certeza que queres sair?,Ești sigur că vrei să ieși din joc?,Вы действительно желаете выйти?,Желите ли сигурно да изађете?,Är du säker på att du vill avsluta?,Çıkmak istediğinizden emin misiniz?,Ви дійсно хочете вийти? +Only available in the registered version,SWSTRING,,heretic,,Dostupné pouze v registrované verzi,Kun tilgængelig i den registrerede version,Nur in der registrierten Version verfügbar,Μόνο διαθέσιμο στήν εχγραμμένη έκδοση.,Nur havebla en la komercaĵa versio,Solo disponible en la versión registrada,,Käytettävissä vain rekisteröidyssä versiossa,Disponible uniquement dans la version enregistrée,Dostupno samo u registriranoj verziji,Csak a teljes verzióban érhető el,Disponibile solamente nella versione registrata,製品版でのみ可能だ。,정품 버전에서만 가능합니다,Alleen beschikbaar in de geregistreerde versie,Bare tilgjengelig i den registrerte versjonen,Dostępne tylko w zarejestrowanej wersji,Disponível somente na versão registrada,Apenas disponível na versão registrada,Disponibil doar în versiunea înregistrată.,Эпизод доступен только в полной версии,Само могуће у регистрованој верзији,Endast tillgänglig i den registrerade versionen,Sadece kayıtlı sürümde mevcuttur,Доступно только в полной версии +(Press Y to quit),DOSY,,,,(Stiskni Y pro odchod),(Tryk på Y for at afslutte),(Drücke Y zum Verlassen.),(Πάτα Y για να φύγεις),(Premu Y por forlasi),(Presiona Y para salir),,(Paina Y lopettaaksesi),(Appuyez sur Y pour revenir à votre OS.),(Pritisni Y za izlaz),(Nyomj Y-t a kilépéshez.),(Premi Y per uscire),(Y で終了),(Y을 누르시면 종료합니다),(Druk op Y om te stoppen),(Trykk Y for å avslutte),"(Wciśnij Y, aby wyjść)",(Aperte Y para sair),(Carrega Y para sair),(Apasă Y pentru a ieși),"(нажмите Y, чтобы выйти)",(Притисните Y да завршите),(Tryck på Y för att avsluta),(Çıkmak için Y'ye basın),(Натисніть Y для виходу) +,,Quit messages,,,,,,,,,,,,,,,,,,,,,,,,,,, "Please don't leave, there's more demons to toast!",QUITMSG1,,,,"Nenechávej mě tu, je tu víc démonů k vymletí!","Du må ikke gå, der er flere @@ -488,7 +506,7 @@ dæmoner at stege!!","Bitte gehe nicht, es gibt noch mehr Dämonen zu erlegen.","Παρακαλώ μη φύγεις, υπάρχουνε περισσότεροi δαίμονες να ψήσεις!","Bonvolu ne foriri, estas pliaj rostindaj demonoj!","¡No te vayas, que aún quedan demonios para freír!",,Älä lähde; demoneita on vielä kärvennettävänä!,"Ne partez pas, il ya encore -des démons a buter!","Kérlek ne lépj le, sok démon vár még arra, hogy felaprítsd!","Per favore non uscire, ci sono altri +des démons a buter!","Molimo te, nemoj otići, ima još demona za spržiti!","Kérlek ne lépj le, sok démon vár még arra, hogy felaprítsd!","Per favore non uscire, ci sono altri demoni da ammazzare!","離れないでくれ! まだ獲物が残っているんだ!","부디 나가지 말아줘, 아직 죽여야 할 악마들이 남아있단 말이야!","Ga alsjeblieft niet weg, er zijn meer demonen te roosteren!","Vennligst ikke gå, det er flere demoner å skåle!","Proszę, nie odchodź, jest więcej demonów do stostowania!","Por favor, não vá embora. Tem mais @@ -502,7 +520,7 @@ tu téct krev!","Lad os smutte - det her er ved at blive et blodbad!",Lass es uns beenden - das wird zu einem Blutbad,Πάεμε να φύγουμε -- έχει γίνει σφαγίο εδώ!,"Ni forlasu, ĉi tio iĝas sangoverŝado!","Aceptémoslo, ¡esto se está convirtiendo en un baño de sangre!",,Häivytään -- tämä on muuttumassa verilöylyksi!,"Fichons le camp, ça dégénère -en bain de sang!","Tűnjünk innen, ebből vérfürdő lesz!","Ammettiamolo - tutto ciò si sta +en bain de sang!",Bježimo! Ovo se pretvara u krvoproliće!,"Tűnjünk innen, ebből vérfürdő lesz!","Ammettiamolo - tutto ciò si sta trasformando in un bagno di sangue!","まだ物足りないだろう? 早く戻って皆殺しにしろ!",그냥 나가자고- 유혈사태가 곧 시작될 것 같으니!,Laten we ervoor gaan - dit wordt een bloedbad!,La oss stikke - dette er i ferd med å bli et blodbad!,Zmywajmy się stąd -- robi się tu rzeźnia!,"Vamos embora — isso tá virando um banho de sangue!","Falando a sério -- Isto está se a tornar @@ -518,7 +536,8 @@ DOS ist viel übler.","Δέν θα έφευγα αμμα είμουνα εσύ. Το DOS είναι πολύ χυρότερο.","Mi ne forirus, se mi estus vi: MS-DOS estas multe pli malbona.","No me iría si fuera tú: MS-DOS es mucho peor.",,Sinuna en lähtisi. DOS on paljon pahempi.,"Je ne quitterais pas si j'étais vous. -Votre OS est bien pire.","A helyedben nem lépnék ki. +Votre OS est bien pire.","Ne bih odlazio da sam ti. +DOS je puno gori.","A helyedben nem lépnék ki. A DOS sokkal rosszabb.","Non uscirei se fossi in te. Il DOS è molto peggio.","俺がお前だったらここは離れない。 デスクトップなぞ最悪だ。",만약 내가 너였다면 나가지 않았을 거야. DOS는 정말 최악이거든.,Ik zou niet weggaan als ik jou was. DOS is veel erger.,Jeg ville ikke dratt hvis jeg var deg. DOS er mye verre.,"Na twoim miejscu nie odchodziłbym. @@ -534,8 +553,8 @@ radši DOS než mě?","Du prøver at sige, at du bedre kan lide DOS end mig, ikke?","Willst du sagen, dass DOS besser ist als ich?","Προσπαθείς να πείς οτι το DOS είναι καλήτερο απο εμένα, σωστά?","Vi provas diri, ke MS-DOS estas pli bona ol mi, ĉu?","Estás tratando de decir que el -MS-DOS es mejor que yo, ¿cierto?",,"Yritätkö sanoa pitäväsi DOSista enemmän kuin minusta, niinkö?","Vous essayez de dire que vous aimez DOS -mieux que moi, pas vrai?","Azt akarod mondani, hogy +MS-DOS es mejor que yo, ¿eh?",,"Yritätkö sanoa pitäväsi DOSista enemmän kuin minusta, niinkö?","Vous essayez de dire que vous aimez DOS +mieux que moi, pas vrai?","Želiš reći kako voliš DOS više od mene, zar ne?","Azt akarod mondani, hogy a DOS jobb nálam?","Stai cercando di dire che il DOS ti piace più di me, vero?","貴方はこちらよりも デスクトップの方が好みらしいな?","나보다 DOS가 훨씬 좋다 이 말씀이지, 그런 거지?",Probeer je te zeggen dat DOS jou beter bevalt dan mij?,"Du prøver å si at du liker DOS bedre enn meg, ikke sant?","Próbujesz powiedzieć, że wolisz DOS @@ -551,7 +570,7 @@ dæmon rundt om det hjørne!","Bitte gehe noch nicht - hinter der Ecke da lauert ein Dämon.","Μη φύγεις ακόμα, είναι ένας δαίμονας πίσω απο αυτή τι γονία!","Ne foriru ankoraŭ, estas demono ĉirkaŭ tiu angulo!","¡No te vayas, que aún hay demonios en la costa!",,Älä lähde vielä -- tuon kulman takana on demoni!,"Ne partez pas encore! Il y a -un démon dans le coin!",Még ne menj -- a sarkon túl még vár rád egy démon!,"Non abbandonare ora - c'è un +un démon dans le coin!",Nemoj još otići! Iza ugla se nalazi demon!,Még ne menj -- a sarkon túl még vár rád egy démon!,"Non abbandonare ora - c'è un demone dietro l'angolo!","待ってくれ!まだあそこの角に デーモンが残っているんだ!",나가지 마- 저 구석에 악마가 숨어있다고!,Ga nog niet weg - er is een demoon hier om de hoek!,Ikke gå ennå. Det er en demon rundt hjørnet.,"Nie odchodź jeszcze -- demon czai się w tamtym zaułku!","Não vá embora ainda, tem um @@ -566,7 +585,7 @@ kommer herind, vil jeg stege dig.","Nur damit du es weißt, wenn du wiederkommst, dann bist du erledigt.","Ξέρεις, την επόμενη φορά που θα έρθεις εδώ, θα σε ψήσω.","Sciu, ke kiam vi sekvafoje venos ĉi tien, mi rostos vin.","Ya lo sabes, la próxima vez que vengas voy a freírte.",,"Tiiäthän, että käristän sut, kun seuraavalla kerralla tuut tänne.","Vous savez, la prochaine fois que vous revenez, -je vous grille.","Tudod, ha legközelebb idejössz, +je vous grille.","Znaš, idući put kad dođeš ovdje, ja ću te spržiti.","Tudod, ha legközelebb idejössz, szét foglak kenni.","Sai, la prossima volta che verrai qui ti farò a pezzi.","わかったよ。 今度戻ってきたら一杯奢るよ。","있지, 만약 네가 다시 돌아온다면 너를 아예 구워버릴 거다.","Weet je, de volgende keer dat je hier binnenkomt, ga ik je roosteren.","Neste gang du kommer hit, skal jeg skåle for deg.","Wiesz, jeżeli jescze raz tu przyjdziesz, @@ -577,19 +596,20 @@ aqui vou te fazer explodir em bocadinhos.","Să știi, data viitoare când treci чекати велике невоље.",Nästa gång du kommer hit ska jag skåla för dig.,"Biliyor musun, bir dahaki sefere buraya geldiğinde seni tost yapacağım.","Шоб знав, коли повернешся - я намилю тобі шию." Go ahead and leave. see if I care.,QUITMSG7,,,,"Jen do toho, odejdi; schválně, jestli mi to bude jedno.",Gå bare. Se om jeg er ligeglad.,"Dann geh doch! Interessiert -mich nicht.","Φύγε, δες αν νιάζομαι.",Ja foriru. Mi fajfas pri tio.,Ya vete. A ver si me importa.,,"Ole hyvä vain ja lähde. Arvaa, välitänkö.","Allez y, partez, allez voir si j'y suis.","Menj nyugodtan, nem mintha bárkit érdekelne.","Esci pure, sai che mi frega.",置いて行っちゃうんだ。勝手にしろ。,그럼 나가버려. 난 신경 안 써.,"Ga maar, eens kijken of het me interesseert.",Bare gå. Jeg bryr meg ikke.,"No dalej, odejdź. Zobaczymy czy +mich nicht.","Φύγε, δες αν νιάζομαι.",Ja foriru. Mi fajfas pri tio.,Ya vete. A ver si me importa.,,"Ole hyvä vain ja lähde. Arvaa, välitänkö.","Allez y, partez, allez voir si j'y suis.",Samo naprijed i otiđi. Misliš da me briga?,"Menj nyugodtan, nem mintha bárkit érdekelne.","Esci pure, sai che mi frega.",置いて行っちゃうんだ。勝手にしろ。,그럼 나가버려. 난 신경 안 써.,"Ga maar, eens kijken of het me interesseert.",Bare gå. Jeg bryr meg ikke.,"No dalej, odejdź. Zobaczymy czy mnie to obchodzi.","Vai, pode ir embora. Tô nem aí.",Vai te em embora. Vê lá se eu quero saber.,"Hai, pleacă, vezi dacă-mi pasă.","Давай, уходи. Мне совершенно всё равно.","Хајде, одлази. Уопште ме није брига.",Gå du bara och se om jag bryr mig.,Devam et ve git. Bakalım umurumda olacak mı?,"Давай, йди... ніби мені не все одно." "You want to quit? Then, thou hast lost an eighth!",QUITMSG8,More info here.,,,"Chceš odejít? Nuže, přišel jsi o přízeň boží!","Vil du gå? Har du mistet forstanden?","Du willst gehen? Hast du den Verstand verloren?","Θέλεις να φύγεις ? -Τότε, έχασες ένα έκτο!","Ĉu vi volas forlasi? -Tiuokaze, vi perdos okonon!","Salir del juego: +Τότε, έχασες ένα έκτο!","Kiu mallanĉas la ludon, +tiu estas Idisto!","Salir del juego: golpe de remo.","Si intentas salir del juego, hay tabla.","Haluat siis lopettaa? Oletko menettänyt järkesi?","Vous voulez vraiment quitter? -Vous avez vraiment les fils qui se croisent!","Ki akarsz lépni? +Vous avez vraiment les fils qui se croisent!","Želiš izaći? +Onda ti gubiš osminu!","Ki akarsz lépni? Akkor beszolgáltatik a Te vagyonod nyolcada!","Vuoi uscire? Allora hai perso il senno!","終了したい?ならば、 汝は8分の1を失うぞ!","나가시겠다? 그럼, 당신은 8번째 조각을 잃었다!",Wil je stoppen? Dan ben je wel helemaal geschift!,Vil du slutte? Da har du mistet en åttendedel!,Chcesz odejść? Wiele stracisz!,"Você quer sair? @@ -609,7 +629,7 @@ ein Dimensionszerstörer auf dich!","Μη πας τώρα, υπάρχει ένα atendas ĉe la DOS-konzolo!","¡No te vayas, que hay un vagabundo dimensional en la consola de DOS!",,Älä mene nyt; DOS-kehotteella väijyy hirviö toisesta ulottuvuudesta!,"Ne partez pas maintenant, il y a un monstre interdimensionnel qui -dans attend dans votre OS!","Ne menj most, egy dimenzióforgató +dans attend dans votre OS!","Nemoj ići sada, dimenzionalni šambler čeka na DOS komandu!","Ne menj most, egy dimenzióforgató vár a DOS parancssornál!","Non andartene adesso, c'è un portale dimensionale che ti aspetta al prompt del DOS!","まだやめたらダメだ、 @@ -632,7 +652,7 @@ til dine kedelige programmer.","Dann geh doch zurück zu deinen langweiligen Programmen",Βγές απο'δω και πήγαινε πίσω στα βαρετά προγράματα σου.,"Forigu kaj reiru al viaj enuigaj programoj.","Ya vete y vuelve a tus programitas aburridos.",,Ala laputtaa takaisin tylsien ohjelmiesi pariin.,"Tirez vous de là et retournez -à vos programmes ennuyeux.","Húzz innen, és menj vissza az +à vos programmes ennuyeux.",Gubi se odavde i vrati se svojim dosadnim programima.,"Húzz innen, és menj vissza az unalmas programjaidhoz.","Vai fuori di qui e torna ai tuoi noiosi programmi.","早く出ていって、いつものつまらない プログラムに戻るんだな。",당장 나가버리고 너의 후진 프로그램들이나 만지작거리시지.,Ga hier weg en terug naar je saaie programma's.,Kom deg ut herfra og gå tilbake til de kjedelige programmene dine.,"Wynoś się stąd i wracaj do @@ -649,7 +669,7 @@ slå dig ihjel på et minut!","Wenn ich dein Boss wäre, würde ich dich im Deathmatch in einer Minute schlagen.","Άμα ήμουν το αφεντικό σου, θα σε προκαλούσα σε ενα deathmatch αυτη τη στιγμή!","Se mi estus via ĉefo, mi mortomaĉus vin post minuto!","Si yo fuera tu jefe, te golpearía a muerte dentro de un minuto.",,"Jos oisin pomosi, lyttäisin sut kuolonottelussa minuutissa!","Si j'étais votre patron, je vous -collerai un Deathmatch dans la minute!","Ha én lennék a főnököd, lejátszanék egy Deathmatch-et veled perceken belül!","Se fossi il tuo capo, ti batterei +collerai un Deathmatch dans la minute!","Da sam ti ja šef, sabio bih te u Deathmatchu!","Ha én lennék a főnököd, lejátszanék egy Deathmatch-et veled perceken belül!","Se fossi il tuo capo, ti batterei a un deathmatch in un minuto!","もし私が君の上司なら、すぐにでも デスマッチを始める所だぞ!","만약 내가 너의 상사였다면, 지금 당장 데스매치를 열었을 거다!","Als ik je baas was, zou ik je in een minuut doodmaken!","Hvis jeg var sjefen din, ville jeg dødsmatche deg med en gang!","Gdybym był twoim szefem, wyzwałbym cię na deathmatch!","Se eu fosse seu chefe, te chamaria @@ -665,7 +685,7 @@ begår du desertering!","Also, Kumpel, wenn du jetzt abhaust, begehst du Fahnenflucht!","Κοίτα φίλε, άμα φύγεις τώρα ματαιώσες το σκόρ σου!","Rigardu, ulo. Se vi nun foriros, vi rezignos vian mortig-nombron!","A ver, amig@[ao_esp]. ¡Te vas ahora y pierdes tu número de bajas!",,"Kuules, kaveri: Jos menet nyt, niin siinä samassa menee myös ruumislukusi.","Regardez, l'ami. Vous partez maintenant -et vous pouvez oublier votre score!","Nézd, haver. Ha most kilépsz, +et vous pouvez oublier votre score!","Gle, lega. Ako sada odeš, predaješ i svoj broj smrti!","Nézd, haver. Ha most kilépsz, feladod a pontjaidat!","Senti amico, esci adesso e perdi la tua conta delle vittime!","おいおい待てよ、今やめたら 殺したデーモンの数を数えられないぞ!","이봐, 친구. 지금 여기서 나가버리면 죽여서 얻은 점수가 다 초기화될걸?","Luister vriend, als je nu weggaat, is je dodental verbeurd!","Hør her, kompis. Hvis du går nå, mister du dødstallet ditt!","Popatrz, stary. Odejdziesz teraz @@ -682,7 +702,7 @@ venter jeg med et bat.","Geh doch. Wenn du zurückkommst, warte ich mit einem Schläger auf dich.","Απλός φύγε. Ο΄ταν επιστρέψεις, θα περιμένω με ένα ρόπαλο.","Nur foriru. Kiam vi revenos, mi estos atendanta kun batilo.","Solo lárgate. Cuando vuelvas, te esperaré con un bate.",,Senkus menet. Odottelen paluutasi mailalla.,"Allez, partez. Quand vous reviendrez, -je vous attendrai avec une batte.","Menj csak. amikor visszajössz +je vous attendrai avec une batte.","Samo otiđi. Kad se vratiš, čekat ću te s palicom.","Menj csak. amikor visszajössz várni foglak egy ütővel.","Esci pure. quanto tornerai ti aspetterò con un bastone.","帰ればいいさ、 君が戻ってきたときには、 @@ -700,7 +720,7 @@ dir keine reinhaue, weil du gehst.",Είσαι τυχερός που δεν σε vin pro pensado pri foriro.","Tienes suerte de que no pueda darte una paliza por pensar en salirte.",,"Kiitä onneasi, etten läimäytä sinua siitä hyvästä, että mietit lähtemistä.","Vous êtes chanceux que je ne vous en -colle pas une parce que vous pensez partir.","Mákod van, hogy nem kapsz egy fülest amiért ki akartál lépni.","Sei fortunato che non ti picchi +colle pas une parce que vous pensez partir.",Imaš sreće što te ne opalim jer razmišljaš o odlasku.,"Mákod van, hogy nem kapsz egy fülest amiért ki akartál lépni.","Sei fortunato che non ti picchi per aver pensato di andartene.","やめることについて考えたのに、 私に殴られないなんて、 君はラッキーだな",나간다는 이유로 싸대기를 날리지 않는 게 다행인 줄 알아.,Je hebt geluk dat ik je niet sla alleen al omdat je eraan denkt te vertrekken.,Flaks for deg at jeg ikke slår deg for å tenke på å dra.,"Masz szczęście, że cię nie zdzielę @@ -718,7 +738,8 @@ Was ist mit der Rebellion?",Που πάς ? Τί θα συμβεί στην επ Kio pri la ribelo?","¿¡Adónde vas!? ¿Qué hay de la rebelión?",,"Minne olet menossa?! Entä kapina?","Où allez vous? -Que va devenir la rébellion?","Hová mész?! +Que va devenir la rébellion?","Gdje ideš? +Što je s pobunom?","Hová mész?! És a forradalommal mi lesz?","Dove stai andando?! E la ribellione?","どこに行く気だ?! 反抗するつもりか?",어딜 가는 거야?! 저항군은 어쩌고?,Waar ga je heen?! En de rebellie dan?,Hvor skal du?! Hva med opprøret?,"Gdzie idziesz?! @@ -738,7 +759,7 @@ Kia inciteto!","Masacre interruptus... ¡Menudo timo!","Masacre interruptus... ¡Qué estafa!","Verilöyly interruptus... Mikä kiusoitus!","Carnage interruptus... -Tout un programme!","Carnage interruptus... +Tout un programme!",,"Carnage interruptus... Micsoda fenyegetés!","Macellus interruptus... Che presa in giro!","大虐殺は寸止めされた... 何という意地悪なやつだ!",학살중절이라... 놀리는구먼!,De slachting geïnterrumpeerd... Wat flauw!,Carnage interruptus... For en erting!,"Rzeź przeszkadza... @@ -755,7 +776,7 @@ Ce mai tachinare!","Вот так всегда... Mia ununura ŝanco!!","Pero tú eres la esperanza... ¡¡Mi única oportunidad!!",,"Mutta sinä olet toivo -- ainoa mahdollisuuteni!!","Mais vous êtes l'espoir, -notre unique chance!","Te vagy a remény +notre unique chance!",,"Te vagy a remény -- az egyetlen esélyem!","Ma tu sei la speranza -- la mia unica possibilità!!","それでもお前を信じている -- 唯一の希望なんだ!!",하지만 넌 희망이야- 나의 유일한 기회라고!!,Maar jij bent de hoop - Mijn enige kans!!,Men du er håpet... min eneste sjanse!!!,"Ale ty jesteś nadzieją @@ -766,11 +787,11 @@ notre unique chance!","Te vagy a remény ты мой единственный шанс!","Али на тебе је сва нада -- ти си моја једина шанса!",Men du är hoppet - min enda chans!!,"Ama sen umudumsun, tek şansımsın!","Ти ж моя єдина надія - мій останній шанс!" -Nobody walks out on Blackbird.,QUITMSG18,,,,Nikdo se neobrací zády ke Strace.,Ingen går ud fra Blackbird. ,Niemand lässt Blackbird stehen.,Κανένας δεν παρατάει τον Μπλακμπερτ.,Neniu forlasas Merlon.,Nadie abandona a Blackbird.,,Kukaan ei käännä selkäänsä Blackbirdille.,Personne n'abandonne Blackbird!,Senki nem kezdhet ki a Feketerigóval!,Nessuno gira le spalle a Blackbird.,ブラックバードに気付かれず抜け出せるのか。,그 누구도 블랙버드를 내 버릴 수 없지.,Niemand loopt weg van Blackbird.,Ingen forlater Blackbird.,Nikt nie opuszcza Blackbird.,Ninguém vira as costas para a Blackbird.,,Nimeni nu iese afară pe Blackbird.,Ещё никто не ушёл от «Чёрного дрозда».,Нико још није побегао од Црне птице.,Ingen lämnar Blackbird.,Kimse Karatavuk'ü bırakıp gidemez.,Ще ніхто не дав чосу від Чорного дрозда. -I thought you were different...,QUITMSG19,,,,"Myslela jsem, že jsi jin@[adj_cs]...","Jeg troede, du var anderledes...","Ich dachte, du wärst anders...",Νόμιζα οτι είσουν διαφορετικός...,"Mi pensis, ke vi estas malsama...",Pensé que eras diferente...,Creí que eras diferente...,"Luulin, että olit erilainen kuin muut...",Je vous croyais différent...,Azt hittem te más vagy...,Pensavo tu fossi diverso...,私は あなたは特別だと思っていた...,난 네가 다를 줄 알았는데...,Ik dacht dat je anders was....,Jeg trodde du var annerledes...,"Myślałam, że jesteś inny...",Eu achei que você era diferente...,Eu achei que eras diferente...,Am crezut că tu ești diferit...,Я думал о тебе иначе...,О теби сам мислила другачије...,Jag trodde att du var annorlunda...,Senin farklı olduğunu sanıyordum.,"Я думав, що ти інший..." +Nobody walks out on Blackbird.,QUITMSG18,,,,Nikdo se neobrací zády ke Strace.,Ingen går ud fra Blackbird. ,Niemand lässt Blackbird stehen.,Κανένας δεν παρατάει τον Μπλακμπερτ.,Neniu forlasas Merlon.,Nadie abandona a Blackbird.,,Kukaan ei käännä selkäänsä Blackbirdille.,Personne n'abandonne Blackbird!,,Senki nem kezdhet ki a Feketerigóval!,Nessuno gira le spalle a Blackbird.,ブラックバードに気付かれず抜け出せるのか。,그 누구도 블랙버드를 내 버릴 수 없지.,Niemand loopt weg van Blackbird.,Ingen forlater Blackbird.,Nikt nie opuszcza Blackbird.,Ninguém vira as costas para a Blackbird.,,Nimeni nu iese afară pe Blackbird.,Ещё никто не ушёл от «Чёрного дрозда».,Нико још није побегао од Црне птице.,Ingen lämnar Blackbird.,Kimse Karatavuk'ü bırakıp gidemez.,Ще ніхто не дав чосу від Чорного дрозда. +I thought you were different...,QUITMSG19,,,,"Myslela jsem, že jsi jin@[adj_cs]...","Jeg troede, du var anderledes...","Ich dachte, du wärst anders...",Νόμιζα οτι είσουν διαφορετικός...,"Mi pensis, ke vi estas malsama...",Pensé que eras diferente...,Creí que eras diferente...,"Luulin, että olit erilainen kuin muut...",Je vous croyais différent...,,Azt hittem te más vagy...,Pensavo tu fossi diverso...,私は あなたは特別だと思っていた...,난 네가 다를 줄 알았는데...,Ik dacht dat je anders was....,Jeg trodde du var annerledes...,"Myślałam, że jesteś inny...",Eu achei que você era diferente...,Eu achei que eras diferente...,Am crezut că tu ești diferit...,Я думал о тебе иначе...,О теби сам мислила другачије...,Jag trodde att du var annorlunda...,Senin farklı olduğunu sanıyordum.,"Я думав, що ти інший..." Fine! just kill and run!,QUITMSG20,,,,Fajn! Prostě zab a uteč!,Fint! Bare dræb og løb!,"Na toll! Töten und dann wegrennen.",Καλά! Απλώς σκότοσε και φύγε!,Bone! Nur mortigu kaj fuĝu!,¡Bien! ¡Matas y huyes!,,Hyvä! Senkun vain tapat ja lähdet!,"C'est ça! Tuez n'importe-qui -et barrez-vous comme ça!",Oké! Csak ölj és fuss!,Ma bravo! Uccidi e scappi!,いいぞ! ゲリラ戦の時間だ!,그래그래 알았다! 그럼 그냥 뛰고 죽이기나 해!,"Goed hoor, schieten en meteen wegrennen!",Greit! Bare drep og løp!,Dobra! Zabijaj i biegaj!,Ótimo! Mate e fuja!,Pronto! Mata e foge!,Fie! Doar omoară și fugi!,Отлично! Пострелял и смылся!,Добро! Само убијај и бежи!,Okej! Döda bara och spring!,İyi! Sadece öldür ve kaç!,Прекрасно! Зробив амінь чортам і втік! +et barrez-vous comme ça!",,Oké! Csak ölj és fuss!,Ma bravo! Uccidi e scappi!,いいぞ! ゲリラ戦の時間だ!,그래그래 알았다! 그럼 그냥 뛰고 죽이기나 해!,"Goed hoor, schieten en meteen wegrennen!",Greit! Bare drep og løp!,Dobra! Zabijaj i biegaj!,Ótimo! Mate e fuja!,Pronto! Mata e foge!,Fie! Doar omoară și fugi!,Отлично! Пострелял и смылся!,Добро! Само убијај и бежи!,Okej! Döda bara och spring!,İyi! Sadece öldür ve kaç!,Прекрасно! Зробив амінь чортам і втік! "You can quit... but you can't hide...",QUITMSG21,,,,"Můžeš odejít... ale nemůžeš se skrýt...","Du kan stoppe... @@ -780,7 +801,7 @@ aber dich nicht verstecken...","Μπορείς να φύγεις... sed ne kaŝi vin...","Puedes salir... Pero no esconderte...",,"Voit lopettaa... muttet piiloutua...","Vous pouvez partir... -Mais vous ne pouvez pas vous cacher...","Kiléphetsz... +Mais vous ne pouvez pas vous cacher...",,"Kiléphetsz... de nem bújhatsz el...","Puoi uscire... ma non puoi nasconderti...","終わる事は出来る... しかし隠れることは出来ない...",나갈 수는 있겠지만... 숨을 수는 없을 거다...,Je kunt stoppen.... Maar je kan je niet verbergen....,Du kan slutte... men du kan ikke gjemme deg...,"Możesz wyjść... @@ -800,7 +821,7 @@ Hat Mami zum Abendessen gerufen?","Οοοοο, τι είναι το πρόβλη diris, ke estas tempo manĝi?","¿Queeeeeé?, ¿qué sucede? ¿Mami te llama a comer?",,"Häää, mikä vikana? Äiti huutaa syömään?","Bah, il est où est le problème? -Maman a dit « à table! »?","Naaa, mi a baj? +Maman a dit « à table! »?",,"Naaa, mi a baj? Anyuci szólt, hogy kész a vacsora?","Eehi, che problema c'è? La mamma ha detto che è ora di cena?","はあぁ、どうしたんだい? ママに晩飯へ呼ばれたのかよ?","헤에에, 무슨 일이야? 엄마가 저녁 먹으레?","Hee, wat is er aan de hand? Zegt mama dat het etenstijd is?","Whaaa, hva er i veien? Sier mamma at det er middag?","Cooo, o co chodzi? @@ -817,7 +838,7 @@ flemoids on the loose!",QUITMSG23,,,,"Teď neodcházej, stále tu pobíhají slizouni!","Du må ikke give op nu, der er stadig flemoider på fri fod!","Bitte gehe nicht, es laufen noch mehr Flemoiden herum","Μή παραιτηθέις, υπάρχουνε ακόμα φλέμοιντς τα οπία έχουν αποδράσει!","Ne nun foriru, ankoraŭ estas mukuloj amoke!","No te vayas ahora, -¡que aún hay flemoides sueltos!",,Älä lopeta nyt; limatuksia on vielä vapaalla!,"N'abandonnez pas maintenant, les flémoides sont toujours à l'assaut!","Ne lépj ki, még sok slejmoid van szabadon!","Non uscire ora, ci sono ancora +¡que aún hay flemoides sueltos!",,Älä lopeta nyt; limatuksia on vielä vapaalla!,"N'abandonnez pas maintenant, les flémoides sont toujours à l'assaut!",,"Ne lépj ki, még sok slejmoid van szabadon!","Non uscire ora, ci sono ancora flemoidi a piede libero!","まだやめないでくれ、 にげだしたフレモイドたちが のこっているんだから!","부디 종료하지 말아 주세요, 플레모이드들이 아직도 널려있단 말입니다!","Niet stoppen nu, er lopen nog steeds vlezerijen op vrije voeten!","Ikke gi opp nå, det er fortsatt flemoider på frifot!","Nie wychodź teraz, są tu wciąż flemoidy na wolności!","Não saia agora! @@ -833,7 +854,7 @@ gewinnen sonst.",Μή παραιτηθέις -- τα φλέμοιντς θα ν atingus avantaĝon!","No te rindas... ¡o los flemoides tendrán ventaja!","No te rindas... ¡o los flemoides van a tener ventaja!",Älä luovuta -- limatukset pääsevät voitolle!,"Ne partez pas, ou les -Flémoïdes vont nous battre!",Ne add fel -- máskülönben slejmoidok győznek!,"Non arrenderti -- i flemoidi +Flémoïdes vont nous battre!",,Ne add fel -- máskülönben slejmoidok győznek!,"Non arrenderti -- i flemoidi ci sopraffaranno!","あきらめてはダメだ、 フレモイドたちの しょうりに なってしまうぞ!",부디 포기하지 마시길- 플레모이드들이 그 순간 우세할 것입니다!,Geef niet op - de vlezerijen krijgen de overhand!,Ikke gi opp - flemoidene vil få overtaket!,Nie poddawaj się -- flemoidy będą miały przewagę!,"Não desista — os flemoides @@ -849,7 +870,7 @@ Wir brauchen deine Hilfe.","Μή φύγεις τώρα. Ni bezonas vian helpon!","No te vayas ahora. ¡Necesitamos tu ayuda!",,"Älä lähde nyt. Tarvitsemme apuasi!","S'il vous plaît, ne quittez pas, nous -avons besoin de votre aide!","Még ne menj! +avons besoin de votre aide!",,"Még ne menj! Szükségünk van a segítségedre!","Non andartene ora. Ci serve il tuo aiuto!","まだかえらないでくれ。 われわれには きみのたすけが @@ -865,9 +886,9 @@ Avem nevoie de ajutorul tău!","Не уходи сейчас. break for Chex(R) party mix.",QUITMSG26,,,,"Doufám, že si jen dáváš pauzu na Chex(R) Party Mix.","Jeg håber, at du bare holder en pause for Chex(R) party mix.","Ich hoffe mal, dass du nur eine Pause für Chex(R) Party Mix machst.",Ελπίζω οτι απλώς κάνεις ενα διάλειμμα για ένα Chex (R) μέιγμα.,"Mi esperas, ke vi nur paŭzas -por manĝi Chex(R)-festmikson.","Espero que solo estés tomando un descanso -para la fiesta de mezcladitos Chex(R).",,Toivottavasti pidät taukoa vain Chex(R) Party Mixiä varten.,"J'espère que tu prends une pause -pour un bol de Chex(R) Party Mix.","Remélem, hogy csak +por manĝi Chex(R)-festmikson.","Espero que solo estés tomando +una pausa para un Chex(R) Party Mix.",,Toivottavasti pidät taukoa vain Chex(R) Party Mixiä varten.,"J'espère que tu prends une pause +pour un bol de Chex(R) Party Mix.",,"Remélem, hogy csak egy szünetet tartasz a Chex(R) parti mixhez.","Spero tu stia solo facendo una pausa per prendere un Chex(R) party mix.","チェックス(R)パーティミックスを たべるためにおやすみかな?",첵스(R) 한 박스를 뜯기 위해서 잠시 중단하는 거였으면 좋겠군요.,Ik hoop dat je gewoon een pauze neemt voor Chex(R) party mix.,Jeg håper du bare tar en pause for Chex(R) party mix.,"Mam nadzieję, że robisz sobie przerwę na @@ -885,7 +906,7 @@ Wir brauchen deine Hilfe.","Μή κάνεις έξοδο τώρα. Ni bezonas vian helpon!","¡No salgas ahora! ¡Necesitamos tu ayuda!",,"Älä lopeta nyt! Tarvitsemme apuasi!","Restez avec nous! -Nous avons besoin de vous!","Ne menj el most! +Nous avons besoin de vous!",,"Ne menj el most! Kell a segítséged!","Non uscire ora! Ci serve il tuo aiuto!","まだやめないでくれ! われわれには きみのたすけが @@ -903,7 +924,7 @@ federaci cereálií!",Forlad ikke den Intergalaktiske Føderation af Cerealprodu Föderation der Cerealien nicht im Stich!",Μήν εγκαταλήψεις την Διαγαλαξιακή Ομοσπονδία των Δημητριακών!,"Ne forlasu la Intergalaksian Federacion de Cerealaĵoj!","¡No abandones a la Federación Intergaláctica de Cereales!",,Älä hylkää intergalaktista muroliittoa!,"N'abandonnez pas la -Fédération Intergalactique des Céréales!","Ne hagyd cserben az +Fédération Intergalactique des Céréales!",,"Ne hagyd cserben az Intergalaktikus Müzli Szövetséget!","Non abbandonare la Federazione Intergalattica dei Cereali!","ぎんがシリアルれんぽう を みすてないでくれ!",은하연합시리얼국을 위해서라도 부디 떠나지 말아 주시길 바랍니다!,Laat de Intergalactische Federatie van Granen niet in de steek!,Ikke forlat Den intergalaktiske kornføderasjonen!,Nie opuszczaj Międzygalaktycznej Federacji Płatków!,"Não abandone a @@ -916,7 +937,7 @@ by se tak rychle nevzdal!",Den rigtige Chex(R)-kriger ville ikke give op så hur würde nicht so schnell aufgeben.",Ο αληθινός Chex(R) Πολεμιστής δέν θα έφευγε τοσο γρήγορα!,"La vera Chex(R)-batalisto ne rezignus tiel rapide!","¡El verdadero Chex(R) Warrior no se rendiría tan rápido!",,Todellinen Chex(R)-soturi ei luovuttaisi niin nopeasti!,"Le vrai Chex Warrior -n'abandonnerait pas de si tôt!","Az igazi Chex(R) Harcos +n'abandonnerait pas de si tôt!",,"Az igazi Chex(R) Harcos nem adná fel ilyen gyorsan!","Il vero Guerriero Chex(R) non si arrenderebbe così in fretta!","しんのチェックス(R)せんしは そんなにすぐあきらめはしないぞ!",진정한 첵스(R)전사는 그렇게 빨리 포기하지 않을 것입니다!,De echte Chex(R) Krijger zou niet zo snel opgeven!,Den ekte Chex(R) kriger ville ikke gitt opp så fort!,"Prawdziwy Wojownik Chex(R) @@ -925,978 +946,978 @@ não desistiria tão rapido!",,"Adevăratul Luptător Chex(R) nu s-ar da bătut de ușor!","Настоящий воин Chex(R) не сдастся так быстро!","Прави Чекс ратници не би одустали тако лако!",Den riktiga Chex(R)-krigaren skulle inte ge upp så snabbt!,Gerçek Chex(R) Savaşçısı bu kadar çabuk pes etmez!,Справжній воїн Chex(R) не здається так швидко! -,,Pickups,,,,,,,,,,,,,,,,,,,,,,,,,, -You got a pickup,TXT_DEFAULTPICKUPMSG,,,,Dostal@[ao_cs] jsi věc,Du har samlet noget op,Du hast etwas aufgesammelt,Πήρες ένα πράγμα.,Vi trovis aĵon,Encuentras un objeto,,Sait jotakin,Quelque chose récupéré.,Felvettél egy tárgyat.,Hai raccolto qualcosa ,何か拾った,무언가를 집어냈다,Je hebt iets opgepakt...,Du har en henting,Zebrano przedmiot,Você pegou um item,Apanhaste um item,Ai ridicat un obiect.,Что-то получено,Покупили сте нешто,Du har en pickup,Bir pikabın var,Ви щось підібрали -,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,, -Any key will open this door,PD_ANY,,,,Tyto dveře otevře jakýkoliv klíč,Enhver nøgle kan åbne denne dør,Jeder Schlüssel wird diese Tür öffnen,Οποιδήποτε κλειδί θα ανοίξει τη πόρτα,Iu ajn ŝlosilo povas malfermi ĉi tiun pordon,Cualquier llave puede abrir esta puerta,,Mikä tahansa avain avaa tämän oven,N'importe quelle clé peut ouvrir cette porte.,Bármilyen kulcs kinyitja ezt az ajtót.,Una chiave qualunque aprirà questa porta,いずれかのキーで開けることができる。,어느 열쇠든 이 문을 열 수 있습니다,Elke sleutel zal deze deur openen,Hvilken som helst nøkkel åpner denne døren,Dowolny klucz otworzy te drzwi,Qualquer chave abre esta porta,Qualquer chave pode abrir esta porta,Orice cheie va deschide ușa aceasta.,Для открытия нужен любой ключ,За отварање потребан је било који кључ,Vilken nyckel som helst kan öppna den här dörren.,Herhangi bir anahtar bu kapıyı açar,Будь який ключ відкриє ці двері -Any key will activate this object,PD_ANYOBJ,,,,Tento objekt aktivuje jakýkoliv klíč,Enhver nøgle vil aktivere dette objekt,Jeder Schlüssel wird dieses Objekt aktivieren,Οποιδήποτε κλειδί θα ενεργοποιήσει αυτό το αντικείμενο,Iu ajn ŝlosilo povas aktivigi ĉi tiun objekton,Cualquier llave puede activar este objeto,,Mikä tahansa avain aktivoi tämän kappaleen,N'importe quelle clé peut activer cet objet.,Bármilyen kulcs aktiválja ezt a tárgyat.,Una chiave qualunque attiverà questo oggetto,いずれかのキーで起動させることができる。,어느 열쇠든 이 물체를 작동 시킬 것입니다,Elke sleutel zal dit object activeren,Hvilken som helst nøkkel vil aktivere dette objektet,Dowolny klucz aktywuje ten przedmiot,Qualquer chave ativa este objeto,Qualquer chave pode ativar este objeto,Orice cheie va activa obiectul acesta.,Для включения нужен любой ключ,За активирање потребан је било који кључ,Alla nycklar aktiverar det här objektet,Herhangi bir tuş bu nesneyi etkinleştirir,Будь який ключ активує цей об'єкт -You need all three keys to open this door,PD_ALL3,,,,K otevření těchto dveří jsou potřeba všechny tři klíče,Du skal bruge alle tre nøgler for at åbne denne dør,"Du brauchst alle drei Schlüssel, um diese Tür zu öffnen",Χρειάζεσαι όλα τα τρία κλειδία για να ανοίξεις αυτή τη πόρτα,Vi bezonas ĉiujn tri ŝlosilojn por malfermi ĉi tiun pordon,Necesitas las tres llaves para abrir esta puerta,,Kaikki kolme avainta tarvitaan tämän oven avaamiseksi,Il vous faut une clé de chaque couleur pour ouvrir cette porte.,"Mind a 3 kulcs szükséges, hogy kinyisd ezt az ajtót.",Ti servono tutte e tre le chiavi per aprire questa porta,3つのキー全てが無ければ開かない。,이 문을 열기 위해선 3 종류의 열쇠가 필요합니다,Je hebt alle drie de sleutels nodig om deze deur te openen,Du trenger alle tre nøklene for å åpne denne døren,"Potrzebujesz wszystkich trzech kluczy, aby otworzyć te drzwi",Você precisa de todas as três chaves para abrir esta porta,Precisas de todas as três chaves para abrir esta porta,"Ai nevoie de toate cele trei chei pentru a deschide +,,Pickups,,,,,,,,,,,,,,,,,,,,,,,,,,, +You got a pickup,TXT_DEFAULTPICKUPMSG,,,,Dostal@[ao_cs] jsi věc,Du har samlet noget op,Du hast etwas aufgesammelt,Πήρες ένα πράγμα.,Vi trovis aĵon,Encuentras un objeto,,Sait jotakin,Quelque chose récupéré.,Predmet je pokupljen.,Felvettél egy tárgyat.,Hai raccolto qualcosa ,何か拾った,무언가를 집어냈다,Je hebt iets opgepakt...,Du har en henting,Zebrano przedmiot,Você pegou um item,Apanhaste um item,Ai ridicat un obiect.,Что-то получено,Покупили сте нешто,Du har en pickup,Bir pikabın var,Ви щось підібрали +,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,,, +Any key will open this door,PD_ANY,,,,Tyto dveře otevře jakýkoliv klíč,Enhver nøgle kan åbne denne dør,Jeder Schlüssel wird diese Tür öffnen,Οποιδήποτε κλειδί θα ανοίξει τη πόρτα,Iu ajn ŝlosilo povas malfermi ĉi tiun pordon,Cualquier llave puede abrir esta puerta,,Mikä tahansa avain avaa tämän oven,N'importe quelle clé peut ouvrir cette porte.,Bilo koji ključ će otvoriti ova vrata.,Bármilyen kulcs kinyitja ezt az ajtót.,Una chiave qualunque aprirà questa porta,いずれかのキーで開けることができる。,어느 열쇠든 이 문을 열 수 있습니다,Elke sleutel zal deze deur openen,Hvilken som helst nøkkel åpner denne døren,Dowolny klucz otworzy te drzwi,Qualquer chave abre esta porta,Qualquer chave pode abrir esta porta,Orice cheie va deschide ușa aceasta.,Для открытия нужен любой ключ,За отварање потребан је било који кључ,Vilken nyckel som helst kan öppna den här dörren.,Herhangi bir anahtar bu kapıyı açar,Будь який ключ відкриє ці двері +Any key will activate this object,PD_ANYOBJ,,,,Tento objekt aktivuje jakýkoliv klíč,Enhver nøgle vil aktivere dette objekt,Jeder Schlüssel wird dieses Objekt aktivieren,Οποιδήποτε κλειδί θα ενεργοποιήσει αυτό το αντικείμενο,Iu ajn ŝlosilo povas aktivigi ĉi tiun objekton,Cualquier llave puede activar este objeto,,Mikä tahansa avain aktivoi tämän kappaleen,N'importe quelle clé peut activer cet objet.,Bilo koji ključ će aktivirati ovaj predmet.,Bármilyen kulcs aktiválja ezt a tárgyat.,Una chiave qualunque attiverà questo oggetto,いずれかのキーで起動させることができる。,어느 열쇠든 이 물체를 작동 시킬 것입니다,Elke sleutel zal dit object activeren,Hvilken som helst nøkkel vil aktivere dette objektet,Dowolny klucz aktywuje ten przedmiot,Qualquer chave ativa este objeto,Qualquer chave pode ativar este objeto,Orice cheie va activa obiectul acesta.,Для включения нужен любой ключ,За активирање потребан је било који кључ,Alla nycklar aktiverar det här objektet,Herhangi bir tuş bu nesneyi etkinleştirir,Будь який ключ активує цей об'єкт +You need all three keys to open this door,PD_ALL3,,,,K otevření těchto dveří jsou potřeba všechny tři klíče,Du skal bruge alle tre nøgler for at åbne denne dør,"Du brauchst alle drei Schlüssel, um diese Tür zu öffnen",Χρειάζεσαι όλα τα τρία κλειδία για να ανοίξεις αυτή τη πόρτα,Vi bezonas ĉiujn tri ŝlosilojn por malfermi ĉi tiun pordon,Necesitas las tres llaves para abrir esta puerta,,Kaikki kolme avainta tarvitaan tämän oven avaamiseksi,Il vous faut une clé de chaque couleur pour ouvrir cette porte.,Potrebna su ti sva 3 ključa da otvoriš ova vrata.,"Mind a 3 kulcs szükséges, hogy kinyisd ezt az ajtót.",Ti servono tutte e tre le chiavi per aprire questa porta,3つのキー全てが無ければ開かない。,이 문을 열기 위해선 3 종류의 열쇠가 필요합니다,Je hebt alle drie de sleutels nodig om deze deur te openen,Du trenger alle tre nøklene for å åpne denne døren,"Potrzebujesz wszystkich trzech kluczy, aby otworzyć te drzwi",Você precisa de todas as três chaves para abrir esta porta,Precisas de todas as três chaves para abrir esta porta,"Ai nevoie de toate cele trei chei pentru a deschide ușa aceasta.",Для открытия требуются все три ключа,За отварање потребна су сва три кључа ,Du behöver alla tre nycklarna för att öppna den här dörren.,Bu kapıyı açmak için üç anahtara da ihtiyacınız var,"Вам потрібні всі три ключі, щоб відкрити ці двері" -You need all three keys to activate this object,PD_ALL3O,,,,K aktivaci tohoto objektu jsou potřeba všechny tři klíče,Du skal bruge alle tre nøgler for at aktivere dette objekt,"Du brauchst alle drei Schlüssel, um dieses Objekt zu aktivieren",Χρειάζεσε όλα τα τρία κλειδιά για να ενεργοποιήσεις αυτό το αντικείμενο,Vi bezonas ĉiujn tri ŝlosilojn por aktivigi ĉi tiun objekton,Necesitas las tres llaves para activar este objeto,,Kaikki kolme avainta tarvitaan tämän kappaleen aktivoimiseksi,Il vous faut une clé de chaque couleur pour activer cet objet.,Mind a 3 kulcs kell hogy aktiváld ezt a tárgyat.,Ti servono tutte e tre le chiavi per attivare questo oggetto ,3つのキー全てが必要だ。,이 물체를 작동시키기 위해선 3 종류의 열쇠가 필요합니다,Je hebt alle drie de sleutels nodig om dit object te activeren,Du trenger alle tre nøklene for å aktivere dette objektet,"Potrzebujesz wszystkich trzech kluczy, aby aktywować ten przedmiot",Você precisa de todas as três chaves para ativar este objeto,Precisas de todas as três chaves para ativar este objeto,"Ai nevoie de toate cele trei chei pentru a activa +You need all three keys to activate this object,PD_ALL3O,,,,K aktivaci tohoto objektu jsou potřeba všechny tři klíče,Du skal bruge alle tre nøgler for at aktivere dette objekt,"Du brauchst alle drei Schlüssel, um dieses Objekt zu aktivieren",Χρειάζεσε όλα τα τρία κλειδιά για να ενεργοποιήσεις αυτό το αντικείμενο,Vi bezonas ĉiujn tri ŝlosilojn por aktivigi ĉi tiun objekton,Necesitas las tres llaves para activar este objeto,,Kaikki kolme avainta tarvitaan tämän kappaleen aktivoimiseksi,Il vous faut une clé de chaque couleur pour activer cet objet.,Potrebna su ti sva 3 ključa da aktiviraš ovaj predmet.,Mind a 3 kulcs kell hogy aktiváld ezt a tárgyat.,Ti servono tutte e tre le chiavi per attivare questo oggetto ,3つのキー全てが必要だ。,이 물체를 작동시키기 위해선 3 종류의 열쇠가 필요합니다,Je hebt alle drie de sleutels nodig om dit object te activeren,Du trenger alle tre nøklene for å aktivere dette objektet,"Potrzebujesz wszystkich trzech kluczy, aby aktywować ten przedmiot",Você precisa de todas as três chaves para ativar este objeto,Precisas de todas as três chaves para ativar este objeto,"Ai nevoie de toate cele trei chei pentru a activa acest obiect.",Для включения требуются все три ключа,За активирање потребна су сва три кључа,Du behöver alla tre nycklarna för att aktivera det här föremålet.,Bu nesneyi etkinleştirmek için üç tuşa da ihtiyacınız var,"Вам потрібні всі три ключі, щоб активувати цей об'єкт" -You need all six keys to open this door,PD_ALL6,,,,K otevření těchto dveří je potřeba všech šest klíčů,Du skal bruge alle seks nøgler for at åbne denne dør,"Du brauchst alle sechs Schlüssel, um diese Tür zu öffnen",Χρειάζεσαι όλα τα έξι κλειδία για να ανοίξεις αυτή τη πόρτα,Vi bezonas ĉiujn ses ŝlosilojn por malfermi ĉi tiun pordon,Necesitas las seis llaves para abrir esta puerta,,Kaikki kuusi avainta tarvitaan tämän oven avaamiseksi,Il vous faut les six clés pour ouvrir cette porte.,Mind a 6 kulcsnak meg kell lennie az ajtó kinyitásához.,Ti servono tutte e sei le chiavi per aprire questa porta,6つ全てのキーが無ければ開かない。,이 문을 열기 위해선 6 종류의 열쇠가 필요합니다,Je hebt alle zes de sleutels nodig om deze deur te openen,Du trenger alle seks nøklene for å åpne denne døren,"Potrzebujesz wszystkich sześciu kluczy, aby otworzyć te drzwi",Você precisa de todas as seis chaves para abrir esta porta,Precisas de todas as seis chaves para abrir esta porta,"Ai nevoie de toate cele sase chei pentru a deschide +You need all six keys to open this door,PD_ALL6,,,,K otevření těchto dveří je potřeba všech šest klíčů,Du skal bruge alle seks nøgler for at åbne denne dør,"Du brauchst alle sechs Schlüssel, um diese Tür zu öffnen",Χρειάζεσαι όλα τα έξι κλειδία για να ανοίξεις αυτή τη πόρτα,Vi bezonas ĉiujn ses ŝlosilojn por malfermi ĉi tiun pordon,Necesitas las seis llaves para abrir esta puerta,,Kaikki kuusi avainta tarvitaan tämän oven avaamiseksi,Il vous faut les six clés pour ouvrir cette porte.,Potrebno ti je svih 6 ključeva da otvoriš ova vrata.,Mind a 6 kulcsnak meg kell lennie az ajtó kinyitásához.,Ti servono tutte e sei le chiavi per aprire questa porta,6つ全てのキーが無ければ開かない。,이 문을 열기 위해선 6 종류의 열쇠가 필요합니다,Je hebt alle zes de sleutels nodig om deze deur te openen,Du trenger alle seks nøklene for å åpne denne døren,"Potrzebujesz wszystkich sześciu kluczy, aby otworzyć te drzwi",Você precisa de todas as seis chaves para abrir esta porta,Precisas de todas as seis chaves para abrir esta porta,"Ai nevoie de toate cele sase chei pentru a deschide aceasta usa.",Для открытия требуются все шесть ключей,За отварање потребна су свих шест кључева,Du behöver alla sex nycklar för att öppna den här dörren.,Bu kapıyı açmak için altı anahtara da ihtiyacınız var,"Вам потрібні всі шість ключів, щоб відкрити ці двері" -You need all six keys to activate this object,PD_ALL6O,,,,K aktivaci tohoto objektu je potřeba všech šest klíčů,Du skal bruge alle seks nøgler for at aktivere dette objekt,"Du brauchst alle sechs Schlüssel, um dieses Objekt zu aktivieren",Χρειάζεσε όλα τα έξι κλειδιά για να ενεργοποιήσεις αυτό το αντικείμενο,Vi bezonas ĉiujn ses ŝlosilojn por aktivigi ĉi tiun objekton,Necesitas las seis llaves para activar este objeto,,Kaikki kuusi avainta tarvitaan tämän kappaleen aktivoimiseksi,Il vous faut les six clés pour activer cet objet.,"Mind a 6 kulcs kell, hogy aktiváld ezt az objektumot.",Ti servono tutte e tre le chiavi per attivare questo oggetto ,6つ全てのキーが必要だ。,이 물체를 작동시키기 위해선 6 종류의 열쇠가 필요합니다,Je hebt alle zes de sleutels nodig om dit object te activeren,Du trenger alle seks nøklene for å aktivere dette objektet,"Potrzebujesz wszystkich sześciu kluczy, aby aktywować ten przedmiot",Você precisa de todas as seis chaves para ativar este objeto,Precisas de todas as seis chaves para ativar este objeto,"Ai nevoie de toate cele șase chei pentru a activa +You need all six keys to activate this object,PD_ALL6O,,,,K aktivaci tohoto objektu je potřeba všech šest klíčů,Du skal bruge alle seks nøgler for at aktivere dette objekt,"Du brauchst alle sechs Schlüssel, um dieses Objekt zu aktivieren",Χρειάζεσε όλα τα έξι κλειδιά για να ενεργοποιήσεις αυτό το αντικείμενο,Vi bezonas ĉiujn ses ŝlosilojn por aktivigi ĉi tiun objekton,Necesitas las seis llaves para activar este objeto,,Kaikki kuusi avainta tarvitaan tämän kappaleen aktivoimiseksi,Il vous faut les six clés pour activer cet objet.,Potrebno ti je svih 6 ključeva da aktiviraš ovaj predmet.,"Mind a 6 kulcs kell, hogy aktiváld ezt az objektumot.",Ti servono tutte e tre le chiavi per attivare questo oggetto ,6つ全てのキーが必要だ。,이 물체를 작동시키기 위해선 6 종류의 열쇠가 필요합니다,Je hebt alle zes de sleutels nodig om dit object te activeren,Du trenger alle seks nøklene for å aktivere dette objektet,"Potrzebujesz wszystkich sześciu kluczy, aby aktywować ten przedmiot",Você precisa de todas as seis chaves para ativar este objeto,Precisas de todas as seis chaves para ativar este objeto,"Ai nevoie de toate cele șase chei pentru a activa acest obiect.",Для включения требуются все шесть ключей,За активирање потребна су свих шест кључева,Du behöver alla sex nycklar för att aktivera detta objekt.,Bu nesneyi etkinleştirmek için altı tuşa da ihtiyacınız var,"Вам потрібні всі шість ключів, щоб активувати цей об'єкт" -You need all the keys,PD_ALLKEYS,,,,Potřebuješ všechny klíče,Du skal bruge alle nøglerne,Du brauchst alle Schlüssel,Χρειάζεσαι όλα τα κλειδία,Vi bezonas ĉiujn ŝlosilojn,Necesitas todas las llaves,,Kaikki avaimet tarvitaan,Vous avez besoin de toutes les six clés.,Az összes kulcsra szükséged van.,Ti servono tutte le chiavi,全てのキーが必要だ。,모든 열쇠가 필요합니다,Je hebt alle sleutels nodig,Du trenger alle nøklene,Potrzebujesz wszystkich kluczy,Você precisa de todas as chaves,Precisas de todas as chaves,Ai nevoie de toate cheile.,Требуются все ключи,Потребни су сви кључеви,Du behöver alla nycklar,Tüm anahtarlara ihtiyacın var,Потрібні всі ключі -,,Chat,,,,,,,,,,,,,,,,,,,,,,,,,, -[Message unsent],HUSTR_MSGU,,,,[Zpráva neposlána],[Besked ikke sendt],[Nachricht nicht gesendet],[Δέν στάλθηκε],[Mesaĝo ne sendita],[Mensaje sin enviar],,[Viestiä ei lähetetty],[Message Non Envoyé],[Üzenet nincs elküldve],[Messaggio non inviato],[メッセージ未送信],[메시지가 전달되지 않음],[Bericht niet verzonden],[Melding ikke sendt],[Wiadomość niewysłana],[Mensagem não enviada],,[Mesaj netrimis],[Сообщение не отправлено],[Порука непослата],[Meddelande ej skickat],[Mesaj gönderilmemiş],[Повідомлення не відправлено] -You mumble to yourself,HUSTR_TALKTOSELF1,,,,Něco si zamumláš pro sebe.,Du mumler for dig selv,Du murmelst zu dir selbst,Μουρμουράς στον εαυτό σου,Vi murmuras al vi mem,Te murmuras a ti mism@[ao_esp],,Mutiset itseksesi,Vous parlez tout seul.,Magadban motyogsz,Pensi fra te e te,ネタにならない呟きだ,자기 혼자서 중얼거렸다,Je mompelt in jezelf,Du mumler for deg selv,Mamroczesz do siebie,Você resmunga para si mesm@[ao_ptb]...,Tu resmungas contigo própri@[ao_ptb]...,Bolborosești în sine,Неразборчивое бормотание,Промумљате себи,Du mumlar för dig själv,Kendi kendine mırıldanıyorsun,Ви бормочете собі під ніс -Who's there?,HUSTR_TALKTOSELF2,,,,Kdo je tam?,Hvem er der?,Wer ist da?,Πιός είναι εκεί?,Kiu estas tie?,¿Quién está ahí?,,Kuka siellä?,Qui est là?,Ki van ott?,Chi c'è lì?,誰かいるか?,거기 누구 있나?,Wie is daar?,Hvem er der?,Kto tam?,Quem está aí?,,Cine-i acolo?,Кто там?,Ко је то?,Vem är där?,Kim var orada?,Хто тут? -You scare yourself,HUSTR_TALKTOSELF3,,,,Vystrašíš se.,Du skræmmer dig selv,Du machst dir Angst,Φοβήζεις τον εαυτό σου,Vi timigas vin mem,Te asustas a ti mism@[ao_esp],,Pelotat itseäsi,Vous vous surprenez.,Megijeszted magad,Ti spaventi da solo,"怯えているな +You need all the keys,PD_ALLKEYS,,,,Potřebuješ všechny klíče,Du skal bruge alle nøglerne,Du brauchst alle Schlüssel,Χρειάζεσαι όλα τα κλειδία,Vi bezonas ĉiujn ŝlosilojn,Necesitas todas las llaves,,Kaikki avaimet tarvitaan,Vous avez besoin de toutes les six clés.,Potrebni su ti svi ključevi.,Az összes kulcsra szükséged van.,Ti servono tutte le chiavi,全てのキーが必要だ。,모든 열쇠가 필요합니다,Je hebt alle sleutels nodig,Du trenger alle nøklene,Potrzebujesz wszystkich kluczy,Você precisa de todas as chaves,Precisas de todas as chaves,Ai nevoie de toate cheile.,Требуются все ключи,Потребни су сви кључеви,Du behöver alla nycklar,Tüm anahtarlara ihtiyacın var,Потрібні всі ключі +,,Chat,,,,,,,,,,,,,,,,,,,,,,,,,,, +[Message unsent],HUSTR_MSGU,,,,[Zpráva neposlána],[Besked ikke sendt],[Nachricht nicht gesendet],[Δέν στάλθηκε],[Mesaĝo ne sendita],[Mensaje sin enviar],,[Viestiä ei lähetetty],[Message Non Envoyé],[Poruka nije poslana],[Üzenet nincs elküldve],[Messaggio non inviato],[メッセージ未送信],[메시지가 전달되지 않음],[Bericht niet verzonden],[Melding ikke sendt],[Wiadomość niewysłana],[Mensagem não enviada],,[Mesaj netrimis],[Сообщение не отправлено],[Порука непослата],[Meddelande ej skickat],[Mesaj gönderilmemiş],[Повідомлення не відправлено] +You mumble to yourself,HUSTR_TALKTOSELF1,,,,Něco si zamumláš pro sebe.,Du mumler for dig selv,Du murmelst zu dir selbst,Μουρμουράς στον εαυτό σου,Vi murmuras al vi mem,Te murmuras a ti mism@[ao_esp],,Mutiset itseksesi,Vous parlez tout seul.,Mrmljaš si,Magadban motyogsz,Pensi fra te e te,ネタにならない呟きだ,자기 혼자서 중얼거렸다,Je mompelt in jezelf,Du mumler for deg selv,Mamroczesz do siebie,Você resmunga para si mesm@[ao_ptb]...,Tu resmungas contigo própri@[ao_ptb]...,Bolborosești în sine,Неразборчивое бормотание,Промумљате себи,Du mumlar för dig själv,Kendi kendine mırıldanıyorsun,Ви бормочете собі під ніс +Who's there?,HUSTR_TALKTOSELF2,,,,Kdo je tam?,Hvem er der?,Wer ist da?,Πιός είναι εκεί?,Kiu estas tie?,¿Quién está ahí?,,Kuka siellä?,Qui est là?,Tko je tamo?,Ki van ott?,Chi c'è lì?,誰かいるか?,거기 누구 있나?,Wie is daar?,Hvem er der?,Kto tam?,Quem está aí?,,Cine-i acolo?,Кто там?,Ко је то?,Vem är där?,Kim var orada?,Хто тут? +You scare yourself,HUSTR_TALKTOSELF3,,,,Vystrašíš se.,Du skræmmer dig selv,Du machst dir Angst,Φοβήζεις τον εαυτό σου,Vi timigas vin mem,Te asustas a ti mism@[ao_esp],,Pelotat itseäsi,Vous vous surprenez.,Plašiš se,Megijeszted magad,Ti spaventi da solo,"怯えているな ",자기 혼자서 벌벌 떨고 있다,Je wordt bang van jezelf,Du skremmer deg selv,Przestraszyłeś się,Você se assusta,Assustas-te a ti propri@[ao_ptb],Te speri pe tine însuți,Что это было?,Плашите самог себе,Du skrämmer dig själv.,Kendini korkutuyorsun.,Ви налякали себе -You start to rave,HUSTR_TALKTOSELF4,,,,Začneš pařit.,Du begynder at rave,Du beginnst zu toben,Αρχίζεις να ουρλίαζεις,Vi komencas frenezi,Empiezas a delirar,,Alat hourailla,Vous commencez à délirer!,Reszketni kezdesz,Inizi a delirare,イカレ始めた,횡설수설하기 시작했다,Je begint te razen,Du begynner å rave,Zaczynasz wariować,Você começa a delirar,Começas a delirar,Începi să aiurezi,Вы бредите.,Брбљате,Du börjar rasa.,Çıldırmaya başlıyorsun,Ви починаєте марити -You've lost it...,HUSTR_TALKTOSELF5,,,,Kleplo ti...,Du har mistet den...,Du verlierst den Verstand...,Το έχασες,Vi freneziĝis...,Te has vuelto loc@[ao_esp]...,Te volviste loc@[ao_esp]...,Olet seonnut...,Vous avez perdu les pédales...,Eldobod az agyad...,Sei andato...,我を失った...,미치기 시작했다...,Je bent het kwijt,You've lost it...,Oszalałeś...,Você enlouqueceu...,Enlouqueceste,Ai luat-o pe ulei...,Какая досада...,Лудите...,Du har förlorat det...,Kaybettin...,Як сумно... -[Message Sent],HUSTR_MESSAGESENT,,,,[Zpráva odeslána],[besked sendt],[Nachricht gesendet],[Στάλθηκε],[Mesaĝo sendita],[Mensaje enviado],,[Viesti lähetetty],[Message Envoyé],[Üzenet elküldve],[Messaggio Inviato],[メッセージ送信],[메시지가 전달됨],[Bericht verzonden],[Melding sendt],[Wiadomość wysłana],[Mensagem enviada],,[Mesaj Trimis],[Сообщение отправлено],[Порука послата],[Meddelande skickat],[Mesaj Gönderildi],[Повідомлення відправлено] -,,Cheats,,,,,,,,,,,,,,,,,,,,,,,,,, -Music Change,STSTR_MUS,,,,Změna hudby,Musik Ændring,Musikwechsel,Άλλαξε μουσική,Muzikŝanĝo,Cambio de música,,Musiikin vaihtaminen,Changement de Musique,Zene Váltás,Cambio di musica,music変更,음악 전환,Muziek veranderen,Music Change,Zmieniono muzykę,Trocando música,Mudar a música,Schimbare muzică...,Смена музыки,Промена музике,Musikbyte,Müzik Değişimi,Зміна музики -Impossible Selection,STSTR_NOMUS,,,,Nemožný výběr,Umuligt valg,Falsche Auswahl,Αδήνατη επιλογή,Malebla Elektaĵo,Selección imposible,,Valinta ei mahdollinen,Séléction Impossible!,Lehetetlen Kiválasztás,Selezione impossibile,その変更は不可能だ,불가능한 선택입니다,Onmogelijke selectie,Umulig valg,Niemożliwy wybór,Seleção impossível,,Selectare Imposibilă,Неверный выбор,НЕМОГУЋИ ИЗБОР,Omöjligt val,İmkansız Seçim,НЕКОРЕКТНИЙ ВИБІР -Degreelessness Mode ON,STSTR_DQDON,,,,Nesmrtelnost ZAP,Gradeløs tilstand TIL,Unverwundbarkeit AN,Θεική λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Nevundebla Reĝimo ŜALTITA,Invulnerabilidad ACTIVADA,,Kuolemattomuustila PÄÄLLÄ,Invulnérabilité ON ,Sérthetetlenség Mód BE,Modalità Invincibilità ATTIVATA,無敵モード: オン,무미건조한 모드 켬,Gegradeloosheid modus AAN,Gradløshetsmodus PÅ,Niewrażliwość WŁĄCZONA,Modo invencível ATIVADO,,Modul invincibil ACTIVAT,Безграмотность ВКЛЮЧЕНА,Нерањивост УКЉУЧЕНА,Gradlöshetsläge på,Dokunulmazlık Modu AÇIK,Безсмертя ввімкнено -Degreelessness Mode OFF,STSTR_DQDOFF,,,,Nesmrtelnost VYP,Gradeløs tilstand FRA,Unverwundbarkeit AUS,Θεική λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Nevundebla Reĝimo MALŜALTITA,Invulnerabilidad DESACTIVADA,,Kuolemattomuustila POIS PÄÄLTÄ,Invulnérabilité OFF,Sérthetetlenség Mód KI,Modalità Invincibilità DISATTIVATA,無敵モード: オフ,무미건조한 모드 끔,Gegradeloosheid modus UIT,Gradløshetsmodus AV,Niewrażliwość WYŁĄCZONA,Modo invencível DESATIVADO,,Modul Invincibil DEZACTIVAT,Безграмотность ОТКЛЮЧЕНА,Нерањивост ИСКЉУЧЕНА,Gradlöshetsläge av,Dokunulmazlık Modu KAPALI,Безсмертя вимкнено -Ultimate Degreelessness Mode ON,STSTR_DQD2ON,,,,Supernesmrtelnost ZAP,Ultimativ gradløs tilstand TIL,Ultimative Unverwundbarkeit AN,Απόλητη θεική λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Nevundebla Reĝimo ŜALTITA,Invulnerabilidad absoluta ACTIVADA,,Varma kuolemattomuustila PÄÄLLÄ,Parfaite Invulnérabilité ON,Tökéletes Sérthetetlenség Mód BE,Modalità Invincibilità Ultima ATTIVATA,究極無敵モード: オン,엄청나게 무미건조한 모드 켬,Uiteindelijke Gegradeloosheid modus AAN,Ultimativ gradløshetsmodus PÅ,Maksymalna niewrażliwość WŁĄCZONA,Modo invencível supremo ATIVADO,,Modul Invincibilitate Supremă ACTIVAT,Полная безграмотность ВКЛЮЧЕНА,Ултимативна нерањивост УКЉУЧЕНА,Ultimat gradlöshetsläge på,Nihai Dokunulmazlık Modu AÇIK,Повне безсмертя ввімкнено -Ultimate Degreelessness Mode OFF,STSTR_DQD2OFF,,,,Supernesmrtelnost VYP,Ultimativ gradløs tilstand FRA,Ultimative Unverwundbarkeit AUS,Απόλητη θεική λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Nevundebla Reĝimo MALŜALTITA,Invulnerabilidad absoluta DESACTIVADA,,Varma kuolemattomuustila POIS PÄÄLTÄ,Parfaite Invulnérabilité OFF,Tökéletes Sérthetetlenség Mód KI,Modalità Invincibilità Ultima DISATTIVATA,究極無敵モード: オフ,엄청나게 무미건조한 모드 끔,Uiteindelijke Gegradeloosheid modus UIT,Ultimativ gradløshetsmodus AV,Maksymalna niewrażliwość WYŁĄCZONA,Modo invencível supremo DESATIVADO,,Modul Invincibilitate Supremă DEZACTIVAT,Полная безграмотность ОТКЛЮЧЕНА,Ултимативна нерањивост ИСКЉУЧЕНА,Ultimat gradlöshetsläge av,Nihai Dokunulmazlık Modu KAPALI,Повне безсмертя вимкнено -Very Happy Ammo Added,STSTR_KFAADDED,,,,Velmi veselá munice přidána,Meget lykkelig Ammo tilføjet,Munition hinzugefügt,Πάρα Πολύ Χαρούμενα Πυρομαχηκά Προστέθηκαν,Tre Feliĉa Municio Aldonita,Munición añadida hasta el tope,,Täysaseistus,Armement Maximum!,Összes Lőszer Megadva,Equipaggiamento Completato,とても満足する武器弾薬を受け取った,아주 행복한 탄약 추가됨,Zeer gelukkige munitie toegevoegd,Veldig glad ammunisjon lagt til,Bardzo szczęśliwa amunicja dodana,Equipamento completo,,Echipament complet,Боезапас на счастье пополнен,Веома Срећна Муниција Додана,Mycket lycklig ammunition har lagts till,Çok Mutlu Cephane Eklendi,Спорядження поповнено -Ammo (no keys) Added,STSTR_FAADDED,,,,Munice (bez klíčú) přidána,Ammo (ingen nøgler) Tilføjet,Munition (keine Schlüssel) hinzugefügt,Πυρομαχικά (Όχι κλειδία) προστέθηκαν,Municio (neniuj ŝlosiloj) Aldonita,Munición añadida (sin llaves),,Täysaseistus (ilman avaimia),Arsenal ajouté. (Pas de clés!),Lőszer (nincsenek kulcsok) Megadva,Equipaggiamento Completato (senza chiavi),武器弾薬(鍵なし)を受け取った,탄약(열쇠 없이) 추가됨,Munitie (geen sleutels) toegevoegd,Ammo (ingen nøkler) Lagt til,Amunicja (bez kluczy) dodana,Equipamento completo (sem chaves),,Echipament complet (fără muniție),Боезапас пополнен (без ключей),Муниција (без кључева) Додана,Ammo (inga nycklar) Tillagd,Cephane (anahtar yok) Eklendi,Спорядження поповнено (без ключів) -No Clipping Mode ON,STSTR_NCON,,,,Bezkolizní režim ZAP,Ikke-kollisionstilstand TIL,Nicht-Kollisionsmodus AN,Noclip λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado ŜALTITA,Modo de traspaso ACTIVADO,,Seinänläpikulkutila PÄÄLLÄ,Collisions OFF,Falonátmenés Mód BE,No Clipping ATTIVATO,壁抜けモード: オン,노 클립 모드 켬,Geen Clipping Modus AAN,Ingen klipping-modus PÅ,Tryb no-clip WŁĄCZONY,Modo sem colisão ATIVADO,,Modul fără coliziune ACTIVAT,Режим без столкновений ВКЛЮЧЕН,Пролажење кроз зидове УКЉУЧЕНО,Inget klippningsläge på,Klipsleme Yok Modu AÇIK,"Прохід крізь стіни +You start to rave,HUSTR_TALKTOSELF4,,,,Začneš pařit.,Du begynder at rave,Du beginnst zu toben,Αρχίζεις να ουρλίαζεις,Vi komencas frenezi,Empiezas a delirar,,Alat hourailla,Vous commencez à délirer!,Počinješ buncati,Reszketni kezdesz,Inizi a delirare,イカレ始めた,횡설수설하기 시작했다,Je begint te razen,Du begynner å rave,Zaczynasz wariować,Você começa a delirar,Começas a delirar,Începi să aiurezi,Вы бредите.,Брбљате,Du börjar rasa.,Çıldırmaya başlıyorsun,Ви починаєте марити +You've lost it...,HUSTR_TALKTOSELF5,,,,Kleplo ti...,Du har mistet den...,Du verlierst den Verstand...,Το έχασες,Vi freneziĝis...,Te has vuelto loc@[ao_esp]...,Te volviste loc@[ao_esp]...,Olet seonnut...,Vous avez perdu les pédales...,Gubiš se...,Eldobod az agyad...,Sei andato...,我を失った...,미치기 시작했다...,Je bent het kwijt,You've lost it...,Oszalałeś...,Você enlouqueceu...,Enlouqueceste,Ai luat-o pe ulei...,Какая досада...,Лудите...,Du har förlorat det...,Kaybettin...,Як сумно... +[Message Sent],HUSTR_MESSAGESENT,,,,[Zpráva odeslána],[besked sendt],[Nachricht gesendet],[Στάλθηκε],[Mesaĝo sendita],[Mensaje enviado],,[Viesti lähetetty],[Message Envoyé],[Poruka je poslana],[Üzenet elküldve],[Messaggio Inviato],[メッセージ送信],[메시지가 전달됨],[Bericht verzonden],[Melding sendt],[Wiadomość wysłana],[Mensagem enviada],,[Mesaj Trimis],[Сообщение отправлено],[Порука послата],[Meddelande skickat],[Mesaj Gönderildi],[Повідомлення відправлено] +,,Cheats,,,,,,,,,,,,,,,,,,,,,,,,,,, +Music Change,STSTR_MUS,,,,Změna hudby,Musik Ændring,Musikwechsel,Άλλαξε μουσική,Muzikŝanĝo,Cambio de música,,Musiikin vaihtaminen,Changement de Musique,Promjena glazbe,Zene Váltás,Cambio di musica,music変更,음악 전환,Muziek veranderen,Music Change,Zmieniono muzykę,Trocando música,Mudar a música,Schimbare muzică...,Смена музыки,Промена музике,Musikbyte,Müzik Değişimi,Зміна музики +Impossible Selection,STSTR_NOMUS,,,,Nemožný výběr,Umuligt valg,Falsche Auswahl,Αδήνατη επιλογή,Malebla Elektaĵo,Selección imposible,,Valinta ei mahdollinen,Séléction Impossible!,Nemogući odabir,Lehetetlen Kiválasztás,Selezione impossibile,その変更は不可能だ,불가능한 선택입니다,Onmogelijke selectie,Umulig valg,Niemożliwy wybór,Seleção impossível,,Selectare Imposibilă,Неверный выбор,НЕМОГУЋИ ИЗБОР,Omöjligt val,İmkansız Seçim,НЕКОРЕКТНИЙ ВИБІР +Degreelessness Mode ON,STSTR_DQDON,,,,Nesmrtelnost ZAP,Gradeløs tilstand TIL,Unverwundbarkeit AN,Θεική λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Nevundebla Reĝimo ŜALTITA,Invulnerabilidad ACTIVADA,,Kuolemattomuustila PÄÄLLÄ,Invulnérabilité ON ,Način bezstupnjevnosti UKLJ.,Sérthetetlenség Mód BE,Modalità Invincibilità ATTIVATA,無敵モード: オン,무미건조한 모드 켬,Gegradeloosheid modus AAN,Gradløshetsmodus PÅ,Niewrażliwość WŁĄCZONA,Modo invencível ATIVADO,,Modul invincibil ACTIVAT,Безграмотность ВКЛЮЧЕНА,Нерањивост УКЉУЧЕНА,Gradlöshetsläge på,Dokunulmazlık Modu AÇIK,Безсмертя ввімкнено +Degreelessness Mode OFF,STSTR_DQDOFF,,,,Nesmrtelnost VYP,Gradeløs tilstand FRA,Unverwundbarkeit AUS,Θεική λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Nevundebla Reĝimo MALŜALTITA,Invulnerabilidad DESACTIVADA,,Kuolemattomuustila POIS PÄÄLTÄ,Invulnérabilité OFF,Način bezstupnjevnosti ISKLJ.,Sérthetetlenség Mód KI,Modalità Invincibilità DISATTIVATA,無敵モード: オフ,무미건조한 모드 끔,Gegradeloosheid modus UIT,Gradløshetsmodus AV,Niewrażliwość WYŁĄCZONA,Modo invencível DESATIVADO,,Modul Invincibil DEZACTIVAT,Безграмотность ОТКЛЮЧЕНА,Нерањивост ИСКЉУЧЕНА,Gradlöshetsläge av,Dokunulmazlık Modu KAPALI,Безсмертя вимкнено +Ultimate Degreelessness Mode ON,STSTR_DQD2ON,,,,Supernesmrtelnost ZAP,Ultimativ gradløs tilstand TIL,Ultimative Unverwundbarkeit AN,Απόλητη θεική λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Nevundebla Reĝimo ŜALTITA,Invulnerabilidad absoluta ACTIVADA,,Varma kuolemattomuustila PÄÄLLÄ,Parfaite Invulnérabilité ON,Način krajnje bezstupnjevnosti UKLJ.,Tökéletes Sérthetetlenség Mód BE,Modalità Invincibilità Ultima ATTIVATA,究極無敵モード: オン,엄청나게 무미건조한 모드 켬,Uiteindelijke Gegradeloosheid modus AAN,Ultimativ gradløshetsmodus PÅ,Maksymalna niewrażliwość WŁĄCZONA,Modo invencível supremo ATIVADO,,Modul Invincibilitate Supremă ACTIVAT,Полная безграмотность ВКЛЮЧЕНА,Ултимативна нерањивост УКЉУЧЕНА,Ultimat gradlöshetsläge på,Nihai Dokunulmazlık Modu AÇIK,Повне безсмертя ввімкнено +Ultimate Degreelessness Mode OFF,STSTR_DQD2OFF,,,,Supernesmrtelnost VYP,Ultimativ gradløs tilstand FRA,Ultimative Unverwundbarkeit AUS,Απόλητη θεική λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Nevundebla Reĝimo MALŜALTITA,Invulnerabilidad absoluta DESACTIVADA,,Varma kuolemattomuustila POIS PÄÄLTÄ,Parfaite Invulnérabilité OFF,Način krajnje bezstupnjevnosti ISKLJ.,Tökéletes Sérthetetlenség Mód KI,Modalità Invincibilità Ultima DISATTIVATA,究極無敵モード: オフ,엄청나게 무미건조한 모드 끔,Uiteindelijke Gegradeloosheid modus UIT,Ultimativ gradløshetsmodus AV,Maksymalna niewrażliwość WYŁĄCZONA,Modo invencível supremo DESATIVADO,,Modul Invincibilitate Supremă DEZACTIVAT,Полная безграмотность ОТКЛЮЧЕНА,Ултимативна нерањивост ИСКЉУЧЕНА,Ultimat gradlöshetsläge av,Nihai Dokunulmazlık Modu KAPALI,Повне безсмертя вимкнено +Very Happy Ammo Added,STSTR_KFAADDED,,,,Velmi veselá munice přidána,Meget lykkelig Ammo tilføjet,Munition hinzugefügt,Πάρα Πολύ Χαρούμενα Πυρομαχηκά Προστέθηκαν,Tre Feliĉa Municio Aldonita,Munición añadida hasta el tope,,Täysaseistus,Armement Maximum!,Jako sretno streljivo je dodano,Összes Lőszer Megadva,Equipaggiamento Completato,とても満足する武器弾薬を受け取った,아주 행복한 탄약 추가됨,Zeer gelukkige munitie toegevoegd,Veldig glad ammunisjon lagt til,Bardzo szczęśliwa amunicja dodana,Equipamento completo,,Echipament complet,Боезапас на счастье пополнен,Веома Срећна Муниција Додана,Mycket lycklig ammunition har lagts till,Çok Mutlu Cephane Eklendi,Спорядження поповнено +Ammo (no keys) Added,STSTR_FAADDED,,,,Munice (bez klíčú) přidána,Ammo (ingen nøgler) Tilføjet,Munition (keine Schlüssel) hinzugefügt,Πυρομαχικά (Όχι κλειδία) προστέθηκαν,Municio (neniuj ŝlosiloj) Aldonita,Munición añadida (sin llaves),,Täysaseistus (ilman avaimia),Arsenal ajouté. (Pas de clés!),Streljivo (bez ključeva) je dodano,Lőszer (nincsenek kulcsok) Megadva,Equipaggiamento Completato (senza chiavi),武器弾薬(鍵なし)を受け取った,탄약(열쇠 없이) 추가됨,Munitie (geen sleutels) toegevoegd,Ammo (ingen nøkler) Lagt til,Amunicja (bez kluczy) dodana,Equipamento completo (sem chaves),,Echipament complet (fără muniție),Боезапас пополнен (без ключей),Муниција (без кључева) Додана,Ammo (inga nycklar) Tillagd,Cephane (anahtar yok) Eklendi,Спорядження поповнено (без ключів) +No Clipping Mode ON,STSTR_NCON,,,,Bezkolizní režim ZAP,Ikke-kollisionstilstand TIL,Nicht-Kollisionsmodus AN,Noclip λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado ŜALTITA,Modo de traspaso ACTIVADO,,Seinänläpikulkutila PÄÄLLÄ,Collisions OFF,Bez načina presjecanja UKLJ.,Falonátmenés Mód BE,No Clipping ATTIVATO,壁抜けモード: オン,노 클립 모드 켬,Geen Clipping Modus AAN,Ingen klipping-modus PÅ,Tryb no-clip WŁĄCZONY,Modo sem colisão ATIVADO,,Modul fără coliziune ACTIVAT,Режим без столкновений ВКЛЮЧЕН,Пролажење кроз зидове УКЉУЧЕНО,Inget klippningsläge på,Klipsleme Yok Modu AÇIK,"Прохід крізь стіни ВВІМКНЕНО" -No Clipping Mode OFF,STSTR_NCOFF,,,,Bezkolizní režim VYP,Ikke-kollisionstilstand FRA,Nicht-Kollisionsmodus AUS,Noclip λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado MALŜALTITA,Modo de traspaso DESACTIVADO,,Seinänläpikulkutila POIS PÄÄLTÄ,Collisions ON,Falonátmenés Mód KI,No Clipping DISATTIVATO,壁抜けモード: オフ,노 클립 모드 끔,Geen Clipping Modus OFF,Ingen klippemodus AV,Tryb no-clip WYŁĄCZONY,Modo sem colisão DESATIVADO,,Modul fără coliziune DEZACTIVAT,Режим без столкновений ОТКЛЮЧЕН,Пролажење кроз зидове ИСКЉУЧЕНО,Inget klippningsläge av,Klipsleme Yok Modu KAPALI,"Прохід крізь стіни +No Clipping Mode OFF,STSTR_NCOFF,,,,Bezkolizní režim VYP,Ikke-kollisionstilstand FRA,Nicht-Kollisionsmodus AUS,Noclip λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado MALŜALTITA,Modo de traspaso DESACTIVADO,,Seinänläpikulkutila POIS PÄÄLTÄ,Collisions ON,Bez načina presjecanja ISKLJ.,Falonátmenés Mód KI,No Clipping DISATTIVATO,壁抜けモード: オフ,노 클립 모드 끔,Geen Clipping Modus OFF,Ingen klippemodus AV,Tryb no-clip WYŁĄCZONY,Modo sem colisão DESATIVADO,,Modul fără coliziune DEZACTIVAT,Режим без столкновений ОТКЛЮЧЕН,Пролажење кроз зидове ИСКЉУЧЕНО,Inget klippningsläge av,Klipsleme Yok Modu KAPALI,"Прохід крізь стіни ВИМКНЕНО" -No Clipping Mode 2 ON,STSTR_NC2ON,,,,Bezkolizní režim 2 ZAP,Ikke-kollisionstilstand 2 TIL,Nicht-Kollisionsmodus 2 AN,Δέυτερη noclip λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado 2 ŜALTITA,Modo de traspaso 2 ACTIVADO,,Seinänläpikulkutila 2 PÄÄLLÄ,Collisions 3D OFF,Falonátmenés 2. Mód BE,No Clipping 2 ATTIVATO,壁抜けモード2: オン,노 클립 모드 2 켬,Geen Clipping Modus 2 AAN,No Clipping Mode 2 PÅ,Drugi tryb no-clip WŁĄCZONY,Modo sem colisão 2 ATIVADO,,Modul fără coliziune 2 ACTIVAT,Режим без столкновений 2 ВКЛЮЧЁН,Секундарни режим пролажења кроз зидове УКЉУЧЕНО,Inget klippningsläge 2 på,Klipsleme Yok Modu 2 AÇIK,"Проліт крізь стіни +No Clipping Mode 2 ON,STSTR_NC2ON,,,,Bezkolizní režim 2 ZAP,Ikke-kollisionstilstand 2 TIL,Nicht-Kollisionsmodus 2 AN,Δέυτερη noclip λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado 2 ŜALTITA,Modo de traspaso 2 ACTIVADO,,Seinänläpikulkutila 2 PÄÄLLÄ,Collisions 3D OFF,Bez načina presjecanja 2 UKLJ.,Falonátmenés 2. Mód BE,No Clipping 2 ATTIVATO,壁抜けモード2: オン,노 클립 모드 2 켬,Geen Clipping Modus 2 AAN,No Clipping Mode 2 PÅ,Drugi tryb no-clip WŁĄCZONY,Modo sem colisão 2 ATIVADO,,Modul fără coliziune 2 ACTIVAT,Режим без столкновений 2 ВКЛЮЧЁН,Секундарни режим пролажења кроз зидове УКЉУЧЕНО,Inget klippningsläge 2 på,Klipsleme Yok Modu 2 AÇIK,"Проліт крізь стіни ВВІМКНЕНО" -No Clipping Mode 2 OFF,STSTR_NC2OFF,,,,Bezkolizní režim 2 VYP,Ikke-kollisionstilstand 2 FRA,Nicht-Kollisionsmodus 2 AUS,Noclip λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado 2 MALŜALTITA,Modo de traspaso 2 DESACTIVADO,,Seinänläpikulkutila 2 POIS PÄÄLTÄ,Collisions 3D ON,Falonátmenés 2 Mód KI,No Clipping 2 DISATTIVATO,壁抜けモード2: オフ,노 클립 모드 2 끔,Geen Clipping Modus 2 OFF,Ingen klippemodus 2 AV,Drugy tryb no-clip WYŁĄCZONY,Modo sem colisão 2 DESATIVADO,,Modul fără coliziune 2 DEZACTIVAT,Режим без столкновений 2 ОТКЛЮЧЁН,Секундарни режим пролажења кроз зидове ИСКЉУЧЕНО,Inget klippningsläge 2 av,Klipsleme Yok Modu 2 KAPALI,"Проліт крізь стіни +No Clipping Mode 2 OFF,STSTR_NC2OFF,,,,Bezkolizní režim 2 VYP,Ikke-kollisionstilstand 2 FRA,Nicht-Kollisionsmodus 2 AUS,Noclip λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Reĝimo de Neniu Tondado 2 MALŜALTITA,Modo de traspaso 2 DESACTIVADO,,Seinänläpikulkutila 2 POIS PÄÄLTÄ,Collisions 3D ON,Bez načina presjecanja 2 ISKLJ.,Falonátmenés 2 Mód KI,No Clipping 2 DISATTIVATO,壁抜けモード2: オフ,노 클립 모드 2 끔,Geen Clipping Modus 2 OFF,Ingen klippemodus 2 AV,Drugy tryb no-clip WYŁĄCZONY,Modo sem colisão 2 DESATIVADO,,Modul fără coliziune 2 DEZACTIVAT,Режим без столкновений 2 ОТКЛЮЧЁН,Секундарни режим пролажења кроз зидове ИСКЉУЧЕНО,Inget klippningsläge 2 av,Klipsleme Yok Modu 2 KAPALI,"Проліт крізь стіни ВИМКНЕНО" "inVuln, Str, Inviso, Rad, Allmap, or Lite-amp",STSTR_BEHOLD,"“inVuln”: Invulnerability sphere “Str”: Berserk “Inviso”: Blur sphere “Rad”: Radiation-shielding suit “Allmap”: Computer area map -“Lite-amp”: Light-amplification visor",,,"nesmrt(V), (S)íla, nev(I)d, (R)ad, m(A)pa nebo svět(L)o","inVuln, Str, Inviso, Rad, Allmap, eller Lite-amp","inVuln, Str, Inviso, Rad, Allmap, oder Lite-amp",,"inVuln, Str, Inviso, Rad, Allmap, aŭ Lite-amp","inVuln, Str, Inviso, Rad, Allmap, o Lite-amp.",,"haavoittumattomuus (V), voima (S), näkymättömyys (I), koko kartta (A) tai valonvahvistus (L)","in V ulnérable, S urpuissance, I nvisible, p R otection, c A rte, où L umière?","Sérthetetlenség (V), berzerker mód (S), láthatatlanság (i), védőRuha, térkép (A), vagy éjjelLátó sisak","inVuln, berSerk, Invisib, tuta anti-Rad, mAppa tutta, o amplif-Luce","v,i,s,a,r,l の何れかを選べ","무적, 광전사, 투명, 보호복, 지도, 아니면 바이저","onSterv, Bzk, Inviso, Rad, Allmap, of Lvizier","inVuln, Str, Inviso, Rad, Allmap eller Lite-forsterker","niezniszczalność (V), siła (S), niewidzialność (I), kombinezon (R), mapa (A) lub gogle noktowizyjne (L)","Invulnerabilidade (V), Frenesi (S), Invisibilidade (I), Antirradiação (R), Mapa Completo (A) ou Amplificação de Luz (L)",,"InVinc, Forță amplificată, Invizib, Hartă completă, sau +“Lite-amp”: Light-amplification visor",,,"nesmrt(V), (S)íla, nev(I)d, (R)ad, m(A)pa nebo svět(L)o","inVuln, Str, Inviso, Rad, Allmap, eller Lite-amp","inVuln, Str, Inviso, Rad, Allmap, oder Lite-amp",,"inVuln, Str, Inviso, Rad, Allmap, aŭ Lite-amp","inVuln, Str, Inviso, Rad, Allmap, o Lite-amp.",,"haavoittumattomuus (V), voima (S), näkymättömyys (I), koko kartta (A) tai valonvahvistus (L)","in V ulnérable, S urpuissance, I nvisible, p R otection, c A rte, où L umière?","Sfera neranjivosti (V), Način pomahnitalosti (S), Sfera zamućenja, Odijelo za zaštitu od zračenja (A), Računalna karta područja (A), Vizir za pojačanje svjetla","Sérthetetlenség (V), berzerker mód (S), láthatatlanság (i), védőRuha, térkép (A), vagy éjjelLátó sisak","inVuln, berSerk, Invisib, tuta anti-Rad, mAppa tutta, o amplif-Luce","v,i,s,a,r,l の何れかを選べ","무적, 광전사, 투명, 보호복, 지도, 아니면 바이저","onSterv, Bzk, Inviso, Rad, Allmap, of Lvizier","inVuln, Str, Inviso, Rad, Allmap eller Lite-forsterker","niezniszczalność (V), siła (S), niewidzialność (I), kombinezon (R), mapa (A) lub gogle noktowizyjne (L)","Invulnerabilidade (V), Frenesi (S), Invisibilidade (I), Antirradiação (R), Mapa Completo (A) ou Amplificação de Luz (L)",,"InVinc, Forță amplificată, Invizib, Hartă completă, sau Vedere amplificată","Бессм. (V), сила (S), невид. (I), кост. (R), п. карта (A), ус. света (L).","нерањ., снага, невидљ., радиј., мапа или ноћ. визор","inVuln, Str, Inviso, Rad, Allmap eller Lite-amp",,"Безсм. (V), берс. (S), нев. (I), кос. (R), карта (A), ПНВ (L)." -Power-up Toggled,STSTR_BEHOLDX,,,,Power-up vybrán,Strømoptagelse Skiftet,Verbesserung umgeschaltet!,,Plifortigaĵo Baskuligita,Poder alternado,,Tehostin kytketty,Amélioration Activée!,Képesség hozzáadva,Power-up concesso/tolto,パワーアップ 適用,파워-업 전환됨,Versterking ingeschakeld,Oppstart aktivert,Wzmocnienie aktywowane,Potencializador ativado,,Putere Activată,Усиление включено,Супер моћи заглављене,Start av strömmen växlade,Güç Açma Değiştirildi,Підсилення ввімкнено -... doesn't suck - GM,STSTR_CHOPPERS,"Printed when entering the idchoppers cheat, which gives the player a chainsaw",,,... není cucák - GM,... er ikke dårlig - GM,... gar nicht übel - GM,... δέν είναι χάλια - GW,... ne aĉas - GM,... no apesta - GM,,... ei ole syvältä - GM,... C'est pas de la merde. - GM,... nem annyira gáz - GM,... non fa schifo - GM,...わるかぁねえぞ --gm,... 후진 건 아니지만 - GM,.... is niet slecht - GM,... suger ikke - GM,... nie ssie - GM,... não tá ruim — GM,,... nu e jalnic - GM,...не отстой — GM,... није лоша - GM,... suger inte - GM,... berbat değil - GM,... непогано — г.м. +Power-up Toggled,STSTR_BEHOLDX,,,,Power-up vybrán,Strømoptagelse Skiftet,Verbesserung umgeschaltet!,,Plifortigaĵo Baskuligita,Poder alternado,,Tehostin kytketty,Amélioration Activée!,Prekidač pojačanja,Képesség hozzáadva,Power-up concesso/tolto,パワーアップ 適用,파워-업 전환됨,Versterking ingeschakeld,Oppstart aktivert,Wzmocnienie aktywowane,Potencializador ativado,,Putere Activată,Усиление включено,Супер моћи заглављене,Start av strömmen växlade,Güç Açma Değiştirildi,Підсилення ввімкнено +... doesn't suck - GM,STSTR_CHOPPERS,"Printed when entering the idchoppers cheat, which gives the player a chainsaw",,,... není cucák - GM,... er ikke dårlig - GM,... gar nicht übel - GM,... δέν είναι χάλια - GW,... ne aĉas - GM,... no apesta - GM,,... ei ole syvältä - GM,... C'est pas de la merde. - GM,... nije sranje - GM,... nem annyira gáz - GM,... non fa schifo - GM,...わるかぁねえぞ --gm,... 후진 건 아니지만 - GM,.... is niet slecht - GM,... suger ikke - GM,... nie ssie - GM,... não tá ruim — GM,,... nu e jalnic - GM,...не отстой — GM,... није лоша - GM,... suger inte - GM,... berbat değil - GM,... непогано — г.м. Changing Level...,STSTR_CLEV,,,,Měním level...,Ændring af niveau ...,Wechsle Level...,Αλλαγή πίστας...,Ŝanĝante Nivelon...,"Cambiando de nivel... -",,Vaihdetaan tasoa...,Changement de niveau...,Pályaváltás...,"Cambio di livello... +",,Vaihdetaan tasoa...,Changement de niveau...,Promjena razine...,Pályaváltás...,"Cambio di livello... ",場所を変更...,레벨 변경 중...,Level veranderen...,Endre nivå ...,Zmienianie poziomu...,Trocando de fase...,"A mudar de nível... ",Schimbare hartă...,"Смена уровня... ",Мењам ниво...,Ändrad nivå ...,Seviye Değiştirme...,Зміна рівня... -Buddha mode ON,TXT_BUDDHAON,,,,Buddha mód ZAP,Buddha-tilstand TIL,Buddhamodus AN,Λειτουργία Βουδα ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Budha reĝimo ŜALTITA,Modo Buda ACTIVADO,,Buddhatila PÄÄLLÄ,Mode Bouddha ON,Buddha Mód BE,Modalità Buddha ATTIVATA,ブッダモード: オン,부처 모드 켬,Boeddha-modus AAN,Buddha-modus PÅ,Tryb Buddy WŁĄCZONY,Modo Buda ATIVADO,,Modul Buddha ACTIVAT,Режим Будды ВКЛЮЧЁН,Буда Мод УКЉУЧЕН,Buddha-läge på,Buda modu AÇIK,Будда-мод ВВІМК. -Buddha mode OFF,TXT_BUDDHAOFF,,,,Buddha mód VYP,Buddha-tilstand FRA,Buddhamodus AUS,Λειτουργία Βουδα ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Budha reĝimo MALŜALTITA,Modo Buda DESACTIVADO,,Buddhatila POIS PÄÄLTÄ,Mode Bouddha OFF,Buddha Mód KI,Modalità Buddha DISATTIVATA,ブッダモード: オフ,부처 모드 끔,Boeddha-modus UIT,Buddha-modus AV,Tryb Buddy WYŁĄCZONY,Modo Buda DESATIVADO,,Modul Buddha DEZACTIVAT,Режим Будды ОТКЛЮЧЁН,Буда Мод ИСКЉУЧЕН,Buddha-läge avstängt,Buda modu KAPALI,Будда-мод ВИМК. -Ultimate Buddha Mode ON,TXT_BUDDHA2ON,,,,Super Buddha mód ZAP,Ultimate Buddha-tilstand TIL,Ultimativer Buddhamodus AN,Λειτουργία Απόλητου Βουδα ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Budha Reĝimo ŜALTITA,Modo Buda Supremo ACTIVADO,,Korkein buddhatila PÄÄLLÄ,Mode Bouddha Ultime ON,Tökéletes Buddha Mód BE,Modalità Ultimo Buddha ATTIVATA,究極ブッダモード: オン,나무 아미타불 모드 켬,Ultieme Boeddha-modus AAN,Ultimativ Buddha-modus PÅ,Maksymalny Tryb Buddy WŁĄCZONY,Modo Buda supremo ATIVADO,,Modul Buddha Suprem ACTIVAT,Окончательный режим Будды ВКЛЮЧЁН,Ултимативни Буда Мод УКЉУЧЕН,Ultimat Buddha-läge på,Nihai Buda Modu AÇIK,Ультимативний Будда-мод ВВІМК. -Ultimate Buddha Mode OFF,TXT_BUDDHA2OFF,,,,Super Buddha mód VYP,Ultimate Buddha-tilstand FRA,Ultimativer Buddhamodus AUS,Λειτουργία Απόλητου Βουδα ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Budha Reĝimo MALŜALTITA,Modo Buda Supremo DESACTIVADO,,Korkein buddhatila POIS PÄÄLTÄ,Mode Bouddha Ultime OFF,Tökéletes Buddha Mód KI,Modalità Ultimo Buddha DISATTIVATA,究極ブッダモード: オフ,나무 아미타불 모드 끔,Ultieme Boeddha-modus UIT,Ultimativ Buddha-modus AV,Maksymalny Tryb Buddy WYŁĄCZONY,Modo Buda supremo DESATIVADO,,Modul Buddha Suprem DEZACTIVAT,Окончательный режим Будды ОТКЛЮЧЁН,Ултимативни Буда Мод ИСКЉУЧЕН,Ultimat Buddha-läge av,Nihai Buda Modu KAPALI,Ультимативний Будда-мод ВИМК. -Power on,TXT_CHEATPOWERON,,,,Energie ZAP,Evne TIL,Fähigkeit AN,Δύναμη ενεργοποιημένη,Povo ŝaltita,Poder activado,,Voima päällä,Pouvoir Activée,Energia BE,Potere ATTIVATO,パワー オン,파워 켬,Vermogen aan,Strøm PÅ,Zasilanie włączone,Poder ativado,,Putere activată,Сила активирована,Моћ УКЉУЧЕНА,Makt på,Güç açık,Сила активована -Power off,TXT_CHEATPOWEROFF,,,,Energie VYP,Evne FRA,Fähigkeit AUS,Δύναμη άπενεργοποιημένη,Povo malŝaltita,Poder desactivado,,Voima pois päältä,Pouvoir Désactivée,Energia KI,Potere DISATTIVATO,パワー オフ,파워 끔,Vermogen uit,Slå AV,Zasilanie wyłączone,Poder desativado,,Putere dezactivată,Сила деактивирована,Моћ ИСКЉУЧЕНА,Makt av,Güç kapalı,Сила деактивована -Full health,TXT_CHEATHEALTH,,,,Plné zdraví,Fuldt helbred,Volle Lebensenergie,Ολόκληρη υγεία,Plena sano,Salud al máximo,,Täysi terveys,Pleine Santé,Teljes életerő,Piena salute,ヘルス全回復,체력 완전 회복,Volledige gezondheid,Full helse,Pełne zdrowie,Saúde completa,Vida totalmente cheia,Sănătate completă,Полное здоровье,Здравље напуњено,Full hälsa,Tam sağlık,Повне здоров'я -All keys,TXT_CHEATKEYS,,,,Všechny klíče,Alle taster,Alle Schlüssel,Όλα τα κλειδία,Ĉiuj ŝlosiloj,Todas las llaves,,Kaikki avaimet,Toutes les Clés,Összes kulcs,Tutte le chiavi,キー全部,모든 열쇠,Alle sleutels,Alle taster,Wszystkie klucze,Todas as chaves,,Toate cheile,Все ключи,Сви кључеви,Alla tangenter,Tüm anahtarlar,Усі ключі -Sound debug on,TXT_CHEATSOUNDON,,,,Debug zvuku ZAP,Sound debug TIL,Sound Debug AN,Debug ήχου ενεργοποιημένη,Sono-sencimiga reĝimo ŝaltita,Depuración de sonido activada,,Äänen vianmääritystila päällä,Débogage du son activé.,Hang debug BE,Debug del suono attivato,サウンドデバッグ オン,효과음 디버그 켬,Geluid debug aan,Lyd feilsøking PÅ,Debugowanie dźwięku włączone,Depuração de som ativada,,Debug sunet activat,Отладка звука включена,Дебаговање звука УКЉУЧЕНО,Ljud felsökning på,Ses hata ayıklama açık,Налагодження звуку УВІМКНЕНО -Sound debug off,TXT_CHEATSOUNDOFF,,,,Debug zvuku VYP,Sound debug FRA,Sound Debug AUS,Debug ήχου άπενεργοποιημένη,Sono-sencimiga reĝimo malŝaltita,Depuración de sonido desactivada,,Äänen vianmääritystila pois päältä,Débogage du son désactivé.,Hang debug KI,Debug del suono disattivato,サウンドデバッグ オフ,효과음 디버그 끔,Geluid debug uit,Lyd feilsøking AV,Debugowanie dźwięku wyłączone,Depuração de som desativada,,Debug sunet dezactivat,Отладка звука отключена,Дебаговање звука ИСКЉУЧЕНО,Ljud felsökning av,Ses hata ayıklama kapalı,Налагодження звуку ВИМКНЕНО -"Trying to cheat, eh? Now you die!",TXT_CHEATIDDQD,,,,"Pokoušíš se cheatovat, co? Teď zemřeš!","Prøver du at snyde, hva'? Nu dør du!","Versuchst zu betrügen, was? Nun stirbst du!","Προσπαθείς να εξαπατήσεις, ε? Τώρα πεθένεις!","Provas trompi, ĉu vi? Nun vi mortas! ","¿Tratando de hacer trampas, eh? ¡Muere!",,"Yrität huijata, vai? Nyt kuolet!","Tu essaie de tricher, hein? Maintenant tu meurs!","Csalni akarsz, mi? Most meghalsz!","Cerchi di barare, eh? Allora muori!",その名を唱えたな? 褒美に死をやろう!,치트 쓸려고? 그럼 죽어야지!,"Je wou valsspelen, hè? Nu ga je dood!",Prøver du å jukse? Nå dør du!,"Próbujesz oszukiwać, co? Teraz giń!","Tentando trapacear, né? Morra!","A fazer batota, é? Morre!","Încerci să trișezi, ei? Acum mori!","Жульничаешь, э? Так умри!","Покушаваш да вараш, ех? Сада умиреш!",Försöker du fuska? Nu dör du!,"Hile yapmaya çalışıyorsun, ha? Şimdi öleceksin!","Хех, чітериш? Тепер помри!" -Cheater - you don't deserve weapons,TXT_CHEATIDKFA,,,,Podvodníku - nezasloužíš si zbraně,Snyder - du fortjener ikke våben,Betrüger - du verdienst keine Waffen,Απατεόνα δέν σου αξήζουν όπλα,Trompanto - vi ne meritas armilojn,¡Trampos@[ao_esp]! No mereces tener armas,,Huijari - et ansaitse aseita,Tricheur- Tu ne mérite pas d'armes!,Csaló - nem érdemelsz fegyvert!,Imbroglione - non meriti armi,不届き者め、貴様が偉業を成すはずがない,사기꾼놈! 너는 무기를 가질 자격이 없어!,Valsspeler - je verdient geen wapens.,Juksemaker - du fortjener ikke våpen,Oszust - nie zasługujesz na bronie,Trapaceiros não merecem armas,Batoteir@[ao_ptb] - Não mereces armamento,Trișor - Nu meriți arme,Жулик — ты не заслуживаешь оружия,Варалице - ти не заслужујеш оружје,Fuskare - du förtjänar inte vapen.,"Hileci, silahları hak etmiyorsun.",Пройдисвіт - ти не заслужив зброї -Ticker on,TXT_CHEATTICKERON,,,,Počítadlo ZAP,Ticker TIL,Zähler AN,Χρονόμετρο ενεργοποιημένο,Nombrilo ŝaltita,Contador activado,,Laskuri päällä,Compteur allumé,Számláló BE,Ticker attivato,ティッカー オン,프레임 속도 표시 켬,Ticker aan,Ticker PÅ,Wskaźnik włączony,Contador ativado,,Ticăitoare activată,Счётчик включён,Бројач укључен,Ticker på,Ticker açık,Лічильник Ввімк. -Ticker off,TXT_CHEATTICKEROFF,,,,Počítadlo VYP,Ticker FRA,Zähler AUS,Χρονόμετρο άπενεργοποιημένο,Nombrilo malŝaltita,Contador desactivado,,Laskuri pois päältä,Compteur éteint,Számláló KI,Ticker disattivato,ティッカー オフ,프레임 속도 표시 끔,Ticker uit,Ticker AV,Wskaźnik wyłączony,Contador desativado,,Ticăitoare dezactivată,Счётчик отключён,Бројач искључен,Ticker av,Ticker kapalı,Лічильник Вимк. -You got it,TXT_CHEATARTIFACTS3,,,,Máš to mít,Du fik det,Du hast es,Το πήρες,Vi akiris ĝin,Lo tienes,,Saamasi pitää,C'est à vous!,Megkaptad,Concesso,それを渡そう。,얻었다,Je hebt het,Du har det,Udało ci się,Concedido,,Ai ce-ți trebuie,Вы получили это,Уреду,Du fick det,Tamamdır.,Ви отримали це -"You got the Midas Touch, baby",TXT_MIDASTOUCH,,,,"Máš Midasův dotek, zlato","Du har Midas Touch, baby",Dagobert Duck lässt grüßen!,"Έχεις το αγγιγμα το Μίδα, μωρό.","Vi akiris la Tuŝon de Midas, kara","Tienes el toque de Midas, muchach@[ao_esp]",,"Kulta, sinulla on Midaksen kosketus",,"Minden arannyá válik amit megérintesz, öreg","Hai avuto il Tocco di Mida, baby",ミダス王の様だな、ベイビー,넌 미다스의 손을 얻었어 베이베!,"Je hebt de Midas Touch, schatje","Du har Midas Touch, baby","Zdobył@[irreg_3_pl] dotyk Midasa, skarbie","Você tem o Toque de Midas, baby","Tens o Toque de Midas, baby","Ai Atingerea lui Midas, dragule","Ты превращаешь всё в золото, детка!","Имаш златке руке, душо","Du har Midas Touch, baby","Sende Midas Dokunuşu var, bebeğim","Дар Мідаса у твоїх руках, золотце" -You got the stuff!,TXT_GOTSTUFF,,,,Dostal jsi věci!,Du har det hele!,Du hast den Kram erhalten,Πήρες τηατ πράγματα !,Vi akiris la aĵojn!,¡Tienes un montón de cosas!,,Sait kamppeet!,Voilà ton équipement!,Megkaptad a cuccot!,Hai avuto il materiale!,スタッフを手に入れた!,무언가를 얻었다!,Je hebt het spul!,Du har greiene!,Zdobył@[irreg_3_pl] parę rzeczy!,Você ganhou muitas coisas!,ganhaste muitas coisas!,Ai tot ce-ți trebuie!,Получены предметы!,Покупили сте ствари!,Du har grejerna!,Mal sende!,Отримано предмети! -Freeze mode on,TXT_FREEZEON,,,,Režim zamrznutí ZAP,Frysetilstand TIL,Gefriermodus AN,Παγομένη λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Movhalta reĝimo ŝaltita,Modo suspendido activado,,Jäädytystila päällä,Temps arrêté.,Fagyasztás BE,Modalità arresto del tempo attivata,フリーズモード オン,시간정지 켬,Bevriesmodus aan,Frysemodus PÅ,Tryb zamrożenia włączony,Modo congelado ativado,,Modul înghețat activat,Режим заморозки включён,Мод замрзавања УКЉУЧЕН,Frysningsläge på,Dondurma modu açık,Режим заморозки ВВІМКНЕНО -Freeze mode off,TXT_FREEZEOFF,,,,Režim zamrznutí VYP,Frysetilstand FRA,Gefriermodus AUS,Παγομένη λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Movhalta reĝimo malŝaltita,Modo suspendido desactivado,,Jäädytystila pois päältä,Le temps reprend son cours..,Fagyasztás KI,Modalità arresto del tempo disattivata,フリーズモード オフ,시간정지 끔,Bevriesmodus uit,Frysemodus AV,Tryb zamrożenia wyłączony,Modo congelado desativado,,Modul înghețat dezactivat,Режим заморозки отключён,Мод замрзавања ИСКЉУЧЕН,Frysningsläge av,Dondurma modu kapalı,Режим заморозки ВИМКНЕНО -You feel strange...,TXT_STRANGE,,,,Cítíš se divně...,Du føler dig mærkelig...,Du fühlst dich merkwürdig...,Νιώθης περίεργα...,Vi sentas vin strange...,Te sientes extrañ@[ao_esp]...,,Sinulla on kummallinen olo...,Vous vous sentez mal à l'aise...,Furán érzed magad...,Ti senti strano...,これは奇妙な感じだな...,뭔가 이상한 기분이...,Je voelt je vreemd...,Du føler deg rar...,Dziwnie się czujesz...,Você está com uma sensação estranha...,Tu sentes-te estranh@[ao_ptb].,Te simți ciudat...,Вы чувствуете себя странно...,Осећате се чудно...,Du känner dig konstig...,Garip hissediyorsun.,Ви почуваєте себе дивно... -You feel even stranger.,TXT_STRANGER,,,,Cítíš se ještě divněji...,Du føler dig endnu mere mærkelig.,Du fühlst dich noch merkwürdiger,Νιώθης ακόμα πιό περίεργα...,Vi sentas vin eĉ pli strange.,Te sientes aún más extrañ@[ao_esp],,Olosi on vieläkin kummempi.,Vous vous sentez très mal à l'aise...,Még furábban érzed magad.,Ti senti ancora più strano.,これはかなり奇妙だ。,기분이 더더욱 이상해졌다.,Je voelt je nog vreemder.,Du føler deg enda merkeligere.,Czujesz się jeszcze dziwniej.,Você está com uma sensação mais estranha ainda.,Tu sentes-te ainda mais estranh@[ao_ptb].,Te simți și mai ciudat.,Вы чувствуете себя очень странно.,Осећате се врло чудно.,Du känner dig ännu konstigare.,Daha da garip hissediyorsun.,Ви почуваєте себе ще дивніше. -You feel like yourself again.,TXT_NOTSTRANGE,,,,Cítíš se opět jako ty.,Du føler dig som dig selv igen.,Du fühlst dich wieder wie du selbst,Νιώθης σάν τον εαύτο σου ξανά...,Vi denove sentas vin kiel vi mem.,Te sientes como tú mism@[ao_esp] otra vez.,,Tunnet olevasi jälleen oma itsesi.,Vous vous sentez mieux.,Magadhoz tértél.,Ti senti di nuovo te stesso.,自分自身の様に感じている。,자기 자신처럼 생각하게 됐다.,Je voelt je weer als jezelf.,Du føler deg som deg selv igjen.,Znów czujesz się sobą.,Você se sente normal novamente.,Tu sentes-te normal novamente.,Ți-ai revenit în simțiri.,Вы снова чувствуете себя собой.,Поново се осећате као ви.,Du känner dig som dig själv igen.,Tekrar kendin gibi hissediyorsun.,Ви почуваєтесь собою. -Lead boots on,TXT_LEADBOOTSON,,,,Olověné boty ZAP,Blystøvler TIL,Bleistiefel AN,Μολυβδένιες μπότες ΕΝΕΡΓΟΠΟΙΗΜΈΝΕΣ,Botoj el plumbo ŝaltita,Botas de plomo activadas,,Lyijysaappaat päällä,Bottes en plomb ON,Ólomcsizma BE,Stivali di Piombo ON,足枷 オン,납 부츠 켬,Loden laarzen aan,Blystøvler PÅ,Ołowiane buty włączone,Botas de chumbo ativadas,,Bocanci de plumb activați,Свинцовые сапоги надеты,Оловне чизме УКЉУЧЕНЕ,Blystövlar på,Kurşun çizmeler,Одягнено свинцеві чоботи -Lead boots off,TXT_LEADBOOTSOFF,,,,Olověné boty VYP,Blystøvler FRA,Bleistiefel AUS,Μολυβδένιες μπότες ΆΠΕΝΕΡΓΟΠΟΙΗΜΕΝΕΣ,Botoj el plumbo malŝaltita,Botas de plomo desactivadas,,Lyijysaappaat pois päältä,Bottes en plomb OFF,Ólomcsizma KI,Stivali di Piombo OFF,足枷 オフ,납 부츠 끔,Loden laarzen uit,Blystøvler AV,Ołowiane buty wyłączone,Botas de chumbo desativadas,,Bocanci de plumb dezactivați,Свинцовые сапоги сняты,Оловне чизме ИСКЉУЧЕНЕ,Blykängor av,Kurşun çizmeler kapalı,Знято свинцеві чоботи -You feel lighter,TXT_LIGHTER,,,,Cítíš se lehčí,Du føler dig lettere,Du fühlst dich leichter,Νιώθης πιο ελαφρής,Vi sentas vin pli malpeza,Te sientes más liger@[ao_esp],,Tunnet olosi kevyemmäksi,Vous vous sentez très léger.,Könnyűnek érzed magad,Ti senti più leggero,体が軽くなった,가벼운 느낌이 든다,Je voelt je lichter,Du føler deg lettere,Czujesz się lżejsz@[adj_pl],Você se sente mais leve,Tu sentes-te mais leve,Te simți mai ușor,Вы чувствуете лёгкость.,Осећате лакоћу.,Du känner dig lättare.,Daha hafif hissediyorsun,Ви побороли гравітацію -Gravity weighs you down,TXT_GRAVITY,,,,Gravitace tě táhne dolů,Tyngdekraften tynger dig ned,Schwerkraft belastet dich,Η βαρύτητα σε πιάνει.,Gravito pezigas vin,La gravedad te hace descender,,Painovoima painaa sinua alas,La gravité vous ramène au sol.,A gravitáció lehúz téged,La gravità ti riporta a terra,重力に従った,중력이 당신을 붙잡았다,Zwaartekracht werkt op je...,Tyngdekraften tynger deg ned,Grawitacja znów cię przyciąga,A gravidade volta a funcionar normalmente,A gravidade voltou ao normal,Gravitația te trage în jos,Гравитация тянет вас вниз.,Гравитација Вас вуче надоле.,Tyngdkraften tynger ner dig,Yerçekimi seni ağırlaştırır,Гравітація знову притискає вас до землі -No Target ON,TXT_NOTARGET_ON,,,,Neútočící příšery ZAP,Ingen mål TIL,notarget AN,Αστόχευτη λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Neniu Celo ŜALTITA,No Objetivo ACTIVADO,,Hyökkäämättömyystila PÄÄLLÄ,Monstres aveugles et sourds ON,Nem támadnak a szörnyek BE,Modalità Mostri ciechi e sordi ATTIVATA,ノーターゲット オン,적 표적 감지 켬,Geen doelwit AAN,No Target PÅ,Głuche i Ślepe Potwory WŁĄCZONE,Sem alvos ATIVADO,,Modul Inamici fără Țintă ACTIVAT,Незаметность ВКЛЮЧЕНА,Нема мете УКЉУЧЕНО,Inget mål på,Hedef Yok AÇIK,Невідчутність ввімкнено -No Target OFF,TXT_NOTARGET_OFF,,,,Neútočící příšery VYP,Ingen mål FRA,notarget AUS,Αστόχευτη λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Neniu Celo MALŜALTITA,No Objetivo DESACTIVADO,,Hyökkäämättömyystila POIS PÄÄLTÄ,Monstres aveugles et sourds OFF,Nem támadnak a szörnyek KI,Modalità Mostri ciechi e sordi DISATTIVATA,ノーターゲット オフ,적 표적 감지 끔,Geen doelwit UIT,No Target AV,Głuche i Ślepe Potwory WYŁĄCZONE,Sem alvos DESATIVADO,,Modul Inamici fără Țintă DEZACTIVAT,Незаметность ОТКЛЮЧЕНА,Нема мете ИСКЉУЧЕНО,Inget mål av,Hedef Yok KAPALI,Невідчутність вимкнено -"""Quake with fear!""",TXT_ANUBIS_ON,,,,„Třeste se strachy!“,"""Skælv af frygt!""",„Zittere vor Angst!“,"""Τρέμε με φόβο!""","""Tremu pro timo!""","""¡Temblad de miedo!""","""¡Tiemblen de miedo!""","""Vapise pelosta!""",« Tremblez de terreur! »,"""Reszkess, halandó!""","""Trema con terrore!""",恐れおののけ!,공포에 떨어라!,„Beving van angst!“,"""Skjelv av frykt!""","""Trzęś się ze strachu""","""Trema de medo!""","""Trema com medo!""","""Tremură de Frică!""",«Дрожите от страха!»,„Дрхтите у страху!“,"""Skräck skakar av rädsla!""","""Korkudan titre!""","""Трясись зі страху!""" -No more Ogre Armor,TXT_ANUBIS_OFF,,,,Už žádné zlobří brnění,Ikke mere troldepanser,Keine Ogerrüstung mehr,Καθόλου δρακοντική πανοπλία πια,Ne plu Ogrokiraso,No más armadura de Ogro,,Ei enää örkkipanssaria,Plus d'armure d'ogre,Ogre pajzs lejárt,Niente più armatura Ogre,オーガアーマーはもう嫌,오거 갑옷은 이제 없다.,Geen Ogre Pantser meer,Ikke mer Ogre Armor,Nigdy więcej Pancerza Ogrów,Chega de Armadura de Ogro,Chega de Armadura de Ogre,Gata cu Armura de Căpcăun,Броня огра снята,Нема више бауков оклоп,Inget mer träsktorns rustning,Artık Ogre Zırhı yok,Броню огра знято -chasecam ON,TXT_CHASECAM_ON,,,,Pohled z třetí osoby ZAP,chasecam TIL,chasecam AN,Κάμερα τρίτου πρωσώπου ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Ĉaskamerao ŜALTITA,Cámara de seguimiento ACTIVADA,,Seurantakamera PÄÄLLÄ,,követő kamera BE,Modalità camera da inseguimento ATTIVATA,チェイスカメラ オン,3인칭 카메라 켬,Chasecam AAN,chasecam PÅ,kamera śledzenia WŁĄCZONA,Câmera em terceira pessoa ATIVADA,Câmara em Terceira Pessoa ATIVADA,Perspectivă la Persoana a 3-a ACTIVATĂ,Вид от третьего лица ВКЛЮЧЁН,Чејс-кам УКЉУЧЕН,chasecam på,Chasecam AÇIK,Камера від 3-го лиця активована -chasecam OFF,TXT_CHASECAM_OFF,,,,Pohled z třetí osoby VYP,chasecam FRA,chasecam AUS,Κάμερα τρίτου πρωσώπου ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Ĉaskamerao MALŜALTITA,Cámara de seguimiento DESACTIVADA,,Seurantakamera POIS PÄÄLTÄ,,követő kamera KI,Modalità camera da inseguimento DISATTIVATA,チェイスカメラ オフ,3인칭 카메라 끔,Chasecam UIT,chasecam AV,kamera śledzenia WYŁĄCZONA,Câmera em terceira pessoa DESATIVADA,Câmara em Terceira Pessoa DESATIVADA,Perspectivă la Persoana a 3-a DEZACTIVATĂ,Вид от третьего лица ОТКЛЮЧЁН,Чејс-кам ИСКЉУЧЕН,chasecam av,Chasecam KAPALI,Камера від 3-го лиця деактивована -1 baddie killed,TXT_BADDIE_KILLED,,,,1 zloun zabit,1 baddie dræbt,1 Bösewicht getötet,Ενας κακός πέθανε,1 malbonulo mortigita,Un malote aniquilado,,1 pahis tapettu,1 enemi tué,1 rosszfiú kinyírva,Ucciso 1 maligno,1 体 殺した,1 명의 나쁜놈이 사살됨.,1 slechterik gedood,1 skurk drept,1 zabity przeciwnik,1 inimigo morto,,1 slab ucis,1 плохиш убит,Један зликовац убијен,1 skurk dödad,1 kötü öldürüldü,1 поганець вмер -%d baddies killed,TXT_BADDIES_KILLED,,,,%d zlounů zabito,%d baddies dræbt,%d Bösewichte getötet,%d τον κακόν πέθαναν,%d malbonuloj mortigitaj,%d malotes aniquilados,,%d pahista tapettu,%d enemis tués,%d rosszfiú kinyírva,Uccisi %d maligni,%d 体 殺した,%d 명의 나쁜놈들이 사살됨.,%d slechteriken gedood,%d skurker drept,%d zabitych przeciwników,%d inimigos mortos,,%d slabi uciși,Плохишей убито: %d,%d зликовца убијено,%d skurkar dödade,%d kötüler öldürüldü,Поганців вмерло: %d -1 monster killed,TXT_MONSTER_KILLED,,,,1 příšera zabita,1 monster dræbt,1 Monster getötet,Ένα τέρας πέθανε,1 monstro mortigita,Un monstruo aniquilado,,1 hirviö tapettu,1 monstre tué,1 szörny kinyírva,Ucciso 1 mostro,1 匹 殺した,1 마리의 몬스터가 사살됨.,1 monster gedood,1 monster drept,1 zabity potwór,1 monstro morto,,1 monstru ucis,1 монстр убит,Једно чудовиште убијено,1 monster dödat,1 canavar öldürüldü,1 монстра убито -%d monsters killed,TXT_MONSTERS_KILLED,,,,%d příšer zabito,%d monster dræbt,%d Monster getötet,%d τον τεράτων πέθαναν,%d monstroj mortigitaj,%d monstruos aniquilados,,%d hirviötä tapettu,%d monstres tués,%d szörny kinyírva,Uccisi %d mostri,%d 匹 殺した,%d 마리의 몬스터들이 사살됨.,%d monsters gedood,%d monstre drept,%d zabitych potworów,%d monstros mortos,,%d monștri uciși,Убито монстров: %d,%d чудовишта убијено,%d monster dödade,öldürülen %d canavar,Монстрів вбито: %d +Buddha mode ON,TXT_BUDDHAON,,,,Buddha mód ZAP,Buddha-tilstand TIL,Buddhamodus AN,Λειτουργία Βουδα ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Budha reĝimo ŜALTITA,Modo Buda ACTIVADO,,Buddhatila PÄÄLLÄ,Mode Bouddha ON,Način Buddhe UKLJ.,Buddha Mód BE,Modalità Buddha ATTIVATA,ブッダモード: オン,부처 모드 켬,Boeddha-modus AAN,Buddha-modus PÅ,Tryb Buddy WŁĄCZONY,Modo Buda ATIVADO,,Modul Buddha ACTIVAT,Режим Будды ВКЛЮЧЁН,Буда Мод УКЉУЧЕН,Buddha-läge på,Buda modu AÇIK,Будда-мод ВВІМК. +Buddha mode OFF,TXT_BUDDHAOFF,,,,Buddha mód VYP,Buddha-tilstand FRA,Buddhamodus AUS,Λειτουργία Βουδα ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Budha reĝimo MALŜALTITA,Modo Buda DESACTIVADO,,Buddhatila POIS PÄÄLTÄ,Mode Bouddha OFF,Način Buddhe ISKLJ.,Buddha Mód KI,Modalità Buddha DISATTIVATA,ブッダモード: オフ,부처 모드 끔,Boeddha-modus UIT,Buddha-modus AV,Tryb Buddy WYŁĄCZONY,Modo Buda DESATIVADO,,Modul Buddha DEZACTIVAT,Режим Будды ОТКЛЮЧЁН,Буда Мод ИСКЉУЧЕН,Buddha-läge avstängt,Buda modu KAPALI,Будда-мод ВИМК. +Ultimate Buddha Mode ON,TXT_BUDDHA2ON,,,,Super Buddha mód ZAP,Ultimate Buddha-tilstand TIL,Ultimativer Buddhamodus AN,Λειτουργία Απόλητου Βουδα ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Budha Reĝimo ŜALTITA,Modo Buda Supremo ACTIVADO,,Korkein buddhatila PÄÄLLÄ,Mode Bouddha Ultime ON,Ultimativni način Buddhe UKLJ.,Tökéletes Buddha Mód BE,Modalità Ultimo Buddha ATTIVATA,究極ブッダモード: オン,나무 아미타불 모드 켬,Ultieme Boeddha-modus AAN,Ultimativ Buddha-modus PÅ,Maksymalny Tryb Buddy WŁĄCZONY,Modo Buda supremo ATIVADO,,Modul Buddha Suprem ACTIVAT,Окончательный режим Будды ВКЛЮЧЁН,Ултимативни Буда Мод УКЉУЧЕН,Ultimat Buddha-läge på,Nihai Buda Modu AÇIK,Ультимативний Будда-мод ВВІМК. +Ultimate Buddha Mode OFF,TXT_BUDDHA2OFF,,,,Super Buddha mód VYP,Ultimate Buddha-tilstand FRA,Ultimativer Buddhamodus AUS,Λειτουργία Απόλητου Βουδα ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Pleja Budha Reĝimo MALŜALTITA,Modo Buda Supremo DESACTIVADO,,Korkein buddhatila POIS PÄÄLTÄ,Mode Bouddha Ultime OFF,Ultimativni način Buddhe ISKLJ.,Tökéletes Buddha Mód KI,Modalità Ultimo Buddha DISATTIVATA,究極ブッダモード: オフ,나무 아미타불 모드 끔,Ultieme Boeddha-modus UIT,Ultimativ Buddha-modus AV,Maksymalny Tryb Buddy WYŁĄCZONY,Modo Buda supremo DESATIVADO,,Modul Buddha Suprem DEZACTIVAT,Окончательный режим Будды ОТКЛЮЧЁН,Ултимативни Буда Мод ИСКЉУЧЕН,Ultimat Buddha-läge av,Nihai Buda Modu KAPALI,Ультимативний Будда-мод ВИМК. +Power on,TXT_CHEATPOWERON,,,,Energie ZAP,Evne TIL,Fähigkeit AN,Δύναμη ενεργοποιημένη,Povo ŝaltita,Poder activado,,Voima päällä,Pouvoir Activée,Energija UKLJ.,Energia BE,Potere ATTIVATO,パワー オン,파워 켬,Vermogen aan,Strøm PÅ,Zasilanie włączone,Poder ativado,,Putere activată,Сила активирована,Моћ УКЉУЧЕНА,Makt på,Güç açık,Сила активована +Power off,TXT_CHEATPOWEROFF,,,,Energie VYP,Evne FRA,Fähigkeit AUS,Δύναμη άπενεργοποιημένη,Povo malŝaltita,Poder desactivado,,Voima pois päältä,Pouvoir Désactivée,Energija ISKLJ.,Energia KI,Potere DISATTIVATO,パワー オフ,파워 끔,Vermogen uit,Slå AV,Zasilanie wyłączone,Poder desativado,,Putere dezactivată,Сила деактивирована,Моћ ИСКЉУЧЕНА,Makt av,Güç kapalı,Сила деактивована +Full health,TXT_CHEATHEALTH,,,,Plné zdraví,Fuldt helbred,Volle Lebensenergie,Ολόκληρη υγεία,Plena sano,Salud al máximo,,Täysi terveys,Pleine Santé,Puno zdravlje,Teljes életerő,Piena salute,ヘルス全回復,체력 완전 회복,Volledige gezondheid,Full helse,Pełne zdrowie,Saúde completa,Vida totalmente cheia,Sănătate completă,Полное здоровье,Здравље напуњено,Full hälsa,Tam sağlık,Повне здоров'я +All keys,TXT_CHEATKEYS,,,,Všechny klíče,Alle taster,Alle Schlüssel,Όλα τα κλειδία,Ĉiuj ŝlosiloj,Todas las llaves,,Kaikki avaimet,Toutes les Clés,Svi ključevi,Összes kulcs,Tutte le chiavi,キー全部,모든 열쇠,Alle sleutels,Alle taster,Wszystkie klucze,Todas as chaves,,Toate cheile,Все ключи,Сви кључеви,Alla tangenter,Tüm anahtarlar,Усі ключі +Sound debug on,TXT_CHEATSOUNDON,,,,Debug zvuku ZAP,Sound debug TIL,Sound Debug AN,Debug ήχου ενεργοποιημένη,Sono-sencimiga reĝimo ŝaltita,Depuración de sonido activada,,Äänen vianmääritystila päällä,Débogage du son activé.,Otklanjanje pogrešaka zvuka UKLJ.,Hang debug BE,Debug del suono attivato,サウンドデバッグ オン,효과음 디버그 켬,Geluid debug aan,Lyd feilsøking PÅ,Debugowanie dźwięku włączone,Depuração de som ativada,,Debug sunet activat,Отладка звука включена,Дебаговање звука УКЉУЧЕНО,Ljud felsökning på,Ses hata ayıklama açık,Налагодження звуку УВІМКНЕНО +Sound debug off,TXT_CHEATSOUNDOFF,,,,Debug zvuku VYP,Sound debug FRA,Sound Debug AUS,Debug ήχου άπενεργοποιημένη,Sono-sencimiga reĝimo malŝaltita,Depuración de sonido desactivada,,Äänen vianmääritystila pois päältä,Débogage du son désactivé.,Otklanjanje pogrešaka zvuka ISKLJ.,Hang debug KI,Debug del suono disattivato,サウンドデバッグ オフ,효과음 디버그 끔,Geluid debug uit,Lyd feilsøking AV,Debugowanie dźwięku wyłączone,Depuração de som desativada,,Debug sunet dezactivat,Отладка звука отключена,Дебаговање звука ИСКЉУЧЕНО,Ljud felsökning av,Ses hata ayıklama kapalı,Налагодження звуку ВИМКНЕНО +"Trying to cheat, eh? Now you die!",TXT_CHEATIDDQD,,,,"Pokoušíš se cheatovat, co? Teď zemřeš!","Prøver du at snyde, hva'? Nu dør du!","Versuchst zu betrügen, was? Nun stirbst du!","Προσπαθείς να εξαπατήσεις, ε? Τώρα πεθένεις!","Provas trompi, ĉu vi? Nun vi mortas! ","¿Tratando de hacer trampas, eh? ¡Muere!",,"Yrität huijata, vai? Nyt kuolet!","Tu essaie de tricher, hein? Maintenant tu meurs!","Pokušavaš varati, ha? Sada, umireš!","Csalni akarsz, mi? Most meghalsz!","Cerchi di barare, eh? Allora muori!",その名を唱えたな? 褒美に死をやろう!,치트 쓸려고? 그럼 죽어야지!,"Je wou valsspelen, hè? Nu ga je dood!",Prøver du å jukse? Nå dør du!,"Próbujesz oszukiwać, co? Teraz giń!","Tentando trapacear, né? Morra!","A fazer batota, é? Morre!","Încerci să trișezi, ei? Acum mori!","Жульничаешь, э? Так умри!","Покушаваш да вараш, ех? Сада умиреш!",Försöker du fuska? Nu dör du!,"Hile yapmaya çalışıyorsun, ha? Şimdi öleceksin!","Хех, чітериш? Тепер помри!" +Cheater - you don't deserve weapons,TXT_CHEATIDKFA,,,,Podvodníku - nezasloužíš si zbraně,Snyder - du fortjener ikke våben,Betrüger - du verdienst keine Waffen,Απατεόνα δέν σου αξήζουν όπλα,Trompanto - vi ne meritas armilojn,¡Trampos@[ao_esp]! No mereces tener armas,,Huijari - et ansaitse aseita,Tricheur- Tu ne mérite pas d'armes!,Varalico! Ne zaslužuješ oružja!,Csaló - nem érdemelsz fegyvert!,Imbroglione - non meriti armi,不届き者め、貴様が偉業を成すはずがない,사기꾼놈! 너는 무기를 가질 자격이 없어!,Valsspeler - je verdient geen wapens.,Juksemaker - du fortjener ikke våpen,Oszust - nie zasługujesz na bronie,Trapaceiros não merecem armas,Batoteir@[ao_ptb] - Não mereces armamento,Trișor - Nu meriți arme,Жулик — ты не заслуживаешь оружия,Варалице - ти не заслужујеш оружје,Fuskare - du förtjänar inte vapen.,"Hileci, silahları hak etmiyorsun.",Пройдисвіт - ти не заслужив зброї +Ticker on,TXT_CHEATTICKERON,,,,Počítadlo ZAP,Ticker TIL,Zähler AN,Χρονόμετρο ενεργοποιημένο,Nombrilo ŝaltita,Contador activado,,Laskuri päällä,Compteur allumé,Brojač UKLJ.,Számláló BE,Ticker attivato,ティッカー オン,프레임 속도 표시 켬,Ticker aan,Ticker PÅ,Wskaźnik włączony,Contador ativado,,Ticăitoare activată,Счётчик включён,Бројач укључен,Ticker på,Ticker açık,Лічильник Ввімк. +Ticker off,TXT_CHEATTICKEROFF,,,,Počítadlo VYP,Ticker FRA,Zähler AUS,Χρονόμετρο άπενεργοποιημένο,Nombrilo malŝaltita,Contador desactivado,,Laskuri pois päältä,Compteur éteint,Brojač ISKLJ.,Számláló KI,Ticker disattivato,ティッカー オフ,프레임 속도 표시 끔,Ticker uit,Ticker AV,Wskaźnik wyłączony,Contador desativado,,Ticăitoare dezactivată,Счётчик отключён,Бројач искључен,Ticker av,Ticker kapalı,Лічильник Вимк. +You got it,TXT_CHEATARTIFACTS3,,,,Máš to mít,Du fik det,Du hast es,Το πήρες,Vi akiris ĝin,Lo tienes,,Saamasi pitää,C'est à vous!,Možeš ti to!,Megkaptad,Concesso,それを渡そう。,얻었다,Je hebt het,Du har det,Udało ci się,Concedido,,Ai ce-ți trebuie,Вы получили это,Уреду,Du fick det,Tamamdır.,Ви отримали це +"You got the Midas Touch, baby",TXT_MIDASTOUCH,,,,"Máš Midasův dotek, zlato","Du har Midas Touch, baby",Dagobert Duck lässt grüßen!,"Έχεις το αγγιγμα το Μίδα, μωρό.","Vi akiris la Tuŝon de Midas, kara","Tienes el toque de Midas, muchach@[ao_esp]",,"Kulta, sinulla on Midaksen kosketus",,,"Minden arannyá válik amit megérintesz, öreg","Hai avuto il Tocco di Mida, baby",ミダス王の様だな、ベイビー,넌 미다스의 손을 얻었어 베이베!,"Je hebt de Midas Touch, schatje","Du har Midas Touch, baby","Zdobył@[irreg_3_pl] dotyk Midasa, skarbie","Você tem o Toque de Midas, baby","Tens o Toque de Midas, baby","Ai Atingerea lui Midas, dragule","Ты превращаешь всё в золото, детка!","Имаш златке руке, душо","Du har Midas Touch, baby","Sende Midas Dokunuşu var, bebeğim","Дар Мідаса у твоїх руках, золотце" +You got the stuff!,TXT_GOTSTUFF,,,,Dostal jsi věci!,Du har det hele!,Du hast den Kram erhalten,Πήρες τηατ πράγματα !,Vi akiris la aĵojn!,¡Tienes un montón de cosas!,,Sait kamppeet!,Voilà ton équipement!,,Megkaptad a cuccot!,Hai avuto il materiale!,スタッフを手に入れた!,무언가를 얻었다!,Je hebt het spul!,Du har greiene!,Zdobył@[irreg_3_pl] parę rzeczy!,Você ganhou muitas coisas!,ganhaste muitas coisas!,Ai tot ce-ți trebuie!,Получены предметы!,Покупили сте ствари!,Du har grejerna!,Mal sende!,Отримано предмети! +Freeze mode on,TXT_FREEZEON,,,,Režim zamrznutí ZAP,Frysetilstand TIL,Gefriermodus AN,Παγομένη λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Movhalta reĝimo ŝaltita,Modo suspendido activado,,Jäädytystila päällä,Temps arrêté.,,Fagyasztás BE,Modalità arresto del tempo attivata,フリーズモード オン,시간정지 켬,Bevriesmodus aan,Frysemodus PÅ,Tryb zamrożenia włączony,Modo congelado ativado,,Modul înghețat activat,Режим заморозки включён,Мод замрзавања УКЉУЧЕН,Frysningsläge på,Dondurma modu açık,Режим заморозки ВВІМКНЕНО +Freeze mode off,TXT_FREEZEOFF,,,,Režim zamrznutí VYP,Frysetilstand FRA,Gefriermodus AUS,Παγομένη λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Movhalta reĝimo malŝaltita,Modo suspendido desactivado,,Jäädytystila pois päältä,Le temps reprend son cours..,,Fagyasztás KI,Modalità arresto del tempo disattivata,フリーズモード オフ,시간정지 끔,Bevriesmodus uit,Frysemodus AV,Tryb zamrożenia wyłączony,Modo congelado desativado,,Modul înghețat dezactivat,Режим заморозки отключён,Мод замрзавања ИСКЉУЧЕН,Frysningsläge av,Dondurma modu kapalı,Режим заморозки ВИМКНЕНО +You feel strange...,TXT_STRANGE,,,,Cítíš se divně...,Du føler dig mærkelig...,Du fühlst dich merkwürdig...,Νιώθης περίεργα...,Vi sentas vin strange...,Te sientes extrañ@[ao_esp]...,,Sinulla on kummallinen olo...,Vous vous sentez mal à l'aise...,,Furán érzed magad...,Ti senti strano...,これは奇妙な感じだな...,뭔가 이상한 기분이...,Je voelt je vreemd...,Du føler deg rar...,Dziwnie się czujesz...,Você está com uma sensação estranha...,Tu sentes-te estranh@[ao_ptb].,Te simți ciudat...,Вы чувствуете себя странно...,Осећате се чудно...,Du känner dig konstig...,Garip hissediyorsun.,Ви почуваєте себе дивно... +You feel even stranger.,TXT_STRANGER,,,,Cítíš se ještě divněji...,Du føler dig endnu mere mærkelig.,Du fühlst dich noch merkwürdiger,Νιώθης ακόμα πιό περίεργα...,Vi sentas vin eĉ pli strange.,Te sientes aún más extrañ@[ao_esp],,Olosi on vieläkin kummempi.,Vous vous sentez très mal à l'aise...,,Még furábban érzed magad.,Ti senti ancora più strano.,これはかなり奇妙だ。,기분이 더더욱 이상해졌다.,Je voelt je nog vreemder.,Du føler deg enda merkeligere.,Czujesz się jeszcze dziwniej.,Você está com uma sensação mais estranha ainda.,Tu sentes-te ainda mais estranh@[ao_ptb].,Te simți și mai ciudat.,Вы чувствуете себя очень странно.,Осећате се врло чудно.,Du känner dig ännu konstigare.,Daha da garip hissediyorsun.,Ви почуваєте себе ще дивніше. +You feel like yourself again.,TXT_NOTSTRANGE,,,,Cítíš se opět jako ty.,Du føler dig som dig selv igen.,Du fühlst dich wieder wie du selbst,Νιώθης σάν τον εαύτο σου ξανά...,Vi denove sentas vin kiel vi mem.,Te sientes como tú mism@[ao_esp] otra vez.,,Tunnet olevasi jälleen oma itsesi.,Vous vous sentez mieux.,,Magadhoz tértél.,Ti senti di nuovo te stesso.,自分自身の様に感じている。,자기 자신처럼 생각하게 됐다.,Je voelt je weer als jezelf.,Du føler deg som deg selv igjen.,Znów czujesz się sobą.,Você se sente normal novamente.,Tu sentes-te normal novamente.,Ți-ai revenit în simțiri.,Вы снова чувствуете себя собой.,Поново се осећате као ви.,Du känner dig som dig själv igen.,Tekrar kendin gibi hissediyorsun.,Ви почуваєтесь собою. +Lead boots on,TXT_LEADBOOTSON,,,,Olověné boty ZAP,Blystøvler TIL,Bleistiefel AN,Μολυβδένιες μπότες ΕΝΕΡΓΟΠΟΙΗΜΈΝΕΣ,Botoj el plumbo ŝaltita,Botas de plomo activadas,,Lyijysaappaat päällä,Bottes en plomb ON,,Ólomcsizma BE,Stivali di Piombo ON,足枷 オン,납 부츠 켬,Loden laarzen aan,Blystøvler PÅ,Ołowiane buty włączone,Botas de chumbo ativadas,,Bocanci de plumb activați,Свинцовые сапоги надеты,Оловне чизме УКЉУЧЕНЕ,Blystövlar på,Kurşun çizmeler,Одягнено свинцеві чоботи +Lead boots off,TXT_LEADBOOTSOFF,,,,Olověné boty VYP,Blystøvler FRA,Bleistiefel AUS,Μολυβδένιες μπότες ΆΠΕΝΕΡΓΟΠΟΙΗΜΕΝΕΣ,Botoj el plumbo malŝaltita,Botas de plomo desactivadas,,Lyijysaappaat pois päältä,Bottes en plomb OFF,,Ólomcsizma KI,Stivali di Piombo OFF,足枷 オフ,납 부츠 끔,Loden laarzen uit,Blystøvler AV,Ołowiane buty wyłączone,Botas de chumbo desativadas,,Bocanci de plumb dezactivați,Свинцовые сапоги сняты,Оловне чизме ИСКЉУЧЕНЕ,Blykängor av,Kurşun çizmeler kapalı,Знято свинцеві чоботи +You feel lighter,TXT_LIGHTER,,,,Cítíš se lehčí,Du føler dig lettere,Du fühlst dich leichter,Νιώθης πιο ελαφρής,Vi sentas vin pli malpeza,Te sientes más liger@[ao_esp],,Tunnet olosi kevyemmäksi,Vous vous sentez très léger.,,Könnyűnek érzed magad,Ti senti più leggero,体が軽くなった,가벼운 느낌이 든다,Je voelt je lichter,Du føler deg lettere,Czujesz się lżejsz@[adj_pl],Você se sente mais leve,Tu sentes-te mais leve,Te simți mai ușor,Вы чувствуете лёгкость.,Осећате лакоћу.,Du känner dig lättare.,Daha hafif hissediyorsun,Ви побороли гравітацію +Gravity weighs you down,TXT_GRAVITY,,,,Gravitace tě táhne dolů,Tyngdekraften tynger dig ned,Schwerkraft belastet dich,Η βαρύτητα σε πιάνει.,Gravito pezigas vin,La gravedad te hace descender,,Painovoima painaa sinua alas,La gravité vous ramène au sol.,,A gravitáció lehúz téged,La gravità ti riporta a terra,重力に従った,중력이 당신을 붙잡았다,Zwaartekracht werkt op je...,Tyngdekraften tynger deg ned,Grawitacja znów cię przyciąga,A gravidade volta a funcionar normalmente,A gravidade voltou ao normal,Gravitația te trage în jos,Гравитация тянет вас вниз.,Гравитација Вас вуче надоле.,Tyngdkraften tynger ner dig,Yerçekimi seni ağırlaştırır,Гравітація знову притискає вас до землі +No Target ON,TXT_NOTARGET_ON,,,,Neútočící příšery ZAP,Ingen mål TIL,notarget AN,Αστόχευτη λειτουργία ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Neniu Celo ŜALTITA,No Objetivo ACTIVADO,,Hyökkäämättömyystila PÄÄLLÄ,Monstres aveugles et sourds ON,,Nem támadnak a szörnyek BE,Modalità Mostri ciechi e sordi ATTIVATA,ノーターゲット オン,적 표적 감지 켬,Geen doelwit AAN,No Target PÅ,Głuche i Ślepe Potwory WŁĄCZONE,Sem alvos ATIVADO,,Modul Inamici fără Țintă ACTIVAT,Незаметность ВКЛЮЧЕНА,Нема мете УКЉУЧЕНО,Inget mål på,Hedef Yok AÇIK,Невідчутність ввімкнено +No Target OFF,TXT_NOTARGET_OFF,,,,Neútočící příšery VYP,Ingen mål FRA,notarget AUS,Αστόχευτη λειτουργία ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Neniu Celo MALŜALTITA,No Objetivo DESACTIVADO,,Hyökkäämättömyystila POIS PÄÄLTÄ,Monstres aveugles et sourds OFF,,Nem támadnak a szörnyek KI,Modalità Mostri ciechi e sordi DISATTIVATA,ノーターゲット オフ,적 표적 감지 끔,Geen doelwit UIT,No Target AV,Głuche i Ślepe Potwory WYŁĄCZONE,Sem alvos DESATIVADO,,Modul Inamici fără Țintă DEZACTIVAT,Незаметность ОТКЛЮЧЕНА,Нема мете ИСКЉУЧЕНО,Inget mål av,Hedef Yok KAPALI,Невідчутність вимкнено +"""Quake with fear!""",TXT_ANUBIS_ON,,,,„Třeste se strachy!“,"""Skælv af frygt!""",„Zittere vor Angst!“,"""Τρέμε με φόβο!""","""Tremu pro timo!""","""¡Temblad de miedo!""","""¡Tiemblen de miedo!""","""Vapise pelosta!""",« Tremblez de terreur! »,,"""Reszkess, halandó!""","""Trema con terrore!""",恐れおののけ!,공포에 떨어라!,„Beving van angst!“,"""Skjelv av frykt!""","""Trzęś się ze strachu""","""Trema de medo!""","""Trema com medo!""","""Tremură de Frică!""",«Дрожите от страха!»,„Дрхтите у страху!“,"""Skräck skakar av rädsla!""","""Korkudan titre!""","""Трясись зі страху!""" +No more Ogre Armor,TXT_ANUBIS_OFF,,,,Už žádné zlobří brnění,Ikke mere troldepanser,Keine Ogerrüstung mehr,Καθόλου δρακοντική πανοπλία πια,Ne plu Ogrokiraso,No más armadura de Ogro,,Ei enää örkkipanssaria,Plus d'armure d'ogre,,Ogre pajzs lejárt,Niente più armatura Ogre,オーガアーマーはもう嫌,오거 갑옷은 이제 없다.,Geen Ogre Pantser meer,Ikke mer Ogre Armor,Nigdy więcej Pancerza Ogrów,Chega de Armadura de Ogro,Chega de Armadura de Ogre,Gata cu Armura de Căpcăun,Броня огра снята,Нема више бауков оклоп,Inget mer träsktorns rustning,Artık Ogre Zırhı yok,Броню огра знято +chasecam ON,TXT_CHASECAM_ON,,,,Pohled z třetí osoby ZAP,chasecam TIL,chasecam AN,Κάμερα τρίτου πρωσώπου ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Ĉaskamerao ŜALTITA,Cámara de seguimiento ACTIVADA,,Seurantakamera PÄÄLLÄ,,,követő kamera BE,Modalità camera da inseguimento ATTIVATA,チェイスカメラ オン,3인칭 카메라 켬,Chasecam AAN,chasecam PÅ,kamera śledzenia WŁĄCZONA,Câmera em terceira pessoa ATIVADA,Câmara em Terceira Pessoa ATIVADA,Perspectivă la Persoana a 3-a ACTIVATĂ,Вид от третьего лица ВКЛЮЧЁН,Чејс-кам УКЉУЧЕН,chasecam på,Chasecam AÇIK,Камера від 3-го лиця активована +chasecam OFF,TXT_CHASECAM_OFF,,,,Pohled z třetí osoby VYP,chasecam FRA,chasecam AUS,Κάμερα τρίτου πρωσώπου ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Ĉaskamerao MALŜALTITA,Cámara de seguimiento DESACTIVADA,,Seurantakamera POIS PÄÄLTÄ,,,követő kamera KI,Modalità camera da inseguimento DISATTIVATA,チェイスカメラ オフ,3인칭 카메라 끔,Chasecam UIT,chasecam AV,kamera śledzenia WYŁĄCZONA,Câmera em terceira pessoa DESATIVADA,Câmara em Terceira Pessoa DESATIVADA,Perspectivă la Persoana a 3-a DEZACTIVATĂ,Вид от третьего лица ОТКЛЮЧЁН,Чејс-кам ИСКЉУЧЕН,chasecam av,Chasecam KAPALI,Камера від 3-го лиця деактивована +1 baddie killed,TXT_BADDIE_KILLED,,,,1 zloun zabit,1 baddie dræbt,1 Bösewicht getötet,Ενας κακός πέθανε,1 malbonulo mortigita,Un malote aniquilado,,1 pahis tapettu,1 enemi tué,,1 rosszfiú kinyírva,Ucciso 1 maligno,1 体 殺した,1 명의 나쁜놈이 사살됨.,1 slechterik gedood,1 skurk drept,1 zabity przeciwnik,1 inimigo morto,,1 slab ucis,1 плохиш убит,Један зликовац убијен,1 skurk dödad,1 kötü öldürüldü,1 поганець вмер +%d baddies killed,TXT_BADDIES_KILLED,,,,%d zlounů zabito,%d baddies dræbt,%d Bösewichte getötet,%d τον κακόν πέθαναν,%d malbonuloj mortigitaj,%d malotes aniquilados,,%d pahista tapettu,%d enemis tués,,%d rosszfiú kinyírva,Uccisi %d maligni,%d 体 殺した,%d 명의 나쁜놈들이 사살됨.,%d slechteriken gedood,%d skurker drept,%d zabitych przeciwników,%d inimigos mortos,,%d slabi uciși,Плохишей убито: %d,%d зликовца убијено,%d skurkar dödade,%d kötüler öldürüldü,Поганців вмерло: %d +1 monster killed,TXT_MONSTER_KILLED,,,,1 příšera zabita,1 monster dræbt,1 Monster getötet,Ένα τέρας πέθανε,1 monstro mortigita,Un monstruo aniquilado,,1 hirviö tapettu,1 monstre tué,,1 szörny kinyírva,Ucciso 1 mostro,1 匹 殺した,1 마리의 몬스터가 사살됨.,1 monster gedood,1 monster drept,1 zabity potwór,1 monstro morto,,1 monstru ucis,1 монстр убит,Једно чудовиште убијено,1 monster dödat,1 canavar öldürüldü,1 монстра убито +%d monsters killed,TXT_MONSTERS_KILLED,,,,%d příšer zabito,%d monster dræbt,%d Monster getötet,%d τον τεράτων πέθαναν,%d monstroj mortigitaj,%d monstruos aniquilados,,%d hirviötä tapettu,%d monstres tués,,%d szörny kinyírva,Uccisi %d mostri,%d 匹 殺した,%d 마리의 몬스터들이 사살됨.,%d monsters gedood,%d monstre drept,%d zabitych potworów,%d monstros mortos,,%d monștri uciși,Убито монстров: %d,%d чудовишта убијено,%d monster dödade,öldürülen %d canavar,Монстрів вбито: %d Unable to resurrect. Player is no longer connected to its body.,TXT_NO_RESURRECT,,,,"Oživení není možno, hráč už není spojen se svým tělem.",Kan ikke genoplive. Spilleren er ikke længere forbundet med sin krop.,Kann nicht wiederbeleben. Der Spieler ist nicht mehr mit seinem Körper verbunden.,"Ανάσταση αδύνατη, ο παίχτης δεν είναι πια στο σώμα @[pro4_gr]","Nerevivigebla. La ludanto ne plu -estas konektita al sia korpo.",Imposible de resucitar. El jugador ya no está conectado a su cuerpo.,,Ei mahdollista herätä henkiin. Pelaaja ei ole enää yhteydessä ruumiiseensa.,Impossible de ressuciter. Le joueur n'est plus connecté à son corps.,Nem sikerült a felélesztés. A játékos nincs összekötve a testtel.,Impossibile resuscitarsi. Il giocatore non è più connesso al suo corpo.,復活できない。プレイヤーはこの体に宿っていない。,부활할 수 없습니다. 플레이어는 더 이상 육체와 연결돼있지 않습니다.,Kan niet reanimeren. De speler is niet langer verbonden met zijn lichaam.,Kan ikke gjenoppstå. Spilleren er ikke lenger koblet til kroppen sin.,Nie można wskrzesić. Gracz nie jest już połączony z resztą swojego ciała.,"Impossível ressuscitar. O jogador não +estas konektita al sia korpo.",Imposible de resucitar. El jugador ya no está conectado a su cuerpo.,,Ei mahdollista herätä henkiin. Pelaaja ei ole enää yhteydessä ruumiiseensa.,Impossible de ressuciter. Le joueur n'est plus connecté à son corps.,,Nem sikerült a felélesztés. A játékos nincs összekötve a testtel.,Impossibile resuscitarsi. Il giocatore non è più connesso al suo corpo.,復活できない。プレイヤーはこの体に宿っていない。,부활할 수 없습니다. 플레이어는 더 이상 육체와 연결돼있지 않습니다.,Kan niet reanimeren. De speler is niet langer verbonden met zijn lichaam.,Kan ikke gjenoppstå. Spilleren er ikke lenger koblet til kroppen sin.,Nie można wskrzesić. Gracz nie jest już połączony z resztą swojego ciała.,"Impossível ressuscitar. O jogador não está mais ligado ao próprio corpo.",,Imposibil de înviat. Jucătorul nu mai e conectat la cadavru.,Воскрешение невозможно. Игрок больше не соединён с трупом.,Немогуће оживети. Играч није више повезан са својим телом.,Det går inte att återuppliva. Spelaren är inte längre ansluten till sin kropp.,Diriltilemiyor. Oyuncu artık bedenine bağlı değil.,Воскресіння неможливе. Гравець більше не з'єднаний з тілом. -All Artifacts!,TXT_ALL_ARTIFACTS,,,All Artefacts!,Všechny artefakty!,Alle artefakter!,Alle Artefakte!,Όλα τα τεχνουργίματα!,Ĉiuj Artefaktoj!,¡Todos los artefactos!,,Kaikki artefaktit!,Tous les artéfacts!,Összes értéktárgy!,Tutti gli Artefatti!,全アーティファクト!,모든 유물들!,Alle artefacten!,Alle artefakter!,Wszystkie Artefakty!,Todos os artefatos!,,Toate Artefactele!,Все артефакты!,Сви артифакти!,Alla artefakter!,Tüm eserler!,Усі артефакти! -What do you want to kill outside of a game?,TXT_WHAT_KILL,,,,"Co chceš zabít, když nejsi ve hře?",Hvad vil du dræbe uden for et spil?,Was willst du eigentlich außerhalb eines Spiels töten?,Τί θέλεις να σκοτώσεις έξω απο ένα παιχνίδι ?,Kion vi volas mortigi ekster ludo?,¿Qué intentas matar fuera de una partida?,,Mitä haluat tappaa pelin ulkopuolella?,Que voulez-vous tuer en dehors d'une partie?,Mit tudnál megölni játékon kívül?,Cosa vorresti uccidere fuori dal gioco?,ゲーム外で何を殺す気だ?,게임 밖에서 무엇을 죽이고 싶습니까?,Wat wil je buiten een spel om doden?,Hva vil du drepe utenfor et spill?,Co ty chcesz zabić poza grą?,O que você gostaria de matar fora de um jogo?,,Ce vrei să ucizi în afara unui joc?,Что вы хотите убить вне игры?,Шта желите да убијете ван игре?,Vad vill du döda utanför ett spel?,Oyun dışında ne öldürmek istiyorsun?,"Що, хочеш вбивати в реальності?" -Frozen player properties turned off,TXT_NOT_FROZEN,,,,Vlastnosti držící hráče na místě vypnuty,Frysningstilstand er slået fra.,Gefrier-Modus abgeschaltet.,Η ιδιότητες ενος παγομένου παίχτη απενεργοποίθηκαν,Atributoj de movhaltitaj ludantoj malŝaltitaj,Propiedades de jugador congelado desactivadas,,Jäätyneen pelaajan ominaisuudet kytketty pois päältä,Propriété gelée du joueur annulée.,Fagyasztott játékos tulajdonságai kikapcsolva,Proprietà del giocatore ghiacciato disattivate,凍ったプレイヤーのプロパティを無効化,플레이어 정지 속성이 꺼졌습니다.,Eigenschappen van de bevroren speler uitgeschakeld,Frosne spilleregenskaper slått av,Właściwości zamrożonego gracza wyłączone,Propriedades de jogador congelado desativadas,,Proprietăți jucători înghețați DEZACTIVATE,Свойства замороженного игрока отключены,Смрзнути играчи искључени,Frysta spelaregenskaper avstängda,Dondurulmuş oyuncu özellikleri kapatıldı,Властивості замороженого гравця вимкнено -,,Automap,,,,,,,,,,,,,,,,,,,,,,,,,, -Follow Mode OFF,AMSTR_FOLLOWOFF,,,,Režim sledování VYP,Følg-tilstand TIL,Folgen-Modus AUS,Ακολούθηση ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Sekvigreĝimo MALŜALTITA,Modo de seguimiento DESACTIVADO,,Seuraamistila POIS PÄÄLTÄ,Suivi du Joueur OFF,Követés mód KI,Mappa scorribile ATTIVATA,追従モード: オフ,추적 모드 끔,Volgmodus UIT,Følgemodus AV,Tryb śledzenia WYŁĄCZONY,Modo de seguimento DESATIVADO,,Mod Urmărire DEZACTIVAT,Привязка к игроку ОТКЛЮЧЕНА,Праћење ИСКЉУЧЕНО,Följningsläget av,Takip Modu KAPALI,Прив'язка до гравца ВВІМК. -Follow Mode ON,AMSTR_FOLLOWON,,,,Režim sledování ZAP,Følg-tilstand FRA,Folgen-Modus AN,Ακολούθηση ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Sekvigreĝimo ŜALTITA,Modo de seguimiento ACTIVADO,,Seuraamistila PÄÄLLÄ,Suivi du Joueur ON,Követés mód BE,Mappa scorribile DISATTIVATA,追従モード: オン,추적 모드 켬,Volgmodus AAN,Følgemodus PÅ,Tryb śledzenia WŁĄCZONY,Modo de seguimento ATIVADO,,Mod Urmărire ACTIVAT,Привязка к игроку ВКЛЮЧЕНА,Праћење УКЉУЧЕНО,Följningsläget på,Takip Modu AÇIK,Прив'язка до гравца ВИМК. -Grid ON,AMSTR_GRIDON,,,,Mřížka ZAP,Raster TIL,Gitter AN,Πλέχμα ΕΝΕΡΓΟΠΟΙΜΈΝΟ,Krado ŜALTITA,Cuadrícula ACTIVADA,,Ruudukko PÄÄLLÄ,Quadrillage ON,Rács BE,Griglia ATTIVATA,グリッド: オン,격자 켬,Raster AAN,Rutenett PÅ,Siatka WŁĄCZONA,Grade ATIVADA,Grelha ATIVADA,Grilă ACTIVATĂ,Сетка ВКЛЮЧЕНА,Мрежа УКЉУЧЕНА,Rutnät på,Izgara AÇIK,Сітка ВВІМК. -Grid OFF,AMSTR_GRIDOFF,,,,Mrizka VYP,Raster FRA,Gitter AUS,Πλέχμα ΆΠΕΝΕΡΓΟΠΟΙΜΈΝΟ,Krado MALŜALTITA,Cuadrícula DESACTIVADA,,Ruudukko POIS PÄÄLTÄ,Quadrillage OFF,Rács KI,Griglia DISATTIVATA,グリッド: オフ,격자 끔,Raster UIT,Rutenett AV,Siatka WYŁĄCZONA,Grade DESATIVADA,Grelha DESATIVADA,Grilă DEZACTIVATĂ,Сетка ОТКЛЮЧЕНА,Мрежа ИСКЉУЧЕНА,Rutnät av,Izgara KAPALI,Сітка ВИМК. -Texture Mode ON,AMSTR_TEXON,,,,Texturovaný režim ZAP,Teksturtilstand TIL,Texturmodus AN,Γραφικός χάρτης ΕΝΕΡΓΟΠΟΙΜΈΝΟΣ,Tekstura Reĝimo ŜALTITA,Modo de texturas ACTIVADO,,Pintakuviointitila PÄÄLLÄ,Mode Texturé ON,Textúrák mód BE,Modalità Texture ATTIVATA,テクスチャーモード: オン,텍스쳐 모드 켬,Textuurmodus AAN,Teksturmodus PÅ,Tekstury WŁĄCZONE,Modo de textura ATIVADO,,Mod Texturat ACTIVAT,Текстурный режим ВКЛЮЧЁН,Текстуре УКЉУЧЕНЕ,Texturläge på,Doku Modu AÇIK,Текстурний режим ВВІМК. -Texture Mode OFF,AMSTR_TEXOFF,,,,Texturovaný režim VYP,Teksturtilstand FRA,Texturmodus AUS,Γραφικός χάρτης ΑΠΕΝΕΡΓΟΠΟΙΜΈΝΟΣ,Tekstura Reĝimo MALŜALTITA,Modo de texturas DESACTIVADO,,Pintakuviointitila POIS PÄÄLTÄ,Mode Texturé OFF,Textúrák mód KI,Modalità Texture DISATTIVATA,テクスチャーモード: オフ,텍스쳐 모드 끔,Textuurmodus UIT,Teksturmodus AV,Tekstury WYŁĄCZONE,Modo de textura DESATIVADO,,Mod Netexturat DEZACTIVAT,Текстурный режим ОТКЛЮЧЁН,Текстуре ИСКЉУЧЕНЕ,Texturläge av,Doku Modu KAPALI,Текстурний режим ВИМК. -Marked Spot,AMSTR_MARKEDSPOT,,,,Značka,Markeret placering,Punkt markiert,Μαρκαρησμένη τοποθεσεία,Loko Markita,Punto marcado,,Merkitty paikka,Repère marqué.,Megjelölt hely,Posizione segnata,目標をマークした,지점 추가,Gemarkeerde plek,Markert punkt,Oznaczono miejsce,Posição marcada,,Loc Marcat,Отметка,Означено место,Markerad punkt,İşaretli Nokta,Позначка -All Marks Cleared,AMSTR_MARKSCLEARED,,,,Všechny značky smazány,Alle markeringer slettes,Alle Markierungen gelöscht,Όλες η μαρκαρησμένη τοποθεσείες είναι καθαρησμένες,Ĉiuj Markoj Forigitaj,Todas las marcas eliminadas,,Kaikki merkit pyyhitty,Repères éffacés.,Összes jelölés törölve,Cancellati tutti i segni,全目標を解除した,모든 지점 지워짐,Alle markingen gewist,Alle merker fjernet,Wszystkie miejsca wyczyszczone,Todas as marcas removidas,,Toate Marcările Șterse,Отметки очищены,Ознаке избрисане,Alla markeringar raderas,Tüm İşaretler Temizlendi,Усі позначки стерто -,,Multiplayer,,,,,,,,,,,,,,,,,,,,,,,,,, -Fraglimit hit.,TXT_FRAGLIMIT,,,,Fraglimit dosáhnut.,Fraggrænse nået,Fraglimit erreicht,Το όριο κοματιασμόν έχει φτάσει.,Ludmurdo-limo trafita.,Límite de bajas alcanzado.,,Frägiraja saavutettu.,Limite de frags atteinte.,Fraghatár elérve.,Fraglimit raggiunto.,フラグリミット!,킬제한에 도달했습니다.,Fraglimiet bereikt.,Fraglimit treff.,Limit fragów wyczerpany.,Limite de frags atingido.,,Limita de ucideri atinsă.,Достигнут лимит фрагов.,Фраг-лимит достигнут.,Fragbegränsning träffad.,Frag limiti vuruldu.,Досягнуто ліміт фрагів. -Timelimit hit.,TXT_TIMELIMIT,,,,Časový limit dosáhnut.,Tidsgrænse nået,Zeitlimit erreicht,Το χρονικό όριο έχει φτάσει.,Tempolimo trafita.,Límite de tiempo alcanzado.,,Aikaraja saavutettu.,Limite de temps atteinte.,Időhatár elérve.,Timelimit raggiunto.,ゲームセット!,시간제한에 도달했습니다.,Tijdslimiet bereikt.,Tidsbegrensningen er nådd.,Limit czasowy wyczerpany.,Limite de tempo atingido.,,Limita de timp atinsă.,Достигнут лимит времени.,Временско ограничење достигнуто.,Tidsbegränsning träffad.,Zaman limiti vuruldu.,Досягнуто ліміт часу. -%o was looking good until %g killed %hself!,SPREEKILLSELF,,,,%o vypadal@[ao_cs] dobře dokud se @[self_cs] nezabil@[ao_cs]!,"%o så godt ud, indtil @[pro_dk] dræbte sig selv!","%o sah gut aus, bis das Unglück geschah.",@[art_gr] %o πήγενε μια χαρά μέχρι που αυτοκτόνησε!,"%o estis faranta bone, ĝis @[pro_eo] mortigis sin!",¡%o se veía bien hasta que %g se mató a si mism@[ao_esp]!,,"%o oli liekeissä, kunnes meni tappamaan itsensä!",%o était en pleine folie meurtrière avant qu' %g ne se bute!,%o jól nézett ki még mielőtt megölte magát!,%o stava andando bene finchè non si è ucciso da solo!,%o は自滅するまでなかなか良かったぞ!,%o 이(가) 잘 나가려던 참에 자살했습니다!,%o zag er goed uit tot %g zelfmoord pleegde!,%o så bra ut helt til %g tok livet av seg!,%o wyglądał dobrze dopóki się nie zabił@[ao_pl],%o estava indo bem até se matar!,,%o arăta atât de bine până să se sinucidă,"%o неплохо выглядел@[ao_rus], пока не покончил@[ao_rus] с собой!",%o је изгледа@[ao_1_sr] добро док није уби@[ao_1_sr] сам@[ao_3_sr] себе!,%o såg bra ut tills han tog livet av sig!,%o kendini öldürene kadar iyi görünüyordu!,"%o вигляда@[adj_1_ua] добре, поки не вби@[adj_1_ua] себе!" -%o's killing spree was ended by %k,SPREEOVER,,,,%o@[psn1_cs] vraždící řádění ukončil hráč %k.,%os drabstog blev afsluttet af %k,%os Amoklauf wurde von %k beendet.,Ο/Η %k σταμάτησε την ανθρωποκτονία %h %o.,La mortigado de %o estis finita de %k,%k acabó con la racha de muerte de %o,,%k päätti pelaajan %o tapposarjan,La folie meurtrière de %o à été terminée par %k!,%o ámokfutását %k megállította.,La sequela di frag di %o è stata terminata da %k,%k が %o の快進撃を断ち切った!,%k 이(가) %o 의 연속 킬을 처단했습니다,%o's moordpartij werd beëindigd door %k.,%o's drapsturné ble avsluttet av %k.,Seria zabójstw %o zakończona przez %k,A matança de %o foi interrompida por %k,,Pofta de ucis a lui %o a fost pusă în cui de către %k,Игрок %k прервал череду убийств игрока %o,Серијско убијање играча %o је завршио играч %k,%os dödskampanj avslutades av %k.,%o onu öldürene kadar %k iyi görünüyordu.,%k закінчи@[adj_1_ua] бійню %o -%k is on a killing spree!,SPREE5,,,,%k začal@[ao_cs] řádit!,%k er i gang med en mordserie!,%k läuft Amok!,Ο/Η %k άρχισε μια ανθρωποκτονία!,%k estas sur mortigado!,¡%k está atacando de lo lindo!,,%k on sarjamurhaaja!,%k est en folie meurtrière!,%o egy Ámokfutó!,%k è preda di un momento omicida!,%k が連続キル!,%k 연속 킬!,%k is op een moordpartij!,%k er på drapsturné!,%k popełnia serię morderstw!,%k está cometendo uma matança!,,%k are chef de ucis!,Игрок %k совершил череду убийств!,%k је серијални убица!,%k är på en mordresa!,%k bir ölüm çılgınlığında!,%k смакує різанину! -%k is on a rampage!,SPREE10,,,,%k zuří!,%k er på et amokløb!,%k tobt sich aus!,Ο/Η %k είναι σε ξέσπασμα!,%k estas sur furiozado!,¡%k está en medio de una aniquilación!,,%k riehuu valtoimenaan!,%k est en plein massacre!,%o Tombol!,%k sta facendo un massacro!,%k が大暴れだ!,%k 이(가) 미쳐 날뛰고 있습니다!,%k heeft razernij!,%k går amok!,%k doznaje szału!,%k está massacrando!,,%k e înverșunat!,Игрок %k в неистовстве!,%k дивља!,%k är på en våldsam resa!,%k kudurmuş durumda!,%k лютує! -%k is dominating!,SPREE15,,,,%k dominuje!,%k er dominerende!,%k dominiert!,Ο/Η %k κατακτεί.,%k estas dominanta!,¡%k está dominando!,,%k hallitsee suvereenisti!,%k domine!,%o Uralkodik!,%k sta dominando tutti!,%k が圧倒している!,%k 이(가) 우세하고 있습니다!,%k domineert!,%k dominerer!,%k dominuje!,%k está dominando!,,%k domină!,Игрок %k господствует!,%k доминира!,%k dominerar!,%k hükmediyor!,%k домінує! -%k is unstoppable!,SPREE20,,,,%k je nezastaviteln@[adj_cs]!,%k er ustoppelig!,%k kann nicht gestoppt werden!,Ο/Η %k είναι ασταμάτητος/η!,%k estas nehaltigebla!,¡%k es imparable!,,%k on pysäyttämätön!,%k est inarrétable!,%o Megállíthatatlan!,%k è inarrestabile!,%k が止まらない!,%k 을(를) 막을 수없습니다!,%k is niet te stoppen!,%k er ustoppelig!,%k jest niepowstrzymany!,%k é implacável!,,%k e de neoprit!,Игрок %k неостановим!,Играч %k је незаустављив!,%k är ostoppbar!,%k durdurulamaz!,%k неспинний! -%k is Godlike!,SPREE25,,,,%k je boží!,%k er som en gud!,%k ist wie Gott!,Ο/Η %k είναι σαν θεός/θεά!,%k estas Dia!,¡%k es una máquina de matar!,,%k on kuin jumala!,%k est un dieu!,%o Istencsászár!,%k è un dio!,%k が神の様だ!,%k 은(는) 신적입니다! ,%k is Goddelijk!,%k er guddommelig!,%k jest Bogem!,%k é um deus da matança!,,%k e precum un Zeu!,Игрок %k богоподобен!,Играч %k је божанствен!,%k är som en gud!,%k tanrı gibi!,%k божественний! -Double kill!,MULTI2,,,,Dvoj-zabití!,Dobbelt drab!,Doppel-Kill!,Δυπλός Θάνατος!,Duobla mortigo!,¡Dos menos!,,Tuplatappo!,,Dupla gyilok!,Doppia uccisione!,ダブルキル!,더블 킬!,Dubbele kill!,Dobbeltdrap!,Podwójne zabójstwo!,Morte dupla!,,Dublă ucidere!,Двойное убийство!,Дупло убиство!,Dubbeldödning!,Çifte öldürme!,Подвійне вбивство! -Multi kill!,MULTI3,,,,Multi-zabití!,Multi-drab!,Multi-Kill!,Πολυθάνατος!,Pluraj mortigoj!,¡Multidestrucción!,,Multitappo!,,Multi gyilok!,Tripla uccisione!,マルチキル!,멀티 킬!,,Multidrap!,Multi-zabójstwo!,Morte tripla!,,Ucidere multiplă!,Массовое убийство!,Вишеструко убиство!,Flera dödar!,Çoklu öldürme!,Массове вбивство! -Ultra kill!,MULTI4,,,,Ultra-zabití!,Ultra-drab!,Ultra-Kill!,Υπερθάνατος!,Ekstremaj mortigoj!,¡¡HIPERDESTRUCCIÓN!!,,Ultratappo!,,Ultra gyilok!,Ultra uccisione!,ウルトラキル!,울트라 킬!,,Ultra drep!,Ultra-zabójstwo!,Ultra matança!,,Ultra ucidere!,Ультра-убийство!,Ултра убиство!,Ultra-död!,Ultra öldürme!,Безмежне вбивство! -Monster kill!,MULTI5,,,,Monstr-zabití!,Monster-drab!,Monster-Kill!,Τερατόδες σκοτωμός!,Monstraj mortigoj!,¡¡¡S.U.P.E.R.D.E.S.T.R.U.C.C.I.Ó.N!!!,,Hirviömäinen tappo!,,Szörnyű gyilkolás!,Uccisione Mostruosa!,モンスターキル!,몬스터 킬!,,Monster drep!,Potworne zabójstwo!,Matança monstro!,Matança monstruosa!,Ucidere monstruoasă!,Чудовищное убийство!,Монструозно убиство!,Monsterdöd!,Canavar öldürme!,Монструозне вбивство! -,,Scoreboard,,,,,,,,,,,,,,,,,,,,,,,,,, -Bonus,SCORE_BONUS,,,,,,,,Bonuso,Bonificaciones,,Lisäedut,,Bónusz,,ボーナス,보너스,Bonus,,Bonusy,Bônus,,,Бонус,Бонус,,,Бонус -Color,SCORE_COLOR,,,Colour,Barva,Farve,Farbe,Χρώμα,Koloro,,,Väri,Couleur,Szín,Colore ,色,색상,Kleur,Farge,Kolor,Cor,,Culoare,Цвет,Боја,Färg,Renk,Колір -Secret,SCORE_SECRET,,,,Skrýše,Hemmeligt,Geheimnis,Μυστικό,Sekreto,Secreto,,Salat,,Titok,Segreto,シークレット,밝혀낸 비밀,Geheim,Hemmelig,Sekret,Segredo,,,Тайники,Тајна,Hemlig,Sır,Схованки -Name,SCORE_NAME,,,,Jméno,Navn,Name,Όνομα,Nomo,Nombre,,Nimi,Nom,Név,Nome,名前,이름,Naam,Navn,Nazwa,Nome,,Nume,Игрок,Име,Namn,İsim,Гравець -Delay (ms),SCORE_DELAY,,,,Zpoždění (ms),Forsinkelse (ms),Verzögerung (ms),Kαθυστέρηση (μδ),Prokrasto (ms),Retraso (ms),,Viive (ms),Délai (ms),Késleltetés (ms),Ritardo (ms) ,ping,핑 (밀리초당),Vertraging (ms),Forsinkelse (ms),Opóźnienie (ms),Atraso (ms),,Întârziere (ms),Задержка (мс),Кашњење (мс),Fördröjning (ms),Gecikme (ms),Затримка (мс) -Frags,SCORE_FRAGS,,,,Fragy,,,Κοματιασμοί,Ludmurdoj,Bajas,,Frägit,,Frag-ek,,フラグ,플레이어 킬수,,,Fragi,,,Victime,Фраги,Фрагови,,,Фраги -Deaths,SCORE_DEATHS,,,,Smrti,Dødsfald,Tode,Θάνατοι,Mortoj,Muertes,,Kuolemat,Morts,Halálok,Morti,デス,사망한 횟수,Sterfgevallen,Dødsfall,Śmierci,Mortes,,Decese,Смерти,Смрти,Dödsfall,Ölümler,Смерті -Other,SCORE_OTHER,,,,Ostatní,Andre,Andere,,Alia,Demás,,Muu,Autre,Egyéb,Altro,その他,,Anders,Andre,Inne,Outro,,Altele,Прочее,,Andra,Diğer,Інше -Missed,SCORE_MISSED,,,,Minuto,Forpasset,Verfehlt,Ξεχάστηκαν,Mankita,Pérdidas,,Hudit,Ratés,Kihagyva,Mancati ,ミス,놓친 수,Gemist,Ubesvarte,Ominięte,Perdido,,Ratate,Пропущено,Пропуштено,Missade,Cevapsız,Пропущено -Total,SCORE_TOTAL,,,,Celkem,,Gesamt,Συνολικό,Tuto,,,Yhteensä,,Összesen,Totale,合計,총점,Totaal,Totalt,Totalne,,,,Всего,Укупно,Totalt,Toplam,Разом -Level Time,SCORE_LVLTIME,,,,Čas v levelu,Niveau Tid,Levelzeit,Χρόνος Πίστας,Daŭro de Nivelo,Tiempo de nivel,,Tasoaika,Temps niveau,Pályaidő,Tempo Livello ,時間,레벨 시간,Leveltijd,Nivå Tid,Czas,Tempo de fase,Tempo do Nível,Timp Petrecut,Время уровня,Време нивоа,Nivå Tid,Seviye Zaman,Час рівня -,,Level Summary,,,,,,,,,,,,,,,,,,,,,,,,,, -Kills,TXT_IMKILLS,,,,Zabití,Dræber,,Σκοτομοί,Mortigoj,Muertes,,Tapot,Morts,Áldozatok,Uccisioni,キル,킬수,Dood,Drepte,Zabici,Vítimas,,Ucideri,Убийств,Непријатељи,Dödade,Öldürür,Вороги -Items,TXT_IMITEMS,,,,Předměty,Genstande,Gegenstände,Αντεικείμενα,Objektoj,Objetos,,Esineet,Objets,Tárgyak,Oggetti,アイテム,획득한 아이템,,Gjenstander,Przedmioty,Itens,,Obiecte,Предметов,Ставке,Föremål,Eşyalar,Предмети -Secrets,TXT_IMSECRETS,,,,Skrýše,Hemmeligheder,Geheimnisse,Μυστικά,Sekretoj,Secretos,,Salat,,Titkok,Segreti,シークレット,밝혀낸 비밀,Geheimen,Hemmeligheter,Sekrety,Segredos,,Secrete,Тайников,Тајне,Hemligheter,Sırlar,Схованки -Time,TXT_IMTIME,,,,Čas,Tid,Zeit,Χρόνος,Daŭro,Tiempo,,Aika,Temps,Idő,Tempo,経過時間,소모한 시간,Tijd,Tid,Czas,Tempo,,Timp,Время,Време,Tid,Zaman,Час -Par,TXT_IMPAR,,,,,,,Μέσος Όρος,Alparo,,,,,Átlag,Media,最速時間,기준 시간,,,,Média,,Record,Рекорд,Рекорд,,,Рекорд -Finished,WI_FINISHED,,,,Dokončeno,Færdig,Abgeschlossen,Ολοκληρώθηκε,Finita,Completado,,Suoritettu,Terminé,Teljesítve,Finito,攻略,완료,Klaar,Ferdig,Ukończono,Finalizado,,Terminat,Уровень завершён,Ниво завршен,Avslutad,Bitti,Завершено -Entering,WI_ENTERING,,,,Vstupuješ do,Indtastning af,Betrete,Είσοδος,Enirante,Entrando a:,,Seuraava kohde,Niveau Suivant,Következik,Prossimo livello,突入開始,입장,Volgende,Går inn,Wchodzisz do:,Próxima fase,Próximo nível,Începe,Переход,Следећи ниво,Ingång till,Giriş,Заходимо -Now entering:,WI_ENTERING,,heretic hexen,,Nyní vstupuješ do:,Indtastning af:,Betrete:,Τώρα εισέρχεσε στο:,Nun enirante:,Ahora entrando a:,,Seuraava kohde:,Vous entrez dans:,Következik:,Entrando adesso in:,突入中:,입장합니다:,Volgende:,Går nå inn:,Teraz wchodzisz do:,Entrando em:,A entrar em:,Acum începe:,Переход на:,Следећи ниво:,Ingång till,Şimdi giriyoruz:,Просуваємось до: -,,HUD,,,,,,,,,,,,,,,,,,,,,,,,,, -Monsters:,AM_MONSTERS,,,,Příšery:,Monstre:,Monster:,Τέρατα,Monstroj:,Monstruos:,,Hirviöt:,Monstres:,Szörnyek:,Mostri,奴等:,죽인 적들:,,Monstre:,Potwory:,Monstros:,,Monștri:,Монстры:,Чудовишта:,Monster:,Canavarlar:,Монстри -Secrets:,AM_SECRETS,,,,Skrýše:,Hemmeligheder:,Geheimnisse:,Μυστικά,Sekretoj:,Secretos:,,Salat:,,Titkos helyek:,Segreti,隠場:,찾은 비밀:,Geheimen:,Hemmeligheter:,Sekrety:,Segredos:,,Secrete:,Тайники:,Тајне:,Hemligheter:,Sırlar:,Схованки: -Items:,AM_ITEMS,,,,Věci:,Genstande:,Gegenstände:,Αντεικείμενα,Objektoj:,Objetos:,,Esineet:,Objets:,Tárgyak:,Oggetti,物資:,얻은 아이템:,,Gjenstander:,Przedmioty:,Itens:,,Obiecte:,Предметы:,Предмети:,Föremål:,Eşyalar:,Предмети: -,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,, -%o suicides.,OB_SUICIDE,,,,%o spáchal@[ao_cs] sebevraždu.,%o begår selvmord.,%o begeht Selbstmord.,@[art_gr] %o αυτοκτόνησε,%o sinmortigis.,%o se ha suicidado.,%o se suicidó.,%o teki itsemurhan.,%o se suicide.,%o öngyilkos lett.,%o si è suicidato.,%o は自殺した。,%o 은(는) 자살했다.,%o pleegt zelfmoord.,%o begår selvmord.,%o popełnił@[ao_pl] samobójstwo.,%o se suicidou.,,%o se sinucide.,Игрок %o покончил с собой.,%o самоубиства.,%o tar självmord.,%o intihar eder.,%o самовби@[adj_2_ua]. -%o fell too far.,OB_FALLING,,,,%o spadl@[ao_cs] příliš daleko.,%o faldt for langt ned.,%o fiel zu tief.,@[art_gr] %o έπεσε,%o falis tro fore.,%o se ha caído desde muy alto.,%o se cayó desde muy alto.,%o putosi liian kaukaa.,%o est tombé@[e_fr] trop loin.,%o túl messze esett.,%o è caduto troppo in basso.,%o はあまりにも高い所から転落した。,%o 은(는) 높은 곳에서 떨어져 사망했다.,%o viel te ver.,%o falt for langt.,%o spadł@[ao_pl] za daleko.,%o caiu de um lugar alto.,,%o a căzut prea departe.,Игрок %o упал слишком далеко.,%o је па@[ao_1_sr] до сад.,%o föll för långt.,%o çok uzağa düştü.,%o впа@[adj_1_ua] надто глибоко. -%o was squished.,OB_CRUSH,,,,%o byl@[ao_cs] rozdrcen@[ao_cs].,%o blev mast.,%o wurde zerquetscht,@[art_gr] %o συνθλίφτηκε,%o estis dispremita.,%o ha quedado aplastad@[ao_esp].,%o quedó aplastad@[ao_esp].,%o liiskautui.,%o a été écrasé@[e_fr].,%o össze lett lapítva.,%o è stato schiacciato.,%o は潰された。,%o 은(는) 뭉게졌다.,%o werd geplet.,%o ble knust.,%o spłaszczył@[ao_pl] się.,%o foi esmagad@[ao_ptb].,,%o a fost strivit.,Игрок %o был раздавлен.,%o је здробљен@[adj_1_sr].,%o blev mosad.,%o ezildi.,%o розчавило. -%o tried to leave.,OB_EXIT,,,,%o se pokusil@[ao_cs] odejít.,%o forsøgte at gå.,%o wollte gehen.,@[art_gr] %o προσπάθησε να φύγει,%o provis foriri.,%o ha tratado de huir.,%o trató de huir.,%o yritti häipyä.,%o a tenté de partir.,%o megpróbált lelépni.,%o ha provato a uscire.,%o は逃げようとした。,%o 은(는) 나가려고 발버둥 쳤다.,%o probeerde te vertrekken.,%o prøvde å dra.,%o spróbował@[ao_pl] odejść.,%o tentou sair.,,%o a încercat să plece.,Игрок %o попытался уйти.,%o покуша@[ao_1_sr] да оде.,%o försökte lämna.,%o gitmeye çalıştı.,%o намага@[adj_2_ua] втекти. -%o can't swim.,OB_WATER,,,,%o neumí plavat.,%o kan ikke svømme.,%o kann nicht schwimmen.,@[art_gr] %o δέν μπορεί να κολυμπήσει,%o ne scipovas naĝi.,%o no sabe nadar.,,%o ei osaa uida.,%o ne sait pas nager.,%o nem tud úszni.,%o non sapeva nuotare.,%o は泳げなかった。,%o 은(는) 익사했다.,%o kan niet zwemmen.,%o kan ikke svømme.,%o nie umie pływać.,%o não sabe nadar.,,%o nu poate înota.,Игрок %o не умел плавать.,%o не може да плива.,%o kan inte simma.,%o yüzme bilmiyor.,%o не вміє плавати. -%o mutated.,OB_SLIME,,,,%o zmutoval@[ao_cs].,%o muterede.,%o mutierte.,@[art_gr] %o μεταλάχθηκε,%o mutaciis.,%o ha mutado.,%o mutó.,%o mutatoitui.,%o a muté.,%o mutánssá alakult.,%o è mutato.,%o は変異した。,%o 은(는) 돌연사를 당했다.,%o muteerde.,%o muterte.,%o zmutował@[ao_pl].,%o sofreu mutação.,,%o a avut parte de o mutație.,Игрок %o мутировал.,%o је мутиран@[adj_1_sr].,%o muterade.,%o mutasyona uğradı.,%o мутува@[adj_1_ua]. -%o melted.,OB_LAVA,,,,%o se rozpustil@[ao_cs].,%o smeltede.,%o schmolz.,@[art_gr] %o έλειοσε,%o fandiĝis.,%o se ha fundido.,%o se fundió.,%o suli.,%o a fondu.,%o megolvadt.,%o si è sciolto.,%o は溶かされた。,%o 은(는) 녹아버렸다.,%o smolt.,%o smeltet.,%o stopił@[ao_pl] się.,%o derreteu.,%o derreteu-se.,%o s-a topit.,Игрок %o расплавился.,%o је отопљен@[adj_1_sr].,%o smälte.,%o eridi.,%o розплави@[adj_2_ua]. -%o went boom.,OB_BARREL,,,,%o udělal@[ao_cs] bum.,%o gik bum.,%o explodierte.,@[art_gr] %o έσκασε,%o eksplodis.,%o ha explotado en mil pedazos.,%o explotó en mil pedazos.,%o poksahti.,%o s'est pété@[e_fr] la face.,%o felrobbant.,%o ha fatto bum.,%o は爆発で吹き飛ばされた。,%o 은(는) 폭사했다.,%o ging boem.,%o gikk i lufta.,%o zrobił@[ao_pl] bum.,%o explodiu.,,%o a explodat.,Игрок %o взорвался.,%o је отиш@[ao_2_sr] бум.,%o blev boom.,%o patladı.,%o вибухну@[adj_1_ua]. -%o stood in the wrong spot.,OB_SPLASH,,,,%o stál@[ao_cs] na špatném místě.,%o stod på det forkerte sted.,%o war am falschen Ort.,@[art_gr] %o έκατσε στο λάθος σημείο,%o staris en la malĝusta loko.,%o estaba en el sitio equivocado.,,%o seisoi väärässä paikassa.,%o s'est tenu@[e_fr] au mauvais endroit.,%o rossz helyre állt.,%o si è trovato nel posto sbagliato.,%o はいけない場所に立っていた。,%o 은(는) 위험한 곳에 서 있었다.,%o stond op de verkeerde plek.,%o sto på feil sted.,%o stan@[irreg_2_pl] w złym miejscu.,%o ficou no lugar errado.,,%o a stat în locul nepotrivit.,Игрок %o стоял в неверной точке.,%o је стаја@[ao_1_sr] на погрешно место.,%o stod på fel plats.,%o yanlış yerde durdu.,%o бу@[adj_1_ua] не в тому місці. -%o should have stood back.,OB_R_SPLASH,,,,%o měl@[ao_cs] stát o trochu dál.,%o skulle have stået tilbage.,%o hätte Abstand halten sollen.,@[art_gr] %o έπρεπε να είχε κάτσι πίσω,%o devintus forstarinta.,%o debería haberse apartado.,,%o oli liian likellä.,%o aurait dû garder ses distances.,%o túl közel állt.,%o si sarebbe dovuto allontanare.,%o は後ろへ引くべきだった。,%o 은(는) 좀 더 떨어져야만 했다.,%o had afstand moeten houden.,%o burde ha stått tilbake.,%o nie ustąpił@[ao_pl] na bok.,%o deveria ter se afastado.,,%o ar fi trebuit să stea deoparte.,Игрок %o не отступил в сторону.,Играчу %o је требало да стоји назад.,%o borde ha stått tillbaka.,%o geri çekilmeliydi.,%o треба було відійти подалі. -%o should have stood back.,OB_ROCKET,,,,%o měl@[ao_cs] stát o trochu dál.,%o skulle have stået tilbage.,%o hätte Abstand halten sollen.,@[art_gr] %o έπρεπε να είχε κάτσι πίσω,%o devintus forstarinta.,%o debería haberse apartado.,,%o oli liian likellä.,%o aurait dû garder ses distances.,%o túl közel állt.,%o si sarebbe dovuto allontanare.,%o は後ろへ引くべきだった。,%o 은(는) 더 멀리 떨어져야만 했다.,%o had afstand moeten houden.,%o burde ha stått tilbake.,%o nie ustąpił@[ao_pl] na bok.,%o deveria ter se afastado.,,%o ar fi trebuit să stea deoparte.,Игрок %o не отступил в сторону.,Играчу %o је требало да стоји назад.,%o borde ha stått tillbaka.,%o geri çekilmeliydi.,%o треба було відійти подалі. -%o killed %hself.,OB_KILLEDSELF,,,,%o se zabil@[ao_cs].,%o begik selvmord.,%o tötete sich selbst.,@[art_gr] %o αυτοκτόνησε,%o mortigis sin.,%o se ha matado a sí mism@[ao_esp].,%o se mató a sí mism@[ao_esp].,%o tappoi itsensä.,%o s'est tué@[e_fr].,%o megölte magát.,%o ha ucciso se stesso.,%o は自滅した。,%o 은(는) 자멸했다.,%o bracht zichzelf om.,%o begår selvmord.,%o zabił@[ao_pl] się.,%o se matou.,%o matou-se,%o s-a sinucis.,Игрок %o убил себя.,%o је уби@[ao_1_sr] себе.,%o tog livet av sig.,%o kendini öldürdü.,%o вби@[adj_1_ua] себе. -%o was killed by the power of voodoo.,OB_VOODOO,,,,%o byl@[ao_cs] zabit@[ao_cs] sílou voodoo.,%o blev dræbt af voodooens magt.,%o wurde durch Voodoo getötet.,@[art_gr] %o πέθανε απο τη δύναμη του βουντου,%o estis mortigita de la povo de voduo.,A %o l@[ao_esp] ha matado el poder del vudú.,A %o l@[ao_esp] mató el poder del vudú.,%o kuoli voodoon voimasta.,%o a succombé au pouvoir du Vaudou.,%o meghalt a voodoo erejének köszönhetően.,%o è stato ucciso dalla potenza del voodoo.,%o はブードゥー人形で殺された。,%o 은(는) 부두 마법의 저주를 받았다.,%o werd gedood door de kracht van voodoo.,%o ble drept av voodooens kraft.,%o umarł@[ao_pl] od mocy voodoo.,%o morreu pelo poder do voodoo.,,%o a fost omorât prin puterea voodoo.,Игрок %o убит силой Вуду.,%o је убијен@[adj_1_sr] од стране моћи Voodoo-а.,%o dödades av voodoo-kraften.,%o voodoo'nun gücü tarafından öldürüldü.,%o вбито силою вуду. -%o was telefragged by %k.,OB_MPTELEFRAG,,,,%o byl@[ao_cs] telefraggnut %kem.,%o blev telefragged af %k.,%o stand %k im Wege.,@[art_gr] %o κοματιάστηκε μέσω τηλεμεταφοράς απο τον/την %k,%o estis teleportumita de %k.,A %o l@[ao_esp] ha telefragmentado %k.,A %o l@[ao_esp] telefragmentó %k.,%k telefräggäsi %o paran.,%o a été téléfragué@[e_fr] par %k.,%o telefrag-et kapott %k által.,%o è stato telefraggato da %k.,%o は %k にテレフラグされた。,%o 은(는) %k 에 의해 텔레프랙을 당했다.,%o werd getelefragged door %k.,%o ble telefragget av %k.,%o został@[ao_pl] ztelefragowan@[adj_pl] przez %k.,%o foi telefragad@[ao_ptb] por %k.,,%o a fost omorât prin teleportare de către %k.,Игрок %o стал жертвой телепортации игрока %k.,%o је телефрагован@[adj_1_sr] од стране %k.,%o blev telefragged av %k.,"%o, %k tarafından telefrag edildi.",%o телефрагнуто %k. -%o was telefragged.,OB_MONTELEFRAG,,,,%o byl@[ao_cs] telefraggnut@[ao_cs].,%o blev telefragged.,%o stand jemandem im Wege.,@[art_gr] %o κοματιάστηκε μέσω τηλεμεταφοράς,%o estis teleportumita.,A %o l@[ao_esp] han telefragmentado.,A %o l@[ao_esp] telefragmentaron.,%o telefrägättiin.,%o a été téléfragué@[e_fr].,%o telefraggelve lett.,%o si è fatto telefraggare.,%o はテレフラグされた。,%o 은(는) 텔레프랙을 당했다.,%o werd getelefragged.,%o ble telefragget.,%o został@[ao_pl] ztelefragowan@[adj_pl].,%o foi telefragad@[ao_ptb] por um monstro.,,%o a fost omorât prin teleportare.,Игрок %o стал жертвой телепортации.,%o је телефрагован@[adj_1_sr].,%o blev telefragged.,%o telefragged edildi.,%o вбито телепортом. +All Artifacts!,TXT_ALL_ARTIFACTS,,,All Artefacts!,Všechny artefakty!,Alle artefakter!,Alle Artefakte!,Όλα τα τεχνουργίματα!,Ĉiuj Artefaktoj!,¡Todos los artefactos!,,Kaikki artefaktit!,Tous les artéfacts!,,Összes értéktárgy!,Tutti gli Artefatti!,全アーティファクト!,모든 유물들!,Alle artefacten!,Alle artefakter!,Wszystkie Artefakty!,Todos os artefatos!,,Toate Artefactele!,Все артефакты!,Сви артифакти!,Alla artefakter!,Tüm eserler!,Усі артефакти! +What do you want to kill outside of a game?,TXT_WHAT_KILL,,,,"Co chceš zabít, když nejsi ve hře?",Hvad vil du dræbe uden for et spil?,Was willst du eigentlich außerhalb eines Spiels töten?,Τί θέλεις να σκοτώσεις έξω απο ένα παιχνίδι ?,Kion vi volas mortigi ekster ludo?,¿Qué intentas matar fuera de una partida?,,Mitä haluat tappaa pelin ulkopuolella?,Que voulez-vous tuer en dehors d'une partie?,,Mit tudnál megölni játékon kívül?,Cosa vorresti uccidere fuori dal gioco?,ゲーム外で何を殺す気だ?,게임 밖에서 무엇을 죽이고 싶습니까?,Wat wil je buiten een spel om doden?,Hva vil du drepe utenfor et spill?,Co ty chcesz zabić poza grą?,O que você gostaria de matar fora de um jogo?,,Ce vrei să ucizi în afara unui joc?,Что вы хотите убить вне игры?,Шта желите да убијете ван игре?,Vad vill du döda utanför ett spel?,Oyun dışında ne öldürmek istiyorsun?,"Що, хочеш вбивати в реальності?" +Frozen player properties turned off,TXT_NOT_FROZEN,,,,Vlastnosti držící hráče na místě vypnuty,Frysningstilstand er slået fra.,Gefrier-Modus abgeschaltet.,Η ιδιότητες ενος παγομένου παίχτη απενεργοποίθηκαν,Atributoj de movhaltitaj ludantoj malŝaltitaj,Propiedades de jugador congelado desactivadas,,Jäätyneen pelaajan ominaisuudet kytketty pois päältä,Propriété gelée du joueur annulée.,,Fagyasztott játékos tulajdonságai kikapcsolva,Proprietà del giocatore ghiacciato disattivate,凍ったプレイヤーのプロパティを無効化,플레이어 정지 속성이 꺼졌습니다.,Eigenschappen van de bevroren speler uitgeschakeld,Frosne spilleregenskaper slått av,Właściwości zamrożonego gracza wyłączone,Propriedades de jogador congelado desativadas,,Proprietăți jucători înghețați DEZACTIVATE,Свойства замороженного игрока отключены,Смрзнути играчи искључени,Frysta spelaregenskaper avstängda,Dondurulmuş oyuncu özellikleri kapatıldı,Властивості замороженого гравця вимкнено +,,Automap,,,,,,,,,,,,,,,,,,,,,,,,,,, +Follow Mode OFF,AMSTR_FOLLOWOFF,,,,Režim sledování VYP,Følg-tilstand TIL,Folgen-Modus AUS,Ακολούθηση ΆΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Sekvigreĝimo MALŜALTITA,Modo de seguimiento DESACTIVADO,,Seuraamistila POIS PÄÄLTÄ,Suivi du Joueur OFF,Način praćenja ISKLJ.,Követés mód KI,Mappa scorribile ATTIVATA,追従モード: オフ,추적 모드 끔,Volgmodus UIT,Følgemodus AV,Tryb śledzenia WYŁĄCZONY,Modo de seguimento DESATIVADO,,Mod Urmărire DEZACTIVAT,Привязка к игроку ОТКЛЮЧЕНА,Праћење ИСКЉУЧЕНО,Följningsläget av,Takip Modu KAPALI,Прив'язка до гравца ВВІМК. +Follow Mode ON,AMSTR_FOLLOWON,,,,Režim sledování ZAP,Følg-tilstand FRA,Folgen-Modus AN,Ακολούθηση ΕΝΕΡΓΟΠΟΙΗΜΈΝΗ,Sekvigreĝimo ŜALTITA,Modo de seguimiento ACTIVADO,,Seuraamistila PÄÄLLÄ,Suivi du Joueur ON,Način praćenja UKLJ.,Követés mód BE,Mappa scorribile DISATTIVATA,追従モード: オン,추적 모드 켬,Volgmodus AAN,Følgemodus PÅ,Tryb śledzenia WŁĄCZONY,Modo de seguimento ATIVADO,,Mod Urmărire ACTIVAT,Привязка к игроку ВКЛЮЧЕНА,Праћење УКЉУЧЕНО,Följningsläget på,Takip Modu AÇIK,Прив'язка до гравца ВИМК. +Grid ON,AMSTR_GRIDON,,,,Mřížka ZAP,Raster TIL,Gitter AN,Πλέχμα ΕΝΕΡΓΟΠΟΙΜΈΝΟ,Krado ŜALTITA,Cuadrícula ACTIVADA,,Ruudukko PÄÄLLÄ,Quadrillage ON,Mreža UKLJ.,Rács BE,Griglia ATTIVATA,グリッド: オン,격자 켬,Raster AAN,Rutenett PÅ,Siatka WŁĄCZONA,Grade ATIVADA,Grelha ATIVADA,Grilă ACTIVATĂ,Сетка ВКЛЮЧЕНА,Мрежа УКЉУЧЕНА,Rutnät på,Izgara AÇIK,Сітка ВВІМК. +Grid OFF,AMSTR_GRIDOFF,,,,Mrizka VYP,Raster FRA,Gitter AUS,Πλέχμα ΆΠΕΝΕΡΓΟΠΟΙΜΈΝΟ,Krado MALŜALTITA,Cuadrícula DESACTIVADA,,Ruudukko POIS PÄÄLTÄ,Quadrillage OFF,Mreža ISKLJ.,Rács KI,Griglia DISATTIVATA,グリッド: オフ,격자 끔,Raster UIT,Rutenett AV,Siatka WYŁĄCZONA,Grade DESATIVADA,Grelha DESATIVADA,Grilă DEZACTIVATĂ,Сетка ОТКЛЮЧЕНА,Мрежа ИСКЉУЧЕНА,Rutnät av,Izgara KAPALI,Сітка ВИМК. +Texture Mode ON,AMSTR_TEXON,,,,Texturovaný režim ZAP,Teksturtilstand TIL,Texturmodus AN,Γραφικός χάρτης ΕΝΕΡΓΟΠΟΙΜΈΝΟΣ,Tekstura Reĝimo ŜALTITA,Modo de texturas ACTIVADO,,Pintakuviointitila PÄÄLLÄ,Mode Texturé ON,Način tekstura UKLJ.,Textúrák mód BE,Modalità Texture ATTIVATA,テクスチャーモード: オン,텍스쳐 모드 켬,Textuurmodus AAN,Teksturmodus PÅ,Tekstury WŁĄCZONE,Modo de textura ATIVADO,,Mod Texturat ACTIVAT,Текстурный режим ВКЛЮЧЁН,Текстуре УКЉУЧЕНЕ,Texturläge på,Doku Modu AÇIK,Текстурний режим ВВІМК. +Texture Mode OFF,AMSTR_TEXOFF,,,,Texturovaný režim VYP,Teksturtilstand FRA,Texturmodus AUS,Γραφικός χάρτης ΑΠΕΝΕΡΓΟΠΟΙΜΈΝΟΣ,Tekstura Reĝimo MALŜALTITA,Modo de texturas DESACTIVADO,,Pintakuviointitila POIS PÄÄLTÄ,Mode Texturé OFF,Način tekstura ISKLJ.,Textúrák mód KI,Modalità Texture DISATTIVATA,テクスチャーモード: オフ,텍스쳐 모드 끔,Textuurmodus UIT,Teksturmodus AV,Tekstury WYŁĄCZONE,Modo de textura DESATIVADO,,Mod Netexturat DEZACTIVAT,Текстурный режим ОТКЛЮЧЁН,Текстуре ИСКЉУЧЕНЕ,Texturläge av,Doku Modu KAPALI,Текстурний режим ВИМК. +Marked Spot,AMSTR_MARKEDSPOT,,,,Značka,Markeret placering,Punkt markiert,Μαρκαρησμένη τοποθεσεία,Loko Markita,Punto marcado,,Merkitty paikka,Repère marqué.,Označena točka,Megjelölt hely,Posizione segnata,目標をマークした,지점 추가,Gemarkeerde plek,Markert punkt,Oznaczono miejsce,Posição marcada,,Loc Marcat,Отметка,Означено место,Markerad punkt,İşaretli Nokta,Позначка +All Marks Cleared,AMSTR_MARKSCLEARED,,,,Všechny značky smazány,Alle markeringer slettes,Alle Markierungen gelöscht,Όλες η μαρκαρησμένη τοποθεσείες είναι καθαρησμένες,Ĉiuj Markoj Forigitaj,Todas las marcas eliminadas,,Kaikki merkit pyyhitty,Repères éffacés.,Sve oznake su očišćene.,Összes jelölés törölve,Cancellati tutti i segni,全目標を解除した,모든 지점 지워짐,Alle markingen gewist,Alle merker fjernet,Wszystkie miejsca wyczyszczone,Todas as marcas removidas,,Toate Marcările Șterse,Отметки очищены,Ознаке избрисане,Alla markeringar raderas,Tüm İşaretler Temizlendi,Усі позначки стерто +,,Multiplayer,,,,,,,,,,,,,,,,,,,,,,,,,,, +Fraglimit hit.,TXT_FRAGLIMIT,,,,Fraglimit dosáhnut.,Fraggrænse nået,Fraglimit erreicht,Το όριο κοματιασμόν έχει φτάσει.,Ludmurdo-limo trafita.,Límite de bajas alcanzado.,,Frägiraja saavutettu.,Limite de frags atteinte.,,Fraghatár elérve.,Fraglimit raggiunto.,フラグリミット!,킬제한에 도달했습니다.,Fraglimiet bereikt.,Fraglimit treff.,Limit fragów wyczerpany.,Limite de frags atingido.,,Limita de ucideri atinsă.,Достигнут лимит фрагов.,Фраг-лимит достигнут.,Fragbegränsning träffad.,Frag limiti vuruldu.,Досягнуто ліміт фрагів. +Timelimit hit.,TXT_TIMELIMIT,,,,Časový limit dosáhnut.,Tidsgrænse nået,Zeitlimit erreicht,Το χρονικό όριο έχει φτάσει.,Tempolimo trafita.,Límite de tiempo alcanzado.,,Aikaraja saavutettu.,Limite de temps atteinte.,,Időhatár elérve.,Timelimit raggiunto.,ゲームセット!,시간제한에 도달했습니다.,Tijdslimiet bereikt.,Tidsbegrensningen er nådd.,Limit czasowy wyczerpany.,Limite de tempo atingido.,,Limita de timp atinsă.,Достигнут лимит времени.,Временско ограничење достигнуто.,Tidsbegränsning träffad.,Zaman limiti vuruldu.,Досягнуто ліміт часу. +%o was looking good until %g killed %hself!,SPREEKILLSELF,,,,%o vypadal@[ao_cs] dobře dokud se @[self_cs] nezabil@[ao_cs]!,"%o så godt ud, indtil @[pro_dk] dræbte sig selv!","%o sah gut aus, bis das Unglück geschah.",@[art_gr] %o πήγενε μια χαρά μέχρι που αυτοκτόνησε!,"%o estis faranta bone, ĝis @[pro_eo] mortigis sin!",¡%o se veía bien hasta que %g se mató a si mism@[ao_esp]!,,"%o oli liekeissä, kunnes meni tappamaan itsensä!",%o était en pleine folie meurtrière avant qu' %g ne se bute!,,%o jól nézett ki még mielőtt megölte magát!,%o stava andando bene finchè non si è ucciso da solo!,%o は自滅するまでなかなか良かったぞ!,%o 이(가) 잘 나가려던 참에 자살했습니다!,%o zag er goed uit tot %g zelfmoord pleegde!,%o så bra ut helt til %g tok livet av seg!,%o wyglądał dobrze dopóki się nie zabił@[ao_pl],%o estava indo bem até se matar!,,%o arăta atât de bine până să se sinucidă,"%o неплохо выглядел@[ao_rus], пока не покончил@[ao_rus] с собой!",%o је изгледа@[ao_1_sr] добро док није уби@[ao_1_sr] сам@[ao_3_sr] себе!,%o såg bra ut tills han tog livet av sig!,%o kendini öldürene kadar iyi görünüyordu!,"%o вигляда@[adj_1_ua] добре, поки не вби@[adj_1_ua] себе!" +%o's killing spree was ended by %k,SPREEOVER,,,,%o@[psn1_cs] vraždící řádění ukončil hráč %k.,%os drabstog blev afsluttet af %k,%os Amoklauf wurde von %k beendet.,Ο/Η %k σταμάτησε την ανθρωποκτονία %h %o.,La mortigado de %o estis finita de %k,%k acabó con la racha de muerte de %o,,%k päätti pelaajan %o tapposarjan,La folie meurtrière de %o à été terminée par %k!,,%o ámokfutását %k megállította.,La sequela di frag di %o è stata terminata da %k,%k が %o の快進撃を断ち切った!,%k 이(가) %o 의 연속 킬을 처단했습니다,%o's moordpartij werd beëindigd door %k.,%o's drapsturné ble avsluttet av %k.,Seria zabójstw %o zakończona przez %k,A matança de %o foi interrompida por %k,,Pofta de ucis a lui %o a fost pusă în cui de către %k,Игрок %k прервал череду убийств игрока %o,Серијско убијање играча %o је завршио играч %k,%os dödskampanj avslutades av %k.,%o onu öldürene kadar %k iyi görünüyordu.,%k закінчи@[adj_1_ua] бійню %o +%k is on a killing spree!,SPREE5,,,,%k začal@[ao_cs] řádit!,%k er i gang med en mordserie!,%k läuft Amok!,Ο/Η %k άρχισε μια ανθρωποκτονία!,%k estas sur mortigado!,¡%k está atacando de lo lindo!,,%k on sarjamurhaaja!,%k est en folie meurtrière!,,%o egy Ámokfutó!,%k è preda di un momento omicida!,%k が連続キル!,%k 연속 킬!,%k is op een moordpartij!,%k er på drapsturné!,%k popełnia serię morderstw!,%k está cometendo uma matança!,,%k are chef de ucis!,Игрок %k совершил череду убийств!,%k је серијални убица!,%k är på en mordresa!,%k bir ölüm çılgınlığında!,%k смакує різанину! +%k is on a rampage!,SPREE10,,,,%k zuří!,%k er på et amokløb!,%k tobt sich aus!,Ο/Η %k είναι σε ξέσπασμα!,%k estas sur furiozado!,¡%k está en medio de una aniquilación!,,%k riehuu valtoimenaan!,%k est en plein massacre!,,%o Tombol!,%k sta facendo un massacro!,%k が大暴れだ!,%k 이(가) 미쳐 날뛰고 있습니다!,%k heeft razernij!,%k går amok!,%k doznaje szału!,%k está massacrando!,,%k e înverșunat!,Игрок %k в неистовстве!,%k дивља!,%k är på en våldsam resa!,%k kudurmuş durumda!,%k лютує! +%k is dominating!,SPREE15,,,,%k dominuje!,%k er dominerende!,%k dominiert!,Ο/Η %k κατακτεί.,%k estas dominanta!,¡%k está dominando!,,%k hallitsee suvereenisti!,%k domine!,,%o Uralkodik!,%k sta dominando tutti!,%k が圧倒している!,%k 이(가) 우세하고 있습니다!,%k domineert!,%k dominerer!,%k dominuje!,%k está dominando!,,%k domină!,Игрок %k господствует!,%k доминира!,%k dominerar!,%k hükmediyor!,%k домінує! +%k is unstoppable!,SPREE20,,,,%k je nezastaviteln@[adj_cs]!,%k er ustoppelig!,%k kann nicht gestoppt werden!,Ο/Η %k είναι ασταμάτητος/η!,%k estas nehaltigebla!,¡%k es imparable!,,%k on pysäyttämätön!,%k est inarrétable!,,%o Megállíthatatlan!,%k è inarrestabile!,%k が止まらない!,%k 을(를) 막을 수없습니다!,%k is niet te stoppen!,%k er ustoppelig!,%k jest niepowstrzymany!,%k é implacável!,,%k e de neoprit!,Игрок %k неостановим!,Играч %k је незаустављив!,%k är ostoppbar!,%k durdurulamaz!,%k неспинний! +%k is Godlike!,SPREE25,,,,%k je boží!,%k er som en gud!,%k ist wie Gott!,Ο/Η %k είναι σαν θεός/θεά!,%k estas Dia!,¡%k es una máquina de matar!,,%k on kuin jumala!,%k est un dieu!,,%o Istencsászár!,%k è un dio!,%k が神の様だ!,%k 은(는) 신적입니다! ,%k is Goddelijk!,%k er guddommelig!,%k jest Bogem!,%k é um deus da matança!,,%k e precum un Zeu!,Игрок %k богоподобен!,Играч %k је божанствен!,%k är som en gud!,%k tanrı gibi!,%k божественний! +Double kill!,MULTI2,,,,Dvoj-zabití!,Dobbelt drab!,Doppel-Kill!,Δυπλός Θάνατος!,Duobla mortigo!,¡Dos menos!,,Tuplatappo!,,,Dupla gyilok!,Doppia uccisione!,ダブルキル!,더블 킬!,Dubbele kill!,Dobbeltdrap!,Podwójne zabójstwo!,Morte dupla!,,Dublă ucidere!,Двойное убийство!,Дупло убиство!,Dubbeldödning!,Çifte öldürme!,Подвійне вбивство! +Multi kill!,MULTI3,,,,Multi-zabití!,Multi-drab!,Multi-Kill!,Πολυθάνατος!,Pluraj mortigoj!,¡Multidestrucción!,,Multitappo!,,,Multi gyilok!,Tripla uccisione!,マルチキル!,멀티 킬!,,Multidrap!,Multi-zabójstwo!,Morte tripla!,,Ucidere multiplă!,Массовое убийство!,Вишеструко убиство!,Flera dödar!,Çoklu öldürme!,Массове вбивство! +Ultra kill!,MULTI4,,,,Ultra-zabití!,Ultra-drab!,Ultra-Kill!,Υπερθάνατος!,Ekstremaj mortigoj!,¡¡HIPERDESTRUCCIÓN!!,,Ultratappo!,,,Ultra gyilok!,Ultra uccisione!,ウルトラキル!,울트라 킬!,,Ultra drep!,Ultra-zabójstwo!,Ultra matança!,,Ultra ucidere!,Ультра-убийство!,Ултра убиство!,Ultra-död!,Ultra öldürme!,Безмежне вбивство! +Monster kill!,MULTI5,,,,Monstr-zabití!,Monster-drab!,Monster-Kill!,Τερατόδες σκοτωμός!,Monstraj mortigoj!,¡¡¡S.U.P.E.R.D.E.S.T.R.U.C.C.I.Ó.N!!!,,Hirviömäinen tappo!,,,Szörnyű gyilkolás!,Uccisione Mostruosa!,モンスターキル!,몬스터 킬!,,Monster drep!,Potworne zabójstwo!,Matança monstro!,Matança monstruosa!,Ucidere monstruoasă!,Чудовищное убийство!,Монструозно убиство!,Monsterdöd!,Canavar öldürme!,Монструозне вбивство! +,,Scoreboard,,,,,,,,,,,,,,,,,,,,,,,,,,, +Bonus,SCORE_BONUS,,,,,,,,Bonuso,Bonificaciones,,Lisäedut,,Bonus,Bónusz,,ボーナス,보너스,Bonus,,Bonusy,Bônus,,,Бонус,Бонус,,,Бонус +Color,SCORE_COLOR,,,Colour,Barva,Farve,Farbe,Χρώμα,Koloro,,,Väri,Couleur,Boja,Szín,Colore ,色,색상,Kleur,Farge,Kolor,Cor,,Culoare,Цвет,Боја,Färg,Renk,Колір +Secret,SCORE_SECRET,,,,Skrýše,Hemmeligt,Geheimnis,Μυστικό,Sekreto,Secreto,,Salat,,Tajna,Titok,Segreto,シークレット,밝혀낸 비밀,Geheim,Hemmelig,Sekret,Segredo,,,Тайники,Тајна,Hemlig,Sır,Схованки +Name,SCORE_NAME,,,,Jméno,Navn,Name,Όνομα,Nomo,Nombre,,Nimi,Nom,Ime,Név,Nome,名前,이름,Naam,Navn,Nazwa,Nome,,Nume,Игрок,Име,Namn,İsim,Гравець +Delay (ms),SCORE_DELAY,,,,Zpoždění (ms),Forsinkelse (ms),Verzögerung (ms),Kαθυστέρηση (μδ),Prokrasto (ms),Retraso (ms),,Viive (ms),Délai (ms),Kašnjenje (ms),Késleltetés (ms),Ritardo (ms) ,ping,핑 (밀리초당),Vertraging (ms),Forsinkelse (ms),Opóźnienie (ms),Atraso (ms),,Întârziere (ms),Задержка (мс),Кашњење (мс),Fördröjning (ms),Gecikme (ms),Затримка (мс) +Frags,SCORE_FRAGS,,,,Fragy,,,Κοματιασμοί,Ludmurdoj,Bajas,,Frägit,,Fragovi,Frag-ek,,フラグ,플레이어 킬수,,,Fragi,,,Victime,Фраги,Фрагови,,,Фраги +Deaths,SCORE_DEATHS,,,,Smrti,Dødsfald,Tode,Θάνατοι,Mortoj,Muertes,,Kuolemat,Morts,Smrti,Halálok,Morti,デス,사망한 횟수,Sterfgevallen,Dødsfall,Śmierci,Mortes,,Decese,Смерти,Смрти,Dödsfall,Ölümler,Смерті +Other,SCORE_OTHER,,,,Ostatní,Andre,Andere,,Alia,Demás,,Muu,Autre,Drugo,Egyéb,Altro,その他,,Anders,Andre,Inne,Outro,,Altele,Прочее,,Andra,Diğer,Інше +Missed,SCORE_MISSED,,,,Minuto,Forpasset,Verfehlt,Ξεχάστηκαν,Mankita,Pérdidas,,Hudit,Ratés,Promašeno,Kihagyva,Mancati ,ミス,놓친 수,Gemist,Ubesvarte,Ominięte,Perdido,,Ratate,Пропущено,Пропуштено,Missade,Cevapsız,Пропущено +Total,SCORE_TOTAL,,,,Celkem,,Gesamt,Συνολικό,Tuto,,,Yhteensä,,Ukupno,Összesen,Totale,合計,총점,Totaal,Totalt,Totalne,,,,Всего,Укупно,Totalt,Toplam,Разом +Level Time,SCORE_LVLTIME,,,,Čas v levelu,Niveau Tid,Levelzeit,Χρόνος Πίστας,Daŭro de Nivelo,Tiempo de nivel,,Tasoaika,Temps niveau,Vrijeme razine,Pályaidő,Tempo Livello ,時間,레벨 시간,Leveltijd,Nivå Tid,Czas,Tempo de fase,Tempo do Nível,Timp Petrecut,Время уровня,Време нивоа,Nivå Tid,Seviye Zaman,Час рівня +,,Level Summary,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kills,TXT_IMKILLS,,,,Zabití,Dræber,,Σκοτομοί,Mortigoj,Muertes,,Tapot,Morts,Ubojstva,Áldozatok,Uccisioni,キル,킬수,Dood,Drepte,Zabici,Vítimas,,Ucideri,Убийств,Непријатељи,Dödade,Öldürür,Вороги +Items,TXT_IMITEMS,,,,Předměty,Genstande,Gegenstände,Αντεικείμενα,Objektoj,Objetos,,Esineet,Objets,Predmeti,Tárgyak,Oggetti,アイテム,획득한 아이템,,Gjenstander,Przedmioty,Itens,,Obiecte,Предметов,Ставке,Föremål,Eşyalar,Предмети +Secrets,TXT_IMSECRETS,,,,Skrýše,Hemmeligheder,Geheimnisse,Μυστικά,Sekretoj,Secretos,,Salat,,Tajne,Titkok,Segreti,シークレット,밝혀낸 비밀,Geheimen,Hemmeligheter,Sekrety,Segredos,,Secrete,Тайников,Тајне,Hemligheter,Sırlar,Схованки +Time,TXT_IMTIME,,,,Čas,Tid,Zeit,Χρόνος,Daŭro,Tiempo,,Aika,Temps,Vrijeme,Idő,Tempo,経過時間,소모한 시간,Tijd,Tid,Czas,Tempo,,Timp,Время,Време,Tid,Zaman,Час +Par,TXT_IMPAR,,,,,,,Μέσος Όρος,Alparo,,,,,Prosjek,Átlag,Media,最速時間,기준 시간,,,,Média,,Record,Рекорд,Рекорд,,,Рекорд +Finished,WI_FINISHED,,,,Dokončeno,Færdig,Abgeschlossen,Ολοκληρώθηκε,Finita,Completado,,Suoritettu,Terminé,Završeno,Teljesítve,Finito,攻略,완료,Klaar,Ferdig,Ukończono,Finalizado,,Terminat,Уровень завершён,Ниво завршен,Avslutad,Bitti,Завершено +Entering,WI_ENTERING,,,,Vstupuješ do,Indtastning af,Betrete,Είσοδος,Enirante,Entrando a:,,Seuraava kohde,Niveau Suivant,Ulaženje,Következik,Prossimo livello,突入開始,입장,Volgende,Går inn,Wchodzisz do:,Próxima fase,Próximo nível,Începe,Переход,Следећи ниво,Ingång till,Giriş,Заходимо +Now entering:,WI_ENTERING,,heretic hexen,,Nyní vstupuješ do:,Indtastning af:,Betrete:,Τώρα εισέρχεσε στο:,Nun enirante:,Ahora entrando a:,,Seuraava kohde:,Vous entrez dans:,Ulaženje:,Következik:,Entrando adesso in:,突入中:,입장합니다:,Volgende:,Går nå inn:,Teraz wchodzisz do:,Entrando em:,A entrar em:,Acum începe:,Переход на:,Следећи ниво:,Ingång till,Şimdi giriyoruz:,Просуваємось до: +,,HUD,,,,,,,,,,,,,,,,,,,,,,,,,,, +Monsters:,AM_MONSTERS,,,,Příšery:,Monstre:,Monster:,Τέρατα,Monstroj:,Monstruos:,,Hirviöt:,Monstres:,Čudovišta:,Szörnyek:,Mostri,奴等:,죽인 적들:,,Monstre:,Potwory:,Monstros:,,Monștri:,Монстры:,Чудовишта:,Monster:,Canavarlar:,Монстри +Secrets:,AM_SECRETS,,,,Skrýše:,Hemmeligheder:,Geheimnisse:,Μυστικά,Sekretoj:,Secretos:,,Salat:,,Tajne:,Titkos helyek:,Segreti,隠場:,찾은 비밀:,Geheimen:,Hemmeligheter:,Sekrety:,Segredos:,,Secrete:,Тайники:,Тајне:,Hemligheter:,Sırlar:,Схованки: +Items:,AM_ITEMS,,,,Věci:,Genstande:,Gegenstände:,Αντεικείμενα,Objektoj:,Objetos:,,Esineet:,Objets:,Predmeti:,Tárgyak:,Oggetti,物資:,얻은 아이템:,,Gjenstander:,Przedmioty:,Itens:,,Obiecte:,Предметы:,Предмети:,Föremål:,Eşyalar:,Предмети: +,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,,, +%o suicides.,OB_SUICIDE,,,,%o spáchal@[ao_cs] sebevraždu.,%o begår selvmord.,%o begeht Selbstmord.,@[art_gr] %o αυτοκτόνησε,%o sinmortigis.,%o se ha suicidado.,%o se suicidó.,%o teki itsemurhan.,%o se suicide.,,%o öngyilkos lett.,%o si è suicidato.,%o は自殺した。,%o 은(는) 자살했다.,%o pleegt zelfmoord.,%o begår selvmord.,%o popełnił@[ao_pl] samobójstwo.,%o se suicidou.,,%o se sinucide.,Игрок %o покончил с собой.,%o самоубиства.,%o tar självmord.,%o intihar eder.,%o самовби@[adj_2_ua]. +%o fell too far.,OB_FALLING,,,,%o spadl@[ao_cs] příliš daleko.,%o faldt for langt ned.,%o fiel zu tief.,@[art_gr] %o έπεσε,%o falis tro fore.,%o se ha caído desde muy alto.,%o se cayó desde muy alto.,%o putosi liian kaukaa.,%o est tombé@[e_fr] trop loin.,,%o túl messze esett.,%o è caduto troppo in basso.,%o はあまりにも高い所から転落した。,%o 은(는) 높은 곳에서 떨어져 사망했다.,%o viel te ver.,%o falt for langt.,%o spadł@[ao_pl] za daleko.,%o caiu de um lugar alto.,,%o a căzut prea departe.,Игрок %o упал слишком далеко.,%o је па@[ao_1_sr] до сад.,%o föll för långt.,%o çok uzağa düştü.,%o впа@[adj_1_ua] надто глибоко. +%o was squished.,OB_CRUSH,,,,%o byl@[ao_cs] rozdrcen@[ao_cs].,%o blev mast.,%o wurde zerquetscht,@[art_gr] %o συνθλίφτηκε,%o estis dispremita.,%o ha quedado aplastad@[ao_esp].,%o quedó aplastad@[ao_esp].,%o liiskautui.,%o a été écrasé@[e_fr].,,%o össze lett lapítva.,%o è stato schiacciato.,%o は潰された。,%o 은(는) 뭉게졌다.,%o werd geplet.,%o ble knust.,%o spłaszczył@[ao_pl] się.,%o foi esmagad@[ao_ptb].,,%o a fost strivit.,Игрок %o был раздавлен.,%o је здробљен@[adj_1_sr].,%o blev mosad.,%o ezildi.,%o розчавило. +%o tried to leave.,OB_EXIT,,,,%o se pokusil@[ao_cs] odejít.,%o forsøgte at gå.,%o wollte gehen.,@[art_gr] %o προσπάθησε να φύγει,%o provis foriri.,%o ha tratado de huir.,%o trató de huir.,%o yritti häipyä.,%o a tenté de partir.,,%o megpróbált lelépni.,%o ha provato a uscire.,%o は逃げようとした。,%o 은(는) 나가려고 발버둥 쳤다.,%o probeerde te vertrekken.,%o prøvde å dra.,%o spróbował@[ao_pl] odejść.,%o tentou sair.,,%o a încercat să plece.,Игрок %o попытался уйти.,%o покуша@[ao_1_sr] да оде.,%o försökte lämna.,%o gitmeye çalıştı.,%o намага@[adj_2_ua] втекти. +%o can't swim.,OB_WATER,,,,%o neumí plavat.,%o kan ikke svømme.,%o kann nicht schwimmen.,@[art_gr] %o δέν μπορεί να κολυμπήσει,%o ne scipovas naĝi.,%o no sabe nadar.,,%o ei osaa uida.,%o ne sait pas nager.,,%o nem tud úszni.,%o non sapeva nuotare.,%o は泳げなかった。,%o 은(는) 익사했다.,%o kan niet zwemmen.,%o kan ikke svømme.,%o nie umie pływać.,%o não sabe nadar.,,%o nu poate înota.,Игрок %o не умел плавать.,%o не може да плива.,%o kan inte simma.,%o yüzme bilmiyor.,%o не вміє плавати. +%o mutated.,OB_SLIME,,,,%o zmutoval@[ao_cs].,%o muterede.,%o mutierte.,@[art_gr] %o μεταλάχθηκε,%o mutaciis.,%o ha mutado.,%o mutó.,%o mutatoitui.,%o a muté.,,%o mutánssá alakult.,%o è mutato.,%o は変異した。,%o 은(는) 돌연사를 당했다.,%o muteerde.,%o muterte.,%o zmutował@[ao_pl].,%o sofreu mutação.,,%o a avut parte de o mutație.,Игрок %o мутировал.,%o је мутиран@[adj_1_sr].,%o muterade.,%o mutasyona uğradı.,%o мутува@[adj_1_ua]. +%o melted.,OB_LAVA,,,,%o se rozpustil@[ao_cs].,%o smeltede.,%o schmolz.,@[art_gr] %o έλειοσε,%o fandiĝis.,%o se ha fundido.,%o se fundió.,%o suli.,%o a fondu.,,%o megolvadt.,%o si è sciolto.,%o は溶かされた。,%o 은(는) 녹아버렸다.,%o smolt.,%o smeltet.,%o stopił@[ao_pl] się.,%o derreteu.,%o derreteu-se.,%o s-a topit.,Игрок %o расплавился.,%o је отопљен@[adj_1_sr].,%o smälte.,%o eridi.,%o розплави@[adj_2_ua]. +%o went boom.,OB_BARREL,,,,%o udělal@[ao_cs] bum.,%o gik bum.,%o explodierte.,@[art_gr] %o έσκασε,%o eksplodis.,%o ha explotado en mil pedazos.,%o explotó en mil pedazos.,%o poksahti.,%o s'est pété@[e_fr] la face.,,%o felrobbant.,%o ha fatto bum.,%o は爆発で吹き飛ばされた。,%o 은(는) 폭사했다.,%o ging boem.,%o gikk i lufta.,%o zrobił@[ao_pl] bum.,%o explodiu.,,%o a explodat.,Игрок %o взорвался.,%o је отиш@[ao_2_sr] бум.,%o blev boom.,%o patladı.,%o вибухну@[adj_1_ua]. +%o stood in the wrong spot.,OB_SPLASH,,,,%o stál@[ao_cs] na špatném místě.,%o stod på det forkerte sted.,%o war am falschen Ort.,@[art_gr] %o έκατσε στο λάθος σημείο,%o staris en la malĝusta loko.,%o estaba en el sitio equivocado.,,%o seisoi väärässä paikassa.,%o s'est tenu@[e_fr] au mauvais endroit.,,%o rossz helyre állt.,%o si è trovato nel posto sbagliato.,%o はいけない場所に立っていた。,%o 은(는) 위험한 곳에 서 있었다.,%o stond op de verkeerde plek.,%o sto på feil sted.,%o stan@[irreg_2_pl] w złym miejscu.,%o ficou no lugar errado.,,%o a stat în locul nepotrivit.,Игрок %o стоял в неверной точке.,%o је стаја@[ao_1_sr] на погрешно место.,%o stod på fel plats.,%o yanlış yerde durdu.,%o бу@[adj_1_ua] не в тому місці. +%o should have stood back.,OB_R_SPLASH,,,,%o měl@[ao_cs] stát o trochu dál.,%o skulle have stået tilbage.,%o hätte Abstand halten sollen.,@[art_gr] %o έπρεπε να είχε κάτσι πίσω,%o devintus forstarinta.,%o debería haberse apartado.,,%o oli liian likellä.,%o aurait dû garder ses distances.,,%o túl közel állt.,%o si sarebbe dovuto allontanare.,%o は後ろへ引くべきだった。,%o 은(는) 좀 더 떨어져야만 했다.,%o had afstand moeten houden.,%o burde ha stått tilbake.,%o nie ustąpił@[ao_pl] na bok.,%o deveria ter se afastado.,,%o ar fi trebuit să stea deoparte.,Игрок %o не отступил в сторону.,Играчу %o је требало да стоји назад.,%o borde ha stått tillbaka.,%o geri çekilmeliydi.,%o треба було відійти подалі. +%o should have stood back.,OB_ROCKET,,,,%o měl@[ao_cs] stát o trochu dál.,%o skulle have stået tilbage.,%o hätte Abstand halten sollen.,@[art_gr] %o έπρεπε να είχε κάτσι πίσω,%o devintus forstarinta.,%o debería haberse apartado.,,%o oli liian likellä.,%o aurait dû garder ses distances.,,%o túl közel állt.,%o si sarebbe dovuto allontanare.,%o は後ろへ引くべきだった。,%o 은(는) 더 멀리 떨어져야만 했다.,%o had afstand moeten houden.,%o burde ha stått tilbake.,%o nie ustąpił@[ao_pl] na bok.,%o deveria ter se afastado.,,%o ar fi trebuit să stea deoparte.,Игрок %o не отступил в сторону.,Играчу %o је требало да стоји назад.,%o borde ha stått tillbaka.,%o geri çekilmeliydi.,%o треба було відійти подалі. +%o killed %hself.,OB_KILLEDSELF,,,,%o se zabil@[ao_cs].,%o begik selvmord.,%o tötete sich selbst.,@[art_gr] %o αυτοκτόνησε,%o mortigis sin.,%o se ha matado a sí mism@[ao_esp].,%o se mató a sí mism@[ao_esp].,%o tappoi itsensä.,%o s'est tué@[e_fr].,,%o megölte magát.,%o ha ucciso se stesso.,%o は自滅した。,%o 은(는) 자멸했다.,%o bracht zichzelf om.,%o begår selvmord.,%o zabił@[ao_pl] się.,%o se matou.,%o matou-se,%o s-a sinucis.,Игрок %o убил себя.,%o је уби@[ao_1_sr] себе.,%o tog livet av sig.,%o kendini öldürdü.,%o вби@[adj_1_ua] себе. +%o was killed by the power of voodoo.,OB_VOODOO,,,,%o byl@[ao_cs] zabit@[ao_cs] sílou voodoo.,%o blev dræbt af voodooens magt.,%o wurde durch Voodoo getötet.,@[art_gr] %o πέθανε απο τη δύναμη του βουντου,%o estis mortigita de la povo de voduo.,A %o l@[ao_esp] ha matado el poder del vudú.,A %o l@[ao_esp] mató el poder del vudú.,%o kuoli voodoon voimasta.,%o a succombé au pouvoir du Vaudou.,,%o meghalt a voodoo erejének köszönhetően.,%o è stato ucciso dalla potenza del voodoo.,%o はブードゥー人形で殺された。,%o 은(는) 부두 마법의 저주를 받았다.,%o werd gedood door de kracht van voodoo.,%o ble drept av voodooens kraft.,%o umarł@[ao_pl] od mocy voodoo.,%o morreu pelo poder do voodoo.,,%o a fost omorât prin puterea voodoo.,Игрок %o убит силой Вуду.,%o је убијен@[adj_1_sr] од стране моћи Voodoo-а.,%o dödades av voodoo-kraften.,%o voodoo'nun gücü tarafından öldürüldü.,%o вбито силою вуду. +%o was telefragged by %k.,OB_MPTELEFRAG,,,,%o byl@[ao_cs] telefraggnut %kem.,%o blev telefragged af %k.,%o stand %k im Wege.,@[art_gr] %o κοματιάστηκε μέσω τηλεμεταφοράς απο τον/την %k,%o estis teleportumita de %k.,A %o l@[ao_esp] ha telefragmentado %k.,A %o l@[ao_esp] telefragmentó %k.,%k telefräggäsi %o paran.,%o a été téléfragué@[e_fr] par %k.,,%o telefrag-et kapott %k által.,%o è stato telefraggato da %k.,%o は %k にテレフラグされた。,%o 은(는) %k 에 의해 텔레프랙을 당했다.,%o werd getelefragged door %k.,%o ble telefragget av %k.,%o został@[ao_pl] ztelefragowan@[adj_pl] przez %k.,%o foi telefragad@[ao_ptb] por %k.,,%o a fost omorât prin teleportare de către %k.,Игрок %o стал жертвой телепортации игрока %k.,%o је телефрагован@[adj_1_sr] од стране %k.,%o blev telefragged av %k.,"%o, %k tarafından telefrag edildi.",%o телефрагнуто %k. +%o was telefragged.,OB_MONTELEFRAG,,,,%o byl@[ao_cs] telefraggnut@[ao_cs].,%o blev telefragged.,%o stand jemandem im Wege.,@[art_gr] %o κοματιάστηκε μέσω τηλεμεταφοράς,%o estis teleportumita.,A %o l@[ao_esp] han telefragmentado.,A %o l@[ao_esp] telefragmentaron.,%o telefrägättiin.,%o a été téléfragué@[e_fr].,,%o telefraggelve lett.,%o si è fatto telefraggare.,%o はテレフラグされた。,%o 은(는) 텔레프랙을 당했다.,%o werd getelefragged.,%o ble telefragget.,%o został@[ao_pl] ztelefragowan@[adj_pl].,%o foi telefragad@[ao_ptb] por um monstro.,,%o a fost omorât prin teleportare.,Игрок %o стал жертвой телепортации.,%o је телефрагован@[adj_1_sr].,%o blev telefragged.,%o telefragged edildi.,%o вбито телепортом. %o died.,OB_DEFAULT,,,,"%o zemřel@[ao_cs]. -",%o døde.,%o ist gestorben.,@[art_gr] %o πέθανε,%o mortis.,%o ha muerto.,%o murió.,%o kuoli.,%o est mort@[e_fr].,%o meghalt.,%o è morto.,%o は死亡した。,%o 은(는) 죽었다.,%o ging dood.,%o døde.,%o umarł@[ao_pl].,%o morreu.,,%o a murit.,Игрок %o погиб.,%o је умр@[ao_1_sr].,%o dog.,%o öldü.,%o помер@[adj_3_ua]. -%o was killed by %k.,OB_MPDEFAULT,,,,%o byl@[ao_cs] zabit@[ao_cs] hráčem %k.,%o blev dræbt af %k.,%o wurde von %k getötet.,@[art_gr] %o στοτώθηκε απο τον/την %k,%o estis mortigita de %k.,A %o l@[ao_esp] ha matado %k.,A %o l@[ao_esp] mató %k.,%k tappoi %o paran.,%o a été tué@[e_fr] par %k.,%k megölte %o-t.,%o è stato ucciso da %k,%o は %k によって殺された。,%o 은(는) %k 에 의해 죽임을 당했다.,%o werd gedood door %k.,%o ble drept av %k.,%o został@[ao_pl] zabit@[adj_pl] przez %k.,%o foi mort@[ao_ptb] por %k.,,%o a fost omorât de către %k.,Игрока %o убил игрок %k.,Играча %o је уби@[ao_1_sr] %k.,%o dödades av %k.,"%o, %k tarafından öldürüldü.",%o вбито гравцем %k. -%k mows down a teammate.,OB_FRIENDLY1,,,,%o rozsekal@[ao_cs] spoluhráče.,%k mejer en holdkammerat ned.,%o wurde von einem Teamkameraden niedergestreckt.,Ο/Η %k σκότωσε έναν σύμαχο,%k buĉas teamanon.,%k ha acribillado a un compañero.,%k acribilló a un compañero.,%k niitti joukkuetoverin.,%k élimine un de ses équipiers.,%k lekaszabolta a csapattársát.,%k falcia via un compagno.,%k は仲間を無慈悲に殺した。,%o 은(는) 자신의 팀원을 죽였다.,%k maait een teamgenoot neer.,%k meier ned en lagkamerat.,%k kosi kompana.,%k matou um colega de equipe.,%k matou um companheiro de equipa.,%k face pulbere pe un coechipier.,Игрок %k сбивает союзника.,%k је обори@[ao_1_sr] саиграча.,%k mejar ner en lagkamrat.,%k bir takım arkadaşını biçti.,%k скоси@[adj_1_ua] соратника. -%k seems to need glasses.,OB_FRIENDLY2,English was changed to remove problematic pronoun referencing the killer,,,%k nejspíš potřebuje brýle.,%k har tilsyneladende brug for briller.,%k sollte eine Brille benutzen.,Ο/Η %k φαίνεται να χρειάζετε γυαλία,%o ŝajnas bezoni okulvitrojn.,%k parece necesitar gafas.,%k parece necesitar lentes.,%k näyttää tarvitsevan laseja.,%k vérifie ses lunettes.,%k-nak szemüvegre van szüksége.,%k sembra che abbia bisogno di occhiali.,%k には眼鏡が必要なようだ。,%o 은(는) 자신의 안경을 확인했다.,%k lijkt een bril nodig te hebben.,%k ser ut til å trenge briller.,%k wydaje się potrzebować okularów.,%k parece que precisa de óculos.,,%k pare să aibă nevoie de ochelari.,Игроку %k следует носить свои очки.,Играчу %k би приличиле наочаре.,%k verkar behöva glasögon.,%k net göremiyor,"Схоже, що %k потрібні окуляри." -%k gets a frag for the other team.,OB_FRIENDLY3,,,,%k dostal@[ao_cs] frag pro další tým.,%k får en fragment til det andet hold.,%k macht für das andere Team einen Punkt.,Ο/Η %k πάιρνει έναν κοματιασμό για την άλλη ομάδα.,%k gajnas ludmurdon por la alia teamo.,%k ha marcado una baja para el otro equipo.,%k marcó una baja para el otro equipo.,%k teki frägin vieraalle joukkueelle.,%k marque un point pour l'autre équipe.,%k szerez egy frag-et a másik csapatnak.,%k regala un frag all'altro team.,%k は敵チームに得点を入れた。,%o 은(는) 의도치 않게 상대방 팀을 도왔다.,%k doet een frag voor het andere team.,%k får en frag for det andre laget.,%k zdobywa fraga dla przeciwnej drużyny.,%k dá um frag para o outro time.,%k dá um frag para a outra equipa.,%k face o victimă pentru echipa adversă.,Игрок %k преподнёс другой команде фраг.,%k осваја фраг за други тим.,%k får ett frag till det andra laget.,%k diğer takım için bir parça aldı.,%k відда@[adj_1_ua] фраг іншій команді. -%k loses another friend.,OB_FRIENDLY4,,,,%k ztratil@[ao_cs] dalšího přítele.,%k mister endnu en ven.,%k hat wieder einen Freund verloren.,Ο/Η %k χάνει ακόμα έναν αλλο φίλο,%k perdis alian amikon.,%k ha perdido a otro amigo.,%k perdió a otro amigo.,%k menetti jälleen ystävän.,%k a perdu un autre ami.,%k elveszít egy másik barátot.,%k perde un altro amico.,%k はまた友達を失った。,%o 은(는) 친구를 원치 않았다.,%k verliest nog een vriend.,%k mister enda en venn.,%k tracil kolejnego przyjaciela.,%k perde mais um amigo.,,%k mai pierde un prieten.,Игрок %k потерял ещё одного друга.,%k је изгуби@[ao_1_sr] још једног пријатеља.,%k förlorar ännu en vän.,%k başka bir arkadaşını kaybetti.,%k втрати@[adj_1_ua] ще одного друга. -,,Pickup,,,,,,,,,,,,,,,,,,,,,,,,,, -Picked up the armor.,GOTARMOR,,,Picked up the armour.,Sebráno brnění.,Hentede rustningen.,Panzer genommen.,Πήρες την πανοπλία.,Vi trovis armaĵon.,Encuentras una armadura.,,Poimit panssarin.,Armure récupérée.,Felvettél egy páncélt.,Raccolto un'armatura.,アーマーを身に着けた。,방호구를 얻었다.,Je hebt het harnas opgepakt.,Plukket opp rustningen.,Zebrano zbroję.,Pegou uma armadura.,Apanhaste uma armadura.,Ai ridicat o armură.,Получена броня.,Покупили сте панцир.,Plockade upp rustningen.,Zırhı aldım.,Взято броню. -Picked up the MegaArmor!,GOTMEGA,,,Picked up the MegaArmour!,Sebráno MegaBrnění!,Hentede Mega-rustningen!,MegaPanzer genommen!,Πήρες την μέγα πανοπλία!,Vi trovis plejan armaĵon!,¡Encuentras una Megaarmadura!,,Poimit megapanssarin!,Méga-Armure récupérée!,Felvettél egy MegaPáncélt!,Raccolto una MegaArmatura!,メガアーマーを身に着けた!,메가아머를 얻었다!,Je hebt het megaharnas opgepakt!,Plukket opp mega rustningen!,Zebrano megazbroję!,Pegou uma Mega-armadura!,Apanhaste uma MegaArmadura.,Ai ridicat o MegaArmură!,Получена мегаброня!,Покупили сте мегапанцир!,Plockade upp mega rustningen!,MegaZırhı aldı!,Взято мегаброню! -Picked up a health bonus.,GOTHTHBONUS,,,,Sebráno bonusové zdraví.,Hentede en sundhedsbonus.,Gesundheitsbonus genommen.,Πήρες ένα bonus υγείας.,Vi trovis aldonan sanon.,Encuentras salud extra.,,Poimit terveyslisän.,Bonus de Santé récupéré.,Felvettél egy életbónuszt.,Raccolto un bonus di salute.,ヘルスボーナスを拾った。,체력 보너스를 얻었다.,Je hebt een gezondheidsbonus opgepakt.,Plukket opp en helsebonus.,Zebrano bonus do zdrowia.,Pegou um bônus de saúde.,Apanhaste um bônus de vida.,Ai ridicat un bonus de sănătate.,Получен бонус к здоровью.,Покупили сте бонус здравља.,Plockade upp en hälsobonus.,Bir sağlık bonusu aldı.,Взято бонус здоров'я. -Picked up an armor bonus.,GOTARMBONUS,,,Picked up an armour bonus.,Sebráno bonusové brnění.,Hentede en rustningsbonus.,Panzerbonus genommen.,Πήρες ένα bonus πανο.πλίας.,Vi trovis aldonan kirason.,Encuentras blindaje extra.,,Poimit panssarilisän.,Bonus d'Armure récupéré.,Felvettél egy páncélbónuszt.,Raccolto un bonus d'armatura.,アーマーボーナスを拾った。,보호 보너스를 얻었다.,Je hebt een harnasbonus opgepakt.,Plukket opp en rustningsbonus.,Zebrano bonus do zbroi.,Pegou um bônus de armadura.,Apanhaste um bônus de armadura.,Ai ridicat un bonus de armură.,Получен бонус к броне.,Покупили сте бонус панцира.,Plockade upp en rustningsbonus.,Bir zırh bonusu aldı.,Взято бонус броні. -Picked up a stimpack.,GOTSTIM,,,,Sebrán stimulant.,Hentede en stimpack.,Stimpack genommen.,Πήρες ένα μικρό πακέτο υγείας.,Vi trovis stimulilo-pakon.,Encuentras un estimulante.,,Poimit piristeruiskeen.,Stimpack récupéré.,Felvettél egy szurit.,Raccolto uno stimpack.,スティムパックを拾った。,스팀팩을 사용했다.,Je hebt een opwekpakket opgepakt.,Plukket opp en stimpack.,Zebrano małą apteczkę.,Pegou um estimulante.,Apanhaste um kit de primeiros socorros.,Ai ridicat un kit de prim-ajutor mic.,Получен стимулятор.,Покупили сте стимпак.,Plockade upp en stimpack.,Bir uyarıcı aldı.,Взято стимулятор. -Picked up a medikit that you REALLY need!,GOTMEDINEED,,,,"Sebrána lékárnička, kterou jsi FAKT potřeboval@[ao_cs].","Hentede en medikit, som du VIRKELIG har brug for!","Medikit genommen, das du WIRKLICH brauchst!",Πήρες πρώτες βοήθειες που χρειαζόσουνα ΠΆΡΑ ΠΟΛΥ!,"Vi trovis sukurkeston, kiun vi VERE bezonas!",¡Encuentras un botiquín que REALMENTE necesitabas!,,"Poimit lääkintälaukun, jota TODELLA tarvitsit!","Médikit récupéré, et vous en aviez vraiment besoin!",Felvettél egy életcsomagot amire NAGYON szükséged volt már!,Hai raccolto un kit medico di cui avevi PROPRIO bisogno!,本当に必要なメディキットを手に入れた!,메디킷을 필요한 순간에 사용했다!,"Je hebt een verbandsdoos, die je ECHT nodig had, opgepakt!",Plukket opp en medikit som du virkelig trenger!,"Zebrano apteczkę, w OSTATNIEJ chwili!","Pegou um kit médico +",%o døde.,%o ist gestorben.,@[art_gr] %o πέθανε,%o mortis.,%o ha muerto.,%o murió.,%o kuoli.,%o est mort@[e_fr].,,%o meghalt.,%o è morto.,%o は死亡した。,%o 은(는) 죽었다.,%o ging dood.,%o døde.,%o umarł@[ao_pl].,%o morreu.,,%o a murit.,Игрок %o погиб.,%o је умр@[ao_1_sr].,%o dog.,%o öldü.,%o помер@[adj_3_ua]. +%o was killed by %k.,OB_MPDEFAULT,,,,%o byl@[ao_cs] zabit@[ao_cs] hráčem %k.,%o blev dræbt af %k.,%o wurde von %k getötet.,@[art_gr] %o στοτώθηκε απο τον/την %k,%o estis mortigita de %k.,A %o l@[ao_esp] ha matado %k.,A %o l@[ao_esp] mató %k.,%k tappoi %o paran.,%o a été tué@[e_fr] par %k.,,%k megölte %o-t.,%o è stato ucciso da %k,%o は %k によって殺された。,%o 은(는) %k 에 의해 죽임을 당했다.,%o werd gedood door %k.,%o ble drept av %k.,%o został@[ao_pl] zabit@[adj_pl] przez %k.,%o foi mort@[ao_ptb] por %k.,,%o a fost omorât de către %k.,Игрока %o убил игрок %k.,Играча %o је уби@[ao_1_sr] %k.,%o dödades av %k.,"%o, %k tarafından öldürüldü.",%o вбито гравцем %k. +%k mows down a teammate.,OB_FRIENDLY1,,,,%o rozsekal@[ao_cs] spoluhráče.,%k mejer en holdkammerat ned.,%o wurde von einem Teamkameraden niedergestreckt.,Ο/Η %k σκότωσε έναν σύμαχο,%k buĉas teamanon.,%k ha acribillado a un compañero.,%k acribilló a un compañero.,%k niitti joukkuetoverin.,%k élimine un de ses équipiers.,,%k lekaszabolta a csapattársát.,%k falcia via un compagno.,%k は仲間を無慈悲に殺した。,%o 은(는) 자신의 팀원을 죽였다.,%k maait een teamgenoot neer.,%k meier ned en lagkamerat.,%k kosi kompana.,%k matou um colega de equipe.,%k matou um companheiro de equipa.,%k face pulbere pe un coechipier.,Игрок %k сбивает союзника.,%k је обори@[ao_1_sr] саиграча.,%k mejar ner en lagkamrat.,%k bir takım arkadaşını biçti.,%k скоси@[adj_1_ua] соратника. +%k seems to need glasses.,OB_FRIENDLY2,English was changed to remove problematic pronoun referencing the killer,,,%k nejspíš potřebuje brýle.,%k har tilsyneladende brug for briller.,%k sollte eine Brille benutzen.,Ο/Η %k φαίνεται να χρειάζετε γυαλία,%o ŝajnas bezoni okulvitrojn.,%k parece necesitar gafas.,%k parece necesitar lentes.,%k näyttää tarvitsevan laseja.,%k vérifie ses lunettes.,,%k-nak szemüvegre van szüksége.,%k sembra che abbia bisogno di occhiali.,%k には眼鏡が必要なようだ。,%o 은(는) 자신의 안경을 확인했다.,%k lijkt een bril nodig te hebben.,%k ser ut til å trenge briller.,%k wydaje się potrzebować okularów.,%k parece que precisa de óculos.,,%k pare să aibă nevoie de ochelari.,Игроку %k следует носить свои очки.,Играчу %k би приличиле наочаре.,%k verkar behöva glasögon.,%k net göremiyor,"Схоже, що %k потрібні окуляри." +%k gets a frag for the other team.,OB_FRIENDLY3,,,,%k dostal@[ao_cs] frag pro další tým.,%k får en fragment til det andet hold.,%k macht für das andere Team einen Punkt.,Ο/Η %k πάιρνει έναν κοματιασμό για την άλλη ομάδα.,%k gajnas ludmurdon por la alia teamo.,%k ha marcado una baja para el otro equipo.,%k marcó una baja para el otro equipo.,%k teki frägin vieraalle joukkueelle.,%k marque un point pour l'autre équipe.,,%k szerez egy frag-et a másik csapatnak.,%k regala un frag all'altro team.,%k は敵チームに得点を入れた。,%o 은(는) 의도치 않게 상대방 팀을 도왔다.,%k doet een frag voor het andere team.,%k får en frag for det andre laget.,%k zdobywa fraga dla przeciwnej drużyny.,%k dá um frag para o outro time.,%k dá um frag para a outra equipa.,%k face o victimă pentru echipa adversă.,Игрок %k преподнёс другой команде фраг.,%k осваја фраг за други тим.,%k får ett frag till det andra laget.,%k diğer takım için bir parça aldı.,%k відда@[adj_1_ua] фраг іншій команді. +%k loses another friend.,OB_FRIENDLY4,,,,%k ztratil@[ao_cs] dalšího přítele.,%k mister endnu en ven.,%k hat wieder einen Freund verloren.,Ο/Η %k χάνει ακόμα έναν αλλο φίλο,%k perdis alian amikon.,%k ha perdido a otro amigo.,%k perdió a otro amigo.,%k menetti jälleen ystävän.,%k a perdu un autre ami.,,%k elveszít egy másik barátot.,%k perde un altro amico.,%k はまた友達を失った。,%o 은(는) 친구를 원치 않았다.,%k verliest nog een vriend.,%k mister enda en venn.,%k tracil kolejnego przyjaciela.,%k perde mais um amigo.,,%k mai pierde un prieten.,Игрок %k потерял ещё одного друга.,%k је изгуби@[ao_1_sr] још једног пријатеља.,%k förlorar ännu en vän.,%k başka bir arkadaşını kaybetti.,%k втрати@[adj_1_ua] ще одного друга. +,,Pickup,,,,,,,,,,,,,,,,,,,,,,,,,,, +Picked up the armor.,GOTARMOR,,,Picked up the armour.,Sebráno brnění.,Hentede rustningen.,Panzer genommen.,Πήρες την πανοπλία.,Vi trovis armaĵon.,Encuentras una armadura.,,Poimit panssarin.,Armure récupérée.,,Felvettél egy páncélt.,Raccolto un'armatura.,アーマーを身に着けた。,방호구를 얻었다.,Je hebt het harnas opgepakt.,Plukket opp rustningen.,Zebrano zbroję.,Pegou uma armadura.,Apanhaste uma armadura.,Ai ridicat o armură.,Получена броня.,Покупили сте панцир.,Plockade upp rustningen.,Zırhı aldım.,Взято броню. +Picked up the MegaArmor!,GOTMEGA,,,Picked up the MegaArmour!,Sebráno MegaBrnění!,Hentede Mega-rustningen!,MegaPanzer genommen!,Πήρες την μέγα πανοπλία!,Vi trovis plejan armaĵon!,¡Encuentras una Megaarmadura!,,Poimit megapanssarin!,Méga-Armure récupérée!,,Felvettél egy MegaPáncélt!,Raccolto una MegaArmatura!,メガアーマーを身に着けた!,메가아머를 얻었다!,Je hebt het megaharnas opgepakt!,Plukket opp mega rustningen!,Zebrano megazbroję!,Pegou uma Mega-armadura!,Apanhaste uma MegaArmadura.,Ai ridicat o MegaArmură!,Получена мегаброня!,Покупили сте мегапанцир!,Plockade upp mega rustningen!,MegaZırhı aldı!,Взято мегаброню! +Picked up a health bonus.,GOTHTHBONUS,,,,Sebráno bonusové zdraví.,Hentede en sundhedsbonus.,Gesundheitsbonus genommen.,Πήρες ένα bonus υγείας.,Vi trovis aldonan sanon.,Encuentras salud extra.,,Poimit terveyslisän.,Bonus de Santé récupéré.,,Felvettél egy életbónuszt.,Raccolto un bonus di salute.,ヘルスボーナスを拾った。,체력 보너스를 얻었다.,Je hebt een gezondheidsbonus opgepakt.,Plukket opp en helsebonus.,Zebrano bonus do zdrowia.,Pegou um bônus de saúde.,Apanhaste um bônus de vida.,Ai ridicat un bonus de sănătate.,Получен бонус к здоровью.,Покупили сте бонус здравља.,Plockade upp en hälsobonus.,Bir sağlık bonusu aldı.,Взято бонус здоров'я. +Picked up an armor bonus.,GOTARMBONUS,,,Picked up an armour bonus.,Sebráno bonusové brnění.,Hentede en rustningsbonus.,Panzerbonus genommen.,Πήρες ένα bonus πανο.πλίας.,Vi trovis aldonan kirason.,Encuentras blindaje extra.,,Poimit panssarilisän.,Bonus d'Armure récupéré.,,Felvettél egy páncélbónuszt.,Raccolto un bonus d'armatura.,アーマーボーナスを拾った。,보호 보너스를 얻었다.,Je hebt een harnasbonus opgepakt.,Plukket opp en rustningsbonus.,Zebrano bonus do zbroi.,Pegou um bônus de armadura.,Apanhaste um bônus de armadura.,Ai ridicat un bonus de armură.,Получен бонус к броне.,Покупили сте бонус панцира.,Plockade upp en rustningsbonus.,Bir zırh bonusu aldı.,Взято бонус броні. +Picked up a stimpack.,GOTSTIM,,,,Sebrán stimulant.,Hentede en stimpack.,Stimpack genommen.,Πήρες ένα μικρό πακέτο υγείας.,Vi trovis stimulilo-pakon.,Encuentras un estimulante.,,Poimit piristeruiskeen.,Stimpack récupéré.,,Felvettél egy szurit.,Raccolto uno stimpack.,スティムパックを拾った。,스팀팩을 사용했다.,Je hebt een opwekpakket opgepakt.,Plukket opp en stimpack.,Zebrano małą apteczkę.,Pegou um estimulante.,Apanhaste um kit de primeiros socorros.,Ai ridicat un kit de prim-ajutor mic.,Получен стимулятор.,Покупили сте стимпак.,Plockade upp en stimpack.,Bir uyarıcı aldı.,Взято стимулятор. +Picked up a medikit that you REALLY need!,GOTMEDINEED,,,,"Sebrána lékárnička, kterou jsi FAKT potřeboval@[ao_cs].","Hentede en medikit, som du VIRKELIG har brug for!","Medikit genommen, das du WIRKLICH brauchst!",Πήρες πρώτες βοήθειες που χρειαζόσουνα ΠΆΡΑ ΠΟΛΥ!,"Vi trovis sukurkeston, kiun vi VERE bezonas!",¡Encuentras un botiquín que REALMENTE necesitabas!,,"Poimit lääkintälaukun, jota TODELLA tarvitsit!","Médikit récupéré, et vous en aviez vraiment besoin!",,Felvettél egy életcsomagot amire NAGYON szükséged volt már!,Hai raccolto un kit medico di cui avevi PROPRIO bisogno!,本当に必要なメディキットを手に入れた!,메디킷을 필요한 순간에 사용했다!,"Je hebt een verbandsdoos, die je ECHT nodig had, opgepakt!",Plukket opp en medikit som du virkelig trenger!,"Zebrano apteczkę, w OSTATNIEJ chwili!","Pegou um kit médico que você REALMENTE precisava!","Apanhaste um kit médico que estavas MESMO a precisar!","Ai ridicat un kit de prim-ajutor de care CHIAR aveai nevoie!",Получена КРАЙНЕ необходимая аптечка!,Покупили сте медикит који вам је СТВАРНО потребан!,Plockade upp en medikit som du VÄLDIGT behöver!,GERÇEKTEN ihtiyacın olan bir medikit aldı!,Взято КРАЙНЄ необхідну аптечку! -Picked up a medikit.,GOTMEDIKIT,,,,Sebrána lékárnička.,Samlede en medikit op.,Medikit genommen.,Πήρες πρώτες βοήθειες.,Vi trovis sukurkeston.,Encuentras un botiquín.,,Poimit lääkintälaukun.,Médikit récupéré.,Felvettél egy életcsomagot.,Raccolto un kit medico.,メディキットを拾った。,메디킷을 사용했다.,Je hebt een verbandsdoos opgepakt.,Plukket opp en medikit.,Zebrano apteczkę.,Pegou um kit médico.,Apanhaste um kit médico.,Ai ridicat un kit de prim-ajutor.,Получена аптечка.,Покупили сте медикит.,Plockade upp en medikit.,Bir medikit aldı.,Взято аптечку. -Supercharge!,GOTSUPER,,,,Superzdraví!,,Super-Ladung!,Υπερφόρτοση!,Superŝargo!,¡Supercarga!,,Supervaraus!,,Szupertöltés!,Sfera dell'Anima!,スーパーチャージ!,슈퍼차지!,,,Supernaładowanie!,Supercarga!,,Superîncărcătură!,Сверхзаряд!,Супернабој!,Superladdning!,Süper şarj!,Суперзаряд! -Picked up a blue keycard.,GOTBLUECARD,,,,Sebrána modrá karta.,Samlede et blåt nøglekort op.,Blaue Schlüsselkarte genommen.,Πήρες ένα μπλε κλειδί.,Vi trovis bluan ŝlosilkarton.,Encuentras una tarjeta de acceso azul.,,Poimit sinisen avainkortin.,Carte d'accès BLEUE récupérée.,Felvettél egy kék kulcskártyát.,Raccolta una card d'accesso blu.,ブルー キーカードを手に入れた。,청색 키카드를 얻었다.,Je hebt een blauwe sleutelkaart opgepakt.,Plukket opp et blått nøkkelkort.,Zebrano niebieską kartę klucz.,Pegou um cartão de acesso azul.,Apanhaste um cartão de acesso azul.,Ai ridicat un card cheie albastru.,Получена синяя ключ-карта.,Покупили сте плаву кључну карту.,Plockade upp ett blått nyckelkort.,Mavi bir anahtar kartı aldı.,Взято синю ключ-карту. -Picked up a yellow keycard.,GOTYELWCARD,,,,Sebrána žlutá karta.,Samlede et gult nøglekort op.,Gelbe Schlüsselkarte genommen.,Πήρες ένα κύτρινο κλειδί.,Vi trovis flavan ŝlosilkarton.,Encuentras una tarjeta de acceso amarilla.,,Poimit keltaisen avainkortin.,Carte d'accès JAUNE récupérée.,Felvettél egy sárga kulcskártyát.,Raccolta una card d'accesso gialla.,イエローキーカードを手に入れた。,황색 키카드를 얻었다.,Je hebt een gele sleutelkaart opgepakt.,Plukket opp et gult nøkkelkort.,Zebrano żółtą kartę klucz.,Pegou um cartão de acesso amarelo.,Apanhaste um cartão de acesso amarelo.,Ai ridicat un card cheie galben.,Получена жёлтая ключ-карта.,Покупили сте жуту кључну карту.,Plockade upp ett gult nyckelkort.,Sarı bir anahtar kartı aldı.,Взято жовту ключ-карту. -Picked up a red keycard.,GOTREDCARD,,,,Sebrána červená karta.,Samlede et rødt nøglekort op.,Rote Schlüsselkarte genommen.,Πήρες ένα κόκινο κλειδί.,Vi trovis ruĝan ŝlosilkarton.,Encuentras una tarjeta de acceso roja.,,Poimit punaisen avainkortin.,Carte d'accès ROUGE récupérée.,Felvettél egy piros kulcskártyát.,Raccolta una card d'accesso rossa.,レッド キーカードを手に入れた。,적색 키카드를 얻었다.,Je hebt een rode sleutelkaart opgepakt.,Plukket opp et rødt nøkkelkort.,Zebrano czerwoną kartę klucz.,Pegou um cartão de acesso vermelho.,Apanhaste um cartão de acesso vermelho.,Ai ridicat un card cheie roșu.,Получена красная ключ-карта.,Покупили сте црвену кључну карту.,Plockade upp ett rött nyckelkort.,Kırmızı bir anahtar kartı aldı.,Взято червону ключ-карту. -Picked up a blue skull key.,GOTBLUESKUL,,,,Sebrána modrá lebka.,Samlede en blå kranie-nøgle op.,Blauen Schädel-Schlüssel genommen.,Πήρες ένα μπλε κρανίο.,Vi trovis bluan kraniŝlosilon.,Encuentras una llave de calavera azul.,,Poimit sinisen kalloavaimen.,Clef Crâne BLEUE récupérée.,Felvettél egy kék koponyakulcsot.,Raccolta una chiave-teschio blu.,ブルー スカルキーを手に入れた。,청색 해골열쇠를 얻었다.,Je hebt een blauwe schedelsleutel opgepakt.,Plukket opp en blå hodeskallenøkkel.,Zebrano niebieską czaszkę.,Pegou uma chave-crânio azul.,Apanhaste uma chave crânio azul.,Ai ridicat o cheie craniu albastră.,Получен синий череп-ключ.,Покупили сте плави кључ лобање.,Plockade upp en blå dödskalle-nyckel.,Mavi bir kafatası anahtarı aldı.,Взято синій ключ-череп. -Picked up a yellow skull key.,GOTYELWSKUL,,,,Sebrána žlutá lebka.,Samlede en gul kranie-nøgle op.,Geben Schädel-Schlüssel genommen.,Πήρες ένα κύτρινο κρανίο.,Vi trovis flavan kraniŝlosilon.,Encuentras una llave de calavera amarilla,,Poimit keltaisen kalloavaimen.,Clef Crâne JAUNE récupérée.,Felvettél egy sárga koponyakulcsot.,Raccolta una chiave-teschio gialla.,イエロースカルキーを手に入れた。,황색 해골열쇠를 얻었다.,Je hebt een gele schedelsleutel opgepakt.,Plukket opp en gul hodeskallenøkkel.,Zebrano żółtą czaszkę.,Pegou uma chave-crânio amarela.,Apanhaste uma chave crânio amarela.,Ai ridicat o cheie craniu galbenă.,Получен жёлтый череп-ключ.,Покупили сте жути кључ лобање.,Plockade upp en gul dödskalle-nyckel.,Sarı bir kafatası anahtarı aldı.,Взято жовтий ключ-череп. -Picked up a red skull key.,GOTREDSKUL,,,,Sebrána červená lebka.,Samlede en rød kranie-nøgle op.,Roten Schädel-Schlüssel genommen.,Πήρες ένα κοκινο κρανίο.,Vi trovis ruĝan kraniŝlosilon.,Encuentras una llave de calavera roja.,,Poimit punaisen kalloavaimen.,Clef Crâne ROUGE récupérée.,Felvettél egy piros koponyakulcsot.,Raccolta una chiave-teschio rossa.,レッド スカルキーを手に入れた。,적색 해골열쇠를 얻었다.,Je hebt een rode schedelsleutel opgepakt.,Plukket opp en rød hodeskallenøkkel.,Zebrano czerwoną czaszkę.,Pegou uma chave-crânio vermelha.,Apanhaste uma chave crânio vermelha.,Ai ridicat o cheie craniu roșie.,Получен красный череп-ключ.,Покупили сте црвени кључ лобање.,Plockade upp en röd dödskalle-nyckel.,Kırmızı kafatası anahtarı aldı.,Взято червоний ключ-череп. -Invulnerability!,GOTINVUL,,,,Nezranitelnost!,Udsårbarhed!,Unverwundbarkeit!,Αθανασία!,Nevundebleco!,¡Invulnerabilidad!,,Haavoittumattomuus!,Invulnérabilité!,Sérthetetlenség!,Invulnerabilità!,不死身だ!,무적!,Onkwetsbaarheid!,Usårbarhet!,Niezniszczalność!,Invulnerabilidade!,,Invincibilitate!,Неуязвимость!,Нерањивост!,Osårbarhet!,Dokunulmazlık!,Невразливість! -Berserk!,GOTBERSERK,,,,,,,Μανία!,Furiozigaĵo!,¡Berserker!,,Raivo!,,Dühödt mód!,,バーサーク!,광전사!,,,Szał!,Frenesi!,,Forță amplificată!,Берсерк!,Берсерк!,,,Берсерк! -Partial Invisibility,GOTINVIS,,,,Částečná neviditelnost,Delvis usynlighed,Teilweise Unsichtbarkeit,Ημη-αoρατότητα,Parta nevidebleco,Invisibilidad parcial,,Osittainen näkymättömyys,Invisibilité Partielle,Részleges láthatatlanság,Invisibilità parziale,半透明化スフィア,일시적 투명 효과!,Gedeeltelijke onzichtbaarheid,Delvis usynlighet,Częściowa niewidzialność,Invisibilidade parcial,,Invizibilitate parțială,Частичная невидимость.,Делимична невидљивост,Partiell osynlighet,Kısmi Görünmezlik,Часткова невидимість -Radiation Shielding Suit,GOTSUIT,,,,Ochranný oblek proti radioaktivitě,Stråleafskærmningsdragt,Strahlenschutzanzug.,Προστατευτηκή Στολή,Radiado-ŝirma vesto,Traje antiradiación,,Säteilysuojapuku,Combinaison Hazmat,Védőruha,Tuta anti-radiazioni,放射線防護服 ,방사능 보호복,Stralingsbeschermingspak,Strålingsskjermingsdrakt,Kombinezon przeciwradiacyjny,Traje antirradiação,Fato anti-radiação,Costum de protecție împotriva radiaților,Костюм радиационной защиты.,Одело против радијације,Strålningsskyddande dräkt,Radyasyon Koruyucu Giysi,Антирадіаційний костюм -Computer Area Map,GOTMAP,,,,Počítačová mapa,Computerkort.,Computerkarte.,Τοπικός Χάρτης,Plena mapo,Mapa completo,,Alueen tietokonekartta,Carte Informatique,Térkép,Mappa Completata,コンピューターエリアマップ,구역 지도 컴퓨터,Computerkaart,Datakart,Mapa obszaru,Mapa completo,,Hartă completă,Компьютерная карта уровня.,Компјутерска мапа нивоа,Karta över datorområdet,Bilgisayar Alanı Haritası,Комп'ютерна карта району -Light Amplification Visor,GOTVISOR,,,,Noktovizor,Lysforstærkningsvisir,Lichtverstärkungsgerät,Νυχτερινή Όραση,Vizilo de luma amplifikado,Visor de amplificación de luz,,Valonvahvistusvisiiri,Lunettes de Vision Nocturne,Éjjellátó sisak,Amplificatore di luce,"暗視バイザー +Picked up a medikit.,GOTMEDIKIT,,,,Sebrána lékárnička.,Samlede en medikit op.,Medikit genommen.,Πήρες πρώτες βοήθειες.,Vi trovis sukurkeston.,Encuentras un botiquín.,,Poimit lääkintälaukun.,Médikit récupéré.,,Felvettél egy életcsomagot.,Raccolto un kit medico.,メディキットを拾った。,메디킷을 사용했다.,Je hebt een verbandsdoos opgepakt.,Plukket opp en medikit.,Zebrano apteczkę.,Pegou um kit médico.,Apanhaste um kit médico.,Ai ridicat un kit de prim-ajutor.,Получена аптечка.,Покупили сте медикит.,Plockade upp en medikit.,Bir medikit aldı.,Взято аптечку. +Supercharge!,GOTSUPER,,,,Superzdraví!,,Super-Ladung!,Υπερφόρτοση!,Superŝargo!,¡Supercarga!,,Supervaraus!,,,Szupertöltés!,Sfera dell'Anima!,スーパーチャージ!,슈퍼차지!,,,Supernaładowanie!,Supercarga!,,Superîncărcătură!,Сверхзаряд!,Супернабој!,Superladdning!,Süper şarj!,Суперзаряд! +Picked up a blue keycard.,GOTBLUECARD,,,,Sebrána modrá karta.,Samlede et blåt nøglekort op.,Blaue Schlüsselkarte genommen.,Πήρες ένα μπλε κλειδί.,Vi trovis bluan ŝlosilkarton.,Encuentras una tarjeta de acceso azul.,,Poimit sinisen avainkortin.,Carte d'accès BLEUE récupérée.,,Felvettél egy kék kulcskártyát.,Raccolta una card d'accesso blu.,ブルー キーカードを手に入れた。,청색 키카드를 얻었다.,Je hebt een blauwe sleutelkaart opgepakt.,Plukket opp et blått nøkkelkort.,Zebrano niebieską kartę klucz.,Pegou um cartão de acesso azul.,Apanhaste um cartão de acesso azul.,Ai ridicat un card cheie albastru.,Получена синяя ключ-карта.,Покупили сте плаву кључну карту.,Plockade upp ett blått nyckelkort.,Mavi bir anahtar kartı aldı.,Взято синю ключ-карту. +Picked up a yellow keycard.,GOTYELWCARD,,,,Sebrána žlutá karta.,Samlede et gult nøglekort op.,Gelbe Schlüsselkarte genommen.,Πήρες ένα κύτρινο κλειδί.,Vi trovis flavan ŝlosilkarton.,Encuentras una tarjeta de acceso amarilla.,,Poimit keltaisen avainkortin.,Carte d'accès JAUNE récupérée.,,Felvettél egy sárga kulcskártyát.,Raccolta una card d'accesso gialla.,イエローキーカードを手に入れた。,황색 키카드를 얻었다.,Je hebt een gele sleutelkaart opgepakt.,Plukket opp et gult nøkkelkort.,Zebrano żółtą kartę klucz.,Pegou um cartão de acesso amarelo.,Apanhaste um cartão de acesso amarelo.,Ai ridicat un card cheie galben.,Получена жёлтая ключ-карта.,Покупили сте жуту кључну карту.,Plockade upp ett gult nyckelkort.,Sarı bir anahtar kartı aldı.,Взято жовту ключ-карту. +Picked up a red keycard.,GOTREDCARD,,,,Sebrána červená karta.,Samlede et rødt nøglekort op.,Rote Schlüsselkarte genommen.,Πήρες ένα κόκινο κλειδί.,Vi trovis ruĝan ŝlosilkarton.,Encuentras una tarjeta de acceso roja.,,Poimit punaisen avainkortin.,Carte d'accès ROUGE récupérée.,,Felvettél egy piros kulcskártyát.,Raccolta una card d'accesso rossa.,レッド キーカードを手に入れた。,적색 키카드를 얻었다.,Je hebt een rode sleutelkaart opgepakt.,Plukket opp et rødt nøkkelkort.,Zebrano czerwoną kartę klucz.,Pegou um cartão de acesso vermelho.,Apanhaste um cartão de acesso vermelho.,Ai ridicat un card cheie roșu.,Получена красная ключ-карта.,Покупили сте црвену кључну карту.,Plockade upp ett rött nyckelkort.,Kırmızı bir anahtar kartı aldı.,Взято червону ключ-карту. +Picked up a blue skull key.,GOTBLUESKUL,,,,Sebrána modrá lebka.,Samlede en blå kranie-nøgle op.,Blauen Schädel-Schlüssel genommen.,Πήρες ένα μπλε κρανίο.,Vi trovis bluan kraniŝlosilon.,Encuentras una llave de calavera azul.,,Poimit sinisen kalloavaimen.,Clef Crâne BLEUE récupérée.,,Felvettél egy kék koponyakulcsot.,Raccolta una chiave-teschio blu.,ブルー スカルキーを手に入れた。,청색 해골열쇠를 얻었다.,Je hebt een blauwe schedelsleutel opgepakt.,Plukket opp en blå hodeskallenøkkel.,Zebrano niebieską czaszkę.,Pegou uma chave-crânio azul.,Apanhaste uma chave crânio azul.,Ai ridicat o cheie craniu albastră.,Получен синий череп-ключ.,Покупили сте плави кључ лобање.,Plockade upp en blå dödskalle-nyckel.,Mavi bir kafatası anahtarı aldı.,Взято синій ключ-череп. +Picked up a yellow skull key.,GOTYELWSKUL,,,,Sebrána žlutá lebka.,Samlede en gul kranie-nøgle op.,Geben Schädel-Schlüssel genommen.,Πήρες ένα κύτρινο κρανίο.,Vi trovis flavan kraniŝlosilon.,Encuentras una llave de calavera amarilla,,Poimit keltaisen kalloavaimen.,Clef Crâne JAUNE récupérée.,,Felvettél egy sárga koponyakulcsot.,Raccolta una chiave-teschio gialla.,イエロースカルキーを手に入れた。,황색 해골열쇠를 얻었다.,Je hebt een gele schedelsleutel opgepakt.,Plukket opp en gul hodeskallenøkkel.,Zebrano żółtą czaszkę.,Pegou uma chave-crânio amarela.,Apanhaste uma chave crânio amarela.,Ai ridicat o cheie craniu galbenă.,Получен жёлтый череп-ключ.,Покупили сте жути кључ лобање.,Plockade upp en gul dödskalle-nyckel.,Sarı bir kafatası anahtarı aldı.,Взято жовтий ключ-череп. +Picked up a red skull key.,GOTREDSKUL,,,,Sebrána červená lebka.,Samlede en rød kranie-nøgle op.,Roten Schädel-Schlüssel genommen.,Πήρες ένα κοκινο κρανίο.,Vi trovis ruĝan kraniŝlosilon.,Encuentras una llave de calavera roja.,,Poimit punaisen kalloavaimen.,Clef Crâne ROUGE récupérée.,,Felvettél egy piros koponyakulcsot.,Raccolta una chiave-teschio rossa.,レッド スカルキーを手に入れた。,적색 해골열쇠를 얻었다.,Je hebt een rode schedelsleutel opgepakt.,Plukket opp en rød hodeskallenøkkel.,Zebrano czerwoną czaszkę.,Pegou uma chave-crânio vermelha.,Apanhaste uma chave crânio vermelha.,Ai ridicat o cheie craniu roșie.,Получен красный череп-ключ.,Покупили сте црвени кључ лобање.,Plockade upp en röd dödskalle-nyckel.,Kırmızı kafatası anahtarı aldı.,Взято червоний ключ-череп. +Invulnerability!,GOTINVUL,,,,Nezranitelnost!,Udsårbarhed!,Unverwundbarkeit!,Αθανασία!,Nevundebleco!,¡Invulnerabilidad!,,Haavoittumattomuus!,Invulnérabilité!,,Sérthetetlenség!,Invulnerabilità!,不死身だ!,무적!,Onkwetsbaarheid!,Usårbarhet!,Niezniszczalność!,Invulnerabilidade!,,Invincibilitate!,Неуязвимость!,Нерањивост!,Osårbarhet!,Dokunulmazlık!,Невразливість! +Berserk!,GOTBERSERK,,,,,,,Μανία!,Furiozigaĵo!,¡Berserker!,,Raivo!,,,Dühödt mód!,,バーサーク!,광전사!,,,Szał!,Frenesi!,,Forță amplificată!,Берсерк!,Берсерк!,,,Берсерк! +Partial Invisibility,GOTINVIS,,,,Částečná neviditelnost,Delvis usynlighed,Teilweise Unsichtbarkeit,Ημη-αoρατότητα,Parta nevidebleco,Invisibilidad parcial,,Osittainen näkymättömyys,Invisibilité Partielle,,Részleges láthatatlanság,Invisibilità parziale,半透明化スフィア,일시적 투명 효과!,Gedeeltelijke onzichtbaarheid,Delvis usynlighet,Częściowa niewidzialność,Invisibilidade parcial,,Invizibilitate parțială,Частичная невидимость.,Делимична невидљивост,Partiell osynlighet,Kısmi Görünmezlik,Часткова невидимість +Radiation Shielding Suit,GOTSUIT,,,,Ochranný oblek proti radioaktivitě,Stråleafskærmningsdragt,Strahlenschutzanzug.,Προστατευτηκή Στολή,Radiado-ŝirma vesto,Traje antiradiación,,Säteilysuojapuku,Combinaison Hazmat,,Védőruha,Tuta anti-radiazioni,放射線防護服 ,방사능 보호복,Stralingsbeschermingspak,Strålingsskjermingsdrakt,Kombinezon przeciwradiacyjny,Traje antirradiação,Fato anti-radiação,Costum de protecție împotriva radiaților,Костюм радиационной защиты.,Одело против радијације,Strålningsskyddande dräkt,Radyasyon Koruyucu Giysi,Антирадіаційний костюм +Computer Area Map,GOTMAP,,,,Počítačová mapa,Computerkort.,Computerkarte.,Τοπικός Χάρτης,Plena mapo,Mapa completo,,Alueen tietokonekartta,Carte Informatique,,Térkép,Mappa Completata,コンピューターエリアマップ,구역 지도 컴퓨터,Computerkaart,Datakart,Mapa obszaru,Mapa completo,,Hartă completă,Компьютерная карта уровня.,Компјутерска мапа нивоа,Karta över datorområdet,Bilgisayar Alanı Haritası,Комп'ютерна карта району +Light Amplification Visor,GOTVISOR,,,,Noktovizor,Lysforstærkningsvisir,Lichtverstärkungsgerät,Νυχτερινή Όραση,Vizilo de luma amplifikado,Visor de amplificación de luz,,Valonvahvistusvisiiri,Lunettes de Vision Nocturne,,Éjjellátó sisak,Amplificatore di luce,"暗視バイザー ",야간투시 바이저,Lichtversterkingsvizier,Lysforsterkende visir,Gogle noktowizyjne,Visor de amplificação de luz,Visor de amplificação luminosa,Vedere amplificată,Очки ночного видения.,Ноћни визир,Ljusförstärkande visir,Işık Amplifikasyon Vizörü,Окуляри нічного бачення -MegaSphere!,GOTMSPHERE,,,,MegaSféra!,,MegaSphäre!,Μεγασφαίρα!,Pleja sfero!,¡MegaEsfera!,,Megakuula!,Mégasphère!,MegaGömb!,MegaSfera!,メガスフィアー!,메가스피어!,,,Megasfera!,Megaesfera!,,Megasferă!,Мегасфера!,Мегасфера!,,MegaSfer!,Мегасфера! -Picked up a clip.,GOTCLIP,,,,Sebrán zásobník.,Hentede et magasin med kugler.,Magazin genommen.,Πήρες ένα κουτάκι σφαιρών.,Vi trovis magazenon.,Encuentras un cargador.,,Poimit lippaan.,Chargeur récupéré.,Felvettél egy töltényt.,Raccolto un caricatore.,弾倉を拾った。,탄창을 얻었다.,Je hebt een patroon opgepakt.,Plukket opp et magasin.,Zebrano magazynek.,Pegou um carregador.,Apanhaste um carregador,Ai ridicat un cartuș.,Получен магазин.,Покупили сте оквир.,Plockade upp ett klipp.,Bir şarjör aldım.,Взято набійницю. -Picked up a box of bullets.,GOTCLIPBOX,,,,Sebrána krabice s kulkami.,Hentede en kasse med kugler.,Kiste mit Pistolenkugeln genommen.,Πήρες ένα κουτί με σφαίρες.,Vi trovis skatolon da kugloj.,Encuentras una caja de balas.,,Poimit laatikollisen luoteja.,Boîte de balles récupérée.,Felvettél egy doboz töltényt.,Raccolta una scatola di proiettili.,弾薬箱を拾った。,실탄 탄통을 얻었다.,Je hebt een doos kogels opgepakt.,Plukket opp en eske med kuler.,Zebrano pudełko z nabojami.,Pegou uma caixa de balas.,Apanhaste uma caixa de balas,Ai ridicat o cutie cu gloanțe.,Получена коробка пуль.,Покупили сте кутију метака.,Plockade upp en låda med kulor.,Bir kutu mermi aldı.,Взято коробку набоїв. -Picked up a rocket.,GOTROCKET,,,,Sebrána raketa.,Hentede en raket.,Rakete genommen,Πήρες ένα πύραυλο.,Vi trovis misilon.,Encuentras un misil.,,Poimit raketin.,Roquette récupérée.,Felvettél egy rakétát.,Raccolto un razzo.,ロケットを拾った。,로켓을 얻었다.,Je hebt een raket opgepakt.,Plukket opp en rakett.,Zebrano rakietę.,Pegou um foguete.,Apanhaste um míssil,Ai ridicat o rachetă.,Получена ракета.,Покупили сте ракету.,Plockade upp en raket.,Bir roket aldı.,Взято ракету. -Picked up a box of rockets.,GOTROCKBOX,,,,Sebrána krabice s raketami.,Hentede en kasse med raketter.,Kiste mit Raketen genommen.,Πήρες ένα κουτί με πυράυλους.,Vi trovis keston da misiloj.,Encuentras una caja de misiles.,,Poimit laatikollisen raketteja.,Caisse de roquettes récupérée.,Felvettél egy doboz rakétát.,Raccolta una cassa di razzi.,ロケット箱を拾った。,로켓 상자를 얻었다.,Je hebt een doos raketten opgepakt.,Plukket opp en eske med raketter.,Zebrano pudełko z rakietami.,Pegou uma caixa de foguetes.,Apanhaste uma caixa de mísseis,Ai ridicat o cutie cu rachete.,Получен ящик ракет.,Покупили сте кутију ракета.,Plockade upp en låda med raketer.,Bir kutu roket aldı.,Взято коробку з ракетами. -Picked up an energy cell.,GOTCELL,,,,Sebrán energetický článek.,Hentede en energicelle.,Energiezelle genommen.,Πήρες ένα κύτταρο ενέργιας.,Vi trovis energiĉelon.,Encuentras una célula de energía.,,Poimit energia-akun.,Cellule énergétique récupérée.,Felvettél egy energia cellát.,Raccolta una batteria.,エネルギーセルを拾った。,에너지 셀을 얻었다.,Je hebt een energiecel opgepakt.,Plukket opp en energicelle.,Zebrano ogniwo energetyczne.,Pegou uma célula de energia.,Apanhaste uma célula de energia,Ai ridicat o celulă cu energie.,Получена энергобатарея.,Покупили сте енергетску ћелију.,Plockade upp en energicell.,Bir enerji hücresi aldı.,Взято енергетичну батарею. -Picked up an energy cell pack.,GOTCELLBOX,,,,Sebrán svazek energetických článků.,Hentede en energicellepakke.,Energiezellenpackung genommen.,Πήρες ένα πακέτο κύτταρων ενέργιας.,Vi trovis energiĉelo-pakon.,Encuentras un paquete de células de energía.,,Poimit energia-akkupaketin.,Pack de cellules énergétiques récupéré.,Felvettél egy doboznyi energia cellát.,Raccolta una confezione di batterie.,エネルギーセルパックを拾った。,대용량 에너지 셀을 얻었다.,Je hebt een energiecelpakket opgepakt.,Plukket opp en energipakke.,Zebrano paczkę ogniw energetycznych.,Pegou um pacote de células de energia.,Apanhaste um pacote de células de energia.,Ai ridicat un pachet de celule cu energie.,Получен комплект энергобатарей.,Покупили сте паковање енергетских ћелија.,Plockade upp ett energicellpaket.,Bir enerji hücresi paketi aldı.,Взято велику енергетичну батарею. -Picked up 4 shotgun shells.,GOTSHELLS,,,,Sebrány 4 broky.,Hentede 4 haglpatroner.,4 Schrotflintenpatronen genommen,Πήρες τέσσερεις σφάιρες ντουγεκιόυ.,Vi trovis 4 kartoĉojn.,Encuentras 4 cartuchos de escopeta.,,Poimit 4 haulikon patruunaa.,4 cartouches récupérées.,Felvettél 4 sörétes töltényt.,Raccolte 4 cartucce per fucile.,4発の散弾を拾った。,샷건 쉘 4개를 얻었다.,Je hebt 4 jachtgeweerkogels opgepakt.,Plukket opp 4 haglpatroner.,Zebrano 4 loftki do strzelby.,Pegou 4 cartuchos de espingarda.,Apanhaste 4 cartuchos de espingarda.,Ai ridicat 4 proiectile pentru pușcă.,Получено 4 патрона дробовика.,Покупили сте 4 патроне од пумпарице.,Plockade upp 4 hagelpatroner.,4 av tüfeği mermisi aldı.,Взято 4 рушничні набої. -Picked up a box of shotgun shells.,GOTSHELLBOX,,,,Sebrána krabice s broky.,Hentede en kasse med haglpatroner.,Kiste mit Schrotflintenpatronen genommen.,Πήρες ένα κουτί με σφάιρες ντουγεκιόυ.,Vi trovis skatolon da kartoĉoj.,Encuentras una caja de cartuchos de escopeta.,,Poimit laatikollisen haulikon patruunoita.,Boîte de cartouches récupérée.,Felvettél egy doboz sörétes töltényt.,Raccolta una scatola di cartucce per fucile.,散弾箱を拾った。,샷건 쉘 보관함을 얻었다.,Je hebt een doos jachtgeweerkogels opgepakt.,Plukket opp en eske med haglepatroner.,Zebrano pudełko loftek do strzelby.,Pegou uma caixa de cartuchos de espingarda.,Apanhaste uma caixa de cartuchos de espingarda,Ai ridicat o cutie cu proiectile pentru pușcă.,Получена коробка патронов дробовика.,Покупили сте кутију патрона од пумпарице.,Plockade upp en låda med hagelpatroner.,Bir kutu av tüfeği mermisi aldı.,Взято коробку рушничних набоїв. -Picked up a backpack full of ammo!,GOTBACKPACK,,,,Sebrán batoh s haldou munice!,Hentede en rygsæk fuld af ammunition!,Rucksack mit Munition genommen.,Πήρες μια τσάντα γεμάτη με πυρομαχικά!,Vi trovis tornistron plena de municioj!,¡Encuentras una mochila llena de munición!,,Poimit repun täynnä ammuksia!,Sac à dos plein de munitions récupéré!,Felvettél egy tölténnyel teli hátizsákot!,Raccolto uno zaino zeppo di munizioni!,弾薬の入ったバックパックを手に入れた!,탄약이 들어있는 배낭을 얻었다!,Je hebt een rugzak vol munitie opgepakt!,Plukket opp en ryggsekk full av ammunisjon!,Zebrano plecak pełen amunicji!,Pegou uma mochila cheia de munição!,Apanhaste uma mochila cheia de munição,Ai ridicat o raniță plină cu muniție!,"Получен рюкзак, полный патронов!",Покупили сте ранац с патронама!,Plockade upp en ryggsäck full av ammunition!,Cephane dolu bir sırt çantası aldı!,Взято рюкзак повний набоїв! -"You got the BFG9000! Oh, yes.",GOTBFG9000,,,,"Sebráno BFG9000! Ó, ano!","Du fik BFG9000! Åh, ja.","Das BFG9000! Oh, ja!","Πήρες το BFG9000! ο, ΝΑΊ.",Vi trovis BFG9000! Bonege.,¡Encuentras una BFG9000! Qué guay.,¡Encuentras una BFG9000! Genial.,Sait BFG9000:n! Voi kyllä.,"UN BFG9000! OH, OUI!",Felvetted a BFG9000-et! Ezaz.,"Hai trovato il BFG9000! Eh, sì!",BFG9000を手に入れた!やったぜ。,당신은 BFG9000을 습득했다! 오우 예.,Je hebt de BFG9000! Jawel.,"Du har BFG9000! Å, ja.","Zebrano BFG9000! O, tak.","Você pegou a BFG! Ah, que delícia!","Apanhaste a BFG9000! Oh, SIM!","Ai pus mâna pe BFG9000! Oh, da.","У вас BFG9000! О, да!","Покупили сте ВЈП9000! О, да.","Du fick fått BFG9000! Ja, ja.","BFG9000'i aldın! Oh, evet.",Взято БФГ9000! О так. -You got the chaingun!,GOTCHAINGUN,,,,Sebrán kulomet.,Du har et maskingevær!,Maschinengewehr genommen.,Πήρες το πολυβόλο.,Vi trovis maŝinpafilon!,¡Encuentras una ametralladora!,,Sait Gatling-konekiväärin!,Une MITRAILLEUSE!,Felvetted a golyószórót!,Hai trovato un mitragliatore!,チェーンガンを手に入れた!,당신은 체인건을 습득했다!,Je hebt het machinegeweer!,Du har en maskinpistol!,Zebrano karabin maszynowy!,Você pegou a metralhadora!,Apanhaste a metrelhadora!,Ai pus mâna pe mitraliera rotativă!,Получен пулемёт!,Покупили сте митраљез!,Du fick kedjepistolen!,Silahı aldın!,Взято кулемета. -A chainsaw! Find some meat!,GOTCHAINSAW,,,,Motorová pila! Najdi maso!,En motorsav! Find noget kød!,Eine Kettensäge. Such mir etwas Fleisch!,Ένα αλυσοπρίονο! Βρες κρέας!,Ĉensegilo! Trovu ian karnon!,¡Una motosierra! ¡Busca algo de carne!,,Moottorisaha! Mene etsimään lihaa!,Une TRONCONNEUSE! Viande frâiche!,Egy láncfűrész! Keress valami aprítanivalót!,Una motosega! Trova un po' di carne!,チェーンソウだ!肉を寄越せ!,당신은 전기톱을 습득했다! 도륙할 시간!,Een kettingzaag! Vind vlees!,En motorsag! Finn litt kjøtt!,Piła łańcuchowa! Znajdź trochę mięsa!,Uma motoserra! Encontre alguma carne!,Uma motoserra! Bora encontrar alguma carne!,O drujbă! Găsește niște carne!,Бензопила! Найди немного мяса!,Тестера! Нађи месо!,En motorsåg! Hitta lite kött!,Elektrikli testere! Biraz et bul!,Бензопила! Знайди трохи м'яса! -You got the rocket launcher!,GOTLAUNCHER,,,,Sebrán raketomet.,Du har en raketkaster!,Raketenwerfer genommen.,Πήρες το πυραβλοβόλο.,Vi trovis misilpafilon!,¡Encuentras un lanzamisiles!,,Sait singon!,Un LANCE-ROQUETTES!,Felvetted a rakétavetőt!,Hai trovato un lanciarazzi!,ロケットランチャーを手に入れた!,당신은 로켓 런쳐를 습득했다!,Je hebt de raketwerper!,Du har rakettkasteren!,Zebrano wyrzutnię rakiet!,Você pegou um lança-foguetes!,Apanhaste um lança-mísseis!,Ai pus mâna pe lansatorul de rachete!,Получен ракетомёт!,Покупили сте ракетни бацач!,Du fick raketkastaren!,Roketatarı aldın!,Взято ракетомет! -You got the plasma gun!,GOTPLASMA,,,,Sebrána plazmová puška.,Du har plasmapistolen!,Plasma-Gewehr genommen.,Πήρες το όπλο πλάσματος!,Vi trovis plasmo-pafilon!,¡Encuentras un fusil de plasma!,,Sait plasmapyssyn!,Un FUSIL A PLASMA!,Felvetted a plazmafegyvert!,Hai trovato un fucile al plasma!,プラズマライフルを手に入れた!,당신은 플라즈마 건을 습득했다!,Je hebt het plasmageweer!,Du har plasmapistolen!,Zebrano karabin plazmowy!,Você pegou o fuzil de plasma!,Apanhaste uma pistola de plasma!,Ai pus mâna pe arma cu plasmă!,Получен плазмомёт!,Покупили сте плазма оружје!,Du fick plasmapistolen!,Plazma silahın var!,Взято плазмаган! -You got the shotgun!,GOTSHOTGUN,,,,Sebrána brokovnice.,Du har et haglgevær!,Schrotflinte genommen.,Πήρες το ντουφέκι!,Vi trovis kartoĉan fusilon!,¡Encuentras una escopeta!,,Sait haulikon!,Un FUSIL A POMPE!,Felvetted a puskát!,Hai trovato un fucile!,ショットガンを手に入れた!,당신은 샷건을 습득했다!,Je hebt het jachtgeweer!,Du har haglen!,Zebrano strzelbę!,Você pegou a espingarda!,Apanhaste uma espingarda.,Ai pus mâna pe pușcă!,Получен дробовик!,Покупили сте пумпарицу!,Du fick hagelgeväret!,Pompalı tüfeğin var!,Взято дробовик! -You got the super shotgun!,GOTSHOTGUN2,,,,Sebrána superbrokovnice.,Du har et super-haglgevær!,Super-Schrotflinte genommen.,Πήρες το διπλό ντουφέκι!,Vi trovis dutuban fusilon!,¡Encuentras una superescopeta!,,Sait superhaulikon!,Un SUPER FUSIL DE CHASSE!,Felvetted a Szuper puskát!,Hai trovato una doppietta!,スーパーショットガンを手に入れた!,당신은 슈퍼 샷건을 습득했다!,Je hebt het superjachtgeweer!,Du har supergeværet!,Zebrano super strzelbę!,Você pegou uma espingarda de cano duplo!,Apanhaste uma espingarda de cano duplo!,Ai pus mâna pe super pușcă!,Получен супердробовик!,Покупили сте двоцевку!,Du fick super-hagelgeväret!,Süper av tüfeğini aldın!,Взято двостволку! -Picked up a pistol.,PICKUP_PISTOL_DROPPED,,,,Sebrána pistole.,Du har fået en pistol.,Pistole genommen.,Πήρες ενα πιστόλι.,Prenis pistolon.,Una pistola.,,Poimit pistoolin.,Un PISTOLET.,Felvettél egy pisztolyt.,Raccolta una pistola.,ピストルを拾った。,권총을 주웠다.,Je hebt het pistool opgepakt.,Plukket opp en pistol.,Zebrano pistolet.,Pegou uma pistola.,Apanhaste uma pistola.,Ai ridicat un pistol.,Получен пистолет.,Покупили сте пиштољ.,Jag plockade upp en pistol.,Bir tabanca aldın.,Взято пістолет. -You pick up a demonic dagger.,BETA_BONUS1,,,,Sebrána démonická dýka.,Du har samlet en dæmonisk dolk op.,Dämonischen Dolch genommen.,Πήρες ένα δαιμονικό μαχαίρι.,Vi trovis demonan ponardon.,Encuentras una daga demoníaca.,,Poimit demonisen tikarin.,Dague diabolique récupérée.,Felvettél egy démoni tőrt.,Hai raccolto un pugnale demoniaco.,デモニックダガーを拾った。,당신은 마귀내린 단검을 얻었다.,Je hebt een demonische dolk opgepakt.,Du plukket opp en demonisk dolk.,Zebrano demoniczny sztylet.,Você pegou uma adaga demoníaca.,Apanhaste uma navalha demoníaca.,Ai ridicat un pumnal demonic.,Вы подобрали демонический кинжал.,Купите демонски бодеж.,Plockade upp en demonisk dolk.,Şeytani bir hançer aldın.,Взято демонічний кинжал. -You pick up a skullchest.,BETA_BONUS2,,,,Sebrána lebkotruhla.,Du samler en kraniekasse op.,Schädelkiste genommen.,Πήρες ένα κρανομπαούλο.,Vi trovis kraniokeston.,Encuentras un cofre de calaveras.,,Poimit kalloarkun.,Coffre-crâne récupéré.,Felvettél egy skullchest-et.,Hai raccolto un cofanetto del teschio.,スカルチェストを拾った。,당신은 해골상자를 얻었다.,Je hebt een schedelborst opgepakt.,Du plukker opp en hodeskalle.,Zebrano skrzynię czaszki.,Você pegou um cofre-caveira.,Apanhaste um cofre caveira.,Ai ridicat o cutie cu craniu.,Вы подобрали сундук с черепом.,Купите ковчег с лобањом.,Plockade upp en skalle.,Bir kafatası sandığı aldın.,Взято скриню з черепом. -You pick up an evil sceptre.,BETA_BONUS3,,,,Sebráno zlé žezlo.,Du samler et ondt scepter op.,Teuflisches Zepter genommen.,Πήρες το μοχθηρό σκήπτρο.,Vi trovis malbonan sceptron.,Encuentras un cetro del mal.,,Poimit pahan valtikan.,Sceptre maléfique récupéré.,Felvettél egy gonosz jogart.,Hai raccolto uno scettro del male.,エビルセプターを拾った。,당신은 사악한 홀을 얻었다.,Je hebt een kwaadaardige scepter opgepakt.,Du plukker opp et ondt septer.,Zebrano złe berło.,Você pegou um cetro maligno.,Apanhaste um cetro maligno,Ai ridicat un sceptru malefic.,Вы подобрали скипетр зла.,Купите зли скиптар.,Plockade upp en ond scepter.,Şeytani bir asa alıyorsun.,Взято скіпетр зла. -You pick up an unholy bible.,BETA_BONUS4,,,,Sebrána bezbožná bible.,Du samler en uhellig bibel op.,Unheilige Bibel genommen,Πήρες τήν ανίερη βίβλο.,Vi trovis malsanktan biblion.,Encuentras una biblia profana.,,Poimit epäpyhän raamatun.,Bible profane récupérée.,Felvettél egy istentelen bibliát.,Hai raccolto una bibbia profana.,アンホーリーバイブルを拾った。,당신은 불경스러운 성서를 얻었다.,Je hebt een onheilige bijbel opgepakt.,Du plukker opp en uhellig bibel.,Zebrano nieświętą biblię.,Você pegou uma bíblia profana.,Apanhaste uma bíblia profana.,Ai ridicat o biblie nesfântă.,Вы подобрали порочную библию.,Купите несвету библију.,Plockade upp en ohelig bibel.,Kutsal olmayan bir İncil aldın.,Взято нечестиву біблію. -,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,, -You need a blue key to activate this object,PD_BLUEO,,,,K aktivaci tohoto objektu potřebuješ modrý klíč.,Du skal bruge en blå nøgle for at aktivere dette objekt,"Du brauchst einen blauen Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα μπλέ κλειδί για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas bluan ŝlosilon por aktivigi ĉi tiun objekton,Necesitas una llave azul para activar este objeto,,Tarvitset sinisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé bleue pour activer cet objet.,Egy kék kulcs szükséges az tárgy aktiválásához.,Ti serve una chiave blu per attivare questo oggetto,この装置には ブルーキーが必要だ。,이 물체를 작동시키기 위해선 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om dit object te activeren.,Du trenger en blå nøkkel for å aktivere denne gjenstanden,"Potrzebujesz niebieskiego klucza, aby aktywować ten przedmiot",Você precisa de uma chave azul para ativar este objeto,Precisas de uma chave azul para ativar este objeto,"Ai nevoie de o cheie albastră pentru a activa acest +MegaSphere!,GOTMSPHERE,,,,MegaSféra!,,MegaSphäre!,Μεγασφαίρα!,Pleja sfero!,¡MegaEsfera!,,Megakuula!,Mégasphère!,,MegaGömb!,MegaSfera!,メガスフィアー!,메가스피어!,,,Megasfera!,Megaesfera!,,Megasferă!,Мегасфера!,Мегасфера!,,MegaSfer!,Мегасфера! +Picked up a clip.,GOTCLIP,,,,Sebrán zásobník.,Hentede et magasin med kugler.,Magazin genommen.,Πήρες ένα κουτάκι σφαιρών.,Vi trovis magazenon.,Encuentras un cargador.,,Poimit lippaan.,Chargeur récupéré.,,Felvettél egy töltényt.,Raccolto un caricatore.,弾倉を拾った。,탄창을 얻었다.,Je hebt een patroon opgepakt.,Plukket opp et magasin.,Zebrano magazynek.,Pegou um carregador.,Apanhaste um carregador,Ai ridicat un cartuș.,Получен магазин.,Покупили сте оквир.,Plockade upp ett klipp.,Bir şarjör aldım.,Взято набійницю. +Picked up a box of bullets.,GOTCLIPBOX,,,,Sebrána krabice s kulkami.,Hentede en kasse med kugler.,Kiste mit Pistolenkugeln genommen.,Πήρες ένα κουτί με σφαίρες.,Vi trovis skatolon da kugloj.,Encuentras una caja de balas.,,Poimit laatikollisen luoteja.,Boîte de balles récupérée.,,Felvettél egy doboz töltényt.,Raccolta una scatola di proiettili.,弾薬箱を拾った。,실탄 탄통을 얻었다.,Je hebt een doos kogels opgepakt.,Plukket opp en eske med kuler.,Zebrano pudełko z nabojami.,Pegou uma caixa de balas.,Apanhaste uma caixa de balas,Ai ridicat o cutie cu gloanțe.,Получена коробка пуль.,Покупили сте кутију метака.,Plockade upp en låda med kulor.,Bir kutu mermi aldı.,Взято коробку набоїв. +Picked up a rocket.,GOTROCKET,,,,Sebrána raketa.,Hentede en raket.,Rakete genommen,Πήρες ένα πύραυλο.,Vi trovis misilon.,Encuentras un misil.,,Poimit raketin.,Roquette récupérée.,,Felvettél egy rakétát.,Raccolto un razzo.,ロケットを拾った。,로켓을 얻었다.,Je hebt een raket opgepakt.,Plukket opp en rakett.,Zebrano rakietę.,Pegou um foguete.,Apanhaste um míssil,Ai ridicat o rachetă.,Получена ракета.,Покупили сте ракету.,Plockade upp en raket.,Bir roket aldı.,Взято ракету. +Picked up a box of rockets.,GOTROCKBOX,,,,Sebrána krabice s raketami.,Hentede en kasse med raketter.,Kiste mit Raketen genommen.,Πήρες ένα κουτί με πυράυλους.,Vi trovis keston da misiloj.,Encuentras una caja de misiles.,,Poimit laatikollisen raketteja.,Caisse de roquettes récupérée.,,Felvettél egy doboz rakétát.,Raccolta una cassa di razzi.,ロケット箱を拾った。,로켓 상자를 얻었다.,Je hebt een doos raketten opgepakt.,Plukket opp en eske med raketter.,Zebrano pudełko z rakietami.,Pegou uma caixa de foguetes.,Apanhaste uma caixa de mísseis,Ai ridicat o cutie cu rachete.,Получен ящик ракет.,Покупили сте кутију ракета.,Plockade upp en låda med raketer.,Bir kutu roket aldı.,Взято коробку з ракетами. +Picked up an energy cell.,GOTCELL,,,,Sebrán energetický článek.,Hentede en energicelle.,Energiezelle genommen.,Πήρες ένα κύτταρο ενέργιας.,Vi trovis energiĉelon.,Encuentras una célula de energía.,,Poimit energia-akun.,Cellule énergétique récupérée.,,Felvettél egy energia cellát.,Raccolta una batteria.,エネルギーセルを拾った。,에너지 셀을 얻었다.,Je hebt een energiecel opgepakt.,Plukket opp en energicelle.,Zebrano ogniwo energetyczne.,Pegou uma célula de energia.,Apanhaste uma célula de energia,Ai ridicat o celulă cu energie.,Получена энергобатарея.,Покупили сте енергетску ћелију.,Plockade upp en energicell.,Bir enerji hücresi aldı.,Взято енергетичну батарею. +Picked up an energy cell pack.,GOTCELLBOX,,,,Sebrán svazek energetických článků.,Hentede en energicellepakke.,Energiezellenpackung genommen.,Πήρες ένα πακέτο κύτταρων ενέργιας.,Vi trovis energiĉelo-pakon.,Encuentras un paquete de células de energía.,,Poimit energia-akkupaketin.,Pack de cellules énergétiques récupéré.,,Felvettél egy doboznyi energia cellát.,Raccolta una confezione di batterie.,エネルギーセルパックを拾った。,대용량 에너지 셀을 얻었다.,Je hebt een energiecelpakket opgepakt.,Plukket opp en energipakke.,Zebrano paczkę ogniw energetycznych.,Pegou um pacote de células de energia.,Apanhaste um pacote de células de energia.,Ai ridicat un pachet de celule cu energie.,Получен комплект энергобатарей.,Покупили сте паковање енергетских ћелија.,Plockade upp ett energicellpaket.,Bir enerji hücresi paketi aldı.,Взято велику енергетичну батарею. +Picked up 4 shotgun shells.,GOTSHELLS,,,,Sebrány 4 broky.,Hentede 4 haglpatroner.,4 Schrotflintenpatronen genommen,Πήρες τέσσερεις σφάιρες ντουγεκιόυ.,Vi trovis 4 kartoĉojn.,Encuentras 4 cartuchos de escopeta.,,Poimit 4 haulikon patruunaa.,4 cartouches récupérées.,,Felvettél 4 sörétes töltényt.,Raccolte 4 cartucce per fucile.,4発の散弾を拾った。,샷건 쉘 4개를 얻었다.,Je hebt 4 jachtgeweerkogels opgepakt.,Plukket opp 4 haglpatroner.,Zebrano 4 loftki do strzelby.,Pegou 4 cartuchos de espingarda.,Apanhaste 4 cartuchos de espingarda.,Ai ridicat 4 proiectile pentru pușcă.,Получено 4 патрона дробовика.,Покупили сте 4 патроне од пумпарице.,Plockade upp 4 hagelpatroner.,4 av tüfeği mermisi aldı.,Взято 4 рушничні набої. +Picked up a box of shotgun shells.,GOTSHELLBOX,,,,Sebrána krabice s broky.,Hentede en kasse med haglpatroner.,Kiste mit Schrotflintenpatronen genommen.,Πήρες ένα κουτί με σφάιρες ντουγεκιόυ.,Vi trovis skatolon da kartoĉoj.,Encuentras una caja de cartuchos de escopeta.,,Poimit laatikollisen haulikon patruunoita.,Boîte de cartouches récupérée.,,Felvettél egy doboz sörétes töltényt.,Raccolta una scatola di cartucce per fucile.,散弾箱を拾った。,샷건 쉘 보관함을 얻었다.,Je hebt een doos jachtgeweerkogels opgepakt.,Plukket opp en eske med haglepatroner.,Zebrano pudełko loftek do strzelby.,Pegou uma caixa de cartuchos de espingarda.,Apanhaste uma caixa de cartuchos de espingarda,Ai ridicat o cutie cu proiectile pentru pușcă.,Получена коробка патронов дробовика.,Покупили сте кутију патрона од пумпарице.,Plockade upp en låda med hagelpatroner.,Bir kutu av tüfeği mermisi aldı.,Взято коробку рушничних набоїв. +Picked up a backpack full of ammo!,GOTBACKPACK,,,,Sebrán batoh s haldou munice!,Hentede en rygsæk fuld af ammunition!,Rucksack mit Munition genommen.,Πήρες μια τσάντα γεμάτη με πυρομαχικά!,Vi trovis tornistron plena de municioj!,¡Encuentras una mochila llena de munición!,,Poimit repun täynnä ammuksia!,Sac à dos plein de munitions récupéré!,,Felvettél egy tölténnyel teli hátizsákot!,Raccolto uno zaino zeppo di munizioni!,弾薬の入ったバックパックを手に入れた!,탄약이 들어있는 배낭을 얻었다!,Je hebt een rugzak vol munitie opgepakt!,Plukket opp en ryggsekk full av ammunisjon!,Zebrano plecak pełen amunicji!,Pegou uma mochila cheia de munição!,Apanhaste uma mochila cheia de munição,Ai ridicat o raniță plină cu muniție!,"Получен рюкзак, полный патронов!",Покупили сте ранац с патронама!,Plockade upp en ryggsäck full av ammunition!,Cephane dolu bir sırt çantası aldı!,Взято рюкзак повний набоїв! +"You got the BFG9000! Oh, yes.",GOTBFG9000,,,,"Sebráno BFG9000! Ó, ano!","Du fik BFG9000! Åh, ja.","Das BFG9000! Oh, ja!","Πήρες το BFG9000! ο, ΝΑΊ.",Vi trovis BFG9000! Bonege.,¡Encuentras una BFG9000! Qué guay.,¡Encuentras una BFG9000! Genial.,Sait BFG9000:n! Voi kyllä.,"UN BFG9000! OH, OUI!",,Felvetted a BFG9000-et! Ezaz.,"Hai trovato il BFG9000! Eh, sì!",BFG9000を手に入れた!やったぜ。,당신은 BFG9000을 습득했다! 오우 예.,Je hebt de BFG9000! Jawel.,"Du har BFG9000! Å, ja.","Zebrano BFG9000! O, tak.","Você pegou a BFG! Ah, que delícia!","Apanhaste a BFG9000! Oh, SIM!","Ai pus mâna pe BFG9000! Oh, da.","У вас BFG9000! О, да!","Покупили сте ВЈП9000! О, да.","Du fick fått BFG9000! Ja, ja.","BFG9000'i aldın! Oh, evet.",Взято БФГ9000! О так. +You got the chaingun!,GOTCHAINGUN,,,,Sebrán kulomet.,Du har et maskingevær!,Maschinengewehr genommen.,Πήρες το πολυβόλο.,Vi trovis maŝinpafilon!,¡Encuentras una ametralladora!,,Sait Gatling-konekiväärin!,Une MITRAILLEUSE!,,Felvetted a golyószórót!,Hai trovato un mitragliatore!,チェーンガンを手に入れた!,당신은 체인건을 습득했다!,Je hebt het machinegeweer!,Du har en maskinpistol!,Zebrano karabin maszynowy!,Você pegou a metralhadora!,Apanhaste a metrelhadora!,Ai pus mâna pe mitraliera rotativă!,Получен пулемёт!,Покупили сте митраљез!,Du fick kedjepistolen!,Silahı aldın!,Взято кулемета. +A chainsaw! Find some meat!,GOTCHAINSAW,,,,Motorová pila! Najdi maso!,En motorsav! Find noget kød!,Eine Kettensäge. Such mir etwas Fleisch!,Ένα αλυσοπρίονο! Βρες κρέας!,Ĉensegilo! Trovu ian karnon!,¡Una motosierra! ¡Busca algo de carne!,,Moottorisaha! Mene etsimään lihaa!,Une TRONCONNEUSE! Viande frâiche!,,Egy láncfűrész! Keress valami aprítanivalót!,Una motosega! Trova un po' di carne!,チェーンソウだ!肉を寄越せ!,당신은 전기톱을 습득했다! 도륙할 시간!,Een kettingzaag! Vind vlees!,En motorsag! Finn litt kjøtt!,Piła łańcuchowa! Znajdź trochę mięsa!,Uma motoserra! Encontre alguma carne!,Uma motoserra! Bora encontrar alguma carne!,O drujbă! Găsește niște carne!,Бензопила! Найди немного мяса!,Тестера! Нађи месо!,En motorsåg! Hitta lite kött!,Elektrikli testere! Biraz et bul!,Бензопила! Знайди трохи м'яса! +You got the rocket launcher!,GOTLAUNCHER,,,,Sebrán raketomet.,Du har en raketkaster!,Raketenwerfer genommen.,Πήρες το πυραβλοβόλο.,Vi trovis misilpafilon!,¡Encuentras un lanzamisiles!,,Sait singon!,Un LANCE-ROQUETTES!,,Felvetted a rakétavetőt!,Hai trovato un lanciarazzi!,ロケットランチャーを手に入れた!,당신은 로켓 런쳐를 습득했다!,Je hebt de raketwerper!,Du har rakettkasteren!,Zebrano wyrzutnię rakiet!,Você pegou um lança-foguetes!,Apanhaste um lança-mísseis!,Ai pus mâna pe lansatorul de rachete!,Получен ракетомёт!,Покупили сте ракетни бацач!,Du fick raketkastaren!,Roketatarı aldın!,Взято ракетомет! +You got the plasma gun!,GOTPLASMA,,,,Sebrána plazmová puška.,Du har plasmapistolen!,Plasma-Gewehr genommen.,Πήρες το όπλο πλάσματος!,Vi trovis plasmo-pafilon!,¡Encuentras un fusil de plasma!,,Sait plasmapyssyn!,Un FUSIL A PLASMA!,,Felvetted a plazmafegyvert!,Hai trovato un fucile al plasma!,プラズマライフルを手に入れた!,당신은 플라즈마 건을 습득했다!,Je hebt het plasmageweer!,Du har plasmapistolen!,Zebrano karabin plazmowy!,Você pegou o fuzil de plasma!,Apanhaste uma pistola de plasma!,Ai pus mâna pe arma cu plasmă!,Получен плазмомёт!,Покупили сте плазма оружје!,Du fick plasmapistolen!,Plazma silahın var!,Взято плазмаган! +You got the shotgun!,GOTSHOTGUN,,,,Sebrána brokovnice.,Du har et haglgevær!,Schrotflinte genommen.,Πήρες το ντουφέκι!,Vi trovis kartoĉan fusilon!,¡Encuentras una escopeta!,,Sait haulikon!,Un FUSIL A POMPE!,,Felvetted a puskát!,Hai trovato un fucile!,ショットガンを手に入れた!,당신은 샷건을 습득했다!,Je hebt het jachtgeweer!,Du har haglen!,Zebrano strzelbę!,Você pegou a espingarda!,Apanhaste uma espingarda.,Ai pus mâna pe pușcă!,Получен дробовик!,Покупили сте пумпарицу!,Du fick hagelgeväret!,Pompalı tüfeğin var!,Взято дробовик! +You got the super shotgun!,GOTSHOTGUN2,,,,Sebrána superbrokovnice.,Du har et super-haglgevær!,Super-Schrotflinte genommen.,Πήρες το διπλό ντουφέκι!,Vi trovis dutuban fusilon!,¡Encuentras una superescopeta!,,Sait superhaulikon!,Un SUPER FUSIL DE CHASSE!,,Felvetted a Szuper puskát!,Hai trovato una doppietta!,スーパーショットガンを手に入れた!,당신은 슈퍼 샷건을 습득했다!,Je hebt het superjachtgeweer!,Du har supergeværet!,Zebrano super strzelbę!,Você pegou uma espingarda de cano duplo!,Apanhaste uma espingarda de cano duplo!,Ai pus mâna pe super pușcă!,Получен супердробовик!,Покупили сте двоцевку!,Du fick super-hagelgeväret!,Süper av tüfeğini aldın!,Взято двостволку! +Picked up a pistol.,PICKUP_PISTOL_DROPPED,,,,Sebrána pistole.,Du har fået en pistol.,Pistole genommen.,Πήρες ενα πιστόλι.,Prenis pistolon.,Una pistola.,,Poimit pistoolin.,Un PISTOLET.,,Felvettél egy pisztolyt.,Raccolta una pistola.,ピストルを拾った。,권총을 주웠다.,Je hebt het pistool opgepakt.,Plukket opp en pistol.,Zebrano pistolet.,Pegou uma pistola.,Apanhaste uma pistola.,Ai ridicat un pistol.,Получен пистолет.,Покупили сте пиштољ.,Jag plockade upp en pistol.,Bir tabanca aldın.,Взято пістолет. +You pick up a demonic dagger.,BETA_BONUS1,,,,Sebrána démonická dýka.,Du har samlet en dæmonisk dolk op.,Dämonischen Dolch genommen.,Πήρες ένα δαιμονικό μαχαίρι.,Vi trovis demonan ponardon.,Encuentras una daga demoníaca.,,Poimit demonisen tikarin.,Dague diabolique récupérée.,,Felvettél egy démoni tőrt.,Hai raccolto un pugnale demoniaco.,デモニックダガーを拾った。,당신은 마귀내린 단검을 얻었다.,Je hebt een demonische dolk opgepakt.,Du plukket opp en demonisk dolk.,Zebrano demoniczny sztylet.,Você pegou uma adaga demoníaca.,Apanhaste uma navalha demoníaca.,Ai ridicat un pumnal demonic.,Вы подобрали демонический кинжал.,Купите демонски бодеж.,Plockade upp en demonisk dolk.,Şeytani bir hançer aldın.,Взято демонічний кинжал. +You pick up a skullchest.,BETA_BONUS2,,,,Sebrána lebkotruhla.,Du samler en kraniekasse op.,Schädelkiste genommen.,Πήρες ένα κρανομπαούλο.,Vi trovis kraniokeston.,Encuentras un cofre de calaveras.,,Poimit kalloarkun.,Coffre-crâne récupéré.,,Felvettél egy skullchest-et.,Hai raccolto un cofanetto del teschio.,スカルチェストを拾った。,당신은 해골상자를 얻었다.,Je hebt een schedelborst opgepakt.,Du plukker opp en hodeskalle.,Zebrano skrzynię czaszki.,Você pegou um cofre-caveira.,Apanhaste um cofre caveira.,Ai ridicat o cutie cu craniu.,Вы подобрали сундук с черепом.,Купите ковчег с лобањом.,Plockade upp en skalle.,Bir kafatası sandığı aldın.,Взято скриню з черепом. +You pick up an evil sceptre.,BETA_BONUS3,,,,Sebráno zlé žezlo.,Du samler et ondt scepter op.,Teuflisches Zepter genommen.,Πήρες το μοχθηρό σκήπτρο.,Vi trovis malbonan sceptron.,Encuentras un cetro del mal.,,Poimit pahan valtikan.,Sceptre maléfique récupéré.,,Felvettél egy gonosz jogart.,Hai raccolto uno scettro del male.,エビルセプターを拾った。,당신은 사악한 홀을 얻었다.,Je hebt een kwaadaardige scepter opgepakt.,Du plukker opp et ondt septer.,Zebrano złe berło.,Você pegou um cetro maligno.,Apanhaste um cetro maligno,Ai ridicat un sceptru malefic.,Вы подобрали скипетр зла.,Купите зли скиптар.,Plockade upp en ond scepter.,Şeytani bir asa alıyorsun.,Взято скіпетр зла. +You pick up an unholy bible.,BETA_BONUS4,,,,Sebrána bezbožná bible.,Du samler en uhellig bibel op.,Unheilige Bibel genommen,Πήρες τήν ανίερη βίβλο.,Vi trovis malsanktan biblion.,Encuentras una biblia profana.,,Poimit epäpyhän raamatun.,Bible profane récupérée.,,Felvettél egy istentelen bibliát.,Hai raccolto una bibbia profana.,アンホーリーバイブルを拾った。,당신은 불경스러운 성서를 얻었다.,Je hebt een onheilige bijbel opgepakt.,Du plukker opp en uhellig bibel.,Zebrano nieświętą biblię.,Você pegou uma bíblia profana.,Apanhaste uma bíblia profana.,Ai ridicat o biblie nesfântă.,Вы подобрали порочную библию.,Купите несвету библију.,Plockade upp en ohelig bibel.,Kutsal olmayan bir İncil aldın.,Взято нечестиву біблію. +,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,,, +You need a blue key to activate this object,PD_BLUEO,,,,K aktivaci tohoto objektu potřebuješ modrý klíč.,Du skal bruge en blå nøgle for at aktivere dette objekt,"Du brauchst einen blauen Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα μπλέ κλειδί για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas bluan ŝlosilon por aktivigi ĉi tiun objekton,Necesitas una llave azul para activar este objeto,,Tarvitset sinisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé bleue pour activer cet objet.,,Egy kék kulcs szükséges az tárgy aktiválásához.,Ti serve una chiave blu per attivare questo oggetto,この装置には ブルーキーが必要だ。,이 물체를 작동시키기 위해선 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om dit object te activeren.,Du trenger en blå nøkkel for å aktivere denne gjenstanden,"Potrzebujesz niebieskiego klucza, aby aktywować ten przedmiot",Você precisa de uma chave azul para ativar este objeto,Precisas de uma chave azul para ativar este objeto,"Ai nevoie de o cheie albastră pentru a activa acest obiect",Для применения нужен синий ключ,Треба вам плави кључ да би активирали овај предмет,Du behöver en blå nyckel för att aktivera det här föremålet.,Bu nesneyi etkinleştirmek için mavi bir anahtara ihtiyacınız var,"Вам потрібна синя ключ-карта, щоб активувати цей об'єкт" -You need a red key to activate this object,PD_REDO,,,,K aktivaci tohoto objektu potřebuješ červený klíč.,Du skal bruge en rød nøgle for at aktivere dette objekt,"Du brauchst einen roten Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κόκινο κλειδί για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas ruĝan ŝlosilon por aktivigi ĉi tiun objekton,Necesitas una llave roja para activar este objeto,,Tarvitset punaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé rouge pour activer cet objet.,"Piros kulcs kell, hogy aktiválhasd ezt a tárgyat.",Ti serve una chiave rossa per attivare questo oggetto,この装置には レッドキーが必要だ。,이 물체를 작동시키기 위해선 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om dit object te activeren.,Du trenger en rød nøkkel for å aktivere dette objektet,"Potrzebujesz czerwonego klucza, aby aktywować ten przedmiot",Você precisa de uma chave vermelha para ativar este objeto,Precisas de uma chave vermelha para ativar este objeto,"Ai nevoie de o cheie roșie pentru a activa acest +You need a red key to activate this object,PD_REDO,,,,K aktivaci tohoto objektu potřebuješ červený klíč.,Du skal bruge en rød nøgle for at aktivere dette objekt,"Du brauchst einen roten Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κόκινο κλειδί για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas ruĝan ŝlosilon por aktivigi ĉi tiun objekton,Necesitas una llave roja para activar este objeto,,Tarvitset punaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé rouge pour activer cet objet.,,"Piros kulcs kell, hogy aktiválhasd ezt a tárgyat.",Ti serve una chiave rossa per attivare questo oggetto,この装置には レッドキーが必要だ。,이 물체를 작동시키기 위해선 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om dit object te activeren.,Du trenger en rød nøkkel for å aktivere dette objektet,"Potrzebujesz czerwonego klucza, aby aktywować ten przedmiot",Você precisa de uma chave vermelha para ativar este objeto,Precisas de uma chave vermelha para ativar este objeto,"Ai nevoie de o cheie roșie pentru a activa acest obiect",Для применения нужен красный ключ,Треба вам црвени кључ да би активирали овај предмет,Du behöver en röd nyckel för att aktivera det här föremålet.,Bu nesneyi etkinleştirmek için kırmızı bir anahtara ihtiyacınız var,"Вам потрібна червона ключ-карта, щоб активувати цей об'єкт" -You need a yellow key to activate this object,PD_YELLOWO,,,,K aktivaci tohoto objektu potřebuješ žlutý klíč.,Du skal bruge en gul nøgle for at aktivere dette objekt,"Du brauchst einen gelben Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κύτρινο κλειδί για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas flavan ŝlosilon por aktivigi ĉi tiun objekton,Necesitas una llave amarilla para activar este objeto,,Tarvitset keltaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé jaune pour activer cet objet.,Egy sárga kulccsal aktiválható ez a tárgy,Ti serve una chiave gialla per attivare questo oggetto,この装置にはイエローキーが必要だ。,이 물체를 작동시키기 위해선 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om dit object te activeren.,Du trenger en gul nøkkel for å aktivere dette objektet,"Potrzebujesz żółtego klucza, aby aktywować ten przedmiot",Você precisa de uma chave amarela para ativar este objeto,Precisas de uma chave amarela para ativar este objeto,"Ai nevoie de o cheie galbenă pentru a activa acest +You need a yellow key to activate this object,PD_YELLOWO,,,,K aktivaci tohoto objektu potřebuješ žlutý klíč.,Du skal bruge en gul nøgle for at aktivere dette objekt,"Du brauchst einen gelben Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κύτρινο κλειδί για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas flavan ŝlosilon por aktivigi ĉi tiun objekton,Necesitas una llave amarilla para activar este objeto,,Tarvitset keltaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé jaune pour activer cet objet.,,Egy sárga kulccsal aktiválható ez a tárgy,Ti serve una chiave gialla per attivare questo oggetto,この装置にはイエローキーが必要だ。,이 물체를 작동시키기 위해선 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om dit object te activeren.,Du trenger en gul nøkkel for å aktivere dette objektet,"Potrzebujesz żółtego klucza, aby aktywować ten przedmiot",Você precisa de uma chave amarela para ativar este objeto,Precisas de uma chave amarela para ativar este objeto,"Ai nevoie de o cheie galbenă pentru a activa acest obiect",Для применения нужен жёлтый ключ,Треба вам жути кључ да би активирали овај предмет,Du behöver en gul nyckel för att aktivera det här föremålet.,Bu nesneyi etkinleştirmek için sarı bir anahtara ihtiyacınız var,"Вам потрібна жовта ключ-карта, щоб активувати цей об'єкт" -You need a blue key to open this door,PD_BLUEK,,,,K otevření těchto dveří potřebuješ modrý klíč.,Du skal bruge en blå nøgle for at åbne denne dør,"Du brauchst einen blauen Schlüssel, um diese Tür zu öffnen.",Χρειάζεσε ένα μπλέ κλειδί για να ανοίξεις αυτή τη πόρτα,Vi bezonas bluan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave azul para abrir esta puerta,,Tarvitset sinisen avaimen avataksesi tämän oven,Il vous faut une clé bleue pour ouvrir cette porte.,Az ajtót egy kék kulcs nyitja.,Ti serve una chiave blu per aprire questa porta,このドアには ブルーキーが必要だ。,이 문을 열기 위해선 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om deze deur te openen.,Du trenger en blå nøkkel for å åpne denne døren,"Potrzebujesz niebieskiego klucza, aby otworzyć te drzwi",Você precisa de uma chave azul para abrir esta porta,Precisas de uma chave azul para abrir esta porta,"Ai nevoie de o cheie albastră pentru a deschide +You need a blue key to open this door,PD_BLUEK,,,,K otevření těchto dveří potřebuješ modrý klíč.,Du skal bruge en blå nøgle for at åbne denne dør,"Du brauchst einen blauen Schlüssel, um diese Tür zu öffnen.",Χρειάζεσε ένα μπλέ κλειδί για να ανοίξεις αυτή τη πόρτα,Vi bezonas bluan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave azul para abrir esta puerta,,Tarvitset sinisen avaimen avataksesi tämän oven,Il vous faut une clé bleue pour ouvrir cette porte.,,Az ajtót egy kék kulcs nyitja.,Ti serve una chiave blu per aprire questa porta,このドアには ブルーキーが必要だ。,이 문을 열기 위해선 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om deze deur te openen.,Du trenger en blå nøkkel for å åpne denne døren,"Potrzebujesz niebieskiego klucza, aby otworzyć te drzwi",Você precisa de uma chave azul para abrir esta porta,Precisas de uma chave azul para abrir esta porta,"Ai nevoie de o cheie albastră pentru a deschide ușa aceasta",Для открытия нужен синий ключ,Треба вам плави кључ да би отворили ова врата,Du behöver en blå nyckel för att öppna den här dörren,Bu kapıyı açmak için mavi bir anahtara ihtiyacın var.,"Вам потрібна синя ключ-карта, щоб відкрити ці двері" -You need a red key to open this door,PD_REDK,,,,K otevření těchto dveří potřebuješ červený klíč.,Du skal bruge en rød nøgle for at åbne denne dør,"Du brauchst einen roten Schlüssel, um diese Tür zu öffnen.",Χρειάζεσε ένα κόκινο κλειδί για να ανοίξεις αυτή τη πόρτα,Vi bezonas ruĝan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave roja para abrir esta puerta,,Tarvitset punaisen avaimen avataksesi tämän oven,Il vous faut une clé rouge pour ouvrir cette porte.,"Piros kulcs szükséges, hogy az ajtót kinyithasd.",Ti serve una chiave rossa per aprire questa porta,このドアには レッドキーが必要だ。,이 문을 열기 위해선 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om deze deur te openen.,Du trenger en rød nøkkel for å åpne denne døren,"Potrzebujesz czerwonego klucza, aby otworzyć te drzwi",Você precisa de uma chave vermelha para abrir esta porta,Precisas de uma chave vermelha para abrir esta porta,"Ai nevoie de o cheie roșie pentru a deschide ușa +You need a red key to open this door,PD_REDK,,,,K otevření těchto dveří potřebuješ červený klíč.,Du skal bruge en rød nøgle for at åbne denne dør,"Du brauchst einen roten Schlüssel, um diese Tür zu öffnen.",Χρειάζεσε ένα κόκινο κλειδί για να ανοίξεις αυτή τη πόρτα,Vi bezonas ruĝan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave roja para abrir esta puerta,,Tarvitset punaisen avaimen avataksesi tämän oven,Il vous faut une clé rouge pour ouvrir cette porte.,,"Piros kulcs szükséges, hogy az ajtót kinyithasd.",Ti serve una chiave rossa per aprire questa porta,このドアには レッドキーが必要だ。,이 문을 열기 위해선 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om deze deur te openen.,Du trenger en rød nøkkel for å åpne denne døren,"Potrzebujesz czerwonego klucza, aby otworzyć te drzwi",Você precisa de uma chave vermelha para abrir esta porta,Precisas de uma chave vermelha para abrir esta porta,"Ai nevoie de o cheie roșie pentru a deschide ușa aceasta",Для открытия нужен красный ключ,Треба вам црвени кључ да би отворили ова врата,Du behöver en röd nyckel för att öppna den här dörren,Bu kapıyı açmak için kırmızı bir anahtara ihtiyacın var.,"Вам потрібна червона ключ-карта, щоб відкрити ці двері" -You need a yellow key to open this door,PD_YELLOWK,,,,K otevření těchto dveří potřebuješ žlutý klíč.,Du skal bruge en gul nøgle for at åbne denne dør,"Du brauchst einen gelben Schlüssel, um diese Tür zu öffnen.",Χρειάζεσε ένα κύτρινο κλειδί για να ανοίξεις αυτή τη πόρτα,Vi bezonas flavan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave amarilla para abrir esta puerta,,Tarvitset keltaisen avaimen avataksesi tämän oven,Il vous faut une clé jaune pour ouvrir cette porte.,Kell egy sárga kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave gialla per aprire questa porta,このドアには イエローキー が必要だ。,이 문을 열기 위해선 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om deze deur te openen.,Du trenger en gul nøkkel for å åpne denne døren,"Potrzebujesz żółtego klucza, aby otworzyć te drzwi",Você precisa de uma chave amarela para abrir esta porta,Precisas de uma chave amarela para abrir esta porta,"Ai nevoie de o cheie galbena pentru a deschide ușa +You need a yellow key to open this door,PD_YELLOWK,,,,K otevření těchto dveří potřebuješ žlutý klíč.,Du skal bruge en gul nøgle for at åbne denne dør,"Du brauchst einen gelben Schlüssel, um diese Tür zu öffnen.",Χρειάζεσε ένα κύτρινο κλειδί για να ανοίξεις αυτή τη πόρτα,Vi bezonas flavan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave amarilla para abrir esta puerta,,Tarvitset keltaisen avaimen avataksesi tämän oven,Il vous faut une clé jaune pour ouvrir cette porte.,,Kell egy sárga kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave gialla per aprire questa porta,このドアには イエローキー が必要だ。,이 문을 열기 위해선 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om deze deur te openen.,Du trenger en gul nøkkel for å åpne denne døren,"Potrzebujesz żółtego klucza, aby otworzyć te drzwi",Você precisa de uma chave amarela para abrir esta porta,Precisas de uma chave amarela para abrir esta porta,"Ai nevoie de o cheie galbena pentru a deschide ușa aceasta",Для открытия нужен жёлтый ключ,Треба вам жути кључ да би отворили ова врата,Du behöver en gul nyckel för att öppna den här dörren.,Bu kapıyı açmak için sarı bir anahtara ihtiyacınız var,"Вам потрібна жовта ключ-карта, щоб відкрити ці двері" -You need a blue card to activate this object,PD_BLUECO,,,,K aktivaci tohoto objektu potřebuješ modrou kartu.,Du skal bruge et blåt kort for at aktivere denne objekt,"Du brauchst eine blaue Schlüsselkarte, um dieses Objekt zu aktivieren.",Χρειάζεσε μια μπλέ κάρτα για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas bluan karton por aktivigi ĉi tiun objekton,Necesitas una tarjeta azul para activar este objeto,,Tarvitset sinisen avainkortin aktivoidaksesi tämän kappaleen,Il vous faut une carte bleue pour activer cet objet.,"Egy kék kártya kell, hogy ezt a tárgyat aktiválhasd",Ti serve una card d'accesso blu per attivare questo oggetto ,この装置には ブルーカード が必要だ。,이 물체를 작동시키기 위해선 청색 키카드가 필요합니다,Je hebt een blauwe sleutelkaart nodig om dit voorwerp te activeren.,Du trenger et blått kort for å aktivere dette objektet,"Potrzebujesz niebieskiej karty, aby aktywować ten obiekt",Você precisa de um cartão de acesso azul para ativar este objeto,Precisas de um cartão de acesso azul para ativar este objeto,"Ai nevoie de un card albastru pentru a activa +You need a blue card to activate this object,PD_BLUECO,,,,K aktivaci tohoto objektu potřebuješ modrou kartu.,Du skal bruge et blåt kort for at aktivere denne objekt,"Du brauchst eine blaue Schlüsselkarte, um dieses Objekt zu aktivieren.",Χρειάζεσε μια μπλέ κάρτα για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas bluan karton por aktivigi ĉi tiun objekton,Necesitas una tarjeta azul para activar este objeto,,Tarvitset sinisen avainkortin aktivoidaksesi tämän kappaleen,Il vous faut une carte bleue pour activer cet objet.,,"Egy kék kártya kell, hogy ezt a tárgyat aktiválhasd",Ti serve una card d'accesso blu per attivare questo oggetto ,この装置には ブルーカード が必要だ。,이 물체를 작동시키기 위해선 청색 키카드가 필요합니다,Je hebt een blauwe sleutelkaart nodig om dit voorwerp te activeren.,Du trenger et blått kort for å aktivere dette objektet,"Potrzebujesz niebieskiej karty, aby aktywować ten obiekt",Você precisa de um cartão de acesso azul para ativar este objeto,Precisas de um cartão de acesso azul para ativar este objeto,"Ai nevoie de un card albastru pentru a activa acest obiect",Для применения нужна синяя карта,Треба вам плава карта да би активирали овај предмет,Du behöver ett blått kort för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için mavi bir karta ihtiyacınız var,"Вам потрібна синя ключ-карта, щоб активувати цей об'єкт" -You need a red card to activate this object,PD_REDCO,,,,K aktivaci tohoto objektu potřebuješ červenou kartu.,Du skal bruge et rødt kort for at aktivere denne objekt,"Du brauchst eine rote Schlüsselkarte, um dieses Objekt zu aktivieren.",Χρειάζεσε μια κόκινη κάρτα για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas ruĝan karton por aktivigi ĉi tiun objekton,Necesitas una tarjeta roja para activar este objeto,,Tarvitset punaisen avainkortin aktivoidaksesi tämän kappaleen,Il vous faut une carte rouge pour activer cet objet.,Piros kártyával aktiválható ez a tárgy,Ti serve una card d'accesso rossa per attivare questo oggetto ,この装置には レッドカード が必要だ。,이 물체를 작동시키기 위해선 적색 키카드가 필요합니다,Je hebt een rode sleutelkaart nodig om dit voorwerp te activeren.,Du trenger et rødt kort for å aktivere dette objektet,"Potrzebujesz czerwonej karty, aby aktywować ten obiekt",Você precisa de um cartão de acesso vermelho para ativar este objeto,Precisas de um cartão de acesso vermelho para ativar este objeto,"Ai nevoie de un card roșu pentru a activa +You need a red card to activate this object,PD_REDCO,,,,K aktivaci tohoto objektu potřebuješ červenou kartu.,Du skal bruge et rødt kort for at aktivere denne objekt,"Du brauchst eine rote Schlüsselkarte, um dieses Objekt zu aktivieren.",Χρειάζεσε μια κόκινη κάρτα για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas ruĝan karton por aktivigi ĉi tiun objekton,Necesitas una tarjeta roja para activar este objeto,,Tarvitset punaisen avainkortin aktivoidaksesi tämän kappaleen,Il vous faut une carte rouge pour activer cet objet.,,Piros kártyával aktiválható ez a tárgy,Ti serve una card d'accesso rossa per attivare questo oggetto ,この装置には レッドカード が必要だ。,이 물체를 작동시키기 위해선 적색 키카드가 필요합니다,Je hebt een rode sleutelkaart nodig om dit voorwerp te activeren.,Du trenger et rødt kort for å aktivere dette objektet,"Potrzebujesz czerwonej karty, aby aktywować ten obiekt",Você precisa de um cartão de acesso vermelho para ativar este objeto,Precisas de um cartão de acesso vermelho para ativar este objeto,"Ai nevoie de un card roșu pentru a activa acest obiect",Для применения нужна красная карта,Треба вам црвена карта да би активирали овај предмет,Du behöver ett rött kort för att aktivera det här föremålet.,Bu nesneyi etkinleştirmek için kırmızı bir karta ihtiyacınız var,"Вам потрібна червона ключ-карта, щоб активувати цей об'єкт" -You need a yellow card to activate this object,PD_YELLOWCO,,,,K aktivaci tohoto objektu potřebuješ žlutou kartu.,Du skal bruge et gult kort for at aktivere denne objekt,"Du brauchst eine gelbe Schlüsselkarte, um dieses Objekt zu aktivieren.",Χρειάζεσε μια κύτρινη κάρτα για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas flavan karton por aktivigi ĉi tiun objekton,Necesitas una tarjeta amarilla para activar este objeto,,Tarvitset keltaisen avainkortin aktivoidaksesi tämän kappaleen,Il vous faut une carte jaune pour activer cet objet.,Kell egy sárga kártya hogy aktiváld ezt a tárgyat,ti serve una card d'accesso gialla per attivare questo oggetto ,この装置には イエローカード が必要だ。,이 물체를 작동시키기 위해선 황색 키카드가 필요합니다,Je hebt een gele sleutelkaart nodig om dit voorwerp te activeren.,Du trenger et gult kort for å aktivere dette objektet,"Potrzebujesz żółtej karty, aby aktywować ten obiekt",Você precisa de um cartão de acesso amarelo para ativar este objeto,Precisas de um cartão de acesso amarelo para ativar este objeto,"Ai nevoie de un card galben pentru a activa +You need a yellow card to activate this object,PD_YELLOWCO,,,,K aktivaci tohoto objektu potřebuješ žlutou kartu.,Du skal bruge et gult kort for at aktivere denne objekt,"Du brauchst eine gelbe Schlüsselkarte, um dieses Objekt zu aktivieren.",Χρειάζεσε μια κύτρινη κάρτα για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas flavan karton por aktivigi ĉi tiun objekton,Necesitas una tarjeta amarilla para activar este objeto,,Tarvitset keltaisen avainkortin aktivoidaksesi tämän kappaleen,Il vous faut une carte jaune pour activer cet objet.,,Kell egy sárga kártya hogy aktiváld ezt a tárgyat,ti serve una card d'accesso gialla per attivare questo oggetto ,この装置には イエローカード が必要だ。,이 물체를 작동시키기 위해선 황색 키카드가 필요합니다,Je hebt een gele sleutelkaart nodig om dit voorwerp te activeren.,Du trenger et gult kort for å aktivere dette objektet,"Potrzebujesz żółtej karty, aby aktywować ten obiekt",Você precisa de um cartão de acesso amarelo para ativar este objeto,Precisas de um cartão de acesso amarelo para ativar este objeto,"Ai nevoie de un card galben pentru a activa acest obiect",Для применения нужна жёлтая карта,Треба вам жута карта да би активирали овај предмет,Du behöver ett gult kort för att aktivera det här föremålet.,Bu nesneyi etkinleştirmek için sarı bir karta ihtiyacınız var,"Вам потрібна жовта ключ-карта, щоб активувати цей об'єкт" -You need a blue skull to activate this object,PD_BLUESO,,,,K aktivaci tohoto objektu potřebuješ modrou lebku.,Du skal bruge et blåt kranium for at aktivere denne objekt,"Du brauchst einen blauen Schädel-Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα μπλέ κρανιο για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas bluan kranion por aktivigi ĉi tiun objekton,Necesitas una calavera azul para activar este objeto,Necesitas un cráneo azul para activar este objeto,Tarvitset sinisen kalloavaimen aktivoidaksesi tämän kappaleen,Il vous faut un crâne bleu pour activer cet objet.,Kell egy kék koponya hogy aktiváld ezt a tárgyat.,ti serve una chiave-teschio blu per attivare questo oggetto ,この装置には ブルースカル が必要だ。,이 물체를 작동시키기 위해선 청색 해골이 필요합니다,Je hebt een blauwe schedel nodig om dit voorwerp te activeren.,Du trenger en blå hodeskalle for å aktivere dette objektet,"Potrzebujesz niebieskiej czaszki, aby aktywować ten obiekt",Você precisa de uma chave-crânio azul para ativar este objeto,Precisas de uma chave crânio azul para ativar este objeto,"Ai nevoie de un craniu albastru pentru a activa +You need a blue skull to activate this object,PD_BLUESO,,,,K aktivaci tohoto objektu potřebuješ modrou lebku.,Du skal bruge et blåt kranium for at aktivere denne objekt,"Du brauchst einen blauen Schädel-Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα μπλέ κρανιο για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas bluan kranion por aktivigi ĉi tiun objekton,Necesitas una calavera azul para activar este objeto,Necesitas un cráneo azul para activar este objeto,Tarvitset sinisen kalloavaimen aktivoidaksesi tämän kappaleen,Il vous faut un crâne bleu pour activer cet objet.,,Kell egy kék koponya hogy aktiváld ezt a tárgyat.,ti serve una chiave-teschio blu per attivare questo oggetto ,この装置には ブルースカル が必要だ。,이 물체를 작동시키기 위해선 청색 해골이 필요합니다,Je hebt een blauwe schedel nodig om dit voorwerp te activeren.,Du trenger en blå hodeskalle for å aktivere dette objektet,"Potrzebujesz niebieskiej czaszki, aby aktywować ten obiekt",Você precisa de uma chave-crânio azul para ativar este objeto,Precisas de uma chave crânio azul para ativar este objeto,"Ai nevoie de un craniu albastru pentru a activa acest obiect",Для применения нужен синий череп,Треба вам плава лобања да би активирали овај предмет,Du behöver en blå skalle för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için mavi bir kafatasına ihtiyacınız var,"Вам потрібен синій ключ-череп, щоб активувати цей об'єкт" -You need a red skull to activate this object,PD_REDSO,,,,K aktivaci tohoto objektu potřebuješ červenou lebku.,Du skal bruge et rødt kranium for at aktivere denne objekt,"Du brauchst einen roten Schädel-Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κόκινο κρανιο για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas ruĝan kranion por aktivigi ĉi tiun objekton,Necesitas una calavera roja para activar este objeto,Necesitas un cráneo rojo para activar este objeto,Tarvitset punaisen kalloavaimen aktivoidaksesi tämän kappaleen,Il vous faut un crâne rouge pour activer cet objet.,Kell egy piros koponya hogy aktiváld ezt a tárgyat.,ti serve una chiave-teschio rossa per attivare questo oggetto ,この装置には レッドスカル が必要だ。,이 물체를 작동시키기 위해선 적색 해골이 필요합니다,Je hebt een rode schedel nodig om dit voorwerp te activeren.,Du trenger en rød hodeskalle for å aktivere dette objektet,"Potrzebujesz czerwonej czaszki, aby aktywować ten obiekt",Você precisa de uma chave-crânio vermelha para ativar este objeto,Precisas de uma chave crânio vermelha para ativar este objeto,"Ai nevoie de un craniu roșu pentru a activa +You need a red skull to activate this object,PD_REDSO,,,,K aktivaci tohoto objektu potřebuješ červenou lebku.,Du skal bruge et rødt kranium for at aktivere denne objekt,"Du brauchst einen roten Schädel-Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κόκινο κρανιο για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas ruĝan kranion por aktivigi ĉi tiun objekton,Necesitas una calavera roja para activar este objeto,Necesitas un cráneo rojo para activar este objeto,Tarvitset punaisen kalloavaimen aktivoidaksesi tämän kappaleen,Il vous faut un crâne rouge pour activer cet objet.,,Kell egy piros koponya hogy aktiváld ezt a tárgyat.,ti serve una chiave-teschio rossa per attivare questo oggetto ,この装置には レッドスカル が必要だ。,이 물체를 작동시키기 위해선 적색 해골이 필요합니다,Je hebt een rode schedel nodig om dit voorwerp te activeren.,Du trenger en rød hodeskalle for å aktivere dette objektet,"Potrzebujesz czerwonej czaszki, aby aktywować ten obiekt",Você precisa de uma chave-crânio vermelha para ativar este objeto,Precisas de uma chave crânio vermelha para ativar este objeto,"Ai nevoie de un craniu roșu pentru a activa acest obiect",Для применения нужен красный череп,Треба вам црвена лобања да би активирали овај предмет,Du behöver en röd skalle för att aktivera det här föremålet.,Bu nesneyi etkinleştirmek için kırmızı bir kafatasına ihtiyacınız var,"Вам потрібен червоний ключ-череп, щоб активувати цей об'єкт" -You need a yellow skull to activate this object,PD_YELLOWSO,,,,K aktivaci tohoto objektu potřebuješ žlutou lebku.,Du skal bruge et gult kranium for at aktivere denne objekt,"Du brauchst einen gelben Schädel-Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κύτρινο κρανιο για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas flavan kranion por aktivigi ĉi tiun objekton,Necesitas una calavera amarilla para activar este objeto,Necesitas un cráneo amarillo para activar este objeto,Tarvitset keltaisen kalloavaimen aktivoidaksesi tämän kappaleen,Il vous faut un crâne jaune pour activer cet objet.,Kell egy sárga koponya hogy aktiváld ezt a tárgyat.,ti serve una chiave-teschio gialla per attivare questo oggetto ,この装置には イエロースカル が必要だ。,이 물체를 작동시키기 위해선 황색 해골이 필요합니다,Je hebt een gele schedel nodig om dit voorwerp te activeren.,Du trenger en gul hodeskalle for å aktivere dette objektet,"Potrzebujesz żółtej czaszki, aby aktywować ten obiekt",Você precisa de uma chave-crânio amarela para ativar este objeto,Precisas de uma chave crânio amarela para ativar este objeto,"Ai nevoie de un craniu galben pentru a activa +You need a yellow skull to activate this object,PD_YELLOWSO,,,,K aktivaci tohoto objektu potřebuješ žlutou lebku.,Du skal bruge et gult kranium for at aktivere denne objekt,"Du brauchst einen gelben Schädel-Schlüssel, um dieses Objekt zu aktivieren.",Χρειάζεσε ένα κύτρινο κρανιο για να ενεργοποίησεις αυτο το αντικείμενο,Vi bezonas flavan kranion por aktivigi ĉi tiun objekton,Necesitas una calavera amarilla para activar este objeto,Necesitas un cráneo amarillo para activar este objeto,Tarvitset keltaisen kalloavaimen aktivoidaksesi tämän kappaleen,Il vous faut un crâne jaune pour activer cet objet.,,Kell egy sárga koponya hogy aktiváld ezt a tárgyat.,ti serve una chiave-teschio gialla per attivare questo oggetto ,この装置には イエロースカル が必要だ。,이 물체를 작동시키기 위해선 황색 해골이 필요합니다,Je hebt een gele schedel nodig om dit voorwerp te activeren.,Du trenger en gul hodeskalle for å aktivere dette objektet,"Potrzebujesz żółtej czaszki, aby aktywować ten obiekt",Você precisa de uma chave-crânio amarela para ativar este objeto,Precisas de uma chave crânio amarela para ativar este objeto,"Ai nevoie de un craniu galben pentru a activa acest obiect",Для применения нужен жёлтый череп,Треба вам жута лобања да би активирали овај предмет,Du behöver en gul skalle för att aktivera detta föremål.,Bu nesneyi etkinleştirmek için sarı bir kafatasına ihtiyacınız var,"Вам потрібен жовтий ключ-череп, щоб активувати цей об'єкт" -You need a blue card to open this door,PD_BLUEC,,,,K otevření těchto dveří potřebuješ modrou kartu.,Du skal bruge et blåt kort for at åbne denne dør,"Du brauchst eine blaue Schlüsselkarte, um diese Tür zu öffnen",Χρειάζεσε μια μπλέ κάρτα για να ανοίξεις αυτή τη πόρτα,Vi bezonas bluan karton por malfermi ĉi tiun pordon,Necesitas una tarjeta azul para abrir esta puerta,,Tarvitset sinisen avainkortin avataksesi tämän oven,Il vous faut une carte bleue pour ouvrir cette porte.,Ez az ajtó egy kék kártyával nyílik.,Ti serve una card d'accesso blu per aprire questa porta,このドアには ブルーカード が必要だ。,이 문을 열기 위해선 청색 키카드가 필요합니다,Je hebt een blauwe sleutelkaart nodig om deze deur te openen.,Du trenger et blått kort for å åpne denne døren,"Potrzebujesz niebieskiej karty, aby otworzyć te drzwi",Você precisa de um cartão de acesso azul para abrir esta porta,Precisas de um cartão de acesso azul para abrir esta porta,"Ai nevoie de un card albastru pentru a activa +You need a blue card to open this door,PD_BLUEC,,,,K otevření těchto dveří potřebuješ modrou kartu.,Du skal bruge et blåt kort for at åbne denne dør,"Du brauchst eine blaue Schlüsselkarte, um diese Tür zu öffnen",Χρειάζεσε μια μπλέ κάρτα για να ανοίξεις αυτή τη πόρτα,Vi bezonas bluan karton por malfermi ĉi tiun pordon,Necesitas una tarjeta azul para abrir esta puerta,,Tarvitset sinisen avainkortin avataksesi tämän oven,Il vous faut une carte bleue pour ouvrir cette porte.,,Ez az ajtó egy kék kártyával nyílik.,Ti serve una card d'accesso blu per aprire questa porta,このドアには ブルーカード が必要だ。,이 문을 열기 위해선 청색 키카드가 필요합니다,Je hebt een blauwe sleutelkaart nodig om deze deur te openen.,Du trenger et blått kort for å åpne denne døren,"Potrzebujesz niebieskiej karty, aby otworzyć te drzwi",Você precisa de um cartão de acesso azul para abrir esta porta,Precisas de um cartão de acesso azul para abrir esta porta,"Ai nevoie de un card albastru pentru a activa această usă",Для открытия нужна синяя карта,Треба вам плава карта да би отворили ова врата,Du behöver ett blått kort för att öppna den här dörren.,Bu kapıyı açmak için mavi bir karta ihtiyacınız var,"Вам потрібна синя карта, щоб активувати цей об'єкт" -You need a red card to open this door,PD_REDC,,,,K otevření těchto dveří potřebuješ červenou kartu.,Du skal bruge et rødt kort for at åbne denne dør,"Du brauchst eine rote Schlüsselkarte, um diese Tür zu öffnen",Χρειάζεσε μια κόκινη κάρτα για να ανοίξεις αυτή τη πόρτα,Vi bezonas ruĝan karton por malfermi ĉi tiun pordon,Necesitas una tarjeta roja para abrir esta puerta,,Tarvitset punaisen avainkortin avataksesi tämän oven,Il vous faut une carte rouge pour ouvrir cette porte.,Ez az ajtó egy piros kártyával nyílik.,Ti serve una card d'accesso rossa per aprire questa porta,このドアには レッドカード が必要だ。,이 문을 열기 위해선 적색 키카드가 필요합니다,Je hebt een rode sleutelkaart nodig om deze deur te openen.,Du trenger et rødt kort for å åpne denne døren,"Potrzebujesz czerwonej karty, aby otworzyć te drzwi",Você precisa de um cartão de acesso vermelho para abrir esta porta,Precisas de um cartão de acesso vermelho para abrir esta porta,"Ai nevoie de un card galben pentru a activa +You need a red card to open this door,PD_REDC,,,,K otevření těchto dveří potřebuješ červenou kartu.,Du skal bruge et rødt kort for at åbne denne dør,"Du brauchst eine rote Schlüsselkarte, um diese Tür zu öffnen",Χρειάζεσε μια κόκινη κάρτα για να ανοίξεις αυτή τη πόρτα,Vi bezonas ruĝan karton por malfermi ĉi tiun pordon,Necesitas una tarjeta roja para abrir esta puerta,,Tarvitset punaisen avainkortin avataksesi tämän oven,Il vous faut une carte rouge pour ouvrir cette porte.,,Ez az ajtó egy piros kártyával nyílik.,Ti serve una card d'accesso rossa per aprire questa porta,このドアには レッドカード が必要だ。,이 문을 열기 위해선 적색 키카드가 필요합니다,Je hebt een rode sleutelkaart nodig om deze deur te openen.,Du trenger et rødt kort for å åpne denne døren,"Potrzebujesz czerwonej karty, aby otworzyć te drzwi",Você precisa de um cartão de acesso vermelho para abrir esta porta,Precisas de um cartão de acesso vermelho para abrir esta porta,"Ai nevoie de un card galben pentru a activa această ușă",Для открытия нужна красная карта,Треба вам црвена карта да би отворили ова врата,Du behöver ett rött kort för att öppna den här dörren.,Bu kapıyı açmak için kırmızı bir karta ihtiyacınız var.,"Вам потрібна червона карта, щоб активувати цей об'єкт" -You need a yellow card to open this door,PD_YELLOWC,,,,K otevření těchto dveří potřebuješ žlutou kartu.,Du skal bruge et gult kort for at åbne denne dør,"Du brauchst eine gelbe Schlüsselkarte, um diese Tür zu öffnen",Χρειάζεσε μια κύτρινη κάρτα για να ανοίξεις αυτή τη πόρτα,Vi bezonas flavan karton por malfermi ĉi tiun pordon,Necesitas una tarjeta amarilla para abrir esta puerta,,Tarvitset keltaisen avainkortin avataksesi tämän oven,Il vous faut une carte jaune pour ouvrir cette porte.,Ez az ajtó egy sárga kártyával nyílik.,Ti serve una card d'accesso gialla per aprire questa porta,このドアには イエローカード が必要だ。,이 문을 열기 위해선 황색 키카드가 필요합니다,Je hebt een gele sleutelkaart nodig om deze deur te openen.,Du trenger et gult kort for å åpne denne døren,"Potrzebujesz żółtej karty, aby otworzyć te drzwi",Você precisa de um cartão de acesso amarelo para abrir esta porta,Precisas de um cartão de acesso amarelo para abrir esta porta,"Ai nevoie de un card galben pentru a activa +You need a yellow card to open this door,PD_YELLOWC,,,,K otevření těchto dveří potřebuješ žlutou kartu.,Du skal bruge et gult kort for at åbne denne dør,"Du brauchst eine gelbe Schlüsselkarte, um diese Tür zu öffnen",Χρειάζεσε μια κύτρινη κάρτα για να ανοίξεις αυτή τη πόρτα,Vi bezonas flavan karton por malfermi ĉi tiun pordon,Necesitas una tarjeta amarilla para abrir esta puerta,,Tarvitset keltaisen avainkortin avataksesi tämän oven,Il vous faut une carte jaune pour ouvrir cette porte.,,Ez az ajtó egy sárga kártyával nyílik.,Ti serve una card d'accesso gialla per aprire questa porta,このドアには イエローカード が必要だ。,이 문을 열기 위해선 황색 키카드가 필요합니다,Je hebt een gele sleutelkaart nodig om deze deur te openen.,Du trenger et gult kort for å åpne denne døren,"Potrzebujesz żółtej karty, aby otworzyć te drzwi",Você precisa de um cartão de acesso amarelo para abrir esta porta,Precisas de um cartão de acesso amarelo para abrir esta porta,"Ai nevoie de un card galben pentru a activa această ușă",Для открытия нужна жёлтая карта,Треба вам жута карта да би отворили ова врата,Du behöver ett gult kort för att öppna den här dörren.,Bu kapıyı açmak için sarı bir karta ihtiyacınız var,"Вам потрібна жовта карта, щоб активувати цей об'єкт" -You need a blue skull to open this door,PD_BLUES,,,,K otevření těchto dveří potřebuješ modrou lebku.,Du skal bruge et blåt kranium for at åbne denne dør,"Du brauchst einen blauen Schädel-Schlüssel, um diese Tür zu öffnen",Χρειάζεσε ένα μπλέ κρανίο για να ανοίξεις αυτή τη πόρτα,Vi bezonas bluan kranion por malfermi ĉi tiun pordon,Necesitas una calavera azul para abrir esta puerta,Necesitas un cráneo azul para abrir esta puerta,Tarvitset sinisen kalloavaimen avataksesi tämän oven,Il vous faut un crâne bleu pour ouvrir cette porte.,Ez az ajtó egy kék koponyával nyílik.,Ti serve una chiave-teschio blu per aprire questa porta,このドアには ブルースカル が必要だ。,이 문을 열기 위해선 청색 해골이 필요합니다,Je hebt een blauwe schedel nodig om deze deur te openen.,Du trenger en blå hodeskalle for å åpne denne døren,"Potrzebujesz niebieskiej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio azul para abrir esta porta,Precisas de uma chave crânio azul para abrir esta porta,"Ai nevoie de un craniu albastru pentru a activa +You need a blue skull to open this door,PD_BLUES,,,,K otevření těchto dveří potřebuješ modrou lebku.,Du skal bruge et blåt kranium for at åbne denne dør,"Du brauchst einen blauen Schädel-Schlüssel, um diese Tür zu öffnen",Χρειάζεσε ένα μπλέ κρανίο για να ανοίξεις αυτή τη πόρτα,Vi bezonas bluan kranion por malfermi ĉi tiun pordon,Necesitas una calavera azul para abrir esta puerta,Necesitas un cráneo azul para abrir esta puerta,Tarvitset sinisen kalloavaimen avataksesi tämän oven,Il vous faut un crâne bleu pour ouvrir cette porte.,,Ez az ajtó egy kék koponyával nyílik.,Ti serve una chiave-teschio blu per aprire questa porta,このドアには ブルースカル が必要だ。,이 문을 열기 위해선 청색 해골이 필요합니다,Je hebt een blauwe schedel nodig om deze deur te openen.,Du trenger en blå hodeskalle for å åpne denne døren,"Potrzebujesz niebieskiej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio azul para abrir esta porta,Precisas de uma chave crânio azul para abrir esta porta,"Ai nevoie de un craniu albastru pentru a activa această ușă",Для открытия нужен синий череп,Треба вам плава лобања да би отворили ова врата,Du behöver en blå skalle för att öppna den här dörren.,Bu kapıyı açmak için mavi bir kafatasına ihtiyacın var.,"Вам потрібен синій череп, щоб активувати цей об'єкт" -You need a red skull to open this door,PD_REDS,,,,K otevření těchto dveří potřebuješ červenou lebku.,Du skal bruge et rødt kranium for at åbne denne dør,"Du brauchst einen roten Schädel-Schlüssel, um diese Tür zu öffnen",Χρειάζεσε ένα κόκινο κρανίο για να ανοίξεις αυτή τη πόρτα,Vi bezonas ruĝan kranion por malfermi ĉi tiun pordon,Necesitas una calavera roja para abrir esta puerta,Necesitas un cráneo rojo para abrir esta puerta,Tarvitset punaisen kalloavaimen avataksesi tämän oven,Il vous faut un crâne rouge pour ouvrir cette porte.,Ez az ajtó egy piros koponyával nyílik.,Ti serve una chiave-teschio rossa per aprire questa porta,このドアには レッドスカル が必要だ。,이 문을 열기 위해선 적색 해골이 필요합니다,Je hebt een rode schedel nodig om deze deur te openen.,Du trenger en rød hodeskalle for å åpne denne døren,"Potrzebujesz czerwonej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio vermelha para abrir esta porta,Precsias de uma chave crânio vermelha para abrir esta porta,"Ai nevoie de un craniu roșu pentru a activa +You need a red skull to open this door,PD_REDS,,,,K otevření těchto dveří potřebuješ červenou lebku.,Du skal bruge et rødt kranium for at åbne denne dør,"Du brauchst einen roten Schädel-Schlüssel, um diese Tür zu öffnen",Χρειάζεσε ένα κόκινο κρανίο για να ανοίξεις αυτή τη πόρτα,Vi bezonas ruĝan kranion por malfermi ĉi tiun pordon,Necesitas una calavera roja para abrir esta puerta,Necesitas un cráneo rojo para abrir esta puerta,Tarvitset punaisen kalloavaimen avataksesi tämän oven,Il vous faut un crâne rouge pour ouvrir cette porte.,,Ez az ajtó egy piros koponyával nyílik.,Ti serve una chiave-teschio rossa per aprire questa porta,このドアには レッドスカル が必要だ。,이 문을 열기 위해선 적색 해골이 필요합니다,Je hebt een rode schedel nodig om deze deur te openen.,Du trenger en rød hodeskalle for å åpne denne døren,"Potrzebujesz czerwonej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio vermelha para abrir esta porta,Precsias de uma chave crânio vermelha para abrir esta porta,"Ai nevoie de un craniu roșu pentru a activa această ușă",Для открытия нужен красный череп,Треба вам црвена лобања да би отворили ова врата,Du behöver en röd skalle för att öppna den här dörren.,Bu kapıyı açmak için kırmızı bir kafatasına ihtiyacın var.,"Вам потрібен червоний череп, щоб активувати цей об'єкт" -You need a yellow skull to open this door,PD_YELLOWS,,,,K otevření těchto dveří potřebuješ žlutou lebku.,Du skal bruge et gult kranium for at åbne denne dør,"Du brauchst einen gelben Schädel-Schlüssel, um diese Tür zu öffnen",Χρειάζεσε ένα κύτρινο κρανίο για να ανοίξεις αυτή τη πόρτα,Vi bezonas flavan kranion por malfermi ĉi tiun pordon,Necesitas una calavera amarilla para abrir esta puerta,Necesitas un cráneo amarillo para abrir esta puerta,Tarvitset keltaisen kalloavaimen avataksesi tämän oven,Il vous faut un crâne jaune pour ouvrir cette porte.,Ez az ajtó egy sárga koponyával nyílik.,Ti serve una chiave-teschio gialla per aprire questa porta,このドアには イエロースカル が必要だ。,이 문을 열기 위해선 황색 해골이 필요합니다,Je hebt een gele schedel nodig om deze deur te openen.,Du trenger en gul hodeskalle for å åpne denne døren,"Potrzebujesz żółtej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio amarela para abrir esta porta,Precisas de uma chave crânio amarela para abrir esta porta,"Ai nevoie de un craniu galben pentru a activa +You need a yellow skull to open this door,PD_YELLOWS,,,,K otevření těchto dveří potřebuješ žlutou lebku.,Du skal bruge et gult kranium for at åbne denne dør,"Du brauchst einen gelben Schädel-Schlüssel, um diese Tür zu öffnen",Χρειάζεσε ένα κύτρινο κρανίο για να ανοίξεις αυτή τη πόρτα,Vi bezonas flavan kranion por malfermi ĉi tiun pordon,Necesitas una calavera amarilla para abrir esta puerta,Necesitas un cráneo amarillo para abrir esta puerta,Tarvitset keltaisen kalloavaimen avataksesi tämän oven,Il vous faut un crâne jaune pour ouvrir cette porte.,,Ez az ajtó egy sárga koponyával nyílik.,Ti serve una chiave-teschio gialla per aprire questa porta,このドアには イエロースカル が必要だ。,이 문을 열기 위해선 황색 해골이 필요합니다,Je hebt een gele schedel nodig om deze deur te openen.,Du trenger en gul hodeskalle for å åpne denne døren,"Potrzebujesz żółtej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio amarela para abrir esta porta,Precisas de uma chave crânio amarela para abrir esta porta,"Ai nevoie de un craniu galben pentru a activa această ușă",Для открытия нужен жёлтый череп,Треба вам жута лобања да би отворили ова врата,Du behöver en gul skalle för att öppna den här dörren.,Bu kapıyı açmak için sarı bir kafatasına ihtiyacın var.,"Вам потрібен жовтий череп, щоб активувати цей об'єкт" -,,Cast call names,,,,,,,,,,,,,,,,,,,,,,,,,, -Zombieman,CC_ZOMBIE,,,,Zombie,Zombie,Zombie,Ζόμπι,Zombio,Zombi,,Zombimies,Zombie,Zombi,Zombie Marine,ゾンビ兵,좀비맨,Zombie,Zombiemann,Zombie,Zumbi,Homem Zombie,Zombi,Зомби,Зомби,Zombie,Zombi,Зомбі -Shotgun Guy,CC_SHOTGUN,a.k.a. (former human) sergeant,,,Seržant,Sergent,Schütze,Τύπος με ντουφέκι,Ĉaspafilulo,Sargento,,Haulikkohemmo,Type au Fusil,Őrmester,Zombie Sergente,ショットガンゾンビ,샷건 가이,Jachtgeweerkerel,Sersjant,Zombie-sierżant,Sargento Possuído,Tipo de Espingarda,Pușcaș,Зомби-сержант,Пумпераш,Hagelgevärskille,Çavuş,Зомбі-сержант -Heavy Weapon Dude,CC_HEAVY,a.k.a. former commando,,,Kulometčík,,MG-Schütze,Τύπος με βαρί όπλο,Pezarmilulo,Ametrallador,,Raskasaseäijä,Type au Gros Flingue,Kommandós,Zombie Commando,ヘビーウェポンゾンビ,헤비 웨폰 듀드,Zwarewapenskerel,Maskingeværskyt,Ciężkozbrojny Zombie,Comando Possuído,Gajo das Armas Pesadas,Mitralior,Зомби-пулемётчик,Митраљезац,Tunga vapen kille,Ağır Silah Dostum,Кулеметник -Imp,CC_IMP,,,,Čert,,Kobold,Διάβολος,Diableto,,,Piru,Diablotin,Tűzkobold,,インプ,임프,,,Diablik,Diabrete,,Drac,Имп,Враг,,İmp,Імп -Demon,CC_DEMON,,,,Démon,Dæmon,Dämon,Δαίμονας,Demono,Demonio,,Demoni,Démon,Démon,Pinky,デーモン,데몬,Demoon,,,Demônio,,,Демон,Демон,,İblis,Демон -Lost Soul,CC_LOST,,,,Ztracená duše,Fortabt sjæl,Verlorene Seele,Χαμένη Ξυχή,Perdita Animo,Alma Errante,,Kadonnut sielu,Ame Perdue,Kóbor lélek,Anima Errante,ロストソウル,로스트 소울,Verloren ziel,Fortapt sjel,Zaginiona Dusza,Alma Perdida,Alma Penada,Suflet Pierdut,Потерянная душа,Изгубљена душа,Förlorad själ,Kayıp Ruh,Пропаща душа -Cacodemon,CC_CACO,,,,Kakodémon,Cacodæmon,Cacodämon,Κακοδαίμονας,Kakodemono,Cacodemonio,,Kakodemoni,Cacodémon,Kakodémon,Cacodemone,カコデーモン,카코데몬,Cacodemoon,Kacodemon,Kakodemon,Cacodemônio,,Cacodemon,Какодемон,Какодемон,Cacodemon,Cacodemon,Какодемон -Hell Knight,CC_HELL,,,,Pekelný rytíř,Helvedesridder,Höllenritter,Ιππότης της Κόλασης,Inferkavaliro,Caballero del Infierno,,Hornanritari,Chevalier Infernal,Pokollovag,Cavaliere Infernale,ヘルナイト,헬 나이트,Helleridder,Helvetesridder,Rycerz Piekła,Cavaleiro Infernal,Cavaleiro Infernal,Cavaler al Infernului,Рыцарь ада,Витез пакла,Helvete riddare,Cehennem Şövalyesi,Лицар Пекла -Baron of Hell,CC_BARON,,,,Baron pekel,Helvedesbaron,Höllenbaron,Βαρώνος της Κολασης,Barono de Infero,Barón del Infierno,,Hornanparoni,Baron des Enfers,Pokolbáró,Barone Infernale,バロンオブヘル,바론 오브 헬,Baron des Hels,Helvetesbaron,Baron Piekła,Barão do Inferno,,Baron al Infernului,Барон ада,Барон пакла,Helvetets baron,Cehennem Baronu,Барон Пекла -Arachnotron,CC_ARACH,,,,,,,Αράχνοτρον,Elektraraneo,Aracnotrón,,Araknotroni,,Póktron,,アラクノトロン,아라크노트론,,,,Aracnotron,,Aracnotron,Арахнотрон,Паукотрон,,Araknotron,Арахнотрон -Pain Elemental,CC_PAIN,,,,Živel trýzně,Smerteelementar,Elementarschmerz,Στοιχείομα του Πόνου,Doloro-Elementulo,Elemental del Dolor,,Kivun henki,Elémentaire de Douleur,Elemi Kín,Elementale del Dolore,ペインエレメンタル,페인 엘리멘탈,Smartelementaal,Smerte Elemental,Żywiołak Bólu,Elemental da Dor,,Elemental al Durerii,Элементаль боли,Елементал патње,Smärta elementär,Acı Elementi,Елементаль болю -Revenant,CC_REVEN,,,,Umrlec,Hævnen,Wiederauferstandener,Εκδικητής,Renaskitulo,,,Henkiinpalannut,,Kísértet,,レバナント,레버넌트,Wreker,Gjenganger,Zjawa,Insepulto,Renascido,Nemort,Ревенант,Повратник,Återfödare,,Ревевант -Mancubus,CC_MANCU,,,,Mankubus,,,Χοντρός,Mankubo,,,Mankubus,Mancube,Mankubusz,,マンキュバス,맨큐버스,,,Antropokub,,,,Манкубус,Манкубус,,,Манкубус -Arch-Vile,CC_ARCH,,,,Veleběs,Ærkevile,Scheusal,Νεκρομάντις,Ĉef-Fiulo,,,Arkkihirvitys,Arche-vile,Ősármány,Arch-vile,アーチバイル,아크-바일,Aartsgedrocht,Erkefiende,Arcy-Podlec,Arquivil,,Abject,Архвиль,Арчвајл,Ärkevild,Baş Aşağılık,Арчвайл -The Spider Mastermind,CC_SPIDER,,,,Pavoučí velevůdce,Edderkoppen Mastermind,Der Spinnenmeister,Το Αραχνό Ιθύνων Νους,La Elektraraneo-Mastro,La Mente-Maestra Arácnida,,Hämähäkkiaivot,L'Araignée Commandante,Pókelme,L'Aracnomente Suprema,スパイダーマスターマインド,스파이더 마스터마인드,Het Spinnenmeesterbrein,Edderkopphjernen,Pajęczy Mistrz,A Aranha-Mestra,,Păianjen Maestru,Паук-предводитель,Паук-руководилац,Spindelns hjärna,Örümcek Beyni,Павук-полководець -The Cyberdemon,CC_CYBER,,,,Kyberdémon,Cyberdæmonen,Der Cyberdämon,Ο Cyber-δαίμονας,La Ciberdemono,El Ciberdemonio,,Kyberdemoni,Le Cyberdémon,A Kiberdémon,Il Cyberdemonio,サイバーデーモン,사이버데몬,Het Cyberdemoon,Kyberdemonen,Cyberdemon,O Ciberdemônio,,Ciberdemon,Кибердемон,Сајбердемон,Cyberdemon,Siber Şeytan,Кібердемон -Our Hero,CC_HERO,,,,Náš hrdina,Vores helt,Unser Held,Ο ήρωας μας,Nia heroo,Nuestro héroe,,Sankarimme,Notre Héros,Hősünk,Il Nostro eroe,我らのヒーロー,우리들의 영웅,Onze held,Vår helt,Nasz bohater,Nosso herói,O Nosso Herói,Eroul Nostru,Наш герой,Наш херој,Vår hjälte,Bizim Kahramanımız,Наш герой -,,Actor tag names,,,,,,,,,,,,,,,,,,,,,,,,,, -Sergeant,FN_SHOTGUN,,,,Seržant,Sergent,Schütze,Λοχίας,Serĝento,Sargento,,Kersantti,Type au Fusil,Őrmester,Zombie Sergente,ゾンビ軍曹,샷건 가이,,Sersjant,Zombie-sierżant,Sargento,Sargento,Sergent,Зомби-сержант,Водник,Hagelgevärskille,Çavuş,Зомбі-сержант -Chaingunner,FN_HEAVY,,,,Kulometčík,,MG-Schütze,Πολυβόλο Ζόμπι,Maŝinpafilisto,Ametrallador,,Konekiväärimies,Type au Gros Flingue,Kommandós,Zombie Commando,チェーンガンゾンビ,체인거너,Machinegeweerman,Maskingeværskyt,Ciężkozbrojny Zombie,Comando,Metrelhador,Mitralior,Зомби-пулемётчик,Митраљезац,Tunga vapen kille,Ağır Silah Dostum,Кулеметник -Spectre,FN_SPECTRE,,,,Přízrak,Spøgelse,Schemen,Φάντασμα,Fantomo,Espectro,,Haamu,,Lidérc,Spettro,スペクトル,스펙터,Spook,Spøkelse,Widmo,Espectro,,Spectru,Фантом,Авет,,Hayalet,Примара -Spider Mastermind,FN_SPIDER,,,,Pavoučí velevůdce,Edderkoppen Mastermind,Spinnenmeister,Αραχνό Ιθύνων Νους,Elektraraneo-Mastro,Mente-Maestra Arácnida,,Hämähäkkiaivot,L'Araignée Commandante,Pókelme,L'Aracnomente Suprema,スパイダーマスターマインド,스파이더 마스터마인드,Spinnenmeesterbrein,Edderkopphjerne,Pajęczy Mistrz,Aranha-Mestra,,Păianjen Maestru,Паук-предводитель,Паук-руководилац,Spindelns hjärna,Örümcek Beyni,Павук-полководець -Cyberdemon,FN_CYBER,,,,Kyberdémon,Cyberdæmon,Cyberdämon,Cyber-δαίμονας,Ciberdemono,Ciberdemonio,,Kyberdemoni,Le Cyberdémon,Kiberdémon,Il Cyberdemonio,サイバーデーモン,사이버데몬,Cyberdemoon,Kyberdemon,Cyberdemon,Ciberdemônio,,Ciberdemon,Кибердемон,Сајбердемон,Cyberdemon,Siber İblis,Кібердемон -Nazi,FN_WOLFSS,,,,Nácek,,,Ναζιστής,Nazio,,,Natsi,,Náci,Nazista,ナチ兵,나치,,Nazist,Nazista,Nazista,,Nazist,Нацист,Нациста,Nazist,,Нацист -Dog,FN_DOG,,,,Pes,Hund,Hund,Σκύλος,Hundo,Perro,,Koira,Chien,Kutya,Cane,犬,개,Hond,Hund,Pies,Cão,,Câine,Собака,Пас,Hund,Köpek,Пес -Brass Knuckles,TAG_FIST,,,,Boxer,Messing knoer,Schlagringe,Γροθιά,Pugningo,Puño americano,Manopla (puño de acero),Nyrkkirauta,Poing Américain,Bokszer,Tirapugni ,ナックルダスター,너클,Boksbeugels,Knokejern,Kastety,Soco Inglês,Soqueira,Rozetă,Латунный кастет,Боксер,Mässingsknoglar,Pirinç Muşta,Кулаки -Chainsaw,TAG_CHAINSAW,,,,Motorová pila,Kædesav,Kettensäge,Αλλησοπρίονο,Ĉensegilo,Motosierra,,Moottorisaha,Tronçonneuse,Láncfűrész,Motosega,チェーンソウ,전기톱,Kettingzaag,Motorsag,Piła łańcuchowa,Motosserra,,Drujbă,Бензопила,Моторна тестера,Motorsåg,Testere,Бензопила -Pistol,TAG_PISTOL,,,,Pistole,,Pistole,Πιστόλι,Pafileto,Pistola,,Pistooli,Pistolet,Pisztoly,Pistola,ピストル,권총,Pistool,,Pistolet,Pistola,,,Пистолет,Пиштољ,,Tabanca,Пістолет -Shotgun,TAG_SHOTGUN,,,,Brokovnice,Haglgevær,Schrotflinte,Ντουφέκι,Kartoĉa fusilo,Escopeta,,Haulikko,Fusil à pompe,Sörétes Puska,Fucile,ショットガン,샷건,Jachtgeweer,Haglgevær,Strzelba,Espingarda,,Pușcă,Дробовик,Пумпарица,Hagelgevär,Av Tüfeği,Дробовик -Super Shotgun,TAG_SUPERSHOTGUN,,,,Superbrokovnice,Super-Haglgevær,Super-Schrotflinte,Διπλό Ντουφέκι,Dutuba fusilo,Superescopeta,,Superhaulikko,Super Fusil de chasse,Szuper Sörétes,Fucile a doppia canna ,スーパーショットガン,슈퍼 샷건,Superjachtgeweer,Super-Haglgevær,Super strzelba,Espingarda de cano duplo,,Super Pușcă,Супердробовик,Двоцевка,Super hagelgevär,Süper Av Tüfeği,Двостволка -Chaingun,TAG_CHAINGUN,,,,Kulomet,Maskingevær,Maschinengewehr,Πολυβόλο,Maŝinpafilo,Ametralladora,,Gatling-kk,Mitrailleuse,Golyószóró,Mitragliatore a canne rotanti ,チェーンガン,체인건,Machinegeweer,Maskinpistol,Karabin maszynowy,Metralhadora,,Mitralieră rotativă,Пулемёт,Митраљез,Kedjepistol,,Кулемет -Rocket Launcher,TAG_ROCKETLAUNCHER,,,,Raketomet,Raketkaster,Raketenwerfer,Πυραυλοβόλο,Misilpafilo,Lanzamisiles,,Sinko,Lance-Roquettes,Rakétavető,Lanciamissili,ロケットランチャー,로켓 런쳐,Raketwerper,Rakettkaster,Wyrzutnia rakiet,Lança-foguetes,Lança-Mísseis,Lansator de Rachete,Ракетомёт,Бацач ракета,Raketkastare,Roket Fırlatıcı,Ракетомет -Plasma Rifle,TAG_PLASMARIFLE,,,,Plazmová puška,Plasma riffel,Plasmagewehr,Πλάσμα Όπλο,Plasmo-pafilo,Fusil de plasma,,Plasmapyssy,Fusil à Plasma,Plazmafegyver,Fucile al Plasma ,プラズマライフル,플라즈마 라이플,Plasmageweer,Plasmagevær,Karabin plazmowy,Fuzil de Plasma,Pistola de Plasma,Pușcă cu Plasmă,Плазменная пушка,Плазма оружје,Plasmagevär,Plazma Tüfeği,Плазмаган -BFG 9000,TAG_BFG9000,,,,,,,,,,,,,,,,,,,,,,,,ВЈП 9000,,,БФГ 9000 -Bullets,AMMO_CLIP,,,,Kulky,Kugler,Patronen,Σφαίρες,Kugloj,Balas,,Luodit,Balles,Töltények,Proiettili,銃弾,권총 탄약,Kogels,Kuler,Naboje,Balas,,Gloanțe,Пули,Меци,Kulor,Kurşunlar,Кулі -Shotgun Shells,AMMO_SHELLS,,,,Broky,Haglgeværpatroner,Schrotpatronen,Σφαίρες Ντουφεκιού,Kartoĉoj,Cartuchos de escopeta,,Haulikon patruunat,Cartouches,Sörétek,Cartucce per fucile,散弾シェル,샷건 탄약,Jachtgeweerkogels,Haglepatroner,Loftki,Cartuchos de Espingarda,,Proiectile pentru Pușcă,Патроны дробовика,Патроне за пумпарицу,Skottgubbar,Av Tüfeği Fişekleri,Рушничні набої -Rockets,AMMO_ROCKETS,,,,Rakety,Raketter,Raketen,Πύραυλοι,Raketoj,Cohetes,,Raketit,Roquettes,Rakéták,Razzi,ロケット弾,로켓,Raketten,Raketter,Rakiety,Foguetes,Mísseis,Rachete,Ракеты,Ракете,Raketer,Roketler,Ракети -Energy Cells,AMMO_CELLS,,,,Energetické články,Energiceller,Energiezellen,Κύτταρα Ενέργιας,Energiĉeloj,Célula de energía,,Energia-akut,Cellules,Energiacellák,Batterie,エネルギーセル,에너지 셀,Energiecellen,Energiceller,Ogniwa energetyczne,Células de Energia,,Celule cu Energie,Энергобатареи,Енергетске ћелије,Energiceller,Enerji Hücreleri,Енергетичні батареї -,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,, -%o thought %g saw an arachnotron.,OB_STEALTHBABY,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] arachnotrona.","%o troede, @[pro_dk] så en arachnotron.","%o dachte, ein Arachnotron zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Αραχνοτρόν.,"%o pensis, ke @[pro_eo] vidis elektraraneon.",%o ha creído ver un Aracnotrón.,%o creyó haber visto un Aracnotrón.,%o luuli nähneensä araknotronin.,%o a cru voir un Arachnotron.,"%o azt hitte, hogy látott egy póktront.",a %o sembrava di aver visto un arachnotron.,%o がアラクノトロンを見た気がした。,%o 은(는) 아라크노트론을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een arachnotron zag.,%o trodde @[pro_dk] så et arachnotron.,%o kątem oka zauważył@[ao_pl] arachnotrona.,%o achou que viu uma arachnotron.,,%o a crezut că %g a văzut un aracnotron.,Игрок %o краем глаза заметил арахнотрона.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] паукотрона.,%o trodde att @[pro_sv] såg en arachnotron.,%o bir araknotron gördüğünü sandı.,Арахнотрон мелькнув перед очима %o. -%o thought %g saw an archvile.,OB_STEALTHVILE,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] veleběsa.","%o troede, @[pro_dk] så en ærkevile.","%o dachte, ein Scheusal zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Νεκρομάντη,"%o pensis, ke @[pro_eo] vidis ĉef-fiulon.",%o ha creído ver un Arch-Vile.,%o creyó haber visto un Arch-Vile.,%o luuli nähneensä arkkihirvityksen,%o a cru voir un Arche-Vile.,"%o azt hitte, hogy látott egy ősármányt.",a %o sembrava di aver visto un Arch-Vile.,%o がアーチバイルを見た気がした。,%o 은(는) 아크-바일을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een aartsvijand zag.,%o trodde @[pro_dk] så en erkefiende.,%o kątem oka zauważył@[ao_pl] arcypodleca.,%o achou que viu um arquivil.,,%o a crezut că %g a văzut un abject.,Игрок %o краем глаза заметил архвиля.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] једног арчвајла.,%o trodde att @[pro_sv] såg en ärkevild.,%o bir iğrençlik gördüğünü sandı.,Арчвайл мелькнув перед очима %o. -%o thought %g saw a Baron of Hell.,OB_STEALTHBARON,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] barona pekel.","%o troede, @[pro_dk] så en helvedesbaron.","%o dachte, einen Höllenbaron zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Βαρώνο της Κόλασης.,"%o pensis, ke @[pro_eo] vidis Baronon de Infero.",%o ha creído ver un Barón del Infierno.,%o creyó haber visto un Barón del Infierno.,%o luuli nähneensä hornanparonin.,%o a cru voir un Baron des enfers.,"%o azt hitte, hogy látott egy pokolbárót.",a %o sembrava di aver visto un Barone Infernale.,%o がバロンを見た気がした。,%o 은(는) 바론 오브 헬을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een baron van de Hel zag.,%o trodde @[pro_dk] så en helvetesbaron,%o kątem oka zauważył@[ao_pl] Barona Piekła.,%o achou que viu um barão do inferno.,,%o a crezut că %g a văzut un Baron al Infernului.,Игрок %o краем глаза заметил барона ада.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] барона пакла.,%o trodde att @[pro_sv] såg en helvetets baron.,%o bir Cehennem Baronu gördüğünü sandı.,Барон Пекла мелькнув перед очима %o. -%o thought %g saw a cacodemon.,OB_STEALTHCACO,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] kakodémona.","%o troede, @[pro_dk] så en cacodemon.","%o dachte, einen Cacodämonen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Κακοδαίμονα.,"%o pensis, ke @[pro_eo] vidis kakodemonon.",%o ha creído ver un Cacodemonio.,%o creyó haber visto un Cacodemonio.,%o luuli nähneensä kakodemonin.,%o a cru voir un Cacodémon.,"%o azt hitte, hogy látott egy kakodémont.",a %o sembrava di aver visto un cacodemone.,%o がカコデーモンを見た気がした。,%o 은(는) 카코데몬을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een cacodemon zag.,%o trodde @[pro_dk] så en kakodemon.,%o kątem oka zauważył@[ao_pl] kakodemona.,%o achou que viu um cacodemônio.,,%o a crezut că %g a văzut un cacodemon.,Игрок %o краем глаза заметил какодемона.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] какодемона.,%o trodde att @[pro_sv] såg en cacodemon.,%o bir caco iblisi gördüğünü sandı.,Какодемон мелькнув перед очима %o. -%o thought %g saw a chaingunner.,OB_STEALTHCHAINGUY,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] kulometčíka.","%o troede, @[pro_dk] så en chaingunner.","%o dachte, einen MG-Schützen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Ζόμπι με ένα πολυβόλο.,"%o pensis, ke @[pro_eo] vidis maŝinpafiliston.",%o ha creído ver un Ametrallador.,%o creyó haber visto un Ametrallador.,%o luuli nähneensä konekiväärimiehen.,%o a cru voir un mitrailleur.,"%o azt hitte, hogy látott egy kommandóst.",a %o sembrava di aver visto uno zombie commando.,%o がチェインガンナーを見た気がした。,%o 은(는) 체인거너를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een zware wapens kerel zag.,%o trodde @[pro_dk] så en maskingeværskyt.,%o kątem oka zauważył@[ao_pl] ciężkozbrojnego zombie.,%o achou que viu um comando possuído.,%o achou que viu um metrelhador.,%o a crezut că %g a văzut un mitralior.,Игрок %o краем глаза заметил пулемётчика.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] митраљезца.,%o trodde att @[pro_sv] såg en tunga vapen kille.,%o bir ağır silah dostu gördüğünü sandı.,Кулеметник мелькнув перед очима %o. -%o thought %g saw a demon.,OB_STEALTHDEMON,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] démona.","%o troede, @[pro_dk] så en dæmon.","%o dachte, einen Dämonen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα δαίμονα.,"%o pensis, ke @[pro_eo] vidis demonon.",%o ha creído ver un Demonio.,%o creyó haber visto un Demonio.,%o luuli nähneensä demonin.,%o a cru voir un démon.,"%o azt hitte, hogy látott egy démont.",a %o sembrava di aver visto un demone.,%o がデーモンを見た気がした。,%o 은(는) 데몬을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een demon zag.,%o trodde @[pro_dk] så en demon.,%o kątem oka zauważył@[ao_pl] demona.,%o achou que viu um demônio.,,%o a crezut că %g a văzut un demon.,Игрок %o краем глаза заметил демона.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] демона.,%o trodde att @[pro_sv] såg en demon.,%o bir iblis gördüğünü sandı.,Демон мелькнув перед очима %o. -%o thought %g saw a Hell Knight.,OB_STEALTHKNIGHT,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] rytíře pekel.","%o troede, @[pro_dk] så en helvedesridder.","%o dachte, einen Höllenritter zu sehen.",@[art_gr] %o νόμιζε οτι είδε έναν Ιππότη της Κόλασης.,"%o pensis, ke @[pro_eo] vidis Inferkavaliron.",%o ha creído ver un Caballero del Infierno.,%o creyó haber visto un Caballero del Infierno.,%o luuli nähneensä hornanritarin.,%o a cru voir un chevalier infernal.,"%o azt hitte, hogy látott egy pokollovagot.",a %o sembrava di aver visto un Cavaliere Infernale.,%o がヘルナイトを見た気がした。,%o 은(는) 헬 나이트를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een hel ridder zag.,%o trodde @[pro_dk] så en helvetesridder.,%o kątem oka zauważył@[ao_pl] Rycerza Piekła.,%o achou que viu um cavaleiro infernal.,%o achou que viu um cavaleiro infernal.,%o a crezut că %g a văzut un Cavaler al Infernului.,Игрок %o краем глаза заметил рыцаря ада.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] витеза пакла.,%o trodde att @[pro_sv] såg en helvetesriddare.,%o bir Cehennem Şövalyesi gördüğünü sandı.,Лицар Пекла мелькнув перед очима %o. -%o thought %g saw an imp.,OB_STEALTHIMP,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] čerta.","%o troede, @[pro_dk] så en imp.","%o dachte, einen Kobold zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Διάβολο.,"%o pensis, ke @[pro_eo] vidis diableton.",%o ha creído ver un Imp.,%o creyó haber visto un Imp.,%o luuli nähneensä pirun.,%o a cru voir un diablotin.,"%o azt hitte, hogy látott egy tűzkoboldot.",a %o sembrava di aver visto un imp.,%o がインプを見た気がした。,%o 은(는) 임프를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een imp zag.,%o trodde @[pro_dk] så en imp.,%o kątem oka zauważył@[ao_pl] diablika.,%o achou que viu um diabrete.,,%o a crezut că %g a văzut un drac.,Игрок %o краем глаза заметил импа.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] врага.,%o trodde att @[pro_sv] såg en imp.,%o bir impus gördüğünü sandı.,Імп мелькнув перед очима %o. -%o thought %g saw a mancubus.,OB_STEALTHFATSO,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] mankuba.","%o troede, @[pro_dk] så en mankubus.","%o dachte, einen Mancubus zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Χοντρό.,"%o pensis, ke @[pro_eo] vidis mankubon.",%o ha creído ver un Mancubus.,%o creyó haber visto un Mancubus.,%o luuli nähneensä mankubuksen.,%o a cru voir un mancube.,"%o azt hitte, hogy látott egy mankubuszt.",a %o sembrava di aver visto un mancubus.,%o がマンキュバスを見た気がした。,%o 은(는) 맨큐버스를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een mancubus zag.,%o trodde @[pro_dk] så en mancubus.,%o kątem oka zauważył@[ao_pl] antropokuba.,%o achou que viu um mancubus.,,%o a crezut că %g a văzut un mancubus.,Игрок %o краем глаза заметил манкубуса.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] манкубуса.,%o trodde att @[pro_sv] såg en mancubus.,%o bir mancubus gördüğünü sandı.,Манкубус мелькнув перед очима %o. -%o thought %g saw a revenant.,OB_STEALTHUNDEAD,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] umrlce.","%o troede, @[pro_dk] så en hævnen.","%o dachte, einen Wiederauferstandenen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Εκδικητή.,"%o pensis, ke @[pro_eo] vidis renaskitulon.",%o ha creído ver un Revenant.,%o creyó haber visto un Revenant.,%o luuli nähneensä henkiinpalanneen.,%o a cru voir un revenant.,"%o azt hitte, hogy látott egy kísértetet.",a %o sembrava di aver visto un revenant.,%o がレバナントを見た気がした。,%o 은(는) 레버넌트를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een wraakzuchtige zag.,%o trodde @[pro_dk] så en gjenganger.,%o kątem oka zauważył@[ao_pl] zjawę.,%o achou que viu um insepulto.,%o achou que viu um renascido.,%o a crezut că %g a văzut un nemort.,Игрок %o краем глаза заметил ревенанта.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] повратника.,%o trodde att @[pro_sv] såg en återfödare.,%o bir iskelet gördüğünü sandı.,Ревенант мелькнув перед очима %o. -%o thought %g saw a sergeant.,OB_STEALTHSHOTGUNGUY,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] seržanta.","%o troede, @[pro_dk] så en sergent.","%o dachte, einen Schützen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Λοχία.,"%o pensis, ke @[pro_eo] vidis serĝenton.",%o ha creído ver un Sargento.,%o creyó haber visto un Sargento.,%o luuli nähneensä kersantin.,%o a cru voir un type au fusil.,"%o azt hitte, hogy látott egy őrmestert.",a %o sembrava di aver visto un zombie sergente.,%o が軍曹を見た気がした。,%o 은(는) 샷건 가이를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een jachtgeweer kerel zag.,%o trodde @[pro_dk] så en sersjant.,%o kątem oka zauważył@[ao_pl] zombie-sierżanta.,%o achou que viu um sargento possuído.,%o achou que viu um sargento.,%o a crezut că %g a văzut un sergent.,Игрок %o краем глаза заметил сержанта.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] водника.,%o trodde att @[pro_sv] såg en hagelgevärskille.,%o bir çavuş gördüğünü sandı.,Сержант мелькнув перед очима %o. -%o thought %g saw a zombieman.,OB_STEALTHZOMBIE,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] zombíka.","%o troede, @[pro_dk] så en zombie.","%o dachte, einen Zombie zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Ζόμπι.,"%o pensis, ke @[pro_eo] vidis zombion.",%o ha creído ver un Zombi.,%o creyó haber visto un Zombi.,%o luuli nähneensä zombin.,%o a cru voir un zombie.,"%o azt hitte, hogy látott egy zombit.",a %o sembrava di aver visto uno zombie marine.,%o がゾンビ兵を見た気がした。,%o 은(는) 좀비맨을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een zombie zag.,%o trodde @[pro_dk] så en zombiemann.,%o kątem oka zauważył@[ao_pl] zombie.,%o achou que viu um zumbi.,%o achou que viu um zombie.,%o a crezut că %g a văzut un zombi.,Игрок %o краем глаза заметил зомби.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] зомбија.,%o trodde att @[pro_sv] såg en zombie.,%o bir zombi gördüğünü sandı.,Зомбі мелькнув перед очима %o. -%o was punched by a revenant.,OB_UNDEADHIT,,,,%o byl@[ao_cs] udeřen@[ao_cs] umrlcem.,%o blev slået af en genfødt.,%o wurde von einem Wiederauferstandenen K.O geschlagen.,@[art_gr] %o έφαγε μια μπουνία απο έναν Εκδικητή.,%o estis pugnita de renaskitulo.,A %o l@[ao_esp] ha golpeado un Revenant.,A %o l@[ao_esp] golpeó un Revenant.,%o joutui henkiinpalanneen lyömäksi.,%o s'est pris@[e_fr] une raclée de la part d'un revenant.,%o-t kiütötte egy kísértet.,%o è stato colpito dal pugno di un revenant.,%o はレバナントに殴られた。,%o 은(는) 레버넌트에게 맞아 죽었다.,%o werd geslagen door een wraakzuchtige.,%o ble slått av en gjenganger.,%o został@[ao_pl] uderzon@[adj_pl] przez zjawę.,Um insepulto socou %o.,%o foi socad@[ao_ptb] por um renascido.,%o a primit un pumn de la un nemort.,Игрока %o ударил ревенант.,%o је ударен@[adj_1_sr] од стане повратника.,%o blev slagen av en återfödare.,%o bir iskelet tarafından yumruklandı.,%o бу@[adj_1_ua] забит@[adj_4_ua] ревевантом. -%o was slashed by an imp.,OB_IMPHIT,,,,%o byl@[ao_cs] rozsápán@[ao_cs] čertem.,%o blev skåret ned af en spøgelse.,%o wurde von einem Kobold gekratzt.,@[art_gr] %o κόπηκε απο ενα Διάβολο.,%o estis tranĉvundita de diableto.,A %o l@[ao_esp] ha desgarrado un Imp.,A %o l@[ao_esp] desgarró un Imp.,%o joutui pirun sivaltamaksi.,%o a été lacéré@[e_fr] par un diablotin.,%o-t széttépte egy tűzkobold.,%o è stato squarciato da un imp.,%o はインプに切り裂かれた。,%o 은(는) 임프에게 찢겨 죽었다.,%o werd gesneden door een imp.,%o ble kuttet av en imp.,%o został@[ao_pl] rozcięt@[adj_pl] przez diablika.,Um diabrete dilacerou %o.,,%o a fost zgâriat de un drac.,Игрока %o расцарапал имп.,Играча %o је пресеко враг.,%o blev knivhuggen av en imp.,%o bir imp tarafından kesildi.,%o роздер імп. -%o got too close to a cacodemon.,OB_CACOHIT,,,,%o se dostal@[ao_cs] moc blízko ke kakodémonovi.,%o kom for tæt på en cacodæmon.,%o kam dem Cacodämonen zu nahe.,@[art_gr] %o ήτανε πολυ κοντά σε ένα Κακοδαίμονα.,%o tro proksimiĝis al kakodemono.,%o se ha acercado demasiado a un Cacodemonio.,%o se acercó demasiado a un Cacodemonio.,%o meni liian lähelle kakodemonia.,%o s'est approché@[e_fr] trop près d'un Cacodémon.,%o túl közel ment egy kakodémonhoz.,%o si è avvicinato troppo a un cacodemone.,%o はカコデーモンに近づきすぎた。,%o 은(는) 카코데몬과 가까웠다.,%o kwam te dicht bij een cacodemon.,%o kom for nær en kakodemon.,%o pod@[irreg_1_pl] zbyt blisko do kakodemona.,%o chegou muito perto de um cacodemônio.,,%o s-a apropiat prea mult de un cacodemon.,Игрок %o слишком сблизился с какодемоном.,%o се превише приближи@[ao_1_sr] какодемону.,%o kom för nära en cacodemon.,%o bir caco iblisiyle çok yakınlaştı.,%o опини@[adj_2_ua] надто близько до какодемона. -%o was bit by a demon.,OB_DEMONHIT,,,,%o byl@[ao_cs] rozkousán@[ao_cs] démonem.,%o blev bidt af en dæmon.,%o wurde von einem Dämonen gebissen.,@[art_gr] %o δαγκόθηκε απο ένα Δαίμονα.,%o estis mordita de demono.,A %o l@[ao_esp] ha mordido un Demonio.,A %o l@[ao_esp] mordió un Demonio.,%o joutui demonin puremaksi.,%o a été mordu@[e_fr] par un démon.,%o-t megharapta egy démon.,%o è stato sbranato da un demone.,%o はデーモンに噛まれた。,%o 은(는) 데몬에게 물렸다.,%o werd gebeten door een demon.,%o ble bitt av en demon.,%o wpada w szczęki demona.,Um demônio mordeu %o.,,%o a fost mușcat de un demon.,Игрока %o укусил демон.,Играча %o је ујео демон.,%o blev biten av en demon.,%o bir iblis tarafından ısırıldı.,%o покусав демон. -%o was eaten by a spectre.,OB_SPECTREHIT,,,,%o byl@[ao_cs] sežrán@[ao_cs] přízrakem.,%o blev spist af et imp.,%o wurde von dem Schemen gefressen.,Ένα φάντασμα έφαγε @[pro_gr] %o.,%o estis manĝita de fantomo.,A %o l@[ao_esp] ha devorado un Espectro.,A %o l@[ao_esp] devoró un Espectro.,%o joutui haamun syömäksi.,%o a été dévoré@[e_fr] par un spectre.,%o-t felfalta egy lidérc.,%o è stato divorato da uno spettro.,%o はスペクトルに喰われた。,%o 은(는) 스펙터에게 잡아먹혔다.,%o werd opgegeten door een spook.,%o ble spist av et spøkelse.,%o został@[ao_pl] zjedzon@[adj_pl] przez widmo.,Um espectro devorou %o.,,%o a fost mâncat de un spectru.,Игрока %o сожрал фантом.,Играча %o је појео авет.,%o blev uppäten av ett spöke.,%o bir hayalet tarafından yenildi.,%o зжерла примара. -%o was ripped open by a Baron of Hell.,OB_BARONHIT,,,,%o byl@[ao_cs] rozčtvrcen@[ao_cs] baronem pekel.,%o blev flået op af en helvedesbaron.,%o wurde von dem Höllenbaron aufgerissen.,@[art_gr] %o σχίστηκε απο εναν Βαρώνο της Κόλασης.,%o estis disŝirigita de Barono de Infero.,A %o l@[ao_esp] ha hecho trizas un Barón del Infierno.,A %o l@[ao_esp] hizo trizas un Barón del Infierno.,%o joutui hornanparonin auki repimäksi.,%o a été déchiré@[e_fr] par un Baron des Enfers.,%o-t széttépte egy pokolbáró.,%o è stato scoperchiato da un Barone dell'Inferno.,%o はバロンオブヘルに体を抉じ開けられた。,%o 은(는) 바론 오브 헬에게 뜯겨 죽었다.,%o werd opengereten door een Baron van de hel.,%o ble revet opp av en helvetesbaron.,%o został@[ao_pl] rozerwan@[adj_pl] przez Barona Piekła.,Um Barão do Inferno rasgou %o.,%o foi desventrad@[ao_ptb] por um Barão do Inferno.,%o a fost deschis pe viu de un Baron al Infernului.,Игрока %o разорвал барон ада.,%o је поцеп@[adj_2_sr] од стране барон пакла.,%o slets upp av en helvetesbaron.,%o bir Cehennem Baronu tarafından parçalandı.,Барон Пекла роздер %o. -%o was gutted by a Hell Knight.,OB_KNIGHTHIT,,,,%o byl@[ao_cs] vykuchán@[ao_cs] rytířem pekel.,%o blev udtaget af en helvedesridder.,%o wurde von dem Höllenritter ausgenommen.,@[art_gr] %o ξεκοιλιάστηκε απο έναν Ιππότη της Κόλασης.,%o estis senintestigita de Inferkavaliro.,A %o l@[ao_esp] ha destripado un Caballero del Infierno.,A %o l@[ao_esp] destripó un Caballero del Infierno.,%o joutui hornanritarin perkaamaksi.,%o a été étripé@[e_fr] par un un chevalier infernal.,%o-t kibelezte egy pokollovag.,%o è stato sbudellato da un Cavaliere dell'Inferno.,%o はヘルナイトに内臓を抉られた。,%o 은(는) 헬 나이트에게 도륙당했다.,%o werd gestript door een hel ridder.,%o ble sløyet av en helvetesridder.,%o został@[ao_pl] wypatroszon@[adj_pl] przez Rycerza Piekła.,Um Cavaleiro Infernal estripou %o.,%o foi estripad@[ao_ptb] por um Cavaleiro Infernal.,%o a fost măcelărit de un Cavaler al Infernului.,Игрока %o распотрошил рыцарь ада.,Играча %o је унаказио витез пакла.,%o blev uppsliten av en helvetesriddare.,%o bir Cehennem Şövalyesi tarafından parçalandı.,Лицар Пекла розпотрошив %o. -%o was killed by a zombieman.,OB_ZOMBIE,,,,%o byl@[ao_cs] zabit@[ao_cs] zombíkem.,%o blev dræbt af en zombie.,%o wurde von einem Zombie getötet.,@[art_gr] %o σκοτώθηκε απο ένα Ζόμπι.,%o estis mortigita de zombio.,A %o se l@[ao_esp] ha cargado un Zombi.,A %o l@[ao_esp] mató un Zombi.,%o joutui zombin tappamaksi.,%o a été tué@[e_fr] par un zombie.,%o-t megölte egy zombi.,%o è stato ucciso da uno zombie marine.,%o はゾンビ兵に殺された。,%o 은(는) 좀비맨에게 죽었다.,%o werd gedood door een zombie.,%o ble drept av en zombiemann.,%o został@[ao_pl] zabit@[adj_pl] przez zombie.,Um zumbi matou %o.,%o foi mort@[ao_ptb] por um zombie.,%o a fost omorât de un zombi.,Игрока %o убил зомби.,%o је убијен@[adj_1_sr] од стране зомбија.,%o blev dödad av en zombie.,%o bir zombi tarafından öldürüldü.,%o вбив зомбі. -%o was shot by a sergeant.,OB_SHOTGUY,,,,%o byl@[ao_cs] zastřelen@[ao_cs] seržantem.,%o blev skudt af en sergent.,%o wurde von einem Schützen erschossen.,Ένας Λοχίας πυροβόλησε @[pro_gr] %o.,%o estis pafita de serĝento.,A %o l@[ao_esp] ha fusilado un Sargento.,A %o l@[ao_esp] fusiló un Sargento.,%o joutui kersantin ampumaksi.,%o s'est fait@[e_fr] flinguer par un type au fusil.,%o-t lelőtte egy őrmester.,%o è sato impallinato da uno zombie sergente.,%o はゾンビ軍曹に撃たれた。,%o 은(는) 서전트에게 총을 맞았다.,%o werd neergeschoten door een sergeant.,%o ble skutt av en sersjant.,%o został@[ao_pl] zastrzelon@[adj_pl] przez zombie-sierżanta.,Um sargento possuído atirou em %o.,,%o a fost împușcat de un sergent.,Игрока %o застрелил сержант.,Играча %o је погодио водник.,%o blev skjuten av en hagelgevärskille.,%o bir çavuş tarafından vuruldu.,Сержант застрелив %o. -%o was incinerated by an archvile.,OB_VILE,,,,%o byl@[ao_cs] zpopelněn@[ao_cs] veleběsem.,%o blev brændt af en ærkevile.,%o wurde von einem Scheusal verbrannt.,@[art_gr] %o αποτεφρώθηκε απο ένα Νεκρομάντη.,%o estis cindrigita de ĉef-fiulo.,A %o l@[ao_esp] ha incinerado un Arch-Vile.,A %o l@[ao_esp] incineró un Arch-Vile.,%o joutui arkkihirvityksen kärventämäksi.,%o a été incinéré@[e_fr] par un Arche-Vile.,%o-t megpörkölte egy ősármány.,%o è stato incenerito da un arch-vile.,%o はアーチバイルに焼き尽くされた。,%o 은(는) 아크-바일에 의해 소각되었다.,%o werd verbrand door een aartsvijand.,%o ble brent av en erkefiende.,%o został@[ao_pl] spalon@[adj_pl] przez arcypodleca.,Um arquivil incinerou %o.,,%o a fost incinerat de un abject.,Игрока %o заживо сжёг архвиль.,Играча %o је запалио арчвајл.,%o blev förbränd av en ärkevilde,%o bir iğrençlik tarafından yakıldı.,Арчвайл спалив вщент %o. -%o couldn't evade a revenant's fireball.,OB_UNDEAD,,,,%o se nevyhnul@[ao_cs] umrlčí ohnivé kouli.,%o kunne ikke undvige en ildkugle fra en hævnen.,%o konnte dem Feuerball des Wiederauferstandenen nicht ausweichen.,@[art_gr] %o δέν μπορούσε να αποφείγει τον πύραυλο ενός Εκδικητή.,%o ne povis eviti fajrobulon de renaskitulo.,A %o l@[ao_esp] ha hecho reventar un Revenant.,A %o l@[ao_esp] hizo reventar un Revenant.,%o ei kyennyt väistämään henkiinpalanneen tulipalloa.,%o n'a pas réussi à esquiver un missile de revenant.,%o nem tudta kivédeni egy kísértet tűzgolyóját.,%o non ha potuto evitare il missile di un revenant.,%o はレバナントのファイアボールを回避できなかった。,%o 은(는) 레버넌트의 화염구를 피하지 못했다.,%o kon de vuurbal van een wraakzuchtige niet ontwijken.,%o klarte ikke å unngå en gjengangers ildkule.,%o nie udaje się uniknąć pocisku od zjawy.,%o não conseguiu desviar do míssil do insepulto.,%o não conseguiu desviar do míssil do renascido.,%o n-a putut scăpa de mingea de foc a nemortului.,Игрок %o не успел увернуться от снаряда ревенанта.,%o није мог@[ao_2_sr] да избегне повратникову пламену куглу.,%o kunde inte undvika en återfödds eldklot.,%o bir iskeletin ateş topundan kaçamadı.,Снаряд ревенанта дістав %o. -%o was squashed by a mancubus.,OB_FATSO,,,,%o byl@[ao_cs] rozmačkán@[ao_cs] mankubem.,%o blev knust af en mankubus.,%o wurde von einem Mancubus plattgemacht.,@[art_gr] %o λιόθηκε απο έναν Χοντρό.,%o estis dispremita de mankubo.,A %o l@[ao_esp] ha pulverizado un Mancubus.,A %o l@[ao_esp] pulverizó un Mancubus.,%o joutui mankubuksen liiskaamaksi.,%o s'est fait@[e_fr] aplatir par un Mancube.,%o-t szétlapította egy mankubusz.,%o è stato disintegrato da un mancubus.,%o はマンキュバスに潰された。,%o 은(는) 맨큐버스에게 짓이겨졌다.,%o werd verpletterd door een mancubus.,%o ble knust av en mancubus.,%o został@[ao_pl] zmiażdżon@[adj_pl] przez antropokuba.,Um mancubus esmagou %o.,,%o a fost strivit de un mancubus.,Игрока %o раздавил манкубус.,Играча %o је изгњечио манкубус.,%o blev krossad av en mancubus.,%o bir mancubus tarafından ezildi.,%o розчавлено манкубусом. -%o was perforated by a chaingunner.,OB_CHAINGUY,,,,%o byl@[ao_cs] prostřelen@[ao_cs] kulometčíkem.,%o blev perforeret af en chaingunner.,%o wurde von einem MG-Schützen perforiert.,@[art_gr] %o εκτελέστικε απο ένα Ζόμπι με ένα πολυβόλο.,%o estis truigadita de maŝinpafilisto.,A %o l@[ao_esp] ha perforado un Ametrallador.,A %o l@[ao_esp] perforó un Ametrallador.,%o joutui konekiväärimiehen rei'ittämäksi.,%o a été perforé@[e_fr] par un mitrailleur.,%o-t szitává lőtte egy kommandós.,%o è stato perforato da uno zombie commando.,%o はチェインガンナーに蜂の巣にされた。,%o 은(는) 체인거너에 의해 벌집이 됐다.,%o werd geperforeerd door een zware wapens kerel.,%o ble perforert av en chaingunner.,%o został@[ao_pl] przedziurawion@[adj_pl] przez ciężkozbrojnego zombie.,Um comando possuído perfurou %o.,%o foi perfurad@[ao_ptb] por um metrelhador.,%o a fost perforat de un mitralior.,Игрока %o продырявил пулемётчик.,Играча %o је изрешетао митраљезац.,%o blev perforerad av en tunga vapen kille.,%o bir ağır silah tarafından delindi.,%o отрима@[adj_1_ua] численні отвори від куль кулеметника. -%o was spooked by a lost soul.,OB_SKULL,,,,%o se lekl@[ao_cs] ztracené duše.,%o blev skræmt af en fortabt sjæl.,%o wurde von einer Verlorenen Seele heimgesucht.,Μια Χαμένη Ξυχή φόβησε @[pro_gr] %o.,%o estis timigita de perdita animo.,%o se ha muerto de miedo con un Alma Errante.,%o se murió de miedo con un Alma Errante.,%o joutui kadonneen sielun säikäyttämäksi.,%o s'est fait@[e_fr] surprendre par une âme perdue.,%o-t halálra ijesztette egy kóbor lélek.,%o è stato spaventato a morte da un'Anima Errante.,%o はロストソウルにビビらされた。,%o 은(는) 로스트 소울을 보고 깜짝 놀랐다.,%o werd bang gemaakt door een verloren ziel.,%o ble skremt av en fortapt sjel.,%o został@[ao_pl] przestraszon@[adj_pl] przez zaginioną duszę.,Uma alma penada assustou %o.,%o se assustou com uma alma penada.,%o a fost speriat de un suflet pierdut.,Игрок %o запуган до смерти потерянной душой.,%o је уплашен@[adj_1_sr] од изгубљене душе.,%o blev skrämd av en förlorad själ.,%o kayıp bir ruh tarafından korkutuldu.,Заблудла душа перестрашила %o. -%o was burned by an imp.,OB_IMP,,,,%o byl@[ao_cs] spálen@[ao_cs] čertem.,%o blev brændt af en spøgelse.,%o wurde von einem Kobold verbrannt.,@[art_gr] %o κάικε απο έναν Διάβολο.,%o estis bruligita de diableto.,A %o l@[ao_esp] ha calcinado un Imp.,A %o l@[ao_esp] calcinó un Imp.,%o joutui pirun polttamaksi.,%o brûlé@[e_fr] par un diablotin.,%o-t szénné égette egy tűzkobold.,%o è stato bruciato da un imp.,%o はインプに焼かれた。,%o 은(는) 임프에게 불태워졌다.,%o werd verbrand door een imp.,%o ble brent av en imp.,%o został@[ao_pl] spalon@[adj_pl] przez diablika.,Um diabrete queimou %o.,,%o a fost ars de un demon.,Игрока %o сжёг имп.,%o је изгорен@[adj_1_sr] од стране врага.,%o blev bränd av en imp.,%o bir imp tarafından yakıldı.,%o спалено імпом. -%o was smitten by a cacodemon.,OB_CACO,,,,%o byl@[ao_cs] udeřen@[ao_cs] kakodémonem.,%o blev ramt af en cacodæmon.,%o wurde von einem Cacodämonen gequält.,@[art_gr] %o καίκε απο έναν Κακοδαίμονα.,%o estis venkobatita de kakodemono.,A %o l@[ao_esp] ha cascado un Cacodemonio.,A %o l@[ao_esp] cascó un Cacodemonio.,%o joutui kakodemonin iskemäksi.,%o a été terrassé@[e_fr] par un Cacodémon.,%o-ra lesújtott egy kakodémon.,%o è stato abbattuto da un cacodemone.,%o はカコデーモンに裁きを受けた。,%o 은(는) 카코데몬에게 엄습 당했다.,%o werd geslagen door een cacodemon.,%o ble slått av en kakodemon.,%o został@[ao_pl] porażon@[adj_pl] przez kakodemona.,Um cacodemônio golpeou %o.,,%o a fost lovit de un cacodemon.,Игрока %o поразил какодемон.,Играча %o је ударио какодемон.,%o blev förkrossad av en cacodemon.,%o bir caco iblisi tarafından vuruldu.,%o уражено какодемоном. -%o was bruised by a Baron of Hell.,OB_BARON,,,,%o byl@[ao_cs] pomačkán@[ao_cs] baronem pekel.,%o blev såret af en helvedesbaron.,%o wurde von einem Höllenbaron geröstet.,@[art_gr] %o γρατζουνήθηκε απο ένα Βαρώνο της Κόλασης.,%o estis kontuzita de Barono de Infero.,A %o l@[ao_esp] ha magullado un Barón del Infierno.,A %o l@[ao_esp] magulló un Barón del Infierno.,%o joutui hornanparonin ruhjomaksi.,%o a été démoli@[e_fr] par un Baron des Enfers.,%o-t összezúzta egy pokolbáró.,%o è stato scorticato da un Barone Infernale.,%o はバロンオブヘルに痛めつけられた。,%o 은(는) 바론 오브 헬에게 상처받았다.,%o werd gekneusd door een baron van de hel.,%o ble forslått av en helvetesbaron.,%o został@[ao_pl] stłuczon@[adj_pl] Barona Piekła.,Um Barão do Inferno feriu %o.,,%o a fost contuzionat de un Baron al Infernului.,Игрок %o зашиблен бароном ада.,%o је мод@[adj_3_sr] због барона пакла.,%o blev skadad av en helvetesbaron.,%o bir Cehennem Baronu tarafından yaralandı.,%o потовчено бароном Пекла. -%o was splayed by a Hell Knight.,OB_KNIGHT,,,,%o byl@[ao_cs] rozpůlen@[ao_cs] rytířem pekel.,%o blev splejset af en helvedesridder.,%o wurde von einem Höllenritter gebraten.,@[art_gr] %o απλώθηκε απο έναν Ιππότη της Κόλασης,%o estis bisekcita de Inferkavaliro.,A %o l@[ao_esp] ha partido en dos un Caballero del Infierno.,A %o l@[ao_esp] partió en dos un Caballero del Infierno.,%o joutui hornanritarin repimäksi.,%o a été éclaté@[e_fr] par un chevalier infernal.,%o-t kilapította egy pokollovag.,%o è stato squartato da un Cavaliere Infernale.,%o はヘルナイトにバラ撒かれた。,%o 은(는) 헬 나이트에게 갈라졌다.,%o werd gespierd door een hel ridder.,Jeg ble sprettet opp av en helvetesridder.,%o został@[ao_pl] rozcapierzon@[adj_pl] przez Rycerza Piekła.,Um Cavaleiro Infernal espalmou %o.,%o foi espalmad@[ao_ptb] por um Cavaleiro Infernal.,%o a fost scrântit de un Cavaler al Infernului.,Игрока %o распластал рыцарь ада.,%o је раширен@[adj_1_sr] због витеза пакла.,%o blev spretad av en helvetesriddare.,%o bir Cehennem Şövalyesi tarafından yere serildi.,Лицар Пекла розкатав %o. -%o stood in awe of the spider demon.,OB_SPIDER,,,,%o zůstal@[ao_cs] stát v úžasu před pavoučím démonem.,%o stod i ærefrygt for edderkoppedæmonen.,%o stand in Ehrfurcht vor dem Spinnendämon.,@[art_gr] %o στάθηκε με δέος μπροστά στόν αραχνοδαίμονα.,%o staris mirigita antaŭ la aranedemono.,%o se ha arrodillado ante la Mente-Maestra Arácnida.,%o se arrodilló ante la Mente-Maestra Arácnida.,%o kunnioitti syvästi hämähäkkidemonia,%o est resté pris@[e_fr] d'admiration devant le Démon Arachnéen.,%o halálra ijedt a Pókelme.,%o è stato soggiogato dal Ragno demoniaco.,%o はスパイダーデーモンに恐れをなした。,%o 은(는) 거미악마의 무자비함을 느꼈다.,%o stond in ontzag voor de spindemon.,%o sto i ærefrykt for edderkoppdemonen.,%o podziwiał@[ao_pl] pajęczego mistrza.,%o ajoelhou-se em frente à Aranha-Mestra.,,%o a stat înfricoșat în fața păianjenului maestru.,Игрок %o стоял в восторге перед пауком-предводителем.,%o се смрзну@[ao_1_sr] у очарању паук-руководилаца.,%o stod i vördnad inför spindeldemonen.,%o örümcek iblisin karşısında huşu içinde durdu.,%o бу@[adj_1_ua] захоплен@[ao_ua] могутністю павука-воєводи. -%o let an arachnotron get %h.,OB_BABY,,,,%o se nechal@[ao_cs] dostat arachnotronem.,%o blev sprængt af en arachnotron.,%o ließ sich von einem Arachnotron erledigen.,@[art_gr] %o άφησε ένα Αράχνοτρον να @[pro_gr] σκοτώσει.,%o lasis elektraraneon venki @[pro_eo]n.,A %o l@[ao_esp] ha alcanzado un Aracnotrón.,A %o l@[ao_esp] alcanzó un Aracnotrón.,%o antoi anaktrotronin saada hänet.,%o a laissé un arachnotron l'avoir@[e_fr].,"%o hagyta, hogy elkapja egy póktron.",%o ha permesso che un arachnotron l'uccidesse.,%o が アラクノトロンに討ち取られた。,%o 은(는) 아라크노트론이 %o를(을) 죽이도록 놔두었다.,%o werd gedood door een arachnotron,%o ble sprengt av et arachnotron.,%o pozwolił@[ao_pl] arachnotronowi się do siebie dobrać.,Uma arachnotron pegou %o.,%o foi apanhad@[ao_ptb] por uma arachnotron.,%o s-a lăsat prins de un aracnotron.,Игрок %o дал себя на откуп арахнотрону.,%o је допусти@[ao_1_sr] да паукотрон дође до %h.,%o lät en arachnotron ta @[ref_sv].,%o bir araknotronun onu yakalamasına izin verdi.,%o да@[adj_1_ua] арахнотрону себе вбити. -%o was splattered by a cyberdemon.,OB_CYBORG,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] na kaši kyberdémonem.,%o blev splattet af en cyberdæmon.,%o wurde von einem Cyberdämon zerfetzt.,@[art_gr] %o έσκασε απο ένα Cyber-δαίμονα.,%o estis disŝprucigita de ciberdemono.,A %o l@[ao_esp] ha hecho pedazos un Ciberdemonio.,A %o l@[ao_esp] hizo pedazos un Ciberdemonio.,%o joutui kyberdemonin yltympäri roiskimaksi.,%o a été pulvérisé@[e_fr] par un Cyberdémon.,%o-t cafatokra tépték a kiberdémon rakétái.,%o è stato spiaccicato da un Cyberdemone.,%o はサイバーデーモンにバラバラにされた。,%o 은(는) 사이버데몬에 의해 산산조각이 났다.,%o werd gespetterd door een cyberdemon.,%o ble sprutet av en kyberdemon.,%o został@[ao_pl] rozbryzgan@[adj_pl] przez cyberdemona.,Um Ciberdemônio arrebentou %o.,,%o a fost împroșcat de ciberdemon.,Игрока %o размазал кибердемон.,%o је спљоштен@[adj_1_sr] од стране сајбердемона,%o blev sönderslagen av en cyberdemon.,%o bir siber iblis tarafından parçalandı.,Кібердемон перетворив %o в хмарину крові. -%o met a Nazi.,OB_WOLFSS,,,,%o potkal@[ao_cs] nácka.,%o mødte en nazist.,%o traf einen Nazi.,@[art_gr] %o χνώρισε ένα Ναζιστή.,%o renkontis Nazion.,%o se ha topado con un Nazi.,%o se topó con un Nazi.,%o tapasi natsin.,%o a rencontré un Nazi.,%o találkozott egy nácival.,%o ha incontrato un Nazista.,%o はナチ兵と遭遇した。,%o 은(는) 나치를 만났다.,%o ontmoette een nazi.,Jeg møtte en nazist.,%o spotkał@[ao_pl] nazistę.,%o encontrou um Nazista.,%o encontrou um Nazi.,%o a întâlnit un Nazist.,Игрок %o встретил нациста.,%o је упозна@[ao_1_sr] нацисту.,%o mötte en nazist.,%o bir Nazi ile karşılaştı.,%o зустрі@[adj_1_ua] нациста. -%o was mauled by a dog.,OB_DOG,,,,%o byl@[ao_cs] roztrhán@[ao_cs] psem.,%o blev mast af en hund.,%o wurde von einem Hund zerrissen.,@[art_gr] %o φαγόθικε απο ένα σκύλο.,%o estis atakita de hundo.,A %o l@[ao_esp] ha despedazado un Perro.,A %o l@[ao_esp] despedazó un Perro.,%o joutui koiran raatelemaksi.,%o s'est fait mordre par un chien.,%o-t szétmarcangolta egy kutya.,%o è stato sbranato da un cane.,%o は犬に引き裂かれた。,%o 은(는) 개한테 으스러졌다.,%o werd verminkt door een hond.,%o ble maltraktert av en hund.,%o został@[ao_pl] poturbowan@[adj_pl] przez psa.,Um cachorro mutilou %o.,%o foi mutilad@[ao_ptb] por um cão.,%o a fost sfâșiat de un câine.,Игрока %o разорвала собака.,Играча %o је удавио пас.,%o blev misshandlad av en hund.,%o bir köpek tarafından parçalandı.,%o загризла собака. -%o chewed on %k's fist.,OB_MPFIST,,,,%o si pochutnal@[ao_cs] na pěsti hráče %k.,%o tyggede på %ks knytnæve.,%o kaute auf %ks Faust herum.,@[art_gr] %o μάσησε τη γροθία του/της %k.,%o maĉis la pugnon de %k.,%o se ha comido el puño de %k.,%o se comió el puño de %k.,%k rusikoi %o paran.,%o a bouffé le poing de %k.,%o megkóstolta %k ökleit.,%o si è schiantato contro il pugno di %k.,%o は %k の拳を顔面に受けた。,%o 은(는) %k 의 주먹을 물었다.,%o gekauwd op %k's vuist.,%o tygget på %ks knyttneve.,%o przygryza pięść %k.,%k espancou %o até a morte.,,%o a mestecat pumnul lui %k.,Игрок %o отведал кулака игрока %k.,Играча %o је сажвакао песницу играча %k.,%o tuggade på %ks knytnäve.,"%o, %k tarafından öldürüldü.",%o відчу@[adj_1_ua] кулак %k. -%o was mowed over by %k's chainsaw.,OB_MPCHAINSAW,,,,%o byl@[ao_cs] zkácen@[ao_cs] motorovkou hráče %k.,%o blev slået ned af %ks motorsav.,%o wurde von %ks Kettensäge zerteilt.,@[art_gr] %o κόπηκε απο το αλλησοπρίονο του/της %k.,%o estis buĉita de la ĉensegilo de %k.,Ha habido matanza de %o con la motosierra de %k.,Hubo mascare de %o con la motosierra de %k.,%k katkoi %o paran.,%o a été tondu@[e_fr] par la tronconneuse de %k.,%o-t kettészelte %k láncfűrésze.,%o è stato falciato dalla motosega di %k.,%o は %k のチェーンソーで刈り取られた。,%o 은(는) %k 의 전기톱에 갈렸다.,%o werd gemaaid met %k's kettingzaag.,%o ble klippet over av %ks motorsag.,%o został@[ao_pl] skoszon@[adj_pl] przez piłę łańcuchową %k.,%k fez picadinho de %o com sua motoserra.,,%o a fost tăiat de drujba lui %k.,Игрока %o разрезал бензопилой игрок %k.,%o је исечен@[adj_1_sr] моторном тестером играча %k.,%o blev överkörd av %ks motorsåg.,"%o, %k tarafından biçildi",%k розпили@[adj_1_ua] %o бензопилою. -%o was tickled by %k's pea shooter.,OB_MPPISTOL,,,,%o byl@[ao_cs] polechtán@[ao_cs] pistolkou hráče %k.,%o blev kildet af %ks ærteskytte.,%o wurde von %ks Erbsenpistole gekitzelt.,@[art_gr] %o γαργαλίθηκε απο το οπλάκι του/της %k.,%o estis tiklita de la pistolo de %k.,A %o le ha hecho cosquillas la pistola de %k.,A %o le hizo cosquillas la pistola de %k.,%o kutitti %o parkaa hernepyssyllään.,%o a été châtouillé@[e_fr] par le pistolet de %k.,%o meg lett csiklandozva %k játékpisztolyával.,%o è stato sforacchiato dalla pistola di %k'.,%o は %k の豆鉄砲でくすぐられた。,%o 은(는) %k 의 권총에 간지럼을 탔다.,%o werd gekieteld door %k's erwtenschutter.,%o ble kilt av %ks ertebøsse.,%o został@[ao_pl] połaskotan@[adj_pl] przez spluwę %k.,%k fez cócegas em %o com sua pistolinha.,,%o a fost gâdilat de pistolașul lui %k.,Игрока %o защекочен вусмерть из горохострела игрока %k.,%o је заголицан@[adj_1_sr] пиштољем играча %k.,%o blev kittlad av %ks ärtskytt.,"%o, %k tarafından gıdıklandı",%o бу@[adj_1_ua] заколупан@[ao_ua] пістолетом %k. -%o chewed on %k's boomstick.,OB_MPSHOTGUN,,,,%o si pochutnal@[ao_cs] na brokádě hráče %k.,%o tyggede på %ks bommestok.,%o wurde Opfer von %ks Schrotflinte.,@[art_gr] %o έφαγε το ντουφέκι του/της %k.,%o maĉis la kartoĉan fusilon de %k.,A %o l@[ao_esp] ha agujereado la escopeta de %k.,A %o l@[ao_esp] agujereó la escopeta de %k.,%k jauhoi %o paran tussarillaan.,%o a s'est mangé@[e_fr] de la chevrotine de la part de %k.,%o megízlelte %k villámbotját.,%o si è trovato davanti il fucile di %k.,%o は %k のブームスティックを顔面に受けた。,%o 은(는) %k 의 붐스틱에 꽂혔다.,%o gekauwd op %k's boomstick.,%o tygget på %ks boomstick.,%o przygryza pukawkę %k.,%k meteu chumbo em %o com sua espingarda.,,%o a mestecat pușca lui %k.,Игрока %o накормил дробью игрок %k.,%o је сажвака@[ao_1_sr] на пумпарицу играча %k.,%o tuggade på %ks bomstock.,"%o, %k tarafından patlatıldı",%k насипа@[adj_1_ua] свинцевого гороху %o. -%o was splattered by %k's super shotgun.,OB_MPSSHOTGUN,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] na kaši superbrokovnicí hráče %k.,%o blev sprøjtet af %ks super haglgevær.,%o wurde von %ks Super-Schrotflinte zerfetzt.,@[art_gr] %o διαλύθηκε απο το διπλό ντουφέκι του/της %k,%o estis disŝprucigita de la dutuba fusilo de %k.,A %o l@[ao_esp] reventado la superescopeta de %k.,A %o l@[ao_esp] reventó la superescopeta de %k.,%k roiski %o paran yltympäriinsä superhaulikollaan.,%o s'est fait@[e_fr] gicler par le fusil de chasse de %k.,%o-t cafatokra tépte %k szupersörétese.,%o è stato smembrato dalla doppietta di %k.,%o は %k のスーパーショットガンでバラバラにされた。,%o 은(는) %k 의 슈퍼 샷건에 의해 터졌다.,%o werd gespat door %k's super jachtgeweer.,%o ble skutt med %ks super-haglgevær.,%o został@[ao_pl] rozpryskan@[adj_pl] przez super strzelbę %k.,%k estraçalhou %o com sua espingarda de cano duplo.,,%o a fost împroșcat de super pușca lui %k.,Игрока %o размазал из супердробовика игрок %k.,Играча %o је спљоштила двоцевка играча %k.,%o blev besprutat av %ks super-hagelgevär.,"%o, %k tarafından sıçratıldı",%k розмаза@[adj_1_ua] з двустволки %o. -%o was mowed down by %k's chaingun.,OB_MPCHAINGUN,,,,%o byl@[ao_cs] prostřílen@[ao_cs] kulometem hráče %k.,%o blev mejet ned af %ks maskingevær.,%o wurde von %ks Maschinengewehr niedergemäht.,@[art_gr] %o κοματίαστηκε απο το πολυβόλο του/της %k.,%o estis kuglo-plenigita de la maŝinpafilo de %k.,A %o l@[ao_esp] ha dejado hecho colador la ametralladora de %k.,A %o l@[ao_esp] dejó hecho colador la ametralladora de %k.,%k niitti %o paran konekiväärillään.,%o a été ventilé@[e_fr] par la mitrailleuse de %k.,%k gépágyúval szétszaggatta %o testét.,%o è stato falciato dal mitragliatore di %k.,%o は %k のチェーンガンで蜂の巣にされた。,%o 은(는) %k 의 체인건에 의해 으깨졌다.,%o werd gemaaid met %k's machinegeweer.,%o ble meiet ned av %ks maskinpistol.,%o został@[ao_pl] skoszon@[adj_pl] przez karabin maszynowy %k.,%k massacrou %o com sua metralhadora.,,%o a fost secerat de mitraliera rotativă a lui %k.,Игрок %o скошен из пулемёта игрока %k.,%o је покоси@[ao_1_sr] митраљез играча %k.,%o blev nedklippt av %ks kedjepistol.,"%o, %k tarafından biçildi",%k скоси@[adj_1_ua] кулеметом %o. -%o rode %k's rocket.,OB_MPROCKET,,,,%o se projel@[ao_cs] na raketě hráče %k.,%o red på %ks raket.,%o ritt auf %ks Rakete.,@[art_gr] %o καβάλησε τον πύραυλο του/της %k.,%o rajdis la raketon de %k.,%o ha montado el misil de %k.,%o montó el misil de %k.,%o ratsasti pelaajan %k raketilla.,%o a chevauché la roquette de %k.,%o meglovagolta %k rakétáját.,%o ha cavalcato il razzo di %k.,%o は %k のロケットに乗ってしまった。,%o 은(는) %k 의 로켓을 탔다.,%o reed op %k's raket.,%o red på %ks rakett.,%o ujeżdżał@[ao_pl] rakietę %k.,%o não viu o foguete de %k.,%o não viu o míssil de %k.,%o a călărit racheta lui %k.,Игрок %o прокатился на ракете игрока %k.,%o је ујаха@[ao_1_sr] ракету играча %k.,%o åkte på %ks raket.,"%o, %k tarafından sıçratıldı",%o проїха@[adj_2_ua] на ракеті %k. -%o almost dodged %k's rocket.,OB_MPR_SPLASH,,,,%o se skoro vyhnul@[ao_cs] raketě hráče %k.,%o undgik næsten %ks raket.,"%o schaffte es fast, %ks Rakete auszuweichen.",@[art_gr] %o σχεδόν απόφηγε τον πύραυλο του/της %k.,%o preskaŭ evitis la raketon de %k.,%o casi esquiva el misil de %k.,,%o melkein väisti pelaajan %k raketin.,%o a presque esquivé la roquette de %k.,%o majdnem kitért %k rakétája elől.,%o aveva quasi schivato il razzo di %k.,%o は %k のロケットをあと少しで避けられそうだった。,%o 은(는) %k 의 로켓 폭발을 거의 피했다.,%o ontweek bijna %k's raket.,%o unngikk nesten %ks rakett.,%o prawie unika rakiety %k.,%o quase escapou do foguete de %k.,%o quase escapou do míssil de %k.,%o aproape a evitat racheta lui %k.,Игрок %o почти увернулся от ракеты %k.,%o је за длаку избега@[ao_1_sr] ракету играча %k.,%o undvek nästan %ks raket.,"%o, %k tarafından sıçratıldı",%o майже укникну@[adj_1_ua] ракети %k. -%o was melted by %k's plasma gun.,OB_MPPLASMARIFLE,,,,%o se roztekl@[ao_cs] plazmapuškou hráče %k.,%o blev smeltet af %ks plasma riffel.,%o wurde von %ks Plasmagewehr geschmolzen.,@[art_gr] %o λίοθηκε απο το πλάσμα όπλο του/της %k.,%o estis fandigita de la plasmo-pafilo de %k.,A %o l@[ao_esp] ha derretido el fusil de plasma de %k.,A %o l@[ao_esp] derritió el fusil de plasma de %k.,%k sulatti %o paran plasmapyssyllään.,%o a été réduit@[e_fr] en bouillie par le fusil a plasma de %k.,%k plazmafegyverével megolvaszotta %o testét.,%o è stato fuso dal fucile al plasma di %k.,%o は %k のプラズマガンに溶かされた。,%o 은(는) %k 의 플라즈마 건에 의해 융해되었다.,%o was gesmolten door %k's plasmageweer.,%o ble smeltet av %ks plasmakanon.,%o został@[ao_pl] stopion@[adj_pl] przez pistolet plasmowy %k.,%k torrou %o com seu fuzil de plasma.,%o foi torrad@[ao_ptb] pela pistola de plasma de %k.,%o a fost topit de pușca cu plasmă a lui %k.,Игрока %o расплавил из плазмомёта игрок %k.,%o је отопљен@[adj_1_sr] плазма оружјем играча %k.,%o smältes av %ks plasmagevär.,"%o, %k tarafından eritildi",%k розплавив з плазмагана %o. -%o was splintered by %k's BFG.,OB_MPBFG_BOOM,,,,%o byl@[ao_cs] rozštěpen@[ao_cs] BFGčkem hráče %k.,%o blev splintret af %ks BFG.,%o wurde von %ks BFG in Stücke gerissen.,@[art_gr] %o κοματιάστηκε απο το BFG του/της %k.,%o estis splitigita de la BFG de %k.,A %o l@[ao_esp] ha astillado la BFG de %k.,A %o l@[ao_esp] astilló la BFG de %k.,%k pirstoi %o paran BFG:llään.,%o a été oblitéré@[e_fr] par le BFG de %k.,%o teste atomjaira szakadt %k BFG-jétől.,%o è stato sminuzzato dal BFG di %k.,%o は %k のBFGで木っ端微塵にされた。,%o 은(는) %k 의 BFG덕에 산산조각 났다.,%o was versplinterd door %k's BFG.,%o ble splintret av %ks BFG.,%o został@[ao_pl] rozpryskan@[adj_pl] przez BFG %k.,%k vaporizou %o com sua BFG.,,%o a fost despicat de către BFG-ul lui %k.,Игрока %o порвал на осколки выстрел из BFG игрока %k.,%o је расцепан@[adj_1_sr] ВЈП играча %k.,%o splittrades av %ks BFG.,"%o, %k tarafından parçalandı",%o розірвало снарядом БФГ %k. -%o couldn't hide from %k's BFG.,OB_MPBFG_SPLASH,,,,%o se nemohl@[ao_cs] ukrýt před BFGčkem hráče %k.,%o kunne ikke gemme sig for %ks BFG.,%o konnte sich nicht vor %ks BFG verstecken.,@[art_gr] %o δέν μπόρεσε να κρυφτέι απο το BFG του/της %k.,%o ne povis kaŝi sin de la BFG de %k.,%o no ha conseguido esconderse de la BFG de %k.,%o no logró esconderse de la BFG de %k.,%o ei kyennyt piiloutumaan pelaajan %k BFG:ltä.,%o n a pas pu se couvrir du BFG de %k.,%o nem tudott elmenekülni %k BFG-je elől.,%o non poteva nascondersi dal BFG di %k.,%o は %k のBFGから隠れることはできなかった。,%o 은(는) %k 의 BFG의 일격으로부터 피할 수 없었다.,%o kon zich niet verbergen voor %k's BFG.,%o kunne ikke gjemme seg for %ks BFG.,%o nie może się schować przed BFG %k.,%o não conseguiu se esconder da BFG de %k,,%o nu s-a putut ascunde de BFG-ul lui %k.,Игрок %o не успел спрятаться от BFG игрока %k.,%o се није мог@[ao_2_sr] сакрити од ВЈП играча %k.,%o kunde inte gömma sig för %ks BFG.,"%o, %k tarafından parçalandı",%o не встиг@[adj_3_ua] сховатись від БФГ %k. -%o was railed by %k.,OB_RAILGUN,,,,%o byl@[ao_cs] napíchnut@[ao_cs] hráčem %k.,%o blev skudt af %k.,%o stand in %ks Schusslinie.,@[art_gr] %o καρφόθηκε απο τον/την %k.,%o estis traborita de la elektropafilo de %k.,A %o l@[ao_esp] ha agujereado el cañón de riel de %k.,A %o l@[ao_esp] agujereó el cañón de riel de %k.,%o lävisti %o paran.,%o a été aligné@[e_fr] par %k.,%o beleállt %k lézerébe.,%o è stato bucherellato dal railgun di %k.,%o は %k のレールガンで死亡した。,%o 은(는) %k 의 레일건에 관통당했다.,%o werd gespaakt door %k.,%o ble skutt av %k.,%o stał@[ao_pl] na linii ognia %k.,%k acertou %o com seu canhão elétrico.,,%o a fost ocărit de %k.,Игрока %o пробил насквозь игрок %k.,%o је убијен@[adj_1_sr] од играча %k.,%o blev fördärvad av %k.,%o %k tarafından kovuldu.,%k прониза@[adj_1_ua] %o наскрізь. -%o was burned by %k's BFG.,OB_MPBFG_MBF,,,,%o shořel@[ao_cs] BFGčkem hráče %k.,%o blev brændt af %ks BFG.,%o wurde von %ks BFG verbrannt.,@[art_gr] %o κάικε απο το BFG του/της %k.,%o estis bruligita de la BFG de %k.,A %o l@[ao_esp] ha calcinado la BFG de %k.,A %o l@[ao_esp] calcinó la BFG de %k.,%k korvensi %o paran BFG:llään.,%o a été irradié@[e_fr] par le BFG de %k.,%k hamuvá égette %o testét BFG-vel.,%o è stato bruciato dal BFG di %k.,%o は %k のBFGで焼き殺された。,%o 은(는) %k 의 BFG에 의해 타올랐다.,%o werd verbrand door %k's BFG.,%o ble brent av %ks BFG.,%o został@[ao_pl] spalon@[adj_pl] przez BFG %k.,%k cozinhou %o com sua BFG.,,%o a fost ars de BFG-ul lui %k.,Игрока %o сжёг из BFG игрок %k.,%o је изгоре@[ao_1_sr] од ВЈП играча %k.,%o blev bränd av %ks BFG.,%o %k tarafından yakıldı,%o спалило БФГ %k. -,,Heretic,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Pickup ,,,,,,,,,,,,,,,,,,,,,,,,,, -Blue Key,TXT_GOTBLUEKEY,,,,Modrý klíč,Blå nøgle,Blauer Schlüssel,Μπλέ Κλειδί,Blua Ŝlosilo,Llave Azul,,Sininen avain,Clé Bleue,Kék kulcs,Chiave blu,青の鍵,청색 열쇠,Blauwe sleutel,Blå nøkkel,Niebieski klucz,Chave Azul,,Cheie Albastră,Синий ключ,Плави кључ,Blå nyckel,Mavi Anahtar,Синій ключ -Yellow Key,TXT_GOTYELLOWKEY,,,,Žlutý klíč,Gul nøgle,Gelber Schlüssel,Κύτρινο Κλειδί,Flava Ŝlosilo,Llave Amarilla,,Keltainen avain,Clé Jaune,Sárga kulcs,Chiave gialla,黄の鍵,황색 열쇠,Gele sleutel,Gul nøkkel,Żółty klucz,Chave Amarela,,Cheie Galbenă,Жёлтый ключ,Жути кључ,Gul nyckel,Sarı Anahtar,Жовтий ключ -Green Key,TXT_GOTGREENKEY,,,,Zelený klíč,Grøn nøgle,Grüner Schlüssel,Πράσινο Κλειδί,Verda Ŝlosilo,Llave Verde,,Vihreä avain,Clé Verte,Zöld kulcs,Chiave verde,緑の鍵,녹색 열쇠,Groene sleutel,Grønn nøkkel,Zielony klucz,Chave Verde,,Cheie Verde,Зелёный ключ,Зелени кључ,Grön nyckel,Yeşil Anahtar,Зелений ключ -Quartz Flask,TXT_ARTIHEALTH,,,,Blyštivá baňka,Kvartsflaske,Quarzflasche,Φλάσκα Χαλαζίας,Kvarca Flakono,Frasco de Cuarzo,,Kvartsipullo,Flasque en Quartz,Kvarc flaska,Ampolla di quarzo,石英フラスコ,석영 플라스크,Kwartskolf,Kvartskolbe,Kwarcowa Butelka,Frasco de Quartzo,,Flacon de Quartz,Кварцевый флакон,Кварцна боца,Kvartsflaska,Kuvars Şişesi,Кварцова пляшечка -Wings of Wrath,TXT_ARTIFLY,,,,Křídla hněvu,Vredens vinger,Flügel des Zorns,Φτερά της Οργής,Flugiloj de Kolero,Alas de Ira,,Kiihtymyksen siivet,Ailes du Courroux,A Harag Szárnyai,Ali iraconde,レイスの翼,분노의 날개,Vleugels der Toorn,Vredens vinger,Skrzydła Gniewu,Asas da Ira,,Aripile Furiei,Крылья гнева,Крила гнева,Vridsvingar,Gazap Kanatları,Крила гніву -Ring of Invincibility,TXT_ARTIINVULNERABILITY,,,,Prsten nesmrtelnosti,Ring af uovervindelighed,Ring der Unverwundbarkeit,Δαχτυλίδι της Αθανασίας,Ringo de Nevenkebleco,Anillo de Invencibilidad,,Näkymättömyyden sormus,Anneau d'Invincibilité,A Sérthetetlenség Gyűrűje,Anello dell'invincibilità,不死の指輪,불멸의 반지,Ring van Onoverwinnelijkheid,Uovervinnelighetens ring,Pierścień Niewrażliwości,Anel da Invencibilidade,,Inelul Invincibilității,Кольцо неуязвимости,Прстен непобедивости,Ring av oövervinnlighet,Yenilmezlik Yüzüğü,Кільце Непереможності -Tome of Power,TXT_ARTITOMEOFPOWER,,,,Kniha moci,Bog om magt,Buch der Macht,Τομός της Δύναμης,Librego de Forto,Tomo de Poder,,Väkevyyden kirja,Livre du Pouvoir,Az Erő Kódexe,Tomo del potere,力の術書,힘의 서,Boek van de Macht,Maktens bok,Tom Mocy,Livro do Poder,Livro do Poder,Cartea Puterii,Том могущества,Том моћи,Maktens tome,Güç Kitabı,Том сили -Shadowsphere,TXT_ARTIINVISIBILITY,,,,Šerosféra,Skyggesfære,Schattensphäre,Σκιόσφαιρα,Ombrosfero,Esfera de Sombra,,Varjokehrä,Sphère des Ombres,Árnygömb,Sfera dell'ombra,闇の球体,그림자 구체,Schaduwbol,Skyggesfære,Sfera Cieni,Esfera das Sombras,,Sfera Umbrei,Теневая сфера,Сфера сенки,Skuggsfär,Gölge Küre,Сфера тіні -Morph Ovum,TXT_ARTIEGG,,,,Měnivejce,,Transformations-Ei,Μετασχηματίζοντικο Ωάριο,Ovo de Transformado,Huevo de Transformación,,Muodonmuutoksen muna,Ovule de Métamorphose,Alakváltó tojás,Uovo della metamorfosi,変貌の卵子,변신 알,Morfose-Ei,,Jajko Morfujące,Ovo da Metamorfose,,Oul Metamorfozei,Яйцо превращения,Преображавајуће јајашце,,Dönüşümlü Yumurta,Яйце трансформації -Mystic Urn,TXT_ARTISUPERHEALTH,,,,Tajemná urna,Mystisk urne,Mystische Urne,Μυστικό Δοχείο,Mistika Urno,Urna Mística,,Mystinen uurna,Urne Mystique,Misztikus urna,Urna mistica,神秘の骨壷,신비한 항아리,Mystieke Urn,Mystisk urne,Mistyczna Urna,Urna Mística,,Urnă Mistică,Мистическая урна,Мистериозна урна,Mystisk urna,Mistik Urn,Містична урна -Torch,TXT_ARTITORCH,,,,Pochodeň,Fakkel,Fackel,Πυρσός,Torĉo,Antorcha,,Soihtu,Torche,Fáklya,Torcia,松明,횃불,Fakkel,Fakkel,Pochodnia,Tocha,,Torță,Факел,Бакља,Fackel,Meşale,Смолоскип -Time Bomb of the Ancients,TXT_ARTIFIREBOMB,,,,Časovaná bomba starověku,De ældres tidsbombe,Zeitbombe der Alten,Χρονοβόμβα τον Αρχαίων,Tempobombo de la Antikvuloj,Bomba de tiempo de los Ancestros,,Vanhain aikapommi,Bombe a Retardement des Anciens,Az Ősök Időbombája,Bomba a tempo degli antichi,古代の時限爆薬,고대의 시한폭탄,Tijdbom der Tijden,De eldgamles tidsinnstilte bombe,Starożytna Bomba Czasu,Bomba-relógio dos Anciãos,,Bomba cu Ceas a Anticilor,Часовая бомба древних,Временска бомба древних,De gamlas tidsbomb,Kadimlerin Saatli Bombası,Часова бомба древніх -Chaos Device,TXT_ARTITELEPORT,,,,Zmatkostroj,Chaos-enhed,Chaosgerät,Συσκευή του Χάος,Ĥaos-Aparato,Dispositivo del Caos,,Kaaoskoje,Outil du Chaos,Káoszszerkezet,"Dispositivo del Caos +,,Cast call names,,,,,,,,,,,,,,,,,,,,,,,,,,, +Zombieman,CC_ZOMBIE,,,,Zombie,Zombie,Zombie,Ζόμπι,Zombio,Zombi,,Zombimies,Zombie,,Zombi,Zombie Marine,ゾンビ兵,좀비맨,Zombie,Zombiemann,Zombie,Zumbi,Homem Zombie,Zombi,Зомби,Зомби,Zombie,Zombi,Зомбі +Shotgun Guy,CC_SHOTGUN,a.k.a. (former human) sergeant,,,Seržant,Sergent,Schütze,Τύπος με ντουφέκι,Ĉaspafilulo,Sargento,,Haulikkohemmo,Type au Fusil,,Őrmester,Zombie Sergente,ショットガンゾンビ,샷건 가이,Jachtgeweerkerel,Sersjant,Zombie-sierżant,Sargento Possuído,Tipo de Espingarda,Pușcaș,Зомби-сержант,Пумпераш,Hagelgevärskille,Çavuş,Зомбі-сержант +Heavy Weapon Dude,CC_HEAVY,a.k.a. former commando,,,Kulometčík,,MG-Schütze,Τύπος με βαρί όπλο,Pezarmilulo,Ametrallador,,Raskasaseäijä,Type au Gros Flingue,,Kommandós,Zombie Commando,ヘビーウェポンゾンビ,헤비 웨폰 듀드,Zwarewapenskerel,Maskingeværskyt,Ciężkozbrojny Zombie,Comando Possuído,Gajo das Armas Pesadas,Mitralior,Зомби-пулемётчик,Митраљезац,Tunga vapen kille,Ağır Silah Dostum,Кулеметник +Imp,CC_IMP,,,,Čert,,Kobold,Διάβολος,Diableto,,,Piru,Diablotin,,Tűzkobold,,インプ,임프,,,Diablik,Diabrete,,Drac,Имп,Враг,,İmp,Імп +Demon,CC_DEMON,,,,Démon,Dæmon,Dämon,Δαίμονας,Demono,Demonio,,Demoni,Démon,,Démon,Pinky,デーモン,데몬,Demoon,,,Demônio,,,Демон,Демон,,İblis,Демон +Lost Soul,CC_LOST,,,,Ztracená duše,Fortabt sjæl,Verlorene Seele,Χαμένη Ξυχή,Perdita Animo,Alma Errante,,Kadonnut sielu,Ame Perdue,,Kóbor lélek,Anima Errante,ロストソウル,로스트 소울,Verloren ziel,Fortapt sjel,Zaginiona Dusza,Alma Perdida,Alma Penada,Suflet Pierdut,Потерянная душа,Изгубљена душа,Förlorad själ,Kayıp Ruh,Пропаща душа +Cacodemon,CC_CACO,,,,Kakodémon,Cacodæmon,Cacodämon,Κακοδαίμονας,Kakodemono,Cacodemonio,,Kakodemoni,Cacodémon,,Kakodémon,Cacodemone,カコデーモン,카코데몬,Cacodemoon,Kacodemon,Kakodemon,Cacodemônio,,Cacodemon,Какодемон,Какодемон,Cacodemon,Cacodemon,Какодемон +Hell Knight,CC_HELL,,,,Pekelný rytíř,Helvedesridder,Höllenritter,Ιππότης της Κόλασης,Inferkavaliro,Caballero del Infierno,,Hornanritari,Chevalier Infernal,,Pokollovag,Cavaliere Infernale,ヘルナイト,헬 나이트,Helleridder,Helvetesridder,Rycerz Piekła,Cavaleiro Infernal,Cavaleiro Infernal,Cavaler al Infernului,Рыцарь ада,Витез пакла,Helvete riddare,Cehennem Şövalyesi,Лицар Пекла +Baron of Hell,CC_BARON,,,,Baron pekel,Helvedesbaron,Höllenbaron,Βαρώνος της Κολασης,Barono de Infero,Barón del Infierno,,Hornanparoni,Baron des Enfers,,Pokolbáró,Barone Infernale,バロンオブヘル,바론 오브 헬,Baron des Hels,Helvetesbaron,Baron Piekła,Barão do Inferno,,Baron al Infernului,Барон ада,Барон пакла,Helvetets baron,Cehennem Baronu,Барон Пекла +Arachnotron,CC_ARACH,,,,,,,Αράχνοτρον,Elektraraneo,Aracnotrón,,Araknotroni,,,Póktron,,アラクノトロン,아라크노트론,,,,Aracnotron,,Aracnotron,Арахнотрон,Паукотрон,,Araknotron,Арахнотрон +Pain Elemental,CC_PAIN,,,,Živel trýzně,Smerteelementar,Elementarschmerz,Στοιχείομα του Πόνου,Doloro-Elementulo,Elemental del Dolor,,Kivun henki,Elémentaire de Douleur,,Elemi Kín,Elementale del Dolore,ペインエレメンタル,페인 엘리멘탈,Smartelementaal,Smerte Elemental,Żywiołak Bólu,Elemental da Dor,,Elemental al Durerii,Элементаль боли,Елементал патње,Smärta elementär,Acı Elementi,Елементаль болю +Revenant,CC_REVEN,,,,Umrlec,Hævnen,Wiederauferstandener,Εκδικητής,Renaskitulo,,,Henkiinpalannut,,,Kísértet,,レバナント,레버넌트,Wreker,Gjenganger,Zjawa,Insepulto,Renascido,Nemort,Ревенант,Повратник,Återfödare,,Ревевант +Mancubus,CC_MANCU,,,,Mankubus,,,Χοντρός,Mankubo,,,Mankubus,Mancube,,Mankubusz,,マンキュバス,맨큐버스,,,Antropokub,,,,Манкубус,Манкубус,,,Манкубус +Arch-Vile,CC_ARCH,,,,Veleběs,Ærkevile,Scheusal,Νεκρομάντις,Ĉef-Fiulo,,,Arkkihirvitys,Arche-vile,,Ősármány,Arch-vile,アーチバイル,아크-바일,Aartsgedrocht,Erkefiende,Arcy-Podlec,Arquivil,,Abject,Архвиль,Арчвајл,Ärkevild,Baş Aşağılık,Арчвайл +The Spider Mastermind,CC_SPIDER,,,,Pavoučí velevůdce,Edderkoppen Mastermind,Der Spinnenmeister,Το Αραχνό Ιθύνων Νους,La Elektraraneo-Mastro,La Mente-Maestra Arácnida,,Hämähäkkiaivot,L'Araignée Commandante,,Pókelme,L'Aracnomente Suprema,スパイダーマスターマインド,스파이더 마스터마인드,Het Spinnenmeesterbrein,Edderkopphjernen,Pajęczy Mistrz,A Aranha-Mestra,,Păianjen Maestru,Паук-предводитель,Паук-руководилац,Spindelns hjärna,Örümcek Beyni,Павук-полководець +The Cyberdemon,CC_CYBER,,,,Kyberdémon,Cyberdæmonen,Der Cyberdämon,Ο Cyber-δαίμονας,La Ciberdemono,El Ciberdemonio,,Kyberdemoni,Le Cyberdémon,,A Kiberdémon,Il Cyberdemonio,サイバーデーモン,사이버데몬,Het Cyberdemoon,Kyberdemonen,Cyberdemon,O Ciberdemônio,,Ciberdemon,Кибердемон,Сајбердемон,Cyberdemon,Siber Şeytan,Кібердемон +Our Hero,CC_HERO,,,,Náš hrdina,Vores helt,Unser Held,Ο ήρωας μας,Nia heroo,Nuestro héroe,,Sankarimme,Notre Héros,,Hősünk,Il Nostro eroe,我らのヒーロー,우리들의 영웅,Onze held,Vår helt,Nasz bohater,Nosso herói,O Nosso Herói,Eroul Nostru,Наш герой,Наш херој,Vår hjälte,Bizim Kahramanımız,Наш герой +,,Actor tag names,,,,,,,,,,,,,,,,,,,,,,,,,,, +Sergeant,FN_SHOTGUN,,,,Seržant,Sergent,Schütze,Λοχίας,Serĝento,Sargento,,Kersantti,Type au Fusil,,Őrmester,Zombie Sergente,ゾンビ軍曹,샷건 가이,,Sersjant,Zombie-sierżant,Sargento,Sargento,Sergent,Зомби-сержант,Водник,Hagelgevärskille,Çavuş,Зомбі-сержант +Chaingunner,FN_HEAVY,,,,Kulometčík,,MG-Schütze,Πολυβόλο Ζόμπι,Maŝinpafilisto,Ametrallador,,Konekiväärimies,Type au Gros Flingue,,Kommandós,Zombie Commando,チェーンガンゾンビ,체인거너,Machinegeweerman,Maskingeværskyt,Ciężkozbrojny Zombie,Comando,Metrelhador,Mitralior,Зомби-пулемётчик,Митраљезац,Tunga vapen kille,Ağır Silah Dostum,Кулеметник +Spectre,FN_SPECTRE,,,,Přízrak,Spøgelse,Schemen,Φάντασμα,Fantomo,Espectro,,Haamu,,,Lidérc,Spettro,スペクトル,스펙터,Spook,Spøkelse,Widmo,Espectro,,Spectru,Фантом,Авет,,Hayalet,Примара +Spider Mastermind,FN_SPIDER,,,,Pavoučí velevůdce,Edderkoppen Mastermind,Spinnenmeister,Αραχνό Ιθύνων Νους,Elektraraneo-Mastro,Mente-Maestra Arácnida,,Hämähäkkiaivot,L'Araignée Commandante,,Pókelme,L'Aracnomente Suprema,スパイダーマスターマインド,스파이더 마스터마인드,Spinnenmeesterbrein,Edderkopphjerne,Pajęczy Mistrz,Aranha-Mestra,,Păianjen Maestru,Паук-предводитель,Паук-руководилац,Spindelns hjärna,Örümcek Beyni,Павук-полководець +Cyberdemon,FN_CYBER,,,,Kyberdémon,Cyberdæmon,Cyberdämon,Cyber-δαίμονας,Ciberdemono,Ciberdemonio,,Kyberdemoni,Le Cyberdémon,,Kiberdémon,Il Cyberdemonio,サイバーデーモン,사이버데몬,Cyberdemoon,Kyberdemon,Cyberdemon,Ciberdemônio,,Ciberdemon,Кибердемон,Сајбердемон,Cyberdemon,Siber İblis,Кібердемон +Nazi,FN_WOLFSS,,,,Nácek,,,Ναζιστής,Nazio,,,Natsi,,,Náci,Nazista,ナチ兵,나치,,Nazist,Nazista,Nazista,,Nazist,Нацист,Нациста,Nazist,,Нацист +Dog,FN_DOG,,,,Pes,Hund,Hund,Σκύλος,Hundo,Perro,,Koira,Chien,,Kutya,Cane,犬,개,Hond,Hund,Pies,Cão,,Câine,Собака,Пас,Hund,Köpek,Пес +Brass Knuckles,TAG_FIST,,,,Boxer,Messing knoer,Schlagringe,Γροθιά,Pugningo,Puño americano,Manopla (puño de acero),Nyrkkirauta,Poing Américain,,Bokszer,Tirapugni ,ナックルダスター,너클,Boksbeugels,Knokejern,Kastety,Soco Inglês,Soqueira,Rozetă,Латунный кастет,Боксер,Mässingsknoglar,Pirinç Muşta,Кулаки +Chainsaw,TAG_CHAINSAW,,,,Motorová pila,Kædesav,Kettensäge,Αλλησοπρίονο,Ĉensegilo,Motosierra,,Moottorisaha,Tronçonneuse,,Láncfűrész,Motosega,チェーンソウ,전기톱,Kettingzaag,Motorsag,Piła łańcuchowa,Motosserra,,Drujbă,Бензопила,Моторна тестера,Motorsåg,Testere,Бензопила +Pistol,TAG_PISTOL,,,,Pistole,,Pistole,Πιστόλι,Pafileto,Pistola,,Pistooli,Pistolet,,Pisztoly,Pistola,ピストル,권총,Pistool,,Pistolet,Pistola,,,Пистолет,Пиштољ,,Tabanca,Пістолет +Shotgun,TAG_SHOTGUN,,,,Brokovnice,Haglgevær,Schrotflinte,Ντουφέκι,Kartoĉa fusilo,Escopeta,,Haulikko,Fusil à pompe,,Sörétes Puska,Fucile,ショットガン,샷건,Jachtgeweer,Haglgevær,Strzelba,Espingarda,,Pușcă,Дробовик,Пумпарица,Hagelgevär,Av Tüfeği,Дробовик +Super Shotgun,TAG_SUPERSHOTGUN,,,,Superbrokovnice,Super-Haglgevær,Super-Schrotflinte,Διπλό Ντουφέκι,Dutuba fusilo,Superescopeta,,Superhaulikko,Super Fusil de chasse,,Szuper Sörétes,Fucile a doppia canna ,スーパーショットガン,슈퍼 샷건,Superjachtgeweer,Super-Haglgevær,Super strzelba,Espingarda de cano duplo,,Super Pușcă,Супердробовик,Двоцевка,Super hagelgevär,Süper Av Tüfeği,Двостволка +Chaingun,TAG_CHAINGUN,,,,Kulomet,Maskingevær,Maschinengewehr,Πολυβόλο,Maŝinpafilo,Ametralladora,,Gatling-kk,Mitrailleuse,,Golyószóró,Mitragliatore a canne rotanti ,チェーンガン,체인건,Machinegeweer,Maskinpistol,Karabin maszynowy,Metralhadora,,Mitralieră rotativă,Пулемёт,Митраљез,Kedjepistol,,Кулемет +Rocket Launcher,TAG_ROCKETLAUNCHER,,,,Raketomet,Raketkaster,Raketenwerfer,Πυραυλοβόλο,Misilpafilo,Lanzamisiles,,Sinko,Lance-Roquettes,,Rakétavető,Lanciamissili,ロケットランチャー,로켓 런쳐,Raketwerper,Rakettkaster,Wyrzutnia rakiet,Lança-foguetes,Lança-Mísseis,Lansator de Rachete,Ракетомёт,Бацач ракета,Raketkastare,Roket Fırlatıcı,Ракетомет +Plasma Rifle,TAG_PLASMARIFLE,,,,Plazmová puška,Plasma riffel,Plasmagewehr,Πλάσμα Όπλο,Plasmo-pafilo,Fusil de plasma,,Plasmapyssy,Fusil à Plasma,,Plazmafegyver,Fucile al Plasma ,プラズマライフル,플라즈마 라이플,Plasmageweer,Plasmagevær,Karabin plazmowy,Fuzil de Plasma,Pistola de Plasma,Pușcă cu Plasmă,Плазменная пушка,Плазма оружје,Plasmagevär,Plazma Tüfeği,Плазмаган +BFG 9000,TAG_BFG9000,,,,,,,,,,,,,,,,,,,,,,,,,ВЈП 9000,,,БФГ 9000 +Bullets,AMMO_CLIP,,,,Kulky,Kugler,Patronen,Σφαίρες,Kugloj,Balas,,Luodit,Balles,Meci,Töltények,Proiettili,銃弾,권총 탄약,Kogels,Kuler,Naboje,Balas,,Gloanțe,Пули,Меци,Kulor,Kurşunlar,Кулі +Shotgun Shells,AMMO_SHELLS,,,,Broky,Haglgeværpatroner,Schrotpatronen,Σφαίρες Ντουφεκιού,Kartoĉoj,Cartuchos de escopeta,,Haulikon patruunat,Cartouches,Čahure za pumpericu,Sörétek,Cartucce per fucile,散弾シェル,샷건 탄약,Jachtgeweerkogels,Haglepatroner,Loftki,Cartuchos de Espingarda,,Proiectile pentru Pușcă,Патроны дробовика,Патроне за пумпарицу,Skottgubbar,Av Tüfeği Fişekleri,Рушничні набої +Rockets,AMMO_ROCKETS,,,,Rakety,Raketter,Raketen,Πύραυλοι,Raketoj,Cohetes,,Raketit,Roquettes,Rakete,Rakéták,Razzi,ロケット弾,로켓,Raketten,Raketter,Rakiety,Foguetes,Mísseis,Rachete,Ракеты,Ракете,Raketer,Roketler,Ракети +Energy Cells,AMMO_CELLS,,,,Energetické články,Energiceller,Energiezellen,Κύτταρα Ενέργιας,Energiĉeloj,Célula de energía,,Energia-akut,Cellules,Energetske ćelije,Energiacellák,Batterie,エネルギーセル,에너지 셀,Energiecellen,Energiceller,Ogniwa energetyczne,Células de Energia,,Celule cu Energie,Энергобатареи,Енергетске ћелије,Energiceller,Enerji Hücreleri,Енергетичні батареї +,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,,, +%o thought %g saw an arachnotron.,OB_STEALTHBABY,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] arachnotrona.","%o troede, @[pro_dk] så en arachnotron.","%o dachte, ein Arachnotron zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Αραχνοτρόν.,"%o pensis, ke @[pro_eo] vidis elektraraneon.",%o ha creído ver un Aracnotrón.,%o creyó haber visto un Aracnotrón.,%o luuli nähneensä araknotronin.,%o a cru voir un Arachnotron.,,"%o azt hitte, hogy látott egy póktront.",a %o sembrava di aver visto un arachnotron.,%o がアラクノトロンを見た気がした。,%o 은(는) 아라크노트론을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een arachnotron zag.,%o trodde @[pro_dk] så et arachnotron.,%o kątem oka zauważył@[ao_pl] arachnotrona.,%o achou que viu uma arachnotron.,,%o a crezut că %g a văzut un aracnotron.,Игрок %o краем глаза заметил арахнотрона.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] паукотрона.,%o trodde att @[pro_sv] såg en arachnotron.,%o bir araknotron gördüğünü sandı.,Арахнотрон мелькнув перед очима %o. +%o thought %g saw an archvile.,OB_STEALTHVILE,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] veleběsa.","%o troede, @[pro_dk] så en ærkevile.","%o dachte, ein Scheusal zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Νεκρομάντη,"%o pensis, ke @[pro_eo] vidis ĉef-fiulon.",%o ha creído ver un Arch-Vile.,%o creyó haber visto un Arch-Vile.,%o luuli nähneensä arkkihirvityksen,%o a cru voir un Arche-Vile.,,"%o azt hitte, hogy látott egy ősármányt.",a %o sembrava di aver visto un Arch-Vile.,%o がアーチバイルを見た気がした。,%o 은(는) 아크-바일을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een aartsvijand zag.,%o trodde @[pro_dk] så en erkefiende.,%o kątem oka zauważył@[ao_pl] arcypodleca.,%o achou que viu um arquivil.,,%o a crezut că %g a văzut un abject.,Игрок %o краем глаза заметил архвиля.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] једног арчвајла.,%o trodde att @[pro_sv] såg en ärkevild.,%o bir iğrençlik gördüğünü sandı.,Арчвайл мелькнув перед очима %o. +%o thought %g saw a Baron of Hell.,OB_STEALTHBARON,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] barona pekel.","%o troede, @[pro_dk] så en helvedesbaron.","%o dachte, einen Höllenbaron zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Βαρώνο της Κόλασης.,"%o pensis, ke @[pro_eo] vidis Baronon de Infero.",%o ha creído ver un Barón del Infierno.,%o creyó haber visto un Barón del Infierno.,%o luuli nähneensä hornanparonin.,%o a cru voir un Baron des enfers.,,"%o azt hitte, hogy látott egy pokolbárót.",a %o sembrava di aver visto un Barone Infernale.,%o がバロンを見た気がした。,%o 은(는) 바론 오브 헬을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een baron van de Hel zag.,%o trodde @[pro_dk] så en helvetesbaron,%o kątem oka zauważył@[ao_pl] Barona Piekła.,%o achou que viu um barão do inferno.,,%o a crezut că %g a văzut un Baron al Infernului.,Игрок %o краем глаза заметил барона ада.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] барона пакла.,%o trodde att @[pro_sv] såg en helvetets baron.,%o bir Cehennem Baronu gördüğünü sandı.,Барон Пекла мелькнув перед очима %o. +%o thought %g saw a cacodemon.,OB_STEALTHCACO,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] kakodémona.","%o troede, @[pro_dk] så en cacodemon.","%o dachte, einen Cacodämonen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Κακοδαίμονα.,"%o pensis, ke @[pro_eo] vidis kakodemonon.",%o ha creído ver un Cacodemonio.,%o creyó haber visto un Cacodemonio.,%o luuli nähneensä kakodemonin.,%o a cru voir un Cacodémon.,,"%o azt hitte, hogy látott egy kakodémont.",a %o sembrava di aver visto un cacodemone.,%o がカコデーモンを見た気がした。,%o 은(는) 카코데몬을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een cacodemon zag.,%o trodde @[pro_dk] så en kakodemon.,%o kątem oka zauważył@[ao_pl] kakodemona.,%o achou que viu um cacodemônio.,,%o a crezut că %g a văzut un cacodemon.,Игрок %o краем глаза заметил какодемона.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] какодемона.,%o trodde att @[pro_sv] såg en cacodemon.,%o bir caco iblisi gördüğünü sandı.,Какодемон мелькнув перед очима %o. +%o thought %g saw a chaingunner.,OB_STEALTHCHAINGUY,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] kulometčíka.","%o troede, @[pro_dk] så en chaingunner.","%o dachte, einen MG-Schützen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Ζόμπι με ένα πολυβόλο.,"%o pensis, ke @[pro_eo] vidis maŝinpafiliston.",%o ha creído ver un Ametrallador.,%o creyó haber visto un Ametrallador.,%o luuli nähneensä konekiväärimiehen.,%o a cru voir un mitrailleur.,,"%o azt hitte, hogy látott egy kommandóst.",a %o sembrava di aver visto uno zombie commando.,%o がチェインガンナーを見た気がした。,%o 은(는) 체인거너를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een zware wapens kerel zag.,%o trodde @[pro_dk] så en maskingeværskyt.,%o kątem oka zauważył@[ao_pl] ciężkozbrojnego zombie.,%o achou que viu um comando possuído.,%o achou que viu um metrelhador.,%o a crezut că %g a văzut un mitralior.,Игрок %o краем глаза заметил пулемётчика.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] митраљезца.,%o trodde att @[pro_sv] såg en tunga vapen kille.,%o bir ağır silah dostu gördüğünü sandı.,Кулеметник мелькнув перед очима %o. +%o thought %g saw a demon.,OB_STEALTHDEMON,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] démona.","%o troede, @[pro_dk] så en dæmon.","%o dachte, einen Dämonen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα δαίμονα.,"%o pensis, ke @[pro_eo] vidis demonon.",%o ha creído ver un Demonio.,%o creyó haber visto un Demonio.,%o luuli nähneensä demonin.,%o a cru voir un démon.,,"%o azt hitte, hogy látott egy démont.",a %o sembrava di aver visto un demone.,%o がデーモンを見た気がした。,%o 은(는) 데몬을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een demon zag.,%o trodde @[pro_dk] så en demon.,%o kątem oka zauważył@[ao_pl] demona.,%o achou que viu um demônio.,,%o a crezut că %g a văzut un demon.,Игрок %o краем глаза заметил демона.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] демона.,%o trodde att @[pro_sv] såg en demon.,%o bir iblis gördüğünü sandı.,Демон мелькнув перед очима %o. +%o thought %g saw a Hell Knight.,OB_STEALTHKNIGHT,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] rytíře pekel.","%o troede, @[pro_dk] så en helvedesridder.","%o dachte, einen Höllenritter zu sehen.",@[art_gr] %o νόμιζε οτι είδε έναν Ιππότη της Κόλασης.,"%o pensis, ke @[pro_eo] vidis Inferkavaliron.",%o ha creído ver un Caballero del Infierno.,%o creyó haber visto un Caballero del Infierno.,%o luuli nähneensä hornanritarin.,%o a cru voir un chevalier infernal.,,"%o azt hitte, hogy látott egy pokollovagot.",a %o sembrava di aver visto un Cavaliere Infernale.,%o がヘルナイトを見た気がした。,%o 은(는) 헬 나이트를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een hel ridder zag.,%o trodde @[pro_dk] så en helvetesridder.,%o kątem oka zauważył@[ao_pl] Rycerza Piekła.,%o achou que viu um cavaleiro infernal.,%o achou que viu um cavaleiro infernal.,%o a crezut că %g a văzut un Cavaler al Infernului.,Игрок %o краем глаза заметил рыцаря ада.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] витеза пакла.,%o trodde att @[pro_sv] såg en helvetesriddare.,%o bir Cehennem Şövalyesi gördüğünü sandı.,Лицар Пекла мелькнув перед очима %o. +%o thought %g saw an imp.,OB_STEALTHIMP,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] čerta.","%o troede, @[pro_dk] så en imp.","%o dachte, einen Kobold zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Διάβολο.,"%o pensis, ke @[pro_eo] vidis diableton.",%o ha creído ver un Imp.,%o creyó haber visto un Imp.,%o luuli nähneensä pirun.,%o a cru voir un diablotin.,,"%o azt hitte, hogy látott egy tűzkoboldot.",a %o sembrava di aver visto un imp.,%o がインプを見た気がした。,%o 은(는) 임프를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een imp zag.,%o trodde @[pro_dk] så en imp.,%o kątem oka zauważył@[ao_pl] diablika.,%o achou que viu um diabrete.,,%o a crezut că %g a văzut un drac.,Игрок %o краем глаза заметил импа.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] врага.,%o trodde att @[pro_sv] såg en imp.,%o bir impus gördüğünü sandı.,Імп мелькнув перед очима %o. +%o thought %g saw a mancubus.,OB_STEALTHFATSO,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] mankuba.","%o troede, @[pro_dk] så en mankubus.","%o dachte, einen Mancubus zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Χοντρό.,"%o pensis, ke @[pro_eo] vidis mankubon.",%o ha creído ver un Mancubus.,%o creyó haber visto un Mancubus.,%o luuli nähneensä mankubuksen.,%o a cru voir un mancube.,,"%o azt hitte, hogy látott egy mankubuszt.",a %o sembrava di aver visto un mancubus.,%o がマンキュバスを見た気がした。,%o 은(는) 맨큐버스를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een mancubus zag.,%o trodde @[pro_dk] så en mancubus.,%o kątem oka zauważył@[ao_pl] antropokuba.,%o achou que viu um mancubus.,,%o a crezut că %g a văzut un mancubus.,Игрок %o краем глаза заметил манкубуса.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] манкубуса.,%o trodde att @[pro_sv] såg en mancubus.,%o bir mancubus gördüğünü sandı.,Манкубус мелькнув перед очима %o. +%o thought %g saw a revenant.,OB_STEALTHUNDEAD,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] umrlce.","%o troede, @[pro_dk] så en hævnen.","%o dachte, einen Wiederauferstandenen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Εκδικητή.,"%o pensis, ke @[pro_eo] vidis renaskitulon.",%o ha creído ver un Revenant.,%o creyó haber visto un Revenant.,%o luuli nähneensä henkiinpalanneen.,%o a cru voir un revenant.,,"%o azt hitte, hogy látott egy kísértetet.",a %o sembrava di aver visto un revenant.,%o がレバナントを見た気がした。,%o 은(는) 레버넌트를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een wraakzuchtige zag.,%o trodde @[pro_dk] så en gjenganger.,%o kątem oka zauważył@[ao_pl] zjawę.,%o achou que viu um insepulto.,%o achou que viu um renascido.,%o a crezut că %g a văzut un nemort.,Игрок %o краем глаза заметил ревенанта.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] повратника.,%o trodde att @[pro_sv] såg en återfödare.,%o bir iskelet gördüğünü sandı.,Ревенант мелькнув перед очима %o. +%o thought %g saw a sergeant.,OB_STEALTHSHOTGUNGUY,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] seržanta.","%o troede, @[pro_dk] så en sergent.","%o dachte, einen Schützen zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Λοχία.,"%o pensis, ke @[pro_eo] vidis serĝenton.",%o ha creído ver un Sargento.,%o creyó haber visto un Sargento.,%o luuli nähneensä kersantin.,%o a cru voir un type au fusil.,,"%o azt hitte, hogy látott egy őrmestert.",a %o sembrava di aver visto un zombie sergente.,%o が軍曹を見た気がした。,%o 은(는) 샷건 가이를 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een jachtgeweer kerel zag.,%o trodde @[pro_dk] så en sersjant.,%o kątem oka zauważył@[ao_pl] zombie-sierżanta.,%o achou que viu um sargento possuído.,%o achou que viu um sargento.,%o a crezut că %g a văzut un sergent.,Игрок %o краем глаза заметил сержанта.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] водника.,%o trodde att @[pro_sv] såg en hagelgevärskille.,%o bir çavuş gördüğünü sandı.,Сержант мелькнув перед очима %o. +%o thought %g saw a zombieman.,OB_STEALTHZOMBIE,,,,"%o si myslel@[ao_cs], že viděl@[ao_cs] zombíka.","%o troede, @[pro_dk] så en zombie.","%o dachte, einen Zombie zu sehen.",@[art_gr] %o νόμιζε οτι είδε ένα Ζόμπι.,"%o pensis, ke @[pro_eo] vidis zombion.",%o ha creído ver un Zombi.,%o creyó haber visto un Zombi.,%o luuli nähneensä zombin.,%o a cru voir un zombie.,,"%o azt hitte, hogy látott egy zombit.",a %o sembrava di aver visto uno zombie marine.,%o がゾンビ兵を見た気がした。,%o 은(는) 좀비맨을 봤다고 생각했다.,%o dacht dat @[hij_ze_nl] een zombie zag.,%o trodde @[pro_dk] så en zombiemann.,%o kątem oka zauważył@[ao_pl] zombie.,%o achou que viu um zumbi.,%o achou que viu um zombie.,%o a crezut că %g a văzut un zombi.,Игрок %o краем глаза заметил зомби.,%o мисли@[ao_1_sr] да је виде@[ao_1_sr] зомбија.,%o trodde att @[pro_sv] såg en zombie.,%o bir zombi gördüğünü sandı.,Зомбі мелькнув перед очима %o. +%o was punched by a revenant.,OB_UNDEADHIT,,,,%o byl@[ao_cs] udeřen@[ao_cs] umrlcem.,%o blev slået af en genfødt.,%o wurde von einem Wiederauferstandenen K.O geschlagen.,@[art_gr] %o έφαγε μια μπουνία απο έναν Εκδικητή.,%o estis pugnita de renaskitulo.,A %o l@[ao_esp] ha golpeado un Revenant.,A %o l@[ao_esp] golpeó un Revenant.,%o joutui henkiinpalanneen lyömäksi.,%o s'est pris@[e_fr] une raclée de la part d'un revenant.,,%o-t kiütötte egy kísértet.,%o è stato colpito dal pugno di un revenant.,%o はレバナントに殴られた。,%o 은(는) 레버넌트에게 맞아 죽었다.,%o werd geslagen door een wraakzuchtige.,%o ble slått av en gjenganger.,%o został@[ao_pl] uderzon@[adj_pl] przez zjawę.,Um insepulto socou %o.,%o foi socad@[ao_ptb] por um renascido.,%o a primit un pumn de la un nemort.,Игрока %o ударил ревенант.,%o је ударен@[adj_1_sr] од стане повратника.,%o blev slagen av en återfödare.,%o bir iskelet tarafından yumruklandı.,%o бу@[adj_1_ua] забит@[adj_4_ua] ревевантом. +%o was slashed by an imp.,OB_IMPHIT,,,,%o byl@[ao_cs] rozsápán@[ao_cs] čertem.,%o blev skåret ned af en spøgelse.,%o wurde von einem Kobold gekratzt.,@[art_gr] %o κόπηκε απο ενα Διάβολο.,%o estis tranĉvundita de diableto.,A %o l@[ao_esp] ha desgarrado un Imp.,A %o l@[ao_esp] desgarró un Imp.,%o joutui pirun sivaltamaksi.,%o a été lacéré@[e_fr] par un diablotin.,,%o-t széttépte egy tűzkobold.,%o è stato squarciato da un imp.,%o はインプに切り裂かれた。,%o 은(는) 임프에게 찢겨 죽었다.,%o werd gesneden door een imp.,%o ble kuttet av en imp.,%o został@[ao_pl] rozcięt@[adj_pl] przez diablika.,Um diabrete dilacerou %o.,,%o a fost zgâriat de un drac.,Игрока %o расцарапал имп.,Играча %o је пресеко враг.,%o blev knivhuggen av en imp.,%o bir imp tarafından kesildi.,%o роздер імп. +%o got too close to a cacodemon.,OB_CACOHIT,,,,%o se dostal@[ao_cs] moc blízko ke kakodémonovi.,%o kom for tæt på en cacodæmon.,%o kam dem Cacodämonen zu nahe.,@[art_gr] %o ήτανε πολυ κοντά σε ένα Κακοδαίμονα.,%o tro proksimiĝis al kakodemono.,%o se ha acercado demasiado a un Cacodemonio.,%o se acercó demasiado a un Cacodemonio.,%o meni liian lähelle kakodemonia.,%o s'est approché@[e_fr] trop près d'un Cacodémon.,,%o túl közel ment egy kakodémonhoz.,%o si è avvicinato troppo a un cacodemone.,%o はカコデーモンに近づきすぎた。,%o 은(는) 카코데몬과 가까웠다.,%o kwam te dicht bij een cacodemon.,%o kom for nær en kakodemon.,%o pod@[irreg_1_pl] zbyt blisko do kakodemona.,%o chegou muito perto de um cacodemônio.,,%o s-a apropiat prea mult de un cacodemon.,Игрок %o слишком сблизился с какодемоном.,%o се превише приближи@[ao_1_sr] какодемону.,%o kom för nära en cacodemon.,%o bir caco iblisiyle çok yakınlaştı.,%o опини@[adj_2_ua] надто близько до какодемона. +%o was bit by a demon.,OB_DEMONHIT,,,,%o byl@[ao_cs] rozkousán@[ao_cs] démonem.,%o blev bidt af en dæmon.,%o wurde von einem Dämonen gebissen.,@[art_gr] %o δαγκόθηκε απο ένα Δαίμονα.,%o estis mordita de demono.,A %o l@[ao_esp] ha mordido un Demonio.,A %o l@[ao_esp] mordió un Demonio.,%o joutui demonin puremaksi.,%o a été mordu@[e_fr] par un démon.,,%o-t megharapta egy démon.,%o è stato sbranato da un demone.,%o はデーモンに噛まれた。,%o 은(는) 데몬에게 물렸다.,%o werd gebeten door een demon.,%o ble bitt av en demon.,%o wpada w szczęki demona.,Um demônio mordeu %o.,,%o a fost mușcat de un demon.,Игрока %o укусил демон.,Играча %o је ујео демон.,%o blev biten av en demon.,%o bir iblis tarafından ısırıldı.,%o покусав демон. +%o was eaten by a spectre.,OB_SPECTREHIT,,,,%o byl@[ao_cs] sežrán@[ao_cs] přízrakem.,%o blev spist af et imp.,%o wurde von dem Schemen gefressen.,Ένα φάντασμα έφαγε @[pro_gr] %o.,%o estis manĝita de fantomo.,A %o l@[ao_esp] ha devorado un Espectro.,A %o l@[ao_esp] devoró un Espectro.,%o joutui haamun syömäksi.,%o a été dévoré@[e_fr] par un spectre.,,%o-t felfalta egy lidérc.,%o è stato divorato da uno spettro.,%o はスペクトルに喰われた。,%o 은(는) 스펙터에게 잡아먹혔다.,%o werd opgegeten door een spook.,%o ble spist av et spøkelse.,%o został@[ao_pl] zjedzon@[adj_pl] przez widmo.,Um espectro devorou %o.,,%o a fost mâncat de un spectru.,Игрока %o сожрал фантом.,Играча %o је појео авет.,%o blev uppäten av ett spöke.,%o bir hayalet tarafından yenildi.,%o зжерла примара. +%o was ripped open by a Baron of Hell.,OB_BARONHIT,,,,%o byl@[ao_cs] rozčtvrcen@[ao_cs] baronem pekel.,%o blev flået op af en helvedesbaron.,%o wurde von dem Höllenbaron aufgerissen.,@[art_gr] %o σχίστηκε απο εναν Βαρώνο της Κόλασης.,%o estis disŝirigita de Barono de Infero.,A %o l@[ao_esp] ha hecho trizas un Barón del Infierno.,A %o l@[ao_esp] hizo trizas un Barón del Infierno.,%o joutui hornanparonin auki repimäksi.,%o a été déchiré@[e_fr] par un Baron des Enfers.,,%o-t széttépte egy pokolbáró.,%o è stato scoperchiato da un Barone dell'Inferno.,%o はバロンオブヘルに体を抉じ開けられた。,%o 은(는) 바론 오브 헬에게 뜯겨 죽었다.,%o werd opengereten door een Baron van de hel.,%o ble revet opp av en helvetesbaron.,%o został@[ao_pl] rozerwan@[adj_pl] przez Barona Piekła.,Um Barão do Inferno rasgou %o.,%o foi desventrad@[ao_ptb] por um Barão do Inferno.,%o a fost deschis pe viu de un Baron al Infernului.,Игрока %o разорвал барон ада.,%o је поцеп@[adj_2_sr] од стране барон пакла.,%o slets upp av en helvetesbaron.,%o bir Cehennem Baronu tarafından parçalandı.,Барон Пекла роздер %o. +%o was gutted by a Hell Knight.,OB_KNIGHTHIT,,,,%o byl@[ao_cs] vykuchán@[ao_cs] rytířem pekel.,%o blev udtaget af en helvedesridder.,%o wurde von dem Höllenritter ausgenommen.,@[art_gr] %o ξεκοιλιάστηκε απο έναν Ιππότη της Κόλασης.,%o estis senintestigita de Inferkavaliro.,A %o l@[ao_esp] ha destripado un Caballero del Infierno.,A %o l@[ao_esp] destripó un Caballero del Infierno.,%o joutui hornanritarin perkaamaksi.,%o a été étripé@[e_fr] par un un chevalier infernal.,,%o-t kibelezte egy pokollovag.,%o è stato sbudellato da un Cavaliere dell'Inferno.,%o はヘルナイトに内臓を抉られた。,%o 은(는) 헬 나이트에게 도륙당했다.,%o werd gestript door een hel ridder.,%o ble sløyet av en helvetesridder.,%o został@[ao_pl] wypatroszon@[adj_pl] przez Rycerza Piekła.,Um Cavaleiro Infernal estripou %o.,%o foi estripad@[ao_ptb] por um Cavaleiro Infernal.,%o a fost măcelărit de un Cavaler al Infernului.,Игрока %o распотрошил рыцарь ада.,Играча %o је унаказио витез пакла.,%o blev uppsliten av en helvetesriddare.,%o bir Cehennem Şövalyesi tarafından parçalandı.,Лицар Пекла розпотрошив %o. +%o was killed by a zombieman.,OB_ZOMBIE,,,,%o byl@[ao_cs] zabit@[ao_cs] zombíkem.,%o blev dræbt af en zombie.,%o wurde von einem Zombie getötet.,@[art_gr] %o σκοτώθηκε απο ένα Ζόμπι.,%o estis mortigita de zombio.,A %o se l@[ao_esp] ha cargado un Zombi.,A %o l@[ao_esp] mató un Zombi.,%o joutui zombin tappamaksi.,%o a été tué@[e_fr] par un zombie.,,%o-t megölte egy zombi.,%o è stato ucciso da uno zombie marine.,%o はゾンビ兵に殺された。,%o 은(는) 좀비맨에게 죽었다.,%o werd gedood door een zombie.,%o ble drept av en zombiemann.,%o został@[ao_pl] zabit@[adj_pl] przez zombie.,Um zumbi matou %o.,%o foi mort@[ao_ptb] por um zombie.,%o a fost omorât de un zombi.,Игрока %o убил зомби.,%o је убијен@[adj_1_sr] од стране зомбија.,%o blev dödad av en zombie.,%o bir zombi tarafından öldürüldü.,%o вбив зомбі. +%o was shot by a sergeant.,OB_SHOTGUY,,,,%o byl@[ao_cs] zastřelen@[ao_cs] seržantem.,%o blev skudt af en sergent.,%o wurde von einem Schützen erschossen.,Ένας Λοχίας πυροβόλησε @[pro_gr] %o.,%o estis pafita de serĝento.,A %o l@[ao_esp] ha fusilado un Sargento.,A %o l@[ao_esp] fusiló un Sargento.,%o joutui kersantin ampumaksi.,%o s'est fait@[e_fr] flinguer par un type au fusil.,,%o-t lelőtte egy őrmester.,%o è sato impallinato da uno zombie sergente.,%o はゾンビ軍曹に撃たれた。,%o 은(는) 서전트에게 총을 맞았다.,%o werd neergeschoten door een sergeant.,%o ble skutt av en sersjant.,%o został@[ao_pl] zastrzelon@[adj_pl] przez zombie-sierżanta.,Um sargento possuído atirou em %o.,,%o a fost împușcat de un sergent.,Игрока %o застрелил сержант.,Играча %o је погодио водник.,%o blev skjuten av en hagelgevärskille.,%o bir çavuş tarafından vuruldu.,Сержант застрелив %o. +%o was incinerated by an archvile.,OB_VILE,,,,%o byl@[ao_cs] zpopelněn@[ao_cs] veleběsem.,%o blev brændt af en ærkevile.,%o wurde von einem Scheusal verbrannt.,@[art_gr] %o αποτεφρώθηκε απο ένα Νεκρομάντη.,%o estis cindrigita de ĉef-fiulo.,A %o l@[ao_esp] ha incinerado un Arch-Vile.,A %o l@[ao_esp] incineró un Arch-Vile.,%o joutui arkkihirvityksen kärventämäksi.,%o a été incinéré@[e_fr] par un Arche-Vile.,,%o-t megpörkölte egy ősármány.,%o è stato incenerito da un arch-vile.,%o はアーチバイルに焼き尽くされた。,%o 은(는) 아크-바일에 의해 소각되었다.,%o werd verbrand door een aartsvijand.,%o ble brent av en erkefiende.,%o został@[ao_pl] spalon@[adj_pl] przez arcypodleca.,Um arquivil incinerou %o.,,%o a fost incinerat de un abject.,Игрока %o заживо сжёг архвиль.,Играча %o је запалио арчвајл.,%o blev förbränd av en ärkevilde,%o bir iğrençlik tarafından yakıldı.,Арчвайл спалив вщент %o. +%o couldn't evade a revenant's fireball.,OB_UNDEAD,,,,%o se nevyhnul@[ao_cs] umrlčí ohnivé kouli.,%o kunne ikke undvige en ildkugle fra en hævnen.,%o konnte dem Feuerball des Wiederauferstandenen nicht ausweichen.,@[art_gr] %o δέν μπορούσε να αποφείγει τον πύραυλο ενός Εκδικητή.,%o ne povis eviti fajrobulon de renaskitulo.,A %o l@[ao_esp] ha hecho reventar un Revenant.,A %o l@[ao_esp] hizo reventar un Revenant.,%o ei kyennyt väistämään henkiinpalanneen tulipalloa.,%o n'a pas réussi à esquiver un missile de revenant.,,%o nem tudta kivédeni egy kísértet tűzgolyóját.,%o non ha potuto evitare il missile di un revenant.,%o はレバナントのファイアボールを回避できなかった。,%o 은(는) 레버넌트의 화염구를 피하지 못했다.,%o kon de vuurbal van een wraakzuchtige niet ontwijken.,%o klarte ikke å unngå en gjengangers ildkule.,%o nie udaje się uniknąć pocisku od zjawy.,%o não conseguiu desviar do míssil do insepulto.,%o não conseguiu desviar do míssil do renascido.,%o n-a putut scăpa de mingea de foc a nemortului.,Игрок %o не успел увернуться от снаряда ревенанта.,%o није мог@[ao_2_sr] да избегне повратникову пламену куглу.,%o kunde inte undvika en återfödds eldklot.,%o bir iskeletin ateş topundan kaçamadı.,Снаряд ревенанта дістав %o. +%o was squashed by a mancubus.,OB_FATSO,,,,%o byl@[ao_cs] rozmačkán@[ao_cs] mankubem.,%o blev knust af en mankubus.,%o wurde von einem Mancubus plattgemacht.,@[art_gr] %o λιόθηκε απο έναν Χοντρό.,%o estis dispremita de mankubo.,A %o l@[ao_esp] ha pulverizado un Mancubus.,A %o l@[ao_esp] pulverizó un Mancubus.,%o joutui mankubuksen liiskaamaksi.,%o s'est fait@[e_fr] aplatir par un Mancube.,,%o-t szétlapította egy mankubusz.,%o è stato disintegrato da un mancubus.,%o はマンキュバスに潰された。,%o 은(는) 맨큐버스에게 짓이겨졌다.,%o werd verpletterd door een mancubus.,%o ble knust av en mancubus.,%o został@[ao_pl] zmiażdżon@[adj_pl] przez antropokuba.,Um mancubus esmagou %o.,,%o a fost strivit de un mancubus.,Игрока %o раздавил манкубус.,Играча %o је изгњечио манкубус.,%o blev krossad av en mancubus.,%o bir mancubus tarafından ezildi.,%o розчавлено манкубусом. +%o was perforated by a chaingunner.,OB_CHAINGUY,,,,%o byl@[ao_cs] prostřelen@[ao_cs] kulometčíkem.,%o blev perforeret af en chaingunner.,%o wurde von einem MG-Schützen perforiert.,@[art_gr] %o εκτελέστικε απο ένα Ζόμπι με ένα πολυβόλο.,%o estis truigadita de maŝinpafilisto.,A %o l@[ao_esp] ha perforado un Ametrallador.,A %o l@[ao_esp] perforó un Ametrallador.,%o joutui konekiväärimiehen rei'ittämäksi.,%o a été perforé@[e_fr] par un mitrailleur.,,%o-t szitává lőtte egy kommandós.,%o è stato perforato da uno zombie commando.,%o はチェインガンナーに蜂の巣にされた。,%o 은(는) 체인거너에 의해 벌집이 됐다.,%o werd geperforeerd door een zware wapens kerel.,%o ble perforert av en chaingunner.,%o został@[ao_pl] przedziurawion@[adj_pl] przez ciężkozbrojnego zombie.,Um comando possuído perfurou %o.,%o foi perfurad@[ao_ptb] por um metrelhador.,%o a fost perforat de un mitralior.,Игрока %o продырявил пулемётчик.,Играча %o је изрешетао митраљезац.,%o blev perforerad av en tunga vapen kille.,%o bir ağır silah tarafından delindi.,%o отрима@[adj_1_ua] численні отвори від куль кулеметника. +%o was spooked by a lost soul.,OB_SKULL,,,,%o se lekl@[ao_cs] ztracené duše.,%o blev skræmt af en fortabt sjæl.,%o wurde von einer Verlorenen Seele heimgesucht.,Μια Χαμένη Ξυχή φόβησε @[pro_gr] %o.,%o estis timigita de perdita animo.,%o se ha muerto de miedo con un Alma Errante.,%o se murió de miedo con un Alma Errante.,%o joutui kadonneen sielun säikäyttämäksi.,%o s'est fait@[e_fr] surprendre par une âme perdue.,,%o-t halálra ijesztette egy kóbor lélek.,%o è stato spaventato a morte da un'Anima Errante.,%o はロストソウルにビビらされた。,%o 은(는) 로스트 소울을 보고 깜짝 놀랐다.,%o werd bang gemaakt door een verloren ziel.,%o ble skremt av en fortapt sjel.,%o został@[ao_pl] przestraszon@[adj_pl] przez zaginioną duszę.,Uma alma penada assustou %o.,%o se assustou com uma alma penada.,%o a fost speriat de un suflet pierdut.,Игрок %o запуган до смерти потерянной душой.,%o је уплашен@[adj_1_sr] од изгубљене душе.,%o blev skrämd av en förlorad själ.,%o kayıp bir ruh tarafından korkutuldu.,Заблудла душа перестрашила %o. +%o was burned by an imp.,OB_IMP,,,,%o byl@[ao_cs] spálen@[ao_cs] čertem.,%o blev brændt af en spøgelse.,%o wurde von einem Kobold verbrannt.,@[art_gr] %o κάικε απο έναν Διάβολο.,%o estis bruligita de diableto.,A %o l@[ao_esp] ha calcinado un Imp.,A %o l@[ao_esp] calcinó un Imp.,%o joutui pirun polttamaksi.,%o brûlé@[e_fr] par un diablotin.,,%o-t szénné égette egy tűzkobold.,%o è stato bruciato da un imp.,%o はインプに焼かれた。,%o 은(는) 임프에게 불태워졌다.,%o werd verbrand door een imp.,%o ble brent av en imp.,%o został@[ao_pl] spalon@[adj_pl] przez diablika.,Um diabrete queimou %o.,,%o a fost ars de un demon.,Игрока %o сжёг имп.,%o је изгорен@[adj_1_sr] од стране врага.,%o blev bränd av en imp.,%o bir imp tarafından yakıldı.,%o спалено імпом. +%o was smitten by a cacodemon.,OB_CACO,,,,%o byl@[ao_cs] udeřen@[ao_cs] kakodémonem.,%o blev ramt af en cacodæmon.,%o wurde von einem Cacodämonen gequält.,@[art_gr] %o καίκε απο έναν Κακοδαίμονα.,%o estis venkobatita de kakodemono.,A %o l@[ao_esp] ha cascado un Cacodemonio.,A %o l@[ao_esp] cascó un Cacodemonio.,%o joutui kakodemonin iskemäksi.,%o a été terrassé@[e_fr] par un Cacodémon.,,%o-ra lesújtott egy kakodémon.,%o è stato abbattuto da un cacodemone.,%o はカコデーモンに裁きを受けた。,%o 은(는) 카코데몬에게 엄습 당했다.,%o werd geslagen door een cacodemon.,%o ble slått av en kakodemon.,%o został@[ao_pl] porażon@[adj_pl] przez kakodemona.,Um cacodemônio golpeou %o.,,%o a fost lovit de un cacodemon.,Игрока %o поразил какодемон.,Играча %o је ударио какодемон.,%o blev förkrossad av en cacodemon.,%o bir caco iblisi tarafından vuruldu.,%o уражено какодемоном. +%o was bruised by a Baron of Hell.,OB_BARON,,,,%o byl@[ao_cs] pomačkán@[ao_cs] baronem pekel.,%o blev såret af en helvedesbaron.,%o wurde von einem Höllenbaron geröstet.,@[art_gr] %o γρατζουνήθηκε απο ένα Βαρώνο της Κόλασης.,%o estis kontuzita de Barono de Infero.,A %o l@[ao_esp] ha magullado un Barón del Infierno.,A %o l@[ao_esp] magulló un Barón del Infierno.,%o joutui hornanparonin ruhjomaksi.,%o a été démoli@[e_fr] par un Baron des Enfers.,,%o-t összezúzta egy pokolbáró.,%o è stato scorticato da un Barone Infernale.,%o はバロンオブヘルに痛めつけられた。,%o 은(는) 바론 오브 헬에게 상처받았다.,%o werd gekneusd door een baron van de hel.,%o ble forslått av en helvetesbaron.,%o został@[ao_pl] stłuczon@[adj_pl] Barona Piekła.,Um Barão do Inferno feriu %o.,,%o a fost contuzionat de un Baron al Infernului.,Игрок %o зашиблен бароном ада.,%o је мод@[adj_3_sr] због барона пакла.,%o blev skadad av en helvetesbaron.,%o bir Cehennem Baronu tarafından yaralandı.,%o потовчено бароном Пекла. +%o was splayed by a Hell Knight.,OB_KNIGHT,,,,%o byl@[ao_cs] rozpůlen@[ao_cs] rytířem pekel.,%o blev splejset af en helvedesridder.,%o wurde von einem Höllenritter gebraten.,@[art_gr] %o απλώθηκε απο έναν Ιππότη της Κόλασης,%o estis bisekcita de Inferkavaliro.,A %o l@[ao_esp] ha partido en dos un Caballero del Infierno.,A %o l@[ao_esp] partió en dos un Caballero del Infierno.,%o joutui hornanritarin repimäksi.,%o a été éclaté@[e_fr] par un chevalier infernal.,,%o-t kilapította egy pokollovag.,%o è stato squartato da un Cavaliere Infernale.,%o はヘルナイトにバラ撒かれた。,%o 은(는) 헬 나이트에게 갈라졌다.,%o werd gespierd door een hel ridder.,Jeg ble sprettet opp av en helvetesridder.,%o został@[ao_pl] rozcapierzon@[adj_pl] przez Rycerza Piekła.,Um Cavaleiro Infernal espalmou %o.,%o foi espalmad@[ao_ptb] por um Cavaleiro Infernal.,%o a fost scrântit de un Cavaler al Infernului.,Игрока %o распластал рыцарь ада.,%o је раширен@[adj_1_sr] због витеза пакла.,%o blev spretad av en helvetesriddare.,%o bir Cehennem Şövalyesi tarafından yere serildi.,Лицар Пекла розкатав %o. +%o stood in awe of the spider demon.,OB_SPIDER,,,,%o zůstal@[ao_cs] stát v úžasu před pavoučím démonem.,%o stod i ærefrygt for edderkoppedæmonen.,%o stand in Ehrfurcht vor dem Spinnendämon.,@[art_gr] %o στάθηκε με δέος μπροστά στόν αραχνοδαίμονα.,%o staris mirigita antaŭ la aranedemono.,%o se ha arrodillado ante la Mente-Maestra Arácnida.,%o se arrodilló ante la Mente-Maestra Arácnida.,%o kunnioitti syvästi hämähäkkidemonia,%o est resté pris@[e_fr] d'admiration devant le Démon Arachnéen.,,%o halálra ijedt a Pókelme.,%o è stato soggiogato dal Ragno demoniaco.,%o はスパイダーデーモンに恐れをなした。,%o 은(는) 거미악마의 무자비함을 느꼈다.,%o stond in ontzag voor de spindemon.,%o sto i ærefrykt for edderkoppdemonen.,%o podziwiał@[ao_pl] pajęczego mistrza.,%o ajoelhou-se em frente à Aranha-Mestra.,,%o a stat înfricoșat în fața păianjenului maestru.,Игрок %o стоял в восторге перед пауком-предводителем.,%o се смрзну@[ao_1_sr] у очарању паук-руководилаца.,%o stod i vördnad inför spindeldemonen.,%o örümcek iblisin karşısında huşu içinde durdu.,%o бу@[adj_1_ua] захоплен@[ao_ua] могутністю павука-воєводи. +%o let an arachnotron get %h.,OB_BABY,,,,%o se nechal@[ao_cs] dostat arachnotronem.,%o blev sprængt af en arachnotron.,%o ließ sich von einem Arachnotron erledigen.,@[art_gr] %o άφησε ένα Αράχνοτρον να @[pro_gr] σκοτώσει.,%o lasis elektraraneon venki @[pro_eo]n.,A %o l@[ao_esp] ha alcanzado un Aracnotrón.,A %o l@[ao_esp] alcanzó un Aracnotrón.,%o antoi anaktrotronin saada hänet.,%o a laissé un arachnotron l'avoir@[e_fr].,,"%o hagyta, hogy elkapja egy póktron.",%o ha permesso che un arachnotron l'uccidesse.,%o が アラクノトロンに討ち取られた。,%o 은(는) 아라크노트론이 %o를(을) 죽이도록 놔두었다.,%o werd gedood door een arachnotron,%o ble sprengt av et arachnotron.,%o pozwolił@[ao_pl] arachnotronowi się do siebie dobrać.,Uma arachnotron pegou %o.,%o foi apanhad@[ao_ptb] por uma arachnotron.,%o s-a lăsat prins de un aracnotron.,Игрок %o дал себя на откуп арахнотрону.,%o је допусти@[ao_1_sr] да паукотрон дође до %h.,%o lät en arachnotron ta @[ref_sv].,%o bir araknotronun onu yakalamasına izin verdi.,%o да@[adj_1_ua] арахнотрону себе вбити. +%o was splattered by a cyberdemon.,OB_CYBORG,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] na kaši kyberdémonem.,%o blev splattet af en cyberdæmon.,%o wurde von einem Cyberdämon zerfetzt.,@[art_gr] %o έσκασε απο ένα Cyber-δαίμονα.,%o estis disŝprucigita de ciberdemono.,A %o l@[ao_esp] ha hecho pedazos un Ciberdemonio.,A %o l@[ao_esp] hizo pedazos un Ciberdemonio.,%o joutui kyberdemonin yltympäri roiskimaksi.,%o a été pulvérisé@[e_fr] par un Cyberdémon.,,%o-t cafatokra tépték a kiberdémon rakétái.,%o è stato spiaccicato da un Cyberdemone.,%o はサイバーデーモンにバラバラにされた。,%o 은(는) 사이버데몬에 의해 산산조각이 났다.,%o werd gespetterd door een cyberdemon.,%o ble sprutet av en kyberdemon.,%o został@[ao_pl] rozbryzgan@[adj_pl] przez cyberdemona.,Um Ciberdemônio arrebentou %o.,,%o a fost împroșcat de ciberdemon.,Игрока %o размазал кибердемон.,%o је спљоштен@[adj_1_sr] од стране сајбердемона,%o blev sönderslagen av en cyberdemon.,%o bir siber iblis tarafından parçalandı.,Кібердемон перетворив %o в хмарину крові. +%o met a Nazi.,OB_WOLFSS,,,,%o potkal@[ao_cs] nácka.,%o mødte en nazist.,%o traf einen Nazi.,@[art_gr] %o χνώρισε ένα Ναζιστή.,%o renkontis Nazion.,%o se ha topado con un Nazi.,%o se topó con un Nazi.,%o tapasi natsin.,%o a rencontré un Nazi.,,%o találkozott egy nácival.,%o ha incontrato un Nazista.,%o はナチ兵と遭遇した。,%o 은(는) 나치를 만났다.,%o ontmoette een nazi.,Jeg møtte en nazist.,%o spotkał@[ao_pl] nazistę.,%o encontrou um Nazista.,%o encontrou um Nazi.,%o a întâlnit un Nazist.,Игрок %o встретил нациста.,%o је упозна@[ao_1_sr] нацисту.,%o mötte en nazist.,%o bir Nazi ile karşılaştı.,%o зустрі@[adj_1_ua] нациста. +%o was mauled by a dog.,OB_DOG,,,,%o byl@[ao_cs] roztrhán@[ao_cs] psem.,%o blev mast af en hund.,%o wurde von einem Hund zerrissen.,@[art_gr] %o φαγόθικε απο ένα σκύλο.,%o estis atakita de hundo.,A %o l@[ao_esp] ha despedazado un Perro.,A %o l@[ao_esp] despedazó un Perro.,%o joutui koiran raatelemaksi.,%o s'est fait mordre par un chien.,,%o-t szétmarcangolta egy kutya.,%o è stato sbranato da un cane.,%o は犬に引き裂かれた。,%o 은(는) 개한테 으스러졌다.,%o werd verminkt door een hond.,%o ble maltraktert av en hund.,%o został@[ao_pl] poturbowan@[adj_pl] przez psa.,Um cachorro mutilou %o.,%o foi mutilad@[ao_ptb] por um cão.,%o a fost sfâșiat de un câine.,Игрока %o разорвала собака.,Играча %o је удавио пас.,%o blev misshandlad av en hund.,%o bir köpek tarafından parçalandı.,%o загризла собака. +%o chewed on %k's fist.,OB_MPFIST,,,,%o si pochutnal@[ao_cs] na pěsti hráče %k.,%o tyggede på %ks knytnæve.,%o kaute auf %ks Faust herum.,@[art_gr] %o μάσησε τη γροθία του/της %k.,%o maĉis la pugnon de %k.,%o se ha comido el puño de %k.,%o se comió el puño de %k.,%k rusikoi %o paran.,%o a bouffé le poing de %k.,,%o megkóstolta %k ökleit.,%o si è schiantato contro il pugno di %k.,%o は %k の拳を顔面に受けた。,%o 은(는) %k 의 주먹을 물었다.,%o gekauwd op %k's vuist.,%o tygget på %ks knyttneve.,%o przygryza pięść %k.,%k espancou %o até a morte.,,%o a mestecat pumnul lui %k.,Игрок %o отведал кулака игрока %k.,Играча %o је сажвакао песницу играча %k.,%o tuggade på %ks knytnäve.,"%o, %k tarafından öldürüldü.",%o відчу@[adj_1_ua] кулак %k. +%o was mowed over by %k's chainsaw.,OB_MPCHAINSAW,,,,%o byl@[ao_cs] zkácen@[ao_cs] motorovkou hráče %k.,%o blev slået ned af %ks motorsav.,%o wurde von %ks Kettensäge zerteilt.,@[art_gr] %o κόπηκε απο το αλλησοπρίονο του/της %k.,%o estis buĉita de la ĉensegilo de %k.,Ha habido matanza de %o con la motosierra de %k.,Hubo mascare de %o con la motosierra de %k.,%k katkoi %o paran.,%o a été tondu@[e_fr] par la tronconneuse de %k.,,%o-t kettészelte %k láncfűrésze.,%o è stato falciato dalla motosega di %k.,%o は %k のチェーンソーで刈り取られた。,%o 은(는) %k 의 전기톱에 갈렸다.,%o werd gemaaid met %k's kettingzaag.,%o ble klippet over av %ks motorsag.,%o został@[ao_pl] skoszon@[adj_pl] przez piłę łańcuchową %k.,%k fez picadinho de %o com sua motoserra.,,%o a fost tăiat de drujba lui %k.,Игрока %o разрезал бензопилой игрок %k.,%o је исечен@[adj_1_sr] моторном тестером играча %k.,%o blev överkörd av %ks motorsåg.,"%o, %k tarafından biçildi",%k розпили@[adj_1_ua] %o бензопилою. +%o was tickled by %k's pea shooter.,OB_MPPISTOL,,,,%o byl@[ao_cs] polechtán@[ao_cs] pistolkou hráče %k.,%o blev kildet af %ks ærteskytte.,%o wurde von %ks Erbsenpistole gekitzelt.,@[art_gr] %o γαργαλίθηκε απο το οπλάκι του/της %k.,%o estis tiklita de la pistolo de %k.,A %o le ha hecho cosquillas la pistola de %k.,A %o le hizo cosquillas la pistola de %k.,%o kutitti %o parkaa hernepyssyllään.,%o a été châtouillé@[e_fr] par le pistolet de %k.,,%o meg lett csiklandozva %k játékpisztolyával.,%o è stato sforacchiato dalla pistola di %k'.,%o は %k の豆鉄砲でくすぐられた。,%o 은(는) %k 의 권총에 간지럼을 탔다.,%o werd gekieteld door %k's erwtenschutter.,%o ble kilt av %ks ertebøsse.,%o został@[ao_pl] połaskotan@[adj_pl] przez spluwę %k.,%k fez cócegas em %o com sua pistolinha.,,%o a fost gâdilat de pistolașul lui %k.,Игрока %o защекочен вусмерть из горохострела игрока %k.,%o је заголицан@[adj_1_sr] пиштољем играча %k.,%o blev kittlad av %ks ärtskytt.,"%o, %k tarafından gıdıklandı",%o бу@[adj_1_ua] заколупан@[ao_ua] пістолетом %k. +%o chewed on %k's boomstick.,OB_MPSHOTGUN,,,,%o si pochutnal@[ao_cs] na brokádě hráče %k.,%o tyggede på %ks bommestok.,%o wurde Opfer von %ks Schrotflinte.,@[art_gr] %o έφαγε το ντουφέκι του/της %k.,%o maĉis la kartoĉan fusilon de %k.,A %o l@[ao_esp] ha agujereado la escopeta de %k.,A %o l@[ao_esp] agujereó la escopeta de %k.,%k jauhoi %o paran tussarillaan.,%o a s'est mangé@[e_fr] de la chevrotine de la part de %k.,,%o megízlelte %k villámbotját.,%o si è trovato davanti il fucile di %k.,%o は %k のブームスティックを顔面に受けた。,%o 은(는) %k 의 붐스틱에 꽂혔다.,%o gekauwd op %k's boomstick.,%o tygget på %ks boomstick.,%o przygryza pukawkę %k.,%k meteu chumbo em %o com sua espingarda.,,%o a mestecat pușca lui %k.,Игрока %o накормил дробью игрок %k.,%o је сажвака@[ao_1_sr] на пумпарицу играча %k.,%o tuggade på %ks bomstock.,"%o, %k tarafından patlatıldı",%k насипа@[adj_1_ua] свинцевого гороху %o. +%o was splattered by %k's super shotgun.,OB_MPSSHOTGUN,,,,%o byl@[ao_cs] rozplesknut@[ao_cs] na kaši superbrokovnicí hráče %k.,%o blev sprøjtet af %ks super haglgevær.,%o wurde von %ks Super-Schrotflinte zerfetzt.,@[art_gr] %o διαλύθηκε απο το διπλό ντουφέκι του/της %k,%o estis disŝprucigita de la dutuba fusilo de %k.,A %o l@[ao_esp] reventado la superescopeta de %k.,A %o l@[ao_esp] reventó la superescopeta de %k.,%k roiski %o paran yltympäriinsä superhaulikollaan.,%o s'est fait@[e_fr] gicler par le fusil de chasse de %k.,,%o-t cafatokra tépte %k szupersörétese.,%o è stato smembrato dalla doppietta di %k.,%o は %k のスーパーショットガンでバラバラにされた。,%o 은(는) %k 의 슈퍼 샷건에 의해 터졌다.,%o werd gespat door %k's super jachtgeweer.,%o ble skutt med %ks super-haglgevær.,%o został@[ao_pl] rozpryskan@[adj_pl] przez super strzelbę %k.,%k estraçalhou %o com sua espingarda de cano duplo.,,%o a fost împroșcat de super pușca lui %k.,Игрока %o размазал из супердробовика игрок %k.,Играча %o је спљоштила двоцевка играча %k.,%o blev besprutat av %ks super-hagelgevär.,"%o, %k tarafından sıçratıldı",%k розмаза@[adj_1_ua] з двустволки %o. +%o was mowed down by %k's chaingun.,OB_MPCHAINGUN,,,,%o byl@[ao_cs] prostřílen@[ao_cs] kulometem hráče %k.,%o blev mejet ned af %ks maskingevær.,%o wurde von %ks Maschinengewehr niedergemäht.,@[art_gr] %o κοματίαστηκε απο το πολυβόλο του/της %k.,%o estis kuglo-plenigita de la maŝinpafilo de %k.,A %o l@[ao_esp] ha dejado hecho colador la ametralladora de %k.,A %o l@[ao_esp] dejó hecho colador la ametralladora de %k.,%k niitti %o paran konekiväärillään.,%o a été ventilé@[e_fr] par la mitrailleuse de %k.,,%k gépágyúval szétszaggatta %o testét.,%o è stato falciato dal mitragliatore di %k.,%o は %k のチェーンガンで蜂の巣にされた。,%o 은(는) %k 의 체인건에 의해 으깨졌다.,%o werd gemaaid met %k's machinegeweer.,%o ble meiet ned av %ks maskinpistol.,%o został@[ao_pl] skoszon@[adj_pl] przez karabin maszynowy %k.,%k massacrou %o com sua metralhadora.,,%o a fost secerat de mitraliera rotativă a lui %k.,Игрок %o скошен из пулемёта игрока %k.,%o је покоси@[ao_1_sr] митраљез играча %k.,%o blev nedklippt av %ks kedjepistol.,"%o, %k tarafından biçildi",%k скоси@[adj_1_ua] кулеметом %o. +%o rode %k's rocket.,OB_MPROCKET,,,,%o se projel@[ao_cs] na raketě hráče %k.,%o red på %ks raket.,%o ritt auf %ks Rakete.,@[art_gr] %o καβάλησε τον πύραυλο του/της %k.,%o rajdis la raketon de %k.,%o ha montado el misil de %k.,%o montó el misil de %k.,%o ratsasti pelaajan %k raketilla.,%o a chevauché la roquette de %k.,,%o meglovagolta %k rakétáját.,%o ha cavalcato il razzo di %k.,%o は %k のロケットに乗ってしまった。,%o 은(는) %k 의 로켓을 탔다.,%o reed op %k's raket.,%o red på %ks rakett.,%o ujeżdżał@[ao_pl] rakietę %k.,%o não viu o foguete de %k.,%o não viu o míssil de %k.,%o a călărit racheta lui %k.,Игрок %o прокатился на ракете игрока %k.,%o је ујаха@[ao_1_sr] ракету играча %k.,%o åkte på %ks raket.,"%o, %k tarafından sıçratıldı",%o проїха@[adj_2_ua] на ракеті %k. +%o almost dodged %k's rocket.,OB_MPR_SPLASH,,,,%o se skoro vyhnul@[ao_cs] raketě hráče %k.,%o undgik næsten %ks raket.,"%o schaffte es fast, %ks Rakete auszuweichen.",@[art_gr] %o σχεδόν απόφηγε τον πύραυλο του/της %k.,%o preskaŭ evitis la raketon de %k.,%o casi esquiva el misil de %k.,,%o melkein väisti pelaajan %k raketin.,%o a presque esquivé la roquette de %k.,,%o majdnem kitért %k rakétája elől.,%o aveva quasi schivato il razzo di %k.,%o は %k のロケットをあと少しで避けられそうだった。,%o 은(는) %k 의 로켓 폭발을 거의 피했다.,%o ontweek bijna %k's raket.,%o unngikk nesten %ks rakett.,%o prawie unika rakiety %k.,%o quase escapou do foguete de %k.,%o quase escapou do míssil de %k.,%o aproape a evitat racheta lui %k.,Игрок %o почти увернулся от ракеты %k.,%o је за длаку избега@[ao_1_sr] ракету играча %k.,%o undvek nästan %ks raket.,"%o, %k tarafından sıçratıldı",%o майже укникну@[adj_1_ua] ракети %k. +%o was melted by %k's plasma gun.,OB_MPPLASMARIFLE,,,,%o se roztekl@[ao_cs] plazmapuškou hráče %k.,%o blev smeltet af %ks plasma riffel.,%o wurde von %ks Plasmagewehr geschmolzen.,@[art_gr] %o λίοθηκε απο το πλάσμα όπλο του/της %k.,%o estis fandigita de la plasmo-pafilo de %k.,A %o l@[ao_esp] ha derretido el fusil de plasma de %k.,A %o l@[ao_esp] derritió el fusil de plasma de %k.,%k sulatti %o paran plasmapyssyllään.,%o a été réduit@[e_fr] en bouillie par le fusil a plasma de %k.,,%k plazmafegyverével megolvaszotta %o testét.,%o è stato fuso dal fucile al plasma di %k.,%o は %k のプラズマガンに溶かされた。,%o 은(는) %k 의 플라즈마 건에 의해 융해되었다.,%o was gesmolten door %k's plasmageweer.,%o ble smeltet av %ks plasmakanon.,%o został@[ao_pl] stopion@[adj_pl] przez pistolet plasmowy %k.,%k torrou %o com seu fuzil de plasma.,%o foi torrad@[ao_ptb] pela pistola de plasma de %k.,%o a fost topit de pușca cu plasmă a lui %k.,Игрока %o расплавил из плазмомёта игрок %k.,%o је отопљен@[adj_1_sr] плазма оружјем играча %k.,%o smältes av %ks plasmagevär.,"%o, %k tarafından eritildi",%k розплавив з плазмагана %o. +%o was splintered by %k's BFG.,OB_MPBFG_BOOM,,,,%o byl@[ao_cs] rozštěpen@[ao_cs] BFGčkem hráče %k.,%o blev splintret af %ks BFG.,%o wurde von %ks BFG in Stücke gerissen.,@[art_gr] %o κοματιάστηκε απο το BFG του/της %k.,%o estis splitigita de la BFG de %k.,A %o l@[ao_esp] ha astillado la BFG de %k.,A %o l@[ao_esp] astilló la BFG de %k.,%k pirstoi %o paran BFG:llään.,%o a été oblitéré@[e_fr] par le BFG de %k.,,%o teste atomjaira szakadt %k BFG-jétől.,%o è stato sminuzzato dal BFG di %k.,%o は %k のBFGで木っ端微塵にされた。,%o 은(는) %k 의 BFG덕에 산산조각 났다.,%o was versplinterd door %k's BFG.,%o ble splintret av %ks BFG.,%o został@[ao_pl] rozpryskan@[adj_pl] przez BFG %k.,%k vaporizou %o com sua BFG.,,%o a fost despicat de către BFG-ul lui %k.,Игрока %o порвал на осколки выстрел из BFG игрока %k.,%o је расцепан@[adj_1_sr] ВЈП играча %k.,%o splittrades av %ks BFG.,"%o, %k tarafından parçalandı",%o розірвало снарядом БФГ %k. +%o couldn't hide from %k's BFG.,OB_MPBFG_SPLASH,,,,%o se nemohl@[ao_cs] ukrýt před BFGčkem hráče %k.,%o kunne ikke gemme sig for %ks BFG.,%o konnte sich nicht vor %ks BFG verstecken.,@[art_gr] %o δέν μπόρεσε να κρυφτέι απο το BFG του/της %k.,%o ne povis kaŝi sin de la BFG de %k.,%o no ha conseguido esconderse de la BFG de %k.,%o no logró esconderse de la BFG de %k.,%o ei kyennyt piiloutumaan pelaajan %k BFG:ltä.,%o n a pas pu se couvrir du BFG de %k.,,%o nem tudott elmenekülni %k BFG-je elől.,%o non poteva nascondersi dal BFG di %k.,%o は %k のBFGから隠れることはできなかった。,%o 은(는) %k 의 BFG의 일격으로부터 피할 수 없었다.,%o kon zich niet verbergen voor %k's BFG.,%o kunne ikke gjemme seg for %ks BFG.,%o nie może się schować przed BFG %k.,%o não conseguiu se esconder da BFG de %k,,%o nu s-a putut ascunde de BFG-ul lui %k.,Игрок %o не успел спрятаться от BFG игрока %k.,%o се није мог@[ao_2_sr] сакрити од ВЈП играча %k.,%o kunde inte gömma sig för %ks BFG.,"%o, %k tarafından parçalandı",%o не встиг@[adj_3_ua] сховатись від БФГ %k. +%o was railed by %k.,OB_RAILGUN,,,,%o byl@[ao_cs] napíchnut@[ao_cs] hráčem %k.,%o blev skudt af %k.,%o stand in %ks Schusslinie.,@[art_gr] %o καρφόθηκε απο τον/την %k.,%o estis traborita de la elektropafilo de %k.,A %o l@[ao_esp] ha agujereado el cañón de riel de %k.,A %o l@[ao_esp] agujereó el cañón de riel de %k.,%o lävisti %o paran.,%o a été aligné@[e_fr] par %k.,,%o beleállt %k lézerébe.,%o è stato bucherellato dal railgun di %k.,%o は %k のレールガンで死亡した。,%o 은(는) %k 의 레일건에 관통당했다.,%o werd gespaakt door %k.,%o ble skutt av %k.,%o stał@[ao_pl] na linii ognia %k.,%k acertou %o com seu canhão elétrico.,,%o a fost ocărit de %k.,Игрока %o пробил насквозь игрок %k.,%o је убијен@[adj_1_sr] од играча %k.,%o blev fördärvad av %k.,%o %k tarafından kovuldu.,%k прониза@[adj_1_ua] %o наскрізь. +%o was burned by %k's BFG.,OB_MPBFG_MBF,,,,%o shořel@[ao_cs] BFGčkem hráče %k.,%o blev brændt af %ks BFG.,%o wurde von %ks BFG verbrannt.,@[art_gr] %o κάικε απο το BFG του/της %k.,%o estis bruligita de la BFG de %k.,A %o l@[ao_esp] ha calcinado la BFG de %k.,A %o l@[ao_esp] calcinó la BFG de %k.,%k korvensi %o paran BFG:llään.,%o a été irradié@[e_fr] par le BFG de %k.,,%k hamuvá égette %o testét BFG-vel.,%o è stato bruciato dal BFG di %k.,%o は %k のBFGで焼き殺された。,%o 은(는) %k 의 BFG에 의해 타올랐다.,%o werd verbrand door %k's BFG.,%o ble brent av %ks BFG.,%o został@[ao_pl] spalon@[adj_pl] przez BFG %k.,%k cozinhou %o com sua BFG.,,%o a fost ars de BFG-ul lui %k.,Игрока %o сжёг из BFG игрок %k.,%o је изгоре@[ao_1_sr] од ВЈП играча %k.,%o blev bränd av %ks BFG.,%o %k tarafından yakıldı,%o спалило БФГ %k. +,,Heretic,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Pickup ,,,,,,,,,,,,,,,,,,,,,,,,,,, +Blue Key,TXT_GOTBLUEKEY,,,,Modrý klíč,Blå nøgle,Blauer Schlüssel,Μπλέ Κλειδί,Blua Ŝlosilo,Llave Azul,,Sininen avain,Clé Bleue,,Kék kulcs,Chiave blu,青の鍵,청색 열쇠,Blauwe sleutel,Blå nøkkel,Niebieski klucz,Chave Azul,,Cheie Albastră,Синий ключ,Плави кључ,Blå nyckel,Mavi Anahtar,Синій ключ +Yellow Key,TXT_GOTYELLOWKEY,,,,Žlutý klíč,Gul nøgle,Gelber Schlüssel,Κύτρινο Κλειδί,Flava Ŝlosilo,Llave Amarilla,,Keltainen avain,Clé Jaune,,Sárga kulcs,Chiave gialla,黄の鍵,황색 열쇠,Gele sleutel,Gul nøkkel,Żółty klucz,Chave Amarela,,Cheie Galbenă,Жёлтый ключ,Жути кључ,Gul nyckel,Sarı Anahtar,Жовтий ключ +Green Key,TXT_GOTGREENKEY,,,,Zelený klíč,Grøn nøgle,Grüner Schlüssel,Πράσινο Κλειδί,Verda Ŝlosilo,Llave Verde,,Vihreä avain,Clé Verte,,Zöld kulcs,Chiave verde,緑の鍵,녹색 열쇠,Groene sleutel,Grønn nøkkel,Zielony klucz,Chave Verde,,Cheie Verde,Зелёный ключ,Зелени кључ,Grön nyckel,Yeşil Anahtar,Зелений ключ +Quartz Flask,TXT_ARTIHEALTH,,,,Blyštivá baňka,Kvartsflaske,Quarzflasche,Φλάσκα Χαλαζίας,Kvarca Flakono,Frasco de Cuarzo,,Kvartsipullo,Flasque en Quartz,,Kvarc flaska,Ampolla di quarzo,石英フラスコ,석영 플라스크,Kwartskolf,Kvartskolbe,Kwarcowa Butelka,Frasco de Quartzo,,Flacon de Quartz,Кварцевый флакон,Кварцна боца,Kvartsflaska,Kuvars Şişesi,Кварцова пляшечка +Wings of Wrath,TXT_ARTIFLY,,,,Křídla hněvu,Vredens vinger,Flügel des Zorns,Φτερά της Οργής,Flugiloj de Kolero,Alas de Ira,,Kiihtymyksen siivet,Ailes du Courroux,,A Harag Szárnyai,Ali iraconde,レイスの翼,분노의 날개,Vleugels der Toorn,Vredens vinger,Skrzydła Gniewu,Asas da Ira,,Aripile Furiei,Крылья гнева,Крила гнева,Vridsvingar,Gazap Kanatları,Крила гніву +Ring of Invincibility,TXT_ARTIINVULNERABILITY,,,,Prsten nesmrtelnosti,Ring af uovervindelighed,Ring der Unverwundbarkeit,Δαχτυλίδι της Αθανασίας,Ringo de Nevenkebleco,Anillo de Invencibilidad,,Näkymättömyyden sormus,Anneau d'Invincibilité,,A Sérthetetlenség Gyűrűje,Anello dell'invincibilità,不死の指輪,불멸의 반지,Ring van Onoverwinnelijkheid,Uovervinnelighetens ring,Pierścień Niewrażliwości,Anel da Invencibilidade,,Inelul Invincibilității,Кольцо неуязвимости,Прстен непобедивости,Ring av oövervinnlighet,Yenilmezlik Yüzüğü,Кільце Непереможності +Tome of Power,TXT_ARTITOMEOFPOWER,,,,Kniha moci,Bog om magt,Buch der Macht,Τομός της Δύναμης,Librego de Forto,Tomo de Poder,,Väkevyyden kirja,Livre du Pouvoir,,Az Erő Kódexe,Tomo del potere,力の術書,힘의 서,Boek van de Macht,Maktens bok,Tom Mocy,Livro do Poder,Livro do Poder,Cartea Puterii,Том могущества,Том моћи,Maktens tome,Güç Kitabı,Том сили +Shadowsphere,TXT_ARTIINVISIBILITY,,,,Šerosféra,Skyggesfære,Schattensphäre,Σκιόσφαιρα,Ombrosfero,Esfera de Sombra,,Varjokehrä,Sphère des Ombres,,Árnygömb,Sfera dell'ombra,闇の球体,그림자 구체,Schaduwbol,Skyggesfære,Sfera Cieni,Esfera das Sombras,,Sfera Umbrei,Теневая сфера,Сфера сенки,Skuggsfär,Gölge Küre,Сфера тіні +Morph Ovum,TXT_ARTIEGG,,,,Měnivejce,,Transformations-Ei,Μετασχηματίζοντικο Ωάριο,Ovo de Transformado,Huevo de Transformación,,Muodonmuutoksen muna,Ovule de Métamorphose,,Alakváltó tojás,Uovo della metamorfosi,変貌の卵子,변신 알,Morfose-Ei,,Jajko Morfujące,Ovo da Metamorfose,,Oul Metamorfozei,Яйцо превращения,Преображавајуће јајашце,,Dönüşümlü Yumurta,Яйце трансформації +Mystic Urn,TXT_ARTISUPERHEALTH,,,,Tajemná urna,Mystisk urne,Mystische Urne,Μυστικό Δοχείο,Mistika Urno,Urna Mística,,Mystinen uurna,Urne Mystique,,Misztikus urna,Urna mistica,神秘の骨壷,신비한 항아리,Mystieke Urn,Mystisk urne,Mistyczna Urna,Urna Mística,,Urnă Mistică,Мистическая урна,Мистериозна урна,Mystisk urna,Mistik Urn,Містична урна +Torch,TXT_ARTITORCH,,,,Pochodeň,Fakkel,Fackel,Πυρσός,Torĉo,Antorcha,,Soihtu,Torche,,Fáklya,Torcia,松明,횃불,Fakkel,Fakkel,Pochodnia,Tocha,,Torță,Факел,Бакља,Fackel,Meşale,Смолоскип +Time Bomb of the Ancients,TXT_ARTIFIREBOMB,,,,Časovaná bomba starověku,De ældres tidsbombe,Zeitbombe der Alten,Χρονοβόμβα τον Αρχαίων,Tempobombo de la Antikvuloj,Bomba de tiempo de los Ancestros,,Vanhain aikapommi,Bombe a Retardement des Anciens,,Az Ősök Időbombája,Bomba a tempo degli antichi,古代の時限爆薬,고대의 시한폭탄,Tijdbom der Tijden,De eldgamles tidsinnstilte bombe,Starożytna Bomba Czasu,Bomba-relógio dos Anciãos,,Bomba cu Ceas a Anticilor,Часовая бомба древних,Временска бомба древних,De gamlas tidsbomb,Kadimlerin Saatli Bombası,Часова бомба древніх +Chaos Device,TXT_ARTITELEPORT,,,,Zmatkostroj,Chaos-enhed,Chaosgerät,Συσκευή του Χάος,Ĥaos-Aparato,Dispositivo del Caos,,Kaaoskoje,Outil du Chaos,,Káoszszerkezet,"Dispositivo del Caos ",カオスデバイス,혼돈의 장치,Chaosapparaat,Kaosinnretning,Urządzenie Chaosu,Dispositivo do Caos,,Dispozitiv al Haosolui,Механизм хаоса,Уређај хаоса,Chaos-enhet,Kaos Cihazı,Пристрій Хаосу -Crystal Vial,TXT_ITEMHEALTH,,,,Křišťálový flakón,Krystalflaske,Kristallfläschchen,Κρυσταλλικό Φιάλιδο,Fiolo de Kristalo,Tubo de Cristal,,Kristallipullo,Fiole de Cristal,Kristályampulla,Fiala di cristallo,水晶瓶,수정 약병,Kristallen Flesje,Krystallflaske,Kryształowa Fiolka,Ampola de Cristal,,Fiolă de Cristal,Кристальный флакон,Кристална бочица,Kristallflaska,Kristal Şişe,Кришталевий флакон -Bag of Holding,TXT_ITEMBAGOFHOLDING,,,,Tlumok,Pose med opbevaringspose,Rucksack,Τσάντα Κρατησης,Taŝo de Tenado,Bolso sin Fondo,,Säilön laukku,Sac sans Fond,A Birtoklás Batyuja,Borsa Portaoggetti,持ち物袋,보관용 가방,Rugzak,Posen som holder,Plecak,Bolsa de Utensílios,,Poșetă,Носильный кошель,Торба носивости,Väska med behållare,Holding Çantası,Запасний підсумок -Silver Shield,TXT_ITEMSHIELD1,,,,Stříbrný štít,Sølvskjold,Silberner Schild,Ασημένια Ασπίδα,Arĝenta Ŝildo,Escudo Plateado,,Hopeakilpi,Bouclier d'Argent,Ezüst Pajzs,Scudo d'argento,銀の盾,은 방패,Zilveren Schild,Sølvskjold,Srebrna Tarcza,Escudo de Prata,,Scut de Argint,Серебряный щит,Сребрни штит,Silversköld,Gümüş Kalkan,Срібний щит -Enchanted Shield,TXT_ITEMSHIELD2,,,,Kouzelný štít,Fortryllet skjold,Verzauberter Schild,,Sorĉita Ŝildo,Escudo Encantado,,Lumottu kilpi,Bouclier Enchanté,Bűvös Pajzs,Scudo incantato,魔法の盾,마력 강화 방패,Betoverd schild,Fortryllet skjold,Zaklęta Tarcza,Escudo Encantado,,Scut Mistificat,Зачарованный щит,Зачарани штит,Förtrollad sköld,Büyülü Kalkan,Зачарований щит -Map Scroll,TXT_ITEMSUPERMAP,,,,Mapa,Kortrulle,Kartenrolle,,Map-volvolibro,Mapa en Pergamino,,Karttakäärö,Rouleau du Cartographe,Térkép Tekercs,Pergamena della Mappa,地図の巻物,두루마리 지도,Kaartrol,Kartrulle,Zwój Mapy,Pergaminho do Mapa,,Hartă Pergament,Свиток карты,Мапа,Kartrulle,Harita Kaydırma,Сувій-карта -Wand Crystal,TXT_AMMOGOLDWAND1,,,,Zlaté krystaly,Stav krystal,Zauberstabkristall,,Kristalo de Sorĉbastono,Cristal para Vara,,Sauvakristalli,Cristal Elfique,Kristálypor,Bacchetta di cristallo,ワンドクリスタル,지팡이 결정,Toverstok van Kristal,Tryllestav-krystall,Kryształ do Różdżki,Cristal para o Cetro,,Cristal pentru Toiag,Кристалл эльфийского жезла,Кристали за штап,Stavkristall,Değnek Kristali,Кристал для жезлу -Crystal Geode,TXT_AMMOGOLDWAND2,,,,Shluk krystalů,Krystal-geode,Kristallklumpen,,Kristalgeodo,Geoda de Cristal,,Kristalligeoidi,Géode de Cristal,Kristály Geoda,Geode di cristallo,晶洞石,결정 원석,Kristal Geode,Krystallgeode,Kryształowa Geoda,Geodo de Cristal,,Geodă de Cristal,Жеода кристалла,Кристални камен,Kristallgeod,Kristal Jeot,Кристалічна жеода -Mace Spheres,TXT_AMMOMACE1,,,,Žezlometné koule,Kølle kugler,Keulenkugeln,,Klabsferoj,Esferas de Maza,,Nuijakuulia,Sphère de Masse,Jogargömbök,Sfere per la mazza,メイス球弾,철퇴 포탄,Strijdknotsen,Mace-kuler,Kule do Buzdyganu,Esferas para Clava,,Sfere pentru Buzdugan,Сферы булавы,Сфере за буздован,Eldstötsfärer,Ateş Küreleri,Сфери для булави -Pile of Mace Spheres,TXT_AMMOMACE2,,,,Hromada žezlometných koulí,Bunke af kølle kugler,Haufen von Keulenkugeln,,Stako de Klabsferoj,Pila de Esferas de Maza,,Nuijakuulakasa,Pile de Sphères de Masse,Egy rakás jogargömb,Pila di sfere per la mazza,メイス球弾の固まり,철퇴 포탄 무더기,Stapel Strijdknotsen,Haug med muskettkuler,Sterta Kul do Buzdyganu,Pilha de Esferas para Clava,,Grămadă de Sfere pentru Buzdugan,Груда сфер булавы,Гомила сфера за буздован,Hög med Eldstötsfärer,Ateş Küreleri Yığını,Купа булавних сфер -Ethereal Arrows,TXT_AMMOCROSSBOW1,,,,Éterické šípy,Æteriske pile,Ätherische Pfeile,,Eteraj Sagoj,Flechas Etéreas,,Eetterinuolia,Carreaux Ethériques,Éteri nyílvesszők,Frecce eteree,イセリアルの矢,유체 화살,Etherische Pijlen,Eteriske piler,Eteryczne Strzały,Flechas Etéreas,,Săgeți Celeste,Эфирные стрелы,Етеричне стреле,Eteriska pilar,Eterik Oklar,Ефірні стріли -Quiver of Ethereal Arrows,TXT_AMMOCROSSBOW2,,,,Toulec éterických šípů,Kogger af æteriske pile,Köcher mit ätherischen Pfeilen,,Sagujo da Eteraj Sagoj,Carcaj de Flechas Etéreas,Carcaza de Flechas Etéreas,Eetterinuoliviini,Carquois de Carreaux Ethériques,Éteri nyíltok,Faretra di frecce eteree,イセリアルの矢筒,유체 화살집,Koker van Etherische Pijlen,Kogger av eteriske piler,Kołczan Eterycznych Strzał,Aljava de Flechas Etéreas,,Tolbă de Săgeți Celeste,Колчан эфирных стрел,Тоболац етеричних стрела,Kvant av eteriska pilar,Eterik Okların Sadağı,Сагайдак ефірних стріл -Claw Orb,TXT_AMMOBLASTER1,,,,Pazouří střela,Klovkugle,Klauenball,,Kriforbo,Orbe de Garra,,Kynsikehrä,Orbe de Griffe,Karomgömb,Sfera d'artiglio,クローオーブ,발톱 보주,Klauwbal,Klo-kule,Kula do Pazura,Orbe para Garra,Esfera para Garra,Glob pentru Gheară,Когтевой шар,Канџаста сфера,Klorör klot,Pençe Küresi,Кігтьова сфера -Energy Orb,TXT_AMMOBLASTER2,,,,Silová střela,Energikugle,Energieball,,Energiorbo,Orbe de Energía,,Energiakehrä,Orbe Draconique,Energiagömb,Sfera di energia,エネルギーオーブ,기력의 보주,Energiebal,Energikule,Kula Energii,Orbe de Energia,Esfera de Energia,Glob de Energie,Энергетический шар,Енергетска сфера,Energikulor,Enerji Küresi,Енергетична сфера -Lesser Runes,TXT_AMMOSKULLROD1,,,,Menší runy,Mindre runer,Kleine Runen,,Runetoj,Runas Menores,,Vähäriimut,Runes Mineurs,Gyenge rúnák,Rune inferiori,レッサールーン,룬 조각,Lichte Runen,Mindre runer,Gorsze Runy,Runas Inferiores,,Rune Mici,Младшие руны,Нижа руна,Mindre runor,Küçük Rünler,Молодші руни -Greater Runes,TXT_AMMOSKULLROD2,,,,Větší runy,Større runer,Große Runen,,Runegoj,Runas Mayores,,Isoriimut,Runes Supérieures,Erős rúnák,Rune superiori,グレータールーン,최상급 룬,Zware Runen,Store runer,Lepsze Runy,Runas Superiores,,Rune Mari,Старшие руны,Већа руна,Större runor,Büyük Rünler,Старші руни -Flame Orb,TXT_AMMOPHOENIXROD1,,,,Plamenný náboj,Flamme kugle,Flammenkugel,,Flamorbo,Orbe de Flama,,Liekkikehrä,Orbe de Flammes,Tűzgömb,Sfera di fuoco,フレイムオーブ,화염 구슬,Vuurbal,Flammekule,Kula Ognia,Orbe de Chamas,Esfera de Chamas,Glob de Foc,Пламенный шар,Ватрена сфера,Flamkula,Alev Küresi,Вогняна сфера -Inferno Orb,TXT_AMMOPHOENIXROD2,,,,Pekelný náboj,Inferno-kugle,Infernokugel,,Brulorbo,Orbe de Averno,,Infernokehrä,Orbe Infernal,Pokolgömb,Sfera infernale,インフェルノオーブ,지옥불 구슬,Infernobal,Inferno-kule,Kula Piekielna,Orbe Infernal,Esfera Infernal,Glob Infernal,Инфернальный шар,Пламена сфера,Infernokula,Cehennem Küresi,Пекельна сфера -Gold Wand,TXT_WPNGOLDWAND,,,,Zlatá hůl,Guldstav,Goldener Zauberstab,,Ora Sorĉbastono,Vara Dorada,,Kultasauva,Baguette Elfique,Aranypálca,Bacchetta d'oro,ゴールドワンド,황금 지팡이,Gouden Toverstok,Gullstav,Złota Różdżka,Varinha de Ouro,,Toiag cu Aur,Эльфийский жезл,Златни магични штап,Guldstav,Altın Değnek,Посох Ельфів -Firemace,TXT_WPNMACE,,,,Žezlomet,Ildspyd,Feuerkeule,,Fajroklabo,Maza de Fuego,,Tulinuija,Masse de Feu,Tűzbuzogány,"Mazza di fuoco +Crystal Vial,TXT_ITEMHEALTH,,,,Křišťálový flakón,Krystalflaske,Kristallfläschchen,Κρυσταλλικό Φιάλιδο,Fiolo de Kristalo,Tubo de Cristal,,Kristallipullo,Fiole de Cristal,,Kristályampulla,Fiala di cristallo,水晶瓶,수정 약병,Kristallen Flesje,Krystallflaske,Kryształowa Fiolka,Ampola de Cristal,,Fiolă de Cristal,Кристальный флакон,Кристална бочица,Kristallflaska,Kristal Şişe,Кришталевий флакон +Bag of Holding,TXT_ITEMBAGOFHOLDING,,,,Tlumok,Pose med opbevaringspose,Rucksack,Τσάντα Κρατησης,Taŝo de Tenado,Bolso sin Fondo,,Säilön laukku,Sac sans Fond,,A Birtoklás Batyuja,Borsa Portaoggetti,持ち物袋,보관용 가방,Rugzak,Posen som holder,Plecak,Bolsa de Utensílios,,Poșetă,Носильный кошель,Торба носивости,Väska med behållare,Holding Çantası,Запасний підсумок +Silver Shield,TXT_ITEMSHIELD1,,,,Stříbrný štít,Sølvskjold,Silberner Schild,Ασημένια Ασπίδα,Arĝenta Ŝildo,Escudo Plateado,,Hopeakilpi,Bouclier d'Argent,,Ezüst Pajzs,Scudo d'argento,銀の盾,은 방패,Zilveren Schild,Sølvskjold,Srebrna Tarcza,Escudo de Prata,,Scut de Argint,Серебряный щит,Сребрни штит,Silversköld,Gümüş Kalkan,Срібний щит +Enchanted Shield,TXT_ITEMSHIELD2,,,,Kouzelný štít,Fortryllet skjold,Verzauberter Schild,,Sorĉita Ŝildo,Escudo Encantado,,Lumottu kilpi,Bouclier Enchanté,,Bűvös Pajzs,Scudo incantato,魔法の盾,마력 강화 방패,Betoverd schild,Fortryllet skjold,Zaklęta Tarcza,Escudo Encantado,,Scut Mistificat,Зачарованный щит,Зачарани штит,Förtrollad sköld,Büyülü Kalkan,Зачарований щит +Map Scroll,TXT_ITEMSUPERMAP,,,,Mapa,Kortrulle,Kartenrolle,,Map-volvolibro,Mapa en Pergamino,,Karttakäärö,Rouleau du Cartographe,,Térkép Tekercs,Pergamena della Mappa,地図の巻物,두루마리 지도,Kaartrol,Kartrulle,Zwój Mapy,Pergaminho do Mapa,,Hartă Pergament,Свиток карты,Мапа,Kartrulle,Harita Kaydırma,Сувій-карта +Wand Crystal,TXT_AMMOGOLDWAND1,,,,Zlaté krystaly,Stav krystal,Zauberstabkristall,,Kristalo de Sorĉbastono,Cristal para Vara,,Sauvakristalli,Cristal Elfique,,Kristálypor,Bacchetta di cristallo,ワンドクリスタル,지팡이 결정,Toverstok van Kristal,Tryllestav-krystall,Kryształ do Różdżki,Cristal para o Cetro,,Cristal pentru Toiag,Кристалл эльфийского жезла,Кристали за штап,Stavkristall,Değnek Kristali,Кристал для жезлу +Crystal Geode,TXT_AMMOGOLDWAND2,,,,Shluk krystalů,Krystal-geode,Kristallklumpen,,Kristalgeodo,Geoda de Cristal,,Kristalligeoidi,Géode de Cristal,,Kristály Geoda,Geode di cristallo,晶洞石,결정 원석,Kristal Geode,Krystallgeode,Kryształowa Geoda,Geodo de Cristal,,Geodă de Cristal,Жеода кристалла,Кристални камен,Kristallgeod,Kristal Jeot,Кристалічна жеода +Mace Spheres,TXT_AMMOMACE1,,,,Žezlometné koule,Kølle kugler,Keulenkugeln,,Klabsferoj,Esferas de Maza,,Nuijakuulia,Sphère de Masse,,Jogargömbök,Sfere per la mazza,メイス球弾,철퇴 포탄,Strijdknotsen,Mace-kuler,Kule do Buzdyganu,Esferas para Clava,,Sfere pentru Buzdugan,Сферы булавы,Сфере за буздован,Eldstötsfärer,Ateş Küreleri,Сфери для булави +Pile of Mace Spheres,TXT_AMMOMACE2,,,,Hromada žezlometných koulí,Bunke af kølle kugler,Haufen von Keulenkugeln,,Stako de Klabsferoj,Pila de Esferas de Maza,,Nuijakuulakasa,Pile de Sphères de Masse,,Egy rakás jogargömb,Pila di sfere per la mazza,メイス球弾の固まり,철퇴 포탄 무더기,Stapel Strijdknotsen,Haug med muskettkuler,Sterta Kul do Buzdyganu,Pilha de Esferas para Clava,,Grămadă de Sfere pentru Buzdugan,Груда сфер булавы,Гомила сфера за буздован,Hög med Eldstötsfärer,Ateş Küreleri Yığını,Купа булавних сфер +Ethereal Arrows,TXT_AMMOCROSSBOW1,,,,Éterické šípy,Æteriske pile,Ätherische Pfeile,,Eteraj Sagoj,Flechas Etéreas,,Eetterinuolia,Carreaux Ethériques,,Éteri nyílvesszők,Frecce eteree,イセリアルの矢,유체 화살,Etherische Pijlen,Eteriske piler,Eteryczne Strzały,Flechas Etéreas,,Săgeți Celeste,Эфирные стрелы,Етеричне стреле,Eteriska pilar,Eterik Oklar,Ефірні стріли +Quiver of Ethereal Arrows,TXT_AMMOCROSSBOW2,,,,Toulec éterických šípů,Kogger af æteriske pile,Köcher mit ätherischen Pfeilen,,Sagujo da Eteraj Sagoj,Carcaj de Flechas Etéreas,Carcaza de Flechas Etéreas,Eetterinuoliviini,Carquois de Carreaux Ethériques,,Éteri nyíltok,Faretra di frecce eteree,イセリアルの矢筒,유체 화살집,Koker van Etherische Pijlen,Kogger av eteriske piler,Kołczan Eterycznych Strzał,Aljava de Flechas Etéreas,,Tolbă de Săgeți Celeste,Колчан эфирных стрел,Тоболац етеричних стрела,Kvant av eteriska pilar,Eterik Okların Sadağı,Сагайдак ефірних стріл +Claw Orb,TXT_AMMOBLASTER1,,,,Pazouří střela,Klovkugle,Klauenball,,Kriforbo,Orbe de Garra,,Kynsikehrä,Orbe de Griffe,,Karomgömb,Sfera d'artiglio,クローオーブ,발톱 보주,Klauwbal,Klo-kule,Kula do Pazura,Orbe para Garra,Esfera para Garra,Glob pentru Gheară,Когтевой шар,Канџаста сфера,Klorör klot,Pençe Küresi,Кігтьова сфера +Energy Orb,TXT_AMMOBLASTER2,,,,Silová střela,Energikugle,Energieball,,Energiorbo,Orbe de Energía,,Energiakehrä,Orbe Draconique,,Energiagömb,Sfera di energia,エネルギーオーブ,기력의 보주,Energiebal,Energikule,Kula Energii,Orbe de Energia,Esfera de Energia,Glob de Energie,Энергетический шар,Енергетска сфера,Energikulor,Enerji Küresi,Енергетична сфера +Lesser Runes,TXT_AMMOSKULLROD1,,,,Menší runy,Mindre runer,Kleine Runen,,Runetoj,Runas Menores,,Vähäriimut,Runes Mineurs,,Gyenge rúnák,Rune inferiori,レッサールーン,룬 조각,Lichte Runen,Mindre runer,Gorsze Runy,Runas Inferiores,,Rune Mici,Младшие руны,Нижа руна,Mindre runor,Küçük Rünler,Молодші руни +Greater Runes,TXT_AMMOSKULLROD2,,,,Větší runy,Større runer,Große Runen,,Runegoj,Runas Mayores,,Isoriimut,Runes Supérieures,,Erős rúnák,Rune superiori,グレータールーン,최상급 룬,Zware Runen,Store runer,Lepsze Runy,Runas Superiores,,Rune Mari,Старшие руны,Већа руна,Större runor,Büyük Rünler,Старші руни +Flame Orb,TXT_AMMOPHOENIXROD1,,,,Plamenný náboj,Flamme kugle,Flammenkugel,,Flamorbo,Orbe de Flama,,Liekkikehrä,Orbe de Flammes,,Tűzgömb,Sfera di fuoco,フレイムオーブ,화염 구슬,Vuurbal,Flammekule,Kula Ognia,Orbe de Chamas,Esfera de Chamas,Glob de Foc,Пламенный шар,Ватрена сфера,Flamkula,Alev Küresi,Вогняна сфера +Inferno Orb,TXT_AMMOPHOENIXROD2,,,,Pekelný náboj,Inferno-kugle,Infernokugel,,Brulorbo,Orbe de Averno,,Infernokehrä,Orbe Infernal,,Pokolgömb,Sfera infernale,インフェルノオーブ,지옥불 구슬,Infernobal,Inferno-kule,Kula Piekielna,Orbe Infernal,Esfera Infernal,Glob Infernal,Инфернальный шар,Пламена сфера,Infernokula,Cehennem Küresi,Пекельна сфера +Gold Wand,TXT_WPNGOLDWAND,,,,Zlatá hůl,Guldstav,Goldener Zauberstab,,Ora Sorĉbastono,Vara Dorada,,Kultasauva,Baguette Elfique,,Aranypálca,Bacchetta d'oro,ゴールドワンド,황금 지팡이,Gouden Toverstok,Gullstav,Złota Różdżka,Varinha de Ouro,,Toiag cu Aur,Эльфийский жезл,Златни магични штап,Guldstav,Altın Değnek,Посох Ельфів +Firemace,TXT_WPNMACE,,,,Žezlomet,Ildspyd,Feuerkeule,,Fajroklabo,Maza de Fuego,,Tulinuija,Masse de Feu,,Tűzbuzogány,"Mazza di fuoco ",ファイアメイス,투사철퇴,Vuurfoelie,Ildsted,Buzdygan Ognia,Clava de Fogo,,Buzdugan de Foc,Огненная булава,Ватрени буздован,Eldstöt,Ateş Çubuğu,Вогняна булава -Ethereal Crossbow,TXT_WPNCROSSBOW,,,,Éterická kuše,Æterisk armbrøst,Ätherische Armbrust,,Etera Arbalesto,Ballesta Etérea,,Eetterivarsijousi,Arbalète Ethérique,Éteri számszeríj,Balestra eterea,イセリアルクロスボウ,유체 쇠뇌,Etherische kruisboog,Eterisk armbrøst,Eteryczna Kusza,Besta Etérea,,Arbaletă Celestă,Эфирный арбалет,Етерични самострел,Eteriskt armborst,Eterik Arbalet,Ефірний арбалет -Dragon Claw,TXT_WPNBLASTER,,,,Drakospár,Drageklo,Drachenklaue,,Drakokrifo,Garra de Dragón,,Lohikäärmeenkynsi,Griffe Draconique,Sárkány karom,Artiglio del drago,ドラゴンクロー,용발톱,Drakenklauw,Drageklo,Smoczy Pazur,Garra de Dragão,,Gheara Dragonului,Коготь дракона,Змајева канџа,Drakklocka,Ejder Pençesi,Кіготь Дракона -Hellstaff,TXT_WPNSKULLROD,,,,Peklopal,Helvedestav,Höllenrute,,Inferbastono,Bastón Infernal,,Hornansauva,Bâton Infernal,Pokolpálca,Staffa infernale,ヘルスタッフ,지옥지팡이,Hellestaf,Helvetesstav,Piekielny Kostur,Cajado Infernal,,Baston Infernal,Посох Ада,Паклени штап,Helvetesstång,Cehennem Çubuğu,Пекельний посох -Phoenix Rod,TXT_WPNPHOENIXROD,,,,Fénixova hůl,Phønix-stang,Phönixstab,,Feniksvergo,Báculo del Fénix,,Feenikssauva,Bâton du Phénix,Főnix Rúd,Asta della fenice,フェニックスロッド,불사조 지팡이,Feniksstaf,Føniksstaven,Różdżka Feniksa,Bastão da Fênix,,Joarda Phoenix,Жезл феникса,Шипка феникса,Fenixstång,Anka Kuşu Çubuğu,Жезл Фенікса -Gauntlets of the Necromancer,TXT_WPNGAUNTLETS,,,,Nekromancerovy rukavice,Nekromantikernes handsker,Handschuhe des Zauberers,,Fergantoj de la Nekromancisto,Guanteletes del Nigromante,,Manaajan rautakintaat,Gantelets du Nécromancien,Halottidéző Páncélkesztyűi,Guanti del Negromante,ネクロマンサーの篭手,강령술사의 건틀릿,Handschoenen van de Geestenbezweerder,Nekromantens hansker,Rękawice Nekromanty,Manoplas do Necromante,,Mănușile Necromantului,Перчатки некроманта,Рукавице призивача духова,Nekromantikerns handskar,Ölü Çağıranın Eldivenleri,Рукавиці Некроманта -,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,, -You need a blue key to open this door,TXT_NEEDBLUEKEY,,,,K otevření těchto dveří potřebuješ modrý klíč,Du skal bruge en blå nøgle for at åbne denne dør,Du brauchst einen blauen Schlüssel um diese Tür zu öffnen,Χρειάζεσε ένα μπλέ κλειδί για να ενεργοποίησεις αυτη τη πόρτα,Vi bezonas bluan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave azul para abrir esta puerta,,Tarvitset sinisen avaimen avataksesi tämän oven,Cette porte nécessite une clé bleue pour s'ouvrir.,Az ajtó nyitásához szükséged van egy kék kulcsra,"Ti serve una chiave blu per aprire questa porta +Ethereal Crossbow,TXT_WPNCROSSBOW,,,,Éterická kuše,Æterisk armbrøst,Ätherische Armbrust,,Etera Arbalesto,Ballesta Etérea,,Eetterivarsijousi,Arbalète Ethérique,,Éteri számszeríj,Balestra eterea,イセリアルクロスボウ,유체 쇠뇌,Etherische kruisboog,Eterisk armbrøst,Eteryczna Kusza,Besta Etérea,,Arbaletă Celestă,Эфирный арбалет,Етерични самострел,Eteriskt armborst,Eterik Arbalet,Ефірний арбалет +Dragon Claw,TXT_WPNBLASTER,,,,Drakospár,Drageklo,Drachenklaue,,Drakokrifo,Garra de Dragón,,Lohikäärmeenkynsi,Griffe Draconique,,Sárkány karom,Artiglio del drago,ドラゴンクロー,용발톱,Drakenklauw,Drageklo,Smoczy Pazur,Garra de Dragão,,Gheara Dragonului,Коготь дракона,Змајева канџа,Drakklocka,Ejder Pençesi,Кіготь Дракона +Hellstaff,TXT_WPNSKULLROD,,,,Peklopal,Helvedestav,Höllenrute,,Inferbastono,Bastón Infernal,,Hornansauva,Bâton Infernal,,Pokolpálca,Staffa infernale,ヘルスタッフ,지옥지팡이,Hellestaf,Helvetesstav,Piekielny Kostur,Cajado Infernal,,Baston Infernal,Посох Ада,Паклени штап,Helvetesstång,Cehennem Çubuğu,Пекельний посох +Phoenix Rod,TXT_WPNPHOENIXROD,,,,Fénixova hůl,Phønix-stang,Phönixstab,,Feniksvergo,Báculo del Fénix,,Feenikssauva,Bâton du Phénix,,Főnix Rúd,Asta della fenice,フェニックスロッド,불사조 지팡이,Feniksstaf,Føniksstaven,Różdżka Feniksa,Bastão da Fênix,,Joarda Phoenix,Жезл феникса,Шипка феникса,Fenixstång,Anka Kuşu Çubuğu,Жезл Фенікса +Gauntlets of the Necromancer,TXT_WPNGAUNTLETS,,,,Nekromancerovy rukavice,Nekromantikernes handsker,Handschuhe des Zauberers,,Fergantoj de la Nekromancisto,Guanteletes del Nigromante,,Manaajan rautakintaat,Gantelets du Nécromancien,,Halottidéző Páncélkesztyűi,Guanti del Negromante,ネクロマンサーの篭手,강령술사의 건틀릿,Handschoenen van de Geestenbezweerder,Nekromantens hansker,Rękawice Nekromanty,Manoplas do Necromante,,Mănușile Necromantului,Перчатки некроманта,Рукавице призивача духова,Nekromantikerns handskar,Ölü Çağıranın Eldivenleri,Рукавиці Некроманта +,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,,, +You need a blue key to open this door,TXT_NEEDBLUEKEY,,,,K otevření těchto dveří potřebuješ modrý klíč,Du skal bruge en blå nøgle for at åbne denne dør,Du brauchst einen blauen Schlüssel um diese Tür zu öffnen,Χρειάζεσε ένα μπλέ κλειδί για να ενεργοποίησεις αυτη τη πόρτα,Vi bezonas bluan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave azul para abrir esta puerta,,Tarvitset sinisen avaimen avataksesi tämän oven,Cette porte nécessite une clé bleue pour s'ouvrir.,,Az ajtó nyitásához szükséged van egy kék kulcsra,"Ti serve una chiave blu per aprire questa porta ",開くには 青の鍵が必要だ,이 문을 열기 위해선 청색 열쇠가 필요하다,Je hebt een blauwe sleutel nodig om deze deur te openen,Du trenger en blå nøkkel for å åpne denne døren,"Potrzebujesz niebieskiego klucza, by otworzyć te drzwi.",Você precisa da chave azul para abrir esta porta,Precisas da chave azul para abrir esta porta,"Ai nevoie de o cheie albastră pentru a deschide această ușă",Для открытия нужен синий ключ,Треба вам плави кључ да би отворили ова врата,Du behöver en blå nyckel för att öppna den här dörren.,Bu kapıyı açmak için mavi bir anahtara ihtiyacın var.,"Вам потрібен синій ключ, щоб відкрити ці двері" -You need a green key to open this door,TXT_NEEDGREENKEY,,,,K otevření těchto dveří potřebuješ červený klíč,Du skal bruge en grøn nøgle for at åbne denne dør,Du brauchst einen grünen Schlüssel um diese Tür zu öffnen,Χρειάζεσε ένα πράσινο κλειδί για να ενεργοποίησεις αυτη τη πόρτα,Vi bezonas verdan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave verde para abrir esta puerta,,Tarvitset vihreän avaimen avataksesi tämän oven,Cette porte nécessite une clé verte pour s'ouvrir.,Az ajtó nyitásához szükséged van egy zöld kulcsra,"Ti serve una chiave verde per aprire questa porta +You need a green key to open this door,TXT_NEEDGREENKEY,,,,K otevření těchto dveří potřebuješ červený klíč,Du skal bruge en grøn nøgle for at åbne denne dør,Du brauchst einen grünen Schlüssel um diese Tür zu öffnen,Χρειάζεσε ένα πράσινο κλειδί για να ενεργοποίησεις αυτη τη πόρτα,Vi bezonas verdan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave verde para abrir esta puerta,,Tarvitset vihreän avaimen avataksesi tämän oven,Cette porte nécessite une clé verte pour s'ouvrir.,,Az ajtó nyitásához szükséged van egy zöld kulcsra,"Ti serve una chiave verde per aprire questa porta ",開くには 緑の鍵が必要だ,이 문을 열기 위해선 녹색 열쇠가 필요하다,Je hebt een groene sleutel nodig om deze deur te openen,Du trenger en grønn nøkkel for å åpne denne døren,"Potrzebujesz zielonego klucza, by otworzyć te drzwi.",Você precisa da chave verde para abrir esta porta,Precisas da chave verde para abrir esta porta,"Ai nevoie de o cheie verde pentru a deschide această ușă",Для открытия нужен зелёный ключ,Треба вам зелени кључ да би отворили ова врата,Du behöver en grön nyckel för att öppna den här dörren,Bu kapıyı açmak için yeşil bir anahtara ihtiyacın var.,"Вам потрібен зелений ключ, щоб відкрити ці двері" -You need a yellow key to open this door,TXT_NEEDYELLOWKEY,,,,K otevření těchto dveří potřebuješ žlutý klíč.,Du skal bruge en gul nøgle for at åbne denne dør,Du brauchst einen gleben Schlüssel um diese Tür zu öffnen,Χρειάζεσε ένα κύτρινο κλειδί για να ενεργοποίησεις αυτη τη πόρτα,Vi bezonas flavan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave amarilla para abrir esta puerta,,Tarvitset keltaisen avaimen avataksesi tämän oven,Cette porte nécessite une clé jaune pour s'ouvrir.,Az ajtó nyitásához szükséged van egy sárga kulcsra,Ti serve una chiave gialla per aprire questa porta,開くには 黄の鍵が必要だ,이 문을 열기 위해선 황색 열쇠가 필요하다,Je hebt een gele sleutel nodig om deze deur te openen,Du trenger en gul nøkkel for å åpne denne døren,"Potrzebujesz żółtego klucza, by otworzyć te drzwi.",Você precisa da chave amarela para abrir esta porta,Precisas da chave amarela para abrir esta porta,"Ai nevoie de o cheie galbenă pentru a deschide +You need a yellow key to open this door,TXT_NEEDYELLOWKEY,,,,K otevření těchto dveří potřebuješ žlutý klíč.,Du skal bruge en gul nøgle for at åbne denne dør,Du brauchst einen gleben Schlüssel um diese Tür zu öffnen,Χρειάζεσε ένα κύτρινο κλειδί για να ενεργοποίησεις αυτη τη πόρτα,Vi bezonas flavan ŝlosilon por malfermi ĉi tiun pordon,Necesitas una llave amarilla para abrir esta puerta,,Tarvitset keltaisen avaimen avataksesi tämän oven,Cette porte nécessite une clé jaune pour s'ouvrir.,,Az ajtó nyitásához szükséged van egy sárga kulcsra,Ti serve una chiave gialla per aprire questa porta,開くには 黄の鍵が必要だ,이 문을 열기 위해선 황색 열쇠가 필요하다,Je hebt een gele sleutel nodig om deze deur te openen,Du trenger en gul nøkkel for å åpne denne døren,"Potrzebujesz żółtego klucza, by otworzyć te drzwi.",Você precisa da chave amarela para abrir esta porta,Precisas da chave amarela para abrir esta porta,"Ai nevoie de o cheie galbenă pentru a deschide această ușă",Для открытия нужен жёлтый ключ,Треба вам жути кључ да би отворили ова врата,Du behöver en gul nyckel för att öppna den här dörren,Bu kapıyı açmak için sarı bir anahtara ihtiyacınız var,"Вам потрібен жовтий ключ, щоб відкрити ці двері" -,,Actor tag names,,,,,,,,,,,,,,,,,,,,,,,,,, -Chicken,FN_CHICKEN,,,,Slepice,Kylling,Huhn,Κότα,Koko,Pollo,,Kana,Poulet,Csirke,Pollo,鶏,닭,Kip,Kylling,Kurczak,Galinha,,Găină,Цыплёнок,Кокошка,Kyckling,Tavuk,Курка -Weredragon,FN_BEAST,Wordplay: werewolf,,,Vlkodrak,Varedrage,Werdrache,Θηρίο,Drakfantomo,Hombre dragón,,Ihmislohikäärme,Dragon-garou,Vérsárkány,Drago Mannaro,ウェア ドラゴン,웨어드래곤,Weerdraak,Vardrage,Smokołak,Homem-dragão,,Vârcodragon,Дракон-оборотень,Змајодлак,Vardrake,Kurt ejderha,Дракон-перевертень -Sabreclaw,FN_CLINK,Wordplay: sabre-tooth,,,Šavlozub,Sabelklo,Säbelklaue,,Sabrokrifo,Garras de sable,,Sapelikynsi,Sabregriffe,Szablyakarom,Lamartiglio,サーベルクロー,세이버클로,Sabelklauw,Sabreklo,Szabloszpon,Unhas-de-sabre,,Gheară de Sabie,Саблекоготь,Тигар,Sabelklo,Kılıçpençe,Шаблекіготь -D'Sparil,FN_DSPARIL,,,,,,,,,,,,,,,デ'スパリル,드'스파릴,,,,,,,Д'Спарил,Д'Спарил,,,Д'Спаріл -Gargoyle,FN_HERETICIMP,,,,Chrlič,,,,Gargojlo,Gárgola,,Gargoili,Gargouille,Vízköpő,,ガーゴイル,가고일,,,Gargulec,Gárgula,,Garguie,Горгулья,Камена утвара,,,Ґарґуйль. -Ironlich,FN_IRONLICH,,,,Železný kostěj,Jern lig,Eiserne Leiche,,Ferliĉo,Liche de hierro,,Rautakalmo,Liche de Fer,Ezüst lich,Lich di Ferro,アイアンリッチ,아이언 리치,IJzeren Lijk,Jernlich,Żelazny Lisz,Lich de Ferro,,Cadavru de Fier,Железный лич,Челични лич,Järnlich,Demir Ceset,Залізний Ліч -Undead Warrior,FN_BONEKNIGHT,,,,Nemrtvý válečník,Udøde Kriger,Untoter Krieger,Αθάνατος Πολεμιστής,Malmortinta Batalisto,Guerrero no muerto,,Epäkuollut soturi,Guerrier Mort-Vivant,Élőhalott harcos,Guerriero Non Morto,アンデット兵,언데드 전사,Ondode Krijger,Udød kriger,Nieumarły wojownik,Guerreiro Morto-vivo,,Războinic Nemort,Воин-нежить,Немртви ратник,Odöd krigare,Ölümsüz Savaşçı,Воїн-нежить -Maulotaur,FN_MINOTAUR,,,,Minotaurus,Maulotaurus,Minotaurus,Μινόταυρος,Bategtaŭro,Mazotauro,,Maulotauri,Massetaure,,Maulotauro,マウロタウロス,몰로타우어,Maulotaurus,Maulotaur,Młototaur,Marretauro,,,Избитавр,Минотаур,Maulotaurus,Maulotor,Молотаур -Golem,FN_MUMMY,,,,Golém,,,,Golemo,Gólem,,,,Gólem,,ゴーレム,골렘,,,,,,,Голем,Голем,,,Голем -Nitrogolem,FN_MUMMYLEADER,,,,Střelgolém,,,,Azotgolemo,Gólem de ázoe,,,,Nitrógólem,,ニトロゴーレム,니트로 골렘,,,,,,,Нитроголем,Нитро голем,,,Нітроголем -Ophidian,FN_SNAKE,,,,Šupinatec,,,,Ofidio,Ofidio,,Käärmeolio,Ophidien,Ofidián,,オフィディアン,오피디안,Ophidiaan,,Wężowaty,Ofídio,,Ofidian,Офидиан,Змија,,,Офідіан -Wizard,FN_WIZARD,,,,Čaroděj,Troldmand,Zauberer,Μάγος,Sorĉisto,Mago,Hechicero,Velho,Magicien,Mágus,Mago,ウィザード,마법사,Tovenaar,Trollmann,Czarownik,Mago,,Vrăjitor,Колдун,Чаробњак,Trollkarl,Sihirbaz,Чаклун -Wand Crystals,AMMO_GOLDWAND,,,,Zlaté krystaly,Stav krystaller,Elfenstabkristalle,,Sorĉbastono-Kristaloj,Cristales para vara,,Sauvakristalleja,Cristaux,Pálca kristályok,Cristalli per la bacchetta,ワンド クリスタル,지팡이 결정,Toverstafkristallen,Tryllestavkrystaller,Kryształy do Różdżki,Cristais para o Cetro,,Cristale pentru Toiag,Кристалл эльфийского жезла,Кристали за штап,Stavkristaller,Değnek Kristalleri,Кристал для жезлу -Ethereal Arrows,AMMO_CROSSBOW,,,,Éterické šípy,Æteriske pile,Ätherische Pfeile,,Eteraj Sagoj,Flechas etéreas,,Eetterinuolia,Carreaux,Éteri nyilak,Frecce eteree,イセリアルの矢,유체 화살,Etherische Pijlen,Eteriske piler,Eteryczne Strzały,Flechas Etéreas,,Săgeți Celeste,Эфирные стрелы,Етеричне стреле,Eteriska pilar,Eterik Oklar,Ефірні стріли -Claw Orbs,AMMO_BLASTER,,,,Pazouří střely,Kugler med kløer,Klauenbälle,,Kriforboj,Orbes de garra,,Kynsikehriä,Orbes,Karom golyók,Sfere di artigli,クロー オーブ,발톱 보주,Klauwbollen,Klo-kuler,Kule do Pazura,Orbes para Garra,,Globuri pentru Gheară,Когтевые шары,Канџаста сфера,Klor bollar,Pençe Küreleri,Кігтьова сфера -Mace Spheres,AMMO_MACE,,,,Žezlometné koule,Kugler til stridskølle,Energiebälle,,Klabsferoj,Esferas de maza,,Nuijakuulia,Sphères,Buzogány gömbök,Sfere per la mazza,メイス スフィア,철퇴 포탄,Strijdknotsen,Ildsted-kuler,Kule do Buzdyganu,Esferas para Clava,,Sfere pentru Buzdugan,Сферы булавы,Сфере за буздован,Eldstötsfärer,Ateş Küreleri,Сфери для булави -Hellstaff Runes,AMMO_SKULLROD,,,,Peklopalné runy,Helvedestav-runer,Höllenrutenrunen,,Inferbastono-Runoj,Runas de Vara Infernal,,Hornansauvan riimuja,Runes,Pokolbot rúnák,Rune infernali,ヘルスタッフ ルーン,룬 조각,Hellestafrunen,Helvetesstav-runer,Runy do Piekielnego Kostura,Runas Infernais,,Rune pentru Bastonul Infernal,Руны посоха ада,Пуне за паклени штап,Runor för helvetesstång,Cehennem Asası Rünleri,Руни пекельного посоху -Flame Orbs,AMMO_PHOENIXROD,,,,Plamenné náboje,Flammekugler,Flammenkugeln,,Flamorboj,Orbes de llama,,Liekkikehriä,Orbes de Feu,Tűzgolyók,Sfere di fuoco,フレイム オーブ,화염 구슬,Vuurballen,Flammekuler,Kule Ognia,Orbes de Chamas,,Globuri de Foc,Пламенные шары,Ватрена сфера,Flamkärnor,Alev Küreleri,Вогняна сфера -Staff,TAG_STAFF,,,,Hole,Stav,Stab,Ράβδος,Bastono,Bastón,,Sauva,Bâton,Bot,Staffa,杖,지팡이,Staf,Stav,Kostur,Bastão,,Baston,Посох,Штап,Stav,Çubuk,Палиця -Elven Wand,TAG_GOLDWAND,,,,Elfí hůlka,Elverstav,Elfenstab,,Elfa Sorĉbastono,Vara de Elfo,,Haltiasauva,Baguette Elfique,Elf pálca,Scettro Elfico,エルフのワンド,엘프 지팡이,Elvenstokje,Alvestav,Elfia Różdżka,Cetro Élfico,,Toiag,Эльфийский жезл,Вилењачки штапић,Elfenstav,Elf Asası,Посох Ельфів -,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,, -%o was pecked to death.,OB_CHICKEN,,,,%o byl@[ao_cs] uklován@[ao_cs] k smrti.,%o blev hakket ihjel.,%o wurde zu Tode gepickt.,,%o estis bekita ĝis morto.,A %o l@[ao_esp] han picoteado a muerte.,A %o l@[ao_esp] picotearon a muerte.,%o nokittiin kuoliaaksi.,%o a été picoré@[e_fr] a mort.,%o halálra lett csípve.,%o è stato beccato a morte.,%o はくちばしで突かれ死んだ。,%o 은(는) 쪽팔리게 쪼여 죽었다.,%o werd doodgepikt.,%o ble hakket i hjel.,%o został@[ao_pl] zadzioban@[adj_pl] na śmierć.,%o foi bicad@[ao_ptb] até a morte.,%o foi picad@[ao_ptb] até a morte.,%o a fost ciocănit până la moarte.,Игрок %o заклёван до смерти.,%o је искљуцан@[adj_1_sr] до смрти.,%o blev hackad till döds.,%o gagalanarak öldürüldü.,%o задзьобано до смерті. -%o was charred by a weredragon.,OB_BEAST,,,,%o byl@[ao_cs] spálen@[ao_cs] vlkodrakem.,%o blev forkullet af en varedrage.,%o wurde von dem Werdrachen verschmort.,,%o brulegiĝis de drakfantomo.,A %o l@[ao_esp] ha carbonizado un hombre dragón.,A %o l@[ao_esp] carbonizó un hombre dragón.,%o joutui ihmislohikäärmeen kärventämäksi.,%o a été carbonisé@[e_fr] par un dragon-garou.,%o szénné égett egy Vérsárkány által.,%o è stato carbonizzato da una bestia.,%o はウェアドラゴンに黒焦げにされた。,%o 은(는) 웨어드래곤에 의해 검게 탔다.,%o werd verbrand door een weerdraak.,%o ble forkullet av en vardrage.,%o został@[ao_pl] zwęglon@[adj_pl] przez smokołaka.,%o foi carbonizad@[ao_ptb] por um homem-dragão.,,%o a fost ceruit de un vârcodragon.,Игрок %o обуглен драконом-оборотнем.,%o је реш печен@[adj_1_sr] од стране замјодлака.,%o blev förkolnad av en vardrake.,%o bir kurt ejderha tarafından yakıldı.,%o було спалено драконом-перевертнем. -%o was slashed by a sabreclaw.,OB_CLINK,,,,%o byl@[ao_cs] rozsápán@[ao_cs] šavlozubem.,%o blev skåret op af en sabreklo.,%o wurde von der Säbelklaue zerschlitzt.,,%o tranĉegiĝis de sabrokrifo.,A %o l@[ao_esp] ha cortado un garras de sable.,A %o l@[ao_esp] cortó un garras de sable.,%o joutui sapelikynnen sivaltamaksi.,%o s'est fait découper par un sabregriffe.,%o meg lett vágva egy Szablyakarom által.,%o è stato squarciato da un lapillo.,%o はサーベルクローに切り裂かれた。,%o 은(는) 세이버클로에게 잘렸다.,%o werd door een sabelklauw gesneden.,%o ble kuttet av en sabelklo.,%o został@[ao_pl] posiekan@[adj_pl] przez szabloszpona.,Um Unhas-de-sabre cortou %o.,,%o a fost tăiat de o gheară de sabie.,Игрока %o нарезал саблекоготь.,Играча %o је исекао тигар.,%o blev huggen av en sabelklo.,%o bir kılıç pençe tarafından kesildi.,%o було розсічено шаблекігтем. -%o was scalded by D'Sparil's serpent.,OB_DSPARIL1,,,,%o byl@[ao_cs] zpopelněn@[ao_cs] ořem D'Sparila.,%o blev skoldet af D'Sparils slange.,%o wurde von D'Sparils Schlange verbrüht.,,%o varmegiĝis de la serpento de D'Sparil.,A %o l@[ao_esp] ha carbonizado la serpiente de D'Sparil.,A %o l@[ao_esp] carbonizó la serpiente de D'Sparil.,%o joutui D'Sparilin käärmeen kalttaamaksi.,%o a été ébouillanté@[e_fr] par un serpent de D'Sparil.,%o le lett forrázva D'Sparil Kígyója által.,%o è stato bruciato dal serpente di D'Sparil.,%o はデ'スパリルのサーペントに火傷を負わされた。,%o 은(는) 드'스파릴의 서펜트에 데였다.,%o werd gebroeid door de slang van D'Sparil.,%o ble skåldet av D'Sparils slange.,%o został@[ao_pl] poparzon@[adj_pl] przez węża D'Sparila.,%o foi escaldad@[ao_ptb] pela serpente de D'Sparil.,,%o a fost opărit de șarpele lui D'Sparil.,Игрока %o обжёг змей Д'Спарила.,Играча %o је опекао Д'Спарилова змија.,%o blev skållad av D'Sparils orm.,"%o, D'Sparil'in yılanı tarafından haşlandı.",%o було спалено змієм Д'Спаріла. -%o was chewed up by D'Sparil's serpent.,OB_DSPARIL1HIT,,,,%o byl@[ao_cs] rozkousán@[ao_cs] ořem D'Sparila.,%o blev tygget op af D'Sparils slange.,%o wurde von D'Sparils Schlange verspeist.,,%o maĉegiĝis de la serpento de D'Sparil.,A %o l@[ao_esp] ha engullido la serpiente de D'Sparil.,A %o l@[ao_esp] tragó la serpiente de D'Sparil.,%o joutui D'Sparilin käärmeen pureksimaksi.,%o a été dévoré@[e_fr] par un serpent de D'Sparil.,%o meg lett rágva D'Sparil Kigyója által.,%o è stato masticato dal serpente di D'Sparil.,%o はデ'スパリルのサーペントに噛み砕かれた。,%o 은(는) 드'스파릴의 서펜트에게 씹혔다.,%o werd door de slang van D'Sparil opgekauwd.,%o ble tygd opp av D'Sparils slange.,%o został@[ao_pl] przeżut@[adj_pl] przez węża D'Sparila.,%o foi mastigad@[ao_ptb] pela serpente de D'Sparil.,,%o a fost mestecat de șarpele lui D'Sparil.,Игрока %o пожрал змей Д'Спарила.,%o је сажвакан@[adj_1_sr] од стране Д'Спарилове змије.,%o blev tuggad av D'Sparils orm.,"%o, D'Sparil'in yılanı tarafından çiğnendi.",Змій Д'Спаріла зжер %o . -%o was no match for D'Sparil.,OB_DSPARIL2,,,,%o nebyl@[ao_cs] pro D'Sparila žádná výzva.,%o kunne ikke klare D'Sparil.,%o war kein Gegner für D'Sparil.,,%o ne estis rivalo por D'Sparil. ,%o no era rival para D'Sparil.,,%o ei mahtanut mitään D'Sparilille.,%o n'a pas pu égaler D'Sparil.,%o nem volt méltó ellenfél D'Sparil számára.,%o non era all'altezza di D'Sparil.,%o はデ'スパリルには全く歯が立たなかった。,%o 은(는) 드'스파릴에겐 상대가 되지 못했다.,%o was geen partij voor D'Sparil.,%o var ingen match for D'Sparil.,%o nie miał@[ao_pl] szans z D'Sparilem.,%o não foi páreo para D'Sparil.,%o não foi desafio para D'Sparil.,%o n-a fost nici pe departe pe măsura lui D'Sparil.,Игрок %o был не ровня Д'Спарилу.,%o није ни до колена Д'Спарилу.,%o var ingen match för D'Sparil.,"%o, D'Sparil'in dengi değildi.",%o ніщо проти Д'Спаріла. -%o was smacked down by D'Sparil.,OB_DSPARIL2HIT,,,,%o byl@[ao_cs] sražen@[ao_cs] D'Sparilem.,%o blev slået ned af D'Sparil.,%o wurde von D'Sparil zerklatscht.,,%o frapiĝis de D'Sparil.,A %o l@[ao_esp] ha humillado D'Sparil.,A %o l@[ao_esp] humilló D'Sparil.,%o joutui D'Sparilin löylyttämäksi.,%o a été battu@[e_fr] a plate couture par D'Sparil.,%o a földre lett csapva D'Sparil által.,%o è stato abbattuto da D'Sparil.,%o はデ'スパリルに打ち負かされた。,%o 은(는) 드'스파릴의 맹격에 쓰러졌다.,%o werd neergeslagen door D'Sparil.,%o ble slått ned av D'Sparil.,%o został@[ao_pl] roztrzaskan@[adj_pl] przez D'Sparila,%o foi mort@[ao_ptb] por D'Sparil.,,%o a fost pus la pământ de D'Sparil.,Игрок %o сбит с ног Д'Спарилом.,%o је претучен@[adj_1_sr] од стране Д'Спарила.,%o blev nedslagen av D'Sparil.,"%o, D'Sparil tarafından yere serildi.",Д'Спаріл збив %o. -%o was scarred by a gargoyle.,OB_HERETICIMP,,,,%o byl@[ao_cs] upálen@[ao_cs] chrličem.,%o blev mærket af en gargoyle.,%o wurde von einem Gargoyle zerkratzt.,,%o ĉikartiĝis de gargojlo.,"A %o l@[ao_esp] ha marcado, y no de cicatrices, una gárgola.","A %o l@[ao_esp] marcó, y no de cicatrices, una gárgola.",%o joutui gargoilin arpeuttamaksi.,%o a été effrayé@[e_fr] par une gargouille.,%o meg lett sebesítve egy vízköpő által.,%o è stato terrorizzato da un imp.,%o はガーゴイルに傷を負わされた。,%o 은(는) 가고일에 의해 다쳤다.,%o was getekend door een gargoyle.,%o ble arret av en gargoyle.,%o został@[ao_pl] zadrapan@[adj_pl] przez gargulca,%o foi cicatrizad@[ao_ptb] por uma gárgula.,,%o a fost cicatrizat de o garguie.,Игрока %o изуродовала горгулья.,%o је ожиљкан@[adj_1_sr] од стране камене утваре.,%o blev ärrad av en gargoyle.,%o bir gargoyle tarafından yaralandı.,%o понівечено ґарґуйлем. -%o was hacked by a gargoyle.,OB_HERETICIMPHIT,,,,%o byl@[ao_cs] rozsekán@[ao_cs] chrličem.,%o blev hakket af en gargoyle.,%o wurde von einem Gargoyle zerhackt.,,%o hakiĝis de gargojlo.,A %o l@[ao_esp] ha arañado una gárgola.,A %o l@[ao_esp] arañó una gárgola.,%o joutui gargoilin pilkkomaksi.,%o a été mis@[e_fr] en pièces par une gargouille.,%o fel lett vágva egy vízköpő által.,%o è stato eliminato da un imp.,%o はガーゴイルに切り刻まれた。,%o 은(는) 가고일에 의해 베였다.,%o werd gehackt door een gargoyle.,%o ble hakket av en gargoyle.,%o został@[ao_pl] pocięt@[adj_pl] przez gargulca,%o foi mutilad@[ao_ptb] por uma gárgula.,,%o a fost tăiat de o garguie.,Игрока %o покалечила горгулья.,Играча %o је исекла камена утвара.,%o blev hackad av en gargoyle.,%o bir gargoyle tarafından kesildi.,%o скалічено ґарґуйлем. -%o was devastated by an ironlich.,OB_IRONLICH,,,,%o byl@[ao_cs] zničen@[ao_cs] železným kostějem.,%o blev ødelagt af en jern lig.,%o wurde von der Eisernen Leiche zerstört.,,%o ruiniĝis de ferliĉo.,A %o l@[ao_esp] ha devastado un liche de hierro.,A %o l@[ao_esp] devastó un liche de hierro.,%o joutui rautakalmon hävittämäksi.,%o a été dévasté@[e_fr] par une Liche de Fer.,%o elpusztult egy ezüst lich miatt.,%o è stato devastato da un ironlich.,%o はアイアンリッチに吹き飛ばされた。,%o 은(는) 아이언 리치에게 붕괴 당했다.,%o werd verwoest door een ijzeren lijk.,%o ble knust av en jernlich.,%o został@[ao_pl] zdewastowan@[adj_pl] przez żelaznego lisza,%o foi devastad@[ao_ptb] por um lich de ferro.,,%o a fost devastat de un cadavru de fier.,Игрока %o растоптал железный лич.,%o је уништен@[adj_1_sr] од стране челичног лича.,%o blev förödd av en järnlich,%o demir bir ceset tarafından harap edildi.,%o знищено залізним лічем. -%o got up-close and personal with an ironlich.,OB_IRONLICHHIT,,,,%o se dostal@[ao_cs] moc blízko k železnému kostěji.,%o kom helt tæt på en jern lig.,%o kam der Eisernen Leiche zu nahe.,,%o havis proksiman kaj desonan rekonton kun ferliĉo.,%o ha tenido un encuentro cercano y personal con un liche de hierro.,%o tuvo un encuentro cercano y personal con un liche de hierro.,%o meni lähelle rautakalmoa.,%o a fait ami@[e_fr]-ami@[e_fr] avec une Liche de Fer.,%o közel került és személyes volt egy ezüst lichhel szemben.,%o è andato troppo vicino a un ironlich.,%o はアイアンリッチと密接に関わった。,%o 은(는) 사적인 이유로 아이언 리치에게 다가왔다.,%o werd door een ijzeren lijk onheus bejegend.,%o fikk nærkontakt med en jernlich.,%o był@[ao_pl] blisko i na osobności z żelaznym liszem,%o chegou muito perto de um lich de ferro.,,"%o s-a apropiat prea mult de un +,,Actor tag names,,,,,,,,,,,,,,,,,,,,,,,,,,, +Chicken,FN_CHICKEN,,,,Slepice,Kylling,Huhn,Κότα,Koko,Pollo,,Kana,Poulet,,Csirke,Pollo,鶏,닭,Kip,Kylling,Kurczak,Galinha,,Găină,Цыплёнок,Кокошка,Kyckling,Tavuk,Курка +Weredragon,FN_BEAST,Wordplay: werewolf,,,Vlkodrak,Varedrage,Werdrache,Θηρίο,Drakfantomo,Hombre dragón,,Ihmislohikäärme,Dragon-garou,,Vérsárkány,Drago Mannaro,ウェア ドラゴン,웨어드래곤,Weerdraak,Vardrage,Smokołak,Homem-dragão,,Vârcodragon,Дракон-оборотень,Змајодлак,Vardrake,Kurt ejderha,Дракон-перевертень +Sabreclaw,FN_CLINK,Wordplay: sabre-tooth,,,Šavlozub,Sabelklo,Säbelklaue,,Sabrokrifo,Garras de sable,,Sapelikynsi,Sabregriffe,,Szablyakarom,Lamartiglio,サーベルクロー,세이버클로,Sabelklauw,Sabreklo,Szabloszpon,Unhas-de-sabre,,Gheară de Sabie,Саблекоготь,Тигар,Sabelklo,Kılıçpençe,Шаблекіготь +D'Sparil,FN_DSPARIL,,,,,,,,,,,,,,,,デ'スパリル,드'스파릴,,,,,,,Д'Спарил,Д'Спарил,,,Д'Спаріл +Gargoyle,FN_HERETICIMP,,,,Chrlič,,,,Gargojlo,Gárgola,,Gargoili,Gargouille,,Vízköpő,,ガーゴイル,가고일,,,Gargulec,Gárgula,,Garguie,Горгулья,Камена утвара,,,Ґарґуйль. +Ironlich,FN_IRONLICH,,,,Železný kostěj,Jern lig,Eiserne Leiche,,Ferliĉo,Liche de hierro,,Rautakalmo,Liche de Fer,,Ezüst lich,Lich di Ferro,アイアンリッチ,아이언 리치,IJzeren Lijk,Jernlich,Żelazny Lisz,Lich de Ferro,,Cadavru de Fier,Железный лич,Челични лич,Järnlich,Demir Ceset,Залізний Ліч +Undead Warrior,FN_BONEKNIGHT,,,,Nemrtvý válečník,Udøde Kriger,Untoter Krieger,Αθάνατος Πολεμιστής,Malmortinta Batalisto,Guerrero no muerto,,Epäkuollut soturi,Guerrier Mort-Vivant,,Élőhalott harcos,Guerriero Non Morto,アンデット兵,언데드 전사,Ondode Krijger,Udød kriger,Nieumarły wojownik,Guerreiro Morto-vivo,,Războinic Nemort,Воин-нежить,Немртви ратник,Odöd krigare,Ölümsüz Savaşçı,Воїн-нежить +Maulotaur,FN_MINOTAUR,,,,Minotaurus,Maulotaurus,Minotaurus,Μινόταυρος,Bategtaŭro,Mazotauro,,Maulotauri,Massetaure,,,Maulotauro,マウロタウロス,몰로타우어,Maulotaurus,Maulotaur,Młototaur,Marretauro,,,Избитавр,Минотаур,Maulotaurus,Maulotor,Молотаур +Golem,FN_MUMMY,,,,Golém,,,,Golemo,Gólem,,,,,Gólem,,ゴーレム,골렘,,,,,,,Голем,Голем,,,Голем +Nitrogolem,FN_MUMMYLEADER,,,,Střelgolém,,,,Azotgolemo,Gólem de ázoe,,,,,Nitrógólem,,ニトロゴーレム,니트로 골렘,,,,,,,Нитроголем,Нитро голем,,,Нітроголем +Ophidian,FN_SNAKE,,,,Šupinatec,,,,Ofidio,Ofidio,,Käärmeolio,Ophidien,,Ofidián,,オフィディアン,오피디안,Ophidiaan,,Wężowaty,Ofídio,,Ofidian,Офидиан,Змија,,,Офідіан +Wizard,FN_WIZARD,,,,Čaroděj,Troldmand,Zauberer,Μάγος,Sorĉisto,Mago,Hechicero,Velho,Magicien,,Mágus,Mago,ウィザード,마법사,Tovenaar,Trollmann,Czarownik,Mago,,Vrăjitor,Колдун,Чаробњак,Trollkarl,Sihirbaz,Чаклун +Wand Crystals,AMMO_GOLDWAND,,,,Zlaté krystaly,Stav krystaller,Elfenstabkristalle,,Sorĉbastono-Kristaloj,Cristales para vara,,Sauvakristalleja,Cristaux,,Pálca kristályok,Cristalli per la bacchetta,ワンド クリスタル,지팡이 결정,Toverstafkristallen,Tryllestavkrystaller,Kryształy do Różdżki,Cristais para o Cetro,,Cristale pentru Toiag,Кристалл эльфийского жезла,Кристали за штап,Stavkristaller,Değnek Kristalleri,Кристал для жезлу +Ethereal Arrows,AMMO_CROSSBOW,,,,Éterické šípy,Æteriske pile,Ätherische Pfeile,,Eteraj Sagoj,Flechas etéreas,,Eetterinuolia,Carreaux,,Éteri nyilak,Frecce eteree,イセリアルの矢,유체 화살,Etherische Pijlen,Eteriske piler,Eteryczne Strzały,Flechas Etéreas,,Săgeți Celeste,Эфирные стрелы,Етеричне стреле,Eteriska pilar,Eterik Oklar,Ефірні стріли +Claw Orbs,AMMO_BLASTER,,,,Pazouří střely,Kugler med kløer,Klauenbälle,,Kriforboj,Orbes de garra,,Kynsikehriä,Orbes,,Karom golyók,Sfere di artigli,クロー オーブ,발톱 보주,Klauwbollen,Klo-kuler,Kule do Pazura,Orbes para Garra,,Globuri pentru Gheară,Когтевые шары,Канџаста сфера,Klor bollar,Pençe Küreleri,Кігтьова сфера +Mace Spheres,AMMO_MACE,,,,Žezlometné koule,Kugler til stridskølle,Energiebälle,,Klabsferoj,Esferas de maza,,Nuijakuulia,Sphères,,Buzogány gömbök,Sfere per la mazza,メイス スフィア,철퇴 포탄,Strijdknotsen,Ildsted-kuler,Kule do Buzdyganu,Esferas para Clava,,Sfere pentru Buzdugan,Сферы булавы,Сфере за буздован,Eldstötsfärer,Ateş Küreleri,Сфери для булави +Hellstaff Runes,AMMO_SKULLROD,,,,Peklopalné runy,Helvedestav-runer,Höllenrutenrunen,,Inferbastono-Runoj,Runas de Vara Infernal,,Hornansauvan riimuja,Runes,,Pokolbot rúnák,Rune infernali,ヘルスタッフ ルーン,룬 조각,Hellestafrunen,Helvetesstav-runer,Runy do Piekielnego Kostura,Runas Infernais,,Rune pentru Bastonul Infernal,Руны посоха ада,Пуне за паклени штап,Runor för helvetesstång,Cehennem Asası Rünleri,Руни пекельного посоху +Flame Orbs,AMMO_PHOENIXROD,,,,Plamenné náboje,Flammekugler,Flammenkugeln,,Flamorboj,Orbes de llama,,Liekkikehriä,Orbes de Feu,,Tűzgolyók,Sfere di fuoco,フレイム オーブ,화염 구슬,Vuurballen,Flammekuler,Kule Ognia,Orbes de Chamas,,Globuri de Foc,Пламенные шары,Ватрена сфера,Flamkärnor,Alev Küreleri,Вогняна сфера +Staff,TAG_STAFF,,,,Hole,Stav,Stab,Ράβδος,Bastono,Bastón,,Sauva,Bâton,,Bot,Staffa,杖,지팡이,Staf,Stav,Kostur,Bastão,,Baston,Посох,Штап,Stav,Çubuk,Палиця +Elven Wand,TAG_GOLDWAND,,,,Elfí hůlka,Elverstav,Elfenstab,,Elfa Sorĉbastono,Vara de Elfo,,Haltiasauva,Baguette Elfique,,Elf pálca,Scettro Elfico,エルフのワンド,엘프 지팡이,Elvenstokje,Alvestav,Elfia Różdżka,Cetro Élfico,,Toiag,Эльфийский жезл,Вилењачки штапић,Elfenstav,Elf Asası,Посох Ельфів +,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,,, +%o was pecked to death.,OB_CHICKEN,,,,%o byl@[ao_cs] uklován@[ao_cs] k smrti.,%o blev hakket ihjel.,%o wurde zu Tode gepickt.,,%o estis bekita ĝis morto.,A %o l@[ao_esp] han picoteado a muerte.,A %o l@[ao_esp] picotearon a muerte.,%o nokittiin kuoliaaksi.,%o a été picoré@[e_fr] a mort.,,%o halálra lett csípve.,%o è stato beccato a morte.,%o はくちばしで突かれ死んだ。,%o 은(는) 쪽팔리게 쪼여 죽었다.,%o werd doodgepikt.,%o ble hakket i hjel.,%o został@[ao_pl] zadzioban@[adj_pl] na śmierć.,%o foi bicad@[ao_ptb] até a morte.,%o foi picad@[ao_ptb] até a morte.,%o a fost ciocănit până la moarte.,Игрок %o заклёван до смерти.,%o је искљуцан@[adj_1_sr] до смрти.,%o blev hackad till döds.,%o gagalanarak öldürüldü.,%o задзьобано до смерті. +%o was charred by a weredragon.,OB_BEAST,,,,%o byl@[ao_cs] spálen@[ao_cs] vlkodrakem.,%o blev forkullet af en varedrage.,%o wurde von dem Werdrachen verschmort.,,%o brulegiĝis de drakfantomo.,A %o l@[ao_esp] ha carbonizado un hombre dragón.,A %o l@[ao_esp] carbonizó un hombre dragón.,%o joutui ihmislohikäärmeen kärventämäksi.,%o a été carbonisé@[e_fr] par un dragon-garou.,,%o szénné égett egy Vérsárkány által.,%o è stato carbonizzato da una bestia.,%o はウェアドラゴンに黒焦げにされた。,%o 은(는) 웨어드래곤에 의해 검게 탔다.,%o werd verbrand door een weerdraak.,%o ble forkullet av en vardrage.,%o został@[ao_pl] zwęglon@[adj_pl] przez smokołaka.,%o foi carbonizad@[ao_ptb] por um homem-dragão.,,%o a fost ceruit de un vârcodragon.,Игрок %o обуглен драконом-оборотнем.,%o је реш печен@[adj_1_sr] од стране замјодлака.,%o blev förkolnad av en vardrake.,%o bir kurt ejderha tarafından yakıldı.,%o було спалено драконом-перевертнем. +%o was slashed by a sabreclaw.,OB_CLINK,,,,%o byl@[ao_cs] rozsápán@[ao_cs] šavlozubem.,%o blev skåret op af en sabreklo.,%o wurde von der Säbelklaue zerschlitzt.,,%o tranĉegiĝis de sabrokrifo.,A %o l@[ao_esp] ha cortado un garras de sable.,A %o l@[ao_esp] cortó un garras de sable.,%o joutui sapelikynnen sivaltamaksi.,%o s'est fait découper par un sabregriffe.,,%o meg lett vágva egy Szablyakarom által.,%o è stato squarciato da un lapillo.,%o はサーベルクローに切り裂かれた。,%o 은(는) 세이버클로에게 잘렸다.,%o werd door een sabelklauw gesneden.,%o ble kuttet av en sabelklo.,%o został@[ao_pl] posiekan@[adj_pl] przez szabloszpona.,Um Unhas-de-sabre cortou %o.,,%o a fost tăiat de o gheară de sabie.,Игрока %o нарезал саблекоготь.,Играча %o је исекао тигар.,%o blev huggen av en sabelklo.,%o bir kılıç pençe tarafından kesildi.,%o було розсічено шаблекігтем. +%o was scalded by D'Sparil's serpent.,OB_DSPARIL1,,,,%o byl@[ao_cs] zpopelněn@[ao_cs] ořem D'Sparila.,%o blev skoldet af D'Sparils slange.,%o wurde von D'Sparils Schlange verbrüht.,,%o varmegiĝis de la serpento de D'Sparil.,A %o l@[ao_esp] ha carbonizado la serpiente de D'Sparil.,A %o l@[ao_esp] carbonizó la serpiente de D'Sparil.,%o joutui D'Sparilin käärmeen kalttaamaksi.,%o a été ébouillanté@[e_fr] par un serpent de D'Sparil.,,%o le lett forrázva D'Sparil Kígyója által.,%o è stato bruciato dal serpente di D'Sparil.,%o はデ'スパリルのサーペントに火傷を負わされた。,%o 은(는) 드'스파릴의 서펜트에 데였다.,%o werd gebroeid door de slang van D'Sparil.,%o ble skåldet av D'Sparils slange.,%o został@[ao_pl] poparzon@[adj_pl] przez węża D'Sparila.,%o foi escaldad@[ao_ptb] pela serpente de D'Sparil.,,%o a fost opărit de șarpele lui D'Sparil.,Игрока %o обжёг змей Д'Спарила.,Играча %o је опекао Д'Спарилова змија.,%o blev skållad av D'Sparils orm.,"%o, D'Sparil'in yılanı tarafından haşlandı.",%o було спалено змієм Д'Спаріла. +%o was chewed up by D'Sparil's serpent.,OB_DSPARIL1HIT,,,,%o byl@[ao_cs] rozkousán@[ao_cs] ořem D'Sparila.,%o blev tygget op af D'Sparils slange.,%o wurde von D'Sparils Schlange verspeist.,,%o maĉegiĝis de la serpento de D'Sparil.,A %o l@[ao_esp] ha engullido la serpiente de D'Sparil.,A %o l@[ao_esp] tragó la serpiente de D'Sparil.,%o joutui D'Sparilin käärmeen pureksimaksi.,%o a été dévoré@[e_fr] par un serpent de D'Sparil.,,%o meg lett rágva D'Sparil Kigyója által.,%o è stato masticato dal serpente di D'Sparil.,%o はデ'スパリルのサーペントに噛み砕かれた。,%o 은(는) 드'스파릴의 서펜트에게 씹혔다.,%o werd door de slang van D'Sparil opgekauwd.,%o ble tygd opp av D'Sparils slange.,%o został@[ao_pl] przeżut@[adj_pl] przez węża D'Sparila.,%o foi mastigad@[ao_ptb] pela serpente de D'Sparil.,,%o a fost mestecat de șarpele lui D'Sparil.,Игрока %o пожрал змей Д'Спарила.,%o је сажвакан@[adj_1_sr] од стране Д'Спарилове змије.,%o blev tuggad av D'Sparils orm.,"%o, D'Sparil'in yılanı tarafından çiğnendi.",Змій Д'Спаріла зжер %o . +%o was no match for D'Sparil.,OB_DSPARIL2,,,,%o nebyl@[ao_cs] pro D'Sparila žádná výzva.,%o kunne ikke klare D'Sparil.,%o war kein Gegner für D'Sparil.,,%o ne estis rivalo por D'Sparil. ,%o no era rival para D'Sparil.,,%o ei mahtanut mitään D'Sparilille.,%o n'a pas pu égaler D'Sparil.,,%o nem volt méltó ellenfél D'Sparil számára.,%o non era all'altezza di D'Sparil.,%o はデ'スパリルには全く歯が立たなかった。,%o 은(는) 드'스파릴에겐 상대가 되지 못했다.,%o was geen partij voor D'Sparil.,%o var ingen match for D'Sparil.,%o nie miał@[ao_pl] szans z D'Sparilem.,%o não foi páreo para D'Sparil.,%o não foi desafio para D'Sparil.,%o n-a fost nici pe departe pe măsura lui D'Sparil.,Игрок %o был не ровня Д'Спарилу.,%o није ни до колена Д'Спарилу.,%o var ingen match för D'Sparil.,"%o, D'Sparil'in dengi değildi.",%o ніщо проти Д'Спаріла. +%o was smacked down by D'Sparil.,OB_DSPARIL2HIT,,,,%o byl@[ao_cs] sražen@[ao_cs] D'Sparilem.,%o blev slået ned af D'Sparil.,%o wurde von D'Sparil zerklatscht.,,%o frapiĝis de D'Sparil.,A %o l@[ao_esp] ha humillado D'Sparil.,A %o l@[ao_esp] humilló D'Sparil.,%o joutui D'Sparilin löylyttämäksi.,%o a été battu@[e_fr] a plate couture par D'Sparil.,,%o a földre lett csapva D'Sparil által.,%o è stato abbattuto da D'Sparil.,%o はデ'スパリルに打ち負かされた。,%o 은(는) 드'스파릴의 맹격에 쓰러졌다.,%o werd neergeslagen door D'Sparil.,%o ble slått ned av D'Sparil.,%o został@[ao_pl] roztrzaskan@[adj_pl] przez D'Sparila,%o foi mort@[ao_ptb] por D'Sparil.,,%o a fost pus la pământ de D'Sparil.,Игрок %o сбит с ног Д'Спарилом.,%o је претучен@[adj_1_sr] од стране Д'Спарила.,%o blev nedslagen av D'Sparil.,"%o, D'Sparil tarafından yere serildi.",Д'Спаріл збив %o. +%o was scarred by a gargoyle.,OB_HERETICIMP,,,,%o byl@[ao_cs] upálen@[ao_cs] chrličem.,%o blev mærket af en gargoyle.,%o wurde von einem Gargoyle zerkratzt.,,%o ĉikartiĝis de gargojlo.,"A %o l@[ao_esp] ha marcado, y no de cicatrices, una gárgola.","A %o l@[ao_esp] marcó, y no de cicatrices, una gárgola.",%o joutui gargoilin arpeuttamaksi.,%o a été effrayé@[e_fr] par une gargouille.,,%o meg lett sebesítve egy vízköpő által.,%o è stato terrorizzato da un imp.,%o はガーゴイルに傷を負わされた。,%o 은(는) 가고일에 의해 다쳤다.,%o was getekend door een gargoyle.,%o ble arret av en gargoyle.,%o został@[ao_pl] zadrapan@[adj_pl] przez gargulca,%o foi cicatrizad@[ao_ptb] por uma gárgula.,,%o a fost cicatrizat de o garguie.,Игрока %o изуродовала горгулья.,%o је ожиљкан@[adj_1_sr] од стране камене утваре.,%o blev ärrad av en gargoyle.,%o bir gargoyle tarafından yaralandı.,%o понівечено ґарґуйлем. +%o was hacked by a gargoyle.,OB_HERETICIMPHIT,,,,%o byl@[ao_cs] rozsekán@[ao_cs] chrličem.,%o blev hakket af en gargoyle.,%o wurde von einem Gargoyle zerhackt.,,%o hakiĝis de gargojlo.,A %o l@[ao_esp] ha arañado una gárgola.,A %o l@[ao_esp] arañó una gárgola.,%o joutui gargoilin pilkkomaksi.,%o a été mis@[e_fr] en pièces par une gargouille.,,%o fel lett vágva egy vízköpő által.,%o è stato eliminato da un imp.,%o はガーゴイルに切り刻まれた。,%o 은(는) 가고일에 의해 베였다.,%o werd gehackt door een gargoyle.,%o ble hakket av en gargoyle.,%o został@[ao_pl] pocięt@[adj_pl] przez gargulca,%o foi mutilad@[ao_ptb] por uma gárgula.,,%o a fost tăiat de o garguie.,Игрока %o покалечила горгулья.,Играча %o је исекла камена утвара.,%o blev hackad av en gargoyle.,%o bir gargoyle tarafından kesildi.,%o скалічено ґарґуйлем. +%o was devastated by an ironlich.,OB_IRONLICH,,,,%o byl@[ao_cs] zničen@[ao_cs] železným kostějem.,%o blev ødelagt af en jern lig.,%o wurde von der Eisernen Leiche zerstört.,,%o ruiniĝis de ferliĉo.,A %o l@[ao_esp] ha devastado un liche de hierro.,A %o l@[ao_esp] devastó un liche de hierro.,%o joutui rautakalmon hävittämäksi.,%o a été dévasté@[e_fr] par une Liche de Fer.,,%o elpusztult egy ezüst lich miatt.,%o è stato devastato da un ironlich.,%o はアイアンリッチに吹き飛ばされた。,%o 은(는) 아이언 리치에게 붕괴 당했다.,%o werd verwoest door een ijzeren lijk.,%o ble knust av en jernlich.,%o został@[ao_pl] zdewastowan@[adj_pl] przez żelaznego lisza,%o foi devastad@[ao_ptb] por um lich de ferro.,,%o a fost devastat de un cadavru de fier.,Игрока %o растоптал железный лич.,%o је уништен@[adj_1_sr] од стране челичног лича.,%o blev förödd av en järnlich,%o demir bir ceset tarafından harap edildi.,%o знищено залізним лічем. +%o got up-close and personal with an ironlich.,OB_IRONLICHHIT,,,,%o se dostal@[ao_cs] moc blízko k železnému kostěji.,%o kom helt tæt på en jern lig.,%o kam der Eisernen Leiche zu nahe.,,%o havis proksiman kaj desonan rekonton kun ferliĉo.,%o ha tenido un encuentro cercano y personal con un liche de hierro.,%o tuvo un encuentro cercano y personal con un liche de hierro.,%o meni lähelle rautakalmoa.,%o a fait ami@[e_fr]-ami@[e_fr] avec une Liche de Fer.,,%o közel került és személyes volt egy ezüst lichhel szemben.,%o è andato troppo vicino a un ironlich.,%o はアイアンリッチと密接に関わった。,%o 은(는) 사적인 이유로 아이언 리치에게 다가왔다.,%o werd door een ijzeren lijk onheus bejegend.,%o fikk nærkontakt med en jernlich.,%o był@[ao_pl] blisko i na osobności z żelaznym liszem,%o chegou muito perto de um lich de ferro.,,"%o s-a apropiat prea mult de un cadavru de fier.",Игрок %o близко и лимно узнал железного лича.,%o се лично приближи@[ao_1_sr] челичном личу.,%o kom nära och personligt med en järnlich.,%o demir bir cesede çok yaklaştı.,%o надто зблизи@[adj_2_ua] з залізним лічем. -%o was axed by an undead warrior.,OB_BONEKNIGHT,,,,%o dostal@[ao_cs] sekyrou od nemrtvého válečníka.,%o blev øksehugget af en udød kriger.,%o wurde von dem Untoten Krieger mit der Axt bearbeitet.,,%o hakiliĝis de malmortinta batalisto.,%o ha recibido un hachazo de un guerrero no muerto.,%o recibió un hachazo de un guerrero no muerto.,%o joutui epäkuolleen soturin kirvestämäksi.,%o s'est pris@[e_fr] la hâche d'un guerrier mort-vivant.,%o baltát kapott egy Élőhalott Harcostól.,%o è stato accettato da un guerriero non morto .,%o はアンデッド兵の斧でやられた。,%o 은(는) 언데드 전사에게 도끼질 당했다.,%o werd doorkliefd door een ondode krijger.,%o ble hugget av en udød kriger.,%o został@[ao_pl] rozłupany siekierą przez nieumarłego wojownika,%o foi decepad@[ao_ptb] por um guerreiro morto-vivo.,%o foi decapitad@[ao_ptb] por um guerreiro morto-vivo.,%o a primit un topor de la un războinic nemort.,Игрока %o зарубил воин-нежить.,%o је исечен@[adj_1_sr] од стане немртвог ратника.,%o blev yxad av en odöd krigare.,%o bir ölümsüz savaşçı tarafından baltalandı.,Воїн-нежить зарубав %o. -%o was slain by an undead warrior.,OB_BONEKNIGHTHIT,,,,%o byl@[ao_cs] zabit@[ao_cs] nemrtvým válečníkem.,%o blev dræbt af en udød kriger.,%o wurde von dem Untoten Krieger hingemetzelt.,,%o estis mortigita de malmortinta batalisto.,A %o l@[ao_esp] ha descuartizado un guerrero no muerto.,A %o l@[ao_esp] descuartizó un guerrero no muerto.,%o joutui epäkuolleen soturin tappamaksi.,%o s'est fait pourfendre par un guerrier mort-vivant.,%o meghalt egy Élőhalott Harcos által.,%o è stato ucciso da un guerriero non morto. ,%o はアンデッド兵の手で葬られた。,%o 은(는) 언데드 전사에게 처단당했다.,%o werd gedood door een ondode krijger.,%o ble drept av en levende død kriger.,%o został@[ao_pl] zgładzon@[adj_pl] przez nieumarłego wojownika,%o foi picotad@[ao_ptb] por um guerreiro morto-vivo.,,%o a fost omorât de un războinic nemort.,Игрока %o сразил воин-нежить.,Играча %o је убио немртви ратник.,%o blev dödad av en odödlig krigare.,%o bir ölümsüz savaşçı tarafından katledildi.,%o бу@[adj_1_ua] повален@[ao_ua] воїном-нежитю. -%o was blasted into cinders by a Maulotaur.,OB_MINOTAUR,,,,%o byl@[ao_cs] rozmetán@[ao_cs] na popel Minotaurem.,%o blev sprængt i aske af en Maulotaurus.,%o wurde von dem Minotaurus in Asche verwandelt.,,%o eksplodiĝis en cindrojn de Bategtaŭro.,A %o l@[ao_esp] ha volado en cenizas un Mazotauro.,A %o l@[ao_esp] voló en cenizas un Mazotauro.,%o tuhottiin tuusan nuuskaksi maulotaurin toimesta.,%o s'est fait@[e_fr] incinérer par un Massetaure.,%o darabokra robbant egy Maulotaurusz által.,%o è stato incenerito da un Maulotauro. ,%o はマウロタウロスに燃やされ炭化した。,%o 은(는) 몰로타우어에게 잿더미가 되도록 파괴당했다.,%o werd door een Maulotaurus tot sintels geblazen.,%o ble sprengt til aske av en Maulotaur.,%o został@[ao_pl] obrócon@[adj_pl] w popiół przez Młototaura,%o foi incinerad@[ao_ptb] por um Marretauro,,%o a fost făcut cenușă de un Maulotaur.,Игрока %o разнёс на угольки Избитавр.,%o је испуцан@[adj_1_sr] у пепео од стране минотаура.,%o blev sprängd till aska av en maulotaurus.,%o bir Maulotor tarafından kül haline getirildi.,%o бу@[adj_1_ua] стерт@[ao_ua] в пил Молотауром. -%o was pulped by a Maulotaur.,OB_MINOTAURHIT,,,,%o byl@[ao_cs] rozmáčknut@[ao_cs] Minotaurem.,%o blev knust af en Maulotaurus.,%o wurde von dem Minotaurus zu Brei verarbeitet.,,%o pulpiĝis de Bategtaŭro.,A %o l@[ao_esp] ha hecho puré un Mazotauro.,A %o l@[ao_esp] hizo puré un Mazotauro.,%o joutui maulotaurin möyhentämäksi.,%o s'est fait@[e_fr] éclater par un Massetaure.,%o péppé lett zúzva egy Maulotaurusz által.,%o è stato ridotto in poltiglia da un Maulotauro. ,%o はマウロタウロスにグシャグシャにされた。,%o 은(는) 몰로타우어에 의해 내동댕이쳐졌다.,%o werd verpulverd door een Maulotaurus.,%o ble knust av en maulotaur.,%o został@[ao_pl] roztart@[adj_pl] na miazgę przez Młototaura,%o foi esmagad@[ao_ptb] por um Marretauro,,%o a fost descojit de un Maulotaur.,Игрока %o превратил в кровавое месиво Избитавр.,Играча %o је претукао минотаур.,%o blev krossad av en maulotaurus.,%o bir Maulotor tarafından ezildi.,Молотаур перетворив %o в криваве місиво. -%o was smashed by a golem.,OB_MUMMY,,,,%o byl@[ao_cs] umlácen@[ao_cs] golémem.,%o blev smadret af en golem.,%o wurde von einem Golem erschlagen.,,%o frakasiĝis de golemo.,A %o l@[ao_esp] ha aplastado un gólem.,A %o l@[ao_esp] aplastó un gólem.,%o joutui golemin murskaamaksi.,%o a été défoncé@[e_fr] par un golem.,%o össze lett törve egy Gólem által.,%o è stato schiacciato da un golem.,%o はゴーレムに叩きのめされた。,%o 은(는) 골렘에게 두들겨 맞았다.,%o werd verbrijzeld door een golem.,%o ble knust av en golem.,%o został@[ao_pl] stłuczon@[adj_pl] przez golema,%o foi esmagad@[ao_ptb] por um golem.,,%o a fost lovit de un golem.,Игрока %o разбил голем.,Играча %o је смрвио голем.,%o blev krossad av en golem.,%o bir golem tarafından parçalandı.,%o потовк голем. -%o was shrieked to death by a nitrogolem.,OB_MUMMYLEADER,,,,%o byl@[ao_cs] ukřičen@[ao_cs] k smrti střelgolémem.,%o blev skriget til døde af en nitrogolem.,%o wurde von einem Nitrogolem zu Tode gekreischt.,,%o estis kriegita ĝis morto de azotgolemo.,A %o le ha chillado a muerte un gólem de ázoe.,A %o le gritó a muerte un gólem de ázoe.,%o kirkaistiin kuoliaaksi nitrogolemin toimesta.,%o s'est fait@[e_fr] percer les tympans par un nitrogolem.,%o halálra lett ijesztve egy Nitrógólem által.,%o è stato stroncato da un golem.,%o はニトロゴーレムに脅かされた。,%o 은(는) 니트로 골렘에 의해 비명횡사 당했다.,%o werd doodgekrijst door een nitrogolem.,%o ble skreket i hjel av en nitrogolem.,%o został@[ao_pl] zakrzyczan@[adj_pl] na śmierć przez nitrogolema,%o agonizou na frente de um nitrogolem.,,%o a fost chiuit până la moarte de un nitrogolem.,Игрока %o убил криком нитроголем.,Играча %o је извриштао до смрти нитроголем.,%o skrek ihjäl av en nitrogolem.,%o bir nitrogolem tarafından çığlık çığlığa öldürüldü.,%o почу@[adj_1_ua] смертельний крик нітроголема. -%o was rattled by an ophidian.,OB_SNAKE,,,,%o byl@[ao_cs] zachřestěn@[ao_cs] šupinatcem.,%o blev rystet af en ophidian.,%o hörte das Klappern des Ophidian.,,%o klakiĝis de ofidio.,A %o l@[ao_esp] ha agitado un ofidio.,A %o l@[ao_esp] sacudió un ofidio.,%o joutui käärmeolion kalkattamaksi.,%o s'est fait@[e_fr] sonner par un ophidien.,%o halálra lett csörgetve egy Ofidián által.,%o è stato stritolato da un serpente.,%o はオフィディアンに動揺した。,%o 은(는) 오피디안에게 흔들렸다.,%o werd gerammeld door een ophidiaan.,%o ble rystet av en ophidian.,%o został@[ao_pl] rozgrzechotan@[adj_pl] przez wężowatego,%o foi sacudid@[ao_ptb] por um ofídio.,,%o a fost bătut până la moarte de un ofidian.,Игрока %o потряс офидиан.,Играча %o је угризла змија.,%o blev skrämd av en ophidian.,%o bir ophidian tarafından sarsıldı.,Офідіан загриз совість %o. -%o was cursed by a wizard.,OB_WIZARD,,,,%o byl@[ao_cs] zaklet@[ao_cs] čarodějem.,%o blev forbandet af en troldmand.,%o wurde von dem Magier verflucht.,,%o malbeniĝis de sorĉisto.,A %o l@[ao_esp] ha maldecido un mago.,A %o l@[ao_esp] maldijo un hechicero.,%o joutui velhon kiroamaksi.,%o a été maudit@[e_fr] par un sorcier.,%o meg lett átkozva egy Varázsló által.,%o è stato maledetto da un mago.,%o はウィザードに呪われた。,%o 은(는) 드'스파릴의 제자에 의해 저주받았다.,%o werd vervloekt door een tovenaar.,%o ble forbannet av en trollmann.,%o został@[ao_pl] przeklęt@[adj_pl] przez czarownika,%o foi amaldiçoad@[ao_ptb] por um mago.,,%o a fost blestemat de un vrăjitor.,Игрока %o проклял колдун.,%o је проклет@[adj_1_sr] од стране чаробњака.,%o blev förbannad av en trollkarl.,%o bir büyücü tarafından lanetlendi.,%o бу@[adj_1_ua] проклят@[ao_ua] чаклуном. -%o was palpated by a wizard.,OB_WIZARDHIT,,,,%o byl@[ao_cs] prozkoumán@[ao_cs] čarodějem.,%o blev palperet af en troldmand.,%o spürte den Hauch des Magiers.,,%o palpatiĝis de sorĉisto.,A %o l@[ao_esp] ha tocado un mago.,A %o l@[ao_esp] tocó un hechicero.,%o joutui velhon tunnustelemaksi.,%o a été palpé@[e_fr] par un sorcier.,%o meg lett tapogatva egy Varázsló által.,%o è stato toccato da un mago.,%o はウィザードに触診されてしまった。,%o 은(는) 드'스파릴의 제자에게 촉진당했다.,%o werd betast door een tovenaar.,%o ble palpert av en trollmann.,%o został@[ao_pl] przebadan@[adj_pl] przez czarownika,%o foi apalpad@[ao_ptb] por um mago.,,%o a fost palpat de un vrăjitor.,Игрока %o пощупал колдун.,Играча %o је палпатирао чаробњак.,%o blev palperad av en trollkarl.,%o bir büyücü tarafından palpe edildi.,Чаклун дослідив внутрішній світ %o. -%o got staffed by %k.,OB_MPSTAFF,,,,%o dostal@[ao_cs] holí od hráče %k.,%o blev stafferet af %k.,%o wurde von %k verprügelt.,,%o bategiĝis de %k.,A %o l@[ao_esp] ha apaleado %k.,A %o l@[ao_esp] apaleó %k.,%k sauvoi %k paran.,%o s'est fait@[e_fr] matraquer par %k.,%o meg lett botozva %k által.,%o è stato preso a colpi di staffa da %k.,%o は %k の棒でぶん殴られた。,%o 은(는) %k 의 지팡이에 제압당했다.,%o kreeg een tik van %k's staf.,%o ble staffet av %k.,%o został@[ao_pl] walnięt@[adj_pl] laską przez %k,%o levou uma sova do bastão de %k.,,%o a fost bastonat de %k.,Игрок %o дополнил посох игрока %k.,%o је претуцан@[adj_1_sr] штапом од стране %k.,%o blev bemannad av %k.,"%o, %k tarafından öldüresiye dövüldü.",%o скуштува@[adj_1_ua] палицю %k. -%o got a shock from %k's gauntlets.,OB_MPGAUNTLETS,,,,%o byl@[ao_cs] prošokován@[ao_cs] rukavicemi hráče %k.,%o fik et chok af %ks handsker.,%o bekam einen Schock von %ks Handschuhen.,,%o recivis ŝokon de la fergantoj de %k.,%o ha recibido un choque de los guanteletes de %k.,%o recibió un choque de los guanteletes de %k.,%o sai sähköiskun pelaajan %k kintaista.,%o s'est pris@[e_fr] un coup de jus des gantelets de %k.,%o kapott egy sokkot %k által.,%o è stato folgorato dai guanti di %k.,%o は %k の篭手からショックを受けた。,%o 은(는) %k 가 쓰고 있는 건틀릿의 전격을 느꼈다.,%o kreeg een schok van %k's handschoenen.,%o fikk støt av %ks hansker.,%o został@[ao_pl] wstrząśnięt@[adj_pl] rękawicami %k,%o tomou um choque das manoplas de %k.,,%o a primit un șoc de la mănușile lui %k.,Игрок %o шокирован перчатками игрока %k.,%o је доби@[ao_1_sr] шок од %k штапа.,%o blev chockad av %ks handskar.,"%o, %k tarafından şoklandı.",%k використа@[adj_1_ua] зворотню дефібриляцію на %o. -%o waved goodbye to %k's elven wand.,OB_MPGOLDWAND,,,,%o zamával@[ao_cs] elfské hůlce hráče %k.,%o vinkede farvel til %ks elverstav.,%o sagte „Tschüß“ zu %ks Elfenstab.,,%o ĝisis al la elfa sorĉbastono de %k.,%o se ha despedido de la vara de elfo de %k.,%o se despidió de la vara de elfo de %k.,%o heilutti hyvästit pelaajan %k haltiasauvalle.,%o à fait coucou à la baguette magique de %k.,%o integetett egy viszlátot %k Elf Pálcájának.,%o ha fatto ciao ciao allo scettro elfico di %k.,%o は %k のエルフのワンドに別れの挨拶をした。,%o 은(는) %k 의 엘프 지팡이를 보고 작별인사를 했다.,%o zwaaide afscheid van %k's elvenstaf.,%o vinket farvel til %ks alvestav.,%o pomachał@[ao_pl] na do widzenia elfiej różdżce %k,%o deu tchauzinho para o cetro élfico de %k.,%o disse adeuzinho para o cetro élfico de %k.,%o a facut cu mână toiagului lui %k.,Игрок %o узрел прощальный взмах эльфийского жезла игрока %k.,%o је рек@[ao_2_sr] збогом %k вилењачком штапићу.,%o vinkade farväl till %ks elviga stav.,"%o, %k tarafından delik deşik edildi.",%k помаха@[adj_1_ua] ельфійським посохом на прощання %o. -%o was pegged by %k's ethereal crossbow.,OB_MPCROSSBOW,,,,%o byl@[ao_cs] prostřelen@[ao_cs] éterickou kuší hráče %k.,%o blev stukket af %ks æteriske armbrøst.,%o von %ks Armbrustbolzen aufgespießt.,,%o kejlis de la etera arbalesto de %k.,A %o l@[ao_esp] ha flechado la ballesta etérea de %k.,A %o l@[ao_esp] flechó la ballesta etérea de %k.,%k ripusti %o paran eteerivarsijousellaan.,%o s'est fait@[e_fr] clouer par l'arbalète étherique de %k.,%o fel lett rögzítve %k Éteri Nyílpuskájának által.,%o è stato inchiodato dalla balestra eterea di %k.,%o は %k のイセリアルクロスボウで釘付けにされた。,%o 은(는) %k 의 유체 쇠뇌에 의해 처박혔다.,%o was vastgepind door %k's etherische kruisboog.,%o ble truffet av %ks eteriske armbrøst.,%o został@[ao_pl] przebit@[adj_pl] przez eteryczną kuszę %k,%o foi esmigalhad@[ao_ptb] pela besta etérea de %k.,,%o a fost prins de arbaleta celestă a lui %k.,Игрок %o изранен болтами эфирного арбалета игрока %k.,%o је упуц@[adj_2_sr] од стране %k етералног самострела.,%o blev fast av %ks eteriska armborst.,"%o, %k tarafından çivilendi.",%k насипа@[adj_1_ua] %o трохи магічних болтів. -%o was blasted a new one by %k's dragon claw.,OB_MPBLASTER,,,,%o poznal@[ao_cs] středověk drakospárem hráče %k.,%o blev sprængt en ny af %ks drageklo.,%o bekam %ks Drachenklaue zu spüren.,,%o estis diseksplodita de la drakokrifo de %k.,%o ha quedado bien jodid@[ao_esp] por la garra de dragón de %k.,%o quedó irreconocible por la garra de dragón de %k.,%k puhkoi %o parkaan uuden aukon lohikäärmeenkynnellään.,%o s'est fait flinguer par la griffe draconique de %k.,%o újszerűnek látszik %k Sárkány Karomjának köszönhetően.,A %o èstato aperto un buco nuovo dall'Artiglio di Drago di %k.,%o は %k のドラゴンクローで発破体験した。,%o 은(는) %k 의 용발톱에 의해 형태를 잃었다.,%o werd opengescheurd door %k's drakenklauw.,%o fikk en ny en av %ks drageklo.,%o został wysadzony nowy otwór przez %k,%o sentiu o poder da garra de dragão de %k.,,%o a fost aruncat în aer de gheara dragonului a lui %k.,Игрок %o получил новую форму драконьим когтем игрока %k.,Играчу %o је отворена нова рупа змајевском канџом играча %k.,%o blev skjuten på nytt av %ks drakklo.,"%o, %k tarafından patlatıldı.",%o отрима@[adj_1_ua] кігтедраконових вибухів від %k. -%o got sent down under by %k's hellstaff.,OB_MPSKULLROD,,,,Pod hráčem %o se propadla zem peklopalem hráče %k.,%o blev sendt ned under jorden af %ks helvedestav.,%o brach unter %ks Höllenrute zusammen.,,%o forsendiĝis sub de la inferbastono de %k.,%o se ha inclinado ante el bastón infernal de %k.,%o se inclinó ante el bastón infernal de %k.,%k lähetti %o paran maan syövereihin hornansauvallaan.,%o repose six pieds sous terre grâce au Bâton infernal de %k.,%o le lett küldve %k Pokolbotjának köszönhetően.,%o è stato mandato sottoterra dalla Staffa Infernale di %k.,%o は %k のヘルスタッフで冥界に送られた。,%o 은(는) %k 의 지옥지팡이에 의해 저승으로 날아갔다.,%o werd door %k's hellestaf naar beneden gestuurd.,%o ble sendt til helvete av %ks helvetesstav.,%o został@[ao_pl] zesłan@[adj_pl] pod piekielny kostur %k,%o foi mandad@[ao_ptb] pra baixo do solo pelo cajado infernal de %k.,,%o a fost trimis sub bastonul infernal al lui %k.,Игрок %o сослан в самый низ посохом ада игрока %k.,%o је укопан@[adj_1_sr] од стране пакленог штапа играча %k.,%o blev nedskjuten av %ks helvetesstång.,"%o, %k tarafından biçildi.",%o па@[adj_1_ua] в самі глибини від пекельного посоху %k. -%o was scorched to cinders by %k's phoenix rod.,OB_MPPHOENIXROD,,,,%o byl@[ao_cs] spálen@[ao_cs] na prach fénixovou holí hráče %k.,%o blev brændt til aske af %ks føniksstav.,%o wurde voin %ks Phönixstab verschmort.,,%o brulegiĝis en cindrojn de la feniksvergo de %k.,A %o l@[ao_esp] ha pulverizado el báculo del Fénix de %k.,A %o l@[ao_esp] pulverizó el báculo del Fénix de %k.,%k kärvensi %o paran tuhannen päreiksi feenikssauvallaan.,%o s'est fait@[e_fr] réduire en cendres par le Bâton du Phénix de %k.,%o halomra lett égve %k Főnix Rúdjának által.,%o è stato ridotto in cenere dal Bastone della Fenice di %k.,%o は %k のフェニックスロッドで焼かれた。,%o 은(는) %k 의 불사조 지팡이 덕에 검게 익었다.,%o werd door %k's feniksstaf tot sintels verschroeid.,%o ble svidd til aske av %ks føniksstav.,%o został@[ao_pl] spalon@[adj_pl] na popiół przez różdżkę feniksa %k,%o virou cinzas com o bastão da fênix de %k.,,%o a fost făcut cenușă de joarda phoenix a lui %k.,Игрок %o сожжён до пепла жезлом феникса игрока %k.,%o запаљен@[adj_1_sr] у пепео од стране шипке феникса играча %k.,%o blev bränd till aska av %ks fenixstav.,"%o, %k tarafından cayır cayır yakıldı.",Від %o залишився тільки попіл через жезл фенікса %k. -%o was bounced by %k's firemace.,OB_MPMACE,,,,%o byl@[ao_cs] odpálen@[ao_cs] žezlometem hráče %k.,%o blev kastet afsted af %ks ildspyd.,%o prallte an %ks Feuerkeule ab.,,%o estis resaltita de la fajroklabo de %k.,%o ha rebotado en la maza de fuego de %k.,%o rebotó en la maza de fuego de %k.,%k pomputti %o parkaa tulinuijallaan.,%o a rebondi@[e_fr] sur les balles de la Masse de Feu à %k.,%o pattant egy nagyot %k Tűzbuzogányának köszönhetően.,%o è stato spazzato via dalla Mazza del Fuoco di %k.,%o は %k のファイアメイスで飛ばされた。,%o 은(는) %k 의 투사철퇴의 포탄을 맞고 튕겨져 날아갔다.,%o werd door %k's vuurknots geraakt.,%o ble kastet av %ks ildkule.,%o został@[ao_pl] wybit@[adj_pl] przez buzdygan ognia %k,%o saiu pulando após ver a clava de fogo de %k.,,%o a fost aruncat de colo colo de buzduganul de foc al lui %k.,Игрок %o отбит огненной булавой игрока %k.,%o је ударен@[adj_1_sr] са ватреним буздованом играча %k.,%o blev utvisad av %ks eldstöt,"%o, %k tarafından ezildi.",%o вбили в землю вогняною булавою %k. -%o got clapped by %k's charged staff.,OB_MPPSTAFF,,,,%o byl@[ao_cs] profackován@[ao_cs] nabitou holí hráče %k.,%o blev klappet af %ks ladede stav.,%o bekam eine Klatsche durch %ks geladenen Stab.,,%o estis aplaŭdita de la ŝargita bastono de %k.,A %o l@[ao_esp] ha apaleado el bastón cargado de %k .,A %o l@[ao_esp] apaleó el bastón cargado de %k .,%k jyrisytti %o parkaa varatulla sauvallaan.,%o à été foudroyé@[e_fr] par le bâton chargé de %k.,%o csattant egy nagyot %k Feltöltött Botjának által.,%o è scoppiato a causa della staffa incantata di %k.,%o は %k の魔力を帯びた棒で暖かく迎えられた。,%o 은(는) %k 의 마법부가 지팡이를 얻어맞았다.,%o kreeg een klap van %k's opgeladen staf.,%o ble klappet av %ks ladede stav.,%o został@[ao_pl] trzepnięt@[adj_pl] naładowaną laską %k,%o tomou uma pancada do bastão carregado de %k.,,%o a fost tăiat de bastonul încărcat al lui %k.,Игрок %o отведал заряженного посоха игрока %k.,%o је потапшан@[adj_1_sr] напуњеним штапом играча %k.,%o fick en klapp av %ks laddade stav.,"%o, %k tarafından yakıldı.",%o перечепи@[adj_2_ua] через заряджену палицю %k. -%o was bled dry by %k's gauntlets.,OB_MPPGAUNTLETS,,,,Rukavicemi hráče %k nezůstala v těle hráče %o ani kapka krve.,%o blev udblødt af %ks handsker.,%o wurde von %ks Handschuhen ausgeblutet.,,%o sensangiĝis de la fergantoj de %k.,A %o l@[ao_esp] han dejado exangüe los guanteletes de %k.,A %o l@[ao_esp] dejaron exangüe los guanteletes de %k.,%k vuodatti %o paran kuiviin kintaillaan.,%o s'est fait@[e_fr] saigner à blanc par les gantelets de %k.,%k megtanította %o-t Páncélkesztyűbe dudálni.,Il sangue di %o è stato prosciugato dai guanti di %k.,%o は %k の篭手で血を絞り取られた。,%o 은(는) %k 의 마법부가 건틀릿에 의해 바싹 말랐다.,%o werd leeggebloed door %k's handschoenen.,%o ble tappet for blod av %ks hansker.,%o wykrwawił@[ao_pl] się przez rękawice %k,%o sangrou nas manoplas de %k.,,"%o a fost stors până la ultima picătură de sânge +%o was axed by an undead warrior.,OB_BONEKNIGHT,,,,%o dostal@[ao_cs] sekyrou od nemrtvého válečníka.,%o blev øksehugget af en udød kriger.,%o wurde von dem Untoten Krieger mit der Axt bearbeitet.,,%o hakiliĝis de malmortinta batalisto.,%o ha recibido un hachazo de un guerrero no muerto.,%o recibió un hachazo de un guerrero no muerto.,%o joutui epäkuolleen soturin kirvestämäksi.,%o s'est pris@[e_fr] la hâche d'un guerrier mort-vivant.,,%o baltát kapott egy Élőhalott Harcostól.,%o è stato accettato da un guerriero non morto .,%o はアンデッド兵の斧でやられた。,%o 은(는) 언데드 전사에게 도끼질 당했다.,%o werd doorkliefd door een ondode krijger.,%o ble hugget av en udød kriger.,%o został@[ao_pl] rozłupany siekierą przez nieumarłego wojownika,%o foi decepad@[ao_ptb] por um guerreiro morto-vivo.,%o foi decapitad@[ao_ptb] por um guerreiro morto-vivo.,%o a primit un topor de la un războinic nemort.,Игрока %o зарубил воин-нежить.,%o је исечен@[adj_1_sr] од стане немртвог ратника.,%o blev yxad av en odöd krigare.,%o bir ölümsüz savaşçı tarafından baltalandı.,Воїн-нежить зарубав %o. +%o was slain by an undead warrior.,OB_BONEKNIGHTHIT,,,,%o byl@[ao_cs] zabit@[ao_cs] nemrtvým válečníkem.,%o blev dræbt af en udød kriger.,%o wurde von dem Untoten Krieger hingemetzelt.,,%o estis mortigita de malmortinta batalisto.,A %o l@[ao_esp] ha descuartizado un guerrero no muerto.,A %o l@[ao_esp] descuartizó un guerrero no muerto.,%o joutui epäkuolleen soturin tappamaksi.,%o s'est fait pourfendre par un guerrier mort-vivant.,,%o meghalt egy Élőhalott Harcos által.,%o è stato ucciso da un guerriero non morto. ,%o はアンデッド兵の手で葬られた。,%o 은(는) 언데드 전사에게 처단당했다.,%o werd gedood door een ondode krijger.,%o ble drept av en levende død kriger.,%o został@[ao_pl] zgładzon@[adj_pl] przez nieumarłego wojownika,%o foi picotad@[ao_ptb] por um guerreiro morto-vivo.,,%o a fost omorât de un războinic nemort.,Игрока %o сразил воин-нежить.,Играча %o је убио немртви ратник.,%o blev dödad av en odödlig krigare.,%o bir ölümsüz savaşçı tarafından katledildi.,%o бу@[adj_1_ua] повален@[ao_ua] воїном-нежитю. +%o was blasted into cinders by a Maulotaur.,OB_MINOTAUR,,,,%o byl@[ao_cs] rozmetán@[ao_cs] na popel Minotaurem.,%o blev sprængt i aske af en Maulotaurus.,%o wurde von dem Minotaurus in Asche verwandelt.,,%o eksplodiĝis en cindrojn de Bategtaŭro.,A %o l@[ao_esp] ha volado en cenizas un Mazotauro.,A %o l@[ao_esp] voló en cenizas un Mazotauro.,%o tuhottiin tuusan nuuskaksi maulotaurin toimesta.,%o s'est fait@[e_fr] incinérer par un Massetaure.,,%o darabokra robbant egy Maulotaurusz által.,%o è stato incenerito da un Maulotauro. ,%o はマウロタウロスに燃やされ炭化した。,%o 은(는) 몰로타우어에게 잿더미가 되도록 파괴당했다.,%o werd door een Maulotaurus tot sintels geblazen.,%o ble sprengt til aske av en Maulotaur.,%o został@[ao_pl] obrócon@[adj_pl] w popiół przez Młototaura,%o foi incinerad@[ao_ptb] por um Marretauro,,%o a fost făcut cenușă de un Maulotaur.,Игрока %o разнёс на угольки Избитавр.,%o је испуцан@[adj_1_sr] у пепео од стране минотаура.,%o blev sprängd till aska av en maulotaurus.,%o bir Maulotor tarafından kül haline getirildi.,%o бу@[adj_1_ua] стерт@[ao_ua] в пил Молотауром. +%o was pulped by a Maulotaur.,OB_MINOTAURHIT,,,,%o byl@[ao_cs] rozmáčknut@[ao_cs] Minotaurem.,%o blev knust af en Maulotaurus.,%o wurde von dem Minotaurus zu Brei verarbeitet.,,%o pulpiĝis de Bategtaŭro.,A %o l@[ao_esp] ha hecho puré un Mazotauro.,A %o l@[ao_esp] hizo puré un Mazotauro.,%o joutui maulotaurin möyhentämäksi.,%o s'est fait@[e_fr] éclater par un Massetaure.,,%o péppé lett zúzva egy Maulotaurusz által.,%o è stato ridotto in poltiglia da un Maulotauro. ,%o はマウロタウロスにグシャグシャにされた。,%o 은(는) 몰로타우어에 의해 내동댕이쳐졌다.,%o werd verpulverd door een Maulotaurus.,%o ble knust av en maulotaur.,%o został@[ao_pl] roztart@[adj_pl] na miazgę przez Młototaura,%o foi esmagad@[ao_ptb] por um Marretauro,,%o a fost descojit de un Maulotaur.,Игрока %o превратил в кровавое месиво Избитавр.,Играча %o је претукао минотаур.,%o blev krossad av en maulotaurus.,%o bir Maulotor tarafından ezildi.,Молотаур перетворив %o в криваве місиво. +%o was smashed by a golem.,OB_MUMMY,,,,%o byl@[ao_cs] umlácen@[ao_cs] golémem.,%o blev smadret af en golem.,%o wurde von einem Golem erschlagen.,,%o frakasiĝis de golemo.,A %o l@[ao_esp] ha aplastado un gólem.,A %o l@[ao_esp] aplastó un gólem.,%o joutui golemin murskaamaksi.,%o a été défoncé@[e_fr] par un golem.,,%o össze lett törve egy Gólem által.,%o è stato schiacciato da un golem.,%o はゴーレムに叩きのめされた。,%o 은(는) 골렘에게 두들겨 맞았다.,%o werd verbrijzeld door een golem.,%o ble knust av en golem.,%o został@[ao_pl] stłuczon@[adj_pl] przez golema,%o foi esmagad@[ao_ptb] por um golem.,,%o a fost lovit de un golem.,Игрока %o разбил голем.,Играча %o је смрвио голем.,%o blev krossad av en golem.,%o bir golem tarafından parçalandı.,%o потовк голем. +%o was shrieked to death by a nitrogolem.,OB_MUMMYLEADER,,,,%o byl@[ao_cs] ukřičen@[ao_cs] k smrti střelgolémem.,%o blev skriget til døde af en nitrogolem.,%o wurde von einem Nitrogolem zu Tode gekreischt.,,%o estis kriegita ĝis morto de azotgolemo.,A %o le ha chillado a muerte un gólem de ázoe.,A %o le gritó a muerte un gólem de ázoe.,%o kirkaistiin kuoliaaksi nitrogolemin toimesta.,%o s'est fait@[e_fr] percer les tympans par un nitrogolem.,,%o halálra lett ijesztve egy Nitrógólem által.,%o è stato stroncato da un golem.,%o はニトロゴーレムに脅かされた。,%o 은(는) 니트로 골렘에 의해 비명횡사 당했다.,%o werd doodgekrijst door een nitrogolem.,%o ble skreket i hjel av en nitrogolem.,%o został@[ao_pl] zakrzyczan@[adj_pl] na śmierć przez nitrogolema,%o agonizou na frente de um nitrogolem.,,%o a fost chiuit până la moarte de un nitrogolem.,Игрока %o убил криком нитроголем.,Играча %o је извриштао до смрти нитроголем.,%o skrek ihjäl av en nitrogolem.,%o bir nitrogolem tarafından çığlık çığlığa öldürüldü.,%o почу@[adj_1_ua] смертельний крик нітроголема. +%o was rattled by an ophidian.,OB_SNAKE,,,,%o byl@[ao_cs] zachřestěn@[ao_cs] šupinatcem.,%o blev rystet af en ophidian.,%o hörte das Klappern des Ophidian.,,%o klakiĝis de ofidio.,A %o l@[ao_esp] ha agitado un ofidio.,A %o l@[ao_esp] sacudió un ofidio.,%o joutui käärmeolion kalkattamaksi.,%o s'est fait@[e_fr] sonner par un ophidien.,,%o halálra lett csörgetve egy Ofidián által.,%o è stato stritolato da un serpente.,%o はオフィディアンに動揺した。,%o 은(는) 오피디안에게 흔들렸다.,%o werd gerammeld door een ophidiaan.,%o ble rystet av en ophidian.,%o został@[ao_pl] rozgrzechotan@[adj_pl] przez wężowatego,%o foi sacudid@[ao_ptb] por um ofídio.,,%o a fost bătut până la moarte de un ofidian.,Игрока %o потряс офидиан.,Играча %o је угризла змија.,%o blev skrämd av en ophidian.,%o bir ophidian tarafından sarsıldı.,Офідіан загриз совість %o. +%o was cursed by a wizard.,OB_WIZARD,,,,%o byl@[ao_cs] zaklet@[ao_cs] čarodějem.,%o blev forbandet af en troldmand.,%o wurde von dem Magier verflucht.,,%o malbeniĝis de sorĉisto.,A %o l@[ao_esp] ha maldecido un mago.,A %o l@[ao_esp] maldijo un hechicero.,%o joutui velhon kiroamaksi.,%o a été maudit@[e_fr] par un sorcier.,,%o meg lett átkozva egy Varázsló által.,%o è stato maledetto da un mago.,%o はウィザードに呪われた。,%o 은(는) 드'스파릴의 제자에 의해 저주받았다.,%o werd vervloekt door een tovenaar.,%o ble forbannet av en trollmann.,%o został@[ao_pl] przeklęt@[adj_pl] przez czarownika,%o foi amaldiçoad@[ao_ptb] por um mago.,,%o a fost blestemat de un vrăjitor.,Игрока %o проклял колдун.,%o је проклет@[adj_1_sr] од стране чаробњака.,%o blev förbannad av en trollkarl.,%o bir büyücü tarafından lanetlendi.,%o бу@[adj_1_ua] проклят@[ao_ua] чаклуном. +%o was palpated by a wizard.,OB_WIZARDHIT,,,,%o byl@[ao_cs] prozkoumán@[ao_cs] čarodějem.,%o blev palperet af en troldmand.,%o spürte den Hauch des Magiers.,,%o palpatiĝis de sorĉisto.,A %o l@[ao_esp] ha tocado un mago.,A %o l@[ao_esp] tocó un hechicero.,%o joutui velhon tunnustelemaksi.,%o a été palpé@[e_fr] par un sorcier.,,%o meg lett tapogatva egy Varázsló által.,%o è stato toccato da un mago.,%o はウィザードに触診されてしまった。,%o 은(는) 드'스파릴의 제자에게 촉진당했다.,%o werd betast door een tovenaar.,%o ble palpert av en trollmann.,%o został@[ao_pl] przebadan@[adj_pl] przez czarownika,%o foi apalpad@[ao_ptb] por um mago.,,%o a fost palpat de un vrăjitor.,Игрока %o пощупал колдун.,Играча %o је палпатирао чаробњак.,%o blev palperad av en trollkarl.,%o bir büyücü tarafından palpe edildi.,Чаклун дослідив внутрішній світ %o. +%o got staffed by %k.,OB_MPSTAFF,,,,%o dostal@[ao_cs] holí od hráče %k.,%o blev stafferet af %k.,%o wurde von %k verprügelt.,,%o bategiĝis de %k.,A %o l@[ao_esp] ha apaleado %k.,A %o l@[ao_esp] apaleó %k.,%k sauvoi %k paran.,%o s'est fait@[e_fr] matraquer par %k.,,%o meg lett botozva %k által.,%o è stato preso a colpi di staffa da %k.,%o は %k の棒でぶん殴られた。,%o 은(는) %k 의 지팡이에 제압당했다.,%o kreeg een tik van %k's staf.,%o ble staffet av %k.,%o został@[ao_pl] walnięt@[adj_pl] laską przez %k,%o levou uma sova do bastão de %k.,,%o a fost bastonat de %k.,Игрок %o дополнил посох игрока %k.,%o је претуцан@[adj_1_sr] штапом од стране %k.,%o blev bemannad av %k.,"%o, %k tarafından öldüresiye dövüldü.",%o скуштува@[adj_1_ua] палицю %k. +%o got a shock from %k's gauntlets.,OB_MPGAUNTLETS,,,,%o byl@[ao_cs] prošokován@[ao_cs] rukavicemi hráče %k.,%o fik et chok af %ks handsker.,%o bekam einen Schock von %ks Handschuhen.,,%o recivis ŝokon de la fergantoj de %k.,%o ha recibido un choque de los guanteletes de %k.,%o recibió un choque de los guanteletes de %k.,%o sai sähköiskun pelaajan %k kintaista.,%o s'est pris@[e_fr] un coup de jus des gantelets de %k.,,%o kapott egy sokkot %k által.,%o è stato folgorato dai guanti di %k.,%o は %k の篭手からショックを受けた。,%o 은(는) %k 가 쓰고 있는 건틀릿의 전격을 느꼈다.,%o kreeg een schok van %k's handschoenen.,%o fikk støt av %ks hansker.,%o został@[ao_pl] wstrząśnięt@[adj_pl] rękawicami %k,%o tomou um choque das manoplas de %k.,,%o a primit un șoc de la mănușile lui %k.,Игрок %o шокирован перчатками игрока %k.,%o је доби@[ao_1_sr] шок од %k штапа.,%o blev chockad av %ks handskar.,"%o, %k tarafından şoklandı.",%k використа@[adj_1_ua] зворотню дефібриляцію на %o. +%o waved goodbye to %k's elven wand.,OB_MPGOLDWAND,,,,%o zamával@[ao_cs] elfské hůlce hráče %k.,%o vinkede farvel til %ks elverstav.,%o sagte „Tschüß“ zu %ks Elfenstab.,,%o ĝisis al la elfa sorĉbastono de %k.,%o se ha despedido de la vara de elfo de %k.,%o se despidió de la vara de elfo de %k.,%o heilutti hyvästit pelaajan %k haltiasauvalle.,%o à fait coucou à la baguette magique de %k.,,%o integetett egy viszlátot %k Elf Pálcájának.,%o ha fatto ciao ciao allo scettro elfico di %k.,%o は %k のエルフのワンドに別れの挨拶をした。,%o 은(는) %k 의 엘프 지팡이를 보고 작별인사를 했다.,%o zwaaide afscheid van %k's elvenstaf.,%o vinket farvel til %ks alvestav.,%o pomachał@[ao_pl] na do widzenia elfiej różdżce %k,%o deu tchauzinho para o cetro élfico de %k.,%o disse adeuzinho para o cetro élfico de %k.,%o a facut cu mână toiagului lui %k.,Игрок %o узрел прощальный взмах эльфийского жезла игрока %k.,%o је рек@[ao_2_sr] збогом %k вилењачком штапићу.,%o vinkade farväl till %ks elviga stav.,"%o, %k tarafından delik deşik edildi.",%k помаха@[adj_1_ua] ельфійським посохом на прощання %o. +%o was pegged by %k's ethereal crossbow.,OB_MPCROSSBOW,,,,%o byl@[ao_cs] prostřelen@[ao_cs] éterickou kuší hráče %k.,%o blev stukket af %ks æteriske armbrøst.,%o von %ks Armbrustbolzen aufgespießt.,,%o kejlis de la etera arbalesto de %k.,A %o l@[ao_esp] ha flechado la ballesta etérea de %k.,A %o l@[ao_esp] flechó la ballesta etérea de %k.,%k ripusti %o paran eteerivarsijousellaan.,%o s'est fait@[e_fr] clouer par l'arbalète étherique de %k.,,%o fel lett rögzítve %k Éteri Nyílpuskájának által.,%o è stato inchiodato dalla balestra eterea di %k.,%o は %k のイセリアルクロスボウで釘付けにされた。,%o 은(는) %k 의 유체 쇠뇌에 의해 처박혔다.,%o was vastgepind door %k's etherische kruisboog.,%o ble truffet av %ks eteriske armbrøst.,%o został@[ao_pl] przebit@[adj_pl] przez eteryczną kuszę %k,%o foi esmigalhad@[ao_ptb] pela besta etérea de %k.,,%o a fost prins de arbaleta celestă a lui %k.,Игрок %o изранен болтами эфирного арбалета игрока %k.,%o је упуц@[adj_2_sr] од стране %k етералног самострела.,%o blev fast av %ks eteriska armborst.,"%o, %k tarafından çivilendi.",%k насипа@[adj_1_ua] %o трохи магічних болтів. +%o was blasted a new one by %k's dragon claw.,OB_MPBLASTER,,,,%o poznal@[ao_cs] středověk drakospárem hráče %k.,%o blev sprængt en ny af %ks drageklo.,%o bekam %ks Drachenklaue zu spüren.,,%o estis diseksplodita de la drakokrifo de %k.,%o ha quedado bien jodid@[ao_esp] por la garra de dragón de %k.,%o quedó irreconocible por la garra de dragón de %k.,%k puhkoi %o parkaan uuden aukon lohikäärmeenkynnellään.,%o s'est fait flinguer par la griffe draconique de %k.,,%o újszerűnek látszik %k Sárkány Karomjának köszönhetően.,A %o èstato aperto un buco nuovo dall'Artiglio di Drago di %k.,%o は %k のドラゴンクローで発破体験した。,%o 은(는) %k 의 용발톱에 의해 형태를 잃었다.,%o werd opengescheurd door %k's drakenklauw.,%o fikk en ny en av %ks drageklo.,%o został wysadzony nowy otwór przez %k,%o sentiu o poder da garra de dragão de %k.,,%o a fost aruncat în aer de gheara dragonului a lui %k.,Игрок %o получил новую форму драконьим когтем игрока %k.,Играчу %o је отворена нова рупа змајевском канџом играча %k.,%o blev skjuten på nytt av %ks drakklo.,"%o, %k tarafından patlatıldı.",%o отрима@[adj_1_ua] кігтедраконових вибухів від %k. +%o got sent down under by %k's hellstaff.,OB_MPSKULLROD,,,,Pod hráčem %o se propadla zem peklopalem hráče %k.,%o blev sendt ned under jorden af %ks helvedestav.,%o brach unter %ks Höllenrute zusammen.,,%o forsendiĝis sub de la inferbastono de %k.,%o se ha inclinado ante el bastón infernal de %k.,%o se inclinó ante el bastón infernal de %k.,%k lähetti %o paran maan syövereihin hornansauvallaan.,%o repose six pieds sous terre grâce au Bâton infernal de %k.,,%o le lett küldve %k Pokolbotjának köszönhetően.,%o è stato mandato sottoterra dalla Staffa Infernale di %k.,%o は %k のヘルスタッフで冥界に送られた。,%o 은(는) %k 의 지옥지팡이에 의해 저승으로 날아갔다.,%o werd door %k's hellestaf naar beneden gestuurd.,%o ble sendt til helvete av %ks helvetesstav.,%o został@[ao_pl] zesłan@[adj_pl] pod piekielny kostur %k,%o foi mandad@[ao_ptb] pra baixo do solo pelo cajado infernal de %k.,,%o a fost trimis sub bastonul infernal al lui %k.,Игрок %o сослан в самый низ посохом ада игрока %k.,%o је укопан@[adj_1_sr] од стране пакленог штапа играча %k.,%o blev nedskjuten av %ks helvetesstång.,"%o, %k tarafından biçildi.",%o па@[adj_1_ua] в самі глибини від пекельного посоху %k. +%o was scorched to cinders by %k's phoenix rod.,OB_MPPHOENIXROD,,,,%o byl@[ao_cs] spálen@[ao_cs] na prach fénixovou holí hráče %k.,%o blev brændt til aske af %ks føniksstav.,%o wurde voin %ks Phönixstab verschmort.,,%o brulegiĝis en cindrojn de la feniksvergo de %k.,A %o l@[ao_esp] ha pulverizado el báculo del Fénix de %k.,A %o l@[ao_esp] pulverizó el báculo del Fénix de %k.,%k kärvensi %o paran tuhannen päreiksi feenikssauvallaan.,%o s'est fait@[e_fr] réduire en cendres par le Bâton du Phénix de %k.,,%o halomra lett égve %k Főnix Rúdjának által.,%o è stato ridotto in cenere dal Bastone della Fenice di %k.,%o は %k のフェニックスロッドで焼かれた。,%o 은(는) %k 의 불사조 지팡이 덕에 검게 익었다.,%o werd door %k's feniksstaf tot sintels verschroeid.,%o ble svidd til aske av %ks føniksstav.,%o został@[ao_pl] spalon@[adj_pl] na popiół przez różdżkę feniksa %k,%o virou cinzas com o bastão da fênix de %k.,,%o a fost făcut cenușă de joarda phoenix a lui %k.,Игрок %o сожжён до пепла жезлом феникса игрока %k.,%o запаљен@[adj_1_sr] у пепео од стране шипке феникса играча %k.,%o blev bränd till aska av %ks fenixstav.,"%o, %k tarafından cayır cayır yakıldı.",Від %o залишився тільки попіл через жезл фенікса %k. +%o was bounced by %k's firemace.,OB_MPMACE,,,,%o byl@[ao_cs] odpálen@[ao_cs] žezlometem hráče %k.,%o blev kastet afsted af %ks ildspyd.,%o prallte an %ks Feuerkeule ab.,,%o estis resaltita de la fajroklabo de %k.,%o ha rebotado en la maza de fuego de %k.,%o rebotó en la maza de fuego de %k.,%k pomputti %o parkaa tulinuijallaan.,%o a rebondi@[e_fr] sur les balles de la Masse de Feu à %k.,,%o pattant egy nagyot %k Tűzbuzogányának köszönhetően.,%o è stato spazzato via dalla Mazza del Fuoco di %k.,%o は %k のファイアメイスで飛ばされた。,%o 은(는) %k 의 투사철퇴의 포탄을 맞고 튕겨져 날아갔다.,%o werd door %k's vuurknots geraakt.,%o ble kastet av %ks ildkule.,%o został@[ao_pl] wybit@[adj_pl] przez buzdygan ognia %k,%o saiu pulando após ver a clava de fogo de %k.,,%o a fost aruncat de colo colo de buzduganul de foc al lui %k.,Игрок %o отбит огненной булавой игрока %k.,%o је ударен@[adj_1_sr] са ватреним буздованом играча %k.,%o blev utvisad av %ks eldstöt,"%o, %k tarafından ezildi.",%o вбили в землю вогняною булавою %k. +%o got clapped by %k's charged staff.,OB_MPPSTAFF,,,,%o byl@[ao_cs] profackován@[ao_cs] nabitou holí hráče %k.,%o blev klappet af %ks ladede stav.,%o bekam eine Klatsche durch %ks geladenen Stab.,,%o estis aplaŭdita de la ŝargita bastono de %k.,A %o l@[ao_esp] ha apaleado el bastón cargado de %k .,A %o l@[ao_esp] apaleó el bastón cargado de %k .,%k jyrisytti %o parkaa varatulla sauvallaan.,%o à été foudroyé@[e_fr] par le bâton chargé de %k.,,%o csattant egy nagyot %k Feltöltött Botjának által.,%o è scoppiato a causa della staffa incantata di %k.,%o は %k の魔力を帯びた棒で暖かく迎えられた。,%o 은(는) %k 의 마법부가 지팡이를 얻어맞았다.,%o kreeg een klap van %k's opgeladen staf.,%o ble klappet av %ks ladede stav.,%o został@[ao_pl] trzepnięt@[adj_pl] naładowaną laską %k,%o tomou uma pancada do bastão carregado de %k.,,%o a fost tăiat de bastonul încărcat al lui %k.,Игрок %o отведал заряженного посоха игрока %k.,%o је потапшан@[adj_1_sr] напуњеним штапом играча %k.,%o fick en klapp av %ks laddade stav.,"%o, %k tarafından yakıldı.",%o перечепи@[adj_2_ua] через заряджену палицю %k. +%o was bled dry by %k's gauntlets.,OB_MPPGAUNTLETS,,,,Rukavicemi hráče %k nezůstala v těle hráče %o ani kapka krve.,%o blev udblødt af %ks handsker.,%o wurde von %ks Handschuhen ausgeblutet.,,%o sensangiĝis de la fergantoj de %k.,A %o l@[ao_esp] han dejado exangüe los guanteletes de %k.,A %o l@[ao_esp] dejaron exangüe los guanteletes de %k.,%k vuodatti %o paran kuiviin kintaillaan.,%o s'est fait@[e_fr] saigner à blanc par les gantelets de %k.,,%k megtanította %o-t Páncélkesztyűbe dudálni.,Il sangue di %o è stato prosciugato dai guanti di %k.,%o は %k の篭手で血を絞り取られた。,%o 은(는) %k 의 마법부가 건틀릿에 의해 바싹 말랐다.,%o werd leeggebloed door %k's handschoenen.,%o ble tappet for blod av %ks hansker.,%o wykrwawił@[ao_pl] się przez rękawice %k,%o sangrou nas manoplas de %k.,,"%o a fost stors până la ultima picătură de sânge de mănușile lui %k.",Игрок %o был обескровлен перчатками игрока %k.,%o је путпуно искрвари@[ao_1_sr] од рукавица играча %k.,%o blev blödd av %ks handskar.,"%o, %k tarafından kan kaybından kurutuldu.",%k висмокта@[adj_1_ua] дух %o через рукавиці. -%o was assaulted by %k's elven wand.,OB_MPPGOLDWAND,,,,%o byl@[ao_cs] napaden@[ao_cs] elfskou hůlkou hráče %k.,%o blev overfaldet af %ks elverstav.,%o wurde von %ks Elfenstab überwältigt.,,%o atakiĝis de la elfa sorĉbastono de %k.,%o ha sido asaltad@[ao_esp] por la vara de elfo de %k.,%o fue asaltad@[ao_esp] por la vara de elfo de %k.,%o joutui pelaajan %k haltiasauvan pahoinpitelemäksi.,%o à été assailli@[e_fr] par la baguette elfique de %k.,%k megbotozta %o az Elf Botjával.,%o è stato assalito dallo Scettro Elfico di %k.,%o は %k のエルフのワンドで襲われた。,%o 은(는) %k 의 마법부가 엘프 지팡이에 의해 사냥당했다.,%o werd aangevallen door %k's elvenstaf.,%o ble angrepet av %ks alvestav.,%o został@[ao_pl] zaatakowan@[adj_pl] przez elfią różdżkę %k,%o foi atacad@[ao_ptb] pelo cetro élfico de %k.,,%o a fost luat cu asalt de togaiul lui %k.,Игрок %o атакован эльфийским жезлом игрока %k.,%o је нападнут@[adj_1_sr] вилењачким штапом играча %k.,%o blev attackerad av %ks älvstav.,"%o, %k tarafından saldırıya uğradı.",%o бу@[adj_1_ua] атакований ельфійським посохом %k. -%o was shafted by %k's ethereal crossbow.,OB_MPPCROSSBOW,,,,%o byl@[ao_cs] proděravěn@[ao_cs] éterickou kuší hráče %k.,%o blev ramt af %ks æteriske armbrøst.,%o wurde von %ks Armbrustbolzen durchbohrt.,,%o akiris novan truon de etera arbalesto de %k.,%o ha sido encañonad@[ao_esp] por la ballesta etérea de %k.,%o fue encañonad@[ao_esp] por la ballesta etérea de %k.,%k joutui pelaajan %k eteerivarsijousen kepittämäksi.,%o s'est fait@[e_fr] transpercer par l'arbalète éthérique de %k.,%o megkóstolta %k Éteri Nyílpuskáját.,%o è stato impalato dalla balestra eterea di %k.,%o は %k のイセリアルクロスボウで押された。,%o 은(는) %k 의 마법부가 유체 쇠뇌에 의해 무뎌졌다.,%o werd door %k's etherische kruisboog geschaafd.,%o ble truffet av %ks eteriske armbrøst.,%o został@[ao_pl] wykiwan@[adj_pl] przez eteryczną kuszę %k,%o foi flechad@[ao_ptb] pela besta etérea de %k.,,"%o a fost pus la proțap de arbaleta celestă a lui +%o was assaulted by %k's elven wand.,OB_MPPGOLDWAND,,,,%o byl@[ao_cs] napaden@[ao_cs] elfskou hůlkou hráče %k.,%o blev overfaldet af %ks elverstav.,%o wurde von %ks Elfenstab überwältigt.,,%o atakiĝis de la elfa sorĉbastono de %k.,%o ha sido asaltad@[ao_esp] por la vara de elfo de %k.,%o fue asaltad@[ao_esp] por la vara de elfo de %k.,%o joutui pelaajan %k haltiasauvan pahoinpitelemäksi.,%o à été assailli@[e_fr] par la baguette elfique de %k.,,%k megbotozta %o az Elf Botjával.,%o è stato assalito dallo Scettro Elfico di %k.,%o は %k のエルフのワンドで襲われた。,%o 은(는) %k 의 마법부가 엘프 지팡이에 의해 사냥당했다.,%o werd aangevallen door %k's elvenstaf.,%o ble angrepet av %ks alvestav.,%o został@[ao_pl] zaatakowan@[adj_pl] przez elfią różdżkę %k,%o foi atacad@[ao_ptb] pelo cetro élfico de %k.,,%o a fost luat cu asalt de togaiul lui %k.,Игрок %o атакован эльфийским жезлом игрока %k.,%o је нападнут@[adj_1_sr] вилењачким штапом играча %k.,%o blev attackerad av %ks älvstav.,"%o, %k tarafından saldırıya uğradı.",%o бу@[adj_1_ua] атакований ельфійським посохом %k. +%o was shafted by %k's ethereal crossbow.,OB_MPPCROSSBOW,,,,%o byl@[ao_cs] proděravěn@[ao_cs] éterickou kuší hráče %k.,%o blev ramt af %ks æteriske armbrøst.,%o wurde von %ks Armbrustbolzen durchbohrt.,,%o akiris novan truon de etera arbalesto de %k.,%o ha sido encañonad@[ao_esp] por la ballesta etérea de %k.,%o fue encañonad@[ao_esp] por la ballesta etérea de %k.,%k joutui pelaajan %k eteerivarsijousen kepittämäksi.,%o s'est fait@[e_fr] transpercer par l'arbalète éthérique de %k.,,%o megkóstolta %k Éteri Nyílpuskáját.,%o è stato impalato dalla balestra eterea di %k.,%o は %k のイセリアルクロスボウで押された。,%o 은(는) %k 의 마법부가 유체 쇠뇌에 의해 무뎌졌다.,%o werd door %k's etherische kruisboog geschaafd.,%o ble truffet av %ks eteriske armbrøst.,%o został@[ao_pl] wykiwan@[adj_pl] przez eteryczną kuszę %k,%o foi flechad@[ao_ptb] pela besta etérea de %k.,,"%o a fost pus la proțap de arbaleta celestă a lui %k.",Игрок %o пробит эфирным арбалетом игрока %k.,%o је упуцан@[adj_1_sr] етеричним самострелом играча %k.,%o blev skjuten av %ks eteriska armborst.,"%o, %k tarafından şaftlandı.",%k проби@[adj_1_ua] %o магічним болтом. -%o was ripped apart by %k's dragon claw.,OB_MPPBLASTER,,,,%o byl@[ao_cs] roztrhnut@[ao_cs] naskrz drakospárem hráče %k.,%o blev flået i stykker af %ks drageklo.,%o wurde von der Drachenklaue zerrissen.,,%o disrompiĝis de la drakokrifo de %k.,A %o l@[ao_esp] ha desgarrado la garra de dragón de %k.,A %o l@[ao_esp] desgarró la garra de dragón de %k.,%k repi %o paran kappaleiksi lohikäärmeenkynnellään.,%o à été mis@[e_fr] en pièces par la griffe draconique de %k.,%o szét lett tépve %k Sárkány Karomja által.,%è stato fatto a brandelli dall'Artiglio di Drago di %k.,%o は %k のドラゴンの鉤爪でバラバラに引き裂かれた。,%o 은(는) %k 의 마법부가 용발톱에 갈기갈기 찢겨졌다.,%o werd uit elkaar gescheurd door %k's drakenklauw.,%o ble revet i filler av %ks drageklo.,%o został@[ao_pl] rozerwan@[adj_pl] przez smoczy pazur %k,%o foi cortad@[ao_ptb] pela garra de dragão de %k.,,%k a fost făcut bucăți de gheara lui %k.,Игрок %o разорван драконьим когтём игрока %k.,%o је поцепан@[adj_1_sr] змајевим канџама играча %k.,%o blev sliten i bitar av %ks drakklo.,"%o, %k tarafından parçalara ayrıldı.",%o розірвало кігтем дракона %k. -%k poured the hellstaff on %o.,OB_MPPSKULLROD,,,,Hráč %k vylil svůj peklopal na hráče %o.,%k hældte helvedesstaven ud over %o.,%k ließ den Höllenregen auf %o los.,,%k ŝutas la inferbastonon sur %o.,%k ha vertido su bastón infernal en %o.,%k vertió su bastón infernal en %o.,%k vuodatti hornansauvansa %o parkaan.,%k à versé toute la rage des enfers sur %o.,%o nem hozott esernyőt %o Pokolbot zápora ellen.,%k ha fatto sgorgare la sua Staffa Infernale su %o.,%o は %k にヘルスタッフを %p 注ぎ込まれた。,%k의 마법부가 지옥지팡이가 쏟아붓는 비를 %o 이(가) 맞았다.,%k liet de helregen los op %o.,%k helte helvetesstaven over %o.,%k polał@[ao_pl] swoim piekielnym kosturem %o,%k usou seu cajado infernal no %o.,,%k a vărsat bastonul infernal pe %o.,Игрок %k залил игрока %o горячим дождём при помощи посоха ада.,%k је просипа@[ao_1_sr] пламени штап на %o.,%k hällde helvetesstången på %o.,"%o, %k tarafından yakıldı.",%k залив %o пекельним дощем. -%o was burned down by %k's phoenix staff.,OB_MPPPHOENIXROD,,,,%o byl@[ao_cs] vyhořen@[ao_cs] fénixovou holí hráče %k.,%o blev brændt ned af %ks Føniks stav.,%o wurde von %ks Phönixstab verbrannt.,,%o torĉiĝis de la feniksvergo de %k.,A %o l@[ao_esp] ha calcinado el báculo del Fénix de %k.,A %o l@[ao_esp] calcinó el báculo del Fénix de %k.,%k poltti %o paran feenikssauvallaan.,%o à été incinéré@[e_fr] par le Bâton du Phénix de %k.,%o elégett %k Főnix Botjának által.,%o è stato incendiato dal Bastone della Fenice di %k.,%o は %k のフェニックスロッドで焼き滅ぼされた。,%o 은(는) %k 의 마법부가 불사조 지팡이에 의해 화장당했다.,%o werd afgebrand door %k's feniksstaf.,%o ble brent ned av %ks føniksstav.,%o został@[ao_pl] spalon@[adj_pl] przez różdżkę feniksa %k,%o foi queimad@[ao_ptb] pelo bastão da fênix de %k.,,%o a fost ars complet de joarda lui %k.,Игрок %o сожжён жезлом феникса игрока %k.,%o је изгоре@[ao_1_sr] шипком феникса играча %k.,%o brändes ner av %ks Fenix-stav.,"%o, %k tarafından yakıldı.",%o згорі@[adj_1_ua] через жезл фенікса %k. -%o was squished by %k's giant mace sphere.,OB_MPPMACE,,,,%o byl@[ao_cs] rozmačkán@[ao_cs] obrovskou žezlometnou koulí hráče %k.,%o blev mast af %ks ildspyd kugle.,%o wurde von %ks Feuerkeule zerquetscht.,,%o premiĝis de la grandega klubsfero de %k.,A %o l@[ao_esp] ha aplastado una esfera gigante de la maza de %k.,A %o l@[ao_esp] aplastó una esfera gigante de la maza de %k.,%k liiskasi %o paran jättiläisnuijapallollaan.,%o s'est fait@[e_fr] écraser par la balle de Masse géante de %k.,%o össze lett nyomva %k hatalmas buzogány gömbje által.,%o è stato spiaccicato da una sfera gigante della Mazza del Fuoco di %k.,%o は %k の巨大なメイススフィアで潰された。,%o 은(는) %k 의 마법부가 투사철퇴가 뿜은 거대포탄에 의해 납작해졌다.,%o werd verpletterd door %k's reusachtige strijdknots.,%o ble knust av %ks gigantiske muskatblomstkule.,%o został@[ao_pl] zmiażdżon@[adj_pl] przez ogromną kulę z buzdygana %k,%o foi esmagad@[ao_ptb] pela esfera de clava gigante de %k.,,"%o a fost strivit de globul buzduganului +%o was ripped apart by %k's dragon claw.,OB_MPPBLASTER,,,,%o byl@[ao_cs] roztrhnut@[ao_cs] naskrz drakospárem hráče %k.,%o blev flået i stykker af %ks drageklo.,%o wurde von der Drachenklaue zerrissen.,,%o disrompiĝis de la drakokrifo de %k.,A %o l@[ao_esp] ha desgarrado la garra de dragón de %k.,A %o l@[ao_esp] desgarró la garra de dragón de %k.,%k repi %o paran kappaleiksi lohikäärmeenkynnellään.,%o à été mis@[e_fr] en pièces par la griffe draconique de %k.,,%o szét lett tépve %k Sárkány Karomja által.,%è stato fatto a brandelli dall'Artiglio di Drago di %k.,%o は %k のドラゴンの鉤爪でバラバラに引き裂かれた。,%o 은(는) %k 의 마법부가 용발톱에 갈기갈기 찢겨졌다.,%o werd uit elkaar gescheurd door %k's drakenklauw.,%o ble revet i filler av %ks drageklo.,%o został@[ao_pl] rozerwan@[adj_pl] przez smoczy pazur %k,%o foi cortad@[ao_ptb] pela garra de dragão de %k.,,%k a fost făcut bucăți de gheara lui %k.,Игрок %o разорван драконьим когтём игрока %k.,%o је поцепан@[adj_1_sr] змајевим канџама играча %k.,%o blev sliten i bitar av %ks drakklo.,"%o, %k tarafından parçalara ayrıldı.",%o розірвало кігтем дракона %k. +%k poured the hellstaff on %o.,OB_MPPSKULLROD,,,,Hráč %k vylil svůj peklopal na hráče %o.,%k hældte helvedesstaven ud over %o.,%k ließ den Höllenregen auf %o los.,,%k ŝutas la inferbastonon sur %o.,%k ha vertido su bastón infernal en %o.,%k vertió su bastón infernal en %o.,%k vuodatti hornansauvansa %o parkaan.,%k à versé toute la rage des enfers sur %o.,,%o nem hozott esernyőt %o Pokolbot zápora ellen.,%k ha fatto sgorgare la sua Staffa Infernale su %o.,%o は %k にヘルスタッフを %p 注ぎ込まれた。,%k의 마법부가 지옥지팡이가 쏟아붓는 비를 %o 이(가) 맞았다.,%k liet de helregen los op %o.,%k helte helvetesstaven over %o.,%k polał@[ao_pl] swoim piekielnym kosturem %o,%k usou seu cajado infernal no %o.,,%k a vărsat bastonul infernal pe %o.,Игрок %k залил игрока %o горячим дождём при помощи посоха ада.,%k је просипа@[ao_1_sr] пламени штап на %o.,%k hällde helvetesstången på %o.,"%o, %k tarafından yakıldı.",%k залив %o пекельним дощем. +%o was burned down by %k's phoenix staff.,OB_MPPPHOENIXROD,,,,%o byl@[ao_cs] vyhořen@[ao_cs] fénixovou holí hráče %k.,%o blev brændt ned af %ks Føniks stav.,%o wurde von %ks Phönixstab verbrannt.,,%o torĉiĝis de la feniksvergo de %k.,A %o l@[ao_esp] ha calcinado el báculo del Fénix de %k.,A %o l@[ao_esp] calcinó el báculo del Fénix de %k.,%k poltti %o paran feenikssauvallaan.,%o à été incinéré@[e_fr] par le Bâton du Phénix de %k.,,%o elégett %k Főnix Botjának által.,%o è stato incendiato dal Bastone della Fenice di %k.,%o は %k のフェニックスロッドで焼き滅ぼされた。,%o 은(는) %k 의 마법부가 불사조 지팡이에 의해 화장당했다.,%o werd afgebrand door %k's feniksstaf.,%o ble brent ned av %ks føniksstav.,%o został@[ao_pl] spalon@[adj_pl] przez różdżkę feniksa %k,%o foi queimad@[ao_ptb] pelo bastão da fênix de %k.,,%o a fost ars complet de joarda lui %k.,Игрок %o сожжён жезлом феникса игрока %k.,%o је изгоре@[ao_1_sr] шипком феникса играча %k.,%o brändes ner av %ks Fenix-stav.,"%o, %k tarafından yakıldı.",%o згорі@[adj_1_ua] через жезл фенікса %k. +%o was squished by %k's giant mace sphere.,OB_MPPMACE,,,,%o byl@[ao_cs] rozmačkán@[ao_cs] obrovskou žezlometnou koulí hráče %k.,%o blev mast af %ks ildspyd kugle.,%o wurde von %ks Feuerkeule zerquetscht.,,%o premiĝis de la grandega klubsfero de %k.,A %o l@[ao_esp] ha aplastado una esfera gigante de la maza de %k.,A %o l@[ao_esp] aplastó una esfera gigante de la maza de %k.,%k liiskasi %o paran jättiläisnuijapallollaan.,%o s'est fait@[e_fr] écraser par la balle de Masse géante de %k.,,%o össze lett nyomva %k hatalmas buzogány gömbje által.,%o è stato spiaccicato da una sfera gigante della Mazza del Fuoco di %k.,%o は %k の巨大なメイススフィアで潰された。,%o 은(는) %k 의 마법부가 투사철퇴가 뿜은 거대포탄에 의해 납작해졌다.,%o werd verpletterd door %k's reusachtige strijdknots.,%o ble knust av %ks gigantiske muskatblomstkule.,%o został@[ao_pl] zmiażdżon@[adj_pl] przez ogromną kulę z buzdygana %k,%o foi esmagad@[ao_ptb] pela esfera de clava gigante de %k.,,"%o a fost strivit de globul buzduganului lui %k.",Игрок %o раздавлен огромной сферой из огненной булавы %k.,%o је смрвљен@[adj_1_sr] од стане огромном сферско буздована играча %k.,%o blev mosad av %ks gigantiska eldstötsfär.,"%o, %k tarafından ezildi.",%k розчави@[adj_1_ua] %o велитенською вогняною сферою. -,,Hexen,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Pickup,,,,,,,,,,,,,,,,,,,,,,,,,, -Blue Mana,TXT_MANA_1,,,,Modrá mana,Blå Mana,Blaues Mana,,Blua Manao,Maná Azul,,Sininen mana,Mana Bleu,Kék Mana,Mana blu,青マナ,청색 마나,Blauwe Mana,Blå Mana,Niebieska Mana,Mana Azul,,Mană Albastră,Синяя мана,Плава мана,Blå Mana,Mavi Mana,Синя мана -Green Mana,TXT_MANA_2,,,,Zelená mana,Grøn Mana,Grünes Mana,,Verda Manao,Maná Verde,,Vihreä mana,Mana Vert,Zöld Mana,Mana verde,緑マナ,녹색 마나,Groene Mana,Grønn Mana,Zielona Mana,Mana Verde,,Mană Verde,Зелёная мана,Зелена мана,Grön Mana,Yeşil Mana,Зелена мана -Combined Mana,TXT_MANA_BOTH,,,,Smíšená mana,Kombineret Mana,Kombiniertes Mana,,Kuna Manao,Maná Combinado,,Yhdistetty mana,Mana Combiné,Kombinált Mana,Mana misto,複合マナ,윰합된 마나,Gecombineerde Mana,Kombinert mana,Połączona Mana,Mana Combinado,,Mană Mixtă,Общая мана,Комбинована мана,Kombinerad Mana,Kombine Mana,Комбінована мана -Steel Key,TXT_KEY_STEEL,,,,Ocelový klíč,Stålnøgle,Stahlschlüssel,Ατσάλινο Κλειδί,Ŝtala Ŝlosilo,Llave de Acero,,Teräsavain,Clé d'Acier,Acél Kulcs,Chiave d'acciaio,鋼の鍵,강철 열쇠,Stalen Sleutel,Stålnøkkel,Stalowy Klucz,Chave de Aço,,Cheia din Oțel,Стальной ключ,Челични кључ,Stålnyckel,Çelik Anahtar,Сталевий ключ -Cave Key,TXT_KEY_CAVE,,,,Klíč od jeskyně,Hule-nøgle,Höhlenschlüssel,,Kavern-Ŝlosilo,Llave de la Caverna,,Luola-avain,Clé de la Cave,Barlang Kulcs,Chiave della caverna,洞窟の鍵,동굴 열쇠,Grotsleutel,Hulenøkkel,Klucz do Jaskini,Chave da Caverna,,Cheia Peșterii,Пещерный ключ,Пећински кључ,Grottnyckel,Mağara Anahtarı,Печерний ключ -Axe Key,TXT_KEY_AXE,,,,Sekyrový klíč,Økse-nøgle,Axtschlüssel,,Hakil-Ŝlosilo,Llave de Hacha,,Kirvesavain,Clé de la Hache,Fejsze Kulcs,Chiave dell'ascia,斧の鍵,도끼 열쇠,Bijlsleutel,Økse-nøkkel,Klucz-topór,Chave do Machado,,Cheia Topor,Топор-ключ,Кључ секира,Yxnyckel,Balta Anahtarı,Сокирний ключ -Fire Key,TXT_KEY_FIRE,,,,Ohnivý klíč,Ild-nøgle,Feuerschlüssel,,Fajro-Ŝlosilo,Llave de Fuego,,Tuliavain,Clé du Feu,Tűz Kulcs,Chiave del fuoco,炎の鍵,불 열쇠,Vuursleutel,Ildnøkkel,Ognisty Klucz,Chave do Fogo,,Cheia de Foc,Огненный ключ,Огњени кључ,Eldnyckel,Yangın Anahtarı,Вогняний ключ -Emerald Key,TXT_KEY_EMERALD,,,,Smaragdový klíč,Smaragdnøgle,Smaragdschlüssel,,Smerelda Ŝlosilo,Llave Esmeralda,,Smaragdiavain,Clé d'Emeraude,Smaragd Kulcs,Chiave di smeraldo,翠玉の鍵,에메랄드 열쇠,Smaragden Sleutel,Smaragdnøkkel,Szmaragdowy Klucz,Chave de Esmeralda,,Cheia din Smarald,Изумрудный ключ,Смарагдни кључ,Smaragdnyckel,Zümrüt Anahtar,Смарагдовий ключ -Dungeon Key,TXT_KEY_DUNGEON,,,,Klíč od žaláře,Dungeon-nøgle,Kerkerschlüssel,,Karcer-Ŝlosilo,Llave del Calabozo,,Tyrmän avain,Clé du Donjon,Várbörtön Kulcs,Chiave del sotterraneo,迷宮の鍵,지하감옥 열쇠,Kerkersleutel,Dungeon-nøkkel,Klucz do Lochu,Chave da Masmorra,,Cheia Temniței,Ключ от подземелья,Кључ од лагума,Kerker-nyckel,Zindan Anahtarı,Ключ від підземелля -Silver Key,TXT_KEY_SILVER,,,,Stříbrný klíč,Sølvnøgle,Silberschlüssel,Ασυμένιο Κλειδί,Arĝenta Ŝlosilo,Llave de Plata,,Hopea-avain,Clé d'Argent,Ezüst Kulcs,Chiave d'argento,銀の鍵,은 열쇠,Zilveren Sleutel,Sølvnøkkel,Srebrny Klucz,Chave de Prata,,Cheia din Argint,Серебряный ключ,Сребрни кључ,Silvernyckel,Gümüş Anahtar,Срібний ключ -Rusted Key,TXT_KEY_RUSTED,,,,Zrezivělý klíč,Rustet nøgle,Rostiger Schlüssel,Σκουριασμένο Κλειδί,Rusta Ŝlosilo,Llave Oxidada,,Ruosteinen avain,Clé Rouillée,Rozsdás Kulcs,Chiave arrugginita,錆びた鍵,녹슨 열쇠,Geroeste Sleutel,Rustet nøkkel,Zardzewiały Klucz,Chave Enferrujada,,Cheia Ruginită,Ржавый ключ,Зарђали кључ,Rostad nyckel,Paslı Anahtar,Іржавий ключ -Horn Key,TXT_KEY_HORN,,,,Parožní klíč,Hornnøgle,Hornschlüssel,,Hup-Ŝlosilo,Llave de Cuerno,,Sarviavain,Clé Corne,Szarv Kulcs,Chiave del corno,角の鍵,뿔 열쇠,Hoornsleutel,Horn-nøkkel,Rogowy Klucz,Chave do Chifre,,Cheia Corn,Роговой ключ,Рогати кључ,Horn-nyckel,Korna Anahtarı,Ріговий ключ -Swamp Key,TXT_KEY_SWAMP,,,,Klíč od bažiny,Sumpnøgle,Sumpfschlüssel,,Marĉo-Ŝlosilo,Llave del Pantano,,Suoavain,Clé des Marécages,Mocsár Kulcs,Chiave della palude,沼の鍵,늪지대 열쇠,Moerassleutel,Sumpnøkkel,Bagienny Klucz,Chave do Pântano,,Cheia Mlaștinii,Болотный ключ,Мочварни кључ,Träsknyckel,Bataklık Anahtarı,Болотний ключ -Castle Key,TXT_KEY_CASTLE,,,,Klíč od hradu,Slotsnøgle,Burgschlüssel,,Kastel-Ŝlosilo,Llave del Castillo,,Linnan avain,Clé du Château,Kastély Kulcs,Chiave del castello,城の鍵,성 열쇠,Kasteelsleutel,Slottsnøkkel,Klucz do Zamku,Chave do Castelo,,Cheia Castelului,Ключ от замка,Кључ од замка,Slottsnyckel,Kale Anahtarı,Ключ від фортеці -Icon of the Defender,TXT_ARTIINVULNERABILITY2,,,,Obráncova ikona,Ikon af forsvareren,Ikone des Verteidigers,,Ikono de la Defendanto,Icono del Defensor,Ícono del Defensor,Puolustajan ikoni,Icône du Défenseur,Védelmező Ikonja,Icona del difensore,守護者の像,수호의 성상,Symbool van de Verdediger,Forsvarerens ikon,Ikona Obrońcy,Ícone do Defensor,,Imaginea Apărătorului,Символ защитника,Симбол браниоца,Försvararens ikon,Savunucunun Simgesi,Символ захисника -Dark Servant,TXT_ARTISUMMON,,,,Temný služebník,Mørk tjener,Dunkler Diener,,Malluma Servanto,Sirviente Oscuro,,Pimeä palvelija,Serviteur Noir,Árny Szolga,Servitore oscuro,闇の従者,어둠의 하인,Donkere Dienaar,Mørk tjener,Mroczny Sługa,Servo Negro,,Servitor Întunecat,Тёмный слуга,Мрачни слуга,Mörk tjänare,Karanlık Hizmetkar,Темний слуга -Porkalator,TXT_ARTIEGG2,,,,Vepřovitel,,,,Porkigilo,Porcinador,,Sikaannuttaja,Porcificateur,Ártányátok,Porchificatore,ポークレイター,돈육기,,,Schabowator,Porquificador,,Porcolator,Свиновизатор,Свињатор,,,Захрюкувач -Flechette,TXT_ARTIPOISONBAG,,,,Střelka,,,,Flakono,,,,Fléchette,Flakon,Fiaschetta,フレチェット,플레셰트,,,Flaszka,,,Flacon,Флешетта,Бочица,,,Флешета -Banishment Device,TXT_ARTITELEPORTOTHER,,,,Vyhošťovač,Forvisningsanordning,Verbannungsgerät,,Forpelilo,Dispositivo de Desvanecimiento,,Häivytyskoje,Outil de Banissement,Száműző,Artifatto dell'esilio,追放のデバイス,소멸 장치,Verbanningsapparaat,Forvisningsanordning,Urządzenie Wygnania ,Dispositivo do Banimento,,Dispozitiv al Alungării,Устройство изгнания,Амблем прогањања,Förvisningsenhet,Sürgün Cihazı,Пристрій заслання -Boots of Speed,TXT_ARTISPEED,,,,Běhuté boty,Støvler af hastighed,Turbo-Stiefel,,Botoj de Rapideco,Botas de Velocidad,,Ripeyssaappaat,Bottes de Célérité,Sebesség Cipője,Stivali della velocità,素早さの靴,속도의 신발,Snelheidslaarzen,Støvler av fart,Buty Szybkości,Botas da Velocidade,,Bocancii Vitezei,Сапоги-скороходы,Брзинске чизме,Snabbhetens stövlar,Hız Çizmeleri,Семимильні чоботи -Krater of Might,TXT_ARTIBOOSTMANA,,,,Kalich síly,Krater of Might,Kelch der Macht,,Kratero de Potenco,Vasija de Fuerza,,Mahtikrateeri,Cratère de Pouvoir,Hatalom Krátere,Calice della forza,魔力の盃,힘의 향로,Beker van Macht,Krater av makt,Czara mocy,Cálice do Poder,,Pocal al Puterii,Чаша могущества,Чаша силе,Mäktighetens krater,Kudret Krateri,Чаша міці -Dragonskin Bracers,TXT_ARTIBOOSTARMOR,,,,Dračí nátepníky,Drageskindsarmbøjler,Drachenhaut-Armschutz,,Brakbendo el Drakhaŭto,Brazaletes de piel de Dragón,,Lohikäärmeennahkarannesuojat,Bracelets en Peau de Dragon,Sárkánybőr Karkötők,Bracciali in pelle di drago,竜皮の小手,용가죽 팔찌,Drakenhuidbescherming,Dragehud-bindinger,Karwasze ze Smoczej Skóry,Braçadeiras de Pele de Dragão,,Brățări din Piele de Dragon,Наручи из драконьей кожи,Наруквице од змајеве коже,Drakskinnsarmbågar,Ejderha Derisi Bilezikler,Наручі зі шкіри дракона -Disc of Repulsion,TXT_ARTIBLASTRADIUS,,,,Kotouč odpuzení,Skive af frastødning,Rückstoßscheibe,,Disko de Repelado,Disco de Repulsión,,Karkotuskiekko,Disque de Répulsion,Visszaverés Lemeze,Disco della repulsione,反発の円盤,방탄의 원반,Schijf van Afstoting,Frastøtelsesskive,Dysk Odpychania,Disco da Repulsão,,Disc al Repulsiei,Диск отторжения,Диск одбијања,Skiva av avstötning,İtme Diski,Диск відштовхування -Mystic Ambit Incant,TXT_ARTIHEALINGRADIUS,,,,Tajemný čár koljdoucí,Mystic Ambit Incant,Verbannungsgerät,,Sorĉo de Mistika Sfero,Encanto de Ámbito Místico,,Mystisen piirin loitsu,Incantation Mystique,Misztikus Mágialista,Confine mistico,魅知国の秘法,신비 영역의 주문,,Mystic Ambit-besvergelse,Inkantancja Mistycznego Kręgu,Encanto Místico,,Pergament Mistic,Чары магического единства,Чаролија магичног јединства,,Mistik Ambit Büyüsü,Закляття містичної області -Yorick's Skull,TXT_ARTIPUZZSKULL,,,,Jorikova lebka,Yoricks kranium,Yoricks Schädel,,Kranio de Yorick,Calavera de Yorick,,Yorickin kallo,Crâne de Yorick,Yorick Koponyája,Teschio di Yorick,ヨリックの髑髏,요릭의 두개골,Yorick's Schedel,Yoricks hodeskalle,Czaszka Yoricka,Caveira de Yorick,,Craniul lui Yorick,Череп Йорика,Јорикова лобања,Yoricks skalle,Yorick'in Kafatası,Череп Йоріка -Heart of D'sparil,TXT_ARTIPUZZGEMBIG,,,,Srdce D'Sparila,D'sparils hjerte,D'Sparils Herz,,Koro de D'sparil,Corazón de D'Sparil,,D'Sparilin sydän,Cœur de D'Sparil,D'Sparil szíve,Cuore di d'sparil,デ'スパリルの心,드'스파릴의 심장,Hart van D'sparil,D'Sparils hjerte,Serce D'Sparila,Coração de D'Sparil,,Inima lui D'Sparil,Сердце Д'Спарила,Д'Спарилино срце,D'sparils hjärta,D'sparil'in Kalbi,Серце Д'Спаріла -Ruby Planet,TXT_ARTIPUZZGEMRED,,,,Rubínová planeta,Rubinplanet,Rubinplanet,,Rubena Planedo,Planeta Rubí,,Rubiiniplaneetta,Planète de Rubis,Rubin Bolygó,Pianeta di rubino,ルビーの宝石,루비 행성석,Robijnrode Planeet,Rubinplaneten,Rubinowa Planeta,Planeta Rubi,,Planetă din Rubin,Рубиновая планета,Планета рубина,Rubinplanet,Yakut Gezegeni,Рубінова планета -Emerald Planet,TXT_ARTIPUZZGEMGREEN1,,,,Smaragdová planeta,Smaragdplanet,Smaragdplanet,,Smeralda Planedo,Planeta Esmeralda,,Smaragdiplaneetta,Planète d'Emeraude,Smaragd Bolygó,Pianeta di smeraldo,エメラルドの宝石,에메랄드 행성석 (1),Smaragdgroene Planeet,Smaragdplaneten,Szmaragdowa Planeta,Planeta Esmeralda,,Planetă din Smarald,Изумрудная планета,Смарагдна планета,Smaragdplanet,Zümrüt Gezegen,Смарагдова планета -Emerald Planet,TXT_ARTIPUZZGEMGREEN2,,,,Smaragdová planeta,Smaragdplanet,Smaragdplanet,,Smeralda Planedo,Planeta Esmeralda,,Smaragdiplaneetta,Planète de Saphir,Smaragd Bolygó,Pianeta di smeraldo,エメラルドの宝石,에메랄드 행성석 (2),Smaragdgroene Planeet,Smaragdplaneten,Szmaragdowa Planeta,Planeta Esmeralda,,Planetă din Smarald,Изумрудная планета,Смарагдна планета,Smaragdplanet,Zümrüt Gezegen,Смарагдова планета -Sapphire Planet,TXT_ARTIPUZZGEMBLUE1,,,,Safírová planeta,Safirplanet,Saphirplanet,,Safira Planedo,Planeta Zafiro,,Safiiriplaneetta,Planète de Saphir,Zafír Bolygó,Pianeta di zaffiro,サファイアの宝石,사파이어 행성석 (1),Saffierblauwe Planeet,Safirplaneten,Szafirowa Planeta,Planeta Safira,,Planetă din Safir,Сапфировая планета,Сафирна планета,Safirplanet,Safir Gezegen,Сапфірова планета -Sapphire Planet,TXT_ARTIPUZZGEMBLUE2,,,,Safírová planeta,Safirplanet,Saphirplanet,,Safira Planedo,Planeta Zafiro,,Safiiriplaneetta,Planète de Saphir,Zafír Bolygó,Pianeta di zaffiro,サファイアの宝石,사파이어 행성석 (2),Saffierblauwe Planeet,Safirplaneten,Szafirowa Planeta,Planeta Safira,,Planetă din Safir,Сапфировая планета,Сафирна планета,Safirplanet,Safir Gezegen,Сапфірова планета -Daemon Codex,TXT_ARTIPUZZBOOK1,,,,,,,,Kodekso de Demono,Códice del Demonio,,Daemon-koodeksi,Codex Démoniaque,Démon Kódex,Codice Demoniaco ,デーモンの写本,악마의 고문서,,,Demoniczny Kodeks,Códice Demoníaco,,Codexul Demonilor,Демонический кодекс,Демонски кодекс,,,Демонічний кодекс -Liber Oscura,TXT_ARTIPUZZBOOK2,,,,,,,,,,,,,,,オスキュラ公文書,어둠의 자유서,,,Liber Oscura,,,,Либер Оскура,Либер Оскура,,,Лібер Оскура -Flame Mask,TXT_ARTIPUZZSKULL2,,,,Plamenná maska,Flammemaske,Flammenmaske,,Flamomasko,Máscara de llamas,,Liekkinaamio,Masque de Flammes,Láng Maszk,Maschera delle fiamme,炎の仮面,화염의 가면,Vuurmasker,Flammemaske,Maska Płomieni,Máscara das Chamas,,Mască de Foc,Маска пламени,Маска пламена,Flam-mask,Alev Maskesi,Полум'яна маска -Glaive Seal,TXT_ARTIPUZZFWEAPON,,,,Glévská pečeť,Glasur-segl,Schwetsiegel,,Sigelo de Glavo,Sello de Espada,,Miekkasinetti,Sceau du Glaive,Pallos Pecsét,Sigillo della brando,グレイブシール,밀폐된 칼날,Lanszegel,Glaive segl,Pieczęć Glewii,Selo do Gládio,,Sigiliu Spadă,Печать воителя,Војников печат,Glasögonsegel,Glaive Mühür,Воїнська печатка -Holy Relic,TXT_ARTIPUZZCWEAPON,,,,Svatá relikvie,Hellig relikvie,Heiliges Relikt,,Sankta Relikvo,Santa Reliquia,,Pyhä reliikki,Relique Sacrée,Szent Ereklye,Reliquia sacra,聖遺物,신성한 유물,Heilige Relikwie,Hellig relikvie,Święta Relikwia,Relíquia Sagrada,,Relicvă Sfântă,Святая реликвия,Света реликвија,Heliga reliker,Kutsal Emanet,Свята реліквія -Sigil of the Magus,TXT_ARTIPUZZMWEAPON,,,,Mágovo sigilium,Magus' segl,Symbol des Magiers,,Sigelo de la Mago,Emblema del Mago,,Taikurin sinetti,Sceau du Mage,Mágus Pecsétje,Suggello del magus,メイガスの印章,마거스의 인장,Sigaar van de Magus,Magusens segl,Emblemat Maga,Sigilo do Mago,,Sigiliul Magului,Печать Мага,Чаробњаков симбол,Magikerns sigill,Büyücünün Sigil'i,Знак магів -Clock Gear,TXT_ARTIPUZZGEAR,,,,Ozubené kolečko,Urværk,Zahnrad,,Dentrado de Horloĝo,Engranaje de reloj,,Kellonratas,Rouage d'Horloge,Óra Szerkezet,Ingranaggio d'orologio,時計の歯車,시계 톱니바퀴,Kloktandwiel,Klokkeutstyr,Mechanizm Zegara,Engrenagem de Relógio,,Mecanism Ceas,Часовая шестерня,Сатни зупчаник,Klockan växel,Saat Dişlisi,Механічна шестерня -You Cannot Use This Here,TXT_USEPUZZLEFAILED,,,,Zde se tento předmět použít nedá,Du kan ikke bruge dette her,Das kannst du hier nicht benutzen,,Vi ne povas uzi ĉi tion ĉi tie.,No puedes usar esto aquí,,Et voi käyttää tätä tässä,Vous ne pouvez pas utiliser cela ici.,Ezt Itt Nem Használhatod,Non puoi usare questo oggetto qui,ここでは使用できない,이것은 여기에 사용할 수 없다,Dat kan je hier niet gebruiken,Du kan ikke bruke dette her,Nie możesz użyć tego tutaj,Você não pode usar isso aqui,Não podes usar isto aqui,Nu Poți Folosi Asta Aici,Здесь это невозможно использовать,Ово се не може користити овде,Du kan inte använda detta här,Bunu Burada Kullanamazsınız,Ви не можете використати тут це -Mesh Armor,TXT_ARMOR1,,,Mesh Armour,Kroužkové brnění,,Kettenrüstung,,Marŝkiraso,Armadura de Malla,,Rengashaarniska,Armure de Mailles,Háló Páncél,Maglia metallica,鎖帷子,사슬 갑옷,Maliënkolder,Nettrustning,Kolczuga,Armadura de Malha,,Armură din Zale,Кольчуга,Верижњача,Nätrustning,Örgü Zırh,Кольчуга -Falcon Shield,TXT_ARMOR2,,,,Sokolí štít,Falke-skjold,Falkenschild,,Falko-Ŝildo,Escudo de Halcón,,Haukkakilpi,Bouclier du Faucon,Sólyom Pajzs,Scudo del falco,鷹の盾,팔콘 방패,Valkenschild,Falkeskjold,Sokola Tarcza,Escudo do Falcão,,Scut Șoim,Соколиный щит,Соколов штит,Falken-sköld,Falcon Kalkanı,Соколиний щит -Platinum Helmet,TXT_ARMOR3,,,,Platinová helma,Platin-hjelm,Platinhelm,,Platena Kasko,Casco de Platino,,Platinakypärä,Casque de Platine,Platina Sisak,Elmo di platino,白金の兜,백금 투구,Platina Helm,Platinahjelm,Platynowy Hełm,Capacete de Platina,,Coif de Platină,Платиновый шлем,Шлем од платине,Platinahjälm,Platin Kask,Платиновий шолом -Amulet of Warding,TXT_ARMOR4,,,,Amulet uhýbání,Amulet af afværge,Wachamulett,,Amuleto de Gardado,Amuleto de Guarda,,Suojelusamuletti,Amulette de Protection,Oltalom Amulettje,Amuleto di protezione,回避の護符,수호의 부적,Amulet van Bescherming,Amulett av beskyttelse,Amulet Ochrony,Amuleto da Proteção,,Amuleta Protecției,Амулет стража,Амулет страже,Amulett för skydd,Korunma Tılsımı,Амулет вартового -Timon's Axe,TXT_WEAPON_F2,,,,Timonova sekera,Timons økse,Timons Axt,,Hakilo de Timon,Hacha de Timón,,Timonin kirves,Hache de Timon,Timon Baltája,Ascia di timon,タイモンの斧,티몬의 도끼,Timon's Bijl,Timons øks,Topór Timona,Machado de Timon,,Toporul lui Timon,Топор Тимона,Тимонова секира,Timons yxa,Timon'un Baltası,Тімонова сокира -Hammer of Retribution,TXT_WEAPON_F3,,,,Kladivo odplaty,Gengældelsens hammer,Hammer der Rache,,Martelo de Repago,Martillo de Retribución,,Koston vasara,Marteau de la Rétribution,Kárhozat Kalapácsa,Martello del castigo,報復の金槌,징벌의 망치,Hamer der Vergelding,Gjengjeldelsens hammer,Młot Odkupienia,Martelo da Retribuição,,Ciocanul Salvării,Молот возмездия,Чекић одмазде,Hämndhammaren,İntikam Çekici,Молот відплати -Quietus Assembled,TXT_WEAPON_F4,,,,Složený Tišitel,Forløser samlet,Erlöser komplettiert,,Kvietus' Muntita,Quietus Ensamblado,,Quietus koottuna,Quietus Assemblée,Némusz Összerakva,Quietus assemblato,組み立てた 死滅の剣,완성된 종언의 검,Quietus in elkaar gezet,Quietus samlet,Złożony Uciszacz,Quietus Montada,,Argument Final Asamblat,Последний довод собран воедино,Самрт је сабрана,Quietus monterad,Quietus Birleştirildi,Упокій зібрано воєдино -Serpent Staff,TXT_WEAPON_C2,,,,Hadí hůl,Slange-stav,Schlangenstab,,Serpentbastono,Vara de Serpiente,,Käärmesauva,Sceptre du Serpent,Kígyó Bot,Bastone del serpente,蛇の杖,뱀 지팡이,Slangenstaf,Slangestav,Laska Węży,Cetro da Serpente,,Bastonul Șarpelui,Змеиный посох,Змијски штап,Ormens stav,Yılan Asa,Посох змія -Firestorm,TXT_WEAPON_C3,,,,Ohnivá bouře,Ildstorm,Feuersturm,,Fajroŝtormo,Tormenta de Fuego,,Tulimyrsky,Tempête de Feu,Tűzvihar,Tempesta di fuoco,ファイアストーム,화염폭풍,Vuurstorm,Ildstorm,Burza Ognia,Tempestade-de-Fogo,,Furtună de Foc,Огненный шторм,Огњена олуја,Eldstorm,Ateş Fırtınası,Вогняний шторм -Wraithverge Assembled,TXT_WEAPON_C4,,,,Složený Zjevitel,Spirit Bringer samlet,Geisterbringer komplettiert,,Fantomkruc' Muntita,Báculo Fantasmal Ensamblado,Vara Fantasmal Ensamblada,Haamusauva koottuna,Verge Phantasmale Assemblée,Bosszúbot Összerakva,Verga Sconfinaspettri assemblata,組み立てた レイスバージ,완성된 사령의 십자가,Schimroede in elkaar gezet,Wraithverge samlet,Złożony Widmoskraj,Cajado Fantasma Montado,,Toiag Stafie Asamblat,Жезл духов собран воедино,Жезло утвара је сабрано,Wraithverge monterad,Wraithverge Birleştirildi,Символ Мари зібрано воєдино -Frost Shards,TXT_WEAPON_M2,,,,Ledové střepy,Frostskår,Frostsplitter,,Frostfragmentoj,Fragmentos de Escarcha,,Pakkassirpaleet,Eclats de Givre,Fagyos Szilánkok,Frantumi gelati,フロスト シャード,얼음 파편,Vorstscherven,Frostskår,Lodowe Odłamki,Fragmentos de Geada,,Cioburi de Gheață,Ледяные осколки,Ледене крхотине,Frostskärvor,Buz Kırıkları,Льодяні уламки -Arc of Death,TXT_WEAPON_M3,,,,Jiskry smrti,Dødens bue,Todesblitz,,Arko de Morto,Arcos de la Muerte,,Kuolonkaari,Foudre Mortelle,Halál Boltíve,Arco della morte,死の円弧,죽음의 번갯불,Doodsboog,Dødens bue,Łuk Śmierci,Arcos da Morte,,Izvorul Morții,Дуга смерти,Лук смрти,Dödsbåge,Ölüm Arkı,Арка смерті -Bloodscourge Assembled,TXT_WEAPON_M4,,,,Složený Krvehrom,Blodgisel samlet,Blutgeißel komplettiert,,Sangskurĝ' Muntita,Plaga Sangrienta ensamblada,,Veripiiska koottuna,Fléau Sanglant Assemblé,Vérkorbács Összerakva,Flagello di Sangue assemblato,組み立てた 天罰,완성된 피의 재앙,Bloedgesel in elkaar gezet,Bloodscourge samlet,Złożona Krwioplaga,Flagelo de Sangue Montado,,Flagel Sângeros Asamblat,Кровавый бич собран воедино,Крвави бич је сабран,Bloodscourge monterad,Bloodscourge Birleştirildi,Кривава Кара зібрана воєдино -A weapon piece! This is your lucky day!,TXT_WEAPONPIECE,,,,Část zbraně! Dnes je tvůj šťastný den!,Et våbenstykke! Dette er din heldige dag!,Ein Waffensegment. Das ist dein Glückstag!,,Peco de armilo! Estas via bonŝanca tago!,¡Una pieza de un arma! ¡Es tu día de suerte!,,Aseen osa! Tämä on onnenpäiväsi!,Une pièce d'arme! C'est votre jour de chance!,Egy fegyver darab! Szerencés napod van!,Il frammento di un'arma! È il tuo giorno fortunato! ,武器の一片! 今日は吉日だ!,무기의 한 조각이다! 운수 좋은 날인 것 같다!,Een wapenstuk! Dit is je geluksdag!,En våpendel! Dette er lykkedagen din!,Część broni! To twój szczęśliwy dzień!,Um fragmento de arma! Esse é o seu dia de sorte!,Um fragmento de arma! Este é o teu dia de sorte!,O piesă din super armă! E ziua ta norocoasă!,Часть оружия! Сегодня ваш счастливый день!,Део оружја! Данас Вам је срећан дан!,En vapendel! Detta är din lyckodag!,Bir silah parçası! Bugün şanslı gününüz!,Частина зброї! Та ви щасливчик! -Segment of Quietus,TXT_QUIETUS_PIECE,,,,Část Tišitele,Segment af Forløseren,Segment des Erlösers,,Segmento de Kvietus',Segmento de Quietus,,Quietuksen osa,Segment de Quietus,Darab a Némuszból,Parte del Quietus,死滅の剣の切片,종언의 검 조각,Segment van Quietus,Segment av Quietus,Fragment Uciszacza,Segmento de Quietus,,Fragment din Argumentul Final,Часть последнего довода,Део Самрти,Segment av Quietus,Quietus'un bir bölümü,Частина Упокою -Segment of Wraithverge,TXT_WRAITHVERGE_PIECE,,,,Část Zjevitele,Segment af Spirit Bringer,Segment des Geisterbringers,,Segmento de Fantomkruc',Segmento del Báculo Fantasmal,,Haamusauvan osa,Segment de la Verge Phantasmale,Darab a Bosszúbotból,Parte della Verga Sconfinaspettri,レイスバージの切片,사령의 십자가 조각,Segment van Schimroede,Segment av Wraithverge,Fragment Widmoskraju,Segmento do Cajado Fantasma,,Fragment din Toiagul Stafie,Часть жезла духов,Део Жезла утвара,Segment av Wraithverge,Wraithverge'in Segmenti,Частина Символу Мари -Segment of Bloodscourge,TXT_BLOODSCOURGE_PIECE,,,,Část Krvehromu,Segment af Blodgiselen,Segment der Blutgeißel,,Segmento de Sangskurĝ',Segmento de la Plaga Sangrienta,,Veripiiskan osa,Segment du Fléau Sanglant,Darab a Vérkorbácsból,Parte del Flagello di Sangue,天罰の切片,피의 재앙 조각,Segment van Bloedgesel,Segment av Bloodscourge,Fragment Krwioplagi,Segmento do Flagelo de Sangue,,Fragment din Flagelul Sângeros,Часть кровавого бича,Део Крвавог бича,Segment av Bloodscourge,Bloodscourge'un Segmenti,Частина Кривавої Кари -,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,, -You need the Steel Key,TXT_NEED_KEY_STEEL,,,,Potřebuješ ocelový klíč,Du skal bruge stålnøglen,Du brauchst den Stahlschlüssel,Χρειάζεσε το Ατσάλινο κλειδί.,Vi bezonas la Ŝtalan Ŝlosilon,Necesitas la Llave de Acero,,Tarvitset teräsavaimen,Vous avez besoin de la Clé d'Acier,Az Acél Kulcsra van szükséged,Ti serve la Chiave d'Acciaio,鋼の鍵が必要だ,강철 열쇠가 필요하다,Je hebt de Stalen Sleutel nodig.,Du trenger stålnøkkelen,Potrzebujesz Stalowego Klucza,Você precisa da Chave de Aço,Precisas da Chave de Aço,Ai nevoie de Cheia din Oțel,Нужен стальной ключ,За отварање је потребан челични кључ,Du behöver stålnyckeln.,Çelik Anahtara ihtiyacın var,Вам потрібен сталевий ключ -You need the Cave Key,TXT_NEED_KEY_CAVE,,,,Potřebuješ klíč od jeskyně,Du skal bruge hulenøglen,Du brauchst den Höhlenschlüssel,,Vi bezonas la Kavern-Ŝlosilon,Necesitas la Llave de la Caverna,,Tarvitset luola-avaimen,Vous avez besoin de la Clé de la Cave,A Barlang Kulcsra van szükséged,Ti serve la Chiave della Caverna ,洞窟の鍵が必要だ,동굴 열쇠가 필요하다,Je hebt de Grotsleutel nodig.,Du trenger hulenøkkelen,Potrzebujesz Klucza do Jaskini,Você precisa da Chave da Caverna,Precisas da Chave da Caverna,Ai nevoie de Cheia Peșterii,Нужен пещерный ключ,За отварање је потребан пећински кључ,Du behöver grottnyckeln,Mağara Anahtarına ihtiyacın var,Вам потрібен печерний ключ -You need the Axe Key,TXT_NEED_KEY_AXE,,,,Potřebuješ sekyrový klíč,Du skal bruge øksenøglen,Du brauchst den Axtschlüssel,,Vi bezonas la Hakil-Ŝlosilon,Necesitas la Llave de Hacha,,Tarvitset kirvesavaimen,Vous avez besoin de la Clé de la Hache,A Fejsze Kulcsra van szükséged,Ti serve la Chiave dell'Ascia,斧の鍵が必要だ,도끼 열쇠가 필요하다,Je hebt de Bijlsleutel nodig.,Du trenger øksenøkkelen,Potrzebujesz Klucza-Topora,Você precisa da Chave do Machado,Precisas da Chave do Machado,Ai nevoie de Cheia Topor,Нужен ключ-топор,За отварање је потребан кључ секира,Du behöver yxnyckeln,Balta Anahtarına ihtiyacın var,Вам потрібен сокирний ключ -You need the Fire Key,TXT_NEED_KEY_FIRE,,,,Potřebuješ ohnivý klíč,Du skal bruge brandnøglen,Du brauchst den Feuerschlüssel,,Vi bezonas la Fajro-Ŝlosilon,Necesitas la Llave de Fuego,,Tarvitset tuliavaimen,Vous avez besoin de la Clé du Feu,A Tűz Kulcsra van szükséged,Ti serve la Chiave del Fuoco ,炎の鍵が必要だ,불 열쇠가 필요하다,Je hebt de Vuursleutel nodig.,Du trenger Ildnøkkelen,Potrzebujesz Ognistego Klucza,Você precisa da Chave do Fogo,Precisas da Chave do Fogo,Ai nevoie de Cheia de Foc,Нужен огненный ключ,За отварање је потребан огњени кључ,Du behöver eldnyckeln,Ateş Anahtarına ihtiyacın var,Вам потрібен вогняний ключ -You need the Emerald Key,TXT_NEED_KEY_EMERALD,,,,Potřebuješ smaragdový klíč,Du skal bruge smaragdnøglen,Du brauchst den Smaragdschlüssel,,Vi bezonas la Smeraldan Ŝlosilon,Necesitas la Llave Esmeralda,,Tarvitset smaragdiavaimen,Vous avez besoin de la Clé d'Emeraude,A Smaragd Kulcsra van szükséged,Ti serve la Chiave di Smeraldo ,翠玉の鍵が必要だ,에메랄드 열쇠가 필요하다,Je hebt de Smaragden Sleutel nodig.,Du trenger smaragdnøkkelen,Potrzebujesz Szmaragdowego Klucza,Você precisa da Chave Esmeralda,Precisas da Chave Esmeralda,Ai nevoie de Cheia din Smarald,Нужен изумрудный ключ,За отварање је потребан смарагдни кључ,Du behöver smaragdnyckeln,Zümrüt Anahtarı'na ihtiyacın var.,Вам потрібен смарагдовий ключ -You need the Dungeon Key,TXT_NEED_KEY_DUNGEON,,,,Potřebuješ klíč od žaláře,Du skal bruge fangehulsnøglen,Du brauchst den Kerkerschlüssel,,Vi bezonas la Karcer-Ŝlosilon,Necesitas la Llave del Calabozo,,Tarvitset tyrmän avaimen,Vous avez besoin de la Clé du Donjon,A Várbörtön Kulcsra van szükséged,Ti serve la Chiave del Sotterraneo ,迷宮の鍵が必要だ,지하감옥 열쇠가 필요하다,Je hebt de Kerkersleutel nodig.,Du trenger fangehullsnøkkelen,Potrzebujesz Klucza do Lochu,Você precisa da Chave da Masmorra,Precisas da Chave das Masmorras,Ai nevoie de Cheia Temniței,Нужен ключ от подземелья,За отварање је потребан кључ од лагума,Du behöver Kerker-nyckeln,Zindan Anahtarına ihtiyacın var,Вам потрібен ключ від підземелля -You need the Silver Key,TXT_NEED_KEY_SILVER,,,,Potřebuješ stříbrný klíč,Du skal bruge sølvnøglen,Du brauchst den Silberschlüssel,Χρειάζεσε το Ασυμένιο κλειδί.,Vi bezonas la Arĝentan Ŝlosilon,Necesitas la Llave de Plata,,Tarvitset hopea-avaimen,Vous avez besoin de la Clé d'Argent,Az Ezüst Kulcsra van szükséged,Ti serve la Chiave d'Argento ,銀の鍵が必要だ,은 열쇠가 필요하다,Je hebt de Zilveren Sleutel nodig.,Du trenger sølvnøkkelen,Potrzebujesz Srebrnego Klucza,Você precisa da Chave de Prata,Precisas da Chave Prata,Ai nevoie de Cheia din Argint,Нужен серебряный ключ,За отварање је потребан сребрни кључ,Du behöver silvernyckeln,Gümüş Anahtara ihtiyacın var,Вам потрібен срібний ключ -You need the Rusted Key,TXT_NEED_KEY_RUSTED,,,,Potřebuješ zrezivělý klíč,Du skal bruge den rustne nøgle,Du brauchst den rostigen Schlüssel,Χρειάζεσε το Σκουριασμένο κλειδί.,Vi bezonas la Rustan Ŝlosilon,Necesitas la Llave Oxidada,,Tarvitset ruosteisen avaimen,Vous avez besoin de la Clé Rouillée,A Rozsdás Kulcsra van szükséged,Ti serve la Chiave Arrugginita ,錆びた鍵が必要だ,녹슨 열쇠가 필요하다,Je hebt de Geroeste Sleutel nodig.,Du trenger den rustne nøkkelen,Potrzebujesz Zardzewiałego Klucza,Você precisa da Chave Enferrujada,Precisas da Chave Enferrujada,Ai nevoie de Cheia Ruginită,Нужен ржавый ключ,За отварање је потребан зарђали кључ,Du behöver den rostade nyckeln,Paslı Anahtar'a ihtiyacın var.,Вам потрібен іржавий ключ -You need the Horn Key,TXT_NEED_KEY_HORN,,,,Potřebuješ parožní klíč,Du skal bruge hornnøglen,Du brauchst den Hornschlüssel,,Vi bezonas la Hup-Ŝlosilon,Necesitas la Llave de Cuerno,,Tarvitset sarviavaimen,Vous avez besoin de la Clé Corne,A Szarv Kulcsra van szükséged,Ti serve la Chiave del Corno ,角の鍵が必要だ,뿔 열쇠가 필요하다,Je hebt de Hoornsleutel nodig.,Du trenger Horn-nøkkelen,Potrzebujesz Rogowego Klucza,Você precisa da Chave do Chifre,Precisas da Chave do Chifre,Ai nevoie de Cheia Corn,Нужен роговой ключ,За отварање је потребан рогати кључ,Du behöver hornnyckeln,Korna Anahtarına ihtiyacınız var,Вам потрібен ріговий ключ -You need the Swamp Key,TXT_NEED_KEY_SWAMP,,,,Potřebuješ klíč od bažiny,Du skal bruge sumpnøglen,Du brauchst den Sumpfschlüssel,,Vi bezonas la Marĉ-Ŝlosilon,Necesitas la Llave del Pantano,,Tarvitset suoavaimen,Vous avez besoin de la Clé des Marécages,A Mocsár Kulcsra van szükséged,Ti serve la Chiave della Palude ,沼の鍵が必要だ,늪지대 열쇠가 필요하다,Je hebt de Moerassleutel nodig.,Du trenger Sump-nøkkelen,Potrzebujesz Bagiennego Klucza,Você precisa da Chave do Pântano,Precisas da Chave do Pântano,Ai nevoie de Cheia Mlaștinii,Нужен болотный ключ,За отварање је потребан мочварни кључ,Du behöver träsknyckeln,Bataklık Anahtarına ihtiyacın var.,Вам потрібен болотний ключ -You need the Castle Key,TXT_NEED_KEY_CASTLE,,,,Potřebuješ klíč od hradu,Du skal bruge slotsnøglen,Du brauchst den Burgschlüssel,,Vi bezonas la Kastel-Ŝlosilon,Necesitas la Llave del Castillo,,Tarvitset linnan avaimen,Vous avez besoin de la Clé du Château,A Kastély Kulcsra van szükséged,Ti serve la Chiave del Castello ,城の鍵が必要だ,성 열쇠가 필요하다,Je hebt de Kasteelsleutel nodig.,Du trenger slottsnøkkelen,Potrzebujesz Klucza do Zamku,Você precisa da Chave do Castelo,Precisas da Chave do Castelo,Ai nevoie de Cheia Castelului,Нужен ключ от замка,За отварање је потребан кључ од замка,Du behöver slottsnyckeln,Kale Anahtarına ihtiyacın var,Вам потрібен ключ від фортеці -,,Actor tag names,,,,,,,,,,,,,,,,,,,,,,,,,, -Afrit,FN_FIREDEMON,,,,,,,,Afrito,,,,,,,アフリート,아프리트,Afriet,,,,,Demon de Foc,Африт,Африт,,,Африт -Serpent,FN_DEMON1,,,,Zlohad,Slange,Chaos-Schlange,,Serpento,Serpiente,,Käärme,,Kígyó,Serpente del Caos,サーペント,서펜트,Slang,Slangen,Wąż,Serpente,,Șarpe,Змей,Серпент,Ormen,Yılan,Змій -Ettin,FN_ETTIN,,,,Skřet,,,,Gigantaĉo,,,,,,,エティン,에틴,,,,,,Etin,Эттин,Етин,Ettin,,Еттін -Centaur,FN_CENTAUR,,,,Kentaur,Kentaur,Zentaur,,Centaŭro,Centauro,,Kentauri,Centaure,Kentaur,Centauro,ケンタウロス,켄타우로스,Centaurus,Kentaur,,Centauro,,,Кентавр,Кентаур,Kentaur,Kentaur,Кентавр -Slaughtaur,FN_SLAUGHTAUR,,,,Ničitaur,Slagtaur,Schlachtaur,,Buĉataŭro,Masacratauro,,Teurastauri,Sangtaure,Vágtaur,Sventrauro,スロアタウル,슬로터로스,Slachttaurus,Slakttaur,Rzeziotaur,Chacinotauro,,Centaur Violent,Убитавр,Кентаур старешина,Slaktaur,Katlaur,Кентавр хорунжий -Bishop,FN_BISHOP,,,,Biskup,Biskop,Bischof,,Episkopo,Obispo,,Piispa,Evèque,Érsek,Vescovo,ビショップ,비숍,Bisschop,Biskop,Biskup,Bispo,,Episcop,Епископ,Епископ,Biskop,Piskopos,Єпископ -Wendigo,FN_ICEGUY,,,,,,,,Vendiko,,,,,,,ウェンディゴ,윈디고,,,,,,Vendigo,Вендиго,Вендиго,,,Віндіго -Stalker,FN_SERPENT,,,,Slídil,,Wasserjäger,,Gvatanto,Acechador,,Vaanija,Chasseur,Orvhalász,Cacciatore,ストーカー,스토커,,,Prześladowca,Caçador,,Vânător,Преследователь,Вребач,,,Сталкер -Reiver,FN_WRAITH,,,,Přízrak,,Phantom,,Fantomo,Saqueador,,Ryöväri,,Martalóc,Incursore,レイバー,리버,Rover,,Rozbójnik,Fantasma,,Pungaș,Грабитель,Грабљивац,Reiver,Hayalet,Розбійник -Death Wyvern,FN_DRAGON,,,,Smrtidrak,Døden Wyvern,Todesdrache,,Morta viverno,Guiverno de la muerte,,Kuolontraakki,Vouivre de la Mort,A Halál Sárkánya,Viverna Mortale,デス ワイバーン,데스 와이번,Doodsdraak,Døden Wyvern,Wiwerna Śmierci,Serpe da Morte,,Balaur al Morții,Виверна смерти,Змајак смрти,Döds Wyvern,Ölüm Wyvern,Віверна Смерті -Korax,FN_KORAX,,,,,,,,,,,Kooraks,,,,唯一神コラックス,코락스,,,,,,,Коракс,Коракс,,,Коракс -Zedek,FN_FBOSS,,,,,,,,Zedeko,,,Sedek,,,,ゼデク,제닥,,,,,,,Зедек,Зедек,,,Зедек -Menelkir,FN_MBOSS,,,,,,,,Menelkiro,,,Menelkir,,,,メネルキル,메넬키어,,,,,,,Менелкир,Менелкир,,,Менелкір -Traductus,FN_CBOSS,,,,Traduktus,,,,Traduktuso,,,Traduktus,,Traduktusz,,トラダクタス,트라닥투스,,,,,,,Традуктус,Традуктус,,,Традуктус -Heresiarch,FN_HERESIARCH,,,,Arcikacíř,Heresiark,Erzketzer,,Ĉefherezulo,Heresiarca,,Kerettiarkki,L'Hérésiarche,Főeretnek,Eresiarca,ヘレシアーク,헤러시아크,,Heresiark,Herezjarcha,Heresiarca,,Ereziarh,Ересиарх,Јересијарх,Heresiark,Heresiark,Єресіарх -Blue Mana,AMMO_MANA1,,,,Modrá mana,Blå Mana,Blaues Mana,,Blua Manao,Maná azul,,Sininen mana,Mana Bleu,Kék Mana,Mana blu,ブルーマナ,청색 마나,Blauwe Mana,Blå Mana,Niebieska Mana,Mana Azul,,Mană Albastră,Синяя мана,Плава мана,Blå Mana,Mavi Mana,Синя мана -Green Mana,AMMO_MANA2,,,,Zelená mana,Grøn Mana,Grünes Mana,,Verda Manao,Maná verde,,Vihreä mana,Mana Vert,Zöld Mana,Mana verde,グリーンマナ,녹색 마나,Groene Mana,Grønn Mana,Zielona Mana,Mana Verde,,Mană Verde,Зелёная мана,Зелена мана,Grön Mana,Yeşil Mana,Зелена мана -Mace of Contrition,TAG_CWEAPMACE,,,,Palcát kajícnosti,Stridskølle af anger,Streitkolben,,Klabo de Penteco,Maza de Contrición,,Katumuksen nuija,Masse de Pénitence,Bűnbánat Buzogánya,Mazza del Pentimento,懺悔のメイス,참회의 철퇴,Knots van Wroeging,Mace of Contrition,Buzdygan Skruchy,Maça da Contrição,,Buzduganul Remușcării,Булава раскаяния,Буздован покајања,Tystnadens stridsspira,Pişmanlık Topuzu,Булава покаяння -Serpent Staff,TAG_CWEAPSTAFF,,,,Hadí hůl,Slange-stav,Schlangenstab,,Serpentbastono,Bastón de Serpiente,,Käärmesauva,Sceptre du Serpent,Kígyó Bot,Staffa del Serpente ,蛇の杖,뱀 지팡이,Slangenstaf,Slangestav,Laska Węży,Cetro da Serpente,,Bastonul Șarpelui,Змеиный посох,Змијски штап,Ormens stav,Yılan Asa,Посох змія -Firestorm,TAG_CWEAPFLAME,,,,Ohnivá bouře,Ildstorm,Feuersturm,,Fajrŝtormo,Tormenta de Fuego,,Tulimyrsky,Tempête de Feu,Tűzvihar,Tempesta di Fuoco ,ファイアストーム,화염폭풍,Vuurstorm,Ildstorm,Burza Ognia,Tempestade-de-fogo,,Furtună de Foc,Огненный шторм,Огњена олуја,Eldstorm,Ateş Fırtınası,Вогняний шторм -Wraithverge,TAG_CWEAPWRAITHVERGE,,,,Zjevitel,Spirit Bringer,Geisterbringer,,Fantomkruc',Báculo Fantasmal,,Haamusauva,Verge Phantasmale,Lidércvég,Verga SconfinaSpettri,レイスバージ,사령의 십자가,Schimroede,Wraithverge,Widmoskraj,Cajado Fantasma,,Toiag Stafie,Жезл духов,Жезло утвара,,Wraithverge,Символ Мари -Spiked Gauntlets,TAG_FWEAPFIST,,,,Ohrocené rukavice,Spidse handsker,Stachelhandschuhe,,Pintaj Fergantoj,Guanteletes Puntiagudos,,Piikkirautakintaat,Gantelets à Pointes,Tűskés Páncélkesztyűk,Guantoni Spinati,スパイク ガントレット,가시 장갑,Spijkerhandschoenen,Pigghansker,Kolczaste Rękawice,Manoplas Espinhadas,,Mănuși cu Țepi,Шипастые перчатки,Бодљикаве рукавице,Spikade handskar,Çivili Eldivenler,Шипасті рукавиці -Timon's Axe,TAG_FWEAPAXE,,,,Timonova sekera,Timons økse,Timons Axt,,Hakilo de Timon,Hacha de Timón,,Timonin kirves,Hache de Timon,Timon Baltája,Ascia di Timon,タイモンの斧,티몬의 도끼,Timon's Bijl,Timons øks,Topór Timona,Machado de Timon,,Toporul lui Timon,Топор Тимона,Тимонова секира,Timons yxa,Timon'un Baltası,Тімонова сокира -Hammer of Retribution,TAG_FWEAPHAMMER,,,,Kladivo odplaty,Hævnens hammer,Hammer der Rache,,Martelo de Repago,Martillo de Retribución,,Koston vasara,Marteau de la Rétribution,Kárhozat Kalapácsa,Martello del Castigo,報復の金槌,징벌의 망치,Hamer van Vergelding,Gjengjeldelsens hammer,Młot Odkupienia,Martelo da Retribuição,,Ciocanul Salvării,Молот возмездия,Чекић одмазде,Hämndhammaren,İntikam Çekici,Молот відплати -Quietus,TAG_FWEAPQUIETUS,,,,Tišitel,Forløser,Erlöser,,Kvietus',,,,Quietus,Némusz,,死滅の剣,종언의 검,,,Uciszacz,,,Argument Final,Последний довод,Самрт,,,Упокій -Sapphire Wand,TAG_MWEAPWAND,,,,Safírová hůl,Safir-stav,Saphirstab,,Safirsorĉbastono,Varita de Zafiro,,Safiirisauva,Baguette de Saphir,Zafír Pálca,Scettro di Zaffiro ,サファイア ワンド,사파이어 지팡이,Saffieren Toverstok,Safirstaven,Szafirowa Różdżka,Cetro de Safira,,Toiag cu Safir,Сапфировая волшебная палочка,Сафирни штап,Safirstav,Safir Değnek,Сапфіровий жезл -Frost Shards,TAG_MWEAPFROST,,,,Ledové střepy,Frostskår,Frostsplitter,,Frostfragmentoj,Fragmentos de Escarcha,,Pakkassirpaleet,Eclats de Givre,Fagyos Szilánkok,Schegge di Ghiaccio ,フロスト シャード,얼음 파편,Vorstscherven,Frostskår,Lodowe Odłamki,Fragmentos de Geada,,Cioburi de Gheață,Замораживающие осколки,Ледене крхотине,Frostskärvor,Buz Kırıkları,Льодяні уламки -Arcs of Death,TAG_MWEAPLIGHTNING,,,,Jiskry smrti,Dødens buer,Todesblitz,,Arkoj de Morto,Arcos de la Muerte,,Kuolonkaaret,Foudre Mortelle,Halál Boltíve,Archi della Morte ,死の円弧,죽음의 번갯불,Doodsboog,Dødens buer,Łuki Śmierci,Arcos da Morte,,Izvoarele Morții,Дуга смерти,Лук смрти,Dödsbågar,Ölüm Yayları,Арка смерті -Bloodscourge,TAG_MWEAPBLOODSCOURGE,,,,Krvehrom,Blodgisel,Blutgeißel,,Sangskurĝ',Plaga Sangrienta,,Veripiiska,Fléau Sanglant,Vérkorbács,Flagello di Sangue,天罰,피의 재앙,Bloedgesel,,Krwioplaga,Flagelo de Sangue,,Flagel Sângeros,Кровавый бич,Крвави бич,,,Кривава Кара -Disc of Repulsion,TAG_ARTIBLASTRADIUS,,,,Kotouč odpuzení,Afstødningsskive,Rückstoßscheibe,,Disko de Repelado,Disco de Repulsión,,Karkotuskiekko,Disque de Répulsion,Visszaverő Pajzs,Disco della Repulsione ,反発の円盤,방탄의 원반,Schijf van Afstoting,Frastøtelsens skive,Dysk Odpychania,Disco da Repulsão,,Disc al Repulsiei,Диск отторжения,Диск одбијања,Skiva av avstötning,İtme Diski,Диск відштовхування -Dragonskin Bracers,TAG_ARTIBOOSTARMOR,,,,Dračí nátepníky,Drageskindsarmbøjler,Drachenhaut-Armschutz,,Brakbendo el Drakhaŭto,Brazaletes de piel de Dragón,,Lohikäärmeennahkarannesuojat,Brassards en peau de Dragon,Sárkánybőr Karkötők,Bracciali in Pelle di Drago ,竜皮の小手,용가죽 팔찌,Drakenhuidbescherming,Dragehud-bindinger,Karwasze ze Smoczej Skóry,Braçadeiras de Pele de Dragão,,Brățări din Piele de Dragon,Наручи драконьей кожи,Наруквице од змајеве коже,Drakskinnsarmband,Ejderha Derisi Bilezikler,Наручі зі шкіри дракона -Krater of Might,TAG_ARTIBOOSTMANA,,,,Kalich síly,Kraftens bæger,Kelch der Macht,,Kratero de Potenco,Crátera de Poder,,Mahtikrateeri,Cratère de Pouvoir,Hatalom Kráterje,Calice della Forza,魔力の盃,힘의 향로,Beker van Macht,Krater av makt,Czara mocy,Cálice do Poder,,Pocal al Puterii,Кубок могущества,Чаша силе,Mäktighetens krater,Kudret Krateri,Чаша міці -Flechette,TAG_ARTIPOISONBAG,,,,Střelka,,,,Flakono,,,,Fléchette,Nyílhegy,Fiaschetta ,フレシェット,플레셰트,,,Flaszka,,,Flacon,Флешетта,Бочица,,,Флешета -Poison Cloud Flechette,TAG_ARTIPOISONBAG1,,,,Otrávená střelka,Flechette (giftig sky),Flechette (Giftwolke),,Venennub-Flakono,Flechette de Nube Venenosa,,Myrkkypilviflechette,Fléchette - Nuage Toxique,Méregfelhő hegy,Fiaschetta Velenosa,毒ガス フレシェット,독구름 플레셰트,Flechette (giftige wolk),Giftsky-flechette,Flaszka Trującej Chmury,Flechette de Nuvem Venenosa,,Flacon cu Otravă,Флешетта ядовитого облака,Бочица отровног облака,Flechette med giftmoln,Zehirli Bulut Flechette,Флешета отруйної хмари -Timebomb Flechette,TAG_ARTIPOISONBAG2,,,,Časovaná střelka,Flechette (tidsbombe),Flechette (Zeitbombe),,Horloĝbomb-Flakono ,Bomba de Tiempo Flechette,,Aikapommiflechette,Fléchette - Bombe a Retardement,Időbomba hegy,Fiaschetta a Tempo ,時限爆弾フレシェット,시한폭탄 플레셰트,Flechette (tijdbom),Tidsbombe Flechette,Flaszka-Bomba Zegarowa,Flechette Bomba-Relógio,,Bombă cu Ceas,Флешетта часовой бомбы,Бочица временске бомбе,Tidsbomb Flechette,Saatli bomba Flechette,Флешета часової бомби -Grenade Flechette,TAG_ARTIPOISONBAG3,,,,Granátová střelka,Flechette (granat),Flechettre (Granate),,Grenad-Flakono,Granada Flechette,,Kranaattiflechette,Fléchette - Grenade,Robbanó hegy,Fiaschetta da Lancio,グレネードフレシェット,폭발성 플레셰트,Flechette (granaat),Granat Flechette,Flaszka-Granat,Flechette Granada,,Flacon-Grenadă,Гранатная флешетта ,Бочица граната,Granat Flechette,El Bombası Flechette,Гранатна флешета -Mystic Ambit Incant,TAG_ARTIHEALINGRADIUS,,,,Tajemný čár koljdoucí,,,,Sorĉo de Mistika Sfero,Encantamiento de Ámbito Místico,,Mystisen piirin loitsu,Incantation Mystique,Misztikus Mágialista,Incantamento Mistico ,魅知国の秘法,신비 영역의 주문,,,Inkantancja Mistycznego Kręgu,Encantamento Místico,,Pergament Mistic,Мистический зачарованный свиток,Чаролија магичног јединства,,Mistik Ambit Büyüsü,Закляття містичної області -Icon of the Defender,TAG_ARTIDEFENDER,,,,Obráncova ikona,Ikon af forsvareren,Ikone des Verteidigers,,Ikono de la Defendanto,Icono del Defensor,Ícono del Defensor,Puolustajan ikoni,Icône du Défenseur,Védelmező Ikonja,Emblema del Difensore ,守護者の像,수호의 성상,,Forsvarerens ikon,Ikona Obrońcy,Ícone do Defensor,,Imaginea Apărătorului,Символ защитника,Симбол браниоца,Försvararens ikon,Savunucunun Simgesi,Символ захисника -Porkalator,TAG_ARTIPORK,,,,Vepřovitel,,,,Porkigilo,Porcinador,,Sikaannuttaja,Porcificateur,Ártányátok,Porchificatore,ポークレイター,돈육기,,,Schabowator,Porquificador,,Porcolator,Свиновизатор,Свињатор,,,Захрюкувач -Boots of Speed,TAG_ARTISPEED,,,,Běhuté boty,Støvler af hastighed,Turbo-Stiefel,,Botoj de Rapideco,Botas de Velocidad,,Ripeyssaappaat,Bottes de Célérité,Sebesség Cipői,Stivali della Fretta,素早さの靴,속도의 부츠,Snelheidslaarzen,Støvler av fart,Buty Szybkości,Botas da Rapidez,,Bocancii Vitezei,Сапоги-скороходы,Брзинске чизме,Stövlar av snabbhet,Hız Çizmeleri,Семимильні чоботи -Dark Servant,TAG_ARTISUMMON,,,,Temný služebník,Mørk tjener,Dunkler Diener,,Malluma Servanto,Servidor Oscuro,,Pimeä palvelija,Serviteur Noir,Árny Szolga,Servo Oscuro,闇の従者,어둠의 하인,Donkere Dienaar,Mørk tjener,Mroczny Sługa,Servo Negro,,Servitor Întunecat,Тёмный слуга,Мрачни слуга,Mörk tjänare,Karanlık Hizmetkar,Темний слуга -Banishment Device,TAG_ARTITELEPORTOTHER,,,,Vyhošťovač,Forvisningsanordning,Verbannungsgerät,,Forpelilo,Dispositivo de Destierro,,Häivytyskoje,Outil de Banissement,Számüzető Szerkentyű,Congegno dell'Esilio,追放のデバイス,소멸 장치,Verbanningsapparaat,Forvisningsinnretning,Urządzenie Wygnania ,Dispositivo do Banimento,,Dispozitiv al Alungării,Механизм изгнания,Амблем прогањања,Förvisningsenhet,Sürgün Cihazı,Пристрій заслання -Yorick's Skull,TAG_ARTIPUZZSKULL,,,,Jorikova lebka,Yoricks kranium,Yoricks Schädel,,Kranio de Yorick,Calavera de Yorick,Cráneo de Yorick,Yorickin kallo,Crâne de Yorick,Yorick Koponyája,Teschio di Yorick,ヨリックの髑髏,요릭의 두개골,Yorick's Schedel,Yoricks hodeskalle,Czaszka Yoricka,Crânio de Yorick,,Craniul lui Yorick,Череп Йорика,Јорикова лобања,Yoricks skalle,Yorick'in Kafatası,Череп Йоріка -Heart of D'Sparil,TAG_ARTIPUZZGEMBIG,,,,Srdce D'Sparila,D'Sparils hjerte,D'Sparils Herz,,Koro de D'Sparil,Corazón de D'Sparil,,D'Sparilin sydän,Cœur de D'Sparil,D'Sparil Szíve,Cuore di D'Sparil,デ'スパリルの心,드'스파릴의 심장,Hart van D'Sparil,D'Sparils hjerte,Serce D'Sparila,Coração de D'Sparil,,Inima lui D'Sparil,Сердце Д'Спарила,Д'Спарилово срце,D'Sparils hjärta,D'Sparil'in Kalbi,Серце Д'Спаріла -Ruby Planet,TAG_ARTIPUZZGEMRED,,,,Rubínová planeta,Rubinplanet,Rubinplanet,,Rubena Planedo,Planeta Rubí,,Rubiiniplaneetta,Planète en rubis,Rubin Bolygó,Pianeta di Rubino,ルビーの宝石,루비 행성석,Robijnrode Planeet,Rubinplaneten,Rubinowa Planeta,Planeta Rubi,,Planetă din Rubin,Рубиновая планета,Планета рубина,Rubinplanet,Yakut Gezegeni,Рубінова планета -Emerald Planet (1),TAG_ARTIPUZZGEMGREEN1,,,,Smaragdová planeta (1),Smaragdplanet (1),Smaragdplanet (1),,Smeralda Planedo (1),Planeta Esmeralda (1),,Smaragdiplaneetta (1),Planète en émeraude (1),Smaragd Bolygó (1),Pianeta di Smeraldo (1),エメラルドの宝石1,에메랄드 행성석 (1),Smaragdgroene Planeet (1),Smaragdplaneten (1),Szmaragdowa Planeta (1),Planeta Esmeralda (1),,Planetă din Smarald (1),Изумрудная планета (1),Смарагдна планета (1),Smaragdplanet (1),Zümrüt Gezegen (1),Смарагдова планета (1) -Emerald Planet (2),TAG_ARTIPUZZGEMGREEN2,,,,Smaragdová planeta (2),Smaragdplanet (2),Smaragdplanet (2),,Smeralda Planedo (2),Planeta Esmeralda (2),,Smaragdiplaneetta (2),Planète en émeraude (2),Smaragd Bolygó (2),Pianeta di Smeraldo (2),エメラルドの宝石2,에메랄드 행성석 (2),Smaragdgroene Planeet (2),Smaragdplaneten (2),Szmaragdowa Planeta (2),Planeta Esmeralda (2),,Planetă din Smarald (2),Изумрудная планета (2),Смарагдна планета (2),Smaragdplanet (2),Zümrüt Gezegen (2),Смарагдова планета (2) -Sapphire Planet (1),TAG_ARTIPUZZGEMBLUE1,,,,Safírová planeta (1),Safirplanet (1),Saphirplanet (1),,Safira Planedo (1),Planeta Zafiro (1),,Safiiriplaneetta (1),Planète en saphir (1),Zafír Bolygó (1),Pianeta di Zaffiro (1),サファイアの宝石1,사파이어 행성석 (1),Saffierblauwe Planeet (1),Safirplaneten (1),Szafirowa Planeta (1),Planeta Safira (1),,Planetă din Safir (1),Сапфировая планета (1),Сафирна планета (1),Safirplanet (1),Safir Gezegen (1),Сапфірова планета (1) -Sapphire Planet (2),TAG_ARTIPUZZGEMBLUE2,,,,Safírová planeta (2),Safirplanet (2),Saphirplanet (2),,Safira Planedo (2),Planeta Zafiro (2),,Safiiriplaneetta (2),Planète en saphir (2),Zafír Bolygó (2),Pianeta di Zaffiro (2),サファイアの宝石2,사파이어 행성석 (2),Saffierblauwe Planeet (2),Safirplaneten (2),Szafirowa Planeta (2),Planeta Safira (2),,Planetă din Safir (2),Сапфировая планета (2),Сафирна планета (2),Safirplanet (2),Safir Gezegen (2),Сапфірова планета (2) -Daemon Codex,TAG_ARTIPUZZBOOK1,,,,,,,,Kodekso de Demono,Códice del Demonio,,Daemon-koodeksi,Codex Démoniaque,Démon Kódex,Codice Demoniaco ,デーモンの写本,악마의 고문서,,,Demoniczny Kodeks,Códice Demoníaco,,Codexul Demonilor,Демонический кодекс,Демонски кодекс,,,Демонічний кодекс -Liber Oscura,TAG_ARTIPUZZBOOK2,,,,,,,,Liber Oscura,Liber Oscura,,,,,,オスキュラ公文書,어둠의 자유서,,,Liber Oscura,,,Liber Obscura,Либер Оскура,Либер Оскура,,,Лібер Оскура -Flame Mask,TAG_ARTIPUZZSKULL2,,,,Plamenná maska,Flamme-maske,Flammenmaske,,Fajrmasko,Mascara de Llamas,Mascara de Flamas,Liekkinaamio,Masque de Flammes,Láng Maszk,Maschera delle Fiamme ,炎の仮面,화염의 가면,Vuurmasker,Flammemaske,Maska Płomieni,Máscara das Chamas,,Mască de Foc,Маска пламени,Маска пламена,Flam-Mask,Alev Maskesi,Полум'яна маска -Glaive Seal,TAG_ARTIPUZZFWEAPON,,,,Glévská pečeť,Sværdsegl,Schwertsiegel,,Sigelo de Glavo,Sello de Espada,,Miekkasinetti,Sceau du Glaive,Pallos Pecsét,Sigillo del Brando,グレイブシール,밀폐된 칼날,Lanszegel,Glaive segl,Pieczęć Glewii,Selo do Gládio,,Sigiliu Spadă,Печать воителя,Војников печат,Glasögonsegel,Glaive Mühür,Воїнська печатка -Holy Relic,TAG_ARTIPUZZCWEAPON,,,,Svatá relikvie,Hellig relikvie,Heiliges Relikt,,Sankta Relikvo,Santa Reliquia,,Pyhä reliikki,Relique Sacrée,Szent Ereklye,Reliquia Sacra,聖遺物,신성한 유물,Heilige Relikwie,Hellig relikvie,Święta Relikwia,Relíquia Sagrada,,Relicvă Sfântă,Святая реликвия,Света реликвија,Heliga reliker,Kutsal Emanet,Свята реліквія -Sigil of the Magus,TAG_ARTIPUZZMWEAPON,,,,Mágovo sigilium,Magus' segl,Symbol des Magiers,,Sigelo de la Mago,Emblema del Mago,,Taikurin sinetti,Sceau du Mage,Mágus Pecsétje,Suggello del Magus,メイガスの印章,마거스의 인장,Sigaar van de Magus,Magusens segl,Emblemat Maga,Sígilo do Mago,,Sigiliul Magului,Печать Мага,Чаробњаков симбол,Magikerns sigill,Büyücünün Sigil'i,Знак магів -Iron gear,TAG_ARTIPUZZGEAR1,,,,Železné kolečko,Tandhjul af jern,Eisenzahnrad,,Fera Dentrado,Engranaje de Hierro,,Rautaratas,Engrenage en Fer,Vas Felszerelés,Ingranaggio di Ferro,鉄の歯車,양철 톱니바퀴,IJzeren uitrusting,Jernutstyr,Żelazna Zębatka,Engrenagem de ferro,,Mecanism din fier,Железная шестерня,Гвожђени зупчаник,Kugghjul av järn,Demir dişli,Залізна шестерня -Brass gear,TAG_ARTIPUZZGEAR2,,,,Mosazné kolečko,Tandhjul i messing,Messingzahnrad,,Latuna Dentrado,Engranaje de Bronce,,Messinkiratas,Engrenage en Bronze,Réz Felszerelés,Ingranaggio di Ottone ,真鍮のギア,황동 톱니바퀴,Messing uitrusting,Utstyr av messing,Mosiężna Zębatka,Engrenagem de latão,,Mecanism din alamă,Латунная шестерня,Месингани зупчаник,Kugghjul av mässing,Pirinç dişli,Латунна шестерня -Brass and iron gear,TAG_ARTIPUZZGEAR3,,,,Mosazno-železné kolečko,Tandhjul af messing og jern,Messing-und-Eisen-Zahnrad,,Latuna Fera Dentrado,Engranaje de Bronce y Hierro,,Messinki- ja rautaratas,Engrenage en Fer et Bronze,Vas és Réz Felszerelés,Ingranaggio di Ferro e Ottone ,鉄と真鍮のギア,황동과 양철 톱니바퀴,Messing en ijzeren uitrusting,Utstyr av messing og jern,Zębatka z mosiądzu i żelaza,Engrenagem de ferro e latão,,Mecanism din alamă și fier,Латунно-железная шестерня,Месинганoгвожђени зупчаник,Kugghjul av mässing och järn,Pirinç ve demir dişli,Латунно-залізна шестерня -Silver and brass gear,TAG_ARTIPUZZGEAR4,,,,Stříbro-mosazné kolečko,Tandhjul af sølv og messing,Silber-und-Messing-Zahnrad,,Arĝenta Latuna Dentrado,Engranaje de Plata y Bronce,,Hopea- ja messinkiratas,Engrenage en Argent et Bronze,Ezüst és Réz Felszerelés,Ingranaggio di Ottone e Argento ,銀と真鍮のギア,은과 황동 톱니바퀴,Zilveren en messing uitrusting,Utstyr av sølv og messing,Zębatka ze srebra i mosiądzu,Engrenagem de prata e latão,,Mecanism din argint și alamă,Серебряно-латунная шестерня,Сребрномесигани зупчаник,Kugghjul av silver och mässing,Gümüş ve pirinç dişli,Срібно-латунна шестерня -,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,, -%o tasted an Afrit's fire.,OB_FIREDEMON,,,,%o okusil@[ao_cs] afritův oheň.,%o smagte en afrits ild.,%o spürte das Feuer des Afrits.,,%o gustis la fajron de Afrito.,%o ha probado el fuego de un Afrit.,%o probó el fuego de un Afrit.,%o maistoi afritin tulta.,%o a goûté au feu d'un Afrit.,%o megkóstolta a Tűz Szellem parazsát.,%o ha assaggiato il fuoco di un Afrit. ,%o はアフリートの炎を味わった。,%o 은(는) 아프리트의 화염을 맛봤다.,%o proefde het vuur van een Afriet.,%o smakte en Afrits ild.,%o spróbował@[ao_pl] ognia Afrita.,%o provou o fogo de um Afrit.,,%o a gustat flacăra Demonului de Foc.,Игрок %o отведал огня африта.,%o је окуси@[ao_1_sr] Афритов огањ.,%o smakade en Afrits eld.,%o bir Afrit'in ateşini tattı.,%o скуштува@[adj_1_ua] вогню Африта. -%o was scalded by a Serpent.,OB_DEMON1,,,,%o byl@[ao_cs] upálen@[ao_cs] zlohadem.,%o blev skoldet af en slange.,%o wurde von der Chaos-Schlange gebissen.,,%o brogiĝis de Serpento.,A %o l@[ao_esp] ha carbonizado una Serpiente.,A %o l@[ao_esp] carbonizó una Serpiente.,%o joutui käärmeen kalttaamaksi.,%o a été brûlé@[e_fr] par un Serpent.,%o testét leforrázta egy Kígyó,%o è stato sciolto da un Serpente del Caos,%o はサーペントに火傷を負わされた。,%o 은(는) 서펜트에 데였다.,%o werd gebroeid door een Slang.,%o ble skåldet av en slange.,%o został@[ao_pl] poparzon@[adj_pl] przez Węża.,Uma Serpente escaldou %o.,,%o a fost opărit de un Șarpe.,Игрок %o спалён змеем.,Играча %o је спалио Серпент.,%o blev skållad av en orm.,%o bir yılan tarafından haşlandı.,%o було спалено змієм. -%o was poisoned by a Serpent.,OB_DEMON2,,,,%o byl@[ao_cs] otráven@[ao_cs] zlohadem.,%o blev forgiftet af en slange.,%o wurde von der Chaos-Schlange verbrannt.,,%o veneniĝis de Serpento.,A %o l@[ao_esp] ha envenenado una Serpiente.,A %o l@[ao_esp] envenenó una Serpiente.,%o joutui käärmeen myrkyttämäksi.,%o a été empoisonné@[e_fr] par un Serpent.,%o vérébe mérget juttatott egy Kígyó,%o è stato avvelenato da un Serpente del Caos. ,%o はサーペントの毒にやられた。,%o 은(는) 독 서펜트에게 중독 당했다.,%o werd vergiftigd door een Slang.,%o ble forgiftet av en slange.,%o został@[ao_pl] zatrut@[adj_pl] przez Węża.,%o foi envenenad@[ao_ptb] por uma Serpente.,,%o a fost otrăvit de un Șarpe.,Игрок %o отравлен змеем.,Играча %o је отровао Серпент.,%o blev förgiftad av en orm.,%o bir yılan tarafından zehirlendi.,%o було отруєно змієм. -%o was mashed by an Ettin.,OB_ETTIN,,,,%o byl@[ao_cs] umlácen@[ao_cs] skřetem.,%o blev moset af en Ettin.,%o wurde von dem Ettin zermatscht.,,%o frakasiĝis de Gigantaĉo.,%o ha quedado hech@[ao_esp] puré por un Ettin.,%o quedó hech@[ao_esp] puré por un Ettin.,%o joutui ettinin muhentamaksi.,%o a été réduit@[e_fr] en purée par un Ettin.,%o csillagokat lát az Ettin miatt.,%o è stato schiacciato da un Ettin. ,%o はエティンに潰された。,%o 은(는) 에틴에게 철퇴를 맞았다.,%o werd gepureerd door een Ettin.,%o ble knust av en Ettin.,%o został@[ao_pl] stłuczon@[adj_pl] przez Ettina.,%o foi feito purê por um Ettin.,,%o a fost făcut piure de un Etin.,Игрока %o раздробил эттин.,Играча %o је смрскао Еттин.,%o blev mosad av en Ettin.,%o bir Ettin tarafından ezildi.,%o затовк еттін. -%o was cut up by a Centaur.,OB_CENTAUR,,,,%o byl@[ao_cs] rozsekán@[ao_cs] kentaurem.,%o blev skåret op af en kentaur.,%o wurde von dem Zentaur aufgeschlitzt.,,%o distranĉiĝis de Centaŭro.,A %o l@[ao_esp] ha partido un Centauro.,A %o l@[ao_esp] partió un Centauro.,%o joutui kentaurin pilkkomaksi.,%o a été tranché@[e_fr] par un Centaure.,%o fel lett vágva a Kentaur jóvoltából.,%o è stato affettato da un Centauro. ,%o はケンタウロスに切り刻まれた。,%o 은(는) 켄타우로스에 의해 절단됐다.,%o werd versneden door een Centaurus.,%o ble kuttet opp av en Kentaur.,%o został@[ao_pl] pocięt@[adj_pl] przez Centaura.,%o foi fatiad@[ao_ptb] por um Centauro.,,%o a fost tăiat deschis de un Centaur.,Игрока %o разрезал кентавр.,Играча %o је расекао Кентаур.,%o blev styckad av en Kentaur.,%o bir Kentaur tarafından kesildi.,%o зарізав кентавр. -%o was cut up by a Slaughtaur.,OB_SLAUGHTAURHIT,,,,%o byl@[ao_cs] rozsekán@[ao_cs] ničitaurem.,%o blev skåret op af en slagtaur.,%o wurde von dem Schlachtaur aufgeschlitzt.,,%o distranĉiĝis de Buĉataŭro.,A %o l@[ao_esp] ha partido un Masacratauro.,A %o l@[ao_esp] partió un Masacratauro.,%o joutui teurastaurin pilkkomaksi.,%o a été tranché@[e_fr] par un Sangtaure.,%o nagyon felvágott és a Vágtaur is a játékost,%o è stato affettato da uno Sventrauro. ,%o はスロアタウルに切り刻まれた。,%o 은(는) 슬로터로스에 의해 심하게 절단됐다.,%o werd versneden door een Slachtaurus.,%o ble kuttet opp av en Slakttaur.,%o został@[ao_pl] pocięt@[adj_pl] Rzeziotaura.,%o foi fatiad@[ao_ptb] por um Chacinotauro.,,%o a fost tăiat deschis de un Centaur Violent.,Игрока %o разрезал убитавр.,Играча %o је расекао Кентаур старешина.,%o blev styckad av en Slaktaur.,%o bir Katlaur tarafından kesildi.,%o зарізав кентавр хорунжий. -%o was struck down by a Slaughtaur's fireball.,OB_SLAUGHTAUR,,,,%o byl@[ao_cs] zabit@[ao_cs] ničitaurovou ohnivou koulí.,%o blev slået ned af en slagtauras ildkugle.,%o wurde von dem Feuerball des Schlachtaurs niedergestreckt.,,%o subite mortiĝis de fajropilko de Buĉataŭro.,A %o l@[ao_esp] ha abatido la bola de fuego de un Masacratauro.,A %o l@[ao_esp] derribó la bola de fuego de un Masacratauro.,%o joutui teurastaurin tulipallon kaatamaksi.,%o a été touché@[e_fr] par une boule de feu de Sangtaure.,%o másodfokú égési sérüléseket szenvedett el a Vágtaur tűzgolyójától.,%o è stato abbattuto dalla palla di fuoco di uno Sventrauro. ,%o はスロアタウルの火玉に倒された。,%o 은(는) 슬로터로스의 마법구에 의해 피격당했다.,%o werd neergeslagen door een Slachtaurus' vuurbal.,%o ble truffet av en Slakttaurs ildkule.,%o został@[ao_pl] trafion@[adj_pl] przez kulę ognia Rzeziotaura.,%o foi abatid@[ao_ptb] pela bola de fogo de um Chacinotauro.,,"%o a fost răpus de mingea de foc a unui Centaur +,,Hexen,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Pickup,,,,,,,,,,,,,,,,,,,,,,,,,,, +Blue Mana,TXT_MANA_1,,,,Modrá mana,Blå Mana,Blaues Mana,,Blua Manao,Maná Azul,,Sininen mana,Mana Bleu,,Kék Mana,Mana blu,青マナ,청색 마나,Blauwe Mana,Blå Mana,Niebieska Mana,Mana Azul,,Mană Albastră,Синяя мана,Плава мана,Blå Mana,Mavi Mana,Синя мана +Green Mana,TXT_MANA_2,,,,Zelená mana,Grøn Mana,Grünes Mana,,Verda Manao,Maná Verde,,Vihreä mana,Mana Vert,,Zöld Mana,Mana verde,緑マナ,녹색 마나,Groene Mana,Grønn Mana,Zielona Mana,Mana Verde,,Mană Verde,Зелёная мана,Зелена мана,Grön Mana,Yeşil Mana,Зелена мана +Combined Mana,TXT_MANA_BOTH,,,,Smíšená mana,Kombineret Mana,Kombiniertes Mana,,Kuna Manao,Maná Combinado,,Yhdistetty mana,Mana Combiné,,Kombinált Mana,Mana misto,複合マナ,윰합된 마나,Gecombineerde Mana,Kombinert mana,Połączona Mana,Mana Combinado,,Mană Mixtă,Общая мана,Комбинована мана,Kombinerad Mana,Kombine Mana,Комбінована мана +Steel Key,TXT_KEY_STEEL,,,,Ocelový klíč,Stålnøgle,Stahlschlüssel,Ατσάλινο Κλειδί,Ŝtala Ŝlosilo,Llave de Acero,,Teräsavain,Clé d'Acier,,Acél Kulcs,Chiave d'acciaio,鋼の鍵,강철 열쇠,Stalen Sleutel,Stålnøkkel,Stalowy Klucz,Chave de Aço,,Cheia din Oțel,Стальной ключ,Челични кључ,Stålnyckel,Çelik Anahtar,Сталевий ключ +Cave Key,TXT_KEY_CAVE,,,,Klíč od jeskyně,Hule-nøgle,Höhlenschlüssel,,Kavern-Ŝlosilo,Llave de la Caverna,,Luola-avain,Clé de la Cave,,Barlang Kulcs,Chiave della caverna,洞窟の鍵,동굴 열쇠,Grotsleutel,Hulenøkkel,Klucz do Jaskini,Chave da Caverna,,Cheia Peșterii,Пещерный ключ,Пећински кључ,Grottnyckel,Mağara Anahtarı,Печерний ключ +Axe Key,TXT_KEY_AXE,,,,Sekyrový klíč,Økse-nøgle,Axtschlüssel,,Hakil-Ŝlosilo,Llave de Hacha,,Kirvesavain,Clé de la Hache,,Fejsze Kulcs,Chiave dell'ascia,斧の鍵,도끼 열쇠,Bijlsleutel,Økse-nøkkel,Klucz-topór,Chave do Machado,,Cheia Topor,Топор-ключ,Кључ секира,Yxnyckel,Balta Anahtarı,Сокирний ключ +Fire Key,TXT_KEY_FIRE,,,,Ohnivý klíč,Ild-nøgle,Feuerschlüssel,,Fajro-Ŝlosilo,Llave de Fuego,,Tuliavain,Clé du Feu,,Tűz Kulcs,Chiave del fuoco,炎の鍵,불 열쇠,Vuursleutel,Ildnøkkel,Ognisty Klucz,Chave do Fogo,,Cheia de Foc,Огненный ключ,Огњени кључ,Eldnyckel,Yangın Anahtarı,Вогняний ключ +Emerald Key,TXT_KEY_EMERALD,,,,Smaragdový klíč,Smaragdnøgle,Smaragdschlüssel,,Smerelda Ŝlosilo,Llave Esmeralda,,Smaragdiavain,Clé d'Emeraude,,Smaragd Kulcs,Chiave di smeraldo,翠玉の鍵,에메랄드 열쇠,Smaragden Sleutel,Smaragdnøkkel,Szmaragdowy Klucz,Chave de Esmeralda,,Cheia din Smarald,Изумрудный ключ,Смарагдни кључ,Smaragdnyckel,Zümrüt Anahtar,Смарагдовий ключ +Dungeon Key,TXT_KEY_DUNGEON,,,,Klíč od žaláře,Dungeon-nøgle,Kerkerschlüssel,,Karcer-Ŝlosilo,Llave del Calabozo,,Tyrmän avain,Clé du Donjon,,Várbörtön Kulcs,Chiave del sotterraneo,迷宮の鍵,지하감옥 열쇠,Kerkersleutel,Dungeon-nøkkel,Klucz do Lochu,Chave da Masmorra,,Cheia Temniței,Ключ от подземелья,Кључ од лагума,Kerker-nyckel,Zindan Anahtarı,Ключ від підземелля +Silver Key,TXT_KEY_SILVER,,,,Stříbrný klíč,Sølvnøgle,Silberschlüssel,Ασυμένιο Κλειδί,Arĝenta Ŝlosilo,Llave de Plata,,Hopea-avain,Clé d'Argent,,Ezüst Kulcs,Chiave d'argento,銀の鍵,은 열쇠,Zilveren Sleutel,Sølvnøkkel,Srebrny Klucz,Chave de Prata,,Cheia din Argint,Серебряный ключ,Сребрни кључ,Silvernyckel,Gümüş Anahtar,Срібний ключ +Rusted Key,TXT_KEY_RUSTED,,,,Zrezivělý klíč,Rustet nøgle,Rostiger Schlüssel,Σκουριασμένο Κλειδί,Rusta Ŝlosilo,Llave Oxidada,,Ruosteinen avain,Clé Rouillée,,Rozsdás Kulcs,Chiave arrugginita,錆びた鍵,녹슨 열쇠,Geroeste Sleutel,Rustet nøkkel,Zardzewiały Klucz,Chave Enferrujada,,Cheia Ruginită,Ржавый ключ,Зарђали кључ,Rostad nyckel,Paslı Anahtar,Іржавий ключ +Horn Key,TXT_KEY_HORN,,,,Parožní klíč,Hornnøgle,Hornschlüssel,,Hup-Ŝlosilo,Llave de Cuerno,,Sarviavain,Clé Corne,,Szarv Kulcs,Chiave del corno,角の鍵,뿔 열쇠,Hoornsleutel,Horn-nøkkel,Rogowy Klucz,Chave do Chifre,,Cheia Corn,Роговой ключ,Рогати кључ,Horn-nyckel,Korna Anahtarı,Ріговий ключ +Swamp Key,TXT_KEY_SWAMP,,,,Klíč od bažiny,Sumpnøgle,Sumpfschlüssel,,Marĉo-Ŝlosilo,Llave del Pantano,,Suoavain,Clé des Marécages,,Mocsár Kulcs,Chiave della palude,沼の鍵,늪지대 열쇠,Moerassleutel,Sumpnøkkel,Bagienny Klucz,Chave do Pântano,,Cheia Mlaștinii,Болотный ключ,Мочварни кључ,Träsknyckel,Bataklık Anahtarı,Болотний ключ +Castle Key,TXT_KEY_CASTLE,,,,Klíč od hradu,Slotsnøgle,Burgschlüssel,,Kastel-Ŝlosilo,Llave del Castillo,,Linnan avain,Clé du Château,,Kastély Kulcs,Chiave del castello,城の鍵,성 열쇠,Kasteelsleutel,Slottsnøkkel,Klucz do Zamku,Chave do Castelo,,Cheia Castelului,Ключ от замка,Кључ од замка,Slottsnyckel,Kale Anahtarı,Ключ від фортеці +Icon of the Defender,TXT_ARTIINVULNERABILITY2,,,,Obráncova ikona,Ikon af forsvareren,Ikone des Verteidigers,,Ikono de la Defendanto,Icono del Defensor,Ícono del Defensor,Puolustajan ikoni,Icône du Défenseur,,Védelmező Ikonja,Icona del difensore,守護者の像,수호의 성상,Symbool van de Verdediger,Forsvarerens ikon,Ikona Obrońcy,Ícone do Defensor,,Imaginea Apărătorului,Символ защитника,Симбол браниоца,Försvararens ikon,Savunucunun Simgesi,Символ захисника +Dark Servant,TXT_ARTISUMMON,,,,Temný služebník,Mørk tjener,Dunkler Diener,,Malluma Servanto,Sirviente Oscuro,,Pimeä palvelija,Serviteur Noir,,Árny Szolga,Servitore oscuro,闇の従者,어둠의 하인,Donkere Dienaar,Mørk tjener,Mroczny Sługa,Servo Negro,,Servitor Întunecat,Тёмный слуга,Мрачни слуга,Mörk tjänare,Karanlık Hizmetkar,Темний слуга +Porkalator,TXT_ARTIEGG2,,,,Vepřovitel,,,,Porkigilo,Porcinador,,Sikaannuttaja,Porcificateur,,Ártányátok,Porchificatore,ポークレイター,돈육기,,,Schabowator,Porquificador,,Porcolator,Свиновизатор,Свињатор,,,Захрюкувач +Flechette,TXT_ARTIPOISONBAG,,,,Střelka,,,,Flakono,,,,Fléchette,,Flakon,Fiaschetta,フレチェット,플레셰트,,,Flaszka,,,Flacon,Флешетта,Бочица,,,Флешета +Banishment Device,TXT_ARTITELEPORTOTHER,,,,Vyhošťovač,Forvisningsanordning,Verbannungsgerät,,Forpelilo,Dispositivo de Desvanecimiento,,Häivytyskoje,Outil de Banissement,,Száműző,Artifatto dell'esilio,追放のデバイス,소멸 장치,Verbanningsapparaat,Forvisningsanordning,Urządzenie Wygnania ,Dispositivo do Banimento,,Dispozitiv al Alungării,Устройство изгнания,Амблем прогањања,Förvisningsenhet,Sürgün Cihazı,Пристрій заслання +Boots of Speed,TXT_ARTISPEED,,,,Běhuté boty,Støvler af hastighed,Turbo-Stiefel,,Botoj de Rapideco,Botas de Velocidad,,Ripeyssaappaat,Bottes de Célérité,,Sebesség Cipője,Stivali della velocità,素早さの靴,속도의 신발,Snelheidslaarzen,Støvler av fart,Buty Szybkości,Botas da Velocidade,,Bocancii Vitezei,Сапоги-скороходы,Брзинске чизме,Snabbhetens stövlar,Hız Çizmeleri,Семимильні чоботи +Krater of Might,TXT_ARTIBOOSTMANA,,,,Kalich síly,Krater of Might,Kelch der Macht,,Kratero de Potenco,Vasija de Fuerza,,Mahtikrateeri,Cratère de Pouvoir,,Hatalom Krátere,Calice della forza,魔力の盃,힘의 향로,Beker van Macht,Krater av makt,Czara mocy,Cálice do Poder,,Pocal al Puterii,Чаша могущества,Чаша силе,Mäktighetens krater,Kudret Krateri,Чаша міці +Dragonskin Bracers,TXT_ARTIBOOSTARMOR,,,,Dračí nátepníky,Drageskindsarmbøjler,Drachenhaut-Armschutz,,Brakbendo el Drakhaŭto,Brazaletes de piel de Dragón,,Lohikäärmeennahkarannesuojat,Bracelets en Peau de Dragon,,Sárkánybőr Karkötők,Bracciali in pelle di drago,竜皮の小手,용가죽 팔찌,Drakenhuidbescherming,Dragehud-bindinger,Karwasze ze Smoczej Skóry,Braçadeiras de Pele de Dragão,,Brățări din Piele de Dragon,Наручи из драконьей кожи,Наруквице од змајеве коже,Drakskinnsarmbågar,Ejderha Derisi Bilezikler,Наручі зі шкіри дракона +Disc of Repulsion,TXT_ARTIBLASTRADIUS,,,,Kotouč odpuzení,Skive af frastødning,Rückstoßscheibe,,Disko de Repelado,Disco de Repulsión,,Karkotuskiekko,Disque de Répulsion,,Visszaverés Lemeze,Disco della repulsione,反発の円盤,방탄의 원반,Schijf van Afstoting,Frastøtelsesskive,Dysk Odpychania,Disco da Repulsão,,Disc al Repulsiei,Диск отторжения,Диск одбијања,Skiva av avstötning,İtme Diski,Диск відштовхування +Mystic Ambit Incant,TXT_ARTIHEALINGRADIUS,,,,Tajemný čár koljdoucí,Mystic Ambit Incant,Verbannungsgerät,,Sorĉo de Mistika Sfero,Encanto de Ámbito Místico,,Mystisen piirin loitsu,Incantation Mystique,,Misztikus Mágialista,Confine mistico,魅知国の秘法,신비 영역의 주문,,Mystic Ambit-besvergelse,Inkantancja Mistycznego Kręgu,Encanto Místico,,Pergament Mistic,Чары магического единства,Чаролија магичног јединства,,Mistik Ambit Büyüsü,Закляття містичної області +Yorick's Skull,TXT_ARTIPUZZSKULL,,,,Jorikova lebka,Yoricks kranium,Yoricks Schädel,,Kranio de Yorick,Calavera de Yorick,,Yorickin kallo,Crâne de Yorick,,Yorick Koponyája,Teschio di Yorick,ヨリックの髑髏,요릭의 두개골,Yorick's Schedel,Yoricks hodeskalle,Czaszka Yoricka,Caveira de Yorick,,Craniul lui Yorick,Череп Йорика,Јорикова лобања,Yoricks skalle,Yorick'in Kafatası,Череп Йоріка +Heart of D'sparil,TXT_ARTIPUZZGEMBIG,,,,Srdce D'Sparila,D'sparils hjerte,D'Sparils Herz,,Koro de D'sparil,Corazón de D'Sparil,,D'Sparilin sydän,Cœur de D'Sparil,,D'Sparil szíve,Cuore di d'sparil,デ'スパリルの心,드'스파릴의 심장,Hart van D'sparil,D'Sparils hjerte,Serce D'Sparila,Coração de D'Sparil,,Inima lui D'Sparil,Сердце Д'Спарила,Д'Спарилино срце,D'sparils hjärta,D'sparil'in Kalbi,Серце Д'Спаріла +Ruby Planet,TXT_ARTIPUZZGEMRED,,,,Rubínová planeta,Rubinplanet,Rubinplanet,,Rubena Planedo,Planeta Rubí,,Rubiiniplaneetta,Planète de Rubis,,Rubin Bolygó,Pianeta di rubino,ルビーの宝石,루비 행성석,Robijnrode Planeet,Rubinplaneten,Rubinowa Planeta,Planeta Rubi,,Planetă din Rubin,Рубиновая планета,Планета рубина,Rubinplanet,Yakut Gezegeni,Рубінова планета +Emerald Planet,TXT_ARTIPUZZGEMGREEN1,,,,Smaragdová planeta,Smaragdplanet,Smaragdplanet,,Smeralda Planedo,Planeta Esmeralda,,Smaragdiplaneetta,Planète d'Emeraude,,Smaragd Bolygó,Pianeta di smeraldo,エメラルドの宝石,에메랄드 행성석 (1),Smaragdgroene Planeet,Smaragdplaneten,Szmaragdowa Planeta,Planeta Esmeralda,,Planetă din Smarald,Изумрудная планета,Смарагдна планета,Smaragdplanet,Zümrüt Gezegen,Смарагдова планета +Emerald Planet,TXT_ARTIPUZZGEMGREEN2,,,,Smaragdová planeta,Smaragdplanet,Smaragdplanet,,Smeralda Planedo,Planeta Esmeralda,,Smaragdiplaneetta,Planète de Saphir,,Smaragd Bolygó,Pianeta di smeraldo,エメラルドの宝石,에메랄드 행성석 (2),Smaragdgroene Planeet,Smaragdplaneten,Szmaragdowa Planeta,Planeta Esmeralda,,Planetă din Smarald,Изумрудная планета,Смарагдна планета,Smaragdplanet,Zümrüt Gezegen,Смарагдова планета +Sapphire Planet,TXT_ARTIPUZZGEMBLUE1,,,,Safírová planeta,Safirplanet,Saphirplanet,,Safira Planedo,Planeta Zafiro,,Safiiriplaneetta,Planète de Saphir,,Zafír Bolygó,Pianeta di zaffiro,サファイアの宝石,사파이어 행성석 (1),Saffierblauwe Planeet,Safirplaneten,Szafirowa Planeta,Planeta Safira,,Planetă din Safir,Сапфировая планета,Сафирна планета,Safirplanet,Safir Gezegen,Сапфірова планета +Sapphire Planet,TXT_ARTIPUZZGEMBLUE2,,,,Safírová planeta,Safirplanet,Saphirplanet,,Safira Planedo,Planeta Zafiro,,Safiiriplaneetta,Planète de Saphir,,Zafír Bolygó,Pianeta di zaffiro,サファイアの宝石,사파이어 행성석 (2),Saffierblauwe Planeet,Safirplaneten,Szafirowa Planeta,Planeta Safira,,Planetă din Safir,Сапфировая планета,Сафирна планета,Safirplanet,Safir Gezegen,Сапфірова планета +Daemon Codex,TXT_ARTIPUZZBOOK1,,,,,,,,Kodekso de Demono,Códice del Demonio,,Daemon-koodeksi,Codex Démoniaque,,Démon Kódex,Codice Demoniaco ,デーモンの写本,악마의 고문서,,,Demoniczny Kodeks,Códice Demoníaco,,Codexul Demonilor,Демонический кодекс,Демонски кодекс,,,Демонічний кодекс +Liber Oscura,TXT_ARTIPUZZBOOK2,,,,,,,,,,,,,,,,オスキュラ公文書,어둠의 자유서,,,Liber Oscura,,,,Либер Оскура,Либер Оскура,,,Лібер Оскура +Flame Mask,TXT_ARTIPUZZSKULL2,,,,Plamenná maska,Flammemaske,Flammenmaske,,Flamomasko,Máscara de llamas,,Liekkinaamio,Masque de Flammes,,Láng Maszk,Maschera delle fiamme,炎の仮面,화염의 가면,Vuurmasker,Flammemaske,Maska Płomieni,Máscara das Chamas,,Mască de Foc,Маска пламени,Маска пламена,Flam-mask,Alev Maskesi,Полум'яна маска +Glaive Seal,TXT_ARTIPUZZFWEAPON,,,,Glévská pečeť,Glasur-segl,Schwetsiegel,,Sigelo de Glavo,Sello de Espada,,Miekkasinetti,Sceau du Glaive,,Pallos Pecsét,Sigillo della brando,グレイブシール,밀폐된 칼날,Lanszegel,Glaive segl,Pieczęć Glewii,Selo do Gládio,,Sigiliu Spadă,Печать воителя,Војников печат,Glasögonsegel,Glaive Mühür,Воїнська печатка +Holy Relic,TXT_ARTIPUZZCWEAPON,,,,Svatá relikvie,Hellig relikvie,Heiliges Relikt,,Sankta Relikvo,Santa Reliquia,,Pyhä reliikki,Relique Sacrée,,Szent Ereklye,Reliquia sacra,聖遺物,신성한 유물,Heilige Relikwie,Hellig relikvie,Święta Relikwia,Relíquia Sagrada,,Relicvă Sfântă,Святая реликвия,Света реликвија,Heliga reliker,Kutsal Emanet,Свята реліквія +Sigil of the Magus,TXT_ARTIPUZZMWEAPON,,,,Mágovo sigilium,Magus' segl,Symbol des Magiers,,Sigelo de la Mago,Emblema del Mago,,Taikurin sinetti,Sceau du Mage,,Mágus Pecsétje,Suggello del magus,メイガスの印章,마거스의 인장,Sigaar van de Magus,Magusens segl,Emblemat Maga,Sigilo do Mago,,Sigiliul Magului,Печать Мага,Чаробњаков симбол,Magikerns sigill,Büyücünün Sigil'i,Знак магів +Clock Gear,TXT_ARTIPUZZGEAR,,,,Ozubené kolečko,Urværk,Zahnrad,,Dentrado de Horloĝo,Engranaje de reloj,,Kellonratas,Rouage d'Horloge,,Óra Szerkezet,Ingranaggio d'orologio,時計の歯車,시계 톱니바퀴,Kloktandwiel,Klokkeutstyr,Mechanizm Zegara,Engrenagem de Relógio,,Mecanism Ceas,Часовая шестерня,Сатни зупчаник,Klockan växel,Saat Dişlisi,Механічна шестерня +You Cannot Use This Here,TXT_USEPUZZLEFAILED,,,,Zde se tento předmět použít nedá,Du kan ikke bruge dette her,Das kannst du hier nicht benutzen,,Vi ne povas uzi ĉi tion ĉi tie.,No puedes usar esto aquí,,Et voi käyttää tätä tässä,Vous ne pouvez pas utiliser cela ici.,,Ezt Itt Nem Használhatod,Non puoi usare questo oggetto qui,ここでは使用できない,이것은 여기에 사용할 수 없다,Dat kan je hier niet gebruiken,Du kan ikke bruke dette her,Nie możesz użyć tego tutaj,Você não pode usar isso aqui,Não podes usar isto aqui,Nu Poți Folosi Asta Aici,Здесь это невозможно использовать,Ово се не може користити овде,Du kan inte använda detta här,Bunu Burada Kullanamazsınız,Ви не можете використати тут це +Mesh Armor,TXT_ARMOR1,,,Mesh Armour,Kroužkové brnění,,Kettenrüstung,,Marŝkiraso,Armadura de Malla,,Rengashaarniska,Armure de Mailles,,Háló Páncél,Maglia metallica,鎖帷子,사슬 갑옷,Maliënkolder,Nettrustning,Kolczuga,Armadura de Malha,,Armură din Zale,Кольчуга,Верижњача,Nätrustning,Örgü Zırh,Кольчуга +Falcon Shield,TXT_ARMOR2,,,,Sokolí štít,Falke-skjold,Falkenschild,,Falko-Ŝildo,Escudo de Halcón,,Haukkakilpi,Bouclier du Faucon,,Sólyom Pajzs,Scudo del falco,鷹の盾,팔콘 방패,Valkenschild,Falkeskjold,Sokola Tarcza,Escudo do Falcão,,Scut Șoim,Соколиный щит,Соколов штит,Falken-sköld,Falcon Kalkanı,Соколиний щит +Platinum Helmet,TXT_ARMOR3,,,,Platinová helma,Platin-hjelm,Platinhelm,,Platena Kasko,Casco de Platino,,Platinakypärä,Casque de Platine,,Platina Sisak,Elmo di platino,白金の兜,백금 투구,Platina Helm,Platinahjelm,Platynowy Hełm,Capacete de Platina,,Coif de Platină,Платиновый шлем,Шлем од платине,Platinahjälm,Platin Kask,Платиновий шолом +Amulet of Warding,TXT_ARMOR4,,,,Amulet uhýbání,Amulet af afværge,Wachamulett,,Amuleto de Gardado,Amuleto de Guarda,,Suojelusamuletti,Amulette de Protection,,Oltalom Amulettje,Amuleto di protezione,回避の護符,수호의 부적,Amulet van Bescherming,Amulett av beskyttelse,Amulet Ochrony,Amuleto da Proteção,,Amuleta Protecției,Амулет стража,Амулет страже,Amulett för skydd,Korunma Tılsımı,Амулет вартового +Timon's Axe,TXT_WEAPON_F2,,,,Timonova sekera,Timons økse,Timons Axt,,Hakilo de Timon,Hacha de Timón,,Timonin kirves,Hache de Timon,,Timon Baltája,Ascia di timon,タイモンの斧,티몬의 도끼,Timon's Bijl,Timons øks,Topór Timona,Machado de Timon,,Toporul lui Timon,Топор Тимона,Тимонова секира,Timons yxa,Timon'un Baltası,Тімонова сокира +Hammer of Retribution,TXT_WEAPON_F3,,,,Kladivo odplaty,Gengældelsens hammer,Hammer der Rache,,Martelo de Repago,Martillo de Retribución,,Koston vasara,Marteau de la Rétribution,,Kárhozat Kalapácsa,Martello del castigo,報復の金槌,징벌의 망치,Hamer der Vergelding,Gjengjeldelsens hammer,Młot Odkupienia,Martelo da Retribuição,,Ciocanul Salvării,Молот возмездия,Чекић одмазде,Hämndhammaren,İntikam Çekici,Молот відплати +Quietus Assembled,TXT_WEAPON_F4,,,,Složený Tišitel,Forløser samlet,Erlöser komplettiert,,Kvietus' Muntita,Quietus Ensamblado,,Quietus koottuna,Quietus Assemblée,,Némusz Összerakva,Quietus assemblato,組み立てた 死滅の剣,완성된 종언의 검,Quietus in elkaar gezet,Quietus samlet,Złożony Uciszacz,Quietus Montada,,Argument Final Asamblat,Последний довод собран воедино,Самрт је сабрана,Quietus monterad,Quietus Birleştirildi,Упокій зібрано воєдино +Serpent Staff,TXT_WEAPON_C2,,,,Hadí hůl,Slange-stav,Schlangenstab,,Serpentbastono,Vara de Serpiente,,Käärmesauva,Sceptre du Serpent,,Kígyó Bot,Bastone del serpente,蛇の杖,뱀 지팡이,Slangenstaf,Slangestav,Laska Węży,Cetro da Serpente,,Bastonul Șarpelui,Змеиный посох,Змијски штап,Ormens stav,Yılan Asa,Посох змія +Firestorm,TXT_WEAPON_C3,,,,Ohnivá bouře,Ildstorm,Feuersturm,,Fajroŝtormo,Tormenta de Fuego,,Tulimyrsky,Tempête de Feu,,Tűzvihar,Tempesta di fuoco,ファイアストーム,화염폭풍,Vuurstorm,Ildstorm,Burza Ognia,Tempestade-de-Fogo,,Furtună de Foc,Огненный шторм,Огњена олуја,Eldstorm,Ateş Fırtınası,Вогняний шторм +Wraithverge Assembled,TXT_WEAPON_C4,,,,Složený Zjevitel,Spirit Bringer samlet,Geisterbringer komplettiert,,Fantomkruc' Muntita,Báculo Fantasmal Ensamblado,Vara Fantasmal Ensamblada,Haamusauva koottuna,Verge Phantasmale Assemblée,,Bosszúbot Összerakva,Verga Sconfinaspettri assemblata,組み立てた レイスバージ,완성된 사령의 십자가,Schimroede in elkaar gezet,Wraithverge samlet,Złożony Widmoskraj,Cajado Fantasma Montado,,Toiag Stafie Asamblat,Жезл духов собран воедино,Жезло утвара је сабрано,Wraithverge monterad,Wraithverge Birleştirildi,Символ Мари зібрано воєдино +Frost Shards,TXT_WEAPON_M2,,,,Ledové střepy,Frostskår,Frostsplitter,,Frostfragmentoj,Fragmentos de Escarcha,,Pakkassirpaleet,Eclats de Givre,,Fagyos Szilánkok,Frantumi gelati,フロスト シャード,얼음 파편,Vorstscherven,Frostskår,Lodowe Odłamki,Fragmentos de Geada,,Cioburi de Gheață,Ледяные осколки,Ледене крхотине,Frostskärvor,Buz Kırıkları,Льодяні уламки +Arc of Death,TXT_WEAPON_M3,,,,Jiskry smrti,Dødens bue,Todesblitz,,Arko de Morto,Arcos de la Muerte,,Kuolonkaari,Foudre Mortelle,,Halál Boltíve,Arco della morte,死の円弧,죽음의 번갯불,Doodsboog,Dødens bue,Łuk Śmierci,Arcos da Morte,,Izvorul Morții,Дуга смерти,Лук смрти,Dödsbåge,Ölüm Arkı,Арка смерті +Bloodscourge Assembled,TXT_WEAPON_M4,,,,Složený Krvehrom,Blodgisel samlet,Blutgeißel komplettiert,,Sangskurĝ' Muntita,Plaga Sangrienta ensamblada,,Veripiiska koottuna,Fléau Sanglant Assemblé,,Vérkorbács Összerakva,Flagello di Sangue assemblato,組み立てた 天罰,완성된 피의 재앙,Bloedgesel in elkaar gezet,Bloodscourge samlet,Złożona Krwioplaga,Flagelo de Sangue Montado,,Flagel Sângeros Asamblat,Кровавый бич собран воедино,Крвави бич је сабран,Bloodscourge monterad,Bloodscourge Birleştirildi,Кривава Кара зібрана воєдино +A weapon piece! This is your lucky day!,TXT_WEAPONPIECE,,,,Část zbraně! Dnes je tvůj šťastný den!,Et våbenstykke! Dette er din heldige dag!,Ein Waffensegment. Das ist dein Glückstag!,,Peco de armilo! Estas via bonŝanca tago!,¡Una pieza de un arma! ¡Es tu día de suerte!,,Aseen osa! Tämä on onnenpäiväsi!,Une pièce d'arme! C'est votre jour de chance!,,Egy fegyver darab! Szerencés napod van!,Il frammento di un'arma! È il tuo giorno fortunato! ,武器の一片! 今日は吉日だ!,무기의 한 조각이다! 운수 좋은 날인 것 같다!,Een wapenstuk! Dit is je geluksdag!,En våpendel! Dette er lykkedagen din!,Część broni! To twój szczęśliwy dzień!,Um fragmento de arma! Esse é o seu dia de sorte!,Um fragmento de arma! Este é o teu dia de sorte!,O piesă din super armă! E ziua ta norocoasă!,Часть оружия! Сегодня ваш счастливый день!,Део оружја! Данас Вам је срећан дан!,En vapendel! Detta är din lyckodag!,Bir silah parçası! Bugün şanslı gününüz!,Частина зброї! Та ви щасливчик! +Segment of Quietus,TXT_QUIETUS_PIECE,,,,Část Tišitele,Segment af Forløseren,Segment des Erlösers,,Segmento de Kvietus',Segmento de Quietus,,Quietuksen osa,Segment de Quietus,,Darab a Némuszból,Parte del Quietus,死滅の剣の切片,종언의 검 조각,Segment van Quietus,Segment av Quietus,Fragment Uciszacza,Segmento de Quietus,,Fragment din Argumentul Final,Часть последнего довода,Део Самрти,Segment av Quietus,Quietus'un bir bölümü,Частина Упокою +Segment of Wraithverge,TXT_WRAITHVERGE_PIECE,,,,Část Zjevitele,Segment af Spirit Bringer,Segment des Geisterbringers,,Segmento de Fantomkruc',Segmento del Báculo Fantasmal,,Haamusauvan osa,Segment de la Verge Phantasmale,,Darab a Bosszúbotból,Parte della Verga Sconfinaspettri,レイスバージの切片,사령의 십자가 조각,Segment van Schimroede,Segment av Wraithverge,Fragment Widmoskraju,Segmento do Cajado Fantasma,,Fragment din Toiagul Stafie,Часть жезла духов,Део Жезла утвара,Segment av Wraithverge,Wraithverge'in Segmenti,Частина Символу Мари +Segment of Bloodscourge,TXT_BLOODSCOURGE_PIECE,,,,Část Krvehromu,Segment af Blodgiselen,Segment der Blutgeißel,,Segmento de Sangskurĝ',Segmento de la Plaga Sangrienta,,Veripiiskan osa,Segment du Fléau Sanglant,,Darab a Vérkorbácsból,Parte del Flagello di Sangue,天罰の切片,피의 재앙 조각,Segment van Bloedgesel,Segment av Bloodscourge,Fragment Krwioplagi,Segmento do Flagelo de Sangue,,Fragment din Flagelul Sângeros,Часть кровавого бича,Део Крвавог бича,Segment av Bloodscourge,Bloodscourge'un Segmenti,Частина Кривавої Кари +,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,,, +You need the Steel Key,TXT_NEED_KEY_STEEL,,,,Potřebuješ ocelový klíč,Du skal bruge stålnøglen,Du brauchst den Stahlschlüssel,Χρειάζεσε το Ατσάλινο κλειδί.,Vi bezonas la Ŝtalan Ŝlosilon,Necesitas la Llave de Acero,,Tarvitset teräsavaimen,Vous avez besoin de la Clé d'Acier,,Az Acél Kulcsra van szükséged,Ti serve la Chiave d'Acciaio,鋼の鍵が必要だ,강철 열쇠가 필요하다,Je hebt de Stalen Sleutel nodig.,Du trenger stålnøkkelen,Potrzebujesz Stalowego Klucza,Você precisa da Chave de Aço,Precisas da Chave de Aço,Ai nevoie de Cheia din Oțel,Нужен стальной ключ,За отварање је потребан челични кључ,Du behöver stålnyckeln.,Çelik Anahtara ihtiyacın var,Вам потрібен сталевий ключ +You need the Cave Key,TXT_NEED_KEY_CAVE,,,,Potřebuješ klíč od jeskyně,Du skal bruge hulenøglen,Du brauchst den Höhlenschlüssel,,Vi bezonas la Kavern-Ŝlosilon,Necesitas la Llave de la Caverna,,Tarvitset luola-avaimen,Vous avez besoin de la Clé de la Cave,,A Barlang Kulcsra van szükséged,Ti serve la Chiave della Caverna ,洞窟の鍵が必要だ,동굴 열쇠가 필요하다,Je hebt de Grotsleutel nodig.,Du trenger hulenøkkelen,Potrzebujesz Klucza do Jaskini,Você precisa da Chave da Caverna,Precisas da Chave da Caverna,Ai nevoie de Cheia Peșterii,Нужен пещерный ключ,За отварање је потребан пећински кључ,Du behöver grottnyckeln,Mağara Anahtarına ihtiyacın var,Вам потрібен печерний ключ +You need the Axe Key,TXT_NEED_KEY_AXE,,,,Potřebuješ sekyrový klíč,Du skal bruge øksenøglen,Du brauchst den Axtschlüssel,,Vi bezonas la Hakil-Ŝlosilon,Necesitas la Llave de Hacha,,Tarvitset kirvesavaimen,Vous avez besoin de la Clé de la Hache,,A Fejsze Kulcsra van szükséged,Ti serve la Chiave dell'Ascia,斧の鍵が必要だ,도끼 열쇠가 필요하다,Je hebt de Bijlsleutel nodig.,Du trenger øksenøkkelen,Potrzebujesz Klucza-Topora,Você precisa da Chave do Machado,Precisas da Chave do Machado,Ai nevoie de Cheia Topor,Нужен ключ-топор,За отварање је потребан кључ секира,Du behöver yxnyckeln,Balta Anahtarına ihtiyacın var,Вам потрібен сокирний ключ +You need the Fire Key,TXT_NEED_KEY_FIRE,,,,Potřebuješ ohnivý klíč,Du skal bruge brandnøglen,Du brauchst den Feuerschlüssel,,Vi bezonas la Fajro-Ŝlosilon,Necesitas la Llave de Fuego,,Tarvitset tuliavaimen,Vous avez besoin de la Clé du Feu,,A Tűz Kulcsra van szükséged,Ti serve la Chiave del Fuoco ,炎の鍵が必要だ,불 열쇠가 필요하다,Je hebt de Vuursleutel nodig.,Du trenger Ildnøkkelen,Potrzebujesz Ognistego Klucza,Você precisa da Chave do Fogo,Precisas da Chave do Fogo,Ai nevoie de Cheia de Foc,Нужен огненный ключ,За отварање је потребан огњени кључ,Du behöver eldnyckeln,Ateş Anahtarına ihtiyacın var,Вам потрібен вогняний ключ +You need the Emerald Key,TXT_NEED_KEY_EMERALD,,,,Potřebuješ smaragdový klíč,Du skal bruge smaragdnøglen,Du brauchst den Smaragdschlüssel,,Vi bezonas la Smeraldan Ŝlosilon,Necesitas la Llave Esmeralda,,Tarvitset smaragdiavaimen,Vous avez besoin de la Clé d'Emeraude,,A Smaragd Kulcsra van szükséged,Ti serve la Chiave di Smeraldo ,翠玉の鍵が必要だ,에메랄드 열쇠가 필요하다,Je hebt de Smaragden Sleutel nodig.,Du trenger smaragdnøkkelen,Potrzebujesz Szmaragdowego Klucza,Você precisa da Chave Esmeralda,Precisas da Chave Esmeralda,Ai nevoie de Cheia din Smarald,Нужен изумрудный ключ,За отварање је потребан смарагдни кључ,Du behöver smaragdnyckeln,Zümrüt Anahtarı'na ihtiyacın var.,Вам потрібен смарагдовий ключ +You need the Dungeon Key,TXT_NEED_KEY_DUNGEON,,,,Potřebuješ klíč od žaláře,Du skal bruge fangehulsnøglen,Du brauchst den Kerkerschlüssel,,Vi bezonas la Karcer-Ŝlosilon,Necesitas la Llave del Calabozo,,Tarvitset tyrmän avaimen,Vous avez besoin de la Clé du Donjon,,A Várbörtön Kulcsra van szükséged,Ti serve la Chiave del Sotterraneo ,迷宮の鍵が必要だ,지하감옥 열쇠가 필요하다,Je hebt de Kerkersleutel nodig.,Du trenger fangehullsnøkkelen,Potrzebujesz Klucza do Lochu,Você precisa da Chave da Masmorra,Precisas da Chave das Masmorras,Ai nevoie de Cheia Temniței,Нужен ключ от подземелья,За отварање је потребан кључ од лагума,Du behöver Kerker-nyckeln,Zindan Anahtarına ihtiyacın var,Вам потрібен ключ від підземелля +You need the Silver Key,TXT_NEED_KEY_SILVER,,,,Potřebuješ stříbrný klíč,Du skal bruge sølvnøglen,Du brauchst den Silberschlüssel,Χρειάζεσε το Ασυμένιο κλειδί.,Vi bezonas la Arĝentan Ŝlosilon,Necesitas la Llave de Plata,,Tarvitset hopea-avaimen,Vous avez besoin de la Clé d'Argent,,Az Ezüst Kulcsra van szükséged,Ti serve la Chiave d'Argento ,銀の鍵が必要だ,은 열쇠가 필요하다,Je hebt de Zilveren Sleutel nodig.,Du trenger sølvnøkkelen,Potrzebujesz Srebrnego Klucza,Você precisa da Chave de Prata,Precisas da Chave Prata,Ai nevoie de Cheia din Argint,Нужен серебряный ключ,За отварање је потребан сребрни кључ,Du behöver silvernyckeln,Gümüş Anahtara ihtiyacın var,Вам потрібен срібний ключ +You need the Rusted Key,TXT_NEED_KEY_RUSTED,,,,Potřebuješ zrezivělý klíč,Du skal bruge den rustne nøgle,Du brauchst den rostigen Schlüssel,Χρειάζεσε το Σκουριασμένο κλειδί.,Vi bezonas la Rustan Ŝlosilon,Necesitas la Llave Oxidada,,Tarvitset ruosteisen avaimen,Vous avez besoin de la Clé Rouillée,,A Rozsdás Kulcsra van szükséged,Ti serve la Chiave Arrugginita ,錆びた鍵が必要だ,녹슨 열쇠가 필요하다,Je hebt de Geroeste Sleutel nodig.,Du trenger den rustne nøkkelen,Potrzebujesz Zardzewiałego Klucza,Você precisa da Chave Enferrujada,Precisas da Chave Enferrujada,Ai nevoie de Cheia Ruginită,Нужен ржавый ключ,За отварање је потребан зарђали кључ,Du behöver den rostade nyckeln,Paslı Anahtar'a ihtiyacın var.,Вам потрібен іржавий ключ +You need the Horn Key,TXT_NEED_KEY_HORN,,,,Potřebuješ parožní klíč,Du skal bruge hornnøglen,Du brauchst den Hornschlüssel,,Vi bezonas la Hup-Ŝlosilon,Necesitas la Llave de Cuerno,,Tarvitset sarviavaimen,Vous avez besoin de la Clé Corne,,A Szarv Kulcsra van szükséged,Ti serve la Chiave del Corno ,角の鍵が必要だ,뿔 열쇠가 필요하다,Je hebt de Hoornsleutel nodig.,Du trenger Horn-nøkkelen,Potrzebujesz Rogowego Klucza,Você precisa da Chave do Chifre,Precisas da Chave do Chifre,Ai nevoie de Cheia Corn,Нужен роговой ключ,За отварање је потребан рогати кључ,Du behöver hornnyckeln,Korna Anahtarına ihtiyacınız var,Вам потрібен ріговий ключ +You need the Swamp Key,TXT_NEED_KEY_SWAMP,,,,Potřebuješ klíč od bažiny,Du skal bruge sumpnøglen,Du brauchst den Sumpfschlüssel,,Vi bezonas la Marĉ-Ŝlosilon,Necesitas la Llave del Pantano,,Tarvitset suoavaimen,Vous avez besoin de la Clé des Marécages,,A Mocsár Kulcsra van szükséged,Ti serve la Chiave della Palude ,沼の鍵が必要だ,늪지대 열쇠가 필요하다,Je hebt de Moerassleutel nodig.,Du trenger Sump-nøkkelen,Potrzebujesz Bagiennego Klucza,Você precisa da Chave do Pântano,Precisas da Chave do Pântano,Ai nevoie de Cheia Mlaștinii,Нужен болотный ключ,За отварање је потребан мочварни кључ,Du behöver träsknyckeln,Bataklık Anahtarına ihtiyacın var.,Вам потрібен болотний ключ +You need the Castle Key,TXT_NEED_KEY_CASTLE,,,,Potřebuješ klíč od hradu,Du skal bruge slotsnøglen,Du brauchst den Burgschlüssel,,Vi bezonas la Kastel-Ŝlosilon,Necesitas la Llave del Castillo,,Tarvitset linnan avaimen,Vous avez besoin de la Clé du Château,,A Kastély Kulcsra van szükséged,Ti serve la Chiave del Castello ,城の鍵が必要だ,성 열쇠가 필요하다,Je hebt de Kasteelsleutel nodig.,Du trenger slottsnøkkelen,Potrzebujesz Klucza do Zamku,Você precisa da Chave do Castelo,Precisas da Chave do Castelo,Ai nevoie de Cheia Castelului,Нужен ключ от замка,За отварање је потребан кључ од замка,Du behöver slottsnyckeln,Kale Anahtarına ihtiyacın var,Вам потрібен ключ від фортеці +,,Actor tag names,,,,,,,,,,,,,,,,,,,,,,,,,,, +Afrit,FN_FIREDEMON,,,,,,,,Afrito,,,,,,,,アフリート,아프리트,Afriet,,,,,Demon de Foc,Африт,Африт,,,Африт +Serpent,FN_DEMON1,,,,Zlohad,Slange,Chaos-Schlange,,Serpento,Serpiente,,Käärme,,,Kígyó,Serpente del Caos,サーペント,서펜트,Slang,Slangen,Wąż,Serpente,,Șarpe,Змей,Серпент,Ormen,Yılan,Змій +Ettin,FN_ETTIN,,,,Skřet,,,,Gigantaĉo,,,,,,,,エティン,에틴,,,,,,Etin,Эттин,Етин,Ettin,,Еттін +Centaur,FN_CENTAUR,,,,Kentaur,Kentaur,Zentaur,,Centaŭro,Centauro,,Kentauri,Centaure,,Kentaur,Centauro,ケンタウロス,켄타우로스,Centaurus,Kentaur,,Centauro,,,Кентавр,Кентаур,Kentaur,Kentaur,Кентавр +Slaughtaur,FN_SLAUGHTAUR,,,,Ničitaur,Slagtaur,Schlachtaur,,Buĉataŭro,Masacratauro,,Teurastauri,Sangtaure,,Vágtaur,Sventrauro,スロアタウル,슬로터로스,Slachttaurus,Slakttaur,Rzeziotaur,Chacinotauro,,Centaur Violent,Убитавр,Кентаур старешина,Slaktaur,Katlaur,Кентавр хорунжий +Bishop,FN_BISHOP,,,,Biskup,Biskop,Bischof,,Episkopo,Obispo,,Piispa,Evèque,,Érsek,Vescovo,ビショップ,비숍,Bisschop,Biskop,Biskup,Bispo,,Episcop,Епископ,Епископ,Biskop,Piskopos,Єпископ +Wendigo,FN_ICEGUY,,,,,,,,Vendiko,,,,,,,,ウェンディゴ,윈디고,,,,,,Vendigo,Вендиго,Вендиго,,,Віндіго +Stalker,FN_SERPENT,,,,Slídil,,Wasserjäger,,Gvatanto,Acechador,,Vaanija,Chasseur,,Orvhalász,Cacciatore,ストーカー,스토커,,,Prześladowca,Caçador,,Vânător,Преследователь,Вребач,,,Сталкер +Reiver,FN_WRAITH,,,,Přízrak,,Phantom,,Fantomo,Saqueador,,Ryöväri,,,Martalóc,Incursore,レイバー,리버,Rover,,Rozbójnik,Fantasma,,Pungaș,Грабитель,Грабљивац,Reiver,Hayalet,Розбійник +Death Wyvern,FN_DRAGON,,,,Smrtidrak,Døden Wyvern,Todesdrache,,Morta viverno,Guiverno de la muerte,,Kuolontraakki,Vouivre de la Mort,,A Halál Sárkánya,Viverna Mortale,デス ワイバーン,데스 와이번,Doodsdraak,Døden Wyvern,Wiwerna Śmierci,Serpe da Morte,,Balaur al Morții,Виверна смерти,Змајак смрти,Döds Wyvern,Ölüm Wyvern,Віверна Смерті +Korax,FN_KORAX,,,,,,,,,,,Kooraks,,,,,唯一神コラックス,코락스,,,,,,,Коракс,Коракс,,,Коракс +Zedek,FN_FBOSS,,,,,,,,Zedeko,,,Sedek,,,,,ゼデク,제닥,,,,,,,Зедек,Зедек,,,Зедек +Menelkir,FN_MBOSS,,,,,,,,Menelkiro,,,Menelkir,,,,,メネルキル,메넬키어,,,,,,,Менелкир,Менелкир,,,Менелкір +Traductus,FN_CBOSS,,,,Traduktus,,,,Traduktuso,,,Traduktus,,,Traduktusz,,トラダクタス,트라닥투스,,,,,,,Традуктус,Традуктус,,,Традуктус +Heresiarch,FN_HERESIARCH,,,,Arcikacíř,Heresiark,Erzketzer,,Ĉefherezulo,Heresiarca,,Kerettiarkki,L'Hérésiarche,,Főeretnek,Eresiarca,ヘレシアーク,헤러시아크,,Heresiark,Herezjarcha,Heresiarca,,Ereziarh,Ересиарх,Јересијарх,Heresiark,Heresiark,Єресіарх +Blue Mana,AMMO_MANA1,,,,Modrá mana,Blå Mana,Blaues Mana,,Blua Manao,Maná azul,,Sininen mana,Mana Bleu,,Kék Mana,Mana blu,ブルーマナ,청색 마나,Blauwe Mana,Blå Mana,Niebieska Mana,Mana Azul,,Mană Albastră,Синяя мана,Плава мана,Blå Mana,Mavi Mana,Синя мана +Green Mana,AMMO_MANA2,,,,Zelená mana,Grøn Mana,Grünes Mana,,Verda Manao,Maná verde,,Vihreä mana,Mana Vert,,Zöld Mana,Mana verde,グリーンマナ,녹색 마나,Groene Mana,Grønn Mana,Zielona Mana,Mana Verde,,Mană Verde,Зелёная мана,Зелена мана,Grön Mana,Yeşil Mana,Зелена мана +Mace of Contrition,TAG_CWEAPMACE,,,,Palcát kajícnosti,Stridskølle af anger,Streitkolben,,Klabo de Penteco,Maza de Contrición,,Katumuksen nuija,Masse de Pénitence,,Bűnbánat Buzogánya,Mazza del Pentimento,懺悔のメイス,참회의 철퇴,Knots van Wroeging,Mace of Contrition,Buzdygan Skruchy,Maça da Contrição,,Buzduganul Remușcării,Булава раскаяния,Буздован покајања,Tystnadens stridsspira,Pişmanlık Topuzu,Булава покаяння +Serpent Staff,TAG_CWEAPSTAFF,,,,Hadí hůl,Slange-stav,Schlangenstab,,Serpentbastono,Bastón de Serpiente,,Käärmesauva,Sceptre du Serpent,,Kígyó Bot,Staffa del Serpente ,蛇の杖,뱀 지팡이,Slangenstaf,Slangestav,Laska Węży,Cetro da Serpente,,Bastonul Șarpelui,Змеиный посох,Змијски штап,Ormens stav,Yılan Asa,Посох змія +Firestorm,TAG_CWEAPFLAME,,,,Ohnivá bouře,Ildstorm,Feuersturm,,Fajrŝtormo,Tormenta de Fuego,,Tulimyrsky,Tempête de Feu,,Tűzvihar,Tempesta di Fuoco ,ファイアストーム,화염폭풍,Vuurstorm,Ildstorm,Burza Ognia,Tempestade-de-fogo,,Furtună de Foc,Огненный шторм,Огњена олуја,Eldstorm,Ateş Fırtınası,Вогняний шторм +Wraithverge,TAG_CWEAPWRAITHVERGE,,,,Zjevitel,Spirit Bringer,Geisterbringer,,Fantomkruc',Báculo Fantasmal,,Haamusauva,Verge Phantasmale,,Lidércvég,Verga SconfinaSpettri,レイスバージ,사령의 십자가,Schimroede,Wraithverge,Widmoskraj,Cajado Fantasma,,Toiag Stafie,Жезл духов,Жезло утвара,,Wraithverge,Символ Мари +Spiked Gauntlets,TAG_FWEAPFIST,,,,Ohrocené rukavice,Spidse handsker,Stachelhandschuhe,,Pintaj Fergantoj,Guanteletes Puntiagudos,,Piikkirautakintaat,Gantelets à Pointes,,Tűskés Páncélkesztyűk,Guantoni Spinati,スパイク ガントレット,가시 장갑,Spijkerhandschoenen,Pigghansker,Kolczaste Rękawice,Manoplas Espinhadas,,Mănuși cu Țepi,Шипастые перчатки,Бодљикаве рукавице,Spikade handskar,Çivili Eldivenler,Шипасті рукавиці +Timon's Axe,TAG_FWEAPAXE,,,,Timonova sekera,Timons økse,Timons Axt,,Hakilo de Timon,Hacha de Timón,,Timonin kirves,Hache de Timon,,Timon Baltája,Ascia di Timon,タイモンの斧,티몬의 도끼,Timon's Bijl,Timons øks,Topór Timona,Machado de Timon,,Toporul lui Timon,Топор Тимона,Тимонова секира,Timons yxa,Timon'un Baltası,Тімонова сокира +Hammer of Retribution,TAG_FWEAPHAMMER,,,,Kladivo odplaty,Hævnens hammer,Hammer der Rache,,Martelo de Repago,Martillo de Retribución,,Koston vasara,Marteau de la Rétribution,,Kárhozat Kalapácsa,Martello del Castigo,報復の金槌,징벌의 망치,Hamer van Vergelding,Gjengjeldelsens hammer,Młot Odkupienia,Martelo da Retribuição,,Ciocanul Salvării,Молот возмездия,Чекић одмазде,Hämndhammaren,İntikam Çekici,Молот відплати +Quietus,TAG_FWEAPQUIETUS,,,,Tišitel,Forløser,Erlöser,,Kvietus',,,,Quietus,,Némusz,,死滅の剣,종언의 검,,,Uciszacz,,,Argument Final,Последний довод,Самрт,,,Упокій +Sapphire Wand,TAG_MWEAPWAND,,,,Safírová hůl,Safir-stav,Saphirstab,,Safirsorĉbastono,Varita de Zafiro,,Safiirisauva,Baguette de Saphir,,Zafír Pálca,Scettro di Zaffiro ,サファイア ワンド,사파이어 지팡이,Saffieren Toverstok,Safirstaven,Szafirowa Różdżka,Cetro de Safira,,Toiag cu Safir,Сапфировая волшебная палочка,Сафирни штап,Safirstav,Safir Değnek,Сапфіровий жезл +Frost Shards,TAG_MWEAPFROST,,,,Ledové střepy,Frostskår,Frostsplitter,,Frostfragmentoj,Fragmentos de Escarcha,,Pakkassirpaleet,Eclats de Givre,,Fagyos Szilánkok,Schegge di Ghiaccio ,フロスト シャード,얼음 파편,Vorstscherven,Frostskår,Lodowe Odłamki,Fragmentos de Geada,,Cioburi de Gheață,Замораживающие осколки,Ледене крхотине,Frostskärvor,Buz Kırıkları,Льодяні уламки +Arcs of Death,TAG_MWEAPLIGHTNING,,,,Jiskry smrti,Dødens buer,Todesblitz,,Arkoj de Morto,Arcos de la Muerte,,Kuolonkaaret,Foudre Mortelle,,Halál Boltíve,Archi della Morte ,死の円弧,죽음의 번갯불,Doodsboog,Dødens buer,Łuki Śmierci,Arcos da Morte,,Izvoarele Morții,Дуга смерти,Лук смрти,Dödsbågar,Ölüm Yayları,Арка смерті +Bloodscourge,TAG_MWEAPBLOODSCOURGE,,,,Krvehrom,Blodgisel,Blutgeißel,,Sangskurĝ',Plaga Sangrienta,,Veripiiska,Fléau Sanglant,,Vérkorbács,Flagello di Sangue,天罰,피의 재앙,Bloedgesel,,Krwioplaga,Flagelo de Sangue,,Flagel Sângeros,Кровавый бич,Крвави бич,,,Кривава Кара +Disc of Repulsion,TAG_ARTIBLASTRADIUS,,,,Kotouč odpuzení,Afstødningsskive,Rückstoßscheibe,,Disko de Repelado,Disco de Repulsión,,Karkotuskiekko,Disque de Répulsion,,Visszaverő Pajzs,Disco della Repulsione ,反発の円盤,방탄의 원반,Schijf van Afstoting,Frastøtelsens skive,Dysk Odpychania,Disco da Repulsão,,Disc al Repulsiei,Диск отторжения,Диск одбијања,Skiva av avstötning,İtme Diski,Диск відштовхування +Dragonskin Bracers,TAG_ARTIBOOSTARMOR,,,,Dračí nátepníky,Drageskindsarmbøjler,Drachenhaut-Armschutz,,Brakbendo el Drakhaŭto,Brazaletes de piel de Dragón,,Lohikäärmeennahkarannesuojat,Brassards en peau de Dragon,,Sárkánybőr Karkötők,Bracciali in Pelle di Drago ,竜皮の小手,용가죽 팔찌,Drakenhuidbescherming,Dragehud-bindinger,Karwasze ze Smoczej Skóry,Braçadeiras de Pele de Dragão,,Brățări din Piele de Dragon,Наручи драконьей кожи,Наруквице од змајеве коже,Drakskinnsarmband,Ejderha Derisi Bilezikler,Наручі зі шкіри дракона +Krater of Might,TAG_ARTIBOOSTMANA,,,,Kalich síly,Kraftens bæger,Kelch der Macht,,Kratero de Potenco,Crátera de Poder,,Mahtikrateeri,Cratère de Pouvoir,,Hatalom Kráterje,Calice della Forza,魔力の盃,힘의 향로,Beker van Macht,Krater av makt,Czara mocy,Cálice do Poder,,Pocal al Puterii,Кубок могущества,Чаша силе,Mäktighetens krater,Kudret Krateri,Чаша міці +Flechette,TAG_ARTIPOISONBAG,,,,Střelka,,,,Flakono,,,,Fléchette,,Nyílhegy,Fiaschetta ,フレシェット,플레셰트,,,Flaszka,,,Flacon,Флешетта,Бочица,,,Флешета +Poison Cloud Flechette,TAG_ARTIPOISONBAG1,,,,Otrávená střelka,Flechette (giftig sky),Flechette (Giftwolke),,Venennub-Flakono,Flechette de Nube Venenosa,,Myrkkypilviflechette,Fléchette - Nuage Toxique,,Méregfelhő hegy,Fiaschetta Velenosa,毒ガス フレシェット,독구름 플레셰트,Flechette (giftige wolk),Giftsky-flechette,Flaszka Trującej Chmury,Flechette de Nuvem Venenosa,,Flacon cu Otravă,Флешетта ядовитого облака,Бочица отровног облака,Flechette med giftmoln,Zehirli Bulut Flechette,Флешета отруйної хмари +Timebomb Flechette,TAG_ARTIPOISONBAG2,,,,Časovaná střelka,Flechette (tidsbombe),Flechette (Zeitbombe),,Horloĝbomb-Flakono ,Bomba de Tiempo Flechette,,Aikapommiflechette,Fléchette - Bombe a Retardement,,Időbomba hegy,Fiaschetta a Tempo ,時限爆弾フレシェット,시한폭탄 플레셰트,Flechette (tijdbom),Tidsbombe Flechette,Flaszka-Bomba Zegarowa,Flechette Bomba-Relógio,,Bombă cu Ceas,Флешетта часовой бомбы,Бочица временске бомбе,Tidsbomb Flechette,Saatli bomba Flechette,Флешета часової бомби +Grenade Flechette,TAG_ARTIPOISONBAG3,,,,Granátová střelka,Flechette (granat),Flechettre (Granate),,Grenad-Flakono,Granada Flechette,,Kranaattiflechette,Fléchette - Grenade,,Robbanó hegy,Fiaschetta da Lancio,グレネードフレシェット,폭발성 플레셰트,Flechette (granaat),Granat Flechette,Flaszka-Granat,Flechette Granada,,Flacon-Grenadă,Гранатная флешетта ,Бочица граната,Granat Flechette,El Bombası Flechette,Гранатна флешета +Mystic Ambit Incant,TAG_ARTIHEALINGRADIUS,,,,Tajemný čár koljdoucí,,,,Sorĉo de Mistika Sfero,Encantamiento de Ámbito Místico,,Mystisen piirin loitsu,Incantation Mystique,,Misztikus Mágialista,Incantamento Mistico ,魅知国の秘法,신비 영역의 주문,,,Inkantancja Mistycznego Kręgu,Encantamento Místico,,Pergament Mistic,Мистический зачарованный свиток,Чаролија магичног јединства,,Mistik Ambit Büyüsü,Закляття містичної області +Icon of the Defender,TAG_ARTIDEFENDER,,,,Obráncova ikona,Ikon af forsvareren,Ikone des Verteidigers,,Ikono de la Defendanto,Icono del Defensor,Ícono del Defensor,Puolustajan ikoni,Icône du Défenseur,,Védelmező Ikonja,Emblema del Difensore ,守護者の像,수호의 성상,,Forsvarerens ikon,Ikona Obrońcy,Ícone do Defensor,,Imaginea Apărătorului,Символ защитника,Симбол браниоца,Försvararens ikon,Savunucunun Simgesi,Символ захисника +Porkalator,TAG_ARTIPORK,,,,Vepřovitel,,,,Porkigilo,Porcinador,,Sikaannuttaja,Porcificateur,,Ártányátok,Porchificatore,ポークレイター,돈육기,,,Schabowator,Porquificador,,Porcolator,Свиновизатор,Свињатор,,,Захрюкувач +Boots of Speed,TAG_ARTISPEED,,,,Běhuté boty,Støvler af hastighed,Turbo-Stiefel,,Botoj de Rapideco,Botas de Velocidad,,Ripeyssaappaat,Bottes de Célérité,,Sebesség Cipői,Stivali della Fretta,素早さの靴,속도의 부츠,Snelheidslaarzen,Støvler av fart,Buty Szybkości,Botas da Rapidez,,Bocancii Vitezei,Сапоги-скороходы,Брзинске чизме,Stövlar av snabbhet,Hız Çizmeleri,Семимильні чоботи +Dark Servant,TAG_ARTISUMMON,,,,Temný služebník,Mørk tjener,Dunkler Diener,,Malluma Servanto,Servidor Oscuro,,Pimeä palvelija,Serviteur Noir,,Árny Szolga,Servo Oscuro,闇の従者,어둠의 하인,Donkere Dienaar,Mørk tjener,Mroczny Sługa,Servo Negro,,Servitor Întunecat,Тёмный слуга,Мрачни слуга,Mörk tjänare,Karanlık Hizmetkar,Темний слуга +Banishment Device,TAG_ARTITELEPORTOTHER,,,,Vyhošťovač,Forvisningsanordning,Verbannungsgerät,,Forpelilo,Dispositivo de Destierro,,Häivytyskoje,Outil de Banissement,,Számüzető Szerkentyű,Congegno dell'Esilio,追放のデバイス,소멸 장치,Verbanningsapparaat,Forvisningsinnretning,Urządzenie Wygnania ,Dispositivo do Banimento,,Dispozitiv al Alungării,Механизм изгнания,Амблем прогањања,Förvisningsenhet,Sürgün Cihazı,Пристрій заслання +Yorick's Skull,TAG_ARTIPUZZSKULL,,,,Jorikova lebka,Yoricks kranium,Yoricks Schädel,,Kranio de Yorick,Calavera de Yorick,Cráneo de Yorick,Yorickin kallo,Crâne de Yorick,,Yorick Koponyája,Teschio di Yorick,ヨリックの髑髏,요릭의 두개골,Yorick's Schedel,Yoricks hodeskalle,Czaszka Yoricka,Crânio de Yorick,,Craniul lui Yorick,Череп Йорика,Јорикова лобања,Yoricks skalle,Yorick'in Kafatası,Череп Йоріка +Heart of D'Sparil,TAG_ARTIPUZZGEMBIG,,,,Srdce D'Sparila,D'Sparils hjerte,D'Sparils Herz,,Koro de D'Sparil,Corazón de D'Sparil,,D'Sparilin sydän,Cœur de D'Sparil,,D'Sparil Szíve,Cuore di D'Sparil,デ'スパリルの心,드'스파릴의 심장,Hart van D'Sparil,D'Sparils hjerte,Serce D'Sparila,Coração de D'Sparil,,Inima lui D'Sparil,Сердце Д'Спарила,Д'Спарилово срце,D'Sparils hjärta,D'Sparil'in Kalbi,Серце Д'Спаріла +Ruby Planet,TAG_ARTIPUZZGEMRED,,,,Rubínová planeta,Rubinplanet,Rubinplanet,,Rubena Planedo,Planeta Rubí,,Rubiiniplaneetta,Planète en rubis,,Rubin Bolygó,Pianeta di Rubino,ルビーの宝石,루비 행성석,Robijnrode Planeet,Rubinplaneten,Rubinowa Planeta,Planeta Rubi,,Planetă din Rubin,Рубиновая планета,Планета рубина,Rubinplanet,Yakut Gezegeni,Рубінова планета +Emerald Planet (1),TAG_ARTIPUZZGEMGREEN1,,,,Smaragdová planeta (1),Smaragdplanet (1),Smaragdplanet (1),,Smeralda Planedo (1),Planeta Esmeralda (1),,Smaragdiplaneetta (1),Planète en émeraude (1),,Smaragd Bolygó (1),Pianeta di Smeraldo (1),エメラルドの宝石1,에메랄드 행성석 (1),Smaragdgroene Planeet (1),Smaragdplaneten (1),Szmaragdowa Planeta (1),Planeta Esmeralda (1),,Planetă din Smarald (1),Изумрудная планета (1),Смарагдна планета (1),Smaragdplanet (1),Zümrüt Gezegen (1),Смарагдова планета (1) +Emerald Planet (2),TAG_ARTIPUZZGEMGREEN2,,,,Smaragdová planeta (2),Smaragdplanet (2),Smaragdplanet (2),,Smeralda Planedo (2),Planeta Esmeralda (2),,Smaragdiplaneetta (2),Planète en émeraude (2),,Smaragd Bolygó (2),Pianeta di Smeraldo (2),エメラルドの宝石2,에메랄드 행성석 (2),Smaragdgroene Planeet (2),Smaragdplaneten (2),Szmaragdowa Planeta (2),Planeta Esmeralda (2),,Planetă din Smarald (2),Изумрудная планета (2),Смарагдна планета (2),Smaragdplanet (2),Zümrüt Gezegen (2),Смарагдова планета (2) +Sapphire Planet (1),TAG_ARTIPUZZGEMBLUE1,,,,Safírová planeta (1),Safirplanet (1),Saphirplanet (1),,Safira Planedo (1),Planeta Zafiro (1),,Safiiriplaneetta (1),Planète en saphir (1),,Zafír Bolygó (1),Pianeta di Zaffiro (1),サファイアの宝石1,사파이어 행성석 (1),Saffierblauwe Planeet (1),Safirplaneten (1),Szafirowa Planeta (1),Planeta Safira (1),,Planetă din Safir (1),Сапфировая планета (1),Сафирна планета (1),Safirplanet (1),Safir Gezegen (1),Сапфірова планета (1) +Sapphire Planet (2),TAG_ARTIPUZZGEMBLUE2,,,,Safírová planeta (2),Safirplanet (2),Saphirplanet (2),,Safira Planedo (2),Planeta Zafiro (2),,Safiiriplaneetta (2),Planète en saphir (2),,Zafír Bolygó (2),Pianeta di Zaffiro (2),サファイアの宝石2,사파이어 행성석 (2),Saffierblauwe Planeet (2),Safirplaneten (2),Szafirowa Planeta (2),Planeta Safira (2),,Planetă din Safir (2),Сапфировая планета (2),Сафирна планета (2),Safirplanet (2),Safir Gezegen (2),Сапфірова планета (2) +Daemon Codex,TAG_ARTIPUZZBOOK1,,,,,,,,Kodekso de Demono,Códice del Demonio,,Daemon-koodeksi,Codex Démoniaque,,Démon Kódex,Codice Demoniaco ,デーモンの写本,악마의 고문서,,,Demoniczny Kodeks,Códice Demoníaco,,Codexul Demonilor,Демонический кодекс,Демонски кодекс,,,Демонічний кодекс +Liber Oscura,TAG_ARTIPUZZBOOK2,,,,,,,,Liber Oscura,Liber Oscura,,,,,,,オスキュラ公文書,어둠의 자유서,,,Liber Oscura,,,Liber Obscura,Либер Оскура,Либер Оскура,,,Лібер Оскура +Flame Mask,TAG_ARTIPUZZSKULL2,,,,Plamenná maska,Flamme-maske,Flammenmaske,,Fajrmasko,Mascara de Llamas,Mascara de Flamas,Liekkinaamio,Masque de Flammes,,Láng Maszk,Maschera delle Fiamme ,炎の仮面,화염의 가면,Vuurmasker,Flammemaske,Maska Płomieni,Máscara das Chamas,,Mască de Foc,Маска пламени,Маска пламена,Flam-Mask,Alev Maskesi,Полум'яна маска +Glaive Seal,TAG_ARTIPUZZFWEAPON,,,,Glévská pečeť,Sværdsegl,Schwertsiegel,,Sigelo de Glavo,Sello de Espada,,Miekkasinetti,Sceau du Glaive,,Pallos Pecsét,Sigillo del Brando,グレイブシール,밀폐된 칼날,Lanszegel,Glaive segl,Pieczęć Glewii,Selo do Gládio,,Sigiliu Spadă,Печать воителя,Војников печат,Glasögonsegel,Glaive Mühür,Воїнська печатка +Holy Relic,TAG_ARTIPUZZCWEAPON,,,,Svatá relikvie,Hellig relikvie,Heiliges Relikt,,Sankta Relikvo,Santa Reliquia,,Pyhä reliikki,Relique Sacrée,,Szent Ereklye,Reliquia Sacra,聖遺物,신성한 유물,Heilige Relikwie,Hellig relikvie,Święta Relikwia,Relíquia Sagrada,,Relicvă Sfântă,Святая реликвия,Света реликвија,Heliga reliker,Kutsal Emanet,Свята реліквія +Sigil of the Magus,TAG_ARTIPUZZMWEAPON,,,,Mágovo sigilium,Magus' segl,Symbol des Magiers,,Sigelo de la Mago,Emblema del Mago,,Taikurin sinetti,Sceau du Mage,,Mágus Pecsétje,Suggello del Magus,メイガスの印章,마거스의 인장,Sigaar van de Magus,Magusens segl,Emblemat Maga,Sígilo do Mago,,Sigiliul Magului,Печать Мага,Чаробњаков симбол,Magikerns sigill,Büyücünün Sigil'i,Знак магів +Iron gear,TAG_ARTIPUZZGEAR1,,,,Železné kolečko,Tandhjul af jern,Eisenzahnrad,,Fera Dentrado,Engranaje de Hierro,,Rautaratas,Engrenage en Fer,,Vas Felszerelés,Ingranaggio di Ferro,鉄の歯車,양철 톱니바퀴,IJzeren uitrusting,Jernutstyr,Żelazna Zębatka,Engrenagem de ferro,,Mecanism din fier,Железная шестерня,Гвожђени зупчаник,Kugghjul av järn,Demir dişli,Залізна шестерня +Brass gear,TAG_ARTIPUZZGEAR2,,,,Mosazné kolečko,Tandhjul i messing,Messingzahnrad,,Latuna Dentrado,Engranaje de Bronce,,Messinkiratas,Engrenage en Bronze,,Réz Felszerelés,Ingranaggio di Ottone ,真鍮のギア,황동 톱니바퀴,Messing uitrusting,Utstyr av messing,Mosiężna Zębatka,Engrenagem de latão,,Mecanism din alamă,Латунная шестерня,Месингани зупчаник,Kugghjul av mässing,Pirinç dişli,Латунна шестерня +Brass and iron gear,TAG_ARTIPUZZGEAR3,,,,Mosazno-železné kolečko,Tandhjul af messing og jern,Messing-und-Eisen-Zahnrad,,Latuna Fera Dentrado,Engranaje de Bronce y Hierro,,Messinki- ja rautaratas,Engrenage en Fer et Bronze,,Vas és Réz Felszerelés,Ingranaggio di Ferro e Ottone ,鉄と真鍮のギア,황동과 양철 톱니바퀴,Messing en ijzeren uitrusting,Utstyr av messing og jern,Zębatka z mosiądzu i żelaza,Engrenagem de ferro e latão,,Mecanism din alamă și fier,Латунно-железная шестерня,Месинганoгвожђени зупчаник,Kugghjul av mässing och järn,Pirinç ve demir dişli,Латунно-залізна шестерня +Silver and brass gear,TAG_ARTIPUZZGEAR4,,,,Stříbro-mosazné kolečko,Tandhjul af sølv og messing,Silber-und-Messing-Zahnrad,,Arĝenta Latuna Dentrado,Engranaje de Plata y Bronce,,Hopea- ja messinkiratas,Engrenage en Argent et Bronze,,Ezüst és Réz Felszerelés,Ingranaggio di Ottone e Argento ,銀と真鍮のギア,은과 황동 톱니바퀴,Zilveren en messing uitrusting,Utstyr av sølv og messing,Zębatka ze srebra i mosiądzu,Engrenagem de prata e latão,,Mecanism din argint și alamă,Серебряно-латунная шестерня,Сребрномесигани зупчаник,Kugghjul av silver och mässing,Gümüş ve pirinç dişli,Срібно-латунна шестерня +,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,,, +%o tasted an Afrit's fire.,OB_FIREDEMON,,,,%o okusil@[ao_cs] afritův oheň.,%o smagte en afrits ild.,%o spürte das Feuer des Afrits.,,%o gustis la fajron de Afrito.,%o ha probado el fuego de un Afrit.,%o probó el fuego de un Afrit.,%o maistoi afritin tulta.,%o a goûté au feu d'un Afrit.,,%o megkóstolta a Tűz Szellem parazsát.,%o ha assaggiato il fuoco di un Afrit. ,%o はアフリートの炎を味わった。,%o 은(는) 아프리트의 화염을 맛봤다.,%o proefde het vuur van een Afriet.,%o smakte en Afrits ild.,%o spróbował@[ao_pl] ognia Afrita.,%o provou o fogo de um Afrit.,,%o a gustat flacăra Demonului de Foc.,Игрок %o отведал огня африта.,%o је окуси@[ao_1_sr] Афритов огањ.,%o smakade en Afrits eld.,%o bir Afrit'in ateşini tattı.,%o скуштува@[adj_1_ua] вогню Африта. +%o was scalded by a Serpent.,OB_DEMON1,,,,%o byl@[ao_cs] upálen@[ao_cs] zlohadem.,%o blev skoldet af en slange.,%o wurde von der Chaos-Schlange gebissen.,,%o brogiĝis de Serpento.,A %o l@[ao_esp] ha carbonizado una Serpiente.,A %o l@[ao_esp] carbonizó una Serpiente.,%o joutui käärmeen kalttaamaksi.,%o a été brûlé@[e_fr] par un Serpent.,,%o testét leforrázta egy Kígyó,%o è stato sciolto da un Serpente del Caos,%o はサーペントに火傷を負わされた。,%o 은(는) 서펜트에 데였다.,%o werd gebroeid door een Slang.,%o ble skåldet av en slange.,%o został@[ao_pl] poparzon@[adj_pl] przez Węża.,Uma Serpente escaldou %o.,,%o a fost opărit de un Șarpe.,Игрок %o спалён змеем.,Играча %o је спалио Серпент.,%o blev skållad av en orm.,%o bir yılan tarafından haşlandı.,%o було спалено змієм. +%o was poisoned by a Serpent.,OB_DEMON2,,,,%o byl@[ao_cs] otráven@[ao_cs] zlohadem.,%o blev forgiftet af en slange.,%o wurde von der Chaos-Schlange verbrannt.,,%o veneniĝis de Serpento.,A %o l@[ao_esp] ha envenenado una Serpiente.,A %o l@[ao_esp] envenenó una Serpiente.,%o joutui käärmeen myrkyttämäksi.,%o a été empoisonné@[e_fr] par un Serpent.,,%o vérébe mérget juttatott egy Kígyó,%o è stato avvelenato da un Serpente del Caos. ,%o はサーペントの毒にやられた。,%o 은(는) 독 서펜트에게 중독 당했다.,%o werd vergiftigd door een Slang.,%o ble forgiftet av en slange.,%o został@[ao_pl] zatrut@[adj_pl] przez Węża.,%o foi envenenad@[ao_ptb] por uma Serpente.,,%o a fost otrăvit de un Șarpe.,Игрок %o отравлен змеем.,Играча %o је отровао Серпент.,%o blev förgiftad av en orm.,%o bir yılan tarafından zehirlendi.,%o було отруєно змієм. +%o was mashed by an Ettin.,OB_ETTIN,,,,%o byl@[ao_cs] umlácen@[ao_cs] skřetem.,%o blev moset af en Ettin.,%o wurde von dem Ettin zermatscht.,,%o frakasiĝis de Gigantaĉo.,%o ha quedado hech@[ao_esp] puré por un Ettin.,%o quedó hech@[ao_esp] puré por un Ettin.,%o joutui ettinin muhentamaksi.,%o a été réduit@[e_fr] en purée par un Ettin.,,%o csillagokat lát az Ettin miatt.,%o è stato schiacciato da un Ettin. ,%o はエティンに潰された。,%o 은(는) 에틴에게 철퇴를 맞았다.,%o werd gepureerd door een Ettin.,%o ble knust av en Ettin.,%o został@[ao_pl] stłuczon@[adj_pl] przez Ettina.,%o foi feito purê por um Ettin.,,%o a fost făcut piure de un Etin.,Игрока %o раздробил эттин.,Играча %o је смрскао Еттин.,%o blev mosad av en Ettin.,%o bir Ettin tarafından ezildi.,%o затовк еттін. +%o was cut up by a Centaur.,OB_CENTAUR,,,,%o byl@[ao_cs] rozsekán@[ao_cs] kentaurem.,%o blev skåret op af en kentaur.,%o wurde von dem Zentaur aufgeschlitzt.,,%o distranĉiĝis de Centaŭro.,A %o l@[ao_esp] ha partido un Centauro.,A %o l@[ao_esp] partió un Centauro.,%o joutui kentaurin pilkkomaksi.,%o a été tranché@[e_fr] par un Centaure.,,%o fel lett vágva a Kentaur jóvoltából.,%o è stato affettato da un Centauro. ,%o はケンタウロスに切り刻まれた。,%o 은(는) 켄타우로스에 의해 절단됐다.,%o werd versneden door een Centaurus.,%o ble kuttet opp av en Kentaur.,%o został@[ao_pl] pocięt@[adj_pl] przez Centaura.,%o foi fatiad@[ao_ptb] por um Centauro.,,%o a fost tăiat deschis de un Centaur.,Игрока %o разрезал кентавр.,Играча %o је расекао Кентаур.,%o blev styckad av en Kentaur.,%o bir Kentaur tarafından kesildi.,%o зарізав кентавр. +%o was cut up by a Slaughtaur.,OB_SLAUGHTAURHIT,,,,%o byl@[ao_cs] rozsekán@[ao_cs] ničitaurem.,%o blev skåret op af en slagtaur.,%o wurde von dem Schlachtaur aufgeschlitzt.,,%o distranĉiĝis de Buĉataŭro.,A %o l@[ao_esp] ha partido un Masacratauro.,A %o l@[ao_esp] partió un Masacratauro.,%o joutui teurastaurin pilkkomaksi.,%o a été tranché@[e_fr] par un Sangtaure.,,%o nagyon felvágott és a Vágtaur is a játékost,%o è stato affettato da uno Sventrauro. ,%o はスロアタウルに切り刻まれた。,%o 은(는) 슬로터로스에 의해 심하게 절단됐다.,%o werd versneden door een Slachtaurus.,%o ble kuttet opp av en Slakttaur.,%o został@[ao_pl] pocięt@[adj_pl] Rzeziotaura.,%o foi fatiad@[ao_ptb] por um Chacinotauro.,,%o a fost tăiat deschis de un Centaur Violent.,Игрока %o разрезал убитавр.,Играча %o је расекао Кентаур старешина.,%o blev styckad av en Slaktaur.,%o bir Katlaur tarafından kesildi.,%o зарізав кентавр хорунжий. +%o was struck down by a Slaughtaur's fireball.,OB_SLAUGHTAUR,,,,%o byl@[ao_cs] zabit@[ao_cs] ničitaurovou ohnivou koulí.,%o blev slået ned af en slagtauras ildkugle.,%o wurde von dem Feuerball des Schlachtaurs niedergestreckt.,,%o subite mortiĝis de fajropilko de Buĉataŭro.,A %o l@[ao_esp] ha abatido la bola de fuego de un Masacratauro.,A %o l@[ao_esp] derribó la bola de fuego de un Masacratauro.,%o joutui teurastaurin tulipallon kaatamaksi.,%o a été touché@[e_fr] par une boule de feu de Sangtaure.,,%o másodfokú égési sérüléseket szenvedett el a Vágtaur tűzgolyójától.,%o è stato abbattuto dalla palla di fuoco di uno Sventrauro. ,%o はスロアタウルの火玉に倒された。,%o 은(는) 슬로터로스의 마법구에 의해 피격당했다.,%o werd neergeslagen door een Slachtaurus' vuurbal.,%o ble truffet av en Slakttaurs ildkule.,%o został@[ao_pl] trafion@[adj_pl] przez kulę ognia Rzeziotaura.,%o foi abatid@[ao_ptb] pela bola de fogo de um Chacinotauro.,,"%o a fost răpus de mingea de foc a unui Centaur Violent.",Игрока %o сбил огненным шаром убитавр.,Играча %o је огњеном куглом оборио Кентаур старешина.,%o blev nedslagen av en Slauktaurs eldklot.,%o bir Katlaur'un ateş topuyla vuruldu.,Кентавр хорунжий знищив %o фаєрболом. -%o succumbed to a Bishop's dark power.,OB_BISHOP,,,,%o podlehl@[ao_cs] biskupově temné moci.,%o bukkede under for en biskops mørke kraft.,%o fiel der dunklen Macht des Bischofs zum Opfer.,,%o subfaliĝis de malluma potenco de Episkopo.,%o ha sucumbido ante el poder oscuro de un Obispo.,%o sucumbió ante el poder oscuro de un Obispo.,%o lankesi piispan pimeään voimaan.,%o a succombé au pouvoir obscur d'un évèque.,%o megadta magát a Püspök sötét erejének,%o è stato sottomesso dalla magia oscura di un Vescovo. ,%o はビショップの闇の力に屈した。,%o 은(는) 비숍의 힘에 무릎을 꿇었다.,%o bezweek aan de donkere kracht van een Bisschop.,%o bukket under for en Biskops mørke kraft.,%o uległ@[ao_pl] mrocznej mocy Biskupa.,%o sucumbiu ao poder negro de um Bispo.,,%o a cedat puterii întunecate a Episcopului.,Игрок %o поддался чёрным силам Епископа.,%o је подлег@[ao_2_sr] Епископовим црним силама.,%o gav efter för en biskops mörka kraft.,%o bir Piskopos'un karanlık gücüne yenik düştü.,%o підкори@[adj_2_ua] темній магії епископа. -%o was frozen solid by a Wendigo.,OB_ICEGUY,,,,%o byl@[ao_cs] zamrznut@[ao_cs] wendigem.,%o blev frosset fast af en wendigo.,%o wurde von dem Wendigo tiefgefroren.,,%o tute frostiĝis de Vendiko.,A %o l@[ao_esp] ha congelado un Wendigo.,A %o l@[ao_esp] congeló un Wendigo.,%o joutui wendigon läpikotaisin jäädyttämäksi.,%o a été gelé@[e_fr] par un Wendigo.,%o testét keményre fagyasztotta egy Wendigo,%o è stato congelato da un Wendigo. ,%o はウェンディゴによって固められた。,%o 은(는) 윈디고에 의해 단단하게 얼려졌다.,%o werd bevroren door een Wendigo.,%o ble frosset fast av en Wendigo.,%o został@[ao_pl] zamrożon@[adj_pl] przez Wendigo.,%o foi congelad@[ao_ptb] por um Wendigo.,,%o a fost făcut statuie de un Vendigo.,Игрока %o полностью заморозил вендиго.,Играча %o је потпуно замрзнуо Вендиго.,%o blev frusen av en Wendigo.,%o bir Wendigo tarafından kaskatı donduruldu.,Вендіго повністю заморозив %o. -%o was mauled by a Stalker.,OB_SERPENTHIT,,,,%o byl@[ao_cs] umlácen@[ao_cs] slídilem.,%o blev mast af en stalker.,%o wurde von dem Wasserjäger zerfleischt.,,%o vundegiĝis de Gvatanto.,A %o l@[ao_esp] ha triturado un Acechador.,A %o l@[ao_esp] trituró un Acechador.,%o joutui vaanijan raatelemaksi.,%o a été mutilé@[e_fr] par un Chasseur.,%o szét lett marcangolva egy Orhalász által.,%o è stato malmenato da un Cacciatore. ,%o はストーカーに引っ掻かれた。,%o 은(는) 스토커에게 발렸다.,%o werd verminkt door een Stalker.,%o ble maltraktert av en Stalker.,%o został@[ao_pl] poturbowan@[adj_pl] przez Prześladowcę.,%o foi mutilad@[ao_ptb] por um Caçador.,,%o a fost sfâșiat de un Vânător.,Игрок %o покусан преследователем.,Играча %o је растргао Вребач.,%o blev söndersliten av en Stalker.,%o bir Stalker tarafından parçalandı.,%o роздер сталкер. -%o was melted by a Stalker.,OB_SERPENT,,,,%o byl@[ao_cs] rozpuštěn@[ao_cs] slídilem.,%o blev smeltet af en stalker.,%o wurde von dem Wasserjäger geschmolzen.,,%o fandiĝis de Gvatanto.,A %o l@[ao_esp] ha derretido un Acechador.,A %o l@[ao_esp] derritió un Acechador.,%o joutui vaanijan sulattamaksi.,%o a été fondu@[e_fr] par un Chasseur.,%o csontjairól a húst leolvasztotta egy Orvhalász,%o è stato squagliato da un Cacciatore. ,%o はストーカーに溶かされた。,%o 은(는) 스토커에 의해 녹았다.,%o werd gesmolten door een Stalker.,%o ble smeltet av en Stalker.,%o został@[ao_pl] stopion@[adj_pl] przez Prześladowcę.,%o foi derretid@[ao_ptb] por um Caçador.,,%o a fost topit de un Vânător.,Игрока %o расплавил преследователь.,Играча %o је растопио Вребач.,%o blev smält av en Stalker.,%o bir Takipçi tarafından eritildi.,%o розплавив сталкер. -%o was charred by a Reiver.,OB_WRAITH,,,,%o byl@[ao_cs] zpopelněn@[ao_cs] přízrakem.,%o blev forkullet af en reiver.,%o wurde von dem Phantom verkohlt.,,%o brulegiĝis de Fantomo.,A %o l@[ao_esp] ha carbonizado un Saqueador.,A %o l@[ao_esp] carbonizó un Saqueador.,%o joutui ryövärin hiiltämäksi.,%o a été carbonisé@[e_fr] par un Reiver.,%o testét egy Martalóc elszenesítette.,%o è stato carbonizzato da un Incursore. ,%o はレイバーに黒焦げにされた。,%o 은(는) 리버에 의해 그슬렸다.,%o werd verbrand door een Rover.,%o ble forkullet av en Reiver.,%o został@[ao_pl] zwęglon@[adj_pl] przez Rozbójnika.,%o foi carbonizad@[ao_ptb] por um Fantasma.,,%o a fost ceruit de un Pungaș.,Игрока %o обуглил грабитель.,Играча %o је угљенисао Вребач.,%o blev förkolnad av en Reiver.,%o bir Hayalet tarafından yakıldı.,%o було спалено розбійником. -%o had %p life stolen by a Reiver.,OB_WRAITHHIT,,,,%o si nechal@[ao_cs] ukradnout život přízrakem.,%o fik sit liv stjålet af en reiver.,%o wurde das Leben von dem Phantom gestohlen.,,%o havis sian vivon ŝtelita de Fantomo.,A %o le ha robado la vida un Saqueador.,A %o le robó la vida un Saqueador.,Ryöväri riisti pelaajan %o hengen.,%o a perdu la vie face à un Reiver.,%o %p életét ellopta egy Martalóc,%o ha permesso che un Incursore prosciugasse la sua vita ,%o はレイバーに命を %p盗まれた。,%o 은(는) 리버에게 영혼을 도둑맞았다.,%o had @[zijn_haar_nl] leven gestolen door een Rover.,%o fikk %p liv stjålet av en Reiver.,"Życie %o zostało skradzione przez Rozbójnika. +%o succumbed to a Bishop's dark power.,OB_BISHOP,,,,%o podlehl@[ao_cs] biskupově temné moci.,%o bukkede under for en biskops mørke kraft.,%o fiel der dunklen Macht des Bischofs zum Opfer.,,%o subfaliĝis de malluma potenco de Episkopo.,%o ha sucumbido ante el poder oscuro de un Obispo.,%o sucumbió ante el poder oscuro de un Obispo.,%o lankesi piispan pimeään voimaan.,%o a succombé au pouvoir obscur d'un évèque.,,%o megadta magát a Püspök sötét erejének,%o è stato sottomesso dalla magia oscura di un Vescovo. ,%o はビショップの闇の力に屈した。,%o 은(는) 비숍의 힘에 무릎을 꿇었다.,%o bezweek aan de donkere kracht van een Bisschop.,%o bukket under for en Biskops mørke kraft.,%o uległ@[ao_pl] mrocznej mocy Biskupa.,%o sucumbiu ao poder negro de um Bispo.,,%o a cedat puterii întunecate a Episcopului.,Игрок %o поддался чёрным силам Епископа.,%o је подлег@[ao_2_sr] Епископовим црним силама.,%o gav efter för en biskops mörka kraft.,%o bir Piskopos'un karanlık gücüne yenik düştü.,%o підкори@[adj_2_ua] темній магії епископа. +%o was frozen solid by a Wendigo.,OB_ICEGUY,,,,%o byl@[ao_cs] zamrznut@[ao_cs] wendigem.,%o blev frosset fast af en wendigo.,%o wurde von dem Wendigo tiefgefroren.,,%o tute frostiĝis de Vendiko.,A %o l@[ao_esp] ha congelado un Wendigo.,A %o l@[ao_esp] congeló un Wendigo.,%o joutui wendigon läpikotaisin jäädyttämäksi.,%o a été gelé@[e_fr] par un Wendigo.,,%o testét keményre fagyasztotta egy Wendigo,%o è stato congelato da un Wendigo. ,%o はウェンディゴによって固められた。,%o 은(는) 윈디고에 의해 단단하게 얼려졌다.,%o werd bevroren door een Wendigo.,%o ble frosset fast av en Wendigo.,%o został@[ao_pl] zamrożon@[adj_pl] przez Wendigo.,%o foi congelad@[ao_ptb] por um Wendigo.,,%o a fost făcut statuie de un Vendigo.,Игрока %o полностью заморозил вендиго.,Играча %o је потпуно замрзнуо Вендиго.,%o blev frusen av en Wendigo.,%o bir Wendigo tarafından kaskatı donduruldu.,Вендіго повністю заморозив %o. +%o was mauled by a Stalker.,OB_SERPENTHIT,,,,%o byl@[ao_cs] umlácen@[ao_cs] slídilem.,%o blev mast af en stalker.,%o wurde von dem Wasserjäger zerfleischt.,,%o vundegiĝis de Gvatanto.,A %o l@[ao_esp] ha triturado un Acechador.,A %o l@[ao_esp] trituró un Acechador.,%o joutui vaanijan raatelemaksi.,%o a été mutilé@[e_fr] par un Chasseur.,,%o szét lett marcangolva egy Orhalász által.,%o è stato malmenato da un Cacciatore. ,%o はストーカーに引っ掻かれた。,%o 은(는) 스토커에게 발렸다.,%o werd verminkt door een Stalker.,%o ble maltraktert av en Stalker.,%o został@[ao_pl] poturbowan@[adj_pl] przez Prześladowcę.,%o foi mutilad@[ao_ptb] por um Caçador.,,%o a fost sfâșiat de un Vânător.,Игрок %o покусан преследователем.,Играча %o је растргао Вребач.,%o blev söndersliten av en Stalker.,%o bir Stalker tarafından parçalandı.,%o роздер сталкер. +%o was melted by a Stalker.,OB_SERPENT,,,,%o byl@[ao_cs] rozpuštěn@[ao_cs] slídilem.,%o blev smeltet af en stalker.,%o wurde von dem Wasserjäger geschmolzen.,,%o fandiĝis de Gvatanto.,A %o l@[ao_esp] ha derretido un Acechador.,A %o l@[ao_esp] derritió un Acechador.,%o joutui vaanijan sulattamaksi.,%o a été fondu@[e_fr] par un Chasseur.,,%o csontjairól a húst leolvasztotta egy Orvhalász,%o è stato squagliato da un Cacciatore. ,%o はストーカーに溶かされた。,%o 은(는) 스토커에 의해 녹았다.,%o werd gesmolten door een Stalker.,%o ble smeltet av en Stalker.,%o został@[ao_pl] stopion@[adj_pl] przez Prześladowcę.,%o foi derretid@[ao_ptb] por um Caçador.,,%o a fost topit de un Vânător.,Игрока %o расплавил преследователь.,Играча %o је растопио Вребач.,%o blev smält av en Stalker.,%o bir Takipçi tarafından eritildi.,%o розплавив сталкер. +%o was charred by a Reiver.,OB_WRAITH,,,,%o byl@[ao_cs] zpopelněn@[ao_cs] přízrakem.,%o blev forkullet af en reiver.,%o wurde von dem Phantom verkohlt.,,%o brulegiĝis de Fantomo.,A %o l@[ao_esp] ha carbonizado un Saqueador.,A %o l@[ao_esp] carbonizó un Saqueador.,%o joutui ryövärin hiiltämäksi.,%o a été carbonisé@[e_fr] par un Reiver.,,%o testét egy Martalóc elszenesítette.,%o è stato carbonizzato da un Incursore. ,%o はレイバーに黒焦げにされた。,%o 은(는) 리버에 의해 그슬렸다.,%o werd verbrand door een Rover.,%o ble forkullet av en Reiver.,%o został@[ao_pl] zwęglon@[adj_pl] przez Rozbójnika.,%o foi carbonizad@[ao_ptb] por um Fantasma.,,%o a fost ceruit de un Pungaș.,Игрока %o обуглил грабитель.,Играча %o је угљенисао Вребач.,%o blev förkolnad av en Reiver.,%o bir Hayalet tarafından yakıldı.,%o було спалено розбійником. +%o had %p life stolen by a Reiver.,OB_WRAITHHIT,,,,%o si nechal@[ao_cs] ukradnout život přízrakem.,%o fik sit liv stjålet af en reiver.,%o wurde das Leben von dem Phantom gestohlen.,,%o havis sian vivon ŝtelita de Fantomo.,A %o le ha robado la vida un Saqueador.,A %o le robó la vida un Saqueador.,Ryöväri riisti pelaajan %o hengen.,%o a perdu la vie face à un Reiver.,,%o %p életét ellopta egy Martalóc,%o ha permesso che un Incursore prosciugasse la sua vita ,%o はレイバーに命を %p盗まれた。,%o 은(는) 리버에게 영혼을 도둑맞았다.,%o had @[zijn_haar_nl] leven gestolen door een Rover.,%o fikk %p liv stjålet av en Reiver.,"Życie %o zostało skradzione przez Rozbójnika. ",%o teve sua vida roubada por um Fantasma.,,Viața lui %o a fost furată de un Pungaș.,Жизнь игрока %o украл грабитель.,Играчу %o је живот украо Вребач.,%o fick sitt liv stulet av en Reiver.,%o bir Hayalet tarafından kurutuldu.,Життя %o було вкрадено розбійником. -%o was incinerated by the Death Wyvern.,OB_DRAGON,,,,%o byl@[ao_cs] upálen@[ao_cs] smrtidrakem.,%o blev forbrændt af wyvern.,%o wurde von dem Todesdrachen verbrannt.,,%o cindriĝis de Mortviverno.,A %o l@[ao_esp] ha incinerado el Guiverno de la Muerte.,A %o l@[ao_esp] incineró el Guiverno de la Muerte.,%o joutui kuolontraakin polttamaksi.,%o a été incinéré@[e_fr] par une vouivre de la mort.,%o testét porig égette egy Halálsárkány,%o è stato incenerito da una Viverna Mortale. ,%o はダークワイバーンに焼却された。,%o 은(는) 데스 와이번에 의해 분신 당했다.,%o werd verbrand door de Doodsdraak.,%o ble brent opp av en Døden Wyvern.,%o został@[ao_pl] spalon@[adj_pl] przez Wiwernę Śmierci.,%o foi incinerad@[ao_ptb] por uma Serpe da Morte,,%o a fost incinerat de Balaurul Morții.,Игрока %o кремировала виверна Смерти.,Играча %o је кремировао Змајак смрти.,%o blev bränd av Döds Wyvern.,"%o, Ölüm Wyvern tarafından yakıldı.",Віверна Смерті спалила %o вщент. -%o was swept from the board by Korax.,OB_KORAX,,,,%o byl@[ao_cs] odhozen@[ao_cs] ze šachovnice Koraxem.,%o blev fejet væk fra brættet af Korax.,%o wurde von Korax vom Feld gefegt.,,%o estis prenita el la tabulo de Korax.,%o ha sido barrid@[ao_esp] del tablero por Korax.,%o fue barrid@[ao_esp] del tablero por Korax.,%o pyyhkäistiin laudalta Kooraksen voimasta.,%o a été balayé@[e_fr] de l'échiquier par Korax.,%o el lett söpörve a tábláról Korax által.,%o è stato eliminato dalla scacchiera da Korax. ,%o は唯一神の怒りに触れた。,%o 은(는) 코락스의 체스판에서 사라졌다.,%o werd door Korax van het bord geveegd.,%o ble feid fra brettet av Korax.,%o został@[ao_pl] zmiecion@[adj_pl] z pokładu przez Koraxa.,%o foi eliminad@[ao_ptb] do tabuleiro por Korax.,,%o a fost măturat de pe drum de Korax.,Игрока %o скинул с доски Коракс.,Играча %o је с табле уклонио Коракс.,%o blev avförd från spelplanen av Korax.,"%o, Korax tarafından tahtadan süpürüldü.",Коракс скинув з ігрової дошки %o. -%o was slain by Zedek.,OB_FBOSS,,,,%o byl@[ao_cs] zabit@[ao_cs] Zedekem.,%o blev dræbt af Zedek.,%o wurde von Zedek hingemetzelt.,,%o mortigis de Zedeko.,A %o l@[ao_esp] ha asesinado Zedek.,A %o l@[ao_esp] asesinó Zedek.,%o joutui Sedekin tappamaksi.,%o a été pourfendu@[e_fr] par Zedek.,%o meghalt Zedek által.,%o è stato ammazzato da Zedek. ,%o はゼデクに討ち取られた。,%o 은(는) 제닥의 이름으로 쓰러졌다.,%o werd gedood door Zedek.,%o ble drept av Zedek.,%o został@[ao_pl] zgładzon@[adj_pl] przez Zedeka.,%o foi mort@[ao_ptb] por Zedek.,,%o a fost omorât de Zedek.,Игрока %o сразил Зедек.,Играча %o је оборио Коракс.,%o blev dödad av Zedek.,"%o, Zedek tarafından öldürüldü.",%o зустрі@[adj_1_ua] смерть від Зедека. -%o couldn't absorb Menelkir's Mana.,OB_MBOSS,,,,%o nemohl@[ao_cs] pojmout Menelkirovu manu.,%o kunne ikke absorbere Menelkirs Mana.,%o konnte Menelkirs Mana nicht verkraften.,,%o ne povis absorbi la Manaon de Menelkiro.,%o intenta absorber el maná de Menelkir y sale mal.,,%o ei kyennyt ottamaan vastaan Menelkirin manaa.,%o n'aurait pu absorber le mana de Menelkir.,%o nem tudta elnyelni Menelkir manáját.,%o non è riuscito ad assorbire il mana di Menelkir. ,%o はメネルキルのマナを吸収できなかった。,%o 은(는) 메넬키어의 마나를 흡수하지 못했다.,%o kon Menelkir's mana niet absorberen.,%o kunne ikke absorbere Menelkirs Mana.,%o nie m@[irreg_4_pl] wchłonąć Many Menelkira.,%o não conseguiu absorver o Mana de Menelkir.,,%o nu a reușit să absoarbă mana lui Menelkir.,Игрок %o не смог поглотить ману Менелкира.,%o се није узмог@[ao_2_sr] носити с Менелкировом маном.,%o kunde inte absorbera Menelkirs Mana.,"%o, Menelkir'in Mana'sını ememedi.",У %o не вийшло побороти ману Менелкіра. -%o was baptized by Traductus.,OB_CBOSS,,,,%o byl@[ao_cs] posvěcen@[ao_cs] Traduktem.,%o blev døbt af Traductus.,%o wurde von Traductus getauft.,,%o baptiĝis de Traduktuso.,A %o l@[ao_esp] ha bautizado Traductus.,A %o l@[ao_esp] bautizó Traductus.,%o joutui Traduktuksen kastamaksi.,%o a été baptisé@[e_fr] par Traductus.,%o meg lett keresztelve Traductus által.,%o è stato battezzato da Traductus. ,%o はトラダクタスの洗礼を受けた。,%o 은(는) 트라닥투스에게 침례를 당했다.,%o werd gedoopt door Traductus.,%o ble døpt av Traductus.,%o został@[ao_pl] ochrzczon@[adj_pl] przez Traductusa.,%o foi batizad@[ao_ptb] por Traductus.,,%o a fost botezat de Traductus.,Игрока %o крестил Традуктус.,Играча %o је крстио Традуктус.,%o blev döpt av Traductus.,"%o, Traductus tarafından vaftiz edildi.",Традуктус похрестив %o. -%o had %p bones rolled by the Heresiarch.,OB_HERESIARCH,,,,%o si nechal@[ao_cs] rozmetat kosti Arcikacířem.,%o fik sine knogler rullet af Heresiark.,%os Knochen wurden vom Erzketzer gerollt.,,%o havis siajn ostojn rulis de la Ĉefherezulo.,A %o le ha arrollado los huesos el Heresiarca.,A %o le arrolló los huesos el Heresiarca.,Kerettiarkki jyräsi pelaajan %o luut.,%o s'est fait@[e_fr] rouler les os par l'Hérésiarche.,%o csontváza ki lett forgatva az Eretnek Vezér által.,Le ossa di %o sono state accartocciate dall'Eresiarca. ,%o はヘレシアークに骨を %p本 撒き散らされた。,%o 은(는) 헤러시아크에 의해 뼈와 살이 분리되었다.,%o @[zijn_haar_nl] botten werden opgerold door de Heresiarch.,%o fikk %p bein rullet av Heresiark.,Kości %o zostały porozrzucane przez Herezjarchę.,%o teve seus ossos moídos pelo Heresiarca.,,Oasele lui %o au fost făcute praf de către Ereziarh.,Ересиарх сыграл в кости игрока %o.,На играча %o су пале Јересијархове коцке.,%o fick sina ben rullade av Heresiark.,"%o, Heresiark tarafından kutsandı.",Єресіарх зіграв партію кістками %o. -%o was beaten to a pulp by %k's bare fists.,OB_MPFWEAPFIST,,,,%o byl@[ao_cs] umlácen@[ao_cs] k smrti holými pěstmi hráče %k.,%o blev slået til plukfisk af %ks bare næver.,%o wurde von %ks nackten Fäusten zu Hackfleisch verarbeitet.,,%o kaĉe draŝiĝis de la nudaj pugnoj de %k.,%o ha quedado molid@[ao_esp] por los puños limpios de %k.,%o quedó molid@[ao_esp] por los puños limpios de %k.,%k hakkasi %o paran muusiksi paljailla nyrkeillään.,%o à été tabassé@[e_fr] à mort par les poings de %k.,%o péppé lett verve %k ökleivel.,%k ha ridotto %o in poltiglia a mani nude.,%o は %k に素手でボコボコにされた。,%o 은(는) %k 의 맨손 타격으로 묵사발이 되었다.,%o werd tot pulp geslagen door %k's blote vuisten.,%o ble slått til mos av %ks bare never.,%o został@[ao_pl] zbit@[adj_pl] na miazgę przez gołe pięści %k.,%o foi espancad@[ao_ptb] até a morte pelos punhos nus de %k.,,%k l-a omorât în bătaie pe %o cu mâinile goale.,Игрок %o избит в мясо голыми руками игрока %k.,%o је пребијен@[adj_1_sr] на смрт голим рукама играч %k.,%o blev slagen till mos av %ks nakna knytnävar.,"%o, %k tarafından eşek sudan gelinceye kadar dövüldü.",%k заби@[adj_1_ua] %o голими руками. -%o got the axe from %k.,OB_MPFWEAPAXE,,,,%o dostal@[ao_cs] sekerou od hráče %k.,%o fik øksen af %k.,%o sah %ks Axt.,,%o ricevis la hakilon el %k.,%o ha recibido el hachazo de %k.,%o recibió el hachazo de %k.,%o sai pelaajan %k kirveestä.,%o s'est fait@[e_fr] hacher menu par %k.,%o megkapta %k baltáját.,%o ha preso un colpo d'ascia da %k.,%o は %k から斧を受けた。,%o 은(는) %k 의 티몬의 도끼를 어설프게 받아쳤다.,%o kreeg de bijl van %k.,%o fikk øksa av %k.,%o dostał@[ao_pl] z topora %k.,%o recebeu o machado de %k.,,%o a primit un topor de la %k.,Игрок %o словил топорик игрока %k.,%o је добио секиру од %k.,%o fick yxan av %k.,"%o, %k tarafından baltayla dövüldü.",%o отрима@[adj_1_ua] сокирою від %k. -%o had %p head caved in by %k's hammer.,OB_MPFWEAPHAMMERM,,,,%o dostal@[ao_cs] po hlavě kladivem hráče %k.,%o fik sit hoved udhulet af %ks hammer.,%o wurde der Kopf von %ks Hammer eingeschlagen.,,%p havis sian kapon enfalis de la martelo de %k.,A %o le ha abollado la cabeza el martillo de %k.,A %o le abolló la cabeza el martillo de %k.,%k painoi vasarallaan %o paran pään kasaan.,%o s'est fait@[e_fr] éclater le crâne par le marteau de %k.,%o kapott egy üreges fejet %k Kalapácsa által.,La testa di %o è stata aperta in due dal martello di %k.,%o は %k のハンマーで頭に空洞を開けられた。,%k 은(는) 징벌의 망치로 %o 의 머리 위에 우물을 만들었다.,%o had @[zijn_haar_nl] kop ingestort met %k's hamer.,%o fikk %p hode knust av %ks hammer.,Głowa %o została zmiażdżona przez młot %k.,%o teve seu crânio afundado pelo martelo de %k.,%o teve seu crânio amolgado pelo martelo de %k.,%k i-a băgat capul lui %o în interior cu ciocanul.,Голова игрока %o была вдолблена в тело молотом игрока %k.,Играч %k је расцепао играчу %o главу.,%o fick huvudet krossat av %ks hammare.,"%o, %k tarafından dövüldü.",Голова %o опинилась всередині тіла через молот %k. -%o's soul was forged anew by %k's hammer.,OB_MPFWEAPHAMMERR,,,,%o@[psf1_cs] duše byla obrozena kladivem hráče %k.,%os sjæl blev smedet på ny af %ks hammer.,%os Seele wurde durch %ks Hammer erneuert.,,La animo de %o nove forĝiĝis de la martelo de %k.,El alma de %o ha sido forjada de nuevo por el martillo de %k.,El alma de %o fue forjada de nuevo por el martillo de %k.,%k uudelleentakoi %o paran sielun vasarallaan.,%o a eu son âme reforgée par le marteau de %k.,%o lelke újra lett kovácsolva %k Kalapácsa által.,L'anima di %o è stata riforgiata dal martello di %k.,%o の魂は %k のハンマーで一から鍛え直された。,%o 의 영혼은 %k 의 징벌의 망치에 의해 철거되었다.,%o's ziel werd omgesmeed door %k's hamer.,%o's sjel ble smidd på nytt av %ks hammer.,Dusza %o została wykuta na nowo przez młot %k.,%o teve sua alma reforjada pelo martelo de %k.,,%k i-a făcut sufletul lui %o ca nou cu ciocanul.,Душа игрока %o была перекована молотом игрока %k.,Играч %k је прековао душу играча %o чекићем.,%os själ smiddes på nytt av %ks hammare.,"%o, %k tarafından dövüldü.",Душа %o була наново перекована молотом %k. -%o was silenced by %k's mighty Quietus.,OB_MPFWEAPQUIETUS,,,,%o byl@[ao_cs] umlčen@[ao_cs] mocným Tišitelem hráče %k.,%o blev bragt til tavshed af %ks mægtige Forløser.,%o wurde durch %ks Erlöser befreit.,,%o slientiĝis de La Pova Kvietus' de %k.,A %o l@[ao_esp] ha silenciado el poderoso Quietus de %k.,A %o l@[ao_esp] silenció el poderoso Quietus de %k.,%k vaiensi %o paran mahtavalla Quietuksellaan.,%o à été réduit@[e_fr] au silence par le pouvoir de %k et Quietus.,%o el lett némítva %k hatalmas Némusza által.,%o è stato zittito dal potente Quietus di %k.,%o は %k の強靭なクワイエタスで静かにされた。,%o 은(는) %k 의 종언의 검 덕에 침묵을 지킬 수 있었다.,%o werd tot zwijgen gebracht door %k's machtige Quietus.,%o ble brakt til taushet av %ks mektige Quietus.,%o został@[ao_pl] uciszon@[adj_pl] przez %k.,%o foi silenciad@[ao_ptb] pelo poderoso Quietus de %k.,,"%o a fost redus la tăcere de argumentul final al +%o was incinerated by the Death Wyvern.,OB_DRAGON,,,,%o byl@[ao_cs] upálen@[ao_cs] smrtidrakem.,%o blev forbrændt af wyvern.,%o wurde von dem Todesdrachen verbrannt.,,%o cindriĝis de Mortviverno.,A %o l@[ao_esp] ha incinerado el Guiverno de la Muerte.,A %o l@[ao_esp] incineró el Guiverno de la Muerte.,%o joutui kuolontraakin polttamaksi.,%o a été incinéré@[e_fr] par une vouivre de la mort.,,%o testét porig égette egy Halálsárkány,%o è stato incenerito da una Viverna Mortale. ,%o はダークワイバーンに焼却された。,%o 은(는) 데스 와이번에 의해 분신 당했다.,%o werd verbrand door de Doodsdraak.,%o ble brent opp av en Døden Wyvern.,%o został@[ao_pl] spalon@[adj_pl] przez Wiwernę Śmierci.,%o foi incinerad@[ao_ptb] por uma Serpe da Morte,,%o a fost incinerat de Balaurul Morții.,Игрока %o кремировала виверна Смерти.,Играча %o је кремировао Змајак смрти.,%o blev bränd av Döds Wyvern.,"%o, Ölüm Wyvern tarafından yakıldı.",Віверна Смерті спалила %o вщент. +%o was swept from the board by Korax.,OB_KORAX,,,,%o byl@[ao_cs] odhozen@[ao_cs] ze šachovnice Koraxem.,%o blev fejet væk fra brættet af Korax.,%o wurde von Korax vom Feld gefegt.,,%o estis prenita el la tabulo de Korax.,%o ha sido barrid@[ao_esp] del tablero por Korax.,%o fue barrid@[ao_esp] del tablero por Korax.,%o pyyhkäistiin laudalta Kooraksen voimasta.,%o a été balayé@[e_fr] de l'échiquier par Korax.,,%o el lett söpörve a tábláról Korax által.,%o è stato eliminato dalla scacchiera da Korax. ,%o は唯一神の怒りに触れた。,%o 은(는) 코락스의 체스판에서 사라졌다.,%o werd door Korax van het bord geveegd.,%o ble feid fra brettet av Korax.,%o został@[ao_pl] zmiecion@[adj_pl] z pokładu przez Koraxa.,%o foi eliminad@[ao_ptb] do tabuleiro por Korax.,,%o a fost măturat de pe drum de Korax.,Игрока %o скинул с доски Коракс.,Играча %o је с табле уклонио Коракс.,%o blev avförd från spelplanen av Korax.,"%o, Korax tarafından tahtadan süpürüldü.",Коракс скинув з ігрової дошки %o. +%o was slain by Zedek.,OB_FBOSS,,,,%o byl@[ao_cs] zabit@[ao_cs] Zedekem.,%o blev dræbt af Zedek.,%o wurde von Zedek hingemetzelt.,,%o mortigis de Zedeko.,A %o l@[ao_esp] ha asesinado Zedek.,A %o l@[ao_esp] asesinó Zedek.,%o joutui Sedekin tappamaksi.,%o a été pourfendu@[e_fr] par Zedek.,,%o meghalt Zedek által.,%o è stato ammazzato da Zedek. ,%o はゼデクに討ち取られた。,%o 은(는) 제닥의 이름으로 쓰러졌다.,%o werd gedood door Zedek.,%o ble drept av Zedek.,%o został@[ao_pl] zgładzon@[adj_pl] przez Zedeka.,%o foi mort@[ao_ptb] por Zedek.,,%o a fost omorât de Zedek.,Игрока %o сразил Зедек.,Играча %o је оборио Коракс.,%o blev dödad av Zedek.,"%o, Zedek tarafından öldürüldü.",%o зустрі@[adj_1_ua] смерть від Зедека. +%o couldn't absorb Menelkir's Mana.,OB_MBOSS,,,,%o nemohl@[ao_cs] pojmout Menelkirovu manu.,%o kunne ikke absorbere Menelkirs Mana.,%o konnte Menelkirs Mana nicht verkraften.,,%o ne povis absorbi la Manaon de Menelkiro.,%o intenta absorber el maná de Menelkir y sale mal.,,%o ei kyennyt ottamaan vastaan Menelkirin manaa.,%o n'aurait pu absorber le mana de Menelkir.,,%o nem tudta elnyelni Menelkir manáját.,%o non è riuscito ad assorbire il mana di Menelkir. ,%o はメネルキルのマナを吸収できなかった。,%o 은(는) 메넬키어의 마나를 흡수하지 못했다.,%o kon Menelkir's mana niet absorberen.,%o kunne ikke absorbere Menelkirs Mana.,%o nie m@[irreg_4_pl] wchłonąć Many Menelkira.,%o não conseguiu absorver o Mana de Menelkir.,,%o nu a reușit să absoarbă mana lui Menelkir.,Игрок %o не смог поглотить ману Менелкира.,%o се није узмог@[ao_2_sr] носити с Менелкировом маном.,%o kunde inte absorbera Menelkirs Mana.,"%o, Menelkir'in Mana'sını ememedi.",У %o не вийшло побороти ману Менелкіра. +%o was baptized by Traductus.,OB_CBOSS,,,,%o byl@[ao_cs] posvěcen@[ao_cs] Traduktem.,%o blev døbt af Traductus.,%o wurde von Traductus getauft.,,%o baptiĝis de Traduktuso.,A %o l@[ao_esp] ha bautizado Traductus.,A %o l@[ao_esp] bautizó Traductus.,%o joutui Traduktuksen kastamaksi.,%o a été baptisé@[e_fr] par Traductus.,,%o meg lett keresztelve Traductus által.,%o è stato battezzato da Traductus. ,%o はトラダクタスの洗礼を受けた。,%o 은(는) 트라닥투스에게 침례를 당했다.,%o werd gedoopt door Traductus.,%o ble døpt av Traductus.,%o został@[ao_pl] ochrzczon@[adj_pl] przez Traductusa.,%o foi batizad@[ao_ptb] por Traductus.,,%o a fost botezat de Traductus.,Игрока %o крестил Традуктус.,Играча %o је крстио Традуктус.,%o blev döpt av Traductus.,"%o, Traductus tarafından vaftiz edildi.",Традуктус похрестив %o. +%o had %p bones rolled by the Heresiarch.,OB_HERESIARCH,,,,%o si nechal@[ao_cs] rozmetat kosti Arcikacířem.,%o fik sine knogler rullet af Heresiark.,%os Knochen wurden vom Erzketzer gerollt.,,%o havis siajn ostojn rulis de la Ĉefherezulo.,A %o le ha arrollado los huesos el Heresiarca.,A %o le arrolló los huesos el Heresiarca.,Kerettiarkki jyräsi pelaajan %o luut.,%o s'est fait@[e_fr] rouler les os par l'Hérésiarche.,,%o csontváza ki lett forgatva az Eretnek Vezér által.,Le ossa di %o sono state accartocciate dall'Eresiarca. ,%o はヘレシアークに骨を %p本 撒き散らされた。,%o 은(는) 헤러시아크에 의해 뼈와 살이 분리되었다.,%o @[zijn_haar_nl] botten werden opgerold door de Heresiarch.,%o fikk %p bein rullet av Heresiark.,Kości %o zostały porozrzucane przez Herezjarchę.,%o teve seus ossos moídos pelo Heresiarca.,,Oasele lui %o au fost făcute praf de către Ereziarh.,Ересиарх сыграл в кости игрока %o.,На играча %o су пале Јересијархове коцке.,%o fick sina ben rullade av Heresiark.,"%o, Heresiark tarafından kutsandı.",Єресіарх зіграв партію кістками %o. +%o was beaten to a pulp by %k's bare fists.,OB_MPFWEAPFIST,,,,%o byl@[ao_cs] umlácen@[ao_cs] k smrti holými pěstmi hráče %k.,%o blev slået til plukfisk af %ks bare næver.,%o wurde von %ks nackten Fäusten zu Hackfleisch verarbeitet.,,%o kaĉe draŝiĝis de la nudaj pugnoj de %k.,%o ha quedado molid@[ao_esp] por los puños limpios de %k.,%o quedó molid@[ao_esp] por los puños limpios de %k.,%k hakkasi %o paran muusiksi paljailla nyrkeillään.,%o à été tabassé@[e_fr] à mort par les poings de %k.,,%o péppé lett verve %k ökleivel.,%k ha ridotto %o in poltiglia a mani nude.,%o は %k に素手でボコボコにされた。,%o 은(는) %k 의 맨손 타격으로 묵사발이 되었다.,%o werd tot pulp geslagen door %k's blote vuisten.,%o ble slått til mos av %ks bare never.,%o został@[ao_pl] zbit@[adj_pl] na miazgę przez gołe pięści %k.,%o foi espancad@[ao_ptb] até a morte pelos punhos nus de %k.,,%k l-a omorât în bătaie pe %o cu mâinile goale.,Игрок %o избит в мясо голыми руками игрока %k.,%o је пребијен@[adj_1_sr] на смрт голим рукама играч %k.,%o blev slagen till mos av %ks nakna knytnävar.,"%o, %k tarafından eşek sudan gelinceye kadar dövüldü.",%k заби@[adj_1_ua] %o голими руками. +%o got the axe from %k.,OB_MPFWEAPAXE,,,,%o dostal@[ao_cs] sekerou od hráče %k.,%o fik øksen af %k.,%o sah %ks Axt.,,%o ricevis la hakilon el %k.,%o ha recibido el hachazo de %k.,%o recibió el hachazo de %k.,%o sai pelaajan %k kirveestä.,%o s'est fait@[e_fr] hacher menu par %k.,,%o megkapta %k baltáját.,%o ha preso un colpo d'ascia da %k.,%o は %k から斧を受けた。,%o 은(는) %k 의 티몬의 도끼를 어설프게 받아쳤다.,%o kreeg de bijl van %k.,%o fikk øksa av %k.,%o dostał@[ao_pl] z topora %k.,%o recebeu o machado de %k.,,%o a primit un topor de la %k.,Игрок %o словил топорик игрока %k.,%o је добио секиру од %k.,%o fick yxan av %k.,"%o, %k tarafından baltayla dövüldü.",%o отрима@[adj_1_ua] сокирою від %k. +%o had %p head caved in by %k's hammer.,OB_MPFWEAPHAMMERM,,,,%o dostal@[ao_cs] po hlavě kladivem hráče %k.,%o fik sit hoved udhulet af %ks hammer.,%o wurde der Kopf von %ks Hammer eingeschlagen.,,%p havis sian kapon enfalis de la martelo de %k.,A %o le ha abollado la cabeza el martillo de %k.,A %o le abolló la cabeza el martillo de %k.,%k painoi vasarallaan %o paran pään kasaan.,%o s'est fait@[e_fr] éclater le crâne par le marteau de %k.,,%o kapott egy üreges fejet %k Kalapácsa által.,La testa di %o è stata aperta in due dal martello di %k.,%o は %k のハンマーで頭に空洞を開けられた。,%k 은(는) 징벌의 망치로 %o 의 머리 위에 우물을 만들었다.,%o had @[zijn_haar_nl] kop ingestort met %k's hamer.,%o fikk %p hode knust av %ks hammer.,Głowa %o została zmiażdżona przez młot %k.,%o teve seu crânio afundado pelo martelo de %k.,%o teve seu crânio amolgado pelo martelo de %k.,%k i-a băgat capul lui %o în interior cu ciocanul.,Голова игрока %o была вдолблена в тело молотом игрока %k.,Играч %k је расцепао играчу %o главу.,%o fick huvudet krossat av %ks hammare.,"%o, %k tarafından dövüldü.",Голова %o опинилась всередині тіла через молот %k. +%o's soul was forged anew by %k's hammer.,OB_MPFWEAPHAMMERR,,,,%o@[psf1_cs] duše byla obrozena kladivem hráče %k.,%os sjæl blev smedet på ny af %ks hammer.,%os Seele wurde durch %ks Hammer erneuert.,,La animo de %o nove forĝiĝis de la martelo de %k.,El alma de %o ha sido forjada de nuevo por el martillo de %k.,El alma de %o fue forjada de nuevo por el martillo de %k.,%k uudelleentakoi %o paran sielun vasarallaan.,%o a eu son âme reforgée par le marteau de %k.,,%o lelke újra lett kovácsolva %k Kalapácsa által.,L'anima di %o è stata riforgiata dal martello di %k.,%o の魂は %k のハンマーで一から鍛え直された。,%o 의 영혼은 %k 의 징벌의 망치에 의해 철거되었다.,%o's ziel werd omgesmeed door %k's hamer.,%o's sjel ble smidd på nytt av %ks hammer.,Dusza %o została wykuta na nowo przez młot %k.,%o teve sua alma reforjada pelo martelo de %k.,,%k i-a făcut sufletul lui %o ca nou cu ciocanul.,Душа игрока %o была перекована молотом игрока %k.,Играч %k је прековао душу играча %o чекићем.,%os själ smiddes på nytt av %ks hammare.,"%o, %k tarafından dövüldü.",Душа %o була наново перекована молотом %k. +%o was silenced by %k's mighty Quietus.,OB_MPFWEAPQUIETUS,,,,%o byl@[ao_cs] umlčen@[ao_cs] mocným Tišitelem hráče %k.,%o blev bragt til tavshed af %ks mægtige Forløser.,%o wurde durch %ks Erlöser befreit.,,%o slientiĝis de La Pova Kvietus' de %k.,A %o l@[ao_esp] ha silenciado el poderoso Quietus de %k.,A %o l@[ao_esp] silenció el poderoso Quietus de %k.,%k vaiensi %o paran mahtavalla Quietuksellaan.,%o à été réduit@[e_fr] au silence par le pouvoir de %k et Quietus.,,%o el lett némítva %k hatalmas Némusza által.,%o è stato zittito dal potente Quietus di %k.,%o は %k の強靭なクワイエタスで静かにされた。,%o 은(는) %k 의 종언의 검 덕에 침묵을 지킬 수 있었다.,%o werd tot zwijgen gebracht door %k's machtige Quietus.,%o ble brakt til taushet av %ks mektige Quietus.,%o został@[ao_pl] uciszon@[adj_pl] przez %k.,%o foi silenciad@[ao_ptb] pelo poderoso Quietus de %k.,,"%o a fost redus la tăcere de argumentul final al lui %k.",Игрок %o утихомирен легендарным Последним доводом игрока %k.,%o је утишан@[adj_1_sr] од моћи Куиетуса играч %k.,%o tystades av %ks mäktiga Quietus.,"%o, %k tarafından susturuldu.",%k упокої@[adj_1_ua] %o. З миром? -%o got a mace to the face from %k.,OB_MPCWEAPMACE,,,,%o dostal@[ao_cs] palcátem po hlavě od hráče %k.,%o fik en stridskølle i ansigtet af %k.,%o bekam %ks Streitkolben ins Gesicht.,,%o prenis klabon al la vizaĝon el %k.,%o ha recibido un mazazo en la cara por %k.,%o recibió un mazazo en la cara por %k.,%o sai pelaajan %k nuijasta naamaansa.,%o s'est fait@[e_fr] casser la figure par la masse de %k.,%o kapott egy buzogányt a fejébe %k által.,%o si è preso una mazzata in faccia da %k.,%o は自らの顔に %k のメイスを受けた。,%o 은(는) %k 의 철퇴를 맞은 뒤에야 철이 들었다.,%o kreeg een %k's gesel in @[zijn_haar_nl] gezicht.,%o ble slått i ansiktet av %k.,%o dostał@[ao_pl] buzdyganem %k w twarz.,%o levou com a maça de %k na cara.,,%o a primit un buzdugan în față de la %k.,Игрок %o получил по морде булавой игрока %k.,%o је доби@[ao_1_sr] буздован у фацу играч %k.,%o fick en stridsklubba i ansiktet av %k.,"%o, %k tarafından eşek sudan gelinceye kadar dövüldü.",%o отрима@[adj_1_ua] по пиці булавою %k. -%o was bitten by %k's serpent staff.,OB_MPCWEAPSTAFFM,,,,%o byl@[ao_cs] kousnut@[ao_cs] hadí holí hráče %k.,%o blev bidt af %ks slange-stav.,%o wurde von %ks Schlangenstab gebissen.,,%o mordiĝis de la serpentbastono de %k.,A %o l@[ao_esp] ha mordido el bastón de la serpiente de %k.,A %o l@[ao_esp] mordió el bastón de la serpiente de %k.,%k puri %o parkaa käärmesauvallaan.,%o s'est fait@[e_fr] mordre par le Bâton du Serpent %k.,%o meg lett harapva %k Kígyó Botja által.,%o è stato morso dalla Staffa del Serpente di %k.,%o は %k の蛇の杖に噛まれた。,%o 은(는) %k 의 뱀 지팡이에 의해 독살당했다.,%o werd gebeten door %k's slangenstaf.,%o ble bitt av %ks slangestav.,%o został@[ao_pl] ugryzion@[adj_pl] laską węży %k.,%o foi mordid@[ao_ptb] pelo Cetro da Serpente de %k.,,%o a fost mușcat de bastonul șarpe al lui %k.,Игрок %o искусан змеиным посохом игрока %k.,%o је угрижен@[adj_1_sr] змијским штапом играч %k.,%o blev biten av %ks ormstab.,"%o, %k tarafından zehirlendi.",Посох змія %k покусав %o. -%o choked on %k's serpent staff.,OB_MPCWEAPSTAFFR,,,,%o se zadusil@[ao_cs] hadí holí hráče %k.,%o blev kvalt af %ks slange stav.,%o verschluckte sich an %ks Schlangenstab.,,%o sufokis la serpentbastonon de %k.,%o se ha ahogado con el bastón de la serpiente de %k.,%o se ahogó con el bastón de la serpiente de %k.,%o tukehtui pelaajan %k käärmesauvaan.,%o s'est étranglé@[e_fr] sur le Bâton du Serpent de %k,%o megfulladt %k Kígyó Botja által.,%o è soffocato a causa della Staffa del Serpente di %k.,%o は %k の蛇の杖に息の根を止められた。,%o 은(는) %k 의 뱀 지팡이 때문에 숨을 쉬지 못했다.,%o stikte in %k's slangenstaf.,%o ble kvalt av %ks slangestav.,%o zakrztusił@[ao_pl] się laską węży %k.,%o se engasgou com o Cetro da Serpente de %k,,%o s-a sufocat pe bastonul șarpe al lui %k.,Игрок %o задушен змеиным посохом игрока %k.,%o је задављен@[adj_1_sr] змијским штапом играч %k.,%o kvävdes av %ks ormstab.,"%o, %k tarafından kurutuldu.",Посох змія %k задушив %o. -%o was lit up by %k's flames.,OB_MPCWEAPFLAME,,,,%o vzplanul@[ao_cs] plameny hráče %k.,%o blev tændt af %ks flammer.,%o wurde von %ks Flammen erleuchtet.,,%o ekbruliĝis de la fajroj de %k.,A %o l@[ao_esp] han calcinado las llamas de %k.,A %o l@[ao_esp] calcinaron las llamas de %k.,%o syttyi pelaajan %k liekeistä.,%o s'est fait@[e_fr] allumer par %k.,%o fel lett gyújtva %k tűze által.,%o è stato illuminato dalle fiamme di %k.,%o は %k によって炎を灯された。,%o 은(는) %k 의 화염폭풍에 휩쓸렸다.,%o werd opgelicht door %k's vlammen.,%o ble opplyst av %ks flammer.,%o został@[ao_pl] oświetlon@[adj_pl] płomieniami %k.,%o foi incendiad@[ao_ptb] pelas chamas de %k.,,%o s-a aprins de la flăcările lui %k.,Игрок %o сгорел в огне игрока %k.,%o је осветљен@[adj_1_sr] пламеном играч %k.,%o blev upplyst av %ks lågor.,"%o, %k tarafından aydınlatıldı.",%o було спалено в полум'ї %k. -%o was cleansed by %k's Wraithverge.,OB_MPCWEAPWRAITHVERGE,,,,%o byl@[ao_cs] očištěn@[ao_cs] Zjevitelem hráče %k.,%o blev renset af %ks Spirit Bringer.,%o wurde durch %ks Geisterbringer geläutert.,,%o puriĝis de la Fantomkruc' de %k.,A %o l@[ao_esp] ha limpiado la vara fantasmal de %k.,A %o l@[ao_esp] limpió la vara fantasmal de %k.,%k puhdisti pelaajan %o Haamusauvallaan.,%o a été purifié@[e_fr] par la Verge Phantasmale de %k.,%o meg lett tisztítva %k Bosszúbot által.,%o è stato purificato dalla Verga SconfinaSpettri di %k.,%o は %k のレイスバージによって浄化された。,%o 은(는) %k 의 사령의 지팡이에 의해 정화되었다.,%o werd gereinigd door %k's Schimroede.,%o ble renset av %ks Wraithverge.,%o został@[ao_pl] oczyszczon@[adj_pl] przez Widmoskraj %k.,%o foi purificad@[ao_ptb] pelo Cajado Fantasma de %k.,,%o a fost purificat de Toiagul Stafie al lui %k.,Игрок %o очищен жезлом духов игрока %k.,%o je прочишћен@[adj_1_sr] штапом утваре играч %k.,%o blev renad av %ks Wraithverge.,"%o, %k tarafından temizlendi.",%k очисти@[adj_1_ua] %o Символом Мари. -%o took one too many sapphire beams from %k.,OB_MPMWEAPWAND,,,,%o koupil@[ao_cs] přespříliš safírových střel od hráče %k.,%o tog en safirstråle for meget fra %k.,%o bekam zu viele Saphierstrahlen von %k ab.,,%o recivis unu tro da safira radio de %k.,%o ha recibido demasiados rayos de zafiro de %k.,%o recibió demasiados rayos de zafiro de %k.,%o otti vastaan yhden liikaa pelaajan %k safiirisäteistä.,%o s'est pris@[e_fr] un rayon saphirique en trop de la part de %k.,%o túl sok zafír sugarat kapott %k-tól/től.,%o si è buscato un raggio di zaffiro di troppo da %k.,%o は %k から多量のサファイアビームを受け取った。,%o 은(는) %k 의 사파이어 빛을 너무 많이 째려봤다.,%o kreeg een saffierstraal teveel van %k.,%o fikk en safirstråle for mye fra %k.,%o wzi@[irreg_2_pl] o jeden szafirowy promień od %k za dużo.,%o levou muitos raios de safira de %k.,,%o a primit o rază în plus de la safirul lui %k.,Игрок %o схватил слишком много сапфировых зарядов от игрока %k.,%o је узе@[ao_1_sr] превише сафирских зракова играч %k.,%o tog emot en för många safirstrålar från %k.,"%o, %k tarafından dönüştürüldü.",%o хапану@[adj_1_ua] надто багато сапфірових снарядів від %k. -%o was turned into a frosty fellow by %k.,OB_MPMWEAPFROST,,,,%o byl@[ao_cs] zchlazen@[ao_cs] hráčem %k.,%o blev forvandlet til en frostklar fyr af %k.,%o wurde von %k schockgefrostet.,,%o farigiĝis frostulon de %k.,%o ha sido convertid@[ao_esp] en un helado por %k.,%o fue convertid@[ao_esp] en un helado por %k.,%k muutti %o paran pakkasveikoksi.,%o s'est fait@[e_fr] transformer en glaçon par %k.,%o jégbaráttá alakult %k által.,%o è stato trasformato in un simpatico pupazzo di neve da %k.,%o は %k によって冷ややかな輩になった。,%o 은(는) %k 의 얼음 파편에 의해 눈사람이 되었다.,%o werd ijskoud veranderd door %k.,%o ble forvandlet til en iskald fyr av %k.,%o został@[ao_pl] zmienion@[adj_pl] w mroźnego koleżkę przez %k.,%o foi transformad@[ao_ptb] em picolé por %k.,,%o a fost transformat într-un amic de gheață de %k.,Игрок %o обращается в ледяную скульптуру игроком %k.,%o је претворен@[adj_1_sr] у лед играч %k.,%o förvandlades till en frostig kille av %k.,"%o, %k tarafından soğuk bir adama dönüştürüldü.",%o перетвори@[adj_2_ua] в лід завдяки %k. -%o received a shocking revelation from %k.,OB_MPMWEAPLIGHTNING,,,,%o zjistil@[ao_cs] šokující odhalení hráče %k.,%o fik en chokerende åbenbaring af %k.,%o musste eine schockierende Enthüllung von %k verkraften.,,%o recivis teruran revelacion de %k.,%o ha recibido una revelación impactante de %k.,%o recibió una revelación impactante de %k.,%o sai sähköistävän ilmestyksen pelaajalta %k.,%o a reçu un sacré coup de jus de la part de %k.,%o kapott egy sokkoló relevációt %k-tól/től,"%o ha ricevuto una notizia ""elettrizzante"" da %k.",%o は %k から衝撃的な啓示を受けた。,%o 은(는) %k 의 번갯불 덕에 충격적인 계시를 받았다.,%o kreeg een schokkende openbaring van %k.,%o fikk en sjokkerende åpenbaring fra %k.,%o otrzymał@[ao_pl] szokujące objawienie od %k.,%o recebeu uma revelação chocante de %k.,,%o a avut parte de o revelație șocantă de la %k.,Игрок %o откровенно шокирован игроком %k.,%o је прими@[ao_1_sr] шокантно откриће играч %k.,%o fick ett chockerande avslöjande av %k.,"%o, %k tarafından şoka uğratıldı.",%k розкри@[adj_1_ua] для %o шокуючу істину. -%o was wiped off the face of the universe by %k's Bloodscourge.,OB_MPMWEAPBLOODSCOURGE,,,,%o byl@[ao_cs] vymýcen@[ao_cs] ze jsoucna vesmíru Krvehromem hráče %k.,%o blev udslettet af universets overflade af %ks Blodgisel.,%o wurde von %ks Blutgeißel aus dem Universum verbannt.,,%o disdetruiĝis el la universo de la Sangskurĝ' de %k.,%o ha sido borrad@[ao_esp] de la faz del universo por la plaga sangrienta de %k.,%o fue borrad@[ao_esp] de la faz del universo por la plaga sangrienta de %k.,%k pyyhki %o paran maailmankaikkeudesta.,%o s'est fait@[e_fr] effacer de l'univers par le Fléau Sanglant de %k.,%o ki lett törölve az univerzumból %k Vérkorbácsának köszönhetően.,%o è stato cancellato dalla faccia dell'universo dal Flagello di Sangue di %k.,%o は %k の天罰によりこの世から一掃された。,%o 은(는) %k 이(가) 피의 재앙을 씀으로써 전혀 존재하지 않는 존재가 되어버렸다.,%o werd van het gezicht van het universum geveegd door %k's Bloedgesel.,%o ble utslettet fra universets overflate av %ks Bloodscourge.,Twarz %o została zmieciona z wszechświata przez Krwioplagę %k.,%o foi varrid@[ao_ptb] da face do universo pelo Flagelo de Sangue de %k.,,"%o a fost ras de pe fața universului de +%o got a mace to the face from %k.,OB_MPCWEAPMACE,,,,%o dostal@[ao_cs] palcátem po hlavě od hráče %k.,%o fik en stridskølle i ansigtet af %k.,%o bekam %ks Streitkolben ins Gesicht.,,%o prenis klabon al la vizaĝon el %k.,%o ha recibido un mazazo en la cara por %k.,%o recibió un mazazo en la cara por %k.,%o sai pelaajan %k nuijasta naamaansa.,%o s'est fait@[e_fr] casser la figure par la masse de %k.,,%o kapott egy buzogányt a fejébe %k által.,%o si è preso una mazzata in faccia da %k.,%o は自らの顔に %k のメイスを受けた。,%o 은(는) %k 의 철퇴를 맞은 뒤에야 철이 들었다.,%o kreeg een %k's gesel in @[zijn_haar_nl] gezicht.,%o ble slått i ansiktet av %k.,%o dostał@[ao_pl] buzdyganem %k w twarz.,%o levou com a maça de %k na cara.,,%o a primit un buzdugan în față de la %k.,Игрок %o получил по морде булавой игрока %k.,%o је доби@[ao_1_sr] буздован у фацу играч %k.,%o fick en stridsklubba i ansiktet av %k.,"%o, %k tarafından eşek sudan gelinceye kadar dövüldü.",%o отрима@[adj_1_ua] по пиці булавою %k. +%o was bitten by %k's serpent staff.,OB_MPCWEAPSTAFFM,,,,%o byl@[ao_cs] kousnut@[ao_cs] hadí holí hráče %k.,%o blev bidt af %ks slange-stav.,%o wurde von %ks Schlangenstab gebissen.,,%o mordiĝis de la serpentbastono de %k.,A %o l@[ao_esp] ha mordido el bastón de la serpiente de %k.,A %o l@[ao_esp] mordió el bastón de la serpiente de %k.,%k puri %o parkaa käärmesauvallaan.,%o s'est fait@[e_fr] mordre par le Bâton du Serpent %k.,,%o meg lett harapva %k Kígyó Botja által.,%o è stato morso dalla Staffa del Serpente di %k.,%o は %k の蛇の杖に噛まれた。,%o 은(는) %k 의 뱀 지팡이에 의해 독살당했다.,%o werd gebeten door %k's slangenstaf.,%o ble bitt av %ks slangestav.,%o został@[ao_pl] ugryzion@[adj_pl] laską węży %k.,%o foi mordid@[ao_ptb] pelo Cetro da Serpente de %k.,,%o a fost mușcat de bastonul șarpe al lui %k.,Игрок %o искусан змеиным посохом игрока %k.,%o је угрижен@[adj_1_sr] змијским штапом играч %k.,%o blev biten av %ks ormstab.,"%o, %k tarafından zehirlendi.",Посох змія %k покусав %o. +%o choked on %k's serpent staff.,OB_MPCWEAPSTAFFR,,,,%o se zadusil@[ao_cs] hadí holí hráče %k.,%o blev kvalt af %ks slange stav.,%o verschluckte sich an %ks Schlangenstab.,,%o sufokis la serpentbastonon de %k.,%o se ha ahogado con el bastón de la serpiente de %k.,%o se ahogó con el bastón de la serpiente de %k.,%o tukehtui pelaajan %k käärmesauvaan.,%o s'est étranglé@[e_fr] sur le Bâton du Serpent de %k,,%o megfulladt %k Kígyó Botja által.,%o è soffocato a causa della Staffa del Serpente di %k.,%o は %k の蛇の杖に息の根を止められた。,%o 은(는) %k 의 뱀 지팡이 때문에 숨을 쉬지 못했다.,%o stikte in %k's slangenstaf.,%o ble kvalt av %ks slangestav.,%o zakrztusił@[ao_pl] się laską węży %k.,%o se engasgou com o Cetro da Serpente de %k,,%o s-a sufocat pe bastonul șarpe al lui %k.,Игрок %o задушен змеиным посохом игрока %k.,%o је задављен@[adj_1_sr] змијским штапом играч %k.,%o kvävdes av %ks ormstab.,"%o, %k tarafından kurutuldu.",Посох змія %k задушив %o. +%o was lit up by %k's flames.,OB_MPCWEAPFLAME,,,,%o vzplanul@[ao_cs] plameny hráče %k.,%o blev tændt af %ks flammer.,%o wurde von %ks Flammen erleuchtet.,,%o ekbruliĝis de la fajroj de %k.,A %o l@[ao_esp] han calcinado las llamas de %k.,A %o l@[ao_esp] calcinaron las llamas de %k.,%o syttyi pelaajan %k liekeistä.,%o s'est fait@[e_fr] allumer par %k.,,%o fel lett gyújtva %k tűze által.,%o è stato illuminato dalle fiamme di %k.,%o は %k によって炎を灯された。,%o 은(는) %k 의 화염폭풍에 휩쓸렸다.,%o werd opgelicht door %k's vlammen.,%o ble opplyst av %ks flammer.,%o został@[ao_pl] oświetlon@[adj_pl] płomieniami %k.,%o foi incendiad@[ao_ptb] pelas chamas de %k.,,%o s-a aprins de la flăcările lui %k.,Игрок %o сгорел в огне игрока %k.,%o је осветљен@[adj_1_sr] пламеном играч %k.,%o blev upplyst av %ks lågor.,"%o, %k tarafından aydınlatıldı.",%o було спалено в полум'ї %k. +%o was cleansed by %k's Wraithverge.,OB_MPCWEAPWRAITHVERGE,,,,%o byl@[ao_cs] očištěn@[ao_cs] Zjevitelem hráče %k.,%o blev renset af %ks Spirit Bringer.,%o wurde durch %ks Geisterbringer geläutert.,,%o puriĝis de la Fantomkruc' de %k.,A %o l@[ao_esp] ha limpiado la vara fantasmal de %k.,A %o l@[ao_esp] limpió la vara fantasmal de %k.,%k puhdisti pelaajan %o Haamusauvallaan.,%o a été purifié@[e_fr] par la Verge Phantasmale de %k.,,%o meg lett tisztítva %k Bosszúbot által.,%o è stato purificato dalla Verga SconfinaSpettri di %k.,%o は %k のレイスバージによって浄化された。,%o 은(는) %k 의 사령의 지팡이에 의해 정화되었다.,%o werd gereinigd door %k's Schimroede.,%o ble renset av %ks Wraithverge.,%o został@[ao_pl] oczyszczon@[adj_pl] przez Widmoskraj %k.,%o foi purificad@[ao_ptb] pelo Cajado Fantasma de %k.,,%o a fost purificat de Toiagul Stafie al lui %k.,Игрок %o очищен жезлом духов игрока %k.,%o je прочишћен@[adj_1_sr] штапом утваре играч %k.,%o blev renad av %ks Wraithverge.,"%o, %k tarafından temizlendi.",%k очисти@[adj_1_ua] %o Символом Мари. +%o took one too many sapphire beams from %k.,OB_MPMWEAPWAND,,,,%o koupil@[ao_cs] přespříliš safírových střel od hráče %k.,%o tog en safirstråle for meget fra %k.,%o bekam zu viele Saphierstrahlen von %k ab.,,%o recivis unu tro da safira radio de %k.,%o ha recibido demasiados rayos de zafiro de %k.,%o recibió demasiados rayos de zafiro de %k.,%o otti vastaan yhden liikaa pelaajan %k safiirisäteistä.,%o s'est pris@[e_fr] un rayon saphirique en trop de la part de %k.,,%o túl sok zafír sugarat kapott %k-tól/től.,%o si è buscato un raggio di zaffiro di troppo da %k.,%o は %k から多量のサファイアビームを受け取った。,%o 은(는) %k 의 사파이어 빛을 너무 많이 째려봤다.,%o kreeg een saffierstraal teveel van %k.,%o fikk en safirstråle for mye fra %k.,%o wzi@[irreg_2_pl] o jeden szafirowy promień od %k za dużo.,%o levou muitos raios de safira de %k.,,%o a primit o rază în plus de la safirul lui %k.,Игрок %o схватил слишком много сапфировых зарядов от игрока %k.,%o је узе@[ao_1_sr] превише сафирских зракова играч %k.,%o tog emot en för många safirstrålar från %k.,"%o, %k tarafından dönüştürüldü.",%o хапану@[adj_1_ua] надто багато сапфірових снарядів від %k. +%o was turned into a frosty fellow by %k.,OB_MPMWEAPFROST,,,,%o byl@[ao_cs] zchlazen@[ao_cs] hráčem %k.,%o blev forvandlet til en frostklar fyr af %k.,%o wurde von %k schockgefrostet.,,%o farigiĝis frostulon de %k.,%o ha sido convertid@[ao_esp] en un helado por %k.,%o fue convertid@[ao_esp] en un helado por %k.,%k muutti %o paran pakkasveikoksi.,%o s'est fait@[e_fr] transformer en glaçon par %k.,,%o jégbaráttá alakult %k által.,%o è stato trasformato in un simpatico pupazzo di neve da %k.,%o は %k によって冷ややかな輩になった。,%o 은(는) %k 의 얼음 파편에 의해 눈사람이 되었다.,%o werd ijskoud veranderd door %k.,%o ble forvandlet til en iskald fyr av %k.,%o został@[ao_pl] zmienion@[adj_pl] w mroźnego koleżkę przez %k.,%o foi transformad@[ao_ptb] em picolé por %k.,,%o a fost transformat într-un amic de gheață de %k.,Игрок %o обращается в ледяную скульптуру игроком %k.,%o је претворен@[adj_1_sr] у лед играч %k.,%o förvandlades till en frostig kille av %k.,"%o, %k tarafından soğuk bir adama dönüştürüldü.",%o перетвори@[adj_2_ua] в лід завдяки %k. +%o received a shocking revelation from %k.,OB_MPMWEAPLIGHTNING,,,,%o zjistil@[ao_cs] šokující odhalení hráče %k.,%o fik en chokerende åbenbaring af %k.,%o musste eine schockierende Enthüllung von %k verkraften.,,%o recivis teruran revelacion de %k.,%o ha recibido una revelación impactante de %k.,%o recibió una revelación impactante de %k.,%o sai sähköistävän ilmestyksen pelaajalta %k.,%o a reçu un sacré coup de jus de la part de %k.,,%o kapott egy sokkoló relevációt %k-tól/től,"%o ha ricevuto una notizia ""elettrizzante"" da %k.",%o は %k から衝撃的な啓示を受けた。,%o 은(는) %k 의 번갯불 덕에 충격적인 계시를 받았다.,%o kreeg een schokkende openbaring van %k.,%o fikk en sjokkerende åpenbaring fra %k.,%o otrzymał@[ao_pl] szokujące objawienie od %k.,%o recebeu uma revelação chocante de %k.,,%o a avut parte de o revelație șocantă de la %k.,Игрок %o откровенно шокирован игроком %k.,%o је прими@[ao_1_sr] шокантно откриће играч %k.,%o fick ett chockerande avslöjande av %k.,"%o, %k tarafından şoka uğratıldı.",%k розкри@[adj_1_ua] для %o шокуючу істину. +%o was wiped off the face of the universe by %k's Bloodscourge.,OB_MPMWEAPBLOODSCOURGE,,,,%o byl@[ao_cs] vymýcen@[ao_cs] ze jsoucna vesmíru Krvehromem hráče %k.,%o blev udslettet af universets overflade af %ks Blodgisel.,%o wurde von %ks Blutgeißel aus dem Universum verbannt.,,%o disdetruiĝis el la universo de la Sangskurĝ' de %k.,%o ha sido borrad@[ao_esp] de la faz del universo por la plaga sangrienta de %k.,%o fue borrad@[ao_esp] de la faz del universo por la plaga sangrienta de %k.,%k pyyhki %o paran maailmankaikkeudesta.,%o s'est fait@[e_fr] effacer de l'univers par le Fléau Sanglant de %k.,,%o ki lett törölve az univerzumból %k Vérkorbácsának köszönhetően.,%o è stato cancellato dalla faccia dell'universo dal Flagello di Sangue di %k.,%o は %k の天罰によりこの世から一掃された。,%o 은(는) %k 이(가) 피의 재앙을 씀으로써 전혀 존재하지 않는 존재가 되어버렸다.,%o werd van het gezicht van het universum geveegd door %k's Bloedgesel.,%o ble utslettet fra universets overflate av %ks Bloodscourge.,Twarz %o została zmieciona z wszechświata przez Krwioplagę %k.,%o foi varrid@[ao_ptb] da face do universo pelo Flagelo de Sangue de %k.,,"%o a fost ras de pe fața universului de Flagelul Sângeros al lui %k.",Игрок %o стёрт с лица вселенной Кровавым бичом игрока %k.,%o је обрисан@[adj_1_sr] са лица свемира од Крвавог зла играч %k.,%o blev utplånad från universums yta av %ks Bloodscourge.,"%o, %k tarafından evrenden silindi.",%o було стерто з лиця всесвіту за допомогою Кривавої Кари %k. -,,Strife,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Pickups,,,,,,,,,,,,,,,,,,,,,,,,,, -You picked up the Metal Armor.,TXT_METALARMOR,,,You picked up the Metal Armour.,Sebral@[ao_cs] jsi kovové brnění.,Du samlede metalrustningen op.,Du hast die Metallrüstung genommen.,Πήρες τη Μεταληκή Πανοπλία.,Vi trovis metalan armaĵon.,Encuentras una armadura de metal.,,Poimit metallihaarniskan.,Vous avez pris l'armure de métal.,Felvetted a Fémpáncélt.,Hai raccolto l'Armatura di Metallo.,メタルアーマー 入手。,강철 갑옷을 획득했다.,Je hebt het metalen harnas opgepakt.,Du plukket opp metallrustningen.,Podniosł@[irreg_3_pl] Metalowy Pancerz.,Você pegou a Armadura de Metal.,Apanhaste a Armadura de Metal.,Ai ridicat Armura din Metal.,Получена металлическая броня.,Покупио си метални оклоп.,Du plockade upp metallrustningen.,Metal Zırhı aldın.,Взято Металічну броню. -You picked up the Leather Armor.,TXT_LEATHERARMOR,,,You picked up the Leather Armour.,Sebral@[ao_cs] jsi kožené brnění.,Du samlede læderrustningen op.,Du hast die Lederrüstung genommen.,Πήρες τη Δερμάτινη Πανοπλία.,Vi trovis ledan armaĵon.,Encuentras una armadura de cuero.,,Poimit nahkasuojuksen.,Vous avez pris l'armure de cuir.,Felvetted a Bőrpáncélt.,Hai raccolto l'Armatura di Cuoio.,レザーアーマー 入手。,가죽 갑옷을 획득했다.,Je hebt het leren harnas opgepakt.,Du plukket opp lærrustningen.,Podniosł@[irreg_3_pl] Skórzany Pancerz.,Você pegou a Armadura de Couro.,Apanhaste a Armadura de Couro.,Ai ridicat Armura din Piele.,Получена кожаная броня.,Покупио си кожни оклоп.,Du plockade upp läderrustningen.,Deri Zırhı aldın.,Взято Шкіряну броню. -You picked up the Med patch.,TXT_MEDPATCH,,,,Sebral@[ao_cs] jsi obvaz.,Du samlede Med patch op.,Du hast den Verband genommen.,,Vi trovis kuracbendojn.,Encuentras unas tiritas.,Encuentras unas curitas.,Poimit sidekääreen.,Vous avez pris le pansement.,Felvetted a Ragtapaszt.,Hai raccolto le Bende.,医薬パッチ 入手。,의료 붕대를 획득했다.,Je hebt de med-patch opgepakt.,Du plukket opp en Med-patch.,Podniosł@[irreg_3_pl] Bandaż.,Você pegou a compressa médica.,Apanhaste a compressa médica.,Ai ridicat Trusa de Prim-Ajutor.,Получен медицинский бинт.,Покупио си прву помоћ.,Du plockade upp den medicinska plåstret.,Sağlık bandını aldın.,Взято оклюзійну пов'язку. -You picked up the Medical kit.,TXT_MEDICALKIT,,,,Sebral@[ao_cs] jsi lékárničku.,Du samlede Medicinsk kit op.,Du hast den Verbandskasten genommen.,,Vi trovis sukurkeston.,Encuentras un botiquín.,,Poimit lääkintälaukun.,Vous avez pris le kit médical.,Felvetted az Elsősegélycsomagot.,Hai raccolto il Kit di Pronto Soccorso.,医療用キット 入手。,구급 키트를 획득했다.,Je hebt de medicijndoos opgepakt.,Du plukket opp det medisinske settet.,Podniosł@[irreg_3_pl] Apteczkę.,Você pegou o Kit Médico.,Apanhaste o Kit Médico.,Ai ridicat Kitul de Prim-Ajutor.,Получена аптечка.,Покупио си медицински комплет,Du plockade upp den medicinska utrustningen.,Tıbbi kiti aldın.,Взято індивідуальну аптечку. -You picked up the Surgery Kit.,TXT_SURGERYKIT,,,,Sebral@[ao_cs] jsi chirurgickou soupravu.,Du samlede kirurgisættet op.,Du hast den Erste-Hilfe-Kasten genommen.,,Vi trovis kirurgian keston.,Encuentras un kit quirúrgico.,,Poimit kirurgilaukun.,Vous avez pris le kit de chirurgie.,Felvetted az Orvosi Műtőfelszerelést.,Hai raccolto il Kit Chirurgico.,手術キット 入手。,수술 키트를 획득했다.,Je hebt het chirurgenpakket opgepakt.,Du plukket opp Kirurgi-settet.,Podniosł@[irreg_3_pl] Zestaw Chirurga.,Você pegou o Kit de Cirurgia.,Apanhaste o Kit de Cirugia.,Ai ridicat Kitul pentru Operații.,Получен медкомплект.,Покупио си хируршки комплет,Du plockade upp operationssatsen.,Ameliyat setini aldın.,Взято медичний кейс. -You picked up the map.,TXT_STRIFEMAP,,,,Sebral@[ao_cs] jsi mapu.,Du samlede kortet op.,Du hast die Karte genommen.,Πήρες το χάρτη.,Vi trovis la mapon.,Encuentras el mapa.,,Poimit kartan.,Vous avez pris la carte,Felvetted a térképet.,Hai raccolto la Mappa.,マップ 取得。,지도를 획득했다.,Je hebt de kaart opgepakt.,Du plukket opp kartet.,Podniosł@[irreg_3_pl] mapę.,Você pegou o mapa.,Apanhaste o mapa.,Ai ridicat harta.,Получена карта.,Покупио си мапу.,Du plockade upp kartan.,Haritayı aldın.,Взято карту. -You picked up the ring.,TXT_BELDINSRING,,,,Sebral@[ao_cs] jsi prsten.,Du samlede ringen op.,Du hast den Ring genommen.,Πήρες το Δακτύλιο.,Vi havas la ringon.,Tienes el anillo.,,Poimit sormuksen.,Vous avez pris l'anneau.,Felvetted a Gyűrűt.,Hai raccolto l'Anello.,指輪 取得。,반지를 획득했다.,Je hebt de ring opgepakt.,Du plukket opp ringen.,Podniosł@[irreg_3_pl] pierścień.,Você pegou o anel.,Apanhaste o anel.,Ai ridicat inelul.,Получено кольцо.,Покупио си прстен.,Du plockade upp ringen.,Yüzüğü aldın.,Взято каблучку. -You picked up the Offering Chalice.,TXT_OFFERINGCHALICE,,,,Sebral@[ao_cs] jsi obětní kalich.,Du samlede offerkalken op.,Du hast den Opferkelch genommen.,,Vi trovis oferdonan kalikon.,Encuentras un cáliz de ofrenda.,,Poimit uhrimaljan.,Vous avez pris le Calice d'obole.,Felvetted az Áldozati Kelyhet.,Hai raccolto il Calice delle Offerte.,寄贈された聖杯 取得。,번제 성배를 훔쳤다.,Je hebt de Offerbeker opgepakt.,Du plukket opp offerbegeret.,Podniosł@[irreg_3_pl] Kielich Ofiarny.,Você pegou o Cálice de Oferenda.,Apanhaste o Cálice de Oferenda.,Ai ridicat Potirul pentru Ofrande.,Получена чаша для подношений.,Покупио си Жртвени пехар.,Du plockade upp offerkalken.,Adak Kadehini aldın.,Взято чашу для жертвоприношення. -You picked up the ear.,TXT_EAR,,,,Sebral@[ao_cs] jsi ucho.,Du samlede øret op.,Du hast das Ohr gernommen.,Πήρες το αυτί.,Vi havas la orelon.,Tienes la oreja.,,Poimit korvan.,Vous avez pris l'oreille.,Felvetted a Fület.,Hai raccolto l'Orecchio.,耳 取得。,잘린 귀를 주웠다.,Je hebt het oor opgepakt.,Du plukket opp øret.,Podniosł@[irreg_3_pl] ucho.,Você pegou a orelha.,Apanhaste a orelha.,Ai ridicat urechea.,Получено ухо.,Покупио си уво.,Du plockade upp örat.,Kulağı aldın.,Взято вухо. -You picked up the broken power coupling.,TXT_BROKENCOUPLING,,,,Sebral@[ao_cs] jsi rozbitou spojku.,Du samlede den ødelagte strømkobling op.,Du hast den defekten Stromabnehmer genommen.,,Vi havas la rompitan energian kuplilon.,Tienes el acoplador de energía roto.,,Poimit rikkinäisen virtaliittimen.,Vous avez pris le coupleur énergétique cassé.,Felvetted a hibás tápcsatlakozót.,Hai raccolto la Coppia Energetica Rotta.,壊れたパワーカップリング 取得。,망가진 동력선 장치를 획득했다.,Je hebt de kapotte stroomkoppeling opgepakt.,Du plukket opp den ødelagte kraftkoblingen.,Podniosł@[irreg_3_pl] zepsute obwody zasilające.,Você pegou o acoplador de energia quebrado.,Apanhaste o acoplador de energia partido.,Ai ridicat cuplajul defect de curent.,Получена повреждённая муфта.,Покупио си неисправну спојницу напајања.,Du plockade upp den trasiga kraftkopplingen.,Kırık güç bağlantısını aldın.,Взято зламану силову муфту. -You picked up the Shadow armor.,TXT_SHADOWARMOR,,,You picked up the Shadow armour.,Sebral@[ao_cs] jsi krycí brnění.,Du samlede skyggerustningen op.,Du hast die Schattenrüstung genommen.,,Vi trovis ombran armaĵon.,Encuentras una armadura de sombra.,,Poimit varjohaarniskan.,Vous avez pris l'armure de l'ombre.,Felvetted az Árnyékpáncélt.,Hai raccolto l'Armatura Ombra.,シャドウアーマー 入手。,그림자 갑옷을 획득했다.,Je hebt het schaduwharnas opgepakt.,Du plukket opp Skygge-rustningen.,Podniosł@[irreg_3_pl] Cienisty Pancerz.,Você pegou a armadura das sombras.,Apanhaste a armadura das sombras.,Ai ridicat Armura Umbrei.,Получена теневая броня.,Покупио си оклоп сенки.,Du plockade upp skuggrustningen.,Gölge zırhını aldın.,Взято Тіньову броню. -You picked up the Environmental Suit.,TXT_ENVSUIT,,,,Sebral@[ao_cs] jsi ochranný oděv,Du samlede miljødragten op.,Du hast den Schutzanzug genommen.,,Vi trovis medi-ŝirman veston,Encuentras un traje NBQ.,,Poimit ympäristösuojapuvun.,Vous avez pris la combinaison hazmat.,Felvetted a Védőruhát.,Hai raccolto la Tuta Ambientale.,耐環境スーツ 入手。,환경 방호복을 획득했다.,Je hebt het beschermende pak opgepakt.,Du plukket opp miljødrakten.,Podniosł@[irreg_3_pl] Skafander Ochronny.,Você pegou o Traje de Proteção.,Apanhaste o Fato Protetor.,Ai ridicat Costumul de Protecție.,Получен защитный костюм.,Покупио си заштитно одело.,Du plockade upp miljödräkten.,Çevresel Kıyafeti aldın.,Взято захисний костюм. -You picked up the Guard Uniform.,TXT_GUARDUNIFORM,,,,Sebral@[ao_cs] jsi hlídačovu uniformu.,Du samlede vagtuniformen op.,Du hast die Wächteruniform genommen.,,Vi havas la uniformon de gardisto.,Tienes el uniforme de un guardia.,,Poimit vartijan univormun.,Vous avez pris l'Uniforme du garde.,Felvetted az Őr Egyenruhát.,Hai raccolto l'Uniforme da Guardia.,守衛の制服 入手。,경비 전투복을 획득했다.,Je hebt het wachtersuniform opgepakt.,Du plukket opp vaktuniformen.,Podniosł@[irreg_3_pl] Mundur Strażnika.,Você pegou o Uniforme de Guarda.,Apanhaste o Uniforme de Guarda.,Ai ridicat Uniforma de Paznic.,Получена униформа стражника.,Покупио си стражарску униформу,Du plockade upp vaktuniformen.,Muhafız Üniformasını aldın.,Взято уніформу охоронця. -You picked up the Officer's Uniform.,TXT_OFFICERSUNIFORM,,,,Sebral@[ao_cs] jsi důstojníkovu uniformu.,Du samlede officersuniformen op.,Du hast die Offiziersuniform genommen.,,Vi trovis oficiran uniformon.,Encuentras un uniforme de oficial.,,Poimit upseerin univormun.,Vous avez pris l'Uniforme de l'officier.,Felvetted a Tiszti Egyenruhát.,Hai raccolto l'Uniforme da Ufficiale.,士官の制服 入手。,장교 전투복을 획득했다.,Je hebt het officiersuniform opgepakt.,Du plukket opp offisersuniformen.,Podniosł@[irreg_3_pl] Mundur Oficera.,Você pegou o Uniforme de Oficial.,Apanhaste o Uniforme de Oficial.,Ai ridicat Uniforma Ofițerului.,Получена униформа офицера.,Покупио си официрску униформу,Du plockade upp officersuniformen.,Subay üniformasını aldın.,Взято офіцерську уніформу. -You picked up the flame thrower parts.,TXT_FTHROWERPARTS,,,,Sebral@[ao_cs] jsi součásti plamenometu.,Du samlede flammekasterdele op.,Du hast die Flammenwerferteile genommen.,,Vi havas la partojn de flamĵetilo.,Tienes las partes de un lanzallamas.,,Poimit liekinheittimen osat.,Vous avez pris les pièces du lance-flames.,Felvetted a lángszóró részeit.,Hai raccolto delle parti di Lanciafiamme.,火炎放射器の部品 入手。,화염방사기 부품을 획득했다.,Je hebt de vlammenwerperonderdelen opgepakt.,Du plukket opp delene til flammekasteren.,Podniosł@[irreg_3_pl] części miotacza ognia.,Você pegou as partes do lança-chamas.,Apanhaste as peças do lança-chamas.,Ai ridicat bucățile aruncătorului de flăcări.,Получены детали для огнемёта.,Покупио си делове за бацач пламена.,Du plockade upp delarna till flamkastaren.,Alev silahının parçalarını aldın.,Взято деталі для вогнемету. -You picked up the report.,TXT_REPORT,,,,Sebral@[ao_cs] jsi hlášení.,Du samlede rapporten op.,Du hast den Report genommen.,,Vi havas la raporton.,Tienes el reporte.,,Poimit raportin.,Vous avez pris le compte-rendu.,Felvetted a jelentést.,Hai raccolto il rapporto.,報告書 取得。,보고서를 획득했다.,Je hebt het rapport opgepakt.,Du plukket opp rapporten.,Podniosł@[irreg_3_pl] raport.,Você pegou o relatório.,Apanhaste o relatório.,Ai ridicat raportul.,Получен отчёт.,Покупио си извештај.,Du plockade upp rapporten.,Raporu aldın.,Взято звіт. -You picked up the info.,TXT_INFO,,,,Sebral@[ao_cs] jsi informace.,Du samlede oplysningerne op.,Du hast die Info genommen.,Πήρες της πληροφορίες,Vi havas la informojn.,Tienes la información.,,Poimit tiedot.,Vous avez pris l'info.,Felvetted az információt.,Hai raccolto delle Informazioni.,情報 取得。,정보를 획득했다.,Je hebt de informatie opgepakt.,Du plukket opp informasjonen.,Podniosł@[irreg_3_pl] informacje.,Você pegou a informação.,Apanhaste a informação.,Ai recepționat informația.,Получена сводка.,Покупио си инфо.,Du plockade upp informationen.,Bilgiyi aldın.,Отримано данні. -You picked up the Targeter.,TXT_TARGETER,,,,Sebral@[ao_cs] jsi zaměřovač.,Du samlede targeter op.,Du hast die Zielhilfe genommen.,Πήρες τον Στοχευτή.,Vi trovis celilon.,Encuentras una mira de arma.,,Poimit tähtäinlaitteen.,Vous avez pris le cibleur.,Felvetted a Célzóberendezést.,Hai raccolto il Puntatore.,照準器 入手。,조준기를 획득했다.,Je hebt het Richter opgepakt.,Du plukket opp Targeteren.,Podniosł@[irreg_3_pl] Namierzacz.,Você pegou a Mira.,Apanhaste a Mira.,Ai ridicat Țintitorul.,Получен целеуказатель.,Покупио си нишанитеља.,Du plockade upp targeter.,Hedefleyiciyi aldın.,Взято цілевказівник. -You picked up the Communicator.,TXT_COMMUNICATOR,,,,Sebral@[ao_cs] jsi komunikátor.,Du samlede kommunikatoren op.,Du hast den Kommunikator genommen.,,Vi trovis interfonon.,Encuentras un intercomunicador.,,Poimit viestintälaitteen.,Vous avez pris le Communicateur,Felvetted a Kommunikátort,Hai raccolto il Comunicatore.,コミュニケーター 取得。,연락장치를 획득했다.,Je hebt de Communicator opgepakt.,Du plukket opp kommunikatoren.,Podniosł@[irreg_3_pl] Komunikator.,Você pegou o Comunicador.,Apanhaste o Comunicador.,Ai ridicat Comunicatorul.,Получен передатчик.,Покупио си комуникатор.,Du plockade upp kommunikatorn.,İletişim cihazını aldın.,Взято комунікатор. -You picked up the coin.,TXT_COIN,,,,Sebral@[ao_cs] jsi minci.,Du samlede mønten op.,Du hast die Münze genommen.,Πήρες το κέρμα.,Vi trovis moneron.,Encuentras una moneda.,,Poimit kolikon.,Vous avez pris la pièce.,Felvetted az érmét.,Hai raccolto la Moneta.,コイン 入手。,동전을 주웠다.,Je hebt de munt opgepakt.,Du plukket opp mynten.,Podniosł@[irreg_3_pl] monetę.,Você pegou a moeda.,Apanhaste a moeda.,Ai ridicat moneda.,Получена монета.,Покупио си новчић.,Du plockade upp myntet.,Parayı aldın.,Взято монету. -You picked up %d gold.,TXT_XGOLD,,,,Sebral@[ao_cs] jsi %d zlatých.,Du samlede %d guld op.,Du hast %d Gold genommen.,,Vi trovis %d da oro.,Encuentras %d monedas de oro.,,Poimit kultaa %d arvosta.,Vous avez pris %d pièces.,Felvettél %d aranyat.,Hai raccolto %d pezzi d'oro.,%d ゴールド 入手。,골드 %d 개를 획득했다.,Je hebt %d goud opgepakt.,Du plukket opp %d gull.,Podniosł@[irreg_3_pl] %d monet.,Você pegou %d moedas de ouro.,Apanhaste %d moedas de ouro.,Ai ridicat %g bucăți de aur.,Получено %d золотых.,Покупио си %d златника.,Du plockade upp %d guld.,%d altın aldın.,Взято %d золотих. -You picked up the Teleporter Beacon.,TXT_BEACON,,,,Sebral@[ao_cs] jsi teleportační maják.,Du samlede Teleporter Beacon op.,Du hast das Teleportersignal genommen.,,Vi trovis teleportil-signalilon.,Encuentras una baliza de teletransporte.,,Poimit kaukosiirrinmajakan.,Vous avez pris la balise de téléporteur.,Felvetted a Teleport jelzőt.,Hai raccolto il Radiofaro per Teletrasporto.,テレポータービーコン 取得。,텔레포터 비콘을 획득했다.,Je hebt de teleporterbaken opgepakt.,Du plukket opp Teleporter-signalet.,Podniosł@[irreg_3_pl] Nadajnik Teleportera.,Você pegou o Sinalizador de Teletransporte.,Apanhaste o Sinalizador de Teletransporte.,Ai ridicat Luminatorul pentru Teleportor.,Получен телепортационный маяк.,Покупио си одашиљач за телепортовање.,Du plockade upp teleporterfyren.,Işınlayıcı İşaretini aldın.,Взято пристрій телепортації. -You picked up the Degnin Ore.,TXT_DEGNINORE,,,,Sebral@[ao_cs] jsi degninskou rudu.,Du samlede Degnin Ore op.,Du hast das Degnin-Erz genommen.,,Vi trovis degninan minaĵon.,Encuentras mineral de Degnin.,,Poimit Degnin-malmia.,Vous avez pris le minerai de Degnin.,Felvetted a Degnin Ércet.,Hai raccolto il Minerale Degnin.,デグニン鉱石 取得。,데그닌 광석을 획득했다.,Je hebt het Degnin-erts opgepakt.,Du plukket opp Degnin-malmen.,Podniosł@[irreg_3_pl] Rudę Degninu.,Você pegou o Minério Degnin.,Apanhaste o Minério Degnin.,Ai ridicat minereul de Degnin.,Получена дегнинская руда.,Покупио си Дегнинску руду.,Du plockade upp Degnin Malm.,Degnin Cevherini aldın.,Взято Дегінську руду. -You picked up the scanner.,TXT_SCANNER,,,,Sebral@[ao_cs] jsi skener.,Du samlede scanneren op.,Du hast den Scanner genommen.,Πήρες το σαρωτή.,Vi trovis skanilon.,Encuentras un escáner.,,Poimit skannerin.,Vous avez pris l'analyseur.,Felvetted a szkennert.,Hai raccolto lo Scanner.,スキャナー 入手。,탐지기를 획득했다.,Je hebt de scanner opgepakt.,Du plukket opp skanneren.,Podniosł@[irreg_3_pl] skaner.,Você pegou o scanner.,Apanhaste o scanner.,Ai ridicat scannerul.,Получен сканер.,Покупио си скенер.,Du plockade upp skannern.,Tarayıcıyı aldın.,Отримано сканер. +,,Strife,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Pickups,,,,,,,,,,,,,,,,,,,,,,,,,,, +You picked up the Metal Armor.,TXT_METALARMOR,,,You picked up the Metal Armour.,Sebral@[ao_cs] jsi kovové brnění.,Du samlede metalrustningen op.,Du hast die Metallrüstung genommen.,Πήρες τη Μεταληκή Πανοπλία.,Vi trovis metalan armaĵon.,Encuentras una armadura de metal.,,Poimit metallihaarniskan.,Vous avez pris l'armure de métal.,,Felvetted a Fémpáncélt.,Hai raccolto l'Armatura di Metallo.,メタルアーマー 入手。,강철 갑옷을 획득했다.,Je hebt het metalen harnas opgepakt.,Du plukket opp metallrustningen.,Podniosł@[irreg_3_pl] Metalowy Pancerz.,Você pegou a Armadura de Metal.,Apanhaste a Armadura de Metal.,Ai ridicat Armura din Metal.,Получена металлическая броня.,Покупио си метални оклоп.,Du plockade upp metallrustningen.,Metal Zırhı aldın.,Взято Металічну броню. +You picked up the Leather Armor.,TXT_LEATHERARMOR,,,You picked up the Leather Armour.,Sebral@[ao_cs] jsi kožené brnění.,Du samlede læderrustningen op.,Du hast die Lederrüstung genommen.,Πήρες τη Δερμάτινη Πανοπλία.,Vi trovis ledan armaĵon.,Encuentras una armadura de cuero.,,Poimit nahkasuojuksen.,Vous avez pris l'armure de cuir.,,Felvetted a Bőrpáncélt.,Hai raccolto l'Armatura di Cuoio.,レザーアーマー 入手。,가죽 갑옷을 획득했다.,Je hebt het leren harnas opgepakt.,Du plukket opp lærrustningen.,Podniosł@[irreg_3_pl] Skórzany Pancerz.,Você pegou a Armadura de Couro.,Apanhaste a Armadura de Couro.,Ai ridicat Armura din Piele.,Получена кожаная броня.,Покупио си кожни оклоп.,Du plockade upp läderrustningen.,Deri Zırhı aldın.,Взято Шкіряну броню. +You picked up the Med patch.,TXT_MEDPATCH,,,,Sebral@[ao_cs] jsi obvaz.,Du samlede Med patch op.,Du hast den Verband genommen.,,Vi trovis kuracbendojn.,Encuentras unas tiritas.,Encuentras unas curitas.,Poimit sidekääreen.,Vous avez pris le pansement.,,Felvetted a Ragtapaszt.,Hai raccolto le Bende.,医薬パッチ 入手。,의료 붕대를 획득했다.,Je hebt de med-patch opgepakt.,Du plukket opp en Med-patch.,Podniosł@[irreg_3_pl] Bandaż.,Você pegou a compressa médica.,Apanhaste a compressa médica.,Ai ridicat Trusa de Prim-Ajutor.,Получен медицинский бинт.,Покупио си прву помоћ.,Du plockade upp den medicinska plåstret.,Sağlık bandını aldın.,Взято оклюзійну пов'язку. +You picked up the Medical kit.,TXT_MEDICALKIT,,,,Sebral@[ao_cs] jsi lékárničku.,Du samlede Medicinsk kit op.,Du hast den Verbandskasten genommen.,,Vi trovis sukurkeston.,Encuentras un botiquín.,,Poimit lääkintälaukun.,Vous avez pris le kit médical.,,Felvetted az Elsősegélycsomagot.,Hai raccolto il Kit di Pronto Soccorso.,医療用キット 入手。,구급 키트를 획득했다.,Je hebt de medicijndoos opgepakt.,Du plukket opp det medisinske settet.,Podniosł@[irreg_3_pl] Apteczkę.,Você pegou o Kit Médico.,Apanhaste o Kit Médico.,Ai ridicat Kitul de Prim-Ajutor.,Получена аптечка.,Покупио си медицински комплет,Du plockade upp den medicinska utrustningen.,Tıbbi kiti aldın.,Взято індивідуальну аптечку. +You picked up the Surgery Kit.,TXT_SURGERYKIT,,,,Sebral@[ao_cs] jsi chirurgickou soupravu.,Du samlede kirurgisættet op.,Du hast den Erste-Hilfe-Kasten genommen.,,Vi trovis kirurgian keston.,Encuentras un kit quirúrgico.,,Poimit kirurgilaukun.,Vous avez pris le kit de chirurgie.,,Felvetted az Orvosi Műtőfelszerelést.,Hai raccolto il Kit Chirurgico.,手術キット 入手。,수술 키트를 획득했다.,Je hebt het chirurgenpakket opgepakt.,Du plukket opp Kirurgi-settet.,Podniosł@[irreg_3_pl] Zestaw Chirurga.,Você pegou o Kit de Cirurgia.,Apanhaste o Kit de Cirugia.,Ai ridicat Kitul pentru Operații.,Получен медкомплект.,Покупио си хируршки комплет,Du plockade upp operationssatsen.,Ameliyat setini aldın.,Взято медичний кейс. +You picked up the map.,TXT_STRIFEMAP,,,,Sebral@[ao_cs] jsi mapu.,Du samlede kortet op.,Du hast die Karte genommen.,Πήρες το χάρτη.,Vi trovis la mapon.,Encuentras el mapa.,,Poimit kartan.,Vous avez pris la carte,,Felvetted a térképet.,Hai raccolto la Mappa.,マップ 取得。,지도를 획득했다.,Je hebt de kaart opgepakt.,Du plukket opp kartet.,Podniosł@[irreg_3_pl] mapę.,Você pegou o mapa.,Apanhaste o mapa.,Ai ridicat harta.,Получена карта.,Покупио си мапу.,Du plockade upp kartan.,Haritayı aldın.,Взято карту. +You picked up the ring.,TXT_BELDINSRING,,,,Sebral@[ao_cs] jsi prsten.,Du samlede ringen op.,Du hast den Ring genommen.,Πήρες το Δακτύλιο.,Vi havas la ringon.,Tienes el anillo.,,Poimit sormuksen.,Vous avez pris l'anneau.,,Felvetted a Gyűrűt.,Hai raccolto l'Anello.,指輪 取得。,반지를 획득했다.,Je hebt de ring opgepakt.,Du plukket opp ringen.,Podniosł@[irreg_3_pl] pierścień.,Você pegou o anel.,Apanhaste o anel.,Ai ridicat inelul.,Получено кольцо.,Покупио си прстен.,Du plockade upp ringen.,Yüzüğü aldın.,Взято каблучку. +You picked up the Offering Chalice.,TXT_OFFERINGCHALICE,,,,Sebral@[ao_cs] jsi obětní kalich.,Du samlede offerkalken op.,Du hast den Opferkelch genommen.,,Vi trovis oferdonan kalikon.,Encuentras un cáliz de ofrenda.,,Poimit uhrimaljan.,Vous avez pris le Calice d'obole.,,Felvetted az Áldozati Kelyhet.,Hai raccolto il Calice delle Offerte.,寄贈された聖杯 取得。,번제 성배를 훔쳤다.,Je hebt de Offerbeker opgepakt.,Du plukket opp offerbegeret.,Podniosł@[irreg_3_pl] Kielich Ofiarny.,Você pegou o Cálice de Oferenda.,Apanhaste o Cálice de Oferenda.,Ai ridicat Potirul pentru Ofrande.,Получена чаша для подношений.,Покупио си Жртвени пехар.,Du plockade upp offerkalken.,Adak Kadehini aldın.,Взято чашу для жертвоприношення. +You picked up the ear.,TXT_EAR,,,,Sebral@[ao_cs] jsi ucho.,Du samlede øret op.,Du hast das Ohr gernommen.,Πήρες το αυτί.,Vi havas la orelon.,Tienes la oreja.,,Poimit korvan.,Vous avez pris l'oreille.,,Felvetted a Fület.,Hai raccolto l'Orecchio.,耳 取得。,잘린 귀를 주웠다.,Je hebt het oor opgepakt.,Du plukket opp øret.,Podniosł@[irreg_3_pl] ucho.,Você pegou a orelha.,Apanhaste a orelha.,Ai ridicat urechea.,Получено ухо.,Покупио си уво.,Du plockade upp örat.,Kulağı aldın.,Взято вухо. +You picked up the broken power coupling.,TXT_BROKENCOUPLING,,,,Sebral@[ao_cs] jsi rozbitou spojku.,Du samlede den ødelagte strømkobling op.,Du hast den defekten Stromabnehmer genommen.,,Vi havas la rompitan energian kuplilon.,Tienes el acoplador de energía roto.,,Poimit rikkinäisen virtaliittimen.,Vous avez pris le coupleur énergétique cassé.,,Felvetted a hibás tápcsatlakozót.,Hai raccolto la Coppia Energetica Rotta.,壊れたパワーカップリング 取得。,망가진 동력선 장치를 획득했다.,Je hebt de kapotte stroomkoppeling opgepakt.,Du plukket opp den ødelagte kraftkoblingen.,Podniosł@[irreg_3_pl] zepsute obwody zasilające.,Você pegou o acoplador de energia quebrado.,Apanhaste o acoplador de energia partido.,Ai ridicat cuplajul defect de curent.,Получена повреждённая муфта.,Покупио си неисправну спојницу напајања.,Du plockade upp den trasiga kraftkopplingen.,Kırık güç bağlantısını aldın.,Взято зламану силову муфту. +You picked up the Shadow armor.,TXT_SHADOWARMOR,,,You picked up the Shadow armour.,Sebral@[ao_cs] jsi krycí brnění.,Du samlede skyggerustningen op.,Du hast die Schattenrüstung genommen.,,Vi trovis ombran armaĵon.,Encuentras una armadura de sombra.,,Poimit varjohaarniskan.,Vous avez pris l'armure de l'ombre.,,Felvetted az Árnyékpáncélt.,Hai raccolto l'Armatura Ombra.,シャドウアーマー 入手。,그림자 갑옷을 획득했다.,Je hebt het schaduwharnas opgepakt.,Du plukket opp Skygge-rustningen.,Podniosł@[irreg_3_pl] Cienisty Pancerz.,Você pegou a armadura das sombras.,Apanhaste a armadura das sombras.,Ai ridicat Armura Umbrei.,Получена теневая броня.,Покупио си оклоп сенки.,Du plockade upp skuggrustningen.,Gölge zırhını aldın.,Взято Тіньову броню. +You picked up the Environmental Suit.,TXT_ENVSUIT,,,,Sebral@[ao_cs] jsi ochranný oděv,Du samlede miljødragten op.,Du hast den Schutzanzug genommen.,,Vi trovis medi-ŝirman veston,Encuentras un traje NBQ.,,Poimit ympäristösuojapuvun.,Vous avez pris la combinaison hazmat.,,Felvetted a Védőruhát.,Hai raccolto la Tuta Ambientale.,耐環境スーツ 入手。,환경 방호복을 획득했다.,Je hebt het beschermende pak opgepakt.,Du plukket opp miljødrakten.,Podniosł@[irreg_3_pl] Skafander Ochronny.,Você pegou o Traje de Proteção.,Apanhaste o Fato Protetor.,Ai ridicat Costumul de Protecție.,Получен защитный костюм.,Покупио си заштитно одело.,Du plockade upp miljödräkten.,Çevresel Kıyafeti aldın.,Взято захисний костюм. +You picked up the Guard Uniform.,TXT_GUARDUNIFORM,,,,Sebral@[ao_cs] jsi hlídačovu uniformu.,Du samlede vagtuniformen op.,Du hast die Wächteruniform genommen.,,Vi havas la uniformon de gardisto.,Tienes el uniforme de un guardia.,,Poimit vartijan univormun.,Vous avez pris l'Uniforme du garde.,,Felvetted az Őr Egyenruhát.,Hai raccolto l'Uniforme da Guardia.,守衛の制服 入手。,경비 전투복을 획득했다.,Je hebt het wachtersuniform opgepakt.,Du plukket opp vaktuniformen.,Podniosł@[irreg_3_pl] Mundur Strażnika.,Você pegou o Uniforme de Guarda.,Apanhaste o Uniforme de Guarda.,Ai ridicat Uniforma de Paznic.,Получена униформа стражника.,Покупио си стражарску униформу,Du plockade upp vaktuniformen.,Muhafız Üniformasını aldın.,Взято уніформу охоронця. +You picked up the Officer's Uniform.,TXT_OFFICERSUNIFORM,,,,Sebral@[ao_cs] jsi důstojníkovu uniformu.,Du samlede officersuniformen op.,Du hast die Offiziersuniform genommen.,,Vi trovis oficiran uniformon.,Encuentras un uniforme de oficial.,,Poimit upseerin univormun.,Vous avez pris l'Uniforme de l'officier.,,Felvetted a Tiszti Egyenruhát.,Hai raccolto l'Uniforme da Ufficiale.,士官の制服 入手。,장교 전투복을 획득했다.,Je hebt het officiersuniform opgepakt.,Du plukket opp offisersuniformen.,Podniosł@[irreg_3_pl] Mundur Oficera.,Você pegou o Uniforme de Oficial.,Apanhaste o Uniforme de Oficial.,Ai ridicat Uniforma Ofițerului.,Получена униформа офицера.,Покупио си официрску униформу,Du plockade upp officersuniformen.,Subay üniformasını aldın.,Взято офіцерську уніформу. +You picked up the flame thrower parts.,TXT_FTHROWERPARTS,,,,Sebral@[ao_cs] jsi součásti plamenometu.,Du samlede flammekasterdele op.,Du hast die Flammenwerferteile genommen.,,Vi havas la partojn de flamĵetilo.,Tienes las partes de un lanzallamas.,,Poimit liekinheittimen osat.,Vous avez pris les pièces du lance-flames.,,Felvetted a lángszóró részeit.,Hai raccolto delle parti di Lanciafiamme.,火炎放射器の部品 入手。,화염방사기 부품을 획득했다.,Je hebt de vlammenwerperonderdelen opgepakt.,Du plukket opp delene til flammekasteren.,Podniosł@[irreg_3_pl] części miotacza ognia.,Você pegou as partes do lança-chamas.,Apanhaste as peças do lança-chamas.,Ai ridicat bucățile aruncătorului de flăcări.,Получены детали для огнемёта.,Покупио си делове за бацач пламена.,Du plockade upp delarna till flamkastaren.,Alev silahının parçalarını aldın.,Взято деталі для вогнемету. +You picked up the report.,TXT_REPORT,,,,Sebral@[ao_cs] jsi hlášení.,Du samlede rapporten op.,Du hast den Report genommen.,,Vi havas la raporton.,Tienes el reporte.,,Poimit raportin.,Vous avez pris le compte-rendu.,,Felvetted a jelentést.,Hai raccolto il rapporto.,報告書 取得。,보고서를 획득했다.,Je hebt het rapport opgepakt.,Du plukket opp rapporten.,Podniosł@[irreg_3_pl] raport.,Você pegou o relatório.,Apanhaste o relatório.,Ai ridicat raportul.,Получен отчёт.,Покупио си извештај.,Du plockade upp rapporten.,Raporu aldın.,Взято звіт. +You picked up the info.,TXT_INFO,,,,Sebral@[ao_cs] jsi informace.,Du samlede oplysningerne op.,Du hast die Info genommen.,Πήρες της πληροφορίες,Vi havas la informojn.,Tienes la información.,,Poimit tiedot.,Vous avez pris l'info.,,Felvetted az információt.,Hai raccolto delle Informazioni.,情報 取得。,정보를 획득했다.,Je hebt de informatie opgepakt.,Du plukket opp informasjonen.,Podniosł@[irreg_3_pl] informacje.,Você pegou a informação.,Apanhaste a informação.,Ai recepționat informația.,Получена сводка.,Покупио си инфо.,Du plockade upp informationen.,Bilgiyi aldın.,Отримано данні. +You picked up the Targeter.,TXT_TARGETER,,,,Sebral@[ao_cs] jsi zaměřovač.,Du samlede targeter op.,Du hast die Zielhilfe genommen.,Πήρες τον Στοχευτή.,Vi trovis celilon.,Encuentras una mira de arma.,,Poimit tähtäinlaitteen.,Vous avez pris le cibleur.,,Felvetted a Célzóberendezést.,Hai raccolto il Puntatore.,照準器 入手。,조준기를 획득했다.,Je hebt het Richter opgepakt.,Du plukket opp Targeteren.,Podniosł@[irreg_3_pl] Namierzacz.,Você pegou a Mira.,Apanhaste a Mira.,Ai ridicat Țintitorul.,Получен целеуказатель.,Покупио си нишанитеља.,Du plockade upp targeter.,Hedefleyiciyi aldın.,Взято цілевказівник. +You picked up the Communicator.,TXT_COMMUNICATOR,,,,Sebral@[ao_cs] jsi komunikátor.,Du samlede kommunikatoren op.,Du hast den Kommunikator genommen.,,Vi trovis interfonon.,Encuentras un intercomunicador.,,Poimit viestintälaitteen.,Vous avez pris le Communicateur,,Felvetted a Kommunikátort,Hai raccolto il Comunicatore.,コミュニケーター 取得。,연락장치를 획득했다.,Je hebt de Communicator opgepakt.,Du plukket opp kommunikatoren.,Podniosł@[irreg_3_pl] Komunikator.,Você pegou o Comunicador.,Apanhaste o Comunicador.,Ai ridicat Comunicatorul.,Получен передатчик.,Покупио си комуникатор.,Du plockade upp kommunikatorn.,İletişim cihazını aldın.,Взято комунікатор. +You picked up the coin.,TXT_COIN,,,,Sebral@[ao_cs] jsi minci.,Du samlede mønten op.,Du hast die Münze genommen.,Πήρες το κέρμα.,Vi trovis moneron.,Encuentras una moneda.,,Poimit kolikon.,Vous avez pris la pièce.,,Felvetted az érmét.,Hai raccolto la Moneta.,コイン 入手。,동전을 주웠다.,Je hebt de munt opgepakt.,Du plukket opp mynten.,Podniosł@[irreg_3_pl] monetę.,Você pegou a moeda.,Apanhaste a moeda.,Ai ridicat moneda.,Получена монета.,Покупио си новчић.,Du plockade upp myntet.,Parayı aldın.,Взято монету. +You picked up %d gold.,TXT_XGOLD,,,,Sebral@[ao_cs] jsi %d zlatých.,Du samlede %d guld op.,Du hast %d Gold genommen.,,Vi trovis %d da oro.,Encuentras %d monedas de oro.,,Poimit kultaa %d arvosta.,Vous avez pris %d pièces.,,Felvettél %d aranyat.,Hai raccolto %d pezzi d'oro.,%d ゴールド 入手。,골드 %d 개를 획득했다.,Je hebt %d goud opgepakt.,Du plukket opp %d gull.,Podniosł@[irreg_3_pl] %d monet.,Você pegou %d moedas de ouro.,Apanhaste %d moedas de ouro.,Ai ridicat %g bucăți de aur.,Получено %d золотых.,Покупио си %d златника.,Du plockade upp %d guld.,%d altın aldın.,Взято %d золотих. +You picked up the Teleporter Beacon.,TXT_BEACON,,,,Sebral@[ao_cs] jsi teleportační maják.,Du samlede Teleporter Beacon op.,Du hast das Teleportersignal genommen.,,Vi trovis teleportil-signalilon.,Encuentras una baliza de teletransporte.,,Poimit kaukosiirrinmajakan.,Vous avez pris la balise de téléporteur.,,Felvetted a Teleport jelzőt.,Hai raccolto il Radiofaro per Teletrasporto.,テレポータービーコン 取得。,텔레포터 비콘을 획득했다.,Je hebt de teleporterbaken opgepakt.,Du plukket opp Teleporter-signalet.,Podniosł@[irreg_3_pl] Nadajnik Teleportera.,Você pegou o Sinalizador de Teletransporte.,Apanhaste o Sinalizador de Teletransporte.,Ai ridicat Luminatorul pentru Teleportor.,Получен телепортационный маяк.,Покупио си одашиљач за телепортовање.,Du plockade upp teleporterfyren.,Işınlayıcı İşaretini aldın.,Взято пристрій телепортації. +You picked up the Degnin Ore.,TXT_DEGNINORE,,,,Sebral@[ao_cs] jsi degninskou rudu.,Du samlede Degnin Ore op.,Du hast das Degnin-Erz genommen.,,Vi trovis degninan minaĵon.,Encuentras mineral de Degnin.,,Poimit Degnin-malmia.,Vous avez pris le minerai de Degnin.,,Felvetted a Degnin Ércet.,Hai raccolto il Minerale Degnin.,デグニン鉱石 取得。,데그닌 광석을 획득했다.,Je hebt het Degnin-erts opgepakt.,Du plukket opp Degnin-malmen.,Podniosł@[irreg_3_pl] Rudę Degninu.,Você pegou o Minério Degnin.,Apanhaste o Minério Degnin.,Ai ridicat minereul de Degnin.,Получена дегнинская руда.,Покупио си Дегнинску руду.,Du plockade upp Degnin Malm.,Degnin Cevherini aldın.,Взято Дегінську руду. +You picked up the scanner.,TXT_SCANNER,,,,Sebral@[ao_cs] jsi skener.,Du samlede scanneren op.,Du hast den Scanner genommen.,Πήρες το σαρωτή.,Vi trovis skanilon.,Encuentras un escáner.,,Poimit skannerin.,Vous avez pris l'analyseur.,,Felvetted a szkennert.,Hai raccolto lo Scanner.,スキャナー 入手。,탐지기를 획득했다.,Je hebt de scanner opgepakt.,Du plukket opp skanneren.,Podniosł@[irreg_3_pl] skaner.,Você pegou o scanner.,Apanhaste o scanner.,Ai ridicat scannerul.,Получен сканер.,Покупио си скенер.,Du plockade upp skannern.,Tarayıcıyı aldın.,Отримано сканер. "The scanner won't work without a map! ",TXT_NEEDMAP,,,,Skener bez mapy fungovat nebude!,"Scanneren virker ikke uden et kort! ",Der Scanner kann ohne Karte nicht funktionieren.,Ο σαρωτής δέν θα δουλέψει χωρίς ένα χάρτη!,La skanilo ne funkcias sen mapo!,¡El escáner no funciona sin un mapa!,,Skanneri ei toimi ilman karttaa!,"L'analyseur ne marchera pas sans une carte! -",Térkép nélkül nem fog működni a szkenner!,Lo scanner non può funzionare senza una mappa!,マップが無ければ スキャナーは機能しない!,지도 없이는 탐지기를 사용할 수 없다!,De scanner werkt niet zonder een kaart!,"Skanneren virker ikke uten et kart! +",,Térkép nélkül nem fog működni a szkenner!,Lo scanner non può funzionare senza una mappa!,マップが無ければ スキャナーは機能しない!,지도 없이는 탐지기를 사용할 수 없다!,De scanner werkt niet zonder een kaart!,"Skanneren virker ikke uten et kart! ",Skaner nie zadziała bez mapy!,"O scanner não funciona sem um mapa! ",,Scannerul nu poate funcționa fără o hartă!,"Сканер не будет работать без карты! ",Скенер неће радити без мапе!,"Skannern fungerar inte utan en karta! ","Tarayıcı harita olmadan çalışmaz! ",Сканер не буде працювати без карти! -You picked up the Prison pass.,TXT_PRISONPASS,,,,Sebral@[ao_cs] jsi propustku do vězení.,Du samlede fængselspasset op.,Du hast den Gefängnispass genommen.,,Vi havas la malliberejan paspermeson.,Tienes el pase a la prisión.,,Poimit vankilan pääsyluvan.,Vous avez pris le passe de la prison.,Felvetted a Börtön belépőkártyát.,Hai raccolto il lasciapassare per la Prigione.,刑務所の許可証 取得。,감옥 통행증을 획득했다.,Je hebt de gevangenispas opgepakt.,Du plukket opp fengselspasset.,Podniosł@[irreg_3_pl] przepustkę do Więzienia.,Você pegou o passe da Prisão.,Apanhaste o passe da Prisão.,Ai ridicat Legitimația pentru Închisoare.,Получен пропуск в тюрьму.,Покупио си затворску пропусницу.,Du plockade upp fängelsepasset.,Hapishane kartını aldın.,Взято пропуск до тюрми. -You picked up the crossbow.,TXT_STRIFECROSSBOW,,,,Sebral@[ao_cs] jsi kuši.,Du samlede armbrøst op.,Du hast die Armbrust genommen.,Πήρες το τόξο,Vi trovis arbaleston.,Encuentras una ballesta.,,Poimit jousipyssyn.,Vous avez pris l'arbalète.,Felvetted a számszeríjat.,Hai raccolto la Balestra.,クロスボウ 入手。,석궁을 획득했다.,Je hebt de kruisboog opgepakt.,Du plukket opp armbrøsten.,Podniosł@[irreg_3_pl] kuszę.,Você pegou a besta.,Apanhaste uma besta.,Ai ridicat arbaleta.,Получен арбалет.,Покупио си самострел.,Du plockade upp armborstet.,Tatar yayını aldın.,Взято арбалет. -You picked up the assault gun.,TXT_ASSAULTGUN,,,,Sebral@[ao_cs] jsi pušku.,Du samlede pistolen op.,Du hast das Sturmgewehr genommen.,Πήρες το πολυβόλο.,Vi trovis sturmofusilon.,Encuentras un fusil de asalto.,,Poimit rynnäkkökiväärin.,Vous avez pris le fusil d'assaut.,Felvetted a gépfegyvert.,Hai raccolto il fucile d'assalto.,アサルトガン 入手。,돌격소총을 획득했다.,Je hebt het aanvalswapen opgepakt.,Du plukket opp stormgeværet.,Podniosł@[irreg_3_pl] karabin szturmowy.,Você pegou o fuzil de assalto.,Apanhaste a arma de assalto.,Ai ridicat pușca de asalt.,Получена штурмовая винтовка.,Покупио си аутоматску пушку.,Du plockade upp pistolen.,Saldırı silahını aldın.,Взято штурмову гвинтівку. -You picked up the mini missile launcher.,TXT_MMLAUNCHER,,,,Sebral@[ao_cs] jsi miniraketomet.,Du samlede mini-missilkasteren op.,Du hast den Miniraketenwerfer genommen.,Πήρες το μίνι πυραυλοβόλο.,Vi trovis misilet-pafilon.,Encuentras un minilanzamisiles.,,Poimit miniohjuslaukaisimen.,Vous avez pris le lance mini-missile.,Felvetted a minirakétavetőt.,Hai raccolto il Mini-Lanciamissili.,ミニミサイル ランチャー入手。,미니 미사일 런쳐를 획득했다.,Je hebt de mini-raketwerper opgepakt.,Du plukket opp mini-missilkasteren.,Podniosł@[irreg_3_pl] wyrzutnię minipocisków.,Você pegou o mini lança-mísseis.,Apanhaste o mini lança-mísseis,Ai ridicat mini lansatorul de rachete.,Получена мини-ракетница.,Покупио си мини ручни бацач.,Du plockade upp mini-missilkastaren.,Mini füze fırlatıcısını aldın.,Взято міні-ракетомет. -You picked up the flame thrower.,TXT_FLAMER,,,,Sebral@[ao_cs] jsi plamenomet.,Du samlede flammekasteren op.,Du hast den Flammenwerfer genommen.,Πήρες το φλογοβόλο.,Vi trovis flamĵetilon.,Encuentras un lanzallamas.,,Poimit liekinheittimen.,Vous avez pris le lance-flames.,Felvetted a lángszórót.,Hai raccolto il Lanciafiamme.,火炎放射器 入手。,완성된 화염방사기를 얻었다.,Je hebt de vlammenwerper opgepakt.,Du plukket opp flammekasteren.,Podniosł@[irreg_3_pl] miotacz ognia.,Você pegou o lança-chamas.,Apanhaste o lança-chamas.,Ai ridicat aruncătorul de flăcări.,Получен огнемёт.,Покупио си бацач пламена.,Du plockade upp flamkastaren.,Alev silahını aldın.,Взято вогнемет. -You picked up the mauler.,TXT_MAULER,,,,Sebral@[ao_cs] jsi trhač.,Du tog mauleren op.,Du hast den Vernichter genommen.,,Vi trovis polvigilon.,Encuentras un triturador.,,Poimit moukarin.,Vous avez pris le Broyeur.,Felvetted a marcangolót.,Hai raccolto il Pestatore.,マウラー 入手。,마울러를 획득했다.,Je hebt de toetakelaar opgepakt.,Du plukket opp mauleren.,Podniosł@[irreg_3_pl] miażdżyciel.,Você pegou o desintegrador.,Apanhaste o desintegrador.,Ai ridicat sfâșietorul.,Получен истязатель.,Покупио си маулер.,Du plockade upp mauler.,Parçalayıcıyı aldın.,Взято розсіювач. -You picked up the Grenade launcher.,TXT_GLAUNCHER,,,,Sebral@[ao_cs] jsi granátomet.,Du samlede granatkasteren op.,Du hast den Granatwerfer genommen.,Πήρες το εκτοξευτη χειροβομβίδων.,Vi trovis grenadĵetilon.,Encuentras un lanzagranadas.,,Poimit kranaatinheittimen.,Vous avez pris le lance-grenades,Felvetted a gránátvetőt.,Hai raccolto il Lanciagranate.,グレネードランチャー 入手。,유탄발사기를 획득했다.,Je hebt de granaatwerper opgepakt.,Du plukket opp granatkasteren.,Podniosł@[irreg_3_pl] wyrzutnię granatów.,Você pegou o lança-granadas.,Apanhaste o lança-granadas.,Ai ridicat Lansatorul de rachete.,Получен гранатомёт.,Покупио си бацач граната.,Du plockade upp granatkastaren.,El bombası fırlatıcısını aldın.,Взято гранатомет. -You picked up the SIGIL.,TXT_SIGIL,,,,Sebral@[ao_cs] jsi Pečeť.,Du samlede SIGIL op.,Du hast das SIGIL genommen.,,Vi trovis la SIGELON.,Encuentras el EMBLEMA.,,Poimit SINETIN.,Vous avez pris le SIGIL.,Felvetted a Pecsétet.,Hai raccolto il SIGILLO.,シジル 取得。,시질은 이제 당신의 것이다.,Je hebt de SIGIL opgepakt.,Du plukket opp SIGIL.,Podniosł@[irreg_3_pl] PIECZĘĆ.,Você pegou o SIGILO.,Apanhaste o SIGILO,Ai ridicat SIGILIUL.,Получена ПЕЧАТЬ.,Покупио си СИГИЛ.,Du plockade upp Sigillet.,SİGİL'i aldın.,Отримано СІГІЛ. -You picked up the Base Key.,TXT_BASEKEY,,,,Sebral@[ao_cs] jsi klíč od základny.,Du samlede Base nøglen op.,Du hast den Basisschlüssel genommen.,,Vi havas la ŝlosilon de la bazo.,Tienes la llave de la base.,,Poimit tukikohdan avaimen.,Vous avez pris la clé de la Base.,Felvetted a Bázis kulcsát.,Hai raccolto la chiave della Base.,基地のキー 取得。,기지 키를 획득했다.,Je hebt de basissleutel opgepakt.,Du plukket opp basenøkkelen.,Podniosł@[irreg_3_pl] Klucz do Bazy.,Você pegou a Chave da Base.,Apanhaste a Chave da Base.,Ai ridicat Cheia Bazei.,Получен ключ от базы.,Покупио си кључ базе.,Du plockade upp basnyckeln.,Üs Anahtarını aldın.,Взято ключ від бази. -You picked up the Govs Key.,TXT_GOVSKEY,,,,Sebral@[ao_cs] jsi klíč ke guvernérovi.,Du samlede guvernørens nøglen op.,Du hast den Gouverneursschlüssel genommen.,,Vi havas la ŝlosilon de la registo.,Tienes la llave del Gobernador.,,Poimit kuvernöörin avaimen.,Vous avez pris la clé du Gouverneur.,Felvetted a Kormányzó parcellájának kulcsát.,Hai raccolto la chiave del Governatore.,政府のキー 取得。,총독의 키를 획득했다.,Je hebt de gouverneursleutel opgepakt.,Du plukket opp regjeringsnøkkelen.,Podniosł@[irreg_3_pl] Klucz Gubernatora.,Você pegou a Chave do Governador.,Apanhaste a Chave do Governador.,Ai ridicat Cheia Guvernatorului.,Получен ключ губернатора.,Покупио си клуч гувернанте.,Du plockade upp Govs nyckeln.,Hükümet Anahtarını aldın.,Взято ключ губернатора. -You picked up the Passcard.,TXT_PASSCARD,,,,Sebral@[ao_cs] jsi průkazku.,Du samlede Adgangskort op.,Du hast die Zugangskarte genommen.,,Vi havas la ŝlosilon de la elektra centralo.,Tienes la llave de la central eléctrica.,,Poimit avainkortin.,Vous avez pris le passe.,Felvetted a Belépőkártyát.,Hai raccolto la Tessera Lasciapassare.,パスカード 取得。,통행 카드를 획득했다.,Je hebt de doorgangskaart opgepakt.,Du plukket opp adgangskortet.,Podniosł@[irreg_3_pl] Kartę Dostępu.,Você pegou o Cartão de Acesso.,Apanhaste o Cartão de Acesso.,Ai ridicat Legitimația.,Получен пропуск.,Покупио си пасош.,Du plockade upp passerkortet.,Erişim kartıni aldın.,Взято карту доступу. -You picked up the ID Badge.,TXT_IDBADGE,,,,Sebral@[ao_cs] jsi identifikační odznak.,Du samlede ID Badge op.,Du hast die Identitätskarte genommen.,,Vi havas la insignon de la malliberejo.,Tienes la insignia de la prisión.,,Poimit henkilötunnisteen.,Vous avez pris le Badge d'identification.,Felvetted az Azonosítójelvényt.,Hai raccolto il Distintivo.,IDバッジ 取得。,신분 휘장을 획득했다.,Je hebt de ID-badge opgepakt.,Du plukket opp ID-skiltet.,Podniosł@[irreg_3_pl] Odznakę Identyfikacyjną.,Você pegou o Crachá de Identificação.,Apanhaste o Crachá de Identificação,Ai ridicat Ecusonul de Identificare.,Получена личная карта.,Покупио си личну карту.,Du plockade upp ID-brickan.,Kimlik Rozetini aldın.,Взято бейджик. -You picked up the Prison Key.,TXT_PRISONKEY,,,,Sebral@[ao_cs] jsi klič k vězení.,Du samlede nøglen til fængslet op.,Du hast den Gefängnisschlüssel genommen.,,Vi havas la ŝlosilon de la malliberejo.,Tienes la llave de la prisión.,,Poimit vankilan avaimen.,Vous avez pris la clé de la Prison.,Felvetted a Börtönkulcsot.,Hai raccolto la chiave della Prigione.,刑務所のキー 取得。,감옥 키를 획득했다.,Je hebt de gevangenissleutel opgepakt.,Du plukket opp Fengselsnøkkelen.,Podniosł@[irreg_3_pl] Klucz do Więzienia.,Você pegou a Chave da Prisão.,Apanhaste a Chave da Prisão.,Ai ridicat Cheia Închisorii.,Получен ключ от тюрьмы.,Покупио си затворски кључ,Du tog upp fängelsenyckeln.,Hapishane Anahtarını aldın.,Взято ключ від тюрми. -You picked up the Severed Hand.,TXT_SEVEREDHAND,,,,Sebral@[ao_cs] jsi useknutou ruku.,Du samlede den afhuggede hånd op.,Du hast die abgetrennte Hand genommen.,,Vi havas amputitan manon.,Tienes una mano amputada.,,Poimit katkenneen käden.,Vous avez pris la main coupée.,Felvetted a Levágott kezet.,Hai raccolto la Mano Mozzata.,切り取った手 取得。,잘린 손목을 주웠다.,Je hebt de Gescheurde Hand opgepakt.,Du plukket opp den avkuttede hånden.,Podniosł@[irreg_3_pl] Odciętą Rękę.,Você pegou a Mão Decepada.,Apanhaste a Mão Desmenbrada.,Ai ridicat Mâna Retezată.,Получена отрезанная рука.,Покупио си шаку,Du plockade upp den avhuggna handen.,Kesik El'i aldın.,Взято відрізану руку. -You picked up the Power1 Key.,TXT_POWER1KEY,,,,Sebral@[ao_cs] jsi klíč k elektrárně 1.,Du samlede Power1-nøglen op.,Du hast den Kraftwerksschlüssel 1 genommen,,Vi havas la unuan centralan identigilon.,Tienes una identificación nivel uno de la central.,,Poimit voimalan 1-avaimen.,Vous avez pris la clé Power1.,Felvetted az 1-es Áram kulcsot.,Hai raccolto la chiave della Centrale n.1,パワー1キー 取得。,발전소 1호 키를 획득했다.,Je hebt de 1e Machtsleutel opgepakt.,Du plukket opp Power1-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Elektrowni 1.,Você pegou a Chave da Usina 1.,Apanhaste a Chave Energética 1,Ai ridicat Cheia Putere1.,Получен ключ электростанции №1.,Покупио си први кључ од електране.,Du plockade upp kraftnyckeln 1.,Güç1 Anahtarını aldın.,Взято ключ від електростанції 1. -You picked up the Power2 Key.,TXT_POWER2KEY,,,,Sebral@[ao_cs] jsi klíč k elektrárně 2.,Du samlede Power2-nøglen op.,Du hast den Kraftwerksschlüssel 2 genommen,,Vi havas la duan centralan identigilon.,Tienes una identificación nivel dos de la central.,,Poimit voimalan 2-avaimen.,Vous avez pris la clé Power2.,Felvetted az 2-es Áram kulcsot.,Hai raccolto la chiave della Centrale n.2,パワー2キー 取得。,발전소 2호 키를 획득했다.,Je hebt de 2e Machtsleutel opgepakt.,Du plukket opp Power2-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Elektrowni 2.,Você pegou a Chave da Usina 2.,Apanhaste a Chave Energética 2,Ai ridicat Cheia Putere2.,Получен ключ электростанции №2.,Покупио си други кључ од електране.,Du plockade upp kraftnyckeln 2.,Güç2 Anahtarını aldın.,Взято ключ від електростанції 2. -You picked up the Power3 Key.,TXT_POWER3KEY,,,,Sebral@[ao_cs] jsi klíč k elektrárně 3.,Du samlede Power3-nøglen op.,Du hast den Kraftwerksschlüssel 3 genommen,,Vi havas la trian centralan identigilon.,Tienes una identificación nivel tres de la central.,,Poimit voimalan 3-avaimen.,Vous avez pris la clé Power3.,Felvetted az 3-as Áram kulcsot.,Hai raccolto la chiave della Centrale n.3,パワー3キー 取得。,발전소 3호 키를 획득했다.,Je hebt de 3e Machtsleutel opgepakt.,Du plukket opp Power3-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Elektrowni 3.,Você pegou a Chave da Usina 3.,Apanhaste a Chave Energética 3,Ai ridicat Cheia Putere3.,Получен ключ электростанции №3.,Покупио си трећи кључ од електране.,Du plockade upp kraftnyckeln 3.,Güç3 Anahtarını aldın.,Взято ключ від електростанції 3. -You picked up the Gold Key.,TXT_GOLDKEY,,,,Sebral@[ao_cs] jsi zlatý klíč.,Du samlede den guldnøglen op.,Du hast den Goldschlüssel genommen.,,Vi havas oran ŝlosilon.,Tienes una llave dorada.,,Poimit kulta-avaimen.,Vous avez pris la clé d'or.,Felvetted az Aranykulcsot.,Hai raccolto la chiave dorata,ゴールドキー 取得。,황금 키를 획득했다.,Je hebt de gouden sleutel opgepakt.,Du plukket opp Gullnøkkelen.,Podniosł@[irreg_3_pl] Złoty Klucz.,Você pegou a Chave de Ouro.,Apanhaste a Chave de Ouro,Ai ridicat Cheia de Aur.,Получен золотой ключ.,Покупио си златни кључ.,Du plockade upp guldnyckeln.,Altın Anahtarı aldın.,Взято золотий ключ. -You picked up the ID Card.,TXT_IDCARD,,,,Sebral@[ao_cs] jsi ID kartu.,Du samlede ID-kortet op.,Du hast den Ausweis genommen.,,Vi havas identigilon de la kloakoj.,Tienes una identificación de las clocacas.,,Poimit henkilökortin.,Vous avez pris la Carte d'identité.,Felvetted az Igazolványt.,Hai raccolto la Tessera di Identificazione.,IDカード 取得。,신분증을 획득했다.,Je hebt de ID-kaart opgepakt.,Du plukket opp ID-kortet.,Podniosł@[irreg_3_pl] Kartę Identyfikacyjną.,Você pegou o Cartão de Identifiçacão.,Apanhaste o Cartão de Identificação,Ai ridicat Cardul de Identitate.,Получено удостоверение.,Покупио си идентификациону картицу.,Du plockade upp ID-kortet.,Kimlik Kartını aldın.,Взято ідентифікаційну карту. -You picked up the Silver Key.,TXT_SILVERKEY,,,,Sebral@[ao_cs] jsi stříbrný klíč.,Du tog sølvnøglen op.,Du hast den Silberschlüssel genommen.,,Vi havas arĝentan ŝlosilon.,Tienes una llave plateada.,,Poimit hopea-avaimen.,Vous avez pris la clé d'argent.,Felvetted az Ezüstkulcsot.,Hai raccolto la chiave argentata,シルバーキー 取得。,은 키를 획득했다.,Je hebt de zilveren sleutel opgepakt.,Du plukket opp sølvnøkkelen.,Podniosł@[irreg_3_pl] Srebrny Klucz.,Você pegou a Chave de Prata.,Apanhaste a Chave de Prata,Ai ridicat Cheia de Argint.,Получен серебряный ключ.,Покупио си сребрни кључ.,Du plockade upp silvernyckeln.,Gümüş Anahtarı aldınız.,Взято срібний ключ -You picked up the Oracle Key.,TXT_ORACLEKEY,,,,Sebral@[ao_cs] jsi věštcův klíč.,Du tog Oracle-nøglen op.,Du hast den Orakelschlüssel genommen.,,Vi havas ŝlosilon de la Orakolo,Tienes una llave del Oráculo.,,Poimit Oraakkelin avaimen.,Vous avez pris la clé Oraclé.,Felvetted az Orákulum kulcsát.,Hai raccolto la chiave dell'Oracolo.,オラクルキー 取得。,오라클 키를 획득했다.,Je hebt de Orakelsleutel opgepakt.,Du plukket opp Oracle-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Wyroczni.,Você pegou a Chave do Oráculo.,Apanhaste a Chave do Oráculo.,Ai ridicat Cheia Oracol.,Получен ключ Оракула.,Покупио си кључ пророка,Du plockade upp Orakel-nyckeln.,Kahin Anahtarını aldın.,Взято ключ Оракула. -You picked up the Military ID.,TXT_MILITARYID,,,,Sebral@[ao_cs] jsi vojenské ID.,Du samlede militær-ID op.,Du hast den Militärausweis genommen.,,Vi havas militan identigilon.,Tienes una identificación militar.,,Poimit sotilastunnuksen.,Vous avez pris l'ID Militaire.,Felvetted a Katonai igazolványt.,Hai raccolto l'Identificativo Militare.,ミリタリーID 取得。,군용 아이디를 획득했다.,Je hebt de militaire ID opgepakt.,Du plukket opp den militære ID-en.,Podniosł@[irreg_3_pl] Wojskowy Identyfikator.,Você pegou a Identificação Militar.,Apanhaste a Identificação Militar.,Ai ridicat Legitimația Militară.,Получено военное удостоверение.,Покупио си војну идентификацију,Du plockade upp det militära ID-kortet.,Askeri Kimliği aldın.,Взято військову ID карту. -You picked up the Order Key.,TXT_ORDERKEY,,,,Sebral@[ao_cs] jsi klíč Řádu.,Du samlede Ordensnøglen op.,Du hast den Ordensschlüssel genommen.,,Vi havas la ŝlosilon de La Ordeno.,Tienes la llave de La Orden.,,Poimit Veljeskunnan avaimen.,Vous avez pris la clé de l'Ordre.,Felvetted a Rend kulcsát.,Hai raccolto la chiave dell'Ordine.,オーダーキー 取得。,오더의 키를 획득했다.,Je hebt de Ordesleutel opgepakt.,Du plukket opp Bestillingsnøkkelen.,Podniosł@[irreg_3_pl] Klucz Zakonu.,Você pegou a Chave da Ordem.,Apanhaste a Chave da Ordem.,Ai ridicat Cheia Ordinului.,Получен ключ Ордена.,Покупио си кључ одреда,Du plockade ordernyckeln.,Emir Anahtarını aldın.,Взято ключ Ордену. -You picked up the Warehouse Key.,TXT_WAREHOUSEKEY,,,,Sebral@[ao_cs] jsi klíč ke skladu.,Du samlede lagernøglen op.,Du hast den Lagerhausschlüssel genommen,,Vi havas la ŝlosilon de la magazeno.,Tienes la llave del almacén.,,Poimit varaston avaimen.,Vous avez pris la clé de l'entrepôt.,Felvetted a Raktár kulcsát.,Hai raccolto la chiave del Magazzino.,倉庫のキー 取得。,창고 키를 획득했다.,Je hebt de pakhuissleutel opgepakt.,Du plukket opp Lagernøkkelen.,Podniosł@[irreg_3_pl] Klucz do Magazynu.,Você pegou a Chave do Armazém.,Apanhaste a Chave do Armazém,Ai ridicat Cheia Depozitului.,Получен ключ от склада.,Покупио си кључ складишта,Du plockade lagernyckeln.,Depo Anahtarını aldın.,Взято ключ від складу. -You picked up the Brass Key.,TXT_BRASSKEY,,,,Sebral@[ao_cs] jsi mosazný klíč.,Du samlede messingnøglen op.,Du hast den Messingschlüssel genommen.,,Vi havas la latunan ŝlosilon.,Tienes la llave de latón.,,Poimit messinkiavaimen.,Vous avez pris la clé de bronze.,Felvetted a Rézkulcsot.,Hai raccolto la chiave d'Ottone.,ブラスキー 取得。,황동 키를 획득했다.,Je hebt de messing sleutel opgepakt.,Du plukket opp messingnøkkelen.,Podniosł@[irreg_3_pl] Mosiężny Klucz.,Você pegou a Chave de Latão.,Apanhaste a Chave de Latão,Ai ridicat Cheia din Alamă.,Получен латунный ключ.,Покупио си кључ месинга,Du plockade mässingsnyckeln.,Pirinç Anahtarı aldın.,Взято латунний ключ. -You picked up the Red Crystal Key.,TXT_REDCRYSTAL,,,,Sebral@[ao_cs] jsi červený krystalový klíč.,Du samlede den røde krystalnøgle op.,Du hast den roten Kristallschlüssel genommen.,,Vi trovis la ruĝkristalan ŝlosilon.,Encuentras la llave de cristal rojo.,,Poimit punaisen kristalliavaimen.,Vous avez pris la clé cristal rouge.,Felvetted a Vörös Kristály Kulcsot.,Hai raccolto la chiave del Cristallo Rosso.,赤水晶のキー 取得。,적색 크리스탈 키를 획득했다.,Je hebt de rode kristallen sleutel opgepakt.,Du plukket opp den røde krystallnøkkelen.,Podniosł@[irreg_3_pl] Czerwony Kryształowy Klucz.,Você pegou a Chave de Cristal Vermelho.,Apanhaste a Chave de Cristal Vermelho.,Ai ridicat Cheia din Cristal Roșu.,Получен красный ключ-кристалл.,Покупио си кључ од црвеног кристала,Du plockade upp den röda kristallnyckeln.,Kırmızı Kristal Anahtarı aldın.,Взято червоний кристальний ключ. -You picked up the Blue Crystal Key.,TXT_BLUECRYSTAL,,,,Sebral@[ao_cs] jsi modrý krystalový klíč.,Du samlede den blå krystalnøgle op.,Du hast den blauen Kristallschlüssel genommen.,,Vi trovis la blukristalan ŝlosilon,Encuentras la llave de cristal azul.,,Poimit sinisen kristalliavaimen.,Vous avez pris la clé cristal bleu.,Felvetted a Kék Kristály Kulcsot.,Hai raccolto la chiave del Cristallo Blu.,青水晶のキー 取得。,청색 크리스탈 키를 획득했다.,Je hebt de blauwe kristallen sleutel opgepakt.,Du plukket opp den blå krystallnøkkelen.,Podniosł@[irreg_3_pl] Niebieski Kryształowy Klucz.,Você pegou a Chave de Cristal Azul.,Apanhaste a Chave de Cristal Azul.,Ai ridicat Cheia din Cristal Albastru.,Получен синий ключ-кристалл.,Покупио си кључ од плавог кристала,Du plockade upp den blå kristallnyckeln.,Mavi Kristal Anahtarı aldın.,Взято синій кристальний ключ. -You picked up the Chapel Key.,TXT_CHAPELKEY,,,,Sebral@[ao_cs] jsi klíč ke kapli.,Du samlede Kapel-nøglen op.,Du hast den Kapellenschlüssel genommen.,,Vi trovis la ŝlosilon de la kapelo.,Encuentras la llave de la capilla.,,Poimit kappelin avaimen.,Vous avez pris la clé de la chapelle.,Felvetted a Kápolna Kulcsát.,Hai raccolto la chiave della Cappella,チャペルキー 取得。,예배당 키를 획득했다.,Je hebt de kapelsleutel opgepakt.,Du plukket opp kapellnøkkelen.,Podniosł@[irreg_3_pl] Klucz do Kaplicy.,Você pegou a Chave da Capela.,Apanhaste a Chave da Capela.,Ai ridicat Cheia Capelei.,Получен ключ от часовни.,Покупио си кључ капеле,Du plockade upp kapellnyckeln.,Şapel Anahtarını aldın.,Взято ключ від каплиці. -You picked up the Catacomb Key.,TXT_CATACOMBKEY,,,,Sebral@[ao_cs] jsi klíč do katakomb.,Du samlede Katakombe-nøglen op.,Du hast den Katakombenschlüssel genommen.,,Vi havas la ŝlosilon de la katakombo.,Tienes la llave de las catacumbas.,,Poimit katakombin avaimen.,Vous avez pris la clé des catacombes.,Felvetted a Katakombák kulcsát.,Hai raccolto la chiave delle Catacombe.,カタコンベキー 取得。,고대 묘지 키를 획득했다.,Je hebt de catacombesleutel opgepakt.,Du plukket opp Katakomb-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Katakumb.,Você pegou a Chave da Catacumba.,Apanhaste a Chave da Catacumba.,Ai ridicat Cheia Catacombei.,Получен ключ от катакомб.,Покупио си кључ катакомбе,Du plockade upp katakomberna nyckeln.,Yeraltı Mezarı Anahtarını aldın.,Взято ключ від катакомб. -You picked up the Security Key.,TXT_SECURITYKEY,,,,Sebral@[ao_cs] jsi klíč ochranky.,Du samlede sikkerhedsnøglen op.,Du hast den Sicherheitsschlüssel genommen.,,Vi havas la sekureco-ŝlosilon.,Tienes la llave de seguridad.,,Poimit turvamiesavaimen.,Vous avez pris la clé de la sécurité.,Felvetted a Biztonsági Kulcsot.,Hai raccolto la chiave della Sicurezza.,警備のキー 取得。,보안 키를 획득했다.,Je hebt de beveiligingssleutel opgepakt.,Du plukket opp Sikkerhetsnøkkelen.,Podniosł@[irreg_3_pl] Klucz Ochrony.,Você pegou a Chave de Seguranca.,Apanhaste a Chave de Segurança,Ai ridicat Cheia Securității.,Получен ключ охраны.,Покупио си кључ обезбеђења,Du plockade upp säkerhetsnyckeln.,Güvenlik Anahtarını aldın.,Взято ключ охорони. -You picked up the Core Key.,TXT_COREKEY,,,,Sebral@[ao_cs] jsi klíč k jádru.,Du samlede reaktornøglen op.,Du hast den Reaktorschlüssel genommen.,,Vi trovis la ŝlosilon de la kernejo.,Encuentras la llave del núcleo.,,Poimit ytimen avaimen.,Vous avez pris la clé du réacteur.,Felvetted a Mag kulcsát.,Hai raccolto la chiave del Nucleo.,コアキー 取得。,중심부 키를 획득했다.,Je hebt de kernsleutel opgepakt.,Du plukket opp Kjernenøkkelen.,Podniosł@[irreg_3_pl] Klucz do Rdzenia.,Você pegou a Chave do Núcleo.,Apanhaste a Chave do Núcleo.,Ai ridicat Cheia Nucleului.,Получен ключ от реактора.,Покупио си кључ језгра,Du plockade upp kärnnyckeln.,Çekirdek Anahtarını aldın.,Взято ключ від реактора. -You picked up the Mauler Key.,TXT_MAULERKEY,,,,Sebral@[ao_cs] jsi klíč k trhačům.,Du samlede Mauler-nøglen op.,Du hast den Vernichterschlüssel genommen.,,Vi havas la ŝlosilon de la polvigiloj.,Tienes la llave de los trituradores.,,Poimit moukarin avaimen.,Vous avez pris la clé du Broyeur.,Felvetted a Marcangoló kulcsot.,Hai raccolto la chiave del Pestatore.,マウラーキー 取得。,마울러 키를 획득했다.,Je hebt de toetakelaarssleutel opgepakt.,Du plukket opp Mauler-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Magazynu Miażdżycieli.,Você pegou a Chave do Mauler.,Apanhaste a Chave do Mauler.,Ai ridicat Cheia Sfâșietorului.,Получен ключ истязателя.,Покупио си кључ Маулера.,Du plockade upp Mauler-nyckeln.,Mauler Anahtarını aldın.,Взято ключ розсіювача. -You picked up the Factory Key.,TXT_FACTORYKEY,,,,Sebral@[ao_cs] jsi klíč do továrny.,Du samlede fabriksnøglen op.,Du hast den Fabrikschlüssel genommen.,,Vi trovis la ŝlosilon de la fabriko.,Encuentras la llave de la fábrica.,,Poimit tehtaan avaimen.,Vous avez pris la clé de l'usine.,Felvetted a Gyár kulcsát.,Hai raccolto la chiave della Fabbrica.,工場のキー 取得。,공장 키를 획득했다.,Je hebt de fabriekssleutel opgepakt.,Du plukket opp fabrikknøkkelen.,Podniosł@[irreg_3_pl] Klucz do Fabryki.,Você pegou a Chave da Fábrica.,Apanhaste a Chave da Fábrica.,Ai ridicat Cheia Fabricii.,Получен ключ от фабрики.,Покупио си кључ фабрике,Du plockade upp fabriksnyckeln.,Fabrika Anahtarını aldın.,Взято ключ від фабрики. -You picked up the Mine Key.,TXT_MINEKEY,,,,Sebral@[ao_cs] jsi klíč do dolů.,Du samlede minenøglen op.,Du hast den Minenschlüssel genommen.,,Vi trovis la ŝlosilon de la minejo.,Encuentras la llave de la mina.,,Poimit kaivoksen avaimen.,Vous avez pris la clé de la mine.,Felvetted a Bánya kulcsát.,Hai raccolto la chiave della Miniera.,鉱山のキー 取得。,탄광 키를 획득했다.,Je hebt de mijnsleutel opgepakt.,Du plukket opp Gruvenøkkelen.,Podniosł@[irreg_3_pl] Klucz do Kopalni.,Você pegou a Chave da Mina.,Apanhaste a Chave da Mina.,Ai ridicat Cheia Minei.,Получен ключ от шахт.,Покупио си кључ рудника,Du plockade upp gruvnyckeln.,Maden Anahtarını aldın.,Взято ключ від шахт. -You picked up the New Key5.,TXT_NEWKEY5,,,,Sebral@[ao_cs] jsi nový klíč 5.,Du samlede den nye nøgle5 op.,Du hast den neuen Schlüssel 5 genommen.,,Vi havas la novan ŝlosilon kvin.,Tienes la llave nueva cinco.,,Poimit uuden 5-avaimen.,Vous avez pris la nouvelle clé 5.,Felvetted az 5. kulcsot.,Hai raccolto la Nuova Chiave n.5,ニューキー5 取得。,새로운 키5를 획득했다.,Je hebt de nieuwe sleutel 5 opgepakt.,Du plukket opp den nye nøkkelen5.,Podniosł@[irreg_3_pl] Nowy Klucz5,Você pegou a Chave Nova 5.,Apanhaste a Chave Nova 5.,Ai ridicat Cheia Nouă5.,Получен новый ключ №5.,Покупио си нови кључ5,Du hämtade den nya nyckeln5.,Yeni Anahtar5'i aldın.,Взято новий ключ 5. -You picked up the Oracle Pass.,TXT_ORACLEPASS,,,,Sebral@[ao_cs] jsi věštcovu propustku.,Du samlede orakelpas op.,Du hast den Orakelpass genommen.,,Vi havas la paspermeson de la Orakolo.,Tienes el pase del Oráculo.,,Poimit Oraakkelin passin.,Vous avez pris le passe de l'Oracle.,Felvetted az Orákulum Belépőkártyáját.,Hai raccolto il Lasciapassare dell'Oracolo.,オラクルパス 取得。,오라클의 통행증을 획득했다.,Je hebt de Orakelkaart opgepakt.,Du plukket opp Orakelpasset.,Podniosł@[irreg_3_pl] Przepustkę Wyroczni.,Você pegou o Passe do Oráculo.,Apanhaste o Passe do Oráculo.,Ai ridicat Legitimația Oracol.,Получен пропуск Оракула.,Покупио си пророкову пропусницу,Du plockade upp orakelpasset.,Kahin Geçiş Kartını aldın.,Взято пропуск Оракула. -You picked up the HE-Grenade Rounds.,TXT_HEGRENADES,,,,Sebral@[ao_cs] jsi výbušné granáty.,Du samlede HE-granaterne op.,Du hast die HE-Granaten genommen.,,Vi trovis eksplodeg-povajn grenadojn.,Encuentras granadas de conmoción.,,Poimit räjähdekranaattiammuksia.,Vous avez pris les Grenades Explosives.,Felvetted a robbanó gránátot.,Hai raccolto delle granate ad Alto Potenziale,HEグレネード弾 入手。,고폭 유탄을 획득했다.,Je hebt de HE-granaten opgepakt.,Du plukket opp HE-granaten.,Podniosł@[irreg_3_pl] Wiązkę Granatów.,Você pegou as Granadas Explosivas.,Apanhaste as Granadas Explosivas.,Ai ridicat Grenadele Explozive.,Получена связка гранат.,Покупио си ХЕ-Граната чауре,Du plockade upp HE-granaterna.,HE-Bombası Mermilerini aldın.,Взято в'язку гранат. -You picked up the Phosphorus-Grenade Rounds.,TXT_PHGRENADES,,,,Sebral@[ao_cs] jsi fosforové granáty.,Du samlede fosforgranaterne op.,Du hasr die Phosphorgranaten genommen.,,Vi trovis fosforajn grenadojn.,Encuentras granadas de fósforo.,,Poimit fosforikranaattiammuksia.,Vous avez pris les Grenades Phosphoriques.,Felvetted a foszfor-gránátokat.,Hai raccolto delle Granate al Fosforo.,白リングレネード弾 入手。,소이 유탄을 획득했다.,Je hebt de fosforgranaten opgepakt.,Du plukket opp fosforgranaten.,Podniosł@[irreg_3_pl] Wiązkę Fosforowych Granatów.,Você pegou as Granadas de Fósforo.,Apanhaste as Granadas de Fósforo.,Ai ridicat Grenadele cu Fosfor.,Получена связка фосфорных гранат.,Покупио си шаржер фосфорних граната.,Du plockade upp fosforgranater.,Fosforlu El Bombası Mermilerini aldın.,Взято в'язку фосфорних гранат. -You picked up the clip of bullets.,TXT_CLIPOFBULLETS,,,,Sebral@[ao_cs] jsi zásobník s náboji.,Du samlede patroner op.,Du hast die Gewehrmunition genommen.,Πήρες το κουτάκι με σφαίρες.,Vi trovis magazenon.,Encuentras un cargador.,,Poimit luotilippaan.,Vous avez pris le Chargeur.,Felvettél egy tár lőszert.,Hai raccolto un caricatore di proiettili.,銃弾倉 入手。,돌격소총 탄창을 획득했다.,Je hebt de patroon met kogels opgepakt.,Du plukket opp magasinet med kuler.,Podniosł@[irreg_3_pl] magazynek.,Você pegou o carregador.,Apanhaste o carregador.,Ai ridicat cartușul cu gloanțe.,Получена обойма.,,Du plockade upp ett magasin med kulor.,Mermi şarjörünü aldın.,Взято набійницю. -You picked up the box of bullets.,TXT_BOXOFBULLETS,,,,Sebral@[ao_cs] jsi krabici nábojů.,Du samlede kassen med kugler op.,Du hast die Munitionskiste genommen.,Πήρες το κουτί με σφαίρες.,Vi trovis munici-keston.,Encuentras una caja de municiones.,,Poimit luotilaatikon.,Vous avez pris la boîte de balles.,Felvettél egy doboz lőszert.,Hai raccolto una scatola di proiettili.,弾薬箱 入手。,돌격소총 탄약 박스를 획득했다.,Je hebt de doos met kogels opgepakt.,Du plukket opp esken med kuler.,Podniosł@[irreg_3_pl] pudło z amunicją.,Você pegou a caixa de balas.,Apanhaste a caixa de balas.,Ai ridicat cutia cu gloanțe.,Получена коробка пуль.,Покупио си кутију меткова,Du plockade upp lådan med kulor.,Mermi kutusunu aldın.,Взято коробку куль. -You picked up the mini missiles.,TXT_MINIMISSILES,,,,Sebral@[ao_cs] jsi minirakety.,Du samlede mini-missiler op.,Du hast die Miniraketen genommen.,Πήρες τους μινι-πυράυλους.,Vi trovis misiletojn.,Encuentras minimisiles.,,Poimit miniohjuksia.,Vous avez pris les mini-missiles.,Felvetted a minirakétákat.,Hai raccolto dei mini-missili.,ミニミサイル 入手。,미니 미사일 꾸러미를 획득했다.,Je hebt de mini-raketten opgepakt.,Du plukket opp minirakettene.,Podniosł@[irreg_3_pl] mini pociski.,Você pegou os mini-mísseis.,Apanhaste os mini-mísseis.,Ai ridicat mini proiectilele.,Получены мини-ракеты.,Покупио си мини ракете,Du plockade upp miniraketerna.,Mini füzeleri aldın.,Взято міні-ракети. -You picked up the crate of missiles.,TXT_CRATEOFMISSILES,,,,Sebral@[ao_cs] jsi bednu miniraket.,Du samlede kassen med missiler op.,Du hast die Miniraketenkiste genommen.,Πήρες το κιβώτιο με πυράυλους.,Vi trovis misilet-keston.,Encuentras una caja de minimisiles.,,Poimit ohjuslaatikon.,Vous avez pris la caisse de missiles.,Felvettél egy ládányi minirakétát.,Hai raccolto una cassa di missili.,ミサイルの箱 入手。,미니 미사일 박스를 획득했다.,Je hebt de kist met raketten opgepakt.,Du plukket opp kassen med missiler.,Podniosł@[irreg_3_pl] skrzynię z pociskami.,Você pegou a caixa de mísseis.,Apanhaste a caixa de mísseis.,Ai ridicat lada cu proiectile.,Получен ящик мини-ракет.,Покупио си кутију ракета,Du plockade upp lådan med missiler.,Füze sandığını aldın.,Взято ящик міні-ракети. -You picked up the energy pod.,TXT_ENERGYPOD,,,,Sebral@[ao_cs] jsi energetický kokón.,Du samlede energipoden op.,Du hast die Energiezelle genommen.,,Vi trovis energi-kapsulon.,Encuentras una cápsula de energía.,,Poimit energia-akun.,Vous avez pris la cellule d'énergie.,Felvettél egy energiahüvelyt.,Hai raccolto un nucleo energetico.,エネルギーポット 入手。,에너지 포드를 획득했다.,Je hebt de energiecel opgepakt.,Du plukket opp energikapselen.,Podniosł@[irreg_3_pl] kapsułę energii.,Você pegou a célula de energia (pequeno).,Apanhaste a célula de energia (pequeno).,Ai ridicat capsula cu energie.,Получена энергокапсула.,Покупио си енергетско постоље.,Du plockade upp energipodden.,Enerji kapsülünü aldın.,Взято енерго-капсулу. -You picked up the energy pack.,TXT_ENERGYPACK,,,,Sebral@[ao_cs] jsi energetický svazek.,Du samlede energipakken op.,Du hast das Energiepack genommen.,,Vi trovis pakon de energio.,Encuentras un paquete de energía.,,Poimit energiapaketin.,Vous avez pris le pack énergétique.,Felvetted az energiacsomagot.,Hai raccolto una carica energetica grande.,エネルギーパック 入手。,에너지 팩을 획득했다.,Je hebt het energiepak opgepakt.,Du plukket opp energipakken.,Podniosł@[irreg_3_pl] zasobnik energii.,Você pegou a célula de energia (grande).,Apanhaste a célula de energia (grande).,Ai ridicat pachetul cu energie.,Получен энергокомплект.,Покупио си пакет енергије,Du plockade upp energipaketet.,Enerji paketini aldın.,Взято енерго-батарею. -You picked up the poison bolts.,TXT_POISONBOLTS,,,,Sebral@[ao_cs] jsi otrávené šípy.,Du samlede giftboltene op.,Du hase die Giftbolzen genommen.,,Vi trovis venenajn sagojn.,Encuentras flechas envenenadas.,,Poimit myrkkynuolia.,Vous avez pris les carreaux empoisonnés.,Felvetted a mérgezett nyilakat.,Hai raccolto dei dardi velenosi.,ポイズンボルト 入手。,맹독 볼트를 획득했다.,Je hebt de gifbouten opgepakt.,Du plukket opp giftboltene.,Podniosł@[irreg_3_pl] zatrute bełty.,Você pegou as setas envenenadas.,Apanhaste as setas envenedadas.,Ai ridicat bolțurile cu otravă.,Получены отравленные болты.,Покупио си отровне стреле,Du plockade upp giftbultarna.,Zehirli cıvataları aldın.,Взято отруйні болти. -You picked up the electric bolts.,TXT_ELECTRICBOLTS,,,,Sebral@[ao_cs] jsi elektrické šípy.,Du samlede de elektriske bolte op.,Du hast die elektrischen Bolzen genommen.,,Vi trovis elektrajn sagojn.,Encuentras flechas eléctricas.,,Poimit sähkönuolia.,Vous avez pris les carreaux électriques.,Felvetted az elektromos nyilakat.,Hai raccolto dei dardi elettrici.,エレクトリックボルト 入手。,전격 볼트를 획득했다.,Je hebt de elektrische bouten opgepakt.,Du plukket opp de elektriske boltene.,Podniosł@[irreg_3_pl] elektryczne bełty.,Você pegou as setas eletricas.,Apanhaste as setas electricas.,Ai ridicat bolțurile cu electricitate.,Получены электрические болты.,Покупио си електричне стреле,Du plockade upp de elektriska bultarna.,Elektrikli cıvataları aldın.,Взято електричні болти. -You picked up the ammo satchel.,TXT_AMMOSATCHEL,,,,Sebral@[ao_cs] jsi brašnu na munici.,Du samlede ammunitionstasken op.,Du hast die Munitionstasche genommen.,,Vi trovis munici-sakon.,Encuentras un bolso de munición.,,Poimit ammuslaukun.,Vous avez pris la sacoche de munitions,Felvetted a lőszeres táskát.,Hai raccolto una Borsa delle Munizioni.,弾薬鞄 入手。,탄약 배낭을 획득했다.,Je hebt de munitietas opgepakt.,Du plukket opp ammunisjonsvesken.,Podniosł@[irreg_3_pl] torbę z amunicją.,Você pegou a mochila de munição.,Apanhaste a mochila de munição.,Ai ridicat sacoșa cu muniție.,Получен ранец боеприпасов.,Покупио си торбицу муниције,Du plockade upp ammunitionsväskan.,Cephane çantasını aldın.,Взято сумку для набоїв. -You have a feeling that it wasn't to be touched...,MSG_TALISMANRED,,,,"Máš pocit, že jsi na to sahat neměl@[ao_cs]...","Du har en fornemmelse af, at den ikke måtte røres...","Du hast das Gefühl, dass man es nicht anfassen sollte...",,"Vi sentas, ke vi ne devis tuŝi ĝin...",Tienes la sensación de que no debía ser tocado...,,"Sinusta tuntuu, ettei siihen olisi pitänyt koskea.",Vous avez un pressentiment qu'il ne fallait pas y toucher.....,Úgy érzed azt nem kéne megérinteni...,Hai la sensazione che non doveva essere toccato...,己の勘が 触れてはならない物だと訴えている...,"결코, 만지면 안 된다는 생각이 든다...",Je hebt het gevoel dat het niet aangeraakt dient te worden...,Du har en følelse av at den ikke skulle røres...,"Czujesz, że trzeba było tego nie dotykać...",Você tem um pressentimento de que isso não devia ser tocado...,Tens um pressentimento que não devias ter mexido nisso.,Ai sentimentul că nu trebuia atinsă...,"Кажется, эту вещь лучше не трогать...",Имаш осећај да није требало бити дирано...,Du har en känsla av att den inte fick röras...,İçinizde dokunulmaması gerektiğine dair bir his var.,"Ви відчуваєте, що не слід це чіпати..." -"Whatever it is, it doesn't belong in this world...",MSG_TALISMANGREEN,,,,"Je jedno, co to je, do tohoto světa to nepatří...","Uanset hvad det er, hører det ikke hjemme i denne verden...","Was auch immer es ist, es gehört nicht in diese Welt...","Οτιδήποτε είναι, δέν είναι απο αυτό τον κόσμο...","Tio ajn, kio ĝi estas, ĝi ne apartenas al ĉi tiu mondo...","Sea lo que sea, no pertenece a este mundo...",,"Mikä ikinä se onkaan, se ei kuulu tähän maailmaan...","Quel que soit cette chose, elle ne devrait pas être ici...","Bármi legyen ez, nem ebben a világban van a helye...","Qualunque cosa sia, non appartiene a questo mondo...",何であろうと、この世には属さない物だ...,뭔지는 몰라도 이 세상에 속한 것이 아닌 것 같다...,"Wat het ook is, het hoort niet thuis in deze wereld...","Uansett hva det er, hører det ikke hjemme i denne verden...","Cokolwiek to jest, nie należy to do tego świata...","Seja o que for, isso não pertence a este mundo...","O que quer que isso seja, não pertence a este mundo...","Orice ar fi, nu are ce căuta în lumea asta...","Что бы это ни было, оно не из этого мира...","Шта год да је, не припада овом свету...",Vad det än är så hör det inte hemma i den här världen...,"O her neyse, bu dünyaya ait değil.","Що б це не було, воно не належить цьому світу..." -It must do something...,MSG_TALISMANBLUE,,,,Něco to dělat musí...,Det må gøre noget...,Es muss etwas tun...,Πρέπει να κάνι κάτι...,Ĝi devas fari ion...,Debe hacer algo...,,Sen on pakko tehdä jotakin...,Ca doit servir a quelque chose...,Valamit kell hogy csináljon...,Deve fare qualcosa...,何かを成し遂げなければならない...,분명히 뭔가를 할 것이다...,Het moet iets doen....,Det må gjøre noe...,To musi coś robić...,Deveria fazer alguma coisa...,Devia fazer alguma coisa.,Trebuie să facă ceva...,Оно ведь зачем-то нужно?..,Мора урадити нешто...,Det måste göra något...,Bir şey yapmalı.,Воно повинно мати якесь призначення... -You have super strength!,MSG_TALISMANPOWER,,,,Získal@[ao_cs] jsi super sílu!,Du har superstyrke!,Du hast Superkräfte,,Vi havas superan forton!,¡Tienes superfuerza!,,Sinulla on supervoimat!,Vous avez une puissance inégalée!,Tied a Szuper Erő!,Hai la super forza!,豪剛なる力を得た!,엄청난 힘이 솟는다!,Je hebt superkracht!,Du har superkrefter!,Masz super siłę!,Você tem a super força!,Tu tens super força!,Ai super forță!,Вы получили сверхсилу!,Имаш супер снагу!,Du har superstyrka!,Süper gücün var!,Ви отримали суперсилу! -,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,, -You don't have the key,TXT_NEEDKEY,,,,Nemáš klíč.,Du har ikke nøglen,Du hast den Schlüssel nicht,Δέν έχεις το κλειδί,Vi ne havas la ŝlosilon,No tienes la llave,,Sinulla ei ole avainta,Vous n'avez pas la clé.,Ehhez nincs kulcsod.,Non hai la chiave necessaria,キーを持っていない,필요한 열쇠가 없다,Je hebt de sleutel niet.,Du har ikke nøkkelen,Nie masz klucza,Você não tem a chave,Tu não tens a chave,Nu ai cheia,Нужен ключ,Немаш кључ,Du har inte nyckeln.,Anahtar sende değil.,У вас немає ключа -You need a passcard,TXT_NEED_PASSCARD,,,,Potřebuješ průkaz.,Du har brug for et adgangskort,Du brauchst eine Zugangskarte.,,Vi bezonas central-ŝlosilon,Necesitas la llave de la central,,Tarvitset avainkortin,Vous avez besoin du passe.,Belépőkártyára lesz szükséged.,Ti serve un lasciapassare,パスカード が必要だ,통행 카드가 필요하다,Je hebt een doorgangskaart nodig.,Du trenger et passerkort,Potrzebujesz karty dostępu,Você precisa de um cartão de acesso,Precisas de um cartão de acesso,Ai nevoie de un card de acces,Нужен пропуск,Треба ти пропусница,Du behöver ett passerkort.,Bir erişim kartına ihtiyacınız var,Потрібна карта доступу +You picked up the Prison pass.,TXT_PRISONPASS,,,,Sebral@[ao_cs] jsi propustku do vězení.,Du samlede fængselspasset op.,Du hast den Gefängnispass genommen.,,Vi havas la malliberejan paspermeson.,Tienes el pase a la prisión.,,Poimit vankilan pääsyluvan.,Vous avez pris le passe de la prison.,,Felvetted a Börtön belépőkártyát.,Hai raccolto il lasciapassare per la Prigione.,刑務所の許可証 取得。,감옥 통행증을 획득했다.,Je hebt de gevangenispas opgepakt.,Du plukket opp fengselspasset.,Podniosł@[irreg_3_pl] przepustkę do Więzienia.,Você pegou o passe da Prisão.,Apanhaste o passe da Prisão.,Ai ridicat Legitimația pentru Închisoare.,Получен пропуск в тюрьму.,Покупио си затворску пропусницу.,Du plockade upp fängelsepasset.,Hapishane kartını aldın.,Взято пропуск до тюрми. +You picked up the crossbow.,TXT_STRIFECROSSBOW,,,,Sebral@[ao_cs] jsi kuši.,Du samlede armbrøst op.,Du hast die Armbrust genommen.,Πήρες το τόξο,Vi trovis arbaleston.,Encuentras una ballesta.,,Poimit jousipyssyn.,Vous avez pris l'arbalète.,,Felvetted a számszeríjat.,Hai raccolto la Balestra.,クロスボウ 入手。,석궁을 획득했다.,Je hebt de kruisboog opgepakt.,Du plukket opp armbrøsten.,Podniosł@[irreg_3_pl] kuszę.,Você pegou a besta.,Apanhaste uma besta.,Ai ridicat arbaleta.,Получен арбалет.,Покупио си самострел.,Du plockade upp armborstet.,Tatar yayını aldın.,Взято арбалет. +You picked up the assault gun.,TXT_ASSAULTGUN,,,,Sebral@[ao_cs] jsi pušku.,Du samlede pistolen op.,Du hast das Sturmgewehr genommen.,Πήρες το πολυβόλο.,Vi trovis sturmofusilon.,Encuentras un fusil de asalto.,,Poimit rynnäkkökiväärin.,Vous avez pris le fusil d'assaut.,,Felvetted a gépfegyvert.,Hai raccolto il fucile d'assalto.,アサルトガン 入手。,돌격소총을 획득했다.,Je hebt het aanvalswapen opgepakt.,Du plukket opp stormgeværet.,Podniosł@[irreg_3_pl] karabin szturmowy.,Você pegou o fuzil de assalto.,Apanhaste a arma de assalto.,Ai ridicat pușca de asalt.,Получена штурмовая винтовка.,Покупио си аутоматску пушку.,Du plockade upp pistolen.,Saldırı silahını aldın.,Взято штурмову гвинтівку. +You picked up the mini missile launcher.,TXT_MMLAUNCHER,,,,Sebral@[ao_cs] jsi miniraketomet.,Du samlede mini-missilkasteren op.,Du hast den Miniraketenwerfer genommen.,Πήρες το μίνι πυραυλοβόλο.,Vi trovis misilet-pafilon.,Encuentras un minilanzamisiles.,,Poimit miniohjuslaukaisimen.,Vous avez pris le lance mini-missile.,,Felvetted a minirakétavetőt.,Hai raccolto il Mini-Lanciamissili.,ミニミサイル ランチャー入手。,미니 미사일 런쳐를 획득했다.,Je hebt de mini-raketwerper opgepakt.,Du plukket opp mini-missilkasteren.,Podniosł@[irreg_3_pl] wyrzutnię minipocisków.,Você pegou o mini lança-mísseis.,Apanhaste o mini lança-mísseis,Ai ridicat mini lansatorul de rachete.,Получена мини-ракетница.,Покупио си мини ручни бацач.,Du plockade upp mini-missilkastaren.,Mini füze fırlatıcısını aldın.,Взято міні-ракетомет. +You picked up the flame thrower.,TXT_FLAMER,,,,Sebral@[ao_cs] jsi plamenomet.,Du samlede flammekasteren op.,Du hast den Flammenwerfer genommen.,Πήρες το φλογοβόλο.,Vi trovis flamĵetilon.,Encuentras un lanzallamas.,,Poimit liekinheittimen.,Vous avez pris le lance-flames.,,Felvetted a lángszórót.,Hai raccolto il Lanciafiamme.,火炎放射器 入手。,완성된 화염방사기를 얻었다.,Je hebt de vlammenwerper opgepakt.,Du plukket opp flammekasteren.,Podniosł@[irreg_3_pl] miotacz ognia.,Você pegou o lança-chamas.,Apanhaste o lança-chamas.,Ai ridicat aruncătorul de flăcări.,Получен огнемёт.,Покупио си бацач пламена.,Du plockade upp flamkastaren.,Alev silahını aldın.,Взято вогнемет. +You picked up the mauler.,TXT_MAULER,,,,Sebral@[ao_cs] jsi trhač.,Du tog mauleren op.,Du hast den Vernichter genommen.,,Vi trovis polvigilon.,Encuentras un triturador.,,Poimit moukarin.,Vous avez pris le Broyeur.,,Felvetted a marcangolót.,Hai raccolto il Pestatore.,マウラー 入手。,마울러를 획득했다.,Je hebt de toetakelaar opgepakt.,Du plukket opp mauleren.,Podniosł@[irreg_3_pl] miażdżyciel.,Você pegou o desintegrador.,Apanhaste o desintegrador.,Ai ridicat sfâșietorul.,Получен истязатель.,Покупио си маулер.,Du plockade upp mauler.,Parçalayıcıyı aldın.,Взято розсіювач. +You picked up the Grenade launcher.,TXT_GLAUNCHER,,,,Sebral@[ao_cs] jsi granátomet.,Du samlede granatkasteren op.,Du hast den Granatwerfer genommen.,Πήρες το εκτοξευτη χειροβομβίδων.,Vi trovis grenadĵetilon.,Encuentras un lanzagranadas.,,Poimit kranaatinheittimen.,Vous avez pris le lance-grenades,,Felvetted a gránátvetőt.,Hai raccolto il Lanciagranate.,グレネードランチャー 入手。,유탄발사기를 획득했다.,Je hebt de granaatwerper opgepakt.,Du plukket opp granatkasteren.,Podniosł@[irreg_3_pl] wyrzutnię granatów.,Você pegou o lança-granadas.,Apanhaste o lança-granadas.,Ai ridicat Lansatorul de rachete.,Получен гранатомёт.,Покупио си бацач граната.,Du plockade upp granatkastaren.,El bombası fırlatıcısını aldın.,Взято гранатомет. +You picked up the SIGIL.,TXT_SIGIL,,,,Sebral@[ao_cs] jsi Pečeť.,Du samlede SIGIL op.,Du hast das SIGIL genommen.,,Vi trovis la SIGELON.,Encuentras el EMBLEMA.,,Poimit SINETIN.,Vous avez pris le SIGIL.,,Felvetted a Pecsétet.,Hai raccolto il SIGILLO.,シジル 取得。,시질은 이제 당신의 것이다.,Je hebt de SIGIL opgepakt.,Du plukket opp SIGIL.,Podniosł@[irreg_3_pl] PIECZĘĆ.,Você pegou o SIGILO.,Apanhaste o SIGILO,Ai ridicat SIGILIUL.,Получена ПЕЧАТЬ.,Покупио си СИГИЛ.,Du plockade upp Sigillet.,SİGİL'i aldın.,Отримано СІГІЛ. +You picked up the Base Key.,TXT_BASEKEY,,,,Sebral@[ao_cs] jsi klíč od základny.,Du samlede Base nøglen op.,Du hast den Basisschlüssel genommen.,,Vi havas la ŝlosilon de la bazo.,Tienes la llave de la base.,,Poimit tukikohdan avaimen.,Vous avez pris la clé de la Base.,,Felvetted a Bázis kulcsát.,Hai raccolto la chiave della Base.,基地のキー 取得。,기지 키를 획득했다.,Je hebt de basissleutel opgepakt.,Du plukket opp basenøkkelen.,Podniosł@[irreg_3_pl] Klucz do Bazy.,Você pegou a Chave da Base.,Apanhaste a Chave da Base.,Ai ridicat Cheia Bazei.,Получен ключ от базы.,Покупио си кључ базе.,Du plockade upp basnyckeln.,Üs Anahtarını aldın.,Взято ключ від бази. +You picked up the Govs Key.,TXT_GOVSKEY,,,,Sebral@[ao_cs] jsi klíč ke guvernérovi.,Du samlede guvernørens nøglen op.,Du hast den Gouverneursschlüssel genommen.,,Vi havas la ŝlosilon de la registo.,Tienes la llave del Gobernador.,,Poimit kuvernöörin avaimen.,Vous avez pris la clé du Gouverneur.,,Felvetted a Kormányzó parcellájának kulcsát.,Hai raccolto la chiave del Governatore.,政府のキー 取得。,총독의 키를 획득했다.,Je hebt de gouverneursleutel opgepakt.,Du plukket opp regjeringsnøkkelen.,Podniosł@[irreg_3_pl] Klucz Gubernatora.,Você pegou a Chave do Governador.,Apanhaste a Chave do Governador.,Ai ridicat Cheia Guvernatorului.,Получен ключ губернатора.,Покупио си клуч гувернанте.,Du plockade upp Govs nyckeln.,Hükümet Anahtarını aldın.,Взято ключ губернатора. +You picked up the Passcard.,TXT_PASSCARD,,,,Sebral@[ao_cs] jsi průkazku.,Du samlede Adgangskort op.,Du hast die Zugangskarte genommen.,,Vi havas la ŝlosilon de la elektra centralo.,Tienes la llave de la central eléctrica.,,Poimit avainkortin.,Vous avez pris le passe.,,Felvetted a Belépőkártyát.,Hai raccolto la Tessera Lasciapassare.,パスカード 取得。,통행 카드를 획득했다.,Je hebt de doorgangskaart opgepakt.,Du plukket opp adgangskortet.,Podniosł@[irreg_3_pl] Kartę Dostępu.,Você pegou o Cartão de Acesso.,Apanhaste o Cartão de Acesso.,Ai ridicat Legitimația.,Получен пропуск.,Покупио си пасош.,Du plockade upp passerkortet.,Erişim kartıni aldın.,Взято карту доступу. +You picked up the ID Badge.,TXT_IDBADGE,,,,Sebral@[ao_cs] jsi identifikační odznak.,Du samlede ID Badge op.,Du hast die Identitätskarte genommen.,,Vi havas la insignon de la malliberejo.,Tienes la insignia de la prisión.,,Poimit henkilötunnisteen.,Vous avez pris le Badge d'identification.,,Felvetted az Azonosítójelvényt.,Hai raccolto il Distintivo.,IDバッジ 取得。,신분 휘장을 획득했다.,Je hebt de ID-badge opgepakt.,Du plukket opp ID-skiltet.,Podniosł@[irreg_3_pl] Odznakę Identyfikacyjną.,Você pegou o Crachá de Identificação.,Apanhaste o Crachá de Identificação,Ai ridicat Ecusonul de Identificare.,Получена личная карта.,Покупио си личну карту.,Du plockade upp ID-brickan.,Kimlik Rozetini aldın.,Взято бейджик. +You picked up the Prison Key.,TXT_PRISONKEY,,,,Sebral@[ao_cs] jsi klič k vězení.,Du samlede nøglen til fængslet op.,Du hast den Gefängnisschlüssel genommen.,,Vi havas la ŝlosilon de la malliberejo.,Tienes la llave de la prisión.,,Poimit vankilan avaimen.,Vous avez pris la clé de la Prison.,,Felvetted a Börtönkulcsot.,Hai raccolto la chiave della Prigione.,刑務所のキー 取得。,감옥 키를 획득했다.,Je hebt de gevangenissleutel opgepakt.,Du plukket opp Fengselsnøkkelen.,Podniosł@[irreg_3_pl] Klucz do Więzienia.,Você pegou a Chave da Prisão.,Apanhaste a Chave da Prisão.,Ai ridicat Cheia Închisorii.,Получен ключ от тюрьмы.,Покупио си затворски кључ,Du tog upp fängelsenyckeln.,Hapishane Anahtarını aldın.,Взято ключ від тюрми. +You picked up the Severed Hand.,TXT_SEVEREDHAND,,,,Sebral@[ao_cs] jsi useknutou ruku.,Du samlede den afhuggede hånd op.,Du hast die abgetrennte Hand genommen.,,Vi havas amputitan manon.,Tienes una mano amputada.,,Poimit katkenneen käden.,Vous avez pris la main coupée.,,Felvetted a Levágott kezet.,Hai raccolto la Mano Mozzata.,切り取った手 取得。,잘린 손목을 주웠다.,Je hebt de Gescheurde Hand opgepakt.,Du plukket opp den avkuttede hånden.,Podniosł@[irreg_3_pl] Odciętą Rękę.,Você pegou a Mão Decepada.,Apanhaste a Mão Desmenbrada.,Ai ridicat Mâna Retezată.,Получена отрезанная рука.,Покупио си шаку,Du plockade upp den avhuggna handen.,Kesik El'i aldın.,Взято відрізану руку. +You picked up the Power1 Key.,TXT_POWER1KEY,,,,Sebral@[ao_cs] jsi klíč k elektrárně 1.,Du samlede Power1-nøglen op.,Du hast den Kraftwerksschlüssel 1 genommen,,Vi havas la unuan centralan identigilon.,Tienes una identificación nivel uno de la central.,,Poimit voimalan 1-avaimen.,Vous avez pris la clé Power1.,,Felvetted az 1-es Áram kulcsot.,Hai raccolto la chiave della Centrale n.1,パワー1キー 取得。,발전소 1호 키를 획득했다.,Je hebt de 1e Machtsleutel opgepakt.,Du plukket opp Power1-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Elektrowni 1.,Você pegou a Chave da Usina 1.,Apanhaste a Chave Energética 1,Ai ridicat Cheia Putere1.,Получен ключ электростанции №1.,Покупио си први кључ од електране.,Du plockade upp kraftnyckeln 1.,Güç1 Anahtarını aldın.,Взято ключ від електростанції 1. +You picked up the Power2 Key.,TXT_POWER2KEY,,,,Sebral@[ao_cs] jsi klíč k elektrárně 2.,Du samlede Power2-nøglen op.,Du hast den Kraftwerksschlüssel 2 genommen,,Vi havas la duan centralan identigilon.,Tienes una identificación nivel dos de la central.,,Poimit voimalan 2-avaimen.,Vous avez pris la clé Power2.,,Felvetted az 2-es Áram kulcsot.,Hai raccolto la chiave della Centrale n.2,パワー2キー 取得。,발전소 2호 키를 획득했다.,Je hebt de 2e Machtsleutel opgepakt.,Du plukket opp Power2-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Elektrowni 2.,Você pegou a Chave da Usina 2.,Apanhaste a Chave Energética 2,Ai ridicat Cheia Putere2.,Получен ключ электростанции №2.,Покупио си други кључ од електране.,Du plockade upp kraftnyckeln 2.,Güç2 Anahtarını aldın.,Взято ключ від електростанції 2. +You picked up the Power3 Key.,TXT_POWER3KEY,,,,Sebral@[ao_cs] jsi klíč k elektrárně 3.,Du samlede Power3-nøglen op.,Du hast den Kraftwerksschlüssel 3 genommen,,Vi havas la trian centralan identigilon.,Tienes una identificación nivel tres de la central.,,Poimit voimalan 3-avaimen.,Vous avez pris la clé Power3.,,Felvetted az 3-as Áram kulcsot.,Hai raccolto la chiave della Centrale n.3,パワー3キー 取得。,발전소 3호 키를 획득했다.,Je hebt de 3e Machtsleutel opgepakt.,Du plukket opp Power3-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Elektrowni 3.,Você pegou a Chave da Usina 3.,Apanhaste a Chave Energética 3,Ai ridicat Cheia Putere3.,Получен ключ электростанции №3.,Покупио си трећи кључ од електране.,Du plockade upp kraftnyckeln 3.,Güç3 Anahtarını aldın.,Взято ключ від електростанції 3. +You picked up the Gold Key.,TXT_GOLDKEY,,,,Sebral@[ao_cs] jsi zlatý klíč.,Du samlede den guldnøglen op.,Du hast den Goldschlüssel genommen.,,Vi havas oran ŝlosilon.,Tienes una llave dorada.,,Poimit kulta-avaimen.,Vous avez pris la clé d'or.,,Felvetted az Aranykulcsot.,Hai raccolto la chiave dorata,ゴールドキー 取得。,황금 키를 획득했다.,Je hebt de gouden sleutel opgepakt.,Du plukket opp Gullnøkkelen.,Podniosł@[irreg_3_pl] Złoty Klucz.,Você pegou a Chave de Ouro.,Apanhaste a Chave de Ouro,Ai ridicat Cheia de Aur.,Получен золотой ключ.,Покупио си златни кључ.,Du plockade upp guldnyckeln.,Altın Anahtarı aldın.,Взято золотий ключ. +You picked up the ID Card.,TXT_IDCARD,,,,Sebral@[ao_cs] jsi ID kartu.,Du samlede ID-kortet op.,Du hast den Ausweis genommen.,,Vi havas identigilon de la kloakoj.,Tienes una identificación de las clocacas.,,Poimit henkilökortin.,Vous avez pris la Carte d'identité.,,Felvetted az Igazolványt.,Hai raccolto la Tessera di Identificazione.,IDカード 取得。,신분증을 획득했다.,Je hebt de ID-kaart opgepakt.,Du plukket opp ID-kortet.,Podniosł@[irreg_3_pl] Kartę Identyfikacyjną.,Você pegou o Cartão de Identifiçacão.,Apanhaste o Cartão de Identificação,Ai ridicat Cardul de Identitate.,Получено удостоверение.,Покупио си идентификациону картицу.,Du plockade upp ID-kortet.,Kimlik Kartını aldın.,Взято ідентифікаційну карту. +You picked up the Silver Key.,TXT_SILVERKEY,,,,Sebral@[ao_cs] jsi stříbrný klíč.,Du tog sølvnøglen op.,Du hast den Silberschlüssel genommen.,,Vi havas arĝentan ŝlosilon.,Tienes una llave plateada.,,Poimit hopea-avaimen.,Vous avez pris la clé d'argent.,,Felvetted az Ezüstkulcsot.,Hai raccolto la chiave argentata,シルバーキー 取得。,은 키를 획득했다.,Je hebt de zilveren sleutel opgepakt.,Du plukket opp sølvnøkkelen.,Podniosł@[irreg_3_pl] Srebrny Klucz.,Você pegou a Chave de Prata.,Apanhaste a Chave de Prata,Ai ridicat Cheia de Argint.,Получен серебряный ключ.,Покупио си сребрни кључ.,Du plockade upp silvernyckeln.,Gümüş Anahtarı aldınız.,Взято срібний ключ +You picked up the Oracle Key.,TXT_ORACLEKEY,,,,Sebral@[ao_cs] jsi věštcův klíč.,Du tog Oracle-nøglen op.,Du hast den Orakelschlüssel genommen.,,Vi havas ŝlosilon de la Orakolo,Tienes una llave del Oráculo.,,Poimit Oraakkelin avaimen.,Vous avez pris la clé Oraclé.,,Felvetted az Orákulum kulcsát.,Hai raccolto la chiave dell'Oracolo.,オラクルキー 取得。,오라클 키를 획득했다.,Je hebt de Orakelsleutel opgepakt.,Du plukket opp Oracle-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Wyroczni.,Você pegou a Chave do Oráculo.,Apanhaste a Chave do Oráculo.,Ai ridicat Cheia Oracol.,Получен ключ Оракула.,Покупио си кључ пророка,Du plockade upp Orakel-nyckeln.,Kahin Anahtarını aldın.,Взято ключ Оракула. +You picked up the Military ID.,TXT_MILITARYID,,,,Sebral@[ao_cs] jsi vojenské ID.,Du samlede militær-ID op.,Du hast den Militärausweis genommen.,,Vi havas militan identigilon.,Tienes una identificación militar.,,Poimit sotilastunnuksen.,Vous avez pris l'ID Militaire.,,Felvetted a Katonai igazolványt.,Hai raccolto l'Identificativo Militare.,ミリタリーID 取得。,군용 아이디를 획득했다.,Je hebt de militaire ID opgepakt.,Du plukket opp den militære ID-en.,Podniosł@[irreg_3_pl] Wojskowy Identyfikator.,Você pegou a Identificação Militar.,Apanhaste a Identificação Militar.,Ai ridicat Legitimația Militară.,Получено военное удостоверение.,Покупио си војну идентификацију,Du plockade upp det militära ID-kortet.,Askeri Kimliği aldın.,Взято військову ID карту. +You picked up the Order Key.,TXT_ORDERKEY,,,,Sebral@[ao_cs] jsi klíč Řádu.,Du samlede Ordensnøglen op.,Du hast den Ordensschlüssel genommen.,,Vi havas la ŝlosilon de La Ordeno.,Tienes la llave de La Orden.,,Poimit Veljeskunnan avaimen.,Vous avez pris la clé de l'Ordre.,,Felvetted a Rend kulcsát.,Hai raccolto la chiave dell'Ordine.,オーダーキー 取得。,오더의 키를 획득했다.,Je hebt de Ordesleutel opgepakt.,Du plukket opp Bestillingsnøkkelen.,Podniosł@[irreg_3_pl] Klucz Zakonu.,Você pegou a Chave da Ordem.,Apanhaste a Chave da Ordem.,Ai ridicat Cheia Ordinului.,Получен ключ Ордена.,Покупио си кључ одреда,Du plockade ordernyckeln.,Emir Anahtarını aldın.,Взято ключ Ордену. +You picked up the Warehouse Key.,TXT_WAREHOUSEKEY,,,,Sebral@[ao_cs] jsi klíč ke skladu.,Du samlede lagernøglen op.,Du hast den Lagerhausschlüssel genommen,,Vi havas la ŝlosilon de la magazeno.,Tienes la llave del almacén.,,Poimit varaston avaimen.,Vous avez pris la clé de l'entrepôt.,,Felvetted a Raktár kulcsát.,Hai raccolto la chiave del Magazzino.,倉庫のキー 取得。,창고 키를 획득했다.,Je hebt de pakhuissleutel opgepakt.,Du plukket opp Lagernøkkelen.,Podniosł@[irreg_3_pl] Klucz do Magazynu.,Você pegou a Chave do Armazém.,Apanhaste a Chave do Armazém,Ai ridicat Cheia Depozitului.,Получен ключ от склада.,Покупио си кључ складишта,Du plockade lagernyckeln.,Depo Anahtarını aldın.,Взято ключ від складу. +You picked up the Brass Key.,TXT_BRASSKEY,,,,Sebral@[ao_cs] jsi mosazný klíč.,Du samlede messingnøglen op.,Du hast den Messingschlüssel genommen.,,Vi havas la latunan ŝlosilon.,Tienes la llave de latón.,,Poimit messinkiavaimen.,Vous avez pris la clé de bronze.,,Felvetted a Rézkulcsot.,Hai raccolto la chiave d'Ottone.,ブラスキー 取得。,황동 키를 획득했다.,Je hebt de messing sleutel opgepakt.,Du plukket opp messingnøkkelen.,Podniosł@[irreg_3_pl] Mosiężny Klucz.,Você pegou a Chave de Latão.,Apanhaste a Chave de Latão,Ai ridicat Cheia din Alamă.,Получен латунный ключ.,Покупио си кључ месинга,Du plockade mässingsnyckeln.,Pirinç Anahtarı aldın.,Взято латунний ключ. +You picked up the Red Crystal Key.,TXT_REDCRYSTAL,,,,Sebral@[ao_cs] jsi červený krystalový klíč.,Du samlede den røde krystalnøgle op.,Du hast den roten Kristallschlüssel genommen.,,Vi trovis la ruĝkristalan ŝlosilon.,Encuentras la llave de cristal rojo.,,Poimit punaisen kristalliavaimen.,Vous avez pris la clé cristal rouge.,,Felvetted a Vörös Kristály Kulcsot.,Hai raccolto la chiave del Cristallo Rosso.,赤水晶のキー 取得。,적색 크리스탈 키를 획득했다.,Je hebt de rode kristallen sleutel opgepakt.,Du plukket opp den røde krystallnøkkelen.,Podniosł@[irreg_3_pl] Czerwony Kryształowy Klucz.,Você pegou a Chave de Cristal Vermelho.,Apanhaste a Chave de Cristal Vermelho.,Ai ridicat Cheia din Cristal Roșu.,Получен красный ключ-кристалл.,Покупио си кључ од црвеног кристала,Du plockade upp den röda kristallnyckeln.,Kırmızı Kristal Anahtarı aldın.,Взято червоний кристальний ключ. +You picked up the Blue Crystal Key.,TXT_BLUECRYSTAL,,,,Sebral@[ao_cs] jsi modrý krystalový klíč.,Du samlede den blå krystalnøgle op.,Du hast den blauen Kristallschlüssel genommen.,,Vi trovis la blukristalan ŝlosilon,Encuentras la llave de cristal azul.,,Poimit sinisen kristalliavaimen.,Vous avez pris la clé cristal bleu.,,Felvetted a Kék Kristály Kulcsot.,Hai raccolto la chiave del Cristallo Blu.,青水晶のキー 取得。,청색 크리스탈 키를 획득했다.,Je hebt de blauwe kristallen sleutel opgepakt.,Du plukket opp den blå krystallnøkkelen.,Podniosł@[irreg_3_pl] Niebieski Kryształowy Klucz.,Você pegou a Chave de Cristal Azul.,Apanhaste a Chave de Cristal Azul.,Ai ridicat Cheia din Cristal Albastru.,Получен синий ключ-кристалл.,Покупио си кључ од плавог кристала,Du plockade upp den blå kristallnyckeln.,Mavi Kristal Anahtarı aldın.,Взято синій кристальний ключ. +You picked up the Chapel Key.,TXT_CHAPELKEY,,,,Sebral@[ao_cs] jsi klíč ke kapli.,Du samlede Kapel-nøglen op.,Du hast den Kapellenschlüssel genommen.,,Vi trovis la ŝlosilon de la kapelo.,Encuentras la llave de la capilla.,,Poimit kappelin avaimen.,Vous avez pris la clé de la chapelle.,,Felvetted a Kápolna Kulcsát.,Hai raccolto la chiave della Cappella,チャペルキー 取得。,예배당 키를 획득했다.,Je hebt de kapelsleutel opgepakt.,Du plukket opp kapellnøkkelen.,Podniosł@[irreg_3_pl] Klucz do Kaplicy.,Você pegou a Chave da Capela.,Apanhaste a Chave da Capela.,Ai ridicat Cheia Capelei.,Получен ключ от часовни.,Покупио си кључ капеле,Du plockade upp kapellnyckeln.,Şapel Anahtarını aldın.,Взято ключ від каплиці. +You picked up the Catacomb Key.,TXT_CATACOMBKEY,,,,Sebral@[ao_cs] jsi klíč do katakomb.,Du samlede Katakombe-nøglen op.,Du hast den Katakombenschlüssel genommen.,,Vi havas la ŝlosilon de la katakombo.,Tienes la llave de las catacumbas.,,Poimit katakombin avaimen.,Vous avez pris la clé des catacombes.,,Felvetted a Katakombák kulcsát.,Hai raccolto la chiave delle Catacombe.,カタコンベキー 取得。,고대 묘지 키를 획득했다.,Je hebt de catacombesleutel opgepakt.,Du plukket opp Katakomb-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Katakumb.,Você pegou a Chave da Catacumba.,Apanhaste a Chave da Catacumba.,Ai ridicat Cheia Catacombei.,Получен ключ от катакомб.,Покупио си кључ катакомбе,Du plockade upp katakomberna nyckeln.,Yeraltı Mezarı Anahtarını aldın.,Взято ключ від катакомб. +You picked up the Security Key.,TXT_SECURITYKEY,,,,Sebral@[ao_cs] jsi klíč ochranky.,Du samlede sikkerhedsnøglen op.,Du hast den Sicherheitsschlüssel genommen.,,Vi havas la sekureco-ŝlosilon.,Tienes la llave de seguridad.,,Poimit turvamiesavaimen.,Vous avez pris la clé de la sécurité.,,Felvetted a Biztonsági Kulcsot.,Hai raccolto la chiave della Sicurezza.,警備のキー 取得。,보안 키를 획득했다.,Je hebt de beveiligingssleutel opgepakt.,Du plukket opp Sikkerhetsnøkkelen.,Podniosł@[irreg_3_pl] Klucz Ochrony.,Você pegou a Chave de Seguranca.,Apanhaste a Chave de Segurança,Ai ridicat Cheia Securității.,Получен ключ охраны.,Покупио си кључ обезбеђења,Du plockade upp säkerhetsnyckeln.,Güvenlik Anahtarını aldın.,Взято ключ охорони. +You picked up the Core Key.,TXT_COREKEY,,,,Sebral@[ao_cs] jsi klíč k jádru.,Du samlede reaktornøglen op.,Du hast den Reaktorschlüssel genommen.,,Vi trovis la ŝlosilon de la kernejo.,Encuentras la llave del núcleo.,,Poimit ytimen avaimen.,Vous avez pris la clé du réacteur.,,Felvetted a Mag kulcsát.,Hai raccolto la chiave del Nucleo.,コアキー 取得。,중심부 키를 획득했다.,Je hebt de kernsleutel opgepakt.,Du plukket opp Kjernenøkkelen.,Podniosł@[irreg_3_pl] Klucz do Rdzenia.,Você pegou a Chave do Núcleo.,Apanhaste a Chave do Núcleo.,Ai ridicat Cheia Nucleului.,Получен ключ от реактора.,Покупио си кључ језгра,Du plockade upp kärnnyckeln.,Çekirdek Anahtarını aldın.,Взято ключ від реактора. +You picked up the Mauler Key.,TXT_MAULERKEY,,,,Sebral@[ao_cs] jsi klíč k trhačům.,Du samlede Mauler-nøglen op.,Du hast den Vernichterschlüssel genommen.,,Vi havas la ŝlosilon de la polvigiloj.,Tienes la llave de los trituradores.,,Poimit moukarin avaimen.,Vous avez pris la clé du Broyeur.,,Felvetted a Marcangoló kulcsot.,Hai raccolto la chiave del Pestatore.,マウラーキー 取得。,마울러 키를 획득했다.,Je hebt de toetakelaarssleutel opgepakt.,Du plukket opp Mauler-nøkkelen.,Podniosł@[irreg_3_pl] Klucz do Magazynu Miażdżycieli.,Você pegou a Chave do Mauler.,Apanhaste a Chave do Mauler.,Ai ridicat Cheia Sfâșietorului.,Получен ключ истязателя.,Покупио си кључ Маулера.,Du plockade upp Mauler-nyckeln.,Mauler Anahtarını aldın.,Взято ключ розсіювача. +You picked up the Factory Key.,TXT_FACTORYKEY,,,,Sebral@[ao_cs] jsi klíč do továrny.,Du samlede fabriksnøglen op.,Du hast den Fabrikschlüssel genommen.,,Vi trovis la ŝlosilon de la fabriko.,Encuentras la llave de la fábrica.,,Poimit tehtaan avaimen.,Vous avez pris la clé de l'usine.,,Felvetted a Gyár kulcsát.,Hai raccolto la chiave della Fabbrica.,工場のキー 取得。,공장 키를 획득했다.,Je hebt de fabriekssleutel opgepakt.,Du plukket opp fabrikknøkkelen.,Podniosł@[irreg_3_pl] Klucz do Fabryki.,Você pegou a Chave da Fábrica.,Apanhaste a Chave da Fábrica.,Ai ridicat Cheia Fabricii.,Получен ключ от фабрики.,Покупио си кључ фабрике,Du plockade upp fabriksnyckeln.,Fabrika Anahtarını aldın.,Взято ключ від фабрики. +You picked up the Mine Key.,TXT_MINEKEY,,,,Sebral@[ao_cs] jsi klíč do dolů.,Du samlede minenøglen op.,Du hast den Minenschlüssel genommen.,,Vi trovis la ŝlosilon de la minejo.,Encuentras la llave de la mina.,,Poimit kaivoksen avaimen.,Vous avez pris la clé de la mine.,,Felvetted a Bánya kulcsát.,Hai raccolto la chiave della Miniera.,鉱山のキー 取得。,탄광 키를 획득했다.,Je hebt de mijnsleutel opgepakt.,Du plukket opp Gruvenøkkelen.,Podniosł@[irreg_3_pl] Klucz do Kopalni.,Você pegou a Chave da Mina.,Apanhaste a Chave da Mina.,Ai ridicat Cheia Minei.,Получен ключ от шахт.,Покупио си кључ рудника,Du plockade upp gruvnyckeln.,Maden Anahtarını aldın.,Взято ключ від шахт. +You picked up the New Key5.,TXT_NEWKEY5,,,,Sebral@[ao_cs] jsi nový klíč 5.,Du samlede den nye nøgle5 op.,Du hast den neuen Schlüssel 5 genommen.,,Vi havas la novan ŝlosilon kvin.,Tienes la llave nueva cinco.,,Poimit uuden 5-avaimen.,Vous avez pris la nouvelle clé 5.,,Felvetted az 5. kulcsot.,Hai raccolto la Nuova Chiave n.5,ニューキー5 取得。,새로운 키5를 획득했다.,Je hebt de nieuwe sleutel 5 opgepakt.,Du plukket opp den nye nøkkelen5.,Podniosł@[irreg_3_pl] Nowy Klucz5,Você pegou a Chave Nova 5.,Apanhaste a Chave Nova 5.,Ai ridicat Cheia Nouă5.,Получен новый ключ №5.,Покупио си нови кључ5,Du hämtade den nya nyckeln5.,Yeni Anahtar5'i aldın.,Взято новий ключ 5. +You picked up the Oracle Pass.,TXT_ORACLEPASS,,,,Sebral@[ao_cs] jsi věštcovu propustku.,Du samlede orakelpas op.,Du hast den Orakelpass genommen.,,Vi havas la paspermeson de la Orakolo.,Tienes el pase del Oráculo.,,Poimit Oraakkelin passin.,Vous avez pris le passe de l'Oracle.,,Felvetted az Orákulum Belépőkártyáját.,Hai raccolto il Lasciapassare dell'Oracolo.,オラクルパス 取得。,오라클의 통행증을 획득했다.,Je hebt de Orakelkaart opgepakt.,Du plukket opp Orakelpasset.,Podniosł@[irreg_3_pl] Przepustkę Wyroczni.,Você pegou o Passe do Oráculo.,Apanhaste o Passe do Oráculo.,Ai ridicat Legitimația Oracol.,Получен пропуск Оракула.,Покупио си пророкову пропусницу,Du plockade upp orakelpasset.,Kahin Geçiş Kartını aldın.,Взято пропуск Оракула. +You picked up the HE-Grenade Rounds.,TXT_HEGRENADES,,,,Sebral@[ao_cs] jsi výbušné granáty.,Du samlede HE-granaterne op.,Du hast die HE-Granaten genommen.,,Vi trovis eksplodeg-povajn grenadojn.,Encuentras granadas de conmoción.,,Poimit räjähdekranaattiammuksia.,Vous avez pris les Grenades Explosives.,,Felvetted a robbanó gránátot.,Hai raccolto delle granate ad Alto Potenziale,HEグレネード弾 入手。,고폭 유탄을 획득했다.,Je hebt de HE-granaten opgepakt.,Du plukket opp HE-granaten.,Podniosł@[irreg_3_pl] Wiązkę Granatów.,Você pegou as Granadas Explosivas.,Apanhaste as Granadas Explosivas.,Ai ridicat Grenadele Explozive.,Получена связка гранат.,Покупио си ХЕ-Граната чауре,Du plockade upp HE-granaterna.,HE-Bombası Mermilerini aldın.,Взято в'язку гранат. +You picked up the Phosphorus-Grenade Rounds.,TXT_PHGRENADES,,,,Sebral@[ao_cs] jsi fosforové granáty.,Du samlede fosforgranaterne op.,Du hasr die Phosphorgranaten genommen.,,Vi trovis fosforajn grenadojn.,Encuentras granadas de fósforo.,,Poimit fosforikranaattiammuksia.,Vous avez pris les Grenades Phosphoriques.,,Felvetted a foszfor-gránátokat.,Hai raccolto delle Granate al Fosforo.,白リングレネード弾 入手。,소이 유탄을 획득했다.,Je hebt de fosforgranaten opgepakt.,Du plukket opp fosforgranaten.,Podniosł@[irreg_3_pl] Wiązkę Fosforowych Granatów.,Você pegou as Granadas de Fósforo.,Apanhaste as Granadas de Fósforo.,Ai ridicat Grenadele cu Fosfor.,Получена связка фосфорных гранат.,Покупио си шаржер фосфорних граната.,Du plockade upp fosforgranater.,Fosforlu El Bombası Mermilerini aldın.,Взято в'язку фосфорних гранат. +You picked up the clip of bullets.,TXT_CLIPOFBULLETS,,,,Sebral@[ao_cs] jsi zásobník s náboji.,Du samlede patroner op.,Du hast die Gewehrmunition genommen.,Πήρες το κουτάκι με σφαίρες.,Vi trovis magazenon.,Encuentras un cargador.,,Poimit luotilippaan.,Vous avez pris le Chargeur.,,Felvettél egy tár lőszert.,Hai raccolto un caricatore di proiettili.,銃弾倉 入手。,돌격소총 탄창을 획득했다.,Je hebt de patroon met kogels opgepakt.,Du plukket opp magasinet med kuler.,Podniosł@[irreg_3_pl] magazynek.,Você pegou o carregador.,Apanhaste o carregador.,Ai ridicat cartușul cu gloanțe.,Получена обойма.,,Du plockade upp ett magasin med kulor.,Mermi şarjörünü aldın.,Взято набійницю. +You picked up the box of bullets.,TXT_BOXOFBULLETS,,,,Sebral@[ao_cs] jsi krabici nábojů.,Du samlede kassen med kugler op.,Du hast die Munitionskiste genommen.,Πήρες το κουτί με σφαίρες.,Vi trovis munici-keston.,Encuentras una caja de municiones.,,Poimit luotilaatikon.,Vous avez pris la boîte de balles.,,Felvettél egy doboz lőszert.,Hai raccolto una scatola di proiettili.,弾薬箱 入手。,돌격소총 탄약 박스를 획득했다.,Je hebt de doos met kogels opgepakt.,Du plukket opp esken med kuler.,Podniosł@[irreg_3_pl] pudło z amunicją.,Você pegou a caixa de balas.,Apanhaste a caixa de balas.,Ai ridicat cutia cu gloanțe.,Получена коробка пуль.,Покупио си кутију меткова,Du plockade upp lådan med kulor.,Mermi kutusunu aldın.,Взято коробку куль. +You picked up the mini missiles.,TXT_MINIMISSILES,,,,Sebral@[ao_cs] jsi minirakety.,Du samlede mini-missiler op.,Du hast die Miniraketen genommen.,Πήρες τους μινι-πυράυλους.,Vi trovis misiletojn.,Encuentras minimisiles.,,Poimit miniohjuksia.,Vous avez pris les mini-missiles.,,Felvetted a minirakétákat.,Hai raccolto dei mini-missili.,ミニミサイル 入手。,미니 미사일 꾸러미를 획득했다.,Je hebt de mini-raketten opgepakt.,Du plukket opp minirakettene.,Podniosł@[irreg_3_pl] mini pociski.,Você pegou os mini-mísseis.,Apanhaste os mini-mísseis.,Ai ridicat mini proiectilele.,Получены мини-ракеты.,Покупио си мини ракете,Du plockade upp miniraketerna.,Mini füzeleri aldın.,Взято міні-ракети. +You picked up the crate of missiles.,TXT_CRATEOFMISSILES,,,,Sebral@[ao_cs] jsi bednu miniraket.,Du samlede kassen med missiler op.,Du hast die Miniraketenkiste genommen.,Πήρες το κιβώτιο με πυράυλους.,Vi trovis misilet-keston.,Encuentras una caja de minimisiles.,,Poimit ohjuslaatikon.,Vous avez pris la caisse de missiles.,,Felvettél egy ládányi minirakétát.,Hai raccolto una cassa di missili.,ミサイルの箱 入手。,미니 미사일 박스를 획득했다.,Je hebt de kist met raketten opgepakt.,Du plukket opp kassen med missiler.,Podniosł@[irreg_3_pl] skrzynię z pociskami.,Você pegou a caixa de mísseis.,Apanhaste a caixa de mísseis.,Ai ridicat lada cu proiectile.,Получен ящик мини-ракет.,Покупио си кутију ракета,Du plockade upp lådan med missiler.,Füze sandığını aldın.,Взято ящик міні-ракети. +You picked up the energy pod.,TXT_ENERGYPOD,,,,Sebral@[ao_cs] jsi energetický kokón.,Du samlede energipoden op.,Du hast die Energiezelle genommen.,,Vi trovis energi-kapsulon.,Encuentras una cápsula de energía.,,Poimit energia-akun.,Vous avez pris la cellule d'énergie.,,Felvettél egy energiahüvelyt.,Hai raccolto un nucleo energetico.,エネルギーポット 入手。,에너지 포드를 획득했다.,Je hebt de energiecel opgepakt.,Du plukket opp energikapselen.,Podniosł@[irreg_3_pl] kapsułę energii.,Você pegou a célula de energia (pequeno).,Apanhaste a célula de energia (pequeno).,Ai ridicat capsula cu energie.,Получена энергокапсула.,Покупио си енергетско постоље.,Du plockade upp energipodden.,Enerji kapsülünü aldın.,Взято енерго-капсулу. +You picked up the energy pack.,TXT_ENERGYPACK,,,,Sebral@[ao_cs] jsi energetický svazek.,Du samlede energipakken op.,Du hast das Energiepack genommen.,,Vi trovis pakon de energio.,Encuentras un paquete de energía.,,Poimit energiapaketin.,Vous avez pris le pack énergétique.,,Felvetted az energiacsomagot.,Hai raccolto una carica energetica grande.,エネルギーパック 入手。,에너지 팩을 획득했다.,Je hebt het energiepak opgepakt.,Du plukket opp energipakken.,Podniosł@[irreg_3_pl] zasobnik energii.,Você pegou a célula de energia (grande).,Apanhaste a célula de energia (grande).,Ai ridicat pachetul cu energie.,Получен энергокомплект.,Покупио си пакет енергије,Du plockade upp energipaketet.,Enerji paketini aldın.,Взято енерго-батарею. +You picked up the poison bolts.,TXT_POISONBOLTS,,,,Sebral@[ao_cs] jsi otrávené šípy.,Du samlede giftboltene op.,Du hase die Giftbolzen genommen.,,Vi trovis venenajn sagojn.,Encuentras flechas envenenadas.,,Poimit myrkkynuolia.,Vous avez pris les carreaux empoisonnés.,,Felvetted a mérgezett nyilakat.,Hai raccolto dei dardi velenosi.,ポイズンボルト 入手。,맹독 볼트를 획득했다.,Je hebt de gifbouten opgepakt.,Du plukket opp giftboltene.,Podniosł@[irreg_3_pl] zatrute bełty.,Você pegou as setas envenenadas.,Apanhaste as setas envenedadas.,Ai ridicat bolțurile cu otravă.,Получены отравленные болты.,Покупио си отровне стреле,Du plockade upp giftbultarna.,Zehirli cıvataları aldın.,Взято отруйні болти. +You picked up the electric bolts.,TXT_ELECTRICBOLTS,,,,Sebral@[ao_cs] jsi elektrické šípy.,Du samlede de elektriske bolte op.,Du hast die elektrischen Bolzen genommen.,,Vi trovis elektrajn sagojn.,Encuentras flechas eléctricas.,,Poimit sähkönuolia.,Vous avez pris les carreaux électriques.,,Felvetted az elektromos nyilakat.,Hai raccolto dei dardi elettrici.,エレクトリックボルト 入手。,전격 볼트를 획득했다.,Je hebt de elektrische bouten opgepakt.,Du plukket opp de elektriske boltene.,Podniosł@[irreg_3_pl] elektryczne bełty.,Você pegou as setas eletricas.,Apanhaste as setas electricas.,Ai ridicat bolțurile cu electricitate.,Получены электрические болты.,Покупио си електричне стреле,Du plockade upp de elektriska bultarna.,Elektrikli cıvataları aldın.,Взято електричні болти. +You picked up the ammo satchel.,TXT_AMMOSATCHEL,,,,Sebral@[ao_cs] jsi brašnu na munici.,Du samlede ammunitionstasken op.,Du hast die Munitionstasche genommen.,,Vi trovis munici-sakon.,Encuentras un bolso de munición.,,Poimit ammuslaukun.,Vous avez pris la sacoche de munitions,,Felvetted a lőszeres táskát.,Hai raccolto una Borsa delle Munizioni.,弾薬鞄 入手。,탄약 배낭을 획득했다.,Je hebt de munitietas opgepakt.,Du plukket opp ammunisjonsvesken.,Podniosł@[irreg_3_pl] torbę z amunicją.,Você pegou a mochila de munição.,Apanhaste a mochila de munição.,Ai ridicat sacoșa cu muniție.,Получен ранец боеприпасов.,Покупио си торбицу муниције,Du plockade upp ammunitionsväskan.,Cephane çantasını aldın.,Взято сумку для набоїв. +You have a feeling that it wasn't to be touched...,MSG_TALISMANRED,,,,"Máš pocit, že jsi na to sahat neměl@[ao_cs]...","Du har en fornemmelse af, at den ikke måtte røres...","Du hast das Gefühl, dass man es nicht anfassen sollte...",,"Vi sentas, ke vi ne devis tuŝi ĝin...",Tienes la sensación de que no debía ser tocado...,,"Sinusta tuntuu, ettei siihen olisi pitänyt koskea.",Vous avez un pressentiment qu'il ne fallait pas y toucher.....,,Úgy érzed azt nem kéne megérinteni...,Hai la sensazione che non doveva essere toccato...,己の勘が 触れてはならない物だと訴えている...,"결코, 만지면 안 된다는 생각이 든다...",Je hebt het gevoel dat het niet aangeraakt dient te worden...,Du har en følelse av at den ikke skulle røres...,"Czujesz, że trzeba było tego nie dotykać...",Você tem um pressentimento de que isso não devia ser tocado...,Tens um pressentimento que não devias ter mexido nisso.,Ai sentimentul că nu trebuia atinsă...,"Кажется, эту вещь лучше не трогать...",Имаш осећај да није требало бити дирано...,Du har en känsla av att den inte fick röras...,İçinizde dokunulmaması gerektiğine dair bir his var.,"Ви відчуваєте, що не слід це чіпати..." +"Whatever it is, it doesn't belong in this world...",MSG_TALISMANGREEN,,,,"Je jedno, co to je, do tohoto světa to nepatří...","Uanset hvad det er, hører det ikke hjemme i denne verden...","Was auch immer es ist, es gehört nicht in diese Welt...","Οτιδήποτε είναι, δέν είναι απο αυτό τον κόσμο...","Tio ajn, kio ĝi estas, ĝi ne apartenas al ĉi tiu mondo...","Sea lo que sea, no pertenece a este mundo...",,"Mikä ikinä se onkaan, se ei kuulu tähän maailmaan...","Quel que soit cette chose, elle ne devrait pas être ici...",,"Bármi legyen ez, nem ebben a világban van a helye...","Qualunque cosa sia, non appartiene a questo mondo...",何であろうと、この世には属さない物だ...,뭔지는 몰라도 이 세상에 속한 것이 아닌 것 같다...,"Wat het ook is, het hoort niet thuis in deze wereld...","Uansett hva det er, hører det ikke hjemme i denne verden...","Cokolwiek to jest, nie należy to do tego świata...","Seja o que for, isso não pertence a este mundo...","O que quer que isso seja, não pertence a este mundo...","Orice ar fi, nu are ce căuta în lumea asta...","Что бы это ни было, оно не из этого мира...","Шта год да је, не припада овом свету...",Vad det än är så hör det inte hemma i den här världen...,"O her neyse, bu dünyaya ait değil.","Що б це не було, воно не належить цьому світу..." +It must do something...,MSG_TALISMANBLUE,,,,Něco to dělat musí...,Det må gøre noget...,Es muss etwas tun...,Πρέπει να κάνι κάτι...,Ĝi devas fari ion...,Debe hacer algo...,,Sen on pakko tehdä jotakin...,Ca doit servir a quelque chose...,,Valamit kell hogy csináljon...,Deve fare qualcosa...,何かを成し遂げなければならない...,분명히 뭔가를 할 것이다...,Het moet iets doen....,Det må gjøre noe...,To musi coś robić...,Deveria fazer alguma coisa...,Devia fazer alguma coisa.,Trebuie să facă ceva...,Оно ведь зачем-то нужно?..,Мора урадити нешто...,Det måste göra något...,Bir şey yapmalı.,Воно повинно мати якесь призначення... +You have super strength!,MSG_TALISMANPOWER,,,,Získal@[ao_cs] jsi super sílu!,Du har superstyrke!,Du hast Superkräfte,,Vi havas superan forton!,¡Tienes superfuerza!,,Sinulla on supervoimat!,Vous avez une puissance inégalée!,,Tied a Szuper Erő!,Hai la super forza!,豪剛なる力を得た!,엄청난 힘이 솟는다!,Je hebt superkracht!,Du har superkrefter!,Masz super siłę!,Você tem a super força!,Tu tens super força!,Ai super forță!,Вы получили сверхсилу!,Имаш супер снагу!,Du har superstyrka!,Süper gücün var!,Ви отримали суперсилу! +,,Locks,,,,,,,,,,,,,,,,,,,,,,,,,,, +You don't have the key,TXT_NEEDKEY,,,,Nemáš klíč.,Du har ikke nøglen,Du hast den Schlüssel nicht,Δέν έχεις το κλειδί,Vi ne havas la ŝlosilon,No tienes la llave,,Sinulla ei ole avainta,Vous n'avez pas la clé.,,Ehhez nincs kulcsod.,Non hai la chiave necessaria,キーを持っていない,필요한 열쇠가 없다,Je hebt de sleutel niet.,Du har ikke nøkkelen,Nie masz klucza,Você não tem a chave,Tu não tens a chave,Nu ai cheia,Нужен ключ,Немаш кључ,Du har inte nyckeln.,Anahtar sende değil.,У вас немає ключа +You need a passcard,TXT_NEED_PASSCARD,,,,Potřebuješ průkaz.,Du har brug for et adgangskort,Du brauchst eine Zugangskarte.,,Vi bezonas central-ŝlosilon,Necesitas la llave de la central,,Tarvitset avainkortin,Vous avez besoin du passe.,,Belépőkártyára lesz szükséged.,Ti serve un lasciapassare,パスカード が必要だ,통행 카드가 필요하다,Je hebt een doorgangskaart nodig.,Du trenger et passerkort,Potrzebujesz karty dostępu,Você precisa de um cartão de acesso,Precisas de um cartão de acesso,Ai nevoie de un card de acces,Нужен пропуск,Треба ти пропусница,Du behöver ett passerkort.,Bir erişim kartına ihtiyacınız var,Потрібна карта доступу You need a pass card key to open this door,TXT_NEED_PASSCARD_DOOR,,,,Pro otevření dveří potřebuješ průkaz.,Du skal bruge en adgangskort for at åbne denne dør,"Du brauchst eine Zugangskarte, um diese Tür zu öffnen.",,"Vi bezonas central-ŝlosilon por malfermi tiun pordon","Necesitas una llave de la -central para abrir esta puerta",,Tarvitset avainkortin tämän oven avaamiseksi,Vous avez besoin du passe ouvrir cette porte.,Belépőkártya nélkül nem nyílik ez az ajtó.,Ti serve una tessera lasciapassare per aprire questa porta.,このドアには パスカード が必要だ,이 문을 열기 위해서는 통행 카드가 필요하다,Je hebt een doorgangskaart nodig om deze deur te openen.,Du trenger en passerkortnøkkel for å åpne denne døren.,Potrzebujesz karty dostępu aby otworzyć te drzwi,Você precisa de um cartão de acesso para abrir esta porta,Precisas de um cartão de acesso para abrir esta porta,"Ai nevoie de un card de acces ca să deschizi ușa +central para abrir esta puerta",,Tarvitset avainkortin tämän oven avaamiseksi,Vous avez besoin du passe ouvrir cette porte.,,Belépőkártya nélkül nem nyílik ez az ajtó.,Ti serve una tessera lasciapassare per aprire questa porta.,このドアには パスカード が必要だ,이 문을 열기 위해서는 통행 카드가 필요하다,Je hebt een doorgangskaart nodig om deze deur te openen.,Du trenger en passerkortnøkkel for å åpne denne døren.,Potrzebujesz karty dostępu aby otworzyć te drzwi,Você precisa de um cartão de acesso para abrir esta porta,Precisas de um cartão de acesso para abrir esta porta,"Ai nevoie de un card de acces ca să deschizi ușa asta",Для открытия нужен пропуск,Треба ти пасош да отвориш ова врата,Du behöver ett passerkort för att öppna den här dörren.,Bu kapıyı açmak için bir erişim kartı anahtarına ihtiyacınız var,"Вам потрібна карта доступу, щоб відкрити ці двері" You need an ID card,TXT_NEED_IDCARD,,,,Potřebuješ identifikační kartu.,Du skal bruge et ID-kort,Du brauchst einen Ausweis.,,Vi bezonas identigil-karton,"Necesitas una tarjeta -de identificación",,Tarvitset henkilökortin,Vous avez besoin d'une carte d'identité.,Igazolvány szükséges,Ti serve una tessera identificativa.,IDカード が必要だ,신분증이 필요하다,Je hebt een ID-kaart nodig.,Du trenger et ID-kort,Potrzebujesz karty identyfikacyjną,Você precisa do cartão de identificação,Precisas do cartão de identificação,Ai nevoie de un card de identitate,Нужна личная карта,Треба ти идентификациона картица,Du behöver ett ID-kort,Bir kimlik kartına ihtiyacınız var,Вам потрібна ідентифікаційна карта. +de identificación",,Tarvitset henkilökortin,Vous avez besoin d'une carte d'identité.,,Igazolvány szükséges,Ti serve una tessera identificativa.,IDカード が必要だ,신분증이 필요하다,Je hebt een ID-kaart nodig.,Du trenger et ID-kort,Potrzebujesz karty identyfikacyjną,Você precisa do cartão de identificação,Precisas do cartão de identificação,Ai nevoie de un card de identitate,Нужна личная карта,Треба ти идентификациона картица,Du behöver ett ID-kort,Bir kimlik kartına ihtiyacınız var,Вам потрібна ідентифікаційна карта. You don't have the key to the prison,TXT_NEED_PRISONKEY,,,,Nemáš klíč do vězení.,Du har ikke nøglen til fængslet,Du brauchst den Schlüssel zum Gefängnis,,"Vi ne havas la ŝlosilon -de la malliberejo",No tienes la llave a la prisión,,Sinulla ei ole vankilan avainta,Vous n'avez pas la clé de la prison.,Nincs kulcsod a börtönhöz.,Ti manca la chiave per la prigione,刑務所のキーを持っていない,감옥에 입장하기 위한 열쇠가 없다,Je hebt de sleutel van de gevangenis niet.,Du har ikke nøkkelen til fengselet.,Nie masz klucza do więzienia,Você não tem a chave da prisão,Não tens a chave da prisão,Nu ai cheia închisorii,Нужен ключ от тюрьмы,Треба ти кључ затвора,Du har inte nyckeln till fängelset.,Hapishanenin anahtarı sende değil.,У вас немає ключа від в'язниці. -Hand print not on file,TXT_NEED_HANDPRINT,,,,Otisk ruky není v databázi.,Håndaftryk er ikke registreret,Handabdruck nicht gespeichert!,,Neregistrita manspuro,Huella de la mano no registrada,,Kädenjälki puuttuu tiedostosta,Votre main n'est pas reconnue par le scanner.,Azonosítatlan kézlenyomat.,Impronta digitale non in archivio,手形認証が一致しません,알 수 없는 지문입니다,Handafdruk niet in het bestand.,Håndavtrykk finnes ikke i filen,Brak odcisku dłoni w bazie danych,Biometria não autorizada,Impressão digital não autorizada,Amprenta mâinii nerecunoscută,Отпечаток руки не распознан,Отисак длана није у записнику,Handavtryck finns inte i registret,El izi dosyada yok,Відбиток руки не упізнано -You need the Gold Key,TXT_NEED_GOLDKEY,,,,Potřebuješ zlatý klíč.,Du har brug for guldnøglen,Du brauchst den goldenen Schlüssel,,Vi bezonas la oran ŝlosilon,Necesitas la llave dorada,,Tarvitset kulta-avaimen,Vous avez besoin d'une clé d'or.,Aranykulcs szükséges.,Ti serve la chiave dorata,ゴールドキーが必要だ,황금 키가 필요하다,Je hebt de gouden sleutel nodig.,Du trenger gullnøkkelen,Potrzebujesz Złotego Klucza,Você precisa da Chave de Ouro,Precisas da Chave de Ouro,Ai nevoie de cheia din Aur,Нужен золотой ключ,Треба ти златни кључ,Du behöver guldnyckeln,Altın Anahtara ihtiyacınız var,Вам потрібен золотий ключ +de la malliberejo",No tienes la llave a la prisión,,Sinulla ei ole vankilan avainta,Vous n'avez pas la clé de la prison.,,Nincs kulcsod a börtönhöz.,Ti manca la chiave per la prigione,刑務所のキーを持っていない,감옥에 입장하기 위한 열쇠가 없다,Je hebt de sleutel van de gevangenis niet.,Du har ikke nøkkelen til fengselet.,Nie masz klucza do więzienia,Você não tem a chave da prisão,Não tens a chave da prisão,Nu ai cheia închisorii,Нужен ключ от тюрьмы,Треба ти кључ затвора,Du har inte nyckeln till fängelset.,Hapishanenin anahtarı sende değil.,У вас немає ключа від в'язниці. +Hand print not on file,TXT_NEED_HANDPRINT,,,,Otisk ruky není v databázi.,Håndaftryk er ikke registreret,Handabdruck nicht gespeichert!,,Neregistrita manspuro,Huella de la mano no registrada,,Kädenjälki puuttuu tiedostosta,Votre main n'est pas reconnue par le scanner.,,Azonosítatlan kézlenyomat.,Impronta digitale non in archivio,手形認証が一致しません,알 수 없는 지문입니다,Handafdruk niet in het bestand.,Håndavtrykk finnes ikke i filen,Brak odcisku dłoni w bazie danych,Biometria não autorizada,Impressão digital não autorizada,Amprenta mâinii nerecunoscută,Отпечаток руки не распознан,Отисак длана није у записнику,Handavtryck finns inte i registret,El izi dosyada yok,Відбиток руки не упізнано +You need the Gold Key,TXT_NEED_GOLDKEY,,,,Potřebuješ zlatý klíč.,Du har brug for guldnøglen,Du brauchst den goldenen Schlüssel,,Vi bezonas la oran ŝlosilon,Necesitas la llave dorada,,Tarvitset kulta-avaimen,Vous avez besoin d'une clé d'or.,,Aranykulcs szükséges.,Ti serve la chiave dorata,ゴールドキーが必要だ,황금 키가 필요하다,Je hebt de gouden sleutel nodig.,Du trenger gullnøkkelen,Potrzebujesz Złotego Klucza,Você precisa da Chave de Ouro,Precisas da Chave de Ouro,Ai nevoie de cheia din Aur,Нужен золотой ключ,Треба ти златни кључ,Du behöver guldnyckeln,Altın Anahtara ihtiyacınız var,Вам потрібен золотий ключ You need an ID Badge,TXT_NEED_IDBADGE,,,,Potřebuješ identifikační odznak.,Du har brug for et ID-badge,Du brauchst eine Identitätskarte.,,Vi bezonas malliberejan insignon,"Necesitas una insignia -de la prisión",,Tarvitset henkilötunnisteen,Vous avez besoin d'un badge d'identification.,Azonosító jelvény szükséges.,Ti serve un distintivo di identificazione,IDバッジが必要だ,신분 휘장이 필요하다,Je hebt een ID-badge nodig.,Du trenger en ID-badge,Potrzebujesz Odznaki Identyfikacyjnej,Você precisa do Crachá de Identificação,Precisas do Crachá de Identificação,Ai nevoie de un ecuson de identificare,Нужна личная карта,Треба ти лична карта,Du behöver ett ID-bricka,Bir Kimlik Rozetine ihtiyacınız var,Вам потрібен бейджик +de la prisión",,Tarvitset henkilötunnisteen,Vous avez besoin d'un badge d'identification.,,Azonosító jelvény szükséges.,Ti serve un distintivo di identificazione,IDバッジが必要だ,신분 휘장이 필요하다,Je hebt een ID-badge nodig.,Du trenger en ID-badge,Potrzebujesz Odznaki Identyfikacyjnej,Você precisa do Crachá de Identificação,Precisas do Crachá de Identificação,Ai nevoie de un ecuson de identificare,Нужна личная карта,Треба ти лична карта,Du behöver ett ID-bricka,Bir Kimlik Rozetine ihtiyacınız var,Вам потрібен бейджик You need an ID Badge to open this door,TXT_NEED_IDBADGE_DOOR,,,,Pro otevření dveří potřebuješ identifikační odznak.,Du har brug for et ID Badge for at åbne denne dør,"Du brauchst eine Identitätskarte, um diese Tür zu öffnen.",,"Vi bezonas malliberejan insignon por malfermi ĉi tiun pordon","Necesitas una insignia de la -prisión para abrir esta puerta",,Tarvitset henkilötunnisteen tämän oven avaamiseksi,Vous avez besoin d'un badge d'identification pour ouvrir cette porte.,Azonosító jelvény szükséges az ajtó kinyitásához.,Ti serve un distintivo di identificazione per superare questa porta,このドアには IDバッジ が必要だ,이 문을 열기 위해서는 신분 휘장이 필요하다,Je hebt een ID-badge nodig om deze deur te openen.,Du trenger en ID-badge for å åpne denne døren,Potrzebujesz Odznaki Identyfikacyjnej aby otworzyć te drzwi,Você precisa do Crachá de Identificação para abrir a porta,Precisas do Crachá de Identificação para abrir a porta,"Ai nevoie de un ecuson de identificare ca să +prisión para abrir esta puerta",,Tarvitset henkilötunnisteen tämän oven avaamiseksi,Vous avez besoin d'un badge d'identification pour ouvrir cette porte.,,Azonosító jelvény szükséges az ajtó kinyitásához.,Ti serve un distintivo di identificazione per superare questa porta,このドアには IDバッジ が必要だ,이 문을 열기 위해서는 신분 휘장이 필요하다,Je hebt een ID-badge nodig om deze deur te openen.,Du trenger en ID-badge for å åpne denne døren,Potrzebujesz Odznaki Identyfikacyjnej aby otworzyć te drzwi,Você precisa do Crachá de Identificação para abrir a porta,Precisas do Crachá de Identificação para abrir a porta,"Ai nevoie de un ecuson de identificare ca să deschizi ușa",Для открытия нужна личная карта,Треба ти лична карта да отвориш ова врата,Du behöver en ID-bricka för att öppna den här dörren.,Bu kapıyı açmak için kimlik kartına ihtiyacınız var,"Вам потрібен бейджик, щоб відкрити ці двері" -You need the Silver Key,TXT_NEED_SILVERKEY,,,,Potřebuješ stříbrný klíč.,Du skal bruge sølvnøglen,Du brauchst den Silberschlüssel,,Vi bezonas la arĝentan ŝlosilon,Necesitas la llave plateada,,Tarvitset hopea-avaimen,Vous avez besoin de la clé en argent.,Az ezüstkulcs szükséges.,Ti serve la chiave argentata,シルバーキーが必要だ,은 키가 필요하다,Je hebt de zilveren sleutel nodig.,Du trenger sølvnøkkelen,Potrzebujesz Srebrnego Klucza,Você precisa da Chave de Prata,Precisas da Chavede Prata,Ai nevoie de cheia din Argint,Нужен серебряный ключ,Треба ти сребрни кључ,Du behöver silvernyckeln,Gümüş Anahtara ihtiyacın var,Вам потрібен срібний ключ -You need the Brass Key,TXT_NEED_BRASSKEY,,,,Potřebuješ mosazný klíč.,Du skal bruge messingnøglen,Du brauchst den Messingschlüssel,,Vi bezonas la latunan ŝlosilon,Necesitas la llave de latón,,Tarvitset messinkiavaimen,Vous avez besoin de la clé en bronze.,A rézkulcs szükséges.,Ti serve la chiave d'ottone,ブラスキーが必要だ,황동 키가 필요하다,Je hebt de messing sleutel nodig.,Du trenger messingnøkkelen,Potrzebujesz Mosiężnego Klucza,Você precisa da Chave de Latão,Precisas da Chave de Latão,Ai nevoie de cheia din Alamă,Нужен латунный ключ,Треба ти кључ од месинга,Du behöver mässingsnyckeln,Pirinç Anahtara ihtiyacın var,Вам потрібен латунний ключ -You need the Red Crystal,TXT_NEED_REDCRYSTAL,,,,Potřebuješ červený krystal.,Du skal bruge den røde krystal,Du brauchst den roten Kristall,,Vi bezonas la ruĝan kristalon,Necesitas el cristal rojo,,Tarvitset punaisen kristallin,Vous avez besoin du cristal rouge.,A vörös kristályra lesz szükség itt.,Ti serve il Cristallo Rosso,赤水晶のキーが必要だ,적색 크리스탈이 필요하다,Je hebt de rode kristallen sleutel nodig.,Du trenger den røde krystallen,Potrzebujesz Czerwonego Kryształu,Você precisa do Cristal Vermelho,Precisas do Cristal Vermelho,Ai nevoie de Cristalul Roșu,Нужен красный кристалл,Треба ти црвени кристал,Du behöver den röda kristallen,Kırmızı Kristal'e ihtiyacın var.,Вам потрібен червоний кристальний ключ -You need the Blue Crystal,TXT_NEED_BLUECRYSTAL,,,,Potřebuješ modrý krystal.,Du skal bruge den blå krystal,Du brauchst den blauen Kristall,,Vi bezonas la bluan kristalon,Necesitas el cristal azul,,Tarvitset sinisen kristallin,Vous avez besoin du cristal bleu.,A kék kristályra lesz szükség itt.,Ti serve il Cristallo Blu,青水晶のキーが必要だ,청색 크리스탈이 필요하다,Je hebt de blauwe kristallen sleutel nodig.,Du trenger den blå krystallen,Potrzebujesz Niebieskiego Kryształu,Você precisa do Cristal Azul,Precisas do Cristal Azul,Ai nevoie de Cristalul Albastru,Нужен синий кристалл,Треба ти плави кристал,Du behöver den blå kristallen,Mavi Kristal'e ihtiyacın var.,Вам потрібен синій кристальний ключ +You need the Silver Key,TXT_NEED_SILVERKEY,,,,Potřebuješ stříbrný klíč.,Du skal bruge sølvnøglen,Du brauchst den Silberschlüssel,,Vi bezonas la arĝentan ŝlosilon,Necesitas la llave plateada,,Tarvitset hopea-avaimen,Vous avez besoin de la clé en argent.,,Az ezüstkulcs szükséges.,Ti serve la chiave argentata,シルバーキーが必要だ,은 키가 필요하다,Je hebt de zilveren sleutel nodig.,Du trenger sølvnøkkelen,Potrzebujesz Srebrnego Klucza,Você precisa da Chave de Prata,Precisas da Chavede Prata,Ai nevoie de cheia din Argint,Нужен серебряный ключ,Треба ти сребрни кључ,Du behöver silvernyckeln,Gümüş Anahtara ihtiyacın var,Вам потрібен срібний ключ +You need the Brass Key,TXT_NEED_BRASSKEY,,,,Potřebuješ mosazný klíč.,Du skal bruge messingnøglen,Du brauchst den Messingschlüssel,,Vi bezonas la latunan ŝlosilon,Necesitas la llave de latón,,Tarvitset messinkiavaimen,Vous avez besoin de la clé en bronze.,,A rézkulcs szükséges.,Ti serve la chiave d'ottone,ブラスキーが必要だ,황동 키가 필요하다,Je hebt de messing sleutel nodig.,Du trenger messingnøkkelen,Potrzebujesz Mosiężnego Klucza,Você precisa da Chave de Latão,Precisas da Chave de Latão,Ai nevoie de cheia din Alamă,Нужен латунный ключ,Треба ти кључ од месинга,Du behöver mässingsnyckeln,Pirinç Anahtara ihtiyacın var,Вам потрібен латунний ключ +You need the Red Crystal,TXT_NEED_REDCRYSTAL,,,,Potřebuješ červený krystal.,Du skal bruge den røde krystal,Du brauchst den roten Kristall,,Vi bezonas la ruĝan kristalon,Necesitas el cristal rojo,,Tarvitset punaisen kristallin,Vous avez besoin du cristal rouge.,,A vörös kristályra lesz szükség itt.,Ti serve il Cristallo Rosso,赤水晶のキーが必要だ,적색 크리스탈이 필요하다,Je hebt de rode kristallen sleutel nodig.,Du trenger den røde krystallen,Potrzebujesz Czerwonego Kryształu,Você precisa do Cristal Vermelho,Precisas do Cristal Vermelho,Ai nevoie de Cristalul Roșu,Нужен красный кристалл,Треба ти црвени кристал,Du behöver den röda kristallen,Kırmızı Kristal'e ihtiyacın var.,Вам потрібен червоний кристальний ключ +You need the Blue Crystal,TXT_NEED_BLUECRYSTAL,,,,Potřebuješ modrý krystal.,Du skal bruge den blå krystal,Du brauchst den blauen Kristall,,Vi bezonas la bluan kristalon,Necesitas el cristal azul,,Tarvitset sinisen kristallin,Vous avez besoin du cristal bleu.,,A kék kristályra lesz szükség itt.,Ti serve il Cristallo Blu,青水晶のキーが必要だ,청색 크리스탈이 필요하다,Je hebt de blauwe kristallen sleutel nodig.,Du trenger den blå krystallen,Potrzebujesz Niebieskiego Kryształu,Você precisa do Cristal Azul,Precisas do Cristal Azul,Ai nevoie de Cristalul Albastru,Нужен синий кристалл,Треба ти плави кристал,Du behöver den blå kristallen,Mavi Kristal'e ihtiyacın var.,Вам потрібен синій кристальний ключ This area is only available in the retail version of Strife,TXT_RETAIL_ONLY,,,,Tato oblast je dostupná pouze v registrované verzi.,Dette område er kun tilgængeligt i detailudgaven af Strife,Dieser Bereich ist nur in der kompletten Version von Strife erreichbar.,Αυτή η περιοχή είναι μονο διαθέσημη στήν εγραμμένη έκδοση του Strife,"Ĉi tiu loko estas enirebla nur en la komercaĵa versio de Strife","Esta área solo está disponible -en la versión completa de Strife",,Tämä alue on saatavilla ainoastaan Strifen kokoversiossa,Cette zone n'est accessible que dans la version complète de Strife.,Ez a terület kizárólag a Strife teljes verziójában érhető el,Quest'area è disponibile solo nella versione completa di Strife.,このエリアは Strifeの製品版でのみ利用可能です,이 구역은 정품 버전에서만 입장이 가능합니다,Deze ruimte is alleen beschikbaar in de verkoopversie van Strife.,Dette området er bare tilgjengelig i salgsversjonen av Strife.,Ten obszar jest dostępny tylko w pełnej wersji Strife,Essa área está disponível apenas na versão registrada de Strife,,"Această zonă e disponibilă doar în versiunea +en la versión completa de Strife",,Tämä alue on saatavilla ainoastaan Strifen kokoversiossa,Cette zone n'est accessible que dans la version complète de Strife.,,Ez a terület kizárólag a Strife teljes verziójában érhető el,Quest'area è disponibile solo nella versione completa di Strife.,このエリアは Strifeの製品版でのみ利用可能です,이 구역은 정품 버전에서만 입장이 가능합니다,Deze ruimte is alleen beschikbaar in de verkoopversie van Strife.,Dette området er bare tilgjengelig i salgsversjonen av Strife.,Ten obszar jest dostępny tylko w pełnej wersji Strife,Essa área está disponível apenas na versão registrada de Strife,,"Această zonă e disponibilă doar în versiunea cumpărată a jocului Strife",Эта локация доступна только в полной версии Strife,Ова област је само доступна у пуној верзији Strife-а,Det här området finns bara i detaljhandelsversionen av Strife.,Bu alan yalnızca Strife'ın perakende sürümünde mevcuttur,Ця локація доступна тільки у повній версії Strife -That doesn't seem to work,TXT_DOES_NOT_WORK,,,,Takhle to nepůjde.,Det ser ikke ud til at virke,Das scheint nicht zu funktionieren,,Tio ŝajne ne funkcias,Parece que eso no funciona,,Se ei näytä toimivan,Cela ne semble pas fonctionner.,Ez nem akar működni.,Non sembra funzionare,それは作動していない,작동이 안 되는 것 같다,Dat lijkt niet te werken.,Det ser ikke ut til å virke,To zdaje się nie działać,Parece que isso não funciona,,Nu pare să funcționeze,"Похоже, что не работает",То изгледа да не ради,Det verkar inte fungera.,Bu işe yaramıyor gibi görünüyor.,"Здається, воно не працює" -You need the chalice!,TXT_NEED_CHALICE,,,,Potřebuješ kalich!,Du skal bruge bægeret!,Du brauchst den Kelch!,,Vi bezonas la kalikon!,¡Necesitas el Cáliz!,,Tarvitset maljan!,Vous avez besoin du calice!,A Kupára van szükséged!,Hai bisogno del calice.,聖杯が必要だ!,성배가 필요하다!,Je hebt de beker nodig!,Du trenger begeret!,Potrzebujesz kielicha!,Você precisa do cálice!,Precisas do cálice!,Ai nevoie de potir!,Нужна чаша!,Треба ти пехар!,Du behöver kalken!,Kadehe ihtiyacın var!,Вам потрібна чаша! +That doesn't seem to work,TXT_DOES_NOT_WORK,,,,Takhle to nepůjde.,Det ser ikke ud til at virke,Das scheint nicht zu funktionieren,,Tio ŝajne ne funkcias,Parece que eso no funciona,,Se ei näytä toimivan,Cela ne semble pas fonctionner.,,Ez nem akar működni.,Non sembra funzionare,それは作動していない,작동이 안 되는 것 같다,Dat lijkt niet te werken.,Det ser ikke ut til å virke,To zdaje się nie działać,Parece que isso não funciona,,Nu pare să funcționeze,"Похоже, что не работает",То изгледа да не ради,Det verkar inte fungera.,Bu işe yaramıyor gibi görünüyor.,"Здається, воно не працює" +You need the chalice!,TXT_NEED_CHALICE,,,,Potřebuješ kalich!,Du skal bruge bægeret!,Du brauchst den Kelch!,,Vi bezonas la kalikon!,¡Necesitas el Cáliz!,,Tarvitset maljan!,Vous avez besoin du calice!,,A Kupára van szükséged!,Hai bisogno del calice.,聖杯が必要だ!,성배가 필요하다!,Je hebt de beker nodig!,Du trenger begeret!,Potrzebujesz kielicha!,Você precisa do cálice!,Precisas do cálice!,Ai nevoie de potir!,Нужна чаша!,Треба ти пехар!,Du behöver kalken!,Kadehe ihtiyacın var!,Вам потрібна чаша! You need the Oracle Pass!,TXT_NEED_OPASS,,,,Potřebuješ propustku od věštce!,Du har brug for orakelpas!,Du brauchst den Orakelpass!,,"Vi bezonas la paspermeson -de la Orakolo!",¡Necesitas el pase del Oráculo!,,Tarvitset Oraakkelin passin,Vous avez besoin du passe Oracle!,Az Orákulum Engedélyére van szükséged!,Hai bisogno del pass dell'Oracolo.,オラクルパスが必要だ!,오라클 통행증이 필요하다!,Je hebt de Orakelpas nodig!,Du trenger Orakelpasset!,Potrzebujesz Przepustki Wyroczni!,Você precisa do Passe do Oráculo!,Precisas do Passe do Oráculo!,Ai nevoie de legitimația Oracol!,Нужен пропуск Оракула!,Треба ти Пророкова пропусница!,Du behöver Orakelpasset!,Kahin Kartı'na ihtiyacın var!,Вам потрібен пропуск Оракула! -,,Actor tags,,,,,,,,,,,,,,,,,,,,,,,,,, -Dagger,TAG_PUNCHDAGGER,,,,Dýka,Dolk,Dolch,Μαχάιρι,Ponardo,Daga,,Tikari,Dague de Poing,Tőr,Pugnale,ダガー,단검,Dolk,Dolk,Sztylet,Punhal,,Pumnal,Кинжал,Бодеж,Dolk,Hançer,Кинжал -Crossbow,TAG_STRIFECROSSBOW1,Crossbow with electric bolts,,,Kuše,Armbrøst,Armbrust,Τόξο (Δηλητήριο),Arbalesto (elektraj sagoj),Ballesta (eléctrica),,Jousipyssy,Arbalète Electrique,Nyílpuska,Balestra ,クロスボウ,석궁 (전격),Kruisboog,Armbrøst,Kusza,Besta,,Arbaletă,Арбалет,Самострел,Armborst,Arbalet,Арбалет -Crossbow,TAG_STRIFECROSSBOW2,Crossbow with poison bolts,,,Kuše,Armbrøst,Armbrust,Τόξο (Ηλεκτρικό),Arbalesto (venenaj sagoj),Ballesta (veneno),,Jousipyssy,Arbalète Empoisonée,Nyílpuska,Balestra ,クロスボウ,석궁 (맹독),Kruisboog,Armbrøst,Kusza,Besta,,Arbaletă,Арбалет,Самострел,Armborst,Arbalet,Арбалет -Assault Gun,TAG_ASSAULTGUN,,,,Útočná puška,Angrebsvåben,Sturmgewehr,,Sturmofusilo,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,Gépfegyver,Fucile d'Assalto ,アサルトガン,돌격소총,Aanvalswapen,Stormgevær,Karabin Szturmowy,Fuzil de Assalto,Arma de Assalto,Pușcă de Asalt,Штурмовая винтовка,Аутоматска пушка,Anfallspistol,Saldırı Silahı,Штурмова гвинтівка -Mini Missile Launcher,TAG_MMLAUNCHER,,,,Miniraketomet,Mini-missilkaster,Miniraketenwerfer,Μίνι-Πυραυλοβόλο,Misilet-pafilo,Minilanzamisiles,,Miniohjuslaukaisin,Lanceur de Mini-Missiles,Mini Rakétavető,Mini-Lanciamissili,ミニミサイルランチャー,미니 미사일 런쳐,Miniraketwerper,Mini rakettkaster,Wyrzutnia Minipocisków,Mini Lança-mísseis,,Mini Lansator de Proiectile,Мини-гранатомёт,Мини ракетни бацач,Mini missilkastare,Mini Füze Fırlatıcı,Міні-ракетниця -Flame Thrower,TAG_FLAMER,,,,Plamenomet,Flammekaster,Flammenwerfer,,Flamĵetilo,Lanzallamas,,Liekinheitin,Lance-Flammes,Lángszóró,Lanciafiamme ,火炎放射器,화염방사기,Vlammenwerper,Flammekaster,Miotacz Ognia,Lança-chamas,,Aruncător de Flăcări,Огнемёт,Бацеч пламена,Flamkastare,Alev Fırlatıcı,Вогнемет -Mauler,TAG_MAULER1,,,,Trhač,,Vernichter,,Polvigilo (normala),Triturador (dispersión),,Moukari,Broyeur,Marcangoló,Pestatore ,マウラー,마울러 (저출력),Toetakelaar,,Miażdżyciel,Desintegrador,,Sfâșietor,Истязатель,Маулер,,Parçalayıcı,Розсіювач -Mauler,TAG_MAULER2,,,,Trhač,,Vernichter,,Polvigilo (fortega),Triturador (torpedo),,Moukari,Broyeur,Marcangoló,Pestatore,マウラー,마울러 (고출력),Toetakelaar,,Miażdżyciel,Desintegrador,,Sfâșietor,Истязатель,Маулер,,Parçalayıcı,Розсіювач -Grenade Launcher,TAG_GLAUNCHER1,High-explosive grenade launcher,,,Granátomet,Granatkaster,Granatwerfer,,Grenadĵetilo (eksplodeg-pova),Lanzagranadas (conmoción),,Kranaatinheitin,Lance-Grenades Explosif,Gránátvető,Lanciagranate,グレネードランチャー,유탄발사기 (고폭탄),Granaatwerper,Granatkaster,Wyrzutnia Granatów,Lança-granadas,,Lansator de Grenade,Гранатомёт,Бацач граната,Granatkastare,El Bombası Fırlatıcı,Гранатомет -Grenade Launcher,TAG_GLAUNCHER2,White phosphorous grenade launcher ,,,Granátomet,Granatkaster,Granatwerfer,,Grenadĵetilo (fosfora),Lanzagranadas (fósforo),,Kranaatinheitin,Lance-Grenades Incendiaire,Gránátvető,Lanciagranate,グレネードランチャー,유탄발사기 (소이탄),Granaatwerper,Granatkaster,Wyrzutnia Granatów,Lança-granadas,,Lansator de Grenade,Гранатомёт,Бацач граната,Granatkastare,El Bombası Fırlatıcı,Гранатомет -Sigil,TAG_SIGIL,,,,Pečeť,,,,Sigelo,Emblema,,Sinetti,,Pecsét,Sigillo,シジル,시질,,,Pieczęć,Sigilo,,Sigiliu,Печать,Сигил,,,Сигіл -Coin,TAG_COIN,,,,Mince,Mønt,Münze,,Monero,Moneda,,Kolikko,Pièce,Érme,Moneta,コイン,동전,Munt,Mynt,Moneta,Moeda(s),,Monedă,Монета,Новчић,Mynt,Madeni Para,Монета -Med patch,TAG_MEDPATCH,,,,Obvazy,Medicinsk bandage,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinsk lapp,Bandaż,Compressa médica,,Trusă de Prim-Ajutor,Бинт,Прва помоћ,Medicinska plåster,Med yama,Оклюзійна пов'язка -Medical kit,TAG_MEDICALKIT,,,,Lékárnička,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit Médical,Orvosi Készlet,Kit di Pronto Soccorso ,医療キット,구급 키트,Medicijndoos,Medisinsk sett,Apteczka,Kit médico,,Kit de Prim-Ajutor,Аптечка,Медицински прибор,Medicinsk utrustning,Tıbbi kit,Індивідуальна аптечка -Surgery Kit,TAG_SURGERYKIT,,,,Chirurgická souprava,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kirurgilaukku,Kit de Chirurgie,Sebészeti Készlet,Kit Chirurgico ,手術キット,수술 키트,Chirurgiepakket,Kirurgisk sett,Zestaw Chirurga,Kit de Cirurgia,,Kit pentru Operații,Медкомплект,Хируршки прибор,Kirurgiskt kit,Ameliyat Kiti,Медичний кейс -Ring,TAG_BELDINSRING,,,,Prsten,,,,Ringo,Anillo,,Sormus,Anneau,Gyűrű,Anello ,指輪,반지,,,Pierścień,Anel,,Inel,Кольцо,Прстен,,Yüzük,Каблучка -Offering Chalice,TAG_OFFERINGCHALICE,,,,Obětní kalich,Offerkalk,Opferkelch,,Oferdona kaliko,Cáliz de ofrenda,,Uhrimalja,Calice d'Obole,Áldozati kehely,Calice delle Offerte,寄贈された聖杯,번제 성배,Offerbeker,Offerbeger,Kielich Ofiarny,Calice de Oferenda,,Potir pentru Ofrande,Чаша для подношений,Жртвени пехар,Offertkalke,Adak Kadehi,Чаша для жертвоприношення -Ear,TAG_EAR,,,,Ucho,Øre,Ohr,,Orelo,Oreja,,Korva,Oreille,Fül,Orecchio,耳,귀,Oor,Øre,Ucho,Orelha,,Ureche,Ухо,Уво,Öra,Kulak,Вухо -Broken Power Coupling,TAG_BROKENCOUPLING,,,,Rozbitá spojka,Brækket strømkobling,Defekter Stromabnehmer,,Rompita energia kuplilo,Acoplador de energía roto,,Rikkinäinen virtaliitin,Coupleur Energétique cassé,Elromlott Tápcsatlakozó,Coppia Energetica Rotta ,壊れたパワーカップリング,망가진 동력선,Gebroken stroomkoppeling,Ødelagt kraftkobling,Zepsute Obwody Zasilające,Acoplador de Energia Quebrado,Acoplador de Energia Partido,Cuplaj de Putere Defect,Повреждённая муфта,Неисправна спојница напајања,Trasig kraftkoppling,Kırık Güç Kaplini,Зламана силова муфта -Shadow Armor,TAG_SHADOWARMOR,,,Shadow Armour,Stínové brnění,Skygge rustning,Schattenrüstung,,Ombra armaĵo,Armadura de sombra,,Varjohaarniska,Armure de l'Ombre,Sötét Páncél,Armatura Ombra ,シャドウアーマー,그림자 갑옷,Schaduwharnas,Skygge rustning,Cienisty Pancerz,Armadura das Sombras,,Armura Umbrei,Теневая броня,Оклоп сенки,Skuggarmering,Gölge Zırhı,Тіньова броня -Environmental Suit,TAG_ENVSUIT,,,,Ochranný oblek,Miljømæssig dragt,Schutzanzug,,Medi-ŝirma vesto,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat,Védőöltözet,Tuta Ambientale ,耐環境スーツ,환경 방호복,Beschermend pak,Miljødrakt,Skafander Ochronny,Traje de Proteção,Fato Protetor,Costum de Protecție,Защитный костюм,Заштитно одело,Miljödräkt,Çevresel Takım,Захисний костюм -Guard Uniform,TAG_GUARDUNIFORM,,,,Hlídačova uniforma,Gardeuniform,Wächteruniform,,Gardista uniformo,Uniforme de guardia,,Vartijan univormu,Uniforme de Garde,Őr Egyenruha,Uniforme da Guardia,ガードの制服,경비 전투복,Wachtersuniform,Vaktuniform,Mundur Strażnika,Uniforme de Guarda,,Uniformă de Paznic,Униформа стражника,Стражарска униформа,Skyddsuniform,Bekçi Üniforması,Уніформа охоронця -Officer's Uniform,TAG_OFFICERSUNIFORM,,,,Důstojníkova uniforma,Officersuniform,Offiziersuniform,,Oficira uniformo,Uniforme de oficial,,Upseerin univormu,Uniforme d'Officier,Tiszti Egyenruha,Uniforme da Ufficiale ,士官の制服,장교 전투복,Officiersuniform,Offisersuniform,Mundur Oficera,Uniforme de Oficial,,Uniformă de Ofițer,Офицерская униформа,Официрска униформа,Officersuniform,Memur Üniforması,Уніформа офіцера -Flame Thrower Parts,TAG_FTHROWERPARTS,,,,Díly plamenometu,Dele til flammekasteren,Flammenwerferteile,,Partoj de flamjetilo,Partes de lanzallamas,,Liekinheittimen osat,Pièces de Lance-Flamme,Lángszóró Alkatrészek,Parti di Lanciafiamme ,火炎放射器の部品,화염방사기 부품,Vlammenwerperonderdelen,Deler til flammekaster,Części Miotacza Ognia,Partes do lança-chamas,,Bucăți de Aruncător de Flăcări,Детали огнемёта,Делови бацача пламена,Delar till flamkastaren,Alev Püskürtücü Parçaları,Деталі для вогнемету -Report,TAG_REPORT,,,,Hlášení,Rapport,,,Raporto,Reporte,,Raportti,Compte-rendu,Jelentés,Rapporto ,報告書,보고서,Verslag,Rapport,Raport,Relatório,,Raport,Отчёт,Извештај,Rapportera,Rapor,Звіт -Info,TAG_INFO,,,,Informace,,,,Informoj,Información,,Tiedot,,Információ,Informazioni ,情報,정보,,Informasjon,Informacje,Informação,,Informație,Сводка,Инфо,,Bilgi,Дані -Targeter,TAG_TARGETER,,,,Zaměřovač,,Zielhilfe,,Celilo,Mira de arma,,Tähtäinlaite,Cibleur,Célzó eszköz,Puntatore,照準器,조준기,Richter,,Namierzacz,Mira,,Țintitor,Целеуказатель,Нишанџија,,Hedefleme cihazı,Цілевказівник -Communicator,TAG_COMMUNICATOR,,,,Komunikátor,Kommunikator,Kommunikator,,Interfono,Intercomunicador,,Viestintälaite,Communicateur,Kommunikátor,Comunicatore ,コミュニケーター,연락장치,,Kommunikator,Komunikator,Comunicador,,Comunicator,Передатчик,Комуникатор,Kommunikator,İletişimci,Комунікатор -Degnin Ore,TAG_DEGNINORE,,,,Degninská ruda,Degnin malm,Degnin-Erz,,Degnina minaĵo,Mineral de Degnin,,Degnin-malmi,Minerai de Degnin,Degnin Érc,Minerale Degnin,デグニン鉱石,데그닌 광석,Degnin-erts,Degnin malm,Ruda Degninu,Minério Degnin,,Minereu de Degnir,Денгинская руда,Дегнинска руда,Degnin Malm,Degnin Cevheri,Дегінська руда -Accuracy,TAG_GUNTRAINING,,,,Přesnost,Nøjagtighed,Präzision,,Akurateco,Precisión,,Tarkkuus,Précision,Pontosság,Precisione,精度,정확도,Nauwkeurigheid,Nøyaktighet,Precyzja,Precisão,,Acuratețe,Меткость,Прецизност,Noggrannhet,Doğruluk,Точність -Toughness,TAG_HEALTHTRAINING,,,,Tvrdost,Robusthed,Ausdauer,,Forteco,Dureza,,Sitkeys,Endurance,Kitartás,Robustezza ,タフネス,힘,Stevigheid,Seighet,Wytrzymałość,Força,,Rezistență,Живучесть,Издржљивост,Seghet,Sertlik,Стійкість -Scanner,TAG_SCANNER,,,,Skener,,,,Skanilo,Escáner,,Skanneri,Analyseur,Szkenner,Scanner,スキャナー,탐지기,Scanner,Skanner,Skaner,Scanner,,Scanner,Сканер,Скенер,Scanner,Tarayıcı,Сканер -Prison Pass,TAG_PRISONPASS,,,,Propustka do vězení,Fængselspas,Gefängnispass,,Mallibereja pasilo,Pase a la prisión,,Vankilan pääsylupa,Passe de la Prison,Börtön Engedély,Lasciapassare Prigione ,刑務所の許可証,감옥 통행증,Gevangenispas,Fengselspass,Przepustka do Więzienia,Passe da Prisão,,Legitimația pentru Închisoare,Пропуск в тюрьму,Затворска пропусница,Fängelsepass,Hapishane Kartı,Тюремний пропуск -Alarm,TAG_ALARM,,,,,,,,Alarmo,Alarma,,Hälytys,Alarme,Riasztó,Allarme ,警報,알람,,,,Alarme,,Alarmă,Тревога,Аларм,Larm,,Тривога -Ammo,TAG_AMMOFILLUP,,,,Munice,Munition,Munition,,Municio,Munición,,Ammukset,Munitions,Lőszer,Munizioni ,弾薬,탄약,Munitie,Ammunisjon,Amunicja,Munição,,Muniție,Боеприпасы,Муниција,Ammunition,Cephane,Набої -Health,TAG_HEALTHFILLUP,,,,Zdraví,Sundhed,Gesundheit,,Sano,Salud,,Terveys,Santé,Életerő,Salute ,体力,체력,Gezondheid,Helse,Zdrowie,Saúde,,Sănătate,Здоровье,Живот,Hälsa,Sağlık,Здоров'я -Teleporter Beacon,TAG_TELEPORTERBEACON,,,,Teleportační maják,Teleportør-bakke,Teleportersignal,,Teleportil-signalilo,Baliza de teletransporte,,Kaukosiirrinmajakka,Balise de téléportation,Teleport Vészfény,Radiofaro per Teletrasporto ,テレポータービーコン,텔레포터 비콘,Teleporterbaken,Teleporter Beacon,Nadajnik Teleportera,Sinalizador para Teletransporte,,Lumină pentru Teleportor,Телепортационный маяк,Одашиљач за телепортовање,Teleporterfyr,Işınlayıcı İşaretçisi,Пристрій телепортації -Metal Armor,TAG_METALARMOR,,,Metal Armour,Kovové brnění,Metal rustning,Metallrüstung,,Metala armaĵo,Armadura de metal,,Metallihaarniska,Armure en Métal,Fém Páncél,Armatura di Metallo ,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowy Pancerz,Armadura de Metal,,Armură din Metal,Металлическая броня,Метални оклоп,Metall rustning,Metal Zırh,Металічна броня -Leather Armor,TAG_LEATHER,,,Leather Armour,Kožené brnění,Læderpanser,Lederrüstung,,Leda armaĵo,Armadura de cuero,,Nahkasuojus,Armure en Cuir,Bőr Páncél,Armatura di Cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Lær rustning,Skórzany Pancerz,Armadura de Couro,,Armură din Piele,Кожаная броня,Кожни оклоп,Läderrustning,Deri Zırh,Шкіряна броня -HE-Grenade Rounds,TAG_HEGRENADES,,,,Výbušné granáty,HE-granater,HE-Granaten,,Eksplodeg-povaj grenadoj,Granadas de conmoción,,Räjähdekranaatit,Grenades Explosives,Gránát Lőszer,Granata HE,HEグレネード弾,고폭 유탄,HE-granaten,HE-Granater,Wiązka Granatów,Munição - Granadas Explosivas,,Grenade Explozive,Осколочные гранаты,Хе-Граната чауре,HE-granater,HE-Bomba Mermileri,В'язка гранат -Phosphorus-Grenade Rounds,TAG_PHGRENADES,,,,Fosforové granáty,Fosforgranater,Phosphorgranaten,,Fosforaj grenadoj,Granadas de fósforo,,Fosforikranaatit,Grenades Incendiaires,Foszfor-Gránát Lőszer,Granata al Fosforo ,白リングレネード弾,소이 유탄,Fosforgranaten,Fosforgranater,Wiązka Fosforowych Granatów,Municão - Granadas de Fósforo,,Grenade cu Fosfor,Фосфорные гранаты,Фосфорне гранате,Fosforgranater,Fosforlu El Bombası Mermileri,В'язка фосфорних гранат. -Clip of Bullets,TAG_CLIPOFBULLETS,,,,Zásobník s náboji,Kugleklip,Gewehrmunition,,Magazeno,Cargador de balas,,Luotilipas,Chargeur d'Assaut,Golyó töltények,Caricatore di Proiettili ,弾丸のクリップ,소총 탄창,Patroon kogels,Klipp av kuler,Magazynek,Carregador de Balas,,Cartuș cu Gloanțe,Обойма,Клип метака,Kulor i klipp,Kurşun Klipsi,Набійниця -Ammo,TAG_BOXOFBULLETS,,,,Krabice nábojů,Munition,Munitionskiste,,Munici-kesto,Caja de municiones,,Luotilaatikko,Bôite de Munitions,Lőszer,Munizioni ,弾薬箱,탄약,Munitie,Ammunisjon,Amunicja,Caixa de Balas,,Muniție,Боеприпасы,Муниција,Ammunition,Cephane,Набої -Mini Missiles,TAG_MINIMISSILES,,,,Minirakety,Mini missiler,Miniraketen,,Misiletoj,Minimisiles,,Miniohjukset,Mini-Missiles,Mini Rakéták,Mini-Missili,ミニミサイル,미니 미사일,Mini-raketten,Mini missiler,Mini Pociski,Mísseis,,Mini Proiectile,Мини-ракеты,Мини Ракете,Miniraketer,Mini Füzeler,Міні-ракети -Crate of Missiles,TAG_CRATEOFMISSILES,,,,Bedna raket,kasse med missiler,Raketenkiste,,Misilet-kesto,Caja de minimisiles,,Ohjuslaatikko,Caisse de Mini-Missiles,Ládányi Rakéta,Cassa di Missili,ミサイルの箱,미사일 박스,Krat raketten,Kasse med missiler,Skrzynia z Pociskami,Caixa de Mísseis,,Ladă cu Proiectile,Коробка ракет,Кутија ракета,Låda med missiler,Füze Sandığı,Ящик мініракет -Energy Pod,TAG_ENERGYPOD,,,,Energetický kokón,Energipod,Energiezelle,,Energi-kapsulo,Cápsula de energía,,Energia-akku,Cellule Energétique,Energia Lőszer,Nucleo Enegetico ,エネルギーポット,에너지 포드,Energiecel,Energikapsel,Kapsuła Energii,Energia (pequeno),,Capsulă cu Energie,Энергоячейка,Енергетска шипка,Energipod,Enerji Bölmesi,Енерго-капсула -Energy Pack,TAG_ENERGYPACK,,,,Energetický svazek,Energipakke,Energiepack,,Pako de energio,Paquete de energía,,Energiapaketti,Pack Energétique,Energia Csomag,Carica Energetica ,エネルギーパック,에너지 팩,Energiepak,Energipakke,Zasobnik Energii,Energia (grande),,Pachet cu Energie,Энергобатарея,Паковање енергије,Energipaket,Enerji Paketi,Енерго-батарея -Poison Bolts,TAG_POISONBOLTS,,,,Otrávené šípy,Giftige bolte,Giftbolzen,,Venenaj sagoj,Flechas venenosas,,Myrkkynuolet,Carreaux Empoisonnés,Mérgező hegyek,Dardi Velenosi ,ポイズンボルト,맹독 볼트,Giftige bouten,Giftbolter,Zatrute Bełty,Setas Envenenadas,,Bolțuri cu Otravă,Отравленные болты,Отровне стреле,Giftiga bultar,Zehirli Cıvatalar,Отруйні болти -Electric Bolts,TAG_ELECTRICBOLTS,,,,Elektrické šípy,Elektriske bolte,Elektrische Bolzen,,Elektraj sagoj,Flechas eléctricas,,Sähkönuolet,Carreaux Electriques,Elektromos hegyek,Dardi Elettrici ,エレクトリックボルト,전격 볼트,Elektrische bouten,Elektriske bolter,Elektryczne Bełty,Setas Elétricas,,Bolțuri cu Electricitate,Электрические болты,Електричне стреле,Elektriska bultar,Elektrikli Cıvatalar,Електричні болти -Ammo Satchel,TAG_AMMOSATCHEL,,,,Brašna na munici,Ammo Satchel,Munitionstasche,,Sako da municioj,Bolso de municiones,,Ammuslaukku,Sacoche à munitions,Lőszeres táska,Borsa di Munizioni ,弾薬鞄,탄약 배낭,Munitietassen,Ammunisjonsveske,Torba z Amunicją,Bolsa de Munição,,Sacoșă cu Muniție,Ранец боеприпасов,Торбица муниције,Ammo Satchel,Cephane Çantası,Сумка для набоїв -Base Key,TAG_BASEKEY,,,,Klíč od základny,Basisnøgle,Basisschlüssel,,Bazoŝlosilo,Llave de la base,,Tukikohdan avain,Clé de la base,Bázis Kulcs,Chiave della Base,,기지 키,Basissleutel,Basenøkkel,Klucz do Bazy,Chave da Base,,Cheia Bazei,Ключ от базы,Кључ базе,Basnyckel,Temel Anahtar,Ключ від бази -Govs Key,TAG_GOVSKEY,,,,Klíč ke guvernérovi,Govs nøgle,Gouverneursschlüssel,,Ŝlosilo de registo,Llave Gobernador,,Kuvernöörin avain,Clé du Gouverneur,Kormányzó Kulcs,Chiave del Governatore ,,총독의 키,Gouverneursleutel,Regjeringsnøkkel,Klucz Gubernatora,Chave do Governador,,Cheia Guvernatorului,Ключ губернатора,Гувернеров кључ,Govs-nyckel,Govs Anahtar,Ключ губернатора -Passcard,TAG_PASSCARD,,,,Vstupní karta,Adgangskort,Zugangskarte,,Central-ŝlosilo,Llave de la central,,Avainkortti,Passe,Belépőkártya,Tessera Lasciapassare ,,통행 카드,Paspoortkaart,Adgangskort,Karta Dostępu,Cartão de Acesso,,Legitimație,Пропуск,Пропусница,Passerkort,Geçiş kartı,Карта доступу -ID Badge,TAG_IDBADGE,,,,Identifikační odznak,ID-badge,Identitätskarte,,Mallibereja insigno,Insignia de prisión,,Henkilötunniste,Badge d'Identification,Azonosító Jelvény,Distintivo ,,신분 휘장,ID-Badge,ID-badge,Odznaka Identyfikacyjna,Crachá de Identificação,,Ecuson de Identificare,Личная карта,Идентификациона значка,ID-bricka,Kimlik Rozeti,Бейджик -Prison Key,TAG_PRISONKEY,,,,Klíč od věznice,Fængselsnøgle,Gefängnisschlüssel,,Mallibereja ŝlosilo,Llave de la prisión,,Vankilan avain,Clé de la Prison,Börtön Kulcs,Chiave della Prigione ,,감옥 키,Gevangenissleutel,Fengselsnøkkel,Klucz do Więzienia,Chave da Prisão,,Cheia Închisorii,Ключ от тюрьмы,Кључ од 3атвора,Fängelsenyckel,Hapishane Anahtarı,Ключ від тюрми -Severed Hand,TAG_SEVEREDHAND,,,,Useknutá ruka,Afskåret hånd,Abgetrennte Hand,,Amputita mano,Mano amputada,,Katkennut käsi,Main coupée,Levágott Kéz,Mano Mozzata,,잘린 손목,Gescheurde Hand,Avkuttet hånd,Odcięta Ręka,Mão Decepada,Mão Desmenbrada,Mână Retezată,Отрезанная рука,Одвојена шака,Avskuren hand,Kesik El,Відрізана рука -Power1 Key,TAG_POWER1KEY,,,,Klíč od elektrárny 1,Power1 nøgle,Kraftwerksschlüssel 1,,Central-identigo 1,Ident. central nv. 1,,Voimalan 1-avain,Clé Power1,1. erő kulcs,Chiave della Centrale 1,,발전소 1호 키,1e Machtsleutel,Power1-nøkkel,Klucz do Elektrowni 1,Chave da Usina 1,Chave Energética 1,Cheia Putere1,Ключ ЭС №1,Кључ од ел. 1,Kraftnyckel 1,Güç1 Anahtarı,Ключ від електростанції 1 -Power2 Key,TAG_POWER2KEY,,,,Klíč od elektrárny 2,Power2-nøgle,Kraftwerksschlüssel 2,,Central-identigo 2,Ident. central nv. 2,,Voimalan 2-avain,Clé Power2,2. erő kulcs,Chiave della Centrale 2,,발전소 2호 키,2e Machtsleutel,Power2-nøkkel,Klucz do Elektrowni 2,Chave da Usina 2,Chave Energética 2,Cheia Putere2,Ключ ЭС №2,Кључ од ел. 2,Kraftnyckel 2,Güç2 Anahtarı,Ключ від електростанції 2 -Power3 Key,TAG_POWER3KEY,,,,Klíč od elektrárny 3,Power3-nøgle,Kraftwerksschlüssel 3,,Central-identigo 3,Ident. central nv. 3,,Voimalan 3-avain,Clé Power3,3. erő kulcs,Chiave della Centrale 3,,발전소 3호 키,3e Machtsleutel,Power3-nøkkel,Klucz do Elektrowni 3,Chave da Usina 3,Chave Energética 3,Cheia Putere3,Ключ ЭС №3,Кључ од ел. 3,Kraftnyckel 3,Güç3 Anahtarı,Ключ від електростанції 3 -Gold Key,TAG_GOLDKEY,,,,Zlatý klíč,Guldnøgle,Goldschlüssel,,Ora ŝlosilo,Llave dorada,,Kulta-avain,Clé en Or,Aranykulcs,Chiave Dorata,,황금 키,Gouden sleutel,Gullnøkkel,Złoty Klucz,Chave de Ouro,,Cheia din Aur,Золотой ключ,Златни кључ,Guldnyckel,Altın Anahtar,Золотий ключ -ID Card,TAG_IDCARD,,,,Identifikační karta,ID-kort,Ausweis,,Kloaka identigilo,Identif. cloacas,,Henkilökortti,Carte d'Identité,Azonosító Kártya,Tessera Identificativa,,신분증,ID-Kaart,ID-kort,Karta Identyfikacyjna,Cartão de Identificação,,Card de Identitate,Удостоверение,Лична карта,ID-kort,Kimlik Kartı,Ідентифікаційна карта -Silver Key,TAG_SILVERKEY,,,,Stříbrný klíč,Sølvnøgle,Silberschlüssel,,Arĝenta ŝlosilo,Llave plateada,,Hopea-avain,Clé en Argent,Ezüst Kulcs,Chiave Argentata,,은 키,Zilveren sleutel,Sølv-nøkkel,Srebrny Klucz,Chave de Prata,,Cheia din Argint,Серебряный ключ,Сребрни кључ,Silvernyckel,Gümüş Anahtar,Срібний ключ -Oracle Key,TAG_ORACLEKEY,,,,Věštcův klíč,Orakel-nøgle,Orakelschlüssel,,Orakolo-ŝlosilo,Llave del Oráculo,,Oraakkelin avain,Clé de l'Oracle,Orákulum kulcs,Chiave dell'Oracolo ,,오라클 키,Orakelsleutel,Oracle-nøkkel,Klucz do Wyroczni,Chave do Oráculo,,Cheia Oracol,Ключ Оракула,Пророков кључ,Oracle-nyckel,Kahin Anahtarı,Ключ Оракула -Military ID,TAG_MILITARYID,,,,Vojenské ID,Militær ID,Militärausweis,,Milita identigilo,Identif. militar,,Sotilastunnus,Identification Militaire,Katonai Azonosító Kártya,Identificativo Militare,,군용 아이디,Militaire ID,Militær ID,Wojskowy Identyfikator,ID Militar,,Legitimație Militară,Удостовер. военного,Војна идентификација,Militärt ID,Askeri Kimlik,Військова ID карта -Order Key,TAG_ORDERKEY,,,,Klíč Řádu,Bestillingsnøgle,Ordensschlüssel,,Ordena ŝlosilo,Llave de La Orden,,Veljeskunnan avain,Clé de l'Ordre,Rend Kulcs,Chiave dell'Ordine,,오더의 키,Ordesleutel,Bestillingsnøkkel,Klucz Zakonu,Chave da Ordem,,Cheia Ordinului,Ключ Ордена,Кључ одреда,Beställningsnyckel,Sipariş Anahtarı,Ключ Ордену -Warehouse Key,TAG_WAREHOUSEKEY,,,,Klíč ke skladu,Lagernøgle,Lagerhausschlüssel,,Magazena ŝlosilo,Llave del almacén,,Varaston avain,Clé de l'Entrepôt,Raktár Kulcs,Chiave del Magazzino ,,창고 키,Magazijnsleutel,Lagernøkkel,Klucz do Magazynu,Chave do Armazém,,Cheia Depozitului,Ключ от склада,Кључ складишта,Lagernyckel,Depo Anahtarı,Ключ від складу -Brass Key,TAG_BRASSKEY,,,,Mosazný klíč,Messingnøgle,Messingschlüssel,,Latuna ŝlosilo,Llave de latón,,Messinkiavain,Clé en Bronze,Réz Kulcs,Chiave d'Ottone ,,황동 키,Messing sleutel,Messingnøkkel,Mosiężny Klucz,Chave de Latão,,Cheia din Alamă,Латунный ключ,Кључ од месинга,Mässingsnyckel,Pirinç Anahtar,Латунний ключ -Red Crystal Key,TAG_REDCRYSTALKEY,,,,Červený krystalový klíč,Rød krystalnøgle,Roter Kristallschlüssel,,Ruĝkristala ŝlosilo,Llave cristal rojo,,Punainen kristalliavain,Clé de Cristal Rouge,Piros Kristály Kulcs,Chiave di Cristallo Rosso ,,적색 크리스탈 키,Rode kristallen sleutel,Rød krystallnøkkel,Czerwony Kryształowy Klucz,Chave de Cristal Vermelho,,Cheia din Cristal Roșu,Крас. ключ-кристалл,Кључ од црвеног кристала,Nyckel i röd kristall,Kırmızı Kristal Anahtar,Червоний кристальний ключ -Blue Crystal Key,TAG_BLUECRYSTALKEY,,,,Modrý krystalový klíč,Blå krystalnøgle,Blauer Kristallschlüssel,,Blukristala ŝlosilo,Llave cristal azul,,Sininen kristalliavain,Clé de Crisal Bleu,Kék Kristály Kulcs,Chiave di Cristallo Blu,,청색 크리스탈 키,Blauwe kristallen sleutel,Blå krystallnøkkel,Niebieski Kryształowy Klucz,Chave de Cristal Azul,,Cheia din Cristal Albastru,Син. ключ-кристалл,Кључ од плавог кристала,Blå kristallnyckel,Mavi Kristal Anahtar,Синій кристальний ключ -Chapel Key,TAG_CHAPELKEY,,,,Klíč od kaple,Kapel nøgle,Kapellenschlüssel,,Kapelo-ŝlosilo,Llave de la Capilla,,Kappelin avain,Clé de la Chapelle,Kápolna Kulcs,Chiave della Cappella ,,예배당 키,Kappelsleutel,Kapell-nøkkel,Klucz do Kaplicy,Chave da Capela,,Cheia Capelei,Ключ от часовни,Кључ капеле,Kapellnyckel,Şapel Anahtarı,Ключ від каплиці -Catacomb Key,TAG_CATACOMBKEY,,,,Klíč do katakomb,Katakomb Nøgle,Katakombenschlüssel,,Katakomb-ŝlosilo,Llave Catacumbas,,Katakombin avain,Clé des Catacombes,Katakomba Kulcs,Chiave delle Catacombe ,,고대 묘지 키,Catacombesleutel,Katakomb-nøkkel,Klucz do Katakumb,Chave da Catacumba,,Cheia Catacombei,Ключ от катакомб,Кључ од катакомби,Katakomb-nyckel,Katakomb Anahtarı,Ключ від катакомб -Security Key,TAG_SECURITYKEY,,,,Klíč ochranky,Sikkerhedsnøgle,Sicherheitsschlüssel,,Sekureco-ŝlosilo,Llave de Seguridad,,Turvamiesavain,Clé de la Sécurité,Biztonsági Kulcs,Chiave della Sicurezza ,,보안 키,Beveiligingssleutel,Sikkerhetsnøkkel,Klucz Ochrony,Chave de Segurança,,Cheia Securității,Ключ охраны,Сигурносни кључ,Säkerhetsnyckel,Güvenlik Anahtarı,Ключ охорони -Core Key,TAG_COREKEY,,,,Klíč k jádru,Reaktor Nøgle,Reaktorschlüssel,,Kernoŝlosilo,Llave del Núcleo,,Ytimen avain,Clé du Réacteur,Mag Kulcs,Chiave del Nucleo,,중심부 키,Kernsleutel,Kjernenøkkel,Klucz do Rdzenia,Chave do Núcleo,,Cheia Nucleului,Ключ от реактора,Кључ језгра,Kärnnyckel,Çekirdek Anahtar,Ключ від реактора -Mauler Key,TAG_MAULERKEY,,,,Klíč k trhačům,Mauler-nøgle,Vernichterschlüssel,,Polvigilo-ŝlosilo,Llave Triturador,,Moukarin avain,Clé du Broyeur,Marcangoló Kulcs,Chiave del Pestatore ,,마울러 키,Toetakelaarssleutel,Mauler-nøkkel,Klucz do Magazynu Miażdżycieli,Chave - Mauler,,Cheia Sfâșietorului,Ключ истязателя,Маулер кључ,Mauler-nyckel,Mauler Anahtar,Ключ розсіювача -Factory Key,TAG_FACTORYKEY,,,,Klíč do továrny,Fabriksnøgle,Fabrikschlüssel,,Fabriko-ŝlosilo,Llave de la Fábrica,,Tehtaan avain,Clé de l'Usine,Gyár Kulcs,Chiave della Fabbrica ,,공장 키,Fabriekssleutel,Fabrikknøkkel,Klucz do Fabryki,Chave da Fábrica,,Cheia Fabricii,Ключ от фабрики,Кључ фабрике,Fabriksnyckel,Fabrika Anahtarı,Ключ від фабрики -Mine Key,TAG_MINEKEY,,,,Klíč od dolů,Mine-nøgle,Minenschlüssel,,Minejo-ŝlosilo,Llave de la Mina,,Kaivoksen avain,Clé de la Mine,Bánya Kulcs,Chiave della Miniera ,,탄광 키,Mijnsleutel,Gruve-nøkkel,Klucz do Kopalni,Chave da Mina,,Cheia Minei,Ключ от шахт,Кључ рудника,Gruvnyckel,Maden Anahtarı,Ключ від шахт -New Key5,TAG_NEWKEY5,,,,Nový klíč 5,Ny nøgle5,Neuer Schlüssel 5,,Nova ŝlosilo kvin,Llave nueva cinco,,Uusi 5-avain,Clé nouveau 5,5. kulcs,Nuova Chiave 5,,새로운 키5,Nieuwe sleutel 5,Ny nøkkel5,Nowy Klucz5,Chave Nova 5,,Noua Cheie5,Новый ключ №5,Нови кључ5,Ny nyckel5,Yeni Anahtar5,Новий ключ 5 -Oracle Pass,TAG_ORACLEPASS,,,,Věštcova propustka,Orakelpas,Orakelpass,,Orakolo-pasilo,Pase del Oráculo,,Oraakkelin kulkulupa,Passe de l'Oracle,Orákulum útlevél,Lasciapassare dell'Oracolo ,,오라클의 통행증,Orakelpas,Oracle Pass,Przepustka Wyroczni,Passe do Oráculo,,Legitimația Oracol,Пропуск Оракула,Пророкова пропусница,Orakelpass,Kahin Kartı,Пропуск Оракула -10 gold,TAG_10GOLD,,,,10 zlatých,10 guld,,,10 da oro,10 de oro,,10 kolikkoa,10 Pièces,10 arany,10 pezzi d'oro ,10ゴールド,10 골드,10 goud,10 gull,10 monet,10 moedas,10 moedas de ouro,10 monezi de aur,10 золотых,10 златника,10 guld,10 altın,10 золотих -25 gold,TAG_25GOLD,,,,25 zlatých,25 guld,,,25 da oro,25 de oro,,25 kolikkoa,25 Pièces,25 arany,25 pezzi d'oro ,25ゴールド,25 골드,25 goud,25 gull,25 monet,25 moedas,25 moedas de ouro,25 de monezi de aur,25 золотых,25 златника,25 guld,25 altın,25 золотих -50 gold,TAG_50GOLD,,,,50 zlatých,50 guld,,,50 da oro,50 de oro,,50 kolikkoa,50 Pièces,50 arany,50 pezzi d'oro ,50ゴールド,50 골드,50 goud,50 gull,50 monet,50 moedas,50 moedas de ouro,50 de monezi de aur,50 золотых,50 златника,50 guld,50 altın,50 золотих -300 gold,TAG_300GOLD,,,,300 zlatých,300 guld,,,300 da oro,300 de oro,,300 kolikkoa,300 Pièces,300 arany,300 pezzi d'oro ,300ゴールド,300 골드,300 goud,300 gull,300 monet,300 moedas,300 moedas de ouro,300 de monezi de aur,300 золотых,300 златника,300 guld,300 altın,300 золотих -Person,TXT_PERSON,,,,Osoba,,,,Persono,Persona,,Henkilö,Personne,Személy,Persona,一員,민간인,Persoon,,Osoba,Pessoa,,Persoană,Горожанин,Особа,Person,Kişi,Цивільний -Acolyte,TAG_ACOLYTE,,,,Akolyta,Akolyt,Ministrant,,Akolito,Acólito,,Akoluutti,,Ministráns,Accolito ,アコライト,아콜라이트,Acoliet,Akolytt,Akolita,Acólito,,Acolit,Служитель,Следбеник,Akolyt,Yardımcı,Адепт -Armorer,TAG_ARMORER,,,Armourer,Kovář,Våbendør,Rüster,,Armilisto,Armero,,Asemestari,Armurier,Páncélkovács,Armaiolo ,装甲,병기공,Harnassmid,Våpensmed,Płatnerz,Armeiro,,Armurier,Продавец брони,Ковач,Rusthållare,Zırhçı,Коваль -Bar Keep,TAG_BARKEEP,,,,Výčepní,Bar-værn,Wirt,,Drinkejestro,Cantinero,,Baarimikko,Barman,Csapos,Barista,酒屋,바텐더,Barman,Bartender,Barman,Dono do Bar,,Barman,Хозяин таверны,Конобар,Bartender,Barmen,Бармен -Beggar,TAG_BEGGAR,,,,Žebrák,Tigger,Bettler,,Almozulo,Mendigo,,Kerjäläinen,Mendiant,Koldus,Mendicante ,乞食,거지,Bedelaar,Tigger,Żebrak,Mendigo,,Sărman,Нищий,Просјак,Tiggare,Dilenci,Жебрак -Macil,TAG_MACIL1,,,,,,,,,,,,,,,マシル,마실,,,,,,,Мэйсил,Мејсил,,Macil,Масіл -Macil,TAG_MACIL2,,,,,,,,,,,,,,,マシル,마실,,,,,,,Мэйсил,Мејсил,,Macil,Масіл -Medic,TAG_MEDIC,,,,Medik,Læge,Sanitäter,,Kuracisto,Médico,,Lääkintämies,Médecin,Szanitéc,Medico,メディック,의무관,Paramedicus,,Medyk,Médico,,,Врач,Болничар,Sjukvårdare,,Лікар -Oracle,TAG_ORACLE,,,,Věštec,Orakel,Orakel,,Orakolo,Oráculo,,Oraakkeli,,Orákulum,Oracolo,オラクル,오라클,Orakel,Orakel,Wyrocznia,Oráculo,,Oracol,Оракул,Пророк,Orakel,Kahin,Оракул -Priest,TAG_PRIEST,,,,Kněz,Præst,Priester,,Pastro,Sacerdote,,Pappi,Prêtre,Pap,Sacerdote,プリースト,성직자,Priester,Prest,Kapłan,Sacerdote,,Preot,Жрец,Свештеник,Präst,Rahip,Священник -Rat Buddy,TAG_RATBUDDY,,,,Krysík,Rottekammerat,Ratte,,Rato,Rata,,Rottakamu,Copain Rat,Patkánypajtás,Ratto,ラット バディ,생쥐 친구,Rattenvriendje,Rottekompis,Koleżka Szczurów,Rato,,Amicul Șobolanilor,Крыса-друг,Друг пацов,Råttkompis,Sıçan Dostu,Друзяка щур -Rebel,TAG_REBEL,,,,,,Rebell,,Ribelanto,Rebelde,,Kapinallinen,Rebelle,Lázadó,Ribelle ,反乱軍,저항군,,Rebell,Rebeliant,Rebelde,,,Повстанец,Побуњеник,Rebell,Asi,Повстанець -Templar,TAG_TEMPLAR,,,,Templář,Tempelridder,Templer,,Templano,Templario,,Temppeliherra,Templier,Templomos,Templare ,騎士団員,템플러,Tempelier,Tempelridder,Templariusz,Templário,,Templier,Храмовник,Темплар,Tempelriddare,Tapınakçı,Тамплієр -Weapon Smith,TAG_WEAPONSMITH,,,,Zbraňmistr,Våbensmed,Waffenschmied,,Armilforĝisto,Forjador de armas,,Aseseppä,Forgeron,Fegyverkovács,Fabbro ,武器工,무기 제조상,Wapensmid,Våpensmed,Wytwórca Broni,Ferreiro,,Făurar,Оружейник,Ковач оружја,Vapensmed,Silah Ustası,Зброяр -Red Talisman,TAG_TALISMANRED,,,,Červený talisman,Rød Talisman,Roter Talisman,,Ruĝa Talismano,Talismán rojo,,Punainen talismaani,Talisman Rouge,Vörös Talizmán,Talismano rosso,赤の魔除け,붉은 부적,Rode Talisman,Rød talisman,Czerwony Talizman,Talismã Vermelho,,Talisman Roșu,Красный талисман,Црвени талисман,Röd talisman,Kızıl Tılsım,Червоний талісман -Green Talisman,TAG_TALISMANGREEN,,,,Zelený talisman,Grøn Talisman,Grüner Talisman,,Verda Talismano,Talismán verde,,Vihreä talismaani,Talisman Vert,Zöld Talizmán,Talismano verde,緑の魔除け,녹색 부적,Groene Talisman,Grønn talisman,Zielony Talizman,Talismã Verde,,Talisman Verde,Зелёный талисман,Зелени талисман,Grön Talisman,Yeşil Tılsım,Зелений талісман -Blue Talisman,TAG_TALISMANBLUE,,,,Modrý talisman,Blå Talisman,Blauer Talisman,,Blua Talismano,Talismán azul,,Sininen talismaani,Talisman Bleu,Kék Talizmán,Talismano blu,青の魔除け,푸른 부적,Blauwe Talisman,Blå talisman,Niebieski Talizman,Talismã Azul,,Talisman Albastru,Синий талисман,Плави талисман,Blå Talisman,Mavi Tılsım,Синій талісман -,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,, -%o was zealously shot down by an Acolyte.,OB_ACOLYTE,,,,%o byl@[ao_cs] horlivě zastřelen@[ao_cs] akolytou.,%o blev skudt ned af en akolyt.,%o wurde eifrig von dem Ministranten erschossen.,,%o fervore pafiĝis de Akolito.,A %o l@[ao_esp] ha derribado con fervor un Acólito.,A %o l@[ao_esp] derribó con entusiasmo un Acólito.,%o joutui kiivailevan akoluutin ampumaksi.,%o a souffert d'une bavure policière.,%o-t buzgó módon le lett lőve egy Oltárszolga által.,%o è stato zelantemente abbattuto da un accolito. ,%o は熱心なアコライトに堕とされた。,%o 은(는) 아콜라이트에게 맹신적으로 사격 당했다.,%o werd gretig neergeschoten door een Acoliet.,%o ble nidkjært skutt ned av en akolytt.,%o został@[ao_pl] żarliwie zastrzelon@[adj_pl] przez Akolitę.,%o foi zelosamente abatid@[ao_ptb] por um Acólito.,,%o a fost împușcat zelos de un Acolit.,Игрок %o фанатично убит служителем.,%o је ревносно упуцан@[adj_1_sr] од стране секташа.,%o blev nitiskt nedskjuten av en akolyt.,"%o, bir yardımcısı tarafından gayretle vuruldu.",Адепт пристрелив %o. -%o should have never rebelled against Macil.,OB_MACIL,,,,%o se nikdy neměl@[ao_cs] vzbouřit vůči Macilovi.,%o skulle aldrig have gjort oprør mod Macil.,%o hätte nicht gegen Macil rebellieren sollen.,,%o ne estus devinta ribeli kontraŭ Macil.,%o no debería haberse rebelado contra Macil.,%o hizo mal en rebelarse contra Macil.,%o paran ei olisi ikinä pitänyt kapinoida Macilia vastaan.,%o n'aurait jamais du se rebeller contre Macil.,%o Macil ellen próbált fellázadni.,%o non avrebbe mai dovuto opporsi a Macil. ,%o はマシルに歯向かうべきではなかった。,%o 은(는) 마실의 적이 되지 말았어야 했다.,%o had nooit in opstand mogen komen tegen Macil.,%o skulle aldri ha gjort opprør mot Macil.,%o nie powin@[irreg_5_pl] buntować się przeciwko Macilowi.,%o nunca deveria ter se rebelado contra Macil.,%o nunca deveria ter se rebeliado contra Macil.,"%o nu ar fi trebuit să se răscoale împotriva lui +de la Orakolo!",¡Necesitas el pase del Oráculo!,,Tarvitset Oraakkelin passin,Vous avez besoin du passe Oracle!,,Az Orákulum Engedélyére van szükséged!,Hai bisogno del pass dell'Oracolo.,オラクルパスが必要だ!,오라클 통행증이 필요하다!,Je hebt de Orakelpas nodig!,Du trenger Orakelpasset!,Potrzebujesz Przepustki Wyroczni!,Você precisa do Passe do Oráculo!,Precisas do Passe do Oráculo!,Ai nevoie de legitimația Oracol!,Нужен пропуск Оракула!,Треба ти Пророкова пропусница!,Du behöver Orakelpasset!,Kahin Kartı'na ihtiyacın var!,Вам потрібен пропуск Оракула! +,,Actor tags,,,,,,,,,,,,,,,,,,,,,,,,,,, +Dagger,TAG_PUNCHDAGGER,,,,Dýka,Dolk,Dolch,Μαχάιρι,Ponardo,Daga,,Tikari,Dague de Poing,,Tőr,Pugnale,ダガー,단검,Dolk,Dolk,Sztylet,Punhal,,Pumnal,Кинжал,Бодеж,Dolk,Hançer,Кинжал +Crossbow,TAG_STRIFECROSSBOW1,Crossbow with electric bolts,,,Kuše,Armbrøst,Armbrust,Τόξο (Δηλητήριο),Arbalesto (elektraj sagoj),Ballesta (eléctrica),,Jousipyssy,Arbalète Electrique,,Nyílpuska,Balestra ,クロスボウ,석궁 (전격),Kruisboog,Armbrøst,Kusza,Besta,,Arbaletă,Арбалет,Самострел,Armborst,Arbalet,Арбалет +Crossbow,TAG_STRIFECROSSBOW2,Crossbow with poison bolts,,,Kuše,Armbrøst,Armbrust,Τόξο (Ηλεκτρικό),Arbalesto (venenaj sagoj),Ballesta (veneno),,Jousipyssy,Arbalète Empoisonée,,Nyílpuska,Balestra ,クロスボウ,석궁 (맹독),Kruisboog,Armbrøst,Kusza,Besta,,Arbaletă,Арбалет,Самострел,Armborst,Arbalet,Арбалет +Assault Gun,TAG_ASSAULTGUN,,,,Útočná puška,Angrebsvåben,Sturmgewehr,,Sturmofusilo,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,,Gépfegyver,Fucile d'Assalto ,アサルトガン,돌격소총,Aanvalswapen,Stormgevær,Karabin Szturmowy,Fuzil de Assalto,Arma de Assalto,Pușcă de Asalt,Штурмовая винтовка,Аутоматска пушка,Anfallspistol,Saldırı Silahı,Штурмова гвинтівка +Mini Missile Launcher,TAG_MMLAUNCHER,,,,Miniraketomet,Mini-missilkaster,Miniraketenwerfer,Μίνι-Πυραυλοβόλο,Misilet-pafilo,Minilanzamisiles,,Miniohjuslaukaisin,Lanceur de Mini-Missiles,,Mini Rakétavető,Mini-Lanciamissili,ミニミサイルランチャー,미니 미사일 런쳐,Miniraketwerper,Mini rakettkaster,Wyrzutnia Minipocisków,Mini Lança-mísseis,,Mini Lansator de Proiectile,Мини-гранатомёт,Мини ракетни бацач,Mini missilkastare,Mini Füze Fırlatıcı,Міні-ракетниця +Flame Thrower,TAG_FLAMER,,,,Plamenomet,Flammekaster,Flammenwerfer,,Flamĵetilo,Lanzallamas,,Liekinheitin,Lance-Flammes,,Lángszóró,Lanciafiamme ,火炎放射器,화염방사기,Vlammenwerper,Flammekaster,Miotacz Ognia,Lança-chamas,,Aruncător de Flăcări,Огнемёт,Бацеч пламена,Flamkastare,Alev Fırlatıcı,Вогнемет +Mauler,TAG_MAULER1,,,,Trhač,,Vernichter,,Polvigilo (normala),Triturador (dispersión),,Moukari,Broyeur,,Marcangoló,Pestatore ,マウラー,마울러 (저출력),Toetakelaar,,Miażdżyciel,Desintegrador,,Sfâșietor,Истязатель,Маулер,,Parçalayıcı,Розсіювач +Mauler,TAG_MAULER2,,,,Trhač,,Vernichter,,Polvigilo (fortega),Triturador (torpedo),,Moukari,Broyeur,,Marcangoló,Pestatore,マウラー,마울러 (고출력),Toetakelaar,,Miażdżyciel,Desintegrador,,Sfâșietor,Истязатель,Маулер,,Parçalayıcı,Розсіювач +Grenade Launcher,TAG_GLAUNCHER1,High-explosive grenade launcher,,,Granátomet,Granatkaster,Granatwerfer,,Grenadĵetilo (eksplodeg-pova),Lanzagranadas (conmoción),,Kranaatinheitin,Lance-Grenades Explosif,,Gránátvető,Lanciagranate,グレネードランチャー,유탄발사기 (고폭탄),Granaatwerper,Granatkaster,Wyrzutnia Granatów,Lança-granadas,,Lansator de Grenade,Гранатомёт,Бацач граната,Granatkastare,El Bombası Fırlatıcı,Гранатомет +Grenade Launcher,TAG_GLAUNCHER2,White phosphorous grenade launcher ,,,Granátomet,Granatkaster,Granatwerfer,,Grenadĵetilo (fosfora),Lanzagranadas (fósforo),,Kranaatinheitin,Lance-Grenades Incendiaire,,Gránátvető,Lanciagranate,グレネードランチャー,유탄발사기 (소이탄),Granaatwerper,Granatkaster,Wyrzutnia Granatów,Lança-granadas,,Lansator de Grenade,Гранатомёт,Бацач граната,Granatkastare,El Bombası Fırlatıcı,Гранатомет +Sigil,TAG_SIGIL,,,,Pečeť,,,,Sigelo,Emblema,,Sinetti,,,Pecsét,Sigillo,シジル,시질,,,Pieczęć,Sigilo,,Sigiliu,Печать,Сигил,,,Сигіл +Coin,TAG_COIN,,,,Mince,Mønt,Münze,,Monero,Moneda,,Kolikko,Pièce,,Érme,Moneta,コイン,동전,Munt,Mynt,Moneta,Moeda(s),,Monedă,Монета,Новчић,Mynt,Madeni Para,Монета +Med patch,TAG_MEDPATCH,,,,Obvazy,Medicinsk bandage,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement,,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinsk lapp,Bandaż,Compressa médica,,Trusă de Prim-Ajutor,Бинт,Прва помоћ,Medicinska plåster,Med yama,Оклюзійна пов'язка +Medical kit,TAG_MEDICALKIT,,,,Lékárnička,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit Médical,,Orvosi Készlet,Kit di Pronto Soccorso ,医療キット,구급 키트,Medicijndoos,Medisinsk sett,Apteczka,Kit médico,,Kit de Prim-Ajutor,Аптечка,Медицински прибор,Medicinsk utrustning,Tıbbi kit,Індивідуальна аптечка +Surgery Kit,TAG_SURGERYKIT,,,,Chirurgická souprava,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kirurgilaukku,Kit de Chirurgie,,Sebészeti Készlet,Kit Chirurgico ,手術キット,수술 키트,Chirurgiepakket,Kirurgisk sett,Zestaw Chirurga,Kit de Cirurgia,,Kit pentru Operații,Медкомплект,Хируршки прибор,Kirurgiskt kit,Ameliyat Kiti,Медичний кейс +Ring,TAG_BELDINSRING,,,,Prsten,,,,Ringo,Anillo,,Sormus,Anneau,,Gyűrű,Anello ,指輪,반지,,,Pierścień,Anel,,Inel,Кольцо,Прстен,,Yüzük,Каблучка +Offering Chalice,TAG_OFFERINGCHALICE,,,,Obětní kalich,Offerkalk,Opferkelch,,Oferdona kaliko,Cáliz de ofrenda,,Uhrimalja,Calice d'Obole,,Áldozati kehely,Calice delle Offerte,寄贈された聖杯,번제 성배,Offerbeker,Offerbeger,Kielich Ofiarny,Calice de Oferenda,,Potir pentru Ofrande,Чаша для подношений,Жртвени пехар,Offertkalke,Adak Kadehi,Чаша для жертвоприношення +Ear,TAG_EAR,,,,Ucho,Øre,Ohr,,Orelo,Oreja,,Korva,Oreille,,Fül,Orecchio,耳,귀,Oor,Øre,Ucho,Orelha,,Ureche,Ухо,Уво,Öra,Kulak,Вухо +Broken Power Coupling,TAG_BROKENCOUPLING,,,,Rozbitá spojka,Brækket strømkobling,Defekter Stromabnehmer,,Rompita energia kuplilo,Acoplador de energía roto,,Rikkinäinen virtaliitin,Coupleur Energétique cassé,,Elromlott Tápcsatlakozó,Coppia Energetica Rotta ,壊れたパワーカップリング,망가진 동력선,Gebroken stroomkoppeling,Ødelagt kraftkobling,Zepsute Obwody Zasilające,Acoplador de Energia Quebrado,Acoplador de Energia Partido,Cuplaj de Putere Defect,Повреждённая муфта,Неисправна спојница напајања,Trasig kraftkoppling,Kırık Güç Kaplini,Зламана силова муфта +Shadow Armor,TAG_SHADOWARMOR,,,Shadow Armour,Stínové brnění,Skygge rustning,Schattenrüstung,,Ombra armaĵo,Armadura de sombra,,Varjohaarniska,Armure de l'Ombre,,Sötét Páncél,Armatura Ombra ,シャドウアーマー,그림자 갑옷,Schaduwharnas,Skygge rustning,Cienisty Pancerz,Armadura das Sombras,,Armura Umbrei,Теневая броня,Оклоп сенки,Skuggarmering,Gölge Zırhı,Тіньова броня +Environmental Suit,TAG_ENVSUIT,,,,Ochranný oblek,Miljømæssig dragt,Schutzanzug,,Medi-ŝirma vesto,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat,,Védőöltözet,Tuta Ambientale ,耐環境スーツ,환경 방호복,Beschermend pak,Miljødrakt,Skafander Ochronny,Traje de Proteção,Fato Protetor,Costum de Protecție,Защитный костюм,Заштитно одело,Miljödräkt,Çevresel Takım,Захисний костюм +Guard Uniform,TAG_GUARDUNIFORM,,,,Hlídačova uniforma,Gardeuniform,Wächteruniform,,Gardista uniformo,Uniforme de guardia,,Vartijan univormu,Uniforme de Garde,,Őr Egyenruha,Uniforme da Guardia,ガードの制服,경비 전투복,Wachtersuniform,Vaktuniform,Mundur Strażnika,Uniforme de Guarda,,Uniformă de Paznic,Униформа стражника,Стражарска униформа,Skyddsuniform,Bekçi Üniforması,Уніформа охоронця +Officer's Uniform,TAG_OFFICERSUNIFORM,,,,Důstojníkova uniforma,Officersuniform,Offiziersuniform,,Oficira uniformo,Uniforme de oficial,,Upseerin univormu,Uniforme d'Officier,,Tiszti Egyenruha,Uniforme da Ufficiale ,士官の制服,장교 전투복,Officiersuniform,Offisersuniform,Mundur Oficera,Uniforme de Oficial,,Uniformă de Ofițer,Офицерская униформа,Официрска униформа,Officersuniform,Memur Üniforması,Уніформа офіцера +Flame Thrower Parts,TAG_FTHROWERPARTS,,,,Díly plamenometu,Dele til flammekasteren,Flammenwerferteile,,Partoj de flamjetilo,Partes de lanzallamas,,Liekinheittimen osat,Pièces de Lance-Flamme,,Lángszóró Alkatrészek,Parti di Lanciafiamme ,火炎放射器の部品,화염방사기 부품,Vlammenwerperonderdelen,Deler til flammekaster,Części Miotacza Ognia,Partes do lança-chamas,,Bucăți de Aruncător de Flăcări,Детали огнемёта,Делови бацача пламена,Delar till flamkastaren,Alev Püskürtücü Parçaları,Деталі для вогнемету +Report,TAG_REPORT,,,,Hlášení,Rapport,,,Raporto,Reporte,,Raportti,Compte-rendu,,Jelentés,Rapporto ,報告書,보고서,Verslag,Rapport,Raport,Relatório,,Raport,Отчёт,Извештај,Rapportera,Rapor,Звіт +Info,TAG_INFO,,,,Informace,,,,Informoj,Información,,Tiedot,,,Információ,Informazioni ,情報,정보,,Informasjon,Informacje,Informação,,Informație,Сводка,Инфо,,Bilgi,Дані +Targeter,TAG_TARGETER,,,,Zaměřovač,,Zielhilfe,,Celilo,Mira de arma,,Tähtäinlaite,Cibleur,,Célzó eszköz,Puntatore,照準器,조준기,Richter,,Namierzacz,Mira,,Țintitor,Целеуказатель,Нишанџија,,Hedefleme cihazı,Цілевказівник +Communicator,TAG_COMMUNICATOR,,,,Komunikátor,Kommunikator,Kommunikator,,Interfono,Intercomunicador,,Viestintälaite,Communicateur,,Kommunikátor,Comunicatore ,コミュニケーター,연락장치,,Kommunikator,Komunikator,Comunicador,,Comunicator,Передатчик,Комуникатор,Kommunikator,İletişimci,Комунікатор +Degnin Ore,TAG_DEGNINORE,,,,Degninská ruda,Degnin malm,Degnin-Erz,,Degnina minaĵo,Mineral de Degnin,,Degnin-malmi,Minerai de Degnin,,Degnin Érc,Minerale Degnin,デグニン鉱石,데그닌 광석,Degnin-erts,Degnin malm,Ruda Degninu,Minério Degnin,,Minereu de Degnir,Денгинская руда,Дегнинска руда,Degnin Malm,Degnin Cevheri,Дегінська руда +Accuracy,TAG_GUNTRAINING,,,,Přesnost,Nøjagtighed,Präzision,,Akurateco,Precisión,,Tarkkuus,Précision,,Pontosság,Precisione,精度,정확도,Nauwkeurigheid,Nøyaktighet,Precyzja,Precisão,,Acuratețe,Меткость,Прецизност,Noggrannhet,Doğruluk,Точність +Toughness,TAG_HEALTHTRAINING,,,,Tvrdost,Robusthed,Ausdauer,,Forteco,Dureza,,Sitkeys,Endurance,,Kitartás,Robustezza ,タフネス,힘,Stevigheid,Seighet,Wytrzymałość,Força,,Rezistență,Живучесть,Издржљивост,Seghet,Sertlik,Стійкість +Scanner,TAG_SCANNER,,,,Skener,,,,Skanilo,Escáner,,Skanneri,Analyseur,,Szkenner,Scanner,スキャナー,탐지기,Scanner,Skanner,Skaner,Scanner,,Scanner,Сканер,Скенер,Scanner,Tarayıcı,Сканер +Prison Pass,TAG_PRISONPASS,,,,Propustka do vězení,Fængselspas,Gefängnispass,,Mallibereja pasilo,Pase a la prisión,,Vankilan pääsylupa,Passe de la Prison,,Börtön Engedély,Lasciapassare Prigione ,刑務所の許可証,감옥 통행증,Gevangenispas,Fengselspass,Przepustka do Więzienia,Passe da Prisão,,Legitimația pentru Închisoare,Пропуск в тюрьму,Затворска пропусница,Fängelsepass,Hapishane Kartı,Тюремний пропуск +Alarm,TAG_ALARM,,,,,,,,Alarmo,Alarma,,Hälytys,Alarme,,Riasztó,Allarme ,警報,알람,,,,Alarme,,Alarmă,Тревога,Аларм,Larm,,Тривога +Ammo,TAG_AMMOFILLUP,,,,Munice,Munition,Munition,,Municio,Munición,,Ammukset,Munitions,,Lőszer,Munizioni ,弾薬,탄약,Munitie,Ammunisjon,Amunicja,Munição,,Muniție,Боеприпасы,Муниција,Ammunition,Cephane,Набої +Health,TAG_HEALTHFILLUP,,,,Zdraví,Sundhed,Gesundheit,,Sano,Salud,,Terveys,Santé,,Életerő,Salute ,体力,체력,Gezondheid,Helse,Zdrowie,Saúde,,Sănătate,Здоровье,Живот,Hälsa,Sağlık,Здоров'я +Teleporter Beacon,TAG_TELEPORTERBEACON,,,,Teleportační maják,Teleportør-bakke,Teleportersignal,,Teleportil-signalilo,Baliza de teletransporte,,Kaukosiirrinmajakka,Balise de téléportation,,Teleport Vészfény,Radiofaro per Teletrasporto ,テレポータービーコン,텔레포터 비콘,Teleporterbaken,Teleporter Beacon,Nadajnik Teleportera,Sinalizador para Teletransporte,,Lumină pentru Teleportor,Телепортационный маяк,Одашиљач за телепортовање,Teleporterfyr,Işınlayıcı İşaretçisi,Пристрій телепортації +Metal Armor,TAG_METALARMOR,,,Metal Armour,Kovové brnění,Metal rustning,Metallrüstung,,Metala armaĵo,Armadura de metal,,Metallihaarniska,Armure en Métal,,Fém Páncél,Armatura di Metallo ,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowy Pancerz,Armadura de Metal,,Armură din Metal,Металлическая броня,Метални оклоп,Metall rustning,Metal Zırh,Металічна броня +Leather Armor,TAG_LEATHER,,,Leather Armour,Kožené brnění,Læderpanser,Lederrüstung,,Leda armaĵo,Armadura de cuero,,Nahkasuojus,Armure en Cuir,,Bőr Páncél,Armatura di Cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Lær rustning,Skórzany Pancerz,Armadura de Couro,,Armură din Piele,Кожаная броня,Кожни оклоп,Läderrustning,Deri Zırh,Шкіряна броня +HE-Grenade Rounds,TAG_HEGRENADES,,,,Výbušné granáty,HE-granater,HE-Granaten,,Eksplodeg-povaj grenadoj,Granadas de conmoción,,Räjähdekranaatit,Grenades Explosives,,Gránát Lőszer,Granata HE,HEグレネード弾,고폭 유탄,HE-granaten,HE-Granater,Wiązka Granatów,Munição - Granadas Explosivas,,Grenade Explozive,Осколочные гранаты,Хе-Граната чауре,HE-granater,HE-Bomba Mermileri,В'язка гранат +Phosphorus-Grenade Rounds,TAG_PHGRENADES,,,,Fosforové granáty,Fosforgranater,Phosphorgranaten,,Fosforaj grenadoj,Granadas de fósforo,,Fosforikranaatit,Grenades Incendiaires,,Foszfor-Gránát Lőszer,Granata al Fosforo ,白リングレネード弾,소이 유탄,Fosforgranaten,Fosforgranater,Wiązka Fosforowych Granatów,Municão - Granadas de Fósforo,,Grenade cu Fosfor,Фосфорные гранаты,Фосфорне гранате,Fosforgranater,Fosforlu El Bombası Mermileri,В'язка фосфорних гранат. +Clip of Bullets,TAG_CLIPOFBULLETS,,,,Zásobník s náboji,Kugleklip,Gewehrmunition,,Magazeno,Cargador de balas,,Luotilipas,Chargeur d'Assaut,,Golyó töltények,Caricatore di Proiettili ,弾丸のクリップ,소총 탄창,Patroon kogels,Klipp av kuler,Magazynek,Carregador de Balas,,Cartuș cu Gloanțe,Обойма,Клип метака,Kulor i klipp,Kurşun Klipsi,Набійниця +Ammo,TAG_BOXOFBULLETS,,,,Krabice nábojů,Munition,Munitionskiste,,Munici-kesto,Caja de municiones,,Luotilaatikko,Bôite de Munitions,,Lőszer,Munizioni ,弾薬箱,탄약,Munitie,Ammunisjon,Amunicja,Caixa de Balas,,Muniție,Боеприпасы,Муниција,Ammunition,Cephane,Набої +Mini Missiles,TAG_MINIMISSILES,,,,Minirakety,Mini missiler,Miniraketen,,Misiletoj,Minimisiles,,Miniohjukset,Mini-Missiles,,Mini Rakéták,Mini-Missili,ミニミサイル,미니 미사일,Mini-raketten,Mini missiler,Mini Pociski,Mísseis,,Mini Proiectile,Мини-ракеты,Мини Ракете,Miniraketer,Mini Füzeler,Міні-ракети +Crate of Missiles,TAG_CRATEOFMISSILES,,,,Bedna raket,kasse med missiler,Raketenkiste,,Misilet-kesto,Caja de minimisiles,,Ohjuslaatikko,Caisse de Mini-Missiles,,Ládányi Rakéta,Cassa di Missili,ミサイルの箱,미사일 박스,Krat raketten,Kasse med missiler,Skrzynia z Pociskami,Caixa de Mísseis,,Ladă cu Proiectile,Коробка ракет,Кутија ракета,Låda med missiler,Füze Sandığı,Ящик мініракет +Energy Pod,TAG_ENERGYPOD,,,,Energetický kokón,Energipod,Energiezelle,,Energi-kapsulo,Cápsula de energía,,Energia-akku,Cellule Energétique,,Energia Lőszer,Nucleo Enegetico ,エネルギーポット,에너지 포드,Energiecel,Energikapsel,Kapsuła Energii,Energia (pequeno),,Capsulă cu Energie,Энергоячейка,Енергетска шипка,Energipod,Enerji Bölmesi,Енерго-капсула +Energy Pack,TAG_ENERGYPACK,,,,Energetický svazek,Energipakke,Energiepack,,Pako de energio,Paquete de energía,,Energiapaketti,Pack Energétique,,Energia Csomag,Carica Energetica ,エネルギーパック,에너지 팩,Energiepak,Energipakke,Zasobnik Energii,Energia (grande),,Pachet cu Energie,Энергобатарея,Паковање енергије,Energipaket,Enerji Paketi,Енерго-батарея +Poison Bolts,TAG_POISONBOLTS,,,,Otrávené šípy,Giftige bolte,Giftbolzen,,Venenaj sagoj,Flechas venenosas,,Myrkkynuolet,Carreaux Empoisonnés,,Mérgező hegyek,Dardi Velenosi ,ポイズンボルト,맹독 볼트,Giftige bouten,Giftbolter,Zatrute Bełty,Setas Envenenadas,,Bolțuri cu Otravă,Отравленные болты,Отровне стреле,Giftiga bultar,Zehirli Cıvatalar,Отруйні болти +Electric Bolts,TAG_ELECTRICBOLTS,,,,Elektrické šípy,Elektriske bolte,Elektrische Bolzen,,Elektraj sagoj,Flechas eléctricas,,Sähkönuolet,Carreaux Electriques,,Elektromos hegyek,Dardi Elettrici ,エレクトリックボルト,전격 볼트,Elektrische bouten,Elektriske bolter,Elektryczne Bełty,Setas Elétricas,,Bolțuri cu Electricitate,Электрические болты,Електричне стреле,Elektriska bultar,Elektrikli Cıvatalar,Електричні болти +Ammo Satchel,TAG_AMMOSATCHEL,,,,Brašna na munici,Ammo Satchel,Munitionstasche,,Sako da municioj,Bolso de municiones,,Ammuslaukku,Sacoche à munitions,,Lőszeres táska,Borsa di Munizioni ,弾薬鞄,탄약 배낭,Munitietassen,Ammunisjonsveske,Torba z Amunicją,Bolsa de Munição,,Sacoșă cu Muniție,Ранец боеприпасов,Торбица муниције,Ammo Satchel,Cephane Çantası,Сумка для набоїв +Base Key,TAG_BASEKEY,,,,Klíč od základny,Basisnøgle,Basisschlüssel,,Bazoŝlosilo,Llave de la base,,Tukikohdan avain,Clé de la base,,Bázis Kulcs,Chiave della Base,,기지 키,Basissleutel,Basenøkkel,Klucz do Bazy,Chave da Base,,Cheia Bazei,Ключ от базы,Кључ базе,Basnyckel,Temel Anahtar,Ключ від бази +Govs Key,TAG_GOVSKEY,,,,Klíč ke guvernérovi,Govs nøgle,Gouverneursschlüssel,,Ŝlosilo de registo,Llave Gobernador,,Kuvernöörin avain,Clé du Gouverneur,,Kormányzó Kulcs,Chiave del Governatore ,,총독의 키,Gouverneursleutel,Regjeringsnøkkel,Klucz Gubernatora,Chave do Governador,,Cheia Guvernatorului,Ключ губернатора,Гувернеров кључ,Govs-nyckel,Govs Anahtar,Ключ губернатора +Passcard,TAG_PASSCARD,,,,Vstupní karta,Adgangskort,Zugangskarte,,Central-ŝlosilo,Llave de la central,,Avainkortti,Passe,,Belépőkártya,Tessera Lasciapassare ,,통행 카드,Paspoortkaart,Adgangskort,Karta Dostępu,Cartão de Acesso,,Legitimație,Пропуск,Пропусница,Passerkort,Geçiş kartı,Карта доступу +ID Badge,TAG_IDBADGE,,,,Identifikační odznak,ID-badge,Identitätskarte,,Mallibereja insigno,Insignia de prisión,,Henkilötunniste,Badge d'Identification,,Azonosító Jelvény,Distintivo ,,신분 휘장,ID-Badge,ID-badge,Odznaka Identyfikacyjna,Crachá de Identificação,,Ecuson de Identificare,Личная карта,Идентификациона значка,ID-bricka,Kimlik Rozeti,Бейджик +Prison Key,TAG_PRISONKEY,,,,Klíč od věznice,Fængselsnøgle,Gefängnisschlüssel,,Mallibereja ŝlosilo,Llave de la prisión,,Vankilan avain,Clé de la Prison,,Börtön Kulcs,Chiave della Prigione ,,감옥 키,Gevangenissleutel,Fengselsnøkkel,Klucz do Więzienia,Chave da Prisão,,Cheia Închisorii,Ключ от тюрьмы,Кључ од 3атвора,Fängelsenyckel,Hapishane Anahtarı,Ключ від тюрми +Severed Hand,TAG_SEVEREDHAND,,,,Useknutá ruka,Afskåret hånd,Abgetrennte Hand,,Amputita mano,Mano amputada,,Katkennut käsi,Main coupée,,Levágott Kéz,Mano Mozzata,,잘린 손목,Gescheurde Hand,Avkuttet hånd,Odcięta Ręka,Mão Decepada,Mão Desmenbrada,Mână Retezată,Отрезанная рука,Одвојена шака,Avskuren hand,Kesik El,Відрізана рука +Power1 Key,TAG_POWER1KEY,,,,Klíč od elektrárny 1,Power1 nøgle,Kraftwerksschlüssel 1,,Central-identigo 1,Ident. central nv. 1,,Voimalan 1-avain,Clé Power1,,1. erő kulcs,Chiave della Centrale 1,,발전소 1호 키,1e Machtsleutel,Power1-nøkkel,Klucz do Elektrowni 1,Chave da Usina 1,Chave Energética 1,Cheia Putere1,Ключ ЭС №1,Кључ од ел. 1,Kraftnyckel 1,Güç1 Anahtarı,Ключ від електростанції 1 +Power2 Key,TAG_POWER2KEY,,,,Klíč od elektrárny 2,Power2-nøgle,Kraftwerksschlüssel 2,,Central-identigo 2,Ident. central nv. 2,,Voimalan 2-avain,Clé Power2,,2. erő kulcs,Chiave della Centrale 2,,발전소 2호 키,2e Machtsleutel,Power2-nøkkel,Klucz do Elektrowni 2,Chave da Usina 2,Chave Energética 2,Cheia Putere2,Ключ ЭС №2,Кључ од ел. 2,Kraftnyckel 2,Güç2 Anahtarı,Ключ від електростанції 2 +Power3 Key,TAG_POWER3KEY,,,,Klíč od elektrárny 3,Power3-nøgle,Kraftwerksschlüssel 3,,Central-identigo 3,Ident. central nv. 3,,Voimalan 3-avain,Clé Power3,,3. erő kulcs,Chiave della Centrale 3,,발전소 3호 키,3e Machtsleutel,Power3-nøkkel,Klucz do Elektrowni 3,Chave da Usina 3,Chave Energética 3,Cheia Putere3,Ключ ЭС №3,Кључ од ел. 3,Kraftnyckel 3,Güç3 Anahtarı,Ключ від електростанції 3 +Gold Key,TAG_GOLDKEY,,,,Zlatý klíč,Guldnøgle,Goldschlüssel,,Ora ŝlosilo,Llave dorada,,Kulta-avain,Clé en Or,,Aranykulcs,Chiave Dorata,,황금 키,Gouden sleutel,Gullnøkkel,Złoty Klucz,Chave de Ouro,,Cheia din Aur,Золотой ключ,Златни кључ,Guldnyckel,Altın Anahtar,Золотий ключ +ID Card,TAG_IDCARD,,,,Identifikační karta,ID-kort,Ausweis,,Kloaka identigilo,Identif. cloacas,,Henkilökortti,Carte d'Identité,,Azonosító Kártya,Tessera Identificativa,,신분증,ID-Kaart,ID-kort,Karta Identyfikacyjna,Cartão de Identificação,,Card de Identitate,Удостоверение,Лична карта,ID-kort,Kimlik Kartı,Ідентифікаційна карта +Silver Key,TAG_SILVERKEY,,,,Stříbrný klíč,Sølvnøgle,Silberschlüssel,,Arĝenta ŝlosilo,Llave plateada,,Hopea-avain,Clé en Argent,,Ezüst Kulcs,Chiave Argentata,,은 키,Zilveren sleutel,Sølv-nøkkel,Srebrny Klucz,Chave de Prata,,Cheia din Argint,Серебряный ключ,Сребрни кључ,Silvernyckel,Gümüş Anahtar,Срібний ключ +Oracle Key,TAG_ORACLEKEY,,,,Věštcův klíč,Orakel-nøgle,Orakelschlüssel,,Orakolo-ŝlosilo,Llave del Oráculo,,Oraakkelin avain,Clé de l'Oracle,,Orákulum kulcs,Chiave dell'Oracolo ,,오라클 키,Orakelsleutel,Oracle-nøkkel,Klucz do Wyroczni,Chave do Oráculo,,Cheia Oracol,Ключ Оракула,Пророков кључ,Oracle-nyckel,Kahin Anahtarı,Ключ Оракула +Military ID,TAG_MILITARYID,,,,Vojenské ID,Militær ID,Militärausweis,,Milita identigilo,Identif. militar,,Sotilastunnus,Identification Militaire,,Katonai Azonosító Kártya,Identificativo Militare,,군용 아이디,Militaire ID,Militær ID,Wojskowy Identyfikator,ID Militar,,Legitimație Militară,Удостовер. военного,Војна идентификација,Militärt ID,Askeri Kimlik,Військова ID карта +Order Key,TAG_ORDERKEY,,,,Klíč Řádu,Bestillingsnøgle,Ordensschlüssel,,Ordena ŝlosilo,Llave de La Orden,,Veljeskunnan avain,Clé de l'Ordre,,Rend Kulcs,Chiave dell'Ordine,,오더의 키,Ordesleutel,Bestillingsnøkkel,Klucz Zakonu,Chave da Ordem,,Cheia Ordinului,Ключ Ордена,Кључ одреда,Beställningsnyckel,Sipariş Anahtarı,Ключ Ордену +Warehouse Key,TAG_WAREHOUSEKEY,,,,Klíč ke skladu,Lagernøgle,Lagerhausschlüssel,,Magazena ŝlosilo,Llave del almacén,,Varaston avain,Clé de l'Entrepôt,,Raktár Kulcs,Chiave del Magazzino ,,창고 키,Magazijnsleutel,Lagernøkkel,Klucz do Magazynu,Chave do Armazém,,Cheia Depozitului,Ключ от склада,Кључ складишта,Lagernyckel,Depo Anahtarı,Ключ від складу +Brass Key,TAG_BRASSKEY,,,,Mosazný klíč,Messingnøgle,Messingschlüssel,,Latuna ŝlosilo,Llave de latón,,Messinkiavain,Clé en Bronze,,Réz Kulcs,Chiave d'Ottone ,,황동 키,Messing sleutel,Messingnøkkel,Mosiężny Klucz,Chave de Latão,,Cheia din Alamă,Латунный ключ,Кључ од месинга,Mässingsnyckel,Pirinç Anahtar,Латунний ключ +Red Crystal Key,TAG_REDCRYSTALKEY,,,,Červený krystalový klíč,Rød krystalnøgle,Roter Kristallschlüssel,,Ruĝkristala ŝlosilo,Llave cristal rojo,,Punainen kristalliavain,Clé de Cristal Rouge,,Piros Kristály Kulcs,Chiave di Cristallo Rosso ,,적색 크리스탈 키,Rode kristallen sleutel,Rød krystallnøkkel,Czerwony Kryształowy Klucz,Chave de Cristal Vermelho,,Cheia din Cristal Roșu,Крас. ключ-кристалл,Кључ од црвеног кристала,Nyckel i röd kristall,Kırmızı Kristal Anahtar,Червоний кристальний ключ +Blue Crystal Key,TAG_BLUECRYSTALKEY,,,,Modrý krystalový klíč,Blå krystalnøgle,Blauer Kristallschlüssel,,Blukristala ŝlosilo,Llave cristal azul,,Sininen kristalliavain,Clé de Crisal Bleu,,Kék Kristály Kulcs,Chiave di Cristallo Blu,,청색 크리스탈 키,Blauwe kristallen sleutel,Blå krystallnøkkel,Niebieski Kryształowy Klucz,Chave de Cristal Azul,,Cheia din Cristal Albastru,Син. ключ-кристалл,Кључ од плавог кристала,Blå kristallnyckel,Mavi Kristal Anahtar,Синій кристальний ключ +Chapel Key,TAG_CHAPELKEY,,,,Klíč od kaple,Kapel nøgle,Kapellenschlüssel,,Kapelo-ŝlosilo,Llave de la Capilla,,Kappelin avain,Clé de la Chapelle,,Kápolna Kulcs,Chiave della Cappella ,,예배당 키,Kappelsleutel,Kapell-nøkkel,Klucz do Kaplicy,Chave da Capela,,Cheia Capelei,Ключ от часовни,Кључ капеле,Kapellnyckel,Şapel Anahtarı,Ключ від каплиці +Catacomb Key,TAG_CATACOMBKEY,,,,Klíč do katakomb,Katakomb Nøgle,Katakombenschlüssel,,Katakomb-ŝlosilo,Llave Catacumbas,,Katakombin avain,Clé des Catacombes,,Katakomba Kulcs,Chiave delle Catacombe ,,고대 묘지 키,Catacombesleutel,Katakomb-nøkkel,Klucz do Katakumb,Chave da Catacumba,,Cheia Catacombei,Ключ от катакомб,Кључ од катакомби,Katakomb-nyckel,Katakomb Anahtarı,Ключ від катакомб +Security Key,TAG_SECURITYKEY,,,,Klíč ochranky,Sikkerhedsnøgle,Sicherheitsschlüssel,,Sekureco-ŝlosilo,Llave de Seguridad,,Turvamiesavain,Clé de la Sécurité,,Biztonsági Kulcs,Chiave della Sicurezza ,,보안 키,Beveiligingssleutel,Sikkerhetsnøkkel,Klucz Ochrony,Chave de Segurança,,Cheia Securității,Ключ охраны,Сигурносни кључ,Säkerhetsnyckel,Güvenlik Anahtarı,Ключ охорони +Core Key,TAG_COREKEY,,,,Klíč k jádru,Reaktor Nøgle,Reaktorschlüssel,,Kernoŝlosilo,Llave del Núcleo,,Ytimen avain,Clé du Réacteur,,Mag Kulcs,Chiave del Nucleo,,중심부 키,Kernsleutel,Kjernenøkkel,Klucz do Rdzenia,Chave do Núcleo,,Cheia Nucleului,Ключ от реактора,Кључ језгра,Kärnnyckel,Çekirdek Anahtar,Ключ від реактора +Mauler Key,TAG_MAULERKEY,,,,Klíč k trhačům,Mauler-nøgle,Vernichterschlüssel,,Polvigilo-ŝlosilo,Llave Triturador,,Moukarin avain,Clé du Broyeur,,Marcangoló Kulcs,Chiave del Pestatore ,,마울러 키,Toetakelaarssleutel,Mauler-nøkkel,Klucz do Magazynu Miażdżycieli,Chave - Mauler,,Cheia Sfâșietorului,Ключ истязателя,Маулер кључ,Mauler-nyckel,Mauler Anahtar,Ключ розсіювача +Factory Key,TAG_FACTORYKEY,,,,Klíč do továrny,Fabriksnøgle,Fabrikschlüssel,,Fabriko-ŝlosilo,Llave de la Fábrica,,Tehtaan avain,Clé de l'Usine,,Gyár Kulcs,Chiave della Fabbrica ,,공장 키,Fabriekssleutel,Fabrikknøkkel,Klucz do Fabryki,Chave da Fábrica,,Cheia Fabricii,Ключ от фабрики,Кључ фабрике,Fabriksnyckel,Fabrika Anahtarı,Ключ від фабрики +Mine Key,TAG_MINEKEY,,,,Klíč od dolů,Mine-nøgle,Minenschlüssel,,Minejo-ŝlosilo,Llave de la Mina,,Kaivoksen avain,Clé de la Mine,,Bánya Kulcs,Chiave della Miniera ,,탄광 키,Mijnsleutel,Gruve-nøkkel,Klucz do Kopalni,Chave da Mina,,Cheia Minei,Ключ от шахт,Кључ рудника,Gruvnyckel,Maden Anahtarı,Ключ від шахт +New Key5,TAG_NEWKEY5,,,,Nový klíč 5,Ny nøgle5,Neuer Schlüssel 5,,Nova ŝlosilo kvin,Llave nueva cinco,,Uusi 5-avain,Clé nouveau 5,,5. kulcs,Nuova Chiave 5,,새로운 키5,Nieuwe sleutel 5,Ny nøkkel5,Nowy Klucz5,Chave Nova 5,,Noua Cheie5,Новый ключ №5,Нови кључ5,Ny nyckel5,Yeni Anahtar5,Новий ключ 5 +Oracle Pass,TAG_ORACLEPASS,,,,Věštcova propustka,Orakelpas,Orakelpass,,Orakolo-pasilo,Pase del Oráculo,,Oraakkelin kulkulupa,Passe de l'Oracle,,Orákulum útlevél,Lasciapassare dell'Oracolo ,,오라클의 통행증,Orakelpas,Oracle Pass,Przepustka Wyroczni,Passe do Oráculo,,Legitimația Oracol,Пропуск Оракула,Пророкова пропусница,Orakelpass,Kahin Kartı,Пропуск Оракула +10 gold,TAG_10GOLD,,,,10 zlatých,10 guld,,,10 da oro,10 de oro,,10 kolikkoa,10 Pièces,,10 arany,10 pezzi d'oro ,10ゴールド,10 골드,10 goud,10 gull,10 monet,10 moedas,10 moedas de ouro,10 monezi de aur,10 золотых,10 златника,10 guld,10 altın,10 золотих +25 gold,TAG_25GOLD,,,,25 zlatých,25 guld,,,25 da oro,25 de oro,,25 kolikkoa,25 Pièces,,25 arany,25 pezzi d'oro ,25ゴールド,25 골드,25 goud,25 gull,25 monet,25 moedas,25 moedas de ouro,25 de monezi de aur,25 золотых,25 златника,25 guld,25 altın,25 золотих +50 gold,TAG_50GOLD,,,,50 zlatých,50 guld,,,50 da oro,50 de oro,,50 kolikkoa,50 Pièces,,50 arany,50 pezzi d'oro ,50ゴールド,50 골드,50 goud,50 gull,50 monet,50 moedas,50 moedas de ouro,50 de monezi de aur,50 золотых,50 златника,50 guld,50 altın,50 золотих +300 gold,TAG_300GOLD,,,,300 zlatých,300 guld,,,300 da oro,300 de oro,,300 kolikkoa,300 Pièces,,300 arany,300 pezzi d'oro ,300ゴールド,300 골드,300 goud,300 gull,300 monet,300 moedas,300 moedas de ouro,300 de monezi de aur,300 золотых,300 златника,300 guld,300 altın,300 золотих +Person,TXT_PERSON,,,,Osoba,,,,Persono,Persona,,Henkilö,Personne,,Személy,Persona,一員,민간인,Persoon,,Osoba,Pessoa,,Persoană,Горожанин,Особа,Person,Kişi,Цивільний +Acolyte,TAG_ACOLYTE,,,,Akolyta,Akolyt,Ministrant,,Akolito,Acólito,,Akoluutti,,,Ministráns,Accolito ,アコライト,아콜라이트,Acoliet,Akolytt,Akolita,Acólito,,Acolit,Служитель,Следбеник,Akolyt,Yardımcı,Адепт +Armorer,TAG_ARMORER,,,Armourer,Kovář,Våbendør,Rüster,,Armilisto,Armero,,Asemestari,Armurier,,Páncélkovács,Armaiolo ,装甲,병기공,Harnassmid,Våpensmed,Płatnerz,Armeiro,,Armurier,Продавец брони,Ковач,Rusthållare,Zırhçı,Коваль +Bar Keep,TAG_BARKEEP,,,,Výčepní,Bar-værn,Wirt,,Drinkejestro,Cantinero,,Baarimikko,Barman,,Csapos,Barista,酒屋,바텐더,Barman,Bartender,Barman,Dono do Bar,,Barman,Хозяин таверны,Конобар,Bartender,Barmen,Бармен +Beggar,TAG_BEGGAR,,,,Žebrák,Tigger,Bettler,,Almozulo,Mendigo,,Kerjäläinen,Mendiant,,Koldus,Mendicante ,乞食,거지,Bedelaar,Tigger,Żebrak,Mendigo,,Sărman,Нищий,Просјак,Tiggare,Dilenci,Жебрак +Macil,TAG_MACIL1,,,,,,,,,,,,,,,,マシル,마실,,,,,,,Мэйсил,Мејсил,,Macil,Масіл +Macil,TAG_MACIL2,,,,,,,,,,,,,,,,マシル,마실,,,,,,,Мэйсил,Мејсил,,Macil,Масіл +Medic,TAG_MEDIC,,,,Medik,Læge,Sanitäter,,Kuracisto,Médico,,Lääkintämies,Médecin,,Szanitéc,Medico,メディック,의무관,Paramedicus,,Medyk,Médico,,,Врач,Болничар,Sjukvårdare,,Лікар +Oracle,TAG_ORACLE,,,,Věštec,Orakel,Orakel,,Orakolo,Oráculo,,Oraakkeli,,,Orákulum,Oracolo,オラクル,오라클,Orakel,Orakel,Wyrocznia,Oráculo,,Oracol,Оракул,Пророк,Orakel,Kahin,Оракул +Priest,TAG_PRIEST,,,,Kněz,Præst,Priester,,Pastro,Sacerdote,,Pappi,Prêtre,,Pap,Sacerdote,プリースト,성직자,Priester,Prest,Kapłan,Sacerdote,,Preot,Жрец,Свештеник,Präst,Rahip,Священник +Rat Buddy,TAG_RATBUDDY,,,,Krysík,Rottekammerat,Ratte,,Rato,Rata,,Rottakamu,Copain Rat,,Patkánypajtás,Ratto,ラット バディ,생쥐 친구,Rattenvriendje,Rottekompis,Koleżka Szczurów,Rato,,Amicul Șobolanilor,Крыса-друг,Друг пацов,Råttkompis,Sıçan Dostu,Друзяка щур +Rebel,TAG_REBEL,,,,,,Rebell,,Ribelanto,Rebelde,,Kapinallinen,Rebelle,,Lázadó,Ribelle ,反乱軍,저항군,,Rebell,Rebeliant,Rebelde,,,Повстанец,Побуњеник,Rebell,Asi,Повстанець +Templar,TAG_TEMPLAR,,,,Templář,Tempelridder,Templer,,Templano,Templario,,Temppeliherra,Templier,,Templomos,Templare ,騎士団員,템플러,Tempelier,Tempelridder,Templariusz,Templário,,Templier,Храмовник,Темплар,Tempelriddare,Tapınakçı,Тамплієр +Weapon Smith,TAG_WEAPONSMITH,,,,Zbraňmistr,Våbensmed,Waffenschmied,,Armilforĝisto,Forjador de armas,,Aseseppä,Forgeron,,Fegyverkovács,Fabbro ,武器工,무기 제조상,Wapensmid,Våpensmed,Wytwórca Broni,Ferreiro,,Făurar,Оружейник,Ковач оружја,Vapensmed,Silah Ustası,Зброяр +Red Talisman,TAG_TALISMANRED,,,,Červený talisman,Rød Talisman,Roter Talisman,,Ruĝa Talismano,Talismán rojo,,Punainen talismaani,Talisman Rouge,,Vörös Talizmán,Talismano rosso,赤の魔除け,붉은 부적,Rode Talisman,Rød talisman,Czerwony Talizman,Talismã Vermelho,,Talisman Roșu,Красный талисман,Црвени талисман,Röd talisman,Kızıl Tılsım,Червоний талісман +Green Talisman,TAG_TALISMANGREEN,,,,Zelený talisman,Grøn Talisman,Grüner Talisman,,Verda Talismano,Talismán verde,,Vihreä talismaani,Talisman Vert,,Zöld Talizmán,Talismano verde,緑の魔除け,녹색 부적,Groene Talisman,Grønn talisman,Zielony Talizman,Talismã Verde,,Talisman Verde,Зелёный талисман,Зелени талисман,Grön Talisman,Yeşil Tılsım,Зелений талісман +Blue Talisman,TAG_TALISMANBLUE,,,,Modrý talisman,Blå Talisman,Blauer Talisman,,Blua Talismano,Talismán azul,,Sininen talismaani,Talisman Bleu,,Kék Talizmán,Talismano blu,青の魔除け,푸른 부적,Blauwe Talisman,Blå talisman,Niebieski Talizman,Talismã Azul,,Talisman Albastru,Синий талисман,Плави талисман,Blå Talisman,Mavi Tılsım,Синій талісман +,,Obituaries,,,,,,,,,,,,,,,,,,,,,,,,,,, +%o was zealously shot down by an Acolyte.,OB_ACOLYTE,,,,%o byl@[ao_cs] horlivě zastřelen@[ao_cs] akolytou.,%o blev skudt ned af en akolyt.,%o wurde eifrig von dem Ministranten erschossen.,,%o fervore pafiĝis de Akolito.,A %o l@[ao_esp] ha derribado con fervor un Acólito.,A %o l@[ao_esp] derribó con entusiasmo un Acólito.,%o joutui kiivailevan akoluutin ampumaksi.,%o a souffert d'une bavure policière.,,%o-t buzgó módon le lett lőve egy Oltárszolga által.,%o è stato zelantemente abbattuto da un accolito. ,%o は熱心なアコライトに堕とされた。,%o 은(는) 아콜라이트에게 맹신적으로 사격 당했다.,%o werd gretig neergeschoten door een Acoliet.,%o ble nidkjært skutt ned av en akolytt.,%o został@[ao_pl] żarliwie zastrzelon@[adj_pl] przez Akolitę.,%o foi zelosamente abatid@[ao_ptb] por um Acólito.,,%o a fost împușcat zelos de un Acolit.,Игрок %o фанатично убит служителем.,%o је ревносно упуцан@[adj_1_sr] од стране секташа.,%o blev nitiskt nedskjuten av en akolyt.,"%o, bir yardımcısı tarafından gayretle vuruldu.",Адепт пристрелив %o. +%o should have never rebelled against Macil.,OB_MACIL,,,,%o se nikdy neměl@[ao_cs] vzbouřit vůči Macilovi.,%o skulle aldrig have gjort oprør mod Macil.,%o hätte nicht gegen Macil rebellieren sollen.,,%o ne estus devinta ribeli kontraŭ Macil.,%o no debería haberse rebelado contra Macil.,%o hizo mal en rebelarse contra Macil.,%o paran ei olisi ikinä pitänyt kapinoida Macilia vastaan.,%o n'aurait jamais du se rebeller contre Macil.,,%o Macil ellen próbált fellázadni.,%o non avrebbe mai dovuto opporsi a Macil. ,%o はマシルに歯向かうべきではなかった。,%o 은(는) 마실의 적이 되지 말았어야 했다.,%o had nooit in opstand mogen komen tegen Macil.,%o skulle aldri ha gjort opprør mot Macil.,%o nie powin@[irreg_5_pl] buntować się przeciwko Macilowi.,%o nunca deveria ter se rebelado contra Macil.,%o nunca deveria ter se rebeliado contra Macil.,"%o nu ar fi trebuit să se răscoale împotriva lui Macil.",Игроку %o не следовало восставать против Мэйсила.,%o никад није треба@[ao_1_sr] да се супротстави Мејсилу.,%o borde aldrig ha gjort uppror mot Macil.,"%o, Macil'e karşı asla isyan etmemeliydi.",%o ніколи не ма@[adj_1_ua] бунтувати проти Масіла. -%o was gunned down by a Rebel.,OB_REBEL,,,,%o byl@[ao_cs] odstřelen@[ao_cs] rebelem.,%o blev skudt ned af en oprører.,%o wurde von einem Rebellen erschossen.,,%o pafegiĝis de ribelanto.,A %o l@[ao_esp] ha fusilado un Rebelde.,A %o l@[ao_esp] fusiló un Rebelde.,%o joutui kapinallisen alas ampumaksi.,%o a été abattu@[e_fr] par un rebelle.,%o le lett lőve egy Lázadó által.,%o è stato colpito a morte da un Ribelle. ,%o は反乱軍に撃ち殺された。,%o 은(는) 저항군에 의해 제압당했다.,%o werd neergeschoten door een Rebel.,%o ble skutt ned av en opprører.,%o został@[ao_pl] rozstrzelan@[adj_pl] przez Rebelianta.,%o foi abatid@[ao_ptb] por um Rebelde.,,%o a fost pus la pământ de un Rebel.,Игрока %o расстрелял повстанец.,%o је упуцан@[adj_1_sr] од стране побуњеника.,%o blev skjuten av en rebell.,%o bir asi tarafından vuruldu.,%o було розстріляно повстанцем. -%o was beaten to death by the poor.,OB_BEGGAR,,,,%o byl@[ao_cs] umlácen@[ao_cs] chudinou.,%o blev slået ihjel af de fattige.,%o fiel der Armut zum Opfer.,,%o morte bategiĝis de la malriĉuloj.,%o ha sido abatid@[ao_esp] a muerte por los pobres.,%o recibió una paliza letal de los pobres.,%o joutui köyhälistön kuoliaaksi hakkaamaksi.,%o a été battu@[e_fr] a mort par un pauvre.,%o halálra lett verve a szegénység által.,%o è stato calpestato dalla povertà. ,%o は貧民に殴り殺された。,%o 은(는) 자업자득으로 거지에게 맞아 죽었다.,%o werd door de armen doodgeslagen.,%o ble slått i hjel av de fattige.,%o został@[ao_pl] zatłuczon@[adj_pl] na śmierć przez żebraka.,%o foi espancad@[ao_ptb] até a morte pelos pobres.,,%o a fost omorât în bătaie de sărmani.,Игрока %o забили до смерти нищие.,%o је претучен@[adj_1_sr] од стране просјака.,%o blev ihjälslagen av de fattiga.,%o fakirler tarafından ölene kadar dövüldü.,%o забив до смерті жебрак. -%o should have never picked a fight with a civilian.,OB_PEASANT,,,,%o si neměl@[ao_cs] začínat s civilistou.,%o skulle aldrig have taget et slagsmål med en civilist.,%o hätte sich nicht mit einem Zivilisten anlegen sollen.,,%o ne estus devinta komenci batalon al civilulo.,%o no debería haber empezado una pelea con un civil.,%o hizo mal en iniciar una pelea con un civil.,%o hölmön ei olisi ikinä pitänyt haastaa riitaa siviilin kanssa.,%o n'aurait jamais du chercher des noises a un civil.,%o ujjat húzott egy civillel.,%o non avrebbe mai dovuto prendersela con un civile. ,%o は庶民に戦いを挑むべきではなかった。,%o 은(는) 민간인과 싸울 힘도 전혀 없었다.,%o had nooit een gevecht met een burger moeten aangaan.,%o skulle aldri ha kranglet med en sivilist.,%o nigdy nie powin@[irreg_5_pl] wdawać się w bójkę z cywilem.,%o nunca deveria ter arrumado briga com um civil.,%o nunca deveria ter pegado à briga com um civil.,%o n-ar fi trebuit să se încaiere cu un civil.,Игроку %o не следовало начинать драку с горожанином.,%o никад није треба@[ao_1_sr] да се потуче са цивилом.,%o skulle aldrig ha börjat slåss med en civilperson.,%o asla bir sivil ile kavga etmemeliydi.,%o не варто було починати бійку з цивільним. -%o was struck down by the Spectre.,OB_ALIENSPECTRE,,,,%o byl@[ao_cs] zničen@[ao_cs] přízrakem.,%o blev slået ned af spøgelset.,%o wurde von dem Schemen niedergestreckt.,,%o subite mortiĝis de la Fantomo.,A %o l@[ao_esp] ha fulminado el Espectro.,A %o l@[ao_esp] fulminó el Espectro.,%o joutui haamun kaatamaksi.,%o a été terrassé@[e_fr] par le Spectre.,%o ki lett ütve a lidérc által.,%o è stato abbattuto dallo Spettro. ,%o はスペクトルに討ち滅ぼされた。,%o 은(는) 스펙터에 의해 무너져 내렸다.,%o werd door de Specter neergeslagen.,%o ble slått ned av Spekter.,%o został@[ao_pl] powalon@[adj_pl] przez Widmo.,%o foi abatid@[ao_ptb] por um Espectro.,,%o a fost răpus de Spectru.,Игрока %o уничтожил фантом.,%o је обори@[ao_1_sr] са ногу утвара.,%o blev nedsliten av spektret.,%o Hortlak tarafından vuruldu.,Спектр вразив %o. -%o felt the wrath of The One God.,OB_ENTITY,,,,%o pocítil@[ao_cs] vztek Jediného Boha,%o følte den ene Guds vrede.,%o spürte den Zorn des Einen Gottes.,,%o sentis la koleregon de la Vera Dio.,%o ha sentido la ira del Dios Único.,%o sintió la ira del Dios Único.,%o sai tuta Yhden Ainoan Jumalan vihan.,%o a senti le courroux du Seul Dieu.,%o megérezte az Egyetlen Isten haragját.,%o ha assistito all'ira dell'Unico Dio. ,%o は唯一神の怒りに触れた。,%o 은(는) 유일신의 이름으로 천벌을 받았다.,%o voelde de toorn van de Ene God.,%o følte vreden til Den ene Gud.,%o poczuł@[ao_pl] gniew Jedynego Boga.,%o sentiu a ira do Deus Único.,,%o a simțit furia Zeului.,Игрок %o столкнулся с гневом Единого Бога.,Играча %o је осетио бес Јединог бога.,%o fick känna på den ende gudens vrede.,%o Tek Tanrı'nın gazabını hissetti.,%o відчу@[adj_1_ua] гнів Єдиного Бога. -%o couldn't escape from the Lore Master's grasp.,OB_LOREMASTER,,,,%o nemohl@[ao_cs] utéct Dějepiscově sevření.,%o kunne ikke undslippe Loremesterens greb.,%o konnte dem Griff des Wissensmeisters nicht entkommen.,,%o ne povis eskapi el la kapto de la Folkloristo.,%o no ha conseguido huir de las garras del Maestro del Conocimiento.,%o no logró huir de las garras del Maestro del Conocimiento.,%o ei kyennyt pakenemaan Oppi-Isän otteesta.,%o n'a pu échapper a l'emprise du Maître des Traditions.,%o nem tudott elmenekülni a Tan Mester elől.,%o non è riuscito a sfuggire alla stretta del Sapiente.,%o はロアマスターの手から逃れられなかった。,%o 은(는) 로어마스터의 촉수를 벗어나지 못했다.,%o kon niet ontsnappen aan de greep van de kennismeester.,%o kunne ikke unnslippe Loremesterens grep.,%o nie m@[irreg_4_pl] uniknąć chwytu Mędrca.,%o não conseguiu escapar do alcance do Mestre do Conhecimento.,,"%o n-a putut scăpa din mâinile Maestrului +%o was gunned down by a Rebel.,OB_REBEL,,,,%o byl@[ao_cs] odstřelen@[ao_cs] rebelem.,%o blev skudt ned af en oprører.,%o wurde von einem Rebellen erschossen.,,%o pafegiĝis de ribelanto.,A %o l@[ao_esp] ha fusilado un Rebelde.,A %o l@[ao_esp] fusiló un Rebelde.,%o joutui kapinallisen alas ampumaksi.,%o a été abattu@[e_fr] par un rebelle.,,%o le lett lőve egy Lázadó által.,%o è stato colpito a morte da un Ribelle. ,%o は反乱軍に撃ち殺された。,%o 은(는) 저항군에 의해 제압당했다.,%o werd neergeschoten door een Rebel.,%o ble skutt ned av en opprører.,%o został@[ao_pl] rozstrzelan@[adj_pl] przez Rebelianta.,%o foi abatid@[ao_ptb] por um Rebelde.,,%o a fost pus la pământ de un Rebel.,Игрока %o расстрелял повстанец.,%o је упуцан@[adj_1_sr] од стране побуњеника.,%o blev skjuten av en rebell.,%o bir asi tarafından vuruldu.,%o було розстріляно повстанцем. +%o was beaten to death by the poor.,OB_BEGGAR,,,,%o byl@[ao_cs] umlácen@[ao_cs] chudinou.,%o blev slået ihjel af de fattige.,%o fiel der Armut zum Opfer.,,%o morte bategiĝis de la malriĉuloj.,%o ha sido abatid@[ao_esp] a muerte por los pobres.,%o recibió una paliza letal de los pobres.,%o joutui köyhälistön kuoliaaksi hakkaamaksi.,%o a été battu@[e_fr] a mort par un pauvre.,,%o halálra lett verve a szegénység által.,%o è stato calpestato dalla povertà. ,%o は貧民に殴り殺された。,%o 은(는) 자업자득으로 거지에게 맞아 죽었다.,%o werd door de armen doodgeslagen.,%o ble slått i hjel av de fattige.,%o został@[ao_pl] zatłuczon@[adj_pl] na śmierć przez żebraka.,%o foi espancad@[ao_ptb] até a morte pelos pobres.,,%o a fost omorât în bătaie de sărmani.,Игрока %o забили до смерти нищие.,%o је претучен@[adj_1_sr] од стране просјака.,%o blev ihjälslagen av de fattiga.,%o fakirler tarafından ölene kadar dövüldü.,%o забив до смерті жебрак. +%o should have never picked a fight with a civilian.,OB_PEASANT,,,,%o si neměl@[ao_cs] začínat s civilistou.,%o skulle aldrig have taget et slagsmål med en civilist.,%o hätte sich nicht mit einem Zivilisten anlegen sollen.,,%o ne estus devinta komenci batalon al civilulo.,%o no debería haber empezado una pelea con un civil.,%o hizo mal en iniciar una pelea con un civil.,%o hölmön ei olisi ikinä pitänyt haastaa riitaa siviilin kanssa.,%o n'aurait jamais du chercher des noises a un civil.,,%o ujjat húzott egy civillel.,%o non avrebbe mai dovuto prendersela con un civile. ,%o は庶民に戦いを挑むべきではなかった。,%o 은(는) 민간인과 싸울 힘도 전혀 없었다.,%o had nooit een gevecht met een burger moeten aangaan.,%o skulle aldri ha kranglet med en sivilist.,%o nigdy nie powin@[irreg_5_pl] wdawać się w bójkę z cywilem.,%o nunca deveria ter arrumado briga com um civil.,%o nunca deveria ter pegado à briga com um civil.,%o n-ar fi trebuit să se încaiere cu un civil.,Игроку %o не следовало начинать драку с горожанином.,%o никад није треба@[ao_1_sr] да се потуче са цивилом.,%o skulle aldrig ha börjat slåss med en civilperson.,%o asla bir sivil ile kavga etmemeliydi.,%o не варто було починати бійку з цивільним. +%o was struck down by the Spectre.,OB_ALIENSPECTRE,,,,%o byl@[ao_cs] zničen@[ao_cs] přízrakem.,%o blev slået ned af spøgelset.,%o wurde von dem Schemen niedergestreckt.,,%o subite mortiĝis de la Fantomo.,A %o l@[ao_esp] ha fulminado el Espectro.,A %o l@[ao_esp] fulminó el Espectro.,%o joutui haamun kaatamaksi.,%o a été terrassé@[e_fr] par le Spectre.,,%o ki lett ütve a lidérc által.,%o è stato abbattuto dallo Spettro. ,%o はスペクトルに討ち滅ぼされた。,%o 은(는) 스펙터에 의해 무너져 내렸다.,%o werd door de Specter neergeslagen.,%o ble slått ned av Spekter.,%o został@[ao_pl] powalon@[adj_pl] przez Widmo.,%o foi abatid@[ao_ptb] por um Espectro.,,%o a fost răpus de Spectru.,Игрока %o уничтожил фантом.,%o је обори@[ao_1_sr] са ногу утвара.,%o blev nedsliten av spektret.,%o Hortlak tarafından vuruldu.,Спектр вразив %o. +%o felt the wrath of The One God.,OB_ENTITY,,,,%o pocítil@[ao_cs] vztek Jediného Boha,%o følte den ene Guds vrede.,%o spürte den Zorn des Einen Gottes.,,%o sentis la koleregon de la Vera Dio.,%o ha sentido la ira del Dios Único.,%o sintió la ira del Dios Único.,%o sai tuta Yhden Ainoan Jumalan vihan.,%o a senti le courroux du Seul Dieu.,,%o megérezte az Egyetlen Isten haragját.,%o ha assistito all'ira dell'Unico Dio. ,%o は唯一神の怒りに触れた。,%o 은(는) 유일신의 이름으로 천벌을 받았다.,%o voelde de toorn van de Ene God.,%o følte vreden til Den ene Gud.,%o poczuł@[ao_pl] gniew Jedynego Boga.,%o sentiu a ira do Deus Único.,,%o a simțit furia Zeului.,Игрок %o столкнулся с гневом Единого Бога.,Играча %o је осетио бес Јединог бога.,%o fick känna på den ende gudens vrede.,%o Tek Tanrı'nın gazabını hissetti.,%o відчу@[adj_1_ua] гнів Єдиного Бога. +%o couldn't escape from the Lore Master's grasp.,OB_LOREMASTER,,,,%o nemohl@[ao_cs] utéct Dějepiscově sevření.,%o kunne ikke undslippe Loremesterens greb.,%o konnte dem Griff des Wissensmeisters nicht entkommen.,,%o ne povis eskapi el la kapto de la Folkloristo.,%o no ha conseguido huir de las garras del Maestro del Conocimiento.,%o no logró huir de las garras del Maestro del Conocimiento.,%o ei kyennyt pakenemaan Oppi-Isän otteesta.,%o n'a pu échapper a l'emprise du Maître des Traditions.,,%o nem tudott elmenekülni a Tan Mester elől.,%o non è riuscito a sfuggire alla stretta del Sapiente.,%o はロアマスターの手から逃れられなかった。,%o 은(는) 로어마스터의 촉수를 벗어나지 못했다.,%o kon niet ontsnappen aan de greep van de kennismeester.,%o kunne ikke unnslippe Loremesterens grep.,%o nie m@[irreg_4_pl] uniknąć chwytu Mędrca.,%o não conseguiu escapar do alcance do Mestre do Conhecimento.,,"%o n-a putut scăpa din mâinile Maestrului Cunoștințelor.",Игрок %o не смог избежать длани Хранителя мудрости.,%o није успе@[ao_1_sr] побећи из Чувареве мудрости домашаја.,%o kunde inte fly från läromästarens grepp.,"%o, İrfan Ustası'nın elinden kaçamadı.",%o не здужа@[adj_1_ua] хват Хранителя мудрості. -%o was deleted by the Programmer.,OB_PROGRAMMER,,,,%o byl@[ao_cs] vymazán@[ao_cs] Programátorem.,%o blev slettet af Programmøren.,%o wurde vom Programmierer gelöscht.,,%o eksiĝis de La Programisto.,%o ha sido suprimid@[ao_esp] por El Programador.,%o fue suprimid@[ao_esp] por El Programador.,%o joutui Ohjelmoijan poistamaksi.,%o a été effacé@[e_fr] par le Programmeur.,%o ki lett törölve a Programozó által.,%o è stato cancellato dal Programmatore. ,%o はプログラマーに消去された。,%o 은(는) 프로그래머에 의해 삭제됐다.,%o werd door de programmeur verwijderd.,%o ble slettet av Programmereren.,"%o został@[ao_pl] usunięt@[adj_pl] przez Programistę. +%o was deleted by the Programmer.,OB_PROGRAMMER,,,,%o byl@[ao_cs] vymazán@[ao_cs] Programátorem.,%o blev slettet af Programmøren.,%o wurde vom Programmierer gelöscht.,,%o eksiĝis de La Programisto.,%o ha sido suprimid@[ao_esp] por El Programador.,%o fue suprimid@[ao_esp] por El Programador.,%o joutui Ohjelmoijan poistamaksi.,%o a été effacé@[e_fr] par le Programmeur.,,%o ki lett törölve a Programozó által.,%o è stato cancellato dal Programmatore. ,%o はプログラマーに消去された。,%o 은(는) 프로그래머에 의해 삭제됐다.,%o werd door de programmeur verwijderd.,%o ble slettet av Programmereren.,"%o został@[ao_pl] usunięt@[adj_pl] przez Programistę. ",%o foi deletad@[ao_ptb] pelo Programador.,%o foi apagad@[ao_ptb] pelo Programador.,%o a fost șters de Programator.,Игрока %o удалил Программист.,Играча %о је обрисао Програмер.,%o blev raderad av programmeraren.,%o Programcı tarafından silindi.,Програміст стер %o. -%o was blown away by the Bishop.,OB_STFBISHOP,,,,%o byl@[ao_cs] odpálen@[ao_cs] Biskupem.,%o blev sprængt væk af Biskoppen.,%o wurde vom Bischof weggeblasen.,,%o forbloviĝis de la Episkopo.,%o ha sido volad@[ao_esp] en pedazos por el Obispo.,%o fue volad@[ao_esp] en pedazos por el Obispo.,%o joutui Piispan tyrmäämäksi.,%o a été pulvérisé@[e_fr] par l'Evèque.,%o el lett fújva a Püspök által.,%o è stato spazzato via dal Vescovo. ,%o はビショップに吹き飛ばされた。,%o 은(는) 비숍에 의해 초토화되었다.,%o werd door de bisschop weggeblazen.,%o ble blåst bort av biskopen.,%o został@[ao_pl] wysadzon@[adj_pl] przez Biskupa.,%o foi detonad@[ao_ptb] pelo Bispo.,,%o a fost aruncat cât colo de Episcop.,Игрока %o поразил Епископ.,Играча %o је екслопдирао Епископ.,%o blev bortblåst av biskopen.,"%o, Piskopos tarafından havaya uçuruldu.",%o підірвано Єпископом. -%o was shot down by a Sentinel.,OB_SENTINEL,,,,%o byl@[ao_cs] odstřelen@[ao_cs] strážným robotem.,%o blev skudt ned af en Sentinel.,%o wurde von dem Wächter niedergeschossen.,,%o pafegiĝis de Sentinelo.,A %o l@[ao_esp] ha derribado un Centinela.,A %o l@[ao_esp] derribó un Centinela.,%o joutui vartijan ampumaksi.,%o a été abattu@[e_fr] par une Sentinelle.,%o meg lett lőve egy Őrszem által.,%o è stato impallinato dalla Sentinella. ,%o はセンティネルに堕とされた。,%o 은(는) 센티넬의 레이져를 맞았다.,%o werd neergeschoten door een Sentinel.,%o ble skutt ned av en Sentinel.,%o został@[ao_pl] zastrzelon@[adj_pl] przez Wartownika.,%o foi abatid@[ao_ptb] por uma Sentinela.,,%o a fost pus la pământ de o Santinelă.,Игрока %o застрелил страж.,Играча %o је упуцао стражар.,%o blev nedskjuten av en Sentinel.,%o bir Nöbetçi tarafından vuruldu.,Вартовий пристрелив %o. -%o was swept away by a Crusader.,OB_CRUSADER,,,,%o byl@[ao_cs] odhozen@[ao_cs] křižákem.,%o blev fejet væk af en korsfarer.,%o wurde vom Ordensritter weggeblasen.,,%o tute detruiĝis de Krucisto.,A %o l@[ao_esp] ha aniquilado un Cruzado.,A %o l@[ao_esp] aniquiló un Cruzado.,%o joutui ristiretkeläisen pois pyyhkäisemäksi.,%o a été balayé@[e_fr] par un Croisé.,%o el lett söpörve egy Keresztes Lovag által.,%o è stato tolto di mezzo da un Crociato. ,"%o はクルセーダーに一掃された。 +%o was blown away by the Bishop.,OB_STFBISHOP,,,,%o byl@[ao_cs] odpálen@[ao_cs] Biskupem.,%o blev sprængt væk af Biskoppen.,%o wurde vom Bischof weggeblasen.,,%o forbloviĝis de la Episkopo.,%o ha sido volad@[ao_esp] en pedazos por el Obispo.,%o fue volad@[ao_esp] en pedazos por el Obispo.,%o joutui Piispan tyrmäämäksi.,%o a été pulvérisé@[e_fr] par l'Evèque.,,%o el lett fújva a Püspök által.,%o è stato spazzato via dal Vescovo. ,%o はビショップに吹き飛ばされた。,%o 은(는) 비숍에 의해 초토화되었다.,%o werd door de bisschop weggeblazen.,%o ble blåst bort av biskopen.,%o został@[ao_pl] wysadzon@[adj_pl] przez Biskupa.,%o foi detonad@[ao_ptb] pelo Bispo.,,%o a fost aruncat cât colo de Episcop.,Игрока %o поразил Епископ.,Играча %o је екслопдирао Епископ.,%o blev bortblåst av biskopen.,"%o, Piskopos tarafından havaya uçuruldu.",%o підірвано Єпископом. +%o was shot down by a Sentinel.,OB_SENTINEL,,,,%o byl@[ao_cs] odstřelen@[ao_cs] strážným robotem.,%o blev skudt ned af en Sentinel.,%o wurde von dem Wächter niedergeschossen.,,%o pafegiĝis de Sentinelo.,A %o l@[ao_esp] ha derribado un Centinela.,A %o l@[ao_esp] derribó un Centinela.,%o joutui vartijan ampumaksi.,%o a été abattu@[e_fr] par une Sentinelle.,,%o meg lett lőve egy Őrszem által.,%o è stato impallinato dalla Sentinella. ,%o はセンティネルに堕とされた。,%o 은(는) 센티넬의 레이져를 맞았다.,%o werd neergeschoten door een Sentinel.,%o ble skutt ned av en Sentinel.,%o został@[ao_pl] zastrzelon@[adj_pl] przez Wartownika.,%o foi abatid@[ao_ptb] por uma Sentinela.,,%o a fost pus la pământ de o Santinelă.,Игрока %o застрелил страж.,Играча %o је упуцао стражар.,%o blev nedskjuten av en Sentinel.,%o bir Nöbetçi tarafından vuruldu.,Вартовий пристрелив %o. +%o was swept away by a Crusader.,OB_CRUSADER,,,,%o byl@[ao_cs] odhozen@[ao_cs] křižákem.,%o blev fejet væk af en korsfarer.,%o wurde vom Ordensritter weggeblasen.,,%o tute detruiĝis de Krucisto.,A %o l@[ao_esp] ha aniquilado un Cruzado.,A %o l@[ao_esp] aniquiló un Cruzado.,%o joutui ristiretkeläisen pois pyyhkäisemäksi.,%o a été balayé@[e_fr] par un Croisé.,,%o el lett söpörve egy Keresztes Lovag által.,%o è stato tolto di mezzo da un Crociato. ,"%o はクルセーダーに一掃された。 ",%o 은(는) 크루세이더의 공격에 날라갔다.,%o werd weggevaagd door een kruisvaarder.,%o ble feid bort av en korsfarer.,%o został@[ao_pl] zmiecion@[adj_pl] przez Krzyżowca.,%o foi varrid@[ao_ptb] por um Cruzado.,,%o a fost măturat de un Cruciat.,Игрока %o смёл крестоносец.,%o је обори@[ao_1_sr] с ногу крсташ.,%o sveptes bort av en korsriddare.,%o bir Haçlı tarafından süpürüldü.,%o змів хрестоносець. -%o was sentenced by an Inquisitor.,OB_INQUISITOR,,,,%o byl@[ao_cs] odsouzen@[ao_cs] inkvizitorem.,%o blev dømt af en inkvisitor.,%o wurde vom Inquisitor verurteilt.,,%o kondamniĝis de Inkvizitoro.,A %o l@[ao_esp] ha sentenciado un Inquisidor.,A %o l@[ao_esp] sentenció un Inquisidor.,%o joutui inkvisiittorin tuomitsemaksi.,%o a été condamné@[e_fr] par un Inquisiteur.,%o el lett ítélve egy Vizsgálóbíró által.,%o è stato condannato da un Inquisitore. ,"%o は審問官によって宣告された。 +%o was sentenced by an Inquisitor.,OB_INQUISITOR,,,,%o byl@[ao_cs] odsouzen@[ao_cs] inkvizitorem.,%o blev dømt af en inkvisitor.,%o wurde vom Inquisitor verurteilt.,,%o kondamniĝis de Inkvizitoro.,A %o l@[ao_esp] ha sentenciado un Inquisidor.,A %o l@[ao_esp] sentenció un Inquisidor.,%o joutui inkvisiittorin tuomitsemaksi.,%o a été condamné@[e_fr] par un Inquisiteur.,,%o el lett ítélve egy Vizsgálóbíró által.,%o è stato condannato da un Inquisitore. ,"%o は審問官によって宣告された。 ",%o 은(는) 인퀴지터에 의해 처벌받았다.,%o werd veroordeeld door een inquisiteur.,%o ble dømt av en inkvisitor.,%o został@[ao_pl] skazan@[adj_pl] przez Inkwizytora.,%o foi condenad@[ao_ptb] por um Inquisidor.,,%o a fost condamnat de un Inchizitor.,Игрока %o приговорил инквизитор.,Играчу %o је пресудио инквизитор.,%o blev dömd av en inkvisitor.,%o bir Engizisyoncu tarafından mahkum edildi.,Інквізитор здійснив суд над %o. -%o was bugged by a Stalker.,OB_STALKER,,,,%o se nechal@[ao_cs] otravovat slídilem.,%o blev aflyttet af en Stalker.,%o wurde von dem Jäger genervt.,,%o ĝeniĝis de Gvatanto.,A %o l@[ao_esp] ha fastidiado un Acechador.,A %o l@[ao_esp] fastidió un Acechador.,%o joutui vaanijan häiritsemäksi.,%o a été asticoté@[e_fr] par un chasseur.,%o bogaras lett egy Settenkedő által.,%o è stato violentato da un Cacciatore. ,"%o はストーカーに精神を蝕まれた。 +%o was bugged by a Stalker.,OB_STALKER,,,,%o se nechal@[ao_cs] otravovat slídilem.,%o blev aflyttet af en Stalker.,%o wurde von dem Jäger genervt.,,%o ĝeniĝis de Gvatanto.,A %o l@[ao_esp] ha fastidiado un Acechador.,A %o l@[ao_esp] fastidió un Acechador.,%o joutui vaanijan häiritsemäksi.,%o a été asticoté@[e_fr] par un chasseur.,,%o bogaras lett egy Settenkedő által.,%o è stato violentato da un Cacciatore. ,"%o はストーカーに精神を蝕まれた。 ",%o 은(는) 스토커에게 벌레 물림을 당했다.,%o werd afgeluisterd door een Stalker.,%o ble avlyttet av en Stalker.,%o został@[ao_pl] zaczepion@[adj_pl] przez Prześladowcę.,%o foi atacad@[ao_ptb] por um Caçador.,,%o a fost cicălit de un Hărțuitor.,Игрока %o ужалил преследователь.,Играча %o је убио прогонитељ.,%o blev avlyssnad av en Stalker.,%o bir Takipçi tarafından dinlendi.,%o загриз сталкер. -%o triggered the automatic defenses.,OB_TURRET,,,%o triggered the automatic defences.,%o spustil@[ao_cs] automatickou obranu.,%o udløste det automatiske forsvar.,%o hat die automatische Verteidigung ausgelöst.,,%o ekagigis la aŭtomatajn defendojn.,%o ha activado las defensas automáticas.,%o activó las defensas automáticas.,%o laukaisi automaattipuolustukset.,%o a déclenché les défenses automatiques.,%o bekapcsolta az automata védelmi rendszert.,%o ha attivato le difese automatiche. ,%o は警備システムを起動してしまった。,%o 은(는) 경비 시스템에 발각되었다.,%o activeerde de automatische verdediging.,%o utløste det automatiske forsvaret.,%o aktywował@[ao_pl] automatyczne zabezpieczenia.,%o ativou as defesas automáticas.,,%o a alertat sistemul de protecție automat.,Из-за игрока %o активировалась автоматическая защита.,%o је активира@[ao_1_sr] дефанзивне системе.,%o utlöste det automatiska försvaret.,%o otomatik savunmayı tetikledi.,%o активува@[adj_1_ua] автоматичний захист. -%o was clawed by a Templar.,OB_TEMPLARHIT,,,,%o byl@[ao_cs] rozsápán@[ao_cs] templářem.,%o blev kløet af en Tempelridder.,%o wurde von dem Templer aufgeschlitzt.,,%o ungegiĝis de Templano.,A %o l@[ao_esp] ha desgarrado un Templario.,A %o l@[ao_esp] desgarró un Templario.,%o joutui temppeliherran raatelemaksi.,%o a été griffé@[e_fr] par un Templier.,%o meg lett karmolva egy Templomos által.,%o è stato artigliato da un Templare. ,%o は騎士団員に連行された。,%o 은(는) 템플러에게 할큄을 당했다.,%o werd geklauwd door een Tempelier.,%o ble klort av en tempelridder.,%o został@[ao_pl] rozszarpan@[adj_pl] przez Templariusza.,%o foi rasgad@[ao_ptb] por um Templário.,,%o a fost zgâriat de un Templier.,Игрока %o разорвал храмовник.,%o је пресечен@[adj_1_sr] од стране темплара.,%o blev klömsugen av en tempelriddare.,%o bir Tapınakçı tarafından pençelendi.,%o розірвав тамплієр. -%o was vaporized by a Templar.,OB_TEMPLAR,,,,%o byl@[ao_cs] rozpuštěn@[ao_cs] templářem.,%o blev fordampet af en Tempelridder.,%o wurde von dem Templer vaporisiert.,,%o vaporiĝis de Templano.,A %o l@[ao_esp] ha vaporizado un Templario.,A %o l@[ao_esp] vaporizó un Templario.,%o joutui temppeliherran höyryttämäksi.,%o a été vaporisé@[e_fr] par un Templier.,%o elpárolgott egy Templomos által.,%o è stato vaporizzato da un Templare. ,%o は騎士団員に浄化された。,%o 은(는) 템플러에 의해 존재가 소멸됐다.,%o werd verdampt door een Tempelier.,%o ble fordampet av en tempelridder.,%o rozpłyn@[irreg_2_pl] się przez Templariusza.,%o foi vaporizad@[ao_ptb] por um Templário.,,%o a fost vaporizat de un Templier.,Игрока %o испепелил храмовник.,Играча %o је испарио темплар.,%o blev förångad av en tempelriddare.,%o bir Tapınakçı tarafından buharlaştırıldı.,Тамплієр розсіяв %o. -%o was sliced open by a Reaver.,OB_REAVERHIT,,,,%o byl@[ao_cs] rozřezán@[ao_cs] pleničem.,%o blev skåret op af en Reaver.,%o wude von dem Plünderer aufgeschlitzt.,,%o distranĉiĝis de Lertulo.,A %o l@[ao_esp] ha rebanado un Saqueador.,A %o l@[ao_esp] rebanó un Saqueador.,%o joutui raastajan auki viiltämäksi.,%o a été fendu@[e_fr] par un Reaver.,%o szét lett vágva egy Fosztogató által.,%o è stato aperto a metà da un Saccheggiatore. ,%o はリーバーに切り裂かれた。,%o 은(는) 리버에게 해부되었다.,%o werd opengesneden door een Reaver.,%o ble skåret opp av en Reaver.,%o został@[ao_pl] rozcięt@[adj_pl] przez Rozbójnika.,%o foi fatiad@[ao_ptb] por um Saqueador.,,%o a fost feliat de un Pungaș.,Игрока %o разрезал на куски похититель.,%o је исечен@[adj_1_sr] на отворено од стране сакупљача.,%o blev uppskuren av en Reaver.,%o bir Yağmacı tarafından kesildi.,Рейдер нарізав на куски %o. -%o was shot down by a Reaver.,OB_REAVER,,,,%o byl@[ao_cs] zastřelen@[ao_cs] pleničem.,%o blev skudt ned af en Reaver.,%o wurde von dem Plünderer niedergeschossen.,,%o pafegiĝis de Lertulo.,A %o l@[ao_esp] ha derribado un Saqueador.,A %o l@[ao_esp] derribó un Saqueador.,%o joutui raastajan alas ampumaksi.,%o a été descendu@[e_fr] par un Reaver.,%o le lett lőve egy Fosztogató által.,%o è stato colpito da un Saccheggiatore. ,%o はリーバーに撃ち殺された。,%o 은(는) 리버에게 격파되었다.,%o werd neergeschoten door een Reaver.,%o ble skutt ned av en Reaver.,%o został@[ao_pl] zastrzelon@[adj_pl] przez Rozbójnika.,%o foi abatid@[ao_ptb] por um Saqueador.,,%o a fost împușcat de un Pungaș.,Игрока %o застрелил похититель.,Играча %o је упуцао сакупљач.,%o blev nedskjuten av en Reaver.,%o bir Yağmacı tarafından vuruldu.,Рейдер пристрелив %o. -%o was unwittingly backstabbed by %k.,OB_MPPUNCHDAGGER,,,,%o dostal@[ao_cs] kudlou do zad od hráče %k.,%o blev ufrivilligt stukket i ryggen af %k.,%o wurde von %k hinterrücks erdolcht.,,%o akcidente dorspikiĝis de %k.,%o ha sido apuñalad@[ao_esp] sin querer por %k.,%o fue apuñalad@[ao_esp] sin querer por %k.,%o joutui tahattomasti pelaajan %k selkäänpuukottamaksi.,%o s'est fait@[e_fr] planter un lame dans le dos de la part de %k.,%o véletlenül hátbalett szúrva %k által.,%o è stato colto alle spalle da %k senza che se ne accorgesse.,%o は電気ショックを %k からもらった。,%o 은(는) 모르는 사이에 %k 에 의해 비수를 찔렸다.,%o werd achtergestoken door %k.,%o ble uforvarende dolket i ryggen av %k.,%o został@[ao_pl] bezwiednie dźgnięt@[adj_pl] przez %k.,%o foi apunhalad@[ao_ptb] de surpresa por %k.,,%o a fost înjunghiat pe la spate de %k.,Игрок %o был непреднамеренно заколот кинжалом игрока %k.,%o је убоден@[adj_1_sr] у леђа од стране играча %k.,%o blev omedvetet knivhuggen i ryggen av %k.,"%o, %k tarafından farkında olmadan arkadan bıçaklandı.",%k випадково заріза@[adj_1_ua] %o. -%o got bolted to the wall by %k.,OB_MPELECTRICBOLT,,,,%o byl@[ao_cs] přišpendlen@[ao_cs] ke zdi hráčem %k.,%o blev boltet fast til væggen af %k.,%o wurde von %k an die Wand genagelt.,,%o pafiĝis de sageto sur la muro de %k.,%o ha quedado atornillad@[ao_esp] a la pared por %k.,%o quedó atornillad@[ao_esp] a la pared por %k.,%o naulitsi %o paran seinään.,%o s'est fait@[e_fr] clouer au mur par %k.,%o falra lett szegezve %k által.,%o è stato inchiodato al muro da %k.,%o は %k に壁へ打ち付けられた。,%o 은(는) %k 의 전류가 흐르는 볼트촉을 만졌다.,%o werd door %k aan de muur geschroefd.,%o ble boltet fast til veggen av %k.,%o został@[ao_pl] przybit@[adj_pl] do ściany przez %k.,%o foi pregad@[ao_ptb] na parede por %k.,,%o a fost agățat de perete de %k.,Игрок %o был прибит к стене игроком %k.,%o је причвршћен@[adj_1_sr] за зид од стране играча %k.,%o blev bultad mot väggen av %k.,"%o, %k tarafından duvara yapıştırıldı.",%k приби@[adj_1_ua] до стіни %o. -%o received a lethal dose of %k's wrath.,OB_MPPOISONBOLT,,,,%o přijal@[ao_cs] smrtelnou dávku hněvu hráče %k.,%o fik en dødelig dosis af %ks vrede.,%o erhielt eine tödliche Dosis von %ks Zorn.,,%o recivis mortigan dozon de la kolerego de %k.,%o ha recibido una dosis letal de la ira de %k.,%o recibió una dosis letal de la ira de %k.,%o sai tappavan annoksen pelaajan %k vihaa.,%o a recu une dose létale de la colère de %k.,%o kapott egy halálos adagot %k-tól/től.,%o ha ricevuto una dose letale dell'ira di %k.,%o は 致死量の %k の怒りを盛られた。,%o 은(는) %k 로부터 암살 같지 않은 암살을 당했다.,%o kreeg een dodelijke dosis van %k's toorn.,%o fikk en dødelig dose av %ks vrede.,%o dostał@[ao_pl] śmiertelną dawkę gniewu %k.,%o recebeu uma dose letal da ira de %k.,,%o a primit o doză letală din furia lui %k.,Игрок %o получил смертельную дозу гнева игрока %k.,%o је доби@[ao_1_sr] смртну дозу гнева играча %k.,%o fick en dödlig dos av %ks vrede.,"%o, %k tarafından zehirlendi.",%o відчу@[adj_1_ua] смертельну дозу гніву %k. -%o was drilled full of holes by %k's assault gun.,OB_MPASSAULTGUN,,,,%o byl@[ao_cs] proděravěn@[ao_cs] skrz na skrz puškou hráče %k.,%o blev boret fuld af huller af %ks angrebspistol.,%o wurde von %ks Sturmgewehr perforiert.,,%o boriĝis kun multaj truoj de la sturmofusilo de %k.,%o ha sido taladrad@[ao_esp] por el fusil de asalto de %k.,%o fue taladrad@[ao_esp] por el fusil de asalto de %k.,%k porasi %o paran täyteen reikiä rynnäkkökiväärillään.,%o s'est fait@[e_fr] couvrir de trous par le fusil d'assaut de %k.,%o ki lett lyukasztva %k Gépfegyvere által.,%o è stato crivellato dall'arma d'assalto di %k.,%o は %k のアサルトガンで穴だらけにされた。,%o 은(는) %k 의 돌격소총 덕분에 멋진 구멍을 선물 받았다.,%o werd geperforeerd door %k.,%o ble boret full av hull av %ks stormgevær.,%o został@[ao_pl] przedziurkowan@[adj_pl] przez karabin szturmowy %k.,%o foi perfurad@[ao_ptb] pelo fuzil de assalto de %k.,,"%o a fost umplut de găuri de pușca lui +%o triggered the automatic defenses.,OB_TURRET,,,%o triggered the automatic defences.,%o spustil@[ao_cs] automatickou obranu.,%o udløste det automatiske forsvar.,%o hat die automatische Verteidigung ausgelöst.,,%o ekagigis la aŭtomatajn defendojn.,%o ha activado las defensas automáticas.,%o activó las defensas automáticas.,%o laukaisi automaattipuolustukset.,%o a déclenché les défenses automatiques.,,%o bekapcsolta az automata védelmi rendszert.,%o ha attivato le difese automatiche. ,%o は警備システムを起動してしまった。,%o 은(는) 경비 시스템에 발각되었다.,%o activeerde de automatische verdediging.,%o utløste det automatiske forsvaret.,%o aktywował@[ao_pl] automatyczne zabezpieczenia.,%o ativou as defesas automáticas.,,%o a alertat sistemul de protecție automat.,Из-за игрока %o активировалась автоматическая защита.,%o је активира@[ao_1_sr] дефанзивне системе.,%o utlöste det automatiska försvaret.,%o otomatik savunmayı tetikledi.,%o активува@[adj_1_ua] автоматичний захист. +%o was clawed by a Templar.,OB_TEMPLARHIT,,,,%o byl@[ao_cs] rozsápán@[ao_cs] templářem.,%o blev kløet af en Tempelridder.,%o wurde von dem Templer aufgeschlitzt.,,%o ungegiĝis de Templano.,A %o l@[ao_esp] ha desgarrado un Templario.,A %o l@[ao_esp] desgarró un Templario.,%o joutui temppeliherran raatelemaksi.,%o a été griffé@[e_fr] par un Templier.,,%o meg lett karmolva egy Templomos által.,%o è stato artigliato da un Templare. ,%o は騎士団員に連行された。,%o 은(는) 템플러에게 할큄을 당했다.,%o werd geklauwd door een Tempelier.,%o ble klort av en tempelridder.,%o został@[ao_pl] rozszarpan@[adj_pl] przez Templariusza.,%o foi rasgad@[ao_ptb] por um Templário.,,%o a fost zgâriat de un Templier.,Игрока %o разорвал храмовник.,%o је пресечен@[adj_1_sr] од стране темплара.,%o blev klömsugen av en tempelriddare.,%o bir Tapınakçı tarafından pençelendi.,%o розірвав тамплієр. +%o was vaporized by a Templar.,OB_TEMPLAR,,,,%o byl@[ao_cs] rozpuštěn@[ao_cs] templářem.,%o blev fordampet af en Tempelridder.,%o wurde von dem Templer vaporisiert.,,%o vaporiĝis de Templano.,A %o l@[ao_esp] ha vaporizado un Templario.,A %o l@[ao_esp] vaporizó un Templario.,%o joutui temppeliherran höyryttämäksi.,%o a été vaporisé@[e_fr] par un Templier.,,%o elpárolgott egy Templomos által.,%o è stato vaporizzato da un Templare. ,%o は騎士団員に浄化された。,%o 은(는) 템플러에 의해 존재가 소멸됐다.,%o werd verdampt door een Tempelier.,%o ble fordampet av en tempelridder.,%o rozpłyn@[irreg_2_pl] się przez Templariusza.,%o foi vaporizad@[ao_ptb] por um Templário.,,%o a fost vaporizat de un Templier.,Игрока %o испепелил храмовник.,Играча %o је испарио темплар.,%o blev förångad av en tempelriddare.,%o bir Tapınakçı tarafından buharlaştırıldı.,Тамплієр розсіяв %o. +%o was sliced open by a Reaver.,OB_REAVERHIT,,,,%o byl@[ao_cs] rozřezán@[ao_cs] pleničem.,%o blev skåret op af en Reaver.,%o wude von dem Plünderer aufgeschlitzt.,,%o distranĉiĝis de Lertulo.,A %o l@[ao_esp] ha rebanado un Saqueador.,A %o l@[ao_esp] rebanó un Saqueador.,%o joutui raastajan auki viiltämäksi.,%o a été fendu@[e_fr] par un Reaver.,,%o szét lett vágva egy Fosztogató által.,%o è stato aperto a metà da un Saccheggiatore. ,%o はリーバーに切り裂かれた。,%o 은(는) 리버에게 해부되었다.,%o werd opengesneden door een Reaver.,%o ble skåret opp av en Reaver.,%o został@[ao_pl] rozcięt@[adj_pl] przez Rozbójnika.,%o foi fatiad@[ao_ptb] por um Saqueador.,,%o a fost feliat de un Pungaș.,Игрока %o разрезал на куски похититель.,%o је исечен@[adj_1_sr] на отворено од стране сакупљача.,%o blev uppskuren av en Reaver.,%o bir Yağmacı tarafından kesildi.,Рейдер нарізав на куски %o. +%o was shot down by a Reaver.,OB_REAVER,,,,%o byl@[ao_cs] zastřelen@[ao_cs] pleničem.,%o blev skudt ned af en Reaver.,%o wurde von dem Plünderer niedergeschossen.,,%o pafegiĝis de Lertulo.,A %o l@[ao_esp] ha derribado un Saqueador.,A %o l@[ao_esp] derribó un Saqueador.,%o joutui raastajan alas ampumaksi.,%o a été descendu@[e_fr] par un Reaver.,,%o le lett lőve egy Fosztogató által.,%o è stato colpito da un Saccheggiatore. ,%o はリーバーに撃ち殺された。,%o 은(는) 리버에게 격파되었다.,%o werd neergeschoten door een Reaver.,%o ble skutt ned av en Reaver.,%o został@[ao_pl] zastrzelon@[adj_pl] przez Rozbójnika.,%o foi abatid@[ao_ptb] por um Saqueador.,,%o a fost împușcat de un Pungaș.,Игрока %o застрелил похититель.,Играча %o је упуцао сакупљач.,%o blev nedskjuten av en Reaver.,%o bir Yağmacı tarafından vuruldu.,Рейдер пристрелив %o. +%o was unwittingly backstabbed by %k.,OB_MPPUNCHDAGGER,,,,%o dostal@[ao_cs] kudlou do zad od hráče %k.,%o blev ufrivilligt stukket i ryggen af %k.,%o wurde von %k hinterrücks erdolcht.,,%o akcidente dorspikiĝis de %k.,%o ha sido apuñalad@[ao_esp] sin querer por %k.,%o fue apuñalad@[ao_esp] sin querer por %k.,%o joutui tahattomasti pelaajan %k selkäänpuukottamaksi.,%o s'est fait@[e_fr] planter un lame dans le dos de la part de %k.,,%o véletlenül hátbalett szúrva %k által.,%o è stato colto alle spalle da %k senza che se ne accorgesse.,%o は電気ショックを %k からもらった。,%o 은(는) 모르는 사이에 %k 에 의해 비수를 찔렸다.,%o werd achtergestoken door %k.,%o ble uforvarende dolket i ryggen av %k.,%o został@[ao_pl] bezwiednie dźgnięt@[adj_pl] przez %k.,%o foi apunhalad@[ao_ptb] de surpresa por %k.,,%o a fost înjunghiat pe la spate de %k.,Игрок %o был непреднамеренно заколот кинжалом игрока %k.,%o је убоден@[adj_1_sr] у леђа од стране играча %k.,%o blev omedvetet knivhuggen i ryggen av %k.,"%o, %k tarafından farkında olmadan arkadan bıçaklandı.",%k випадково заріза@[adj_1_ua] %o. +%o got bolted to the wall by %k.,OB_MPELECTRICBOLT,,,,%o byl@[ao_cs] přišpendlen@[ao_cs] ke zdi hráčem %k.,%o blev boltet fast til væggen af %k.,%o wurde von %k an die Wand genagelt.,,%o pafiĝis de sageto sur la muro de %k.,%o ha quedado atornillad@[ao_esp] a la pared por %k.,%o quedó atornillad@[ao_esp] a la pared por %k.,%o naulitsi %o paran seinään.,%o s'est fait@[e_fr] clouer au mur par %k.,,%o falra lett szegezve %k által.,%o è stato inchiodato al muro da %k.,%o は %k に壁へ打ち付けられた。,%o 은(는) %k 의 전류가 흐르는 볼트촉을 만졌다.,%o werd door %k aan de muur geschroefd.,%o ble boltet fast til veggen av %k.,%o został@[ao_pl] przybit@[adj_pl] do ściany przez %k.,%o foi pregad@[ao_ptb] na parede por %k.,,%o a fost agățat de perete de %k.,Игрок %o был прибит к стене игроком %k.,%o је причвршћен@[adj_1_sr] за зид од стране играча %k.,%o blev bultad mot väggen av %k.,"%o, %k tarafından duvara yapıştırıldı.",%k приби@[adj_1_ua] до стіни %o. +%o received a lethal dose of %k's wrath.,OB_MPPOISONBOLT,,,,%o přijal@[ao_cs] smrtelnou dávku hněvu hráče %k.,%o fik en dødelig dosis af %ks vrede.,%o erhielt eine tödliche Dosis von %ks Zorn.,,%o recivis mortigan dozon de la kolerego de %k.,%o ha recibido una dosis letal de la ira de %k.,%o recibió una dosis letal de la ira de %k.,%o sai tappavan annoksen pelaajan %k vihaa.,%o a recu une dose létale de la colère de %k.,,%o kapott egy halálos adagot %k-tól/től.,%o ha ricevuto una dose letale dell'ira di %k.,%o は 致死量の %k の怒りを盛られた。,%o 은(는) %k 로부터 암살 같지 않은 암살을 당했다.,%o kreeg een dodelijke dosis van %k's toorn.,%o fikk en dødelig dose av %ks vrede.,%o dostał@[ao_pl] śmiertelną dawkę gniewu %k.,%o recebeu uma dose letal da ira de %k.,,%o a primit o doză letală din furia lui %k.,Игрок %o получил смертельную дозу гнева игрока %k.,%o је доби@[ao_1_sr] смртну дозу гнева играча %k.,%o fick en dödlig dos av %ks vrede.,"%o, %k tarafından zehirlendi.",%o відчу@[adj_1_ua] смертельну дозу гніву %k. +%o was drilled full of holes by %k's assault gun.,OB_MPASSAULTGUN,,,,%o byl@[ao_cs] proděravěn@[ao_cs] skrz na skrz puškou hráče %k.,%o blev boret fuld af huller af %ks angrebspistol.,%o wurde von %ks Sturmgewehr perforiert.,,%o boriĝis kun multaj truoj de la sturmofusilo de %k.,%o ha sido taladrad@[ao_esp] por el fusil de asalto de %k.,%o fue taladrad@[ao_esp] por el fusil de asalto de %k.,%k porasi %o paran täyteen reikiä rynnäkkökiväärillään.,%o s'est fait@[e_fr] couvrir de trous par le fusil d'assaut de %k.,,%o ki lett lyukasztva %k Gépfegyvere által.,%o è stato crivellato dall'arma d'assalto di %k.,%o は %k のアサルトガンで穴だらけにされた。,%o 은(는) %k 의 돌격소총 덕분에 멋진 구멍을 선물 받았다.,%o werd geperforeerd door %k.,%o ble boret full av hull av %ks stormgevær.,%o został@[ao_pl] przedziurkowan@[adj_pl] przez karabin szturmowy %k.,%o foi perfurad@[ao_ptb] pelo fuzil de assalto de %k.,,"%o a fost umplut de găuri de pușca lui %k.",Игрок %o изрешечён штурмовой винтовкой игрока %k.,%o је изрешетан@[adj_1_sr] од стране јуришне пушке играча %k.,%o blev fullborrad med hål av %ks attackpistol.,"%o, %k tarafından delik deşik edildi.",%k нароби@[adj_1_ua] дірок в %o штурмовою гвинтівкою. -%o gulped down %k's missile.,OB_MPMINIMISSILELAUNCHER,,,,%o spolknul@[ao_cs] raketu hráče %k.,%o slugte %ks missil.,%o schluckte %ks Rakete herunter.,,%o glutis la misilon de %k.,%o se ha tragado el misil de %k.,%o se tragó el misil de %k.,%o nieli alas pelaajan %k ohjuksen.,%o a avalé le missile de %k.,%o lenyelte %k rakétáját.,%o ha inghiottito il missile di %k.,%o は %k のミサイルを味わった。,%o 은(는) %k 의 미니 미사일을 고맙게 삼켰다.,%o heeft %k's raket naar beneden geslingerd.,%o slukte %k's missil.,%o połkn@[irreg_2_pl] rakietę %k.,%o engoliu o míssil de %k.,,%o a înghițit proiectilul lui %k.,Игрок %o проглотил ракету игрока %k.,%o је прогута@[ao_1_sr] ракету играча %k.,%o slukade %ks missil.,"%o, %k tarafından patlatıldı.",%o ковтну@[adj_1_ua] ракети %k. -%o was inverted by %k's H-E grenade.,OB_MPSTRIFEGRENADE,,,,%o byl@[ao_cs] otočen@[ao_cs] naruby výbušným granátem hráče %k.,%o blev omvendt af %ks H-E granat.,%o wurde von %ks HE-Granate invertiert.,,%o estis inversigita de la HE-grenado de %k.,%o ha sido invertid@[ao_esp] por la granada HE de %k.,%o fue invertid@[ao_esp] por la granada HE de %k.,%k käänsi %o paran nurinpäin räjähdekranaatillaan.,%o a été mis@[e_fr] sens dessus dessous par la grenade explosive de %k.,%o ki lett fordítva %k gránátája által.,%o è stato invertito dalla granata H-E di %k.,%o は %k のHE手榴弾によって反逆された。,%o 은(는) %k 의 고폭탄에 의해 역전당했다.,%o werd omgekeerd door %k's HE-granaat.,%o ble invertert av %ks H-E-granat.,%o został@[ao_pl] wywrócon@[adj_pl] przez granat %k.,%o foi peg@[ao_ptb] pelas granadas de %k.,,%o a fost întors pe dos de grenada lui %k.,Игрок %o вывернут наизнанку разрывной гранатой игрока %k.,%o се преокрену@[ao_1_sr] од стране Х-Е гранате играча %k.,%o blev omvänd av %ks H-E-granat.,"%o, %k tarafından ters çevrildi.",%o інвертува@[adj_2_ua] гранатою %k. -%o took a flame bath in %k's phosphorous pyre.,OB_MPPHOSPHOROUSGRENADE,,,,%o si dal@[ao_cs] ohnivou koupel ve fosforovém žáru hráče %k.,%o tog et flambad i %ks fosforbål.,%o nahm ein Flammenbad in %ks Scheiterhaufen.,,%o prenis flaman banon en la fosfora ŝtiparo de %k.,%o se ha bañado en las llamas de fósforo de %k.,%o se bañó en las llamas de fósforo de %k.,%o otti liekkikylvyn pelaajan %k fosforiroviolla.,%o s'est permis@[e_fr] une pyroclave dans les flammes phosphoriques de %k.,%o kapott egy tűzfürdőt %k máglyájától.,%o ha fatto un bagno nelle fiamme nella pira di fosforo di %k.,%o は %k の白リン弾で炎に包まれた。,%o 은(는) %k 의 소이탄이 뿜는 화염에 몸을 담갔다.,%o nam een vlammenbad in %k's fosforbrandstapel.,%o tok et flammebad i %ks fosforbål.,%o wzi@[irreg_2_pl] ognistą kąpiel w fosforowym stosie %k.,%o se banhou nas chamas de fósforo de %k.,,%o a făcut o baie fierbinte in fosforul lui %k.,Игрок %o принял горячую ванну из чистого фосфора игрока %k.,%o се окупа@[ao_1_sr] у пламену од стране фосфорне гранате играча %k.,%o tog ett flambad i %ks fosforbål.,"%o, %k tarafından fosforlu ateşte alev banyosu yaptırıldı.",%k приготува@[adj_1_ua] ванну з чистого фосфору для %o. -%o was barbecued by %k.,OB_MPFLAMETHROWER,,,,%o byl@[ao_cs] usmažen@[ao_cs] hráčem %k.,%o blev grillet af %k.,%o wurde von %k gegrillt,,%o kradrostiĝis de %k.,%o ha sido asad@[ao_esp] por %k.,%o fue asad@[ao_esp] por %k.,%k grillasi %o paran.,%o est passé@[e_fr] au barbecue de %k.,%o meg lett sütve %k által.,%o è stato fatto alla griglia da %k.,%o は %k に丸焼きにされてしまった。,%o 은(는) %k 의 바비큐 파티에 참여했다. 혼자서.,%o werd gebarbecued door %k.,%o ble grillet av %k.,%o został@[ao_pl] ugrillowan@[adj_pl] przez %k.,%o virou churrasco por causa de %k.,,%o a fost făcut grătar de %k.,Игрок %k поджарил игрока %o.,%o је реш печен@[adj_1_sr] од стране играча %k.,%o blev grillad av %k.,"%o, %k tarafından mangalda pişirildi.",%k зажари@[adj_1_ua] %o. -%o was zapped by %k.,OB_MPMAULER1,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k.,%o blev zappet af %k.,%o wurde von %k geschockt.,,%o elektrokutiĝis de %k.,A %o l@[ao_esp] ha electrocutado %k.,A %o l@[ao_esp] electrocutó %k.,%o joutui pelaajan %k sähköistämäksi.,%o s'est fait@[e_fr] électrocuter par %k.,%o kapott egy áramot %k által.,%o è stato fulminato da %k.,%o は %k から電気ショックを浴びた。,%o 은(는) %k 이(가) 가한 전기 충격을 당했다.,%o werd door %k gezapt.,%o fikk støt av %k.,%o został@[ao_pl] porażon@[adj_pl] przez %k.,%o foi eletrocutad@[ao_ptb] por %k.,,%o a fost electrocutat de %k.,Игрок %k ударил током игрока %o.,%o је елетрошокиран@[adj_1_sr] од стране играча %k.,%o blev zappad av %k.,"%o, %k tarafından zaplandı.",%o отрима@[adj_1_ua] дозу струму від %k. -%o was viciously vaporized by %k.,OB_MPMAULER,,,,%o byl@[ao_cs] rozpuštěn@[ao_cs] hráčem %k.,%o blev brutalt fordampet af %k.,%o wurde von %k vaporisiert.,,%o estis brutale vaporigita de %k.,%o ha sido ferozmente vaporizad@[ao_esp] por %k.,%o fue ferozmente vaporizad@[ao_esp] por %k.,%o joutui pelaajan %k höyrystämäksi.,%o à été vicieusement vaporisé@[e_fr] par %k.,%o elpárolgott %k által.,%o è stato crudelmente vaporizzato da %k.,%o は %k の悪辣さにより気化した。,%o 은(는) %k 에 의해 소극적으로 소멸되었다.,%o was door %k verdampt.,%o ble ondskapsfullt fordampet av %k.,%o rozpłyn@[irreg_2_pl] się przez %k.,%o foi vaporizad@[ao_ptb] por %k.,,%o a fost evaporat în mod violent de %k.,Игрок %k безжалостно распылил игрока %o.,%o је брутално испари@[ao_1_sr] од стране играча %k.,%o blev brutalt förångad av %k.,"%o, %k tarafından acımasızca buharlaştırıldı.",%k безжалісно розсія@[adj_1_ua] %o. -%o bowed down to the sheer power of %k's Sigil.,OB_MPSIGIL,,,,%o poklekl@[ao_cs] před čirou sílou Pečeti hráče %k.,%o bøjede sig for %ks sigil.,%o kapitulierte vor der Macht von %ks Sigil.,,%o kliniĝis antaŭ la plena potenco de la Sigelo de %k.,%o se ha inclinado ante el poder puro del emblema de %k.,%o se inclinó ante el poder puro del emblema de %k.,%o kumartui pelaajan %k Sinetin silkasta voimasta.,%o s'est prosterné@[e_fr] face à la toute puissance du Sigil de %k.,%o fejet hajtott %k Pecsétje ereje előtt.,%o si è prostrato davanti alla pura potenza del Sigillo di %k.,%o は %k のシジルによる威圧に屈した。,%o 은(는) %k 를 죽이기 전에 시질의 이름으로 절을 해야만 했다.,%o boog voor de kracht van %k's Sigil.,%o bøyde seg for kraften til %ks Sigil.,%o pokłonił@[ao_pl] się czystej mocy Pieczęci %k.,%o sentiu o poder do Sigilo de %k.,,"%o s-a plecat în fața puterii imense a Sigiliului +%o gulped down %k's missile.,OB_MPMINIMISSILELAUNCHER,,,,%o spolknul@[ao_cs] raketu hráče %k.,%o slugte %ks missil.,%o schluckte %ks Rakete herunter.,,%o glutis la misilon de %k.,%o se ha tragado el misil de %k.,%o se tragó el misil de %k.,%o nieli alas pelaajan %k ohjuksen.,%o a avalé le missile de %k.,,%o lenyelte %k rakétáját.,%o ha inghiottito il missile di %k.,%o は %k のミサイルを味わった。,%o 은(는) %k 의 미니 미사일을 고맙게 삼켰다.,%o heeft %k's raket naar beneden geslingerd.,%o slukte %k's missil.,%o połkn@[irreg_2_pl] rakietę %k.,%o engoliu o míssil de %k.,,%o a înghițit proiectilul lui %k.,Игрок %o проглотил ракету игрока %k.,%o је прогута@[ao_1_sr] ракету играча %k.,%o slukade %ks missil.,"%o, %k tarafından patlatıldı.",%o ковтну@[adj_1_ua] ракети %k. +%o was inverted by %k's H-E grenade.,OB_MPSTRIFEGRENADE,,,,%o byl@[ao_cs] otočen@[ao_cs] naruby výbušným granátem hráče %k.,%o blev omvendt af %ks H-E granat.,%o wurde von %ks HE-Granate invertiert.,,%o estis inversigita de la HE-grenado de %k.,%o ha sido invertid@[ao_esp] por la granada HE de %k.,%o fue invertid@[ao_esp] por la granada HE de %k.,%k käänsi %o paran nurinpäin räjähdekranaatillaan.,%o a été mis@[e_fr] sens dessus dessous par la grenade explosive de %k.,,%o ki lett fordítva %k gránátája által.,%o è stato invertito dalla granata H-E di %k.,%o は %k のHE手榴弾によって反逆された。,%o 은(는) %k 의 고폭탄에 의해 역전당했다.,%o werd omgekeerd door %k's HE-granaat.,%o ble invertert av %ks H-E-granat.,%o został@[ao_pl] wywrócon@[adj_pl] przez granat %k.,%o foi peg@[ao_ptb] pelas granadas de %k.,,%o a fost întors pe dos de grenada lui %k.,Игрок %o вывернут наизнанку разрывной гранатой игрока %k.,%o се преокрену@[ao_1_sr] од стране Х-Е гранате играча %k.,%o blev omvänd av %ks H-E-granat.,"%o, %k tarafından ters çevrildi.",%o інвертува@[adj_2_ua] гранатою %k. +%o took a flame bath in %k's phosphorous pyre.,OB_MPPHOSPHOROUSGRENADE,,,,%o si dal@[ao_cs] ohnivou koupel ve fosforovém žáru hráče %k.,%o tog et flambad i %ks fosforbål.,%o nahm ein Flammenbad in %ks Scheiterhaufen.,,%o prenis flaman banon en la fosfora ŝtiparo de %k.,%o se ha bañado en las llamas de fósforo de %k.,%o se bañó en las llamas de fósforo de %k.,%o otti liekkikylvyn pelaajan %k fosforiroviolla.,%o s'est permis@[e_fr] une pyroclave dans les flammes phosphoriques de %k.,,%o kapott egy tűzfürdőt %k máglyájától.,%o ha fatto un bagno nelle fiamme nella pira di fosforo di %k.,%o は %k の白リン弾で炎に包まれた。,%o 은(는) %k 의 소이탄이 뿜는 화염에 몸을 담갔다.,%o nam een vlammenbad in %k's fosforbrandstapel.,%o tok et flammebad i %ks fosforbål.,%o wzi@[irreg_2_pl] ognistą kąpiel w fosforowym stosie %k.,%o se banhou nas chamas de fósforo de %k.,,%o a făcut o baie fierbinte in fosforul lui %k.,Игрок %o принял горячую ванну из чистого фосфора игрока %k.,%o се окупа@[ao_1_sr] у пламену од стране фосфорне гранате играча %k.,%o tog ett flambad i %ks fosforbål.,"%o, %k tarafından fosforlu ateşte alev banyosu yaptırıldı.",%k приготува@[adj_1_ua] ванну з чистого фосфору для %o. +%o was barbecued by %k.,OB_MPFLAMETHROWER,,,,%o byl@[ao_cs] usmažen@[ao_cs] hráčem %k.,%o blev grillet af %k.,%o wurde von %k gegrillt,,%o kradrostiĝis de %k.,%o ha sido asad@[ao_esp] por %k.,%o fue asad@[ao_esp] por %k.,%k grillasi %o paran.,%o est passé@[e_fr] au barbecue de %k.,,%o meg lett sütve %k által.,%o è stato fatto alla griglia da %k.,%o は %k に丸焼きにされてしまった。,%o 은(는) %k 의 바비큐 파티에 참여했다. 혼자서.,%o werd gebarbecued door %k.,%o ble grillet av %k.,%o został@[ao_pl] ugrillowan@[adj_pl] przez %k.,%o virou churrasco por causa de %k.,,%o a fost făcut grătar de %k.,Игрок %k поджарил игрока %o.,%o је реш печен@[adj_1_sr] од стране играча %k.,%o blev grillad av %k.,"%o, %k tarafından mangalda pişirildi.",%k зажари@[adj_1_ua] %o. +%o was zapped by %k.,OB_MPMAULER1,,,,%o byl@[ao_cs] zničen@[ao_cs] hráčem %k.,%o blev zappet af %k.,%o wurde von %k geschockt.,,%o elektrokutiĝis de %k.,A %o l@[ao_esp] ha electrocutado %k.,A %o l@[ao_esp] electrocutó %k.,%o joutui pelaajan %k sähköistämäksi.,%o s'est fait@[e_fr] électrocuter par %k.,,%o kapott egy áramot %k által.,%o è stato fulminato da %k.,%o は %k から電気ショックを浴びた。,%o 은(는) %k 이(가) 가한 전기 충격을 당했다.,%o werd door %k gezapt.,%o fikk støt av %k.,%o został@[ao_pl] porażon@[adj_pl] przez %k.,%o foi eletrocutad@[ao_ptb] por %k.,,%o a fost electrocutat de %k.,Игрок %k ударил током игрока %o.,%o је елетрошокиран@[adj_1_sr] од стране играча %k.,%o blev zappad av %k.,"%o, %k tarafından zaplandı.",%o отрима@[adj_1_ua] дозу струму від %k. +%o was viciously vaporized by %k.,OB_MPMAULER,,,,%o byl@[ao_cs] rozpuštěn@[ao_cs] hráčem %k.,%o blev brutalt fordampet af %k.,%o wurde von %k vaporisiert.,,%o estis brutale vaporigita de %k.,%o ha sido ferozmente vaporizad@[ao_esp] por %k.,%o fue ferozmente vaporizad@[ao_esp] por %k.,%o joutui pelaajan %k höyrystämäksi.,%o à été vicieusement vaporisé@[e_fr] par %k.,,%o elpárolgott %k által.,%o è stato crudelmente vaporizzato da %k.,%o は %k の悪辣さにより気化した。,%o 은(는) %k 에 의해 소극적으로 소멸되었다.,%o was door %k verdampt.,%o ble ondskapsfullt fordampet av %k.,%o rozpłyn@[irreg_2_pl] się przez %k.,%o foi vaporizad@[ao_ptb] por %k.,,%o a fost evaporat în mod violent de %k.,Игрок %k безжалостно распылил игрока %o.,%o је брутално испари@[ao_1_sr] од стране играча %k.,%o blev brutalt förångad av %k.,"%o, %k tarafından acımasızca buharlaştırıldı.",%k безжалісно розсія@[adj_1_ua] %o. +%o bowed down to the sheer power of %k's Sigil.,OB_MPSIGIL,,,,%o poklekl@[ao_cs] před čirou sílou Pečeti hráče %k.,%o bøjede sig for %ks sigil.,%o kapitulierte vor der Macht von %ks Sigil.,,%o kliniĝis antaŭ la plena potenco de la Sigelo de %k.,%o se ha inclinado ante el poder puro del emblema de %k.,%o se inclinó ante el poder puro del emblema de %k.,%o kumartui pelaajan %k Sinetin silkasta voimasta.,%o s'est prosterné@[e_fr] face à la toute puissance du Sigil de %k.,,%o fejet hajtott %k Pecsétje ereje előtt.,%o si è prostrato davanti alla pura potenza del Sigillo di %k.,%o は %k のシジルによる威圧に屈した。,%o 은(는) %k 를 죽이기 전에 시질의 이름으로 절을 해야만 했다.,%o boog voor de kracht van %k's Sigil.,%o bøyde seg for kraften til %ks Sigil.,%o pokłonił@[ao_pl] się czystej mocy Pieczęci %k.,%o sentiu o poder do Sigilo de %k.,,"%o s-a plecat în fața puterii imense a Sigiliului lui %k.",Игрок %o склонился перед силой Печати игрока %k.,%o је одклекну@[ao_1_sr] сировој моћи %k Сигила.,%o böjde sig för den rena kraften i %ks Sigill.,"%o, %k'in Sigil'inin katıksız gücüne boyun eğdi.",%o покори@[adj_2_ua] Сігілу %k. -,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,, -Quest for the Sigil,TXT_STRIFE_EPI,,,,Pátrání za Pečetí,Jagten på Sigilet,Suche nach dem Sigil,,Serĉado por la Sigelo,La búsqueda del Emblema,,Päämääränä Sinetti,La Quête du Sigil,A Pecsét felkutatása,Alla ricerca del Sigillo,シジルの探求,시질을 위한 임무,Zoektocht naar de Sigil,Jakten på sigilet,Poszukiwanie Pieczęci,Em Busca do Sigilo,Demanda pelo Sigilo,În căutarea Sigiliului,В поисках Печати,Потрага за Сигил,Jakten på Sigillet,Sigilin Peşinde, -You've freed the prisoners!,TXT_FREED_PRISONERS,,,,Vysvobodil@[ao_cs] jsi vězně!,Du har befriet fangerne!,Du hast die Gefangenen befreit!,,Vi liberigis la kaptitojn!,¡Has liberado a los prisioneros!,¡Liberaste a los prisioneros!,Olet vapauttanut vangit!,Vous avez libéré les prisonniers!,Kiszabadítottad a foglyokat!,"Hai liberato i prigionieri! +,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,,, +Quest for the Sigil,TXT_STRIFE_EPI,,,,Pátrání za Pečetí,Jagten på Sigilet,Suche nach dem Sigil,,Serĉado por la Sigelo,La búsqueda del Emblema,,Päämääränä Sinetti,La Quête du Sigil,,A Pecsét felkutatása,Alla ricerca del Sigillo,シジルの探求,시질을 위한 임무,Zoektocht naar de Sigil,Jakten på sigilet,Poszukiwanie Pieczęci,Em Busca do Sigilo,Demanda pelo Sigilo,În căutarea Sigiliului,В поисках Печати,Потрага за Сигил,Jakten på Sigillet,Sigilin Peşinde,В пошуках Сігілу +You've freed the prisoners!,TXT_FREED_PRISONERS,,,,Vysvobodil@[ao_cs] jsi vězně!,Du har befriet fangerne!,Du hast die Gefangenen befreit!,,Vi liberigis la kaptitojn!,¡Has liberado a los prisioneros!,¡Liberaste a los prisioneros!,Olet vapauttanut vangit!,Vous avez libéré les prisonniers!,,Kiszabadítottad a foglyokat!,"Hai liberato i prigionieri! ",囚人を解放した!,죄수들을 탈옥시켰다!,Je hebt de gevangenen bevrijd!,Du har befridd fangene!,Uwolnił@[irreg_3_pl] więźniów,Você liberou os prisioneiros!,Libertaste os prisioneiros!,Ai eliberat prizonierii!,Пленники освобождены!,Затвореници су ослобођени!,Du har befriat fångarna!,Mahkumları serbest bıraktınız!,Ви звільнили в'язнів! -You've destroyed the Converter!,TXT_DESTROYED_CONVERTER,,,,Zničil@[ao_cs] jsi konvertér!,Du har ødelagt konverteren!,Du hast den Konverter zerstört!,,Vi detruis la konvertilon!,¡Has destruido el convertidor!,¡Destruiste el convertidor!,Olet tuhonnut muuntajan!,Vous avez détruit le convertisseur!,Elpusztítottad a konvertálót!,Hai distrutto i Convertitori!,コンバーターを破壊した!,개조 장치를 파괴했다!,Je hebt de Converter vernietigd!,Du har tilintetgjort Omformeren!,Zniszczył@[irreg_3_pl] Transformator!,Você destruiu o Conversor!,Destruiste o Transformador!,Ai distrus Convertorul!,Преобразователь уничтожен!,Претварач је уништен!,Du har förstört omvandlaren!,Dönüştürücüyü yok ettiniz!,Ви знищили конвертер! +You've destroyed the Converter!,TXT_DESTROYED_CONVERTER,,,,Zničil@[ao_cs] jsi konvertér!,Du har ødelagt konverteren!,Du hast den Konverter zerstört!,,Vi detruis la konvertilon!,¡Has destruido el convertidor!,¡Destruiste el convertidor!,Olet tuhonnut muuntajan!,Vous avez détruit le convertisseur!,,Elpusztítottad a konvertálót!,Hai distrutto i Convertitori!,コンバーターを破壊した!,개조 장치를 파괴했다!,Je hebt de Converter vernietigd!,Du har tilintetgjort Omformeren!,Zniszczył@[irreg_3_pl] Transformator!,Você destruiu o Conversor!,Destruiste o Transformador!,Ai distrus Convertorul!,Преобразователь уничтожен!,Претварач је уништен!,Du har förstört omvandlaren!,Dönüştürücüyü yok ettiniz!,Ви знищили конвертер! Congratulations! You have completed the training area,TXT_COMPLETED_TRAINING,,,,Gratulujeme! Dokončil@[ao_cs] jsi tréninkový areál,Tillykke med det! Du har gennemført træningsområdet,Gratuliere! Du hast das Trainingsprogramm bestanden.,,Gratulon! Vi kompletigis la trejnejon,"¡Enhorabuena! Has completado la zona de entrenamiento","¡Muy bien! Completaste -la zona de entrenamiento",Onnittelut! Olet suorittanut koulutusalueen,Félicitations! Vous êtes arrivé à la fin de l'entraînement.,Gratulálok! Elvégezted a gyakorló területet.,Congratulazioni! Hai completato l'area di addestramento,おめでとう!トレーニングエリアを完了した,훈련 코스를 마쳤다. 능력치 업!,Gefeliciteerd! Je hebt de training voltooid.,Gratulerer! Du har fullført treningsområdet,Gratulacje! Ukończył@[irreg_3_pl] trening,Parabéns! Você completou a área de treinamento,Parabéns! Completaste a área de treino,Felicitări! Ai încheiat cu zona de antrenament,Браво! Ты прошёл тренировку,Честитке! Завршио си тренинг подручје,Grattis! Du har avslutat träningsområdet,Tebrikler! Eğitim alanını tamamladınız,Вітаю! Ви пройшли курс тренувань -You've blown up the Crystal,TXT_QUEST_14,,,,Odpálil@[ao_cs] jsi krystal,Du ødelagde krystallen.,Du hast den Kristall zerstört.,,Vi eksplodigis la kristalon,Has volado el cristal,Volaste el cristal,Olet räjäyttänyt kristallin,Vous avez explosé le cristal!,Szétrobbantottad a kristályt,Hai fatto esplodere il Cristallo,クリスタルを爆破した,수정체를 파괴했다,Je hebt de Crystal opgeblazen.,Du har sprengt krystallen,Wysadził@[irreg_3_pl] Kryształ,Você explodiu o cristal,Explodiste o cristal,Ai aruncat în aer Cristalul,Кристалл взорван,Дигао си у ваздух кристал,Du har sprängt kristallen.,Kristali havaya uçurdun.,Ви підірвали кристал -You've blown up the Gates,TXT_QUEST_16,,,,Odpálil@[ao_cs] jsi brány,Du åbnede portene.,Du hast die Tore geöffnet.,,Vi detruis la pordegojn,Has destruido las puertas,Destruiste las puertas,Olet räjäyttänyt portit,Vous avez explosé les portes!,A levegőbe repítetted a kapukat,Hai fatto esplodere i Cancelli,ゲートを爆破した,성문을 파괴해서 열었다,Je hebt de Gates opgeblazen.,Du har sprengt portene,Wysadził@[irreg_3_pl] Bramy,Você explodiu as portões,Explodiste os portões,Ai aruncat în aer Porțile,Ворота взорваны,Дигао си у ваздух капију,Du har sprängt portarna.,Kapıları havaya uçurdun.,Ви підірвали ворота -You've blown up the Computer,TXT_QUEST_27,,,,Odpálil@[ao_cs] jsi počítač,Du har ødelagt computeren.,Du hast den Computer zerstört.,,Vi detruis la komputilon,Has destruido el ordenador,Destruiste la computadora,Olet räjäyttänyt tietokoneen,Vous avez explosé l'ordinateur!,Felrobbantottad a számítógépet,Hai fatto esplodere il Computer,コンピューターを爆破した,컴퓨터를 파괴했다,Je hebt de computer opgeblazen.,Du har sprengt Datamaskinen,Wysadził@[irreg_3_pl] Komputer,Você explodiu o computador,Explodiste o computador,Ai aruncat în aer Calculatorul,Компьютер взорван,Дигао си у ваздух компјутер,Du har sprängt datorn.,Bilgisayarı havaya uçurdun.,Ви підірвали комп'ютер -You killed the Bishop!,TXT_KILLED_BISHOP,,,,Zabil@[ao_cs] jsi Biskupa!,Du har dræbt biskoppen!,Du hast den Bischof getötet.,,Vi mortigis la Episkopon!,¡Has matado al Obispo!,¡Mataste al Obispo!,Olet tappanut Piispan!,Vous avez tué l'évèque!,Megölted a Püspököt!,Hai ucciso il Vescovo!,ビショップを殺した!,비숍을 사살했다!,Je hebt de bisschop vermoord!,Du har drept Biskopen!,Zabił@[irreg_3_pl] Biskupa!,Você matou o Bispo!,Mataste o Bispo!,Ai omorât Episcopul!,Епископ убит!,Епископ је мртав!,Du har dödat biskopen!,Piskoposu öldürdün!,Єпископа вбито! -You've killed the Oracle!,TXT_KILLED_ORACLE,,,,Zabil@[ao_cs] jsi Věštce!,Du har dræbt Oraklet!,Du hast das Orakel getötet,,Vi mortigis la Orakolon!,¡Has matado al Oráculo!,¡Mataste al Oráculo!,Olet tappanut Oraakkelin!,Vous avez tué l'oracle!,Megölted az Orákulumot!,Hai ucciso l'Oracolo!,オラクルの予言を覆した!,오라클의 음모를 막았다!,Je hebt het Orakel vermoord!,Du har drept Oraklet!,Zabił@[irreg_3_pl] Wyrocznię!,Você matou o Oráculo!,Mataste o Oráculo,Ai omorât Oracolul!,Оракул убит!,Пророк је мртав!,Du har dödat oraklet!,Kahini öldürdün!,Оракула вбито! -You killed Macil!,TXT_KILLED_MACIL,,,,Zabil@[ao_cs] jsi Macila!,Du har dræbt Macil!,Du hast Macil getötet.,,Vi mortigis Macil-on!,¡Has matado a Macil!,¡Mataste a Macil!,Tapoit Macilin!,Vous avez tué Macil!,Megölted Macilt!,Hai ucciso Macil!,マシルを討ち取った!,마실을 처단했다!,Je hebt Macil vermoord!,Du har drept Macil!,Zabił@[irreg_3_pl] Macila!,Você matou o Macil!,Mataste Macil!,L-ai omorât pe Macil!,Мэйсил убит!,Мејсил је мртав!,Du har dödat Macil!,Macil'i öldürdün!,Масіла вбито! +la zona de entrenamiento",Onnittelut! Olet suorittanut koulutusalueen,Félicitations! Vous êtes arrivé à la fin de l'entraînement.,,Gratulálok! Elvégezted a gyakorló területet.,Congratulazioni! Hai completato l'area di addestramento,おめでとう!トレーニングエリアを完了した,훈련 코스를 마쳤다. 능력치 업!,Gefeliciteerd! Je hebt de training voltooid.,Gratulerer! Du har fullført treningsområdet,Gratulacje! Ukończył@[irreg_3_pl] trening,Parabéns! Você completou a área de treinamento,Parabéns! Completaste a área de treino,Felicitări! Ai încheiat cu zona de antrenament,Браво! Ты прошёл тренировку,Честитке! Завршио си тренинг подручје,Grattis! Du har avslutat träningsområdet,Tebrikler! Eğitim alanını tamamladınız,Вітаю! Ви пройшли курс тренувань +You've blown up the Crystal,TXT_QUEST_14,,,,Odpálil@[ao_cs] jsi krystal,Du ødelagde krystallen.,Du hast den Kristall zerstört.,,Vi eksplodigis la kristalon,Has volado el cristal,Volaste el cristal,Olet räjäyttänyt kristallin,Vous avez explosé le cristal!,,Szétrobbantottad a kristályt,Hai fatto esplodere il Cristallo,クリスタルを爆破した,수정체를 파괴했다,Je hebt de Crystal opgeblazen.,Du har sprengt krystallen,Wysadził@[irreg_3_pl] Kryształ,Você explodiu o cristal,Explodiste o cristal,Ai aruncat în aer Cristalul,Кристалл взорван,Дигао си у ваздух кристал,Du har sprängt kristallen.,Kristali havaya uçurdun.,Ви підірвали кристал +You've blown up the Gates,TXT_QUEST_16,,,,Odpálil@[ao_cs] jsi brány,Du åbnede portene.,Du hast die Tore geöffnet.,,Vi detruis la pordegojn,Has destruido las puertas,Destruiste las puertas,Olet räjäyttänyt portit,Vous avez explosé les portes!,,A levegőbe repítetted a kapukat,Hai fatto esplodere i Cancelli,ゲートを爆破した,성문을 파괴해서 열었다,Je hebt de Gates opgeblazen.,Du har sprengt portene,Wysadził@[irreg_3_pl] Bramy,Você explodiu as portões,Explodiste os portões,Ai aruncat în aer Porțile,Ворота взорваны,Дигао си у ваздух капију,Du har sprängt portarna.,Kapıları havaya uçurdun.,Ви підірвали ворота +You've blown up the Computer,TXT_QUEST_27,,,,Odpálil@[ao_cs] jsi počítač,Du har ødelagt computeren.,Du hast den Computer zerstört.,,Vi detruis la komputilon,Has destruido el ordenador,Destruiste la computadora,Olet räjäyttänyt tietokoneen,Vous avez explosé l'ordinateur!,,Felrobbantottad a számítógépet,Hai fatto esplodere il Computer,コンピューターを爆破した,컴퓨터를 파괴했다,Je hebt de computer opgeblazen.,Du har sprengt Datamaskinen,Wysadził@[irreg_3_pl] Komputer,Você explodiu o computador,Explodiste o computador,Ai aruncat în aer Calculatorul,Компьютер взорван,Дигао си у ваздух компјутер,Du har sprängt datorn.,Bilgisayarı havaya uçurdun.,Ви підірвали комп'ютер +You killed the Bishop!,TXT_KILLED_BISHOP,,,,Zabil@[ao_cs] jsi Biskupa!,Du har dræbt biskoppen!,Du hast den Bischof getötet.,,Vi mortigis la Episkopon!,¡Has matado al Obispo!,¡Mataste al Obispo!,Olet tappanut Piispan!,Vous avez tué l'évèque!,,Megölted a Püspököt!,Hai ucciso il Vescovo!,ビショップを殺した!,비숍을 사살했다!,Je hebt de bisschop vermoord!,Du har drept Biskopen!,Zabił@[irreg_3_pl] Biskupa!,Você matou o Bispo!,Mataste o Bispo!,Ai omorât Episcopul!,Епископ убит!,Епископ је мртав!,Du har dödat biskopen!,Piskoposu öldürdün!,Єпископа вбито! +You've killed the Oracle!,TXT_KILLED_ORACLE,,,,Zabil@[ao_cs] jsi Věštce!,Du har dræbt Oraklet!,Du hast das Orakel getötet,,Vi mortigis la Orakolon!,¡Has matado al Oráculo!,¡Mataste al Oráculo!,Olet tappanut Oraakkelin!,Vous avez tué l'oracle!,,Megölted az Orákulumot!,Hai ucciso l'Oracolo!,オラクルの予言を覆した!,오라클의 음모를 막았다!,Je hebt het Orakel vermoord!,Du har drept Oraklet!,Zabił@[irreg_3_pl] Wyrocznię!,Você matou o Oráculo!,Mataste o Oráculo,Ai omorât Oracolul!,Оракул убит!,Пророк је мртав!,Du har dödat oraklet!,Kahini öldürdün!,Оракула вбито! +You killed Macil!,TXT_KILLED_MACIL,,,,Zabil@[ao_cs] jsi Macila!,Du har dræbt Macil!,Du hast Macil getötet.,,Vi mortigis Macil-on!,¡Has matado a Macil!,¡Mataste a Macil!,Tapoit Macilin!,Vous avez tué Macil!,,Megölted Macilt!,Hai ucciso Macil!,マシルを討ち取った!,마실을 처단했다!,Je hebt Macil vermoord!,Du har drept Macil!,Zabił@[irreg_3_pl] Macila!,Você matou o Macil!,Mataste Macil!,L-ai omorât pe Macil!,Мэйсил убит!,Мејсил је мртав!,Du har dödat Macil!,Macil'i öldürdün!,Масіла вбито! You've killed the Loremaster!,TXT_KILLED_LOREMASTER,,,,Zabil@[ao_cs] jsi Dějepisce!,Du har dræbt Loremesteren!,Du hast den Wissensmeister getötet!,,Vi mortigis la Folkloriston!,"¡Has matado al Maestro del Conocimiento!","¡Mataste al -Maestro del Conocimiento!",Olet tappanut Oppi-Isän!,Vous avez tué le Maitre des traditions!,Megölted a Tudóst!,Hai ucciso il Sapiente!,ロアマスターを吊り上げた!,로어마스터의 목숨에 종지부를 찍었다!,Je hebt de Kennismeester vermoord!,Du har drept Loremaster!,Zabił@[irreg_3_pl] Mędrca!,Você matou o Mestre do Conhecimento!,Mataste o Mestre do Conhecimento!,L-ai omorât pe Maestrul Cunoștințelor!,Хранитель мудрости убит!,Чувара мудрости је мртав!,Du har dödat Läromästaren!,Loremaster'ı öldürdün!,Хранителя мудрості вбито! +Maestro del Conocimiento!",Olet tappanut Oppi-Isän!,Vous avez tué le Maitre des traditions!,,Megölted a Tudóst!,Hai ucciso il Sapiente!,ロアマスターを吊り上げた!,로어마스터의 목숨에 종지부를 찍었다!,Je hebt de Kennismeester vermoord!,Du har drept Loremaster!,Zabił@[irreg_3_pl] Mędrca!,Você matou o Mestre do Conhecimento!,Mataste o Mestre do Conhecimento!,L-ai omorât pe Maestrul Cunoștințelor!,Хранитель мудрости убит!,Чувара мудрости је мртав!,Du har dödat Läromästaren!,Loremaster'ı öldürdün!,Хранителя мудрості вбито! You fool! You've set off the alarm.,TXT_YOUFOOL,,,,Blázne! Spustil@[ao_cs] jsi alarm!,Dit fjols! Du har udløst alarmen.,Du Trottel! Du hast den Alarm ausgelöst.,,"Stultulo! Vi ekigis la alarmon.","¡Insensat@[ao_esp]! Has activado la alarma.","¡Tont@[ao_esp]! -Activaste la alarma.",Sinä mieletön! Olet laukaissut hälytyksen.,Vous êtes fou! Vous avez activé l'alarme!,Te barom! Beindítottad a riasztót.,Stolto! Hai fatto scattare l'allarme.,バカな真似を! 警報を鳴らしてしまった。,어리석은 것! 알람이 작동되었다고!,Jij dwaas! Je hebt het alarm laten afgaan.,Din idiot! Du har utløst alarmen.,Głupcze! Włączył@[irreg_3_pl] alarm!,Seu idiota! Você ativou o alarme.,Idiota! Ativaste o alarme.,Nesăbuitule! Ai declanșat alarma!,Глупец. Ты привёл в действие сигнализацию!,Будало! Активирао си аларм.,Din idiot! Du har utlöst larmet.,Seni aptal! Alarmı çalıştırdın.,Дурень! Ти активував тривогу. +Activaste la alarma.",Sinä mieletön! Olet laukaissut hälytyksen.,Vous êtes fou! Vous avez activé l'alarme!,,Te barom! Beindítottad a riasztót.,Stolto! Hai fatto scattare l'allarme.,バカな真似を! 警報を鳴らしてしまった。,어리석은 것! 알람이 작동되었다고!,Jij dwaas! Je hebt het alarm laten afgaan.,Din idiot! Du har utløst alarmen.,Głupcze! Włączył@[irreg_3_pl] alarm!,Seu idiota! Você ativou o alarme.,Idiota! Ativaste o alarme.,Nesăbuitule! Ai declanșat alarma!,Глупец. Ты привёл в действие сигнализацию!,Будало! Активирао си аларм.,Din idiot! Du har utlöst larmet.,Seni aptal! Alarmı çalıştırdın.,Дурень! Ти активував тривогу. You're dead! You set off the alarm.,TXT_YOUREDEAD,,,,Jsi mrtv@[adj_cs]! Spustil@[ao_cs] jsi alarm!,Du er død! Du udløste alarmen.,Du bist tot. Du hast den Alarm ausgelöst.,,"Vi estas mortinta! Vi ekigis la alarmon.","¡Estás muert@[ao_esp]! Has activado la alarma.","¡Estás muert@[ao_esp]! -Activaste la alarma.",Sinä kuolet! Laukaisit hälytyksen.,Vous êtes mort! Vous avez activé l'alarme!,Beindult a riasztó. Halott vagy!,Sei morto! L'allarme è scattato.,絶望的だ! 警報を鳴らしてしまった。,알람이 작동되었다. 넌 죽었어!,Je bent dood! Je hebt het alarm laten afgaan.,Du er død! Du utløste alarmen.,Już nie żyjesz! Włączył@[irreg_3_pl] alarm!,Você está mort@[ao_ptb]! Você ativou o alarme.,Estás mort@[ao_ptb]! Ativaste o alarme.,Ești mort! AI declanșat alarma!,Ты поднял тревогу! Готовься к смерти!,Активирао си аларм. Спреми се да умреш!,Du är död! Du utlöste larmet.,Sen öldün! Alarmı çalıştırdın.,Ти труп! Тривогу активовано. -You seem to have enough!,TXT_HAVEENOUGH,,,,Ty už máš přece dost!,Du ser ud til at have nok!,Du scheinst genug zu haben.,,Vi ŝajnas havi sufiĉe!,¡Se ve que tienes suficiente!,,Sinulla näyttää olevan tarpeeksi!,Vous avez l'air d'en avoir assez!,Úgy néz ki eleged van már!,Sembri averne abbastanza!,十分に持ち合わせている!,충분히 가진 것 같은데?,Je lijkt genoeg te hebben!,Du har visst fått nok!,"Wydaje się, że już ci wystarczy!",Você parece ter o suficiente!,Pareces ter o suficiente!,Pare că ai destule!,"Кажется, тебе хватит!",Изгледа да ти је доста!,Du verkar ha fått nog!,Yeterince var gibi görünüyor!,"Здається, тобі досить!" -Go away!,TXT_GOAWAY,,,,Jdi pryč!,Gå væk!,Verschwinde!,,Foriru!,¡Lárgate!,,Häivy!,Allez-vous en!,Takarodj!,Vattene via!,逃げ出せ!,저리 가!,Ga weg!,Forsvinn!,Idź stąd!,Vá embora!,Vai-te embora!,Pleacă!,Уходи!,Одлази!,Gå härifrån!,Git başımdan!,Йди геть! -Incoming Message...,TXT_COMM0,,,,Příchozí zpráva...,Indkommende besked...,Nachricht erhalten...,,Alvenas mesaĝo...,Mensaje entrante...,,Vastaantuleva viesti...,Message reçu.,Bejövő Üzenet...,Messaggio in arrivo...,メッセージが届いた...,메시지가 옴...,Inkomend bericht....,Innkommende melding...,Nadchodzi wiadomość...,Recebendo Mensagem...,A Receber Mensagem...,Mesaj în intrare...,Входящее сообщение...,Наилази порука...,Inkommande meddelande...,Gelen Mesaj...,Вхідне повідомлення... -Incoming Message from BlackBird...,TXT_COMM1,,,,Příchozí zpráva od Straky...,Indkommende besked fra BlackBird...,Nachricht von Blackbird erhalten...,,Alvenas mesaĝo de Merlo...,Mensaje entrante de Blackbird...,,Vastaantuleva viesti Blackbirdiltä...,Message reçu de BlackBird,Bejövő Üzenet Feketerigótól...,Messaggio in arrivo da Blackbird...,ブラックバードからのメッセージが届いた...,블랙버드로부터 메시지가 옴...,Inkomend bericht van BlackBird....,Innkommende melding fra BlackBird...,Nadchodzi wiadomość od BlackBird...,Recebendo Mensagem de BlackBird...,A Receber Mensagem de BlackBird...,Mesaj în intrare de la BlackBird...,Входящее сообщение от «Чёрного дрозда»...,Наилази порука од Црне птице....,Inkommande meddelande från BlackBird...,Gelen Mesaj...,Вхідне повідомлення від Чорного Дрозда... -Find help,TXT_FINDHELP,,,,Najdi pomoc.,Find hjælp,Finde Hilfe,,Trovu helpon.,Busca ayuda.,,Etsi apua,Trouvez de L'aide,Keress segítséget,Trova aiuto,助けを探せ,도움말,Zoek hulp,Finn hjelp,Znajdź pomoc,Procure ajuda,Procura ajuda,Găsește ajutor,Найди помощь,Нађи помоћ,Hitta hjälp,Yardım bul,Знайди допомогу -for %u,TXT_TRADE,As in for %u amount of money.,,,za %u zlatých,til %u,für %u,,kontraŭ %u da oro.,por %u de oro.,,hintaan %u,pour %u,%u számára,per %u,%u ゴールド,(가격: %u),voor %u,til %u,za %u,por %u,,pentru %u,за %u,за %u,för %u,için %u,за %u -,,Chex Quest,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Pickups,,,,,,,,,,,,,,,,,,,,,,,,,, -Picked up the Chex(R) Armor.,GOTCHEXARMOR,,,Picked up the Chex(R) Armour.,Sebráno Chex(R) brnění.,Hentede Chex(R) Rustning.,Du hast die Chex(R) Rüstung genommen,,Prenis la Chex(R)-kirason.,Recogiste la Armadura Chex(R).,,Poimit Chex(R)-panssarin.,Vous avez pris l'armure Chex(R).,Felvettél egy Chex(R) páncélt.,Raccolta un'Armatura Chex(R).,チェックス(R)アーマー をてにいれた。,첵스(R) 갑옷 획득.,Je hebt het Chex(R) harnas opgepakt.,Plukket opp Chex(R) Armor.,Zebrano Pancerz Chex(R).,Pegou uma Armadura Chex(R).,Apanhaste uma Armadura Chex(R).,Ai ridicat Armura Chex(R).,Получена Chex(R)-броня.,Покупио си Чех оклоп.,Plockade upp Chex(R) rustningen.,Chex(R) Zırhı'nı aldım.,Взято Chex(R) броню. -Picked up the Super Chex(R) Armor!,GOTSUPERCHEXARMOR,,,Picked up the Super Chex(R) Armour!,Sebráno Super Chex(R) brnění!,Hentede Super Chex(R) Rustning!,Du hast die Superchex(R)Rüstung genommen!,,Prenis la superan Chex(R)-kirason!,¡Recogiste la Súper-Armadura Chex(R)!,,Poimit Super-Chex(R)-panssarin!,Vous avez pris la super armure Chex(R)!,Felvettél egy szuper Chex(R) páncélt!,Raccolta la Super Armatura Chex(R)!,スーパーチェックス(R)アーマー をてにいれた。,슈퍼 첵스(R) 갑옷 획득!,Je hebt het Super-Chex(R) harnas opgehaald!,Plukket opp Super Chex(R) Armor!,Zebrano Super Pancerz Chex(R)!,Pegou uma Super Armadura Chex(R)!,Apanhaste uma Super Armadura Chex(R)!,Ai ridicat Super Armura Chex(R)!,Получена Chex(R)-сверхброня!,Покупио си Супер Чех оклоп.,Plockade upp Super Chex(R) rustningen!,Süper Chex(R) Zırhı'nı aldı!,Взято Chex(R) супер броню! -Picked up a glass of water.,GOTWATER,,,,Sebrána sklenice vody.,Samlede et glas vand op.,Du hast ein Glas Wasser genommen.,,Prenis glason de akvo.,Recogiste un vaso de agua.,,Poimit vesilasin.,Vous avez pris un verre d'eau.,Felvettél egy pohár vizet.,Raccolto un bicchiere d'acqua.,コップいっぱいの みずをひろった。,물 한 컵 섭취.,Je hebt een glas water opgepakt.,Hentet et glass vann.,Zebrano szklankę wody.,Pegou um copo d'água.,Apanhaste um copo de água.,Ai ridicat un pahar cu apă.,Получен стакан воды.,Покупио си чашу воде,Plockade upp ett glas vatten.,Bir bardak su aldım.,Взято стакан води. -Picked up slime repellent.,GOTREPELLENT,,,,Sebrán repelent proti slizu.,Hentede slimafvisende middel.,Du hast das Schleimabwehrmittel genommen.,,Prenis mukforigilon.,Recogiste un repelente de baba.,,Poimit limakarkotteen.,Vous avez pris de la chaux répulsive.,Felvettél egy nyálkataszítót.,Raccolto del repellente allo slime.,スライム はんぱつざい をひろった。,오물 방수제 획득.,Je hebt de slijmafstotende stof opgepakt.,Plukket opp slime repellent.,Zebrano odstraszacz szlamu.,Pegou repelente de gosma.,Apanhaste repelente de gosma.,Ai ridicat respingătorul de mâzga.,Получен репеллент от слизи.,Покупио си одбијаш љигавца.,Plockade upp ett slemavvisande medel.,Balçık kovucu aldım.,Взято репелент проти слизняків. -Supercharge Breakfast!,GOTBREAKFAST,,,,Supervýživná snídaně!,Supercharge Morgenmad!,Überladenes Frühstück!,,Ŝargega Matenmanĝon!,¡Desayuno supercargado!,,Superaamiaislatinki!,Petit-déjeuner superchargé!,Szupertöltött Reggeli!,Colazione da supercarica!,ちょうしょく スーパーチャージ!,힘찬 아침식사 섭취!,Overbelast ontbijt!,Superladet frokost!,Supernaładowane Śniadanie!,Super Café da Manhã!,Super Pequeno-Almoço!,Superîncărcătură Mic Dejun!,Завтрак из сверхзаряда!,Супер-напуњен доручак.,Supercharge frukost!,Süper Şarjlı Kahvaltı!,Суперзаряджений сніданок! -Picked up a blue key.,GOTCBLUEKEY,,,,Sebrán modrý klíč.,Samlede en blå nøgle op.,Du hast einen blauen Schlüssel genommen.,,Prenis bluan ŝlosilon.,Recogiste una llave azul.,,Poimit sinisen avaimen.,Vous avez pris une clé bleue.,Felvettél egy kék kulcsot.,Raccolta una chiave blu.,あお のかぎ をひろった。,파란색 열쇠 획득.,Je hebt een blauwe sleutel opgepakt.,Plukket opp en blå nøkkel.,Zebrano niebieski klucz.,Pegou a chave azul.,Apanhaste a chave azul.,Ai ridicat o cheie albastră.,Получен синий ключ.,Покупио си плави кључ.,Plockade upp en blå nyckel.,Mavi bir anahtar aldı.,Взято синій ключ. -Picked up a yellow key.,GOTCYELLOWKEY,,,,Sebrán žlutý klíč.,Samlede en gul nøgle op.,Du hast einen gelben Schlüssel genommen.,,Prenis ruĝan ŝlosilon.,Recogiste una llave amarilla.,,Poimit keltaisen avaimen.,Vous avez pris une clé jaune.,Felvettél egy sárga kulcsot.,Raccolta una chiave gialla.,きいろ のかぎ をひろった。,노란색 열쇠 획득.,Je hebt een gele sleutel opgepakt.,Plukket opp en gul nøkkel.,Zebrano żółty klucz.,Pegou a chave amarela.,Apanhaste a chave amarela.,Ai ridicat o cheie galbenă.,Получен жёлтый ключ.,Покупио си жути кључ.,Plockade upp en gul nyckel.,Sarı bir anahtar aldı.,Взято жовтий ключ. -Picked up a red key.,GOTCREDKEY,,,,Sebrán červený klíč.,Samlede en rød nøgle op.,Du hast einen roten Schlüssel genommen.,,Prenis flavan ŝlosilon.,Recogiste una llave roja.,,Poimit punaisen avaimen.,Vous avez pris une clé rouge.,Felvettél egy piros kulcsot.,Raccolta una chiave rossa.,あか のかぎ をひろった。,빨간색 열쇠 획득.,Je hebt een rode sleutel opgepakt.,Plukket opp en rød nøkkel.,Zebrano czerwony klucz.,Pegou a chave vermelha.,Apanhaste a chave vermelha.,Ai ridicat o cheie roșie.,Получен красный ключ.,Покупио си црвени кључ.,Plockade upp en röd nyckel.,Kırmızı bir anahtar aldı.,Взято червоний ключ. -Picked up a bowl of fruit.,GOTFRUIT,,,,Sebrána mísa s ovocem.,Samlede en skål med frugt op.,Du hast eine Obstschale genommen.,,Prenis bovlon de fruktoj.,Recogiste un tazón de fruta.,,Poimit hedelmäkulhon.,Vous avez pris un bol de fruits.,Felvettél egy tál gyümölcsöt.,Raccolto un vassoio di frutta.,フルーツのボウル をひろった。,과일 한 그릇 섭취.,Je hebt een fruitschaal opgepakt.,Plukket opp en bolle med frukt.,Zebrano miskę owoców.,Pegou uma tigela de frutas.,Apanhaste uma taça com fruta.,Ai ridicat un bol de fructe.,Получена тарелка с фруктами.,Покупио си чинију воћа.,Plockade upp en skål med frukt.,Bir kase meyve al.,Взято тарілку фруктів. -Vegetables are REALLY good for you!,GOTVEGETABLESNEED,,,,Zelenina je VELMI zdravá!,Grøntsager er VIRKELIG gode for dig!,Gemüse ist RICHTIG gut für dich!,,Legomoj estas TRE bonaj por vi!,¡Las verduras son REALMENTE buenas para ti!,,Vihannekset ovat TOSI terveellisiä!,Les légumes sont VRAIMENT bons pour vous!,A zöldségek NAGYON jót tesznek neked!,La verdura ti fa DAVVERO bene!,いま とってもひつような やさいのボウルだ!,채소의 건강한 영양분이 독 기운을 없앴습니다!,Groenten zijn echt goed voor je!,Grønnsaker er VIRKELIG bra for deg!,Warzywa są BARDZO dobre dla ciebie!,Vegetais fazem MUITO bem para você!,Os Vegetais são MUITO bons para ti!,Legumele sunt FOARTE bune pentru tine!,Овощи ОЧЕНЬ полезны для здоровья!,Поврће је ЈАКО добро за тебе!,Grönsaker är VÄLDIGT bra för dig!,Sebzeler sizin için GERÇEKTEN iyidir!,Овочі ДУЖЕ корисні для тебе! -Picked up a bowl of vegetables.,GOTVEGETABLES,,,,Sebrána mísa se zeleninou.,Samlede en skål med grøntsager op.,Du hast eine Gemüseschale genommen.,,Prenis bovlon de legomoj.,Recogiste un tazón de verduras.,,Poimit vihannesvadin.,Vous avez pris un bol de légumes.,Felvettél egy tál zöldséget.,Raccolto un vassoio di verdura.,やさいのボウル をひろった。,채소 한 그릇 섭취.,Je hebt een kom groenten opgepakt.,Plukket opp en bolle med grønnsaker.,Zebrano miskę warzyw.,Pegou uma tigela de vegetais.,Apanhaste uma tigela com vegetais.,Ai ridicat un bol de legume.,Получена тарелка с овощами.,Покупио си чинију поврћа.,Plockade upp en skål med grönsaker.,Bir kase sebze aldı.,Взято тарілку овочів. -Found a Slime-Proof Suit,GOTSLIMESUIT,,,,Nalezen slizu odolný oblek.,Fandt et slim-sikret jakkesæt,Du hast einen Schleimbeständigen Anzug gefunden,,Trovis mukimunan kompleton.,Encontraste un traje a prueba de baba.,,Löysit limaapitävän puvun,Combinaison pare-gelée,Felvettél egy nyálkaálló védőruhát,Raccolto un vestito a prova di slime,たい スライム スーツ をてにいれた。,오물 보호복 사용.,Je hebt een slijtvast pak opgepakt.,Fant en slimsikker drakt,Znaleziono Szlamoodporny Kombinezon,Achou um Traje Anti-Gosma,Apanhaste um Fato Anti-Gosma.,Ai ridicat un Costum Rezistent la Mâzgă,Получен противослизневый костюм,Нашо си љигаво-отпорано одело.,Hittade en slimsäker kostym,Balçık Geçirmez Takım Elbise Buldum,Взято протислизнячий костюм -Found a Computer Area Map,GOTCHEXMAP,,,,Nalezena počítačová mapa oblasti.,Fandt et kort over et computerområde,Du hast eine Computerkarte gefunden,,Trovis komputilan regionmapon.,Encontraste un mapa computarizado del área.,,Löysit alueen tietokonekartan,Vous avez trouve une carte informatique de la zone.,Felvettél egy Számítógépes Térképet,Trovata una mappa computerizzata,コンピューターエリアマップ をてにいれた。,컴퓨터 지도 사용.,Je hebt een computerkaart opgepakt.,Fant et datamaskinkart,Znaleziono Komputerową Mapę Obszaru,Achou um Mapa Computadorizado,Apanhaste um Mapa Digital.,Ai ridicat o Hartă Generată pe Calculator a Zonei.,Получена компьютерная карта местности,Нашао компјутерку мапу окружења,Hittade en karta över datorområdet,Bilgisayar Alanı Haritası Bulundu,Знайдено комп'ютерну карту району -Picked up a mini zorch recharge.,GOTZORCHRECHARGE,,,,Sebrán minibzukový náboj.,Samlede en mini zorch-opladning op.,Du hast eine Minizorcher-Ladung genommen.,,Prenis zorĉreŝargeton.,Recogiste una recarga de mini zorch.,,Poimit minizorchlatauksen.,Vous avez pris une mini recharge zorch.,Felvettél egy Mini Zorker Újratöltőt,Raccolta una ricarica di mini zorch.,ミニゾーチ リチャージ をひろった。,소형 저치 전지 획득.,Je hebt een minizorcherlading opgepakt.,Plukket opp en mini zorch-opplading.,Zebrano mini ładunek zorch.,Pegou recarga para mini zorch.,Apanhaste uma recarga para o mini zorch.,Ai ridicat o mini încărcătură pentru zorch.,Получена зарядка мини-зорчера.,Покупио си мини зорч пуњач.,Plockade upp en mini zorch-uppladdning.,Mini bir Zorch şarjı aldım.,Взято заряд міні-Зорчера. -Picked up a mini zorch pack.,GOTMINIZORCHPACK,,,,Sebrán minibzukový balík.,Afhentede en mini zorch-pakke.,Du hast ein Minizorcher-Ladepaket genommen.,,Prenis zorĉpaketon,Recogiste un paquete de mini zorch.,,Poimit minizorchpaketin.,Vous avez pris un pack de mini recharges zorch.,Felvettél egy Mini Zorker Csomagot,Raccolta una scatola di mini zorch.,ミニゾーチ パック をひろった。,저치 전지 박스 획득.,Je hebt een pakket met minizorcherladingen opgepakt.,Plukket opp en mini zorch-pakke.,Zebrano mini paczkę zorch.,Pegou um pacote de recargas de mini zorch.,Apanhaste um pagcote de recargas para o mini zorch.,Ai ridicat un mini patchet de încărcătură pentru zorch.,Получена батарея мини-зорчера.,Покупио си мини зорч пакет.,Plockade upp en mini zorch pack.,Mini bir Zorch paketi aldım.,Взято батарею для міні-Зорчера. -Picked up a zorch propulsor recharge.,GOTPROPULSORRECHARGE,,,,Sebrán náboj pro bzukový propulzor.,Afhentede en zorch propulsor opladning.,Du hast eine Propeller-Ladung genommen.,,Prenis zorĉpropulsilo-reŝargon.,Recogiste una recarga de propulsor de zorch.,,Poimit zorchtyöntimen latauksen.,Vous avez pris une recharge propulseur zorch.,Felvettél egy Zork Elhárító Újratöltőt,Raccolta una ricarica di zorch a propulsione.,ゾーチプロパルサーリチャージ をひろった。,저치 추진료 획득.,Je hebt een propulsorlading opgepakt.,Plukket opp en zorch propulsor-opplading.,Zebrano ładunek do pędnika zorch.,Pegou recarga para propulsor de zorch.,Apanhaste recarga para o propulsor de zorch.,Ai ridicat o încărcătură pentru acceleratorul zorch.,Получена зарядка ускорителя зорча.,Покупио си зорч погонски пуњач.,Plockade upp en zorch propulsoruppladdning.,Bir Zorch itici şarjı aldı.,Взято заряд Зорч-прискорювача. -Picked up a zorch propulsor pack.,GOTPROPULSORPACK,,,,Sebrán balík pro bzukový propulzor.,Afhentede en zorch propulsorpakke.,Du hast ein Propeller-Ladepaket genommen.,,Prenis zorĉpropulsilo-pakon.,Recogiste un paquete de propulsor de zorch.,,Poimit zorchtyöntimen paketin.,Vous avez pris un paquet propulseur zorch.,Felvettél egy Zork Elhárító Csomagot,Raccolta una scatola di zorch a propulsione.,ゾーチプロパルサーパック をひろった。,저치 추진 팩 획득.,Je hebt een pakket met propulsorladingen opgepakt.,Plukket opp en zorch fremdriftspakke.,Zebrano paczkę pędnika zorch.,Pegou um pacote de recargas para propulsor de zorch.,Apanhaste um pacote de recargas para o propulsor de zorch,Ai ridicat un pachet de baterii pentru acceleratorul zorch.,Получена батарея ускорителя зорча.,Покупио си зорч погонски пакет.,Plockade upp en zorch propulsor pack.,Bir Zorch itici paketi aldı.,Взято батарею Зорч-прискорювача. -Picked up a phasing zorcher recharge,GOTPHASINGZORCHERRECHARGE,,,,Sebrán náboj pro fázovací bzukr.,Afhentede en zorcher-opladning til faseopladning.,Du hast eine Phasenzorcher-Ladung genommen.,,Prenis fluktuantzorĉilo-reŝargon.,Recogiste una recarga de zorch de fase.,,Poimit vaiheiszorcherin latauksen.,Vous avez pris une recharge zorch phasée.,Felvettél egy Fázis Zorker Újratöltőt,Raccolta una ricarica per zorcher a phasing,フェイシング ゾーチャーリチャージ をひろった。,저치 전자 충전기 획득.,Je hebt een phasenzorcherlading opgepakt.,Plukket opp en fasing zorcher oppladning.,Zebrano ładunek do fazowego zorchera.,Pegou recarga para zorcher fásico.,Apanhaste recarga para o zorcher fásico,Ai ridicat o încărcătură fazată pentru zorcher,Получена зарядка фазерного зорчера.,Покупио си фазни зорчер пуњач.,Plockade upp en phasing zorcher-uppladdning.,Bir faz zorcher şarjı aldı,Взято заряд фазового Зорчера. -Picked up a phasing zorcher pack.,GOTPHASINGZORCHERPACK,,,,Sebrán balík pro fázovací bzukr.,Afhentede en phasing zorcher-pakke.,Du hast ein Phasenzorcher-Ladepaket genommen.,,Prenis fluktuantzorĉilo-pakon.,Recogiste un paquete de zorch de fase.,,Poimit vaiheiszorcherin paketin.,Vous avez pris un pack de recharges zorch phasée.,Felvettél egy Fázis Zorker Csomagot,Raccolta una scatola per zorcher a phasing.,フェイシング ゾーチャーパック をひろった。,특대 저치 충전기 획득.,Je hebt een pakket met phasenzorcherladingen opgepakt.,Plukket opp en fasing zorcher-pakke.,Zebrano paczkę fazowego zorchera.,Pegou um pacote de recargas para zorcher fásico.,Apanhaste um pacote de recargas para o zorcher fásico,"Ai ridicat un pachet de încărcături fazate pentru +Activaste la alarma.",Sinä kuolet! Laukaisit hälytyksen.,Vous êtes mort! Vous avez activé l'alarme!,,Beindult a riasztó. Halott vagy!,Sei morto! L'allarme è scattato.,絶望的だ! 警報を鳴らしてしまった。,알람이 작동되었다. 넌 죽었어!,Je bent dood! Je hebt het alarm laten afgaan.,Du er død! Du utløste alarmen.,Już nie żyjesz! Włączył@[irreg_3_pl] alarm!,Você está mort@[ao_ptb]! Você ativou o alarme.,Estás mort@[ao_ptb]! Ativaste o alarme.,Ești mort! AI declanșat alarma!,Ты поднял тревогу! Готовься к смерти!,Активирао си аларм. Спреми се да умреш!,Du är död! Du utlöste larmet.,Sen öldün! Alarmı çalıştırdın.,Ти труп! Тривогу активовано. +You seem to have enough!,TXT_HAVEENOUGH,,,,Ty už máš přece dost!,Du ser ud til at have nok!,Du scheinst genug zu haben.,,Vi ŝajnas havi sufiĉe!,¡Se ve que tienes suficiente!,,Sinulla näyttää olevan tarpeeksi!,Vous avez l'air d'en avoir assez!,,Úgy néz ki eleged van már!,Sembri averne abbastanza!,十分に持ち合わせている!,충분히 가진 것 같은데?,Je lijkt genoeg te hebben!,Du har visst fått nok!,"Wydaje się, że już ci wystarczy!",Você parece ter o suficiente!,Pareces ter o suficiente!,Pare că ai destule!,"Кажется, тебе хватит!",Изгледа да ти је доста!,Du verkar ha fått nog!,Yeterince var gibi görünüyor!,"Здається, тобі досить!" +Go away!,TXT_GOAWAY,,,,Jdi pryč!,Gå væk!,Verschwinde!,,Foriru!,¡Lárgate!,,Häivy!,Allez-vous en!,,Takarodj!,Vattene via!,逃げ出せ!,저리 가!,Ga weg!,Forsvinn!,Idź stąd!,Vá embora!,Vai-te embora!,Pleacă!,Уходи!,Одлази!,Gå härifrån!,Git başımdan!,Йди геть! +Incoming Message...,TXT_COMM0,,,,Příchozí zpráva...,Indkommende besked...,Nachricht erhalten...,,Alvenas mesaĝo...,Mensaje entrante...,,Vastaantuleva viesti...,Message reçu.,,Bejövő Üzenet...,Messaggio in arrivo...,メッセージが届いた...,메시지가 옴...,Inkomend bericht....,Innkommende melding...,Nadchodzi wiadomość...,Recebendo Mensagem...,A Receber Mensagem...,Mesaj în intrare...,Входящее сообщение...,Наилази порука...,Inkommande meddelande...,Gelen Mesaj...,Вхідне повідомлення... +Incoming Message from BlackBird...,TXT_COMM1,,,,Příchozí zpráva od Straky...,Indkommende besked fra BlackBird...,Nachricht von Blackbird erhalten...,,Alvenas mesaĝo de Merlo...,Mensaje entrante de Blackbird...,,Vastaantuleva viesti Blackbirdiltä...,Message reçu de BlackBird,,Bejövő Üzenet Feketerigótól...,Messaggio in arrivo da Blackbird...,ブラックバードからのメッセージが届いた...,블랙버드로부터 메시지가 옴...,Inkomend bericht van BlackBird....,Innkommende melding fra BlackBird...,Nadchodzi wiadomość od BlackBird...,Recebendo Mensagem de BlackBird...,A Receber Mensagem de BlackBird...,Mesaj în intrare de la BlackBird...,Входящее сообщение от «Чёрного дрозда»...,Наилази порука од Црне птице....,Inkommande meddelande från BlackBird...,Gelen Mesaj...,Вхідне повідомлення від Чорного Дрозда... +Find help,TXT_FINDHELP,,,,Najdi pomoc.,Find hjælp,Finde Hilfe,,Trovu helpon.,Busca ayuda.,,Etsi apua,Trouvez de L'aide,,Keress segítséget,Trova aiuto,助けを探せ,도움말,Zoek hulp,Finn hjelp,Znajdź pomoc,Procure ajuda,Procura ajuda,Găsește ajutor,Найди помощь,Нађи помоћ,Hitta hjälp,Yardım bul,Знайди допомогу +for %u,TXT_TRADE,As in for %u amount of money.,,,za %u zlatých,til %u,für %u,,kontraŭ %u da oro.,por %u de oro.,,hintaan %u,pour %u,,%u számára,per %u,%u ゴールド,(가격: %u),voor %u,til %u,za %u,por %u,,pentru %u,за %u,за %u,för %u,için %u,за %u +,,Chex Quest,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Pickups,,,,,,,,,,,,,,,,,,,,,,,,,,, +Picked up the Chex(R) Armor.,GOTCHEXARMOR,,,Picked up the Chex(R) Armour.,Sebráno Chex(R) brnění.,Hentede Chex(R) Rustning.,Du hast die Chex(R) Rüstung genommen,,Prenis la Chex(R)-kirason.,Recogiste la Armadura Chex(R).,,Poimit Chex(R)-panssarin.,Vous avez pris l'armure Chex(R).,,Felvettél egy Chex(R) páncélt.,Raccolta un'Armatura Chex(R).,チェックス(R)アーマー をてにいれた。,첵스(R) 갑옷 획득.,Je hebt het Chex(R) harnas opgepakt.,Plukket opp Chex(R) Armor.,Zebrano Pancerz Chex(R).,Pegou uma Armadura Chex(R).,Apanhaste uma Armadura Chex(R).,Ai ridicat Armura Chex(R).,Получена Chex(R)-броня.,Покупио си Чех оклоп.,Plockade upp Chex(R) rustningen.,Chex(R) Zırhı'nı aldım.,Взято Chex(R) броню. +Picked up the Super Chex(R) Armor!,GOTSUPERCHEXARMOR,,,Picked up the Super Chex(R) Armour!,Sebráno Super Chex(R) brnění!,Hentede Super Chex(R) Rustning!,Du hast die Superchex(R)Rüstung genommen!,,Prenis la superan Chex(R)-kirason!,¡Recogiste la Súper-Armadura Chex(R)!,,Poimit Super-Chex(R)-panssarin!,Vous avez pris la super armure Chex(R)!,,Felvettél egy szuper Chex(R) páncélt!,Raccolta la Super Armatura Chex(R)!,スーパーチェックス(R)アーマー をてにいれた。,슈퍼 첵스(R) 갑옷 획득!,Je hebt het Super-Chex(R) harnas opgehaald!,Plukket opp Super Chex(R) Armor!,Zebrano Super Pancerz Chex(R)!,Pegou uma Super Armadura Chex(R)!,Apanhaste uma Super Armadura Chex(R)!,Ai ridicat Super Armura Chex(R)!,Получена Chex(R)-сверхброня!,Покупио си Супер Чех оклоп.,Plockade upp Super Chex(R) rustningen!,Süper Chex(R) Zırhı'nı aldı!,Взято Chex(R) супер броню! +Picked up a glass of water.,GOTWATER,,,,Sebrána sklenice vody.,Samlede et glas vand op.,Du hast ein Glas Wasser genommen.,,Prenis glason de akvo.,Recogiste un vaso de agua.,,Poimit vesilasin.,Vous avez pris un verre d'eau.,,Felvettél egy pohár vizet.,Raccolto un bicchiere d'acqua.,コップいっぱいの みずをひろった。,물 한 컵 섭취.,Je hebt een glas water opgepakt.,Hentet et glass vann.,Zebrano szklankę wody.,Pegou um copo d'água.,Apanhaste um copo de água.,Ai ridicat un pahar cu apă.,Получен стакан воды.,Покупио си чашу воде,Plockade upp ett glas vatten.,Bir bardak su aldım.,Взято стакан води. +Picked up slime repellent.,GOTREPELLENT,,,,Sebrán repelent proti slizu.,Hentede slimafvisende middel.,Du hast das Schleimabwehrmittel genommen.,,Prenis mukforigilon.,Recogiste un repelente de baba.,,Poimit limakarkotteen.,Vous avez pris de la chaux répulsive.,,Felvettél egy nyálkataszítót.,Raccolto del repellente allo slime.,スライム はんぱつざい をひろった。,오물 방수제 획득.,Je hebt de slijmafstotende stof opgepakt.,Plukket opp slime repellent.,Zebrano odstraszacz szlamu.,Pegou repelente de gosma.,Apanhaste repelente de gosma.,Ai ridicat respingătorul de mâzga.,Получен репеллент от слизи.,Покупио си одбијаш љигавца.,Plockade upp ett slemavvisande medel.,Balçık kovucu aldım.,Взято репелент проти слизняків. +Supercharge Breakfast!,GOTBREAKFAST,,,,Supervýživná snídaně!,Supercharge Morgenmad!,Überladenes Frühstück!,,Ŝargega Matenmanĝon!,¡Desayuno supercargado!,,Superaamiaislatinki!,Petit-déjeuner superchargé!,,Szupertöltött Reggeli!,Colazione da supercarica!,ちょうしょく スーパーチャージ!,힘찬 아침식사 섭취!,Overbelast ontbijt!,Superladet frokost!,Supernaładowane Śniadanie!,Super Café da Manhã!,Super Pequeno-Almoço!,Superîncărcătură Mic Dejun!,Завтрак из сверхзаряда!,Супер-напуњен доручак.,Supercharge frukost!,Süper Şarjlı Kahvaltı!,Суперзаряджений сніданок! +Picked up a blue key.,GOTCBLUEKEY,,,,Sebrán modrý klíč.,Samlede en blå nøgle op.,Du hast einen blauen Schlüssel genommen.,,Prenis bluan ŝlosilon.,Recogiste una llave azul.,,Poimit sinisen avaimen.,Vous avez pris une clé bleue.,,Felvettél egy kék kulcsot.,Raccolta una chiave blu.,あお のかぎ をひろった。,파란색 열쇠 획득.,Je hebt een blauwe sleutel opgepakt.,Plukket opp en blå nøkkel.,Zebrano niebieski klucz.,Pegou a chave azul.,Apanhaste a chave azul.,Ai ridicat o cheie albastră.,Получен синий ключ.,Покупио си плави кључ.,Plockade upp en blå nyckel.,Mavi bir anahtar aldı.,Взято синій ключ. +Picked up a yellow key.,GOTCYELLOWKEY,,,,Sebrán žlutý klíč.,Samlede en gul nøgle op.,Du hast einen gelben Schlüssel genommen.,,Prenis ruĝan ŝlosilon.,Recogiste una llave amarilla.,,Poimit keltaisen avaimen.,Vous avez pris une clé jaune.,,Felvettél egy sárga kulcsot.,Raccolta una chiave gialla.,きいろ のかぎ をひろった。,노란색 열쇠 획득.,Je hebt een gele sleutel opgepakt.,Plukket opp en gul nøkkel.,Zebrano żółty klucz.,Pegou a chave amarela.,Apanhaste a chave amarela.,Ai ridicat o cheie galbenă.,Получен жёлтый ключ.,Покупио си жути кључ.,Plockade upp en gul nyckel.,Sarı bir anahtar aldı.,Взято жовтий ключ. +Picked up a red key.,GOTCREDKEY,,,,Sebrán červený klíč.,Samlede en rød nøgle op.,Du hast einen roten Schlüssel genommen.,,Prenis flavan ŝlosilon.,Recogiste una llave roja.,,Poimit punaisen avaimen.,Vous avez pris une clé rouge.,,Felvettél egy piros kulcsot.,Raccolta una chiave rossa.,あか のかぎ をひろった。,빨간색 열쇠 획득.,Je hebt een rode sleutel opgepakt.,Plukket opp en rød nøkkel.,Zebrano czerwony klucz.,Pegou a chave vermelha.,Apanhaste a chave vermelha.,Ai ridicat o cheie roșie.,Получен красный ключ.,Покупио си црвени кључ.,Plockade upp en röd nyckel.,Kırmızı bir anahtar aldı.,Взято червоний ключ. +Picked up a bowl of fruit.,GOTFRUIT,,,,Sebrána mísa s ovocem.,Samlede en skål med frugt op.,Du hast eine Obstschale genommen.,,Prenis bovlon de fruktoj.,Recogiste un tazón de fruta.,,Poimit hedelmäkulhon.,Vous avez pris un bol de fruits.,,Felvettél egy tál gyümölcsöt.,Raccolto un vassoio di frutta.,フルーツのボウル をひろった。,과일 한 그릇 섭취.,Je hebt een fruitschaal opgepakt.,Plukket opp en bolle med frukt.,Zebrano miskę owoców.,Pegou uma tigela de frutas.,Apanhaste uma taça com fruta.,Ai ridicat un bol de fructe.,Получена тарелка с фруктами.,Покупио си чинију воћа.,Plockade upp en skål med frukt.,Bir kase meyve al.,Взято тарілку фруктів. +Vegetables are REALLY good for you!,GOTVEGETABLESNEED,,,,Zelenina je VELMI zdravá!,Grøntsager er VIRKELIG gode for dig!,Gemüse ist RICHTIG gut für dich!,,Legomoj estas TRE bonaj por vi!,¡Las verduras son REALMENTE buenas para ti!,,Vihannekset ovat TOSI terveellisiä!,Les légumes sont VRAIMENT bons pour vous!,,A zöldségek NAGYON jót tesznek neked!,La verdura ti fa DAVVERO bene!,いま とってもひつような やさいのボウルだ!,채소의 건강한 영양분이 독 기운을 없앴습니다!,Groenten zijn echt goed voor je!,Grønnsaker er VIRKELIG bra for deg!,Warzywa są BARDZO dobre dla ciebie!,Vegetais fazem MUITO bem para você!,Os Vegetais são MUITO bons para ti!,Legumele sunt FOARTE bune pentru tine!,Овощи ОЧЕНЬ полезны для здоровья!,Поврће је ЈАКО добро за тебе!,Grönsaker är VÄLDIGT bra för dig!,Sebzeler sizin için GERÇEKTEN iyidir!,Овочі ДУЖЕ корисні для тебе! +Picked up a bowl of vegetables.,GOTVEGETABLES,,,,Sebrána mísa se zeleninou.,Samlede en skål med grøntsager op.,Du hast eine Gemüseschale genommen.,,Prenis bovlon de legomoj.,Recogiste un tazón de verduras.,,Poimit vihannesvadin.,Vous avez pris un bol de légumes.,,Felvettél egy tál zöldséget.,Raccolto un vassoio di verdura.,やさいのボウル をひろった。,채소 한 그릇 섭취.,Je hebt een kom groenten opgepakt.,Plukket opp en bolle med grønnsaker.,Zebrano miskę warzyw.,Pegou uma tigela de vegetais.,Apanhaste uma tigela com vegetais.,Ai ridicat un bol de legume.,Получена тарелка с овощами.,Покупио си чинију поврћа.,Plockade upp en skål med grönsaker.,Bir kase sebze aldı.,Взято тарілку овочів. +Found a Slime-Proof Suit,GOTSLIMESUIT,,,,Nalezen slizu odolný oblek.,Fandt et slim-sikret jakkesæt,Du hast einen Schleimbeständigen Anzug gefunden,,Trovis mukimunan kompleton.,Encontraste un traje a prueba de baba.,,Löysit limaapitävän puvun,Combinaison pare-gelée,,Felvettél egy nyálkaálló védőruhát,Raccolto un vestito a prova di slime,たい スライム スーツ をてにいれた。,오물 보호복 사용.,Je hebt een slijtvast pak opgepakt.,Fant en slimsikker drakt,Znaleziono Szlamoodporny Kombinezon,Achou um Traje Anti-Gosma,Apanhaste um Fato Anti-Gosma.,Ai ridicat un Costum Rezistent la Mâzgă,Получен противослизневый костюм,Нашо си љигаво-отпорано одело.,Hittade en slimsäker kostym,Balçık Geçirmez Takım Elbise Buldum,Взято протислизнячий костюм +Found a Computer Area Map,GOTCHEXMAP,,,,Nalezena počítačová mapa oblasti.,Fandt et kort over et computerområde,Du hast eine Computerkarte gefunden,,Trovis komputilan regionmapon.,Encontraste un mapa computarizado del área.,,Löysit alueen tietokonekartan,Vous avez trouve une carte informatique de la zone.,,Felvettél egy Számítógépes Térképet,Trovata una mappa computerizzata,コンピューターエリアマップ をてにいれた。,컴퓨터 지도 사용.,Je hebt een computerkaart opgepakt.,Fant et datamaskinkart,Znaleziono Komputerową Mapę Obszaru,Achou um Mapa Computadorizado,Apanhaste um Mapa Digital.,Ai ridicat o Hartă Generată pe Calculator a Zonei.,Получена компьютерная карта местности,Нашао компјутерку мапу окружења,Hittade en karta över datorområdet,Bilgisayar Alanı Haritası Bulundu,Знайдено комп'ютерну карту району +Picked up a mini zorch recharge.,GOTZORCHRECHARGE,,,,Sebrán minibzukový náboj.,Samlede en mini zorch-opladning op.,Du hast eine Minizorcher-Ladung genommen.,,Prenis zorĉreŝargeton.,Recogiste una recarga de mini zorch.,,Poimit minizorchlatauksen.,Vous avez pris une mini recharge zorch.,,Felvettél egy Mini Zorker Újratöltőt,Raccolta una ricarica di mini zorch.,ミニゾーチ リチャージ をひろった。,소형 저치 전지 획득.,Je hebt een minizorcherlading opgepakt.,Plukket opp en mini zorch-opplading.,Zebrano mini ładunek zorch.,Pegou recarga para mini zorch.,Apanhaste uma recarga para o mini zorch.,Ai ridicat o mini încărcătură pentru zorch.,Получена зарядка мини-зорчера.,Покупио си мини зорч пуњач.,Plockade upp en mini zorch-uppladdning.,Mini bir Zorch şarjı aldım.,Взято заряд міні-Зорчера. +Picked up a mini zorch pack.,GOTMINIZORCHPACK,,,,Sebrán minibzukový balík.,Afhentede en mini zorch-pakke.,Du hast ein Minizorcher-Ladepaket genommen.,,Prenis zorĉpaketon,Recogiste un paquete de mini zorch.,,Poimit minizorchpaketin.,Vous avez pris un pack de mini recharges zorch.,,Felvettél egy Mini Zorker Csomagot,Raccolta una scatola di mini zorch.,ミニゾーチ パック をひろった。,저치 전지 박스 획득.,Je hebt een pakket met minizorcherladingen opgepakt.,Plukket opp en mini zorch-pakke.,Zebrano mini paczkę zorch.,Pegou um pacote de recargas de mini zorch.,Apanhaste um pagcote de recargas para o mini zorch.,Ai ridicat un mini patchet de încărcătură pentru zorch.,Получена батарея мини-зорчера.,Покупио си мини зорч пакет.,Plockade upp en mini zorch pack.,Mini bir Zorch paketi aldım.,Взято батарею для міні-Зорчера. +Picked up a zorch propulsor recharge.,GOTPROPULSORRECHARGE,,,,Sebrán náboj pro bzukový propulzor.,Afhentede en zorch propulsor opladning.,Du hast eine Propeller-Ladung genommen.,,Prenis zorĉpropulsilo-reŝargon.,Recogiste una recarga de propulsor de zorch.,,Poimit zorchtyöntimen latauksen.,Vous avez pris une recharge propulseur zorch.,,Felvettél egy Zork Elhárító Újratöltőt,Raccolta una ricarica di zorch a propulsione.,ゾーチプロパルサーリチャージ をひろった。,저치 추진료 획득.,Je hebt een propulsorlading opgepakt.,Plukket opp en zorch propulsor-opplading.,Zebrano ładunek do pędnika zorch.,Pegou recarga para propulsor de zorch.,Apanhaste recarga para o propulsor de zorch.,Ai ridicat o încărcătură pentru acceleratorul zorch.,Получена зарядка ускорителя зорча.,Покупио си зорч погонски пуњач.,Plockade upp en zorch propulsoruppladdning.,Bir Zorch itici şarjı aldı.,Взято заряд Зорч-прискорювача. +Picked up a zorch propulsor pack.,GOTPROPULSORPACK,,,,Sebrán balík pro bzukový propulzor.,Afhentede en zorch propulsorpakke.,Du hast ein Propeller-Ladepaket genommen.,,Prenis zorĉpropulsilo-pakon.,Recogiste un paquete de propulsor de zorch.,,Poimit zorchtyöntimen paketin.,Vous avez pris un paquet propulseur zorch.,,Felvettél egy Zork Elhárító Csomagot,Raccolta una scatola di zorch a propulsione.,ゾーチプロパルサーパック をひろった。,저치 추진 팩 획득.,Je hebt een pakket met propulsorladingen opgepakt.,Plukket opp en zorch fremdriftspakke.,Zebrano paczkę pędnika zorch.,Pegou um pacote de recargas para propulsor de zorch.,Apanhaste um pacote de recargas para o propulsor de zorch,Ai ridicat un pachet de baterii pentru acceleratorul zorch.,Получена батарея ускорителя зорча.,Покупио си зорч погонски пакет.,Plockade upp en zorch propulsor pack.,Bir Zorch itici paketi aldı.,Взято батарею Зорч-прискорювача. +Picked up a phasing zorcher recharge,GOTPHASINGZORCHERRECHARGE,,,,Sebrán náboj pro fázovací bzukr.,Afhentede en zorcher-opladning til faseopladning.,Du hast eine Phasenzorcher-Ladung genommen.,,Prenis fluktuantzorĉilo-reŝargon.,Recogiste una recarga de zorch de fase.,,Poimit vaiheiszorcherin latauksen.,Vous avez pris une recharge zorch phasée.,,Felvettél egy Fázis Zorker Újratöltőt,Raccolta una ricarica per zorcher a phasing,フェイシング ゾーチャーリチャージ をひろった。,저치 전자 충전기 획득.,Je hebt een phasenzorcherlading opgepakt.,Plukket opp en fasing zorcher oppladning.,Zebrano ładunek do fazowego zorchera.,Pegou recarga para zorcher fásico.,Apanhaste recarga para o zorcher fásico,Ai ridicat o încărcătură fazată pentru zorcher,Получена зарядка фазерного зорчера.,Покупио си фазни зорчер пуњач.,Plockade upp en phasing zorcher-uppladdning.,Bir faz zorcher şarjı aldı,Взято заряд фазового Зорчера. +Picked up a phasing zorcher pack.,GOTPHASINGZORCHERPACK,,,,Sebrán balík pro fázovací bzukr.,Afhentede en phasing zorcher-pakke.,Du hast ein Phasenzorcher-Ladepaket genommen.,,Prenis fluktuantzorĉilo-pakon.,Recogiste un paquete de zorch de fase.,,Poimit vaiheiszorcherin paketin.,Vous avez pris un pack de recharges zorch phasée.,,Felvettél egy Fázis Zorker Csomagot,Raccolta una scatola per zorcher a phasing.,フェイシング ゾーチャーパック をひろった。,특대 저치 충전기 획득.,Je hebt een pakket met phasenzorcherladingen opgepakt.,Plukket opp en fasing zorcher-pakke.,Zebrano paczkę fazowego zorchera.,Pegou um pacote de recargas para zorcher fásico.,Apanhaste um pacote de recargas para o zorcher fásico,"Ai ridicat un pachet de încărcături fazate pentru zorcher.",Получена батарея фазерного зорчера.,Покупио си фазни зорчер пакет.,Plockade upp en phasing zorcher pack.,Bir faz zorcher paketi aldım.,Взято батарею фазового Зорчера. -Picked up a large zorcher recharge.,GOTLARGEZORCHERRECHARGE,,,,Sebrán náboj pro velký bzukr.,Afhentede en stor zorcher-opladning.,Du hast eine Zorcher-Ladung genommen.,,Prenis grandzorĉilo-reŝargon.,Recogiste una gran recarga de zorch.,,Poimit ison zorcherin latauksen,Vous avez pris une recharge pour zorcheur large.,Felvettél egy Nagy Zorker Újratöltőt,Raccolta una ricarica per zorcher grande.,ラージ ゾーチャーリチャージ をひろった。,대형 저치 카트리지 획득.,Je hebt een zorcherlading opgepakt.,Plukket opp en stor zorcher-opplading.,Zebrano ładunek do dużego zorchera.,Pegou recarga para zorcher grande.,Apanhaste recarga para o zorcher grande.,Ai ridicat o încărcătură mare pentru zorcher.,Получена зарядка большого зорчера.,Покупио си велики зорчер пуњач.,Plockade upp en stor zorcher-uppladdning.,Büyük bir zorcher şarjı aldım.,Взято заряд великого Зорчера. -Picked up a large zorcher pack.,GOTLARGEZORCHERPACK,,,,Sebrán balík pro velký bzukr.,Afhentede en stor zorcher-pakke.,Du hast ein Zorcher-Ladepaket genommen.,,Prenis grandegzorĉilo-reŝargon.,Recogiste un gran paquete de zorch.,,Poimit ison zorcherin paketin.,Vous avez pris un pack de recharges pour zorcheur large.,Felvettél egy Nagy Zorker Csomagot,Raccolta una scatola per zorcher grande.,ラージ ゾーチャーパック をひろった。,저치 카트리지 묶음 획득.,Je hebt een pakket met zorcherladingen opgepakt.,Plukket opp en stor zorcherpakke.,Zebrano paczkę dużego zorchera.,Pegou um pacote de recargas para zorcher grande.,Apanhaste um pacote de recargas para o zocher grande.,Ai ridicat un pachet mare de încărcături pentru zorcher.,Получена батарея большого зорчера.,Покупио си велики зорчер пакет.,Plockade upp ett stort zorcherpaket.,Büyük bir zorcher paketi aldı.,Взято батарею великого Зорчера. -Picked up a Zorchpak!,GOTZORCHPACK,,,,Sebrán Bzukrbatoh!,Afhentede en Zorchpak!,Du hast ein Zorchpaket genommen.,,Prenis Zorĉpakon!,¡Recogiste un Zorchpak!,,Poimit zorchpakin!,Vous avez pris un zorchpak!,Felvettél egy Zorkpakkot!,Raccolto uno ZorchZaino!,ゾーチパックをてにいれた!,저치 팩 획득!,Je hebt en zorchpak opgepakt.,Plukket opp en Zorchpak!,Zebrano Paczkę Zorch.,Pegou um Zorchpak!,Apanhaste um Zorchpak!,Ai ridicat un Ghiozdan Zorch!,Получен зорч-рюкзак!,Покупио си зорчпак.,Jag hämtade en Zorchpak!,Bir Zorchpak aldım!,Взято Зорч-сумку! -You got the LAZ Device! Woot!,GOTLAZDEVICE,,,,Získal@[ao_cs] jsi velkodosahový bzukr! Cooo?,Du fik LAZ-enheden! Woot!,Du hast den Flächenzorcher!,,Vi prenis la LAZ-aparaton! Hura!,¡Tienes el dispositivo LAZ! ¡Yuju!,,Sait SAZ-laitteen! Juhuu!,Vous avez pris l'Outil ZZL! Wahou!,Felvetted a LAZ Készüléket! Wáó!,Hai trovato il dispositivo LAZ! Cavolo!,LAZ デバイスをてにいれた! ワァオ!,LAZ 장치 습득! 완전 짱인걸!,Je hebt het LAZ-apparaat! Woot!,Du har LAZ-enheten! Woot!,Zdobył@[irreg_3_pl] urządzenie LAZ! Juhu!,Você achou o Dispositivo LAZ! Oba!,Apanhaste um Dispositivo LAZ! Fixe!,Ai ridicat un Dispozitiv LAZ! Uraa!,Получено устройство зорчирования большого радиуса! Ура!,Добио си ЛАЗ уређај. ВУТ!,Du fick LAZ-enheten! Woot!,LAZ cihazını aldın! Woot!,Ти отримав пристрій LAZ! Супер! -You got the Rapid Zorcher!,GOTRAPIDZORCHER,,,,Získal@[ao_cs] jsi rychlobzukr!,Du fik en Rapid Zorcher!,Du hast den schnellen Zorcher genommen!,,Vi prenis la Rapidzorĉilon!,¡Tienes el Zorcher Rápido!,,Sait pikazorcherin!,Vous avez pris le Zorcheur Rapide!,Felvetted a Gyors Zorkert!,Hai trovato il zorcher rapido!,ラピッドゾーチャー をてにいれた!,속사 자쳐 습득!,Je hebt de snelle Zorcher!,Du har Rapid Zorcher!,Zdobył@[irreg_3_pl] Szybkostrzelny Zorcher!,Você pegou o Zorcher Automático!,Apanhaste o Zorcher Automático!,Ai ridicat un Zorcher cu Foc Rapid!,Получен скорострельный зорчер!,Добио си рапидан зорчер!,Du fick den snabba Zorcher!,Hızlı Zorcher'ı aldın!,Ти отримав Авто Зорчер! -You got the Super Bootspork!,GOTSUPERBOOTSPORK,,,,Získal@[ao_cs] jsi super botovidličku!,Du fik Super Bootspork!,Du hast den Super-Gabelquirl genommen!,,Vi prenis la Superan Ŝargmanĝilaron!,¡Tienes el Súper Cuchador!,,Sait superluhan!,Vous avez pris la Super Fourchette!,Felvetted a Szuper Rotációs Villát!,Hai trovato il super bootspork!,スーパーさきわれスプーン をてにいれた!,부트스포크 습득!,Je hebt de Super Bootspork!,Du har Super Bootspork!,Zdobył@[irreg_3_pl] Super Łyżkowidelec!,Você pegou o Super Garfo!,Apanhaste o Super Garfo-Colher!,Ai ridicat o Super Lingură!,Получена суперложковилка!,Добио си супер чизмо-порк!,Du fick Super Bootspork!,Süper Bootspork'u aldın!,Ти отримав Супер Вилколожку! -You got the Zorch Propulsor!,GOTZORCHPROPULSOR,,,,Získal@[ao_cs] jsi bzukový propulsor!,Du fik Zorch-propulsoren!,Du hast den Propellerzorcher genommen!,,Vi prenis la Zorĉpropulsilon!,¡Tienes el Propulsor de Zorch!,,Sait zorchtyöntimen!,Vous avez pris le Propulseur Zorch!,Felvetted a Zork Elhárítót!,Hai trovato il propulsore zorch!,ロケット ゾーチャー をてにいれた!,저치 추진기 습득!,Je hebt de Zorch Propulsor!,Du fikk Zorch Propulsor!,Zdobył@[irreg_3_pl] Pędnik Zorch!,Você pegou o Propulsor de Zorch!,Apanhaste o Propulsor de Zorch!,Ai ridicat un Accelerator Zorch!,Получен ускоритель хорча!,Добио си зорч погон!,Du fick Zorch Propulsor!,Zorch Propulsor'u aldın!,Ти отримав Зорч-Двигун! -You got the Phasing Zorcher!,GOTPHASINGZORCHER,,,,Získal@[ao_cs] jsi fázovací bzukr!,Du fik Phasing Zorcher!,Du hast den Phasenzorcher genommen!,,Vi prenis la Fluktuantzorĉilon!,¡Tienes el Zorcher de Fase!,,Sait vaiheiszorcherin!,Vous avez pris le Zorcheur phasé!,Felvetted a Fázis Zorkert!,Hai trovato il zorcher a phasing!,フェイシング ゾーチャー をてにいれた!,전자 자쳐 습득!,Je hebt de Fasezorcher!,Du har Phasing Zorcher!,Zdobył@[irreg_3_pl] Fazowy Zorcher!,Você pegou o Zorcher Fásico!,Apanhaste o Zorcher Fásico!,Ai ridicat un Zorcher Fazat!,Получен фазерный зорчер!,Добио си фазни зорчер!,Du fick Fasande Zorcher!,Fazlama Zorcher'ı aldın!,Ти отримав Прискорений Зорчер! -You got the Large Zorcher!,GOTLARGEZORCHER,,,,Získal@[ao_cs] jsi velký bzukr!,Du fik den store Zorcher!,Du hast den großen Zorcher genommen!,,Vi prenis la Grandzorĉilon,¡Tienes el Zorcher Grande!,,Sait ison zorcherin!,Vous avez pris le Zorcheur Large!,Felvetted a Nagy Zorkert!,Hai trovato il zorcher grande!,おおがたゾーチャー をてにいれた!,대형 자쳐 습득!,Je hebt de grote Zorcher!,Du har den store Zorcher!,Zdobył@[irreg_3_pl] Duży Zorcher!,Você pegou o Zorcher Grande!,Apanhaste o Zorcher Grande!,Ai ridicat un Zorcher Mare!,Получен большой зорчер!,Добио си велики зорчер!,Du har den stora Zorcher!,Büyük Zorcher'ı aldınız!,Ти отримав Великий Зорчер! -You got the Mega Zorcher!,GOTSUPERLARGEZORCHER,,,,Získal@[ao_cs] jsi megabzukr!,Du fik Mega Zorcher!,Du hast den Megazorcher genommen!,,Vi prenis la Grandegzorĉilon!,¡Tienes el Mega Zorcher!,,Sait megazorcherin!,Vous avez pris le méga Zorcheur!,Felvetted a Mega Zorkert!,Hai trovato il mega zorcher!,ちょうおおがたゾーチャー をてにいれた!,초대형 자쳐 습득!,Je hebt de Megazorcher!,Du har Mega Zorcher!,Zdobył@[irreg_3_pl] Mega Zorcher!,Você pegou o Mega Zorcher!,Apanhaste o Mega Zorcher!,Ai ridicat un Mega Zorcher!,Получен мегазорчер!,Добио си мега зорчер!,Du har Mega Zorcher!,Mega Zorcher'ı aldın!,Ти отримав Мега Зорчер! -Picked up a Mini Zorcher.,GOTMINIZORCHER,,,,Sebrán minibzukr.,Du har fået en Mini Zorcher.,Du hast einen Minizorcher genommen.,,Prenis Zorĉileton.,Recogiste un Mini Zorcher,,Poimit minizorcherin.,Vous avez pris le Mini Zorcheur.,Felvettél egy Mini Zorkert.,Raccolto un mini zorcher.,こがたゾーチャー をてにいれた。,소형 자쳐 습득.,Je hebt een minizorcher opgepakt.,Plukket opp en Mini Zorcher.,Zebrano Mini Zorcher.,Você pegou um Mini Zorcher.,Apanhaste um Mini Zorcher.,Ai ridicat un Mini Zorcher.,Получен мини-зорчер.,Покупио си мини зорчер!,Du fick en Mini Zorcher.,Bir Mini Zorcher aldın.,Ти отримав Міні Зорчер. -,,Actor tags,,,,,,,,,,,,,,,,,,,,,,,,,, -Spoon,TAG_SPOON,,,,Lžíce,Ske,Löffel,,Kulero,Cuchara,,Lusikka,Cuillère à Botte,Kanál,Cucchiaio ,スプーン,숟가락,Lepel,Skje,Łyżka,Colher,,Lingură,Ложка,Кашика,Sked,Kaşık,Ложка -Super Bootspork,TAG_SPORK,,,,Super botodlička,,Supergabel,,Ega Ŝargmanĝilaro,Súper Cuchador,,Superluha,Super Fourchette,Szuper Rotációs Villa,Super Forcucchiaio,スーパーさきわれスプーン,부트스포크,,,Super Łyżkowidelec,Super Garfo,Super Garfo-Colher,Super Lingură,Суперложковилка,Супер виљушка,Super Bootspork,Süper Bootspork,Супер Вилколожка -Mini Zorcher,TAG_MINIZORCHER,,,,Minibzukr,,Minizorcher,,Zorĉileto,,,Minizorcheri,Mini Zorcheur,Mini Zorker,,こがたゾーチャー,소형 자쳐,Minizorcher,,,Mini Zorcher,,,Мини-зорчер,Мини зорчер,,,Міні Зорчер -Large Zorcher,TAG_LARGEZORCHER,,,,Velký bzukr,Stor Zorcher,Großer Zorcher,,Granda Zorĉilo,Zorcher Grande,,Iso zorcheri,Zorcheur Large,Nagy Zorker,Grosso Zorcher ,おおがたゾーチャー,대형 자쳐,Grote Zorcher,Stor Zorcher,Duży Zorcher,Zorcher Grande,,Zorcher Mare,Большой зорчер,Велики зорчер,Stor Zorcher,Büyük Zorcher,Великий Зорчер -Super-Large Zorcher,TAG_SUPERLARGEZORCHER,,,,Supervelký bzukr,Super-stor Zorcher,Riesenzorcher,,Grandega Zorĉilo,Zorcher Súper Grande,,Superiso zorcheri,Zorcheur Extra-large,Hatalmas Zorker,Zorcher Enorme ,ちょうおおがたゾーチャー,초대형 자쳐,Super grote Zorcher,Super-stor Zorcher,Większy Zorcher,Super Zorcher Grande,,Zorcher Super-Mare,Мегазорчер,Супер-велики зорчер,Superstor Zorcher,Süper Büyük Zorcher,Мега Зорчер -Rapid Zorcher,TAG_RAPIDZORCHER,,,,Rychlobzukr,,Schnellzorcher,,Rapida Zorĉilo,Zorcher Rápido,,Pikazorcheri,Zorcheur Rapide,Gyors Zorker,Zorcher Rapido,れんしゃ ゾーチャー,속사 자쳐,Snelle Zorcher,,Szybkostrzelny Zorcher,Zorcher Automático,,Zorcher cu Foc Rapid,Быстрый зорчер,Рапидни зорчер,Snabbt Zorcher,Hızlı Zorcher,Авто Зорчер -Zorch Propulsor,TAG_ZORCHPROPULSOR,,,,Bzukový propulzor,,Zorch-Propeller,,Zorĉpropulsilo,Propulsor de Zorch,,Zorchtyönnin,Propulseur de Zorch,Zork Elhárító,Propulsore Zorch,ロケット ゾーチ,저치 추진기,,,Pędnik Zorch,Propulsor de Zorch,,Accelerator Zorch,Ускоритель зорча,Погонски зорчер,,,Прискорений Зорчер -Phasing Zorcher,TAG_PHASINGZORCHER,,,,Fázovací bzukr,,Phasenzorcher,,Fluktuantzorĉilo,Zorcher de Fase,,Vaiheiszorcheri,Zorcheur à Phase,Fokozatos Zorker,Zorcher di Fase,フェイシング ゾーチャー,전자 자쳐,Fasezorcher,,Fazowy Zorcher,Zorcher Fásico,,Zorcher Fazat,Фазерный зорчер,Фазни зорчер,Fasande Zorcher,Fazlama Zorcher,Фазовий Зорчер -LAZ Device,TAG_LAZDEVICE,,,,Velkodosahový bzukr,LAZ-enhed,Flächenzorcher,,LAZ-Aparato,Dispositivo LAZ,,SAZ-laite,Zorcheur Zone Large,LAZ Készülék,Dispositivo LAZ,ラージエリアゾーキング デバイス,LAZ 장치,LAZ-aparaat,LAZ-enhet,Urządzenie LAZ,Dispositivo LAZ,,Dispozitiv LAZ,Устройство «ЗБР»,ЛАЗ уређај,LAZ-enhet,LAZ Cihazı,Пристрій LAZ -%o was slimed by a flemoid.,OB_COMMONUS,,,,%o byl@[ao_cs] osliznut@[ao_cs] slizounem.,%o blev slimet af en flemoid.,%o wurde von einem Flemoiden vollgeschleimt.,,%o estas ŝlimiga de mukulo.,%o fue pegotead@[ao_esp] por un flemoide.,,%o joutui limatuksen limaamaksi.,%o à été gélifié par un flemoid.,%o el lett trutyizva egy Flemoid által.,%o è stato coperto di slime da un flemoid.,%o はフレモイドにベトベトにされた。,%o 은(는) 플레모이드에 의해 더러워졌습니다.,%o werd afgeslankt door een flemoid.,%o ble slimet av en flemoid.,"%o został@[ao_pl] oszlamion@[adj_pl] przez flemoida. -",%o foi melecad@[ao_ptb] por um flemóide.,%o foi suj@[ao_ptb] por um flemóide.,%o a fost transformat în mâzgă de un flemoid.,Игрока %o обслюнявил флемоид.,%o је унаказио љигавац.,%o blev slemmad av en flemoid.,%o bir flemoid tarafından sümüklendi.,Виберіть рівень важкості: -%o was slimed by a bipedicus.,OB_BIPEDICUS,,,,%o byl@[ao_cs] osliznut@[ao_cs] dvojnožkem.,%o blev slimet af en bipedicus.,%o wurde von einem Bipedicus vollgeschleimt.,,%o estas ŝlimiga de dupiedmukulo.,%o fue pegotead@[ao_esp] por un bipedicus.,,%o joutui bipedicuksen limaamaksi.,%o à été gélifié@[e_fr] par un bipedicus.,%o el lett trutyizva egy kétlábusz által.,%o è stato coperto di slime da un bipedicus.,%o はバイペディクスにベトベトにされた。,%o 은(는) 바이피디쿠스의 끈쩍한 시야에 걸렸습니다.,%o werd afgeslankt door een bipedicus.,%o ble slimet av en bipedicus.,%o został@[ao_pl] oszlamion@[adj_pl] przez bipedicusa.,%o foi melecad@[ao_ptb] por um bipedicus.,%o foi suj@[ao_ptb] por um bipedicus.,% a fost transformat în mâzgă de un biped.,Игрока %o обслюнявила двуножка.,%o је унаказио двоножни-љигавац.,%o blev slemmad av en bipedicus.,%o bir bipedicus tarafından sümüklendi., -%o was slimed by an armored bipedicus.,OB_BIPEDICUS2,,,%o was slimed by an armoured bipedicus.,%o byl@[ao_cs] osliznut@[ao_cs] obrněným dvojnožkem.,%o blev slimet af en pansret bipedicus.,%o wurde von einem gepanzerten Bipedicus vollgeschleimt.,,%o estas ŝlimiga de kirasa dupiedmukulo.,%o fue pegotead@[ao_esp] por un bipedicus blindado.,,%o joutui panssaroidun bipedicuksen limaamaksi.,%o à été gélifié@[e_fr] par un bipedicus en armure.,%o el lett trutyizva egy páncélozott kétlábusz által.,%o è stato coperto di slime da un bipedicus corazzato.,%o はアーマードペディクスにベトベトにされた。,%o 은(는) 정예 바이피디쿠스의 찐득한 공격을 받았습니다.,%o werd afgeslankt door een gepantserde bipedicus.,%o ble slimet av en pansret bipedicus.,%o został@[ao_pl] oszlamion@[adj_pl] przez opancerzonego bipedicusa.,%o foi melecad@[ao_ptb] por um bipedicus de armadura.,%o foi suj@[ao_ptb] por um bipedicus de armadura.,"%o a fost transformat în mâzgă de un biped cu -armură.",Игрока %o обслюнявила бронированная двуножка.,%o је унаказио оклопни-љигавац.,%o blev slemmad av en bepansrad bipedicus.,%o zırhlı bir bipedicus tarafından sümüklendi., -%o was slimed by a cycloptis.,OB_CYCLOPTIS,,,,%o byl@[ao_cs] osliznut@[ao_cs] jednoočkem.,%o blev slimet af en cycloptis.,%o wurde von einem Cycloptis vollgeschleimt.,,%o estas ŝlimiga de ciklopmukulo,%o fue pegotead@[ao_esp] por un cicloptis.,,%o joutui cycloptiksen limaamaksi.,%o à été gélifié@[e_fr] par un cycloptis.,%o el lett trutyizva egy kükloptisz által.,%o è stato coperto di slime da un cycloptis.,%o はサイクロプティスにベトベトにされた。,%o 은(는) 사이클롭티스 곁에 미끄러졌습니다.,%o werd afgeslankt door een cycloptis.,%o ble slimet av en cycloptis.,%o został@[ao_pl] oszlamion@[adj_pl] przez cykloptisa.,%o foi melecad@[ao_ptb] por um cycloptis.,%o foi suj@[ao_ptb] por um cycloptis.,%o a fost transformat în mâzgă de un ciclioptic.,Игрока %o обслюнявил циклоптис.,%o је унаказио циклогавац.,%o blev slemmad av en cycloptis.,%o bir cycloptis tarafından sümüklendi., -%o was defeated by the Flembrane.,OB_FLEMBRANE,,,,%o byl@[ao_cs] poražen@[ao_cs] Slizobránou.,%o blev besejret af Flembrane.,%o wurde von der Flembrane geschlagen,,%o estas venkita de La Mukmembrano.,%o fue vencid@[ao_esp] por la Flembrana.,,%o joutui Limakalvon päihittämäksi.,%o à été battu@[e_fr] par la Flembrane.,%o vereséget szenvedett a Slejmbrántól.,%o è stato sconfitto dalla Flembrana.,%o はフレムブランにはいぼくした。,%o 은(는) 역겨운 플렘브레인을 돌파하지 못했습니다.,%o werd verslagen door de Flembrane.,%o ble beseiret av Flembrane.,%o został@[ao_pl] pokonan@[adj_pl] przez Flembranę.,%o foi derrotad@[ao_ptb] pela Flembrane.,,%o a fost învins de Flembrană.,Игрока %o победила Флембрана.,%o је поразио љигомозак.,%o blev besegrad av Flembrane.,"%o, Flembrane tarafından yenildi.", -%o was spoon fed by %k.,OB_MPSPOON,,,,%o byl@[ao_cs] nakrmen@[ao_cs] lžičkou hráče %k.,%o blev spoon-fodret af %k.,%o wurde von %k mit dem Löffel gefüttert.,,%o estas kulernutrita de %k.,%o fue cucharead@[ao_esp] por %k.,,%k syötti pelaajaa %o lusikalla.,%o à été nourri@[e_fr] a la petite cuillière par %k.,%o kanállal lett etetve %k által.,%o è stato imboccato da %k.,%o は %k にスプーンでたべさせられた。,%k 이(가) %o 을(를) 숟가락으로 맛있게 먹였습니다.,%o werd met een lepel gevoed door %k.,%o ble matet med skje av %k.,%o został@[ao_pl] nakarmion@[adj_pl] łyżką przez %k.,%o foi comid@[ao_ptb] de colher por %k.,,%o a fost hrănit cu lingura de %k.,Игрок %o поел с ложечки у игрока %k.,%o је накашикан од %k,%o blev matad med sked av %k.,"%o, %k tarafından kaşıkla beslendi.", -%o was thoroughly mixed with %k's bootspork.,OB_MPBOOTSPORK,,,,%o byl@[ao_cs] pořádně namíchán@[ao_cs] botovidličkou hráče %k.,%o blev grundigt blandet med %ks støvlespork.,%o wurde von %k gründlich durchgerührt.,,%o estas plene miksita de la ŝargmanĝilaro de %k.,%o fue profundamente revuelt@[ao_esp] por el cubierto de %k.,,%k läpikotaisin sekoitti %o paran luhallaan.,%o à été mélangé@[e_fr] minutieusement par la Super Fourchette de %k.,%o össze lett keverve %k Rotációsvillája által.,%o è stato mischiato ben bene dal bootspork di %k.,%o は %k にスーパーさきわれスプーンでかきまぜられた。,%k 이(가) %o 을(를) 부트스포크로 빙빙 돌렸습니다.,%o werd grondig gemengd met %k's bootspork.,%o ble grundig blandet med %k's bootspork.,%o został@[ao_pl] dokładnie wymieszan@[adj_pl] łyżkowidelcem %k.,%o foi mexid@[ao_ptb] pelo garfo de %k.,%o foi mexid@[ao_ptb] pelo garfo-colher de %k.,%o a fost amestecat bine de lingura lui %k.,Игрок %o тщательно перемешан ложковилкой игрока %k.,%o је темељно измешан од стране %k супер виљушке.,%o blev ordentligt uppblandad med %ks bootspork.,%o iyice karıştırıldı., -%o was zorched by %k.,OB_MPZORCH,,,,%o byl@[ao_cs] bzukrnut@[ao_cs] hráčem %k.,%o blev zorched af %k.,%o wurde von %k gezorcht,,%o estas zorĉita de %k.,%o fue electrizad@[ao_esp] por %k.,,%k zorchasi %o paran.,%o à été zorché@[e_fr] par %k.,%o zorkolva lett %k által.,%o è stato zorchato da %k.,%o は %k にビリビリさせられた。,%o 은(는) %k 의 소형 자쳐 광선에 맞았습니다.,%o werd gezorched door %k.,%o ble svidd av %k.,%o został@[ao_pl] został zazorchowan@[adj_pl] przez %k.,%o foi zorchead@[ao_ptb] por %k.,,%o a fost înlăturat de zorcherul lui %k.,Игрок %o получил заряд из зорчера %k.,%o је зорчован %k.,%o blev zorchad av %k.,"%o, %k tarafından yenildi.", -%o was hit by %k's mega-zorcher.,OB_MPMEGAZORCH,,,,%o byl@[ao_cs] trefen@[ao_cs] megabzukrem hráče %k.,%o blev ramt af %k's mega-zorcher.,%o wurde von%ks Mega-Zorcher getroffen,,%o estas trafita de la zorĉilego de %k.,%o fue impactad@[ao_esp] por el mega-zorcher de %k.,,%k osui %o parkaan megazorcherillaan.,%o à été frappé@[e_fr] par le méga zorcheur de %k.,%o elérte %k mega zorkerét.,%o è stato colpito dal mega-zorcher di %k.,%o に %k のメガゾーチャーがヒットした。,%o 은(는) %k 의 초대형 자쳐 광선에 날라갔습니다.,%o werd geraakt door %k's megazorcher.,%o ble truffet av %k's mega-zorcher.,%o został@[ao_pl] trafion@[adj_pl] mega-zorcherem %k.,%o foi atingid@[ao_ptb] pelo mega-zorcher de %k.,,%o a fost lovit de mega-zorcherul lui %k.,Игрок %o подстрелен из мегазорчера %k.,%o је ударен од стране %k мега-зорчера.,%o blev träffad av %ks mega-zorcher.,"%o, %k tarafından yenildi.", -%o was rapid zorched by %k.,OB_MPRAPIDZORCH,,,,%o dostal@[ao_cs] rychlobzukrem hráče %k.,%o blev hurtigt zorched af %k.,%o wurde von %k schnellgezorcht.,,%o estas rapidzorĉita de %k.,%o fue electrizad@[ao_esp] rápidamente por %k.,,%k pikazorchasi %o paran.,%o à été zorché@[e_fr] rapidement par %k.,%o gyors zorkolva lett %k által.,%o è stato rapid-zorchato da %k.,%o は %k に めをまわされた。,%o 은(는) %k 의 속사 자쳐 때문에 춤을 췄습니다.,%o werd snel zorched door %k.,%o ble raskt svidd av %k.,%o został@[ao_pl] szybko zazorchowan@[adj_pl] przez %k.,%o foi zorchead@[ao_ptb] automaticamente por %k.,,%o a fost învins de zorcherul rapid al lui %k.,Игрок %o получил заряд из быстрого зорчера %k.,%o је рапидно зорчован %k,%o blev snabbt zorchad av %k.,"%o, %k tarafından yenildi.", -%o was zorched by %k's propulsor.,OB_MPPROPULSOR,,,,%o byl@[ao_cs] bzukrnut@[ao_cs] propulzorem hráče %k.,%o blev zorched af %ks propulsor.,%o wurde von %ks Propeller gezorcht,,%o estas zorĉita de la propulsilo de %k.,%o fue electrizad@[ao_esp] por el propulsor de %k.,,%k zorchasi %o paran työntimellään.,%o à été zorché@[e_fr] par le propulseur de %k.,%o zorkolva lett %k elhárítója által.,%o è stato zorchato dal propulsore di %k.,%o は %k のロケットゾーチャーにあたった。,%o 은(는) %k 의 저치 추진기 쓴 맛을 봤습니다.,%o werd zorched door %k's propulsor.,%o ble zorched av %k's propulsor.,%o został@[ao_pl] zazorchowan@[adj_pl] przez pędnik %k.,%o foi zorchead@[ao_ptb] pelo propulsor de %k.,,%o a fost învins de acceleratorul zorch al lui %k.,Игрок %o получил заряд из ускорителя зорча %k.,%o је зорчован %k погоном.,%o blev zorchad av %ks propulsor.,"%o, %k tarafından yenildi.", -%o was hit by %k's propulsor.,OB_MPP_SPLASH,,,,%o byl@[ao_cs] zasažen@[ao_cs] propulzorem hráčem %k.,%o blev ramt af %k's propulsor.,%o wurde von %ks Propeller getroffen,,%o estas trafita de la propulsilo de %k.,%o fue impactad@[ao_esp] por el propulsor de %k.,,%k osui %o parkaan työntimellään.,%o à été frappé@[e_fr] par le propulseur de %k.,%o elérte %k elhárítóját.,%o è stato colpito dal propulsore di %k.,%o に %k のロケットゾーチャーがとどいた。,%o 은(는) %k 의 저치 추진기의 방사 능력을 우습게 봤습니다.,%o werd geraakt door %k's propulsor.,%o ble truffet av %k's propulsor.,%o został@[ao_pl] trafion@[adj_pl] pędnikiem %k.,%o foi atingid@[ao_ptb] pelo propulsor de %k.,,%o a fost învins de acceleratorul lui %k.,Игрок %o подстрелен из ускорителя зорча %k.,%o је ударен %k погоном.,%o blev träffad av %ks propulsor.,"%o, %k tarafından yenildi.", -%o was phase zorched by %k.,OB_MPPHASEZORCH,,,,%o byl@[ao_cs] bzukr-vyfázován@[ao_cs] hráčem %k.,%o blev fasezorched af %k.,%o wurde von %k wegsynchronisiert,,%o estas fluktuantzorĉita de %k.,%o fue electrizad@[ao_esp] en fase por %k.,,%k vaiheiszorchasi %o paran.,%o à été phasé@[e_fr] par %k.,%o fázis zorker áldozata lett %k által.,%o è stato phase-zorchato da %k.,%o は %k によってスベスベにされた。,%o 은(는) %k 의 전자 자쳐에 의해 쓰러졌습니다.,%o was fase zorched door %k.,%o ble fasebrent av %k.,%o został@[ao_pl] został sfazowan@[adj_pl] przez %k.,%o foi atingid@[ao_ptb] pelo zorcher fásico por %k.,,%o a fost înfrânt de zorcherul fazat al lui %k.,Игрок %o получил заряд из фазерного зорчера %k.,%o је фазно торчован %k.,%o blev faszorchad av %k.,"%o, %k tarafından yenildi.", -%o fell prey to %k's LAZ device.,OB_MPLAZ_BOOM,,,,%o padl@[ao_cs] velkodosahovému bzukru hráče %k.,%o blev offer for %k's LAZ-enhed.,%o fiel %ks Flächenzorcher zum Opfer,,%o iĝis predo de la LAZ-aparato de %k.,%o cayó pres@[ao_esp] ante el dispositivo LAZ de %k.,,%o lankesi pelaajan %k SAZ-laitteen uhriksi.,%o est devenu@[e_fr] la proie du ZZL de %k.,%o prédául lett ejtve %k LAZ készülékével.,%o è stato preda del dispositivo LAZ di %k.,%o は %k のLAZデバイスのえじきになった。,%k 이(가) LAZ 장치를 들기 전에 %o 은(는) 도망쳐야 했습니다.,%o viel ten prooi aan %k's LAZ apparaat.,%o ble offer for %k's LAZ-enhet.,%o stał@[ao_pl] się ofiarą urządzenia LAZ %k.,%o foi vítima do dispositivo LAZ de %k.,,%o a căzut pradă dispozitivului LAZ al lui %k.,Игрок %o склонился перед «ЗБР» игрока %k.,%o је постао жртва %k ЛАЗ уређаја.,%o föll offer för %ks LAZ-enhet.,"%o, %k tarafından lazzlandı.", -%o was lazzed by %k.,OB_MPLAZ_SPLASH,,,,%o byl@[ao_cs] odbzukrován hráčem %k.,%o blev lazzed af %k.,%o wurde von %k weggebeamt.,,%o estas LAZ-ita de %k.,%o fue LAZeado por %k.,,%k sazzasi pelaajaan %o.,%o à été pris@[e_fr] par le ZZL de %k.,%o el lett lazzázva %k által.,%o è stato lazzato da %k.,%o は %k にとかされた。,%o 은(는) %k 의 LAZ 장치 범위를 벗어날 수 없었습니다.,%o werd gelazed door %k.,%o ble lazzed av %k.,%o został@[ao_pl] zLAZowan@[adj_pl] przez %k.,%o foi LAZead@[ao_ptb] por %k.,,%o a fost stropit de dispozitivul LAZ al lui %k.,Игрок %o получил заряд из «ЗБР» игрока %k.,%o је ЛАЗ-овао %k.,%o blev lazzad av %k.,"%o, %k tarafından lazzlandı.", -,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,, -E1M1: Landing Zone,CHUSTR_E1M1,,,,E1M1: Přistávací zóna,E1M1: Landingszone,E1M1: Landezone,,E1M1: Surterejo,E1M1: Zona de Aterrizaje,,E1M1: Laskeutumisalue,E1M1: La piste d'atterissage,E1M1: Leszállópálya,E1M1: Zona di Atterraggio,E1M1: ちゃくりく ちてん,E1M1: 착륙 지점,E1M1: Landingszone,E1M1: Landingssone,E1M1: Strefa Lądowania,E1M1: Zona de Pouso,E1M1: Zona de Aterragem,E1M1: Pista de Aterizare,E1M1: Зона приземления,Е1М1: Зона слетања,E1M1: Landningszon,E1M1: İniş Bölgesi,E1M1: Зона висадки -E1M2: Storage Facility,CHUSTR_E1M2,,,,E1M2: Skladiště,E1M2: Opbevaringsanlæg,E1M2: Lagerhalle,,E1M2: Stokejo,E1M2: Instalación de Almacenamiento,,E1M2: Varastolaitos,E1M2: Le centre de stockage,E1M2: Raktárépület,E1M2: Struttura di Immagazzinamento,E1M2: ほかん しせつ,E1M2: 저장 시설,E1M2: Opslagfaciliteit,E1M2: Lagringsanlegg,E1M2: Magazyn,E1M2: Depósito,E1M2: Armazém,E1M2: Depozitul,E1M2: Хранилище,Е1М2: Складиште,E1M2: Förvaringsanläggning,E1M2: Depolama Tesisi,E1M2: Сховище -E1M3: Experimental Lab,CHUSTR_E1M3,,,,E1M3: Testovací laboratoř,E1M3: Forsøgslaboratorium,E1M3: Experimentelles Labor,,E1M3: Eksperimenta Laboratorio,E1M3: Laboratorio Experimental,,E1M3: Koelaboratorio,E1M3: Les labos expérimentaux,E1M3: Laboratórium,E1M3: Laboratorio Sperimentale,E1M3: じっけんしつ,E1M3: 연구소,E1M3: Experimenteel laboratorium,E1M3: Eksperimentelt laboratorium,E1M3: Laboratorium Eksperymentalne,E1M3: Laboratório de Experimentos,E1M3: Laboratório Experimental,E1M2: Laboratorul,E1M3: Лаборатория,Е1М3: Експериментална лабораторија,E1M3: Experimentellt labb,E1M3: Deneysel Laboratuvar,E1M3: Експериментальна лабораторія -E1M4: Arboretum,CHUSTR_E1M4,,,,,,,,E1M4: Arbejo,E1M4: Arboreto,,,E1M4: L'Arboretum,E1M4: Arborétum,E1M4: Arboreto,E1M4: じゅもくえん,E1M4: 수목원,,E1M4: Arboretet,,E1M4: Arvoredo,,,E1M4: Дендрарий,Е1М4: Ботаничка башта,,,E1M4: Дендропарк -E1M5: Caverns of Bazoik,CHUSTR_E1M5,,,,E1M5: Bazoikské jeskyně,E1M5: Bazoiks grotter,E1M5: Die Höhlen von Bazoik,,E1M5: Kavernoj de Bazojko,E1M5: Cavernas de Bazoik,,E1M5: Bazoikin luolastot,E1M5: Les cavernes de Bazoik,E1M5: Bazoik barlangjai,E1M5: Caverne di Bazoik,E1M5: バゾイクの どうくつ,E1M5: 바조이크의 대동굴,E1M5: Grotten van Bazoik,E1M5: Grottene til Bazoik,E1M5: Jaskinie Bazoik,E1M5: Cavernas de Bazoik,,E1M5: Cavernele lui Bazoik,E1M5: Пещеры Базоика,Е1М5: Пећине Базоика,E1M5: Bazoiks grottor,E1M5: Bazoik Mağaraları,E1M5: Печери Базойка +Picked up a large zorcher recharge.,GOTLARGEZORCHERRECHARGE,,,,Sebrán náboj pro velký bzukr.,Afhentede en stor zorcher-opladning.,Du hast eine Zorcher-Ladung genommen.,,Prenis grandzorĉilo-reŝargon.,Recogiste una gran recarga de zorch.,,Poimit ison zorcherin latauksen,Vous avez pris une recharge pour zorcheur large.,,Felvettél egy Nagy Zorker Újratöltőt,Raccolta una ricarica per zorcher grande.,ラージ ゾーチャーリチャージ をひろった。,대형 저치 카트리지 획득.,Je hebt een zorcherlading opgepakt.,Plukket opp en stor zorcher-opplading.,Zebrano ładunek do dużego zorchera.,Pegou recarga para zorcher grande.,Apanhaste recarga para o zorcher grande.,Ai ridicat o încărcătură mare pentru zorcher.,Получена зарядка большого зорчера.,Покупио си велики зорчер пуњач.,Plockade upp en stor zorcher-uppladdning.,Büyük bir zorcher şarjı aldım.,Взято заряд великого Зорчера. +Picked up a large zorcher pack.,GOTLARGEZORCHERPACK,,,,Sebrán balík pro velký bzukr.,Afhentede en stor zorcher-pakke.,Du hast ein Zorcher-Ladepaket genommen.,,Prenis grandegzorĉilo-reŝargon.,Recogiste un gran paquete de zorch.,,Poimit ison zorcherin paketin.,Vous avez pris un pack de recharges pour zorcheur large.,,Felvettél egy Nagy Zorker Csomagot,Raccolta una scatola per zorcher grande.,ラージ ゾーチャーパック をひろった。,저치 카트리지 묶음 획득.,Je hebt een pakket met zorcherladingen opgepakt.,Plukket opp en stor zorcherpakke.,Zebrano paczkę dużego zorchera.,Pegou um pacote de recargas para zorcher grande.,Apanhaste um pacote de recargas para o zocher grande.,Ai ridicat un pachet mare de încărcături pentru zorcher.,Получена батарея большого зорчера.,Покупио си велики зорчер пакет.,Plockade upp ett stort zorcherpaket.,Büyük bir zorcher paketi aldı.,Взято батарею великого Зорчера. +Picked up a Zorchpak!,GOTZORCHPACK,,,,Sebrán Bzukrbatoh!,Afhentede en Zorchpak!,Du hast ein Zorchpaket genommen.,,Prenis Zorĉpakon!,¡Recogiste un Zorchpak!,,Poimit zorchpakin!,Vous avez pris un zorchpak!,,Felvettél egy Zorkpakkot!,Raccolto uno ZorchZaino!,ゾーチパックをてにいれた!,저치 팩 획득!,Je hebt en zorchpak opgepakt.,Plukket opp en Zorchpak!,Zebrano Paczkę Zorch.,Pegou um Zorchpak!,Apanhaste um Zorchpak!,Ai ridicat un Ghiozdan Zorch!,Получен зорч-рюкзак!,Покупио си зорчпак.,Jag hämtade en Zorchpak!,Bir Zorchpak aldım!,Взято Зорч-сумку! +You got the LAZ Device! Woot!,GOTLAZDEVICE,,,,Získal@[ao_cs] jsi velkodosahový bzukr! Cooo?,Du fik LAZ-enheden! Woot!,Du hast den Flächenzorcher!,,Vi prenis la LAZ-aparaton! Hura!,¡Tienes el dispositivo LAZ! ¡Yuju!,,Sait SAZ-laitteen! Juhuu!,Vous avez pris l'Outil ZZL! Wahou!,,Felvetted a LAZ Készüléket! Wáó!,Hai trovato il dispositivo LAZ! Cavolo!,LAZ デバイスをてにいれた! ワァオ!,LAZ 장치 습득! 완전 짱인걸!,Je hebt het LAZ-apparaat! Woot!,Du har LAZ-enheten! Woot!,Zdobył@[irreg_3_pl] urządzenie LAZ! Juhu!,Você achou o Dispositivo LAZ! Oba!,Apanhaste um Dispositivo LAZ! Fixe!,Ai ridicat un Dispozitiv LAZ! Uraa!,Получено устройство зорчирования большого радиуса! Ура!,Добио си ЛАЗ уређај. ВУТ!,Du fick LAZ-enheten! Woot!,LAZ cihazını aldın! Woot!,Ти отримав пристрій LAZ! Супер! +You got the Rapid Zorcher!,GOTRAPIDZORCHER,,,,Získal@[ao_cs] jsi rychlobzukr!,Du fik en Rapid Zorcher!,Du hast den schnellen Zorcher genommen!,,Vi prenis la Rapidzorĉilon!,¡Tienes el Zorcher Rápido!,,Sait pikazorcherin!,Vous avez pris le Zorcheur Rapide!,,Felvetted a Gyors Zorkert!,Hai trovato il zorcher rapido!,ラピッドゾーチャー をてにいれた!,속사 자쳐 습득!,Je hebt de snelle Zorcher!,Du har Rapid Zorcher!,Zdobył@[irreg_3_pl] Szybkostrzelny Zorcher!,Você pegou o Zorcher Automático!,Apanhaste o Zorcher Automático!,Ai ridicat un Zorcher cu Foc Rapid!,Получен скорострельный зорчер!,Добио си рапидан зорчер!,Du fick den snabba Zorcher!,Hızlı Zorcher'ı aldın!,Ти отримав Авто Зорчер! +You got the Super Bootspork!,GOTSUPERBOOTSPORK,,,,Získal@[ao_cs] jsi super botovidličku!,Du fik Super Bootspork!,Du hast den Super-Gabelquirl genommen!,,Vi prenis la Superan Ŝargmanĝilaron!,¡Tienes el Súper Cuchador!,,Sait superluhan!,Vous avez pris la Super Fourchette!,,Felvetted a Szuper Rotációs Villát!,Hai trovato il super bootspork!,スーパーさきわれスプーン をてにいれた!,부트스포크 습득!,Je hebt de Super Bootspork!,Du har Super Bootspork!,Zdobył@[irreg_3_pl] Super Łyżkowidelec!,Você pegou o Super Garfo!,Apanhaste o Super Garfo-Colher!,Ai ridicat o Super Lingură!,Получена суперложковилка!,Добио си супер чизмо-порк!,Du fick Super Bootspork!,Süper Bootspork'u aldın!,Ти отримав Супер Вилколожку! +You got the Zorch Propulsor!,GOTZORCHPROPULSOR,,,,Získal@[ao_cs] jsi bzukový propulsor!,Du fik Zorch-propulsoren!,Du hast den Propellerzorcher genommen!,,Vi prenis la Zorĉpropulsilon!,¡Tienes el Propulsor de Zorch!,,Sait zorchtyöntimen!,Vous avez pris le Propulseur Zorch!,,Felvetted a Zork Elhárítót!,Hai trovato il propulsore zorch!,ロケット ゾーチャー をてにいれた!,저치 추진기 습득!,Je hebt de Zorch Propulsor!,Du fikk Zorch Propulsor!,Zdobył@[irreg_3_pl] Pędnik Zorch!,Você pegou o Propulsor de Zorch!,Apanhaste o Propulsor de Zorch!,Ai ridicat un Accelerator Zorch!,Получен ускоритель хорча!,Добио си зорч погон!,Du fick Zorch Propulsor!,Zorch Propulsor'u aldın!,Ти отримав Зорч-Двигун! +You got the Phasing Zorcher!,GOTPHASINGZORCHER,,,,Získal@[ao_cs] jsi fázovací bzukr!,Du fik Phasing Zorcher!,Du hast den Phasenzorcher genommen!,,Vi prenis la Fluktuantzorĉilon!,¡Tienes el Zorcher de Fase!,,Sait vaiheiszorcherin!,Vous avez pris le Zorcheur phasé!,,Felvetted a Fázis Zorkert!,Hai trovato il zorcher a phasing!,フェイシング ゾーチャー をてにいれた!,전자 자쳐 습득!,Je hebt de Fasezorcher!,Du har Phasing Zorcher!,Zdobył@[irreg_3_pl] Fazowy Zorcher!,Você pegou o Zorcher Fásico!,Apanhaste o Zorcher Fásico!,Ai ridicat un Zorcher Fazat!,Получен фазерный зорчер!,Добио си фазни зорчер!,Du fick Fasande Zorcher!,Fazlama Zorcher'ı aldın!,Ти отримав Прискорений Зорчер! +You got the Large Zorcher!,GOTLARGEZORCHER,,,,Získal@[ao_cs] jsi velký bzukr!,Du fik den store Zorcher!,Du hast den großen Zorcher genommen!,,Vi prenis la Grandzorĉilon,¡Tienes el Zorcher Grande!,,Sait ison zorcherin!,Vous avez pris le Zorcheur Large!,,Felvetted a Nagy Zorkert!,Hai trovato il zorcher grande!,おおがたゾーチャー をてにいれた!,대형 자쳐 습득!,Je hebt de grote Zorcher!,Du har den store Zorcher!,Zdobył@[irreg_3_pl] Duży Zorcher!,Você pegou o Zorcher Grande!,Apanhaste o Zorcher Grande!,Ai ridicat un Zorcher Mare!,Получен большой зорчер!,Добио си велики зорчер!,Du har den stora Zorcher!,Büyük Zorcher'ı aldınız!,Ти отримав Великий Зорчер! +You got the Mega Zorcher!,GOTSUPERLARGEZORCHER,,,,Získal@[ao_cs] jsi megabzukr!,Du fik Mega Zorcher!,Du hast den Megazorcher genommen!,,Vi prenis la Grandegzorĉilon!,¡Tienes el Mega Zorcher!,,Sait megazorcherin!,Vous avez pris le méga Zorcheur!,,Felvetted a Mega Zorkert!,Hai trovato il mega zorcher!,ちょうおおがたゾーチャー をてにいれた!,초대형 자쳐 습득!,Je hebt de Megazorcher!,Du har Mega Zorcher!,Zdobył@[irreg_3_pl] Mega Zorcher!,Você pegou o Mega Zorcher!,Apanhaste o Mega Zorcher!,Ai ridicat un Mega Zorcher!,Получен мегазорчер!,Добио си мега зорчер!,Du har Mega Zorcher!,Mega Zorcher'ı aldın!,Ти отримав Мега Зорчер! +Picked up a Mini Zorcher.,GOTMINIZORCHER,,,,Sebrán minibzukr.,Du har fået en Mini Zorcher.,Du hast einen Minizorcher genommen.,,Prenis Zorĉileton.,Recogiste un Mini Zorcher,,Poimit minizorcherin.,Vous avez pris le Mini Zorcheur.,,Felvettél egy Mini Zorkert.,Raccolto un mini zorcher.,こがたゾーチャー をてにいれた。,소형 자쳐 습득.,Je hebt een minizorcher opgepakt.,Plukket opp en Mini Zorcher.,Zebrano Mini Zorcher.,Você pegou um Mini Zorcher.,Apanhaste um Mini Zorcher.,Ai ridicat un Mini Zorcher.,Получен мини-зорчер.,Покупио си мини зорчер!,Du fick en Mini Zorcher.,Bir Mini Zorcher aldın.,Ти отримав Міні Зорчер. +,,Actor tags,,,,,,,,,,,,,,,,,,,,,,,,,,, +Spoon,TAG_SPOON,,,,Lžíce,Ske,Löffel,,Kulero,Cuchara,,Lusikka,Cuillère à Botte,,Kanál,Cucchiaio ,スプーン,숟가락,Lepel,Skje,Łyżka,Colher,,Lingură,Ложка,Кашика,Sked,Kaşık,Ложка +Super Bootspork,TAG_SPORK,,,,Super botodlička,,Supergabel,,Ega Ŝargmanĝilaro,Súper Cuchador,,Superluha,Super Fourchette,,Szuper Rotációs Villa,Super Forcucchiaio,スーパーさきわれスプーン,부트스포크,,,Super Łyżkowidelec,Super Garfo,Super Garfo-Colher,Super Lingură,Суперложковилка,Супер виљушка,Super Bootspork,Süper Bootspork,Супер Вилколожка +Mini Zorcher,TAG_MINIZORCHER,,,,Minibzukr,,Minizorcher,,Zorĉileto,,,Minizorcheri,Mini Zorcheur,,Mini Zorker,,こがたゾーチャー,소형 자쳐,Minizorcher,,,Mini Zorcher,,,Мини-зорчер,Мини зорчер,,,Міні Зорчер +Large Zorcher,TAG_LARGEZORCHER,,,,Velký bzukr,Stor Zorcher,Großer Zorcher,,Granda Zorĉilo,Zorcher Grande,,Iso zorcheri,Zorcheur Large,,Nagy Zorker,Grosso Zorcher ,おおがたゾーチャー,대형 자쳐,Grote Zorcher,Stor Zorcher,Duży Zorcher,Zorcher Grande,,Zorcher Mare,Большой зорчер,Велики зорчер,Stor Zorcher,Büyük Zorcher,Великий Зорчер +Super-Large Zorcher,TAG_SUPERLARGEZORCHER,,,,Supervelký bzukr,Super-stor Zorcher,Riesenzorcher,,Grandega Zorĉilo,Zorcher Súper Grande,,Superiso zorcheri,Zorcheur Extra-large,,Hatalmas Zorker,Zorcher Enorme ,ちょうおおがたゾーチャー,초대형 자쳐,Super grote Zorcher,Super-stor Zorcher,Większy Zorcher,Super Zorcher Grande,,Zorcher Super-Mare,Мегазорчер,Супер-велики зорчер,Superstor Zorcher,Süper Büyük Zorcher,Мега Зорчер +Rapid Zorcher,TAG_RAPIDZORCHER,,,,Rychlobzukr,,Schnellzorcher,,Rapida Zorĉilo,Zorcher Rápido,,Pikazorcheri,Zorcheur Rapide,,Gyors Zorker,Zorcher Rapido,れんしゃ ゾーチャー,속사 자쳐,Snelle Zorcher,,Szybkostrzelny Zorcher,Zorcher Automático,,Zorcher cu Foc Rapid,Быстрый зорчер,Рапидни зорчер,Snabbt Zorcher,Hızlı Zorcher,Авто Зорчер +Zorch Propulsor,TAG_ZORCHPROPULSOR,,,,Bzukový propulzor,,Zorch-Propeller,,Zorĉpropulsilo,Propulsor de Zorch,,Zorchtyönnin,Propulseur de Zorch,,Zork Elhárító,Propulsore Zorch,ロケット ゾーチ,저치 추진기,,,Pędnik Zorch,Propulsor de Zorch,,Accelerator Zorch,Ускоритель зорча,Погонски зорчер,,,Прискорений Зорчер +Phasing Zorcher,TAG_PHASINGZORCHER,,,,Fázovací bzukr,,Phasenzorcher,,Fluktuantzorĉilo,Zorcher de Fase,,Vaiheiszorcheri,Zorcheur à Phase,,Fokozatos Zorker,Zorcher di Fase,フェイシング ゾーチャー,전자 자쳐,Fasezorcher,,Fazowy Zorcher,Zorcher Fásico,,Zorcher Fazat,Фазерный зорчер,Фазни зорчер,Fasande Zorcher,Fazlama Zorcher,Фазовий Зорчер +LAZ Device,TAG_LAZDEVICE,,,,Velkodosahový bzukr,LAZ-enhed,Flächenzorcher,,LAZ-Aparato,Dispositivo LAZ,,SAZ-laite,Zorcheur Zone Large,,LAZ Készülék,Dispositivo LAZ,ラージエリアゾーキング デバイス,LAZ 장치,LAZ-aparaat,LAZ-enhet,Urządzenie LAZ,Dispositivo LAZ,,Dispozitiv LAZ,Устройство «ЗБР»,ЛАЗ уређај,LAZ-enhet,LAZ Cihazı,Пристрій LAZ +%o was slimed by a flemoid.,OB_COMMONUS,,,,%o byl@[ao_cs] osliznut@[ao_cs] slizounem.,%o blev slimet af en flemoid.,%o wurde von einem Flemoiden vollgeschleimt.,,%o estas ŝlimiga de mukulo.,%o fue pegotead@[ao_esp] por un flemoide.,,%o joutui limatuksen limaamaksi.,%o à été gélifié par un flemoid.,,%o el lett trutyizva egy Flemoid által.,%o è stato coperto di slime da un flemoid.,%o はフレモイドにベトベトにされた。,%o 은(는) 플레모이드에 의해 더러워졌습니다.,%o werd afgeslankt door een flemoid.,%o ble slimet av en flemoid.,"%o został@[ao_pl] oszlamion@[adj_pl] przez flemoida. +",%o foi melecad@[ao_ptb] por um flemóide.,%o foi suj@[ao_ptb] por um flemóide.,%o a fost transformat în mâzgă de un flemoid.,Игрока %o обслюнявил флемоид.,%o је унаказио љигавац.,%o blev slemmad av en flemoid.,%o bir flemoid tarafından sümüklendi.,Флемоїд покрив слизом %o. +%o was slimed by a bipedicus.,OB_BIPEDICUS,,,,%o byl@[ao_cs] osliznut@[ao_cs] dvojnožkem.,%o blev slimet af en bipedicus.,%o wurde von einem Bipedicus vollgeschleimt.,,%o estas ŝlimiga de dupiedmukulo.,%o fue pegotead@[ao_esp] por un bipedicus.,,%o joutui bipedicuksen limaamaksi.,%o à été gélifié@[e_fr] par un bipedicus.,,%o el lett trutyizva egy kétlábusz által.,%o è stato coperto di slime da un bipedicus.,%o はバイペディクスにベトベトにされた。,%o 은(는) 바이피디쿠스의 끈쩍한 시야에 걸렸습니다.,%o werd afgeslankt door een bipedicus.,%o ble slimet av en bipedicus.,%o został@[ao_pl] oszlamion@[adj_pl] przez bipedicusa.,%o foi melecad@[ao_ptb] por um bipedicus.,%o foi suj@[ao_ptb] por um bipedicus.,% a fost transformat în mâzgă de un biped.,Игрока %o обслюнявила двуножка.,%o је унаказио двоножни-љигавац.,%o blev slemmad av en bipedicus.,%o bir bipedicus tarafından sümüklendi.,Двоніг покрив слизом %o. +%o was slimed by an armored bipedicus.,OB_BIPEDICUS2,,,%o was slimed by an armoured bipedicus.,%o byl@[ao_cs] osliznut@[ao_cs] obrněným dvojnožkem.,%o blev slimet af en pansret bipedicus.,%o wurde von einem gepanzerten Bipedicus vollgeschleimt.,,%o estas ŝlimiga de kirasa dupiedmukulo.,%o fue pegotead@[ao_esp] por un bipedicus blindado.,,%o joutui panssaroidun bipedicuksen limaamaksi.,%o à été gélifié@[e_fr] par un bipedicus en armure.,,%o el lett trutyizva egy páncélozott kétlábusz által.,%o è stato coperto di slime da un bipedicus corazzato.,%o はアーマードペディクスにベトベトにされた。,%o 은(는) 정예 바이피디쿠스의 찐득한 공격을 받았습니다.,%o werd afgeslankt door een gepantserde bipedicus.,%o ble slimet av en pansret bipedicus.,%o został@[ao_pl] oszlamion@[adj_pl] przez opancerzonego bipedicusa.,%o foi melecad@[ao_ptb] por um bipedicus de armadura.,%o foi suj@[ao_ptb] por um bipedicus de armadura.,"%o a fost transformat în mâzgă de un biped cu +armură.",Игрока %o обслюнявила бронированная двуножка.,%o је унаказио оклопни-љигавац.,%o blev slemmad av en bepansrad bipedicus.,%o zırhlı bir bipedicus tarafından sümüklendi.,Броньований двоніг покрив слизом %o. +%o was slimed by a cycloptis.,OB_CYCLOPTIS,,,,%o byl@[ao_cs] osliznut@[ao_cs] jednoočkem.,%o blev slimet af en cycloptis.,%o wurde von einem Cycloptis vollgeschleimt.,,%o estas ŝlimiga de ciklopmukulo,%o fue pegotead@[ao_esp] por un cicloptis.,,%o joutui cycloptiksen limaamaksi.,%o à été gélifié@[e_fr] par un cycloptis.,,%o el lett trutyizva egy kükloptisz által.,%o è stato coperto di slime da un cycloptis.,%o はサイクロプティスにベトベトにされた。,%o 은(는) 사이클롭티스 곁에 미끄러졌습니다.,%o werd afgeslankt door een cycloptis.,%o ble slimet av en cycloptis.,%o został@[ao_pl] oszlamion@[adj_pl] przez cykloptisa.,%o foi melecad@[ao_ptb] por um cycloptis.,%o foi suj@[ao_ptb] por um cycloptis.,%o a fost transformat în mâzgă de un ciclioptic.,Игрока %o обслюнявил циклоптис.,%o је унаказио циклогавац.,%o blev slemmad av en cycloptis.,%o bir cycloptis tarafından sümüklendi.,Циклоптіс покрив слизом %o. +%o was defeated by the Flembrane.,OB_FLEMBRANE,,,,%o byl@[ao_cs] poražen@[ao_cs] Slizobránou.,%o blev besejret af Flembrane.,%o wurde von der Flembrane geschlagen,,%o estas venkita de La Mukmembrano.,%o fue vencid@[ao_esp] por la Flembrana.,,%o joutui Limakalvon päihittämäksi.,%o à été battu@[e_fr] par la Flembrane.,,%o vereséget szenvedett a Slejmbrántól.,%o è stato sconfitto dalla Flembrana.,%o はフレムブランにはいぼくした。,%o 은(는) 역겨운 플렘브레인을 돌파하지 못했습니다.,%o werd verslagen door de Flembrane.,%o ble beseiret av Flembrane.,%o został@[ao_pl] pokonan@[adj_pl] przez Flembranę.,%o foi derrotad@[ao_ptb] pela Flembrane.,,%o a fost învins de Flembrană.,Игрока %o победила Флембрана.,%o је поразио љигомозак.,%o blev besegrad av Flembrane.,"%o, Flembrane tarafından yenildi.",Флембрана перемогла %o. +%o was spoon fed by %k.,OB_MPSPOON,,,,%o byl@[ao_cs] nakrmen@[ao_cs] lžičkou hráče %k.,%o blev spoon-fodret af %k.,%o wurde von %k mit dem Löffel gefüttert.,,%o estas kulernutrita de %k.,%o fue cucharead@[ao_esp] por %k.,,%k syötti pelaajaa %o lusikalla.,%o à été nourri@[e_fr] a la petite cuillière par %k.,,%o kanállal lett etetve %k által.,%o è stato imboccato da %k.,%o は %k にスプーンでたべさせられた。,%k 이(가) %o 을(를) 숟가락으로 맛있게 먹였습니다.,%o werd met een lepel gevoed door %k.,%o ble matet med skje av %k.,%o został@[ao_pl] nakarmion@[adj_pl] łyżką przez %k.,%o foi comid@[ao_ptb] de colher por %k.,,%o a fost hrănit cu lingura de %k.,Игрок %o поел с ложечки у игрока %k.,%o је накашикан од %k,%o blev matad med sked av %k.,"%o, %k tarafından kaşıkla beslendi.",%k нагодува@[adj_1_ua] %o з ложечки. +%o was thoroughly mixed with %k's bootspork.,OB_MPBOOTSPORK,,,,%o byl@[ao_cs] pořádně namíchán@[ao_cs] botovidličkou hráče %k.,%o blev grundigt blandet med %ks støvlespork.,%o wurde von %k gründlich durchgerührt.,,%o estas plene miksita de la ŝargmanĝilaro de %k.,%o fue profundamente revuelt@[ao_esp] por el cubierto de %k.,,%k läpikotaisin sekoitti %o paran luhallaan.,%o à été mélangé@[e_fr] minutieusement par la Super Fourchette de %k.,,%o össze lett keverve %k Rotációsvillája által.,%o è stato mischiato ben bene dal bootspork di %k.,%o は %k にスーパーさきわれスプーンでかきまぜられた。,%k 이(가) %o 을(를) 부트스포크로 빙빙 돌렸습니다.,%o werd grondig gemengd met %k's bootspork.,%o ble grundig blandet med %k's bootspork.,%o został@[ao_pl] dokładnie wymieszan@[adj_pl] łyżkowidelcem %k.,%o foi mexid@[ao_ptb] pelo garfo de %k.,%o foi mexid@[ao_ptb] pelo garfo-colher de %k.,%o a fost amestecat bine de lingura lui %k.,Игрок %o тщательно перемешан ложковилкой игрока %k.,%o је темељно измешан од стране %k супер виљушке.,%o blev ordentligt uppblandad med %ks bootspork.,%o iyice karıştırıldı.,%k ретельно переміша@[adj_1_ua] %o вилколожкою. +%o was zorched by %k.,OB_MPZORCH,,,,%o byl@[ao_cs] bzukrnut@[ao_cs] hráčem %k.,%o blev zorched af %k.,%o wurde von %k gezorcht,,%o estas zorĉita de %k.,%o fue electrizad@[ao_esp] por %k.,,%k zorchasi %o paran.,%o à été zorché@[e_fr] par %k.,,%o zorkolva lett %k által.,%o è stato zorchato da %k.,%o は %k にビリビリさせられた。,%o 은(는) %k 의 소형 자쳐 광선에 맞았습니다.,%o werd gezorched door %k.,%o ble svidd av %k.,%o został@[ao_pl] został zazorchowan@[adj_pl] przez %k.,%o foi zorchead@[ao_ptb] por %k.,,%o a fost înlăturat de zorcherul lui %k.,Игрок %o получил заряд из зорчера %k.,%o је зорчован %k.,%o blev zorchad av %k.,"%o, %k tarafından yenildi.",%k зорчну@[adj_1_ua] %o. +%o was hit by %k's mega-zorcher.,OB_MPMEGAZORCH,,,,%o byl@[ao_cs] trefen@[ao_cs] megabzukrem hráče %k.,%o blev ramt af %k's mega-zorcher.,%o wurde von%ks Mega-Zorcher getroffen,,%o estas trafita de la zorĉilego de %k.,%o fue impactad@[ao_esp] por el mega-zorcher de %k.,,%k osui %o parkaan megazorcherillaan.,%o à été frappé@[e_fr] par le méga zorcheur de %k.,,%o elérte %k mega zorkerét.,%o è stato colpito dal mega-zorcher di %k.,%o に %k のメガゾーチャーがヒットした。,%o 은(는) %k 의 초대형 자쳐 광선에 날라갔습니다.,%o werd geraakt door %k's megazorcher.,%o ble truffet av %k's mega-zorcher.,%o został@[ao_pl] trafion@[adj_pl] mega-zorcherem %k.,%o foi atingid@[ao_ptb] pelo mega-zorcher de %k.,,%o a fost lovit de mega-zorcherul lui %k.,Игрок %o подстрелен из мегазорчера %k.,%o је ударен од стране %k мега-зорчера.,%o blev träffad av %ks mega-zorcher.,"%o, %k tarafından yenildi.",%k зорчну@[adj_1_ua] %o з мега-зорчера. +%o was rapid zorched by %k.,OB_MPRAPIDZORCH,,,,%o dostal@[ao_cs] rychlobzukrem hráče %k.,%o blev hurtigt zorched af %k.,%o wurde von %k schnellgezorcht.,,%o estas rapidzorĉita de %k.,%o fue electrizad@[ao_esp] rápidamente por %k.,,%k pikazorchasi %o paran.,%o à été zorché@[e_fr] rapidement par %k.,,%o gyors zorkolva lett %k által.,%o è stato rapid-zorchato da %k.,%o は %k に めをまわされた。,%o 은(는) %k 의 속사 자쳐 때문에 춤을 췄습니다.,%o werd snel zorched door %k.,%o ble raskt svidd av %k.,%o został@[ao_pl] szybko zazorchowan@[adj_pl] przez %k.,%o foi zorchead@[ao_ptb] automaticamente por %k.,,%o a fost învins de zorcherul rapid al lui %k.,Игрок %o получил заряд из быстрого зорчера %k.,%o је рапидно зорчован %k,%o blev snabbt zorchad av %k.,"%o, %k tarafından yenildi.",%k авто-зорчну@[adj_1_ua] %o. +%o was zorched by %k's propulsor.,OB_MPPROPULSOR,,,,%o byl@[ao_cs] bzukrnut@[ao_cs] propulzorem hráče %k.,%o blev zorched af %ks propulsor.,%o wurde von %ks Propeller gezorcht,,%o estas zorĉita de la propulsilo de %k.,%o fue electrizad@[ao_esp] por el propulsor de %k.,,%k zorchasi %o paran työntimellään.,%o à été zorché@[e_fr] par le propulseur de %k.,,%o zorkolva lett %k elhárítója által.,%o è stato zorchato dal propulsore di %k.,%o は %k のロケットゾーチャーにあたった。,%o 은(는) %k 의 저치 추진기 쓴 맛을 봤습니다.,%o werd zorched door %k's propulsor.,%o ble zorched av %k's propulsor.,%o został@[ao_pl] zazorchowan@[adj_pl] przez pędnik %k.,%o foi zorchead@[ao_ptb] pelo propulsor de %k.,,%o a fost învins de acceleratorul zorch al lui %k.,Игрок %o получил заряд из ускорителя зорча %k.,%o је зорчован %k погоном.,%o blev zorchad av %ks propulsor.,"%o, %k tarafından yenildi.",%k зорчну@[adj_1_ua] %o з прискореного зорчера. +%o was hit by %k's propulsor.,OB_MPP_SPLASH,,,,%o byl@[ao_cs] zasažen@[ao_cs] propulzorem hráčem %k.,%o blev ramt af %k's propulsor.,%o wurde von %ks Propeller getroffen,,%o estas trafita de la propulsilo de %k.,%o fue impactad@[ao_esp] por el propulsor de %k.,,%k osui %o parkaan työntimellään.,%o à été frappé@[e_fr] par le propulseur de %k.,,%o elérte %k elhárítóját.,%o è stato colpito dal propulsore di %k.,%o に %k のロケットゾーチャーがとどいた。,%o 은(는) %k 의 저치 추진기의 방사 능력을 우습게 봤습니다.,%o werd geraakt door %k's propulsor.,%o ble truffet av %k's propulsor.,%o został@[ao_pl] trafion@[adj_pl] pędnikiem %k.,%o foi atingid@[ao_ptb] pelo propulsor de %k.,,%o a fost învins de acceleratorul lui %k.,Игрок %o подстрелен из ускорителя зорча %k.,%o је ударен %k погоном.,%o blev träffad av %ks propulsor.,"%o, %k tarafından yenildi.",%k врази@[adj_1_ua] %o з прискореного зорчера. +%o was phase zorched by %k.,OB_MPPHASEZORCH,,,,%o byl@[ao_cs] bzukr-vyfázován@[ao_cs] hráčem %k.,%o blev fasezorched af %k.,%o wurde von %k wegsynchronisiert,,%o estas fluktuantzorĉita de %k.,%o fue electrizad@[ao_esp] en fase por %k.,,%k vaiheiszorchasi %o paran.,%o à été phasé@[e_fr] par %k.,,%o fázis zorker áldozata lett %k által.,%o è stato phase-zorchato da %k.,%o は %k によってスベスベにされた。,%o 은(는) %k 의 전자 자쳐에 의해 쓰러졌습니다.,%o was fase zorched door %k.,%o ble fasebrent av %k.,%o został@[ao_pl] został sfazowan@[adj_pl] przez %k.,%o foi atingid@[ao_ptb] pelo zorcher fásico por %k.,,%o a fost înfrânt de zorcherul fazat al lui %k.,Игрок %o получил заряд из фазерного зорчера %k.,%o је фазно торчован %k.,%o blev faszorchad av %k.,"%o, %k tarafından yenildi.",%k фазорчну@[adj_1_ua] %o. +%o fell prey to %k's LAZ device.,OB_MPLAZ_BOOM,,,,%o padl@[ao_cs] velkodosahovému bzukru hráče %k.,%o blev offer for %k's LAZ-enhed.,%o fiel %ks Flächenzorcher zum Opfer,,%o iĝis predo de la LAZ-aparato de %k.,%o cayó pres@[ao_esp] ante el dispositivo LAZ de %k.,,%o lankesi pelaajan %k SAZ-laitteen uhriksi.,%o est devenu@[e_fr] la proie du ZZL de %k.,,%o prédául lett ejtve %k LAZ készülékével.,%o è stato preda del dispositivo LAZ di %k.,%o は %k のLAZデバイスのえじきになった。,%k 이(가) LAZ 장치를 들기 전에 %o 은(는) 도망쳐야 했습니다.,%o viel ten prooi aan %k's LAZ apparaat.,%o ble offer for %k's LAZ-enhet.,%o stał@[ao_pl] się ofiarą urządzenia LAZ %k.,%o foi vítima do dispositivo LAZ de %k.,,%o a căzut pradă dispozitivului LAZ al lui %k.,Игрок %o склонился перед «ЗБР» игрока %k.,%o је постао жртва %k ЛАЗ уређаја.,%o föll offer för %ks LAZ-enhet.,"%o, %k tarafından lazzlandı.",%o па@[adj_1_ua] жертвою LAZ девайсу %k. +%o was lazzed by %k.,OB_MPLAZ_SPLASH,,,,%o byl@[ao_cs] odbzukrován hráčem %k.,%o blev lazzed af %k.,%o wurde von %k weggebeamt.,,%o estas LAZ-ita de %k.,%o fue LAZeado por %k.,,%k sazzasi pelaajaan %o.,%o à été pris@[e_fr] par le ZZL de %k.,,%o el lett lazzázva %k által.,%o è stato lazzato da %k.,%o は %k にとかされた。,%o 은(는) %k 의 LAZ 장치 범위를 벗어날 수 없었습니다.,%o werd gelazed door %k.,%o ble lazzed av %k.,%o został@[ao_pl] zLAZowan@[adj_pl] przez %k.,%o foi LAZead@[ao_ptb] por %k.,,%o a fost stropit de dispozitivul LAZ al lui %k.,Игрок %o получил заряд из «ЗБР» игрока %k.,%o је ЛАЗ-овао %k.,%o blev lazzad av %k.,"%o, %k tarafından lazzlandı.",%k LAZну@[adj_1_ua] %o. +,,Miscellaneous,,,,,,,,,,,,,,,,,,,,,,,,,,, +E1M1: Landing Zone,CHUSTR_E1M1,,,,E1M1: Přistávací zóna,E1M1: Landingszone,E1M1: Landezone,,E1M1: Surterejo,E1M1: Zona de Aterrizaje,,E1M1: Laskeutumisalue,E1M1: La piste d'atterissage,,E1M1: Leszállópálya,E1M1: Zona di Atterraggio,E1M1: ちゃくりく ちてん,E1M1: 착륙 지점,E1M1: Landingszone,E1M1: Landingssone,E1M1: Strefa Lądowania,E1M1: Zona de Pouso,E1M1: Zona de Aterragem,E1M1: Pista de Aterizare,E1M1: Зона приземления,Е1М1: Зона слетања,E1M1: Landningszon,E1M1: İniş Bölgesi,E1M1: Зона висадки +E1M2: Storage Facility,CHUSTR_E1M2,,,,E1M2: Skladiště,E1M2: Opbevaringsanlæg,E1M2: Lagerhalle,,E1M2: Stokejo,E1M2: Instalación de Almacenamiento,,E1M2: Varastolaitos,E1M2: Le centre de stockage,,E1M2: Raktárépület,E1M2: Struttura di Immagazzinamento,E1M2: ほかん しせつ,E1M2: 저장 시설,E1M2: Opslagfaciliteit,E1M2: Lagringsanlegg,E1M2: Magazyn,E1M2: Depósito,E1M2: Armazém,E1M2: Depozitul,E1M2: Хранилище,Е1М2: Складиште,E1M2: Förvaringsanläggning,E1M2: Depolama Tesisi,E1M2: Сховище +E1M3: Experimental Lab,CHUSTR_E1M3,,,,E1M3: Testovací laboratoř,E1M3: Forsøgslaboratorium,E1M3: Experimentelles Labor,,E1M3: Eksperimenta Laboratorio,E1M3: Laboratorio Experimental,,E1M3: Koelaboratorio,E1M3: Les labos expérimentaux,,E1M3: Laboratórium,E1M3: Laboratorio Sperimentale,E1M3: じっけんしつ,E1M3: 연구소,E1M3: Experimenteel laboratorium,E1M3: Eksperimentelt laboratorium,E1M3: Laboratorium Eksperymentalne,E1M3: Laboratório de Experimentos,E1M3: Laboratório Experimental,E1M2: Laboratorul,E1M3: Лаборатория,Е1М3: Експериментална лабораторија,E1M3: Experimentellt labb,E1M3: Deneysel Laboratuvar,E1M3: Експериментальна лабораторія +E1M4: Arboretum,CHUSTR_E1M4,,,,,,,,E1M4: Arbejo,E1M4: Arboreto,,,E1M4: L'Arboretum,,E1M4: Arborétum,E1M4: Arboreto,E1M4: じゅもくえん,E1M4: 수목원,,E1M4: Arboretet,,E1M4: Arvoredo,,,E1M4: Дендрарий,Е1М4: Ботаничка башта,,,E1M4: Дендропарк +E1M5: Caverns of Bazoik,CHUSTR_E1M5,,,,E1M5: Bazoikské jeskyně,E1M5: Bazoiks grotter,E1M5: Die Höhlen von Bazoik,,E1M5: Kavernoj de Bazojko,E1M5: Cavernas de Bazoik,,E1M5: Bazoikin luolastot,E1M5: Les cavernes de Bazoik,,E1M5: Bazoik barlangjai,E1M5: Caverne di Bazoik,E1M5: バゾイクの どうくつ,E1M5: 바조이크의 대동굴,E1M5: Grotten van Bazoik,E1M5: Grottene til Bazoik,E1M5: Jaskinie Bazoik,E1M5: Cavernas de Bazoik,,E1M5: Cavernele lui Bazoik,E1M5: Пещеры Базоика,Е1М5: Пећине Базоика,E1M5: Bazoiks grottor,E1M5: Bazoik Mağaraları,E1M5: Печери Базойка "Mission accomplished. Are you prepared for the next mission? @@ -1967,7 +1988,7 @@ Etes vous prêt pour la prochaine mission? -Appuyez sur échap pour continuer...","Küldetés teljesítve. +Appuyez sur échap pour continuer...",,"Küldetés teljesítve. Készen állsz a következő küldetésre? @@ -2098,9 +2119,9 @@ Devam etmek için kaçış tuşuna basın...","Місія виконана. Натисни клавішу escape, щоб продовжити..." -You've done it!,CE2TEXT,,,,Dokázal@[ao_cs] jsi to!,Du har gjort det!,Du hast es geschafft!,,Vi sukcesis!,¡Lo hiciste!,,Teit sen!,Vous l'avez fait!,Megcsináltad!,Ce l'hai fatta!,よくやった!,해내셨습니다!,Het is je gelukt!,Du klarte det!,Udało ci się!,Você conseguiu!,Conseguiste!,Ai reușit!,Вы справились!,Урадио си то!,Du har gjort det!,Başardınız!,У тебе вийшло! -Wonderful Job!,CE3TEXT,,,,Skvělá práce!,Vidunderligt arbejde!,Großartige Arbeit!,,Mirindan Laboron!,¡Maravilloso!,,Hienoa työtä!,Merveilleux travail!,Tökéletes munka!,Meraviglioso!,ワンダフル!,멋지게 잘하셨습니다!,Geweldig werk!,Fantastisk jobb!,Dobra Robota!,Ótimo trabalho!,,O treabă minunată!,Превосходная работа!,Изванредан посао!,Underbart jobb!,Harika bir iş!,Чудова робота! -Fantastic,CE4TEXT,,,,Fantastické,Fantastisk,Fantastisch,,Mirinda,¡Fantástico!,,Fantastista,Fantastique!,Fantasztikus!,Fantastico,すばらしい!,환상적,Fantastisch,Fantastisk!,Fantastycznie,Fantástico,,,Великолепно.,Фантастично,Fantastiskt,Fantastik,Фантастика +You've done it!,CE2TEXT,,,,Dokázal@[ao_cs] jsi to!,Du har gjort det!,Du hast es geschafft!,,Vi sukcesis!,¡Lo hiciste!,,Teit sen!,Vous l'avez fait!,,Megcsináltad!,Ce l'hai fatta!,よくやった!,해내셨습니다!,Het is je gelukt!,Du klarte det!,Udało ci się!,Você conseguiu!,Conseguiste!,Ai reușit!,Вы справились!,Урадио си то!,Du har gjort det!,Başardınız!,У тебе вийшло! +Wonderful Job!,CE3TEXT,,,,Skvělá práce!,Vidunderligt arbejde!,Großartige Arbeit!,,Mirindan Laboron!,¡Maravilloso!,,Hienoa työtä!,Merveilleux travail!,,Tökéletes munka!,Meraviglioso!,ワンダフル!,멋지게 잘하셨습니다!,Geweldig werk!,Fantastisk jobb!,Dobra Robota!,Ótimo trabalho!,,O treabă minunată!,Превосходная работа!,Изванредан посао!,Underbart jobb!,Harika bir iş!,Чудова робота! +Fantastic,CE4TEXT,,,,Fantastické,Fantastisk,Fantastisch,,Mirinda,¡Fantástico!,,Fantastista,Fantastique!,,Fantasztikus!,Fantastico,すばらしい!,환상적,Fantastisch,Fantastisk!,Fantastycznie,Fantástico,,,Великолепно.,Фантастично,Fantastiskt,Fantastik,Фантастика "You can't do load while in a net quest! Press a key.",CLOADNET,,,,"Nemůžeš použít načtení, když hraješ síťové pátrání! @@ -2118,7 +2139,7 @@ Presiona una tecla.",,"Et voi ladata verkkopelin aikana! Paina jotain näppäintä.","Vous ne pouvez pas charger quand vous êtes en ligne! -Appuyez sur une touche.","Nem tudsz mentést betölteni netes küldetés közben! +Appuyez sur une touche.",,"Nem tudsz mentést betölteni netes küldetés közben! Nyomj meg egy gombot.","Non puoi caricare una partita durante una netquest! @@ -2176,7 +2197,7 @@ Paina Y tai N.","Sauvegarde rapide sur le fichier '%s'? -Appuyez sur Y ou N.","Gyorsmenteni akarod az alábbi küldetést: +Appuyez sur Y ou N.",,"Gyorsmenteni akarod az alábbi küldetést: '%s'? @@ -2245,7 +2266,7 @@ Presiona una tecla.",,"Et voi pikaladata verkkopelin aikana! Paina jotain näppäintä.","Vous ne pouvez pas charger quand vous êtes en ligne! -Appuyez sur une touche.","Nem tudsz gyorstölteni netes küldetés közben! +Appuyez sur une touche.",,"Nem tudsz gyorstölteni netes küldetés közben! Nyomj meg egy gombot.","Non puoi fare un quickload durante una netquest! @@ -2305,7 +2326,7 @@ Paina Y tai N.","Chargement rapide sur le fichier '%s'? -Appuyez sur Y ou N.","Be akarod tölteni a következő küldetést +Appuyez sur Y ou N.",,"Be akarod tölteni a következő küldetést '%s'? @@ -2380,7 +2401,7 @@ Presiona una tecla.",,"Et voi aloittaa uutta peliä verkkopelin aikana. Paina jotain näppäintä.","Vous ne pouvez pas lancer une partie quand vous êtes en ligne! -appuyez sur une touche.","Nem tudsz új játékot indítani netes küldetés közben! +appuyez sur une touche.",,"Nem tudsz új játékot indítani netes küldetés közben! Nyomj meg egy gombot.","Non puoi iniziare una nuova quest durante una network quest. @@ -2442,7 +2463,7 @@ Haluatko jatkaa? Paina Y tai N.","Attention, ce mode n'y va pas avec tact... Voulez-vous continuer? -Appuyez sur Y ou N.","Vigyázz, ez nehéz lesz. +Appuyez sur Y ou N.",,"Vigyázz, ez nehéz lesz. Biztosan folytatni akarod? Nyomj Y-t vagy N-t.","Attento, sarà dura. @@ -2517,7 +2538,7 @@ Paina jotain näppäintä.","Ceci est Chex(R) Quest. Attendez-vous à de futur niveaux sur www.chexquest.com. -Appuyez sur une touche.","Ez a Chex(R) Quest. Keresd +Appuyez sur une touche.",,"Ez a Chex(R) Quest. Keresd az új pályákat a www.chexquest.com-on. @@ -2593,7 +2614,7 @@ Presiona una tecla.",,"Et voi päättää verkkopeliä! Paina jotain näppäintä.","Vous ne pouvez pas arrêter la partie quand vous êtes en ligne! -Appuyez sur une touche.","Nem tudsz kilépni a netes küldetésből! +Appuyez sur une touche.",,"Nem tudsz kilépni a netes küldetésből! Nyomj egy gombot.","Non puoi terminare una netquest! @@ -2640,7 +2661,7 @@ Presiona Y ó N.",,"Haluatko varmasti päättää pelin? Paina Y tai N.","Finir la partie? -Appuyez sur Y ou N.","Biztosan be akarod fejezni a küldetést? +Appuyez sur Y ou N.",,"Biztosan be akarod fejezni a küldetést? Nyomj Y-t vagy N-t.","Sei sicuro di voler terminare la quest? @@ -2671,726 +2692,727 @@ Tryck på Y eller N.","Görevi sonlandırmak istediğinizden emin misiniz? Y veya N tuşuna basın.","Ти дійсно хочеш завершити квест? Натисни Y або N." -Invincible Mode ON,STSTR_DQDON,,chex,,Režim nezranitelnosti ZAP,Uovervindelig tilstand TIL,Unbesiegbarer Modus EIN,,Nevenkebla-reĝimo ŜALTITA,Modo invencible ACTIVADO,,Kuolemattomuustila PÄÄLLÄ,Mode invincible ON,Sérthetetlen mód BE,Modalità invincibile attivata,むてきモード オン,무적 모드 켬,Onoverwinnelijke modus AAN,Uovervinnelig modus PÅ,Tryb Niewrażliwości WŁĄCZONY,Modo invencível ATIVADO,,Modul Invincibil ACTIVAT,Режим неуязвимости ВКЛЮЧЁН,Неуништив УКЉУЧЕН,Oövervinnerligt läge på,Yenilmez Mod AÇIK,Невразливість увімкнено -Invincible Mode OFF,STSTR_DQDOFF,,chex,,Režim nezranitelnosti VYP,Uovervindelig tilstand FRA,Unbesiegbarer Modus AUS,,Nevenkebla-reĝimo MALŜALTITA,Modo invencible DESACTIVADO,,Kuolemattomuustila POIS PÄÄLLÄ,Mode invincible OFF,Sérthetetlen mód KI,Modalità invincibile disattivata,むてきモード オフ,무적 모드 끔,Onoverwinnelijke modus UIT,Uovervinnelig modus AV,Tryb Niewrażliwości WYŁĄCZONY,Modo invencível DESATIVADO,,Modul Invincibil DEZACTIVAT,Режим неуязвимости ОТКЛЮЧЁН,Неуништив ИСКЉУЧЕН,Oövervinnerligt läge av,Yenilmez Modu KAPALI,Невразливість вимкнено -Zorch Added,STSTR_FAADDED,,chex,,Bzukry přidány,Zorch tilføjet,Zorch hinzugefügt,,Zorĉo Aldonita,Zorch añadido,,Zorch lisätty,Zorch Ajouté,Szörcs felvéve,Zorch aggiunto,ゾーチ ついか,모든 저치 에너지 추가,Zorch toegevoegd,Zorch lagt til,Zorch dodany,Zorch adicionado,,Zorcher Adăugat,Получен зорч,Зорч додат,Zorch har lagts till,Zorch Eklendi,Додано Зорч -Super Zorch Added,STSTR_KFAADDED,,chex,,Superbzukry přidány,Super Zorch Tilføjet,Super Zorch hinzugefügt,,Supera Zorĉo Aldonita,Súper Zorch añadido,,Superzorch lisätty,Super Zorch Ajouté,Szuper Szörcs feléve,Super Zorch aggiunto,スーパーゾーチ ついか,모든 아이템 습득!,Super Zorch toegevoegd,Super Zorch lagt til,Super Zorch dodany,Super Zorch adicionado,,Super Lingură Adăugată,Получен суперзорч,Супер зорч додат,Super Zorch läggs till,Süper Zorch Eklendi,Додано Супер Зорч -... Eat Chex(R)!,STSTR_CHOPPERS,,chex,,... Jez Chex(R)!,... Spis Chex(R)!,...Iss Chex(R)!,,... Manĝu Chex(R)-on!,... Come Chex(R),,... Syö Chex(R):ä!,... Mangez du Chex(R)!,...egyél Chex(R)-et!,... Mangia I Chex(R)!,...Chex(R)をたべよう!,... 첵스(R) 를 많이 먹자!,... Eet Chex(R)!,... Spis Chex(R)!,... jedz płatki Chex(R)!,... coma Chex(R)!,,... Mănâncă Chex(R)!,...ешь Chex(R)!,... Једи Chex(R)!,... Ät Chex(R)!,... Chex(R) yiyin!,... Їж Chex(R)! -Mini Zorch Charge,AMMO_CLIP,,chex,,Minibzukrové náboje,Mini Zorch ladning,Minizorcher-Ladung,,Zorĉileto-Ŝarĝo,Carga de Mini Zorch,,Minizorchvaraus,Charge Zorch,Mini szörcs töltet,Ricarica Mini Zorch,ミニゾーチ ほきゅう,소형 저치 전지,Mini Zorchlading,Mini Zorch ladning,Mini Ładunek Zorch,Recarga de Mini Zorch,,Mini Încărcătură pentru Zorcher,Заряд мини-зорчера,Мини зорч пуњач,,Mini Zorch Şarjı,Заряд міні-Зорчера -Large Zorcher Charge,AMMO_SHELLS,,chex,,Velkobzukrové náboje,Stor Zorch ladning,Zorcher-Ladung,,Ŝarĝo por Granda Zorĉilo,Carga de Zorcher Grande,,Ison zorcherin varaus,Charge de Zorcheur Large,Nagy szörcs töltet,Ricarica Grande Zorch,ラージゾーチャー ほきゅう,대형 저치 카트리지,Grote Zorchlading,Stor Zorch ladning,Ładunek do Dużego Zorchera,Recarga de Zorch Grande,,Încărcătură Mare pentru Zorcher,Заряд большого зорчера,Велики зорч пуњач,Stor Zorch-laddning,Büyük Zorcher Şarjı,Заряд Великого Зорчера -Propulsor Charge,AMMO_ROCKETS,,chex,,Propulzorové náboje,Propulsor ladning,Propeller-Ladung,,Zorĉpropulsilo-ŝarĝo,Carga de Propulsor de Zorch ,,Työntimen varaus,Charge de Propulseur,Hajtómű töltet,Ricarica Propulsore,プロパルサー ほきゅう,저치 추진료,Propulsorlading,Propulsor ladning,Ładunek do Pędnika,Recarga de Propulsor de Zorch,,Încărcătură pentru Accelerator,Заряд ускорителя,Погонски зорч пуњач,Propulsor-laddning,İtici Şarjı,Заряд Прискорювача -Phasing Zorcher Charge,AMMO_CELLS,,chex,,Fázovací náboje,Phasing-Zorcher ladning,Phasenzorcher-Ladung,,Fluktuantzorĉilo-ŝarĝo,Carga de Zorcher de Fase,,Vaiheiszorcherin varaus,Charge de Phaseur,Fázisszörcsölő töltet,Ricarica Zorcher di Fase,フェイシング ゾーチャー ほきゅう,저치 전자 충전기,Fasezorcherlading,Phasing-Zorcher ladning,Ładunek do Fazowego Zorchera,Recarga de Zorcher Fásico,,Încărcătură pentru Zorcherul Fazat,Заряд фазерного зорчера,Фазни зорч пуњач,Zorcher-laddning för fasning,Zorcher Yükünün Aşamalandırılması,Заряд фазового Зорчера -,,Menus,,,,,,,,,,,,,,,,,,,,,,,,,, -,,Main Menus,,,,,,,,,,,,,,,,,,,,,,,,,, -New Game,MNU_NEWGAME,,,,Nová hra,Nyt spil,Neues Spiel,Νέο Παιχνίδι,Nova ludado,Nueva partida,,Uusi peli,Nouvelle Partie,Új játék,Nuova partita,新規ゲーム,새로운 게임,Nieuw spel,Nytt spill,Nowa Gra,Novo jogo,,Joc Nou,Новая игра,Нова игра,Nytt spel,Yeni Oyun,Нова гра -Options,MNU_OPTIONS,,,,Možnosti,Indstillinger,Optionen,Ρυθμίσεις,Agordoj,Opciones,,Asetukset,Options,Beállítások,Opzioni,オプション,설정,Opties,Alternativer,Opcje,Opções,,Opțiuni,Настройки,Подешавања,Alternativ,Seçenekler,Налаштування -Game Files,MNU_GAMEFILES,,,,Uložené hry,Spilfiler,Spieldateien,Αρχεία Παιχνιδιού,Ludo-dosieroj,Archivos del juego,,Pelitiedostot,Fichiers de jeu,Játékfájlok,File di gioco,ゲームファイル,게임 파일,Spelbestanden,Spillfiler,Pliki Gry,Jogos salvos,Jogos Gravados,Fișiere Joc,Файлы игры,Фајлови игре,Spelfiler,Oyun Dosyaları,Ігрові файли -Info,MNU_INFO,,,,Informace,,Informationen,Πληροφορίες,Informoj,Información,,Tiedot,,Információ,Informazioni,情報,정보,,,,Informações,,,Информация,Подаци,,Bilgi,Інформація -Quit Game,MNU_QUITGAME,,,,Ukončit hru,Afslut spil,Spiel verlassen,Έξοδος,Forlasi ludon,Salir del juego,,Lopeta peli,Quitter le jeu,Kilépés,Esci dal gioco,終了,게임 종료,Verlaat spel,Avslutt spill,Wyjdź z Gry,Sair,,Ieșire din Joc,Выход из игры,Заврши игру,Avsluta spelet,Oyundan Çık,Вихід -Choose Skill Level:,MNU_CHOOSESKILL,This text is extremely space limited!,,,Vyber obtížnost:,Vælg færdighedsniveau:,Schwierigkeitsgrad:,Επίλεξε ΔυσκολΊα:,Elektu malfacilecon:,Elige nivel de dificultad:,,Valitse vaikeustaso:,Difficulté:,Nehézségi szint:,Livello di difficoltà:,実力を選べ:,난이도를 고르시오:,Vaardigheidsniveau:,Velg ferdighetsnivå:,Poziom Trudności:,Escolha o nível de dificuldade:,,Alege Dificultatea:,Уровень сложности:,Ниво тежине:,Välj färdighetsnivå:,Beceri Seviyesini Seçin:, -I'm too young to die.,SKILL_BABY,,,,Ještě nechci umřít.,Jeg er for ung til at dø.,Ich bin zu jung zum Sterben.,Είμαι πολύ νεαρός για να πεθάνω!,Mi tro junas por morti.,Soy muy joven para morir.,,Olen liian nuori kuolemaan.,Trop jeune pour mourir!,Kicsi vagyok még a halálhoz.,Troppo giovane per morire.,死ぬには若すぎる,난 죽기엔 너무 젊어.,Ik ben te jong om te sterven.,Jeg er for ung til å dø.,Jestem za młody by umierać.,Sou jovem demais para morrer.,Demasiado novo para morrer.,Sunt prea tânăr ca să mor.,Мне рано умирать.,Премлад сам да умрем.,Jag är för ung för att dö.,Ölmek için çok gencim., -"Hey, not too rough.",SKILL_EASY,,,,"Hej, ne tak tvrdě.","Hey, ikke for hårdt.","He, nicht so ruppig.",Όχι πολύ δύσκολο,"He, ne tro malafable.","Oye, no seas tan duro.",,"Hei, ei liian kovaa.","Hé, pas trop fort!","Hé, ne túl erősen!","Ehi, non troppo duro!",あまり激しくするな,너무 세게 하지는 마.,"Hé, niet te ruw.","Hei, ikke for hardhendt.","Hej, nie tak mocno.","Opa, pega leve aí.","Ei, mais devagar.","Hei, nu foarte dur.","Эй, не слишком грубо.","Хеј, не претерано грубо.",Inte alltför grovt.,Çok sert değil., -Hurt me plenty.,SKILL_NORMAL,,,,Pojď do mě.,Gør mig rigeligt ondt.,Tu mir weh.,Πόνεσε με,Vundu min multe.,Dame con todo.,,Satuta minua kunnolla.,Fais-moi mal!,Adjál bőven!,Fammi molto male.,手加減無用,마음껏 때려봐.,Doe me veel pijn.,Skader meg mye.,Dowal mi.,Vem com tudo.,Dá-me com força.,Rănește-mă din plin.,Сделай мне больно.,Повреди ме кол'ко можеш.,Gör mig mycket illa.,Beni çok incittin., -Ultra-Violence.,SKILL_HARD,,,,Ultrařežba.,Ultra-vold.,Volle Gewalt.,Ύπερ-Βία,Ekstrema perforto.,Ultraviolencia.,,Ultraväkivalta.,Ultra-Violence!,Ultraerőszak!,Ultra-violenza.,ウルトラ バイオレンス,극단적인-폭력.,Ultra Geweld.,Ultra-vold.,Ultra-Przemoc.,Ultraviolência.,,Ultra-Violență.,Ультранасилие.,Ултра-насилно.,Ultra-våld.,Ultra Şiddet., -Nightmare!,SKILL_NIGHTMARE,,,,Noční můra!,Mareridt!,Alptraum!,Εφιάλτης!,Inkubo!,¡Pesadilla!,,Painajainen!,Cauchemar!,Rémálom!,Incubo!,悪夢だ!,악몽!,Nachtmerrie!,Mareritt!,Koszmar!,Pesadelo!,,Coșmar!,Кошмар!,Ноћна мора!,Mardröm!,Kabus!,Кошмар! -Easy does it,CSKILL_BABY,,,,Hezky zlehka,Let gør det,Immer sachte,,Kvietiĝu,Así de fácil,,Hiljaa hyvä tulee,On y va Doucement,Csak gyengéden.,Facile no?,やさしくして,살살 하면 좋겠네,Gemakkelijk doet het,Rolig nå,Łatwizna,Vamos com calma,,Merge ușor,Потихоньку-полегоньку,Лагано сад,Det är lätt att göra det.,Sakin ol., -Not so sticky,CSKILL_EASY,,,,Ne tak ulepeně,Ikke så klistret,Nicht so schmierig,,Ne tiel glueca,No tan pegajoso,,Ei niin tahmaista,Pas trop Collant,Ne túl ragadósan!,"Non così appiccicoso -",ダラダラしない,질척하진 않게,Niet zo plakkerig.,Ikke så klissete,Nie tak lepko,Não tão gosmento,,Nu așa de lipicios,Не особо липко,Не тако лепљиво,Inte så klibbigt,Çok yapışkan değil, -Gobs of goo,CSKILL_NORMAL,,,,Hafo hlenu,Masser af klister,Schleimklumpen,,Buloj de muko,Montón de moco,,Limaklönttejä,Des Tonnes de Gelée,Egy csomó trutymó,Sputi di sostanza,"カッチカチスライム -",적지 않은 질퍽함,brokken slijm,Klumper av klister,Maziste Gęby,Um montão de meleca,Um montão de ranho,Multă mâzgă,Масса слизи,Лопте љиге,Massor av kladd,Çok fazla çamur, -Extreme Ooze,CSKILL_HARD,,,,Extra bláto,Ekstrem slim,Extrem glitschig,,Ekstrema pusado,Goteo extremo,,Äärimmäisen mönjäistä,Extrêmement Gluant,Extrém nyúlós,Melma estrema,"かげきなウーズ -",엄청난 끈끈함,Uiterst glibberig,Ekstrem slim,Ekstremalny Muł,Gosma ao extremo,,Noroi Extrem,Экстремальная грязь,Екстремно љигаво,Extremt slemmigt,Aşırı Sızıntı, -Super Slimey!,CSKILL_NIGHTMARE,,,,Superslizké!,Super slimet!,Super schleimig!,,Tre ŝlima!,¡Súper viscoso!,,Superlimaista!,Carrément Crade!,Szupernyálkás!,Super Viscido!,ちょうベトベト!,끈쩍함 천지!,Super slijmerig!,Super slimete!,Super Oślizgły!,Super Gosmento!,,Super Mâzgos!,Сверхсклизский!,СУПЕР ЉИГАВО,Super slemmig!,Süper yapışkan!, -Training,SSKILL_BABY,,,,Trénink,Træning,,Eκπαίδευση,Trejnado,Práctica,,Koulutus,Entrâinement,Kiképzés,Allenamento,トレーニング,훈련병,Opleiding,Trening,Trening,Treinamento,Treino,În Pregătiri,Разминка,Тренинг,Träning,Eğitim, -Rookie,SSKILL_EASY,,,,Zelenáč,Nybegynder,Anfänger,Αρχάριος,Komencanto,Novato,,Aloittelija,Recrue,Újonc,Matricola,ルーキー,신병,,Nybegynner,Rekrut,Novato,,Începător,Новичок,Новајлија,Nybörjare,Çaylak, -Veteran,SSKILL_NORMAL,,,,Veterán,,,,Veterano,Veterano,,Veteraani,Véteran,Veterán,Veterano,ベテラン,고참병,Veteraan,,Weteran,Veterano,,,Ветеран,Ветеран,,Gazi, -Elite,SSKILL_HARD,,,,Elita,,,,Elito,Élite,,Eliitti,,Elit,,エリート,정예병,,,Elita,,,Elită,Элита,Елитни,,Elit, -Bloodbath,SSKILL_NIGHTMARE,,,,Krveřežba,Blodbad,Blutbad,,Sangoverŝado,Baño de sangre,,Verilöyly,Massacre!,Vérfürdő,Bagno di sangue,ブラッドバス,피의 목욕,Bloedbad,Blodbad,Rozlew krwi,Banho de sangue,,Baie de sânge,Кровавая бойня,Купка крви,Blodbad,Kan banyosu, -Thou needeth a Wet-Nurse,MNU_WETNURSE,,,,Potřěbuješ krmlici?,Du har brug for en våd sygeplejerske,Wo ist die Krankenschwester?,,Vi nutristinon bezonas,Necesitaréis una nodriza,,Tarvitseos imettäjää,Une Nourrice Vous Voulez,Süldőgyermek,Necessiti di un'infermiera per neonati,汝は乳母を欲する,그대에게는 유모가 필요하다,Waar is de verpleegster?,Du trenger en amme,Wciąż w pieluszkach,Tu precisas de uma Ama-de-Leite,Tu precisas de uma Ama-Seca,Doica are Nevoie de Mine,Нянечка надобна мне,Треба ти бабица,Du behöver en våtsjuksköterska,Islak bir hemşireye ihtiyacın var., -Yellowbellies-R-Us,MNU_YELLOWBELLIES,,,,"Nemehla, tož jsme my",,Vereinigte Waschlappen,,Malkuraĝuloj-as-ni,Somos pusilánimes,,Mameronapero,Un Trouillard-Tu-Est,Ne bántsék kend!,Codardo-tu-sei,我等こそが臆病者,장난감을 가지고 노는가,Verenigd washandje,Yellowbellies-R-Us,"Nie książę, lecz tchórz",Tu és um Amarelão,Tu és um Cobardolas,Nu Sunt Așa de Curajos,Не столь мужественен я,Ми-смо-жутица,Förenade ynkryggar,Birleşik Korkak Kediler, -Bringest Them Oneth,MNU_BRINGEST,,,,Chtějúci se práti?,Kom med dem,Her damit,,Al mi ilin kunvenigu,Traédnoslos,,Antaos tullaos,Amenez les moi!,Ide velük hinnye,Portali a me,招かれし者共,혈투를 벌일 준비하라,Geef me dat.,Kom med dem,Dawajże Ich,Podeis Virdes,Podeis Virdes,Aduceți-mi,Подайте мне их,Донеси изабраног,Ta med dem in,Onları Getir, -Thou art a Smite-Meister,MNU_SMITE,,,,Ktož jsú boží bojovníci,Du er mesterdræberen,Du bist der Meistertöter,,Vi Venkobatanto estas,Sois un regicida,,Olet lyömäherra,Tu est Maître-Meurtrier,Csapjunk bele kend!,Sei un maestro assassino,汝は芸術的殺戮者,그대야말로 타격의 대가,Jij bent de meestermoordenaar.,Du er mesterdraperen,Mistrz w swoim fachu,Tu és Mestre-de-Massacres,,Lupta mă Ispitește,Искушён я сражениями,Ти си обузети-мајстор,Du är en Mästerdödare,Sen baş sihirbazsın, -Black Plague Possesses Thee,MNU_BLACKPLAGUE,,,,Jsúci Smrtonošem morovým!,Den sorte pest besætter dig,Von der Pest besessen,,Nigra morto vin posedas,La peste negra os posee,,Musta surma on saanut sun,La Peste Noire me Possède!,Ehun gyün a pestis,La peste nera ti possiede,汝に憑した黒死病,흑사병이 그대를 저주 내리리,Geobsedeerd door de pest,Den svarte pesten besetter deg,Sługa Czarnej Plagi,A Peste Negra te Possui,A Peste Negra Possui-te,Ciuma Neagră mă Posedă,Чума овладела мной,Имаш црну кугу,Svarta pesten besitter dig,Kara Veba Seni Ele Geçirdi, -Squire,MNU_SQUIRE,,,,Panoš,Laird,Gutsherr,,Varleto,Escudero,,Aseenkantaja,Ecuyer,Apród,Scudiero,見習い騎士,향사,,Væpner,Giermek,Escudeiro,,Scutier,Оруженосец,Штитоноша,,Beyefendi, -Knight,MNU_KNIGHT,,,,Rytíř,Ridder,Ritter,Ιππότης,Kavaliro,Caballero,,Ritari,Chevalier,Lovag,Cavaliere,騎士,기사,Ridder,Ridder,Rycerz,Cavaleiro,,Cavaler,Рыцарь,Витез,Riddaren,Şövalye, -Warrior,MNU_WARRIOR,,,,Válečník,Kriger,Krieger,Πολεμιστής,Militisto,Guerrero,,Soturi,Guerrier,Katona,Guerriero,戦士,전사,Krijger,Kriger,Wojownik,Guerreiro,,Războinic,Воитель,Борац,Krigare,Savaşçı, -Berserker,MNU_BERSERKER,,,,Berserkr,,,,Frenezisto,,,Berserkkeri,,Harcos,,狂戦士,광전사,,,Szaleniec,,,Turbat,Берсерк,Делија,,, -Titan,MNU_TITAN,,,,Titán,,,Τιτάνας,Titano,Titán,,Titaani,,Titán,Titano,タイタン,철인,,,Tytan,Titã,,,Титан,Титан,,, -Altar Boy,MNU_ALTARBOY,,,,Ministrant,Alterdreng,Novize,,Messervanto,Monaguillo,,Pyhäkköpoika,Enfant de Chœur,Ministráns,Chirichetto,堂役,복사,Altaarjongen,Altergutt,Ministrant,Menino de coral,Menino do coro,Paracliser,Алтарник,Министрант,Altarpojke,Sunak Çocuğu, -Acolyte,MNU_ACOLYTE,,,,Akolyta,Akolyt,Missionar,,Akolito,Acólito,,Akoluutti,,Oltárszolga,Accolito,侍祭,시종,Acoliet,Akolytt,Akolita,Coroinha,Acólito,Acolit,Служитель,Помоћник,Akolyt,Yardımcı, -Priest,MNU_PRIEST,,,,Kněz,Præst,Priester,,Pastro,Sacerdote,,Pappi,Prêtre,Pap,Prete,司祭,사제,Priester,Prest,Kapłan,Padre,,Preot,Священник,Свештеник,Präst,Rahip, -Cardinal,MNU_CARDINAL,,,,Kardinál,Kardinal,Kardinal,,Kardinalo,Cardenal,,Kardinaali,,Bíboros,Cardinale,枢機卿,추기경,Kardinaal,Kardinal,Kardynał,Cardeal,,Cardinal,Кардинал,Кардинал,Kardinal,Kardinal, -Pope,MNU_POPE,,,,Papež,Pave,Papst,Πάπας,Papo,Papa,,Paavi,Pape,Pápa,Papa,教皇,교황,Paus,Pave,Papież,Papa,,Papă,Епископ,Папа,Påve,Papa, -Apprentice,MNU_APPRENTICE,,,,Učeň,Lærling,Lehrling,,Lernanto,Aprendiz,,Kisälli,Apprenti,Tanonc,Apprendista,入門者,조수,Leerling,Lærling,Uczeń,Aprendiz,,Ucenic,Ученик,Шегрт,Lärling,Çırak, -Enchanter,MNU_ENCHANTER,,,,Kouzelník,Fortryller,Zauberer,,Ravisto,Encantador,,Lumooja,Enchanteur,Bűvölő,Incantatore,妖術士,주술사,Betoveraar,Trollmann,Zaklinacz,Encantador,,Fermecător,Чародей,Чаробњак,Magiker,Sihirbaz, -Sorcerer,MNU_SORCERER,,,,Čaroděj,Troldmand,Hexer,,Sorĉisto,Hechicero,,Taikuri,Sorcier,Varázsló,Mago,魔術士,마법사,Tovenaar,Magiker,Mag,Feiticeiro,,Mag,Колдун,Врачар,Trollkarl,Büyücü, -Warlock,MNU_WARLOCK,,,,Zaklínač,,Hexenmeister,,Magiisto,Brujo,,Noita,Mage de Guerre,Boszorkánymester,Stregone,黒魔術士,전투술사,Tovenaar,Veiviser,Wiedźmak,Mago,,Vrăjitor,Чернокнижник,Вештац,Häxkarl,Efsuncu, -Archmage,MNU_ARCHMAGE,,,,Arcimág,Ærkemagiker,Erzmagier,,Magiantestro,Archimago,,Arkkivelho,Archimage,Főmágus,Arcimago,大魔導師,대마법사,Aartsbisschop,Erkemagiker,Arcymag,Arquimago,,Prim-Vrăjitor,Архимаг,Врховни вештац,Ärkemagiker,Başbüyücü, -Choose Class:,MNU_CHOOSECLASS,,,,Vyber třídu:,Vælg klasse:,Figurengruppe wählen:,,Elektu klason:,Elige tu clase:,,Valitse luokka:,Choissisez une Classe:,Válassz kasztot:,Scegli la classe:,クラス選抜:,영웅 선택:,Kies klasse:,Velg klasse:,Wybierz klasę:,Escolha a classe:,,Alege Clasa:,Класс:,Класа:,Välj klass:,Sınıf seç:, -Fighter,MNU_FIGHTER,,,,Bojovník,Kriger,Krieger,,Batalanto,Luchador,,Taistelija,Guerrier,Harcos,Combattente,戦士,전사,Vechter,Kriger,Wojownik,Lutador,,Luptător,Воин,Борац,Kämpe,Dövüşçü, -Cleric,MNU_CLERIC,,,,Klerik,Kleriker,Geistlicher,,Kleriko,Clérigo,,Pappi,Moine,Lelkész,Chierico,僧侶,성직자,Geestelijk,Kleriker,Kleryk,Clérigo,,,Клерик,Свештеник,Kleriker,Ruhban, -Mage,MNU_MAGE,,,,Mág,,Magier,,Magianto,Mago,,Velho,,Mágus,Mago,魔導士,마법사,Tovenaar,Magiker,Mag,Mago,,Magician,Маг,Чаробњак,Magiker,Sihirbaz, -Random,MNU_RANDOM,,,,Náhodný,Tilfældig,Zufällig,,Hazarda,Al azar,,Satunnainen,Au Hasard,Véletlenszerű,Casuale,ランダム,랜덤,Willekeurig,Tilfeldig,Losowa,Aleatório,,Aleatoriu,Наугад,Насумично,Slumpmässig,Rastgele, -Which Episode?,MNU_EPISODE,,,,Jakou epizodu?,Hvilken episode?,Welche Episode?,,Kiu epizodo?,¿Qué episodio?,,Mikä episodi?,Quel épisode?,Melyik epizód?,Quale episodio?,どのエピソードだ?,에피소드 선택:,Welke aflevering?,Hvilken episode?,Który Epizod?,Qual episódio?,,Care Episod?,Какой эпизод?,Која епизода?,Vilken episod?,Hangi Bölüm?, -Choose Campaign,MNU_EPISODE,,strife,,Vyber kampaň,Vælg kampagne,Mission auswählen,,Elektu kampanjon,Selecciona una campaña,,Valitse kampanja,Choisissez la Campagne,Válassz hadjáratot,Scegli la campagna,キャンペーンを選べ,캠페인을 고르시오:,Kies campagne,Velg kampanje,Wybierz kampanię,Escolha a campanha,,Alege Campania,Выбор кампании,Изабери кампању,Välj kampanj,Kampanyayı Seçin, -City of the Damned,MNU_COTD,,,,Město zatracených,Byen af de forbandede,Stadt der Verdammten,,Urbo de la damnitaj,Ciudad de los condenados,,Kirottuin kaupunki,La Cité des Damnés,Az átkozottak városa,Città del dannato,呪われた都,멸망한 도시,Stad van de verdoemden,De fordømtes by,Miasto Przeklętych,Cidade dos Condenados,,Orașul Blestemaților,Город проклятых,Град проклетих,De fördömdas stad,Lanetliler Şehri, -Hell's Maw,MNU_HELLSMAW,,,,Chřtán pekel,Helvedes gab,Der Schlund zur Hölle,,Faŭko de Infero,Fauces del infierno,,Hornankita,La Geule des Enfers,A Pokol bugyrai,Lo Stomaco dell'Inferno,地獄の肚,지옥의 목구멍,De slokdarm naar de hel,Helvetes gap,Paszcza Piekieł,A Boca do Inferno,,Străfundurile Infernului,Адское жерло,Чељусти пакла,Helvetets gap,Cehennem Ağzı, -The Dome of D'Sparil,MNU_DOME,,,,Báň D'Sparilova,D'Sparils kuppel,D'Sparils Dom,,La Kupolo de D'Sparil,La Cúpula de D'Sparil,El Domo de D'Sparil,D'Sparilin kupoli,Le Dôme de D'Sparil,D'Sparil kupolája,La Casa del D'Sparil,デ'スパリルの穹窿,드'스파릴의 돔,D'Sparils Kathedraal,D'Sparils kuppel,Gmach D'Sparila,A Cúpula de D'Sparil,,Domul lui D'Sparil,Купол Д'Спарила,Купола Д'Спарила,D'Sparils kupol,D'Sparil'in Kubbesi, -The Ossuary,MNU_OSSUARY,,,,Kostnice,Benhuset,Das Beinhaus,,La Ostejo,El Osario,,Luuhuone,L'Ossuaire,Csontkamra,L'Ossario,納骨堂,납골당,Het Ossuarium,Beinhuset,Kostnica,O Ossuário,O Ossário,Osuarul,Склеп,Костурница,Benhuset,Mezar Odası, -The Stagnant Demesne,MNU_DEMESNE,,,,Zatuchlé panství,Den stagnerede demesne,Das stagnierende Reich,,La Senmova Posedaĵo,La Heredad Estancada,,Seisahtunut maa,Le domaine Stagnant,A pangó birtok,La Proprietà terriera Stagnante,澱んだ荘園,침체된 영지,Het stagnerende rijk,Den stillestående herregården,Opuszczone Włości,O Reino Estagnado,,Tărâmul Stagnării,Застойная Демесна,Стагнирајући домени,Den stillastående demesnen,Durgun Diyar, -,,Gameplay menus,,,,,,,,,,,,,,,,,,,,,,,,,, -Teamplay,GMPLYMNU_TEAMPLAY,,,,Týmová hra,,Teamspiel,,Teamludado,Juego por equipos,,Joukkuepeli,Jeu en équipe,Csapatjáték,Gioco di squadra,チーム制,팀플레이,,Lagspill,Gra Drużynowa,Jogo em equipe,Jogo em Equipa,Joc în Echipă,Командная игра,Тимска игра,,Takım Oyunu, -Team damage scalar,GMPLYMNU_TEAMDAMAGE,,,,Faktor týmového poškození,Skala for holdskader,Team-Schadenfaktor,,Teamdamaĝo-skalio,Escalar de daño del equipo,,Omien tulen vahinkokerroin,Facteur de Tir Fratricide,Csapatsebzés mértéke,Fattore danno da fuoco amico,チームメンバーへのダメージ倍率,팀 데미지 배율,Teamschade scalair,Skalar for lagskade,Skalar Obrażeń Drużyny,Escala de fogo amigo,,Multiplicator daune,Множитель урона по своим,Мултипликатор пријатељске ватре,Skador i laget skalar,Takım hasar skalası, -Smart Autoaim,GMPLYMNU_SMARTAUTOAIM,,,,Chytré automatické zaměřování,Intelligent Autoaim,Intelligente Zielautomatik,,Inteligenta Celasisto,Autoapuntado inteligente,,Älykäs automaattitähtäys,Autovisée intelligente,Okos automata célzás,Mira automatica intelligente,スマートオートエイム,정확한 자동 조준,Slimme Autoaim,Smart Autoaim,Mądre Autocelowanie,Mira automática inteligente,,Asistare inteligentă la țintire,Умное автоприцеливание,Паметни нишан,Smart Autoaim,Akıllı Autoaim, -Falling damage,GMPLYMNU_FALLINGDAMAGE,,,,Zranění pádem,Faldskader,Fallschaden,,Faldamaĝo,Daño por caída,,Putoamisvahinko,Dommages de chute,Eséskor sebzés,Danno da caduta,落下ダメージ,낙하 데미지,Vallende schade,Fallende skade,Obrażenia przy upadku,Dano de queda,,Daune la căderi libere,Урон от падения,Штета од пада,Fallande skador,Düşme hasarı, -Drop weapon,GMPLYMNU_DROPWEAPON,,,,Odhazování zbraní,Taber våben,Waffen fallen lassen,,Faligi armilon,Arrojar arma,,Aseen pudottaminen,Arme lâchée à la mort,Fegyver eldobása,"Arma lasciata cadere +Invincible Mode ON,STSTR_DQDON,,chex,,Režim nezranitelnosti ZAP,Uovervindelig tilstand TIL,Unbesiegbarer Modus EIN,,Nevenkebla-reĝimo ŜALTITA,Modo invencible ACTIVADO,,Kuolemattomuustila PÄÄLLÄ,Mode invincible ON,,Sérthetetlen mód BE,Modalità invincibile attivata,むてきモード オン,무적 모드 켬,Onoverwinnelijke modus AAN,Uovervinnelig modus PÅ,Tryb Niewrażliwości WŁĄCZONY,Modo invencível ATIVADO,,Modul Invincibil ACTIVAT,Режим неуязвимости ВКЛЮЧЁН,Неуништив УКЉУЧЕН,Oövervinnerligt läge på,Yenilmez Mod AÇIK,Невразливість увімкнено +Invincible Mode OFF,STSTR_DQDOFF,,chex,,Režim nezranitelnosti VYP,Uovervindelig tilstand FRA,Unbesiegbarer Modus AUS,,Nevenkebla-reĝimo MALŜALTITA,Modo invencible DESACTIVADO,,Kuolemattomuustila POIS PÄÄLLÄ,Mode invincible OFF,,Sérthetetlen mód KI,Modalità invincibile disattivata,むてきモード オフ,무적 모드 끔,Onoverwinnelijke modus UIT,Uovervinnelig modus AV,Tryb Niewrażliwości WYŁĄCZONY,Modo invencível DESATIVADO,,Modul Invincibil DEZACTIVAT,Режим неуязвимости ОТКЛЮЧЁН,Неуништив ИСКЉУЧЕН,Oövervinnerligt läge av,Yenilmez Modu KAPALI,Невразливість вимкнено +Zorch Added,STSTR_FAADDED,,chex,,Bzukry přidány,Zorch tilføjet,Zorch hinzugefügt,,Zorĉo Aldonita,Zorch añadido,,Zorch lisätty,Zorch Ajouté,,Szörcs felvéve,Zorch aggiunto,ゾーチ ついか,모든 저치 에너지 추가,Zorch toegevoegd,Zorch lagt til,Zorch dodany,Zorch adicionado,,Zorcher Adăugat,Получен зорч,Зорч додат,Zorch har lagts till,Zorch Eklendi,Додано Зорч +Super Zorch Added,STSTR_KFAADDED,,chex,,Superbzukry přidány,Super Zorch Tilføjet,Super Zorch hinzugefügt,,Supera Zorĉo Aldonita,Súper Zorch añadido,,Superzorch lisätty,Super Zorch Ajouté,,Szuper Szörcs feléve,Super Zorch aggiunto,スーパーゾーチ ついか,모든 아이템 습득!,Super Zorch toegevoegd,Super Zorch lagt til,Super Zorch dodany,Super Zorch adicionado,,Super Lingură Adăugată,Получен суперзорч,Супер зорч додат,Super Zorch läggs till,Süper Zorch Eklendi,Додано Супер Зорч +... Eat Chex(R)!,STSTR_CHOPPERS,,chex,,... Jez Chex(R)!,... Spis Chex(R)!,...Iss Chex(R)!,,... Manĝu Chex(R)-on!,... Come Chex(R),,... Syö Chex(R):ä!,... Mangez du Chex(R)!,,...egyél Chex(R)-et!,... Mangia I Chex(R)!,...Chex(R)をたべよう!,... 첵스(R) 를 많이 먹자!,... Eet Chex(R)!,... Spis Chex(R)!,... jedz płatki Chex(R)!,... coma Chex(R)!,,... Mănâncă Chex(R)!,...ешь Chex(R)!,... Једи Chex(R)!,... Ät Chex(R)!,... Chex(R) yiyin!,... Їж Chex(R)! +Mini Zorch Charge,AMMO_CLIP,,chex,,Minibzukrové náboje,Mini Zorch ladning,Minizorcher-Ladung,,Zorĉileto-Ŝarĝo,Carga de Mini Zorch,,Minizorchvaraus,Charge Zorch,,Mini szörcs töltet,Ricarica Mini Zorch,ミニゾーチ ほきゅう,소형 저치 전지,Mini Zorchlading,Mini Zorch ladning,Mini Ładunek Zorch,Recarga de Mini Zorch,,Mini Încărcătură pentru Zorcher,Заряд мини-зорчера,Мини зорч пуњач,,Mini Zorch Şarjı,Заряд міні-Зорчера +Large Zorcher Charge,AMMO_SHELLS,,chex,,Velkobzukrové náboje,Stor Zorch ladning,Zorcher-Ladung,,Ŝarĝo por Granda Zorĉilo,Carga de Zorcher Grande,,Ison zorcherin varaus,Charge de Zorcheur Large,,Nagy szörcs töltet,Ricarica Grande Zorch,ラージゾーチャー ほきゅう,대형 저치 카트리지,Grote Zorchlading,Stor Zorch ladning,Ładunek do Dużego Zorchera,Recarga de Zorch Grande,,Încărcătură Mare pentru Zorcher,Заряд большого зорчера,Велики зорч пуњач,Stor Zorch-laddning,Büyük Zorcher Şarjı,Заряд Великого Зорчера +Propulsor Charge,AMMO_ROCKETS,,chex,,Propulzorové náboje,Propulsor ladning,Propeller-Ladung,,Zorĉpropulsilo-ŝarĝo,Carga de Propulsor de Zorch ,,Työntimen varaus,Charge de Propulseur,,Hajtómű töltet,Ricarica Propulsore,プロパルサー ほきゅう,저치 추진료,Propulsorlading,Propulsor ladning,Ładunek do Pędnika,Recarga de Propulsor de Zorch,,Încărcătură pentru Accelerator,Заряд ускорителя,Погонски зорч пуњач,Propulsor-laddning,İtici Şarjı,Заряд Прискорювача +Phasing Zorcher Charge,AMMO_CELLS,,chex,,Fázovací náboje,Phasing-Zorcher ladning,Phasenzorcher-Ladung,,Fluktuantzorĉilo-ŝarĝo,Carga de Zorcher de Fase,,Vaiheiszorcherin varaus,Charge de Phaseur,,Fázisszörcsölő töltet,Ricarica Zorcher di Fase,フェイシング ゾーチャー ほきゅう,저치 전자 충전기,Fasezorcherlading,Phasing-Zorcher ladning,Ładunek do Fazowego Zorchera,Recarga de Zorcher Fásico,,Încărcătură pentru Zorcherul Fazat,Заряд фазерного зорчера,Фазни зорч пуњач,Zorcher-laddning för fasning,Zorcher Yükünün Aşamalandırılması,Заряд фазового Зорчера +,,Menus,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Main Menus,,,,,,,,,,,,,,,,,,,,,,,,,,, +New Game,MNU_NEWGAME,,,,Nová hra,Nyt spil,Neues Spiel,Νέο Παιχνίδι,Nova ludado,Nueva partida,,Uusi peli,Nouvelle Partie,Nova igra,Új játék,Nuova partita,新規ゲーム,새로운 게임,Nieuw spel,Nytt spill,Nowa Gra,Novo jogo,,Joc Nou,Новая игра,Нова игра,Nytt spel,Yeni Oyun,Нова гра +Options,MNU_OPTIONS,,,,Možnosti,Indstillinger,Optionen,Ρυθμίσεις,Agordoj,Opciones,,Asetukset,Options,Postavke,Beállítások,Opzioni,オプション,설정,Opties,Alternativer,Opcje,Opções,,Opțiuni,Настройки,Подешавања,Alternativ,Seçenekler,Налаштування +Game Files,MNU_GAMEFILES,,,,Uložené hry,Spilfiler,Spieldateien,Αρχεία Παιχνιδιού,Ludo-dosieroj,Archivos del juego,,Pelitiedostot,Fichiers de jeu,Datoteke igre,Játékfájlok,File di gioco,ゲームファイル,게임 파일,Spelbestanden,Spillfiler,Pliki Gry,Jogos salvos,Jogos Gravados,Fișiere Joc,Файлы игры,Фајлови игре,Spelfiler,Oyun Dosyaları,Ігрові файли +Info,MNU_INFO,,,,Informace,,Informationen,Πληροφορίες,Informoj,Información,,Tiedot,,Informacije,Információ,Informazioni,情報,정보,,,,Informações,,,Информация,Подаци,,Bilgi,Інформація +Quit Game,MNU_QUITGAME,,,,Ukončit hru,Afslut spil,Spiel verlassen,Έξοδος,Forlasi ludon,Salir del juego,,Lopeta peli,Quitter le jeu,Izađi iz igre,Kilépés,Esci dal gioco,終了,게임 종료,Verlaat spel,Avslutt spill,Wyjdź z Gry,Sair,,Ieșire din Joc,Выход из игры,Заврши игру,Avsluta spelet,Oyundan Çık,Вихід +Choose Skill Level:,MNU_CHOOSESKILL,This text is extremely space limited!,,,Vyber obtížnost:,Vælg færdighedsniveau:,Schwierigkeitsgrad:,Επίλεξε ΔυσκολΊα:,Elektu malfacilecon:,Elige nivel de dificultad:,,Valitse vaikeustaso:,Difficulté:,Odaberi razinu vještine:,Nehézségi szint:,Livello di difficoltà:,実力を選べ:,난이도를 고르시오:,Vaardigheidsniveau:,Velg ferdighetsnivå:,Poziom Trudności:,Escolha o nível de dificuldade:,,Alege Dificultatea:,Уровень сложности:,Ниво тежине:,Välj färdighetsnivå:,Beceri Seviyesini Seçin:,Виберіть рівень важкості: +I'm too young to die.,SKILL_BABY,,,,Ještě nechci umřít.,Jeg er for ung til at dø.,Ich bin zu jung zum Sterben.,Είμαι πολύ νεαρός για να πεθάνω!,Mi tro junas por morti.,Soy muy joven para morir.,,Olen liian nuori kuolemaan.,Trop jeune pour mourir!,Premlad/a sam da umrem.,Kicsi vagyok még a halálhoz.,Troppo giovane per morire.,死ぬには若すぎる,난 죽기엔 너무 젊어.,Ik ben te jong om te sterven.,Jeg er for ung til å dø.,Jestem za młody by umierać.,Sou jovem demais para morrer.,Demasiado novo para morrer.,Sunt prea tânăr ca să mor.,Мне рано умирать.,Премлад сам да умрем.,Jag är för ung för att dö.,Ölmek için çok gencim.,"Я надто молодий, щоб померти." +"Hey, not too rough.",SKILL_EASY,,,,"Hej, ne tak tvrdě.","Hey, ikke for hårdt.","He, nicht so ruppig.",Όχι πολύ δύσκολο,"He, ne tro malafable.","Oye, no seas tan duro.",,"Hei, ei liian kovaa.","Hé, pas trop fort!","Hej, ne tako grubo.","Hé, ne túl erősen!","Ehi, non troppo duro!",あまり激しくするな,너무 세게 하지는 마.,"Hé, niet te ruw.","Hei, ikke for hardhendt.","Hej, nie tak mocno.","Opa, pega leve aí.","Ei, mais devagar.","Hei, nu foarte dur.","Эй, не слишком грубо.","Хеј, не претерано грубо.",Inte alltför grovt.,Çok sert değil.,"Ей, не так грубо." +Hurt me plenty.,SKILL_NORMAL,,,,Pojď do mě.,Gør mig rigeligt ondt.,Tu mir weh.,Πόνεσε με,Vundu min multe.,Dame con todo.,,Satuta minua kunnolla.,Fais-moi mal!,Puno me povrijedi.,Adjál bőven!,Fammi molto male.,手加減無用,마음껏 때려봐.,Doe me veel pijn.,Skader meg mye.,Dowal mi.,Vem com tudo.,Dá-me com força.,Rănește-mă din plin.,Сделай мне больно.,Повреди ме кол'ко можеш.,Gör mig mycket illa.,Beni çok incittin.,Завдай мені болю. +Ultra-Violence.,SKILL_HARD,,,,Ultrařežba.,Ultra-vold.,Volle Gewalt.,Ύπερ-Βία,Ekstrema perforto.,Ultraviolencia.,,Ultraväkivalta.,Ultra-Violence!,Ultra-nasilje,Ultraerőszak!,Ultra-violenza.,ウルトラ バイオレンス,극단적인-폭력.,Ultra Geweld.,Ultra-vold.,Ultra-Przemoc.,Ultraviolência.,,Ultra-Violență.,Ультранасилие.,Ултра-насилно.,Ultra-våld.,Ultra Şiddet.,Ультра-насилля. +Nightmare!,SKILL_NIGHTMARE,,,,Noční můra!,Mareridt!,Alptraum!,Εφιάλτης!,Inkubo!,¡Pesadilla!,,Painajainen!,Cauchemar!,Noćna mora!,Rémálom!,Incubo!,悪夢だ!,악몽!,Nachtmerrie!,Mareritt!,Koszmar!,Pesadelo!,,Coșmar!,Кошмар!,Ноћна мора!,Mardröm!,Kabus!,Кошмар! +Easy does it,CSKILL_BABY,,,,Hezky zlehka,Let gør det,Immer sachte,,Kvietiĝu,Así de fácil,,Hiljaa hyvä tulee,On y va Doucement,,Csak gyengéden.,Facile no?,やさしくして,살살 하면 좋겠네,Gemakkelijk doet het,Rolig nå,Łatwizna,Vamos com calma,,Merge ușor,Потихоньку-полегоньку,Лагано сад,Det är lätt att göra det.,Sakin ol.,Раз плюнути +Not so sticky,CSKILL_EASY,,,,Ne tak ulepeně,Ikke så klistret,Nicht so schmierig,,Ne tiel glueca,No tan pegajoso,,Ei niin tahmaista,Pas trop Collant,,Ne túl ragadósan!,"Non così appiccicoso +",ダラダラしない,질척하진 않게,Niet zo plakkerig.,Ikke så klissete,Nie tak lepko,Não tão gosmento,,Nu așa de lipicios,Не особо липко,Не тако лепљиво,Inte så klibbigt,Çok yapışkan değil,Не так липко +Gobs of goo,CSKILL_NORMAL,,,,Hafo hlenu,Masser af klister,Schleimklumpen,,Buloj de muko,Montón de moco,,Limaklönttejä,Des Tonnes de Gelée,,Egy csomó trutymó,Sputi di sostanza,"カッチカチスライム +",적지 않은 질퍽함,brokken slijm,Klumper av klister,Maziste Gęby,Um montão de meleca,Um montão de ranho,Multă mâzgă,Масса слизи,Лопте љиге,Massor av kladd,Çok fazla çamur,Кавалки слизу +Extreme Ooze,CSKILL_HARD,,,,Extra bláto,Ekstrem slim,Extrem glitschig,,Ekstrema pusado,Goteo extremo,,Äärimmäisen mönjäistä,Extrêmement Gluant,,Extrém nyúlós,Melma estrema,"かげきなウーズ +",엄청난 끈끈함,Uiterst glibberig,Ekstrem slim,Ekstremalny Muł,Gosma ao extremo,,Noroi Extrem,Экстремальная грязь,Екстремно љигаво,Extremt slemmigt,Aşırı Sızıntı,Екстрім-слиз +Super Slimey!,CSKILL_NIGHTMARE,,,,Superslizké!,Super slimet!,Super schleimig!,,Tre ŝlima!,¡Súper viscoso!,,Superlimaista!,Carrément Crade!,,Szupernyálkás!,Super Viscido!,ちょうベトベト!,끈쩍함 천지!,Super slijmerig!,Super slimete!,Super Oślizgły!,Super Gosmento!,,Super Mâzgos!,Сверхсклизский!,СУПЕР ЉИГАВО,Super slemmig!,Süper yapışkan!, +Training,SSKILL_BABY,,,,Trénink,Træning,,Eκπαίδευση,Trejnado,Práctica,,Koulutus,Entrâinement,,Kiképzés,Allenamento,トレーニング,훈련병,Opleiding,Trening,Trening,Treinamento,Treino,În Pregătiri,Разминка,Тренинг,Träning,Eğitim, +Rookie,SSKILL_EASY,,,,Zelenáč,Nybegynder,Anfänger,Αρχάριος,Komencanto,Novato,,Aloittelija,Recrue,,Újonc,Matricola,ルーキー,신병,,Nybegynner,Rekrut,Novato,,Începător,Новичок,Новајлија,Nybörjare,Çaylak, +Veteran,SSKILL_NORMAL,,,,Veterán,,,,Veterano,Veterano,,Veteraani,Véteran,,Veterán,Veterano,ベテラン,고참병,Veteraan,,Weteran,Veterano,,,Ветеран,Ветеран,,Gazi, +Elite,SSKILL_HARD,,,,Elita,,,,Elito,Élite,,Eliitti,,,Elit,,エリート,정예병,,,Elita,,,Elită,Элита,Елитни,,Elit, +Bloodbath,SSKILL_NIGHTMARE,,,,Krveřežba,Blodbad,Blutbad,,Sangoverŝado,Baño de sangre,,Verilöyly,Massacre!,,Vérfürdő,Bagno di sangue,ブラッドバス,피의 목욕,Bloedbad,Blodbad,Rozlew krwi,Banho de sangue,,Baie de sânge,Кровавая бойня,Купка крви,Blodbad,Kan banyosu, +Thou needeth a Wet-Nurse,MNU_WETNURSE,,,,Potřěbuješ krmlici?,Du har brug for en våd sygeplejerske,Wo ist die Krankenschwester?,,Vi nutristinon bezonas,Necesitaréis una nodriza,,Tarvitseos imettäjää,Une Nourrice Vous Voulez,,Süldőgyermek,Necessiti di un'infermiera per neonati,汝は乳母を欲する,그대에게는 유모가 필요하다,Waar is de verpleegster?,Du trenger en amme,Wciąż w pieluszkach,Tu precisas de uma Ama-de-Leite,Tu precisas de uma Ama-Seca,Doica are Nevoie de Mine,Нянечка надобна мне,Треба ти бабица,Du behöver en våtsjuksköterska,Islak bir hemşireye ihtiyacın var., +Yellowbellies-R-Us,MNU_YELLOWBELLIES,,,,"Nemehla, tož jsme my",,Vereinigte Waschlappen,,Malkuraĝuloj-as-ni,Somos pusilánimes,,Mameronapero,Un Trouillard-Tu-Est,,Ne bántsék kend!,Codardo-tu-sei,我等こそが臆病者,장난감을 가지고 노는가,Verenigd washandje,Yellowbellies-R-Us,"Nie książę, lecz tchórz",Tu és um Amarelão,Tu és um Cobardolas,Nu Sunt Așa de Curajos,Не столь мужественен я,Ми-смо-жутица,Förenade ynkryggar,Birleşik Korkak Kediler, +Bringest Them Oneth,MNU_BRINGEST,,,,Chtějúci se práti?,Kom med dem,Her damit,,Al mi ilin kunvenigu,Traédnoslos,,Antaos tullaos,Amenez les moi!,,Ide velük hinnye,Portali a me,招かれし者共,혈투를 벌일 준비하라,Geef me dat.,Kom med dem,Dawajże Ich,Podeis Virdes,Podeis Virdes,Aduceți-mi,Подайте мне их,Донеси изабраног,Ta med dem in,Onları Getir, +Thou art a Smite-Meister,MNU_SMITE,,,,Ktož jsú boží bojovníci,Du er mesterdræberen,Du bist der Meistertöter,,Vi Venkobatanto estas,Sois un regicida,,Olet lyömäherra,Tu est Maître-Meurtrier,,Csapjunk bele kend!,Sei un maestro assassino,汝は芸術的殺戮者,그대야말로 타격의 대가,Jij bent de meestermoordenaar.,Du er mesterdraperen,Mistrz w swoim fachu,Tu és Mestre-de-Massacres,,Lupta mă Ispitește,Искушён я сражениями,Ти си обузети-мајстор,Du är en Mästerdödare,Sen baş sihirbazsın, +Black Plague Possesses Thee,MNU_BLACKPLAGUE,,,,Jsúci Smrtonošem morovým!,Den sorte pest besætter dig,Von der Pest besessen,,Nigra morto vin posedas,La peste negra os posee,,Musta surma on saanut sun,La Peste Noire me Possède!,,Ehun gyün a pestis,La peste nera ti possiede,汝に憑した黒死病,흑사병이 그대를 저주 내리리,Geobsedeerd door de pest,Den svarte pesten besetter deg,Sługa Czarnej Plagi,A Peste Negra te Possui,A Peste Negra Possui-te,Ciuma Neagră mă Posedă,Чума овладела мной,Имаш црну кугу,Svarta pesten besitter dig,Kara Veba Seni Ele Geçirdi, +Squire,MNU_SQUIRE,,,,Panoš,Laird,Gutsherr,,Varleto,Escudero,,Aseenkantaja,Ecuyer,,Apród,Scudiero,見習い騎士,향사,,Væpner,Giermek,Escudeiro,,Scutier,Оруженосец,Штитоноша,,Beyefendi, +Knight,MNU_KNIGHT,,,,Rytíř,Ridder,Ritter,Ιππότης,Kavaliro,Caballero,,Ritari,Chevalier,,Lovag,Cavaliere,騎士,기사,Ridder,Ridder,Rycerz,Cavaleiro,,Cavaler,Рыцарь,Витез,Riddaren,Şövalye, +Warrior,MNU_WARRIOR,,,,Válečník,Kriger,Krieger,Πολεμιστής,Militisto,Guerrero,,Soturi,Guerrier,,Katona,Guerriero,戦士,전사,Krijger,Kriger,Wojownik,Guerreiro,,Războinic,Воитель,Борац,Krigare,Savaşçı, +Berserker,MNU_BERSERKER,,,,Berserkr,,,,Frenezisto,,,Berserkkeri,,,Harcos,,狂戦士,광전사,,,Szaleniec,,,Turbat,Берсерк,Делија,,, +Titan,MNU_TITAN,,,,Titán,,,Τιτάνας,Titano,Titán,,Titaani,,,Titán,Titano,タイタン,철인,,,Tytan,Titã,,,Титан,Титан,,, +Altar Boy,MNU_ALTARBOY,,,,Ministrant,Alterdreng,Novize,,Messervanto,Monaguillo,,Pyhäkköpoika,Enfant de Chœur,,Ministráns,Chirichetto,堂役,복사,Altaarjongen,Altergutt,Ministrant,Menino de coral,Menino do coro,Paracliser,Алтарник,Министрант,Altarpojke,Sunak Çocuğu, +Acolyte,MNU_ACOLYTE,,,,Akolyta,Akolyt,Missionar,,Akolito,Acólito,,Akoluutti,,,Oltárszolga,Accolito,侍祭,시종,Acoliet,Akolytt,Akolita,Coroinha,Acólito,Acolit,Служитель,Помоћник,Akolyt,Yardımcı, +Priest,MNU_PRIEST,,,,Kněz,Præst,Priester,,Pastro,Sacerdote,,Pappi,Prêtre,,Pap,Prete,司祭,사제,Priester,Prest,Kapłan,Padre,,Preot,Священник,Свештеник,Präst,Rahip, +Cardinal,MNU_CARDINAL,,,,Kardinál,Kardinal,Kardinal,,Kardinalo,Cardenal,,Kardinaali,,,Bíboros,Cardinale,枢機卿,추기경,Kardinaal,Kardinal,Kardynał,Cardeal,,Cardinal,Кардинал,Кардинал,Kardinal,Kardinal, +Pope,MNU_POPE,,,,Papež,Pave,Papst,Πάπας,Papo,Papa,,Paavi,Pape,,Pápa,Papa,教皇,교황,Paus,Pave,Papież,Papa,,Papă,Епископ,Папа,Påve,Papa, +Apprentice,MNU_APPRENTICE,,,,Učeň,Lærling,Lehrling,,Lernanto,Aprendiz,,Kisälli,Apprenti,,Tanonc,Apprendista,入門者,조수,Leerling,Lærling,Uczeń,Aprendiz,,Ucenic,Ученик,Шегрт,Lärling,Çırak, +Enchanter,MNU_ENCHANTER,,,,Kouzelník,Fortryller,Zauberer,,Ravisto,Encantador,,Lumooja,Enchanteur,,Bűvölő,Incantatore,妖術士,주술사,Betoveraar,Trollmann,Zaklinacz,Encantador,,Fermecător,Чародей,Чаробњак,Magiker,Sihirbaz, +Sorcerer,MNU_SORCERER,,,,Čaroděj,Troldmand,Hexer,,Sorĉisto,Hechicero,,Taikuri,Sorcier,,Varázsló,Mago,魔術士,마법사,Tovenaar,Magiker,Mag,Feiticeiro,,Mag,Колдун,Врачар,Trollkarl,Büyücü, +Warlock,MNU_WARLOCK,,,,Zaklínač,,Hexenmeister,,Magiisto,Brujo,,Noita,Mage de Guerre,,Boszorkánymester,Stregone,黒魔術士,전투술사,Tovenaar,Veiviser,Wiedźmak,Mago,,Vrăjitor,Чернокнижник,Вештац,Häxkarl,Efsuncu, +Archmage,MNU_ARCHMAGE,,,,Arcimág,Ærkemagiker,Erzmagier,,Magiantestro,Archimago,,Arkkivelho,Archimage,,Főmágus,Arcimago,大魔導師,대마법사,Aartsbisschop,Erkemagiker,Arcymag,Arquimago,,Prim-Vrăjitor,Архимаг,Врховни вештац,Ärkemagiker,Başbüyücü, +Choose Class:,MNU_CHOOSECLASS,,,,Vyber třídu:,Vælg klasse:,Figurengruppe wählen:,,Elektu klason:,Elige tu clase:,,Valitse luokka:,Choissisez une Classe:,,Válassz kasztot:,Scegli la classe:,クラス選抜:,영웅 선택:,Kies klasse:,Velg klasse:,Wybierz klasę:,Escolha a classe:,,Alege Clasa:,Класс:,Класа:,Välj klass:,Sınıf seç:, +Fighter,MNU_FIGHTER,,,,Bojovník,Kriger,Krieger,,Batalanto,Luchador,,Taistelija,Guerrier,,Harcos,Combattente,戦士,전사,Vechter,Kriger,Wojownik,Lutador,,Luptător,Воин,Борац,Kämpe,Dövüşçü, +Cleric,MNU_CLERIC,,,,Klerik,Kleriker,Geistlicher,,Kleriko,Clérigo,,Pappi,Moine,,Lelkész,Chierico,僧侶,성직자,Geestelijk,Kleriker,Kleryk,Clérigo,,,Клерик,Свештеник,Kleriker,Ruhban, +Mage,MNU_MAGE,,,,Mág,,Magier,,Magianto,Mago,,Velho,,,Mágus,Mago,魔導士,마법사,Tovenaar,Magiker,Mag,Mago,,Magician,Маг,Чаробњак,Magiker,Sihirbaz, +Random,MNU_RANDOM,,,,Náhodný,Tilfældig,Zufällig,,Hazarda,Al azar,,Satunnainen,Au Hasard,,Véletlenszerű,Casuale,ランダム,랜덤,Willekeurig,Tilfeldig,Losowa,Aleatório,,Aleatoriu,Наугад,Насумично,Slumpmässig,Rastgele, +Which Episode?,MNU_EPISODE,,,,Jakou epizodu?,Hvilken episode?,Welche Episode?,,Kiu epizodo?,¿Qué episodio?,,Mikä episodi?,Quel épisode?,,Melyik epizód?,Quale episodio?,どのエピソードだ?,에피소드 선택:,Welke aflevering?,Hvilken episode?,Który Epizod?,Qual episódio?,,Care Episod?,Какой эпизод?,Која епизода?,Vilken episod?,Hangi Bölüm?, +Choose Campaign,MNU_EPISODE,,strife,,Vyber kampaň,Vælg kampagne,Mission auswählen,,Elektu kampanjon,Selecciona una campaña,,Valitse kampanja,Choisissez la Campagne,,Válassz hadjáratot,Scegli la campagna,キャンペーンを選べ,캠페인을 고르시오:,Kies campagne,Velg kampanje,Wybierz kampanię,Escolha a campanha,,Alege Campania,Выбор кампании,Изабери кампању,Välj kampanj,Kampanyayı Seçin, +City of the Damned,MNU_COTD,,,,Město zatracených,Byen af de forbandede,Stadt der Verdammten,,Urbo de la damnitaj,Ciudad de los condenados,,Kirottuin kaupunki,La Cité des Damnés,,Az átkozottak városa,Città del dannato,呪われた都,멸망한 도시,Stad van de verdoemden,De fordømtes by,Miasto Przeklętych,Cidade dos Condenados,,Orașul Blestemaților,Город проклятых,Град проклетих,De fördömdas stad,Lanetliler Şehri, +Hell's Maw,MNU_HELLSMAW,,,,Chřtán pekel,Helvedes gab,Der Schlund zur Hölle,,Faŭko de Infero,Fauces del infierno,,Hornankita,La Geule des Enfers,,A Pokol bugyrai,Lo Stomaco dell'Inferno,地獄の肚,지옥의 목구멍,De slokdarm naar de hel,Helvetes gap,Paszcza Piekieł,A Boca do Inferno,,Străfundurile Infernului,Адское жерло,Чељусти пакла,Helvetets gap,Cehennem Ağzı, +The Dome of D'Sparil,MNU_DOME,,,,Báň D'Sparilova,D'Sparils kuppel,D'Sparils Dom,,La Kupolo de D'Sparil,La Cúpula de D'Sparil,El Domo de D'Sparil,D'Sparilin kupoli,Le Dôme de D'Sparil,,D'Sparil kupolája,La Casa del D'Sparil,デ'スパリルの穹窿,드'스파릴의 돔,D'Sparils Kathedraal,D'Sparils kuppel,Gmach D'Sparila,A Cúpula de D'Sparil,,Domul lui D'Sparil,Купол Д'Спарила,Купола Д'Спарила,D'Sparils kupol,D'Sparil'in Kubbesi, +The Ossuary,MNU_OSSUARY,,,,Kostnice,Benhuset,Das Beinhaus,,La Ostejo,El Osario,,Luuhuone,L'Ossuaire,,Csontkamra,L'Ossario,納骨堂,납골당,Het Ossuarium,Beinhuset,Kostnica,O Ossuário,O Ossário,Osuarul,Склеп,Костурница,Benhuset,Mezar Odası, +The Stagnant Demesne,MNU_DEMESNE,,,,Zatuchlé panství,Den stagnerede demesne,Das stagnierende Reich,,La Senmova Posedaĵo,La Heredad Estancada,,Seisahtunut maa,Le domaine Stagnant,,A pangó birtok,La Proprietà terriera Stagnante,澱んだ荘園,침체된 영지,Het stagnerende rijk,Den stillestående herregården,Opuszczone Włości,O Reino Estagnado,,Tărâmul Stagnării,Застойная Демесна,Стагнирајући домени,Den stillastående demesnen,Durgun Diyar, +,,Gameplay menus,,,,,,,,,,,,,,,,,,,,,,,,,,, +Teamplay,GMPLYMNU_TEAMPLAY,,,,Týmová hra,,Teamspiel,,Teamludado,Juego por equipos,,Joukkuepeli,Jeu en équipe,,Csapatjáték,Gioco di squadra,チーム制,팀플레이,,Lagspill,Gra Drużynowa,Jogo em equipe,Jogo em Equipa,Joc în Echipă,Командная игра,Тимска игра,,Takım Oyunu, +Team damage scalar,GMPLYMNU_TEAMDAMAGE,,,,Faktor týmového poškození,Skala for holdskader,Team-Schadenfaktor,,Teamdamaĝo-skalio,Escalar de daño del equipo,,Omien tulen vahinkokerroin,Facteur de Tir Fratricide,,Csapatsebzés mértéke,Fattore danno da fuoco amico,チームメンバーへのダメージ倍率,팀 데미지 배율,Teamschade scalair,Skalar for lagskade,Skalar Obrażeń Drużyny,Escala de fogo amigo,,Multiplicator daune,Множитель урона по своим,Мултипликатор пријатељске ватре,Skador i laget skalar,Takım hasar skalası, +Smart Autoaim,GMPLYMNU_SMARTAUTOAIM,,,,Chytré automatické zaměřování,Intelligent Autoaim,Intelligente Zielautomatik,,Inteligenta Celasisto,Autoapuntado inteligente,,Älykäs automaattitähtäys,Autovisée intelligente,,Okos automata célzás,Mira automatica intelligente,スマートオートエイム,정확한 자동 조준,Slimme Autoaim,Smart Autoaim,Mądre Autocelowanie,Mira automática inteligente,,Asistare inteligentă la țintire,Умное автоприцеливание,Паметни нишан,Smart Autoaim,Akıllı Autoaim, +Falling damage,GMPLYMNU_FALLINGDAMAGE,,,,Zranění pádem,Faldskader,Fallschaden,,Faldamaĝo,Daño por caída,,Putoamisvahinko,Dommages de chute,,Eséskor sebzés,Danno da caduta,落下ダメージ,낙하 데미지,Vallende schade,Fallende skade,Obrażenia przy upadku,Dano de queda,,Daune la căderi libere,Урон от падения,Штета од пада,Fallande skador,Düşme hasarı, +Drop weapon,GMPLYMNU_DROPWEAPON,,,,Odhazování zbraní,Taber våben,Waffen fallen lassen,,Faligi armilon,Arrojar arma,,Aseen pudottaminen,Arme lâchée à la mort,,Fegyver eldobása,"Arma lasciata cadere ",死亡時に武器を落とす,무기 버리기,Laat het wapen vallen,Slipp våpen,Wyrzuć broń,Largar arma,,Aruncare armă,Терять оружие,Баци оружје,Släpp vapen,Silahı bırak, -Double ammo,GMPLYMNU_DOUBLEAMMO,,,,Dvojnásobná munice,Dobbelt ammunition,Doppelte Munition,,Duobla municio,Doble munición,,Tupla-ammukset,Double munitions,Dupla muníció,Doppie munizioni,弾2倍,두 배의 탄약,Dubbele munitie,Dobbel ammunisjon,Podwojona amunicja,Munição em dobro,,Muniție dublă,Удвоенные патроны,Дупла муниција,Dubbel ammunition,Çift cephane, -Infinite ammo,GMPLYMNU_INFINITEAMMO,,,,Nekonečná munice,Uendelig ammunition,Unendlich Munition,,Senlima municio,Munición infinita,,Loppumattomat ammukset,Munitions infinies,Végtelen muníció,Infinite munizioni,弾無限,무한 탄약,Oneindige munitie,Uendelig ammunisjon,Nieskończona amunicja,Munição infinita,,Muniție infinită,Бесконечные патроны,Бесконачна муниција,Oändlig ammunition,Sonsuz cephane, -Infinite inventory,GMPLYMNU_INFINITEINVENTORY,,,,Nekonečný inventář,Uendelig lagerbeholdning,Unendliche Gegenstände,,Senlima inventaro,Inventario infinito,,Loppumattomat varusteet,Objets infinis,Végtelen felszerelés,Infinito inventario,所持品無限,무한 인벤토리,Oneindige voorraad,Uendelig lagerbeholdning,Nieskończony ekwipunek,Inventário infinito,,Inventar infinit,Бесконечный инвентарь,Бесконачно складиштење,Oändligt inventarium,Sonsuz envanter, -No monsters,GMPLYMNU_NOMONSTERS,,,,Bez příšer,Ingen monstre,Keine Monster,,Neniu monstro,Sin monstruos,,Ei hirviöitä,Pas de monstres,Szörnyek nélkül,Nessun mostro,モンスターを出現させない,적 제거,Geen monsters,Ingen monstre,Brak potworów,Sem monstros,,Fără monștri,Без монстров,Без чудовишта,Inga monster,Canavar yok, -No monsters to exit,GMPLYMNU_NOMONSTERSTOEXIT,,,,Ukončení levelu pouze bez příšer,Ingen monstre for at komme ud,Keine Monster um Level zu beenden,,Neniu monstro por eliri,Sin monstruos para salir,,Ei hirviöitä tason lopettamiseksi,Rien à tuer pour sortir,Megölendő szörnyek nélkül,Nessun mostro da uccidere per uscire,モンスター全滅までMAPから脱出不可,탈출을 위한 적 제거,Geen monsters om af te sluiten,Ingen monstre å avslutte,Brak potworów do wyjścia,Sem monstros para sair da fase,Sem monstros para sair do nível,Fără monștri pentru a ieși,Убить всех монстров для выхода,Без чудовишта до излаза,Inga monster för att ta sig ut,Çıkacak canavar yok, -Monsters respawn,GMPLYMNU_MONSTERSRESPAWN,,,,Příšery se respawnují,Monstre genopstår igen,Monster kehren zurück,,Monstroj reekaperas,Reaparecer enemigos,,Hirviöt heräävät henkiin,Monstres réapparaissent,Szörnyek újraszületnek,Respawn mostri,モンスターの自力復活,적 부활,Monsters respawn,Monstre respawn,Ponowne pojawianie się potworów,Ressurgimento de monstros,,Monștrii reapar,Монстры воскрешаются,Чудовишта се оживљавају,Monster återuppstår,Canavarlar yeniden doğar, -Monsters do not respawn,GMPLYMNU_NORESPAWN,,,,Příšery se nerespawnují,Monstre respawner ikke igen,Kein Zurückkehren,,Monstroj ne reekaperas,Sin reaparición,,Ei henkiinheräämistä,Pas de réapparition,Szörnyek nem születnek újra,Nessun respawn,プレイヤーの復活禁止,부활 없음,Geen respawn,Monstre respawn ikke,Brak ponownego pojawienia się,Sem ressurgimento de monstros,,Monștrii nu reapar,Монстры не воскрешаются,Без оживљавања,Monstren återuppstår inte,Canavarlar yeniden doğmaz, -Items respawn,GMPLYMNU_ITEMSRESPAWN,,,,Předměty se respawnují,Genstande respawnes,Gegenstände erscheinen wieder,,Objektoj reekaperas,Reaparecer objetos,,Esineet syntyvät takaisin,Objets réapparaissent,tárgyak újrateremnek,Respawn oggetti,アイテムを復活,아이템 재생성,Items respawn,Gjenstander respawn,Ponowne pojawianie się przedmiotów,Ressurgimento de itens,,Obiectele reapar,Восстановление предметов,Предмети се ресетују,Föremål återuppstår.,Eşyalar yeniden doğar, -Big powerups respawn,GMPLYMNU_SUPERRESPAWN,,,,Bonusy se respawnují,Store powerups respawnes,Große Boni erscheinen wieder,,Grandaj plifortigaĵoj reekaperas,Reaparecer poderes grandes,,Isot tehostimet syntyvät takaisin,Powerups réapparaissent,Nagy képességek újraszületnek,Respawn grandi potenziamenti,強力なパワーアップアイテムを復活,파워업 재생성,Grote power-ups respawn,Store powerups respawn,Ponowne pojawianie się dużych wzmocnień,Ressurgimento de potencializadores,,Super bonusurile reapar,Восстановление больших усилений,Велики предмети се ресетују,Stora powerups återuppstår.,Büyük güçlendiriciler yeniden doğar, -Fast monsters,GMPLYMNU_FASTMONSTERS,,,,Rychlé příšery,Hurtige monstre,Schnelle Monster,,Rapidaj monstroj,Monstruos rápidos,,Nopeat hirviöt,Monstres Rapides,Gyors szörnyek,Mostri veloci,モンスター高速化,빠른 적 개체 움직임,Snelle monsters,Raske monstre,Szybkie potwory,Monstros rápidos,,Monștri rapizi,Ускоренные монстры,Брза чудовишта,Snabba monster,Hızlı canavarlar, -Monsters Nightmare Reflexes,GMPLYMNU_INSTANTREACTION,,,,Okamžité reakce příšer (obtížnost Noční můra!),Monsterrefleksioner i 'Mareridt',Monsterreflexe in 'Alptraum!'.,,Refleksoj de monstroj en Inkubo-modo,Reflejos de los monsturos en Pesadilla,,Painajaisvaikeustason hirviöiden reaktioajat,,Rémálom szintű szörny reakciók,,敵が悪夢と同じ機敏さ,,,Monstre mareritt reflekser,Refleks Potworów z Trybu Koszmar,Reflexos dos Monstros em Pesadelo,,Monștri cu Reflexe de Coșmar,Кошмарные рефлексы монстров,,Monster mardrömsreflexer,Canavarlar Kabus Refleksleri, -Degeneration,GMPLYMNU_DEGENERATION,,,,Degenerace,,,,Degenero,Degeneración,,Rappeutuva terveys,Dégéneration,Degeneráció,Degrado della salute,プレイヤーの自動体力減少,약화,Degeneratie,Degenerasjon,Degeneracja,Degeneração,,Degenerare,Уменьшать дополнительное здоровье,Смањење додатног здравља,,Dejenerasyon, -Allow Autoaim,GMPLYMNU_NOAUTOAIM,,,,Povolit automatické míření,Tillad autoaim,Zielautomatik zulassen,,Permesi cel-asiston,Permitir autoapuntar,,Salli automaattitähtäys,Autoriser Auto-visée,Autocélzás engedélyezése,Mira automatica consentita,オートエイム有効化,자동 조준 허용,Autoaim toestaan,Tillat Autoaim,Pozwól na Autocelowanie,Permitir mira automática,,Permite asistența pentru țintire,Разрешить автоприцеливание,Дозволи аутоматско циљање,Tillåt autoaim,Autoaim'e İzin Ver, -Allow Suicide,GMPLYMNU_ALLOWSUICIDE,,,,Povolit sebevraždu,Tillad selvmord,Selbstmord zulassen,,Permesi memmortigon,Permitir suicidio,,Salli itsemurha,Autoriser Suicide,Öngyilkosság engedélyezése,Suicidio consentito,自殺コマンド有効化,자살 허용,Zelfmoord toestaan,Tillat selvmord,Pozwól na Samobójstwo,Permitir suicídio,,Permite sinuciderile,Разрешить самоубийство,Дозволи самоубиство,Tillåt självmord,İntihara İzin Ver, -Allow jump,GMPLYMNU_ALLOWJUMP,,,,Povolit skákání,Tillader spring,Springen zulassen,,Permesi salton,Permitir salto,,Salli hyppiminen,Autoriser Sauts,Ugrás engedélyezése,Salto consentito,ジャンプ有効化,점프 허용,Springen toestaan,Tillat hopp,Pozwól na skakanie,Permitir pulo,Permitir salto,Permite săriturile,Разрешить прыжки,Дозволи скок,Tillåt hopp,Atlamaya izin ver, -Allow crouch,GMPLYMNU_ALLOWCROUCH,,,,Povolit klečení,Tillader krybeøvelser,Ducken zulassen,,Permesi kaŭron,Permitir agacharse,,Salli kyyristyminen,Autoriser Acroupissement,Guggolás engedélyezése,Abbassamento consentito,しゃがみ有効化,앉기 허용,Hurken toestaan,Tillat huk,Pozwól na kucanie,Permitir agachamento,,Permite ghemuirile,Разрешить приседание,Дозволи чучање,Tillåt huk,Çömelmeye izin ver, -Allow freelook,GMPLYMNU_ALLOWFREELOOK,,,,Povolit koukání nahoru/dolů,Tillader freelook,Freien Blick zulassen,,Permesi liberrigardon,Permitir visión libre,,Salli vapaa katselu,Autoriser Vue Libre,Szabad egérmozgás engedélyezése,Sguardo libero consentito,フリールック有効化,프리룩 허용,Freelook toestaan,Tillat freelook,Pozwól na swobodne rozglądanie się,Permitir visão livre,,Permite privirea în jur cu mouse-ul,Обзор мышью,Дозволи слободан поглед,Tillåt freelook,Freelook'a izin ver, -Allow FOV,GMPLYMNU_ALLOWFOV,,,,Povolit změnu FOV,Tillad FOV,Blickwinkeländerung zulassen,,Permesi vidkampon,Permitir FOV,,Salli näkökentän muokkaaminen,Autoriser Angles de vue,Látószög állítás engedélyezése,Campo visivo consentito,FOVの調整を有効化,FOV 허용,Laat FOV,Tillat FOV,Pozwól na Pole Widzenia,Permitir campo de visão,,Permite ajustarea câmpului vizual,Разрешить изменение поля зрения,Дозволи FOV,Tillåt FOV,FOV'a İzin Ver, -Allow BFG aiming,GMPLYMNU_BFGFREEAIM,,,,Povolit míření s BFG,Tillad BFG-målsætning,Zielen mit BFG zulassen,,Permesi ekceladon de BFG,Permitir apuntado de BFG,,Salli BFG-tähtäys,Autoriser Visée au BFG,BFG célzás engedélyezése,Mira BFG consentita,BFG使用時のフリールックを有効化,BFG 조준 허용,Laat BFG toe om te streven naar,Tillat BFG-sikting,Pozwól na celowanie BFG,Permitir mira de BFG,,Permite țintirea cu BFG,Разрешить прицеливание с BFG,Дозволи BFG нишање,Tillåt BFG-målning,BFG hedeflemesine izin ver, -Allow automap,GMPLYMNU_ALLOWAUTOMAP,,,,Povolit automapu,Tillader automap,Automap zulassen,,Permesi aŭtomatan mapon,Permitir automapa,,Salli automaattikartta,Autoriser Carte,Autotérkép engedélyezése,Automap consentito,オートマップ有効化,오토맵 허용,Automap toestaan,Tillat automap,Pozwól na mapę,Permitir automapa,,Permite utilizarea hărții computerizate,Разрешить использование автокарты,Дозволи мапу,Tillåt automap,Otomatik eşlemeye izin ver, -Automap allies,GMPLYMNU_AUTOMAPALLIES,,,,Zobrazit na automapě spojence,Automatisk indtegning af allierede,Verbündete zulassen,,Aliancanoj en aŭtomata mapo,Aliados en el automapa,,Omat automaattikartalla,Alliés sur la carte,Társak mutatása a térképen,Alleati nell'automap,オートマップに味方を表示,오토맵에 아군 표시,Automap bondgenoten,Automatisk kartlegging av allierte,Sojusznicy na mapie,Permitir aliados no automapa,,Aliați pe harta computerizată,Отображение союзников на автокарте,Савезници на аутомапи,Automatiska allierade,Automap müttefikleri, -Allow spying,GMPLYMNU_ALLOWSPYING,,,,Povolit špehování,Tillader spionage,Spionieren zulassen,,Permesi spionadon,Permitir espiar,,Salli vakoileminen,Autoriser espionnage,Kémkedés engedélyezése,Spionaggio consentita,死亡時の他プレイヤー観戦を許可,관전 허용,Laat spionage toe,Tillat spionering,Pozwól na śledzenie,Permitir visualização de outros jogadores,,Permite vederea prin ochii altor jucători,Разрешить вид от других игроков,Дозволи поглед од другог играча,Tillåter spionage,Casusluğa izin ver, -Chasecam cheat,GMPLYMNU_CHASECAM,,,,Povolit kameru z třetí osoby (cheat),Chasecam snyder,Verfolgerkamera Cheat,,Trompo por ĉaskamerao,Truco de vista 3era persona,,Seurantakamerahuijaus,Cheat caméra 3ième personne,Követésőkamera csalás,Cheat camera di inseguimento,チェイスカメラチート有効化,3인칭 카메라 치트,Chasecam cheat,Chasecam juks,Oszustwo kamery śledzenia,Trapaça de câmera em terceira pessoa,Batota de câmera em terceira pessoa,Trișare pentru vedere la persoana a 3-a,Разрешить вид от 3-го лица,Дозволи чејс-кем,Fusk med Chasecam,Chasecam hilesi, -Check ammo for weapon switch,GMPLYMNU_DONTCHECKAMMO,,,,Přepnout na zbraň pouze s municí,Kontroller ammunition for våbenskift,Munition beim Waffenwechsel prüfen,,Kontroli municion por armŝanĝi,Revisar munición para cambiar armas,,Tarkista ammustilanne aseenvaihdon yhteydessä,Vérifier muni. pour changer arme,Váltáskor üres fegyver átugrása,Controlla le munizioni per il cambio arma,武器切替時に弾の有無を確認,탄약 소진 시 무기 변경,Controleer munitie op wapenschakelaars.,Sjekk ammunisjon for våpenbryter,Sprawdź amunicję przy sprawdzaniu broni,Conferir munição para troca de arma,,Verifică muniția armei pentru schimbare,Проверять патроны при переключении оружия,Проверити муницију за прекидач за оружје,Kontrollera ammunition för vapenbyte,Silah anahtarı için cephaneyi kontrol edin, -Icon's death kills its spawns,GMPLYMNU_KILLBOSSSPAWNS,,,,Smrt Ikony zabije i její potomky,Ikonets død dræber dets spawns,,,La morto de la piktogramo mortigas siajn idojn,La muerte del icono destruye sus lacayos,La muerte del ícono destruye sus lacayos,Ikonin kuolema tappaa myös siitä siinneet hirviöt,Tuer L'Icône tue ses monstres,Az ikon halála esetén a teremtményei is meghalnak,La morte dell'Icona uccide tutti i suoi figli,最終ボスを殺した際に召喚モンスターも殺す,보스 사망시 소환된 적들도 사망,Icon's dood doodt zijn spawns,Ikonets død dreper dets gyter,Śmierć Ikony zabija stworzone przez nią potwory,Morte do Ícone mata os seus monstros,Morte do Ícone mata os seus demónios,Decesul Idolului anihilează propriile creații,Убить порождения Иконы при её смерти,Смрт Икона греха убија његова потомства,Ikonens död dödar dess spawns,İkon'un ölümü yumurtalarını öldürür, -End sector counts for kill %,GMPLYMNU_NOCOUNTENDMONSTER,,,,Započítávat monstra v ukončujících sektorech,Slut sektor tæller for dræber %,Monster in Level-Beenden-Sektor zählen,,Finsektoro kalkulas al nombro da mortigoj,Sector de salida cuenta para % de muertes,,Loppusektori lasketaan mukaan tappoprosenttiin,Ennemis du secteur sortie comptés,Utolsó szektornál számít az ölés %,Conteggio dei nemici da uccidere nel settore in %,最終セクターの敵もキルに含む,레벨종료 섹터의 적들도 킬 수에 포함,Eindsector telt voor kill %,Slutt sektor teller for drap i prosent,"Zliczanie potworów w sektorze kończącym poziom +Double ammo,GMPLYMNU_DOUBLEAMMO,,,,Dvojnásobná munice,Dobbelt ammunition,Doppelte Munition,,Duobla municio,Doble munición,,Tupla-ammukset,Double munitions,,Dupla muníció,Doppie munizioni,弾2倍,두 배의 탄약,Dubbele munitie,Dobbel ammunisjon,Podwojona amunicja,Munição em dobro,,Muniție dublă,Удвоенные патроны,Дупла муниција,Dubbel ammunition,Çift cephane, +Infinite ammo,GMPLYMNU_INFINITEAMMO,,,,Nekonečná munice,Uendelig ammunition,Unendlich Munition,,Senlima municio,Munición infinita,,Loppumattomat ammukset,Munitions infinies,,Végtelen muníció,Infinite munizioni,弾無限,무한 탄약,Oneindige munitie,Uendelig ammunisjon,Nieskończona amunicja,Munição infinita,,Muniție infinită,Бесконечные патроны,Бесконачна муниција,Oändlig ammunition,Sonsuz cephane, +Infinite inventory,GMPLYMNU_INFINITEINVENTORY,,,,Nekonečný inventář,Uendelig lagerbeholdning,Unendliche Gegenstände,,Senlima inventaro,Inventario infinito,,Loppumattomat varusteet,Objets infinis,,Végtelen felszerelés,Infinito inventario,所持品無限,무한 인벤토리,Oneindige voorraad,Uendelig lagerbeholdning,Nieskończony ekwipunek,Inventário infinito,,Inventar infinit,Бесконечный инвентарь,Бесконачно складиштење,Oändligt inventarium,Sonsuz envanter, +No monsters,GMPLYMNU_NOMONSTERS,,,,Bez příšer,Ingen monstre,Keine Monster,,Neniu monstro,Sin monstruos,,Ei hirviöitä,Pas de monstres,,Szörnyek nélkül,Nessun mostro,モンスターを出現させない,적 제거,Geen monsters,Ingen monstre,Brak potworów,Sem monstros,,Fără monștri,Без монстров,Без чудовишта,Inga monster,Canavar yok, +No monsters to exit,GMPLYMNU_NOMONSTERSTOEXIT,,,,Ukončení levelu pouze bez příšer,Ingen monstre for at komme ud,Keine Monster um Level zu beenden,,Neniu monstro por eliri,Sin monstruos para salir,,Ei hirviöitä tason lopettamiseksi,Rien à tuer pour sortir,,Megölendő szörnyek nélkül,Nessun mostro da uccidere per uscire,モンスター全滅までMAPから脱出不可,탈출을 위한 적 제거,Geen monsters om af te sluiten,Ingen monstre å avslutte,Brak potworów do wyjścia,Sem monstros para sair da fase,Sem monstros para sair do nível,Fără monștri pentru a ieși,Убить всех монстров для выхода,Без чудовишта до излаза,Inga monster för att ta sig ut,Çıkacak canavar yok, +Monsters respawn,GMPLYMNU_MONSTERSRESPAWN,,,,Příšery se respawnují,Monstre genopstår igen,Monster kehren zurück,,Monstroj reekaperas,Reaparecer enemigos,,Hirviöt heräävät henkiin,Monstres réapparaissent,,Szörnyek újraszületnek,Respawn mostri,モンスターの自力復活,적 부활,Monsters respawn,Monstre respawn,Ponowne pojawianie się potworów,Ressurgimento de monstros,,Monștrii reapar,Монстры воскрешаются,Чудовишта се оживљавају,Monster återuppstår,Canavarlar yeniden doğar, +Monsters do not respawn,GMPLYMNU_NORESPAWN,,,,Příšery se nerespawnují,Monstre respawner ikke igen,Kein Zurückkehren,,Monstroj ne reekaperas,Sin reaparición,,Ei henkiinheräämistä,Pas de réapparition,,Szörnyek nem születnek újra,Nessun respawn,プレイヤーの復活禁止,부활 없음,Geen respawn,Monstre respawn ikke,Brak ponownego pojawienia się,Sem ressurgimento de monstros,,Monștrii nu reapar,Монстры не воскрешаются,Без оживљавања,Monstren återuppstår inte,Canavarlar yeniden doğmaz, +Items respawn,GMPLYMNU_ITEMSRESPAWN,,,,Předměty se respawnují,Genstande respawnes,Gegenstände erscheinen wieder,,Objektoj reekaperas,Reaparecer objetos,,Esineet syntyvät takaisin,Objets réapparaissent,,tárgyak újrateremnek,Respawn oggetti,アイテムを復活,아이템 재생성,Items respawn,Gjenstander respawn,Ponowne pojawianie się przedmiotów,Ressurgimento de itens,,Obiectele reapar,Восстановление предметов,Предмети се ресетују,Föremål återuppstår.,Eşyalar yeniden doğar, +Big powerups respawn,GMPLYMNU_SUPERRESPAWN,,,,Bonusy se respawnují,Store powerups respawnes,Große Boni erscheinen wieder,,Grandaj plifortigaĵoj reekaperas,Reaparecer poderes grandes,,Isot tehostimet syntyvät takaisin,Powerups réapparaissent,,Nagy képességek újraszületnek,Respawn grandi potenziamenti,強力なパワーアップアイテムを復活,파워업 재생성,Grote power-ups respawn,Store powerups respawn,Ponowne pojawianie się dużych wzmocnień,Ressurgimento de potencializadores,,Super bonusurile reapar,Восстановление больших усилений,Велики предмети се ресетују,Stora powerups återuppstår.,Büyük güçlendiriciler yeniden doğar, +Fast monsters,GMPLYMNU_FASTMONSTERS,,,,Rychlé příšery,Hurtige monstre,Schnelle Monster,,Rapidaj monstroj,Monstruos rápidos,,Nopeat hirviöt,Monstres Rapides,,Gyors szörnyek,Mostri veloci,モンスター高速化,빠른 적 개체 움직임,Snelle monsters,Raske monstre,Szybkie potwory,Monstros rápidos,,Monștri rapizi,Ускоренные монстры,Брза чудовишта,Snabba monster,Hızlı canavarlar, +Monsters Nightmare Reflexes,GMPLYMNU_INSTANTREACTION,,,,Okamžité reakce příšer (obtížnost Noční můra!),Monsterrefleksioner i 'Mareridt',Monsterreflexe in 'Alptraum!'.,,Refleksoj de monstroj en Inkubo-modo,Reflejos de los monsturos en Pesadilla,,Painajaisvaikeustason hirviöiden reaktioajat,,,Rémálom szintű szörny reakciók,,敵が悪夢と同じ機敏さ,,,Monstre mareritt reflekser,Refleks Potworów z Trybu Koszmar,Reflexos dos Monstros em Pesadelo,,Monștri cu Reflexe de Coșmar,Кошмарные рефлексы монстров,,Monster mardrömsreflexer,Canavarlar Kabus Refleksleri, +Degeneration,GMPLYMNU_DEGENERATION,,,,Degenerace,,,,Degenero,Degeneración,,Rappeutuva terveys,Dégéneration,,Degeneráció,Degrado della salute,プレイヤーの自動体力減少,약화,Degeneratie,Degenerasjon,Degeneracja,Degeneração,,Degenerare,Уменьшать дополнительное здоровье,Смањење додатног здравља,,Dejenerasyon, +Allow Autoaim,GMPLYMNU_NOAUTOAIM,,,,Povolit automatické míření,Tillad autoaim,Zielautomatik zulassen,,Permesi cel-asiston,Permitir autoapuntar,,Salli automaattitähtäys,Autoriser Auto-visée,,Autocélzás engedélyezése,Mira automatica consentita,オートエイム有効化,자동 조준 허용,Autoaim toestaan,Tillat Autoaim,Pozwól na Autocelowanie,Permitir mira automática,,Permite asistența pentru țintire,Разрешить автоприцеливание,Дозволи аутоматско циљање,Tillåt autoaim,Autoaim'e İzin Ver, +Allow Suicide,GMPLYMNU_ALLOWSUICIDE,,,,Povolit sebevraždu,Tillad selvmord,Selbstmord zulassen,,Permesi memmortigon,Permitir suicidio,,Salli itsemurha,Autoriser Suicide,,Öngyilkosság engedélyezése,Suicidio consentito,自殺コマンド有効化,자살 허용,Zelfmoord toestaan,Tillat selvmord,Pozwól na Samobójstwo,Permitir suicídio,,Permite sinuciderile,Разрешить самоубийство,Дозволи самоубиство,Tillåt självmord,İntihara İzin Ver, +Allow jump,GMPLYMNU_ALLOWJUMP,,,,Povolit skákání,Tillader spring,Springen zulassen,,Permesi salton,Permitir salto,,Salli hyppiminen,Autoriser Sauts,,Ugrás engedélyezése,Salto consentito,ジャンプ有効化,점프 허용,Springen toestaan,Tillat hopp,Pozwól na skakanie,Permitir pulo,Permitir salto,Permite săriturile,Разрешить прыжки,Дозволи скок,Tillåt hopp,Atlamaya izin ver, +Allow crouch,GMPLYMNU_ALLOWCROUCH,,,,Povolit klečení,Tillader krybeøvelser,Ducken zulassen,,Permesi kaŭron,Permitir agacharse,,Salli kyyristyminen,Autoriser Acroupissement,,Guggolás engedélyezése,Abbassamento consentito,しゃがみ有効化,앉기 허용,Hurken toestaan,Tillat huk,Pozwól na kucanie,Permitir agachamento,,Permite ghemuirile,Разрешить приседание,Дозволи чучање,Tillåt huk,Çömelmeye izin ver, +Allow freelook,GMPLYMNU_ALLOWFREELOOK,,,,Povolit koukání nahoru/dolů,Tillader freelook,Freien Blick zulassen,,Permesi liberrigardon,Permitir visión libre,,Salli vapaa katselu,Autoriser Vue Libre,,Szabad egérmozgás engedélyezése,Sguardo libero consentito,フリールック有効化,프리룩 허용,Freelook toestaan,Tillat freelook,Pozwól na swobodne rozglądanie się,Permitir visão livre,,Permite privirea în jur cu mouse-ul,Обзор мышью,Дозволи слободан поглед,Tillåt freelook,Freelook'a izin ver, +Allow FOV,GMPLYMNU_ALLOWFOV,,,,Povolit změnu FOV,Tillad FOV,Blickwinkeländerung zulassen,,Permesi vidkampon,Permitir FOV,,Salli näkökentän muokkaaminen,Autoriser Angles de vue,,Látószög állítás engedélyezése,Campo visivo consentito,FOVの調整を有効化,FOV 허용,Laat FOV,Tillat FOV,Pozwól na Pole Widzenia,Permitir campo de visão,,Permite ajustarea câmpului vizual,Разрешить изменение поля зрения,Дозволи FOV,Tillåt FOV,FOV'a İzin Ver, +Allow BFG aiming,GMPLYMNU_BFGFREEAIM,,,,Povolit míření s BFG,Tillad BFG-målsætning,Zielen mit BFG zulassen,,Permesi ekceladon de BFG,Permitir apuntado de BFG,,Salli BFG-tähtäys,Autoriser Visée au BFG,,BFG célzás engedélyezése,Mira BFG consentita,BFG使用時のフリールックを有効化,BFG 조준 허용,Laat BFG toe om te streven naar,Tillat BFG-sikting,Pozwól na celowanie BFG,Permitir mira de BFG,,Permite țintirea cu BFG,Разрешить прицеливание с BFG,Дозволи BFG нишање,Tillåt BFG-målning,BFG hedeflemesine izin ver, +Allow automap,GMPLYMNU_ALLOWAUTOMAP,,,,Povolit automapu,Tillader automap,Automap zulassen,,Permesi aŭtomatan mapon,Permitir automapa,,Salli automaattikartta,Autoriser Carte,,Autotérkép engedélyezése,Automap consentito,オートマップ有効化,오토맵 허용,Automap toestaan,Tillat automap,Pozwól na mapę,Permitir automapa,,Permite utilizarea hărții computerizate,Разрешить использование автокарты,Дозволи мапу,Tillåt automap,Otomatik eşlemeye izin ver, +Automap allies,GMPLYMNU_AUTOMAPALLIES,,,,Zobrazit na automapě spojence,Automatisk indtegning af allierede,Verbündete zulassen,,Aliancanoj en aŭtomata mapo,Aliados en el automapa,,Omat automaattikartalla,Alliés sur la carte,,Társak mutatása a térképen,Alleati nell'automap,オートマップに味方を表示,오토맵에 아군 표시,Automap bondgenoten,Automatisk kartlegging av allierte,Sojusznicy na mapie,Permitir aliados no automapa,,Aliați pe harta computerizată,Отображение союзников на автокарте,Савезници на аутомапи,Automatiska allierade,Automap müttefikleri, +Allow spying,GMPLYMNU_ALLOWSPYING,,,,Povolit špehování,Tillader spionage,Spionieren zulassen,,Permesi spionadon,Permitir espiar,,Salli vakoileminen,Autoriser espionnage,,Kémkedés engedélyezése,Spionaggio consentita,死亡時の他プレイヤー観戦を許可,관전 허용,Laat spionage toe,Tillat spionering,Pozwól na śledzenie,Permitir visualização de outros jogadores,,Permite vederea prin ochii altor jucători,Разрешить вид от других игроков,Дозволи поглед од другог играча,Tillåter spionage,Casusluğa izin ver, +Chasecam cheat,GMPLYMNU_CHASECAM,,,,Povolit kameru z třetí osoby (cheat),Chasecam snyder,Verfolgerkamera Cheat,,Trompo por ĉaskamerao,Truco de vista 3era persona,,Seurantakamerahuijaus,Cheat caméra 3ième personne,,Követésőkamera csalás,Cheat camera di inseguimento,チェイスカメラチート有効化,3인칭 카메라 치트,Chasecam cheat,Chasecam juks,Oszustwo kamery śledzenia,Trapaça de câmera em terceira pessoa,Batota de câmera em terceira pessoa,Trișare pentru vedere la persoana a 3-a,Разрешить вид от 3-го лица,Дозволи чејс-кем,Fusk med Chasecam,Chasecam hilesi, +Check ammo for weapon switch,GMPLYMNU_DONTCHECKAMMO,,,,Přepnout na zbraň pouze s municí,Kontroller ammunition for våbenskift,Munition beim Waffenwechsel prüfen,,Kontroli municion por armŝanĝi,Revisar munición para cambiar armas,,Tarkista ammustilanne aseenvaihdon yhteydessä,Vérifier muni. pour changer arme,,Váltáskor üres fegyver átugrása,Controlla le munizioni per il cambio arma,武器切替時に弾の有無を確認,탄약 소진 시 무기 변경,Controleer munitie op wapenschakelaars.,Sjekk ammunisjon for våpenbryter,Sprawdź amunicję przy sprawdzaniu broni,Conferir munição para troca de arma,,Verifică muniția armei pentru schimbare,Проверять патроны при переключении оружия,Проверити муницију за прекидач за оружје,Kontrollera ammunition för vapenbyte,Silah anahtarı için cephaneyi kontrol edin, +Icon's death kills its spawns,GMPLYMNU_KILLBOSSSPAWNS,,,,Smrt Ikony zabije i její potomky,Ikonets død dræber dets spawns,,,La morto de la piktogramo mortigas siajn idojn,La muerte del icono destruye sus lacayos,La muerte del ícono destruye sus lacayos,Ikonin kuolema tappaa myös siitä siinneet hirviöt,Tuer L'Icône tue ses monstres,,Az ikon halála esetén a teremtményei is meghalnak,La morte dell'Icona uccide tutti i suoi figli,最終ボスを殺した際に召喚モンスターも殺す,보스 사망시 소환된 적들도 사망,Icon's dood doodt zijn spawns,Ikonets død dreper dets gyter,Śmierć Ikony zabija stworzone przez nią potwory,Morte do Ícone mata os seus monstros,Morte do Ícone mata os seus demónios,Decesul Idolului anihilează propriile creații,Убить порождения Иконы при её смерти,Смрт Икона греха убија његова потомства,Ikonens död dödar dess spawns,İkon'un ölümü yumurtalarını öldürür, +End sector counts for kill %,GMPLYMNU_NOCOUNTENDMONSTER,,,,Započítávat monstra v ukončujících sektorech,Slut sektor tæller for dræber %,Monster in Level-Beenden-Sektor zählen,,Finsektoro kalkulas al nombro da mortigoj,Sector de salida cuenta para % de muertes,,Loppusektori lasketaan mukaan tappoprosenttiin,Ennemis du secteur sortie comptés,,Utolsó szektornál számít az ölés %,Conteggio dei nemici da uccidere nel settore in %,最終セクターの敵もキルに含む,레벨종료 섹터의 적들도 킬 수에 포함,Eindsector telt voor kill %,Slutt sektor teller for drap i prosent,"Zliczanie potworów w sektorze kończącym poziom ",Setor de saída conta para porcentagem de mortes,Setor de saída conta para percentagem de mortes,Numărare decese monștri în sectoare finale,Засчитывать убийства монстров в секторах конца игры,Урачунај убиство чудовишта у коначним секторима,Slutsektorn räknas för dödande %,Öldürme %'si için son sektör sayıları, -Deathmatch Settings,GMPLYMNU_DEATHMATCH,,,,Nastavení deathmatche,Indstillinger for Deathmatch,Deathmatcheinstellungen,,Mortmatĉo-agordoj,Configuración modo a muerte,,Kuolonotteluasetukset,Options Deathmatch,Deathmatch beállítások,Impostazioni deathmatch,デスマッチの設定,데스매치 설정,Deathmatch instellingen,Deathmatch-innstillinger,Ustawienia Deathmatchu,Configurações de Deathmatch,,Setări Deathmatch,Настройки боя насмерть,Детмеч подешавања,Inställningar för Deathmatch,Ölüm Maçı Ayarları, -Weapons stay,GMPLYMNU_WEAPONSSTAY,,,,Zbraně zůstávají,Våben forbliver,Waffen bleiben,,Armiloj restiĝas,Las armas se quedan,,Aseet pysyvät,Armes restent au sol quand prises,Fegyverek mindig felvehetőek,Le armi rimangono in posizione,武器を取得時も残す,습득 후 무기가 남아있기,Wapenverblijven,Våpen forblir,Bronie zostają,Armas permanecem,,Părăsire arme după selectare,Оставлять оружие после подбора,Оружје се остаје након купљења,Vapen stannar kvar,Silahlar kalıyor, -Allow powerups,GMPLYMNU_ALLOWPOWERUPS,,,,Povolit bonusy,Tillad powerups,Boni erlauben,,Permesi plifortigaĵojn,Permitir poderes,,Salli tehostimet,Autoriser powerups,Powerupok engedélyezése,Potenziamenti consentiti,パワーアップアイテムを出現させる,파워 업 허용,Power-ups toestaan,Tillat powerups,Pozwól na wzmocnienia,Permitir powerups,,Permite bonusuri,Разрешить бонусы,Дозволи бонусе,Tillåter powerups,Güçlendirmelere izin ver, -Allow health,GMPLYMNU_ALLOWHEALTH,,,,Povolit zdraví,Tillad sundhed,Gesundheit erlauben,,Permesi sanon,Permitir salud,,Salli terveysesineet,Autoriser objets santé,Életerő engedélyezése,Oggetti per la salute consentiti,回復アイテムを出現させる,체력 회복 아이템 허용,Gezondheid toestaan,Tillat helse,Pozwól na przedmioty zdrowotne,Permitir itens de saúde,,Permite prim-ajutor,Разрешить здоровье,Дозволи бонусе за здравље,Tillåter hälsa,Sağlığa izin ver, -Allow armor,GMPLYMNU_ALLOWARMOR,,,Allow armour,Povolit brnění,Tillad rustning,Panzer erlauben,,Permesi kirason,Permitir armadura,,Salli panssariesineet,Autoriser objets armure,Páncél engedélyezése,Armature consentite,アーマーを出現させる,아머 허용,Pantsertoeslag toestaan,Tillat rustning,Pozwól na pancerz,Permitir itens de armadura,,Permite bonusuri de armură,Разрешить броню,Дозволи оклоп,Tillåt rustning,Zırha izin ver, -Spawn farthest,GMPLYMNU_SPAWNFARTHEST,,,,Spawnovat hráče co nejdále od sebe,Spawn længst væk,Am weitesten entfernten Punkt erscheinen,,Ekaperi plej fore,Aparecer más lejos,,Herää henkiin kauimpaa,Apparaître au plus loin,Legmesszebb születés,Spawn il più lontano possibile,他のプレイヤーから最遠の場所に復活,먼 곳에서 소환,Kuitschieten het verst verwijderd,Spawn lengst,Pojaw się jak najdalej,Surgimento mais longe,,Apariție cât mai departată de ceilalți,Воскрешение подальше от остальных,Оживљавање даље од других,Spawna längst bort,En uzakta yumurtla, -Same map,GMPLYMNU_SAMEMAP,,,,Stejná mapa,Samme kort,Gleiches Level,,Sama mapo,Mismo mapa,,Sama taso,Même Carte,Ugyanazon pálya,Stessa mappa,同じMAPを繰り返す,같은 맵 플레이,Dezelfde kaart,Samme kart,Ta sama mapa,Mesmo mapa,,Reluare nivel,Зациклить уровень,Понављање нивоа,Samma karta,Aynı harita, -Force respawn,GMPLYMNU_FORCERESPAWN,,,,Vynutit respawn,Tvinge respawn,Zurückkehren erzwingen,,Devigi reekaperon,Forzar reaparición,,Pakota henkiinherääminen,Forcer Réapparition,Újraszületés kényszerítése,Forza il respawn,死亡後に強制復活,강제 부활,Respawn is gedwongen,Force respawn,Wymuś ponowne pojawienie się,Forçar reaparecimento,,Reapariție instantă,Моментальное воскрешение,Форсирано оживљавање,Tvinga till återkomst,Yeniden doğmaya zorla, -Allow exit,GMPLYMNU_ALLOWEXIT,,,,Povolit ukončení levelu,Tillad at forlade,Verlassen erlauben,,Permesi eliron,Permitir salir,,Salli tasosta poistuminen,Autoriser Sortie,Kijárat engedélyezése,Uscita consentita,出口の使用を許可,탈출 허용,Uitgang toestaan,Tillat utgang,Pozwól na wyjście,Permitir saída,,Permite ieșirea,Разрешить выход,Дозволи излазак из нивоа,Tillåter utgång,Çıkışa izin ver, -Barrels respawn,GMPLYMNU_BARRELSRESPAWN,,,,Barely se respawnují,Tønder respawner,Fässer kehren zurück,,Bareloj reekaperas,Reaparecer barriles,,Tynnyrit syntyvät takaisin,Réapparition des Tonneaux,Hordók újraszületése,Respawn barili esplosivi,爆発バレルを復活させる,폭발통 재생성,Vaten respawn,Tønner respawn,Beczki pojawiają się ponownie,Barrís reaparecem,,Butoaiele reapar,Восстановление бочек,Бурад се ресетују,Tunnor återkommer,Variller yeniden doğar, -Respawn protection,GMPLYMNU_RESPAWNPROTECTION,,,,Ochrana po respawnu,Respawn-beskyttelse,Schutz beim Zurückkehren,,Protekto de reekapero,Reaparecer protección,,Henkiinheräämissuoja,Protection à la réapparition,Újraszületési védelem,Protezione al respawn,復活したばかりのプレイヤーを保護,부활시 무적,Respawn bescherming,Respawn-beskyttelse,Ochrona przy ponownym pojawieniu się,Proteção de reaparecimento,,Protecție la apariția pe hartă,Кратковременная защита после воскрешения,Ресетује се заштита,Skydd för återstart,Yeniden doğma koruması, -Lose frag if fragged,GMPLYMNU_LOSEFRAG,,,,"Hráč ztratí frag, pokud je zabit",Mister frag hvis der er en fragged,Fragabzug bei Tod,,Perdi ludmurdon se ludmurdita,Perder baja al morir,,"Frägin menettäminen, jos joutuu frägätyksi",Perdre 1 frag quand tué,Halál esetén pont veszítése,Perdere i frag se fraggato,キルされた場合は得点を失う,적에게 사망시 점수를 잃음,Verlies frag bij dood,Miste frag hvis fragged,Strać fraga jeśli jesteś sfragowany,Perder frag ao ser fragado,,Pierdere din victime la deces,Терять фраг при смерти,Изгубити гранату ако опаљена,Förlorar frag om du blir träffad,Parçalanırsa parça kaybeder, -Keep frags gained,GMPLYMNU_KEEPFRAGS,,,,Ponechávat fragy mezi levely,Beholde vundne frags,Frags zwischen Leveln behalten,,Teni ludmurdojn gajnitajn,Mantener bajas ganadas,,Pidä ansaitut frägit,Garder les frags gagnés,Megszerzett pontok megmaradnak,Mantenere i frag vinti,MAP変更後も得点を保持する,맵 변경 시 점수 유지,Houd frags opgedaan,Behold frags vunnet,Zachowaj zdobyte fragi,Manter frags ganhos,,Păstrare număr victime,Сохранять фраги между уровнями,Задржати стечене гранате,Behåll de frags som vunnits,Kırıntıları kazanmaya devam edin, -No team switching,GMPLYMNU_NOTEAMSWITCH,,,,Uzamknout týmy,Ingen holdskifte,Kein Teamwechsel,,Neniu teamŝanĝado,No cambiar equipos,,Ei joukkueenvaihtoa,Pas de changement d'équipe,Nincs csapatváltás,Nessun cambio di squadra,チーム変更を禁止,팀 변경 없음,Geen teamwisseling,Ingen lagbytte,Zakaz zmieniania drużyn,Desativar troca de time,Desativar troca de equipa,Nu permite schimbarea echipelor,Запретить переход между командами,Нема мешања тимова,Inget byte av lag,Takım değiştirme yok, -Cooperative Settings,GMPLYMNU_COOPERATIVE,,,,Nastavení co-op módu,Kooperativ indstillinger,Kooperativ-Einstellungen,,Agordoj de koopera reĝimo,Configuración de cooperativo,,Yhteispeliasetukset,Options Coopératives,Együttműködő beállítások,Impostazioni cooperativa,協力モードの設定,협동 플레이 설정,Coöperatieve instellingen,Samarbeidsinnstillinger,Ustawienia Kooperacji,Configurações de jogo cooperativo,,Setări cooperative,Настройки совместной игры,Кооперативне поставке,Inställningar för samarbete,Kooperatif Ayarları, -Spawn multiplayer weapons,GMPLYMNU_MULTIPLAYERWEAPONS,,,,Spawnovat multiplayerově zbraně,Spawn multiplayer-våben,Deathmartch Waffen sind verfügbar,,Ekaperigi armilojn por plurludanta reĝimo,Aparecer armas multi.,,Kuolonotteluaseet saatavilla,Spawns d'armes deathmatch,Többjátékos fegyverek engedélyezése,Fai apparire le armi di multigiocatore,マルチプレイ用の武器を出現させる,멀티플레이어 무기 소환,Spawn multi. wapens,Spawn flerspillervåpen,Zezwól na bronie trybu dla wielu graczy,Surgimento de armas em multijogador,,Permite apariția armelor din modul online,Появление оружия из сетевой игры,Створити мулти оружја,Spawna flerspelarvapen,Çok oyunculu silahları ortaya çıkarma, -Lose entire inventory,GMPLYMNU_LOSEINVENTORY,,,,Ztrácet celý inventář,Mister hele inventaret,Verliere ganzes Inventar,,Perdi tutan inventorion,Perder todo el inventario,,Menetä kaikki varusteet,Perdre l'inventaire,Teljes készlet elvesztése,Perdere l'inventario,死亡時に全ての所持品を失う,인벤토리 비우기,Verlies van de volledige inventaris,Miste hele beholdningen,Utrać cały ekwipunek,Perder todo o inventário,,Pierdere inventar,Терять весь инвентарь при смерти,Изгубити цело складиште,Förlorar hela inventariet,Tüm envanteri kaybetmek, -Keep keys,GMPLYMNU_KEEPKEYS,,,,Ponechat klíče,Beholde nøgler,Schlüssel behalten,,Teni ŝlosiojn,Mantener llaves,,Pidä avaimet,Garder clés,Kulcsok megtartása,Mantenere le chiavi,死亡後もキーを保持する,열쇠들을 소지하고 시작,Sleutels bewaren,Behold nøkler,Zachowaj klucze,Manter chaves,,Păstrare chei,Сохранять ключи,Задржати кључеве,Behåll nycklar,Anahtarları sakla, -Keep weapons,GMPLYMNU_KEEPWEAPONS,,,,Ponechat zbraně,Behold våben,Waffen behalten,,Teni armilojn,Mantener armas,,Pidä aseet,Garder armes,Fegyverek megtartása,Mantenere le armi,死亡後も武器を保持する,무기들을 소지하고 시작,Wapens bewaren,Behold våpen,Zachowaj bronie,Manter armas,,Păstrare arme,Сохранять оружие,Задржати оружје,Behåll vapen,Silahları saklayın, -Keep armor,GMPLYMNU_KEEPARMOR,,,Keep armour,Ponechat brnění,Behold rustning,Rüstung behalten,,Teni kirason,Mantener armadura,,Pidä panssari,Garder armure,Páncél megtartása,Mantenere l'armatura,死亡後もアーマーを保持する,아머를 소지하고 시작,Pantser bewaren,Behold rustning,Zachowaj pancerz,Manter armadura,,Păstrare armură,Сохранять броню,Задржати панцир,Behåll rustning,Zırhı sakla, -Keep powerups,GMPLYMNU_KEEPPOWERUPS,,,,Ponechat bonusy,Beholde powerups,Behalte Boni,,Teni plifortigaĵojn,Mantener poderes,,Pidä tehostimet,Garder powerups,Powerupok megtartása,Mantenere i potenziamenti,死亡後もパワーアップを保持する,파워업을 소지하고 시작,Power-ups bewaren,Behold powerups,Zachowaj wzmocnienia,Manter powerups,,Păstrare bonusuri,Сохранять супербонусы,Задржати повећану моћ,Behåll powerups,Güçlendirmeleri sakla, -Keep ammo,GMPLYMNU_KEEPAMMO,,,,Ponechat munici,Beholde ammunition,Munition behalten,,Teni municion,Mantener munición,,Pidä ammukset,Garder munitions,Muníció megtartása,Mantenere le ammunizioni,死亡後も弾薬を保持する,탄약을 소지하고 시작,Munitie bewaren,Behold ammunisjon,Zachowaj amunicję,Manter munição,,Păstrare armură,Сохранять патроны,Задржати муницију,Behålla ammunition,Cephaneyi sakla, -Lose half ammo,GMPLYMNU_LOSEHALFAMMO,,,,Ztratit polovinu munice,Mister halvdelen af ammunitionen,Halbe Munition verlieren,,Perdi duonon de onia municio,Perder la mitad de la munición,,Menetä puolet ammuksista,Perdre la moité des munitions,Fele muníció elvesztése,Perdere metà ammunizioni,死亡時に弾を半分失う,탄약의 반을 잃음,Verlies halve munitie,Miste halv ammunisjon,Utrać pół amunicji,Perder metade da munição,,Pierdere jumătate din armură,Терять половину патронов,Изгубити пола муниције,Förlorar halva ammunitionen,Cephanenin yarısını kaybet, -Spawn where died,GMPLYMNU_SPAWNWHEREDIED,,,,Respawn na místě smrti,Spawn hvor du døde,Neuerscheinen wo gestorben,,Ekaperigi kie oni mortigis,Aparecer donde moriste,,Herää henkiin kuolinpaikalla,Réapparaitre sur lieu de mort,Halál helyén újraszületés,Respawn nel luogo di morte,死亡したその場で復活,죽은 곳에서 소환,Kuit waar gestorven is,Gyte der du døde,Pojaw się znów tam gdzie zginąłeś,Surgir no local da morte,Reaparecer onde morreu,Apariție la locul decesului,Воскрешение на месте смерти,Оживљавање на месту смрти,Spawna där du dog,Öldüğü yerde yumurtlama, -Always spawn multiplayer objects,GMPLYMNU_ALWAYSSPAWNMULTI,,,,Vždy spawnovat multiplayerové objekty,Spawn altid multiplayer-objekter,Mehrspielerobjekte immer erzeugen,,Ĉiam ekaperi plurludantajn objektojn,Siempre hacer aparecer objetos en el modo multijugador,,Aina luo moninpelioliot,Toujours créer des objets multi-joueurs,Mindig megjelennek a többjátékos tárgyak,Fai sempre apparire gli oggetti di multigiocatore,常にマルチプレイ用の物を出現,,Altijd multiplayer objecten spawnen,Alltid gyte flerspillerobjekter,Pozwól na przedmioty dla trybu wielu graczy,Permitir surgimento de objetos multijogador,,Permite apariția obiectelor din multiplayer,Появление объектов из сетевой игры,Увек стварајте објекте за више играча,Alltid spawna flerspelarobjekt,Her zaman çok oyunculu nesneler oluşturun, -Allow Vertical Bullet Spread,GMPLYMNU_NOVERTSPREAD,,,,Povolit svislý rozptyl střelby,Tillad lodret kuglespredning,Vertikale Streuung erlauben,,Permesi vertikalan kuglan disvastiĝon,Desparramar balas de todas las armas en vertical,,Permesu Vertikalan Kuglon Disvastiĝon ,Permettre la propagation verticale des balles,Vertikális fegyverszórás engedélyezve,Permetti la diffusione dei proiettili in verticale,垂直方向への散弾を許可,,Verticale kogelspreiding toestaan,Tillat vertikal kulespredning,Pozwól na pionowy rozrzut pocisków,Permitir dispersão vertical das balas,,Permiteți răspândirea verticală a gloanțelor,Разрешить вертикальный разброс пуль,Дозволи вертикално ширење метака,Tillåt vertikal kulspridning,Dikey Mermi Yayılımına İzin Ver, -Weapons give extra ammo (DM),GMPLYMNU_NOEXTRAAMMO,,,,Zbraně dávají munici navíc (DM),Våben giver ekstra munition (DM),Waffen geben Extramunition,,Armiloj donas ekstran municion (DM),Las armas dan munición extra (DM),,Armiloj donas ekstran municion (DM),Les armes donnent des munitions supplémentaires (DM),A fegyverek extra lőszert adnak (DM),Le armi danno munizioni extra (DM),武器に追加弾薬を付与 (DMのみ),,Wapens geven extra munitie (DM),Våpen gir ekstra ammunisjon (DM),Broń daje dodatkową amunicję (DM),Armas dão munição extra (DM),,Armele oferă muniție suplimentară (DM),Оружие даёт дополнительные патроны (бой насмерть),Оружје даје додатну муницију (ДМ),Vapen ger extra ammunition (DM),Silahlar ekstra cephane verir (DM), -Compatibility Options,OPTMNU_COMPATIBILITY,,,,Kompatibilita,Kompatibilitetsindstillinger,Kompatibilitätsoptionen,Ρυθμίσεις Συμβατότητας,Kongruo-agordoj,Opciones de compatibilidad,,Yhteensopivuusasetukset,Options de Compatibilité,Kompatibilitási beállítások,Opzioni Compatibilità,互換性 オプション,호환 설정,Compatibiliteitsopties,Kompatibilitetsalternativer,Opcje Zgodności,Opções de compatibilidade,,Setări de Compatibilitate,Настройки совместимости,Компатибилност,Kompatibilitetsalternativ,Uyumluluk Seçenekleri, -Compatibility Options,CMPTMNU_TITLE,,,,Nastavení kompatibility,Kompatibilitetsindstillinger,Kompatibilitätsoptionen,Ρυθμίσεις Συμβατότητας,Kongruo-agordoj,Opciones de compatibilidad,,Yhteensopivuusasetukset,Options Compatibilité,Kompatibilitási beállítások,Opzioni compatibilità,互換性 オプション,호환성 설정,Compatibiliteitsopties,Kompatibilitetsalternativer,Opcje Zgodności,Opções de compatibilidade,,Setări de Compatibilitate,Настройки совместимости,Компатибилна подешавања,Kompatibilitetsalternativ,Uyumluluk Seçenekleri, -Compatibility mode,CMPTMNU_MODE,,,,Režim kompatibility,Kompatibilitetstilstand,Kompatibilitätsmodus,,Kongruo-reĝimo,Modo de compatibilidad,,Yhteensopivuustila,Mode de compatibilité,Kompatibilitási mód,Modalità compatibilità,互換性モード,호환 모드,Compatibiliteitsmodus,Kompatibilitetsmodus,Tryb Zgodności,Modo de compatibilidade,,Mod Compatibilitate,Режим совместимости,Компатибилни мод,Kompatibilitetsläge,Uyumluluk modu, -Actor Behavior,CMPTMNU_ACTORBEHAVIOR,,,Actor Behaviour,Objekty,Skuespilleradfærd,Verhalten der Akteure,,Aktorkonduto,Comportamiento del actor,,Olioiden käyttäytyminen,Comportement des Acteurs,Actor viselkedés,Comportamento degli attori,アクターの挙動,개체 관련 설정,Gedrag van de acteur,Skuespilleroppførsel,Zachowanie Aktorów,Comportamento de atores,,Comportament actori,Поведение объектов (акторов),Понашање актора,Beteende hos skådespelare,Aktör Davranışı, -Friendly monsters aren't blocked,CMPTMNU_NOBLOCKFRIENDS,,,,Spojenecké příšery nejsou blokovány,Venlige monstre er ikke blokeret,Freundliche Monster werden nicht geblockt,,Amikaj monstroj ne estas baritaj,Monstruos amistosos no son bloqueados,,Myötämielisten hirviöiden esteetön liikkuminen,Monstres amicaux non bloqués,Barátságos szörnyek nem blokkolódnak,I mostri amichevoli non sono bloccati,仲間キャラは敵通行不可ラインの影響を受けない,아군 개체는 BLOCK 선분 무시,Vriendelijke monsters worden niet geblokkeerd.,Vennlige monstre er ikke blokkert,Przyjazne potwory nie mogą być blokowane,Monstros aliados não são bloqueados,,Monștrii aliați nu pot fi blocați,Не блокировать дружественных монстров,Пријатељска чудовишта се не блокирају,Vänliga monster blockeras inte,Dost canavarlar engellenmez, -Limit Pain Elementals' Lost Souls,CMPTMNU_LIMITPAIN,,,,Omezit počet Ztrac. duší (Lost Souls) od Živlů (Pain Elementals),Grænse for tabte sjæle,Limit für Verlorene Seelen,,Limigi Perditajn Animojn de Doloro-Elementuloj,Limitar Almas Errantes de los Elementales del Dolor,,Rajoita kivun henkien kadonneitten sielujen määrää,Limiter âmes des élémentaires,Kiköpött Elveszett Lelkek limitálása,Limita le Anime Erranti degli Elementali del dolore,ペインエレメンタルのロストソウル制限,로스트 소울 소환 21개로 제한,Beperk de Verloren Zielen van Pijn Elementairs,Begrens smertelementalers tapte sjeler,Ogranicz Zagubione Dusze Elementala Bólu,Limitar Almas Perdidas criadas por Elementais da Dor,,Limitează numărul Sufletelor Pierdute create de Elementalii Durerii,Ограничить число потерянных душ от элементалей боли,Ограничи изгубљене душе од елементала патње,Begränsa Pain Elementals förlorade själar,Acı Elementallerinin Kayıp Ruhlarını Sınırla, -Monster movement is affected by effects,CMPTMNU_MBFMONSTERMOVE,,,,Pohyb příšer je ovlivněn efekty,Monsterbevægelse er påvirket af effekter,Monsterbewegung wird von Effekten beeinflusst,,Monstromovado estas afektita per efektoj,Los efectos afectan al movimiento de los monstruos,,Tehosteet vaikuttavat hirviöiden liikkumiseen,Mouvement monstre affecté par effets,Szörny sebesség függ az effektektől,Il movimento dei mostri è affetto dagli effetti,敵の移動が床の影響を受ける,구역의 이동 효과가 개체들에 영향,Monsterbeweging wordt beïnvloed door effecten,Monsterbevegelse påvirkes av effekter,Efekty wpływają na ruch potworów,Movimento dos monstros é afetado por efeitos,,Efectele afectează deplasarea monștrilor,Эффекты влияют на движение монстров,Ефекти утицају на покретљивост чудовишта,Monsterrörelse påverkas av effekter,Canavar hareketi etkilerden etkilenir, -Monsters cannot cross dropoffs,CMPTMNU_CROSSDROPOFF,,,,Příšery nemohou překročit výšiny,Monstre kan ikke krydse faldgruber,Monster können Abbruchkanten nicht überqueren,,Monstroj ne povas movi trans krutaĵojn,Los monstruos no pueden cruzar declives,,Hirviöt eivät voi ylittää pudotuksia,Monstres ne passent pas les corniches,Szörnyek le tudnak esni a lejtőről,I mostri non posso attraversare gli spigoli,敵はdropoffを横切れない,개체들이 난간에서 추락 불가,Monsters kunnen geen dropoffs kruisen,Monstre kan ikke krysse dropoffs,Potwory nie mogą przekraczać spadków,Monstros não podem atravessar penhascos,,Monștrii nu pot trece peste prăpăstii,Монстрам нельзя пересекать уступы,Чудовишта не могу прећи падове,Monster kan inte korsa stupstockar,Canavarlar inişleri geçemez, -Monsters get stuck over dropoffs,CMPTMNU_DROPOFF,,,,Příšery se zasekávají na výšinách,Monstre bliver hængende over faldgruber,Monster bleiben auf Abbruchkanten hängen,,Monstroj ĉesiĝi super krutaĵoj,Los monstruos se atascan sobre declives,Los monstruos se atoran sobre declives,Hirviöt joutuvat jumiin pudotusten ylle,Monstres bloqués par les corniches,Szörnyek nem mennek tovább a lejtőnél,I mostri rimangono bloccati sugli spigoli,敵がdropoffにスタックする,개체들이 난간에 끼일 수 있음,Monsters komen vast te zitten boven dropoffs,Monstre blir sittende fast over dropoffs,Potwory mogą utknąć nad spadkami,Monstros ficam presos em penhascos,,Monștrii înțepenesc peste prăpăstii,Монстры застревают на уступах,Чудовишта се заглављују на падовима,Monster fastnar över stupstockar,Canavarlar inişlerde sıkışıp kalıyor, -Monsters see invisible players,CMPTMNU_INVISIBILITY,,,,Příšery vidí neviditelné hráče,Monstre kan se usynlige spillere,Monster können unsichtbare Spieler sehen,,Monstroj povas vidi nevideblajn ludantojn,Los monstruos ven jugadores invisibles,,Hirviöt näkevät näkymättömät pelaajat,Monstres voient joueurs invisibles,Láthatatlanság alatt is látható a játékos,I mostri vedono i giocatori invisibili,敵が透明を見破る,개체들이 투명 플레이어 감지 가능,Monsters zien onzichtbare spelers,Monstre ser usynlige spillere,Potwory widzą niewidzialnych graczy,Monstros enxergam jogadores invisíveis,,Monștrii pot vedea jucătorii invizibili,Монстры видят невидимых игроков,Чудовишта могу да виде невидљиве играче,Monster ser osynliga spelare,Canavarlar görünmez oyuncuları görür, -No Minotaur floor flames in water,CMPTMNU_MINOTAUR,,,,Minotauři nemohou tvořit plameny ve vodě,Ingen Minotaur gulvflammer i vand,Keine Minotaurus-Flammen im Wasser,,Neniuj plankfajroj de Mintaŭroj en akvo,Sin llamas de minotauro en el agua,,Ei minotaurien lattialiekkejä vedessä,Pas de feu de Massetaur sur l'eau,Minotaurusz égő nyom nincs a vízben,Niente fiamme da terra del Minotauro sull'acqua,ミノタウロスの攻撃が水を通過しない,수면에서는 몰로타우어 지면화염 차단,Geen Minotaurus vloer vlammen in water,Ingen Minotaur-gulvflammer i vann,Brak płomieni Minotaura w wodzie,Desativar fogo do Marretauro na água,,Minotaurii nu pot folosi atacul de foc pe apă,Минотавры не создают огонь в воде,Минотаури не пале ватру у води,Ingen Minotaur golvlåga flammar i vatten,Suda Minotor zemin alevleri yok, -Spawn item drops on the floor,CMPTMNU_NOTOSSDROPS,,,,Spadlé předměty se objeví na zemi,Spawn-genstande falder på gulvet,Gegenstände erscheinen auf dem Fußboden,,Ekaperigi faligitajn objektojn sur la plankon,Aparecer objetos dejados en el suelo,,Synnytä esinepudotukset lattialle,Objets lâchés direct au sol,Spawnolt tárgy a földön jelenik meg,Gli oggetti allo spawn cadono a terra,アイテムドロップが床に出る,아이템이 떨어질때 지면에 즉시 착지,Paaipunt druppels op de vloer,Spawn-element faller på gulvet,Obiekty pojawiają się na podłodze,Itens surgidos caem direto no chão,,Obiectele scăpate vor apărea la nivelul podelei,Выброшенные предметы создаются на земле,Одбачени предмети се појављују на поду,Spawner föremål faller på golvet.,Eşya yere düşer, -DehackEd Behavior,CMPTMNU_DEHACKEDBEHAVIOR,,,DehackEd Behaviour,DeHackEd,DehackEd Adfærd,DehackEd Verhalten,,Konduto de DehackEd,Comportamiento de DehackEd,,DehackEd-käyttäytyminen,Comportement DeHackEd,DeHackEd viselkedés,Comportamento DehackEd,DehackEdの挙動,DehackEd 관련 설정,DehackEd Gedrag,DehackEd oppførsel,Zachowanie DehackEd,Comportamento DehackEd,,Comportament DehackEd,Поведение DeHackEd,DehackEd понашање,DehackEd-beteende,DehackEd Davranışı, -DEH health settings like Doom2.exe,CMPTMNU_DEHHEALTH,,,,Nastavení DEH jako v Doom2.exe,DEH sundhedsindstillinger som Doom2.exe,DEH Gesundheitseinstellungen wie in Doom2.exe,,DEH sanagordoj kiel Doom2.exe,Configuración de salud DEH como en Doom2.exe,,DEH-terveysasetukset kuin Doom2.exessä,Para. santé DEH comme Doom2.EXE,DEH életerő beállítások mint a Doom2.exe esetében,Impostazioni di salute DEH come in Doom2.exe,Doom2.exe式のDEHヘルス設定,DEH 자체의 체력 최댓값 사용,DEH-gezondheidsinstellingen zoals Doom2.exe,DEH helseinnstillinger som Doom2.exe,Ustawienia zrowia DEH jak w Doom2.exe,Configurações de saúde de DEH como em Doom2.exe,,Setări sănătate în DEH precum în Doom2.exe,Настройки здоровья DEH как в Doom2.exe,DEH подешавања здравља као у Doom2.exe,DEH-hälsoinställningar som Doom2.exe,Doom2.exe gibi DEH sağlık ayarları, -Original A_Mushroom speed in DEH mods,CMPTMNU_MUSHROOM,,,,Původní rychlost pro A_Mushroom,Original A_Mushroom hastighed i DEH mods,Originale Berechnung für A_Mushroom,,Originala A_Mushroom rapideco en DEH-modifaĵoj,Velocidad original de A_Mushroom en mods con DEH,,Alkuperäinen A_Mushroom-nopeus DEH-modeissa,Vitesse A_Mushroom originale pour DEH,Eredeti A_Mushroom sebesség a DEH modoknál,Velocità originale di A_Mushroom nei mod DEH,DEH Modでの元のA_Mushroom速度,A_Mushroom효과가 MBF 원본의 속력 사용,Originele A_Mushroom in DEH-modellen,Original A_Mushroom hastighet i DEH mods,Oryginalna prędkość A_Mushroom w modach DEH,Velocidade original do A_Mushroom em mods DEH,,Folosește viteza originală pentru A_Mushroom în DEH în moduri,Изначальная скорость A_Mushroom в мод. DEH,Оригинална брзина A_Mushroom в DEH модовима,Ursprunglig A_Mushroom-hastighet i DEH-modifieringar,DEH modlarında orijinal A_Mushroom hızı, -Map/Action Behavior,CMPTMNU_MAPACTIONBEHAVIOR,,,Map/Action Behaviour,Levely a akce,Map/Action Adfærd,Level/Aktionsverhalten,,Mapo/Ago-Konduto,Comportamiento Mapa/Acción,,Tason/Toimintojen käyttäytyminen,Comportement Niveau/Actions,Pálya/Akció viselkedés,Comportamento Mappa/Azioni,マップ/アクションの挙動,맵/동작 관련 설정,Kaart/Actiegedrag,Kart / handling oppførsel,Zachowanie Mapy/Akcji,Comportamento de Mapa/Ação,,Comportament hartă/actori,Поведение уровней/действий,Понашање нивоа/догађаја,Beteende för kartor/handlingar,Harita/Eylem Davranışı, -All special lines can block ,CMPTMNU_USEBLOCKING,,,,Veškeré akční čáry blokují použití hráčem,Alle specielle linjer kan blokere ,Alle Speziallinien blockieren Benutzung,,Ĉiuj el specialaj linioj povas bari je ,Todas las líneas especiales pueden bloquear ,,Kaikki erikoisviivat voivat tukkia -toiminnon,Toute ligne d'action bloque ,Minden speciális sor blokkolhatja a parancsot,Tutte le linee speciali possono bloccare il comando ,全てのSpecial Linesがをブロック,특정 선상에 겹쳐있을 시 <사용> 무력화,Alle speciale lijnen kunnen blokkeren.,Alle spesielle linjer kan blokkere ,Wszystkie specjalne linie mogą blokować ,Todas as linhas especiais podem bloquear o comando ,,Toate liniile speciale pot bloca ,Все специальные линии могут блокировать использование,Све специјалне линије могу да блокирају ,Alla speciella linjer kan blockera ,Tüm özel hatlar engelleyebilir, -Allow any bossdeath for level special,CMPTMNU_ANYBOSSDEATH,,,,Smrt jakéhokoli bosse může aktivovat speciální akci levelu,Tillad enhver bossdeath for level special,Jeder Boss-Tod zählt für Spezialaktionen,,Permesi iun ajn estro-morton por nivelspecialo,Permitir cualquier muerte de jefe por especial de nivel,,Mikä tahansa pomokuolema lasketaan tason erikoistoiminnossa,N'importe quel boss active actions boss,Főgonosz halála megengedett a speciális pályákon,"Qualunque morte del boss per le azioni speciali consentita +Deathmatch Settings,GMPLYMNU_DEATHMATCH,,,,Nastavení deathmatche,Indstillinger for Deathmatch,Deathmatcheinstellungen,,Mortmatĉo-agordoj,Configuración modo a muerte,,Kuolonotteluasetukset,Options Deathmatch,,Deathmatch beállítások,Impostazioni deathmatch,デスマッチの設定,데스매치 설정,Deathmatch instellingen,Deathmatch-innstillinger,Ustawienia Deathmatchu,Configurações de Deathmatch,,Setări Deathmatch,Настройки боя насмерть,Детмеч подешавања,Inställningar för Deathmatch,Ölüm Maçı Ayarları, +Weapons stay,GMPLYMNU_WEAPONSSTAY,,,,Zbraně zůstávají,Våben forbliver,Waffen bleiben,,Armiloj restiĝas,Las armas se quedan,,Aseet pysyvät,Armes restent au sol quand prises,,Fegyverek mindig felvehetőek,Le armi rimangono in posizione,武器を取得時も残す,습득 후 무기가 남아있기,Wapenverblijven,Våpen forblir,Bronie zostają,Armas permanecem,,Părăsire arme după selectare,Оставлять оружие после подбора,Оружје се остаје након купљења,Vapen stannar kvar,Silahlar kalıyor, +Allow powerups,GMPLYMNU_ALLOWPOWERUPS,,,,Povolit bonusy,Tillad powerups,Boni erlauben,,Permesi plifortigaĵojn,Permitir poderes,,Salli tehostimet,Autoriser powerups,,Powerupok engedélyezése,Potenziamenti consentiti,パワーアップアイテムを出現させる,파워 업 허용,Power-ups toestaan,Tillat powerups,Pozwól na wzmocnienia,Permitir powerups,,Permite bonusuri,Разрешить бонусы,Дозволи бонусе,Tillåter powerups,Güçlendirmelere izin ver, +Allow health,GMPLYMNU_ALLOWHEALTH,,,,Povolit zdraví,Tillad sundhed,Gesundheit erlauben,,Permesi sanon,Permitir salud,,Salli terveysesineet,Autoriser objets santé,,Életerő engedélyezése,Oggetti per la salute consentiti,回復アイテムを出現させる,체력 회복 아이템 허용,Gezondheid toestaan,Tillat helse,Pozwól na przedmioty zdrowotne,Permitir itens de saúde,,Permite prim-ajutor,Разрешить здоровье,Дозволи бонусе за здравље,Tillåter hälsa,Sağlığa izin ver, +Allow armor,GMPLYMNU_ALLOWARMOR,,,Allow armour,Povolit brnění,Tillad rustning,Panzer erlauben,,Permesi kirason,Permitir armadura,,Salli panssariesineet,Autoriser objets armure,,Páncél engedélyezése,Armature consentite,アーマーを出現させる,아머 허용,Pantsertoeslag toestaan,Tillat rustning,Pozwól na pancerz,Permitir itens de armadura,,Permite bonusuri de armură,Разрешить броню,Дозволи оклоп,Tillåt rustning,Zırha izin ver, +Spawn farthest,GMPLYMNU_SPAWNFARTHEST,,,,Spawnovat hráče co nejdále od sebe,Spawn længst væk,Am weitesten entfernten Punkt erscheinen,,Ekaperi plej fore,Aparecer más lejos,,Herää henkiin kauimpaa,Apparaître au plus loin,,Legmesszebb születés,Spawn il più lontano possibile,他のプレイヤーから最遠の場所に復活,먼 곳에서 소환,Kuitschieten het verst verwijderd,Spawn lengst,Pojaw się jak najdalej,Surgimento mais longe,,Apariție cât mai departată de ceilalți,Воскрешение подальше от остальных,Оживљавање даље од других,Spawna längst bort,En uzakta yumurtla, +Same map,GMPLYMNU_SAMEMAP,,,,Stejná mapa,Samme kort,Gleiches Level,,Sama mapo,Mismo mapa,,Sama taso,Même Carte,,Ugyanazon pálya,Stessa mappa,同じMAPを繰り返す,같은 맵 플레이,Dezelfde kaart,Samme kart,Ta sama mapa,Mesmo mapa,,Reluare nivel,Зациклить уровень,Понављање нивоа,Samma karta,Aynı harita, +Force respawn,GMPLYMNU_FORCERESPAWN,,,,Vynutit respawn,Tvinge respawn,Zurückkehren erzwingen,,Devigi reekaperon,Forzar reaparición,,Pakota henkiinherääminen,Forcer Réapparition,,Újraszületés kényszerítése,Forza il respawn,死亡後に強制復活,강제 부활,Respawn is gedwongen,Force respawn,Wymuś ponowne pojawienie się,Forçar reaparecimento,,Reapariție instantă,Моментальное воскрешение,Форсирано оживљавање,Tvinga till återkomst,Yeniden doğmaya zorla, +Allow exit,GMPLYMNU_ALLOWEXIT,,,,Povolit ukončení levelu,Tillad at forlade,Verlassen erlauben,,Permesi eliron,Permitir salir,,Salli tasosta poistuminen,Autoriser Sortie,,Kijárat engedélyezése,Uscita consentita,出口の使用を許可,탈출 허용,Uitgang toestaan,Tillat utgang,Pozwól na wyjście,Permitir saída,,Permite ieșirea,Разрешить выход,Дозволи излазак из нивоа,Tillåter utgång,Çıkışa izin ver, +Barrels respawn,GMPLYMNU_BARRELSRESPAWN,,,,Barely se respawnují,Tønder respawner,Fässer kehren zurück,,Bareloj reekaperas,Reaparecer barriles,,Tynnyrit syntyvät takaisin,Réapparition des Tonneaux,,Hordók újraszületése,Respawn barili esplosivi,爆発バレルを復活させる,폭발통 재생성,Vaten respawn,Tønner respawn,Beczki pojawiają się ponownie,Barrís reaparecem,,Butoaiele reapar,Восстановление бочек,Бурад се ресетују,Tunnor återkommer,Variller yeniden doğar, +Respawn protection,GMPLYMNU_RESPAWNPROTECTION,,,,Ochrana po respawnu,Respawn-beskyttelse,Schutz beim Zurückkehren,,Protekto de reekapero,Reaparecer protección,,Henkiinheräämissuoja,Protection à la réapparition,,Újraszületési védelem,Protezione al respawn,復活したばかりのプレイヤーを保護,부활시 무적,Respawn bescherming,Respawn-beskyttelse,Ochrona przy ponownym pojawieniu się,Proteção de reaparecimento,,Protecție la apariția pe hartă,Кратковременная защита после воскрешения,Ресетује се заштита,Skydd för återstart,Yeniden doğma koruması, +Lose frag if fragged,GMPLYMNU_LOSEFRAG,,,,"Hráč ztratí frag, pokud je zabit",Mister frag hvis der er en fragged,Fragabzug bei Tod,,Perdi ludmurdon se ludmurdita,Perder baja al morir,,"Frägin menettäminen, jos joutuu frägätyksi",Perdre 1 frag quand tué,,Halál esetén pont veszítése,Perdere i frag se fraggato,キルされた場合は得点を失う,적에게 사망시 점수를 잃음,Verlies frag bij dood,Miste frag hvis fragged,Strać fraga jeśli jesteś sfragowany,Perder frag ao ser fragado,,Pierdere din victime la deces,Терять фраг при смерти,Изгубити гранату ако опаљена,Förlorar frag om du blir träffad,Parçalanırsa parça kaybeder, +Keep frags gained,GMPLYMNU_KEEPFRAGS,,,,Ponechávat fragy mezi levely,Beholde vundne frags,Frags zwischen Leveln behalten,,Teni ludmurdojn gajnitajn,Mantener bajas ganadas,,Pidä ansaitut frägit,Garder les frags gagnés,,Megszerzett pontok megmaradnak,Mantenere i frag vinti,MAP変更後も得点を保持する,맵 변경 시 점수 유지,Houd frags opgedaan,Behold frags vunnet,Zachowaj zdobyte fragi,Manter frags ganhos,,Păstrare număr victime,Сохранять фраги между уровнями,Задржати стечене гранате,Behåll de frags som vunnits,Kırıntıları kazanmaya devam edin, +No team switching,GMPLYMNU_NOTEAMSWITCH,,,,Uzamknout týmy,Ingen holdskifte,Kein Teamwechsel,,Neniu teamŝanĝado,No cambiar equipos,,Ei joukkueenvaihtoa,Pas de changement d'équipe,,Nincs csapatváltás,Nessun cambio di squadra,チーム変更を禁止,팀 변경 없음,Geen teamwisseling,Ingen lagbytte,Zakaz zmieniania drużyn,Desativar troca de time,Desativar troca de equipa,Nu permite schimbarea echipelor,Запретить переход между командами,Нема мешања тимова,Inget byte av lag,Takım değiştirme yok, +Cooperative Settings,GMPLYMNU_COOPERATIVE,,,,Nastavení co-op módu,Kooperativ indstillinger,Kooperativ-Einstellungen,,Agordoj de koopera reĝimo,Configuración de cooperativo,,Yhteispeliasetukset,Options Coopératives,,Együttműködő beállítások,Impostazioni cooperativa,協力モードの設定,협동 플레이 설정,Coöperatieve instellingen,Samarbeidsinnstillinger,Ustawienia Kooperacji,Configurações de jogo cooperativo,,Setări cooperative,Настройки совместной игры,Кооперативне поставке,Inställningar för samarbete,Kooperatif Ayarları, +Spawn multiplayer weapons,GMPLYMNU_MULTIPLAYERWEAPONS,,,,Spawnovat multiplayerově zbraně,Spawn multiplayer-våben,Deathmartch Waffen sind verfügbar,,Ekaperigi armilojn por plurludanta reĝimo,Aparecer armas multi.,,Kuolonotteluaseet saatavilla,Spawns d'armes deathmatch,,Többjátékos fegyverek engedélyezése,Fai apparire le armi di multigiocatore,マルチプレイ用の武器を出現させる,멀티플레이어 무기 소환,Spawn multi. wapens,Spawn flerspillervåpen,Zezwól na bronie trybu dla wielu graczy,Surgimento de armas em multijogador,,Permite apariția armelor din modul online,Появление оружия из сетевой игры,Створити мулти оружја,Spawna flerspelarvapen,Çok oyunculu silahları ortaya çıkarma, +Lose entire inventory,GMPLYMNU_LOSEINVENTORY,,,,Ztrácet celý inventář,Mister hele inventaret,Verliere ganzes Inventar,,Perdi tutan inventorion,Perder todo el inventario,,Menetä kaikki varusteet,Perdre l'inventaire,,Teljes készlet elvesztése,Perdere l'inventario,死亡時に全ての所持品を失う,인벤토리 비우기,Verlies van de volledige inventaris,Miste hele beholdningen,Utrać cały ekwipunek,Perder todo o inventário,,Pierdere inventar,Терять весь инвентарь при смерти,Изгубити цело складиште,Förlorar hela inventariet,Tüm envanteri kaybetmek, +Keep keys,GMPLYMNU_KEEPKEYS,,,,Ponechat klíče,Beholde nøgler,Schlüssel behalten,,Teni ŝlosiojn,Mantener llaves,,Pidä avaimet,Garder clés,,Kulcsok megtartása,Mantenere le chiavi,死亡後もキーを保持する,열쇠들을 소지하고 시작,Sleutels bewaren,Behold nøkler,Zachowaj klucze,Manter chaves,,Păstrare chei,Сохранять ключи,Задржати кључеве,Behåll nycklar,Anahtarları sakla, +Keep weapons,GMPLYMNU_KEEPWEAPONS,,,,Ponechat zbraně,Behold våben,Waffen behalten,,Teni armilojn,Mantener armas,,Pidä aseet,Garder armes,,Fegyverek megtartása,Mantenere le armi,死亡後も武器を保持する,무기들을 소지하고 시작,Wapens bewaren,Behold våpen,Zachowaj bronie,Manter armas,,Păstrare arme,Сохранять оружие,Задржати оружје,Behåll vapen,Silahları saklayın, +Keep armor,GMPLYMNU_KEEPARMOR,,,Keep armour,Ponechat brnění,Behold rustning,Rüstung behalten,,Teni kirason,Mantener armadura,,Pidä panssari,Garder armure,,Páncél megtartása,Mantenere l'armatura,死亡後もアーマーを保持する,아머를 소지하고 시작,Pantser bewaren,Behold rustning,Zachowaj pancerz,Manter armadura,,Păstrare armură,Сохранять броню,Задржати панцир,Behåll rustning,Zırhı sakla, +Keep powerups,GMPLYMNU_KEEPPOWERUPS,,,,Ponechat bonusy,Beholde powerups,Behalte Boni,,Teni plifortigaĵojn,Mantener poderes,,Pidä tehostimet,Garder powerups,,Powerupok megtartása,Mantenere i potenziamenti,死亡後もパワーアップを保持する,파워업을 소지하고 시작,Power-ups bewaren,Behold powerups,Zachowaj wzmocnienia,Manter powerups,,Păstrare bonusuri,Сохранять супербонусы,Задржати повећану моћ,Behåll powerups,Güçlendirmeleri sakla, +Keep ammo,GMPLYMNU_KEEPAMMO,,,,Ponechat munici,Beholde ammunition,Munition behalten,,Teni municion,Mantener munición,,Pidä ammukset,Garder munitions,,Muníció megtartása,Mantenere le ammunizioni,死亡後も弾薬を保持する,탄약을 소지하고 시작,Munitie bewaren,Behold ammunisjon,Zachowaj amunicję,Manter munição,,Păstrare armură,Сохранять патроны,Задржати муницију,Behålla ammunition,Cephaneyi sakla, +Lose half ammo,GMPLYMNU_LOSEHALFAMMO,,,,Ztratit polovinu munice,Mister halvdelen af ammunitionen,Halbe Munition verlieren,,Perdi duonon de onia municio,Perder la mitad de la munición,,Menetä puolet ammuksista,Perdre la moité des munitions,,Fele muníció elvesztése,Perdere metà ammunizioni,死亡時に弾を半分失う,탄약의 반을 잃음,Verlies halve munitie,Miste halv ammunisjon,Utrać pół amunicji,Perder metade da munição,,Pierdere jumătate din armură,Терять половину патронов,Изгубити пола муниције,Förlorar halva ammunitionen,Cephanenin yarısını kaybet, +Spawn where died,GMPLYMNU_SPAWNWHEREDIED,,,,Respawn na místě smrti,Spawn hvor du døde,Neuerscheinen wo gestorben,,Ekaperigi kie oni mortigis,Aparecer donde moriste,,Herää henkiin kuolinpaikalla,Réapparaitre sur lieu de mort,,Halál helyén újraszületés,Respawn nel luogo di morte,死亡したその場で復活,죽은 곳에서 소환,Kuit waar gestorven is,Gyte der du døde,Pojaw się znów tam gdzie zginąłeś,Surgir no local da morte,Reaparecer onde morreu,Apariție la locul decesului,Воскрешение на месте смерти,Оживљавање на месту смрти,Spawna där du dog,Öldüğü yerde yumurtlama, +Always spawn multiplayer objects,GMPLYMNU_ALWAYSSPAWNMULTI,,,,Vždy spawnovat multiplayerové objekty,Spawn altid multiplayer-objekter,Mehrspielerobjekte immer erzeugen,,Ĉiam ekaperi plurludantajn objektojn,Siempre hacer aparecer objetos en el modo multijugador,,Aina luo moninpelioliot,Toujours créer des objets multi-joueurs,,Mindig megjelennek a többjátékos tárgyak,Fai sempre apparire gli oggetti di multigiocatore,常にマルチプレイ用の物を出現,,Altijd multiplayer objecten spawnen,Alltid gyte flerspillerobjekter,Pozwól na przedmioty dla trybu wielu graczy,Permitir surgimento de objetos multijogador,,Permite apariția obiectelor din multiplayer,Появление объектов из сетевой игры,Увек стварајте објекте за више играча,Alltid spawna flerspelarobjekt,Her zaman çok oyunculu nesneler oluşturun, +Allow Vertical Bullet Spread,GMPLYMNU_NOVERTSPREAD,,,,Povolit svislý rozptyl střelby,Tillad lodret kuglespredning,Vertikale Streuung erlauben,,Permesi vertikalan kuglan disvastiĝon,Desparramar balas de todas las armas en vertical,,Permesu Vertikalan Kuglon Disvastiĝon ,Permettre la propagation verticale des balles,,Vertikális fegyverszórás engedélyezve,Permetti la diffusione dei proiettili in verticale,垂直方向への散弾を許可,,Verticale kogelspreiding toestaan,Tillat vertikal kulespredning,Pozwól na pionowy rozrzut pocisków,Permitir dispersão vertical das balas,,Permiteți răspândirea verticală a gloanțelor,Разрешить вертикальный разброс пуль,Дозволи вертикално ширење метака,Tillåt vertikal kulspridning,Dikey Mermi Yayılımına İzin Ver, +Weapons give extra ammo (DM),GMPLYMNU_NOEXTRAAMMO,,,,Zbraně dávají munici navíc (DM),Våben giver ekstra munition (DM),Waffen geben Extramunition,,Armiloj donas ekstran municion (DM),Las armas dan munición extra (DM),,Armiloj donas ekstran municion (DM),Les armes donnent des munitions supplémentaires (DM),,A fegyverek extra lőszert adnak (DM),Le armi danno munizioni extra (DM),武器に追加弾薬を付与 (DMのみ),,Wapens geven extra munitie (DM),Våpen gir ekstra ammunisjon (DM),Broń daje dodatkową amunicję (DM),Armas dão munição extra (DM),,Armele oferă muniție suplimentară (DM),Оружие даёт дополнительные патроны (бой насмерть),Оружје даје додатну муницију (ДМ),Vapen ger extra ammunition (DM),Silahlar ekstra cephane verir (DM), +Compatibility Options,OPTMNU_COMPATIBILITY,,,,Kompatibilita,Kompatibilitetsindstillinger,Kompatibilitätsoptionen,Ρυθμίσεις Συμβατότητας,Kongruo-agordoj,Opciones de compatibilidad,,Yhteensopivuusasetukset,Options de Compatibilité,,Kompatibilitási beállítások,Opzioni Compatibilità,互換性 オプション,호환 설정,Compatibiliteitsopties,Kompatibilitetsalternativer,Opcje Zgodności,Opções de compatibilidade,,Setări de Compatibilitate,Настройки совместимости,Компатибилност,Kompatibilitetsalternativ,Uyumluluk Seçenekleri, +Compatibility Options,CMPTMNU_TITLE,,,,Nastavení kompatibility,Kompatibilitetsindstillinger,Kompatibilitätsoptionen,Ρυθμίσεις Συμβατότητας,Kongruo-agordoj,Opciones de compatibilidad,,Yhteensopivuusasetukset,Options Compatibilité,,Kompatibilitási beállítások,Opzioni compatibilità,互換性 オプション,호환성 설정,Compatibiliteitsopties,Kompatibilitetsalternativer,Opcje Zgodności,Opções de compatibilidade,,Setări de Compatibilitate,Настройки совместимости,Компатибилна подешавања,Kompatibilitetsalternativ,Uyumluluk Seçenekleri, +Compatibility mode,CMPTMNU_MODE,,,,Režim kompatibility,Kompatibilitetstilstand,Kompatibilitätsmodus,,Kongruo-reĝimo,Modo de compatibilidad,,Yhteensopivuustila,Mode de compatibilité,,Kompatibilitási mód,Modalità compatibilità,互換性モード,호환 모드,Compatibiliteitsmodus,Kompatibilitetsmodus,Tryb Zgodności,Modo de compatibilidade,,Mod Compatibilitate,Режим совместимости,Компатибилни мод,Kompatibilitetsläge,Uyumluluk modu, +Actor Behavior,CMPTMNU_ACTORBEHAVIOR,,,Actor Behaviour,Objekty,Skuespilleradfærd,Verhalten der Akteure,,Aktorkonduto,Comportamiento del actor,,Olioiden käyttäytyminen,Comportement des Acteurs,,Actor viselkedés,Comportamento degli attori,アクターの挙動,개체 관련 설정,Gedrag van de acteur,Skuespilleroppførsel,Zachowanie Aktorów,Comportamento de atores,,Comportament actori,Поведение объектов (акторов),Понашање актора,Beteende hos skådespelare,Aktör Davranışı, +Friendly monsters aren't blocked,CMPTMNU_NOBLOCKFRIENDS,,,,Spojenecké příšery nejsou blokovány,Venlige monstre er ikke blokeret,Freundliche Monster werden nicht geblockt,,Amikaj monstroj ne estas baritaj,Monstruos amistosos no son bloqueados,,Myötämielisten hirviöiden esteetön liikkuminen,Monstres amicaux non bloqués,,Barátságos szörnyek nem blokkolódnak,I mostri amichevoli non sono bloccati,仲間キャラは敵通行不可ラインの影響を受けない,아군 개체는 BLOCK 선분 무시,Vriendelijke monsters worden niet geblokkeerd.,Vennlige monstre er ikke blokkert,Przyjazne potwory nie mogą być blokowane,Monstros aliados não são bloqueados,,Monștrii aliați nu pot fi blocați,Не блокировать дружественных монстров,Пријатељска чудовишта се не блокирају,Vänliga monster blockeras inte,Dost canavarlar engellenmez, +Limit Pain Elementals' Lost Souls,CMPTMNU_LIMITPAIN,,,,Omezit počet Ztrac. duší (Lost Souls) od Živlů (Pain Elementals),Grænse for tabte sjæle,Limit für Verlorene Seelen,,Limigi Perditajn Animojn de Doloro-Elementuloj,Limitar Almas Errantes de los Elementales del Dolor,,Rajoita kivun henkien kadonneitten sielujen määrää,Limiter âmes des élémentaires,,Kiköpött Elveszett Lelkek limitálása,Limita le Anime Erranti degli Elementali del dolore,ペインエレメンタルのロストソウル制限,로스트 소울 소환 21개로 제한,Beperk de Verloren Zielen van Pijn Elementairs,Begrens smertelementalers tapte sjeler,Ogranicz Zagubione Dusze Elementala Bólu,Limitar Almas Perdidas criadas por Elementais da Dor,,Limitează numărul Sufletelor Pierdute create de Elementalii Durerii,Ограничить число потерянных душ от элементалей боли,Ограничи изгубљене душе од елементала патње,Begränsa Pain Elementals förlorade själar,Acı Elementallerinin Kayıp Ruhlarını Sınırla, +Monster movement is affected by effects,CMPTMNU_MBFMONSTERMOVE,,,,Pohyb příšer je ovlivněn efekty,Monsterbevægelse er påvirket af effekter,Monsterbewegung wird von Effekten beeinflusst,,Monstromovado estas afektita per efektoj,Los efectos afectan al movimiento de los monstruos,,Tehosteet vaikuttavat hirviöiden liikkumiseen,Mouvement monstre affecté par effets,,Szörny sebesség függ az effektektől,Il movimento dei mostri è affetto dagli effetti,敵の移動が床の影響を受ける,구역의 이동 효과가 개체들에 영향,Monsterbeweging wordt beïnvloed door effecten,Monsterbevegelse påvirkes av effekter,Efekty wpływają na ruch potworów,Movimento dos monstros é afetado por efeitos,,Efectele afectează deplasarea monștrilor,Эффекты влияют на движение монстров,Ефекти утицају на покретљивост чудовишта,Monsterrörelse påverkas av effekter,Canavar hareketi etkilerden etkilenir, +Monsters cannot cross dropoffs,CMPTMNU_CROSSDROPOFF,,,,Příšery nemohou překročit výšiny,Monstre kan ikke krydse faldgruber,Monster können Abbruchkanten nicht überqueren,,Monstroj ne povas movi trans krutaĵojn,Los monstruos no pueden cruzar declives,,Hirviöt eivät voi ylittää pudotuksia,Monstres ne passent pas les corniches,,Szörnyek le tudnak esni a lejtőről,I mostri non posso attraversare gli spigoli,敵はdropoffを横切れない,개체들이 난간에서 추락 불가,Monsters kunnen geen dropoffs kruisen,Monstre kan ikke krysse dropoffs,Potwory nie mogą przekraczać spadków,Monstros não podem atravessar penhascos,,Monștrii nu pot trece peste prăpăstii,Монстрам нельзя пересекать уступы,Чудовишта не могу прећи падове,Monster kan inte korsa stupstockar,Canavarlar inişleri geçemez, +Monsters get stuck over dropoffs,CMPTMNU_DROPOFF,,,,Příšery se zasekávají na výšinách,Monstre bliver hængende over faldgruber,Monster bleiben auf Abbruchkanten hängen,,Monstroj ĉesiĝi super krutaĵoj,Los monstruos se atascan sobre declives,Los monstruos se atoran sobre declives,Hirviöt joutuvat jumiin pudotusten ylle,Monstres bloqués par les corniches,,Szörnyek nem mennek tovább a lejtőnél,I mostri rimangono bloccati sugli spigoli,敵がdropoffにスタックする,개체들이 난간에 끼일 수 있음,Monsters komen vast te zitten boven dropoffs,Monstre blir sittende fast over dropoffs,Potwory mogą utknąć nad spadkami,Monstros ficam presos em penhascos,,Monștrii înțepenesc peste prăpăstii,Монстры застревают на уступах,Чудовишта се заглављују на падовима,Monster fastnar över stupstockar,Canavarlar inişlerde sıkışıp kalıyor, +Monsters see invisible players,CMPTMNU_INVISIBILITY,,,,Příšery vidí neviditelné hráče,Monstre kan se usynlige spillere,Monster können unsichtbare Spieler sehen,,Monstroj povas vidi nevideblajn ludantojn,Los monstruos ven jugadores invisibles,,Hirviöt näkevät näkymättömät pelaajat,Monstres voient joueurs invisibles,,Láthatatlanság alatt is látható a játékos,I mostri vedono i giocatori invisibili,敵が透明を見破る,개체들이 투명 플레이어 감지 가능,Monsters zien onzichtbare spelers,Monstre ser usynlige spillere,Potwory widzą niewidzialnych graczy,Monstros enxergam jogadores invisíveis,,Monștrii pot vedea jucătorii invizibili,Монстры видят невидимых игроков,Чудовишта могу да виде невидљиве играче,Monster ser osynliga spelare,Canavarlar görünmez oyuncuları görür, +No Minotaur floor flames in water,CMPTMNU_MINOTAUR,,,,Minotauři nemohou tvořit plameny ve vodě,Ingen Minotaur gulvflammer i vand,Keine Minotaurus-Flammen im Wasser,,Neniuj plankfajroj de Mintaŭroj en akvo,Sin llamas de minotauro en el agua,,Ei minotaurien lattialiekkejä vedessä,Pas de feu de Massetaur sur l'eau,,Minotaurusz égő nyom nincs a vízben,Niente fiamme da terra del Minotauro sull'acqua,ミノタウロスの攻撃が水を通過しない,수면에서는 몰로타우어 지면화염 차단,Geen Minotaurus vloer vlammen in water,Ingen Minotaur-gulvflammer i vann,Brak płomieni Minotaura w wodzie,Desativar fogo do Marretauro na água,,Minotaurii nu pot folosi atacul de foc pe apă,Минотавры не создают огонь в воде,Минотаури не пале ватру у води,Ingen Minotaur golvlåga flammar i vatten,Suda Minotor zemin alevleri yok, +Spawn item drops on the floor,CMPTMNU_NOTOSSDROPS,,,,Spadlé předměty se objeví na zemi,Spawn-genstande falder på gulvet,Gegenstände erscheinen auf dem Fußboden,,Ekaperigi faligitajn objektojn sur la plankon,Aparecer objetos dejados en el suelo,,Synnytä esinepudotukset lattialle,Objets lâchés direct au sol,,Spawnolt tárgy a földön jelenik meg,Gli oggetti allo spawn cadono a terra,アイテムドロップが床に出る,아이템이 떨어질때 지면에 즉시 착지,Paaipunt druppels op de vloer,Spawn-element faller på gulvet,Obiekty pojawiają się na podłodze,Itens surgidos caem direto no chão,,Obiectele scăpate vor apărea la nivelul podelei,Выброшенные предметы создаются на земле,Одбачени предмети се појављују на поду,Spawner föremål faller på golvet.,Eşya yere düşer, +DehackEd Behavior,CMPTMNU_DEHACKEDBEHAVIOR,,,DehackEd Behaviour,DeHackEd,DehackEd Adfærd,DehackEd Verhalten,,Konduto de DehackEd,Comportamiento de DehackEd,,DehackEd-käyttäytyminen,Comportement DeHackEd,,DeHackEd viselkedés,Comportamento DehackEd,DehackEdの挙動,DehackEd 관련 설정,DehackEd Gedrag,DehackEd oppførsel,Zachowanie DehackEd,Comportamento DehackEd,,Comportament DehackEd,Поведение DeHackEd,DehackEd понашање,DehackEd-beteende,DehackEd Davranışı, +DEH health settings like Doom2.exe,CMPTMNU_DEHHEALTH,,,,Nastavení DEH jako v Doom2.exe,DEH sundhedsindstillinger som Doom2.exe,DEH Gesundheitseinstellungen wie in Doom2.exe,,DEH sanagordoj kiel Doom2.exe,Configuración de salud DEH como en Doom2.exe,,DEH-terveysasetukset kuin Doom2.exessä,Para. santé DEH comme Doom2.EXE,,DEH életerő beállítások mint a Doom2.exe esetében,Impostazioni di salute DEH come in Doom2.exe,Doom2.exe式のDEHヘルス設定,DEH 자체의 체력 최댓값 사용,DEH-gezondheidsinstellingen zoals Doom2.exe,DEH helseinnstillinger som Doom2.exe,Ustawienia zrowia DEH jak w Doom2.exe,Configurações de saúde de DEH como em Doom2.exe,,Setări sănătate în DEH precum în Doom2.exe,Настройки здоровья DEH как в Doom2.exe,DEH подешавања здравља као у Doom2.exe,DEH-hälsoinställningar som Doom2.exe,Doom2.exe gibi DEH sağlık ayarları, +Original A_Mushroom speed in DEH mods,CMPTMNU_MUSHROOM,,,,Původní rychlost pro A_Mushroom,Original A_Mushroom hastighed i DEH mods,Originale Berechnung für A_Mushroom,,Originala A_Mushroom rapideco en DEH-modifaĵoj,Velocidad original de A_Mushroom en mods con DEH,,Alkuperäinen A_Mushroom-nopeus DEH-modeissa,Vitesse A_Mushroom originale pour DEH,,Eredeti A_Mushroom sebesség a DEH modoknál,Velocità originale di A_Mushroom nei mod DEH,DEH Modでの元のA_Mushroom速度,A_Mushroom효과가 MBF 원본의 속력 사용,Originele A_Mushroom in DEH-modellen,Original A_Mushroom hastighet i DEH mods,Oryginalna prędkość A_Mushroom w modach DEH,Velocidade original do A_Mushroom em mods DEH,,Folosește viteza originală pentru A_Mushroom în DEH în moduri,Изначальная скорость A_Mushroom в мод. DEH,Оригинална брзина A_Mushroom в DEH модовима,Ursprunglig A_Mushroom-hastighet i DEH-modifieringar,DEH modlarında orijinal A_Mushroom hızı, +Map/Action Behavior,CMPTMNU_MAPACTIONBEHAVIOR,,,Map/Action Behaviour,Levely a akce,Map/Action Adfærd,Level/Aktionsverhalten,,Mapo/Ago-Konduto,Comportamiento Mapa/Acción,,Tason/Toimintojen käyttäytyminen,Comportement Niveau/Actions,,Pálya/Akció viselkedés,Comportamento Mappa/Azioni,マップ/アクションの挙動,맵/동작 관련 설정,Kaart/Actiegedrag,Kart / handling oppførsel,Zachowanie Mapy/Akcji,Comportamento de Mapa/Ação,,Comportament hartă/actori,Поведение уровней/действий,Понашање нивоа/догађаја,Beteende för kartor/handlingar,Harita/Eylem Davranışı, +All special lines can block ,CMPTMNU_USEBLOCKING,,,,Veškeré akční čáry blokují použití hráčem,Alle specielle linjer kan blokere ,Alle Speziallinien blockieren Benutzung,,Ĉiuj el specialaj linioj povas bari je ,Todas las líneas especiales pueden bloquear ,,Kaikki erikoisviivat voivat tukkia -toiminnon,Toute ligne d'action bloque ,,Minden speciális sor blokkolhatja a parancsot,Tutte le linee speciali possono bloccare il comando ,全てのSpecial Linesがをブロック,특정 선상에 겹쳐있을 시 <사용> 무력화,Alle speciale lijnen kunnen blokkeren.,Alle spesielle linjer kan blokkere ,Wszystkie specjalne linie mogą blokować ,Todas as linhas especiais podem bloquear o comando ,,Toate liniile speciale pot bloca ,Все специальные линии могут блокировать использование,Све специјалне линије могу да блокирају ,Alla speciella linjer kan blockera ,Tüm özel hatlar engelleyebilir, +Allow any bossdeath for level special,CMPTMNU_ANYBOSSDEATH,,,,Smrt jakéhokoli bosse může aktivovat speciální akci levelu,Tillad enhver bossdeath for level special,Jeder Boss-Tod zählt für Spezialaktionen,,Permesi iun ajn estro-morton por nivelspecialo,Permitir cualquier muerte de jefe por especial de nivel,,Mikä tahansa pomokuolema lasketaan tason erikoistoiminnossa,N'importe quel boss active actions boss,,Főgonosz halála megengedett a speciális pályákon,"Qualunque morte del boss per le azioni speciali consentita ",いずれのBossdeathでもlevel specialを許可,어느 레벨에서든 BOSSDEATH 이벤트 허용,Laat een eventuele bossdood voor een speciaal niveau toe....,Tillat enhver bossdeath for nivå spesiell,Każda śmierć bossa liczy się jako akcja specjalna,Permitir qualquer morte de chefão para ação especial,Permitir qualquer morte de chefe para ação especial,Orice utilizare de A_BossDeath activează evenimente speciale în nivel,Любой вызов A_BossDeath активирует special уровня,Било који случај A_BossDeath активира special на нивоу,Tillåt alla bossdödsfall för specialnivå,Özel seviye için herhangi bir boss ölümüne izin ver, -Disable BOOM door light effect,CMPTMNU_NODOORLIGHT,,,,Zakázat světelný efekt dveří z BOOMu,Deaktivere BOOM dør lys effekt,Boom-Türlichteffekt deaktiviert.,,Malvalidigi pordlumo-efekton de BOOM,Desactivar efecto de luz de puerta de BOOM,,BOOM-ovivalotehoste pois käytöstä,Pas d'effet de lumière BOOM sur portes,A BOOM ajtó fény effekt kikapcsolása ,Disabilitato l'effetto Boom della luce della porta,BOOMドアライト エフェクトを無効化,붐 문간 조명보정 효과 끄기,BOOM-deurlichteffect uitschakelen,Deaktiver BOOM dør lyseffekt,Wyłącz efekt oświetlenia drzwi BOOM,Desabilitar efeito de luz de porta do BOOM,,Dezactivează efectele de lumină BOOM pentru uși,Отключить световой эффект из BOOM на дверях,Онемогући светлосни ефекат из BOOM-а на вратима,Inaktivera BOOM-dörrljuseffekten,BOOM kapı ışığı efektini devre dışı bırak, -Find neighboring light like Doom,CMPTMNU_LIGHT,,,Find neighbouring light like Doom,Nacházet nejbližší světlo jako Doom,Find nabo lys som Doom,Finde benachbartes Licht wie in Doom,,Trovi najbaran lumon kiel Doom,Encontrar luces vecinas como en Doom,,Etsi vierustava valo niin kuin Doom,Trouver prochaine texture comme DOOM,Szomszédos fényforrás keresése mint Doom-ban,Trova le luci vicine come in DOOM,DOOM式の最寄りライト検知,고전적인 조명추적 사용,Vind naburig licht zoals Doom,Finn nærliggende lys som Doom,Znajdź sąsiadujące światło jak w Doomie,Encontrar luz vizinha como em Doom,,Caută o sursă de lumină apropriată ca în Doom,Искать соседний источник света как в Doom,Нађи суседно светло као у Doom-у,Hitta närliggande ljus som Doom,Doom gibi komşu ışık bulun, -Find shortest textures like Doom,CMPTMNU_SHORTTEX,,,,Nacházet nejkratší textury jako Doom,Find korteste teksturer som Doom,Finde kurze Texturen wie in Doom,,Trovi la plej mallongajn tekstaĵojn kiel Doom,Encontrar texturas más cortas como en Doom,,Etsi lyhyimmät pintakuvioinnit niin kuin Doom,Trouver plus petite texture comme Doom,Legkisebb textúrák keresése mint Doom-ban,Trova le texture più piccole come in DOOM,DOOM式の最短テクスチャー検知,고전적인 텍스처분류 사용,Vind de kortste texturen zoals Doom,Finn korteste teksturer som Doom,Znajdź najkrótsze tekstury jak w Doomie,Encontrar menores texturas como em Doom,,Caută cele mai scurte texturi ca în Doom,Искать кратчайшие текстуры как в Doom,Нађи најкраће текстуре као у Doom-у,Hitta kortaste texturer som Doom,Doom gibi en kısa dokuları bulun, -Use buggier stair building,CMPTMNU_STAIRS,,,,Použít méně stabilní stavění schodů,Brug buggier trappe bygning,Benutze fehlerhafte Treppenbaufunktion,,Uzi pli ciman ŝtupo-konstruadon,Usar construcción defectuosa de escaleras,,Käytä viallisempaa portaanrakennusfunktiota,Construction d'escalier plus buggée,Bugosabb lépcsőépítés használata,Usa la struttura a scalinate più buggata,バグだらけの階段生成を使用,구형 계단상승 효과 사용,Gebruik buggier trapgebouw,Bruk buggier trappebygging,Użyj wadliwej funkcji budowania schodów,Usar construção defeituosa de escadas,,Utilizare mod de ridicare al scărilor incorect,Использовать неисправленное построение лестниц,Користи непоправљено грађење степеница,Använda en mer buggig trappbyggnad,Daha az doğru merdiven binası kullanın, -Use Doom's floor motion behavior,CMPTMNU_FLOORMOVE,,,Use Doom's floor motion behaviour,Použít původní chování Doomu pro pohyb podlah,Brug Dooms gulv bevægelsesadfærd,Benutze Dooms Verhalten für bewegende Böden,,Uzi konduton de Doom por plankmovo-konduto,Usar comportamiento de mov. del suelo de Doom,,Lattialiike käyttäytyy kuin Doomissa,Mouvement des sols à la DOOM,Doom jellegű padló mozgás,Adotta il comportamento di DOOM per il movimento sul pavimento,DOOMでの床の動作挙動を使用,표면이나 천장이 서로 통과가 가능함,Gebruik Doom's vloer beweging vloer,Bruk Dooms gulvbevegelsesatferd,Użyj zachowanie ruchu podłogi Dooma,Usar comportamento de mov. do chão de Doom,,Utilizare comportament de mișcare al podelelor din Doom,Поведение движения по полу из Doom,Користи Doom-ово подно моционо понашање,Använd Dooms golvrörelsebeteende,Doom'un zemin hareketi davranışını kullanın, -Use Doom's point-on-line algorithm,CMPTMNU_POINTONLINE,,,,Použít původní algoritmus bod-na-čáře z Doomu,Brug Dooms point-on-line algoritme,Benutze Dooms Punkt-auf-Linie Algorithmus,,Uzi algoritmon de Doom por trovi punkton sur linio,Usar algoritmo de punto en línea de Doom,,Käytä Doomin piste viivalla -algoritmia,Algorithme point-sur-ligne de DOOM,Doom jellegű point-on-line algoritmus,Usa l'algoritmo del 'punto giacente sulla linea' di DOOM,DOOMでのポイントライン アルゴリズム を使用,구형 선상 지점 정의법 사용,Gebruik Doom's point-on-line-algoritme,Bruk Dooms punkt-på-nett-algoritme,Użyj algorytmu punktu na linii z Dooma,Usar algorítmo de ponto-em-linha de Doom,,Utilizare algoritm point-on-line din Doom,Использовать алгоритм «точка на линии» из Doom,Користи Doom-ов point-on-line алгоритам,Använda Dooms algoritm för punkt-till-linje-arbete,Doom'un point-on-line algoritmasını kullanın, -Level exit can be triggered more than once,CMPTMNU_MULTIEXIT,,,,Odchod z levelu může být spuštěn vícekrát,Level exit kan udløses mere end én gang,Ausgang kann mehr als einmal aktiviert werden,,Nivelelirejo povas esti ekagigita pli ol unufoje,La salida de nivel puede ser activada más de una vez,,Tasosta poistumisen voi laukaista useammin kuin kerran,Sortie niveau utilisable plusieures fois,Pálya kijárat többször is triggerelhető,L'uscita del livello può attivarsi più di una volta,Exitを複数回起動出来る,레벨 출구 트리거 한 번 이상 작동,Niveau-uitgang kan meer dan eens worden geactiveerd,Nivåutgang kan utløses mer enn én gang,Wyjście z poziomu może być uruchomione więcej niż raz,Saída de fase pode ser ativada mais de uma vez,Saída de nível pode ser ativada mais de uma vez,Ieșirea nivelului poate fi activată de mai multe ori,Выходы могут быть активированы более одного раза,Излаз нивоа може бити активиран више пута,Nivåutgång kan utlösas mer än en gång,Seviye çıkışı birden fazla kez tetiklenebilir, -Physics Behavior,CMPTMNU_PHYSICSBEHAVIOR,,,Physics Behaviour,Fyzika,Fysik-adfærd,Physik-Verhalten,,Fizikokonduto,Comportamiento de la física,,Fysiikan käyttäytyminen,Comportement Physique,Fizika viselkedés,Comportamento della fisica,物理の挙動,물리 관련 설정,Fysica gedrag,Fysikkoppførsel,Zachowanie Fizyki,Comportamento de Física,Comportamento das Físicas,Comportament fizică,Поведение физики,Физичко понашање,Fysikbeteende,Fiziksel Davranış, -Actors are infinitely tall,CMPTMNU_NOPASSOVER,,,,Objekty jsou nekonečně vysoké,Aktører er uendeligt høje,Akteure sind unendlich hoch,,Aktoroj estas senfine altaj,Los actores son infinitamente altos,,Oliot ovat äärettömän korkeita,Hauteur des acteurs infinie,Személyek végtelen magasak,Gli attori sono infinitamente alti,アクターの上下には入れない,무한으로 키가 큰 개체,Acteurs zijn oneindig lang,Skuespillere er uendelig høye,Aktorzy są nieskończenie wysocy,Atores são infinitamente altos,,Actorii au înălțime infinită,Объекты бесконечно высокие,Глумци су бесконачно велики,Aktörerna är oändligt höga.,Aktörler sonsuz uzunlukta, -Boom scrollers are additive,CMPTMNU_BOOMSCROLL,,,,Boom posuvníky jsou aditivní,Boom scrollers er additive,Boom-Scroller sind additiv,,Skrolantaj Teksturaj de Boom estas adicia,Los scrollers de Boom son aditivos,,Boom-vierittimet ovat additiivisia,Glisseurs BOOM additifs,Boom scroller-ek összeadódnak,Le barre di scorrimento BOOM sono additivi,BOOM型スクロール床を適用,붐 스크롤러 누적법 사용,Boom scrollers zijn additief,Boom scrollere er additive,Przewijane tekstury Boom są addytywne,Scrollers de Boom são aditivos,,Elementele derulante BOOM sunt aditive,Конвейеры из BOOM складываются с собой,Boom скролери су додаци,Boom scrollers är additiva,Bom kaydırıcıları katkı maddelidir, -Cannot travel straight NSEW,CMPTMNU_BADANGLES,,,,Nelze se pohybovat přímo na SJVZ,Kan ikke rejse lige NSØV,Bewegungsrichtungen direkt NSOW nicht möglich,,Ne eblas veturi rekte NSEW,Emular error de mal ángulo,,Liikkuminen puhtaasti pääilmansuuntiin mahdotonta,Direction pure NSEO impossible,Nem haladhat egyenes vonalban NSEW,Non si può viaggiare esattamente nelle direzioni cardinali,NSEW直進走法の不許可,전방위 방향으로 이동 불가,Kan niet rechtdoor reizen NZOW,Kan ikke reise rett NSØV,Pozwól na błąd złego kąta,Impossível se deslocar reto em direções cardeais,Impossível se deslocar em frente em direções cardeais,Interzice deplasarea liniară NSEW,Запрещено двигаться прямо на С/Ю/З/В,Немогуће путовати право на NSEW,Kan inte resa rakt NSÖV,Düz seyahat edemez KGDB, -Enable wall running,CMPTMNU_WALLRUN,,,,Povolit wall running (běhaní pomocí zdi),Aktiver vægløb,Ermögliche Wandrennen,,Ebligi kuradon sur muroj,Activar correr por muros,,Salli seinäjuoksu,Activer Wallrunning,Falon futás engedélyezése,Wall running abilitata,壁伝い走行を許可,벽면가속이동 허용,Wandloop mogelijk maken,Aktiver veggkjøring,Włącz szybkie bieganie wzdłuż ścian,Habilitar corrida por paredes,Permitir corrida pelas paredes,Permite fuga cu ajutorul pereților (Wallrun),Включить быстрый бег вдоль стен (wallrunning),Омогући пролажење кроз зида,Aktiverar väggkörning,Duvar çalışmasını etkinleştirin, -Raven scrollers use original speed,CMPTMNU_RAVENSCROLL,,,,Raven posuvníky používají původní rychlost,Raven scrollers bruger original hastighed,Raven-Scroller benutzen originale Geschwindigkeit,,Skrolantaj teksturoj de Raven uzas originalan rapidecon,Los scrollers de Raven usan la velocidad original,,Ravenin vierittimet liikkuvat alkuperäisnopeudella,Glisseurs Raven à leur vitesse originale,Raven scroller-ek eredeti sebességűek,Le barre di scorrimento Raven usano la velocità originale,Raven式スクロール床を原作準拠にする,구형 헤러틱/헥센 스크롤러 사용,Raven scrollers gebruiken originele snelheid,Raven scrollers bruker original hastighet,Przwijane tekstury podłogi Raven używają oryginalną prędkość,Scrollers da Raven usam velocidade original,,Elementele derulante Raven folosesc viteza originală,Конвейеры из Raven используют неизменённую скорость,Raven скролери користе оригиналну брзину,Raven-skrollers använder ursprunglig hastighet,Kuzgun kaydırıcılar orijinal hızı kullanır, -Self ref. sectors don't block shots,CMPTMNU_TRACE,,,,Sebe-odkazující sektory neblokují střely,Selvreflekterende sektorer blokerer ikke for skud,Selbstreferenzierende Sektoren blockieren keine Schüsse,,Sinreferencantaj sektoroj ne baras pafojn,Sectores autoreferidos no bloquean los disparos,,Itseensä viittaavat sektorit eivät estä laukauksia,Secteur autoréférencé ne bloque pas les tirs,Saját ref.sektorok nem blokkkolják a lövéseket,Settori autoreferenziati non bloccano i colpi,Self ref.Sectorsは射撃を阻害しない,자기 참조 섹터가 총탄을 막지 않음,Zelfreferentie sectoren blokkeren geen schoten,Selvrefererende sektorer blokkerer ikke skudd.,Sektory odnoszoce się do siebie nie blokują strzałów,Setores autorreferidos não bloqueiam tiros,,Sectoarele cu referință proprie blochează focurile,Самоссылающиеся секторы не блокируют выстрелы,Самореф. сектори не блокирају пуцњеве,Självbetjäningssektorer blockerar inte skott.,Kendi kendine hakemlik yapan sektörler atışları engellemez., -Use Doom code for hitscan checks,CMPTMNU_HITSCAN,,,,Použít původní Doom kód pro kontrolu hitscanů,Brug Doom-code til hitscan-kontrol,Benutze Original-Doom-Code für Hitscan-Checks,,Uzi kodon de Doom por batskanoj-kontrolado,Usar código de Doom para revisión de hitscan,,Käytä Doomin osumislaskentakoodia,Vérification Hitscan à la DOOM,Doom kód használata a hitscan ellenőrzéshez,Usa il codice DOOM per il controllo sugli hitscan,DOOM式の即着弾判定を使用,구형 총탄 판정법 사용,Gebruik Doom-code voor hitscancontroles,Bruk Doom-kode for treffkontroll,Użyj kod Dooma dla hitscanu,Usam código de Doom para verificação de hitscan,Usar código de Doom para verificação de hitscan,Utilizează cod din Doom pentru a verifica coliziunea focurilor,Использовать код из Doom для проверок зон мгновенного попадания (hitscan),Користи Doom код за хитскен проверу,Använd Doom-kod för hitscan-kontroller,Hitscan kontrolleri için Doom kodunu kullanın, -Use Doom heights for missile clipping,CMPTMNU_MISSILECLIP,,,,Použít původní výšky z Doomu pro kolizi raket,Brug Doom-højder til missilklipper,Benutze Doom-Größen für Kollisionen mit Projektilen,,Uzi altojn de Doom por misilo-tonadoj,Usar altura de Doom para desplazamiento de misiles,,Käytä Doomin korkeuksia lentokappaleiden törmäyksissä,Clipping des missiles à la DOOM,Doom féle magasság használata a rakáta találathoz,Usa le altezze di DOOM per il clipping del razzo,ミサイル通過にDOOM heightsを使用,구형 발사체 판정법 사용,Gebruik Doom hoogtes voor het knippen van raketten,Bruk Doom-høyder for missilklipping,Użyj wysokości Dooma dla przenikania pocisków,Usar alturas de Doom para colisão de projéteis,,Utilizează metoda de verificare a înălțimilor din Doom,Использовать высоту из Doom для столкновения ракет,Користи Doom висине за клиповање ракета,Använd Doom-höjder för missilklippning.,Füze kırpma için Doom yüksekliklerini kullanın, -Rendering Behavior,CMPTMNU_RENDERINGBEHAVIOR,,,Rendering Behaviour,Vykreslování,Rendering Adfærd,Renderverhalten,,Bildigado-Konduto,Comportamiento de renderizado,,Hahmonnuksen käyttäytyminen,Comportement d'affichage,Renderelés viselkedése,Comportamento della grafica,レンダリングの挙動,렌더링 관련 설정,Rendering gedrag,Gjengivelse av oppførsel,Zachowanie Renderowania,Comportamento de Renderização,,Comportament Video,Поведение обработки,Понашање рендовања,Beteende vid rendering,Rendering Davranışı, -Draw polyobjects like Hexen,CMPTMNU_POLYOBJ,,,,Vykreslovat polyobjekty jako Hexen,Tegn polyobjekter som Hexen,Zeichne Polyobjekte wie in Hexen,,Desegni plurangulo-objektojn kiel Hexen,Dibujar poliobjetos como en Hexen,,Piirrä polyobjektit niin kuin Hexen,Dessiner les Polyobjets comme Hexen,Hexen féle tárgy kirajzolás,Polioggetti disegnati come Hexen,Hexen式のPolyObjects描画,구형 폴리오브젝트 시스템 사용,Teken polyobjecten zoals Hexen,Tegn polyobjekter som Hexen,Rysuj poliobiekty jak w Hexenie,Desenhar poliobjetos como em Hexen,,Afișează poliobiectele precum în Hexen,Отрисовка полиобъектов как в Hexen,Цртај поли-објекте као Hexen,Rita polyobjekt som Hexen,Hexen gibi çoklu nesneler çizin, -Ignore Y offsets on masked midtextures,CMPTMNU_MASKEDMIDTEX,,,,Ignorovat Y posuny na průhledných mid-texturách,Ignorer Y offsets på maskerede midtextures,Ignoriere Y-Offsets bei transparenten Mitteltexturen,,Malatenti Y-deŝovaĵojn sur maskitaj midtekstaĵoj,Ignorar offsets de eje Y en texturas medias enmascaradas,,Älä huomioi Y-siirroksia peitetyissä keskipintakuvioinneissa,Offsets Y ignorés sur les textures centrales,Függőleges mozgatás ignorálása a maszkolt midtextúráknál,Ignora gli offset Y sulle midtexture mascherate,マスクされた中間テクスチャーのY軸ずれを無効,이면선분의 중앙 텍스쳐의 Y축값 무시,Negeer Y compensaties op gemaskerde middentexturen,Ignorer Y-forskyvninger på maskerte mellomteksturer,Ignoruj przesunięcia osi Y na zamaskowanych teksturach po środku,Ignorar offsets de Y em texturas centrais,,Ignoră offsetul Y de pe texturile 3D mascate,Игнорировать смещение по вертикали на средних текстурах с маской,Игнориши Y нагиб на маскиране средње текстуре,Ignorera Y-förskjutningar på maskerade midtexturer.,Maskelenmiş orta dokularda Y ofsetlerini yoksay, -Invert sprite sorting,CMPTMNU_SPRITESORT,,,,Obrátit řazení spritů,Inverter sprite-sortering,Umgekehrte Spritesortierung,,Inversigi ordigadon de mov-rastrumoj,Invertir ordenado de sprites,,Käännä spritelajittelu,Ordres des sprites inversé,Sprite rendzés megfordítása,Ordinamento sprite invertito,反転スプライトの並び替え,구형 스프라이트 겹침 판정 사용,Sprite sorteren omkeren,Inverter sprite-sortering,Odwróć sortowanie sprite'ów,Inverter ordem de sprites,,Inversare sortare sprite-uri,Обратить порядок сортировки спрайтов,Обрнуто сортирање спрајтова,Invertera sprite-sortering,Sprite sıralamasını ters çevir, -Sound Behavior,CMPTMNU_SOUNDBEHAVIOR,,,Sound Behaviour,Zvuk,Adfærd med lyd,Sound-Verhalten,,Sonkonduto,Comportamiento de sonido,,Äänen käyttäytyminen,Comportement Sonore,Hang viselkedés,Comportamento suono,音の挙動,효과음 관련 설정,Geluidsgedrag,Lydoppførsel,Zachowanie dźwięku,Comportamento de Áudio,,Comportament Sunet,Поведение звуков,Понашање звука,Ljudbeteende,Ses Davranışı, -Cripple sound for silent BFG trick,CMPTMNU_SOUNDSLOTS,,,,Zmrzačit zvukový systém pro trik tichého BFG,Lyd forkrøblet ved lydløst BFG-trick,Amputiere Soundsystem für geräuschloses BFG,,Kripligi sonon por lertaĵo de silenta BFG,Estropear sonido para truco de BFG silencioso,,Rampauta äänijärjestelmä hiljaista BFG-temppua varten,Massacrer le son pour BFG silencieux,Bénító hang a halk BFG trükknél,Blocca il suono per il trucco del BFG silenzioso,消音BFG技の為にサウンドを重複させない,소음 BFG 효과 허용,Kreupel geluid voor een stille BFG-truc,Krymp lyd for stille BFG-triks,Obetnij dźwięk dla triku cichego BFG,Bloquear som para o truque da BFG silenciosa,,Taie sunetul pentru trucul BFG silențios,Ограничить звуки ради трюка бесшумной BFG,Онемогући звук за тихи ВЈП трик,Förlamning av ljudet vid tyst BFG-trick,Sessiz BFG numarası için sesi kısın, -Don't let others hear your pickups,CMPTMNU_SILENTPICKUP,,,,Ostatní tě neslyší sbírat předměty,Lad ikke andre høre dine pickupper,Andere können deine Gegenstandsaufnahmen nicht hören,,Ne lasi aliulojn aŭdas viajn prenadojn,No dejar a otros oír tus recogidas,,"Älä anna muiden kuulla, kun poimit esineitä",Autres joueurs n'entendent pas les ramassages,Mások ne hallhassák a tárgy felvételeidet,Non consentire agli altri giocatori di sentire le tue raccolte,他人にピックアップ音を聞かせない,상대방의 습득 효과음 청음 불가,Laat anderen uw pick-ups niet horen,Ikke la andre høre pickupene dine,"Nie pozwalaj by inni słyszeli, że podnosisz przedmioty",Não permitir que outros ouçam sua coleta de itens,Não permitir que outros ouçam sua aquisição de itens,Nu permite celorlalți să audă sunetul ridicării obiectelor,Запрещать другим слышать звук подбора предметов,Не допусти да други чују ваше скупљање,Låt inte andra höra dina pickuper,Başkalarının manyetiklerinizi duymasına izin vermeyin, -Inst. moving floors are not silent,CMPTMNU_SILENTINSTANTFLOORS,,,,Okamžitě pohybující se podlahy nejsou tiché,Inst. bevægelige gulve er ikke lydløse,Böden mit sofortiger Bewegung machen Geräusche,,Tujaj movantaj plankoj ne estas silentaj,Suelos inst. movibles no son silenciosos,,Silmänräpäyksellisesti liikkuvat lattiat eivät ole hiljaisia,Sols à movement instanté font du bruit,Halk isntant mozgó padló,I pavimenti istantanei in movimento non sono silenziosi,即時稼働するFloorsの音を鳴らさない,즉발식 이동표면 소음효과 제거,Direct bewegende vloeren zijn niet geruisloos,Øyeblikkelig bevegelige gulv er ikke stille,Nagle przesuwające się podłogi nie są ciche,Pisos que se deslocam instantâneamente emitem som,,Podelele care se mișcă instant nu sunt silențioase,Мгновенно двигающиеся полы не беззвучны,Инстантно покрећући нивои нису тихи,Inst. rörliga golv är inte tysta,Inst. hareketli zeminler sessiz değildir, -Sector sounds use center as source,CMPTMNU_SECTORSOUNDS,,,Sector sounds use centre as source,Sektorové zvuky používají jeho střed jako zdroj,Sektorlyde bruger centrum som kilde,Sektor-Sounds benutzen den Mittelpunkt des Sektors,,Sektorsonoj uzas centron kiel fonto,Sonidos de sector usan el centro como fuente,,Sektoriäänet käyttävät keskipistettä lähteenä,Sons secteur utilisent centre comme origine,Center forrás használata a szektor hangoknál,I suoni usano il centro dei settori come punto di sorgente,Sectorサウンドをフロア中央で鳴らす,섹터 중심부를 효과음의 원천으로 판정,Sectorgeluiden gebruiken centrum als bron,Sektorlyder bruker senter som kilde,Dźwięki sektorów używają środka jako źródła,Sons de setor são emitidos a partir do centro,,Sunetele sectoarelor au ca sursă centrul,Звуки секторов используют центр как источник,Секторски звукови су центрисани,Sektorljud använder centrum som källa,Sektör sesleri kaynak olarak merkezi kullanır, -Sounds stop when actor vanishes,CMPTMNU_SOUNDCUTOFF,,,,"Utnout zvuky, když jejich objekt zmizí","Lydene stopper, når aktøren forsvinder","Sounds werden beendet, wenn der Akteur verschwindet",,"Sonoj ĉesas, kiam aktoro malaperas",El sonido se detiene cuando el actor desaparece,,"Äänet lakkaavat, kun olio katoaa",Sons s'arrêtent quand acteur disparait,Hangok megszűnnek az eltűnéskor,I suoni si fermano quando gli attori svaniscono,アクター消滅で音を止める,효과음 원천 소멸 시 효과음도 중단,Geluiden stoppen wanneer de acteur verdwijnt,Lyder stopper når skuespilleren forsvinner,Dźwięki zatrzymują się kiedy aktor znika,Som para quando o ator desaparece,,Sunetele se opresc când actorul sursă dispare,Останавливать звуки при исчезновении объекта,Звукови престају кад глумац нестане,Ljudet upphör när aktören försvinner,Aktör ortadan kaybolduğunda sesler kesilir, -Use original sound target handling,CMPTMNU_SOUNDTARGET,,,,Použít původní chování pro uchování zvukového cíle,Brug original lydmålhåndtering,Benutze originale Behandlung für das Sound-Ziel,,Uzi originalan manipuladon por soncelo,Usar manejo de destino de sonido original,,Käytä alkuperäistä äänen kohteen käsittelyä,Ciblage des sons selon algorithme original,Eredeti hang célpont kezelés,Targeting dei suoni in base all'algoritmo originale,元のサウンドターゲット処理を使用,구형 섹터 경고음 보존법 사용,Gebruik originele geluidsdoelwitverwerking,Bruk original lydmålhåndtering,Użyj oryginalną obsługę celu dźwięku,Usar método original de destino de som,,Procesare originală pentru sursele de sunet,Неизменённая обработка источников звука,Користи оригинални звук руковања метом,Använd original ljudmålshantering,Orijinal ses hedefi kullanımını kullanın, -Scripted teleports don't trigger sector actions,CMPTMNU_TELEPORT,,,,Skriptované teleportace neaktivují sektorové akce,Scriptede teleporteringer udløser ikke sektorhandlinger,Teleports in Skripten lösen keine Sektoraktionen aus,,Skriptitaj teleportoj ne ekagigas sektor-agojn,Telepuertos por script no activan acciones del sector,,Käsikirjoitetut kaukosiirtimet eivät laukaise sektoritoimintoja,Téléports par scripts n'activent pas le secteur,Szkriptelt teleportok nem triggerelnek szektor műveletet,I teletrasporti scriptati non attivano le azioni del settore,スクリプトテレポートではSector actionsを起こさない,순간이동 스크립트는 섹터 이벤트 발동 불가능,De gescripte teleports leiden niet tot acties in de sector.,Skriptede teleporter utløser ikke sektorhandlinger,Oskryptowane teleporty nie włączają akcji sektora,Teletransportes scriptados não ativam ações de setor,,Teleportările scriptate nu declanșează acțiuni în sectoare,Скриптовые телепорты не запускают действия секторов,Скриптовани телепортери не активирају секторске радње,Skriptbaserade teleporter utlöser inte sektoråtgärder.,Komut dosyası ışınlanmaları sektör eylemlerini tetiklemiyor, -Non-blocking lines can be pushed,CMPTMNU_PUSHWINDOW,,,,Neblokující čáry mohou být zmáčknuty,Ikke-blokerende linjer kan skubbes,Nicht-blockende Linien können angestoßen werden,,Nehaltantaj linioj povas esti premitaj,Líneas sin bloquear pueden ser presionadas,,Ei-tukkivia viivoja voi työntää,Lignes non-bloquantes sont non-poussables,Nem blokkoló vonalak megnyomhatóak,Le linee non bloccanti possono essere spinti,Non-bloking linesを押せる,비차단 선분 밀어내기 가능,Niet-blokkerende lijnen kunnen worden geduwd,Ikke-blokkerende linjer kan skyves,Nieblokujące ściany mogą być pchnięte,Linhas não-bloqueadoras podem ser pressionadas,,Liniile care nu blochează pot fi împinse înapoi,Неблокирующие линии можно задействовать перемещением сквозь,Неблокирабе линје могу бити гурнуте,Linjer som inte blockerar kan skjutas,Engelleyici olmayan hatlar itilebilir, -Enable buggy CheckSwitchRange behavior,CMPTMNU_CHECKSWITCHRANGE,,,,Povolit nestabilní chování pro CheckSwitchRange,Aktiver den fejlbehæftede CheckSwitchRange-adfærd,Erlaube fehlerhaftes CheckSwitchRange Verhalten,,Ebligi cimajn kondutojn por CheckSwitchRange,Permitir comportamiento viejo de CheckSwitchRange,,Ota käyttöön viallinen CheckSwitchRange-käyttäytyminen,Fonction CheckSwitchRange buggée,Bugos CheckSwitchRange mechanika bekapcsolás,Abilita il comportamento buggato del CheckSwitchRange,バグのあるCheckSwitchRangeを許可,구형 CheckSwitchRange 판정법 사용,Buggy CheckSwitchSwitchRange gedrag inschakelen,Aktiver fejlbehæftet CheckSwitchRange-adfærd,Zezwól na zepsute zachowanie CheckSwitchRange,Permitir comportamento CheckSwitchRange defeituoso,,Comportament incorect pentru CheckSwitchRange,Включить ошибочное поведение CheckSwitchRange,Омогући баговано CheckSwitchRange понашање,Aktivera det felsägande CheckSwitchRange-beteendet,Hatalı CheckSwitchRange davranışını etkinleştirin, -Enable buggy Strife railing,CMPTMNU_RAILINGHACK,,,,Povolit nestabilní zábradlí ze Strifu,Aktiver buggy Strife railing,Fehlerhafte Strife-Geländer,Ενεργοποιηση σπασμένης συμπεριφοράς καγκέλον για το Strife,Ebligi ciman reladon de Strife,Activar barandillas bugueadas de Strife,,Ota käyttöön Strifen vialliset kaiteet,Barrières buggées pour Strife,Bugos Strife korlát bekapcsolása,Abilita il railing buggato di Strife,バグのあるStrife railingを許可,고전 스트라이프 철책 적용,Buggy mogelijk maken Strijk-reling,Aktiver fejlbehæftet Strife rekkverk,Włącz wadliwe bariery Strife'a,Permitir railing defeituoso do Strife,Permitir railing defeituoso do Strife,Utilizare comportament grilaj Strife incorect,Вернуть ошибочные перила в Strife,Омогући непоправљену ограду у Strife-у,Aktivera felande Strife-Räcken,Yanlış Strife korkuluğunu etkinleştirin, -No vertical thrust from explosions,CMPTMNU_EXPLODE1,,,,Exploze neodhazují do výšky,Ingen vertikal fremdrift fra eksplosioner,Keine vertikale Bewegung durch Explosionen,Καθόλου κατακόρυφη ώθηση απο εκρήξεις,Neniuj vertikalaj puŝoj de eksplodoj,No causar empuje vertical en explosiones,,Ei pystysuuntaista työntövoimaa räjähdyksistä,Explosions sans propulsion verticale,A robbanásnak nincs függőleges lökése,Nessuna spinta verticale dalle esplosioni,爆風は垂直方向全域に影響しない,폭발시 수직방향 반동 억제,Geen verticale stuwkracht van explosies,Ingen vertikal skyvekraft fra eksplosjoner,Brak pionowego nacisku od eksplozji,Desativar propulsão vertical das explosões,,Fără împingere verticală de la explozii,Взрывы не отбрасывают вверх/вниз,Нема вертикалног гурања од експлозија,Ingen vertikal dragkraft från explosioner,Patlamalardan kaynaklanan dikey itme yok, -Use original Doom explosion behavior,CMPTMNU_EXPLODE2,,,Use original Doom explosion behaviour,Používat původní chování explozí Doomu,Brug original Doom eksplosionsadfærd,Benutze Original Doom Explosionsverhalten,Συμπεριφορά εκρήξεων απο το πρωτότυπο Doom,Uzi originalan konduton de Doom por eksplodoj ,Usar comportamiento de explosiones del DOOM original,,Käytä Doomin alkuperäisiä räjähdysten käyttäytymissääntöjä,Utiliser comportement Doom original,Eredeti Doom robbanás mechanika használata,Usa l'originale comportamento dell'esplosione di DOOM,Doom本来の爆発動作を使用する,고전 둠의 폭발 반발력 적용,Gebruik het originele Doom explosiegedrag,Bruk original Doom-eksplosjonsatferd,Użyj oryginalnego zachowania eksplozji z Dooma,Usar comportamento original de explosões do Doom,,Utilizare comportament original pentru explozii,Использовать модель взрывов из Doom,Користи оригнално Doom понашање за експлозије,Använd det ursprungliga Doom-explosionsbeteendet,Orijinal Doom patlama davranışını kullanın, -,,player,,,,,,,,,,,,,,,,,,,,,,,,,, -Red,PLYRMNU_RED,,,,Červená,Rød,Rot,,Ruĝo,Rojo,,Punainen,Rouge,Piros,Rosso,赤の量,빨강,Rood,Rød,Czerwony,Vermelho,,Roșu,Красный,Црвева,Röd,Kırmızı, -Green,PLYRMNU_GREEN,,,,Zelená,Grøn,Grün,,Verdo,Verde,,Vihreä,Vert,Zöld,Verde,緑の量,초록,Groen,Grønn,Zielony,Verde,,Verde,Зелёный,Зелена,Grön,Yeşil, -Blue,PLYRMNU_BLUE,,,,Modrá,Blå,Blau,,Bluo,Azul,,Sininen,Bleu,Kék,Blu,青の量,파랑,Blauw,Blå,Niebieski,Azul,,Albastru,Синий,Плава,Blå,Mavi, -Class,PLYRMNU_PLAYERCLASS,,,,Třída,Klasse,Klasse,,Klaso,Clase,,Luokka,Classe,Kaszt,Classe,役職,클래스,Klasse,Klasse,Klasa,Classe,,Clasă,Класс,Класа,Klass,Sınıf, -Skin,PLYRMNU_PLAYERSKIN,,,,,,,,Aspekto,Aspecto,,Ulkoasu,,Kinézet,,外装,스킨,Uiterlijk,Hud,Wygląd,Aparência,,Textură,Облик,Скин,Hud,Cilt, -Switch on pickup,PLYRMNU_SWITCHONPICKUP,,,,Přepnout zbraň při sebrání,Tænd for pickup,Waffenwechsel bei Aufnahme,,Ŝanĝi armon ĉe preno,Elegir arma al coger una,Elegir arma al agarrar una,Vaihda uuteen aseeseen,Dernière arme,Felvételkor váltás,Cambio d'arma quando si riceve,武器取得時に持ち替え,무기 획득 시 바꿈,Gebruik wapen meteen na oppakken,Slå på pickup,Przełącz po podniesieniu,Mudar de arma ao pegar,,Schimbare armă la ridicare,Смена оружия при подборе,Пребаци на покупљено оружје,Slå på pickupen,Elinize aldığınızda silahı değiştirin, -Press \cjSPACE,PLYRMNU_PRESSSPACE,,,,Zmáčkni \cjMEZERNÍK,Tryk på \cjSPACE,\cjLeertaste,,Premu \cjSPACON,Presiona \cjEspacio,,Paina \cjVÄLI \cfnähdäk-,\cjEspace,Nyomj \cjSPACE -t,Premi \cjSPAZIO,\cjスペースキー,회전: \cjSPACE바,Druk op \cjSPACE,Trykk \cjSPACE,\cjSPACJA,Aperte \cjESPAÇO,,Apasă \cjSPACE,Нажмите \cjПРОБЕЛ,Притисните \cjSPACE,Tryck på \cjSPACE,\cjSPACE tuşuna basın, -to see front,PLYRMNU_SEEFRONT,,,,pro pohled zepředu,for at se forsiden,für Frontansicht,,por vidi vian antaŭon,para verte de frente,,sesi etupuolen,Pour L'Avant,Előre nézni,per vedere avanti,で前面を表示,캐릭터 앞모습,om de voorkant te zien,for å se forsiden,by widzieć przód,para ver a frente,,pentru a vedea fața,для просмотра спереди,да видите спреда,för att se framsidan,ön tarafı görmek için, -to see back,PLYRMNU_SEEBACK,,,,pro pohled zezadu,for at se bagsiden,für Rückansicht,,por vidi vian malantaŭon,para verte por detrás,,sesi takapuolen,Pour l'Arrière,Hátra Nézni,per vedere dietro,で背面を表示,캐릭터 뒷모습,om terug te kijken,for å se baksiden,by widzieć tył,para ver atrás,,pentru a vedea spatele,для просмотра сзади,да видите позади,för att se baksidan,geri görmek için, -Vertical Bullet Spread,PLYRMNU_VERTSPREAD,,,,Svislý rozptyl střelby,Lodret kuglespredning,Vertikale Streuung,,Vertikala Kugla Disvastiĝo,Dispersión vertical de la bala,,Pystysuora luodin leviäminen,Écartement vertical des balles,Vertikális fegyver szórás,Diffusione dei proiettili in verticale,垂直方向の散弾,,Verticale kogelspreiding,Vertikal kulespredning,Pionowy rozrzut pocisków,Dispersão vertical das balas,,Recul Vertical Gloanțe,Вертикальный разброс пуль,,Vertikal kulspridning,Dikey Mermi Yayılımı, -,,controls,,,,,,,,,,,,,,,,,,,,,,,,,, -Weapon Zoom,CNTRLMNU_ZOOM,,,,Přiblížení zbraně,Våbenzoom,Waffenzoom,Ζοομ,Armilzumo,Zoom del arma,,Aseen kiikaritähtäys,Zoom avec Arme,Ráközelítés fegyverrel,Zoom dell'arma,ズーム,무기 조준,Wapen Zoom,Våpen Zoom,Przybliżenie Broni,Zoom da Arma,,Zoom Armă,Приближение,Зум,Vapenzoom,Silah Yakınlaştırma, -Weapon State 1,CNTRLMNU_USER1,,,,Akce zbraně 1,Våbenstatus 1,Waffen-Aktion 1,Κατάσταση Όπλου 1,Armilstato 1,Estado del arma 1,,Aseen tila 1,Etat d'Arme 1,Fegyver 1. állapot,Stato dell'arma 1,武器特殊動作 1,무기 상태 1,Wapenstaat 1,Våpenstat 1,Stan Broni 1,Estado da Arma 1,,Poziție Armă 1,Функция первого оружия,Стање оружја (1),Vapen Åtgärd 1,Silah Durumu 1, -Weapon State 2,CNTRLMNU_USER2,,,,Akce zbraně 2,Våbenstatus 2,Waffen-Aktion 2,Κατάσταση Όπλου 2,Armilstato 2,Estado del arma 2,,Aseen tila 2,Etat d'Arme 2,Fegyver 2. állapot,Stato dell'arma 2,武器特殊動作 2,무기 상태 2,Wapenstaat 2,Våpenstat 2,Stan Broni 2,Estado da Arma 2,,Poziție Armă 2,Функция второго оружия,Стање оружја (2),Vapen Åtgärd 2,Silah Durumu 2, -Weapon State 3,CNTRLMNU_USER3,,,,Akce zbraně 3,Våbenstatus 3,Waffen-Aktion 3,Κατάσταση Όπλου 3,Armilstato 3,Estado del arma 3,,Aseen tila 3,Etat d'Arme 3,Fegyver 3. állapot,Stato dell'arma 3,武器特殊動作 3,무기 상태 3,Wapenstaat 3,Våpenstat 3,Stan Broni 3,Estado da Arma 3,,Poziție Armă 3,Функция третьего оружия,Стање оружја (3),Vapen Åtgärd 3,Silah Durumu 3, -Weapon State 4,CNTRLMNU_USER4,,,,Akce zbraně 4,Våbenstatus 4,Waffen-Aktion 4,Κατάσταση Όπλου 4,Armilstato 4,Estado del arma 4,,Aseen tila 4,Etat d'Arme 4,Fegyver 4. állapot,Stato dell'arma 4,武器特殊動作 4,무기 상태 4,Wapenstaat 4,Våpentilstand 4,Stan Broni 4,Estado da Arma 4,,Poziție Armă 4,Функция четвёртого оружия,Стање оружја (4),Vapen Åtgärd 4,Silah Durumu 4, -Fly / Swim up,CNTRLMNU_MOVEUP,,,,Letět / plavat vzhůru,Flyv / svøm op,Fliegen / Hochschwimmen,Πέτα/Κολύμπα πάνω,Flugi/Naĝi supren,Volar/Nadar arriba,,Lennä / Ui ylös,Voler/Nager en haut,Repülés / Felfele úszás,Vola / Nuota in alto,飛行/水泳時 上昇,위로 날기 / 해엄치기,Omhoog vliegen/zwemmen omhoog,Fly / Svøm opp,Lot / Pływanie w górę,Voar / Nadar para cima,,Zbor / Înot în Sus,Лететь/плыть вверх,Лети/пливај нагоре,Flyga/simma upp,Uç / Yüz yukarı, -Fly / Swim down,CNTRLMNU_MOVEDOWN,,,,Letět / plavat dolů,Flyv / svøm ned,Fliegen / Runterschwimmen,Πέτα/Κολύμπα κάτω,Flugi/Naĝi malsupren,Volar/Nadar abajo,,Lennä / Ui alas,Voler/Nager en bas,Repülés / Lefele úszás,Vola / Nuota in basso,飛行/水泳時 下降,아래로 날기 / 해엄치기,Naar beneden vliegen/zwemmen,Fly / Svøm ned,Lot / Pływanie w dół,Voar / Nadar para baixo,,Zbor / Înot în Jos,Лететь/плыть вниз,Лети/пливај надоле,Flyga/simma ner,Uç / Yüz aşağı, -Stop flying,CNTRLMNU_LAND,,,,Přestat létat,Stop flyvning,Landen,Σταμάτα πέταμα,Ĉesi flugadon,Dejar de volar,,Lopeta lentäminen,Arrêter de voler,Repülés abbahagyása,Stop al volo,飛行停止,비행 정지,Stoppen met vliegen,Slutt å fly,Przestań latać,Parar de voar,,Încetare Zbor,Приземлиться,Престани летети,Sluta flyga,Uçmayı bırak, -Keyboard look,CNTRLMNU_KEYBOARDLOOK,,,,Pohled klávesnicí,Tastatur-look,Tastatur-Blick,Κατακόρυφο κοίταχμα (Πλητρoλόγιο),Klavar-rigardo,Vista con teclado,,Näppäinkatselu,Vue au clavier,Billentyűzettel való nézelődés,Modalità vista con la tastiera,キー視点上下化,키보드 룩,Toetsenbordaanzicht,Tastatur utseende,Rozglądanie się klawiaturą,Vista com o teclado,,Utilizare Tastatură pentru a Privi în Jur,Обзор клавиатурой,Гледај тастатуром,Tangentbordsutseende,Klavye görünümü, -Strife Popup Screens Controls,CNTRLMNU_POPUPS_TITLE,,,,Ovládání vyskakovacích oken ve Strife,Strife Popup-skærme Kontrolelementer,Strife Popup Steuerung einstellen,,Ŝprucfenestraĵoj de Strife,Ventanas emergentes de Strife,,Strifen ponnahdusruutujen ohjausasetukset,Contrôles Popups Strife,Strife Felugró Ablak Irányítás,Controlli Schermate popup di Strife,Strifeポップアップ表示設定,스트라이프 팝업 화면 조작,Strife Popup Schermen Bediening,Strife Popup-skjermer Kontroller,Ustaw Klawisze Okienek Strife'a,Comandos de Popups do Strife,Controlos de Popups do Strife,Control pentru Mesaje Strife,Управление всплывающими окнами Strife,Искакајући прикази контроле у Strife-у,Strife Popup-skärmar Kontroller,Strife Açılır Ekran Kontrolleri, -Team say,CNTRLMNU_TEAMSAY,,,,Říct týmu,Team sige,Teamkommunikation,Πές στην ομάδα,Teama diro,Hablar al equipo,,Sano omille,Parler (équipe),Üzenet csapattársaknak,Parla nella squadra,チーム内発言,팀 채팅하기,Zeggen in team,Lag si,Powiedz do Drużyny,Fala (equipe),Falar à equipa,Vorbește cu Echipa Proprie,Сообщение команде,Пиши тиму,Laget säger,Ekip diyor ki, -Drop item,CNTRLMNU_DROPITEM,,,,Odhodit předmět,Smid genstand,Gegenstand fallen lassen,Πέτα Aντικείμενο,Faligi objekton,Soltar objeto,,Pudota varuste,Lâcher objet,Tárgy eldobása,Fai cadere l'oggetto,"アイテムを捨てる -",아이템 버리기,Item laten vallen,Slipp element,Upuść przedmiot,Largar item,,Aruncare Obiect,Бросить предмет,Баци предмет,Släpp föremål,Eşyayı bırak, -Query item,CNTRLMNU_QUERYITEM,,,,Informace o předmětu,Forespørgsel element,Informationen über Gegenstand,,Informpeti objekton,Consultar objeto,,Hae varustetta,Vérifier objet,Rákérdez a tárgy eldobásnál,Indaga sull'oggetto,アイテム名を表示,아이템 정보 표시,Vraag item op,Spør om element,Zapytaj o przedmiot,Consultar item,,Cercetare Obiect,Проверить предмет,Прикажи предмет,Fråga efter objekt,Sorgu öğesi, -Drop weapon,CNTRLMNU_DROPWEAPON,,,,Odhodit zbraň,Smid våben,Waffe fallen lassen,Πέτα Όπλο,Faligi armilon,Soltar arma,,Pudota ase,Lâcher arme,Fegyver eldobása,Butta l'arma,武器を捨てる,무기 버리기,Wapen laten vallen,Slipp våpen,Upuść broń,Largar arma,,Aruncare Armă,Выбросить оружие,Баци оружје,Släpp vapen,Silahı bırak, -Other,CNTRLMNU_OTHER,,,,Ostatní,Andre,Andere,Άλλα,Alia,Otros,,Muu,Autres,Más,Altro,その他,그 외 조작,Andere,Annet,Inne,Outro,,Altele,Прочее,Остало,Annat,Diğer, -Coop spy,CNTRLMNU_COOPSPY,,,,Co-op špehování,Coop-spion,Coop Spion,,Kunlabora spiono,Espía cooperativo,,Vakoile joukkuetovereita,Espionner Coéquiper,Coop leskelődés,Spia cooperativa,他者視点,멀티플레이 카메라,Coöpspion,Coop-spion,Śledź (kooperacja),Visualização coop,,Vedere prin Ochii Altui Jucător,Вид от другого игрока,Поглед од другог играча,Spion för samarbete,Coop casusu, -Strife Popup Screens,CNTRLMNU_POPUPS,,,,Vyskakovací okna Strife,Strife popup-skærme,Strife Popups,,Ŝprucfenestraĵoj de Strife,Ventanas emergentes de Strife,,Strifen ponnahdusruudut,Popups de Strife,Strife Felugró Ablakok,Schermate popup di Strife,Strife ポップアップ画面,스트라이프 팝업 화면,Strife Popup Schermen,Strife Popup-skjermer,Okienka Strife'a,Popup do Strife,,Mesaje Strife,Всплывающие окна Strife,Информација у Strife-у,Strife Popup-skärmar,Strife Açılır Ekranları, -Mission objectives,CNTRLMNU_MISSION,,,,Úkoly mise,Mål for en mission,Missionsziele,Στόχοι Αποστολής,Taskoceloj,Objetivos de misión,,Tehtävätavoitteet,Objectifs de Mission,Küldetési célok,Obiettivi della missione,ミッションオブジェクト,임무 목록,Missiedoelen,Oppdragets mål,Cele misji,Objetivos da missão,,Obiectivele Misiunii,Текущее задание,Циљ мисије,Mål för uppdraget,Görev hedefleri, -Keys list,CNTRLMNU_KEYS,,,,Seznam klíčů,Liste over nøgler,Schlüsselliste,Λίστα Κλειδιών,Ŝlosilolisto,Lista de llaves,,Avainlista,Liste des Clés,Kulcslista,Lista delle chiavi,キー類リスト,열쇠 목록,Lijst van toetsen,Liste over nøkler,Lista kluczy,Lista de teclas,,Listă Chei,Список ключей,Списка кључева,Lista över nycklar,Anahtar listesi, -Weapons/ammo/stats,CNTRLMNU_STATS,,,,Zbraně/munice/staty,Våben/ammo/stats,Waffen/Munition/Statistik,Οπλα/Πυρομαχικά/Στατιστικές,Armiloj/municio/stataĵoj,Armas/Munición/Estadísticas,,Aseet/ammukset/tila,"Statistiques, armes et munitions",Fegyver/lőszer/statisztika,Armi/ammunizioni/statistiche,武器 / 弾薬 / 状態,무기/탄약/통계 목록,Wapens/ammo/statistieken,Våpen/ammunisjon/statistikk,Bronie/amunicja/statystyki,Armas/munição/estatísticas,,Arme/muniție/statistici,"Оружие, патроны и показатели",Оружје/муниција/статистика,Vapen/ammo/statistik,Silahlar/mühimmat/istatistikler, -Toggle Scoreboard,CNTRLMNU_TOGGLESCOREBOARD,,,,Přepnout tabulku skóre,Skift Scoreboard,Punktetafel an/aus,Ενεργοποίηση Πίνακα Σκόρ,Baskuligi poentotabulon,Alternar Marcador,,Pistetaulun vaihtokytkin,Afficher Scores (alterner),Eredményjelző kapcsoló,Abilita/disabilita tabella punteggio,スコアボード切替,점수창 토글,Scorebord aan/uit,Veksle resultattavle,Włącz / Wyłącz tablicę wyników,Ativar/desativar placar,Ligar/desligar Pontuação no Ecrã,Comutator pentru Tabela de Marcaj,Таблица очков (перекл.),Табела (без држања),Växla resultattavla,Skor Tablosunu Değiştir, -Lookspring,MOUSEMNU_LOOKSPRING,,,,Automatické vystředění pohledu,Centret automatisk,Automatisch zentrieren,,Rigardsalto,Mirar con ratón,,Katseenpalautin,Recentrer après Vue Souris,,,視点水平化,마우스룩 시점 초기화,Automatisch centraliseren,Sentrer automatisk,Automatyczne Wyśrodkowanie,Centralizar automaticamente,Centrar automáticamente,Mișcare a jucătorului prin mouse,Передвижение мышью,Покрет мишем,Centrum automatiskt,Merkez otomatik olarak, -Lookstrafe,MOUSEMNU_LOOKSTRAFE,,,,Použít myš k pohybu do stran,Flyt sidelæns med musen,Seitwärts bewegen mit der Maus,,Rigardturnmovo,Mirar con movimiento,,Sivuttaisastuntapalautin,Mouvement Latéral par Souris,,,視点横移動化,마우스룩 좌우 이동,Zijwaartse muisbeweging,Flytt sidelengs med musen,Unikanie przy użyciu myszki,Deslocamento lateral com o mouse,Deslocamento lateral com o rato,Mișcare în diagonală cu mouse,Движение боком мышью,Стрејф мишем,Flytta i sidled med musen,Fare ile yana doğru hareket ettirin, -,,Map colors,,,,,,,,,,,,,,,,,,,,,,,,,, -Background,MAPCOLORMNU_BACKCOLOR,,,,Pozadí,Baggrund,Hintergrund,,Fono,Fondo,,Tausta,Fond,Háttér,Sfondo,背景,배경,Achtergrond,Bakgrunn,Tło,Fundo,,Fundal,Фон,Позадина,Bakgrund,Arka plan, -You,MAPCOLORMNU_YOURCOLOR,,,,Ty,Du,Du,,Vi,Tú,,Sinä,Votre couleur,Te,Tu,自分,당신,,Du,Ty,Você,Tu,Tu,Вы,Ти,Du,Sen, -1-sided walls,MAPCOLORMNU_WALLCOLOR,,,,Jednostranné zdi,1-sidede vægge,Einseitige Wände,,1-flankaj muroj,Paredes de 1 lado,,Yksipuoliset seinät,Murs à 1 côté,1 oldalú falak,Muri unilaterali,壁,단면 벽들,1-zijdige wanden,1-sidige vegger,Jednostronne ściany,Paredes de 1 lado,,Pereți cu o singură față,Односторонние стены,Једнострани зид,1-sidiga väggar,1 taraflı duvarlar, -2-sided walls with different floors,MAPCOLORMNU_FDWALLCOLOR,,,,Oboustranné zdi s různými podlahami,2-sidede vægge med forskellige gulve,Zweiseitige Wände mit unterschiedlicher Bodenhöhe,,2-flankaj muroj kun malsamaj plankoj,Paredes de 2 lados con pisos distintos,,Kaksipuoliset seinät eroavilla lattiakorkeuksilla,Murs à 2 côtés avec différents sols,2 oldalú falak különböző padlókkal,Muri bilaterali con pavimenti diversi,高低差のある床,다른 층 추가된 양면 벽들,2-zijdige wanden met verschillende vloeren,2-sidige vegger med forskjellige gulv,Dwustronne ściany z innymi piętrami,Paredes de 2 lados com pisos diferentes,,Pereți cu două fețe si podele diferite,Двусторонние стены,Двострани зид са различитим нивоима,2-sidiga väggar med olika golv,Farklı zeminlere sahip 2 taraflı duvarlar, -2-sided walls with different ceilings,MAPCOLORMNU_CDWALLCOLOR,,,,Oboustranné zdi s různými stropy,2-sidede vægge med forskellige lofter,Zweiseitige Wände mit unterschiedlicher Deckenhöhe,,2-flankaj muroj kun malsamaj plafonoj,Paredes de 2 lados con techos distintos,,Kaksipuoliset seinät eroavilla kattokorkeuksilla,Murs à 2 côtés avec différents plafonds,2 oldalú falak különböző plafonnal,Muri bilaterali con soffitti diversi,高低差のある天井,다른 천장 추가된 양면 벽들,2-zijdige wanden met verschillende plafonds,2-sidige vegger med forskjellige tak,Dwustronne ściany z innymi sufitami,Paredes de 2 lados com tetos diferentes,,Pereți cu două fețe si tavane diferite,Двусторонние стены с разными потолками,Двострани зид са различитим плафонима,2-sidiga väggar med olika tak,Farklı tavanlara sahip 2 taraflı duvarlar, -2-sided walls with 3D floors,MAPCOLORMNU_EFWALLCOLOR,,,,Oboustranné zdi s 3D podlahami,2-sidede vægge med 3D-gulve,Zweiseitige Wände mit 3D-Ebenen,,2-flankaj muroj kun 3D-plankoj,Paredes de 2 lados con suelos 3D,,Kaksipuoliset seinät kolmiulotteisilla lattioilla,Murs à 2 côtés avec sols 3d,2 oldalú falak 3D-s padlókkal,Muri bilaterali con 3D floor,多重床,3D 층 추가된 양면 벽들,2-zijdige wanden met 3D-vloeren,2-sidige vegger med 3D-gulv,Dwustronne ściany z piętrami 3D,Paredes de 2 lados com pisos 3D,,Pereți cu două fețe si podele 3D,Двусторонние стены с разными полами,Двострани зид са 3D нивоима,2-sidiga väggar med 3D-golv,3D zeminli 2 taraflı duvarlar, -Map grid,MAPCOLORMNU_GRIDCOLOR,,,,Mřížka,Kortgitter,Kartengitter,,Mapkrado,Cuadrícula del mapa,,Kartan ruudukko,Quadrillage,Pálya szél,Griglia mappa,マップグリッド,맵 격자,Kaart raster,Kartrutenett,Siatka mapy,Grade do mapa,Grelha do mapa,Grilă hartă,Цвет сетки,Мапа координатне мреже,Kartnät,Harita ızgarası, -Center point,MAPCOLORMNU_XHAIRCOLOR,,,Centre point,Středobod,Midterpunkt,Mittelpunkt,,Centra punkto,Punto central,,Keskipiste,Point Central,Pálya közepe,Punto centrale,中心点,중간 지점,Middenpunt,Midtpunkt,Środek,Ponto central,,Punct în centru,Курсор,Централна тачка,Centrumpunkt,Merkez noktası, -Not-yet-seen walls,MAPCOLORMNU_NOTSEENCOLOR,,,,Neobjevené zdi,"Vægge, der endnu ikke er synlige",Ungesehene Wände,,Vidotaj muroj,Paredes sin ver,,Tutkimattomat seinät,Murs non découvers,Még nem látott falak,Muri ancora da scoprire,未見の壁,안 본 벽들,Nog niet zichtbare wanden,Vegger som ennå ikke er sett,Jeszcze niewidziane ściany,Paredes não vistas até o momento,,Ziduri încă neobservate,Необнаруженные стены,Неоткривени зидови,Väggar som ännu inte har setts,Henüz görülmemiş duvarlar, -Locked doors,MAPCOLORMNU_LOCKEDCOLOR,,,,Zamčené dveře,Låste døre,Verschlossene Türen,,Ŝlositaj pordoj,Puertas bloqueadas,,Lukitut ovet,Portes verouillées,Zárt ajtók,Porte bloccate,鍵の掛かったドア,잠긴 문들,Gesloten deuren,Låste dører,Zablokowane drzwi,Portas trancadas,,Uși închise,Запертые двери,Закључана врата,Låsta dörrar,Kilitli kapılar, -Teleporter to the same map,MAPCOLORMNU_INTRALEVELCOLOR,,,,Teleportér,Teleporter til samme kort,Teleporter,,Teleportilo al la sama mapo,Teletransporte al mismo mapa,,Kaukosiirrin samaan tasoon,Téléporteurs (même niveau),Ugyanarra a pályára teleportálás,Teletrasporto nella stessa mappa,テレポーター,같은 맵에 텔레포터 추가,Teleporter naar dezelfde niveau,Teleporter til samme kart,Teleporter do tej samej mapy,Teletransportador para o mesmo mapa,,Teleportor către aceeași hartă,Телепорт в пределах уровня,Телепортер до истог нивоа,Teleporter till samma karta,Aynı haritaya ışınlayıcı, -Teleporter to a different map,MAPCOLORMNU_INTERLEVELCOLOR,,,,Teleportér do jiného levelu,Teleporter til et andet kort,Teleporter in ein anderes Level,,Teleportilo al alia mapo,Teletransporte a un mapa diferente,,Kaukosiirrin eri tasoon,Téléporteurs (autre niveau),Másik pályára teleportálás,Teletrasporto in una mappa diversa,別マップへのテレポーター,다른 맵에 텔레포터 추가,Teleporter naar een andere niveau,Teleporter til et annet kart,Teleporter do innej mapy,Teletransportador para outro mapa,,Teleportor către altă hartă,Телепорт на другой уровень,Телепортер до различитог нивоа,Teleporter till en annan karta,Farklı bir haritaya ışınlayıcı, -Secret sector,MAPCOLORMNU_SECRETSECTORCOLOR,,,,Skrýš,Hemmelig sektor,Geheimer Sektor,,Sekreta sektoro,Sector secreto,,Salasektori,Secteur Secret,Rejtekhely szektora,Settore segreto,シークレット,비밀 섹터,Geheime sector,Hemmelig sektor,Sekretny sektor,Setor secreto,,Sector secret,Тайный сектор,Тајни сектор,Hemlig sektor,Gizli sektör, -Unexplored secret,MAPCOLORMNU_UNEXPLOREDSECRETCOLOR,,,,Neobjevená skrýš,Uudforsket hemmelighed,nicht gefundener geheimer Sektor,,Neesplorita sekreto,Secreto sin explorar,,Tutkimaton sala,Secret non révélé,Még fel nem fedezett rejtekhely,Segreto non esplorato,未知のシークレット,발견하지 않은 비밀,Onontgonnen geheim,Uutforsket hemmelighet,Niezbadany sekret,Segredo não-explorado,,Secret neexplorat,Необнаруженный тайник,Ноткривена тајна,Oexploaterad hemlighet,Keşfedilmemiş sır, -Special trigger lines,MAPCOLORMNU_SPECIALWALLCOLOR,,,,Akční čáry,Særlige udløserlinjer,Spezielle Linien,,Specialaj ekagilo-linioj,Líneas especiales de activación,,Erikoislaukaisinviivat,Lignes d'actions spéciales,Speciális trigger vonalak,Linee di attivazione speciali,特殊トリガー,특수 트리거 선,Speciale trekkerlijnen,Spesielle utløserlinjer,Specjalne linie przełączników,Linhas de ativação especiais,,Linii declașatoare speciale,Специальные спусковые линии,Специјалне линије окидача,Särskilda utlösningslinjer,Özel tetik hatları, -Cheat Mode,MAPCOLORMNU_CHEATMODE,,,,Cheatovací režim,Snyd-tilstand,Cheat-Modus,,Tromp-Reĝimo,Modo de truco,,Huijaustila,Mode Cheat,Csalás mód,Modalità cheat,チートモード時,치트 모드,Bedriegingsmodus,Juksemodus,Tryb oszustwa,Modo trapaça,Modo de Batota,Modul Trișor,Чит-режим,Чит мод,Fuskläge,Hile Modu, -Invisible 2-sided walls,MAPCOLORMNU_TSWALLCOLOR,,,,Neviditelné oboustranné zdi,Usynlige 2-sidede vægge,Unsichtbare zweiseitige Wände,,Nevideblaj 2-flankaj muroj,Paredes de 2 lados Invisibles,,Näkymättömät kaksipuoliset seinät,Murs à 2 côtés invisibles,Láthatatlan 2 oldalú falak,Muri invisibili bilaterali,表示されないline,투명한 양면 벽,Onzichtbare 2-zijdige wanden,Usynlige 2-sidige vegger,Niewidzialne dwustronne ściany,Paredes invisíveis de 2 lados,,Pereți cu două fețe invizibili,Невидимые двусторонние стены,Невидљиви двострани зидови,Osynliga 2-sidiga väggar,Görünmez 2 taraflı duvarlar, -Secret walls,MAPCOLORMNU_SECRETWALLCOLOR,,,,Tajné zdi,Hemmelige vægge,Geheime Wände,,Sekretaj muroj,Paredes secretas,,Salaiset seinät,Murs Secrets,Titkos falak,Muri segreti,シークレットの壁,비밀 벽,Geheime muren,Hemmelige vegger,Sekretne ściany,Paredes secretas,,Pereți ascunși,Тайные стены,Тајни зидови,Hemliga väggar,Gizli duvarlar, -Actors,MAPCOLORMNU_THINGCOLOR,,,,Objekty,Skuespillere,Akteure,,Aktoroj,Actores,,Oliot,Acteurs,Játékos,Attori,アクター,개체,Acteurs,Skuespillere,Aktorzy,Atores,,Actori,Объекты,Актори,Skådespelare,Aktörler, -Monsters,MAPCOLORMNU_MONSTERCOLOR,,,,Příšery,Monstre,Monster,,Monstroj,Monstruos,,Hirviöt,Monstres,Szörnyek,Mostri,モンスター,적들,,Monstre,Potwory,Monstros,,Monștri,Монстры,Чудовишта,Monster,Canavarlar, -Non-counting Monsters,MAPCOLORMNU_NONCOUNTINGMONSTERCOLOR,,,,Nepočítané příšery,Ikke-tællende monstre,nicht gezählte Monster,,Nenombradaj Monstroj,Monstruos no contados,Monstruos sin contar,Ei-laskettavat hirviöt,Monstres non comptés,Nem számolt szörnyek,Mostri non contati,非カウントモンスター,킬수에 포함 되지 않는 적들,Niet-tellende Monsters,Ikke-tellende monstre,Niezliczane Potwory,Monstros não contados,,Monștri neacoperiți de numărătoare,Неучитываемые монстры,Не рачунајући чудовишта,Icke-räknande monster,Sayılamayan Canavarlar, -Friends,MAPCOLORMNU_FRIENDCOLOR,,,,Přátelé,Venner,Freunde,,Amikoj,Amigos,,Omat,Amis,Barátok,Amici,仲間,친구들,Vrienden,Venner,Przyjaciele,Amigos,,Prieteni,Дружественные,Пријатељи,Vänner,Arkadaşlar, -Items,MAPCOLORMNU_ITEMCOLOR,,,,Předměty,Genstande,Gegenstände,,Objektoj,Objetos,,Esineet,Objets,Tárgyak,Oggetti,アイテム,아이템들,Artikelen,Gjenstander,Przedmioty,Itens,,Obiecte,Предметы,Предмети,Föremål,Eşyalar, -Count Items,MAPCOLORMNU_COUNTITEMCOLOR,,,,Počítané předměty,Tælle genstande,gezählte Gegenstände,,Nombri Objektojn,Objetos contados,Conteo de objetos,Laske esineet,Objets comptés,Tárgyak számolása,Oggetti contati,カウント対象アイテム,아이템 계산,Tellen,Telle elementer,Zlicz przedmioty,Itens contados,,Numără obiectele,Учитываемые предметы,Рачунајући предмети,Räkna objekt,Sayım Öğeleri, -Overlay Mode,MAPCOLORMNU_OVERLAY,,,,Překryvný režim,Overlay-tilstand,Überlagerungsmodus,,Surmeto-Reĝimo,Modo sobrepuesto,,Projisointitila,Mode surimpression,Overlay mód,Modalità sovrapposizione,オーバーレイモード,오버레이 모드,Overlaadmodus,Overleggsmodus,Tryb Nakładki,Modo de sobreposição,,Mod acoperit,Прозрачный режим,Провидна аутомапа,Överlagringsläge,Kaplama Modu, -Overlay Cheat Mode,MAPCOLORMNU_OVCHEATMODE,,,,Překryvný cheatovací režim,Overlay snydetilstand,Überlagerungsmodus Cheats,,Surmeto-Tromp-Reĝimo,Sobreposición modo de truco,,Projisointihuijaustila,Mode Cheat Surimpression,overlay csaló mód,Modalità cheat sovrapposizione,オーバーレイ チートモード,치트 모드 오버레이,Overlaadmodus Cheats,Overlegg-juksemodus,Tryb Nakładki Oszustwa,Modo trapaça de sobreposição,Modo Batota de Sobreposição,Mod acoperit trișor,Прозрачный чит-режим,Провидни читови,Överlagrat fuskläge,Kaplama Hile Modu, -Portal Overlays,MAPCOLORMNU_PORTAL,,,,Portálové překryvy,Portal-overlejringer,Portalüberlagerung,,Portalo-Surmetoj,Sobreposición de portal,,Portaaliprojisoinnit,Portails superposés,Portál overlay-ek,Sovrapposizioni del portale,ポータル オーバーレイ,포탈 오버레이,Portaaloverlays,Portal-overlegg,Nakładanie się Portali,Sobreposição de portais,,Acoperiri portaluri,Порталы в прозрачном режиме,Провидни портали,Överlagringar i portalen,Portal Kaplamaları, -,,Messages,,,,,,,,,,,,,,,,,,,,,,,,,, -Messages,MSGMNU_TITLE,,,,Nastavení oznámení,Meddelelser,Nachrichten,,Mesaĝoj,Mensajes,,Viestit,,Üzenetek,Messaggi,メッセージ類,메시지들,Berichten,Meldinger,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке,Meddelanden,Mesajlar, -Show messages,MSGMNU_SHOWMESSAGES,,,,Zobrazit oznámení,Vis meddelelser,Zeige Nachrichten,,Montri mesaĝojn,Mostrar mensajes,,Näytä viestit,Afficher messages,Üzenetek mutatása,Mostra messaggi,メッセージ表示,메시지 표시,Berichten tonen,Vis meldinger,Pokaż wiadomości,Exibir mensagens,,Afișare mesaje,Отображение сообщений,Прикажи поруке,Visa meddelanden,Mesajları göster, -Show obituaries,MSGMNU_SHOWOBITUARIES,,,,Zobrazit oznámení o smrtích,Vis dødsannoncer,Zeige Todesanzeigen,,Montri nekrologojn,Mostrar obituarios,,Näytä kuolinviestit,Afficher avis de décès,Halálok mutatása,Mostra i necrologi,訃報表示,사망 메시지 표시,Doodsbrieven tonen,Vis dødsannonser,Pokaż nekrologi,Exibir obituários,,Afișare necrologuri,Отображение некрологов,Прикажи читуље,Visa dödsannonser,Ölüm ilanlarını göster, -Show secret notifications,MSGMNU_SHOWSECRETS,,,,Zobrazit zprávy o skrýších,Vis hemmelige meddelelser,Zeige Geheimnismeldung,,Montri sciigojn de sekretoj,Mostrar notificación de secretos,,Ilmoita salojen löytymisestä,Afficher secrets,Titkos üzenetek mutatása,Mostra le notifiche dei segreti,シークレット発見表示,비밀 알림 표시,Geheime meldingen tonen,Vis hemmelige meldinger,Pokaż wiadomości znalezienia sekretu,Exibir notificação de segredos,,Afișare notificări pentru secrete,Отображение сообщений о тайниках,Прикажи тајне нотификације,Visa hemliga meddelanden,Gizli bildirimleri göster, -Minimum message level,MSGMNU_MESSAGELEVEL,,,,Minimální úroveň oznámení,Mindste beskedniveau,Min. Nachrichtenanzeigestufe,,Minimuma nivelo de mesaĝoj,Nivel mínimo de mensaje,,Pienin viestintätaso,Niveau de message minimum,Milyen üzenet jelenjen meg,Numero di messaggi minimo,最小メッセージレベル,메시지 축소량,Minimaal berichtenniveau,Minste meldingsnivå,Poziom minimalnych wiadomości,Nível mínimo de mensagem,,Nivel minim de afișare mesaje,Минимальный уровень сообщений,Минимум левел порука,Minsta nivå för meddelanden,Minimum mesaj seviyesi, -Message Colors,MSGMNU_MESSAGECOLORS,,,Message Colours,Barva oznámení,Farver på meddelelser,Nachrichtenfarben,,Mesaĝkoloroj,Colores de los mensajes,,Viestien värit,Couleur des messages,Üzenet színek,Colore dei messaggi,メッセージ色,메시지 색상,Bericht Kleuren,Meldingsfarger,Kolory Wiadomości,Cores de mensagem,,Culori Mesaje,Цвета сообщений,Боје порука,Färger för meddelanden,Mesaj Renkleri, -Item Pickup,MSGMNU_ITEMPICKUP,,,,Sebrání předmětu,Afhentning af varer,Genommene Gegenstände,,Objektoprenado,Coger objetos,Agarrar objetos,Esineen poimiminen,Objets ramassés,Tárgy felvétele,Raccolta oggetti,アイテム取得,아이템 획득,Puntafhaling,Henting av element,Podniesienie Przedmiotu,Coleta de item,Aquisição de Itens,Ridicare obiecte,Подбор предмета,Покупити предмет,Upphämtning av objekt,Bir eşyayı almak, -Obituaries,MSGMNU_OBITUARIES,,,,Oznámení o úmrtí,Dødsannoncer,Todesanzeigen,,Nekrologoj,Obituarios,,Kuolinviestit,Avis de décès,Halálok,Necrologi,死亡時メッセージ,사망 메시지,Doodsbrieven,Nekrologer,Nekrologi,Obituários,,Necrologuri,Некрологи,Читуље,Dödsannonser,Ölüm İlanları, -Critical Messages,MSGMNU_CRITICALMESSAGES,,,,Kritická oznámení,Kritiske meddelelser,Kritische Nachrichten,,Gravaj Mesaĝoj,Mensajes críticos,,Tärkeät viestit,Messages d'erreur,Fontos üzenetek,Messaggi critici,致命的なメッセージ,중요한 메시지,Kritische berichten,Kritiske meldinger,Wiadomości krytyczne,Mensagens críticas,,Mesaje Critice,Важные сообщения,Критичне поруке,Kritiska meddelanden,Kritik Mesajlar, -Chat Messages,MSGMNU_CHATMESSAGES,,,,Chatová oznámení,Chat-meddelelser,Chatnachrichten,,Babilmesaĝoj,Mensajes del chat,,Keskusteluviestit,Message de Chat,Chat üzenetek,Messaggi chat,チャットメッセージ,채팅 메시지,Chatberichten,Chat-meldinger,Wiadomości czatu,Mensagens de chat,,Mesaje Conversație,Сообщения в чате,Ћаскања,Chatt-meddelanden,Sohbet Mesajları, -Team Messages,MSGMNU_TEAMMESSAGES,,,,Týmová oznámení,Hold-meddelelser,Teamnachrichten,,Teammesaĝoj,Mensajes del equipo,,Joukkueen viestit,Messages d'équipe,Csapat chat üzenetek,Messaggi chat di squadra,チームメッセージ,팀 채팅 메시지,Team Berichten,Team-meldinger,Wiadomości czatu drużynowego,Mensagens de equipe,Mensagens de Equipa,Mesajele Echipei Proprii,Командные сообщения в чате,Тимске поруке,Meddelanden till laget,Ekip Mesajları, -Centered Messages,MSGMNU_CENTEREDMESSAGES,,,Centred Messages,Oznámení na střed,Centrerede meddelelser,Zentrierte Nachrichten,,Centritaj Mesaĝoj,Mensajes centrados,,Keskitetyt viestit,Messages centrés,Üzenet középre igazítása,Messaggi centrati,スクリプトメッセージ,중간에 위치한 메시지,Gecentreerde berichten,Sentrerte meldinger,Wyśrodkowane wiadomości,Mensagens centralizadas,Mensagens Centradas,Mesaje Centrate,Центрированные сообщения,Централне поруке,Centrerade meddelanden,Merkezli Mesajlar, -Screenshot messages,MSGMNU_SCREENSHOTMESSAGES,,,,Oznámení o snímcích obrazovky,Beskeder med skærmbilleder,Screnshot-Meldungen,,Mesaĝoj de ekrankopio,Mensajes de captura de pantalla,,Kuvakaappausviestit,Messages de capture d'écran,Képernyőkép készítés visszajelzés,Messaggi di cattura schermo,スクショメッセージ,스크린샷 메시지,Screenshot berichten,Skjermbilde-meldinger,Wiadomości o zrobieniu zrzutu ekranu,Mensagens de captura de tela,Mensagen de captura de ecrã,Mesaje Capturi Ecran,Сообщения о снимках экрана,Скриншот поруке,Meddelanden med skärmdump,Ekran görüntüsü mesajları, -Detailed save messages,MSGMNU_LONGSAVEMESSAGES,,,,Detailní oznámení o uložené hře,Detaljerede beskeder om lagring,Detaillierte Speicher-Meldungen,,Detalaj konservmesaĝoj,Mensajes detallados de guardado,,Yksityiskohtaiset tallennusviestit,Messages de sauvegarde détailés,Részletes mentési információ,Messaggi sui dettagli di salvataggio,詳細なセーブメッセージ,자세한 저장 메시지,Gedetailleerde berichten voor op te slaan,Detaljerte lagringsmeldinger,Szczegółowe wiadomości o zapisie,Mensagens detalhadas de salvamento,Mensagens detalhadas de gravação,Mesaje detaliate pentru salvări,Подробные сообщения о сохранениях,Детаљно сачуване поруке,Detaljerade meddelanden om sparande,Ayrıntılı kaydetme mesajları, -Developer message mode,MSGMNU_DEVELOPER,,,,Vývojářská oznámení,Meddelelsestilstand for udviklere,Entwickler-Modus,,Reĝimo de mesaĝoj por programistoj,Modo de mensajes de desarrollador,,Pelinkehittäjäviestitila,Mode de Développement,Fejlesztői üzenetek,Modalità messaggi per sviluppatore,開発者用モード,개발자 메시지 모드,Berichtenmodus voor ontwikkelaars,Meldingsmodus for utviklere,Tryb wiadomości deweloperskich,Modo de mensagens de desenvolvedor,,Mod mesaje pentru dezvoltator,Режим сообщений для разработчиков,Поруке девелопера,Meddelandeläge för utvecklare,Geliştirici mesaj modu, -,,Automap,,,,,,,,,,,,,,,,,,,,,,,,,, -Map color set,AUTOMAPMNU_COLORSET,,,Map colour set,Barevné schéma,Farvesæt til kort,Farbset,,Mapkoloro-agordaĵo,Definir colores,,Kartan värikokoelma,Set de couleurs de la carte,Pálya térkép szín séma,Colori della mappa,地図色セット,맵 색상 설정,Kaartkleurenset,Kartfargesett,Zestaw kolorów mapy,Definir cores de mapa,,Set culori hartă,Цвета автокарты,Боје за мапу,Färgsättning av kartan,Harita renk seti, -Allow map defined colors,AUTOMAPMNU_CUSTOMCOLORS,,,Allow map defined colours,Povolit barvy dle modů,Tillad kortdefinerede farver,Erlaube levelspezifische Farben,,Permesi mapdefinitajn kolorojn,Permitir colores definidos,,Salli tason määrittelemät värit,Couleurs définies par carte,Pálya orientált színséma használata,Consenti i colori definiti dalla mappa,定義したマップ色の許可,맵 정의 색상 허용,Niveau-specifieke kleuren toestaan,Tillat kartdefinerte farger,Pozwól na kolory zdefiniowne przez mapę,Permitir cores definidas por mapa,,Permite culorilor să fie definite de hartă,Разрешить определённые уровнем цвета автокарты,Дозволи дефинисане боје за мапу,Tillåter kartdefinierade färger,Harita tanımlı renklere izin ver, -Set custom colors,AUTOMAPMNU_SETCUSTOMCOLORS,,,Set custom colours,Vlastní barvy,Indstil brugerdefinerede farver,Benutzerdefinierte Farben,,Agordi laŭmendajn kolorojn,Fijar colores personalizados,,Mukauta värejä,Choisir couleurs personnalisées,Egyéni színek beállítása,Modifica i colori personalizzati,カスタム色を決める,사용자 지정 색상 설정,Aangepaste kleuren instellen,Angi egendefinerte farger,Spersonalizuj kolory,Definir cores personalizadas,,Setare culori personalizate,Задать свои цвета,Промени боје,Ställ in egna färger,Özel renkleri ayarlama, -Customize map controls,AUTOMAPMNU_CONTROLS,,,,Ovládání mapy,Tilpas kontrolelementer til kortet,Automapsteuerung einstellen,,Adapti mapregilojn,Personalizar controles del mapa,,Kartanohjausasetukset,Choisir contrôles de la carte,Térkép irányítás testreszabása,Personalizza i controlli mappa,マップコントロール カスタマイズ,맵 조작 설정,Kaartcontroles aanpassen,Tilpass kartkontroller,Ustaw klawisze mapy,Configurar comandos de mapa,,Personalizare schemă de control a hărții,Управление автокартой,Промени контроле мапе,Anpassa kartkontroller,Harita kontrollerini özelleştirme, -Overlay automap,AUTOMAPMNU_OVERLAY,,,,Překryvná mapa,Overlay automap,Überlagere Automap,,Surmeti aŭtomatan mapon,Superponer automapa,,Projisoi automaattikartta,Carte en Surimpression,Képen felüli térkép,Copri l'automappa,オートマップを重ねる,오토맵을 오버레이,Overlay automap,Overlegg automatisk kart,Nałożenie mapy,Sobreposição de automapa,,Acoperire hartă computerizată,Прозрачная автокарта,Провидна аутомапа,Överlagring av automap,Yerleşim otomatik haritası, -Enable textured display,AUTOMAPMNU_TEXTURED,,,,Textury,Aktiver tekstureret visning,Texturanzeige,,Ŝalti teksturitan ekranon,Mostrar automapa texturizado,,Ota käyttöön pintakuvioinnit,Activer affichage texturé,Textúrázott térkép,Abilita la mostra texture,床テクスチャ表示を許可,텍스쳐 디스플레이 허용,Structuurweergave inschakelen,Aktiver teksturert visning,Włącz oteksturowanie mapy,Habilitar automapa texturizado,Permitir automapa texturizado,Activare mod texturat,Текстуры на автокарте,Омогући приказ текстура,Aktivera texturerad visning,Dokulu ekranı etkinleştir, -Show item counts,AUTOMAPMNU_SHOWITEMS,,,,Počet předmětů,Vis tællinger af emner,Zeige Gegenstandsanzahl,,Montri nombron de objektoj,Mostrar conteo de objetos,,Näytä esineiden lukumäärä,Afficher compte d'objets,Tárgy számláló mutatása,Mostra il conteggio degli oggetti,アイテム数 表示,주운 아이템의 갯수를 표시,Toon artikeltellingen,Vis antall elementer,Pokaż liczbę przedmiotów,Exibir contagem de itens,,Afișare numărătoare obiecte,Количество предметов,Прикажи бројач за предмете,Visa antal objekt,Öğe sayılarını göster, -Show monster counts,AUTOMAPMNU_SHOWMONSTERS,,,,Počet příšer,Vis monstertællinger,Zeige Monsteranzahl,,Montri nombron de monstroj,Mostrar conteo de monstruos,,Näytä hirviöiden lukumäärä,Afficher compte de monstres,Szörny számláló mutatása,Mostra il conteggio dei mostri,モンスター数 表示,죽인 적의 횟수 표시,Toon monstertellingen,Vis antall monster,Pokaż liczbę potworów,Exibir contagem de monstros,,Afișare numărătoare monștri,Количество монстов,Прикажи бројач за чудовишта,Visa antal monster,Canavar sayılarını göster, -Show secret counts,AUTOMAPMNU_SHOWSECRETS,,,,Počet skrýší,Vis hemmelige tællinger,Zeige Geheimnisanzahl,,Montri nombron de sekretoj,Mostrar conteo de secretos,,Näytä salojen lukumäärä,Afficher compte de secrets,Rejtekhely számláló mutatása,Mostra il conteggio dei segreti,シークレット数 表示,밝힌 비밀의 수 표시,Toon geheime tellingen,Vis hemmelige tellinger,Pokaż liczbę sekretów,Exibir contagem de segredos,,Afișare numărătoare secrete,Количество тайников,Прикажи бројач за тајне,Visa antalet hemligheter,Gizli sayıları göster, -Show time elapsed,AUTOMAPMNU_SHOWTIME,,,,Uplynulý čas na mapě,Vis den forgangne tid,Zeige vergangene Zeit,,Montri pasintan tempon,Mostrar tiempo transcurrido,,Näytä kulunut aika,Afficher temps passé,Eltöltött idő mutatása,Mostra il tempo trascorso,経過時間 表示,경과한 시간 표시,Verstreken tijd tonen,Vis medgått tid,Pokaż ile czasu upłynęło,Exibir tempo decorrido,,Afișare timp petrecut pe hartă,Прошедшее время,Прикажи протекло време,Visa förfluten tid,Geçen süreyi göster, -Show total time elapsed,AUTOMAPMNU_SHOWTOTALTIME,,,,Celkový uplynulý čas,"Vis den samlede tid, der er gået",Zeige Gesamtzeit,,Montri tutan pasintan tempon,Mostrar tiempo total transc.,,Näytä yhteensä kulunut aika,Afficher total de temps passé,Teljes eltelt idő mutatása,Mostra il tempo totale trascorso,統計時間 表示,누적 경과한 시간 표시,Toon de totale verstreken tijd,Vis total tid som har gått,"Pokaż całkowity czas, który upłynął",Exibir tempo total decorrido,,Afișare timp total petrecut în joc,Общее время,Прикажи укупно протекло време,Visa total tid som förflutit,Geçen toplam süreyi göster, -Show secrets on map,AUTOMAPMNU_MAPSECRETS,,,,Zobrazit skrýše,Vis hemmeligheder på kortet,Zeige Geheimnisse auf der Karte,,Montri sekretojn sur mapo,Mostrar secretos en el mapa,,Näytä salat kartalla,Afficher secrets sur carte,Rejtekhelyek mutatása a pályán,Mostra i segreti nella mappa,シークレットを地図に表示,맵의 비밀을 표시,Toon geheimen op de kaart,Vis hemmeligheter på kartet,Pokaż sekrety na mapie,Exibir segredos no mapa,,Afișare secrete,Тайники на карте,Прикажи тајне на аутомапи,Visa hemligheter på kartan,Haritada sırları göster, -Show map label,AUTOMAPMNU_SHOWMAPLABEL,,,,Zobrazit název mapy,Vis kortmærke,Zeige Levelnamen,,Montri mapetikedon,Mostrar etiqueta del mapa,,Näytä tason tunniste,Afficher label de carte,Pályacím mutatása,Mostra le etichette della mappa,マップ名 表示,맵의 이름 표시,Toon kaartlabel,Vis kartetikett,Pokaż etykietę mapy,Exibir etiqueta do mapa,,Afișare etichetă hartă,Название карты,Прикажи ознаку мапе,Visa kartans etikett,Harita etiketini göster, -Draw map background,AUTOMAPMNU_DRAWMAPBACK,,,,Pozadí mapy,Tegne kortbaggrund,Zeige Kartenhintergrund,,Desegni mapfondon,Dibujar fondo de mapa,,Piirrä tason tausta,Afficher fond d'écran carte,Térkép háttér kirajzolása,Mostra lo sfondo della mappa,マップの背景 描写,맵의 배경 출력,Teken de achtergrond van de kaart,Tegn kartbakgrunn,Rysuj tło mapy,Desenhar fundo do mapa,,Afișare fundal hartă,Отображение фона автокарты,Нацртај позадину мапе,Rita kartans bakgrund,Harita arka planı çizme, -Show keys (cheat),AUTOMAPMNU_SHOWKEYS,,,,Zobrazení klíčů (podvod),Vis nøgler (snyd),Zeige Schlüssel (Cheat),,Montri klavojn (trompo),Mostrar llaves (truco),,Näytä avaimet (huijauskeino),Afficher les clés (cheat),Kulcsok mutatása,Mostra le chiavi (cheat),鍵 表示(チート時),키를 표시 (치트),Toon sleutels (valsspeler),Vis nøkler (juks),Pokaż klucze (oszustwo),Exibir chaves (trapaça),,Afișare chei (trișare),Отображение ключей (чит-коды),Прикажи кључеве (чит),Visa nycklar (fusk),Tuşları göster (hile), -Show trigger lines,AUTOMAPMNU_SHOWTRIGGERLINES,,,,Zobrazení aktivujících čar,Vis trigger-linjer,Zeige Auslöserlinien,,Montri baskulliniojn,Mostrar líneas de activación,,Näytä laukaisinviivat,Afficher lignes d'action,Trigger vonalak mutatása,Mostra le linee d'attivazione,トリガーライン 表示,트리거 선을 표시,Triggerlijnen tonen,Vis utløserlinjer,Pokaż linie przełączników,Exibir linhas de ativação,,Afișare linii declanșatoare,Отображение спусковых линий,Прикажи триггер линије,Visa utlösningslinjer,Tetik çizgilerini göster, -Show things as sprites,AUTOMAPMNU_SHOWTHINGSPRITES,,,,Zobrazení objektů jako spritů,Vis ting som sprites,Zeige Dinge als Sprites,,Montri aĵojn kiel mov-rastrumojn,Mostrar cosas como sprites,,Näytä oliot spriteinä,Afficher objets comme sprites,Tárgyak sprite-ként megjelenítése,Mostra gli oggetti come sprite,thingsのスプライト表示,물체를 스프라이트로 표시,Toon dingen als sprites,Vis ting som sprites,Pokaż rzeczy jako sprite'y,Exibir objetos como sprites,,Afișare obiecte drept sprite,Отображение спрайтов объектов,Прикажи ствари као спрајтове,Visa saker som sprites,Nesneleri sprite olarak gösterme, -Overlay portals,AUTOMAPMNU_PTOVERLAY,,,,Překrývat portály,Overlay portaler,Überlagere Portale,,Surmeti portalojn,Sobreponer portales,,Projisoi portaalit,Superposer les portails,Overlay portálok,Sovrapponi i portali,オーバーレイ ポータルズ,포탈을 오버레이,Overlappende portalen,Overlegg portaler,Nałóż portale,Sobreposição de portais,,Acoperire portaluri,Порталы в прозрачном режиме,Провидни портали,Överlagra portaler,Yerleşim portalları, -Empty space margin,AUTOMAPMNU_EMPTYSPACEMARGIN,,,,Práh prázdného prostoru,Tomrumsmargin,Breite des Randes,,Malplena spacia marĝeno,Margen de espacio vacío,,Tyhjän reunan leveys,Marge d'espace vide,Üres hely szegély,Margine dello spazio vuoto,空間の余白,빈공간 여백,Breedte van de rand,Tøm mellomromsmargen,Opróżnij margines przestrzeni,Margem de espaço vazio,,Margine spațiu gol,Край автокарты,Празна маргина,Marginal för tomt utrymme,Boş alan marjı, -Mark font,AUTOMAPMNU_MARKFONT,,,,Písmo značek,Marker skrifttype,Zeichensatz für Markierungen,,Marki tiparon,Fuente para marcas,,Karttamerkkien fontti,Police Marqueur,Jelzés betűtípus,Font del segnaposto,マークフォント,미니맵 마킹 폰트,Font voor markers,Merk skrifttype,Czcionka oznaczeń,Fonte das marcações,,Font marcaj,Шрифт отметок,Фонт ознака,Markera typsnitt,Mark yazı tipi, -Mark color,AUTOMAPMNU_MARKCOLOR,,,,Barva značek,Markere farve,Farbe für Markierungen,,Marki koloron,Color de las marcas,,Karttamerkkien väri,Couleur Marqueur,Jelzés szín,Colore del segnaposto,マーク色,미니맵 마킹 색상,Markeer kleur,Merk farge,Kolor oznaczeń,Cor das marcações,,Culoare marcaj,Цвет отметок,Боја ознака,Markera färg,Renk işaretle, -Set mark,MAPCNTRLMNU_SETMARK,,,,Umístit značku,Indstille mærke,Setze Markierung,,Meti markon,Fijar marca,,Aseta merkki,Placer repère,Jelzés beállítása,Aggiungi segnaposto,マークを置く,마크 추가,Markering instellen,Sett merke,Ustaw znacznik,Posicionar marcação,,Marcare,Поставить отметку,Постави ознаку,Ställ in märket,İşareti ayarla, -Clear mark,MAPCNTRLMNU_CLEARMARK,,,,Smazat značky,Slet markering,Lösche Markierung,,Forigi markon,Limpiar marca,,Pyyhi merkit,Enlever repères,Jelzések törlése,Pulisci il segnaposto,マーククリア,마크 삭제,Duidelijke markering,Fjern merke,Usuń znacznik,Limpar marcação,,Ștergere marcaj,Убрать отметку,Уклони ознаку,Rensa markeringen,Açık işaret, -,,Scoreboard,,,,,,,,,,,,,,,,,,,,,,,,,, -Scoreboard Options,DSPLYMNU_SCOREBOARD,,,,Tabulka skóre,Indstillinger for resultattavlen,Punktetabellenoptionen,,Poentotabulo-Agordoj,Opciones de marcador,,Pistetauluasetukset,Options Tableau des Scores,Eredményjelző beállítások,Opzioni tabella punteggio,スコアボード オプション,점수창 설정,Scorebord opties,Alternativer for resultattavlen,Opcje Tablicy Wyników,Opções de Tela de Pontuação,,Opțiuni Tabelă de Marcaj,Таблица очков,Табеларне подешавања,Alternativ för resultattavlan,Skorbord Seçenekleri, -Scoreboard Options,SCRBRDMNU_TITLE,,,,Nastavení tabulky skóre,Indstillinger for resultattavlen,Punktetabellenoptionen,,Poentotabulo-Agordoj,Opciones de marcador,,Pistetauluasetukset,Tableau des Scores,Eredményjelző beállítások,Opzioni per la tabella punteggio,スコアボード オプション,점수판 설정,Scorebord opties,Alternativer for resultattavlen,Opcje Tablicy Wyników,Opções de Tela de Pontuação,Opções do Ecrã de Pontuação,Setări Tabelă de Marcaj,Настройки таблицы очков,Подешавања бодовања,Alternativ för resultattavlan,Skorbord Seçenekleri, -Cooperative Options,SCRBRDMNU_COOPERATIVE,,,,Kooperativní mód,Samarbejdsmuligheder,Kooperativ-Optionen,,Kooperativo-Agordoj,Opciones de cooperativo,,Yhteispeliasetukset,Options Mode Coop,Együttműködő beállítása,Opzioni per il gioco cooperativo,協力モードの設定,코옵 설정,Coöperatieve Opties,Samarbeidsalternativer,Opcje Kooperacji,Opções de Jogo Cooperativo,,Setări Mod Cooperativ,Настройки для команд,Подешавања сарадње,Alternativ för samarbete,Kooperatif Seçenekleri, -Enable Scoreboard,SCRBRDMNU_ENABLE,,,,Povolit tabulku skóre,Aktiver resultattavle,Punktetabelle aktiv,,Ŝalti Poentotabulon,Activar marcador,,Ota käyttöön pistetaulu,Activer Tableau des Scores,Eredményjelző bekapcsolása,Abilita la tabella punteggio,スコアボード表示,점수판 허용,Scorebord inschakelen,Aktiver resultattavle,Zezwól na Tablicę Wyników,Habilitar Tela de Pontuação,Permitir Ecrã de Pontuação,Activare Tabelă de Marcaj,Включить таблицу очков,Омогући бодовање,Aktivera resultattavlan,Skor Tablosunu Etkinleştir, -Header Color,SCRBRDMNU_HEADERCOLOR,,,Header Colour,Barva hlavičky,Overskriftsfarve,Kopfzeilenfarbe,,Kapokoloro,Color de cabecera,,Otsikon väri,Couleur du Titre,Fejléc szín,Colore della testata,ヘッダー色,헤더의 색깔,Kleur koptekst,Farge på topptekst,Kolor Nagłówka,Cor de Cabeçalho,,Culoare Antet,Цвет заголовка,Боја заглавља,Färg på rubriken,Başlık Rengi, -Your Player Color,SCRBRDMNU_YOURCOLOR,,,Your Player Colour,Barva tvého hráče,Din spillerfarve,Deine Spielerfarbe,,Via ludantkoloro,Color de tu jugador,,Pelaajasi väri,Votre couleur,Játékos színe,Colore del giocatore 'Tu',自分の色,플레이어의 색깔,Uw Spelerskleur,Din spillerfarge,Twoje Kolory,Cor do Seu Jogador,Cor do teu Jogador,Culoarea Jucătorului Tău,Ваш цвет,Боја твога играча,Din spelares färg,Oyuncu Renginiz, -Other Players' Color,SCRBRDMNU_OTHERPLAYERCOLOR,,,Other Players' Colour,Barva ostatních hráčů,Andre spilleres farve,Andere Spielerfarbe,,Koloro de aliaj ludantoj,Color de otros jugadores,,Muiden pelaajien väri,Couleur des autres joueurs,Más játékosok színe,Colore degli altri giocatori,他者の色,다른 플레이어들의 색깔,Andere spelerskleur,Andre spilleres farge,Kolory Innych Graczy,Cor de Outros Jogadores,Cor dos Outros Jogadores,Culorile Celorlalți Jucători,Цвет других игроков,Боја другог играча,Andra spelares färg,Diğer Oyuncuların Rengi, -Deathmatch Options,SCRBRDMNU_DEATHMATCH,,,,Deathmatch,Indstillinger for Deathmatch,Deathmatch-Optionen,,Mortmaĉo-Agordoj,Opciones modo a muerte,,Kuolonotteluasetukset,Options Deathmatch,Deathmatch Beállítások,Opzioni deathmatch,デスマッチの設定,데스매치 설정,Deathmatch opties,Deathmatch-alternativer,Opcje Deathmatchu,Opções de Deathmatch,,Setări Deathmatch,Настройки боя насмерть,Детмеч подешавања,Alternativ för Deathmatch,Ölüm Maçı Seçenekleri, -Team Deathmatch Options,SCRBRDMNU_TEAMDEATHMATCH,,,,Týmový deathmatch,Indstillinger for Team Deathmatch,Team-Deathmatch-Optionen,,Teamo-Mortmaĉo-Agordoj,Opciones modo a muerte por equipos,,Joukkuekuolonotteluasetukset,Options Deathmatch en équipe,Team Deathmatch Beállítások,Opzioni deathmatch a squadra,チームデスマッチの設定,팀 데스매치 설정,Team Deathmatch Opties,Lag Deathmatch-alternativer,Opcje Drużynowego Deathmatchu,Opções de Deathmatch de Equipe,Opções de Deathmatch de Equipa,Setări Deathmatch în Echipă,Настройки командного боя насмерть,Тимски детмеч подешавања,Alternativ för Team Deathmatch,Takım Ölüm Maçı Seçenekleri, -,,Alt HUD,,,,,,,,,,,,,,,,,,,,,,,,,, -Alternative HUD,ALTHUDMNU_TITLE,,,,Alternativní HUD,Alternativ HUD,Alternatives HUD,,Alternativa HUD,HUD alternativo,,Vaihtoehtoinen tilanäyttö,ATH Alternatif,Alternatív HUD,HUD alternativo,オルタナティブHUD,대체 HUD,Alternatieve HUD,Alternativ HUD,Alternatywny HUD,HUD alternativo,,Interfață pe Timp de Joc Alternativă,Альтернативное отображение информации,Алтернативни HUD,Alternativ HUD,Alternatif HUD, -Enable alternative HUD,ALTHUDMNU_ENABLE,,,,Povolit alternativní HUD,Aktiver alternativt HUD,Alternatives HUD eingeschaltet,,Ŝalti alternativan HUD,Activar HUD alternativo,,Ota käyttöön vaihtoehtoinen tilanäyttö,Activer l'ATH Alternatif,Alternatív HUD bekapcsolása,Abilita HUD alternativo,オルタナティブHUD有効,대체 HUD 사용,Alternatieve HUD inschakelen,Aktiver alternativ HUD,Włącz alternatywny HUD,Habilitar HUD alternativo,,Activează Interfața pe Timp de Joc Alternativă,Включить альтернативное отображение,Укључи алтернативни HUD,Aktivera alternativ HUD,Alternatif HUD'yi etkinleştirin, -Show secret count,ALTHUDMNU_SHOWSECRETS,,,,Zobrazit počet skrýší,Vis hemmelig optælling,Zeige Geheimniszähler,,Montri sekretonombron,Mostrar cont. de secretos,,Näytä salojen lukumäärä,Afficher compteur de secrets,Rejtekhely számláló mutatása,Mostra il conteggio dei segreti,シークレット数 表示,비밀 수 표시,Toon het aantal geheimen,Vis hemmelig antall,Pokaż liczbę sekretów,Exibir contagem de segredos,,Afișează numărul secretelor,Отображение обнаруженных тайников,Прикажи количину тајна,Visa hemligt antal,Gizli sayımı göster, -Show monster count,ALTHUDMNU_SHOWMONSTERS,,,,Zobrazit počet příšer,Vis monstertælling,Zeige Monsterzähler,,Montri monstronombron,Mostrar cont. de monstruos,,Näytä hirviöiden lukumäärä,Afficher compteur de monstres,Szörny számláló mutatása,Mostra il conteggio dei mostri,モンスター数 表示,적 개체 수 표시,Toon het aantal monsters,Vis antall monstre,Pokaż liczbę zabójstw,Exibir contagem de monstros,,Afișează numărul de monștri,Отображение количества монстров,Прикажи количину чудовишта,Visa antalet monster,Canavar sayısını göster, -Show item count,ALTHUDMNU_SHOWITEMS,,,,Zobrazit počet předmětů,Vis optælling af genstande,Zeige Gegenstandszähler,,Montri objektonombron,Mostrar cont. de objetos,,Näytä esineiden lukumäärä,Afficher compteur d'objets,Tárgy számláló mutatása,Mostra il conteggio degli oggetti,アイテム数の表示,아이템 수 표시,Toon het aantal items,Vis antall gjenstander,Pokaż liczbę przedmiotów,Exibir contagem de itens,,Afișează numărul de obiecte,Отображение количества предметов,Прикажи количину предмета,Visa antalet föremål,Öğe sayısını göster, -Show stamina and accuracy,ALTHUDMNU_SHOWSTATS,,,,Zobrazit výdrž a přesnost,Vis udholdenhed og nøjagtighed,Zeige Kondition und Genauigkeit,,Montri viglecon kaj akuratecon,Mostrar resistencia/precisión,,Näytä puhti ja tarkkuus,Afficher Endurance et Précision,Állóképesség és pontosság mutatása,Mostra stamina e accuratezza,スタミナと精度の表示,스테미나와 정확도를 표시,Toon uithoudingsvermogen en nauwkeurigheid,Vis utholdenhet og nøyaktighet,Pokaż wytrzymałość i precyzję,Exibir resistência e precisão,,Afișează rezistența fizică si acuratețea,Отображение выносливости и точности,Прикажи издржљивост и прецизност,Visa uthållighet och noggrannhet,Dayanıklılık ve doğruluk gösterin, -Show berserk,ALTHUDMNU_SHOWBERSERK,,,,Zobrazit berserk,Vis berserk,Zeige Berserk,,Montri frenezecon,Mostrar berserker,,Näytä raivo,Afficher Berserk,Berserk mutatása,Mostra il berserk,バーサーク表示,버서크 아이템을 표시,Toon berserk,Vis berserk,Pokaż szał,Exibir berserk,,Afișează pachetul de forță mărită,Отображение берсерка,Прикажи берсерк,Visa berserk,Berserk'i göster, -Show weapons,ALTHUDMNU_SHOWWEAPONS,,,,Zobrazit zbraně,Vis våben,Zeige Waffen,,Montri armojn,Mostrar armas,,Näytä aseet,Afficher Armes,Fegyverek mutatása,Mostra le armi,武器表示,무기들을 표시,Toon wapens,Vis våpen,Pokaż bronie,Exibir armas,,Afișează armele,Отображение оружия,Прикажи оружја,Visa vapen,Silahları göster, -Show ammo for,ALTHUDMNU_SHOWAMMO,,,,Zobrazit munici pro,Vis ammunition for,Zeige Munition,,Montri municion por,Mostrar munición para,,Näytä ammukset aseelle,Afficher Munitions pour,Ammo mutatása a,Mostra le munizioni per,弾薬等の表示,탄약을 표시,Toon munitie voor,Vis ammunisjon for,Pokaż amunicję dla,Exibir munição para,,Afișează muniția pentru,Отображение патронов для,Прикажи муниције за,Visa ammunition för,Cephane göster, -Show time,ALTHUDMNU_SHOWTIME,,,,Zobrazit čas,Vis tid,Zeige Zeit,,Montri tempon,Mostrar tiempo,,Näytä aika,Afficher temps niveau,Idő mutatása,Mostra il tempo,時間の表示,시간 표시,Toon tijd,Vis tid,Pokaż czas,Exibir tempo,,Afișează timpul,Отображение времени,Прикажи време,Visa tid,Gösteri zamanı, -Time color,ALTHUDMNU_TIMECOLOR,,,Time colour,Barva času,Tidens farve,Zeit-Farbe,,Tempkoloro,Color del tiempo,,Ajan väri,Couleur du timer,Idő színe,Colore del tempo,時間の字色,시간 색상,Tijdskleur,Tid farge,Kolor czasu,Cor do tempo,,Culoare timp,Цвет времени,Боја времена,Tidens färg,Zaman rengi, -Show network latency,ALTHUDMNU_SHOWLAG,,,,Zobrazit latenci sitě,Vis netværksforsinkelse,Zeige Netzwerk-Latenz,,Montri reto-respondotempon,Mostrar latencia de red,,Näytä verkon viive,Afficher latence réseau,Válaszidő mutatása,Mostra la latenza del network,ネットのラグ表示,내트워크 트래픽 표시,Toon netwerklatentie,Vis nettverksforsinkelse,Pokaż czas oczekiwania sieci,Exibir latência de rede,,Afișează perioada de întârziere a conexiunii,Отображение задержки сети,Прикажи кашњење мреже,Visa nätverksfördröjning,Ağ gecikmesini göster, -Ammo display order,ALTHUDMNU_AMMOORDER,,,,Pořadí zobrazení munice,Visningsrækkefølge for ammunition,Munitionsreihenfolge,,Vidiga aranĝo de municio,Orden vista de munición,,Ammusten esitysjärjestys,Ordre d'affichage des munitions,Muníció típus rendezése,Ordine mostra delle munizioni,弾薬表示順,탄약 표시 순서,Volgorde van de munitieweergave,Rekkefølge for ammunisjonsvisning,Kolejność pokazywania amunicji,Ordem de exibição de munição,,Ordine afișare muniție,Порядок отображения боеприпасов,Редослед муниција,Ordning för visning av ammunition,Cephane teşhir düzeni, -Red ammo display below %,ALTHUDMNU_AMMORED,,,,Červený indikátor munice pod %,Rød ammunitionsvisning under %,Rot für Munition unter %,,Ruĝa municividigo sub %,Porcent. de munición en rojo,,Punaiset ammukset ammusten alittaessa %,Compteur de munitions rouge sous,Piros muníció szín % alatt,Contatore delle munizioni di colore rosso sotto,弾薬の赤色表示%,적색 남은 탄약 밑에 표시,Rood munitieweergave onder %,Rød visning av ammunisjonsnivå under %,Wyświetl czerwoną amunicję pod ,Porcentagem de munição em vermelho até,Percentagem de munição em vermelho até,Muniția schimbă culoarea în roșu sub %,"Отображение боеприпасов красным ниже, %",Прикажи муниције црвеном испод %,Röd ammunition visas under %,Aşağıda kırmızı cephane göstergesi %, -Yellow ammo display below %,ALTHUDMNU_AMMOYELLOW,,,,Žlutý indikátor munice pod %,Gul ammunitionsvisning under %,Gelb für Munition unter %,,Flava municividigo sub %,Porcent. de munición en amarillo,,Keltaiset ammukset ammusten alittaessa %,Compteur de munitions jaune sous,Sárga muníció szín % alatt,Contatore delle munizioni di colore giallo sotto,弾薬の黄色表示%,황색 남은 탄약 밑에 표시,Gele munitieweergave onder %,Gult ammunisjonsdisplay under %.,Wyświetl żółtą amunicję pod ,Porcentagem de munição em amarelo até,Percentagem de munição em amarelo até,Muniția schimbă culoarea în galben sub %,"Отображение боеприпасов жёлтым ниже, %",Прикажи муниције жутом испод %,Gul ammunition visas under %,Aşağıda sarı cephane göstergesi %, -Red health display below,ALTHUDMNU_HEALTHRED,,,,Červený indikátor zdraví pod,Rødt sundhedsindikator under %,Rot für Gesundheit unter %,,Ruĝa sanvidigo sube,Porcent. de salud en rojo,,Punainen terveys terveyden alittaessa,Compteur de santé rouge sous,Piros életerő szín ezen szám alatt,Contatore della salute di colore rosso sotto,体力の赤色表示%,적색 체력 밑에 표시,Rood gezondheidsweergave beneden,Rød helsevisning under,Wyświetl czerwone zdrowie pod ,Porcentagem de saúde em vermelho até,Percentagem de saúde em vermelho até,Sănătatea schimbă culoarea în roșu sub %,"Отображение здоровья красным ниже, %",Прикажи здравље црвеном испод,Röd hälsoindikator nedanför,Aşağıdaki kırmızı sağlık göstergesi, -Yellow health display below,ALTHUDMNU_HEALTHYELLOW,,,,Žlutý indikátor zdraví pod,Gul sundhedsindikator under %,Gelb für Gesundheit unter %,,Flava sanvidigo sube,Porcent. de salud en amarillo,,Keltainen terveys terveyden alittaessa,Compteur de santé jaune sous,Sárga életerő szín ezen szám alatt,Contatore della salute di colore giallo sotto,体力の黄色表示%,황색 체력 밑에 표시,Geel gezondheidsweergave beneden,Gul helsevisning nedenfor,Wyświetl żółte zdrowie pod ,Porcentagem de saúde em amarelo até,Percentagem de saúde em amarelo até,Sănătatea schimbă culoarea în galben sub %,"Отображение здоровья жёлтым ниже, %",Прикажи здравље жутом испод,Gul hälsoindikator nedanför,Aşağıdaki sarı sağlık göstergesi, -Green health display below,ALTHUDMNU_HEALTHGREEN,,,,Zelený indikátor zdraví pod,Grønt sundhedsindikator under %,Grün für Gesundheit unter %,,Verda sanvidigo sube,Porcent. de salud en verde,,Vihreä terveys terveyden alittaessa,Compteur de santé vert sous,Zöld életerő szín ezen szám alatt,Contatore della salute di colore verde sotto,体力の緑色表示%,녹색 체력 밑에 표시,Groen gezondheidsweergave beneden,Grønn helsevisning under,Wyświetl zielone zdrowie pod ,Porcentagem de saúde em verde até,Percentagem de saúde em verde até,Sănătatea schimbă culoarea în verde sub %,"Отображение здоровья зелёным ниже, %",Прикажи здравље зеленом испод,Grön hälsoindikator nedan,Aşağıdaki yeşil sağlık göstergesi, -Red armor display below,ALTHUDMNU_ARMORRED,,,Red armour display below,Červený indikátor brnění pod,Rødt panser display under %,Rot für Panzerung unter %,,Ruĝa kirasvidigo sube,Porcent. de blindaje en rojo,,Punainen panssari panssarin alittaessa,Compteur d' armure rouge sous,Piros páncél szín ezen szám alatt,Contatore dell'armatura di colore rosso sotto,防具の赤色表示%,적색 아머 밑에 표시,Rood pantserweergave beneden,Visning av rød rustning under,Wyświetl czerwony pancerz pod ,Porcentagem de armadura em vermelho até,Percentagem de armadura em vermelho até,Armura schimbă culoarea în galben sub %,"Отображение брони красным ниже, %",Прикажи оклоп црвеном испод,Röd rustning visas nedan,Kırmızı zırh ekranı aşağıda, -Yellow armor display below,ALTHUDMNU_ARMORYELLOW,,,Yellow armour display below,Žlutý indikátor brnění pod,gul panser under displayet under %,Gelb für Panzerung unter %,,Flava kirasvidigo sube,Porcent. de blindaje en amarillo,,Keltainen panssari panssarin alittaessa,Compteur d' armure jaune sous,Sárga páncél szín ezen szám alatt,Contatore dell'armatura di colore giallo sotto,防具の黄色表示%,황색 아머 밑에 표시,Geel pantserweergave beneden,Visning av gul rustning under,Wyświetl żółty pancerz pod ,Porcentagem de armadura em amarelo até,Percentagem de armadura em amarelo até,Armura schimbă culoarea în galben sub %,"Отображение брони жёлтым ниже, %",Прикажи оклоп жутом испод,Gul rustning visas nedan,Aşağıdaki sarı zırh ekranı, -Green armor display below,ALTHUDMNU_ARMORGREEN,,,Green armour display below,Zelený indikátor brnění pod,grønt panser display under %,Grün für Panzerung unter %,,Verda kirasvidigo sube,Porcent. de blindaje en verde,,Vihreä panssari panssarin alittaessa,Compteur d' armure bleu sous,Zöld páncél szín ezen szám alatt,Contatore dell'armatura di colore verde sotto,防具の緑色表示%,녹색 아머 밑에 표시,Groen pantserweergave beneden,Visning av grønn rustning under,Wyświetl zielony pancerz pod ,Porcentagem de armadura em verde até,Percentagem de armadura em verde até,Armura schimbă culoarea în verde sub %,"Отображение брони зелёным ниже, %",Прикажи оклоп зеленом испод,Grön rustning visas nedan,Aşağıdaki yeşil zırh ekranı, -Alternative Automap HUD,ALTHUDMNU_AUTOMAPHUD,,,,Alternativní HUD automapy,Alternativ Automap HUD,Alternatives Automap HUD,,Alternativa HUD de aŭtomata mapo,HUD alternativo del automapa,,Vaihtoehtoinen automaattikartan tilanäyttö,ATH Alternatif pour carte,Alternatív Automap HUD,HUD automappa alternativo,オルタナティブ オートマップHUD,대체 오토맵 HUD,Alternatieve Automap HUD,Alternativ Automap HUD,Alternatywny HUD mapy,HUD alternativo de automapa,,Hartă Computerizată Alternativă,Альтернативный интерфейс на автокарте,Алтернативни HUD за аутомапу,Alternativ automap HUD,Alternatif Automap HUD, -Map title color,ALTHUDMNU_TITLECOLOR,,,Map title colour,Barva názvu levelu,Farve på korttitel,Farbe für Levelnamen,,Maptitolo-koloro,Color del título del mapa,,Tason nimen väri,Couleur titre du niveau,Pálya cím szín,Colore titolo mappa,マップ名の色,맵 제목 색깔,Kleur kaarttitel,Farge på karttittel,Kolor nazwy mapy,Cor do título do fase,Cor do título do nível,Culoare titlu hartă,Цвет названия уровня,Боја назива нивоа,Färg på kartans titel,Harita başlık rengi, -Map time color,ALTHUDMNU_MAPTIMECOLOR,,,Map time colour,Barva času levelu,Farve på kortets tid,Farbe für Level-Zeit,,Maptempo-koloro,Color del tiempo del mapa,,Tason ajan väri,Couleur temps du niveau,Pálya idő szín,Colore tempo mappa,経過時間の色,맵 시간 색깔,Kleur kaarttijd,Kartets tidsfarge,Kolor czasu na mapie,Cor do tempo da fase,Cor do tempo do nível,Culoare timp petrecut pe hartă,Цвет времени для уровней,Боја времена на нивоу,Färg för kartans tid,Harita zaman rengi, -Hub time color,ALTHUDMNU_HUBTIMECOLOR,,,Hub time colour,Barva času hubu,Farve på hub-tid,Farbe für Hub-Zeit,,Nabtempo-koloro,Color del tiempo del nodo,,Tasokokoelman ajan väri,Couleur temps du hub,Csomópont idő szín,Colore tempo hub di mappe,区間経過時間の色,허브 시간 색깔,Kleur hubtijd,Farge for knutepunkttid,Kolor czasu w hubie,Cor do tempo no HUD,,Culoare timp petrecut în hub,Цвет времени для хабов,Боја времена на хабу,Färg för navets tid,Hub zaman rengi, -Total time color,ALTHUDMNU_TOTALTIMECOLOR,,,Total time colour,Barva celkového času,Farve for samlet tid,Farbe für Gesamtzeit,,Tuttempo-koloro,Color del tiempo total,,Kokonaisajan väri,Couleur temps total,Teljes idő szín,Colore tempo totale,合計経過時間の色,누적 경과한 시간 색깔,Kleur totale tijd,Farge for total tid,Kolor całkowitego czasu,Cor do tempo total,,Culoare timp total,Цвет общего времени,Боја укупног времена,Färg för total tid,Toplam zaman rengi, -Coordinate color,ALTHUDMNU_COORDINATECOLOR,,,Coordinate colour,Barva souřadnic,Koordinat farve,Farbe für Koordinaten,,Kunordigi koloron,Color de coordenadas,,Koordinaattien väri,Couleur coordonnées,Koordináló szín,Colore coordinate,座標色,좌표 색깔,Kleur coördinaten,Koordinatfarge,Skoordynuj kolor,Cor das coordenadas,,Culoare coordonate,Цвет координат,Боја координата,Färg för koordinater,Koordinat rengi, -Coordinate mode,ALTHUDMNU_COORDINATEMODE,,,,Režim souřadnic,Koordinattilstand,Koordinatenmodus,,Kunordigi modon,Modo de coordenadas,,Koordinaattitila,Mode coordonnées,Koordináló mód,Modalità coordinate,座標モード,좌표 모드,Coördinatiemodus,Koordinat-modus,Skoordynuj tryb,Modo de coordenada,,Mod coordonate,Координаты игрока,Мод координата,Koordinatläge,Koordinat modu, -Statistics name color,ALTHUDMNU_STATSNAMECOLOR,,,Statistics name colour,Barva názvu statistik,Farve på statistiknavn,Farbe für Statistik-Namen,,Statistiknomo-koloro,Color del nombre de estadísticas,,Tilastotiedon nimen väri,Couleur nom des statistiques,Statisztika név szín,Colore nome statistica,統計名の色,통계표 이름 색상,Kleur statistiekennaam,Farge på statistikknavn,Kolor nazw statystyk,Cor do nome das estatísticas,,Culoare nume statistici,Цвет имён в статистике,Боја назива статистика,Färg för statistiknamn,İstatistik adı renk, -Statistics color,ALTHUDMNU_STATSCOLOR,,,Statistics colour,Barva statistik,Statistik farve,Farbe für Statistik-Nummern,,Statistiko-koloro,Color de las estadísticas,,Tilastotiedon väri,Couleur statistiques,Statisztika szín,Colore contatore statistica,統計の色,통계표 색상,Kleur statistieken,Statistikk farge,Kolor statystyk,Cor das estatísticas,,Culoare statistici,Цвет статистики,Боја статистика,Färg för statistik,İstatistik renk, -,,Display (game related),,,,,,,,,,,,,,,,,,,,,,,,,, -Rendering Interpolation,DSPLYMNU_CAPFPS,,,,Interpolace vykreslování,Interpolering af rendering,Renderinterpolation,,Bildigo-Interpolado,Interpolación de renderizado,,Hahmonnuksen interpolointi,Interpolation du rendu,Render animáció simítás,Interpolazione grafica,レンダリング補間,프레임 제한,Interpolatie renderen,Gjengivelse av interpolasjon,Interpolacja Renderowania,Interpolação de renderização,,Interpolare Imagine,Сглаживание обработки,Интерполација рендеринга,Rendering Interpolering,Rendering Enterpolasyonu, -Transparency render mode,DSPLYMNU_BLENDMETHOD,,,,Režim vykreslování průhlednosti,Gennemsigtighedstilstand,Transparenzmodus,,Travidebleco-bildigo-reĝimo,Modo de renderizado de transparencia,,Läpinäkyvyyden hahmonnustila,Mode de Rendu transparence,Átlászóság render mód,Modalità della resa grafica della trasparenza,レンダリング透過モード,투명도 표시 모드,Transparantie render modus,Gjengivelsesmodus for gjennomsiktighet,Tryb renderowania przezroczystości,Modo de renderiz. de transparência,,Mod Transparență,Режим обработки прозрачности,Режим рендеринга транспарентности,Återgivning med transparens,Şeffaflık render modu, -Screen wipe style,DSPLYMNU_WIPETYPE,,,,Styl přechodů,Skærmens aftørringsstil,Bildschirmwechseleffekt,,Stilo de ekranviŝo,Transición de pantalla,,Ruudun pyyhkiytymistyyli,Style de Fondu d'écran,Képernyőtörlődés módja,Stile della pulizia dello schermo,スクリーンワイプモード,화면 전환 방식,Schermveegstijl,Stil for skjermtørking,Styl przejścia ekranu,Tipo de transição de tela,Tipo de transição de ecrã,Stil ștergere imagine,Эффект плавной смены экранов,Ефект брисања екрана,Stil för skärmtorkning,Ekran silme stili, -Show ENDOOM screen,DSPLYMNU_SHOWENDOOM,,,,Zobrazit ENDOOM obrazovku,Vis ENDOOM-skærm,Zeige ENDOOM,,Montri ENDOOM-ekranon,Mostrar pantalla ENDOOM,,Näytä ENDOOM-ruutu,Montrer la fenêtre ENDOOM,ENDOOM képernyő mutatása,Mostra la schermata ENDOOM,ENDOOM画面を表示,종료화면 표시,Toon ENDOOM scherm,Vis ENDOOM-skjerm,Pokaż ekran ENDOOM,Exibir tela ENDOOM,,Afișare fereastră ENDOOM,Показать экран ENDOOM,Прикажи ENDOOM екран,Visa ENDOOM-skärm,ENDOOM ekranını göster, -Blood Flash Intensity,DSPLYMNU_BLOODFADE,,,,Intenzita bliknutí při zranění,Blodblinkintensitet,Intensität für Bluteffekt,,Egeco de sango-ekbrilo,Intensidad del destello al ser atacado,,Verivälähdyksen voimakkuus,Intensité du flash dommages,Sebzéskor villanás mértéke,Intensità Bagliore Sangue,血粉の濃度,피격 표시 강도,Intensiteit van de bloedflitser,Intensitet for blodblits,Intensywność Efektów Krwi,Intensidade de Flash de Sangue,,Intensitate strălucire sânge,Интенсивность вспышки при ранении,Интензивност треперења током повређивања,Intensitet av blodblixt,Kan Flaş Yoğunluğu, -Pickup Flash Intensity,DSPLYMNU_PICKUPFADE,,,,Intenzita bliknutí při sebrání předmětu,Intensitet for optageeffekt,Intensität für Aufnehmen-Effekt,,Egeco de prenado-ekbrilo,Intensidad del destello al coger algo,Intensidad del destello al agarrar algo,Poimintavälähdyksen voimakkuus,Intensité du flash objets,Fegyver felvételekor villanás mértéke,Intensità Bagliore Raccolta,取得の視界色濃度,습득 표시 강도,Intensiteit van de oppakflitser,Intensitet av opptaksblits,Intesnywność Efektów Podnoszenia Przedmiotów,Intensidade de Flash ao Pegar Itens,,Intensitate strălucire la ridicarea obiectelor,Интенсивность вспышки при подборе,Интензивност треперења током купљења,Intensitet av pickupblink,Pikap Flaş Yoğunluğu, -Underwater Blend Intensity,DSPLYMNU_WATERFADE,,,,Intenzita zbarvení pod vodou,Undervandsblinkintensitet,Intensität für Unterwasser-Effekt,,Egeco de Subakva Mikso,Intensidad Color Sumergido,Intensidad Color Submarino,Vedenalaissumennuksen voimakkuus,Intensité du fondu sous l'eau,Vízalatti keverődés mértéke,Intensità Blend sott'acqua,水中反響音の濃度,수중 효과 강도,Intensiteit kleurvermenging onder water,Intensitet for undervannsblanding,Intensywność Efektów Pod Wodą,Intensidade de Efeito Debaixo d'Água,Intensidade de Efeito Debaixo de Água,Intensitate amestec culori subacvatice,Интенсивность эффекта под водой,Интензивност подводног треперења,Undervattensbländning Intensitet,Sualtı Karışım Yoğunluğu, -Sky render mode,DSPLYMNU_SKYMODE,,,,Režim vykreslování oblohy,Himmel-renderingstilstand,Rendermodus für Himmel,,Ĉielo-bildigo-reĝimo,Modo de renderizado del cielo,,Taivaan hahmonnustila,Mode du rendu du Ciel,Égbolt render mód,Modalità resa grafica del cielo,空の表示方法,하늘 표시 모드,Luchtrendermodus,Modus for gjengivelse av himmel,Tryb renderowania nieba,Modo de renderização de céu,,Mod de vizualizare al cerului,Режим обработки неба,Режим рендеринга неба,Läge för rendering av himmel,Gökyüzü oluşturma modu, -Linear skies,DSPLYMNU_LINEARSKY,,,,Lineární obloha,Lineære himmelstrøg,Lineare Himmel,,Linearaj ĉieloj,Cielo lineal,,Lineaariset taivaat,Ciel linéaire,Lineáris égboltok,Cieli lineari,空の歪み,선형 하늘,Lineaire lucht,Lineær himmel,Liniowe niebo,Céus lineares,,Cer rectiliniu,Линейное небо,Линеарна неба,Linjär himmel,Doğrusal gökyüzü, -Fullbright overrides sector color,DSPLYMNU_GZDFULLBRIGHT,,,,Při plném jasu ignorovat barvu sektoru,Ignorer sektorfarve ved fuld lysstyrke,Ignoriere Sektorfarbe bei voller Helligkeit,,Plenbrileco tranpasas sektorkoloron,Brillo máximo anula color del sector,,Täyskirkkaat ohittavat sektorin värin,Fullbright ignore couleur secteur,Fullbright felülírja a szektor szinét,Luce piena sovrappone il colore del settore,明るさ最大時にsector color塗り替え,섹터 색상 최대밝기 우선화,Volledig helderheid overschrijft de sectorkleur,Fullbright overstyrer sektorfarge,Ignoruj kolor sektora przy pełnej jasności,Brilho máximo anula cor de setor,,Luminozitatea maximă suprascrie culoarea sectorului,Полная яркость замещает цвет сектора,Пуно осветљење премошћује боју сектора,Fullbright åsidosätter sektorfärg,Fullbright sektör rengini geçersiz kılar, -Scale fuzz effect,DSPLYMNU_SCALEFUZZ,,,,Škálovat velikost fuzz efektu,Skala fuzz-effekt,Skaliere Fuzz-Effekt,,Skali barblano-efekton,Escala de efecto fuzz,,Skaalaa sumennustehostetta,Scaling de l'effet de bruit,Homályosodás effekt átméretezése,Scala l'effetto di fuzz,ファズエフェクトサイズ,반투명 효과 조정,Schaal fuzz effect,Skala fuzz-effekt,Skalowanie efektu szumu,Escala de efeito difuso,,Putere efect de strălucire,Масштабировать эффект шума,Повечавај шумни ефект,Skala fuzz-effekt,Ölçekli fuzz efekti, -Use fuzz effect,DSPLYMNU_DRAWFUZZ,,,,Typ fuzz efektu,Brug fuzz-effekt,Benutze Fuzz-Effekt,,Uzi barblano-efekton,Usar efecto fuzz,,Käytä sumennustehostetta,Effet de bruit,Homályosodás effekt használata,Usa l'effetto di fuzz,ファズエフェクトを使用,반투명 효과 사용,Gebruik fuzz effect,Bruk fuzz-effekt,Użyj efektu szumu,Usar efeito difuso,,Mod efect de strălucire,Использовать эффект шума,Користи шумни ефект,Använd fuzz-effekt,Fuzz efekti kullanın, -Classic Transparency,DSPLYMNU_OLDTRANS,,,,Klasická průhlednost,Klassisk gennemsigtighed,Klasssische Transparenz,,Klasika Travidebleco,Transparencia clásica,,Perinteinen läpinäkyvyys,Transparence classique,Klasszikus átlátszóság,Trasparenza classica,旧式の透明度,구형 투명도,Klassieke transparantie,Klassisk gjennomsiktighet,Klasyczna Przezroczystość,Transparência Clássica,,Transparență Clasică,Классическая прозрачность,Класична транспарентност,Klassisk genomskinlighet,Klasik Şeffaflık, -Lost Soul translucency,DSPLYMNU_TRANSSOUL,,,,Průhlednost Ztracených duší,Fortabt sjæl-translucens,Transparenz für Verlorene Seelen,,Diafaneco de Perdita Animo,Traslucidez del Alma Errante,,Kadonneiden sielujen läpikuultavuus,Transparence des âmes perdues,Lost soul átlátszóság,Trasparenza anima errante,ロストソウルの透明度,로스트 소울 반투명도,Verloren Ziel doorschijnendheid,Lost Soul gjennomskinnelighet,Przezroczystość Zagubionych Dusz,Translucência da Alma Perdida,Translucidez da Alma Penada,Transparență Suflete Pierdute,Прозрачность потерянных душ,Транспарентност изгубљених душа,Lost Soul-translucens,Kayıp Ruh yarı saydamlığı, -Use fake contrast,DSPLYMNU_FAKECONTRAST,,,,Použít falešný kontrast,Brug falsk kontrast,Benutze falschen Kontrast,,Uzi malveran kontraston,Usar falso contraste,,Käytä tekosävykkyyttä,Faux Contraste,Hamis kontraszt használata,Usa il falso contrasto,フェイクコントラストを使用,가명암 효과 사용,Gebruik vals contrast,Bruk falsk kontrast,Użyj sztuczny kontrast,Usar contraste falso,,Utilizare contrast fals,Имитация контрастного освещения стен,Користи фејк-контраст,Använd falsk kontrast,Sahte kontrast kullanın, -Rocket Trails,DSPLYMNU_ROCKETTRAILS,,,,Kouř raket,Raketspor,Raketenschweife,,Raketospuroj,Rastro de cohetes,,Rakettivanat,Trainées des Roquettes,Rakéta füstnyomok,Scia del razzo,ロケットの軌跡,로켓 추진 효과,Raketsporen,Rakettspor,Wiązki Rakiet,Rastro de foguete,Rasto dos Mísseis,Dâră Rachete,Дымовой след у ракет,Траг дима код ракета,Raketspår,Roket Parkurları, -Blood Type,DSPLYMNU_BLOODTYPE,,,,Druh krve,Blodtype,Blut-Typ,,Sangad-efekto,Sangre chorreando,,Verityyli,Type de particules Sang,Vér fajta,Tipo di sangue,血の種類,혈흔 효과,Bloedtype,Blodtype,Typ Krwi,Tipo de sangue,,Tip efecte sângeroase,Тип крови,Тип крви,Blodtyp,Kan Grubu, -Bullet Puff Type,DSPLYMNU_PUFFTYPE,,,,Druh kouře nábojů,Kuglestød type,Pistolenrauch-Typ,,Pulvo pro kolizio de kuglo,Polvo por impacto de bala,,Luotien pöllähdystyyli,Type de particules Balles,Lövedék becsapódás fajtája,Tipo di sbuffo del proiettile,弾煙の種類,탄알 피격 효과,Kogelwolvertype,Bullet Puff Type,Typ Dymu,Tipo de ricochete de bala,,Tip efecte pentru gloanțe,Тип дыма от пуль,Тип рикошета,Kulavfallstyp,Mermi Puf Tipi, -Number of particles,DSPLYMNU_MAXPARTICLES,,,,Množství částic,Antal partikler,Anzahl Partikel,,Nombro da partikloj,Número de partículas,,Hiukkasten lukumäärä,Nombre de particules,Részecskék száma,Numero di particelle,パーティクルの最大数,최대 입자 수,Aantal deeltjes,Antall partikler,Liczba cząsteczek,Número de partículas,,Număr particule,Количество частиц,Број честица,Antal partiklar,Parçacık sayısı, -Number of decals,DSPLYMNU_MAXDECALS,,,,Množství decalů,Antal decals,Anzahl Trefferspuren,,Nombro da dekaloj,Número de calcomanías,,Siirtokuvien lukumäärä,Number de décalques,Lövésnyomok száma,Numero di decal,デカールの最大数,최대 데칼 수,Aantal stickers,Antall dekaler,Liczba kalk,Número de decalques,,Număr autocolante,Количество декалей,Број декала,Antal dekaler,Çıkartma sayısı, -Show player sprites,DSPLYMNU_PLAYERSPRITES,,,,Zobrazit hráčovy sprity,Vis spiller sprites,Zeige Spieler-Sprites,,Montri ludanto-rastrumojn,Mostrar «sprites» del jugador,,Näytä pelaajaspritet,Montrer les sprites joueur,Játékos sprite-ok mutatása,Mostra gli sprite del giocatore,プレイヤーの武器の表示,1인칭 무기 표시,Toon speler sprites,Vis spillerens sprites,Pokaż sprite'y gracza,Exibir sprites do jogador,,Afișare arme,Отображение спрайтов игрока,Прикажи спрајтове играча,Visa spelarens sprites,Oyuncu sprite'larını göster, -Death camera,DSPLYMNU_DEATHCAM,,,,Posmrtná kamera,Dødskamera,Todeskamera,,Dummorta tripersona kamerao,Muerte del jugador en tercera persona,,Kuolonkamera,Caméra 3ème pers à la mort,Halál kamera,Telecamera all'atto della morte,死亡時の三人称視点,사망 화면 표시,Doodscamera,Dødskamera,Kamera śmierci,Câmera de morte,Câmara da morte,Cameră de Deces,Вид от 3-го лица при смерти,Смртна камера,Dödskamera,Ölüm kamerası, -Teleporter zoom,DSPLYMNU_TELEZOOM,,,,Zoom při teleportaci,Teleporter zoom,Teleporter Zoom,,Teleportila zomo,Zoom en teletransporte,,Kaukosiirrynnän kameran zoomaus ,Zoom sur téléportation,Teleporter ráközelítés,Zoom telecamera,テレポーター使用時のズーム,순간이동 효과,Teleporter zoom,Teleporter zoom,Przybliżenie teleportowania,Zoom de teletransporte,,Apropriere Cameră la Teleportare,Увеличение при телепортации,Зум током телепортације,Teleportörens zoom,Işınlayıcı yakınlaştırma, -Earthquake shake intensity,DSPLYMNU_QUAKEINTENSITY,,,,Intenzita zemětřesení,Intensitet af jordskælv,Erdbeben Intensität,,Egeco de tertremo,Intensidad del terremoto,,Maanjäristystehosteen voimakkuus,Intensité des séismes,Földrengés erőssége,Intensità vibrazione terremoto,地震エフェクトの激しさ,지진 효과 강도,Aardbevingsschoksintensiteit,Intensitet av jordskjelvrystelser,Siła trzęsienia ziemi,Intensidade do tremor de terremoto,,Intensitate zguduire la cutremur,Интенсивность тряски землетрясений,Интенсивност земљотреса,Intensitet av jordbävningar,Deprem sarsıntı şiddeti, -Interpolate monster movement,DSPLYMNU_NOMONSTERINTERPOLATION,,,,Interpolovat pohyb příšer,Interpolere monsterbevægelse,Interpoliere Monsterbewegung,,Interpoli monstro-movadon,Interpolar movimiento de los monstruos,,Interpoloi hirviöiden liike,Interpolation des monstres,Szörny mozgás simítása,Interpola il movimento dei mostri,モンスターの移動補間,개체 이동 보정,Interpoleer monsterbewegingen,Interpolere monsterbevegelse,Interpolacja ruchu potworów,Interpolar movimento de monstros,,Interpolare mișcare monștri (efect vizual),Сглаживание движения монстров,Интерполирај кретање чудовишта,Interpolera monsterrörelse,Canavar hareketini enterpole et, -Menu dim,DSPLYMNU_MENUDIM,,,,Síla barvy pozadí v menu,Menu dæmpes,Menüabdunklung,,Menuo-malheleco,Atenuación del menú,,Valikon himmennys,Assombrissement menu,Menü homályosítása,Offuscamento menu,メニュー背景,메뉴 배경색 강도,Donkere menuachtergrond,Demp meny,Mgła w menu,Atenuação do menu,,Întunecare meniu,Затемнение фона меню,Пригушивање менија,Dimma menyn,Menü loş, -Dim color,DSPLYMNU_DIMCOLOR,,,Dim colour,Barva pozadí v menu,Dim farve,Abdunklungsfarbe,,Malheleca koloro,Color de la atenuación,,Himmennysväri,Couleur de l'assombrissement,Homályosítás színe,Colore offuscamento,背景色,배경색 설정,Donkere kleur,Demp farge,Kolor mgły,Cor da atenuação,,Culoare întunecare,Цвет затемнения,Боја пригушивања,Dimma färgen,Loş renk, -View bob amount while moving,DSPLYMNU_MOVEBOB,,,,Pohupování pohledu při pohybu,Vis bob-beløb under bevægelse,Waffenpendeln beim Bewegen,,Vidi kvanton de kapo-balanciĝo dum movado,Cantidad de balanceo al moverse,,Aseen heilumisvoimakkuus liikkeessä,Chaloupage arme en movement,Fegyver mozgása lépés közben,Ammontare di bob di movimento,視点揺れする移動値,이동 시 화면 흔들림 강도,Bekijk bob bedrag terwijl je beweegt,Vis bob-beløp mens du beveger deg,Dygaj kiedy się ruszasz,Quantidade de balanço durante movimento,,Mișcare cameră în timpul deplasării,Покачивание камеры при движении,Тресење камере током кретања,Visa bob-mängden under förflyttning,Hareket halindeyken bob miktarını görüntüleme, -View bob amount while not moving,DSPLYMNU_STILLBOB,,,,Pohupování pohledu v klidu,"Vis bob-beløbet, mens du ikke bevæger dig",Waffenpendeln bei Nichtbewegen,,Vidi kvanton de kapo-balanciĝo dum ne movado,Cantidad de balanceo al no moverse,,Aseen heilumisvoimakkuus levossa,Chaloupage arme statique,Fegyver mozgása egy helyben,Ammontare di bob di movimento da fermo,視点揺れしない移動値,정지 시 화면 움직임 강도,Bekijk bob bedrag terwijl je niet beweegt,Vis bobmengde mens du ikke beveger deg,Dygaj kiedy się nie ruszasz,Quantidade de balanço parado,,Mișcare cameră în timpul staționării,Покачивание камеры при бездействии,Тресење камере током неактивности,Visa bob-mängden när den inte rör sig,Hareket etmiyorken bob miktarını görüntüleme, -Weapon bob speed,DSPLYMNU_BOBSPEED,,,,Rychlost pohupování zbraně,Våben bob hastighed,Waffenpendelgeschwindigkeit,,Rapido de armilo-balanciĝo,Velocidad de balanceo de Arma,,Aseen heilumisnopeus,Vitesse du chaloupage,Fegyver mozgás sebesség,Velocità di bob dell'arma,武器揺れ速度,무기 흔들림 속도,Snelheid wapenzwaaieffect,Våpen bob hastighet,Szybkość ruchu broni,Velocidade de balanço de arma,,Viteză mișcare arme,Скорость покачивания оружия,Брзина трсења оружја,Vapens hastighet,Silah bob hızı, -,,Scaling,,,,,,,,,,,,,,,,,,,,,,,,,, -Scaling Options,SCALEMNU_TITLE,,,,Nastavení škálování rozhraní,Indstillinger for skalering,Skalierungsoptionen,,Skalo-Agordoj,Opciones de escalado,,Skaalausasetukset,Option de mise à l'échelle,Méretezési Beállítások,Opzioni di scala,スケーリング オプション,배율 설정,Schaalopties,Alternativer for skalering,Opcje skalowania,Opções de escala,,Setări Dimensiuni,Настройки масштабирования,Подешавања размере,Skalningsalternativ,Ölçeklendirme Seçenekleri, -Overrides for above setting,SCALEMNU_OVERRIDE,,,,Potlačení nastavení výše,Overrides for ovenstående indstilling,Spezialisierungen,,Transpasoj por ĉi-supre agordo,Anular ajuste anterior,,Ohittaa asetuksen ylhäällä,Annule les paramètres au dessus,Beállítások felülírása,Sovrascritture per i settaggi sopra,設定の上書き,위 설정을 위해 무시,Overschrijdingen voor bovenstaande instelling,Overstyrer for innstillingen ovenfor,Nadpisuje dla powyższego ustawienia,Anular configurações acima,,Suprascriere pentru setările de mai sus,Задать специальные настройки,Специјална подешавања,Överordnar ovanstående inställningar,Yukarıdaki ayar için geçersiz kılmalar, -Messages,SCALEMNU_MESSAGES,,,,Oznámení,Meddelelser,Nachrichten,,Mesaĝoj,Mensajes,,Viestit,,Üzenetek,Messaggi,メッセージ類,메시지,Berichten,Meldinger,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке,Meddelanden,Mesajlar, -Console,SCALEMNU_CONSOLE,,,,Konzole,Konsol,Konsole,,Konzolo,Consola,,Konsoli,,Konzol,,コンソール,콘솔,,Konsoll,Konsola,,Consola,Consolă,Консоль,Конзола,Konsol,Konsol, -Status bar,SCALEMNU_STATBAR,,,,Stavový panel,Statuslinje,Statusleiste,,Stata baro,Barra de estado,,Tilapalkki,Barre d'état,Státusz sáv,Barra di stato,ステータスバー,상태 바,Statusbalk,Statuslinje,Pasek statusu,Barra de status,Barra de estado,Bară de Stare,Строка состояния,Статусна трака,Statusfältet,Durum çubuğu, -Fullscreen HUD,SCALEMNU_HUD,,,,HUD přes celou obrazovku,HUD i fuld skærm,Vollbild-HUD,,Tutekrana HUD,HUD de pantalla completa,,Täyden ruudun tilanäyttö,ATH plein écran,Teljes képernyős HUD,HUD a pieno schermo,全画面HUD,전체화면 HUD,Volle scherm HUD,HUD i fullskjerm,HUD pełnoekranowy,HUD de tela cheia,HUD de ecrã cheio,Interfață pe Timp de Joc tip Fullscreen,Полноэкранный интерфейс,HUD преко целог екрана,HUD i fullskärm,Tam Ekran HUD, -Alternative HUD,SCALEMNU_ALTHUD,,,,Alternativní HUD,Alternativ HUD,Alternatives HUD,,Alternativa HUD,HUD alternativo,,Vaihtoehtoinen tilanäyttö,ATH alternatif,Alternatív HUD,HUD alternativo,オルタナティブHUD,대체 HUD,Alternatieve HUD,Alternativ HUD,Alternatywny HUD,HUD alternativo,,Interfață pe Timp de Joc Alternativă,Альтернативный интерфейс,Алтернативни HUD,Alternativ HUD,Alternatif HUD, -HUD preserves aspect ratio,SCALEMNU_HUDASPECT,,,,HUD zachovává poměr stran,HUD bevarer formatforholdet,HUD bewahrt Seitenverhältnisse,,HUD konservas aspekto-proporcion,HUD conserva la rel. de aspecto,,Tilanäyttö säilyttää kuvasuhteen,ATH préserve le rapport d'aspect,A HUD képarány visszaállítása,HUD preserva le proporzioni,HUDのアスペクト比維持,HUD 화면 비율 보존,HUD behoudt de beeldverhouding,HUD bevarer størrelsesforholdet,HUD zachowuje współczynnik proporcji,HUD deve preservar proporção da tela,,Interfața pe Timp de Joc își Păstrează Aspectul,Сохранение соотношения сторон интерфейса,Сачувај пропорције HUD-а,HUD behåller bildförhållandet,HUD en boy oranını korur, -Use default scale,SCALEMNU_USEUI,,,,Použít výchozí velikost,Brug standardskala,Benutze Standardskalierung,,Uzi defaŭltskalon,Usar escalado por defecto,,Käytä oletusmittakaavaa,Défaut,Alap arányok használata,Usa la scala di default,通常サイズを使う,기본 배율 사용,Gebruik standaardweegschaal,Bruk standard skala,Użyj domyślnej skali,Usar escala padrão,,Folosește dimensiunea implicită,Размер по умолчанию,Уобичајена размера,Använder standardskalan,Varsayılan ölçeği kullan, -Scale to fullscreen,SCALEMNU_USEFS,,,,Škalovat přes celou obrazovku,Skaleres til fuld skærm,Skaliere auf Vollbild,,Skali al tutekrano,Escalar a pant. completa,,Skaalaa täyteen ruutuun,Plein écran,Teljes képernyőre arányítás,Scala a pieno schermo,全画面に拡大,전체화면에 맞게 축척,Schaalbaar tot volledig scherm,Skaler til fullskjerm,Przeskaluj do pełnego ekranu,Escala de tela cheia,Escalar para ecrã cheio,Dimensionare la modul Fullscreen,Масштабировать со всем экраном,Проширење преко целог екрана,Skala till fullskärm,Tam ekrana ölçeklendir, -Adapt to screen size,SCALEMNU_ADAPT,,,,Přizpůsobit velikosti obrazovky,Tilpasning til skærmstørrelse,Passe an Bildschirmgröße an,,Adapti al ekranamplekso,Adaptar al tamaño de pantalla,,Sovita näytön kokoon,Ecran,Képernyő mérethez alkalmazkodik,Adatta alla dimensione della schermata,画面サイズに合わせる,화면 사이즈에 맞게 축척,Aanpassen aan de grootte van het scherm,Tilpass til skjermstørrelse,Dostosuj do pełnego ekranu,Adaptar ao tamanho de tela,,Adaptează la dimensiunea ecranului,Адаптироваться к размеру экрана,Прилагоди размери екрана,Anpassas till skärmstorlek,Ekran boyutuna uyum sağlayın, -,,HUD,,,,,,,,,,,,,,,,,,,,,,,,,, -HUD Options,HUDMNU_TITLE,,,,Nastavení rozhraní a HUD,HUD-indstillinger,HUD Optionen,,HUD Agordoj,Opciones del HUD,,Tilanäytön asetukset,Options ATH,HUD beállításai,Opzioni HUD,HUDオプション,HUD 설정,HUD-opties,HUD-alternativer,Opcje HUD,Opções de HUD,,Setări Interfață pe Timp de Joc,Настройки отображения информации,HUD подешавања,Alternativ för HUD,HUD Seçenekleri, -Alternative HUD,HUDMNU_ALTHUD,,,,Alternativní HUD,Alternativ HUD,Alternatives HUD,,Alternativa HUD,HUD alternativo,,Vaihtoehtoinen tilanäyttö,ATH Alternatif,Alternatív HUD,HUD alternativo,オルタナティブHUD,대체 HUD,Alternatieve HUD,Alternativ HUD,Alternatywny HUD,HUD alternativo,,Interfață pe Timp de Joc Alternativă,Альтернативное отображение информации,Алтернативни HUD,Alternativ HUD,Alternatif HUD, -Message Options,HUDMNU_MESSAGE,,,,Oznámení,Indstillinger for meddelelser,Nachrichtenoptionen,,Mesaĝo-Agordoj,Opciones de mensajes,,Viestiasetukset,Options des Messages,Üzenet beállítások,Opzioni messaggi,メッセージの設定,메시지 설정,Berichtopties,Meldingsalternativer,Opcje wiadomości,Opções de mensagem,,Setări Mesaje,Настройки сообщений,Подешавања порука,Alternativ för meddelanden,Mesaj Seçenekleri, -User interface scale,HUDMNU_UISCALE,,,,Velikost rozhraní,Skala for brugergrænseflade,Benutzerinterfaceskalierung,,Interfaco-skalo de uzanto,Escala de la interfaz de usuario,,Käyttöliittymän skaalaus,Echelle de l'interface,Felhasználó Panel mérete,Scala l'interfaccia utente,インターフェースの大きさ,인터페이스 크기 조정,Schaal gebruikersinterface,Skalering av brukergrensesnitt,Skala interfejsu,Escala de interface de usuário,Escala de interface do utilizador,Dimensiune Interfață Utilizator,Размер интерфейса,Размера интерфејса,Skala för användargränssnittet,Kullanıcı arayüzü ölçeği, -Force default crosshair,HUDMNU_FORCECROSSHAIR,,,,Vynutit výchozí zaměřovač,Tvinge standard-trådkorset,Erzwinge Standard-Fadenkreuz,,Devigi defaŭltan reteton,Forzar retícula por defecto,,Pakota oletustähtäin,Forcer Viseur par défaut,Alapcélkereszt erőltetése,Forza il mirino di default,デフォルトの照準を使う,기본 조준점 강제 설정,Forceer standaard dradenkruis,Tving frem standard trådkors,Wymuś domyślny celownik,Forçar mira padrão,,Forțare țintă implicită,Всегда стандартный прицел,Форсирај уобичајени нишан,Forcera standardkorset,Varsayılan artı işaretini zorla, -Grow crosshair when picking up items,HUDMNU_GROWCROSSHAIR,,,,Zvětšit zaměřovač při sebrání předmětu,"Vokse trådkorset, når du samler genstande op",Größeres Fadenkreuz bei Gegenstandsaufnahme,,Grandigi reteton kiam oni prenas objektojn,Aumentar retícula al obtener obj.,Crecer retícula al obtener obj.,Suurenna tähtäintä esineitä poimiessa,Agrandir viseur en prenant un objet,A célkereszt nőjön tárgyfelvételkor,Accresci il mirino quando si raccolgono oggetti,アイテム取得時に照準を大きくする,아이템 획득 시 조준점 키우기 ,Vergroot het dradenkruis bij het oppakken van items,Utvid trådkorset når du plukker opp elementer,"Powiększ celownik, gdy podnosisz przedmioty",Aumentar mira ao pegar itens,Aumentar mira ao apanhar itens,Mărește ținta la ridicarea obiectelor,Увеличение прицела при подборе,Побољшај нишан током купљења предмета,Växer hårkorset när du plockar upp föremål,Eşyaları alırken artı işaretini büyütün, -Display nametags,HUDMNU_NAMETAGS,,,,Zobrazovat jmenovky,Viser navneskilte,Zeige Gegenstandsnamen,,Montri nometikedojn,Mostrar etiquetas,,Näytä nimitunnisteet,Afficher noms des objets,Névtábla mutatása,Mostra le targhette identificative,ディスプレイネームタグ,이름표 표시,Naamlabels weergeven,Vis navnelapper,Pokazuj nazwy przedmiotów,Exibir nomes,,Indică numele obiectelor,Указание названия предметов,Прикажи имена предмета,Visa namnbrickor,İsim etiketlerini gösterin, -Nametag color,HUDMNU_NAMETAGCOLOR,,,Nametag colour,Barva jmenovek,Farve på navneskilte,Farbe für Gegenstandsnamen,,Nometikeda koloro,Color de las etiquetas,,Nimitunnisteen väri,Couleur des noms d'objet,Névtábla szín,Colore targhetta identificativa,ネームタグ色,이름표 색깔,Kleur naamlabel,Farge på navneskilt,Kolor nazw przedmiotów,Cor dos nomes,,Culoare nume obiecte,Цвет названия предметов,Боја имена предмета,Färg på namnbrickor,İsim etiketi rengi, -Use old ouch mug shot formula,HUDMNU_OLDOUCH,,,,Použít starý vzorec pro 'ouch' portrét,"Gammel formel for ""av"" ansigt",Alte Formel für „Autsch“-Gesicht,,Uzi maljunan formulon de aj-vizaĝo-foto,Usar formula antigua de foto de daño,,Käytä vanhaa auts-naamakuvan kaavaa,Ancien code pour l' « ouch face »,Régi sebződő fej formula használata,Mostra la formula originale del viso 'ouch',旧式ouch mug shotを使用,구형 피격 표정 스프라이트 방식 사용,"Oude formule voor ""Ouch""-gezicht",Bruk formelen for gamle forbryterbilder,Używaj starej formuły twarzy przy dostaniu obrażeń,Usar fórmula original do rosto de dor,,Utilizează modul portret vechi,Старая формула для портрета,Стара формула за приказ лика,"Använd den gamla formeln med ""ouch"" foton",Eski ouch oyuncu yüzü formülünü kullanın, -Hexen weapon flashes,HUDMNU_HEXENFLASHES,,,,Druh bliknutí zbraní v Hexenu,Hexen-våben blinker,Hexen-Waffenblitze,,Ekbriloj de Hexen-armo,Destello armas Hexen,,Hexenin asevälähdykset,Flash d'arme dans Hexen,Hexen fegyver villanások,Bagliori armi Hexen,Hexen武器の視界色,헥센 무기 반짝임,Hexen-wapen flitsen,Hexen våpen blinker,Błysk przy podnoszeniu broni z Hexena,Flash de arma do Hexen,,Tip strălucire arme Hexen,Тип вспышки оружия в Hexen,Треперење оружја у Hexen-у,Hexen-vapen blinkar,Hexen silah flaşları, -Poison damage flashes,HUDMNU_POISONFLASHES,,,,Druh bliknutí při otrávení,Giftskabte skader blinker,Gift-Effekt,,Ekbriloj de venondamaĝo,Destello daño por veneno,,Myrkkyvahinkovälähdykset,Flash de poison dans Hexen,Méreg sebzés villanások,Bagliori danno da veleno,毒ダメージの視界色,독데미지 반짝임,Vergiftigingsschade knippert,Giftskade blinker,Efekt obrażeń przy zatruciu,Flash de dano por veneno,,Tip strălucire efect de otrăvire,Тип вспышки яда,Треперење током тровања,Blinkar för giftskador,Zehir hasarı flaşları, -Ice death flashes,HUDMNU_ICEFLASHES,,,,Druh bliknutí při smrti umrznutím,Isdødsblink,Eis-Tod-Effekt,,Ekbriloj de glacimorto,Destello muerte por hielo,,Jääkuolemavälähdykset,Flash de morts par glace,Jéghalál villanások,Bagliori morte da ghiaccio,氷結死の視界色,동사시 반짝임,IJsdood knippert,Isdød blinker,Błysk przy śmierci poprzez zamrożenie,Flash de morte por congelamento,,Tip strălucire deces prin înghețare,Тип вспышки при смерти от льда,Треперење током смрти од леда,Blinkar för isdöd,Buz ölüm flaşları, -Poison Buildup flashes,HUDMNU_HAZARDFLASHES,,,,Druh blikání při kumulaci jedu,Gift Buildup blinker,Kumulativer Gift-Effekt,,Ekbriloj de venonamasigo,Destello acumulación de veneno,,Myrkyn kertymisvälähdykset,Flash d'accumulation de poison,Fokozatos méreg sebzés villanások,Bagliori danno accumulato da veleno,蓄積毒の視界色,독데미지 반짝임 증강,Vergiftiging Opbouw knippert,Giftoppbygging blinker,Miganie przy nasilaniu się trucizny,Flash por acúmulo de dano por veneno,,Tip strălucire acumulare de otravă,Тип вспышки при скоплении яда,Треперење током гомилања отрова,Blinkningar för giftuppbyggnad,Zehir Birikimi yanıp söner, -Scaling Options,HUDMNU_SCALEOPT,,,,Škálování velikosti rozhraní,Skaleringsmuligheder,Skalierungsoptionen,,Skalo-Agordoj,Opciones de escalado,,Skaalausasetukset,Option de mise à l'échelle,Méretezés Beállítások,Opzioni di scala,スケーリング オプション,배율 설정,Schaalopties,Alternativer for skalering,Opcje skalowania,Opções de escala,,Setări Dimensiuni,Настройки масштабирования,Подешавања размере,Alternativ för skalning,Ölçeklendirme Seçenekleri, -Show IWAD selection dialog,MISCMNU_QUERYIWAD,,,,Zobrazit dialog pro výběr IWADu,Vis IWAD-valgdialogboks,Zeige IWAD-Auswahl,,Montri elektodialogon de IWAD,Mostrar diálogo de selección de IWAD,,Näytä IWAD-valintaikkuna,Afficher la séléction d'IWAD,IWAD kiválasztó ablak mutatása,Mostra la schermata della selezione IWAD,IWADの選択画面を表示,IWAD 게임 선택창 표시,IWAD-selectiedialoogvenster weergeven,Vis IWAD-valgdialogboks,Pokaż ekran wyboru gry (IWAD),Exibir janela de seleção de IWAD,,Afișează fereastra de selectare a jocurilor,Выбор IWAD-файла при запуске,Покажи IWAD дијалог за избор,Visa dialogrutan för val av IWAD,IWAD seçim iletişim kutusunu göster, -Enable cheats from all games,MISCMNU_ALLCHEATS,,,,Povolit cheaty ze všech her,Aktiver snyderier fra alle spil,Ermögliche Cheats aus allen Spielen,,Ebligi trompojn el tutaj ludoj,Activar trucos de todos los juegos,,Ota käyttöön huijauskoodit kaikista peleistä,Activer cheats de tous les jeux,Minden játék csaláskódja érvényes,Abilita tutti i cheat da tutti i giochi,全ゲームでチート使用可にする,모든 게임에 치트 허용,Laat bedriegers van alle spellen toe,Aktiver juks fra alle spill,Włącz oszustwa ze wszystkich gier,Habilitar trapaças de todos os jogos,Permitir batotas de todos os jogos,Permite codurile din toate jocurile,Читы из всех игр,Омогући читове од свих игара,Aktivera fusk från alla spel,Tüm oyunlardan hileleri etkinleştirin, -,,Option Menus,,,,,,,,,,,,,,,,,,,,,,,,,, -Enable making screenshots by scripts,MISCMNU_ENABLESCRIPTSCREENSHOTS,,,,Povolit skriptům pořizovat snímky obrazovky,Aktivering af skærmbilleder ved hjælp af scripts,"Erlaube Skripts, Screenshots zu machen",,Ebligi faradon de ekrankopioj per skriptoj,Habilitar captura de pantalla por scripts,,Salli komentosarjoin otetut kuvakaappaukset,Autoriser les Scripts à prendre des captures,Szkriptek is készíthetnek képernyőképet,Abilita la cattura dello schermo tramite scripts,スクリプトからのスクショ作成を有効化,저장/불러오기 확인,Screenshots maken met behulp van scripts,Gjør det mulig å lage skjermbilder av skript,Pozwól na robienie zrzutów ekranu przez skrypty,Habilitar capturas de tela por scripts,Permitir capturas de ecrã por scripts,Posibilitate de a face poze prin scripturi,Возможность делать снимки экрана через скрипты,Омогући прављење скриншотова по скрипти,Aktivera att göra skärmdumpar med hjälp av skript,Komut dosyalarıyla ekran görüntüsü almayı etkinleştirme, -Load *.deh/*.bex lumps,MISCMNU_DEHLOAD,,,,Načítat *.deh/*.bex soubory,Indlæsning af *.deh/*.bex-filer,Lade *.deh/*.bex Daten,,Ŝargi je *.deh/*.bex lumpoj,Cargar archivos *.deh/*.bex,,Lataa *.deh/*.bex-lump-tiedostot,Charger fichiers *.deh/*.bex,*.deh/*.bex lump-ok betöltése,Carica i lump *.deh/*.bex,.deh/.bexファイルを読み込む,*.deh/*.bex 럼프 파일 불러오기,*.deh/*.bex laden,Last inn *.deh/*.bex-arkiver,Załaduj dane *.deh/*.bex,Carregar lumps *.deh/*.bex,,Încarcă nodurile *.deh/*.bex,Загружать файлы *.deh/*.bex,Учитај *.deh/*.bex фајлове,Ladda *.deh/*.bex-filer,.deh/*.bex topaklarını yükle, -Cache nodes,MISCMNU_CACHENODES,,,,Cachovat nodes,,Nodes zwischenspeichern,,Kaŝmemoraj nodoj,Caché de nodos,,Tallenna solmut välimuistiin,Mise en cache des nodes,Node-ok cache-lése,Cache dei nodi,ノードキャッシュ,캐시 노드,Cache nodes,Bufre noder,Węzły pamięci podręcznej,Cachê de nodes,Cache de nodes,Depozitare noduri cache,Кэширование узлов,Кеширани чворови,Cache-noder,Önbellek düğümleri, -Time threshold for node caching,MISCMNU_CACHETIME,,,,Časový práh pro cachování nodes,Tidsgrænse for node-cache,Zeitschwelle für das Zwischenspeichern von Nodes,,Templimo pro kaŝmemornodi,Umbral de tiempo para caché de nodos,,Kynnysaika solmujen välimuistitallennukseen,Limite cache des nodes,Időhatár node cache-hez,Soglia di tempo per il caching dei nodi,ノードキャッシュ時間の閾値,노드 캐싱을 위한 시간 임계값 계산,Tijdsdrempel voor het cachen van nodes,Tidsterskel for nodebufring,Próg czasowy buforowania węzłów,Limite de tempo para cachê de nodes,Limite de tempo para cache de nodes,Limită de timp pentru depozitare cache,Временной порог для кэширования узлов,Временски праг за кеширање чвора,Tidströskel för cachelagring av noder,Düğüm önbelleğe alma için zaman eşiği, -Clear node cache,MISCMNU_CLEARNODECACHE,,,,Vyčistit node cache,Ryd node-cache,Nodespeicher löschen,,Forigi kaŝmemorajn nodojn,Limpiar Caché de nodos,,Tyhjennä solmuvälimuisti,Vider le cache des nodes,Cache node ürítése,Pulisci la cache dei nodi,ノードのキャッシュをクリア,노드 캐시를 삭제,Node cache legen,Tøm nodebuffer,Wyczyść pamięć podręczną,Limpar cachê de nodes,Limpar cache de nodes,Ștergere noduri cache,Очистить кэш узлов,"Избриши кеширане чворове +Disable BOOM door light effect,CMPTMNU_NODOORLIGHT,,,,Zakázat světelný efekt dveří z BOOMu,Deaktivere BOOM dør lys effekt,Boom-Türlichteffekt deaktiviert.,,Malvalidigi pordlumo-efekton de BOOM,Desactivar efecto de luz de puerta de BOOM,,BOOM-ovivalotehoste pois käytöstä,Pas d'effet de lumière BOOM sur portes,,A BOOM ajtó fény effekt kikapcsolása ,Disabilitato l'effetto Boom della luce della porta,BOOMドアライト エフェクトを無効化,붐 문간 조명보정 효과 끄기,BOOM-deurlichteffect uitschakelen,Deaktiver BOOM dør lyseffekt,Wyłącz efekt oświetlenia drzwi BOOM,Desabilitar efeito de luz de porta do BOOM,,Dezactivează efectele de lumină BOOM pentru uși,Отключить световой эффект из BOOM на дверях,Онемогући светлосни ефекат из BOOM-а на вратима,Inaktivera BOOM-dörrljuseffekten,BOOM kapı ışığı efektini devre dışı bırak, +Find neighboring light like Doom,CMPTMNU_LIGHT,,,Find neighbouring light like Doom,Nacházet nejbližší světlo jako Doom,Find nabo lys som Doom,Finde benachbartes Licht wie in Doom,,Trovi najbaran lumon kiel Doom,Encontrar luces vecinas como en Doom,,Etsi vierustava valo niin kuin Doom,Trouver prochaine texture comme DOOM,,Szomszédos fényforrás keresése mint Doom-ban,Trova le luci vicine come in DOOM,DOOM式の最寄りライト検知,고전적인 조명추적 사용,Vind naburig licht zoals Doom,Finn nærliggende lys som Doom,Znajdź sąsiadujące światło jak w Doomie,Encontrar luz vizinha como em Doom,,Caută o sursă de lumină apropriată ca în Doom,Искать соседний источник света как в Doom,Нађи суседно светло као у Doom-у,Hitta närliggande ljus som Doom,Doom gibi komşu ışık bulun, +Find shortest textures like Doom,CMPTMNU_SHORTTEX,,,,Nacházet nejkratší textury jako Doom,Find korteste teksturer som Doom,Finde kurze Texturen wie in Doom,,Trovi la plej mallongajn tekstaĵojn kiel Doom,Encontrar texturas más cortas como en Doom,,Etsi lyhyimmät pintakuvioinnit niin kuin Doom,Trouver plus petite texture comme Doom,,Legkisebb textúrák keresése mint Doom-ban,Trova le texture più piccole come in DOOM,DOOM式の最短テクスチャー検知,고전적인 텍스처분류 사용,Vind de kortste texturen zoals Doom,Finn korteste teksturer som Doom,Znajdź najkrótsze tekstury jak w Doomie,Encontrar menores texturas como em Doom,,Caută cele mai scurte texturi ca în Doom,Искать кратчайшие текстуры как в Doom,Нађи најкраће текстуре као у Doom-у,Hitta kortaste texturer som Doom,Doom gibi en kısa dokuları bulun, +Use buggier stair building,CMPTMNU_STAIRS,,,,Použít méně stabilní stavění schodů,Brug buggier trappe bygning,Benutze fehlerhafte Treppenbaufunktion,,Uzi pli ciman ŝtupo-konstruadon,Usar construcción defectuosa de escaleras,,Käytä viallisempaa portaanrakennusfunktiota,Construction d'escalier plus buggée,,Bugosabb lépcsőépítés használata,Usa la struttura a scalinate più buggata,バグだらけの階段生成を使用,구형 계단상승 효과 사용,Gebruik buggier trapgebouw,Bruk buggier trappebygging,Użyj wadliwej funkcji budowania schodów,Usar construção defeituosa de escadas,,Utilizare mod de ridicare al scărilor incorect,Использовать неисправленное построение лестниц,Користи непоправљено грађење степеница,Använda en mer buggig trappbyggnad,Daha az doğru merdiven binası kullanın, +Use Doom's floor motion behavior,CMPTMNU_FLOORMOVE,,,Use Doom's floor motion behaviour,Použít původní chování Doomu pro pohyb podlah,Brug Dooms gulv bevægelsesadfærd,Benutze Dooms Verhalten für bewegende Böden,,Uzi konduton de Doom por plankmovo-konduto,Usar comportamiento de mov. del suelo de Doom,,Lattialiike käyttäytyy kuin Doomissa,Mouvement des sols à la DOOM,,Doom jellegű padló mozgás,Adotta il comportamento di DOOM per il movimento sul pavimento,DOOMでの床の動作挙動を使用,표면이나 천장이 서로 통과가 가능함,Gebruik Doom's vloer beweging vloer,Bruk Dooms gulvbevegelsesatferd,Użyj zachowanie ruchu podłogi Dooma,Usar comportamento de mov. do chão de Doom,,Utilizare comportament de mișcare al podelelor din Doom,Поведение движения по полу из Doom,Користи Doom-ово подно моционо понашање,Använd Dooms golvrörelsebeteende,Doom'un zemin hareketi davranışını kullanın, +Use Doom's point-on-line algorithm,CMPTMNU_POINTONLINE,,,,Použít původní algoritmus bod-na-čáře z Doomu,Brug Dooms point-on-line algoritme,Benutze Dooms Punkt-auf-Linie Algorithmus,,Uzi algoritmon de Doom por trovi punkton sur linio,Usar algoritmo de punto en línea de Doom,,Käytä Doomin piste viivalla -algoritmia,Algorithme point-sur-ligne de DOOM,,Doom jellegű point-on-line algoritmus,Usa l'algoritmo del 'punto giacente sulla linea' di DOOM,DOOMでのポイントライン アルゴリズム を使用,구형 선상 지점 정의법 사용,Gebruik Doom's point-on-line-algoritme,Bruk Dooms punkt-på-nett-algoritme,Użyj algorytmu punktu na linii z Dooma,Usar algorítmo de ponto-em-linha de Doom,,Utilizare algoritm point-on-line din Doom,Использовать алгоритм «точка на линии» из Doom,Користи Doom-ов point-on-line алгоритам,Använda Dooms algoritm för punkt-till-linje-arbete,Doom'un point-on-line algoritmasını kullanın, +Level exit can be triggered more than once,CMPTMNU_MULTIEXIT,,,,Odchod z levelu může být spuštěn vícekrát,Level exit kan udløses mere end én gang,Ausgang kann mehr als einmal aktiviert werden,,Nivelelirejo povas esti ekagigita pli ol unufoje,La salida de nivel puede ser activada más de una vez,,Tasosta poistumisen voi laukaista useammin kuin kerran,Sortie niveau utilisable plusieures fois,,Pálya kijárat többször is triggerelhető,L'uscita del livello può attivarsi più di una volta,Exitを複数回起動出来る,레벨 출구 트리거 한 번 이상 작동,Niveau-uitgang kan meer dan eens worden geactiveerd,Nivåutgang kan utløses mer enn én gang,Wyjście z poziomu może być uruchomione więcej niż raz,Saída de fase pode ser ativada mais de uma vez,Saída de nível pode ser ativada mais de uma vez,Ieșirea nivelului poate fi activată de mai multe ori,Выходы могут быть активированы более одного раза,Излаз нивоа може бити активиран више пута,Nivåutgång kan utlösas mer än en gång,Seviye çıkışı birden fazla kez tetiklenebilir, +Physics Behavior,CMPTMNU_PHYSICSBEHAVIOR,,,Physics Behaviour,Fyzika,Fysik-adfærd,Physik-Verhalten,,Fizikokonduto,Comportamiento de la física,,Fysiikan käyttäytyminen,Comportement Physique,,Fizika viselkedés,Comportamento della fisica,物理の挙動,물리 관련 설정,Fysica gedrag,Fysikkoppførsel,Zachowanie Fizyki,Comportamento de Física,Comportamento das Físicas,Comportament fizică,Поведение физики,Физичко понашање,Fysikbeteende,Fiziksel Davranış, +Actors are infinitely tall,CMPTMNU_NOPASSOVER,,,,Objekty jsou nekonečně vysoké,Aktører er uendeligt høje,Akteure sind unendlich hoch,,Aktoroj estas senfine altaj,Los actores son infinitamente altos,,Oliot ovat äärettömän korkeita,Hauteur des acteurs infinie,,Személyek végtelen magasak,Gli attori sono infinitamente alti,アクターの上下には入れない,무한으로 키가 큰 개체,Acteurs zijn oneindig lang,Skuespillere er uendelig høye,Aktorzy są nieskończenie wysocy,Atores são infinitamente altos,,Actorii au înălțime infinită,Объекты бесконечно высокие,Глумци су бесконачно велики,Aktörerna är oändligt höga.,Aktörler sonsuz uzunlukta, +Boom scrollers are additive,CMPTMNU_BOOMSCROLL,,,,Boom posuvníky jsou aditivní,Boom scrollers er additive,Boom-Scroller sind additiv,,Skrolantaj Teksturaj de Boom estas adicia,Los scrollers de Boom son aditivos,,Boom-vierittimet ovat additiivisia,Glisseurs BOOM additifs,,Boom scroller-ek összeadódnak,Le barre di scorrimento BOOM sono additivi,BOOM型スクロール床を適用,붐 스크롤러 누적법 사용,Boom scrollers zijn additief,Boom scrollere er additive,Przewijane tekstury Boom są addytywne,Scrollers de Boom são aditivos,,Elementele derulante BOOM sunt aditive,Конвейеры из BOOM складываются с собой,Boom скролери су додаци,Boom scrollers är additiva,Bom kaydırıcıları katkı maddelidir, +Cannot travel straight NSEW,CMPTMNU_BADANGLES,,,,Nelze se pohybovat přímo na SJVZ,Kan ikke rejse lige NSØV,Bewegungsrichtungen direkt NSOW nicht möglich,,Ne eblas veturi rekte NSEW,Emular error de mal ángulo,,Liikkuminen puhtaasti pääilmansuuntiin mahdotonta,Direction pure NSEO impossible,,Nem haladhat egyenes vonalban NSEW,Non si può viaggiare esattamente nelle direzioni cardinali,NSEW直進走法の不許可,전방위 방향으로 이동 불가,Kan niet rechtdoor reizen NZOW,Kan ikke reise rett NSØV,Pozwól na błąd złego kąta,Impossível se deslocar reto em direções cardeais,Impossível se deslocar em frente em direções cardeais,Interzice deplasarea liniară NSEW,Запрещено двигаться прямо на С/Ю/З/В,Немогуће путовати право на NSEW,Kan inte resa rakt NSÖV,Düz seyahat edemez KGDB, +Enable wall running,CMPTMNU_WALLRUN,,,,Povolit wall running (běhaní pomocí zdi),Aktiver vægløb,Ermögliche Wandrennen,,Ebligi kuradon sur muroj,Activar correr por muros,,Salli seinäjuoksu,Activer Wallrunning,,Falon futás engedélyezése,Wall running abilitata,壁伝い走行を許可,벽면가속이동 허용,Wandloop mogelijk maken,Aktiver veggkjøring,Włącz szybkie bieganie wzdłuż ścian,Habilitar corrida por paredes,Permitir corrida pelas paredes,Permite fuga cu ajutorul pereților (Wallrun),Включить быстрый бег вдоль стен (wallrunning),Омогући пролажење кроз зида,Aktiverar väggkörning,Duvar çalışmasını etkinleştirin, +Raven scrollers use original speed,CMPTMNU_RAVENSCROLL,,,,Raven posuvníky používají původní rychlost,Raven scrollers bruger original hastighed,Raven-Scroller benutzen originale Geschwindigkeit,,Skrolantaj teksturoj de Raven uzas originalan rapidecon,Los scrollers de Raven usan la velocidad original,,Ravenin vierittimet liikkuvat alkuperäisnopeudella,Glisseurs Raven à leur vitesse originale,,Raven scroller-ek eredeti sebességűek,Le barre di scorrimento Raven usano la velocità originale,Raven式スクロール床を原作準拠にする,구형 헤러틱/헥센 스크롤러 사용,Raven scrollers gebruiken originele snelheid,Raven scrollers bruker original hastighet,Przwijane tekstury podłogi Raven używają oryginalną prędkość,Scrollers da Raven usam velocidade original,,Elementele derulante Raven folosesc viteza originală,Конвейеры из Raven используют неизменённую скорость,Raven скролери користе оригиналну брзину,Raven-skrollers använder ursprunglig hastighet,Kuzgun kaydırıcılar orijinal hızı kullanır, +Self ref. sectors don't block shots,CMPTMNU_TRACE,,,,Sebe-odkazující sektory neblokují střely,Selvreflekterende sektorer blokerer ikke for skud,Selbstreferenzierende Sektoren blockieren keine Schüsse,,Sinreferencantaj sektoroj ne baras pafojn,Sectores autoreferidos no bloquean los disparos,,Itseensä viittaavat sektorit eivät estä laukauksia,Secteur autoréférencé ne bloque pas les tirs,,Saját ref.sektorok nem blokkkolják a lövéseket,Settori autoreferenziati non bloccano i colpi,Self ref.Sectorsは射撃を阻害しない,자기 참조 섹터가 총탄을 막지 않음,Zelfreferentie sectoren blokkeren geen schoten,Selvrefererende sektorer blokkerer ikke skudd.,Sektory odnoszoce się do siebie nie blokują strzałów,Setores autorreferidos não bloqueiam tiros,,Sectoarele cu referință proprie blochează focurile,Самоссылающиеся секторы не блокируют выстрелы,Самореф. сектори не блокирају пуцњеве,Självbetjäningssektorer blockerar inte skott.,Kendi kendine hakemlik yapan sektörler atışları engellemez., +Use Doom code for hitscan checks,CMPTMNU_HITSCAN,,,,Použít původní Doom kód pro kontrolu hitscanů,Brug Doom-code til hitscan-kontrol,Benutze Original-Doom-Code für Hitscan-Checks,,Uzi kodon de Doom por batskanoj-kontrolado,Usar código de Doom para revisión de hitscan,,Käytä Doomin osumislaskentakoodia,Vérification Hitscan à la DOOM,,Doom kód használata a hitscan ellenőrzéshez,Usa il codice DOOM per il controllo sugli hitscan,DOOM式の即着弾判定を使用,구형 총탄 판정법 사용,Gebruik Doom-code voor hitscancontroles,Bruk Doom-kode for treffkontroll,Użyj kod Dooma dla hitscanu,Usam código de Doom para verificação de hitscan,Usar código de Doom para verificação de hitscan,Utilizează cod din Doom pentru a verifica coliziunea focurilor,Использовать код из Doom для проверок зон мгновенного попадания (hitscan),Користи Doom код за хитскен проверу,Använd Doom-kod för hitscan-kontroller,Hitscan kontrolleri için Doom kodunu kullanın, +Use Doom heights for missile clipping,CMPTMNU_MISSILECLIP,,,,Použít původní výšky z Doomu pro kolizi raket,Brug Doom-højder til missilklipper,Benutze Doom-Größen für Kollisionen mit Projektilen,,Uzi altojn de Doom por misilo-tonadoj,Usar altura de Doom para desplazamiento de misiles,,Käytä Doomin korkeuksia lentokappaleiden törmäyksissä,Clipping des missiles à la DOOM,,Doom féle magasság használata a rakáta találathoz,Usa le altezze di DOOM per il clipping del razzo,ミサイル通過にDOOM heightsを使用,구형 발사체 판정법 사용,Gebruik Doom hoogtes voor het knippen van raketten,Bruk Doom-høyder for missilklipping,Użyj wysokości Dooma dla przenikania pocisków,Usar alturas de Doom para colisão de projéteis,,Utilizează metoda de verificare a înălțimilor din Doom,Использовать высоту из Doom для столкновения ракет,Користи Doom висине за клиповање ракета,Använd Doom-höjder för missilklippning.,Füze kırpma için Doom yüksekliklerini kullanın, +Rendering Behavior,CMPTMNU_RENDERINGBEHAVIOR,,,Rendering Behaviour,Vykreslování,Rendering Adfærd,Renderverhalten,,Bildigado-Konduto,Comportamiento de renderizado,,Hahmonnuksen käyttäytyminen,Comportement d'affichage,,Renderelés viselkedése,Comportamento della grafica,レンダリングの挙動,렌더링 관련 설정,Rendering gedrag,Gjengivelse av oppførsel,Zachowanie Renderowania,Comportamento de Renderização,,Comportament Video,Поведение обработки,Понашање рендовања,Beteende vid rendering,Rendering Davranışı, +Draw polyobjects like Hexen,CMPTMNU_POLYOBJ,,,,Vykreslovat polyobjekty jako Hexen,Tegn polyobjekter som Hexen,Zeichne Polyobjekte wie in Hexen,,Desegni plurangulo-objektojn kiel Hexen,Dibujar poliobjetos como en Hexen,,Piirrä polyobjektit niin kuin Hexen,Dessiner les Polyobjets comme Hexen,,Hexen féle tárgy kirajzolás,Polioggetti disegnati come Hexen,Hexen式のPolyObjects描画,구형 폴리오브젝트 시스템 사용,Teken polyobjecten zoals Hexen,Tegn polyobjekter som Hexen,Rysuj poliobiekty jak w Hexenie,Desenhar poliobjetos como em Hexen,,Afișează poliobiectele precum în Hexen,Отрисовка полиобъектов как в Hexen,Цртај поли-објекте као Hexen,Rita polyobjekt som Hexen,Hexen gibi çoklu nesneler çizin, +Ignore Y offsets on masked midtextures,CMPTMNU_MASKEDMIDTEX,,,,Ignorovat Y posuny na průhledných mid-texturách,Ignorer Y offsets på maskerede midtextures,Ignoriere Y-Offsets bei transparenten Mitteltexturen,,Malatenti Y-deŝovaĵojn sur maskitaj midtekstaĵoj,Ignorar offsets de eje Y en texturas medias enmascaradas,,Älä huomioi Y-siirroksia peitetyissä keskipintakuvioinneissa,Offsets Y ignorés sur les textures centrales,,Függőleges mozgatás ignorálása a maszkolt midtextúráknál,Ignora gli offset Y sulle midtexture mascherate,マスクされた中間テクスチャーのY軸ずれを無効,이면선분의 중앙 텍스쳐의 Y축값 무시,Negeer Y compensaties op gemaskerde middentexturen,Ignorer Y-forskyvninger på maskerte mellomteksturer,Ignoruj przesunięcia osi Y na zamaskowanych teksturach po środku,Ignorar offsets de Y em texturas centrais,,Ignoră offsetul Y de pe texturile 3D mascate,Игнорировать смещение по вертикали на средних текстурах с маской,Игнориши Y нагиб на маскиране средње текстуре,Ignorera Y-förskjutningar på maskerade midtexturer.,Maskelenmiş orta dokularda Y ofsetlerini yoksay, +Invert sprite sorting,CMPTMNU_SPRITESORT,,,,Obrátit řazení spritů,Inverter sprite-sortering,Umgekehrte Spritesortierung,,Inversigi ordigadon de mov-rastrumoj,Invertir ordenado de sprites,,Käännä spritelajittelu,Ordres des sprites inversé,,Sprite rendzés megfordítása,Ordinamento sprite invertito,反転スプライトの並び替え,구형 스프라이트 겹침 판정 사용,Sprite sorteren omkeren,Inverter sprite-sortering,Odwróć sortowanie sprite'ów,Inverter ordem de sprites,,Inversare sortare sprite-uri,Обратить порядок сортировки спрайтов,Обрнуто сортирање спрајтова,Invertera sprite-sortering,Sprite sıralamasını ters çevir, +Sound Behavior,CMPTMNU_SOUNDBEHAVIOR,,,Sound Behaviour,Zvuk,Adfærd med lyd,Sound-Verhalten,,Sonkonduto,Comportamiento de sonido,,Äänen käyttäytyminen,Comportement Sonore,,Hang viselkedés,Comportamento suono,音の挙動,효과음 관련 설정,Geluidsgedrag,Lydoppførsel,Zachowanie dźwięku,Comportamento de Áudio,,Comportament Sunet,Поведение звуков,Понашање звука,Ljudbeteende,Ses Davranışı, +Cripple sound for silent BFG trick,CMPTMNU_SOUNDSLOTS,,,,Zmrzačit zvukový systém pro trik tichého BFG,Lyd forkrøblet ved lydløst BFG-trick,Amputiere Soundsystem für geräuschloses BFG,,Kripligi sonon por lertaĵo de silenta BFG,Estropear sonido para truco de BFG silencioso,,Rampauta äänijärjestelmä hiljaista BFG-temppua varten,Massacrer le son pour BFG silencieux,,Bénító hang a halk BFG trükknél,Blocca il suono per il trucco del BFG silenzioso,消音BFG技の為にサウンドを重複させない,소음 BFG 효과 허용,Kreupel geluid voor een stille BFG-truc,Krymp lyd for stille BFG-triks,Obetnij dźwięk dla triku cichego BFG,Bloquear som para o truque da BFG silenciosa,,Taie sunetul pentru trucul BFG silențios,Ограничить звуки ради трюка бесшумной BFG,Онемогући звук за тихи ВЈП трик,Förlamning av ljudet vid tyst BFG-trick,Sessiz BFG numarası için sesi kısın, +Don't let others hear your pickups,CMPTMNU_SILENTPICKUP,,,,Ostatní tě neslyší sbírat předměty,Lad ikke andre høre dine pickupper,Andere können deine Gegenstandsaufnahmen nicht hören,,Ne lasi aliulojn aŭdas viajn prenadojn,No dejar a otros oír tus recogidas,,"Älä anna muiden kuulla, kun poimit esineitä",Autres joueurs n'entendent pas les ramassages,,Mások ne hallhassák a tárgy felvételeidet,Non consentire agli altri giocatori di sentire le tue raccolte,他人にピックアップ音を聞かせない,상대방의 습득 효과음 청음 불가,Laat anderen uw pick-ups niet horen,Ikke la andre høre pickupene dine,"Nie pozwalaj by inni słyszeli, że podnosisz przedmioty",Não permitir que outros ouçam sua coleta de itens,Não permitir que outros ouçam sua aquisição de itens,Nu permite celorlalți să audă sunetul ridicării obiectelor,Запрещать другим слышать звук подбора предметов,Не допусти да други чују ваше скупљање,Låt inte andra höra dina pickuper,Başkalarının manyetiklerinizi duymasına izin vermeyin, +Inst. moving floors are not silent,CMPTMNU_SILENTINSTANTFLOORS,,,,Okamžitě pohybující se podlahy nejsou tiché,Inst. bevægelige gulve er ikke lydløse,Böden mit sofortiger Bewegung machen Geräusche,,Tujaj movantaj plankoj ne estas silentaj,Suelos inst. movibles no son silenciosos,,Silmänräpäyksellisesti liikkuvat lattiat eivät ole hiljaisia,Sols à movement instanté font du bruit,,Halk isntant mozgó padló,I pavimenti istantanei in movimento non sono silenziosi,即時稼働するFloorsの音を鳴らさない,즉발식 이동표면 소음효과 제거,Direct bewegende vloeren zijn niet geruisloos,Øyeblikkelig bevegelige gulv er ikke stille,Nagle przesuwające się podłogi nie są ciche,Pisos que se deslocam instantâneamente emitem som,,Podelele care se mișcă instant nu sunt silențioase,Мгновенно двигающиеся полы не беззвучны,Инстантно покрећући нивои нису тихи,Inst. rörliga golv är inte tysta,Inst. hareketli zeminler sessiz değildir, +Sector sounds use center as source,CMPTMNU_SECTORSOUNDS,,,Sector sounds use centre as source,Sektorové zvuky používají jeho střed jako zdroj,Sektorlyde bruger centrum som kilde,Sektor-Sounds benutzen den Mittelpunkt des Sektors,,Sektorsonoj uzas centron kiel fonto,Sonidos de sector usan el centro como fuente,,Sektoriäänet käyttävät keskipistettä lähteenä,Sons secteur utilisent centre comme origine,,Center forrás használata a szektor hangoknál,I suoni usano il centro dei settori come punto di sorgente,Sectorサウンドをフロア中央で鳴らす,섹터 중심부를 효과음의 원천으로 판정,Sectorgeluiden gebruiken centrum als bron,Sektorlyder bruker senter som kilde,Dźwięki sektorów używają środka jako źródła,Sons de setor são emitidos a partir do centro,,Sunetele sectoarelor au ca sursă centrul,Звуки секторов используют центр как источник,Секторски звукови су центрисани,Sektorljud använder centrum som källa,Sektör sesleri kaynak olarak merkezi kullanır, +Sounds stop when actor vanishes,CMPTMNU_SOUNDCUTOFF,,,,"Utnout zvuky, když jejich objekt zmizí","Lydene stopper, når aktøren forsvinder","Sounds werden beendet, wenn der Akteur verschwindet",,"Sonoj ĉesas, kiam aktoro malaperas",El sonido se detiene cuando el actor desaparece,,"Äänet lakkaavat, kun olio katoaa",Sons s'arrêtent quand acteur disparait,,Hangok megszűnnek az eltűnéskor,I suoni si fermano quando gli attori svaniscono,アクター消滅で音を止める,효과음 원천 소멸 시 효과음도 중단,Geluiden stoppen wanneer de acteur verdwijnt,Lyder stopper når skuespilleren forsvinner,Dźwięki zatrzymują się kiedy aktor znika,Som para quando o ator desaparece,,Sunetele se opresc când actorul sursă dispare,Останавливать звуки при исчезновении объекта,Звукови престају кад глумац нестане,Ljudet upphör när aktören försvinner,Aktör ortadan kaybolduğunda sesler kesilir, +Use original sound target handling,CMPTMNU_SOUNDTARGET,,,,Použít původní chování pro uchování zvukového cíle,Brug original lydmålhåndtering,Benutze originale Behandlung für das Sound-Ziel,,Uzi originalan manipuladon por soncelo,Usar manejo de destino de sonido original,,Käytä alkuperäistä äänen kohteen käsittelyä,Ciblage des sons selon algorithme original,,Eredeti hang célpont kezelés,Targeting dei suoni in base all'algoritmo originale,元のサウンドターゲット処理を使用,구형 섹터 경고음 보존법 사용,Gebruik originele geluidsdoelwitverwerking,Bruk original lydmålhåndtering,Użyj oryginalną obsługę celu dźwięku,Usar método original de destino de som,,Procesare originală pentru sursele de sunet,Неизменённая обработка источников звука,Користи оригинални звук руковања метом,Använd original ljudmålshantering,Orijinal ses hedefi kullanımını kullanın, +Scripted teleports don't trigger sector actions,CMPTMNU_TELEPORT,,,,Skriptované teleportace neaktivují sektorové akce,Scriptede teleporteringer udløser ikke sektorhandlinger,Teleports in Skripten lösen keine Sektoraktionen aus,,Skriptitaj teleportoj ne ekagigas sektor-agojn,Telepuertos por script no activan acciones del sector,,Käsikirjoitetut kaukosiirtimet eivät laukaise sektoritoimintoja,Téléports par scripts n'activent pas le secteur,,Szkriptelt teleportok nem triggerelnek szektor műveletet,I teletrasporti scriptati non attivano le azioni del settore,スクリプトテレポートではSector actionsを起こさない,순간이동 스크립트는 섹터 이벤트 발동 불가능,De gescripte teleports leiden niet tot acties in de sector.,Skriptede teleporter utløser ikke sektorhandlinger,Oskryptowane teleporty nie włączają akcji sektora,Teletransportes scriptados não ativam ações de setor,,Teleportările scriptate nu declanșează acțiuni în sectoare,Скриптовые телепорты не запускают действия секторов,Скриптовани телепортери не активирају секторске радње,Skriptbaserade teleporter utlöser inte sektoråtgärder.,Komut dosyası ışınlanmaları sektör eylemlerini tetiklemiyor, +Non-blocking lines can be pushed,CMPTMNU_PUSHWINDOW,,,,Neblokující čáry mohou být zmáčknuty,Ikke-blokerende linjer kan skubbes,Nicht-blockende Linien können angestoßen werden,,Nehaltantaj linioj povas esti premitaj,Líneas sin bloquear pueden ser presionadas,,Ei-tukkivia viivoja voi työntää,Lignes non-bloquantes sont non-poussables,,Nem blokkoló vonalak megnyomhatóak,Le linee non bloccanti possono essere spinti,Non-bloking linesを押せる,비차단 선분 밀어내기 가능,Niet-blokkerende lijnen kunnen worden geduwd,Ikke-blokkerende linjer kan skyves,Nieblokujące ściany mogą być pchnięte,Linhas não-bloqueadoras podem ser pressionadas,,Liniile care nu blochează pot fi împinse înapoi,Неблокирующие линии можно задействовать перемещением сквозь,Неблокирабе линје могу бити гурнуте,Linjer som inte blockerar kan skjutas,Engelleyici olmayan hatlar itilebilir, +Enable buggy CheckSwitchRange behavior,CMPTMNU_CHECKSWITCHRANGE,,,,Povolit nestabilní chování pro CheckSwitchRange,Aktiver den fejlbehæftede CheckSwitchRange-adfærd,Erlaube fehlerhaftes CheckSwitchRange Verhalten,,Ebligi cimajn kondutojn por CheckSwitchRange,Permitir comportamiento viejo de CheckSwitchRange,,Ota käyttöön viallinen CheckSwitchRange-käyttäytyminen,Fonction CheckSwitchRange buggée,,Bugos CheckSwitchRange mechanika bekapcsolás,Abilita il comportamento buggato del CheckSwitchRange,バグのあるCheckSwitchRangeを許可,구형 CheckSwitchRange 판정법 사용,Buggy CheckSwitchSwitchRange gedrag inschakelen,Aktiver fejlbehæftet CheckSwitchRange-adfærd,Zezwól na zepsute zachowanie CheckSwitchRange,Permitir comportamento CheckSwitchRange defeituoso,,Comportament incorect pentru CheckSwitchRange,Включить ошибочное поведение CheckSwitchRange,Омогући баговано CheckSwitchRange понашање,Aktivera det felsägande CheckSwitchRange-beteendet,Hatalı CheckSwitchRange davranışını etkinleştirin, +Enable buggy Strife railing,CMPTMNU_RAILINGHACK,,,,Povolit nestabilní zábradlí ze Strifu,Aktiver buggy Strife railing,Fehlerhafte Strife-Geländer,Ενεργοποιηση σπασμένης συμπεριφοράς καγκέλον για το Strife,Ebligi ciman reladon de Strife,Activar barandillas bugueadas de Strife,,Ota käyttöön Strifen vialliset kaiteet,Barrières buggées pour Strife,,Bugos Strife korlát bekapcsolása,Abilita il railing buggato di Strife,バグのあるStrife railingを許可,고전 스트라이프 철책 적용,Buggy mogelijk maken Strijk-reling,Aktiver fejlbehæftet Strife rekkverk,Włącz wadliwe bariery Strife'a,Permitir railing defeituoso do Strife,Permitir railing defeituoso do Strife,Utilizare comportament grilaj Strife incorect,Вернуть ошибочные перила в Strife,Омогући непоправљену ограду у Strife-у,Aktivera felande Strife-Räcken,Yanlış Strife korkuluğunu etkinleştirin, +No vertical thrust from explosions,CMPTMNU_EXPLODE1,,,,Exploze neodhazují do výšky,Ingen vertikal fremdrift fra eksplosioner,Keine vertikale Bewegung durch Explosionen,Καθόλου κατακόρυφη ώθηση απο εκρήξεις,Neniuj vertikalaj puŝoj de eksplodoj,No causar empuje vertical en explosiones,,Ei pystysuuntaista työntövoimaa räjähdyksistä,Explosions sans propulsion verticale,,A robbanásnak nincs függőleges lökése,Nessuna spinta verticale dalle esplosioni,爆風は垂直方向全域に影響しない,폭발시 수직방향 반동 억제,Geen verticale stuwkracht van explosies,Ingen vertikal skyvekraft fra eksplosjoner,Brak pionowego nacisku od eksplozji,Desativar propulsão vertical das explosões,,Fără împingere verticală de la explozii,Взрывы не отбрасывают вверх/вниз,Нема вертикалног гурања од експлозија,Ingen vertikal dragkraft från explosioner,Patlamalardan kaynaklanan dikey itme yok, +Use original Doom explosion behavior,CMPTMNU_EXPLODE2,,,Use original Doom explosion behaviour,Používat původní chování explozí Doomu,Brug original Doom eksplosionsadfærd,Benutze Original Doom Explosionsverhalten,Συμπεριφορά εκρήξεων απο το πρωτότυπο Doom,Uzi originalan konduton de Doom por eksplodoj ,Usar comportamiento de explosiones del DOOM original,,Käytä Doomin alkuperäisiä räjähdysten käyttäytymissääntöjä,Utiliser comportement Doom original,,Eredeti Doom robbanás mechanika használata,Usa l'originale comportamento dell'esplosione di DOOM,Doom本来の爆発動作を使用する,고전 둠의 폭발 반발력 적용,Gebruik het originele Doom explosiegedrag,Bruk original Doom-eksplosjonsatferd,Użyj oryginalnego zachowania eksplozji z Dooma,Usar comportamento original de explosões do Doom,,Utilizare comportament original pentru explozii,Использовать модель взрывов из Doom,Користи оригнално Doom понашање за експлозије,Använd det ursprungliga Doom-explosionsbeteendet,Orijinal Doom patlama davranışını kullanın, +,,player,,,,,,,,,,,,,,,,,,,,,,,,,,, +Red,PLYRMNU_RED,,,,Červená,Rød,Rot,,Ruĝo,Rojo,,Punainen,Rouge,,Piros,Rosso,赤の量,빨강,Rood,Rød,Czerwony,Vermelho,,Roșu,Красный,Црвева,Röd,Kırmızı, +Green,PLYRMNU_GREEN,,,,Zelená,Grøn,Grün,,Verdo,Verde,,Vihreä,Vert,,Zöld,Verde,緑の量,초록,Groen,Grønn,Zielony,Verde,,Verde,Зелёный,Зелена,Grön,Yeşil, +Blue,PLYRMNU_BLUE,,,,Modrá,Blå,Blau,,Bluo,Azul,,Sininen,Bleu,,Kék,Blu,青の量,파랑,Blauw,Blå,Niebieski,Azul,,Albastru,Синий,Плава,Blå,Mavi, +Class,PLYRMNU_PLAYERCLASS,,,,Třída,Klasse,Klasse,,Klaso,Clase,,Luokka,Classe,,Kaszt,Classe,役職,클래스,Klasse,Klasse,Klasa,Classe,,Clasă,Класс,Класа,Klass,Sınıf, +Skin,PLYRMNU_PLAYERSKIN,,,,,,,,Aspekto,Aspecto,,Ulkoasu,,,Kinézet,,外装,스킨,Uiterlijk,Hud,Wygląd,Aparência,,Textură,Облик,Скин,Hud,Cilt, +Switch on pickup,PLYRMNU_SWITCHONPICKUP,,,,Přepnout zbraň při sebrání,Tænd for pickup,Waffenwechsel bei Aufnahme,,Ŝanĝi armon ĉe preno,Elegir arma al coger una,Elegir arma al agarrar una,Vaihda uuteen aseeseen,Dernière arme,,Felvételkor váltás,Cambio d'arma quando si riceve,武器取得時に持ち替え,무기 획득 시 바꿈,Gebruik wapen meteen na oppakken,Slå på pickup,Przełącz po podniesieniu,Mudar de arma ao pegar,,Schimbare armă la ridicare,Смена оружия при подборе,Пребаци на покупљено оружје,Slå på pickupen,Elinize aldığınızda silahı değiştirin, +Press \cjSPACE,PLYRMNU_PRESSSPACE,,,,Zmáčkni \cjMEZERNÍK,Tryk på \cjSPACE,\cjLeertaste,,Premu \cjSPACON,Presiona \cjEspacio,,Paina \cjVÄLI \cfnähdäk-,\cjEspace,,Nyomj \cjSPACE -t,Premi \cjSPAZIO,\cjスペースキー,회전: \cjSPACE바,Druk op \cjSPACE,Trykk \cjSPACE,\cjSPACJA,Aperte \cjESPAÇO,,Apasă \cjSPACE,Нажмите \cjПРОБЕЛ,Притисните \cjSPACE,Tryck på \cjSPACE,\cjSPACE tuşuna basın, +to see front,PLYRMNU_SEEFRONT,,,,pro pohled zepředu,for at se forsiden,für Frontansicht,,por vidi vian antaŭon,para verte de frente,,sesi etupuolen,Pour L'Avant,,Előre nézni,per vedere avanti,で前面を表示,캐릭터 앞모습,om de voorkant te zien,for å se forsiden,by widzieć przód,para ver a frente,,pentru a vedea fața,для просмотра спереди,да видите спреда,för att se framsidan,ön tarafı görmek için, +to see back,PLYRMNU_SEEBACK,,,,pro pohled zezadu,for at se bagsiden,für Rückansicht,,por vidi vian malantaŭon,para verte por detrás,,sesi takapuolen,Pour l'Arrière,,Hátra Nézni,per vedere dietro,で背面を表示,캐릭터 뒷모습,om terug te kijken,for å se baksiden,by widzieć tył,para ver atrás,,pentru a vedea spatele,для просмотра сзади,да видите позади,för att se baksidan,geri görmek için, +Vertical Bullet Spread,PLYRMNU_VERTSPREAD,,,,Svislý rozptyl střelby,Lodret kuglespredning,Vertikale Streuung,,Vertikala Kugla Disvastiĝo,Dispersión vertical de la bala,,Pystysuora luodin leviäminen,Écartement vertical des balles,,Vertikális fegyver szórás,Diffusione dei proiettili in verticale,垂直方向の散弾,,Verticale kogelspreiding,Vertikal kulespredning,Pionowy rozrzut pocisków,Dispersão vertical das balas,,Recul Vertical Gloanțe,Вертикальный разброс пуль,,Vertikal kulspridning,Dikey Mermi Yayılımı, +,,controls,,,,,,,,,,,,,,,,,,,,,,,,,,, +Weapon Zoom,CNTRLMNU_ZOOM,,,,Přiblížení zbraně,Våbenzoom,Waffenzoom,Ζοομ,Armilzumo,Zoom del arma,,Aseen kiikaritähtäys,Zoom avec Arme,,Ráközelítés fegyverrel,Zoom dell'arma,ズーム,무기 조준,Wapen Zoom,Våpen Zoom,Przybliżenie Broni,Zoom da Arma,,Zoom Armă,Приближение,Зум,Vapenzoom,Silah Yakınlaştırma, +Weapon State 1,CNTRLMNU_USER1,,,,Akce zbraně 1,Våbenstatus 1,Waffen-Aktion 1,Κατάσταση Όπλου 1,Armilstato 1,Estado del arma 1,,Aseen tila 1,Etat d'Arme 1,,Fegyver 1. állapot,Stato dell'arma 1,武器特殊動作 1,무기 상태 1,Wapenstaat 1,Våpenstat 1,Stan Broni 1,Estado da Arma 1,,Poziție Armă 1,Функция первого оружия,Стање оружја (1),Vapen Åtgärd 1,Silah Durumu 1, +Weapon State 2,CNTRLMNU_USER2,,,,Akce zbraně 2,Våbenstatus 2,Waffen-Aktion 2,Κατάσταση Όπλου 2,Armilstato 2,Estado del arma 2,,Aseen tila 2,Etat d'Arme 2,,Fegyver 2. állapot,Stato dell'arma 2,武器特殊動作 2,무기 상태 2,Wapenstaat 2,Våpenstat 2,Stan Broni 2,Estado da Arma 2,,Poziție Armă 2,Функция второго оружия,Стање оружја (2),Vapen Åtgärd 2,Silah Durumu 2, +Weapon State 3,CNTRLMNU_USER3,,,,Akce zbraně 3,Våbenstatus 3,Waffen-Aktion 3,Κατάσταση Όπλου 3,Armilstato 3,Estado del arma 3,,Aseen tila 3,Etat d'Arme 3,,Fegyver 3. állapot,Stato dell'arma 3,武器特殊動作 3,무기 상태 3,Wapenstaat 3,Våpenstat 3,Stan Broni 3,Estado da Arma 3,,Poziție Armă 3,Функция третьего оружия,Стање оружја (3),Vapen Åtgärd 3,Silah Durumu 3, +Weapon State 4,CNTRLMNU_USER4,,,,Akce zbraně 4,Våbenstatus 4,Waffen-Aktion 4,Κατάσταση Όπλου 4,Armilstato 4,Estado del arma 4,,Aseen tila 4,Etat d'Arme 4,,Fegyver 4. állapot,Stato dell'arma 4,武器特殊動作 4,무기 상태 4,Wapenstaat 4,Våpentilstand 4,Stan Broni 4,Estado da Arma 4,,Poziție Armă 4,Функция четвёртого оружия,Стање оружја (4),Vapen Åtgärd 4,Silah Durumu 4, +Fly / Swim up,CNTRLMNU_MOVEUP,,,,Letět / plavat vzhůru,Flyv / svøm op,Fliegen / Hochschwimmen,Πέτα/Κολύμπα πάνω,Flugi/Naĝi supren,Volar/Nadar arriba,,Lennä / Ui ylös,Voler/Nager en haut,,Repülés / Felfele úszás,Vola / Nuota in alto,飛行/水泳時 上昇,위로 날기 / 해엄치기,Omhoog vliegen/zwemmen omhoog,Fly / Svøm opp,Lot / Pływanie w górę,Voar / Nadar para cima,,Zbor / Înot în Sus,Лететь/плыть вверх,Лети/пливај нагоре,Flyga/simma upp,Uç / Yüz yukarı, +Fly / Swim down,CNTRLMNU_MOVEDOWN,,,,Letět / plavat dolů,Flyv / svøm ned,Fliegen / Runterschwimmen,Πέτα/Κολύμπα κάτω,Flugi/Naĝi malsupren,Volar/Nadar abajo,,Lennä / Ui alas,Voler/Nager en bas,,Repülés / Lefele úszás,Vola / Nuota in basso,飛行/水泳時 下降,아래로 날기 / 해엄치기,Naar beneden vliegen/zwemmen,Fly / Svøm ned,Lot / Pływanie w dół,Voar / Nadar para baixo,,Zbor / Înot în Jos,Лететь/плыть вниз,Лети/пливај надоле,Flyga/simma ner,Uç / Yüz aşağı, +Stop flying,CNTRLMNU_LAND,,,,Přestat létat,Stop flyvning,Landen,Σταμάτα πέταμα,Ĉesi flugadon,Dejar de volar,,Lopeta lentäminen,Arrêter de voler,,Repülés abbahagyása,Stop al volo,飛行停止,비행 정지,Stoppen met vliegen,Slutt å fly,Przestań latać,Parar de voar,,Încetare Zbor,Приземлиться,Престани летети,Sluta flyga,Uçmayı bırak, +Keyboard look,CNTRLMNU_KEYBOARDLOOK,,,,Pohled klávesnicí,Tastatur-look,Tastatur-Blick,Κατακόρυφο κοίταχμα (Πλητρoλόγιο),Klavar-rigardo,Vista con teclado,,Näppäinkatselu,Vue au clavier,,Billentyűzettel való nézelődés,Modalità vista con la tastiera,キー視点上下化,키보드 룩,Toetsenbordaanzicht,Tastatur utseende,Rozglądanie się klawiaturą,Vista com o teclado,,Utilizare Tastatură pentru a Privi în Jur,Обзор клавиатурой,Гледај тастатуром,Tangentbordsutseende,Klavye görünümü, +Strife Popup Screens Controls,CNTRLMNU_POPUPS_TITLE,,,,Ovládání vyskakovacích oken ve Strife,Strife Popup-skærme Kontrolelementer,Strife Popup Steuerung einstellen,,Ŝprucfenestraĵoj de Strife,Ventanas emergentes de Strife,,Strifen ponnahdusruutujen ohjausasetukset,Contrôles Popups Strife,,Strife Felugró Ablak Irányítás,Controlli Schermate popup di Strife,Strifeポップアップ表示設定,스트라이프 팝업 화면 조작,Strife Popup Schermen Bediening,Strife Popup-skjermer Kontroller,Ustaw Klawisze Okienek Strife'a,Comandos de Popups do Strife,Controlos de Popups do Strife,Control pentru Mesaje Strife,Управление всплывающими окнами Strife,Искакајући прикази контроле у Strife-у,Strife Popup-skärmar Kontroller,Strife Açılır Ekran Kontrolleri, +Team say,CNTRLMNU_TEAMSAY,,,,Říct týmu,Team sige,Teamkommunikation,Πές στην ομάδα,Teama diro,Hablar al equipo,,Sano omille,Parler (équipe),,Üzenet csapattársaknak,Parla nella squadra,チーム内発言,팀 채팅하기,Zeggen in team,Lag si,Powiedz do Drużyny,Fala (equipe),Falar à equipa,Vorbește cu Echipa Proprie,Сообщение команде,Пиши тиму,Laget säger,Ekip diyor ki, +Drop item,CNTRLMNU_DROPITEM,,,,Odhodit předmět,Smid genstand,Gegenstand fallen lassen,Πέτα Aντικείμενο,Faligi objekton,Soltar objeto,,Pudota varuste,Lâcher objet,,Tárgy eldobása,Fai cadere l'oggetto,"アイテムを捨てる +",아이템 버리기,Item laten vallen,Slipp element,Upuść przedmiot,Largar item,,Aruncare Obiect,Выбросить предмет,Баци предмет,Släpp föremål,Eşyayı bırak, +Query item,CNTRLMNU_QUERYITEM,,,,Informace o předmětu,Forespørgsel element,Informationen über Gegenstand,,Informpeti objekton,Consultar objeto,,Hae varustetta,Vérifier objet,,Rákérdez a tárgy eldobásnál,Indaga sull'oggetto,アイテム名を表示,아이템 정보 표시,Vraag item op,Spør om element,Zapytaj o przedmiot,Consultar item,,Cercetare Obiect,Проверить предмет,Прикажи предмет,Fråga efter objekt,Sorgu öğesi, +Drop weapon,CNTRLMNU_DROPWEAPON,,,,Odhodit zbraň,Smid våben,Waffe fallen lassen,Πέτα Όπλο,Faligi armilon,Soltar arma,,Pudota ase,Lâcher arme,,Fegyver eldobása,Butta l'arma,武器を捨てる,무기 버리기,Wapen laten vallen,Slipp våpen,Upuść broń,Largar arma,,Aruncare Armă,Выбросить оружие,Баци оружје,Släpp vapen,Silahı bırak, +Other,CNTRLMNU_OTHER,,,,Ostatní,Andre,Andere,Άλλα,Alia,Otros,,Muu,Autres,,Más,Altro,その他,그 외 조작,Andere,Annet,Inne,Outro,,Altele,Прочее,Остало,Annat,Diğer, +Coop spy,CNTRLMNU_COOPSPY,,,,Co-op špehování,Coop-spion,Coop Spion,,Kunlabora spiono,Espía cooperativo,,Vakoile joukkuetovereita,Espionner Coéquiper,,Coop leskelődés,Spia cooperativa,他者視点,멀티플레이 카메라,Coöpspion,Coop-spion,Śledź (kooperacja),Visualização coop,,Vedere prin Ochii Altui Jucător,Вид от другого игрока,Поглед од другог играча,Spion för samarbete,Coop casusu, +Strife Popup Screens,CNTRLMNU_POPUPS,,,,Vyskakovací okna Strife,Strife popup-skærme,Strife Popups,,Ŝprucfenestraĵoj de Strife,Ventanas emergentes de Strife,,Strifen ponnahdusruudut,Popups de Strife,,Strife Felugró Ablakok,Schermate popup di Strife,Strife ポップアップ画面,스트라이프 팝업 화면,Strife Popup Schermen,Strife Popup-skjermer,Okienka Strife'a,Popup do Strife,,Mesaje Strife,Всплывающие окна Strife,Информација у Strife-у,Strife Popup-skärmar,Strife Açılır Ekranları, +Mission objectives,CNTRLMNU_MISSION,,,,Úkoly mise,Mål for en mission,Missionsziele,Στόχοι Αποστολής,Taskoceloj,Objetivos de misión,,Tehtävätavoitteet,Objectifs de Mission,,Küldetési célok,Obiettivi della missione,ミッションオブジェクト,임무 목록,Missiedoelen,Oppdragets mål,Cele misji,Objetivos da missão,,Obiectivele Misiunii,Текущее задание,Циљ мисије,Mål för uppdraget,Görev hedefleri, +Keys list,CNTRLMNU_KEYS,,,,Seznam klíčů,Liste over nøgler,Schlüsselliste,Λίστα Κλειδιών,Ŝlosilolisto,Lista de llaves,,Avainlista,Liste des Clés,,Kulcslista,Lista delle chiavi,キー類リスト,열쇠 목록,Lijst van toetsen,Liste over nøkler,Lista kluczy,Lista de teclas,,Listă Chei,Список ключей,Списка кључева,Lista över nycklar,Anahtar listesi, +Weapons/ammo/stats,CNTRLMNU_STATS,,,,Zbraně/munice/staty,Våben/ammo/stats,Waffen/Munition/Statistik,Οπλα/Πυρομαχικά/Στατιστικές,Armiloj/municio/stataĵoj,Armas/Munición/Estadísticas,,Aseet/ammukset/tila,"Statistiques, armes et munitions",,Fegyver/lőszer/statisztika,Armi/ammunizioni/statistiche,武器 / 弾薬 / 状態,무기/탄약/통계 목록,Wapens/ammo/statistieken,Våpen/ammunisjon/statistikk,Bronie/amunicja/statystyki,Armas/munição/estatísticas,,Arme/muniție/statistici,"Оружие, патроны и показатели",Оружје/муниција/статистика,Vapen/ammo/statistik,Silahlar/mühimmat/istatistikler, +Toggle Scoreboard,CNTRLMNU_TOGGLESCOREBOARD,,,,Přepnout tabulku skóre,Skift Scoreboard,Punktetafel an/aus,Ενεργοποίηση Πίνακα Σκόρ,Baskuligi poentotabulon,Alternar Marcador,,Pistetaulun vaihtokytkin,Afficher Scores (alterner),,Eredményjelző kapcsoló,Abilita/disabilita tabella punteggio,スコアボード切替,점수창 토글,Scorebord aan/uit,Veksle resultattavle,Włącz / Wyłącz tablicę wyników,Ativar/desativar placar,Ligar/desligar Pontuação no Ecrã,Comutator pentru Tabela de Marcaj,Таблица очков (перекл.),Табела (без држања),Växla resultattavla,Skor Tablosunu Değiştir, +Lookspring,MOUSEMNU_LOOKSPRING,,,,Automatické vystředění pohledu,Centret automatisk,Automatisch zentrieren,,Rigardsalto,Mirar con ratón,,Katseenpalautin,Recentrer après Vue Souris,,,,視点水平化,마우스룩 시점 초기화,Automatisch centraliseren,Sentrer automatisk,Automatyczne Wyśrodkowanie,Centralizar automaticamente,Centrar automáticamente,Mișcare a jucătorului prin mouse,Передвижение мышью,Покрет мишем,Centrum automatiskt,Merkez otomatik olarak, +Lookstrafe,MOUSEMNU_LOOKSTRAFE,,,,Použít myš k pohybu do stran,Flyt sidelæns med musen,Seitwärts bewegen mit der Maus,,Rigardturnmovo,Mirar con movimiento,,Sivuttaisastuntapalautin,Mouvement Latéral par Souris,,,,視点横移動化,마우스룩 좌우 이동,Zijwaartse muisbeweging,Flytt sidelengs med musen,Unikanie przy użyciu myszki,Deslocamento lateral com o mouse,Deslocamento lateral com o rato,Mișcare în diagonală cu mouse,Движение боком мышью,Стрејф мишем,Flytta i sidled med musen,Fare ile yana doğru hareket ettirin, +,,Map colors,,,,,,,,,,,,,,,,,,,,,,,,,,, +Background,MAPCOLORMNU_BACKCOLOR,,,,Pozadí,Baggrund,Hintergrund,,Fono,Fondo,,Tausta,Fond,,Háttér,Sfondo,背景,배경,Achtergrond,Bakgrunn,Tło,Fundo,,Fundal,Фон,Позадина,Bakgrund,Arka plan, +You,MAPCOLORMNU_YOURCOLOR,,,,Ty,Du,Du,,Vi,Tú,,Sinä,Votre couleur,,Te,Tu,自分,당신,,Du,Ty,Você,Tu,Tu,Вы,Ти,Du,Sen, +1-sided walls,MAPCOLORMNU_WALLCOLOR,,,,Jednostranné zdi,1-sidede vægge,Einseitige Wände,,1-flankaj muroj,Paredes de 1 lado,,Yksipuoliset seinät,Murs à 1 côté,,1 oldalú falak,Muri unilaterali,壁,단면 벽들,1-zijdige wanden,1-sidige vegger,Jednostronne ściany,Paredes de 1 lado,,Pereți cu o singură față,Односторонние стены,Једнострани зид,1-sidiga väggar,1 taraflı duvarlar, +2-sided walls with different floors,MAPCOLORMNU_FDWALLCOLOR,,,,Oboustranné zdi s různými podlahami,2-sidede vægge med forskellige gulve,Zweiseitige Wände mit unterschiedlicher Bodenhöhe,,2-flankaj muroj kun malsamaj plankoj,Paredes de 2 lados con pisos distintos,,Kaksipuoliset seinät eroavilla lattiakorkeuksilla,Murs à 2 côtés avec différents sols,,2 oldalú falak különböző padlókkal,Muri bilaterali con pavimenti diversi,高低差のある床,다른 층 추가된 양면 벽들,2-zijdige wanden met verschillende vloeren,2-sidige vegger med forskjellige gulv,Dwustronne ściany z innymi piętrami,Paredes de 2 lados com pisos diferentes,,Pereți cu două fețe si podele diferite,Двусторонние стены с разными полами,Двострани зид са различитим нивоима,2-sidiga väggar med olika golv,Farklı zeminlere sahip 2 taraflı duvarlar, +2-sided walls with different ceilings,MAPCOLORMNU_CDWALLCOLOR,,,,Oboustranné zdi s různými stropy,2-sidede vægge med forskellige lofter,Zweiseitige Wände mit unterschiedlicher Deckenhöhe,,2-flankaj muroj kun malsamaj plafonoj,Paredes de 2 lados con techos distintos,,Kaksipuoliset seinät eroavilla kattokorkeuksilla,Murs à 2 côtés avec différents plafonds,,2 oldalú falak különböző plafonnal,Muri bilaterali con soffitti diversi,高低差のある天井,다른 천장 추가된 양면 벽들,2-zijdige wanden met verschillende plafonds,2-sidige vegger med forskjellige tak,Dwustronne ściany z innymi sufitami,Paredes de 2 lados com tetos diferentes,,Pereți cu două fețe si tavane diferite,Двусторонние стены с разными потолками,Двострани зид са различитим плафонима,2-sidiga väggar med olika tak,Farklı tavanlara sahip 2 taraflı duvarlar, +2-sided walls with 3D floors,MAPCOLORMNU_EFWALLCOLOR,,,,Oboustranné zdi s 3D podlahami,2-sidede vægge med 3D-gulve,Zweiseitige Wände mit 3D-Ebenen,,2-flankaj muroj kun 3D-plankoj,Paredes de 2 lados con suelos 3D,,Kaksipuoliset seinät kolmiulotteisilla lattioilla,Murs à 2 côtés avec sols 3d,,2 oldalú falak 3D-s padlókkal,Muri bilaterali con 3D floor,多重床,3D 층 추가된 양면 벽들,2-zijdige wanden met 3D-vloeren,2-sidige vegger med 3D-gulv,Dwustronne ściany z piętrami 3D,Paredes de 2 lados com pisos 3D,,Pereți cu două fețe si podele 3D,Двусторонние стены с 3D полами,Двострани зид са 3D нивоима,2-sidiga väggar med 3D-golv,3D zeminli 2 taraflı duvarlar, +Map grid,MAPCOLORMNU_GRIDCOLOR,,,,Mřížka,Kortgitter,Kartengitter,,Mapkrado,Cuadrícula del mapa,,Kartan ruudukko,Quadrillage,,Pálya szél,Griglia mappa,マップグリッド,맵 격자,Kaart raster,Kartrutenett,Siatka mapy,Grade do mapa,Grelha do mapa,Grilă hartă,Цвет сетки,Мапа координатне мреже,Kartnät,Harita ızgarası, +Center point,MAPCOLORMNU_XHAIRCOLOR,,,Centre point,Středobod,Midterpunkt,Mittelpunkt,,Centra punkto,Punto central,,Keskipiste,Point Central,,Pálya közepe,Punto centrale,中心点,중간 지점,Middenpunt,Midtpunkt,Środek,Ponto central,,Punct în centru,Курсор,Централна тачка,Centrumpunkt,Merkez noktası, +Not-yet-seen walls,MAPCOLORMNU_NOTSEENCOLOR,,,,Neobjevené zdi,"Vægge, der endnu ikke er synlige",Ungesehene Wände,,Vidotaj muroj,Paredes sin ver,,Tutkimattomat seinät,Murs non découvers,,Még nem látott falak,Muri ancora da scoprire,未見の壁,안 본 벽들,Nog niet zichtbare wanden,Vegger som ennå ikke er sett,Jeszcze niewidziane ściany,Paredes não vistas até o momento,,Ziduri încă neobservate,Необнаруженные стены,Неоткривени зидови,Väggar som ännu inte har setts,Henüz görülmemiş duvarlar, +Locked doors,MAPCOLORMNU_LOCKEDCOLOR,,,,Zamčené dveře,Låste døre,Verschlossene Türen,,Ŝlositaj pordoj,Puertas bloqueadas,,Lukitut ovet,Portes verouillées,,Zárt ajtók,Porte bloccate,鍵の掛かったドア,잠긴 문들,Gesloten deuren,Låste dører,Zablokowane drzwi,Portas trancadas,,Uși închise,Запертые двери,Закључана врата,Låsta dörrar,Kilitli kapılar, +Teleporter to the same map,MAPCOLORMNU_INTRALEVELCOLOR,,,,Teleportér,Teleporter til samme kort,Teleporter,,Teleportilo al la sama mapo,Teletransporte al mismo mapa,,Kaukosiirrin samaan tasoon,Téléporteurs (même niveau),,Ugyanarra a pályára teleportálás,Teletrasporto nella stessa mappa,テレポーター,같은 맵에 텔레포터 추가,Teleporter naar dezelfde niveau,Teleporter til samme kart,Teleporter do tej samej mapy,Teletransportador para o mesmo mapa,,Teleportor către aceeași hartă,Телепорт в пределах уровня,Телепортер до истог нивоа,Teleporter till samma karta,Aynı haritaya ışınlayıcı, +Teleporter to a different map,MAPCOLORMNU_INTERLEVELCOLOR,,,,Teleportér do jiného levelu,Teleporter til et andet kort,Teleporter in ein anderes Level,,Teleportilo al alia mapo,Teletransporte a un mapa diferente,,Kaukosiirrin eri tasoon,Téléporteurs (autre niveau),,Másik pályára teleportálás,Teletrasporto in una mappa diversa,別マップへのテレポーター,다른 맵에 텔레포터 추가,Teleporter naar een andere niveau,Teleporter til et annet kart,Teleporter do innej mapy,Teletransportador para outro mapa,,Teleportor către altă hartă,Телепорт на другой уровень,Телепортер до различитог нивоа,Teleporter till en annan karta,Farklı bir haritaya ışınlayıcı, +Secret sector,MAPCOLORMNU_SECRETSECTORCOLOR,,,,Skrýš,Hemmelig sektor,Geheimer Sektor,,Sekreta sektoro,Sector secreto,,Salasektori,Secteur Secret,,Rejtekhely szektora,Settore segreto,シークレット,비밀 섹터,Geheime sector,Hemmelig sektor,Sekretny sektor,Setor secreto,,Sector secret,Тайный сектор,Тајни сектор,Hemlig sektor,Gizli sektör, +Unexplored secret,MAPCOLORMNU_UNEXPLOREDSECRETCOLOR,,,,Neobjevená skrýš,Uudforsket hemmelighed,nicht gefundener geheimer Sektor,,Neesplorita sekreto,Secreto sin explorar,,Tutkimaton sala,Secret non révélé,,Még fel nem fedezett rejtekhely,Segreto non esplorato,未知のシークレット,발견하지 않은 비밀,Onontgonnen geheim,Uutforsket hemmelighet,Niezbadany sekret,Segredo não-explorado,,Secret neexplorat,Необнаруженный тайник,Ноткривена тајна,Oexploaterad hemlighet,Keşfedilmemiş sır, +Special trigger lines,MAPCOLORMNU_SPECIALWALLCOLOR,,,,Akční čáry,Særlige udløserlinjer,Spezielle Linien,,Specialaj ekagilo-linioj,Líneas especiales de activación,,Erikoislaukaisinviivat,Lignes d'actions spéciales,,Speciális trigger vonalak,Linee di attivazione speciali,特殊トリガー,특수 트리거 선,Speciale trekkerlijnen,Spesielle utløserlinjer,Specjalne linie przełączników,Linhas de ativação especiais,,Linii declașatoare speciale,Специальные спусковые линии,Специјалне линије окидача,Särskilda utlösningslinjer,Özel tetik hatları, +Cheat Mode,MAPCOLORMNU_CHEATMODE,,,,Cheatovací režim,Snyd-tilstand,Cheat-Modus,,Tromp-Reĝimo,Modo de truco,,Huijaustila,Mode Cheat,,Csalás mód,Modalità cheat,チートモード時,치트 모드,Bedriegingsmodus,Juksemodus,Tryb oszustwa,Modo trapaça,Modo de Batota,Modul Trișor,Чит-режим,Чит мод,Fuskläge,Hile Modu, +Invisible 2-sided walls,MAPCOLORMNU_TSWALLCOLOR,,,,Neviditelné oboustranné zdi,Usynlige 2-sidede vægge,Unsichtbare zweiseitige Wände,,Nevideblaj 2-flankaj muroj,Paredes de 2 lados Invisibles,,Näkymättömät kaksipuoliset seinät,Murs à 2 côtés invisibles,,Láthatatlan 2 oldalú falak,Muri invisibili bilaterali,表示されないline,투명한 양면 벽,Onzichtbare 2-zijdige wanden,Usynlige 2-sidige vegger,Niewidzialne dwustronne ściany,Paredes invisíveis de 2 lados,,Pereți cu două fețe invizibili,Невидимые двусторонние стены,Невидљиви двострани зидови,Osynliga 2-sidiga väggar,Görünmez 2 taraflı duvarlar, +Secret walls,MAPCOLORMNU_SECRETWALLCOLOR,,,,Tajné zdi,Hemmelige vægge,Geheime Wände,,Sekretaj muroj,Paredes secretas,,Salaiset seinät,Murs Secrets,,Titkos falak,Muri segreti,シークレットの壁,비밀 벽,Geheime muren,Hemmelige vegger,Sekretne ściany,Paredes secretas,,Pereți ascunși,Тайные стены,Тајни зидови,Hemliga väggar,Gizli duvarlar, +Actors,MAPCOLORMNU_THINGCOLOR,,,,Objekty,Skuespillere,Akteure,,Aktoroj,Actores,,Oliot,Acteurs,,Játékos,Attori,アクター,개체,Acteurs,Skuespillere,Aktorzy,Atores,,Actori,Объекты,Актори,Skådespelare,Aktörler, +Monsters,MAPCOLORMNU_MONSTERCOLOR,,,,Příšery,Monstre,Monster,,Monstroj,Monstruos,,Hirviöt,Monstres,,Szörnyek,Mostri,モンスター,적들,,Monstre,Potwory,Monstros,,Monștri,Монстры,Чудовишта,Monster,Canavarlar, +Non-counting Monsters,MAPCOLORMNU_NONCOUNTINGMONSTERCOLOR,,,,Nepočítané příšery,Ikke-tællende monstre,nicht gezählte Monster,,Nenombradaj Monstroj,Monstruos no contados,Monstruos sin contar,Ei-laskettavat hirviöt,Monstres non comptés,,Nem számolt szörnyek,Mostri non contati,非カウントモンスター,킬수에 포함 되지 않는 적들,Niet-tellende Monsters,Ikke-tellende monstre,Niezliczane Potwory,Monstros não contados,,Monștri neacoperiți de numărătoare,Неучитываемые монстры,Не рачунајући чудовишта,Icke-räknande monster,Sayılamayan Canavarlar, +Friends,MAPCOLORMNU_FRIENDCOLOR,,,,Přátelé,Venner,Freunde,,Amikoj,Amigos,,Omat,Amis,,Barátok,Amici,仲間,친구들,Vrienden,Venner,Przyjaciele,Amigos,,Prieteni,Дружественные,Пријатељи,Vänner,Arkadaşlar, +Items,MAPCOLORMNU_ITEMCOLOR,,,,Předměty,Genstande,Gegenstände,,Objektoj,Objetos,,Esineet,Objets,,Tárgyak,Oggetti,アイテム,아이템들,Artikelen,Gjenstander,Przedmioty,Itens,,Obiecte,Предметы,Предмети,Föremål,Eşyalar, +Count Items,MAPCOLORMNU_COUNTITEMCOLOR,,,,Počítané předměty,Tælle genstande,gezählte Gegenstände,,Nombri Objektojn,Objetos contados,Conteo de objetos,Laske esineet,Objets comptés,,Tárgyak számolása,Oggetti contati,カウント対象アイテム,아이템 계산,Tellen,Telle elementer,Zlicz przedmioty,Itens contados,,Numără obiectele,Учитываемые предметы,Рачунајући предмети,Räkna objekt,Sayım Öğeleri, +Overlay Mode,MAPCOLORMNU_OVERLAY,,,,Překryvný režim,Overlay-tilstand,Überlagerungsmodus,,Surmeto-Reĝimo,Modo sobrepuesto,,Projisointitila,Mode surimpression,,Overlay mód,Modalità sovrapposizione,オーバーレイモード,오버레이 모드,Overlaadmodus,Overleggsmodus,Tryb Nakładki,Modo de sobreposição,,Mod acoperit,Прозрачный режим,Провидна аутомапа,Överlagringsläge,Kaplama Modu, +Overlay Cheat Mode,MAPCOLORMNU_OVCHEATMODE,,,,Překryvný cheatovací režim,Overlay snydetilstand,Überlagerungsmodus Cheats,,Surmeto-Tromp-Reĝimo,Sobreposición modo de truco,,Projisointihuijaustila,Mode Cheat Surimpression,,overlay csaló mód,Modalità cheat sovrapposizione,オーバーレイ チートモード,치트 모드 오버레이,Overlaadmodus Cheats,Overlegg-juksemodus,Tryb Nakładki Oszustwa,Modo trapaça de sobreposição,Modo Batota de Sobreposição,Mod acoperit trișor,Прозрачный чит-режим,Провидни читови,Överlagrat fuskläge,Kaplama Hile Modu, +Portal Overlays,MAPCOLORMNU_PORTAL,,,,Portálové překryvy,Portal-overlejringer,Portalüberlagerung,,Portalo-Surmetoj,Sobreposición de portal,,Portaaliprojisoinnit,Portails superposés,,Portál overlay-ek,Sovrapposizioni del portale,ポータル オーバーレイ,포탈 오버레이,Portaaloverlays,Portal-overlegg,Nakładanie się Portali,Sobreposição de portais,,Acoperiri portaluri,Порталы в прозрачном режиме,Провидни портали,Överlagringar i portalen,Portal Kaplamaları, +,,Messages,,,,,,,,,,,,,,,,,,,,,,,,,,, +Messages,MSGMNU_TITLE,,,,Nastavení oznámení,Meddelelser,Nachrichten,,Mesaĝoj,Mensajes,,Viestit,,,Üzenetek,Messaggi,メッセージ類,메시지들,Berichten,Meldinger,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке,Meddelanden,Mesajlar, +Show messages,MSGMNU_SHOWMESSAGES,,,,Zobrazit oznámení,Vis meddelelser,Zeige Nachrichten,,Montri mesaĝojn,Mostrar mensajes,,Näytä viestit,Afficher messages,,Üzenetek mutatása,Mostra messaggi,メッセージ表示,메시지 표시,Berichten tonen,Vis meldinger,Pokaż wiadomości,Exibir mensagens,,Afișare mesaje,Отображение сообщений,Прикажи поруке,Visa meddelanden,Mesajları göster, +Show obituaries,MSGMNU_SHOWOBITUARIES,,,,Zobrazit oznámení o smrtích,Vis dødsannoncer,Zeige Todesanzeigen,,Montri nekrologojn,Mostrar obituarios,,Näytä kuolinviestit,Afficher avis de décès,,Halálok mutatása,Mostra i necrologi,訃報表示,사망 메시지 표시,Doodsbrieven tonen,Vis dødsannonser,Pokaż nekrologi,Exibir obituários,,Afișare necrologuri,Отображение некрологов,Прикажи читуље,Visa dödsannonser,Ölüm ilanlarını göster, +Show secret notifications,MSGMNU_SHOWSECRETS,,,,Zobrazit zprávy o skrýších,Vis hemmelige meddelelser,Zeige Geheimnismeldung,,Montri sciigojn de sekretoj,Mostrar notificación de secretos,,Ilmoita salojen löytymisestä,Afficher secrets,,Titkos üzenetek mutatása,Mostra le notifiche dei segreti,シークレット発見表示,비밀 알림 표시,Geheime meldingen tonen,Vis hemmelige meldinger,Pokaż wiadomości znalezienia sekretu,Exibir notificação de segredos,,Afișare notificări pentru secrete,Отображение сообщений о тайниках,Прикажи тајне нотификације,Visa hemliga meddelanden,Gizli bildirimleri göster, +Minimum message level,MSGMNU_MESSAGELEVEL,,,,Minimální úroveň oznámení,Mindste beskedniveau,Min. Nachrichtenanzeigestufe,,Minimuma nivelo de mesaĝoj,Nivel mínimo de mensaje,,Pienin viestintätaso,Niveau de message minimum,,Milyen üzenet jelenjen meg,Numero di messaggi minimo,最小メッセージレベル,메시지 축소량,Minimaal berichtenniveau,Minste meldingsnivå,Poziom minimalnych wiadomości,Nível mínimo de mensagem,,Nivel minim de afișare mesaje,Минимальный уровень сообщений,Минимум левел порука,Minsta nivå för meddelanden,Minimum mesaj seviyesi, +Message Colors,MSGMNU_MESSAGECOLORS,,,Message Colours,Barva oznámení,Farver på meddelelser,Nachrichtenfarben,,Mesaĝkoloroj,Colores de los mensajes,,Viestien värit,Couleur des messages,,Üzenet színek,Colore dei messaggi,メッセージ色,메시지 색상,Bericht Kleuren,Meldingsfarger,Kolory Wiadomości,Cores de mensagem,,Culori Mesaje,Цвета сообщений,Боје порука,Färger för meddelanden,Mesaj Renkleri, +Item Pickup,MSGMNU_ITEMPICKUP,,,,Sebrání předmětu,Afhentning af varer,Genommene Gegenstände,,Objektoprenado,Coger objetos,Agarrar objetos,Esineen poimiminen,Objets ramassés,,Tárgy felvétele,Raccolta oggetti,アイテム取得,아이템 획득,Puntafhaling,Henting av element,Podniesienie Przedmiotu,Coleta de item,Aquisição de Itens,Ridicare obiecte,Подбор предмета,Покупити предмет,Upphämtning av objekt,Bir eşyayı almak, +Obituaries,MSGMNU_OBITUARIES,,,,Oznámení o úmrtí,Dødsannoncer,Todesanzeigen,,Nekrologoj,Obituarios,,Kuolinviestit,Avis de décès,,Halálok,Necrologi,死亡時メッセージ,사망 메시지,Doodsbrieven,Nekrologer,Nekrologi,Obituários,,Necrologuri,Некрологи,Читуље,Dödsannonser,Ölüm İlanları, +Critical Messages,MSGMNU_CRITICALMESSAGES,,,,Kritická oznámení,Kritiske meddelelser,Kritische Nachrichten,,Gravaj Mesaĝoj,Mensajes críticos,,Tärkeät viestit,Messages d'erreur,,Fontos üzenetek,Messaggi critici,致命的なメッセージ,중요한 메시지,Kritische berichten,Kritiske meldinger,Wiadomości krytyczne,Mensagens críticas,,Mesaje Critice,Важные сообщения,Критичне поруке,Kritiska meddelanden,Kritik Mesajlar, +Chat Messages,MSGMNU_CHATMESSAGES,,,,Chatová oznámení,Chat-meddelelser,Chatnachrichten,,Babilmesaĝoj,Mensajes del chat,,Keskusteluviestit,Message de Chat,,Chat üzenetek,Messaggi chat,チャットメッセージ,채팅 메시지,Chatberichten,Chat-meldinger,Wiadomości czatu,Mensagens de chat,,Mesaje Conversație,Сообщения в чате,Ћаскања,Chatt-meddelanden,Sohbet Mesajları, +Team Messages,MSGMNU_TEAMMESSAGES,,,,Týmová oznámení,Hold-meddelelser,Teamnachrichten,,Teammesaĝoj,Mensajes del equipo,,Joukkueen viestit,Messages d'équipe,,Csapat chat üzenetek,Messaggi chat di squadra,チームメッセージ,팀 채팅 메시지,Team Berichten,Team-meldinger,Wiadomości czatu drużynowego,Mensagens de equipe,Mensagens de Equipa,Mesajele Echipei Proprii,Командные сообщения в чате,Тимске поруке,Meddelanden till laget,Ekip Mesajları, +Centered Messages,MSGMNU_CENTEREDMESSAGES,,,Centred Messages,Oznámení na střed,Centrerede meddelelser,Zentrierte Nachrichten,,Centritaj Mesaĝoj,Mensajes centrados,,Keskitetyt viestit,Messages centrés,,Üzenet középre igazítása,Messaggi centrati,スクリプトメッセージ,중간에 위치한 메시지,Gecentreerde berichten,Sentrerte meldinger,Wyśrodkowane wiadomości,Mensagens centralizadas,Mensagens Centradas,Mesaje Centrate,Центрированные сообщения,Централне поруке,Centrerade meddelanden,Merkezli Mesajlar, +Screenshot messages,MSGMNU_SCREENSHOTMESSAGES,,,,Oznámení o snímcích obrazovky,Beskeder med skærmbilleder,Screnshot-Meldungen,,Mesaĝoj de ekrankopio,Mensajes de captura de pantalla,,Kuvakaappausviestit,Messages de capture d'écran,,Képernyőkép készítés visszajelzés,Messaggi di cattura schermo,スクショメッセージ,스크린샷 메시지,Screenshot berichten,Skjermbilde-meldinger,Wiadomości o zrobieniu zrzutu ekranu,Mensagens de captura de tela,Mensagen de captura de ecrã,Mesaje Capturi Ecran,Сообщения о снимках экрана,Скриншот поруке,Meddelanden med skärmdump,Ekran görüntüsü mesajları, +Detailed save messages,MSGMNU_LONGSAVEMESSAGES,,,,Detailní oznámení o uložené hře,Detaljerede beskeder om lagring,Detaillierte Speicher-Meldungen,,Detalaj konservmesaĝoj,Mensajes detallados de guardado,,Yksityiskohtaiset tallennusviestit,Messages de sauvegarde détailés,,Részletes mentési információ,Messaggi sui dettagli di salvataggio,詳細なセーブメッセージ,자세한 저장 메시지,Gedetailleerde berichten voor op te slaan,Detaljerte lagringsmeldinger,Szczegółowe wiadomości o zapisie,Mensagens detalhadas de salvamento,Mensagens detalhadas de gravação,Mesaje detaliate pentru salvări,Подробные сообщения о сохранениях,Детаљно сачуване поруке,Detaljerade meddelanden om sparande,Ayrıntılı kaydetme mesajları, +Developer message mode,MSGMNU_DEVELOPER,,,,Vývojářská oznámení,Meddelelsestilstand for udviklere,Entwickler-Modus,,Reĝimo de mesaĝoj por programistoj,Modo de mensajes de desarrollador,,Pelinkehittäjäviestitila,Mode de Développement,,Fejlesztői üzenetek,Modalità messaggi per sviluppatore,開発者用モード,개발자 메시지 모드,Berichtenmodus voor ontwikkelaars,Meldingsmodus for utviklere,Tryb wiadomości deweloperskich,Modo de mensagens de desenvolvedor,,Mod mesaje pentru dezvoltator,Режим сообщений для разработчиков,Поруке девелопера,Meddelandeläge för utvecklare,Geliştirici mesaj modu, +,,Automap,,,,,,,,,,,,,,,,,,,,,,,,,,, +Map color set,AUTOMAPMNU_COLORSET,,,Map colour set,Barevné schéma,Farvesæt til kort,Farbset,,Mapkoloro-agordaĵo,Definir colores,,Kartan värikokoelma,Set de couleurs de la carte,,Pálya térkép szín séma,Colori della mappa,地図色セット,맵 색상 설정,Kaartkleurenset,Kartfargesett,Zestaw kolorów mapy,Definir cores de mapa,,Set culori hartă,Цвета автокарты,Боје за мапу,Färgsättning av kartan,Harita renk seti, +Allow map defined colors,AUTOMAPMNU_CUSTOMCOLORS,,,Allow map defined colours,Povolit barvy dle modů,Tillad kortdefinerede farver,Erlaube levelspezifische Farben,,Permesi mapdefinitajn kolorojn,Permitir colores definidos,,Salli tason määrittelemät värit,Couleurs définies par carte,,Pálya orientált színséma használata,Consenti i colori definiti dalla mappa,定義したマップ色の許可,맵 정의 색상 허용,Niveau-specifieke kleuren toestaan,Tillat kartdefinerte farger,Pozwól na kolory zdefiniowne przez mapę,Permitir cores definidas por mapa,,Permite culorilor să fie definite de hartă,Разрешить определённые уровнем цвета автокарты,Дозволи дефинисане боје за мапу,Tillåter kartdefinierade färger,Harita tanımlı renklere izin ver, +Set custom colors,AUTOMAPMNU_SETCUSTOMCOLORS,,,Set custom colours,Vlastní barvy,Indstil brugerdefinerede farver,Benutzerdefinierte Farben,,Agordi laŭmendajn kolorojn,Fijar colores personalizados,,Mukauta värejä,Choisir couleurs personnalisées,,Egyéni színek beállítása,Modifica i colori personalizzati,カスタム色を決める,사용자 지정 색상 설정,Aangepaste kleuren instellen,Angi egendefinerte farger,Spersonalizuj kolory,Definir cores personalizadas,,Setare culori personalizate,Задать свои цвета,Промени боје,Ställ in egna färger,Özel renkleri ayarlama, +Customize map controls,AUTOMAPMNU_CONTROLS,,,,Ovládání mapy,Tilpas kontrolelementer til kortet,Automapsteuerung einstellen,,Adapti mapregilojn,Personalizar controles del mapa,,Kartanohjausasetukset,Choisir contrôles de la carte,,Térkép irányítás testreszabása,Personalizza i controlli mappa,マップコントロール カスタマイズ,맵 조작 설정,Kaartcontroles aanpassen,Tilpass kartkontroller,Ustaw klawisze mapy,Configurar comandos de mapa,,Personalizare schemă de control a hărții,Управление автокартой,Промени контроле мапе,Anpassa kartkontroller,Harita kontrollerini özelleştirme, +Overlay automap,AUTOMAPMNU_OVERLAY,,,,Překryvná mapa,Overlay automap,Überlagere Automap,,Surmeti aŭtomatan mapon,Superponer automapa,,Projisoi automaattikartta,Carte en Surimpression,,Képen felüli térkép,Copri l'automappa,オートマップを重ねる,오토맵을 오버레이,Overlay automap,Overlegg automatisk kart,Nałożenie mapy,Sobreposição de automapa,,Acoperire hartă computerizată,Прозрачная автокарта,Провидна аутомапа,Överlagring av automap,Yerleşim otomatik haritası, +Enable textured display,AUTOMAPMNU_TEXTURED,,,,Textury,Aktiver tekstureret visning,Texturanzeige,,Ŝalti teksturitan ekranon,Mostrar automapa texturizado,,Ota käyttöön pintakuvioinnit,Activer affichage texturé,,Textúrázott térkép,Abilita la mostra texture,床テクスチャ表示を許可,텍스쳐 디스플레이 허용,Structuurweergave inschakelen,Aktiver teksturert visning,Włącz oteksturowanie mapy,Habilitar automapa texturizado,Permitir automapa texturizado,Activare mod texturat,Текстуры на автокарте,Омогући приказ текстура,Aktivera texturerad visning,Dokulu ekranı etkinleştir, +Show item counts,AUTOMAPMNU_SHOWITEMS,,,,Počet předmětů,Vis tællinger af emner,Zeige Gegenstandsanzahl,,Montri nombron de objektoj,Mostrar conteo de objetos,,Näytä esineiden lukumäärä,Afficher compte d'objets,,Tárgy számláló mutatása,Mostra il conteggio degli oggetti,アイテム数 表示,주운 아이템의 갯수를 표시,Toon artikeltellingen,Vis antall elementer,Pokaż liczbę przedmiotów,Exibir contagem de itens,,Afișare numărătoare obiecte,Количество предметов,Прикажи бројач за предмете,Visa antal objekt,Öğe sayılarını göster, +Show monster counts,AUTOMAPMNU_SHOWMONSTERS,,,,Počet příšer,Vis monstertællinger,Zeige Monsteranzahl,,Montri nombron de monstroj,Mostrar conteo de monstruos,,Näytä hirviöiden lukumäärä,Afficher compte de monstres,,Szörny számláló mutatása,Mostra il conteggio dei mostri,モンスター数 表示,죽인 적의 횟수 표시,Toon monstertellingen,Vis antall monster,Pokaż liczbę potworów,Exibir contagem de monstros,,Afișare numărătoare monștri,Количество монстов,Прикажи бројач за чудовишта,Visa antal monster,Canavar sayılarını göster, +Show secret counts,AUTOMAPMNU_SHOWSECRETS,,,,Počet skrýší,Vis hemmelige tællinger,Zeige Geheimnisanzahl,,Montri nombron de sekretoj,Mostrar conteo de secretos,,Näytä salojen lukumäärä,Afficher compte de secrets,,Rejtekhely számláló mutatása,Mostra il conteggio dei segreti,シークレット数 表示,밝힌 비밀의 수 표시,Toon geheime tellingen,Vis hemmelige tellinger,Pokaż liczbę sekretów,Exibir contagem de segredos,,Afișare numărătoare secrete,Количество тайников,Прикажи бројач за тајне,Visa antalet hemligheter,Gizli sayıları göster, +Show time elapsed,AUTOMAPMNU_SHOWTIME,,,,Uplynulý čas na mapě,Vis den forgangne tid,Zeige vergangene Zeit,,Montri pasintan tempon,Mostrar tiempo transcurrido,,Näytä kulunut aika,Afficher temps passé,,Eltöltött idő mutatása,Mostra il tempo trascorso,経過時間 表示,경과한 시간 표시,Verstreken tijd tonen,Vis medgått tid,Pokaż ile czasu upłynęło,Exibir tempo decorrido,,Afișare timp petrecut pe hartă,Прошедшее время,Прикажи протекло време,Visa förfluten tid,Geçen süreyi göster, +Show total time elapsed,AUTOMAPMNU_SHOWTOTALTIME,,,,Celkový uplynulý čas,"Vis den samlede tid, der er gået",Zeige Gesamtzeit,,Montri tutan pasintan tempon,Mostrar tiempo total transc.,,Näytä yhteensä kulunut aika,Afficher total de temps passé,,Teljes eltelt idő mutatása,Mostra il tempo totale trascorso,統計時間 表示,누적 경과한 시간 표시,Toon de totale verstreken tijd,Vis total tid som har gått,"Pokaż całkowity czas, który upłynął",Exibir tempo total decorrido,,Afișare timp total petrecut în joc,Общее время,Прикажи укупно протекло време,Visa total tid som förflutit,Geçen toplam süreyi göster, +Show secrets on map,AUTOMAPMNU_MAPSECRETS,,,,Zobrazit skrýše,Vis hemmeligheder på kortet,Zeige Geheimnisse auf der Karte,,Montri sekretojn sur mapo,Mostrar secretos en el mapa,,Näytä salat kartalla,Afficher secrets sur carte,,Rejtekhelyek mutatása a pályán,Mostra i segreti nella mappa,シークレットを地図に表示,맵의 비밀을 표시,Toon geheimen op de kaart,Vis hemmeligheter på kartet,Pokaż sekrety na mapie,Exibir segredos no mapa,,Afișare secrete,Тайники на карте,Прикажи тајне на аутомапи,Visa hemligheter på kartan,Haritada sırları göster, +Show map label,AUTOMAPMNU_SHOWMAPLABEL,,,,Zobrazit název mapy,Vis kortmærke,Zeige Levelnamen,,Montri mapetikedon,Mostrar etiqueta del mapa,,Näytä tason tunniste,Afficher label de carte,,Pályacím mutatása,Mostra le etichette della mappa,マップ名 表示,맵의 이름 표시,Toon kaartlabel,Vis kartetikett,Pokaż etykietę mapy,Exibir etiqueta do mapa,,Afișare etichetă hartă,Название карты,Прикажи ознаку мапе,Visa kartans etikett,Harita etiketini göster, +Draw map background,AUTOMAPMNU_DRAWMAPBACK,,,,Pozadí mapy,Tegne kortbaggrund,Zeige Kartenhintergrund,,Desegni mapfondon,Dibujar fondo de mapa,,Piirrä tason tausta,Afficher fond d'écran carte,,Térkép háttér kirajzolása,Mostra lo sfondo della mappa,マップの背景 描写,맵의 배경 출력,Teken de achtergrond van de kaart,Tegn kartbakgrunn,Rysuj tło mapy,Desenhar fundo do mapa,,Afișare fundal hartă,Отображение фона автокарты,Нацртај позадину мапе,Rita kartans bakgrund,Harita arka planı çizme, +Show keys (cheat),AUTOMAPMNU_SHOWKEYS,,,,Zobrazení klíčů (podvod),Vis nøgler (snyd),Zeige Schlüssel (Cheat),,Montri klavojn (trompo),Mostrar llaves (truco),,Näytä avaimet (huijauskeino),Afficher les clés (cheat),,Kulcsok mutatása,Mostra le chiavi (cheat),鍵 表示(チート時),키를 표시 (치트),Toon sleutels (valsspeler),Vis nøkler (juks),Pokaż klucze (oszustwo),Exibir chaves (trapaça),,Afișare chei (trișare),Отображение ключей (чит-коды),Прикажи кључеве (чит),Visa nycklar (fusk),Tuşları göster (hile), +Show trigger lines,AUTOMAPMNU_SHOWTRIGGERLINES,,,,Zobrazení aktivujících čar,Vis trigger-linjer,Zeige Auslöserlinien,,Montri baskulliniojn,Mostrar líneas de activación,,Näytä laukaisinviivat,Afficher lignes d'action,,Trigger vonalak mutatása,Mostra le linee d'attivazione,トリガーライン 表示,트리거 선을 표시,Triggerlijnen tonen,Vis utløserlinjer,Pokaż linie przełączników,Exibir linhas de ativação,,Afișare linii declanșatoare,Отображение спусковых линий,Прикажи триггер линије,Visa utlösningslinjer,Tetik çizgilerini göster, +Show things as sprites,AUTOMAPMNU_SHOWTHINGSPRITES,,,,Zobrazení objektů jako spritů,Vis ting som sprites,Zeige Dinge als Sprites,,Montri aĵojn kiel mov-rastrumojn,Mostrar cosas como sprites,,Näytä oliot spriteinä,Afficher objets comme sprites,,Tárgyak sprite-ként megjelenítése,Mostra gli oggetti come sprite,thingsのスプライト表示,물체를 스프라이트로 표시,Toon dingen als sprites,Vis ting som sprites,Pokaż rzeczy jako sprite'y,Exibir objetos como sprites,,Afișare obiecte drept sprite,Отображение спрайтов объектов,Прикажи ствари као спрајтове,Visa saker som sprites,Nesneleri sprite olarak gösterme, +Overlay portals,AUTOMAPMNU_PTOVERLAY,,,,Překrývat portály,Overlay portaler,Überlagere Portale,,Surmeti portalojn,Sobreponer portales,,Projisoi portaalit,Superposer les portails,,Overlay portálok,Sovrapponi i portali,オーバーレイ ポータルズ,포탈을 오버레이,Overlappende portalen,Overlegg portaler,Nałóż portale,Sobreposição de portais,,Acoperire portaluri,Порталы в прозрачном режиме,Провидни портали,Överlagra portaler,Yerleşim portalları, +Empty space margin,AUTOMAPMNU_EMPTYSPACEMARGIN,,,,Práh prázdného prostoru,Tomrumsmargin,Breite des Randes,,Malplena spacia marĝeno,Margen de espacio vacío,,Tyhjän reunan leveys,Marge d'espace vide,,Üres hely szegély,Margine dello spazio vuoto,空間の余白,빈공간 여백,Breedte van de rand,Tøm mellomromsmargen,Opróżnij margines przestrzeni,Margem de espaço vazio,,Margine spațiu gol,Край автокарты,Празна маргина,Marginal för tomt utrymme,Boş alan marjı, +Mark font,AUTOMAPMNU_MARKFONT,,,,Písmo značek,Marker skrifttype,Zeichensatz für Markierungen,,Marki tiparon,Fuente para marcas,,Karttamerkkien fontti,Police Marqueur,,Jelzés betűtípus,Font del segnaposto,マークフォント,미니맵 마킹 폰트,Font voor markers,Merk skrifttype,Czcionka oznaczeń,Fonte das marcações,,Font marcaj,Шрифт отметок,Фонт ознака,Markera typsnitt,Mark yazı tipi, +Mark color,AUTOMAPMNU_MARKCOLOR,,,,Barva značek,Markere farve,Farbe für Markierungen,,Marki koloron,Color de las marcas,,Karttamerkkien väri,Couleur Marqueur,,Jelzés szín,Colore del segnaposto,マーク色,미니맵 마킹 색상,Markeer kleur,Merk farge,Kolor oznaczeń,Cor das marcações,,Culoare marcaj,Цвет отметок,Боја ознака,Markera färg,Renk işaretle, +Set mark,MAPCNTRLMNU_SETMARK,,,,Umístit značku,Indstille mærke,Setze Markierung,,Meti markon,Fijar marca,,Aseta merkki,Placer repère,,Jelzés beállítása,Aggiungi segnaposto,マークを置く,마크 추가,Markering instellen,Sett merke,Ustaw znacznik,Posicionar marcação,,Marcare,Поставить отметку,Постави ознаку,Ställ in märket,İşareti ayarla, +Clear mark,MAPCNTRLMNU_CLEARMARK,,,,Smazat značky,Slet markering,Lösche Markierung,,Forigi markon,Limpiar marca,,Pyyhi merkit,Enlever repères,,Jelzések törlése,Pulisci il segnaposto,マーククリア,마크 삭제,Duidelijke markering,Fjern merke,Usuń znacznik,Limpar marcação,,Ștergere marcaj,Убрать отметку,Уклони ознаку,Rensa markeringen,Açık işaret, +,,Scoreboard,,,,,,,,,,,,,,,,,,,,,,,,,,, +Scoreboard Options,DSPLYMNU_SCOREBOARD,,,,Tabulka skóre,Indstillinger for resultattavlen,Punktetabellenoptionen,,Poentotabulo-Agordoj,Opciones de marcador,,Pistetauluasetukset,Options Tableau des Scores,,Eredményjelző beállítások,Opzioni tabella punteggio,スコアボード オプション,점수창 설정,Scorebord opties,Alternativer for resultattavlen,Opcje Tablicy Wyników,Opções de Tela de Pontuação,,Opțiuni Tabelă de Marcaj,Таблица очков,Табеларне подешавања,Alternativ för resultattavlan,Skorbord Seçenekleri, +Scoreboard Options,SCRBRDMNU_TITLE,,,,Nastavení tabulky skóre,Indstillinger for resultattavlen,Punktetabellenoptionen,,Poentotabulo-Agordoj,Opciones de marcador,,Pistetauluasetukset,Tableau des Scores,,Eredményjelző beállítások,Opzioni per la tabella punteggio,スコアボード オプション,점수판 설정,Scorebord opties,Alternativer for resultattavlen,Opcje Tablicy Wyników,Opções de Tela de Pontuação,Opções do Ecrã de Pontuação,Setări Tabelă de Marcaj,Настройки таблицы очков,Подешавања бодовања,Alternativ för resultattavlan,Skorbord Seçenekleri, +Cooperative Options,SCRBRDMNU_COOPERATIVE,,,,Kooperativní mód,Samarbejdsmuligheder,Kooperativ-Optionen,,Kooperativo-Agordoj,Opciones de cooperativo,,Yhteispeliasetukset,Options Mode Coop,,Együttműködő beállítása,Opzioni per il gioco cooperativo,協力モードの設定,코옵 설정,Coöperatieve Opties,Samarbeidsalternativer,Opcje Kooperacji,Opções de Jogo Cooperativo,,Setări Mod Cooperativ,Настройки для команд,Подешавања сарадње,Alternativ för samarbete,Kooperatif Seçenekleri, +Enable Scoreboard,SCRBRDMNU_ENABLE,,,,Povolit tabulku skóre,Aktiver resultattavle,Punktetabelle aktiv,,Ŝalti Poentotabulon,Activar marcador,,Ota käyttöön pistetaulu,Activer Tableau des Scores,,Eredményjelző bekapcsolása,Abilita la tabella punteggio,スコアボード表示,점수판 허용,Scorebord inschakelen,Aktiver resultattavle,Zezwól na Tablicę Wyników,Habilitar Tela de Pontuação,Permitir Ecrã de Pontuação,Activare Tabelă de Marcaj,Включить таблицу очков,Омогући бодовање,Aktivera resultattavlan,Skor Tablosunu Etkinleştir, +Header Color,SCRBRDMNU_HEADERCOLOR,,,Header Colour,Barva hlavičky,Overskriftsfarve,Kopfzeilenfarbe,,Kapokoloro,Color de cabecera,,Otsikon väri,Couleur du Titre,,Fejléc szín,Colore della testata,ヘッダー色,헤더의 색깔,Kleur koptekst,Farge på topptekst,Kolor Nagłówka,Cor de Cabeçalho,,Culoare Antet,Цвет заголовка,Боја заглавља,Färg på rubriken,Başlık Rengi, +Your Player Color,SCRBRDMNU_YOURCOLOR,,,Your Player Colour,Barva tvého hráče,Din spillerfarve,Deine Spielerfarbe,,Via ludantkoloro,Color de tu jugador,,Pelaajasi väri,Votre couleur,,Játékos színe,Colore del giocatore 'Tu',自分の色,플레이어의 색깔,Uw Spelerskleur,Din spillerfarge,Twoje Kolory,Cor do Seu Jogador,Cor do teu Jogador,Culoarea Jucătorului Tău,Ваш цвет,Боја твога играча,Din spelares färg,Oyuncu Renginiz, +Other Players' Color,SCRBRDMNU_OTHERPLAYERCOLOR,,,Other Players' Colour,Barva ostatních hráčů,Andre spilleres farve,Andere Spielerfarbe,,Koloro de aliaj ludantoj,Color de otros jugadores,,Muiden pelaajien väri,Couleur des autres joueurs,,Más játékosok színe,Colore degli altri giocatori,他者の色,다른 플레이어들의 색깔,Andere spelerskleur,Andre spilleres farge,Kolory Innych Graczy,Cor de Outros Jogadores,Cor dos Outros Jogadores,Culorile Celorlalți Jucători,Цвет других игроков,Боја другог играча,Andra spelares färg,Diğer Oyuncuların Rengi, +Deathmatch Options,SCRBRDMNU_DEATHMATCH,,,,Deathmatch,Indstillinger for Deathmatch,Deathmatch-Optionen,,Mortmaĉo-Agordoj,Opciones modo a muerte,,Kuolonotteluasetukset,Options Deathmatch,,Deathmatch Beállítások,Opzioni deathmatch,デスマッチの設定,데스매치 설정,Deathmatch opties,Deathmatch-alternativer,Opcje Deathmatchu,Opções de Deathmatch,,Setări Deathmatch,Настройки боя насмерть,Детмеч подешавања,Alternativ för Deathmatch,Ölüm Maçı Seçenekleri, +Team Deathmatch Options,SCRBRDMNU_TEAMDEATHMATCH,,,,Týmový deathmatch,Indstillinger for Team Deathmatch,Team-Deathmatch-Optionen,,Teamo-Mortmaĉo-Agordoj,Opciones modo a muerte por equipos,,Joukkuekuolonotteluasetukset,Options Deathmatch en équipe,,Team Deathmatch Beállítások,Opzioni deathmatch a squadra,チームデスマッチの設定,팀 데스매치 설정,Team Deathmatch Opties,Lag Deathmatch-alternativer,Opcje Drużynowego Deathmatchu,Opções de Deathmatch de Equipe,Opções de Deathmatch de Equipa,Setări Deathmatch în Echipă,Настройки командного боя насмерть,Тимски детмеч подешавања,Alternativ för Team Deathmatch,Takım Ölüm Maçı Seçenekleri, +,,Alt HUD,,,,,,,,,,,,,,,,,,,,,,,,,,, +Alternative HUD,ALTHUDMNU_TITLE,,,,Alternativní HUD,Alternativ HUD,Alternatives HUD,,Alternativa HUD,HUD alternativo,,Vaihtoehtoinen tilanäyttö,ATH Alternatif,,Alternatív HUD,HUD alternativo,オルタナティブHUD,대체 HUD,Alternatieve HUD,Alternativ HUD,Alternatywny HUD,HUD alternativo,,Interfață pe Timp de Joc Alternativă,Альтернативное отображение информации,Алтернативни HUD,Alternativ HUD,Alternatif HUD, +Enable alternative HUD,ALTHUDMNU_ENABLE,,,,Povolit alternativní HUD,Aktiver alternativt HUD,Alternatives HUD eingeschaltet,,Ŝalti alternativan HUD,Activar HUD alternativo,,Ota käyttöön vaihtoehtoinen tilanäyttö,Activer l'ATH Alternatif,,Alternatív HUD bekapcsolása,Abilita HUD alternativo,オルタナティブHUD有効,대체 HUD 사용,Alternatieve HUD inschakelen,Aktiver alternativ HUD,Włącz alternatywny HUD,Habilitar HUD alternativo,,Activează Interfața pe Timp de Joc Alternativă,Включить альтернативное отображение,Укључи алтернативни HUD,Aktivera alternativ HUD,Alternatif HUD'yi etkinleştirin, +Show secret count,ALTHUDMNU_SHOWSECRETS,,,,Zobrazit počet skrýší,Vis hemmelig optælling,Zeige Geheimniszähler,,Montri sekretonombron,Mostrar cont. de secretos,,Näytä salojen lukumäärä,Afficher compteur de secrets,,Rejtekhely számláló mutatása,Mostra il conteggio dei segreti,シークレット数 表示,비밀 수 표시,Toon het aantal geheimen,Vis hemmelig antall,Pokaż liczbę sekretów,Exibir contagem de segredos,,Afișează numărul secretelor,Отображение обнаруженных тайников,Прикажи количину тајна,Visa hemligt antal,Gizli sayımı göster, +Show monster count,ALTHUDMNU_SHOWMONSTERS,,,,Zobrazit počet příšer,Vis monstertælling,Zeige Monsterzähler,,Montri monstronombron,Mostrar cont. de monstruos,,Näytä hirviöiden lukumäärä,Afficher compteur de monstres,,Szörny számláló mutatása,Mostra il conteggio dei mostri,モンスター数 表示,적 개체 수 표시,Toon het aantal monsters,Vis antall monstre,Pokaż liczbę zabójstw,Exibir contagem de monstros,,Afișează numărul de monștri,Отображение количества монстров,Прикажи количину чудовишта,Visa antalet monster,Canavar sayısını göster, +Show item count,ALTHUDMNU_SHOWITEMS,,,,Zobrazit počet předmětů,Vis optælling af genstande,Zeige Gegenstandszähler,,Montri objektonombron,Mostrar cont. de objetos,,Näytä esineiden lukumäärä,Afficher compteur d'objets,,Tárgy számláló mutatása,Mostra il conteggio degli oggetti,アイテム数の表示,아이템 수 표시,Toon het aantal items,Vis antall gjenstander,Pokaż liczbę przedmiotów,Exibir contagem de itens,,Afișează numărul de obiecte,Отображение количества предметов,Прикажи количину предмета,Visa antalet föremål,Öğe sayısını göster, +Show stamina and accuracy,ALTHUDMNU_SHOWSTATS,,,,Zobrazit výdrž a přesnost,Vis udholdenhed og nøjagtighed,Zeige Kondition und Genauigkeit,,Montri viglecon kaj akuratecon,Mostrar resistencia/precisión,,Näytä puhti ja tarkkuus,Afficher Endurance et Précision,,Állóképesség és pontosság mutatása,Mostra stamina e accuratezza,スタミナと精度の表示,스테미나와 정확도를 표시,Toon uithoudingsvermogen en nauwkeurigheid,Vis utholdenhet og nøyaktighet,Pokaż wytrzymałość i precyzję,Exibir resistência e precisão,,Afișează rezistența fizică si acuratețea,Отображение выносливости и точности,Прикажи издржљивост и прецизност,Visa uthållighet och noggrannhet,Dayanıklılık ve doğruluk gösterin, +Show berserk,ALTHUDMNU_SHOWBERSERK,,,,Zobrazit berserk,Vis berserk,Zeige Berserk,,Montri frenezecon,Mostrar berserker,,Näytä raivo,Afficher Berserk,,Berserk mutatása,Mostra il berserk,バーサーク表示,버서크 아이템을 표시,Toon berserk,Vis berserk,Pokaż szał,Exibir berserk,,Afișează pachetul de forță mărită,Отображение берсерка,Прикажи берсерк,Visa berserk,Berserk'i göster, +Show weapons,ALTHUDMNU_SHOWWEAPONS,,,,Zobrazit zbraně,Vis våben,Zeige Waffen,,Montri armojn,Mostrar armas,,Näytä aseet,Afficher Armes,,Fegyverek mutatása,Mostra le armi,武器表示,무기들을 표시,Toon wapens,Vis våpen,Pokaż bronie,Exibir armas,,Afișează armele,Отображение оружия,Прикажи оружја,Visa vapen,Silahları göster, +Show ammo for,ALTHUDMNU_SHOWAMMO,,,,Zobrazit munici pro,Vis ammunition for,Zeige Munition,,Montri municion por,Mostrar munición para,,Näytä ammukset aseelle,Afficher Munitions pour,,Ammo mutatása a,Mostra le munizioni per,弾薬等の表示,탄약을 표시,Toon munitie voor,Vis ammunisjon for,Pokaż amunicję dla,Exibir munição para,,Afișează muniția pentru,Отображение патронов для,Прикажи муниције за,Visa ammunition för,Cephane göster, +Show time,ALTHUDMNU_SHOWTIME,,,,Zobrazit čas,Vis tid,Zeige Zeit,,Montri tempon,Mostrar tiempo,,Näytä aika,Afficher temps niveau,,Idő mutatása,Mostra il tempo,時間の表示,시간 표시,Toon tijd,Vis tid,Pokaż czas,Exibir tempo,,Afișează timpul,Отображение времени,Прикажи време,Visa tid,Gösteri zamanı, +Time color,ALTHUDMNU_TIMECOLOR,,,Time colour,Barva času,Tidens farve,Zeit-Farbe,,Tempkoloro,Color del tiempo,,Ajan väri,Couleur du timer,,Idő színe,Colore del tempo,時間の字色,시간 색상,Tijdskleur,Tid farge,Kolor czasu,Cor do tempo,,Culoare timp,Цвет времени,Боја времена,Tidens färg,Zaman rengi, +Show network latency,ALTHUDMNU_SHOWLAG,,,,Zobrazit latenci sitě,Vis netværksforsinkelse,Zeige Netzwerk-Latenz,,Montri reto-respondotempon,Mostrar latencia de red,,Näytä verkon viive,Afficher latence réseau,,Válaszidő mutatása,Mostra la latenza del network,ネットのラグ表示,내트워크 트래픽 표시,Toon netwerklatentie,Vis nettverksforsinkelse,Pokaż czas oczekiwania sieci,Exibir latência de rede,,Afișează perioada de întârziere a conexiunii,Отображение задержки сети,Прикажи кашњење мреже,Visa nätverksfördröjning,Ağ gecikmesini göster, +Ammo display order,ALTHUDMNU_AMMOORDER,,,,Pořadí zobrazení munice,Visningsrækkefølge for ammunition,Munitionsreihenfolge,,Vidiga aranĝo de municio,Orden vista de munición,,Ammusten esitysjärjestys,Ordre d'affichage des munitions,,Muníció típus rendezése,Ordine mostra delle munizioni,弾薬表示順,탄약 표시 순서,Volgorde van de munitieweergave,Rekkefølge for ammunisjonsvisning,Kolejność pokazywania amunicji,Ordem de exibição de munição,,Ordine afișare muniție,Порядок отображения боеприпасов,Редослед муниција,Ordning för visning av ammunition,Cephane teşhir düzeni, +Red ammo display below %,ALTHUDMNU_AMMORED,,,,Červený indikátor munice pod %,Rød ammunitionsvisning under %,Rot für Munition unter %,,Ruĝa municividigo sub %,Porcent. de munición en rojo,,Punaiset ammukset ammusten alittaessa %,Compteur de munitions rouge sous,,Piros muníció szín % alatt,Contatore delle munizioni di colore rosso sotto,弾薬の赤色表示%,적색 남은 탄약 밑에 표시,Rood munitieweergave onder %,Rød visning av ammunisjonsnivå under %,Wyświetl czerwoną amunicję pod ,Porcentagem de munição em vermelho até,Percentagem de munição em vermelho até,Muniția schimbă culoarea în roșu sub %,"Отображение боеприпасов красным ниже, %",Прикажи муниције црвеном испод %,Röd ammunition visas under %,Aşağıda kırmızı cephane göstergesi %, +Yellow ammo display below %,ALTHUDMNU_AMMOYELLOW,,,,Žlutý indikátor munice pod %,Gul ammunitionsvisning under %,Gelb für Munition unter %,,Flava municividigo sub %,Porcent. de munición en amarillo,,Keltaiset ammukset ammusten alittaessa %,Compteur de munitions jaune sous,,Sárga muníció szín % alatt,Contatore delle munizioni di colore giallo sotto,弾薬の黄色表示%,황색 남은 탄약 밑에 표시,Gele munitieweergave onder %,Gult ammunisjonsdisplay under %.,Wyświetl żółtą amunicję pod ,Porcentagem de munição em amarelo até,Percentagem de munição em amarelo até,Muniția schimbă culoarea în galben sub %,"Отображение боеприпасов жёлтым ниже, %",Прикажи муниције жутом испод %,Gul ammunition visas under %,Aşağıda sarı cephane göstergesi %, +Red health display below,ALTHUDMNU_HEALTHRED,,,,Červený indikátor zdraví pod,Rødt sundhedsindikator under %,Rot für Gesundheit unter %,,Ruĝa sanvidigo sube,Porcent. de salud en rojo,,Punainen terveys terveyden alittaessa,Compteur de santé rouge sous,,Piros életerő szín ezen szám alatt,Contatore della salute di colore rosso sotto,体力の赤色表示%,적색 체력 밑에 표시,Rood gezondheidsweergave beneden,Rød helsevisning under,Wyświetl czerwone zdrowie pod ,Porcentagem de saúde em vermelho até,Percentagem de saúde em vermelho até,Sănătatea schimbă culoarea în roșu sub %,"Отображение здоровья красным ниже, %",Прикажи здравље црвеном испод,Röd hälsoindikator nedanför,Aşağıdaki kırmızı sağlık göstergesi, +Yellow health display below,ALTHUDMNU_HEALTHYELLOW,,,,Žlutý indikátor zdraví pod,Gul sundhedsindikator under %,Gelb für Gesundheit unter %,,Flava sanvidigo sube,Porcent. de salud en amarillo,,Keltainen terveys terveyden alittaessa,Compteur de santé jaune sous,,Sárga életerő szín ezen szám alatt,Contatore della salute di colore giallo sotto,体力の黄色表示%,황색 체력 밑에 표시,Geel gezondheidsweergave beneden,Gul helsevisning nedenfor,Wyświetl żółte zdrowie pod ,Porcentagem de saúde em amarelo até,Percentagem de saúde em amarelo até,Sănătatea schimbă culoarea în galben sub %,"Отображение здоровья жёлтым ниже, %",Прикажи здравље жутом испод,Gul hälsoindikator nedanför,Aşağıdaki sarı sağlık göstergesi, +Green health display below,ALTHUDMNU_HEALTHGREEN,,,,Zelený indikátor zdraví pod,Grønt sundhedsindikator under %,Grün für Gesundheit unter %,,Verda sanvidigo sube,Porcent. de salud en verde,,Vihreä terveys terveyden alittaessa,Compteur de santé vert sous,,Zöld életerő szín ezen szám alatt,Contatore della salute di colore verde sotto,体力の緑色表示%,녹색 체력 밑에 표시,Groen gezondheidsweergave beneden,Grønn helsevisning under,Wyświetl zielone zdrowie pod ,Porcentagem de saúde em verde até,Percentagem de saúde em verde até,Sănătatea schimbă culoarea în verde sub %,"Отображение здоровья зелёным ниже, %",Прикажи здравље зеленом испод,Grön hälsoindikator nedan,Aşağıdaki yeşil sağlık göstergesi, +Red armor display below,ALTHUDMNU_ARMORRED,,,Red armour display below,Červený indikátor brnění pod,Rødt panser display under %,Rot für Panzerung unter %,,Ruĝa kirasvidigo sube,Porcent. de blindaje en rojo,,Punainen panssari panssarin alittaessa,Compteur d' armure rouge sous,,Piros páncél szín ezen szám alatt,Contatore dell'armatura di colore rosso sotto,防具の赤色表示%,적색 아머 밑에 표시,Rood pantserweergave beneden,Visning av rød rustning under,Wyświetl czerwony pancerz pod ,Porcentagem de armadura em vermelho até,Percentagem de armadura em vermelho até,Armura schimbă culoarea în galben sub %,"Отображение брони красным ниже, %",Прикажи оклоп црвеном испод,Röd rustning visas nedan,Kırmızı zırh ekranı aşağıda, +Yellow armor display below,ALTHUDMNU_ARMORYELLOW,,,Yellow armour display below,Žlutý indikátor brnění pod,gul panser under displayet under %,Gelb für Panzerung unter %,,Flava kirasvidigo sube,Porcent. de blindaje en amarillo,,Keltainen panssari panssarin alittaessa,Compteur d' armure jaune sous,,Sárga páncél szín ezen szám alatt,Contatore dell'armatura di colore giallo sotto,防具の黄色表示%,황색 아머 밑에 표시,Geel pantserweergave beneden,Visning av gul rustning under,Wyświetl żółty pancerz pod ,Porcentagem de armadura em amarelo até,Percentagem de armadura em amarelo até,Armura schimbă culoarea în galben sub %,"Отображение брони жёлтым ниже, %",Прикажи оклоп жутом испод,Gul rustning visas nedan,Aşağıdaki sarı zırh ekranı, +Green armor display below,ALTHUDMNU_ARMORGREEN,,,Green armour display below,Zelený indikátor brnění pod,grønt panser display under %,Grün für Panzerung unter %,,Verda kirasvidigo sube,Porcent. de blindaje en verde,,Vihreä panssari panssarin alittaessa,Compteur d' armure bleu sous,,Zöld páncél szín ezen szám alatt,Contatore dell'armatura di colore verde sotto,防具の緑色表示%,녹색 아머 밑에 표시,Groen pantserweergave beneden,Visning av grønn rustning under,Wyświetl zielony pancerz pod ,Porcentagem de armadura em verde até,Percentagem de armadura em verde até,Armura schimbă culoarea în verde sub %,"Отображение брони зелёным ниже, %",Прикажи оклоп зеленом испод,Grön rustning visas nedan,Aşağıdaki yeşil zırh ekranı, +Alternative Automap HUD,ALTHUDMNU_AUTOMAPHUD,,,,Alternativní HUD automapy,Alternativ Automap HUD,Alternatives Automap HUD,,Alternativa HUD de aŭtomata mapo,HUD alternativo del automapa,,Vaihtoehtoinen automaattikartan tilanäyttö,ATH Alternatif pour carte,,Alternatív Automap HUD,HUD automappa alternativo,オルタナティブ オートマップHUD,대체 오토맵 HUD,Alternatieve Automap HUD,Alternativ Automap HUD,Alternatywny HUD mapy,HUD alternativo de automapa,,Hartă Computerizată Alternativă,Альтернативный интерфейс на автокарте,Алтернативни HUD за аутомапу,Alternativ automap HUD,Alternatif Automap HUD, +Map title color,ALTHUDMNU_TITLECOLOR,,,Map title colour,Barva názvu levelu,Farve på korttitel,Farbe für Levelnamen,,Maptitolo-koloro,Color del título del mapa,,Tason nimen väri,Couleur titre du niveau,,Pálya cím szín,Colore titolo mappa,マップ名の色,맵 제목 색깔,Kleur kaarttitel,Farge på karttittel,Kolor nazwy mapy,Cor do título do fase,Cor do título do nível,Culoare titlu hartă,Цвет названия уровня,Боја назива нивоа,Färg på kartans titel,Harita başlık rengi, +Map time color,ALTHUDMNU_MAPTIMECOLOR,,,Map time colour,Barva času levelu,Farve på kortets tid,Farbe für Level-Zeit,,Maptempo-koloro,Color del tiempo del mapa,,Tason ajan väri,Couleur temps du niveau,,Pálya idő szín,Colore tempo mappa,経過時間の色,맵 시간 색깔,Kleur kaarttijd,Kartets tidsfarge,Kolor czasu na mapie,Cor do tempo da fase,Cor do tempo do nível,Culoare timp petrecut pe hartă,Цвет времени для уровней,Боја времена на нивоу,Färg för kartans tid,Harita zaman rengi, +Hub time color,ALTHUDMNU_HUBTIMECOLOR,,,Hub time colour,Barva času hubu,Farve på hub-tid,Farbe für Hub-Zeit,,Nabtempo-koloro,Color del tiempo del nodo,,Tasokokoelman ajan väri,Couleur temps du hub,,Csomópont idő szín,Colore tempo hub di mappe,区間経過時間の色,허브 시간 색깔,Kleur hubtijd,Farge for knutepunkttid,Kolor czasu w hubie,Cor do tempo no HUD,,Culoare timp petrecut în hub,Цвет времени для хабов,Боја времена на хабу,Färg för navets tid,Hub zaman rengi, +Total time color,ALTHUDMNU_TOTALTIMECOLOR,,,Total time colour,Barva celkového času,Farve for samlet tid,Farbe für Gesamtzeit,,Tuttempo-koloro,Color del tiempo total,,Kokonaisajan väri,Couleur temps total,,Teljes idő szín,Colore tempo totale,合計経過時間の色,누적 경과한 시간 색깔,Kleur totale tijd,Farge for total tid,Kolor całkowitego czasu,Cor do tempo total,,Culoare timp total,Цвет общего времени,Боја укупног времена,Färg för total tid,Toplam zaman rengi, +Coordinate color,ALTHUDMNU_COORDINATECOLOR,,,Coordinate colour,Barva souřadnic,Koordinat farve,Farbe für Koordinaten,,Kunordigi koloron,Color de coordenadas,,Koordinaattien väri,Couleur coordonnées,,Koordináló szín,Colore coordinate,座標色,좌표 색깔,Kleur coördinaten,Koordinatfarge,Skoordynuj kolor,Cor das coordenadas,,Culoare coordonate,Цвет координат,Боја координата,Färg för koordinater,Koordinat rengi, +Coordinate mode,ALTHUDMNU_COORDINATEMODE,,,,Režim souřadnic,Koordinattilstand,Koordinatenmodus,,Kunordigi modon,Modo de coordenadas,,Koordinaattitila,Mode coordonnées,,Koordináló mód,Modalità coordinate,座標モード,좌표 모드,Coördinatiemodus,Koordinat-modus,Skoordynuj tryb,Modo de coordenada,,Mod coordonate,Координаты игрока,Мод координата,Koordinatläge,Koordinat modu, +Statistics name color,ALTHUDMNU_STATSNAMECOLOR,,,Statistics name colour,Barva názvu statistik,Farve på statistiknavn,Farbe für Statistik-Namen,,Statistiknomo-koloro,Color del nombre de estadísticas,,Tilastotiedon nimen väri,Couleur nom des statistiques,,Statisztika név szín,Colore nome statistica,統計名の色,통계표 이름 색상,Kleur statistiekennaam,Farge på statistikknavn,Kolor nazw statystyk,Cor do nome das estatísticas,,Culoare nume statistici,Цвет имён в статистике,Боја назива статистика,Färg för statistiknamn,İstatistik adı renk, +Statistics color,ALTHUDMNU_STATSCOLOR,,,Statistics colour,Barva statistik,Statistik farve,Farbe für Statistik-Nummern,,Statistiko-koloro,Color de las estadísticas,,Tilastotiedon väri,Couleur statistiques,,Statisztika szín,Colore contatore statistica,統計の色,통계표 색상,Kleur statistieken,Statistikk farge,Kolor statystyk,Cor das estatísticas,,Culoare statistici,Цвет статистики,Боја статистика,Färg för statistik,İstatistik renk, +,,Display (game related),,,,,,,,,,,,,,,,,,,,,,,,,,, +Rendering Interpolation,DSPLYMNU_CAPFPS,,,,Interpolace vykreslování,Interpolering af rendering,Renderinterpolation,,Bildigo-Interpolado,Interpolación de renderizado,,Hahmonnuksen interpolointi,Interpolation du rendu,,Render animáció simítás,Interpolazione grafica,レンダリング補間,프레임 제한,Interpolatie renderen,Gjengivelse av interpolasjon,Interpolacja Renderowania,Interpolação de renderização,,Interpolare Imagine,Сглаживание обработки,Интерполација рендеринга,Rendering Interpolering,Rendering Enterpolasyonu, +Transparency render mode,DSPLYMNU_BLENDMETHOD,,,,Režim vykreslování průhlednosti,Gennemsigtighedstilstand,Transparenzmodus,,Travidebleco-bildigo-reĝimo,Modo de renderizado de transparencia,,Läpinäkyvyyden hahmonnustila,Mode de Rendu transparence,,Átlászóság render mód,Modalità della resa grafica della trasparenza,レンダリング透過モード,투명도 표시 모드,Transparantie render modus,Gjengivelsesmodus for gjennomsiktighet,Tryb renderowania przezroczystości,Modo de renderiz. de transparência,,Mod Transparență,Режим обработки прозрачности,Режим рендеринга транспарентности,Återgivning med transparens,Şeffaflık render modu, +Screen wipe style,DSPLYMNU_WIPETYPE,,,,Styl přechodů,Skærmens aftørringsstil,Bildschirmwechseleffekt,,Stilo de ekranviŝo,Transición de pantalla,,Ruudun pyyhkiytymistyyli,Style de Fondu d'écran,,Képernyőtörlődés módja,Stile della pulizia dello schermo,スクリーンワイプモード,화면 전환 방식,Schermveegstijl,Stil for skjermtørking,Styl przejścia ekranu,Tipo de transição de tela,Tipo de transição de ecrã,Stil ștergere imagine,Эффект плавной смены экранов,Ефект брисања екрана,Stil för skärmtorkning,Ekran silme stili, +Show ENDOOM screen,DSPLYMNU_SHOWENDOOM,,,,Zobrazit ENDOOM obrazovku,Vis ENDOOM-skærm,Zeige ENDOOM,,Montri ENDOOM-ekranon,Mostrar pantalla ENDOOM,,Näytä ENDOOM-ruutu,Montrer la fenêtre ENDOOM,,ENDOOM képernyő mutatása,Mostra la schermata ENDOOM,ENDOOM画面を表示,종료화면 표시,Toon ENDOOM scherm,Vis ENDOOM-skjerm,Pokaż ekran ENDOOM,Exibir tela ENDOOM,,Afișare fereastră ENDOOM,Показать экран ENDOOM,Прикажи ENDOOM екран,Visa ENDOOM-skärm,ENDOOM ekranını göster, +Blood Flash Intensity,DSPLYMNU_BLOODFADE,,,,Intenzita bliknutí při zranění,Blodblinkintensitet,Intensität für Bluteffekt,,Egeco de sango-ekbrilo,Intensidad del destello al ser atacado,,Verivälähdyksen voimakkuus,Intensité du flash dommages,,Sebzéskor villanás mértéke,Intensità Bagliore Sangue,血粉の濃度,피격 표시 강도,Intensiteit van de bloedflitser,Intensitet for blodblits,Intensywność Efektów Krwi,Intensidade de Flash de Sangue,,Intensitate strălucire sânge,Интенсивность вспышки при ранении,Интензивност треперења током повређивања,Intensitet av blodblixt,Kan Flaş Yoğunluğu, +Pickup Flash Intensity,DSPLYMNU_PICKUPFADE,,,,Intenzita bliknutí při sebrání předmětu,Intensitet for optageeffekt,Intensität für Aufnehmen-Effekt,,Egeco de prenado-ekbrilo,Intensidad del destello al coger algo,Intensidad del destello al agarrar algo,Poimintavälähdyksen voimakkuus,Intensité du flash objets,,Fegyver felvételekor villanás mértéke,Intensità Bagliore Raccolta,取得の視界色濃度,습득 표시 강도,Intensiteit van de oppakflitser,Intensitet av opptaksblits,Intesnywność Efektów Podnoszenia Przedmiotów,Intensidade de Flash ao Pegar Itens,,Intensitate strălucire la ridicarea obiectelor,Интенсивность вспышки при подборе,Интензивност треперења током купљења,Intensitet av pickupblink,Pikap Flaş Yoğunluğu, +Underwater Blend Intensity,DSPLYMNU_WATERFADE,,,,Intenzita zbarvení pod vodou,Undervandsblinkintensitet,Intensität für Unterwasser-Effekt,,Egeco de Subakva Mikso,Intensidad Color Sumergido,Intensidad Color Submarino,Vedenalaissumennuksen voimakkuus,Intensité du fondu sous l'eau,,Vízalatti keverődés mértéke,Intensità Blend sott'acqua,水中反響音の濃度,수중 효과 강도,Intensiteit kleurvermenging onder water,Intensitet for undervannsblanding,Intensywność Efektów Pod Wodą,Intensidade de Efeito Debaixo d'Água,Intensidade de Efeito Debaixo de Água,Intensitate amestec culori subacvatice,Интенсивность эффекта под водой,Интензивност подводног треперења,Undervattensbländning Intensitet,Sualtı Karışım Yoğunluğu, +Sky render mode,DSPLYMNU_SKYMODE,,,,Režim vykreslování oblohy,Himmel-renderingstilstand,Rendermodus für Himmel,,Ĉielo-bildigo-reĝimo,Modo de renderizado del cielo,,Taivaan hahmonnustila,Mode du rendu du Ciel,,Égbolt render mód,Modalità resa grafica del cielo,空の表示方法,하늘 표시 모드,Luchtrendermodus,Modus for gjengivelse av himmel,Tryb renderowania nieba,Modo de renderização de céu,,Mod de vizualizare al cerului,Режим обработки неба,Режим рендеринга неба,Läge för rendering av himmel,Gökyüzü oluşturma modu, +Linear skies,DSPLYMNU_LINEARSKY,,,,Lineární obloha,Lineære himmelstrøg,Lineare Himmel,,Linearaj ĉieloj,Cielo lineal,,Lineaariset taivaat,Ciel linéaire,,Lineáris égboltok,Cieli lineari,空の歪み,선형 하늘,Lineaire lucht,Lineær himmel,Liniowe niebo,Céus lineares,,Cer rectiliniu,Линейное небо,Линеарна неба,Linjär himmel,Doğrusal gökyüzü, +Fullbright overrides sector color,DSPLYMNU_GZDFULLBRIGHT,,,,Při plném jasu ignorovat barvu sektoru,Ignorer sektorfarve ved fuld lysstyrke,Ignoriere Sektorfarbe bei voller Helligkeit,,Plenbrileco tranpasas sektorkoloron,Brillo máximo anula color del sector,,Täyskirkkaat ohittavat sektorin värin,Fullbright ignore couleur secteur,,Fullbright felülírja a szektor szinét,Luce piena sovrappone il colore del settore,明るさ最大時にsector color塗り替え,섹터 색상 최대밝기 우선화,Volledig helderheid overschrijft de sectorkleur,Fullbright overstyrer sektorfarge,Ignoruj kolor sektora przy pełnej jasności,Brilho máximo anula cor de setor,,Luminozitatea maximă suprascrie culoarea sectorului,Полная яркость замещает цвет сектора,Пуно осветљење премошћује боју сектора,Fullbright åsidosätter sektorfärg,Fullbright sektör rengini geçersiz kılar, +Scale fuzz effect,DSPLYMNU_SCALEFUZZ,,,,Škálovat velikost fuzz efektu,Skala fuzz-effekt,Skaliere Fuzz-Effekt,,Skali barblano-efekton,Escala de efecto fuzz,,Skaalaa sumennustehostetta,Scaling de l'effet de bruit,,Homályosodás effekt átméretezése,Scala l'effetto di fuzz,ファズエフェクトサイズ,반투명 효과 조정,Schaal fuzz effect,Skala fuzz-effekt,Skalowanie efektu szumu,Escala de efeito difuso,,Putere efect de strălucire,Масштабировать эффект шума,Повечавај шумни ефект,Skala fuzz-effekt,Ölçekli fuzz efekti, +Use fuzz effect,DSPLYMNU_DRAWFUZZ,,,,Typ fuzz efektu,Brug fuzz-effekt,Benutze Fuzz-Effekt,,Uzi barblano-efekton,Usar efecto fuzz,,Käytä sumennustehostetta,Effet de bruit,,Homályosodás effekt használata,Usa l'effetto di fuzz,ファズエフェクトを使用,반투명 효과 사용,Gebruik fuzz effect,Bruk fuzz-effekt,Użyj efektu szumu,Usar efeito difuso,,Mod efect de strălucire,Использовать эффект шума,Користи шумни ефект,Använd fuzz-effekt,Fuzz efekti kullanın, +Classic Transparency,DSPLYMNU_OLDTRANS,,,,Klasická průhlednost,Klassisk gennemsigtighed,Klasssische Transparenz,,Klasika Travidebleco,Transparencia clásica,,Perinteinen läpinäkyvyys,Transparence classique,,Klasszikus átlátszóság,Trasparenza classica,旧式の透明度,구형 투명도,Klassieke transparantie,Klassisk gjennomsiktighet,Klasyczna Przezroczystość,Transparência Clássica,,Transparență Clasică,Классическая прозрачность,Класична транспарентност,Klassisk genomskinlighet,Klasik Şeffaflık, +Lost Soul translucency,DSPLYMNU_TRANSSOUL,,,,Průhlednost Ztracených duší,Fortabt sjæl-translucens,Transparenz für Verlorene Seelen,,Diafaneco de Perdita Animo,Traslucidez del Alma Errante,,Kadonneiden sielujen läpikuultavuus,Transparence des âmes perdues,,Lost soul átlátszóság,Trasparenza anima errante,ロストソウルの透明度,로스트 소울 반투명도,Verloren Ziel doorschijnendheid,Lost Soul gjennomskinnelighet,Przezroczystość Zagubionych Dusz,Translucência da Alma Perdida,Translucidez da Alma Penada,Transparență Suflete Pierdute,Прозрачность потерянных душ,Транспарентност изгубљених душа,Lost Soul-translucens,Kayıp Ruh yarı saydamlığı, +Use fake contrast,DSPLYMNU_FAKECONTRAST,,,,Použít falešný kontrast,Brug falsk kontrast,Benutze falschen Kontrast,,Uzi malveran kontraston,Usar falso contraste,,Käytä tekosävykkyyttä,Faux Contraste,,Hamis kontraszt használata,Usa il falso contrasto,フェイクコントラストを使用,가명암 효과 사용,Gebruik vals contrast,Bruk falsk kontrast,Użyj sztuczny kontrast,Usar contraste falso,,Utilizare contrast fals,Имитация контрастного освещения стен,Користи фејк-контраст,Använd falsk kontrast,Sahte kontrast kullanın, +Rocket Trails,DSPLYMNU_ROCKETTRAILS,,,,Kouř raket,Raketspor,Raketenschweife,,Raketospuroj,Rastro de cohetes,,Rakettivanat,Trainées des Roquettes,,Rakéta füstnyomok,Scia del razzo,ロケットの軌跡,로켓 추진 효과,Raketsporen,Rakettspor,Wiązki Rakiet,Rastro de foguete,Rasto dos Mísseis,Dâră Rachete,Дымовой след у ракет,Траг дима код ракета,Raketspår,Roket Parkurları, +Blood Type,DSPLYMNU_BLOODTYPE,,,,Druh krve,Blodtype,Blut-Typ,,Sangad-efekto,Sangre chorreando,,Verityyli,Type de particules Sang,,Vér fajta,Tipo di sangue,血の種類,혈흔 효과,Bloedtype,Blodtype,Typ Krwi,Tipo de sangue,,Tip efecte sângeroase,Тип крови,Тип крви,Blodtyp,Kan Grubu, +Bullet Puff Type,DSPLYMNU_PUFFTYPE,,,,Druh kouře nábojů,Kuglestød type,Pistolenrauch-Typ,,Pulvo pro kolizio de kuglo,Polvo por impacto de bala,,Luotien pöllähdystyyli,Type de particules Balles,,Lövedék becsapódás fajtája,Tipo di sbuffo del proiettile,弾煙の種類,탄알 피격 효과,Kogelwolvertype,Bullet Puff Type,Typ Dymu,Tipo de ricochete de bala,,Tip efecte pentru gloanțe,Тип дыма от пуль,Тип рикошета,Kulavfallstyp,Mermi Puf Tipi, +Number of particles,DSPLYMNU_MAXPARTICLES,,,,Množství částic,Antal partikler,Anzahl Partikel,,Nombro da partikloj,Número de partículas,,Hiukkasten lukumäärä,Nombre de particules,,Részecskék száma,Numero di particelle,パーティクルの最大数,최대 입자 수,Aantal deeltjes,Antall partikler,Liczba cząsteczek,Número de partículas,,Număr particule,Количество частиц,Број честица,Antal partiklar,Parçacık sayısı, +Number of decals,DSPLYMNU_MAXDECALS,,,,Množství decalů,Antal decals,Anzahl Trefferspuren,,Nombro da dekaloj,Número de calcomanías,,Siirtokuvien lukumäärä,Number de décalques,,Lövésnyomok száma,Numero di decal,デカールの最大数,최대 데칼 수,Aantal stickers,Antall dekaler,Liczba kalk,Número de decalques,,Număr autocolante,Количество декалей,Број декала,Antal dekaler,Çıkartma sayısı, +Show player sprites,DSPLYMNU_PLAYERSPRITES,,,,Zobrazit hráčovy sprity,Vis spiller sprites,Zeige Spieler-Sprites,,Montri ludanto-rastrumojn,Mostrar «sprites» del jugador,,Näytä pelaajaspritet,Montrer les sprites joueur,,Játékos sprite-ok mutatása,Mostra gli sprite del giocatore,プレイヤーの武器の表示,1인칭 무기 표시,Toon speler sprites,Vis spillerens sprites,Pokaż sprite'y gracza,Exibir sprites do jogador,,Afișare arme,Отображение спрайтов игрока,Прикажи спрајтове играча,Visa spelarens sprites,Oyuncu sprite'larını göster, +Death camera,DSPLYMNU_DEATHCAM,,,,Posmrtná kamera,Dødskamera,Todeskamera,,Dummorta tripersona kamerao,Muerte del jugador en tercera persona,,Kuolonkamera,Caméra 3ème pers à la mort,,Halál kamera,Telecamera all'atto della morte,死亡時の三人称視点,사망 화면 표시,Doodscamera,Dødskamera,Kamera śmierci,Câmera de morte,Câmara da morte,Cameră de Deces,Вид от 3-го лица при смерти,Смртна камера,Dödskamera,Ölüm kamerası, +Teleporter zoom,DSPLYMNU_TELEZOOM,,,,Zoom při teleportaci,Teleporter zoom,Teleporter Zoom,,Teleportila zomo,Zoom en teletransporte,,Kaukosiirrynnän kameran zoomaus ,Zoom sur téléportation,,Teleporter ráközelítés,Zoom telecamera,テレポーター使用時のズーム,순간이동 효과,Teleporter zoom,Teleporter zoom,Przybliżenie teleportowania,Zoom de teletransporte,,Apropriere Cameră la Teleportare,Увеличение при телепортации,Зум током телепортације,Teleportörens zoom,Işınlayıcı yakınlaştırma, +Earthquake shake intensity,DSPLYMNU_QUAKEINTENSITY,,,,Intenzita zemětřesení,Intensitet af jordskælv,Erdbeben Intensität,,Egeco de tertremo,Intensidad del terremoto,,Maanjäristystehosteen voimakkuus,Intensité des séismes,,Földrengés erőssége,Intensità vibrazione terremoto,地震エフェクトの激しさ,지진 효과 강도,Aardbevingsschoksintensiteit,Intensitet av jordskjelvrystelser,Siła trzęsienia ziemi,Intensidade do tremor de terremoto,,Intensitate zguduire la cutremur,Интенсивность тряски землетрясений,Интенсивност земљотреса,Intensitet av jordbävningar,Deprem sarsıntı şiddeti, +Interpolate monster movement,DSPLYMNU_NOMONSTERINTERPOLATION,,,,Interpolovat pohyb příšer,Interpolere monsterbevægelse,Interpoliere Monsterbewegung,,Interpoli monstro-movadon,Interpolar movimiento de los monstruos,,Interpoloi hirviöiden liike,Interpolation des monstres,,Szörny mozgás simítása,Interpola il movimento dei mostri,モンスターの移動補間,개체 이동 보정,Interpoleer monsterbewegingen,Interpolere monsterbevegelse,Interpolacja ruchu potworów,Interpolar movimento de monstros,,Interpolare mișcare monștri (efect vizual),Сглаживание движения монстров,Интерполирај кретање чудовишта,Interpolera monsterrörelse,Canavar hareketini enterpole et, +Menu dim,DSPLYMNU_MENUDIM,,,,Síla barvy pozadí v menu,Menu dæmpes,Menüabdunklung,,Menuo-malheleco,Atenuación del menú,,Valikon himmennys,Assombrissement menu,,Menü homályosítása,Offuscamento menu,メニュー背景,메뉴 배경색 강도,Donkere menuachtergrond,Demp meny,Mgła w menu,Atenuação do menu,,Întunecare meniu,Затемнение фона меню,Пригушивање менија,Dimma menyn,Menü loş, +Dim color,DSPLYMNU_DIMCOLOR,,,Dim colour,Barva pozadí v menu,Dim farve,Abdunklungsfarbe,,Malheleca koloro,Color de la atenuación,,Himmennysväri,Couleur de l'assombrissement,,Homályosítás színe,Colore offuscamento,背景色,배경색 설정,Donkere kleur,Demp farge,Kolor mgły,Cor da atenuação,,Culoare întunecare,Цвет затемнения,Боја пригушивања,Dimma färgen,Loş renk, +View bob amount while moving,DSPLYMNU_MOVEBOB,,,,Pohupování pohledu při pohybu,Vis bob-beløb under bevægelse,Waffenpendeln beim Bewegen,,Vidi kvanton de kapo-balanciĝo dum movado,Cantidad de balanceo al moverse,,Aseen heilumisvoimakkuus liikkeessä,Chaloupage arme en movement,,Fegyver mozgása lépés közben,Ammontare di bob di movimento,視点揺れする移動値,이동 시 화면 흔들림 강도,Bekijk bob bedrag terwijl je beweegt,Vis bob-beløp mens du beveger deg,Dygaj kiedy się ruszasz,Quantidade de balanço durante movimento,,Mișcare cameră în timpul deplasării,Покачивание камеры при движении,Тресење камере током кретања,Visa bob-mängden under förflyttning,Hareket halindeyken bob miktarını görüntüleme, +View bob amount while not moving,DSPLYMNU_STILLBOB,,,,Pohupování pohledu v klidu,"Vis bob-beløbet, mens du ikke bevæger dig",Waffenpendeln bei Nichtbewegen,,Vidi kvanton de kapo-balanciĝo dum ne movado,Cantidad de balanceo al no moverse,,Aseen heilumisvoimakkuus levossa,Chaloupage arme statique,,Fegyver mozgása egy helyben,Ammontare di bob di movimento da fermo,視点揺れしない移動値,정지 시 화면 움직임 강도,Bekijk bob bedrag terwijl je niet beweegt,Vis bobmengde mens du ikke beveger deg,Dygaj kiedy się nie ruszasz,Quantidade de balanço parado,,Mișcare cameră în timpul staționării,Покачивание камеры при бездействии,Тресење камере током неактивности,Visa bob-mängden när den inte rör sig,Hareket etmiyorken bob miktarını görüntüleme, +Weapon bob speed,DSPLYMNU_BOBSPEED,,,,Rychlost pohupování zbraně,Våben bob hastighed,Waffenpendelgeschwindigkeit,,Rapido de armilo-balanciĝo,Velocidad de balanceo de Arma,,Aseen heilumisnopeus,Vitesse du chaloupage,,Fegyver mozgás sebesség,Velocità di bob dell'arma,武器揺れ速度,무기 흔들림 속도,Snelheid wapenzwaaieffect,Våpen bob hastighet,Szybkość ruchu broni,Velocidade de balanço de arma,,Viteză mișcare arme,Скорость покачивания оружия,Брзина трсења оружја,Vapens hastighet,Silah bob hızı, +,,Scaling,,,,,,,,,,,,,,,,,,,,,,,,,,, +Scaling Options,SCALEMNU_TITLE,,,,Nastavení škálování rozhraní,Indstillinger for skalering,Skalierungsoptionen,,Skalo-Agordoj,Opciones de escalado,,Skaalausasetukset,Option de mise à l'échelle,,Méretezési Beállítások,Opzioni di scala,スケーリング オプション,배율 설정,Schaalopties,Alternativer for skalering,Opcje skalowania,Opções de escala,,Setări Dimensiuni,Настройки масштабирования,Подешавања размере,Skalningsalternativ,Ölçeklendirme Seçenekleri, +Overrides for above setting,SCALEMNU_OVERRIDE,,,,Potlačení nastavení výše,Overrides for ovenstående indstilling,Spezialisierungen,,Transpasoj por ĉi-supre agordo,Anular ajuste anterior,,Ohittaa asetuksen ylhäällä,Annule les paramètres au dessus,,Beállítások felülírása,Sovrascritture per i settaggi sopra,設定の上書き,위 설정을 위해 무시,Overschrijdingen voor bovenstaande instelling,Overstyrer for innstillingen ovenfor,Nadpisuje dla powyższego ustawienia,Anular configurações acima,,Suprascriere pentru setările de mai sus,Задать специальные настройки,Специјална подешавања,Överordnar ovanstående inställningar,Yukarıdaki ayar için geçersiz kılmalar, +Messages,SCALEMNU_MESSAGES,,,,Oznámení,Meddelelser,Nachrichten,,Mesaĝoj,Mensajes,,Viestit,,,Üzenetek,Messaggi,メッセージ類,메시지,Berichten,Meldinger,Wiadomości,Mensagens,,Mesaje,Сообщения,Поруке,Meddelanden,Mesajlar, +Console,SCALEMNU_CONSOLE,,,,Konzole,Konsol,Konsole,,Konzolo,Consola,,Konsoli,,,Konzol,,コンソール,콘솔,,Konsoll,Konsola,,Consola,Consolă,Консоль,Конзола,Konsol,Konsol, +Status bar,SCALEMNU_STATBAR,,,,Stavový panel,Statuslinje,Statusleiste,,Stata baro,Barra de estado,,Tilapalkki,Barre d'état,,Státusz sáv,Barra di stato,ステータスバー,상태 바,Statusbalk,Statuslinje,Pasek statusu,Barra de status,Barra de estado,Bară de Stare,Строка состояния,Статусна трака,Statusfältet,Durum çubuğu, +Fullscreen HUD,SCALEMNU_HUD,,,,HUD přes celou obrazovku,HUD i fuld skærm,Vollbild-HUD,,Tutekrana HUD,HUD de pantalla completa,,Täyden ruudun tilanäyttö,ATH plein écran,,Teljes képernyős HUD,HUD a pieno schermo,全画面HUD,전체화면 HUD,Volle scherm HUD,HUD i fullskjerm,HUD pełnoekranowy,HUD de tela cheia,HUD de ecrã cheio,Interfață pe Timp de Joc tip Fullscreen,Полноэкранный интерфейс,HUD преко целог екрана,HUD i fullskärm,Tam Ekran HUD, +Alternative HUD,SCALEMNU_ALTHUD,,,,Alternativní HUD,Alternativ HUD,Alternatives HUD,,Alternativa HUD,HUD alternativo,,Vaihtoehtoinen tilanäyttö,ATH alternatif,,Alternatív HUD,HUD alternativo,オルタナティブHUD,대체 HUD,Alternatieve HUD,Alternativ HUD,Alternatywny HUD,HUD alternativo,,Interfață pe Timp de Joc Alternativă,Альтернативный интерфейс,Алтернативни HUD,Alternativ HUD,Alternatif HUD, +HUD preserves aspect ratio,SCALEMNU_HUDASPECT,,,,HUD zachovává poměr stran,HUD bevarer formatforholdet,HUD bewahrt Seitenverhältnisse,,HUD konservas aspekto-proporcion,HUD conserva la rel. de aspecto,,Tilanäyttö säilyttää kuvasuhteen,ATH préserve le rapport d'aspect,,A HUD képarány visszaállítása,HUD preserva le proporzioni,HUDのアスペクト比維持,HUD 화면 비율 보존,HUD behoudt de beeldverhouding,HUD bevarer størrelsesforholdet,HUD zachowuje współczynnik proporcji,HUD deve preservar proporção da tela,,Interfața pe Timp de Joc își Păstrează Aspectul,Сохранение соотношения сторон интерфейса,Сачувај пропорције HUD-а,HUD behåller bildförhållandet,HUD en boy oranını korur, +Use default scale,SCALEMNU_USEUI,,,,Použít výchozí velikost,Brug standardskala,Benutze Standardskalierung,,Uzi defaŭltskalon,Usar escalado por defecto,,Käytä oletusmittakaavaa,Défaut,,Alap arányok használata,Usa la scala di default,通常サイズを使う,기본 배율 사용,Gebruik standaardweegschaal,Bruk standard skala,Użyj domyślnej skali,Usar escala padrão,,Folosește dimensiunea implicită,Размер по умолчанию,Уобичајена размера,Använder standardskalan,Varsayılan ölçeği kullan, +Scale to fullscreen,SCALEMNU_USEFS,,,,Škalovat přes celou obrazovku,Skaleres til fuld skærm,Skaliere auf Vollbild,,Skali al tutekrano,Escalar a pant. completa,,Skaalaa täyteen ruutuun,Plein écran,,Teljes képernyőre arányítás,Scala a pieno schermo,全画面に拡大,전체화면에 맞게 축척,Schaalbaar tot volledig scherm,Skaler til fullskjerm,Przeskaluj do pełnego ekranu,Escala de tela cheia,Escalar para ecrã cheio,Dimensionare la modul Fullscreen,Масштабировать со всем экраном,Проширење преко целог екрана,Skala till fullskärm,Tam ekrana ölçeklendir, +Adapt to screen size,SCALEMNU_ADAPT,,,,Přizpůsobit velikosti obrazovky,Tilpasning til skærmstørrelse,Passe an Bildschirmgröße an,,Adapti al ekranamplekso,Adaptar al tamaño de pantalla,,Sovita näytön kokoon,Ecran,,Képernyő mérethez alkalmazkodik,Adatta alla dimensione della schermata,画面サイズに合わせる,화면 사이즈에 맞게 축척,Aanpassen aan de grootte van het scherm,Tilpass til skjermstørrelse,Dostosuj do pełnego ekranu,Adaptar ao tamanho de tela,,Adaptează la dimensiunea ecranului,Адаптироваться к размеру экрана,Прилагоди размери екрана,Anpassas till skärmstorlek,Ekran boyutuna uyum sağlayın, +,,HUD,,,,,,,,,,,,,,,,,,,,,,,,,,, +HUD Options,HUDMNU_TITLE,,,,Nastavení rozhraní a HUD,HUD-indstillinger,HUD Optionen,,HUD Agordoj,Opciones del HUD,,Tilanäytön asetukset,Options ATH,,HUD beállításai,Opzioni HUD,HUDオプション,HUD 설정,HUD-opties,HUD-alternativer,Opcje HUD,Opções de HUD,,Setări Interfață pe Timp de Joc,Настройки отображения информации,HUD подешавања,Alternativ för HUD,HUD Seçenekleri, +Alternative HUD,HUDMNU_ALTHUD,,,,Alternativní HUD,Alternativ HUD,Alternatives HUD,,Alternativa HUD,HUD alternativo,,Vaihtoehtoinen tilanäyttö,ATH Alternatif,,Alternatív HUD,HUD alternativo,オルタナティブHUD,대체 HUD,Alternatieve HUD,Alternativ HUD,Alternatywny HUD,HUD alternativo,,Interfață pe Timp de Joc Alternativă,Альтернативное отображение информации,Алтернативни HUD,Alternativ HUD,Alternatif HUD, +Message Options,HUDMNU_MESSAGE,,,,Oznámení,Indstillinger for meddelelser,Nachrichtenoptionen,,Mesaĝo-Agordoj,Opciones de mensajes,,Viestiasetukset,Options des Messages,,Üzenet beállítások,Opzioni messaggi,メッセージの設定,메시지 설정,Berichtopties,Meldingsalternativer,Opcje wiadomości,Opções de mensagem,,Setări Mesaje,Настройки сообщений,Подешавања порука,Alternativ för meddelanden,Mesaj Seçenekleri, +User interface scale,HUDMNU_UISCALE,,,,Velikost rozhraní,Skala for brugergrænseflade,Benutzerinterfaceskalierung,,Interfaco-skalo de uzanto,Escala de la interfaz de usuario,,Käyttöliittymän skaalaus,Echelle de l'interface,,Felhasználó Panel mérete,Scala l'interfaccia utente,インターフェースの大きさ,인터페이스 크기 조정,Schaal gebruikersinterface,Skalering av brukergrensesnitt,Skala interfejsu,Escala de interface de usuário,Escala de interface do utilizador,Dimensiune Interfață Utilizator,Размер интерфейса,Размера интерфејса,Skala för användargränssnittet,Kullanıcı arayüzü ölçeği, +Force default crosshair,HUDMNU_FORCECROSSHAIR,,,,Vynutit výchozí zaměřovač,Tvinge standard-trådkorset,Erzwinge Standard-Fadenkreuz,,Devigi defaŭltan reteton,Forzar retícula por defecto,,Pakota oletustähtäin,Forcer Viseur par défaut,,Alapcélkereszt erőltetése,Forza il mirino di default,デフォルトの照準を使う,기본 조준점 강제 설정,Forceer standaard dradenkruis,Tving frem standard trådkors,Wymuś domyślny celownik,Forçar mira padrão,,Forțare țintă implicită,Всегда стандартный прицел,Форсирај уобичајени нишан,Forcera standardkorset,Varsayılan artı işaretini zorla, +Grow crosshair when picking up items,HUDMNU_GROWCROSSHAIR,,,,Zvětšit zaměřovač při sebrání předmětu,"Vokse trådkorset, når du samler genstande op",Größeres Fadenkreuz bei Gegenstandsaufnahme,,Grandigi reteton kiam oni prenas objektojn,Aumentar retícula al obtener obj.,Crecer retícula al obtener obj.,Suurenna tähtäintä esineitä poimiessa,Agrandir viseur en prenant un objet,,A célkereszt nőjön tárgyfelvételkor,Accresci il mirino quando si raccolgono oggetti,アイテム取得時に照準を大きくする,아이템 획득 시 조준점 키우기 ,Vergroot het dradenkruis bij het oppakken van items,Utvid trådkorset når du plukker opp elementer,Powiększ celownik po podniesieniu przedmiotu,Aumentar mira ao pegar itens,Aumentar mira ao apanhar itens,Mărește ținta la ridicarea obiectelor,Увеличение прицела при подборе,Побољшај нишан током купљења предмета,Växer hårkorset när du plockar upp föremål,Eşyaları alırken artı işaretini büyütün, +Display nametags,HUDMNU_NAMETAGS,,,,Zobrazovat jmenovky,Viser navneskilte,Zeige Gegenstandsnamen,,Montri nometikedojn,Mostrar etiquetas,,Näytä nimitunnisteet,Afficher noms des objets,,Névtábla mutatása,Mostra le targhette identificative,ディスプレイネームタグ,이름표 표시,Naamlabels weergeven,Vis navnelapper,Pokazuj nazwy przedmiotów,Exibir nomes,,Indică numele obiectelor,Указание названия предметов,Прикажи имена предмета,Visa namnbrickor,İsim etiketlerini gösterin, +Nametag color,HUDMNU_NAMETAGCOLOR,,,Nametag colour,Barva jmenovek,Farve på navneskilte,Farbe für Gegenstandsnamen,,Nometikeda koloro,Color de las etiquetas,,Nimitunnisteen väri,Couleur des noms d'objet,,Névtábla szín,Colore targhetta identificativa,ネームタグ色,이름표 색깔,Kleur naamlabel,Farge på navneskilt,Kolor nazw przedmiotów,Cor dos nomes,,Culoare nume obiecte,Цвет названия предметов,Боја имена предмета,Färg på namnbrickor,İsim etiketi rengi, +Use old ouch mug shot formula,HUDMNU_OLDOUCH,,,,Použít starý vzorec pro 'ouch' portrét,"Gammel formel for ""av"" ansigt",Alte Formel für „Autsch“-Gesicht,,Uzi maljunan formulon de aj-vizaĝo-foto,Usar formula antigua de foto de daño,,Käytä vanhaa auts-naamakuvan kaavaa,Ancien code pour l' « ouch face »,,Régi sebződő fej formula használata,Mostra la formula originale del viso 'ouch',旧式ouch mug shotを使用,구형 피격 표정 스프라이트 방식 사용,"Oude formule voor ""Ouch""-gezicht",Bruk formelen for gamle forbryterbilder,Używaj starej formuły portretu twarzy 'ouch',Usar fórmula original do rosto de dor,,Utilizează modul portret vechi,Старая формула для портрета,Стара формула за приказ лика,"Använd den gamla formeln med ""ouch"" foton",Eski ouch oyuncu yüzü formülünü kullanın, +Hexen weapon flashes,HUDMNU_HEXENFLASHES,,,,Druh bliknutí zbraní v Hexenu,Hexen-våben blinker,Hexen-Waffenblitze,,Ekbriloj de Hexen-armo,Destello armas Hexen,,Hexenin asevälähdykset,Flash d'arme dans Hexen,,Hexen fegyver villanások,Bagliori armi Hexen,Hexen武器の視界色,헥센 무기 반짝임,Hexen-wapen flitsen,Hexen våpen blinker,Błysk przy podnoszeniu broni z Hexena,Flash de arma do Hexen,,Tip strălucire arme Hexen,Тип вспышки оружия в Hexen,Треперење оружја у Hexen-у,Hexen-vapen blinkar,Hexen silah flaşları, +Poison damage flashes,HUDMNU_POISONFLASHES,,,,Druh bliknutí při otrávení,Giftskabte skader blinker,Gift-Effekt,,Ekbriloj de venondamaĝo,Destello daño por veneno,,Myrkkyvahinkovälähdykset,Flash de poison dans Hexen,,Méreg sebzés villanások,Bagliori danno da veleno,毒ダメージの視界色,독데미지 반짝임,Vergiftigingsschade knippert,Giftskade blinker,Efekt obrażeń przy zatruciu,Flash de dano por veneno,,Tip strălucire efect de otrăvire,Тип вспышки яда,Треперење током тровања,Blinkar för giftskador,Zehir hasarı flaşları, +Ice death flashes,HUDMNU_ICEFLASHES,,,,Druh bliknutí při smrti umrznutím,Isdødsblink,Eis-Tod-Effekt,,Ekbriloj de glacimorto,Destello muerte por hielo,,Jääkuolemavälähdykset,Flash de morts par glace,,Jéghalál villanások,Bagliori morte da ghiaccio,氷結死の視界色,동사시 반짝임,IJsdood knippert,Isdød blinker,Błysk przy śmierci poprzez zamrożenie,Flash de morte por congelamento,,Tip strălucire deces prin înghețare,Тип вспышки при смерти от льда,Треперење током смрти од леда,Blinkar för isdöd,Buz ölüm flaşları, +Poison Buildup flashes,HUDMNU_HAZARDFLASHES,,,,Druh blikání při kumulaci jedu,Gift Buildup blinker,Kumulativer Gift-Effekt,,Ekbriloj de venonamasigo,Destello acumulación de veneno,,Myrkyn kertymisvälähdykset,Flash d'accumulation de poison,,Fokozatos méreg sebzés villanások,Bagliori danno accumulato da veleno,蓄積毒の視界色,독데미지 반짝임 증강,Vergiftiging Opbouw knippert,Giftoppbygging blinker,Miganie przy nasilaniu się trucizny,Flash por acúmulo de dano por veneno,,Tip strălucire acumulare de otravă,Тип вспышки при скоплении яда,Треперење током гомилања отрова,Blinkningar för giftuppbyggnad,Zehir Birikimi yanıp söner, +Scaling Options,HUDMNU_SCALEOPT,,,,Škálování velikosti rozhraní,Skaleringsmuligheder,Skalierungsoptionen,,Skalo-Agordoj,Opciones de escalado,,Skaalausasetukset,Option de mise à l'échelle,,Méretezés Beállítások,Opzioni di scala,スケーリング オプション,배율 설정,Schaalopties,Alternativer for skalering,Opcje skalowania,Opções de escala,,Setări Dimensiuni,Настройки масштабирования,Подешавања размере,Alternativ för skalning,Ölçeklendirme Seçenekleri, +Show IWAD selection dialog,MISCMNU_QUERYIWAD,,,,Zobrazit dialog pro výběr IWADu,Vis IWAD-valgdialogboks,Zeige IWAD-Auswahl,,Montri elektodialogon de IWAD,Mostrar diálogo de selección de IWAD,,Näytä IWAD-valintaikkuna,Afficher la séléction d'IWAD,,IWAD kiválasztó ablak mutatása,Mostra la schermata della selezione IWAD,IWADの選択画面を表示,IWAD 게임 선택창 표시,IWAD-selectiedialoogvenster weergeven,Vis IWAD-valgdialogboks,Pokaż ekran wyboru gry (IWAD),Exibir janela de seleção de IWAD,,Afișează fereastra de selectare a jocurilor,Выбор IWAD-файла при запуске,Покажи IWAD дијалог за избор,Visa dialogrutan för val av IWAD,IWAD seçim iletişim kutusunu göster, +Enable cheats from all games,MISCMNU_ALLCHEATS,,,,Povolit cheaty ze všech her,Aktiver snyderier fra alle spil,Ermögliche Cheats aus allen Spielen,,Ebligi trompojn el tutaj ludoj,Activar trucos de todos los juegos,,Ota käyttöön huijauskoodit kaikista peleistä,Activer cheats de tous les jeux,,Minden játék csaláskódja érvényes,Abilita tutti i cheat da tutti i giochi,全ゲームでチート使用可にする,모든 게임에 치트 허용,Laat bedriegers van alle spellen toe,Aktiver juks fra alle spill,Włącz oszustwa ze wszystkich gier,Habilitar trapaças de todos os jogos,Permitir batotas de todos os jogos,Permite codurile din toate jocurile,Читы из всех игр,Омогући читове од свих игара,Aktivera fusk från alla spel,Tüm oyunlardan hileleri etkinleştirin, +,,Option Menus,,,,,,,,,,,,,,,,,,,,,,,,,,, +Enable making screenshots by scripts,MISCMNU_ENABLESCRIPTSCREENSHOTS,,,,Povolit skriptům pořizovat snímky obrazovky,Aktivering af skærmbilleder ved hjælp af scripts,"Erlaube Skripts, Screenshots zu machen",,Ebligi faradon de ekrankopioj per skriptoj,Habilitar captura de pantalla por scripts,,Salli komentosarjoin otetut kuvakaappaukset,Autoriser les Scripts à prendre des captures,,Szkriptek is készíthetnek képernyőképet,Abilita la cattura dello schermo tramite scripts,スクリプトからのスクショ作成を有効化,저장/불러오기 확인,Screenshots maken met behulp van scripts,Gjør det mulig å lage skjermbilder av skript,Pozwól na robienie zrzutów ekranu przez skrypty,Habilitar capturas de tela por scripts,Permitir capturas de ecrã por scripts,Posibilitate de a face poze prin scripturi,Возможность делать снимки экрана через скрипты,Омогући прављење скриншотова по скрипти,Aktivera att göra skärmdumpar med hjälp av skript,Komut dosyalarıyla ekran görüntüsü almayı etkinleştirme, +Load *.deh/*.bex lumps,MISCMNU_DEHLOAD,,,,Načítat *.deh/*.bex soubory,Indlæsning af *.deh/*.bex-filer,Lade *.deh/*.bex Daten,,Ŝargi je *.deh/*.bex lumpoj,Cargar archivos *.deh/*.bex,,Lataa *.deh/*.bex-lump-tiedostot,Charger fichiers *.deh/*.bex,,*.deh/*.bex lump-ok betöltése,Carica i lump *.deh/*.bex,.deh/.bexファイルを読み込む,*.deh/*.bex 럼프 파일 불러오기,*.deh/*.bex laden,Last inn *.deh/*.bex-arkiver,Załaduj dane *.deh/*.bex,Carregar lumps *.deh/*.bex,,Încarcă nodurile *.deh/*.bex,Загружать файлы *.deh/*.bex,Учитај *.deh/*.bex фајлове,Ladda *.deh/*.bex-filer,.deh/*.bex topaklarını yükle, +Cache nodes,MISCMNU_CACHENODES,,,,Cachovat nodes,,Nodes zwischenspeichern,,Kaŝmemoraj nodoj,Caché de nodos,,Tallenna solmut välimuistiin,Mise en cache des nodes,,Node-ok cache-lése,Cache dei nodi,ノードキャッシュ,캐시 노드,Cache nodes,Bufre noder,Węzły pamięci podręcznej,Cachê de nodes,Cache de nodes,Depozitare noduri cache,Кэширование узлов,Кеширани чворови,Cache-noder,Önbellek düğümleri, +Time threshold for node caching,MISCMNU_CACHETIME,,,,Časový práh pro cachování nodes,Tidsgrænse for node-cache,Zeitschwelle für das Zwischenspeichern von Nodes,,Templimo pro kaŝmemornodi,Umbral de tiempo para caché de nodos,,Kynnysaika solmujen välimuistitallennukseen,Limite cache des nodes,,Időhatár node cache-hez,Soglia di tempo per il caching dei nodi,ノードキャッシュ時間の閾値,노드 캐싱을 위한 시간 임계값 계산,Tijdsdrempel voor het cachen van nodes,Tidsterskel for nodebufring,Próg czasowy buforowania węzłów,Limite de tempo para cachê de nodes,Limite de tempo para cache de nodes,Limită de timp pentru depozitare cache,Временной порог для кэширования узлов,Временски праг за кеширање чвора,Tidströskel för cachelagring av noder,Düğüm önbelleğe alma için zaman eşiği, +Clear node cache,MISCMNU_CLEARNODECACHE,,,,Vyčistit node cache,Ryd node-cache,Nodespeicher löschen,,Forigi kaŝmemorajn nodojn,Limpiar Caché de nodos,,Tyhjennä solmuvälimuisti,Vider le cache des nodes,,Cache node ürítése,Pulisci la cache dei nodi,ノードのキャッシュをクリア,노드 캐시를 삭제,Node cache legen,Tøm nodebuffer,Wyczyść pamięć podręczną,Limpar cachê de nodes,Limpar cache de nodes,Ștergere noduri cache,Очистить кэш узлов,"Избриши кеширане чворове ",Rensa nodcache,Düğüm önbelleğini temizle, -Allow skipping of intermission scrollers,MISCMNU_INTERSCROLL,,,,Povolit přeskakování skrolujících obrázků,Tillad at springe over pausescrollere,Erlaube Überspringen von Intermission-Scrollern,,Permesi preterpason de intermitaj rulumoj,Permitir omisión de intermedios,,Salli vierivien väliruutujen ohittaminen,Sauter compteurs d'intermission,Pályaközi szünetek átugorhatóak,Consenti di saltare gli scorrimenti delle intermissioni,クリア結果集計のスキップを許可,인터미션 스크롤러 생략 허용,Overslaan van intermissiescrollers toestaan,Tillat å hoppe over pauserullere,Pozwól na pominięcie wstawek,Pular telas de intervalo entre fases,Saltar ecrãs de intervalo entre níveis,Permite saltul peste inserările de text,Разрешение пропуска текстовых вставок,Дозволи прескакање прелаза са текстовима,Tillåt att hoppa över rullgardiner för pauslägen.,Ara kaydırıcıların atlanmasına izin ver, -Network Options,NETMNU_TITLE,,,,Nastavení sítě,Netværksindstillinger,Netzwerkeinstellungen,,Reta Agordoj,Opciones de Red,,Verkkoasetukset,Options Réseau,Hálózati Beállítások,Opzioni network,ネットワーク オプション,네트워크 설정,Netwerkopties,Nettverksalternativer,Opcje Sieci,Opções de Rede,,Setări de Rețea,Настройки сети,Мрежна подешавања,Nätverksalternativ,Ağ Seçenekleri, -Local options,NETMNU_LOCALOPTIONS,,,,Lokální nastavení,Lokale indstillinger,Lokale Einstellungen,,Lokaj agordoj,Opciones locales,,Paikallisasetukset,Options Locales,Helyi beállítások,Opzioni locali,ローカル オプション,로컬 설정,Lokale opties,Lokale alternativer,Opcje Lokalne,Opções locais,,Setări Locale,Локальные настройки,Локална подешавања,Lokala alternativ,Yerel seçenekler, -Movement prediction,NETMNU_MOVEPREDICTION,,,,Predikce pohybu,Forudsigelse af bevægelser,Bewegungsvorausberechnung,,Movprognozado,Predicción de Movimiento,,Liikkeen ennakoiminen,Prédiction de Mouvement,Mozgás előrejelzés,Predizione movimenti,移動予測,움직임 예측도,Voorspelling van bewegingen,Forutsigelse av bevegelse,Przewidywanie Ruchu,Previsão de movimento,,Anticipare mișcare,Предсказание движения,Предвиђање покрета,Förutsägelse av rörelser,Hareket tahmini, -Predict line actions,NETMNU_LINESPECIALPREDICTION,,,,Predikce čárových akcí,Forudsige linjehandlinger,Berechne Linienaktionen voraus,,Prognozi linio-agojn,Predecir acciones de línea,,Ennakoi viivasuorat toiminnat,Prédiction des actions de ligne,Előrejelzés vonal művelet,Predizione azioni di linea,line actionsを予測する,라인 움직임 감지,Voorspel lijnacties,Forutsi linjehandlinger,Przewidź akcje linii,Prever ações de linha,,Anticipează acționarea liniilor,Предсказание действий на уровне,Предвиђање линијске радње,Förutsägelse av linjeåtgärder,Hat eylemlerini tahmin edin, -Prediction Lerp Scale,NETMNU_PREDICTIONLERPSCALE,,,,Velikost interpolace predikce,Forudsigelse Lerp-skala,Vorberechnungs Lerp-Skalierung,,Skalo de Linia Lnterpolado,Escala de interp. lineal de predicción,,Lineaarisen interpolaatioennakoinnin skaalaus,Prédiction d'échelle LERP,Előrejelzés LERP Arány,Scala Lerp predizione,リープスケール予測,러프 예측 강도,Voorspelling Lerp Scale,Prediksjon Lerp-skala,Przewidywanie Skali Lerp,Escala de previsão de LERP,,Anticipare scară lerp,Предсказание увеличения доп. задержки,Предвиђање лерп скале,Förutsägelse Lerp Scale,Tahmin Lerp Ölçeği, -Lerp Threshold,NETMNU_LERPTHRESHOLD,,,,Práh interpolace,Lerp-tærskel,Lerp-Schwellwert,,Limito de Linia Interpolado,Umbral de interp. lineal,,Interpolaatiokynnys,Limite LERP,LERP küszöbérték,Soglia Lerp,リープしきい値,러프 계산,Lerp Threshold,Lerp-terskel,Próg Lerp,Limite de LERP,,Prag Lerp,Порог доп. задержки,Лерп праг,Lerp Tröskelvärde,Lerp Eşiği, -Host options,NETMNU_HOSTOPTIONS,,,,Nastavení hostitele,Værtsindstillinger,Gastoptionen,,Agordoj de Gastiganto,Opciones de Host,,Isäntäasetukset,Options Hôte,Host beállítások,Opzioni ospitante,ホスト オプション,호스트 설정,Verhuurders opties,Vertsalternativer,Opcje hosta,Opções de host,,Setări gazdă,Настройки сервера,Подешавања домаћина,Alternativ för värdar,Ev sahibi seçenekleri, -Extra Tics,NETMNU_EXTRATICS,,,,Extra tiky,Ekstra tics,,,Ekstraj Tikoj,Tics Extra,,Lisäticit,Tics supplémentaires,Extra Tic-ek,Tics extra,予備秒数,추가 틱,,Ekstra tics,Dodatkowe tiki,Tics extras,,Ticăituri suplimentare,Дополнительные секунды,Додатни тикови,Extra tics,Ekstra Tikler, -Latency balancing,NETMNU_TICBALANCE,,,,Vyrovnání latence,Balancering af latenstid,Latenzbalance,,Respondotempo-balancado,Balanceo de latencia,,Viiveen tasapainoitus,Equilibrage de latence,Válaszidő balanszolás,Bilanciamento latenza,レイテンシーバランス,지연 시간 조정,Latency balans,Balansering av ventetid,Balans czasu oczekiwania,Equilíbrio de latência,,Întârzierea echilibrării,Балансировка задержки,Балансирање кашњења,Balansering av latenstid,Gecikme dengeleme, -Original,OPTVAL_ORIGINAL,,,,Původní,,,,Originala,,,Alkuperäinen,,Eredeti,Originale,オリジナル,원형,Origineel,,Oryginalny,,,,Изначальный,Оригинално,Ursprunglig,Orijinal, -Optimized,OPTVAL_OPTIMIZED,,,,Optimalizovaný,Optimeret,Optimiert,,Optimumigita,Optimizado,,Optimoitu,Optimisé,Optimalizált,Ottimizzato,最適化,최적화 형,Geoptimaliseerd,Optimalisert,Zoptymalizowany,Otimizado,,Optimizat,Оптимизированный,Оптимизовано,Optimerad,Optimize Edilmiş, -Classic (Faster),OPTVAL_CLASSIC,,,,Klasický (rychlejší),Classic (hurtigere),Klassisch (schneller),,Klasika (Pli rapide),Clásico (Más rápido),,Perinteinen (nopeampi),Classique (+ Rapide),Klasszikus (gyorsabb),Classico (più veloce),旧式(速度重視),구형 (빠르게),Klassiek (sneller),Klassisk (raskere),Klasyczny (szybszy),Clássico (Mais rápido),,Clasic (Mai rapid),Классический (быстрее),Класични (бржи),Classic (snabbare),Klasik (Daha Hızlı), -Precise,OPTVAL_PRECISE,,,,Přesný,Præcist,Genau,,Preciza,Preciso,,Tarkka,Précis,Pontos,Preciso,精密,정확하게,Nauwkeurig,Presis,Dokładny,Preciso,,Precis,Точный,Прецизно,Exakt,Kesin, -Capped,OPTVAL_CAPPED,,,,Uzavřený,Begrænset,Limitiert,,Limitigita,Limitado,,Rajoitettu,Limité,Lekorlátozva,Limitato,上限,색상에 맞게,Afgeschermd,Begrenset,Ograniczony,Limitado,,Limitat,Ограниченный,Ограничено,Begränsad,Sınırlı, -Particles,OPTVAL_PARTICLES,,,,Částice,Partikler,Partikel,,Partikloj,Partículas,,Hiukkasina,Particules,Részecskék,Particelle,パーティクル,입자만,Deeltjes,Partikler,Cząstki,Partículas,,Particule,Частицы,Честице,Partiklar,Parçacıklar, -Sprites,OPTVAL_SPRITES,,,,Sprity,,,,Mov-rastrumoj,,,Spriteinä,,Sprite-ok,Sprite,スプライト,스프라이트만,,,Sprite'y,,,Sprite-uri,Спрайты,Спрајтови,,Sprite'lar, -Sprites & Particles,OPTVAL_SPRITESPARTICLES,,,,Sprity a částice,Sprites og partikler,Sprites und Partikel,,Mov-rastrumoj kaj partikloj,Sprites y partículas,,Spriteinä ja hiukkasina,Sprites & Particules,Sprite-ok és részecskék,Sprite e particelle,スプライト & パーティクル,스프라이트+입자,Sprites & Deeltjes,Sprites og partikler,Sprite'y i cząstki,Sprites & Partículas,Sprites e Partículas,Sprite-uri & Particule,Спрайты и частицы,Спрајтови и честице,Sprites och partiklar,Sprite'lar ve Parçacıklar, -Melt,OPTVAL_MELT,,,,Rozpuštění,Smelt,Verlauf,,Fandi,Derretir,,Sulaminen,Fondu,Olvadás,Scioglimento,メルト,녹는 효과,Smelten,Smelte,Stopienie,Derreter,,Topire,Таяние,Топљење,Smält,Eriyik, -Burn,OPTVAL_BURN,,,,Oheň,Brænde,Einbrennen,,Bruli,Quemar,,Palaminen,Brûlure,Égés,Bruciamento,バーン,타는 효과,Verbranden,Brenne,Wypalenie,Queimar,,Ardere,Жжение,Спаљивање,Bränn,Yanmak, -Crossfade,OPTVAL_CROSSFADE,,,,Prolínačka,Crossfade,Überblenden,,Transvelki,Entrelazar,,Ristihäivytys,Fondu en croix,Átvezetés,Dissolvenza a croce,クロスフェード,화면 교차,Crossfade,Overblending,Przenikanie,Dissolver,,Ofilire,Увядание,Вењење,Crossfade,Crossfade, -Smooth,OPTVAL_SMOOTH_1,"This setting is duplicated in order to allow for different grammatical gender endings in the Russian language (and any other language that depends on a grammatical gender system). In English, due to the lack of a grammatical gender system, both option values are the same.",,,Vyhlazený,Glat,Glatt,,Glata,Fluido,,Pehmeä,Lisse,Simítás,Liscio,スムーズ,부드럽게,Glad,Glatt,Gładki,Suavizado,,Fin,Плавная,Глатко,Smidig,Pürüzsüz, -Smooth,OPTVAL_SMOOTH_2,,,,Vyhlazené,Glat,Glatt,,Glata,Fluido,,Pehmeä,Lisse,Simítás,Liscio,スムーズ,부드럽게,Glad,Glatt,Gładka,Suavizado,,Fin,Плавные,Глатко,Smidig,Pürüzsüz, -Translucent,OPTVAL_TRANSLUCENT,,,,Průhledný,Gennemskinnelig,Transparent,,Diafana,Translúcido,,Läpikuultava,Transparent,Áttetsző,Traslucido,半透明,투명하게,Doorschijnend,Gjennomskinnelig,Przeświecający,Translúcido,,Transparent,Полупрозрачный,Прозрачно,Genomskinlig,Yarı Saydam, -Fuzz,OPTVAL_FUZZ,,,,Šum,,Fuzz,,Lanugo,Borroso,,Sumeus,Bruit Blanc,Homályosítás,Annebbiato,ファズ,퍼즈 효과,Fuzz,,Szum,Difuso,,Sclipitor,Шумовой,Фаз,Fuzz,Fuzz, -Shadow,OPTVAL_SHADOW,,,,Stín,Skygge,Schatten,,Ombro,Sombra,,Varjo,Ombre,Árnyék,Ombra,シャドウ,그림자 효과,Schaduw,Skygge,Cień,Sombra,,Umbră,Теневой,Сенка,Skugga,Gölge, -Items,OPTVAL_ITEMS,,,,Předměty,Varer,Gegenstände,,Objektoj,Objetos,,Esineet,Objets,Tárgyak,Oggetti,アイテム,아이템들,Artikelen,Gjenstander,Przedmioty,Itens,,Obiecte,Предметы,Предмет,Artiklar,Eşyalar, -Weapons,OPTVAL_WEAPONS,,,,Zbraně,Våben,Waffen,,Armiloj,Armas,,Aseet,Armes,Fegyverek,Armi,武器,무기들,Wapens,Våpen,Bronie,Armas,,Arme,Оружие,Оружја,Vapen,Silahlar, -Both,OPTVAL_BOTH,,,,Obojí,Begge,Beide,,Ambaŭ,Ambos,,Molemmat,Les Deux,Mindkettő,Entrambi,両方,둘 다,Beide,Begge,Oba,Ambos,,Ambele,Оба,Оба,Båda,Her ikisi de, -ZDoom,OPTVAL_ZDOOM,,,,,,,,,,,,,,,,Z둠,,,,,,,,,,, -Strife,OPTVAL_STRIFE,,,,,,,,,,,,,,,,스트라이프,,,,,,,,,,, -Player,OPTVAL_PLAYER,,,,Hráč,Spiller,Spieler,,Ludanto,Jugador,,Pelaaja,Joueur,Játékos,Giocatore,プレイヤー,플레이어,Speler,Spiller,Gracz,Jogador,,Jucător,Игрок,Играч,Spelare,Oyuncu, -Map,OPTVAL_MAP,,,,Level,Kort,Level,,Mapo,Mapa,,Kartta,Niveau,Pálya,Mappa,マップ,맵,Kaart,Kart,Mapa,Mapa,,Hartă,Карта,Мапа,Karta,Harita, -Scale to 640x400,OPTVAL_SCALETO640X400,,,,Zvětšit na 640x400,Skaleres til 640x400,Skaliere auf 640x400,,Skali al 640x400,Escalar a 640x400,,Skaalaa resoluutioon 640x400,Echelle 640x400,640x480-hoz arányít,Scala a 640x400,640x400スケール,640x400까지 확대,Schaal tot 640x400,Skala til 640x400,Skaluj do 640x400,Escalar para 640x400,,Dimensionare la 640x480,Масштабировать до 640x400,Скалирај на 640x400,Skala till 640x400,640x400'e ölçeklendirin, -Pixel double,OPTVAL_PIXELDOUBLE,,,,Zdvojení pixelů,Pixel dobbelt,Pixelverdopplung,,Bilderon duobligi,Pixel doble,,Kuvapistekaksinkertaistus,,Pixel duplázás,Pixel doppi,ピクセル2倍,2배 픽셀,Pixel dubbel,Dobbel piksel,Dwukrotnie więcej pikseli,Pixel duplo,,Dublare pixeli,Двойные пиксели,Дупли пиксел,Pixel dubbelt så mycket,Piksel çift, -Pixel quadruple,OPTVAL_PIXELQUADRUPLE,,,,Zčtyřnásobení pixelů,Pixel firedobbelt,Pixelvervierfachung,,Bilderon kvarobligi,Pixel cuádruple,,Kuvapistenelinkertaistus,,Pixel négyszerezés,Pixel quadrupli,ピクセル4倍,4배 픽셀,Pixel viervoudig,Piksel firedoblet,Czterokrotnie więcej pikseli,Pixel quádruplo,,Împătrire pixeli,Учетверённые пиксели,Четвороструки пиксел,Pixel fyrdubbel,Piksel dörtlü, -Current weapon,OPTVAL_CURRENTWEAPON,,,,Současná zbraň,Nuværende våben,Aktuelle Waffe,,Nuntempa armilo,Arma actual,,Nykyinen ase,Arme actuelle,Jelenlegi fegyver,Arma corrente,使用中の武器,현 무기,Huidig wapen,Nåværende våpen,Aktualna broń,Arma atual,,Arma curentă,текущего оружия,Тренутно оружје,Aktuellt vapen,Mevcut silah, -Available weapons,OPTVAL_AVAILABLEWEAPONS,,,,Dostupně zbraně,Tilgængelige våben,Verfügbare Waffen,,Haveblaj armiloj,Armas disponibles,,Käytettävissä olevat aseet,Armes Disponibles,Elérhető fegyverek,Armi disponibili,所持してる武器,사용 가능한 무기들,Beschikbare wapens,Tilgjengelige våpen,Dostępne bronie,Armas disponíveis,,Arme disponibile,доступного оружия,Доступно оружје,Tillgängliga vapen,Mevcut silahlar, -All weapons,OPTVAL_ALLWEAPONS,,,,Všechny zbraně,Alle våben,Alle Waffen,,Ĉiuj armiloj,Todas las armas,,Kaikki aseet,Toutes les armes,Minden fegyver,Tutte le armi,全ての武器,모든 무기들,Alle wapens,Alle våpen,Wszystkie bronie,Todas as armas,,Toate armele,всех видов оружия,Сва оружја,Alla vapen,Tüm silahlar, -"Level, milliseconds",OPTVAL_LEVELMILLISECONDS,,,,"Level, milisekundy","Level, millisekunder","Level, Millisekunden",,"Nivelo, milisekundoj","Nivel, milisegundos",,"Taso, millisekunnit","Niveau, milisecondes","Pálya, milliszekundum","Livello, millisecondi","現場, ミリ秒","레벨, 밀리초당","Niveau, milliseconden","Nivå, millisekunder","Poziom, milisekundy","Fase, milisegundos","Nível, milisegundos","Nivel, milisecunde","Уровень, миллисекунды","Ниво, милисекунде","Nivå, millisekunder","Seviye, milisaniye", -"Level, seconds",OPTVAL_LEVELSECONDS,,,,"Level, vteřiny","Level, sekunder","Level, Sekunden",,"Nivelo, sekundoj","Nivel, segundos",,"Taso, sekunnit","Niveau, secondes","Pálya, másodpercek","Livello, secondi","現場, 秒","레벨, 초당","Niveau, seconden","Nivå, sekunder","Poziom, sekundy","Fase, segundos","Nível, segundos","Nivel, secunde","Уровень, секунды","Ниво, секунде","Nivå, sekunder","Seviye, saniye", -Level,OPTVAL_LEVEL,,,,,,,,Nivelo,Nivel,,Taso,Niveau,Pálya,Livello,現場,레벨,Niveau,Nivå,Poziom,Fase,Nível,Nivel,Уровень,Ниво,Nivå,Seviye, -"Hub, seconds",OPTVAL_HUBSECONDS,,,,"Hub, vteřiny","Hub, sekunder","Hub, Sekunden",,"Rekontejo, sekundoj","Hub, segundos",,"Tasokokoelma, sekunnit","Hub, secondes","Csomópont, másodpercek","Hub, secondi","区間, 秒","허브, 초당","Naaf, seconden","Hub, sekunder","Hub, sekundy","Hub, segundos",,"Hub, secunde",Хаб (секунды),"Хуб, секунде","Hub, sekunder","Hub, saniye", -Hub,OPTVAL_HUB,,,,,,,,Rekontejo,,,Tasokokoelma,,Csomópont,,区間,허브,Naaf,,,,,,Хаб,Хуб,Nav,, -"Total, seconds",OPTVAL_TOTALSECONDS,,,,"Celkový, vteřiny","I alt, sekunder","Gesamt, Sekunden",,"Tuto, sekundoj","Total, segundos",,"Yhteensä, sekunnit","Total, secondes","Teljes, másodpercek","Totale, secondi","合計, 秒","누적 경과, 초당","Totaal, seconden","Totalt, sekunder","Razem, sekundy","Total, segundos",,"Total, secunde",Общее (секунды),"Тотал, секунде","Totalt, sekunder","Toplam, saniye", -Total,OPTVAL_TOTAL,,,,Celkový,I alt,Gesamt,,Tuto,,,Yhteensä,,Teljes,Totale,合計,누적 경과,Totaal,Totalt,Razem,,,,Общее,Тотал,Totalt,Toplam, -"System, seconds",OPTVAL_SYSTEMSECONDS,,,,"Systémový, vteřiny","System, sekunder","System, Sekunden",,"Sistemo, sekundoj","Sistema, segundos",,"Järjestelmä, sekunnit","Système, secondes","Rendszer, másodpercek","Sistema, secondi","PC時刻, 秒","시스템, 초당","Systeem, seconden","System, sekunder","System, sekundy","Sistema, segundos",,"Sistem, secunde",Система (секунды),"Систем, секунде","System, sekunder","Sistem, saniye", -System,OPTVAL_SYSTEM,,,,Systémový,,,,Sistemo,Sistema,,Järjestelmä,Système,Rendszer,Sistema,PC時刻,시스템,Systeem,,,Sistema,,Sistem,Система,Систем,,Sistem, -Netgames only,OPTVAL_NETGAMESONLY,,,,Pouze v síťové hře,Kun netspil,Nur Netzwerkspiele,,Retludoj sole,Solo para juegos en red,,Vain verkkopelit,Parties en Ligne seulement,Csak Netgames,Solo giochi net,オンラインのみ,멀티플레이에만,Alleen Netspellen,Kun nettspill,Tylko gry sieciowe,Jogos em rede apenas,,Doar în rețea,Только сетевые игры,Мрежне игре само,Endast nätspel,Sadece net oyunlar, -Image and Text,OPTVAL_AMMOIMAGETEXT,,,,Obrázek a text,Billede og tekst,Bild und Text,,Bildo kaj Teksto,Imagen y texto,,Kuva ja teksti,Image et Texte,Kép és szöveg,Immagini e testo,画像と字,이미지와 텍스트,Beeld en tekst,Bilde og tekst,Obraz i Tekst,Imagem e texto,,Imagine și Text,Изображение и текст,Слика и текст,Bild och text,Resim ve Metin, -Text and Image,OPTVAL_AMMOTEXTIMAGE,,,,Text a obrázek,Tekst og billede,Text und Bild,,Teksto kaj Bildo,Texto e imagen,,Teksti ja kuva,Texte et Image,Szöveg és kép,Testo e immagini,字と画像,텍스트와 이미지,Tekst en beeld,Tekst og bilde,Tekst i Obraz,Texto e imagem,,Text și Imagine,Текст и изобр.,Текст и слика,Text och bild,Metin ve Görüntü, -Scripts Only,OPTVAL_SCRIPTSONLY,,,,Pouze skripty,Kun scripts,Nur Skripte,,Skriptoj Sole,Solo scripts,,Vain komentosarjat,Scripts seulement,Csak szkript,Solo script,スクリプトのみ,스크립트에만,Alleen scripts,Bare skript,Tylko skrypty,Scripts apenas,,Numai scripturi,Только скрипты,Само скрипте,Endast skript,Sadece Senaryolar, -All,OPTVAL_ALL,,,,Všechny,Alle,Alle,,Ĉiuj,Todos,,Kaikki,Tout,Mind,Tutti,全て,모두 작동,Alle,Alle,Wszystko,Todos,,Tot,Все,Све,Alla,Tümü, -Only last one,OPTVAL_ONLYLASTONE,,,,Pouze poslední,Kun den sidste,Nur das letzte,,Nur fina unu,Solo el último,,Vain viimeinen,Dernier seulement,Csak a legutolsó,Solo l'ultimo,最後のみ,오직 마지막 것만,Alleen de laatste,Bare den siste,Tylko ostatni,Somente o último,Apenas o último,Doar ultimul,Только последнее,Само последњи,Endast den sista,Sadece sonuncusu, -Traditional Doom,OPTVAL_TRADITIONALDOOM,,,,Tradiční Doom,Traditionel Doom,Doom traditionell,,Tradicia Doom,Doom tradicional,,Perinteinen Doom,Doom Traditionnel,Tradícionális Doom,DOOM tradizionale,正式DOOM,전형적인 둠 스타일,Traditioneel Doom,Tradisjonell undergang,Tradycyjny Doom,Doom Tradicional,,Tradițional Doom,Цвета из Doom,Традиционални Doom,Traditionell Doom,Geleneksel Doom, -Traditional Strife,OPTVAL_TRADITIONALSTRIFE,,,,Tradiční Strife,Traditionel Strife,Strife traditionell,,Tradicia Strife,Strife tradicional,,Perinteinen Strife,Strife Traditionnel,Tradícionális Strife,Strife tradizionale,正式Strife,전형적인 스트라이프 스타일,Traditionele Strife,Tradisjonell strid,Tradycyjny Strife,Strife Tradicional,,Tradițional Strife,Цвета из Strife,Традиционални Strife,Traditionell Strife,Geleneksel Strife, -Traditional Raven,OPTVAL_TRADITIONALRAVEN,,,,Tradiční Raven,Traditionel Raven,Raven traditionell,,Tradicia Raven,Raven tradicional,,Perinteinen Raven,Raven Traditionnel,Tradícionális Raven,Raven tradizionale,正式Raven,전형적인 레이븐 스타일,Traditionele Raven,Tradisjonell ravn,Tradycyjny Raven,Raven Tradicional,,Tradițional Raven,Цвета из Raven,Традиционални Raven,Traditionell Raven,Geleneksel Raven, -Only when found,OPTVAL_ONLYWHENFOUND,,,,Pouze po nalezení,Kun når de findes,Nur wenn gefunden,,Nur kiam trovita,Una vez encontrados,,"Vain, kun löydetty",Seulement découverts,Csak ha megleled,Solo quando trovato,発見時のみ,획득했을 때만,Alleen wanneer gevonden,Bare når funnet,Tylko gdy znaleziono,Somente quando encontrado,Apenas quando encontrado,Doar la descoperire,После обнаружения,Само кад је пронађен,Endast när den hittas,Sadece bulunduğunda, -On for overlay only,OPTVAL_ONFOROVERLAYONLY,,,,Pouze v překryvném režimu,Kun til overlay,Nur auf Overlay,,Ŝaltita nur por surmeto,Solo para superpuesto,,Päällä vain karttaprojisoinnin kanssa,On pour Surimpression,Csak az overlayen,Solo attivo per la sovrapposizione,オーバーレイ専用,오버레이에만 작동,Alleen op voor overlay alleen voor overlay,På kun for overlegg,Włączony tylko dla nakładek,Ativado somente para sobreposição,Apenas ativado para sobreposição,Doar pentru modul transparent,Только наложенная,Укључен само за навлаку,Endast på för överlagring,Yalnızca kaplama için etkin, -Overlay+Normal,OPTVAL_OVERLAYNORMAL,,,,Překryv + normální,Overlay+Normal,Overlay+Normal,,Surmeto+Normala,Superpuesto+Normal,,Projisointi+tavallinen,Surimpression+Normal,Overlay+Normál,Sovrapposizione+Normale,オーバーレイ+通常,오버레이+기본,Overlay+Normaal,,Nakładka+Normalnie,Sobreposição+Normal,,Transparent + Normal,Наложенная + обычная,Навлака + нормално,Överlagring+Normal,Yer Kaplama+Normal, -Overlay Only,OPTVAL_OVERLAYONLY,,,,Pouze překryv,Kun overlay,Nur Overlay,,Nur Surmeto,Solo superpuesto,,Vain projisointi,Surimpression seulement,Csak Overlay-nél,Solo Sovrapposizione,オーバーレイのみ,오버레이만,Alleen Overlay,Kun overlegg,Tylko Nakładka,Sobreposição apenas,,Doar modul transparent,Только прозрачный,Навлак само,Endast överlagring,Yalnızca Kaplama, -Not for hubs,OPTVAL_NOTFORHUBS,,,,Ne pro huby,Ikke for knudepunkter,Nicht für Hubs,,Ne por naboj,No para hubs,,Ei tasokokoelmille,Pas pour les hubs,Csomópontokhoz nem,Non per gli hub,区間では出さない,허브는 제외,Niet voor hubs,Ikke for nav,Nie dla hubów,Exceto hubs,,Nu pentru hub-uri,Кроме групп,Није за хубове,Inte för nav,Hub'lar için değil, -Front,OPTVAL_FRONT,,,,Zepředu,Forside,Frontalansicht,,Fronto,Frontal,,Etu,Devant,Előnézet,Fronte,画像,정면,Voorkant,Forside,Przód,Frente,,Înainte,Перед,Испред,Framsida,Ön, -Animated,OPTVAL_ANIMATED,,,,Animované,Animeret,Animiert,,Animita,Animado,,Animoitu,Animés,Animált,Animato,動作,움직임,Geanimeerd,Animert,Animowany,Animado,,Animat,Анимированные,Анимирано,Animerad,Animasyonlu, -Rotated,OPTVAL_ROTATED,,,,Otáčivé,Drejet,Rotiert,,Turnita,Rotado,,Kääntyvä,Tournés,Elforgatott,Ruotato,回転,회전함,Geroteerd,Rotert,Obrócony,Rotacionado,Rodado,Rotit,Повёрнутые,Ротирано,Roterad,Döndürülmüş, -Map defined colors only,OPTVAL_MAPDEFINEDCOLORSONLY,,,Map defined colours only,Pouze barvy definované mapou,Kun kortdefinerede farver,Nur Leveldefinierte Farben,,Nur mapaj difinitaj koloroj,Colores definidos por el usuario,,Vain kartan määrittämät värit,Couleurs définies carte seul.,Csak map orientált színek,Solo i colori definiti dalla mappa,指定した色のみ,자체 미니맵 색상 사용,Alleen gedefinieerde kleuren op de kaart,Kun kartdefinerte farger,Tylko kolory zdefiniowane przez mapę,Cores definidas por mapa apenas,,Doar culori specifice hărții,Только определённые картой цвета,Само дефинисане мапом боје,Endast kartdefinierade färger,Yalnızca harita tanımlı renkler, -All except doors,OPTVAL_NODOORS,,,,Všechny krom dveří,Alle undtagen døre,Alle außer Türen,,Ĉiom krom pordoj,Todo excepto puertas,,Kaikki paitsi ovet,Tout sauf portes,"Minden, kivétel az ajtók",Tutti eccetto le porte,ドア以外全て,문을 제외한 모두,Allemaal behalve deuren,Alle unntatt dører,Wszystko oprócz drzwi,Tudo exceto portas,,Cu excepția ușilor,Кроме дверей,Све осим врата,Alla utom dörrar,Kapılar hariç hepsi, -Double,OPTVAL_DOUBLE,,,,Dvojitý,Dobbelt,Doppel,,Duobligi,Doble,,Kaksinkertainen,,Dupla,Doppio,ダブル,2배,Dubbele,Dobbel,Podwójny,Dobro,,Dublu,Двойной,Дупло,Dubbel,Çift, -Triple,OPTVAL_TRIPLE,,,,Trojitý,Tredobbelt,Dreifach,,Triobligi,,,Kolminkertainen,,Tripla,Triplo,トリプル,3배,Drievoudig,Trippel,Potrójny,Triplo,,Triplu,Тройной,Тродупло,Tredubbel,Üçlü, -Quadruple,OPTVAL_QUADRUPLE,,,,Čtveritý,Firedobbelt,Vierfach,,Kvarobligi,Cuádruple,,Nelinkertainen,,Négyszeres,Quadruplo,クァッド,4배,Viervoudig,Firedoblet,Poczwórny,Quádruplo,,Cvadruplu,Четырёхкратный ,Четвороструко,Fyrdubbel,Dörtlü, -Item Pickup,OPTVAL_ITEMPICKUP,,,,Sebrání předmětu,Afhentning af varer,Gegenstand genommen,,Objektoprenado,Coger objetos,Agarrar objetos,Esineen poiminta,Objets Ramassés,Tárgy felvétele,Raccolta oggetto,アイテム取得,아이템 획득시,Puntafhaling,Varehenting,Podniesienie Przedmiotu,Coleta de Item,Aquisição de Itens,Obiect Ridicat,Подбор предметов,Подигнут предмет,Hämtning av föremål,Bir eşyayı almak, -Obituaries,OPTVAL_OBITUARIES,,,,Oznámení o smrti,Dødsannoncer,Todesanzeige,,Nekrologoj,Obituarios,,Kuolinviestit,Avis de décès,Halálok,Necrologio,死亡時,사망 메시지,Doodsbrieven,Dødsannonser,Nekrologi,Obituários,,Necrologuri,Некрологи,Читуље,Dödsannonser,Ölüm İlanları, -Critical Messages,OPTVAL_CRITICALMESSAGES,,,,Kritická oznámení,Kritiske meddelelser,Kritische Meldungen,,Gravaj mesaĝoj,Mensajes críticos,,Tärkeät viestit,Messages Critiques,Fontos üzenetek,Messaggi critici,重要メッセージ,중요한 메시지,Kritische berichten,Kritiske meldinger,Wiadomości krytyczne,Mensagens Críticas,,Mesaje Critice,Важные сообщения,Критичне поруке,Kritiska meddelanden,Kritik Mesajlar, -Never friends,OPTVAL_NEVERFRIENDS,,,,Nikdy spojence,Aldrig venner,Keine Freunde,,Neniam amikoj,Nunca amigos,,Ei koskaan ystäviä,Jamais les Amis,Barátokat sose,Mai amici,フレンド以外,아군 무시,Nooit vrienden,Aldri venner,Żadnych przyjaciół,Nunca amigos,,Nu aliați,Не по союзникам,Никад за пријатеље,Aldrig vänner,Asla arkadaş değil, -Only monsters,OPTVAL_ONLYMONSTERS,,,,Pouze příšery,Kun monstre,Nur Monster,,Nur monstroj,Solo monstruos,,Vain hirviöt,Monstres Seulement,Csak szörnyeket,Solo i mostri,モンスターのみ,적에게만,Alleen monsters,Bare monstre,Tylko potwory,Somente monstros,Monstros apenas,Doar monștri,Для монстров,Само чудовишста,Endast monster,Sadece canavarlar, -Hexen,OPTVAL_HEXEN,,,,,,,,,,,,Hexen,,,,헥센,,,,,,,,,,, -Old,OPTVAL_OLD,,,,Starý,Gamle,Alt,,Maljuna,Viejo,,Vanha,Ancien,Régi,Vecchio,旧式,구형,Oud,Gamle,Stare,Antigo,,Vechi,Старый,Стар,Gamla,Eski, -Doom,OPTVAL_DOOM,,,,,,,,,,,,,,,,둠,,,,,,,,,,, -Doom (strict),OPTVAL_DOOMSTRICT,,,,Doom (striktní),Doom (streng),Doom (strikt),,Doom (severa),Doom (estricto),,Doom (tiukka),,Doom (szigorú),Doom (rigoroso),Doom(厳密),둠 (엄격하게),Doom (streng),Doom (streng),Doom (ścisły),Doom (estritamente),Doom (estrito),,Doom (строгий),Doom (строг),Doom (strikt),Doom (katı), -Boom,OPTVAL_BOOM,,,,,,,,,,,,,,,,붐,,,,,,,,,,, -Boom (strict),OPTVAL_BOOMSTRICT,,,,Boom (striktní),Boom (streng),Boom (strikt),,Boom (severa),Boom (estricto),,Boom (tiukka),,Boom (szigorú),Boom (rigoroso),Boom(厳密),붐 (엄격하게),Boom (streng),Boom (streng),Boom (ścisły),Boom (estritamente),Boom (estrito),,Boom (строгий),Boom (строг),Boom (strikt),Boom (katı), -MBF,OPTVAL_MBF,,,,,,,,,,,,,,,,마린의 절친한 친구,,,,,,,,,,, -MBF (strict),OPTVAL_MBFSTRICT,,,,MBF (striktní),MBF (streng),MBF (strikt),,MBF (severa),MBF (estricto),,MBF (tiukka),,MBF (szigorú),MBF (rigoroso),MBF(厳密),마린의 절친한 친구 (엄격하게),MBF (streng),MBF (streng),MBF (ścisły),MBF (estritamente),MBF (estrito),,MBF (строгий),MBF (строг),MBF (strikt),MBF (katı), -MBF21,OPTVAL_MBF21,,,,,,,,,,,,,,,,,,,,,,,,,,, -MBF21 (strict),OPTVAL_MBF21STRICT,,,,MBF21 (striktní),MBF21 (streng),MBF21 (strikt),,MBF21 (severa),MBF21 (estricto),,MBF21 (tiukka),,MBF21 (szigorú),MBF21 (rigoroso),MBF21(厳密),MBF21 (엄격하게),MBF21 (streng),MBF21 (streng),MBF21 (ścisły),MBF21 (estritamente),MBF21 (estrito),,MBF21 (строгий),MBF21 (строг),MBF21 (strikt),MBF21 (katı), -ZDoom 2.0.63,OPTVAL_ZDOOM2063,,,,,,,,,,,,,,,,Z둠 2.0.63,,,,,,,,,,, -All unacknowledged,OPTVAL_ALLUNACKNOWLEDGED,,,,Všechny nepotrvzené,Alle ubekræftede,Alle unbestätigten,,Ĉiuj neagnoskitaj,Todos no reconocidos,,Kaikki kuittaamattomat,Tout non-acknowledged,Minden visszaigazolatlan,Tutti non riconosciuti,未確認全て,모두 미확인함,Allemaal onbekend,Alle ubekreftet,Wszystkie niepotwierdzone,Todos não-reconhecidos,,Toate necunoscute,Всё неопознанное,Све неусвојено,Alla obeaktade,Tüm onaylanmamış, -Errors,OPTVAL_ERRORS,,,,Chyby,Fejl,Fehler,,Eraroj,Errores,,Virheet,Erreurs,Hibák,Errori,エラー,에러,Fouten,Feil,Błędy,Erros,,Erori,Ошибки,Грешка,Fel,Hatalar, -Warnings,OPTVAL_WARNINGS,,,,Varování,Advarsler,Warnungen,,Avertoj,Advertencias,,Varoitukset,Avertissements,Figyelmeztetések,Avvisi,警告,경고,Waarschuwingen,Advarsler,Ostrzeżenia,Avisos,,Atenționări,Предупреждения,Упозорење,Varningar,Uyarılar, -Notifications,OPTVAL_NOTIFICATIONS,,,,Oznámení,Meddelelser,Benachrichtigungen,,Sciigoj,Notificaciones,,Ilmoitukset,,Üzenetek,Notifiche,通知,알림,Kennisgevingen,Varsler,Powiadomienia,Notificações,,Notificări,Уведомления,Обавештење,Meddelanden,Bildirimler, -Everything,OPTVAL_EVERYTHING,,,,Všechno,Alt,Alles,,Ĉio,Todo,,Kaikki,Tout,Minden,Tutti,全て,전체,Alles,Alt,Wszystko,Tudo,,Tot,Всё,Све,Allt,Her şey, -Hardware accelerated,OPTVAL_HWPOLY,,,,Hardwarová akcelerace,Hardware accelereret,Hardwarebeschleunigt,,Aparatara plirapidigo,Acelerado por «hardware»,,Laitteistokiihdytetty,Accéléré par Hardware,Hardveres gyorsítás,Accelerazione Hardware,ハードウェア アクセラレート,오픈지엘 가속,Hardware versneld,Maskinvareakselerert,Napędzane sprzętowo,Acelerado por hardware,,Accelerat Hardware,Аппаратный,Харвер убрзан,Hårdvara påskyndad,Hızlandırılmış donanım, -Doom Software Renderer,OPTVAL_SWDOOM,,,,Doom softwarový renderer,,,,Programar-bildigilo de Doom,Renderizado por «software» de Doom,,Doomin ohjelmistohahmonnin,Rendu Software Doom,Doom szoftveres renderer,Rendering DOOM software,Doom ソフトウェアレンダー,둠 소프트웨어 렌더러,,,Renderer Oprogramowania Dooma,Renderizador Software do Doom,,Software,Doom-программный,Doom софтверски рендерер,Doom Mjukvarurenderare,Doom Yazılım Oluşturucu, -True Color SW Renderer,OPTVAL_SWDOOMTC,,,,True color softwarový renderer,,,,Programar-bildigilo kun plenkoloro,Renderizado Truecolor (color verdadero) del «software»,,True Color -ohjelmistohahmonnin,Rendu Software Couleurs Réeles,,Rendering software a pieni colori,トゥルーカラー SWレンダー,트루 컬러 소프트웨어 렌더러,,,Renderer True Color,Renderizador Software True Color,,Software Color Complet,Полноцветный програмный,SW рендерер праве боје,True Color Mjukvarurenderare,Gerçek Renk SW Oluşturucu, -High-Performance,OPTVAL_DEDICATED,,,,Vysoký výkon,Højtydende,Volle Leistung,,Alta rendimento,Alto rendimiento,,Korkea suorituskyky,Hautes Performances,Nagy teljesítmény,Prestazioni massime,ハイパフォーマンス,고 성능,Hoogwaardige prestaties,Høy ytelse,Wysoka Wydajność,Alta-Performance,,De înaltă performanță,Высокая производительность,Високо-перформанси,Högpresterande,Yüksek Performans, -Power-Saving,OPTVAL_INTEGRATED,,,,Nízká spotřeba,Strømbesparende,energiesparend,,Energikonservo,Ahorro de energía,,Virransäästö,Economie d'Energie,Energia takarékos,Risparmio energetico,パワーセービング,저전력,Energiebesparing,Strømsparende,Oszczędzanie Energii,Economia de Energia,,Economie de energie,Энергосбережение,Енергетско-штедљиви,Energibesparande,Güç Tasarrufu, -Vanilla,OPTVAL_VANILLA,,,,Původní,,,,Originala ludversio,,,Alkuperäinen,,Hagyományos,,バニラ,바닐라,,,Czysty,,,Original,Изначальный,Ванила,,Vanilya, -ZDoom (Forced),OPTVAL_VTFZDOOM,,,,ZDoom (vynucený),ZDoom (tvunget),ZDoom (erzwungen),,ZDoom (devigita),ZDoom (forzado),,ZDoom (pakotettu),ZDoom (Forcé),ZDoom (erőltetett),ZDoom (forzato),ZDoom(強制),ZDoom (강제 설정),ZDoom (Gedwongen),ZDoom (Tvunget),ZDoom (Wymuszony),ZDoom (Forçar),,ZDoom (Forțat),ZDoom (принудительно),ZDoom (присиљен),ZDoom (tvingad),ZDoom (Zorla), -Vanilla (Forced),OPTVAL_VTFVANILLA,,,,Původní (vynucený),Vanilla (tvungen),Vanilla (erzwungen),,Originala ludversio (devigita),Vanilla (forzado),,Perus (pakotettu),Vanilla (Forcé),Hagyományos (erőltettt),Vanilla (forzato),バニラ(強制),바닐라 (강제 설정),Vanilla (Gedwongen),Vanilla (Tvunget),Czysty (Wymuszony),Vanilla (Forçar),DOS Original (Forçar),Original (Forțat),Изначальный (принудительно),Ванила (присиљен),Vanilla (tvingad),Vanilya (Zorlanmış), -Auto (ZDoom Preferred),OPTVAL_VTAZDOOM,,,,Auto (preferován ZDoom),Auto (ZDoom foretrukket),Auto (ZDoom bevorzugt),,Aŭtomata (preferata de ZDoom),Automático (preferido por ZDoom),,Automaattinen (ZDoomia suosiva),Auto (ZDoom Préféré),Automata (ZDoom preferált),Automatico (ZDoom preferito),自動(ZDoom優先),자동 (ZDoom 기본 설정),Auto (bij voorkeur ZDoom),Auto (ZDoom foretrukket),Automatyczny (Preferowany ZDoom),Automático (De preferência ZDoom),,Auto (ZDoom preferat),Автоматически (предпочитать ZDoom),Аутоматски (ZDoom преферијални),Auto (ZDoom föredraget),Otomatik (ZDoom Tercih Edilir), -Auto (Vanilla Preferred),OPTVAL_VTAVANILLA,,,,Auto (preferován původní),Auto (Vanilla foretrukket),Auto (Vanilla bevorzugt),,Aŭtomata (preferata de la originala),Automático (preferido por Vanilla),,Automaattinen (alkuperäistä suosiva),Auto (Vanilla Préféré),Automata (Hagyományos preferált),Automatico (Vanilla preferito),自動(バニラ優先),자동 (바닐라 기본 설정),Auto (bij voorkeur Vanilla),Auto (Vanilla foretrukket),Automatyczny (Preferowany czysty),Automático (De preferência Vanilla),Automático (De preferência DOS Original),Auto (Original preferat),Автоматически (предпочитать изначальный),Аутоматски (ванила преферијални),Auto (Vanilla föredraget),Otomatik (Vanilya Tercihli), -Small,OPTVAL_SMALL,,,,Malé,Lille,Klein,,Malgranda,Pequeño,,Pieni,Petit,Kicsi,Piccolo,小,작게,Klein,Liten,Mały,Pequeno,,Mic,Мелкий,Мало,Liten,Küçük, -Large,OPTVAL_LARGE,,,,Velké,Stor,Groß,,Granda,Grande,,Suuri,Grand,Nagy,Grande,大,크게,Groot,Stor,Duży,Grande,,Mare,Крупный,Велико,Stor,Büyük, -Console,OPTVAL_CONSOLE,,,,Konzole,Konsol,Konsole,,Konzolo,Consola,,Konsoli,,Konzol,,コンソール,콘솔,,Konsoll,Konsola,,Consola,Consolă,Консольный,Конзола,Konsol,Konsol, -\caBrick,C_BRICK,,,,\caCihlová,\caMursten,\caZiegelrot,,\caBrikkolora,\caLadrillo,,\catiili,\cabrique,\catéglavörös,\camattone,\ca丹,\ca주홍색,\casteenrood,\caMurstein,\cacegła,\catijolo,,\caCărămiziu,\caКирпичный,\caБоја цигле,\caTegelsten,\caTuğla, -\cbTan,C_TAN,,,,\cbSvětle hnědá,,\cbHellbraun,,\cbTankolora,\cbBeis,\cbBeige,\cbkeltaruskea,\cbbeige,\cbbézs,\cbabbronzatura,\cb香,\cb상아색,\cblichtbruin,\cbBrun,\cbjasnobrązowy,\cbbege,,\caBronz,\cbБежевый,\cbБеж,,, -\ccGray,C_GRAY,,,\ccgrey,\ccŠedá,\ccGrå,\ccGrau,,\ccGriza,\ccGris,,\ccharmaa,\ccgris,\ccszürke,\ccgrigio,\cc灰,\cc회색,\ccgrijs,\ccGrå,\ccszary,\cccinza,,\ccGri,\ccСерый,\ccСива,\ccGrå,\ccGri, -\cdGreen,C_GREEN,,,,\cdZelená,\cdGrøn,\cdGrün,,\cdVerda,\cdVerde,,\cdvihreä,\cdvert,\cdzöld,\cdverde,\cd緑,\cd녹색,\cdgroen,\cdGrønn,\cdzielony,\cdverde,,\cdVerde,\cdЗелёный,\cdЗелена,\cdGrön,\cdYeşil, -\ceBrown,C_BROWN,,,,\ceHnědá,\ceBrun,\ceBraun,,\ceBruna,\ceMarrón,\ceMarrón/Café,\ceruskea,\cebrun,\cebarna,\cemarrone,\ce茶,\ce갈색,\cebruin,\ceBrun,\cebrązowy,\cemarrom,,\ceMaro,\ceКоричневый,\ceСмеђа,\ceBrun,\ceKahverengi, -\cfGold,C_GOLD,,,,\cfZlatá,\cfGuld,,,\cfOrkolora,\cfDorado,,\cfkulta,\cfor,\cfarany,\cforo,\cf金,\cf금색,\cfgoud,\cfGull,\cfzłoty,\cfdourado,,\cfAuriu,\cfЗолотой,\cfЗлатна,\cfGuld,\cfAltın, -\cgRed,C_RED,,,,\cgČervená,\cgRød,\cGrot,,\cfRuĝa,\cgRojo,,\cgpunainen,\cgrouge,\cgvörös,\cgrosso,\cg赤,\cg적색,\cgrood,\cgRød,\cgczerwony,\cgvermelho,,\gRoșu,\cgКрасный,\cgЦрвена,\cgRöd,\cgKırmızı, -\chBlue,C_BLUE,,,,\chModrá,\chBlå,\chBlau,,\chBlua,\chAzul,,\chsininen,\chbleu,\chkék,\chblu,\ch青,\ch청색,\chblauw,\chBlå,\chniebieski,\chazul,,\chAlbastru,\chСиний,\chПлава,\chBlå,\chMavi, -\ciOrange,C_ORANGE,,,,\ciOranžová,,,,\ciOranĝkolora,\ciNaranja,,\cioranssi,\ciorange,\cinarancs,\ciarancione,\ci橙,\ci주황색,\cioranje,\ciOransje,\cipomarańczowy,\cilaranja,,\ciPortocaliu,\ciОранжевый,\ciНаранџаста,,\ciTuruncu, -\cjWhite,C_WHITE,,,,\cjBílá,\cjHvid,\cjWeiß,,\cjBlanka,\cjBlanco,,\cjvalkoinen,\cjblanc,\cjfehér,\cjbianco,\cj白,\cj흰색,\cjwit,\cjHvit,\cjbiały,\cjbranco,,\cjAlb,\cjБелый,\cjБела,\cjVit,\cjBeyaz, -\ckYellow,C_YELLOW,,,,\ckŽlutá,\ckGul,\ckGelb,,\ckFlava,\ckAmarillo,,\ckkeltainen,\ckjaune,\cksárga,\ckgiallo,\ck黄,\ck노란색,\ckgeel,\ckGul,\ckżółty,\ckamarelo,,\ckGalben,\ckЖёлтый,\ckЖута,\ckGul,\ckSarı, -\clDefault,C_DEFAULT,,,,\clVýchozí,\clStandard,\clStandard,,\clDefaŭlta,\clPor defecto,,\cloletus,\cldéfaut,\clalap,\cldefault,\cl初期,\cl기본 색,\clstandaard,\clStandard,\cldomyślny,\clpadrão,,\clImplicită,\clПо умолчанию,\clУобичајена,\clStandard,\clVarsayılan, -\cmBlack,C_BLACK,,,,\cmČerná,\cmSort,\cmSchwarz,,\cmNigra,\cmNegro,,\cmmusta,\cmnoir,\cmfekete,\cmnero,\cm黒,\cm검은색,\cmzwart,\cmSvart,\cmczarny,\cmpreto,,\cmNegru,\cmЧёрный,\cmЦрна,\cmSvart,\cmSiyah, -\cnLight blue,C_LIGHTBLUE,,,,\cnSvětle modrá,\cnLyseblå,\cnHellblau,,\cnHelblua,\cnAzul claro,,\cnvaaleansininen,\cnbleu clair,\cnvilágoskék,\cnblu chiaro,\cn空,\cn하늘색,\cnlicht blauw,\cnLyseblå,\cnjasnoniebieski,\cnazul claro,,\cnAlbastru deschis,\cnГолубой,\cnСветло плава,\cnLjusblått,\cnAçık mavi, -\coCream,C_CREAM,,,,\coKrémová,\coCreme,\coCremefarben,,\coKremkolora,\coCrema,,\cokerma,\cocrème,\cokrémszínű,\cocrema,\co肉,\co살구색,\cocrème,\coKremfarget,\cokremowy,\cocreme,,\coCrem,\coКремовый,\coКрем,\coGrädde,\coKrem, -\cpOlive,C_OLIVE,,,,\cpOlivová,\cpOliven,\cpOliv,,\cpOlivkolora,\cpOliva,,\cpoliivi,\cpolive,\cpolíva,\cpoliva,\cp泥,\cp녹갈색,\cpolijf,\cpOliven,\cpoliwkowy,\cpoliva,,\cpMăsliniu,\cpОливковый,\cpМаслинаста,\cpOliv,\cpZeytin, -\cqDark green,C_DARKGREEN,,,,\cqTmavě zelená,\cqMørkegrøn,\cqDunkelgrün,,\cqMalhelverda,\cqVerde oscuro,,\cqtummanvihreä,\cqvert sombre,\cqsötétzöld,\cqverde scuro,\cq深,\cq암녹색,\cqdonkergroen,\cqMørkegrøn,\cqciemnozielony,\cqverde escuro,,\cqVerde închis,\cqТёмно-зелёный,\cqТамно зелена,\cqMörkgrön,\cqKoyu yeşil, -\crDark red,C_DARKRED,,,,\crTmavě červená,\crMørkerød,\crDunkelrot,,\crMalhelruĝa,\crRojo oscuro,,\crtummanpunainen,\crrouge sombre,\crsötétvörös,\crrosso scuro,\cr朱,\cr암적색,\crdonkerrood,\crMørkerød,\crciemnoczerwony,\crvermelho escuro,,\crRoșu închis,\crТёмно-красный,\crБордо,\crMörkröd,\crKoyu kırmızı, -\csDark brown,C_DARKBROWN,,,,\csTmavě hnědá,\csMørkebrun,\csDunkelbraun,,\csMalhelbruna,\csMarrón oscuro,\csMarrón/Café oscuro,\cstummanruskea,\csbrun sombre,\cssötétbarna,\csmarrone scuro,\cs焦,\cs암갈색,\csdonkerbruin,\csMørkebrun,\csciemnobrązowy,\csmarrom escuro,,\csMaro închis,\csТёмно-коричневый,\csБраон,\csMörkbrun,\csKoyu kahverengi, -\ctPurple,C_PURPLE,,,,\ctFialová,\ctLilla,\ctLila,,\ctPurpura,\ctMorado,,\ctpurppura,\ctviolet,\ctlila,\ctviola,\ct紫,\ct보라색,\ctpaars,\ctLilla,\ctfioletowy,\ctroxo,,\ctMov,\ctФиолетовый,\ctЉубичаста,\ctLila,\ctMor, -\cuDark gray,C_DARKGRAY,,,\cudark grey,\cuTmavě šedá,\cuMørkegrå,\cuDunkelgrau,,\cuMalhelgriza,\cuGris oscuro,,\cutummanharmaa,\cugris sombre,\cusötétszürke,\cugrigio scuro,\cu鉛,\cu치색,\cudonkergrijs,\cuMørkegrå,\cuciemnoszary,\cucinza escuro,,\cuGri închis,\cuТёмно-серый,\cuТамно сива,\cuMörkgrå,\cuKoyu gri, -\cvCyan,C_CYAN,,,,\cvAzurová,,\cvTürkis,,\cvCejana,\cvCian,,\cvsinivihreä,\cvcyan,\cvcián,\cvciano,\cv天,\cv청록색,\cvcyan,,\cvbłękitny,\cvciano,,\cvTurcoaz,\cvСине-зелёный,\cvЦијан,,, -\cwIce,C_ICE,,,,\cwLed,\cwIs,\cwEis,,\cwGlacikolora,\cwHielo,,\cwjää,\cwglace,\cwjég,\cwghiaccio,\cw氷,\cw구색,\cwice,\cwIs,\cwlód,\cwgelo,,\cwGheață,\cwЛедяной,\cwЛед,\cwIs,\cwBuz, -\cxFire,C_FIRE,,,,\cxOheň,\cxIld,\cxFeuer,,\cxFajrkolora,\cxFuego,,\cxtuli,\cxfeu,\cxtűz,\cxfuoco,\cx炎,\cx자황색,\cxvuur,\cxIld,\cxogień,\cxfogo,,\cxFoc,\cxОгненный,\cxВатрена,\cxEld,\cxYangın, -\cySapphire,C_SAPPHIRE,,,,\cySafírová,\cySafir,\cySaphirblau,,\cySafirkolora,\cyZafiro,,\cysafiiri,\cysaphir,\cyzafír,\cyzaffiro,\cy藍,\cy벽청색,\cysaffier,\cySafir,\cyszafirowy,\cysafira,,\cySafir,\cyСапфировый,\cyТамно плава,\cySafir,\cySafir, -\czTeal,C_TEAL,,,,\czModrozelená,\czKrikand,\czBlaugrün,,\czBluverda,\czTurquesa,,\cztummansinivihreä,\czturquoise,\cztürkiz,\czverde acqua,\cz碧,\cz암청록색,\czteal,\czBlågrønn,\czmorski,\czturquesa,,\czMare,\czМорской,\czТиркизна,,\czDeniz mavisi, -Heretic,OPTSTR_HERETIC,,,,,,,,,,,,,,,,헤러틱 커서,,,,,,,,,,, -Chex,OPTSTR_CHEX,,,,,,,,,,,,,,,,첵스 커서,,,,,,,,,,, -No Sound,OPTSTR_NOSOUND,,,,Bez zvuku,Ingen lyd,Kein Sound,,Neniu sono,Sin sonido,,Ei ääntä,Pas de son,Hang nélkül,Nessun suono,サウンドなし,음향 없음,Geen geluid,Ingen lyd,Brak dźwięku,Sem som,,Fără Sunet,Без звука,Без-звучни,Inget ljud,Ses Yok, -No interpolation,OPTSTR_NOINTERPOLATION,,,,Bez interpolace,Ingen interpolation,Keine Interpolation,,Neniu interpolado,Sin interpolación,,Ei interpolaatiota,Pas d'interpolation,Nincs interoláció,No interpolazione,補間無し,보간 없음,Geen interpolatie,Ingen interpolasjon,Brak interpolacji,Sem interpolação,,Fără interpolare,Без сглаживания,Нема уметања,Ingen interpolering,Enterpolasyon yok, -Spline,OPTSTR_SPLINE,,,,Křivka,,,,Splajno,,,Splini,,,,スプライン,스플라인,,,,,,,Сплайн,Сплајн,,, -OpenAL,OPTSTR_OPENAL,,,,,,,,,,,,,,,,오픈에이엘,,,,,,,,,,, -Hardware Renderer,DSPLYMNU_GLOPT,,,,Hardwarový renderer,,,,Aparatara bildigilo,Renderizado por «hardware»,,Laitteistohahmonnin,Moteur de Rendu Hardware,Hardver Render,Rendering Hardware,ハードウェア レンダラー,오픈지엘 렌더러,,,Renderer Sprzętowy,Renderizador Hardware,,Setări Mod OpenGL,Обработка с OpenGL,Хардвер рендерер,Hårdvaru-renderare,Donanım Oluşturucu, -Software Renderer,DSPLYMNU_SWOPT,,,,Softwarový renderer,,,,Programara bildigilo,Renderizado por «software»,,Ohjelmistohahmonnin,Moteur de Rendu Software,Szoftver Render,Rendering Software,ソフトウェア レンダラー,소프트웨어 렌더러,,,Renderer Oprogramowania,Renderizador Software,,Setări Mod Software,Программная обработка,Софтвер рендерер,Mjukvarurenderare,Yazılım Oluşturucu, -Hardware Rendering Options,GLMNU_TITLE,,,,Nastavení hardwarového rendereru,Indstillinger for hardware-rendering,Hardware-Renderer Optionen,,Agordoj de OpenGL (aparatara bildigilo),Opciones de OpenGL,,Laitteistohahmonnusasetukset,Options OpenGL,Hardver Renderelő Beállítások,Opzioni OpenGL,ハードウェアレンダリング オプション,오픈지엘 설정,Hardware Rendering Opties,Alternativer for maskinvaregjengivelse,Opcje Renderowania Sprzętowego,Opções de Renderização por Hardware,,Setări Redare OpenGL,Настройки OpenGL,Опција хардвер рендера,Alternativ för maskinvarurendering,Donanım Oluşturma Seçenekleri, -Dynamic Light Options,GLMNU_DYNLIGHT,,,,Nastavení dynamických světel,Indstillinger for dynamisk lys,Dynamisches-Licht-Optionen,,Agordoj de dinamikaj lumoj,Opciones de luz dinámica,,Dynaamisen valon asetukset,Options Lumières Dynamiques,Dinamikus Fény Beállítások,Opzioni Luci Dinamiche,ダイナミックライト オプション,광원 설정,Dynamische Licht Opties,Alternativer for dynamisk lys,Opcje Dynamicznego Oświetlenia,Opções de Luz Dinâmica,,Setări Lumini Dinamice,Динамическое освещение,Подешавања динамичког осветљења,Alternativ för dynamiskt ljus,Dinamik Işık Seçenekleri, -Preferences,GLMNU_PREFS,,,,Možnosti,Præferencer,Einstellungen,,Preferoj,Preferencias,,Asetukset,Préférences,Preferenciák,Preferenze,環境設定,성능,Voorkeuren,Innstillinger,Preferencje,Preferências,,Preferințe,Настройки,Преференција,Inställningar,Tercihler, -Trim sprite edges,GLTEXMNU_TRIMSPREDGE,,,,Oříznout okraje spritů,Trimme sprite-kanter,Leerraum in Sprites wegschneiden,,Ĉirkaŭtranĉi randojn de mov-rastrumoj,Recortar líneas de «sprite»,,Siisti spritejen reunat,Nettoyer le bord des sprites,Sprite szél igazítása,Taglia gli spigoli agli sprite,スプライトの角を取る,스프라이트 모서리 다듬기,,Trim sprite kanter,Przycinanie krawędzi sprite'ów,Cortar bordas de sprites,,Tundere margini sprite-uri,Обрезание краёв спрайтов,Подсећи ивице спрајтова,Trimma sprite-kanter,Sprite kenarlarını kırpma, -Sort draw lists by texture,GLTEXMNU_SORTDRAWLIST,,,,Seřadit vykreslování podle textury,Sortere tegningslister efter tekstur,Renderlisten nach Textur sortieren,,Ordigi desegnado-listojn laŭ teksturo,Ordenar tablas por textura,,Lajittele piirtotaulut pintakuvioinneittain,Ordonner liste de rendu par texture,Textúra szerinti kirajzolási lista,Ordina la lista draw per texture,テクスチャーから描画リストを分類,텍스처별로 생성 목록 정렬,Tekeninglijsten sorteren op textuur,Sorter tegningslister etter tekstur,Sortowanie list renderowania wdług tekstur,Organizar listas de renderização por textura,,Sortează listele de texturi,Сортировать списки текстур,Сортирано цртај листе од текстуре,Sortera ritningslistor efter textur,Çizim listelerini dokuya göre sıralama, -Dynamic Lights,GLLIGHTMNU_TITLE,,,,Dynamická světla,Dynamisk lys,Dynamische Lichter,,Dinamikaj lumoj,Luces dinámicas,,Dynaamiset valot,Lumières Dynamiques,Dinamikus Fények,Luci Dinamiche,ダイナミックライト,다이나믹 라이트,Dynamische verlichting,Dynamiske lys,Dynamiczne Oświetlenie,Luzes Dinâmicas,,Lumini Dinamice,Динамическое освещение,Динамичко осветљење,Dynamiska lampor,Dinamik Işıklar, -Dynamic Lights (Hardware),GLLIGHTMNU_LIGHTSENABLED,,,,Dynamická světla (hardware),Dynamisk lys (hardware),Dynamische Lichter (Hardware),,Dinamikaj lumoj (Aparataro),Luces dinámicas (Hardware),,Dynaamiset valot (laitteistokiihdytys),Lumières Dynamiques (Hardware),Dinamikus Fények (hardveres),Luci Dinamiche (Hardware),ダイナミックライト(OpenGL),다이나믹 라이트(오픈지엘),Dynamische verlichting (hardware),Dynamiske lys (maskinvare),Dynamiczne Oświetlenie (Sprzętowe),Luzes Dinâmicas (Hardware),,Lumini Dinamice (OpenGL),Динамическое освещение (аппаратное),Динамичко осветљење (хардвер),Dynamiska lampor (maskinvara),Dinamik Işıklar (Donanım), -Enable light definitions,GLLIGHTMNU_LIGHTDEFS,,,,Povolit definice světel,Aktiver lysdefinitioner,Lichtdefinitionen an,,Ŝalti lumdifinojn,Activar definiciones de luz,,Ota käyttöön valomääritykset,Activer les définitions de lumière,Fény részletesség,Abilita le definizioni GLDEFS,ライト定義 許可,조명 선명도 사용,Lichtdefinities mogelijk maken,Aktiver lysdefinisjoner,Włącz definicje światła,Habilitar definições de luz,Permitir definições de luz,Activează definiții lumini,Включить определения света,Омогући светлосне дефиниције,Aktivera ljusdefinitioner,Işık tanımlarını etkinleştirin, -Lights affect sprites,GLLIGHTMNU_LIGHTSPRITES,,,,Světla ovlivňují sprity,Lys påvirker sprites,Sprites werden beleuchtet,,Lumoj efikas mov-rastrumojn,Las luces afectan a los «sprites»,,Valot vaikuttavat spriteihin,Lumières affectent les sprites,A fény hatással van a sprite-okra,Le luci influiscono sugli sprite,ライトがスプライトに影響,조명에 영향받는 스프라이트,Lichten beïnvloeden sprites,Lys påvirker sprites,Światło ma wpływ na sprite'y,Luzes afetam sprites,,Luminile afectează sprite-urile,Освещать спрайты,Светло утиче на спрајтове,Ljus påverkar sprites,Işıklar sprite'ları etkiler, -Lights affect particles,GLLIGHTMNU_LIGHTPARTICLES,,,,Světla ovlivňují částice,Lys påvirker partikler,Partikel werden beleuchtet,,Lumoj efikas partiklojn,Las luces afectan a las partículas,,Valot vaikuttavat hiukkasiin,Lumières affectent les particules,A fény hatással van a részecskékre,Le luci influiscono sulle particelle,ライトがパーティクルに影響,조명에 영향받는 입자들,Lichten beïnvloeden deeltjes,Lys påvirker partikler,Światło ma wpływ na cząsteczki,Luzes afetam partículas,,Luminile afectează particulele,Освещать частицы,Светло утиче на честице,Ljus påverkar partiklar,Işıklar parçacıkları etkiler, -Light shadowmaps,GLLIGHTMNU_LIGHTSHADOWMAP,,,,Mapy stínů,Lys skyggemapper,Shadowmaps für Lichter,,Lum-ombro-mapoj,Mapeo de sombra de luz,,Valojen varjokartat,Shadowmaps,,Ombre proiettate,ライトのシャドウマッピング,조명에 영향받는 섀도우맵,Lichte schaduwkaarten,Lys skyggekart,Oświetlenie map cieni,Shadowmaps,,Umbre lumini,Карты светотеней,Светло мапе сенки,Ljusskuggor,Işık gölge haritaları, -Shadowmap quality,GLLIGHTMNU_LIGHTSHADOWMAPQUALITY,,,,Kvalita map stínů,Shadowmap-kvalitet,Shadowmap Qualität,,Kvalito de ombro-mapo,Calidad de mapeo de sombras,,Varjokarttojen laatu,Qualité Shadowmap,Shadowmap minőség,Qualità ombre proiettate,シャドウマップ 品質,섀도우맵 퀄리티,Schaduwkaart kwaliteit,Shadowmap-kvalitet,Jakość map cieni,Qualidade de shadowmap,,Calitate umbre,Качество карт светотеней,Мапа сенки квалитет,Skuggmappens kvalitet,Gölge haritası kalitesi, -Shadowmap filter,GLLIGHTMNU_LIGHTSHADOWMAPFILTER,,,,Filtrování map stínů,Skyggemap-filter,Shadowmap Filter,,Filtro de ombro-mapo,Filtro de mapeo de sombras,,Varjokarttojen suodatus,Filtre de Shadowmaps,,Filtro ombre proiettate,シャドウマップ フィルター,섀도우맵 필터,Schaduwkaart filter,Shadowmap-filter,Filtr map cieni,Filtro de shadowmap,,Filtru umbre,Фильтр карт светотеней,Мапа сенки филтер,Filter för skuggmappor,Gölge haritası filtresi, -Fog mode,GLPREFMNU_FOGMODE,,,,Režim mlhy,Tågetilstand,Nebelmodus,,Reĝimo de nebulo,Modo de niebla,,Sumutila,Mode du broullard,Köd mód,Modalità nebbia,フォグモード,안개 모드,Mistmodus,Tåke-modus,Tryb mgły,Modo de neblina,,Mod ceață,Режим тумана,Магла мод,Dimläget,Sis modu, -Fog forces fullbright,GLPREFMNU_FOGFORCEFULLBRIGHT,,,,Mlha vynucuje plný jas,Tåge tvinger fullbright,Nebel erzwingt volle Helligkeit,,Nebulo devigas plenbrilon,Forzar brillo completo en niebla,,Sumu pakottaa täyskirkkauden,Brouillard force fullbright,Köd Fullbright-ot erőltet ki,La nebbia forza piena luce,濃霧は明るさ最大,안개를 최대한 강제로 밝힘,Mistkrachten volle lichtsterkte,Tåke styrker fullbright,Mgła wymusza pełną jasność,Neblina força brilho máximo,,Ceața forțează luminozitate maximă,Туман включает режим максимальной яркости,Магла присиљава пуну светлост,Dimma tvingar fram full ljusstyrka,Sis fullbright'ı zorlar, -Weapon light strength,GLPREFMNU_WPNLIGHTSTR,,,,Intenzita světel zbraní,Våbenlysstyrke,Waffenlichtstärke,,Lumforteco de armilo,Intensidad de luz de las armas,,Aseiden valovoima,Intensité lumineuse des armes,Fegyver lövés fényerősség,Intensità luminosa dell'arma,武器ライトの強さ,무기 빛 강도,Sterkte van het wapenlicht,Våpen lysstyrke,Natężenie światła broni,Intensidade de luz da arma,,Intensitate lumină armă,Интенсивность вспышек оружия,Блага снага оружја,Vapenljusets styrka,Silah ışık gücü, -Environment map on mirrors,GLPREFMNU_ENVIRONMENTMAPMIRROR,,,,Mapa prostředí na zrcadlech,Miljøkort på spejle,Lichteffekt auf Spiegeln,,Medimapo sur speguloj,Mapa de entorno en espejos,,Ympäristökartta peileissä,Mappage environment sur les miroirs,Környezeti mappolás a tükrökön,Ambiente mappa sui riflessi,マップオンミラーの画像表示,거울 주변의지도 활성,Milieukaart op spiegels,Omgivelseskart på speil,Mapa środowiska w lustrach,Mapa de ambiente em espelhos,,Reflecții pe oglinzi,Карта окружения на зеркалах,Околинска мапа на прозорима,Miljökarta på speglar,Aynalar üzerinde çevre haritası, -Enhanced night vision mode,GLPREFMNU_ENV,,,,Vylepšený režim nočního vidění,Forbedret nattesynstilstand,Verbesserter Nachtsichtmodus,,Plibonigita reĝimo de noktvido,Modo de visión nocturna mejorado,,Paranneltu pimeänäkötila,Mode de vision nocture amélioré,Felerősített éjjellátó mód,Modalità visione notturna migliorata,バイザーを暗視装置調にする,야시경 효과 향상,Verbeterde nachtzicht modus,Forbedret nattsynsmodus,Ulepszony tryb widzenia w ciemności,Modo de visão noturna avançada,,Vedere infraroșie avansată,Улучшенный режим ночного видения,Побољшана ноћна визија мод,Förbättrat läge för mörkerseende,Geliştirilmiş gece görüş modu, -ENV shows stealth monsters,GLPREFMNU_ENVSTEALTH,,,,Vylepšené noční vidění ukazuje skryté příšery,ENV viser stealth-monstre,Nachtsichtmodus zeigt Stealth-Monster,,ENV montras kaŝiĝitajn monstrojn,ENV muestra enemigos sigilosos,,PPN näyttää näkymättömät hirviöt,VNA affiche monstres invisibles,ENV felfedi a lopakodó szörnyeket,La VNM mostra i mostri stealth ,暗視バイザーが透明を見破る,스텔스 적 개체를 감지하는 ENV,ENV toont stealth monsters,ENV viser stealth monstre,Ulepszony noktowizor pokazuje ukrywających się przeciwników,Visão noturna mostra monstros invisíveis,,PNV afișează monștri ascunși,ПНВ показывает скрытых монстров,ПНВ показује скривена чудовишта,ENV visar smygande monster,ENV gizli canavarları gösteriyor, -Adjust sprite clipping,GLPREFMNU_SPRCLIP,,,,Vyladění clippingu spritů,Juster sprite clipping,Sprite Clipping,,Agordi trairadon de mov-rastrumoj,Ajustar recortado de sprites,,Spritejen asettelu,Adjusted le clipping des sprites,Sprite átlógás igazítása,Aggiusta il clipping degli sprite,スプライトのずらしを調整する,스프라이트 클리핑 조정,Sprite clipping,Juster sprite klipping,Ustaw wcięcie sprite'ów,Ajustar clipping de sprite,,Ajustare poziții sprite-uri,Режим обрезки спрайтов,Подеси спрајт клипинг,Justera sprite clipping,Sprite kırpmayı ayarlama, -Smooth sprite edges,GLPREFMNU_SPRBLEND,,,,Vyhladit okraje spritů,Udglatte sprite-kanter,Glätte Spritekanten,,Glatigi randojn de mov-rastrumoj,Suavizar bordes de sprites,,Pehmeät spritejen reunat,Adoucir bords des sprites,Sprite szélek simítása,Smussa gli angoli degli sprite,スプライトの角を丸める,부드러운 스프라이트 모서리,Gladde sprite randen,Glatte sprite kanter,Gładkie krawędzie sprite'ów,Suavizar bordas de sprites,,Netezire margini sprite-uri,Размытие краёв спрайтов,Углачати ивице спрајта,Slätar ut sprite-kanter,Düzgün sprite kenarları, -Fuzz Style,GLPREFMNU_FUZZSTYLE,,,,Styl šumu,Fuzz-stil,Fuzz Stil,,Stilo de Lenugo,Estilo de difuminación,,Sumennustyyli,Style de bruit blanc,Homályosítás stílusa,Stile fuzz,ファズスタイル,퍼즈 스타일,Fuzz stijl,Fuzz-stil,Styl Szumu,Estilo de difusão,,Stil sclipire,Тип шума,Фаз стајл,Fuzz stil,Fuzz Tarzı, -Sprite billboard,GLPREFMNU_SPRBILLBOARD,,,,Orientace spritů,,Spriteausrichtung,,Liniigi mov-rastrumojn,Alineado de sprites,,Spritetaulu,Etalage des sprites,Sprite alapú reklámtábla,,スプライト ビルボード,스프라이트 샘플링,,,Wyrównanie Sprite'ów,Alinhamento de sprite,,Rotire sprite-uri,Привязка по осям спрайтов,Спрајт билборд,,Sprite reklam panosu, -Sprites face camera,GLPREFMNU_SPRBILLFACECAMERA,,,,Sprity čelí kameře,Sprites vender mod kameraet,Sprites zur Kamera ausrichten,,Mov-rastrumoj ĉiam rigardas vian kameraon,Los sprites miran a la cámara,,Spritet suuntaavat kameraan,Sprites font face à la caméra,Sprite alapú kamera,Gli sprite sono rivolti alla telecamera.,スプライトのフェイスカメラ,카메라를 향한 스프라이트,Sprites gezicht camera,Sprites vender mot kameraet,Sprite'y skierowane w kamerę,Sprites de frente para a câmera,,Sprite-urile privesc înspre cameră,Спрайты направлены к камере,Спрајт камера фаце,Sprites vänder sig mot kameran,Sprite'lar kamerayla yüzleşir, -Particle style,GLPREFMNU_PARTICLESTYLE,,,,Styl částic,Partikelstil,Partikelstil,,Partikla stilo,Estilo de partículas,,Hiukkastyyli,Style de particules,Részecske stílusa,Stile particelle,パーティクル スタイル,입자 스타일,Deeltjes stijl,Partikkel-stil,Styl Cząsteczek,Tipo de partícula,,Stil particule,Тип частиц,Честице стајл,Partikelstil,Parçacık stili, -Rendering quality,GLPREFMNU_RENDERQUALITY,,,,Kvalita vykreslování,Renderingskvalitet,Renderqualität,,Kvalito de bildigado,Calidad de Renderizado,,Hahmonnuslaatu,Qualité du rendu,Renderelés minősége,Qualità resa grafica,レンダリング品質,렌더링 품질,Het teruggeven van kwaliteit,Renderingskvalitet,Jakość Renderowania,Qualidade de renderização,,Calitate video,Качество обработки,Квалитет рендовања,Renderingskvalitet,Render kalitesi, -Stereo 3D VR,GLPREFMNU_VRMODE,,,,,,,,Duvida 3D VR,Modo Stereo 3D VR,,,3D VR Stéréo,,,ステレオ3DのVR,VR 입체 스테레오 사용,,,,3D Estéreo (VR),,Mod VR,Стерео 3D VR-режим,Стереотоно 3D VR,,, -Enable Quad Stereo,GLPREFMNU_VRQUADSTEREO,,,,Povolit Quad Stereo,Aktiver Quad Stereo,Quad Stereo aktivieren,,Ŝalti Kvaroblo-Stereon,Activar Quad Stereo,,Ota käyttöön Quad Stereo,Activer Quad Stereo,Quad Sztereó bekapcsolása,Abilita il Quad Stereo,クァッドステレオを有効,쿼드 스테레오 사용,Quad Stereo inschakelen,Aktiver Quad Stereo,Włącz Poczwórne Stereo,Habilitar Quad Stereo,Permitir Quad Stereo,Activare Quad Stereo,Четырёхкратный стереорежим,Омогући четвороструки стерео,Aktivera Quad Stereo,Dörtlü Stereoyu Etkinleştir, -Banded SW Lightmode,GLPREFMNU_SWLMBANDED,,,,Režim pruhovaného SW osvětlení,Båndede SW-lystilstand,Gebänderter SW-Lichtmodus,,Reĝimo de Bendiga Lumo de Programbildigo,Modo de luz por bandas de SW,,Kaistoitettu ohjelmistoväritila,Lumière bandées en Software,,Lightmode software bandata,バンデドSWライトモード,단결된 SW 라이트 모드,SW-lichtmodus met banden,Båndet SW-lysmodus,Naznaczony Tryb Oświetlenia Oprogramowania,Modo de luz por bandas em software,,Mod limitat de iluminare Software,Программный режим освещения полосами,Повезани SW режим осветљења,SW Ljusläge i bandform,Bantlı SW Işık Modu, -Distance Between Your Eyes,GLPREFMNU_VRIPD,,,,Vzdálenost mezi očima,Afstand mellem øjnene,Abstand zwischen den Augen,,Distanco Inter Viaj Okuloj,Distancia entre tus ojos,,Silmiesi etäisyys toisistaan,Distance entre vos yeux,Szemek közötti távolság,Distranza tra i tuoi occhi,自分の目との距離,시야 간의 거리,Afstand tussen uw ogen,Avstand mellom øynene dine,Odległość Pomiędzy Twoimi Oczami,Distância entre os olhos,,Distanța dintre ochi,Расстояние между глазами,Даљина између твојих очију,Avstånd mellan ögonen,Gözleriniz Arasındaki Mesafe, -Distance From Your Screen,GLPREFMNU_VRSCREENDIST,,,,Vzdálenost od obrazovky,Afstand fra din skærm,Abstand vom Bildschirm,,Distanco De Via Ekrano,Distancia desde tu pantalla,,Etäisyys ruudullesi,Distance entre vous et l'écran,Képernyőtől mért távolság,Distanza dal tuo schermo,画面からの距離,화면과의 거리,Afstand van uw scherm,Avstand fra skjermen,Odległość Od Twojego Ekranu4,Distância a partir da tela,,Distanța față de ecranul tău,Расстояние от экрана,Даљина од окрена,Avstånd från skärmen,Ekranınızdan Uzaklık, -Smart,OPTVAL_SMART,,,,Chytré,,,,Inteligenta,Inteligente,,Älykäs,Intelligent,Okos,Intelligente,スマート,자동 조정,Slim,,Mądry,Inteligente,,Inteligent,Умный,Паметно,,Akıllı, -Smarter,OPTVAL_SMARTER,,,,Chytřejší,Smartere,,,Pli inteligenta,Más inteligente,,Älykkäämpi,+ Intelligent,Okosabb,Ancora più intelligente,よりスマート,고급 자동 조정,Slimmer,Smartere,Mądrzejszy,Mais inteligente,,Mai inteligent,Умнее,Паметније,Smartare,Daha Akıllı, -Infrared only,OPTVAL_INFRAREDONLY,,,,Pouze infračervené,Kun infrarødt,Nur Infrarot,,Nur transruĝa,Solo infrarrojo,,Vain infrapuna,Vis. Noct. Seulement,Csak az infravörösnél,Solo infrarossi,赤外線のみ,야시경만,Alleen infrarood,Kun infrarød,Tylko Podczerwień,Somente infravermelho,,Doar în infraroșu,Только инфракрасный,Само инфрацрвена,Endast infrarött ljus,Sadece kızılötesi, -Infrared and torch,OPTVAL_INFRAREDANDTORCH,,,,Infračervené a pochodeň,Infrarød og lommelygte,Infrarot und Fackel,,Transruĝa kaj torĉo,Infrarrojo y antorcha,,Vain infrapuna ja soihtu,Iis Noct. & Torche,Infravörös és fáklya,Infrarossi e torcia,赤外線と松明,야시경과 횃불만,Infrarood en fakkels,Infrarød og lommelykt,Tylko Podczerwień i Pochodnie,Infravermelho e tocha,,Infraroșu si torță,Инфракрасный и факел,Инфрацрвена/бакља,Infraröd och ficklampa,Kızılötesi ve fener, -Any fixed colormap,OPTVAL_ANYFIXEDCOLORMAP,,,Any fixed colourmap,Jakákoli fixní mapa barev,Alle lyseffekter,Alle Lichteffekte,,Iu ajn fiksita kolormapo,Cualquier mapa de color fijo,,Mikä tahansa kiinteä värikartta,N'importe quelle colormap,Bármely fixált colormap,Ogni colormap fissata,任意の固定カラーマップ,고정된 컬러맵만,Elke vaste colormap,Alle faste fargekart,Którekolwiek naprawione mapy kolorów,Qualquer colormap fixo,,Orice colormap,Любая заданная цветовая карта,Било која поправљена табела боја,Alla fasta färgkartor,Herhangi bir sabit renk haritası, -Use as palette,OPTVAL_USEASPALETTE,,,,Použít jako paletu,Brug som palet,Benutze als Palette,,Uzi kiel paletro,Usar como paleta,,Käytä palettina,Utiliser comme pallette,Palettaként használat,Utilizza come palette,パレットとして使用,팔레트로 적용,Gebruik als palet,Bruk som palett,"Użyj jako palety +Allow skipping of intermission scrollers,MISCMNU_INTERSCROLL,,,,Povolit přeskakování skrolujících obrázků,Tillad at springe over pausescrollere,Erlaube Überspringen von Intermission-Scrollern,,Permesi preterpason de intermitaj rulumoj,Permitir omisión de intermedios,,Salli vierivien väliruutujen ohittaminen,Sauter compteurs d'intermission,,Pályaközi szünetek átugorhatóak,Consenti di saltare gli scorrimenti delle intermissioni,クリア結果集計のスキップを許可,인터미션 스크롤러 생략 허용,Overslaan van intermissiescrollers toestaan,Tillat å hoppe over pauserullere,Pozwól na pominięcie przerywników,Pular telas de intervalo entre fases,Saltar ecrãs de intervalo entre níveis,Permite saltul peste inserările de text,Разрешение пропуска текстовых вставок,Дозволи прескакање прелаза са текстовима,Tillåt att hoppa över rullgardiner för pauslägen.,Ara kaydırıcıların atlanmasına izin ver, +Network Options,NETMNU_TITLE,,,,Nastavení sítě,Netværksindstillinger,Netzwerkeinstellungen,,Reta Agordoj,Opciones de Red,,Verkkoasetukset,Options Réseau,,Hálózati Beállítások,Opzioni network,ネットワーク オプション,네트워크 설정,Netwerkopties,Nettverksalternativer,Opcje Sieci,Opções de Rede,,Setări de Rețea,Настройки сети,Мрежна подешавања,Nätverksalternativ,Ağ Seçenekleri, +Local options,NETMNU_LOCALOPTIONS,,,,Lokální nastavení,Lokale indstillinger,Lokale Einstellungen,,Lokaj agordoj,Opciones locales,,Paikallisasetukset,Options Locales,,Helyi beállítások,Opzioni locali,ローカル オプション,로컬 설정,Lokale opties,Lokale alternativer,Opcje Lokalne,Opções locais,,Setări Locale,Локальные настройки,Локална подешавања,Lokala alternativ,Yerel seçenekler, +Movement prediction,NETMNU_MOVEPREDICTION,,,,Predikce pohybu,Forudsigelse af bevægelser,Bewegungsvorausberechnung,,Movprognozado,Predicción de Movimiento,,Liikkeen ennakoiminen,Prédiction de Mouvement,,Mozgás előrejelzés,Predizione movimenti,移動予測,움직임 예측도,Voorspelling van bewegingen,Forutsigelse av bevegelse,Przewidywanie Ruchu,Previsão de movimento,,Anticipare mișcare,Предсказание движения,Предвиђање покрета,Förutsägelse av rörelser,Hareket tahmini, +Predict line actions,NETMNU_LINESPECIALPREDICTION,,,,Predikce čárových akcí,Forudsige linjehandlinger,Berechne Linienaktionen voraus,,Prognozi linio-agojn,Predecir acciones de línea,,Ennakoi viivasuorat toiminnat,Prédiction des actions de ligne,,Előrejelzés vonal művelet,Predizione azioni di linea,line actionsを予測する,라인 움직임 감지,Voorspel lijnacties,Forutsi linjehandlinger,Przewidź akcje linii,Prever ações de linha,,Anticipează acționarea liniilor,Предсказание действий на уровне,Предвиђање линијске радње,Förutsägelse av linjeåtgärder,Hat eylemlerini tahmin edin, +Prediction Lerp Scale,NETMNU_PREDICTIONLERPSCALE,,,,Velikost interpolace predikce,Forudsigelse Lerp-skala,Vorberechnungs Lerp-Skalierung,,Skalo de Linia Lnterpolado,Escala de interp. lineal de predicción,,Lineaarisen interpolaatioennakoinnin skaalaus,Prédiction d'échelle LERP,,Előrejelzés LERP Arány,Scala Lerp predizione,リープスケール予測,러프 예측 강도,Voorspelling Lerp Scale,Prediksjon Lerp-skala,Przewidywanie Skali Lerp,Escala de previsão de LERP,,Anticipare scară lerp,Предсказание увеличения доп. задержки,Предвиђање лерп скале,Förutsägelse Lerp Scale,Tahmin Lerp Ölçeği, +Lerp Threshold,NETMNU_LERPTHRESHOLD,,,,Práh interpolace,Lerp-tærskel,Lerp-Schwellwert,,Limito de Linia Interpolado,Umbral de interp. lineal,,Interpolaatiokynnys,Limite LERP,,LERP küszöbérték,Soglia Lerp,リープしきい値,러프 계산,Lerp Threshold,Lerp-terskel,Próg Lerp,Limite de LERP,,Prag Lerp,Порог доп. задержки,Лерп праг,Lerp Tröskelvärde,Lerp Eşiği, +Host options,NETMNU_HOSTOPTIONS,,,,Nastavení hostitele,Værtsindstillinger,Gastoptionen,,Agordoj de Gastiganto,Opciones de Host,,Isäntäasetukset,Options Hôte,,Host beállítások,Opzioni ospitante,ホスト オプション,호스트 설정,Verhuurders opties,Vertsalternativer,Opcje hosta,Opções de host,,Setări gazdă,Настройки сервера,Подешавања домаћина,Alternativ för värdar,Ev sahibi seçenekleri, +Extra Tics,NETMNU_EXTRATICS,,,,Extra tiky,Ekstra tics,,,Ekstraj Tikoj,Tics Extra,,Lisäticit,Tics supplémentaires,,Extra Tic-ek,Tics extra,予備秒数,추가 틱,,Ekstra tics,Dodatkowe tiki,Tics extras,,Ticăituri suplimentare,Дополнительные секунды,Додатни тикови,Extra tics,Ekstra Tikler, +Latency balancing,NETMNU_TICBALANCE,,,,Vyrovnání latence,Balancering af latenstid,Latenzbalance,,Respondotempo-balancado,Balanceo de latencia,,Viiveen tasapainoitus,Equilibrage de latence,,Válaszidő balanszolás,Bilanciamento latenza,レイテンシーバランス,지연 시간 조정,Latency balans,Balansering av ventetid,Balans czasu oczekiwania,Equilíbrio de latência,,Întârzierea echilibrării,Балансировка задержки,Балансирање кашњења,Balansering av latenstid,Gecikme dengeleme, +Original,OPTVAL_ORIGINAL,,,,Původní,,,,Originala,,,Alkuperäinen,,,Eredeti,Originale,オリジナル,원형,Origineel,,Oryginalny,,,,Изначальный,Оригинално,Ursprunglig,Orijinal, +Optimized,OPTVAL_OPTIMIZED,,,,Optimalizovaný,Optimeret,Optimiert,,Optimumigita,Optimizado,,Optimoitu,Optimisé,,Optimalizált,Ottimizzato,最適化,최적화 형,Geoptimaliseerd,Optimalisert,Zoptymalizowany,Otimizado,,Optimizat,Оптимизированный,Оптимизовано,Optimerad,Optimize Edilmiş, +Classic (Faster),OPTVAL_CLASSIC,,,,Klasický (rychlejší),Classic (hurtigere),Klassisch (schneller),,Klasika (Pli rapide),Clásico (Más rápido),,Perinteinen (nopeampi),Classique (+ Rapide),,Klasszikus (gyorsabb),Classico (più veloce),旧式(速度重視),구형 (빠르게),Klassiek (sneller),Klassisk (raskere),Klasyczny (szybszy),Clássico (Mais rápido),,Clasic (Mai rapid),Классический (быстрее),Класични (бржи),Classic (snabbare),Klasik (Daha Hızlı), +Precise,OPTVAL_PRECISE,,,,Přesný,Præcist,Genau,,Preciza,Preciso,,Tarkka,Précis,,Pontos,Preciso,精密,정확하게,Nauwkeurig,Presis,Dokładny,Preciso,,Precis,Точный,Прецизно,Exakt,Kesin, +Capped,OPTVAL_CAPPED,,,,Uzavřený,Begrænset,Limitiert,,Limitigita,Limitado,,Rajoitettu,Limité,,Lekorlátozva,Limitato,上限,색상에 맞게,Afgeschermd,Begrenset,Ograniczony,Limitado,,Limitat,Ограниченный,Ограничено,Begränsad,Sınırlı, +Particles,OPTVAL_PARTICLES,,,,Částice,Partikler,Partikel,,Partikloj,Partículas,,Hiukkasina,Particules,,Részecskék,Particelle,パーティクル,입자만,Deeltjes,Partikler,Cząstki,Partículas,,Particule,Частицы,Честице,Partiklar,Parçacıklar, +Sprites,OPTVAL_SPRITES,,,,Sprity,,,,Mov-rastrumoj,,,Spriteinä,,,Sprite-ok,Sprite,スプライト,스프라이트만,,,Sprite'y,,,Sprite-uri,Спрайты,Спрајтови,,Sprite'lar, +Sprites & Particles,OPTVAL_SPRITESPARTICLES,,,,Sprity a částice,Sprites og partikler,Sprites und Partikel,,Mov-rastrumoj kaj partikloj,Sprites y partículas,,Spriteinä ja hiukkasina,Sprites & Particules,,Sprite-ok és részecskék,Sprite e particelle,スプライト & パーティクル,스프라이트+입자,Sprites & Deeltjes,Sprites og partikler,Sprite'y i cząstki,Sprites & Partículas,Sprites e Partículas,Sprite-uri & Particule,Спрайты и частицы,Спрајтови и честице,Sprites och partiklar,Sprite'lar ve Parçacıklar, +Melt,OPTVAL_MELT,,,,Rozpuštění,Smelt,Verlauf,,Fandi,Derretir,,Sulaminen,Fondu,,Olvadás,Scioglimento,メルト,녹는 효과,Smelten,Smelte,Stopienie,Derreter,,Topire,Таяние,Топљење,Smält,Eriyik, +Burn,OPTVAL_BURN,,,,Oheň,Brænde,Einbrennen,,Bruli,Quemar,,Palaminen,Brûlure,,Égés,Bruciamento,バーン,타는 효과,Verbranden,Brenne,Wypalenie,Queimar,,Ardere,Жжение,Спаљивање,Bränn,Yanmak, +Crossfade,OPTVAL_CROSSFADE,,,,Prolínačka,Crossfade,Überblenden,,Transvelki,Entrelazar,,Ristihäivytys,Fondu en croix,,Átvezetés,Dissolvenza a croce,クロスフェード,화면 교차,Crossfade,Overblending,Przenikanie,Dissolver,,Ofilire,Увядание,Вењење,Crossfade,Crossfade, +Smooth,OPTVAL_SMOOTH_1,"This setting is duplicated in order to allow for different grammatical gender endings in the Russian language (and any other language that depends on a grammatical gender system). In English, due to the lack of a grammatical gender system, both option values are the same.",,,Vyhlazený,Glat,Glatt,,Glata,Fluido,,Pehmeä,Lisse,,Simítás,Liscio,スムーズ,부드럽게,Glad,Glatt,Gładki,Suavizado,,Fin,Плавная,Глатко,Smidig,Pürüzsüz, +Smooth,OPTVAL_SMOOTH_2,,,,Vyhlazené,Glat,Glatt,,Glata,Fluido,,Pehmeä,Lisse,,Simítás,Liscio,スムーズ,부드럽게,Glad,Glatt,Gładka,Suavizado,,Fin,Плавные,Глатко,Smidig,Pürüzsüz, +Translucent,OPTVAL_TRANSLUCENT,,,,Průhledný,Gennemskinnelig,Transparent,,Diafana,Translúcido,,Läpikuultava,Transparent,,Áttetsző,Traslucido,半透明,투명하게,Doorschijnend,Gjennomskinnelig,Przeświecający,Translúcido,,Transparent,Полупрозрачный,Прозрачно,Genomskinlig,Yarı Saydam, +Fuzz,OPTVAL_FUZZ,,,,Šum,,Fuzz,,Lanugo,Borroso,,Sumeus,Bruit Blanc,,Homályosítás,Annebbiato,ファズ,퍼즈 효과,Fuzz,,Szum,Difuso,,Sclipitor,Шумовой,Фаз,Fuzz,Fuzz, +Shadow,OPTVAL_SHADOW,,,,Stín,Skygge,Schatten,,Ombro,Sombra,,Varjo,Ombre,,Árnyék,Ombra,シャドウ,그림자 효과,Schaduw,Skygge,Cień,Sombra,,Umbră,Теневой,Сенка,Skugga,Gölge, +Items,OPTVAL_ITEMS,,,,Předměty,Varer,Gegenstände,,Objektoj,Objetos,,Esineet,Objets,,Tárgyak,Oggetti,アイテム,아이템들,Artikelen,Gjenstander,Przedmioty,Itens,,Obiecte,Предметы,Предмет,Artiklar,Eşyalar, +Weapons,OPTVAL_WEAPONS,,,,Zbraně,Våben,Waffen,,Armiloj,Armas,,Aseet,Armes,,Fegyverek,Armi,武器,무기들,Wapens,Våpen,Bronie,Armas,,Arme,Оружие,Оружја,Vapen,Silahlar, +Both,OPTVAL_BOTH,,,,Obojí,Begge,Beide,,Ambaŭ,Ambos,,Molemmat,Les Deux,,Mindkettő,Entrambi,両方,둘 다,Beide,Begge,Oba,Ambos,,Ambele,Оба,Оба,Båda,Her ikisi de, +ZDoom,OPTVAL_ZDOOM,,,,,,,,,,,,,,,,,Z둠,,,,,,,,,,, +Strife,OPTVAL_STRIFE,,,,,,,,,,,,,,,,,스트라이프,,,,,,,,,,, +Player,OPTVAL_PLAYER,,,,Hráč,Spiller,Spieler,,Ludanto,Jugador,,Pelaaja,Joueur,,Játékos,Giocatore,プレイヤー,플레이어,Speler,Spiller,Gracz,Jogador,,Jucător,Игрок,Играч,Spelare,Oyuncu, +Map,OPTVAL_MAP,,,,Level,Kort,Level,,Mapo,Mapa,,Kartta,Niveau,,Pálya,Mappa,マップ,맵,Kaart,Kart,Mapa,Mapa,,Hartă,Карта,Мапа,Karta,Harita, +Scale to 640x400,OPTVAL_SCALETO640X400,,,,Zvětšit na 640x400,Skaleres til 640x400,Skaliere auf 640x400,,Skali al 640x400,Escalar a 640x400,,Skaalaa resoluutioon 640x400,Echelle 640x400,,640x480-hoz arányít,Scala a 640x400,640x400スケール,640x400까지 확대,Schaal tot 640x400,Skala til 640x400,Skaluj do 640x400,Escalar para 640x400,,Dimensionare la 640x480,Масштабировать до 640x400,Скалирај на 640x400,Skala till 640x400,640x400'e ölçeklendirin, +Pixel double,OPTVAL_PIXELDOUBLE,,,,Zdvojení pixelů,Pixel dobbelt,Pixelverdopplung,,Bilderon duobligi,Pixel doble,,Kuvapistekaksinkertaistus,,,Pixel duplázás,Pixel doppi,ピクセル2倍,2배 픽셀,Pixel dubbel,Dobbel piksel,Dwukrotnie więcej pikseli,Pixel duplo,,Dublare pixeli,Двойные пиксели,Дупли пиксел,Pixel dubbelt så mycket,Piksel çift, +Pixel quadruple,OPTVAL_PIXELQUADRUPLE,,,,Zčtyřnásobení pixelů,Pixel firedobbelt,Pixelvervierfachung,,Bilderon kvarobligi,Pixel cuádruple,,Kuvapistenelinkertaistus,,,Pixel négyszerezés,Pixel quadrupli,ピクセル4倍,4배 픽셀,Pixel viervoudig,Piksel firedoblet,Czterokrotnie więcej pikseli,Pixel quádruplo,,Împătrire pixeli,Учетверённые пиксели,Четвороструки пиксел,Pixel fyrdubbel,Piksel dörtlü, +Current weapon,OPTVAL_CURRENTWEAPON,,,,Současná zbraň,Nuværende våben,Aktuelle Waffe,,Nuntempa armilo,Arma actual,,Nykyinen ase,Arme actuelle,,Jelenlegi fegyver,Arma corrente,使用中の武器,현 무기,Huidig wapen,Nåværende våpen,Aktualna broń,Arma atual,,Arma curentă,текущего оружия,Тренутно оружје,Aktuellt vapen,Mevcut silah, +Available weapons,OPTVAL_AVAILABLEWEAPONS,,,,Dostupně zbraně,Tilgængelige våben,Verfügbare Waffen,,Haveblaj armiloj,Armas disponibles,,Käytettävissä olevat aseet,Armes Disponibles,,Elérhető fegyverek,Armi disponibili,所持してる武器,사용 가능한 무기들,Beschikbare wapens,Tilgjengelige våpen,Dostępne bronie,Armas disponíveis,,Arme disponibile,доступного оружия,Доступно оружје,Tillgängliga vapen,Mevcut silahlar, +All weapons,OPTVAL_ALLWEAPONS,,,,Všechny zbraně,Alle våben,Alle Waffen,,Ĉiuj armiloj,Todas las armas,,Kaikki aseet,Toutes les armes,,Minden fegyver,Tutte le armi,全ての武器,모든 무기들,Alle wapens,Alle våpen,Wszystkie bronie,Todas as armas,,Toate armele,всех видов оружия,Сва оружја,Alla vapen,Tüm silahlar, +"Level, milliseconds",OPTVAL_LEVELMILLISECONDS,,,,"Level, milisekundy","Level, millisekunder","Level, Millisekunden",,"Nivelo, milisekundoj","Nivel, milisegundos",,"Taso, millisekunnit","Niveau, milisecondes",,"Pálya, milliszekundum","Livello, millisecondi","現場, ミリ秒","레벨, 밀리초당","Niveau, milliseconden","Nivå, millisekunder","Poziom, milisekundy","Fase, milisegundos","Nível, milisegundos","Nivel, milisecunde","Уровень, миллисекунды","Ниво, милисекунде","Nivå, millisekunder","Seviye, milisaniye", +"Level, seconds",OPTVAL_LEVELSECONDS,,,,"Level, vteřiny","Level, sekunder","Level, Sekunden",,"Nivelo, sekundoj","Nivel, segundos",,"Taso, sekunnit","Niveau, secondes",,"Pálya, másodpercek","Livello, secondi","現場, 秒","레벨, 초당","Niveau, seconden","Nivå, sekunder","Poziom, sekundy","Fase, segundos","Nível, segundos","Nivel, secunde","Уровень, секунды","Ниво, секунде","Nivå, sekunder","Seviye, saniye", +Level,OPTVAL_LEVEL,,,,,,,,Nivelo,Nivel,,Taso,Niveau,,Pálya,Livello,現場,레벨,Niveau,Nivå,Poziom,Fase,Nível,Nivel,Уровень,Ниво,Nivå,Seviye, +"Hub, seconds",OPTVAL_HUBSECONDS,,,,"Hub, vteřiny","Hub, sekunder","Hub, Sekunden",,"Rekontejo, sekundoj","Hub, segundos",,"Tasokokoelma, sekunnit","Hub, secondes",,"Csomópont, másodpercek","Hub, secondi","区間, 秒","허브, 초당","Naaf, seconden","Hub, sekunder","Hub, sekundy","Hub, segundos",,"Hub, secunde",Хаб (секунды),"Хуб, секунде","Hub, sekunder","Hub, saniye", +Hub,OPTVAL_HUB,,,,,,,,Rekontejo,,,Tasokokoelma,,,Csomópont,,区間,허브,Naaf,,,,,,Хаб,Хуб,Nav,, +"Total, seconds",OPTVAL_TOTALSECONDS,,,,"Celkový, vteřiny","I alt, sekunder","Gesamt, Sekunden",,"Tuto, sekundoj","Total, segundos",,"Yhteensä, sekunnit","Total, secondes",,"Teljes, másodpercek","Totale, secondi","合計, 秒","누적 경과, 초당","Totaal, seconden","Totalt, sekunder","Razem, sekundy","Total, segundos",,"Total, secunde",Общее (секунды),"Тотал, секунде","Totalt, sekunder","Toplam, saniye", +Total,OPTVAL_TOTAL,,,,Celkový,I alt,Gesamt,,Tuto,,,Yhteensä,,,Teljes,Totale,合計,누적 경과,Totaal,Totalt,Razem,,,,Общее,Тотал,Totalt,Toplam, +"System, seconds",OPTVAL_SYSTEMSECONDS,,,,"Systémový, vteřiny","System, sekunder","System, Sekunden",,"Sistemo, sekundoj","Sistema, segundos",,"Järjestelmä, sekunnit","Système, secondes",,"Rendszer, másodpercek","Sistema, secondi","PC時刻, 秒","시스템, 초당","Systeem, seconden","System, sekunder","System, sekundy","Sistema, segundos",,"Sistem, secunde",Система (секунды),"Систем, секунде","System, sekunder","Sistem, saniye", +System,OPTVAL_SYSTEM,,,,Systémový,,,,Sistemo,Sistema,,Järjestelmä,Système,,Rendszer,Sistema,PC時刻,시스템,Systeem,,,Sistema,,Sistem,Система,Систем,,Sistem, +Netgames only,OPTVAL_NETGAMESONLY,,,,Pouze v síťové hře,Kun netspil,Nur Netzwerkspiele,,Retludoj sole,Solo para juegos en red,,Vain verkkopelit,Parties en Ligne seulement,,Csak Netgames,Solo giochi net,オンラインのみ,멀티플레이에만,Alleen Netspellen,Kun nettspill,Tylko gry sieciowe,Jogos em rede apenas,,Doar în rețea,Только сетевые игры,Мрежне игре само,Endast nätspel,Sadece net oyunlar, +Image and Text,OPTVAL_AMMOIMAGETEXT,,,,Obrázek a text,Billede og tekst,Bild und Text,,Bildo kaj Teksto,Imagen y texto,,Kuva ja teksti,Image et Texte,,Kép és szöveg,Immagini e testo,画像と字,이미지와 텍스트,Beeld en tekst,Bilde og tekst,Obraz i Tekst,Imagem e texto,,Imagine și Text,Изображение и текст,Слика и текст,Bild och text,Resim ve Metin, +Text and Image,OPTVAL_AMMOTEXTIMAGE,,,,Text a obrázek,Tekst og billede,Text und Bild,,Teksto kaj Bildo,Texto e imagen,,Teksti ja kuva,Texte et Image,,Szöveg és kép,Testo e immagini,字と画像,텍스트와 이미지,Tekst en beeld,Tekst og bilde,Tekst i Obraz,Texto e imagem,,Text și Imagine,Текст и изобр.,Текст и слика,Text och bild,Metin ve Görüntü, +Scripts Only,OPTVAL_SCRIPTSONLY,,,,Pouze skripty,Kun scripts,Nur Skripte,,Skriptoj Sole,Solo scripts,,Vain komentosarjat,Scripts seulement,,Csak szkript,Solo script,スクリプトのみ,스크립트에만,Alleen scripts,Bare skript,Tylko skrypty,Scripts apenas,,Numai scripturi,Только скрипты,Само скрипте,Endast skript,Sadece Senaryolar, +All,OPTVAL_ALL,,,,Všechny,Alle,Alle,,Ĉiuj,Todos,,Kaikki,Tout,,Mind,Tutti,全て,모두 작동,Alle,Alle,Wszystko,Todos,,Tot,Все,Све,Alla,Tümü, +Only last one,OPTVAL_ONLYLASTONE,,,,Pouze poslední,Kun den sidste,Nur das letzte,,Nur fina unu,Solo el último,,Vain viimeinen,Dernier seulement,,Csak a legutolsó,Solo l'ultimo,最後のみ,오직 마지막 것만,Alleen de laatste,Bare den siste,Tylko ostatni,Somente o último,Apenas o último,Doar ultimul,Только последнее,Само последњи,Endast den sista,Sadece sonuncusu, +Traditional Doom,OPTVAL_TRADITIONALDOOM,,,,Tradiční Doom,Traditionel Doom,Doom traditionell,,Tradicia Doom,Doom tradicional,,Perinteinen Doom,Doom Traditionnel,,Tradícionális Doom,DOOM tradizionale,正式DOOM,전형적인 둠 스타일,Traditioneel Doom,Tradisjonell undergang,Tradycyjny Doom,Doom Tradicional,,Tradițional Doom,Цвета из Doom,Традиционални Doom,Traditionell Doom,Geleneksel Doom, +Traditional Strife,OPTVAL_TRADITIONALSTRIFE,,,,Tradiční Strife,Traditionel Strife,Strife traditionell,,Tradicia Strife,Strife tradicional,,Perinteinen Strife,Strife Traditionnel,,Tradícionális Strife,Strife tradizionale,正式Strife,전형적인 스트라이프 스타일,Traditionele Strife,Tradisjonell strid,Tradycyjny Strife,Strife Tradicional,,Tradițional Strife,Цвета из Strife,Традиционални Strife,Traditionell Strife,Geleneksel Strife, +Traditional Raven,OPTVAL_TRADITIONALRAVEN,,,,Tradiční Raven,Traditionel Raven,Raven traditionell,,Tradicia Raven,Raven tradicional,,Perinteinen Raven,Raven Traditionnel,,Tradícionális Raven,Raven tradizionale,正式Raven,전형적인 레이븐 스타일,Traditionele Raven,Tradisjonell ravn,Tradycyjny Raven,Raven Tradicional,,Tradițional Raven,Цвета из Raven,Традиционални Raven,Traditionell Raven,Geleneksel Raven, +Only when found,OPTVAL_ONLYWHENFOUND,,,,Pouze po nalezení,Kun når de findes,Nur wenn gefunden,,Nur kiam trovita,Una vez encontrados,,"Vain, kun löydetty",Seulement découverts,,Csak ha megleled,Solo quando trovato,発見時のみ,획득했을 때만,Alleen wanneer gevonden,Bare når funnet,Tylko gdy znaleziono,Somente quando encontrado,Apenas quando encontrado,Doar la descoperire,После обнаружения,Само кад је пронађен,Endast när den hittas,Sadece bulunduğunda, +On for overlay only,OPTVAL_ONFOROVERLAYONLY,,,,Pouze v překryvném režimu,Kun til overlay,Nur auf Overlay,,Ŝaltita nur por surmeto,Solo para superpuesto,,Päällä vain karttaprojisoinnin kanssa,On pour Surimpression,,Csak az overlayen,Solo attivo per la sovrapposizione,オーバーレイ専用,오버레이에만 작동,Alleen op voor overlay alleen voor overlay,På kun for overlegg,Włączony tylko dla nakładek,Ativado somente para sobreposição,Apenas ativado para sobreposição,Doar pentru modul transparent,Только наложенная,Укључен само за навлаку,Endast på för överlagring,Yalnızca kaplama için etkin, +Overlay+Normal,OPTVAL_OVERLAYNORMAL,,,,Překryv + normální,Overlay+Normal,Overlay+Normal,,Surmeto+Normala,Superpuesto+Normal,,Projisointi+tavallinen,Surimpression+Normal,,Overlay+Normál,Sovrapposizione+Normale,オーバーレイ+通常,오버레이+기본,Overlay+Normaal,,Nakładka+Normalnie,Sobreposição+Normal,,Transparent + Normal,Наложенная + обычная,Навлака + нормално,Överlagring+Normal,Yer Kaplama+Normal, +Overlay Only,OPTVAL_OVERLAYONLY,,,,Pouze překryv,Kun overlay,Nur Overlay,,Nur Surmeto,Solo superpuesto,,Vain projisointi,Surimpression seulement,,Csak Overlay-nél,Solo Sovrapposizione,オーバーレイのみ,오버레이만,Alleen Overlay,Kun overlegg,Tylko Nakładka,Sobreposição apenas,,Doar modul transparent,Только прозрачный,Навлак само,Endast överlagring,Yalnızca Kaplama, +Not for hubs,OPTVAL_NOTFORHUBS,,,,Ne pro huby,Ikke for knudepunkter,Nicht für Hubs,,Ne por naboj,No para hubs,,Ei tasokokoelmille,Pas pour les hubs,,Csomópontokhoz nem,Non per gli hub,区間では出さない,허브는 제외,Niet voor hubs,Ikke for nav,Nie dla hubów,Exceto hubs,,Nu pentru hub-uri,Кроме групп,Није за хубове,Inte för nav,Hub'lar için değil, +Front,OPTVAL_FRONT,,,,Zepředu,Forside,Frontalansicht,,Fronto,Frontal,,Etu,Devant,,Előnézet,Fronte,画像,정면,Voorkant,Forside,Przód,Frente,,Înainte,Перед,Испред,Framsida,Ön, +Animated,OPTVAL_ANIMATED,,,,Animované,Animeret,Animiert,,Animita,Animado,,Animoitu,Animés,,Animált,Animato,動作,움직임,Geanimeerd,Animert,Animowany,Animado,,Animat,Анимированные,Анимирано,Animerad,Animasyonlu, +Rotated,OPTVAL_ROTATED,,,,Otáčivé,Drejet,Rotiert,,Turnita,Rotado,,Kääntyvä,Tournés,,Elforgatott,Ruotato,回転,회전함,Geroteerd,Rotert,Obrócony,Rotacionado,Rodado,Rotit,Повёрнутые,Ротирано,Roterad,Döndürülmüş, +Map defined colors only,OPTVAL_MAPDEFINEDCOLORSONLY,,,Map defined colours only,Pouze barvy definované mapou,Kun kortdefinerede farver,Nur Leveldefinierte Farben,,Nur mapaj difinitaj koloroj,Colores definidos por el usuario,,Vain kartan määrittämät värit,Couleurs définies carte seul.,,Csak map orientált színek,Solo i colori definiti dalla mappa,指定した色のみ,자체 미니맵 색상 사용,Alleen gedefinieerde kleuren op de kaart,Kun kartdefinerte farger,Tylko kolory zdefiniowane przez mapę,Cores definidas por mapa apenas,,Doar culori specifice hărții,Только определённые картой цвета,Само дефинисане мапом боје,Endast kartdefinierade färger,Yalnızca harita tanımlı renkler, +All except doors,OPTVAL_NODOORS,,,,Všechny krom dveří,Alle undtagen døre,Alle außer Türen,,Ĉiom krom pordoj,Todo excepto puertas,,Kaikki paitsi ovet,Tout sauf portes,,"Minden, kivétel az ajtók",Tutti eccetto le porte,ドア以外全て,문을 제외한 모두,Allemaal behalve deuren,Alle unntatt dører,Wszystko oprócz drzwi,Tudo exceto portas,,Cu excepția ușilor,Кроме дверей,Све осим врата,Alla utom dörrar,Kapılar hariç hepsi, +Double,OPTVAL_DOUBLE,,,,Dvojitý,Dobbelt,Doppel,,Duobligi,Doble,,Kaksinkertainen,,,Dupla,Doppio,ダブル,2배,Dubbele,Dobbel,Podwójny,Dobro,,Dublu,Двойной,Дупло,Dubbel,Çift, +Triple,OPTVAL_TRIPLE,,,,Trojitý,Tredobbelt,Dreifach,,Triobligi,,,Kolminkertainen,,,Tripla,Triplo,トリプル,3배,Drievoudig,Trippel,Potrójny,Triplo,,Triplu,Тройной,Тродупло,Tredubbel,Üçlü, +Quadruple,OPTVAL_QUADRUPLE,,,,Čtveritý,Firedobbelt,Vierfach,,Kvarobligi,Cuádruple,,Nelinkertainen,,,Négyszeres,Quadruplo,クァッド,4배,Viervoudig,Firedoblet,Poczwórny,Quádruplo,,Cvadruplu,Четырёхкратный ,Четвороструко,Fyrdubbel,Dörtlü, +Item Pickup,OPTVAL_ITEMPICKUP,,,,Sebrání předmětu,Afhentning af varer,Gegenstand genommen,,Objektoprenado,Coger objetos,Agarrar objetos,Esineen poiminta,Objets Ramassés,,Tárgy felvétele,Raccolta oggetto,アイテム取得,아이템 획득시,Puntafhaling,Varehenting,Podniesienie Przedmiotu,Coleta de Item,Aquisição de Itens,Obiect Ridicat,Подбор предметов,Подигнут предмет,Hämtning av föremål,Bir eşyayı almak, +Obituaries,OPTVAL_OBITUARIES,,,,Oznámení o smrti,Dødsannoncer,Todesanzeige,,Nekrologoj,Obituarios,,Kuolinviestit,Avis de décès,,Halálok,Necrologio,死亡時,사망 메시지,Doodsbrieven,Dødsannonser,Nekrologi,Obituários,,Necrologuri,Некрологи,Читуље,Dödsannonser,Ölüm İlanları, +Critical Messages,OPTVAL_CRITICALMESSAGES,,,,Kritická oznámení,Kritiske meddelelser,Kritische Meldungen,,Gravaj mesaĝoj,Mensajes críticos,,Tärkeät viestit,Messages Critiques,,Fontos üzenetek,Messaggi critici,重要メッセージ,중요한 메시지,Kritische berichten,Kritiske meldinger,Wiadomości krytyczne,Mensagens Críticas,,Mesaje Critice,Важные сообщения,Критичне поруке,Kritiska meddelanden,Kritik Mesajlar, +Never friends,OPTVAL_NEVERFRIENDS,,,,Nikdy spojence,Aldrig venner,Keine Freunde,,Neniam amikoj,Nunca amigos,,Ei koskaan ystäviä,Jamais les Amis,,Barátokat sose,Mai amici,フレンド以外,아군 무시,Nooit vrienden,Aldri venner,Żadnych przyjaciół,Nunca amigos,,Nu aliați,Не по союзникам,Никад за пријатеље,Aldrig vänner,Asla arkadaş değil, +Only monsters,OPTVAL_ONLYMONSTERS,,,,Pouze příšery,Kun monstre,Nur Monster,,Nur monstroj,Solo monstruos,,Vain hirviöt,Monstres Seulement,,Csak szörnyeket,Solo i mostri,モンスターのみ,적에게만,Alleen monsters,Bare monstre,Tylko potwory,Somente monstros,Monstros apenas,Doar monștri,Для монстров,Само чудовишста,Endast monster,Sadece canavarlar, +Hexen,OPTVAL_HEXEN,,,,,,,,,,,,Hexen,,,,,헥센,,,,,,,,,,, +Old,OPTVAL_OLD,,,,Starý,Gamle,Alt,,Maljuna,Viejo,,Vanha,Ancien,,Régi,Vecchio,旧式,구형,Oud,Gamle,Stare,Antigo,,Vechi,Старый,Стар,Gamla,Eski, +Doom,OPTVAL_DOOM,,,,,,,,,,,,,,,,,둠,,,,,,,,,,, +Doom (strict),OPTVAL_DOOMSTRICT,,,,Doom (striktní),Doom (streng),Doom (strikt),,Doom (severa),Doom (estricto),,Doom (tiukka),,,Doom (szigorú),Doom (rigoroso),Doom(厳密),둠 (엄격하게),Doom (streng),Doom (streng),Doom (dokładny),Doom (estritamente),Doom (estrito),,Doom (строгий),Doom (строг),Doom (strikt),Doom (katı), +Boom,OPTVAL_BOOM,,,,,,,,,,,,,,,,,붐,,,,,,,,,,, +Boom (strict),OPTVAL_BOOMSTRICT,,,,Boom (striktní),Boom (streng),Boom (strikt),,Boom (severa),Boom (estricto),,Boom (tiukka),,,Boom (szigorú),Boom (rigoroso),Boom(厳密),붐 (엄격하게),Boom (streng),Boom (streng),Boom (dokładny),Boom (estritamente),Boom (estrito),,Boom (строгий),Boom (строг),Boom (strikt),Boom (katı), +MBF,OPTVAL_MBF,,,,,,,,,,,,,,,,,마린의 절친한 친구,,,,,,,,,,, +MBF (strict),OPTVAL_MBFSTRICT,,,,MBF (striktní),MBF (streng),MBF (strikt),,MBF (severa),MBF (estricto),,MBF (tiukka),,,MBF (szigorú),MBF (rigoroso),MBF(厳密),마린의 절친한 친구 (엄격하게),MBF (streng),MBF (streng),MBF (dokładny),MBF (estritamente),MBF (estrito),,MBF (строгий),MBF (строг),MBF (strikt),MBF (katı), +MBF21,OPTVAL_MBF21,,,,,,,,,,,,,,,,,마린의 절친한 친구,,,,,,,,,,, +MBF21 (strict),OPTVAL_MBF21STRICT,,,,MBF21 (striktní),MBF21 (streng),MBF21 (strikt),,MBF21 (severa),MBF21 (estricto),,MBF21 (tiukka),,,MBF21 (szigorú),MBF21 (rigoroso),MBF21(厳密),마린의 절친한 친구21 (엄격하게),MBF21 (streng),MBF21 (streng),MBF21 (dokładny),MBF21 (estritamente),MBF21 (estrito),,MBF21 (строгий),MBF21 (строг),MBF21 (strikt),MBF21 (katı), +ZDoom 2.0.63,OPTVAL_ZDOOM2063,,,,,,,,,,,,,,,,,Z둠 2.0.63,,,,,,,,,,, +All unacknowledged,OPTVAL_ALLUNACKNOWLEDGED,,,,Všechny nepotrvzené,Alle ubekræftede,Alle unbestätigten,,Ĉiuj neagnoskitaj,Todos no reconocidos,,Kaikki kuittaamattomat,Tout non-acknowledged,,Minden visszaigazolatlan,Tutti non riconosciuti,未確認全て,모두 미확인함,Allemaal onbekend,Alle ubekreftet,Wszystkie niepotwierdzone,Todos não-reconhecidos,,Toate necunoscute,Всё неопознанное,Све неусвојено,Alla obeaktade,Tüm onaylanmamış, +Errors,OPTVAL_ERRORS,,,,Chyby,Fejl,Fehler,,Eraroj,Errores,,Virheet,Erreurs,,Hibák,Errori,エラー,에러,Fouten,Feil,Błędy,Erros,,Erori,Ошибки,Грешка,Fel,Hatalar, +Warnings,OPTVAL_WARNINGS,,,,Varování,Advarsler,Warnungen,,Avertoj,Advertencias,,Varoitukset,Avertissements,,Figyelmeztetések,Avvisi,警告,경고,Waarschuwingen,Advarsler,Ostrzeżenia,Avisos,,Atenționări,Предупреждения,Упозорење,Varningar,Uyarılar, +Notifications,OPTVAL_NOTIFICATIONS,,,,Oznámení,Meddelelser,Benachrichtigungen,,Sciigoj,Notificaciones,,Ilmoitukset,,,Üzenetek,Notifiche,通知,알림,Kennisgevingen,Varsler,Powiadomienia,Notificações,,Notificări,Уведомления,Обавештење,Meddelanden,Bildirimler, +Everything,OPTVAL_EVERYTHING,,,,Všechno,Alt,Alles,,Ĉio,Todo,,Kaikki,Tout,,Minden,Tutti,全て,전체,Alles,Alt,Wszystko,Tudo,,Tot,Всё,Све,Allt,Her şey, +Hardware accelerated,OPTVAL_HWPOLY,,,,Hardwarová akcelerace,Hardware accelereret,Hardwarebeschleunigt,,Aparatara plirapidigo,Acelerado por «hardware»,,Laitteistokiihdytetty,Accéléré par Hardware,,Hardveres gyorsítás,Accelerazione Hardware,ハードウェア アクセラレート,오픈지엘 가속,Hardware versneld,Maskinvareakselerert,Napędzane sprzętowo,Acelerado por hardware,,Accelerat Hardware,Аппаратный,Харвер убрзан,Hårdvara påskyndad,Hızlandırılmış donanım, +Doom Software Renderer,OPTVAL_SWDOOM,,,,Doom softwarový renderer,,,,Programar-bildigilo de Doom,Renderizado por «software» de Doom,,Doomin ohjelmistohahmonnin,Rendu Software Doom,,Doom szoftveres renderer,Rendering DOOM software,Doom ソフトウェアレンダー,둠 소프트웨어 렌더러,,,Renderer Oprogramowania Dooma,Renderizador Software do Doom,,Software,Doom-программный,Doom софтверски рендерер,Doom Mjukvarurenderare,Doom Yazılım Oluşturucu, +True Color SW Renderer,OPTVAL_SWDOOMTC,,,,True color softwarový renderer,,,,Programar-bildigilo kun plenkoloro,Renderizado Truecolor (color verdadero) del «software»,,True Color -ohjelmistohahmonnin,Rendu Software Couleurs Réeles,,,Rendering software a pieni colori,トゥルーカラー SWレンダー,트루 컬러 소프트웨어 렌더러,,,Renderer True Color,Renderizador Software True Color,,Software Color Complet,Полноцветный програмный,SW рендерер праве боје,True Color Mjukvarurenderare,Gerçek Renk SW Oluşturucu, +High-Performance,OPTVAL_DEDICATED,,,,Vysoký výkon,Højtydende,Volle Leistung,,Alta rendimento,Alto rendimiento,,Korkea suorituskyky,Hautes Performances,,Nagy teljesítmény,Prestazioni massime,ハイパフォーマンス,고 성능,Hoogwaardige prestaties,Høy ytelse,Wysoka Wydajność,Alta-Performance,,De înaltă performanță,Высокая производительность,Високо-перформанси,Högpresterande,Yüksek Performans, +Power-Saving,OPTVAL_INTEGRATED,,,,Nízká spotřeba,Strømbesparende,energiesparend,,Energikonservo,Ahorro de energía,,Virransäästö,Economie d'Energie,,Energia takarékos,Risparmio energetico,パワーセービング,저전력,Energiebesparing,Strømsparende,Oszczędzanie Energii,Economia de Energia,,Economie de energie,Энергосбережение,Енергетско-штедљиви,Energibesparande,Güç Tasarrufu, +Vanilla,OPTVAL_VANILLA,,,,Původní,,,,Originala ludversio,,,Alkuperäinen,,,Hagyományos,,バニラ,바닐라,,,Oryginalny,,,Original,Изначальный,Ванила,,Vanilya, +ZDoom (Forced),OPTVAL_VTFZDOOM,,,,ZDoom (vynucený),ZDoom (tvunget),ZDoom (erzwungen),,ZDoom (devigita),ZDoom (forzado),,ZDoom (pakotettu),ZDoom (Forcé),,ZDoom (erőltetett),ZDoom (forzato),ZDoom(強制),ZDoom (강제 설정),ZDoom (Gedwongen),ZDoom (Tvunget),ZDoom (Wymuszony),ZDoom (Forçar),,ZDoom (Forțat),ZDoom (принудительно),ZDoom (присиљен),ZDoom (tvingad),ZDoom (Zorla), +Vanilla (Forced),OPTVAL_VTFVANILLA,,,,Původní (vynucený),Vanilla (tvungen),Vanilla (erzwungen),,Originala ludversio (devigita),Vanilla (forzado),,Perus (pakotettu),Vanilla (Forcé),,Hagyományos (erőltettt),Vanilla (forzato),バニラ(強制),바닐라 (강제 설정),Vanilla (Gedwongen),Vanilla (Tvunget),Czysty (Wymuszony),Vanilla (Forçar),DOS Original (Forçar),Original (Forțat),Изначальный (принудительно),Ванила (присиљен),Vanilla (tvingad),Vanilya (Zorlanmış), +Auto (ZDoom Preferred),OPTVAL_VTAZDOOM,,,,Auto (preferován ZDoom),Auto (ZDoom foretrukket),Auto (ZDoom bevorzugt),,Aŭtomata (preferata de ZDoom),Automático (preferido por ZDoom),,Automaattinen (ZDoomia suosiva),Auto (ZDoom Préféré),,Automata (ZDoom preferált),Automatico (ZDoom preferito),自動(ZDoom優先),자동 (ZDoom 기본 설정),Auto (bij voorkeur ZDoom),Auto (ZDoom foretrukket),Automatyczny (Preferowany ZDoom),Automático (De preferência ZDoom),,Auto (ZDoom preferat),Автоматически (предпочитать ZDoom),Аутоматски (ZDoom преферијални),Auto (ZDoom föredraget),Otomatik (ZDoom Tercih Edilir), +Auto (Vanilla Preferred),OPTVAL_VTAVANILLA,,,,Auto (preferován původní),Auto (Vanilla foretrukket),Auto (Vanilla bevorzugt),,Aŭtomata (preferata de la originala),Automático (preferido por Vanilla),,Automaattinen (alkuperäistä suosiva),Auto (Vanilla Préféré),,Automata (Hagyományos preferált),Automatico (Vanilla preferito),自動(バニラ優先),자동 (바닐라 기본 설정),Auto (bij voorkeur Vanilla),Auto (Vanilla foretrukket),Automatyczny (Preferowany oryginalny),Automático (De preferência Vanilla),Automático (De preferência DOS Original),Auto (Original preferat),Автоматически (предпочитать изначальный),Аутоматски (ванила преферијални),Auto (Vanilla föredraget),Otomatik (Vanilya Tercihli), +Small,OPTVAL_SMALL,,,,Malé,Lille,Klein,,Malgranda,Pequeño,,Pieni,Petit,,Kicsi,Piccolo,小,작게,Klein,Liten,Mały,Pequeno,,Mic,Мелкий,Мало,Liten,Küçük, +Large,OPTVAL_LARGE,,,,Velké,Stor,Groß,,Granda,Grande,,Suuri,Grand,,Nagy,Grande,大,크게,Groot,Stor,Duży,Grande,,Mare,Крупный,Велико,Stor,Büyük, +Console,OPTVAL_CONSOLE,,,,Konzole,Konsol,Konsole,,Konzolo,Consola,,Konsoli,,,Konzol,,コンソール,콘솔,,Konsoll,Konsola,,Consola,Consolă,Консольный,Конзола,Konsol,Konsol, +\caBrick,C_BRICK,,,,\caCihlová,\caMursten,\caZiegelrot,,\caBrikkolora,\caLadrillo,,\catiili,\cabrique,,\catéglavörös,\camattone,\ca丹,\ca주홍색,\casteenrood,\caMurstein,\cacegła,\catijolo,,\caCărămiziu,\caКирпичный,\caБоја цигле,\caTegelsten,\caTuğla, +\cbTan,C_TAN,,,,\cbSvětle hnědá,,\cbHellbraun,,\cbTankolora,\cbBeis,\cbBeige,\cbkeltaruskea,\cbbeige,,\cbbézs,\cbabbronzatura,\cb香,\cb상아색,\cblichtbruin,\cbBrun,\cbjasnobrązowy,\cbbege,,\caBronz,\cbБежевый,\cbБеж,,, +\ccGray,C_GRAY,,,\ccgrey,\ccŠedá,\ccGrå,\ccGrau,,\ccGriza,\ccGris,,\ccharmaa,\ccgris,,\ccszürke,\ccgrigio,\cc灰,\cc회색,\ccgrijs,\ccGrå,\ccszary,\cccinza,,\ccGri,\ccСерый,\ccСива,\ccGrå,\ccGri, +\cdGreen,C_GREEN,,,,\cdZelená,\cdGrøn,\cdGrün,,\cdVerda,\cdVerde,,\cdvihreä,\cdvert,,\cdzöld,\cdverde,\cd緑,\cd녹색,\cdgroen,\cdGrønn,\cdzielony,\cdverde,,\cdVerde,\cdЗелёный,\cdЗелена,\cdGrön,\cdYeşil, +\ceBrown,C_BROWN,,,,\ceHnědá,\ceBrun,\ceBraun,,\ceBruna,\ceMarrón,\ceMarrón/Café,\ceruskea,\cebrun,,\cebarna,\cemarrone,\ce茶,\ce갈색,\cebruin,\ceBrun,\cebrązowy,\cemarrom,,\ceMaro,\ceКоричневый,\ceСмеђа,\ceBrun,\ceKahverengi, +\cfGold,C_GOLD,,,,\cfZlatá,\cfGuld,,,\cfOrkolora,\cfDorado,,\cfkulta,\cfor,,\cfarany,\cforo,\cf金,\cf금색,\cfgoud,\cfGull,\cfzłoty,\cfdourado,,\cfAuriu,\cfЗолотой,\cfЗлатна,\cfGuld,\cfAltın, +\cgRed,C_RED,,,,\cgČervená,\cgRød,\cGrot,,\cfRuĝa,\cgRojo,,\cgpunainen,\cgrouge,,\cgvörös,\cgrosso,\cg赤,\cg적색,\cgrood,\cgRød,\cgczerwony,\cgvermelho,,\gRoșu,\cgКрасный,\cgЦрвена,\cgRöd,\cgKırmızı, +\chBlue,C_BLUE,,,,\chModrá,\chBlå,\chBlau,,\chBlua,\chAzul,,\chsininen,\chbleu,,\chkék,\chblu,\ch青,\ch청색,\chblauw,\chBlå,\chniebieski,\chazul,,\chAlbastru,\chСиний,\chПлава,\chBlå,\chMavi, +\ciOrange,C_ORANGE,,,,\ciOranžová,,,,\ciOranĝkolora,\ciNaranja,,\cioranssi,\ciorange,,\cinarancs,\ciarancione,\ci橙,\ci주황색,\cioranje,\ciOransje,\cipomarańczowy,\cilaranja,,\ciPortocaliu,\ciОранжевый,\ciНаранџаста,,\ciTuruncu, +\cjWhite,C_WHITE,,,,\cjBílá,\cjHvid,\cjWeiß,,\cjBlanka,\cjBlanco,,\cjvalkoinen,\cjblanc,,\cjfehér,\cjbianco,\cj白,\cj흰색,\cjwit,\cjHvit,\cjbiały,\cjbranco,,\cjAlb,\cjБелый,\cjБела,\cjVit,\cjBeyaz, +\ckYellow,C_YELLOW,,,,\ckŽlutá,\ckGul,\ckGelb,,\ckFlava,\ckAmarillo,,\ckkeltainen,\ckjaune,,\cksárga,\ckgiallo,\ck黄,\ck노란색,\ckgeel,\ckGul,\ckżółty,\ckamarelo,,\ckGalben,\ckЖёлтый,\ckЖута,\ckGul,\ckSarı, +\clDefault,C_DEFAULT,,,,\clVýchozí,\clStandard,\clStandard,,\clDefaŭlta,\clPor defecto,,\cloletus,\cldéfaut,,\clalap,\cldefault,\cl初期,\cl기본 색,\clstandaard,\clStandard,\cldomyślny,\clpadrão,,\clImplicită,\clПо умолчанию,\clУобичајена,\clStandard,\clVarsayılan, +\cmBlack,C_BLACK,,,,\cmČerná,\cmSort,\cmSchwarz,,\cmNigra,\cmNegro,,\cmmusta,\cmnoir,,\cmfekete,\cmnero,\cm黒,\cm검은색,\cmzwart,\cmSvart,\cmczarny,\cmpreto,,\cmNegru,\cmЧёрный,\cmЦрна,\cmSvart,\cmSiyah, +\cnLight blue,C_LIGHTBLUE,,,,\cnSvětle modrá,\cnLyseblå,\cnHellblau,,\cnHelblua,\cnAzul claro,,\cnvaaleansininen,\cnbleu clair,,\cnvilágoskék,\cnblu chiaro,\cn空,\cn하늘색,\cnlicht blauw,\cnLyseblå,\cnjasnoniebieski,\cnazul claro,,\cnAlbastru deschis,\cnГолубой,\cnСветло плава,\cnLjusblått,\cnAçık mavi, +\coCream,C_CREAM,,,,\coKrémová,\coCreme,\coCremefarben,,\coKremkolora,\coCrema,,\cokerma,\cocrème,,\cokrémszínű,\cocrema,\co肉,\co살구색,\cocrème,\coKremfarget,\cokremowy,\cocreme,,\coCrem,\coКремовый,\coКрем,\coGrädde,\coKrem, +\cpOlive,C_OLIVE,,,,\cpOlivová,\cpOliven,\cpOliv,,\cpOlivkolora,\cpOliva,,\cpoliivi,\cpolive,,\cpolíva,\cpoliva,\cp泥,\cp녹갈색,\cpolijf,\cpOliven,\cpoliwkowy,\cpoliva,,\cpMăsliniu,\cpОливковый,\cpМаслинаста,\cpOliv,\cpZeytin, +\cqDark green,C_DARKGREEN,,,,\cqTmavě zelená,\cqMørkegrøn,\cqDunkelgrün,,\cqMalhelverda,\cqVerde oscuro,,\cqtummanvihreä,\cqvert sombre,,\cqsötétzöld,\cqverde scuro,\cq深,\cq암녹색,\cqdonkergroen,\cqMørkegrøn,\cqciemnozielony,\cqverde escuro,,\cqVerde închis,\cqТёмно-зелёный,\cqТамно зелена,\cqMörkgrön,\cqKoyu yeşil, +\crDark red,C_DARKRED,,,,\crTmavě červená,\crMørkerød,\crDunkelrot,,\crMalhelruĝa,\crRojo oscuro,,\crtummanpunainen,\crrouge sombre,,\crsötétvörös,\crrosso scuro,\cr朱,\cr암적색,\crdonkerrood,\crMørkerød,\crciemnoczerwony,\crvermelho escuro,,\crRoșu închis,\crТёмно-красный,\crБордо,\crMörkröd,\crKoyu kırmızı, +\csDark brown,C_DARKBROWN,,,,\csTmavě hnědá,\csMørkebrun,\csDunkelbraun,,\csMalhelbruna,\csMarrón oscuro,\csMarrón/Café oscuro,\cstummanruskea,\csbrun sombre,,\cssötétbarna,\csmarrone scuro,\cs焦,\cs암갈색,\csdonkerbruin,\csMørkebrun,\csciemnobrązowy,\csmarrom escuro,,\csMaro închis,\csТёмно-коричневый,\csБраон,\csMörkbrun,\csKoyu kahverengi, +\ctPurple,C_PURPLE,,,,\ctFialová,\ctLilla,\ctLila,,\ctPurpura,\ctMorado,,\ctpurppura,\ctviolet,,\ctlila,\ctviola,\ct紫,\ct보라색,\ctpaars,\ctLilla,\ctfioletowy,\ctroxo,,\ctMov,\ctФиолетовый,\ctЉубичаста,\ctLila,\ctMor, +\cuDark gray,C_DARKGRAY,,,\cudark grey,\cuTmavě šedá,\cuMørkegrå,\cuDunkelgrau,,\cuMalhelgriza,\cuGris oscuro,,\cutummanharmaa,\cugris sombre,,\cusötétszürke,\cugrigio scuro,\cu鉛,\cu치색,\cudonkergrijs,\cuMørkegrå,\cuciemnoszary,\cucinza escuro,,\cuGri închis,\cuТёмно-серый,\cuТамно сива,\cuMörkgrå,\cuKoyu gri, +\cvCyan,C_CYAN,,,,\cvAzurová,,\cvTürkis,,\cvCejana,\cvCian,,\cvsinivihreä,\cvcyan,,\cvcián,\cvciano,\cv天,\cv청록색,\cvcyan,,\cvbłękitny,\cvciano,,\cvTurcoaz,\cvСине-зелёный,\cvЦијан,,, +\cwIce,C_ICE,,,,\cwLed,\cwIs,\cwEis,,\cwGlacikolora,\cwHielo,,\cwjää,\cwglace,,\cwjég,\cwghiaccio,\cw氷,\cw구색,\cwice,\cwIs,\cwlód,\cwgelo,,\cwGheață,\cwЛедяной,\cwЛед,\cwIs,\cwBuz, +\cxFire,C_FIRE,,,,\cxOheň,\cxIld,\cxFeuer,,\cxFajrkolora,\cxFuego,,\cxtuli,\cxfeu,,\cxtűz,\cxfuoco,\cx炎,\cx자황색,\cxvuur,\cxIld,\cxogień,\cxfogo,,\cxFoc,\cxОгненный,\cxВатрена,\cxEld,\cxYangın, +\cySapphire,C_SAPPHIRE,,,,\cySafírová,\cySafir,\cySaphirblau,,\cySafirkolora,\cyZafiro,,\cysafiiri,\cysaphir,,\cyzafír,\cyzaffiro,\cy藍,\cy벽청색,\cysaffier,\cySafir,\cyszafirowy,\cysafira,,\cySafir,\cyСапфировый,\cyТамно плава,\cySafir,\cySafir, +\czTeal,C_TEAL,,,,\czModrozelená,\czKrikand,\czBlaugrün,,\czBluverda,\czTurquesa,,\cztummansinivihreä,\czturquoise,,\cztürkiz,\czverde acqua,\cz碧,\cz암청록색,\czteal,\czBlågrønn,\czmorski,\czturquesa,,\czMare,\czМорской,\czТиркизна,,\czDeniz mavisi, +Heretic,OPTSTR_HERETIC,,,,,,,,,,,,,,,,,헤러틱 커서,,,,,,,,,,, +Chex,OPTSTR_CHEX,,,,,,,,,,,,,,,,,첵스 커서,,,,,,,,,,, +No Sound,OPTSTR_NOSOUND,,,,Bez zvuku,Ingen lyd,Kein Sound,,Neniu sono,Sin sonido,,Ei ääntä,Pas de son,,Hang nélkül,Nessun suono,サウンドなし,음향 없음,Geen geluid,Ingen lyd,Brak dźwięku,Sem som,,Fără Sunet,Без звука,Без-звучни,Inget ljud,Ses Yok, +No interpolation,OPTSTR_NOINTERPOLATION,,,,Bez interpolace,Ingen interpolation,Keine Interpolation,,Neniu interpolado,Sin interpolación,,Ei interpolaatiota,Pas d'interpolation,,Nincs interoláció,No interpolazione,補間無し,보간 없음,Geen interpolatie,Ingen interpolasjon,Brak interpolacji,Sem interpolação,,Fără interpolare,Без сглаживания,Нема уметања,Ingen interpolering,Enterpolasyon yok, +Spline,OPTSTR_SPLINE,,,,Křivka,,,,Splajno,,,Splini,,,,,スプライン,스플라인,,,,,,,Сплайн,Сплајн,,, +OpenAL,OPTSTR_OPENAL,,,,,,,,,,,,,,,,,오픈에이엘,,,,,,,,,,, +Hardware Renderer,DSPLYMNU_GLOPT,,,,Hardwarový renderer,,,,Aparatara bildigilo,Renderizado por «hardware»,,Laitteistohahmonnin,Moteur de Rendu Hardware,,Hardver Render,Rendering Hardware,ハードウェア レンダラー,오픈지엘 렌더러,,,Renderer Sprzętowy,Renderizador Hardware,,Setări Mod OpenGL,Обработка с OpenGL,Хардвер рендерер,Hårdvaru-renderare,Donanım Oluşturucu, +Software Renderer,DSPLYMNU_SWOPT,,,,Softwarový renderer,,,,Programara bildigilo,Renderizado por «software»,,Ohjelmistohahmonnin,Moteur de Rendu Software,,Szoftver Render,Rendering Software,ソフトウェア レンダラー,소프트웨어 렌더러,,,Renderer Oprogramowania,Renderizador Software,,Setări Mod Software,Программная обработка,Софтвер рендерер,Mjukvarurenderare,Yazılım Oluşturucu, +Hardware Rendering Options,GLMNU_TITLE,,,,Nastavení hardwarového rendereru,Indstillinger for hardware-rendering,Hardware-Renderer Optionen,,Agordoj de OpenGL (aparatara bildigilo),Opciones de OpenGL,,Laitteistohahmonnusasetukset,Options OpenGL,,Hardver Renderelő Beállítások,Opzioni OpenGL,ハードウェアレンダリング オプション,오픈지엘 설정,Hardware Rendering Opties,Alternativer for maskinvaregjengivelse,Opcje Renderowania Sprzętowego,Opções de Renderização por Hardware,,Setări Redare OpenGL,Настройки OpenGL,Опција хардвер рендера,Alternativ för maskinvarurendering,Donanım Oluşturma Seçenekleri, +Dynamic Light Options,GLMNU_DYNLIGHT,,,,Nastavení dynamických světel,Indstillinger for dynamisk lys,Dynamisches-Licht-Optionen,,Agordoj de dinamikaj lumoj,Opciones de luz dinámica,,Dynaamisen valon asetukset,Options Lumières Dynamiques,,Dinamikus Fény Beállítások,Opzioni Luci Dinamiche,ダイナミックライト オプション,광원 설정,Dynamische Licht Opties,Alternativer for dynamisk lys,Opcje Dynamicznego Oświetlenia,Opções de Luz Dinâmica,,Setări Lumini Dinamice,Динамическое освещение,Подешавања динамичког осветљења,Alternativ för dynamiskt ljus,Dinamik Işık Seçenekleri, +Preferences,GLMNU_PREFS,,,,Možnosti,Præferencer,Einstellungen,,Preferoj,Preferencias,,Asetukset,Préférences,,Preferenciák,Preferenze,環境設定,성능,Voorkeuren,Innstillinger,Preferencje,Preferências,,Preferințe,Настройки,Преференција,Inställningar,Tercihler, +Trim sprite edges,GLTEXMNU_TRIMSPREDGE,,,,Oříznout okraje spritů,Trimme sprite-kanter,Leerraum in Sprites wegschneiden,,Ĉirkaŭtranĉi randojn de mov-rastrumoj,Recortar líneas de «sprite»,,Siisti spritejen reunat,Nettoyer le bord des sprites,,Sprite szél igazítása,Taglia gli spigoli agli sprite,スプライトの角を取る,스프라이트 모서리 다듬기,,Trim sprite kanter,Przycinanie krawędzi sprite'ów,Cortar bordas de sprites,,Tundere margini sprite-uri,Обрезание краёв спрайтов,Подсећи ивице спрајтова,Trimma sprite-kanter,Sprite kenarlarını kırpma, +Sort draw lists by texture,GLTEXMNU_SORTDRAWLIST,,,,Seřadit vykreslování podle textury,Sortere tegningslister efter tekstur,Renderlisten nach Textur sortieren,,Ordigi desegnado-listojn laŭ teksturo,Ordenar tablas por textura,,Lajittele piirtotaulut pintakuvioinneittain,Ordonner liste de rendu par texture,,Textúra szerinti kirajzolási lista,Ordina la lista draw per texture,テクスチャーから描画リストを分類,텍스처별로 생성 목록 정렬,Tekeninglijsten sorteren op textuur,Sorter tegningslister etter tekstur,Sortowanie list renderowania wdług tekstur,Organizar listas de renderização por textura,,Sortează listele de texturi,Сортировать списки текстур,Сортирано цртај листе од текстуре,Sortera ritningslistor efter textur,Çizim listelerini dokuya göre sıralama, +Dynamic Lights,GLLIGHTMNU_TITLE,,,,Dynamická světla,Dynamisk lys,Dynamische Lichter,,Dinamikaj lumoj,Luces dinámicas,,Dynaamiset valot,Lumières Dynamiques,,Dinamikus Fények,Luci Dinamiche,ダイナミックライト,다이나믹 라이트,Dynamische verlichting,Dynamiske lys,Dynamiczne Oświetlenie,Luzes Dinâmicas,,Lumini Dinamice,Динамическое освещение,Динамичко осветљење,Dynamiska lampor,Dinamik Işıklar, +Dynamic Lights (Hardware),GLLIGHTMNU_LIGHTSENABLED,,,,Dynamická světla (hardware),Dynamisk lys (hardware),Dynamische Lichter (Hardware),,Dinamikaj lumoj (Aparataro),Luces dinámicas (Hardware),,Dynaamiset valot (laitteistokiihdytys),Lumières Dynamiques (Hardware),,Dinamikus Fények (hardveres),Luci Dinamiche (Hardware),ダイナミックライト(OpenGL),다이나믹 라이트(오픈지엘),Dynamische verlichting (hardware),Dynamiske lys (maskinvare),Dynamiczne Oświetlenie (Sprzętowe),Luzes Dinâmicas (Hardware),,Lumini Dinamice (OpenGL),Динамическое освещение (аппаратное),Динамичко осветљење (хардвер),Dynamiska lampor (maskinvara),Dinamik Işıklar (Donanım), +Enable light definitions,GLLIGHTMNU_LIGHTDEFS,,,,Povolit definice světel,Aktiver lysdefinitioner,Lichtdefinitionen an,,Ŝalti lumdifinojn,Activar definiciones de luz,,Ota käyttöön valomääritykset,Activer les définitions de lumière,,Fény részletesség,Abilita le definizioni GLDEFS,ライト定義 許可,조명 선명도 사용,Lichtdefinities mogelijk maken,Aktiver lysdefinisjoner,Włącz definicje światła,Habilitar definições de luz,Permitir definições de luz,Activează definiții lumini,Включить определения света,Омогући светлосне дефиниције,Aktivera ljusdefinitioner,Işık tanımlarını etkinleştirin, +Lights affect sprites,GLLIGHTMNU_LIGHTSPRITES,,,,Světla ovlivňují sprity,Lys påvirker sprites,Sprites werden beleuchtet,,Lumoj efikas mov-rastrumojn,Las luces afectan a los «sprites»,,Valot vaikuttavat spriteihin,Lumières affectent les sprites,,A fény hatással van a sprite-okra,Le luci influiscono sugli sprite,ライトがスプライトに影響,조명에 영향받는 스프라이트,Lichten beïnvloeden sprites,Lys påvirker sprites,Światło ma wpływ na sprite'y,Luzes afetam sprites,,Luminile afectează sprite-urile,Освещать спрайты,Светло утиче на спрајтове,Ljus påverkar sprites,Işıklar sprite'ları etkiler, +Lights affect particles,GLLIGHTMNU_LIGHTPARTICLES,,,,Světla ovlivňují částice,Lys påvirker partikler,Partikel werden beleuchtet,,Lumoj efikas partiklojn,Las luces afectan a las partículas,,Valot vaikuttavat hiukkasiin,Lumières affectent les particules,,A fény hatással van a részecskékre,Le luci influiscono sulle particelle,ライトがパーティクルに影響,조명에 영향받는 입자들,Lichten beïnvloeden deeltjes,Lys påvirker partikler,Światło ma wpływ na cząsteczki,Luzes afetam partículas,,Luminile afectează particulele,Освещать частицы,Светло утиче на честице,Ljus påverkar partiklar,Işıklar parçacıkları etkiler, +Light shadowmaps,GLLIGHTMNU_LIGHTSHADOWMAP,,,,Mapy stínů,Lys skyggemapper,Shadowmaps für Lichter,,Lum-ombro-mapoj,Mapeo de sombra de luz,,Valojen varjokartat,Shadowmaps,,,Ombre proiettate,ライトのシャドウマッピング,조명에 영향받는 섀도우맵,Lichte schaduwkaarten,Lys skyggekart,Oświetlenie map cieni,Shadowmaps,,Umbre lumini,Карты светотеней,Светло мапе сенки,Ljusskuggor,Işık gölge haritaları, +Shadowmap quality,GLLIGHTMNU_LIGHTSHADOWMAPQUALITY,,,,Kvalita map stínů,Shadowmap-kvalitet,Shadowmap Qualität,,Kvalito de ombro-mapo,Calidad de mapeo de sombras,,Varjokarttojen laatu,Qualité Shadowmap,,Shadowmap minőség,Qualità ombre proiettate,シャドウマップ 品質,섀도우맵 퀄리티,Schaduwkaart kwaliteit,Shadowmap-kvalitet,Jakość map cieni,Qualidade de shadowmap,,Calitate umbre,Качество карт светотеней,Мапа сенки квалитет,Skuggmappens kvalitet,Gölge haritası kalitesi, +Shadowmap filter,GLLIGHTMNU_LIGHTSHADOWMAPFILTER,,,,Filtrování map stínů,Skyggemap-filter,Shadowmap Filter,,Filtro de ombro-mapo,Filtro de mapeo de sombras,,Varjokarttojen suodatus,Filtre de Shadowmaps,,,Filtro ombre proiettate,シャドウマップ フィルター,섀도우맵 필터,Schaduwkaart filter,Shadowmap-filter,Filtr map cieni,Filtro de shadowmap,,Filtru umbre,Фильтр карт светотеней,Мапа сенки филтер,Filter för skuggmappor,Gölge haritası filtresi, +Fog mode,GLPREFMNU_FOGMODE,,,,Režim mlhy,Tågetilstand,Nebelmodus,,Reĝimo de nebulo,Modo de niebla,,Sumutila,Mode du broullard,,Köd mód,Modalità nebbia,フォグモード,안개 모드,Mistmodus,Tåke-modus,Tryb mgły,Modo de neblina,,Mod ceață,Режим тумана,Магла мод,Dimläget,Sis modu, +Fog forces fullbright,GLPREFMNU_FOGFORCEFULLBRIGHT,,,,Mlha vynucuje plný jas,Tåge tvinger fullbright,Nebel erzwingt volle Helligkeit,,Nebulo devigas plenbrilon,Forzar brillo completo en niebla,,Sumu pakottaa täyskirkkauden,Brouillard force fullbright,,Köd Fullbright-ot erőltet ki,La nebbia forza piena luce,濃霧は明るさ最大,안개를 최대한 강제로 밝힘,Mistkrachten volle lichtsterkte,Tåke styrker fullbright,Mgła wymusza pełną jasność,Neblina força brilho máximo,,Ceața forțează luminozitate maximă,Туман включает режим максимальной яркости,Магла присиљава пуну светлост,Dimma tvingar fram full ljusstyrka,Sis fullbright'ı zorlar, +Weapon light strength,GLPREFMNU_WPNLIGHTSTR,,,,Intenzita světel zbraní,Våbenlysstyrke,Waffenlichtstärke,,Lumforteco de armilo,Intensidad de luz de las armas,,Aseiden valovoima,Intensité lumineuse des armes,,Fegyver lövés fényerősség,Intensità luminosa dell'arma,武器ライトの強さ,무기 빛 강도,Sterkte van het wapenlicht,Våpen lysstyrke,Natężenie światła broni,Intensidade de luz da arma,,Intensitate lumină armă,Интенсивность вспышек оружия,Блага снага оружја,Vapenljusets styrka,Silah ışık gücü, +Environment map on mirrors,GLPREFMNU_ENVIRONMENTMAPMIRROR,,,,Mapa prostředí na zrcadlech,Miljøkort på spejle,Lichteffekt auf Spiegeln,,Medimapo sur speguloj,Mapa de entorno en espejos,,Ympäristökartta peileissä,Mappage environment sur les miroirs,,Környezeti mappolás a tükrökön,Ambiente mappa sui riflessi,マップオンミラーの画像表示,거울 주변의지도 활성,Milieukaart op spiegels,Omgivelseskart på speil,Mapa środowiska w lustrach,Mapa de ambiente em espelhos,,Reflecții pe oglinzi,Карта окружения на зеркалах,Околинска мапа на прозорима,Miljökarta på speglar,Aynalar üzerinde çevre haritası, +Enhanced night vision mode,GLPREFMNU_ENV,,,,Vylepšený režim nočního vidění,Forbedret nattesynstilstand,Verbesserter Nachtsichtmodus,,Plibonigita reĝimo de noktvido,Modo de visión nocturna mejorado,,Paranneltu pimeänäkötila,Mode de vision nocture amélioré,,Felerősített éjjellátó mód,Modalità visione notturna migliorata,バイザーを暗視装置調にする,야시경 효과 향상,Verbeterde nachtzicht modus,Forbedret nattsynsmodus,Ulepszony tryb widzenia w ciemności,Modo de visão noturna avançada,,Vedere infraroșie avansată,Улучшенный режим ночного видения,Побољшана ноћна визија мод,Förbättrat läge för mörkerseende,Geliştirilmiş gece görüş modu, +ENV shows stealth monsters,GLPREFMNU_ENVSTEALTH,,,,Vylepšené noční vidění ukazuje skryté příšery,ENV viser stealth-monstre,Nachtsichtmodus zeigt Stealth-Monster,,ENV montras kaŝiĝitajn monstrojn,ENV muestra enemigos sigilosos,,PPN näyttää näkymättömät hirviöt,VNA affiche monstres invisibles,,ENV felfedi a lopakodó szörnyeket,La VNM mostra i mostri stealth ,暗視バイザーが透明を見破る,스텔스 적 개체를 감지하는 ENV,ENV toont stealth monsters,ENV viser stealth monstre,Ulepszony noktowizor pokazuje ukrywających się przeciwników,Visão noturna mostra monstros invisíveis,,PNV afișează monștri ascunși,ПНВ показывает скрытых монстров,ПНВ показује скривена чудовишта,ENV visar smygande monster,ENV gizli canavarları gösteriyor, +Adjust sprite clipping,GLPREFMNU_SPRCLIP,,,,Vyladění clippingu spritů,Juster sprite clipping,Sprite Clipping,,Agordi trairadon de mov-rastrumoj,Ajustar recortado de sprites,,Spritejen asettelu,Adjusted le clipping des sprites,,Sprite átlógás igazítása,Aggiusta il clipping degli sprite,スプライトのずらしを調整する,스프라이트 클리핑 조정,Sprite clipping,Juster sprite klipping,Ustaw wcięcie sprite'ów,Ajustar clipping de sprite,,Ajustare poziții sprite-uri,Режим обрезки спрайтов,Подеси спрајт клипинг,Justera sprite clipping,Sprite kırpmayı ayarlama, +Smooth sprite edges,GLPREFMNU_SPRBLEND,,,,Vyhladit okraje spritů,Udglatte sprite-kanter,Glätte Spritekanten,,Glatigi randojn de mov-rastrumoj,Suavizar bordes de sprites,,Pehmeät spritejen reunat,Adoucir bords des sprites,,Sprite szélek simítása,Smussa gli angoli degli sprite,スプライトの角を丸める,부드러운 스프라이트 모서리,Gladde sprite randen,Glatte sprite kanter,Gładkie krawędzie sprite'ów,Suavizar bordas de sprites,,Netezire margini sprite-uri,Размытие краёв спрайтов,Углачати ивице спрајта,Slätar ut sprite-kanter,Düzgün sprite kenarları, +Fuzz Style,GLPREFMNU_FUZZSTYLE,,,,Styl šumu,Fuzz-stil,Fuzz Stil,,Stilo de Lenugo,Estilo de difuminación,,Sumennustyyli,Style de bruit blanc,,Homályosítás stílusa,Stile fuzz,ファズスタイル,퍼즈 스타일,Fuzz stijl,Fuzz-stil,Styl Szumu,Estilo de difusão,,Stil sclipire,Тип шума,Фаз стајл,Fuzz stil,Fuzz Tarzı, +Sprite billboard,GLPREFMNU_SPRBILLBOARD,,,,Orientace spritů,,Spriteausrichtung,,Liniigi mov-rastrumojn,Alineado de sprites,,Spritetaulu,Etalage des sprites,,Sprite alapú reklámtábla,,スプライト ビルボード,스프라이트 샘플링,,,Wyrównanie Sprite'ów,Alinhamento de sprite,,Rotire sprite-uri,Привязка по осям спрайтов,Спрајт билборд,,Sprite reklam panosu, +Sprites face camera,GLPREFMNU_SPRBILLFACECAMERA,,,,Sprity čelí kameře,Sprites vender mod kameraet,Sprites zur Kamera ausrichten,,Mov-rastrumoj ĉiam rigardas vian kameraon,Los sprites miran a la cámara,,Spritet suuntaavat kameraan,Sprites font face à la caméra,,Sprite alapú kamera,Gli sprite sono rivolti alla telecamera.,スプライトのフェイスカメラ,카메라를 향한 스프라이트,Sprites gezicht camera,Sprites vender mot kameraet,Sprite'y skierowane w kamerę,Sprites de frente para a câmera,,Sprite-urile privesc înspre cameră,Спрайты направлены к камере,Спрајт камера фаце,Sprites vänder sig mot kameran,Sprite'lar kamerayla yüzleşir, +Particle style,GLPREFMNU_PARTICLESTYLE,,,,Styl částic,Partikelstil,Partikelstil,,Partikla stilo,Estilo de partículas,,Hiukkastyyli,Style de particules,,Részecske stílusa,Stile particelle,パーティクル スタイル,입자 스타일,Deeltjes stijl,Partikkel-stil,Styl Cząsteczek,Tipo de partícula,,Stil particule,Тип частиц,Честице стајл,Partikelstil,Parçacık stili, +Rendering quality,GLPREFMNU_RENDERQUALITY,,,,Kvalita vykreslování,Renderingskvalitet,Renderqualität,,Kvalito de bildigado,Calidad de Renderizado,,Hahmonnuslaatu,Qualité du rendu,,Renderelés minősége,Qualità resa grafica,レンダリング品質,렌더링 품질,Het teruggeven van kwaliteit,Renderingskvalitet,Jakość Renderowania,Qualidade de renderização,,Calitate video,Качество обработки,Квалитет рендовања,Renderingskvalitet,Render kalitesi, +Stereo 3D VR,GLPREFMNU_VRMODE,,,,,,,,Duvida 3D VR,Modo Stereo 3D VR,,,3D VR Stéréo,,,,ステレオ3DのVR,VR 입체 스테레오 사용,,,,3D Estéreo (VR),,Mod VR,Стерео 3D VR-режим,Стереотоно 3D VR,,, +Enable Quad Stereo,GLPREFMNU_VRQUADSTEREO,,,,Povolit Quad Stereo,Aktiver Quad Stereo,Quad Stereo aktivieren,,Ŝalti Kvaroblo-Stereon,Activar Quad Stereo,,Ota käyttöön Quad Stereo,Activer Quad Stereo,,Quad Sztereó bekapcsolása,Abilita il Quad Stereo,クァッドステレオを有効,쿼드 스테레오 사용,Quad Stereo inschakelen,Aktiver Quad Stereo,Włącz Poczwórne Stereo,Habilitar Quad Stereo,Permitir Quad Stereo,Activare Quad Stereo,Четырёхкратный стереорежим,Омогући четвороструки стерео,Aktivera Quad Stereo,Dörtlü Stereoyu Etkinleştir, +Banded SW Lightmode,GLPREFMNU_SWLMBANDED,,,,Režim pruhovaného SW osvětlení,Båndede SW-lystilstand,Gebänderter SW-Lichtmodus,,Reĝimo de Bendiga Lumo de Programbildigo,Modo de luz por bandas de SW,,Kaistoitettu ohjelmistoväritila,Lumière bandées en Software,,,Lightmode software bandata,バンデドSWライトモード,단결된 SW 라이트 모드,SW-lichtmodus met banden,Båndet SW-lysmodus,Naznaczony Tryb Oświetlenia Oprogramowania,Modo de luz por bandas em software,,Mod limitat de iluminare Software,Программный режим освещения полосами,Повезани SW режим осветљења,SW Ljusläge i bandform,Bantlı SW Işık Modu, +Distance Between Your Eyes,GLPREFMNU_VRIPD,,,,Vzdálenost mezi očima,Afstand mellem øjnene,Abstand zwischen den Augen,,Distanco Inter Viaj Okuloj,Distancia entre tus ojos,,Silmiesi etäisyys toisistaan,Distance entre vos yeux,,Szemek közötti távolság,Distranza tra i tuoi occhi,自分の目との距離,시야 간의 거리,Afstand tussen uw ogen,Avstand mellom øynene dine,Odległość Pomiędzy Twoimi Oczami,Distância entre os olhos,,Distanța dintre ochi,Расстояние между глазами,Даљина између твојих очију,Avstånd mellan ögonen,Gözleriniz Arasındaki Mesafe, +Distance From Your Screen,GLPREFMNU_VRSCREENDIST,,,,Vzdálenost od obrazovky,Afstand fra din skærm,Abstand vom Bildschirm,,Distanco De Via Ekrano,Distancia desde tu pantalla,,Etäisyys ruudullesi,Distance entre vous et l'écran,,Képernyőtől mért távolság,Distanza dal tuo schermo,画面からの距離,화면과의 거리,Afstand van uw scherm,Avstand fra skjermen,Odległość Od Twojego Ekranu4,Distância a partir da tela,,Distanța față de ecranul tău,Расстояние от экрана,Даљина од окрена,Avstånd från skärmen,Ekranınızdan Uzaklık, +Smart,OPTVAL_SMART,,,,Chytré,,,,Inteligenta,Inteligente,,Älykäs,Intelligent,,Okos,Intelligente,スマート,자동 조정,Slim,,Mądry,Inteligente,,Inteligent,Умный,Паметно,,Akıllı, +Smarter,OPTVAL_SMARTER,,,,Chytřejší,Smartere,,,Pli inteligenta,Más inteligente,,Älykkäämpi,+ Intelligent,,Okosabb,Ancora più intelligente,よりスマート,고급 자동 조정,Slimmer,Smartere,Mądrzejszy,Mais inteligente,,Mai inteligent,Умнее,Паметније,Smartare,Daha Akıllı, +Infrared only,OPTVAL_INFRAREDONLY,,,,Pouze infračervené,Kun infrarødt,Nur Infrarot,,Nur transruĝa,Solo infrarrojo,,Vain infrapuna,Vis. Noct. Seulement,,Csak az infravörösnél,Solo infrarossi,赤外線のみ,야시경만,Alleen infrarood,Kun infrarød,Tylko Podczerwień,Somente infravermelho,,Doar în infraroșu,Только инфракрасный,Само инфрацрвена,Endast infrarött ljus,Sadece kızılötesi, +Infrared and torch,OPTVAL_INFRAREDANDTORCH,,,,Infračervené a pochodeň,Infrarød og lommelygte,Infrarot und Fackel,,Transruĝa kaj torĉo,Infrarrojo y antorcha,,Vain infrapuna ja soihtu,Iis Noct. & Torche,,Infravörös és fáklya,Infrarossi e torcia,赤外線と松明,야시경과 횃불만,Infrarood en fakkels,Infrarød og lommelykt,Tylko Podczerwień i Pochodnie,Infravermelho e tocha,,Infraroșu si torță,Инфракрасный и факел,Инфрацрвена/бакља,Infraröd och ficklampa,Kızılötesi ve fener, +Any fixed colormap,OPTVAL_ANYFIXEDCOLORMAP,,,Any fixed colourmap,Jakákoli fixní mapa barev,Alle lyseffekter,Alle Lichteffekte,,Iu ajn fiksita kolormapo,Cualquier mapa de color fijo,,Mikä tahansa kiinteä värikartta,N'importe quelle colormap,,Bármely fixált colormap,Ogni colormap fissata,任意の固定カラーマップ,고정된 컬러맵만,Elke vaste colormap,Alle faste fargekart,Którekolwiek naprawione mapy kolorów,Qualquer colormap fixo,,Orice colormap,Любая заданная цветовая карта,Било која поправљена табела боја,Alla fasta färgkartor,Herhangi bir sabit renk haritası, +Use as palette,OPTVAL_USEASPALETTE,,,,Použít jako paletu,Brug som palet,Benutze als Palette,,Uzi kiel paletro,Usar como paleta,,Käytä palettina,Utiliser comme pallette,,Palettaként használat,Utilizza come palette,パレットとして使用,팔레트로 적용,Gebruik als palet,Bruk som palett,"Użyj jako palety ",Usar como paleta,Usar como palete,Utilizare drept paletă,Использовать как палитру,Користи као палету,Används som palett,Palet olarak kullanın, -Blend,OPTVAL_BLEND,,,,Míchat,,Überblenden,,Miksi,Mezclar,,Sekoitus,Mélanger,Kever,Miscela,混合,혼합,Mengen,Blanding,Połącz,Mesclar,Misturar,Amestec,Смешать,Бленд,Blanda,Karışım, -Bright,OPTVAL_BRIGHT,,,,Světlý,Lys,Hell,,Hela,Brillante,,Kirkas,Clair,Világos,Chiara,明るい,밝은,Helder,Lys,Jasne,Claro,,Luminos,Яркий,Свијетло,Ljusa,Parlak, -Dark,OPTVAL_DARK,,,,Tmavý,Mørk,Dunkel,,Malhela,Oscuro,,Tumma,Sombre,Sötét,Scura,暗い,어두운,Donker,Mørk,Ciemne,Escuro,,Întunecat,Тёмный,Тамно,Mörk,Karanlık, -Doom Legacy,OPTVAL_LEGACY,"This refers to the Doom Legacy port, not a legacy lighting style!",,,,,,,,,,,,,,,,,,,,,,,,,, -Software,OPTVAL_SOFTWARE,,,,,,,,Programa bildigilo,,,Ohjelmisto,,Szoftver,,ソフトウェア,소프트웨어,,,Oprogramowanie,,,,Программный,Софтвер,Programvara,Yazılım, -Optimal,OPTVAL_OPTIMAL,,,,Optimální,,,,Optima,Óptimo,,Optimaalinen,Optimiser,Optimális,Ottimale,最適,최적함,Optimaal,,Optymalne,Otimizado,,Optim,Оптимальный,Оптимал,Optimal,Optimal, -Y Axis,OPTVAL_YAXIS,,,,Po ose Y,Y-akse,Y-Achse,,Y-Akso,Eje Y,,Y-akseli,Axe Y,Y tengely,Asse Y,縦軸,Y 축,Y-as,Y-akse,Oś Y,Eixo Y,,Axa Y,По горизонтали,Y оса,Y-axeln,Y Ekseni, -X/Y Axis,OPTVAL_XYAXIS,,,,Po osách X/Y,X/Y-akse,X/Y-Achse,,X/Y-Akso,Ejes X/Y,,X- ja Y-akselit,Axes X/Y,X/Y tengely,Asse X/Y,縦/横軸,X/Y 축,X/Y As,X/Y-akse,Oś X/Y,Eixo X/Y,,Axa Y/Z,По обеим осям,X/Y оса,X/Y-axel,X/Y Ekseni, -Square,OPTVAL_SQUARE,,,,Čtvercové,Firkantet,Quadratisch,,Kvadrata,Cuadrado,,Kulmikas,Carrées,Négyzet,Quadrato,平方,정사각형,Vierkant,Firkantet,Kwadrat,Quadrado,,Pătrat,Квадратные,Квадрат,Kvadratisk,Kare, -Round,OPTVAL_ROUND,,,,Kulaté,Rund,Rund,,Ronda,Redondo,,Pyöreä,Rondes,Kör,Arrotondato,円形,원형,Rond,Rund,Okrągłe,Redondo,,Rotund,Круглые,Круг,Rund,Yuvarlak, -Radial,OPTVAL_RADIAL,,,,Radiální,,,Ακτινικό,Radiusa,,,Säteittäinen,,Sugaras,Radiale,放射状,방사형,Radiaal,,Promieniowe,,,Radială,Радиальный,Радијално,Radial,Radyal, -Pixel fuzz,OPTVAL_PIXELFUZZ,,,,Pixelový fuzz,,Pixel,Pixel θολούρα,Bildera lanugo,Difuminado pixelado,,Kuvapistesumennus,Bruit Pixélisé,Pixeles homály,Fuzz pixelato,ピクセル ファズ,픽셀 퍼즈,Pixel fuzz,,Szum pikseli,Difuso pixelado,,Puf,Пиксельный шум,Пикселизовани фаз,,Piksel fuzz, -Smooth fuzz,OPTVAL_SMOOTHFUZZ,,,,Hladký fuzz,Glat fuzz,Glatt,Ομαλή θολούρα,Glata lanugo,Difuminado borroso,,Pehmeä sumennus,Bruit doux,Simított homály,Fuzz liscio,滑らかなファズ,부드러운 퍼즈,Gladde fuzz,Glatt fuzz,Wygładzony szum,Difuso suavizado,,Lin,Гладкий шум,Глатки фаз,Slät fuzz,Pürüzsüz fuzz, -Swirly fuzz,OPTVAL_SWIRLYFUZZ,,,,Míchající fuzz,Svirklende fuzz,Gewirbelt,Περιστροφηκή θολούρα,Kirla lanugo,Difuminado en remolino, ,Pyörteinen sumennus,Bruit marbré,Örvénylő homály,Fuzz vorticoso,渦状ファズ,소용돌이 퍼즈,Zwerpend fuzz,Virvlende fuzz,Wirujący szum,Difuso encaracolado,,Vârtej,Кружащийся шум,Увртен фаз,Virvlande fuzz,Girdaplı fuzz, -Translucent fuzz,OPTVAL_TRANSLUCENTFUZZ,,,,Průhledný fuzz,Gennemskinnelig fuzz,Transparent,Ημιδιαφανής θολούρα,Diafana lanugo,Difuminado Translúcido,,Läpikuultava sumennus,Bruit transparent,Áttetsző homály,Fuzz traslucido,半透明ファズ,반투명 퍼즈,Doorschijnende fuzz,Gjennomsiktig fuzz,Przezroczysty szum,Difuso translúcido,,Transparent,Прозрачный шум,Прозрачан фаз,Genomskinlig fuzz,Yarı saydam fuzz, -Noise,OPTVAL_NOISE,,,,Šum,Støj,Rauschen,Ήχος,Bruo,Ruido,,Kohina,Neige,Zaj,Rumore,ノイズ,노이즈,Lawaaierige fuzz,Støy,Huk,Ruído,,Zgomot,Шум,Звук,Buller,Gürültü, -Smooth Noise,OPTVAL_SMOOTHNOISE,,,,Hladký šum,Glat støj,Geglättetes Rauschen,Ομαλός ήχος,Glata Bruo,Ruido borroso,,Pehmeä kohina,Neige adoucie,Simított zaj,Rumore liscio,滑らかなノイズ,부드러운 노이즈,Gladde lawaaierige fuzz,Glatt støy,Wugładzony huk,Ruído suavizado,,Zgomot lin,Мягкий шум,Милозвучан звук,Slätt brus,Yumuşak Gürültü, -Jagged fuzz,OPTVAL_JAGGEDFUZZ,,,,Zubatý šum,Skarpt fuzz,Gezackt,Ζαρομένη θολούρα,Malglateca lanugo,Difuminado dentado,,Sahalaitainen sumennus,Neige rugeuse,Recés homály,Fuzz frastagliato,ギザギザ,들쭉날쭉한 퍼즈,Gekartelde fuzz,Takkete fuzz,Poszarpany szum,Difuso serrilhado,,Zimțat,Зазубренный шум,Назубљен фаз,Skarvig fuzz,Pürüzlü fuzz, -Green/Magenta,OPTVAL_GREENMAGENTA,,,,Zelená/purpurová,Grøn/Magenta,Grün/Magenta,Πράσινο/Magenta,Verda/Magenta,Verde/Magenta,,Vihreä/Magenta,Vert/Magenta,Zöld/Magenta,Verde/Magenta,緑/紫,초록/심홍색,Groen/Magenta,Grønn/magenta,Zielony/Magenta,Verde/Magenta,,Verde/Purpuriu,Зелёный/пурпурный,Зелен/Магента,Grön/Magenta,Yeşil/Macenta, -Red/Cyan,OPTVAL_REDCYAN,,,,Červená/tyrkysová,Rød/Cyan,Rot/Cyan,Κόκινο/Κυανό,Ruĝa/Cejana,Rojo/Cian,,Punainen/Sinivihreä,Rouge/Bleu,Piros/Türkiz,Rosso/Ciano,赤/空,빨강/하늘색,Rood/Cyaan,Rød/cyan,Czerwony/Błękitny,Vermelho/Ciano,,Roșu/Turcoaz,Красный/голубой,Црвен/Цијан,Röd/Cyan,Kırmızı/Mavi, -Amber/Blue,OPTVAL_AMBERBLUE,,,,Oranžová/modrá,Rav/blå,Orange/Blau,Amber/Μπλέ,Sukcenokolora/Blua,Ámbar/Azul,,Ruskeankeltainen/Sininen,Ambre/Bleu,Sárga/Kék,Ambra/Blu,黄/青,황토/파랑색,Amber/Blauw,Rav/blå,Bursztynowy/Niebieski,Âmbar/Azul,,Chihlimbar/Albastru,Янтарный/синий,Ћилибарски/Плаво,Bärnsten/blått,Kehribar/Mavi, -Left Eye,OPTVAL_LEFTEYE,,,,Levé oko,Venstre øje,Linkes Auge,Αριστερό μάτι,Maldekstra Okulo,Ojo izquierdo,,Vasen silmä,Oeil Gauche,Bal szem,Occhio sinistro,左目,왼쪽 눈,Linkeroog,Venstre øye,Lewe Oko,Olho Esquerdo,,Ochi Stâng,Левый глаз,Лево око,Vänster öga,Sol Göz, -Right Eye,OPTVAL_RIGHTEYE,,,,Pravé oko,Højre øje,Rechtes Auge,Δεξί μάτι,Dekstra Okulo,Ojo derecho,,Oikea silmä,Oeil Droit,Jobb szem,Occhio destro,右目,오른쪽 눈,Rechteroog,Høyre øye,Prawe Oko,Olho Direito,,Ochi drept,Правый глаз,Десно око,Höger öga,Sağ Göz, -Side-by-side Full,OPTVAL_SBSFULL,,,,"Vedle sebe, plné",Side ved side i fuld bredde,Nebeneinander volle Breite,,Flank-ĉe-flanka Tuta,Lado a lado completo,,Täysi rinnakkaisasettelu,Côte-â-côte Complet,Egymás melletti Teljes,Fianco a fianco completo,両サイド フル,크게 좌우배치,Zij-aan-zij Volledig,Side-ved-side Full,Pełne Obok Siebie,Lado a lado completo,,Una lângă alta Pline,"Бок о бок, полно",Раме уз раме цело,Sidoordnat fullt ut,Yan yana Tam, -Side-by-side Narrow,OPTVAL_SBSNARROW,,,,"Vedle sebe, úzké",Side ved side i halv bredde,Nebeneinander halbe Breite,,Flank-ĉe-flanka Mallarĝa,Lado a lado estrecho,,Kapea rinnakkaisasettelu,Côte-â-côte étroit,Egymás melletti Szűk,Fianco a fianco stretto,両サイド ナロー,좁게 좌우배치,Zij-aan-zij smal,Side ved side Smal,Wąskie Obok Siebie,Lado a lado estreito,,Una lângă alta Înguste,"Бок о бок, узко",Раме уз раме уско,Sidoväggar smal,Yan yana Dar, -Top/Bottom,OPTVAL_TOPBOTTOM,,,,Nad sebou,Øverst/underst,Übereinander,Πάνω/Κάτω,Supero/Subo,Superior/Inferior,,Ylä-/Alaosa,Dessus/Dessous,Fent/Lent,Sopra/Sotto,天/底,위/아래,Boven/onderkant,Topp/Bunn,Góra/Dół,Superior/Inferior,,Sus/Jos,Сверху/снизу,Врх/Дно,Överst/underst,Üst/Alt, -Row Interleaved,OPTVAL_ROWINTERLEAVED,,,,Po řádcích,Forskydning af rækker,Zeilenversetzt,,Vicoj interteksitaj,Fila intercalada,,Vaakalomitus,Entrelacement rangée,Sor beillesztés,Riga interfogliata,行インターリーブ,열 교차 배치,Rij interleaved,Rad sammenflettet,Przepleciony Szereg,Linha Intercalada,,Rând intercalat,Чередование строк,Редно прошарано,Rad med interfolierad rad,Satır Aralıklı, -Column Interleaved,OPTVAL_COLUMNINTERLEAVED,,,,Po sloupcích,Forskydning af kolonner,Spaltenversetzt,,Kolonoj interteksitaj,Columna intercalada,,Pystylomitus,Entralcement colonne,Oszlop beillesztés,Colonna interfogliata,列インターリーブ,세로줄 교차 배치,Kolom Interleaved,Kolonne sammenflettet,Przepleciona Kolumna,Coluna Intercalada,,Coloană intercalată,Чередование столбцов,Колонско прошарано,Kolumn interfolierad,Sütun Aralıklı, -Checkerboard,OPTVAL_CHECKERBOARD,,,,Šachovnice,Ternet,Schachbrettmuster,,Ŝaktablo,Tablero de damas,,Shakkilautakuvio,Damier,Tábla,Scacchiere,市松模様,체크무늬,Dambord,Sjakkbrett,Szachownica,Xadrez,,Tablă de Șah,Шахматная доска,Шаховска табла,Tärningsbräda,Dama Tahtası, -Quad-buffered,OPTVAL_QUADBUFFERED,,,,Quad buffer,Quad-buffered,Vierfachgepuffert,,Kvarobla bufro,Cuádruple búfer,,Neloispuskurointi,Quadruple-tampon,Négyszeresen bufferelt,Quad buffer,クワッドバッファー,쿼드 버퍼,Viervoudig gebufferd,Firebufret,Poczwórnie zbuforowane,Buffer quádruplo,,Împătrit,Четырёхкратный,Квад-унапређено,Kvadratbuffrad,Dört tamponlu, -TrueColor Options,DSPLYMNU_TCOPT,,,,Nastavení True color,TrueColor-indstillinger,TrueColor Optionen,TrueColor Ρυθμίσεις,Plenkolora Agordoj,Opciones TrueColor,,TrueColor-asetukset,Options TrueColor,TrueColor Beállítások,Opzioni TrueColor,トゥルーカラー オプション,트루 컬러 설정,TrueColor Opties,TrueColor-alternativer,Opcje TrueColor,Opções de TrueColor,,Setări Mod Culori Complete,Полноцветный режим,Подешавања правих боја,TrueColor-alternativ,TrueColor Seçenekleri, -TrueColor Options,TCMNU_TITLE,,,,Nastavení True color,TrueColor-indstillinger,TrueColor Optionen,TrueColor Ρυθμίσεις,Plenkolora Agordoj,Opciones TrueColor,,TrueColor-asetukset,Options TrueColor,TrueColor Beállítások,Opzioni TrueColor,トゥルーカラー オプション,트루 컬러 설정,TrueColor Opties,TrueColor-alternativer,Opcje TrueColor,Opções de TrueColor,,Setări Mod Culori Complete,Настройки полноцветности,Подешавања правих боја,TrueColor-alternativ,TrueColor Seçenekleri, -True color output,TCMNU_TRUECOLOR,,,,Výstup True color,TrueColor-udgang,TrueColor Ausgabe,TrueColor παραγωγή,Plenkolora eligo,Salida de True color,,True color -ulostulo,Sortie Truecolor,Truecolor Kimenet,Output true color,トゥルーカラー出力,트루 컬러 출력,Ware kleurenoutput,Ekte fargeutgang,Wyjście TrueColor,Saída de true color,,Putere Mod Culori Complete,Полноцветный вывод,Излаз правих боја,Utmatning i äkta färg,Gerçek renk çıkışı, -Linear filter when downscaling,TCMNU_MINFILTER,,,,Lineární filtrování při zmenšení,Lineært filter ved nedskalering,Linearer Filter beim Herunterskalieren,Γραμμικό φίλτρο για σμίκρυνση,Linia filtro kiam subskali,Filtro lineal por reducción,,Lineaarinen suodatin alas skaalatessa,Filtrage linéaire en réduction,Lineáris filterezés leméretezésnél,Filtro lineare per la riduzione,縮小時のリニアフィルター,축소시 선형 필터링함,Lineair filter voor downscaling,Lineært filter ved nedskalering,Liniowy filtr podczas zmniejszania rozmiaru,Filtro linear ao reduzir,,Filtru liniar la micșorare,Линейная фильтрация при уменьшении,Линеарни филтер током смањења,Linjärt filter vid nedskalning,Küçültme sırasında doğrusal filtre, -Linear filter when upscaling,TCMNU_MAGFILTER,,,,Lineární filtrování při zvětšení,Lineært filter ved opskalering,Linearer Filter beim Hochskalieren,Γραμμικό φίλτρο για πολυτέληση,Linia filtro kima superskali,Filtro lineal por escalado,,Lineaarinen suodatin ylös skaalatessa,Filtrage linéaire en agrandissement,Lineáris filterezés felméretezésnél,Filtro lineare per l'aumento,拡大時のリニアフィルター,확대시 선형 필터링함,Lineair filter voor upscaling,Lineært filter ved oppskalering,Liniowy filtr podczas zwiększania rozmiaru,Filtro linear ao aumentar,,Filtru liniar la mărire,Линейная фильтрация при увеличении,Линеарни филтер током повећања,Linjärt filter vid uppskalning,Yükseltme sırasında doğrusal filtre, -Use mipmapped textures,TCMNU_MIPMAP,,,,Použít mipmapy,Brug mipmapped teksturer,Benutze Textur-Mipmaps,Χρήση mipmapped υφών,Uzi mipmapajn teksturojn,Usar texturas con mipmap,,Käytä mipkartallisia pintakuviointeja,Utiliser textures mipmappées,Mipmap textúrák,Usa le texture mipmapped,ミップマップテクスチャを使用,밉맵 텍스쳐 사용,Gebruik mipmapped texturen,Bruk mipmapped teksturer,Użyj mipmapowane tekstury,Usar texturas com mipmapping,,Mip mapping pentru texturi,Применять MIP-текстурирование,Користи мипмаповане текстуре,Använd mipmappade texturer,Eşlenmiş dokular kullanın, -Dynamic lights (Software),TCMNU_DYNLIGHTS,,,,Dynamická světla (software),Dynamisk lys (software),Dynamisches Licht (Software),Δυναμικά φώτα (Λογισμικό),Dinamikaj lumoj (Programbildigilo),Luces dinámicas (Software),,Dynaamiset valot (ohjelmisto),Lumières Dynamiques (Software),Dinamikus fények (szoftveres),Luci Dinamiche (Software),ダイナミックライト (ソフトウェア),다이나믹 라이트 (소프트웨어 버전),Dynamische verlichting (software),Dynamiske lys (programvare),Dynamiczne Światło (Oprogramowanie),Luzes Dinâmicas (Software),,Lumini Dinamice (Mod Software),Динамическое освещение (программное),Динамичко осветљење (софтвер),Dynamiskt ljus (programvara),Dinamik ışıklar (Yazılım), -Option Search,OS_TITLE,,,,Vyhledávání možností,Mulighed Søg,Optionssuche,Αναζήτηση Ρυθμίσεων,Agorda Serĉo,Buscar Opciones,,Asetushaku,Recherche Option,Beállítás Keresés,Opzioni di ricerca,オプション検索,옵션 검색,Optie zoeken,Alternativt søk,Szukanie Opcji,Buscar opção,Procurar opção,Căutare Setări,Поиск настройки,Претрага,Alternativ Sök,Seçenek Arama, -Search for any term,OS_ANY,,,,Hledat jakékoli klíčové slovo,Søg efter et vilkårligt begreb,Suche nach beliebigem Begriff,Αναζήτηση για όποιαδηποτε λέξη,Serĉi por iu ajn termino,Buscar cualquier término,,Etsi mitä tahansa sanaa,N'importe quel mot,Bármilyen szótagra keresés,Cerca per ciascun termine,いずれかの用語を探す,용어 검색,Zoek naar eender welke term,Søk etter et vilkårlig begrep,Szukaj jakiegokolwiek wyrażenia,Buscar por qualquer termo,Procurar por um termo qualquer,Căutare după orice termen,Искать любое из слов,Тражи било коју од речи,Sök efter valfri term,Herhangi bir terim için arama yapın, -Search for all terms,OS_ALL,,,,Hledat všechna klíčová slova,Søg efter alle udtryk,Suche nach allen Begriffen,Αναζήτηση για όλες της λέξεις,Serĉi por ĉiuj terminoj,Buscar todos los términos,,Etsi kaikki sanat,Tous les mots,Összes szótagra keresés,Cerca per tutti i termini,全ての用語を探す,모든 조건 검색,Zoek naar alle termen,Søk etter alle termer,Szukaj wszystkich wyrażeń,Buscar por todos os termos,Procurar por todos os termos,Căutare după toți termenii,Искать все слова,Тражи све речи,Sök efter alla termer,Tüm terimler için arama yapın, -No results found.,OS_NO_RESULTS,,,,Nic nenalezeno.,Ingen resultater fundet.,Keine Resultate,Δέν βρέθηκαν αποτελέσματα,Neniuj rezultoj trovitaj.,Ningun resultado.,,Ei tuloksia.,Pas de résultat trouvé,Nincs keresési találat,Nessun risultato trovato.,見つかりませんでした。,검색 결과 없음.,Geen resultaten gevonden.,Ingen resultater funnet.,Brak wyników,Nenhum resultado encontrado.,,Niciun rezultat găsit.,Результаты не найдены.,Нема резултата.,Inga resultat hittades.,Sonuç bulunamadı., -Search:,OS_LABEL,,,,Hledat:,Søg:,Suche:,Αναζήτηση:,Serĉi:,Buscar:,,Etsi:,Recherche:,Keresés:,Trova:,検索:,검색:,Zoeken:,Søk:,Szukaj:,Busca:,Procura:,Căutare:,Поиск:,Претрага:,Sök:,Arama yapın:, -Always show keys,AUTOMAPMNU_SHOWKEYS_ALWAYS,,,,Vždy zobrazit klíče,Vis altid nøgler,Zeige immer alle Schlüssel,Εμφάνιση πλήκτρων πάντα,Ĉiam montri ŝlosilojn,Mostrar llaves siempre,,Aina näytä avaimet,Toujour afficher clés,Kulcsokat mindig mutat,Mostra sempre le chiavi,常にキーを表示,항상 키들을 표시,Toon altijd de toetsen,Vis alltid nøkler,Zawsze pokazuj klucze,Sempre mostrar chaves,Exibir chaves sempre,Afișează cheile în permanență,Всегда отображать ключи,Увек приказуј кључеве,Visa alltid nycklar,Her zaman anahtarları göster, -,,Newly added content,,,,,,,,,,,,,,,,,,,,,,,,,, -Team changing has been disabled!,TXT_NO_TEAM_CHANGE,,,,Změna týmu je vypnuta!,Holdskift er blevet deaktiveret!,Teamwechsel ist deaktiviert!,Η αλαγγή ομάδον απαγορεύεται!,Teamŝanĝiĝo estas malvalidigita!,¡El cambio de equipo ha sido desactivado!,,Joukkueen vaihtaminen on kytketty pois päältä!,Les changements d'équipe sont désactivés!,Csapatváltás letiltva,È stato disabilitato il cambio di squadra!,チームの変更は受け付けない!,팀 변경이 불가능해짐!,Teamwisseling is uitgeschakeld!,Lagbytte har blitt deaktivert!,Zmiana drużyn została wyłączona!,Troca de equipe foi desativada!,Troca de equipa foi desativada!,Schimbarea echipelor a fost dezactivată!,Смена команды была отключена!,Мењање тима је искључено!,Lagbyte har inaktiverats!,Takım değiştirme devre dışı bırakıldı!, -%s joined the %t team,TXT_JOINED_TEAM,%s is the player and gender sensitive,,,%s se připojil@[ao_cs] k týmu %t.,%s er blevet medlem af %t-team,%s is dem %t Team beigetreten.,@[art_gr] %s έγινε μέλος τής %t ομάδας,%s aliĝis al la %t teamo,%s se unió al equipo %t,,%s liittyi joukkueeseen %t,%s a rejoint l'équipe %t.,%s belépett a %t csapatba,%s entra nel team %t,%s は %t のチームに入隊した,%s 이(가) %s 팀에 합류함,%s zijn bij het %t team gekomen.,%s ble med i %t-teamet,%s dołącza do drużyny %t,%s entrou na equipe %t,,%s s-a alăturat echipei %t,Игрок %s присоединяется к команде %t,%s је уш@[ao_2_sr] у %t тим,%s anslöt sig till %t teamet.,%s %t takımına katıldı, -%s is now a loner.,TXT_LONER,,,,%s je teď @[self_cs].,%s er nu en enspænder.,%s ist jetzt ein@[e_de] Einzelgänger@[in_de].,@[art_gr] %s είναι τώρα μόνο/ς/η @[pro4_gr],%s nun estas solemulo.,%s es ahora solitari@[ao_esp].,,%s on nyt yksikseen.,%s joue maintenant tout seul.,%s immáron magányos útralépett,%s è da solo,%s は今 一匹狼だ。,%s 은(는) 혼자 남음.,%s is nu een eenling.,%s er nå en einstøing.,%s jest teraz sam@[ao_pl],%s está sozinh@[ao_ptb] agora.,,%s este singur acum,Игрок %s теперь одиночка.,%s је сада самотњак.,%s är nu en ensamvarg.,%s artık yalnız., -%s left the game with %d frags,TXT_LEFTWITHFRAGS,,,,%s opustil@[ao_cs] hru s %d fragy,%s forlod spillet med %d frags,%s hat das Spiel mit %d Frags verlassen.,@[art_gr] %s έφυγε με %d κοματιασμόυς,%s eliris el la ludo kun %d ludmurdoj,%s salió de la partida con %d bajas,,%s poistui pelistä frägimäärällä %d,%s a quitté le jeu avec %d frags.,%s kilépett %d fraggel,%s ha lasciato il gioco con %d frag,"%s が逃げ出したので %d に点が入った +Blend,OPTVAL_BLEND,,,,Míchat,,Überblenden,,Miksi,Mezclar,,Sekoitus,Mélanger,,Kever,Miscela,混合,혼합,Mengen,Blanding,Połącz,Mesclar,Misturar,Amestec,Смешать,Бленд,Blanda,Karışım, +Bright,OPTVAL_BRIGHT,,,,Světlý,Lys,Hell,,Hela,Brillante,,Kirkas,Clair,,Világos,Chiara,明るい,밝은,Helder,Lys,Jasne,Claro,,Luminos,Яркий,Свијетло,Ljusa,Parlak, +Dark,OPTVAL_DARK,,,,Tmavý,Mørk,Dunkel,,Malhela,Oscuro,,Tumma,Sombre,,Sötét,Scura,暗い,어두운,Donker,Mørk,Ciemne,Escuro,,Întunecat,Тёмный,Тамно,Mörk,Karanlık, +Doom Legacy,OPTVAL_LEGACY,"This refers to the Doom Legacy port, not a legacy lighting style!",,,,,,,,,,,,,,,,,,,,,,,,,,, +Software,OPTVAL_SOFTWARE,,,,,,,,Programa bildigilo,,,Ohjelmisto,,,Szoftver,,ソフトウェア,소프트웨어,,,Oprogramowanie,,,,Программный,Софтвер,Programvara,Yazılım, +Optimal,OPTVAL_OPTIMAL,,,,Optimální,,,,Optima,Óptimo,,Optimaalinen,Optimiser,,Optimális,Ottimale,最適,최적함,Optimaal,,Optymalne,Otimizado,,Optim,Оптимальный,Оптимал,Optimal,Optimal, +Y Axis,OPTVAL_YAXIS,,,,Po ose Y,Y-akse,Y-Achse,,Y-Akso,Eje Y,,Y-akseli,Axe Y,,Y tengely,Asse Y,縦軸,Y 축,Y-as,Y-akse,Oś Y,Eixo Y,,Axa Y,По вертикали (Y),Y оса,Y-axeln,Y Ekseni, +X/Y Axis,OPTVAL_XYAXIS,,,,Po osách X/Y,X/Y-akse,X/Y-Achse,,X/Y-Akso,Ejes X/Y,,X- ja Y-akselit,Axes X/Y,,X/Y tengely,Asse X/Y,縦/横軸,X/Y 축,X/Y As,X/Y-akse,Oś X/Y,Eixo X/Y,,Axa Y/Z,По вертикали и горизонтали (X/Y),X/Y оса,X/Y-axel,X/Y Ekseni, +Square,OPTVAL_SQUARE,,,,Čtvercové,Firkantet,Quadratisch,,Kvadrata,Cuadrado,,Kulmikas,Carrées,,Négyzet,Quadrato,平方,정사각형,Vierkant,Firkantet,Kwadrat,Quadrado,,Pătrat,Квадратные,Квадрат,Kvadratisk,Kare, +Round,OPTVAL_ROUND,,,,Kulaté,Rund,Rund,,Ronda,Redondo,,Pyöreä,Rondes,,Kör,Arrotondato,円形,원형,Rond,Rund,Okrągłe,Redondo,,Rotund,Круглые,Круг,Rund,Yuvarlak, +Radial,OPTVAL_RADIAL,,,,Radiální,,,Ακτινικό,Radiusa,,,Säteittäinen,,,Sugaras,Radiale,放射状,방사형,Radiaal,,Promieniowe,,,Radială,Радиальный,Радијално,Radial,Radyal, +Pixel fuzz,OPTVAL_PIXELFUZZ,,,,Pixelový fuzz,,Pixel,Pixel θολούρα,Bildera lanugo,Difuminado pixelado,,Kuvapistesumennus,Bruit Pixélisé,,Pixeles homály,Fuzz pixelato,ピクセル ファズ,픽셀 퍼즈,Pixel fuzz,,Szum pikseli,Difuso pixelado,,Puf,Пиксельный шум,Пикселизовани фаз,,Piksel fuzz, +Smooth fuzz,OPTVAL_SMOOTHFUZZ,,,,Hladký fuzz,Glat fuzz,Glatt,Ομαλή θολούρα,Glata lanugo,Difuminado borroso,,Pehmeä sumennus,Bruit doux,,Simított homály,Fuzz liscio,滑らかなファズ,부드러운 퍼즈,Gladde fuzz,Glatt fuzz,Wygładzony szum,Difuso suavizado,,Lin,Гладкий шум,Глатки фаз,Slät fuzz,Pürüzsüz fuzz, +Swirly fuzz,OPTVAL_SWIRLYFUZZ,,,,Míchající fuzz,Svirklende fuzz,Gewirbelt,Περιστροφηκή θολούρα,Kirla lanugo,Difuminado en remolino, ,Pyörteinen sumennus,Bruit marbré,,Örvénylő homály,Fuzz vorticoso,渦状ファズ,소용돌이 퍼즈,Zwerpend fuzz,Virvlende fuzz,Wirujący szum,Difuso encaracolado,,Vârtej,Кружащийся шум,Увртен фаз,Virvlande fuzz,Girdaplı fuzz, +Translucent fuzz,OPTVAL_TRANSLUCENTFUZZ,,,,Průhledný fuzz,Gennemskinnelig fuzz,Transparent,Ημιδιαφανής θολούρα,Diafana lanugo,Difuminado Translúcido,,Läpikuultava sumennus,Bruit transparent,,Áttetsző homály,Fuzz traslucido,半透明ファズ,반투명 퍼즈,Doorschijnende fuzz,Gjennomsiktig fuzz,Przezroczysty szum,Difuso translúcido,,Transparent,Прозрачный шум,Прозрачан фаз,Genomskinlig fuzz,Yarı saydam fuzz, +Noise,OPTVAL_NOISE,,,,Šum,Støj,Rauschen,Ήχος,Bruo,Ruido,,Kohina,Neige,,Zaj,Rumore,ノイズ,노이즈,Lawaaierige fuzz,Støy,Huk,Ruído,,Zgomot,Шум,Звук,Buller,Gürültü, +Smooth Noise,OPTVAL_SMOOTHNOISE,,,,Hladký šum,Glat støj,Geglättetes Rauschen,Ομαλός ήχος,Glata Bruo,Ruido borroso,,Pehmeä kohina,Neige adoucie,,Simított zaj,Rumore liscio,滑らかなノイズ,부드러운 노이즈,Gladde lawaaierige fuzz,Glatt støy,Wugładzony huk,Ruído suavizado,,Zgomot lin,Мягкий шум,Милозвучан звук,Slätt brus,Yumuşak Gürültü, +Jagged fuzz,OPTVAL_JAGGEDFUZZ,,,,Zubatý šum,Skarpt fuzz,Gezackt,Ζαρομένη θολούρα,Malglateca lanugo,Difuminado dentado,,Sahalaitainen sumennus,Neige rugeuse,,Recés homály,Fuzz frastagliato,ギザギザ,들쭉날쭉한 퍼즈,Gekartelde fuzz,Takkete fuzz,Poszarpany szum,Difuso serrilhado,,Zimțat,Зазубренный шум,Назубљен фаз,Skarvig fuzz,Pürüzlü fuzz, +Green/Magenta,OPTVAL_GREENMAGENTA,,,,Zelená/purpurová,Grøn/Magenta,Grün/Magenta,Πράσινο/Magenta,Verda/Magenta,Verde/Magenta,,Vihreä/Magenta,Vert/Magenta,,Zöld/Magenta,Verde/Magenta,緑/紫,초록/심홍색,Groen/Magenta,Grønn/magenta,Zielony/Magenta,Verde/Magenta,,Verde/Purpuriu,Зелёный/пурпурный,Зелен/Магента,Grön/Magenta,Yeşil/Macenta, +Red/Cyan,OPTVAL_REDCYAN,,,,Červená/tyrkysová,Rød/Cyan,Rot/Cyan,Κόκινο/Κυανό,Ruĝa/Cejana,Rojo/Cian,,Punainen/Sinivihreä,Rouge/Bleu,,Piros/Türkiz,Rosso/Ciano,赤/空,빨강/하늘색,Rood/Cyaan,Rød/cyan,Czerwony/Błękitny,Vermelho/Ciano,,Roșu/Turcoaz,Красный/голубой,Црвен/Цијан,Röd/Cyan,Kırmızı/Mavi, +Amber/Blue,OPTVAL_AMBERBLUE,,,,Oranžová/modrá,Rav/blå,Orange/Blau,Amber/Μπλέ,Sukcenokolora/Blua,Ámbar/Azul,,Ruskeankeltainen/Sininen,Ambre/Bleu,,Sárga/Kék,Ambra/Blu,黄/青,황토/파랑색,Amber/Blauw,Rav/blå,Bursztynowy/Niebieski,Âmbar/Azul,,Chihlimbar/Albastru,Янтарный/синий,Ћилибарски/Плаво,Bärnsten/blått,Kehribar/Mavi, +Left Eye,OPTVAL_LEFTEYE,,,,Levé oko,Venstre øje,Linkes Auge,Αριστερό μάτι,Maldekstra Okulo,Ojo izquierdo,,Vasen silmä,Oeil Gauche,,Bal szem,Occhio sinistro,左目,왼쪽 눈,Linkeroog,Venstre øye,Lewe Oko,Olho Esquerdo,,Ochi Stâng,Левый глаз,Лево око,Vänster öga,Sol Göz, +Right Eye,OPTVAL_RIGHTEYE,,,,Pravé oko,Højre øje,Rechtes Auge,Δεξί μάτι,Dekstra Okulo,Ojo derecho,,Oikea silmä,Oeil Droit,,Jobb szem,Occhio destro,右目,오른쪽 눈,Rechteroog,Høyre øye,Prawe Oko,Olho Direito,,Ochi drept,Правый глаз,Десно око,Höger öga,Sağ Göz, +Side-by-side Full,OPTVAL_SBSFULL,,,,"Vedle sebe, plné",Side ved side i fuld bredde,Nebeneinander volle Breite,,Flank-ĉe-flanka Tuta,Lado a lado completo,,Täysi rinnakkaisasettelu,Côte-â-côte Complet,,Egymás melletti Teljes,Fianco a fianco completo,両サイド フル,크게 좌우배치,Zij-aan-zij Volledig,Side-ved-side Full,Pełne Obok Siebie,Lado a lado completo,,Una lângă alta Pline,"Бок о бок, полно",Раме уз раме цело,Sidoordnat fullt ut,Yan yana Tam, +Side-by-side Narrow,OPTVAL_SBSNARROW,,,,"Vedle sebe, úzké",Side ved side i halv bredde,Nebeneinander halbe Breite,,Flank-ĉe-flanka Mallarĝa,Lado a lado estrecho,,Kapea rinnakkaisasettelu,Côte-â-côte étroit,,Egymás melletti Szűk,Fianco a fianco stretto,両サイド ナロー,좁게 좌우배치,Zij-aan-zij smal,Side ved side Smal,Wąskie Obok Siebie,Lado a lado estreito,,Una lângă alta Înguste,"Бок о бок, узко",Раме уз раме уско,Sidoväggar smal,Yan yana Dar, +Top/Bottom,OPTVAL_TOPBOTTOM,,,,Nad sebou,Øverst/underst,Übereinander,Πάνω/Κάτω,Supero/Subo,Superior/Inferior,,Ylä-/Alaosa,Dessus/Dessous,,Fent/Lent,Sopra/Sotto,天/底,위/아래,Boven/onderkant,Topp/Bunn,Góra/Dół,Superior/Inferior,,Sus/Jos,Сверху/снизу,Врх/Дно,Överst/underst,Üst/Alt, +Row Interleaved,OPTVAL_ROWINTERLEAVED,,,,Po řádcích,Forskydning af rækker,Zeilenversetzt,,Vicoj interteksitaj,Fila intercalada,,Vaakalomitus,Entrelacement rangée,,Sor beillesztés,Riga interfogliata,行インターリーブ,열 교차 배치,Rij interleaved,Rad sammenflettet,Przepleciony Szereg,Linha Intercalada,,Rând intercalat,Чередование строк,Редно прошарано,Rad med interfolierad rad,Satır Aralıklı, +Column Interleaved,OPTVAL_COLUMNINTERLEAVED,,,,Po sloupcích,Forskydning af kolonner,Spaltenversetzt,,Kolonoj interteksitaj,Columna intercalada,,Pystylomitus,Entralcement colonne,,Oszlop beillesztés,Colonna interfogliata,列インターリーブ,세로줄 교차 배치,Kolom Interleaved,Kolonne sammenflettet,Przepleciona Kolumna,Coluna Intercalada,,Coloană intercalată,Чередование столбцов,Колонско прошарано,Kolumn interfolierad,Sütun Aralıklı, +Checkerboard,OPTVAL_CHECKERBOARD,,,,Šachovnice,Ternet,Schachbrettmuster,,Ŝaktablo,Tablero de damas,,Shakkilautakuvio,Damier,,Tábla,Scacchiere,市松模様,체크무늬,Dambord,Sjakkbrett,Szachownica,Xadrez,,Tablă de Șah,Шахматная доска,Шаховска табла,Tärningsbräda,Dama Tahtası, +Quad-buffered,OPTVAL_QUADBUFFERED,,,,Quad buffer,Quad-buffered,Vierfachgepuffert,,Kvarobla bufro,Cuádruple búfer,,Neloispuskurointi,Quadruple-tampon,,Négyszeresen bufferelt,Quad buffer,クワッドバッファー,쿼드 버퍼,Viervoudig gebufferd,Firebufret,Poczwórnie zbuforowane,Buffer quádruplo,,Împătrit,Четырёхкратный,Квад-унапређено,Kvadratbuffrad,Dört tamponlu, +TrueColor Options,DSPLYMNU_TCOPT,,,,Nastavení True color,TrueColor-indstillinger,TrueColor Optionen,TrueColor Ρυθμίσεις,Plenkolora Agordoj,Opciones TrueColor,,TrueColor-asetukset,Options TrueColor,,TrueColor Beállítások,Opzioni TrueColor,トゥルーカラー オプション,트루 컬러 설정,TrueColor Opties,TrueColor-alternativer,Opcje TrueColor,Opções de TrueColor,,Setări Mod Culori Complete,Полноцветный режим,Подешавања правих боја,TrueColor-alternativ,TrueColor Seçenekleri, +TrueColor Options,TCMNU_TITLE,,,,Nastavení True color,TrueColor-indstillinger,TrueColor Optionen,TrueColor Ρυθμίσεις,Plenkolora Agordoj,Opciones TrueColor,,TrueColor-asetukset,Options TrueColor,,TrueColor Beállítások,Opzioni TrueColor,トゥルーカラー オプション,트루 컬러 설정,TrueColor Opties,TrueColor-alternativer,Opcje TrueColor,Opções de TrueColor,,Setări Mod Culori Complete,Настройки полноцветности,Подешавања правих боја,TrueColor-alternativ,TrueColor Seçenekleri, +True color output,TCMNU_TRUECOLOR,,,,Výstup True color,TrueColor-udgang,TrueColor Ausgabe,TrueColor παραγωγή,Plenkolora eligo,Salida de True color,,True color -ulostulo,Sortie Truecolor,,Truecolor Kimenet,Output true color,トゥルーカラー出力,트루 컬러 출력,Ware kleurenoutput,Ekte fargeutgang,Wyjście TrueColor,Saída de true color,,Putere Mod Culori Complete,Полноцветный вывод,Излаз правих боја,Utmatning i äkta färg,Gerçek renk çıkışı, +Linear filter when downscaling,TCMNU_MINFILTER,,,,Lineární filtrování při zmenšení,Lineært filter ved nedskalering,Linearer Filter beim Herunterskalieren,Γραμμικό φίλτρο για σμίκρυνση,Linia filtro kiam subskali,Filtro lineal por reducción,,Lineaarinen suodatin alas skaalatessa,Filtrage linéaire en réduction,,Lineáris filterezés leméretezésnél,Filtro lineare per la riduzione,縮小時のリニアフィルター,축소시 선형 필터링함,Lineair filter voor downscaling,Lineært filter ved nedskalering,Liniowy filtr podczas zmniejszania rozmiaru,Filtro linear ao reduzir,,Filtru liniar la micșorare,Линейная фильтрация при уменьшении,Линеарни филтер током смањења,Linjärt filter vid nedskalning,Küçültme sırasında doğrusal filtre, +Linear filter when upscaling,TCMNU_MAGFILTER,,,,Lineární filtrování při zvětšení,Lineært filter ved opskalering,Linearer Filter beim Hochskalieren,Γραμμικό φίλτρο για πολυτέληση,Linia filtro kima superskali,Filtro lineal por escalado,,Lineaarinen suodatin ylös skaalatessa,Filtrage linéaire en agrandissement,,Lineáris filterezés felméretezésnél,Filtro lineare per l'aumento,拡大時のリニアフィルター,확대시 선형 필터링함,Lineair filter voor upscaling,Lineært filter ved oppskalering,Liniowy filtr podczas zwiększania rozmiaru,Filtro linear ao aumentar,,Filtru liniar la mărire,Линейная фильтрация при увеличении,Линеарни филтер током повећања,Linjärt filter vid uppskalning,Yükseltme sırasında doğrusal filtre, +Use mipmapped textures,TCMNU_MIPMAP,,,,Použít mipmapy,Brug mipmapped teksturer,Benutze Textur-Mipmaps,Χρήση mipmapped υφών,Uzi mipmapajn teksturojn,Usar texturas con mipmap,,Käytä mipkartallisia pintakuviointeja,Utiliser textures mipmappées,,Mipmap textúrák,Usa le texture mipmapped,ミップマップテクスチャを使用,밉맵 텍스쳐 사용,Gebruik mipmapped texturen,Bruk mipmapped teksturer,Użyj mipmapowane tekstury,Usar texturas com mipmapping,,Mip mapping pentru texturi,Применять MIP-текстурирование,Користи мипмаповане текстуре,Använd mipmappade texturer,Eşlenmiş dokular kullanın, +Dynamic lights (Software),TCMNU_DYNLIGHTS,,,,Dynamická světla (software),Dynamisk lys (software),Dynamisches Licht (Software),Δυναμικά φώτα (Λογισμικό),Dinamikaj lumoj (Programbildigilo),Luces dinámicas (Software),,Dynaamiset valot (ohjelmisto),Lumières Dynamiques (Software),,Dinamikus fények (szoftveres),Luci Dinamiche (Software),ダイナミックライト (ソフトウェア),다이나믹 라이트 (소프트웨어 버전),Dynamische verlichting (software),Dynamiske lys (programvare),Dynamiczne Światło (Oprogramowanie),Luzes Dinâmicas (Software),,Lumini Dinamice (Mod Software),Динамическое освещение (программное),Динамичко осветљење (софтвер),Dynamiskt ljus (programvara),Dinamik ışıklar (Yazılım), +Option Search,OS_TITLE,,,,Vyhledávání možností,Mulighed Søg,Optionssuche,Αναζήτηση Ρυθμίσεων,Agorda Serĉo,Buscar Opciones,,Asetushaku,Recherche Option,,Beállítás Keresés,Opzioni di ricerca,オプション検索,옵션 검색,Optie zoeken,Alternativt søk,Szukanie Opcji,Buscar opção,Procurar opção,Căutare Setări,Поиск настройки,Претрага,Alternativ Sök,Seçenek Arama, +Search for any term,OS_ANY,,,,Hledat jakékoli klíčové slovo,Søg efter et vilkårligt begreb,Suche nach beliebigem Begriff,Αναζήτηση για όποιαδηποτε λέξη,Serĉi por iu ajn termino,Buscar cualquier término,,Etsi mitä tahansa sanaa,N'importe quel mot,,Bármilyen szótagra keresés,Cerca per ciascun termine,いずれかの用語を探す,용어 검색,Zoek naar eender welke term,Søk etter et vilkårlig begrep,Szukaj jakiegokolwiek wyrażenia,Buscar por qualquer termo,Procurar por um termo qualquer,Căutare după orice termen,Искать любое из слов,Тражи било коју од речи,Sök efter valfri term,Herhangi bir terim için arama yapın, +Search for all terms,OS_ALL,,,,Hledat všechna klíčová slova,Søg efter alle udtryk,Suche nach allen Begriffen,Αναζήτηση για όλες της λέξεις,Serĉi por ĉiuj terminoj,Buscar todos los términos,,Etsi kaikki sanat,Tous les mots,,Összes szótagra keresés,Cerca per tutti i termini,全ての用語を探す,모든 조건 검색,Zoek naar alle termen,Søk etter alle termer,Szukaj wszystkich wyrażeń,Buscar por todos os termos,Procurar por todos os termos,Căutare după toți termenii,Искать все слова,Тражи све речи,Sök efter alla termer,Tüm terimler için arama yapın, +No results found.,OS_NO_RESULTS,,,,Nic nenalezeno.,Ingen resultater fundet.,Keine Resultate,Δέν βρέθηκαν αποτελέσματα,Neniuj rezultoj trovitaj.,Ningun resultado.,,Ei tuloksia.,Pas de résultat trouvé,,Nincs keresési találat,Nessun risultato trovato.,見つかりませんでした。,검색 결과 없음.,Geen resultaten gevonden.,Ingen resultater funnet.,Brak wyników,Nenhum resultado encontrado.,,Niciun rezultat găsit.,Результаты не найдены.,Нема резултата.,Inga resultat hittades.,Sonuç bulunamadı., +Search:,OS_LABEL,,,,Hledat:,Søg:,Suche:,Αναζήτηση:,Serĉi:,Buscar:,,Etsi:,Recherche:,,Keresés:,Trova:,検索:,검색:,Zoeken:,Søk:,Szukaj:,Busca:,Procura:,Căutare:,Поиск:,Претрага:,Sök:,Arama yapın:, +Always show keys,AUTOMAPMNU_SHOWKEYS_ALWAYS,,,,Vždy zobrazit klíče,Vis altid nøgler,Zeige immer alle Schlüssel,Εμφάνιση πλήκτρων πάντα,Ĉiam montri ŝlosilojn,Mostrar llaves siempre,,Aina näytä avaimet,Toujour afficher clés,,Kulcsokat mindig mutat,Mostra sempre le chiavi,常にキーを表示,항상 키들을 표시,Toon altijd de toetsen,Vis alltid nøkler,Zawsze pokazuj klucze,Sempre mostrar chaves,Exibir chaves sempre,Afișează cheile în permanență,Всегда отображать ключи,Увек приказуј кључеве,Visa alltid nycklar,Her zaman anahtarları göster, +,,Newly added content,,,,,,,,,,,,,,,,,,,,,,,,,,, +Team changing has been disabled!,TXT_NO_TEAM_CHANGE,,,,Změna týmu je vypnuta!,Holdskift er blevet deaktiveret!,Teamwechsel ist deaktiviert!,Η αλαγγή ομάδον απαγορεύεται!,Teamŝanĝiĝo estas malvalidigita!,¡El cambio de equipo ha sido desactivado!,,Joukkueen vaihtaminen on kytketty pois päältä!,Les changements d'équipe sont désactivés!,,Csapatváltás letiltva,È stato disabilitato il cambio di squadra!,チームの変更は受け付けない!,팀 변경이 불가능해짐!,Teamwisseling is uitgeschakeld!,Lagbytte har blitt deaktivert!,Zmiana drużyn została wyłączona!,Troca de equipe foi desativada!,Troca de equipa foi desativada!,Schimbarea echipelor a fost dezactivată!,Смена команды была отключена!,Мењање тима је искључено!,Lagbyte har inaktiverats!,Takım değiştirme devre dışı bırakıldı!, +%s joined the %t team,TXT_JOINED_TEAM,%s is the player and gender sensitive,,,%s se připojil@[ao_cs] k týmu %t.,%s er blevet medlem af %t-team,%s is dem %t Team beigetreten.,@[art_gr] %s έγινε μέλος τής %t ομάδας,%s aliĝis al la %t teamo,%s se unió al equipo %t,,%s liittyi joukkueeseen %t,%s a rejoint l'équipe %t.,,%s belépett a %t csapatba,%s entra nel team %t,%s は %t のチームに入隊した,%s 이(가) %s 팀에 합류함,%s zijn bij het %t team gekomen.,%s ble med i %t-teamet,%s dołącza do drużyny %t,%s entrou na equipe %t,,%s s-a alăturat echipei %t,Игрок %s присоединяется к команде %t,%s је уш@[ao_2_sr] у %t тим,%s anslöt sig till %t teamet.,%s %t takımına katıldı, +%s is now a loner.,TXT_LONER,,,,%s je teď @[self_cs].,%s er nu en enspænder.,%s ist jetzt ein@[e_de] Einzelgänger@[in_de].,@[art_gr] %s είναι τώρα μόνο/ς/η @[pro4_gr],%s nun estas solemulo.,%s es ahora solitari@[ao_esp].,,%s on nyt yksikseen.,%s joue maintenant tout seul.,,%s immáron magányos útralépett,%s è da solo,%s は今 一匹狼だ。,%s 은(는) 혼자 남음.,%s is nu een eenling.,%s er nå en einstøing.,%s jest teraz sam@[ao_pl],%s está sozinh@[ao_ptb] agora.,,%s este singur acum,Игрок %s теперь одиночка.,%s је сада самотњак.,%s är nu en ensamvarg.,%s artık yalnız., +%s left the game with %d frags,TXT_LEFTWITHFRAGS,,,,%s opustil@[ao_cs] hru s %d fragy,%s forlod spillet med %d frags,%s hat das Spiel mit %d Frags verlassen.,@[art_gr] %s έφυγε με %d κοματιασμόυς,%s eliris el la ludo kun %d ludmurdoj,%s salió de la partida con %d bajas,,%s poistui pelistä frägimäärällä %d,%s a quitté le jeu avec %d frags.,,%s kilépett %d fraggel,%s ha lasciato il gioco con %d frag,"%s が逃げ出したので %d に点が入った ",%s 이(가) 게임에서 %d 의 점수를 기록하고 퇴장 함.,%s verliet het spel met %d frags,%s forlot spillet med %d frags,%s opuścił@[ao_pl] grę z %d fragami,%s saiu do jogo com %d frags,,%s a părăsit jocul cu %d victime,Игрок %s покидает игру с количеством фрагов: %d,%s је изаш@[ao_2_sr] из игре са %d фраговима.,%s lämnade spelet med %d frags,%s oyunu %d frag ile terk etti, -%s left the game,TXT_LEFTTHEGAME,,,,%s opustil@[ao_cs] hru,%s forlod spillet,%s hat das Spiel verlassen.,@[art_gr] %s έφυγε,%s eliris el la ludo,%s salió de la partida,,%s poistui pelistä,%s a quitté le jeu.,%s kilépett,%s ha lasciato il gioco,%s は退出した,%s 이(가) 게임을 떠남.,%s verliet het spel,%s forlot spillet,%s opuścił@[ao_pl] grę,%s saiu do jogo,,%s a părăsit jocul,Игрок %s покидает игру,%s је изаш@[ao_2_sr] из игре,%s har lämnat spelet.,%s oyundan ayrıldı, -Could not read savegame '%s'.,TXT_COULDNOTREAD,,,,Nepodařilo se načíst uloženou hru '%s'.,Kunne ikke læse savegame '%s'.,Konnte Spielstand '%s' nicht lesen.,Το αρχείο αποθήκευσης %s δέν μπόρε να φορτωθεί,Ne povis legi la konservitan ludon '%s'.,No se pudo leer la partida guardada '%s'.,,Pelitallennetta '%s' ei voitu lukea.,Impossible de lire la sauvegarde '%s'.,A '%s' nem tölthető be.,Non si è potuto leggere il salvataggio '%s'.,%s' のセーブデータを読み込めなかった。,저장된 게임을 불러올 수 없습니다.'%s',Kon het savegame '%s' niet lezen.,Kunne ikke lese savegame '%s'.,Nie można odczytać zapisu „%s”.,"Não foi possível ler o jogo salvo ""%s"".","Não foi possível ler o jogo guardado ""%s"".",Salvarea '%s' nu a putut fi citită.,Невозможно прочитать сохранение: «%s».,Није могуће прочитати сачувану игру %s.,"Kunde inte läsa sparspelet ""%s"".",%s' kayıt oyunu okunamadı., -%s' is not a valid savegame: Missing 'info.json'.,TXT_NOINFOJSON,,,,%s' není funkční uloženou hrou: Chybí 'info.json'.,%s' er ikke et gyldigt savegame: Mangler 'info.json'.,%s' ist kein gültiger Spielstand. 'info.json' fehlt.,Το %s δεν είναι ένα έγκυρο αρχείο αποθήκευσης: Το info.json λείπει,%s' ne estas valida konservita ludo: Mankante 'info.json'.,%s' no es una partida guardada válida: Falta 'info.json'.,,%s' ei ole kelvollinen pelitallenne. Puuttuva 'info.json'.,%s n'est pas une sauvegarde valide. Fichier 'info.json' manquant.,%s' nem egy valós mentés: Hiányzó 'info.json'.,%s' non è un salvataggio valido: 'info.json' mancante.,%s' は有効なセーブデータ ではない: 'info.json'が不明。,%s' 는 유효하지 않습니다: 파일이 없습니다.'info.json',"%s"" is geen geldig savegame: Ontbreekt 'info.json'.",%s' er ikke et gyldig savegame: Mangler 'info.json'.,"„%s” nie jest prawidłowym zapisem gry: Brak „info.json” +%s left the game,TXT_LEFTTHEGAME,,,,%s opustil@[ao_cs] hru,%s forlod spillet,%s hat das Spiel verlassen.,@[art_gr] %s έφυγε,%s eliris el la ludo,%s salió de la partida,,%s poistui pelistä,%s a quitté le jeu.,,%s kilépett,%s ha lasciato il gioco,%s は退出した,%s 이(가) 게임을 떠남.,%s verliet het spel,%s forlot spillet,%s opuścił@[ao_pl] grę,%s saiu do jogo,,%s a părăsit jocul,Игрок %s покидает игру,%s је изаш@[ao_2_sr] из игре,%s har lämnat spelet.,%s oyundan ayrıldı, +Could not read savegame '%s'.,TXT_COULDNOTREAD,,,,Nepodařilo se načíst uloženou hru '%s'.,Kunne ikke læse savegame '%s'.,Konnte Spielstand '%s' nicht lesen.,Το αρχείο αποθήκευσης %s δέν μπόρε να φορτωθεί,Ne povis legi la konservitan ludon '%s'.,No se pudo leer la partida guardada '%s'.,,Pelitallennetta '%s' ei voitu lukea.,Impossible de lire la sauvegarde '%s'.,,A '%s' nem tölthető be.,Non si è potuto leggere il salvataggio '%s'.,%s' のセーブデータを読み込めなかった。,저장된 게임을 불러올 수 없습니다.'%s',Kon het savegame '%s' niet lezen.,Kunne ikke lese savegame '%s'.,Nie można odczytać zapisu „%s”.,"Não foi possível ler o jogo salvo ""%s"".","Não foi possível ler o jogo guardado ""%s"".",Salvarea '%s' nu a putut fi citită.,Невозможно прочитать сохранение: «%s».,Није могуће прочитати сачувану игру %s.,"Kunde inte läsa sparspelet ""%s"".",%s' kayıt oyunu okunamadı., +%s' is not a valid savegame: Missing 'info.json'.,TXT_NOINFOJSON,,,,%s' není funkční uloženou hrou: Chybí 'info.json'.,%s' er ikke et gyldigt savegame: Mangler 'info.json'.,%s' ist kein gültiger Spielstand. 'info.json' fehlt.,Το %s δεν είναι ένα έγκυρο αρχείο αποθήκευσης: Το info.json λείπει,%s' ne estas valida konservita ludo: Mankante 'info.json'.,%s' no es una partida guardada válida: Falta 'info.json'.,,%s' ei ole kelvollinen pelitallenne. Puuttuva 'info.json'.,%s n'est pas une sauvegarde valide. Fichier 'info.json' manquant.,,%s' nem egy valós mentés: Hiányzó 'info.json'.,%s' non è un salvataggio valido: 'info.json' mancante.,%s' は有効なセーブデータ ではない: 'info.json'が不明。,%s' 는 유효하지 않습니다: 파일이 없습니다.'info.json',"%s"" is geen geldig savegame: Ontbreekt 'info.json'.",%s' er ikke et gyldig savegame: Mangler 'info.json'.,"„%s” nie jest prawidłowym zapisem gry: Brak „info.json” ","""%s"" não é um jogo salvo válido: Está faltando ""info.json"".","""%s"" não é um jogo gravado válido: Está faltando ""info.json"".",%s' nu este o salvare validă. Lipsește 'info.json',Сохранение «%s» некорректно: отсутствует «info.json».,%s није валидно сачувана игра: Недостаје „info.json“.,"%s' är inte ett giltigt sparspel: Saknar ""info.json"".",%s' geçerli bir kayıt oyunu değil: Eksik 'info.json'., -Failed to access savegame info in '%s'.,TXT_FAILEDTOREADSG,,,,Nepodařilo se načíst informace v uložené hře '%s'.,Det lykkedes ikke at få adgang til savegame info i '%s'.,Konnte Spielstandinfo in '%s' nicht lesen.,Η πρόσβαση πληροφοριών του αρχείου αποθήκευσης %s δέν ήταν επιτυχής,Malsukcesis aliri informon de la konservita ludo en '%s'.,Fallo al acceder a información de partida guardada en '%s'.,,Tiedoston '%s' pelitallennetietoihin ei päästy käsiksi.,Impossible d'accéder aux infos de sauvegarde dans le fichier '%s'.,A '%s' mentésben nem sikerült fellelni a mentésinfókat.,Accesso alle informazioni sul salvataggio in '%s' fallito.,%s' のセーブデータにアクセス出来なかった。,%s'의 저장된 게임 정보에 액세스 할 수 없습니다.,Geen toegang tot de opgeslagen informatie in '%s'.,Kunne ikke få tilgang til savegame-info i '%s'.,Nie udało się dostać informacji zapisu „%s”.,"Não foi possível acessar a informação do jogo salvo em ""%s"".","Não foi possível acessar a informação do jogo gravado em ""%s"".",Nu s-au putut accesa informațiile din salvarea '%s'.,Невозможно получить информацию из сохранения «%s».,Не успешно пристопљено инфу сачуване игре %s.,"Misslyckades med att få tillgång till information om sparspelet i ""%s"".",%s' içindeki kayıt oyunu bilgilerine erişilemedi., -Savegame '%s' is from an incompatible version.,TXT_INCOMPATIBLESG,,,,Uložená hra '%s' je z nekompatibilní verze.,Savegame '%s' er fra en inkompatibel version.,Spielstand '%s' ist von einer inkompatiblen Version.,Το αρχείο αποθήκευσης %s είναι απο μια ασύμβατη έκδοση,Konservita ludo '%s' estas el nekongrua versio.,La partida guardada '%s' es de una versión no compatible.,,Pelitallenne '%s' on yhteensopimattomasta versiosta.,La sauvegarde '%s' vient d'une version incompatible.,A '%s' mentés egy nem kompatibilis verzió mentése.,Il salvataggio '%s' proviene da una versione incompatibile.,%s' は互換性の無いバージョンのセーブデータだ。,저장된 게임'%s'은(는) 호환되지 않는 버전입니다.,Savegame '%s' komt uit een incompatibele versie.,Savegame '%s' er fra en inkompatibel versjon.,Zapis gry „%s” jest z niekompatybilnej wersji.,"O jogo salvo ""%s"" é de uma versão incompatível.","O jogo gravado ""%s"" é de uma versão incompatível.",Salvarea '%s' este dintr-o versiune incompatibilă.,Сохранение «%s» из несовместимой версии порта.,Сачувана игра %s је из инкомпетабилне верзије.,"Sparfil ""%s"" är från en inkompatibel version.",%s' kayıt oyunu uyumsuz bir sürüme ait., -Savegame '%s' is from another ZDoom-based engine:,TXT_OTHERENGINESG,,,,Uložená hra '%s' je z jiného enginu založeného na ZDoomu:,Savegame '%s' er fra en anden ZDoom-baseret engine:,Spielstand '%s' ist von einer anderen ZDoom-basierten Engine:,Το αρχείο αποθήκευσης %s είναι απο μια άλλη ZDoom βασισμένη μηχανή,Konservita ludo '%s' estas el alia ZDoom-bazita modulo:,La partida guardada '%s' es de otro motor basado en ZDoom:,,Pelitallenne '%s' on toisesta ZDoom-pohjaisesta moottorista.,La sauvegarde '%s' vient d'un autre moteur basé sur ZDoom:,A '%s' mentés egy másik ZDoom motorhoz való:,Il salvataggio '%s' proviene da un altro motore basato su ZDoom:,%s' は別のZDoom型のセーブデータだ。,저장된 게임 '%s'은(는) 다른 Z둠 기반 엔진입니다:,Savegame '%s' is van een andere ZDoom-gebaseerde engine:,Savegame '%s' er fra en annen ZDoom-basert engine:,Zapis gry „%s” jest z innego silnika bazowanego na ZDoomie:,"O jogo salvo ""%s"" é de outra engine baseada em ZDoom:","O jogo gravado ""%s"" é de outro motor baseado em ZDoom:",Salvarea '%s' este dintr-un alt motor care are ca bază ZDoom:,"Сохранение «%s» из другого, основанного на ZDoom, движка:",Сачувана игра %s је из други ZDoom-базиран енџин:,"Sparfil ""%s"" är från en annan ZDoom-baserad motor:",%s' kayıt oyunu başka bir ZDoom tabanlı motordan:, -Savegame '%s' is from an older version: %d (%e is the oldest supported),TXT_TOOOLDSG,,,,Uložená hra '%s' je ze starší verze: %d (%e je nejstarší podporovaná verze),Savegame '%s' er fra en ældre version: %d (%e er den ældste understøttede version),Spielstand '%s' ist von einer älteren Version: %s (%e ist die älteste noch unterstützte Version,Το αρχείο αποθήκευσης %s είναι απο την %d έκδοση (H %e είναι η παλιότερη υποστηριζώμενη),Konservita ludo '%s' estas el pli malnova versio: %d (%e estas la plej malnova subtenata),La partida guardada '%s' es de una versión anterior: %d (%e es la más anterior soportada),,Pelitallenne '%s' on vanhemmasta versiosta: %d (%e on vanhin tuettu versio),La sauvegarde '%s' vient d'une version obsolète: %d (%e est la plus ancienne supportée.),A '%s' mentés egy túl régi verzióhoz való: %d (%e a legfrissebb támogatott verzió),Il salvataggio '%s' proviene da una versione precedente: %d (%e è la più vecchia supportata),%s' はバージョンが合わないセーブデータだ: %d(%e は旧式版の物),저장된 게임'%s'은(는) 구 버전입니다: %d (%e 이 지원되는 버전 중 가장 오래된 버전),Savegame '%s' is van een oudere versie: %d (%e is de oudste ondersteunde versie).,Savegame '%s' er fra en eldre versjon: %d (%e er den eldste som støttes).,Zapis gry „%s” jest ze starszej wersji: %d (%e jest najstarszą wspieraną),"O jogo salvo ""%s"" é de uma versão mais antiga: %d (%e sendo a mais antiga suportada)","O jogo gravado ""%s"" é de uma versão mais antiga: %d (%e sendo a mais antiga suportada)",Salvarea '%s' este dintr-o versiune mai veche: %d (%e e cea mai veche suportată),Сохранение «%s» из старой версии: %d (%e — последняя совместимая).,Сачувана игра „%s“ је из старије верзије: %d (%e је најстарија подржана),"Sparfil ""%s"" är från en äldre version: %d (%e är den äldsta versionen som stöds).",%s' kayıt oyunu daha eski bir sürümden: %d (%e desteklenen en eski sürümdür), +Failed to access savegame info in '%s'.,TXT_FAILEDTOREADSG,,,,Nepodařilo se načíst informace v uložené hře '%s'.,Det lykkedes ikke at få adgang til savegame info i '%s'.,Konnte Spielstandinfo in '%s' nicht lesen.,Η πρόσβαση πληροφοριών του αρχείου αποθήκευσης %s δέν ήταν επιτυχής,Malsukcesis aliri informon de la konservita ludo en '%s'.,Fallo al acceder a información de partida guardada en '%s'.,,Tiedoston '%s' pelitallennetietoihin ei päästy käsiksi.,Impossible d'accéder aux infos de sauvegarde dans le fichier '%s'.,,A '%s' mentésben nem sikerült fellelni a mentésinfókat.,Accesso alle informazioni sul salvataggio in '%s' fallito.,%s' のセーブデータにアクセス出来なかった。,%s'의 저장된 게임 정보에 액세스 할 수 없습니다.,Geen toegang tot de opgeslagen informatie in '%s'.,Kunne ikke få tilgang til savegame-info i '%s'.,Nie udało się dostać informacji zapisu „%s”.,"Não foi possível acessar a informação do jogo salvo em ""%s"".","Não foi possível acessar a informação do jogo gravado em ""%s"".",Nu s-au putut accesa informațiile din salvarea '%s'.,Невозможно получить информацию из сохранения «%s».,Не успешно пристопљено инфу сачуване игре %s.,"Misslyckades med att få tillgång till information om sparspelet i ""%s"".",%s' içindeki kayıt oyunu bilgilerine erişilemedi., +Savegame '%s' is from an incompatible version.,TXT_INCOMPATIBLESG,,,,Uložená hra '%s' je z nekompatibilní verze.,Savegame '%s' er fra en inkompatibel version.,Spielstand '%s' ist von einer inkompatiblen Version.,Το αρχείο αποθήκευσης %s είναι απο μια ασύμβατη έκδοση,Konservita ludo '%s' estas el nekongrua versio.,La partida guardada '%s' es de una versión no compatible.,,Pelitallenne '%s' on yhteensopimattomasta versiosta.,La sauvegarde '%s' vient d'une version incompatible.,,A '%s' mentés egy nem kompatibilis verzió mentése.,Il salvataggio '%s' proviene da una versione incompatibile.,%s' は互換性の無いバージョンのセーブデータだ。,저장된 게임'%s'은(는) 호환되지 않는 버전입니다.,Savegame '%s' komt uit een incompatibele versie.,Savegame '%s' er fra en inkompatibel versjon.,Zapis gry „%s” jest z niekompatybilnej wersji.,"O jogo salvo ""%s"" é de uma versão incompatível.","O jogo gravado ""%s"" é de uma versão incompatível.",Salvarea '%s' este dintr-o versiune incompatibilă.,Сохранение «%s» из несовместимой версии порта.,Сачувана игра %s је из инкомпетабилне верзије.,"Sparfil ""%s"" är från en inkompatibel version.",%s' kayıt oyunu uyumsuz bir sürüme ait., +Savegame '%s' is from another ZDoom-based engine:,TXT_OTHERENGINESG,,,,Uložená hra '%s' je z jiného enginu založeného na ZDoomu:,Savegame '%s' er fra en anden ZDoom-baseret engine:,Spielstand '%s' ist von einer anderen ZDoom-basierten Engine:,Το αρχείο αποθήκευσης %s είναι απο μια άλλη ZDoom βασισμένη μηχανή,Konservita ludo '%s' estas el alia ZDoom-bazita modulo:,La partida guardada '%s' es de otro motor basado en ZDoom:,,Pelitallenne '%s' on toisesta ZDoom-pohjaisesta moottorista.,La sauvegarde '%s' vient d'un autre moteur basé sur ZDoom:,,A '%s' mentés egy másik ZDoom motorhoz való:,Il salvataggio '%s' proviene da un altro motore basato su ZDoom:,%s' は別のZDoom型のセーブデータだ。,저장된 게임 '%s'은(는) 다른 Z둠 기반 엔진입니다:,Savegame '%s' is van een andere ZDoom-gebaseerde engine:,Savegame '%s' er fra en annen ZDoom-basert engine:,Zapis gry „%s” jest z innego silnika bazowanego na ZDoomie:,"O jogo salvo ""%s"" é de outra engine baseada em ZDoom:","O jogo gravado ""%s"" é de outro motor baseado em ZDoom:",Salvarea '%s' este dintr-un alt motor care are ca bază ZDoom:,"Сохранение «%s» из другого, основанного на ZDoom, движка:",Сачувана игра %s је из други ZDoom-базиран енџин:,"Sparfil ""%s"" är från en annan ZDoom-baserad motor:",%s' kayıt oyunu başka bir ZDoom tabanlı motordan:, +Savegame '%s' is from an older version: %d (%e is the oldest supported),TXT_TOOOLDSG,,,,Uložená hra '%s' je ze starší verze: %d (%e je nejstarší podporovaná verze),Savegame '%s' er fra en ældre version: %d (%e er den ældste understøttede version),Spielstand '%s' ist von einer älteren Version: %s (%e ist die älteste noch unterstützte Version,Το αρχείο αποθήκευσης %s είναι απο την %d έκδοση (H %e είναι η παλιότερη υποστηριζώμενη),Konservita ludo '%s' estas el pli malnova versio: %d (%e estas la plej malnova subtenata),La partida guardada '%s' es de una versión anterior: %d (%e es la más anterior soportada),,Pelitallenne '%s' on vanhemmasta versiosta: %d (%e on vanhin tuettu versio),La sauvegarde '%s' vient d'une version obsolète: %d (%e est la plus ancienne supportée.),,A '%s' mentés egy túl régi verzióhoz való: %d (%e a legfrissebb támogatott verzió),Il salvataggio '%s' proviene da una versione precedente: %d (%e è la più vecchia supportata),%s' はバージョンが合わないセーブデータだ: %d(%e は旧式版の物),저장된 게임'%s'은(는) 구 버전입니다: %d (%e 이 지원되는 버전 중 가장 오래된 버전),Savegame '%s' is van een oudere versie: %d (%e is de oudste ondersteunde versie).,Savegame '%s' er fra en eldre versjon: %d (%e er den eldste som støttes).,Zapis gry „%s” jest ze starszej wersji: %d (%e jest najstarszą wspieraną),"O jogo salvo ""%s"" é de uma versão mais antiga: %d (%e sendo a mais antiga suportada)","O jogo gravado ""%s"" é de uma versão mais antiga: %d (%e sendo a mais antiga suportada)",Salvarea '%s' este dintr-o versiune mai veche: %d (%e e cea mai veche suportată),Сохранение «%s» из старой версии: %d (%e — последняя совместимая).,Сачувана игра „%s“ је из старије верзије: %d (%e је најстарија подржана),"Sparfil ""%s"" är från en äldre version: %d (%e är den äldsta versionen som stöds).",%s' kayıt oyunu daha eski bir sürümden: %d (%e desteklenen en eski sürümdür), Savegame '%s' is from a newer version: %d (%e is the highest supported),TXT_TOONEWSG,"Shouldn’t this say “%e is the newest supported”? — Undead -Ask Randi: The text is old. I won't change it.",,,Uložená hra '%s' je z novější verze: %d (%e je nejvyšší podporovaná verze),Savegame '%s' er fra en nyere version: %d (%e er den højest understøttede),Spielstand '%s' ist von einer neueren Version: %s (%e ist die neueste noch unterstützte Version,Το αρχείο αποθήκευσης %s είναι απο μια πιο καινούρια έκδοση: %d (Η %e είναι η πιο καινούρια που υποστηρίζεται),Konservita ludo '%s' estas el pli nova versio: %d (%e estas la plej nova subtenata),La partida guardada '%s' es de una versión posterior: %d (%e es la más alta soportada),,Pelitallenne '%s' on uudemmasta versiosta: %d (%e on korkein tuettu versio),La sauvegarde '%s' vient d'une version plus récente: %d (%e est la plus récente supportée.),A '%s' mentés egy túl új verzióhoz való: %d (%e a legkorábbi támogatott verzió),Il salvataggio '%s' proviene da una versione recente: %d (%e è la più recente supportata),%s' はバージョンが合わないセーブデータだ: %d(%e は最新版の物),저장된 게임'%s'은(는) 새 버전입니다: %d (%e 이 지원되는 버전 중 가장 최근 버전),Savegame '%s' is van een nieuwere versie: %d (%e is de hoogst ondersteunde versie).,Savegame '%s' er fra en nyere versjon: %d (%e er den høyeste versjonen som støttes).,Zapis gry „%s” jest z nowszej wersji: %d (%e jest najwyższą wspieraną),"O jogo salvo ""%s"" é de uma versão mais nova: %d (%e sendo a mais recente suportada)","O jogo gravado ""%s"" é de uma versão mais nova: %d (%e sendo a mais recente suportada)",Salvarea '%s' e dintr-o versiune mai nouă: %d (%e este cea mai nouă suportată),Сохранение «%s» из новой версии: %d (%e — последняя совместимая).,Сачувана игра „%s“ је из новије верзије: %d (%e је најновија подржана),"Sparfil ""%s"" är från en nyare version: %d (%e är den högsta versionen som stöds).",%s' kayıt oyunu daha yeni bir sürümden: %d (%e desteklenen en yüksek sürümdür), -Savegame '%s' is missing the current map.,TXT_NOMAPSG,,,,Uložená hra '%s' neobsahuje současný level.,Savegame '%s' mangler det aktuelle kort.,Spielstand '%s' hat keine Information über den alktuellen Level.,Το αρχείο αποθήκευσης %s δέν έχει την τωρινή πίστα,Al la konservita ludo '%s' mankas la nuna mapo.,La partida guardada '%s' carece del mapa actual.,,Pelitallenteesta '%s' puuttuu nykyinen taso.,La sauvegarde '%s' ne contient pas la carte actuelle.,A '%s' mentés hiányolja a jelenlegi pályát.,Il salvataggio '%s' non contiene la mappa corrente.,セーブデータ '%s'に現在のマップはない。,저장된 게임 '%s'에 현재 맵이 없습니다.,Savegame '%s' mist de huidige kaart.,Savegame '%s' mangler det gjeldende kartet.,W zapisie gry „%s” brakuje obecnej mapy.,"O jogo salvo ""%s"" não possui o mapa atual.","O jogo gravado ""%s"" não possui o mapa atual.",Salvării '%s' îi lipsește harta actuală.,В сохранении «%s» отсутствует текущая карта.,Сачувана игри „%s“ недостаје тренутна мапа.,"Sparfil ""%s"" saknar den aktuella kartan.",%s' kayıt oyununda geçerli harita eksik., -%s' is not a valid savegame: Missing 'globals.json'.,TXT_NOGLOBALSJSON,,,,%s' není funkční uloženou hrou: Chybí 'globals.json'.,%s' er ikke et gyldigt savegame: Mangler 'globals.json'.,%s' ist kein gültiger Spielstand. 'globals.json' fehlt.,Το %s δεν είναι ένα έγκυρο αρχείο αποθήκευσης: Το globals.json λείπει,%s' ne estas valida konservita ludo: Mankante 'globals.json'.,%s' no es una partida guardada válida: Falta 'globals.json'.,,%s' ei ole kelvollinen pelitallenne. Puuttuva 'globals.json'.,%s n'est pas une sauvegarde valide. Fichier 'global.json' manquant.,A '%s' nem valós mentés: Hiányzó 'globals.json'.,%s' non è un salvataggio valido: 'globals.json' mancante.,%s' は有効なセーブデータではない: 'globals.json'が不明。,%s' 는 유효하지 않습니다: 파일이 없습니다.'globals.json',%s' is geen geldig savegame: Ontbrekende 'globals.json'.,%s' er ikke et gyldig lagringsspill: Mangler 'globals.json'.,„%s” nie jest prawidłowym zapisem gry: Brak „globals.json”,"""%s"" não é um jogo salvo válido: Está faltando +Ask Randi: The text is old. I won't change it.",,,Uložená hra '%s' je z novější verze: %d (%e je nejvyšší podporovaná verze),Savegame '%s' er fra en nyere version: %d (%e er den højest understøttede),Spielstand '%s' ist von einer neueren Version: %s (%e ist die neueste noch unterstützte Version,Το αρχείο αποθήκευσης %s είναι απο μια πιο καινούρια έκδοση: %d (Η %e είναι η πιο καινούρια που υποστηρίζεται),Konservita ludo '%s' estas el pli nova versio: %d (%e estas la plej nova subtenata),La partida guardada '%s' es de una versión posterior: %d (%e es la más alta soportada),,Pelitallenne '%s' on uudemmasta versiosta: %d (%e on korkein tuettu versio),La sauvegarde '%s' vient d'une version plus récente: %d (%e est la plus récente supportée.),,A '%s' mentés egy túl új verzióhoz való: %d (%e a legkorábbi támogatott verzió),Il salvataggio '%s' proviene da una versione recente: %d (%e è la più recente supportata),%s' はバージョンが合わないセーブデータだ: %d(%e は最新版の物),저장된 게임'%s'은(는) 새 버전입니다: %d (%e 이 지원되는 버전 중 가장 최근 버전),Savegame '%s' is van een nieuwere versie: %d (%e is de hoogst ondersteunde versie).,Savegame '%s' er fra en nyere versjon: %d (%e er den høyeste versjonen som støttes).,Zapis gry „%s” jest z nowszej wersji: %d (%e jest najwyższą wspieraną),"O jogo salvo ""%s"" é de uma versão mais nova: %d (%e sendo a mais recente suportada)","O jogo gravado ""%s"" é de uma versão mais nova: %d (%e sendo a mais recente suportada)",Salvarea '%s' e dintr-o versiune mai nouă: %d (%e este cea mai nouă suportată),Сохранение «%s» из новой версии: %d (%e — последняя совместимая).,Сачувана игра „%s“ је из новије верзије: %d (%e је најновија подржана),"Sparfil ""%s"" är från en nyare version: %d (%e är den högsta versionen som stöds).",%s' kayıt oyunu daha yeni bir sürümden: %d (%e desteklenen en yüksek sürümdür), +Savegame '%s' is missing the current map.,TXT_NOMAPSG,,,,Uložená hra '%s' neobsahuje současný level.,Savegame '%s' mangler det aktuelle kort.,Spielstand '%s' hat keine Information über den alktuellen Level.,Το αρχείο αποθήκευσης %s δέν έχει την τωρινή πίστα,Al la konservita ludo '%s' mankas la nuna mapo.,La partida guardada '%s' carece del mapa actual.,,Pelitallenteesta '%s' puuttuu nykyinen taso.,La sauvegarde '%s' ne contient pas la carte actuelle.,,A '%s' mentés hiányolja a jelenlegi pályát.,Il salvataggio '%s' non contiene la mappa corrente.,セーブデータ '%s'に現在のマップはない。,저장된 게임 '%s'에 현재 맵이 없습니다.,Savegame '%s' mist de huidige kaart.,Savegame '%s' mangler det gjeldende kartet.,W zapisie gry „%s” brakuje obecnej mapy.,"O jogo salvo ""%s"" não possui o mapa atual.","O jogo gravado ""%s"" não possui o mapa atual.",Salvării '%s' îi lipsește harta actuală.,В сохранении «%s» отсутствует текущая карта.,Сачувана игри „%s“ недостаје тренутна мапа.,"Sparfil ""%s"" saknar den aktuella kartan.",%s' kayıt oyununda geçerli harita eksik., +%s' is not a valid savegame: Missing 'globals.json'.,TXT_NOGLOBALSJSON,,,,%s' není funkční uloženou hrou: Chybí 'globals.json'.,%s' er ikke et gyldigt savegame: Mangler 'globals.json'.,%s' ist kein gültiger Spielstand. 'globals.json' fehlt.,Το %s δεν είναι ένα έγκυρο αρχείο αποθήκευσης: Το globals.json λείπει,%s' ne estas valida konservita ludo: Mankante 'globals.json'.,%s' no es una partida guardada válida: Falta 'globals.json'.,,%s' ei ole kelvollinen pelitallenne. Puuttuva 'globals.json'.,%s n'est pas une sauvegarde valide. Fichier 'global.json' manquant.,,A '%s' nem valós mentés: Hiányzó 'globals.json'.,%s' non è un salvataggio valido: 'globals.json' mancante.,%s' は有効なセーブデータではない: 'globals.json'が不明。,%s' 는 유효하지 않습니다: 파일이 없습니다.'globals.json',%s' is geen geldig savegame: Ontbrekende 'globals.json'.,%s' er ikke et gyldig lagringsspill: Mangler 'globals.json'.,„%s” nie jest prawidłowym zapisem gry: Brak „globals.json”,"""%s"" não é um jogo salvo válido: Está faltando ""globals.json"".","""%s"" não é um jogo gravado válido: Está faltando ""globals.json"".",%s nu este o salvare validă. Lipsește 'globals.json'.,Сохранение «%s» некорректно: отсутствует «globals.json».,%s није валидно сачувана игра: Недостаје „globals.json“.,"%s"" är inte ett giltigt sparfil: Saknar ""globals.json"".",%s' geçerli bir kayıt oyunu değil: Eksik 'globals.json'., -Failed to access savegame info in '%s',TXT_SGINFOERR,,,,Nepodařilo se načíst informace v uložené hře '%s'.,Fejlslagen adgang til savegame info i '%s',Konnte Spielstandinformationen von '%s' nicht lesen.,Η πρόσβαση πληροφοριών του αρχείου αποθήκευσης %s δέν ήταν επιτυχής,Malsukcesis aliri informon de la konservita ludo en '%s',Fallo al acceder a información de partida guardada en '%s'.,,Tiedoston '%s' pelitallennetietoihin ei päästy käsiksi.,Impossible d'accéder aux infos de sauvegarde dans le fichier '%s'.,A '%s' -ban nem található mentési információ.,Accesso alle informazioni sul salvataggio in '%s' fallito,%s' のセーブデータにアクセス出来なかった,%s'의 저장된 게임 정보에 액세스 할 수 없습니다.,Geen toegang tot savegame info in '%s'.,Kunne ikke få tilgang til lagringsinformasjon i '%s'.,Nie udało się dostać informacji zapisu „%s”.,"Não foi possível acessar a informação do jogo salvo em ""%s"".","Não foi possível acessar a informação do jogo gravado em ""%s"".",Informațiile salvării '%s' nu au putut fi accesate,Невозможно получить информацию из сохранения «%s».,Не успешно приступљено саучуваној игри у %s,"Misslyckades med att få tillgång till information om sparfilet i ""%s"".",%s' içindeki savegame bilgisine erişilemedi, -A game save is still pending.,TXT_SAVEPENDING,,,,Stále se čeká na uložení hry.,Et spilopbevaringsspil venter stadig på at blive gemt.,Das Speichern eines Spielstandes steht noch aus.,Μια αποθήκευση παιχνιδίου είναι ακόμα σε αναμονή,Konservita ludo ankoraŭ estas pritraktata.,Un guardado de partida aún está pendiente.,,Pelin tallennus on vielä kesken.,Une sauvegarde est déjà en cours.,A mentés folyamatban.,Un salvataggio di gioco è ancora in corso.,セーブ中だ,게임 저장이 아직 보류 중입니다.,Een spel opslaan is nog steeds in behandeling.,En spilloppdatering venter fortsatt.,Zapis gry jest wciąż w toku.,Jogo salvo ainda pendente.,Jogo gravado ainda pendente.,O salvare este încă în așteptare.,Сохранение в очереди.,Сачувана игра идаље чека,Ett sparande av spelet väntar fortfarande.,Bir oyun kaydı hala beklemede., -Not in a saveable game.,TXT_NOTSAVEABLE,,,,Nejsi v uložitelné hře.,"Ikke i et spil, der kan gemmes.",Kein speicherbares Spiel aktiv.,Δέν είσαι σε ένα παιχνίδει που μπορεί να αποθηκευτεί,Ne estas en konservebla ludo.,No en una partida guardable.,,Ei tallennettavassa pelissä.,Vous n'êtes pas dans une partie sauvegardable.,Nem menthető játék.,Non è in un gioco salvabile.,セーブ可能なゲームではない,저장 가능한 게임에선 불가능 합니다.,Geen opslagbaar spel actief.,Ikke i et spill som kan lagres.,Nie w grze do zapisywania.,Não está em uma partida salvável.,Não estás numa partida que possa ser gravada.,Nu ești într-un joc în care poți salva.,Не в сохранимой игре.,Није у сачувајућој игри,Inte i ett spel som kan sparas.,Kaydedilebilir bir oyunda değil., -Not in a level,TXT_NOTINLEVEL,,,,Nejsi v levelu.,Ikke i en kort,Nicht in einem Level.,Δέν ε'ισαι σε μια πίστα,Ne estas en nivelo,No en un nivel,,Ei tasossa,Vous n'êtes pas dans un niveau.,Nem menthető pályán van.,Non è in un livello,レベル内ではない,레벨 안에선 불가능 합니다.,Niet in een level,Ikke i et nivå,Nie w poziomie.,Não está em uma fase.,Não estás em nenhum nível.,Nu ești în niciun nivel,Не на уровне,Није у нивоу,Inte i en nivå.,Bir seviyede değil, -Player is dead in a single-player game,TXT_SPPLAYERDEAD,,,,Hráč je mrtvý v singleplayer hře.,Spilleren er død i et single-player spil,Spieler ist tot in einem Einzelspieler-Spiel.,Ο παίχτης έιναι νεκρός σε ένα singleplayer παιχνίδι,Ludanto estas mortinta en sol-ludanta ludado,Jugador muerto en partida de un solo jugador,,Pelaaja on kuollut yksinpelissä,Le joueur est mort en mode solo.,Játékos meghalt egy egyjátékos módban.,Il giocatore è morto in un gioco single player,シングルプレイでプレイヤーが死んだ,플레이어가 싱글 플레이 게임에서 죽었습니다.,Speler is dood in een een-speler spel,Spilleren er død i et enspiller-spill,Gracz jest martwy w grze dla jednego gracza,Jogador está morto em partida single player.,Jogador está morto numa partida single player.,Jucătorul este mort într-un joc single-player,Игрок мёртв в одиночной игре,Играч је мртав у сингл-плејер игри,Spelaren är död i ett enspelarspel.,Oyuncu tek oyunculu bir oyunda öldü, -Save failed,TXT_SAVEFAILED,,,,Uložení se nezdařilo.,Save mislykkedes,Speichern fehlgeschlagen.,Η αποθήκευση απέτυχε,Konservo malsukcesis,Guardado fallido,,Tallennus epäonnistui,La sauvegarde à échoué.,Mentés meghiusult,Salvataggio fallito,セーブに失敗した。,저장 실패,Opslaan mislukt,Lagring mislyktes,Nie udało się zapisać,Falha ao salvar,Falha ao gravar,Salvare eșuată,Ошибка сохранения игры,Сачување није успело,Spara misslyckades.,Kaydetme başarısız, -Could not create screenshot.,TXT_SCREENSHOTERR,,,,Nepodařilo se pořídit snímek obrazovky.,Kunne ikke oprette et skærmbillede.,Konnte Screenshot nicht erzeugen.,Ένα screenshot δέν μπόρεσε να τραβυχτεί,Ne povis krei ekrankopion.,No se pudo crear captura de pantalla.,,Ei voitu ottaa kuvakaappausta.,La capture d'écran à échoué.,Képernyőmentés meghiusult,Non è stato possibile effettuare la cattura dello schermo.,スクリーンショットを作成できなかった。,스크린샷을 만들 수 없음.,Kon geen screenshot maken.,Kunne ikke opprette skjermbilde.,Nie można zrobić zrzutu ekranu.,Não foi possível capturar a tela.,Não foi possível capturar ecrã,Captura de ecran nu a putut fi creată.,Ошибка создания снимка экрана.,Није успело направити снимак екрана.,Kunde inte skapa en skärmdump.,Ekran görüntüsü oluşturulamadı., -By %s,TXT_BY,As in paused by player %s.,,,hráčem %s,Af %s,Von %s,Απο @[pro_gr] %s,De %s,Por %s,,Pelaajan %s toimesta,Par %s,%s által,Da %s,"%s より +Failed to access savegame info in '%s',TXT_SGINFOERR,,,,Nepodařilo se načíst informace v uložené hře '%s'.,Fejlslagen adgang til savegame info i '%s',Konnte Spielstandinformationen von '%s' nicht lesen.,Η πρόσβαση πληροφοριών του αρχείου αποθήκευσης %s δέν ήταν επιτυχής,Malsukcesis aliri informon de la konservita ludo en '%s',Fallo al acceder a información de partida guardada en '%s'.,,Tiedoston '%s' pelitallennetietoihin ei päästy käsiksi.,Impossible d'accéder aux infos de sauvegarde dans le fichier '%s'.,,A '%s' -ban nem található mentési információ.,Accesso alle informazioni sul salvataggio in '%s' fallito,%s' のセーブデータにアクセス出来なかった,%s'의 저장된 게임 정보에 액세스 할 수 없습니다.,Geen toegang tot savegame info in '%s'.,Kunne ikke få tilgang til lagringsinformasjon i '%s'.,Nie udało się dostać informacji zapisu „%s”.,"Não foi possível acessar a informação do jogo salvo em ""%s"".","Não foi possível acessar a informação do jogo gravado em ""%s"".",Informațiile salvării '%s' nu au putut fi accesate,Невозможно получить информацию из сохранения «%s».,Не успешно приступљено саучуваној игри у %s,"Misslyckades med att få tillgång till information om sparfilet i ""%s"".",%s' içindeki savegame bilgisine erişilemedi, +A game save is still pending.,TXT_SAVEPENDING,,,,Stále se čeká na uložení hry.,Et spilopbevaringsspil venter stadig på at blive gemt.,Das Speichern eines Spielstandes steht noch aus.,Μια αποθήκευση παιχνιδίου είναι ακόμα σε αναμονή,Konservita ludo ankoraŭ estas pritraktata.,Un guardado de partida aún está pendiente.,,Pelin tallennus on vielä kesken.,Une sauvegarde est déjà en cours.,,A mentés folyamatban.,Un salvataggio di gioco è ancora in corso.,セーブ中だ,게임 저장이 아직 보류 중입니다.,Een spel opslaan is nog steeds in behandeling.,En spilloppdatering venter fortsatt.,Zapis gry jest wciąż w toku.,Jogo salvo ainda pendente.,Jogo gravado ainda pendente.,O salvare este încă în așteptare.,Сохранение в очереди.,Сачувана игра идаље чека,Ett sparande av spelet väntar fortfarande.,Bir oyun kaydı hala beklemede., +Not in a saveable game.,TXT_NOTSAVEABLE,,,,Nejsi v uložitelné hře.,"Ikke i et spil, der kan gemmes.",Kein speicherbares Spiel aktiv.,Δέν είσαι σε ένα παιχνίδει που μπορεί να αποθηκευτεί,Ne estas en konservebla ludo.,No en una partida guardable.,,Ei tallennettavassa pelissä.,Vous n'êtes pas dans une partie sauvegardable.,,Nem menthető játék.,Non è in un gioco salvabile.,セーブ可能なゲームではない,저장 가능한 게임에선 불가능 합니다.,Geen opslagbaar spel actief.,Ikke i et spill som kan lagres.,Nie w grze do zapisywania.,Não está em uma partida salvável.,Não estás numa partida que possa ser gravada.,Nu ești într-un joc în care poți salva.,Не в сохранимой игре.,Није у сачувајућој игри,Inte i ett spel som kan sparas.,Kaydedilebilir bir oyunda değil., +Not in a level,TXT_NOTINLEVEL,,,,Nejsi v levelu.,Ikke i en kort,Nicht in einem Level.,Δέν ε'ισαι σε μια πίστα,Ne estas en nivelo,No en un nivel,,Ei tasossa,Vous n'êtes pas dans un niveau.,,Nem menthető pályán van.,Non è in un livello,レベル内ではない,레벨 안에선 불가능 합니다.,Niet in een level,Ikke i et nivå,Nie w poziomie.,Não está em uma fase.,Não estás em nenhum nível.,Nu ești în niciun nivel,Не на уровне,Није у нивоу,Inte i en nivå.,Bir seviyede değil, +Player is dead in a single-player game,TXT_SPPLAYERDEAD,,,,Hráč je mrtvý v singleplayer hře.,Spilleren er død i et single-player spil,Spieler ist tot in einem Einzelspieler-Spiel.,Ο παίχτης έιναι νεκρός σε ένα singleplayer παιχνίδι,Ludanto estas mortinta en sol-ludanta ludado,Jugador muerto en partida de un solo jugador,,Pelaaja on kuollut yksinpelissä,Le joueur est mort en mode solo.,,Játékos meghalt egy egyjátékos módban.,Il giocatore è morto in un gioco single player,シングルプレイでプレイヤーが死んだ,플레이어가 싱글 플레이 게임에서 죽었습니다.,Speler is dood in een een-speler spel,Spilleren er død i et enspiller-spill,Gracz jest martwy w grze dla jednego gracza,Jogador está morto em partida single player.,Jogador está morto numa partida single player.,Jucătorul este mort într-un joc single-player,Игрок мёртв в одиночной игре,Играч је мртав у сингл-плејер игри,Spelaren är död i ett enspelarspel.,Oyuncu tek oyunculu bir oyunda öldü, +Save failed,TXT_SAVEFAILED,,,,Uložení se nezdařilo.,Save mislykkedes,Speichern fehlgeschlagen.,Η αποθήκευση απέτυχε,Konservo malsukcesis,Guardado fallido,,Tallennus epäonnistui,La sauvegarde à échoué.,,Mentés meghiusult,Salvataggio fallito,セーブに失敗した。,저장 실패,Opslaan mislukt,Lagring mislyktes,Nie udało się zapisać,Falha ao salvar,Falha ao gravar,Salvare eșuată,Ошибка сохранения игры,Сачување није успело,Spara misslyckades.,Kaydetme başarısız, +Could not create screenshot.,TXT_SCREENSHOTERR,,,,Nepodařilo se pořídit snímek obrazovky.,Kunne ikke oprette et skærmbillede.,Konnte Screenshot nicht erzeugen.,Ένα screenshot δέν μπόρεσε να τραβυχτεί,Ne povis krei ekrankopion.,No se pudo crear captura de pantalla.,,Ei voitu ottaa kuvakaappausta.,La capture d'écran à échoué.,,Képernyőmentés meghiusult,Non è stato possibile effettuare la cattura dello schermo.,スクリーンショットを作成できなかった。,스크린샷을 만들 수 없음.,Kon geen screenshot maken.,Kunne ikke opprette skjermbilde.,Nie można zrobić zrzutu ekranu.,Não foi possível capturar a tela.,Não foi possível capturar ecrã,Captura de ecran nu a putut fi creată.,Ошибка создания снимка экрана.,Није успело направити снимак екрана.,Kunde inte skapa en skärmdump.,Ekran görüntüsü oluşturulamadı., +By %s,TXT_BY,As in paused by player %s.,,,hráčem %s,Af %s,Von %s,Απο @[pro_gr] %s,De %s,Por %s,,Pelaajan %s toimesta,Par %s,,%s által,Da %s,"%s より ",%s 에 의해,Met %s,Etter %s,Przez %s,Por %s,,De către %s,игроком %s,играчем %s,Av %s,Tarafından %s, -Press any key or click anywhere in the window to quit.,TXT_QUITENDOOM,,,,"Pro ukončení stiskni libovolnou klávesu, nebo klikni kdekoliv v okně.",Tryk på en vilkårlig tast eller klik et vilkårligt sted i vinduet for at afslutte.,Drücke eine Taste oder klicke mit der Maus ins Fenster zum Beenden.,Πάτα οποιοδήποτε πλήκτρο ή πάτα οπουδήποτε για να κάνεις έξοδο,Premu ajnan klavon aŭ alklaku ie ajn en la fenestro por forlasi.,Presiona una tecla o haz click en cualquier lugar de la ventana para salir.,,Paina mitä tahansa näppäintä tai napsauta minne tahansa ikkunaa lopettaaksesi.,Appuyez sur une touche ou cliquez pour quitter.,Nyomjon egy billentyűt vagy kattintson bárhova a kilépéshez.,Premi un qualunque tasto o fai un click ovunque nella finestra per uscire.,何かのキーを押すか、ウィンドウのどこかをクリックすると終了する。,아무 키를 누르거나 아무 곳이나 클릭하면 종료됩니다.,Druk op een willekeurige toets of klik ergens in het venster om te stoppen.,Trykk på en hvilken som helst tast eller klikk hvor som helst i vinduet for å avslutte.,Wciśnij dowolny klawisz lub gdziekolwiek kliknij myszką aby wyjść.,Aperte qualquer tecla ou clique em qualquer lugar na janela para sair.,Carrega numa tecla ou clique em qualquer lugar na janela para sair.,Apasă orice tastă sau dă click oriunde în fereastră pentru a ieși.,"Нажмите любую клавишу или нажмите по окну, чтобы выйти.",Притисните било који тастер или кликните било где на екрану да одустанете.,Tryck på någon tangent eller klicka någonstans i fönstret för att avsluta.,Çıkmak için herhangi bir tuşa basın veya pencerede herhangi bir yere tıklayın., -Screen Blend Options,HUDMNU_FLASH,,,,Barvení obrazovky,Indstillinger for skærmblanding,Überblendoptionen,Ρυθμίσεις Ανάμειξης Οθόνης,Ekranmisko-Agordoj,Opciones de tintado de pantalla,,Näytön sekoitusasetukset,Options de blending écran,Képernyő Keverés Beállítások,Opzioni Blending dello Schermo,スクリーンブレンド オプション,화면 조합 설정,Opties voor schermmengsel,Alternativer for skjermblanding,Opcje scalania ekranu,Opções de mescla de tela,Opções de mistura de ecrã,Setări Amestec Imagine,Настройки смешивания экрана,Подешавања блед екрана,Alternativ för skärmblandning,Ekran Karışım Seçenekleri, -3D mode,GLMNU_3DMODE,,,,3D režim,3D-tilstand,3D Modus,3D λειτουργία,3D-reĝimo,Modo 3D,,3D-tila,Mode 3D,3D mód,Modalità 3D,3Dモード,3D 모드 적용,3D-modus,3D-modus,Tryb 3D,Modo 3D,,Mod 3D,Режим 3D,3D режим,3D-läge,3D modu, -Crosshair,HUDMNU_CROSSHAIRON,,,,Zaměřovač,Trådkors,Fadenkreuz,,Reteto,Retícula,,Tähtäin,Viseur,Célkereszt,Mirino,クロスヘア,조준점,Draadkruis,Trådkors,Celownik,Mira,,Țintă,Прицел,Нишан,Hårkors,, -Subtitles,MSGMNU_SUBTITLES,,,,Titulky,Undertekster,Untertitel,Υπότιτλοι,Subtekstoj,Subtítulos,,Tekstitys,Sous-titres,Feliratok,Sottotitoli,サブタイトル,자막,Ondertitels,Undertekster,Napisy,Legendas,,Subtitrări,Субтитры,Титлови,Undertexter,Altyazılar, -Prevent gray shadows,GLPREFMNU_PALTONENOGREY,,,Prevent grey shadows,Předejít šedým stínům,Forebyg grå skygger,Vermeide graue Schatten,Απότρεξη γρί σκιών,Preventi grizajn ombrojn,Prevenir sombras grises,,Estä harmaat varjot,Eviter les ombres grises,Szürke árnyákok megakadályozása,Prevenire le ombre grigie,グレイシャドウを防ぐ,회색 그림자 없에기,Voorkom grijze schaduwen,Forhindre grå skygger,Zapobiegaj szarym cieniom,Prevenir sombras cinzentas,,Prevenire umbre gri,Убрать серые тени,Онемогући сиве сенке,Förhindra gråa skuggor,Gri gölgeleri önleyin, -Font Options,HUDMNU_FONTOPTIONS,,,,Písma,Indstillinger for skrifttyper,Zeichensatzoptionen,Ρυθμίσεις Γραμματοσειρών,Tiparo-Agordoj,Opciones de fuentes,,Fonttiasetukset,Options de police,Betű Beállítások,Opzioni per il tipo di carattere,フォント オプション,폰트 설정,Lettertype opties,Alternativer for skrifttype,Opcje czcionek,Opções de Fonte,,Setări Font,Настройки шрифта,Подешавања фонта,Typsnittsalternativ,Yazı Tipi Seçenekleri, -Use standard font for log display,FONTMNU_LOG,,,,Použít standardní font pro záznamy,Brug standardskrifttype til visning af logfiler,Benutze Standardzeichensatz für das Log,Χρησιμοποίηση πρότυπης γραμματοσειράς για προβολή ημερολόγιου,Uzi norman tiparon por protokola ekrano,Usar la fuente estándar para logs,,Käytä oletusfonttia lokinäytölle,Police standard pour affichage du log,Szabvány betűstílus használata a logokhoz,Usa il tipo di carattere di default per la visualizzazione dei messaggi di log,ログ表示に標準フォントを使用,로그 표시에서 기본 폰트 사용,Gebruik het standaardlettertype voor de weergave van logboekberichten,Bruk standard skrifttype for loggvisning,Użyj standardowej czcionki do wyświetlania dziennika,Usar fonte padrão para exibição de log,,Utilizează fontul standard pentru mesajele de tip log,Использовать стандартный шрифт для журнала,Користи стандардни фонт за приказ лога,Använd standardtypsnitt för loggvisningen,Günlük ekranı için standart yazı tipi kullanın, -Use standard font for dialogues,FONTMNU_DLG,,,,Použít standardní font pro dialogy,Brug standardskrifttype til dialoger,Benutze Standardzeichensatz für Dialoge,Χρησιμοποίηση πρότυπης γραμματοσειράς,Uzi norman tiparon por dialogoj,Usar la fuente estándar para diálogos,,Käytä oletusfonttia keskustelulle,Police standard pour dialogues,Szabvány betűstílus használata a dialógusokhoz,Usa il tipo di carattere di default per la visualizzazione dei dialoghi,ダイアログに標準フォントを使用,대화에서 기본 폰트 사용,Gebruik het standaardlettertype voor dialoogweergave,Bruk standard skrifttype for dialoger,Użyj standardowej czcionki do dialogów,Usar fonte padrão para diálogos,,Utiliează fontul standard pentru căsuțele de dialog,Использовать стандартный шрифт для диалогов,Користи стандардни фонт за дијалоге,Använd standardtypsnitt för dialoger,Diyaloglar için standart yazı tipi kullanın, +Press any key or click anywhere in the window to quit.,TXT_QUITENDOOM,,,,"Pro ukončení stiskni libovolnou klávesu, nebo klikni kdekoliv v okně.",Tryk på en vilkårlig tast eller klik et vilkårligt sted i vinduet for at afslutte.,Drücke eine Taste oder klicke mit der Maus ins Fenster zum Beenden.,Πάτα οποιοδήποτε πλήκτρο ή πάτα οπουδήποτε για να κάνεις έξοδο,Premu ajnan klavon aŭ alklaku ie ajn en la fenestro por forlasi.,Presiona una tecla o haz click en cualquier lugar de la ventana para salir.,,Paina mitä tahansa näppäintä tai napsauta minne tahansa ikkunaa lopettaaksesi.,Appuyez sur une touche ou cliquez pour quitter.,,Nyomjon egy billentyűt vagy kattintson bárhova a kilépéshez.,Premi un qualunque tasto o fai un click ovunque nella finestra per uscire.,何かのキーを押すか、ウィンドウのどこかをクリックすると終了する。,아무 키를 누르거나 아무 곳이나 클릭하면 종료됩니다.,Druk op een willekeurige toets of klik ergens in het venster om te stoppen.,Trykk på en hvilken som helst tast eller klikk hvor som helst i vinduet for å avslutte.,Wciśnij dowolny klawisz lub gdziekolwiek kliknij myszką aby wyjść.,Aperte qualquer tecla ou clique em qualquer lugar na janela para sair.,Carrega numa tecla ou clique em qualquer lugar na janela para sair.,Apasă orice tastă sau dă click oriunde în fereastră pentru a ieși.,"Нажмите любую клавишу или нажмите по окну, чтобы выйти.",Притисните било који тастер или кликните било где на екрану да одустанете.,Tryck på någon tangent eller klicka någonstans i fönstret för att avsluta.,Çıkmak için herhangi bir tuşa basın veya pencerede herhangi bir yere tıklayın., +Screen Blend Options,HUDMNU_FLASH,,,,Barvení obrazovky,Indstillinger for skærmblanding,Überblendoptionen,Ρυθμίσεις Ανάμειξης Οθόνης,Ekranmisko-Agordoj,Opciones de tintado de pantalla,,Näytön sekoitusasetukset,Options de blending écran,,Képernyő Keverés Beállítások,Opzioni Blending dello Schermo,スクリーンブレンド オプション,화면 조합 설정,Opties voor schermmengsel,Alternativer for skjermblanding,Opcje scalania ekranu,Opções de mescla de tela,Opções de mistura de ecrã,Setări Amestec Imagine,Настройки смешивания экрана,Подешавања блед екрана,Alternativ för skärmblandning,Ekran Karışım Seçenekleri, +3D mode,GLMNU_3DMODE,,,,3D režim,3D-tilstand,3D Modus,3D λειτουργία,3D-reĝimo,Modo 3D,,3D-tila,Mode 3D,,3D mód,Modalità 3D,3Dモード,3D 모드 적용,3D-modus,3D-modus,Tryb 3D,Modo 3D,,Mod 3D,Режим 3D,3D режим,3D-läge,3D modu, +Crosshair,HUDMNU_CROSSHAIRON,,,,Zaměřovač,Trådkors,Fadenkreuz,,Reteto,Retícula,,Tähtäin,Viseur,,Célkereszt,Mirino,クロスヘア,조준점,Draadkruis,Trådkors,Celownik,Mira,,Țintă,Прицел,Нишан,Hårkors,, +Subtitles,MSGMNU_SUBTITLES,,,,Titulky,Undertekster,Untertitel,Υπότιτλοι,Subtekstoj,Subtítulos,,Tekstitys,Sous-titres,,Feliratok,Sottotitoli,サブタイトル,자막,Ondertitels,Undertekster,Napisy,Legendas,,Subtitrări,Субтитры,Титлови,Undertexter,Altyazılar, +Prevent gray shadows,GLPREFMNU_PALTONENOGREY,,,Prevent grey shadows,Předejít šedým stínům,Forebyg grå skygger,Vermeide graue Schatten,Απότρεξη γρί σκιών,Preventi grizajn ombrojn,Prevenir sombras grises,,Estä harmaat varjot,Eviter les ombres grises,,Szürke árnyákok megakadályozása,Prevenire le ombre grigie,グレイシャドウを防ぐ,회색 그림자 없에기,Voorkom grijze schaduwen,Forhindre grå skygger,Zapobiegaj szarym cieniom,Prevenir sombras cinzentas,,Prevenire umbre gri,Убрать серые тени,Онемогући сиве сенке,Förhindra gråa skuggor,Gri gölgeleri önleyin, +Font Options,HUDMNU_FONTOPTIONS,,,,Písma,Indstillinger for skrifttyper,Zeichensatzoptionen,Ρυθμίσεις Γραμματοσειρών,Tiparo-Agordoj,Opciones de fuentes,,Fonttiasetukset,Options de police,,Betű Beállítások,Opzioni per il tipo di carattere,フォント オプション,폰트 설정,Lettertype opties,Alternativer for skrifttype,Opcje czcionek,Opções de Fonte,,Setări Font,Настройки шрифта,Подешавања фонта,Typsnittsalternativ,Yazı Tipi Seçenekleri, +Use standard font for log display,FONTMNU_LOG,,,,Použít standardní font pro záznamy,Brug standardskrifttype til visning af logfiler,Benutze Standardzeichensatz für das Log,Χρησιμοποίηση πρότυπης γραμματοσειράς για προβολή ημερολόγιου,Uzi norman tiparon por protokola ekrano,Usar la fuente estándar para logs,,Käytä oletusfonttia lokinäytölle,Police standard pour affichage du log,,Szabvány betűstílus használata a logokhoz,Usa il tipo di carattere di default per la visualizzazione dei messaggi di log,ログ表示に標準フォントを使用,로그 표시에서 기본 폰트 사용,Gebruik het standaardlettertype voor de weergave van logboekberichten,Bruk standard skrifttype for loggvisning,Użyj standardowej czcionki do wyświetlania dziennika,Usar fonte padrão para exibição de log,,Utilizează fontul standard pentru mesajele de tip log,Использовать стандартный шрифт для журнала,Користи стандардни фонт за приказ лога,Använd standardtypsnitt för loggvisningen,Günlük ekranı için standart yazı tipi kullanın, +Use standard font for dialogues,FONTMNU_DLG,,,,Použít standardní font pro dialogy,Brug standardskrifttype til dialoger,Benutze Standardzeichensatz für Dialoge,Χρησιμοποίηση πρότυπης γραμματοσειράς,Uzi norman tiparon por dialogoj,Usar la fuente estándar para diálogos,,Käytä oletusfonttia keskustelulle,Police standard pour dialogues,,Szabvány betűstílus használata a dialógusokhoz,Usa il tipo di carattere di default per la visualizzazione dei dialoghi,ダイアログに標準フォントを使用,대화에서 기본 폰트 사용,Gebruik het standaardlettertype voor dialoogweergave,Bruk standard skrifttype for dialoger,Użyj standardowej czcionki do dialogów,Usar fonte padrão para diálogos,,Utiliează fontul standard pentru căsuțele de dialog,Использовать стандартный шрифт для диалогов,Користи стандардни фонт за дијалоге,Använd standardtypsnitt för dialoger,Diyaloglar için standart yazı tipi kullanın, Quick Exit,MISCMNU_QUICKEXIT,,,,Rychlé ukončení,Hurtig afslutning,"Schnelles Beenden -",Γρήγορη Έξοδος,Rapida Eliro,Salida Rápida,,Pikapoistuminen,Sortie rapide,Gyors kilépés,Uscita rapida,終了メッセージ無し,빠른 종료,Snel eindigen,Hurtigavslutning,Szybkie wyjście,Saída Rápida,,Ieșire Rapidă,Быстрый выход,Брзи излаз,Snabbavslutning,Hızlı Çıkış, -Custom Inverse Map,DSPLYMNU_CUSTOMINVERTMAP,,,,Vlastní inverzní barvení,Brugerdefinerede omvendte farver,Benutzerdefinierte invertierte Farben,Προσαρμοσμένος Ανάποδος Χάρτης,Propra Inversa Mapo,Personalizar Filtro Invertido,,Mukautettu käänteinen kartta,Couleurs inverses personnalisées,Egyéni inverz pálya,Mappa inversa personalizzata,マップ反転色カスタム,사용자 지정 반전 맵,Aangepaste inversiekleuren,Egendefinert omvendt kart,Niestandardowe odwrócone kolory,Personalizar Cores Invertidas,,Personalizare Inverse Map,Настроить цвета при неуязвимости,Прилагођена обрнута мапа,Anpassad omvänd karta,Özel Ters Harita, +",Γρήγορη Έξοδος,Rapida Eliro,Salida Rápida,,Pikapoistuminen,Sortie rapide,,Gyors kilépés,Uscita rapida,終了メッセージ無し,빠른 종료,Snel eindigen,Hurtigavslutning,Szybkie wyjście,Saída Rápida,,Ieșire Rapidă,Быстрый выход,Брзи излаз,Snabbavslutning,Hızlı Çıkış, +Custom Inverse Map,DSPLYMNU_CUSTOMINVERTMAP,,,,Vlastní inverzní barvení,Brugerdefinerede omvendte farver,Benutzerdefinierte invertierte Farben,Προσαρμοσμένος Ανάποδος Χάρτης,Propra Inversa Mapo,Personalizar Filtro Invertido,,Mukautettu käänteinen kartta,Couleurs inverses personnalisées,,Egyéni inverz pálya,Mappa inversa personalizzata,マップ反転色カスタム,사용자 지정 반전 맵,Aangepaste inversiekleuren,Egendefinert omvendt kart,Niestandardowa inwersja kolory,Personalizar Cores Invertidas,,Personalizare Inverse Map,Настроить цвета при неуязвимости,Прилагођена обрнута мапа,Anpassad omvänd karta,Özel Ters Harita, "Custom Inverse Color Dark ",DSPLYMNU_CUSTOMINVERTC1,,,Custom Inverse Colour Dark,Vlastní inverzní tmavá barva,Brugerdefineret omvendt farve mørk,Dunkle Farbe für Invertierung,Προσαρμοσμένος Ανάποδο Χρώμα Σκοτεινό,Propra Inversa Koloro Malhela,"Color Oscuro de Filtro Invertido -",,Mukautettu käänteinen tumma väri,Couleur foncée pour l'inversion,Egyéni inverz sötét szín,Colore inverso personalizzato scuro,反転色カスタム 暗,사용자 지정 어두운 반전 색상,Aangepaste donkere inversiekleur,"Egendefinert invers farge mørk +",,Mukautettu käänteinen tumma väri,Couleur foncée pour l'inversion,,Egyéni inverz sötét szín,Colore inverso personalizzato scuro,反転色カスタム 暗,사용자 지정 어두운 반전 색상,Aangepaste donkere inversiekleur,"Egendefinert invers farge mørk ",Ciemny kolor do inwersji,Personalizar Cores Invertidas - Cor escura,,Personalizare Culoare Inverse Map Închisă,Тёмный цвет,Прилагођена инверзна боја тамна,"Anpassad omvänd färg Mörk ","Özel Ters Renk Koyu ", Custom Inverse Color Light,DSPLYMNU_CUSTOMINVERTC2,,,Custom Inverse Colour Light,Vlastní inverzní světlá barva,Brugerdefineret omvendt farve lys,Helle Farbe für Invertierung,Προσαρμοσμένος Ανάποδο Χρώμα Φωτεινό,Propra Inversa Koloro Hela,Color Claro de Filtro Invertido,,"Mukautettu käänteinen vaalea väri -",Couleur claire pour l'inversion,Egyéni inverz világos szín,Colore inverso personalizzato chiaro,反転色カスタム 明,사용자 지정 밝은 반전 색상,Aangepaste lichte inversiekleur,Egendefinert invers farge lys,Jasny kolor do inwersji,Personalizar Cores Invertidas - Cor clara,,Personalizare Culoare Inverse Map Deschisă,Светлый цвет,Прилагођено инверзно светло у боји,Anpassad omvänd färg ljus,Özel Ters Renkli Işık, -Weapon bob amount when firing,DSPLYMNU_BOBFIRE,,,,Pohupování zbraně při střelbě,Våben bob-beløb ved affyring,Waffenpendeln beim Schießen,,Vidi kvanton de kapo-balanciĝo dum pafado,Balanceo de pantalla al disparar,,Aseen heilumisvoimakkuus ammuttaessa,Intensité du chaloupage lors des tirs,Fegyvermozgás lövésnél,Movimento dell'arma quando si spara,射撃時の武器スイング,사격 시 무기 스윙,Wapenzwaai bij schieten,Våben bob-beløp ved avfyring,Częstotliwość bujania się broni przy strzelaniu,Quantidade de balanço ao atirar,,Intensitate mișcare arme în timpul deplasării,Кол-во тряски экрана при стрельбе,,Vapen bob-värde vid skottlossning,Ateşleme sırasında bob miktarını görüntüleme, -Intermission and Screen Border Classic Scaling,SCALEMNU_SCALECLASSIC,HUD->Scaling Options,,,Klasické škálování text. obrazovek a okrajů obrazovky,Pause og skærmkant Klassisk skalering,Klassische Skalierung von Texthintergrund und Rahmen,,Klasika Skalado de Intermito kaj Ekranbordero,Escalado Clásico de Intermisión y Bordes de Pantalla,,Perinteinen väliruutujen ja ruudunreunusten skaalaus,Mise à l'échelle classique pour bordure écran et intermission,Megszakító és Képszél klasszikus arányosítása,Ridimensionamento classico dell'intermissione e del bordo dello schermo,旧式スケールのクリア結果と画面ボーダー,인터미션 및 화면 테두리 클래식 스케일링,Intermissie en schermrand schalen,Klassisk skalering av pause og skjermkant,Klasyczne skalowanie wstawek i ramek,Escala clássica para tela de intervalo e borda de tela,,Scară bordură antract și ecran,Классические размеры экрана между миссиями и границ экрана,Класично скалирање паузе и ивице екрана,Klassisk skalning för paus och skärmkant,Ara ve Ekran Kenarlığı Klasik Ölçeklendirme, -Intermission background,SCALEMNU_INTER,,,,Pozadí textových obrazovek,Intermission baggrund,Texthintergrund,,Fono de intermito,Fondo de intermisión,,Väliruutujen tausta,Fond d'écran intermission,Megszakító háttér,Sottofondi delle intermissioni,クリア結果の背景,인터미션 배경,Intermissieachtergrond,Pause bakgrunn,Tło wstawek,Fundo da tela de intervalo,,Fundal antract,Фон экрана между миссиями,Интермиссион бацкгроунд,Bakgrund för mellanslag,Devre arası arka planı, -Screen border,SCALEMNU_BORDER,,,,Okraje obrazovky,Skærmbord,Rahmen,,Ekranbordero,Bordes de pantalla,,Ruudunreunus,Bordure d'écran,Kép széle,Bordo dello schermo,画面ボーダー,화면 테두리,Schermrand,Skjermkant,Ramka,Borda de tela,,Bordură ecran,Границы экрана,Граница екрана,Skärmgräns,Ekran kenarlığı, -Scaling factor,SCALEMNU_FACTOR,,,,Měřítko,Skaleringsfaktor,Skalierungsfaktor,,Skalfaktoro,Factor de escalado,,Skaalauskerroin,Facteur de mise à l'échelle,Arányosító faktor,Fattore di scala,スケーリング倍率,스케일링 계수,Schaalfactor,Skaleringsfaktor,Współczynnik skalowania,Fator de escala,,Factor de scalare,Значение масштабирования,Фактор за скалирање,Skalningsfaktor,Ölçekleme faktörü, -Aspect ratio,SCALEMNU_RATIO,,,,Poměr stran,Aspektforhold,Seitenverhältnis,,Proporcio,Ratio de aspecto,,Kuvasuhde,,Képarány,Proporzioni,アスペクト比,화면 비율,Beeldverhouding,Bildeforhold,Rozdzielczość,Proporção de tela,,Aspect imagine,Соотношение сторон,Однос ширине и висине,Bildförhållande,En boy oranı, -Build,OPTVAL_BUILD,"as in ""Build engine"". This should not be translated unless there is a translated name for the engine",,,,,,,,,,,,,,,,,,,,,,,,,, -Show Tally Screen On Level Exit,MISCMNU_ALWAYSTALLY,sv_alwaystally,,,Zobrazit výsledky na konci mapy,"Vis resultater, når du forlader kortet",Zeige Ergebnisse beim Verlassen des Levels,,Montri Kalkulekranon Sur Niveleliro,Mostrar pantalla de conteo al salir de nivel,,Näytä pisteruutu tasosta poistuttaessa,Montrer les scores en fin de niveau,Elért pontok mutatása a megszakító képen,Mostra i punteggi alla fine del livello,Exit時にタリー画面を表示,레벨 종료 시 집계 화면 표시,Toon tellingen na eind van het level,Vis Tally-skjerm på nivåutgang,Pokazuj wyniki pod koniec poziomu,Exibir tela de pontuação no fim da fase,,Afișează Totalul la Ieșirea din Nivel,Отображение экрана статистики при выходе с уровня,Прикажи екран за израчунавање на излазу из нивоа,Visa Tally-skärmen på nivå Avsluta,Seviye Çıkışında Çetele Ekranını Göster, -Mod Defined,OPTVAL_MODDEFINED,this is '==0',,,Určeno mody,Mod Defineret,Mod-definiert,,Difinita per modifaĵo,Definido por mod,,Modin määrittämä,Défini par Mod,Beállított Mod,Definito dalla mod,Mod定義,모드 정의,Volgens de mod,Mod Definert,Zdefiniowane przez modyfikację,Definir por mod,,Definit de către moduri,Определено модификацией,Мод Дефинед,Mod definierad,Mod Tanımlı, -"Always, except within hubs",OPTVAL_NOTHUBS,,,,Vždy kromě hubů,"Altid, undtagen i hubs","Immer, außer in Hubs",,"Ĉiam, krom en naboj","Siempre, excepto en hubs",,"Aina, keskustasoja lukuun ottamatta","Toujours, sauf dans les hubs","Mindig, kivétel a csomópontoknál","Sempre, tranne gli hub",区間を除き、常に,"항상, 허브 내 제외","Altijd, behalve binnen hubs","Alltid, unntatt innenfor knutepunkter","Zawsze, oprócz hubów","Sempre, exceto em hubs",,"Mereu, mai puțin în hub-uri",Всегда (кроме групп уровней),"Увек, осим унутар чворишта","Alltid, utom i nav","Her zaman, hub'lar hariç", -"Always, even within hubs",OPTVAL_WITHHUBS,,,,Vždy včetně hubů,"Altid, også inden for hubs","Immer, auch in Hubs",,"Ĉiam, eĉ en naboj","Siempre, incluso en hubs",,"Aina, keskustasot mukaan lukien","Toujours, même dans les hubs","Mindig, még a csomópontoknál is","Sempre, inclusi gli hub",区間内でも、常に,"항상, 허브 내에서도","Altijd, zelfs binnen hubs","Alltid, også innenfor knutepunkter","Zawsze, nawet w hubach","Sempre, inclusive em hubs",,"Mereu, inclusiv în hub-uri",Всегда (включая группы уровни),"Увек, чак и унутар чворишта","Alltid, även inom nav","Her zaman, merkezler içinde bile", -Preferred keyboard layout,CNTRLMNU_LAYOUT,,,,Preferované rozložení klávesnice,Foretrukket tastaturlayout,Bevorzugte Tastaturbelegung,,Preferita klavararanĝo,Disposición de teclado preferida,,Lempinäppäinasettelu,Organisation préférée du clavier,Preferált billentyűkiosztás,Layout della tastiera preferito,優先するキー配列,기본 키보드 레이아웃,Voorkeur toetsenbordindeling,Foretrukket tastaturoppsett,Preferowany układ klawiatury,Layout de teclado preferido,,Schemă de control preferată,Раскладка клавиатуры,Жељени распоред тастатуре,Föredragen tangentbordslayout,Tercih edilen klavye düzeni, -Classic ZDoom,OPTVAL_CLASSICZ,,,,Klasický ZDoom,Klassisk ZDoom,ZDoom klassisch,,Klasika ZDoom,ZDoom clásico,,Perinteinen ZDoom,Zdoom Classique,Klasszikus ZDoom,ZDoom Classico,従来のZDOOM,클래식 ZDoom,Klassiek ZDoom,Klassisk ZDoom,Klasyczny ZDoom,ZDoom Clássico,,ZDoom Clasic,Классическая ZDoom,Цлассиц ЗДоом,Klassiskt ZDoom,Klasik ZDoom, -Modern (WASD),OPTVAL_MODERN,,,,Moderní (WASD),Moderne (WASD),,,Moderna (WASD),Moderno (WASD),,Nykyaikainen (WASD),Moderne (ZQSD),,Moderno (WASD),現代的(WASD),모던(WASD),,Moderne (WASD),Współczesny (WSAD),Moderno (WASD),,Modernă (WASD),Современная (ЦФЫВ),модерно,Modernt (WASD),, -Modern (Keypad),OPTVAL_MODERNLEFT,,,,Moderní (číselník),Moderne (Keypad),,,Moderna (Cifera klavaro),Moderno (Teclado Numérico),,Nykyaikainen (numeronäppäimistö),Moderne (Pavé numérique),Modern (numpad),Moderno (tastierino numerico),現代的(Keypad),모던(키패드),Modern (nummeriek toetsenbord),Moderne (Keypad),Współczesny (klawiatura numeryczna),Moderno (Teclado numérico),,Modernă (Tastatură),Современная (цифр. клавиатура),Модерна (тастатура),Modernt (tangentbord),Modern (Tuş Takımı), -Strict KEYCONF Weapons/Players,MISCMNU_SETSLOTSTRICT,,,,Striktně zbraně/hráči z KEYCONF,Strenge KEYCONF Våben/spillere,Strikte KEYKONF Behandlung für Waffen und Spieler,,Strikta KEYCONF Armiloj/Ludantoj,KEYCONF de Armas/Jugadores estricto,,Pelaajien/Aseiden tiukka KEYCONF,Armes/Joueurs strictement selon KEYCONF,Szigorú KEYCONF a Fegyverek/Játékosok esetében,KEYCONF rigoroso per armi/giocatori,厳密なKEYCONFの武器/プレイヤー,엄격한 키콘프 무기/플레이어,Strikte KEYCONF Wapens/Spelers,Strenge KEYCONF-våpen/spillere,Surowe opcje KEYCONF dla broni/graczy,Armas/Jogadores estritamente de acordo com KEYCONF,,KEYCONF Strictă pentru Arme/Jucători,Строгий KEYCONF для оружия/игроков,Строго KEYKONF оружје/играчи,Strikt KEYCONF Vapen/spelare,Sıkı KEYCONF Silahlar/Oyuncular, +",Couleur claire pour l'inversion,,Egyéni inverz világos szín,Colore inverso personalizzato chiaro,反転色カスタム 明,사용자 지정 밝은 반전 색상,Aangepaste lichte inversiekleur,Egendefinert invers farge lys,Jasny kolor do inwersji,Personalizar Cores Invertidas - Cor clara,,Personalizare Culoare Inverse Map Deschisă,Светлый цвет,Прилагођено инверзно светло у боји,Anpassad omvänd färg ljus,Özel Ters Renkli Işık, +Weapon bob amount when firing,DSPLYMNU_BOBFIRE,,,,Pohupování zbraně při střelbě,Våben bob-beløb ved affyring,Waffenpendeln beim Schießen,,Vidi kvanton de kapo-balanciĝo dum pafado,Balanceo de pantalla al disparar,,Aseen heilumisvoimakkuus ammuttaessa,Intensité du chaloupage lors des tirs,,Fegyvermozgás lövésnél,Movimento dell'arma quando si spara,射撃時の武器スイング,사격 시 무기 스윙,Wapenzwaai bij schieten,Våben bob-beløp ved avfyring,Częstotliwość bujania broni przy strzelaniu,Quantidade de balanço ao atirar,,Intensitate mișcare arme în timpul deplasării,Кол-во тряски экрана при стрельбе,,Vapen bob-värde vid skottlossning,Ateşleme sırasında bob miktarını görüntüleme, +Intermission and Screen Border Classic Scaling,SCALEMNU_SCALECLASSIC,HUD->Scaling Options,,,Klasické škálování text. obrazovek a okrajů obrazovky,Pause og skærmkant Klassisk skalering,Klassische Skalierung von Texthintergrund und Rahmen,,Klasika Skalado de Intermito kaj Ekranbordero,Escalado Clásico de Intermisión y Bordes de Pantalla,,Perinteinen väliruutujen ja ruudunreunusten skaalaus,Mise à l'échelle classique pour bordure écran et intermission,,Megszakító és Képszél klasszikus arányosítása,Ridimensionamento classico dell'intermissione e del bordo dello schermo,旧式スケールのクリア結果と画面ボーダー,인터미션 및 화면 테두리 클래식 스케일링,Intermissie en schermrand schalen,Klassisk skalering av pause og skjermkant,Klasyczne skalowanie przerywników i ramek,Escala clássica para tela de intervalo e borda de tela,,Scară bordură antract și ecran,Классические размеры экрана между миссиями и границ экрана,Класично скалирање паузе и ивице екрана,Klassisk skalning för paus och skärmkant,Ara ve Ekran Kenarlığı Klasik Ölçeklendirme, +Intermission background,SCALEMNU_INTER,,,,Pozadí textových obrazovek,Intermission baggrund,Texthintergrund,,Fono de intermito,Fondo de intermisión,,Väliruutujen tausta,Fond d'écran intermission,,Megszakító háttér,Sottofondi delle intermissioni,クリア結果の背景,인터미션 배경,Intermissieachtergrond,Pause bakgrunn,Tło przerywników,Fundo da tela de intervalo,,Fundal antract,Фон экрана между миссиями,Интермиссион бацкгроунд,Bakgrund för mellanslag,Devre arası arka planı, +Screen border,SCALEMNU_BORDER,,,,Okraje obrazovky,Skærmbord,Rahmen,,Ekranbordero,Bordes de pantalla,,Ruudunreunus,Bordure d'écran,,Kép széle,Bordo dello schermo,画面ボーダー,화면 테두리,Schermrand,Skjermkant,Ramka,Borda de tela,,Bordură ecran,Границы экрана,Граница екрана,Skärmgräns,Ekran kenarlığı, +Scaling factor,SCALEMNU_FACTOR,,,,Měřítko,Skaleringsfaktor,Skalierungsfaktor,,Skalfaktoro,Factor de escalado,,Skaalauskerroin,Facteur de mise à l'échelle,,Arányosító faktor,Fattore di scala,スケーリング倍率,스케일링 계수,Schaalfactor,Skaleringsfaktor,Współczynnik skalowania,Fator de escala,,Factor de scalare,Значение масштабирования,Фактор за скалирање,Skalningsfaktor,Ölçekleme faktörü, +Aspect ratio,SCALEMNU_RATIO,,,,Poměr stran,Aspektforhold,Seitenverhältnis,,Proporcio,Ratio de aspecto,,Kuvasuhde,,,Képarány,Proporzioni,アスペクト比,화면 비율,Beeldverhouding,Bildeforhold,Rozdzielczość,Proporção de tela,,Aspect imagine,Соотношение сторон,Однос ширине и висине,Bildförhållande,En boy oranı, +Build,OPTVAL_BUILD,"as in ""Build engine"". This should not be translated unless there is a translated name for the engine",,,,,,,,,,,,,,,,,,,,,,,,,,, +Show Tally Screen On Level Exit,MISCMNU_ALWAYSTALLY,sv_alwaystally,,,Zobrazit výsledky na konci mapy,"Vis resultater, når du forlader kortet",Zeige Ergebnisse beim Verlassen des Levels,,Montri Kalkulekranon Sur Niveleliro,Mostrar pantalla de conteo al salir de nivel,,Näytä pisteruutu tasosta poistuttaessa,Montrer les scores en fin de niveau,,Elért pontok mutatása a megszakító képen,Mostra i punteggi alla fine del livello,Exit時にタリー画面を表示,레벨 종료 시 집계 화면 표시,Toon tellingen na eind van het level,Vis Tally-skjerm på nivåutgang,Pokazuj wyniki pod koniec poziomu,Exibir tela de pontuação no fim da fase,,Afișează Totalul la Ieșirea din Nivel,Отображение экрана статистики при выходе с уровня,Прикажи екран за израчунавање на излазу из нивоа,Visa Tally-skärmen på nivå Avsluta,Seviye Çıkışında Çetele Ekranını Göster, +Mod Defined,OPTVAL_MODDEFINED,this is '==0',,,Určeno mody,Mod Defineret,Mod-definiert,,Difinita per modifaĵo,Definido por mod,,Modin määrittämä,Défini par Mod,,Beállított Mod,Definito dalla mod,Mod定義,모드 정의,Volgens de mod,Mod Definert,Zdefiniowane przez modyfikację,Definir por mod,,Definit de către moduri,Определено модификацией,Мод Дефинед,Mod definierad,Mod Tanımlı, +"Always, except within hubs",OPTVAL_NOTHUBS,,,,Vždy kromě hubů,"Altid, undtagen i hubs","Immer, außer in Hubs",,"Ĉiam, krom en naboj","Siempre, excepto en hubs",,"Aina, keskustasoja lukuun ottamatta","Toujours, sauf dans les hubs",,"Mindig, kivétel a csomópontoknál","Sempre, tranne gli hub",区間を除き、常に,"항상, 허브 내 제외","Altijd, behalve binnen hubs","Alltid, unntatt innenfor knutepunkter","Zawsze, oprócz hubów","Sempre, exceto em hubs",,"Mereu, mai puțin în hub-uri",Всегда (кроме групп уровней),"Увек, осим унутар чворишта","Alltid, utom i nav","Her zaman, hub'lar hariç", +"Always, even within hubs",OPTVAL_WITHHUBS,,,,Vždy včetně hubů,"Altid, også inden for hubs","Immer, auch in Hubs",,"Ĉiam, eĉ en naboj","Siempre, incluso en hubs",,"Aina, keskustasot mukaan lukien","Toujours, même dans les hubs",,"Mindig, még a csomópontoknál is","Sempre, inclusi gli hub",区間内でも、常に,"항상, 허브 내에서도","Altijd, zelfs binnen hubs","Alltid, også innenfor knutepunkter","Zawsze, nawet w hubach","Sempre, inclusive em hubs",,"Mereu, inclusiv în hub-uri",Всегда (включая группы уровни),"Увек, чак и унутар чворишта","Alltid, även inom nav","Her zaman, merkezler içinde bile", +Preferred keyboard layout,CNTRLMNU_LAYOUT,,,,Preferované rozložení klávesnice,Foretrukket tastaturlayout,Bevorzugte Tastaturbelegung,,Preferita klavararanĝo,Disposición de teclado preferida,,Lempinäppäinasettelu,Organisation préférée du clavier,,Preferált billentyűkiosztás,Layout della tastiera preferito,優先するキー配列,기본 키보드 레이아웃,Voorkeur toetsenbordindeling,Foretrukket tastaturoppsett,Preferowany układ klawiatury,Layout de teclado preferido,,Schemă de control preferată,Раскладка клавиатуры,Жељени распоред тастатуре,Föredragen tangentbordslayout,Tercih edilen klavye düzeni, +Classic ZDoom,OPTVAL_CLASSICZ,,,,Klasický ZDoom,Klassisk ZDoom,ZDoom klassisch,,Klasika ZDoom,ZDoom clásico,,Perinteinen ZDoom,Zdoom Classique,,Klasszikus ZDoom,ZDoom Classico,従来のZDOOM,클래식 ZDoom,Klassiek ZDoom,Klassisk ZDoom,Klasyczny ZDoom,ZDoom Clássico,,ZDoom Clasic,Классическая ZDoom,Цлассиц ЗДоом,Klassiskt ZDoom,Klasik ZDoom, +Modern (WASD),OPTVAL_MODERN,,,,Moderní (WASD),Moderne (WASD),,,Moderna (WASD),Moderno (WASD),,Nykyaikainen (WASD),Moderne (ZQSD),,,Moderno (WASD),現代的(WASD),모던(WASD),,Moderne (WASD),Współczesny (WSAD),Moderno (WASD),,Modernă (WASD),Современная (ЦФЫВ),модерно,Modernt (WASD),, +Modern (Keypad),OPTVAL_MODERNLEFT,,,,Moderní (číselník),Moderne (Keypad),,,Moderna (Cifera klavaro),Moderno (Teclado Numérico),,Nykyaikainen (numeronäppäimistö),Moderne (Pavé numérique),,Modern (numpad),Moderno (tastierino numerico),現代的(Keypad),모던(키패드),Modern (nummeriek toetsenbord),Moderne (Keypad),Współczesny (klawiatura numeryczna),Moderno (Teclado numérico),,Modernă (Tastatură),Современная (цифр. клавиатура),Модерна (тастатура),Modernt (tangentbord),Modern (Tuş Takımı), +Strict KEYCONF Weapons/Players,MISCMNU_SETSLOTSTRICT,,,,Striktně zbraně/hráči z KEYCONF,Strenge KEYCONF Våben/spillere,Strikte KEYKONF Behandlung für Waffen und Spieler,,Strikta KEYCONF Armiloj/Ludantoj,KEYCONF de Armas/Jugadores estricto,,Pelaajien/Aseiden tiukka KEYCONF,Armes/Joueurs strictement selon KEYCONF,,Szigorú KEYCONF a Fegyverek/Játékosok esetében,KEYCONF rigoroso per armi/giocatori,厳密なKEYCONFの武器/プレイヤー,엄격한 키콘프 무기/플레이어,Strikte KEYCONF Wapens/Spelers,Strenge KEYCONF-våpen/spillere,Surowe opcje KEYCONF dla broni/graczy,Armas/Jogadores estritamente de acordo com KEYCONF,,KEYCONF Strictă pentru Arme/Jucători,Строгий KEYCONF для оружия/игроков,Строго KEYKONF оружје/играчи,Strikt KEYCONF Vapen/spelare,Sıkı KEYCONF Silahlar/Oyuncular, Classic ZDoom menu scaling,"MISCMNU_CLEANMENU -",,,,Škálování menu dle starého ZDoomu,Klassisk ZDoom-menu skalering,Alte ZDoom-Skalierung im Menü,,Klasika skalado de ZDoom-menuo,Escalado clásico de ZDoom en menús,,Perinteinen ZDoomin skaalaus valikossa,Mise à l'échelle du menu ZDoom Classique,Klasszikus ZDoom menü arányok,Fattore di scala ZDoom classico per i menu,従来のZDメニュースケール,클래식 ZDoom 메뉴 크기 조정,Klassieke ZDoom-menuschaal,Klassisk ZDoom-menyskalering,Klasyczne skalowanie menu z ZDooma,Escala clássica para menu do ZDoom,,Scară meniuri ZDoom clasică,Классический размер меню ZDoom,Класично скалирање ZDoom менија,Skalning av Classic ZDoom-menyn,Klasik ZDoom menü ölçeklendirme, -Use percents on summary screen,MISCMNU_WIPERCENT,,,,Použít procenta ve výsledcích mapy,Brug procenter på oversigtsskærmen,Zeige Prozente auf Statistikseite,,Uzi procentojn sur resumekrano,Usar porcentajes en pantalla de sumario,,Käytä prosentteja pisteruuduilla,Utiliser pourcentages sur l'écran de fin de niveau,Százalékok használata az összefoglaló oldalon,Usa percentuali per le schermate di riepilogo,集計画面でパーセント表示,요약 화면에서 퍼센트 사용,Gebruik procenten op het overzichtsscherm,Bruk prosenter på sammendragsskjermen,Używaj procentów w ekranie wyników pod koniec poziomu,Usar porcentagem na tela de resumo,,Folosește procentaje la totaluri,Использовать проценты на экране итогов уровня,Користите проценте на екрану резимеа,Använd procentsatser på sammanfattningsskärmen,Özet ekranında yüzdeleri kullanma, -Classic ZDoom scaling on summary screen,MISCMNU_CLEANSTAT,,,,Škálovat obrazovky se shrnutím dle starého ZDoomu,Klassisk ZDoom-skala på oversigtsskærmen,Alte ZDoom-Skalierung auf Statistikseite,,Klasika ZDoom-skalado sur resumekrano,Escalado clásico de ZDoom en pantalla de sumario,,Perinteinen ZDoomin skaalaus pisteruudulla,Mise à l'échelle écran de fin de niveau ZDoom Classique,Klasszikus ZDoom arányok az összefoglaló oldalon,Fattore di scala ZDoom classico per le schermate di riepilogo,集計画面で従来のZDスケール,요약 화면에서 클래식 ZDoom 스케일링,Klassieke ZDoom-schaalverdeling op overzichtsscherm,Klassisk ZDoom-skalering på oppsummeringsskjermen,Klasyczne skalowanie ekranu z wynikami poziomu,Escala clássica do ZDoom na tela de resumo,,Scară ZDoom clasică a tabelei de marcaj,Классический размер ZDoom экрана итогов уровня,Класично ZDoom скалирање на екрану сажетка,Klassisk ZDoom-skalering på sammanfattningsskärmen,Özet ekranında klasik ZDoom ölçeklendirme, -Citizen,TAG_STRIFEZOMBIE,"Called ""citizens"" according to Doomwiki",,,Občan,Borger,Bürger,Πολίτης,Civilulo,Ciudadano,,Kansalainen,Citoyen,Polgár,Cittadino,住民,시민,Burger,Innbygger,Mieszkańcy,Cidadão,,Cetățean,Горожанин,грађанин,Medborgare,Vatandaş, -Ceiling Turret,TAG_CEILINGTURRET,,,,Střílna,Tårn til loftet,Deckengeschütz,,Plafona tureto,Torreta de techo,,Kattotykkitorni,Tourelle de plafond,Plafon lövésztorony,Torretta da soffitto,警備システム,천장 터렛,Plafond torentje,Tak-tårn,Wieżyczka,Defesa Automática,,Turetă de Tavan,Потолочная турель,Цеилинг Туррет,Tak turret,Tavan Tareti, -Crusader,TAG_CRUSADER,Names need to match the obituaries!,,,Křižák,Korsfarer,Ordensritter,,Krucisto,Cruzado,,Ristiretkeläinen,Croisé,Keresztes,Crociato,クルセーダー,성전사,Kruisvaarder,Korsfarer,Krzyżowiec,Cruzado,,Cruciat,Крестоносец,Црусадер,Korsriddar,Haçlı, -Inquisitor,TAG_INQUISITOR,,,,Inkvizitor,Inkvisitor,,,Inkvizitoro,Inquisidor,,Inkvisiittori,Inquisiteur,Inkvizítor,Inquisitore,審問官,인퀴지터,Inquisiteur,Inkvisitor,Inkwizytor,Inquisidor,,Inchizitor,Инквизитор,Инквизитор,Inkvisitor,Engizisyoncu, -Peasant,TAG_PEASANT,,,,Rolník,Bonde,Bauer,Χωρικός,Kamparano,Campesino,,Maallikko,Paysan,Jobbágy,Civile,庶民,농민,Onderdaan,Bonde,Mieszczuch,Camponês,,Sărman,Рабочий,Сељак,Bonde,Köylü, -Reaver,TAG_REAVER,,,,Plenitel,,Plünderer,,Lertulo,Saqueador,,Raastaja,,Fosztogató,Saccheggiatore,リーバー,사수,,,Rozbójnik,Saqueador,,Hoț,Похититель,Реавер,,Yağmacı, -Sentinel,TAG_SENTINEL,,,,Strážbot,,Wächter,,Sentinelo,Centinela,,Vartija,Sentinelle,Őrszem,Sentinella,センティネル,센티넬,,Vaktpost,Strażnik,Sentinela,,Santinelă,Страж,Сентинел,,Nöbetçi, -Stalker,TAG_STALKER,,,,Slídil,,Jäger,,Gvatanto,Acechador,,Vaanija,Chasseur,Lesipuskás,Cacciatore,ストーカー,스토커,,Forfølgeren,Prześladowca,Caçador,,Hărțuitor,Преследователь,Сталкер,,Takipçi, -The Bishop,TAG_BISHOP,,,,Biskup,Biskoppen,Bischof,,La Episkopo,El Obispo,,Piispa,Evèque,A Püspök,Vescovo,ビショップ,비숍,De Bisschop,Biskopen,Biskup,O Bispo,,Episcopul,Епископ,Бискуп,Biskopen,Piskopos, -The One God,TAG_ENTITY,,,,Jeden Bůh,Den ene gud,Der Eine Gott,Ο ένας Θεός,La Vera Dio,El Dios Único,,Yksi Ainoa Jumala,Le Seul Dieu,Az Egy Isten,Unico Dio,唯一神,유일신,De ene god,Den ene Gud,Jedyny Bóg,O Deus Único,,Adevăratul Zeu,Единый Бог,Једини Бог,Den ende guden,Tek Tanrı, -The Programmer,TAG_PROGRAMMER,,,,Programátor,Programmøren,Programmierer,,La Programisto,El Programador,,Ohjelmoija,Programmeur,A Programozó,Programmatore,プログラマー,프로그래머,Programmeur,Programmereren,Programista,O Programador,,Programatorul,Программист,Програмер,Programmeraren,Programcı, -The Spectre,TAG_ALIENSPECTRE,,,,Přízrak,Spøgelset,Schemen,,La Fantomo,El Espectro,,Haamu,Le spectre,A Lidérc,Spettro,スペクトル,스펙터,Het spook,Spøkelset,Widmo,O Espectro,,Spectrul,Фантом,Тхе Спецтре,Spektret,Hortlak, -Kneeling Guy,TAG_KNEELINGGUY,,,,Ctitel,Den knælende fyr,Kniender Typ,,Genuantulo,Tipo arrodillado,,Polvistunut mies,Homme agenouillé,Térdelő,Uomo inchinato,礼拝者,무릎 꿇은 남자,Knielende man,Den knelende fyren,Oddający pokłon,Crente,,Tip Îngenunchiat,Парень на коленях,Човек који клечи,Den knäböjande killen,Diz Çökmüş Adam, -Spawn multiplayer things in coop,GMPLYMNU_MULTIPLAYERTHINGS,,,,Spawnovat multiplayerové předměty v co-opu,Spawn multiplayer-ting i coop,Multispielergegenstände in Coop,,Ekaperigi plurludantajn aĵojn en koopera reĝimo,Hacer aparecer cosas del multijugador en cooperativo,,Luo moninpelioliot yhteispelissä,Objets multijoueurs en co-op,Multiplayer tárgyak létrehozása Együttműködő módban,Fai apparire gli oggetti di multigiocatore in cooperativa,協力モードでマルチ用thingsを出す,협동 플레이에서 멀티플레이어 사물 생성,Spawnen van multiplayer dingen in coop,Spawn multiplayer ting i coop,Daj przedmioty trybu wieloosobowego w trybie kooperacji,Surgir objetos de multijogador no modo coperativo,,Afișează obiectele marcate pentru modul online,Появление вещей из сетевой игры в совместной игре,Поставите ствари за више играча у кооперацији,Spawna multiplayer saker i coop,Coop'ta çok oyunculu şeyler ortaya çıkarma, -Sprite shadows,DSPLYMNU_SPRITESHADOW,,,,Stíny spritů,Sprite skygger,Spriteschatten,,Ombroj de mov-rastrumoj,Sombras de «sprites»,,Spritevarjot,Ombres de sprites,Sprite árnyékok,Ombre per sprite,スプライト シャドウ,스프라이트 그림자,Sprite schaduwen,Sprite skygger,Cienie sprite'ów,Sombras de sprites,,Umbre pentru sprite-uri,Тени спрайтов,Сприте схадовс,Sprite-skuggor,Sprite gölgeleri, -Monsters and players,OPTVAL_SPRSHADALWAYS,Will enable sprite shadows for monster and player sprites,,,Monstra a hráči,Monstre og spillere,Monster und Spieler,Τέρατα και παίχτες,Monstroj kaj ludantoj,Monstruos y jugadores,,Hirviöt ja pelaajat,Monstres et joueurs,Szörnyek és játékosok,Mostri e giocatori,敵とプレイヤー,몬스터와 플레이어,Monsters en spelers,Monstre og spillere,Potwory i Gracze,Monstros e jogadores,,Monștrii și jucători,Монстров и игроков,Чудовишта и играчи,Monster och spelare,Canavarlar ve oyuncular, -FOV,DSPLYMNU_FOV,the FOV slider,,,Zorné pole (FOV),,,,Vidkampo,Campo de visión,,Näkökenttä,Champ de vision,Látószög,Campo visivo,,,,,Pole Widzenia,Campo de visão,,Câmp vizual,Поле зрения,,,, -Disable MBF21 features,CMPTMNU_NOMBF21,,,,Zakázat funkce MBF21,Deaktivere MBF21-funktioner,MBF21 Features deaktivieren,Απενεργοποίηση MBF21 λειτουργιών,Malvalidigi funkciojn de MBF21,Deshabilitar las funciones de MBF21,,Poista MBF21-ominaisuudet käytöstä,Désactiver les fonctionnalités MBF21,MBF21 vonások kikapcsolása,Disabilita le funzioni MBF21,MBF21機能を無効,MBF21 기능 비활성화,MBF21-functies uitschakelen,Deaktiver MBF21-funksjoner,Wyłącz funkcje MBF21,Desativar recursos do MBF21,,Dezactivare caracteristici MBF21,Отключить функции MBF21,Онемогућите функције MBF21,Inaktivera MBF21-funktioner,MBF21 özelliklerini devre dışı bırakma, -Show time widget,ALTHUDMNU_SHOWTIMESTAT,,,,Zobrazit widget s časem,Vis tid widget,Zeige Zeit-Widget,,Montri tempo-fenestraĵon,Mostrar widget de tiempo,,Näytä aikatyökalu,Afficher le widget horloge,Óra mutatása,Mostra orario,ウィジットタイマーの表示,시간 표시 위젯,Tijdwidget tonen,Vis tid widget,Pokaż widżet czasu,Mostrar widget de tempo,,Afișare dispozitiv pt. timp,Показать виджет времени,Прикажи виџет времена,Visa tidswidget,Zaman widget'ını göster, -MBF21,OPTVAL_MBF21,,,,,,,,,,,,,,,,,,,,,,,,,,, -Crushed monsters get resurrected as ghosts,CMPTMNU_VILEGHOSTS,,,,Oživovat rozdrcené příšery jako duchy,Knuste monstre genopstår som spøgelser,Zermalmte Monster werden als Geister wiedererweckt,Συνθλιμένα τέρατα αναστήνοντε ως φαντάσματα,Dispremitaj monstroj reviviĝas kiel fantomojn,Los monstruos aplastados son resucitados como fantasmas,,Murskatut hirviöt heräävät henkiin aaveina...,Les monstres écrasés ressuscitent en fantômes,Összenyomott szörnyek szellemként születnek újra,Mostri schiacciati vengono resuscitati come fantasmi,圧死した敵が蘇生でゴースト化,분쇄된 몬스터는 유령으로 부활합니다.,Verpletterde monsters worden herrezen als geesten,Knuste monstre gjenoppstår som spøkelser,Zmiażdżone potwory wskrzeszone jako duchy,Monstros esmagados ressucitam como fantasmas,,Monștrii striviți sunt readuși la viață ca fantome.,Раздавленные монстры воскресают в виде призраков,Сломљена чудовишта васкрсавају као духови,Krossade monster återuppstår som spöken.,Ezilmiş canavarlar hayalet olarak dirilir, -View bobbing while flying,MISCMNU_FVIEWBOB,,,,Pohupování pohledu při létání,Vis bobbing mens du flyver,Waffenpendeln beim Fliegen,,Vidi kapo-balanciĝon dum flugado,La vista tambalea al volar,,,Chaloupage en vol,Nézet repüléskori billegése,,飛行中の視点揺れ,비행 중 흔들림 보기,Bekijk bob bedrag terwijl je vliegt,Se bobbing mens du flyr,Pokaż bujanie podczas lotu,Balanço na visão durante voo,,Mișcare cameră în timpul zborului,Покачивание камеры при полёте,Погледајте скакање током лета,Visa att det guppar när du flyger,Uçarken sallanmayı görüntüle, -%o was maimed by a Serpent.,OB_DEMON1HIT,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] zlohadem.,%o blev lemlæstet af en slange.,%o wurde von einer Schlange zerfleischt.,,%o vundegiĝis de Serpento.,,,,%o a été mutilé@[e_fr] par un Serpent.,,%o è stato mutilato da un serpente.,%o はサーペントに斬り捨てられた。,,%o werd verminkt door een slang.,%o ble lemlestet av en slange.,Wąż skaleczył gracza %o,%o foi mutilad@[ao_ptb] por uma Serpente.,,,Игрок %o искалечен змеем.,,%o blev lemlästad av en orm.,"%o, bir yılan tarafından sakat bırakıldı.", -Antialias Lines,AUTOMAPMNU_LINEANTIALIASING,,,,Vyhlazovat čáry,Antialias-linjer,Linien glätten,,Glatigaj Linioj,,,,Lignes Antialias,,,Linesのアンチエイリアス,,Antialijnen,Antialias-linjer,Linie Antyaliasowe,Linhas com antiserrilhamento,,,Линии сглаживания,,Antialias Linjer,Antialias Hatları, -Move and shoot through other players,GMPLYMNU_NOPLAYERCLIP ,,,,Procházet a střílet skrz ostatní hráče,Bevæg dig og skyd gennem andre spillere,Keine Kollisionen mit anderen Spielern,,Movi kaj pafi tra aliajn ludantojn,,,,Déplacez-vous et tirez à travers les autres joueurs,,Muoversi e sparare attraverso gli altri giocatori,移動と攻撃が他プレイヤーを通過,,Beweeg en schiet door andere spelers,Beveg deg og skyt gjennom andre spillere,Brak kolizji z innymi graczami,Mover e atirar através de outros jogadores,,,Перемещение и стрельба через игроков,,Förflytta dig och skjut genom andra spelare,Diğer oyuncuların arasından geçin ve ateş edin, -Share keys with all players,GMPLYMNU_SHAREKEYS,,,,Sdílet klíče se všemi hráči,Del nøgler med alle spillere,Schlüssel mit allen Spielern teilen,,Kunhavigi ŝlosilojn kun ĉiuj ludantoj,,,,Partager les clés avec tous les joueurs,,Condividere i tasti con tutti i giocatori,全プレイヤーにキーを共有,,Deel toetsen met alle spelers,Del nøkler med alle spillere,Współdziel klucze z innymi graczami,Compartilhar chaves com todos os jogadores,,,Общие ключи игроков,,Dela nycklar med alla spelare,Anahtarları tüm oyuncularla paylaşın, -Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,Tillad ikke tilsidesættelse af kameravendt tilstand,Änderung des Kameramodus nicht erlauben,,Malebligi transpason de kamerao-rigardado-reĝimo,,,,Interdiction de modifier le mode d'orientation de la caméra,,Disconoscimento della modalità telecamera,Facing modeのカメラをオーバーライドしない,,Overschrijven van camerastand verbieden,Tillat ikke overstyring av kameramodus,Zabroń nadpisywania trybu widoku,Forçar modo de alinhamento do sprite à câmera,,,Запретить переопределение режима поворота камеры,,Tillåt inte åsidosättande av kamerans vändläge,Kameraya bakma modunun geçersiz kılınmasına izin verme, -Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,Prohodit zdraví a brnění,Byt om på helbred og rustning,Anzeige für Gesundheit und Panzerung tauschen,,Permuti sanon kaj kirason,,,,Échanger la santé et l'armure,,Scambio di salute e armatura,体力とアーマーをスワップ,,Verwissel gezondheid en pantser,Bytt helse og rustning,Zamień zdrowie i pancerz,Trocar saúde e armadura,,,Поменять отображение здоровья и брони местами,,Byt hälsa och rustning,Sağlık ve zırhı değiştir, -Use classic HUD scaling,SCALEMNU_HUD_OLDSCALE,hud_oldscale,,,Pro HUD použít klasické škálování,Brug klassisk HUD-skalering,Klassische HUD-Skalierung,,Uzi klasikan skaladon de HUD,,,,Utiliser l'échelle classique du HUD,,Utilizzare la scalatura classica dell'HUD,旧式HUDスケーリングを使う,,Gebruik klassieke HUD-schaling,Bruk klassisk HUD-skalering,,Usar escala clássica do HUD,,,Классическое масштабирование интерфейса,,Använd klassisk HUD-skalning,Klasik HUD ölçeklendirmesini kullanın, -HUD scale factor,SCALEMNU_HUD_SCALEFACTOR,hud_scalefactor,,,Faktor HUD škálování,HUD-skaleringsfaktor,HUD-Skalierungsfaktor,,Skalfaktoro de HUD,,,,Facteur d'échelle du HUD,,Fattore di scala dell'HUD,HUDスケール倍率,,HUD-schaalfactor,HUD-skaleringsfaktor,,Fator de escala do HUD,,,Значение масштабирования интерфейса,,Skalningsfaktor för HUD,HUD ölçek faktörü, -Spawn co-op only things in multiplayer,GMPLYMNU_COOPTHINGS,Any Actor that only appears in co-op is disabled,,,Co-op věci pouze v multiplayeru,Skab kun co-op-objekter i multiplayer,Erzeuge Nur-Co-op Dinge in Multiplayer,,Ekaperigi nurajn kooperajn aĵojn en plurludanta reĝimo,,,,Faire apparaitre les acteurs Co-Op Seulement en Multijoueur,,Creare oggetti solo per la cooperativa in multigiocatore,マルチで協力モード限定thingsを出す,,Alleen co-op-voorwerpen maken in multiplayer,Opprett co-op-objekter i flerspillermodus,,,,,Появление вещей из совместной игры в сетевой игре,,Skapa co-op-objekt i flerspelarläget,Çok oyunculu modda ortak nesneler oluşturun, -Spawn co-op only pickup items in multiplayer,GMPLYMNU_COOPITEMS,Items that only appear in co-op are disabled,,,Co-op předměty pouze v multiplayeru,Skab kun co-op-genstande i multiplayer,Erzeuge Nur-Co-op Gegenstände in Multiplayer,,Ekaperigi nurajn kooperajn objektojn en plurludanta reĝimo,,,,Faire apparaitre les objets Co-Op Seulement en Multijoueur,,Creare pickup solo per la cooperativa in multigiocatore,マルチで協力モード限定アイテムを出す,,Alleen co-op pickups maken in multiplayer,Opprett co-op-pickuper i flerspillermodus,,,,,Появление предметов из совместной игры в сетевой игре,,Skapa co-op pickups i flerspelarläget,Çok oyunculu modda ortak pikaplar oluşturun, -Players pick up their own copy of items in multiplayer,GMPLYMNU_LOCALITEMS,Items are picked up client-side rather than fully taken by the client who picked it up,,,V multiplayeru hráči sbírají své vlastní kopie předmětů,Spillere samler deres egen kopi af genstande op i multiplayer,Spieler nehmen ihre eigene Kopie von Gegenständen im Mehrspielermodus auf,,Ludantoj prenas sian propran kopion de objektoj en plurludanta reĝimo,,,,Chaque joueur obtient sa copie de chaque objet en Multijoueur,,I giocatori raccolgono la propria copia di oggetti in multigiocatore,マルチでプレイヤー達は複製アイテムを拾う,,Spelers pikken hun eigen exemplaar van voorwerpen op in multiplayer,Spillere plukker opp sin egen kopi av gjenstander i flerspiller,,,,,Игроки подбирают собственные копии предметов в сетевой игре,,Spelare plockar upp sin egen kopia av föremål i flerspelarläget,Oyuncular çok oyunculu modda eşyaların kendi kopyalarını alırlar, -Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,Deaktiver opsamling på klientsiden af tabte genstande,Client-seitiges Aufnehmen von fallengelassenen Gegenständen deaktivieren,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,Désactiver le ramassage des objets lâchés en clientside,,Disabilita il ritiro degli oggetti caduti dal lato client,クライアント側で落としたアイテムを拾わせない,,Client-side pick ups van gedropte items uitschakelen,Deaktiver opphenting på klientsiden av gjenstander som droppes,,,,,Отключить подбирание выпавших предметов на стороне клиента,,Inaktivera upphämtning av tappade föremål på klientsidan,Düşen öğeleri istemci tarafında almayı devre dışı bırakma, -Restart level on Death,MISCMNU_RESTARTONDEATH,Disables autoloading save on death,,,Restart po umření,Genstart niveau ved død,Level bei Tod neu starten,,,,,,Recharger après mort,,Riavvio del livello in caso di morte,,,Level herstarten bij dood,Start nivået på nytt ved død,,,,,Перезапуск уровня после смерти,,Starta om nivån vid död,Ölüm halinde seviyeyi yeniden başlat, -Pistol Start,GMPLYMNU_PISTOLSTART,Resets inventory on every map,,,Začít jen s pistolí,Start med pistol,Pistolenstart,,,,,,Démarrage du pistolet,,Avvio pistola,,,Start met pistool,Start med pistol,,,,,Пистолет в начале,,Starta med pistol,Tabanca ile başlayın, -Allow creation of zombie players,CMPTMNU_VOODOOZOMBIES,,,,,,Erlaube Zombieplayer,,,,,,,,,,,,,,,,,,,,, -ignore floor z when teleporting,CMPTMNU_FDTELEPORT,,,,,,Ignoriere Fußbodenhöhe bem Teleportieren,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file +",,,,Škálování menu dle starého ZDoomu,Klassisk ZDoom-menu skalering,Alte ZDoom-Skalierung im Menü,,Klasika skalado de ZDoom-menuo,Escalado clásico de ZDoom en menús,,Perinteinen ZDoomin skaalaus valikossa,Mise à l'échelle du menu ZDoom Classique,,Klasszikus ZDoom menü arányok,Fattore di scala ZDoom classico per i menu,従来のZDメニュースケール,클래식 ZDoom 메뉴 크기 조정,Klassieke ZDoom-menuschaal,Klassisk ZDoom-menyskalering,Klasyczne skalowanie menu z ZDooma,Escala clássica para menu do ZDoom,,Scară meniuri ZDoom clasică,Классический размер меню ZDoom,Класично скалирање ZDoom менија,Skalning av Classic ZDoom-menyn,Klasik ZDoom menü ölçeklendirme, +Use percents on summary screen,MISCMNU_WIPERCENT,,,,Použít procenta ve výsledcích mapy,Brug procenter på oversigtsskærmen,Zeige Prozente auf Statistikseite,,Uzi procentojn sur resumekrano,Usar porcentajes en pantalla de sumario,,Käytä prosentteja pisteruuduilla,Utiliser pourcentages sur l'écran de fin de niveau,,Százalékok használata az összefoglaló oldalon,Usa percentuali per le schermate di riepilogo,集計画面でパーセント表示,요약 화면에서 퍼센트 사용,Gebruik procenten op het overzichtsscherm,Bruk prosenter på sammendragsskjermen,Używaj procentów w ekranie wyników pod koniec poziomu,Usar porcentagem na tela de resumo,,Folosește procentaje la totaluri,Использовать проценты на экране итогов уровня,Користите проценте на екрану резимеа,Använd procentsatser på sammanfattningsskärmen,Özet ekranında yüzdeleri kullanma, +Classic ZDoom scaling on summary screen,MISCMNU_CLEANSTAT,,,,Škálovat obrazovky se shrnutím dle starého ZDoomu,Klassisk ZDoom-skala på oversigtsskærmen,Alte ZDoom-Skalierung auf Statistikseite,,Klasika ZDoom-skalado sur resumekrano,Escalado clásico de ZDoom en pantalla de sumario,,Perinteinen ZDoomin skaalaus pisteruudulla,Mise à l'échelle écran de fin de niveau ZDoom Classique,,Klasszikus ZDoom arányok az összefoglaló oldalon,Fattore di scala ZDoom classico per le schermate di riepilogo,集計画面で従来のZDスケール,요약 화면에서 클래식 ZDoom 스케일링,Klassieke ZDoom-schaalverdeling op overzichtsscherm,Klassisk ZDoom-skalering på oppsummeringsskjermen,Klasyczne skalowanie ekranu z wynikami poziomu,Escala clássica do ZDoom na tela de resumo,,Scară ZDoom clasică a tabelei de marcaj,Классический размер ZDoom экрана итогов уровня,Класично ZDoom скалирање на екрану сажетка,Klassisk ZDoom-skalering på sammanfattningsskärmen,Özet ekranında klasik ZDoom ölçeklendirme, +Citizen,TAG_STRIFEZOMBIE,"Called ""citizens"" according to Doomwiki",,,Občan,Borger,Bürger,Πολίτης,Civilulo,Ciudadano,,Kansalainen,Citoyen,,Polgár,Cittadino,住民,시민,Burger,Innbygger,Mieszkaniec,Cidadão,,Cetățean,Горожанин,грађанин,Medborgare,Vatandaş, +Ceiling Turret,TAG_CEILINGTURRET,,,,Střílna,Tårn til loftet,Deckengeschütz,,Plafona tureto,Torreta de techo,,Kattotykkitorni,Tourelle de plafond,,Plafon lövésztorony,Torretta da soffitto,警備システム,천장 터렛,Plafond torentje,Tak-tårn,Wieżyczka,Defesa Automática,,Turetă de Tavan,Потолочная турель,Цеилинг Туррет,Tak turret,Tavan Tareti, +Crusader,TAG_CRUSADER,Names need to match the obituaries!,,,Křižák,Korsfarer,Ordensritter,,Krucisto,Cruzado,,Ristiretkeläinen,Croisé,,Keresztes,Crociato,クルセーダー,성전사,Kruisvaarder,Korsfarer,Krzyżowiec,Cruzado,,Cruciat,Крестоносец,Црусадер,Korsriddar,Haçlı, +Inquisitor,TAG_INQUISITOR,,,,Inkvizitor,Inkvisitor,,,Inkvizitoro,Inquisidor,,Inkvisiittori,Inquisiteur,,Inkvizítor,Inquisitore,審問官,인퀴지터,Inquisiteur,Inkvisitor,Inkwizytor,Inquisidor,,Inchizitor,Инквизитор,Инквизитор,Inkvisitor,Engizisyoncu, +Peasant,TAG_PEASANT,,,,Rolník,Bonde,Bauer,Χωρικός,Kamparano,Campesino,,Maallikko,Paysan,,Jobbágy,Civile,庶民,농민,Onderdaan,Bonde,Mieszczuch,Camponês,,Sărman,Рабочий,Сељак,Bonde,Köylü, +Reaver,TAG_REAVER,,,,Plenitel,,Plünderer,,Lertulo,Saqueador,,Raastaja,,,Fosztogató,Saccheggiatore,リーバー,사수,,,Rozbójnik,Saqueador,,Hoț,Похититель,Реавер,,Yağmacı, +Sentinel,TAG_SENTINEL,,,,Strážbot,,Wächter,,Sentinelo,Centinela,,Vartija,Sentinelle,,Őrszem,Sentinella,センティネル,센티넬,,Vaktpost,Strażnik,Sentinela,,Santinelă,Страж,Сентинел,,Nöbetçi, +Stalker,TAG_STALKER,,,,Slídil,,Jäger,,Gvatanto,Acechador,,Vaanija,Chasseur,,Lesipuskás,Cacciatore,ストーカー,스토커,,Forfølgeren,Prześladowca,Caçador,,Hărțuitor,Преследователь,Сталкер,,Takipçi, +The Bishop,TAG_BISHOP,,,,Biskup,Biskoppen,Bischof,,La Episkopo,El Obispo,,Piispa,Evèque,,A Püspök,Vescovo,ビショップ,비숍,De Bisschop,Biskopen,Biskup,O Bispo,,Episcopul,Епископ,Бискуп,Biskopen,Piskopos, +The One God,TAG_ENTITY,,,,Jeden Bůh,Den ene gud,Der Eine Gott,Ο ένας Θεός,La Vera Dio,El Dios Único,,Yksi Ainoa Jumala,Le Seul Dieu,,Az Egy Isten,Unico Dio,唯一神,유일신,De ene god,Den ene Gud,Jedyny Bóg,O Deus Único,,Adevăratul Zeu,Единый Бог,Једини Бог,Den ende guden,Tek Tanrı, +The Programmer,TAG_PROGRAMMER,,,,Programátor,Programmøren,Programmierer,,La Programisto,El Programador,,Ohjelmoija,Programmeur,,A Programozó,Programmatore,プログラマー,프로그래머,Programmeur,Programmereren,Programista,O Programador,,Programatorul,Программист,Програмер,Programmeraren,Programcı, +The Spectre,TAG_ALIENSPECTRE,,,,Přízrak,Spøgelset,Schemen,,La Fantomo,El Espectro,,Haamu,Le spectre,,A Lidérc,Spettro,スペクトル,스펙터,Het spook,Spøkelset,Widmo,O Espectro,,Spectrul,Фантом,Тхе Спецтре,Spektret,Hortlak, +Kneeling Guy,TAG_KNEELINGGUY,,,,Ctitel,Den knælende fyr,Kniender Typ,,Genuantulo,Tipo arrodillado,,Polvistunut mies,Homme agenouillé,,Térdelő,Uomo inchinato,礼拝者,무릎 꿇은 남자,Knielende man,Den knelende fyren,Klękacz,Crente,,Tip Îngenunchiat,Парень на коленях,Човек који клечи,Den knäböjande killen,Diz Çökmüş Adam, +Spawn multiplayer things in coop,GMPLYMNU_MULTIPLAYERTHINGS,,,,Spawnovat multiplayerové předměty v co-opu,Spawn multiplayer-ting i coop,Multispielergegenstände in Coop,,Ekaperigi plurludantajn aĵojn en koopera reĝimo,Hacer aparecer cosas del multijugador en cooperativo,,Luo moninpelioliot yhteispelissä,Objets multijoueurs en co-op,,Multiplayer tárgyak létrehozása Együttműködő módban,Fai apparire gli oggetti di multigiocatore in cooperativa,協力モードでマルチ用thingsを出す,협동 플레이에서 멀티플레이어 사물 생성,Spawnen van multiplayer dingen in coop,Spawn multiplayer ting i coop,Włącz przedmioty trybu wieloosobowego w trybie kooperacji,Surgir objetos de multijogador no modo coperativo,,Afișează obiectele marcate pentru modul online,Появление вещей из сетевой игры в совместной игре,Поставите ствари за више играча у кооперацији,Spawna multiplayer saker i coop,Coop'ta çok oyunculu şeyler ortaya çıkarma, +Sprite shadows,DSPLYMNU_SPRITESHADOW,,,,Stíny spritů,Sprite skygger,Spriteschatten,,Ombroj de mov-rastrumoj,Sombras de «sprites»,,Spritevarjot,Ombres de sprites,,Sprite árnyékok,Ombre per sprite,スプライト シャドウ,스프라이트 그림자,Sprite schaduwen,Sprite skygger,Cienie sprite'ów,Sombras de sprites,,Umbre pentru sprite-uri,Тени спрайтов,Сприте схадовс,Sprite-skuggor,Sprite gölgeleri, +Monsters and players,OPTVAL_SPRSHADALWAYS,Will enable sprite shadows for monster and player sprites,,,Monstra a hráči,Monstre og spillere,Monster und Spieler,Τέρατα και παίχτες,Monstroj kaj ludantoj,Monstruos y jugadores,,Hirviöt ja pelaajat,Monstres et joueurs,,Szörnyek és játékosok,Mostri e giocatori,敵とプレイヤー,몬스터와 플레이어,Monsters en spelers,Monstre og spillere,Potwory i Gracze,Monstros e jogadores,,Monștrii și jucători,Монстров и игроков,Чудовишта и играчи,Monster och spelare,Canavarlar ve oyuncular, +FOV,DSPLYMNU_FOV,the FOV slider,,,Zorné pole (FOV),,,,Vidkampo,Campo de visión,,Näkökenttä,Champ de vision,,Látószög,Campo visivo,,,,,Pole Widzenia,Campo de visão,,Câmp vizual,Поле зрения,,,, +Disable MBF21 features,CMPTMNU_NOMBF21,,,,Zakázat funkce MBF21,Deaktivere MBF21-funktioner,MBF21 Features deaktivieren,Απενεργοποίηση MBF21 λειτουργιών,Malvalidigi funkciojn de MBF21,Deshabilitar las funciones de MBF21,,Poista MBF21-ominaisuudet käytöstä,Désactiver les fonctionnalités MBF21,,MBF21 vonások kikapcsolása,Disabilita le funzioni MBF21,MBF21機能を無効,MBF21 기능 비활성화,MBF21-functies uitschakelen,Deaktiver MBF21-funksjoner,Wyłącz funkcje MBF21,Desativar recursos do MBF21,,Dezactivare caracteristici MBF21,Отключить функции MBF21,Онемогућите функције MBF21,Inaktivera MBF21-funktioner,MBF21 özelliklerini devre dışı bırakma, +Show time widget,ALTHUDMNU_SHOWTIMESTAT,,,,Zobrazit widget s časem,Vis tid widget,Zeige Zeit-Widget,,Montri tempo-fenestraĵon,Mostrar widget de tiempo,,Näytä aikatyökalu,Afficher le widget horloge,,Óra mutatása,Mostra orario,ウィジットタイマーの表示,시간 표시 위젯,Tijdwidget tonen,Vis tid widget,Pokaż widżet czasu,Mostrar widget de tempo,,Afișare dispozitiv pt. timp,Показать виджет времени,Прикажи виџет времена,Visa tidswidget,Zaman widget'ını göster, +MBF21,OPTVAL_MBF21,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Crushed monsters get resurrected as ghosts,CMPTMNU_VILEGHOSTS,,,,Oživovat rozdrcené příšery jako duchy,Knuste monstre genopstår som spøgelser,Zermalmte Monster werden als Geister wiedererweckt,Συνθλιμένα τέρατα αναστήνοντε ως φαντάσματα,Dispremitaj monstroj reviviĝas kiel fantomojn,Los monstruos aplastados son resucitados como fantasmas,,Murskatut hirviöt heräävät henkiin aaveina...,Les monstres écrasés ressuscitent en fantômes,,Összenyomott szörnyek szellemként születnek újra,Mostri schiacciati vengono resuscitati come fantasmi,圧死した敵が蘇生でゴースト化,분쇄된 몬스터는 유령으로 부활합니다.,Verpletterde monsters worden herrezen als geesten,Knuste monstre gjenoppstår som spøkelser,Zmiażdżone potwory wskrzeszone jako duchy,Monstros esmagados ressucitam como fantasmas,,Monștrii striviți sunt readuși la viață ca fantome.,Раздавленные монстры воскресают в виде призраков,Сломљена чудовишта васкрсавају као духови,Krossade monster återuppstår som spöken.,Ezilmiş canavarlar hayalet olarak dirilir, +View bobbing while flying,MISCMNU_FVIEWBOB,,,,Pohupování pohledu při létání,Vis bobbing mens du flyver,Waffenpendeln beim Fliegen,,Vidi kapo-balanciĝon dum flugado,La vista tambalea al volar,,,Chaloupage en vol,,Nézet repüléskori billegése,,飛行中の視点揺れ,비행 중 흔들림 보기,Bekijk bob bedrag terwijl je vliegt,Se bobbing mens du flyr,Pokaż bujanie podczas lotu,Balanço na visão durante voo,,Mișcare cameră în timpul zborului,Покачивание камеры при полёте,Погледајте скакање током лета,Visa att det guppar när du flyger,Uçarken sallanmayı görüntüle, +%o was maimed by a Serpent.,OB_DEMON1HIT,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] zlohadem.,%o blev lemlæstet af en slange.,%o wurde von einer Schlange zerfleischt.,,%o vundegiĝis de Serpento.,,,,%o a été mutilé@[e_fr] par un Serpent.,,,%o è stato mutilato da un serpente.,%o はサーペントに斬り捨てられた。,,%o werd verminkt door een slang.,%o ble lemlestet av en slange.,Wąż skaleczył gracza %o,%o foi mutilad@[ao_ptb] por uma Serpente.,,,Игрок %o искалечен змеем.,,%o blev lemlästad av en orm.,"%o, bir yılan tarafından sakat bırakıldı.", +Antialias Lines,AUTOMAPMNU_LINEANTIALIASING,,,,Vyhlazovat čáry,Antialias-linjer,Linien glätten,,Glatigaj linioj,,,,Lignes Antialias,,,,Linesのアンチエイリアス,,Antialijnen,Antialias-linjer,Linie Antyaliasowe,Linhas com antiserrilhamento,,,Линии сглаживания,,Antialias Linjer,Antialias Hatları, +Move and shoot through other players,GMPLYMNU_NOPLAYERCLIP,,,,Procházet a střílet skrz ostatní hráče,Bevæg dig og skyd gennem andre spillere,Keine Kollisionen mit anderen Spielern,,Movi kaj pafi tra aliajn ludantojn,,,,Déplacez-vous et tirez à travers les autres joueurs,,,Muoversi e sparare attraverso gli altri giocatori,移動と攻撃が他プレイヤーを通過,,Beweeg en schiet door andere spelers,Beveg deg og skyt gjennom andre spillere,Brak kolizji z innymi graczami,Mover e atirar através de outros jogadores,,,Перемещение и стрельба через игроков,,Förflytta dig och skjut genom andra spelare,Diğer oyuncuların arasından geçin ve ateş edin, +Share keys with all players,GMPLYMNU_SHAREKEYS,,,,Sdílet klíče se všemi hráči,Del nøgler med alle spillere,Schlüssel mit allen Spielern teilen,,Kunhavigi ŝlosilojn kun ĉiuj ludantoj,,,,Partager les clés avec tous les joueurs,,,Condividere i tasti con tutti i giocatori,全プレイヤーにキーを共有,,Deel toetsen met alle spelers,Del nøkler med alle spillere,Współdziel klucze z innymi graczami,Compartilhar chaves com todos os jogadores,,,Общие ключи игроков,,Dela nycklar med alla spelare,Anahtarları tüm oyuncularla paylaşın, +Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,Tillad ikke tilsidesættelse af kameravendt tilstand,Änderung des Kameramodus nicht erlauben,,Malebligi transpason de kamerao-rigardado-reĝimo,,,,Interdiction de modifier le mode d'orientation de la caméra,,,Disconoscimento della modalità telecamera,Facing modeのカメラをオーバーライドしない,,Overschrijven van camerastand verbieden,Tillat ikke overstyring av kameramodus,Zabroń nadpisywania trybu widoku,Forçar modo de alinhamento do sprite à câmera,,,Запретить переопределение режима поворота камеры,,Tillåt inte åsidosättande av kamerans vändläge,Kameraya bakma modunun geçersiz kılınmasına izin verme, +Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,Prohodit zdraví a brnění,Byt om på helbred og rustning,Anzeige für Gesundheit und Panzerung tauschen,,Permuti sanon kaj kirason,,,,Échanger la santé et l'armure,,,Scambio di salute e armatura,体力とアーマーをスワップ,,Verwissel gezondheid en pantser,Bytt helse og rustning,Zamień zdrowie i pancerz,Trocar saúde e armadura,,,Поменять отображение здоровья и брони местами,,Byt hälsa och rustning,Sağlık ve zırhı değiştir, +Use classic HUD scaling,SCALEMNU_HUD_OLDSCALE,hud_oldscale,,,Pro HUD použít klasické škálování,Brug klassisk HUD-skalering,Klassische HUD-Skalierung,,Uzi klasikan skaladon de HUD,,,,Utiliser l'échelle classique du HUD,,,Utilizzare la scalatura classica dell'HUD,旧式HUDスケーリングを使う,,Gebruik klassieke HUD-schaling,Bruk klassisk HUD-skalering,Użyj klasycznego skalowania HUD-a,Usar escala clássica do HUD,,,Классическое масштабирование интерфейса,,Använd klassisk HUD-skalning,Klasik HUD ölçeklendirmesini kullanın, +HUD scale factor,SCALEMNU_HUD_SCALEFACTOR,hud_scalefactor,,,Faktor HUD škálování,HUD-skaleringsfaktor,HUD-Skalierungsfaktor,,Skalfaktoro de HUD,,,,Facteur d'échelle du HUD,,,Fattore di scala dell'HUD,HUDスケール倍率,,HUD-schaalfactor,HUD-skaleringsfaktor,Współczynnik skalowania HUD-a,Fator de escala do HUD,,,Значение масштабирования интерфейса,,Skalningsfaktor för HUD,HUD ölçek faktörü, +Spawn co-op only things in multiplayer,GMPLYMNU_COOPTHINGS,Any Actor that only appears in co-op is disabled,,,Co-op věci pouze v multiplayeru,Skab kun co-op-objekter i multiplayer,Erzeuge Nur-Co-op Dinge in Multiplayer,,Ekaperigi nurajn kooperajn aĵojn en plurludanta reĝimo,,,,Faire apparaitre les acteurs Co-Op Seulement en Multijoueur,,,Creare oggetti solo per la cooperativa in multigiocatore,マルチで協力モード限定thingsを出す,,Alleen co-op-voorwerpen maken in multiplayer,Opprett co-op-objekter i flerspillermodus,Wyłącz aktorów trybu kooperacji,Objetos exclusivos do modo cooperativo surgem somente no modo multijogador,,,Появление вещей из совместной игры в сетевой игре,,Skapa co-op-objekt i flerspelarläget,Çok oyunculu modda ortak nesneler oluşturun, +Spawn co-op only pickup items in multiplayer,GMPLYMNU_COOPITEMS,Items that only appear in co-op are disabled,,,Co-op předměty pouze v multiplayeru,Skab kun co-op-genstande i multiplayer,Erzeuge Nur-Co-op Gegenstände in Multiplayer,,Ekaperigi nurajn kooperajn objektojn en plurludanta reĝimo,,,,Faire apparaitre les objets Co-Op Seulement en Multijoueur,,,Creare pickup solo per la cooperativa in multigiocatore,マルチで協力モード限定アイテムを出す,,Alleen co-op pickups maken in multiplayer,Opprett co-op-pickuper i flerspillermodus,Wyłącz przedmioty trybu kooperacji,Itens exclusivos do modo cooperativo surgem somente no modo multijogador,,,Появление подбираемых предметов из совместной игры в сетевой игре,,Skapa co-op pickups i flerspelarläget,Çok oyunculu modda ortak pikaplar oluşturun, +Players pick up their own copy of items in multiplayer,GMPLYMNU_LOCALITEMS,Items are picked up client-side rather than fully taken by the client who picked it up,,,V multiplayeru hráči sbírají své vlastní kopie předmětů,Spillere samler deres egen kopi af genstande op i multiplayer,Spieler nehmen ihre eigene Kopie von Gegenständen im Mehrspielermodus auf,,Ludantoj prenas sian propran kopion de objektoj en plurludanta reĝimo,,,,Chaque joueur obtient sa copie de chaque objet en Multijoueur,,,I giocatori raccolgono la propria copia di oggetti in multigiocatore,マルチでプレイヤー達は複製アイテムを拾う,,Spelers pikken hun eigen exemplaar van voorwerpen op in multiplayer,Spillere plukker opp sin egen kopi av gjenstander i flerspiller,Gracze podnoszą swoje przedmioty w trybie wieloosobowym,Jogadores podem pegar suas próprias cópias do item no modo multijogador,,,Игроки подбирают собственные копии предметов в сетевой игре,,Spelare plockar upp sin egen kopia av föremål i flerspelarläget,Oyuncular çok oyunculu modda eşyaların kendi kopyalarını alırlar, +Disable client-side pick ups on dropped items,GMPLYMNU_NOLOCALDROP,Drops from Actors aren't picked up locally,,,Zakázat sbírání odhozených předmětů na straně klientů,Deaktiver opsamling på klientsiden af tabte genstande,Client-seitiges Aufnehmen von fallengelassenen Gegenständen deaktivieren,,Malvalidigi klientflankajn prenadojn de faligitaj objektoj,,,,Désactiver le ramassage des objets lâchés en clientside,,,Disabilita il ritiro degli oggetti caduti dal lato client,クライアント側で落としたアイテムを拾わせない,,Client-side pick ups van gedropte items uitschakelen,Deaktiver opphenting på klientsiden av gjenstander som droppes,Wyłącz współdzielenie wypadających przedmiotów,Jogadores não podem pegar itens largados,,,Отключить подбирание выпавших предметов на стороне клиента,,Inaktivera upphämtning av tappade föremål på klientsidan,Düşen öğeleri istemci tarafında almayı devre dışı bırakma, +Restart level on Death,MISCMNU_RESTARTONDEATH,Disables autoloading save on death,,,Restart po umření,Genstart niveau ved død,Level bei Tod neu starten,,Rekomenci nivelon post morto,,,,Recharger après mort,,,Riavvio del livello in caso di morte,リスタート時に死亡する,,Level herstarten bij dood,Start nivået på nytt ved død,Restartuj poziom po śmierci,Reiniciar fase após morte,,,Перезапуск уровня после смерти,,Starta om nivån vid död,Ölüm halinde seviyeyi yeniden başlat, +Pistol Start,GMPLYMNU_PISTOLSTART,Resets inventory on every map,,,Začít jen s pistolí,Start med pistol,Pistolenstart,,Komenci kun pistolo,,,,Démarrage du pistolet,,,Avvio pistola,ピストルスタート,,Start met pistool,Start med pistol,Start z pistoletem,Iniciar com a pistola,,,Пистолет в начале,,Starta med pistol,Tabanca ile başlayın, +Allow creation of zombie players,CMPTMNU_VOODOOZOMBIES,,,,Povolit zombie hráče,,Erlaube Zombieplayer,,Permesi kreadon de zombiaj ludantoj,,,,,,,,ゾンビプレイヤーの生成許可,,,,Pozwól na tworzenie graczy-zombie,Permitir criação de jogadores zumbi,,,Разрешить создание игроков-зомби,,,, +ignore floor z when teleporting,CMPTMNU_FDTELEPORT,,,,Při teleportu ignorovat výšku podlahy,,Ignoriere Fußbodenhöhe bem Teleportieren,,Ignori altecon de planko dum teleportado,,,,,,,,テレポート時にfloor z値を無視する,,,,Ignoruj wysokość podłogi podczas teleportacji,Ignorar altura do chão ao teletransportar,,,игнорирование диагонали пола (Z) при телепортации,,,, +Forced-Perspective,OPTVAL_ANAMORPHIC,"Hardware Sprite Clipping mode that gives the illusion of a sprite being in a different position than it really is, allowing it to be rendered under the floor despite clipping",,,,,Erzwungene Perspektive,,,,,,,,,,,,,,,,,,Перспективный (анаморфотный),,,, \ No newline at end of file diff --git a/wadsrc_extra/static/filter/chex.chex3/language.csv b/wadsrc_extra/static/filter/chex.chex3/language.csv index b54173fad..601c46f7a 100644 --- a/wadsrc_extra/static/filter/chex.chex3/language.csv +++ b/wadsrc_extra/static/filter/chex.chex3/language.csv @@ -1,86 +1,86 @@ -default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr -Picked up a blue flemkey.,GOTBLUEFLEM,Flem = phlegm,,,Sebrán modrý slizoklíč.,Du samlede en blå flemkey op.,Blauen Flemschlüssel genommen,,Vi trovis bluan mukŝlosilon.,Encuentras una flemllave azul.,,Poimit sinisen lima-avaimen,Flemclé bleue récupérée.,Kék slejmkulcs felvéve.,Raccolta una chiave-flem blu.,ブルー フレムキー をみつけた,청색 플렘열쇠 획득.,Je hebt een blauwe flemsleutel opgehaald.,Plukket opp en blå flemkey.,Zebrano niebieski flemowy klucz,Pegou uma flemchave azul.,,Ai ridicat flemcheia albastră.,Получен синий флемключ.,,Plockade upp en blå flemnyckel.,Mavi bir flemkey aldım. -Picked up a yellow flemkey.,GOTYELLOWFLEM,,,,Sebrán žlutý slizoklíč.,Du samlede en gul flemkey op.,Gelben Flemschlüssel genommen,,Vi trovis flavan mukŝlosilon.,Encuentras una flemllave amarilla.,,Poimit keltaisen lima-avaimen,Flemclé jaune récupérée.,Sárga slejmkulcs felvéve.,Raccolta una chiave-flem gialla.,イエローフレムキー をみつけた,황색 플렘열쇠 획득.,Je hebt een gele flemsleutel opgehaald.,Plukket opp en gul flemkey.,Zebrano żółty flemowy klucz,Pegou uma flemchave amarela.,,Ai ridicat flemcheia galbenă.,Получен жёлтый флемключ.,,Plockade upp en gul flemnyckel.,Sarı bir flemkey aldı. -Picked up a red flemkey.,GOTREDFLEM,,,,Sebrán červený slizoklíč.,Du samlede en rød flemkey op.,Roten Flemschlüssel genommen.,,Vi trovis ruĝan mukŝlosilon.,Encuentras una flemllave roja.,,Poimit punaisen lima-avaimen,Flemclé rouge récupérée.,Piros slejmkulcs felvéve.,Raccolta una chiave-flem rossa.,レッド フレムキー をみつけた,적색 플렘열쇠 획득.,Je hebt een rode flemsleutel opgehaald.,Plukket opp en rød flemkey.,Zebrano czerwony flemowy klucz,Pegou uma flemchave vermelha.,,Ai ridicat flemcheia roșie.,Получен красный флемключ.,,Plockade upp en röd flemnyckel.,Kırmızı bir flemkey aldı. -Found Ultra Goggles,GOTGOGGLES,,,,Nalezeny ultrabrýle.,Fandt Ultra Goggles,Ultrasichtbrille gefunden,,Vi trovis plejajn okulvitrojn.,Encuentras ultragafas,Encuentras ultralentes,Löysit ultralasit,Ultra-lunettes récupérées.,Ultraszemüveg felvéve.,,ウルトラゴーグル をみつけた,울트라 고글 사용.,Ultraroggles gevonden,Fant Ultra Goggles,Znaleziono Ultra Gogle,Achou um Ultra Óculos.,,Ai găsit Ultra Ochelarii,Получены ультра-очки,,Hittade Ultra Goggles,Ultra Gözlük bulundu +default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr +Picked up a blue flemkey.,GOTBLUEFLEM,Flem = phlegm,,,Sebrán modrý slizoklíč.,Du samlede en blå flemkey op.,Blauen Flemschlüssel genommen,,Vi trovis bluan mukŝlosilon.,Encuentras una flemllave azul.,,Poimit sinisen lima-avaimen,Flemclé bleue récupérée.,Ključ plave sluzi je pokupljen.,Kék slejmkulcs felvéve.,Raccolta una chiave-flem blu.,ブルー フレムキー をみつけた,청색 플렘열쇠 획득.,Je hebt een blauwe flemsleutel opgehaald.,Plukket opp en blå flemkey.,Zebrano niebieski flemowy klucz,Pegou uma flemchave azul.,,Ai ridicat flemcheia albastră.,Получен синий флемключ.,,Plockade upp en blå flemnyckel.,Mavi bir flemkey aldım. +Picked up a yellow flemkey.,GOTYELLOWFLEM,,,,Sebrán žlutý slizoklíč.,Du samlede en gul flemkey op.,Gelben Flemschlüssel genommen,,Vi trovis flavan mukŝlosilon.,Encuentras una flemllave amarilla.,,Poimit keltaisen lima-avaimen,Flemclé jaune récupérée.,Ključ žute sluzi je pokupljen.,Sárga slejmkulcs felvéve.,Raccolta una chiave-flem gialla.,イエローフレムキー をみつけた,황색 플렘열쇠 획득.,Je hebt een gele flemsleutel opgehaald.,Plukket opp en gul flemkey.,Zebrano żółty flemowy klucz,Pegou uma flemchave amarela.,,Ai ridicat flemcheia galbenă.,Получен жёлтый флемключ.,,Plockade upp en gul flemnyckel.,Sarı bir flemkey aldı. +Picked up a red flemkey.,GOTREDFLEM,,,,Sebrán červený slizoklíč.,Du samlede en rød flemkey op.,Roten Flemschlüssel genommen.,,Vi trovis ruĝan mukŝlosilon.,Encuentras una flemllave roja.,,Poimit punaisen lima-avaimen,Flemclé rouge récupérée.,Ključ crvene sluzi je pokupljen.,Piros slejmkulcs felvéve.,Raccolta una chiave-flem rossa.,レッド フレムキー をみつけた,적색 플렘열쇠 획득.,Je hebt een rode flemsleutel opgehaald.,Plukket opp en rød flemkey.,Zebrano czerwony flemowy klucz,Pegou uma flemchave vermelha.,,Ai ridicat flemcheia roșie.,Получен красный флемключ.,,Plockade upp en röd flemnyckel.,Kırmızı bir flemkey aldı. +Found Ultra Goggles,GOTGOGGLES,,,,Nalezeny ultrabrýle.,Fandt Ultra Goggles,Ultrasichtbrille gefunden,,Vi trovis plejajn okulvitrojn.,Encuentras ultragafas,Encuentras ultralentes,Löysit ultralasit,Ultra-lunettes récupérées.,Ultra naočale su pronađene.,Ultraszemüveg felvéve.,,ウルトラゴーグル をみつけた,울트라 고글 사용.,Ultraroggles gevonden,Fant Ultra Goggles,Znaleziono Ultra Gogle,Achou um Ultra Óculos.,,Ai găsit Ultra Ochelarii,Получены ультра-очки,,Hittade Ultra Goggles,Ultra Gözlük bulundu You need a blue key to activate this object,PD_BLUECO,,,,Potřebuješ modrý klíč pro aktivaci tohoto objektu,Du skal bruge en blå nøgle for at aktivere dette objekt,"Du brauchst einen blauen Schlüssel, um dieses Objekt zu aktivieren.",,"Vi bezonas bluan ŝlosilon por aktivigi ĉi tiun objekton.","Necesitas una llave azul -para activar este objeto",,Tarvitset sinisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé bleue pour activer cet objet.,Egy kék kulcs szükséges az objektum aktiválásához.,Ti serve una chiave blu per attivare questo oggetto,このそうちは ブルー キー がひつようだ,이걸 작동하려면 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om dit object te activeren.,Du trenger en blå nøkkel for å aktivere dette objektet,"Potrzebujesz niebieskiego klucza, aby aktywować ten przedmiot",Você precisa de uma chave azul para ativar este objeto,,Ai nevoie de o cheie albastră pentru a activa acest obiect,Для открытия требуется синий ключ,Треба вам плави кључ да бисте активирали овај предмет,Du behöver en blå nyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için mavi bir anahtara ihtiyacınız var +para activar este objeto",,Tarvitset sinisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé bleue pour activer cet objet.,Potreban ti je plavi ključ da aktiviraš ovaj predmet.,Egy kék kulcs szükséges az objektum aktiválásához.,Ti serve una chiave blu per attivare questo oggetto,このそうちは ブルー キー がひつようだ,이걸 작동하려면 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om dit object te activeren.,Du trenger en blå nøkkel for å aktivere dette objektet,"Potrzebujesz niebieskiego klucza, aby aktywować ten przedmiot",Você precisa de uma chave azul para ativar este objeto,,Ai nevoie de o cheie albastră pentru a activa acest obiect,Для открытия требуется синий ключ,Треба вам плави кључ да бисте активирали овај предмет,Du behöver en blå nyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için mavi bir anahtara ihtiyacınız var You need a red key to activate this object,PD_REDCO,,,,Potřebuješ červený klíč pro aktivaci tohoto objektu,Du skal bruge en rød nøgle for at aktivere dette objekt,"Du brauchst einen roten Schlüssel, um dieses Objekt zu aktivieren.",,"Vi bezonas ruĝan ŝlosilon por aktivigi ĉi tiun objekton.","Necesitas una llave roja -para activar este objeto",,Tarvitset punaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé rouge pour activer cet objet.,Egy piros kulcs szükséges az objektum aktiválásához.,Ti serve una chiave rossa per attivare questo oggetto,このそうちは レッド キー がひつようだ,이걸 작동하려면 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om dit object te activeren.,Du trenger en rød nøkkel for å aktivere denne gjenstanden,"Potrzebujesz czerwonego klucza, aby aktywować ten przedmiot",Você precisa de uma chave vermelha para ativar este objeto,,Ai nevoie de o cheie roșie pentru a activa acest obiect,Для открытия требуется красный ключ,Треба вам црвени кључ да бисте активирали овај предмет,Du behöver en röd nyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için kırmızı bir anahtara ihtiyacınız var +para activar este objeto",,Tarvitset punaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé rouge pour activer cet objet.,Potreban ti je crveni ključ da aktiviraš ovaj predmet.,Egy piros kulcs szükséges az objektum aktiválásához.,Ti serve una chiave rossa per attivare questo oggetto,このそうちは レッド キー がひつようだ,이걸 작동하려면 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om dit object te activeren.,Du trenger en rød nøkkel for å aktivere denne gjenstanden,"Potrzebujesz czerwonego klucza, aby aktywować ten przedmiot",Você precisa de uma chave vermelha para ativar este objeto,,Ai nevoie de o cheie roșie pentru a activa acest obiect,Для открытия требуется красный ключ,Треба вам црвени кључ да бисте активирали овај предмет,Du behöver en röd nyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için kırmızı bir anahtara ihtiyacınız var You need a yellow key to activate this object,PD_YELLOWCO,,,,Potřebuješ žlutý klíč pro aktivaci tohoto objektu,Du skal bruge en gul nøgle for at aktivere dette objekt,"Du brauchst einen gelben Schlüssel, um dieses Objekt zu aktivieren.",,"Vi bezonas flavan ŝlosilon por aktivigi ĉi tiun objekton.","Necesitas una llave amarilla -para activar este objeto",,Tarvitset keltaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé jaune pour activer cet objet.,Egy sárga kulcs szükséges az objektum aktiválásához.,Ti serve una chiave gialla per attivare questo oggetto,このそうちは イエローキー がひつようだ,이걸 작동하려면 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om dit object te activeren.,Du trenger en gul nøkkel for å aktivere denne gjenstanden,"Potrzebujesz żółtego klucza, aby aktywować ten przedmiot",Você precisa de uma chave amarela para ativar este objeto,,Ai nevoie de o cheie galbenă pentru a activa acest obiect,Для открытия требуется жёлтый ключ,Треба вам жути кључ да бисте активирали овај предмет,Du behöver en gul nyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için sarı bir anahtara ihtiyacınız var +para activar este objeto",,Tarvitset keltaisen avaimen aktivoidaksesi tämän kappaleen,Il vous faut une clé jaune pour activer cet objet.,Potreban ti je žuti ključ da aktiviraš ovaj predmet.,Egy sárga kulcs szükséges az objektum aktiválásához.,Ti serve una chiave gialla per attivare questo oggetto,このそうちは イエローキー がひつようだ,이걸 작동하려면 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om dit object te activeren.,Du trenger en gul nøkkel for å aktivere denne gjenstanden,"Potrzebujesz żółtego klucza, aby aktywować ten przedmiot",Você precisa de uma chave amarela para ativar este objeto,,Ai nevoie de o cheie galbenă pentru a activa acest obiect,Для открытия требуется жёлтый ключ,Треба вам жути кључ да бисте активирали овај предмет,Du behöver en gul nyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için sarı bir anahtara ihtiyacınız var You need a blue flemkey to activate this object,PD_BLUEFO,,,,Potřebuješ modrý slizoklíč pro aktivaci tohoto objektu.,Du skal bruge en blå flemkey for at aktivere dette objekt,"Du brauchst einen blauen Flemschlüssel, um dieses Objekt zu aktivieren.",,"Vi bezonas bluan mukŝlosilon por aktivigi ĉi tiun objekton.","Necesitas una flemllave azul -para activar este objeto",,Tarvitset sinisen lima-avaimen aktivoidaksesi tämän kappaleen,Il vous faut une flemclé bleue pour activer cet objet.,Egy kék slejmkulcs szükséges az objektum aktiválásához.,Ti serve una chiave-flem blu per attivare questo oggetto,このそうちは ブルー キーがひつようだ,이걸 작동하려면 청색 플렘열쇠가 필요합니다,Je hebt een blauwe flemsleutel nodig om dit object te activeren.,Du trenger en blå flemkey for å aktivere denne gjenstanden.,"Potrzebujesz niebieskiego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave azul para ativar este objeto,,Ai nevoie de o flemcheie albastră pentru a activa acest obiect,Для открытия требуется синий флемключ,,Du behöver en blå flemnyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için mavi bir flemkey'e ihtiyacınız var +para activar este objeto",,Tarvitset sinisen lima-avaimen aktivoidaksesi tämän kappaleen,Il vous faut une flemclé bleue pour activer cet objet.,Potreban ti je ključ plave sluzi da aktiviraš ovaj predmet.,Egy kék slejmkulcs szükséges az objektum aktiválásához.,Ti serve una chiave-flem blu per attivare questo oggetto,このそうちは ブルー キーがひつようだ,이걸 작동하려면 청색 플렘열쇠가 필요합니다,Je hebt een blauwe flemsleutel nodig om dit object te activeren.,Du trenger en blå flemkey for å aktivere denne gjenstanden.,"Potrzebujesz niebieskiego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave azul para ativar este objeto,,Ai nevoie de o flemcheie albastră pentru a activa acest obiect,Для открытия требуется синий флемключ,,Du behöver en blå flemnyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için mavi bir flemkey'e ihtiyacınız var You need a red flemkey to activate this object,PD_REDFO,,,,Potřebuješ červený slizoklíč pro aktivaci tohoto objektu.,Du skal bruge en rød flemkey for at aktivere dette objekt,"Du brauchst einen roten Flemschlüssel, um dieses Objekt zu aktivieren.",,"Vi bezonas ruĝan mukŝlosilon por aktivigi ĉi tiun objekton.","Necesitas una flemllave roja -para activar este objeto",,Tarvitset punaisen lima-avaimen aktivoidaksesi tämän kappaleen,Il vous faut une flemclé rouge pour activer cet objet.,Egy piros slejmkulcs szükséges az objektum aktiválásához.,Ti serve una chiave-flem rossa per attivare questo oggetto,このそうちは レッド キーがひつようだ,이걸 작동하려면 적색 플렘열쇠가 필요합니다,Je hebt een rode flemsleutel nodig om dit object te activeren.,Du trenger en rød flemkey for å aktivere dette objektet.,"Potrzebujesz czerwonego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave vermelha para ativar este objeto,,Ai nevoie de o flemcheie roșie pentru a activa acest obiect,Для открытия требуется красный флемключ,,Du behöver en röd flemnyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için kırmızı bir flemkey'e ihtiyacınız var +para activar este objeto",,Tarvitset punaisen lima-avaimen aktivoidaksesi tämän kappaleen,Il vous faut une flemclé rouge pour activer cet objet.,Potreban ti je ključ crvene sluzi da aktiviraš ovaj predmet.,Egy piros slejmkulcs szükséges az objektum aktiválásához.,Ti serve una chiave-flem rossa per attivare questo oggetto,このそうちは レッド キーがひつようだ,이걸 작동하려면 적색 플렘열쇠가 필요합니다,Je hebt een rode flemsleutel nodig om dit object te activeren.,Du trenger en rød flemkey for å aktivere dette objektet.,"Potrzebujesz czerwonego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave vermelha para ativar este objeto,,Ai nevoie de o flemcheie roșie pentru a activa acest obiect,Для открытия требуется красный флемключ,,Du behöver en röd flemnyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için kırmızı bir flemkey'e ihtiyacınız var You need a yellow flemkey to activate this object,PD_YELLOWFO,,,,Potřebuješ žlutý slizoklíč pro aktivaci tohoto objektu.,Du skal bruge en gul flemkey for at aktivere dette objekt,"Du brauchst einen gelben Flemschlüssel, um dieses Objekt zu aktivieren.",,"Vi bezonas flavan mukŝlosilon por aktivigi ĉi tiun objekton.","Necesitas unaflemllave amarilla -para activar este objeto",,Tarvitset keltaisen lima-avaimen aktivoidaksesi tämän kappaleen,Il vous faut une flemclé jaune pour activer cet objet.,Egy sárga slejmkulcs szükséges az objektum aktiválásához.,Ti serve una chiave-flem gialla per attivare questo oggetto,このそうちは イエローキーがひつようだ,이걸 작동하려면 황색 플렘열쇠가 필요합니다,Je hebt een gele flemsleutel nodig om dit object te activeren.,Du trenger en gul flemkey for å aktivere dette objektet.,"Potrzebujesz żółtego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave amarela para ativar este objeto,,Ai nevoie de o flemcheie galbenă pentru a activa acest obiect,Для открытия требуется жёлтый флемключ,,Du behöver en gul flemnyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için sarı bir flemkey'e ihtiyacınız var -Picked up a zorcher.,PICKUP_PISTOL_DROPPED,,,,Sebrán bzukr.,Du samlede en zorcher op.,Zorcher genommen.,,Vi trovis zorĉilon.,Encuentras un zorcher.,,Poimit zorcherin,Zorcheur récupéré.,Szörcsölő felvéve.,Ho preso uno zorcher.,ゾーチャー をひろった,자쳐 습득.,Je hebt een zorcher opgehaald.,Plukket opp en zorcher.,Zebrano Zorcher,Pegou um zorcher.,,Ai ridicat un zorcher.,Получен зорчер.,,Plockade upp en zorcher.,Bir zorcher aldım. -Zorch and keys added,STSTR_KFAADDED,,,,Bzukr a klíče přidány,Zorch og nøgler tilføjet,Zorch und Schlüssel hinzugefügt.,,Zorĉaĵo kaj ŝlosiloj aldonitaj,Zorch y llaves añadidas,,Zorch ja avaimet lisätty,Zorch et clés ajoutées.,Szörcs és kulcsok hozzáadva.,Zorch e chiavi aggiunte,ゾーチ と キーがとどいた,저치와 열쇠,Zorch en sleutels toegevoegd,Zorch og nøkler lagt til,Dodano amunicję Zorch i klucze,Zorch e chaves adicionadas,,Zorcher și chei adăugate,Зорч и ключи получены,,Zorch och nycklar har lagts till,Zorch ve anahtarlar eklendi -E1M1: Landing Zone,HUSTR_E1M1,,,,E1M1: Přistávací zóna,E1M1: Landingszone,E1M1: Landezone,,E1M1: Surteriĝejo,E1M1: Zona de aterrizaje,,E1M1: Laskeutumisalue,E1M1: Zone D'Atterissage,E1M1: Leszállópálya,E1M1: Zona di Atterraggio,E1M1: ちゃくち ちてん,E1M1: 착륙 지점,E1M1: Landingzone,E1M1: Landingssone,E1M1: Strefa Lądowania,E1M1: Zona de Pouso,,E1M1: Zona de Aterizare,E1M1: Зона высадки,,E1M1: Landningszon,E1M1: İniş Bölgesi -E1M2: Storage Facility,HUSTR_E1M2,,,,E1M2: Skladiště,E1M2: Opbevaringsanlæg,E1M2: Lagerhalle,,E1M2: Stokejo,E1M2: Instalación de almacenamiento,,E1M2: Varastolaitos,E1M2: Centre de Stockage,E1M2: Raktárépület,E1M2: Struttura di Immagazzinamento,E1M2: ちょぞう しせつ,E1M2: 저장 시설,E1M2: Opslagfaciliteit,E1M2: Lagringsanlegg,E1M2: Magazyn,E1M2: Depósito,,E1M2: Depozitul,E1M2: Хранилище,,E1M2: Förvaringsanläggning,E1M2: Depolama Tesisi -E1M3: Laboratory,HUSTR_E1M3,,,,E1M3: Testovací laboratoř,E1M3: Laboratorium,E1M3: Labor,,E1M3: Laboratorio,E1M3: Laboratorio,,E1M3: Laboratorio,E1M3: Laboratoire,E1M3: Laboratórium,E1M3: Laboratorio,E1M3: ラボラトリー,E1M3: 연구소,E1M3: Laboratorium,E1M3: Laboratorium,E1M3: Laboratorium,E1M3: Laboratório de Experimentos,,E1M3: Laboratorul,E1M3: Лаборатория,,E1M3: Laboratorium,E1M3: Laboratuvar -E1M4: Arboretum,HUSTR_E1M4,,,,,,,,E1M4: Arbejo,E1M4: Arboreto,,,,E1M4: Arborétum,E1M4: Arboreto,E1M4: じゅもく園,E1M4: 수목원,,E1M4: Arboretet,E1M4: Arboretum,E1M4: Arvoredo,,,E1M4: Дендрарий,,, -E1M5: Caverns of Bazoik,HUSTR_E1M5,,,,E1M5: Bazoikské jeskyně,E1M5: Bazoiks grotter,E1M5: Die Höhlen von Bazoik,,E1M5: Kavernoj de Bazojko,E1M5: Cavernas de Bazoik,,E1M5: Bazoikin luolastot,E1M5: Cavernes de Bazoik,E1M5: Bazoik barlangjai,E1M5: Caverne di Bazoik,E1M5: バゾイクのどうくつ,E1M5: 바조이크의 대동굴,E1M5: Grotten van Bazoik,E1M5: Grottene i Bazoik,E1M5: Jaskinie Bazoik,E1M5: Cavernas de Bazoik,,E1M5: Cavernele lui Bazoik,E1M5: Пещеры Базоика,,E1M5: Bazoiks grottor,E1M5: Bazoik Mağaraları -E2M1: Spaceport,HUSTR_E2M1,,,,E2M1: Kosmodrom,E2M1: Rumhavn,E2M1: Raumhafen,,E2M1: Kosmo-haveno,E2M1: Puerto espacial,,E2M1: Avaruussatama,E2M1: Spatioport,E2M1: Űrkikötő,E2M1: Spazioporto,E2M1: スペースポート,E2M1: 우주공항,E2M1: Ruimtehaven,E2M1: Romhavn,E2M1: Port Kosmiczny,E2M1: Espaçoporto,,E2M1: Portul Spațial,E2M1: Космодром,,E2M1: Rymdflygplats,E2M1: Uzay Limanı -E2M2: Cinema,HUSTR_E2M2,,,,E2M2: Kino,,E2M2: Kino,,E2M2: Kinejo,E2M2: Cine,,E2M2: Elokuvateatteri,E2M2: Cinéma,E2M2: Mozi,,E2M2: シネマ,E2M2: 극장,E2M2: Bioscoop,E2M2: Kino,E2M2: Kino,,,,E2M2: Кинотеатр,,,E2M2: Sinema -E2M3: Chex Museum,HUSTR_E2M3,,,,E2M3: Muzem Chex,,,,E2M3: Chex-muzeo,E2M3: Museo de Chex,,E2M3: Chex-museo,E2M3: Musée Chex,E2M3: Chex-múzeum,E2M3: Museo di Chex,E2M3: チェックス ミュージアム,E2M3: 첵스 박물관,,,E2M3: Muzeum Chex,E2M3: Museu Chex,,E2M3: Muzeul Chex,E2M3: Музей Chex,,,E2M3: Chex Müzesi -E2M4: City Streets,HUSTR_E2M4,,,,E2M4: Městské ulice,E2M4: Byens gader,E2M4: städtische Straßen,,E2M4: Urbstratoj,E2M4: Calles de la ciudad,,E2M4: Kaupungin kadut,E2M4: Rues de la Ville,E2M4: Városi utcák,E2M4: Strade della città,E2M4: シティーストリート,E2M4: 도시 거리,E2M4: Stadsstraten,E2M4: Byens gater,E2M4: Ulice Miasta,E2M4: Ruas da Cidade,,E2M4: Străzile Orașului,E2M4: Городские улицы,,E2M4: Stadens gator,E2M4: Şehir Sokakları -E2M5: Sewer System,HUSTR_E2M5,,,,E2M5: Kanalizace,E2M5: Kloaksystem,E2M5: Kanalisation,,E2M5: Defluilego-sistemo,E2M5: Alcantarillado,,E2M5: Viemärijärjestelmä,E2M5: Système d'égouts,E2M5: Csatornarendszer,E2M5: Rete fognaria,E2M5: サワーシステム,E2M5: 하수도,E2M5: Rioleringssysteem,E2M5: Avløpssystem,E2M5: System Ścieków,E2M5: Rede de Esgoto,,E2M5: Sistemul de Canalizare,E2M5: Канализация,,E2M5: Avloppssystem,E2M5: Kanalizasyon Sistemi -E3M1: Central Command,HUSTR_E3M1,,,,E3M1: Centrální velení,E3M1: Centralkommando,E3M1: Kommandozentrale,,E3M1: Centra komandejo,E3M1: Comando central,,E3M1: Komentokeskus,E3M1: Commandement,E3M1: Központi parancsnokság,E3M1: Comando centrale,E3M1: 中央しれいとう,E3M1: 중앙 사령부,E3M1: Centraal Commando,E3M1: Sentral kommando,E3M1: Centrum Dowodzenia,E3M1: Comando Central,,E3M1: Centrul de Comanda,E3M1: Командный центр,,E3M1: Centrala kommandot,E3M1: Merkez Komutanlığı -E3M2: United Cereals,HUSTR_E3M2,,,,E3M2: Spojené cereálie,,E3M2: Vereinigte Zerealien,,E3M2: Uniaj Cerealoj,E3M2: Cereales Unidos,,E3M2: Yhdistyneet murot,E3M2: Céréales Unies,E3M2: Egyesült Gabonapelyhek,E3M2: Cereali uniti,E3M2: ユナイテッド シリアル,E3M2: 시리얼 연합,E3M2: Verenigde granen,,E3M2: Zjednoczone Płatki,E3M2: Cereais Unidos,,E3M2: Cereale Unite,E3M2: Организация Объединённых Хлопьев,,E3M2: United Cereals,E3M2: Birleşik Tahıllar -E3M3: Villa Chex,HUSTR_E3M3,,,,,,,,E3M3: Vilao Chex,,,,E3M3: Villa Chex,,,E3M3: チェックスのべっそう,E3M3: 책스 주택,,,E3M3: Willa Chex,,,E3M3: Vila Chex,E3M3: Вилла Chex,,, -E3M4: Provincial Park,HUSTR_E3M4,,,,E3M4: Provinciální park,,E3M4: Provinzpark,,E3M4: Provinca parko,E3M4: Parque provincial,,E3M4: Provinssipuisto,E3M4: Parc Naturel,E3M4: Tartományi park,E3M4: Parco provinciale,E3M4: 州立公園,E3M4: 주립공원,E3M4: Provinciaal Park,,E3M4: Prowincjonalny Park,E3M4: Parque Natural,,E3M4: Parcul Provincial,E3M4: Провинциальный парк,,,E3M4: İl Parkı -E3M5: Meteor Spaceship,HUSTR_E3M5,,,,E3M5: Meteorová vesmírná loď,E3M5: Meteor rumskib,E3M5: Meteor-Raumschiff,,E3M5: Meteor-kosmoŝipo,E3M5: Nave meteoro,,E3M5: Meteoriavaruusalus,E3M5: Vaisseau Météore,E3M5: Meteor űrhajó,E2M5: Astronave meteorica,E3M5: メテオスペースシップ,E3M5: 거대 유성호,E3M5: Ruimteschip,E3M5: Meteor-romskipet,"E3M5: Statek Kosmiczny ""Meteor""",E3M5: Espaçonave Meteoro,,E3M5: Nava Spațială Meteor,E3M5: Космический корабль «Метеор»,,E3M5: Rymdskeppet Meteor,E3M5: Meteor Uzay Gemisi -Commonus,CC_ZOMBIE,,,,Obecnýs,,,,Oftmukulo,Comunis,,,,Általánusz,,コモンズ,커머누스,,,Pospolitus,,,Comun,Обыкновеннус,,, -Bipedicus,CC_SHOTGUN,,,,Dvojnožus,,,,Dupiedmukulo,Bipedico,,,,Kétlábusz,,バイピディクス,바이피디쿠스,,,,,,Biped,Двуножка,,, -Bipedicus with Armor,CC_IMP,,,,Dvojnožus s brněním,Bipedicus med rustning,Bipedicus mit Panzerung,,Kirasa Dupiedmukulo,Bipedico con armadura,,Panssaroitu bipedicus,Bipedicus avec Armure,Páncélozott kétlábusz,Bipedicus corazzato,アーマードバイピディクス,정예 바이피디쿠스,Bipedicus met harnas,Bipedicus med rustning,Opancerzony Bipedicus,Bipedicus de Armadura,,Biped cu Armură,Бронированная двуножка,,Bipedicus med rustning,Zırhlı Bipedicus -Stridicus,CC_DEMON,,,,Běhakus,,,,Paŝmukulo,Zancadico,,,,Lépkedüsz,,ステュリクス,스트리디쿠스,,,,,,Picioare-Lungi,Длинноножка,,, -Flem Mine,CC_LOST,,,,Slizná mina,,,,Muksentinelo,Flem-Mina,,Limamiina,,Slejmakna,Bomba a Flem,フレムマイン,플렘 지뢰,Flemmijn,,Flemowa Mina,Mina Flem,,Flem Mină,Флем-мина,,Flem-gruva,Flem Madeni -Super Cycloptis,CC_CACO,,,,Superkykloptus,,,,Supera Ciklopmukulo,Supercícloptis,,Supercycloptis,,Szuper Kükloptisz,,スーパーサイクロプティス,슈퍼 사이클롭티스,,Supersykloptis.,Super Cykloptis,,,Super Cicloptic,Супер-циклоптис,,,Süper Cycloptis -Maximus,CC_BARON,,,,,,,,Mukulestro,Máximus,,,,Maximusz,,マクシムス,맥시무스,,,,,,Maxim,Максимус,,, -The Flembomination,CC_SPIDER,,,,Slizavnost,Flembominationen,Die Flembomination,,Mukabomeno,La Flembominación,,Limaoikku,La Flembomination,Slejmdormány,La Flembominio,フレンボミネーション,플렘보미네이션,De Flembominatie,Flembominationen,Flembominacja,A Flembominação,,Flembominație,Флемомерзость,,Flammbomineringen,Flembomination -Lord Snotfolus,CC_CYBER,,,,Lord Hlenfujus,,,,Lordo Mukplenulo,Lord Mocofolus,,Herra Räkänokka,Seigneur Morvator,Lord Takony,,ロード スノフォールス,스놋폴러스 마왕,,,Lord Smarkofolus,Lorde Snotfolus,,Lordul Snotfolus,Правитель Соплезелёнус,,, -Chex Warrior,CC_HERO,,,,Bojovník Chex,Chex Kriger,Chex Krieger,,Chex-batalisto,,,Chex-soturi,Guerrier Chex,Chex harcos,Guerriero Chex,チェックスのせんし,첵스 전사,Chex Krijger,Chex-krigeren,Wojownik Chex,Guerreiro Chex,,Războinic Chex,Воин Chex,,Chex krigare,Chex Savaşçısı +para activar este objeto",,Tarvitset keltaisen lima-avaimen aktivoidaksesi tämän kappaleen,Il vous faut une flemclé jaune pour activer cet objet.,Potreban ti je ključ žute sluzi da aktiviraš ovaj predmet.,Egy sárga slejmkulcs szükséges az objektum aktiválásához.,Ti serve una chiave-flem gialla per attivare questo oggetto,このそうちは イエローキーがひつようだ,이걸 작동하려면 황색 플렘열쇠가 필요합니다,Je hebt een gele flemsleutel nodig om dit object te activeren.,Du trenger en gul flemkey for å aktivere dette objektet.,"Potrzebujesz żółtego flemowego klucza, aby aktywować ten przedmiot",Você precisa de uma flemchave amarela para ativar este objeto,,Ai nevoie de o flemcheie galbenă pentru a activa acest obiect,Для открытия требуется жёлтый флемключ,,Du behöver en gul flemnyckel för att aktivera det här objektet.,Bu nesneyi etkinleştirmek için sarı bir flemkey'e ihtiyacınız var +Picked up a zorcher.,PICKUP_PISTOL_DROPPED,,,,Sebrán bzukr.,Du samlede en zorcher op.,Zorcher genommen.,,Vi trovis zorĉilon.,Encuentras un zorcher.,,Poimit zorcherin,Zorcheur récupéré.,Zorčer je pokupljen.,Szörcsölő felvéve.,Ho preso uno zorcher.,ゾーチャー をひろった,자쳐 습득.,Je hebt een zorcher opgehaald.,Plukket opp en zorcher.,Zebrano Zorcher,Pegou um zorcher.,,Ai ridicat un zorcher.,Получен зорчер.,,Plockade upp en zorcher.,Bir zorcher aldım. +Zorch and keys added,STSTR_KFAADDED,,,,Bzukr a klíče přidány,Zorch og nøgler tilføjet,Zorch und Schlüssel hinzugefügt.,,Zorĉaĵo kaj ŝlosiloj aldonitaj,Zorch y llaves añadidas,,Zorch ja avaimet lisätty,Zorch et clés ajoutées.,Zorč i ključevi su dodani.,Szörcs és kulcsok hozzáadva.,Zorch e chiavi aggiunte,ゾーチ と キーがとどいた,저치와 열쇠,Zorch en sleutels toegevoegd,Zorch og nøkler lagt til,Dodano amunicję Zorch i klucze,Zorch e chaves adicionadas,,Zorcher și chei adăugate,Зорч и ключи получены,,Zorch och nycklar har lagts till,Zorch ve anahtarlar eklendi +E1M1: Landing Zone,HUSTR_E1M1,,,,E1M1: Přistávací zóna,E1M1: Landingszone,E1M1: Landezone,,E1M1: Surteriĝejo,E1M1: Zona de aterrizaje,,E1M1: Laskeutumisalue,E1M1: Zone D'Atterissage,E1M1: Zona slijetanja,E1M1: Leszállópálya,E1M1: Zona di Atterraggio,E1M1: ちゃくち ちてん,E1M1: 착륙 지점,E1M1: Landingzone,E1M1: Landingssone,E1M1: Strefa Lądowania,E1M1: Zona de Pouso,,E1M1: Zona de Aterizare,E1M1: Зона высадки,,E1M1: Landningszon,E1M1: İniş Bölgesi +E1M2: Storage Facility,HUSTR_E1M2,,,,E1M2: Skladiště,E1M2: Opbevaringsanlæg,E1M2: Lagerhalle,,E1M2: Stokejo,E1M2: Instalación de almacenamiento,,E1M2: Varastolaitos,E1M2: Centre de Stockage,E1M2: Skladište,E1M2: Raktárépület,E1M2: Struttura di Immagazzinamento,E1M2: ちょぞう しせつ,E1M2: 저장 시설,E1M2: Opslagfaciliteit,E1M2: Lagringsanlegg,E1M2: Magazyn,E1M2: Depósito,,E1M2: Depozitul,E1M2: Хранилище,,E1M2: Förvaringsanläggning,E1M2: Depolama Tesisi +E1M3: Laboratory,HUSTR_E1M3,,,,E1M3: Testovací laboratoř,E1M3: Laboratorium,E1M3: Labor,,E1M3: Laboratorio,E1M3: Laboratorio,,E1M3: Laboratorio,E1M3: Laboratoire,E1M3: Laboratorij,E1M3: Laboratórium,E1M3: Laboratorio,E1M3: ラボラトリー,E1M3: 연구소,E1M3: Laboratorium,E1M3: Laboratorium,E1M3: Laboratorium,E1M3: Laboratório de Experimentos,,E1M3: Laboratorul,E1M3: Лаборатория,,E1M3: Laboratorium,E1M3: Laboratuvar +E1M4: Arboretum,HUSTR_E1M4,,,,,,,,E1M4: Arbejo,E1M4: Arboreto,,,,E1M4: Arboretum,E1M4: Arborétum,E1M4: Arboreto,E1M4: じゅもく園,E1M4: 수목원,,E1M4: Arboretet,E1M4: Arboretum,E1M4: Arvoredo,,,E1M4: Дендрарий,,, +E1M5: Caverns of Bazoik,HUSTR_E1M5,,,,E1M5: Bazoikské jeskyně,E1M5: Bazoiks grotter,E1M5: Die Höhlen von Bazoik,,E1M5: Kavernoj de Bazojko,E1M5: Cavernas de Bazoik,,E1M5: Bazoikin luolastot,E1M5: Cavernes de Bazoik,E1M5: Bazoikove pećine,E1M5: Bazoik barlangjai,E1M5: Caverne di Bazoik,E1M5: バゾイクのどうくつ,E1M5: 바조이크의 대동굴,E1M5: Grotten van Bazoik,E1M5: Grottene i Bazoik,E1M5: Jaskinie Bazoik,E1M5: Cavernas de Bazoik,,E1M5: Cavernele lui Bazoik,E1M5: Пещеры Базоика,,E1M5: Bazoiks grottor,E1M5: Bazoik Mağaraları +E2M1: Spaceport,HUSTR_E2M1,,,,E2M1: Kosmodrom,E2M1: Rumhavn,E2M1: Raumhafen,,E2M1: Kosmo-haveno,E2M1: Puerto espacial,,E2M1: Avaruussatama,E2M1: Spatioport,E2M1: Svemirska luka,E2M1: Űrkikötő,E2M1: Spazioporto,E2M1: スペースポート,E2M1: 우주공항,E2M1: Ruimtehaven,E2M1: Romhavn,E2M1: Port Kosmiczny,E2M1: Espaçoporto,,E2M1: Portul Spațial,E2M1: Космодром,,E2M1: Rymdflygplats,E2M1: Uzay Limanı +E2M2: Cinema,HUSTR_E2M2,,,,E2M2: Kino,,E2M2: Kino,,E2M2: Kinejo,E2M2: Cine,,E2M2: Elokuvateatteri,E2M2: Cinéma,E2M2: Kino,E2M2: Mozi,,E2M2: シネマ,E2M2: 극장,E2M2: Bioscoop,E2M2: Kino,E2M2: Kino,,,,E2M2: Кинотеатр,,,E2M2: Sinema +E2M3: Chex Museum,HUSTR_E2M3,,,,E2M3: Muzem Chex,,,,E2M3: Chex-muzeo,E2M3: Museo de Chex,,E2M3: Chex-museo,E2M3: Musée Chex,E2M3: Muzej Chexa,E2M3: Chex-múzeum,E2M3: Museo di Chex,E2M3: チェックス ミュージアム,E2M3: 첵스 박물관,,,E2M3: Muzeum Chex,E2M3: Museu Chex,,E2M3: Muzeul Chex,E2M3: Музей Chex,,,E2M3: Chex Müzesi +E2M4: City Streets,HUSTR_E2M4,,,,E2M4: Městské ulice,E2M4: Byens gader,E2M4: städtische Straßen,,E2M4: Urbstratoj,E2M4: Calles de la ciudad,,E2M4: Kaupungin kadut,E2M4: Rues de la Ville,E2M4: Gradske ulice,E2M4: Városi utcák,E2M4: Strade della città,E2M4: シティーストリート,E2M4: 도시 거리,E2M4: Stadsstraten,E2M4: Byens gater,E2M4: Ulice Miasta,E2M4: Ruas da Cidade,,E2M4: Străzile Orașului,E2M4: Городские улицы,,E2M4: Stadens gator,E2M4: Şehir Sokakları +E2M5: Sewer System,HUSTR_E2M5,,,,E2M5: Kanalizace,E2M5: Kloaksystem,E2M5: Kanalisation,,E2M5: Defluilego-sistemo,E2M5: Alcantarillado,,E2M5: Viemärijärjestelmä,E2M5: Système d'égouts,E2M5: Sustav kanalizacije,E2M5: Csatornarendszer,E2M5: Rete fognaria,E2M5: サワーシステム,E2M5: 하수도,E2M5: Rioleringssysteem,E2M5: Avløpssystem,E2M5: System Ścieków,E2M5: Rede de Esgoto,,E2M5: Sistemul de Canalizare,E2M5: Канализация,,E2M5: Avloppssystem,E2M5: Kanalizasyon Sistemi +E3M1: Central Command,HUSTR_E3M1,,,,E3M1: Centrální velení,E3M1: Centralkommando,E3M1: Kommandozentrale,,E3M1: Centra komandejo,E3M1: Comando central,,E3M1: Komentokeskus,E3M1: Commandement,E3M1: Zapovjedništvo,E3M1: Központi parancsnokság,E3M1: Comando centrale,E3M1: 中央しれいとう,E3M1: 중앙 사령부,E3M1: Centraal Commando,E3M1: Sentral kommando,E3M1: Centrum Dowodzenia,E3M1: Comando Central,,E3M1: Centrul de Comanda,E3M1: Командный центр,,E3M1: Centrala kommandot,E3M1: Merkez Komutanlığı +E3M2: United Cereals,HUSTR_E3M2,,,,E3M2: Spojené cereálie,,E3M2: Vereinigte Zerealien,,E3M2: Uniaj Cerealoj,E3M2: Cereales Unidos,,E3M2: Yhdistyneet murot,E3M2: Céréales Unies,E3M2: Ujedinjene žitarice,E3M2: Egyesült Gabonapelyhek,E3M2: Cereali uniti,E3M2: ユナイテッド シリアル,E3M2: 시리얼 연합,E3M2: Verenigde granen,,E3M2: Zjednoczone Płatki,E3M2: Cereais Unidos,,E3M2: Cereale Unite,E3M2: Организация Объединённых Хлопьев,,E3M2: United Cereals,E3M2: Birleşik Tahıllar +E3M3: Villa Chex,HUSTR_E3M3,,,,,,,,E3M3: Vilao Chex,,,,E3M3: Villa Chex,E3M3: Vila Chex,,,E3M3: チェックスのべっそう,E3M3: 책스 주택,,,E3M3: Willa Chex,,,E3M3: Vila Chex,E3M3: Вилла Chex,,, +E3M4: Provincial Park,HUSTR_E3M4,,,,E3M4: Provinciální park,,E3M4: Provinzpark,,E3M4: Provinca parko,E3M4: Parque provincial,,E3M4: Provinssipuisto,E3M4: Parc Naturel,E3M4: Pokrajinski park,E3M4: Tartományi park,E3M4: Parco provinciale,E3M4: 州立公園,E3M4: 주립공원,E3M4: Provinciaal Park,,E3M4: Prowincjonalny Park,E3M4: Parque Natural,,E3M4: Parcul Provincial,E3M4: Провинциальный парк,,,E3M4: İl Parkı +E3M5: Meteor Spaceship,HUSTR_E3M5,,,,E3M5: Meteorová vesmírná loď,E3M5: Meteor rumskib,E3M5: Meteor-Raumschiff,,E3M5: Meteor-kosmoŝipo,E3M5: Nave meteoro,,E3M5: Meteoriavaruusalus,E3M5: Vaisseau Météore,E3M5: Svemirski brod Meteor,E3M5: Meteor űrhajó,E2M5: Astronave meteorica,E3M5: メテオスペースシップ,E3M5: 거대 유성호,E3M5: Ruimteschip,E3M5: Meteor-romskipet,"E3M5: Statek Kosmiczny ""Meteor""",E3M5: Espaçonave Meteoro,,E3M5: Nava Spațială Meteor,E3M5: Космический корабль «Метеор»,,E3M5: Rymdskeppet Meteor,E3M5: Meteor Uzay Gemisi +Commonus,CC_ZOMBIE,,,,Obecnýs,,,,Oftmukulo,Comunis,,,,Uobičajenikus,Általánusz,,コモンズ,커머누스,,,Pospolitus,,,Comun,Обыкновеннус,,, +Bipedicus,CC_SHOTGUN,,,,Dvojnožus,,,,Dupiedmukulo,Bipedico,,,,Dvonožnikus,Kétlábusz,,バイピディクス,바이피디쿠스,,,,,,Biped,Двуножка,,, +Bipedicus with Armor,CC_IMP,,,,Dvojnožus s brněním,Bipedicus med rustning,Bipedicus mit Panzerung,,Kirasa Dupiedmukulo,Bipedico con armadura,,Panssaroitu bipedicus,Bipedicus avec Armure,Dvonožnikus sa štitom,Páncélozott kétlábusz,Bipedicus corazzato,アーマードバイピディクス,정예 바이피디쿠스,Bipedicus met harnas,Bipedicus med rustning,Opancerzony Bipedicus,Bipedicus de Armadura,,Biped cu Armură,Бронированная двуножка,,Bipedicus med rustning,Zırhlı Bipedicus +Stridicus,CC_DEMON,,,,Běhakus,,,,Paŝmukulo,Zancadico,,,,Kamenikus,Lépkedüsz,,ステュリクス,스트리디쿠스,,,,,,Picioare-Lungi,Длинноножка,,, +Flem Mine,CC_LOST,,,,Slizná mina,,,,Muksentinelo,Flem-Mina,,Limamiina,,Sluzava mina,Slejmakna,Bomba a Flem,フレムマイン,플렘 지뢰,Flemmijn,,Flemowa Mina,Mina Flem,,Flem Mină,Флем-мина,,Flem-gruva,Flem Madeni +Super Cycloptis,CC_CACO,,,,Superkykloptus,,,,Supera Ciklopmukulo,Supercícloptis,,Supercycloptis,,Super Kikloptis,Szuper Kükloptisz,,スーパーサイクロプティス,슈퍼 사이클롭티스,,Supersykloptis.,Super Cykloptis,,,Super Cicloptic,Супер-циклоптис,,,Süper Cycloptis +Maximus,CC_BARON,,,,,,,,Mukulestro,Máximus,,,,Maksimus,Maximusz,,マクシムス,맥시무스,,,,,,Maxim,Максимус,,, +The Flembomination,CC_SPIDER,,,,Slizavnost,Flembominationen,Die Flembomination,,Mukabomeno,La Flembominación,,Limaoikku,La Flembomination,Flembominatis,Slejmdormány,La Flembominio,フレンボミネーション,플렘보미네이션,De Flembominatie,Flembominationen,Flembominacja,A Flembominação,,Flembominație,Флемомерзость,,Flammbomineringen,Flembomination +Lord Snotfolus,CC_CYBER,,,,Lord Hlenfujus,,,,Lordo Mukplenulo,Lord Mocofolus,,Herra Räkänokka,Seigneur Morvator,Gospodin Šmrkavikus,Lord Takony,,ロード スノフォールス,스놋폴러스 마왕,,,Lord Smarkofolus,Lorde Snotfolus,,Lordul Snotfolus,Правитель Соплезелёнус,,, +Chex Warrior,CC_HERO,,,,Bojovník Chex,Chex Kriger,Chex Krieger,,Chex-batalisto,,,Chex-soturi,Guerrier Chex,Chex ratnik,Chex harcos,Guerriero Chex,チェックスのせんし,첵스 전사,Chex Krijger,Chex-krigeren,Wojownik Chex,Guerreiro Chex,,Războinic Chex,Воин Chex,,Chex krigare,Chex Savaşçısı You need a blue key to open this door,PD_BLUEC,,,,Potřebuješ modrý klíč pro otevření těchto dveří,Du skal bruge en blå nøgle for at åbne denne dør,"Du brauchst einen blauen Schlüssel, um diese Tür zu öffnen.",,"Vi bezonas bluan ŝlosilon por malfermi ĉi tiun pordon.","Necesitas una llave azul -para abrir esta puerta",,Tarvitset sinisen avaimen avataksesi tämän oven,Il vous faut une clé bleue pour ouvrir cette porte.,Kell egy kék kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave blu per aprire questa porta,このとびらは ブルー キー がひつようだ,이 문을 열려면 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om deze deur te openen.,Du trenger en blå nøkkel for å åpne denne døren,"Potrzebujesz niebieskiego klucza, aby otworzyć te drzwi",Você precisa de uma chave azul para abrir essa porta,,Ai nevoie de o cheie albastră pentru a deschide ușa aceasta,"Нужен синий ключ, чтобы открыть",Треба вам плави кључ да бисте отворили ова врата,Du behöver en blå nyckel för att öppna den här dörren.,Bu kapıyı açmak için mavi bir anahtara ihtiyacın var. +para abrir esta puerta",,Tarvitset sinisen avaimen avataksesi tämän oven,Il vous faut une clé bleue pour ouvrir cette porte.,Potreban ti je plavi ključ da otvoriš ova vrata.,Kell egy kék kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave blu per aprire questa porta,このとびらは ブルー キー がひつようだ,이 문을 열려면 청색 열쇠가 필요합니다,Je hebt een blauwe sleutel nodig om deze deur te openen.,Du trenger en blå nøkkel for å åpne denne døren,"Potrzebujesz niebieskiego klucza, aby otworzyć te drzwi",Você precisa de uma chave azul para abrir essa porta,,Ai nevoie de o cheie albastră pentru a deschide ușa aceasta,"Нужен синий ключ, чтобы открыть",Треба вам плави кључ да бисте отворили ова врата,Du behöver en blå nyckel för att öppna den här dörren.,Bu kapıyı açmak için mavi bir anahtara ihtiyacın var. You need a red key to open this door,PD_REDC,,,,Potřebuješ červený klíč pro otevření těchto dveří,Du skal bruge en rød nøgle for at åbne denne dør,"Du brauchst einen roten Schlüssel, um diese Tür zu öffnen.",,"Vi bezonas ruĝan ŝlosilon por malfermi ĉi tiun pordon.","Necesitas una llave roja -para abrir esta puerta",,Tarvitset punaisen avaimen avataksesi tämän oven,Il vous faut une clé rouge pour ouvrir cette porte.,Kell egy piros kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave rossa per aprire questa porta,このとびらは レッド キー がひつようだ,이 문을 열려면 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om deze deur te openen.,Du trenger en rød nøkkel for å åpne denne døren,"Potrzebujesz czerwonego klucza, aby otworzyć te drzwi",Você precisa de uma chave vermelha para abrir essa porta,,Ai nevoie de o cheie roșie pentru a deschide ușa aceasta,"Нужен красный ключ, чтобы открыть",Треба вам црвени кључ да бисте отворили ова врата,Du behöver en röd nyckel för att öppna den här dörren,Bu kapıyı açmak için kırmızı bir anahtara ihtiyacın var. +para abrir esta puerta",,Tarvitset punaisen avaimen avataksesi tämän oven,Il vous faut une clé rouge pour ouvrir cette porte.,Potreban ti je crveni ključ da otvoriš ova vrata.,Kell egy piros kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave rossa per aprire questa porta,このとびらは レッド キー がひつようだ,이 문을 열려면 적색 열쇠가 필요합니다,Je hebt een rode sleutel nodig om deze deur te openen.,Du trenger en rød nøkkel for å åpne denne døren,"Potrzebujesz czerwonego klucza, aby otworzyć te drzwi",Você precisa de uma chave vermelha para abrir essa porta,,Ai nevoie de o cheie roșie pentru a deschide ușa aceasta,"Нужен красный ключ, чтобы открыть",Треба вам црвени кључ да бисте отворили ова врата,Du behöver en röd nyckel för att öppna den här dörren,Bu kapıyı açmak için kırmızı bir anahtara ihtiyacın var. You need a yellow key to open this door,PD_YELLOWC,,,,Potřebuješ žlutý klíč pro otevření těchto dveří,Du skal bruge en gul nøgle for at åbne denne dør,"Du brauchst einen gelben Schlüssel, um diese Tür zu öffnen.",,"Vi bezonas flavan ŝlosilon por malfermi ĉi tiun pordon.","Necesitas una llave amarilla -para abrir esta puerta",,Tarvitset keltaisen avaimen avataksesi tämän oven,Il vous faut une clé jaune pour ouvrir cette porte.,Kell egy sárga kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave gialla per aprire questa porta,このとびらは イエローキー がひつようだ,이 문을 열려면 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om deze deur te openen.,Du trenger en gul nøkkel for å åpne denne døren,"Potrzebujesz żółtego klucza, aby otworzyć te drzwi",Você precisa de uma chave amarela para abrir essa porta,,Ai nevoie de o cheie galbenă pentru a deschide ușa aceasta,"Нужен жёлтый ключ, чтобы открыть",Треба вам жути кључ да бисте отворили ова врата,Du behöver en gul nyckel för att öppna den här dörren,Bu kapıyı açmak için sarı bir anahtara ihtiyacınız var +para abrir esta puerta",,Tarvitset keltaisen avaimen avataksesi tämän oven,Il vous faut une clé jaune pour ouvrir cette porte.,Potreban ti je žuti ključ da otvoriš ova vrata.,Kell egy sárga kulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave gialla per aprire questa porta,このとびらは イエローキー がひつようだ,이 문을 열려면 황색 열쇠가 필요합니다,Je hebt een gele sleutel nodig om deze deur te openen.,Du trenger en gul nøkkel for å åpne denne døren,"Potrzebujesz żółtego klucza, aby otworzyć te drzwi",Você precisa de uma chave amarela para abrir essa porta,,Ai nevoie de o cheie galbenă pentru a deschide ușa aceasta,"Нужен жёлтый ключ, чтобы открыть",Треба вам жути кључ да бисте отворили ова врата,Du behöver en gul nyckel för att öppna den här dörren,Bu kapıyı açmak için sarı bir anahtara ihtiyacınız var You need a blue flemkey to open this door,PD_BLUEF,,,,Potřebuješ modrý slizoklíč pro otevření těchto dveří,Du skal bruge en blå flemkey for at åbne denne dør,"Du brauchst einen blauen Flemschlüssel, um diese Tür zu öffnen.",,"Vi bezonas bluan mukŝlosilon por malfermi ĉi tiun pordon.","Necesitas una flemllave azul -para abrir esta puerta",,Tarvitset sinisen lima-avaimen avataksesi tämän oven,Il vous faut une flemclé bleue pour ouvrir cette porte.,Kell egy kék slejmkulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave-flem blu per aprire questa porta,このとびらは ブルー キーがひつようだ,이 문을 열려면 청색 플렘열쇠가 필요합니다,Je hebt een blauwe flemsleutel nodig om deze deur te openen.,Du trenger en blå flemkey for å åpne denne døren,"Potrzebujesz niebieskiego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave azul para ativar este objeto,,Ai nevoie de o flemcheie albastră pentru a deschide ușa aceasta,"Нужен синий флемключ, чтобы открыть",,Du behöver en blå flemnyckel för att öppna den här dörren.,Bu kapıyı açmak için mavi bir flemkey'e ihtiyacın var. +para abrir esta puerta",,Tarvitset sinisen lima-avaimen avataksesi tämän oven,Il vous faut une flemclé bleue pour ouvrir cette porte.,Potreban ti je ključ plave sluzi da otvoriš ova vrata.,Kell egy kék slejmkulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave-flem blu per aprire questa porta,このとびらは ブルー キーがひつようだ,이 문을 열려면 청색 플렘열쇠가 필요합니다,Je hebt een blauwe flemsleutel nodig om deze deur te openen.,Du trenger en blå flemkey for å åpne denne døren,"Potrzebujesz niebieskiego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave azul para ativar este objeto,,Ai nevoie de o flemcheie albastră pentru a deschide ușa aceasta,"Нужен синий флемключ, чтобы открыть",,Du behöver en blå flemnyckel för att öppna den här dörren.,Bu kapıyı açmak için mavi bir flemkey'e ihtiyacın var. You need a red flemkey to open this door,PD_REDF,,,,Potřebuješ červený slizoklíč pro otevření těchto dveří,Du skal bruge en rød flemkey for at åbne denne dør,"Du brauchst einen roten Flemschlüssel, um diese Tür zu öffnen.",,"Vi bezonas ruĝan mukŝlosilon por malfermi ĉi tiun pordon.","Necesitas una flemllave roja -para abrir esta puerta",,Tarvitset punaisen lima-avaimen avataksesi tämän oven,Il vous faut une flemclé rouge pour ouvrir cette porte.,Kell egy piros slejmkulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave-flem rossa per aprire questa porta,このとびらは レッド キーがひつようだ,이 문을 열려면 적색 플렘열쇠가 필요합니다,Je hebt een rode flemsleutel nodig om deze deur te openen.,Du trenger en rød flemkey for å åpne denne døren,"Potrzebujesz czerwonego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave vermelha para ativar este objeto,,Ai nevoie de o flemcheie roșie pentru a deschide ușa aceasta,"Нужен красный флемключ, чтобы открыть",,Du behöver en röd flemnyckel för att öppna den här dörren.,Bu kapıyı açmak için kırmızı bir flemkey'e ihtiyacın var. +para abrir esta puerta",,Tarvitset punaisen lima-avaimen avataksesi tämän oven,Il vous faut une flemclé rouge pour ouvrir cette porte.,Potreban ti je ključ crvene sluzi da otvoriš ova vrata.,Kell egy piros slejmkulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave-flem rossa per aprire questa porta,このとびらは レッド キーがひつようだ,이 문을 열려면 적색 플렘열쇠가 필요합니다,Je hebt een rode flemsleutel nodig om deze deur te openen.,Du trenger en rød flemkey for å åpne denne døren,"Potrzebujesz czerwonego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave vermelha para ativar este objeto,,Ai nevoie de o flemcheie roșie pentru a deschide ușa aceasta,"Нужен красный флемключ, чтобы открыть",,Du behöver en röd flemnyckel för att öppna den här dörren.,Bu kapıyı açmak için kırmızı bir flemkey'e ihtiyacın var. You need a yellow flemkey to open this door,PD_YELLOWF,,,,Potřebuješ žlutý slizoklíč pro otevření těchto dveří,Du har brug for en gul flemkey for at åbne denne dør,"Du brauchst einen gelben Flemschlüssel, um diese Tür zu öffnen.",,"Vi bezonas flavan mukŝlosilon por malfermi ĉi tiun pordon.","Necesitas una flemllave amarilla -para abrir esta puerta",,Tarvitset keltaisen lima-avaimen avataksesi tämän oven,Il vous faut une flemclé jaune pour ouvrir cette porte.,Kell egy sárga slejmkulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave-flem gialla per aprire questa porta,このとびらは イエローキーがひつようだ,이 문을 열려면 황색 플렘열쇠가 필요합니다,Je hebt een gele flemsleutel nodig om deze deur te openen.,Du trenger en gul flemkey for å åpne denne døren,"Potrzebujesz żółtego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave amarela para ativar este objeto,,Ai nevoie de o flemcheie galbenă pentru a deschide ușa aceasta,"Нужен жёлтый флемключ, чтобы открыть",,Du behöver en gul flemnyckel för att öppna den här dörren.,Bu kapıyı açmak için sarı bir flemkey'e ihtiyacın var. -%o sinks into some slime.,OB_SLIME,,,,%o se propadl@[ao_cs] do slizu.,%o synker ned i noget slim.,%o versank im Schleim,,%o sinkas en ŝlimon.,%o se hunde en babas.,,%o uppoaa limaan,%o se noie dans la morve.,%o elsüllyedt a trutyiban.,%o affonda in qualche melma.,%o はスライムにしずんだ。,%o 는(은) 점액 속으로 가라앉았습니다.,%o zinkt in wat slijm.,%o synker ned i noe slim.,%o topi się w szlamie.,%o afundou na gosma.,,%o se scufundă în mâzgă.,Игрок %o утонул в слизи.,,%o sjunker ner i lite slem.,%o balçığın içine battı. -%o sinks into some slime.,OB_LAVA,,,,%o se propadl@[ao_cs] do slizu.,%o synker ned i noget slim.,%o versank im Schleim,,%o sinkas en ŝlimon.,%o se hunde en babas.,,%o uppoaa limaan,%o se noie dans la morve.,%o elsüllyedt a trutyiban.,%o affonda in qualche melma.,%o はスライムにしずんだ。,%o 는(은) 질척하게 가라앉았습니다.,%o zinkt in wat slijm.,%o synker ned i noe slim.,%o topi się w szlamie.,%o afundou na gosma.,,%o se scufundă în mâzgă.,Игрок %o утонул в слизи.,,%o sjunker ner i lite slem.,%o balçığın içine battı. -%o was hit by inter-dimensional slime!,OB_POWERSTRAND,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o blev ramt af interdimensionalt slim!,%o wurde von interdimensionalem Schleim getroffen,,%o estis trafita de interdimensia ŝlimo!,¡A %o l@[ao_esp] ha alcanzado baba interdimensional!,¡A %o l@[ao_esp] alcanzó baba interdimensional!,%o parkaan osui interdimensionaalista limaa!,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,%o interdimenzionális trutyi áldozata lett!,%o è stato colpito da melma interdimensionale!,%o は いじげんスライムまみれになった!,%o 는(은) 차원균열 점액에 맞았습니다!,%o werd geraakt door interdimensionaal slijm!,%o ble truffet av interdimensjonalt slim!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,%o a fost lovit de mâzgă interdimensională!,В игрока %o попала межпространственная слизь!,,%o träffades av interdimensionellt slem!,%o boyutlar arası balçık tarafından vuruldu! -%o was hit by inter-dimensional slime!,OB_KILLEDSELF,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o blev ramt af interdimensionalt slim!,%o wurde von interdimensionalem Schleim getroffen,,%o estis trafita de interdimensia ŝlimo!,¡A %o l@[ao_esp] ha alcanzado baba interdimensional!,¡A %o l@[ao_esp] alcanzó baba interdimensional!,%o parkaan osui interdimensionaalista limaa!,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,%o interdimenzionális trutyi áldozata lett!,%o è stato colpito da melma interdimensionale!,%o は いじげんスライムまみれになった!,%o 는(은) 모르는 사이에 점액에 당했습니다!,%o werd geraakt door interdimensionaal slijm!,%o ble truffet av interdimensjonalt slim!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,%o a fost lovit de mâzgă interdimensională!,В игрока %o попала межпространственная слизь!,,%o träffades av interdimensionellt slem!,%o boyutlar arası balçık tarafından vuruldu! -%o was boogered by a stridicus.,OB_STRIDICUS,,,,%o dostal@[ao_cs] holuby od běhakem.,%o blev buogered af en stridicus.,%o wurde von einem Stridicus bepopelt.,,%o estis mukigita de Paŝmukulo.,A %o l@[ao_esp] ha moqueado un Zancadico.,A %o l@[ao_esp] moqueó un Zancadico.,%o joutui stridicuksen räkäämäksi.,%o s'est fait@[e_fr] engluer par un stridicus.,%o taknyos lett egy lépkedüsztől.,%o è stato colpito da uno Stridicus.,%o は ステュリクスに おびやかされた。,%o 는(은) 스트리디쿠스의 코딱지에 당했습니다.,%o werd door een stridicus gezoomd.,%o ble bæsjet av en stridicus.,%o został@[ao_pl] zaglutowan@[adj_pl] przez stridicusa.,%o foi melecad@[ao_ptb] por um stridicus.,,%o a fost speriat de către un picioare-lungi.,Игрока %o облепила соплями длинноножка. ,,%o blev utskälld av en stridicus.,%o bir stridicus tarafından avlandı. -%o was gooed by a flem mine.,OB_FLEMMINE,,,,%o byl@[ao_cs] zablácen@[ao_cs] sliznou minou.,%o blev smittet af en flem mine.,%o wurde von einer Flem-Mine beschmiert.,,%o estis glukovrita de Muksentinelo.,A %o l@[ao_esp] ha pegoteado una Flem-Mina.,A %o l@[ao_esp] pegoteó una Flem-Mina.,%o joutui limamiinan mönjäämäksi.,%o s'est fait@[e_fr] éclabousser par une flem mine.,%o-t összenyálkázta egy slejmakna.,%o è stato colpito da una bomba a flem.,%o はフレムマインに ヒドいめにあった。,%o 는(은) 플렘 지뢰에 의해 점액 범벅이 됐습니다.,%o werd door een Flemmijn getreiterd.,%o ble gooed av en flem mine.,"%o został@[ao_pl] zabrejowan@[adj_pl] przez flemową minę. +para abrir esta puerta",,Tarvitset keltaisen lima-avaimen avataksesi tämän oven,Il vous faut une flemclé jaune pour ouvrir cette porte.,Potreban ti je ključ žute sluzi da otvoriš ova vrata.,Kell egy sárga slejmkulcs hogy kinyisd ezt az ajtót.,Ti serve una chiave-flem gialla per aprire questa porta,このとびらは イエローキーがひつようだ,이 문을 열려면 황색 플렘열쇠가 필요합니다,Je hebt een gele flemsleutel nodig om deze deur te openen.,Du trenger en gul flemkey for å åpne denne døren,"Potrzebujesz żółtego flemowego klucza, aby otworzyć te drzwi",Você precisa de uma flemchave amarela para ativar este objeto,,Ai nevoie de o flemcheie galbenă pentru a deschide ușa aceasta,"Нужен жёлтый флемключ, чтобы открыть",,Du behöver en gul flemnyckel för att öppna den här dörren.,Bu kapıyı açmak için sarı bir flemkey'e ihtiyacın var. +%o sinks into some slime.,OB_SLIME,,,,%o se propadl@[ao_cs] do slizu.,%o synker ned i noget slim.,%o versank im Schleim,,%o sinkas en ŝlimon.,%o se hunde en babas.,,%o uppoaa limaan,%o se noie dans la morve.,%o se utapa u malo sluzi.,%o elsüllyedt a trutyiban.,%o affonda in qualche melma.,%o はスライムにしずんだ。,%o 는(은) 점액 속으로 가라앉았습니다.,%o zinkt in wat slijm.,%o synker ned i noe slim.,%o topi się w szlamie.,%o afundou na gosma.,,%o se scufundă în mâzgă.,Игрок %o утонул в слизи.,,%o sjunker ner i lite slem.,%o balçığın içine battı. +%o sinks into some slime.,OB_LAVA,,,,%o se propadl@[ao_cs] do slizu.,%o synker ned i noget slim.,%o versank im Schleim,,%o sinkas en ŝlimon.,%o se hunde en babas.,,%o uppoaa limaan,%o se noie dans la morve.,%o se utapa u malo sluzi.,%o elsüllyedt a trutyiban.,%o affonda in qualche melma.,%o はスライムにしずんだ。,%o 는(은) 질척하게 가라앉았습니다.,%o zinkt in wat slijm.,%o synker ned i noe slim.,%o topi się w szlamie.,%o afundou na gosma.,,%o se scufundă în mâzgă.,Игрок %o утонул в слизи.,,%o sjunker ner i lite slem.,%o balçığın içine battı. +%o was hit by inter-dimensional slime!,OB_POWERSTRAND,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o blev ramt af interdimensionalt slim!,%o wurde von interdimensionalem Schleim getroffen,,%o estis trafita de interdimensia ŝlimo!,¡A %o l@[ao_esp] ha alcanzado baba interdimensional!,¡A %o l@[ao_esp] alcanzó baba interdimensional!,%o parkaan osui interdimensionaalista limaa!,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,%o pogađa međudimenzionalna sluz!,%o interdimenzionális trutyi áldozata lett!,%o è stato colpito da melma interdimensionale!,%o は いじげんスライムまみれになった!,%o 는(은) 차원균열 점액에 맞았습니다!,%o werd geraakt door interdimensionaal slijm!,%o ble truffet av interdimensjonalt slim!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,%o a fost lovit de mâzgă interdimensională!,В игрока %o попала межпространственная слизь!,,%o träffades av interdimensionellt slem!,%o boyutlar arası balçık tarafından vuruldu! +%o was hit by inter-dimensional slime!,OB_KILLEDSELF,,,,%o byl@[ao_cs] zasažen@[ao_cs] mezidimenzionálním slizem!,%o blev ramt af interdimensionalt slim!,%o wurde von interdimensionalem Schleim getroffen,,%o estis trafita de interdimensia ŝlimo!,¡A %o l@[ao_esp] ha alcanzado baba interdimensional!,¡A %o l@[ao_esp] alcanzó baba interdimensional!,%o parkaan osui interdimensionaalista limaa!,%o s'est fait@[e_fr] toucher par de la morve interdimensionelle!,%o pogađa međudimenzionalna sluz!,%o interdimenzionális trutyi áldozata lett!,%o è stato colpito da melma interdimensionale!,%o は いじげんスライムまみれになった!,%o 는(은) 모르는 사이에 점액에 당했습니다!,%o werd geraakt door interdimensionaal slijm!,%o ble truffet av interdimensjonalt slim!,%o został@[ao_pl] uderzon@[adj_pl] przez międzywymiarowy szlam!,%o foi atingid@[ao_ptb] por gosma interdimensional!,,%o a fost lovit de mâzgă interdimensională!,В игрока %o попала межпространственная слизь!,,%o träffades av interdimensionellt slem!,%o boyutlar arası balçık tarafından vuruldu! +%o was boogered by a stridicus.,OB_STRIDICUS,,,,%o dostal@[ao_cs] holuby od běhakem.,%o blev buogered af en stridicus.,%o wurde von einem Stridicus bepopelt.,,%o estis mukigita de Paŝmukulo.,A %o l@[ao_esp] ha moqueado un Zancadico.,A %o l@[ao_esp] moqueó un Zancadico.,%o joutui stridicuksen räkäämäksi.,%o s'est fait@[e_fr] engluer par un stridicus.,Kamenikus izvikava %o.,%o taknyos lett egy lépkedüsztől.,%o è stato colpito da uno Stridicus.,%o は ステュリクスに おびやかされた。,%o 는(은) 스트리디쿠스의 코딱지에 당했습니다.,%o werd door een stridicus gezoomd.,%o ble bæsjet av en stridicus.,%o został@[ao_pl] zaglutowan@[adj_pl] przez stridicusa.,%o foi melecad@[ao_ptb] por um stridicus.,,%o a fost speriat de către un picioare-lungi.,Игрока %o облепила соплями длинноножка. ,,%o blev utskälld av en stridicus.,%o bir stridicus tarafından avlandı. +%o was gooed by a flem mine.,OB_FLEMMINE,,,,%o byl@[ao_cs] zablácen@[ao_cs] sliznou minou.,%o blev smittet af en flem mine.,%o wurde von einer Flem-Mine beschmiert.,,%o estis glukovrita de Muksentinelo.,A %o l@[ao_esp] ha pegoteado una Flem-Mina.,A %o l@[ao_esp] pegoteó una Flem-Mina.,%o joutui limamiinan mönjäämäksi.,%o s'est fait@[e_fr] éclabousser par une flem mine.,%o raznosi sluzava mina.,%o-t összenyálkázta egy slejmakna.,%o è stato colpito da una bomba a flem.,%o はフレムマインに ヒドいめにあった。,%o 는(은) 플렘 지뢰에 의해 점액 범벅이 됐습니다.,%o werd door een Flemmijn getreiterd.,%o ble gooed av en flem mine.,"%o został@[ao_pl] zabrejowan@[adj_pl] przez flemową minę. ",%o foi engosmad@[ao_ptb] por uma mina flem.,,%o a fost lovit de mâzga unei flem mine.,Игрока %o забрызгала флем-мина.,,%o blev gooad av en loppgruva.,%o bir flem mayını tarafından yapışkan hale getirildi. -%o was slimed by a super cycloptis.,OB_SUPERCYCLOPTIS,,,,%o byl@[ao_cs] osliznut@[ao_cs] superkykloptem.,%o blev slimet af en super cycloptis.,%o wurde von einem Super Cycloptis vollgeschleimt.,,%o estis ŝlimigita de Supera Ciklopmukulo.,A %o l@[ao_esp] ha enlodado un Supercícloptis.,A %o l@[ao_esp] enlodó un Supercícloptis.,%o joutui supercycloptiksen limaamaksi.,%o s'est fait@[e_fr] gélifier par un super cycloptis.,%o-t összenyálkázta egy Szuper Kükloptisz.,%o è stato snellito da una Super Ciyloptis.,%o はスーパーサイクロプティスに とかされた。,%o 는(은) 슈퍼 사이클롭티스의 점액에 당했습니다.,%o werd afgeslankt door een Super Cycloptis.,%o ble slimet av en supersykloptis.,%o został@[ao_pl] oszlamion@[adj_pl] przez super cykloptisa.,%o foi lambuzad@[ao_ptb] por um super cyclóptis.,,%o a fost transformat în mâzgă de către un super cicloptic.,Игрока %o обслюнявил супер-циклоптис.,,%o blev slemmig av en supercykloptis.,%o bir süper sikloptis tarafından sümüklendi. -%o was defeated by a Maximus.,OB_MAXIMUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Maximem.,%o blev besejret af en Maximus.,%o wurde von einem Maximus besiegt.,,%o estis venkita de Mukulestro.,A %o l@[ao_esp] ha derrotado un Máximus.,A %o l@[ao_esp] derrotó un Máximus.,%o joutui Maximuksen päihittämäksi.,%o s'est fait@[e_fr] battre par un Maximus.,%o-t legyőzte egy Maximusz.,%o è stato sconfitto da un Maximus.,%o はマクシムスに 敗北した。,%o 는(은) 맥시무스에게 패배했습니다.,%o werd verslagen door een Maximus.,%o ble beseiret av en Maximus.,%o został@[ao_pl] pokonan@[adj_pl] przez Maximusa.,%o foi derrotad@[ao_ptb] por um Maximus.,,%o a fost înfrânt de către un Maxim.,Игрок %o проиграл Максимусу.,,%o besegrades av en Maximus.,%o bir Maximus tarafından yenildi. -%o was gooed by a larva.,OB_LARVA,,,,%o byl@[ao_cs] zacáknut@[ao_cs] larvou.,%o blev smurt af en larve.,%o wurde von einer Larve beschmiert.,,%o estis glukovrita de larvo.,A %o l@[ao_esp] ha pegoteado una larva.,A %o l@[ao_esp] pegoteó una larva.,%o joutui toukan mönjäämäksi.,%o s'est fait@[e_fr] tâcher par une larve.,%o lárvatrutyit kapott a nyakába.,%o è stato colpito da una larva.,%o はラーバに ヒドいめにあわされた。,%o 는(은) 애벌레에 의해 점액 범벅이 됐습니다.,%o werd door een Larve weggegooid.,%o ble gooed av en larve.,%o został@[ao_pl] zabrejowan@[adj_pl] przez larwę.,%o foi engosmad@[ao_ptb] por uma larva.,,%o a fost lovit de mâzga unei larve.,Игрока %o обслюнявила личинка.,,%o blev göad av en larv.,%o bir larva tarafından öldürüldü. -%o was slimed by a Quadrumpus.,OB_QUADRUMPUS,,,,%o byl@[ao_cs] zahleněn@[ao_cs] Čtyřzadkem.,%o blev slimet af en Quadrumpus.,%o wurde von einem Quadrumpus vollgeschleimt.,,%o estis ŝlimigita de kvarbrakmukulo.,A %o l@[ao_esp] ha enlodado un Quadrumpus.,A %o l@[ao_esp] enlodó un Quadrumpus.,%o joutui Neliperän limaamaksi.,%o s'est fait@[e_fr] morver par un quadrumpus.,%o-t összenyálkázta egy Négylábusz.,%o è stato ridotto da un Quadrumpus.,%o はクワッドロンプスに スライムにされた。,%o 는(은) 쿼드럼푸스의 점액에 당했습니다.,%o werd afgeslankt door een Quadrumpus.,%o ble slimet av en Quadrumpus.,%o został@[ao_pl] oszlamion@[adj_pl] przez Quadrumpusa.,%o foi melecad@[ao_ptb] por um Quadrumpus.,,%o a fost transformat în mâzgă de către o creatură cu patru mâini,Игрока %o обслюнявила многоручка. ,,%o blev slemmad av en Quadrumpus.,%o bir Quadrumpus tarafından zayıflatıldı. -%o was defeated by the Flembomination.,OB_FLEMBOMINATION,,,,%o byl@[ao_cs] poražen@[ao_cs] Slizavností.,%o blev besejret af Flembomination.,%o wurde von der Flembomination besiegt.,,%o estis venkita de la Mukabomeno.,A %o l@[ao_esp] ha derrotado la Flembominación.,A %o l@[ao_esp] derrotó la Flembominación.,%o joutui Limaoikun päihittämäksi.,%o s'est fait@[e_fr] éliminer par la Flembomination.,%o-t legyőzte a Slejmdormány.,%o è stato sconfitto dalla Flembomination.,%o はフレンボミネーションに敗北した。,%o 는(은) 플렘보미네이션으로부터 벗어날 수 없었습니다.,%o werd verslagen door de Flembominatie.,%o ble beseiret av Flembominationen.,%o został@[ao_pl] pokonan@[adj_pl] przez Flembominację.,%o foi derrotad@[ao_ptb] pela Flembominação.,,%o a fost învins de către Flembominație.,Игрока %o победила Флемомерзость.,,%o besegrades av Flembomination.,"%o, Flembomination tarafından yenildi." -%o was defeated by Lord Snotfolus.,OB_SNOTFOLUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Lordem Hlenfujem.,%o blev besejret af Lord Snotfolus.,%o wurde von Lord Snotfolus besiegt.,,%o estis venkita de Lordo Mukplenulo.,A %o l@[ao_esp] ha derrotado Lord Mocofolus.,A %o l@[ao_esp] derrotó Lord Mocofolus.,%o joutui herra Räkänokan päihittämäksi.,%o est tombé@[e_fr] face au Seigneur Morvator.,%o legyőzetett Lord Takony által.,%o è stato sconfitto da Lord Snotfolus.,%o はロード スノフォールスに敗北した。,%o 는(은) 스놋폴러스 마왕과 싸울 준비를 제대로 하지 못했습니다.,%o werd verslagen door Lord Snotfolus.,%o ble beseiret av Lord Snotfolus.,%o został@[ao_pl] pokonan@[adj_pl] przez Lorda Smarkofolusa.,%o foi derrotad@[ao_ptb] pelo Lorde Snotfolus.,,%o a fost pus la pământ de către Lordul Snotfolus.,Игрока %o победил правитель Соплезелёнус.,,%o besegrades av Lord Snotfolus.,"%o, Lord Snotfolus tarafından yenildi." -%o was hit by %k's propulsor.,OB_MPR_SPLASH,,,,%o byl@[ao_cs] zasažen@[ao_cs] propulzorem hráče %k.,%o blev ramt af %ks propulsor.,%o wurde von %ks Propeller getroffen,,%o estis trafita de la propulsilo de %k.,A %o l@[ao_esp] ha alcanzado el propulsor de %k.,A %o l@[ao_esp] alcanzó el propulsor de %k.,%k osui %o parkaan työntimellään.,%o s'est fait@[e_fr] propulser par %k.,%o-t eltalálta %k hajtóműve.,%o è stato colpito dal propulsore di %k.,%o に %k のロケットゾーチがとどいた。,%o 는(은) %k 의 추진력에 휘말렸습니다.,%o werd geraakt door %k's propulsor.,%o ble truffet av %ks propulsor.,%o został@[ao_pl] uderzon@[adj_pl] przez pędnik %k.,%o foi atingid@[ao_ptb] pelo propulsor de %k.,,%o a fost lovit de către propulsorul lui %k.,Игрок %o подстрелен из ускорителя зорча %k.,,%o träffades av %ks propulsor.,"%o, %k tarafından vuruldu." -%o was lazzed by %k.,OB_MPBFG_SPLASH,,,,%o byl@[ao_cs] odlazován@[ao_cs] hráčem %k.,%o blev lazzed af %k.,%o wurde von %o weggezorcht.,,%o estis LAZ-ita de %k.,A %o l@[ao_esp] ha «lazeado» %k.,A %o l@[ao_esp] «lazeó» %k.,%k sazzasi pelaajaan %o.,%o est entré@[e_fr] dans la zone de zorchage large de %k.,%o-t szörcsölődött %k által.,%o è stato lazzato da %k.,%o は %k にとかされた。,%o 는(은) %k 에게 레이져를 쐬였습니다.,%o werd gelazzed door %k.,%o ble lazzed av %k.,%o został@[ao_pl] zLAZowan@[adj_pl] przez %k.,%o foi LAZead@[ao_ptb] por %k.,,%k a folosit dispozitivul LAZ pe %o.,Игрок %o получил заряд из «ЗБР» игрока %k.,,%o blev lurad av %k.,"%o, %k tarafından lazzlandı." +%o was slimed by a super cycloptis.,OB_SUPERCYCLOPTIS,,,,%o byl@[ao_cs] osliznut@[ao_cs] superkykloptem.,%o blev slimet af en super cycloptis.,%o wurde von einem Super Cycloptis vollgeschleimt.,,%o estis ŝlimigita de Supera Ciklopmukulo.,A %o l@[ao_esp] ha enlodado un Supercícloptis.,A %o l@[ao_esp] enlodó un Supercícloptis.,%o joutui supercycloptiksen limaamaksi.,%o s'est fait@[e_fr] gélifier par un super cycloptis.,Super Kikloptis uništava %o u sluzi.,%o-t összenyálkázta egy Szuper Kükloptisz.,%o è stato snellito da una Super Ciyloptis.,%o はスーパーサイクロプティスに とかされた。,%o 는(은) 슈퍼 사이클롭티스의 점액에 당했습니다.,%o werd afgeslankt door een Super Cycloptis.,%o ble slimet av en supersykloptis.,%o został@[ao_pl] oszlamion@[adj_pl] przez super cykloptisa.,%o foi lambuzad@[ao_ptb] por um super cyclóptis.,,%o a fost transformat în mâzgă de către un super cicloptic.,Игрока %o обслюнявил супер-циклоптис.,,%o blev slemmig av en supercykloptis.,%o bir süper sikloptis tarafından sümüklendi. +%o was defeated by a Maximus.,OB_MAXIMUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Maximem.,%o blev besejret af en Maximus.,%o wurde von einem Maximus besiegt.,,%o estis venkita de Mukulestro.,A %o l@[ao_esp] ha derrotado un Máximus.,A %o l@[ao_esp] derrotó un Máximus.,%o joutui Maximuksen päihittämäksi.,%o s'est fait@[e_fr] battre par un Maximus.,Maksimus poražava %o.,%o-t legyőzte egy Maximusz.,%o è stato sconfitto da un Maximus.,%o はマクシムスに 敗北した。,%o 는(은) 맥시무스에게 패배했습니다.,%o werd verslagen door een Maximus.,%o ble beseiret av en Maximus.,%o został@[ao_pl] pokonan@[adj_pl] przez Maximusa.,%o foi derrotad@[ao_ptb] por um Maximus.,,%o a fost înfrânt de către un Maxim.,Игрок %o проиграл Максимусу.,,%o besegrades av en Maximus.,%o bir Maximus tarafından yenildi. +%o was gooed by a larva.,OB_LARVA,,,,%o byl@[ao_cs] zacáknut@[ao_cs] larvou.,%o blev smurt af en larve.,%o wurde von einer Larve beschmiert.,,%o estis glukovrita de larvo.,A %o l@[ao_esp] ha pegoteado una larva.,A %o l@[ao_esp] pegoteó una larva.,%o joutui toukan mönjäämäksi.,%o s'est fait@[e_fr] tâcher par une larve.,Crv raznosi %o.,%o lárvatrutyit kapott a nyakába.,%o è stato colpito da una larva.,%o はラーバに ヒドいめにあわされた。,%o 는(은) 애벌레에 의해 점액 범벅이 됐습니다.,%o werd door een Larve weggegooid.,%o ble gooed av en larve.,%o został@[ao_pl] zabrejowan@[adj_pl] przez larwę.,%o foi engosmad@[ao_ptb] por uma larva.,,%o a fost lovit de mâzga unei larve.,Игрока %o обслюнявила личинка.,,%o blev göad av en larv.,%o bir larva tarafından öldürüldü. +%o was slimed by a Quadrumpus.,OB_QUADRUMPUS,,,,%o byl@[ao_cs] zahleněn@[ao_cs] Čtyřzadkem.,%o blev slimet af en Quadrumpus.,%o wurde von einem Quadrumpus vollgeschleimt.,,%o estis ŝlimigita de kvarbrakmukulo.,A %o l@[ao_esp] ha enlodado un Quadrumpus.,A %o l@[ao_esp] enlodó un Quadrumpus.,%o joutui Neliperän limaamaksi.,%o s'est fait@[e_fr] morver par un quadrumpus.,Četverostrukus uništava %o u sluzi.,%o-t összenyálkázta egy Négylábusz.,%o è stato ridotto da un Quadrumpus.,%o はクワッドロンプスに スライムにされた。,%o 는(은) 쿼드럼푸스의 점액에 당했습니다.,%o werd afgeslankt door een Quadrumpus.,%o ble slimet av en Quadrumpus.,%o został@[ao_pl] oszlamion@[adj_pl] przez Quadrumpusa.,%o foi melecad@[ao_ptb] por um Quadrumpus.,,%o a fost transformat în mâzgă de către o creatură cu patru mâini,Игрока %o обслюнявила многоручка. ,,%o blev slemmad av en Quadrumpus.,%o bir Quadrumpus tarafından zayıflatıldı. +%o was defeated by the Flembomination.,OB_FLEMBOMINATION,,,,%o byl@[ao_cs] poražen@[ao_cs] Slizavností.,%o blev besejret af Flembomination.,%o wurde von der Flembomination besiegt.,,%o estis venkita de la Mukabomeno.,A %o l@[ao_esp] ha derrotado la Flembominación.,A %o l@[ao_esp] derrotó la Flembominación.,%o joutui Limaoikun päihittämäksi.,%o s'est fait@[e_fr] éliminer par la Flembomination.,Flembominatis poražava %o.,%o-t legyőzte a Slejmdormány.,%o è stato sconfitto dalla Flembomination.,%o はフレンボミネーションに敗北した。,%o 는(은) 플렘보미네이션으로부터 벗어날 수 없었습니다.,%o werd verslagen door de Flembominatie.,%o ble beseiret av Flembominationen.,%o został@[ao_pl] pokonan@[adj_pl] przez Flembominację.,%o foi derrotad@[ao_ptb] pela Flembominação.,,%o a fost învins de către Flembominație.,Игрока %o победила Флемомерзость.,,%o besegrades av Flembomination.,"%o, Flembomination tarafından yenildi." +%o was defeated by Lord Snotfolus.,OB_SNOTFOLUS,,,,%o byl@[ao_cs] poražen@[ao_cs] Lordem Hlenfujem.,%o blev besejret af Lord Snotfolus.,%o wurde von Lord Snotfolus besiegt.,,%o estis venkita de Lordo Mukplenulo.,A %o l@[ao_esp] ha derrotado Lord Mocofolus.,A %o l@[ao_esp] derrotó Lord Mocofolus.,%o joutui herra Räkänokan päihittämäksi.,%o est tombé@[e_fr] face au Seigneur Morvator.,Gospodin Šmrkavikus poražava %o.,%o legyőzetett Lord Takony által.,%o è stato sconfitto da Lord Snotfolus.,%o はロード スノフォールスに敗北した。,%o 는(은) 스놋폴러스 마왕과 싸울 준비를 제대로 하지 못했습니다.,%o werd verslagen door Lord Snotfolus.,%o ble beseiret av Lord Snotfolus.,%o został@[ao_pl] pokonan@[adj_pl] przez Lorda Smarkofolusa.,%o foi derrotad@[ao_ptb] pelo Lorde Snotfolus.,,%o a fost pus la pământ de către Lordul Snotfolus.,Игрока %o победил правитель Соплезелёнус.,,%o besegrades av Lord Snotfolus.,"%o, Lord Snotfolus tarafından yenildi." +%o was hit by %k's propulsor.,OB_MPR_SPLASH,,,,%o byl@[ao_cs] zasažen@[ao_cs] propulzorem hráče %k.,%o blev ramt af %ks propulsor.,%o wurde von %ks Propeller getroffen,,%o estis trafita de la propulsilo de %k.,A %o l@[ao_esp] ha alcanzado el propulsor de %k.,A %o l@[ao_esp] alcanzó el propulsor de %k.,%k osui %o parkaan työntimellään.,%o s'est fait@[e_fr] propulser par %k.,Propulzor od %k pogađa %o.,%o-t eltalálta %k hajtóműve.,%o è stato colpito dal propulsore di %k.,%o に %k のロケットゾーチがとどいた。,%o 는(은) %k 의 추진력에 휘말렸습니다.,%o werd geraakt door %k's propulsor.,%o ble truffet av %ks propulsor.,%o został@[ao_pl] uderzon@[adj_pl] przez pędnik %k.,%o foi atingid@[ao_ptb] pelo propulsor de %k.,,%o a fost lovit de către propulsorul lui %k.,Игрок %o подстрелен из ускорителя зорча %k.,,%o träffades av %ks propulsor.,"%o, %k tarafından vuruldu." +%o was lazzed by %k.,OB_MPBFG_SPLASH,,,,%o byl@[ao_cs] odlazován@[ao_cs] hráčem %k.,%o blev lazzed af %k.,%o wurde von %o weggezorcht.,,%o estis LAZ-ita de %k.,A %o l@[ao_esp] ha «lazeado» %k.,A %o l@[ao_esp] «lazeó» %k.,%k sazzasi pelaajaan %o.,%o est entré@[e_fr] dans la zone de zorchage large de %k.,%k lijenčari %o.,%o-t szörcsölődött %k által.,%o è stato lazzato da %k.,%o は %k にとかされた。,%o 는(은) %k 에게 레이져를 쐬였습니다.,%o werd gelazzed door %k.,%o ble lazzed av %k.,%o został@[ao_pl] zLAZowan@[adj_pl] przez %k.,%o foi LAZead@[ao_ptb] por %k.,,%k a folosit dispozitivul LAZ pe %o.,Игрок %o получил заряд из «ЗБР» игрока %k.,,%o blev lurad av %k.,"%o, %k tarafından lazzlandı." "After sending the monstrous Flembrane back to his own dimension, you free the captives. Yet flemoids are everywhere! @@ -206,7 +206,15 @@ Malheureusement, vous avez raison. Quand vous retournez sur votre planète, vous découvrez que les flémoïdes vous ont suivi jusqu'ici. Préparez vous pour -Chex Quest 2: Terreur à Chex City!","Miután visszaküldted a szörnyű Slejmbránt +Chex Quest 2: Terreur à Chex City!","Nakon što si poslao/la čudovišnu Flembranu natrag u vlastitu dimenziju, oslobađaš zatočenike. Ipak, flemoidi su posvuda! +Ti i zatočenici se probijate do tvog svemirskog broda. Flemoidi gađaju tvoj brod sa sluzi, ali ti usko bježiš u orbitu. +Tijekom povrata ti se čestita za odvažno spašavanje, ali izdaješ upozorenje... +Nismo vidjeli posljednje Flemoide. + +Nažalost, u pravu si. Kako se ti +vraćaš doma, otkrivaš da su te Flemoidi +nekako slijedili ovdje. Pripremi se +za Chexovu potragu 2: Teror u gradu Chexu!","Miután visszaküldted a szörnyű Slejmbránt a saját dimenziójába, kiszabadítod a foglyokat. De a slejmoidok még mindenütt ott vannak! A foglyokkal együtt az űrhajóhoz szaladtok. @@ -519,7 +527,23 @@ géante se dirige vers la planète des céréales! Préparez vous pour Chex Quest 3: -Invasion!","A csatornában összegyűlt maradék slejmoidokat is szörcsölöd. +Invasion!","Zorčiš preostale flemoide koji su se +okupili u kanalizaciji. Grad Chex je +spašen. Čini se da je flemoidska prijetnja +napokon završena. + + +10 godina prolazi u miru i blagostanju. +No, Flemoidi nisu poraženi, a +njihova želja da kontroliraju nutritivno +bogatu dimenziju žitarica nije se smanjila. +Okupili su sve svoje snage, otvorili +gigantsku međudimenzionalnu pukotinu u svemiru +i sada velika kugla sluzi ide +ravno prema planetu žitarica! + +Pripremi se za +Chexovu potragu 3: Invazija!","A csatornában összegyűlt maradék slejmoidokat is szörcsölöd. Chexváros megmenekült. Úgy tűnik, a slejmoidveszély végre megszűnt. @@ -793,7 +817,20 @@ revenir envahir la dimension des céréales. Mais vous savez que vous serez -prêt pour eux!","Egy utolsó dördüléssel visszaszörcsölöd Lord Takonyt +prêt pour eux!","Posljednjim udarcem, zorčiš Gospodina +Šmrkavikusa natrag u njegovu vlastitu dimenziju! +Unatoč svim izgledima, +sam/a spriječavaš invaziju! + +Istinski se nadaš da su Flemoidi +napokon naučili svoju lekciju i da se +nikada više neće vraćati u dimenziju +žitarica. + + + +Ali, ako to učine, znaš da ćeš biti +spreman/na za njih!","Egy utolsó dördüléssel visszaszörcsölöd Lord Takonyt a saját dimenziójába! Minden várakozás ellenére egymagad megakadályoztad az inváziót! @@ -921,6 +958,6 @@ umuyorsun. Ama dönerlerse, onlar için hazır olacağınızı biliyorsunuz!" -Rescue on Bazoik,M_EPI1,,,,Záchrana na Bazoiku,Redning på Bazoik,Rettung auf Bazoik,,Savo sur Bazojko,Rescate en Bazoik,,Pelastustehtävä Bazoikissa,Sauvetage sur Bazoik,Mentőakció a Bazoik-on,Salvataggio su Bazoik,バゾイクからのきゅうしゅつ,바조이크의 대동굴,Redding op Bazoik,Redning på Bazoik,Ratunek na Bazoik,Resgate em Bazoik,,Misiune de Salvare pe Bazoik,Спасение на Базоике,,Räddning på Bazoik,Bazoik'te Kurtarma -Terror in Chex City,M_EPI2,,,,Hrůza v Chex City,Terror i Chex City,,,Teruro en Chex-Urbo,Terror en Chex City,,Kauhua Chex-kaupungissa,Terreur à Chex City,Terror Chexvárosban,Terrore a Chex City,チェックスシティーのきょうふ,첵스 시티의 공포,Terreur in Chex City,Terror i Chex City,Terror w Mieście Chex,Terror em Chexópolis,,Teroare în Orașul Chex,Террор в городе Chex,,Terror i Chex City,Chex Şehrinde Terör -Invasion!,M_EPI3,,,,Invaze!,,,,Invado!,¡Invasión!,,Invaasio!,,Invázió!,Invasione!,しんにゅう!,대침공!,,Invasjon!,Inwazja,A Invasão!,,Invazie!,Вторжение!,,,İstila! \ No newline at end of file +Rescue on Bazoik,M_EPI1,,,,Záchrana na Bazoiku,Redning på Bazoik,Rettung auf Bazoik,,Savo sur Bazojko,Rescate en Bazoik,,Pelastustehtävä Bazoikissa,Sauvetage sur Bazoik,Spas na Bazoiku,Mentőakció a Bazoik-on,Salvataggio su Bazoik,バゾイクからのきゅうしゅつ,바조이크의 대동굴,Redding op Bazoik,Redning på Bazoik,Ratunek na Bazoik,Resgate em Bazoik,,Misiune de Salvare pe Bazoik,Спасение на Базоике,,Räddning på Bazoik,Bazoik'te Kurtarma +Terror in Chex City,M_EPI2,,,,Hrůza v Chex City,Terror i Chex City,,,Teruro en Chex-Urbo,Terror en Chex City,,Kauhua Chex-kaupungissa,Terreur à Chex City,Teror u gradu Chexu,Terror Chexvárosban,Terrore a Chex City,チェックスシティーのきょうふ,첵스 시티의 공포,Terreur in Chex City,Terror i Chex City,Terror w Mieście Chex,Terror em Chexópolis,,Teroare în Orașul Chex,Террор в городе Chex,,Terror i Chex City,Chex Şehrinde Terör +Invasion!,M_EPI3,,,,Invaze!,,,,Invado!,¡Invasión!,,Invaasio!,,Invazija!,Invázió!,Invasione!,しんにゅう!,대침공!,,Invasjon!,Inwazja,A Invasão!,,Invazie!,Вторжение!,,,İstila! \ No newline at end of file diff --git a/wadsrc_extra/static/filter/hacx.hacx1/after_iwad/language.csv b/wadsrc_extra/static/filter/hacx.hacx1/after_iwad/language.csv index e163f7885..bc460861d 100644 --- a/wadsrc_extra/static/filter/hacx.hacx1/after_iwad/language.csv +++ b/wadsrc_extra/static/filter/hacx.hacx1/after_iwad/language.csv @@ -1,122 +1,122 @@ -default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr -These bugs too tough for ya?,QUITMSG1,,,,Jsou ty bugy na tebe moc tvrdé?,Er disse bugs for hårde for dig?,Sind diese Bugs zu viel für dich?,,Ĉu ĉi tiuj cimoj estas tro forta por vi?,¿Son estos bichos demasiado duros para ti?,,Taitavat nämä ötökät olla liikaa sulle?,Ces bestioles sont trop fortes pour vous?,Túl erősek neked a bogarak is?,Questi errori sono troppo difficili per te?,テメェにはあんなバグ 厳しかないだろ?,고작 버그들 상대하는 것도 버거운 건가?,Zijn deze bugs te hard voor je?,Er disse insektene for tøffe for deg?,To robactwo jest za twarde dla ciebie?,"Tá achando difícil eliminar esses bugs, é?",,Sunt prea duri gândacii pentru tine?,Эти баги крутоваты для тебя?,,Är dessa bugs för svåra för dig?,Bu böcekler senin için çok mu zor? +default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr +These bugs too tough for ya?,QUITMSG1,,,,Jsou ty bugy na tebe moc tvrdé?,Er disse bugs for hårde for dig?,Sind diese Bugs zu viel für dich?,,Ĉu ĉi tiuj cimoj estas tro forta por vi?,¿Son estos bichos demasiado duros para ti?,,Taitavat nämä ötökät olla liikaa sulle?,Ces bestioles sont trop fortes pour vous?,,Túl erősek neked a bogarak is?,Questi errori sono troppo difficili per te?,テメェにはあんなバグ 厳しかないだろ?,고작 버그들 상대하는 것도 버거운 건가?,Zijn deze bugs te hard voor je?,Er disse insektene for tøffe for deg?,To robactwo jest za twarde dla ciebie?,"Tá achando difícil eliminar esses bugs, é?",,Sunt prea duri gândacii pentru tine?,Эти баги крутоваты для тебя?,,Är dessa bugs för svåra för dig?,Bu böcekler senin için çok mu zor? Are you sure you want to\njack out of the action?,QUITMSG,,,,"Jsi si jistý, že se chceš zdáchnout z akce?","Er du sikker på, at du vil holdeop med at deltage?","Bist du sicher, dass du den\nStecker ziehen willst?",,"Ĉu vi certas, ke vi volas -malkonektiĝi el la batalo?",¿Estás segur@[ao_esp] de que\nquieres desconectarte de la acción?,,Haluatko varmasti irrottaa\npiuhan toiminnasta?,Etes-vous sûr de vouloir\nvous déconnecter de l'action?,"Biztos vagy benne, hogy kihúzod a kábelt?",Sei sicuro di voler uscire?,もしかして逃げ出そうとしてないよな?,"지금 종료하겠다고? +malkonektiĝi el la batalo?",¿Estás segur@[ao_esp] de que\nquieres desconectarte de la acción?,,Haluatko varmasti irrottaa\npiuhan toiminnasta?,Etes-vous sûr de vouloir\nvous déconnecter de l'action?,,"Biztos vagy benne, hogy kihúzod a kábelt?",Sei sicuro di voler uscire?,もしかして逃げ出そうとしてないよな?,"지금 종료하겠다고? 진심이냐?",Weet je zeker dat je de actie wilt staken?,Er du sikker på at du vil trekke deg ut av handlingen?,Na pewo chcesz wyjść w środku akcji?,Quer mesmo se desconectar de toda a ação? ,,Ești sigur că vrei să\npărăsești acțiunea?,Ты правда хочешь улизнуть\nс поля боя?,,Är du säker på att du inte vill vara med?,İşin dışında kalmak istediğine emin misin? -Trying to quit? And you call yourself a hacker?,QUITMSG2,,,,Snažíš se skončit? To si říkáš hacker?,Prøver du at holde op? Og du kalder dig selv en hacker?,Du willst gehen? Bist du wirklich ein Hacker?,,Vi provas rezigni? Kaj vi nomas vin kodrompisto?,¿Intentando salir? ¿Y te haces llamar hacker?,,Yritätkö lopettaa? Ja sinäkö muka hakkeri?,On essaye de quitter?\nvous prétendez être un hacker?,Próbálasz kilépni? És még te nevezed magad hekkernek?,Stai cercando di smettere?\nE ti definisci un hacker?,終了させる? それでハッカー自称してたのか?,그만두려고? 해커라는 이름이 아깝군그래.,Proberen te stoppen? En je noemt jezelf een hacker?,Prøver du å slutte? Og du kaller deg en hacker?,Próbujesz wyjść? I nazywasz siebie hakerem?,Tá querendo sair? E você ainda se acha um hacker?,,Încerci să ieși? Și te mai numești hacker?,Хочешь убежать? А ещё зовёшь себя хакером!,,Försöker du sluta? Och du kallar dig för hackare?,Bırakmaya mı çalışıyorsun? Bir de kendine hacker mı diyorsun? +Trying to quit? And you call yourself a hacker?,QUITMSG2,,,,Snažíš se skončit? To si říkáš hacker?,Prøver du at holde op? Og du kalder dig selv en hacker?,Du willst gehen? Bist du wirklich ein Hacker?,,Vi provas rezigni? Kaj vi nomas vin kodrompisto?,¿Intentando salir? ¿Y te haces llamar hacker?,,Yritätkö lopettaa? Ja sinäkö muka hakkeri?,On essaye de quitter?\nvous prétendez être un hacker?,,Próbálasz kilépni? És még te nevezed magad hekkernek?,Stai cercando di smettere?\nE ti definisci un hacker?,終了させる? それでハッカー自称してたのか?,그만두려고? 해커라는 이름이 아깝군그래.,Proberen te stoppen? En je noemt jezelf een hacker?,Prøver du å slutte? Og du kaller deg en hacker?,Próbujesz wyjść? I nazywasz siebie hakerem?,Tá querendo sair? E você ainda se acha um hacker?,,Încerci să ieși? Și te mai numești hacker?,Хочешь убежать? А ещё зовёшь себя хакером!,,Försöker du sluta? Och du kallar dig för hackare?,Bırakmaya mı çalışıyorsun? Bir de kendine hacker mı diyorsun? Get back here before I send a virus up your tailpipe!,QUITMSG3,,,,"Vrať se, než ti do zadku pošlu virus!","Kom tilbage, før jeg sender en virus op i dit udstødningsrør!","Komm zurück, oder ich schick dir 'nen Virus!",,"Revenu ĉi tien antaŭ ol mi sendos viruson en vian posttubon!","¡Vuelve aquí antes de que te meta un virus de través!","¡Vuelve antes de que te mande -un virus al tubo de escape!","Heti takaisin tänne, ennen kuin lähetän viruksen pitkin takaputkeasi!",Reviens ici avant que je t'envoie un virus là où ça fait mal!,"Gyere csak vissza, mielőtt feldugok neked egy vírust.",Torna indietro o ti\nmanderò un virus!,さっさと戻らねえと そのケツ穴にウィルスぶっこむぞ!,"돌아와, 네 전선에 바이러스 주입해버리기 전에!",Kom terug voordat ik een virus in je uitlaatpijp stuur!,Kom tilbake før jeg sender et virus opp eksosrøret ditt!,Wróć tu zanim wyślę ci wirusa!,Volta aqui antes que eu te mande um vírus!,,Treci înapoi aici până nu-ți trimit un virus!,"Вернись, пока я не посадил вирус тебе на хвост!",,Kom tillbaka innan jag skickar ett virus upp i ditt avgasrör!,Egzozuna bir virüs göndermeden önce buraya geri dön! +un virus al tubo de escape!","Heti takaisin tänne, ennen kuin lähetän viruksen pitkin takaputkeasi!",Reviens ici avant que je t'envoie un virus là où ça fait mal!,,"Gyere csak vissza, mielőtt feldugok neked egy vírust.",Torna indietro o ti\nmanderò un virus!,さっさと戻らねえと そのケツ穴にウィルスぶっこむぞ!,"돌아와, 네 전선에 바이러스 주입해버리기 전에!",Kom terug voordat ik een virus in je uitlaatpijp stuur!,Kom tilbake før jeg sender et virus opp eksosrøret ditt!,Wróć tu zanim wyślę ci wirusa!,Volta aqui antes que eu te mande um vírus!,,Treci înapoi aici până nu-ți trimit un virus!,"Вернись, пока я не посадил вирус тебе на хвост!",,Kom tillbaka innan jag skickar ett virus upp i ditt avgasrör!,Egzozuna bir virüs göndermeden önce buraya geri dön! Real hackers never jack out of the action.,QUITMSG4,,,,Skuteční hackeři nikdy neprchají z akce.,Rigtige hackere går aldrig ud af spillet.,Echte Hacker geben nicht auf!,,"Veraj kodrompistoj neniam fuĝas el batalo.","Los verdaderos hackers no -se desconectan de la acción.",,Todelliset hakkerit eivät ikinä kytkeydy irti toiminnasta.,Un vrai hacker ne se déconnecte pas en pleine action.,Az igazi hekkerek sosem húzzák ki a kábelt.,I veri hacker non si arrendono!,本物のハッカーなら頭を銃で撃ち抜くことはしない。,진정한 해커는 이렇게 포기하지 않는다고!,Echte hackers komen nooit uit de actie.,Ekte hackere trekker seg aldri ut av kampen.,Prawdziwi hakerzy nigdy nie uciekają z akcji.,Hackers de verdade nunca vazam da ação!,,Adevărații hackeri nu fug de acțiune.,Настоящие хакеры не пытаются улизнуть с поля боя.,,Riktiga hackare hoppar aldrig av.,Gerçek hackerlar asla aksiyondan kaçmazlar. +se desconectan de la acción.",,Todelliset hakkerit eivät ikinä kytkeydy irti toiminnasta.,Un vrai hacker ne se déconnecte pas en pleine action.,,Az igazi hekkerek sosem húzzák ki a kábelt.,I veri hacker non si arrendono!,本物のハッカーなら頭を銃で撃ち抜くことはしない。,진정한 해커는 이렇게 포기하지 않는다고!,Echte hackers komen nooit uit de actie.,Ekte hackere trekker seg aldri ut av kampen.,Prawdziwi hakerzy nigdy nie uciekają z akcji.,Hackers de verdade nunca vazam da ação!,,Adevărații hackeri nu fug de acțiune.,Настоящие хакеры не пытаются улизнуть с поля боя.,,Riktiga hackare hoppar aldrig av.,Gerçek hackerlar asla aksiyondan kaçmazlar. C'mon! You haven't seen the best part yet!,QUITMSG5,,,,No tak! Ještě jsi neviděl to nejlepší!,Kom nu! Du har ikke set det bedste endnu!,Komm schon. Du hast das Beste noch gar nicht gesehen!,,"Nu! Vi ankoraŭ ne vidis la plej bonan parton!","¡Venga! ¡Aún no has visto la mejor parte!","¡Venga! ¡Aún no -viste la mejor parte!",Älä viitsi! Et ole edes vielä nähnyt parasta kohtaa!,"Allez, on arrive presque à la meilleure partie!",Nemár! Még nem is láttad a legjobb részt!,"Andiamo, forza! Non hai ancora\nvisto la parte migliore!",おいおい! お楽しみはこれからだぜ!,이봐! 아직 재밌는 부분은 시작도 안 했다고!,Kom op! Je hebt het beste deel nog niet gezien!,Kom igjen! Du har ikke sett det beste ennå!,No weź! Jeszcze nie widziałeś najlepszej części!,Qual é! Você nem viu a melhor parte ainda!,,Haide! Nu ai văzut partea cea mai bună încă!,"Да ладно, ты ещё не видел самое крутое!",,Kom igen! Du har inte sett det bästa ännu!,Hadi ama! Daha en iyi kısmını görmedin! +viste la mejor parte!",Älä viitsi! Et ole edes vielä nähnyt parasta kohtaa!,"Allez, on arrive presque à la meilleure partie!",,Nemár! Még nem is láttad a legjobb részt!,"Andiamo, forza! Non hai ancora\nvisto la parte migliore!",おいおい! お楽しみはこれからだぜ!,이봐! 아직 재밌는 부분은 시작도 안 했다고!,Kom op! Je hebt het beste deel nog niet gezien!,Kom igjen! Du har ikke sett det beste ennå!,No weź! Jeszcze nie widziałeś najlepszej części!,Qual é! Você nem viu a melhor parte ainda!,,Haide! Nu ai văzut partea cea mai bună încă!,"Да ладно, ты ещё не видел самое крутое!",,Kom igen! Du har inte sett det bästa ännu!,Hadi ama! Daha en iyi kısmını görmedin! "Give up now, and cyberspace is toast!",QUITMSG6,,,,Vzdej se a s kyberprostorem je konec!,"Giv op nu, og cyberspace er ristet!",Wenn du jetzt aufgibst ist der Cyberspace am Ende.,,"Se vi rezignas nun, tiam Interret-spaco estos detruita!","¡Ríndete ahora y el ciberespacio -está frito!",,Luovuta nyt ja kyberavaruus kärtsää!,"Abandonne, et le cyberespace est foutu!","Ha most feladod, akkor a cyberspacenek lőttek.","Se ti arrendi ora,\nil cyberspazio è finito.",さっさと止めて、サイバースペースに乾杯だ!,포기하면 사이버 공간은 결국엔 사라질걸?,"Geef het nu op, en cyberspace is een toast!","Gi opp nå, og cyberspace er ferdig!","Poddaj się, a cyberprzestrzeń zmieni się w tosta!","Se você desistir agora, o ciberespaço já era!",,"Te dai bătut acum, și spațiul cibernetic e prăjit!","Если ты сейчас сдашься, киберпространству конец!",,Om du ger upp nu är cyberrymden död!,"Şimdi pes edersen, siber uzay kızarır!" -"GENIE sends its best regards, scumbag!",QUITMSG7,,,,"GENIE posílá své pozdravy, hajzle!","GENIE sender dig sine bedste hilsner, skiderik!","GENIE sendet seine besten Grüße, Mistkerl!",,"ĜINIO sendas plej siajn konsiderojn, fiulo!","¡GENIE te envía saludos, desgraciado!",,"GENIE lähettää terveisensä, mäntti!","GENIE t'envoie ses salutations, salaud!","GENIE üdvözletét küldi, te mocsok!","GENIE ti manda i suoi\nmigliori saluti, bastardo!",GENIEがベストの挨拶を送るぜ、カス野郎!,어이 등신! 지니에서 안부를 전해 달라더군.,"GENIE doet je de groeten, klootzak!","GENIE sender sine beste hilsener, drittsekk!","GENIE przysyła pozdrowienia, łajzo!","GENIE manda lembranças, seu lixo!",,"GENIE își transmite condoleanțele, ticălosule!","Наилучшие пожелания от ДЖИННа, ублюдок!",,"GENIE skickar sina bästa hälsningar, skitstövel!","GENIE selamlarını yolladı, pislik!" -"Hmm. So much for being a hero, Hacker.",QUITMSG8,,,,"Hmm. To by bylo pro hrdinství, Hackeře.","Hmm. Så meget for at være en helt, Hacker.","Hmm. So viel zum Thema ""Held"", Hacker.",,"Ĥaa. Kia domaĝo, ke vi estas hero, Kodrompisto.","Hmm. Poco tienes de héroe, hacker.",,"Höh, se siitä sankarina olemisesta sitten, hakkeri.","Eh bien, on est pas vraiment un héros, hacker.","Hmm. Ennyit a hős karrieredről, hekker barátom.","Hmm. E io che pensavo fossi un eroe, Hacker.",うーん。英雄とはこの程度だったのか、ハッカー。,영웅이 될 그릇은 아닌 거 같군. 안 그래? 해커 형씨.,"Hmm. Tot zover de held, Hacker.","Hmm. Så mye for å være en helt, Hacker.","Hmm. Tak wiele by być bohaterem, Hakerze.","Hmm. Não é tão herói assim, pelo visto.",,"Hmm. Asta a fost cu eroismele, Hacker.","Хм-м. Вот тебе и герой, хакер!",,"Hmm. Så mycket för att vara en hjälte, Hacker.","Hmm. Kahraman olmak için çok fazla, Hacker." -What? You'd rather go back to the pen?,QUITMSG9,,,,Co? Radši by ses vrátil do basy?,Hvad? Vil du hellere gå tilbage til fængslet?,Was? Du willst in den Knast zurück?,,"Kio? Ĉu vi preferas, ke vi revenu al la plumon?",¿Qué? ¿Prefieres volver al corral?,,Täh? Menisit mieluummin takaisin kynän ääreen?,Quoi? Tu préfère retourner dans ta cellule?,Hogy micsoda? inkább visszamennél a tolladhoz?,Cosa? Vuoi tornare in prigione?,何? 今更ペンで計算するのか?,펜이나 끄적거리는 인생으로 돌아가겠다. 이건가?,Wat? Ga je liever terug naar de pen?,Hva? Vil du heller tilbake til kasjotten?,Co? Wolisz wrócić do więzienia?,O quê? Prefere voltar pro xilindró?,,Ce? Vrei să te întorci la captivitate?,Что? Ты хочешь вернуться в неволю?,,Vad? Vill du hellre gå tillbaka till pennan?,Ne? Kalemine geri dönmeyi mi tercih ediyorsun? +está frito!",,Luovuta nyt ja kyberavaruus kärtsää!,"Abandonne, et le cyberespace est foutu!",,"Ha most feladod, akkor a cyberspacenek lőttek.","Se ti arrendi ora,\nil cyberspazio è finito.",さっさと止めて、サイバースペースに乾杯だ!,포기하면 사이버 공간은 결국엔 사라질걸?,"Geef het nu op, en cyberspace is een toast!","Gi opp nå, og cyberspace er ferdig!","Poddaj się, a cyberprzestrzeń zmieni się w tosta!","Se você desistir agora, o ciberespaço já era!",,"Te dai bătut acum, și spațiul cibernetic e prăjit!","Если ты сейчас сдашься, киберпространству конец!",,Om du ger upp nu är cyberrymden död!,"Şimdi pes edersen, siber uzay kızarır!" +"GENIE sends its best regards, scumbag!",QUITMSG7,,,,"GENIE posílá své pozdravy, hajzle!","GENIE sender dig sine bedste hilsner, skiderik!","GENIE sendet seine besten Grüße, Mistkerl!",,"ĜINIO sendas plej siajn konsiderojn, fiulo!","¡GENIE te envía saludos, desgraciado!",,"GENIE lähettää terveisensä, mäntti!","GENIE t'envoie ses salutations, salaud!",,"GENIE üdvözletét küldi, te mocsok!","GENIE ti manda i suoi\nmigliori saluti, bastardo!",GENIEがベストの挨拶を送るぜ、カス野郎!,어이 등신! 지니에서 안부를 전해 달라더군.,"GENIE doet je de groeten, klootzak!","GENIE sender sine beste hilsener, drittsekk!","GENIE przysyła pozdrowienia, łajzo!","GENIE manda lembranças, seu lixo!",,"GENIE își transmite condoleanțele, ticălosule!","Наилучшие пожелания от ДЖИННа, ублюдок!",,"GENIE skickar sina bästa hälsningar, skitstövel!","GENIE selamlarını yolladı, pislik!" +"Hmm. So much for being a hero, Hacker.",QUITMSG8,,,,"Hmm. To by bylo pro hrdinství, Hackeře.","Hmm. Så meget for at være en helt, Hacker.","Hmm. So viel zum Thema ""Held"", Hacker.",,"Ĥaa. Kia domaĝo, ke vi estas hero, Kodrompisto.","Hmm. Poco tienes de héroe, hacker.",,"Höh, se siitä sankarina olemisesta sitten, hakkeri.","Eh bien, on est pas vraiment un héros, hacker.",,"Hmm. Ennyit a hős karrieredről, hekker barátom.","Hmm. E io che pensavo fossi un eroe, Hacker.",うーん。英雄とはこの程度だったのか、ハッカー。,영웅이 될 그릇은 아닌 거 같군. 안 그래? 해커 형씨.,"Hmm. Tot zover de held, Hacker.","Hmm. Så mye for å være en helt, Hacker.","Hmm. Tak wiele by być bohaterem, Hakerze.","Hmm. Não é tão herói assim, pelo visto.",,"Hmm. Asta a fost cu eroismele, Hacker.","Хм-м. Вот тебе и герой, хакер!",,"Hmm. Så mycket för att vara en hjälte, Hacker.","Hmm. Kahraman olmak için çok fazla, Hacker." +What? You'd rather go back to the pen?,QUITMSG9,,,,Co? Radši by ses vrátil do basy?,Hvad? Vil du hellere gå tilbage til fængslet?,Was? Du willst in den Knast zurück?,,"Kio? Ĉu vi preferas, ke vi revenu al la plumon?",¿Qué? ¿Prefieres volver al corral?,,Täh? Menisit mieluummin takaisin kynän ääreen?,Quoi? Tu préfère retourner dans ta cellule?,,Hogy micsoda? inkább visszamennél a tolladhoz?,Cosa? Vuoi tornare in prigione?,何? 今更ペンで計算するのか?,펜이나 끄적거리는 인생으로 돌아가겠다. 이건가?,Wat? Ga je liever terug naar de pen?,Hva? Vil du heller tilbake til kasjotten?,Co? Wolisz wrócić do więzienia?,O quê? Prefere voltar pro xilindró?,,Ce? Vrei să te întorci la captivitate?,Что? Ты хочешь вернуться в неволю?,,Vad? Vill du hellre gå tillbaka till pennan?,Ne? Kalemine geri dönmeyi mi tercih ediyorsun? Shoulda taken the blue pill.,QUITMSG10,,,,Měl sis vzít modrou pilulku.,Du skulle have taget den blå pille.,Du hättest die blaue Pille nehmen sollen...,,"Vi estus devinta preni -la bluan pilolon.",Deberías haber tomado la pastilla azul.,,Olis pitäny ottaa sininen pilleri.,T'aurais du prendre la pilule bleue.,Inkább a kék pirulát kellett volna választanod.,Avresti dovuto prendere la pillola blu ...,青いピルを採るべきではなかったな。,넌 파란 알약을 골랐어야 했어.,Je had de blauwe pil moeten nemen.,Skulle tatt den blå pillen.,Trzeba było wziąć niebieską pigułkę.,Devia ter tomado a pílula azul.,,Trebuia să iei pastila albastră.,Надо было принять синюю таблетку.,,Du borde ha tagit det blå pillret.,Mavi hapı almalıydın. -The name of the game ain't Twitch n' Run!,QUITMSG11,,,,V názvu hry není napsané „uteč“!,"Spillets navn er ikke ""at flygte""!","Das Spiel heißt nicht ""wegrennen""!",,La nomo de la ludo ne estas Tiku kaj Kuru!,¡El nombre del juego no es Tirar a Correr!,,Pelin nimi ei oo Paniikkipako!,"Le jeu s'appelle pas ""Panique et cours!""",A játék neve nem Twitch n' Megfutamodás.,"Il gioco non significa ""scappare""!",ゲーム名は 萎え落ち小僧 じゃねえぞ!,"이봐, 이 게임은 때리고 도망가는 게임이 아니라고!",De naam van het spel is niet Twitch n' Run!,Navnet på spillet er ikke Twitch n' Run!,"Nazwą gry nie jest ""Drżyj i Uciekaj""!",O nome do jogo não é Trema nas Bases e Fuja!,,Numele jocului nu e Tremură și Ascunde-te!,Эта игра называется не «Дрожи и прячься»!,,"Spelet heter inte ""Twitch n' Run""!",Oyunun adı Twitch n' Run değil! -"No worries. Saving the world can wait, right?",QUITMSG12,,,,"Žádný problém. Záchrana světa může počkat, ne?","Det er ikke noget problem. At redde verden kan vente, ikke?","Also, die Welt zu retten kann warten, richtig?",,"Ne zorgu. Savi la mondon povas atendi, ĉu ne?","No te preocupes. Salvar el mundo puede esperar, ¿verdad?",,"Ei huolta; maailman pelastaminen voi odottaa, eikö niin?","Oh, pas de problème. Le monde peut attendre\nd'être sauvé, non?","Semmi pánik. A világmegmentés várhat, nemde?","Salvare il mondo può\naspettare, giusto?",気にはしない、世界を救うのは何時でも出来る、だろ?,걱정 말라고. 세상이 위험한데 급할 것 있나. 안 그래?,"Het redden van de wereld kan wachten, toch?","Slapp av. Å redde verden kan vente, ikke sant?","Bez obaw. Ratowanie świata może poczekać, prawda?","Sem problemas. O mundo pode esperar, não é mesmo?",,"Nicio problemă. Salvarea lumii poate aștepta, nu?","Не парься. Спасение мира подождёт, ведь так?",,"Det är ingen fara. Att rädda världen kan vänta, eller hur?","Endişelenme. Dünyayı kurtarmak bekleyebilir, değil mi?" -Guess it's time to make like the 'net and split!,QUITMSG13,,,,"Hádám, že je čas vypojit server!",Så er det vist på tide at gøre som nettet og smutte!,"Also ist es soweit, dass sich unsere Wege trennen.",,"Tempas, ke niaj vojoj agu kiel la reto kaj dividu.",¡Supongo que es hora de cortar con esta mala conexión!,,Kai sitten on aika katkaista palvelinyhteydet!,Ca doit être temps de partir comme une mauvaise connection!,Kettéváglak mint a netsplit a kapcsolatot.,Quindi è il momento per i\nnostri modi di separarsi.,ネット切断している暇は無いだろ!,벌써 서버를 다운시키는 '척' 할 시간인가?,Denk dat het tijd is om het te maken als het 'net en splitsen!,Det er vel på tide å gjøre som nettet og stikke!,"Wygląda na to, że trzeba się rozłączyć jak netsplit!","Acho que tá na hora de cair, que nem uma conexão ruim.",,Cred că e timpul de separare!,"Кажется, настало время устроить netsplit!",,Det är nog dags att göra som nätet och dra sig ur!,Sanırım 'net gibi yapıp ayrılmanın zamanı geldi! -"Don't go off and forget about HacX, now!",QUITMSG14,,,,Ať tě nenapadne odejít a zapomenout na HacX!,Glem nu ikke HacX!,Bitte vergesse HacX nicht!,,Ne iru forgesi HacX nun!,¡Ahora no vayas y te olvides de Hacx!,,Älä nyt mene pois ja unohda HacX:ä!,Va pas oublier HacX maintenant!,"Ha elkalandozol, ne feletkezz meg a HacX-ről!","Non andartene e dimenticarti di HacX, ora!",HacXを忘れんじゃねえぞ、な!,부디 나가지 말고 HacX를 잊지 말아줘!,"Ga niet af en vergeet HacX niet, nu!","Ikke gå og glem HacX, nå!","Nie wyłączaj i nie zapominaj o HacX, teraz!","Não vai se esquecer do HacX, hein!",,Nu pleca și uita de HacX!,"Только посмей уйти и забыть про HacX, ты!",,Gå inte iväg och glömma HacX nu!,"HacX'i unutup gitme, şimdi!" -%o deleted %hself from the universe.,OB_SUICIDE,,,,%o se smazal@[ao_cs] z vesmíru.,%o slettede sig selv fra universet.,%o entfernte sich aus dem Universum.,,%o forigis sin el la universo.,%o se borró a si mism@[ao_esp] del universo.,,%o poisti itsensä maailmankaikkeudesta.,%o s'est effacé@[e_fr] de l'univers.,%o kitörölte magát az univerzumból,%o si è cancellato dall'universo.,%o はこの宇宙から消滅した。,%o 은(는) 자기 자신의 존재를 소멸시켰다.,%o verwijderd zichzelf uit het universum.,%o slettet seg selv fra universet.,%o usun@[irreg_2_pl] się ze świata.,%o se apagou deste universo.,,%o s-a sters pe sine din univers.,Игрок %o стёр себя с лица вселенной.,,%o raderade sig själv från universum.,%o kendini evrenden sildi. -%o formed a crater the size of Kansas.,OB_FALLING,,,,%o utvořil@[ao_cs] kráter velikosti Kansasu.,%o dannede et krater på størrelse med Kansas.,%o wurde zu einem Krater in der Größe von Kansas.,,%o formis krateron grandan kiel Kansaso.,%o formó un cráter del tamaño de Kansas.,,%o muodosti Kansasin kokoisen kraaterin.,%o a formé un cratère de la taille du Kansas.,%o egy Kansas méretű krátert hagyott maga után.,%o ha formato un cratere delle dimensioni del Kansas.,%o はカンザス州程のクレーターを生成した。,%o 은(는) 땅바닥에 캔자스만큼 커다란 구멍을 뚫었다.,%o vormde een krater ter grootte van Kansas.,%o dannet et krater på størrelse med Kansas.,%o utworzył@[ao_pl] krater wielkości Kansas.,%o abriu uma cratera do tamanho do Kansas.,,%o a format un crater de dimensiunile statului Kansas.,На месте падения игрока %o образовался кратер размером с Канзас.,,%o bildade en krater lika stor som Kansas.,%o Kansas büyüklüğünde bir krater oluşturdu. -%o became a human pancake.,OB_CRUSH,,,,%o se změnil@[ao_cs] v lidskou palačinku.,%o blev en menneskelig pandekage.,%o wurde zu einem menschlichen Pfannkuchen.,,%o Iĝis homa patkuko.,%o se convirtió en un crepe humano.,,%o tuli ihmispannukakun muotoiseksi.,%o est devenu@[e_fr] une crêpe.,%o palacsintává lapult,%o è diventato un pancake umano.,%o は人肉パンケーキになった。,%o 은(는) 인간 빈대떡이 되었다.,%o werd een menselijke pannenkoek.,%o ble en menneskelig pannekake.,%o stał@[ao_pl] się ludzkim plackiem.,%o virou uma panqueca humana.,,%o a devenit o clătită umană.,Игрока %o сплющило в лепешку.,,%o blev en mänsklig pannkaka.,%o insan bir krep oldu. -%o tried to jack out.,OB_EXIT,,,,%o se pokusil@[ao_cs] prchnout.,%o forsøgte at stikke af.,%o hat sich ausgeloggt.,,%o provis malkonektiĝi.,%o intentó desconectarse.,,%o yritti irrottaa piuhan.,%o a tenté de se déconnecter.,%o ki akarta húzni a kábelét,%o è uscito.,%o は逃げ出そうとした。,%o 은(는) 로그아웃하려고 시도했다.,%o probeerde zich terug te trekken.,%o prøvde å jekke seg ut.,%o chciał@[ao_pl] się wydostać.,%o tentou se desconectar.,,%o a încercat să o taie.,Игрок %o хотел улизнуть.,,%o försökte ta sig ut.,%o kaçmaya çalıştı. -%o swam like a brick.,OB_WATER,,,,%o uměl@[ao_cs] plavat jako cihla.,%o svømmede som en mursten.,%o schwamm wie ein Stein.,,%o naĝis kiel briko.,%o nadó como un ladrillo.,,%o ui kuin tiiliskivi.,%o nage comme une brique.,%o úgy úszik mint egy tégla.,%o nuotava come una pietra.,%o はカナヅチだった。,%o 은(는) 웹서핑을 못 하는 타입이었다.,%o zwom als een baksteen.,%o svømte som en murstein.,%o popłyn@[irreg_2_pl] jak cegła.,%o foi nadar como um tijolo.,,%o a înotat ca o cărămidă.,Игрок %o поплыл как топор.,,%o simmade som en tegelsten.,%o bir tuğla gibi yüzdü. -%o went nuclear.,OB_SLIME,,,,%o se rozpadl@[ao_cs] na atom.,%o blev nuklear.,%o wurde verstrahlt.,,%o iĝis nuklea,%o se volvió radioactiv@[ao_esp].,,%o kiinnostui ydinasioista.,%o s'est fait fissionner.,%o felrobbant mérgében.,%o è stato irradiato.,%o はニュークリアーと化した。,%o 은(는) 방사능 바람을 좀 쐬고 왔다.,%o werd nucleair.,%o ble nuklear.,%o został@[ao_pl] napromieniowan@[adj_pl].,%o ficou radioativ@[ao_ptb].,,%o a devenit radioactiv.,Игрок %o светится в темноте.,,%o blev kärnvapenfri.,%o nükleer oldu. -%o took a hot bath.,OB_LAVA,,,,%o si dal@[ao_cs] horkou koupel.,%o tog et varmt bad.,%o nahm ein heißes Bad.,,%o spertis varman banon.,%o tomó un baño caliente.,,%o otti kuuman kylvyn.,% prend un bain chaud.,%o vett egy forró fürdőt.,%o ha fatto un bagno caldo.,%o は熱湯風呂に浸かった。,%o 은(는) 시원하게 용암 일광욕을 즐겼다.,%o nam een warm bad.,%o tok et varmt bad.,%o wzi@[irreg_2_pl] gorącą kąpiel.,%o tomou um banho bem quente.,,%o a făcut o baie fierbinte.,Игрок %o принял горячую ванну.,,%o tog ett varmt bad.,%o sıcak bir banyo yaptı. -%o overdosed on nitro glycerine.,OB_BARREL,,,,%o se předávkoval@[ao_cs] nitroglycerinem.,%o fik en overdosis nitroglycerin.,%o nahm eine Überdosis Nitroglyzerin.,,%o trodozis nitroglicerinon.,%o tuvo una sobredosis de nitroglicerina.,,%o sai yliannostuksen nitroglyseriiniä.,%o a fait une overdose de nitroglycérine.,%o túladagolta a nitro-glicerint.,%o ha assunto un sovradosaggio di nitroglicerina.,%o はニトロを過剰摂取した。,%o 은(는) 니트로글리세린을 훅 가게 흡입했다.,%o overdosering op nitroglycerine.,%o tok en overdose nitroglyserin.,%o przedawkował@[ao_pl] nitroglicerynę.,%o teve overdose de nitroglicerina.,,%o a luat o supradoză de nitroglicerină.,Игрок %o перебрал нитроглицерина.,,%o tog en överdos av nitroglycerin.,%o aşırı dozda nitro gliserin aldı. -%o is flayed into tiny little pieces.,OB_SPLASH,,,,%o byl@[ao_cs] sedřen@[ao_cs] na kousíčky.,%o er flået i småstykker.,%o wurde zerkleinert.,,%o estas senhaŭtiga en malgrandetaj pecoj.,%o es despellejad@[ao_esp] en trocitos pequeños.,,%o silpoutui riekaleiksi.,%o s'est fait éparpiller en petits morceaux.,%o ripityára szakadt szét.,%o è stato schiacciato.,%o は細かい粒をぶち撒けられた。,%o 은(는) 작은 입자로 분해되었다.,%o wordt gevild in kleine stukjes.,%o er flådd i bittesmå biter.,%o został@[ao_pl] roztrzaskan@[adj_pl] na małe kawałeczki.,%o foi detonad@[ao_ptb] em vários pedacinhos.,,%o s-a spart în mii de bucățele.,Игрока %o разодрали на мелкие клочки.,,%o är flådd i pyttesmå bitar.,%o küçük parçalara ayrıldı. -%o wanted to see what %g looked like inside-out.,OB_R_SPLASH,,,,"%o chtěl@[ao_cs] vědět, jak vypadá zevnitř.","%o ville se, hvordan han så ud indefra.",%o wollte @[pp_de] Innereien sehen.,,"%o volis vidi, kiel %g aspektus kun la interno ekstere.",%o quería ver que pinta tenía por dentro.,,%o halusi nähdä itsensä nurinperin.,%o voulait voir comment ses organes fonctionnent.,%o meg akarta tudni %g hogy néz ki belülről.,%o voleva vedere le sue interiora.,%o は %g が裏返しになるのを望んだ。,%o 은(는) 인체의 신비를 감상했다.,%o wilde zien hoe %g er binnenstebuiten uitzag.,%o ville se hvordan han så ut på innsiden.,%o chciał@[ao_pl] zobaczyć jak %g wygląda od środka.,%o queria ver como são os orgãos internos de %g.,,%o a vrut să vadă cum arăta %g întors pe dos.,"Игрок %o хотел посмотреть, что у него внутри.",,%o ville se hur @[pro_sv] såg ut på insidan.,"%o, içinin dışının nasıl göründüğünü görmek istedi." -%o wanted to see what %g looked like inside-out.,OB_ROCKET,,,,"%o chtěl@[ao_cs] vědět, jak vypadá zevnitř.","%o ville se, hvordan han så ud indvfra.",%o wollte @[pp_de] Innereien sehen.,,"%o volis vidi, kiel %g aspektus kun la interno ekstere.",%o quería ver que pinta tenía por dentro.,,%o halusi nähdä itsensä nurinperin.,%o voulait voir comment ses organes fonctionnent.,%o meg akarta tudni %g hogy néz ki belülről.,%o voleva vedere le sue interiora.,%o は %g が裏返しになるのを望んだ。,%o 은(는) 퀀텀 여행을 즐겼다.,%o wilde zien hoe %g er binnenstebuiten uitzag.,%o ville se hvordan han så ut utenpå.,%o chciał@[ao_pl] zobaczyć jak %g wygląda od środka.,%o queria ver como são os orgãos internos de %g.,,%o a vrut să vadă cum arăta %g întors pe dos.,"Игрок %o хотел посмотреть, что у него внутри.",,%o ville se hur @[pro_sv] såg ut på insidan.,%o içten dışa nasıl göründüğünü görmek istedi. -%o deleted %hself from the universe.,OB_KILLEDSELF,,,,%o se smazal@[ao_cs] z vesmíru.,%o slettede sig selv fra universet.,%o entfernte sich aus dem Universum.,,%o forigis sin el la universo.,%o se borró a si mism@[ao_esp] del universo.,,%o poisti itsensä maailmankaikkeudesta.,%o s'est effacé@[e_fr] de l'univers.,%o kitörölte magát az univerzumból,%o si è cancellato dall'universo.,%o はこの宇宙から消滅した。,%o 은(는) 자기 자신을 해킹했다.,%o schrapte zichzelf uit het universum.,%o slettet seg selv fra universet.,%o usun@[irreg_2_pl] się ze świata.,%o se deletou deste universo.,,%o s-a șters pe sine din univers.,Игрок %o стёр себя с лица вселенной.,,%o raderade sig själv från universum.,%o kendini evrenden sildi. -%o is no longer the dominant species.,OB_THUG,,,,%o už není vládnoucím živočichem.,%o er ikke længere den dominerende art.,%o ist nicht länger die dominante Spezies.,,%o ne estas la supera specio plu.,%o ya no es la especie dominante.,,%o ei ole enää vallitsevaa lajia.,%o n'est plus l'espèce dominante.,Már nem %o a csúcsragadozó.,%o non è più la specie dominante.,%o はもはや優性種ではなくなった。,%o 은(는) 그들의 시다바리가 아니였다.,%o is niet langer de dominante soort.,%o er ikke lenger den dominerende arten.,%o nie jest już dominującym gatunkiem.,%o não é mais a espécie dominante.,,%o nu mai e specia dominantă.,Игрок %o больше не доминантная форма жизни.,,%o är inte längre den dominerande arten.,%o artık baskın tür değil. -%o plugged in to the wrong machine.,OB_ANDROID,,,,%o se zapojil@[ao_cs] ke špatnému stroji.,%o har tilsluttet sig den forkerte maskine.,%o verband sich mit der falschen Maschine.,,%o konektiĝis en la eraran maŝinon.,%o se enchufó en la máquina equivocada.,,%o kytkeytyi väärään koneeseen.,%o s'est branché@[e_fr] à la mauvaise machine.,%o a rossz gépet dugta be.,%o connesso alla macchina sbagliata.,%o は違うマシンに接続してしまった。,%o 은(는) 잘못된 기계를 작동시켰다.,%o aangesloten op de verkeerde machine.,%o koblet seg til feil maskin.,%o podłączył@[ao_pl] się do złej maszyny.,%o se conectou na máquina errada.,,%o s-a conectat la mașina greșită.,Игрока %o подключили не к тому заряднику.,,%o anslöt sig till fel maskin.,%o yanlış makineye bağlandı. -%o got %hself a monster of a cyber-jockey-derriere-kicking.,OB_MONSTRUCT,,,,%o dostal@[ao_cs] šíleně kybernakopáno.,%o fik sig et monster af et cyber-jockey-derriere-spark.,%o bekam einen monströsen Cyber-Arschtritt verpasst.,,%o ricevis monstran cybernetik-raydist-postaĵ-piedbaton.,%o se ganó la madre de todas las patadas en el culo.,,%o sai hirviömäisen kyberlöylytyksen.,%o s'est fait@[e_fr] botter le cul de manière monumentale.,%o segge meg lett rugdosva.,% o ho avuto un mostruoso calcio cibernetico mancato.,%o は己に サイバー-ジョッキー-デリエレ-キッキング を取り入れた。,%o 은(는) 저 괴물의 슈퍼-울트라-캡쑝-파워를 맛봤다.,%o kreeg een monsterlijke cybertrap in @[zijn_haar_nl] kont.,%o fikk seg et monster av en cyber-jockey-derriere-sparking.,%o dostał@[ao_pl] cyber-kopa w dupę.,%o levou um cibercoice monstruoso nas fuças.,,%o s-a făcut praf în stil cibernetic.,Игрок %o получил поджопника от кибердиджея.,,%o fick sig ett monster av en cyber-jockey-derriärspark.,%o kendine canavar gibi bir dayak attı. -%o got ICEd.,OB_ICE,,,,%o byl@[ao_cs] zmražen@[ao_cs] ICEm.,%o blev ICEd.,%o wurde verEISt.,,%o iĝis ICE-ita,%o fue ICEad@[ao_esp].,,%o raukkaa nyt varmaankin kICEmittää.,%o s'est fait@[e_fr] ICEr.,%o-t jégre tették.,% o è stato ghiacciato.,%o は冷えた。,%o 은(는) 지독하게 물어뜯겼다.,%o was IJS'd.,%o ble ICEd.,%o został@[ao_pl] zamrożon@[adj_pl].,%o foi peg@[ao_ptb] por um ICE. AI SE ferrou!,,%o a ÎNGHEȚat.,Игрок %o вляпался в ЛЁД.,,%o blev ICEd.,%o buzlandı. -%o feels a little buzzed.,OB_BUZZER,,,,%o dostal@[ao_cs] malou pecku.,%o føler sig lidt svimmel.,%o fühlt sich etwas gekitzelt.,,%o sentas sin iomete vibretita.,%o se siente algo zumbad@[ao_esp].,,%o raukan päässä hieman surisee.,%o sent le buzz.,%o-nak még mindig zúg a füle.,%o si sente solleticato un po '.,%o は少し賑やかになった。,%o 은(는) 짜릿하게 찔렸다.,%o voelt een beetje gezoemd.,%o føler seg litt beruset.,%o poczuł@[ao_pl] brzęczenie.,%o se sente meio chocad@[ao_ptb].,,%o se simte puțin șocat.,Игрок %o лёг спать в компании вертолётиков.,,%o känner sig lite uppslukad.,%o biraz kafayı bulmuş gibi hissediyor. -%o uncovers a rather shocking development.,OB_STEALTH,,,,%o odhalil@[ao_cs] šokující informace.,%o opdager en temmelig chokerende udvikling.,%o machte eine schockierende Entdeckung.,,%o malkovras tre ŝokantan aferon.,%o descubre algo bastante chocante.,,%o raukalle paljastuu sangen sähköistävä uutinen.,%o a fait une découverte choquante.,"%o rájön, hogy az áram nem játék.",%o ha fatto una scoperta scioccante.,%o はかなり衝撃的な開発を発見した。,%o 은(는) 비밀리에 만들어진 병기를 발견했다.,%o ontdekt een nogal schokkende ontwikkeling.,%o avdekker en ganske sjokkerende utvikling.,%o odkrywa coś szokującego.,%o descobre uma revelação chocante.,,%o dezvăluie o schimbare șocantă.,Игрока %o встретил довольно серьёзный поворот событий.,,%o upptäcker en ganska chockerande utveckling.,%o oldukça şok edici bir gelişmeyi ortaya çıkardı. -%o was erased from cyberspace.,OB_DMAN,,,,%o byl@[ao_cs] vymazán@[ao_cs] z kyberprostoru.,%o blev slettet fra cyberspace.,%o wurde aus dem Cyberspace gelöscht.,,%o estas viŝita el cyberspaco.,%o fue borrad@[ao_esp] del ciberespacio.,,%o poistettiin kyberavaruudesta.,%o s'est fait@[e_fr] effacer du cyberespace.,%o-t kitörölték a kibertérből.,%o è stato eliminato dal cyberspazio.,%o はサイバースペースに消去された。,%o 은(는) 영구차단을 당했다.,%o werd gewist uit cyberspace.,%o ble slettet fra cyberspace.,%o został@[ao_pl] usunięt@[adj_pl] z cyber przestrzeni.,%o foi deletad@[ao_ptb] do ciberespaço.,,%o a fost șters din spațiul cibernetic.,Игрока %o удалили из киберпространства.,,%o raderades från cyberrymden.,%o siber uzaydan silindi. -%o gave %hself a glass jaw.,OB_GLASS,,,,%o si přidělal@[ao_cs] skleněnou čelist.,%o gav sig selv en glaskæbe.,%o bekam ein Glaskinn.,,%o donis al si vitran makzelon.,%o se estampó contra un cristal.,,%o antoi itsellensä lasileuan.,%o s'est fait@[e_fr] vitrifier la figure.,%o állon vágta magát.,%o ha un mento di vetro.,%o は自身にグラスジョーを取り付けた。,%o 은(는) 유리창을 깨고 등장하는 액션 배우가 아니였다.,%o gaf zichzelf een glazen kaak.,%o ga seg selv en glasskjeve.,%o był@[ao_pl] zbyt delikatn@[adj_pl] ze szkłem.,%o tem um queixo de vidro.,,%o și-a făcut un maxilar de sticlă.,У игрока %o оказалась стеклянная челюсть.,,%o gav sig själv en glaskäke.,%o kendine cam çene taktı. -%o's life membership was terminated.,OB_MANIAC,,,,%o@[psn_cs] členství v klubu živých bylo přerušeno.,%os medlemskab på livstid blev opsagt.,%os Mitgliedschaft im Leben wurde beendet.,,La vivo-membrecon de %o estas finigita,%o tuvo su afiliación a la vida terminada.,,%o raukan elämänjäsenyys päätettiin.,L'abonnement à vie de %o est arrivé à sa fin.,%o elfelejtette befizetni az élők tagdíját.,L'appartenenza di %o alla vita è finita.,%o のメンバーシップ生活は終幕した。,%o 의 계정은 영원히 삭제되었다.,%o's levenslange lidmaatschap werd beëindigd.,%os livstidsmedlemskap ble avsluttet.,Członkowstwo %o w klubie żywych się skończyło.,%o não está mais afiliad@[ao_ptb] à vida.,,%o nu mai e membru al clubului celor vii.,Игрока %o исключили из клуба живых.,,%os medlemskap på livstid avslutades.,%o hayata veda etti. -%o died in some random method I cannot fathom.,OB_MANIACHIT,,,,"%o umřel@[ao_cs] nějakým způsobem, který ani nemůžu pochopit.","%o døde på en eller anden tilfældig måde, som jeg ikke kan gennemskue.",%o starb auf eine unvorstellbare Art und Weise.,,"%o mortis per iu malcerta maniero, kiun mi ne povas kompreni.",%o murió de alguna manera que no llego a comprender.,,"%o kuoli jollakin sattumanvaraisella tavalla, jota en voi käsittää.",%o est mort@[e_fr] d'une manière que je n'arrive même pas à décrire.,Ötletem since hogy halt meg %o.,%o è morto in un modo inimmaginabile.,%o は計算外の乱数で死んだ。,%o 은(는) 의미불명의 이유로 잠수를 타게 되었다.,%o stierf op een of andere willekeurige manier die ik me niet kan voorstellen.,%o døde på en eller annen tilfeldig måte jeg ikke fatter.,"%o zgin@[irreg_2_pl] pod wpływem metody, której nie mogę pojąć.",%o morreu de alguma forma aleatória que nem consigo imaginar.,,%o a murit într-un mod aleatoriu pe care nu mi-l pot închipui.,Игрок %o внезапно умер по непостижимой для меня причине.,,%o dog på något slumpmässigt sätt som jag inte kan förstå.,%o anlayamadığım rastgele bir yöntemle öldü. -%o was fried by a femme fatale freak.,OB_TERMIN,,,,%o byl@[ao_cs] usmažen@[ao_cs] šílenou femme fatale.,%o blev stegt af en femme fatale freak.,%o wurde von einem Femme-Fatale Freak gebraten.,,%o estis fritita de femme-fatale-groteskulo.,%o fue tostad@[ao_esp] por una femme fatale.,,%o joutui kohtalokkaan kimman kärtsäämäksi.,%o s'est fait@[e_fr] frire par une femme fatale.,%o-t lebombázta egy bomba nő.,% o è stato fritto da una femme fatale.,%o はファム ファタル フリークに揚げられた。,%o 은(는) 미인계에 발을 들였다.,%o werd gebakken door een femme fatale freak.,%o ble stekt av en femme fatale-freak.,%o został@[ao_pl] usmażon@[adj_pl] przez szaloną femme fatale.,%o foi fritad@[ao_ptb] por uma femme fatale psicótica.,,%o a fost prăjit de către o femme fatale psihopată.,Игрока %o поджарила чокнутая роковая женщина.,,%o stektes av en femme fatale-freak.,%o bir femme fatale ucubesi tarafından kızartıldı. -%o got a little close to the opposite sex.,OB_TERMINHIT,"This text is not gender neutral, obviously...",,,%o se moc přiblížil@[ao_cs] k opačnému pohlaví.,%o kom lidt tæt på det modsatte køn.,%o kam dem anderen Geschlecht zu nahe.,,%o iĝis iomete proksime al la mala sekso.,%o se acercó demasiado a la persona equivocada.,,%o meni hieman liian lähelle vastakkaista sukupuolta.,%o s'est trop rapproché@[e_fr] de la mauvaise personne.,%o túl közel került az ellenkező nemhez.,%o è arrivato troppo vicino all'altro sesso.,%o は少し異性に成り果てた。,%o 의 남자다운 자존심은 쪼그라들었다.,%o kwam een beetje in de buurt van het andere geslacht.,%o kom litt nær det motsatte kjønn.,%o pod@[irreg_1_pl] zbyt blisko do płci pięknej.,%o chegou perto demais do sexo oposto.,,%o s-a apropriat prea mult de sexul opus.,Игрок %o почти сблизился с противоположным полом.,,%o kom lite väl nära det motsatta könet.,%o karşı cinsle biraz yakınlaştı. -%o said goodbye to an old friend.,OB_REPLI,,,,%o řekl@[ao_cs] sbohem starému příteli.,%o sagde farvel til en gammel ven.,%o verabschiedete sich von einem alten Freund.,,"%o diris ""Ĝis la revido"" al malnova amiko.",%o se despidió de un viejo amigo.,,%o sanoi hyvästit vanhalle ystävälle.,%o dit au revoir à un vieil ami.,%o búcsút intett egy régi barátjának.,%o ha detto addio a un vecchio amico.,%o は古い友人に別れを告げた。,%o 은(는) 오랜 친구와 작별인사를 했다.,%o nam afscheid van een oude vriendin.,%o tok farvel med en gammel venn.,%o pożegnał@[ao_pl] się ze starym znajomym.,%o disse adeus a um velho amigo.,,%o a spus adio unui vechi prieten.,Игрок %o распрощался со старым другом.,,%o tog farväl av en gammal vän.,%o eski bir arkadaşına veda etti. -%o was stabbed in the back by an old friend.,OB_REPLIHIT,,,,%o byl@[ao_cs] bodnuta do zad starým přítelem.,%o blev stukket i ryggen af en gammel ven.,%o wurde von einem alten Freund in den Rücken gestochen.,,%o estis pikita en la dorson de malnova amiko.,%o fue apuñalad@[ao_esp] en la espalda por un viejo amigo.,,%o joutui vanhan ystävän selkäänpuukottamaksi.,%o s'est fait@[e_fr] planter une lame dans le dos par un vieil ami.,%o-t hátba szúrta egy régi barát.,%o è stato pugnalato alla schiena da un vecchio amico.,%o は古い友人に背中を刺された。,%o 은(는) 오랜 친구에게 배신을 당했다.,%o werd in de rug gestoken door een oude vriend.,%o ble dolket i ryggen av en gammel venn.,%o został@[ao_pl] dźgnięt@[adj_pl] w plecy przez starego znajomego.,%o foi apunhalad@[ao_ptb] pelas costas por um velho amigo.,,%o a fost înjunghiat pe la spate de către un vechi prieten.,Игрок %o получил нож в спину от старого друга.,,%o blev knivhuggen i ryggen av en gammal vän.,%o eski bir arkadaşı tarafından sırtından bıçaklandı. -%o was weeded out by natural selection.,OB_PHAGE,,,,%o byl@[ao_cs] vyčištěna přirozeným výběrem.,%o blev sorteret fra ved naturlig udvælgelse.,%o fiel der natürlichen Auslese zum Opfer.,,%o estis foriga de natura elektado.,%o fue eliminad@[ao_esp] por selección natural.,,%o joutui luonnonvalinnan kitkemäksi.,%o a été éliminé@[e_fr] par la sélection naturelle.,A természetes kiválasztás áldozata lett %o.,%o cadde vittima della selezione naturale.,%o は自然淘汰によって除草された。,%o 은(는) 약육강식을 지금까진 모르고 있었다.,%o werd door natuurlijke selectie weggehaald.,%o ble luket ut av naturlig seleksjon.,%o został@[ao_pl] przesian@[adj_pl] przez naturalną selekcję.,%o foi eliminad@[ao_ptb] por seleção natural.,,%o a fost eliminat prin selecție naturală.,Игрок %o был отсеян естественным отбором.,,%o blev utsorterad av det naturliga urvalet.,%o doğal seleksiyon tarafından ayıklandı. -%o couldn't escape a thorny death.,OB_THORN,,,,%o nemohl@[ao_cs] utéct bodlavé smrti.,%o kunne ikke undslippe en tornedød.,%o konnte einem dornigen Tod nicht entkommen.,,%o ne povis eskapi dornan morton.,%o no pudo escapar una muerte espinosa.,,%o ei kyennyt välttämään piikikästä kuolemaa.,%o n'a pu éviter une mort piquante.,Lyukasra szúrták %o-t a tövisek.,%o non poteva sfuggire a una morte spinosa.,%o は棘のある死から逃げられなかった。,%o 은(는) 따가운 죽음을 피할 수 없었다.,%o kon niet ontsnappen aan een netelige dood.,%o kunne ikke unnslippe en tornefull død.,%o nie m@[irreg_4_pl] uciec przed cierniową śmiercią.,%o não conseguiu escapar de uma morte espinhosa.,,%o nu a putut scăpa de o moarte spinoasă.,Игрока %o поджидала смерть на его тернистом пути.,,%o kunde inte undgå en taggig död.,%o dikenli bir ölümden kaçamadı. -%o took a sumo punch to the groin.,OB_SUMATIC,,,,%o dostal@[ao_cs] sumo ránu pod pás.,%o fik et sumo-slag i lysken.,%o bekam einen Sumo-Schlag an @[pp_de] empfindlichste Stelle.,,%o prenis sumoan baton en la ingveno.,%o recibió un puñetazo de sumo en la entrepierna.,,%o otti vastaan sumoiskun nivusiin.,%o s'est pris le poing d'un sumo dans l'entrejambe.,%o szerszámjával tompította az jobb horgot.,%o ha ricevuto un soffio su un punto sensibile.,%o は股座にスモウ ハリテを食らった。,%o 은(는) 가랑이 사이에 정권을 찔렀다.,%o nam een sumo punch in de lies.,%o fikk et sumoslag i skrittet.,%o dostał@[ao_pl] cios sumo w pachwinę.,%o tomou um golpe de sumô na virilha.,,%o a primit un pumn sumo în vintre.,Игрок %o отхватил удар в пах от сумоиста.,,%o tog emot ett sumoslag i ljumsken.,%o kasıklarına bir sumo yumruğu yedi. -%o didn't get %p three wishes.,OB_GENIE,,,,%o nedostal@[ao_cs] svá tři přání.,%o fik ikke sine tre ønsker.,%o bekam @[pp_de] drei Wünsche nicht erfüllt.,,%o ne ricevis siajn tri petojn.,%o no recibió sus tres deseos.,,%o ei saanut kolmea toivettaan.,%o n'a pas préparé ses trois vœux.,%o nem teljesítette %p 3 kívánságát.,%o non ha soddisfatto i suoi tre desideri.,%o は %p に三願を望まなかった。,%o 은(는) 세 가지 소원을 빌 수 없었다.,%o kreeg niet drie wensen.,%o fikk ikke oppfylt tre ønsker.,%o nie dostał@[ao_pl] swoich trzech życzeń.,%o não concedeu três desejos a %p.,,%o nu a putut să-și pună cele trei dorințe.,Игрок %o не загадает трёх желаний.,,%o fick inte sina tre önskningar uppfyllda.,%o üç dileğini yerine getiremedi. -%o tried to pet a mine.,OB_MINE,,,,%o se pokusil@[ao_cs] pohladit minu.,%o forsøgte at kæle for en mine.,"%o versuchte, eine Mine zu streicheln.",,%o provis glatumi minon.,%o intentó acariciar una mina.,,%o yritti silittää miinaa.,%o a essayé de caresser une mine.,%o meg akart simogatni egy aranyos aknát.,%o ha provato ad accarezzare una mina.,%o は地雷を愛撫しようとした。,%o 은(는) 기뢰와 친구가 되고 싶었다.,%o probeerde een mijn te aaien.,%o prøvde å klappe en mine.,%o próbował@[ao_pl] pogłaskać minę.,%o tentou fazer carinho numa mina.,,%o a încercat să mângâie o mină.,Игрок %o хотел погладить мину.,,%o försökte klappa en mina.,%o bir mayını sevmeye çalıştı. -%o took %k's Bruce Lee fu-kick to the face.,OB_MPKICK,,,,%o dostal@[ao_cs] kopanec do obličeje od kung-fuistou %k.,%o fik %ks Bruce Lee fu-kick i ansigtet.,%o bekam einen Bruce-Lee-Fußtritt ins Gesicht.,,%o ricevis la Bruce Lee piedbaton de %k en sia vizaĝo.,%o se comió una patada de kung-fu a lo Bruce Lee de %k.,,%k potkaisi %o raukkaa päin naamaa Bruce Leen kung fu-tyyliin.,%o s'est mangé@[e_fr] un coup de pied à la Bruce Lee de la part de %k.,%o arccal vette le %k pörgőrugását.,%o ha un calcio in faccia.,%o の顔に %k のブルースリーキックを当てた。,%o 은(는) %k 의 거침없는 하이킥을 받았다.,%o nam %k's Bruce Lee fu-kick in het gezicht.,%o tok %ks Bruce Lee fu-kick i ansiktet.,%o dostał@[ao_pl] kopniakiem w stylu Bruce'a Lee od %k.,%o tomou uma voadora de %k na cara.,,%o a primit un șut în stil Bruce Lee.,"Игрок %o отхватил от игрока %k удар в лицо, достойный Брюса Ли.",,%o tog emot %ks Bruce Lee fu-kick i ansiktet.,"%o, %k tarafından tekmelendi." -%o fell apart via %k's shocking revelation.,OB_MPREZNATOR,,,,%o se rozpadl@[ao_cs] šokujícím odhalením hráče %k.,%o faldt fra hinanden via %ks chokerende åbenbaring.,%o erhielt eine schockierende Enthüllung von %k.,,%o diseriĝis pro la ŝokantan revelaĉio de %k.,%o cayó ante la revelación chocante de %k.,,%o romahti käyttäjän %k sähköistävästä ilmestyksestä.,%o a été témoin de la révélation choquante de %k.,%k megrázó élmányben részesítette %o-t.,%o ricevette una scioccante rivelazione da %k.,%o は %k の衝撃的な啓示によりバラバラになった。,%o 은(는) %k 이(가) 선사한 전기 찜질을 맛봤다.,%o viel uit elkaar via %k's schokkende onthulling.,%o falt fra hverandre via %ks sjokkerende åpenbaring.,%o rozpadł@[ao_pl] się pod wpływem szokującego objawienia %k.,%o ficou arrasad@[ao_ptb] pela revelação chocante de %p.,,%o s-a făcut praf la revelația șocantă a lui %k.,Игрок %o шокирован откровениями %k.,,%o föll sönder genom %ks chockerande avslöjande.,"%o, %k tarafından kızartıldı." -%o took a double-dose of %k's punishment.,OB_MPXPISTOL,,,,%o dostal@[ao_cs] dvojitou dávku potrestání hráče %k.,%o fik en dobbeltdosis af %ks straf.,%o bekam eine doppelte Dosis von %ks Bestrafung.,,%o duoble dozis la puno de %k.,%o recibió una doble dosis del castigo de %k.,,%o otti tupla-annoksen käyttäjän %k kuritusta.,%o a mangé une double dose de la furie de %k.,%o ólom túladagolást kapott %k-tól.,%o ha ottenuto una doppia dose della punizione di %k.,%o は %k の懲罰を二度受けた。,%o 은(는) %k 의 2총신 사격을 받았다.,%o nam een dubbele dosis van %k's straf.,%o tok en dobbel dose av %ks straff.,%o dostał@[ao_pl] podwójną dawkę kary %k.,%o tomou uma dose dupla da punição de %k.,,%o a luat o doză dublă din pedeapsa lui %k.,Игрок %o принял двойную дозу возмездия от %k.,,%o fick en dubbel dos av %ks straff.,"%o, %k tarafından cezalandırıldı." -%o was shut down by %k's shock-stick.,OB_MPTAZER,,,,%o byl@[ao_cs] vypnut@[ao_cs] šokádou hráče %k.,%o blev lukket ned af %ks chok-stick.,%o wurde von %ks Schockstab ausgeschaltet.,,%o estis malŝaltita de la ŝokbateno de %k.,%o fue noquead@[ao_esp] por la vara eléctrica de %k.,,%o joutui käyttäjän %k sähkökepin sammuttamaksi.,%o s'est fait mettre K.O par le bâton électrique de %k.,"%o-t sokkolta a hír, hogy %k-t megölte.",%o è stato spento dalla bacchetta di %k.,%o は %k のショックスティックでシャットダウンした。,%o 은(는) %k 의 무력행사에 아예 포기했다.,%o werd uitgeschakeld door %k's schokstick.,%o ble stengt av %ks sjokkpinne.,%o został@[ao_pl] wyłączon@[adj_pl] przez szokującą pałkę %k.,%o foi desligado pelo espeto chocante de %k.,,%o a fost dezactivat de arma cu șocuri a lui %k.,Игрок %o выведен из строя электродубинкой %k.,,%o blev nedsläckt av %ks chockpinne.,"%o, %k tarafından kapatıldı." -%o got a face-full of %k's ice-cold wrath.,OB_MPCRYOGUN,,,,%o se zabořil@[ao_cs] do mrazivého hněvu hráče %k.,%o fik et ansigt fuld af %ks iskolde vrede.,%o bekam eine Ladung von %ks eiskaltem Zorn ins Gesicht.,,%o ricevis la glacie malvarman koleregon de %k.,%o recibió la ira gélida de %k en toda la cara.,,%o sai saamansa täyteen käyttäjän %k jääkylmää vihaa.,%o s'est fait congeler la figure par la colère glaciale de %k.,%k jégre tette %o-t,%o ha un carico di freddo gelido di %k in faccia.,%o は %k の冷めた表情で凍った。,%o 은(는) %k 덕분에 맛있게 냉동 보존되었다.,%o kreeg een gezicht vol met %k's ijskoude toorn.,%o fikk ansiktet fullt av %ks iskalde vrede.,%o dostał@[ao_pl] wielką dawkę mroźnego gniewu %k.,%o tomou um gelo de %k. ,,%o a simțit din plin furia rece a lui %k.,Игрок %o столкнулся с ледяной ненавистью %k.,,%o fick en ansiktsfyllning av %ks iskalla vrede.,"%o, %k tarafından donduruldu." -"%o was drilled full of holes by %k, gangsta-style.",OB_MPUZI,,,,%o byl@[ao_cs] prostřílen@[ao_cs] skrz na skrz gangsterem %k.,"%o blev boret fuld af huller af %k, på gangsta-stil.",%o wurde von %k im Gangsta-Stil perforiert.,,"%o estis borita truplena de %k, ganstere.","%o fue acribillad@[ao_esp] por %k, al estilo gangster.",,%k porasi %o raukan täyteen reikiä gangsta-tyyliin.,"%o s'est fait perforer dans tous les sens par %k, Gangsta style.",%o gengszter stílusban sajttá lyuggatta %k,%o è stato perforato da %k in stile gangsta.,%o はギャングの様な %k に蜂の巣にされた。,%o 은(는) %k 이(가) 선사한 갱스터 스타일 난사를 막지 못했다.,"%o werd vol gaten geboord met %k, in gangsta-stijl.","%o ble boret full av hull av %k, i gangsta-stil.",%o został@[ao_pl] podziurawion@[adj_pl] przez %k niczym gangster.,%o tomou pipoco de %k.,,%o a fost umplut de găuri în stil mafiot de către %k.,Игрок %o покрылся дырками после гангста-стрельбы игрока %k.,,"%o borrades full av hål av %k, på gangstermanér.","%o, %k tarafından gangsta tarzı delik deşik edildi." -%o ate %k's photon bomb.,OB_MPZOOKA,,,,%o sežral@[ao_cs] fotonovou bombu hráče %k.,%o spiste %ks fotobombe.,%o nahm %ks Photonenbombe.,,%o manĝis la fotonbombon de %k.,%o se comió la bomba de fotones de %k.,,%o söi käyttäjän %k fotonipommin.,%o a bouffé la bombe photonique de %k.,%o megette %k foton bombáját,%o ha preso la bomba fotonica di %k.,%o は %k のフォトンボムを食らった。,%o 은(는) %k 의 광자탄을 봤는데도 피하지 못했다.,%o at %o %k's fotonbom.,%o spiste %ks fotonbombe.,%o zjadł@[ao_pl] fotonową bombę %k.,%o engoliu a bomba de fótons de %k.,,%o a mâncat bomba fotonică a lui %k.,Игрок %o съел фотонную бомбу %k.,,%o åt upp %ks fotobomb.,"%o, %k tarafından atomize edildi." -%o was reduced to a neat pile of photons by %k.,OB_MPZ_SPLASH,,,,%o byl@[ao_cs] zredukován@[ao_cs] na hromádku fotonů hráčem %k.,%o blev reduceret til en ordentlig bunke fotoner af %k.,%o wurde von %k zu einem Haufen Photonen verarbeitet.,,%o estis reduktita en ordeman amason da fotonoj de %k.,%o fue reducid@[ao_esp] a una pila de fotones por %k.,,%k redusoi %o raukan sieväksi fotonipinoksi.,%o s'est fait@[e_fr] réduire en une jolie pile de photons par %k.,%o-ból csak egy marokni fotont hagyott hátra %k,%o è stato elaborato da %k in un mucchio di fotoni.,%o は %k によって蛍光灯にされた。,%o 은(는) %k 의 광자력을 탐냈다. 죽기 전까지는.,%o werd gereduceerd tot een nette stapel fotonen met %k.,%o ble redusert til en pen haug med fotoner av %k.,%o został@[ao_pl] zredukowan@[adj_pl] do maleńkiej kupki fotonów przez %k.,%o foi reduzido à uma bela pilha de fótons por %k.,,%o a fost transformat într-o grămadă simpatică de fotoni de către %k.,Игрок %o был разложен игроком %k в аккуратную кучку фотонов.,,%o reducerades till en prydlig hög fotoner av %k.,"%o, %k tarafından düzgün bir foton yığınına indirgendi." -%o was reduced to antimatter by %k.,OB_MPANTIGUN,"Physically this is utter nonsense, of course.",,,%o byl@[ao_cs] zredukován@[ao_cs] na antihmotu hráčem %k.,%o blev reduceret til antimaterie af %k.,%o wurde von %k zu Antimaterie reduziert.,,%o estis reduktita en antimaterion de %k.,%o fue reducid@[ao_esp] a antimateria por %k.,,%k redusoi %o raukan antimateriaksi..,%o s'est fait inverser les atomes par %k.,%k antianyaggá lőttte %o-t,%o è stato ridotto all'antimateria da %k,%o は %k のにより反物質に変換された。,%o 은(는) %k 의 반물질의 힘에 의해 소멸되었다.,%o werd gereduceerd tot antimaterie met %k.,%o ble redusert til antimaterie av %k.,%o został@[ao_pl] zredukowan@[adj_pl] do antymaterii przez %k.,%o foi transformado em antimatéria por %k.,,%o a fost transformat în antimaterie de către %k.,Игрок %o был разложен игроком %k до антиматерии.,,%o reducerades till antimateria av %k.,"%o, %k tarafından atomlara indirgendi." -%o swallowed %k's nuke.,OB_MPNUKE,,,,%o spolkl@[ao_cs] atomovku hráče %k.,%o slugte %ks atombombe.,%o verschluckte sich an %ks Atomrakete.,,%o glutis la nuklean bombon de %k.,%o se tragó la bomba atómica de %k.,,%o nieli käyttäjän %k ydinpommin.,%o s'est pris@[e_fr] la bombe thermonucléaire de %k dans la figure.,%o megette %k atombomáját,%o soffocò sul missile nucleare di %k.,%o は %k の核を飲み干した。,%o 은(는) %k 덕분에 하늘을 뚫을 버섯구름이 되었다.,%o geslikt %o nuke %k's nuke.,%o svelget %ks atombombe.,%o połkn@[irreg_2_pl] atomówkę %k.,%o engoliu o míssil núclear de %k.,,%o a înghițit proiectilul lui %k.,Игрок %o проглотил ядерный заряд %k.,,%o svalde %ks atombomb.,"%o, %k tarafından bombalandı." -%o went nuclear from %k's mass destruction spree.,OB_MPNUKESPLASH,,,,%o si zkrátil@[ao_cs] svůj poločas rozpadu při zabijačce hráče %k.,%o blev atomvåben af %ks masseødelæggelser.,%o wurde von %ks Massenzerstörungsaktion verstrahlt.,,%o iĝis nuklea pro la amasdetruado de %k.,%o se volvió radioactiv@[ao_esp] por la racha de destrucción masiva de %k.,,%o muuttui radioaktiiviseksi käyttäjän %k massatuhoputken takia.,%o s'est fait@[e_fr] irradier par la folie destructrice de %k.,%o felrobbant az idegtől amikor meglátta %k bombáját,%o fu irradiato dall'azione di distruzione di massa di %k.,%o は %k の虐殺ごっこの犠牲者になった。,%o 은(는) %k 의 핵실험에 참여했다.,%o werd nucleair van de massavernietigingswoede van %k's massavernietigingswoede.,%o ble nuklear av %ks masseødeleggelse.,%o został@[ao_pl] napromieniowan@[adj_pl] przez masową destrukcję %k.,%o virou picadinho radioativo por causa da destruição em massa causada por %k.,,%o a devenit radioactiv în urma distrugerii în masă a lui %k.,Игрок %o светится в темноте от оружия массового поражения %k.,,%o blev kärnvapenfri av %ks massförstörelse.,"%o, %k tarafından bombalandı." -%o was turned inside-out by %k.,OB_MPTELEFRAG,,,,%o byl@[ao_cs] obrácen@[ao_cs] naruby hráčem %k.,%o blev vendt ud og ind af %k.,%o wurde von %k zerfetzt.,,La interno de %o estis eksteriga de %k.,%o fue puest@[ao_esp] del revés por %k.,,%k käänsi %o raukan nurinpäin.,%o s'est fait@[e_fr] inverser par %k.,%k kifordította %o-t,%o fu fatto a pezzi da %k,%o は %k に裏返しにされた。,%o 은(는) %k 에 의해 자신이 분해되는 꼴을 못 봤다.,%o werd binnenstebuiten gekeerd met %k.,%o ble snudd på hodet av %k.,%o został@[ao_pl] wywrócon@[adj_pl] na lewą stronę przez %k.,%o foi virad@[ao_ptb] ao avesso por %k.,,%o a fost întors pe dos de către %k.,Игрок %o вывернут наизнанку игроком %k.,,%o vändes ut och in av %k.,"%o, %k tarafından parçalandı." -%o's atomic structure was split apart.,OB_MONTELEFRAG,,,,Struktura atomů hráče %o se rozpadla.,%os atomstruktur blev splittet op.,%os Atomstruktur wurde vernichtet.,,La atoma strukturo de %o estis disfendita.,%o fue desintegrad@[ao_esp] al nivel atómico.,,%o raukan atomirakenne hajosi.,%o s'est fait@[e_fr] désassembler au niveau atomique.,%o atomjaira esett szét,La struttura atomica di %o fu distrutta.,%o の原子構造は分解された。,%o 의 원자 마디마디가 흩어졌다.,De atoomstructuur van %o werd gesplitst.,%o's atomstruktur ble splittet fra hverandre.,Atomy %o zostały od siebie oddzielone.,A estrutura atômica de %o foi separada.,,Structura atomică a lui %o a fost spulberată.,Атомная структура игрока %o разрушена.,,%os atomstruktur splittrades.,%o atomik düzeyde parçalara ayrıldı. -%o spontaneously expired.,OB_DEFAULT,,,,%o samovolně vypršel@[ao_cs].,%o udåndede spontant.,%o hörte spontan auf zu existieren.,,%o spontane finiĝis.,%o tuvo una muerte espontánea.,,%o spontaanisti kupsahti.,%o a spontanément expiré.,%o hirtelenjében elérte a lejárati időt,%o ha smesso spontaneamente di esistere.,%o の有効期限が自発的に切れた,%o 은(는) 파란만장하게 사라졌다.,%o is spontaan verlopen.,%o gikk spontant til grunne.,%o spontanicznie umarł@[ao_pl].,%o pereceu expontâneamente.,,%o a expirat în mod spontan.,Время игрока %o неожиданно вышло.,,%o dog spontant.,%o kendiliğinden öldü. -You grab a NUKER! Suck on this!,GOTNUKER,,,,Sebral@[ao_cs] jsi ATOMOVKÁTOR! Pojď na to!,Du tager en NUKER! Sut på den!,Ein NUKER! Verschluck dich daran.,,Vi prenis NUKER! Jen havu!,¡Has pillado un NUKER! ¡Chupaos esa!,¡Has recogido un NUKER! ¡Chúpate esa!,%Kahmaiset YDÄRIN! Ime tätä!,Vous découvrez le NUKER! Ca va en chier!,Meglelted a NUKER-t! Ezt kapd ki!,Prendi un NUKER! Succhia su questo!,NUEKR を奪った! 覚悟しろ!,누커 획득! 한바탕 쓸어볼까!,Je pakt een NUKER! Zuig hier maar aan!,Ta en NUKER! Sug på denne!,Podniosłeś ATOMÓWKĘ! Ssijcie to!,Você pegou um NUKER! Chupa essa manga!,,Ai ridicat Lansatorul Nuclear! Ia de-aici!,Заполучен ЯДЕРНЫЙ ГРАНАТОМЁТ! Отсосите!,,Du tar en NUKER! Sug på den här!,Sen bir NÜKER kap! Bunu em! -You got an UZI!!,GOTUZI,,,,Získal@[ao_cs] jsi UZI!,Du har en UZI!!,UZI genommen!,,Vi prenis UZI!!,¡¡Has obtenido una UZI!!,,Sait UZIn!!,Vous chopez un UZI!,Meglelted az UZI-t!,Hai un UZI !!,UZI をゲットした!!,우지 기관단총 획득!,Je hebt een UZI!!,Du har en UZI!,Zdobyłeś UZI!!,Você pegou uma UZI!!,,Ai ridicat un UZI!!,Заполучен УЗИ!!,,Du har en UZI!!,Bir UZI'n var! -A HOIG Reznator - FRY some butt,GOTREZNATOR,,,,HOIG Reznátor - pár jich upeč,En HOIG Reznator - Fritér noget røv,Ein HOIG Reznator.,,HOIG-Reznilo - FRITU pugon!,Un Reznator HOIG. ¡Hora de freir traseros!,,HOIG-reznaattori - KÄRISTÄ takamuksia,"Un Reznator HOIG, allez frire du monde!",Egy HOIG Reznator - okozz pár megrázó élményt,Un Reignator HOIG - friggere un po 'di carne,HOIGレジネイター - ぶっ潰してやれ,HOIG 전자무력기 획득! 전기 통구이를 만들자고!,Een HOIG Reznator - FRY sommige kont,En HOIG Reznator - FRY litt rumpe!,Reznator HOIG - skop trochę tyłków,Um Reznador HOIG - Hora de fritar,,Un Rezonator HOIG - Arde-i!,ХОЙГ Резнатор,,En HOIG Reznator - FRY några rumpor,Bir HOIG Reznator - Biraz kıç kızartın -You got a Photon 'Zooka!,GOTPHOTONZOOKA,,,,Sebral@[ao_cs] jsi Fotonovou bazuku!,Du har en Photon 'Zooka!,Photonen-'zooka genommen!,,Vi prenis Fotonbazukon!,¡Has obtenido un Bazooka de Fotones!,,Sait fotonisingon!,Vous récupérez un Bazooka Photonique!,Meglelted a Foton Ágyút!,Hai un cannone Photon!,フォトン'ゾーカ をゲットした!,광자 바주카 획득!,Je hebt een Photon 'Zooka!,Du har en Photon 'Zooka!,Zdobyłeś Fotonozukę!,Você pegou uma Bazuca de Fótons!,,Ai ridicat o Bazooka Fotonică!,Заполучена фотон-базука!,,Du har en Photon 'Zooka'!,Bir Foton 'Zooka'n var! -You carry a Big Stick!,GOTBIGSTICK,,,,Nosíš velkou bouchačku!,Du har en Big Stick!,Du trägst einen langen Stock.,,Vi portas grandan bastonon!,¡Llevas un Gran Palo!,,Kannat isoa keppiä!,Vous avez un gros bâton!,Nagy bottal jársz öcsém!,Porti un grosso bastone!,ビッグスティック を手に取った!,반물질 봉 획득!,Je draagt een Big Stick!,Du har en Big Stick!,Podnosisz Wielką Pałkę!,Você pegou um Grande Bastão!,,Ai ridicat un Băț Lung!,Заполучена длинная палка!,,Du har en stor käpp!,Büyük bir sopa taşıyorsun! -You got a Tazer!!,GOTTAZER,,,,Získal@[ao_cs] jsi tazer!,Du har en Tazer!!,Tazer genommen!,,Vi prenis Elektropafilon!!,¡¡Has obtenido un Taser!!,,Sait etälamauttimen!!,Vous trouvez un Taser!,Meglelted a Sokkolót!,Hai un Taser !!,テイザー をゲットした!,테이져 획득!,Je hebt een Tazer!!,Du har en Tazer!,Zdobyłeś Tazer!!,Você pegou um Tazer!!,,Ai ridicat un Taser!!,Заполучен тазер!,,Du har en Tazer!,Bir Tazer'ın var!! -You grab a Cryogun! FREEZE!,GOTCRYOGUN,,,,Sebral@[ao_cs] jsi krypušku! ANI SE NEHNI!,Du har en Cryogun! Frys!,Cryowaffe genommen! GEFRIER!,,Vi prenis Kriogenikpafilon! FROSTIĜU!,¡Has pillado un Criogenizador!! ¡Todos quietos!,¡Has recogido un Criogenizador!! ¡Quietos todos!,Kahmaiset kryopyssyn! PYSÄHDY!,Vous prenez un Cryogun! On s'arrête!,Felkapod a Cryogun-t! Induljon a fagyasztás!,Prendi un Cryogun! CONGELARE!,クライォガン を奪った! フリーズ!,크라이로건 획득! 그대로 멈춰라!,Je pakt een Cryogun! FREEZE!,Du har en Cryogun! FREEZE!,Podniosłeś Zamrażarkę! STAĆ!,Você pegou uma Cryogun! FICA FRIO AÍ!,,Ai ridicat o Crio-armă! ÎNGHEAȚĂ!,Заполучена замораживающая пушка! НИ С МЕСТА!,,Du har en Cryogun! FRIAS!,Bir Cryogun al! DONDUR! -You grab some rounds!,GOTROUNDS,,,,Sebral@[ao_cs] jsi nějaké náboje!,Du tager nogle patroner!,Munition genommen.,,Vi prenis kuglojn!,¡Has pillado unas balas!,¡Has recogido unas balas!,Kahmaiset patruunoita!,Vous prenez des balles!,Felkapsz pár lőszert!,Prendi delle munizioni!,幾つかのラウンド を奪った!,권총 탄약을 주웠다!,Je pakt wat rondes!,Du tar noen runder!,Podniosłeś trochę naboi!,Você pegou munição!,,Ai ridicat niște muniție!,Заполучена обойма патронов!,,Du tar några patroner!,Biraz mermi al! -You grab a case of rounds!,GOTROUNDSCASE,,,,Sebral@[ao_cs] jsi krabici nábojů!,Du tager en kasse med patroner!,Munitionskiste genommen.,,Vi prenis skatolon da kugloj!,¡Has pillado una caja de balas!,¡Has recogido una caja de balas!,Kahmaiset patruunalaatikon!,Vous prenez une bôite de balles!,Felkapsz egy doboz lőszert!,Prendi un caso di munizioni!,ケースのラウンド を奪った!,권총 탄약 상자를 주웠다!,Je pakt een kist met rondes!,Du tar en kasse med patroner!,Podniosłeś skrzynkę naboi!,Você pegou uma caixa de munição!,,Ai ridicat un cartuș de muniție!,Заполучена коробка патронов!,,Du tar en låda med patroner!,Bir kutu mermi al! -You grab a Torpedo!,GOTTORPEDO,"Was ""grap"" for some reason.",,,Sebral@[ao_cs] jsi torpédo!,Du tager en Torpedo!,Torpedo genommen.,,Vi prenis Torpedon!,¡Has pillado un torpedo!,¡Has recogido un torpedo!,Kahmaiset torpedon!,Vous prenez une torpille!,Felkapsz egy Torpedót!,Prendi un siluro!,トルペード を奪った!,광자탄을 주웠다!,Je pakt een Torpedo!,Du tar en Torpedo!,Podniosłeś Torpedę!,Você pegou um Torpedo!,,Ai ridicat o Torpilă!,Заполучена торпеда!,,Du tar en torped!,Bir Torpido al! -You grab a case of Torpedos!,GOTTORPEDOS,,,,Sebral@[ao_cs] jsi krabici torpéd!,Du tager en kasse med torpedoer!,Torpedokiste genommen.,,Vi prenis skatolon da Torpedoj!,¡Has pillado una caja de torpedos!,¡Has recogido una caja de torpedos!,Kahmaiset torpedolaatikon!,Vous prenez une bôite de torpilles!,Felkapsz egy doboz Torpedót!,Prendi un caso di siluri!,トルペードのケース を奪った!,광자탄 무더기를 주웠다!,Je pakt een kist Torpedo's!,Du tar en kasse med torpedoer!,Podniosłeś skrzynkę Torped!,Você pegou uma caixa de Torpedos!,,Ai ridicat o cutie de Torpile!,Заполучен ящик торпед!,,Du tar en låda med torpeder!,Bir kasa Torpido al! -You grab a molecule module!,GOTMOLECULES,,,,Sebral@[ao_cs] jsi molekulový modul!,Du tager et molekylmodul!,Molekülmodul genommen,,Vi prenis molekulmodulon!,¡Has pillado un módulo molecular!,¡Has recogido un módulo molecular!,Kahmaiset molekyylimoduulin!,Vous prenez un module moléculaire!,Felkapsz egy molekula modult!,Prendi un modulo molecolare!,モーレキュールモヂュール を奪った!,분자 모듈을 주웠다!,Je pakt een molecuulmodule!,Du tar en molekylmodul!,Podniosłeś molekularny moduł!,Você pegou um módulo molecular!,,Ai ridicat un modul molecular!,Заполучен молекулярный модуль!,,Du tar en molekylmodul!,Bir molekül modülü kap! -You grab a tank full of molecules!,GOTMOLECULESTANK,,,,Sebral@[ao_cs] jsi sud plný molekul!,Du tager en tank fuld af molekyler!,Tank mit Molekülmodulen genommen.,,Vi prenis reservujon da molekulojn!,¡Has pillado un tanque lleno de moléculas!,¡Has recogido un tanque lleno de moléculas!,Kahmaiset tankin täynnä molekyylejä!,Vous prenez un réservoir de molécules!,Felkapsz egy teli tank molekulát!,Prendi un serbatoio pieno di molecole!,タンク満タンのモーレキュール を奪った!,분자 탱크를 주웠다!,Je pakt een tank vol met moleculen!,Du tar en tank full av molekyler!,Podniosłeś zbiornik pełen molekuł!,Você pegou um tanque cheio de moléculas!,,Ai ridicat un rezervor plin cu molecule!,Заполучен контейнер с молекулами!,,Du tar en tank full av molekyler!,Moleküllerle dolu bir tank al! -You grab some Cartridges!,GOTCARTRIDGES,,,,Sebral@[ao_cs] jsi nějaké kazety!,Du tager nogle patroner!,Magazin genommen.,,Vi prenis iom da kartoĉoj!,¡Has pillado unos cartuchos!,¡Has recogido unos cartuchos!,Kahmaiset kasetteja!,Vous prenez des cartouches!,Felkapsz pár Töltényt!,Prendi alcune cartucce!,残弾のカートリッジ を奪った!,카트리지 한 줌을 주웠다!,Je pakt een paar patronen!,Du tar noen patroner!,Podniosłeś trochę pocisków!,Você pegou alguns Carregadores!,,Ai ridicat niște Cartușe!,Заполучены картриджи!,,Du tar några patroner!,Fişekleri al! -You grab a case of Cartridges!,GOTCARTRIDGESCASE,,,,Sebral@[ao_cs] jsi krabici kazet!,Du tager en kasse med patroner!,Magazinkiste genommen.,,Vi prenis skatolon da kartoĉoj!,¡Has pillado una caja de cartuchos!,¡Has recogido una caja de cartuchos!,Kahmaiset laatikollisen kasetteja!,Vous prenez une bôite de cartouches!,Felkapsz egy doboz Töltényt!,Prendi un caso di cartucce!,カートリッジケース を奪った!,카트리지 박스를 주웠다!,Je pakt een kist patronen!,Du tar en kasse med patroner!,Podniosłeś skrzynkę pocisków!,Você pegou uma caixa de Carregadores!,,Ai ridicat o cutie de Cartușe!,Заполучен ящик картриджей!,,Du tar en låda med patroner!,Bir kutu fişek al! -You grab a Valise stuffed with goods!,GOTVALISE,,,,Sebral@[ao_cs] jsi kufr plný munice!,Du tager en kuffert fyldt med varer!,Munitionstasche genommen.,,Vi prenis valizon plenan de municiojn!,¡Has pillado una maleta llena de equipamiento!,¡Has recogido una maleta llena de equipamiento!,Kahmaiset laukullisen täynnä tavaraa!,Vous récupérez une valise pleine d'équipement!,Felkapsz egy Poggyásznyi Muníciót!,Prendi una Valigia piena di merci!,代物を詰めたバリス を奪った!,탄약이 든 서류 가방을 주웠다!,Je pakt een Valise gevuld met goederen!,Du tar en koffert fylt med varer!,Podniosłeś Walizkę z wieloma dobrami!,Você pegou uma Mala cheia de equipamento!,,Ai ridicat o Valiză plină cu bunătăți!,Заполучена полная сумка боеприпасов!,,Du tar en valise fylld med varor!,İçi mal dolu bir valiz al! -Force Field!,GOTFORCEFIELD,,,,Silové pole!,Kraftfelt!,Kraftfeld!,,Fortkampo!,¡Campo de fuerza!,,Voimakenttä!,Champ de force!,Erőtér!,Campo di forza!,フォースフィールド!,방어막!,Krachtveld!,Kraftfelt!,Pole Siłowe!,Campo de Força!,,Câmp de Forță!,Силовое поле!,,Kraftfält!,Güç Alanı! -007Microtel,GOTMICROTEL,,,,,,,,007 Microtel!,Microtel 007,,,007 Microtel,,,007マイクロテル,007마이크로텔 근력 향상 칩!,,,,,,Microtel 007,Микрочип 007,,,007Microtel -You are EnK Blind!,GOTENKBLIND,,,,Jsi EnK-slep@[adj_cs]!,Du er EnK Blind!,Du bist EnK-blind!,,Vi estas ENK-Blinda,¡Tienes Ceguera EnK!,,Olet EnK-sokea!,Vous êtes aveugle à l'EnK!,EnK védett lettél!,Sei EnK-cieco!,EnKブラインドみてえだ!,EnK 투명 위장 장치!,Jij bent EnK Blind!,Du er EnK Blind!,Jesteś oślepiony przez EnK!,Você está vendado por EnK!,,Acum ești nedetectabil pentru Enk!,У тебя EnK-видимость!,,Du är EnK Blind!,Sen EnK Blind'sın! -Vulcan rubber Boots!,GOTRUBBERBOOTS,,,,Gumové boty!,Vulkaniske gummistøvler!,Gummistiefel!,,Vulkanaj Kauŭĉukaj Botoj!,¡Botas de goma vulcanizada!,,Vulkanoidut kumisaappaat!,Bottes en caoutchouc vulcanisé!,Vulkanizált gumi talp!,Stivali di gomma vulcanica!,バルカンラバーブーツ!,벌컨 방화 부츠!,Vulcan rubber Laarzen!,Vulcan gummistøvler!,Gumowe Buty Vulcan!,Botas Vulcanizadas!,,Bocanci din cauciuc Vulcan!,Резиновые сапоги!,,Vulkaniska gummistövlar!,Vulcan lastik botları! -SI Array mapping!,GOTSIARRAY,,,,Mapa pole SI!,SI Array kortlægning!,SI-Feld Karte!,,SI-matric-mapado!,¡Mapeado de Tabla SI!,,SI-kenttäkartta!,Carte du tableau SI!,SI pálya Felderítő!,Mappatura di array SI!,SIアーレイ マッピング!,Si 어레이 지도!,,SI Array kartlegging!,Mapa Pola SI!,Mapeamento por Campo de SI!,,Hartă SI compilată!,Составлена карта SI-массива!,,SI Array kartläggning!,SI Dizi eşlemesi! -Infrared Visor!,GOTINFRARED,,,,Infračervené brýle!,Infrarødt visir!,Infrarotbrille!,,Transruĝa Viziero!,¡Visor infrarrojo!,,Infrapunavisiiri!,Viseur infrarouge!,Infravörös Sisak!,Visore a infrarossi!,赤外線バイザー!,적외선 바이져!,Infrarood vizier!,Infrarødt visir!,Wizjer na Podczerwień!,Visor Infravermelho!,,Vedere Infraroșie!,Инфракрасный визор!,,Infrarött visir!,Kızılötesi Vizör! -"Breathe deep, Inhaler!",GOTINHALER,,,,"Pořádně se nadechni, inhalátor!","Træk vejret dybt, Inhalator!","Atme tief, Inhalierer!",,"Spiru profunde, inhalo!","¡Un inhalador, inspira fuerte!",,"Hengitä syvään, inhalaattori!","Respire, inhaleur!","Mély lélegzet, Inhaláló!","Respirare profondamente, inalatore!",深呼吸だ、インヘイラー!,각성제를 주웠다. 잘 들이마셔!,"Adem diep in, inhalator!","Pust dypt, Inhalator!",Weź głęboki wdech! Inhalator!,Inalador! Respira fundo!,,"Inspiră adânc, Inhalatorule!",Ингалятор! Вдыхай глубже!,,"Andas djupt, Inhalator!","Derin nefes al, Inhaler!" -A dose of Hydergine from a Hypo saves you!,GOTHYPONEED,,,,Jsi zachráněn@[ao_cs] dávkou Hyderginu z Hypa!,En dosis Hydergine fra en Hypo redder dig!,Eine Dosis Hydergine rettet dich!,,,¡Una dosis de Hydergina te salva la vida!,,Hyderginepiikkiannos pelastaa sinut!,Une bonne dose d'hydergine vous sauve la vie!,Egy adag Hydergine megmenti az irhád!,Una dose di Hydergine di un Hypo ti salva!,ハイポで ヒデルギン をキメた!,하이포의 하이데르진이 당신을 살렸다!,Een dosis Hydergine van een Hypo redt je!,En dose Hydergine fra en Hypo redder deg!,Dawka Hyderginy z Hypo ratuje cię!,Uma dose de hidergina do Hypo para te salvar!,,O doză de Hidrogine dintr-o seringă te salvează!,Доза Редергина из шприца спасла тебя!,,En dos Hydergine från en Hypo räddar dig!,Hypo'dan bir doz Hydergine seni kurtarır! -You grab a Hypo!,GOTHYPO,,,,Sebral@[ao_cs] jsi Hypo!,Du tager en Hypo!,Hypo!,,Vi prenis Injektilon!,¡Has pillado una jeringa hipodérmica!,,Kahmaiset piikin!,Vous prenez une seringue!,Felkapsz egy Hypo-t!,Prendi un Hypo!,ハイポ を奪った!,하이포를 주웠다!,Je pakt een Hypo!,Du tar en Hypo!,Podniosłeś Hypo!,Você pegou um Hypo!,,Ai ridicat o Seringă!,Заполучен шприц!,,Du tar en Hypo!,Bir Hypo kaptın! -You found a KeyCard!,GOTKEYCARD,,,,Nalezl@[ao_cs] jsi přístupovou kartu!,Du har fundet et Nøglekort!,Schlüsselkarte gefunden!,,Vi trovis Ŝlosilkarton!,¡Has encontrado una Tarjeta Llave!,,Löysit avainkortin!,Vous trouvez une clé magnétique!,Leltél egy Kulcskártyát!,Hai trovato una chiave magnetica!,キーカードを見つけた!,키 카드를 찾았다!,U heeft een sleutelkaart gevonden!,Du har funnet et nøkkelkort!,Znalazłeś Kartę Dostępu!,Você achou um Cartão de Passe!,,Ai găsit un Card-Cheie!,Найдена ключ-карта!,,Du hittade ett nyckelkort!,Bir Anahtar Kart buldun! -You found a C-Key!,GOTCKEY,,,,Nalezl@[ao_cs] jsi kyberklíč!,Du har fundet en C-nøgle!,C-Schlüssel gefunden!,,Vi trovis C-Ŝlosilon!,¡Has encontrado una Llave-C!,,Löysit C-avaimen!,Vous trouvez une C-Clé!,Leltél egy C-Kulcsot!,Hai trovato una chiave C!,C-keyを見つけた!,C-키를 찾았다!,Je hebt een C-sleutel gevonden!,Du har funnet en C-nøkkel!,Znalazłeś Klucz C!,Você achou uma Chave-C!,,Ai găsit o Cheie-C!,Найден C-образный ключ!,,Du hittade en C-nyckel!,Bir C-Anahtarı buldun! -You found a Password!,GOTPASSWORD,,,,Nalezl@[ao_cs] jsi heslo!,Du har fundet et kodeord!,Passwort gefunden!,,Vi trovis Pasvorton!,¡Has encontrado una Contraseña!,,Löysit salasanan!,Vous trouvez un mot de passe!,Leltél egy Jelszót!,Hai trovato una parola d'ordine!,パスワードを見つけた!,암호를 찾았다!,U heeft een wachtwoord gevonden!,Du har funnet et passord!,Znalazłeś Hasło!,Você achou uma Senha!,,Ai găsit o Parolă!,Найден пароль!,,Du hittade ett lösenord!,Bir Şifre buldun! -You found a blue Z-Key!,GOTBLUEZKEY,,,,Nalezl@[ao_cs] jsi modrý Z-klíč!,Du fandt en blå Z-nøgle!,Blauen Z-Schlüssel gefunden!,,Vi trovis bluan Z-ŝlosilon!,¡Has encontrado una Llave-Z azul!,,Löysit sinisen Z-avaimen!,Vous trouvez une Z-Clé bleue!,Leltél egy kék Z-Kulcsot!,Hai trovato una chiave Z blu!,ブルー Z-Key を見つけた!,청색 Z-키를 찾았다!,Je hebt een blauwe Z-sleutel gevonden!,Du har funnet en blå Z-nøkkel!,Znalazłeś niebieski Klucz Z!,Você achou uma Chave-Z azul!,,Ai găsit o Z-Cheie albastră!,Найден синий Z-образный ключ!,,Du hittade en blå Z-nyckel!,Mavi bir Z-Anahtarı buldun! -You found a yellow Z-Key!,GOTYELWZKEY,,,,Nalezl@[ao_cs] jsi žlutý Z-klíč!,Du fandt en gul Z-nøgle!,Gelben Z-Schlüssel gefunden!,,Vi trovis flavan Z-ŝlosilon!,¡Has encontrado una Llave-Z amarilla!,,Löysit keltaisen Z-avaimen!,Vous trouvez une Z-Clé jaune!,Leltél egy sárga Z-Kulcsot!,Hai trovato una chiave Z gialla!,イエローZ-Key を見つけた!,황색 Z-키를 찾았다!,Je hebt een gele Z-sleutel gevonden!,Du har funnet en gul Z-nøkkel!,Znalazłeś żółty Klucz Z!,Você achou uma Chave-Z amarela!,,Ai găsit o Z-Cheie galbenă!,Найден жёлтый Z-образный ключ!,,Du hittade en gul Z-nyckel!,Sarı bir Z-Anahtarı buldun! -You found a red Z-Key!,GOTREDZKEY,,,,Nalezl@[ao_cs] jsi červený Z-klíč!,Du fandt en rød Z-nøgle!,Roten Z-Schlüssel gefunden!,,Vi trovis ruĝan Z-ŝlosilon!,¡Has encontrado una Llave-Z roja!,,Löysit punaisen Z-avaimen!,Vous trouvez une Z-Clé rouge!,Leltél egy piros Z-Kulcsot!,Hai trovato una chiave Z rossa!,レッド Z-Key を見つけた!,적색 Z-키를 찾았다!,Je hebt een rode Z-sleutel gevonden!,Du har funnet en rød Z-nøkkel!,Znalazłeś czerwony Klucz Z!,Você achou uma Chave-Z vermelha!,,Ai găsit o Z-Cheie roșie!,Найден красный Z-образный ключ!,,Du hittade en röd Z-nyckel!,Kırmızı bir Z-Anahtarı buldun! -Body Armor!,GOTBODYARMOR,,,,Brnění!,Kropsrustning!,Körperpanzerung!,,Kiraso!,¡Armadura!,,Suojavarustus!,Armure!,Testpáncél!,Giubbotti antiproiettile!,ボディーアーマー!,강화복!,Kogelvrije vesten!,Skuddsikker vest!,Pancerz!,Colete a Prova de Balas!,,Armură de Corp!,Бронежилет!,,Kroppspansar!,Vücut Zırhı! -Centrophenoxine,GOTCENTROPHENOXINE,,,,Centrofenoxin,Centrophenoxine,,,Centrofenoksino!,¡Centrofenoxina!,,Sentrofenoksiinia,Centrophenoxine!,,,セントロフェノキシン!,메클로페녹세이트!,,Centrophenoxine,Centrofenoxina,Centrofenoxina,,Centrofenoxine,Центрофеноксин,,, -You grab a Kevlar vest!,GOTKEVLARVEST,,,,Sebral@[ao_cs] jsi kevlarovou vestu!,Du får fat i en kevlarvest!,Kevlarweste!,,Vi prenis kevlaran veŝton!,¡Has pillado un traje de Kevlar!,¡Has recogido un traje de Kevlar!,Kahmaiset Kevlar-liivit!,Veste en Kevlar!,Felkapsz egy Golyóálló Mellényt!,Prendi una maglia di kevlar!,ケブラーベスト を奪った!,방탄복을 주웠다!,Pak een Kevlar vest!,Du tar en Kevlar-vest!,Podniosłeś kamizelkę kuloodporną!,Você pegou um Colete de Kevlar!,,Ai ridicat o vestă din Kevlar!,Заполучен кевларовый жилет!,,Du tar en kevlarväst!,Kevlar yeleği al! -You grab Super Kevlar vest!,GOTSKEVLARVEST,,,,Sebral@[ao_cs] jsi superkevlarovou vestu!,Du tager Super Kevlar vest!,Super-Kevlarweste!,,Vi prenis superan kevlaran veŝton!,¡Has pillado un supertraje de Kevlar!,¡Has recogido un supertraje de Kevlar!,Kahmaiset Superkevlar-liivit!,Super Veste en Kevlar!,Felkapsz egy Szuper Golyóálló Mellényt!,Prendi una maglia super kevlar!,スーパーケブラーベスト を奪った!,중 방탄복을 주웠다!,Je pakt een Super Kevlar vest!,Du tar en Super Kevlar vest!,Podniosłeś superkamizelkę kuloodporną!,Você pegou um Super Colete de Kevlar!,,Ai ridicat o Super Vestă din Kevlar!,Заполучен усиленный кевларовый жилет!,,Du tar tag i Super Kevlar väst!,Süper Kevlar yeleği al! -You grab a MicroKit!,GOTMICROKIT,,,,Sebral@[ao_cs] jsi mikrosadu!,Du får fat i et MicroKit!,MicroKit genommen!,,Vi prenis Kompleteton!,¡Has pillado un MicroKit!,¡Has recogido un MicroKit!,Kahmaiset Microkitin!,Microkit!,Felkapsz egy Mikorkit-et!,Prendi un MicroKit!,マイクロキット を奪った!,마이크로킷을 주웠다!,Je pakt een MicroKit!,Du tar en MicroKit!,Podniosłeś MikroZestaw!,Você pegou um MicroKit!,,Ai ridicat un MicroKit!,Заполучена мини-аптечка!,,Du tar en MicroKit!,Bir MicroKit al! -You grab a Dampener!,GOTDAMPENER,,,,Sebral@[ao_cs] jsi tlumič!,Du får fat i en Dampener!,Dämpfer genommen!,,Vi prenis Dampilon!,¡Has pillado un Amortiguador!,¡Has recogido un Amortiguador!,Kahmaiset vaimentimen!,Amortisseur!,Felkapsz egy Tompítót!,Prendi un antivento!,ダンプナー を奪った!,완충 장치를 주웠다!,Je pakt een Demper!,Du tar en Dampener!,Podniosłeś Tłumik!,Você pegou um Amortecedor!,,Ai ridicat un Amortizor!,Заполучен глушитель!,,Du tar en Dämpare!,Bir Sönümleyici al! -You need a C-Key to access this item!,PD_CKEY,,,,K přístupu potřebuješ kyberklíč!,Du skal bruge en C-nøgle for at få adgang til dette objekt!,Du brauchst einen C-Schlüssel um das hier zu bedienen.,,Vi bezonas C-ŝlosilon por aliri ĉi tiun objekton!,¡Necesitas una Llave-C para acceder a este objeto!,,Tarvitset C-avaimen saadaksesi pääsyn tähän kohteeseen!,Il vous faut une C-Clé pour accéder à cet objet!,Egy C-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave C per accedere a questo oggetto!,アクセスには C-key が必要だ!,C-키가 있어야 작동이 가능하다!,Je hebt een C-sleutel nodig om toegang te krijgen tot dit item!,Du trenger en C-nøkkel for å få tilgang til dette elementet!,Potrzebujesz Klucza C by uruchomić ten przedmiot.,Você precisa de uma Chave-C para acessar!,,Ai nevoie de o Cheie-C pentru a accesa acest obiect!,"Нет доступа, нужен C-образный ключ!",,Du behöver en C-nyckel för att få tillgång till detta objekt!,Bu eşyaya erişmek için bir C-Anahtarına ihtiyacın var! -You need a KeyCard to access this item!,PD_KEYCARD,,,,K přístupu potřebuješ přístupovou kartu!,Du skal bruge et Nøglekort for at få adgang til dette objekt!,Du brauchst eine Schlüsselkarte um das hier zu bedienen.,,Vi bezonas Slosilkarton por aliri ĉi tiun objekton!,¡Necesitas una Tarjeta Llave para acceder a este objeto!,,Tarvitset avainkortin saadaksesi pääsyn tähän kohteeseen!,Il vous faut une carte magnétique pour accéder à cet objet!,Egy kulcskártya szükséges a hozzáféréshez!,Hai bisogno di una chiave magnetica per accedere a questo oggetto!,アクセスには キーカード が必要だ!,키 카드가 있어야 작동이 가능하다!,U heeft een sleutelkaart nodig om toegang te krijgen tot dit item!,Du trenger et nøkkelkort for å få tilgang til dette elementet!,Potrzebujesz Karty Dostępu by uruchomić ten przedmiot!,Você precisa de uma Chave de Passe para acessar!,,Ai nevoie de un Card-Cheie pentru a accesa acest obiect!,"Нет доступа, нужен ключ-карта!",,Du behöver ett KeyCard för att komma åt det här objektet!,Bu öğeye erişmek için bir KeyCard'a ihtiyacınız var! -You need a Password to access this item!,PD_PASSWORD,,,,K přístupu potřebuješ heslo!,Du skal bruge et kodeord for at få adgang til dette objekt!,Du brauchst eine Passwort um das hier zu bedienen.,,Vi bezonas Pasvorton por aliri ĉi tiun objekton!,¡Necesitas una Contraseña para acceder a este objeto!,,Tarvitset salasanan saadaksesi pääsyn tähän kohteeseen!,Il vous faut un mot de passe pour accéder à cet objet!,Egy Jelszó szükséges a hozzáféréshez!,Hai bisogno di una parola d'ordine per accedere a questo oggetto!,アクセスには パスワード が必要だ!,암호를 입력해야 작동이 가능하다!,Je hebt een wachtwoord nodig om toegang te krijgen tot dit item!,Du trenger et passord for å få tilgang til dette elementet!,Potrzebujesz Hasła by uruchomić ten przedmiot!,Você precisa de uma Senha para acessar!,,Ai nevoie de Parolă pentru a accesa acest obiect!,"Нет доступа, нужен пароль!",,Du behöver ett lösenord för att få tillgång till detta objekt!,Bu öğeye erişmek için bir Şifreye ihtiyacınız var! -You need a Blue Z-Key to make this work,PD_BLUEZKEY,,,,Tohle bude fungovat jen s modrým Z-klíčem.,Du skal bruge en blå Z-nøgle for at få dette til at fungere!,Du brauchst einen blauen Z-Schlüssel um das hier zu bedienen.,,Vi bezonas Bluan Z-ŝlosilon por funkciigi ĉi tiun!,¡Necesitas una Llave-Z azul para hacer funcionar esto!,,Tarvitset sinisen Z-avaimen saadaksesi tämän toimimaan!,Il vous faut une Z-Clé bleue pour faire fonctionner cela.,Egy Kék Z-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave Z blu per accedere a questo oggetto!,アクセスには ブルーZ-key が必要だ!,청색 Z-키가 있어야 작동이 가능하다!,Je hebt een blauwe Z-sleutel nodig om dit te laten werken.,Du trenger en blå Z-nøkkel for å få dette til å fungere!,Potrzebujesz Niebieskiego Klucza Z by zadziałało!,Você precisa de uma Chave-Z azul para fazer isto funcionar!,,Ai nevoie de o Cheie-Z albastră pentru a face asta să funcționeze!,"Не работает, нужен синий Z-образный ключ!",,Du behöver en blå Z-nyckel för att få detta att fungera.,Bunu çalıştırmak için bir Mavi Z-Anahtarına ihtiyacınız var -You need a Red Z-Key to make this work!,PD_REDZKEY,,,,Tohle bude fungovat jen s červeným Z-klíčem.,Du skal bruge en rød Z-nøgle for at få dette til at fungere!,Du brauchst einen roten Z-Schlüssel um das hier zu bedienen.,,Vi bezonas Ruĝan Z-ŝlosilon por funkciigi ĉi tiun!,¡Necesitas una Llave-Z roja para hacer funcionar esto!,,Tarvitset punaisen Z-avaimen saadaksesi tämän toimimaan!,Il vous faut une Z-Clé rouge pour faire fonctionner cela.,Egy Piros Z-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave Z gialla per accedere a questo oggetto!,アクセスには レッドZ-key が必要だ!,적색 Z-키가 있어야 작동이 가능하다!,Je hebt een rode Z-sleutel nodig om dit te laten werken!,Du trenger en rød Z-nøkkel for å få dette til å fungere!,Potrzebujesz Czerwonego Klucza Z by zadziałało!,Você precisa de uma Chave-Z vermelha para fazer isto funcionar!,,Ai nevoie de o Cheie-Z roșie pentru a face asta să funcționeze!,"Не работает, нужен красный Z-образный ключ!",,Du behöver en röd Z-nyckel för att detta ska fungera!,Bunu çalıştırmak için Kırmızı Z-Anahtarına ihtiyacınız var! -You need a Yellow Z-Key to make this work!,PD_YELWZKEY,,,,Tohle bude fungovat jen se žlutým Z-klíčem.,Du skal bruge en gul Z-nøgle for at få dette til at fungere!,Du brauchst einen gelben Z-Schlüssel um das hier zu bedienen.,,Vi bezonas Flavan Z-ŝlosilon por funkciigi ĉi tiun!,¡Necesitas una Llave-Z amarilla para hacer funcionar esto!,,Tarvitset keltaisen Z-avaimen saadaksesi tämän toimimaan!,Il vous faut une Z-Clé jaune pour faire fonctionner cela.,Egy Sárga Z-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave Z rossa per accedere a questo oggetto!,アクセスには イエローZ-key が必要だ!,황색 Z-키가 있어야 작동이 가능하다!,Je hebt een gele Z-sleutel nodig om dit te laten werken!,Du trenger en gul Z-nøkkel for å få dette til å fungere!,Potrzebujesz Żółtego Klucza Z by zadziałało!,Você precisa de uma Chave-Z amarela para fazer isto funcionar!,,Ai nevoie de o Cheie-Z galbenă pentru a face asta să funcționeze!,"Не работает, нужен жёлтый Z-образный ключ!",,Du behöver en gul Z-nyckel för att detta ska fungera!,Bunu yapmak için Sarı Z-Anahtarına ihtiyacın var! +la bluan pilolon.",Deberías haber tomado la pastilla azul.,,Olis pitäny ottaa sininen pilleri.,T'aurais du prendre la pilule bleue.,,Inkább a kék pirulát kellett volna választanod.,Avresti dovuto prendere la pillola blu ...,青いピルを採るべきではなかったな。,넌 파란 알약을 골랐어야 했어.,Je had de blauwe pil moeten nemen.,Skulle tatt den blå pillen.,Trzeba było wziąć niebieską pigułkę.,Devia ter tomado a pílula azul.,,Trebuia să iei pastila albastră.,Надо было принять синюю таблетку.,,Du borde ha tagit det blå pillret.,Mavi hapı almalıydın. +The name of the game ain't Twitch n' Run!,QUITMSG11,,,,V názvu hry není napsané „uteč“!,"Spillets navn er ikke ""at flygte""!","Das Spiel heißt nicht ""wegrennen""!",,La nomo de la ludo ne estas Tiku kaj Kuru!,¡El nombre del juego no es Tirar a Correr!,,Pelin nimi ei oo Paniikkipako!,"Le jeu s'appelle pas ""Panique et cours!""",,A játék neve nem Twitch n' Megfutamodás.,"Il gioco non significa ""scappare""!",ゲーム名は 萎え落ち小僧 じゃねえぞ!,"이봐, 이 게임은 때리고 도망가는 게임이 아니라고!",De naam van het spel is niet Twitch n' Run!,Navnet på spillet er ikke Twitch n' Run!,"Nazwą gry nie jest ""Drżyj i Uciekaj""!",O nome do jogo não é Trema nas Bases e Fuja!,,Numele jocului nu e Tremură și Ascunde-te!,Эта игра называется не «Дрожи и прячься»!,,"Spelet heter inte ""Twitch n' Run""!",Oyunun adı Twitch n' Run değil! +"No worries. Saving the world can wait, right?",QUITMSG12,,,,"Žádný problém. Záchrana světa může počkat, ne?","Det er ikke noget problem. At redde verden kan vente, ikke?","Also, die Welt zu retten kann warten, richtig?",,"Ne zorgu. Savi la mondon povas atendi, ĉu ne?","No te preocupes. Salvar el mundo puede esperar, ¿verdad?",,"Ei huolta; maailman pelastaminen voi odottaa, eikö niin?","Oh, pas de problème. Le monde peut attendre\nd'être sauvé, non?",,"Semmi pánik. A világmegmentés várhat, nemde?","Salvare il mondo può\naspettare, giusto?",気にはしない、世界を救うのは何時でも出来る、だろ?,걱정 말라고. 세상이 위험한데 급할 것 있나. 안 그래?,"Het redden van de wereld kan wachten, toch?","Slapp av. Å redde verden kan vente, ikke sant?","Bez obaw. Ratowanie świata może poczekać, prawda?","Sem problemas. O mundo pode esperar, não é mesmo?",,"Nicio problemă. Salvarea lumii poate aștepta, nu?","Не парься. Спасение мира подождёт, ведь так?",,"Det är ingen fara. Att rädda världen kan vänta, eller hur?","Endişelenme. Dünyayı kurtarmak bekleyebilir, değil mi?" +Guess it's time to make like the 'net and split!,QUITMSG13,,,,"Hádám, že je čas vypojit server!",Så er det vist på tide at gøre som nettet og smutte!,"Also ist es soweit, dass sich unsere Wege trennen.",,"Tempas, ke niaj vojoj agu kiel la reto kaj dividu.",¡Supongo que es hora de cortar con esta mala conexión!,,Kai sitten on aika katkaista palvelinyhteydet!,Ca doit être temps de partir comme une mauvaise connection!,,Kettéváglak mint a netsplit a kapcsolatot.,Quindi è il momento per i\nnostri modi di separarsi.,ネット切断している暇は無いだろ!,벌써 서버를 다운시키는 '척' 할 시간인가?,Denk dat het tijd is om het te maken als het 'net en splitsen!,Det er vel på tide å gjøre som nettet og stikke!,"Wygląda na to, że trzeba się rozłączyć jak netsplit!","Acho que tá na hora de cair, que nem uma conexão ruim.",,Cred că e timpul de separare!,"Кажется, настало время устроить netsplit!",,Det är nog dags att göra som nätet och dra sig ur!,Sanırım 'net gibi yapıp ayrılmanın zamanı geldi! +"Don't go off and forget about HacX, now!",QUITMSG14,,,,Ať tě nenapadne odejít a zapomenout na HacX!,Glem nu ikke HacX!,Bitte vergesse HacX nicht!,,Ne iru forgesi HacX nun!,¡Ahora no vayas y te olvides de Hacx!,,Älä nyt mene pois ja unohda HacX:ä!,Va pas oublier HacX maintenant!,,"Ha elkalandozol, ne feletkezz meg a HacX-ről!","Non andartene e dimenticarti di HacX, ora!",HacXを忘れんじゃねえぞ、な!,부디 나가지 말고 HacX를 잊지 말아줘!,"Ga niet af en vergeet HacX niet, nu!","Ikke gå og glem HacX, nå!","Nie wyłączaj i nie zapominaj o HacX, teraz!","Não vai se esquecer do HacX, hein!",,Nu pleca și uita de HacX!,"Только посмей уйти и забыть про HacX, ты!",,Gå inte iväg och glömma HacX nu!,"HacX'i unutup gitme, şimdi!" +%o deleted %hself from the universe.,OB_SUICIDE,,,,%o se smazal@[ao_cs] z vesmíru.,%o slettede sig selv fra universet.,%o entfernte sich aus dem Universum.,,%o forigis sin el la universo.,%o se borró a si mism@[ao_esp] del universo.,,%o poisti itsensä maailmankaikkeudesta.,%o s'est effacé@[e_fr] de l'univers.,,%o kitörölte magát az univerzumból,%o si è cancellato dall'universo.,%o はこの宇宙から消滅した。,%o 은(는) 자기 자신의 존재를 소멸시켰다.,%o verwijderd zichzelf uit het universum.,%o slettet seg selv fra universet.,%o usun@[irreg_2_pl] się ze świata.,%o se apagou deste universo.,,%o s-a sters pe sine din univers.,Игрок %o стёр себя с лица вселенной.,,%o raderade sig själv från universum.,%o kendini evrenden sildi. +%o formed a crater the size of Kansas.,OB_FALLING,,,,%o utvořil@[ao_cs] kráter velikosti Kansasu.,%o dannede et krater på størrelse med Kansas.,%o wurde zu einem Krater in der Größe von Kansas.,,%o formis krateron grandan kiel Kansaso.,%o formó un cráter del tamaño de Kansas.,,%o muodosti Kansasin kokoisen kraaterin.,%o a formé un cratère de la taille du Kansas.,,%o egy Kansas méretű krátert hagyott maga után.,%o ha formato un cratere delle dimensioni del Kansas.,%o はカンザス州程のクレーターを生成した。,%o 은(는) 땅바닥에 캔자스만큼 커다란 구멍을 뚫었다.,%o vormde een krater ter grootte van Kansas.,%o dannet et krater på størrelse med Kansas.,%o utworzył@[ao_pl] krater wielkości Kansas.,%o abriu uma cratera do tamanho do Kansas.,,%o a format un crater de dimensiunile statului Kansas.,На месте падения игрока %o образовался кратер размером с Канзас.,,%o bildade en krater lika stor som Kansas.,%o Kansas büyüklüğünde bir krater oluşturdu. +%o became a human pancake.,OB_CRUSH,,,,%o se změnil@[ao_cs] v lidskou palačinku.,%o blev en menneskelig pandekage.,%o wurde zu einem menschlichen Pfannkuchen.,,%o Iĝis homa patkuko.,%o se convirtió en un crepe humano.,,%o tuli ihmispannukakun muotoiseksi.,%o est devenu@[e_fr] une crêpe.,,%o palacsintává lapult,%o è diventato un pancake umano.,%o は人肉パンケーキになった。,%o 은(는) 인간 빈대떡이 되었다.,%o werd een menselijke pannenkoek.,%o ble en menneskelig pannekake.,%o stał@[ao_pl] się ludzkim plackiem.,%o virou uma panqueca humana.,,%o a devenit o clătită umană.,Игрока %o сплющило в лепешку.,,%o blev en mänsklig pannkaka.,%o insan bir krep oldu. +%o tried to jack out.,OB_EXIT,,,,%o se pokusil@[ao_cs] prchnout.,%o forsøgte at stikke af.,%o hat sich ausgeloggt.,,%o provis malkonektiĝi.,%o intentó desconectarse.,,%o yritti irrottaa piuhan.,%o a tenté de se déconnecter.,,%o ki akarta húzni a kábelét,%o è uscito.,%o は逃げ出そうとした。,%o 은(는) 로그아웃하려고 시도했다.,%o probeerde zich terug te trekken.,%o prøvde å jekke seg ut.,%o chciał@[ao_pl] się wydostać.,%o tentou se desconectar.,,%o a încercat să o taie.,Игрок %o хотел улизнуть.,,%o försökte ta sig ut.,%o kaçmaya çalıştı. +%o swam like a brick.,OB_WATER,,,,%o uměl@[ao_cs] plavat jako cihla.,%o svømmede som en mursten.,%o schwamm wie ein Stein.,,%o naĝis kiel briko.,%o nadó como un ladrillo.,,%o ui kuin tiiliskivi.,%o nage comme une brique.,,%o úgy úszik mint egy tégla.,%o nuotava come una pietra.,%o はカナヅチだった。,%o 은(는) 웹서핑을 못 하는 타입이었다.,%o zwom als een baksteen.,%o svømte som en murstein.,%o popłyn@[irreg_2_pl] jak cegła.,%o foi nadar como um tijolo.,,%o a înotat ca o cărămidă.,Игрок %o поплыл как топор.,,%o simmade som en tegelsten.,%o bir tuğla gibi yüzdü. +%o went nuclear.,OB_SLIME,,,,%o se rozpadl@[ao_cs] na atom.,%o blev nuklear.,%o wurde verstrahlt.,,%o iĝis nuklea,%o se volvió radioactiv@[ao_esp].,,%o kiinnostui ydinasioista.,%o s'est fait fissionner.,,%o felrobbant mérgében.,%o è stato irradiato.,%o はニュークリアーと化した。,%o 은(는) 방사능 바람을 좀 쐬고 왔다.,%o werd nucleair.,%o ble nuklear.,%o został@[ao_pl] napromieniowan@[adj_pl].,%o ficou radioativ@[ao_ptb].,,%o a devenit radioactiv.,Игрок %o светится в темноте.,,%o blev kärnvapenfri.,%o nükleer oldu. +%o took a hot bath.,OB_LAVA,,,,%o si dal@[ao_cs] horkou koupel.,%o tog et varmt bad.,%o nahm ein heißes Bad.,,%o spertis varman banon.,%o tomó un baño caliente.,,%o otti kuuman kylvyn.,% prend un bain chaud.,,%o vett egy forró fürdőt.,%o ha fatto un bagno caldo.,%o は熱湯風呂に浸かった。,%o 은(는) 시원하게 용암 일광욕을 즐겼다.,%o nam een warm bad.,%o tok et varmt bad.,%o wzi@[irreg_2_pl] gorącą kąpiel.,%o tomou um banho bem quente.,,%o a făcut o baie fierbinte.,Игрок %o принял горячую ванну.,,%o tog ett varmt bad.,%o sıcak bir banyo yaptı. +%o overdosed on nitro glycerine.,OB_BARREL,,,,%o se předávkoval@[ao_cs] nitroglycerinem.,%o fik en overdosis nitroglycerin.,%o nahm eine Überdosis Nitroglyzerin.,,%o trodozis nitroglicerinon.,%o tuvo una sobredosis de nitroglicerina.,,%o sai yliannostuksen nitroglyseriiniä.,%o a fait une overdose de nitroglycérine.,,%o túladagolta a nitro-glicerint.,%o ha assunto un sovradosaggio di nitroglicerina.,%o はニトロを過剰摂取した。,%o 은(는) 니트로글리세린을 훅 가게 흡입했다.,%o overdosering op nitroglycerine.,%o tok en overdose nitroglyserin.,%o przedawkował@[ao_pl] nitroglicerynę.,%o teve overdose de nitroglicerina.,,%o a luat o supradoză de nitroglicerină.,Игрок %o перебрал нитроглицерина.,,%o tog en överdos av nitroglycerin.,%o aşırı dozda nitro gliserin aldı. +%o is flayed into tiny little pieces.,OB_SPLASH,,,,%o byl@[ao_cs] sedřen@[ao_cs] na kousíčky.,%o er flået i småstykker.,%o wurde zerkleinert.,,%o estas senhaŭtiga en malgrandetaj pecoj.,%o es despellejad@[ao_esp] en trocitos pequeños.,,%o silpoutui riekaleiksi.,%o s'est fait éparpiller en petits morceaux.,,%o ripityára szakadt szét.,%o è stato schiacciato.,%o は細かい粒をぶち撒けられた。,%o 은(는) 작은 입자로 분해되었다.,%o wordt gevild in kleine stukjes.,%o er flådd i bittesmå biter.,%o został@[ao_pl] roztrzaskan@[adj_pl] na małe kawałeczki.,%o foi detonad@[ao_ptb] em vários pedacinhos.,,%o s-a spart în mii de bucățele.,Игрока %o разодрали на мелкие клочки.,,%o är flådd i pyttesmå bitar.,%o küçük parçalara ayrıldı. +%o wanted to see what %g looked like inside-out.,OB_R_SPLASH,,,,"%o chtěl@[ao_cs] vědět, jak vypadá zevnitř.","%o ville se, hvordan han så ud indefra.",%o wollte @[pp_de] Innereien sehen.,,"%o volis vidi, kiel %g aspektus kun la interno ekstere.",%o quería ver que pinta tenía por dentro.,,%o halusi nähdä itsensä nurinperin.,%o voulait voir comment ses organes fonctionnent.,,%o meg akarta tudni %g hogy néz ki belülről.,%o voleva vedere le sue interiora.,%o は %g が裏返しになるのを望んだ。,%o 은(는) 인체의 신비를 감상했다.,%o wilde zien hoe %g er binnenstebuiten uitzag.,%o ville se hvordan han så ut på innsiden.,%o chciał@[ao_pl] zobaczyć jak %g wygląda od środka.,%o queria ver como são os orgãos internos de %g.,,%o a vrut să vadă cum arăta %g întors pe dos.,"Игрок %o хотел посмотреть, что у него внутри.",,%o ville se hur @[pro_sv] såg ut på insidan.,"%o, içinin dışının nasıl göründüğünü görmek istedi." +%o wanted to see what %g looked like inside-out.,OB_ROCKET,,,,"%o chtěl@[ao_cs] vědět, jak vypadá zevnitř.","%o ville se, hvordan han så ud indvfra.",%o wollte @[pp_de] Innereien sehen.,,"%o volis vidi, kiel %g aspektus kun la interno ekstere.",%o quería ver que pinta tenía por dentro.,,%o halusi nähdä itsensä nurinperin.,%o voulait voir comment ses organes fonctionnent.,,%o meg akarta tudni %g hogy néz ki belülről.,%o voleva vedere le sue interiora.,%o は %g が裏返しになるのを望んだ。,%o 은(는) 퀀텀 여행을 즐겼다.,%o wilde zien hoe %g er binnenstebuiten uitzag.,%o ville se hvordan han så ut utenpå.,%o chciał@[ao_pl] zobaczyć jak %g wygląda od środka.,%o queria ver como são os orgãos internos de %g.,,%o a vrut să vadă cum arăta %g întors pe dos.,"Игрок %o хотел посмотреть, что у него внутри.",,%o ville se hur @[pro_sv] såg ut på insidan.,%o içten dışa nasıl göründüğünü görmek istedi. +%o deleted %hself from the universe.,OB_KILLEDSELF,,,,%o se smazal@[ao_cs] z vesmíru.,%o slettede sig selv fra universet.,%o entfernte sich aus dem Universum.,,%o forigis sin el la universo.,%o se borró a si mism@[ao_esp] del universo.,,%o poisti itsensä maailmankaikkeudesta.,%o s'est effacé@[e_fr] de l'univers.,,%o kitörölte magát az univerzumból,%o si è cancellato dall'universo.,%o はこの宇宙から消滅した。,%o 은(는) 자기 자신을 해킹했다.,%o schrapte zichzelf uit het universum.,%o slettet seg selv fra universet.,%o usun@[irreg_2_pl] się ze świata.,%o se deletou deste universo.,,%o s-a șters pe sine din univers.,Игрок %o стёр себя с лица вселенной.,,%o raderade sig själv från universum.,%o kendini evrenden sildi. +%o is no longer the dominant species.,OB_THUG,,,,%o už není vládnoucím živočichem.,%o er ikke længere den dominerende art.,%o ist nicht länger die dominante Spezies.,,%o ne estas la supera specio plu.,%o ya no es la especie dominante.,,%o ei ole enää vallitsevaa lajia.,%o n'est plus l'espèce dominante.,,Már nem %o a csúcsragadozó.,%o non è più la specie dominante.,%o はもはや優性種ではなくなった。,%o 은(는) 그들의 시다바리가 아니였다.,%o is niet langer de dominante soort.,%o er ikke lenger den dominerende arten.,%o nie jest już dominującym gatunkiem.,%o não é mais a espécie dominante.,,%o nu mai e specia dominantă.,Игрок %o больше не доминантная форма жизни.,,%o är inte längre den dominerande arten.,%o artık baskın tür değil. +%o plugged in to the wrong machine.,OB_ANDROID,,,,%o se zapojil@[ao_cs] ke špatnému stroji.,%o har tilsluttet sig den forkerte maskine.,%o verband sich mit der falschen Maschine.,,%o konektiĝis en la eraran maŝinon.,%o se enchufó en la máquina equivocada.,,%o kytkeytyi väärään koneeseen.,%o s'est branché@[e_fr] à la mauvaise machine.,,%o a rossz gépet dugta be.,%o connesso alla macchina sbagliata.,%o は違うマシンに接続してしまった。,%o 은(는) 잘못된 기계를 작동시켰다.,%o aangesloten op de verkeerde machine.,%o koblet seg til feil maskin.,%o podłączył@[ao_pl] się do złej maszyny.,%o se conectou na máquina errada.,,%o s-a conectat la mașina greșită.,Игрока %o подключили не к тому заряднику.,,%o anslöt sig till fel maskin.,%o yanlış makineye bağlandı. +%o got %hself a monster of a cyber-jockey-derriere-kicking.,OB_MONSTRUCT,,,,%o dostal@[ao_cs] šíleně kybernakopáno.,%o fik sig et monster af et cyber-jockey-derriere-spark.,%o bekam einen monströsen Cyber-Arschtritt verpasst.,,%o ricevis monstran cybernetik-raydist-postaĵ-piedbaton.,%o se ganó la madre de todas las patadas en el culo.,,%o sai hirviömäisen kyberlöylytyksen.,%o s'est fait@[e_fr] botter le cul de manière monumentale.,,%o segge meg lett rugdosva.,% o ho avuto un mostruoso calcio cibernetico mancato.,%o は己に サイバー-ジョッキー-デリエレ-キッキング を取り入れた。,%o 은(는) 저 괴물의 슈퍼-울트라-캡쑝-파워를 맛봤다.,%o kreeg een monsterlijke cybertrap in @[zijn_haar_nl] kont.,%o fikk seg et monster av en cyber-jockey-derriere-sparking.,%o dostał@[ao_pl] cyber-kopa w dupę.,%o levou um cibercoice monstruoso nas fuças.,,%o s-a făcut praf în stil cibernetic.,Игрок %o получил поджопника от кибердиджея.,,%o fick sig ett monster av en cyber-jockey-derriärspark.,%o kendine canavar gibi bir dayak attı. +%o got ICEd.,OB_ICE,,,,%o byl@[ao_cs] zmražen@[ao_cs] ICEm.,%o blev ICEd.,%o wurde verEISt.,,%o iĝis ICE-ita,%o fue ICEad@[ao_esp].,,%o raukkaa nyt varmaankin kICEmittää.,%o s'est fait@[e_fr] ICEr.,,%o-t jégre tették.,% o è stato ghiacciato.,%o は冷えた。,%o 은(는) 지독하게 물어뜯겼다.,%o was IJS'd.,%o ble ICEd.,%o został@[ao_pl] zamrożon@[adj_pl].,%o foi peg@[ao_ptb] por um ICE. AI SE ferrou!,,%o a ÎNGHEȚat.,Игрок %o вляпался в ЛЁД.,,%o blev ICEd.,%o buzlandı. +%o feels a little buzzed.,OB_BUZZER,,,,%o dostal@[ao_cs] malou pecku.,%o føler sig lidt svimmel.,%o fühlt sich etwas gekitzelt.,,%o sentas sin iomete vibretita.,%o se siente algo zumbad@[ao_esp].,,%o raukan päässä hieman surisee.,%o sent le buzz.,,%o-nak még mindig zúg a füle.,%o si sente solleticato un po '.,%o は少し賑やかになった。,%o 은(는) 짜릿하게 찔렸다.,%o voelt een beetje gezoemd.,%o føler seg litt beruset.,%o poczuł@[ao_pl] brzęczenie.,%o se sente meio chocad@[ao_ptb].,,%o se simte puțin șocat.,Игрок %o лёг спать в компании вертолётиков.,,%o känner sig lite uppslukad.,%o biraz kafayı bulmuş gibi hissediyor. +%o uncovers a rather shocking development.,OB_STEALTH,,,,%o odhalil@[ao_cs] šokující informace.,%o opdager en temmelig chokerende udvikling.,%o machte eine schockierende Entdeckung.,,%o malkovras tre ŝokantan aferon.,%o descubre algo bastante chocante.,,%o raukalle paljastuu sangen sähköistävä uutinen.,%o a fait une découverte choquante.,,"%o rájön, hogy az áram nem játék.",%o ha fatto una scoperta scioccante.,%o はかなり衝撃的な開発を発見した。,%o 은(는) 비밀리에 만들어진 병기를 발견했다.,%o ontdekt een nogal schokkende ontwikkeling.,%o avdekker en ganske sjokkerende utvikling.,%o odkrywa coś szokującego.,%o descobre uma revelação chocante.,,%o dezvăluie o schimbare șocantă.,Игрока %o встретил довольно серьёзный поворот событий.,,%o upptäcker en ganska chockerande utveckling.,%o oldukça şok edici bir gelişmeyi ortaya çıkardı. +%o was erased from cyberspace.,OB_DMAN,,,,%o byl@[ao_cs] vymazán@[ao_cs] z kyberprostoru.,%o blev slettet fra cyberspace.,%o wurde aus dem Cyberspace gelöscht.,,%o estas viŝita el cyberspaco.,%o fue borrad@[ao_esp] del ciberespacio.,,%o poistettiin kyberavaruudesta.,%o s'est fait@[e_fr] effacer du cyberespace.,,%o-t kitörölték a kibertérből.,%o è stato eliminato dal cyberspazio.,%o はサイバースペースに消去された。,%o 은(는) 영구차단을 당했다.,%o werd gewist uit cyberspace.,%o ble slettet fra cyberspace.,%o został@[ao_pl] usunięt@[adj_pl] z cyber przestrzeni.,%o foi deletad@[ao_ptb] do ciberespaço.,,%o a fost șters din spațiul cibernetic.,Игрока %o удалили из киберпространства.,,%o raderades från cyberrymden.,%o siber uzaydan silindi. +%o gave %hself a glass jaw.,OB_GLASS,,,,%o si přidělal@[ao_cs] skleněnou čelist.,%o gav sig selv en glaskæbe.,%o bekam ein Glaskinn.,,%o donis al si vitran makzelon.,%o se estampó contra un cristal.,,%o antoi itsellensä lasileuan.,%o s'est fait@[e_fr] vitrifier la figure.,,%o állon vágta magát.,%o ha un mento di vetro.,%o は自身にグラスジョーを取り付けた。,%o 은(는) 유리창을 깨고 등장하는 액션 배우가 아니였다.,%o gaf zichzelf een glazen kaak.,%o ga seg selv en glasskjeve.,%o był@[ao_pl] zbyt delikatn@[adj_pl] ze szkłem.,%o tem um queixo de vidro.,,%o și-a făcut un maxilar de sticlă.,У игрока %o оказалась стеклянная челюсть.,,%o gav sig själv en glaskäke.,%o kendine cam çene taktı. +%o's life membership was terminated.,OB_MANIAC,,,,%o@[psn_cs] členství v klubu živých bylo přerušeno.,%os medlemskab på livstid blev opsagt.,%os Mitgliedschaft im Leben wurde beendet.,,La vivo-membrecon de %o estas finigita,%o tuvo su afiliación a la vida terminada.,,%o raukan elämänjäsenyys päätettiin.,L'abonnement à vie de %o est arrivé à sa fin.,,%o elfelejtette befizetni az élők tagdíját.,L'appartenenza di %o alla vita è finita.,%o のメンバーシップ生活は終幕した。,%o 의 계정은 영원히 삭제되었다.,%o's levenslange lidmaatschap werd beëindigd.,%os livstidsmedlemskap ble avsluttet.,Członkowstwo %o w klubie żywych się skończyło.,%o não está mais afiliad@[ao_ptb] à vida.,,%o nu mai e membru al clubului celor vii.,Игрока %o исключили из клуба живых.,,%os medlemskap på livstid avslutades.,%o hayata veda etti. +%o died in some random method I cannot fathom.,OB_MANIACHIT,,,,"%o umřel@[ao_cs] nějakým způsobem, který ani nemůžu pochopit.","%o døde på en eller anden tilfældig måde, som jeg ikke kan gennemskue.",%o starb auf eine unvorstellbare Art und Weise.,,"%o mortis per iu malcerta maniero, kiun mi ne povas kompreni.",%o murió de alguna manera que no llego a comprender.,,"%o kuoli jollakin sattumanvaraisella tavalla, jota en voi käsittää.",%o est mort@[e_fr] d'une manière que je n'arrive même pas à décrire.,,Ötletem since hogy halt meg %o.,%o è morto in un modo inimmaginabile.,%o は計算外の乱数で死んだ。,%o 은(는) 의미불명의 이유로 잠수를 타게 되었다.,%o stierf op een of andere willekeurige manier die ik me niet kan voorstellen.,%o døde på en eller annen tilfeldig måte jeg ikke fatter.,"%o zgin@[irreg_2_pl] pod wpływem metody, której nie mogę pojąć.",%o morreu de alguma forma aleatória que nem consigo imaginar.,,%o a murit într-un mod aleatoriu pe care nu mi-l pot închipui.,Игрок %o внезапно умер по непостижимой для меня причине.,,%o dog på något slumpmässigt sätt som jag inte kan förstå.,%o anlayamadığım rastgele bir yöntemle öldü. +%o was fried by a femme fatale freak.,OB_TERMIN,,,,%o byl@[ao_cs] usmažen@[ao_cs] šílenou femme fatale.,%o blev stegt af en femme fatale freak.,%o wurde von einem Femme-Fatale Freak gebraten.,,%o estis fritita de femme-fatale-groteskulo.,%o fue tostad@[ao_esp] por una femme fatale.,,%o joutui kohtalokkaan kimman kärtsäämäksi.,%o s'est fait@[e_fr] frire par une femme fatale.,,%o-t lebombázta egy bomba nő.,% o è stato fritto da una femme fatale.,%o はファム ファタル フリークに揚げられた。,%o 은(는) 미인계에 발을 들였다.,%o werd gebakken door een femme fatale freak.,%o ble stekt av en femme fatale-freak.,%o został@[ao_pl] usmażon@[adj_pl] przez szaloną femme fatale.,%o foi fritad@[ao_ptb] por uma femme fatale psicótica.,,%o a fost prăjit de către o femme fatale psihopată.,Игрока %o поджарила чокнутая роковая женщина.,,%o stektes av en femme fatale-freak.,%o bir femme fatale ucubesi tarafından kızartıldı. +%o got a little close to the opposite sex.,OB_TERMINHIT,"This text is not gender neutral, obviously...",,,%o se moc přiblížil@[ao_cs] k opačnému pohlaví.,%o kom lidt tæt på det modsatte køn.,%o kam dem anderen Geschlecht zu nahe.,,%o iĝis iomete proksime al la mala sekso.,%o se acercó demasiado a la persona equivocada.,,%o meni hieman liian lähelle vastakkaista sukupuolta.,%o s'est trop rapproché@[e_fr] de la mauvaise personne.,,%o túl közel került az ellenkező nemhez.,%o è arrivato troppo vicino all'altro sesso.,%o は少し異性に成り果てた。,%o 의 남자다운 자존심은 쪼그라들었다.,%o kwam een beetje in de buurt van het andere geslacht.,%o kom litt nær det motsatte kjønn.,%o pod@[irreg_1_pl] zbyt blisko do płci pięknej.,%o chegou perto demais do sexo oposto.,,%o s-a apropriat prea mult de sexul opus.,Игрок %o почти сблизился с противоположным полом.,,%o kom lite väl nära det motsatta könet.,%o karşı cinsle biraz yakınlaştı. +%o said goodbye to an old friend.,OB_REPLI,,,,%o řekl@[ao_cs] sbohem starému příteli.,%o sagde farvel til en gammel ven.,%o verabschiedete sich von einem alten Freund.,,"%o diris ""Ĝis la revido"" al malnova amiko.",%o se despidió de un viejo amigo.,,%o sanoi hyvästit vanhalle ystävälle.,%o dit au revoir à un vieil ami.,,%o búcsút intett egy régi barátjának.,%o ha detto addio a un vecchio amico.,%o は古い友人に別れを告げた。,%o 은(는) 오랜 친구와 작별인사를 했다.,%o nam afscheid van een oude vriendin.,%o tok farvel med en gammel venn.,%o pożegnał@[ao_pl] się ze starym znajomym.,%o disse adeus a um velho amigo.,,%o a spus adio unui vechi prieten.,Игрок %o распрощался со старым другом.,,%o tog farväl av en gammal vän.,%o eski bir arkadaşına veda etti. +%o was stabbed in the back by an old friend.,OB_REPLIHIT,,,,%o byl@[ao_cs] bodnuta do zad starým přítelem.,%o blev stukket i ryggen af en gammel ven.,%o wurde von einem alten Freund in den Rücken gestochen.,,%o estis pikita en la dorson de malnova amiko.,%o fue apuñalad@[ao_esp] en la espalda por un viejo amigo.,,%o joutui vanhan ystävän selkäänpuukottamaksi.,%o s'est fait@[e_fr] planter une lame dans le dos par un vieil ami.,,%o-t hátba szúrta egy régi barát.,%o è stato pugnalato alla schiena da un vecchio amico.,%o は古い友人に背中を刺された。,%o 은(는) 오랜 친구에게 배신을 당했다.,%o werd in de rug gestoken door een oude vriend.,%o ble dolket i ryggen av en gammel venn.,%o został@[ao_pl] dźgnięt@[adj_pl] w plecy przez starego znajomego.,%o foi apunhalad@[ao_ptb] pelas costas por um velho amigo.,,%o a fost înjunghiat pe la spate de către un vechi prieten.,Игрок %o получил нож в спину от старого друга.,,%o blev knivhuggen i ryggen av en gammal vän.,%o eski bir arkadaşı tarafından sırtından bıçaklandı. +%o was weeded out by natural selection.,OB_PHAGE,,,,%o byl@[ao_cs] vyčištěna přirozeným výběrem.,%o blev sorteret fra ved naturlig udvælgelse.,%o fiel der natürlichen Auslese zum Opfer.,,%o estis foriga de natura elektado.,%o fue eliminad@[ao_esp] por selección natural.,,%o joutui luonnonvalinnan kitkemäksi.,%o a été éliminé@[e_fr] par la sélection naturelle.,,A természetes kiválasztás áldozata lett %o.,%o cadde vittima della selezione naturale.,%o は自然淘汰によって除草された。,%o 은(는) 약육강식을 지금까진 모르고 있었다.,%o werd door natuurlijke selectie weggehaald.,%o ble luket ut av naturlig seleksjon.,%o został@[ao_pl] przesian@[adj_pl] przez naturalną selekcję.,%o foi eliminad@[ao_ptb] por seleção natural.,,%o a fost eliminat prin selecție naturală.,Игрок %o был отсеян естественным отбором.,,%o blev utsorterad av det naturliga urvalet.,%o doğal seleksiyon tarafından ayıklandı. +%o couldn't escape a thorny death.,OB_THORN,,,,%o nemohl@[ao_cs] utéct bodlavé smrti.,%o kunne ikke undslippe en tornedød.,%o konnte einem dornigen Tod nicht entkommen.,,%o ne povis eskapi dornan morton.,%o no pudo escapar una muerte espinosa.,,%o ei kyennyt välttämään piikikästä kuolemaa.,%o n'a pu éviter une mort piquante.,,Lyukasra szúrták %o-t a tövisek.,%o non poteva sfuggire a una morte spinosa.,%o は棘のある死から逃げられなかった。,%o 은(는) 따가운 죽음을 피할 수 없었다.,%o kon niet ontsnappen aan een netelige dood.,%o kunne ikke unnslippe en tornefull død.,%o nie m@[irreg_4_pl] uciec przed cierniową śmiercią.,%o não conseguiu escapar de uma morte espinhosa.,,%o nu a putut scăpa de o moarte spinoasă.,Игрока %o поджидала смерть на его тернистом пути.,,%o kunde inte undgå en taggig död.,%o dikenli bir ölümden kaçamadı. +%o took a sumo punch to the groin.,OB_SUMATIC,,,,%o dostal@[ao_cs] sumo ránu pod pás.,%o fik et sumo-slag i lysken.,%o bekam einen Sumo-Schlag an @[pp_de] empfindlichste Stelle.,,%o prenis sumoan baton en la ingveno.,%o recibió un puñetazo de sumo en la entrepierna.,,%o otti vastaan sumoiskun nivusiin.,%o s'est pris le poing d'un sumo dans l'entrejambe.,,%o szerszámjával tompította az jobb horgot.,%o ha ricevuto un soffio su un punto sensibile.,%o は股座にスモウ ハリテを食らった。,%o 은(는) 가랑이 사이에 정권을 찔렀다.,%o nam een sumo punch in de lies.,%o fikk et sumoslag i skrittet.,%o dostał@[ao_pl] cios sumo w pachwinę.,%o tomou um golpe de sumô na virilha.,,%o a primit un pumn sumo în vintre.,Игрок %o отхватил удар в пах от сумоиста.,,%o tog emot ett sumoslag i ljumsken.,%o kasıklarına bir sumo yumruğu yedi. +%o didn't get %p three wishes.,OB_GENIE,,,,%o nedostal@[ao_cs] svá tři přání.,%o fik ikke sine tre ønsker.,%o bekam @[pp_de] drei Wünsche nicht erfüllt.,,%o ne ricevis siajn tri petojn.,%o no recibió sus tres deseos.,,%o ei saanut kolmea toivettaan.,%o n'a pas préparé ses trois vœux.,,%o nem teljesítette %p 3 kívánságát.,%o non ha soddisfatto i suoi tre desideri.,%o は %p に三願を望まなかった。,%o 은(는) 세 가지 소원을 빌 수 없었다.,%o kreeg niet drie wensen.,%o fikk ikke oppfylt tre ønsker.,%o nie dostał@[ao_pl] swoich trzech życzeń.,%o não concedeu três desejos a %p.,,%o nu a putut să-și pună cele trei dorințe.,Игрок %o не загадает трёх желаний.,,%o fick inte sina tre önskningar uppfyllda.,%o üç dileğini yerine getiremedi. +%o tried to pet a mine.,OB_MINE,,,,%o se pokusil@[ao_cs] pohladit minu.,%o forsøgte at kæle for en mine.,"%o versuchte, eine Mine zu streicheln.",,%o provis glatumi minon.,%o intentó acariciar una mina.,,%o yritti silittää miinaa.,%o a essayé de caresser une mine.,,%o meg akart simogatni egy aranyos aknát.,%o ha provato ad accarezzare una mina.,%o は地雷を愛撫しようとした。,%o 은(는) 기뢰와 친구가 되고 싶었다.,%o probeerde een mijn te aaien.,%o prøvde å klappe en mine.,%o próbował@[ao_pl] pogłaskać minę.,%o tentou fazer carinho numa mina.,,%o a încercat să mângâie o mină.,Игрок %o хотел погладить мину.,,%o försökte klappa en mina.,%o bir mayını sevmeye çalıştı. +%o took %k's Bruce Lee fu-kick to the face.,OB_MPKICK,,,,%o dostal@[ao_cs] kopanec do obličeje od kung-fuistou %k.,%o fik %ks Bruce Lee fu-kick i ansigtet.,%o bekam einen Bruce-Lee-Fußtritt ins Gesicht.,,%o ricevis la Bruce Lee piedbaton de %k en sia vizaĝo.,%o se comió una patada de kung-fu a lo Bruce Lee de %k.,,%k potkaisi %o raukkaa päin naamaa Bruce Leen kung fu-tyyliin.,%o s'est mangé@[e_fr] un coup de pied à la Bruce Lee de la part de %k.,,%o arccal vette le %k pörgőrugását.,%o ha un calcio in faccia.,%o の顔に %k のブルースリーキックを当てた。,%o 은(는) %k 의 거침없는 하이킥을 받았다.,%o nam %k's Bruce Lee fu-kick in het gezicht.,%o tok %ks Bruce Lee fu-kick i ansiktet.,%o dostał@[ao_pl] kopniakiem w stylu Bruce'a Lee od %k.,%o tomou uma voadora de %k na cara.,,%o a primit un șut în stil Bruce Lee.,"Игрок %o отхватил от игрока %k удар в лицо, достойный Брюса Ли.",,%o tog emot %ks Bruce Lee fu-kick i ansiktet.,"%o, %k tarafından tekmelendi." +%o fell apart via %k's shocking revelation.,OB_MPREZNATOR,,,,%o se rozpadl@[ao_cs] šokujícím odhalením hráče %k.,%o faldt fra hinanden via %ks chokerende åbenbaring.,%o erhielt eine schockierende Enthüllung von %k.,,%o diseriĝis pro la ŝokantan revelaĉio de %k.,%o cayó ante la revelación chocante de %k.,,%o romahti käyttäjän %k sähköistävästä ilmestyksestä.,%o a été témoin de la révélation choquante de %k.,,%k megrázó élmányben részesítette %o-t.,%o ricevette una scioccante rivelazione da %k.,%o は %k の衝撃的な啓示によりバラバラになった。,%o 은(는) %k 이(가) 선사한 전기 찜질을 맛봤다.,%o viel uit elkaar via %k's schokkende onthulling.,%o falt fra hverandre via %ks sjokkerende åpenbaring.,%o rozpadł@[ao_pl] się pod wpływem szokującego objawienia %k.,%o ficou arrasad@[ao_ptb] pela revelação chocante de %p.,,%o s-a făcut praf la revelația șocantă a lui %k.,Игрок %o шокирован откровениями %k.,,%o föll sönder genom %ks chockerande avslöjande.,"%o, %k tarafından kızartıldı." +%o took a double-dose of %k's punishment.,OB_MPXPISTOL,,,,%o dostal@[ao_cs] dvojitou dávku potrestání hráče %k.,%o fik en dobbeltdosis af %ks straf.,%o bekam eine doppelte Dosis von %ks Bestrafung.,,%o duoble dozis la puno de %k.,%o recibió una doble dosis del castigo de %k.,,%o otti tupla-annoksen käyttäjän %k kuritusta.,%o a mangé une double dose de la furie de %k.,,%o ólom túladagolást kapott %k-tól.,%o ha ottenuto una doppia dose della punizione di %k.,%o は %k の懲罰を二度受けた。,%o 은(는) %k 의 2총신 사격을 받았다.,%o nam een dubbele dosis van %k's straf.,%o tok en dobbel dose av %ks straff.,%o dostał@[ao_pl] podwójną dawkę kary %k.,%o tomou uma dose dupla da punição de %k.,,%o a luat o doză dublă din pedeapsa lui %k.,Игрок %o принял двойную дозу возмездия от %k.,,%o fick en dubbel dos av %ks straff.,"%o, %k tarafından cezalandırıldı." +%o was shut down by %k's shock-stick.,OB_MPTAZER,,,,%o byl@[ao_cs] vypnut@[ao_cs] šokádou hráče %k.,%o blev lukket ned af %ks chok-stick.,%o wurde von %ks Schockstab ausgeschaltet.,,%o estis malŝaltita de la ŝokbateno de %k.,%o fue noquead@[ao_esp] por la vara eléctrica de %k.,,%o joutui käyttäjän %k sähkökepin sammuttamaksi.,%o s'est fait mettre K.O par le bâton électrique de %k.,,"%o-t sokkolta a hír, hogy %k-t megölte.",%o è stato spento dalla bacchetta di %k.,%o は %k のショックスティックでシャットダウンした。,%o 은(는) %k 의 무력행사에 아예 포기했다.,%o werd uitgeschakeld door %k's schokstick.,%o ble stengt av %ks sjokkpinne.,%o został@[ao_pl] wyłączon@[adj_pl] przez szokującą pałkę %k.,%o foi desligado pelo espeto chocante de %k.,,%o a fost dezactivat de arma cu șocuri a lui %k.,Игрок %o выведен из строя электродубинкой %k.,,%o blev nedsläckt av %ks chockpinne.,"%o, %k tarafından kapatıldı." +%o got a face-full of %k's ice-cold wrath.,OB_MPCRYOGUN,,,,%o se zabořil@[ao_cs] do mrazivého hněvu hráče %k.,%o fik et ansigt fuld af %ks iskolde vrede.,%o bekam eine Ladung von %ks eiskaltem Zorn ins Gesicht.,,%o ricevis la glacie malvarman koleregon de %k.,%o recibió la ira gélida de %k en toda la cara.,,%o sai saamansa täyteen käyttäjän %k jääkylmää vihaa.,%o s'est fait congeler la figure par la colère glaciale de %k.,,%k jégre tette %o-t,%o ha un carico di freddo gelido di %k in faccia.,%o は %k の冷めた表情で凍った。,%o 은(는) %k 덕분에 맛있게 냉동 보존되었다.,%o kreeg een gezicht vol met %k's ijskoude toorn.,%o fikk ansiktet fullt av %ks iskalde vrede.,%o dostał@[ao_pl] wielką dawkę mroźnego gniewu %k.,%o tomou um gelo de %k. ,,%o a simțit din plin furia rece a lui %k.,Игрок %o столкнулся с ледяной ненавистью %k.,,%o fick en ansiktsfyllning av %ks iskalla vrede.,"%o, %k tarafından donduruldu." +"%o was drilled full of holes by %k, gangsta-style.",OB_MPUZI,,,,%o byl@[ao_cs] prostřílen@[ao_cs] skrz na skrz gangsterem %k.,"%o blev boret fuld af huller af %k, på gangsta-stil.",%o wurde von %k im Gangsta-Stil perforiert.,,"%o estis borita truplena de %k, ganstere.","%o fue acribillad@[ao_esp] por %k, al estilo gangster.",,%k porasi %o raukan täyteen reikiä gangsta-tyyliin.,"%o s'est fait perforer dans tous les sens par %k, Gangsta style.",,%o gengszter stílusban sajttá lyuggatta %k,%o è stato perforato da %k in stile gangsta.,%o はギャングの様な %k に蜂の巣にされた。,%o 은(는) %k 이(가) 선사한 갱스터 스타일 난사를 막지 못했다.,"%o werd vol gaten geboord met %k, in gangsta-stijl.","%o ble boret full av hull av %k, i gangsta-stil.",%o został@[ao_pl] podziurawion@[adj_pl] przez %k niczym gangster.,%o tomou pipoco de %k.,,%o a fost umplut de găuri în stil mafiot de către %k.,Игрок %o покрылся дырками после гангста-стрельбы игрока %k.,,"%o borrades full av hål av %k, på gangstermanér.","%o, %k tarafından gangsta tarzı delik deşik edildi." +%o ate %k's photon bomb.,OB_MPZOOKA,,,,%o sežral@[ao_cs] fotonovou bombu hráče %k.,%o spiste %ks fotobombe.,%o nahm %ks Photonenbombe.,,%o manĝis la fotonbombon de %k.,%o se comió la bomba de fotones de %k.,,%o söi käyttäjän %k fotonipommin.,%o a bouffé la bombe photonique de %k.,,%o megette %k foton bombáját,%o ha preso la bomba fotonica di %k.,%o は %k のフォトンボムを食らった。,%o 은(는) %k 의 광자탄을 봤는데도 피하지 못했다.,%o at %o %k's fotonbom.,%o spiste %ks fotonbombe.,%o zjadł@[ao_pl] fotonową bombę %k.,%o engoliu a bomba de fótons de %k.,,%o a mâncat bomba fotonică a lui %k.,Игрок %o съел фотонную бомбу %k.,,%o åt upp %ks fotobomb.,"%o, %k tarafından atomize edildi." +%o was reduced to a neat pile of photons by %k.,OB_MPZ_SPLASH,,,,%o byl@[ao_cs] zredukován@[ao_cs] na hromádku fotonů hráčem %k.,%o blev reduceret til en ordentlig bunke fotoner af %k.,%o wurde von %k zu einem Haufen Photonen verarbeitet.,,%o estis reduktita en ordeman amason da fotonoj de %k.,%o fue reducid@[ao_esp] a una pila de fotones por %k.,,%k redusoi %o raukan sieväksi fotonipinoksi.,%o s'est fait@[e_fr] réduire en une jolie pile de photons par %k.,,%o-ból csak egy marokni fotont hagyott hátra %k,%o è stato elaborato da %k in un mucchio di fotoni.,%o は %k によって蛍光灯にされた。,%o 은(는) %k 의 광자력을 탐냈다. 죽기 전까지는.,%o werd gereduceerd tot een nette stapel fotonen met %k.,%o ble redusert til en pen haug med fotoner av %k.,%o został@[ao_pl] zredukowan@[adj_pl] do maleńkiej kupki fotonów przez %k.,%o foi reduzido à uma bela pilha de fótons por %k.,,%o a fost transformat într-o grămadă simpatică de fotoni de către %k.,Игрок %o был разложен игроком %k в аккуратную кучку фотонов.,,%o reducerades till en prydlig hög fotoner av %k.,"%o, %k tarafından düzgün bir foton yığınına indirgendi." +%o was reduced to antimatter by %k.,OB_MPANTIGUN,"Physically this is utter nonsense, of course.",,,%o byl@[ao_cs] zredukován@[ao_cs] na antihmotu hráčem %k.,%o blev reduceret til antimaterie af %k.,%o wurde von %k zu Antimaterie reduziert.,,%o estis reduktita en antimaterion de %k.,%o fue reducid@[ao_esp] a antimateria por %k.,,%k redusoi %o raukan antimateriaksi..,%o s'est fait inverser les atomes par %k.,,%k antianyaggá lőttte %o-t,%o è stato ridotto all'antimateria da %k,%o は %k のにより反物質に変換された。,%o 은(는) %k 의 반물질의 힘에 의해 소멸되었다.,%o werd gereduceerd tot antimaterie met %k.,%o ble redusert til antimaterie av %k.,%o został@[ao_pl] zredukowan@[adj_pl] do antymaterii przez %k.,%o foi transformado em antimatéria por %k.,,%o a fost transformat în antimaterie de către %k.,Игрок %o был разложен игроком %k до антиматерии.,,%o reducerades till antimateria av %k.,"%o, %k tarafından atomlara indirgendi." +%o swallowed %k's nuke.,OB_MPNUKE,,,,%o spolkl@[ao_cs] atomovku hráče %k.,%o slugte %ks atombombe.,%o verschluckte sich an %ks Atomrakete.,,%o glutis la nuklean bombon de %k.,%o se tragó la bomba atómica de %k.,,%o nieli käyttäjän %k ydinpommin.,%o s'est pris@[e_fr] la bombe thermonucléaire de %k dans la figure.,,%o megette %k atombomáját,%o soffocò sul missile nucleare di %k.,%o は %k の核を飲み干した。,%o 은(는) %k 덕분에 하늘을 뚫을 버섯구름이 되었다.,%o geslikt %o nuke %k's nuke.,%o svelget %ks atombombe.,%o połkn@[irreg_2_pl] atomówkę %k.,%o engoliu o míssil núclear de %k.,,%o a înghițit proiectilul lui %k.,Игрок %o проглотил ядерный заряд %k.,,%o svalde %ks atombomb.,"%o, %k tarafından bombalandı." +%o went nuclear from %k's mass destruction spree.,OB_MPNUKESPLASH,,,,%o si zkrátil@[ao_cs] svůj poločas rozpadu při zabijačce hráče %k.,%o blev atomvåben af %ks masseødelæggelser.,%o wurde von %ks Massenzerstörungsaktion verstrahlt.,,%o iĝis nuklea pro la amasdetruado de %k.,%o se volvió radioactiv@[ao_esp] por la racha de destrucción masiva de %k.,,%o muuttui radioaktiiviseksi käyttäjän %k massatuhoputken takia.,%o s'est fait@[e_fr] irradier par la folie destructrice de %k.,,%o felrobbant az idegtől amikor meglátta %k bombáját,%o fu irradiato dall'azione di distruzione di massa di %k.,%o は %k の虐殺ごっこの犠牲者になった。,%o 은(는) %k 의 핵실험에 참여했다.,%o werd nucleair van de massavernietigingswoede van %k's massavernietigingswoede.,%o ble nuklear av %ks masseødeleggelse.,%o został@[ao_pl] napromieniowan@[adj_pl] przez masową destrukcję %k.,%o virou picadinho radioativo por causa da destruição em massa causada por %k.,,%o a devenit radioactiv în urma distrugerii în masă a lui %k.,Игрок %o светится в темноте от оружия массового поражения %k.,,%o blev kärnvapenfri av %ks massförstörelse.,"%o, %k tarafından bombalandı." +%o was turned inside-out by %k.,OB_MPTELEFRAG,,,,%o byl@[ao_cs] obrácen@[ao_cs] naruby hráčem %k.,%o blev vendt ud og ind af %k.,%o wurde von %k zerfetzt.,,La interno de %o estis eksteriga de %k.,%o fue puest@[ao_esp] del revés por %k.,,%k käänsi %o raukan nurinpäin.,%o s'est fait@[e_fr] inverser par %k.,,%k kifordította %o-t,%o fu fatto a pezzi da %k,%o は %k に裏返しにされた。,%o 은(는) %k 에 의해 자신이 분해되는 꼴을 못 봤다.,%o werd binnenstebuiten gekeerd met %k.,%o ble snudd på hodet av %k.,%o został@[ao_pl] wywrócon@[adj_pl] na lewą stronę przez %k.,%o foi virad@[ao_ptb] ao avesso por %k.,,%o a fost întors pe dos de către %k.,Игрок %o вывернут наизнанку игроком %k.,,%o vändes ut och in av %k.,"%o, %k tarafından parçalandı." +%o's atomic structure was split apart.,OB_MONTELEFRAG,,,,Struktura atomů hráče %o se rozpadla.,%os atomstruktur blev splittet op.,%os Atomstruktur wurde vernichtet.,,La atoma strukturo de %o estis disfendita.,%o fue desintegrad@[ao_esp] al nivel atómico.,,%o raukan atomirakenne hajosi.,%o s'est fait@[e_fr] désassembler au niveau atomique.,,%o atomjaira esett szét,La struttura atomica di %o fu distrutta.,%o の原子構造は分解された。,%o 의 원자 마디마디가 흩어졌다.,De atoomstructuur van %o werd gesplitst.,%o's atomstruktur ble splittet fra hverandre.,Atomy %o zostały od siebie oddzielone.,A estrutura atômica de %o foi separada.,,Structura atomică a lui %o a fost spulberată.,Атомная структура игрока %o разрушена.,,%os atomstruktur splittrades.,%o atomik düzeyde parçalara ayrıldı. +%o spontaneously expired.,OB_DEFAULT,,,,%o samovolně vypršel@[ao_cs].,%o udåndede spontant.,%o hörte spontan auf zu existieren.,,%o spontane finiĝis.,%o tuvo una muerte espontánea.,,%o spontaanisti kupsahti.,%o a spontanément expiré.,,%o hirtelenjében elérte a lejárati időt,%o ha smesso spontaneamente di esistere.,%o の有効期限が自発的に切れた,%o 은(는) 파란만장하게 사라졌다.,%o is spontaan verlopen.,%o gikk spontant til grunne.,%o spontanicznie umarł@[ao_pl].,%o pereceu expontâneamente.,,%o a expirat în mod spontan.,Время игрока %o неожиданно вышло.,,%o dog spontant.,%o kendiliğinden öldü. +You grab a NUKER! Suck on this!,GOTNUKER,,,,Sebral@[ao_cs] jsi ATOMOVKÁTOR! Pojď na to!,Du tager en NUKER! Sut på den!,Ein NUKER! Verschluck dich daran.,,Vi prenis NUKER! Jen havu!,¡Has pillado un NUKER! ¡Chupaos esa!,¡Has recogido un NUKER! ¡Chúpate esa!,%Kahmaiset YDÄRIN! Ime tätä!,Vous découvrez le NUKER! Ca va en chier!,,Meglelted a NUKER-t! Ezt kapd ki!,Prendi un NUKER! Succhia su questo!,NUEKR を奪った! 覚悟しろ!,누커 획득! 한바탕 쓸어볼까!,Je pakt een NUKER! Zuig hier maar aan!,Ta en NUKER! Sug på denne!,Podniosłeś ATOMÓWKĘ! Ssijcie to!,Você pegou um NUKER! Chupa essa manga!,,Ai ridicat Lansatorul Nuclear! Ia de-aici!,Заполучен ЯДЕРНЫЙ ГРАНАТОМЁТ! Отсосите!,,Du tar en NUKER! Sug på den här!,Sen bir NÜKER kap! Bunu em! +You got an UZI!!,GOTUZI,,,,Získal@[ao_cs] jsi UZI!,Du har en UZI!!,UZI genommen!,,Vi prenis UZI!!,¡¡Has obtenido una UZI!!,,Sait UZIn!!,Vous chopez un UZI!,,Meglelted az UZI-t!,Hai un UZI !!,UZI をゲットした!!,우지 기관단총 획득!,Je hebt een UZI!!,Du har en UZI!,Zdobyłeś UZI!!,Você pegou uma UZI!!,,Ai ridicat un UZI!!,Заполучен УЗИ!!,,Du har en UZI!!,Bir UZI'n var! +A HOIG Reznator - FRY some butt,GOTREZNATOR,,,,HOIG Reznátor - pár jich upeč,En HOIG Reznator - Fritér noget røv,Ein HOIG Reznator.,,HOIG-Reznilo - FRITU pugon!,Un Reznator HOIG. ¡Hora de freir traseros!,,HOIG-reznaattori - KÄRISTÄ takamuksia,"Un Reznator HOIG, allez frire du monde!",,Egy HOIG Reznator - okozz pár megrázó élményt,Un Reignator HOIG - friggere un po 'di carne,HOIGレジネイター - ぶっ潰してやれ,HOIG 전자무력기 획득! 전기 통구이를 만들자고!,Een HOIG Reznator - FRY sommige kont,En HOIG Reznator - FRY litt rumpe!,Reznator HOIG - skop trochę tyłków,Um Reznador HOIG - Hora de fritar,,Un Rezonator HOIG - Arde-i!,ХОЙГ Резнатор,,En HOIG Reznator - FRY några rumpor,Bir HOIG Reznator - Biraz kıç kızartın +You got a Photon 'Zooka!,GOTPHOTONZOOKA,,,,Sebral@[ao_cs] jsi Fotonovou bazuku!,Du har en Photon 'Zooka!,Photonen-'zooka genommen!,,Vi prenis Fotonbazukon!,¡Has obtenido un Bazooka de Fotones!,,Sait fotonisingon!,Vous récupérez un Bazooka Photonique!,,Meglelted a Foton Ágyút!,Hai un cannone Photon!,フォトン'ゾーカ をゲットした!,광자 바주카 획득!,Je hebt een Photon 'Zooka!,Du har en Photon 'Zooka!,Zdobyłeś Fotonozukę!,Você pegou uma Bazuca de Fótons!,,Ai ridicat o Bazooka Fotonică!,Заполучена фотон-базука!,,Du har en Photon 'Zooka'!,Bir Foton 'Zooka'n var! +You carry a Big Stick!,GOTBIGSTICK,,,,Nosíš velkou bouchačku!,Du har en Big Stick!,Du trägst einen langen Stock.,,Vi portas grandan bastonon!,¡Llevas un Gran Palo!,,Kannat isoa keppiä!,Vous avez un gros bâton!,,Nagy bottal jársz öcsém!,Porti un grosso bastone!,ビッグスティック を手に取った!,반물질 봉 획득!,Je draagt een Big Stick!,Du har en Big Stick!,Podnosisz Wielką Pałkę!,Você pegou um Grande Bastão!,,Ai ridicat un Băț Lung!,Заполучена длинная палка!,,Du har en stor käpp!,Büyük bir sopa taşıyorsun! +You got a Tazer!!,GOTTAZER,,,,Získal@[ao_cs] jsi tazer!,Du har en Tazer!!,Tazer genommen!,,Vi prenis Elektropafilon!!,¡¡Has obtenido un Taser!!,,Sait etälamauttimen!!,Vous trouvez un Taser!,,Meglelted a Sokkolót!,Hai un Taser !!,テイザー をゲットした!,테이져 획득!,Je hebt een Tazer!!,Du har en Tazer!,Zdobyłeś Tazer!!,Você pegou um Tazer!!,,Ai ridicat un Taser!!,Заполучен тазер!,,Du har en Tazer!,Bir Tazer'ın var!! +You grab a Cryogun! FREEZE!,GOTCRYOGUN,,,,Sebral@[ao_cs] jsi krypušku! ANI SE NEHNI!,Du har en Cryogun! Frys!,Cryowaffe genommen! GEFRIER!,,Vi prenis Kriogenikpafilon! FROSTIĜU!,¡Has pillado un Criogenizador!! ¡Todos quietos!,¡Has recogido un Criogenizador!! ¡Quietos todos!,Kahmaiset kryopyssyn! PYSÄHDY!,Vous prenez un Cryogun! On s'arrête!,,Felkapod a Cryogun-t! Induljon a fagyasztás!,Prendi un Cryogun! CONGELARE!,クライォガン を奪った! フリーズ!,크라이로건 획득! 그대로 멈춰라!,Je pakt een Cryogun! FREEZE!,Du har en Cryogun! FREEZE!,Podniosłeś Zamrażarkę! STAĆ!,Você pegou uma Cryogun! FICA FRIO AÍ!,,Ai ridicat o Crio-armă! ÎNGHEAȚĂ!,Заполучена замораживающая пушка! НИ С МЕСТА!,,Du har en Cryogun! FRIAS!,Bir Cryogun al! DONDUR! +You grab some rounds!,GOTROUNDS,,,,Sebral@[ao_cs] jsi nějaké náboje!,Du tager nogle patroner!,Munition genommen.,,Vi prenis kuglojn!,¡Has pillado unas balas!,¡Has recogido unas balas!,Kahmaiset patruunoita!,Vous prenez des balles!,,Felkapsz pár lőszert!,Prendi delle munizioni!,幾つかのラウンド を奪った!,권총 탄약을 주웠다!,Je pakt wat rondes!,Du tar noen runder!,Podniosłeś trochę naboi!,Você pegou munição!,,Ai ridicat niște muniție!,Заполучена обойма патронов!,,Du tar några patroner!,Biraz mermi al! +You grab a case of rounds!,GOTROUNDSCASE,,,,Sebral@[ao_cs] jsi krabici nábojů!,Du tager en kasse med patroner!,Munitionskiste genommen.,,Vi prenis skatolon da kugloj!,¡Has pillado una caja de balas!,¡Has recogido una caja de balas!,Kahmaiset patruunalaatikon!,Vous prenez une bôite de balles!,,Felkapsz egy doboz lőszert!,Prendi un caso di munizioni!,ケースのラウンド を奪った!,권총 탄약 상자를 주웠다!,Je pakt een kist met rondes!,Du tar en kasse med patroner!,Podniosłeś skrzynkę naboi!,Você pegou uma caixa de munição!,,Ai ridicat un cartuș de muniție!,Заполучена коробка патронов!,,Du tar en låda med patroner!,Bir kutu mermi al! +You grab a Torpedo!,GOTTORPEDO,"Was ""grap"" for some reason.",,,Sebral@[ao_cs] jsi torpédo!,Du tager en Torpedo!,Torpedo genommen.,,Vi prenis Torpedon!,¡Has pillado un torpedo!,¡Has recogido un torpedo!,Kahmaiset torpedon!,Vous prenez une torpille!,,Felkapsz egy Torpedót!,Prendi un siluro!,トルペード を奪った!,광자탄을 주웠다!,Je pakt een Torpedo!,Du tar en Torpedo!,Podniosłeś Torpedę!,Você pegou um Torpedo!,,Ai ridicat o Torpilă!,Заполучена торпеда!,,Du tar en torped!,Bir Torpido al! +You grab a case of Torpedos!,GOTTORPEDOS,,,,Sebral@[ao_cs] jsi krabici torpéd!,Du tager en kasse med torpedoer!,Torpedokiste genommen.,,Vi prenis skatolon da Torpedoj!,¡Has pillado una caja de torpedos!,¡Has recogido una caja de torpedos!,Kahmaiset torpedolaatikon!,Vous prenez une bôite de torpilles!,,Felkapsz egy doboz Torpedót!,Prendi un caso di siluri!,トルペードのケース を奪った!,광자탄 무더기를 주웠다!,Je pakt een kist Torpedo's!,Du tar en kasse med torpedoer!,Podniosłeś skrzynkę Torped!,Você pegou uma caixa de Torpedos!,,Ai ridicat o cutie de Torpile!,Заполучен ящик торпед!,,Du tar en låda med torpeder!,Bir kasa Torpido al! +You grab a molecule module!,GOTMOLECULES,,,,Sebral@[ao_cs] jsi molekulový modul!,Du tager et molekylmodul!,Molekülmodul genommen,,Vi prenis molekulmodulon!,¡Has pillado un módulo molecular!,¡Has recogido un módulo molecular!,Kahmaiset molekyylimoduulin!,Vous prenez un module moléculaire!,,Felkapsz egy molekula modult!,Prendi un modulo molecolare!,モーレキュールモヂュール を奪った!,분자 모듈을 주웠다!,Je pakt een molecuulmodule!,Du tar en molekylmodul!,Podniosłeś molekularny moduł!,Você pegou um módulo molecular!,,Ai ridicat un modul molecular!,Заполучен молекулярный модуль!,,Du tar en molekylmodul!,Bir molekül modülü kap! +You grab a tank full of molecules!,GOTMOLECULESTANK,,,,Sebral@[ao_cs] jsi sud plný molekul!,Du tager en tank fuld af molekyler!,Tank mit Molekülmodulen genommen.,,Vi prenis reservujon da molekulojn!,¡Has pillado un tanque lleno de moléculas!,¡Has recogido un tanque lleno de moléculas!,Kahmaiset tankin täynnä molekyylejä!,Vous prenez un réservoir de molécules!,,Felkapsz egy teli tank molekulát!,Prendi un serbatoio pieno di molecole!,タンク満タンのモーレキュール を奪った!,분자 탱크를 주웠다!,Je pakt een tank vol met moleculen!,Du tar en tank full av molekyler!,Podniosłeś zbiornik pełen molekuł!,Você pegou um tanque cheio de moléculas!,,Ai ridicat un rezervor plin cu molecule!,Заполучен контейнер с молекулами!,,Du tar en tank full av molekyler!,Moleküllerle dolu bir tank al! +You grab some Cartridges!,GOTCARTRIDGES,,,,Sebral@[ao_cs] jsi nějaké kazety!,Du tager nogle patroner!,Magazin genommen.,,Vi prenis iom da kartoĉoj!,¡Has pillado unos cartuchos!,¡Has recogido unos cartuchos!,Kahmaiset kasetteja!,Vous prenez des cartouches!,,Felkapsz pár Töltényt!,Prendi alcune cartucce!,残弾のカートリッジ を奪った!,카트리지 한 줌을 주웠다!,Je pakt een paar patronen!,Du tar noen patroner!,Podniosłeś trochę pocisków!,Você pegou alguns Carregadores!,,Ai ridicat niște Cartușe!,Заполучены картриджи!,,Du tar några patroner!,Fişekleri al! +You grab a case of Cartridges!,GOTCARTRIDGESCASE,,,,Sebral@[ao_cs] jsi krabici kazet!,Du tager en kasse med patroner!,Magazinkiste genommen.,,Vi prenis skatolon da kartoĉoj!,¡Has pillado una caja de cartuchos!,¡Has recogido una caja de cartuchos!,Kahmaiset laatikollisen kasetteja!,Vous prenez une bôite de cartouches!,,Felkapsz egy doboz Töltényt!,Prendi un caso di cartucce!,カートリッジケース を奪った!,카트리지 박스를 주웠다!,Je pakt een kist patronen!,Du tar en kasse med patroner!,Podniosłeś skrzynkę pocisków!,Você pegou uma caixa de Carregadores!,,Ai ridicat o cutie de Cartușe!,Заполучен ящик картриджей!,,Du tar en låda med patroner!,Bir kutu fişek al! +You grab a Valise stuffed with goods!,GOTVALISE,,,,Sebral@[ao_cs] jsi kufr plný munice!,Du tager en kuffert fyldt med varer!,Munitionstasche genommen.,,Vi prenis valizon plenan de municiojn!,¡Has pillado una maleta llena de equipamiento!,¡Has recogido una maleta llena de equipamiento!,Kahmaiset laukullisen täynnä tavaraa!,Vous récupérez une valise pleine d'équipement!,,Felkapsz egy Poggyásznyi Muníciót!,Prendi una Valigia piena di merci!,代物を詰めたバリス を奪った!,탄약이 든 서류 가방을 주웠다!,Je pakt een Valise gevuld met goederen!,Du tar en koffert fylt med varer!,Podniosłeś Walizkę z wieloma dobrami!,Você pegou uma Mala cheia de equipamento!,,Ai ridicat o Valiză plină cu bunătăți!,Заполучена полная сумка боеприпасов!,,Du tar en valise fylld med varor!,İçi mal dolu bir valiz al! +Force Field!,GOTFORCEFIELD,,,,Silové pole!,Kraftfelt!,Kraftfeld!,,Fortkampo!,¡Campo de fuerza!,,Voimakenttä!,Champ de force!,,Erőtér!,Campo di forza!,フォースフィールド!,방어막!,Krachtveld!,Kraftfelt!,Pole Siłowe!,Campo de Força!,,Câmp de Forță!,Силовое поле!,,Kraftfält!,Güç Alanı! +007Microtel,GOTMICROTEL,,,,,,,,007 Microtel!,Microtel 007,,,007 Microtel,,,,007マイクロテル,007마이크로텔 근력 향상 칩!,,,,,,Microtel 007,Микрочип 007,,,007Microtel +You are EnK Blind!,GOTENKBLIND,,,,Jsi EnK-slep@[adj_cs]!,Du er EnK Blind!,Du bist EnK-blind!,,Vi estas ENK-Blinda,¡Tienes Ceguera EnK!,,Olet EnK-sokea!,Vous êtes aveugle à l'EnK!,,EnK védett lettél!,Sei EnK-cieco!,EnKブラインドみてえだ!,EnK 투명 위장 장치!,Jij bent EnK Blind!,Du er EnK Blind!,Jesteś oślepiony przez EnK!,Você está vendado por EnK!,,Acum ești nedetectabil pentru Enk!,У тебя EnK-видимость!,,Du är EnK Blind!,Sen EnK Blind'sın! +Vulcan rubber Boots!,GOTRUBBERBOOTS,,,,Gumové boty!,Vulkaniske gummistøvler!,Gummistiefel!,,Vulkanaj Kauŭĉukaj Botoj!,¡Botas de goma vulcanizada!,,Vulkanoidut kumisaappaat!,Bottes en caoutchouc vulcanisé!,,Vulkanizált gumi talp!,Stivali di gomma vulcanica!,バルカンラバーブーツ!,벌컨 방화 부츠!,Vulcan rubber Laarzen!,Vulcan gummistøvler!,Gumowe Buty Vulcan!,Botas Vulcanizadas!,,Bocanci din cauciuc Vulcan!,Резиновые сапоги!,,Vulkaniska gummistövlar!,Vulcan lastik botları! +SI Array mapping!,GOTSIARRAY,,,,Mapa pole SI!,SI Array kortlægning!,SI-Feld Karte!,,SI-matric-mapado!,¡Mapeado de Tabla SI!,,SI-kenttäkartta!,Carte du tableau SI!,,SI pálya Felderítő!,Mappatura di array SI!,SIアーレイ マッピング!,Si 어레이 지도!,,SI Array kartlegging!,Mapa Pola SI!,Mapeamento por Campo de SI!,,Hartă SI compilată!,Составлена карта SI-массива!,,SI Array kartläggning!,SI Dizi eşlemesi! +Infrared Visor!,GOTINFRARED,,,,Infračervené brýle!,Infrarødt visir!,Infrarotbrille!,,Transruĝa Viziero!,¡Visor infrarrojo!,,Infrapunavisiiri!,Viseur infrarouge!,,Infravörös Sisak!,Visore a infrarossi!,赤外線バイザー!,적외선 바이져!,Infrarood vizier!,Infrarødt visir!,Wizjer na Podczerwień!,Visor Infravermelho!,,Vedere Infraroșie!,Инфракрасный визор!,,Infrarött visir!,Kızılötesi Vizör! +"Breathe deep, Inhaler!",GOTINHALER,,,,"Pořádně se nadechni, inhalátor!","Træk vejret dybt, Inhalator!","Atme tief, Inhalierer!",,"Spiru profunde, inhalo!","¡Un inhalador, inspira fuerte!",,"Hengitä syvään, inhalaattori!","Respire, inhaleur!",,"Mély lélegzet, Inhaláló!","Respirare profondamente, inalatore!",深呼吸だ、インヘイラー!,각성제를 주웠다. 잘 들이마셔!,"Adem diep in, inhalator!","Pust dypt, Inhalator!",Weź głęboki wdech! Inhalator!,Inalador! Respira fundo!,,"Inspiră adânc, Inhalatorule!",Ингалятор! Вдыхай глубже!,,"Andas djupt, Inhalator!","Derin nefes al, Inhaler!" +A dose of Hydergine from a Hypo saves you!,GOTHYPONEED,,,,Jsi zachráněn@[ao_cs] dávkou Hyderginu z Hypa!,En dosis Hydergine fra en Hypo redder dig!,Eine Dosis Hydergine rettet dich!,,,¡Una dosis de Hydergina te salva la vida!,,Hyderginepiikkiannos pelastaa sinut!,Une bonne dose d'hydergine vous sauve la vie!,,Egy adag Hydergine megmenti az irhád!,Una dose di Hydergine di un Hypo ti salva!,ハイポで ヒデルギン をキメた!,하이포의 하이데르진이 당신을 살렸다!,Een dosis Hydergine van een Hypo redt je!,En dose Hydergine fra en Hypo redder deg!,Dawka Hyderginy z Hypo ratuje cię!,Uma dose de hidergina do Hypo para te salvar!,,O doză de Hidrogine dintr-o seringă te salvează!,Доза Редергина из шприца спасла тебя!,,En dos Hydergine från en Hypo räddar dig!,Hypo'dan bir doz Hydergine seni kurtarır! +You grab a Hypo!,GOTHYPO,,,,Sebral@[ao_cs] jsi Hypo!,Du tager en Hypo!,Hypo!,,Vi prenis Injektilon!,¡Has pillado una jeringa hipodérmica!,,Kahmaiset piikin!,Vous prenez une seringue!,,Felkapsz egy Hypo-t!,Prendi un Hypo!,ハイポ を奪った!,하이포를 주웠다!,Je pakt een Hypo!,Du tar en Hypo!,Podniosłeś Hypo!,Você pegou um Hypo!,,Ai ridicat o Seringă!,Заполучен шприц!,,Du tar en Hypo!,Bir Hypo kaptın! +You found a KeyCard!,GOTKEYCARD,,,,Nalezl@[ao_cs] jsi přístupovou kartu!,Du har fundet et Nøglekort!,Schlüsselkarte gefunden!,,Vi trovis Ŝlosilkarton!,¡Has encontrado una Tarjeta Llave!,,Löysit avainkortin!,Vous trouvez une clé magnétique!,,Leltél egy Kulcskártyát!,Hai trovato una chiave magnetica!,キーカードを見つけた!,키 카드를 찾았다!,U heeft een sleutelkaart gevonden!,Du har funnet et nøkkelkort!,Znalazłeś Kartę Dostępu!,Você achou um Cartão de Passe!,,Ai găsit un Card-Cheie!,Найдена ключ-карта!,,Du hittade ett nyckelkort!,Bir Anahtar Kart buldun! +You found a C-Key!,GOTCKEY,,,,Nalezl@[ao_cs] jsi kyberklíč!,Du har fundet en C-nøgle!,C-Schlüssel gefunden!,,Vi trovis C-Ŝlosilon!,¡Has encontrado una Llave-C!,,Löysit C-avaimen!,Vous trouvez une C-Clé!,,Leltél egy C-Kulcsot!,Hai trovato una chiave C!,C-keyを見つけた!,C-키를 찾았다!,Je hebt een C-sleutel gevonden!,Du har funnet en C-nøkkel!,Znalazłeś Klucz C!,Você achou uma Chave-C!,,Ai găsit o Cheie-C!,Найден C-образный ключ!,,Du hittade en C-nyckel!,Bir C-Anahtarı buldun! +You found a Password!,GOTPASSWORD,,,,Nalezl@[ao_cs] jsi heslo!,Du har fundet et kodeord!,Passwort gefunden!,,Vi trovis Pasvorton!,¡Has encontrado una Contraseña!,,Löysit salasanan!,Vous trouvez un mot de passe!,,Leltél egy Jelszót!,Hai trovato una parola d'ordine!,パスワードを見つけた!,암호를 찾았다!,U heeft een wachtwoord gevonden!,Du har funnet et passord!,Znalazłeś Hasło!,Você achou uma Senha!,,Ai găsit o Parolă!,Найден пароль!,,Du hittade ett lösenord!,Bir Şifre buldun! +You found a blue Z-Key!,GOTBLUEZKEY,,,,Nalezl@[ao_cs] jsi modrý Z-klíč!,Du fandt en blå Z-nøgle!,Blauen Z-Schlüssel gefunden!,,Vi trovis bluan Z-ŝlosilon!,¡Has encontrado una Llave-Z azul!,,Löysit sinisen Z-avaimen!,Vous trouvez une Z-Clé bleue!,,Leltél egy kék Z-Kulcsot!,Hai trovato una chiave Z blu!,ブルー Z-Key を見つけた!,청색 Z-키를 찾았다!,Je hebt een blauwe Z-sleutel gevonden!,Du har funnet en blå Z-nøkkel!,Znalazłeś niebieski Klucz Z!,Você achou uma Chave-Z azul!,,Ai găsit o Z-Cheie albastră!,Найден синий Z-образный ключ!,,Du hittade en blå Z-nyckel!,Mavi bir Z-Anahtarı buldun! +You found a yellow Z-Key!,GOTYELWZKEY,,,,Nalezl@[ao_cs] jsi žlutý Z-klíč!,Du fandt en gul Z-nøgle!,Gelben Z-Schlüssel gefunden!,,Vi trovis flavan Z-ŝlosilon!,¡Has encontrado una Llave-Z amarilla!,,Löysit keltaisen Z-avaimen!,Vous trouvez une Z-Clé jaune!,,Leltél egy sárga Z-Kulcsot!,Hai trovato una chiave Z gialla!,イエローZ-Key を見つけた!,황색 Z-키를 찾았다!,Je hebt een gele Z-sleutel gevonden!,Du har funnet en gul Z-nøkkel!,Znalazłeś żółty Klucz Z!,Você achou uma Chave-Z amarela!,,Ai găsit o Z-Cheie galbenă!,Найден жёлтый Z-образный ключ!,,Du hittade en gul Z-nyckel!,Sarı bir Z-Anahtarı buldun! +You found a red Z-Key!,GOTREDZKEY,,,,Nalezl@[ao_cs] jsi červený Z-klíč!,Du fandt en rød Z-nøgle!,Roten Z-Schlüssel gefunden!,,Vi trovis ruĝan Z-ŝlosilon!,¡Has encontrado una Llave-Z roja!,,Löysit punaisen Z-avaimen!,Vous trouvez une Z-Clé rouge!,,Leltél egy piros Z-Kulcsot!,Hai trovato una chiave Z rossa!,レッド Z-Key を見つけた!,적색 Z-키를 찾았다!,Je hebt een rode Z-sleutel gevonden!,Du har funnet en rød Z-nøkkel!,Znalazłeś czerwony Klucz Z!,Você achou uma Chave-Z vermelha!,,Ai găsit o Z-Cheie roșie!,Найден красный Z-образный ключ!,,Du hittade en röd Z-nyckel!,Kırmızı bir Z-Anahtarı buldun! +Body Armor!,GOTBODYARMOR,,,,Brnění!,Kropsrustning!,Körperpanzerung!,,Kiraso!,¡Armadura!,,Suojavarustus!,Armure!,,Testpáncél!,Giubbotti antiproiettile!,ボディーアーマー!,강화복!,Kogelvrije vesten!,Skuddsikker vest!,Pancerz!,Colete a Prova de Balas!,,Armură de Corp!,Бронежилет!,,Kroppspansar!,Vücut Zırhı! +Centrophenoxine,GOTCENTROPHENOXINE,,,,Centrofenoxin,Centrophenoxine,,,Centrofenoksino!,¡Centrofenoxina!,,Sentrofenoksiinia,Centrophenoxine!,,,,セントロフェノキシン!,메클로페녹세이트!,,Centrophenoxine,Centrofenoxina,Centrofenoxina,,Centrofenoxine,Центрофеноксин,,, +You grab a Kevlar vest!,GOTKEVLARVEST,,,,Sebral@[ao_cs] jsi kevlarovou vestu!,Du får fat i en kevlarvest!,Kevlarweste!,,Vi prenis kevlaran veŝton!,¡Has pillado un traje de Kevlar!,¡Has recogido un traje de Kevlar!,Kahmaiset Kevlar-liivit!,Veste en Kevlar!,,Felkapsz egy Golyóálló Mellényt!,Prendi una maglia di kevlar!,ケブラーベスト を奪った!,방탄복을 주웠다!,Pak een Kevlar vest!,Du tar en Kevlar-vest!,Podniosłeś kamizelkę kuloodporną!,Você pegou um Colete de Kevlar!,,Ai ridicat o vestă din Kevlar!,Заполучен кевларовый жилет!,,Du tar en kevlarväst!,Kevlar yeleği al! +You grab Super Kevlar vest!,GOTSKEVLARVEST,,,,Sebral@[ao_cs] jsi superkevlarovou vestu!,Du tager Super Kevlar vest!,Super-Kevlarweste!,,Vi prenis superan kevlaran veŝton!,¡Has pillado un supertraje de Kevlar!,¡Has recogido un supertraje de Kevlar!,Kahmaiset Superkevlar-liivit!,Super Veste en Kevlar!,,Felkapsz egy Szuper Golyóálló Mellényt!,Prendi una maglia super kevlar!,スーパーケブラーベスト を奪った!,중 방탄복을 주웠다!,Je pakt een Super Kevlar vest!,Du tar en Super Kevlar vest!,Podniosłeś superkamizelkę kuloodporną!,Você pegou um Super Colete de Kevlar!,,Ai ridicat o Super Vestă din Kevlar!,Заполучен усиленный кевларовый жилет!,,Du tar tag i Super Kevlar väst!,Süper Kevlar yeleği al! +You grab a MicroKit!,GOTMICROKIT,,,,Sebral@[ao_cs] jsi mikrosadu!,Du får fat i et MicroKit!,MicroKit genommen!,,Vi prenis Kompleteton!,¡Has pillado un MicroKit!,¡Has recogido un MicroKit!,Kahmaiset Microkitin!,Microkit!,,Felkapsz egy Mikorkit-et!,Prendi un MicroKit!,マイクロキット を奪った!,마이크로킷을 주웠다!,Je pakt een MicroKit!,Du tar en MicroKit!,Podniosłeś MikroZestaw!,Você pegou um MicroKit!,,Ai ridicat un MicroKit!,Заполучена мини-аптечка!,,Du tar en MicroKit!,Bir MicroKit al! +You grab a Dampener!,GOTDAMPENER,,,,Sebral@[ao_cs] jsi tlumič!,Du får fat i en Dampener!,Dämpfer genommen!,,Vi prenis Dampilon!,¡Has pillado un Amortiguador!,¡Has recogido un Amortiguador!,Kahmaiset vaimentimen!,Amortisseur!,,Felkapsz egy Tompítót!,Prendi un antivento!,ダンプナー を奪った!,완충 장치를 주웠다!,Je pakt een Demper!,Du tar en Dampener!,Podniosłeś Tłumik!,Você pegou um Amortecedor!,,Ai ridicat un Amortizor!,Заполучен глушитель!,,Du tar en Dämpare!,Bir Sönümleyici al! +You need a C-Key to access this item!,PD_CKEY,,,,K přístupu potřebuješ kyberklíč!,Du skal bruge en C-nøgle for at få adgang til dette objekt!,Du brauchst einen C-Schlüssel um das hier zu bedienen.,,Vi bezonas C-ŝlosilon por aliri ĉi tiun objekton!,¡Necesitas una Llave-C para acceder a este objeto!,,Tarvitset C-avaimen saadaksesi pääsyn tähän kohteeseen!,Il vous faut une C-Clé pour accéder à cet objet!,,Egy C-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave C per accedere a questo oggetto!,アクセスには C-key が必要だ!,C-키가 있어야 작동이 가능하다!,Je hebt een C-sleutel nodig om toegang te krijgen tot dit item!,Du trenger en C-nøkkel for å få tilgang til dette elementet!,Potrzebujesz Klucza C by uruchomić ten przedmiot.,Você precisa de uma Chave-C para acessar!,,Ai nevoie de o Cheie-C pentru a accesa acest obiect!,"Нет доступа, нужен C-образный ключ!",,Du behöver en C-nyckel för att få tillgång till detta objekt!,Bu eşyaya erişmek için bir C-Anahtarına ihtiyacın var! +You need a KeyCard to access this item!,PD_KEYCARD,,,,K přístupu potřebuješ přístupovou kartu!,Du skal bruge et Nøglekort for at få adgang til dette objekt!,Du brauchst eine Schlüsselkarte um das hier zu bedienen.,,Vi bezonas Slosilkarton por aliri ĉi tiun objekton!,¡Necesitas una Tarjeta Llave para acceder a este objeto!,,Tarvitset avainkortin saadaksesi pääsyn tähän kohteeseen!,Il vous faut une carte magnétique pour accéder à cet objet!,,Egy kulcskártya szükséges a hozzáféréshez!,Hai bisogno di una chiave magnetica per accedere a questo oggetto!,アクセスには キーカード が必要だ!,키 카드가 있어야 작동이 가능하다!,U heeft een sleutelkaart nodig om toegang te krijgen tot dit item!,Du trenger et nøkkelkort for å få tilgang til dette elementet!,Potrzebujesz Karty Dostępu by uruchomić ten przedmiot!,Você precisa de uma Chave de Passe para acessar!,,Ai nevoie de un Card-Cheie pentru a accesa acest obiect!,"Нет доступа, нужен ключ-карта!",,Du behöver ett KeyCard för att komma åt det här objektet!,Bu öğeye erişmek için bir KeyCard'a ihtiyacınız var! +You need a Password to access this item!,PD_PASSWORD,,,,K přístupu potřebuješ heslo!,Du skal bruge et kodeord for at få adgang til dette objekt!,Du brauchst eine Passwort um das hier zu bedienen.,,Vi bezonas Pasvorton por aliri ĉi tiun objekton!,¡Necesitas una Contraseña para acceder a este objeto!,,Tarvitset salasanan saadaksesi pääsyn tähän kohteeseen!,Il vous faut un mot de passe pour accéder à cet objet!,,Egy Jelszó szükséges a hozzáféréshez!,Hai bisogno di una parola d'ordine per accedere a questo oggetto!,アクセスには パスワード が必要だ!,암호를 입력해야 작동이 가능하다!,Je hebt een wachtwoord nodig om toegang te krijgen tot dit item!,Du trenger et passord for å få tilgang til dette elementet!,Potrzebujesz Hasła by uruchomić ten przedmiot!,Você precisa de uma Senha para acessar!,,Ai nevoie de Parolă pentru a accesa acest obiect!,"Нет доступа, нужен пароль!",,Du behöver ett lösenord för att få tillgång till detta objekt!,Bu öğeye erişmek için bir Şifreye ihtiyacınız var! +You need a Blue Z-Key to make this work,PD_BLUEZKEY,,,,Tohle bude fungovat jen s modrým Z-klíčem.,Du skal bruge en blå Z-nøgle for at få dette til at fungere!,Du brauchst einen blauen Z-Schlüssel um das hier zu bedienen.,,Vi bezonas Bluan Z-ŝlosilon por funkciigi ĉi tiun!,¡Necesitas una Llave-Z azul para hacer funcionar esto!,,Tarvitset sinisen Z-avaimen saadaksesi tämän toimimaan!,Il vous faut une Z-Clé bleue pour faire fonctionner cela.,,Egy Kék Z-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave Z blu per accedere a questo oggetto!,アクセスには ブルーZ-key が必要だ!,청색 Z-키가 있어야 작동이 가능하다!,Je hebt een blauwe Z-sleutel nodig om dit te laten werken.,Du trenger en blå Z-nøkkel for å få dette til å fungere!,Potrzebujesz Niebieskiego Klucza Z by zadziałało!,Você precisa de uma Chave-Z azul para fazer isto funcionar!,,Ai nevoie de o Cheie-Z albastră pentru a face asta să funcționeze!,"Не работает, нужен синий Z-образный ключ!",,Du behöver en blå Z-nyckel för att få detta att fungera.,Bunu çalıştırmak için bir Mavi Z-Anahtarına ihtiyacınız var +You need a Red Z-Key to make this work!,PD_REDZKEY,,,,Tohle bude fungovat jen s červeným Z-klíčem.,Du skal bruge en rød Z-nøgle for at få dette til at fungere!,Du brauchst einen roten Z-Schlüssel um das hier zu bedienen.,,Vi bezonas Ruĝan Z-ŝlosilon por funkciigi ĉi tiun!,¡Necesitas una Llave-Z roja para hacer funcionar esto!,,Tarvitset punaisen Z-avaimen saadaksesi tämän toimimaan!,Il vous faut une Z-Clé rouge pour faire fonctionner cela.,,Egy Piros Z-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave Z gialla per accedere a questo oggetto!,アクセスには レッドZ-key が必要だ!,적색 Z-키가 있어야 작동이 가능하다!,Je hebt een rode Z-sleutel nodig om dit te laten werken!,Du trenger en rød Z-nøkkel for å få dette til å fungere!,Potrzebujesz Czerwonego Klucza Z by zadziałało!,Você precisa de uma Chave-Z vermelha para fazer isto funcionar!,,Ai nevoie de o Cheie-Z roșie pentru a face asta să funcționeze!,"Не работает, нужен красный Z-образный ключ!",,Du behöver en röd Z-nyckel för att detta ska fungera!,Bunu çalıştırmak için Kırmızı Z-Anahtarına ihtiyacınız var! +You need a Yellow Z-Key to make this work!,PD_YELWZKEY,,,,Tohle bude fungovat jen se žlutým Z-klíčem.,Du skal bruge en gul Z-nøgle for at få dette til at fungere!,Du brauchst einen gelben Z-Schlüssel um das hier zu bedienen.,,Vi bezonas Flavan Z-ŝlosilon por funkciigi ĉi tiun!,¡Necesitas una Llave-Z amarilla para hacer funcionar esto!,,Tarvitset keltaisen Z-avaimen saadaksesi tämän toimimaan!,Il vous faut une Z-Clé jaune pour faire fonctionner cela.,,Egy Sárga Z-Kulcs szükséges a hozzáféréshez!,Hai bisogno di una chiave Z rossa per accedere a questo oggetto!,アクセスには イエローZ-key が必要だ!,황색 Z-키가 있어야 작동이 가능하다!,Je hebt een gele Z-sleutel nodig om dit te laten werken!,Du trenger en gul Z-nøkkel for å få dette til å fungere!,Potrzebujesz Żółtego Klucza Z by zadziałało!,Você precisa de uma Chave-Z amarela para fazer isto funcionar!,,Ai nevoie de o Cheie-Z galbenă pentru a face asta să funcționeze!,"Не работает, нужен жёлтый Z-образный ключ!",,Du behöver en gul Z-nyckel för att detta ska fungera!,Bunu yapmak için Sarı Z-Anahtarına ihtiyacın var! "Twenty mill in gold doesn't seem worth all this aggravation, does it, hacker? Makes the pen look like a freakin' picnic! @@ -242,7 +242,7 @@ piraté auparavant était comme ça! Il faut que vous trouvez le prochain terminal, traversez le cyberespace, découpez du mutant et barrez-vous -d'ici!","Húsz milka nem ér meg ennyi bosszankodás, ugye hekker? A cella ehhez képest egy francos piknik! +d'ici!",,"Húsz milka nem ér meg ennyi bosszankodás, ugye hekker? A cella ehhez képest egy francos piknik! Baromi ocsmány bio-mutációk és embertársaid úgy lógnak le a mennyezetről, mintha csak a hentesnél lennénk. @@ -536,7 +536,7 @@ Des fluides neuraux humains alimentent ces insectes! Pas de surprise que le coin est désert. Retournez au sous-comité -et faites gaffe à vous!","Hol vannak az emberek? +et faites gaffe à vous!",,"Hol vannak az emberek? Párizs egy szellemváros, kivétel ha a mutáns óriás bogarakat nem vesszük számba mint mintapolgár. @@ -813,7 +813,7 @@ le cul! Ca va en chier! Oh, et l'Or? Non, ça, c'est gratuit... -... A suivre!","A civilizáció mint olyan már nem létezik! +... A suivre!",,"A civilizáció mint olyan már nem létezik! Se barátok, se család. Nincs több ember. Legalábbis nem normális emberek. @@ -1033,7 +1033,7 @@ Vous ne pouvez pas contacter le sous-comité. Cela signifie qu'il est compromis. -Vous.. êtes seul.","Még életben vagy! +Vous.. êtes seul.",,"Még életben vagy! Mik voltak az esélyeid hekkerem?! Még a csapból is a bogarak folynak. @@ -1130,52 +1130,52 @@ anlamına geliyor. Sen... yalnızsın." -,,,,,,,,,,,,,,,,,,,,,,,,,,, -GenEmp Corp.,TXT_HACXMAP01,,,,Sídlo GenEmp,,,,Korporacio GenEmp,,,GenEmp-yhtiö,,,,GenEmpコーポ,ZONE 1: 진엠프 주식회사 본부,,,,,,Corporația GenEmp,Корпорация «ГенИмп»,,, -Tunnel Town,TXT_HACXMAP02,,,,Tunelové město,tunnelbyen,Tunnelstadt,,Tunelo Urbeto,Pueblo Túnel,,Tunnelikaupunki,Ville Tunnel,Kanális Község,Città del tunnel,トンネル タウン,ZONE 2: 터널 도시,Tunnelstad,Tunnelbyen,Miasto Tuneli,Cidade Túnel,,Orașul Subteran,Подземный город,,Tunnelstaden,Tünel Kasabası -Lava Annex,TXT_HACXMAP03,,,,Lávová přístavba,,Lavaanbau,,Lafa Anekso,Anexo de Lava,,Laavalaajennus,Annexe de Lave,Láva Szárny,Annesso di lava,ラバ アネックス,ZONE 3: 용암 속 건물,Lava Bijlage,Lava Vedlegg,Aneks Lawy,Anexo de Lava,,Anexa de Lavă,Лавовая электростанция,,, -Alcatraz,TXT_HACXMAP04,,,,,,,,Alkatrazo,,,,,Alkatraz,,アルカトラズ,ZONE 4: 알카트라즈,,,,,,,Алькатрас,,, -Cyber Circus,TXT_HACXMAP05,,,,Kybercirkus,Cybercirkus,Cyberzirkus,,Cibernetika Cirko,Circo Cibernético,,Kybersirkus,,Kiber Cirkusz,Circo Cyber,サイバーサークル,ZONE 5: 사이버 서커스,,Cyber sirkus,Cyber Cyrk,Circo Cibernético,,Circ Cibernetic,Киберцирк,,Cybercirkus,Siber Sirk -Digi-Ota,TXT_HACXMAP06,,,,,,,,,,,,,,,デジ - オータ,ZONE 6: 디지-오타,,,,,,,Диджитал-Ота,,, -The Great Wall,TXT_HACXMAP07,,,,Velká zeď,Den store mur,Die große Mauer,,La Grandega Muro,La Gran Muralla,,Suuri muuri,La grande Muraille,A Nagy Fal,Il grande muro,ザ - グレート ウォール,ZONE 7: 만리장성,De grote muur,Den kinesiske mur,Wielka Ściana,A Grande Muralha,,Marele Zid,Великая стена,,Den stora muren,Büyük Duvar -Garden of Delights,TXT_HACXMAP08,,,,Zahrada rozkoše,Dejlighedernes have,Lustgarten,,Ĝardeno de Ĝuoj,Jardin de las Delicias,,Nautintojen puutarha,Jardin de Délices,A Gyönyör Kertje,Giardino delle delizie,ガーデン オブ デライト,ZONE 8: 쾌락의 정원,Tuin van lekkernijen,Gledenes hage,Ogród Zachwytu,Jardim dos Prazeres,,Grădina Plăcerilor,Сад наслаждений,,Lustarnas trädgård,Lezzet Bahçesi -Hidden Fortress,TXT_HACXMAP09,,,,Skrytá pevnost,Skjulte fæstning,Versteckte Festung,,Kaŝita Fortreso,Fortaleza Oculta,,Salainen linnoitus,Forteresse Secrète,Eltitkolt Erőd,Fortezza nascosta,ヒドゥン フォートレス,ZONE 9: 숨겨진 요새,Verborgen Vesting,Skjult festning,Ukryta Forteca,Fortaleza Oculta,,Fortăreața Ascunsă,Скрытая крепость,,Dolda fästningen,Gizli Kale -Anarchist Dream,TXT_HACXMAP10,,,,Anarchistův sen,Anarkistisk drøm,Anarchistentraum,,Anarkia Sonĝo,Sueño Anarquista,,Anarkistin unelma,Rève d'Anarchiste,Anarchista Álom,Sogno anarchico,アナーキスト ドリーム,ZONE 10: 아나키스트의 꿈,Anarchistische droom,Anarkistisk drøm,Sen Anarchisty,Sonho Anarquista,,Vis Anarhist,Анархистская утопия,,Anarkistisk dröm,Anarşist Rüya -Notus Us!,TXT_HACXMAP11,,,,,,,,,¡Notus Us!,,Pane merkille mEIdät!,,,,ワレラノ ノータス,ZONE 11: 노터스 어스!,,,,,,Nu ne vor uita!,Нас не забудут!,,, -Gothik Gauntlet,TXT_HACXMAP12,,,,Gotický trest,,,,Gotika Spaliro,Guantelete Gótiko,,Goottinen kujanjuoksu,Gantelet Gothik,Gótikus Vesszőfutás,,ゴシック ガントレット,ZONE 12: 고딕풍 결투장,,Gothik hanske,Gotycka Rękawica,Punição Gótika,,Mănușa Gotică,Готическая перчатка,,Gotik Utmaning, -The Sewers,TXT_HACXMAP13,,,,Kanály,Kloakkerne,Die Kanäle,,La Kanaloj,Las Alcantarillas,,Viemärit,Les Egouts,A Kanális,Le fogne,ザ・サワー,ZONE 13: 하수 처리장,De Riolen,Kloakken,Ścieki,Os Esgotos,,Canale,Канализация,,Avloppen,Kanalizasyonlar -Trode Wars,TXT_HACXMAP14,,,,Válka elektrod,,Elektrodenkrieg,,Milito de Elektrodoj,Guerra de Electrodos,,Trodisodat,Guerre des Trodes,Trode Háborúk,Guerra degli elettrodi,トレード ウォーズ,ZONE 14: 전격의 전쟁,Trode oorlogen,Trode-krigene,Wojna Elektrod,Guerra de Eletrodos,,Război cu Electrozi,Торговые войны,,Elektrodekrig,Elektrot Savaşları -Twilight of Enk's,TXT_HACXMAP15,,,,Soumrak EnKu,Enk's tusmørke,Zwielicht von EnK,,Krespusko de EnK-oj,Crepúsculo de los Enk,,EnKin illankoitto,Crépuscule des Enk's,Enk Alkonya,Crepuscolo di Enk,Enkタチ ノ トワイライト,ZONE 15: 전자황혼,Schemering van Enk's,Skumring av Enk's,Zmierzch Enk,Crepúsculo de Enk's,,Amurgul lui Enk,Сумерки EnK,,Skymning av Enks,Enk'in Alacakaranlığı -Protean Cybex,TXT_HACXMAP16,,,,Proměnlivý Cybex,,Proteanischer Cybex,,Protea Cybex,Cybex Proteico,,Muuntuvainen Kybex,,,,プロテアン サイベックス,ZONE 16: 변화무쌍한 사이벡스,Proteanische Cybex,,Zmienny Cybex,Cybex Proteano,,Cybex Caleidoscopic,Многоликий Сайбэкс,,Proteanska Cybexen, -River of Blood,TXT_HACXMAP17,,,,Řeka krve,Blodets flod,Blutfluss,,Rivero de Sango,Río de Sangre,,Verivirta,Rivière de Sang,Vérfolyó,Fiume di sangue,リバー オブ ブラッド,ZONE 17: 학살의 강,Rivier van bloed,Blodets elv,Rzeka Krwi,Rio de Sangue,,Râu de Sânge,Река крови,,Blodets flod,Kan Nehri -Bizarro,TXT_HACXMAP18,,,,Bizár,,,,,,,,,,,ビザロ,ZONE 18: 요상한 곳,,,,,,,Бизарро,,, -The War Rooms,TXT_HACXMAP19,,,,Válečné kabinety,Krigsrummene,Kriegsräume,,La Militĉambroj,Las Salas de Guerra,,Sotahuoneet,La Salle des Commandes,Háborús Terem,Le stanze della guerra,ザ・ウォー ルーム,ZONE 19: 전략 회의실,De oorlogskamers,Krigsrommene,Pokoje Wojny,As Salas de Comando,,Camerele de Control,Генеральный штаб,,Krigsrummen,Savaş Odaları -Intruder Alert!,TXT_HACXMAP20,,,,"Pozor, vetřelec!",Advarsel om ubudne gæster!,Eindringlingsalarm!,,Alarmo pri Entrudanto!,¡Alerta de Intruso!,,Murtohälytys!,"Alerte, Intrus!",Betolakodó Riadó!,Allarme intruso!,シンニュウシャ アリ!,ZONE 20: 칩입자 경보!,Inbreker alarm!,Inntrengeralarm!,Alarm Intruz!,Alerta de Intruso!,,Alertă Intrus!,Тревога! Нарушитель!,,Inkräktare!,Hırsız Alarmı! -Desiccant Room,TXT_HACXMAP31,,,,Sušící místnost,Tørremiddel-rummet,Trocknungsraum,,Ĉambro de Elsekigo,Sala del Desecante,,Kuivatesali,Salle du Desiccant,Szárító Szoba,Stanza disseccante,ダスキン ルーム,ZONE 31: 건조한 곳,Drogende kamer,Tørkerommet,Śluza Osuszająca,Sala do Dessecante,,Camera Desicanților,Сушильная комната,,Sorptionsmedel rum,Kurutucu Oda +,,,,,,,,,,,,,,,,,,,,,,,,,,,, +GenEmp Corp.,TXT_HACXMAP01,,,,Sídlo GenEmp,,,,Korporacio GenEmp,,,GenEmp-yhtiö,,,,,GenEmpコーポ,ZONE 1: 진엠프 주식회사 본부,,,,,,Corporația GenEmp,Корпорация «ГенИмп»,,, +Tunnel Town,TXT_HACXMAP02,,,,Tunelové město,tunnelbyen,Tunnelstadt,,Tunelo Urbeto,Pueblo Túnel,,Tunnelikaupunki,Ville Tunnel,,Kanális Község,Città del tunnel,トンネル タウン,ZONE 2: 터널 도시,Tunnelstad,Tunnelbyen,Miasto Tuneli,Cidade Túnel,,Orașul Subteran,Подземный город,,Tunnelstaden,Tünel Kasabası +Lava Annex,TXT_HACXMAP03,,,,Lávová přístavba,,Lavaanbau,,Lafa Anekso,Anexo de Lava,,Laavalaajennus,Annexe de Lave,,Láva Szárny,Annesso di lava,ラバ アネックス,ZONE 3: 용암 속 건물,Lava Bijlage,Lava Vedlegg,Aneks Lawy,Anexo de Lava,,Anexa de Lavă,Лавовая электростанция,,, +Alcatraz,TXT_HACXMAP04,,,,,,,,Alkatrazo,,,,,,Alkatraz,,アルカトラズ,ZONE 4: 알카트라즈,,,,,,,Алькатрас,,, +Cyber Circus,TXT_HACXMAP05,,,,Kybercirkus,Cybercirkus,Cyberzirkus,,Cibernetika Cirko,Circo Cibernético,,Kybersirkus,,,Kiber Cirkusz,Circo Cyber,サイバーサークル,ZONE 5: 사이버 서커스,,Cyber sirkus,Cyber Cyrk,Circo Cibernético,,Circ Cibernetic,Киберцирк,,Cybercirkus,Siber Sirk +Digi-Ota,TXT_HACXMAP06,,,,,,,,,,,,,,,,デジ - オータ,ZONE 6: 디지-오타,,,,,,,Диджитал-Ота,,, +The Great Wall,TXT_HACXMAP07,,,,Velká zeď,Den store mur,Die große Mauer,,La Grandega Muro,La Gran Muralla,,Suuri muuri,La grande Muraille,,A Nagy Fal,Il grande muro,ザ - グレート ウォール,ZONE 7: 만리장성,De grote muur,Den kinesiske mur,Wielka Ściana,A Grande Muralha,,Marele Zid,Великая стена,,Den stora muren,Büyük Duvar +Garden of Delights,TXT_HACXMAP08,,,,Zahrada rozkoše,Dejlighedernes have,Lustgarten,,Ĝardeno de Ĝuoj,Jardin de las Delicias,,Nautintojen puutarha,Jardin de Délices,,A Gyönyör Kertje,Giardino delle delizie,ガーデン オブ デライト,ZONE 8: 쾌락의 정원,Tuin van lekkernijen,Gledenes hage,Ogród Zachwytu,Jardim dos Prazeres,,Grădina Plăcerilor,Сад наслаждений,,Lustarnas trädgård,Lezzet Bahçesi +Hidden Fortress,TXT_HACXMAP09,,,,Skrytá pevnost,Skjulte fæstning,Versteckte Festung,,Kaŝita Fortreso,Fortaleza Oculta,,Salainen linnoitus,Forteresse Secrète,,Eltitkolt Erőd,Fortezza nascosta,ヒドゥン フォートレス,ZONE 9: 숨겨진 요새,Verborgen Vesting,Skjult festning,Ukryta Forteca,Fortaleza Oculta,,Fortăreața Ascunsă,Скрытая крепость,,Dolda fästningen,Gizli Kale +Anarchist Dream,TXT_HACXMAP10,,,,Anarchistův sen,Anarkistisk drøm,Anarchistentraum,,Anarkia Sonĝo,Sueño Anarquista,,Anarkistin unelma,Rève d'Anarchiste,,Anarchista Álom,Sogno anarchico,アナーキスト ドリーム,ZONE 10: 아나키스트의 꿈,Anarchistische droom,Anarkistisk drøm,Sen Anarchisty,Sonho Anarquista,,Vis Anarhist,Анархистская утопия,,Anarkistisk dröm,Anarşist Rüya +Notus Us!,TXT_HACXMAP11,,,,,,,,,¡Notus Us!,,Pane merkille mEIdät!,,,,,ワレラノ ノータス,ZONE 11: 노터스 어스!,,,,,,Nu ne vor uita!,Нас не забудут!,,, +Gothik Gauntlet,TXT_HACXMAP12,,,,Gotický trest,,,,Gotika Spaliro,Guantelete Gótiko,,Goottinen kujanjuoksu,Gantelet Gothik,,Gótikus Vesszőfutás,,ゴシック ガントレット,ZONE 12: 고딕풍 결투장,,Gothik hanske,Gotycka Rękawica,Punição Gótika,,Mănușa Gotică,Готическая перчатка,,Gotik Utmaning, +The Sewers,TXT_HACXMAP13,,,,Kanály,Kloakkerne,Die Kanäle,,La Kanaloj,Las Alcantarillas,,Viemärit,Les Egouts,,A Kanális,Le fogne,ザ・サワー,ZONE 13: 하수 처리장,De Riolen,Kloakken,Ścieki,Os Esgotos,,Canale,Канализация,,Avloppen,Kanalizasyonlar +Trode Wars,TXT_HACXMAP14,,,,Válka elektrod,,Elektrodenkrieg,,Milito de Elektrodoj,Guerra de Electrodos,,Trodisodat,Guerre des Trodes,,Trode Háborúk,Guerra degli elettrodi,トレード ウォーズ,ZONE 14: 전격의 전쟁,Trode oorlogen,Trode-krigene,Wojna Elektrod,Guerra de Eletrodos,,Război cu Electrozi,Торговые войны,,Elektrodekrig,Elektrot Savaşları +Twilight of Enk's,TXT_HACXMAP15,,,,Soumrak EnKu,Enk's tusmørke,Zwielicht von EnK,,Krespusko de EnK-oj,Crepúsculo de los Enk,,EnKin illankoitto,Crépuscule des Enk's,,Enk Alkonya,Crepuscolo di Enk,Enkタチ ノ トワイライト,ZONE 15: 전자황혼,Schemering van Enk's,Skumring av Enk's,Zmierzch Enk,Crepúsculo de Enk's,,Amurgul lui Enk,Сумерки EnK,,Skymning av Enks,Enk'in Alacakaranlığı +Protean Cybex,TXT_HACXMAP16,,,,Proměnlivý Cybex,,Proteanischer Cybex,,Protea Cybex,Cybex Proteico,,Muuntuvainen Kybex,,,,,プロテアン サイベックス,ZONE 16: 변화무쌍한 사이벡스,Proteanische Cybex,,Zmienny Cybex,Cybex Proteano,,Cybex Caleidoscopic,Многоликий Сайбэкс,,Proteanska Cybexen, +River of Blood,TXT_HACXMAP17,,,,Řeka krve,Blodets flod,Blutfluss,,Rivero de Sango,Río de Sangre,,Verivirta,Rivière de Sang,,Vérfolyó,Fiume di sangue,リバー オブ ブラッド,ZONE 17: 학살의 강,Rivier van bloed,Blodets elv,Rzeka Krwi,Rio de Sangue,,Râu de Sânge,Река крови,,Blodets flod,Kan Nehri +Bizarro,TXT_HACXMAP18,,,,Bizár,,,,,,,,,,,,ビザロ,ZONE 18: 요상한 곳,,,,,,,Бизарро,,, +The War Rooms,TXT_HACXMAP19,,,,Válečné kabinety,Krigsrummene,Kriegsräume,,La Militĉambroj,Las Salas de Guerra,,Sotahuoneet,La Salle des Commandes,,Háborús Terem,Le stanze della guerra,ザ・ウォー ルーム,ZONE 19: 전략 회의실,De oorlogskamers,Krigsrommene,Pokoje Wojny,As Salas de Comando,,Camerele de Control,Генеральный штаб,,Krigsrummen,Savaş Odaları +Intruder Alert!,TXT_HACXMAP20,,,,"Pozor, vetřelec!",Advarsel om ubudne gæster!,Eindringlingsalarm!,,Alarmo pri Entrudanto!,¡Alerta de Intruso!,,Murtohälytys!,"Alerte, Intrus!",,Betolakodó Riadó!,Allarme intruso!,シンニュウシャ アリ!,ZONE 20: 칩입자 경보!,Inbreker alarm!,Inntrengeralarm!,Alarm Intruz!,Alerta de Intruso!,,Alertă Intrus!,Тревога! Нарушитель!,,Inkräktare!,Hırsız Alarmı! +Desiccant Room,TXT_HACXMAP31,,,,Sušící místnost,Tørremiddel-rummet,Trocknungsraum,,Ĉambro de Elsekigo,Sala del Desecante,,Kuivatesali,Salle du Desiccant,,Szárító Szoba,Stanza disseccante,ダスキン ルーム,ZONE 31: 건조한 곳,Drogende kamer,Tørkerommet,Śluza Osuszająca,Sala do Dessecante,,Camera Desicanților,Сушильная комната,,Sorptionsmedel rum,Kurutucu Oda "Now Arriving At... ",STSTR_CLEV,,,,Příjezd do...,"Nu ankommer vi til... -",Angekommen bei...,,Nun Ĝisirante...,Ahora llegando a...,,Seuraavana...,On arrive maintenant à:,Következő állomás...,Arrivando a...,今到着した...,이동하는 중...,Nu we aankomen bij....,"Nå ankommer... +",Angekommen bei...,,Nun Ĝisirante...,Ahora llegando a...,,Seuraavana...,On arrive maintenant à:,,Következő állomás...,Arrivando a...,今到着した...,이동하는 중...,Nu we aankomen bij....,"Nå ankommer... ",Wchodzisz do...,Agora chegando em ...,,Acum Sosiți La...,Переходим на...,,"Nu anländer vi till... ","Şimdi Geliyor... " -...gonna fry your ass!,STSTR_CHOPPERS,"Printed when entering the idchoppers cheat, which gives the player a chainsaw",,,...ti upeče prdel!,...vil stege din røv!,...ich brate deinen Arsch!,,...fritos vian pugon!,... ¡voy a freirte el trasero!,,...kärtsää takalistosi!,...C'est l'heure de botter du cul!,...indulhat a sütögetés!,....ti friggerà il culo!,...ケツまくれ!,... 지져버리겠어!,...gaat je kont bakken!,...kommer til å steke ræva di!,...skopię ci dupę!,...vou fritar teu rabo!,,...te voi prăji!,...поджарит твою задницу!,,...kommer att steka ditt arsle!,...kıçınızı kızartacak! -"inVuln, Str, Inviso, Rad, Allmap, or Lite-amp?",STSTR_BEHOLD,"Hacx's content here was totally useless so it got removed. However, this string has to be defined and minimally altered so that the Dehacked replacement is not being triggered.",,,"nesmrt(V), Síla, nevId, Rad, mApa nebo světLo","inVuln, Str, Inviso, Rad, Allmap, eller Lite-amp?","inVuln, Str, Inviso, Rad, Allmap, oder Lite-amp",,"inVuln, Str, Inviso, Rad, Allmap, aŭ Lite-amp?","inVuln, Str, Inviso, Rad, Allmap, o Lite-amp.",,"haavoittumattomuus (V), voima (S), näkymättömyys (I), koko kartta (A) tai valonvahvistus (L)?","in V ulnérable, S urpuissance, I nvisible, p R otection, c A rte, où L umière?","Sérthet (V), Berz (S), Láthat(i), Sugár(R), Térkép(A), vagy Fény Sisak(L)","inVuln, berSerk, Invisib, tuta anti-Rad, mAppa tutta, o amplif-Luce","V,I,S,R,A,Lのどれだ?","무적, 광전사, 투명, 보호복, 지도, 아니면 바이저?",,"inVuln, Str, Inviso, Rad, Allmap eller Lite-amp?","niezniszczalność (V), siła (S), niewidzialność (I), kombinezon (R), mapa (A) lub gogle noktowizyjne (L)","inVuln., berSerk, Invisib., anti-Rad., mApa completo ou amplificação de Luz",,"inVul, Forță ampl, Invizib, Hartă compl, sau Vedere amplificată?","Бессм. (V), берс. (S), нев. (I), кос. (R), крт. (A), виз (L).","нерањ., снага, невидљ., радиј., мапа или ноћ. визор","inVuln, Str, Inviso, Rad, Allmap eller Lite-amp?","inVuln, Str, Inviso, Rad, Allmap veya Lite-amp?" -Let's Get Serious!,STSTR_BEHOLDX,,,,Teď je to vážné!,Lad os blive seriøse!,Es wird ernst!,,Ni Serioziĝu!,¡Vamos en Serio!,,Otetaanpa tosissaan!,Passons aux choses sérieuses!,Ennek fele sem Tréfa!,Prendiamoci sul serio!,マジになったぜ!,철들 때다!,Laten we serieus worden!,La oss bli seriøse!,Bądźmy Poważni!,Agora a Coisa Fica Séria!,,Să Devenim Serioși!,А теперь серьёзно!,,Nu blir det allvar!,Ciddileşelim! -Cyberslicer Mode ON,STSTR_NCON,,,,Režim kybersekače ZAP,Cyberslicer tilstand TIL,Cyberschnetzelmodus AN,,Cibernetika Tranĉila Reĝimo AKTIVA,Modo Cibercorte ACTIVADO,,Kyberviipaloijatila PÄÄLLÄ,,Kibervágó Mód BE,Modalità Cyberslicer ATTIVADA,サイバースライサーモード オン,전자마귀 모드 ON,Cyberslicer-modus AAN,Cyberslicer-modus PÅ,Tryb Cybercięcia WŁĄCZONY,Cibercortador ATIVADO,,Modul Cibertăietor ACTIVAT,Режим киберрезака ВКЛЮЧЁН,,Cyberslicer-läge PÅ,Siber dilimleyici Modu AÇIK -Cyberslicer Mode OFF,STSTR_NCOFF,,,,Režim kybersekače VYP,Cyberslicer tilstand FRA,Cyberschnetzelmodus AUS,,Cibernetika Tranĉila Reĝimo NEAKTIVA,Modo Cibercorte DESACTIVADO,,Kyberviipaloijatila POIS PÄÄLTÄ,,Kibervágó Mód KI,Modalità Cyberslicer DISATTIVADA,サイバースライサーモード オフ,전자마귀 모드 OFF,Cyberslicer-modus UIT,Cyberslicer-modus AV,Tryb Cybercięcia WYŁĄCZONY,Cibercortador DESATIVADO,,Modul Cibertăietor DEZACTIVAT,Режим киберрезака ОТКЛЮЧЁН,,Cyberslicer-läge AV,Siber dilimleyici Modu KAPALI -Selection: Impossible ,STSTR_NOMUS,,,,Nemožný výběr,Forkert valg,Falsche Auswahl,,Elekto: Malebla,Selección impossible,,Valinta ei mahdollinen,Séléction Impossible!,Lehetetlen Kiválasztás,Selezione impossibile,選択: 不可能,선택 불가능,Selectie: Onmogelijk,Valg: Umulig,Niemożliwy wybór,Seleção: Impossível,,Selectare: Imposibilă,Выбор: Невозможен,НЕМОГУЋИ ИЗБОР,Urval: Impossible,Seçim: İmkansız +...gonna fry your ass!,STSTR_CHOPPERS,"Printed when entering the idchoppers cheat, which gives the player a chainsaw",,,...ti upeče prdel!,...vil stege din røv!,...ich brate deinen Arsch!,,...fritos vian pugon!,... ¡voy a freirte el trasero!,,...kärtsää takalistosi!,...C'est l'heure de botter du cul!,,...indulhat a sütögetés!,....ti friggerà il culo!,...ケツまくれ!,... 지져버리겠어!,...gaat je kont bakken!,...kommer til å steke ræva di!,...skopię ci dupę!,...vou fritar teu rabo!,,...te voi prăji!,...поджарит твою задницу!,,...kommer att steka ditt arsle!,...kıçınızı kızartacak! +"inVuln, Str, Inviso, Rad, Allmap, or Lite-amp?",STSTR_BEHOLD,"Hacx's content here was totally useless so it got removed. However, this string has to be defined and minimally altered so that the Dehacked replacement is not being triggered.",,,"nesmrt(V), Síla, nevId, Rad, mApa nebo světLo","inVuln, Str, Inviso, Rad, Allmap, eller Lite-amp?","inVuln, Str, Inviso, Rad, Allmap, oder Lite-amp",,"inVuln, Str, Inviso, Rad, Allmap, aŭ Lite-amp?","inVuln, Str, Inviso, Rad, Allmap, o Lite-amp.",,"haavoittumattomuus (V), voima (S), näkymättömyys (I), koko kartta (A) tai valonvahvistus (L)?","in V ulnérable, S urpuissance, I nvisible, p R otection, c A rte, où L umière?",,"Sérthet (V), Berz (S), Láthat(i), Sugár(R), Térkép(A), vagy Fény Sisak(L)","inVuln, berSerk, Invisib, tuta anti-Rad, mAppa tutta, o amplif-Luce","V,I,S,R,A,Lのどれだ?","무적, 광전사, 투명, 보호복, 지도, 아니면 바이저?",,"inVuln, Str, Inviso, Rad, Allmap eller Lite-amp?","niezniszczalność (V), siła (S), niewidzialność (I), kombinezon (R), mapa (A) lub gogle noktowizyjne (L)","inVuln., berSerk, Invisib., anti-Rad., mApa completo ou amplificação de Luz",,"inVul, Forță ampl, Invizib, Hartă compl, sau Vedere amplificată?","Бессм. (V), берс. (S), нев. (I), кос. (R), крт. (A), виз (L).","нерањ., снага, невидљ., радиј., мапа или ноћ. визор","inVuln, Str, Inviso, Rad, Allmap eller Lite-amp?","inVuln, Str, Inviso, Rad, Allmap veya Lite-amp?" +Let's Get Serious!,STSTR_BEHOLDX,,,,Teď je to vážné!,Lad os blive seriøse!,Es wird ernst!,,Ni Serioziĝu!,¡Vamos en Serio!,,Otetaanpa tosissaan!,Passons aux choses sérieuses!,,Ennek fele sem Tréfa!,Prendiamoci sul serio!,マジになったぜ!,철들 때다!,Laten we serieus worden!,La oss bli seriøse!,Bądźmy Poważni!,Agora a Coisa Fica Séria!,,Să Devenim Serioși!,А теперь серьёзно!,,Nu blir det allvar!,Ciddileşelim! +Cyberslicer Mode ON,STSTR_NCON,,,,Režim kybersekače ZAP,Cyberslicer tilstand TIL,Cyberschnetzelmodus AN,,Cibernetika Tranĉila Reĝimo AKTIVA,Modo Cibercorte ACTIVADO,,Kyberviipaloijatila PÄÄLLÄ,,,Kibervágó Mód BE,Modalità Cyberslicer ATTIVADA,サイバースライサーモード オン,전자마귀 모드 ON,Cyberslicer-modus AAN,Cyberslicer-modus PÅ,Tryb Cybercięcia WŁĄCZONY,Cibercortador ATIVADO,,Modul Cibertăietor ACTIVAT,Режим киберрезака ВКЛЮЧЁН,,Cyberslicer-läge PÅ,Siber dilimleyici Modu AÇIK +Cyberslicer Mode OFF,STSTR_NCOFF,,,,Režim kybersekače VYP,Cyberslicer tilstand FRA,Cyberschnetzelmodus AUS,,Cibernetika Tranĉila Reĝimo NEAKTIVA,Modo Cibercorte DESACTIVADO,,Kyberviipaloijatila POIS PÄÄLTÄ,,,Kibervágó Mód KI,Modalità Cyberslicer DISATTIVADA,サイバースライサーモード オフ,전자마귀 모드 OFF,Cyberslicer-modus UIT,Cyberslicer-modus AV,Tryb Cybercięcia WYŁĄCZONY,Cibercortador DESATIVADO,,Modul Cibertăietor DEZACTIVAT,Режим киберрезака ОТКЛЮЧЁН,,Cyberslicer-läge AV,Siber dilimleyici Modu KAPALI +Selection: Impossible ,STSTR_NOMUS,,,,Nemožný výběr,Forkert valg,Falsche Auswahl,,Elekto: Malebla,Selección impossible,,Valinta ei mahdollinen,Séléction Impossible!,,Lehetetlen Kiválasztás,Selezione impossibile,選択: 不可能,선택 불가능,Selectie: Onmogelijk,Valg: Umulig,Niemożliwy wybór,Seleção: Impossível,,Selectare: Imposibilă,Выбор: Невозможен,НЕМОГУЋИ ИЗБОР,Urval: Impossible,Seçim: İmkansız "Pump Up The Volume -",STSTR_MUS,Should probably not be translated...,,,Zesil to!,,,,,,,Nuppi kaakkoon,,Csavard Fel a Szőnyeget,,音量を上げろよ,볼륨을 올려라!,,"Pump opp volumet +",STSTR_MUS,Should probably not be translated...,,,Zesil to!,,,,,,,Nuppi kaakkoon,,,Csavard Fel a Szőnyeget,,音量を上げろよ,볼륨을 올려라!,,"Pump opp volumet ",Podkręć Audio,"Som na Caixa, DJ!",,Mărește Volumul,Подкрутите громкость,,"Pumpa upp volymen ","Sesi Yükseltin " -INIT-Twitch n'Kill Mode,STSTR_KFAADDED,,,,Inicializuji režim Twitch and Kill,INIT-Twitch n'Kill Mode,Initiiere Twitch'n Kill-Modus,,INIC-Modo de Tiku kaj Buĉu,INIT-Modo Tirar a Matar,,INIT-Nykäise ja nylje -tila,,Twitch n'Kill Mód Betöltése,Iniziare Twitch n'Kill Mode,INIT-Twitch n'Killモード,때리고 죽이는 모드 ON,,INIT-Twitch n'Kill-modus,Inicjacja Trybu Drżenia I Zabijania,Inicializando Modo Chumbo Grosso,,INIT-Modul Click-și-Elimină,ИНИЦ: режим «Дрожи и убивай»,,INIT-Twitch n'Kill Mode,INIT-Twitch n'Kill Modu -"So be it, Hacker.",STSTR_FAADDED,,,,"Budiž, Hackeře.","Sådan skal det være, Hacker.","So sei es, Hacker.",,"Tiel estu, Kodrompisto.","Que así sea, Hacker.",,"Olkoon niin, hakkeri.","Qu'il en soit ainsi, hacker.","Akkor hát legyen, hekker.","Cosi' sia, Hacker.",好きにしろ、ハッカー。,"마음대로 해, 해커 양반.","Het zij zo, Hacker.","Som du vil, Hacker.","Niech tak będzie, Hakerze.","Que assim seja, Hacker.",,"Așa să fie, Hacker.","Да будет так, хакер.",,"Så får det bli, Hacker.","Öyle olsun, Hacker." -Cyberpotence Mode ON,STSTR_DQDON,,,,Režim kybermoci ZAP,Cyberpotens-tilstand TIL,Cyberpotenzmodus AN,,Cibernetikpova Reĝimo AKTIVA,Modo Ciberpotencia ACTIVADO,,Kyberpotenssitila PÄÄLLÄ,,Kibererő Mód BE,Modo Cyberpotenza ATTIVADA,サイバーポテンスモード オン,전지전능 모드 ON,Cyberpotentiemodus AAN,Cyberpotensmodus PÅ,Tryb Cyberpotencji WŁĄCZONY,Ciberpotência ATIVADA,,Ciberpotență ACTIVATĂ,Режим киберулучшения ВКЛЮЧЁН,,Cyberpotens-läge PÅ,Siber güç Modu AÇIK -Cyberpotence Mode OFF,STSTR_DQDOFF,,,,Režim kybermoci VYP,Cyberpotens-tilstand FRA,Cyberpotenzmodus AUS,,Cibernetikpova Reĝimo NEAKTIVA,Modo Ciberpotencia DESACTIVADO,,Kyberpotenssitila POIS PÄÄLTÄ,,Kibererő Mód KI,Modo Cyberpotenza DISATTIVADA,サイバーポテンスモード オフ,전지전능 모드 OFF,Cyberpotentiemodus UIT,Cyberpotensmodus AV,Tryb Cyberpotencji WYŁĄCZONY,Ciberpotência DESATIVADA,,Ciberpotență DEZACTIVATĂ,Режим киберулучшения ОТКЛЮЧЁН,,Cyberpotens-läge AV,Siber güç Modu KAPALI -Tracking ON,AMSTR_FOLLOWON,,,,Sledování ZAP,Sporing TIL,Verfolgung AN,,Spurdado AKTIVA,Seguimiento ACTIVADO,,Seuranta PÄÄLLÄ,,Követés BE,Mappa scorribile DISATTIVATA,トラッキング オン,추적 모드 ON,Tracking AAN,Sporing PÅ,Namierzanie WŁĄCZONE,Seguimento ATIVADO,,Urmărire ACTIVATĂ,Сопровождение ВКЛЮЧЕНО,,Spårning PÅ,İzleme AÇIK -Tracking OFF,AMSTR_FOLLOWOFF,,,,Sledování VYP,Sporing FRA,Verfolgung AUS,,Spurdado NEAKTIVA,Seguimiento DESACTIVADO,,Seuranta POIS PÄÄLTÄ,,Követés KI,Mappa scorribile ATTIVATA,トラッキング オフ,추적 모드 OFF,Tracking UIT,Sporing AV,Namierzanie WYŁĄCZONE,Seguimento DESATIVADO,,Urmărire DEZACTIVATĂ,Сопровождение ОТКЛЮЧЕНО,,Spårning AV,İzleme KAPALI -- press Y to run away! -,DOSY,,,,- stiskni Y pro útěk! -,- Tryk på Y for at løbe væk! -,- drücke Y um wegzurennen -,,- premu Y por forkuri! -,- ¡pulsa Y para escapar! - ,,- Paina Y paetaksesi! -,-Appuie sur Y pour t'échapper!-,- nyomj Y-t a nyúlcipő felhúzáshoz -,- premere Y per scappare! -,-Y でトンズラだ!-,- 달아날려먼 Y 키를 눌러! -,- druk op Y om weg te lopen! -,- trykk Y for å stikke av! -,- wciśnij Y by uciec! -,- Aperte Y para fugir! -,- Carrega Y para fugir! -,- apasă Y pentru a fugi! -,"- нажми «Y», чтобы сбежать! -",,- Tryck på Y för att springa iväg! -,- Kaçmak için Y'ye basın! - +INIT-Twitch n'Kill Mode,STSTR_KFAADDED,,,,Inicializuji režim Twitch and Kill,INIT-Twitch n'Kill Mode,Initiiere Twitch'n Kill-Modus,,INIC-Modo de Tiku kaj Buĉu,INIT-Modo Tirar a Matar,,INIT-Nykäise ja nylje -tila,,,Twitch n'Kill Mód Betöltése,Iniziare Twitch n'Kill Mode,INIT-Twitch n'Killモード,때리고 죽이는 모드 ON,,INIT-Twitch n'Kill-modus,Inicjacja Trybu Drżenia I Zabijania,Inicializando Modo Chumbo Grosso,,INIT-Modul Click-și-Elimină,ИНИЦ: режим «Дрожи и убивай»,,INIT-Twitch n'Kill Mode,INIT-Twitch n'Kill Modu +"So be it, Hacker.",STSTR_FAADDED,,,,"Budiž, Hackeře.","Sådan skal det være, Hacker.","So sei es, Hacker.",,"Tiel estu, Kodrompisto.","Que así sea, Hacker.",,"Olkoon niin, hakkeri.","Qu'il en soit ainsi, hacker.",,"Akkor hát legyen, hekker.","Cosi' sia, Hacker.",好きにしろ、ハッカー。,"마음대로 해, 해커 양반.","Het zij zo, Hacker.","Som du vil, Hacker.","Niech tak będzie, Hakerze.","Que assim seja, Hacker.",,"Așa să fie, Hacker.","Да будет так, хакер.",,"Så får det bli, Hacker.","Öyle olsun, Hacker." +Cyberpotence Mode ON,STSTR_DQDON,,,,Režim kybermoci ZAP,Cyberpotens-tilstand TIL,Cyberpotenzmodus AN,,Cibernetikpova Reĝimo AKTIVA,Modo Ciberpotencia ACTIVADO,,Kyberpotenssitila PÄÄLLÄ,,,Kibererő Mód BE,Modo Cyberpotenza ATTIVADA,サイバーポテンスモード オン,전지전능 모드 ON,Cyberpotentiemodus AAN,Cyberpotensmodus PÅ,Tryb Cyberpotencji WŁĄCZONY,Ciberpotência ATIVADA,,Ciberpotență ACTIVATĂ,Режим киберулучшения ВКЛЮЧЁН,,Cyberpotens-läge PÅ,Siber güç Modu AÇIK +Cyberpotence Mode OFF,STSTR_DQDOFF,,,,Režim kybermoci VYP,Cyberpotens-tilstand FRA,Cyberpotenzmodus AUS,,Cibernetikpova Reĝimo NEAKTIVA,Modo Ciberpotencia DESACTIVADO,,Kyberpotenssitila POIS PÄÄLTÄ,,,Kibererő Mód KI,Modo Cyberpotenza DISATTIVADA,サイバーポテンスモード オフ,전지전능 모드 OFF,Cyberpotentiemodus UIT,Cyberpotensmodus AV,Tryb Cyberpotencji WYŁĄCZONY,Ciberpotência DESATIVADA,,Ciberpotență DEZACTIVATĂ,Режим киберулучшения ОТКЛЮЧЁН,,Cyberpotens-läge AV,Siber güç Modu KAPALI +Tracking ON,AMSTR_FOLLOWON,,,,Sledování ZAP,Sporing TIL,Verfolgung AN,,Spurdado AKTIVA,Seguimiento ACTIVADO,,Seuranta PÄÄLLÄ,,,Követés BE,Mappa scorribile DISATTIVATA,トラッキング オン,추적 모드 ON,Tracking AAN,Sporing PÅ,Namierzanie WŁĄCZONE,Seguimento ATIVADO,,Urmărire ACTIVATĂ,Сопровождение ВКЛЮЧЕНО,,Spårning PÅ,İzleme AÇIK +Tracking OFF,AMSTR_FOLLOWOFF,,,,Sledování VYP,Sporing FRA,Verfolgung AUS,,Spurdado NEAKTIVA,Seguimiento DESACTIVADO,,Seuranta POIS PÄÄLTÄ,,,Követés KI,Mappa scorribile ATTIVATA,トラッキング オフ,추적 모드 OFF,Tracking UIT,Sporing AV,Namierzanie WYŁĄCZONE,Seguimento DESATIVADO,,Urmărire DEZACTIVATĂ,Сопровождение ОТКЛЮЧЕНО,,Spårning AV,İzleme KAPALI +- press Y to run away! -,DOSY,,,,- stiskni Y pro útěk! -,- Tryk på Y for at løbe væk! -,- drücke Y um wegzurennen -,,- premu Y por forkuri! -,- ¡pulsa Y para escapar! - ,,- Paina Y paetaksesi! -,-Appuie sur Y pour t'échapper!-,,- nyomj Y-t a nyúlcipő felhúzáshoz -,- premere Y per scappare! -,-Y でトンズラだ!-,- 달아날려먼 Y 키를 눌러! -,- druk op Y om weg te lopen! -,- trykk Y for å stikke av! -,- wciśnij Y by uciec! -,- Aperte Y para fugir! -,- Carrega Y para fugir! -,- apasă Y pentru a fugi! -,"- нажми «Y», чтобы сбежать! -",,- Tryck på Y för att springa iväg! -,- Kaçmak için Y'ye basın! - "Are you insane or maladjusted? Well? Yes or No!",ENDGAME,,,,"Jsi blb@[adj_cs] nebo jen naveden@[adj_cs]? Tak? Jo nebo ne?","Er du sindssyg eller utilpasset? @@ -1183,7 +1183,7 @@ Nå? Ja eller nej!","Bist du verrückt oder mies gelaunt? Also? Ja oer Nein?",,"Ĉu vi estas freneza aŭ misagordita? Ĉu? Jes aŭ Ne!?","¿Estás loc@[ao_esp] o descolocad@[ao_esp]? ¿Y bien? ¿Sí o No?",,"Oletko hullu tai häiriintynyt? -No? Y tai N!",Vous êtes fou où malajusté? Eh bien? Oui où non?,"Őrült vagy, vagy csak simán rosszul vagy összerakva? Nos? Igen vagy Nem!","Sei pazzo o disadattato? +No? Y tai N!",Vous êtes fou où malajusté? Eh bien? Oui où non?,,"Őrült vagy, vagy csak simán rosszul vagy összerakva? Nos? Igen vagy Nem!","Sei pazzo o disadattato? Allora? Sì o no!","お前はイカれた社会不適合者だろ? あぁ?イエスかノーか言え!","부적응은 안 하겠지? 그렇겠지? 자신 있으면 선택해!","Ben je gek of onaangepast? @@ -1213,7 +1213,7 @@ tätä taitotasoa, hakkeri! Paina Y kuollaksesi. ","Vous êtes sûr? Vous n'arriverez pas à tenir le coup, hacker! -Appuyez sur Y pour mourir.","Biztos vagy benne? Nem hinném hogy elbírsz ezzel a fokozattal hekker. +Appuyez sur Y pour mourir.",,"Biztos vagy benne? Nem hinném hogy elbírsz ezzel a fokozattal hekker. Nyomj Y-t a halálhoz.","Sei sicuro? Non puoi gestire questa abilità, hacker! @@ -1269,7 +1269,7 @@ Paina Y tai N.","Sauvegarde rapide sur le fichier '%s'? -Appuyez sur Y ou N.","Gyorsmenteni akarsz az alábbi mentésed alatt +Appuyez sur Y ou N.",,"Gyorsmenteni akarsz az alábbi mentésed alatt '%s'? @@ -1344,7 +1344,7 @@ Paina Y tai N.","Voulez-vous charger la sauvegarde '%s'? -Appuyez sur Y ou N.","Gyorstölteni akarod ezt a mentést +Appuyez sur Y ou N.",,"Gyorstölteni akarod ezt a mentést '%s'? @@ -1389,20 +1389,20 @@ Apasă Y sau N.","Загрузить файл „%s“? Притисните Y или N.",, -Thug,CC_THUG,,,,Pobuda,Bølle,Scherge,,Perfortuloj,Matón,,Roisto,Brute,Bandatag,Tazza,チンピラ,서그,Schurk,Kjeltring,Zbir,Bandido,,Bandit,Головорез,,Buse,Eşkıya -Android,CC_ANDROID,,,,,,,,Androido,Androide,,Androidi,Androïde,,,アンドロイド,안드로이드,Androïde,,,Andróide,,,Андроид,,, -ICE,CC_ICE,,,,,,,,,,,,,,,アイス,아이스,,,,,,,ЛЁД,,,BUZ -Buzzer,CC_BUZZER,,,,Bzučák,,Summer,,Zumilo,Zumbador,,Surisija,,Sokkoló,Cicalino,ブザー,버저,Zoemer,Summer,Brzęczyk,,,Dronă,Летун,,Summer,Şok Uçağı -D-Man,CC_DMAN,,,,,,,,D-Vir',,,D-mies,,,,,디-맨,,,,,,,Ди-Мэн,,, -Phage,CC_PHAGE,,,,Fág,,,,Faĝo,Fago,,Fagi,,Fekély,Fago,ファージ,페이지,Faag,Phage,Fag,Fago,,Mâncător,Пожиратель,,,Faj -Monstruct,CC_MONSTRUCT,,,,Monstrukce,,Monstrukt,,Monstrukto,,,Keinohirviö,,Monstrum,Mostrutto,モンストラクト,몬스트럭트,Monstructie,,Monstrukt,,,,Монструкт,,, -Mecha Maniac,CC_MECH,,,,Mechamaniak,,,,Mekanika Frenezulo,Meca-Maníaco,,Mechamaanikko,Mécha-maniaque,Mecha Megszállott,Mecha Maniaco,メカマニア,메카 메니악,Mecha Maniak,,Mechaniczny Maniak,Meca-Maníaco,,Meca-Maniac,Механоман,,,Meka Manyağı -Terminatrix,CC_TERMI,,,,,,,,,,,,,,,ターミネイトリクス,터미네트릭스,,,,,,,Терминатриса,,, -Thorn Thing,CC_THORN,,,,Bodlák,Torn ting,Dornending,,Dorna Aĵo,Cosa Espinosa,,Okaolio,Truc épineux,Tövis Úrnő,,ソーンツィン,쏜 씽,Doornding,Torneting,Cierniowe Coś,Coisa Espinhosa,,Spinos,Тернистая тварь,,Tornen ting,Dikenli Şey -Majong 7,CC_MAJONG,,,,,,,,Maĝango 7,,,Mahjong 7,,,,マージャン 7,마작 7호,,,,,,,Маджонг 7,,, -Dan Evanger,CC_HERO,,,,,,,,Dan Evanĝer,,,,,,,ダン エブァンガー,댄 에반저,,,,,,,Дэн Эвенджер,,, -Please don't shoot!,SKILL_BABY,,,,"Nestřílej, prosím!",Lad være med at skyde!,Bitte schieß nicht!,,Bonvolu ne pafi!,¡Por favor no dispares!,,"Pyydän, älä ammu!","Pitié, ne tirez pas!",Kérlek ne lőj!,"Ti prego, non sparare!",撃たないでくれ!,쏘지 마세요!,"Niet schieten, alsjeblieft!","Vær så snill, ikke skyt!",Proszę nie strzelaj!,"Por favor, não atire!",,Te rog nu trage!,"Не стреляй, пожалуйста!",,"Snälla, skjut inte!",Lütfen ateş etmeyin! -"Aargh, I need health!",SKILL_EASY,,,,Potřebuju zdraví!,"Aargh, jeg har brug for sundhed!",Ich brauche Gesundheit!,,"Aargh, mi bezonas sanon!","¡Aargh, necesito salud!",,"Aargh, tarvitsen terveyttä!","Aargh, des soins!","Á, kell egy kis életerő!","Aargh, ho bisogno di salute!",キメてくれ!,체력이 필요해!,"Aargh, ik heb gezondheid nodig!","Aargh, jeg trenger helse!","Ałć, potrzebuję apteczki!","Aargh, preciso de saúde!",,"Aarș, am nevoie de un medic!","А-а-ргх, аптечку!",,"Aargh, jag behöver hälsa!","Aargh, sağlığa ihtiyacım var!" -Let's rip them apart!,SKILL_NORMAL,,,,Rozsekejme je na kusy!,Lad os flå dem i stykker!,Lass uns sie zerfetzen!,,Ni disŝiru ilin!,¡Rompámoslos en pedazos!,,Revitään ne kappaleiksi!,J'en fais de la bouillie!,Tépjük csak szét őket!,Facciamoli a pezzi!,ばらまいてやれ!,갈기갈기 찢어버려!,Laten we ze uit elkaar scheuren!,La oss rive dem i filler!,Czas ich rozerwać!,Vamos despedaçá-los!,,Să-i facem zob!,Разорвём их на куски!,,Låt oss slita dem i bitar!,Hadi onları parçalayalım! -I am immortal!,SKILL_HARD,,,,Jsem nesmrtelný!,Jeg er udødelig!,Ich bin unsterblich!,,Mi estas senmorta!,¡Soy inmortal!,,Olen kuolemation!,Je suis immortel!,Halhatatlan vagyok!,Sono immortale!,とっととくたばれ!,난 무적이다!,Ik ben onsterfelijk!,Jeg er udødelig!,Jestem nieśmiertelny!,Eu sou imortal!,,Sunt nemuritor!,Я бессмертен!,,Jag är odödlig!,Ben ölümsüzüm! -Insanity!,SKILL_NIGHTMARE,,,,Šílenství!,Sindssyge!,Wahnsinn!,,Frenezo!,¡Locura!,,Mielettömyys!,Folie!,Téboly!,Follia!,イカれてやがる!,코드명: 광기!,Waanzin!,Galskap!,Szaleństwo!,Insanidade!,,Demență!,Безумие!,,Galenskap!,Delilik! \ No newline at end of file +Thug,CC_THUG,,,,Pobuda,Bølle,Scherge,,Perfortuloj,Matón,,Roisto,Brute,,Bandatag,Tazza,チンピラ,서그,Schurk,Kjeltring,Zbir,Bandido,,Bandit,Головорез,,Buse,Eşkıya +Android,CC_ANDROID,,,,,,,,Androido,Androide,,Androidi,Androïde,,,,アンドロイド,안드로이드,Androïde,,,Andróide,,,Андроид,,, +ICE,CC_ICE,,,,,,,,,,,,,,,,アイス,아이스,,,,,,,ЛЁД,,,BUZ +Buzzer,CC_BUZZER,,,,Bzučák,,Summer,,Zumilo,Zumbador,,Surisija,,,Sokkoló,Cicalino,ブザー,버저,Zoemer,Summer,Brzęczyk,,,Dronă,Летун,,Summer,Şok Uçağı +D-Man,CC_DMAN,,,,,,,,D-Vir',,,D-mies,,,,,,디-맨,,,,,,,Ди-Мэн,,, +Phage,CC_PHAGE,,,,Fág,,,,Faĝo,Fago,,Fagi,,,Fekély,Fago,ファージ,페이지,Faag,Phage,Fag,Fago,,Mâncător,Пожиратель,,,Faj +Monstruct,CC_MONSTRUCT,,,,Monstrukce,,Monstrukt,,Monstrukto,,,Keinohirviö,,,Monstrum,Mostrutto,モンストラクト,몬스트럭트,Monstructie,,Monstrukt,,,,Монструкт,,, +Mecha Maniac,CC_MECH,,,,Mechamaniak,,,,Mekanika Frenezulo,Meca-Maníaco,,Mechamaanikko,Mécha-maniaque,,Mecha Megszállott,Mecha Maniaco,メカマニア,메카 메니악,Mecha Maniak,,Mechaniczny Maniak,Meca-Maníaco,,Meca-Maniac,Механоман,,,Meka Manyağı +Terminatrix,CC_TERMI,,,,,,,,,,,,,,,,ターミネイトリクス,터미네트릭스,,,,,,,Терминатриса,,, +Thorn Thing,CC_THORN,,,,Bodlák,Torn ting,Dornending,,Dorna Aĵo,Cosa Espinosa,,Okaolio,Truc épineux,,Tövis Úrnő,,ソーンツィン,쏜 씽,Doornding,Torneting,Cierniowe Coś,Coisa Espinhosa,,Spinos,Тернистая тварь,,Tornen ting,Dikenli Şey +Majong 7,CC_MAJONG,,,,,,,,Maĝango 7,,,Mahjong 7,,,,,マージャン 7,마작 7호,,,,,,,Маджонг 7,,, +Dan Evanger,CC_HERO,,,,,,,,Dan Evanĝer,,,,,,,,ダン エブァンガー,댄 에반저,,,,,,,Дэн Эвенджер,,, +Please don't shoot!,SKILL_BABY,,,,"Nestřílej, prosím!",Lad være med at skyde!,Bitte schieß nicht!,,Bonvolu ne pafi!,¡Por favor no dispares!,,"Pyydän, älä ammu!","Pitié, ne tirez pas!",,Kérlek ne lőj!,"Ti prego, non sparare!",撃たないでくれ!,쏘지 마세요!,"Niet schieten, alsjeblieft!","Vær så snill, ikke skyt!",Proszę nie strzelaj!,"Por favor, não atire!",,Te rog nu trage!,"Не стреляй, пожалуйста!",,"Snälla, skjut inte!",Lütfen ateş etmeyin! +"Aargh, I need health!",SKILL_EASY,,,,Potřebuju zdraví!,"Aargh, jeg har brug for sundhed!",Ich brauche Gesundheit!,,"Aargh, mi bezonas sanon!","¡Aargh, necesito salud!",,"Aargh, tarvitsen terveyttä!","Aargh, des soins!",,"Á, kell egy kis életerő!","Aargh, ho bisogno di salute!",キメてくれ!,체력이 필요해!,"Aargh, ik heb gezondheid nodig!","Aargh, jeg trenger helse!","Ałć, potrzebuję apteczki!","Aargh, preciso de saúde!",,"Aarș, am nevoie de un medic!","А-а-ргх, аптечку!",,"Aargh, jag behöver hälsa!","Aargh, sağlığa ihtiyacım var!" +Let's rip them apart!,SKILL_NORMAL,,,,Rozsekejme je na kusy!,Lad os flå dem i stykker!,Lass uns sie zerfetzen!,,Ni disŝiru ilin!,¡Rompámoslos en pedazos!,,Revitään ne kappaleiksi!,J'en fais de la bouillie!,,Tépjük csak szét őket!,Facciamoli a pezzi!,ばらまいてやれ!,갈기갈기 찢어버려!,Laten we ze uit elkaar scheuren!,La oss rive dem i filler!,Czas ich rozerwać!,Vamos despedaçá-los!,,Să-i facem zob!,Разорвём их на куски!,,Låt oss slita dem i bitar!,Hadi onları parçalayalım! +I am immortal!,SKILL_HARD,,,,Jsem nesmrtelný!,Jeg er udødelig!,Ich bin unsterblich!,,Mi estas senmorta!,¡Soy inmortal!,,Olen kuolemation!,Je suis immortel!,,Halhatatlan vagyok!,Sono immortale!,とっととくたばれ!,난 무적이다!,Ik ben onsterfelijk!,Jeg er udødelig!,Jestem nieśmiertelny!,Eu sou imortal!,,Sunt nemuritor!,Я бессмертен!,,Jag är odödlig!,Ben ölümsüzüm! +Insanity!,SKILL_NIGHTMARE,,,,Šílenství!,Sindssyge!,Wahnsinn!,,Frenezo!,¡Locura!,,Mielettömyys!,Folie!,,Téboly!,Follia!,イカれてやがる!,코드명: 광기!,Waanzin!,Galskap!,Szaleństwo!,Insanidade!,,Demență!,Безумие!,,Galenskap!,Delilik! \ No newline at end of file diff --git a/wadsrc_extra/static/filter/harmony/language.csv b/wadsrc_extra/static/filter/harmony/language.csv index 2343c0cec..79e78392c 100644 --- a/wadsrc_extra/static/filter/harmony/language.csv +++ b/wadsrc_extra/static/filter/harmony/language.csv @@ -1,4 +1,4 @@ -default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr +default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr Do you really think you can handle that?\n\npress 'Y' or 'N'...,NIGHTMARE,,,,"Opravdu si myslíš, že to zvládneš? Zmáčkni Y nebo N.","Tror du virkelig, at du kan klare det? @@ -9,7 +9,7 @@ Drücke Y oder N.",,"Ĉu vi vere pensas, ke vi povas trakti tion? Premu ""Y"" aŭ ""N""...","¿Realmente crees poder con eso? -Pulsa Y o N...",,Uskotko todella pystyväsi tähän?\n\nPaina 'Y' tai 'N'...,Vous pensez sérieusement que vous pourrez tenir le coup?\n\nAppuyez sur Y ou N...,Biztos vagy abban hogy megbírkózol vele?\n\nnyomj 'Y'-t vagy 'N'-t,"Pensi davvero di poterlo fare? +Pulsa Y o N...",,Uskotko todella pystyväsi tähän?\n\nPaina 'Y' tai 'N'...,Vous pensez sérieusement que vous pourrez tenir le coup?\n\nAppuyez sur Y ou N...,Stvarno misliš da to možeš podnijet?\n\nPritisni 'Y' ili 'N'...,Biztos vagy abban hogy megbírkózol vele?\n\nnyomj 'Y'-t vagy 'N'-t,"Pensi davvero di poterlo fare? premere 'Y' o 'N'","ホントウニ タイショデキルト オモッテイマスカ? @@ -22,51 +22,51 @@ Druk op 'Y' of 'N'...",Tror du virkelig at du kan håndtere det? Trykk 'Y' eller Wciśnij 'Y' lub 'N'...",Você acha que dá conta?\n\nAperte Y ou N...,,Chiar crezi că poți face față?\n\napasă 'Y' sau 'N'...,"Уверены, что справитесь?\n\nНажмите «Y» или «N»...",,"Tror du verkligen att du klarar av det? Tryck på ""Y"" eller ""N""...",Gerçekten bununla başa çıkabileceğini düşünüyor musun? 'Y' veya 'N' tuşuna basın... -Spot marked,AMSTR_MARKEDSPOT,,,,Bod označen,Pletmærket,Punkt markiert,,Punkto markita,Punto marcado,,Paikka merkitty,Repère marqué.,Hely megjelölve.,Posizione segnata,スポットヲ マーク シタ,마커 표시함,Vlek gemarkeerd,Punkt markert,Miejsce zaznaczone,Posição marcada,,Loc marcat,Отметка,Означено место,Markerad punkt,İşaretli nokta -Requires the GREEN keycard,PD_BLUEO,,,,Vyžaduje ZELENOU kartu,Kræver det GRØNNE nøglekort,Benötigt die GRÜNE Schlüsselkarte,,Vi bezonas la VERDAN ŝlosilkarton,Requiere la tarjeta llave VERDE,,Tarvitsee VIHREÄN avainkortin,Carte VERTE demandée.,ZÖLD kulcskártya szükséges,Richiede la card d'accesso VERDE,グリーン キーカード ガ ヒツヨウダ,필요함: 초록색 키카드,Vereist de GROENE sleutelkaart,Krever det GRØNNE nøkkelkortet,Wymaga ZIELONEJ karty,Você precisa do cartão de passe VERDE,,Necesită cardul VERDE,Требуется ЗЕЛЁНАЯ ключ-карта,,Kräver det GRÖNA nyckelkortet.,YEŞİL anahtar kartı gerektirir -Requires the PURPLE keycard,PD_REDO,,,,Vyžaduje FIALOVOU kartu,Kræver det LILLA nøglekort,Benötigt die VIOLETTE Schlüsselkarte,,Vi bezonas la PURPURAN ŝlosilkarton,Requiere la tarjeta llave VIOLETA,,Tarvitsee VIOLETIN avainkortin,Carte VIOLETTE demandée.,LILA kulcskártya szükséges,Richiede la card d'accesso VIOLA,イエロー キーカード ガ ヒツヨウダ,필요함: 보라색 키카드,Vereist de PAARSE sleutelkaart,Krever det LILLA nøkkelkortet,Wymaga FIOLETOWEJ karty,Você precisa do cartão de passe ROXO,,Necesită cardul MOV,Требуется ФИОЛЕТОВАЯ ключ-карта,,Kräver det LILA nyckelkortet,MOR anahtar kartı gerektirir -Requires the YELLOW keycard,PD_YELLOWO,,,,Vyžaduje ŽLUTOU kartu,Kræver det GULLE nøglekort,Benötigt die GELBE Schlüsselkarte,,Vi bezonas la FLAVAN ŝlosilkarton,Requiere la tarjeta llave AMARILLA,,Tarvitsee KELTAISEN avainkortin,Carte JAUNE demandée.,SÁRGA kulcskártya szükséges,Richiede la card d'accesso GIALLA,パープル キーカード ガ ヒツヨウダ,필요함: 노란색 키카드,Vereist de GELE sleutelkaart,Krever det GULT nøkkelkortet,Wymaga ŻÓŁTEJ karty,Você precisa do cartão de passe AMARELO,,Necesită cardul GALBEN,Требуется ЖЁЛТАЯ ключ-карта,,Kräver det GULLA nyckelkortet,SARI anahtar kartı gerektirir -Requires the GREEN key,PD_BLUEK,,,,Vyžaduje ZELENÝ klíč,Kræver den GRØNNE nøgle,Benötigt den GRÜNEN Schlüssel,,Vi bezonas la VERDAN ŝlosilon,Requiere la llave VERDE,,Tarvitsee VIHREÄN avaimen,Clé VERTE demandée.,ZÖLD kulcs szükséges,Richiede la chiave VERDE,グリーン キー ガ ヒツヨウダ,필요함: 초록색 열쇠,Vereist de GROENE sleutel,Krever den GRØNNE nøkkelen,Wymaga ZIELONEGO klucza,Você precisa da chave VERDE,,Necesită cheia VERDE,Требуется ЗЕЛЁНЫЙ ключ,,Kräver det GRÖNA nyckeln,YEŞİL tuş gerektirir -Requires the YELLOW key,PD_YELLOWK,,,,Vyžaduje ŽLUTÝ klíč,Kræver den GULLE nøgle,Benötigt den GELBEN Schlüssel,,Vi bezonas la PURPURAN ŝlosilon,Requiere la llave AMARILLA,,Tarvitsee KELTAISEN avaimen,Clé JAUNE demandée.,SÁRGA kulcs szükséges,Richiede la chiave GIALLO,イエロー キー ガ ヒツヨウダ,필요함: 노란색 열쇠,Vereist de GEELE sleutel,Krever den GUL nøkkelen,Wymaga ŻÓŁTEGO klucza,Você precisa da chave AMARELA,,Necesită cheia GALBENĂ,Требуется ЖЁЛТЫЙ ключ,,Kräver den GULLA nyckeln,SARI tuş gerektirir -Requires the PURPLE key,PD_REDK,,,,Vyžaduje FIALOVÝ klíč,Kræver den LILLA nøgle,Benötigt den VIOLETTEN Schlüssel,,Vi bezonas la FLAVAN ŝlosilon,Requiere la llave VIOLETA,,Tarvitsee VIOLETIN avaimen,Clé VIOLETTE demandée.,LILA kulcs szükséges,Richiede la chiave VIOLA,パープル キー ガ ヒツヨウダ,필요함: 보라색 열쇠,Vereist de PAARSE sleutel,Krever den LILLA nøkkelen,Wymaga FIOLETOWEGO klucza,Você precisa da chave ROXA,,Necesită cheia MOV,Требуется ФИОЛЕТОВЫЙ ключ,,Kräver den LILA nyckeln,MOR tuş gerektirir -Picked up armor.,GOTARMOR,,,Picked up armour.,Sebráno brnění.,Hentede rustning.,Panzer genommen.,,Vi trovis armaĵon.,Encuentras una armadura.,,Panssari poimittu.,Armure récupérée.,Vért felvéve,Raccolto un'armatura.,アーマー ニュウシュ,획득: 전투복.,Je hebt een harnas opgehaald.,Plukket opp rustning.,Zebrano pancerz.,Pegou uma armadura.,,Ai ridicat Armura.,Получена броня.,Покупили сте панцир.,Plockade upp en rustning.,Zırhı aldım. -Picked up Combat Armor.,GOTMEGA,,,Picked up Combat Armour.,Sebráno bojové brnění.,Samlet Combat Armor op.,Super-Panzer genommen.,,Vi trovis batal-armaĵon.,Encuentras una armadura de combate.,,Taistelupanssari poimittu.,Armure de combat récupérée.,Harci vért felvéve,Raccolto Armatura da combattimento.,コンバット アーマー ニュウシュ,획득: 강화된 전투복.,Je hebt een gevechtsharnas opgehaald.,Plukket opp kamprustning.,Zebrano pancerz bojowy.,Pegou uma Armadura de Combate.,,Ai ridicat Armura de Luptă.,Получена боевая броня.,,Plockade upp kampen rustning.,Savaş Zırhı aldı. -Superhealth,GOTMSPHERE,,,,Superzdraví,,Super-Gesundheit,,Supersano,Supersalud,,Superterveys,Super-Santé,Szuperéleterő,Super salute,スーパー ヘルス,사용: 체력강화 버섯.,,Superhelse,Superzdrowie,Superssaúde,,Supersănătate,Суперздоровье,,Supersundhet,Süper Sağlık -Obtained the GREEN keycard.,GOTBLUECARD,,,,Sebrána ZELENÁ karta.,Opnået det GRØNNE nøglekort.,GRÜNE Schlüsselkarte erhalten,,Vi trovis la VERDAN ŝlosilkarton.,Encuentras la tarjeta llave VERDE.,,VIHREÄ avainkortti poimittu.,Carte VERTE obtenue.,Megszerezted a ZÖLD kulcskártyát.,Ottenuta la card d'accesso VERDE.,グリーン キーカード ニュウシュ,획득: 초록색 키카드.,GROENE sleutelkaart ontvangen,Fått det GRØNNE nøkkelkortet.,Zdobyto ZIELONĄ kartę.,Pegou o cartão de passe VERDE.,,Ai achiziționat cardul VERDE.,Получена ЗЕЛЁНАЯ ключ-карта.,,Skaffade det GRÖNA nyckelkortet.,YEŞİL anahtar kartı elde edildi. -Obtained the YELLOW keycard.,GOTYELWCARD,,,,Sebrána ŽLUTÁ karta.,Opnået det GULLE nøglekort.,GELBE Schlüsselkarte erhalten,,Vi trovis la FLAVAN ŝlosilkarton.,Encuentras la tarjeta llave AMARILLA.,,KELTAINEN avainkortti poimittu.,Carte JAUNE obtenue.,Megszerezted a SÁRGA kulcskártyát.,Ottenuta la card d'accesso GIALLA.,イエロー キーカード ニュウシュ,획득: 노란색 키카드.,GELE sleutelkaart ontvangen,Fått det GUL nøkkelkortet.,Zdobyto ŻÓŁTĄ kartę.,Pegou o cartão de passe AMARELO.,,Ai achiziționat cardul GALBEN.,Получена ЖЁЛТАЯ ключ-карта.,,Skaffade det GULLA nyckelkortet.,SARI anahtar kartı elde edildi. -Obtained the PURPLE keycard.,GOTREDCARD,,,,Sebrána FIALOVÁ karta.,Opnået det LILLA nøglekort.,VIOLETTE Schlüsselkarte erhalten,,Vi trovis la PURPURAN ŝlosilkarton.,Encuentras la tarjeta llave VIOLETA.,,VIOLETTI avainkortti poimittu.,Carte VIOLETTE obtenue.,Megszerezted a LILA kulcskártyát.,Ottenuta la card d'accesso VIOLA.,パープル キーカード ニュウシュ,획득: 보라색 키카드.,PAARSE sleutelkaart ontvangen,Fikk det LILLA nøkkelkortet.,Zdobyto FIOLETOWĄ kartę.,Pegou o cartão de passe ROXO.,,Ai achiziționat cardul MOV.,Получена ФИОЛЕТОВАЯ ключ-карта.,,Skaffade det LILA nyckelkortet.,MOR anahtar kartı elde edildi. -Obtained the GREEN key.,GOTBLUESKUL,,,,Sebrán ZELENÝ klíč.,Opnået den GRØNNE nøgle.,GRÜNEN Schlüssel erhalten,,Vi trovis la VERDAN ŝlosilon.,Encuentras la llave VERDE.,,VIHREÄ avain poimittu.,Clé VERTE obtenue.,Megszerezted a ZÖLD kulcsot.,Ottenuta la chiave VERDE.,グリーン キー ニュウシュ,획득: 초록색 열쇠.,GROENE sleutel ontvangen,Fikk den GRØNNE nøkkelen.,Zdobyto ZIELONY klucz.,Pegou a chave VERDE.,,Ai achiziționat cheia VERDE.,Получен ЗЕЛЁНЫЙ ключ.,,Skaffade den GRÖNA nyckeln.,YEŞİL anahtar elde edildi. -Obtained the YELLOW key.,GOTYELWSKUL,,,,Sebrán ŽLUTÝ klíč.,Opnået den GULLE nøgle.,GELBEN Schlüssel erhalten,,Vi trovis la FLAVAN ŝlosilon.,Encuentras la llave AMARILLA.,,KELTAINEN avain poimittu.,Clé JAUNE obtenue.,Megszerezted a SÁRGA kulcsot.,Ottenuta la chiave GIALLA.,イエロー キー ニュウシュ,획득: 노란색 열쇠.,GELE sleutel ontvangen,Fikk den GULA nøkkelen.,Zdobyto ŻÓŁTY klucz.,Pegou a chave AMARELA.,,Ai achiziționat cheia GALBENĂ.,Получен ЖЁЛТЫЙ ключ.,,Skaffade den GULLA nyckeln.,SARI anahtar elde edildi. -Obtained the PURPLE key.,GOTREDSKUL,,,,Sebrán FIALOVÝ klíč.,Opnået den LILLA nøgle.,VIOLETTEN Schlüssel erhalten,,Vi trovis la PURPURAN ŝlosilon.,Encuentras la llave VIOLETA.,,VIOLETTI avain poimittu.,Clé VIOLETTE obtenue.,Megszerezted a LILA kulcsot.,Ottenuta la chiave VIOLA.,パープル キー ニュウシュ,획득: 보라색 열쇠.,PAARSE sleutel ontvangen,Fikk den LILLA nøkkelen.,Zdobyto FIOLETOWY klucz.,Pegou a chave ROXA.,,Ai achiziționat cheia MOV.,Получен ФИОЛЕТОВЫЙ ключ.,,Skaffade den LILA nyckeln.,MOR anahtar elde edildi. -Healing mushroom,GOTSTIM,,,,Léčivka,Helbredende svamp,Heilpilz,,Saniga fungo,Seta medicinal,Hongo medicinal,Lääkesieni,Champignon médicinal,Gyógyító gomba,Funghi curativi,ヒーリング マッシュルーム,사용: 체력회복 버섯.,Genezende paddenstoel,Helbredende sopp,Leczący grzyb,Cogumelo medicinal,,Ciupercă vindecătoare,Целебный гриб,,Helande svamp,İyileştirici mantar -Acquired: medical kit.,GOTMEDIKIT,,,,Získána lékárnička.,Erhvervet: medicinsk kit.,Erhalten: Medikit,,Vi trovis sukurkeston.,Encuentras un botiquín.,,Saatu: lääkintälaukku.,Acquis: Kit médical.,Megszerezve: orvosi csomag,Acquisito: kit medico.,シュトク: メディカルキット,사용: 의료 키트.,Verworven: medische kit.,Ervervet: medisinsk sett.,Zdobyto: apteczkę.,Pegou um kit médico.,,Ridicat: Kit de Prim-Ajutor.,Получена: Аптечка.,,Förvärvad: medicinsk utrustning.,Elde edilen: tıbbi kit. -Acquired: medical kit that you REALLY need.,GOTMEDINEED,,,,"Získána lékárnička, kterou OPRAVDU potřebuješ.","Erhvervet: medicinsk kit, som du VIRKELIG har brug for.","Erhalten: Medikit, das du WIRKLICH brauchst",,"Vi trovis sukurkeston, kiun vi VERE bezonas.",Encuentras un botiquín que REALMENTE necesitabas.,,"Saatu: lääkintälaukku, jota TODELLA tarvitsit.",Acquis: Kit médical. Besoin critique.,Megszerezve: már NAGYON hiányzott orvosi csomag,Acquisito: kit medico di cui VERAMENTE avete bisogno.,シュトク: キンキュウジタイヲ スクウ メディカルキット,사용: 당신을 살려줄 의료 키트.,Verworven: medische kit die je ECHT nodig heeft.,Ervervet: medisinsk sett som du virkelig trenger.,"Zdobyto: apteczkę, której NAPRAWDĘ potrzebujesz.",Pegou um kit médico que você REALMENTE precisa.,,Ridicat: Kit de Prim-Ajutor de care CHIAR AI nevoie.,Получена: Аптечка (КРАЙНЕ необходимая).,,Förvärvad: medicinsk utrustning som du verkligen behöver.,Elde edilen: GERÇEKTEN ihtiyacınız olan tıbbi kit. -Map,GOTMAP,,,,Mapa,Kort,Karte,,Vi trovis la mapon,Mapa,,Kartta,Carte,Térkép,Mappa,コノ クイキノ マップダ ,획득: 지도.,Kaart,Kart,Mapa,Mapa,,Hartă,Карта,,Karta,Harita -Acquired: case of bullets.,GOTCLIPBOX,,,,Získána krabice nábojů.,Erhvervet: kasse med kugler.,Erhalten: Munitionskiste,,Vi trovis skatolon da kugloj.,Encuentras una caja de balas.,,Saatu: luotilaatikko.,Acquis: Boîte de balles.,Megszerezve: doboznyi lőszer.,Acquisito: caso di proiettili.,シュトク: バレット ケース,획득: 회전포 탄약.,Verworven: geval van kogels.,Ervervet: tilfelle av kuler.,Zdobyto: pudełko naboi.,Pegou uma caixa de balas,,Achiziționat: Cutie de gloanțe.,Получен: Ящик с пулями.,,Förvärvad: väska med kulor.,Elde edilen: mermi kovanı. -Acquired: Grenade.,GOTROCKET,,,,Ziskán granát.,Erhvervet: Granat.,Erhalten: Granate,,Vi trovis grenadon.,Encuentras una granada.,,Saatu: kranaatti.,Acquis: Grenade.,Megszerezve: Gránát.,Acquisito: Granata.,シュトク: グレネード,획득: 세열탄.,Verworven: Granaat.,Ervervet: Granat.,Zdobyto: Granat.,Pegou uma granada.,,Achiziționat: Grenadă.,Получена: Граната.,,Förvärvad: Granat.,Elde edildi: El bombası. -Acquired: Grenades.,GOTROCKBOX,,,,Ziskány granáty.,Erhvervet: Granater.,Erhalten: Granaten,,Vi trovis grenadojn.,Encuentras unas granadas.,,Saatu: kranaatteja.,Acquis: Grenades.,Megszerezve: Gránátok.,Acquisito: Granate.,シュトク: グレネード セット,획득: 세열탄 여러 개.,Verworven: Granaten.,Ervervet: Granater.,Zdobyto: Granaty.,Pegou granadas.,,Achiziționat: Grenade.,Получены: Гранаты.,,Förvärvad: Granater.,Elde edildi: El bombaları. -Acquired: box of shotgun shells.,GOTSHELLBOX,,,,Získána krabice broků.,Erhvervet: kasse med haglpatroner.,Erhalten: Schrotpatronen,,Vi trovis skatolon da kartoĉoj.,Encuentras una caja de cartuchos de escopeta.,,Saatu: laatikollinen haulikon patruunoita.,Acquis: Boîte de cartouches.,Megszerezve: doboznyi puska sörét,Acquisito: scatola di cartucce per fucile.,シュトク: シェル ボックス,획득: 산탄총 탄약.,Verworven: doos met shotgun schelpen.,Ervervet: eske med haglepatroner.,Zdobyto: pudełko loftek do strzelby.,Pegou uma caixa de cartuchos de espingarda.,,Achiziționat: Cutie de muniție pentru pușcă.,Получена: Коробка патронов дробовика.,,Förvärvad: låda med hagelpatroner.,Edinildi: Bir kutu av tüfeği fişeği. -Acquired: ammo backpack.,GOTBACKPACK,,,,Ziskán batoh s municí.,Erhvervet: ammunitionsrygsæk.,Erhalten: Munitionsrucksack,,Vi trovis tornistron da municioj.,Encuentras una mochila de municiones.,,Saatu: ammusreppu.,Acquis: Sac de munitions.,Megszerezve: lőszeres hátizsák,Acquisito: zaino munizioni.,シュトク: バックパック,획득: 탄약 가방.,Verworven: munitie rugzak.,Ervervet: ryggsekk med ammunisjon.,Zdobyto: plecak z amunicją.,Pegou uma mochila de munição.,,Achiziționat: Raniță.,Получен: Ранец боеприпасов.,,Förvärvad: Ammunitionsryggsäck.,Edinildi: Cephane çantası. -Acquired: Grenade.,GOTBFG9000,,,,Získán granát.,Erhvervet: Granat.,Erhalten: Granate,,Vi trovis grenadon.,Encuentras una granada.,,Saatu: kranaatti.,Acquis: Grenade.,Megszerezve: Gránát.,Acquisito: Granata.,シュトク: グレネード,획득: 세열탄.,Verworven: Granaat.,Ervervet: Granat.,Zdobyto: Granat.,Pegou uma granada.,,Achiziționat: Grenadă.,Получена: Граната.,,Förvärvad: Granat.,Elde edildi: El bombası. -Acquired: Minigun.,GOTCHAINGUN,,,,Získán kulomet.,Erhvervet: Minigun.,Erhalten: Minigun,,Vi trovis maŝinpafilon.,Encuentras una ametralladora.,,Saatu: minigun.,Acquis: Minigun.,Megszerezve: Gépfegyver.,Acquisito: Minigun.,シュトク: ミニガン,획득: 회전포.,Verworven: Minigun.,Ervervet: Minigun.,Zdobyto: Minigun.,Pegou uma metralhadora giratória.,,Achiziționat: Minimitralieră.,Получен: Пулемёт.,,Förvärvad: Minigun.,Elde edildi: Minigun. -Acquired: Grenade launcher.,GOTLAUNCHER,,,,Získán granátomet.,Erhvervet: Granatkaster.,Erhalten: Granatwerfer,,Vi trovis grenadĵetilon.,Encuentras un lanzagranadas.,,Saatu: kranaatinheitin.,Acquis: Lance-Grenades,Megszerezve: Gránátvető,Acquisito: Lanciagranate.,シュトク: グレネードランチャー,획득: 세열탄 추진기.,Verworven: Granaatwerper.,Ervervet: Granatkaster.,Zdobyto: Wyrzutnię granatów.,Pegou um lança-granadas.,,Achiziționat: Lansator de grenade.,Получен: Гранатомёт.,,Förvärvad: Granatkastare.,Elde edildi: El bombası fırlatıcı. -Entropy thrower!,GOTPLASMA,,,,Vrhač entropie!,Entropi-lancer!,Entropiewerfer,,Entropi-ĵetilon!,¡Lanzador de entropía!,,Entropianheitin!,Acquis: Lanceur d'Entropie!,Entrópiavető!,Lancia entropia!,エントロピースロワー!,획득: 엔트로피 방사기!,Entropiewerper!,Entropikaster!,Miotacz Entropii!,Lançador de entropia!,,Aruncător entropic!,Энтропиемёт!,,,Entropi fırlatıcı! -Acquired: Shotgun.,GOTSHOTGUN,,,,Získána brokovnice.,Erhvervet: Shotgun.,Erhalten: Schrotflinte,,Vi trovis kartoĉan fusilon.,Encuentras una escopeta.,,Saatu: haulikko.,Acquis: Fusil à pompe.,Megszerezve: Sörétes puska,Acquisito: Fucile.,シュトク: ショットガン,획득: 산탄총.,Verworven: Shotgun.,Ervervet: Haglgevær.,Zdobyto: Strzelbę.,Pegou uma espingarda.,,Achiziționat: Pușcă.,Получен: Дробовик.,,Förvärvad: Hagelgevär,Edinildi: Av tüfeği. -God Mode ON,STSTR_DQDON,,,,Nesmrtelnost ZAP,Gud-tilstand PÅ,Gott-Modus AN,,Dio-Reĝimo AKTIVA,Modo Dios ACTIVADO,,Kuolemattomuustila PÄÄLLÄ,Mode invulnérable ON,Isten mód BE,Modalità Dio ATTIVATA,ゴッドモード オン,무적 치트: ON,God Modus AAN,Gudsmodus PÅ,Tryb Boga WŁĄCZONY,Modo Deus LIGADO,,Modul Invincibil PORNIT,Режим Бога ВКЛЮЧЁН,,Gud läge PÅ,Tanrı Modu AÇIK -God Mode OFF,STSTR_DQDOFF,,,,Nesmrtelnost VYP,Gud-tilstand FRA,Gott-Modus AUS,,Dio-Reĝimo NEAKTIVA,Modo Dios DESACTIVADO,,Kuolemattomuustila POIS PÄÄLTÄ,Mode invulnérable OFF,Isten mód KI,Modalità Dio DISATTIVATA,ゴッドモード オフ,무적 치트: OFF,God Modus UIT,Gudsmodus AV,Tryb Boga WYŁĄCZONY,Modo Deus DESLIGADO,,Modul Invincibil OPRIT,Режим Бога ОТКЛЮЧЁН,,Gud läge AV,Tanrı Modu KAPALI -All weapons/ ammo/ keys,STSTR_KFAADDED,,,,Všechny zbraně/munice/klíče,Alle våben/ ammunition/ nøgler,"Alle Waffen, Munition und Schlüssel",,Ĉiuj armiloj/municioj/ŝlosiloj,Todas las armas/municiones/llaves,,Kaikki aseet/ ammukset/ avaimet,Toutes les armes/munitions/clés,Minden fegyver / lőszer / kulcs,Tutte le armi / munizioni / chiavi,スベテノ ブキ/カギ/ダンヤク,추가: 모든 무기/탄약/열쇠 치트,Alle wapens / munitie / sleutels,Alle våpen / ammunisjon / nøkler,Wszystkie bronie/amunicja/klucze,Todas as armas/munição/chaves,,Toate armele/muniție/chei,Всё оружие/боеприпасы/ключи,,Alla vapen/ammunition/nycklar,Tüm silahlar/ cephane/ anahtarlar -All weapons and ammo,STSTR_FAADDED,,,,Všechny zbraně a munice,Alle våben og ammunition,Alle Waffen und Munition,,Ĉiuj armiloj kaj municioj,Todas las armas y municiones,,Kaikki aseet ja ammukset,Toutes les armes et munitions,Minden fegyver és lőszer,Tutte le armi e le munizioni,スベテノ ブキ/ダンヤク,추가: 모든 무기/탄약 치트,Alle wapens en munitie,Alle våpen og ammunisjon,Wszystkie bronie i amunicja,Todas as armas e munição completa,,Toate armele și muniție,Всё оружие и боеприпасы,,Alla vapen och all ammunition,Tüm silahlar ve cephane -Abduction,TXT_HARMMAP01,,,,Únos,Bortførelse,Entführung,,Forkapto,Abducción,,Sieppaus,Enlèvement,Elrablás,Il rapimento,アブダクション,유괴,Ontvoering,Bortføring,Porwanie,Sequestro,,Răpire,Похищение,,Bortförande,Kaçırılma -Harm's Way,TXT_HARMMAP02,,,,Nebezpečí,,In Gefahr,,Vojo de danĝero,En peligro,,Vaara,Mise en Danger,Baj,La via del danno,ハーム'ズ ウェイ,해함의 길,,,Niebezpieczeństwo,No Caminho do Perigo,,Calea pericolului,Опасный путь,,Harms väg,Zarar Görebilecek Durumda -Owt Mood,TXT_HARMMAP03,,,,Špatný pocit,,Missstimmung,,Sentaĉo,Buen humor,,Nollatunnelma,Scontento,Túlterhelve,Scontento,ヤバイムード,이상한 분위기,,,Paskudny Nastrój,Mau Humor,,Fricțiune,Нестроение,,Dåligt stämning,Kötü Ruh Hali -Megalapolis,TXT_HARMMAP04,,,,Megalopole,,Megalopolis,,Megtropolo,Megalópolis,,Megalopoli,Mégalopole,Megalopolisz,Megalapoli,メガラポリス,거대 도시,Megalopolis,,Megalapolis,Megalópole,,Megalopolis,Мегалаполис,,,Megalapolis -The Hospital,TXT_HARMMAP05,,,,Nemocnice,Hospitalet,Das Hospital,,La malsanulejo,El hospital,,Sairaala,L'Hôpital,Kórház,L'ospedale,ホスピタル,병동,Het ziekenhuis,Sykehuset,Szpital,O Hospital,,Spitalul,Больница,,Sjukhuset,Hastane -The Weapons Factory,TXT_HARMMAP06,,,,Továrna na zbraně,Våbenfabrikken,Die Waffenfabrik,,La armil-fabriko,La fábrica de armas,,Asetehdas,L'Usine d'Armes,Fegyvergyár,La fabbrica di armi,ウェポンファクトリー,무기 공장,De Wapenfabriek,Våpenfabrikken,Fabryka Broni,A Fábrica de Armamentos,,Fabrica de Arme,Оружейный завод,,Vapenfabriken,Silah Fabrikası -The Underwater Lab,TXT_HARMMAP07,,,,Podvodní laboratoř,Undervandslaboratoriet,Das Unterwasserlabor,,La subakva labotorio,El laboratorio submarino,,Vedenalainen laboratorio,Le Laboratoire Sous-marin,Vízalatti labor,Il laboratorio subacqueo,アンダーウォーターラボ,해저 연구소,Het onderwaterlaboratorium,Undervannslaboratoriet,Podwodne Laboratorium,O Laboratório Submarino,,Laboratorul Subacvatic,Подводная лаборатория,,Undervattenslaboratoriet,Sualtı Laboratuvarı -Airstrip One,TXT_HARMMAP08,,,,Přistávací dráha jedna,Landingsbane et,Flugplatz Eins,,Surteriĝejo numero unu,Pista de aterrizaje uno,,Kiitorata Yksi,Piste D'Atterrisage Un,1-es kifutó,Pista Uno,エアーシップ ワン,활주로 1호,Vliegveld Een,Flystripe én,Lądowisko Numer Jeden,Base Aérea Um,,Pista Unu,Взлётная полоса №1,,Landningsbana ett,Birinci Pist -The Launch Base,TXT_HARMMAP09,,,,Vzletová základna,Affyringsbasen,Die Startbasis,,La lanĉbazo,La base de despegue,,Laukaisutukikohta,La Base de Lancement,Kilövő Állomás,La base di lancio,ランチャーベース,발진기지,De lanceerbasis,Utskytningsbasen,Baza Startowa,A Base de Lançamento,,Baza de Lansare,Пусковая площадка,,Avfyrningsbasen,Fırlatma Üssü -The Radioactive Zone,TXT_HARMMAP10,,,,Radioaktivní zóna,Den radioaktive zone,Die radioaktive Zone,,La radioaktiva zono,La zona radioactiva,,Radioaktiivinen vyöhyke,La Zone Radioactive,Radioaktív Zóna,La zona radioattiva,ラディオアクティブ ゾーン,방사능 처리소,De Radioactieve Zone,Den radioaktive sonen,Radioaktywna Strefa,A Zona Radioativa,,Zona Radioactivă,Заражённая зона,,Den radioaktiva zonen,Radyoaktif Bölge -Echidna,TXT_HARMMAP11,,,,,,,,Ekidno,Equidna,,Nokkasiili,,Hangyászsün,,エキドナ,에키드나,,,,Equidna,,,Ехидна,,,Echidna +Spot marked,AMSTR_MARKEDSPOT,,,,Bod označen,Pletmærket,Punkt markiert,,Punkto markita,Punto marcado,,Paikka merkitty,Repère marqué.,Mjesto označeno.,Hely megjelölve.,Posizione segnata,スポットヲ マーク シタ,마커 표시함,Vlek gemarkeerd,Punkt markert,Miejsce zaznaczone,Posição marcada,,Loc marcat,Отметка,Означено место,Markerad punkt,İşaretli nokta +Requires the GREEN keycard,PD_BLUEO,,,,Vyžaduje ZELENOU kartu,Kræver det GRØNNE nøglekort,Benötigt die GRÜNE Schlüsselkarte,,Vi bezonas la VERDAN ŝlosilkarton,Requiere la tarjeta llave VERDE,,Tarvitsee VIHREÄN avainkortin,Carte VERTE demandée.,Zahtijeva ZELENU ključnu karticu.,ZÖLD kulcskártya szükséges,Richiede la card d'accesso VERDE,グリーン キーカード ガ ヒツヨウダ,필요함: 초록색 키카드,Vereist de GROENE sleutelkaart,Krever det GRØNNE nøkkelkortet,Wymaga ZIELONEJ karty,Você precisa do cartão de passe VERDE,,Necesită cardul VERDE,Требуется ЗЕЛЁНАЯ ключ-карта,,Kräver det GRÖNA nyckelkortet.,YEŞİL anahtar kartı gerektirir +Requires the PURPLE keycard,PD_REDO,,,,Vyžaduje FIALOVOU kartu,Kræver det LILLA nøglekort,Benötigt die VIOLETTE Schlüsselkarte,,Vi bezonas la PURPURAN ŝlosilkarton,Requiere la tarjeta llave VIOLETA,,Tarvitsee VIOLETIN avainkortin,Carte VIOLETTE demandée.,Zahtijeva LJUBIČASTU ključnu karticu.,LILA kulcskártya szükséges,Richiede la card d'accesso VIOLA,イエロー キーカード ガ ヒツヨウダ,필요함: 보라색 키카드,Vereist de PAARSE sleutelkaart,Krever det LILLA nøkkelkortet,Wymaga FIOLETOWEJ karty,Você precisa do cartão de passe ROXO,,Necesită cardul MOV,Требуется ФИОЛЕТОВАЯ ключ-карта,,Kräver det LILA nyckelkortet,MOR anahtar kartı gerektirir +Requires the YELLOW keycard,PD_YELLOWO,,,,Vyžaduje ŽLUTOU kartu,Kræver det GULLE nøglekort,Benötigt die GELBE Schlüsselkarte,,Vi bezonas la FLAVAN ŝlosilkarton,Requiere la tarjeta llave AMARILLA,,Tarvitsee KELTAISEN avainkortin,Carte JAUNE demandée.,Zahtijeva ŽUTU ključnu karticu.,SÁRGA kulcskártya szükséges,Richiede la card d'accesso GIALLA,パープル キーカード ガ ヒツヨウダ,필요함: 노란색 키카드,Vereist de GELE sleutelkaart,Krever det GULT nøkkelkortet,Wymaga ŻÓŁTEJ karty,Você precisa do cartão de passe AMARELO,,Necesită cardul GALBEN,Требуется ЖЁЛТАЯ ключ-карта,,Kräver det GULLA nyckelkortet,SARI anahtar kartı gerektirir +Requires the GREEN key,PD_BLUEK,,,,Vyžaduje ZELENÝ klíč,Kræver den GRØNNE nøgle,Benötigt den GRÜNEN Schlüssel,,Vi bezonas la VERDAN ŝlosilon,Requiere la llave VERDE,,Tarvitsee VIHREÄN avaimen,Clé VERTE demandée.,Zahtijeva ZELENI ključ.,ZÖLD kulcs szükséges,Richiede la chiave VERDE,グリーン キー ガ ヒツヨウダ,필요함: 초록색 열쇠,Vereist de GROENE sleutel,Krever den GRØNNE nøkkelen,Wymaga ZIELONEGO klucza,Você precisa da chave VERDE,,Necesită cheia VERDE,Требуется ЗЕЛЁНЫЙ ключ,,Kräver det GRÖNA nyckeln,YEŞİL tuş gerektirir +Requires the YELLOW key,PD_YELLOWK,,,,Vyžaduje ŽLUTÝ klíč,Kræver den GULLE nøgle,Benötigt den GELBEN Schlüssel,,Vi bezonas la PURPURAN ŝlosilon,Requiere la llave AMARILLA,,Tarvitsee KELTAISEN avaimen,Clé JAUNE demandée.,Zahtijeva ŽUTI ključ.,SÁRGA kulcs szükséges,Richiede la chiave GIALLO,イエロー キー ガ ヒツヨウダ,필요함: 노란색 열쇠,Vereist de GEELE sleutel,Krever den GUL nøkkelen,Wymaga ŻÓŁTEGO klucza,Você precisa da chave AMARELA,,Necesită cheia GALBENĂ,Требуется ЖЁЛТЫЙ ключ,,Kräver den GULLA nyckeln,SARI tuş gerektirir +Requires the PURPLE key,PD_REDK,,,,Vyžaduje FIALOVÝ klíč,Kræver den LILLA nøgle,Benötigt den VIOLETTEN Schlüssel,,Vi bezonas la FLAVAN ŝlosilon,Requiere la llave VIOLETA,,Tarvitsee VIOLETIN avaimen,Clé VIOLETTE demandée.,Zahtijeva LJUBIČASTI ključ.,LILA kulcs szükséges,Richiede la chiave VIOLA,パープル キー ガ ヒツヨウダ,필요함: 보라색 열쇠,Vereist de PAARSE sleutel,Krever den LILLA nøkkelen,Wymaga FIOLETOWEGO klucza,Você precisa da chave ROXA,,Necesită cheia MOV,Требуется ФИОЛЕТОВЫЙ ключ,,Kräver den LILA nyckeln,MOR tuş gerektirir +Picked up armor.,GOTARMOR,,,Picked up armour.,Sebráno brnění.,Hentede rustning.,Panzer genommen.,,Vi trovis armaĵon.,Encuentras una armadura.,,Panssari poimittu.,Armure récupérée.,Oklop je pokupljen.,Vért felvéve,Raccolto un'armatura.,アーマー ニュウシュ,획득: 전투복.,Je hebt een harnas opgehaald.,Plukket opp rustning.,Zebrano pancerz.,Pegou uma armadura.,,Ai ridicat Armura.,Получена броня.,Покупили сте панцир.,Plockade upp en rustning.,Zırhı aldım. +Picked up Combat Armor.,GOTMEGA,,,Picked up Combat Armour.,Sebráno bojové brnění.,Samlet Combat Armor op.,Super-Panzer genommen.,,Vi trovis batal-armaĵon.,Encuentras una armadura de combate.,,Taistelupanssari poimittu.,Armure de combat récupérée.,Borbeni oklop je pokupljen.,Harci vért felvéve,Raccolto Armatura da combattimento.,コンバット アーマー ニュウシュ,획득: 강화된 전투복.,Je hebt een gevechtsharnas opgehaald.,Plukket opp kamprustning.,Zebrano pancerz bojowy.,Pegou uma Armadura de Combate.,,Ai ridicat Armura de Luptă.,Получена боевая броня.,,Plockade upp kampen rustning.,Savaş Zırhı aldı. +Superhealth,GOTMSPHERE,,,,Superzdraví,,Super-Gesundheit,,Supersano,Supersalud,,Superterveys,Super-Santé,Superzdravlje,Szuperéleterő,Super salute,スーパー ヘルス,사용: 체력강화 버섯.,,Superhelse,Superzdrowie,Superssaúde,,Supersănătate,Суперздоровье,,Supersundhet,Süper Sağlık +Obtained the GREEN keycard.,GOTBLUECARD,,,,Sebrána ZELENÁ karta.,Opnået det GRØNNE nøglekort.,GRÜNE Schlüsselkarte erhalten,,Vi trovis la VERDAN ŝlosilkarton.,Encuentras la tarjeta llave VERDE.,,VIHREÄ avainkortti poimittu.,Carte VERTE obtenue.,ZELENA ključna kartica je dobivena.,Megszerezted a ZÖLD kulcskártyát.,Ottenuta la card d'accesso VERDE.,グリーン キーカード ニュウシュ,획득: 초록색 키카드.,GROENE sleutelkaart ontvangen,Fått det GRØNNE nøkkelkortet.,Zdobyto ZIELONĄ kartę.,Pegou o cartão de passe VERDE.,,Ai achiziționat cardul VERDE.,Получена ЗЕЛЁНАЯ ключ-карта.,,Skaffade det GRÖNA nyckelkortet.,YEŞİL anahtar kartı elde edildi. +Obtained the YELLOW keycard.,GOTYELWCARD,,,,Sebrána ŽLUTÁ karta.,Opnået det GULLE nøglekort.,GELBE Schlüsselkarte erhalten,,Vi trovis la FLAVAN ŝlosilkarton.,Encuentras la tarjeta llave AMARILLA.,,KELTAINEN avainkortti poimittu.,Carte JAUNE obtenue.,ŽUTA ključna kartica je dobivena.,Megszerezted a SÁRGA kulcskártyát.,Ottenuta la card d'accesso GIALLA.,イエロー キーカード ニュウシュ,획득: 노란색 키카드.,GELE sleutelkaart ontvangen,Fått det GUL nøkkelkortet.,Zdobyto ŻÓŁTĄ kartę.,Pegou o cartão de passe AMARELO.,,Ai achiziționat cardul GALBEN.,Получена ЖЁЛТАЯ ключ-карта.,,Skaffade det GULLA nyckelkortet.,SARI anahtar kartı elde edildi. +Obtained the PURPLE keycard.,GOTREDCARD,,,,Sebrána FIALOVÁ karta.,Opnået det LILLA nøglekort.,VIOLETTE Schlüsselkarte erhalten,,Vi trovis la PURPURAN ŝlosilkarton.,Encuentras la tarjeta llave VIOLETA.,,VIOLETTI avainkortti poimittu.,Carte VIOLETTE obtenue.,LJUBIČASTA ključna kartica je dobivena.,Megszerezted a LILA kulcskártyát.,Ottenuta la card d'accesso VIOLA.,パープル キーカード ニュウシュ,획득: 보라색 키카드.,PAARSE sleutelkaart ontvangen,Fikk det LILLA nøkkelkortet.,Zdobyto FIOLETOWĄ kartę.,Pegou o cartão de passe ROXO.,,Ai achiziționat cardul MOV.,Получена ФИОЛЕТОВАЯ ключ-карта.,,Skaffade det LILA nyckelkortet.,MOR anahtar kartı elde edildi. +Obtained the GREEN key.,GOTBLUESKUL,,,,Sebrán ZELENÝ klíč.,Opnået den GRØNNE nøgle.,GRÜNEN Schlüssel erhalten,,Vi trovis la VERDAN ŝlosilon.,Encuentras la llave VERDE.,,VIHREÄ avain poimittu.,Clé VERTE obtenue.,ZELENI ključ je dobiven.,Megszerezted a ZÖLD kulcsot.,Ottenuta la chiave VERDE.,グリーン キー ニュウシュ,획득: 초록색 열쇠.,GROENE sleutel ontvangen,Fikk den GRØNNE nøkkelen.,Zdobyto ZIELONY klucz.,Pegou a chave VERDE.,,Ai achiziționat cheia VERDE.,Получен ЗЕЛЁНЫЙ ключ.,,Skaffade den GRÖNA nyckeln.,YEŞİL anahtar elde edildi. +Obtained the YELLOW key.,GOTYELWSKUL,,,,Sebrán ŽLUTÝ klíč.,Opnået den GULLE nøgle.,GELBEN Schlüssel erhalten,,Vi trovis la FLAVAN ŝlosilon.,Encuentras la llave AMARILLA.,,KELTAINEN avain poimittu.,Clé JAUNE obtenue.,ŽUTI ključ je dobiven.,Megszerezted a SÁRGA kulcsot.,Ottenuta la chiave GIALLA.,イエロー キー ニュウシュ,획득: 노란색 열쇠.,GELE sleutel ontvangen,Fikk den GULA nøkkelen.,Zdobyto ŻÓŁTY klucz.,Pegou a chave AMARELA.,,Ai achiziționat cheia GALBENĂ.,Получен ЖЁЛТЫЙ ключ.,,Skaffade den GULLA nyckeln.,SARI anahtar elde edildi. +Obtained the PURPLE key.,GOTREDSKUL,,,,Sebrán FIALOVÝ klíč.,Opnået den LILLA nøgle.,VIOLETTEN Schlüssel erhalten,,Vi trovis la PURPURAN ŝlosilon.,Encuentras la llave VIOLETA.,,VIOLETTI avain poimittu.,Clé VIOLETTE obtenue.,LJUBIČASTI ključ je dobiven.,Megszerezted a LILA kulcsot.,Ottenuta la chiave VIOLA.,パープル キー ニュウシュ,획득: 보라색 열쇠.,PAARSE sleutel ontvangen,Fikk den LILLA nøkkelen.,Zdobyto FIOLETOWY klucz.,Pegou a chave ROXA.,,Ai achiziționat cheia MOV.,Получен ФИОЛЕТОВЫЙ ключ.,,Skaffade den LILA nyckeln.,MOR anahtar elde edildi. +Healing mushroom,GOTSTIM,,,,Léčivka,Helbredende svamp,Heilpilz,,Saniga fungo,Seta medicinal,Hongo medicinal,Lääkesieni,Champignon médicinal,Ljekovita gljiva,Gyógyító gomba,Funghi curativi,ヒーリング マッシュルーム,사용: 체력회복 버섯.,Genezende paddenstoel,Helbredende sopp,Leczący grzyb,Cogumelo medicinal,,Ciupercă vindecătoare,Целебный гриб,,Helande svamp,İyileştirici mantar +Acquired: medical kit.,GOTMEDIKIT,,,,Získána lékárnička.,Erhvervet: medicinsk kit.,Erhalten: Medikit,,Vi trovis sukurkeston.,Encuentras un botiquín.,,Saatu: lääkintälaukku.,Acquis: Kit médical.,Nabavljen: medicinski pribor.,Megszerezve: orvosi csomag,Acquisito: kit medico.,シュトク: メディカルキット,사용: 의료 키트.,Verworven: medische kit.,Ervervet: medisinsk sett.,Zdobyto: apteczkę.,Pegou um kit médico.,,Ridicat: Kit de Prim-Ajutor.,Получена: Аптечка.,,Förvärvad: medicinsk utrustning.,Elde edilen: tıbbi kit. +Acquired: medical kit that you REALLY need.,GOTMEDINEED,,,,"Získána lékárnička, kterou OPRAVDU potřebuješ.","Erhvervet: medicinsk kit, som du VIRKELIG har brug for.","Erhalten: Medikit, das du WIRKLICH brauchst",,"Vi trovis sukurkeston, kiun vi VERE bezonas.",Encuentras un botiquín que REALMENTE necesitabas.,,"Saatu: lääkintälaukku, jota TODELLA tarvitsit.",Acquis: Kit médical. Besoin critique.,Nabavljen: medicinski pribor koji ti je STVARNO potreban.,Megszerezve: már NAGYON hiányzott orvosi csomag,Acquisito: kit medico di cui VERAMENTE avete bisogno.,シュトク: キンキュウジタイヲ スクウ メディカルキット,사용: 당신을 살려줄 의료 키트.,Verworven: medische kit die je ECHT nodig heeft.,Ervervet: medisinsk sett som du virkelig trenger.,"Zdobyto: apteczkę, której NAPRAWDĘ potrzebujesz.",Pegou um kit médico que você REALMENTE precisa.,,Ridicat: Kit de Prim-Ajutor de care CHIAR AI nevoie.,Получена: Аптечка (КРАЙНЕ необходимая).,,Förvärvad: medicinsk utrustning som du verkligen behöver.,Elde edilen: GERÇEKTEN ihtiyacınız olan tıbbi kit. +Map,GOTMAP,,,,Mapa,Kort,Karte,,Vi trovis la mapon,Mapa,,Kartta,Carte,Karta,Térkép,Mappa,コノ クイキノ マップダ ,획득: 지도.,Kaart,Kart,Mapa,Mapa,,Hartă,Карта,,Karta,Harita +Acquired: case of bullets.,GOTCLIPBOX,,,,Získána krabice nábojů.,Erhvervet: kasse med kugler.,Erhalten: Munitionskiste,,Vi trovis skatolon da kugloj.,Encuentras una caja de balas.,,Saatu: luotilaatikko.,Acquis: Boîte de balles.,Nabavljena: kutija metaka.,Megszerezve: doboznyi lőszer.,Acquisito: caso di proiettili.,シュトク: バレット ケース,획득: 회전포 탄약.,Verworven: geval van kogels.,Ervervet: tilfelle av kuler.,Zdobyto: pudełko naboi.,Pegou uma caixa de balas,,Achiziționat: Cutie de gloanțe.,Получен: Ящик с пулями.,,Förvärvad: väska med kulor.,Elde edilen: mermi kovanı. +Acquired: Grenade.,GOTROCKET,,,,Ziskán granát.,Erhvervet: Granat.,Erhalten: Granate,,Vi trovis grenadon.,Encuentras una granada.,,Saatu: kranaatti.,Acquis: Grenade.,Nabavljena: granata.,Megszerezve: Gránát.,Acquisito: Granata.,シュトク: グレネード,획득: 세열탄.,Verworven: Granaat.,Ervervet: Granat.,Zdobyto: Granat.,Pegou uma granada.,,Achiziționat: Grenadă.,Получена: Граната.,,Förvärvad: Granat.,Elde edildi: El bombası. +Acquired: Grenades.,GOTROCKBOX,,,,Ziskány granáty.,Erhvervet: Granater.,Erhalten: Granaten,,Vi trovis grenadojn.,Encuentras unas granadas.,,Saatu: kranaatteja.,Acquis: Grenades.,Nabavljene: granate.,Megszerezve: Gránátok.,Acquisito: Granate.,シュトク: グレネード セット,획득: 세열탄 여러 개.,Verworven: Granaten.,Ervervet: Granater.,Zdobyto: Granaty.,Pegou granadas.,,Achiziționat: Grenade.,Получены: Гранаты.,,Förvärvad: Granater.,Elde edildi: El bombaları. +Acquired: box of shotgun shells.,GOTSHELLBOX,,,,Získána krabice broků.,Erhvervet: kasse med haglpatroner.,Erhalten: Schrotpatronen,,Vi trovis skatolon da kartoĉoj.,Encuentras una caja de cartuchos de escopeta.,,Saatu: laatikollinen haulikon patruunoita.,Acquis: Boîte de cartouches.,Nabavljena: kutija čahura za pumpericu.,Megszerezve: doboznyi puska sörét,Acquisito: scatola di cartucce per fucile.,シュトク: シェル ボックス,획득: 산탄총 탄약.,Verworven: doos met shotgun schelpen.,Ervervet: eske med haglepatroner.,Zdobyto: pudełko loftek do strzelby.,Pegou uma caixa de cartuchos de espingarda.,,Achiziționat: Cutie de muniție pentru pușcă.,Получена: Коробка патронов дробовика.,,Förvärvad: låda med hagelpatroner.,Edinildi: Bir kutu av tüfeği fişeği. +Acquired: ammo backpack.,GOTBACKPACK,,,,Ziskán batoh s municí.,Erhvervet: ammunitionsrygsæk.,Erhalten: Munitionsrucksack,,Vi trovis tornistron da municioj.,Encuentras una mochila de municiones.,,Saatu: ammusreppu.,Acquis: Sac de munitions.,Nabavljen: ruksak streljiva.,Megszerezve: lőszeres hátizsák,Acquisito: zaino munizioni.,シュトク: バックパック,획득: 탄약 가방.,Verworven: munitie rugzak.,Ervervet: ryggsekk med ammunisjon.,Zdobyto: plecak z amunicją.,Pegou uma mochila de munição.,,Achiziționat: Raniță.,Получен: Ранец боеприпасов.,,Förvärvad: Ammunitionsryggsäck.,Edinildi: Cephane çantası. +Acquired: Grenade.,GOTBFG9000,,,,Získán granát.,Erhvervet: Granat.,Erhalten: Granate,,Vi trovis grenadon.,Encuentras una granada.,,Saatu: kranaatti.,Acquis: Grenade.,Nabavljena: granata.,Megszerezve: Gránát.,Acquisito: Granata.,シュトク: グレネード,획득: 세열탄.,Verworven: Granaat.,Ervervet: Granat.,Zdobyto: Granat.,Pegou uma granada.,,Achiziționat: Grenadă.,Получена: Граната.,,Förvärvad: Granat.,Elde edildi: El bombası. +Acquired: Minigun.,GOTCHAINGUN,,,,Získán kulomet.,Erhvervet: Minigun.,Erhalten: Minigun,,Vi trovis maŝinpafilon.,Encuentras una ametralladora.,,Saatu: minigun.,Acquis: Minigun.,Nabavljen: Minigun.,Megszerezve: Gépfegyver.,Acquisito: Minigun.,シュトク: ミニガン,획득: 회전포.,Verworven: Minigun.,Ervervet: Minigun.,Zdobyto: Minigun.,Pegou uma metralhadora giratória.,,Achiziționat: Minimitralieră.,Получен: Пулемёт.,,Förvärvad: Minigun.,Elde edildi: Minigun. +Acquired: Grenade launcher.,GOTLAUNCHER,,,,Získán granátomet.,Erhvervet: Granatkaster.,Erhalten: Granatwerfer,,Vi trovis grenadĵetilon.,Encuentras un lanzagranadas.,,Saatu: kranaatinheitin.,Acquis: Lance-Grenades,Nabavljen: bacač granata.,Megszerezve: Gránátvető,Acquisito: Lanciagranate.,シュトク: グレネードランチャー,획득: 세열탄 추진기.,Verworven: Granaatwerper.,Ervervet: Granatkaster.,Zdobyto: Wyrzutnię granatów.,Pegou um lança-granadas.,,Achiziționat: Lansator de grenade.,Получен: Гранатомёт.,,Förvärvad: Granatkastare.,Elde edildi: El bombası fırlatıcı. +Entropy thrower!,GOTPLASMA,,,,Vrhač entropie!,Entropi-lancer!,Entropiewerfer,,Entropi-ĵetilon!,¡Lanzador de entropía!,,Entropianheitin!,Acquis: Lanceur d'Entropie!,Bacač entropije!,Entrópiavető!,Lancia entropia!,エントロピースロワー!,획득: 엔트로피 방사기!,Entropiewerper!,Entropikaster!,Miotacz Entropii!,Lançador de entropia!,,Aruncător entropic!,Энтропиемёт!,,,Entropi fırlatıcı! +Acquired: Shotgun.,GOTSHOTGUN,,,,Získána brokovnice.,Erhvervet: Shotgun.,Erhalten: Schrotflinte,,Vi trovis kartoĉan fusilon.,Encuentras una escopeta.,,Saatu: haulikko.,Acquis: Fusil à pompe.,Nabavljena: pumperica.,Megszerezve: Sörétes puska,Acquisito: Fucile.,シュトク: ショットガン,획득: 산탄총.,Verworven: Shotgun.,Ervervet: Haglgevær.,Zdobyto: Strzelbę.,Pegou uma espingarda.,,Achiziționat: Pușcă.,Получен: Дробовик.,,Förvärvad: Hagelgevär,Edinildi: Av tüfeği. +God Mode ON,STSTR_DQDON,,,,Nesmrtelnost ZAP,Gud-tilstand PÅ,Gott-Modus AN,,Dio-Reĝimo AKTIVA,Modo Dios ACTIVADO,,Kuolemattomuustila PÄÄLLÄ,Mode invulnérable ON,Božanski način UKLJ.,Isten mód BE,Modalità Dio ATTIVATA,ゴッドモード オン,무적 치트: ON,God Modus AAN,Gudsmodus PÅ,Tryb Boga WŁĄCZONY,Modo Deus LIGADO,,Modul Invincibil PORNIT,Режим Бога ВКЛЮЧЁН,,Gud läge PÅ,Tanrı Modu AÇIK +God Mode OFF,STSTR_DQDOFF,,,,Nesmrtelnost VYP,Gud-tilstand FRA,Gott-Modus AUS,,Dio-Reĝimo NEAKTIVA,Modo Dios DESACTIVADO,,Kuolemattomuustila POIS PÄÄLTÄ,Mode invulnérable OFF,Božanski način ISKLJ.,Isten mód KI,Modalità Dio DISATTIVATA,ゴッドモード オフ,무적 치트: OFF,God Modus UIT,Gudsmodus AV,Tryb Boga WYŁĄCZONY,Modo Deus DESLIGADO,,Modul Invincibil OPRIT,Режим Бога ОТКЛЮЧЁН,,Gud läge AV,Tanrı Modu KAPALI +All weapons/ ammo/ keys,STSTR_KFAADDED,,,,Všechny zbraně/munice/klíče,Alle våben/ ammunition/ nøgler,"Alle Waffen, Munition und Schlüssel",,Ĉiuj armiloj/municioj/ŝlosiloj,Todas las armas/municiones/llaves,,Kaikki aseet/ ammukset/ avaimet,Toutes les armes/munitions/clés,Sva oružja/streljivo/ključevi,Minden fegyver / lőszer / kulcs,Tutte le armi / munizioni / chiavi,スベテノ ブキ/カギ/ダンヤク,추가: 모든 무기/탄약/열쇠 치트,Alle wapens / munitie / sleutels,Alle våpen / ammunisjon / nøkler,Wszystkie bronie/amunicja/klucze,Todas as armas/munição/chaves,,Toate armele/muniție/chei,Всё оружие/боеприпасы/ключи,,Alla vapen/ammunition/nycklar,Tüm silahlar/ cephane/ anahtarlar +All weapons and ammo,STSTR_FAADDED,,,,Všechny zbraně a munice,Alle våben og ammunition,Alle Waffen und Munition,,Ĉiuj armiloj kaj municioj,Todas las armas y municiones,,Kaikki aseet ja ammukset,Toutes les armes et munitions,Sva oružja i streljivo,Minden fegyver és lőszer,Tutte le armi e le munizioni,スベテノ ブキ/ダンヤク,추가: 모든 무기/탄약 치트,Alle wapens en munitie,Alle våpen og ammunisjon,Wszystkie bronie i amunicja,Todas as armas e munição completa,,Toate armele și muniție,Всё оружие и боеприпасы,,Alla vapen och all ammunition,Tüm silahlar ve cephane +Abduction,TXT_HARMMAP01,,,,Únos,Bortførelse,Entführung,,Forkapto,Abducción,,Sieppaus,Enlèvement,Otmica,Elrablás,Il rapimento,アブダクション,유괴,Ontvoering,Bortføring,Porwanie,Sequestro,,Răpire,Похищение,,Bortförande,Kaçırılma +Harm's Way,TXT_HARMMAP02,,,,Nebezpečí,,In Gefahr,,Vojo de danĝero,En peligro,,Vaara,Mise en Danger,Štetan način,Baj,La via del danno,ハーム'ズ ウェイ,해함의 길,,,Niebezpieczeństwo,No Caminho do Perigo,,Calea pericolului,Опасный путь,,Harms väg,Zarar Görebilecek Durumda +Owt Mood,TXT_HARMMAP03,,,,Špatný pocit,,Missstimmung,,Sentaĉo,Buen humor,,Nollatunnelma,Scontento,Kakvo raspoloženje,Túlterhelve,Scontento,ヤバイムード,이상한 분위기,,,Paskudny Nastrój,Mau Humor,,Fricțiune,Нестроение,,Dåligt stämning,Kötü Ruh Hali +Megalapolis,TXT_HARMMAP04,,,,Megalopole,,Megalopolis,,Megtropolo,Megalópolis,,Megalopoli,Mégalopole,Megalopolis,Megalopolisz,Megalapoli,メガラポリス,거대 도시,Megalopolis,,Megalapolis,Megalópole,,Megalopolis,Мегалаполис,,,Megalapolis +The Hospital,TXT_HARMMAP05,,,,Nemocnice,Hospitalet,Das Hospital,,La malsanulejo,El hospital,,Sairaala,L'Hôpital,Bolnica,Kórház,L'ospedale,ホスピタル,병동,Het ziekenhuis,Sykehuset,Szpital,O Hospital,,Spitalul,Больница,,Sjukhuset,Hastane +The Weapons Factory,TXT_HARMMAP06,,,,Továrna na zbraně,Våbenfabrikken,Die Waffenfabrik,,La armil-fabriko,La fábrica de armas,,Asetehdas,L'Usine d'Armes,Tvornica oružja,Fegyvergyár,La fabbrica di armi,ウェポンファクトリー,무기 공장,De Wapenfabriek,Våpenfabrikken,Fabryka Broni,A Fábrica de Armamentos,,Fabrica de Arme,Оружейный завод,,Vapenfabriken,Silah Fabrikası +The Underwater Lab,TXT_HARMMAP07,,,,Podvodní laboratoř,Undervandslaboratoriet,Das Unterwasserlabor,,La subakva labotorio,El laboratorio submarino,,Vedenalainen laboratorio,Le Laboratoire Sous-marin,Podvodni laboratorij,Vízalatti labor,Il laboratorio subacqueo,アンダーウォーターラボ,해저 연구소,Het onderwaterlaboratorium,Undervannslaboratoriet,Podwodne Laboratorium,O Laboratório Submarino,,Laboratorul Subacvatic,Подводная лаборатория,,Undervattenslaboratoriet,Sualtı Laboratuvarı +Airstrip One,TXT_HARMMAP08,,,,Přistávací dráha jedna,Landingsbane et,Flugplatz Eins,,Surteriĝejo numero unu,Pista de aterrizaje uno,,Kiitorata Yksi,Piste D'Atterrisage Un,Uzletište 1,1-es kifutó,Pista Uno,エアーシップ ワン,활주로 1호,Vliegveld Een,Flystripe én,Lądowisko Numer Jeden,Base Aérea Um,,Pista Unu,Взлётная полоса №1,,Landningsbana ett,Birinci Pist +The Launch Base,TXT_HARMMAP09,,,,Vzletová základna,Affyringsbasen,Die Startbasis,,La lanĉbazo,La base de despegue,,Laukaisutukikohta,La Base de Lancement,Baza za lansiranje,Kilövő Állomás,La base di lancio,ランチャーベース,발진기지,De lanceerbasis,Utskytningsbasen,Baza Startowa,A Base de Lançamento,,Baza de Lansare,Пусковая площадка,,Avfyrningsbasen,Fırlatma Üssü +The Radioactive Zone,TXT_HARMMAP10,,,,Radioaktivní zóna,Den radioaktive zone,Die radioaktive Zone,,La radioaktiva zono,La zona radioactiva,,Radioaktiivinen vyöhyke,La Zone Radioactive,Radioaktivna zona,Radioaktív Zóna,La zona radioattiva,ラディオアクティブ ゾーン,방사능 처리소,De Radioactieve Zone,Den radioaktive sonen,Radioaktywna Strefa,A Zona Radioativa,,Zona Radioactivă,Заражённая зона,,Den radioaktiva zonen,Radyoaktif Bölge +Echidna,TXT_HARMMAP11,,,,,,,,Ekidno,Equidna,,Nokkasiili,,Echidna,Hangyászsün,,エキドナ,에키드나,,,,Equidna,,,Ехидна,,,Echidna "You feel sick to your stomach... Looking in the face of the mutant queen... That thing... That used to be... @@ -209,7 +209,24 @@ tuer votre amie.. ""L'Enfer n'a pas de fureur qui égale celle d'une femme dédaignée!"" - = F I N =","Felkavarodik a gyomrod...Ahogy a mutáns királynő szemébe nézel...Az az izé...nemrég még...A barátod volt...Amira! + = F I N =","Osjećaš mučninu u želucu... +Gledaš u lice kraljice mutanata... +Ta stvar... To je nekad bila... +Tvoja prijateljica... Amira! + +Ta čudovišta su sigurno pronašla način +da ju mutiraju i pretvore u ovo +odvratno stvorenje koje će nositi njihovo potomstvo. + +-uzdah- + +Saberi se... +Oni će platiti što su te natjerali da ubiješ +svoju prijateljicu... + +""Pakao nema bijesa kao žena prezrena!"" + + = K R A J =","Felkavarodik a gyomrod...Ahogy a mutáns királynő szemébe nézel...Az az izé...nemrég még...A barátod volt...Amira! Ezek a szörnyek minden bizonnyal meglelték a módját, hogy ezzé a borzasztó lénnyé mutálják, aki később az ivadékukat hordja ki. @@ -235,7 +252,7 @@ Pagheranno per averti farti uccidere la tua amica... ""L'inferno non ha furia come una donna oltraggiata!"" - = L A F I N E = + = F I N E = ","貴方はミュータントの女王の顔を見た時 気分が凄まじく悪くなった... その顔は... 見覚えがあった... @@ -411,12 +428,12 @@ bir kadın gibi öfke yoktur!"" = SON =" -,WI_FINISHED,This text is deliberately empty,,,,,,,,,,,,,,,,,,,,,,,,, -Loading,WI_ENTERING,Yellow needs retranslation,,,Načítá se,Indlæsning,Lade,,Ŝargante,Cargando,,Ladattavana,Chargement,Betöltés,Caricamento,ローディング,불러오는 중,Laden van,Laster,Ładowanie,Carregando,,Se încarcă,Загрузка уровня,,Laddar,Yükleniyor -Very Easy,SKILL_BABY,,,,Velmi snadné,Meget let,Sehr einfach,,Tre facila,Muy fácil,,Erittäin helppo,Trés facile,Nagyon könnyű,Molto facile,ベリーイージー,아주 쉬움,Zeer gemakkelijk,Veldig lett,Bardzo Łatwy,Muito fácil,,Foarte Ușor,Очень легко,,Mycket lätt,Çok Kolay -Easy,SKILL_EASY,,,,Snadný,Let,Einfach,,Facila,Fácil,,Helppo,Facile,Könnyű,Facile,イージー,쉬움,Gemakkelijk,Lett,Łatwy,Fácil,,Ușor,Легко,,Lätt,Kolay -Medium,SKILL_NORMAL,,,,Střední,Middel,Mittel,,Meza,Normal,,Keskivaikea,Moyen,Normál,Medio,ミディアム,중간,Middel,Middels,Średni,Médio,,Mediu,Средне,,Medel,Orta -Hard,SKILL_HARD,,,,Obtížný,Svær,Schwer,,Malfacila,Difícil,,Vaikea,Difficile,Nehéz,Difficile,ハード,어려움,Moeilijk,Vanskelig,Trudny,Difícil,,Greu,Тяжело,,Svårt,Sert -Very Hard,SKILL_NIGHTMARE,,,,Velmi obtížné,Meget svær,Sehr schwer,,Tre malfacila,Muy difícil,,Erittäin vaikea,Très difficile,Nagyon nehéz,Molto difficile,ベリーハード,아주 어려윰,Zeer moeilijk,Svært vanskelig,Bardzo Trudny,Muito difícil,,Foarte Greu,Очень тяжело,,Mycket svårt,Çok Zor -Thanks for playing,HARMQUITMSG,,,,Díky za hraní,Tak for at spille,Danke fürs Spielen,,Dankon pro ludado,Gracias por jugar,,Kiitos pelaamisesta,Merci d'avoir joué,"Köszönjük, hogy játszottál!",Grazie per aver giocato,プレイ シテクレテ カンシャスル,플레이 해주셔서 감사드립니다,Bedankt voor het spelen,Takk for at du spilte,Dziękuję za grę,Obrigado por jogar,,Mulțumim că ai jucat,"Спасибо, что сыграли в Harmony",,Tack för att du spelar,Oynadığınız için teşekkürler -Harmony,TXT_D2E1,,,,,,,,Harmonio,,,Harmonia,,Harmónia,,,,,,Harmonia,,,,,,, \ No newline at end of file +,WI_FINISHED,This text is deliberately empty,,,,,,,,,,,,,,,,,,,,,,,,,, +Loading,WI_ENTERING,Yellow needs retranslation,,,Načítá se,Indlæsning,Lade,,Ŝargante,Cargando,,Ladattavana,Chargement,Učitavanje,Betöltés,Caricamento,ローディング,불러오는 중,Laden van,Laster,Ładowanie,Carregando,,Se încarcă,Загрузка уровня,,Laddar,Yükleniyor +Very Easy,SKILL_BABY,,,,Velmi snadné,Meget let,Sehr einfach,,Tre facila,Muy fácil,,Erittäin helppo,Trés facile,Jako lako,Nagyon könnyű,Molto facile,ベリーイージー,아주 쉬움,Zeer gemakkelijk,Veldig lett,Bardzo Łatwy,Muito fácil,,Foarte Ușor,Очень легко,,Mycket lätt,Çok Kolay +Easy,SKILL_EASY,,,,Snadný,Let,Einfach,,Facila,Fácil,,Helppo,Facile,Lako,Könnyű,Facile,イージー,쉬움,Gemakkelijk,Lett,Łatwy,Fácil,,Ușor,Легко,,Lätt,Kolay +Medium,SKILL_NORMAL,,,,Střední,Middel,Mittel,,Meza,Normal,,Keskivaikea,Moyen,Srednje,Normál,Medio,ミディアム,중간,Middel,Middels,Średni,Médio,,Mediu,Средне,,Medel,Orta +Hard,SKILL_HARD,,,,Obtížný,Svær,Schwer,,Malfacila,Difícil,,Vaikea,Difficile,Teško,Nehéz,Difficile,ハード,어려움,Moeilijk,Vanskelig,Trudny,Difícil,,Greu,Тяжело,,Svårt,Sert +Very Hard,SKILL_NIGHTMARE,,,,Velmi obtížné,Meget svær,Sehr schwer,,Tre malfacila,Muy difícil,,Erittäin vaikea,Très difficile,Jako teško,Nagyon nehéz,Molto difficile,ベリーハード,아주 어려윰,Zeer moeilijk,Svært vanskelig,Bardzo Trudny,Muito difícil,,Foarte Greu,Очень тяжело,,Mycket svårt,Çok Zor +Thanks for playing,HARMQUITMSG,,,,Díky za hraní,Tak for at spille,Danke fürs Spielen,,Dankon pro ludado,Gracias por jugar,,Kiitos pelaamisesta,Merci d'avoir joué,Hvala na igranju!,"Köszönjük, hogy játszottál!",Grazie per aver giocato,プレイ シテクレテ カンシャスル,플레이 해주셔서 감사드립니다,Bedankt voor het spelen,Takk for at du spilte,Dziękuję za grę,Obrigado por jogar,,Mulțumim că ai jucat,"Спасибо, что сыграли в Harmony",,Tack för att du spelar,Oynadığınız için teşekkürler +Harmony,TXT_D2E1,,,,,,,,Harmonio,,,Harmonia,,Harmonija,Harmónia,,,,,,Harmonia,,,,,,, \ No newline at end of file diff --git a/wadsrc_extra/static/language.csv b/wadsrc_extra/static/language.csv index a4e0b0053..2a62c0fcc 100644 --- a/wadsrc_extra/static/language.csv +++ b/wadsrc_extra/static/language.csv @@ -1,316 +1,316 @@ -default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr -,,Doom Episode names,,,,,,,,,,,,,,,,,,,"As long as there is no other Portuguese variant, the language ID should be two letters only!",,,,,, -Knee-Deep in the Dead,TXT_D1E1,,,,Po kolena v mrtvých,Knæet dybt i de døde,Knietief im Tod,Βουτηγμένος στους Νεκρούς μέχρι τα γόνατα,Ĝiskole inter mortintoj,Hasta el cuello entre muertos,,Polvia myöten vainajissa,Plongé dans la Mort,Térdig halálban,Nella morte fino al collo,膝元迫る亡者,끝없이 밀려오는 죽음,Knie-diep in de Doden,Knedyp i de døde,Po kolana w trupach,Corpos até os Joelhos,,Îngropat printre Cadavre,По колено в трупах,До колена у лешевима,Knä-djupt i de döda,Ölüme Diz Boyu -The Shores of Hell,TXT_D1E2,,,,Břehy pekla,Helvedes kyster,Die Ufer der Hölle,Οι Ακτές της Κόλασης,La Infer-bordoj,Las orillas del Infierno,,Hornan rannat,Les Portes de l'Enfer,A pokol tornáca,Le rive dell'Inferno,地獄の瀬戸際,지옥의 해변,De Oevers van de Hel,Helvetes kyster,Przedsionek piekieł,As Margens do Abismo,,Țărmurile Iadului,Прибрежье преисподней,Обале пакла,Helvetets stränder,Cehennem Kıyıları -Inferno,TXT_D1E3,,,,,,,Πυρ το Εξώτερον,,,,,,Alvilág,,インフェルノ,연옥,,,,,,Infernul,Инферно,Инферно,,İnferno +default,Identifier,Remarks,Filter,eng enc ena enz eni ens enj enb enl ent enw,cs,da,de,el,eo,es,esm esn esg esc esa esd esv eso esr ess esf esl esy esz esb ese esh esi esu,fi,fr,hr,hu,it,jp,ko,nl,no nb,pl,pt,ptg,ro,ru,sr,sv,tr +,,Doom Episode names,,,,,,,,,,,,,,,,,,,,"As long as there is no other Portuguese variant, the language ID should be two letters only!",,,,,, +Knee-Deep in the Dead,TXT_D1E1,,,,Po kolena v mrtvých,Knæet dybt i de døde,Knietief im Tod,Βουτηγμένος στους Νεκρούς μέχρι τα γόνατα,Ĝiskole inter mortintoj,Hasta el cuello entre muertos,,Polvia myöten vainajissa,Plongé dans la Mort,Do koljena u smrti,Térdig halálban,Nella morte fino al collo,膝元迫る亡者,끝없이 밀려오는 죽음,Knie-diep in de Doden,Knedyp i de døde,Po kolana w trupach,Corpos até os Joelhos,,Îngropat printre Cadavre,По колено в трупах,До колена у лешевима,Knä-djupt i de döda,Ölüme Diz Boyu +The Shores of Hell,TXT_D1E2,,,,Břehy pekla,Helvedes kyster,Die Ufer der Hölle,Οι Ακτές της Κόλασης,La Infer-bordoj,Las orillas del Infierno,,Hornan rannat,Les Portes de l'Enfer,Obale pakla,A pokol tornáca,Le rive dell'Inferno,地獄の瀬戸際,지옥의 해변,De Oevers van de Hel,Helvetes kyster,Przedsionek piekieł,As Margens do Abismo,,Țărmurile Iadului,Прибрежье преисподней,Обале пакла,Helvetets stränder,Cehennem Kıyıları +Inferno,TXT_D1E3,,,,,,,Πυρ το Εξώτερον,,,,,,Pakao,Alvilág,,インフェルノ,연옥,,,,,,Infernul,Инферно,Инферно,,İnferno Thy Flesh Consumed,TXT_D1E4,"The episode and levels' names in E4 are taken from the Bible. -Proverbs 5:11",,,Tvé tělo pozřeto,Dit kød er fortæret,Dein Leib verzehrt,Η Σάρκα σου θα Καταναλωθεί,Kiam konsumiĝos via karno,Cuando tu carne se consuma,,Lihasi kulutettu,Votre Chair Consumée,Megemésztetik a te húsod,La tua Carne Consumata,滅びし汝の身,쇠패해진 그대의 육신,Uw Vlees Geconsumeerd,Ditt kjøtt fortæres,Ciało twe zwiotczeje,No Consumir-se da Tua Carne,,Carnea ta Fără de Vlagă,Твоя плоть поглощена,Твоје месо строшено,Ditt kött är uppslukat,Etin Tükendi -Hell On Earth,TXT_D2E1,,,,Peklo na zemi,Helvede på jorden,Hölle auf Erden,Αρμαγεδδών,Infero sur la Tero,Infierno en la Tierra,,Helvetti maan päällä,Enfer sur Terre,Földi pokol,Inferno sulla Terra,第三惑星:地獄,지상에 강림한 지옥,Hel op Aarde,Helvete på jorden,Piekło na Ziemi,Inferno na Terra,,Iadul pe Pământ,Ад на Земле,Пакао на Земљи,Helvetet på jorden,Yeryüzündeki Cehennem -No Rest for the Living,TXT_D2E2,"References ""No rest for the wicked"" in Isaiah 48:22",,,Nemajíť živí pokoje,Ingen hvile for de levende,Keine Ruhe für die Lebenden,Καμία Ανάπαυση για τους Ζωντανούς,Nenia ripozo por la vivantoj,No hay descanso para los vivos,,Ei lepoa eläville,Pas de repos pour les vivants,Nincs nyugodalom az élőnek,Nessun Riposo per i Vivi,休息なき生計,산 자에게 휴식은 없다,Geen Rust voor de Levenden,Ingen hvile for de levende,Nie ma pokoju dla żywych,Não Há Descanso Para os Vivos,,Cei vii Fără de Odihnă,Не будет покоя живым,Нема одмора живима,Ingen vila för de levande,Yaşayanlara Huzur Yok -The Plutonia Experiment,TXT_PLUT_EP,,,,Experiment Plutonia,Plutonia-eksperimentet,Das Plutonia Experiment,Το Πείραμα Πλουτώνια,La eksperimento de Plutonia,El experimento Plutonia,,Plutoniakokemus,L'expérience Plutonia,A Plutonia-kísérlet,L'Esperimento di Plutonia,プルトニア記,플루토니아 익스페리먼트,Het Plutonia Experiment,Plutonia-eksperimentet,Eksperyment Plutonia,O Experimento Plutonia,A Experiência Plutonia,Experimentul Plutonia,Эксперимент «Плутония»,Експеримент Плутонија,Plutonia-experimentet,Plutonia Deneyi -TNT: Evilution,TXT_TNT_EP,,,,TNT: Zlovoluce,,,ΤΝΤ: Κακοξέλιξη,TNT: Mavalucio,TNT: Diabolución,,TNT: Paholuutio,,,TNT: Malvoluzione,TNT:邪神化,TNT: 이블루션,Tnt: Evilutie,,TNT: Ewolucja zła,TNT: Malvolução,,TNT: Diavoluția,TNT: Дьяволюция,TNT: Ђаволуција,, -Chex Quest,TXT_CHEX_EP,,,,Mise Chex,,,Η Περιπέτεια του Chex,Aventuro de Chex,,,Chex-seikkailu,,,,チェックス クエスト,첵스 퀘스트,,,Misja Chex,,,,,Чекс Квест,, -,,Level names,,,,,,,,,,,,,,,,,,,,,,,,, -,,Doom 1,,,,,,,,,,,,,,,,,,,,,,,,, -E1M1: Hangar,HUSTR_E1M1,,,,E1M1: Hangár,,,E1Χ1: Υπόστεγο,E1M1: Hangaro,,,E1M1: Lentoalushalli,,E1M1: Hangár,,E1M1: 格納庫,E1M1: 격납고,,,,,,,E1M1: Ангар,E1M1: Хангар,, -E1M2: Nuclear Plant,HUSTR_E1M2,,,,E1M2: Jaderná elektrárna,E1M2: Atomkraftværk,E1M2: Kernkraftwerk,E1Χ2: Πυρηνικό Εργοστάσιο,E1M2: Nuklea centralo,E1M2: Central nuclear,,E1M2: Ydinvoimala,E1M2: Centrale Nucléaire,E1M2: Atomerőmű,E1M2: Centrale Nucleare,E1M2: 原子力発電所,E1M2: 원자력 발전소,E1M2: Kerncentrale,E1M2: Kjernekraftverk,E1M2: Elektrownia Jądrowa,E1M2: Usina Nuclear,E1M2: Central Nuclear,E1M2: Uzina Nucleară,E1M2: Атомная электростанция,E1M2: Нуклеарна електрана,E1M2: Kärnkraftverk,E1M2: Nükleer Santral -E1M3: Toxin Refinery,HUSTR_E1M3,,,,E1M3: Chemická rafinerie,E1M3: Giftraffinaderi,E1M3: Giftraffinerie,E1Χ3: Διυλιστήριο Τοξινών,E1M3: Toksin-rafinejo,E1M3: Refinería de toxinas,,E1M3: Myrkkyjalostamo,E1M3: Raffinerie de Toxines,E1M3: Méregfinomító,E1M3: Raffineria delle Tossine,E1M3: 毒素精錬所 ,E1M3: 폐기물 정제소,E1M3: Giftstofraffinaderij,E1M3: Giftraffineri,E1M3: Rafineria Toksyn,E1M3: Refinaria de Toxinas,,E1M3: Rafinăria de Toxine,E1M3: Очистной завод,E1M3: Рафинерија за токсине,E1M3: Toxinraffinaderi,E1M3: Toksin Rafinerisi -E1M4: Command Control,HUSTR_E1M4,,,,E1M4: Řídící velín,E1M4: Kommandokontrol,E1M4: Betriebssteuerung,E1Χ4: Κέντρο Ελέγχου,E1M4: Komando kaj kontrolo,E1M4: Mando y control,,E1M4: Komentohallinta,E1M4: Centre de Contrôle,E1M4: Parancsnoki vezérlő,E1M4: Centrale di Comando,E1M4: 指令管制塔,E1M4: 지휘 통제소,E1M4: Controlecentrum,E1M4: Kommandokontroll,E1M4: Kontrola Dowodzenia,E1M4: Controle de Comando,E1M4: Controlo de Comando,E1M4: Comandă și Control,E1M4: Пункт управления,E1M4: Заповедни центар,E1M4: Kommandokontroll,E1M4: Komuta Kontrol -E1M5: Phobos Lab,HUSTR_E1M5,,,,E1M5: Phobosská laboratoř,E1M5: Phobos-laboratorium,E1M5: Phobos-Labor,E1Χ5: Εργαστήριο Φόβου,E1M5: Laboratorio sur Fobo,E1M5: Laboratorio de Fobos,,E1M5: Phoboksen laboratorio,E1M5: Laboratoires Phobos,E1M5: Phoboszi laboratórium,E1M5: Laboratorio di Phobos,E1M5: フォボス研究所,E1M5: 포보스 연구소,E1M5: Phobos Laboratorium,E1M5: Phobos-laboratorium,E1M5: Laboratoria Fobosa,E1M5: Laboratório de Fobos,,E1M5: Laboratorul Phobos,E1M5: Лаборатория Фобоса,E1M5: Лабораторија на Фобосу,E1M5: Phobos-laboratorium,E1M5: Phobos Laboratuvarı -E1M6: Central Processing,HUSTR_E1M6,,,,E1M6: Centrální zpracování,E1M6: Central behandling,E1M6: Zentralverarbeitung,E1Χ6: Κεντρική Επεξεργασία,E1M6: Procesorad-centralo,E1M6: Central de procesamiento,,E1M6: Käsittelykeskus,E1M6: Centre de Traitement,E1M6: Központi feldolgozó,E1M6: Zona Elaboratori,E1M6: 中央処理施設,E1M6: 중앙 처리 본부,E1M6: Centrale Verwerking,E1M6: Sentral prosessering,E1M6: Centralne Przetwarzanie,E1M6: Processamento Central,,E1M6: Prelucrare Centrală,E1M6: Центральный пункт обработки,E1M6: Централна обрада,E1M6: Central bearbetning,E1M6: Merkezi İşlem -E1M7: Computer Station,HUSTR_E1M7,,,,E1M7: Počítačová stanice,E1M7: Computerstation,E1M7: Computerstation,E1Χ7: Σταθμός Υπολογιστών,E1M7: Komputila stacio,E1M7: Estación de cómputo,,E1M7: Tietokoneasema,E1M7: Station Informatique,E1M7: Számítógépes központ,E1M7: Stazione dei Computer,E1M7: コンピューターステーション,E1M7: 컴퓨터 기지,E1M7: Computerstation,E1M7: Datastasjon,E1M7: Stacja Komputerowa,E1M7: Estação de Computadores,,E1M7: Stația de Calculatoare,E1M7: Вычислительный центр,E1M7: Компјутерска станица,E1M7: Datorstation,E1M7: Bilgisayar İstasyonu -E1M8: Phobos Anomaly,HUSTR_E1M8,,,,E1M8: Phobosská anomálie,E1M8: Phobos-anomali,E1M8: Phobos-Anomalie,E1Χ8: Ανωμαλία στον Φόβο,E1M8: Nenormalaĵo sur Fobo,E1M8: Anomalía de Fobos,,E1M8: Phoboksen poikkeama,E1M8: Anomalie de Phobos,E1M8: Phoboszi anomália,E1M8: L'anomalia di Phobos,E1M8: フォボス アノマリー,E1M8: 포보스 이상거점,E1M8: Phobos Anomalie,E1M8: Phobos-anomali,E1M8: Anomalia Fobosa,E1M8: Anomalia de Fobos,,E1M8: Anomalia Phobos,E1M8: Аномалия Фобоса,E1M8: Аномалија на Фобосу,E1M8: Phobos anomali,E1M8: Phobos Anomalisi -E1M9: Military Base,HUSTR_E1M9,,,,E1M9: Vojenská základna,E1M9: Militærbase,E1M9: Militärbasis,E1Χ9: Στρατιωτική Βάση,E1M9: Militbazo,E1M9: Base militar,,E1M9: Sotilastukikohta,E1M9: Base Militaire ,E1M9: Katonai bázis,E1M9: Base militare,E1M9: 軍事基地,E1M9: 군사 기지,E1M9: Militaire Basis,E1M9: Militærbase,E1M9: Baza Wojskowa,E1M9: Base Militar,,E1M9: Baza Militară,E1M9: Военная база,E1M9: Војна база,E1M9: Militärbas,E1M9: Askeri Üs -E1M10: Sewers,HUSTR_E1M10,,,,E1M10: Kanály,E1M10: Kloakkerne,E1M10: Kanalisation,,E1M10: Kloako,E1M10: Alcantarillas,,E1M10: Viemärit,E1M10: Egouts,E1M10: Kanálisok,E1M10: Le Fogne,E1M10: 下水道,E1M10: 하수구,E1M10: De Rioleringen,E1M10: Kloakk,E1M10: Ścieki,E1M10: Os Esgotos,,E1M10: Canalizarea,E1M10: Канализация,E1M10: Канализација,E1M10: Avloppsledningar,E1M10: Kanalizasyonlar -E2M1: Deimos Anomaly,HUSTR_E2M1,,,,E2M1: Deimosská anomálie,E2M1: Deimos Anomali,E2M1: Deimos-Anomalie,E2Χ1: Ανωμαλία στον Δείμο,E2M1: Nenormalaĵo sur Dejmo,E2M1: Anomalía de Deimos,,E2M1: Deimoksen poikkeama,E2M1: Anomalie de Déimos,E2M1: Deimoszi anomália,E2M1: L'anomalia di Deimos,E2M1: 異常なるダイモス,E2M1: 데이모스 이상거점,E2M1: Deimos Anomalie,E2M1: Deimos-anomali,E2M1: Anomalia Deimosa,E2M1: Anomalia de Deimos,,E2M1: Anomalia Deimos,E2M1: Аномалия Деймоса,E2M1: Аномалија на Дејмосу,E2M1: Deimos-anomali,E2M1: Deimos Anomalisi -E2M2: Containment Area,HUSTR_E2M2,,,,E2M2: Skladiště,E2M2: Indespærringsområde,E2M2: Lagerhalle,E2Χ2: Ζώνη Περιορισμού,E2M2: Magazeno,E2M2: Área de almacenamiento,,E2M2: Säilöntäalue,E2M2: Zone de Stockage,E2M2: Raktár,E2M2: Area di contenimento,E2M2: 収容エリア,E2M2: 화물 보관구역,E2M2: Inperkingsgebied,E2M2: Innesperringsområde,E2M2: Obszar Zastrzeżony,E2M2: Area de Contenção,E2M2: Área de Confinamento,E2M2: Zona de Izolare,E2M2: Зона сдерживания,E2M2: Складишта,E2M2: Lagringsområde,E2M2: Çevreleme Alanı -E2M3: Refinery,HUSTR_E2M3,,,,E2M3: Rafinerie,E2M3: Raffinaderi,E2M3: Raffinerie,E2Χ3: Διυλιστήριο,E2M3: Rafinejo,E2M3: Refinería,,E2M3: Jalostamo,E2M3: Raffinerie,E2M3: Finomító,E2M3: Raffineria,E2M3: 精製所,E2M3: 정제소,E2M3: Raffinaderij,E2M3: Raffineri,E2M3: Rafineria,E2M3: Refinaria,,E2M3: Rafinărie,E2M3: Перерабатывающий завод,E2M3: Рафинерија,E2M3: Raffinaderi,E2M3: Rafineri -E2M4: Deimos Lab,HUSTR_E2M4,,,,E2M4: Deimosská laboratoř,E2M4: Deimos-laboratorium,E2M4: Deimos Labor,E2Χ4: Εργαστήριο Δείμου,E2M4: Laboratorio sur Dejmo,E2M4: Laboratorio de Deimos,,E2M4: Deimoksen laboratorio,E2M4: Laboratoires Déimos,E2M4: Deimoszi laboratórium,E2M4: Laboratorio di Deimos,E2M4: ダイモス研究所,E2M4: 데이모스 연구소,E2M4: Deimos Laboratorium,E2M4: Deimos-laboratoriet,E2M4: Laboratoria Deimosa,E2M4: Laboratório de Deimos,,E2M4: Laboratorul Deimos,E2M4: Лаборатория Деймоса,E2M4: Лабораторија на Дејмосу,E2M4: Deimos Lab,E2M4: Deimos Laboratuvarı -E2M5: Command Center,HUSTR_E2M5,,,,E2M5: Řídící středisko,E2M5: Kommandocentral,E2M5: Kommandozentrum,E2Χ5: Κέντρο Διοίκησης,E2M5: Komandcentro,E2M5: Centro de mando,,E2M5: Komentokeskus,E2M5: Centre de Commandement,E2M5: Központi parancsnokság,E2M5: Centro di Comando,E2M5: 指令本部,E2M5: 사령부,E2M5: Commandocentrum,E2M5: Kommandosentralen,E2M5: Centrum Dowodzenia,E2M5: Centro de Comando,,E2M5: Centru de Comandă,E2M5: Командный центр,E2M5: Командни центар,E2M5: Kommandocentrum,E2M5: Komuta Merkezi -E2M6: Halls of the Damned,HUSTR_E2M6,,,,E2M6: Chodby zatracených,E2M6: De Forbandedes haller,E2M6: Säle der Verdammten,E2X6: Διάδρομοι των Κολασμένων,E2M6: Koridoroj de la damnitoj,E2M6: Salones de los malditos,,E2M6: Kirottujen salit,E2M6: Halls des Damnés,E2M6: Az átkozottak termei,E2M6: Sale dei Dannati,E2M6: ダムドの会堂,E2M6: 저주받은 회랑,E2M6: Zalen der Verdoemden,E2M6: De fordømtes haller,E2M6: Korytarze Przeklętych,E2M6: Salões dos Condenados,,E2M6: Camerele Blestemaților,E2M6: Залы проклятых,E2M6: Дворана проклетих,E2M6: De fördömdas salar,E2M6: Lanetliler Salonu -E2M7: Spawning Vats,HUSTR_E2M7,,,,E2M7: Plodné kádě,E2M7: Spirebassiner,E2M7: Materialisationskammern,E2X7: Δεξαμενές Γέννησης,E2M7: Nasko-kuvegoj,E2M7: Silos de materialización,,E2M7: Sikiämissammiot,E2M7: Cuves de Reproduction,E2M7: Szaporító tartályok,E2M7: Vasche di Riproduzione,E2M7: 産卵桶,E2M7: 산란독,E2M7: Materialisatietanks,E2M7: Gytekarene,E2M7: Kadzie Reprodukcyjne,E2M7: Tanques de Criação,,E2M7: Cuve de Reproducere,E2M7: Нерестилище,E2M7: Размножавалиште,E2M7: Växthus för spädning,E2M7: Yumurtlama Fıçıları -E2M8: Tower of Babel,HUSTR_E2M8,,,,E2M8: Babylonská věž,E2M8: Babelstårn,E2M8: Turmbau zu Babel,E2Χ8: Πύργος της Βαβέλ,E2M8: Turo de Babelo,E2M8: Torre de Babel,,E2M8: Baabelin torni,E2M8: Tour de Babel,E2M8: Bábel tornya,E2M8: Torre di Babele,E2M8: バベルの塔,E2M8: 바벨탑,E2M8: Toren van Babel,E2M8: Babels tårn,E2M8: Wieża Babel,E2M8: Torre de Babel,,E2M8: Turnul Babel,E2M8: Вавилонская башня,E2M8: Вавилонска кула,E2M8: Babels torn,E2M8: Babil Kulesi -E2M9: Fortress of Mystery,HUSTR_E2M9,,,,E2M9: Pevnost záhad,E2M9: Mysteriets fæstning,E2M9: Geheimnisvolle Festung,E2Χ9: Φρούριο του Μυστηρίου,E2M9: Fortreso de mistero,E2M9: Fortaleza del misterio,,E2M9: Salaperäisyyden linnake,E2M9: Mystérieuse Forteresse,E2M9: A rejtélyek erődje,E2M9: Fortezza del Mistero,E2M9: 神秘の要塞,E2M9: 신비의 요새,E2M9: Vesting der Mysterie,E2M9: Mysteriets festning,E2M9: Forteca Tajemnic,E2M9: Fortaleza do Mistério,,E2M9: Fortăreața Misterelor,E2M9: Крепость тайн,E2M9: Тврђава тајни,E2M9: Mysteriets fästning,E2M9: Gizem Kalesi -E3M1: Hell Keep,HUSTR_E3M1,,,,E3M1: Pekelná tvrz,E3M1: Helvedesborg,E3M1: Höllenbollwerk,E3Χ1: Ακροπύργιο της Κολάσεως,E3M1: Infera ĉefturo,E3M1: Torreón del Infierno,,E3M1: Hornantorni,E3M1: Donjon Infernal,E3M1: A pokol bástyái,E3M1: Bastioni dell'Inferno,E3M1: 牢獄,E3M1: 지옥 성채,E3M1: Helleslot,E3M1: Helvetes borg,E3M1: Twierdza Piekieł,E3M1: Torre do Inferno,,E3M1: Fortul Iadului,E3M1: Крепость Ада,E3M1: Тврђава пакла,E3M1: Helvetesborg,E3M1: Cehennem Kalesi -E3M2: Slough of Despair,HUSTR_E3M2,,,,E3M2: Bažina zoufalství,E3M2: Fortvivlelsens sump,E3M2: Sumpf der Verzweiflung,E3Χ2: Έλος της Απελπισίας,E3M2: Ŝlimejo de malespero,E3M2: Ciénaga de la desesperación,,E3M2: Epätoivon räme,E3M2: Bourbier du Désespoir,E3M2: A kétségbeesés mocsara,E3M2: Palude della Disperazione,E3M2: 絶望の大地,E3M2: 절망의 심연,E3M2: Moeras der Wanhoop,E3M2: Fortvilelsens sump,E3M2: Bagno Rozpaczy,E3M2: Lamaçal do Desespero,,E3M2: Mlaștinile Disperării,E3M2: Трясина отчаяния,E3M2: Блато очајања,E3M2: Förtvivlans svackor,E3M2: Umutsuzluk Slough'u -E3M3: Pandemonium,HUSTR_E3M3,,,,,E3M3: Pandemonium,E3M3: Pandämonium,E3Χ3: Πανδαιμόνιο,E3M3: Pandemonio,E3M3: Pandemonio,,,E3M3: Pandémonium,E3M3: Zűrzavar,E3M3: Pandemonio,E3M3: 伏魔殿,E3M3: 복마전,,,E3M3: Piekło,E3M3: Pandemônio,,E3M3: Pandemoniu,E3M3: Пандемоний,E3M3: Пандемонијум,E3M3: Pandemonium,E3M3: Pandemonium -E3M4: House of Pain,HUSTR_E3M4,,,,E3M4: Dům bolesti,E3M4: Hus af smerte,E3M4: Haus des Schmerzes,E3Χ4: Σπίτι του Πόνου,E3M4: Domo de doloro,E3M4: Casa del dolor,,E3M4: Tuskanmaja,E3M4: Maison de la Douleur,E3M4: A kínok háza,E3M4: Casa del Dolore,E3M4: 苦痛の館,E3M4: 고통의 집,E3M4: Huis van Pijn,E3M4: Smertens hus,E3M4: Dom Bólu,E3M4: Casa da Dor,,E3M4: Casa Durerii,E3M4: Обитель боли,E3M4: Кућа патње,E3M4: Smärtans hus,E3M4: Acı Evi -E3M5: Unholy Cathedral,HUSTR_E3M5,,,,E3M5: Bezbožná katedrála,E3M5: Uhellig katedral,E3M5: Unheilige Kathedrale,E3X5: Ανίερος Καθεδρικός,E3M5: Malsankta katedralo,E3M5: Catedral profana,,E3M5: Epäpyhä katedraali,E3M5: Cathédrale Profane,E3M5: Az istentelen katedrális ,E3M5: Cattedrale Blasfema,E3M5: 邪教の大聖堂,E3M5: 불경한 성당,E3M5: Onheilige Kathedraal,E3M5: Den vanhellige katedralen,E3M5: Bluźniercza Katedra,E3M5: Catedral Profana,,E3M5: Catedrala Necurată,E3M5: Нечестивый собор,E3M5: Несвета катедрала,E3M5: Den oheliga katedralen,E3M5: Kutsal Olmayan Katedral -E3M6: Mt. Erebus,HUSTR_E3M6,Volcano in Antarctica,,,E3M6: Hora Erebus,,,E3X6: Όρος Έρεβος,E3M6: Monto de Erebo,E3M6: Monte Erebus,,E3M6: Erebusvuori,E3M6: Mont Erèbe,E3M6: Erebus-hegy,E3M6: Monte Erebus,E3M6: エレボス山,E3M6: 에레버스 산,,E3M6: Erebus-fjellet,E3M6: Góra Erebus,E3M6: Monte Érebo,,E3M6: M. Erebus,E3M6: Гора Эребус,E3M6: Планина Еребус,,E3M6: Erebus Dağı -E3M7: Limbo,HUSTR_E3M7,,,,E3M7: Předpeklí,,,E3Χ7: Είσοδος της Κολάσεως,,,,E3M7: Limbus,E3M7: Limbes,E3M7: Limbus,,E3M7: 忘却の地,E3M7: 고성소,,,E3M7: Otchłań,,,E3M7: Limb,E3M7: Чистилище,E3M7: Лимбо,,E3M7: Araf -E3M8: Dis,HUSTR_E3M8,"Based on the City of Dis, located on the sixth circle of Hell, according to Dante Alighieri's The Divine Comedy",,,,,,E3Χ8: Δίτα,E3M8: Danteca,E3M8: Ciudad de Dite,,,E3M8: Dité,,E3M8: Dite,E3M8: 死,E3M8: 디스,,,,E3M8: Dite,,E3M8: Dite,E3M8: Дит,E3M8: Дис,, -E3M9: Warrens,HUSTR_E3M9,,,,E3M9: Brlohy,E3M9: Rotteboet,E3M9: Rattennest,E3X9: Λαγούμια,E3M9: Nestego,E3M9: Madrigueras,,E3M9: Sokkelot,E3M9: Clapiers,E3M9: Nyúlkert,E3M9: Le Garenne,E3M9: 兎小屋,E3M9: 토끼굴,E3M9: Doolhof,E3M9: Rottebo,E3M9: Królikarnia,E3M9: Tocas,,E3M9: Vizuini,E3M9: Изнорье,E3M9: Одгајалиште,E3M9: Vildmark,E3M9: Sıçan yuvası -E4M1: Hell Beneath,HUSTR_E4M1,Proverbs 15:24,,,E4M1: Peklo v hlubinách,E4M1: Helvede nedenunder,E4M1: Die Hölle unterwärts,E4Χ1: Κάτω Κόσμος,E4M1: Ŝeolo malsupre,E4M1: Seol abajo,,E4M1: Tuonela alhaalla,E4M1: Le Séjour des Morts,E4M1: A holtak hazája odalent,E4M1: In Basso,E4M1: 地獄の下へ,E4M1: 지옥의 밑에서,E4M1: Hel beneden,E4M1: Helvete under,E4M1: Piekło Najgłębsze,E4M1: Inferno Abaixo,E4M1: Inferno Profundo,E4M1: Iadul de Jos,E4M1: Преисподняя под ногами,E4M1: Пакао одоздо,E4M1: Helvetet under,E4M1: Cehennem Altında -E4M2: Perfect Hatred,HUSTR_E4M2,Psalm 139:22,,,E4M2: Naprostá nenávist,E4M2: Perfekt had,E4M2: Perfekter Hass,E4Χ2: Τέλειο Μίσος,E4M2: Ekstrema malamo,E4M2: Aborrecer por completo,,E4M2: Kaikella vihalla,E4M2: Une Parfaite Haine,E4M2: Teljes gyűlölettel,E4M2: Odio Perfetto,E4M2: 完全なる憎悪,E4M2: 완벽한 증오,E4M2: Perfecte Haat,E4M2: Perfekt hat,E4M2: Pełnia Nienawiści,E4M2: Ódio Perfeito,,E4M2: Ură Desăvârșită,E4M2: Полная ненависть,E4M2: Пуном мрзошћу,E4M2: Perfekt Hass,E4M2: Kusursuz Nefret -E4M3: Sever The Wicked,HUSTR_E4M3,Matthew 13:49,,,E4M3: Oddělit zkažené,E4M3: Afskære de onde,E4M3: Scheidet die Bösen,E4Χ3: Ξερίζωσε τους Πονηρούς,E4M3: Apartigi la malbonulojn,E4M3: Apartarán a los malos,,E4M3: Erottavat pahat,E4M3: Séparer les Vicieux,E4M3: Felnégyelni a bűnösöket,E4M3: Separeranno I Cattivi,E4M3: 邪悪を絶つ,E4M3: 악령처단,E4M3: Scheid de goddelozen af,E4M3: Skille ut de onde,E4M3: Oddzielą Niegodziwych,E4M3: Separarão os Maus,E4M3: Separarão o Mal,E4M3: Să Desparți pe Cei Răi,E4M3: Отделить злых,E4M3: Одлучи зле,E4M3: Separera de onda,E4M3: Kötüleri Kesin -E4M4: Unruly Evil,HUSTR_E4M4,James 3:8,,,E4M4: Nezkrotitelné zlo,E4M4: Ustyrlig ondskab,E4M4: Schandbare Worte,E4X4: Ασυγκράτητο Κακό,E4M4: Malkvieta malbono,E4M4: Mal irrefrenable,,E4M4: Levotointa pahuutta,E4M4: Un Mal Irrépréssible,E4M4: Féktelen gonosz,E4M4: Male Senza Posa,E4M4: 手に負えない邪悪,E4M4: 광폭한 악마,E4M4: Het weerbarstige kwaad,E4M4: Uregjerlig ondskap,E4M4: Niepohamowane Zło,E4M4: Mal Irrefreável,E4M4: Mal que não Refreia,E4M4: Un Rău fără Astâmpăr,E4M4: Неудержимое зло,Е4М4: Немирно зло,E4M4: Den oregerliga ondskan,E4M4: Asi Kötülük -E4M5: They Will Repent,HUSTR_E4M5,Luke 16:30,,,E4M5: Budou činit pokání,E4M5: De vil omvende sig,E4M5: Sie werden bereuen,E4X5: Θα Μετανοήσουν,E4M5: Ili pentos,E4M5: Se arrepentirán,,E4M5: He parannuksen tekisivät,E4M5: Ils se repentiront,E4M5: Megtérnek majd,E4M5: Si Ravvederanno,E4M5: 奴等に後悔を,E4M5: 그들은 회개할 지어다,E4M5: Ze zullen berouw hebben,E4M5: De vil omvende seg,E4M5: Nawrócą Się,E4M5: Arrepender-se,E4M5: Eles Arrepender-se-iam,E4M5: Se vor Pocăi,E4M5: Они покаются,E4M5: Покајаће се,E4M5: De kommer att ångra sig,E4M5: Tövbe Edecekler -E4M6: Against Thee Wickedly,HUSTR_E4M6,Psalm 139:20,,,E4M6: Při svých pletichách,E4M6: Mod dig ondskabsfuldt,E4M6: Feinde erheben sich,E4X6: Κακόβουλα Εναντίον Σου,E4M6: Pri Vi malice,E4M6: Blasfemias contra ti,,E4M6: Sinusta petollisesti,E4M6: D'une manière criminelle,E4M6: Hitványul ellened,E4M6: Contro di te Malvagiamente,E4M6: 汝への悪逆,E4M6: 그대와 짖궂게 맞서다,E4M6: Tegen de goddeloze,E4M6: Mot deg ondskapsfullt,E4M6: Podstępnie Przeciw Tobie,E4M6: Malvadamente Contra Ti,,E4M6: Te Grăiesc de Rău,E4M6: Против тебя нечестиво,E4M6: Ружно на тебе,E4M6: Mot dig ondskan,E4M6: Sana Karşı Kötüce -E4M7: And Hell Followed,HUSTR_E4M7,Revelation 6:8,,,E4M7: A peklo šlo za ním,E4M7: Og Helvede fulgte efter,E4M7: Und die Hölle folgte,E4X7: Και η Κόλαση Ακολούθησε,E4M7: Kaj Hades sekvis,E4M7: El Hades le seguía,E4M7: El Hades lo seguía,E4M7: Ja Tuonela seurasi,E4M7: Et l'Enfer Suivit,E4M7: És a pokol követé azt,E4M7: E l'inferno seguitava,E4M7: そして地獄は従った,E4M7: 그리고 지옥이 뒤따른다,E4M7: En de hel volgde,E4M7: Og helvete fulgte,E4M7: A Piekło Szło Za Nim,E4M7: E o Inferno Seguia,E4M7: Inferno o Seguia,E4M7: Iadul se Ținea după El,E4M7: И последовал Ад,E4M7: И пакао иђаше,E4M7: Och helvetet följde,E4M7: Ve Cehennem Takip Etti -E4M8: Unto The Cruel,HUSTR_E4M8,Proverbs 5:9,,,E4M8: Ukrutníku odevzdáš,E4M8: Til de grusomme,E4M8: Deine Jahre dem Grausamen,E4X8: Προς Τους Ανελεήμονες,E4M8: Al la kruelulo,E4M8: Tus años al cruel,,E4M8: Armottomalle,E4M8: A un Homme cruel,E4M8: A kegyetlennek,E4M8: Al Crudele,E4M8: 容赦なき者へ,E4M8: 잔혹한 자에게로,E4M8: Naar de wrede,E4M8: Til de grusomme,E4M8: Kto Nie Zna Litości,E4M8: Aos Cruéis,E4M8: Entregue a Cruéis,E4M8: Unuia Fără de Milă,E4M8: К мучителю,E4M8: Немилостивоме,E4M8: Mot de grymma,E4M8: Zalimlere Karşı -E4M9: Fear,HUSTR_E4M9,,,,E4M9: Strach,E4M9: Frygt,E4M9: Angst,E4Χ9: Τρόμος,E4M9: Timo,E4M9: Miedo,,E4M9: Pelko,E4M9: Terreur,E4M9: Félelem,E4M9: Paura,E4M9: 恐怖,E4M9: 공포,E4M9: Angst,E4M9: Frykt,E4M9: Strach,E4M9: Medo,,E4M9: Frica,E4M9: Страх,E4M9: Страх,E4M9: Rädsla,E4M9: Korku -,,Doom 2,,,,,,,,,,,,,,,,,,,,,,,,, -Level 1: Entryway,HUSTR_1,"Note that the ""LEVEL"" part of the string will be stripped so it shouldn't be translated",,,Level 1: Vchod,Level 1: Indgang,Level 1: Eingangshalle,Επίπεδο 1: Είσοδος,Nivelo 1: Enirejo,Nivel 1: Entrada,,Taso 1: Eteiskäytävä,NIVEAU 1: Hall D'Entrée,1. Pálya: Bejárat,Livello 1: Ingresso,Level 1: 入口,레벨 1: 초입,Level 1: Ingang,Nivå 1: Inngangen,Level 1: Wejście,Fase 1: Entrada,Nível 1: Entrada,Nivelul 1: Intrarea,Уровень №1: Вход,Level 1: Улаз,Nivå 1: Ingång,Seviye 1: Giriş Yolu -Level 2: Underhalls,HUSTR_2,,,,Level 2: Podzemí,Level 2: Underbukser,Level 2: Kellergewölbe,,Nivelo 2: Subteraj vojoj,Nivel 2: Salones subterráneos,,Taso 2: Maanalaiset käytävät,NIVEAU 2: Souterrains,2. Pálya: Alagutak,Livello 2: Sotterranei,Level 2: 地下堂,레벨 2: 지하수로,Level 2: Onderhallen,Nivå 2: Underhaller,Level 2: Podziemia,Fase 2: Subterrâneo,Nível 2: Subterrâneo,Nivelul 2: Pasaje subterane,Уровень №2: Подземные ходы,Level 2: Подземни ходници,Nivå 2: Underhallar,Seviye 2: Tulumlar -Level 3: The Gantlet,HUSTR_3,“a form of punishment in which a person is forced to run between two lines of men facing each other and armed with clubs or whips to beat the victim”,,,Level 3: Trest,Level 3: Spidsrod,Level 3: Spießrutenlauf,,Nivelo 3: La vergokuro,Nivel 3: Carrera de baquetas,,Taso 3: Kujanjuoksu,NIVEAU 3: Parcours du Combatant,3. Pálya: Vesszőfutás,Livello 3: Le Forche,Level 3: ガントレット,레벨 3: 건틀릿,Level 3: De gantlet,Nivå 3: Hansken,Level 3: Praszczęta,Fase 3: A Punição,Nível 3: A Punição,Nivelul 3: Stroiul,Уровень №3: Сквозь строй,Level 3: Казна,Nivå 3: Utmaningen,Seviye 3: Zorluk -Level 4: The Focus,HUSTR_4,,,,Level 4: Ohnisko,Level 4: Fokus,Level 4: Der Fokus,,Nivelo 4: La fokuso,Nivel 4: El foco,,Taso 4: Polttopiste,NIVEAU 4: Le Focus,4. Pálya: A középpont,Livello 4: L'Epicentro,Level 4: フォーカス,레벨 4: 초점,Level 4: De focus,Nivå 4: Fokus,Level 4: Skupisko,Fase 4: O Foco,Nível 4: O Foco,Nivelul 4: Focarul,Уровень №4: Средоточие,Level 4: Средиште,Nivå 4: Fokus,Seviye 4: Odaklanma -Level 5: The Waste Tunnels,HUSTR_5,,,,Level 5: Odpadní tunely,Level 5: Affaldstunnellerne,Level 5: Die Abfall-Tunnel,Επίπεδο 5: Οι Σήραγγες Αποβλήτων,Nivelo 5: La rubtuneloj,Nivel 5: Los túneles de desechos,,Taso 5: Jätetunnelit,NIVEAU 5: Les Egouts,5. Pálya: Szennyvízalagutak,Livello 5: I Tunnel dei Rifiuti,Level 5: 廃棄トンネル,레벨 5: 하수도,Level 5: De afvaltunnels,Nivå 5: Avfallstunnelene,Level 5: Kanały,Fase 5: Os Túneis de Dejetos,Nível 5: Os Túneis de Dejetos,Nivelul 5: Tuneluri de deșeuri,Уровень №5: Сточные туннели,Level 5: Отпадни тунели,Nivå 5: Avfallstunnlarna,Seviye 5: Atık Tünelleri -Level 6: The Crusher,HUSTR_6,,,,Level 6: Drtička,Level 6: Knuseren,Level 6: Die Presse,Επίπεδο 6: Ο Συνθλιπτής,Nivelo 6: La dispistilo,Nivel 6: La trituradora,,Taso 6: Murskaaja,NIVEAU 6: Le Broyeur,6. Pálya: A zúzda,Livello 6: La Pressa,Level 6: クラッシャー,레벨 6: 분쇄기,Level 6: De maalmachine,Nivå 6: Knuseren,Level 6: Zgniatarka,Fase 6: O Esmagador,Nível 6: O Esmagador,Nivelul 6: Zdrobitorul,Уровень №6: Давилка,Level 6: Разбијач,Nivå 6: krossen,Seviye 6: Kırıcı -Level 7: Dead Simple,HUSTR_7,,,,Level 7: Smrtelně prosté,Level 7: Død simpel,Level 7: Tödlich einfach,Επίπεδο 7: Πανεύκολο,Nivelo 7: Morte simpla,Nivel 7: Simplemente muerto,,Taso 7: Kuolettavan yksinkertainen,NIVEAU 7: Mortellement Simple,7. Pálya: Halálegyszerű,Livello 7: Morte Pura,Level 7: 死ぬほど単純,레벨 7: 죽여주는 단순함,Level 7: Dodelijk eenvoudig,Nivå 7: Helt enkelt,Level 7: Śmiertelnie Proste,Fase 7: Mortalmente Simples,Nível 7: Simplesmente Mortal,Nivelul 7: Mortal de simplu,Уровень №7: Смертельно просто,Level 7: Смртно једноставно,Nivå 7: Död enkel,Seviye 7: Ölü Basit -Level 8: Tricks and Traps,HUSTR_8,,,,Level 8: Lesti a léčky,Level 8: Tricks og fælder,Level 8: Tricks und Fallen,Επίπεδο 8: Κόλπα και Παγίδες,Nivelo 8: Trompoj kaj embuskoj,Nivel 8: Trucos y trampas,,Taso 8: Metkuja ja pauloja,NIVEAU 8: Ruses et Pièges,8. Pálya: Cselek és csapdák,Livello 8: Trucchi e Trappole,Level 8: 悪戯と罠,레벨 8: 속임수와 함정들,Level 8: Trucs en vallen,Nivå 8: Triks og feller,Level 8: Sztuczki i Pułapki,Fase 8: Truques e Armadilhas,Nível 8: Truques e Armadilhas,Nivelul 9: Surprize și capcane,Уровень №8: Уловки и ловушки,Level 8: Замке и смицалице,Nivå 8: Tricks och fällor,Seviye 8: Hileler ve Tuzaklar -Level 9: The Pit,HUSTR_9,,,,Level 9: Jáma,Level 9: Gruben,Level 9: Die Grube,Επίπεδο 9: Λάκκος,Nivelo 9: La fosaĵo,Nivel 9: El pozo,,Taso 9: Monttu,NIVEAU 9: La Fosse,9. Pálya: A gödör,Livello 9: Il Pozzo,Level 9: 大穴,레벨 9: 구덩이,Level 9: De groeve,Nivå 9: Gropen,Level 9: Jama,Fase 9: O Fosso,Nível 9: O Fosso,Nivelul 9: Groapa,Уровень №9: Яма,Level 9: Јама,Nivå 9: Grottan,Seviye 9: Çukur -Level 10: Refueling Base,HUSTR_10,,,,Level 10: Tankovací základna,Level 10: Tankstation,Level 10: Treibstoffbunker,Επίπεδο 10: Βάση Ανεφοδιασμού,Nivelo 10: Refuelbazo,Nivel 10: Base de reabastecimiento,,Taso 10: Tankkausasema,NIVEAU 10: Base de Ravitaillement,10. Pálya: Tankolóállomás,Livello 10: Base di Rifornimento,Level 10: 補給基地,레벨 10: 연료 충전소,Level 10: Tankstation,Nivå 10: Påfyllingsbasen,Level 10: Stacja Tankowania,Fase 10: Base de Reabastecimento,Nível 10: Base de Reabastecimento,Nivelul 10: Baza de alimentare,Уровень №10: Заправочная база,Level 10: Бензинска база,Nivå 10: Tankningsbasen,Seviye 10: Yakıt İkmal Üssü +Proverbs 5:11",,,Tvé tělo pozřeto,Dit kød er fortæret,Dein Leib verzehrt,Η Σάρκα σου θα Καταναλωθεί,Kiam konsumiĝos via karno,Cuando tu carne se consuma,,Lihasi kulutettu,Votre Chair Consumée,Tvoje tijelo je konzumirano,Megemésztetik a te húsod,La tua Carne Consumata,滅びし汝の身,쇠패해진 그대의 육신,Uw Vlees Geconsumeerd,Ditt kjøtt fortæres,Ciało twe zwiotczeje,No Consumir-se da Tua Carne,,Carnea ta Fără de Vlagă,Твоя плоть поглощена,Твоје месо строшено,Ditt kött är uppslukat,Etin Tükendi +Hell On Earth,TXT_D2E1,,,,Peklo na zemi,Helvede på jorden,Hölle auf Erden,Αρμαγεδδών,Infero sur la Tero,Infierno en la Tierra,,Helvetti maan päällä,Enfer sur Terre,Pakao na Zemlji,Földi pokol,Inferno sulla Terra,第三惑星:地獄,지상에 강림한 지옥,Hel op Aarde,Helvete på jorden,Piekło na Ziemi,Inferno na Terra,,Iadul pe Pământ,Ад на Земле,Пакао на Земљи,Helvetet på jorden,Yeryüzündeki Cehennem +No Rest for the Living,TXT_D2E2,"References ""No rest for the wicked"" in Isaiah 48:22",,,Nemajíť živí pokoje,Ingen hvile for de levende,Keine Ruhe für die Lebenden,Καμία Ανάπαυση για τους Ζωντανούς,Nenia ripozo por la vivantoj,No hay descanso para los vivos,,Ei lepoa eläville,Pas de repos pour les vivants,Nema odmora za žive,Nincs nyugodalom az élőnek,Nessun Riposo per i Vivi,休息なき生計,산 자에게 휴식은 없다,Geen Rust voor de Levenden,Ingen hvile for de levende,Nie ma pokoju dla żywych,Não Há Descanso Para os Vivos,,Cei vii Fără de Odihnă,Не будет покоя живым,Нема одмора живима,Ingen vila för de levande,Yaşayanlara Huzur Yok +The Plutonia Experiment,TXT_PLUT_EP,,,,Experiment Plutonia,Plutonia-eksperimentet,Das Plutonia Experiment,Το Πείραμα Πλουτώνια,La eksperimento de Plutonia,El experimento Plutonia,,Plutoniakokemus,L'expérience Plutonia,Plutonia eksperiment,A Plutonia-kísérlet,L'Esperimento di Plutonia,プルトニア記,플루토니아 익스페리먼트,Het Plutonia Experiment,Plutonia-eksperimentet,Eksperyment Plutonia,O Experimento Plutonia,A Experiência Plutonia,Experimentul Plutonia,Эксперимент «Плутония»,Експеримент Плутонија,Plutonia-experimentet,Plutonia Deneyi +TNT: Evilution,TXT_TNT_EP,,,,TNT: Zlovoluce,,,ΤΝΤ: Κακοξέλιξη,TNT: Mavalucio,TNT: Diabolución,,TNT: Paholuutio,,TNT: Zla evolucija,,TNT: Malvoluzione,TNT:邪神化,TNT: 이블루션,Tnt: Evilutie,,TNT: Ewolucja zła,TNT: Malvolução,,TNT: Diavoluția,TNT: Дьяволюция,TNT: Ђаволуција,, +Chex Quest,TXT_CHEX_EP,,,,Mise Chex,,,Η Περιπέτεια του Chex,Aventuro de Chex,,,Chex-seikkailu,,Chexova potraga,,,チェックス クエスト,첵스 퀘스트,,,Misja Chex,,,,,Чекс Квест,, +,,Level names,,,,,,,,,,,,,,,,,,,,,,,,,, +,,Doom 1,,,,,,,,,,,,,,,,,,,,,,,,,, +E1M1: Hangar,HUSTR_E1M1,,,,E1M1: Hangár,,,E1Χ1: Υπόστεγο,E1M1: Hangaro,,,E1M1: Lentoalushalli,,,E1M1: Hangár,,E1M1: 格納庫,E1M1: 격납고,,,,,,,E1M1: Ангар,E1M1: Хангар,, +E1M2: Nuclear Plant,HUSTR_E1M2,,,,E1M2: Jaderná elektrárna,E1M2: Atomkraftværk,E1M2: Kernkraftwerk,E1Χ2: Πυρηνικό Εργοστάσιο,E1M2: Nuklea centralo,E1M2: Central nuclear,,E1M2: Ydinvoimala,E1M2: Centrale Nucléaire,,E1M2: Atomerőmű,E1M2: Centrale Nucleare,E1M2: 原子力発電所,E1M2: 원자력 발전소,E1M2: Kerncentrale,E1M2: Kjernekraftverk,E1M2: Elektrownia Jądrowa,E1M2: Usina Nuclear,E1M2: Central Nuclear,E1M2: Uzina Nucleară,E1M2: Атомная электростанция,E1M2: Нуклеарна електрана,E1M2: Kärnkraftverk,E1M2: Nükleer Santral +E1M3: Toxin Refinery,HUSTR_E1M3,,,,E1M3: Chemická rafinerie,E1M3: Giftraffinaderi,E1M3: Giftraffinerie,E1Χ3: Διυλιστήριο Τοξινών,E1M3: Toksin-rafinejo,E1M3: Refinería de toxinas,,E1M3: Myrkkyjalostamo,E1M3: Raffinerie de Toxines,,E1M3: Méregfinomító,E1M3: Raffineria delle Tossine,E1M3: 毒素精錬所 ,E1M3: 폐기물 정제소,E1M3: Giftstofraffinaderij,E1M3: Giftraffineri,E1M3: Rafineria Toksyn,E1M3: Refinaria de Toxinas,,E1M3: Rafinăria de Toxine,E1M3: Очистной завод,E1M3: Рафинерија за токсине,E1M3: Toxinraffinaderi,E1M3: Toksin Rafinerisi +E1M4: Command Control,HUSTR_E1M4,,,,E1M4: Řídící velín,E1M4: Kommandokontrol,E1M4: Betriebssteuerung,E1Χ4: Κέντρο Ελέγχου,E1M4: Komando kaj kontrolo,E1M4: Mando y control,,E1M4: Komentohallinta,E1M4: Centre de Contrôle,,E1M4: Parancsnoki vezérlő,E1M4: Centrale di Comando,E1M4: 指令管制塔,E1M4: 지휘 통제소,E1M4: Controlecentrum,E1M4: Kommandokontroll,E1M4: Kontrola Dowodzenia,E1M4: Controle de Comando,E1M4: Controlo de Comando,E1M4: Comandă și Control,E1M4: Пункт управления,E1M4: Заповедни центар,E1M4: Kommandokontroll,E1M4: Komuta Kontrol +E1M5: Phobos Lab,HUSTR_E1M5,,,,E1M5: Phobosská laboratoř,E1M5: Phobos-laboratorium,E1M5: Phobos-Labor,E1Χ5: Εργαστήριο Φόβου,E1M5: Laboratorio sur Fobo,E1M5: Laboratorio de Fobos,,E1M5: Phoboksen laboratorio,E1M5: Laboratoires Phobos,,E1M5: Phoboszi laboratórium,E1M5: Laboratorio di Phobos,E1M5: フォボス研究所,E1M5: 포보스 연구소,E1M5: Phobos Laboratorium,E1M5: Phobos-laboratorium,E1M5: Laboratoria Fobosa,E1M5: Laboratório de Fobos,,E1M5: Laboratorul Phobos,E1M5: Лаборатория Фобоса,E1M5: Лабораторија на Фобосу,E1M5: Phobos-laboratorium,E1M5: Phobos Laboratuvarı +E1M6: Central Processing,HUSTR_E1M6,,,,E1M6: Centrální zpracování,E1M6: Central behandling,E1M6: Zentralverarbeitung,E1Χ6: Κεντρική Επεξεργασία,E1M6: Procesorad-centralo,E1M6: Central de procesamiento,,E1M6: Käsittelykeskus,E1M6: Centre de Traitement,,E1M6: Központi feldolgozó,E1M6: Zona Elaboratori,E1M6: 中央処理施設,E1M6: 중앙 처리 본부,E1M6: Centrale Verwerking,E1M6: Sentral prosessering,E1M6: Centralne Przetwarzanie,E1M6: Processamento Central,,E1M6: Prelucrare Centrală,E1M6: Центральный пункт обработки,E1M6: Централна обрада,E1M6: Central bearbetning,E1M6: Merkezi İşlem +E1M7: Computer Station,HUSTR_E1M7,,,,E1M7: Počítačová stanice,E1M7: Computerstation,E1M7: Computerstation,E1Χ7: Σταθμός Υπολογιστών,E1M7: Komputila stacio,E1M7: Estación de cómputo,,E1M7: Tietokoneasema,E1M7: Station Informatique,,E1M7: Számítógépes központ,E1M7: Stazione dei Computer,E1M7: コンピューターステーション,E1M7: 컴퓨터 기지,E1M7: Computerstation,E1M7: Datastasjon,E1M7: Stacja Komputerowa,E1M7: Estação de Computadores,,E1M7: Stația de Calculatoare,E1M7: Вычислительный центр,E1M7: Компјутерска станица,E1M7: Datorstation,E1M7: Bilgisayar İstasyonu +E1M8: Phobos Anomaly,HUSTR_E1M8,,,,E1M8: Phobosská anomálie,E1M8: Phobos-anomali,E1M8: Phobos-Anomalie,E1Χ8: Ανωμαλία στον Φόβο,E1M8: Nenormalaĵo sur Fobo,E1M8: Anomalía de Fobos,,E1M8: Phoboksen poikkeama,E1M8: Anomalie de Phobos,,E1M8: Phoboszi anomália,E1M8: L'anomalia di Phobos,E1M8: フォボス アノマリー,E1M8: 포보스 이상거점,E1M8: Phobos Anomalie,E1M8: Phobos-anomali,E1M8: Anomalia Fobosa,E1M8: Anomalia de Fobos,,E1M8: Anomalia Phobos,E1M8: Аномалия Фобоса,E1M8: Аномалија на Фобосу,E1M8: Phobos anomali,E1M8: Phobos Anomalisi +E1M9: Military Base,HUSTR_E1M9,,,,E1M9: Vojenská základna,E1M9: Militærbase,E1M9: Militärbasis,E1Χ9: Στρατιωτική Βάση,E1M9: Militbazo,E1M9: Base militar,,E1M9: Sotilastukikohta,E1M9: Base Militaire ,,E1M9: Katonai bázis,E1M9: Base militare,E1M9: 軍事基地,E1M9: 군사 기지,E1M9: Militaire Basis,E1M9: Militærbase,E1M9: Baza Wojskowa,E1M9: Base Militar,,E1M9: Baza Militară,E1M9: Военная база,E1M9: Војна база,E1M9: Militärbas,E1M9: Askeri Üs +E1M10: Sewers,HUSTR_E1M10,,,,E1M10: Kanály,E1M10: Kloakkerne,E1M10: Kanalisation,,E1M10: Kloako,E1M10: Alcantarillas,,E1M10: Viemärit,E1M10: Egouts,,E1M10: Kanálisok,E1M10: Le Fogne,E1M10: 下水道,E1M10: 하수구,E1M10: De Rioleringen,E1M10: Kloakk,E1M10: Ścieki,E1M10: Os Esgotos,,E1M10: Canalizarea,E1M10: Канализация,E1M10: Канализација,E1M10: Avloppsledningar,E1M10: Kanalizasyonlar +E2M1: Deimos Anomaly,HUSTR_E2M1,,,,E2M1: Deimosská anomálie,E2M1: Deimos Anomali,E2M1: Deimos-Anomalie,E2Χ1: Ανωμαλία στον Δείμο,E2M1: Nenormalaĵo sur Dejmo,E2M1: Anomalía de Deimos,,E2M1: Deimoksen poikkeama,E2M1: Anomalie de Déimos,,E2M1: Deimoszi anomália,E2M1: L'anomalia di Deimos,E2M1: 異常なるダイモス,E2M1: 데이모스 이상거점,E2M1: Deimos Anomalie,E2M1: Deimos-anomali,E2M1: Anomalia Deimosa,E2M1: Anomalia de Deimos,,E2M1: Anomalia Deimos,E2M1: Аномалия Деймоса,E2M1: Аномалија на Дејмосу,E2M1: Deimos-anomali,E2M1: Deimos Anomalisi +E2M2: Containment Area,HUSTR_E2M2,,,,E2M2: Skladiště,E2M2: Indespærringsområde,E2M2: Lagerhalle,E2Χ2: Ζώνη Περιορισμού,E2M2: Magazeno,E2M2: Área de almacenamiento,,E2M2: Säilöntäalue,E2M2: Zone de Stockage,,E2M2: Raktár,E2M2: Area di contenimento,E2M2: 収容エリア,E2M2: 화물 보관구역,E2M2: Inperkingsgebied,E2M2: Innesperringsområde,E2M2: Obszar Zastrzeżony,E2M2: Area de Contenção,E2M2: Área de Confinamento,E2M2: Zona de Izolare,E2M2: Зона сдерживания,E2M2: Складишта,E2M2: Lagringsområde,E2M2: Çevreleme Alanı +E2M3: Refinery,HUSTR_E2M3,,,,E2M3: Rafinerie,E2M3: Raffinaderi,E2M3: Raffinerie,E2Χ3: Διυλιστήριο,E2M3: Rafinejo,E2M3: Refinería,,E2M3: Jalostamo,E2M3: Raffinerie,,E2M3: Finomító,E2M3: Raffineria,E2M3: 精製所,E2M3: 정제소,E2M3: Raffinaderij,E2M3: Raffineri,E2M3: Rafineria,E2M3: Refinaria,,E2M3: Rafinărie,E2M3: Перерабатывающий завод,E2M3: Рафинерија,E2M3: Raffinaderi,E2M3: Rafineri +E2M4: Deimos Lab,HUSTR_E2M4,,,,E2M4: Deimosská laboratoř,E2M4: Deimos-laboratorium,E2M4: Deimos Labor,E2Χ4: Εργαστήριο Δείμου,E2M4: Laboratorio sur Dejmo,E2M4: Laboratorio de Deimos,,E2M4: Deimoksen laboratorio,E2M4: Laboratoires Déimos,,E2M4: Deimoszi laboratórium,E2M4: Laboratorio di Deimos,E2M4: ダイモス研究所,E2M4: 데이모스 연구소,E2M4: Deimos Laboratorium,E2M4: Deimos-laboratoriet,E2M4: Laboratoria Deimosa,E2M4: Laboratório de Deimos,,E2M4: Laboratorul Deimos,E2M4: Лаборатория Деймоса,E2M4: Лабораторија на Дејмосу,E2M4: Deimos Lab,E2M4: Deimos Laboratuvarı +E2M5: Command Center,HUSTR_E2M5,,,,E2M5: Řídící středisko,E2M5: Kommandocentral,E2M5: Kommandozentrum,E2Χ5: Κέντρο Διοίκησης,E2M5: Komandcentro,E2M5: Centro de mando,,E2M5: Komentokeskus,E2M5: Centre de Commandement,,E2M5: Központi parancsnokság,E2M5: Centro di Comando,E2M5: 指令本部,E2M5: 사령부,E2M5: Commandocentrum,E2M5: Kommandosentralen,E2M5: Centrum Dowodzenia,E2M5: Centro de Comando,,E2M5: Centru de Comandă,E2M5: Командный центр,E2M5: Командни центар,E2M5: Kommandocentrum,E2M5: Komuta Merkezi +E2M6: Halls of the Damned,HUSTR_E2M6,,,,E2M6: Chodby zatracených,E2M6: De Forbandedes haller,E2M6: Säle der Verdammten,E2X6: Διάδρομοι των Κολασμένων,E2M6: Koridoroj de la damnitoj,E2M6: Salones de los malditos,,E2M6: Kirottujen salit,E2M6: Halls des Damnés,,E2M6: Az átkozottak termei,E2M6: Sale dei Dannati,E2M6: ダムドの会堂,E2M6: 저주받은 회랑,E2M6: Zalen der Verdoemden,E2M6: De fordømtes haller,E2M6: Korytarze Przeklętych,E2M6: Salões dos Condenados,,E2M6: Camerele Blestemaților,E2M6: Залы проклятых,E2M6: Дворана проклетих,E2M6: De fördömdas salar,E2M6: Lanetliler Salonu +E2M7: Spawning Vats,HUSTR_E2M7,,,,E2M7: Plodné kádě,E2M7: Spirebassiner,E2M7: Materialisationskammern,E2X7: Δεξαμενές Γέννησης,E2M7: Nasko-kuvegoj,E2M7: Silos de materialización,,E2M7: Sikiämissammiot,E2M7: Cuves de Reproduction,,E2M7: Szaporító tartályok,E2M7: Vasche di Riproduzione,E2M7: 産卵桶,E2M7: 산란독,E2M7: Materialisatietanks,E2M7: Gytekarene,E2M7: Kadzie Reprodukcyjne,E2M7: Tanques de Criação,,E2M7: Cuve de Reproducere,E2M7: Нерестилище,E2M7: Размножавалиште,E2M7: Växthus för spädning,E2M7: Yumurtlama Fıçıları +E2M8: Tower of Babel,HUSTR_E2M8,,,,E2M8: Babylonská věž,E2M8: Babelstårn,E2M8: Turmbau zu Babel,E2Χ8: Πύργος της Βαβέλ,E2M8: Turo de Babelo,E2M8: Torre de Babel,,E2M8: Baabelin torni,E2M8: Tour de Babel,,E2M8: Bábel tornya,E2M8: Torre di Babele,E2M8: バベルの塔,E2M8: 바벨탑,E2M8: Toren van Babel,E2M8: Babels tårn,E2M8: Wieża Babel,E2M8: Torre de Babel,,E2M8: Turnul Babel,E2M8: Вавилонская башня,E2M8: Вавилонска кула,E2M8: Babels torn,E2M8: Babil Kulesi +E2M9: Fortress of Mystery,HUSTR_E2M9,,,,E2M9: Pevnost záhad,E2M9: Mysteriets fæstning,E2M9: Geheimnisvolle Festung,E2Χ9: Φρούριο του Μυστηρίου,E2M9: Fortreso de mistero,E2M9: Fortaleza del misterio,,E2M9: Salaperäisyyden linnake,E2M9: Mystérieuse Forteresse,,E2M9: A rejtélyek erődje,E2M9: Fortezza del Mistero,E2M9: 神秘の要塞,E2M9: 신비의 요새,E2M9: Vesting der Mysterie,E2M9: Mysteriets festning,E2M9: Forteca Tajemnic,E2M9: Fortaleza do Mistério,,E2M9: Fortăreața Misterelor,E2M9: Крепость тайн,E2M9: Тврђава тајни,E2M9: Mysteriets fästning,E2M9: Gizem Kalesi +E3M1: Hell Keep,HUSTR_E3M1,,,,E3M1: Pekelná tvrz,E3M1: Helvedesborg,E3M1: Höllenbollwerk,E3Χ1: Ακροπύργιο της Κολάσεως,E3M1: Infera ĉefturo,E3M1: Torreón del Infierno,,E3M1: Hornantorni,E3M1: Donjon Infernal,,E3M1: A pokol bástyái,E3M1: Bastioni dell'Inferno,E3M1: 牢獄,E3M1: 지옥 성채,E3M1: Helleslot,E3M1: Helvetes borg,E3M1: Twierdza Piekieł,E3M1: Torre do Inferno,,E3M1: Fortul Iadului,E3M1: Крепость Ада,E3M1: Тврђава пакла,E3M1: Helvetesborg,E3M1: Cehennem Kalesi +E3M2: Slough of Despair,HUSTR_E3M2,,,,E3M2: Bažina zoufalství,E3M2: Fortvivlelsens sump,E3M2: Sumpf der Verzweiflung,E3Χ2: Έλος της Απελπισίας,E3M2: Ŝlimejo de malespero,E3M2: Ciénaga de la desesperación,,E3M2: Epätoivon räme,E3M2: Bourbier du Désespoir,,E3M2: A kétségbeesés mocsara,E3M2: Palude della Disperazione,E3M2: 絶望の大地,E3M2: 절망의 심연,E3M2: Moeras der Wanhoop,E3M2: Fortvilelsens sump,E3M2: Bagno Rozpaczy,E3M2: Lamaçal do Desespero,,E3M2: Mlaștinile Disperării,E3M2: Трясина отчаяния,E3M2: Блато очајања,E3M2: Förtvivlans svackor,E3M2: Umutsuzluk Slough'u +E3M3: Pandemonium,HUSTR_E3M3,,,,,E3M3: Pandemonium,E3M3: Pandämonium,E3Χ3: Πανδαιμόνιο,E3M3: Pandemonio,E3M3: Pandemonio,,,E3M3: Pandémonium,,E3M3: Zűrzavar,E3M3: Pandemonio,E3M3: 伏魔殿,E3M3: 복마전,,,E3M3: Piekło,E3M3: Pandemônio,,E3M3: Pandemoniu,E3M3: Пандемоний,E3M3: Пандемонијум,E3M3: Pandemonium,E3M3: Pandemonium +E3M4: House of Pain,HUSTR_E3M4,,,,E3M4: Dům bolesti,E3M4: Hus af smerte,E3M4: Haus des Schmerzes,E3Χ4: Σπίτι του Πόνου,E3M4: Domo de doloro,E3M4: Casa del dolor,,E3M4: Tuskanmaja,E3M4: Maison de la Douleur,,E3M4: A kínok háza,E3M4: Casa del Dolore,E3M4: 苦痛の館,E3M4: 고통의 집,E3M4: Huis van Pijn,E3M4: Smertens hus,E3M4: Dom Bólu,E3M4: Casa da Dor,,E3M4: Casa Durerii,E3M4: Обитель боли,E3M4: Кућа патње,E3M4: Smärtans hus,E3M4: Acı Evi +E3M5: Unholy Cathedral,HUSTR_E3M5,,,,E3M5: Bezbožná katedrála,E3M5: Uhellig katedral,E3M5: Unheilige Kathedrale,E3X5: Ανίερος Καθεδρικός,E3M5: Malsankta katedralo,E3M5: Catedral profana,,E3M5: Epäpyhä katedraali,E3M5: Cathédrale Profane,,E3M5: Az istentelen katedrális ,E3M5: Cattedrale Blasfema,E3M5: 邪教の大聖堂,E3M5: 불경한 성당,E3M5: Onheilige Kathedraal,E3M5: Den vanhellige katedralen,E3M5: Bluźniercza Katedra,E3M5: Catedral Profana,,E3M5: Catedrala Necurată,E3M5: Нечестивый собор,E3M5: Несвета катедрала,E3M5: Den oheliga katedralen,E3M5: Kutsal Olmayan Katedral +E3M6: Mt. Erebus,HUSTR_E3M6,Volcano in Antarctica,,,E3M6: Hora Erebus,,,E3X6: Όρος Έρεβος,E3M6: Monto de Erebo,E3M6: Monte Erebus,,E3M6: Erebusvuori,E3M6: Mont Erèbe,,E3M6: Erebus-hegy,E3M6: Monte Erebus,E3M6: エレボス山,E3M6: 에레버스 산,,E3M6: Erebus-fjellet,E3M6: Góra Erebus,E3M6: Monte Érebo,,E3M6: M. Erebus,E3M6: Гора Эребус,E3M6: Планина Еребус,,E3M6: Erebus Dağı +E3M7: Limbo,HUSTR_E3M7,,,,E3M7: Předpeklí,,,E3Χ7: Είσοδος της Κολάσεως,,,,E3M7: Limbus,E3M7: Limbes,,E3M7: Limbus,,E3M7: 忘却の地,E3M7: 고성소,,,E3M7: Otchłań,,,E3M7: Limb,E3M7: Чистилище,E3M7: Лимбо,,E3M7: Araf +E3M8: Dis,HUSTR_E3M8,"Based on the City of Dis, located on the sixth circle of Hell, according to Dante Alighieri's The Divine Comedy",,,,,,E3Χ8: Δίτα,E3M8: Danteca,E3M8: Ciudad de Dite,,,E3M8: Dité,,,E3M8: Dite,E3M8: 死,E3M8: 디스,,,,E3M8: Dite,,E3M8: Dite,E3M8: Дит,E3M8: Дис,, +E3M9: Warrens,HUSTR_E3M9,,,,E3M9: Brlohy,E3M9: Rotteboet,E3M9: Rattennest,E3X9: Λαγούμια,E3M9: Nestego,E3M9: Madrigueras,,E3M9: Sokkelot,E3M9: Clapiers,,E3M9: Nyúlkert,E3M9: Le Garenne,E3M9: 兎小屋,E3M9: 토끼굴,E3M9: Doolhof,E3M9: Rottebo,E3M9: Królikarnia,E3M9: Tocas,,E3M9: Vizuini,E3M9: Изнорье,E3M9: Одгајалиште,E3M9: Vildmark,E3M9: Sıçan yuvası +E4M1: Hell Beneath,HUSTR_E4M1,Proverbs 15:24,,,E4M1: Peklo v hlubinách,E4M1: Helvede nedenunder,E4M1: Die Hölle unterwärts,E4Χ1: Κάτω Κόσμος,E4M1: Ŝeolo malsupre,E4M1: Seol abajo,,E4M1: Tuonela alhaalla,E4M1: Le Séjour des Morts,,E4M1: A holtak hazája odalent,E4M1: In Basso,E4M1: 地獄の下へ,E4M1: 지옥의 밑에서,E4M1: Hel beneden,E4M1: Helvete under,E4M1: Piekło Najgłębsze,E4M1: Inferno Abaixo,E4M1: Inferno Profundo,E4M1: Iadul de Jos,E4M1: Преисподняя под ногами,E4M1: Пакао одоздо,E4M1: Helvetet under,E4M1: Cehennem Altında +E4M2: Perfect Hatred,HUSTR_E4M2,Psalm 139:22,,,E4M2: Naprostá nenávist,E4M2: Perfekt had,E4M2: Perfekter Hass,E4Χ2: Τέλειο Μίσος,E4M2: Ekstrema malamo,E4M2: Aborrecer por completo,,E4M2: Kaikella vihalla,E4M2: Une Parfaite Haine,,E4M2: Teljes gyűlölettel,E4M2: Odio Perfetto,E4M2: 完全なる憎悪,E4M2: 완벽한 증오,E4M2: Perfecte Haat,E4M2: Perfekt hat,E4M2: Pełnia Nienawiści,E4M2: Ódio Perfeito,,E4M2: Ură Desăvârșită,E4M2: Полная ненависть,E4M2: Пуном мрзошћу,E4M2: Perfekt Hass,E4M2: Kusursuz Nefret +E4M3: Sever The Wicked,HUSTR_E4M3,Matthew 13:49,,,E4M3: Oddělit zkažené,E4M3: Afskære de onde,E4M3: Scheidet die Bösen,E4Χ3: Ξερίζωσε τους Πονηρούς,E4M3: Apartigi la malbonulojn,E4M3: Apartarán a los malos,,E4M3: Erottavat pahat,E4M3: Séparer les Vicieux,,E4M3: Felnégyelni a bűnösöket,E4M3: Separeranno I Cattivi,E4M3: 邪悪を絶つ,E4M3: 악령처단,E4M3: Scheid de goddelozen af,E4M3: Skille ut de onde,E4M3: Oddzielą Niegodziwych,E4M3: Separarão os Maus,E4M3: Separarão o Mal,E4M3: Să Desparți pe Cei Răi,E4M3: Отделить злых,E4M3: Одлучи зле,E4M3: Separera de onda,E4M3: Kötüleri Kesin +E4M4: Unruly Evil,HUSTR_E4M4,James 3:8,,,E4M4: Nezkrotitelné zlo,E4M4: Ustyrlig ondskab,E4M4: Schandbare Worte,E4X4: Ασυγκράτητο Κακό,E4M4: Malkvieta malbono,E4M4: Mal irrefrenable,,E4M4: Levotointa pahuutta,E4M4: Un Mal Irrépréssible,,E4M4: Féktelen gonosz,E4M4: Male Senza Posa,E4M4: 手に負えない邪悪,E4M4: 광폭한 악마,E4M4: Het weerbarstige kwaad,E4M4: Uregjerlig ondskap,E4M4: Niepohamowane Zło,E4M4: Mal Irrefreável,E4M4: Mal que não Refreia,E4M4: Un Rău fără Astâmpăr,E4M4: Неудержимое зло,Е4М4: Немирно зло,E4M4: Den oregerliga ondskan,E4M4: Asi Kötülük +E4M5: They Will Repent,HUSTR_E4M5,Luke 16:30,,,E4M5: Budou činit pokání,E4M5: De vil omvende sig,E4M5: Sie werden bereuen,E4X5: Θα Μετανοήσουν,E4M5: Ili pentos,E4M5: Se arrepentirán,,E4M5: He parannuksen tekisivät,E4M5: Ils se repentiront,,E4M5: Megtérnek majd,E4M5: Si Ravvederanno,E4M5: 奴等に後悔を,E4M5: 그들은 회개할 지어다,E4M5: Ze zullen berouw hebben,E4M5: De vil omvende seg,E4M5: Nawrócą Się,E4M5: Arrepender-se,E4M5: Eles Arrepender-se-iam,E4M5: Se vor Pocăi,E4M5: Они покаются,E4M5: Покајаће се,E4M5: De kommer att ångra sig,E4M5: Tövbe Edecekler +E4M6: Against Thee Wickedly,HUSTR_E4M6,Psalm 139:20,,,E4M6: Při svých pletichách,E4M6: Mod dig ondskabsfuldt,E4M6: Feinde erheben sich,E4X6: Κακόβουλα Εναντίον Σου,E4M6: Pri Vi malice,E4M6: Blasfemias contra ti,,E4M6: Sinusta petollisesti,E4M6: D'une manière criminelle,,E4M6: Hitványul ellened,E4M6: Contro di te Malvagiamente,E4M6: 汝への悪逆,E4M6: 그대와 짖궂게 맞서다,E4M6: Tegen de goddeloze,E4M6: Mot deg ondskapsfullt,E4M6: Podstępnie Przeciw Tobie,E4M6: Malvadamente Contra Ti,,E4M6: Te Grăiesc de Rău,E4M6: Против тебя нечестиво,E4M6: Ружно на тебе,E4M6: Mot dig ondskan,E4M6: Sana Karşı Kötüce +E4M7: And Hell Followed,HUSTR_E4M7,Revelation 6:8,,,E4M7: A peklo šlo za ním,E4M7: Og Helvede fulgte efter,E4M7: Und die Hölle folgte,E4X7: Και η Κόλαση Ακολούθησε,E4M7: Kaj Hades sekvis,E4M7: El Hades le seguía,E4M7: El Hades lo seguía,E4M7: Ja Tuonela seurasi,E4M7: Et l'Enfer Suivit,,E4M7: És a pokol követé azt,E4M7: E l'inferno seguitava,E4M7: そして地獄は従った,E4M7: 그리고 지옥이 뒤따른다,E4M7: En de hel volgde,E4M7: Og helvete fulgte,E4M7: A Piekło Szło Za Nim,E4M7: E o Inferno Seguia,E4M7: Inferno o Seguia,E4M7: Iadul se Ținea după El,E4M7: И последовал Ад,E4M7: И пакао иђаше,E4M7: Och helvetet följde,E4M7: Ve Cehennem Takip Etti +E4M8: Unto The Cruel,HUSTR_E4M8,Proverbs 5:9,,,E4M8: Ukrutníku odevzdáš,E4M8: Til de grusomme,E4M8: Deine Jahre dem Grausamen,E4X8: Προς Τους Ανελεήμονες,E4M8: Al la kruelulo,E4M8: Tus años al cruel,,E4M8: Armottomalle,E4M8: A un Homme cruel,,E4M8: A kegyetlennek,E4M8: Al Crudele,E4M8: 容赦なき者へ,E4M8: 잔혹한 자에게로,E4M8: Naar de wrede,E4M8: Til de grusomme,E4M8: Kto Nie Zna Litości,E4M8: Aos Cruéis,E4M8: Entregue a Cruéis,E4M8: Unuia Fără de Milă,E4M8: К мучителю,E4M8: Немилостивоме,E4M8: Mot de grymma,E4M8: Zalimlere Karşı +E4M9: Fear,HUSTR_E4M9,,,,E4M9: Strach,E4M9: Frygt,E4M9: Angst,E4Χ9: Τρόμος,E4M9: Timo,E4M9: Miedo,,E4M9: Pelko,E4M9: Terreur,,E4M9: Félelem,E4M9: Paura,E4M9: 恐怖,E4M9: 공포,E4M9: Angst,E4M9: Frykt,E4M9: Strach,E4M9: Medo,,E4M9: Frica,E4M9: Страх,E4M9: Страх,E4M9: Rädsla,E4M9: Korku +,,Doom 2,,,,,,,,,,,,,,,,,,,,,,,,,, +Level 1: Entryway,HUSTR_1,"Note that the ""LEVEL"" part of the string will be stripped so it shouldn't be translated",,,Level 1: Vchod,Level 1: Indgang,Level 1: Eingangshalle,Επίπεδο 1: Είσοδος,Nivelo 1: Enirejo,Nivel 1: Entrada,,Taso 1: Eteiskäytävä,NIVEAU 1: Hall D'Entrée,,1. Pálya: Bejárat,Livello 1: Ingresso,Level 1: 入口,레벨 1: 초입,Level 1: Ingang,Nivå 1: Inngangen,Level 1: Wejście,Fase 1: Entrada,Nível 1: Entrada,Nivelul 1: Intrarea,Уровень №1: Вход,Level 1: Улаз,Nivå 1: Ingång,Seviye 1: Giriş Yolu +Level 2: Underhalls,HUSTR_2,,,,Level 2: Podzemí,Level 2: Underbukser,Level 2: Kellergewölbe,,Nivelo 2: Subteraj vojoj,Nivel 2: Salones subterráneos,,Taso 2: Maanalaiset käytävät,NIVEAU 2: Souterrains,,2. Pálya: Alagutak,Livello 2: Sotterranei,Level 2: 地下堂,레벨 2: 지하수로,Level 2: Onderhallen,Nivå 2: Underhaller,Level 2: Podziemia,Fase 2: Subterrâneo,Nível 2: Subterrâneo,Nivelul 2: Pasaje subterane,Уровень №2: Подземные ходы,Level 2: Подземни ходници,Nivå 2: Underhallar,Seviye 2: Tulumlar +Level 3: The Gantlet,HUSTR_3,“a form of punishment in which a person is forced to run between two lines of men facing each other and armed with clubs or whips to beat the victim”,,,Level 3: Trest,Level 3: Spidsrod,Level 3: Spießrutenlauf,,Nivelo 3: La vergokuro,Nivel 3: Carrera de baquetas,,Taso 3: Kujanjuoksu,NIVEAU 3: Parcours du Combatant,,3. Pálya: Vesszőfutás,Livello 3: Le Forche,Level 3: ガントレット,레벨 3: 건틀릿,Level 3: De gantlet,Nivå 3: Hansken,Level 3: Praszczęta,Fase 3: A Punição,Nível 3: A Punição,Nivelul 3: Stroiul,Уровень №3: Сквозь строй,Level 3: Казна,Nivå 3: Utmaningen,Seviye 3: Zorluk +Level 4: The Focus,HUSTR_4,,,,Level 4: Ohnisko,Level 4: Fokus,Level 4: Der Fokus,,Nivelo 4: La fokuso,Nivel 4: El foco,,Taso 4: Polttopiste,NIVEAU 4: Le Focus,,4. Pálya: A középpont,Livello 4: L'Epicentro,Level 4: フォーカス,레벨 4: 초점,Level 4: De focus,Nivå 4: Fokus,Level 4: Skupisko,Fase 4: O Foco,Nível 4: O Foco,Nivelul 4: Focarul,Уровень №4: Средоточие,Level 4: Средиште,Nivå 4: Fokus,Seviye 4: Odaklanma +Level 5: The Waste Tunnels,HUSTR_5,,,,Level 5: Odpadní tunely,Level 5: Affaldstunnellerne,Level 5: Die Abfall-Tunnel,Επίπεδο 5: Οι Σήραγγες Αποβλήτων,Nivelo 5: La rubtuneloj,Nivel 5: Los túneles de desechos,,Taso 5: Jätetunnelit,NIVEAU 5: Les Egouts,,5. Pálya: Szennyvízalagutak,Livello 5: I Tunnel dei Rifiuti,Level 5: 廃棄トンネル,레벨 5: 하수도,Level 5: De afvaltunnels,Nivå 5: Avfallstunnelene,Level 5: Kanały,Fase 5: Os Túneis de Dejetos,Nível 5: Os Túneis de Dejetos,Nivelul 5: Tuneluri de deșeuri,Уровень №5: Сточные туннели,Level 5: Отпадни тунели,Nivå 5: Avfallstunnlarna,Seviye 5: Atık Tünelleri +Level 6: The Crusher,HUSTR_6,,,,Level 6: Drtička,Level 6: Knuseren,Level 6: Die Presse,Επίπεδο 6: Ο Συνθλιπτής,Nivelo 6: La dispistilo,Nivel 6: La trituradora,,Taso 6: Murskaaja,NIVEAU 6: Le Broyeur,,6. Pálya: A zúzda,Livello 6: La Pressa,Level 6: クラッシャー,레벨 6: 분쇄기,Level 6: De maalmachine,Nivå 6: Knuseren,Level 6: Zgniatarka,Fase 6: O Esmagador,Nível 6: O Esmagador,Nivelul 6: Zdrobitorul,Уровень №6: Давилка,Level 6: Разбијач,Nivå 6: krossen,Seviye 6: Kırıcı +Level 7: Dead Simple,HUSTR_7,,,,Level 7: Smrtelně prosté,Level 7: Død simpel,Level 7: Tödlich einfach,Επίπεδο 7: Πανεύκολο,Nivelo 7: Morte simpla,Nivel 7: Simplemente muerto,,Taso 7: Kuolettavan yksinkertainen,NIVEAU 7: Mortellement Simple,,7. Pálya: Halálegyszerű,Livello 7: Morte Pura,Level 7: 死ぬほど単純,레벨 7: 죽여주는 단순함,Level 7: Dodelijk eenvoudig,Nivå 7: Helt enkelt,Level 7: Śmiertelnie Proste,Fase 7: Mortalmente Simples,Nível 7: Simplesmente Mortal,Nivelul 7: Mortal de simplu,Уровень №7: Смертельно просто,Level 7: Смртно једноставно,Nivå 7: Död enkel,Seviye 7: Ölü Basit +Level 8: Tricks and Traps,HUSTR_8,,,,Level 8: Lesti a léčky,Level 8: Tricks og fælder,Level 8: Tricks und Fallen,Επίπεδο 8: Κόλπα και Παγίδες,Nivelo 8: Trompoj kaj embuskoj,Nivel 8: Trucos y trampas,,Taso 8: Metkuja ja pauloja,NIVEAU 8: Ruses et Pièges,,8. Pálya: Cselek és csapdák,Livello 8: Trucchi e Trappole,Level 8: 悪戯と罠,레벨 8: 속임수와 함정들,Level 8: Trucs en vallen,Nivå 8: Triks og feller,Level 8: Sztuczki i Pułapki,Fase 8: Truques e Armadilhas,Nível 8: Truques e Armadilhas,Nivelul 9: Surprize și capcane,Уровень №8: Уловки и ловушки,Level 8: Замке и смицалице,Nivå 8: Tricks och fällor,Seviye 8: Hileler ve Tuzaklar +Level 9: The Pit,HUSTR_9,,,,Level 9: Jáma,Level 9: Gruben,Level 9: Die Grube,Επίπεδο 9: Λάκκος,Nivelo 9: La fosaĵo,Nivel 9: El pozo,,Taso 9: Monttu,NIVEAU 9: La Fosse,,9. Pálya: A gödör,Livello 9: Il Pozzo,Level 9: 大穴,레벨 9: 구덩이,Level 9: De groeve,Nivå 9: Gropen,Level 9: Jama,Fase 9: O Fosso,Nível 9: O Fosso,Nivelul 9: Groapa,Уровень №9: Яма,Level 9: Јама,Nivå 9: Grottan,Seviye 9: Çukur +Level 10: Refueling Base,HUSTR_10,,,,Level 10: Tankovací základna,Level 10: Tankstation,Level 10: Treibstoffbunker,Επίπεδο 10: Βάση Ανεφοδιασμού,Nivelo 10: Refuelbazo,Nivel 10: Base de reabastecimiento,,Taso 10: Tankkausasema,NIVEAU 10: Base de Ravitaillement,,10. Pálya: Tankolóállomás,Livello 10: Base di Rifornimento,Level 10: 補給基地,레벨 10: 연료 충전소,Level 10: Tankstation,Nivå 10: Påfyllingsbasen,Level 10: Stacja Tankowania,Fase 10: Base de Reabastecimento,Nível 10: Base de Reabastecimento,Nivelul 10: Baza de alimentare,Уровень №10: Заправочная база,Level 10: Бензинска база,Nivå 10: Tankningsbasen,Seviye 10: Yakıt İkmal Üssü Level 11: 'O' of Destruction!,HUSTR_11,"Alternative title: -Circle of Death ",,,Level 11: Kruh smrti,Level 11: Ødelæggelsens cirkel!,Level 11: 'O' der Zerstörung!,Επίπεδο 11: Ο Κύκλος της Καταστροφής,Nivelo 11: Morta cirklo,Nivel 11: Círculo de la muerte,,Taso 11: Hävityksen 'O',NIVEAU 11: Le Cercle de la Mort!,11. Pálya: A pusztulás köre,Livello 11: Il Cerchio della Morte,Level 11: 破滅の'O'!,레벨 11: 파괴의 고리,Level 11: 'O' van vernietiging!,Nivå 11: Ødeleggelsens 'O'!,Level 11: Krąg Śmierci,Fase 11: Círculo da Morte,Nível 11: Círculo da Morte,Nivelul 11: Cercul distrugerii,Уровень №11: Круг разрушения!,Level 11: Круг уништења,"Nivå 11: ""O"" av förstörelse!",Seviye 11: Yıkımın 'O'su! -Level 12: The Factory,HUSTR_12,,,,Level 12: Továrna,Level 12: Fabrikken,Level 12: Die Fabrik,Επίπεδο 12: To Εργοστάσιο,Nivelo 12: La fabriko,Nivel 12: La fábrica,,Taso 12: Tehdas,NIVEAU 12: L'Usine,12. Pálya: A gyár,Livello 12: La Fabbrica,Level 12: 工場,레벨 12: 공장,Level 12: De fabriek,Nivå 12: Fabrikken,Level 12: Fabryka,Fase 12: A Fábrica,Nível 12: A Fábrica,Nivelul 12: Fabrica,Уровень №12: Фабрика,Level 12: Фабрика,Nivå 12: Fabriken,Seviye 12: Fabrika -Level 13: Downtown,HUSTR_13,,,,Level 13: Centrum,Level 13: Centrum,Level 13: Stadtzentrum,Επίπεδο 13: Κέντρο,Nivelo 13: Urbocentro,Nivel 13: Centro de la ciudad,,Taso 13: Keskikaupunki,NIVEAU 13: Centre-Ville,13. Pálya: Belváros,Livello 13: Periferia,Level 13: 市内,레벨 13: 번화가,Level 13: De binnenstad,Nivå 13: Sentrum,Level 13: Śródmieście,Fase 13: Centro Urbano,Nível 13: Centro Urbano,Nivelul 13: Centru urban,Уровень №13: Центр города,Level 13: Центар града,Nivå 13: Centrum,Seviye 13: Şehir Merkezi -Level 14: The Inmost Dens,HUSTR_14,,,,Level 14: Nejhlubší doupata,Level 14: Den inderste hule,Level 14: Die innersten Bauten,Επίπεδο 14: Οι Ενδότερες Φωλιές,Nivelo 14: La Internaj Kavernoj,Nivel 14: Los Antros más Recónditos,,Taso 14: Sisimmät piilot,NIVEAU 14: Les Antres Profondes,14. Pálya: A legmélyebb rejtekek,Livello 14: Gli Antri Profondi,Level 14: 最深巣窟,레벨 14: 깊숙한 동굴들,Level 14: De binnenste gebouwen,Nivå 14: De innerste huler,Level 14: Najgłębsze Nory,Fase 14: Os Antros Profundos,Nível 14: Os Antros Profundos,Nivelul 14: Cele mai intime bârloguri,Уровень №14: Глубочайшие логовища,Level 14: Најдубље јазбине,Nivå 14: Den innersta täkten,Seviye 14: En İçteki İnler -Level 15: Industrial Zone,HUSTR_15,,,,Level 15: Průmyslová zóna,Level 15: Industriområde,Level 15: Industriegebiet,Επίπεδο 15: Βιομηχανική Ζώνη,Nivelo 15: Industria Zono,Nivel 15: Zona Industrial,,Taso 15: Teollisuusalue,NIVEAU 15: Zone Industrielle,15. Pálya: Ipari zóna,Livello 15: Zona Industriale,Level 15: 工業地帯,레벨 15: 공업 지대,Level 15: Industriegebied,Nivå 15: Industriområdet,Level 15: Strefa Przemysłowa,Fase 15: Zona Industrial,Nível 15: Zona Industrial,Nivelul 15: Zona industrială,Уровень №15: Промышленный район,Level 15: Индустријска зона,Nivå 15: Industriområde,Seviye 15: Sanayi Bölgesi -Level 16: Suburbs,HUSTR_16,,,,Level 16: Předměstí,Level 16: Forstæderne,Level 16: Vororte,Επίπεδο 16: Προάστια,Nivelo 16: Antaŭurboj,Nivel 16: Suburbios,,Taso 16: Lähiö,NIVEAU 16: Banlieue,16. Pálya: Külváros,Livello 16: Sobborghi,Level 16: 郊外,레벨 16: 교외,Level 16: Buitenwijken,Nivå 16: Forstedene,Level 16: Przedmieścia,Fase 16: Subúrbios,Nível 16: Subúrbios,Nivelul 16: Suburbi,Уровень №16: Пригород,Level 16: Предграђе,Nivå 16: Förorter,Seviye 16: Banliyöler -Level 17: Tenements,HUSTR_17,,,,Level 17: Sídliště,Level 17: Lejligheder,Level 17: Wohnbezirk,Επίπεδο 17: Καταλύματα,Nivelo 17: Loĝejoj,Nivel 17: Viviendas,,Taso 17: Vuokratalot,NIVEAU 17: Immeubles,17. Pálya: Bérházak,Livello 17: Possedimenti,Level 17: 安アパート,레벨 17: 공동주택,Level 17: Huurwoningen,Nivå 17: Leiegårder,Level 17: Kamienice,Fase 17: Habitações,Nível 17: Habitações,Nivelul 17: Proprietăți,Уровень №17: Владения,Level 17: Станови,Nivå 17: Hyreshus,Seviye 17: Kiralık Evler -Level 18: The Courtyard,HUSTR_18,,,,Level 18: Nádvoří,Level 18: Gårdspladsen,Level 18: Der Innenhof,Επίπεδο 18: Η Αυλή,Nivelo 18: La Korto,Nivel 18: El Patio,,Taso 18: Esipiha,NIVEAU 18: La Cour,18. Pálya: Az udvar,Livello 18: Il Cortile,Level 18: 中庭,레벨 18: 중정,Level 18: De binnenplaats,Nivå 18: Gårdsplassen,Level 18: Dziedziniec,Fase 18: O Átrio,Nível 18: O Átrio,Nivelul 18: Curtea,Уровень №18: Внутренний двор,Level 18: Двориште,Nivå 18: Gården,Seviye 18: Avlu -Level 19: The Citadel,HUSTR_19,,,,Level 19: Citadela,Level 19: Citadellet,Level 19: Die Zizadelle,Επίπεδο 19: Το Κάστρο,Nivelo 19: La Citadelo,Nivel 19: La Ciudadela,,Taso 19: Linnoitus,NIVEAU 19: La Citadelle,19. Pálya: Fellegvár,Livello 19: La Cittadella,Level 19: 要塞,레벨 19: 성채,Level 19: De citadel,Nivå 19: Citadellet,Level 19: Cytadela,Fase 19: A Cidadela,Nível 19: A Cidadela,Nivelul 19: Cetatea,Уровень №19: Цитадель,Level 19: Цитадела,Nivå 19: Citadellet,Seviye 19: Hisar -Level 20: Gotcha!,HUSTR_20,,,,Level 20: Mám tě!,,Level 20: Erwischt!,Επίπεδο 20: Σ'έπιασα!,Nivelo 20: Kaptis Vin!,Nivel 20: ¡Te pillé!,Nivel 20: ¡Te tengo!,Taso 20: Sainpas sinut!,NIVEAU 20: Je t'ai eu!,20. Pálya: Megvagy!,Livello 20: Preso!,Level 20: 捉らえた!,레벨 20: 잡았다!,Level 20: Ik heb je!,Nivå 20: Fikk deg!,Level 20: Mam Cię!,Fase 20: Te Peguei!,Nível 20: Apanhei-te!,Nivelul 20: Te-am prins!,Уровень №20: Попался!,Level 20: Имају те!,Nivå 20: Gotcha!,Seviye 20: Yakaladım! -Level 21: Nirvana,HUSTR_21,,,,Level 21: Nirvána,,,Επίπεδο 21: Νιρβάνα,Nivelo 21: Nirvano,Nivel 21: Nirvana,,,NIVEAU 21: Nirvana,21. Pálya: Nirvána,Livello 21: Nirvana,Level 21: 涅槃,레벨 21: 열반,,,,Fase 21: Nirvana,Nível 21: Nirvana,Nivelul 21: Nirvana,Уровень №21: Нирвана,Level 21: Нирвана,Nivå 21: Nirvana,Seviye 21: Nirvana -Level 22: The Catacombs,HUSTR_22,,,,Level 22: Katakomby,Level 22: Katakomberne,Level 22: Katakomben,Επίπεδο 22: Οι Κατακόμβες,Nivelo 22: La Katakombo,Nivel 22: Las Catacumbas,,Taso 22: Katakombit,NIVEAU 22: Les Catacombes,22. Pálya: A katakombák,Livello 22: Le Catacombe,Level 22: 地下悪霊墓所,레벨 22: 지하 묘지,Level 22: De catacomben,Nivå 22: Katakombene,Level 22: Katakumby,Fase 22: As Catacumbas,Nível 22: Os Calabouços,Nivelul 22: Catacombe,Уровень №22: Катакомбы,Level 22: Катакомбе,Nivå 22: Katakomberna,Seviye 22: Yeraltı Mezarları -Level 23: Barrels O' Fun,HUSTR_23,,,,Level 23: Barely srandy,Level 23: Tønder af sjov,Level 23: Lustige Fässer,,Nivelo 23: Bareloj de Amuzo,Nivel 23: Barriles de Diversión,,Taso 23: Huvitynnyrit,NIVEAU 23: Une Tonne-eau de plaisir,23. Pálya: Mókás hordók,Livello 23: Barili da Sballo,Level 23: 戯れのバレル,레벨 23: 신나는 폭발통들,Level 23: Grappige vaten,Nivå 23: Tønner med moro,Level 23: Beczki Śmiechu,Fase 23: Barris de Diversão,Nível 23: Barris de Diversão,Nivelul 23: Butoaiele veseliei,Уровень №23: Бочки веселья,Level 23: Бачве забаве,Nivå 23: Tunnor med kul,Seviye 23: Eğlence Fıçıları -Level 24: The Chasm,HUSTR_24,,,,Level 24: Rokle,Level 24: Kløften,Level 24: Die Kluft,Επίπεδο 24: Το Χάσμα,Nivelo 24: La Fendego,Nivel 24: El Desfiladero,,Taso 24: Rotko,NIVEAU 24: Le Gouffre,24. Pálya: A szakadék,Livello 24: L'Abisso,Level 24: 裂け目,레벨 24: 협곡,Level 24: De afgrond,Nivå 24: Avgrunnen,Level 24: Przepaść,Fase 24: O Abismo,Nível 24: O Abismo,Nivelul 24: Hăul,Уровень №24: Пропасть,Level 24: Провалија,Nivå 24: Klyftan,Seviye 24: Uçurum -Level 25: Bloodfalls,HUSTR_25,,,,Level 25: Krvopády,Level 25: Blodfald,Level 25: Blutfälle,Επίπεδο 25: Καταρράκτες Αίματος,Nivelo 25: Sangfaloj,Nivel 25: Cataratas de Sangre,,Taso 25: Veriputoukset,NIVEAU 25: Chutes de Sang,25. Pálya: Véresések,Livello 25: Cascate di Sangue,Level 25: 血の滝,레벨 25: 혈폭포,Level 25: Bloeddruppels,Nivå 25: Blodfall,Level 25: Wodospad Krwi,Fase 25: Cataratas de Sangue,Nível 25: Cascatas de Sangue,Nivelul 25: Cascade de sânge,Уровень №25: Кровопады,Level 25: Крвопади,Nivå 25: Blodfall,Seviye 25: Kan Düşüşleri -Level 26: The Abandoned Mines,HUSTR_26,,,,Level 26: Opuštěné doly,Level 26: De forladte miner,Level 26: Die aufgegebene Mine,Επίπεδο 26: Τα Εγκαταλελειμμένα Ορυχεία,Nivelo 26: La Forlasitaj Minoj,Nivel 26: Las Minas Abandonadas,,Taso 26: Hylätyt kaivokset,NIVEAU 26: Les Mines Abandonnées,26. Pálya: Az elhagyatott bányák,Livello 26: Le Miniere Abbandonate,Level 26: 廃鉱山,레벨 26: 버려진 광산,Level 26: De verlaten mijnen,Nivå 26: De forlatte gruvene,Level 26: Opuszczone Kopalnie,Fase 26: As Minas Abandonadas,Nível 26: As Minas Abandonadas,Nivelul 26: Minele părăsite,Уровень №26: Заброшенные шахты,Level 26: Напуштени рудници,Nivå 26: De övergivna gruvorna,Seviye 26: Terk Edilmiş Madenler -Level 27: Monster Condo,HUSTR_27,,,,Level 27: Netvoří dům,,Level 27: Monsterbehausung,,Nivelo 27: Monstro-Domo,Nivel 27: Condominio de Monstruos,,Taso 27: Hirviöasuntola,NIVEAU 27: Monstrueuse Résidence,27. Pálya: A szörnyek háza,Livello 27: Casa dei Mostri,Level 27: モンスターマンション,레벨 27: 괴물 콘도,,Nivå 27: Monsterleiligheten,Level 27: Apartament Potworów,Fase 27: Mansão dos Monstros,Nível 27: Condomínio Monstruoso,Nivelul 27: Casa monștrilor,Уровень №27: Жилище монстров,Level 27: Боравишта монструма,Nivå 27: Monster Condo,Seviye 27: Canavar Dairesi -Level 28: The Spirit World,HUSTR_28,,,,Level 28: Onen svět,Level 28: Åndeverdenen,Level 28: Die Geisterwelt,Επίπεδο 28: Ο Κόσμος των Πνευμάτων,Nivelo 28: La Animo-Mondo,Nivel 28: El Mundo Espiritual,,Taso 28: Henkimaailma,NIVEAU 28: Le Monde Spirituel,28. Pálya: A lelkek világa,Livello 28: Il Mondo dello Spirito,Level 28: 悪霊の世界,레벨 28: 영령의 세계,Level 28: De geestenwereld,Nivå 28: Åndeverdenen,Level 28: Świat Dusz,Fase 28: O Mundo Espiritual,Nível 28: O Mundo Espiritual,Nivelul 28: Lumea duhurilor,Уровень №28: Мир духов,Level 28: Духовни свет,Nivå 28: Den andliga världen,Seviye 28: Ruhlar Dünyası -Level 29: The Living End,HUSTR_29,,,,Level 29: Živoucí konec,Level 29: Den levende ende,Level 29: Das lebende Ende,Επίπεδο 29: Το Ζωντανό Τέλος,Nivelo 29: La Viva Fino,Nivel 29: El Final Viviente,,Taso 29: Elävä loppu,NIVEAU 29: La Limite,29. Pálya: Az élő Végzet,Livello 29: La Fine Imminente,Level 29: 極限の存在,레벨 29: 최종점,Level 29: Het levende einde,Nivå 29: Den levende enden,Level 29: Żywy Koniec,Fase 29: O Cúmulo da Existência,Nível 29: O Cúmulo da Existência,Nivelul 29: Sfârșitul întregii vieți,Уровень №29: Конец всего живого,Level 29: Крај живота,Nivå 29: Det levande slutet,Seviye 29: Yaşamın Sonu -Level 30: Icon of Sin,HUSTR_30,,,,Level 30: Ikona hříchu,Level 30: Syndens ikon,Level 30: Symbol der Sünde,Επίπεδο 30: Σύμβολο της Αμαρτίας,Nivelo 30: Ikono de Peko,Nivel 30: Icono del pecado,Nivel 30: Ícono del pecado,Taso 30: Synnin ikoni,NIVEAU 30: L'Icône du Péché,30. Pálya: A megtestesült bűn,Livello 30: Icona del Peccato,Level 30: 罪の聖像,레벨 30: 죄악의 상징,Level 30: Pictogram van de zonde,Nivå 30: Syndens ikon,Level 30: Ikona Grzechu,Fase 30: Ícone do Pecado,Nível 30: Ícone do Pecado,Nivelul 30: Icoana păcatelor,Уровень №30: Икона греха,Level 30: Икона греха,Nivå 30: Syndens ikon,Seviye 30: Günah Simgesi -Level 31: Wolfenstein,HUSTR_31,,,,,,,,Nivelo 31: Wolfenstein,Nivel 31: Wolfenstein,,,,31. Pálya: Wolfenstein,Livello 31: Wolfenstein,Level 31: ウルフェンシュタイン,레벨 31: 울펜슈타인,,,,Fase 31: Wolfenstein,Nível 31: Wolfenstein,Nivelul 31: Wolfenstein,Уровень №31: Вольфенштайн,Level 31: Волфенштајн,Nivå 31: Wolfenstein,Seviye 31: Wolfenstein -Level 32: Grosse,HUSTR_32,,,,,,,,Nivelo 32: Grosse,Nivel 32: Grosse,,,,32. Pálya: Grosse,Livello 32: Grosse,Level 32: グローシュ,레벨 32: 그로세,,,,Fase 32: Grosse,Nível 32: Grosse,Nivelul 32: Grosse,Уровень №32: Гросс,Level 32: Гроссе,Nivå 32: Grosse,Seviye 32: Grosse -Level 31: IDKFA,HUSTR_31B,,,,,,,,Nivelo 31: IDKFA,Nivel 31: IDKFA,,,NIVEAU 31: IDKFQ,31. Pálya: IDKFA,Livello 31: IDKFA,Level 31: IDKFA,레벨 31: IDKFA,,,,Fase 31: IDKFA,Nível 31: IDKFA,Nivelul 31: IDKFA,Уровень №31: IDKFA,,Nivå 31: IDKFA,Seviye 31: IDKFA -Level 32: Keen,HUSTR_32B,,,,,,,,Nivelo 32: Keen,Nivel 32: Keen,,,,32. Pálya: Keen,Livello 32: Keen,Level 32: キーン,레벨 32: 킨,,,,Fase 32: Keen,Nível 32: Keen,Nivelul 32: Keen,Уровень №32: Кин,Level 32: Кин,Nivå 32: Keen,Seviye 32: Keen -Level 33: Betray,HUSTR_33,,,,Level 33: Zraď,Level 33: Forræderi,Level 33: Verrat,,Nivelo 33: Perfido,Nivel 33: Traición,,Taso 33: Petä,NIVEAU 33: Trahison,33. Pálya: Árulás,Livello 33: Tradimento ,Level 33: 裏切り,레벨 33: 배반,Level 33: Verraad,Nivå 33: Forråde,Level 33: Zdrada,Fase 33: Traição,Nível 33: Traição,Nivelul 33: Trădare,Уровень №33: Предай,Level 33: Издаја,Nivå 33: Förråda,Seviye 33: İhanet -,,No Rest For The Living,,,,,,,,,,,,,,,,,,,,,,,,, -Level 1: The Earth Base,NHUSTR_1,,,,Level 1: Pozemská základna,Level 1: Jordbasen,Level 1: Die Erd-Basis,,Nivelo 1: La Tera Bazo,Nivel 1: La Base Terrestre,,Taso 1: Maatukikohta,NIVEAU 1: La Base Terrienne,1. Pálya: A földi bázis,Livello 1: La Base Terrestre ,Level 1: 地球基地,레벨 1: 지구 기지,Level 1: De basis van de aarde,Nivå 1: Jordbasen,Level 1: Ziemska Baza,Fase 1: A Base Terrestre,Nível 1: A Base Terrestre,Nivelul 1: Baza terestră,Уровень №1: База на Земле,Level 1: Земаљска база,Nivå 1: Jordbasen,Seviye 1: Dünya Üssü -Level 2: The Pain Labs,NHUSTR_2,,,,Level 2: Laboratoře bolesti,Level 2: Smerte laboratorier,Level 2: Die Folterlabore,,Nivelo 2: La Doloro-Laboratorio,Nivel 2: Los Laboratorios del Dolor,,Taso 2: Tuskalaboratoriot,NIVEAU 2: Les Laboratoires de la Douleur,2. Pálya: A kínok laboratóriuma,Livello 2: I Laboratori del Dolore,Level 2: 生物工学実験室,레벨 2: 고통의 연구소,Level 2: De pijnlaboratoria,Nivå 2: Smertelaboratoriet,Level 2: Laboratoria Bólu,Fase 2: Os Laboratórios da Dor,Nível 2: Os Laboratórios da Dor,Nivelul 2: Laboratoarele durerii,Уровень №2: Лаборатории боли,Level 2: Лабораторије патње,Nivå 2: Smärtlaboratorierna,Seviye 2: Ağrı Laboratuvarları -Level 3: Canyon of The Dead,NHUSTR_3,,,,Level 3: Kaňon mrtvých,Level 3: De dødes kløft,Level 3: Schlucht der Toten,,Nivelo 3: Kanjono de La Mortintoj,Nivel 3: Cañón de los Muertos,,Taso 3: Kalmankanjoni,NIVEAU 3: Canyon des Morts,3. Pálya: A holtak szurdoka,Livello 3: Il Canyon dei Morti,Level 3: 死の渓谷,레벨 3: 죽음의 계곡,Level 3: Canyon van de doden,Nivå 3: De dødes kløft,Level 3: Kanion Umarłych,Fase 3: Desfiladeiro dos Mortos,Nível 3: Desfiladeiro dos Mortos,Nivelul 3: Canionul morților,Уровень №3: Каньон мертвецов,Level 3: Кањон мртваца,Nivå 3: De dödas kanjon,Seviye 3: Ölüler Kanyonu -Level 4: Hell Mountain,NHUSTR_4,,,,Level 4: Pekelná hora,Level 4: Helvede bjerg,Level 4: Höllenberg,,Nivelo 4: Monto de Infero,Nivel 4: Montaña Infernal,,Taso 4: Hornanvuori,NIVEAU 4: Montagne Infernale,4. Pálya: Pokol-hegy,Livello 4: Montagna Infernale ,Level 4: 地獄山脈,레벨 4: 지옥의 산,Level 4: Helleberg,Nivå 4: Helvetesfjellet,Level 4: Piekielna Góra,Fase 4: Montanha Infernal,Nível 4: Montanha Infernal,Nivelul 4: Muntele infernal,Уровень №4: Адская гора,Level 4: Планина пакла,Nivå 4: Helvetesberget,Seviye 4: Cehennem Dağı -Level 5: Vivisection,NHUSTR_5,,,,Level 5: Vivisekce,Level 5: Vivisektion,Level 5: Vivisektion,,Nivelo 5: Vivisekcio,Nivel 5: Vivisección,,Taso 5: Vivisektio,NIVEAU 5: Vivisection,5. Pálya: Élveboncolás,Livello 5: Vivisezione ,Level 5: 生体解剖,레벨 5: 생체 해부,Level 5: Vivisectie,Nivå 5: Viviseksjon,Level 5: Wiwisekcja,Fase 5: Vivissecção,Nível 5: Vivissecção,Nivelul 5: Vivisecție,Уровень №5: Вивисекция,Level 5: Вивисекција,Nivå 5: Vivisektion,Seviye 5: Canlı Kesim -Level 6: Inferno of Blood,NHUSTR_6,,,,Level 6: Krvavé inferno,Level 6: Blodets inferno,Level 6: Blutiges Inferno,,Nivelo 6: Brulego de Sango,Nivel 6: Hoguera de Sangre,,Taso 6: Veri-inferno,NIVEAU 6: Enfer Sanglant,6. Pálya: Véres alvilág,Livello 6: Inferno di Sangue ,Level 6: 血のインフェルノ,레벨 6: 연옥의 피,Level 6: Bloederige inferno,Nivå 6: Blodets inferno,Level 6: Piekło Krwi,Fase 6: Inferno de Sangue,Nível 6: Inferno de Sangue,Nivelul 6: Infern sângeriu,Уровень №6: Кровавая преисподняя,Level 6: Ватре крви,Nivå 6: Blodets inferno,Seviye 6: Kan Cehennemi -Level 7: Baron's Banquet,NHUSTR_7,,,,Level 7: Baronova hostina,Level 7: Baron's Banquet,Level 7: Das Bankett des Barons,,Nivelo 7: Festeno de Barono,Nivel 7: Banquete del Barón,,Taso 7: Paronin pidot,NIVEAU 7: Banquet du Baron,7. Pálya: A báró bankettje,Livello 7: Il Banchetto del Barone ,Level 7: バロンの晩餐,레벨 7: 남작의 연회,Level 7: Baron's banket,Nivå 7: Baronens bankett,Level 7: Bankiet Barona,Fase 7: Banquete do Barão,Nível 7: Banquete do Barão,Nivelul 7: Banchetul baronilor,Уровень №7: Банкет у барона,Level 7: Баронова Гозба,Nivå 7: Baronens bankett,Seviye 7: Baron'un Ziyafeti -Level 8: Tomb of Malevolence,NHUSTR_8,,,,Level 8: Hrobka zlovolnosti,Level 8: Ondskabens grav,Level 8: Feindselige Gruft,,Nivelo 8: Tombo de Malbonvolo,Nivel 8: Tumba de Malevolencia,,Taso 8: Pahantahdon hauta,NIVEAU 8: Tombe Maléfique,8. Pálya: A Gátlástalanság sírja,Livello 8: Tomba della Malevolenza,Level 8: 悪意の墓,레벨 8: 증오의 무덤,Level 8: Graf van kwaadwilligheid,Nivå 8: Ondskapens grav,Level 8: Grobowiec Zła,Fase 8: Tumba da Malevolência,Nível 8: Túmulo da Malevolência,Nivelul 8: Mormântul răutății,Уровень №8: Гробница злобы,Level 8: Гроб злобе,Nivå 8: Ondskans grav,Seviye 8: Kötülük Mezarı -Level 9: March of The Demons,NHUSTR_9,,,,Level 9: Pochod démonů,Level 9: Dæmonernes march,Level 9: Marsch der Dämonen,,Nivelo 9: Marŝo de La Demonoj,Nivel 9: Marcha de los Demonios,,Taso 9: Demonien marssi,NIVEAU 9: Marche des Démons,9. Pálya: A démonok parádéja,Livello 9: La Marcia dei Demoni ,Level 9: デーモンの行進,레벨 9: 악마들의 행진,Level 9: Maart van de demonen,Nivå 9: Demonenes marsj,Level 9: Marsz Demonów,Fase 9: Marcha dos Demônios,Nível 9: Marcha dos Demônios,Nivelul 9: Marșul demonilor,Уровень №9: Шествие демонов,Level 9: Марш демона,Nivå 9: Demonernas marsch,Seviye 9: Şeytanların Yürüyüşü -,,Plutonia,,,,,,,,,,,,,,,,,,,,,,,,, -Level 1: Congo,PHUSTR_1,,,,Level 1: Kongo,,Level 1: Kongo,,Nivelo 1: Kongo,Nivel 1: Congo,,Taso 1: Kongo,NIVEAU 1: Congo,1. Pálya: Kongó,Livello 1: Congo,Level 1: コンゴ川,레벨 1: 콩고,Level 1: Kongo,Nivå 1: Kongo,Level 1: Kongo,Fase 1: Congo,Nível 1: Congo,Nivelul 1: Congo,Уровень №1: Конго,Level 1: Конго,Nivå 1: Kongo,Seviye 1: Kongo -Level 2: Well of Souls,PHUSTR_2,,,,Level 2: Studna duší,Level 2: Sjælebrønden,Level 2: Seelenbrunnen,,Nivelo 2: Puto de animoj,Nivel 2: Pozo de almas,,Taso 2: Sielujen lähde,NIVEAU 2: Puits des Ames,2. Pálya: A lelkek kútja,Livello 2: Pozzo delle Anime,Level 2: 魂の井戸,레벨 2: 영혼의 우물,Level 2: Bron van zielen,Nivå 2: Sjelenes brønn,Level 2: Studnia Dusz,Fase 2: Poço das Almas,Nível 2: Poço de Almas,Nivelul 2: Fântâna sufletelor,Уровень №2: Колодец душ,Level 2: Бунар душа,Nivå 2: Själarnas brunn,Seviye 2: Ruhlar Kuyusu -Level 3: Aztec,PHUSTR_3,,,,Level 3: Azték,Level 3: Azteker,Level 3: Aztekisch,,Nivelo 3: Azteko,Nivel 3: Azteca,,Taso 3: Asteekki,NIVEAU 3: Aztèque,3. Pálya: Azték,Livello 3: Aztec,Level 3: アステカ,레벨 3: 아즈텍,Level 3: Azteken,Nivå 3: Aztekisk,Level 3: Aztek,Fase 3: Asteca,Nível 3: Asteca,Nivelul 3: Aztec,Уровень №3: Ацтек,Level 3: Астек,Nivå 3: Azteker,Seviye 3: Aztek -Level 4: Caged,PHUSTR_4,,,,Level 4: V kleci,Level 4: Låst op,Level 4: Eingesperrt,,Nivelo 4: Enkaĝigita,Nivel 4: Enjaulado,,Taso 4: Häkissä,NIVEAU 4: Enfermé,4. Pálya: Ketrecbe zárva,Livello 4: Ingabbiato,Level 4: 檻の中,레벨 4: 갇히다,Level 4: Gekooid,Nivå 4: Buret,Level 4: W Klatce,Fase 4: Na Jaula,Nível 4: Na Jaula,Nivelul 4: Încarcerat,Уровень №4: В клетке,Level 4: Заробљен,Nivå 4: Burad,Seviye 4: Kafesli -Level 5: Ghost Town,PHUSTR_5,,,,Level 5: Město duchů,Level 5: Spøgelsesby,Level 5: Geisterstadt,,Nivelo 5: Fantoma urbeto,Nivel 5: Pueblo Fantasma,,Taso 5: Aavekaupunki,NIVEAU 5: Ville Fantôme,5. Pálya: Szellemváros,Livello 5: Città Fantasma,Level 5: ゴーストタウン,레벨 5: 유령 도시,Level 5: Spookstad,Nivå 5: Spøkelsesbyen,Level 5: Miasto Duchów,Fase 5: Cidade Fantasma,Nível 5: Cidade Fantasma,Nivelul 5: Orașul fantomă,Уровень №5: Город-призрак,Level 5: Град духова,Nivå 5: Spökstad,Seviye 5: Hayalet Kasaba -Level 6: Baron's Lair,PHUSTR_6,,,,Level 6: Baronovo doupě,Level 6: Baronens hule,Level 6: Lager des Barons,,Nivelo 6: Kaŝejo de Barono,Nivel 6: Guarida del Barón,,Taso 6: Paronin luola,NIVEAU 6: Repaire du Baron,6. Pálya: A báró rejteke,Livello 6: Tana del Barone,Level 6: バロンの隠れ家,레벨 6: 남작의 은신처,Level 6: Baron's kamp,Nivå 6: Baronens hule,Level 6: Legowisko Barona,Fase 6: Covil do Barão,Nível 6: Covil do Barão,Nivelul 6: Claustrul Baronului,Уровень №6: Обитель барона,Level 6: Баронова јазбина,Nivå 6: Baronens lya,Seviye 6: Baron'un İni -Level 7: Caughtyard,PHUSTR_7,,,,Level 7: Karcer,,Level 7: Gehege,,Nivelo 7: Kaptkorto,Nivel 7: Campo de Concentración,,Taso 7: Posenpiha,NIVEAU 7: Pris de court,7. Pálya: A foglyok udvara,Livello 7: Cortile Prigione,Level 7: 囚われの庭,레벨 7: 포획마당,Level 7: Omheining,Nivå 7: Fangegården,Level 7: Dziedziniec Więzienny,Fase 7: Campo de Concentração,Nível 7: Campo de Concentração,Nivelul 7: Capcana curții,Уровень №7: Ловчий двор,Level 7: Замчиште,Nivå 7: Fångården,Seviye 7: Caughtyard -Level 8: Realm,PHUSTR_8,,,,Level 8: Říše,Level 8: Rige,Level 8: Bereich,,Nivelo 8: Regno,Nivel 8: Reino,,Taso 8: Valtapiiri,NIVEAU 8: Royaume,8. Pálya: Uradalom,Livello 8: Regno,Level 8: 領地,레벨 8: 왕국,Level 8: Rijk,Nivå 8: Riket,Level 8: Królestwo,Fase 8: Reino,Nível 8: Reino,Nivelul 8: Tărâm,Уровень №8: Царство,Level 8: Царство,Nivå 8: Riket,Seviye 8: Diyar -Level 9: Abattoire,PHUSTR_9,,,,Level 9: Jatka,,Level 9: Schlachthaus,,Nivelo 9: Buĉejo,Nivel 9: Matadero,,Taso 9: Teurastamo,NIVEAU 9: Abattoir,9. Pálya: Vágóhíd,Livello 9: Mattatoio,Level 9: 屠殺場,레벨 9: 도축장,Level 9: Abattoir,Nivå 9: Slakteriet,Level 9: Rzeźnia,Fase 9: Matadouro,Nível 9: Matadouro,Nivelul 9: Abator,Уровень №9: Абатство,Level 9: Кланица,Nivå 9: Slakthus,Seviye 9: Abattoire -Level 10: Onslaught,PHUSTR_10,,,,Level 10: Nájezd,Level 10: Stormløb,Level 10: Angriff,,Nivelo 10: Buĉado,Nivel 10: Arremetida,,Taso 10: Ryntäys,NIVEAU 10: Assaut,10. Pálya: Roham,Livello 10: Assalto,Level 10: 猛襲,레벨 10: 맹공격,Level 10: Aanval,Nivå 10: Angrep,Level 10: Szturm,Fase 10: Investida,Nível 10: Investida,Nivelul 10: Năvala,Уровень №10: Натиск,Level 10: Јуриш,Nivå 10: Angrepp,Seviye 10: Saldırı -Level 11: Hunted,PHUSTR_11,,,,Level 11: Loven,Level 11: Jaget,Level 11: Gehetzt,,Nivelo 11: Ĉasata,Nivel 11: Cazado,,Taso 11: Metsästetty,NIVEAU 11: Traque,11. Pálya: Űzött vad,Livello 11: Braccato,Level 11: 逃走,레벨 11: 사냥당함,Level 11: Gejaagd,Nivå 11: Jaget,Level 11: Nawiedzony,Fase 11: Perseguição,Nível 11: Perseguição,Nivelul 11: Vânătoarea,Уровень №11: Преследуемый,Level 11: Уловљен,Nivå 11: Jaktad,Seviye 11: Avlanmış -Level 12: Speed,PHUSTR_12,,,,Level 12: Rychlost,Level 12: Fart,Level 12: Tempo,,Nivelo 12: Rapido,Nivel 12: Velocidad,,Taso 12: Vauhti,NIVEAU 12: Vitesse,12. Pálya: Iram,Livello 12: Velocità,Level 12: スピード,레벨 12: 스피드,Level 12: Haast,Nivå 12: Hastighet,Level 12: Pęd,Fase 12: Velocidade,Nível 12: Velocidade,Nivelul 12: Viteză,Уровень №12: Скорость,Level 12: Брзина,Nivå 12: Hastighet,Seviye 12: Hız -Level 13: The Crypt,PHUSTR_13,,,,Level 13: Krypta,Level 13: Krypten,Level 13: Die Gruft,,Nivelo 13: La kripto,Nivel 13: La cripta,,Taso 13: Krypta,NIVEAU 13: La Crypte,13. Pálya: A kripta,Livello 13: La Cripta,Level 13: 地下聖堂,레벨 13: 봉안당,Level 13: De crypte,Nivå 13: Krypten,Level 13: Krypta,Fase 13: A Cripta,Nível 13: A Cripta,Nivelul 13: Cripta,Уровень №13: Склеп,Level 13: Гробница,Nivå 13: Kryptan,Seviye 13: Mahzen -Level 14: Genesis,PHUSTR_14,,,,,,,,Nivelo 14: Genezo,Nivel 14: Génesis,,Taso 14: Luominen,NIVEAU 14: Genèse,14. Pálya: Teremtés,Livello 14: Genesi,Level 14: 創世記,레벨 14: 창세기,,,Level 14: Geneza,Fase 14: Gênese,Nível 14: Gênese,Nivelul 14: Geneza,Уровень №14: Зарождение,Level 14: Постанак,Nivå 14: Genesis,Seviye 14: Yaratılış -Level 15: The Twilight,PHUSTR_15,,,,Level 15: Soumrak,Level 15: Tusmørket,Level 15: Zwielicht,,Nivelo 15: La krepusko,Nivel 15: El ocaso,,Taso 15: Hämärä,NIVEAU 15: Le Crépuscule,15. Pálya: Alkonyat,Livello 15: Il Crepuscolo,Level 15: 黄昏,레벨 15: 황혼,Level 15: De schemering,Nivå 15: Skumringen,Level 15: Zmierzch,Fase 15: O Crepúsculo,Nível 15: O Crepúsculo,Nivelul 15: Amurgul,Уровень №15: Сумерки,Level 15: Сумрак,Nivå 15: Skymningen,Seviye 15: Alacakaranlık -Level 16: The Omen,PHUSTR_16,,,,Level 16: Znamení,Level 16: Omenet,Level 16: Das Omen,,Nivelo 16: La Aŭguro,Nivel 16: El Presagio,,Taso 16: Enne,NIVEAU 16: Le Présage,16. Pálya: Az Ómen,Livello 16: Il Presagio,Level 16: 予兆,레벨 16: 징조,Level 16: De omen,Nivå 16: Varselet,Level 16: Omen,Fase 16: O Presságio,Nível 16: O Presságio,Nivelul 16: Prevestirea,Уровень №16: Предзнаменование,Level 16: Знамење,Nivå 16: Omen,Seviye 16: Omen -Level 17: Compound,PHUSTR_17,,,,Level 17: Ústav,Level 17: Forbindelsen,Level 17: Anlage,,Nivelo 17: Konstruaĵaro,Nivel 17: Complejo,,Taso 17: Laitos,NIVEAU 17: Installation,17. Pálya: Létesítmény,Livello 17: Recinto,Level 17: 調合,레벨 17: 복합체,Level 17: Faciliteit,Nivå 17: Forbindelsen,Level 17: Mieszanka,Fase 17: Complexo,Nível 17: Complexo,Nivelul 17: Complexul,Уровень №17: Комплекс,Level 17: Једињење,Nivå 17: Förbandet,Seviye 17: Bileşik -Level 18: Neurosphere,PHUSTR_18,,,,Level 18: Neurosféra,Level 18: Neurosfæren,Level 18: Neurosphäre,,Nivelo 18: Neŭrosfero,Nivel 18: Neuroesfera,,Taso 18: Neurosfääri,NIVEAU 18: Neurosphère,18. Pálya: Neuroszféra,Livello 18: Neurosfera,Level 18: ニューロスフィア,레벨 18: 뉴로스피어,Level 18: Neurosferen,Nivå 18: Nevrosfæren,Level 18: Neurosfera,Fase 18: Neurosfera,Nível 18: Neurosfera,Nivelul 18: Neurosferă,Уровень №18: Нейросфера,Level 18: Неуросфера,Nivå 18: Neurosfären,Seviye 18: Nörosfer -Level 19: NME,PHUSTR_19,"“NME” read out loud means “enemy”, so translators should consider the translation of “enemy” into their language.",,,Level 19: Nepřítel,,,,Nivelo 19: Mal-BN,Nivel 19: N-MIGO,,Taso 19: VHLLNN,NIVEAU 19: NMI,19. Pálya: LNSG,Livello 19: NMIC,Level 19: 野郎,레벨 19: NOM,,,Level 19: WRG,Fase 19: N-MIGO,Nível 19: N-MIGO,Nivelul 19: INMIC,Уровень №19: В.Р.А.Г.,Level 19: Н.Е.П.Р.,Nivå 19: FiND,Seviye 19: NME -Level 20: The Death Domain,PHUSTR_20,,,,Level 20: Panství smrti,Level 20: Dødsdomænet,Level 20: Die Todeszone,,Nivelo 20: La morta regno,Nivel 20: El Dominio Mortal,,Taso 20: Kuoleman piiri,NIVEAU 20: Le Domaine de la Mort,20. Pálya: A holtak birtoka,Livello 20: Il Dominio della Morte,Level 20: 死の領域,레벨 20: 죽음의 영역,Level 20: Het domein van de dood,Nivå 20: Dødens domene,Level 20: Domena Śmierci,Fase 20: O Domínio da Morte,Nível 20: O Domínio da Morte,Nivelul 20: Domeniul morții,Уровень №20: Владения смерти,Level 20: Подручије смрти,Nivå 20: Dödsdomänen,Seviye 20: Ölüm Alanı -Level 21: Slayer,PHUSTR_21,,,,Level 21: Zabiják,Level 21: Slagter,Level 21: Töter,,Nivelo 21: Mortigisto,Nivel 21: Descuatizador,,Taso 21: Tappaja,NIVEAU 21: Pourfendeur,21. Pálya: Halálosztó,Livello 21: Assassino,Level 21: スレイヤー,레벨 21: 슬레이어,Level 21: Doder,Nivå 21: Slakteren,Level 21: Pogromca,Fase 21: Matador,Nível 21: Matador,Nivelul 21: Ucigător,Уровень №21: Истребитель,Level 21: Убица,Nivå 21: Jägare,Seviye 21: Avcı -Level 22: Impossible Mission,PHUSTR_22,,,,Level 22: Nemožná mise,Level 22: Umulig mission,Level 22: Unmögliche Mission,,Nivelo 22: Neebla tasko,Nivel 22: Misión imposible,,Taso 22: Mahdoton tehtävä,NIVEAU 22: Mission Impossible,22. Pálya: Lehetetlen küldetés,Livello 22: Missione Impossibile,Level 22: 不可能な任務,레벨 22: 임파서블 미션,Level 22: Onmogelijke missie,Nivå 22: Umulig oppdrag,Level 22: Niemożliwa Misja,Fase 22: Missão Impossível,Nível 22: Missão Impossível,Nivelul 22: Misiune imposibilă,Уровень №22: Невыполнимое задание,Level 22: Немогућа мисија,Nivå 22: Omöjligt uppdrag,Seviye 22: İmkansız Görev -Level 23: Tombstone,PHUSTR_23,,,,Level 23: Náhrobek,Level 23: Gravsten,Level 23: Grabstein,,Nivelo 23: Tombŝtono,Nivel 23: Lápida,,Taso 23: Hautakivi,NIVEAU 23: Pierre Tombale,23. Pálya: Sírkő,Livello 23: Pietra Tombale,Level 23: 墓石,레벨 23: 묘비,Level 23: Grafsteen,Nivå 23: Gravstein,Level 23: Nagrobek,Fase 23: Lápide,Nível 23: Lápide,Nivelul 23: Piatra de mormânt,Уровень №23: Надгробие,Level 23: Надгробни споменик,Nivå 23: Gravsten,Seviye 23: Mezar Taşı -Level 24: The Final Frontier,PHUSTR_24,,,,Level 24: Poslední hranice,Level 24: Den endelige grænse,Level 24: Die letzte Grenze,,Nivelo 24: La Fina Limo,Nivel 24: La Frontera Final,Nivel 24: La Última Frontera,Taso 24: Viimeinen rajamaa,NIVEAU 24: La Frontière Finale,24. Pálya: A végső határ,Livello 24: La Frontiera Finale,Level 24: 最後のフロンティア,레벨 24: 최후의 개척지,Level 24: De eindgrens,Nivå 24: Den siste grensen,Level 24: Ostateczna Granica,Fase 24: A Fronteira Final,Nível 24: A Fronteira Final,Nivelul 24: Ultima frontieră,Уровень №24: Последний рубеж,Level 24: Коначна граница,Nivå 24: Den sista gränsen,Seviye 24: Son Sınır -Level 25: The Temple of Darkness,PHUSTR_25,,,,Level 25: Chrám temna,Level 25: Mørkets tempel,Level 25: Der Tempel der Dunkelheit,,Nivelo 25: La Idolejo de Mallumo,Nivel 25: El Templo de la Oscuridad,,Taso 25: Pimeyden temppeli,NIVEAU 25: Le Temple des Ténèbres,25. Pálya: A sötétség temploma,Livello 25: Il Tempio dell'Oscurità,Level 25: 暗黒の神殿,레벨 25: 어둠의 신전,Level 25: De tempel van de duisternis,Nivå 25: Mørkets tempel,Level 25: Świątynia Mroku,Fase 25: O Templo da Escuridão,Nível 25: O Templo da Escuridão,Nivelul 25: Templul tenebros,Уровень №25: Храм тьмы,Level 25: Храм таме,Nivå 25: Mörkrets tempel,Seviye 25: Karanlığın Tapınağı -Level 26: Bunker,PHUSTR_26,,,,Level 26: Bunkr,,,,Nivelo 26: Bunkro,Nivel 26: Búnker,,Taso 26: Bunkkeri,NIVEAU 26: Bunker,26. Pálya: Bunker,Livello 26: Bunker,Level 26: バンカー,레벨 26: 방공호,,,Level 26: Bunkier,Fase 26: Casamata,Nível 26: Bunker,Nivelul 26: Buncăr,Уровень №26: Бункер,Level 26: Бункер,Nivå 26: Bunker,Seviye 26: Sığınak -Level 27: Anti-christ,PHUSTR_27,,,,Level 27: Antikrist,,Level 27: Antichrist,,Nivelo 27: Antikristo,Nivel 27: Anticristo,,Taso 27: Antikristus,NIVEAU 27: Anti-Christ,27. Pálya: Antikrisztus,Livello 27: Anticristo,Level 27: アンチキリスト,레벨 27: 적그리스도,Level 27: Antichrist,Nivå 27: Antikrist,Level 27: Antychryst,Fase 27: Anticristo,Nível 27: Anticristo,Nivelul 27: Antihrist,Уровень №27: Антихрист,Level 27: Антихрист,Nivå 27: Antikrist,Seviye 27: Mesih Karşıtı -Level 28: The Sewers,PHUSTR_28,,,,Level 28: Kanály,Level 28: Kloakkerne,Level 28: Kanäle,,Nivelo 28: La Kanalo,Nivel 28: Las Alcantarillas,,Taso 28: Viemärit,NIVEAU 28: Les Egouts,28. Pálya: A kanális,Livello 28: Le Fogne,Level 28: 下水道,레벨 28: 하수구,Level 28: De rioleringen,Nivå 28: Kloakken,Level 28: Ścieki,Fase 28: Os Esgotos,Nível 28: Os Esgotos,Nivelul 28: Canalizarea,Уровень №28: Канализация,Level 28: Канализација,Nivå 28: Sjukhusen,Seviye 28: Kanalizasyonlar -Level 29: Odyssey of Noises,PHUSTR_29,,,,Level 29: Odysea křiku,Level 29: Lydenes odyssé,Level 29: Odyssee der Geräusche,,Nivelo 29: Vojaĝo de Sonoj,Nivel 29: Odisea de Ruidos,,Taso 29: Äänten harharetki,NIVEAU 29: Odysée de Bruits,29. Pálya: A moraj ösvénye,Livello 29: Odissea dei Rumori,Level 29: オデッセイのノイズ,레벨 29: 속삭임의 여정,Level 29: Odyssee van geluiden,Nivå 29: Lydenes odyssé,Level 29: Odyseja Wrzawy,Fase 29: Odisséia de Ruidos,Nível 29: Odisséia de Ruidos,Nivelul 29: Odiseea zgomotelor,Уровень №29: Одиссея шумов,Level 29: Одисеја шумова,Nivå 29: Ljudets odyssé,Seviye 29: Seslerin Odyssey'i -Level 30: The Gateway of Hell,PHUSTR_30,,,,Level 30: Brána pekla,Level 30: Helvedes port,Level 30: Tor zur Hölle,,Nivelo 30: La Pordego de Inferno,Nivel 30: La Puerta del Infierno,,Taso 30: Helvetin porttikäytävä,NIVEAU 30: La Porte des Enfers,30. Pálya: Átjáró a pokolba,Livello 30: La Porta dell'Inferno,Level 30: 地獄の関門,레벨 30: 지옥의 차원문,Level 30: De poort van de hel,Nivå 30: Porten til helvete,Level 30: Brama Piekieł,Fase 30: O Portão do Inferno,Nível 30: O Portão do Inferno,Nivelul 30: Poarta spre infern,Уровень №30: Врата ада,Level 30: Пролаз пакла,Nivå 30: Helvetets port,Seviye 30: Cehennem Kapısı -Level 31: Cyberden,PHUSTR_31,,,,Level 31: Kyberdoupě,,Level 31: Cyberbau,,Nivelo 31: Cibernesto,Nivel 31: Ciber-guarida,,Taso 31: Kyberpesä,NIVEAU 31: Cyber-Antre,31. Pálya: Kiberodú,Livello 31: Cybergabbia,Level 31: サイバーの巣,레벨 31: 사이버소굴,,,Level 31: Cybernora,Fase 31: Ciberantro,Nível 31: Ciberantro,Nivelul 31: Cibervizuină,Уровень №31: Киберлогово,Level 31: Сајбер-јазбина,Nivå 31: Cyberden,Seviye 31: Siber'in ini -Level 32: Go 2 It,PHUSTR_32,,,,Level 32: Jdi do toho,,,,Nivelo 32: Iru al ĝi!,Nivel 32: Ve a x ello,Nivel 32: Ve x eso,Taso 32: Iske kii,NIVEAU 32: Go 2 It,32. Pálya: Menj oda!,Livello 32: Dacci Dentro,Level 32: 逝ってこい,레벨 32: 함 해 봐,Level 32: Ga ervoor,,Level 32: Do Dzieła,Fase 32: Vai Fundo,Nível 32: Siga em Frente,Nivelul 32: Du-te la ei,Уровень №32: П0лный вп3рёд,Level 32: Иди ка њему,Nivå 32: Gå till det,Seviye 32: Devam Et -,,TNT: Evilution,,,,,,,,,,,,,,,,,,,,,,,,, -Level 1: System Control,THUSTR_1,,,,Level 1: Administrace,Level 1: Systemkontrol,Level 1: Systemkontrolle,,Nivelo 1: Sistema Kontrolo,Nivel 1: Control del Sistema,,Taso 1: Järjestelmäohjaamo,NIVEAU 1: Système de Contrôle,1. Pálya: Rendszervezérlő,Livello 1: Controllo del Sistema,Level 1: 制御システム,레벨 1: 시스템 제어시설,Level 1: Systeemcontrole,Nivå 1: Systemkontroll,Level 1: Kontrola Systemu,Fase 1: Controle do Sistema,Nível 1: Controlo de Sistema,Nivelul 1: Control sisteme,Уровень №1: Центр управления системой,Level 1: Контролна система,Nivå 1: Systemkontroll,Seviye 1: Sistem Kontrolü -Level 2: Human BBQ,THUSTR_2,,,,Level 2: Člověčí grilovačka,Level 2: Menneskelig grill,Level 2: Menschliches Barbecue,,Nivelo 2: Homo-Kradrostado,Nivel 2: Barbacoa Humana,,Taso 2: Ihmisgrilli,NIVEAU 2: Barbecue Humain,2. Pálya: Emberi grill,Livello 2: Barbecue Umano,Level 2: 人肉晩餐会,레벨 2: 인간 바비큐,Level 2: Menselijke BBQ,Nivå 2: Menneskelig BBQ,Level 2: Ludzki Grill,Fase 2: Churrasco Humano,Nível 2: Churrasco Humano,Nivelul 2: Oameni la grătar,Уровень №2: Барбекю из человечины,Level 2: Људски роштиљ,Nivå 2: Människogrill,Seviye 2: İnsan Barbekü -Level 3: Power Control,THUSTR_3,,,,Level 3: Napájecí vedení,Level 3: Kontrol med magten,Level 3: Energiekontrolle,,Nivelo 3: Energia Kontrolo,Nivel 3: Control de Energía,,Taso 3: Voimalan ohjaamo,NIVEAU 3: Contrôle Energétique,3. Pálya: Energiavezérlő,Livello 3: Centrale Energetica,Level 3: 制御室,레벨 3: 전력 통제소,Level 3: Machtscontrole,Nivå 3: Kraftkontroll,Level 3: Kontrola Zasilania,Fase 3: Controle de Energia,Nível 3: Controlo Energético,Nivelul 3: Uzina,Уровень №3: Центр управления питанием,Level 3: Контролна моћ,Nivå 3: Maktkontroll,Seviye 3: Güç Kontrolü -Level 4: Wormhole,THUSTR_4,,,,Level 4: Červí díra,Level 4: Ormehul,Level 4: Wurmloch,,Nivelo 4: Vermtruo,Nivel 4: Agujero de Gusano,,Taso 4: Madonreikä,NIVEAU 4: Trou de Ver,4. Pálya: Féreglyuk,Livello 4: Wormhole,Level 4: 虫喰い穴,레벨 4: 웜홀,Level 4: Wormgat,Nivå 4: Ormehull,Level 4: Tunel,Fase 4: Buraco de Minhoca,Nível 4: Buraco de Minhoca,Nivelul 4: Gaura de vierme,Уровень №4: Червоточина,Level 4: Црвоточина,Nivå 4: Maskhål,Seviye 4: Solucan Deliği -Level 5: Hanger,THUSTR_5,"Not ""Hangar""",,,Level 5: Hangár,,Level 5: Hangar,,Nivelo 5: Pendigejo,Nivel 5: Colgador,,Taso 5: Lentoalushalli,NIVEAU 5: Hengar,5. Pálya: Horog,Livello 5: Hanga,Level 5: 格納庫,레벨 5: 격납고,Level 5: Hangar,Nivå 5: Hanger,Level 5: Hangar,Fase 5: Hangar,Nível 5: Hangar,Nivelul 5: Hangar,Уровень №5: Ангар,Level 5: Вешалица,Nivå 5: Hängare,Seviye 5: Askı -Level 6: Open Season,THUSTR_6,,,,Level 6: Lovecká sezóna,Level 6: Åben sæson,Level 6: Jagdsaison,,Nivelo 6: Ĉasosezono,Nivel 6: Temporada Abierta,,Taso 6: Avoin sesonki,NIVEAU 6: La Chasse Est Ouverte,6. Pálya: Vadászszezon,Livello 6: Stagione Aperta,Level 6: 狩猟解禁,레벨 6: 사냥철,Level 6: Open seizoen,Nivå 6: Åpen sesong,Level 6: Otwarty Sezon,Fase 6: Temporada Aberta,Nível 6: Época Aberta,Nivelul 6: Sezon deschis,Уровень №6: Сезон охоты,Level 6: Отворена сезона,Nivå 6: Öppen säsong,Seviye 6: Açık Sezon -Level 7: Prison,THUSTR_7,,,,Level 7: Vězení,Level 7: Fængsel,Level 7: Gefängnis,,Nivelo 7: Malliberejo,Nivel 7: Prisión,,Taso 7: Vankila,NIVEAU 7: Prison,7. Pálya: Börtön,Livello 7: Prigione,Level 7: 監獄,레벨 7: 감옥,Level 7: Gevangenis,Nivå 7: Fengsel,Level 7: Więzienie,Fase 7: Prisão,Nível 7: Prisão,Nivelul 7: Închisoare,Уровень №7: Тюрьма,Level 7: Затвор,Nivå 7: Fängelse,Seviye 7: Hapishane -Level 8: Metal,THUSTR_8,,,,Level 8: Kov,,Level 8: Metall,,Nivelo 8: Metalo,Nivel 8: Metal,,Taso 8: Metalli,NIVEAU 8: Métal,8. Pálya: Fém,Livello 8: Metallo,Level 8: メタル,레벨 8: 강철,Level 8: Metaal,Nivå 8: Metall,,Fase 8: Metal,Nível 8: Metal,Nivelul 8: Metal,Уровень №8: Металл,Level 8: Метал,Nivå 8: Metall,Seviye 8: Metal -Level 9: Stronghold,THUSTR_9,,,,Level 9: Pevnost,Level 9: Borgen,Level 9: Festung,,Nivelo 9: Fuorto,Nivel 9: Fortaleza,,Taso 9: Linnake,NIVEAU 9: Forteresse,9. Pálya: Erőd,Livello 9: Fortezza,Level 9: 牙城,레벨 9: 요새,Level 9: Vesting,Nivå 9: Festning,Level 9: Warownia,Fase 9: Fortaleza,Nível 9: Fortaleza,Nivelul 9: Bastion,Уровень №9: Твердыня,Level 9: Упориште,Nivå 9: Fästning,Seviye 9: Kale -Level 10: Redemption,THUSTR_10,,,,Level 10: Vykoupení,Level 10: Forløsning,Level 10: Erlösung,,Nivelo 10: Elaĉeto,Nivel 10: Redención,,Taso 10: Lunastus,NIVEAU 10: Rédemption,10. Pálya: Megváltás,Livello 10: Redenzione,Level 10: 償還,레벨 10: 구원,Level 10: Aflossing,Nivå 10: Innløsning,Level 10: Odkupienie,Fase 10: Redenção,Nível 10: Redenção,Nivelul 10: Răscumpărare,Уровень №10: Искупление,Level 10: Искупљење,Nivå 10: Inlösen,Seviye 10: Kefaret -Level 11: Storage Facility,THUSTR_11,,,,Level 11: Skladiště,Level 11: Opbevaringsanlæg,Level 11: Lagerstätte,,Nivelo 11: Stokejo,Nivel 11: Complejo de Almacenes,Nivel 11: Almacenes,Taso 11: Varastolaitos,NIVEAU 11: Complexe de Stockage,11. Pálya: Raktárépület,Livello 11: Impianto di Stoccaggio,Level 11: 貯蔵施設,레벨 11: 저장소,Level 11: Opslagfaciliteit,Nivå 11: Lagringsanlegg,Level 11: Magazyn,Fase 11: Centro de Armazenamento,Nível 11: Centro de Armazenamento,Nivelul 11: Stația de depozitare,Уровень №11: Склад,Level 11: Складиште,Nivå 11: Förvaringsanläggning,Seviye 11: Depolama Tesisi -Level 12: Crater,THUSTR_12,,,,Level 12: Kráter,Level 12: Krater,Level 12: Krater,,Nivelo 12: Kratero,Nivel 12: Cráter,,Taso 12: Kraateri,NIVEAU 12: Cratère,12. Pálya: Kráter,Livello 12: Cratere,Level 12: 火口,레벨 12: 분화구,Level 12: Krater,Nivå 12: Krater,Level 12: Krater,Fase 12: Cratera,Nível 12: Cratera,Nivelul 12: Crater,Уровень №12: Кратер,Level 12: Кратер,Nivå 12: Krater,Seviye 12: Krater -Level 13: Nukage Processing,THUSTR_13,,,,Level 13: Jaderné zpracování,Level 13: Nukageforarbejdning,Level 13: Nuklearverarbeitung,,Nivelo 13: Nukleaĵo-Traktejo,Nivel 13: Procesamiento de Residuos Nucleares,,Taso 13: Ydinjätekäsittely,NIVEAU 13: Traitement Nucléaire,13. Pálya: Atomhulladék-feldolgozó,Livello 13: Trattamento Nucleare,Level 13: 核廃棄物加工所,레벨 13: 폐기물 처리소,Level 13: Nucleaire verwerking,Nivå 13: Nukage-prosessering,Level 13: Przetwórstwo Jądrowe,Fase 13: Processamento Nuclear,Nível 13: Processamento Nuclear,Nivelul 13: Prelucrarea deșeurilor nucleare,Уровень №13: Переработка ядерных отходов,Level 13: Прерада нуклеарног отпада,Nivå 13: Kärnavfall Behandling,Seviye 13: Nukage İşleme -Level 14: Steel Works,THUSTR_14,,,,Level 14: Ocelárna,Level 14: Stålværk,Level 14: Stahlwerk,,Nivelo 14: Ŝtalejo,Nivel 14: Siderúrgica,Nivel 14: Siderurgia,Taso 14: Terästehdas,NIVEAU 14: Aciérie,14. Pálya: Acélművek,Livello 14: Acciaieria,Level 14: 製鉄所,레벨 14: 제강소,Level 14: Staalfabrieken,Nivå 14: Stålverk,Level 14: Huta,Fase 14: Siderúrgica,Nível 14: Siderúrgica,Nivelul 14: Oțelărie,Уровень №14: Сталелитейный завод,Level 14: Челичана,Nivå 14: Stålverk,Seviye 14: Çelik İşleri -Level 15: Dead Zone,THUSTR_15,,,,Level 15: Mrtvá zóna,Level 15: Død zone,Level 15: Tote Zone,,Nivelo 15: Senvivzono,Nivel 15: Zona Muerta,,Taso 15: Kuollut alue,NIVEAU 15: Zone Morte,15. Pálya: A holtak zónája,Livello 15: Zona Morta,Level 15: 危険地帯,레벨 15: 사각지대,Level 15: Dode zone,Nivå 15: Død sone,Level 15: Martwa Strefa,Fase 15: Zona Morta,Nível 15: Zona Morta,Nivelul 15: Zona moartă,Уровень №15: Мёртвая зона,Level 15: Зона смрти,Nivå 15: Dödszon,Seviye 15: Ölü Bölge -Level 16: Deepest Reaches,THUSTR_16,,,,Level 16: Nejhlubší sluje,Level 16: De dybeste afkroge,Level 16: Tiefe,,Nivelo 16: Plejsubejo,Nivel 16: Recodos profundos,,Taso 16: Syvyydet,NIVEAU 16: Profondeurs,16. Pálya: A legmélyebb pont,Livello 16: Profondità,Level 16: 最深部,레벨 16: 깊숙한 강,Level 16: Diepste reiken,Nivå 16: De dypeste områdene,Level 16: Głębiny,Fase 16: Profundezas,Nível 16: Profundezas,Nivelul 16: În adâncuri,Уровень №16: Глубочайшие достижения,Level 16: Најдубља дубина,Nivå 16: De djupaste hålen,Seviye 16: En Derin Erişimler -Level 17: Processing Area,THUSTR_17,,,,Level 17: Kombinát,Level 17: Forarbejdningsområde,Level 17: Verarbeitungsbereich,,Nivelo 17: Traktadareo,Nivel 17: Área de Procesamiento,,Taso 17: Käsittelyalue,NIVEAU 17: Zone de Traitement,17. Pálya: Feldolgozó,Livello 17: Area di Elaborazione,Level 17: 処理地帯,레벨 17: 처리 구역,Level 17: Verwerkingsgebied,Nivå 17: Behandlingsområde,Level 17: Strefa Przerobowa,Fase 17: Área de Processamento,Nível 17: Área de Processamento,Nivelul 17: Aria de procesare,Уровень №17: Зона обработки,Level 17: Подручје обраде,Nivå 17: Bearbetningsområde,Seviye 17: İşleme Alanı -Level 18: Mill,THUSTR_18,,,,Level 18: Mlýn,Level 18: Mølle,Level 18: Mühle,,Nivelo 18: Muelejo,Nivel 18: Molino,,Taso 18: Mylly,NIVEAU 18: Fonderie,18. Pálya: Malom,Livello 18: Fonderia,Level 18: 製粉所,레벨 18: 제분소,Level 18: Molen,Nivå 18: Mølle,Level 18: Młyn,Fase 18: Moinho,Nível 18: Moinho,Nivelul 18: Moara,Уровень №18: Завод,Level 18: Млин,Nivå 18: Kvarn,Seviye 18: Değirmen -Level 19: Shipping/respawning,THUSTR_19,,,,Level 19: Přeprava,Level 19: Forsendelsescenter,Level 19: Versandlager,,Nivelo 19: Ekspedo/Revivado,Nivel 19: Enviando/Reapareciendo,,Taso 19: Huolinta/Ylösnostatus,NIVEAU 19: Envoi/Réapparition,19. Pálya: Szállítás/újraéledés,Livello 19: Consegna/Respawn,Level 19: 出荷と再生成,레벨 19: 운송/리스폰 장소,Level 19: Verzendingscentrum,Nivå 19: Frakt/omlasting,Level 19: Wysyłka/Reprodukcja,Fase 19: Expedição/reaparecimento,Nível 19: Expedição/reaparecimento,Nivelul 19: Livrare/reapariție,Уровень №19: Погрузка и отправка,Level 19: Отпремање/оживљавање,Nivå 19: Skeppning,Seviye 19: Nakliye Merkezi -Level 20: Central Processing,THUSTR_20,,,,Level 20: Centrální zpracování,Level 20: Central forarbejdning,Level 20: Zentralverarbeitung,,Nivelo 20: Centra Eskpedado,Nivel 20: Procesamiento Central,,Taso 20: Käsittelykeskus,NIVEAU 20: Organisme Central,20. Pálya: Központi feldolgozó,Livello 20: Centrale di Elaborazione,Level 20: 中央処理所,레벨 20: 중앙 처리소,Level 20: Centrale verwerking,Nivå 20: Sentral behandling,Level 20: Centralny Proces,Fase 20: Processamento Central,Nível 20: Processamento Central,Nivelul 20: Prelucrare centrală,Уровень №20: Центральный пункт обработки,Level 20: Централна обрада,Nivå 20: Centralt bearbetningsområde,Seviye 20: Merkezi İşlem -Level 21: Administration Center,THUSTR_21,,,,Level 21: Administrativní centrum,Level 21: Administrationscenter,Level 21: Verwaltungszentrum,,Nivelo 21: Administracia Centro,Nivel 21: Centro de Administración,,Taso 21: Keskushallinto,NIVEAU 21: Centre Administratif,21. Pálya: Adminisztrációs központ,Livello 21: Centro Amministrativo,Level 21: 行政センター,레벨 21: 관리 센터,Level 21: Administratief centrum,Nivå 21: Administrasjonssenter,Level 21: Centrum Administracyjne,Fase 21: Centro de Administração,Nível 21: Centro de Administração,Nivelul 21: Centru administrativ,Уровень №21: Административный центр,Level 21: Административни центар,Nivå 21: Administrationscenter,Seviye 21: Yönetim Merkezi -Level 22: Habitat,THUSTR_22,,,,,Level 22: Levested,,,Nivelo 22: Habitato,Nivel 22: Hábitat,,Taso 22: Asuinpaikka,NIVEAU 22: Habitat,22. Pálya: Élőhely,Livello 22: Habitat,Level 22: 生息地,레벨 22: 서식지,,Nivå 22: Habitat,Level 22: Siedlisko,Fase 22: Habitat,Nível 22: Habitat,Nivelul 22: Habitat,Уровень №22: Ареал,Level 22: Станиште,Nivå 22: Livsområde,Seviye 22: Habitat -Level 23: Lunar Mining Project,THUSTR_23,,,,Level 23: Lunární těžební projekt,Level 23: Projekt for månens minedrift,Level 23: Mondbergbauprojekt,,Nivelo 23: Luna Mino-Projekto,Nivel 23: Proyecto de Minería Lunar,,Taso 23: Kuukaivosprojekti,NIVEAU 23: Projet Minier Lunaire,23. Pálya: Holdbánya-projekt,Livello 23: Progetto Minerario Lunare,Level 23: 月面探鉱計画,레벨 23: 월석 채광 계획,Level 23: Maanmijnbouw project,Nivå 23: Månegruveprosjekt,Level 23: Projekt Księżycowe Górnictwo,Fase 23: Projeto de Mineração Lunar,Nível 23: Projeto de Escavação Lunar,Nivelul 23: Proiect minier satelitar,Уровень №23: Лунный проект горной добычи,Level 23: Пројекат лунарног рударства,Nivå 23: Gruvprojekt på månen,Seviye 23: Ay Madenciliği Projesi -Level 24: Quarry,THUSTR_24,,,,Level 24: Kamenolom,Level 24: Stenbrud,Level 24: Steinbruch,,Nivelo 24: Ŝtonejo,Nivel 24: Cantera,,Taso 24: Louhos,NIVEAU 24: Carrière,24. Pálya: Kőbánya,Livello 24: Caccia,Level 24: 採石場,레벨 24: 채석장,Level 24: Steengroeve,Nivå 24: Steinbrudd,Level 24: Kamieniołom,Fase 24: Pedreira,Nível 24: Pedreira,Nivelul 24: Carieră,Уровень №24: Карьер,Level 24: Каменолом,Nivå 24: Stenbrott,Seviye 24: Taş Ocağı -Level 25: Baron's Den,THUSTR_25,,,,Level 25: Baronovo doupě,Level 25: Baronens hule,Level 25: Der Bau des Barons,,Nivelo 25: Nestego de Barono,Nivel 25: Guarida del Barón,,Taso 25: Paronin pesä,NIVEAU 25: l'Antre des Barons,25. Pálya: A báró odúja,Livello 25: Antro del Barone,Level 25: バロンの巣窟,레벨 25: 남작의 소굴,Level 25: Het baron's gebouw,Nivå 25: Baronens hule,Level 25: Legowisko Barona,Fase 25: Covil do Barão,Nível 25: Covil do Barão,Nivelul 25: Cuibul Baronului,Уровень №25: Логово барона,Level 25: Баронова јазбина,Nivå 25: Baronens lya,Seviye 25: Baron'un İni -Level 26: Ballistyx,THUSTR_26,,,,Level 26: Balistika,,,,Nivelo 26: Balistikso,Nivel 26: Balístige,,Taso 26: Ballistyks,NIVEAU 26: Ballistyx,26. Pálya: Ballisztüx,Livello 26: Ballistige,Level 26: バリステュクス,레벨 26: 탄도스틱스,,,Level 26: Balistyka,Fase 26: Ballistige,Nível 26: Ballistige,Nivelul 26: Ballistyx,Уровень №26: Баллистикс,Level 26: Билистичкикс,Nivå 26: Ballistyx,Seviye 26: Balistyx -Level 27: Mount Pain,THUSTR_27,,,,Level 27: Hora bolesti,Level 27: Smertefjellet,Level 27: Berg des Schmerzes,,Nivelo 27: Monto de Doloro,Nivel 27: Monte Dolor,,Taso 27: Tuskavuori,NIVEAU 27: Mont Souffrance,27. Pálya: A Gyötrelem Hegye,Livello 27: Monte del Dolore,Level 27: 苦しみの山,레벨 27: 등신같은 등산,Level 27: Pijn in de bergen,Nivå 27: Smertefjellet,Level 27: Góra Bólu,Fase 27: Monte Dor,Nível 27: Monte Dor,Nivelul 27: Muntele Durerii,Уровень №27: Гора Боль,Level 27: Планина боли,Nivå 27: Smärta på berget,Seviye 27: Acı Dağı -Level 28: Heck,THUSTR_28,,,,Level 28: Sakra,,Level 28: Zum Teufel,,Nivelo 28: Diable,Nivel 28: Diablos,,Taso 28: Hemmetti,NIVEAU 28: Que Diable?,28. Pálya: Rosseb,Livello 28: Al Diavolo,Level 28: 苛立ち,레벨 28: 젠장함,,Nivå 28: Helvete,Level 28: Do Diabła,Fase 28: Capeta,Nível 28: Inferno,Nivelul 28: Naiba,Уровень №28: Чертовщина,Level 28: Пакао,Nivå 28: Heck,Seviye 28: Cehennem -Level 29: River Styx,THUSTR_29,,,,Level 29: Řeka Styx,Level 29: Floden Styx,Level 29: Fluss Styx,,Nivelo 29: Rivero de Stikso,Nivel 29: Río Estige,,Taso 29: Styksjoki,NIVEAU 29: Fleuve Styx,29. Pálya: A Sztüx folyó,Livello 29: Fiume Stige,Level 29: 三途の川,레벨 29: 스틱스 강,Level 29: Rivier Styx,Nivå 29: Elven Styx,Level 29: Styks,Fase 29: Rio Estige,Nível 29: Rio Estige,Nivelul 29: Râul Styx,Уровень №29: Река Стикс,Level 29: Река Стикс,Nivå 29: Floden Styx,Seviye 29: Styx Nehri -Level 30: Last Call,THUSTR_30,,,,Level 30: Poslední mise,Level 30: Sidste opkald,Level 30: Letzter Aufruf,,Nivelo 30: Fina Voko,Nivel 30: Última Llamada,,Taso 30: Viimeinen koollehuuto,NIVEAU 30: Dernier Appel,30. Pálya: Utolsó esély,Livello 30: Ultima Chiamata,Level 30: 最終指令,레벨 30: 최후의 호출,Level 30: Laatste oproep,Nivå 30: Siste innkalling,Level 30: Ostatni Zew,Fase 30: Última Chamada,Nível 30: Última Chamada,Nivelul 30: Ultimul apel,Уровень №30: Последний вызов,Level 30: Последњи позив,Nivå 30: Sista kallelsen,Seviye 30: Son Çağrı -Level 31: Pharaoh,THUSTR_31,,,,Level 31: Faraón,Level 31: Farao,Level 31: Pharao,,Nivelo 31: Faraono,Nivel 31: Faraón,,Taso 31: Faarao,NIVEAU 31: Pharaon,31. Pálya: Fáraó,Livello 31: Faraone,Level 31: ファラオ,레벨 31: 파라오,Level 31: Farao,Nivå 31: Farao,Level 31: Faraon,Fase 31: Faraó,Nível 31: Faraó,Nivelul 31: Faraon,Уровень №31: Фараон,Level 31: Фараон,Nivå 31: Farao,Seviye 31: Firavun -Level 32: Caribbean,THUSTR_32,,,,Level 32: Karibik,Level 32: Caribien,Level 32: Karibik,,Nivelo 32: Karibio,Nivel 32: Caribeño,,Taso 32: Karibia,NIVEAU 32: Caraïbes,32. Pálya: Karib-térség,Livello 32: Caraibi,Level 32: カリビアン,레벨 32: 카리브해,Level 32: Caribisch,Nivå 32: Karibia,Level 32: Karaiby,Fase 32: Caribe,Nível 32: Caraíbas,Nivelul 32: Caraibe,Уровень №32: Карибы,Level 32: Кариби,Nivå 32: Karibien,Seviye 32: Karayipler -,,Heretic,,,,,,,,,,,,,,,,,,,,,,,,, -The Docks,HHUSTR_E1M1,,,,Přístav,Havnene,Die Docks,,La Havenoj,Los Muelles,,Satamat,Les Docks,A Kikötő,Il Molo,埠頭,항구,De dokken,Havnen,Doki,As Docas,,Docul,Доки,Лука,Hamnarna,Rıhtım -The Dungeons,HHUSTR_E1M2,,,,Žaláře,Fangehullerne,Die Kerker,,La Malliberejoj,Los Calabozos,,Tyrmät,Le Donjon,A Kazamaták,I Sotterranei,地下牢,지하감옥,De kerkers,Fangehullene,Lochy,As Masmorras,,Temnița,Темницы,Тамнице,Fästningarna,Zindanlar -The Gatehouse,HHUSTR_E1M3,,,,Vrátnice,Portens hus,Das Pförtnerhaus,,La Pordegejo,El Cuerpo de Guardia,,Porttitalo,Le Corps de Garde,A Kapuház,L'ingresso,門塔,문루,Het poortgebouw,Porthuset,Stróżówka,O Portão de Entrada,,Casa portarului,Привратницкая,Стражарница,Porthuset,Kapı Evi -The Guard Tower,HHUSTR_E1M4,,,,Strážní věž,Vagttårnet,Der Wachturm,,La Gardturo,La Torre de Guardia,,Vartiotorni,La Tour de Garde,Az Őrtorony,La Torre di Guardia,監視塔,보초 누대,De wachttoren,Vakttårnet,Wieża Strażnicza,A Torre de Guarda,,Turnul de veghe,Сторожевая башня,Извидница,Vakttornet,Muhafız Kulesi -The Citadel,HHUSTR_E1M5,,,,Citadela,Citadellet,Die Festung,,La Citadelo,La Ciudadela,,Linnake,La Citadelle,A Citadella,La Cittadella,要塞,거점,De citadel,Citadellet,Cytadela,A Cidadela,,Cetatea,Цитадель,Цитадела,Citadellet,Hisar -The Cathedral,HHUSTR_E1M6,,,,Katedrála,Katedralen,Die Kathedrale,,La Katedralo,La Catedral,,Katedraali,La Cathédrale,A Katedrális,La Cattedrale,大聖堂,대성당,De kathedraal,Katedralen,Katedra,A Catedral,,Catedrala,Кафедральный собор,Катедрала,Katedralen,Katedral -The Crypts,HHUSTR_E1M7,,,,Krypty,Krypterne,Die Krypten,,La Kriptoj,Las Criptas,,Kryptat,La Crypte,A Kripták,Le Cripte,地下聖堂,지하 묘실,De grafkelders,Kryptene,Krypty,As Criptas,,Criptele,Склепы,Крипта,Krypten,Mahzenler -Hell's Maw,HHUSTR_E1M8,,,,Chřtán pekla,Helvedes gab,Der Höllenschlund,,Faŭko de Infero,Fauces del Infierno,,Helvetin kita,La Geule de l'Enfer,A Pokol Szája,La Bocca dell'Inferno,地獄の肚,지옥의 목구멍,De helmouth,Helvetes gap,Paszcza Piekieł,A Boca do Inferno,,Gura iadului,Адская утроба,Паклено ждрело,Helvetets gap,Cehennem Ağzı -The Graveyard,HHUSTR_E1M9,,,,Hřbitov,Kirkegården,Der Friedhof,,La Tombejo,El Cementerio,,Hautausmaa,Le Cimetière,A Temető,Il Cimitero,墓場,공동묘지,De begraafplaats,Kirkegården,Cmentarz,O Cemitério,,Cimitirul,Кладбище,Гробље,Kyrkogården,Mezarlık -The Crater,HHUSTR_E2M1,,,,Kráter,Krateret,Der Krater,,La Kratero,El Cráter,,Kraateri,Le Cratère,A Kráter,Il Cratere,噴火口,깊은 혈,De krater,Krateret,Krater,A Cratera,,Craterul,Кратер,Кратер,Kratern,Krater -The Lava Pits,HHUSTR_E2M2,,,,Lávové jámy,Lavagruberne,Die Lavagruben,,La Lafo-Fosaĵo,Las Canteras de Lava,,Laavamontut,Les Puits de Lave,A Lávaárok,I Pozzi della Lava,溶岩の竪穴,용암 구덩이,De lavaputten,Lavagropene,Szyb Lawy,Os Fossos de Lava,,Gropile cu lavă,Лавовые очаги,Понор лаве,Lavagruvorna,Lav Çukurları -The River of Fire,HHUSTR_E2M3,,,,Ohnivá řeka,Ildfloden,Der Feuerfluss,,La Rivero de Fajro,El Río de Fuego,,Tulijoki,La Rivière de Feu,A Tűzfolyó,Il Fiume di Fuoco,火の河,화염의 강,De rivier van vuur,Elven av ild,Rzeka Ognia,O Rio de Fogo,,Râul de foc,Река огня,Река од ватре,Eldfloden,Ateş Nehri -The Ice Grotto,HHUSTR_E2M4,,,,Ledová grotta,Isgrotten,Die Eisgrotte,,La Glacigroto,La Gruta de Hielo,,Jääluola,La Grotte de Glace,A Jégbarlang,La Grotta del Ghiaccio,氷の洞窟,얼음 동굴,De ijsgrot,Isgrotten,Lodowa Grota,A Gruta de Gelo,,Grota de gheață,Ледяной грот,Ледена пећина,Isgrottan,Buz Mağarası -The Catacombs,HHUSTR_E2M5,,,,Katakomby,Katakomberne,Die Katakomben,,La Katakomboj,Las Catacumbas,,Katakombit,Les Catacombes,A Katakombák,Le Catacombe,地下墓所,태고의 무덤,De catacomben,Katakombene,Katakumby,As Catacumbas,Os Túmulos,Catacombele,Катакомбы,Катакомбе,Katakomberna,Yeraltı Mezarları -The Labyrinth,HHUSTR_E2M6,,,,Labyrint,Labyrinten,Das Labyrinth,,La Labirinto,El Laberinto,,Labyrintti,Le Labyrinthe,A Labirintus,Il Labirinto,迷宮,미궁,Het labyrint,Labyrinten,Labirynt,O Labirinto,,Labirintul,Лабиринт,Лавиринт,Labyrinten,Labirent -The Great Hall,HHUSTR_E2M7,,,,Velký sál,Den store sal,Die große Halle,,La Granda Halo,El Gran Salón,,Suuri halli,Le Grand Hall,A Nagy Folyosó,La Grande Sala,大公会堂,대회관,De grote zaal,Den store salen,Wielki Hol,O Grande Salão,,Sala cea mare,Большой зал,Велика дворана,Den stora hallen,Büyük Salon -The Portals of Chaos,HHUSTR_E2M8,,,,Portály chaosu,Kaosets portaler,Das Portal des Chaos,,La Portaloj de Ĥaoso,Los Portales del Caos,,Kaaoksen portaalit,Le Portail du Chaos,A Káosz Portáljai,I Portali del Caos,混沌への門,혼돈의 차원문,De portalen van chaos,Kaosets portaler,Portale Chaosu,Os Portais do Caos,,Portalurile haosului,Порталы хаоса,Портали хаоса,Kaosets portaler,Kaos Kapıları -The Glacier,HHUSTR_E2M9,,,,Ledovec,Gletsjeren,Der Gletscher,,La Glaciejo,El Glaciar,,Jäätikkö,Le Glacier,A Gleccser,Il Ghiacciaio,氷河,빙하 구역,De gletsjer,Isbreen,Lodowiec,A Geleira,O Glaciar,Ghețarul,Ледник,Глечер,Glaciären,Buzul -The Storehouse,HHUSTR_E3M1,,,,Skladiště,Magasinet,Die Lagerhalle,,La Stokejo,El Almacén,,Varasto,L'Entrepôt,A Raktár,Il Magazzino,倉庫,저장고,Het pakhuis,Forrådshuset,Magazyn,O Armazém,,Depozitul,Кладовая,Складиште,Magasinet,Depo -The Cesspool,HHUSTR_E3M2,,,,Žumpa,Kedelbassinet,Die Latrine,,La Kloako,El Pozo,,Likakaivo,Le Bourbier,A Pöcegödör,Il Pozzo Nero,汚水層,불결한 장소,De zinkput,Søledammen,Szambo,A Fossa,,Haznaua,Сточный колодец,Септичка јама,Rännstenen,Lağım Çukuru -The Confluence,HHUSTR_E3M3,,,,Soutok,Sammenløbet,Die Vereinigung,,La Kunfluiĝo,La Confluencia,,Yhtymäkohta,La Confluence,A Kereszteződés,La Confluenza,合流点,합류점,De samenvloeiing,Sammenløpet,Spływ,A Confluência,,Confluența,Слияние,Ушће,Sammanflödet,Confluence -The Azure Fortress,HHUSTR_E3M4,,,,Azurová pevnost,Den azurblå fæstning,Die himmelblaue Festung,,La Lazurfortikaĵo,La Fortaleza de Azur,,Sininen linnoitus,La Fortresse d'Azur,Az Azúr Erőd,La Fortezza Azzurra,紺碧の要塞,청천의 요새,De azuurblauwe vesting,Den azurblå festningen,Lazurowa Forteca,A Fortaleza Azul,,Fortăreața de azur,Лазурная крепость,Азурна дврђава,Den azurblå fästningen,Azure Kalesi -The Ophidian Lair,HHUSTR_E3M5,,,,Hadí doupě,Ophidian Hulen,Das Schlangennest,,La Nestego de Ofidia,La Guarida Ofídica,,Käärmeiden pesä,Le Repaire des Ophidiens,Az Opfidiánok Fészke,L'antro degli Ophidian,オフィディアンの塒,오피디안의 소굴,Het slangennest,Ophidian-hulen,Gniazdo Węży,A Cova dos Ofídios,,Cuibul ofidienilor,Логово офидианов,Змијска јазбина,Den Ophidiska hålan,Ophidian İni -The Halls of Fear,HHUSTR_E3M6,,,,Chodby strachu,Frygtens haller,Die Hallen der Angst,,La Koridoroj de Timo,Los Salones del Miedo,,Pelon salit,Les Couloirs de la Peur,A Félelem Folyosói,Le Sale della Paura,恐怖の館,공포의 회관,De zalen van angst,Fryktens haller,Korytarze Strachu,Os Salões do Medo,,Sălile groazei,Залы страха,Дворана страха,Skräckens hallar,Korku Salonları -The Chasm,HHUSTR_E3M7,,,,Propast,Kløften,Der Abgrund,,La Fendego,El Abismo,,Rotko,Le Gouffre,A Szakadék,L'abisso,裂け目,깊은 골,De kloof,Kløften,Przepaść,O Abismo,,Prăpastia,Пропасть,Понор лаве,Klyftan,Uçurum -D'Sparil's Keep,HHUSTR_E3M8,,,,D'Sparilova pevnost,D'Sparils borg,D'Sparils Außenposten,,Ĉefturo de Desparilo,Guarida de D'Sparil,,D'Sparilin linna,Le Donjon de D'Sparil,D'Sparil Terme,La Dimora di D'Sparil,デ’スパリルの間,드'스파릴의 초소,D'Sparil's voorpost,D'Sparils borg,Baszta D'Sparila,Fortaleza de D'Sparil,,Palatul lui D'sparil,Крепость Д'Спарила,Д'Спарилова кула,D'Sparils borg,D'Sparil'in Kalesi -The Aquifer,HHUSTR_E3M9,,,,Zvodeň,Akvifer,Der Wasserspeicher,,La Akvigilo,El Acuífero,,Akviferi,L'Aquifère,A Víztorony,L'acquedotto,帯水層,대수층,Het water reservoir,Akviferen,Wodociąg,O Aquífero,,Galerii acvifere,Водоносный слой,Водоносник,Akvifer,Akifer -Catafalque,HHUSTR_E4M1,,,,Katafalk,Katafalken,Katafalk,,Katafalko,Catafalco,,Katafalkki,Le Catafalque,Ravatal,Catafalco,棺台,관대,Catafalk,Katafalken,Katafalk,Catafalco,,Catafalc,Катафалк,Одар,Katafalken,Katafalk -Blockhouse,HHUSTR_E4M2,,,,Tvrzka,Blokhuset,Blockhaus,,Blokhaŭso,Fortín,,Linnoitus,Le Fortin,Gerendaház,Blocco di Case,丸太小屋,특화점,Blokhuis,Blokkhuset,Blokhauz,O Forte,,Fort,Блокгауз,Бункер,Blockhuset,Blok ev -Ambulatory,HHUSTR_E4M3,,,,Ochoz,Ambulatory,Wandelgang,,Ĥorĉirkaŭirejo,Ambulatorio,,Kuorikäytävä,Le Déambulatoire,Kerengő,Ambulatorio,遊歩道,유보장,Kloostergang,Gangen,Krużganek,Ambulatório,,Clinică,Амбулатория,Амбуланта,Ambulerande,Ambulatuvar -Sepulcher,HHUSTR_E4M4,,,,Hrobka,Graven,Grabstätte,,Tombo,Sepulcro,,Hautakammio,Le Sépulcre,Síremlék,Sepolcro,埋葬所,매장소,Grafsteen,Graven,Grób,Sepulcro,,Sepulcru,Гробница,Гробница,Gravskålen,Mezar -Great Stair,HHUSTR_E4M5,,,,Velké schody,Den store trappe,Große Treppe,,Granda Ŝtuparo,Gran Escalera,,Suuret portaat,Le Grand Escalier,Nagy Lépcső,Grande Scala,大階段,특급 계단,Grote trap,Den store trappen,Wielka Gwiazda,Grande Escada,,Scara cea mare,Великая лестница,Велики степеник,Stora trappan,Büyük Merdiven -Halls of the Apostate,HHUSTR_E4M6,,,,Chodby odpadlictví,Apostaternes haller,Halle des Abtrünnigen,,Haloj de la Apostato,Salas de los Apóstatas,,Luopioiden salit,Les Halls de l'Apôtre,A Hitehagyott Csarnoka,Sale dell'Apostata,背教者の館,배교자의 회관,Zalen van de afvallige,De frafalnes haller,Korytarze Odszczepieńca,Os Salões dos Apóstatas,,Sălile apostatului,Залы отступников,Дворана апостола,Apostaternas salar,Mürted Salonları -Ramparts of Perdition,HHUSTR_E4M7,,,,Náspy zatracení,Fortabelsens ramper,Wälle der Verdammnis,,Muregoj de Pereo,Murallas de la Perdición,,Kadotuksen vallit,Les Remparts de la Perdition,A Kárhozat Támasza,Torrioni della Perdizione,破滅の塁壁,파멸의 성벽,Wallen van de verdoemenis,Fortapelsens voller,Wał Potępienia,Muralhas da Perdição,,Meterezele pierzaniei,Твердыни погибели,Бедем пропасти,Fördärvets ramper,Azap Surları -Shattered Bridge,HHUSTR_E4M8,,,,Rozbitý most,Den ødelagte bro,Zerstörte Brücke,,Frakasita Ponto,Puente Destrozado,,Särkynyt silta,Le Pont effondré,Az Összeomlott Híd,Ponte Distrutto,崩落の橋,붕괴된 다리,Verbrijzelde brug,Den knuste broen,Zniszczony Most,Ponte Despedaçada,,Podul dărâmat,Разрушенный мост,Поломљен мост,Förstörd bro,Parçalanmış Köprü -Mausoleum,HHUSTR_E4M9,,,,Mauzoleum,,,,Maŭzoleo,Mausoleo,,Mausoleumi,Le Mausolée,Mauzóleum,Mausoleo,霊廟,대영묘,,Mausoleet,Mauzoleum,Mausoléu,,Mausoleu,Мавзолей,Маузолеј,,Anıt Mezar -Ochre Cliffs,HHUSTR_E5M1,,,,Okrové útesy,Okkerklipper,Ockerfarbene Klippen,,Klifoj de Okro,Acantilados Ocres,,Okrajyrkänteet,Les Falaises Ochre,Okker Szakadékok,Colline Ocra,黄土絶壁,황토 산맥,Okerkliffen,Oker-klippene,Ochrowe Klify,Penhascos Ocres,,Stâncile de ocru,Охровые утёсы,Окер брда,Ockerfärgade klippor,Ochre Kayalıkları -Rapids,HHUSTR_E5M2,,,,Peřeje,Rapider,Stromschnellen,,Rapidfluoj,Rápidos,,Koski,Les Rapides,Zuhatagok,Rapide,奔流,여울,Stroomversnellingen,Strykene,Katarakty,Corredeiras,,Ape repezi,Стремнина,Брзак,Forsar,Akıntıları -Quay,HHUSTR_E5M3,,,,Nábřeží,Kaj,Kai,,Kajo,Muelle,,Satamalaituri,Le Quai,Rakpart,Banchina,岸壁,부두,Kade,Kai,Wir,Cais,,Chei,Причал,Пристаниште,Kajen,Rıhtım -Courtyard,HHUSTR_E5M4,,,,Nádvoří,Slotsgården,Schlosshof,,Korto,Patio,,Linnanpiha,La Cour,Pitvar,Cortile,中庭,안마당,Binnenplaats,Gårdsplass,Dziedziniec,Pátio,,Curte,Внутренний двор,Двориште,Gården,Avlu -Hydratyr,HHUSTR_E5M5,,,,Hydratýr,,,,Akvotjr,Hydratyr,,,L'Hydratyr,Hidratáló,,ヒュドラテュール,식수공급처,,,Hydratyr,Reservatório,,Hidratir,Гидротир,Канализација,Hydratyr,Hydratyr -Colonnade,HHUSTR_E5M6,,,,Kolonáda,Kolonnader,Kolonnaden,,Kolonaro,Columnata,,Pylväikkö,La Colonnade,Kolonnád,Colonnato,柱廊,열주의 길,Zuilengalerij,Kolonnade,Kolumnada,Colunata,,Colonadă,Колоннада,Колонада,Colonnade,Kolonat -Foetid Manse,HHUSTR_E5M7,,,,Smrdutá vila,Stinkende præstegård,Stinkendes Pfarrhaus,,Haladza Domego,Mansión Fétida,,Löyhkäävä kartano,Le Presbytère Fétide,Bűzös Parókia,Fetido Castello,悪臭の牧師館,역겨운 목사관,Stinkende pastorie,Stinkende prestegård,Cuchnąca Plebania,Mansão Fétida,,Conac Fetid,Зловонный особняк,Фетидна кућа,Foetid Manse,Foetid Manse -Field of Judgement,HHUSTR_E5M8,,,,Soudná pole,Dommervældet,Richtstätte,,Kampo de Juĝo,Campo de Juicio,,Tuomion kenttä,Les Champs du Jugement,Az Itélet Mezeje,Campo del Giudizio,審判之地,심판의 평야,Plaats van oordeelsvorming,Dømmekraftsområde,Pole Sądu,Campo de Julgamento,,Câmpul de Judecată,Поле высшего суда,Чистилиште,Domarplatsen,Yargı Alanı -Skein of D'sparil,HHUSTR_E5M9,,,,Hejno D'Sparilovo,D'sparils skein,DSparils Bau,,Fadenaro de D'Sparil,Madeja de D'Sparil,,D'Sparilin vyyhti,L'échevaux de D'Sparil,D'Sparil Káosza,Groviglio di D'Sparil,デ'スパリルの枷,드'스파릴의 타래,D'Sparil's gebouw,Garn av D'sparil,Motek D'Sparila,Meada de D'Sparil,,Jurubița lui D'Sparil,Путаница Д'Спарила,Реке Д'Спарила,D'sparils skein,D'sparil Çileği -,,Strife,,,,,,,,,,,,,,,,,,,,,,,,, -AREA 1: Sanctuary,TXT_STRIFE_MAP01,,,,ZÓNA 1: Svatyně,AREA 1: Fristedet,ZONE 1: Heiligtum,,AREO 1: Sanktejo,ÁREA 1: Santuario,,ALUE 1: Pyhäkkö,ZONE 1: Sanctuaire,1. Terület: Szentély,AREA 1: Santuario,エリア 1: 聖域,구역 1: 성소,Zone 1: Heiligdom,OMRÅDE 1: Helligdom,Strefa 1: Sanktuarium,Área 1: Santuário,,ZONA 1: Sanctuar,МЕСТНОСТЬ 1: Святилище,,OMRÅDE 1: Fristad,ALAN 1: Sığınak -AREA 2: Town,TXT_STRIFE_MAP02,,,,ZÓNA 2: Město,AREA 2: By,ZONE 2: Stadt,,AREO 2: Urbeto,ÁREA 2: Pueblo,,ALUE 2: Kylä,ZONE 2: Ville,2. Terület: Város,AREA 2: Città,"エリア 2: 町 +Circle of Death ",,,Level 11: Kruh smrti,Level 11: Ødelæggelsens cirkel!,Level 11: 'O' der Zerstörung!,Επίπεδο 11: Ο Κύκλος της Καταστροφής,Nivelo 11: Morta cirklo,Nivel 11: Círculo de la muerte,,Taso 11: Hävityksen 'O',NIVEAU 11: Le Cercle de la Mort!,,11. Pálya: A pusztulás köre,Livello 11: Il Cerchio della Morte,Level 11: 破滅の'O'!,레벨 11: 파괴의 고리,Level 11: 'O' van vernietiging!,Nivå 11: Ødeleggelsens 'O'!,Level 11: Krąg Śmierci,Fase 11: Círculo da Morte,Nível 11: Círculo da Morte,Nivelul 11: Cercul distrugerii,Уровень №11: Круг разрушения!,Level 11: Круг уништења,"Nivå 11: ""O"" av förstörelse!",Seviye 11: Yıkımın 'O'su! +Level 12: The Factory,HUSTR_12,,,,Level 12: Továrna,Level 12: Fabrikken,Level 12: Die Fabrik,Επίπεδο 12: To Εργοστάσιο,Nivelo 12: La fabriko,Nivel 12: La fábrica,,Taso 12: Tehdas,NIVEAU 12: L'Usine,,12. Pálya: A gyár,Livello 12: La Fabbrica,Level 12: 工場,레벨 12: 공장,Level 12: De fabriek,Nivå 12: Fabrikken,Level 12: Fabryka,Fase 12: A Fábrica,Nível 12: A Fábrica,Nivelul 12: Fabrica,Уровень №12: Фабрика,Level 12: Фабрика,Nivå 12: Fabriken,Seviye 12: Fabrika +Level 13: Downtown,HUSTR_13,,,,Level 13: Centrum,Level 13: Centrum,Level 13: Stadtzentrum,Επίπεδο 13: Κέντρο,Nivelo 13: Urbocentro,Nivel 13: Centro de la ciudad,,Taso 13: Keskikaupunki,NIVEAU 13: Centre-Ville,,13. Pálya: Belváros,Livello 13: Periferia,Level 13: 市内,레벨 13: 번화가,Level 13: De binnenstad,Nivå 13: Sentrum,Level 13: Śródmieście,Fase 13: Centro Urbano,Nível 13: Centro Urbano,Nivelul 13: Centru urban,Уровень №13: Центр города,Level 13: Центар града,Nivå 13: Centrum,Seviye 13: Şehir Merkezi +Level 14: The Inmost Dens,HUSTR_14,,,,Level 14: Nejhlubší doupata,Level 14: Den inderste hule,Level 14: Die innersten Bauten,Επίπεδο 14: Οι Ενδότερες Φωλιές,Nivelo 14: La Internaj Kavernoj,Nivel 14: Los Antros más Recónditos,,Taso 14: Sisimmät piilot,NIVEAU 14: Les Antres Profondes,,14. Pálya: A legmélyebb rejtekek,Livello 14: Gli Antri Profondi,Level 14: 最深巣窟,레벨 14: 깊숙한 동굴들,Level 14: De binnenste gebouwen,Nivå 14: De innerste huler,Level 14: Najgłębsze Nory,Fase 14: Os Antros Profundos,Nível 14: Os Antros Profundos,Nivelul 14: Cele mai intime bârloguri,Уровень №14: Глубочайшие логовища,Level 14: Најдубље јазбине,Nivå 14: Den innersta täkten,Seviye 14: En İçteki İnler +Level 15: Industrial Zone,HUSTR_15,,,,Level 15: Průmyslová zóna,Level 15: Industriområde,Level 15: Industriegebiet,Επίπεδο 15: Βιομηχανική Ζώνη,Nivelo 15: Industria Zono,Nivel 15: Zona Industrial,,Taso 15: Teollisuusalue,NIVEAU 15: Zone Industrielle,,15. Pálya: Ipari zóna,Livello 15: Zona Industriale,Level 15: 工業地帯,레벨 15: 공업 지대,Level 15: Industriegebied,Nivå 15: Industriområdet,Level 15: Strefa Przemysłowa,Fase 15: Zona Industrial,Nível 15: Zona Industrial,Nivelul 15: Zona industrială,Уровень №15: Промышленный район,Level 15: Индустријска зона,Nivå 15: Industriområde,Seviye 15: Sanayi Bölgesi +Level 16: Suburbs,HUSTR_16,,,,Level 16: Předměstí,Level 16: Forstæderne,Level 16: Vororte,Επίπεδο 16: Προάστια,Nivelo 16: Antaŭurboj,Nivel 16: Suburbios,,Taso 16: Lähiö,NIVEAU 16: Banlieue,,16. Pálya: Külváros,Livello 16: Sobborghi,Level 16: 郊外,레벨 16: 교외,Level 16: Buitenwijken,Nivå 16: Forstedene,Level 16: Przedmieścia,Fase 16: Subúrbios,Nível 16: Subúrbios,Nivelul 16: Suburbi,Уровень №16: Пригород,Level 16: Предграђе,Nivå 16: Förorter,Seviye 16: Banliyöler +Level 17: Tenements,HUSTR_17,,,,Level 17: Sídliště,Level 17: Lejligheder,Level 17: Wohnbezirk,Επίπεδο 17: Καταλύματα,Nivelo 17: Loĝejoj,Nivel 17: Viviendas,,Taso 17: Vuokratalot,NIVEAU 17: Immeubles,,17. Pálya: Bérházak,Livello 17: Possedimenti,Level 17: 安アパート,레벨 17: 공동주택,Level 17: Huurwoningen,Nivå 17: Leiegårder,Level 17: Kamienice,Fase 17: Habitações,Nível 17: Habitações,Nivelul 17: Proprietăți,Уровень №17: Владения,Level 17: Станови,Nivå 17: Hyreshus,Seviye 17: Kiralık Evler +Level 18: The Courtyard,HUSTR_18,,,,Level 18: Nádvoří,Level 18: Gårdspladsen,Level 18: Der Innenhof,Επίπεδο 18: Η Αυλή,Nivelo 18: La Korto,Nivel 18: El Patio,,Taso 18: Esipiha,NIVEAU 18: La Cour,,18. Pálya: Az udvar,Livello 18: Il Cortile,Level 18: 中庭,레벨 18: 중정,Level 18: De binnenplaats,Nivå 18: Gårdsplassen,Level 18: Dziedziniec,Fase 18: O Átrio,Nível 18: O Átrio,Nivelul 18: Curtea,Уровень №18: Внутренний двор,Level 18: Двориште,Nivå 18: Gården,Seviye 18: Avlu +Level 19: The Citadel,HUSTR_19,,,,Level 19: Citadela,Level 19: Citadellet,Level 19: Die Zizadelle,Επίπεδο 19: Το Κάστρο,Nivelo 19: La Citadelo,Nivel 19: La Ciudadela,,Taso 19: Linnoitus,NIVEAU 19: La Citadelle,,19. Pálya: Fellegvár,Livello 19: La Cittadella,Level 19: 要塞,레벨 19: 성채,Level 19: De citadel,Nivå 19: Citadellet,Level 19: Cytadela,Fase 19: A Cidadela,Nível 19: A Cidadela,Nivelul 19: Cetatea,Уровень №19: Цитадель,Level 19: Цитадела,Nivå 19: Citadellet,Seviye 19: Hisar +Level 20: Gotcha!,HUSTR_20,,,,Level 20: Mám tě!,,Level 20: Erwischt!,Επίπεδο 20: Σ'έπιασα!,Nivelo 20: Kaptis Vin!,Nivel 20: ¡Te pillé!,Nivel 20: ¡Te tengo!,Taso 20: Sainpas sinut!,NIVEAU 20: Je t'ai eu!,,20. Pálya: Megvagy!,Livello 20: Preso!,Level 20: 捉らえた!,레벨 20: 잡았다!,Level 20: Ik heb je!,Nivå 20: Fikk deg!,Level 20: Mam Cię!,Fase 20: Te Peguei!,Nível 20: Apanhei-te!,Nivelul 20: Te-am prins!,Уровень №20: Попался!,Level 20: Имају те!,Nivå 20: Gotcha!,Seviye 20: Yakaladım! +Level 21: Nirvana,HUSTR_21,,,,Level 21: Nirvána,,,Επίπεδο 21: Νιρβάνα,Nivelo 21: Nirvano,Nivel 21: Nirvana,,,NIVEAU 21: Nirvana,,21. Pálya: Nirvána,Livello 21: Nirvana,Level 21: 涅槃,레벨 21: 열반,,,,Fase 21: Nirvana,Nível 21: Nirvana,Nivelul 21: Nirvana,Уровень №21: Нирвана,Level 21: Нирвана,Nivå 21: Nirvana,Seviye 21: Nirvana +Level 22: The Catacombs,HUSTR_22,,,,Level 22: Katakomby,Level 22: Katakomberne,Level 22: Katakomben,Επίπεδο 22: Οι Κατακόμβες,Nivelo 22: La Katakombo,Nivel 22: Las Catacumbas,,Taso 22: Katakombit,NIVEAU 22: Les Catacombes,,22. Pálya: A katakombák,Livello 22: Le Catacombe,Level 22: 地下悪霊墓所,레벨 22: 지하 묘지,Level 22: De catacomben,Nivå 22: Katakombene,Level 22: Katakumby,Fase 22: As Catacumbas,Nível 22: Os Calabouços,Nivelul 22: Catacombe,Уровень №22: Катакомбы,Level 22: Катакомбе,Nivå 22: Katakomberna,Seviye 22: Yeraltı Mezarları +Level 23: Barrels O' Fun,HUSTR_23,,,,Level 23: Barely srandy,Level 23: Tønder af sjov,Level 23: Lustige Fässer,,Nivelo 23: Bareloj de Amuzo,Nivel 23: Barriles de Diversión,,Taso 23: Huvitynnyrit,NIVEAU 23: Une Tonne-eau de plaisir,,23. Pálya: Mókás hordók,Livello 23: Barili da Sballo,Level 23: 戯れのバレル,레벨 23: 신나는 폭발통들,Level 23: Grappige vaten,Nivå 23: Tønner med moro,Level 23: Beczki Śmiechu,Fase 23: Barris de Diversão,Nível 23: Barris de Diversão,Nivelul 23: Butoaiele veseliei,Уровень №23: Бочки веселья,Level 23: Бачве забаве,Nivå 23: Tunnor med kul,Seviye 23: Eğlence Fıçıları +Level 24: The Chasm,HUSTR_24,,,,Level 24: Rokle,Level 24: Kløften,Level 24: Die Kluft,Επίπεδο 24: Το Χάσμα,Nivelo 24: La Fendego,Nivel 24: El Desfiladero,,Taso 24: Rotko,NIVEAU 24: Le Gouffre,,24. Pálya: A szakadék,Livello 24: L'Abisso,Level 24: 裂け目,레벨 24: 협곡,Level 24: De afgrond,Nivå 24: Avgrunnen,Level 24: Przepaść,Fase 24: O Abismo,Nível 24: O Abismo,Nivelul 24: Hăul,Уровень №24: Пропасть,Level 24: Провалија,Nivå 24: Klyftan,Seviye 24: Uçurum +Level 25: Bloodfalls,HUSTR_25,,,,Level 25: Krvopády,Level 25: Blodfald,Level 25: Blutfälle,Επίπεδο 25: Καταρράκτες Αίματος,Nivelo 25: Sangfaloj,Nivel 25: Cataratas de Sangre,,Taso 25: Veriputoukset,NIVEAU 25: Chutes de Sang,,25. Pálya: Véresések,Livello 25: Cascate di Sangue,Level 25: 血の滝,레벨 25: 혈폭포,Level 25: Bloeddruppels,Nivå 25: Blodfall,Level 25: Wodospad Krwi,Fase 25: Cataratas de Sangue,Nível 25: Cascatas de Sangue,Nivelul 25: Cascade de sânge,Уровень №25: Кровопады,Level 25: Крвопади,Nivå 25: Blodfall,Seviye 25: Kan Düşüşleri +Level 26: The Abandoned Mines,HUSTR_26,,,,Level 26: Opuštěné doly,Level 26: De forladte miner,Level 26: Die aufgegebene Mine,Επίπεδο 26: Τα Εγκαταλελειμμένα Ορυχεία,Nivelo 26: La Forlasitaj Minoj,Nivel 26: Las Minas Abandonadas,,Taso 26: Hylätyt kaivokset,NIVEAU 26: Les Mines Abandonnées,,26. Pálya: Az elhagyatott bányák,Livello 26: Le Miniere Abbandonate,Level 26: 廃鉱山,레벨 26: 버려진 광산,Level 26: De verlaten mijnen,Nivå 26: De forlatte gruvene,Level 26: Opuszczone Kopalnie,Fase 26: As Minas Abandonadas,Nível 26: As Minas Abandonadas,Nivelul 26: Minele părăsite,Уровень №26: Заброшенные шахты,Level 26: Напуштени рудници,Nivå 26: De övergivna gruvorna,Seviye 26: Terk Edilmiş Madenler +Level 27: Monster Condo,HUSTR_27,,,,Level 27: Netvoří dům,,Level 27: Monsterbehausung,,Nivelo 27: Monstro-Domo,Nivel 27: Condominio de Monstruos,,Taso 27: Hirviöasuntola,NIVEAU 27: Monstrueuse Résidence,,27. Pálya: A szörnyek háza,Livello 27: Casa dei Mostri,Level 27: モンスターマンション,레벨 27: 괴물 콘도,,Nivå 27: Monsterleiligheten,Level 27: Apartament Potworów,Fase 27: Mansão dos Monstros,Nível 27: Condomínio Monstruoso,Nivelul 27: Casa monștrilor,Уровень №27: Жилище монстров,Level 27: Боравишта монструма,Nivå 27: Monster Condo,Seviye 27: Canavar Dairesi +Level 28: The Spirit World,HUSTR_28,,,,Level 28: Onen svět,Level 28: Åndeverdenen,Level 28: Die Geisterwelt,Επίπεδο 28: Ο Κόσμος των Πνευμάτων,Nivelo 28: La Animo-Mondo,Nivel 28: El Mundo Espiritual,,Taso 28: Henkimaailma,NIVEAU 28: Le Monde Spirituel,,28. Pálya: A lelkek világa,Livello 28: Il Mondo dello Spirito,Level 28: 悪霊の世界,레벨 28: 영령의 세계,Level 28: De geestenwereld,Nivå 28: Åndeverdenen,Level 28: Świat Dusz,Fase 28: O Mundo Espiritual,Nível 28: O Mundo Espiritual,Nivelul 28: Lumea duhurilor,Уровень №28: Мир духов,Level 28: Духовни свет,Nivå 28: Den andliga världen,Seviye 28: Ruhlar Dünyası +Level 29: The Living End,HUSTR_29,,,,Level 29: Živoucí konec,Level 29: Den levende ende,Level 29: Das lebende Ende,Επίπεδο 29: Το Ζωντανό Τέλος,Nivelo 29: La Viva Fino,Nivel 29: El Final Viviente,,Taso 29: Elävä loppu,NIVEAU 29: La Limite,,29. Pálya: Az élő Végzet,Livello 29: La Fine Imminente,Level 29: 極限の存在,레벨 29: 최종점,Level 29: Het levende einde,Nivå 29: Den levende enden,Level 29: Żywy Koniec,Fase 29: O Cúmulo da Existência,Nível 29: O Cúmulo da Existência,Nivelul 29: Sfârșitul întregii vieți,Уровень №29: Конец всего живого,Level 29: Крај живота,Nivå 29: Det levande slutet,Seviye 29: Yaşamın Sonu +Level 30: Icon of Sin,HUSTR_30,,,,Level 30: Ikona hříchu,Level 30: Syndens ikon,Level 30: Symbol der Sünde,Επίπεδο 30: Σύμβολο της Αμαρτίας,Nivelo 30: Ikono de Peko,Nivel 30: Icono del pecado,Nivel 30: Ícono del pecado,Taso 30: Synnin ikoni,NIVEAU 30: L'Icône du Péché,,30. Pálya: A megtestesült bűn,Livello 30: Icona del Peccato,Level 30: 罪の聖像,레벨 30: 죄악의 상징,Level 30: Pictogram van de zonde,Nivå 30: Syndens ikon,Level 30: Ikona Grzechu,Fase 30: Ícone do Pecado,Nível 30: Ícone do Pecado,Nivelul 30: Icoana păcatelor,Уровень №30: Икона греха,Level 30: Икона греха,Nivå 30: Syndens ikon,Seviye 30: Günah Simgesi +Level 31: Wolfenstein,HUSTR_31,,,,,,,,Nivelo 31: Wolfenstein,Nivel 31: Wolfenstein,,,,,31. Pálya: Wolfenstein,Livello 31: Wolfenstein,Level 31: ウルフェンシュタイン,레벨 31: 울펜슈타인,,,,Fase 31: Wolfenstein,Nível 31: Wolfenstein,Nivelul 31: Wolfenstein,Уровень №31: Вольфенштайн,Level 31: Волфенштајн,Nivå 31: Wolfenstein,Seviye 31: Wolfenstein +Level 32: Grosse,HUSTR_32,,,,,,,,Nivelo 32: Grosse,Nivel 32: Grosse,,,,,32. Pálya: Grosse,Livello 32: Grosse,Level 32: グローシュ,레벨 32: 그로세,,,,Fase 32: Grosse,Nível 32: Grosse,Nivelul 32: Grosse,Уровень №32: Гросс,Level 32: Гроссе,Nivå 32: Grosse,Seviye 32: Grosse +Level 31: IDKFA,HUSTR_31B,,,,,,,,Nivelo 31: IDKFA,Nivel 31: IDKFA,,,NIVEAU 31: IDKFQ,,31. Pálya: IDKFA,Livello 31: IDKFA,Level 31: IDKFA,레벨 31: IDKFA,,,,Fase 31: IDKFA,Nível 31: IDKFA,Nivelul 31: IDKFA,Уровень №31: IDKFA,,Nivå 31: IDKFA,Seviye 31: IDKFA +Level 32: Keen,HUSTR_32B,,,,,,,,Nivelo 32: Keen,Nivel 32: Keen,,,,,32. Pálya: Keen,Livello 32: Keen,Level 32: キーン,레벨 32: 킨,,,,Fase 32: Keen,Nível 32: Keen,Nivelul 32: Keen,Уровень №32: Кин,Level 32: Кин,Nivå 32: Keen,Seviye 32: Keen +Level 33: Betray,HUSTR_33,,,,Level 33: Zraď,Level 33: Forræderi,Level 33: Verrat,,Nivelo 33: Perfido,Nivel 33: Traición,,Taso 33: Petä,NIVEAU 33: Trahison,,33. Pálya: Árulás,Livello 33: Tradimento ,Level 33: 裏切り,레벨 33: 배반,Level 33: Verraad,Nivå 33: Forråde,Level 33: Zdrada,Fase 33: Traição,Nível 33: Traição,Nivelul 33: Trădare,Уровень №33: Предай,Level 33: Издаја,Nivå 33: Förråda,Seviye 33: İhanet +,,No Rest For The Living,,,,,,,,,,,,,,,,,,,,,,,,,, +Level 1: The Earth Base,NHUSTR_1,,,,Level 1: Pozemská základna,Level 1: Jordbasen,Level 1: Die Erd-Basis,,Nivelo 1: La Tera Bazo,Nivel 1: La Base Terrestre,,Taso 1: Maatukikohta,NIVEAU 1: La Base Terrienne,,1. Pálya: A földi bázis,Livello 1: La Base Terrestre ,Level 1: 地球基地,레벨 1: 지구 기지,Level 1: De basis van de aarde,Nivå 1: Jordbasen,Level 1: Ziemska Baza,Fase 1: A Base Terrestre,Nível 1: A Base Terrestre,Nivelul 1: Baza terestră,Уровень №1: База на Земле,Level 1: Земаљска база,Nivå 1: Jordbasen,Seviye 1: Dünya Üssü +Level 2: The Pain Labs,NHUSTR_2,,,,Level 2: Laboratoře bolesti,Level 2: Smerte laboratorier,Level 2: Die Folterlabore,,Nivelo 2: La Doloro-Laboratorio,Nivel 2: Los Laboratorios del Dolor,,Taso 2: Tuskalaboratoriot,NIVEAU 2: Les Laboratoires de la Douleur,,2. Pálya: A kínok laboratóriuma,Livello 2: I Laboratori del Dolore,Level 2: 生物工学実験室,레벨 2: 고통의 연구소,Level 2: De pijnlaboratoria,Nivå 2: Smertelaboratoriet,Level 2: Laboratoria Bólu,Fase 2: Os Laboratórios da Dor,Nível 2: Os Laboratórios da Dor,Nivelul 2: Laboratoarele durerii,Уровень №2: Лаборатории боли,Level 2: Лабораторије патње,Nivå 2: Smärtlaboratorierna,Seviye 2: Ağrı Laboratuvarları +Level 3: Canyon of The Dead,NHUSTR_3,,,,Level 3: Kaňon mrtvých,Level 3: De dødes kløft,Level 3: Schlucht der Toten,,Nivelo 3: Kanjono de La Mortintoj,Nivel 3: Cañón de los Muertos,,Taso 3: Kalmankanjoni,NIVEAU 3: Canyon des Morts,,3. Pálya: A holtak szurdoka,Livello 3: Il Canyon dei Morti,Level 3: 死の渓谷,레벨 3: 죽음의 계곡,Level 3: Canyon van de doden,Nivå 3: De dødes kløft,Level 3: Kanion Umarłych,Fase 3: Desfiladeiro dos Mortos,Nível 3: Desfiladeiro dos Mortos,Nivelul 3: Canionul morților,Уровень №3: Каньон мертвецов,Level 3: Кањон мртваца,Nivå 3: De dödas kanjon,Seviye 3: Ölüler Kanyonu +Level 4: Hell Mountain,NHUSTR_4,,,,Level 4: Pekelná hora,Level 4: Helvede bjerg,Level 4: Höllenberg,,Nivelo 4: Monto de Infero,Nivel 4: Montaña Infernal,,Taso 4: Hornanvuori,NIVEAU 4: Montagne Infernale,,4. Pálya: Pokol-hegy,Livello 4: Montagna Infernale ,Level 4: 地獄山脈,레벨 4: 지옥의 산,Level 4: Helleberg,Nivå 4: Helvetesfjellet,Level 4: Piekielna Góra,Fase 4: Montanha Infernal,Nível 4: Montanha Infernal,Nivelul 4: Muntele infernal,Уровень №4: Адская гора,Level 4: Планина пакла,Nivå 4: Helvetesberget,Seviye 4: Cehennem Dağı +Level 5: Vivisection,NHUSTR_5,,,,Level 5: Vivisekce,Level 5: Vivisektion,Level 5: Vivisektion,,Nivelo 5: Vivisekcio,Nivel 5: Vivisección,,Taso 5: Vivisektio,NIVEAU 5: Vivisection,,5. Pálya: Élveboncolás,Livello 5: Vivisezione ,Level 5: 生体解剖,레벨 5: 생체 해부,Level 5: Vivisectie,Nivå 5: Viviseksjon,Level 5: Wiwisekcja,Fase 5: Vivissecção,Nível 5: Vivissecção,Nivelul 5: Vivisecție,Уровень №5: Вивисекция,Level 5: Вивисекција,Nivå 5: Vivisektion,Seviye 5: Canlı Kesim +Level 6: Inferno of Blood,NHUSTR_6,,,,Level 6: Krvavé inferno,Level 6: Blodets inferno,Level 6: Blutiges Inferno,,Nivelo 6: Brulego de Sango,Nivel 6: Hoguera de Sangre,,Taso 6: Veri-inferno,NIVEAU 6: Enfer Sanglant,,6. Pálya: Véres alvilág,Livello 6: Inferno di Sangue ,Level 6: 血のインフェルノ,레벨 6: 연옥의 피,Level 6: Bloederige inferno,Nivå 6: Blodets inferno,Level 6: Piekło Krwi,Fase 6: Inferno de Sangue,Nível 6: Inferno de Sangue,Nivelul 6: Infern sângeriu,Уровень №6: Кровавая преисподняя,Level 6: Ватре крви,Nivå 6: Blodets inferno,Seviye 6: Kan Cehennemi +Level 7: Baron's Banquet,NHUSTR_7,,,,Level 7: Baronova hostina,Level 7: Baron's Banquet,Level 7: Das Bankett des Barons,,Nivelo 7: Festeno de Barono,Nivel 7: Banquete del Barón,,Taso 7: Paronin pidot,NIVEAU 7: Banquet du Baron,,7. Pálya: A báró bankettje,Livello 7: Il Banchetto del Barone ,Level 7: バロンの晩餐,레벨 7: 남작의 연회,Level 7: Baron's banket,Nivå 7: Baronens bankett,Level 7: Bankiet Barona,Fase 7: Banquete do Barão,Nível 7: Banquete do Barão,Nivelul 7: Banchetul baronilor,Уровень №7: Банкет у барона,Level 7: Баронова Гозба,Nivå 7: Baronens bankett,Seviye 7: Baron'un Ziyafeti +Level 8: Tomb of Malevolence,NHUSTR_8,,,,Level 8: Hrobka zlovolnosti,Level 8: Ondskabens grav,Level 8: Feindselige Gruft,,Nivelo 8: Tombo de Malbonvolo,Nivel 8: Tumba de Malevolencia,,Taso 8: Pahantahdon hauta,NIVEAU 8: Tombe Maléfique,,8. Pálya: A Gátlástalanság sírja,Livello 8: Tomba della Malevolenza,Level 8: 悪意の墓,레벨 8: 증오의 무덤,Level 8: Graf van kwaadwilligheid,Nivå 8: Ondskapens grav,Level 8: Grobowiec Zła,Fase 8: Tumba da Malevolência,Nível 8: Túmulo da Malevolência,Nivelul 8: Mormântul răutății,Уровень №8: Гробница злобы,Level 8: Гроб злобе,Nivå 8: Ondskans grav,Seviye 8: Kötülük Mezarı +Level 9: March of The Demons,NHUSTR_9,,,,Level 9: Pochod démonů,Level 9: Dæmonernes march,Level 9: Marsch der Dämonen,,Nivelo 9: Marŝo de La Demonoj,Nivel 9: Marcha de los Demonios,,Taso 9: Demonien marssi,NIVEAU 9: Marche des Démons,,9. Pálya: A démonok parádéja,Livello 9: La Marcia dei Demoni ,Level 9: デーモンの行進,레벨 9: 악마들의 행진,Level 9: Maart van de demonen,Nivå 9: Demonenes marsj,Level 9: Marsz Demonów,Fase 9: Marcha dos Demônios,Nível 9: Marcha dos Demônios,Nivelul 9: Marșul demonilor,Уровень №9: Шествие демонов,Level 9: Марш демона,Nivå 9: Demonernas marsch,Seviye 9: Şeytanların Yürüyüşü +,,Plutonia,,,,,,,,,,,,,,,,,,,,,,,,,, +Level 1: Congo,PHUSTR_1,,,,Level 1: Kongo,,Level 1: Kongo,,Nivelo 1: Kongo,Nivel 1: Congo,,Taso 1: Kongo,NIVEAU 1: Congo,,1. Pálya: Kongó,Livello 1: Congo,Level 1: コンゴ川,레벨 1: 콩고,Level 1: Kongo,Nivå 1: Kongo,Level 1: Kongo,Fase 1: Congo,Nível 1: Congo,Nivelul 1: Congo,Уровень №1: Конго,Level 1: Конго,Nivå 1: Kongo,Seviye 1: Kongo +Level 2: Well of Souls,PHUSTR_2,,,,Level 2: Studna duší,Level 2: Sjælebrønden,Level 2: Seelenbrunnen,,Nivelo 2: Puto de animoj,Nivel 2: Pozo de almas,,Taso 2: Sielujen lähde,NIVEAU 2: Puits des Ames,,2. Pálya: A lelkek kútja,Livello 2: Pozzo delle Anime,Level 2: 魂の井戸,레벨 2: 영혼의 우물,Level 2: Bron van zielen,Nivå 2: Sjelenes brønn,Level 2: Studnia Dusz,Fase 2: Poço das Almas,Nível 2: Poço de Almas,Nivelul 2: Fântâna sufletelor,Уровень №2: Колодец душ,Level 2: Бунар душа,Nivå 2: Själarnas brunn,Seviye 2: Ruhlar Kuyusu +Level 3: Aztec,PHUSTR_3,,,,Level 3: Azték,Level 3: Azteker,Level 3: Aztekisch,,Nivelo 3: Azteko,Nivel 3: Azteca,,Taso 3: Asteekki,NIVEAU 3: Aztèque,,3. Pálya: Azték,Livello 3: Aztec,Level 3: アステカ,레벨 3: 아즈텍,Level 3: Azteken,Nivå 3: Aztekisk,Level 3: Aztek,Fase 3: Asteca,Nível 3: Asteca,Nivelul 3: Aztec,Уровень №3: Ацтек,Level 3: Астек,Nivå 3: Azteker,Seviye 3: Aztek +Level 4: Caged,PHUSTR_4,,,,Level 4: V kleci,Level 4: Låst op,Level 4: Eingesperrt,,Nivelo 4: Enkaĝigita,Nivel 4: Enjaulado,,Taso 4: Häkissä,NIVEAU 4: Enfermé,,4. Pálya: Ketrecbe zárva,Livello 4: Ingabbiato,Level 4: 檻の中,레벨 4: 갇히다,Level 4: Gekooid,Nivå 4: Buret,Level 4: W Klatce,Fase 4: Na Jaula,Nível 4: Na Jaula,Nivelul 4: Încarcerat,Уровень №4: В клетке,Level 4: Заробљен,Nivå 4: Burad,Seviye 4: Kafesli +Level 5: Ghost Town,PHUSTR_5,,,,Level 5: Město duchů,Level 5: Spøgelsesby,Level 5: Geisterstadt,,Nivelo 5: Fantoma urbeto,Nivel 5: Pueblo Fantasma,,Taso 5: Aavekaupunki,NIVEAU 5: Ville Fantôme,,5. Pálya: Szellemváros,Livello 5: Città Fantasma,Level 5: ゴーストタウン,레벨 5: 유령 도시,Level 5: Spookstad,Nivå 5: Spøkelsesbyen,Level 5: Miasto Duchów,Fase 5: Cidade Fantasma,Nível 5: Cidade Fantasma,Nivelul 5: Orașul fantomă,Уровень №5: Город-призрак,Level 5: Град духова,Nivå 5: Spökstad,Seviye 5: Hayalet Kasaba +Level 6: Baron's Lair,PHUSTR_6,,,,Level 6: Baronovo doupě,Level 6: Baronens hule,Level 6: Lager des Barons,,Nivelo 6: Kaŝejo de Barono,Nivel 6: Guarida del Barón,,Taso 6: Paronin luola,NIVEAU 6: Repaire du Baron,,6. Pálya: A báró rejteke,Livello 6: Tana del Barone,Level 6: バロンの隠れ家,레벨 6: 남작의 은신처,Level 6: Baron's kamp,Nivå 6: Baronens hule,Level 6: Legowisko Barona,Fase 6: Covil do Barão,Nível 6: Covil do Barão,Nivelul 6: Claustrul Baronului,Уровень №6: Обитель барона,Level 6: Баронова јазбина,Nivå 6: Baronens lya,Seviye 6: Baron'un İni +Level 7: Caughtyard,PHUSTR_7,,,,Level 7: Karcer,,Level 7: Gehege,,Nivelo 7: Kaptkorto,Nivel 7: Campo de Concentración,,Taso 7: Posenpiha,NIVEAU 7: Pris de court,,7. Pálya: A foglyok udvara,Livello 7: Cortile Prigione,Level 7: 囚われの庭,레벨 7: 포획마당,Level 7: Omheining,Nivå 7: Fangegården,Level 7: Dziedziniec Więzienny,Fase 7: Campo de Concentração,Nível 7: Campo de Concentração,Nivelul 7: Capcana curții,Уровень №7: Ловчий двор,Level 7: Замчиште,Nivå 7: Fångården,Seviye 7: Caughtyard +Level 8: Realm,PHUSTR_8,,,,Level 8: Říše,Level 8: Rige,Level 8: Bereich,,Nivelo 8: Regno,Nivel 8: Reino,,Taso 8: Valtapiiri,NIVEAU 8: Royaume,,8. Pálya: Uradalom,Livello 8: Regno,Level 8: 領地,레벨 8: 왕국,Level 8: Rijk,Nivå 8: Riket,Level 8: Królestwo,Fase 8: Reino,Nível 8: Reino,Nivelul 8: Tărâm,Уровень №8: Царство,Level 8: Царство,Nivå 8: Riket,Seviye 8: Diyar +Level 9: Abattoire,PHUSTR_9,,,,Level 9: Jatka,,Level 9: Schlachthaus,,Nivelo 9: Buĉejo,Nivel 9: Matadero,,Taso 9: Teurastamo,NIVEAU 9: Abattoir,,9. Pálya: Vágóhíd,Livello 9: Mattatoio,Level 9: 屠殺場,레벨 9: 도축장,Level 9: Abattoir,Nivå 9: Slakteriet,Level 9: Rzeźnia,Fase 9: Matadouro,Nível 9: Matadouro,Nivelul 9: Abator,Уровень №9: Абатство,Level 9: Кланица,Nivå 9: Slakthus,Seviye 9: Abattoire +Level 10: Onslaught,PHUSTR_10,,,,Level 10: Nájezd,Level 10: Stormløb,Level 10: Angriff,,Nivelo 10: Buĉado,Nivel 10: Arremetida,,Taso 10: Ryntäys,NIVEAU 10: Assaut,,10. Pálya: Roham,Livello 10: Assalto,Level 10: 猛襲,레벨 10: 맹공격,Level 10: Aanval,Nivå 10: Angrep,Level 10: Szturm,Fase 10: Investida,Nível 10: Investida,Nivelul 10: Năvala,Уровень №10: Натиск,Level 10: Јуриш,Nivå 10: Angrepp,Seviye 10: Saldırı +Level 11: Hunted,PHUSTR_11,,,,Level 11: Loven,Level 11: Jaget,Level 11: Gehetzt,,Nivelo 11: Ĉasata,Nivel 11: Cazado,,Taso 11: Metsästetty,NIVEAU 11: Traque,,11. Pálya: Űzött vad,Livello 11: Braccato,Level 11: 逃走,레벨 11: 사냥당함,Level 11: Gejaagd,Nivå 11: Jaget,Level 11: Nawiedzony,Fase 11: Perseguição,Nível 11: Perseguição,Nivelul 11: Vânătoarea,Уровень №11: Преследуемый,Level 11: Уловљен,Nivå 11: Jaktad,Seviye 11: Avlanmış +Level 12: Speed,PHUSTR_12,,,,Level 12: Rychlost,Level 12: Fart,Level 12: Tempo,,Nivelo 12: Rapido,Nivel 12: Velocidad,,Taso 12: Vauhti,NIVEAU 12: Vitesse,,12. Pálya: Iram,Livello 12: Velocità,Level 12: スピード,레벨 12: 스피드,Level 12: Haast,Nivå 12: Hastighet,Level 12: Pęd,Fase 12: Velocidade,Nível 12: Velocidade,Nivelul 12: Viteză,Уровень №12: Скорость,Level 12: Брзина,Nivå 12: Hastighet,Seviye 12: Hız +Level 13: The Crypt,PHUSTR_13,,,,Level 13: Krypta,Level 13: Krypten,Level 13: Die Gruft,,Nivelo 13: La kripto,Nivel 13: La cripta,,Taso 13: Krypta,NIVEAU 13: La Crypte,,13. Pálya: A kripta,Livello 13: La Cripta,Level 13: 地下聖堂,레벨 13: 봉안당,Level 13: De crypte,Nivå 13: Krypten,Level 13: Krypta,Fase 13: A Cripta,Nível 13: A Cripta,Nivelul 13: Cripta,Уровень №13: Склеп,Level 13: Гробница,Nivå 13: Kryptan,Seviye 13: Mahzen +Level 14: Genesis,PHUSTR_14,,,,,,,,Nivelo 14: Genezo,Nivel 14: Génesis,,Taso 14: Luominen,NIVEAU 14: Genèse,,14. Pálya: Teremtés,Livello 14: Genesi,Level 14: 創世記,레벨 14: 창세기,,,Level 14: Geneza,Fase 14: Gênese,Nível 14: Gênese,Nivelul 14: Geneza,Уровень №14: Зарождение,Level 14: Постанак,Nivå 14: Genesis,Seviye 14: Yaratılış +Level 15: The Twilight,PHUSTR_15,,,,Level 15: Soumrak,Level 15: Tusmørket,Level 15: Zwielicht,,Nivelo 15: La krepusko,Nivel 15: El ocaso,,Taso 15: Hämärä,NIVEAU 15: Le Crépuscule,,15. Pálya: Alkonyat,Livello 15: Il Crepuscolo,Level 15: 黄昏,레벨 15: 황혼,Level 15: De schemering,Nivå 15: Skumringen,Level 15: Zmierzch,Fase 15: O Crepúsculo,Nível 15: O Crepúsculo,Nivelul 15: Amurgul,Уровень №15: Сумерки,Level 15: Сумрак,Nivå 15: Skymningen,Seviye 15: Alacakaranlık +Level 16: The Omen,PHUSTR_16,,,,Level 16: Znamení,Level 16: Omenet,Level 16: Das Omen,,Nivelo 16: La Aŭguro,Nivel 16: El Presagio,,Taso 16: Enne,NIVEAU 16: Le Présage,,16. Pálya: Az Ómen,Livello 16: Il Presagio,Level 16: 予兆,레벨 16: 징조,Level 16: De omen,Nivå 16: Varselet,Level 16: Omen,Fase 16: O Presságio,Nível 16: O Presságio,Nivelul 16: Prevestirea,Уровень №16: Предзнаменование,Level 16: Знамење,Nivå 16: Omen,Seviye 16: Omen +Level 17: Compound,PHUSTR_17,,,,Level 17: Ústav,Level 17: Forbindelsen,Level 17: Anlage,,Nivelo 17: Konstruaĵaro,Nivel 17: Complejo,,Taso 17: Laitos,NIVEAU 17: Installation,,17. Pálya: Létesítmény,Livello 17: Recinto,Level 17: 調合,레벨 17: 복합체,Level 17: Faciliteit,Nivå 17: Forbindelsen,Level 17: Mieszanka,Fase 17: Complexo,Nível 17: Complexo,Nivelul 17: Complexul,Уровень №17: Комплекс,Level 17: Једињење,Nivå 17: Förbandet,Seviye 17: Bileşik +Level 18: Neurosphere,PHUSTR_18,,,,Level 18: Neurosféra,Level 18: Neurosfæren,Level 18: Neurosphäre,,Nivelo 18: Neŭrosfero,Nivel 18: Neuroesfera,,Taso 18: Neurosfääri,NIVEAU 18: Neurosphère,,18. Pálya: Neuroszféra,Livello 18: Neurosfera,Level 18: ニューロスフィア,레벨 18: 뉴로스피어,Level 18: Neurosferen,Nivå 18: Nevrosfæren,Level 18: Neurosfera,Fase 18: Neurosfera,Nível 18: Neurosfera,Nivelul 18: Neurosferă,Уровень №18: Нейросфера,Level 18: Неуросфера,Nivå 18: Neurosfären,Seviye 18: Nörosfer +Level 19: NME,PHUSTR_19,"“NME” read out loud means “enemy”, so translators should consider the translation of “enemy” into their language.",,,Level 19: Nepřítel,,,,Nivelo 19: Mal-BN,Nivel 19: N-MIGO,,Taso 19: VHLLNN,NIVEAU 19: NMI,,19. Pálya: LNSG,Livello 19: NMIC,Level 19: 野郎,레벨 19: NOM,,,Level 19: WRG,Fase 19: N-MIGO,Nível 19: N-MIGO,Nivelul 19: INMIC,Уровень №19: В.Р.А.Г.,Level 19: Н.Е.П.Р.,Nivå 19: FiND,Seviye 19: NME +Level 20: The Death Domain,PHUSTR_20,,,,Level 20: Panství smrti,Level 20: Dødsdomænet,Level 20: Die Todeszone,,Nivelo 20: La morta regno,Nivel 20: El Dominio Mortal,,Taso 20: Kuoleman piiri,NIVEAU 20: Le Domaine de la Mort,,20. Pálya: A holtak birtoka,Livello 20: Il Dominio della Morte,Level 20: 死の領域,레벨 20: 죽음의 영역,Level 20: Het domein van de dood,Nivå 20: Dødens domene,Level 20: Domena Śmierci,Fase 20: O Domínio da Morte,Nível 20: O Domínio da Morte,Nivelul 20: Domeniul morții,Уровень №20: Владения смерти,Level 20: Подручије смрти,Nivå 20: Dödsdomänen,Seviye 20: Ölüm Alanı +Level 21: Slayer,PHUSTR_21,,,,Level 21: Zabiják,Level 21: Slagter,Level 21: Töter,,Nivelo 21: Mortigisto,Nivel 21: Descuatizador,,Taso 21: Tappaja,NIVEAU 21: Pourfendeur,,21. Pálya: Halálosztó,Livello 21: Assassino,Level 21: スレイヤー,레벨 21: 슬레이어,Level 21: Doder,Nivå 21: Slakteren,Level 21: Pogromca,Fase 21: Matador,Nível 21: Matador,Nivelul 21: Ucigător,Уровень №21: Истребитель,Level 21: Убица,Nivå 21: Jägare,Seviye 21: Avcı +Level 22: Impossible Mission,PHUSTR_22,,,,Level 22: Nemožná mise,Level 22: Umulig mission,Level 22: Unmögliche Mission,,Nivelo 22: Neebla tasko,Nivel 22: Misión imposible,,Taso 22: Mahdoton tehtävä,NIVEAU 22: Mission Impossible,,22. Pálya: Lehetetlen küldetés,Livello 22: Missione Impossibile,Level 22: 不可能な任務,레벨 22: 임파서블 미션,Level 22: Onmogelijke missie,Nivå 22: Umulig oppdrag,Level 22: Niemożliwa Misja,Fase 22: Missão Impossível,Nível 22: Missão Impossível,Nivelul 22: Misiune imposibilă,Уровень №22: Невыполнимое задание,Level 22: Немогућа мисија,Nivå 22: Omöjligt uppdrag,Seviye 22: İmkansız Görev +Level 23: Tombstone,PHUSTR_23,,,,Level 23: Náhrobek,Level 23: Gravsten,Level 23: Grabstein,,Nivelo 23: Tombŝtono,Nivel 23: Lápida,,Taso 23: Hautakivi,NIVEAU 23: Pierre Tombale,,23. Pálya: Sírkő,Livello 23: Pietra Tombale,Level 23: 墓石,레벨 23: 묘비,Level 23: Grafsteen,Nivå 23: Gravstein,Level 23: Nagrobek,Fase 23: Lápide,Nível 23: Lápide,Nivelul 23: Piatra de mormânt,Уровень №23: Надгробие,Level 23: Надгробни споменик,Nivå 23: Gravsten,Seviye 23: Mezar Taşı +Level 24: The Final Frontier,PHUSTR_24,,,,Level 24: Poslední hranice,Level 24: Den endelige grænse,Level 24: Die letzte Grenze,,Nivelo 24: La Fina Limo,Nivel 24: La Frontera Final,Nivel 24: La Última Frontera,Taso 24: Viimeinen rajamaa,NIVEAU 24: La Frontière Finale,,24. Pálya: A végső határ,Livello 24: La Frontiera Finale,Level 24: 最後のフロンティア,레벨 24: 최후의 개척지,Level 24: De eindgrens,Nivå 24: Den siste grensen,Level 24: Ostateczna Granica,Fase 24: A Fronteira Final,Nível 24: A Fronteira Final,Nivelul 24: Ultima frontieră,Уровень №24: Последний рубеж,Level 24: Коначна граница,Nivå 24: Den sista gränsen,Seviye 24: Son Sınır +Level 25: The Temple of Darkness,PHUSTR_25,,,,Level 25: Chrám temna,Level 25: Mørkets tempel,Level 25: Der Tempel der Dunkelheit,,Nivelo 25: La Idolejo de Mallumo,Nivel 25: El Templo de la Oscuridad,,Taso 25: Pimeyden temppeli,NIVEAU 25: Le Temple des Ténèbres,,25. Pálya: A sötétség temploma,Livello 25: Il Tempio dell'Oscurità,Level 25: 暗黒の神殿,레벨 25: 어둠의 신전,Level 25: De tempel van de duisternis,Nivå 25: Mørkets tempel,Level 25: Świątynia Mroku,Fase 25: O Templo da Escuridão,Nível 25: O Templo da Escuridão,Nivelul 25: Templul tenebros,Уровень №25: Храм тьмы,Level 25: Храм таме,Nivå 25: Mörkrets tempel,Seviye 25: Karanlığın Tapınağı +Level 26: Bunker,PHUSTR_26,,,,Level 26: Bunkr,,,,Nivelo 26: Bunkro,Nivel 26: Búnker,,Taso 26: Bunkkeri,NIVEAU 26: Bunker,,26. Pálya: Bunker,Livello 26: Bunker,Level 26: バンカー,레벨 26: 방공호,,,Level 26: Bunkier,Fase 26: Casamata,Nível 26: Bunker,Nivelul 26: Buncăr,Уровень №26: Бункер,Level 26: Бункер,Nivå 26: Bunker,Seviye 26: Sığınak +Level 27: Anti-christ,PHUSTR_27,,,,Level 27: Antikrist,,Level 27: Antichrist,,Nivelo 27: Antikristo,Nivel 27: Anticristo,,Taso 27: Antikristus,NIVEAU 27: Anti-Christ,,27. Pálya: Antikrisztus,Livello 27: Anticristo,Level 27: アンチキリスト,레벨 27: 적그리스도,Level 27: Antichrist,Nivå 27: Antikrist,Level 27: Antychryst,Fase 27: Anticristo,Nível 27: Anticristo,Nivelul 27: Antihrist,Уровень №27: Антихрист,Level 27: Антихрист,Nivå 27: Antikrist,Seviye 27: Mesih Karşıtı +Level 28: The Sewers,PHUSTR_28,,,,Level 28: Kanály,Level 28: Kloakkerne,Level 28: Kanäle,,Nivelo 28: La Kanalo,Nivel 28: Las Alcantarillas,,Taso 28: Viemärit,NIVEAU 28: Les Egouts,,28. Pálya: A kanális,Livello 28: Le Fogne,Level 28: 下水道,레벨 28: 하수구,Level 28: De rioleringen,Nivå 28: Kloakken,Level 28: Ścieki,Fase 28: Os Esgotos,Nível 28: Os Esgotos,Nivelul 28: Canalizarea,Уровень №28: Канализация,Level 28: Канализација,Nivå 28: Sjukhusen,Seviye 28: Kanalizasyonlar +Level 29: Odyssey of Noises,PHUSTR_29,,,,Level 29: Odysea křiku,Level 29: Lydenes odyssé,Level 29: Odyssee der Geräusche,,Nivelo 29: Vojaĝo de Sonoj,Nivel 29: Odisea de Ruidos,,Taso 29: Äänten harharetki,NIVEAU 29: Odysée de Bruits,,29. Pálya: A moraj ösvénye,Livello 29: Odissea dei Rumori,Level 29: オデッセイのノイズ,레벨 29: 속삭임의 여정,Level 29: Odyssee van geluiden,Nivå 29: Lydenes odyssé,Level 29: Odyseja Wrzawy,Fase 29: Odisséia de Ruidos,Nível 29: Odisséia de Ruidos,Nivelul 29: Odiseea zgomotelor,Уровень №29: Одиссея шумов,Level 29: Одисеја шумова,Nivå 29: Ljudets odyssé,Seviye 29: Seslerin Odyssey'i +Level 30: The Gateway of Hell,PHUSTR_30,,,,Level 30: Brána pekla,Level 30: Helvedes port,Level 30: Tor zur Hölle,,Nivelo 30: La Pordego de Inferno,Nivel 30: La Puerta del Infierno,,Taso 30: Helvetin porttikäytävä,NIVEAU 30: La Porte des Enfers,,30. Pálya: Átjáró a pokolba,Livello 30: La Porta dell'Inferno,Level 30: 地獄の関門,레벨 30: 지옥의 차원문,Level 30: De poort van de hel,Nivå 30: Porten til helvete,Level 30: Brama Piekieł,Fase 30: O Portão do Inferno,Nível 30: O Portão do Inferno,Nivelul 30: Poarta spre infern,Уровень №30: Врата ада,Level 30: Пролаз пакла,Nivå 30: Helvetets port,Seviye 30: Cehennem Kapısı +Level 31: Cyberden,PHUSTR_31,,,,Level 31: Kyberdoupě,,Level 31: Cyberbau,,Nivelo 31: Cibernesto,Nivel 31: Ciber-guarida,,Taso 31: Kyberpesä,NIVEAU 31: Cyber-Antre,,31. Pálya: Kiberodú,Livello 31: Cybergabbia,Level 31: サイバーの巣,레벨 31: 사이버소굴,,,Level 31: Cybernora,Fase 31: Ciberantro,Nível 31: Ciberantro,Nivelul 31: Cibervizuină,Уровень №31: Киберлогово,Level 31: Сајбер-јазбина,Nivå 31: Cyberden,Seviye 31: Siber'in ini +Level 32: Go 2 It,PHUSTR_32,,,,Level 32: Jdi do toho,,,,Nivelo 32: Iru al ĝi!,Nivel 32: Ve a x ello,Nivel 32: Ve x eso,Taso 32: Iske kii,NIVEAU 32: Go 2 It,,32. Pálya: Menj oda!,Livello 32: Dacci Dentro,Level 32: 逝ってこい,레벨 32: 함 해 봐,Level 32: Ga ervoor,,Level 32: Do Dzieła,Fase 32: Vai Fundo,Nível 32: Siga em Frente,Nivelul 32: Du-te la ei,Уровень №32: П0лный вп3рёд,Level 32: Иди ка њему,Nivå 32: Gå till det,Seviye 32: Devam Et +,,TNT: Evilution,,,,,,,,,,,,,,,,,,,,,,,,,, +Level 1: System Control,THUSTR_1,,,,Level 1: Administrace,Level 1: Systemkontrol,Level 1: Systemkontrolle,,Nivelo 1: Sistema Kontrolo,Nivel 1: Control del Sistema,,Taso 1: Järjestelmäohjaamo,NIVEAU 1: Système de Contrôle,,1. Pálya: Rendszervezérlő,Livello 1: Controllo del Sistema,Level 1: 制御システム,레벨 1: 시스템 제어시설,Level 1: Systeemcontrole,Nivå 1: Systemkontroll,Level 1: Kontrola Systemu,Fase 1: Controle do Sistema,Nível 1: Controlo de Sistema,Nivelul 1: Control sisteme,Уровень №1: Центр управления системой,Level 1: Контролна система,Nivå 1: Systemkontroll,Seviye 1: Sistem Kontrolü +Level 2: Human BBQ,THUSTR_2,,,,Level 2: Člověčí grilovačka,Level 2: Menneskelig grill,Level 2: Menschliches Barbecue,,Nivelo 2: Homo-Kradrostado,Nivel 2: Barbacoa Humana,,Taso 2: Ihmisgrilli,NIVEAU 2: Barbecue Humain,,2. Pálya: Emberi grill,Livello 2: Barbecue Umano,Level 2: 人肉晩餐会,레벨 2: 인간 바비큐,Level 2: Menselijke BBQ,Nivå 2: Menneskelig BBQ,Level 2: Ludzki Grill,Fase 2: Churrasco Humano,Nível 2: Churrasco Humano,Nivelul 2: Oameni la grătar,Уровень №2: Барбекю из человечины,Level 2: Људски роштиљ,Nivå 2: Människogrill,Seviye 2: İnsan Barbekü +Level 3: Power Control,THUSTR_3,,,,Level 3: Napájecí vedení,Level 3: Kontrol med magten,Level 3: Energiekontrolle,,Nivelo 3: Energia Kontrolo,Nivel 3: Control de Energía,,Taso 3: Voimalan ohjaamo,NIVEAU 3: Contrôle Energétique,,3. Pálya: Energiavezérlő,Livello 3: Centrale Energetica,Level 3: 制御室,레벨 3: 전력 통제소,Level 3: Machtscontrole,Nivå 3: Kraftkontroll,Level 3: Kontrola Zasilania,Fase 3: Controle de Energia,Nível 3: Controlo Energético,Nivelul 3: Uzina,Уровень №3: Центр управления питанием,Level 3: Контролна моћ,Nivå 3: Maktkontroll,Seviye 3: Güç Kontrolü +Level 4: Wormhole,THUSTR_4,,,,Level 4: Červí díra,Level 4: Ormehul,Level 4: Wurmloch,,Nivelo 4: Vermtruo,Nivel 4: Agujero de Gusano,,Taso 4: Madonreikä,NIVEAU 4: Trou de Ver,,4. Pálya: Féreglyuk,Livello 4: Wormhole,Level 4: 虫喰い穴,레벨 4: 웜홀,Level 4: Wormgat,Nivå 4: Ormehull,Level 4: Tunel,Fase 4: Buraco de Minhoca,Nível 4: Buraco de Minhoca,Nivelul 4: Gaura de vierme,Уровень №4: Червоточина,Level 4: Црвоточина,Nivå 4: Maskhål,Seviye 4: Solucan Deliği +Level 5: Hanger,THUSTR_5,"Not ""Hangar""",,,Level 5: Hangár,,Level 5: Hangar,,Nivelo 5: Pendigejo,Nivel 5: Colgador,,Taso 5: Lentoalushalli,NIVEAU 5: Hengar,,5. Pálya: Horog,Livello 5: Hanga,Level 5: 格納庫,레벨 5: 격납고,Level 5: Hangar,Nivå 5: Hanger,Level 5: Hangar,Fase 5: Hangar,Nível 5: Hangar,Nivelul 5: Hangar,Уровень №5: Ангар,Level 5: Вешалица,Nivå 5: Hängare,Seviye 5: Askı +Level 6: Open Season,THUSTR_6,,,,Level 6: Lovecká sezóna,Level 6: Åben sæson,Level 6: Jagdsaison,,Nivelo 6: Ĉasosezono,Nivel 6: Temporada Abierta,,Taso 6: Avoin sesonki,NIVEAU 6: La Chasse Est Ouverte,,6. Pálya: Vadászszezon,Livello 6: Stagione Aperta,Level 6: 狩猟解禁,레벨 6: 사냥철,Level 6: Open seizoen,Nivå 6: Åpen sesong,Level 6: Otwarty Sezon,Fase 6: Temporada Aberta,Nível 6: Época Aberta,Nivelul 6: Sezon deschis,Уровень №6: Сезон охоты,Level 6: Отворена сезона,Nivå 6: Öppen säsong,Seviye 6: Açık Sezon +Level 7: Prison,THUSTR_7,,,,Level 7: Vězení,Level 7: Fængsel,Level 7: Gefängnis,,Nivelo 7: Malliberejo,Nivel 7: Prisión,,Taso 7: Vankila,NIVEAU 7: Prison,,7. Pálya: Börtön,Livello 7: Prigione,Level 7: 監獄,레벨 7: 감옥,Level 7: Gevangenis,Nivå 7: Fengsel,Level 7: Więzienie,Fase 7: Prisão,Nível 7: Prisão,Nivelul 7: Închisoare,Уровень №7: Тюрьма,Level 7: Затвор,Nivå 7: Fängelse,Seviye 7: Hapishane +Level 8: Metal,THUSTR_8,,,,Level 8: Kov,,Level 8: Metall,,Nivelo 8: Metalo,Nivel 8: Metal,,Taso 8: Metalli,NIVEAU 8: Métal,,8. Pálya: Fém,Livello 8: Metallo,Level 8: メタル,레벨 8: 강철,Level 8: Metaal,Nivå 8: Metall,,Fase 8: Metal,Nível 8: Metal,Nivelul 8: Metal,Уровень №8: Металл,Level 8: Метал,Nivå 8: Metall,Seviye 8: Metal +Level 9: Stronghold,THUSTR_9,,,,Level 9: Pevnost,Level 9: Borgen,Level 9: Festung,,Nivelo 9: Fuorto,Nivel 9: Fortaleza,,Taso 9: Linnake,NIVEAU 9: Forteresse,,9. Pálya: Erőd,Livello 9: Fortezza,Level 9: 牙城,레벨 9: 요새,Level 9: Vesting,Nivå 9: Festning,Level 9: Warownia,Fase 9: Fortaleza,Nível 9: Fortaleza,Nivelul 9: Bastion,Уровень №9: Твердыня,Level 9: Упориште,Nivå 9: Fästning,Seviye 9: Kale +Level 10: Redemption,THUSTR_10,,,,Level 10: Vykoupení,Level 10: Forløsning,Level 10: Erlösung,,Nivelo 10: Elaĉeto,Nivel 10: Redención,,Taso 10: Lunastus,NIVEAU 10: Rédemption,,10. Pálya: Megváltás,Livello 10: Redenzione,Level 10: 償還,레벨 10: 구원,Level 10: Aflossing,Nivå 10: Innløsning,Level 10: Odkupienie,Fase 10: Redenção,Nível 10: Redenção,Nivelul 10: Răscumpărare,Уровень №10: Искупление,Level 10: Искупљење,Nivå 10: Inlösen,Seviye 10: Kefaret +Level 11: Storage Facility,THUSTR_11,,,,Level 11: Skladiště,Level 11: Opbevaringsanlæg,Level 11: Lagerstätte,,Nivelo 11: Stokejo,Nivel 11: Complejo de Almacenes,Nivel 11: Almacenes,Taso 11: Varastolaitos,NIVEAU 11: Complexe de Stockage,,11. Pálya: Raktárépület,Livello 11: Impianto di Stoccaggio,Level 11: 貯蔵施設,레벨 11: 저장소,Level 11: Opslagfaciliteit,Nivå 11: Lagringsanlegg,Level 11: Magazyn,Fase 11: Centro de Armazenamento,Nível 11: Centro de Armazenamento,Nivelul 11: Stația de depozitare,Уровень №11: Склад,Level 11: Складиште,Nivå 11: Förvaringsanläggning,Seviye 11: Depolama Tesisi +Level 12: Crater,THUSTR_12,,,,Level 12: Kráter,Level 12: Krater,Level 12: Krater,,Nivelo 12: Kratero,Nivel 12: Cráter,,Taso 12: Kraateri,NIVEAU 12: Cratère,,12. Pálya: Kráter,Livello 12: Cratere,Level 12: 火口,레벨 12: 분화구,Level 12: Krater,Nivå 12: Krater,Level 12: Krater,Fase 12: Cratera,Nível 12: Cratera,Nivelul 12: Crater,Уровень №12: Кратер,Level 12: Кратер,Nivå 12: Krater,Seviye 12: Krater +Level 13: Nukage Processing,THUSTR_13,,,,Level 13: Jaderné zpracování,Level 13: Nukageforarbejdning,Level 13: Nuklearverarbeitung,,Nivelo 13: Nukleaĵo-Traktejo,Nivel 13: Procesamiento de Residuos Nucleares,,Taso 13: Ydinjätekäsittely,NIVEAU 13: Traitement Nucléaire,,13. Pálya: Atomhulladék-feldolgozó,Livello 13: Trattamento Nucleare,Level 13: 核廃棄物加工所,레벨 13: 폐기물 처리소,Level 13: Nucleaire verwerking,Nivå 13: Nukage-prosessering,Level 13: Przetwórstwo Jądrowe,Fase 13: Processamento Nuclear,Nível 13: Processamento Nuclear,Nivelul 13: Prelucrarea deșeurilor nucleare,Уровень №13: Переработка ядерных отходов,Level 13: Прерада нуклеарног отпада,Nivå 13: Kärnavfall Behandling,Seviye 13: Nukage İşleme +Level 14: Steel Works,THUSTR_14,,,,Level 14: Ocelárna,Level 14: Stålværk,Level 14: Stahlwerk,,Nivelo 14: Ŝtalejo,Nivel 14: Siderúrgica,Nivel 14: Siderurgia,Taso 14: Terästehdas,NIVEAU 14: Aciérie,,14. Pálya: Acélművek,Livello 14: Acciaieria,Level 14: 製鉄所,레벨 14: 제강소,Level 14: Staalfabrieken,Nivå 14: Stålverk,Level 14: Huta,Fase 14: Siderúrgica,Nível 14: Siderúrgica,Nivelul 14: Oțelărie,Уровень №14: Сталелитейный завод,Level 14: Челичана,Nivå 14: Stålverk,Seviye 14: Çelik İşleri +Level 15: Dead Zone,THUSTR_15,,,,Level 15: Mrtvá zóna,Level 15: Død zone,Level 15: Tote Zone,,Nivelo 15: Senvivzono,Nivel 15: Zona Muerta,,Taso 15: Kuollut alue,NIVEAU 15: Zone Morte,,15. Pálya: A holtak zónája,Livello 15: Zona Morta,Level 15: 危険地帯,레벨 15: 사각지대,Level 15: Dode zone,Nivå 15: Død sone,Level 15: Martwa Strefa,Fase 15: Zona Morta,Nível 15: Zona Morta,Nivelul 15: Zona moartă,Уровень №15: Мёртвая зона,Level 15: Зона смрти,Nivå 15: Dödszon,Seviye 15: Ölü Bölge +Level 16: Deepest Reaches,THUSTR_16,,,,Level 16: Nejhlubší sluje,Level 16: De dybeste afkroge,Level 16: Tiefe,,Nivelo 16: Plejsubejo,Nivel 16: Recodos profundos,,Taso 16: Syvyydet,NIVEAU 16: Profondeurs,,16. Pálya: A legmélyebb pont,Livello 16: Profondità,Level 16: 最深部,레벨 16: 깊숙한 강,Level 16: Diepste reiken,Nivå 16: De dypeste områdene,Level 16: Głębiny,Fase 16: Profundezas,Nível 16: Profundezas,Nivelul 16: În adâncuri,Уровень №16: Глубочайшие достижения,Level 16: Најдубља дубина,Nivå 16: De djupaste hålen,Seviye 16: En Derin Erişimler +Level 17: Processing Area,THUSTR_17,,,,Level 17: Kombinát,Level 17: Forarbejdningsområde,Level 17: Verarbeitungsbereich,,Nivelo 17: Traktadareo,Nivel 17: Área de Procesamiento,,Taso 17: Käsittelyalue,NIVEAU 17: Zone de Traitement,,17. Pálya: Feldolgozó,Livello 17: Area di Elaborazione,Level 17: 処理地帯,레벨 17: 처리 구역,Level 17: Verwerkingsgebied,Nivå 17: Behandlingsområde,Level 17: Strefa Przerobowa,Fase 17: Área de Processamento,Nível 17: Área de Processamento,Nivelul 17: Aria de procesare,Уровень №17: Зона обработки,Level 17: Подручје обраде,Nivå 17: Bearbetningsområde,Seviye 17: İşleme Alanı +Level 18: Mill,THUSTR_18,,,,Level 18: Mlýn,Level 18: Mølle,Level 18: Mühle,,Nivelo 18: Muelejo,Nivel 18: Molino,,Taso 18: Mylly,NIVEAU 18: Fonderie,,18. Pálya: Malom,Livello 18: Fonderia,Level 18: 製粉所,레벨 18: 제분소,Level 18: Molen,Nivå 18: Mølle,Level 18: Młyn,Fase 18: Moinho,Nível 18: Moinho,Nivelul 18: Moara,Уровень №18: Завод,Level 18: Млин,Nivå 18: Kvarn,Seviye 18: Değirmen +Level 19: Shipping/respawning,THUSTR_19,,,,Level 19: Přeprava,Level 19: Forsendelsescenter,Level 19: Versandlager,,Nivelo 19: Ekspedo/Revivado,Nivel 19: Enviando/Reapareciendo,,Taso 19: Huolinta/Ylösnostatus,NIVEAU 19: Envoi/Réapparition,,19. Pálya: Szállítás/újraéledés,Livello 19: Consegna/Respawn,Level 19: 出荷と再生成,레벨 19: 운송/리스폰 장소,Level 19: Verzendingscentrum,Nivå 19: Frakt/omlasting,Level 19: Wysyłka/Reprodukcja,Fase 19: Expedição/reaparecimento,Nível 19: Expedição/reaparecimento,Nivelul 19: Livrare/reapariție,Уровень №19: Погрузка и отправка,Level 19: Отпремање/оживљавање,Nivå 19: Skeppning,Seviye 19: Nakliye Merkezi +Level 20: Central Processing,THUSTR_20,,,,Level 20: Centrální zpracování,Level 20: Central forarbejdning,Level 20: Zentralverarbeitung,,Nivelo 20: Centra Eskpedado,Nivel 20: Procesamiento Central,,Taso 20: Käsittelykeskus,NIVEAU 20: Organisme Central,,20. Pálya: Központi feldolgozó,Livello 20: Centrale di Elaborazione,Level 20: 中央処理所,레벨 20: 중앙 처리소,Level 20: Centrale verwerking,Nivå 20: Sentral behandling,Level 20: Centralny Proces,Fase 20: Processamento Central,Nível 20: Processamento Central,Nivelul 20: Prelucrare centrală,Уровень №20: Центральный пункт обработки,Level 20: Централна обрада,Nivå 20: Centralt bearbetningsområde,Seviye 20: Merkezi İşlem +Level 21: Administration Center,THUSTR_21,,,,Level 21: Administrativní centrum,Level 21: Administrationscenter,Level 21: Verwaltungszentrum,,Nivelo 21: Administracia Centro,Nivel 21: Centro de Administración,,Taso 21: Keskushallinto,NIVEAU 21: Centre Administratif,,21. Pálya: Adminisztrációs központ,Livello 21: Centro Amministrativo,Level 21: 行政センター,레벨 21: 관리 센터,Level 21: Administratief centrum,Nivå 21: Administrasjonssenter,Level 21: Centrum Administracyjne,Fase 21: Centro de Administração,Nível 21: Centro de Administração,Nivelul 21: Centru administrativ,Уровень №21: Административный центр,Level 21: Административни центар,Nivå 21: Administrationscenter,Seviye 21: Yönetim Merkezi +Level 22: Habitat,THUSTR_22,,,,,Level 22: Levested,,,Nivelo 22: Habitato,Nivel 22: Hábitat,,Taso 22: Asuinpaikka,NIVEAU 22: Habitat,,22. Pálya: Élőhely,Livello 22: Habitat,Level 22: 生息地,레벨 22: 서식지,,Nivå 22: Habitat,Level 22: Siedlisko,Fase 22: Habitat,Nível 22: Habitat,Nivelul 22: Habitat,Уровень №22: Ареал,Level 22: Станиште,Nivå 22: Livsområde,Seviye 22: Habitat +Level 23: Lunar Mining Project,THUSTR_23,,,,Level 23: Lunární těžební projekt,Level 23: Projekt for månens minedrift,Level 23: Mondbergbauprojekt,,Nivelo 23: Luna Mino-Projekto,Nivel 23: Proyecto de Minería Lunar,,Taso 23: Kuukaivosprojekti,NIVEAU 23: Projet Minier Lunaire,,23. Pálya: Holdbánya-projekt,Livello 23: Progetto Minerario Lunare,Level 23: 月面探鉱計画,레벨 23: 월석 채광 계획,Level 23: Maanmijnbouw project,Nivå 23: Månegruveprosjekt,Level 23: Projekt Księżycowe Górnictwo,Fase 23: Projeto de Mineração Lunar,Nível 23: Projeto de Escavação Lunar,Nivelul 23: Proiect minier satelitar,Уровень №23: Лунный проект горной добычи,Level 23: Пројекат лунарног рударства,Nivå 23: Gruvprojekt på månen,Seviye 23: Ay Madenciliği Projesi +Level 24: Quarry,THUSTR_24,,,,Level 24: Kamenolom,Level 24: Stenbrud,Level 24: Steinbruch,,Nivelo 24: Ŝtonejo,Nivel 24: Cantera,,Taso 24: Louhos,NIVEAU 24: Carrière,,24. Pálya: Kőbánya,Livello 24: Caccia,Level 24: 採石場,레벨 24: 채석장,Level 24: Steengroeve,Nivå 24: Steinbrudd,Level 24: Kamieniołom,Fase 24: Pedreira,Nível 24: Pedreira,Nivelul 24: Carieră,Уровень №24: Карьер,Level 24: Каменолом,Nivå 24: Stenbrott,Seviye 24: Taş Ocağı +Level 25: Baron's Den,THUSTR_25,,,,Level 25: Baronovo doupě,Level 25: Baronens hule,Level 25: Der Bau des Barons,,Nivelo 25: Nestego de Barono,Nivel 25: Guarida del Barón,,Taso 25: Paronin pesä,NIVEAU 25: l'Antre des Barons,,25. Pálya: A báró odúja,Livello 25: Antro del Barone,Level 25: バロンの巣窟,레벨 25: 남작의 소굴,Level 25: Het baron's gebouw,Nivå 25: Baronens hule,Level 25: Legowisko Barona,Fase 25: Covil do Barão,Nível 25: Covil do Barão,Nivelul 25: Cuibul Baronului,Уровень №25: Логово барона,Level 25: Баронова јазбина,Nivå 25: Baronens lya,Seviye 25: Baron'un İni +Level 26: Ballistyx,THUSTR_26,,,,Level 26: Balistika,,,,Nivelo 26: Balistikso,Nivel 26: Balístige,,Taso 26: Ballistyks,NIVEAU 26: Ballistyx,,26. Pálya: Ballisztüx,Livello 26: Ballistige,Level 26: バリステュクス,레벨 26: 탄도스틱스,,,Level 26: Balistyka,Fase 26: Ballistige,Nível 26: Ballistige,Nivelul 26: Ballistyx,Уровень №26: Баллистикс,Level 26: Билистичкикс,Nivå 26: Ballistyx,Seviye 26: Balistyx +Level 27: Mount Pain,THUSTR_27,,,,Level 27: Hora bolesti,Level 27: Smertefjellet,Level 27: Berg des Schmerzes,,Nivelo 27: Monto de Doloro,Nivel 27: Monte Dolor,,Taso 27: Tuskavuori,NIVEAU 27: Mont Souffrance,,27. Pálya: A Gyötrelem Hegye,Livello 27: Monte del Dolore,Level 27: 苦しみの山,레벨 27: 등신같은 등산,Level 27: Pijn in de bergen,Nivå 27: Smertefjellet,Level 27: Góra Bólu,Fase 27: Monte Dor,Nível 27: Monte Dor,Nivelul 27: Muntele Durerii,Уровень №27: Гора Боль,Level 27: Планина боли,Nivå 27: Smärta på berget,Seviye 27: Acı Dağı +Level 28: Heck,THUSTR_28,,,,Level 28: Sakra,,Level 28: Zum Teufel,,Nivelo 28: Diable,Nivel 28: Diablos,,Taso 28: Hemmetti,NIVEAU 28: Que Diable?,,28. Pálya: Rosseb,Livello 28: Al Diavolo,Level 28: 苛立ち,레벨 28: 젠장함,,Nivå 28: Helvete,Level 28: Do Diabła,Fase 28: Capeta,Nível 28: Inferno,Nivelul 28: Naiba,Уровень №28: Чертовщина,Level 28: Пакао,Nivå 28: Heck,Seviye 28: Cehennem +Level 29: River Styx,THUSTR_29,,,,Level 29: Řeka Styx,Level 29: Floden Styx,Level 29: Fluss Styx,,Nivelo 29: Rivero de Stikso,Nivel 29: Río Estige,,Taso 29: Styksjoki,NIVEAU 29: Fleuve Styx,,29. Pálya: A Sztüx folyó,Livello 29: Fiume Stige,Level 29: 三途の川,레벨 29: 스틱스 강,Level 29: Rivier Styx,Nivå 29: Elven Styx,Level 29: Styks,Fase 29: Rio Estige,Nível 29: Rio Estige,Nivelul 29: Râul Styx,Уровень №29: Река Стикс,Level 29: Река Стикс,Nivå 29: Floden Styx,Seviye 29: Styx Nehri +Level 30: Last Call,THUSTR_30,,,,Level 30: Poslední mise,Level 30: Sidste opkald,Level 30: Letzter Aufruf,,Nivelo 30: Fina Voko,Nivel 30: Última Llamada,,Taso 30: Viimeinen koollehuuto,NIVEAU 30: Dernier Appel,,30. Pálya: Utolsó esély,Livello 30: Ultima Chiamata,Level 30: 最終指令,레벨 30: 최후의 호출,Level 30: Laatste oproep,Nivå 30: Siste innkalling,Level 30: Ostatni Zew,Fase 30: Última Chamada,Nível 30: Última Chamada,Nivelul 30: Ultimul apel,Уровень №30: Последний вызов,Level 30: Последњи позив,Nivå 30: Sista kallelsen,Seviye 30: Son Çağrı +Level 31: Pharaoh,THUSTR_31,,,,Level 31: Faraón,Level 31: Farao,Level 31: Pharao,,Nivelo 31: Faraono,Nivel 31: Faraón,,Taso 31: Faarao,NIVEAU 31: Pharaon,,31. Pálya: Fáraó,Livello 31: Faraone,Level 31: ファラオ,레벨 31: 파라오,Level 31: Farao,Nivå 31: Farao,Level 31: Faraon,Fase 31: Faraó,Nível 31: Faraó,Nivelul 31: Faraon,Уровень №31: Фараон,Level 31: Фараон,Nivå 31: Farao,Seviye 31: Firavun +Level 32: Caribbean,THUSTR_32,,,,Level 32: Karibik,Level 32: Caribien,Level 32: Karibik,,Nivelo 32: Karibio,Nivel 32: Caribeño,,Taso 32: Karibia,NIVEAU 32: Caraïbes,,32. Pálya: Karib-térség,Livello 32: Caraibi,Level 32: カリビアン,레벨 32: 카리브해,Level 32: Caribisch,Nivå 32: Karibia,Level 32: Karaiby,Fase 32: Caribe,Nível 32: Caraíbas,Nivelul 32: Caraibe,Уровень №32: Карибы,Level 32: Кариби,Nivå 32: Karibien,Seviye 32: Karayipler +,,Heretic,,,,,,,,,,,,,,,,,,,,,,,,,, +The Docks,HHUSTR_E1M1,,,,Přístav,Havnene,Die Docks,,La Havenoj,Los Muelles,,Satamat,Les Docks,,A Kikötő,Il Molo,埠頭,항구,De dokken,Havnen,Doki,As Docas,,Docul,Доки,Лука,Hamnarna,Rıhtım +The Dungeons,HHUSTR_E1M2,,,,Žaláře,Fangehullerne,Die Kerker,,La Malliberejoj,Los Calabozos,,Tyrmät,Le Donjon,,A Kazamaták,I Sotterranei,地下牢,지하감옥,De kerkers,Fangehullene,Lochy,As Masmorras,,Temnița,Темницы,Тамнице,Fästningarna,Zindanlar +The Gatehouse,HHUSTR_E1M3,,,,Vrátnice,Portens hus,Das Pförtnerhaus,,La Pordegejo,El Cuerpo de Guardia,,Porttitalo,Le Corps de Garde,,A Kapuház,L'ingresso,門塔,문루,Het poortgebouw,Porthuset,Stróżówka,O Portão de Entrada,,Casa portarului,Привратницкая,Стражарница,Porthuset,Kapı Evi +The Guard Tower,HHUSTR_E1M4,,,,Strážní věž,Vagttårnet,Der Wachturm,,La Gardturo,La Torre de Guardia,,Vartiotorni,La Tour de Garde,,Az Őrtorony,La Torre di Guardia,監視塔,보초 누대,De wachttoren,Vakttårnet,Wieża Strażnicza,A Torre de Guarda,,Turnul de veghe,Сторожевая башня,Извидница,Vakttornet,Muhafız Kulesi +The Citadel,HHUSTR_E1M5,,,,Citadela,Citadellet,Die Festung,,La Citadelo,La Ciudadela,,Linnake,La Citadelle,,A Citadella,La Cittadella,要塞,거점,De citadel,Citadellet,Cytadela,A Cidadela,,Cetatea,Цитадель,Цитадела,Citadellet,Hisar +The Cathedral,HHUSTR_E1M6,,,,Katedrála,Katedralen,Die Kathedrale,,La Katedralo,La Catedral,,Katedraali,La Cathédrale,,A Katedrális,La Cattedrale,大聖堂,대성당,De kathedraal,Katedralen,Katedra,A Catedral,,Catedrala,Кафедральный собор,Катедрала,Katedralen,Katedral +The Crypts,HHUSTR_E1M7,,,,Krypty,Krypterne,Die Krypten,,La Kriptoj,Las Criptas,,Kryptat,La Crypte,,A Kripták,Le Cripte,地下聖堂,지하 묘실,De grafkelders,Kryptene,Krypty,As Criptas,,Criptele,Склепы,Крипта,Krypten,Mahzenler +Hell's Maw,HHUSTR_E1M8,,,,Chřtán pekla,Helvedes gab,Der Höllenschlund,,Faŭko de Infero,Fauces del Infierno,,Helvetin kita,La Geule de l'Enfer,,A Pokol Szája,La Bocca dell'Inferno,地獄の肚,지옥의 목구멍,De helmouth,Helvetes gap,Paszcza Piekieł,A Boca do Inferno,,Gura iadului,Адская утроба,Паклено ждрело,Helvetets gap,Cehennem Ağzı +The Graveyard,HHUSTR_E1M9,,,,Hřbitov,Kirkegården,Der Friedhof,,La Tombejo,El Cementerio,,Hautausmaa,Le Cimetière,,A Temető,Il Cimitero,墓場,공동묘지,De begraafplaats,Kirkegården,Cmentarz,O Cemitério,,Cimitirul,Кладбище,Гробље,Kyrkogården,Mezarlık +The Crater,HHUSTR_E2M1,,,,Kráter,Krateret,Der Krater,,La Kratero,El Cráter,,Kraateri,Le Cratère,,A Kráter,Il Cratere,噴火口,깊은 혈,De krater,Krateret,Krater,A Cratera,,Craterul,Кратер,Кратер,Kratern,Krater +The Lava Pits,HHUSTR_E2M2,,,,Lávové jámy,Lavagruberne,Die Lavagruben,,La Lafo-Fosaĵo,Las Canteras de Lava,,Laavamontut,Les Puits de Lave,,A Lávaárok,I Pozzi della Lava,溶岩の竪穴,용암 구덩이,De lavaputten,Lavagropene,Szyb Lawy,Os Fossos de Lava,,Gropile cu lavă,Лавовые очаги,Понор лаве,Lavagruvorna,Lav Çukurları +The River of Fire,HHUSTR_E2M3,,,,Ohnivá řeka,Ildfloden,Der Feuerfluss,,La Rivero de Fajro,El Río de Fuego,,Tulijoki,La Rivière de Feu,,A Tűzfolyó,Il Fiume di Fuoco,火の河,화염의 강,De rivier van vuur,Elven av ild,Rzeka Ognia,O Rio de Fogo,,Râul de foc,Река огня,Река од ватре,Eldfloden,Ateş Nehri +The Ice Grotto,HHUSTR_E2M4,,,,Ledová grotta,Isgrotten,Die Eisgrotte,,La Glacigroto,La Gruta de Hielo,,Jääluola,La Grotte de Glace,,A Jégbarlang,La Grotta del Ghiaccio,氷の洞窟,얼음 동굴,De ijsgrot,Isgrotten,Lodowa Grota,A Gruta de Gelo,,Grota de gheață,Ледяной грот,Ледена пећина,Isgrottan,Buz Mağarası +The Catacombs,HHUSTR_E2M5,,,,Katakomby,Katakomberne,Die Katakomben,,La Katakomboj,Las Catacumbas,,Katakombit,Les Catacombes,,A Katakombák,Le Catacombe,地下墓所,태고의 무덤,De catacomben,Katakombene,Katakumby,As Catacumbas,Os Túmulos,Catacombele,Катакомбы,Катакомбе,Katakomberna,Yeraltı Mezarları +The Labyrinth,HHUSTR_E2M6,,,,Labyrint,Labyrinten,Das Labyrinth,,La Labirinto,El Laberinto,,Labyrintti,Le Labyrinthe,,A Labirintus,Il Labirinto,迷宮,미궁,Het labyrint,Labyrinten,Labirynt,O Labirinto,,Labirintul,Лабиринт,Лавиринт,Labyrinten,Labirent +The Great Hall,HHUSTR_E2M7,,,,Velký sál,Den store sal,Die große Halle,,La Granda Halo,El Gran Salón,,Suuri halli,Le Grand Hall,,A Nagy Folyosó,La Grande Sala,大公会堂,대회관,De grote zaal,Den store salen,Wielki Hol,O Grande Salão,,Sala cea mare,Большой зал,Велика дворана,Den stora hallen,Büyük Salon +The Portals of Chaos,HHUSTR_E2M8,,,,Portály chaosu,Kaosets portaler,Das Portal des Chaos,,La Portaloj de Ĥaoso,Los Portales del Caos,,Kaaoksen portaalit,Le Portail du Chaos,,A Káosz Portáljai,I Portali del Caos,混沌への門,혼돈의 차원문,De portalen van chaos,Kaosets portaler,Portale Chaosu,Os Portais do Caos,,Portalurile haosului,Порталы хаоса,Портали хаоса,Kaosets portaler,Kaos Kapıları +The Glacier,HHUSTR_E2M9,,,,Ledovec,Gletsjeren,Der Gletscher,,La Glaciejo,El Glaciar,,Jäätikkö,Le Glacier,,A Gleccser,Il Ghiacciaio,氷河,빙하 구역,De gletsjer,Isbreen,Lodowiec,A Geleira,O Glaciar,Ghețarul,Ледник,Глечер,Glaciären,Buzul +The Storehouse,HHUSTR_E3M1,,,,Skladiště,Magasinet,Die Lagerhalle,,La Stokejo,El Almacén,,Varasto,L'Entrepôt,,A Raktár,Il Magazzino,倉庫,저장고,Het pakhuis,Forrådshuset,Magazyn,O Armazém,,Depozitul,Кладовая,Складиште,Magasinet,Depo +The Cesspool,HHUSTR_E3M2,,,,Žumpa,Kedelbassinet,Die Latrine,,La Kloako,El Pozo,,Likakaivo,Le Bourbier,,A Pöcegödör,Il Pozzo Nero,汚水層,불결한 장소,De zinkput,Søledammen,Szambo,A Fossa,,Haznaua,Сточный колодец,Септичка јама,Rännstenen,Lağım Çukuru +The Confluence,HHUSTR_E3M3,,,,Soutok,Sammenløbet,Die Vereinigung,,La Kunfluiĝo,La Confluencia,,Yhtymäkohta,La Confluence,,A Kereszteződés,La Confluenza,合流点,합류점,De samenvloeiing,Sammenløpet,Spływ,A Confluência,,Confluența,Слияние,Ушће,Sammanflödet,Confluence +The Azure Fortress,HHUSTR_E3M4,,,,Azurová pevnost,Den azurblå fæstning,Die himmelblaue Festung,,La Lazurfortikaĵo,La Fortaleza de Azur,,Sininen linnoitus,La Fortresse d'Azur,,Az Azúr Erőd,La Fortezza Azzurra,紺碧の要塞,청천의 요새,De azuurblauwe vesting,Den azurblå festningen,Lazurowa Forteca,A Fortaleza Azul,,Fortăreața de azur,Лазурная крепость,Азурна дврђава,Den azurblå fästningen,Azure Kalesi +The Ophidian Lair,HHUSTR_E3M5,,,,Hadí doupě,Ophidian Hulen,Das Schlangennest,,La Nestego de Ofidia,La Guarida Ofídica,,Käärmeiden pesä,Le Repaire des Ophidiens,,Az Opfidiánok Fészke,L'antro degli Ophidian,オフィディアンの塒,오피디안의 소굴,Het slangennest,Ophidian-hulen,Gniazdo Węży,A Cova dos Ofídios,,Cuibul ofidienilor,Логово офидианов,Змијска јазбина,Den Ophidiska hålan,Ophidian İni +The Halls of Fear,HHUSTR_E3M6,,,,Chodby strachu,Frygtens haller,Die Hallen der Angst,,La Koridoroj de Timo,Los Salones del Miedo,,Pelon salit,Les Couloirs de la Peur,,A Félelem Folyosói,Le Sale della Paura,恐怖の館,공포의 회관,De zalen van angst,Fryktens haller,Korytarze Strachu,Os Salões do Medo,,Sălile groazei,Залы страха,Дворана страха,Skräckens hallar,Korku Salonları +The Chasm,HHUSTR_E3M7,,,,Propast,Kløften,Der Abgrund,,La Fendego,El Abismo,,Rotko,Le Gouffre,,A Szakadék,L'abisso,裂け目,깊은 골,De kloof,Kløften,Przepaść,O Abismo,,Prăpastia,Пропасть,Понор лаве,Klyftan,Uçurum +D'Sparil's Keep,HHUSTR_E3M8,,,,D'Sparilova pevnost,D'Sparils borg,D'Sparils Außenposten,,Ĉefturo de Desparilo,Guarida de D'Sparil,,D'Sparilin linna,Le Donjon de D'Sparil,,D'Sparil Terme,La Dimora di D'Sparil,デ’スパリルの間,드'스파릴의 초소,D'Sparil's voorpost,D'Sparils borg,Baszta D'Sparila,Fortaleza de D'Sparil,,Palatul lui D'sparil,Крепость Д'Спарила,Д'Спарилова кула,D'Sparils borg,D'Sparil'in Kalesi +The Aquifer,HHUSTR_E3M9,,,,Zvodeň,Akvifer,Der Wasserspeicher,,La Akvigilo,El Acuífero,,Akviferi,L'Aquifère,,A Víztorony,L'acquedotto,帯水層,대수층,Het water reservoir,Akviferen,Wodociąg,O Aquífero,,Galerii acvifere,Водоносный слой,Водоносник,Akvifer,Akifer +Catafalque,HHUSTR_E4M1,,,,Katafalk,Katafalken,Katafalk,,Katafalko,Catafalco,,Katafalkki,Le Catafalque,,Ravatal,Catafalco,棺台,관대,Catafalk,Katafalken,Katafalk,Catafalco,,Catafalc,Катафалк,Одар,Katafalken,Katafalk +Blockhouse,HHUSTR_E4M2,,,,Tvrzka,Blokhuset,Blockhaus,,Blokhaŭso,Fortín,,Linnoitus,Le Fortin,,Gerendaház,Blocco di Case,丸太小屋,특화점,Blokhuis,Blokkhuset,Blokhauz,O Forte,,Fort,Блокгауз,Бункер,Blockhuset,Blok ev +Ambulatory,HHUSTR_E4M3,,,,Ochoz,Ambulatory,Wandelgang,,Ĥorĉirkaŭirejo,Ambulatorio,,Kuorikäytävä,Le Déambulatoire,,Kerengő,Ambulatorio,遊歩道,유보장,Kloostergang,Gangen,Krużganek,Ambulatório,,Clinică,Амбулатория,Амбуланта,Ambulerande,Ambulatuvar +Sepulcher,HHUSTR_E4M4,,,,Hrobka,Graven,Grabstätte,,Tombo,Sepulcro,,Hautakammio,Le Sépulcre,,Síremlék,Sepolcro,埋葬所,매장소,Grafsteen,Graven,Grób,Sepulcro,,Sepulcru,Гробница,Гробница,Gravskålen,Mezar +Great Stair,HHUSTR_E4M5,,,,Velké schody,Den store trappe,Große Treppe,,Granda Ŝtuparo,Gran Escalera,,Suuret portaat,Le Grand Escalier,,Nagy Lépcső,Grande Scala,大階段,특급 계단,Grote trap,Den store trappen,Wielka Gwiazda,Grande Escada,,Scara cea mare,Великая лестница,Велики степеник,Stora trappan,Büyük Merdiven +Halls of the Apostate,HHUSTR_E4M6,,,,Chodby odpadlictví,Apostaternes haller,Halle des Abtrünnigen,,Haloj de la Apostato,Salas de los Apóstatas,,Luopioiden salit,Les Halls de l'Apôtre,,A Hitehagyott Csarnoka,Sale dell'Apostata,背教者の館,배교자의 회관,Zalen van de afvallige,De frafalnes haller,Korytarze Odszczepieńca,Os Salões dos Apóstatas,,Sălile apostatului,Залы отступников,Дворана апостола,Apostaternas salar,Mürted Salonları +Ramparts of Perdition,HHUSTR_E4M7,,,,Náspy zatracení,Fortabelsens ramper,Wälle der Verdammnis,,Muregoj de Pereo,Murallas de la Perdición,,Kadotuksen vallit,Les Remparts de la Perdition,,A Kárhozat Támasza,Torrioni della Perdizione,破滅の塁壁,파멸의 성벽,Wallen van de verdoemenis,Fortapelsens voller,Wał Potępienia,Muralhas da Perdição,,Meterezele pierzaniei,Твердыни погибели,Бедем пропасти,Fördärvets ramper,Azap Surları +Shattered Bridge,HHUSTR_E4M8,,,,Rozbitý most,Den ødelagte bro,Zerstörte Brücke,,Frakasita Ponto,Puente Destrozado,,Särkynyt silta,Le Pont effondré,,Az Összeomlott Híd,Ponte Distrutto,崩落の橋,붕괴된 다리,Verbrijzelde brug,Den knuste broen,Zniszczony Most,Ponte Despedaçada,,Podul dărâmat,Разрушенный мост,Поломљен мост,Förstörd bro,Parçalanmış Köprü +Mausoleum,HHUSTR_E4M9,,,,Mauzoleum,,,,Maŭzoleo,Mausoleo,,Mausoleumi,Le Mausolée,,Mauzóleum,Mausoleo,霊廟,대영묘,,Mausoleet,Mauzoleum,Mausoléu,,Mausoleu,Мавзолей,Маузолеј,,Anıt Mezar +Ochre Cliffs,HHUSTR_E5M1,,,,Okrové útesy,Okkerklipper,Ockerfarbene Klippen,,Klifoj de Okro,Acantilados Ocres,,Okrajyrkänteet,Les Falaises Ochre,,Okker Szakadékok,Colline Ocra,黄土絶壁,황토 산맥,Okerkliffen,Oker-klippene,Ochrowe Klify,Penhascos Ocres,,Stâncile de ocru,Охровые утёсы,Окер брда,Ockerfärgade klippor,Ochre Kayalıkları +Rapids,HHUSTR_E5M2,,,,Peřeje,Rapider,Stromschnellen,,Rapidfluoj,Rápidos,,Koski,Les Rapides,,Zuhatagok,Rapide,奔流,여울,Stroomversnellingen,Strykene,Katarakty,Corredeiras,,Ape repezi,Стремнина,Брзак,Forsar,Akıntıları +Quay,HHUSTR_E5M3,,,,Nábřeží,Kaj,Kai,,Kajo,Muelle,,Satamalaituri,Le Quai,,Rakpart,Banchina,岸壁,부두,Kade,Kai,Wir,Cais,,Chei,Причал,Пристаниште,Kajen,Rıhtım +Courtyard,HHUSTR_E5M4,,,,Nádvoří,Slotsgården,Schlosshof,,Korto,Patio,,Linnanpiha,La Cour,,Pitvar,Cortile,中庭,안마당,Binnenplaats,Gårdsplass,Dziedziniec,Pátio,,Curte,Внутренний двор,Двориште,Gården,Avlu +Hydratyr,HHUSTR_E5M5,,,,Hydratýr,,,,Akvotjr,Hydratyr,,,L'Hydratyr,,Hidratáló,,ヒュドラテュール,식수공급처,,,Hydratyr,Reservatório,,Hidratir,Гидротир,Канализација,Hydratyr,Hydratyr +Colonnade,HHUSTR_E5M6,,,,Kolonáda,Kolonnader,Kolonnaden,,Kolonaro,Columnata,,Pylväikkö,La Colonnade,,Kolonnád,Colonnato,柱廊,열주의 길,Zuilengalerij,Kolonnade,Kolumnada,Colunata,,Colonadă,Колоннада,Колонада,Colonnade,Kolonat +Foetid Manse,HHUSTR_E5M7,,,,Smrdutá vila,Stinkende præstegård,Stinkendes Pfarrhaus,,Haladza Domego,Mansión Fétida,,Löyhkäävä kartano,Le Presbytère Fétide,,Bűzös Parókia,Fetido Castello,悪臭の牧師館,역겨운 목사관,Stinkende pastorie,Stinkende prestegård,Cuchnąca Plebania,Mansão Fétida,,Conac Fetid,Зловонный особняк,Фетидна кућа,Foetid Manse,Foetid Manse +Field of Judgement,HHUSTR_E5M8,,,,Soudná pole,Dommervældet,Richtstätte,,Kampo de Juĝo,Campo de Juicio,,Tuomion kenttä,Les Champs du Jugement,,Az Itélet Mezeje,Campo del Giudizio,審判之地,심판의 평야,Plaats van oordeelsvorming,Dømmekraftsområde,Pole Sądu,Campo de Julgamento,,Câmpul de Judecată,Поле высшего суда,Чистилиште,Domarplatsen,Yargı Alanı +Skein of D'sparil,HHUSTR_E5M9,,,,Hejno D'Sparilovo,D'sparils skein,DSparils Bau,,Fadenaro de D'Sparil,Madeja de D'Sparil,,D'Sparilin vyyhti,L'échevaux de D'Sparil,,D'Sparil Káosza,Groviglio di D'Sparil,デ'スパリルの枷,드'스파릴의 타래,D'Sparil's gebouw,Garn av D'sparil,Motek D'Sparila,Meada de D'Sparil,,Jurubița lui D'Sparil,Путаница Д'Спарила,Реке Д'Спарила,D'sparils skein,D'sparil Çileği +,,Strife,,,,,,,,,,,,,,,,,,,,,,,,,, +AREA 1: Sanctuary,TXT_STRIFE_MAP01,,,,ZÓNA 1: Svatyně,AREA 1: Fristedet,ZONE 1: Heiligtum,,AREO 1: Sanktejo,ÁREA 1: Santuario,,ALUE 1: Pyhäkkö,ZONE 1: Sanctuaire,,1. Terület: Szentély,AREA 1: Santuario,エリア 1: 聖域,구역 1: 성소,Zone 1: Heiligdom,OMRÅDE 1: Helligdom,Strefa 1: Sanktuarium,Área 1: Santuário,,ZONA 1: Sanctuar,МЕСТНОСТЬ 1: Святилище,,OMRÅDE 1: Fristad,ALAN 1: Sığınak +AREA 2: Town,TXT_STRIFE_MAP02,,,,ZÓNA 2: Město,AREA 2: By,ZONE 2: Stadt,,AREO 2: Urbeto,ÁREA 2: Pueblo,,ALUE 2: Kylä,ZONE 2: Ville,,2. Terület: Város,AREA 2: Città,"エリア 2: 町 ",구역 2: 마을,Zone 2: Stad,OMRÅDE 2: Byen,Strefa 2: Miasto,Área 2: Vila,,ZONA 2: Oraș,МЕСТНОСТЬ 2: Город,,OMRÅDE 2: Staden,ALAN 2: Şehir -AREA 3: Front Base,TXT_STRIFE_MAP03,,,,ZÓNA 3: Základna Fronty,AREA 3: Front Basis,ZONE 3: Basis der Front,,AREO 3: Front-Bazo,ÁREA 3: Base del Frente,,ALUE 3: Rintaman tukikohta,ZONE 3: Base du Front,3. Terület: Elülső bázis,AREA 3: Base del Fronte,エリア 3: フロント基地,구역 3: 프론트 기지,Zone 3: Front basis,OMRÅDE 3: Frontbase,Strefa 3: Baza Frontu,Área 3: Base da Frente,,ZONA 3: Baza Frontului,МЕСТНОСТЬ 3: База сопротивления,,OMRÅDE 3: Frontbasen,ALAN 3: Ön Taban -AREA 4: Power Station,TXT_STRIFE_MAP04,,,,ZÓNA 4: Elektrárna,AREA 4: Kraftværk,ZONE 4: Kraftwerk,,AREO 4: Elektrocentralo,ÁREA 4: Central eléctrica,,ALUE 4: Voimalaitos,ZONE 4: Centrale,4. Terület: Erőmű,AREA 4: Centrale Elettrica,エリア 4: 発電所,구역 4: 발전소,Zone 4: Energiecentrale,OMRÅDE 4: Kraftstasjon,Strefa 4: Elektrownia,Área 4: Usina de Energia,Área 4: Central Energética,ZONA 4: Centrala,МЕСТНОСТЬ 4: Электростанция,,OMRÅDE 4: Kraftverk,ALAN 4: Elektrik Santrali -AREA 5: Prison,TXT_STRIFE_MAP05,,,,ZÓNA 5: Vězení,AREA 5: Fængsel,ZONE 5: Gefängnis,,AREO 5: Malliberejo,ÁREA 5: Prisión,,ALUE 5: Vankila,ZONE 5: Prison,5. Terület: Börtön,AREA 5: Carcere,エリア 5: 刑務所,구역 5: 감옥,Zone 5: Gevangenis,OMRÅDE 5: Fengsel,Strefa 5: Więzienie,Área 5: Prisão,,ZONA 5: Închisoare,МЕСТНОСТЬ 5: Тюрьма,,OMRÅDE 5: Fängelse,ALAN 5: Cezaevi -AREA 6: Sewers,TXT_STRIFE_MAP06,,,,ZÓNA 6: Stoky,AREA 6: Kloakkerne,ZONE 6: Kanalisation,,AREO 6: Kloako,ÁREA 6: Alcantarillas,,ALUE 6: Viemärit,ZONE 6: Egouts,6. Terület: Kanális,AREA 6: Fogne,エリア 6: 下水道,구역 6: 하수도,Zone 6: Riolering,OMRÅDE 6: Kloakk,Strefa 6: Kanały,Área 6: Esgoto,,ZONA 6: Canal,МЕСТНОСТЬ 6: Канализация,,OMRÅDE 6: Avloppsledningar,ALAN 6: Kanalizasyonlar -AREA 7: Castle,TXT_STRIFE_MAP07,,,,ZÓNA 7: Hrad,AREA 7: Slot,ZONE 7: Burg,,AREO 7: Kastelo,ÁREA 7: Castillo,,ALUE 7: Linna,ZONE 7: Château,7. Terület: Vár,AREA 7: Castello,エリア 7: 城,구역 7: 성,Zone 7: Kasteel,OMRÅDE 7: Slottet,Strefa 7: Zamek,Área 7: Castelo,,ZONA 7: Castel,МЕСТНОСТЬ 7: Замок,,OMRÅDE 7: Slott,ALAN 7: Kale -AREA 8: Audience Chamber,TXT_STRIFE_MAP08,,,,ZÓNA 8: Audienční sál,AREA 8: Audience Chamber,ZONE 8: Audienzsaal,,AREO 8: Juĝejo,ÁREA 8: Sala de audiencias,,ALUE 8: Yleisösali,ZONE 8: Chambre d'Audience,8. Terület: Nézőtér,AREA 8: Sala delle Udienze,エリア 8: 観客席,구역 8: 알현실,Zone 8: Auditorium,OMRÅDE 8: Audienssalen,Strefa 8: Izba Audiencji,Área 8: Câmara de Audiências,,ZONA 8: Camera de audiențe,МЕСТНОСТЬ 8: Приёмная,,OMRÅDE 8: Publikrum,ALAN 8: İzleyici Odası -AREA 9: Castle: Programmer's Keep,TXT_STRIFE_MAP09,,,,ZÓNA 9: Hrad: Programátorovo doupě,AREA 9: Slot: Programmørens værelse,ZONE 9: Burg: Unterkunft des Programmierers,,AREO 9: Kastelo: Fortikaĵo de Programisto,ÁREA 9: Castillo: Guarida del Programador,,ALUE 9: Linna: Ohjelmoitsijan linnake,ZONE 9: Château: Donjon du Programmeur,9. Terület: Vár: Programozó parcellája,AREA 9: Castello: Dimora del Programmatore,エリア 9: 城内:プログラマーの間,구역 9: 성: 프로그래머의 성채,Zone 9: Kasteel: Onderdak van de programmeur,OMRÅDE 9: Slottet: Programmørens tårn,Strefa 9: Zamek: Baszta Programisty,Área 9: Castelo: Torre do Programador,,ZONA 9: Castel: Cetatea programatorului,МЕСТНОСТЬ 9: Цитадель Программиста,,OMRÅDE 9: Programmerarens behållning,ALAN 9: Kale: Programcının Kalesi -AREA 10: New Front Base,TXT_STRIFE_MAP10,,,,ZÓNA 10: Nová základna Fronty,AREA 10: Ny frontbase,ZONE 10: Neue Basis der Front,,AREO 10: Nova Frontbazo,ÁREA 10: Nueva base del Frente,,ALUE 10: Uusi Rintaman tukikohta,ZONE 10: Nouvelle Base du Front,10. Terület: Új első bázis,AREA 10: Nuova Base del Fronte,エリア 10: 新フロント基地,구역 10: 새 프론트 기지,Zone 10: Nieuwe Front basis,OMRÅDE 10: Den nye frontbasen,Strefa 10: Nowa Baza Frontu,Área 10: Nova Base da Frente,,ZONA 10: Noua bază a Frontului,МЕСТНОСТЬ 10: Новая база сопротивления,,OMRÅDE 10: Ny frontbas,ALAN 10: Yeni Ön Taban -AREA 11: Borderlands,TXT_STRIFE_MAP11,,,,ZÓNA 11: Pohraničí,AREA 11: Grænseland,ZONE 11: Grenzgebiete,,AREO 11: Limlando,ÁREA 11: Tierras fronterizas,,ALUE 11: Rajamaat,ZONE 11: Terres Sauvages,11. Terület: Peremvidék,AREA 11: Lande di Confine,エリア 11: 国境地帯,구역 11: 접경지,Zone 11: Grensgebieden,OMRÅDE 11: Grenseland,Strefa 11: Pogranicze,Área 11: Fronteira,,ZONA 11: Frontiere,МЕСТНОСТЬ 11: Пограничье,,OMRÅDE 11: Gränsområde,ALAN 11: Sınır Bölgeleri -AREA 12: The Temple of the Oracle,TXT_STRIFE_MAP12,,,,ZÓNA 12: Věštcův chrám,AREA 12: Oraklets tempel,ZONE 12: Der Tempel des Orakels,,AREO 12: La templo de la Orakolo,ÁREA 12: El templo del Oráculo,,ALUE 12: Oraakkelin temppeli,ZONE 12: Temple de l'Oracle,12. Terület: Az Orákulum Temploma,AREA 12: Il Tempio dell'Oracolo,エリア 12: オラクルの神殿,구역 12: 오라클의 신전,Zone 12: De tempel van het Orakel,OMRÅDE 12: Orakelets tempel,Strefa 12: Świątynia Wyroczni,Área 12: O Templo do Oráculo,,ZONA 12: Templul Oracolului,МЕСТНОСТЬ 12: Храм Оракула,,OMRÅDE 12: Oraklets tempel,ALAN 12: Kahin Tapınağı -AREA 13: Catacombs,TXT_STRIFE_MAP13,,,,ZÓNA 13: Katakomby,AREA 13: Katakomberne,ZONE 13: Katakomben,,AREO 13: Katakombo,ÁREA 13: Catacumbas,,ALUE 13: Katakombit,ZONE 13: Catacombes,13. Terület: Katakombák,AREA 13: Catacombe,エリア 13: 地下墓所,구역 13: 고대 묘지,Zone 13: Catacomben,OMRÅDE 13: Katakombene,Strefa 13: Katakumby,Área 13: Catacumbas,Área 13: Túmulos,ZONA 13: Catacombe,МЕСТНОСТЬ 13: Катакомбы,,OMRÅDE 13: Katakomberna,ALAN 13: Yeraltı Mezarları -AREA 14: Mines,TXT_STRIFE_MAP14,,,,ZÓNA 14: Doly,AREA 14: Miner,ZONE 14: Die Minen,,AREO 14: Minejo,ÁREA 14: Minas,,ALUE 14: Kaivokset,ZONE 14: Mines,14. Terület: Bánya,AREA 14: Miniere,エリア 14: 鉱山,구역 14: 광산,Zone 14: De mijnen,OMRÅDE 14: Minene,Strefa 14: Kopalnia,Área 14: Minas,,ZONA 14: Mine,МЕСТНОСТЬ 14: Шахты,,OMRÅDE 14: Gruvor,ALAN 14: Madenler -AREA 15: Fortress: Administration,TXT_STRIFE_MAP15,,,,ZÓNA 15: Pevnost: Administrace,AREA 15: Fæstning: Administration,ZONE 15: Festung: Administration,,AREO 15: Fortreso: Administrejo,ÁREA 15: Fortaleza: Administración,,ALUE 15: Linnoitus: hallinto,ZONE 15: Forteresse: Administration,15. Terület: Erőd: Elbírálás,AREA 15: Fortezza: Amministrazione,エリア 15: 要塞:管理室,구역 15: 요새: 중앙 관리소,Zone 15: Vesting: Administratieve organisatie,OMRÅDE 15: Festningen: Administrasjon,Strefa 15: Forteca: Administracja,Área 15: Fortaleza: Administração,,ZONA 15: Fortăreața: Administrația,МЕСТНОСТЬ 15: Крепость (администрация),,OMRÅDE 15: Fästning: Administration,ALAN 15: Kale: Yönetim -AREA 16: Fortress: Bishop's Tower,TXT_STRIFE_MAP16,,,,ZÓNA 16: Pevnost: Biskupova věž,AREA 16: Fæstning: Biskoppens tårn,ZONE 16: Festung: Bischofsturm,,AREO 16: Fortreso: Turo de la Episkopo,ÁREA 16: Fortaleza: Torre del Obispo,,ALUE 16: Linnoitus: Piispan torni,ZONE 16: Forteresse: Tour de l'évèque,16. Terület: Erőd: Püspök tornya,AREA 16: Fortezza: Torre del Vescovo,エリア 16: 要塞:ビショップの塔,구역 16: 요새: 비숍의 탑,Zone 16: Vesting: Bisschopstoren,OMRÅDE 16: Festningen: Biskopens tårn,Strefa 16: Forteca: Wieża Biskupa,Área 16: Fortaleza: Torre do Bispo,,ZONA 16: Fortăreața: Turnul Episcopului,МЕСТНОСТЬ 16: Крепость (башня Епископа),,OMRÅDE 16: Fästningen: Biskopens torn,ALAN 16: Kale: Piskopos Kulesi -AREA 17: Fortress: The Bailey,TXT_STRIFE_MAP17,,,,ZÓNA 17: Pevnost: Předhradí,AREA 17: Fæstning: Bailey,ZONE 17: Festung: Vorhof,,AREO 17: Fortreso: Ĉirkaŭmurigita korto,ÁREA 17: Fortaleza: Patio cerrado,,ALUE 17: Linnoitus: linnanpiha,ZONE 17: Forteresse: Mur d'enceinte,17. Terület: Erőd: Várfal,AREA 17: Fortezza: Bastione,エリア 17: 要塞:ベイリー,구역 17: 요새: 안뜰,Zone 17: Vesting: Voorplein,OMRÅDE 17: Festningen: Borggården,Strefa 17: Forteca: Mur Obronny,Área 17: Fortaleza: O Pátio,,ZONA 17: Fortăreața: Curte,МЕСТНОСТЬ 17: Крепость (двор),,OMRÅDE 17: Fästning: Bailey,ALAN 17: Kale: Dış avlu -AREA 18: Fortress: Stores,TXT_STRIFE_MAP18,,,,ZÓNA 18: Pevnost: Sklady,AREA 18: Fæstning: Magasiner,ZONE 18: Festung: Lager,,AREO 18: Fortreso: Magazeno,ÁREA 18: Fortaleza: Almacenes,,ALUE 18: Linnoitus: varastot,ZONE 18: Forteresse: Réserves,18. Terület: Erőd: Üzletek,AREA 18: Fortezza: Negozi,エリア 18: 要塞:商店,구역 18: 요새: 격납고,Zone 18: Vesting: Lager,OMRÅDE 18: Festningen: Lagrene,Strefa 18: Forteca: Sklepy,Área 18: Fortaleza: Reservas,,ZONA 18: Fortăreața: Depozite,МЕСТНОСТЬ 18: Крепость (склады),,OMRÅDE 18: Fästning: Butiker,ALAN 18: Kale: Mağazalar -AREA 19: Fortress: Security Complex,TXT_STRIFE_MAP19,,,,ZÓNA 19: Pevnost: Bezpečnostní komplex,AREA 19: Fæstning: Sikkerhedskompleks,ZONE 19: Festung: Sicherheitsanlage,,AREO 19: Fortreso: Sekurkomplekso,ÁREA 19: Fortaleza: Complejo de seguridad,,ALUE 19: Linnoitus: turvallisuuskeskus,ZONE 19: Forteresse: Complexe Sécurité,19. Terület: Erőd: Biztonsági Részleg,AREA 19: Fortezza: Complesso di Sicurezza,エリア 19: 要塞:複合警備所,구역 19: 요새: 보안 담당 기지,Zone 19: Vesting: Beveiligingssysteem,OMRÅDE 19: Festningen: Sikkerhetskomplekset,Strefa 19: Forteca: Kompleks Ochronny,Área 19: Fortaleza: Complexo de Segurança,,ZONA 19: Fortăreața: Complex de securitate,МЕСТНОСТЬ 19: Крепость (охранный комплекс),,OMRÅDE 19: Fästning: Säkerhetskomplex,ALAN 19: Kale: Güvenlik Kompleksi -AREA 20: Factory: Receiving,TXT_STRIFE_MAP20,,,,ZÓNA 20: Továrna: Příjem,AREA 20: Fabrik: Modtagelse,ZONE 20: Fabrik: Empfang,,AREO 20: Fabriko: Ricevejo,ÁREA 20: Fábrica: Recepción,,ALUE 20: Tehdas: vastaanotto,ZONE 20: Usine: Réception,20. Terület: Gyár: Beérkeztető,AREA 20: Fabbrica: Ricevimento,"エリア 20: 工場:受取所 +AREA 3: Front Base,TXT_STRIFE_MAP03,,,,ZÓNA 3: Základna Fronty,AREA 3: Front Basis,ZONE 3: Basis der Front,,AREO 3: Front-Bazo,ÁREA 3: Base del Frente,,ALUE 3: Rintaman tukikohta,ZONE 3: Base du Front,,3. Terület: Elülső bázis,AREA 3: Base del Fronte,エリア 3: フロント基地,구역 3: 프론트 기지,Zone 3: Front basis,OMRÅDE 3: Frontbase,Strefa 3: Baza Frontu,Área 3: Base da Frente,,ZONA 3: Baza Frontului,МЕСТНОСТЬ 3: База сопротивления,,OMRÅDE 3: Frontbasen,ALAN 3: Ön Taban +AREA 4: Power Station,TXT_STRIFE_MAP04,,,,ZÓNA 4: Elektrárna,AREA 4: Kraftværk,ZONE 4: Kraftwerk,,AREO 4: Elektrocentralo,ÁREA 4: Central eléctrica,,ALUE 4: Voimalaitos,ZONE 4: Centrale,,4. Terület: Erőmű,AREA 4: Centrale Elettrica,エリア 4: 発電所,구역 4: 발전소,Zone 4: Energiecentrale,OMRÅDE 4: Kraftstasjon,Strefa 4: Elektrownia,Área 4: Usina de Energia,Área 4: Central Energética,ZONA 4: Centrala,МЕСТНОСТЬ 4: Электростанция,,OMRÅDE 4: Kraftverk,ALAN 4: Elektrik Santrali +AREA 5: Prison,TXT_STRIFE_MAP05,,,,ZÓNA 5: Vězení,AREA 5: Fængsel,ZONE 5: Gefängnis,,AREO 5: Malliberejo,ÁREA 5: Prisión,,ALUE 5: Vankila,ZONE 5: Prison,,5. Terület: Börtön,AREA 5: Carcere,エリア 5: 刑務所,구역 5: 감옥,Zone 5: Gevangenis,OMRÅDE 5: Fengsel,Strefa 5: Więzienie,Área 5: Prisão,,ZONA 5: Închisoare,МЕСТНОСТЬ 5: Тюрьма,,OMRÅDE 5: Fängelse,ALAN 5: Cezaevi +AREA 6: Sewers,TXT_STRIFE_MAP06,,,,ZÓNA 6: Stoky,AREA 6: Kloakkerne,ZONE 6: Kanalisation,,AREO 6: Kloako,ÁREA 6: Alcantarillas,,ALUE 6: Viemärit,ZONE 6: Egouts,,6. Terület: Kanális,AREA 6: Fogne,エリア 6: 下水道,구역 6: 하수도,Zone 6: Riolering,OMRÅDE 6: Kloakk,Strefa 6: Kanały,Área 6: Esgoto,,ZONA 6: Canal,МЕСТНОСТЬ 6: Канализация,,OMRÅDE 6: Avloppsledningar,ALAN 6: Kanalizasyonlar +AREA 7: Castle,TXT_STRIFE_MAP07,,,,ZÓNA 7: Hrad,AREA 7: Slot,ZONE 7: Burg,,AREO 7: Kastelo,ÁREA 7: Castillo,,ALUE 7: Linna,ZONE 7: Château,,7. Terület: Vár,AREA 7: Castello,エリア 7: 城,구역 7: 성,Zone 7: Kasteel,OMRÅDE 7: Slottet,Strefa 7: Zamek,Área 7: Castelo,,ZONA 7: Castel,МЕСТНОСТЬ 7: Замок,,OMRÅDE 7: Slott,ALAN 7: Kale +AREA 8: Audience Chamber,TXT_STRIFE_MAP08,,,,ZÓNA 8: Audienční sál,AREA 8: Audience Chamber,ZONE 8: Audienzsaal,,AREO 8: Juĝejo,ÁREA 8: Sala de audiencias,,ALUE 8: Yleisösali,ZONE 8: Chambre d'Audience,,8. Terület: Nézőtér,AREA 8: Sala delle Udienze,エリア 8: 観客席,구역 8: 알현실,Zone 8: Auditorium,OMRÅDE 8: Audienssalen,Strefa 8: Izba Audiencji,Área 8: Câmara de Audiências,,ZONA 8: Camera de audiențe,МЕСТНОСТЬ 8: Приёмная,,OMRÅDE 8: Publikrum,ALAN 8: İzleyici Odası +AREA 9: Castle: Programmer's Keep,TXT_STRIFE_MAP09,,,,ZÓNA 9: Hrad: Programátorovo doupě,AREA 9: Slot: Programmørens værelse,ZONE 9: Burg: Unterkunft des Programmierers,,AREO 9: Kastelo: Fortikaĵo de Programisto,ÁREA 9: Castillo: Guarida del Programador,,ALUE 9: Linna: Ohjelmoitsijan linnake,ZONE 9: Château: Donjon du Programmeur,,9. Terület: Vár: Programozó parcellája,AREA 9: Castello: Dimora del Programmatore,エリア 9: 城内:プログラマーの間,구역 9: 성: 프로그래머의 성채,Zone 9: Kasteel: Onderdak van de programmeur,OMRÅDE 9: Slottet: Programmørens tårn,Strefa 9: Zamek: Baszta Programisty,Área 9: Castelo: Torre do Programador,,ZONA 9: Castel: Cetatea programatorului,МЕСТНОСТЬ 9: Цитадель Программиста,,OMRÅDE 9: Programmerarens behållning,ALAN 9: Kale: Programcının Kalesi +AREA 10: New Front Base,TXT_STRIFE_MAP10,,,,ZÓNA 10: Nová základna Fronty,AREA 10: Ny frontbase,ZONE 10: Neue Basis der Front,,AREO 10: Nova Frontbazo,ÁREA 10: Nueva base del Frente,,ALUE 10: Uusi Rintaman tukikohta,ZONE 10: Nouvelle Base du Front,,10. Terület: Új első bázis,AREA 10: Nuova Base del Fronte,エリア 10: 新フロント基地,구역 10: 새 프론트 기지,Zone 10: Nieuwe Front basis,OMRÅDE 10: Den nye frontbasen,Strefa 10: Nowa Baza Frontu,Área 10: Nova Base da Frente,,ZONA 10: Noua bază a Frontului,МЕСТНОСТЬ 10: Новая база сопротивления,,OMRÅDE 10: Ny frontbas,ALAN 10: Yeni Ön Taban +AREA 11: Borderlands,TXT_STRIFE_MAP11,,,,ZÓNA 11: Pohraničí,AREA 11: Grænseland,ZONE 11: Grenzgebiete,,AREO 11: Limlando,ÁREA 11: Tierras fronterizas,,ALUE 11: Rajamaat,ZONE 11: Terres Sauvages,,11. Terület: Peremvidék,AREA 11: Lande di Confine,エリア 11: 国境地帯,구역 11: 접경지,Zone 11: Grensgebieden,OMRÅDE 11: Grenseland,Strefa 11: Pogranicze,Área 11: Fronteira,,ZONA 11: Frontiere,МЕСТНОСТЬ 11: Пограничье,,OMRÅDE 11: Gränsområde,ALAN 11: Sınır Bölgeleri +AREA 12: The Temple of the Oracle,TXT_STRIFE_MAP12,,,,ZÓNA 12: Věštcův chrám,AREA 12: Oraklets tempel,ZONE 12: Der Tempel des Orakels,,AREO 12: La templo de la Orakolo,ÁREA 12: El templo del Oráculo,,ALUE 12: Oraakkelin temppeli,ZONE 12: Temple de l'Oracle,,12. Terület: Az Orákulum Temploma,AREA 12: Il Tempio dell'Oracolo,エリア 12: オラクルの神殿,구역 12: 오라클의 신전,Zone 12: De tempel van het Orakel,OMRÅDE 12: Orakelets tempel,Strefa 12: Świątynia Wyroczni,Área 12: O Templo do Oráculo,,ZONA 12: Templul Oracolului,МЕСТНОСТЬ 12: Храм Оракула,,OMRÅDE 12: Oraklets tempel,ALAN 12: Kahin Tapınağı +AREA 13: Catacombs,TXT_STRIFE_MAP13,,,,ZÓNA 13: Katakomby,AREA 13: Katakomberne,ZONE 13: Katakomben,,AREO 13: Katakombo,ÁREA 13: Catacumbas,,ALUE 13: Katakombit,ZONE 13: Catacombes,,13. Terület: Katakombák,AREA 13: Catacombe,エリア 13: 地下墓所,구역 13: 고대 묘지,Zone 13: Catacomben,OMRÅDE 13: Katakombene,Strefa 13: Katakumby,Área 13: Catacumbas,Área 13: Túmulos,ZONA 13: Catacombe,МЕСТНОСТЬ 13: Катакомбы,,OMRÅDE 13: Katakomberna,ALAN 13: Yeraltı Mezarları +AREA 14: Mines,TXT_STRIFE_MAP14,,,,ZÓNA 14: Doly,AREA 14: Miner,ZONE 14: Die Minen,,AREO 14: Minejo,ÁREA 14: Minas,,ALUE 14: Kaivokset,ZONE 14: Mines,,14. Terület: Bánya,AREA 14: Miniere,エリア 14: 鉱山,구역 14: 광산,Zone 14: De mijnen,OMRÅDE 14: Minene,Strefa 14: Kopalnia,Área 14: Minas,,ZONA 14: Mine,МЕСТНОСТЬ 14: Шахты,,OMRÅDE 14: Gruvor,ALAN 14: Madenler +AREA 15: Fortress: Administration,TXT_STRIFE_MAP15,,,,ZÓNA 15: Pevnost: Administrace,AREA 15: Fæstning: Administration,ZONE 15: Festung: Administration,,AREO 15: Fortreso: Administrejo,ÁREA 15: Fortaleza: Administración,,ALUE 15: Linnoitus: hallinto,ZONE 15: Forteresse: Administration,,15. Terület: Erőd: Elbírálás,AREA 15: Fortezza: Amministrazione,エリア 15: 要塞:管理室,구역 15: 요새: 중앙 관리소,Zone 15: Vesting: Administratieve organisatie,OMRÅDE 15: Festningen: Administrasjon,Strefa 15: Forteca: Administracja,Área 15: Fortaleza: Administração,,ZONA 15: Fortăreața: Administrația,МЕСТНОСТЬ 15: Крепость (администрация),,OMRÅDE 15: Fästning: Administration,ALAN 15: Kale: Yönetim +AREA 16: Fortress: Bishop's Tower,TXT_STRIFE_MAP16,,,,ZÓNA 16: Pevnost: Biskupova věž,AREA 16: Fæstning: Biskoppens tårn,ZONE 16: Festung: Bischofsturm,,AREO 16: Fortreso: Turo de la Episkopo,ÁREA 16: Fortaleza: Torre del Obispo,,ALUE 16: Linnoitus: Piispan torni,ZONE 16: Forteresse: Tour de l'évèque,,16. Terület: Erőd: Püspök tornya,AREA 16: Fortezza: Torre del Vescovo,エリア 16: 要塞:ビショップの塔,구역 16: 요새: 비숍의 탑,Zone 16: Vesting: Bisschopstoren,OMRÅDE 16: Festningen: Biskopens tårn,Strefa 16: Forteca: Wieża Biskupa,Área 16: Fortaleza: Torre do Bispo,,ZONA 16: Fortăreața: Turnul Episcopului,МЕСТНОСТЬ 16: Крепость (башня Епископа),,OMRÅDE 16: Fästningen: Biskopens torn,ALAN 16: Kale: Piskopos Kulesi +AREA 17: Fortress: The Bailey,TXT_STRIFE_MAP17,,,,ZÓNA 17: Pevnost: Předhradí,AREA 17: Fæstning: Bailey,ZONE 17: Festung: Vorhof,,AREO 17: Fortreso: Ĉirkaŭmurigita korto,ÁREA 17: Fortaleza: Patio cerrado,,ALUE 17: Linnoitus: linnanpiha,ZONE 17: Forteresse: Mur d'enceinte,,17. Terület: Erőd: Várfal,AREA 17: Fortezza: Bastione,エリア 17: 要塞:ベイリー,구역 17: 요새: 안뜰,Zone 17: Vesting: Voorplein,OMRÅDE 17: Festningen: Borggården,Strefa 17: Forteca: Mur Obronny,Área 17: Fortaleza: O Pátio,,ZONA 17: Fortăreața: Curte,МЕСТНОСТЬ 17: Крепость (двор),,OMRÅDE 17: Fästning: Bailey,ALAN 17: Kale: Dış avlu +AREA 18: Fortress: Stores,TXT_STRIFE_MAP18,,,,ZÓNA 18: Pevnost: Sklady,AREA 18: Fæstning: Magasiner,ZONE 18: Festung: Lager,,AREO 18: Fortreso: Magazeno,ÁREA 18: Fortaleza: Almacenes,,ALUE 18: Linnoitus: varastot,ZONE 18: Forteresse: Réserves,,18. Terület: Erőd: Üzletek,AREA 18: Fortezza: Negozi,エリア 18: 要塞:商店,구역 18: 요새: 격납고,Zone 18: Vesting: Lager,OMRÅDE 18: Festningen: Lagrene,Strefa 18: Forteca: Sklepy,Área 18: Fortaleza: Reservas,,ZONA 18: Fortăreața: Depozite,МЕСТНОСТЬ 18: Крепость (склады),,OMRÅDE 18: Fästning: Butiker,ALAN 18: Kale: Mağazalar +AREA 19: Fortress: Security Complex,TXT_STRIFE_MAP19,,,,ZÓNA 19: Pevnost: Bezpečnostní komplex,AREA 19: Fæstning: Sikkerhedskompleks,ZONE 19: Festung: Sicherheitsanlage,,AREO 19: Fortreso: Sekurkomplekso,ÁREA 19: Fortaleza: Complejo de seguridad,,ALUE 19: Linnoitus: turvallisuuskeskus,ZONE 19: Forteresse: Complexe Sécurité,,19. Terület: Erőd: Biztonsági Részleg,AREA 19: Fortezza: Complesso di Sicurezza,エリア 19: 要塞:複合警備所,구역 19: 요새: 보안 담당 기지,Zone 19: Vesting: Beveiligingssysteem,OMRÅDE 19: Festningen: Sikkerhetskomplekset,Strefa 19: Forteca: Kompleks Ochronny,Área 19: Fortaleza: Complexo de Segurança,,ZONA 19: Fortăreața: Complex de securitate,МЕСТНОСТЬ 19: Крепость (охранный комплекс),,OMRÅDE 19: Fästning: Säkerhetskomplex,ALAN 19: Kale: Güvenlik Kompleksi +AREA 20: Factory: Receiving,TXT_STRIFE_MAP20,,,,ZÓNA 20: Továrna: Příjem,AREA 20: Fabrik: Modtagelse,ZONE 20: Fabrik: Empfang,,AREO 20: Fabriko: Ricevejo,ÁREA 20: Fábrica: Recepción,,ALUE 20: Tehdas: vastaanotto,ZONE 20: Usine: Réception,,20. Terület: Gyár: Beérkeztető,AREA 20: Fabbrica: Ricevimento,"エリア 20: 工場:受取所 ",구역 20: 공장: 수납구역,Zone 20: Fabriek: Ontvangst,OMRÅDE 20: Fabrikken: Mottak,Strefa 20: Fabryka: Odbiór,Área 20: Fábrica: Recebimento,,ZONA 20: Fabrica: Recepție,МЕСТНОСТЬ 20: Фабрика (приём),,OMRÅDE 20: Fabrik: Mottagning,ALAN 20: Fabrika: Teslim Alma -AREA 21: Factory: Manufacturing,TXT_STRIFE_MAP21,,,,ZÓNA 21: Továrna: Výroba,AREA 21: Fabrik: Fremstilling,ZONE 21: Fabrik: Herstellung,,AREO 21: Fabriko: Manufakturo,ÁREA 21: Fábrica: Manufactura,,ALUE 21: Tehdas: tuotanto,ZONE 21: Usine: Manufacture,21. Terület: Gyár: Gyártósor,AREA 21: Fabbrica: Manifattura,エリア 21: 工場:製造機関,구역 21: 공장: 조립시설,Zone 21: Fabriek: Productie,OMRÅDE 21: Fabrikk: Produksjon,Strefa 21: Fabryka: Przetwórstwo,Área 21: Fábrica: Manufatura,,ZONA 21: Fabrica: Procesare,МЕСТНОСТЬ 21: Фабрика (производство),,OMRÅDE 21: Fabrik: Tillverkning,ALAN 21: Fabrika: İmalat -AREA 22: Factory: Forge,TXT_STRIFE_MAP22,,,,ZÓNA 22: Továrna: Slévárna,AREA 22: Fabrik: Smedje,ZONE 22: Fabrik: Schmiede,,AREO 22: Fabriko: Forĝejo,ÁREA 22: Fábrica: Forja,,ALUE 22 Tehdas: paja,ZONE 22: Usine: Forge,22. Terület: Gyár: Kohó,AREA 22: Fabbrica: Fucina,エリア 22: 工場:鉄工所,구역 22: 공장: 제련소,Zone 22: Fabriek: Smederij,OMRÅDE 22: Fabrikk: Smie,Strefa 22: Fabryka: Kuźnia,Área 22: Fábrica: Forja,,ZONA 22: Fabrica: Forja,МЕСТНОСТЬ 22: Фабрика (кузня),,OMRÅDE 22: Fabrik: Smedja,ALAN 22: Fabrika: Demirhane -AREA 23: Order Commons,TXT_STRIFE_MAP23,,,,ZÓNA 23: Náves Řádu,AREA 23: Bestillingscentral,ZONE 23: Mensa des Ordens,,AREO 23: Komunumo de La Ordeno,ÁREA 23: Comuna de La Orden,,ALUE 23: Veljeskunnan messi,ZONE 23: Mess de l'Ordre,23. Terület: Rendi köztér,AREA 23: Camera dell'Ordine,エリア 23: オーダーコモンズ,구역 23: 오더 식당가,Zone 23: Mensa van de orde,OMRÅDE 23: Bestillingsallmenning,Strefa 23: Wikt Zakonu,Área 23: Câmara da Ordem,,ZONA 23: Decontare comenzi,МЕСТНОСТЬ 23: Поселение Ордена,,OMRÅDE 23: Beställningscentraler,ALAN 23: Siparişin ortak alanı -AREA 24: Factory: Conversion Chapel,TXT_STRIFE_MAP24,,,,ZÓNA 24: Továrna: Kaple konverze,AREA 24: Fabrik: Omdannelseskapel,ZONE 24: Umwandlungskapelle,,AREO 24: Fabriko: Konvert-kapelo,ÁREA 24: Fábrica: Capilla de conversión,,ALUE 24: Tehdas: käännytyskappeli,ZONE 24: Usine: Chapelle de Conversion,24. Terület: A megtérés kápolnája,AREA 24: Fabbrica: Cappella di Conversione,エリア 24: 工場:改宗礼拝堂,구역 24: 공장: 전향실,Zone 24: Verbouwingskapel,OMRÅDE 24: Fabrikk: Konverteringskapell,Strefa 24: Fabryka: Kaplica Przemiany,Área 24: Fábrica: Capela de Conversão,,ZONA 24: Fabrica: Capela de conversie,МЕСТНОСТЬ 24: Фабрика (часовня обращения),,OMRÅDE 24: Fabrik: Omvandlingskapell,ALAN 24: Fabrika: Dönüşüm Şapeli -AREA 25: Catacombs: Ruined Temple,TXT_STRIFE_MAP25,,,,ZÓNA 25: Katakomby: Zničený chrám,AREA 25: Katakomberne: Ruineret tempel,ZONE 25: Katakomben: Zerstörter Tempel,,AREO: 25: Katakombo: Ruina templo,ÁREA 25: Catacumbas: Templo arruinado,,ALUE 25: Katakombit: temppeliraunio,ZONE 25: Catacombes: Temple Ruiné,25. Terület: Katakombák: Romtemplom,AREA 25: Catacombe: Tempio in Rovina,エリア 25: 地下墓所:没落した寺院,구역 25: 고대 묘지: 무너진 사원,Zone 25: Catacomben: Vernietigde tempel,OMRÅDE 25: Katakombene: Ruinert tempel,Strefa 25: Katakumby: Zrujnowana Świątynia,Área 25: Catacumbas: Templo Arruinado,Área 25: Túmulos: Templo Arruinado,ZONA 25: Catacombe: Templu în ruine,МЕСТНОСТЬ 25: Катакомбы (руины храма),,OMRÅDE 25: Katakomber: Förfallet tempel,ALAN 25: Yeraltı Mezarları: Yıkık Tapınak -AREA 26: Proving Grounds,TXT_STRIFE_MAP26,,,,ZÓNA 26: Vojenský újezd,AREA 26: Prøvesteder,ZONE 26: Testgelände,,AREO 26: Provejo,ÁREA 26: Campo de pruebas,,ALUE 26: Koetuspaikka,ZONE 26: Terrain d'entraînement,26. Terület: Próbatételek Földje,AREA 26: Banco di Prova,エリア 26: 試練場,구역 26: 증명의 전장,Zone 26: Testgebied,OMRÅDE 26: Prøveplassen,Strefa 26: Poligon Wojskowy,Área 26: Campo de Treinamento,Área 26: Campo de Treino,ZONA 26: Tabăra de instruire,МЕСТНОСТЬ 26: Испытательный полигон,,OMRÅDE 26: Provningsområden,ALAN 26: Kanıtlama Alanları -AREA 27: The Lab,TXT_STRIFE_MAP27,,,,ZÓNA 27: Laboratoř,AREA 27: Laboratoriet,ZONE 27: Das Labor,,AREO 27: La laboratorio,ÁREA 27: El laboratorio,,ALUE 27: Laboratorio,ZONE 27: Laboratoire,27. Terület: A labor,AREA 27: Il Laboratorio,エリア 27: 研究所,구역 27: 연구소,Zone 27: Het laboratorium,OMRÅDE 27: Laboratoriet,Strefa 27: Laboratorium,Área 27: O Laboratório,,ZONA 27: Laboratorul,МЕСТНОСТЬ 27: Лаборатория,,OMRÅDE 27: Labbet,ALAN 27: Laboratuvar -AREA 28: Alien Ship,TXT_STRIFE_MAP28,,,,ZÓNA 28: Mimozemská loď,AREA 28: Fremmed skib,ZONE 28: Außerirdisches Schiff,,AREO 28: Aliplaneda ŝipo,ÁREA 28: Nave alienígena,,ALUE 28: Muukalaisalus,ZONE 28: Vaisseau Alien,28. Terület: Idegen űrhajó,AREA 28: Nave Aliena,エリア 28: エイリアンの船,구역 28: 외계 우주선,Zone 28: Buitenaards schip,OMRÅDE 28: Det fremmede skipet,Strefa 28: Statek Obcych,Área 28: Nave Alienígena,,ZONA 28: Nava extraterestră,МЕСТНОСТЬ 28: Корабль пришельцев,,OMRÅDE 28: Främmande skepp,ALAN 28: Uzaylı Gemisi -AREA 29: Entity's Lair,TXT_STRIFE_MAP29,,,,ZÓNA 29: Doupě Bytosti,AREA 29: Entitetsnesten,ZONE 29: Das Nest der Entität,,AREO 29: Nestego de Estulo,ÁREA 29: Escondite de la Entidad,,ALUE 29: Tosiolevan maja,ZONE 29: Demeure de L'Entité,29. Terület: A Teremtvény Búvóhelye,AREA 29: Tana dell'Entità,エリア 29: エンティティの隠れ家,구역 29: 엔티티의 소굴,Zone 29: Het nest van de entiteit,OMRÅDE 29: Enhetens hule,Strefa 29: Leże Bytu,Área 29: Covil da Entidade,,ZONA 29: Cuibul Entității,МЕСТНОСТЬ 29: Логово Сущности,,OMRÅDE 29: Väsendets lya,ALAN 29: Varlığın İni -AREA 30: Abandoned Front Base,TXT_STRIFE_MAP30,,,,ZÓNA 30: Opuštěná základna Fronty,AREA 30: Forladt frontbase,ZONE 30: Verlassene Basis der Front,,AREO 30: Forlasita Front-Bazo,ÁREA 30: Base abandonada del Frente,,ALUE 30: Hylätty Rintaman tukikohta,ZONE 30: Base Abandonnée du Front,30. Terület: Elhagyatott Előbázis,AREA 30: Base del Fronte abbandonata,エリア 30: 放棄された基地,구역 30: 버려진 프론트 기지,Zone 30: Verlaten frontbasis,OMRÅDE 30: Forlatt frontbase,Strefa 30: Opuszczona Baza Frontu,Área 30: Base da Frente Abandonada,,ZONA 30: Baza abandonată a Frontului,МЕСТНОСТЬ 30: Заброшенная база сопротивления,,OMRÅDE 30: Övergiven frontbas,ALAN 30: Terk Edilmiş Ön Üs -AREA 31: Training Facility,TXT_STRIFE_MAP31,,,,ZÓNA 31: Výcvikové zařízení,AREA 31: Træningsanlæg,ZONE 31: Trainingseinrichtung,,AREO 31: Trejnejo,ÁREA 31: Zona de entrenamiento,,ALUE 31: Koulutuslaitos,ZONE 31: Complexe d'Entraînement,31. Terület: Kiképzőbázis,AREA 31: Struttura di Addestramento,エリア 31: 研修施設,구역 31: 훈련 시설,Zone 31: Trainingsfaciliteit,OMRÅDE 31: Treningsanlegg,Strefa 31: Centrum Szkoleniowe,Área 31: Instalação de Treinamento,,ZONA 31: Spațiul de antrenament,МЕСТНОСТЬ 31: Тренировочный корпус,,OMRÅDE 31: Utbildningsanläggning,ALAN 31: Eğitim Tesisi -AREA 1: Sanctuary,TXT_STRIFE_MAP32,,,,ZÓNA 1: Svatyně,AREA 1: Fristedet,ZONE 1: Heiligtum,,AREO 1: Sanktejo,ÁREA 1: Santuario,,ALUE 1: Pyhäkkö,ZONE 1: Sanctuaire,1. Terület: Szentély,AREA 1: Santuario,エリア 1: 聖域 ,구역 1: 성소,Zone 1: Heiligdom,OMRÅDE 1: Fristedet,Strefa 1: Sanktuarium,Área 1: Santuário,,ZONA 1: Sanctuar,МЕСТНОСТЬ 1: Святилище,,OMRÅDE 1: Fristad,ALAN 1: Sığınak -AREA 2: Town,TXT_STRIFE_MAP33,,,,ZÓNA 2: Město,AREA 2: By,ZONE 2: Stadt,,AREO 2: Urbeto,ÁREA 2: Pueblo,,ALUE 2: Kylä,ZONE 2: Ville,2. Terület: Város,AREA 2: Città,エリア 2: 町,구역 2: 마을,Zone 2: Stad,OMRÅDE 2: By,Strefa 2: Miasto,Área 2: Vila,,ZONA 2: Oraș,МЕСТНОСТЬ 2: Город,,OMRÅDE 2: Stad,ALAN 2: Şehir -AREA 3: Movement Base,TXT_STRIFE_MAP34,,,,ZÓNA 3: Rebelská základna,AREA 3: Front Basis,ZONE 3: Rebellenbasis,,AREO 3: Movad-bazo,ÁREA 3: Base del Movimiento,,ALUE 3: Liikkeen tukikohta,ZONE 3: Base du Front,3. Terület: Mozgalmi Bázis,AREA 3: Base del Movimento,エリア 3: 移転基地,구역 3: 반군 기지,Zone 3: Front basis,OMRÅDE 3: Bevegelsesbase,Strefa 3: Baza Ruchu Oporu,Área 3: Base do Movimento,,ZONA 3: Baza rezistenței,МЕСТНОСТЬ 3: База сопротивления,,OMRÅDE 3: Förflyttningsbas,ALAN 3: Hareket Üssü -AREA 35: Factory: Production,TXT_STRIFE_MAP35,,,,ZÓNA 35: Továrna: Produkce,AREA 35: Fabrik: Produktion,ZONE 35: Fabrik: Produktion,,AREO 35: Fabriko: Produktejo,ÁREA 35: Fábrica: Producción,,ALUE 35: Tehdas: tuotanto,ZONE 35: Usine: Production,35. Terület: Gyár: Termelés,AREA 35: Fabbrica: Produzione,エリア 35: 工場 : 生産ライン,구역 35: 공장: 제작실,Zone 35: Fabriek: Productie,OMRÅDE 35: Fabrikk: Produksjon,Strefa 35: Fabryka: Produkcja,Área 35: Fábrica: Produção,,ZONA 35: Fabrica: Producție,МЕСТНОСТЬ 35: Фабрика (производство),,OMRÅDE 35: Fabrik: Produktion,ALAN 35: Fabrika: Üretim -AREA 36: Castle Clash,TXT_STRIFE_MAP36,,,,ZÓNA 36: Střet na hradě,AREA 36: Slotskampe,ZONE 36: Burg-Konflikt,,AREO 36: Batalo en la kastelo,ÁREA 36: Ataque al castillo,,ALUE 36: Linnayhteenotto,ZONE 36: Bataille du Château,36: Terület: Vári ütközet,AREA 36: Collisione di Castello,エリア 36: キャッスルクラッシュ,구역 36: 성채간의 충돌,Zone 36: Kasteelconflict,OMRÅDE 36: Slottskampen,Strefa 36: Potyczka w Zamku,Área 36: Ataque ao Castelo,,ZONA 36: Bătălia castelului,МЕСТНОСТЬ 36: Битва в замке,,OMRÅDE 36: Slottet Clash,ALAN 36: Kale Çatışması -AREA 37: Killing Grounds,TXT_STRIFE_MAP37,,,,ZÓNA 37: Popravčí zahrady,AREA 37: Drabsområder,ZONE 37: Kampfgelände,,AREO 37: Tereno de mortigado,ÁREA 37: Campo de matanza,,ALUE 37: Tappotanner,ZONE 37: Zone de Chasse,37. Terület: Gyilkos Vidék,AREA 37: Campi di Uccisione,エリア 37: 殺害者の地,구역 37: 살육의 전장,Zone 37: Slagveld,OMRÅDE 37: Drapsplasser,Strefa 37: Śmiercionośny Grunt,Área 37: Campo de Matança,,ZONA 37: Teren de ucis,МЕСТНОСТЬ 37: Сектора обстрела,,OMRÅDE 37: Dödsmark,ALAN 37: Öldürme Alanları -AREA 38: Ordered Chaos,TXT_STRIFE_MAP38,,,,ZÓNA 38: Nařízený chaos,AREA 38: Ordnet kaos,ZONE 38: Geordnetes Chaos,,AREO 38: Orda kaoso,ÁREA 38: Caos ordenado,,ALUE 38: Järjestynyt kaaos,ZONE 38: Chaos Ordonné,38. Terület: Rendezett Káosz,AREA 38: Caos Ordinato,エリア 38: カオスの秩序,구역 38: 정돈된 혼란,Zone 38: Ordelijke chaos,OMRÅDE 38: Ordnet kaos,Strefa 38: Uporządkowany Chaos,Área 38: Caos Ordenado,,ZONA 38: Haos controlat,МЕСТНОСТЬ 38: Управляемый хаос,,OMRÅDE 38: Ordnat kaos,ALAN 38: Düzenli Kaos -,,Hexen,,,,,,,,,,,,,,,,,,,,,,,,, -Winnowing Hall,TXT_HEXEN_MAP01,,,,Sál prosetí,Separationshal,Trennungshalle,,Solenejo de Separado,Sala de los Vientos,,Viskaussali,Chambre de la Séparation,Huzatos Folyosó,Camera di separazione,選抜の間,바람 회관,Scheidingszaal,Vinnersalen,Hala Przesiewu,Sala de Separação,,Sala de Separare,Зал отсеивания,Предсобље просејавања,Hallen för avräkning,Ayrılma Salonu -Seven Portals,TXT_HEXEN_MAP02,,,,Sedmero portálů,Syv portaler,Sieben Portale,,Sep Portaloj,Siete Portales,,Seitsemän portaalia,Les Sept Portails,Hét Portál,I Sette Portali,漆之門,일곱 차원문,Zeven portalen,Syv portaler,Siedem Portali,Sete Portais,,Șapte Portaluri,Семь порталов,Седам портала,Sju portaler,Yedi Portal -Guardian of Ice,TXT_HEXEN_MAP03,,,,Strážce ledu,Vogter af is,Wächter des Eises,,Gardanto de Glacio,Guardián de Hielo,,Jään vartija,Gardien de Glace,A Jég Őre,Guardiano del Ghiaccio,氷の守護者,얼음의 수호자,Bewaker van ijs,Isens vokter,Strażnik Lodu,Guardião de Gelo,,Străjerul Gheții,Страж льда,Чувар леда,Isens väktare,Buz Muhafızı -Guardian of Fire,TXT_HEXEN_MAP04,,,,Strážce ohně,Vogter af ild,Wächter des Feuers,,Gardanto de Fajro,Guardián de Fuego,,Tulen vartija,Gardien de Feu,A Tűz Őre,Guardiano del Fuoco,炎の守護者,화염의 수호자,Bewaker van vuur,Ildens vokter,Strażnik Ognia,Guardião de Fogo,,Străjerul Focului,Страж огня,Чувар огња,Elds väktare,Ateşin Koruyucusu -Guardian of Steel,TXT_HEXEN_MAP05,,,,Strážce oceli,Vogter af stål,Wächter des Stahls,,Gardanto de Ŝtalo,Guardián de Acero,,Teräksen vartija,Gardien d'Acier,Az Acél Őre,Guardiano dell'Acciaio,鋼の守護者,강철의 수호자,Bewaker van staal,Stålets vokter,Strażnik Stali,Guardião de Aço,,Străjerul Oțelului,Страж стали,Чувар челика,Stålets väktare,Çelik Muhafız -Bright Crucible,TXT_HEXEN_MAP06,,,,Světlý očistec,Lys udfordring,Glänzende Feuerprobe,,Luma Krisolo,Crisol de Luz,,Kirkas tulikoe,Creuset Radiant,Fényes Ketrec,Crogiolo Luminoso,光の坩堝,빛나는 고난,Heldere beproeving,Lys utfordring,Tygiel Światła,Crisol de Luz,,Creuzet Luminos,Горнило света,Испит светла,Ljus utmaning,Parlak Pota -Shadow Wood,TXT_HEXEN_MAP13,,,,Temný hvozd,Skyggetræ,Schattenwald,,Ombro-Arbareto,Bosque de la Sombra,,Varjosalo,Forêt des Ombres,Árnyék Erdő,Foresta Oscura,陰影樹,그림자 숲,Schaduwbos,Skyggeskogen,Las Cieni,Floresta das Sombras,,Pădurea Umbrelor,Лес теней,Шума сенки,Skuggskog,Gölge Ahşap -Darkmere,TXT_HEXEN_MAP08,,,,Černý močál,,Düstersee,,Malluma Marĉo,Pantano,,Pikiräme,Marais Noir,Fekete Mocsár,Palude Nera,暗黒の地,흙빛호수,Sombermeer,,Mroczne Bagno,Pantâno Negro,,Mlaștinile Întunecate,Болотная топь,Мочварна земља,Mörkträsk,Koyu göl -Caves of Circe,TXT_HEXEN_MAP09,,,,Kirčiny jeskyně,Circes' grotter,Circes Höhle,,Kavernoj de Circe,Cuevas de Circe,,Circeluolat,Caves de Circé,Körök Barlangja,Grotte di Circe,キルケーの洞窟,키르케의 동굴,Grotten van Circe,Circes grotter,Jaskinie Kirke,Cavernas de Circe,,Peșterile lui Circe,Пещеры Цирцеи,Киркине пећине,Circes grottor,Kirke Mağaraları -Wastelands,TXT_HEXEN_MAP10,,,,Pustiny,Ødemarker,Ödland,,Senvivejo,Yermo,,Erämaat,Terres Ruinées,Senkiföldje,Terre in rovina,荒野,황무지,Woestenij,Ødemarken,Pustkowia,Terras Desoladas,,Tărâmurile Pustii,Пустоши,Пустоши,Ödemarken,Çorak Topraklar -Sacred Grove,TXT_HEXEN_MAP11,,,,Posvátný háj,Helliglund,Heiliger Hain,,Sankta Bosketo,Arboleda Sagrada,,Pyhä metsikkö,Bosquet Sacré,Szent Liget,Boschetto Sacro,神聖なる園,성스러운 수풀,Heilig bosje,Hellig lund,Święty Gaj,Bosque Sagrado,,Crângul Sacru,Священная роща,Свети шумарак,Heliga lunden,Kutsal Koru -Hypostyle,TXT_HEXEN_MAP12,,,,Hypostyl,,Säulenhalle,,Kolonejo,Hipóstila,,Hypostyyli,,Oszlopterem,Ipostilo,多柱の間,다주실,Zuilenhal,,Hypostyl,Hipostilo,,Hipostil,Гипостильный зал,Хипостил,Hypostil,Hipostil -Heresiarch's Seminary,TXT_HEXEN_MAP27,,,,Arcikacířův alumnát,Heresiarkens seminarium,Seminar des Erzketzers,,Seminario de Ĉefherezulo,Seminario del Heresiarca,,Kerettiarkin seminaari,Séminaire de l'Hérésiarche,A Főeretnek Neveldéje,Seminario dell'Heresiarch,ヘレシアークの神学舎,헤러시아크의 신학교,Seminarie van ketterij,Heresiarkens seminar,Seminarium Herezjarchy,Seminário do Heresiarca,,Seminarul Ereziarhului,Семинария Ересиарха,Јересијархов семинар,Heresiarkens seminarium,Heresiark'ın Ruhban Okulu -Dragon Chapel,TXT_HEXEN_MAP28,,,,Dračí kaple,Dragekapel,Drachenkapelle,,Drakkapelo,Capilla Dragón,,Lohikäärmekappeli,Chapelle du Dragon,Sárkány Szentély,Cappella del Drago,ドラゴンの庵寺,드래곤 예배실,Drakenkapel,Dragekapell,Kaplica Smoka,Capela do Dragão,,Capela dragonilor,Часовня дракона,Капела змајева,Drakens kapell,Ejderha Şapeli -Griffin Chapel,TXT_HEXEN_MAP30,,,,Gryfova kaple,Griffinkapel,Greifenkapelle,,Grifkapelo,Capilla Grifo,,Aarnikotkakappeli,Chapelle du Grifon,Griff Szentély,Cappella del Grifone,グリフィンの庵寺,그리핀 예배실,Griffioenenkapel,Griffon kapell,Kaplica Gryfa,Capela do Grifo,,Capela grifonilor,Часовня грифона,Капела грифонова,Griffins kapell,Griffin Şapeli -Deathwind Chapel,TXT_HEXEN_MAP31,,,,Kaple mrakosmrtě,Dødens vind kapel,Todeswindkapelle,,Mortvento-Kapelo,Capilla Viento de Muerte,,Kuolontuulikappeli,Chapelle du Vent Tueur,Halál Szentély,Cappella del Vento Assassino,デスウィンドの庵寺,죽음바람 예배실,Dodenwind kapel,Dødens vind kapell,Kaplica Wiatru Śmierci,Capela do Vento da Morte,,Capela suflului morții,Часовня ветра смерти,Капела ветра смрти,Dödsblåsans kapell,Ölüm Rüzgarı Şapeli -Orchard of Lamentations,TXT_HEXEN_MAP32,,,,Sad nářků,Klagesangens frugthave,Garten der Wehklagen,,Horto de Lamentoj,Huerto de los Lamentos,,Valitusvirtten tarha,Verger des Lamentations,Siránkozás Kertje,Frutteto delle Lamentazioni,哀悼茂る園,통탄의 과수원,Boomgaard van klaagliederen,Klagesangens hage,Płaczący Sad,Pomar das Lamentações,,Livada amărăciunii,Сады плача,Воћњак плача,Klagovisornas trädgård,Ağıtlar Bahçesi -Silent Refectory,TXT_HEXEN_MAP33,,,,Tichý refektář,Stilhedens refektorium,Stilles Refektorium,,Silenta Manĝejo,Refectorio Silencioso,,Hiljainen ruokasali,Réfectoire Silencieux,Néma Refektórium,Refettorio silenzioso,寡黙なる食堂,침묵의 식당,Stil refectory,Stille refektorium,Cichy Refektarz,Refeitório Silencioso,,Refectoriul tăcerii,Безмолвная трапезная,Безгласна трпезарија,Tyst matsal,Sessiz Yemekhane -Wolf Chapel,TXT_HEXEN_MAP34,,,,Vlčí kaple,Ulvekapel,Wolfskapelle,,Lupkapelo,Capilla Lobo,,Susikappeli,Chapelle du Loup,Farkas Szentély,Cappella del Lupo,狼の庵寺,늑대 예배실,Wolvenkapel,Ulvens kapell,Kaplica Wilka,Capela do Lobo,,Capela lupilor,Часовня волка,Капела вучја,Vargkapellet,Kurt Şapeli -Forsaken Outpost,TXT_HEXEN_MAP21,,,,Opuštěné stanoviště,Forladt forpost,Verlassener Vorposten,,Forlasita Posteno,Puesto de Avanzada Abandonado,,Hylätty etuvartio,Base Abandonnée,Elhagyott Őrség,Avamposto Abbandonato,荒れ果てた前哨地,버려진 초소,Verwaarloosde buitenpost,Forlatt utpost,Opuszczony Posterunek,Posto Abandonado,,Avanpostul părăsit,Покинутая застава,Напуштена постаја,Försvunnen utpost,Unutulmuş Karakol -Castle of Grief,TXT_HEXEN_MAP22,,,,Hrad smutku,Sorgens slot,Leidensburg,,Kastelo de Funebro,Castillo del Pesar,,Surulinna,Château de la Souffrance,A Gyász Kastélya,Castello della Sofferenza,嘆きの城,비탄의 성,Kasteel van verdriet,Sorgens slott,Zamek Smutku,Castelo da Aflição,,Castelul întristării,Замок скорби,Замак жалости,Sorgens slott,Keder Kalesi -Gibbet,TXT_HEXEN_MAP23,,,,Šibenice,,Richtstätte,,Pendigilo,Horca,,Hirsipuu,Gibet,Akasztófa,Forca,晒し台,교수대,,Galgen,Szubienica,Forca,,Eșafodul,Виселица,Вешала,,İnfaz yeri -Effluvium,TXT_HEXEN_MAP24,,,,Výpary,,Effluvium,,Efluvo,Efluvio,,Katku,,A Bűz Börtöne,Effluvio,腐臭漂う残骸,악취,,,Odór,Eflúvio,,Efluviu,Зловонный сток,Воњави одвод,,Atık Su -Dungeons,TXT_HEXEN_MAP25,,,,Žalář,Fangehuller,Kerker,,Karceroj,Calabozos,,Tyrmät,Donjons,Kazamaták,I Dungeon,地下牢,지하감옥,Kerkers,Fangehull,Lochy,Masmorras,,Temnițe,Подземелья,Лагуми,Kerker,Zindanlar -Desolate Garden,TXT_HEXEN_MAP26,,,,Zpustošená zahrada,Ødelagt have,Verwildeter Garten,,Dezerta Ĝardeno,Jardín Desolado,,Autio puutarha,Jardin de la Désolation,Sivár Kert,Giardino Desolato,荒涼とした庭,황폐한 정원,Woeste tuin,Øde hage,Spustoszały Ogród,Jardim Desolado,,Grădina dezolantă,Заброшенный сад,Напуштени врт,Ödslig trädgård,Issız Bahçe -Necropolis,TXT_HEXEN_MAP35,,,,Nekropole,Nekropolis,Nekropole,,Nekropolo,Necrópolis,,Nekropoli,Nécropole,Nekropolisz,Necropoli,ネクロポリス,망자의 도시,,Nekropolis,Nekropolia,Necrópole,,Necropola,Некрополь,Некропола,Nekropolis,Nekropol -Zedek's Tomb,TXT_HEXEN_MAP36,,,,Zedekova hrobka,Zedeks grav,Zedeks Gruft,,Tombo de Zedek,Tumba de Zedek,,Sedekin hauta,Tombeau de Zedek,Zedek Sírja,Tomba di Zedek,ゼデクの墓,제닥의 무덤,Zedek's graf,Zedeks grav,Grobowiec Zedeka,Tumba de Zedek,Túmulo de Zedek,Mormântul lui Zedek,Гробница Зедека,Гробница Зедекова,Zedeks grav,Zedek'in Mezarı -Menelkir's Tomb,TXT_HEXEN_MAP37,,,,Menelkirova hrobka,Menelkirs grav,Menelkirs Gruft,,Tombo de Menelkir,Tumba de Menelkir,,Menelkirin hauta,Tombeau de Menelkir,Menelkir Sírja,Tomba di Menelkir,メネルキルの墓,메넬키어의 무덤,Menelkir's graf,Menelkirs grav,Grobowiec Menelkira,Tumba de Menelkir,Túmulo de Menelkir,Mormântul lui Menelkir,Гробница Менелкира,Гробница Менелкирова,Menelkirs grav,Menelkir'in Mezarı -Traductus' Tomb,TXT_HEXEN_MAP38,,,,Traduktova hrobka,Traductus' grav,Traductus' Gruft,,Tombo de Traductus,Tumba de Traductus,,Traduktuksen hauta,Tombeau de Traductus,Traductus Sírja,Tomba di Traductus,トダクティスの墓,트라닥투스의 무덤,Traductus' graf,Traductus' grav,Grobowiec Traduktusa,Tumba de Traductus,Túmulo de Traductus,Mormântul lui Traductus,Гробница Традактуса,Гробница Традуктусова,Traductus' grav,Traductus'un Mezarı -Vivarium,TXT_HEXEN_MAP39,,,,Vivárium,,,,Vivario,Vivario,,Vivaario,,Vivárium,Vivario,ビバリウム,사육장,,,Wiwarium,Viveiro,,Vivariu,Виварий,Виваријум,, -Dark Crucible,TXT_HEXEN_MAP40,,,,Temný očistec,Mørk udfordring,Dunkle Feuerprobe,,Malluma Krisolo,Crisol de Oscuridad,,Pimeä tulikoe,Creuset Sombre,Sötét Ketrec,Crogiolo Buio,"暗黒の坩堝 +AREA 21: Factory: Manufacturing,TXT_STRIFE_MAP21,,,,ZÓNA 21: Továrna: Výroba,AREA 21: Fabrik: Fremstilling,ZONE 21: Fabrik: Herstellung,,AREO 21: Fabriko: Manufakturo,ÁREA 21: Fábrica: Manufactura,,ALUE 21: Tehdas: tuotanto,ZONE 21: Usine: Manufacture,,21. Terület: Gyár: Gyártósor,AREA 21: Fabbrica: Manifattura,エリア 21: 工場:製造機関,구역 21: 공장: 조립시설,Zone 21: Fabriek: Productie,OMRÅDE 21: Fabrikk: Produksjon,Strefa 21: Fabryka: Przetwórstwo,Área 21: Fábrica: Manufatura,,ZONA 21: Fabrica: Procesare,МЕСТНОСТЬ 21: Фабрика (производство),,OMRÅDE 21: Fabrik: Tillverkning,ALAN 21: Fabrika: İmalat +AREA 22: Factory: Forge,TXT_STRIFE_MAP22,,,,ZÓNA 22: Továrna: Slévárna,AREA 22: Fabrik: Smedje,ZONE 22: Fabrik: Schmiede,,AREO 22: Fabriko: Forĝejo,ÁREA 22: Fábrica: Forja,,ALUE 22 Tehdas: paja,ZONE 22: Usine: Forge,,22. Terület: Gyár: Kohó,AREA 22: Fabbrica: Fucina,エリア 22: 工場:鉄工所,구역 22: 공장: 제련소,Zone 22: Fabriek: Smederij,OMRÅDE 22: Fabrikk: Smie,Strefa 22: Fabryka: Kuźnia,Área 22: Fábrica: Forja,,ZONA 22: Fabrica: Forja,МЕСТНОСТЬ 22: Фабрика (кузня),,OMRÅDE 22: Fabrik: Smedja,ALAN 22: Fabrika: Demirhane +AREA 23: Order Commons,TXT_STRIFE_MAP23,,,,ZÓNA 23: Náves Řádu,AREA 23: Bestillingscentral,ZONE 23: Mensa des Ordens,,AREO 23: Komunumo de La Ordeno,ÁREA 23: Comuna de La Orden,,ALUE 23: Veljeskunnan messi,ZONE 23: Mess de l'Ordre,,23. Terület: Rendi köztér,AREA 23: Camera dell'Ordine,エリア 23: オーダーコモンズ,구역 23: 오더 식당가,Zone 23: Mensa van de orde,OMRÅDE 23: Bestillingsallmenning,Strefa 23: Wikt Zakonu,Área 23: Câmara da Ordem,,ZONA 23: Decontare comenzi,МЕСТНОСТЬ 23: Поселение Ордена,,OMRÅDE 23: Beställningscentraler,ALAN 23: Siparişin ortak alanı +AREA 24: Factory: Conversion Chapel,TXT_STRIFE_MAP24,,,,ZÓNA 24: Továrna: Kaple konverze,AREA 24: Fabrik: Omdannelseskapel,ZONE 24: Umwandlungskapelle,,AREO 24: Fabriko: Konvert-kapelo,ÁREA 24: Fábrica: Capilla de conversión,,ALUE 24: Tehdas: käännytyskappeli,ZONE 24: Usine: Chapelle de Conversion,,24. Terület: A megtérés kápolnája,AREA 24: Fabbrica: Cappella di Conversione,エリア 24: 工場:改宗礼拝堂,구역 24: 공장: 전향실,Zone 24: Verbouwingskapel,OMRÅDE 24: Fabrikk: Konverteringskapell,Strefa 24: Fabryka: Kaplica Przemiany,Área 24: Fábrica: Capela de Conversão,,ZONA 24: Fabrica: Capela de conversie,МЕСТНОСТЬ 24: Фабрика (часовня обращения),,OMRÅDE 24: Fabrik: Omvandlingskapell,ALAN 24: Fabrika: Dönüşüm Şapeli +AREA 25: Catacombs: Ruined Temple,TXT_STRIFE_MAP25,,,,ZÓNA 25: Katakomby: Zničený chrám,AREA 25: Katakomberne: Ruineret tempel,ZONE 25: Katakomben: Zerstörter Tempel,,AREO: 25: Katakombo: Ruina templo,ÁREA 25: Catacumbas: Templo arruinado,,ALUE 25: Katakombit: temppeliraunio,ZONE 25: Catacombes: Temple Ruiné,,25. Terület: Katakombák: Romtemplom,AREA 25: Catacombe: Tempio in Rovina,エリア 25: 地下墓所:没落した寺院,구역 25: 고대 묘지: 무너진 사원,Zone 25: Catacomben: Vernietigde tempel,OMRÅDE 25: Katakombene: Ruinert tempel,Strefa 25: Katakumby: Zrujnowana Świątynia,Área 25: Catacumbas: Templo Arruinado,Área 25: Túmulos: Templo Arruinado,ZONA 25: Catacombe: Templu în ruine,МЕСТНОСТЬ 25: Катакомбы (руины храма),,OMRÅDE 25: Katakomber: Förfallet tempel,ALAN 25: Yeraltı Mezarları: Yıkık Tapınak +AREA 26: Proving Grounds,TXT_STRIFE_MAP26,,,,ZÓNA 26: Vojenský újezd,AREA 26: Prøvesteder,ZONE 26: Testgelände,,AREO 26: Provejo,ÁREA 26: Campo de pruebas,,ALUE 26: Koetuspaikka,ZONE 26: Terrain d'entraînement,,26. Terület: Próbatételek Földje,AREA 26: Banco di Prova,エリア 26: 試練場,구역 26: 증명의 전장,Zone 26: Testgebied,OMRÅDE 26: Prøveplassen,Strefa 26: Poligon Wojskowy,Área 26: Campo de Treinamento,Área 26: Campo de Treino,ZONA 26: Tabăra de instruire,МЕСТНОСТЬ 26: Испытательный полигон,,OMRÅDE 26: Provningsområden,ALAN 26: Kanıtlama Alanları +AREA 27: The Lab,TXT_STRIFE_MAP27,,,,ZÓNA 27: Laboratoř,AREA 27: Laboratoriet,ZONE 27: Das Labor,,AREO 27: La laboratorio,ÁREA 27: El laboratorio,,ALUE 27: Laboratorio,ZONE 27: Laboratoire,,27. Terület: A labor,AREA 27: Il Laboratorio,エリア 27: 研究所,구역 27: 연구소,Zone 27: Het laboratorium,OMRÅDE 27: Laboratoriet,Strefa 27: Laboratorium,Área 27: O Laboratório,,ZONA 27: Laboratorul,МЕСТНОСТЬ 27: Лаборатория,,OMRÅDE 27: Labbet,ALAN 27: Laboratuvar +AREA 28: Alien Ship,TXT_STRIFE_MAP28,,,,ZÓNA 28: Mimozemská loď,AREA 28: Fremmed skib,ZONE 28: Außerirdisches Schiff,,AREO 28: Aliplaneda ŝipo,ÁREA 28: Nave alienígena,,ALUE 28: Muukalaisalus,ZONE 28: Vaisseau Alien,,28. Terület: Idegen űrhajó,AREA 28: Nave Aliena,エリア 28: エイリアンの船,구역 28: 외계 우주선,Zone 28: Buitenaards schip,OMRÅDE 28: Det fremmede skipet,Strefa 28: Statek Obcych,Área 28: Nave Alienígena,,ZONA 28: Nava extraterestră,МЕСТНОСТЬ 28: Корабль пришельцев,,OMRÅDE 28: Främmande skepp,ALAN 28: Uzaylı Gemisi +AREA 29: Entity's Lair,TXT_STRIFE_MAP29,,,,ZÓNA 29: Doupě Bytosti,AREA 29: Entitetsnesten,ZONE 29: Das Nest der Entität,,AREO 29: Nestego de Estulo,ÁREA 29: Escondite de la Entidad,,ALUE 29: Tosiolevan maja,ZONE 29: Demeure de L'Entité,,29. Terület: A Teremtvény Búvóhelye,AREA 29: Tana dell'Entità,エリア 29: エンティティの隠れ家,구역 29: 엔티티의 소굴,Zone 29: Het nest van de entiteit,OMRÅDE 29: Enhetens hule,Strefa 29: Leże Bytu,Área 29: Covil da Entidade,,ZONA 29: Cuibul Entității,МЕСТНОСТЬ 29: Логово Сущности,,OMRÅDE 29: Väsendets lya,ALAN 29: Varlığın İni +AREA 30: Abandoned Front Base,TXT_STRIFE_MAP30,,,,ZÓNA 30: Opuštěná základna Fronty,AREA 30: Forladt frontbase,ZONE 30: Verlassene Basis der Front,,AREO 30: Forlasita Front-Bazo,ÁREA 30: Base abandonada del Frente,,ALUE 30: Hylätty Rintaman tukikohta,ZONE 30: Base Abandonnée du Front,,30. Terület: Elhagyatott Előbázis,AREA 30: Base del Fronte abbandonata,エリア 30: 放棄された基地,구역 30: 버려진 프론트 기지,Zone 30: Verlaten frontbasis,OMRÅDE 30: Forlatt frontbase,Strefa 30: Opuszczona Baza Frontu,Área 30: Base da Frente Abandonada,,ZONA 30: Baza abandonată a Frontului,МЕСТНОСТЬ 30: Заброшенная база сопротивления,,OMRÅDE 30: Övergiven frontbas,ALAN 30: Terk Edilmiş Ön Üs +AREA 31: Training Facility,TXT_STRIFE_MAP31,,,,ZÓNA 31: Výcvikové zařízení,AREA 31: Træningsanlæg,ZONE 31: Trainingseinrichtung,,AREO 31: Trejnejo,ÁREA 31: Zona de entrenamiento,,ALUE 31: Koulutuslaitos,ZONE 31: Complexe d'Entraînement,,31. Terület: Kiképzőbázis,AREA 31: Struttura di Addestramento,エリア 31: 研修施設,구역 31: 훈련 시설,Zone 31: Trainingsfaciliteit,OMRÅDE 31: Treningsanlegg,Strefa 31: Centrum Szkoleniowe,Área 31: Instalação de Treinamento,,ZONA 31: Spațiul de antrenament,МЕСТНОСТЬ 31: Тренировочный корпус,,OMRÅDE 31: Utbildningsanläggning,ALAN 31: Eğitim Tesisi +AREA 1: Sanctuary,TXT_STRIFE_MAP32,,,,ZÓNA 1: Svatyně,AREA 1: Fristedet,ZONE 1: Heiligtum,,AREO 1: Sanktejo,ÁREA 1: Santuario,,ALUE 1: Pyhäkkö,ZONE 1: Sanctuaire,,1. Terület: Szentély,AREA 1: Santuario,エリア 1: 聖域 ,구역 1: 성소,Zone 1: Heiligdom,OMRÅDE 1: Fristedet,Strefa 1: Sanktuarium,Área 1: Santuário,,ZONA 1: Sanctuar,МЕСТНОСТЬ 1: Святилище,,OMRÅDE 1: Fristad,ALAN 1: Sığınak +AREA 2: Town,TXT_STRIFE_MAP33,,,,ZÓNA 2: Město,AREA 2: By,ZONE 2: Stadt,,AREO 2: Urbeto,ÁREA 2: Pueblo,,ALUE 2: Kylä,ZONE 2: Ville,,2. Terület: Város,AREA 2: Città,エリア 2: 町,구역 2: 마을,Zone 2: Stad,OMRÅDE 2: By,Strefa 2: Miasto,Área 2: Vila,,ZONA 2: Oraș,МЕСТНОСТЬ 2: Город,,OMRÅDE 2: Stad,ALAN 2: Şehir +AREA 3: Movement Base,TXT_STRIFE_MAP34,,,,ZÓNA 3: Rebelská základna,AREA 3: Front Basis,ZONE 3: Rebellenbasis,,AREO 3: Movad-bazo,ÁREA 3: Base del Movimiento,,ALUE 3: Liikkeen tukikohta,ZONE 3: Base du Front,,3. Terület: Mozgalmi Bázis,AREA 3: Base del Movimento,エリア 3: 移転基地,구역 3: 반군 기지,Zone 3: Front basis,OMRÅDE 3: Bevegelsesbase,Strefa 3: Baza Ruchu Oporu,Área 3: Base do Movimento,,ZONA 3: Baza rezistenței,МЕСТНОСТЬ 3: База сопротивления,,OMRÅDE 3: Förflyttningsbas,ALAN 3: Hareket Üssü +AREA 35: Factory: Production,TXT_STRIFE_MAP35,,,,ZÓNA 35: Továrna: Produkce,AREA 35: Fabrik: Produktion,ZONE 35: Fabrik: Produktion,,AREO 35: Fabriko: Produktejo,ÁREA 35: Fábrica: Producción,,ALUE 35: Tehdas: tuotanto,ZONE 35: Usine: Production,,35. Terület: Gyár: Termelés,AREA 35: Fabbrica: Produzione,エリア 35: 工場 : 生産ライン,구역 35: 공장: 제작실,Zone 35: Fabriek: Productie,OMRÅDE 35: Fabrikk: Produksjon,Strefa 35: Fabryka: Produkcja,Área 35: Fábrica: Produção,,ZONA 35: Fabrica: Producție,МЕСТНОСТЬ 35: Фабрика (производство),,OMRÅDE 35: Fabrik: Produktion,ALAN 35: Fabrika: Üretim +AREA 36: Castle Clash,TXT_STRIFE_MAP36,,,,ZÓNA 36: Střet na hradě,AREA 36: Slotskampe,ZONE 36: Burg-Konflikt,,AREO 36: Batalo en la kastelo,ÁREA 36: Ataque al castillo,,ALUE 36: Linnayhteenotto,ZONE 36: Bataille du Château,,36: Terület: Vári ütközet,AREA 36: Collisione di Castello,エリア 36: キャッスルクラッシュ,구역 36: 성채간의 충돌,Zone 36: Kasteelconflict,OMRÅDE 36: Slottskampen,Strefa 36: Potyczka w Zamku,Área 36: Ataque ao Castelo,,ZONA 36: Bătălia castelului,МЕСТНОСТЬ 36: Битва в замке,,OMRÅDE 36: Slottet Clash,ALAN 36: Kale Çatışması +AREA 37: Killing Grounds,TXT_STRIFE_MAP37,,,,ZÓNA 37: Popravčí zahrady,AREA 37: Drabsområder,ZONE 37: Kampfgelände,,AREO 37: Tereno de mortigado,ÁREA 37: Campo de matanza,,ALUE 37: Tappotanner,ZONE 37: Zone de Chasse,,37. Terület: Gyilkos Vidék,AREA 37: Campi di Uccisione,エリア 37: 殺害者の地,구역 37: 살육의 전장,Zone 37: Slagveld,OMRÅDE 37: Drapsplasser,Strefa 37: Śmiercionośny Grunt,Área 37: Campo de Matança,,ZONA 37: Teren de ucis,МЕСТНОСТЬ 37: Сектора обстрела,,OMRÅDE 37: Dödsmark,ALAN 37: Öldürme Alanları +AREA 38: Ordered Chaos,TXT_STRIFE_MAP38,,,,ZÓNA 38: Nařízený chaos,AREA 38: Ordnet kaos,ZONE 38: Geordnetes Chaos,,AREO 38: Orda kaoso,ÁREA 38: Caos ordenado,,ALUE 38: Järjestynyt kaaos,ZONE 38: Chaos Ordonné,,38. Terület: Rendezett Káosz,AREA 38: Caos Ordinato,エリア 38: カオスの秩序,구역 38: 정돈된 혼란,Zone 38: Ordelijke chaos,OMRÅDE 38: Ordnet kaos,Strefa 38: Uporządkowany Chaos,Área 38: Caos Ordenado,,ZONA 38: Haos controlat,МЕСТНОСТЬ 38: Управляемый хаос,,OMRÅDE 38: Ordnat kaos,ALAN 38: Düzenli Kaos +,,Hexen,,,,,,,,,,,,,,,,,,,,,,,,,, +Winnowing Hall,TXT_HEXEN_MAP01,,,,Sál prosetí,Separationshal,Trennungshalle,,Solenejo de Separado,Sala de los Vientos,,Viskaussali,Chambre de la Séparation,,Huzatos Folyosó,Camera di separazione,選抜の間,바람 회관,Scheidingszaal,Vinnersalen,Hala Przesiewu,Sala de Separação,,Sala de Separare,Зал отсеивания,Предсобље просејавања,Hallen för avräkning,Ayrılma Salonu +Seven Portals,TXT_HEXEN_MAP02,,,,Sedmero portálů,Syv portaler,Sieben Portale,,Sep Portaloj,Siete Portales,,Seitsemän portaalia,Les Sept Portails,,Hét Portál,I Sette Portali,漆之門,일곱 차원문,Zeven portalen,Syv portaler,Siedem Portali,Sete Portais,,Șapte Portaluri,Семь порталов,Седам портала,Sju portaler,Yedi Portal +Guardian of Ice,TXT_HEXEN_MAP03,,,,Strážce ledu,Vogter af is,Wächter des Eises,,Gardanto de Glacio,Guardián de Hielo,,Jään vartija,Gardien de Glace,,A Jég Őre,Guardiano del Ghiaccio,氷の守護者,얼음의 수호자,Bewaker van ijs,Isens vokter,Strażnik Lodu,Guardião de Gelo,,Străjerul Gheții,Страж льда,Чувар леда,Isens väktare,Buz Muhafızı +Guardian of Fire,TXT_HEXEN_MAP04,,,,Strážce ohně,Vogter af ild,Wächter des Feuers,,Gardanto de Fajro,Guardián de Fuego,,Tulen vartija,Gardien de Feu,,A Tűz Őre,Guardiano del Fuoco,炎の守護者,화염의 수호자,Bewaker van vuur,Ildens vokter,Strażnik Ognia,Guardião de Fogo,,Străjerul Focului,Страж огня,Чувар огња,Elds väktare,Ateşin Koruyucusu +Guardian of Steel,TXT_HEXEN_MAP05,,,,Strážce oceli,Vogter af stål,Wächter des Stahls,,Gardanto de Ŝtalo,Guardián de Acero,,Teräksen vartija,Gardien d'Acier,,Az Acél Őre,Guardiano dell'Acciaio,鋼の守護者,강철의 수호자,Bewaker van staal,Stålets vokter,Strażnik Stali,Guardião de Aço,,Străjerul Oțelului,Страж стали,Чувар челика,Stålets väktare,Çelik Muhafız +Bright Crucible,TXT_HEXEN_MAP06,,,,Světlý očistec,Lys udfordring,Glänzende Feuerprobe,,Luma Krisolo,Crisol de Luz,,Kirkas tulikoe,Creuset Radiant,,Fényes Ketrec,Crogiolo Luminoso,光の坩堝,빛나는 고난,Heldere beproeving,Lys utfordring,Tygiel Światła,Crisol de Luz,,Creuzet Luminos,Горнило света,Испит светла,Ljus utmaning,Parlak Pota +Shadow Wood,TXT_HEXEN_MAP13,,,,Temný hvozd,Skyggetræ,Schattenwald,,Ombro-Arbareto,Bosque de la Sombra,,Varjosalo,Forêt des Ombres,,Árnyék Erdő,Foresta Oscura,陰影樹,그림자 숲,Schaduwbos,Skyggeskogen,Las Cieni,Floresta das Sombras,,Pădurea Umbrelor,Лес теней,Шума сенки,Skuggskog,Gölge Ahşap +Darkmere,TXT_HEXEN_MAP08,,,,Černý močál,,Düstersee,,Malluma Marĉo,Pantano,,Pikiräme,Marais Noir,,Fekete Mocsár,Palude Nera,暗黒の地,흙빛호수,Sombermeer,,Mroczne Bagno,Pantâno Negro,,Mlaștinile Întunecate,Болотная топь,Мочварна земља,Mörkträsk,Koyu göl +Caves of Circe,TXT_HEXEN_MAP09,,,,Kirčiny jeskyně,Circes' grotter,Circes Höhle,,Kavernoj de Circe,Cuevas de Circe,,Circeluolat,Caves de Circé,,Körök Barlangja,Grotte di Circe,キルケーの洞窟,키르케의 동굴,Grotten van Circe,Circes grotter,Jaskinie Kirke,Cavernas de Circe,,Peșterile lui Circe,Пещеры Цирцеи,Киркине пећине,Circes grottor,Kirke Mağaraları +Wastelands,TXT_HEXEN_MAP10,,,,Pustiny,Ødemarker,Ödland,,Senvivejo,Yermo,,Erämaat,Terres Ruinées,,Senkiföldje,Terre in rovina,荒野,황무지,Woestenij,Ødemarken,Pustkowia,Terras Desoladas,,Tărâmurile Pustii,Пустоши,Пустоши,Ödemarken,Çorak Topraklar +Sacred Grove,TXT_HEXEN_MAP11,,,,Posvátný háj,Helliglund,Heiliger Hain,,Sankta Bosketo,Arboleda Sagrada,,Pyhä metsikkö,Bosquet Sacré,,Szent Liget,Boschetto Sacro,神聖なる園,성스러운 수풀,Heilig bosje,Hellig lund,Święty Gaj,Bosque Sagrado,,Crângul Sacru,Священная роща,Свети шумарак,Heliga lunden,Kutsal Koru +Hypostyle,TXT_HEXEN_MAP12,,,,Hypostyl,,Säulenhalle,,Kolonejo,Hipóstila,,Hypostyyli,,,Oszlopterem,Ipostilo,多柱の間,다주실,Zuilenhal,,Hypostyl,Hipostilo,,Hipostil,Гипостильный зал,Хипостил,Hypostil,Hipostil +Heresiarch's Seminary,TXT_HEXEN_MAP27,,,,Arcikacířův alumnát,Heresiarkens seminarium,Seminar des Erzketzers,,Seminario de Ĉefherezulo,Seminario del Heresiarca,,Kerettiarkin seminaari,Séminaire de l'Hérésiarche,,A Főeretnek Neveldéje,Seminario dell'Heresiarch,ヘレシアークの神学舎,헤러시아크의 신학교,Seminarie van ketterij,Heresiarkens seminar,Seminarium Herezjarchy,Seminário do Heresiarca,,Seminarul Ereziarhului,Семинария Ересиарха,Јересијархов семинар,Heresiarkens seminarium,Heresiark'ın Ruhban Okulu +Dragon Chapel,TXT_HEXEN_MAP28,,,,Dračí kaple,Dragekapel,Drachenkapelle,,Drakkapelo,Capilla Dragón,,Lohikäärmekappeli,Chapelle du Dragon,,Sárkány Szentély,Cappella del Drago,ドラゴンの庵寺,드래곤 예배실,Drakenkapel,Dragekapell,Kaplica Smoka,Capela do Dragão,,Capela dragonilor,Часовня дракона,Капела змајева,Drakens kapell,Ejderha Şapeli +Griffin Chapel,TXT_HEXEN_MAP30,,,,Gryfova kaple,Griffinkapel,Greifenkapelle,,Grifkapelo,Capilla Grifo,,Aarnikotkakappeli,Chapelle du Grifon,,Griff Szentély,Cappella del Grifone,グリフィンの庵寺,그리핀 예배실,Griffioenenkapel,Griffon kapell,Kaplica Gryfa,Capela do Grifo,,Capela grifonilor,Часовня грифона,Капела грифонова,Griffins kapell,Griffin Şapeli +Deathwind Chapel,TXT_HEXEN_MAP31,,,,Kaple mrakosmrtě,Dødens vind kapel,Todeswindkapelle,,Mortvento-Kapelo,Capilla Viento de Muerte,,Kuolontuulikappeli,Chapelle du Vent Tueur,,Halál Szentély,Cappella del Vento Assassino,デスウィンドの庵寺,죽음바람 예배실,Dodenwind kapel,Dødens vind kapell,Kaplica Wiatru Śmierci,Capela do Vento da Morte,,Capela suflului morții,Часовня ветра смерти,Капела ветра смрти,Dödsblåsans kapell,Ölüm Rüzgarı Şapeli +Orchard of Lamentations,TXT_HEXEN_MAP32,,,,Sad nářků,Klagesangens frugthave,Garten der Wehklagen,,Horto de Lamentoj,Huerto de los Lamentos,,Valitusvirtten tarha,Verger des Lamentations,,Siránkozás Kertje,Frutteto delle Lamentazioni,哀悼茂る園,통탄의 과수원,Boomgaard van klaagliederen,Klagesangens hage,Płaczący Sad,Pomar das Lamentações,,Livada amărăciunii,Сады плача,Воћњак плача,Klagovisornas trädgård,Ağıtlar Bahçesi +Silent Refectory,TXT_HEXEN_MAP33,,,,Tichý refektář,Stilhedens refektorium,Stilles Refektorium,,Silenta Manĝejo,Refectorio Silencioso,,Hiljainen ruokasali,Réfectoire Silencieux,,Néma Refektórium,Refettorio silenzioso,寡黙なる食堂,침묵의 식당,Stil refectory,Stille refektorium,Cichy Refektarz,Refeitório Silencioso,,Refectoriul tăcerii,Безмолвная трапезная,Безгласна трпезарија,Tyst matsal,Sessiz Yemekhane +Wolf Chapel,TXT_HEXEN_MAP34,,,,Vlčí kaple,Ulvekapel,Wolfskapelle,,Lupkapelo,Capilla Lobo,,Susikappeli,Chapelle du Loup,,Farkas Szentély,Cappella del Lupo,狼の庵寺,늑대 예배실,Wolvenkapel,Ulvens kapell,Kaplica Wilka,Capela do Lobo,,Capela lupilor,Часовня волка,Капела вучја,Vargkapellet,Kurt Şapeli +Forsaken Outpost,TXT_HEXEN_MAP21,,,,Opuštěné stanoviště,Forladt forpost,Verlassener Vorposten,,Forlasita Posteno,Puesto de Avanzada Abandonado,,Hylätty etuvartio,Base Abandonnée,,Elhagyott Őrség,Avamposto Abbandonato,荒れ果てた前哨地,버려진 초소,Verwaarloosde buitenpost,Forlatt utpost,Opuszczony Posterunek,Posto Abandonado,,Avanpostul părăsit,Покинутая застава,Напуштена постаја,Försvunnen utpost,Unutulmuş Karakol +Castle of Grief,TXT_HEXEN_MAP22,,,,Hrad smutku,Sorgens slot,Leidensburg,,Kastelo de Funebro,Castillo del Pesar,,Surulinna,Château de la Souffrance,,A Gyász Kastélya,Castello della Sofferenza,嘆きの城,비탄의 성,Kasteel van verdriet,Sorgens slott,Zamek Smutku,Castelo da Aflição,,Castelul întristării,Замок скорби,Замак жалости,Sorgens slott,Keder Kalesi +Gibbet,TXT_HEXEN_MAP23,,,,Šibenice,,Richtstätte,,Pendigilo,Horca,,Hirsipuu,Gibet,,Akasztófa,Forca,晒し台,교수대,,Galgen,Szubienica,Forca,,Eșafodul,Виселица,Вешала,,İnfaz yeri +Effluvium,TXT_HEXEN_MAP24,,,,Výpary,,Effluvium,,Efluvo,Efluvio,,Katku,,,A Bűz Börtöne,Effluvio,腐臭漂う残骸,악취,,,Odór,Eflúvio,,Efluviu,Зловонный сток,Воњави одвод,,Atık Su +Dungeons,TXT_HEXEN_MAP25,,,,Žalář,Fangehuller,Kerker,,Karceroj,Calabozos,,Tyrmät,Donjons,,Kazamaták,I Dungeon,地下牢,지하감옥,Kerkers,Fangehull,Lochy,Masmorras,,Temnițe,Подземелья,Лагуми,Kerker,Zindanlar +Desolate Garden,TXT_HEXEN_MAP26,,,,Zpustošená zahrada,Ødelagt have,Verwildeter Garten,,Dezerta Ĝardeno,Jardín Desolado,,Autio puutarha,Jardin de la Désolation,,Sivár Kert,Giardino Desolato,荒涼とした庭,황폐한 정원,Woeste tuin,Øde hage,Spustoszały Ogród,Jardim Desolado,,Grădina dezolantă,Заброшенный сад,Напуштени врт,Ödslig trädgård,Issız Bahçe +Necropolis,TXT_HEXEN_MAP35,,,,Nekropole,Nekropolis,Nekropole,,Nekropolo,Necrópolis,,Nekropoli,Nécropole,,Nekropolisz,Necropoli,ネクロポリス,망자의 도시,,Nekropolis,Nekropolia,Necrópole,,Necropola,Некрополь,Некропола,Nekropolis,Nekropol +Zedek's Tomb,TXT_HEXEN_MAP36,,,,Zedekova hrobka,Zedeks grav,Zedeks Gruft,,Tombo de Zedek,Tumba de Zedek,,Sedekin hauta,Tombeau de Zedek,,Zedek Sírja,Tomba di Zedek,ゼデクの墓,제닥의 무덤,Zedek's graf,Zedeks grav,Grobowiec Zedeka,Tumba de Zedek,Túmulo de Zedek,Mormântul lui Zedek,Гробница Зедека,Гробница Зедекова,Zedeks grav,Zedek'in Mezarı +Menelkir's Tomb,TXT_HEXEN_MAP37,,,,Menelkirova hrobka,Menelkirs grav,Menelkirs Gruft,,Tombo de Menelkir,Tumba de Menelkir,,Menelkirin hauta,Tombeau de Menelkir,,Menelkir Sírja,Tomba di Menelkir,メネルキルの墓,메넬키어의 무덤,Menelkir's graf,Menelkirs grav,Grobowiec Menelkira,Tumba de Menelkir,Túmulo de Menelkir,Mormântul lui Menelkir,Гробница Менелкира,Гробница Менелкирова,Menelkirs grav,Menelkir'in Mezarı +Traductus' Tomb,TXT_HEXEN_MAP38,,,,Traduktova hrobka,Traductus' grav,Traductus' Gruft,,Tombo de Traductus,Tumba de Traductus,,Traduktuksen hauta,Tombeau de Traductus,,Traductus Sírja,Tomba di Traductus,トダクティスの墓,트라닥투스의 무덤,Traductus' graf,Traductus' grav,Grobowiec Traduktusa,Tumba de Traductus,Túmulo de Traductus,Mormântul lui Traductus,Гробница Традактуса,Гробница Традуктусова,Traductus' grav,Traductus'un Mezarı +Vivarium,TXT_HEXEN_MAP39,,,,Vivárium,,,,Vivario,Vivario,,Vivaario,,,Vivárium,Vivario,ビバリウム,사육장,,,Wiwarium,Viveiro,,Vivariu,Виварий,Виваријум,, +Dark Crucible,TXT_HEXEN_MAP40,,,,Temný očistec,Mørk udfordring,Dunkle Feuerprobe,,Malluma Krisolo,Crisol de Oscuridad,,Pimeä tulikoe,Creuset Sombre,,Sötét Ketrec,Crogiolo Buio,"暗黒の坩堝 ",어두운 고난,Donkere beproeving,Mørkets utfordring,Tygiel Mroku,Crisol das Trevas,,Creuzet Întunecat,Испытание тьмы,Испит таме,Mörk utmaning,Karanlık Pota -,,Hexen Deathkings,,,,,,,,,,,,,,,,,,,,,,,,, -Ruined Village,TXT_HEXDD_MAP41,,,,Zničená vesnice,Ødelagt landsby,Zerstörtes Dorf,,Ruina vilaĝo,Pueblo en ruinas,,Rauniokylä,Village en Ruines,Az Elpusztított Falu,Villagio in Rovine,廃村,파괴된 마을,Ruïneerd dorp,Den ødelagte landsbyen,Zrujnowana Wioska,Aldeia Destruída,Aldeia em Ruinas,Sat ruinat,Разрушенная деревня,Уништено село,Ruinerad by,Yıkık Köy -Blight,TXT_HEXDD_MAP42,,,,Pohroma,Skylle,Fäule,,Pesto,Decaimiento,,Turmelus,Peste,Penész,Peste,疫病,황폐화,Ziekte,Skade,Zaraza,Peste,,Cotropit,Упадок,Пошаст,Sköldpest,Yanıklık -Sump,TXT_HEXDD_MAP43,,,,Žumpa,Sump,Sumpf,,Olekuvo,Pozo de Barro,,Likakaivo,Puisard,Tócsa,Pozzetto,汚水槽,웅덩이,Moeras,,Studzienka,Poço de Lama,,Joampă,Грязеотстойник,Сливник,,Karter -Catacomb,TXT_HEXDD_MAP44,,,,Katakomby,Katakomb,Katakombe,,Katakombo,Catacumba,,Katakombi,Catacombe,Katakomba,Catacombe,カタコンベ,지하 묘실,Katacombe,Katakombe,Katakumba,Catacumba,,Catacombă,Катакомба,Катакомба,Katakomb,Katakomb -Badlands,TXT_HEXDD_MAP45,,,,Pustiny,Ødemarker,Ödland,,Badlandoj,Páramos,,Autiomaa,Terres Sauvages,Terméketlen Föld,Terre Selvagge,不毛地帯,불모지,Woestijn,Dårlige land,Pustkowia,Ermo,,Deșert,Бесплодные земли,Пустош,Dåliga marker,Çorak Topraklar -Brackenwood,TXT_HEXDD_MAP46,,,,Prales,,Moorwald,,Pteridejo,Brackenwood,,Saniaissalo,Forêt de Bracken,Páfrány Erdő,Foresta di Felce,ワラビの樹,고사리숲,Moorbos,,Las Paproci,Floresta de Samambaias,,Pădure de ferigi,Брекенвуд,Папрат,Brackenwood,Bataklık orman -Pyre,TXT_HEXDD_MAP47,,,,Hranice,Bål,Scheiterhaufen,,Kremaciejo,Pira Funeraria,,Rovio,Brasier,Máglya,Pira,火葬薪,화장,Brandstapel,Bål,Ognisko,Pira,,Rug,Погребальный костёр,Ломача,Bål,Ateş Yakmak -Constable's Gate,TXT_HEXDD_MAP48,,,,Konstáblova brána,Vagtport,Wachtor,,Pordego de Ĝendarmo,Puerta del Alguacil,,Konstaapelin portti,Portail du Constable,Csendőr Kapu,Porta del Conestabile,城守達の門,무관장의 문,Constable's poort,Konstabelporten,Brama Posterunkowego,Portão do Condestável,,Poarta ofițerului,Комендантские врата,Чиновникова капија,Konstapelns port,Muhafız Kapısı -Treasury,TXT_HEXDD_MAP49,,,,Pokladnice,Skatkammer,Schatzkammer,,Trezorejo,Tesorería,,Rahasto,Trésorerie,Kincstár,Tesoreria,宝庫,국고,Schatkist,Skattkammeret,Skarbiec,Tesouraria,,Vistierie,Сокровищница,Трезор,Skattkammaren,Hazine Müsteşarlığı -Market Place,TXT_HEXDD_MAP50,,,,Tržnice,Markedspladsen,Marktplatz,,Foirejo,Plaza del Mercado,,Markkinat,Place du Marché,Piactér,Piazza del Mercato,市場,시장,Markt,Markedsplassen,Rynek,Feira,,Piață,Рыночная площадь,Пијаца,Marknadsplats,Pazar Yeri -Locus Requiescat,TXT_HEXDD_MAP51,,,,,,Locus Requiescat,,Locus Requiescat,Lugar de Descanso Eterno,,,Locus Requiescat,,,祈祷師の軌跡,명복의 장소,,,Locus Requiescat,,,,Место вечного упокоения,Место починка,,Locus Requiescat -Ordeal,TXT_HEXDD_MAP52,,,,Utrpení,Forbandelse,Heimsuchung,,Provo Per Aflikto,Prueba,,Koettelemus,Supplice,Megpróbáltatás,Supplizio,試練,시죄의 시련,Orde,Prøvelsen,Męka,Suplício,,Supliciu,Испытание,Изазов,Rättegång,Çile -Armory,TXT_HEXDD_MAP53,,,Armoury,Zbrojnice,Våbenkammer,Waffenkammer,,Armilejo,Armería,,Asehuone,Amurerie,Fegyvertár,Armeria,武器庫,무기고,Wapenkamer,Våpenkammer,Zbrojownia,Arsenal,,Arsenal,Оружейная,Оружарница,Vapenförråd,Cephanelik -Nave,TXT_HEXDD_MAP54,,,,Chrámová loď,,Kirchenschiff,,Navo,La Nave,,Laiva,Nef,Templomhajó,Navata,身廊,본당,Naaf,Skipet,Nawa,,,Naos,Неф,Брод,,Nef -Chantry,TXT_HEXDD_MAP55,,,,Modlitebna,Korskirke,Kantorei,,Kapelo,Capilla,,Kappeli,Chapelle,Gyászkápolna,Cappella,小礼拝堂,예배당,,Minnekapellet,Kaplica Wotywna,Capela,,Capelă,Часовня,Капела,Kyrkogård,Dua Odası -Abattoir,TXT_HEXDD_MAP56,,,,Jatka,Slagteriet,Schlachthaus,,Buĉejo,Matadero,,Teurastamo,Abbatoire,Vágóhíd,Mattatoio,屠殺場,도살장,Slachthuis,Slakteriet,Rzeźnia,Matadouro,,Abator,Бойня,Кланица,Slakthus,Mezbaha -Dark Watch,TXT_HEXDD_MAP57,,,,Tmavá hlídka,Mørk vagt,Dunkle Wache,,Ombra Gardisto,Guardia Oscura,,Pimeä vartio,Garde Noire,Éjjeli Őrség,Guardia Oscura,闇の刻計,어둠의 감시초소,Donkere horloge,Mørkets vakt,Ciemna Strażnica,Guarda Negra,,Gardian întunecat,Тёмный страж,Мрачни чувар,Mörk vakt,Karanlık Saat -Cloaca,TXT_HEXDD_MAP58,,,,Kloaka,,Kloake,,Kloako,Cloaca,,Kloaakki,Cloaque,Kloáka,,排泄腔,하수구,,,Kloaka,,,,Клоака,Клоака,,Kloaka -Ice Hold,TXT_HEXDD_MAP59,,,,Ledová pevnost,Isrum,Eiskammer,,Fuorto el Glacio,Tierra de Hielo,,Jääsäilö,Fort de Glace,Jégtorony,Fortezza di Ghiaccio,氷結,빙고,Ijskamer,Ishall,Lodowa Twierdza,Fortaleza de Gelo,,Fort glaciar,Ледяная твердь,Ледена утврда,Ishållet,Buz Tutucu -Dark Citadel,TXT_HEXDD_MAP60,,,,Temná citadela,Mørkt citadel,Dunkle Festung,,Ombra Citadelo,Fortaleza Oscura,,Pimeä linnake,Citadelle Sombre,Sötét Torony,Cittadella Oscura,暗黒の城塞,어둠의 요새,Donkere citadel,Mørkets citadell,Mroczna Cytadela,Cidadela Negra,,Cetatea întunecată,Тёмная цитадель,Мрачна цитадела,Mörkt citadell,Karanlık Kale -Transit,TXT_HEXDD_MAP33,,,,Převoz,,,,Vojo,Sala de Espera,,Läpikulku,,Tranzit,Passaggio,変遷,통로,Doorvoer,Transitt,Tranzyt,Sala de Espera,,Tranzit,Переход,Прелаз,,Transit -Over'n Under,TXT_HEXDD_MAP34,,,,Nad a Pod,,Drunter und Drüber,,Sub kaj Supre,Arriba y Abajo,,Yli ja ali,Sens Dessus Dessous,Fent és Lent,Sopra e Sotto,天と地,높낮이,Over'n under,Over og under,Nad I Pod,Sobre e Sob,,Mai sus și Mai jos,Выше и ниже,Изнад и испод,Över'n Under,Üst ve Alt -Deathfog,TXT_HEXDD_MAP35,,,,Mha skonu,Dødens tåge,Todesnebel,,Mortnebulo,Niebla de Muerte,,Kuolonsumu,Brume Mortelle,Halálköd,Nebbia di Morte,死の霧,죽음의 안개,Dodenmist,Dødståke,Mgła Śmierci,Névoa da Morte,,Ceața morții,Туман смерти,Магла смрти,Dödsfog,Ölüm Sisi -Castle of Pain,TXT_HEXDD_MAP36,,,,Hrad bolesti,Frygtens slot,Burg der Angst,,Kastelo de Doloro,Castillo del Dolor,,Tuskan linna,Château de la Douleur,Fájdalom Kastélya,Castello del Dolore,苦しみの城,고통의 성,Kasteel van pijn,Smertens slott,Zamek Bólu,Castelo da Dor,,Castelul durerii,Замок боли,Тврђава бола,Slottet av smärta,Acı Kalesi -Sewer Pit,TXT_HEXDD_MAP37,,,,Odpadní jáma,Kloakgrube,Kanalgrube,,Fekaĵputo,Pozo de Residuos,,Viemärimonttu,Trou d'Egout,Kanális akna,Fossa della Fogna,地下溝穴,하수도,Rioolput,Kloakkgropen,Ściek,Fossa de Esgoto,,Groapa de scurgere,Сточная яма,Канализациона јама,Avloppsgrop,Kanalizasyon Çukuru -The Rose,TXT_HEXDD_MAP38,,,,Růže,Rosen,Die Rose,,La Rozo,La Rosa,,Ruusu,La Rose,A Rózsa,La Rosa,薔薇,장밋빛,De roos,Rosen,Róża,A Rosa,,Roza,Роза,Ружа,Rosen,Gül -,,Intermission texts,,,,,,,,,,,,,,,,,,,,,,,,, +,,Hexen Deathkings,,,,,,,,,,,,,,,,,,,,,,,,,, +Ruined Village,TXT_HEXDD_MAP41,,,,Zničená vesnice,Ødelagt landsby,Zerstörtes Dorf,,Ruina vilaĝo,Pueblo en ruinas,,Rauniokylä,Village en Ruines,,Az Elpusztított Falu,Villagio in Rovine,廃村,파괴된 마을,Ruïneerd dorp,Den ødelagte landsbyen,Zrujnowana Wioska,Aldeia Destruída,Aldeia em Ruinas,Sat ruinat,Разрушенная деревня,Уништено село,Ruinerad by,Yıkık Köy +Blight,TXT_HEXDD_MAP42,,,,Pohroma,Skylle,Fäule,,Pesto,Decaimiento,,Turmelus,Peste,,Penész,Peste,疫病,황폐화,Ziekte,Skade,Zaraza,Peste,,Cotropit,Упадок,Пошаст,Sköldpest,Yanıklık +Sump,TXT_HEXDD_MAP43,,,,Žumpa,Sump,Sumpf,,Olekuvo,Pozo de Barro,,Likakaivo,Puisard,,Tócsa,Pozzetto,汚水槽,웅덩이,Moeras,,Studzienka,Poço de Lama,,Joampă,Грязеотстойник,Сливник,,Karter +Catacomb,TXT_HEXDD_MAP44,,,,Katakomby,Katakomb,Katakombe,,Katakombo,Catacumba,,Katakombi,Catacombe,,Katakomba,Catacombe,カタコンベ,지하 묘실,Katacombe,Katakombe,Katakumba,Catacumba,,Catacombă,Катакомба,Катакомба,Katakomb,Katakomb +Badlands,TXT_HEXDD_MAP45,,,,Pustiny,Ødemarker,Ödland,,Badlandoj,Páramos,,Autiomaa,Terres Sauvages,,Terméketlen Föld,Terre Selvagge,不毛地帯,불모지,Woestijn,Dårlige land,Pustkowia,Ermo,,Deșert,Бесплодные земли,Пустош,Dåliga marker,Çorak Topraklar +Brackenwood,TXT_HEXDD_MAP46,,,,Prales,,Moorwald,,Pteridejo,Brackenwood,,Saniaissalo,Forêt de Bracken,,Páfrány Erdő,Foresta di Felce,ワラビの樹,고사리숲,Moorbos,,Las Paproci,Floresta de Samambaias,,Pădure de ferigi,Брекенвуд,Папрат,Brackenwood,Bataklık orman +Pyre,TXT_HEXDD_MAP47,,,,Hranice,Bål,Scheiterhaufen,,Kremaciejo,Pira Funeraria,,Rovio,Brasier,,Máglya,Pira,火葬薪,화장,Brandstapel,Bål,Ognisko,Pira,,Rug,Погребальный костёр,Ломача,Bål,Ateş Yakmak +Constable's Gate,TXT_HEXDD_MAP48,,,,Konstáblova brána,Vagtport,Wachtor,,Pordego de Ĝendarmo,Puerta del Alguacil,,Konstaapelin portti,Portail du Constable,,Csendőr Kapu,Porta del Conestabile,城守達の門,무관장의 문,Constable's poort,Konstabelporten,Brama Posterunkowego,Portão do Condestável,,Poarta ofițerului,Комендантские врата,Чиновникова капија,Konstapelns port,Muhafız Kapısı +Treasury,TXT_HEXDD_MAP49,,,,Pokladnice,Skatkammer,Schatzkammer,,Trezorejo,Tesorería,,Rahasto,Trésorerie,,Kincstár,Tesoreria,宝庫,국고,Schatkist,Skattkammeret,Skarbiec,Tesouraria,,Vistierie,Сокровищница,Трезор,Skattkammaren,Hazine Müsteşarlığı +Market Place,TXT_HEXDD_MAP50,,,,Tržnice,Markedspladsen,Marktplatz,,Foirejo,Plaza del Mercado,,Markkinat,Place du Marché,,Piactér,Piazza del Mercato,市場,시장,Markt,Markedsplassen,Rynek,Feira,,Piață,Рыночная площадь,Пијаца,Marknadsplats,Pazar Yeri +Locus Requiescat,TXT_HEXDD_MAP51,,,,,,Locus Requiescat,,Locus Requiescat,Lugar de Descanso Eterno,,,Locus Requiescat,,,,祈祷師の軌跡,명복의 장소,,,Locus Requiescat,,,,Место вечного упокоения,Место починка,,Locus Requiescat +Ordeal,TXT_HEXDD_MAP52,,,,Utrpení,Forbandelse,Heimsuchung,,Provo Per Aflikto,Prueba,,Koettelemus,Supplice,,Megpróbáltatás,Supplizio,試練,시죄의 시련,Orde,Prøvelsen,Męka,Suplício,,Supliciu,Испытание,Изазов,Rättegång,Çile +Armory,TXT_HEXDD_MAP53,,,Armoury,Zbrojnice,Våbenkammer,Waffenkammer,,Armilejo,Armería,,Asehuone,Amurerie,,Fegyvertár,Armeria,武器庫,무기고,Wapenkamer,Våpenkammer,Zbrojownia,Arsenal,,Arsenal,Оружейная,Оружарница,Vapenförråd,Cephanelik +Nave,TXT_HEXDD_MAP54,,,,Chrámová loď,,Kirchenschiff,,Navo,La Nave,,Laiva,Nef,,Templomhajó,Navata,身廊,본당,Naaf,Skipet,Nawa,,,Naos,Неф,Брод,,Nef +Chantry,TXT_HEXDD_MAP55,,,,Modlitebna,Korskirke,Kantorei,,Kapelo,Capilla,,Kappeli,Chapelle,,Gyászkápolna,Cappella,小礼拝堂,예배당,,Minnekapellet,Kaplica Wotywna,Capela,,Capelă,Часовня,Капела,Kyrkogård,Dua Odası +Abattoir,TXT_HEXDD_MAP56,,,,Jatka,Slagteriet,Schlachthaus,,Buĉejo,Matadero,,Teurastamo,Abbatoire,,Vágóhíd,Mattatoio,屠殺場,도살장,Slachthuis,Slakteriet,Rzeźnia,Matadouro,,Abator,Бойня,Кланица,Slakthus,Mezbaha +Dark Watch,TXT_HEXDD_MAP57,,,,Tmavá hlídka,Mørk vagt,Dunkle Wache,,Ombra Gardisto,Guardia Oscura,,Pimeä vartio,Garde Noire,,Éjjeli Őrség,Guardia Oscura,闇の刻計,어둠의 감시초소,Donkere horloge,Mørkets vakt,Ciemna Strażnica,Guarda Negra,,Gardian întunecat,Тёмный страж,Мрачни чувар,Mörk vakt,Karanlık Saat +Cloaca,TXT_HEXDD_MAP58,,,,Kloaka,,Kloake,,Kloako,Cloaca,,Kloaakki,Cloaque,,Kloáka,,排泄腔,하수구,,,Kloaka,,,,Клоака,Клоака,,Kloaka +Ice Hold,TXT_HEXDD_MAP59,,,,Ledová pevnost,Isrum,Eiskammer,,Fuorto el Glacio,Tierra de Hielo,,Jääsäilö,Fort de Glace,,Jégtorony,Fortezza di Ghiaccio,氷結,빙고,Ijskamer,Ishall,Lodowa Twierdza,Fortaleza de Gelo,,Fort glaciar,Ледяная твердь,Ледена утврда,Ishållet,Buz Tutucu +Dark Citadel,TXT_HEXDD_MAP60,,,,Temná citadela,Mørkt citadel,Dunkle Festung,,Ombra Citadelo,Fortaleza Oscura,,Pimeä linnake,Citadelle Sombre,,Sötét Torony,Cittadella Oscura,暗黒の城塞,어둠의 요새,Donkere citadel,Mørkets citadell,Mroczna Cytadela,Cidadela Negra,,Cetatea întunecată,Тёмная цитадель,Мрачна цитадела,Mörkt citadell,Karanlık Kale +Transit,TXT_HEXDD_MAP33,,,,Převoz,,,,Vojo,Sala de Espera,,Läpikulku,,,Tranzit,Passaggio,変遷,통로,Doorvoer,Transitt,Tranzyt,Sala de Espera,,Tranzit,Переход,Прелаз,,Transit +Over'n Under,TXT_HEXDD_MAP34,,,,Nad a Pod,,Drunter und Drüber,,Sub kaj Supre,Arriba y Abajo,,Yli ja ali,Sens Dessus Dessous,,Fent és Lent,Sopra e Sotto,天と地,높낮이,Over'n under,Over og under,Nad I Pod,Sobre e Sob,,Mai sus și Mai jos,Выше и ниже,Изнад и испод,Över'n Under,Üst ve Alt +Deathfog,TXT_HEXDD_MAP35,,,,Mha skonu,Dødens tåge,Todesnebel,,Mortnebulo,Niebla de Muerte,,Kuolonsumu,Brume Mortelle,,Halálköd,Nebbia di Morte,死の霧,죽음의 안개,Dodenmist,Dødståke,Mgła Śmierci,Névoa da Morte,,Ceața morții,Туман смерти,Магла смрти,Dödsfog,Ölüm Sisi +Castle of Pain,TXT_HEXDD_MAP36,,,,Hrad bolesti,Frygtens slot,Burg der Angst,,Kastelo de Doloro,Castillo del Dolor,,Tuskan linna,Château de la Douleur,,Fájdalom Kastélya,Castello del Dolore,苦しみの城,고통의 성,Kasteel van pijn,Smertens slott,Zamek Bólu,Castelo da Dor,,Castelul durerii,Замок боли,Тврђава бола,Slottet av smärta,Acı Kalesi +Sewer Pit,TXT_HEXDD_MAP37,,,,Odpadní jáma,Kloakgrube,Kanalgrube,,Fekaĵputo,Pozo de Residuos,,Viemärimonttu,Trou d'Egout,,Kanális akna,Fossa della Fogna,地下溝穴,하수도,Rioolput,Kloakkgropen,Ściek,Fossa de Esgoto,,Groapa de scurgere,Сточная яма,Канализациона јама,Avloppsgrop,Kanalizasyon Çukuru +The Rose,TXT_HEXDD_MAP38,,,,Růže,Rosen,Die Rose,,La Rozo,La Rosa,,Ruusu,La Rose,,A Rózsa,La Rosa,薔薇,장밋빛,De roos,Rosen,Róża,A Rosa,,Roza,Роза,Ружа,Rosen,Gül +,,Intermission texts,,,,,,,,,,,,,,,,,,,,,,,,,, "Once you beat the big badasses and clean out the moon base you're supposed to win, aren't you? Aren't you? Where's @@ -435,7 +435,7 @@ La seule sortie est de l'autre côté. Pour continuer à découvrir DOOM, jouez à « LES PORTES DE L'ENFER » et à son incroyable suite, « INFERNO »! -","Most, hogy elbántál a rohadékokkal és +",,"Most, hogy elbántál a rohadékokkal és kitakarítottad a holdbázist, elvileg győznöd kéne, nem? Nem? Hol van a zsíros jutalmad meg a retúrjegyed? Mégis @@ -754,7 +754,7 @@ le foutoir qu'ils ont causé! Rapidement, vous descendez en rappel aux enfers. Il est maintenant temps pour le -chapitre final de DOOM! -- INFERNO.","Megcsináltad! Győzedelmeskedtél az +chapitre final de DOOM! -- INFERNO.",,"Megcsináltad! Győzedelmeskedtél az elveszett Deimosz bázist uraló förtelmes Kiberdémon felett! De... hol is vagy most? Felkapaszkodsz a Hold szélére, és lenézel, @@ -1097,7 +1097,7 @@ Enfin rentré à la maison. Vous vous demandez ce qu'il se passait ici tandis que vous vous battiez contre les forces du mal. C'est bien de savoir -qu'aucun démon ne vous a suivi..","Az undorító pókvezér, aki kitervelte +qu'aucun démon ne vous a suivi..",,"Az undorító pókvezér, aki kitervelte a holdbázisok elleni inváziót és annyi ember halálát okozta, végre megkapta a magáét. @@ -1423,7 +1423,7 @@ devant vous encore plus de douleur et de massacre potentiels: une nation de démons se déversent dans nos cités! -Prochain arrèt: L'enfer sur terre!","Biztosan a pókdémon küldte eléd démoni +Prochain arrèt: L'enfer sur terre!",,"Biztosan a pókdémon küldte eléd démoni hadseregét, mielőtt utoljára szembeszálltál ezzel a borzalmas pokolbéli szörnyeteggel. De te egy lépéssel előttük jártál, és örök @@ -1715,7 +1715,7 @@ une zone fortifiée. Si vous pouvez la traverser, vous pénétrerez dans le cœur hanté de la base spatiale et trouverez la commande qui garde les terriens en -otage.","Behatoltál a démonoktól hemzsegő csillagkikötő mélyére. +otage.",,"Behatoltál a démonoktól hemzsegő csillagkikötő mélyére. De valami nem stimmel. A szörnyek magukkal hozták a saját valóságukat, és csupán a jelenlétükkel megbolygatják a kikötő technológiáját. @@ -2035,7 +2035,7 @@ empêcher de nous envahir. La base se trouve au cœur de votre ville natale, non loin de l'astroport. » Lentement et douloureusement, vous vous levez -et retournez au combat.","Nyertél! A győzelmed utat nyitott +et retournez au combat.",,"Nyertél! A győzelmed utat nyitott az emberiségnek, hogy kiüríthessék a Földet, és megmeneküljenek a rémálomtól. Te maradtál az egyetlen ember a Föld felszínén. @@ -2332,7 +2332,7 @@ travers. Il doit y avoir un moyen de l'autre côté. En quoi ça importe d'avoir à traverser -les enfers pour y arriver?","A város elátkozott szívéhez értél, +les enfers pour y arriver?",,"A város elátkozott szívéhez értél, körülvéve az ellenségeid hulláival. Nem találsz módot arra, hogy megsemmisítsd a lények átjáróját ezen az oldalon, így összeszorítod a fogaidat, @@ -2571,7 +2571,7 @@ iront quand ils seront morts maintenant. Essuyant la sueur de votre front, vous entreprenez le long chemin du retour. Reconstruire la Terre devrait être plus -amusant que de la détruire.","A borzalmas ábrázata a legnagyobb démonnak +amusant que de la détruire.",,"A borzalmas ábrázata a legnagyobb démonnak amit valaha láttál összeomlik előtted, amikor betömködted a rakétáidat a kilátszódó agyába. A szörny összeroncsolodik és meghal, a @@ -2805,7 +2805,7 @@ niveau secret! Il semble avoir été construit part des humains, plutôt que par des démons. Vous vous demandez qui donc se trouve -prisonnier des enfers ici...","Gratulálunk, megtaláltad a titkos pályát! +prisonnier des enfers ici...",,"Gratulálunk, megtaláltad a titkos pályát! Úgy tűnik, hogy ezt emberek építették, és nem démonok. Elgondolkodsz azon, hogy miféle lények tartózkodnak a pokol eme szegletében.","Congratulazioni, hai trovato il livello @@ -2877,7 +2877,7 @@ paahtaa tämän läpi!","Félicitations, vous avez trouvé le niveau super secret! Vous avez intérêt à y aller franchement pour celui-ci! -","Gratulálunk, megtaláltad a szupertitkos pályát! +",,"Gratulálunk, megtaláltad a szupertitkos pályát! Jobban jársz, ha ezen hamar áttöröd magad!","Congratulazioni, hai trovato il livello super segreto! È meglio che tu lo percorra di corsa! @@ -3006,7 +3006,7 @@ l'on sûrement pris avec eux. Vous devez trouver le prototype, ou tous vos combats auront été vains. continez à avancer, à vous battre, à tuer. -Oh oui, à vivre, aussi.","Kéjsóvár tekintettel nézel az áramló +Oh oui, à vivre, aussi.",,"Kéjsóvár tekintettel nézel az áramló Őrző hulláján. A halálával kicsavartad a Gyorsítót a Pokol büdös karmaiból. Ellazulsz és egy pillantást teszel körül a szobában. Francba! @@ -3222,7 +3222,7 @@ et vous obtenez le prototype d'accélérateur que vous parvenez à désactiver efficacement et pour toujours. -Vous êtes doué pour ces choses là.","Még a halálos Ősálnok-labirintus sem tudott +Vous êtes doué pour ces choses là.",,"Még a halálos Ősálnok-labirintus sem tudott megállítani, és eljutottál a Gyorsító prototípushoz, ami hamarosan végleg ki lesz iktatva. @@ -3369,7 +3369,7 @@ Mais vous savez qui est pire! Souriant malicieusement, vous vérifiez l'équipement et vous vous préparez a faire voir a ce fumier un petit enfer -fait de vos propres mains!","Beverekedted magad az ördögkaptár szívébe. +fait de vos propres mains!",,"Beverekedted magad az ördögkaptár szívébe. Itt az idő arra, hogy felderítsd és kiiktasd a Kapuőrzőt, aki piszkos kölykeit a Földre zúdítja. Igen, ő rossz. De te tudod, hogy nála ki rosszabb! @@ -3581,7 +3581,7 @@ Souvenez vous de dire a vos enfants de mettre un lance-roquette dans votre cercueil. Si vous allez en enfer, quand vous serez mort, vous en aurez -besoin, pour un nettoyage définitif...","A Kapuőrző gonosz arca szétloccsant az egész +besoin, pour un nettoyage définitif...",,"A Kapuőrző gonosz arca szétloccsant az egész környéken. Ahogy a hullája összecsuklik, egy átfordított Kapú megjelenik és beszippantja a Gyorsító Prototípus összes maradványait, @@ -3753,7 +3753,7 @@ le plus difficile que nous avons. J'espère que vous avez sauvegardé lors du précédent... Sinon, soyez prêt a mourir souvent. -Pour les pros seulement.","Megtaláltad a második legnehezebb szintet +Pour les pros seulement.",,"Megtaláltad a második legnehezebb szintet amit csináltunk. Reméljük hogy van egy mentésed, vagy kettő. Ha nem, akkor készülj a halálra kegyetlenül. Csak szakértő @@ -3831,7 +3831,7 @@ elävänä.","Alors, vous vous demandiez quel avions préparé pour vous? Maintenant, vous savez. Nul n'en sortira vivant. -","Feltetted magadban a kérdést, hogy mi a +",,"Feltetted magadban a kérdést, hogy mi a legnehezebb pálya, amit kínálunk neked? Most már tudod. Senki sem jut ki innen élve.","Scommetto che ti chiedevi quale fosse il @@ -3962,7 +3962,7 @@ militaire, cela grouille d'horreurs morbides prêtes a vous estropier. Avec un peu de chance, le complexe a encore quelques armes de guerre -aux alentours.","Végig küzdötted magad a fertőzött kísérleti laborokon. +aux alentours.",,"Végig küzdötted magad a fertőzött kísérleti laborokon. Úgy néz ki a UAC épületek láttak jobb napokat is. Szegény UAC gondokba fog ütközni amikor a munkavállalókra akar majd kötni egészségbiztosítást. @@ -4160,7 +4160,7 @@ un festin de sang, mais vous vous sentez comme deux milliers de fous dans le corps d'un seul et même tueur. -Vous ne pensez pas mourir si facilement.","Már messziről hallod az üzemi gépek zaját. +Vous ne pensez pas mourir si facilement.",,"Már messziről hallod az üzemi gépek zaját. Csak mered remélni, hogy a gépsorok nem démonfajzatokat gyártanak. Legbelül azonban készen állsz arra is hogy tömegével zúzod össze őket. @@ -4338,7 +4338,7 @@ Plus vous pensiez a cette idée, plus vous sombrez dans la folie. Saisissant votre arme, un sourire maléfique apparait sur votre visage. -Il est l'heure de buter du démon....","Az előtted heverő kilátás rohadtul ismerősnek tűnik. +Il est l'heure de buter du démon....",,"Az előtted heverő kilátás rohadtul ismerősnek tűnik. És a szaga is -- égetett ürülék. Eddig sem voltál oda a helyért, de immáron kifejezetten gyűlölöd. Minél jobban agyalsz rajta, annál jobban felborzolja az idegeidet. @@ -4526,7 +4526,7 @@ Avez vous réellement gagné? Quelque chose gronde au loin. une lumière bleue a commence a luire dans le crâne défoncé du cracheur -de démons.","Hirtelen minden elcsendesül amerra a szem ellát. +de démons.",,"Hirtelen minden elcsendesül amerra a szem ellát. A pokol kínzó visszahangja immáron a múlté, a rémálomszerű égbolt kékre változik, a halmokba mészárolt démon hullák kezdenek elpárologni a terjengő bűzzel együtt. @@ -4697,7 +4697,7 @@ Bon, rien ne peut être pire que d'habitude. N'est-ce pas? Ou peut être est-ce mieux de laisser dormir les dieux.. -","Most mi lesz? Teljesen megváltozott. Olyan mint +",,"Most mi lesz? Teljesen megváltozott. Olyan mint Tutanhamon Király lakosztálya. Legalább, bármi ami itt tartózkodik csak nem lehet rosszabb a szokásosnál. Vagy mégis? Vagy talán az a legjobb @@ -4843,7 +4843,7 @@ de l'enfer. Quand vous descendez du transport, vous entendez le bruit du sabot d'acier -d'un Cyberdémon.","Itt az idő a vakációra. Szétrepesztetted a Pokol +d'un Cyberdémon.",,"Itt az idő a vakációra. Szétrepesztetted a Pokol beleit, és a fenébe is, megérdemled a pihenést! Magadhoz motyogsz, Talán legközelebb valaki más rúghatná seggbe a Pokol valagát. @@ -5146,7 +5146,7 @@ gémissements d'agonie se déversent de son visage que vous avez laissé en charpie. Le manège est fermé! -","Megint csak a baj van a kedvenc vakáció +",,"Megint csak a baj van a kedvenc vakáció helyeddel...a Pokollal. Valami Kiborgdémon tapló azt hitte, hogy a Poklot átalakíthatja a személyes vidámparkjává, és a Föld lesz a jegyszedő fülke. @@ -5480,7 +5480,7 @@ Bien sûr cela veut dire que vous auriez pû rester coincé dans un monde très hostile, mais personne n'a jamais dit qu'être un hérétique -soit facile!","Az Ezüst Félholtak és szolgái +soit facile!",,"Az Ezüst Félholtak és szolgái elpusztításával együtt az utolsó élőhalott is el lett törölve a létsík ezen szintjéről. @@ -5825,7 +5825,7 @@ plus atroce que les créatures de ce portail? La forme d'un dôme de cristal dépasse de l'horizon, couvrant le ciel, ce n'est pas -de bon augure....","Immáron nyílvánvaló, hogy a hatalmas +de bon augure....",,"Immáron nyílvánvaló, hogy a hatalmas maulotaurok nem a te súlycsoportodban voltak, és ahogy a bűzölgő holtestük összeesik, egyfajta morbid elégedettséget érzel kimúlásuk láttán. @@ -6191,7 +6191,7 @@ ne pouvez pas en être sûr, mais ce n'est peut être qu un cri. De plus, qu'adviendra-il des autres -chevaucheurs de serpent?","D'Sparil halála megszüntette a +chevaucheurs de serpent?",,"D'Sparil halála megszüntette a varázslatos köteléket mely a lényeket ezen a szinten tartotta. A végső sikolyaik túlharsogják @@ -6606,7 +6606,7 @@ l'espoir de trouver une sortie, quelque part, dans la plus sombre partie du royaume de D'Sparil. Sa garde personnelle attend votre -arrivée ...","Azt hitted, hogy D'Sparil halála után visszatérhetsz +arrivée ...",,"Azt hitted, hogy D'Sparil halála után visszatérhetsz a saját világodba, de utolsó lehelletével száműzött a saját dimenziójába. Belépbe megpillantod a D'Sparil által leigázott romos vidéket. Legyőzted a vidék @@ -6963,7 +6963,7 @@ En avez vous le courage? Vous pensez a la fin que ce n'est pas dans votre nature de vous rendre sans combattre. Les yeux larges, vous -partez rencontrer votre destinée.","Amikor az utolsó maulotaur végső +partez rencontrer votre destinée.",,"Amikor az utolsó maulotaur végső lehelletével felbőg, tudatosul benned, hogy még sosem voltál ennyire közel a halálhoz. Talán még a D'Sparil és @@ -7329,7 +7329,7 @@ cas. Plus loin, brillant à l'horizon, les murs toujours changeants de l'Hypostyle -semblent moquer vos efforts.","Elhaladva a birodalmat bezáró Hét +semblent moquer vos efforts.",,"Elhaladva a birodalmat bezáró Hét Portálnál előtt, egy kíméletlen vadon látványa tárul eléd. A tűzes, jeges, és acélozott próbatételeket kiálltad, de @@ -7688,7 +7688,7 @@ les cris des damnés. Vous vous avancez et les chants démoniaques vous glacent le sang. Par les dieux de la douleur, où -êtes vous arrivé? Comment sortir d'ici?","A küzdelemtől zsongó elméddel +êtes vous arrivé? Comment sortir d'ici?",,"A küzdelemtől zsongó elméddel támolyogsz előre, a kiút reményében. Hirtelen a minden felgyorsul körülötted, elmosódik a világ majd el @@ -8055,7 +8055,7 @@ des douzaines d'yeux sinistres vous observant. Quelque part ici, vos enemis vous attendent... -","Az ősök legerősebb fegyverei és +",,"Az ősök legerősebb fegyverei és varázstárgyai éppen elég erősek voltak a Főeretnek és követői legyőzésére, és immáron a lábad előtt @@ -8349,7 +8349,7 @@ de la lumière, personne ne le sait. » -Merde!","""...majd a hős belép a holtak +Merde!",,"""...majd a hős belép a holtak királyságába, és az ott portyázó sereget lekaszabolja egészen a Kétség Kapujáig. Azonban senki sem @@ -8540,7 +8540,7 @@ un grand hall, rempli d'échos spectraux et d'ombres menaçantes. Plus loin, vous pouvez voir une estrade sur laquelle se trouve la seule source -de lumière dans ce monde.","A tested köré csavarodó tűzcsóvák +de lumière dans ce monde.",,"A tested köré csavarodó tűzcsóvák szinte kitépnek ebből a világból, a környék csendjét csak a gyötrelmes ordításod töri meg. Amikor látásod @@ -8721,7 +8721,7 @@ un nouveau joueur va rejoindre le jeu cosmique du pouvoir. Comme un pion promu au rang de reine, les extrêmités de l'échiquier sont -maintenant à votre portée.","Ez nem lehet más, csak a Káosz +maintenant à votre portée.",,"Ez nem lehet más, csak a Káosz Gömb, mely Korax hatalmának forrása. Ezzel a hatalommal egész világokat lehet teremteni...vagy éppen @@ -8856,7 +8856,7 @@ mahtavampia, ja kuka voi tietää heidän seuraavat liikkeensä?","Mais il y a encore des joueurs plus puissants que vous encore, et qui peut prédire ce qu'ils feront pendant -leur tour?","\nvannak ám nagyobb hatalmú +leur tour?",,"\nvannak ám nagyobb hatalmú játékosok is, és ki tudná előre a következő lépésüket?","""\nMa ci sono altri giocatori più potenti di te, e chi può conoscere le loro prossime mosse? @@ -9049,7 +9049,7 @@ essayez de vous rassurer. Cela suffira, après tout, cela doit suffir, n'est-ce pas? -N'est-ce pas?","Megtörlöd még mindig reszkető +N'est-ce pas?",,"Megtörlöd még mindig reszkető kezeddel a véres homlokod, és próbálod kitisztítani a gondolataidat, hogy rájöjj mi jön most... @@ -9427,7 +9427,7 @@ de mort.. -...pour les fortunés.","Az már biztos számodra, hogy miután +...pour les fortunés.",,"Az már biztos számodra, hogy miután csak az átkozottak lakják a vidéket, semmiféle jó nem maradhat életben. @@ -9727,7 +9727,7 @@ d'être observé par des yeux tapis dans l'ombre.. ..des yeux dissimulant des -maléfiques volontés.","Újra a Káosz Gömb csarnokában +maléfiques volontés.",,"Újra a Káosz Gömb csarnokában találod magad ugyanazon árnyékok között, mintha megállt volna itt az idő. @@ -9971,7 +9971,7 @@ des mains de tous, ses promesses laissées à l'abandon. Mais vous n'êtes pas le type de -personne à avoir peur d'un défi..","Korábban félelemtől reszkető kézzel +personne à avoir peur d'un défi..",,"Korábban félelemtől reszkető kézzel fogtad a gömböt, most azonban a hatalomtól megrészegedve reszketsz. Úgy érzed maga a hatalom fog tőrbe @@ -10138,7 +10138,7 @@ okumalardan geri adım atan biri olmadın..." "\n...and other players await. -",TXT_HEXDD_WIN3MSG,,,,\n...a ostatní hráči už čekají.,\n...og andre spillere venter.,\n...und andere Spieler warten.,,\n...kaj aliaj ludantoj atendas.,\n...y otros jugadores esperan.,,\n...ja muut pelaajat odottavat.,\n...Et d'autres joueurs attendent.,"\n...és a többi játékos a te +",TXT_HEXDD_WIN3MSG,,,,\n...a ostatní hráči už čekají.,\n...og andre spillere venter.,\n...und andere Spieler warten.,,\n...kaj aliaj ludantoj atendas.,\n...y otros jugadores esperan.,,\n...ja muut pelaajat odottavat.,\n...Et d'autres joueurs attendent.,,"\n...és a többi játékos a te lépésedre vár.",\n...e altri giocatori aspettano.,"\n...更なる挑戦者を待ち構えながら。 ",\n...그리고 다른 도전자들이 기다리고 있다.,\n...en andere spelers wachten op je.,"\n... og andre aktører venter. @@ -10149,316 +10149,316 @@ lépésedre vár.",\n...e altri giocatori aspettano.,"\n...更なる挑戦者を ",\n... och andra spelare väntar.,"\n...ve diğer oyuncular bekliyor. " -,,Hexen script texts,,,,,,,,,,,,,,,,,,,,,,,,, -The door is locked,TXT_ACS_MAP01_5_THEDO,,,,Dveře jsou zamčené.,Døren er låst,Die Tür ist verschlossen,,La pordo estas ŝlosita.,La puerta está cerrada,,Ovi on lukittu,Cette porte est verouillée.,Az ajtó zárva van.,La porta è bloccata,扉は施錠されている,문이 잠겨 있다,De deur is op slot,Døren er låst,Drzwi są zablokowane,A porta está trancada,,Ușa e încuiată,Дверь заперта,Врата су закључана,Dörren är låst,Kapı kilitli -"Greetings, mortal",TXT_ACS_MAP02_9_GREET,,,,"Vítej, smrtelníče,","Vær hilset, dødelige","Sei gegrüßt, Sterblicher",,"Salutojn, mortemul'.","Saludos, mortal",,"Tervehdys, kuolevainen","Salutations, humain.","Üdvözöllek, halandó!","Salve, mortale",御機嫌よう、小僧,"환영한다, 필멸자여.","Groeten, sterfelijk","Vær hilset, dødelige",Witaj śmiertelniku,"Saudações, mortal.",,"Salutări, muritorule","Приветствую, смертный","Поздрав, смртниче","Hälsningar, dödliga","Selamlar, ölümlü" -Are you ready to die?,TXT_ACS_MAP02_11_AREYO,,,,jsi připraven@[ao_cs] zemřít?,Er du klar til at dø?,Bist du bereit zu sterben?,,Ĉu vi pretas morti?,¿Estás listo para morir?,,Oletko valmis kuolemaan?,Êtes-vous prêt à mourir?,Készen állsz a halálra?,Sei pronto a morire?,死に急ぐ仕度は整ったか?,죽을 준비는 됐는가?,Ben je klaar om te sterven?,Er du klar til å dø?,Czy jesteś gotów na śmierć?,Você está pront@[ao_ptb] para morrer?,,Ești pregătit să mori?,Готов ли ты умереть?,Јеси ли спреман да умреш?,Är du redo att dö?,Ölmeye hazır mısın? -A door opened on the Guardian of Ice,TXT_ACS_MAP02_20_ADOOR,,,,Ve Strážci ledu se otevřely dveře.,En dør åbnede sig på isens vogter,Eine Tür öffnet sich zum Wächter des Eises,,Pordo malfermiĝis ĉe la Gardanto de Glacia.,Se abrió una puerta en el Guardián de Hielo,,Ovi avautui jään vartijan luona,Une porte s'est ouverte dans le Gardien de Glace.,Egy ajtó kinyillott a Jég Őrzőjénél,Una porta è stata aperta sul Guardiano di Ghiaccio,氷の守護者にある扉は開かれた,얼음의 수호자에서 문이 열렸다,Een deur opende op de bewaker van ijs,En dør åpnet seg på Isens vokter,Drzwi w Strażniku Lodu otworzyły się,Uma porta se abriu no Guardião de Gelo,,O ușă s-a deschis pe Gardianul de Foc,Дверь открыта у стража льда,Врата су отворена код Чувара леда,En dörr öppnades på isens väktare,Buz Muhafızı'nda bir kapı açıldı -This path is barred,TXT_ACS_MAP03_12_THISP,,,,Cesta je zatarasená.,Denne vej er spærret,Dieser Pfad ist blockiert,,Ĉi tiu vojo estas barita.,Este camino está atrancado,,Tämä polku on teljetty,Ce chemin est barré.,Ez az út el van torlaszolva.,Questo percorso è sbarrato,この道は塞がれている,이 통로는 빗장이 걸려있다,Dit pad is geblokkeerd,Denne veien er sperret,Ścieżka jest zablokowana,Este caminho está bloqueado,,Această cale e blocată,Сейчас этот путь закрыт,Овај пут је тренутно забрањен,Denna väg är spärrad,Bu yol yasaklandı -One half of the puzzle has been solved,TXT_ACS_MAP04_9_ONEHA,,,,U Sedmera portálů byla vyřešena,Den ene halvdel af puslespillet er blevet løst,Eine Hälfte des Rätsels wurde gelöst,,Unu duono de la puzlo estas solvita,Una mitad del acertijo se ha resuelto,,Puolet pulmasta on ratkaistu,La moitié du puzzle à été résolu,A rejtvény egyik fele meg lett fejtve,Metà del puzzle è stato risolto,パズルの一つが解かれた,수수께끼의 절반이 풀렸다,De helft van de puzzel is opgelost,Den ene halvdelen av gåten er løst,Połowa zagadki rozwiązana,Metade do quebra-cabeça foi resolvido,,O jumătate din puzzle e rezolvată,Половина головоломки разгадана,Половина загонетке је решена,En halva av pusslet har lösts,Bulmacanın bir yarısı çözüldü -on the Seven Portals,TXT_ACS_MAP04_10_ONTHE,,,,jedna třetina rébusu.,på de syv portaler,bei den Sieben Portalen,,ĉe la Sep Portaloj.,en los Siete Portales,,seitsemän portaalin luona,pour les Sept Portails.,a Hét Portálon,nei Sette Portali,漆之門に影響を与えた,... 일곱 차원문에서,op de Zeven Portalen,på de syv portaler,przy Siedmiu Portalach,nos Sete Portais,,pe cele Șapte Portaluri,на Семи порталах,на Седам портала,på de sju portalerna,Yedi Portalda -One third of the puzzle has been solved,TXT_ACS_MAP04_11_ONETH,,,,U Sedmera portálů byla vyřešena,En tredjedel af gåden er blevet løst,Ein Drittel des Rätsels wurde gelöst,,Unu triono de la puzlo estas solvita,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,A rejtvény egyharmada megfejtésre került,Un terzo del puzzle è stato risolto,三種のパズルの一つが解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost,En tredjedel av puslespillet er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle a fost rezolvată,Треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet har lösts,Bulmacanın üçte biri çözüldü -Stairs have risen on the Seven Portals,TXT_ACS_MAP04_12_STAIR,,,,jedna třetina rébusu.,Der er kommet en trappe op på de syv portaler,Stufen bei den Sieben Portale wurden erbaut,,Ŝtupoj leviĝis ĉe la Sep Portaloj.,Unas escaleras se han erguido en los Siete Portales,,Portaat ovat kohonneet seitsemän portaalin luona,Des escaliers sont apparus dans les Sept Portails.,A Hét Portálon belül egy lépcsősor emlekedett,Sono sorte le scale nei Sette Portali,漆之門に階段が立ち昇った,일곱 차원문에서 계단이 솟아났다,Trappen zijn gestegen op de Zeven Portalen,Trapper har reist seg på De syv portaler,Schody przy Siedmiu Portalach podniosły się,As escadas se ergueram nos Sete Portais,,S-au ridicat scări pe cele Șapte Portaluri,Лестница воздвигнулась на Семи порталах,Степенице се подижу на Седам портала,En trappa har stigit upp i de sju portalerna,Yedi Portalda merdivenler yükseldi -One third of the puzzle has been solved,TXT_ACS_MAP05_6_ONETH,,,,U Sedmera portálů byla vyřešena,En tredjedel af puslespillet er blevet løst,Ein Drittel des Rätsels wurde gelöst,,Unu triono de la puzlo estas solvita,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,A rejtvény egyharmada megfejtésre került,Un terzo del puzzle è stato risolto,三種のパズルの一つが解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost,En tredjedel av puslespillet er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle a fost rezolvată,Треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet har lösts,Bulmacanın üçte biri çözüldü -on the Seven Portals,TXT_ACS_MAP05_7_ONTHE,,,,jedna třetina rébusu.,på de syv portaler,bei den Sieben Portalen,,ĉe la Sep Portaloj.,en los Siete Portales,,seitsemän portaalin luona,pour les Sept Portails.,a Hét Portálon,nei Sette Portali,漆之門 に影響を与えた,... 일곱 차원문에서,op de Zeven Portalen,på de syv portaler,przy Siedmiu Portalach,nos Sete Portais,,pe cele Șapte Portaluri,на Семи порталах,на Седам портала,på de sju portalerna,Yedi Portalda -Stairs have risen on the Seven Portals,TXT_ACS_MAP05_8_STAIR,,,,Schody se zvedly u Sedmera portálů.,Trappen er steget op på de syv portaler,Stufen bei den Sieben Portale wurden erbaut,,Ŝtupoj leviĝis ĉe la Sep Portaloj.,Unas escaleras se han erguido en los Siete Portales,,Portaat ovat kohonneet seitsemän portaalin luona,Des escaliers sont apparus dans les Sept Portails.,A Hét Portálon belül egy lépcsősor emlekedett,Sono sorte le scale nei Sette Portali,漆之門 に階段が立ち昇った,일곱 차원문에서 계단이 솟아났다,Trappen zijn gestegen op de Zeven Portalen,Trappene har reist seg på De syv portaler,Schody przy Siedmiu Portalach podniosły się,Escadas se ergueram nos Sete Portais,,S-au ridicat scări pe cele Șapte Portaluri,Лестница воздвигнулась на Семи порталах,Степенице се подижу на Седам портала,Trappor har stigit upp på de sju portalerna,Yedi Portalda merdivenler yükseldi -You have to find another switch...,TXT_ACS_MAP05_9_YOUHA,,,,Musíš najít další spínač.,Du skal finde en anden kontakt...,Du must einen weiteren Schalter finden...,,Vi bezonas trovi alian ŝaltilon...,Debes encontrar otro interruptor...,Debes encontrar otro switch...,Sinun on löydettävä toinen vipu...,Vous devez trouver un autre bouton..,Egy másik kapcsolót kell találnod...,Devi trovare un altro interruttore...,他のスイッチも探す必要がある...,다른 개폐기를 찾아야 한다,Je moet een andere schakelaar vinden...,Du må finne en annen bryter...,Musisz znaleźć inny przełącznik...,Você precisa encontrar outro interruptor...,,Trebuie să găsești alt buton...,Остался ещё один переключатель...,Остао је још један прекидач...,Du måste hitta en annan omkopplare...,Başka bir anahtar bulmalısın... -Stones grind on the Seven Portals,TXT_ACS_MAP05_10_STONE,,,,Kameny dřou u Sedmera portálů.,Stenene knirker på de syv portaler,Steine schleifen bei den Sieben Portalen,,Ŝtonoj grincas ĉe la Sep Portaloj.,Las piedras giran en los Siete Portales,,Kiviä vierii seitsemän portaalin luona,Des pierres grincent dans les Sept Portails.,Kövek örlődnek a Hét Portálnál,Le pietre si sono frantumate nei Sette Portali,漆之門 の石壁が砕かれた,일곱 차원문에서 바위 부딪히는 소리가 들려왔다,Stenen slijpen op de Zeven Portalen,Steiner knuser på De syv portaler,Kamienie przy Siedmiu Portalach zgrzytają,As pedras giram nos Sete Portais,,Pietrele încep să macine pe cele Șapte Portaluri,Каменная преграда отступила на Семи порталах,Камена препрека се повлачи,Stenar slipar på de sju portalerna,Taşlar Yedi Portalda öğütülüyor -One sixth of the puzzle has been solved,TXT_ACS_MAP08_6_ONESI,,,,V Temném hvozdu byla vyřešena,En sjettedel af puslespillet er blevet løst,Ein Sechstel des Rätsels wurde gelöst,,Unu sesono de la puzlo estas solvita,Un sexto del acertijo se ha resuelto,,Kuudennes pulmasta on ratkaistu,Un sixième du puzzle à été résolu,A feladványok egyhatoda megfejtésre került,Un sesto del puzzle è stato risolto,六種のパズルの一つが解かれた,수수께끼의 6분의 1이 풀렸다,Een zesde van de puzzel is opgelost,En sjettedel av puslespillet er løst,Jedna szósta zagadki rozwiązana,Um sexto do quebra-cabeça foi resolvido,,O șesime din puzzle a fost rezolvată,Одна шестая головоломки разгадана,Шестина загонетке је решена,En sjättedel av pusslet har lösts,Bulmacanın altıda biri çözüldü -on the Shadow Wood,TXT_ACS_MAP08_7_ONTHE,,,,jedna šestina rébusu.,i Skyggetræet,Im Schattenwald,,en la Ombro-Arbareto.,En el Bosque de Sombras,,Varjosalossa,dans le Bois des Ombres.,a Sötét Erdőben,Nel Bosco d'Ombra,陰影樹 に少し影響を与えた,... 그림자 숲에서,op het Schaduwbos,på Skyggeskogen,w Lesie Cieni,na Floresta das Sombras,,în Pădurea Umbrelor,в лесу теней,у Шуми сенки,i skuggskogen,Gölge Ormanı'nda -The door is barred from the inside,TXT_ACS_MAP08_10_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está atrancada desde el interior,,Ovi on teljetty sisältä,Cette porte est bloquée de l'intérieur.,Az ajtó be van reteszelve belülről,La porta è sbarrata da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od środka,A porta está barrada por dentro,,Ușa e blocată dinăuntru,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. -You hear a door open in the distance,TXT_ACS_MAP08_11_YOUHE,,,,Slyšíš v dálce otevírající se dveře.,Du hører en dør åbne i det fjerne,"Du hörst, wie sich in der Ferne eine Tür öffnet",,Vi aŭdas pordon malfermiĝantan malproksime.,Escuchas que una puerta se abre a la distancia,,Kuulet oven avautuvan etäällä,Vous entendez une porte s'ouvrir au loin.,Hallod ahogy egy ajtó kinyílik a távolban,Senti una porta aprirsi in lontananza,遠くから扉が開く音が聞こえる,멀리서 문이 열리는 소리가 들린다,In de verte hoor je een deur openstaan.,Du hører en dør åpnes i det fjerne,Słyszysz odgłos otwierających się w oddali drzwi,Você ouve de longe uma porta se abrindo,,Auzi o ușă deschizându-se în depărtare,Слышен звук открывающейся двери,Чује се звук отварања врата,Du hör en dörr som öppnas i fjärran,Uzakta bir kapının açıldığını duyuyorsun. -One sixth of the puzzle has been solved,TXT_ACS_MAP09_6_ONESI,,,,V Temném hvozdu byla vyřešena,En sjettedel af puslespillet er blevet løst,Ein Sechstel des Rätsels wurde gelöst,,Unu sesono de la puzlo estas solvita,Un sexto del acertijo se ha resuelto,,Kuudennes pulmasta on ratkaistu,Un sixième du puzzle à été résolu,A feladványok egyhatoda megfejtésre került,Un sesto del puzzle è stato risolto,六種のパズルの一つが解かれた,수수께끼의 6분의 1이 풀렸다,Een zesde van de puzzel is opgelost,En sjettedel av gåten er løst,Jedna szósta zagadki rozwiązana,Um sexto do quebra-cabeça foi resolvido,,O șesime din puzzle a fost rezolvată,Одна шестая головоломки разгадана,Шестина загонетке је решена,En sjättedel av pusslet har lösts.,Bulmacanın altıda biri çözüldü -on the Shadow Wood,TXT_ACS_MAP09_7_ONTHE,,,,jedna šestina rébusu.,i Skyggetræet,Im Schattenwald,,en la Ombro-Arbareto.,En el Bosque de Sombras,,Varjosalossa,dans le Bois des Ombres.,a Sötét Erdőben,Nel Bosco d'Ombra,陰影樹 に少し影響を与えた,... 그림자 숲에서,op het Schaduwbos,på Skyggeskogen,w Lesie Cieni,na Floresta das Sombras,,în Pădurea Umbrelor,в лесу теней,у Шуми сенки,i skuggskogen,Gölge Ormanı'nda -One sixth of the puzzle has been solved,TXT_ACS_MAP10_6_ONESI,,,,V Temném hvozdu byla vyřešena,En sjettedel af puslespillet er blevet løst,Ein Sechstel des Rätsels wurde gelöst,,Unu sesono de la puzlo estas solvita,Un sexto del acertijo se ha resuelto,,Kuudennes pulmasta on ratkaistu,Un sixième du puzzle à été résolu,A feladványok egyhatoda megfejtésre került,Un sesto del puzzle è stato risolto,六種のパズルの一つが解かれた,수수께끼의 6분의 1이 풀렸다,Een zesde van de puzzel is opgelost,En sjettedel av puslespillet har blitt løst,Jedna szósta zagadki rozwiązana,Um sexto do quebra-cabeça foi resolvido,,O șesime din puzzle a fost rezolvată,Одна шестая головоломки разгадана,Шестина загонетке је решена,En sjättedel av pusslet har lösts.,Bulmacanın altıda biri çözüldü -on the Shadow Wood,TXT_ACS_MAP10_7_ONTHE,,,,jedna šestina rébusu.,i Skyggetræet,Im Schattenwald,,en la Ombro-Arbareto.,En el Bosque de Sombras,,Varjosalossa,dans le Bois des Ombres.,a Sötét Erdőben,Nel Bosco d'Ombra,陰影樹 に少し影響を与えた,... 그림자 숲에서,op het Schaduwbos,på Skyggeskogen,w Lesie Cieni,na Floresta das Sombras,,în Pădurea Umbrelor,в лесу теней,у Шуми сенки,i skuggskogen,Gölge Ormanı'nda -\ ettins left,TXT_ACS_MAP11_0_ETTIN,Yellow needs better translation,,,\ etinů zbývá.,\ ettins venstre,\ Ettins übrig,,\ gigantaĉoj ceteraj,\ Ettins restantes,,\ ettiniä jäljellä,\ ettins restants,\ ettin maradt,\ Ettins rimasti,\ 匹のエティンが残っている,\ 마리 에틴이 남았음,\ overgebleven Ettins,\ ettins igjen,\ pozostałych ettinów,\ ettins restantes,,\ etini rămași,\ оставшихся эттинов,Остало је \ еттина,\ ettins lämnade,\ ettins ayrıldı -"You waited too long, now you die!",TXT_ACS_MAP11_1_YOUWA,,,,"Čekal@[ao_cs] jsi moc dlouho, teď zemřeš!","Du ventede for længe, nu dør du!","Du hast zu lange gewartet, jetzt stirbst du!",,"Vi atendis tro longe, nun vi mortas!","Esperaste demasiado, ¡ahora morirás!",,"Odotit liian pitkään, nyt kuolet!","Vous avez attendu trop longtemps, maintenant, mourrez!","Túl sokáig vártál, most meghalsz!","Hai atteso troppo a lungo, ora muori!",長居をしたな、命を奪うには十分な程に!,시간을 너무 오래 끌었다. 이제 죽어라!,"Je hebt te lang gewacht, nu ga je dood!","Du ventet for lenge, nå dør du!",Czekałeś zbyt długo. Teraz giń!,Você esperou demais. Agora morrerá!,,"Ți-a luat prea mult, acum mori!",Слишком долго! Готовься к смерти!,Предуго! Припреми се за смрт!,"Du väntade för länge, nu dör du!","Çok bekledin, şimdi öleceksin!" -A door opened on the Forsaken Outpost,TXT_ACS_MAP11_7_ADOOR,,,,Dveře se otevřely na Opuštěném stanovišti.,En dør blev åbnet i forladt forpost,Eine Tür im verlassenen Vorposten hat sich geöffnet,,Pordo malfermiĝis ĉe la Forlasita Posteno.,Una puerta se abrió en el Puesto de Avanzada Abandonado,,Ovi avautui hylätyssä etuvartiossa,Une porte s'est ouverte dans la base abandonnée.,Egy ajtó kinyílik az Elátkozott Őrportyán,Una porta è stata aperta nell'Avamposto Abbandonato,荒れ果てた前哨地 への扉が開いた,버려진 초소에서 문이 열렸다,Een deur opende een deur op de Verwaarloosde buitenpost,En dør åpnet seg på den forlatte utposten,Drzwi przy Opuszczonym Posterunku otworzyły się,Uma porta se abriu no Posto Abandonado,,O ușă s-a deschis pe Avanpostul Părăsit,Дверь открылась на покинутой заставе,Врата су се отворила у Напуштеној постаји,En dörr har öppnats på försvunnen utposten,Unutulmuş Karakol'da bir kapı açıldı -This door won't open yet,TXT_ACS_MAP12_9_THISD,,,,Tyto dveře se ještě neotevřou.,Denne dør vil ikke åbne sig endnu,Die Tür öffnet sich noch nicht,,Ĉi tiu pordo ne jam malfermiĝos.,Esta puerta no se abrirá todavía,,Tämä ovi ei aukea vielä,Cette porte ne s'ouvre pas pour l'instant.,Ez az ajtó még nem fog kitárulni.,Questa porta non è aperta ancora,扉はまだ開かない,이 문은 아직 열 수 없다,Deze deur gaat nog niet open.,Denne døren vil ikke åpne seg ennå,Te drzwi jeszcze się nie otwierają,Esta porta não se abrirá ainda,,Ușa n-o să se deschidă încă,Сейчас эта дверь закрыта,Ова врата су тренутно закључана,Den här dörren kommer inte att öppnas än.,Bu kapı henüz açılmayacak. -"My servants can smell your blood, human",TXT_ACS_MAP13_11_MYSER,,,,"Mí služebníci cítí tvou krev, člověče.","Mine tjenere kan lugte dit blod, menneske","Meine Diener riechen dein Blut, Menschling",,"Miajn servantoj povas flari vian sangon, homo.","Mis sirvientes pueden oler tu sangre, humano",,"Palvelijani voivat haistaa veresi, ihminen","Mes servants peuvent sentir votre sang, humain.","Szolgáim érzik a véred szagát, emberfattya","I miei servi possono annusare il tuo sangue, umano",我が下僕が貴様の血を嗅ぎ付けた様だぞ、小童,"이 몸의 하인들은 네 피 냄새를 맏고 따라온다, 인간.","Mijn bedienden kunnen jouw bloed ruiken, mens","Mine tjenere kan lukte blodet ditt, menneske",Moje sługi czują twą krew śmiertelniku,"Meus servos sentem o cheiro do seu sangue, human@[ao_ptb]",,"Servitorii mei îți pot adulmeca sângele, muritorule","Мои прислужники чуют твою кровь, человек","Моје слуге миришу твоју крв, човече","Mina tjänare kan känna lukten av ditt blod, människa.","Hizmetçilerim kanının kokusunu alabiliyor, insan." -A door opened in the Gibbet,TXT_ACS_MAP21_0_ADOOR,,,,Dveře se otevřely na Šibenici.,En dør blev åbnet i Gibbet,Eine Tür in der Richtstätte wurde geöffnet,,Pordo malfermiĝis ĉe la Pendigilo.,Una puerta se abrió en la horca,,Ovi avautui hirsipuulla,Une porte s'est ouverte dans le gibet.,Egy ajtó kinyílik az Akasztófánál,Una porta è stata aperta nella Forca,晒し台 への扉が開いた,교수대에서 문이 열렸다,Een deur geopend in de Gibbet,En dør åpnet seg i galgen,Drzwi przy Szubienicy otworzyły się,Uma porta se abriu na Forca,,O ușă s-a deschis pe Eșafod,Проход будет открыт возле виселицы,Пролаз је отворен код вешала,En dörr öppnades i Gibbet,İnfaz yerinde bir kapı açıldı -The door is barred from the inside,TXT_ACS_MAP21_2_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está atrancada desde el interior,,Ovi on teljetty sisältä,Cette porte est bloquée de l'intérieur.,Az ajtó belülről van eltorlaszolva,La porta è sbarrata da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od środka,A porta está barrada por dentro,,Ușa e blocată dinăuntru,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. -A platform has lowered in the tower,TXT_ACS_MAP22_3_APLAT,,,,Plošina ve věži sjela dolů.,En platform er sænket i tårnet,Im Turm hat sich eine Plattform gesenkt,,Plataĵo malleviĝis en la turo.,Una plataforma ha bajado en la torre,,Lava on laskeutunut tornissa,Une plateforme est descendue dans la tour.,Egy platform leereszkedett a toronyban,Una piattaforma si è abbassata nella torre,塔内の昇降機が下りた,성 안에서 보행판이 내려왔다,Een platform is in de toren neergelaten in de toren,En plattform har senket seg i tårnet,Platforma w wieży obniżyła się,Uma plataforma desceu na torre,,O platformă a coborât în turn,Площадка опустилась в центральной башне,Спустио се платформ у централном торњу,En plattform har sänkts i tornet,Kuleye bir platform indirildi -"You have played this game too long, mortal...",TXT_ACS_MAP22_27_YOUHA,,,,"Tuhle partii jsi už hrál@[ao_cs] moc dlouho, smrtelníče,","Du har spillet dette spil for længe, dødelige...","Du spielst schon zu lange, Sterblicher...",,"Ludis ĉi tiun ludon vi tro longe, mortemul'...","Has jugado este juego demasiado tiempo, mortal...",,"Olet pelannut tätä peliä liian pitkään, kuolevainen...","Vous avez joué à ce jeu trop longtemps, mortel..","Túl sokat játszadoztál, halandó...","Ha giocato a questo gioco troppo a lungo, mortale...",遊びはここまでだ、小僧,"네 놈은 오랫동안 놀았도다, 필멸자여...","Je hebt dit spel te lang gespeeld, sterfelijke...","Du har spilt dette spillet for lenge, dødelige...",Już za długo grasz w tą grę śmiertelniku...,"Você jogou este jogo por tempo demais, mortal...",,"Ai jucat acest joc prea multă vreme, muritorule...","Ты слишком заигрался, смертный...","Превише си се заиграо, смртниче...","Du har spelat det här spelet för länge, dödlig...","Bu oyunu çok uzun oynadın, ölümlü." -I think I shall remove you from the board,TXT_ACS_MAP22_29_ITHIN,,,,"myslím, že bych tě měl odstranit ze šachovnice.","Jeg tror, jeg vil fjerne dig fra brættet.",Ich denke ich sollte dich vom Brett entfernen,,"Mi kredas, ke mi vin forigos el la tabul'.",Creo que te retiraré del tablero,,Ajattelenpa poistaa sinut pelilaudalta,Je pense qu'il est l'heure de vous retirer de l'échiquier.,"Azt hiszem le kell, hogy üsselek a tábláról",Penso che ti rimuoverò dalla scacchiera,盤上から貴様を排除する,이 몸이 너를 말 치우듯이 제거하겠다.,Ik denk dat ik u van het bord zal verwijderen,Jeg tror jeg skal fjerne deg fra brettet,"Myślę, że usunę cię z planszy",Acho que irei removê-l@[ao_ptb] do tabuleiro,,Cred că e timpul să te înlătur de pe tablă,Пришло время завершить твою партию,Дошло је време да се заврши твоја партија,Jag tror att jag ska ta bort dig från spelplanen.,Sanırım seni tahtadan kaldırmalıyım. -You hear a door open upstairs,TXT_ACS_MAP23_10_YOUHE,,,,Z patra slyšíš otevírající se dveře.,Du hører en dør blive åbnet ovenpå.,"Du hörst, wie sich oben eine Tür öffnet",,Vi aŭdas pordon malfermiĝantan superŝtupare.,Escuchas una puerta que se abre arriba,,Kuulet oven avautuvat yläkerrassa,Vous entendez une porte s'ouvrir à l'étage.,Hallod ahogy egy ajtó kinyílik az emeleten,Senti una porta aprirsi al piano di sopra,上層階の扉が開いた,윗층에서 문이 열리는 소리가 들린다,Je hoort een deur boven opengaan,Du hører en dør åpnes ovenpå,Słyszysz odgłos otwierających się na górze drzwi,Você ouve uma porta se abrir lá em cima,,Auzi o ușă deschizându-se sus,Слышен звук открывающейся двери наверху,Од северне дворане зачује се звук,Du hör en dörr öppnas på övervåningen.,Üst katta bir kapının açıldığını duyuyorsun. -"Worship me, and I may yet be merciful",TXT_ACS_MAP27_8_WORSH,,,,Uctívej mě a možná ještě budu milosrdný.,"Tilbeder du mig, så er jeg måske barmhjertig.",Verehre mich und ich könnte gnädig sein,,"Kultu min, tiam mi ankoraŭ eble kompatos.","Adórame, y aun puedo ser misericordioso",,"Palvo minua, ja saatan vielä olla armahtavainen","Prosternez vous devant moi, et je pourrai considérer de vous épargner.","Hódolj be, és talán kegyelmes leszek","Venerami, e potrei essere ancora misericordioso",我を崇めろ、慈悲を残している内に,"이 몸에게 경배하라, 그럼 자비를 베풀 것이다.","Aanbid me, en ik mag dan nog genadig zijn","Tilbe meg, og jeg kan ennå være barmhjertig.","Wielb mnie, a może będę miłosierny","Venere-me, e eu poderei ser piedoso",,"Venerează-mă, și s-ar putea să mai fiu milostiv încă","Преклонись предо мной, и, может быть, я буду милосерден","Преклони се преда мноме, и можда ћу бити милостив","Dyrka mig, så kanske jag är barmhärtig.","Bana ibadet et, belki merhamet ederim" -"Then again, maybe not",TXT_ACS_MAP27_10_THENA,,,,"Na druhou stranu, možná ne.",Men måske heller ikke,"Andererseits, vielleicht aber auch nicht",,"Tamen, eble ne.","Aunque, tal vez no",,"Mutta toisaalta, ehken sittenkään",Quoi que cela soit peu probable.,"Jól átgondolva, inkább nem",O potrei anche non esserlo,まあ、有り得ないな,허나... 그러지는 않겠지.,"Maar nogmaals, misschien niet",Men kanskje ikke,"Z drugiej strony, może nie...","Pensando melhor, talvez não",,"Dar apoi, poate că nu","А может быть, и нет",А можда и нећу,"Men å andra sidan, kanske inte.","Sonra tekrar, belki de değil" -One ninth of the puzzle has been solved,TXT_ACS_MAP28_6_ONENI,,,,V Klášteru byla vyřešena,En niende del af puslespillet er blevet løst,Ein Neuntel des Rätsels wurde gelöst,,Unu naŭono de la puzlo estas solvita,Un noveno del acertijo se ha resuelto,,Yhdeksäsosa pulmasta on ratkaistu,Un neuvième du puzzle à été résolu,A rejtvény egy kilencede megfejtésre került,Un nono del puzzle è stato risolto,九種のパズルの一つが解かれた,수수께끼의 9분의 1이 풀렸다,Een negende van de puzzel is opgelost.,En niende del av puslespillet er løst.,Jedna dziewiąta zagadki rozwiązana,Um nono do quebra-cabeça foi resolvido,,O noime din puzzle a fost rezolvată,Одна девятая головоломки разгадана,Деветина загонетке је решена,En niondel av pusslet har lösts.,Bulmacanın dokuzda biri çözüldü -On the Monastery,TXT_ACS_MAP28_7_ONTHE,,,,jedna devítina rébusu.,På klosteret,Im Kloster,,en la Monaĥejo.,En el Monasterio,,luostarissa,dans le monastère.,A Monostorban,Nel Monastero,修道院 にわずかに影響を与えた,... 헤러시아크의 신학교에서,Op het klooster,på klosteret,w Klasztorze,No Mosteiro,,pe Mănăstire,в семинарии Ересиарха,у Јересијарховој семинарији,På klostret,Manastır Üzerine -One ninth of the puzzle has been solved,TXT_ACS_MAP30_6_ONENI,,,,V Klášteru byla vyřešena,En niende del af puslespillet er blevet løst,Ein Neuntel des Rätsels wurde gelöst,,Unu naŭono de la puzlo estas solvita,Un noveno del acertijo se ha resuelto,,Yhdeksäsosa pulmasta on ratkaistu,Un neuvième du puzzle à été résolu,A rejtvény egy kilencede megfejtésre került,Un nono del puzzle è stato risolto,九種のパズルの一つが解かれた,수수께끼의 9분의 1이 풀렸다,Een negende van de puzzel is opgelost.,En niende del av gåten er løst.,Jedna dziewiąta zagadki rozwiązana,Um nono do quebra-cabeça foi resolvido,,O noime din puzzle a fost rezolvată,Одна девятая головоломки разгадана,Деветина загонетке је решена,En niondel av pusslet har lösts.,Bulmacanın dokuzda biri çözüldü -On the Monastery,TXT_ACS_MAP30_7_ONTHE,,,,jedna devítina rébusu.,På klosteret,Im Kloster,,en la Monaĥejo.,En el Monasterio,,luostarissa,dans le monastère.,A Monostorban,Nel Monastero,修道院 にわずかに影響を与えた,... 헤러시아크의 신학교에서,Op het klooster,på klosteret,w Klasztorze,No Mosteiro,,pe Mănăstire,в семинарии Ересиарха,у Јересијарховој семинарији,På klostret,Manastır Üzerine -One ninth of the puzzle has been solved,TXT_ACS_MAP34_1_ONENI,,,,V Klášteru byla vyřešena,En niende del af puslespillet er blevet løst,Ein Neuntel des Rätsels wurde gelöst,,Unu naŭono de la puzlo estas solvita,Un noveno del acertijo se ha resuelto,,Yhdeksäsosa pulmasta on ratkaistu,Un neuvième du puzzle à été résolu,A rejtvény egy kilencede megfejtésre került,Un nono del puzzle è stato risolto,九種のパズルの一つが解かれた,수수께끼의 9분의 1이 풀렸다,Een negende van de puzzel is opgelost.,En niendedel av puslespillet er løst,Jedna dziewiąta zagadki rozwiązana,Um nono do quebra-cabeça foi resolvido,,O noime din puzzle a fost rezolvată,Одна девятая головоломки разгадана,Деветина загонетке је решена,En nionde del av pusslet har lösts.,Bulmacanın dokuzda biri çözüldü -On the Monastery,TXT_ACS_MAP34_2_ONTHE,,,,jedna devítina rébusu.,På klosteret,Im Kloster,,en la Monaĥejo.,En el Monasterio,,luostarissa,dans le monastère.,A Monostorban,Nel Monastero,修道院 にわずかに影響を与えた,... 헤러시아크의 신학교에서,Op het klooster,på klosteret,w Klasztorze,No Mosteiro,,pe Mănăstire,в семинарии Ересиарха,у Јересијарховој семинарији,På klostret,Manastır Üzerine -The portal has been sealed,TXT_ACS_MAP35_0_THEPO,,,,Portál byl zapečeťen.,Portalen er blevet forseglet,Das Portal wurde versiegelt,,La portalo estas obturita.,El portal se ha sellado,,Portaali on sinetöity,Le portail est scellé.,Az átjáró bezárult.,Il portale è stato sigillato,ポータルは封印された,차원문은 봉인되었다,Het portaal is verzegeld,Portalen har blitt forseglet,Portal został zapieczętowany,O portal foi selado,,Portalul a fost închis,Портал закрылся,Врата су затворена,Portalen har förseglats.,Geçit mühürlendi -Choose your fate,TXT_ACS_MAP35_1_CHOOS,,,,Vyber si svůj osud.,Vælg din skæbne,Wähle dein Schicksal,,Elektu vian fatalon.,Escoge tu destino,Escoge tú destino,Valitse kohtalosi,Choisissez votre sort.,Dönts sorsod felől,Scegli la tua sorte,運命を撰べ,그대의 운명을 정해라,Kies uw lot,Velg din skjebne,Wybierz swoje przeznaczenie,Escolha o seu destino,,Alegeți destinul,Сделай свой выбор,Донеси своју одлуку,Välj ditt öde,Kaderinizi seçin -The door is barred from the inside,TXT_ACS_MAP35_3_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está atrancada desde el interior,,Ovi on teljetty sisältä,Cette porte est bloquée de l'intérieur.,Az ajtót belülről torlaszolták el.,La porta è sbarrata da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od środka,A porta está barrada por dentro,,Ușa e blocată dinăuntru,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. -Are you strong enough,TXT_ACS_MAP35_12_AREYO,,,,"Jsi dost siln@[adj_cs],",Er du stærk nok?,Bist du stark genug,,Ĉu vi estas sufiĉe forta,Eres lo suficientemente fuerte,,Olet riittävän vahva,Etes vous suffisamment fort,"Elég erős vagy,",Sei abbastanza forte,お前がどれだけ強かろうと,네 놈은 주인들을 대면할 힘이...,Ben je sterk genoeg,Er du sterk nok,Czy jesteś wystarczająco silny,Você é forte o suficiente,,Ești întradevăr suficient de puternic,"Достаточно ли ты силён,",Јеси ли довољно снажан,Är du stark nog?,Yeterince güçlü müsün? -To face your own masters?,TXT_ACS_MAP35_14_TOFAC,,,,čelit svým vlastním pánům?,Til at møde dine egne mestre?,Dich deinen eigenen Meistern zu stellen?,,por stari kontraŭ viaj propraj mastroj?,¿Para enfrentarte a tus maestros?,,kohtaamaan omat mestarisi?,pour faire face à vos maîtres?,Hogy saját mestereiddel nézz szembe?,Da affrontare i tuoi stessi maestri?,お前の師に立ち向かえるのか?,진심으로 있는 것인가?,Om je eigen meesters onder ogen te komen?,Til å møte dine egne mestere?,By stawić czoła swoim mistrzom?,Para enfrentar os seus próprios mestres?,,Să îți înfrunți proprii stăpâni?,чтобы сразиться со своими наставниками?,да се суочиш са својим господарима?,För att möta dina egna mästare?,Kendi efendilerinizle yüzleşmek için mi? -,,Hexen: Deathkings script texts,,,,,,,,,,,,,,,,,,,,,,,,, -You dare battle in the ready room?,TXT_ACS_MAP33_6_YOUDA,,,,Ty si dovoluješ rvát se v přípravné místnosti?,Tør du kæmpe i beredskabsrummet?,Du wagst es im Bereitschaftsraum zu kämpfen?,,Vi aŭdacas batali en la pretĉambro?,¿Te atreves a luchar en la sala de preparación?,,Kuinka kehtaat taistella valmistautumishuoneessa?,Vous osez faire escarmouche dans la salle de préparation?,Hogy merészelsz harcolni a váróteremben?,Hai il coraggio di combattere in questa sala?,挑戦する準備は整ったか?,감히 준비의 방에서 전투를 벌이다니...,Durf jij te vechten in de readyroom?,Våger du å kjempe i det klare rommet?,Śmiesz walczyć w pokoju przygotowań?,Como ousa batalhar na sala de espera?,,Îndrăznești să lupți în camera de așteptare?,Ты посмел сражаться в комнате ожидания?,Усуђујеш се борити у припремној соби?,Vågar du slåss i det färdiga rummet?,Hazırlanma odasında savaşmaya mı cüret ediyorsun? -"For that, you shall die!",TXT_ACS_MAP33_7_FORTH,,,,Pro to zemřeš!,For det skal du dø!,Dafür sollst du sterben!,,"Pro tio, vi mortos!","Por eso, ¡deberás morir!",,Siitä hyvästä kuolet!,"Pour cette insulte, vous trépasserez!",Ezért meghalsz!,"Per questo, morirai!",ならば、死へ進め!,죽어서 값을 치러라!,Daarvoor zal je sterven!,For det skal du dø!,Umrzesz za to!,Você morrerá por isso!,,"Pentru asta, vei muri!",Так умри же!,За то ћеш умрети!,För det ska du dö!,Bunun için öleceksin! -The waterfall is open,TXT_ACS_MAP41_6_THEWA,,,,Vodopád je otevřen.,Vandfaldet er åbent,Der Wasserfall ist geöffnet,,La akvofalo estas malferma.,La cascada se ha abierto,,Vesiputous on auki,La cascade s'est ouverte.,A vizesés nyitva,La cascata è aperta,滝 は開いた,폭포가 멈췄다,De waterval is open,Fossen er åpen,Wodospad jest otwarty,A cascata está aberta,,Cascada e deschisă,Поток воды остановлен,Водопад је отворен,Vattenfallet är öppet,Şelale açık -The waterfall is blocked,TXT_ACS_MAP41_7_THEWA,,,,Vodopád je zatarasen.,Vandfaldet er blokeret,Der Wasserfall ist blockiert,,La akvofalo estas barita.,La cascada está bloqueada,,Vesiputous on tukittu,La cascade est bloquée.,A vizesés zárva,La cascata è bloccata,滝 は塞がっている,폭포에 의해 막혔다,De waterval is geblokkeerd,Fossen er blokkert,Wodospad jest zablokowany,A cascata está bloqueada,,Cascada e închisă,Поток воды преграждает путь,Водопад је блокиран,Vattenfallet är blockerat,Şelale tıkalı -A door has opened in the chapel,TXT_ACS_MAP41_8_ADOOR,,,,Dveře se otevřely v kapli.,Der er åbnet en dør i kapellet,Eine Tür in der Kapelle hat sich geöffnet,,Pordo malfermis en la kapelo.,Una puerta se abrió en la Capilla,,Ovi on avautunut kappelissa,Une porte s'est ouverte dans la chapelle.,Egy ajtó kitárult a kápolnában,Una porta si è aperta nella cappella,庵寺 への扉が開いた,교외 근처에서 문이 열렸다,Een deur is geopend in de kapel,En dør har åpnet seg i kapellet,Drzwi w kaplicy zostały otwarte,Uma porta se abriu na capela,,O ușă s-a deschis în capelă,Дверь открылась в часовне,Врата су се отворила у катедрали,En dörr har öppnats i kapellet.,Şapelde bir kapı açıldı. -Now that's odd...,TXT_ACS_MAP42_4_NOWTH,,,,Tak to je divné...,Det er mærkeligt...,Hm. Das ist merkwürdig...,,Nun tio estas stranga...,Eso es extraño...,,Onpa kummallista...,Ca c'est étrange....,Ez felettébb különös...,Questo sì che è strano...,何かがおかしい...,무언가가 이상하다...,Dat is vreemd....,Det var merkelig...,Dziwne...,Que estranho...,,Asta e ciudat...,Как странно...,То је чудно...,Det där är konstigt...,İşte bu garip. -Three more parts of the puzzle remain,TXT_ACS_MAP44_1_THREE,,,,Zbývají tři části rébusu.,Der er endnu tre dele af gåden tilbage,Drei weitere Teile des Rätsels verbleiben,,Nur tri partoj de la puzlo restas.,Quedan tres partes más del acertijo,,Kolme pulman palasta jäljellä,Trois parties du puzzle restent à résoudre.,Három rész maradt a rejtvényből,Rimangono altre tre parti del puzzle,パズルの部品は残り 3つ,3개의 수수께끼가 아직 풀리지 않았다,Er blijven nog drie onderdelen van de puzzel over,Tre deler av puslespillet gjenstår,Pozostały jeszcze trzy części zagadki,Faltam mais três partes do quebra-cabeça,,Trei părți din puzzle încă rămân,Остались три части головоломки,Остају још три дела загонетке ,Det återstår tre delar av pusslet.,Bulmacanın üç parçası daha kaldı. -Two more parts of the puzzle remain,TXT_ACS_MAP44_2_TWOMO,,,,Zbývají dvě části rébusu.,Der er endnu to dele af puslespillet tilbage,Zwei weitere Teile des Rätsels verbleiben,,Nur du partoj de la puzlo restas.,Quedan dos partes más del acertijo,,Kaksi pulman palasta jäljellä,Deux parties du puzzle restent à résoudre.,Kettő rész maradt a rejtvényből,Rimangono altre due parti del puzzle,パズルの部品は残り 2つ,2개의 수수께끼가 아직 풀리지 않았다,Twee andere delen van de puzzel blijven over,To deler av puslespillet gjenstår,Pozostały jeszcze dwie części zagadki,Faltam mais duas partes do quebra-cabeça,,Două părți din puzzle încă rămân,Остались две части головоломки,Остају још два дела загонетке,Ytterligare två delar av pusslet återstår,Bulmacanın iki parçası daha kaldı -One more part of the puzzle remains,TXT_ACS_MAP44_3_ONEMO,,,,Zbývá jedna část rébusu.,Der er endnu en del af puslespillet tilbage,Ein weiteres Teil des Rätsels ist übrig,,Nur unu parto de la puzlo restas.,Queda una parte más del acertijo,,Yksi pulman palanen jäljellä,Il reste une partie du puzzle à résoudre.,Egy rész maradt a rejtvényből,Rimane un'altra parte del puzzle,パズルの部品は残り 1つ,마지막 수수께끼가 아직 풀리지 않았다,Nog een deel van de puzzel blijft over,En del av puslespillet gjenstår,Pozostała jeszcze jedna część zagadki,Falta mais uma parte do quebra-cabeça,,O parte din puzzle încă rămâne,Осталась одна часть головоломки,Остаје још један део загонетке,Ytterligare en del av pusslet återstår,Bulmacanın bir parçası daha kaldı -The puzzle is complete,TXT_ACS_MAP44_4_THEPU,,,,Rébus je kompletní.,Puslespillet er færdigt,Das Rätsel ist abgeschlossen,,La puzlo estas kompleta.,El acertijo está completo,,Pulma on ratkaistu,Le puzzle est résolu.,A rejtvény végleg megoldódott,Il puzzle è completo,パズルは完成した,모든 수수께끼가 풀렸다,De puzzel is compleet,Puslespillet er komplett,Zagadka ukończona,O quebra-cabeça está concluído,,Puzzle-ul e rezolvat,Головоломка разгадана,Загонетка је решена,Pusslet är komplett,Bulmaca tamamlandı -You have not completed the puzzle,TXT_ACS_MAP44_6_YOUHA,,,,Nesplnil jsi rébus.,Du har ikke fuldført puslespillet,Du hast das Rätsel noch nicht gelöst,,Vi ne kompletis la puzlon.,No has completado el acertijo,,Et ole ratkaissut pulmaa,Vous n'avez pas résolu le puzzle.,Nem fejtetted meg a rejtvényt,Non hai completato il puzzle,パズルはまだ完成していない,모든 수수께끼를 풀지 못했다,Je hebt de puzzel nog niet voltooid.,Du har ikke fullført puslespillet,Nie ukończyłeś zagadki,Você não concluiu o quebra-cabeça,,Nu ai rezolvat puzzle-ul,Головоломка не разгадана,Нисте решили загонетку,Du har inte fullbordat pusslet,Bulmacayı tamamlamadınız -The floor is not safe!,TXT_ACS_MAP44_8_THEFL,,,,Podlaha není bezpečná!,Gulvet er ikke sikkert!,Der Boden hier ist nicht sicher!,,La planko ne estas sendanĝera!,¡El suelo no es seguro!,,Kerros ei ole turvallinen!,Le sol est dangereux!,A padló nem biztonságos!,Il pavimento è pericoloso!,この場は安全ではない!,이 층은 안전하지 않다!,De vloer is niet veilig!,Gulvet er ikke trygt!,Ta podłoga nie jest bezpieczna!,O chão não está seguro!,,Podeaua nu e sigură!,Пол совсем прогнил!,Под није безбедан!,Golvet är inte säkert!,Zemin güvenli değil! -One third of the puzzle is solved,TXT_ACS_MAP44_10_ONETH,,,,Jedna třetina rébusu je vyřešena.,En tredjedel af puslespillet er løst,Ein Drittel des Rätsels ist gelöst,,Unu triono de la puzlo estas solvita.,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,A rejtvény egyharmada megoldásra került,Un terzo del puzzle è stato risolto,パズルの 三分の一 が解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost.,En tredjedel av puslespillet er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle e rezolvată,Одна треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet är löst,Bulmacanın üçte biri çözüldü -Two thirds of the puzzle is solved,TXT_ACS_MAP44_11_TWOTH,,,,Dvě třetiny rébusu jsou vyřešeny.,To tredjedele af puslespillet er løst,Zwei Drittel des Rätsels sind gelöst,,Du trionoj de la puzlo estas solvita.,Dos tercios del acertijo se han resuelto,,Kaksi kolmannesta pulmasta on ratkaistu,Deux tiers du puzzle ont été résolus,A rejtvény kétharmada megoldásra került,Due terzi del puzzle sono stati risolto,パズルの 三分の二 が解かれた,수수께끼의 3분의 2가 풀렸다,Tweederde van de puzzel is opgelost,To tredjedeler av puslespillet er løst.,Dwie trzecie zagadki rozwiązane,Dois terços do quebra-cabeça foi resolvido,,Două treimi din puzzle sunt rezolvate,Две трети головоломки разгаданы,Две трећине загонетке су решене,Två tredjedelar av pusslet är löst.,Bulmacanın üçte ikisi çözüldü -You hear a platform moving in the distance,TXT_ACS_MAP45_1_YOUHE,,,,Slyšíš v dálce pohybující se plošinu.,Du hører en platform bevæge sig i det fjerne,"Du hörst, wie sich in der Ferne eine Platform bewegt",,Vi aŭdas plataĵon movantan malproksime.,Escuchas una plataforma moverse a la distancia,,Kuulet lavan liikkuvan etäällä,Vous entendez une plateforme se déplacer au loin,Egy emelvény mozgását hallod a távolban,Senti una piattaforma muoversi in lontananza,昇降機の音が遠くで聞こえる,멀리서 보행판이 움직이는 소리가 들려왔다,Je hoort een platform bewegen in de verte,Du hører en plattform bevege seg i det fjerne,Słyszysz odgłos poruszającej się w oddali platformy,Você ouve de longe uma plataforma se movendo,,Auzi o platformă mișcându-se în depărtare,"Неподалёку раздаётся звук +,,Hexen script texts,,,,,,,,,,,,,,,,,,,,,,,,,, +The door is locked,TXT_ACS_MAP01_5_THEDO,,,,Dveře jsou zamčené.,Døren er låst,Die Tür ist verschlossen,,La pordo estas ŝlosita.,La puerta está cerrada,,Ovi on lukittu,Cette porte est verouillée.,,Az ajtó zárva van.,La porta è bloccata,扉は施錠されている,문이 잠겨 있다,De deur is op slot,Døren er låst,Drzwi są zablokowane,A porta está trancada,,Ușa e încuiată,Дверь заперта,Врата су закључана,Dörren är låst,Kapı kilitli +"Greetings, mortal",TXT_ACS_MAP02_9_GREET,,,,"Vítej, smrtelníče,","Vær hilset, dødelige","Sei gegrüßt, Sterblicher",,"Salutojn, mortemul'.","Saludos, mortal",,"Tervehdys, kuolevainen","Salutations, humain.",,"Üdvözöllek, halandó!","Salve, mortale",御機嫌よう、小僧,"환영한다, 필멸자여.","Groeten, sterfelijk","Vær hilset, dødelige",Witaj śmiertelniku,"Saudações, mortal.",,"Salutări, muritorule","Приветствую, смертный","Поздрав, смртниче","Hälsningar, dödliga","Selamlar, ölümlü" +Are you ready to die?,TXT_ACS_MAP02_11_AREYO,,,,jsi připraven@[ao_cs] zemřít?,Er du klar til at dø?,Bist du bereit zu sterben?,,Ĉu vi pretas morti?,¿Estás listo para morir?,,Oletko valmis kuolemaan?,Êtes-vous prêt à mourir?,,Készen állsz a halálra?,Sei pronto a morire?,死に急ぐ仕度は整ったか?,죽을 준비는 됐는가?,Ben je klaar om te sterven?,Er du klar til å dø?,Czy jesteś gotów na śmierć?,Você está pront@[ao_ptb] para morrer?,,Ești pregătit să mori?,Готов ли ты умереть?,Јеси ли спреман да умреш?,Är du redo att dö?,Ölmeye hazır mısın? +A door opened on the Guardian of Ice,TXT_ACS_MAP02_20_ADOOR,,,,Ve Strážci ledu se otevřely dveře.,En dør åbnede sig på isens vogter,Eine Tür öffnet sich zum Wächter des Eises,,Pordo malfermiĝis ĉe la Gardanto de Glacia.,Se abrió una puerta en el Guardián de Hielo,,Ovi avautui jään vartijan luona,Une porte s'est ouverte dans le Gardien de Glace.,,Egy ajtó kinyillott a Jég Őrzőjénél,Una porta è stata aperta sul Guardiano di Ghiaccio,氷の守護者にある扉は開かれた,얼음의 수호자에서 문이 열렸다,Een deur opende op de bewaker van ijs,En dør åpnet seg på Isens vokter,Drzwi w Strażniku Lodu otworzyły się,Uma porta se abriu no Guardião de Gelo,,O ușă s-a deschis pe Gardianul de Foc,Дверь открыта у стража льда,Врата су отворена код Чувара леда,En dörr öppnades på isens väktare,Buz Muhafızı'nda bir kapı açıldı +This path is barred,TXT_ACS_MAP03_12_THISP,,,,Cesta je zatarasená.,Denne vej er spærret,Dieser Pfad ist blockiert,,Ĉi tiu vojo estas barita.,Este camino está atrancado,,Tämä polku on teljetty,Ce chemin est barré.,,Ez az út el van torlaszolva.,Questo percorso è sbarrato,この道は塞がれている,이 통로는 빗장이 걸려있다,Dit pad is geblokkeerd,Denne veien er sperret,Ścieżka jest zablokowana,Este caminho está bloqueado,,Această cale e blocată,Сейчас этот путь закрыт,Овај пут је тренутно забрањен,Denna väg är spärrad,Bu yol yasaklandı +One half of the puzzle has been solved,TXT_ACS_MAP04_9_ONEHA,,,,U Sedmera portálů byla vyřešena,Den ene halvdel af puslespillet er blevet løst,Eine Hälfte des Rätsels wurde gelöst,,Unu duono de la puzlo estas solvita,Una mitad del acertijo se ha resuelto,,Puolet pulmasta on ratkaistu,La moitié du puzzle à été résolu,,A rejtvény egyik fele meg lett fejtve,Metà del puzzle è stato risolto,パズルの一つが解かれた,수수께끼의 절반이 풀렸다,De helft van de puzzel is opgelost,Den ene halvdelen av gåten er løst,Połowa zagadki rozwiązana,Metade do quebra-cabeça foi resolvido,,O jumătate din puzzle e rezolvată,Половина головоломки разгадана,Половина загонетке је решена,En halva av pusslet har lösts,Bulmacanın bir yarısı çözüldü +on the Seven Portals,TXT_ACS_MAP04_10_ONTHE,,,,jedna třetina rébusu.,på de syv portaler,bei den Sieben Portalen,,ĉe la Sep Portaloj.,en los Siete Portales,,seitsemän portaalin luona,pour les Sept Portails.,,a Hét Portálon,nei Sette Portali,漆之門に影響を与えた,... 일곱 차원문에서,op de Zeven Portalen,på de syv portaler,przy Siedmiu Portalach,nos Sete Portais,,pe cele Șapte Portaluri,на Семи порталах,на Седам портала,på de sju portalerna,Yedi Portalda +One third of the puzzle has been solved,TXT_ACS_MAP04_11_ONETH,,,,U Sedmera portálů byla vyřešena,En tredjedel af gåden er blevet løst,Ein Drittel des Rätsels wurde gelöst,,Unu triono de la puzlo estas solvita,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,,A rejtvény egyharmada megfejtésre került,Un terzo del puzzle è stato risolto,三種のパズルの一つが解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost,En tredjedel av puslespillet er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle a fost rezolvată,Треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet har lösts,Bulmacanın üçte biri çözüldü +Stairs have risen on the Seven Portals,TXT_ACS_MAP04_12_STAIR,,,,jedna třetina rébusu.,Der er kommet en trappe op på de syv portaler,Stufen bei den Sieben Portale wurden erbaut,,Ŝtupoj leviĝis ĉe la Sep Portaloj.,Unas escaleras se han erguido en los Siete Portales,,Portaat ovat kohonneet seitsemän portaalin luona,Des escaliers sont apparus dans les Sept Portails.,,A Hét Portálon belül egy lépcsősor emlekedett,Sono sorte le scale nei Sette Portali,漆之門に階段が立ち昇った,일곱 차원문에서 계단이 솟아났다,Trappen zijn gestegen op de Zeven Portalen,Trapper har reist seg på De syv portaler,Schody przy Siedmiu Portalach podniosły się,As escadas se ergueram nos Sete Portais,,S-au ridicat scări pe cele Șapte Portaluri,Лестница воздвигнулась на Семи порталах,Степенице се подижу на Седам портала,En trappa har stigit upp i de sju portalerna,Yedi Portalda merdivenler yükseldi +One third of the puzzle has been solved,TXT_ACS_MAP05_6_ONETH,,,,U Sedmera portálů byla vyřešena,En tredjedel af puslespillet er blevet løst,Ein Drittel des Rätsels wurde gelöst,,Unu triono de la puzlo estas solvita,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,,A rejtvény egyharmada megfejtésre került,Un terzo del puzzle è stato risolto,三種のパズルの一つが解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost,En tredjedel av puslespillet er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle a fost rezolvată,Треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet har lösts,Bulmacanın üçte biri çözüldü +on the Seven Portals,TXT_ACS_MAP05_7_ONTHE,,,,jedna třetina rébusu.,på de syv portaler,bei den Sieben Portalen,,ĉe la Sep Portaloj.,en los Siete Portales,,seitsemän portaalin luona,pour les Sept Portails.,,a Hét Portálon,nei Sette Portali,漆之門 に影響を与えた,... 일곱 차원문에서,op de Zeven Portalen,på de syv portaler,przy Siedmiu Portalach,nos Sete Portais,,pe cele Șapte Portaluri,на Семи порталах,на Седам портала,på de sju portalerna,Yedi Portalda +Stairs have risen on the Seven Portals,TXT_ACS_MAP05_8_STAIR,,,,Schody se zvedly u Sedmera portálů.,Trappen er steget op på de syv portaler,Stufen bei den Sieben Portale wurden erbaut,,Ŝtupoj leviĝis ĉe la Sep Portaloj.,Unas escaleras se han erguido en los Siete Portales,,Portaat ovat kohonneet seitsemän portaalin luona,Des escaliers sont apparus dans les Sept Portails.,,A Hét Portálon belül egy lépcsősor emlekedett,Sono sorte le scale nei Sette Portali,漆之門 に階段が立ち昇った,일곱 차원문에서 계단이 솟아났다,Trappen zijn gestegen op de Zeven Portalen,Trappene har reist seg på De syv portaler,Schody przy Siedmiu Portalach podniosły się,Escadas se ergueram nos Sete Portais,,S-au ridicat scări pe cele Șapte Portaluri,Лестница воздвигнулась на Семи порталах,Степенице се подижу на Седам портала,Trappor har stigit upp på de sju portalerna,Yedi Portalda merdivenler yükseldi +You have to find another switch...,TXT_ACS_MAP05_9_YOUHA,,,,Musíš najít další spínač.,Du skal finde en anden kontakt...,Du must einen weiteren Schalter finden...,,Vi bezonas trovi alian ŝaltilon...,Debes encontrar otro interruptor...,Debes encontrar otro switch...,Sinun on löydettävä toinen vipu...,Vous devez trouver un autre bouton..,,Egy másik kapcsolót kell találnod...,Devi trovare un altro interruttore...,他のスイッチも探す必要がある...,다른 개폐기를 찾아야 한다,Je moet een andere schakelaar vinden...,Du må finne en annen bryter...,Musisz znaleźć inny przełącznik...,Você precisa encontrar outro interruptor...,,Trebuie să găsești alt buton...,Остался ещё один переключатель...,Остао је још један прекидач...,Du måste hitta en annan omkopplare...,Başka bir anahtar bulmalısın... +Stones grind on the Seven Portals,TXT_ACS_MAP05_10_STONE,,,,Kameny dřou u Sedmera portálů.,Stenene knirker på de syv portaler,Steine schleifen bei den Sieben Portalen,,Ŝtonoj grincas ĉe la Sep Portaloj.,Las piedras giran en los Siete Portales,,Kiviä vierii seitsemän portaalin luona,Des pierres grincent dans les Sept Portails.,,Kövek örlődnek a Hét Portálnál,Le pietre si sono frantumate nei Sette Portali,漆之門 の石壁が砕かれた,일곱 차원문에서 바위 부딪히는 소리가 들려왔다,Stenen slijpen op de Zeven Portalen,Steiner knuser på De syv portaler,Kamienie przy Siedmiu Portalach zgrzytają,As pedras giram nos Sete Portais,,Pietrele încep să macine pe cele Șapte Portaluri,Каменная преграда отступила на Семи порталах,Камена препрека се повлачи,Stenar slipar på de sju portalerna,Taşlar Yedi Portalda öğütülüyor +One sixth of the puzzle has been solved,TXT_ACS_MAP08_6_ONESI,,,,V Temném hvozdu byla vyřešena,En sjettedel af puslespillet er blevet løst,Ein Sechstel des Rätsels wurde gelöst,,Unu sesono de la puzlo estas solvita,Un sexto del acertijo se ha resuelto,,Kuudennes pulmasta on ratkaistu,Un sixième du puzzle à été résolu,,A feladványok egyhatoda megfejtésre került,Un sesto del puzzle è stato risolto,六種のパズルの一つが解かれた,수수께끼의 6분의 1이 풀렸다,Een zesde van de puzzel is opgelost,En sjettedel av puslespillet er løst,Jedna szósta zagadki rozwiązana,Um sexto do quebra-cabeça foi resolvido,,O șesime din puzzle a fost rezolvată,Одна шестая головоломки разгадана,Шестина загонетке је решена,En sjättedel av pusslet har lösts,Bulmacanın altıda biri çözüldü +on the Shadow Wood,TXT_ACS_MAP08_7_ONTHE,,,,jedna šestina rébusu.,i Skyggetræet,Im Schattenwald,,en la Ombro-Arbareto.,En el Bosque de Sombras,,Varjosalossa,dans le Bois des Ombres.,,a Sötét Erdőben,Nel Bosco d'Ombra,陰影樹 に少し影響を与えた,... 그림자 숲에서,op het Schaduwbos,på Skyggeskogen,w Lesie Cieni,na Floresta das Sombras,,în Pădurea Umbrelor,в лесу теней,у Шуми сенки,i skuggskogen,Gölge Ormanı'nda +The door is barred from the inside,TXT_ACS_MAP08_10_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está atrancada desde el interior,,Ovi on teljetty sisältä,Cette porte est bloquée de l'intérieur.,,Az ajtó be van reteszelve belülről,La porta è sbarrata da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od środka,A porta está barrada por dentro,,Ușa e blocată dinăuntru,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. +You hear a door open in the distance,TXT_ACS_MAP08_11_YOUHE,,,,Slyšíš v dálce otevírající se dveře.,Du hører en dør åbne i det fjerne,"Du hörst, wie sich in der Ferne eine Tür öffnet",,Vi aŭdas pordon malfermiĝantan malproksime.,Escuchas que una puerta se abre a la distancia,,Kuulet oven avautuvan etäällä,Vous entendez une porte s'ouvrir au loin.,,Hallod ahogy egy ajtó kinyílik a távolban,Senti una porta aprirsi in lontananza,遠くから扉が開く音が聞こえる,멀리서 문이 열리는 소리가 들린다,In de verte hoor je een deur openstaan.,Du hører en dør åpnes i det fjerne,Słyszysz odgłos otwierających się w oddali drzwi,Você ouve de longe uma porta se abrindo,,Auzi o ușă deschizându-se în depărtare,Слышен звук открывающейся двери,Чује се звук отварања врата,Du hör en dörr som öppnas i fjärran,Uzakta bir kapının açıldığını duyuyorsun. +One sixth of the puzzle has been solved,TXT_ACS_MAP09_6_ONESI,,,,V Temném hvozdu byla vyřešena,En sjettedel af puslespillet er blevet løst,Ein Sechstel des Rätsels wurde gelöst,,Unu sesono de la puzlo estas solvita,Un sexto del acertijo se ha resuelto,,Kuudennes pulmasta on ratkaistu,Un sixième du puzzle à été résolu,,A feladványok egyhatoda megfejtésre került,Un sesto del puzzle è stato risolto,六種のパズルの一つが解かれた,수수께끼의 6분의 1이 풀렸다,Een zesde van de puzzel is opgelost,En sjettedel av gåten er løst,Jedna szósta zagadki rozwiązana,Um sexto do quebra-cabeça foi resolvido,,O șesime din puzzle a fost rezolvată,Одна шестая головоломки разгадана,Шестина загонетке је решена,En sjättedel av pusslet har lösts.,Bulmacanın altıda biri çözüldü +on the Shadow Wood,TXT_ACS_MAP09_7_ONTHE,,,,jedna šestina rébusu.,i Skyggetræet,Im Schattenwald,,en la Ombro-Arbareto.,En el Bosque de Sombras,,Varjosalossa,dans le Bois des Ombres.,,a Sötét Erdőben,Nel Bosco d'Ombra,陰影樹 に少し影響を与えた,... 그림자 숲에서,op het Schaduwbos,på Skyggeskogen,w Lesie Cieni,na Floresta das Sombras,,în Pădurea Umbrelor,в лесу теней,у Шуми сенки,i skuggskogen,Gölge Ormanı'nda +One sixth of the puzzle has been solved,TXT_ACS_MAP10_6_ONESI,,,,V Temném hvozdu byla vyřešena,En sjettedel af puslespillet er blevet løst,Ein Sechstel des Rätsels wurde gelöst,,Unu sesono de la puzlo estas solvita,Un sexto del acertijo se ha resuelto,,Kuudennes pulmasta on ratkaistu,Un sixième du puzzle à été résolu,,A feladványok egyhatoda megfejtésre került,Un sesto del puzzle è stato risolto,六種のパズルの一つが解かれた,수수께끼의 6분의 1이 풀렸다,Een zesde van de puzzel is opgelost,En sjettedel av puslespillet har blitt løst,Jedna szósta zagadki rozwiązana,Um sexto do quebra-cabeça foi resolvido,,O șesime din puzzle a fost rezolvată,Одна шестая головоломки разгадана,Шестина загонетке је решена,En sjättedel av pusslet har lösts.,Bulmacanın altıda biri çözüldü +on the Shadow Wood,TXT_ACS_MAP10_7_ONTHE,,,,jedna šestina rébusu.,i Skyggetræet,Im Schattenwald,,en la Ombro-Arbareto.,En el Bosque de Sombras,,Varjosalossa,dans le Bois des Ombres.,,a Sötét Erdőben,Nel Bosco d'Ombra,陰影樹 に少し影響を与えた,... 그림자 숲에서,op het Schaduwbos,på Skyggeskogen,w Lesie Cieni,na Floresta das Sombras,,în Pădurea Umbrelor,в лесу теней,у Шуми сенки,i skuggskogen,Gölge Ormanı'nda +\ ettins left,TXT_ACS_MAP11_0_ETTIN,Yellow needs better translation,,,\ etinů zbývá.,\ ettins venstre,\ Ettins übrig,,\ gigantaĉoj ceteraj,\ Ettins restantes,,\ ettiniä jäljellä,\ ettins restants,,\ ettin maradt,\ Ettins rimasti,\ 匹のエティンが残っている,\ 마리 에틴이 남았음,\ overgebleven Ettins,\ ettins igjen,\ pozostałych ettinów,\ ettins restantes,,\ etini rămași,\ оставшихся эттинов,Остало је \ еттина,\ ettins lämnade,\ ettins ayrıldı +"You waited too long, now you die!",TXT_ACS_MAP11_1_YOUWA,,,,"Čekal@[ao_cs] jsi moc dlouho, teď zemřeš!","Du ventede for længe, nu dør du!","Du hast zu lange gewartet, jetzt stirbst du!",,"Vi atendis tro longe, nun vi mortas!","Esperaste demasiado, ¡ahora morirás!",,"Odotit liian pitkään, nyt kuolet!","Vous avez attendu trop longtemps, maintenant, mourrez!",,"Túl sokáig vártál, most meghalsz!","Hai atteso troppo a lungo, ora muori!",長居をしたな、命を奪うには十分な程に!,시간을 너무 오래 끌었다. 이제 죽어라!,"Je hebt te lang gewacht, nu ga je dood!","Du ventet for lenge, nå dør du!",Czekałeś zbyt długo. Teraz giń!,Você esperou demais. Agora morrerá!,,"Ți-a luat prea mult, acum mori!",Слишком долго! Готовься к смерти!,Предуго! Припреми се за смрт!,"Du väntade för länge, nu dör du!","Çok bekledin, şimdi öleceksin!" +A door opened on the Forsaken Outpost,TXT_ACS_MAP11_7_ADOOR,,,,Dveře se otevřely na Opuštěném stanovišti.,En dør blev åbnet i forladt forpost,Eine Tür im verlassenen Vorposten hat sich geöffnet,,Pordo malfermiĝis ĉe la Forlasita Posteno.,Una puerta se abrió en el Puesto de Avanzada Abandonado,,Ovi avautui hylätyssä etuvartiossa,Une porte s'est ouverte dans la base abandonnée.,,Egy ajtó kinyílik az Elátkozott Őrportyán,Una porta è stata aperta nell'Avamposto Abbandonato,荒れ果てた前哨地 への扉が開いた,버려진 초소에서 문이 열렸다,Een deur opende een deur op de Verwaarloosde buitenpost,En dør åpnet seg på den forlatte utposten,Drzwi przy Opuszczonym Posterunku otworzyły się,Uma porta se abriu no Posto Abandonado,,O ușă s-a deschis pe Avanpostul Părăsit,Дверь открылась на покинутой заставе,Врата су се отворила у Напуштеној постаји,En dörr har öppnats på försvunnen utposten,Unutulmuş Karakol'da bir kapı açıldı +This door won't open yet,TXT_ACS_MAP12_9_THISD,,,,Tyto dveře se ještě neotevřou.,Denne dør vil ikke åbne sig endnu,Die Tür öffnet sich noch nicht,,Ĉi tiu pordo ne jam malfermiĝos.,Esta puerta no se abrirá todavía,,Tämä ovi ei aukea vielä,Cette porte ne s'ouvre pas pour l'instant.,,Ez az ajtó még nem fog kitárulni.,Questa porta non è aperta ancora,扉はまだ開かない,이 문은 아직 열 수 없다,Deze deur gaat nog niet open.,Denne døren vil ikke åpne seg ennå,Te drzwi jeszcze się nie otwierają,Esta porta não se abrirá ainda,,Ușa n-o să se deschidă încă,Сейчас эта дверь закрыта,Ова врата су тренутно закључана,Den här dörren kommer inte att öppnas än.,Bu kapı henüz açılmayacak. +"My servants can smell your blood, human",TXT_ACS_MAP13_11_MYSER,,,,"Mí služebníci cítí tvou krev, člověče.","Mine tjenere kan lugte dit blod, menneske","Meine Diener riechen dein Blut, Menschling",,"Miajn servantoj povas flari vian sangon, homo.","Mis sirvientes pueden oler tu sangre, humano",,"Palvelijani voivat haistaa veresi, ihminen","Mes servants peuvent sentir votre sang, humain.",,"Szolgáim érzik a véred szagát, emberfattya","I miei servi possono annusare il tuo sangue, umano",我が下僕が貴様の血を嗅ぎ付けた様だぞ、小童,"이 몸의 하인들은 네 피 냄새를 맏고 따라온다, 인간.","Mijn bedienden kunnen jouw bloed ruiken, mens","Mine tjenere kan lukte blodet ditt, menneske",Moje sługi czują twą krew śmiertelniku,"Meus servos sentem o cheiro do seu sangue, human@[ao_ptb]",,"Servitorii mei îți pot adulmeca sângele, muritorule","Мои прислужники чуют твою кровь, человек","Моје слуге миришу твоју крв, човече","Mina tjänare kan känna lukten av ditt blod, människa.","Hizmetçilerim kanının kokusunu alabiliyor, insan." +A door opened in the Gibbet,TXT_ACS_MAP21_0_ADOOR,,,,Dveře se otevřely na Šibenici.,En dør blev åbnet i Gibbet,Eine Tür in der Richtstätte wurde geöffnet,,Pordo malfermiĝis ĉe la Pendigilo.,Una puerta se abrió en la horca,,Ovi avautui hirsipuulla,Une porte s'est ouverte dans le gibet.,,Egy ajtó kinyílik az Akasztófánál,Una porta è stata aperta nella Forca,晒し台 への扉が開いた,교수대에서 문이 열렸다,Een deur geopend in de Gibbet,En dør åpnet seg i galgen,Drzwi przy Szubienicy otworzyły się,Uma porta se abriu na Forca,,O ușă s-a deschis pe Eșafod,Проход будет открыт возле виселицы,Пролаз је отворен код вешала,En dörr öppnades i Gibbet,İnfaz yerinde bir kapı açıldı +The door is barred from the inside,TXT_ACS_MAP21_2_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está atrancada desde el interior,,Ovi on teljetty sisältä,Cette porte est bloquée de l'intérieur.,,Az ajtó belülről van eltorlaszolva,La porta è sbarrata da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od środka,A porta está barrada por dentro,,Ușa e blocată dinăuntru,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. +A platform has lowered in the tower,TXT_ACS_MAP22_3_APLAT,,,,Plošina ve věži sjela dolů.,En platform er sænket i tårnet,Im Turm hat sich eine Plattform gesenkt,,Plataĵo malleviĝis en la turo.,Una plataforma ha bajado en la torre,,Lava on laskeutunut tornissa,Une plateforme est descendue dans la tour.,,Egy platform leereszkedett a toronyban,Una piattaforma si è abbassata nella torre,塔内の昇降機が下りた,성 안에서 보행판이 내려왔다,Een platform is in de toren neergelaten in de toren,En plattform har senket seg i tårnet,Platforma w wieży obniżyła się,Uma plataforma desceu na torre,,O platformă a coborât în turn,Площадка опустилась в центральной башне,Спустио се платформ у централном торњу,En plattform har sänkts i tornet,Kuleye bir platform indirildi +"You have played this game too long, mortal...",TXT_ACS_MAP22_27_YOUHA,,,,"Tuhle partii jsi už hrál@[ao_cs] moc dlouho, smrtelníče,","Du har spillet dette spil for længe, dødelige...","Du spielst schon zu lange, Sterblicher...",,"Ludis ĉi tiun ludon vi tro longe, mortemul'...","Has jugado este juego demasiado tiempo, mortal...",,"Olet pelannut tätä peliä liian pitkään, kuolevainen...","Vous avez joué à ce jeu trop longtemps, mortel..",,"Túl sokat játszadoztál, halandó...","Ha giocato a questo gioco troppo a lungo, mortale...",遊びはここまでだ、小僧,"네 놈은 오랫동안 놀았도다, 필멸자여...","Je hebt dit spel te lang gespeeld, sterfelijke...","Du har spilt dette spillet for lenge, dødelige...",Już za długo grasz w tą grę śmiertelniku...,"Você jogou este jogo por tempo demais, mortal...",,"Ai jucat acest joc prea multă vreme, muritorule...","Ты слишком заигрался, смертный...","Превише си се заиграо, смртниче...","Du har spelat det här spelet för länge, dödlig...","Bu oyunu çok uzun oynadın, ölümlü." +I think I shall remove you from the board,TXT_ACS_MAP22_29_ITHIN,,,,"myslím, že bych tě měl odstranit ze šachovnice.","Jeg tror, jeg vil fjerne dig fra brættet.",Ich denke ich sollte dich vom Brett entfernen,,"Mi kredas, ke mi vin forigos el la tabul'.",Creo que te retiraré del tablero,,Ajattelenpa poistaa sinut pelilaudalta,Je pense qu'il est l'heure de vous retirer de l'échiquier.,,"Azt hiszem le kell, hogy üsselek a tábláról",Penso che ti rimuoverò dalla scacchiera,盤上から貴様を排除する,이 몸이 너를 말 치우듯이 제거하겠다.,Ik denk dat ik u van het bord zal verwijderen,Jeg tror jeg skal fjerne deg fra brettet,"Myślę, że usunę cię z planszy",Acho que irei removê-l@[ao_ptb] do tabuleiro,,Cred că e timpul să te înlătur de pe tablă,Пришло время завершить твою партию,Дошло је време да се заврши твоја партија,Jag tror att jag ska ta bort dig från spelplanen.,Sanırım seni tahtadan kaldırmalıyım. +You hear a door open upstairs,TXT_ACS_MAP23_10_YOUHE,,,,Z patra slyšíš otevírající se dveře.,Du hører en dør blive åbnet ovenpå.,"Du hörst, wie sich oben eine Tür öffnet",,Vi aŭdas pordon malfermiĝantan superŝtupare.,Escuchas una puerta que se abre arriba,,Kuulet oven avautuvat yläkerrassa,Vous entendez une porte s'ouvrir à l'étage.,,Hallod ahogy egy ajtó kinyílik az emeleten,Senti una porta aprirsi al piano di sopra,上層階の扉が開いた,윗층에서 문이 열리는 소리가 들린다,Je hoort een deur boven opengaan,Du hører en dør åpnes ovenpå,Słyszysz odgłos otwierających się na górze drzwi,Você ouve uma porta se abrir lá em cima,,Auzi o ușă deschizându-se sus,Слышен звук открывающейся двери наверху,Од северне дворане зачује се звук,Du hör en dörr öppnas på övervåningen.,Üst katta bir kapının açıldığını duyuyorsun. +"Worship me, and I may yet be merciful",TXT_ACS_MAP27_8_WORSH,,,,Uctívej mě a možná ještě budu milosrdný.,"Tilbeder du mig, så er jeg måske barmhjertig.",Verehre mich und ich könnte gnädig sein,,"Kultu min, tiam mi ankoraŭ eble kompatos.","Adórame, y aun puedo ser misericordioso",,"Palvo minua, ja saatan vielä olla armahtavainen","Prosternez vous devant moi, et je pourrai considérer de vous épargner.",,"Hódolj be, és talán kegyelmes leszek","Venerami, e potrei essere ancora misericordioso",我を崇めろ、慈悲を残している内に,"이 몸에게 경배하라, 그럼 자비를 베풀 것이다.","Aanbid me, en ik mag dan nog genadig zijn","Tilbe meg, og jeg kan ennå være barmhjertig.","Wielb mnie, a może będę miłosierny","Venere-me, e eu poderei ser piedoso",,"Venerează-mă, și s-ar putea să mai fiu milostiv încă","Преклонись предо мной, и, может быть, я буду милосерден","Преклони се преда мноме, и можда ћу бити милостив","Dyrka mig, så kanske jag är barmhärtig.","Bana ibadet et, belki merhamet ederim" +"Then again, maybe not",TXT_ACS_MAP27_10_THENA,,,,"Na druhou stranu, možná ne.",Men måske heller ikke,"Andererseits, vielleicht aber auch nicht",,"Tamen, eble ne.","Aunque, tal vez no",,"Mutta toisaalta, ehken sittenkään",Quoi que cela soit peu probable.,,"Jól átgondolva, inkább nem",O potrei anche non esserlo,まあ、有り得ないな,허나... 그러지는 않겠지.,"Maar nogmaals, misschien niet",Men kanskje ikke,"Z drugiej strony, może nie...","Pensando melhor, talvez não",,"Dar apoi, poate că nu","А может быть, и нет",А можда и нећу,"Men å andra sidan, kanske inte.","Sonra tekrar, belki de değil" +One ninth of the puzzle has been solved,TXT_ACS_MAP28_6_ONENI,,,,V Klášteru byla vyřešena,En niende del af puslespillet er blevet løst,Ein Neuntel des Rätsels wurde gelöst,,Unu naŭono de la puzlo estas solvita,Un noveno del acertijo se ha resuelto,,Yhdeksäsosa pulmasta on ratkaistu,Un neuvième du puzzle à été résolu,,A rejtvény egy kilencede megfejtésre került,Un nono del puzzle è stato risolto,九種のパズルの一つが解かれた,수수께끼의 9분의 1이 풀렸다,Een negende van de puzzel is opgelost.,En niende del av puslespillet er løst.,Jedna dziewiąta zagadki rozwiązana,Um nono do quebra-cabeça foi resolvido,,O noime din puzzle a fost rezolvată,Одна девятая головоломки разгадана,Деветина загонетке је решена,En niondel av pusslet har lösts.,Bulmacanın dokuzda biri çözüldü +On the Monastery,TXT_ACS_MAP28_7_ONTHE,,,,jedna devítina rébusu.,På klosteret,Im Kloster,,en la Monaĥejo.,En el Monasterio,,luostarissa,dans le monastère.,,A Monostorban,Nel Monastero,修道院 にわずかに影響を与えた,... 헤러시아크의 신학교에서,Op het klooster,på klosteret,w Klasztorze,No Mosteiro,,pe Mănăstire,в семинарии Ересиарха,у Јересијарховој семинарији,På klostret,Manastır Üzerine +One ninth of the puzzle has been solved,TXT_ACS_MAP30_6_ONENI,,,,V Klášteru byla vyřešena,En niende del af puslespillet er blevet løst,Ein Neuntel des Rätsels wurde gelöst,,Unu naŭono de la puzlo estas solvita,Un noveno del acertijo se ha resuelto,,Yhdeksäsosa pulmasta on ratkaistu,Un neuvième du puzzle à été résolu,,A rejtvény egy kilencede megfejtésre került,Un nono del puzzle è stato risolto,九種のパズルの一つが解かれた,수수께끼의 9분의 1이 풀렸다,Een negende van de puzzel is opgelost.,En niende del av gåten er løst.,Jedna dziewiąta zagadki rozwiązana,Um nono do quebra-cabeça foi resolvido,,O noime din puzzle a fost rezolvată,Одна девятая головоломки разгадана,Деветина загонетке је решена,En niondel av pusslet har lösts.,Bulmacanın dokuzda biri çözüldü +On the Monastery,TXT_ACS_MAP30_7_ONTHE,,,,jedna devítina rébusu.,På klosteret,Im Kloster,,en la Monaĥejo.,En el Monasterio,,luostarissa,dans le monastère.,,A Monostorban,Nel Monastero,修道院 にわずかに影響を与えた,... 헤러시아크의 신학교에서,Op het klooster,på klosteret,w Klasztorze,No Mosteiro,,pe Mănăstire,в семинарии Ересиарха,у Јересијарховој семинарији,På klostret,Manastır Üzerine +One ninth of the puzzle has been solved,TXT_ACS_MAP34_1_ONENI,,,,V Klášteru byla vyřešena,En niende del af puslespillet er blevet løst,Ein Neuntel des Rätsels wurde gelöst,,Unu naŭono de la puzlo estas solvita,Un noveno del acertijo se ha resuelto,,Yhdeksäsosa pulmasta on ratkaistu,Un neuvième du puzzle à été résolu,,A rejtvény egy kilencede megfejtésre került,Un nono del puzzle è stato risolto,九種のパズルの一つが解かれた,수수께끼의 9분의 1이 풀렸다,Een negende van de puzzel is opgelost.,En niendedel av puslespillet er løst,Jedna dziewiąta zagadki rozwiązana,Um nono do quebra-cabeça foi resolvido,,O noime din puzzle a fost rezolvată,Одна девятая головоломки разгадана,Деветина загонетке је решена,En nionde del av pusslet har lösts.,Bulmacanın dokuzda biri çözüldü +On the Monastery,TXT_ACS_MAP34_2_ONTHE,,,,jedna devítina rébusu.,På klosteret,Im Kloster,,en la Monaĥejo.,En el Monasterio,,luostarissa,dans le monastère.,,A Monostorban,Nel Monastero,修道院 にわずかに影響を与えた,... 헤러시아크의 신학교에서,Op het klooster,på klosteret,w Klasztorze,No Mosteiro,,pe Mănăstire,в семинарии Ересиарха,у Јересијарховој семинарији,På klostret,Manastır Üzerine +The portal has been sealed,TXT_ACS_MAP35_0_THEPO,,,,Portál byl zapečeťen.,Portalen er blevet forseglet,Das Portal wurde versiegelt,,La portalo estas obturita.,El portal se ha sellado,,Portaali on sinetöity,Le portail est scellé.,,Az átjáró bezárult.,Il portale è stato sigillato,ポータルは封印された,차원문은 봉인되었다,Het portaal is verzegeld,Portalen har blitt forseglet,Portal został zapieczętowany,O portal foi selado,,Portalul a fost închis,Портал закрылся,Врата су затворена,Portalen har förseglats.,Geçit mühürlendi +Choose your fate,TXT_ACS_MAP35_1_CHOOS,,,,Vyber si svůj osud.,Vælg din skæbne,Wähle dein Schicksal,,Elektu vian fatalon.,Escoge tu destino,Escoge tú destino,Valitse kohtalosi,Choisissez votre sort.,,Dönts sorsod felől,Scegli la tua sorte,運命を撰べ,그대의 운명을 정해라,Kies uw lot,Velg din skjebne,Wybierz swoje przeznaczenie,Escolha o seu destino,,Alegeți destinul,Сделай свой выбор,Донеси своју одлуку,Välj ditt öde,Kaderinizi seçin +The door is barred from the inside,TXT_ACS_MAP35_3_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está atrancada desde el interior,,Ovi on teljetty sisältä,Cette porte est bloquée de l'intérieur.,,Az ajtót belülről torlaszolták el.,La porta è sbarrata da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od środka,A porta está barrada por dentro,,Ușa e blocată dinăuntru,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. +Are you strong enough,TXT_ACS_MAP35_12_AREYO,,,,"Jsi dost siln@[adj_cs],",Er du stærk nok?,Bist du stark genug,,Ĉu vi estas sufiĉe forta,Eres lo suficientemente fuerte,,Olet riittävän vahva,Etes vous suffisamment fort,,"Elég erős vagy,",Sei abbastanza forte,お前がどれだけ強かろうと,네 놈은 주인들을 대면할 힘이...,Ben je sterk genoeg,Er du sterk nok,Czy jesteś wystarczająco silny,Você é forte o suficiente,,Ești întradevăr suficient de puternic,"Достаточно ли ты силён,",Јеси ли довољно снажан,Är du stark nog?,Yeterince güçlü müsün? +To face your own masters?,TXT_ACS_MAP35_14_TOFAC,,,,čelit svým vlastním pánům?,Til at møde dine egne mestre?,Dich deinen eigenen Meistern zu stellen?,,por stari kontraŭ viaj propraj mastroj?,¿Para enfrentarte a tus maestros?,,kohtaamaan omat mestarisi?,pour faire face à vos maîtres?,,Hogy saját mestereiddel nézz szembe?,Da affrontare i tuoi stessi maestri?,お前の師に立ち向かえるのか?,진심으로 있는 것인가?,Om je eigen meesters onder ogen te komen?,Til å møte dine egne mestere?,By stawić czoła swoim mistrzom?,Para enfrentar os seus próprios mestres?,,Să îți înfrunți proprii stăpâni?,чтобы сразиться со своими наставниками?,да се суочиш са својим господарима?,För att möta dina egna mästare?,Kendi efendilerinizle yüzleşmek için mi? +,,Hexen: Deathkings script texts,,,,,,,,,,,,,,,,,,,,,,,,,, +You dare battle in the ready room?,TXT_ACS_MAP33_6_YOUDA,,,,Ty si dovoluješ rvát se v přípravné místnosti?,Tør du kæmpe i beredskabsrummet?,Du wagst es im Bereitschaftsraum zu kämpfen?,,Vi aŭdacas batali en la pretĉambro?,¿Te atreves a luchar en la sala de preparación?,,Kuinka kehtaat taistella valmistautumishuoneessa?,Vous osez faire escarmouche dans la salle de préparation?,,Hogy merészelsz harcolni a váróteremben?,Hai il coraggio di combattere in questa sala?,挑戦する準備は整ったか?,감히 준비의 방에서 전투를 벌이다니...,Durf jij te vechten in de readyroom?,Våger du å kjempe i det klare rommet?,Śmiesz walczyć w pokoju przygotowań?,Como ousa batalhar na sala de espera?,,Îndrăznești să lupți în camera de așteptare?,Ты посмел сражаться в комнате ожидания?,Усуђујеш се борити у припремној соби?,Vågar du slåss i det färdiga rummet?,Hazırlanma odasında savaşmaya mı cüret ediyorsun? +"For that, you shall die!",TXT_ACS_MAP33_7_FORTH,,,,Pro to zemřeš!,For det skal du dø!,Dafür sollst du sterben!,,"Pro tio, vi mortos!","Por eso, ¡deberás morir!",,Siitä hyvästä kuolet!,"Pour cette insulte, vous trépasserez!",,Ezért meghalsz!,"Per questo, morirai!",ならば、死へ進め!,죽어서 값을 치러라!,Daarvoor zal je sterven!,For det skal du dø!,Umrzesz za to!,Você morrerá por isso!,,"Pentru asta, vei muri!",Так умри же!,За то ћеш умрети!,För det ska du dö!,Bunun için öleceksin! +The waterfall is open,TXT_ACS_MAP41_6_THEWA,,,,Vodopád je otevřen.,Vandfaldet er åbent,Der Wasserfall ist geöffnet,,La akvofalo estas malferma.,La cascada se ha abierto,,Vesiputous on auki,La cascade s'est ouverte.,,A vizesés nyitva,La cascata è aperta,滝 は開いた,폭포가 멈췄다,De waterval is open,Fossen er åpen,Wodospad jest otwarty,A cascata está aberta,,Cascada e deschisă,Поток воды остановлен,Водопад је отворен,Vattenfallet är öppet,Şelale açık +The waterfall is blocked,TXT_ACS_MAP41_7_THEWA,,,,Vodopád je zatarasen.,Vandfaldet er blokeret,Der Wasserfall ist blockiert,,La akvofalo estas barita.,La cascada está bloqueada,,Vesiputous on tukittu,La cascade est bloquée.,,A vizesés zárva,La cascata è bloccata,滝 は塞がっている,폭포에 의해 막혔다,De waterval is geblokkeerd,Fossen er blokkert,Wodospad jest zablokowany,A cascata está bloqueada,,Cascada e închisă,Поток воды преграждает путь,Водопад је блокиран,Vattenfallet är blockerat,Şelale tıkalı +A door has opened in the chapel,TXT_ACS_MAP41_8_ADOOR,,,,Dveře se otevřely v kapli.,Der er åbnet en dør i kapellet,Eine Tür in der Kapelle hat sich geöffnet,,Pordo malfermis en la kapelo.,Una puerta se abrió en la Capilla,,Ovi on avautunut kappelissa,Une porte s'est ouverte dans la chapelle.,,Egy ajtó kitárult a kápolnában,Una porta si è aperta nella cappella,庵寺 への扉が開いた,교외 근처에서 문이 열렸다,Een deur is geopend in de kapel,En dør har åpnet seg i kapellet,Drzwi w kaplicy zostały otwarte,Uma porta se abriu na capela,,O ușă s-a deschis în capelă,Дверь открылась в часовне,Врата су се отворила у катедрали,En dörr har öppnats i kapellet.,Şapelde bir kapı açıldı. +Now that's odd...,TXT_ACS_MAP42_4_NOWTH,,,,Tak to je divné...,Det er mærkeligt...,Hm. Das ist merkwürdig...,,Nun tio estas stranga...,Eso es extraño...,,Onpa kummallista...,Ca c'est étrange....,,Ez felettébb különös...,Questo sì che è strano...,何かがおかしい...,무언가가 이상하다...,Dat is vreemd....,Det var merkelig...,Dziwne...,Que estranho...,,Asta e ciudat...,Как странно...,То је чудно...,Det där är konstigt...,İşte bu garip. +Three more parts of the puzzle remain,TXT_ACS_MAP44_1_THREE,,,,Zbývají tři části rébusu.,Der er endnu tre dele af gåden tilbage,Drei weitere Teile des Rätsels verbleiben,,Nur tri partoj de la puzlo restas.,Quedan tres partes más del acertijo,,Kolme pulman palasta jäljellä,Trois parties du puzzle restent à résoudre.,,Három rész maradt a rejtvényből,Rimangono altre tre parti del puzzle,パズルの部品は残り 3つ,3개의 수수께끼가 아직 풀리지 않았다,Er blijven nog drie onderdelen van de puzzel over,Tre deler av puslespillet gjenstår,Pozostały jeszcze trzy części zagadki,Faltam mais três partes do quebra-cabeça,,Trei părți din puzzle încă rămân,Остались три части головоломки,Остају још три дела загонетке ,Det återstår tre delar av pusslet.,Bulmacanın üç parçası daha kaldı. +Two more parts of the puzzle remain,TXT_ACS_MAP44_2_TWOMO,,,,Zbývají dvě části rébusu.,Der er endnu to dele af puslespillet tilbage,Zwei weitere Teile des Rätsels verbleiben,,Nur du partoj de la puzlo restas.,Quedan dos partes más del acertijo,,Kaksi pulman palasta jäljellä,Deux parties du puzzle restent à résoudre.,,Kettő rész maradt a rejtvényből,Rimangono altre due parti del puzzle,パズルの部品は残り 2つ,2개의 수수께끼가 아직 풀리지 않았다,Twee andere delen van de puzzel blijven over,To deler av puslespillet gjenstår,Pozostały jeszcze dwie części zagadki,Faltam mais duas partes do quebra-cabeça,,Două părți din puzzle încă rămân,Остались две части головоломки,Остају још два дела загонетке,Ytterligare två delar av pusslet återstår,Bulmacanın iki parçası daha kaldı +One more part of the puzzle remains,TXT_ACS_MAP44_3_ONEMO,,,,Zbývá jedna část rébusu.,Der er endnu en del af puslespillet tilbage,Ein weiteres Teil des Rätsels ist übrig,,Nur unu parto de la puzlo restas.,Queda una parte más del acertijo,,Yksi pulman palanen jäljellä,Il reste une partie du puzzle à résoudre.,,Egy rész maradt a rejtvényből,Rimane un'altra parte del puzzle,パズルの部品は残り 1つ,마지막 수수께끼가 아직 풀리지 않았다,Nog een deel van de puzzel blijft over,En del av puslespillet gjenstår,Pozostała jeszcze jedna część zagadki,Falta mais uma parte do quebra-cabeça,,O parte din puzzle încă rămâne,Осталась одна часть головоломки,Остаје још један део загонетке,Ytterligare en del av pusslet återstår,Bulmacanın bir parçası daha kaldı +The puzzle is complete,TXT_ACS_MAP44_4_THEPU,,,,Rébus je kompletní.,Puslespillet er færdigt,Das Rätsel ist abgeschlossen,,La puzlo estas kompleta.,El acertijo está completo,,Pulma on ratkaistu,Le puzzle est résolu.,,A rejtvény végleg megoldódott,Il puzzle è completo,パズルは完成した,모든 수수께끼가 풀렸다,De puzzel is compleet,Puslespillet er komplett,Zagadka ukończona,O quebra-cabeça está concluído,,Puzzle-ul e rezolvat,Головоломка разгадана,Загонетка је решена,Pusslet är komplett,Bulmaca tamamlandı +You have not completed the puzzle,TXT_ACS_MAP44_6_YOUHA,,,,Nesplnil jsi rébus.,Du har ikke fuldført puslespillet,Du hast das Rätsel noch nicht gelöst,,Vi ne kompletis la puzlon.,No has completado el acertijo,,Et ole ratkaissut pulmaa,Vous n'avez pas résolu le puzzle.,,Nem fejtetted meg a rejtvényt,Non hai completato il puzzle,パズルはまだ完成していない,모든 수수께끼를 풀지 못했다,Je hebt de puzzel nog niet voltooid.,Du har ikke fullført puslespillet,Nie ukończyłeś zagadki,Você não concluiu o quebra-cabeça,,Nu ai rezolvat puzzle-ul,Головоломка не разгадана,Нисте решили загонетку,Du har inte fullbordat pusslet,Bulmacayı tamamlamadınız +The floor is not safe!,TXT_ACS_MAP44_8_THEFL,,,,Podlaha není bezpečná!,Gulvet er ikke sikkert!,Der Boden hier ist nicht sicher!,,La planko ne estas sendanĝera!,¡El suelo no es seguro!,,Kerros ei ole turvallinen!,Le sol est dangereux!,,A padló nem biztonságos!,Il pavimento è pericoloso!,この場は安全ではない!,이 층은 안전하지 않다!,De vloer is niet veilig!,Gulvet er ikke trygt!,Ta podłoga nie jest bezpieczna!,O chão não está seguro!,,Podeaua nu e sigură!,Пол совсем прогнил!,Под није безбедан!,Golvet är inte säkert!,Zemin güvenli değil! +One third of the puzzle is solved,TXT_ACS_MAP44_10_ONETH,,,,Jedna třetina rébusu je vyřešena.,En tredjedel af puslespillet er løst,Ein Drittel des Rätsels ist gelöst,,Unu triono de la puzlo estas solvita.,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,,A rejtvény egyharmada megoldásra került,Un terzo del puzzle è stato risolto,パズルの 三分の一 が解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost.,En tredjedel av puslespillet er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle e rezolvată,Одна треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet är löst,Bulmacanın üçte biri çözüldü +Two thirds of the puzzle is solved,TXT_ACS_MAP44_11_TWOTH,,,,Dvě třetiny rébusu jsou vyřešeny.,To tredjedele af puslespillet er løst,Zwei Drittel des Rätsels sind gelöst,,Du trionoj de la puzlo estas solvita.,Dos tercios del acertijo se han resuelto,,Kaksi kolmannesta pulmasta on ratkaistu,Deux tiers du puzzle ont été résolus,,A rejtvény kétharmada megoldásra került,Due terzi del puzzle sono stati risolto,パズルの 三分の二 が解かれた,수수께끼의 3분의 2가 풀렸다,Tweederde van de puzzel is opgelost,To tredjedeler av puslespillet er løst.,Dwie trzecie zagadki rozwiązane,Dois terços do quebra-cabeça foi resolvido,,Două treimi din puzzle sunt rezolvate,Две трети головоломки разгаданы,Две трећине загонетке су решене,Två tredjedelar av pusslet är löst.,Bulmacanın üçte ikisi çözüldü +You hear a platform moving in the distance,TXT_ACS_MAP45_1_YOUHE,,,,Slyšíš v dálce pohybující se plošinu.,Du hører en platform bevæge sig i det fjerne,"Du hörst, wie sich in der Ferne eine Platform bewegt",,Vi aŭdas plataĵon movantan malproksime.,Escuchas una plataforma moverse a la distancia,,Kuulet lavan liikkuvan etäällä,Vous entendez une plateforme se déplacer au loin,,Egy emelvény mozgását hallod a távolban,Senti una piattaforma muoversi in lontananza,昇降機の音が遠くで聞こえる,멀리서 보행판이 움직이는 소리가 들려왔다,Je hoort een platform bewegen in de verte,Du hører en plattform bevege seg i det fjerne,Słyszysz odgłos poruszającej się w oddali platformy,Você ouve de longe uma plataforma se movendo,,Auzi o platformă mișcându-se în depărtare,"Неподалёку раздаётся звук движущейся деревянной площадки",Чујете како се платформа помера у даљини,Du hör en plattform som rör sig på avstånd.,Uzakta bir platformun hareket ettiğini duyuyorsunuz. -It is done...,TXT_ACS_MAP46_0_ITISD,,,,Je to dokonáno...,Det er gjort...,Es ist getan...,,Ĝi estas farita...,Está terminado...,,Se on tehty...,C'est terminé...,Készen van...,È fatto...,これで完了だ...,이제 끝났다...,Het is gebeurd,Det er gjort...,"Zrobione... +It is done...,TXT_ACS_MAP46_0_ITISD,,,,Je to dokonáno...,Det er gjort...,Es ist getan...,,Ĝi estas farita...,Está terminado...,,Se on tehty...,C'est terminé...,,Készen van...,È fatto...,これで完了だ...,이제 끝났다...,Het is gebeurd,Det er gjort...,"Zrobione... ",Pronto...,,E gata...,Готово...,Готово је...,Det är gjort...,Bitti... -You have not completed the puzzle,TXT_ACS_MAP46_1_YOUHA,,,,Nesplnil@[ao_cs] jsi rébus.,Du har ikke løst puslespillet,Du hast das Rätsel noch nicht gelöst,,Vi ne kompletis la puzlon.,No has completado el acertijo,,Et ole ratkaissut pulmaa,Vous n'avez pas résolu le puzzle.,Nem fejtetted meg a rejtvényt.,Non hai completato il puzzle,パズルはまだ完成していない,모든 수수께끼를 풀지 못했다,Je hebt de puzzel nog niet voltooid...,Du har ikke fullført puslespillet,Nie ukończyłeś zagadki,Você não terminou o quebra-cabeça,,Nu ai rezolvat puzzle-ul,Головоломка не разгадана,Ниси решио загонетку,Du har inte fullbordat pusslet.,Bulmacayı tamamlamadınız -I'm warning you...,TXT_ACS_MAP46_2_IMWAR,,,,Varuju tě...,Jeg advarer dig...,Ich warne dich...,,Mi avertas vin...,Te lo advierto...,,Varoitan sinua...,Je vous avertis...,Figyelmeztetlek...,Ti avverto...,お前に警告しよう...,나는 경고했다...,Ik waarschuw je...,Jeg advarer deg...,Ostrzegam cię...,Estou te avisando...,,Te avertizez...,Я тебя предупреждаю...,Упозоравам те...,Jag varnar dig...,Seni uyarıyorum. -"Stubborn, aren't you?",TXT_ACS_MAP46_3_STUBB,,,,"Ty jsi ale tvrdohlav@[adj_cs], ne?","Du er stædig, ikke sandt?","Du bist aber stur, was?",,"Vi estas obstina, ĉu ne?","Eres obstinado, ¿verdad?",,Oletpa itsepäinen,"Obstiné, n'est-ce pas?","Makacs vagy, ugye?",Sei proprio così testardo?,頑固だと、自らも思わないか?,정말 끈질기군.,"Koppig, nietwaar?","Du er sta, ikke sant?","Jesteś uparty, prawda?","Você é teimos@[ao_ptb], não é mesmo?",,"Încăpățânat, nu-i așa?",Не слишком ли ты упрямый?,"Тврдоглав си, зар не?","Du är envis, eller hur?","İnatçısın, değil mi?" -"And stupid, too",TXT_ACS_MAP46_4_ANDST,,,,A taky hloup@[adj_cs].,Og også dum,Und auch noch dumm,,Kaj ankaŭ stulta.,"Y estúpido, también",,Ja vieläpä tyhmä,"Et stupide, aussi.",És oktondi is.,"E stupido, pure",そして、あまりにも愚か者だ,어리석기도 하고.,En ook dom,Og dum også.,Głupi też,E estúpid@[ao_ptb] também,,"Și prost, pe deasupra",И не слишком-то разумный!,А још си и глуп,Och dum också.,Ve de aptal. -One fourth of this puzzle is complete,TXT_ACS_MAP46_8_ONEFO,,,,Jedna čtvrtina rébusu je vyřešena.,En fjerdedel af dette puslespil er fuldført,Ein Viertel des Rätsels ist gelöst,,Unu kvarono de la puzlo estas kompleta.,Un cuarto del acertijo se ha resuelto,,Neljännes pulmasta on ratkaistu,Un quart du puzzle à été résolu,Egy negyede e rejtvénynek megvan.,Un quarto del puzzle è completo,パズルの 四分の一 が解かれた,수수께끼의 4분의 1만 풀렸다,Een vierde van deze puzzel is compleet,En fjerdedel av dette puslespillet er ferdig,Jedna czwarta tej zagadki ukończona,Um quarto deste quebra-cabeça está completo,,O pătrime din puzzle e rezolvată,Одна четвёртая этой головоломки разгадана,Четвртина загонетке је решена,En fjärdedel av pusslet är klart.,Bu bulmacanın dörtte biri tamamlandı -Bad choice...,TXT_ACS_MAP46_9_BADCH,,,,Špatná volba.,Dårligt valg...,Falsche Wahl...,,Malbona elekto...,Mala decisión...,,Huono valinta...,Mauvaise décision...,Rossz választás...,Scelta sbagliata...,拙い選択だ...,서투른 선택이다...,Slechte keuze....,Dårlig valg...,Zły wybór...,Péssima escolha...,,Proastă alegere...,Плохой выбор...,Лош избор...,Dåligt val...,Kötü seçim... -The symbols are not aligned,TXT_ACS_MAP47_2_THESY,,,,Symboly nejsou zarovnány.,Symbolerne er ikke på linje med hinanden.,Die Symbole sind nicht ausgerichtet,,La simboloj ne estas liniiga.,Los símbolos no están alineados,,Symbolit eivät ole järjestyksessä,Les symboles ne sont pas alignés.,A jelek nincsenek vonalban,I simboli non sono allineati,シンボルが揃っていない,상징이 정렬되지 않았다,De symbolen zijn niet uitgelijnd,Symbolene er ikke på linje.,Symbole nie są wyrównane,Os símbolos não estão alinhados,,Simbolurile nu sunt aliniate,Символы не совпадают,Симболи нису поравнати,Symbolerna är inte i linje med varandra.,Semboller aynı hizada değil -The door won't open from this side,TXT_ACS_MAP48_2_THEDO,,,,Dveře se z této strany neotevřou.,Døren kan ikke åbnes fra denne side.,Die Tür kann sich von dieser Seite nicht öffnen,,La pordo ne malfermiĝas.,La puerta no abrirá por este lado,,Ovi ei aukea tältä puolelta,La porte ne s'ouvre pas de ce côté.,Az ajtó nem fog kinyílni innen.,La porta non si apre da questo lato,扉はこちら側から開けられない,이 문은 이 방향으로는 열리지 않는다,De deur gaat niet open van deze kant,Døren kan ikke åpnes fra denne siden,Drzwi nie otworzą się z tej strony,A porta não se abrirá deste lado,,Ușile nu se vor deschide de pe partea asta,С этой стороны дверь не открыть,Врата неће да се отворе са стране,Dörren öppnas inte från den här sidan.,Kapı bu taraftan açılmıyor. -The door is barred from the outside,TXT_ACS_MAP50_1_THEDO,,,,Dveře jsou zatarasené zvenku.,Døren er spærret udefra,Die Tür ist von außen verriegelt,,La pordo estas barita ekstere.,La puerta está atrancada por fuera,,Ovi on teljetty ulkopuolelta,Cette porte est bloquée de l'extérieur.,Az ajtó kívülről van eltorlaszolva.,La porta è sbarrata da fuori,この扉は外側から塞がれている,이 문은 바깥에 빗장이 걸려있다,De deur is van buitenaf uitgesloten,Døren er sperret fra utsiden,Drzwi są zabarykadowane od zewnątrz,A porta está barrada por fora,,Ușa e încuiată pe dinafară,Дверь заблокирована снаружи,Врата су блокирана споља,Dörren är spärrad från utsidan,Kapı dışarıdan parmaklıklı. -Sacrilege !,TXT_ACS_MAP51_5_SACRI,,,,Svatokrádež!,Helligbrøde!,Gotteslästerung!,,Sakrilegio !,¡Sacrilegio!,,Pyhäinhäväistys !,Sacrilège!,Szentségtörés!,Sacrilegio !,罰当たりが!,신성모독이다!,Heiligschennis!,Helligbrøde!,Świętokradztwo !,Sacrilégio!,,Sacrilegiu!,Святотатство!,Светогрђе !,Helgerån!,Kutsala saygısızlık! -You have defiled Eric's tomb !!,TXT_ACS_MAP51_6_YOUHA,,,,Znesvětil@[ao_cs] jsi Erikovu hrobku!!,Du har besudlet Erics grav!!,Du hast Erics Gruft entehrt!!,,Vi malpurigis la tombon de Eric !!,¡Has profanado la tumba de Erick!,,Olet turmellut Ericin haudan !!,Vous avez vandalisé la tombe d'Eric!,Megszentségtelenítetted Eric sírját!,Hai profanato la tomba di Eric !!,貴様はエリックの墓を荒らしたな!!,네 놈은 성 에릭의 무덤을 더렵혔다!!,Je hebt Eric's graf bevlekt!!,Du har vanhelliget Erics grav !!!,Zhańbiłeś grób Erica !!,Você violou a tumba de Eric!,,Ai profanat mormântul lui Eric!!,Ты осквернил@[ao_rus] могилу Эрика!!,Оскрнавио си Ерикову гробницу !!,Du har besudlat Erics grav!!,Eric'in mezarını kirlettin! -And now you die !!!,TXT_ACS_MAP51_7_ANDNO,,,,Teď zemřeš!!!,Og nu skal du dø!!!!,Und nun stirbst du!,,Kaj nun vi mortas !!!,¡Y ahora morirás!,,Ja nyt sinä kuolet !!!,"Pour cela, vous allez mourir!",És most meghalsz!,E ora muori !!!,万死に値する!!!,그 댓가로 목숨을 바쳐라!!!,En nu ga je dood!!!!!,Og nå dør du!!!,I teraz zginiesz !!!,E agora você morrerá!!!,,"Iar acum, mori!!",И умрёшь за это страшной смертью!!!,И због тога ћеш умрети !!!,Och nu dör du !!!,Ve şimdi öleceksin!!! -One third of the puzzle is solved,TXT_ACS_MAP51_8_ONETH,,,,Jedna třetina rébusu je vyřešena.,En tredjedel af gåden er løst,Ein Drittel des Rätsels ist gelöst,,Unu triono de la puzlo estas solvita.,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,A rejtvény egyharmada megoldásra került.,Un terzo del puzzle è stato risolto,パズルの 三分の一 が解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost.,En tredjedel av gåten er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle e rezolvată,Одна треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet är löst,Bulmacanın üçte biri çözüldü. -Two thirds of the puzzle is solved,TXT_ACS_MAP51_9_TWOTH,,,,Dvě třetiny rébusu jsou vyřešeny.,To tredjedele af gåden er løst,Zwei Drittel des Rätsels sind gelöst,,Du trionoj de la puzlo estas solvita.,Dos tercios del acertijo se han resuelto,,Kaksi kolmannesta pulmasta on ratkaistu,deux tiers du puzzle ont été résolus,A rejtvény kétharmada megoldásra került.,Due terzi del puzzle è stato risolto,パズルの 三分の二 が解かれた,수수께끼의 3분의 2가 풀렸다,Tweederde van de puzzel is opgelost,To tredjedeler av puslespillet er løst.,Dwie trzecie zagadki rozwiązane,Dois terços do quebra-cabeça foi resolvido,,Două treimi din puzzle sunt rezolvate,Две трети головоломки разгаданы,Две трећине загонетке су решене,Två tredjedelar av pusslet är löst.,Bulmacanın üçte ikisi çözüldü -The crypt is open,TXT_ACS_MAP51_10_THECR,,,,Krypta je otevřena.,Krypten er åben,Die Gruft ist offen,,La kripto estas malfermita.,La cripta ahora está abierta,,Krypta on auki,La crypte est ouverte,A kripta kinyílt.,La cripta è aperta,地下聖堂 が開いた,지하 묘실의 입구가 열렸다.,De crypte is open,Krypten er åpen,Krypta jest otwarta,A cripta está aberta,,Cripta e deschisă,Склеп открыт,Гробница је отворена,Kryptan är öppen.,Mahzen açık -Beware the spider's tomb,TXT_ACS_MAP51_11_BEWAR,,,,Vyvaruj se pavoučí hrobky.,Pas på edderkoppens grav,Hüte dich vor dem Grab der Spinne,,Singardu en la tombo de la araneo.,Cuidado con la tumba de la araña,,Varo hämähäkin hautaa,Attention à la tombe de l'araignée.,Óvakodj a pók sírjától!,Attento alla tomba del ragno,スパイダーの墓,거미의 무덤을 조심하라,Pas op voor het graf van de spin,Se opp for edderkoppens grav,Strzeż się grobowca pająków,Cuidado com a tumba da aranha,,Păzește-te de mormântul păianjenului,Опасайся гробницы паука,Чувај се паукове гробнице,Akta dig för spindelns grav,Örümceğin mezarına dikkat edin -You hear a platform rise outside,TXT_ACS_MAP51_13_YOUHE,,,,Slyšíš zvenku zvedající se platformu.,Du hører en platform rejse sig udenfor,"Du hörst, wie sich draußen eine Plattform erhebt",,Vi aŭdas plataĵon leviĝantan ekstere.,Escuchas una plataforma erguirse afuera,,Kuulet lavan kohoavan ulkopuolella,Vous entendez une platforme s'élever dehors,Egy emelvényt hallasz emelkedni odakinn,Senti una piattaforma alzarsi in lontananza,外で昇降機の音が聞こえる,밖에서 보행판이 올라오는 소리가 들려왔다,Je hoort een platform buiten opstijgen,Du hører en plattform stige utenfor,Słyszysz odgłos unoszącej się na zewnątrz platformy,Você ouve uma plataforma subir lá fora,,Auzi o platformă ridicându-se afară,"Снаружи слышен звук +You have not completed the puzzle,TXT_ACS_MAP46_1_YOUHA,,,,Nesplnil@[ao_cs] jsi rébus.,Du har ikke løst puslespillet,Du hast das Rätsel noch nicht gelöst,,Vi ne kompletis la puzlon.,No has completado el acertijo,,Et ole ratkaissut pulmaa,Vous n'avez pas résolu le puzzle.,,Nem fejtetted meg a rejtvényt.,Non hai completato il puzzle,パズルはまだ完成していない,모든 수수께끼를 풀지 못했다,Je hebt de puzzel nog niet voltooid...,Du har ikke fullført puslespillet,Nie ukończyłeś zagadki,Você não terminou o quebra-cabeça,,Nu ai rezolvat puzzle-ul,Головоломка не разгадана,Ниси решио загонетку,Du har inte fullbordat pusslet.,Bulmacayı tamamlamadınız +I'm warning you...,TXT_ACS_MAP46_2_IMWAR,,,,Varuju tě...,Jeg advarer dig...,Ich warne dich...,,Mi avertas vin...,Te lo advierto...,,Varoitan sinua...,Je vous avertis...,,Figyelmeztetlek...,Ti avverto...,お前に警告しよう...,나는 경고했다...,Ik waarschuw je...,Jeg advarer deg...,Ostrzegam cię...,Estou te avisando...,,Te avertizez...,Я тебя предупреждаю...,Упозоравам те...,Jag varnar dig...,Seni uyarıyorum. +"Stubborn, aren't you?",TXT_ACS_MAP46_3_STUBB,,,,"Ty jsi ale tvrdohlav@[adj_cs], ne?","Du er stædig, ikke sandt?","Du bist aber stur, was?",,"Vi estas obstina, ĉu ne?","Eres obstinado, ¿verdad?",,Oletpa itsepäinen,"Obstiné, n'est-ce pas?",,"Makacs vagy, ugye?",Sei proprio così testardo?,頑固だと、自らも思わないか?,정말 끈질기군.,"Koppig, nietwaar?","Du er sta, ikke sant?","Jesteś uparty, prawda?","Você é teimos@[ao_ptb], não é mesmo?",,"Încăpățânat, nu-i așa?",Не слишком ли ты упрямый?,"Тврдоглав си, зар не?","Du är envis, eller hur?","İnatçısın, değil mi?" +"And stupid, too",TXT_ACS_MAP46_4_ANDST,,,,A taky hloup@[adj_cs].,Og også dum,Und auch noch dumm,,Kaj ankaŭ stulta.,"Y estúpido, también",,Ja vieläpä tyhmä,"Et stupide, aussi.",,És oktondi is.,"E stupido, pure",そして、あまりにも愚か者だ,어리석기도 하고.,En ook dom,Og dum også.,Głupi też,E estúpid@[ao_ptb] também,,"Și prost, pe deasupra",И не слишком-то разумный!,А још си и глуп,Och dum också.,Ve de aptal. +One fourth of this puzzle is complete,TXT_ACS_MAP46_8_ONEFO,,,,Jedna čtvrtina rébusu je vyřešena.,En fjerdedel af dette puslespil er fuldført,Ein Viertel des Rätsels ist gelöst,,Unu kvarono de la puzlo estas kompleta.,Un cuarto del acertijo se ha resuelto,,Neljännes pulmasta on ratkaistu,Un quart du puzzle à été résolu,,Egy negyede e rejtvénynek megvan.,Un quarto del puzzle è completo,パズルの 四分の一 が解かれた,수수께끼의 4분의 1만 풀렸다,Een vierde van deze puzzel is compleet,En fjerdedel av dette puslespillet er ferdig,Jedna czwarta tej zagadki ukończona,Um quarto deste quebra-cabeça está completo,,O pătrime din puzzle e rezolvată,Одна четвёртая этой головоломки разгадана,Четвртина загонетке је решена,En fjärdedel av pusslet är klart.,Bu bulmacanın dörtte biri tamamlandı +Bad choice...,TXT_ACS_MAP46_9_BADCH,,,,Špatná volba.,Dårligt valg...,Falsche Wahl...,,Malbona elekto...,Mala decisión...,,Huono valinta...,Mauvaise décision...,,Rossz választás...,Scelta sbagliata...,拙い選択だ...,서투른 선택이다...,Slechte keuze....,Dårlig valg...,Zły wybór...,Péssima escolha...,,Proastă alegere...,Плохой выбор...,Лош избор...,Dåligt val...,Kötü seçim... +The symbols are not aligned,TXT_ACS_MAP47_2_THESY,,,,Symboly nejsou zarovnány.,Symbolerne er ikke på linje med hinanden.,Die Symbole sind nicht ausgerichtet,,La simboloj ne estas liniiga.,Los símbolos no están alineados,,Symbolit eivät ole järjestyksessä,Les symboles ne sont pas alignés.,,A jelek nincsenek vonalban,I simboli non sono allineati,シンボルが揃っていない,상징이 정렬되지 않았다,De symbolen zijn niet uitgelijnd,Symbolene er ikke på linje.,Symbole nie są wyrównane,Os símbolos não estão alinhados,,Simbolurile nu sunt aliniate,Символы не совпадают,Симболи нису поравнати,Symbolerna är inte i linje med varandra.,Semboller aynı hizada değil +The door won't open from this side,TXT_ACS_MAP48_2_THEDO,,,,Dveře se z této strany neotevřou.,Døren kan ikke åbnes fra denne side.,Die Tür kann sich von dieser Seite nicht öffnen,,La pordo ne malfermiĝas.,La puerta no abrirá por este lado,,Ovi ei aukea tältä puolelta,La porte ne s'ouvre pas de ce côté.,,Az ajtó nem fog kinyílni innen.,La porta non si apre da questo lato,扉はこちら側から開けられない,이 문은 이 방향으로는 열리지 않는다,De deur gaat niet open van deze kant,Døren kan ikke åpnes fra denne siden,Drzwi nie otworzą się z tej strony,A porta não se abrirá deste lado,,Ușile nu se vor deschide de pe partea asta,С этой стороны дверь не открыть,Врата неће да се отворе са стране,Dörren öppnas inte från den här sidan.,Kapı bu taraftan açılmıyor. +The door is barred from the outside,TXT_ACS_MAP50_1_THEDO,,,,Dveře jsou zatarasené zvenku.,Døren er spærret udefra,Die Tür ist von außen verriegelt,,La pordo estas barita ekstere.,La puerta está atrancada por fuera,,Ovi on teljetty ulkopuolelta,Cette porte est bloquée de l'extérieur.,,Az ajtó kívülről van eltorlaszolva.,La porta è sbarrata da fuori,この扉は外側から塞がれている,이 문은 바깥에 빗장이 걸려있다,De deur is van buitenaf uitgesloten,Døren er sperret fra utsiden,Drzwi są zabarykadowane od zewnątrz,A porta está barrada por fora,,Ușa e încuiată pe dinafară,Дверь заблокирована снаружи,Врата су блокирана споља,Dörren är spärrad från utsidan,Kapı dışarıdan parmaklıklı. +Sacrilege !,TXT_ACS_MAP51_5_SACRI,,,,Svatokrádež!,Helligbrøde!,Gotteslästerung!,,Sakrilegio !,¡Sacrilegio!,,Pyhäinhäväistys !,Sacrilège!,,Szentségtörés!,Sacrilegio !,罰当たりが!,신성모독이다!,Heiligschennis!,Helligbrøde!,Świętokradztwo !,Sacrilégio!,,Sacrilegiu!,Святотатство!,Светогрђе !,Helgerån!,Kutsala saygısızlık! +You have defiled Eric's tomb !!,TXT_ACS_MAP51_6_YOUHA,,,,Znesvětil@[ao_cs] jsi Erikovu hrobku!!,Du har besudlet Erics grav!!,Du hast Erics Gruft entehrt!!,,Vi malpurigis la tombon de Eric !!,¡Has profanado la tumba de Erick!,,Olet turmellut Ericin haudan !!,Vous avez vandalisé la tombe d'Eric!,,Megszentségtelenítetted Eric sírját!,Hai profanato la tomba di Eric !!,貴様はエリックの墓を荒らしたな!!,네 놈은 성 에릭의 무덤을 더렵혔다!!,Je hebt Eric's graf bevlekt!!,Du har vanhelliget Erics grav !!!,Zhańbiłeś grób Erica !!,Você violou a tumba de Eric!,,Ai profanat mormântul lui Eric!!,Ты осквернил@[ao_rus] могилу Эрика!!,Оскрнавио си Ерикову гробницу !!,Du har besudlat Erics grav!!,Eric'in mezarını kirlettin! +And now you die !!!,TXT_ACS_MAP51_7_ANDNO,,,,Teď zemřeš!!!,Og nu skal du dø!!!!,Und nun stirbst du!,,Kaj nun vi mortas !!!,¡Y ahora morirás!,,Ja nyt sinä kuolet !!!,"Pour cela, vous allez mourir!",,És most meghalsz!,E ora muori !!!,万死に値する!!!,그 댓가로 목숨을 바쳐라!!!,En nu ga je dood!!!!!,Og nå dør du!!!,I teraz zginiesz !!!,E agora você morrerá!!!,,"Iar acum, mori!!",И умрёшь за это страшной смертью!!!,И због тога ћеш умрети !!!,Och nu dör du !!!,Ve şimdi öleceksin!!! +One third of the puzzle is solved,TXT_ACS_MAP51_8_ONETH,,,,Jedna třetina rébusu je vyřešena.,En tredjedel af gåden er løst,Ein Drittel des Rätsels ist gelöst,,Unu triono de la puzlo estas solvita.,Un tercio del acertijo se ha resuelto,,Kolmannes pulmasta on ratkaistu,Un tiers du puzzle à été résolu,,A rejtvény egyharmada megoldásra került.,Un terzo del puzzle è stato risolto,パズルの 三分の一 が解かれた,수수께끼의 3분의 1이 풀렸다,Een derde van de puzzel is opgelost.,En tredjedel av gåten er løst,Jedna trzecia zagadki rozwiązana,Um terço do quebra-cabeça foi resolvido,,O treime din puzzle e rezolvată,Одна треть головоломки разгадана,Трећина загонетке је решена,En tredjedel av pusslet är löst,Bulmacanın üçte biri çözüldü. +Two thirds of the puzzle is solved,TXT_ACS_MAP51_9_TWOTH,,,,Dvě třetiny rébusu jsou vyřešeny.,To tredjedele af gåden er løst,Zwei Drittel des Rätsels sind gelöst,,Du trionoj de la puzlo estas solvita.,Dos tercios del acertijo se han resuelto,,Kaksi kolmannesta pulmasta on ratkaistu,deux tiers du puzzle ont été résolus,,A rejtvény kétharmada megoldásra került.,Due terzi del puzzle è stato risolto,パズルの 三分の二 が解かれた,수수께끼의 3분의 2가 풀렸다,Tweederde van de puzzel is opgelost,To tredjedeler av puslespillet er løst.,Dwie trzecie zagadki rozwiązane,Dois terços do quebra-cabeça foi resolvido,,Două treimi din puzzle sunt rezolvate,Две трети головоломки разгаданы,Две трећине загонетке су решене,Två tredjedelar av pusslet är löst.,Bulmacanın üçte ikisi çözüldü +The crypt is open,TXT_ACS_MAP51_10_THECR,,,,Krypta je otevřena.,Krypten er åben,Die Gruft ist offen,,La kripto estas malfermita.,La cripta ahora está abierta,,Krypta on auki,La crypte est ouverte,,A kripta kinyílt.,La cripta è aperta,地下聖堂 が開いた,지하 묘실의 입구가 열렸다.,De crypte is open,Krypten er åpen,Krypta jest otwarta,A cripta está aberta,,Cripta e deschisă,Склеп открыт,Гробница је отворена,Kryptan är öppen.,Mahzen açık +Beware the spider's tomb,TXT_ACS_MAP51_11_BEWAR,,,,Vyvaruj se pavoučí hrobky.,Pas på edderkoppens grav,Hüte dich vor dem Grab der Spinne,,Singardu en la tombo de la araneo.,Cuidado con la tumba de la araña,,Varo hämähäkin hautaa,Attention à la tombe de l'araignée.,,Óvakodj a pók sírjától!,Attento alla tomba del ragno,スパイダーの墓,거미의 무덤을 조심하라,Pas op voor het graf van de spin,Se opp for edderkoppens grav,Strzeż się grobowca pająków,Cuidado com a tumba da aranha,,Păzește-te de mormântul păianjenului,Опасайся гробницы паука,Чувај се паукове гробнице,Akta dig för spindelns grav,Örümceğin mezarına dikkat edin +You hear a platform rise outside,TXT_ACS_MAP51_13_YOUHE,,,,Slyšíš zvenku zvedající se platformu.,Du hører en platform rejse sig udenfor,"Du hörst, wie sich draußen eine Plattform erhebt",,Vi aŭdas plataĵon leviĝantan ekstere.,Escuchas una plataforma erguirse afuera,,Kuulet lavan kohoavan ulkopuolella,Vous entendez une platforme s'élever dehors,,Egy emelvényt hallasz emelkedni odakinn,Senti una piattaforma alzarsi in lontananza,外で昇降機の音が聞こえる,밖에서 보행판이 올라오는 소리가 들려왔다,Je hoort een platform buiten opstijgen,Du hører en plattform stige utenfor,Słyszysz odgłos unoszącej się na zewnątrz platformy,Você ouve uma plataforma subir lá fora,,Auzi o platformă ridicându-se afară,"Снаружи слышен звук поднимающегося камня",Чујете како се платформа диже споља,Du hör en plattform stiga upp utanför.,Dışarıda bir platformun yükseldiğini duyarsınız -Do you feel lucky?,TXT_ACS_MAP51_14_DOYOU,,,,"Zdá se ti, že máš štěstí?",Føler du dig heldig?,Denkst du das heute dein Glückstag ist?,,Ĉu vi sentas vin bonŝanca?,¿Te sientes afortunado?,,Tunnetko olosi onnekkaaksi?,Vous pensez être chanceux?,Szerencsésnek érzed magad?,Ti senti fortunato?,運が良かったと思うか?,그대는 운수가 좋은가?,Heb je geluk?,Føler du deg heldig?,Masz szczęście?,Está se sentindo com sorte?,,Te simți norocos?,Чувствуешь ли ты себя везучим?,Да ли се осећаш срећним?,Känner du dig lycklig?,Kendinizi şanslı mı hissediyorsunuz? -You guessed wrong!,TXT_ACS_MAP51_15_YOUGU,,,,To máš smůlu!,Du gættede forkert!,Du hast falsch geraten!,,Vi divenis malĝuste!,¡Adivinaste incorrectamente!,,Arvasi väärin!,Et bien non!,Hát rosszul érzed!,Non hai indovinato!,それは違うな!,잘못된 판단이다!,Je hebt het verkeerd geraden!,Du gjettet feil!,Źle zgadłeś!,Adivinhou errado!,,N-ai ghicit!,Неправильное предположение!,Погрешно си погодио!,Du gissade fel!,Yanlış tahmin ettin! -Good guess,TXT_ACS_MAP51_16_GOODG,,,,Dobré zdání.,Godt gættet.,Gut geraten,,Bona diveno.,Buena elección,,Hyvä arvaus,Vous avez deviné!,Jól sejtetted,Hai indovinato,良い推測だ,옳은 판단이다,Goede gok,Godt gjettet,Dobrze zgadłeś,Certa resposta,,Ai ghicit,Правильное предположение,Добар погодак,Bra gissning,İyi tahmin -Can you do all the scripting for my level?,TXT_ACS_MAP51_17_CANYO,,,,Můžeš všechno skriptování udělat za mě?,Kan du lave alt scripting til mit niveau?,Kannst du die Skripte für all meine Level schreiben?,,Ĉu vi povas fari ĉiom da la skriptoj por mia nivelo?,¿Podrías hacer todo el script para mi nivel?,,Voitko tehdä kaikki tasoni skriptaukset?,Vous pouvez faire tout le script de mon niveau?,Meg tudnád csinálni az egészt scriptelést a pályámhoz?,Puoi fare tutto lo scripting per il mio livello?,この階層を全て書き換える事は可能かな?,어쩔 수 없이 살아간다. 태어났기 때문에...,Kun je al het scripten doen voor mijn niveau?,Kan du gjøre alt skriptet for mitt nivå?,Czy możesz zrobić cały skrypt do mojego poziomu?,Poderia fazer todo o scripting da minha fase?,,Te poți ocupa de scripting pentru nivelul meu?,"Может, напишешь за меня все скрипты для моего уровня?",Можеш ли да напишеш све скриптове за мој ниво?,Kan du göra alla skript för min nivå?,Benim seviyem için tüm senaryoyu yazabilir misin? -Don't touch my gloppy,TXT_ACS_MAP51_18_DONTT,,,,Nesahej mi na slimáka!,Rør ikke ved min gloppy,Berühr mein Ding nicht!,,Ne tuŝas mian gloppy-on.,No toques mi gloppy,,Älä koske mönjääni,Ne touche pas mon gloppy,Ne nyúlj a bizémhez,Non toccare la mia caramella,汚らしい手で触れるな,"에틴을 쳐죽인 것까지 신경 쓰다간, 걸을 수도 없을걸.",Raak mijn gloppy niet aan,Ikke rør min gloppy,Nie ruszaj moich słodyczy,Não toca no meu docinho!,,Nu-mi atinge bomboana,Не трогай мою вкусняшку,Не дирај мој слаткиш,Rör inte min glittriga,Benim cıvıklığıma dokunma. -Vorpal ?!?!?!,TXT_ACS_MAP51_19_VORPA,,,,Šaršoun?!?!?!,,Tödlich ?!?!?!,,Vorpal ?!?!?!,¡¿¡¿¡¿ Vorpal ?!?!?!,,Tappava ?!?!?!,,,,ボーパル ?!?!?!,드래곤 슬레이어 인가?!,,,Śmiercionośny ?!?!?!,Vorpal?!?!?!,,Vorpal?!?!?!,Остренько???!!!,Вајтолни мач ?!?!?!,,Vorpal?!?!?! -"Gimme some sugar, baby",TXT_ACS_MAP51_20_GIMME,,,,"Dej mi trochu cukru, zlato.","Giv mig noget sukker, baby","Gib mir etwas Zucker, Baby",,"Donu al mi iom da sukeron, knanjo.","Dame un poco de azúcar, baby","Dame algo de azúcar, bebe","Anna vähän sokeria, beibi",,"Tégy magadévá, kislány!",,砂糖が欲しいかい、ベイビー,등짝을 보자!...,"Geef me wat suiker, schatje.","Gi meg litt sukker, baby",Daj mi całusa skarbie,"Me dá um pouco de açúcar, baby",,"Dă-mi niște zahăr, dulceață","Подай-ка мне сахар, детка","Дај ми мало шећера, душо","Ge mig lite socker, baby","Bana biraz şeker ver, bebeğim." -Duh-uhhh...,TXT_ACS_MAP51_21_DUHUH,,,,A jéje.,,,,Da-aaaa...,,,Daa-aaa....,,Nyílván...,,えぇーとぉー...,낙원이란 있을 수 없는거야.,,,Oooooo...,Dãããã-ããã...,,,Ага-а-а-а...,Дух-уххх...,,Duh-uhhh... -Film in an hour?,TXT_ACS_MAP51_22_FILMI,,,,Film za hodinu?,Film om en time?,Film in einer Stunde?,,Kino post horo?,¿Película en una hora?,¿Una película en una hora?,Filmi tunnissa?,Un film dans une heure?,Egy film egy óra múlva?,Un film in un'ora?,数時間のフィルム?,신은 운명을 주셨죠. 만남이라는 운명을.,Film in een uur?,Film på en time?,Za godzinę film?,Quer ver um filme daqui a pouco?,,Film într-o oră?,Фильм за час?,Снимамо за сат времена?,Filma om en timme?,Bir saat içinde film mi? -I don't even get my own tombstone - cf,TXT_ACS_MAP51_23_IDONT,,,,Ani nemám svůj vlastní náhrobek. -CF,Jeg får ikke engang min egen gravsten - cf,Ich bekomme noch nicht einmal meinen eigenen Grabstein - cf,,Mi ne eĉ ekhavis mian propran tombŝtonon. - cf,Ni siquiera tengo mi propia lápida - cf,,En saa edes omaa hautakiveäni - cf,J'ai même pas le droit à ma propre tombe - cf,Még saját sírt sem kaptam - cf,Non ho potuto avere la mia pietra tombale - cf,私は自分の墓標すら得られない - cf,내 묘비를 세우지도 않았네 -cf,Ik krijg niet eens mijn eigen grafsteen - cf,Jeg får ikke engang min egen gravstein - cf...,Nawet nie dostałem swojego nagrobka - cf,Eu nem ganhei a minha própria lápide - cf,,Nici măcar nu primesc propria piatră de mormânt - cf,У меня даже нет своего надгробия (К. Ф.),Ја ни немам свој надгробни споменик - cf,Jag får inte ens min egen gravsten - cf,Kendi mezar taşımı bile alamıyorum - cf -Let no blood be spilt,TXT_ACS_MAP51_24_LETNO,,,,Nechť není prolita žádná krev.,Lad intet blod blive spildt,Lass kein Blut vergossen sein,,Lasu neniom da sango elflui.,Que no se derrame sangre,,Älköön yhtään verta vuodatettako,Qu'aucune goutte de sang ne soit tirée,Ne ontsunk ki vért,Si cerchi di non spargere sangue,血を零さないように,피 한 방울도 흘리지 말라,Laat geen bloed worden vergoten,La ikke noe blod bli spilt,Nie pozwól by krew została przelana,Que sangue nenhum seja derramado,,Fie ca sângele să nu fie vărsat,Да не прольётся кровь,Нека се не пролије крв,Låt inget blod spillas,Kan dökülmesin -Let no hand be raised in anger,TXT_ACS_MAP51_25_LETNO,,,,Nechť není žádná ruka hněvem zvednuta.,Lad ingen hånd blive løftet i vrede,Lass keine Hand in Wut erhoben sein,,Lasu nenion manon estas levita pro kolero.,Que ninguna mano se levante con ira,,Ei yhtäkään kättä kohotettako vihassa,Qu'aucune main de se lève avec colère,Ne emeljünk kezet haragból,Si cerchi di non alzare le mani per rabbia,怒りで拳を振るわないように,분노하여 주먹을 휘두르지 말라,Laat geen hand worden opgestoken in woede...,La ingen hånd bli løftet i sinne,Nie pozwól by ręka została uniesiona w gniewie,Que mão nenhuma seja erguida por raiva,,Fie ca nicio mână să nu fie ridicată în furie,И да не поднимется рука во гневе,Нека се ни рука из беса не подигне,Låt ingen hand höjas i ilska,Öfkeyle el kaldırmayın -Who dares disturb our slumber?,TXT_ACS_MAP52_9_WHODA,,,,Kdo se opovažuje narušit náš spánek?,Hvem vover at forstyrre vores slummer?,Wer wagt es unseren Schlummer zu stören?,,Kiu aŭdacas interrompi nian dormon? ,¿Quién se atreve a perturbar nuestro sueño?,,Kuka kehtaa häiritä untamme?,Qui ose troubler notre sommeil?,Ki meri megzavarni a szunyókálásunkat?,Chi osa disturbare il nostro riposo?,誰が、我々の眠りを妨げる勇気があるかな?,감히 우리의 숙면을 방해하는가?,Wie durft onze slaap te verstoren?,Hvem våger å forstyrre vår søvn?,Kto śmie przeszkadzać nam w drzemce?,Quem ousa perturbar o nosso descanso?,,Cine cutează să-mi perturbe odihna?,Кто осмелился потревожить наш покой?,Ко се усуђује узнемиравати наш спокој?,Vem vågar störa vår slummer?,Uykumuzu bölmeye kim cüret eder? -The way is open,TXT_ACS_MAP52_10_THEWA,,,,Cesta je otevřena.,Vejen er åben,Der Weg ist offen,,La vojo estas malfermita.,El camino está abierto,,Tie on auki,Le chemin est ouvert.,Az út kinyílt,La via è aperta,道は開いた,길이 열렸다,De weg is open,Veien er åpen,Droga jest otwarta,O caminho está aberto,,Calea e deschisă,Путь открыт,Пролаз је отворен,Vägen är öppen,Yol açık -You have ,TXT_ACS_MAP53_2_YOUHA,,,,Zbývají ti ,Du har,Du hast,,Vi havas,Tienes,,Sinulla on,Vous avez,Már csak,Hai,スイッチはまだ,지금 ,Je hebt,Du har,Masz,Restam ainda,,Mai ai,Осталось,Остало је ,Du har, -\x20switches left,TXT_ACS_MAP53_3_SWITC,,,,\x20spínače.,\x20kontakter tilbage,\x20Schalter übrig,,\x20ŝaltilojn ceterajn.,\x20interruptores restantes,\x20switches restantes,\x20vipua jäljellä,\x20boutons à trouver,\x20kallantyú van hátra,\x20interuttori rimanenti,残っている,개의 개폐기들이 남았다,\x20schakelaars over,\x20brytere igjen,\x20pozostałych przełączników,\x20interruptores,,\x20butoane rămase,\x20переключателей,\x20прекидача,\x20växlar kvar,\x20anahtarınız kaldı -You have only ,TXT_ACS_MAP53_4_YOUHA,,,,Zbývá ti jen ,Du har kun,Du hast nur,,Vi nur havas,Tienes solo,,Sinulla on vain,Vous avez seulement,Már csak,Hai solamente,スイッチは,이제 오로지 ,Je hebt alleen,Du har bare,Masz tylko,Resta somente,,Mai ai doar,Остался всего,Остао је само ,Du har bara, -\x20switch left,TXT_ACS_MAP53_5_SWITC,,,,\x20spínač.,\x20kontakter tilbage,\x20Schalter übrig,,\x20ŝaltilon ceteran.,\x20interruptor restante,\x20switch restante,\x20vipu jäljellä,\x20outon à trouver,\x20kallantyú van hátra,\x20interruttore rimanente,"だけ残っている +Do you feel lucky?,TXT_ACS_MAP51_14_DOYOU,,,,"Zdá se ti, že máš štěstí?",Føler du dig heldig?,Denkst du das heute dein Glückstag ist?,,Ĉu vi sentas vin bonŝanca?,¿Te sientes afortunado?,,Tunnetko olosi onnekkaaksi?,Vous pensez être chanceux?,,Szerencsésnek érzed magad?,Ti senti fortunato?,運が良かったと思うか?,그대는 운수가 좋은가?,Heb je geluk?,Føler du deg heldig?,Masz szczęście?,Está se sentindo com sorte?,,Te simți norocos?,Чувствуешь ли ты себя везучим?,Да ли се осећаш срећним?,Känner du dig lycklig?,Kendinizi şanslı mı hissediyorsunuz? +You guessed wrong!,TXT_ACS_MAP51_15_YOUGU,,,,To máš smůlu!,Du gættede forkert!,Du hast falsch geraten!,,Vi divenis malĝuste!,¡Adivinaste incorrectamente!,,Arvasi väärin!,Et bien non!,,Hát rosszul érzed!,Non hai indovinato!,それは違うな!,잘못된 판단이다!,Je hebt het verkeerd geraden!,Du gjettet feil!,Źle zgadłeś!,Adivinhou errado!,,N-ai ghicit!,Неправильное предположение!,Погрешно си погодио!,Du gissade fel!,Yanlış tahmin ettin! +Good guess,TXT_ACS_MAP51_16_GOODG,,,,Dobré zdání.,Godt gættet.,Gut geraten,,Bona diveno.,Buena elección,,Hyvä arvaus,Vous avez deviné!,,Jól sejtetted,Hai indovinato,良い推測だ,옳은 판단이다,Goede gok,Godt gjettet,Dobrze zgadłeś,Certa resposta,,Ai ghicit,Правильное предположение,Добар погодак,Bra gissning,İyi tahmin +Can you do all the scripting for my level?,TXT_ACS_MAP51_17_CANYO,,,,Můžeš všechno skriptování udělat za mě?,Kan du lave alt scripting til mit niveau?,Kannst du die Skripte für all meine Level schreiben?,,Ĉu vi povas fari ĉiom da la skriptoj por mia nivelo?,¿Podrías hacer todo el script para mi nivel?,,Voitko tehdä kaikki tasoni skriptaukset?,Vous pouvez faire tout le script de mon niveau?,,Meg tudnád csinálni az egészt scriptelést a pályámhoz?,Puoi fare tutto lo scripting per il mio livello?,この階層を全て書き換える事は可能かな?,어쩔 수 없이 살아간다. 태어났기 때문에...,Kun je al het scripten doen voor mijn niveau?,Kan du gjøre alt skriptet for mitt nivå?,Czy możesz zrobić cały skrypt do mojego poziomu?,Poderia fazer todo o scripting da minha fase?,,Te poți ocupa de scripting pentru nivelul meu?,"Может, напишешь за меня все скрипты для моего уровня?",Можеш ли да напишеш све скриптове за мој ниво?,Kan du göra alla skript för min nivå?,Benim seviyem için tüm senaryoyu yazabilir misin? +Don't touch my gloppy,TXT_ACS_MAP51_18_DONTT,,,,Nesahej mi na slimáka!,Rør ikke ved min gloppy,Berühr mein Ding nicht!,,Ne tuŝas mian gloppy-on.,No toques mi gloppy,,Älä koske mönjääni,Ne touche pas mon gloppy,,Ne nyúlj a bizémhez,Non toccare la mia caramella,汚らしい手で触れるな,"에틴을 쳐죽인 것까지 신경 쓰다간, 걸을 수도 없을걸.",Raak mijn gloppy niet aan,Ikke rør min gloppy,Nie ruszaj moich słodyczy,Não toca no meu docinho!,,Nu-mi atinge bomboana,Не трогай мою вкусняшку,Не дирај мој слаткиш,Rör inte min glittriga,Benim cıvıklığıma dokunma. +Vorpal ?!?!?!,TXT_ACS_MAP51_19_VORPA,,,,Šaršoun?!?!?!,,Tödlich ?!?!?!,,Vorpal ?!?!?!,¡¿¡¿¡¿ Vorpal ?!?!?!,,Tappava ?!?!?!,,,,,ボーパル ?!?!?!,드래곤 슬레이어 인가?!,,,Śmiercionośny ?!?!?!,Vorpal?!?!?!,,Vorpal?!?!?!,Остренько???!!!,Вајтолни мач ?!?!?!,,Vorpal?!?!?! +"Gimme some sugar, baby",TXT_ACS_MAP51_20_GIMME,,,,"Dej mi trochu cukru, zlato.","Giv mig noget sukker, baby","Gib mir etwas Zucker, Baby",,"Donu al mi iom da sukeron, knanjo.","Dame un poco de azúcar, baby","Dame algo de azúcar, bebe","Anna vähän sokeria, beibi",,,"Tégy magadévá, kislány!",,砂糖が欲しいかい、ベイビー,등짝을 보자!...,"Geef me wat suiker, schatje.","Gi meg litt sukker, baby",Daj mi całusa skarbie,"Me dá um pouco de açúcar, baby",,"Dă-mi niște zahăr, dulceață","Подай-ка мне сахар, детка","Дај ми мало шећера, душо","Ge mig lite socker, baby","Bana biraz şeker ver, bebeğim." +Duh-uhhh...,TXT_ACS_MAP51_21_DUHUH,,,,A jéje.,,,,Da-aaaa...,,,Daa-aaa....,,,Nyílván...,,えぇーとぉー...,낙원이란 있을 수 없는거야.,,,Oooooo...,Dãããã-ããã...,,,Ага-а-а-а...,Дух-уххх...,,Duh-uhhh... +Film in an hour?,TXT_ACS_MAP51_22_FILMI,,,,Film za hodinu?,Film om en time?,Film in einer Stunde?,,Kino post horo?,¿Película en una hora?,¿Una película en una hora?,Filmi tunnissa?,Un film dans une heure?,,Egy film egy óra múlva?,Un film in un'ora?,数時間のフィルム?,신은 운명을 주셨죠. 만남이라는 운명을.,Film in een uur?,Film på en time?,Za godzinę film?,Quer ver um filme daqui a pouco?,,Film într-o oră?,Фильм за час?,Снимамо за сат времена?,Filma om en timme?,Bir saat içinde film mi? +I don't even get my own tombstone - cf,TXT_ACS_MAP51_23_IDONT,,,,Ani nemám svůj vlastní náhrobek. -CF,Jeg får ikke engang min egen gravsten - cf,Ich bekomme noch nicht einmal meinen eigenen Grabstein - cf,,Mi ne eĉ ekhavis mian propran tombŝtonon. - cf,Ni siquiera tengo mi propia lápida - cf,,En saa edes omaa hautakiveäni - cf,J'ai même pas le droit à ma propre tombe - cf,,Még saját sírt sem kaptam - cf,Non ho potuto avere la mia pietra tombale - cf,私は自分の墓標すら得られない - cf,내 묘비를 세우지도 않았네 -cf,Ik krijg niet eens mijn eigen grafsteen - cf,Jeg får ikke engang min egen gravstein - cf...,Nawet nie dostałem swojego nagrobka - cf,Eu nem ganhei a minha própria lápide - cf,,Nici măcar nu primesc propria piatră de mormânt - cf,У меня даже нет своего надгробия (К. Ф.),Ја ни немам свој надгробни споменик - cf,Jag får inte ens min egen gravsten - cf,Kendi mezar taşımı bile alamıyorum - cf +Let no blood be spilt,TXT_ACS_MAP51_24_LETNO,,,,Nechť není prolita žádná krev.,Lad intet blod blive spildt,Lass kein Blut vergossen sein,,Lasu neniom da sango elflui.,Que no se derrame sangre,,Älköön yhtään verta vuodatettako,Qu'aucune goutte de sang ne soit tirée,,Ne ontsunk ki vért,Si cerchi di non spargere sangue,血を零さないように,피 한 방울도 흘리지 말라,Laat geen bloed worden vergoten,La ikke noe blod bli spilt,Nie pozwól by krew została przelana,Que sangue nenhum seja derramado,,Fie ca sângele să nu fie vărsat,Да не прольётся кровь,Нека се не пролије крв,Låt inget blod spillas,Kan dökülmesin +Let no hand be raised in anger,TXT_ACS_MAP51_25_LETNO,,,,Nechť není žádná ruka hněvem zvednuta.,Lad ingen hånd blive løftet i vrede,Lass keine Hand in Wut erhoben sein,,Lasu nenion manon estas levita pro kolero.,Que ninguna mano se levante con ira,,Ei yhtäkään kättä kohotettako vihassa,Qu'aucune main de se lève avec colère,,Ne emeljünk kezet haragból,Si cerchi di non alzare le mani per rabbia,怒りで拳を振るわないように,분노하여 주먹을 휘두르지 말라,Laat geen hand worden opgestoken in woede...,La ingen hånd bli løftet i sinne,Nie pozwól by ręka została uniesiona w gniewie,Que mão nenhuma seja erguida por raiva,,Fie ca nicio mână să nu fie ridicată în furie,И да не поднимется рука во гневе,Нека се ни рука из беса не подигне,Låt ingen hand höjas i ilska,Öfkeyle el kaldırmayın +Who dares disturb our slumber?,TXT_ACS_MAP52_9_WHODA,,,,Kdo se opovažuje narušit náš spánek?,Hvem vover at forstyrre vores slummer?,Wer wagt es unseren Schlummer zu stören?,,Kiu aŭdacas interrompi nian dormon? ,¿Quién se atreve a perturbar nuestro sueño?,,Kuka kehtaa häiritä untamme?,Qui ose troubler notre sommeil?,,Ki meri megzavarni a szunyókálásunkat?,Chi osa disturbare il nostro riposo?,誰が、我々の眠りを妨げる勇気があるかな?,감히 우리의 숙면을 방해하는가?,Wie durft onze slaap te verstoren?,Hvem våger å forstyrre vår søvn?,Kto śmie przeszkadzać nam w drzemce?,Quem ousa perturbar o nosso descanso?,,Cine cutează să-mi perturbe odihna?,Кто осмелился потревожить наш покой?,Ко се усуђује узнемиравати наш спокој?,Vem vågar störa vår slummer?,Uykumuzu bölmeye kim cüret eder? +The way is open,TXT_ACS_MAP52_10_THEWA,,,,Cesta je otevřena.,Vejen er åben,Der Weg ist offen,,La vojo estas malfermita.,El camino está abierto,,Tie on auki,Le chemin est ouvert.,,Az út kinyílt,La via è aperta,道は開いた,길이 열렸다,De weg is open,Veien er åpen,Droga jest otwarta,O caminho está aberto,,Calea e deschisă,Путь открыт,Пролаз је отворен,Vägen är öppen,Yol açık +You have ,TXT_ACS_MAP53_2_YOUHA,,,,Zbývají ti ,Du har,Du hast,,Vi havas,Tienes,,Sinulla on,Vous avez,,Már csak,Hai,スイッチはまだ,지금 ,Je hebt,Du har,Masz,Restam ainda,,Mai ai,Осталось,Остало је ,Du har, +\x20switches left,TXT_ACS_MAP53_3_SWITC,,,,\x20spínače.,\x20kontakter tilbage,\x20Schalter übrig,,\x20ŝaltilojn ceterajn.,\x20interruptores restantes,\x20switches restantes,\x20vipua jäljellä,\x20boutons à trouver,,\x20kallantyú van hátra,\x20interuttori rimanenti,残っている,개의 개폐기들이 남았다,\x20schakelaars over,\x20brytere igjen,\x20pozostałych przełączników,\x20interruptores,,\x20butoane rămase,\x20переключателей,\x20прекидача,\x20växlar kvar,\x20anahtarınız kaldı +You have only ,TXT_ACS_MAP53_4_YOUHA,,,,Zbývá ti jen ,Du har kun,Du hast nur,,Vi nur havas,Tienes solo,,Sinulla on vain,Vous avez seulement,,Már csak,Hai solamente,スイッチは,이제 오로지 ,Je hebt alleen,Du har bare,Masz tylko,Resta somente,,Mai ai doar,Остался всего,Остао је само ,Du har bara, +\x20switch left,TXT_ACS_MAP53_5_SWITC,,,,\x20spínač.,\x20kontakter tilbage,\x20Schalter übrig,,\x20ŝaltilon ceteran.,\x20interruptor restante,\x20switch restante,\x20vipu jäljellä,\x20outon à trouver,,\x20kallantyú van hátra,\x20interruttore rimanente,"だけ残っている ",개의 개폐기가 남았다,\x20schakelaar over,\x20bryter igjen,\x20przełącznik,\x20interruptor,,\x20buton rămas,\x20переключатель,\x20прекидач,\x20växel kvar,\x20anahtarınız kaldı -The exit is open,TXT_ACS_MAP53_6_THEEX,,,,Východ je otevřen.,Udgangen er åben,Der Ausgang ist offen,,La elirejo estas malfermita,La salida está abierta,,Ulospääsy on auki,La sortie est ouverte,A kijárat kinyílt,L'uscita è aperta,出口が開いた,출구가 열렸다,De uitgang is open,Utgangen er åpen,Wyjście jest otwarte,A saída está aberta,,Ieșirea e deschisă,Выход открыт,Излаз је отворен,Utgången är öppen,Çıkış açık -The doors won't open from this side,TXT_ACS_MAP54_1_THEDO,,,,Dveře se z této strany neotevřou.,Dørene kan ikke åbnes fra denne side,Die Türen werden sich nicht von dieser Seite öffnen,,La pordo ne malfermos de ĉi tio flanko.,Las puertas no se abren desde este lado,,Ovet eivät aukea tältä puolelta,Les portes ne s'ouvrent pas de ce côté,Az ajtó nem nyílik erről az oldalról,Le porte non si aprono da questo lato,扉はこちらから開けない,이 문들은 이 방향으로는 열리지 않는다,De deuren gaan niet open van deze kant....,Dørene kan ikke åpnes fra denne siden,Drzwi nie otworzą się z tej strony,As portas não se abrirão deste lado,,Ușile nu se vor deschide de pe partea asta,С этой стороны дверь не открыть,Врата неће да се отворе са стране,Dörrarna öppnas inte från den här sidan,Kapılar bu taraftan açılmıyor. -The doors are open...,TXT_ACS_MAP54_4_THEDO,,,,Dveře jsou otevřené...,Dørene er åbne...,Die Türen sind offen,,La pordoj estas malfermitaj...,Las puertas están abiertas...,,Ovet ovat auki...,Les portes sont ouvertes...,Az ajtók kitárultak...,Le porte sono aperte...,ドアは開いている...,문이 열렸다...,De deuren zijn open....,Dørene er åpne...,Drzwi są otwarte...,As portas estão abertas...,,Ușile sunt deschise...,Двери открыты...,Врата су отворена...,Dörrarna är öppna...,Kapılar açık. -...if you are ready,TXT_ACS_MAP54_5_IFYOU,,,,...jestli jsi připraven@[ao_cs].,...hvis du er klar,...Wenn du bereit bist,,...se vi pretas.,...si estás listo,,...jos olet valmis,...si vous êtes prêt.,...csak rád várunk.,...Se sei pronto,...準備が良いなら,... 준비 되었다면,...als je er klaar voor bent...,...hvis du er klar,...jeśli jesteś gotów,...se você estiver preparad@[ao_ptb],,...dacă ești pregătit,...осмелишься ли ты войти?,...ако си спреман,...om du är redo,...eğer hazırsanız -A door has opened,TXT_ACS_MAP54_9_ADOOR,,,,Dveře se otevřely,En dør er blevet åbnet,Eine Tür hat sich geöffnet,,Pordo malfermiĝis,Se ha abierto una puerta,Se abrió una puerta,Ovi on auennut,Une porte est ouverte,Egy ajtó kinyílt,Una porta è stata aperta,先へ進むドアは開いた,지금 문이 열렸다...,Een deur is geopend,En dør har åpnet seg,Drzwi otworzyły się,Uma porta se abriu,,O ușă s-a deschis,Дверь открылась,Врата су се отворила,En dörr har öppnats,Bir kapı açıldı -on the Chantry,TXT_ACS_MAP54_10_ONTHE,,,,v Modlitebně.,på Kirkerummet,In der Kantorei,,en la Kapelo.,En la capilla,,kappelissa,dans la chapelle.,a kápolnánál,Nella Cappella,小礼拝堂 へ向かえ,... 예배당에서,op de Chantry,på Minnekapellet,w Kaplicy Wotywnej,na Capela,,la Capelă,в часовне,у Капели,på Chantry,Chantry'de -A bridge has been built,TXT_ACS_MAP54_11_ABRID,,,,Most byl postaven,En bro er blevet bygget,Eine Brücke wurde errichtet,,Ponto estis konstruita,Se ha construido un puente,Se construyó un puente,Silta on rakennettu,Une pont a été construit,Egy hidat támasztottak fel,È stato costruito un ponte,先へ進む橋が架かった,다리가 건설되었다...,Er is een brug gebouwd,En bro har blitt bygget,Most został utworzony,Uma ponte foi construída,,Un pod a fost construit,Мост воздвигнут,Мост се саградио,En bro har byggts,Bir köprü inşa edildi -on the Abattoir,TXT_ACS_MAP54_12_ONTHE,,,,na Jatkách.,på Slagteriet,Im Schlachthaus,,en la Buĉejo.,En el matadero,,teurastamolla,dans l'abbatoir.,a vágóhídnál,Nella Macelleria, 屠殺場 へ向かえ,... 도살장에서,op het slachthuis,på slakteriet,w Rzeźni,no Matadouro,,pe Abator,у аббатства,на Кланици,på slakthuset,Mezbahada -A stair has been built,TXT_ACS_MAP54_13_ASTAI,,,,Schody byly postaveny,Der er bygget en trappe,Eine Treppe wurde errichtet,,Ŝtuparo estis konstruita,Se ha construido una escalera,Se construyó una escalera,Portaat on rakennettu,Un escalier a été construit,Lépcső emelkedett ki,È stata costruita una scalinata,先へ進む階段が出来た,계단이 건설되었다...,Er is een trap gebouwd,En trapp har blitt bygget,Schody zostały utworzone,Uma escada foi construída,,O scară a fost construită,Лестница воздвигнута,Степенице су се саградиле,En trappa har byggts,Bir merdiven inşa edildi -on the Dark Watch,TXT_ACS_MAP54_14_ONTHE,,,,na Temné hlídce.,på den mørke vagt,auf der Dunklen Wache,,en la Gardisto Ombra.,En la guardia oscura,,pimeällä vartiolla,dans la Garde Noire.,a Sötét Őrségnél,Nella Guardia Oscura, 闇の刻計 へ向かえ,... 어둠의 감시초소에서,op de donkere wacht,på den mørke vakten,w Ciemnej Strażnicy,na Guarda Negra,,pe Gardianul Întunecat,у тёмной стражи,на Црној стражи,på den mörka vakten,Karanlık Nöbet'te -One gear has been placed,TXT_ACS_MAP54_15_ONEGE,,,,Jedno kolo bylo umístěno.,Der er blevet placeret et redskab,Ein Zahnrad wurde eingesetzt,,Dentrado estis metita.,Un engranaje en su lugar,,Ratas on asetettu,Un engrenage a été placé,Egy fogaskerék a helyére került,Un ingranaggio è stato piazzato,歯車を一つ配置した,톱니바퀴 1개가 배치되었다,Een tandwiel is geplaatst,Ett tannhjul har blitt plassert,Jedna zębatka została umieszczona,Uma engrenagem foi colocada,,Un mecanism a fost introdus,Шестерня установлена,Један зупчаник је постављен,En kugghjul har placerats,Bir dişli yerleştirildi -\x20gears have been placed,TXT_ACS_MAP54_16_GEARS,,,,\x20kola byla umístěna.,\x20gear er blevet placeret,\x20Zahnräder wurden eingesetzt,,\x20dentradoj estis metitaj.,\x20engranajes en su lugar,,\x20ratasta on asetettu,\x20engrenages ont été placés,\x20fogaskerék a helyére került,\x20ingranaggi sono stati piazzati,歯車を配置した,톱니바퀴들이 배치되었다,\x20tandwielen zijn geplaatst,\x20 tannhjul har blitt plassert,\x20zębatki zostały umieszczone,\x20engrenagens foram colocadas,,\x20mecanisme au fost introduse,\x20шестерней установлено,\x20зупчаника су постављена,\x20 kugghjul har placerats,\x20dişliler yerleştirildi -A barricade has opened,TXT_ACS_MAP54_17_ABARR,,,,V Kloace se otevřela barikáda.,En barrikade er blevet åbnet,Eine Barrikade wurde geöffnet,,Barikado malfermiĝis,La barricada se ha abierto,Se abrió la barricada,Tiesulku on auennut,Une barricade s'est ouverte,Egy barikád megszűnt,Una barricata è stata aperta,バリケードは開かれた,방벽이 열렸다...,Er is een barricade geopend,En barrikade har åpnet seg,Barykada została otwarta,Uma barricada se abriu,,O baricadă s-a deschis,Преграда опустилась,Барикада је отворена,En barrikad har öppnats,Bir barikat açıldı -On the Cloaca,TXT_ACS_MAP54_18_ONTHE,,,,V Kloace se otevřela barikáda.,På Cloaca,In der Kloake,,En la Kloako.,En la Cloaca,,kloaakilla,dans le cloaque,a Kloákánál,Nella Cloaca,排泄腔 へ向かえ,... 하수구에서,Op de Cloaca,på Cloaca,W Kloace,Na Cloaca,,pe Cloaca,в клоаке,у клоаци,På Cloaca,Kloaka Üzerine -The way back is open,TXT_ACS_MAP54_20_THEWA,,,,Cesta zpět je otevřena.,Vejen tilbage er åben,Der Weg zurück ist offen,,La vojo reen estas malfermita.,El camino está abierto,,Tie takaisin on auki,Un chemin s'est ouvert,A visszavezető út kinyílt,La via del ritorno è aperta,裏口は開いた,돌아가는 길이 열렸다,De terugweg is open,Veien tilbake er åpen,Droga powrotna jest otwarta,O caminho de volta está aberto,,Calea e deschisă,Путь назад открыт,Пролаз назад је отворен,Vägen tillbaka är öppen,Dönüş yolu açık -The door is barred from the inside,TXT_ACS_MAP55_9_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está trabada desde el otro lado,,Ovi on teljetty sisältä,La porte est bloquée de ce côté,Az ajtó bentről van bereteszelve,La porta è stata aperta da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od wewnątrz,A porta está barrada por dentro,,Ușa e încuiată din interior,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. -You dare plunder the tomb,TXT_ACS_MAP56_0_YOUDA,,,,Ty se opovažuješ rabovat,Du vover at plyndre graven,Wagst du es,,Ĉu vi aŭdacas rabi de la tombo,¿Te atreves a saquear la tumba,,Kuinka kehtaat ryöstää,Vous osez piller la tombe,A hóhér sírját,Osi saccheggiare la tomba,お前はあえて 執行人達の墓を,배짱이 두둑하구나...,Je durft de graftombe te plunderen,Våger du å plyndre graven,Śmiesz plądrować grobowiec,Como ousa saquear a tumba,,Cutezi să jefuiești mormântul,Ты посмел ограбить могилу,Усуђујеш се пљачкати,Du vågar plundra graven,Mezarı yağmalamaya cüret ediyorsun -of the executioner?,TXT_ACS_MAP56_1_OFTHE,,,,hrobku popravčího?,af bødlen?,das Grab des Henkers zu plündern?,,de la ekzekutisto?,del ejecutor?,,teloittajan haudan?,du bourreau?,próbálod fosztogatni?,dell'esecutore?,荒らすつもりか?,사형 집행자의 무덤을 도굴하다니.,van de beul?,til bøddelen?,kata?,do executor?,,călăului?,верховного палача?,желатову гробницу?,av bödeln?,Celladın mı? -Prepare to die,TXT_ACS_MAP56_2_PREPA,,,,Připrav se zemřít.,Forbered dig på at dø,Bereite dich vor zu sterben,,Pretiĝu por morti!,¡Prepárate para morir!,,Valmistaudu kuolemaan,Préparez vous à mourir!,Készülj a halálra,Preparati a morire,死ぬ準備をしろ,죽어서 회계하라.,Bereid je voor om te sterven,Forbered deg på å dø,Przygotuj się na śmierć,Prepare-se para morrer,,Pregătește-te să mori,Готовься к смерти,Припреми се да умреш,Förbered dig på att dö,Ölmeye hazırlanın -You have ,TXT_ACS_MAP59_1_YOUHA,,,,Zbývají ti ,Du har,Du musst,,Vi ankoraŭ havas,Aún tienes,,Sinulla on,Vous avez,Még kell találnod,Hai ancora altri,スイッチはまだ,당신은,Je hebt,Du har,Masz,Faltam mais,,Mai ai,Осталось,Остало је ,Du har,Bulmanız gereken\x20 -\x20more switches to find,TXT_ACS_MAP59_2_MORES,,,,\x20spínače k nalezení.,\x20flere kontakter at finde,\x20weitere Schalter finden,,\x20trovindajn ŝaltilojn.,\x20interruptores más que encontrar,,\x20lisää vipua löydettävänä,\x20boutons à trouver,\x20darab kallantyút,\x20interruttori da trovare,残っている,개의 개폐기들을 더 찾아야 한다,\x20meer schakelaars te vinden,\x20 brytere til å finne,\x20przełączników do znalezienia,\x20interruptores para encontrar,,\x20butoane de găsit,\x20переключателей,\x20прекидача да се нађе,\x20fler växlar att hitta.,\x20anahtar daha var. -You have only ,TXT_ACS_MAP59_3_YOUHA,,,,Zbývá ti jen ,Du har kun,Du musst nur,,Vi nur havas,Tienes solo,,Sinulla on vain,Vous avez seulement,Már csak,Hai solamente,スイッチは,이제 당신은 ,Je hebt alleen,Du har bare,Masz tylko,Falta somente,,Mai ai doar,Остался всего,Oстао је само ,Du har bara,Bulmanız gereken\x20 -\x20switch left,TXT_ACS_MAP59_4_SWITC,,,,\x20spínač.,\x20kontakter tilbage,\x20Schalter finden,,\x20ŝaltilon ceteran.,\x20interruptor restante,,\x20vipu jäljellä,\x20bouton a trouver,\x20darab kallantyút kell találnod,\x20interruttore rimanente,"だけ残っている +The exit is open,TXT_ACS_MAP53_6_THEEX,,,,Východ je otevřen.,Udgangen er åben,Der Ausgang ist offen,,La elirejo estas malfermita,La salida está abierta,,Ulospääsy on auki,La sortie est ouverte,,A kijárat kinyílt,L'uscita è aperta,出口が開いた,출구가 열렸다,De uitgang is open,Utgangen er åpen,Wyjście jest otwarte,A saída está aberta,,Ieșirea e deschisă,Выход открыт,Излаз је отворен,Utgången är öppen,Çıkış açık +The doors won't open from this side,TXT_ACS_MAP54_1_THEDO,,,,Dveře se z této strany neotevřou.,Dørene kan ikke åbnes fra denne side,Die Türen werden sich nicht von dieser Seite öffnen,,La pordo ne malfermos de ĉi tio flanko.,Las puertas no se abren desde este lado,,Ovet eivät aukea tältä puolelta,Les portes ne s'ouvrent pas de ce côté,,Az ajtó nem nyílik erről az oldalról,Le porte non si aprono da questo lato,扉はこちらから開けない,이 문들은 이 방향으로는 열리지 않는다,De deuren gaan niet open van deze kant....,Dørene kan ikke åpnes fra denne siden,Drzwi nie otworzą się z tej strony,As portas não se abrirão deste lado,,Ușile nu se vor deschide de pe partea asta,С этой стороны дверь не открыть,Врата неће да се отворе са стране,Dörrarna öppnas inte från den här sidan,Kapılar bu taraftan açılmıyor. +The doors are open...,TXT_ACS_MAP54_4_THEDO,,,,Dveře jsou otevřené...,Dørene er åbne...,Die Türen sind offen,,La pordoj estas malfermitaj...,Las puertas están abiertas...,,Ovet ovat auki...,Les portes sont ouvertes...,,Az ajtók kitárultak...,Le porte sono aperte...,ドアは開いている...,문이 열렸다...,De deuren zijn open....,Dørene er åpne...,Drzwi są otwarte...,As portas estão abertas...,,Ușile sunt deschise...,Двери открыты...,Врата су отворена...,Dörrarna är öppna...,Kapılar açık. +...if you are ready,TXT_ACS_MAP54_5_IFYOU,,,,...jestli jsi připraven@[ao_cs].,...hvis du er klar,...Wenn du bereit bist,,...se vi pretas.,...si estás listo,,...jos olet valmis,...si vous êtes prêt.,,...csak rád várunk.,...Se sei pronto,...準備が良いなら,... 준비 되었다면,...als je er klaar voor bent...,...hvis du er klar,...jeśli jesteś gotów,...se você estiver preparad@[ao_ptb],,...dacă ești pregătit,...осмелишься ли ты войти?,...ако си спреман,...om du är redo,...eğer hazırsanız +A door has opened,TXT_ACS_MAP54_9_ADOOR,,,,Dveře se otevřely,En dør er blevet åbnet,Eine Tür hat sich geöffnet,,Pordo malfermiĝis,Se ha abierto una puerta,Se abrió una puerta,Ovi on auennut,Une porte est ouverte,,Egy ajtó kinyílt,Una porta è stata aperta,先へ進むドアは開いた,지금 문이 열렸다...,Een deur is geopend,En dør har åpnet seg,Drzwi otworzyły się,Uma porta se abriu,,O ușă s-a deschis,Дверь открылась,Врата су се отворила,En dörr har öppnats,Bir kapı açıldı +on the Chantry,TXT_ACS_MAP54_10_ONTHE,,,,v Modlitebně.,på Kirkerummet,In der Kantorei,,en la Kapelo.,En la capilla,,kappelissa,dans la chapelle.,,a kápolnánál,Nella Cappella,小礼拝堂 へ向かえ,... 예배당에서,op de Chantry,på Minnekapellet,w Kaplicy Wotywnej,na Capela,,la Capelă,в часовне,у Капели,på Chantry,Chantry'de +A bridge has been built,TXT_ACS_MAP54_11_ABRID,,,,Most byl postaven,En bro er blevet bygget,Eine Brücke wurde errichtet,,Ponto estis konstruita,Se ha construido un puente,Se construyó un puente,Silta on rakennettu,Une pont a été construit,,Egy hidat támasztottak fel,È stato costruito un ponte,先へ進む橋が架かった,다리가 건설되었다...,Er is een brug gebouwd,En bro har blitt bygget,Most został utworzony,Uma ponte foi construída,,Un pod a fost construit,Мост воздвигнут,Мост се саградио,En bro har byggts,Bir köprü inşa edildi +on the Abattoir,TXT_ACS_MAP54_12_ONTHE,,,,na Jatkách.,på Slagteriet,Im Schlachthaus,,en la Buĉejo.,En el matadero,,teurastamolla,dans l'abbatoir.,,a vágóhídnál,Nella Macelleria, 屠殺場 へ向かえ,... 도살장에서,op het slachthuis,på slakteriet,w Rzeźni,no Matadouro,,pe Abator,у аббатства,на Кланици,på slakthuset,Mezbahada +A stair has been built,TXT_ACS_MAP54_13_ASTAI,,,,Schody byly postaveny,Der er bygget en trappe,Eine Treppe wurde errichtet,,Ŝtuparo estis konstruita,Se ha construido una escalera,Se construyó una escalera,Portaat on rakennettu,Un escalier a été construit,,Lépcső emelkedett ki,È stata costruita una scalinata,先へ進む階段が出来た,계단이 건설되었다...,Er is een trap gebouwd,En trapp har blitt bygget,Schody zostały utworzone,Uma escada foi construída,,O scară a fost construită,Лестница воздвигнута,Степенице су се саградиле,En trappa har byggts,Bir merdiven inşa edildi +on the Dark Watch,TXT_ACS_MAP54_14_ONTHE,,,,na Temné hlídce.,på den mørke vagt,auf der Dunklen Wache,,en la Gardisto Ombra.,En la guardia oscura,,pimeällä vartiolla,dans la Garde Noire.,,a Sötét Őrségnél,Nella Guardia Oscura, 闇の刻計 へ向かえ,... 어둠의 감시초소에서,op de donkere wacht,på den mørke vakten,w Ciemnej Strażnicy,na Guarda Negra,,pe Gardianul Întunecat,у тёмной стражи,на Црној стражи,på den mörka vakten,Karanlık Nöbet'te +One gear has been placed,TXT_ACS_MAP54_15_ONEGE,,,,Jedno kolo bylo umístěno.,Der er blevet placeret et redskab,Ein Zahnrad wurde eingesetzt,,Dentrado estis metita.,Un engranaje en su lugar,,Ratas on asetettu,Un engrenage a été placé,,Egy fogaskerék a helyére került,Un ingranaggio è stato piazzato,歯車を一つ配置した,톱니바퀴 1개가 배치되었다,Een tandwiel is geplaatst,Ett tannhjul har blitt plassert,Jedna zębatka została umieszczona,Uma engrenagem foi colocada,,Un mecanism a fost introdus,Шестерня установлена,Један зупчаник је постављен,En kugghjul har placerats,Bir dişli yerleştirildi +\x20gears have been placed,TXT_ACS_MAP54_16_GEARS,,,,\x20kola byla umístěna.,\x20gear er blevet placeret,\x20Zahnräder wurden eingesetzt,,\x20dentradoj estis metitaj.,\x20engranajes en su lugar,,\x20ratasta on asetettu,\x20engrenages ont été placés,,\x20fogaskerék a helyére került,\x20ingranaggi sono stati piazzati,歯車を配置した,톱니바퀴들이 배치되었다,\x20tandwielen zijn geplaatst,\x20 tannhjul har blitt plassert,\x20zębatki zostały umieszczone,\x20engrenagens foram colocadas,,\x20mecanisme au fost introduse,\x20шестерней установлено,\x20зупчаника су постављена,\x20 kugghjul har placerats,\x20dişliler yerleştirildi +A barricade has opened,TXT_ACS_MAP54_17_ABARR,,,,V Kloace se otevřela barikáda.,En barrikade er blevet åbnet,Eine Barrikade wurde geöffnet,,Barikado malfermiĝis,La barricada se ha abierto,Se abrió la barricada,Tiesulku on auennut,Une barricade s'est ouverte,,Egy barikád megszűnt,Una barricata è stata aperta,バリケードは開かれた,방벽이 열렸다...,Er is een barricade geopend,En barrikade har åpnet seg,Barykada została otwarta,Uma barricada se abriu,,O baricadă s-a deschis,Преграда опустилась,Барикада је отворена,En barrikad har öppnats,Bir barikat açıldı +On the Cloaca,TXT_ACS_MAP54_18_ONTHE,,,,V Kloace se otevřela barikáda.,På Cloaca,In der Kloake,,En la Kloako.,En la Cloaca,,kloaakilla,dans le cloaque,,a Kloákánál,Nella Cloaca,排泄腔 へ向かえ,... 하수구에서,Op de Cloaca,på Cloaca,W Kloace,Na Cloaca,,pe Cloaca,в клоаке,у клоаци,På Cloaca,Kloaka Üzerine +The way back is open,TXT_ACS_MAP54_20_THEWA,,,,Cesta zpět je otevřena.,Vejen tilbage er åben,Der Weg zurück ist offen,,La vojo reen estas malfermita.,El camino está abierto,,Tie takaisin on auki,Un chemin s'est ouvert,,A visszavezető út kinyílt,La via del ritorno è aperta,裏口は開いた,돌아가는 길이 열렸다,De terugweg is open,Veien tilbake er åpen,Droga powrotna jest otwarta,O caminho de volta está aberto,,Calea e deschisă,Путь назад открыт,Пролаз назад је отворен,Vägen tillbaka är öppen,Dönüş yolu açık +The door is barred from the inside,TXT_ACS_MAP55_9_THEDO,,,,Dveře jsou zatarasené zevnitř.,Døren er spærret indefra,Die Tür ist von innen verriegelt,,La pordo estas barita interne.,La puerta está trabada desde el otro lado,,Ovi on teljetty sisältä,La porte est bloquée de ce côté,,Az ajtó bentről van bereteszelve,La porta è stata aperta da dentro,この扉は内側から塞がれている,이 문은 안에 빗장이 걸려있다,De deur is van binnenuit geblokkeerd.,Døren er sperret fra innsiden,Drzwi są zabarykadowane od wewnątrz,A porta está barrada por dentro,,Ușa e încuiată din interior,Дверь заблокирована изнутри,Врата су забрављена изнутра,Dörren är spärrad från insidan,Kapı içeriden kilitli. +You dare plunder the tomb,TXT_ACS_MAP56_0_YOUDA,,,,Ty se opovažuješ rabovat,Du vover at plyndre graven,Wagst du es,,Ĉu vi aŭdacas rabi de la tombo,¿Te atreves a saquear la tumba,,Kuinka kehtaat ryöstää,Vous osez piller la tombe,,A hóhér sírját,Osi saccheggiare la tomba,お前はあえて 執行人達の墓を,배짱이 두둑하구나...,Je durft de graftombe te plunderen,Våger du å plyndre graven,Śmiesz plądrować grobowiec,Como ousa saquear a tumba,,Cutezi să jefuiești mormântul,Ты посмел ограбить могилу,Усуђујеш се пљачкати,Du vågar plundra graven,Mezarı yağmalamaya cüret ediyorsun +of the executioner?,TXT_ACS_MAP56_1_OFTHE,,,,hrobku popravčího?,af bødlen?,das Grab des Henkers zu plündern?,,de la ekzekutisto?,del ejecutor?,,teloittajan haudan?,du bourreau?,,próbálod fosztogatni?,dell'esecutore?,荒らすつもりか?,사형 집행자의 무덤을 도굴하다니.,van de beul?,til bøddelen?,kata?,do executor?,,călăului?,верховного палача?,желатову гробницу?,av bödeln?,Celladın mı? +Prepare to die,TXT_ACS_MAP56_2_PREPA,,,,Připrav se zemřít.,Forbered dig på at dø,Bereite dich vor zu sterben,,Pretiĝu por morti!,¡Prepárate para morir!,,Valmistaudu kuolemaan,Préparez vous à mourir!,,Készülj a halálra,Preparati a morire,死ぬ準備をしろ,죽어서 회계하라.,Bereid je voor om te sterven,Forbered deg på å dø,Przygotuj się na śmierć,Prepare-se para morrer,,Pregătește-te să mori,Готовься к смерти,Припреми се да умреш,Förbered dig på att dö,Ölmeye hazırlanın +You have ,TXT_ACS_MAP59_1_YOUHA,,,,Zbývají ti ,Du har,Du musst,,Vi ankoraŭ havas,Aún tienes,,Sinulla on,Vous avez,,Még kell találnod,Hai ancora altri,スイッチはまだ,당신은,Je hebt,Du har,Masz,Faltam mais,,Mai ai,Осталось,Остало је ,Du har,Bulmanız gereken\x20 +\x20more switches to find,TXT_ACS_MAP59_2_MORES,,,,\x20spínače k nalezení.,\x20flere kontakter at finde,\x20weitere Schalter finden,,\x20trovindajn ŝaltilojn.,\x20interruptores más que encontrar,,\x20lisää vipua löydettävänä,\x20boutons à trouver,,\x20darab kallantyút,\x20interruttori da trovare,残っている,개의 개폐기들을 더 찾아야 한다,\x20meer schakelaars te vinden,\x20 brytere til å finne,\x20przełączników do znalezienia,\x20interruptores para encontrar,,\x20butoane de găsit,\x20переключателей,\x20прекидача да се нађе,\x20fler växlar att hitta.,\x20anahtar daha var. +You have only ,TXT_ACS_MAP59_3_YOUHA,,,,Zbývá ti jen ,Du har kun,Du musst nur,,Vi nur havas,Tienes solo,,Sinulla on vain,Vous avez seulement,,Már csak,Hai solamente,スイッチは,이제 당신은 ,Je hebt alleen,Du har bare,Masz tylko,Falta somente,,Mai ai doar,Остался всего,Oстао је само ,Du har bara,Bulmanız gereken\x20 +\x20switch left,TXT_ACS_MAP59_4_SWITC,,,,\x20spínač.,\x20kontakter tilbage,\x20Schalter finden,,\x20ŝaltilon ceteran.,\x20interruptor restante,,\x20vipu jäljellä,\x20bouton a trouver,,\x20darab kallantyút kell találnod,\x20interruttore rimanente,"だけ残っている ",개의 개폐기만 찾으면 된다,\x20schakelaar over,1 bryter igjen,\x20przełącznik,\x20interruptor,,\x20buton rămas,\x20переключатель,\x20прекидач,1 växel kvar,\x20anahtar daha var. -The way to the tower is open,TXT_ACS_MAP59_5_THEWA,,,,Cesta do věže je otevřena.,Vejen til tårnet er åben,Der Weg zum Turm ist offen,,La vojo al la turo estas malfermita.,El camino a la torre está abierto,,Tie tornin luo on auki,Le chemin vers la tour est ouvert.,A toronyba vezető út kinyílt,La via alla torre è stata aperta,塔への道 が開いた,탑으로 가는 길이 열렸다,De weg naar de toren is open,Veien til tårnet er åpen,Droga do wieży jest otwarta,O caminho para a torre está aberto,,Calea către turn e deschisă,Путь к башне открыт,Пут до куле је отворен,Vägen till tornet är öppen.,Kuleye giden yol açık. -The way is open,TXT_ACS_MAP60_3_THEWA,,,,Cesta je otevřena.,Vejen er åben,Der Weg ist offen,,La vojo estas malfermita.,El camino está abierto,,Tie on auki,Le chemin est ouvert.,Az út kinyílt,La via è aperta,道は開いた,길이 열렸다,De weg is open,Veien er åpen,Droga jest otwarta,O caminho está aberto,,Calea e deschisă,Портал открыт,Портал је отворен,Vägen är öppen.,Yol açık -,,Strife dialogue,,,,,,,,,,,,,,,,,,,,,,,,, -"I don't want any trouble, stay away from me. I've had enough trouble with what that bastard Harris did to me. He promised me money, instead I get to look forward to being Questioned by the Programmer.",TXT_DLG_SCRIPT01_D0_IDONT,MAP01: Beldin.,,,"Nechci žádný trable, jdi ode mě. Už tak mám dost potíží s tím, co mi ten hajzl Harris provedl. Slíbil mi peníze a místo toho se můžu těšit na výslech od Programátora.","Jeg vil ikke have ballade, hold dig væk fra mig. Jeg har haft nok problemer med det, den skiderik Harris gjorde mod mig. Han lovede mig penge, men i stedet skal jeg se frem til at blive udspurgt af programmøren.","Ich möchte keinen Ärger, bleib weg von mir. Ich hatte genug Ärger mit dem was der Bastard Harris mir angetan hat. Er hat mir Geld versprochen, stattdessen musste ich mich darauf vorbereiten von dem Programmierer ausgefragt zu werden.",,"Malproksimiĝu de mi; mi ne volas pliajn problemojn. Mi jam havis sufiĉajn pro tio, kion Harriso faris: li promesis monon al mi, kaj anstataŭ tio mi nun atendas, ke La Progamisto pridemandu min.","No te me acerques, que ya no quiero más problemas. He tenido suficientes con lo que me hizo Harris: me prometió dinero, y en lugar de eso, ahora me toca esperar a ser interrogado por El Programador.",,"En kaipaa ikävyyksiä; pysy pois luotani. Olen saanut kärsiä jo riittävästi vaivaa Harris-paskiaisen tekosista. Hän lupasi minulle rahaa, mutta sen sijaan pääsenkin Ohjelmoitsijan kuulusteltavaksi.","Je ne veux pas d'embrouilles. Laissez moi tranquille. J'ai déjà assez de problèmes avec ce que ce salaud d'Harris ma fait. Il m'a promis de l'argent, maintenant, je risque de me faire interroger par le Programmeur.","Én nem akarok semmi problémát, maradj távol tőlem. Elég baj nekem az amit az a barom Harris okozott. Pénzt ígért, ehelyett az vár rám, hogy a Programozó ki fog kérdezni.","Non voglio problemi, stai alla larga. Ho già avuto abbastanza problemi con quello che quel bastardo di mi ha fatto. Mi aveva promesso soldi, invece mi ritrovo ad avere l'opportunità di essere interrogato dal Programmatore.","もう面倒事には御免だ、私に近づくな。 +The way to the tower is open,TXT_ACS_MAP59_5_THEWA,,,,Cesta do věže je otevřena.,Vejen til tårnet er åben,Der Weg zum Turm ist offen,,La vojo al la turo estas malfermita.,El camino a la torre está abierto,,Tie tornin luo on auki,Le chemin vers la tour est ouvert.,,A toronyba vezető út kinyílt,La via alla torre è stata aperta,塔への道 が開いた,탑으로 가는 길이 열렸다,De weg naar de toren is open,Veien til tårnet er åpen,Droga do wieży jest otwarta,O caminho para a torre está aberto,,Calea către turn e deschisă,Путь к башне открыт,Пут до куле је отворен,Vägen till tornet är öppen.,Kuleye giden yol açık. +The way is open,TXT_ACS_MAP60_3_THEWA,,,,Cesta je otevřena.,Vejen er åben,Der Weg ist offen,,La vojo estas malfermita.,El camino está abierto,,Tie on auki,Le chemin est ouvert.,,Az út kinyílt,La via è aperta,道は開いた,길이 열렸다,De weg is open,Veien er åpen,Droga jest otwarta,O caminho está aberto,,Calea e deschisă,Портал открыт,Портал је отворен,Vägen är öppen.,Yol açık +,,Strife dialogue,,,,,,,,,,,,,,,,,,,,,,,,,, +"I don't want any trouble, stay away from me. I've had enough trouble with what that bastard Harris did to me. He promised me money, instead I get to look forward to being Questioned by the Programmer.",TXT_DLG_SCRIPT01_D0_IDONT,MAP01: Beldin.,,,"Nechci žádný trable, jdi ode mě. Už tak mám dost potíží s tím, co mi ten hajzl Harris provedl. Slíbil mi peníze a místo toho se můžu těšit na výslech od Programátora.","Jeg vil ikke have ballade, hold dig væk fra mig. Jeg har haft nok problemer med det, den skiderik Harris gjorde mod mig. Han lovede mig penge, men i stedet skal jeg se frem til at blive udspurgt af programmøren.","Ich möchte keinen Ärger, bleib weg von mir. Ich hatte genug Ärger mit dem was der Bastard Harris mir angetan hat. Er hat mir Geld versprochen, stattdessen musste ich mich darauf vorbereiten von dem Programmierer ausgefragt zu werden.",,"Malproksimiĝu de mi; mi ne volas pliajn problemojn. Mi jam havis sufiĉajn pro tio, kion Harriso faris: li promesis monon al mi, kaj anstataŭ tio mi nun atendas, ke La Progamisto pridemandu min.","No te me acerques, que ya no quiero más problemas. He tenido suficientes con lo que me hizo Harris: me prometió dinero, y en lugar de eso, ahora me toca esperar a ser interrogado por El Programador.",,"En kaipaa ikävyyksiä; pysy pois luotani. Olen saanut kärsiä jo riittävästi vaivaa Harris-paskiaisen tekosista. Hän lupasi minulle rahaa, mutta sen sijaan pääsenkin Ohjelmoitsijan kuulusteltavaksi.","Je ne veux pas d'embrouilles. Laissez moi tranquille. J'ai déjà assez de problèmes avec ce que ce salaud d'Harris ma fait. Il m'a promis de l'argent, maintenant, je risque de me faire interroger par le Programmeur.",,"Én nem akarok semmi problémát, maradj távol tőlem. Elég baj nekem az amit az a barom Harris okozott. Pénzt ígért, ehelyett az vár rám, hogy a Programozó ki fog kérdezni.","Non voglio problemi, stai alla larga. Ho già avuto abbastanza problemi con quello che quel bastardo di mi ha fatto. Mi aveva promesso soldi, invece mi ritrovo ad avere l'opportunità di essere interrogato dal Programmatore.","もう面倒事には御免だ、私に近づくな。 あのハリスのクズのせいでもう十分面倒な目に 遭ったんだ。ヤツは私に金を渡すと約束したのに、 裏切られて私がプログラマーに尋問されることに なってしまったんだ。","난 문제를 더 일으키고 싶지 않아, 나에게서 떨어져! 해리스 그 자식이 나를 속였어. 녀석이 돈을 준다고 해서 도와줬더니 도망치고 없었고 결국엔 붙잡혀서 프로그래머에게 심문을 받을 처지에 놓였다고!","Ik wil geen problemen, blijf uit mijn buurt. Ik heb genoeg problemen gehad met wat die klootzak Harris me heeft aangedaan. Hij beloofde me geld, maar in plaats daarvan kan ik me verheugen op een Ondervraging door de programmeur.","Jeg vil ikke ha trøbbel. Hold deg unna meg. Jeg har hatt nok trøbbel med det den jævelen Harris gjorde mot meg. Han lovet meg penger, i stedet kan jeg se frem til å bli avhørt av programmereren.","Nie chcę żadnych kłopotów, zostaw mnie w spokoju. Miałem już wystarczająco dużo problemów z tym co ten drań Harris mi zrobił. Obiecał mi pieniądze, ale zamiast tego muszę czekać na to, by być Przesłuchanym przez Programistę.","Não quero me meter em problemas, fique longe de mim. Já tive problemas demais com o que aquele desgraçado do Harris fez comigo. Ele me prometeu dinheiro, mas ao invés disso vou ser Questionado pelo Programador.",,"Nu vreau să am probleme, stai departe de mine. Am avut suficiente probleme din cauza a ceea ce mi-a făcut ticălosul de Harris. Mi-a promis niște bani, dar în schimb, acum aștept cu nerăbdare să fiu interogat de către Programator.","Не подходи ко мне — мне не нужны неприятности! У меня их и так достаточно из-за этого мерзавца Харриса. Он обещал мне деньги, а вместо этого меня ожидает «допрос» у Программиста.",,"Jag vill inte ha några problem, håll dig borta från mig. Jag har haft tillräckligt med problem med vad den jäveln Harris gjorde mot mig. Han lovade mig pengar, istället får jag se fram emot att bli förhörd av Programmeraren.","Bela istemiyorum, benden uzak dur. O piç Harris'in bana yaptıkları yüzünden yeterince sorun yaşadım. Bana para sözü verdi, onun yerine Programcı tarafından sorgulanmayı dört gözle bekliyorum." -I'll help you if you help me. Five pieces of gold and I'll tell all I know.,TXT_DLG_SCRIPT02_D0_ILLHE,MAP02: Guy next to Norwall Prison.,,,"Pomůžu ti, když pomůžeš ty mě. Pět zlaťáků a řeknu ti vše, co vím.","Jeg vil hjælpe dig, hvis du hjælper mig. Fem guldmønter, og jeg fortæller alt, hvad jeg ved.",Ich helfe dir wenn du mir hilfst. Fünf Goldstücke und ich erzähle alles was ich weiß.,,"Mi helpos vin se vi helpos min. Donu kvin da oro kaj mi rakontos ĉion, kion mi scias.",Te ayudo si me ayudas. Cinco monedas de oro y te cuento todo lo que sé.,,"Autan sinua, jos autat minua. Viidestä kultakolikosta kerron kaiken, minkä tiedän.","Tu m'aide, je t'aide. Cinq pièces et je te dis ce que je sais.","Segítek, ha segítesz. 5 arany és mindent elmondok, amit tudok.",Ti aiuterò se tu aiuti me. Cinque pezzi d'oro e ti dirò tutto quello che so.,"助けてくれるなら援助する。 +I'll help you if you help me. Five pieces of gold and I'll tell all I know.,TXT_DLG_SCRIPT02_D0_ILLHE,MAP02: Guy next to Norwall Prison.,,,"Pomůžu ti, když pomůžeš ty mě. Pět zlaťáků a řeknu ti vše, co vím.","Jeg vil hjælpe dig, hvis du hjælper mig. Fem guldmønter, og jeg fortæller alt, hvad jeg ved.",Ich helfe dir wenn du mir hilfst. Fünf Goldstücke und ich erzähle alles was ich weiß.,,"Mi helpos vin se vi helpos min. Donu kvin da oro kaj mi rakontos ĉion, kion mi scias.",Te ayudo si me ayudas. Cinco monedas de oro y te cuento todo lo que sé.,,"Autan sinua, jos autat minua. Viidestä kultakolikosta kerron kaiken, minkä tiedän.","Tu m'aide, je t'aide. Cinq pièces et je te dis ce que je sais.",,"Segítek, ha segítesz. 5 arany és mindent elmondok, amit tudok.",Ti aiuterò se tu aiuti me. Cinque pezzi d'oro e ti dirò tutto quello che so.,"助けてくれるなら援助する。 5ゴールドで知っている情報を全て教えよう",저를 도와준다면 당신을 돕겠습니다. 5 골드를 줌으로써 말이죠.,Ik zal je helpen als je me helpt. Vijf goudstukken en ik vertel alles wat ik weet.,"Jeg hjelper deg hvis du hjelper meg. Fem gullstykker, så forteller jeg alt jeg vet.",Pomogę ci jeśli ty mi pomożesz. Pięć sztuk złota i powiem ci wszytsko co wiem.,Eu te ajudo se você me ajudar. Cinco moedas de ouro e te digo tudo que eu sei.,,"O să te ajut dacă și tu mă ajuți. Cinci bucăți de aur și-ți voi spune tot ce știu.","Я помогу тебе, если ты поможешь мне. Пять золотых, и я расскажу всё, что знаю.",,Jag hjälper dig om du hjälper mig. Fem guldmynt och jag berättar allt jag vet.,Bana yardım edersen ben de sana yardım ederim. Beş altın ve tüm bildiklerimi anlatacağım. -Here's the gold.,TXT_RPLY0_SCRIPT02_D0_HERES,〃,,,Tady jsou.,Her er guldet.,Hier ist dein Gold.,,Jen la oro.,Aquí está el oro.,,Tässä on kulta.,Voilà l'argent.,Itt az arany.,Ecco l'oro.,金はこれだ。,여기 골드입니다.,Hier is het goud.,Her er gullet.,Oto złoto.,Aqui está o ouro.,,Poftiți aurul.,Вот золото.,,Här är guldet.,İşte altın. +Here's the gold.,TXT_RPLY0_SCRIPT02_D0_HERES,〃,,,Tady jsou.,Her er guldet.,Hier ist dein Gold.,,Jen la oro.,Aquí está el oro.,,Tässä on kulta.,Voilà l'argent.,,Itt az arany.,Ecco l'oro.,金はこれだ。,여기 골드입니다.,Hier is het goud.,Her er gullet.,Oto złoto.,Aqui está o ouro.,,Poftiți aurul.,Вот золото.,,Här är guldet.,İşte altın. "Be stealthy when you kill, you won't set off alarms.",TXT_RYES0_SCRIPT02_D0_BESTE,〃,,,"Když zabíjíš, dělej to potichu - nespustíš tak poplach.","Vær snigende når du dræber, så du ikke udløser alarmer.","Sei leise, wenn du jemanden tötest, damit du keinen Alarm auslöst.",,"Mortigu silente por ne ekagigi alarmojn.","Sé sigiloso al matar para -no activar las alarmas.",,"Jos tapat vihollisesi salaa, vältyt hälytyksiltä.",Tuez discrètement et vous n'aurez pas de problème avec les alarmes.,"Lopakodva, halkan gyilkolj, kézzel, így nem indul be a riasztó.","Sii furtivo quando uccidi, non farai scattare l'allarme.",始末する際は隠密に、警報を鳴らさないように。,"조용히 은신해서 암살만 한다면, 경보를 울리지 않을 겁니다.","Wees sluipend als je doodt, je zult geen alarmbellen laten afgaan.","Vær snikende når du dreper, så du ikke utløser alarmer.","Bądź cicho kiedy zabijasz, nie włączysz wtedy alarmu.",Seja cauteloso quando for matar e não ativará os alarmes.,,"Fii discret când ucizi, nu vei declanșa alarma astfel.","Убивай бесшумно, чтобы не поднять тревогу.",,"Var smygande när du dödar, du kommer inte att utlösa larm.","Öldürürken gizli ol, alarmları çalıştırmazsın." +no activar las alarmas.",,"Jos tapat vihollisesi salaa, vältyt hälytyksiltä.",Tuez discrètement et vous n'aurez pas de problème avec les alarmes.,,"Lopakodva, halkan gyilkolj, kézzel, így nem indul be a riasztó.","Sii furtivo quando uccidi, non farai scattare l'allarme.",始末する際は隠密に、警報を鳴らさないように。,"조용히 은신해서 암살만 한다면, 경보를 울리지 않을 겁니다.","Wees sluipend als je doodt, je zult geen alarmbellen laten afgaan.","Vær snikende når du dreper, så du ikke utløser alarmer.","Bądź cicho kiedy zabijasz, nie włączysz wtedy alarmu.",Seja cauteloso quando for matar e não ativará os alarmes.,,"Fii discret când ucizi, nu vei declanșa alarma astfel.","Убивай бесшумно, чтобы не поднять тревогу.",,"Var smygande när du dödar, du kommer inte att utlösa larm.","Öldürürken gizli ol, alarmları çalıştırmazsın." "Well, I won't be telling you anything for free!",TXT_RNO0_SCRIPT02_D0_WELLI,〃,,,Zadarmo ti nic říkat nebudu!,Jeg vil ikke fortælle dig noget gratis!,"Na ja, für umsonst werde ich dir nichts erzählen!",,"Nu, mi ne parolos senpage!","Bueno, ¡no te diré nada gratis!","Bueno, ¡no voy a decir -nada gratis!","No, en aio kertoa mitään ilmaiseksi!",Je ne vous dirai rien si vous ne me donnez rien!,"Figyelj, ingyen semmit sem mondok el neked.","Beh, io non ti dirò un bel niente senza compenso!",いや、タダで情報は渡せない!,세상에 공짜가 어딨습니까? 먼저 돈을 주세요!,"Nou, ik zal je niets gratis vertellen!","Vel, jeg vil ikke fortelle deg noe gratis!","Cóż, nie będę ci mówił niczego za darmo!","Bom, não vou te dar informação de graça!",,"Păi, n-o să-ți zic nimic pe gratis!","Что ж, я ничего не скажу даром!",,Jag kommer inte att berätta något gratis!,Sana bedavaya hiçbir şey anlatmayacağım! -Have you by any chance got another 5 gold on you?,TXT_DLG_SCRIPT02_D1516_HAVEY,〃,,,Neměl bys u sebe náhodou dalších pět zlatek?,Har du tilfældigvis fem guldstykker mere på dig?,Hast du vielleicht 5 weitere Goldmünzen dabei?,,Ĉu eble vi havas aliajn kvin da oro?,"¿No tendrás otros cinco de oro, por casualidad?",,Sattuisiko sinulla olemaan toiset viisi kolikkoa?,T'aurais pas 5 pièces en plus sur toi?,Nincs véletlenül nálad még 5 arany?,Hai per caso altri 5 pezzi d'oro con te?,もしかして5ゴールド稼いだのか?,5 골드 더 있습니까? 그러면 아주 좋을 텐데.,Heb je toevallig nog 5 goud bij je?,Har du tilfeldigvis fem gull til på deg?,Czy przypadkiem masz może kolejne 5 monet przy sobie?,Por acaso teria mais 5 de ouro aí?,,"Ai cumva, din întâmplare, 5 monezi de aur?",У тебя случайно не найдётся ещё 5 монеток?,,Har du av en slump 5 guldpengar till på dig?,Yanında 5 altın daha var mı acaba? -5 gold.,TXT_RPLY0_SCRIPT02_D1516_5GOLD,〃,,,Pět zlatých.,5 guld.,5 Gold.,,Kvin da oro.,Cinco de oro.,,5 kolikkoa.,5 pièces.,5 arany.,5 pezzi d'oro.,5ゴールドだ。,5 골드.,5 goud.,5 gull.,5 monet.,5 de ouro.,,5 monezi de aur.,5 золотых.,,Fem guld.,5 altın. +nada gratis!","No, en aio kertoa mitään ilmaiseksi!",Je ne vous dirai rien si vous ne me donnez rien!,,"Figyelj, ingyen semmit sem mondok el neked.","Beh, io non ti dirò un bel niente senza compenso!",いや、タダで情報は渡せない!,세상에 공짜가 어딨습니까? 먼저 돈을 주세요!,"Nou, ik zal je niets gratis vertellen!","Vel, jeg vil ikke fortelle deg noe gratis!","Cóż, nie będę ci mówił niczego za darmo!","Bom, não vou te dar informação de graça!",,"Păi, n-o să-ți zic nimic pe gratis!","Что ж, я ничего не скажу даром!",,Jag kommer inte att berätta något gratis!,Sana bedavaya hiçbir şey anlatmayacağım! +Have you by any chance got another 5 gold on you?,TXT_DLG_SCRIPT02_D1516_HAVEY,〃,,,Neměl bys u sebe náhodou dalších pět zlatek?,Har du tilfældigvis fem guldstykker mere på dig?,Hast du vielleicht 5 weitere Goldmünzen dabei?,,Ĉu eble vi havas aliajn kvin da oro?,"¿No tendrás otros cinco de oro, por casualidad?",,Sattuisiko sinulla olemaan toiset viisi kolikkoa?,T'aurais pas 5 pièces en plus sur toi?,,Nincs véletlenül nálad még 5 arany?,Hai per caso altri 5 pezzi d'oro con te?,もしかして5ゴールド稼いだのか?,5 골드 더 있습니까? 그러면 아주 좋을 텐데.,Heb je toevallig nog 5 goud bij je?,Har du tilfeldigvis fem gull til på deg?,Czy przypadkiem masz może kolejne 5 monet przy sobie?,Por acaso teria mais 5 de ouro aí?,,"Ai cumva, din întâmplare, 5 monezi de aur?",У тебя случайно не найдётся ещё 5 монеток?,,Har du av en slump 5 guldpengar till på dig?,Yanında 5 altın daha var mı acaba? +5 gold.,TXT_RPLY0_SCRIPT02_D1516_5GOLD,〃,,,Pět zlatých.,5 guld.,5 Gold.,,Kvin da oro.,Cinco de oro.,,5 kolikkoa.,5 pièces.,,5 arany.,5 pezzi d'oro.,5ゴールドだ。,5 골드.,5 goud.,5 gull.,5 monet.,5 de ouro.,,5 monezi de aur.,5 золотых.,,Fem guld.,5 altın. "Well, poison bolts can kill the guards instantly and won't set off the alarms.",TXT_RYES0_SCRIPT02_D1516_WELLP,〃,,,"No, otrávené šípy okamžitě zabijí stráže a nikdo nevyhlásí poplach.","Nå, giftpile kan dræbe vagterne med det samme og vil ikke udløse alarmen.",Also Giftpfeile können die Wachen sofort töten und lösen keinen Alarm aus.,,"Mortigi per venenaj sagoj estas tuje kaj silente.","Matar con flechas envenenadas -es instantáneo y sin alarmas.",,No niin; myrkkynuolilla voi tappaa vartijat välittömästi hälytystä laukaisematta.,Les carreaux empoisonnés tuent les gardes instantanément et discrètement.,"Hát, a mérgező nyilak azonnal a túlvilágra küldik az őröket, és a riasztó sem kapcsol be.",Le frecce avvelenate possono uccidere le guardie istantaneamente e non faranno scattare l'allarme.,"そうだな、ポイズンボルトは警備員を簡単に殺せるし、 +es instantáneo y sin alarmas.",,No niin; myrkkynuolilla voi tappaa vartijat välittömästi hälytystä laukaisematta.,Les carreaux empoisonnés tuent les gardes instantanément et discrètement.,,"Hát, a mérgező nyilak azonnal a túlvilágra küldik az őröket, és a riasztó sem kapcsol be.",Le frecce avvelenate possono uccidere le guardie istantaneamente e non faranno scattare l'allarme.,"そうだな、ポイズンボルトは警備員を簡単に殺せるし、 警報を作動させることもない。",아시나요? 맹독 볼트만 있으면 경보를 울리지 않고 경비병을 죽일 수 있다는거?,"Nou, gifbouten kunnen de bewakers onmiddellijk doden en zullen het alarm niet laten afgaan.","Vel, giftbolter kan drepe vaktene øyeblikkelig og vil ikke utløse alarmen.","Więc, zatrute bełty mogą od razu zabić strażników i nie włączą alarmu.","Bem, setas venenosas podem matar guardas na hora e não disparam alarmes.",,"Păi, bolțurile otrăvite pot omorâ gardienii instant și nu vor declanșa alarma.","Что ж, отравленными болтами можно убивать охранников быстро и бесшумно.",,"Tja, giftbultar kan döda vakterna omedelbart och kommer inte att utlösa larmen.",Zehirli oklar muhafızları anında öldürebilir ve alarmı çalıştırmaz. -"No sir, I won't be telling you anything for free!",TXT_RNO0_SCRIPT02_D1516_NOSIR,〃,,,"Ne, ne, zadarmo ti nic říkat nebudu!","Nej, sir, jeg vil ikke fortælle dig noget gratis!","Nein, ich werde dir nichts für umsonst erzählen!",,"Ne, mi diros nenion senpage!","¡No, no diré nada gratis!","¡No, no voy a decir nada gratis!","Ehei, en kerro mitään ilmaiseksi!","Non, monsieur, je ne vous dirai rien si je ne me fais pas payer!","Nem uram, nem árulok el semmit ingyen!","No signore, non ti dirò nulla senza avere qualcosa in cambio!",いやいや、タダでは話せないな!,"죄송합니다만, 전 아무것도 무료로 말해주지 않을 겁니다!","Nee meneer, ik zal u niets gratis vertellen!","Nei, sir, jeg vil ikke fortelle deg noe gratis!","Nie panie, nie będę ci mówił niczego za darmo!","Nada disso, senhor, não vou te dizer nada de graça!",,"Nu domnule, n-o să-ți zic nimic pe gratis!","Нет, товарищ! Даром — только за амбаром!",,"Nej, sir, jag tänker inte berätta något gratis för dig!","Hayır efendim, size bedava bir şey söylemeyeceğim!" -You've wrung the last bit of gossip out of me already!,TXT_DLG_SCRIPT02_D3032_YOUVE,〃,,,"Už jsi ze mě vyždímal všechny klepy, co jsem měl!",Du har allerede vredet den sidste smule sladder ud af mig!,Du hast bereits das letzte bisschen Klatsch aus mir herausgequetscht!,,Vi jam eltiris de mi eĉ la lastan klaĉon.,Ya me has sacado hasta el último cotilleo.,Ya me sacaste hasta el último chisme.,Olet jo puristanut minusta kaikki juorut!,Vous m'avez tiré tous les vers du nez!,Már a legutolsó pletykát is kiszedted belőlem.,Mi hai già spremuto fino all'ultimo pettegolezzo! ,既にイキのいい噂は聞かせたぞ!,가십거리를 이미 다 털어놓았습니다. 더 뭘 바랍니까?,Je hebt de laatste roddels al uit me uitgewrongen!,Du har allerede vrengt det siste sladderet ut av meg!,Wyciągnąłeś już ze mnie ostatnią plotkę!,Você já ouviu todos os boatos que posso te contar!,,Ai stors ultimele bârfe din mine deja!,"Ты уже вытянул из меня всё, что только можно!",,Du har redan pressat ut det sista skvallret ur mig!,Benden son dedikodumu da aldınız zaten! -What can I get for you?,TXT_DLG_SCRIPT02_D4548_WHATC,MAP02: Irale.,,,Co si budeš přát?,Hvad kan jeg få for dig?,Was kann ich für dich tun?,,Kion mi donu al vi?,¿Qué puedo ofrecerte?,,Mitä saisi olla?,Qu'est ce que je peux pour vous?,Mit tehetnék érted?,Cosa posso offrirti?,何か必要か?,무엇을 구매하고 싶어?,Wat kan ik voor u halen?,Hva vil du ha?,Co mogę dla ciebie zrobić?,Como posso te ajudar?,,Ce pot să-ți aduc?,Что я могу тебе предложить?,,Vad kan jag få för dig?,Sizin için ne alabilirim? -Assault gun,TXT_RPLY0_SCRIPT02_D4548_ASSAU,〃,,,Útočnou pušku,En pistol til angreb,Sturmgewehr,,Sturmofusilon,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,Gépfegyver,Fucile d'assalto,アサルトガン,돌격소총,Aanvalswapen,En automatpistol.,Karabin Szturmowy,Fuzil de assalto,,Pușcă de asalt,Штурмовую винтовку,,En attackpistol,Saldırı silahı. -Here you go.,TXT_RYES0_SCRIPT02_D4548_HEREY,〃,,,Tu máš.,Værsgo.,Bitte sehr!,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,Tessék,Ecco a te.,毎度あり。,여기 있어.,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Держи.,,Här får du.,Al bakalım. +"No sir, I won't be telling you anything for free!",TXT_RNO0_SCRIPT02_D1516_NOSIR,〃,,,"Ne, ne, zadarmo ti nic říkat nebudu!","Nej, sir, jeg vil ikke fortælle dig noget gratis!","Nein, ich werde dir nichts für umsonst erzählen!",,"Ne, mi diros nenion senpage!","¡No, no diré nada gratis!","¡No, no voy a decir nada gratis!","Ehei, en kerro mitään ilmaiseksi!","Non, monsieur, je ne vous dirai rien si je ne me fais pas payer!",,"Nem uram, nem árulok el semmit ingyen!","No signore, non ti dirò nulla senza avere qualcosa in cambio!",いやいや、タダでは話せないな!,"죄송합니다만, 전 아무것도 무료로 말해주지 않을 겁니다!","Nee meneer, ik zal u niets gratis vertellen!","Nei, sir, jeg vil ikke fortelle deg noe gratis!","Nie panie, nie będę ci mówił niczego za darmo!","Nada disso, senhor, não vou te dizer nada de graça!",,"Nu domnule, n-o să-ți zic nimic pe gratis!","Нет, товарищ! Даром — только за амбаром!",,"Nej, sir, jag tänker inte berätta något gratis för dig!","Hayır efendim, size bedava bir şey söylemeyeceğim!" +You've wrung the last bit of gossip out of me already!,TXT_DLG_SCRIPT02_D3032_YOUVE,〃,,,"Už jsi ze mě vyždímal všechny klepy, co jsem měl!",Du har allerede vredet den sidste smule sladder ud af mig!,Du hast bereits das letzte bisschen Klatsch aus mir herausgequetscht!,,Vi jam eltiris de mi eĉ la lastan klaĉon.,Ya me has sacado hasta el último cotilleo.,Ya me sacaste hasta el último chisme.,Olet jo puristanut minusta kaikki juorut!,Vous m'avez tiré tous les vers du nez!,,Már a legutolsó pletykát is kiszedted belőlem.,Mi hai già spremuto fino all'ultimo pettegolezzo! ,既にイキのいい噂は聞かせたぞ!,가십거리를 이미 다 털어놓았습니다. 더 뭘 바랍니까?,Je hebt de laatste roddels al uit me uitgewrongen!,Du har allerede vrengt det siste sladderet ut av meg!,Wyciągnąłeś już ze mnie ostatnią plotkę!,Você já ouviu todos os boatos que posso te contar!,,Ai stors ultimele bârfe din mine deja!,"Ты уже вытянул из меня всё, что только можно!",,Du har redan pressat ut det sista skvallret ur mig!,Benden son dedikodumu da aldınız zaten! +What can I get for you?,TXT_DLG_SCRIPT02_D4548_WHATC,MAP02: Irale.,,,Co si budeš přát?,Hvad kan jeg få for dig?,Was kann ich für dich tun?,,Kion mi donu al vi?,¿Qué puedo ofrecerte?,,Mitä saisi olla?,Qu'est ce que je peux pour vous?,,Mit tehetnék érted?,Cosa posso offrirti?,何か必要か?,무엇을 구매하고 싶어?,Wat kan ik voor u halen?,Hva vil du ha?,Co mogę dla ciebie zrobić?,Como posso te ajudar?,,Ce pot să-ți aduc?,Что я могу тебе предложить?,,Vad kan jag få för dig?,Sizin için ne alabilirim? +Assault gun,TXT_RPLY0_SCRIPT02_D4548_ASSAU,〃,,,Útočnou pušku,En pistol til angreb,Sturmgewehr,,Sturmofusilon,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,,Gépfegyver,Fucile d'assalto,アサルトガン,돌격소총,Aanvalswapen,En automatpistol.,Karabin Szturmowy,Fuzil de assalto,,Pușcă de asalt,Штурмовую винтовку,,En attackpistol,Saldırı silahı. +Here you go.,TXT_RYES0_SCRIPT02_D4548_HEREY,〃,,,Tu máš.,Værsgo.,Bitte sehr!,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,,Tessék,Ecco a te.,毎度あり。,여기 있어.,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Держи.,,Här får du.,Al bakalım. You can't afford that right now.,TXT_RNO0_SCRIPT02_D4548_YOUCA,〃,,,Tu si teď nemůžeš dovolit.,Det har du ikke råd til lige nu.,Das kannst du dir momentan nicht leisten.,,"Vi nun ne havas -sufiĉe da oro.",No te alcanza por ahora.,,Sinulla ei ole siihen juuri nyt varaa.,Vous n'avez pas assez d'argent.,Erre most nincs pénzed.,Non hai abbastanza soldi.,今それを買える余裕は無い。,그걸 사기엔 여유가 없는 것 같네.,Dat kunt je zich nu niet veroorloven.,Det har du ikke råd til akkurat nå.,Nie możesz teraz tego kupić.,Você não pode comprar isso no momento.,,Nu-ți poți permite asta încă.,Ты пока не можешь себе это позволить.,,Du har inte råd med den just nu.,Şu anda bunu karşılayamazsın. -Clip of bullets,TXT_RPLY1_SCRIPT02_D4548_CLIPO,〃,,,Zásobník nábojů,Et magasin med kugler,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,Egy tár töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Kulor.,Mermi şarjörü -Thanks.,TXT_RYES1_SCRIPT02_D4548_THANK,〃,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Köszi.,Grazie.,どうも。,고맙다!,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. -"Come on, 10 gold.",TXT_RNO1_SCRIPT02_D4548_COMEO,〃,,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Na komm, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.","Gyerünk, 10 arany.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,10 골드만 있으면 되는데...,"Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." -Ammo box,TXT_RPLY2_SCRIPT02_D4548_AMMOB,〃,,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Bôite de balles,Egy doboz lőszer,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu -Here's your ammo.,TXT_RYES2_SCRIPT02_D4548_HERES,〃,,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,Itt a lőszered.,Ecco le tue munizioni.,これでアンタのブツだ。,탄약 여기 있어!,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. +sufiĉe da oro.",No te alcanza por ahora.,,Sinulla ei ole siihen juuri nyt varaa.,Vous n'avez pas assez d'argent.,,Erre most nincs pénzed.,Non hai abbastanza soldi.,今それを買える余裕は無い。,그걸 사기엔 여유가 없는 것 같네.,Dat kunt je zich nu niet veroorloven.,Det har du ikke råd til akkurat nå.,Nie możesz teraz tego kupić.,Você não pode comprar isso no momento.,,Nu-ți poți permite asta încă.,Ты пока не можешь себе это позволить.,,Du har inte råd med den just nu.,Şu anda bunu karşılayamazsın. +Clip of bullets,TXT_RPLY1_SCRIPT02_D4548_CLIPO,〃,,,Zásobník nábojů,Et magasin med kugler,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,,Egy tár töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Kulor.,Mermi şarjörü +Thanks.,TXT_RYES1_SCRIPT02_D4548_THANK,〃,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Köszi.,Grazie.,どうも。,고맙다!,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. +"Come on, 10 gold.",TXT_RNO1_SCRIPT02_D4548_COMEO,〃,,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Na komm, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.",,"Gyerünk, 10 arany.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,10 골드만 있으면 되는데...,"Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." +Ammo box,TXT_RPLY2_SCRIPT02_D4548_AMMOB,〃,,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Bôite de balles,,Egy doboz lőszer,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu +Here's your ammo.,TXT_RYES2_SCRIPT02_D4548_HERES,〃,,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,,Itt a lőszered.,Ecco le tue munizioni.,これでアンタのブツだ。,탄약 여기 있어!,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. Maybe some other time.,TXT_RNO2_SCRIPT02_D4548_MAYBE,〃,,,Možná někdy jindy.,Måske en anden gang.,Vielleicht ein anderes Mal.,,Eble alimomente.,"Puede que en -otro momento.",,Ehkä joku toinen kerta.,Peut être une autre fois.,Talán majd máskor.,Magari un'altra volta.,また後でな。,아마도 나중에...,Misschien een andere keer.,Kanskje en annen gang.,Może innym razem.,Talvez outra hora.,,Poate altădată.,"Может, в другой раз.",,Kanske en annan gång.,Belki başka bir zaman. -Good news from the Front for a change. Macil sent you for a reward and training. He's instructed me to give them to you.,TXT_DLG_SCRIPT02_D6064_GOODN,〃 (After destroying the crystal in the Power Station),,,"Pro jednou dobré zprávy od Fronty. Macil tě poslal pro odměnu a trénink. Řekl mi, že ti to mám předat.",Gode nyheder fra fronten til en forandring. Macil har sendt dig for at få en belønning og træning. Han har instrueret mig om at give dig dem.,"Gute Nachrichten von der Front zur Abwechslung. Macil lässt dir eine Belohnung und Training zukommen. Er hat mir aufgetragen, es dir zu geben.",,"Estas bonaj novaĵoj el la Fronto, laŭ la kutimo. Macil sendis oron kaj trejniĝon por vi. Li instrukciis, ke mi donu ilin al vi.","Buenas noticias desde el Frente, para variar. Macil te manda oro y entrenamiento. Me ha solicitado dártelos.","Buenas noticias desde el Frente, para variar. Macil te manda oro y entrenamiento. Me solicitó dártelos.",Hyviä uutisia Rintamalta vaihteeksi. Macil kutsui sinut saamaan minun kauttani palkkion ja koulutusta.,Des bonnes nouvelles du Front pour une fois. Macil t'a envoyé pour une récompense et de l'entraînement. Il m'a instruit de te les procurer.,"Jó hírekkel szolgálhatok a +otro momento.",,Ehkä joku toinen kerta.,Peut être une autre fois.,,Talán majd máskor.,Magari un'altra volta.,また後でな。,아마도 나중에...,Misschien een andere keer.,Kanskje en annen gang.,Może innym razem.,Talvez outra hora.,,Poate altădată.,"Может, в другой раз.",,Kanske en annan gång.,Belki başka bir zaman. +Good news from the Front for a change. Macil sent you for a reward and training. He's instructed me to give them to you.,TXT_DLG_SCRIPT02_D6064_GOODN,〃 (After destroying the crystal in the Power Station),,,"Pro jednou dobré zprávy od Fronty. Macil tě poslal pro odměnu a trénink. Řekl mi, že ti to mám předat.",Gode nyheder fra fronten til en forandring. Macil har sendt dig for at få en belønning og træning. Han har instrueret mig om at give dig dem.,"Gute Nachrichten von der Front zur Abwechslung. Macil lässt dir eine Belohnung und Training zukommen. Er hat mir aufgetragen, es dir zu geben.",,"Estas bonaj novaĵoj el la Fronto, laŭ la kutimo. Macil sendis oron kaj trejniĝon por vi. Li instrukciis, ke mi donu ilin al vi.","Buenas noticias desde el Frente, para variar. Macil te manda oro y entrenamiento. Me ha solicitado dártelos.","Buenas noticias desde el Frente, para variar. Macil te manda oro y entrenamiento. Me solicitó dártelos.",Hyviä uutisia Rintamalta vaihteeksi. Macil kutsui sinut saamaan minun kauttani palkkion ja koulutusta.,Des bonnes nouvelles du Front pour une fois. Macil t'a envoyé pour une récompense et de l'entraînement. Il m'a instruit de te les procurer.,,"Jó hírekkel szolgálhatok a frontról a változatosság kedvéért. Macil érted küldött egy kis jutalommal a kiképzésért cserébe. Azt parancsolta, hogy adjam oda őket.",Buone notizie dal Fronte per una volta. Macil ti ha inviato una ricompensa e predisposto per l'addestramento. Mi ha raccomandato di procurarteli.,"フロントから朗報だ。 マシルは貴方に報酬と訓練の許可を送った。 私はそれらを貴方に渡す為に持って来た。","프론트로부터 좋은 소식을 들었어. 마실 사령관님이 보상과 훈련받을 특권을 당신에게 전해주라는군. 이미 준비된 것 같으니, 시작할까?",Goed nieuws van het Front voor de verandering. Macil heeft je gestuurd voor een beloning en training. Hij heeft me geïnstrueerd om ze aan jou te geven.,Gode nyheter fra fronten til en forandring. Macil sendte deg for belønning og trening. Han ba meg gi dem til deg.,"Dobre wieści od Frontu dla odmiany. Macil wysłał cię po nagrodę i na trening. Poinstruował mnie, aby ci je dostarczyć.",Boas notícias da Frente pra variar. O Macil enviou uma recompensa e treinamento para você. Ele me deu ordens para passá-los a você.,,"În sfârșit, niște vești bune venite de pe Front. Ai venit de la Macil pentru o recompensă și niste instruire este? Mi-a ordonat ca eu să ți le ofer.","Наконец-то, хорошие новости от Сопротивления. Ты пришёл от Мэйсила за наградой и обучением. Он распорядился, чтобы я дал тебе их.",,Goda nyheter från fronten för en gångs skull. Macil skickade dig för en belöning och utbildning. Han har instruerat mig att ge dig dem.,Değişiklik olsun diye cepheden iyi haberler var. Macil seni ödül ve eğitim için gönderdi. Onları sana vermemi emretti. -Thanks.,TXT_RPLY0_SCRIPT02_D6064_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Köszi.,Grazie.,ありがとう。,고맙습니다.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkürler. -Glad to be of service.,TXT_RYES0_SCRIPT02_D6064_GLADT,〃 (〃),,,Rád jsem pomohl.,Glad for at være til tjeneste.,Es war mir eine Freude dir zu Diensten zu sein,,Estas plezuro esti serva.,Un placer atenderte.,,Onneksi voin olla avuksi.,Ravi de vous avoir servi.,Szíves örömest segítek.,Felice di essere utile.,感謝する。,도와줄 수 있어서 영광이야.,Blij om van dienst te zijn.,Glad for å stå til tjeneste.,"Cieszę się, że mogłem pomóc.",É um prazer serví-los.,,Mă bucur să fiu util.,Рад помочь.,,Glad att vara till tjänst.,Hizmet edebildiğime sevindim. -"All right, here's a few pointers on what to do: don't get in the way of Crusaders: firing short bursts from your assault gun keeps it on target.",TXT_DLG_SCRIPT02_D7580_ALLRI,〃 (〃),,,"Jistě, tady je pár rad, co dělat: Nepleť se do cesty Křižákům. Střílení krátkých dávek z pušky ti zaručí přesnost.",,"Also, hier hast du ein paar Hinweise: Gerate nicht ins Visier der Ordensritter: Wenn du kurze Feuerstöße mit deinem Sturmgewehr abgibst, triffst du besser.",,"Bone, jen kelkaj konsiloj. Ne staru antaŭ Krucistoj; pafi mallongajn ŝprucojn per la sturmofusilo estas sufiĉe por teni vian celon.","Muy bien, aquí algunos consejos. No te pongas frente a los Cruzados: disparar ráfagas cortas con el fusil de asalto basta para mantenerte en el blanco.",,"No niin, ihan vain ohjeeksi: Pysy pois ristiretkeläisten tieltä; hallituilla rynnäkkökiväärin sarjoilla pidät kiväärin tähtäimissäsi.","Bon, voilà quelques conseils sur ce que tu devrais faire: Ne vas pas te mêler aux croisés. Tirer en courte rafales avec le fusil d'assaut te permet de rester sur ta cible.","Na jól van, itt egy kis útbaigazítás neked: Ne kerülj a keresztesek útjába: Gépfegyveredből rövid sorozatokat leadva pontosabban tudsz célozni.","Bene, ecco alcuni consigli sul da farsi: non metterti davanti ai Crociati: sparare singole raffiche con il tuo fucile d'assalto fa si che l'arma rimane sul bersaglio.","オーライ、 +Thanks.,TXT_RPLY0_SCRIPT02_D6064_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Köszi.,Grazie.,ありがとう。,고맙습니다.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkürler. +Glad to be of service.,TXT_RYES0_SCRIPT02_D6064_GLADT,〃 (〃),,,Rád jsem pomohl.,Glad for at være til tjeneste.,Es war mir eine Freude dir zu Diensten zu sein,,Estas plezuro esti serva.,Un placer atenderte.,,Onneksi voin olla avuksi.,Ravi de vous avoir servi.,,Szíves örömest segítek.,Felice di essere utile.,感謝する。,도와줄 수 있어서 영광이야.,Blij om van dienst te zijn.,Glad for å stå til tjeneste.,"Cieszę się, że mogłem pomóc.",É um prazer serví-los.,,Mă bucur să fiu util.,Рад помочь.,,Glad att vara till tjänst.,Hizmet edebildiğime sevindim. +"All right, here's a few pointers on what to do: don't get in the way of Crusaders: firing short bursts from your assault gun keeps it on target.",TXT_DLG_SCRIPT02_D7580_ALLRI,〃 (〃),,,"Jistě, tady je pár rad, co dělat: Nepleť se do cesty Křižákům. Střílení krátkých dávek z pušky ti zaručí přesnost.",,"Also, hier hast du ein paar Hinweise: Gerate nicht ins Visier der Ordensritter: Wenn du kurze Feuerstöße mit deinem Sturmgewehr abgibst, triffst du besser.",,"Bone, jen kelkaj konsiloj. Ne staru antaŭ Krucistoj; pafi mallongajn ŝprucojn per la sturmofusilo estas sufiĉe por teni vian celon.","Muy bien, aquí algunos consejos. No te pongas frente a los Cruzados: disparar ráfagas cortas con el fusil de asalto basta para mantenerte en el blanco.",,"No niin, ihan vain ohjeeksi: Pysy pois ristiretkeläisten tieltä; hallituilla rynnäkkökiväärin sarjoilla pidät kiväärin tähtäimissäsi.","Bon, voilà quelques conseils sur ce que tu devrais faire: Ne vas pas te mêler aux croisés. Tirer en courte rafales avec le fusil d'assaut te permet de rester sur ta cible.",,"Na jól van, itt egy kis útbaigazítás neked: Ne kerülj a keresztesek útjába: Gépfegyveredből rövid sorozatokat leadva pontosabban tudsz célozni.","Bene, ecco alcuni consigli sul da farsi: non metterti davanti ai Crociati: sparare singole raffiche con il tuo fucile d'assalto fa si che l'arma rimane sul bersaglio.","オーライ、 それで何をすべきかについて説明がある :クルセイダーの斜線に立つな :アサルトガンを遠くから的に向かって撃て",좋아. 먼저 배워둬야 할 것은: 크루세이더를 제압하기 위해선 가능한 한 멀리서 상대해야 해. 그리고 돌격소총의 방아쇠를 한 번 누르면 정확한 3 점발사격이 가능하지. ,"Oké, hier zijn een paar tips over wat je moet doen: sta kruisvaarders niet in de weg: korte uitbarstingen van je aanvalsgeweer houden het doelwit.","Greit, her er noen tips om hva du skal gjøre: Ikke kom i veien for korsfarerne. Korte salver fra angrepsgeværet holder det på målet.","W porządku, oto kilka wskazówek co trzeba robić: nie wchodzić w drogę Krzyżowcom: strzelanie krótkimi seriami z karabinu szturmowego utrzymuje cel.","Muito bem, tenho alguns conselhos pra te dar: não se meta na frente dos Cruzados: atire rajadas curtas com o seu fuzil de assalto para ter mais precisão.",,"În regulă, uite niște puncte de reper: Nu te băga în calea Cruciaților: Focurile scurte ale armei tale de asalt sunt cele mai eficiente.","Отлично, вот несколько советов: не попадайся под ноги крестоносцам; из штурмовой винтовки лучше всего стрелять короткими очередями.",,"Okej, här är några tips om vad du ska göra: Ställ dig inte i vägen för korsfarare: Genom att avfyra korta salvor från ditt stormgevär håller du det i mål.","Pekala, işte size ne yapmanız gerektiğine dair birkaç ipucu: Haçlıların yoluna çıkmayın: saldırı silahınızla kısa aralıklarla ateş etmek onu hedefte tutar." -Is that it?,TXT_RPLY0_SCRIPT02_D7580_ISTHA,〃 (〃),,,To je všechno?,Er det det?,War es das?,,Ĉu nenio alia?,¿Eso es todo?,,Siinä kaikki?,C'est tout?,Ennyi?,Tutto qui?,そうなのか?,그게 답니까?,Is dat het?,Var det alt?,To wszystko?,Só isso?,,Asta e?,И всё?,,Är det så?,Bu kadar mı? +Is that it?,TXT_RPLY0_SCRIPT02_D7580_ISTHA,〃 (〃),,,To je všechno?,Er det det?,War es das?,,Ĉu nenio alia?,¿Eso es todo?,,Siinä kaikki?,C'est tout?,,Ennyi?,Tutto qui?,そうなのか?,그게 답니까?,Is dat het?,Var det alt?,To wszystko?,Só isso?,,Asta e?,И всё?,,Är det så?,Bu kadar mı? "Look, you'll learn more later.",TXT_RYES0_SCRIPT02_D7580_LOOKY,〃 (〃),,,"Hele, víc se toho naučíš pak.","Hør, du vil få mere at vide senere.",Fürs Erste ja. Du wirst später noch mehr lernen.,,"Nu, vi lernos pli poste.","Ya aprenderás más después.","Ya vas a aprender -más después.",Saat oppia kyllä lisää myöhemmin.,Tu en apprendras davantage plus tard.,"Nézd, később majd többet fogsz megtudni.","Guarda, imparerai di più dopo.",良し、後でもっと学べるぞ。,나중에 알려줄게.,"Kijk, je komt er later meer over te weten.",Du får vite mer senere.,"Zobacz, później nauczysz się więcej.","Olha, você vai aprender mais depois.",,"Uite, o să afli mai multe mai târziu.","Позже узнаешь больше, хорошо?",,Du kommer att få veta mer senare.,"Bak, daha sonra daha fazlasını öğreneceksin." -"I think I can convert a flamethrower from one of the Crusaders for use by a human. Oh, anything else I can get you?",TXT_DLG_SCRIPT02_D9096_ITHIN,〃 (〃),,,"Myslím, že bych mohl předělat plamenomet z jednoho z těch Křižáků pro použití člověkem. No, budeš si ještě něco přát?","Jeg tror, jeg kan omdanne en flammekaster fra en af korsfarerne til brug for et menneske. Er der andet, jeg kan skaffe dig?","Ich denke ich kann einen Flammenwerfer von einen der Ordensritter umbauen, damit ein Mensch ihn benutzen kann. Oh, kann ich dir sonst noch etwas besorgen?",,"Mi kredas, ke mi povas modifi la flamĵetilon de Krucisto, por ke homo povu uzi ĝin. Ha, ĉu io alia, kion mi povas doni al vi?","Creo poder modificar el lanzallamas de alguno de los Cruzados para que lo pueda usar un humano. Ah, ¿algo más para ofrecerte?",,Luulen pystyväni tekemään ristiretkeläisen liekinheittimestä ihmiskäyttöisen. Voinko olla vielä jotenkin muuten avuksi?,Je crois que je peux convertir un lance-flammes de croisé pour être utilisé par un humain. Je peux faire quelque chose d'autre pour vous?,"Azt hiszem, ha az egyik keresztesről leszednénk egy lángszórót, azt át tudnám alakítani emberi használatra. Ó, még valamit tehetek érted?","Penso di poter convertire un lanciafiamme da uno dei Crociati per essere usato da un umano. Oh, desideri qualcos'altro?","俺ならクルセイダー専用の火炎放射器を +más después.",Saat oppia kyllä lisää myöhemmin.,Tu en apprendras davantage plus tard.,,"Nézd, később majd többet fogsz megtudni.","Guarda, imparerai di più dopo.",良し、後でもっと学べるぞ。,나중에 알려줄게.,"Kijk, je komt er later meer over te weten.",Du får vite mer senere.,"Zobacz, później nauczysz się więcej.","Olha, você vai aprender mais depois.",,"Uite, o să afli mai multe mai târziu.","Позже узнаешь больше, хорошо?",,Du kommer att få veta mer senare.,"Bak, daha sonra daha fazlasını öğreneceksin." +"I think I can convert a flamethrower from one of the Crusaders for use by a human. Oh, anything else I can get you?",TXT_DLG_SCRIPT02_D9096_ITHIN,〃 (〃),,,"Myslím, že bych mohl předělat plamenomet z jednoho z těch Křižáků pro použití člověkem. No, budeš si ještě něco přát?","Jeg tror, jeg kan omdanne en flammekaster fra en af korsfarerne til brug for et menneske. Er der andet, jeg kan skaffe dig?","Ich denke ich kann einen Flammenwerfer von einen der Ordensritter umbauen, damit ein Mensch ihn benutzen kann. Oh, kann ich dir sonst noch etwas besorgen?",,"Mi kredas, ke mi povas modifi la flamĵetilon de Krucisto, por ke homo povu uzi ĝin. Ha, ĉu io alia, kion mi povas doni al vi?","Creo poder modificar el lanzallamas de alguno de los Cruzados para que lo pueda usar un humano. Ah, ¿algo más para ofrecerte?",,Luulen pystyväni tekemään ristiretkeläisen liekinheittimestä ihmiskäyttöisen. Voinko olla vielä jotenkin muuten avuksi?,Je crois que je peux convertir un lance-flammes de croisé pour être utilisé par un humain. Je peux faire quelque chose d'autre pour vous?,,"Azt hiszem, ha az egyik keresztesről leszednénk egy lángszórót, azt át tudnám alakítani emberi használatra. Ó, még valamit tehetek érted?","Penso di poter convertire un lanciafiamme da uno dei Crociati per essere usato da un umano. Oh, desideri qualcos'altro?","俺ならクルセイダー専用の火炎放射器を 誰でも使える様に作り変えられるだろう。 ああ、他に何か必要か?",크루세이더가 사용하는 화염방사기를 사람들이 다룰 수 있도록 개조할 수 있을 것 같아. 그래서... 뭘 원해?,"Ik denk dat ik een vlammenwerper van een van de kruisvaarders kan bekeren voor gebruik door een mens. Oh, kan ik nog iets anders voor je halen?",Jeg tror jeg kan konvertere en flammekaster fra en av korsfarerne til å brukes av et menneske. Noe annet jeg kan gi deg?,"Myślę, że mogę przerobić miotacz ognia jednego z Krzyżowców, by mógł z niego korzystać człowiek. Oh, czy mogę coś jeszcze dla ciebie zrobić?","Acho que eu consigo converter o lança-chamas de um dos Cruzados para ser usado por um humano. Ah, posso te ajudar com mais alguma coisa?",,"Cred că pot converti aruncătorul de flăcări de la un Cruciat pentru a putea fi folosit de oameni. Oh, mai pot să-ți aduc ceva?","Думаю, я смогу приспособить огнемёт для ручного использования. А, ты что-то ещё хотел? ",,"Jag tror att jag kan konvertera en eldkastare från en av korsfararna så att den kan användas av en människa. Åh, något annat jag kan ge dig?",Sanırım Haçlılardan birinin alev silahını bir insan tarafından kullanılmak üzere dönüştürebilirim. Sana verebileceğim başka bir şey var mı? -Flamethrower.,TXT_RPLY0_SCRIPT02_D9096_FLAME,〃 (〃),,,Plamenomet.,Flammekaster.,Flammenwerfer,,Flamĵetilon,Lanzallamas.,,Liekinheitin.,Lance-flammes.,Lángszóró.,Lanciafiamme.,火炎放射器,화염방사기?,Vlammenwerper.,Flammekaster.,Miotacz Ognia,Lança-chamas.,,Aruncător de flăcări.,Огнемёт.,,Flamkastare,Alev makinesi. +Flamethrower.,TXT_RPLY0_SCRIPT02_D9096_FLAME,〃 (〃),,,Plamenomet.,Flammekaster.,Flammenwerfer,,Flamĵetilon,Lanzallamas.,,Liekinheitin.,Lance-flammes.,,Lángszóró.,Lanciafiamme.,火炎放射器,화염방사기?,Vlammenwerper.,Flammekaster.,Miotacz Ognia,Lança-chamas.,,Aruncător de flăcări.,Огнемёт.,,Flamkastare,Alev makinesi. "I knew that'd work! Here you go, take her for a spin!",TXT_RYES0_SCRIPT02_D9096_IKNEW,〃 (〃),,,"Věděl jsem, že to bude fungovat! Tady máš, pořádně ho rozpal!","Jeg vidste, at det ville virke! Værsgo, tag en tur med hende!","Ich wusste das würde funktionieren! Bitte sehr, probiere ihn mal aus!",,"Mi sciis, ke tio sukcesus! Jen ĝi. Provu ĝin!","¡Sabía que iba a resultar! -Toma. ¡Pruébalo!",,"Tiesin sen toimivan! Anna palaa, vie se kierrokselle!",Je savais que ça marcherait! Prends-le et va donc l'essayer!,"Tudtam, hogy ez működni fog! Nesze vidd el egy körre!",Lo sapevo che avrebbe funzionato! Prendilo e vai a provarlo!,よくやってくれた! どうよ、このアツアツな子を!,"역시 잘 작동할 줄 알았어! 여기, 화염방사기야. 한번 놈들에게 사용해봐!","Ik wist dat dat zou werken! Alsjeblieft, neem haar mee voor een ritje!","Jeg visste det ville fungere! Vær så god, ta en tur med den!","Wiedziałem, że zadziała! Masz, przetestuj ją!","Eu sabia que daria certo! Toma, leva pra testar!",,"Stiam că va funcționa! Uite, ia-o la o tură!","Я и не сомневался, что всё получится! Держи, испробуй его на ком-нибудь!",,"Jag visste att det skulle fungera! Varsågod, ta en sväng med henne!","Bunun işe yarayacağını biliyordum! Al bakalım, bir tur at!" +Toma. ¡Pruébalo!",,"Tiesin sen toimivan! Anna palaa, vie se kierrokselle!",Je savais que ça marcherait! Prends-le et va donc l'essayer!,,"Tudtam, hogy ez működni fog! Nesze vidd el egy körre!",Lo sapevo che avrebbe funzionato! Prendilo e vai a provarlo!,よくやってくれた! どうよ、このアツアツな子を!,"역시 잘 작동할 줄 알았어! 여기, 화염방사기야. 한번 놈들에게 사용해봐!","Ik wist dat dat zou werken! Alsjeblieft, neem haar mee voor een ritje!","Jeg visste det ville fungere! Vær så god, ta en tur med den!","Wiedziałem, że zadziała! Masz, przetestuj ją!","Eu sabia que daria certo! Toma, leva pra testar!",,"Stiam că va funcționa! Uite, ia-o la o tură!","Я и не сомневался, что всё получится! Держи, испробуй его на ком-нибудь!",,"Jag visste att det skulle fungera! Varsågod, ta en sväng med henne!","Bunun işe yarayacağını biliyordum! Al bakalım, bir tur at!" "Listen, I can't make anything without the right parts!",TXT_RNO0_SCRIPT02_D9096_LISTE,〃 (〃),,,"Poslyš, bez použitelných součástek ti nic nepostavím!","Hør, jeg kan ikke lave noget uden de rigtige dele!","Hör zu, ohne die richtigen Teile kann ich dir nichts machen!",,"Nu, mi povas fari nenion sen la ĝustaj partoj!","A ver, ¡no puedo hacer nada -sin las partes correctas!",,"Kuules, ilman oikeita osia en pysty tekemään mitään!","Ecoute, je ne peux pas faire quoi que ce soit si je n'ai pas les pièces dont j'ai besoin!","Figyu, a megfelelő alkatrészek nélkül semmit sem tudok tenni.","Senti, non posso creare nulla senza i pezzi che mi servono!",部品が無ければ何も出来ない!,"이봐, 제대로 된 부품 없이는 아무 것도 할 수 없다고!","Luister, ik kan niets maken zonder de juiste onderdelen!",Jeg kan ikke lage noe uten de rette delene!,"Słuchaj, nie mogę nic zrobić bez właściwych części!","Escuta, eu não consigo fazer qualquer coisa sem as peças certas!",,"Ascultă, nu pot face nimic fără părțile corespunzătoare!","Слушай, у меня нет нужных деталей!",,"Lyssna, jag kan inte göra något utan rätt delar!","Dinle, doğru parçalar olmadan hiçbir şey yapamam!" -Assault gun,TXT_RPLY1_SCRIPT02_D9096_ASSAU,〃 (〃),,,Útočnou pušku,Angrebsvåben,Sturmgewehr,,Sturmofusilon,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,Gépfegyver,Fucile d'assalto,アサルトガン,돌격소총,Aanvalswapen,Flammekaster.,Karabin Szturmowy,Fuzil de assalto,,Armă de asalt,Штурмовую винтовку,,Anfallspistol,Saldırı silahı -"Well, here you go sir!",TXT_RYES1_SCRIPT02_D9096_WELLH,〃 (〃),,,"Tak tady máte, pane!","Værsgo, sir!","Alles klar, bitteschön!",,"Nu, jen, sinjoro!","¡Bueno, aquí tiene, caballero!",,"Kas tässä, hyvä herra!","Voilà pour vous, monsieur!","Nos, parancsoljon!","Bene, ecco qua signore!",ほら、毎度あり!,여기 대령이요!,"Nou, alsjeblieft, meneer!",Vær så god!,Oto jest proszę pana!,"Bem, aqui está, senhor!",,"Poftiți, domnule!",Забирай!,,"Här har du, sir!",Buyurun efendim! +sin las partes correctas!",,"Kuules, ilman oikeita osia en pysty tekemään mitään!","Ecoute, je ne peux pas faire quoi que ce soit si je n'ai pas les pièces dont j'ai besoin!",,"Figyu, a megfelelő alkatrészek nélkül semmit sem tudok tenni.","Senti, non posso creare nulla senza i pezzi che mi servono!",部品が無ければ何も出来ない!,"이봐, 제대로 된 부품 없이는 아무 것도 할 수 없다고!","Luister, ik kan niets maken zonder de juiste onderdelen!",Jeg kan ikke lage noe uten de rette delene!,"Słuchaj, nie mogę nic zrobić bez właściwych części!","Escuta, eu não consigo fazer qualquer coisa sem as peças certas!",,"Ascultă, nu pot face nimic fără părțile corespunzătoare!","Слушай, у меня нет нужных деталей!",,"Lyssna, jag kan inte göra något utan rätt delar!","Dinle, doğru parçalar olmadan hiçbir şey yapamam!" +Assault gun,TXT_RPLY1_SCRIPT02_D9096_ASSAU,〃 (〃),,,Útočnou pušku,Angrebsvåben,Sturmgewehr,,Sturmofusilon,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,,Gépfegyver,Fucile d'assalto,アサルトガン,돌격소총,Aanvalswapen,Flammekaster.,Karabin Szturmowy,Fuzil de assalto,,Armă de asalt,Штурмовую винтовку,,Anfallspistol,Saldırı silahı +"Well, here you go sir!",TXT_RYES1_SCRIPT02_D9096_WELLH,〃 (〃),,,"Tak tady máte, pane!","Værsgo, sir!","Alles klar, bitteschön!",,"Nu, jen, sinjoro!","¡Bueno, aquí tiene, caballero!",,"Kas tässä, hyvä herra!","Voilà pour vous, monsieur!",,"Nos, parancsoljon!","Bene, ecco qua signore!",ほら、毎度あり!,여기 대령이요!,"Nou, alsjeblieft, meneer!",Vær så god!,Oto jest proszę pana!,"Bem, aqui está, senhor!",,"Poftiți, domnule!",Забирай!,,"Här har du, sir!",Buyurun efendim! "Obviously, you can't afford that right now.",TXT_RNO1_SCRIPT02_D9096_OBVIO,〃 (〃),,,Tu si teď opravdu nemůžeš dovolit.,Du har tydeligvis ikke råd til den lige nu.,Offensichtlich kannst du dir das im Moment nicht leisten.,,"Evidente vi nun ne havas sufiĉe da mono.","Obviamente no te -alcanza por ahora.",,Sinulla ei selvästikään ole siihen nyt varaa.,"Manifestement, vous ne pouvez pas vous l'offrir.","Egyértelmű, hogy ezt nem tudod most kifizetni.","Ovviamente, ora non te lo puoi permettere.",明らかに、今買える余裕は無い。,"당연하겠지만, 아직 가질 수가 없겠네.",Dat kunt je zich natuurlijk nu niet veroorloven.,Det har du selvsagt ikke råd til akkurat nå!,"Oczywiście, nie możesz teraz tego kupić.",Obviamente você não pode comprar isso agora.,,"Evident, nu-ți poți permite asta chiar acum.","Похоже, тебе это не по карману.",,Uppenbarligen har du inte råd med den just nu.,Belli ki şu anda bunu karşılayamazsınız. -Clip of bullets,TXT_RPLY2_SCRIPT02_D9096_CLIPO,〃 (〃),,,Zásobník nábojů,Et patron-klip,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,Egy tár töltény.,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Kulor i ett klipp,Mermi şarjörü -Thanks.,TXT_RYES2_SCRIPT02_D9096_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Köszi.,Grazie.,どうも。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. -"Come on, 10 gold.",TXT_RNO2_SCRIPT02_D9096_COMEO,〃 (〃),,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Na komm, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.","Rajta, 10 aranyat.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,"이봐, 그건 10 골드짜리라고.","Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." -Ammo box,TXT_RPLY3_SCRIPT02_D9096_AMMOB,〃 (〃),,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Bôite de balles,Lőszeres doboz.,Scatola di munizioni,弾薬箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu -Here's your ammo.,TXT_RYES3_SCRIPT02_D9096_HERES,〃 (〃),,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,Itt a lőszered.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 탄약.,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. +alcanza por ahora.",,Sinulla ei selvästikään ole siihen nyt varaa.,"Manifestement, vous ne pouvez pas vous l'offrir.",,"Egyértelmű, hogy ezt nem tudod most kifizetni.","Ovviamente, ora non te lo puoi permettere.",明らかに、今買える余裕は無い。,"당연하겠지만, 아직 가질 수가 없겠네.",Dat kunt je zich natuurlijk nu niet veroorloven.,Det har du selvsagt ikke råd til akkurat nå!,"Oczywiście, nie możesz teraz tego kupić.",Obviamente você não pode comprar isso agora.,,"Evident, nu-ți poți permite asta chiar acum.","Похоже, тебе это не по карману.",,Uppenbarligen har du inte råd med den just nu.,Belli ki şu anda bunu karşılayamazsınız. +Clip of bullets,TXT_RPLY2_SCRIPT02_D9096_CLIPO,〃 (〃),,,Zásobník nábojů,Et patron-klip,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,,Egy tár töltény.,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Kulor i ett klipp,Mermi şarjörü +Thanks.,TXT_RYES2_SCRIPT02_D9096_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Köszi.,Grazie.,どうも。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. +"Come on, 10 gold.",TXT_RNO2_SCRIPT02_D9096_COMEO,〃 (〃),,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Na komm, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.",,"Rajta, 10 aranyat.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,"이봐, 그건 10 골드짜리라고.","Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." +Ammo box,TXT_RPLY3_SCRIPT02_D9096_AMMOB,〃 (〃),,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Bôite de balles,,Lőszeres doboz.,Scatola di munizioni,弾薬箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu +Here's your ammo.,TXT_RYES3_SCRIPT02_D9096_HERES,〃 (〃),,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,,Itt a lőszered.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 탄약.,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. Maybe some other time. Goodbye!,TXT_RNO3_SCRIPT02_D9096_MAYBE,〃 (〃),,,Možná někdy jindy. Nashledanou!,Måske en anden gang. Farvel!,Vielleicht ein anderes mal. Auf Wiedersehen!,,Eble alimomente. Ĝis!,"Puede que en otro momento. ¡Adiós!","Puede que en otro -momento. ¡Nos vemos!",Ehkä jokin toinen aika. Näkemiin!,"Peut être une autre fois, au revoir!",Talán majd valamikor máskor. Viszlát!,Sarà per un'altra volta. Arrivederci!,またの機会に、じゃあな!,다음번에 돈을 챙기고 예기하자. 잘 가!,Misschien een andere keer. Tot ziens!,Kanskje en annen gang. Adjø!,Może innym razem. Do widzenia!,Talvez outra hora. Até mais!,,Poate altădată. La revedere!,"Может, в другой раз. Пока!",,Kanske en annan gång. Adjö!,Belki başka bir zaman. Güle güle! -"Now that you have the flamethrower, is there anything else I can get you?",TXT_DLG_SCRIPT02_D10612_NOWTH,〃 (With flamethrower),,,"Teď když máš ten plamenomet, můžu pro tebe udělat něco jiného?","Nu hvor du har flammekasteren, er der så noget andet, jeg kan skaffe dig?","Jetzt wo du den Flammenwerfer hast, gibt es etwas anderes was ich dir besorgen kann?",,"Nun kiam vi havas la flamĵetilon, ĉu estas io alia, kion mi povus doni al vi?","Ahora que tienes el lanzallamas, ¿hay algo más que pueda ofrecerte?",,"Voisinko vielä jotenkin auttaa, nyt kun sinulla on liekinheitin?","Maintenant que vous avez le lance-flammes, est-ce que je peux faire quelque chose pour vous?","Most, hogy megkaptad a lángszórót is, tehetek még valamit érted?","Ora che hai il lanciafiamme, c'è qualcos'altro che ti posso dare?","火炎放射器を手に入れたが、 +momento. ¡Nos vemos!",Ehkä jokin toinen aika. Näkemiin!,"Peut être une autre fois, au revoir!",,Talán majd valamikor máskor. Viszlát!,Sarà per un'altra volta. Arrivederci!,またの機会に、じゃあな!,다음번에 돈을 챙기고 예기하자. 잘 가!,Misschien een andere keer. Tot ziens!,Kanskje en annen gang. Adjø!,Może innym razem. Do widzenia!,Talvez outra hora. Até mais!,,Poate altădată. La revedere!,"Может, в другой раз. Пока!",,Kanske en annan gång. Adjö!,Belki başka bir zaman. Güle güle! +"Now that you have the flamethrower, is there anything else I can get you?",TXT_DLG_SCRIPT02_D10612_NOWTH,〃 (With flamethrower),,,"Teď když máš ten plamenomet, můžu pro tebe udělat něco jiného?","Nu hvor du har flammekasteren, er der så noget andet, jeg kan skaffe dig?","Jetzt wo du den Flammenwerfer hast, gibt es etwas anderes was ich dir besorgen kann?",,"Nun kiam vi havas la flamĵetilon, ĉu estas io alia, kion mi povus doni al vi?","Ahora que tienes el lanzallamas, ¿hay algo más que pueda ofrecerte?",,"Voisinko vielä jotenkin auttaa, nyt kun sinulla on liekinheitin?","Maintenant que vous avez le lance-flammes, est-ce que je peux faire quelque chose pour vous?",,"Most, hogy megkaptad a lángszórót is, tehetek még valamit érted?","Ora che hai il lanciafiamme, c'è qualcos'altro che ti posso dare?","火炎放射器を手に入れたが、 他に必要な物はあるか?","이제 화염방사기를 얻었으니, 더 원하는 물품이 있나?","Nu je de vlammenwerper hebt, is er nog iets anders dat ik je kan bezorgen?","Nå som du har flammekasteren, er det noe annet jeg kan skaffe deg?","Jak już masz miotacz ognia, mogę coś jeszcze dla ciebie zrobić?",Agora que você tem o lança-chamas. Deseja mais alguma coisa?,,"Acum că ai aruncătorul de flăcări, mai pot să-ți aduc ceva?","Ну, огнемёт у тебя теперь есть. Могу я ещё чем-нибудь помочь?",,"Nu när du har flamkastaren, finns det något annat jag kan ge dig?","Artık alev makinen olduğuna göre, sana verebileceğim başka bir şey var mı?" -Assault gun,TXT_RPLY0_SCRIPT02_D10612_ASSAU,〃 (〃),,,Útočnou pušku,Angrebsvåben,Sturmgewehr,,Sturmofusilon,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,Gépfegyver,Fucile d'assalto,アサルトガン,돌격소총,Aanvalswapen,Stormgevær.,Karabin Szturmowy,Fuzil de assalto,,Armă de asalt,Штурмовую винтовку,,Anfallspistol,Saldırı silahı -Here you go.,TXT_RYES0_SCRIPT02_D10612_HEREY,〃 (〃),,,Tu máš.,Værsgo.,Bitte sehr!,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,Itt is van!,Ecco a te.,毎度あり。,여기 있어.,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Забирай!,,Varsågod.,Al bakalım. +Assault gun,TXT_RPLY0_SCRIPT02_D10612_ASSAU,〃 (〃),,,Útočnou pušku,Angrebsvåben,Sturmgewehr,,Sturmofusilon,Fusil de asalto,,Rynnäkkökivääri,Fusil d'Assaut,,Gépfegyver,Fucile d'assalto,アサルトガン,돌격소총,Aanvalswapen,Stormgevær.,Karabin Szturmowy,Fuzil de assalto,,Armă de asalt,Штурмовую винтовку,,Anfallspistol,Saldırı silahı +Here you go.,TXT_RYES0_SCRIPT02_D10612_HEREY,〃 (〃),,,Tu máš.,Værsgo.,Bitte sehr!,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,,Itt is van!,Ecco a te.,毎度あり。,여기 있어.,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Забирай!,,Varsågod.,Al bakalım. You can't afford that right now.,TXT_RNO0_SCRIPT02_D10612_YOUCA,〃 (〃),,,Tu si teď nemůžeš dovolit.,Den har du ikke råd til lige nu.,Das kannst du dir im Moment nicht leisten.,,"Vi nun ne havas -sufiĉe da oro.",No te alcanza por ahora.,,Sinulla ei ole siihen juuri nyt varaa.,Vous n'avez pas assez d'argent.,Erre jelenleg nincs pénzed.,Non hai abbastanza soldi.,今それを買える余裕は無い。,그럴 여유가 전혀 없는 것 같은데 말이지.,Dat kunt u zich nu niet veroorloven.,Det har du ikke råd til akkurat nå.,Nie możesz teraz tego kupić.,Você não pode comprar isso no momento.,,Nu-ți poți permite asta încă.,"Похоже, тебе это не по карману.",,Du har inte råd med den just nu.,Şu anda bunu karşılayamazsın. -Clip of bullets,TXT_RPLY1_SCRIPT02_D10612_CLIPO,〃 (〃),,,Zásobník nábojů,Et patron-klip,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,Egy tárnyi töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Kulor.,Mermi şarjörü -Thanks.,TXT_RYES1_SCRIPT02_D10612_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Köszi.,Grazie.,どうも。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. -"Come on, 10 gold.",TXT_RNO1_SCRIPT02_D10612_COMEO,〃 (〃),,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Komm schon, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.","Gyerünk, 10 aranyat.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,"이봐, 10 골드를 먼저 달라고.","Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." -Ammo box,TXT_RPLY2_SCRIPT02_D10612_AMMOB,〃 (〃),,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Boîte de balles,Töltényes doboz,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu -Here's your ammo.,TXT_RYES2_SCRIPT02_D10612_HERES,〃 (〃),,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,Itt a töltényed.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 네 탄약이야.,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. +sufiĉe da oro.",No te alcanza por ahora.,,Sinulla ei ole siihen juuri nyt varaa.,Vous n'avez pas assez d'argent.,,Erre jelenleg nincs pénzed.,Non hai abbastanza soldi.,今それを買える余裕は無い。,그럴 여유가 전혀 없는 것 같은데 말이지.,Dat kunt u zich nu niet veroorloven.,Det har du ikke råd til akkurat nå.,Nie możesz teraz tego kupić.,Você não pode comprar isso no momento.,,Nu-ți poți permite asta încă.,"Похоже, тебе это не по карману.",,Du har inte råd med den just nu.,Şu anda bunu karşılayamazsın. +Clip of bullets,TXT_RPLY1_SCRIPT02_D10612_CLIPO,〃 (〃),,,Zásobník nábojů,Et patron-klip,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,,Egy tárnyi töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Kulor.,Mermi şarjörü +Thanks.,TXT_RYES1_SCRIPT02_D10612_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Köszi.,Grazie.,どうも。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. +"Come on, 10 gold.",TXT_RNO1_SCRIPT02_D10612_COMEO,〃 (〃),,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Komm schon, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.",,"Gyerünk, 10 aranyat.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,"이봐, 10 골드를 먼저 달라고.","Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." +Ammo box,TXT_RPLY2_SCRIPT02_D10612_AMMOB,〃 (〃),,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Boîte de balles,,Töltényes doboz,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu +Here's your ammo.,TXT_RYES2_SCRIPT02_D10612_HERES,〃 (〃),,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,,Itt a töltényed.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 네 탄약이야.,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. Maybe some other time.,TXT_RNO2_SCRIPT02_D10612_MAYBE,〃 (〃),,,Možná někdy jindy.,Måske en anden gang.,Vielleicht ein anderes mal.,,Eble alimomente.,"Puede que en -otro momento.",,Ehkä joku toinen kerta.,Peut être une autre fois.,Talán Máskor.,Magari un'altra volta.,また後でな。,지금 말고. 아마도 나중에?,Misschien een andere keer.,Kanskje en annen gang.,Może innym razem.,Talvez outra hora.,,Poate altădată.,"Может, в другой раз.",,Kanske en annan gång.,Belki başka bir zaman. -"Now that you have the flamethrower, is there anything else I can get you?",TXT_DLG_SCRIPT02_D12128_NOWTH,〃 (〃),,,"Teď, když máš ten plamenomet, můžu pro tebe udělat něco jiného?","Nu hvor du har flammekasteren, er der så noget andet, jeg kan give dig?","Jetzt wo du den Flammenwerfer hast, gibt es etwas anderes was ich dir besorgen kann?",,"Nun kiam vi havas la flamĵetilon, ĉu estas io alia, kion mi povus doni al vi?","Ahora que tienes el lanzallamas, ¿hay algo más que pueda ofrecerte?",,"Nyt kun sinulla on liekinheitin, saisiko sinulle vielä olla jotain muuta?","Maintenant que vous avez le lance-flammes, est-ce que je peux faire quelque chose pour vous?","Most, hogy van egy lángszóród, van bármi más, amivel szolgáhatok?","Ora che hai il lanciafiamme, c'è qualcos'altro che ti posso dare?","火炎放射器を手に入れたが、 +otro momento.",,Ehkä joku toinen kerta.,Peut être une autre fois.,,Talán Máskor.,Magari un'altra volta.,また後でな。,지금 말고. 아마도 나중에?,Misschien een andere keer.,Kanskje en annen gang.,Może innym razem.,Talvez outra hora.,,Poate altădată.,"Может, в другой раз.",,Kanske en annan gång.,Belki başka bir zaman. +"Now that you have the flamethrower, is there anything else I can get you?",TXT_DLG_SCRIPT02_D12128_NOWTH,〃 (〃),,,"Teď, když máš ten plamenomet, můžu pro tebe udělat něco jiného?","Nu hvor du har flammekasteren, er der så noget andet, jeg kan give dig?","Jetzt wo du den Flammenwerfer hast, gibt es etwas anderes was ich dir besorgen kann?",,"Nun kiam vi havas la flamĵetilon, ĉu estas io alia, kion mi povus doni al vi?","Ahora que tienes el lanzallamas, ¿hay algo más que pueda ofrecerte?",,"Nyt kun sinulla on liekinheitin, saisiko sinulle vielä olla jotain muuta?","Maintenant que vous avez le lance-flammes, est-ce que je peux faire quelque chose pour vous?",,"Most, hogy van egy lángszóród, van bármi más, amivel szolgáhatok?","Ora che hai il lanciafiamme, c'è qualcos'altro che ti posso dare?","火炎放射器を手に入れたが、 他に必要な物はあるか?","이제 화염방사기를 얻었으니, 더 원하는 물품이 있나?","Nu je de vlammenwerper hebt, is er nog iets anders dat ik je kan bezorgen?","Nå som du har flammekasteren, er det noe annet jeg kan gi deg?","Jak już masz miotacz ognia, mogę coś jeszcze dla ciebie zrobić?",Agora que você tem o lança-chamas. Deseja mais alguma coisa?,,"Acum că ai aruncătorul de flăcări, mai pot să-ți aduc ceva?","Ну, огнемёт у тебя теперь есть. Могу я ещё чем-нибудь помочь?",,"Nu när du har flamkastaren, finns det något annat jag kan ge dig?","Artık alev silahın olduğuna göre, sana verebileceğim başka bir şey var mı?" -Clip of bullets,TXT_RPLY0_SCRIPT02_D12128_CLIPO,〃 (〃),,,Zásobník nábojů,Et patron-klip,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,Egy tárnyi töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Magasin med kulor,Bir şarjör mermi -Thanks.,TXT_RYES0_SCRIPT02_D12128_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Köszönöm,Grazie.,どうも。,고맙네.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. -"Come on, 10 gold.",TXT_RNO0_SCRIPT02_D12128_COMEO,〃 (〃),,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Na komm, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.","Gyerünk már, 10 aranyat.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,"이봐, 그건 10 골드라고.","Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." -Ammo box,TXT_RPLY1_SCRIPT02_D12128_AMMOB,〃 (〃),,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Bôite de balles,Lőszeres doboz.,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu -Here's your ammo.,TXT_RYES1_SCRIPT02_D12128_HERES,〃 (〃),,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,Itt a lőszered.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 탄약이야.,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. +Clip of bullets,TXT_RPLY0_SCRIPT02_D12128_CLIPO,〃 (〃),,,Zásobník nábojů,Et patron-klip,Gewehrmunition.,,Magazenon,Un cargador,,Luotilipas,Chargeur de balles,,Egy tárnyi töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler.,Magazynek,Carregador de balas,,Cartuș de gloanțe,Обойму патронов,,Magasin med kulor,Bir şarjör mermi +Thanks.,TXT_RYES0_SCRIPT02_D12128_THANK,〃 (〃),,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Köszönöm,Grazie.,どうも。,고맙네.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. +"Come on, 10 gold.",TXT_RNO0_SCRIPT02_D12128_COMEO,〃 (〃),,,"No tak, jen deset zlatých.","Kom nu, 10 guld.","Na komm, 10 Gold.",,"Nu, ĝi kostas dek da oro.","Vamos, que son diez de oro.",,"Antaa tulla, 10 kolikkoa.","Allez, 10 pièces.",,"Gyerünk már, 10 aranyat.","Avanti, 10 pezzi d'oro.",頼むぜ、10ゴールドだぞ。,"이봐, 그건 10 골드라고.","Kom op, 10 goud.","Kom igjen, 10 gull.","No weź, 10 monet.","Vamos lá, 10 de ouro.",,"Haide, 10 monezi de aur.","Ну же, 10 золотых.",,"Kom igen, 10 guld.","Hadi, 10 altın." +Ammo box,TXT_RPLY1_SCRIPT02_D12128_AMMOB,〃 (〃),,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Bôite de balles,,Lőszeres doboz.,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitie doos,Ammunisjonsboks,Pudło z amunicją,Caixa de balas,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu +Here's your ammo.,TXT_RYES1_SCRIPT02_D12128_HERES,〃 (〃),,,Tady je tvá munice.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,,Itt a lőszered.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 탄약이야.,Hier is je munitie.,Her er ammunisjonen din.,Oto twoja amunicja.,Aqui está a sua munição.,,Poftiți muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. Maybe some other time.,TXT_RNO1_SCRIPT02_D12128_MAYBE,〃 (〃),,,Možná někdy jindy.,Måske en anden gang.,Vielleicht ein anderes Mal.,,Eble alimomente.,"Puede que en -otro momento.",,Ehkä joku toinen kerta.,Peut être une autre fois.,Talán majd máskor.,Magari un'altra volta.,また後でな。,다음 번에 찾아와서 알려줘.,Misschien een andere keer.,Kanskje en annen gang.,Może innym razem.,Talvez outra hora.,,Poate altădată.,"Может, в другой раз.",,Kanske en annan gång.,Belki başka bir zaman. -Phosphor grenades,TXT_RPLY2_SCRIPT02_D12128_PHOSP,,,,Fosforové granáty,Phosphor granater,Phosphorgranaten,,Fosforajn grenadojn,Granadas de fósforo,,Fosforikranaatteja,Grenades phosphoriques,Foszforgránátok,Granate al Fosforo.,白リングレネード弾,소이 유탄,Fosforgranaten,Fosforgranater,Fosforowe granaty,Granadas de fósforo,,Grenade cu fosfor,Фосфорные гранаты,,Fosforgranater,Fosfor bombaları -Thanks.,TXT_RYES2_SCRIPT02_D12128_THANK,,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Kösz.,Grazie.,どうも。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. -You don't have enough,TXT_RNO2_SCRIPT02_D12128_YOUDO,,,,Nemáš u sebe dost.,Du har ikke nok,Du hast nicht genug,,Vi ne havas sufiĉe da mono.,No te alcanza.,,Sinulla ei ole riittävästi,Vous n'avez pas assez d'argent.,Nincs elég pénzed,Non hai abbastanza soldi.,十分な額じゃない,충분치 않아.,Je hebt niet genoeg...,Du har ikke nok,Nie wystarczy ci.,Você não tem o suficiente.,,Nu ai suficiente,Тебе не хватает на них.,,Du har inte tillräckligt med,Sende yeterince -Poison bolts,TXT_RPLY3_SCRIPT02_D12128_POISO,,,,Otrávené šípy,Giftbolte,Giftbolzen,,Venenajn sagojn,Flechas envenenadas,,Myrkkynuolia,Carreaux Empoisonnés,Mérgezett nyilak,Frecce avvelenate.,ポイズンボルト,맹독 볼트,Giftige bouten,Giftbolter,Zatrute bełty,Setas venenosas,,Bolțuri cu otravă,Отравленные болты,,Giftbultar.,Zehirli cıvatalar +otro momento.",,Ehkä joku toinen kerta.,Peut être une autre fois.,,Talán majd máskor.,Magari un'altra volta.,また後でな。,다음 번에 찾아와서 알려줘.,Misschien een andere keer.,Kanskje en annen gang.,Może innym razem.,Talvez outra hora.,,Poate altădată.,"Может, в другой раз.",,Kanske en annan gång.,Belki başka bir zaman. +Phosphor grenades,TXT_RPLY2_SCRIPT02_D12128_PHOSP,,,,Fosforové granáty,Phosphor granater,Phosphorgranaten,,Fosforajn grenadojn,Granadas de fósforo,,Fosforikranaatteja,Grenades phosphoriques,,Foszforgránátok,Granate al Fosforo.,白リングレネード弾,소이 유탄,Fosforgranaten,Fosforgranater,Fosforowe granaty,Granadas de fósforo,,Grenade cu fosfor,Фосфорные гранаты,,Fosforgranater,Fosfor bombaları +Thanks.,TXT_RYES2_SCRIPT02_D12128_THANK,,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Kösz.,Grazie.,どうも。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Благодарю.,,Tack.,Teşekkürler. +You don't have enough,TXT_RNO2_SCRIPT02_D12128_YOUDO,,,,Nemáš u sebe dost.,Du har ikke nok,Du hast nicht genug,,Vi ne havas sufiĉe da mono.,No te alcanza.,,Sinulla ei ole riittävästi,Vous n'avez pas assez d'argent.,,Nincs elég pénzed,Non hai abbastanza soldi.,十分な額じゃない,충분치 않아.,Je hebt niet genoeg...,Du har ikke nok,Nie wystarczy ci.,Você não tem o suficiente.,,Nu ai suficiente,Тебе не хватает на них.,,Du har inte tillräckligt med,Sende yeterince +Poison bolts,TXT_RPLY3_SCRIPT02_D12128_POISO,,,,Otrávené šípy,Giftbolte,Giftbolzen,,Venenajn sagojn,Flechas envenenadas,,Myrkkynuolia,Carreaux Empoisonnés,,Mérgezett nyilak,Frecce avvelenate.,ポイズンボルト,맹독 볼트,Giftige bouten,Giftbolter,Zatrute bełty,Setas venenosas,,Bolțuri cu otravă,Отравленные болты,,Giftbultar.,Zehirli cıvatalar Worth every gold!,TXT_RYES3_SCRIPT02_D12128_WORTH,,,,Ty se vyplatí!,Hvert et guld værd!,Jedes Goldstück wert!,,"Ili valoras po ĉiu monero!","¡Lo vale cada -moneda de oro!",,Joka kolikon väärti!,Ca vaut son prix!,Minden aranyat megér,Ne vale la pena!,値段に合う価値だぜ!,아주 가치가 있는 것이지!,Elk goud waard!,Verdt hvert gull!,Warte każdych pieniędzy!,Vale cada moeda de ouro!,,Merită fiecare bănuț!,Они того стоят!,,Värda varje guld!,Her altına değer! -"Come on, 200 gold!",TXT_RNO3_SCRIPT02_D12128_COMEO,,,,"No tak, 200 zlatých!","Kom nu, 200 guld!","Na komm, 200 Gold!",,"Nu, ili kostas 200 da oro.","Vamos, que son 200 de oro.",,"Antaa tulla, 200 kolikkoa!","Allez, 200 pièces!","Rajta, 200 arany!","Avanti, 200 pezzi d'oro!",頼むぜ、200ゴールドだぞ!,"이봐, 이건 200 골드라고!","Kom op, 200 goud!","Kom igjen, 200 gull!","No weź, 200 monet!","Vamos lá, 200 de ouro!",,"Haide, 200 monezi de aur!","Ну же, 200 золотых!",,"Kom igen, 200 guld!","Hadi, 200 altın!" -I can't believe that I got stuck with this duty. They say that something evil came up out of this sewer gate... Now I get to stand here until it comes up again!,TXT_DLG_SCRIPT02_D13644_ICANT,MAP02: Between governor's mansion and town hall.,,,"Nemůžu uvěřit, že jsem zkysnul s touhle prací. Řekli mi, že z téhle brány vylezlo něco zlého... A teď tady mám stát, dokud to znovu nevyleze!","Jeg kan ikke tro, at jeg blev sat til at have denne opgave. De siger, at noget ondt kom op af denne kloakport... Nu skal jeg stå her, indtil det kommer op igen!","Ich kann's nicht glauben dass ich diesen Dienst hier machen muss. Sie haben gesagt, dass etwas Böses aus dem Kanalisationstor gekommen ist... Nun muss ich hier stehen, bis es wieder kommt!",,"Mi ne povas kredi, ke mi estas blokita kun ĉi tiu tasko: Oni diras, ke malbonaĵo aperis el ĉi tiu pordo... kaj mi nun devas resti ĉi tie ĝis ĝi reaperos!",No puedo creer que haya quedado esclavizado con esta tarea: Dicen que algo maligno salió de esta compuerta... ¡y ahora tengo que quedarme aquí hasta que salga de nuevo!,,"Uskomatonta, että minulle tungettiin tämä tehtävä. Sanovat, että jokin paha nousi ylös tästä viemäriluukusta... Ja minä saan seistä tässä, kunnes se nousee jälleen!",J'arrive pas à croire que je me retrouve coincé ici. On me raconte qu'une chose maléfique est sortie de cette barrière des égouts.. Maintenant je me retrouve planté ici jusqu'a ce qu'elle revienne!,"Nem hiszem el, hogy én kaptam ezt a melót. Úgy hírlik, hogy valami gonosz bukkant fel itt a csatorna kapuja felől... Most addig fogok itt állni, amíg újra fel nem bukkan.",Non posso credere di aver accettato questo lavoro. Dicono che qualcosa di malvagio sia sbucato dalla chiusa delle fogne... E io devo stare qui finché non ritorna! ,"私がこの勤務で足止めとは信じられん。 +moneda de oro!",,Joka kolikon väärti!,Ca vaut son prix!,,Minden aranyat megér,Ne vale la pena!,値段に合う価値だぜ!,아주 가치가 있는 것이지!,Elk goud waard!,Verdt hvert gull!,Warte każdych pieniędzy!,Vale cada moeda de ouro!,,Merită fiecare bănuț!,Они того стоят!,,Värda varje guld!,Her altına değer! +"Come on, 200 gold!",TXT_RNO3_SCRIPT02_D12128_COMEO,,,,"No tak, 200 zlatých!","Kom nu, 200 guld!","Na komm, 200 Gold!",,"Nu, ili kostas 200 da oro.","Vamos, que son 200 de oro.",,"Antaa tulla, 200 kolikkoa!","Allez, 200 pièces!",,"Rajta, 200 arany!","Avanti, 200 pezzi d'oro!",頼むぜ、200ゴールドだぞ!,"이봐, 이건 200 골드라고!","Kom op, 200 goud!","Kom igjen, 200 gull!","No weź, 200 monet!","Vamos lá, 200 de ouro!",,"Haide, 200 monezi de aur!","Ну же, 200 золотых!",,"Kom igen, 200 guld!","Hadi, 200 altın!" +I can't believe that I got stuck with this duty. They say that something evil came up out of this sewer gate... Now I get to stand here until it comes up again!,TXT_DLG_SCRIPT02_D13644_ICANT,MAP02: Between governor's mansion and town hall.,,,"Nemůžu uvěřit, že jsem zkysnul s touhle prací. Řekli mi, že z téhle brány vylezlo něco zlého... A teď tady mám stát, dokud to znovu nevyleze!","Jeg kan ikke tro, at jeg blev sat til at have denne opgave. De siger, at noget ondt kom op af denne kloakport... Nu skal jeg stå her, indtil det kommer op igen!","Ich kann's nicht glauben dass ich diesen Dienst hier machen muss. Sie haben gesagt, dass etwas Böses aus dem Kanalisationstor gekommen ist... Nun muss ich hier stehen, bis es wieder kommt!",,"Mi ne povas kredi, ke mi estas blokita kun ĉi tiu tasko: Oni diras, ke malbonaĵo aperis el ĉi tiu pordo... kaj mi nun devas resti ĉi tie ĝis ĝi reaperos!",No puedo creer que haya quedado esclavizado con esta tarea: Dicen que algo maligno salió de esta compuerta... ¡y ahora tengo que quedarme aquí hasta que salga de nuevo!,,"Uskomatonta, että minulle tungettiin tämä tehtävä. Sanovat, että jokin paha nousi ylös tästä viemäriluukusta... Ja minä saan seistä tässä, kunnes se nousee jälleen!",J'arrive pas à croire que je me retrouve coincé ici. On me raconte qu'une chose maléfique est sortie de cette barrière des égouts.. Maintenant je me retrouve planté ici jusqu'a ce qu'elle revienne!,,"Nem hiszem el, hogy én kaptam ezt a melót. Úgy hírlik, hogy valami gonosz bukkant fel itt a csatorna kapuja felől... Most addig fogok itt állni, amíg újra fel nem bukkan.",Non posso credere di aver accettato questo lavoro. Dicono che qualcosa di malvagio sia sbucato dalla chiusa delle fogne... E io devo stare qui finché non ritorna! ,"私がこの勤務で足止めとは信じられん。 皆が下水ゲートから悪しきものが来たと言う。 再びドアが開くまで、ここで立ち往生だ!",내가 이 임무에 얽매였다는 게 믿기지 않아요. 사람들이 하수도 입구에서 뭔가 나타났다고 하던데... 이제 그게 다시 올 때까지 여기에서 서 있어야 한다니!,Ik kan niet geloven dat ik met deze plicht vast kwam te zitten. Ze zeggen dat er iets kwaadaardigs uit deze rioolpoort is gekomen.... Nu mag ik hier blijven staan tot het weer opduikt!,Jeg kan ikke tro at jeg ble sittende fast med denne plikten. De sier at noe ondt kom opp av denne kloakkporten... Nå må jeg stå her til det kommer opp igjen!,"Nie mogę uwierzyć, że zostałem z tym obowiązkiem. Mówią, że coś złego wyszło z tej bramy do kanałów... Teraz muszę tu stać aż się znów pojawi.",Não acredito que fiquei com essa tarefa. Dizem que algo horrível saiu dessa comporta de esgoto... Agora tenho que ficar aqui até que saia de novo!,,Nu-mi vine să cred că am rămas blocat cu meseria asta. Se zvonește că ceva malefic a ieșit la suprafată prin poarta canalului... Acum am ocazia să stau aici până se întoarce!,"Не могу поверить, что застрял на дежурстве. Они говорят, что какая-то пакость поднялась из этого люка... и теперь я должен стоять тут и ждать, пока она не появится снова!",,Jag kan inte fatta att jag fick den här uppgiften. Det sägs att något ondskefullt kom upp ur den här kloakporten... Nu får jag stå här tills det kommer upp igen!,Bu görevin bana kaldığına inanamıyorum. Bu kanalizasyon kapısından kötü bir şeyin çıktığını söylüyorlar. Şimdi o şey tekrar ortaya çıkana kadar burada duracağım! -What gate?,TXT_RPLY0_SCRIPT02_D13644_WHATG,〃,,,Jaké brány?,Hvilken port?,Welches Tor?,,Kio estas post la pordo?,¿De qué es la compuerta?,,Mikä luukku?,Quelle barrière?,Milyen Kapu?,Quale chiusa? ,何のゲートだ?,무슨 입구?,Welk hek?,Hvilken port?,Jakiej bramy?,Que comporta?,,Care poartă?,Какого люка?,,Vilken port?,Ne kapısı? +What gate?,TXT_RPLY0_SCRIPT02_D13644_WHATG,〃,,,Jaké brány?,Hvilken port?,Welches Tor?,,Kio estas post la pordo?,¿De qué es la compuerta?,,Mikä luukku?,Quelle barrière?,,Milyen Kapu?,Quale chiusa? ,何のゲートだ?,무슨 입구?,Welk hek?,Hvilken port?,Jakiej bramy?,Que comporta?,,Care poartă?,Какого люка?,,Vilken port?,Ne kapısı? The sewer overflow gate.,TXT_RYES0_SCRIPT02_D13644_THESE,〃,,,Odpadní přepadové brány.,Kloakoverløbsporten.,Das Überlauftor der Kanalisation.,,"La elflua truo -de la kloako.",Del pozo de la red cloacal.,,Viemärin ylivuotoluukku.,La barrière de débordement des égouts.,A csatorna kiárasztó kapuja.,La chiusa di contenimento delle fogne. ,下水道の溢水ゲートだ。,하수도 입구 말이에요.,Het riooloverloophek.,Kloakkoverløpsporten.,Bramy do kanałów.,A comporta de transborda de esgoto.,,Poarta de revărsare.,Канализационного люка перелива.,,Kloakens överflödsgrind.,Kanalizasyon taşma kapısı. -Hello friend. What can I get for you?,TXT_DLG_SCRIPT02_D15160_HELLO,MAP02: Weapons.,,,"Zdravím, příteli. Co pro vás můžu udělat?","Hej, min ven. Hvad kan jeg hjælpe dig med?","Hallo, Freund. Was darf es sein?",,"Saluton, amiko. Kion mi donu al vi?","Saludos, amigo. ¿Qué puedo ofrecerte?",,"Tervehdys, ystävä. Mitä saisi olla?","Bonjour mon ami, que puis-je faire pour vous?","Szervusz barátom, mit tehetnék érted?",Ehilà amico. Che posso darti? ,どうも同士よ。何か必要か?,안녕하십니까. 뭘 드릴까요?,Hallo vriend. Wat kan ik voor je halen?,"Hallo, min venn. Hva vil du ha?",Witaj kolego. Co mogę dla ciebie zrobić?,"Olá, amigo. Como posso ajudá-lo?",,Salut prietene. Ce pot să-ți aduc?,Здравствуй. Что-нибудь интересует?,,"Hej, min vän. Vad kan jag ge dig?",Merhaba dostum. Senin için ne yapabilirim? -Electric bolts,TXT_RPLY0_SCRIPT02_D15160_ELECT,〃,,,Elektrické šípy,Elektriske bolte,Elektrische Bolzen,,Elektrajn sagojn,Flechas eléctricas,,Sähkönuolia,Carreaux électriques,Elektromos nyilak.,Dardi elettrificati ,エレクトリックボルト,전격 볼트,Elektrische bouten,Elektriske bolter.,Elektryczne bełty,Setas elétricas,,Bolțuri electrice,Электрические болты,,Elektriska bultar,Elektrikli cıvata. -You got the electric bolts.,TXT_RYES0_SCRIPT02_D15160_YOUGO,〃,,,Tady je máte.,Du fik de elektriske bolte.,Du hast die elektrischen Bolzen erhalten.,,Jen la sagoj.,Aquí están las flechas.,,Sait sähkönuolet.,Vous recevez les carreaux électriques.,Megkaptad az elektromos nyilakat.,Hai preso dei dardi elettrificati ,エレクトリックボルト 入手。,전격 볼트를 받았습니다.,Je hebt de elektrische bouten.,Du har de elektriske boltene.,Masz elektryczne bełty.,Você pegou as setas elétricas,,Ai ridicat bolțurile electrice.,Вот твои электрические болты.,,Du fick elektriska bultar.,Elektrikli cıvatalar sende. -Ammo satchel,TXT_RPLY1_SCRIPT02_D15160_AMMOS,〃,,,Brašnu na munici,Ammotaske,Munitionstasche,,Sako da municioj,Bolso de municiones,,Ammusreppu,Sacoche de Munitions,Lőszeres táska.,Sacca di munizioni ,弾薬鞄,탄약 배낭,Munitie tasje,Ammunisjonsveske,Torba z amunicją,Mochila de munição,,Sacoșă cu muniție,Ранец боеприпасов,,Ammunitionsväska,Cephane çantası +de la kloako.",Del pozo de la red cloacal.,,Viemärin ylivuotoluukku.,La barrière de débordement des égouts.,,A csatorna kiárasztó kapuja.,La chiusa di contenimento delle fogne. ,下水道の溢水ゲートだ。,하수도 입구 말이에요.,Het riooloverloophek.,Kloakkoverløpsporten.,Bramy do kanałów.,A comporta de transborda de esgoto.,,Poarta de revărsare.,Канализационного люка перелива.,,Kloakens överflödsgrind.,Kanalizasyon taşma kapısı. +Hello friend. What can I get for you?,TXT_DLG_SCRIPT02_D15160_HELLO,MAP02: Weapons.,,,"Zdravím, příteli. Co pro vás můžu udělat?","Hej, min ven. Hvad kan jeg hjælpe dig med?","Hallo, Freund. Was darf es sein?",,"Saluton, amiko. Kion mi donu al vi?","Saludos, amigo. ¿Qué puedo ofrecerte?",,"Tervehdys, ystävä. Mitä saisi olla?","Bonjour mon ami, que puis-je faire pour vous?",,"Szervusz barátom, mit tehetnék érted?",Ehilà amico. Che posso darti? ,どうも同士よ。何か必要か?,안녕하십니까. 뭘 드릴까요?,Hallo vriend. Wat kan ik voor je halen?,"Hallo, min venn. Hva vil du ha?",Witaj kolego. Co mogę dla ciebie zrobić?,"Olá, amigo. Como posso ajudá-lo?",,Salut prietene. Ce pot să-ți aduc?,Здравствуй. Что-нибудь интересует?,,"Hej, min vän. Vad kan jag ge dig?",Merhaba dostum. Senin için ne yapabilirim? +Electric bolts,TXT_RPLY0_SCRIPT02_D15160_ELECT,〃,,,Elektrické šípy,Elektriske bolte,Elektrische Bolzen,,Elektrajn sagojn,Flechas eléctricas,,Sähkönuolia,Carreaux électriques,,Elektromos nyilak.,Dardi elettrificati ,エレクトリックボルト,전격 볼트,Elektrische bouten,Elektriske bolter.,Elektryczne bełty,Setas elétricas,,Bolțuri electrice,Электрические болты,,Elektriska bultar,Elektrikli cıvata. +You got the electric bolts.,TXT_RYES0_SCRIPT02_D15160_YOUGO,〃,,,Tady je máte.,Du fik de elektriske bolte.,Du hast die elektrischen Bolzen erhalten.,,Jen la sagoj.,Aquí están las flechas.,,Sait sähkönuolet.,Vous recevez les carreaux électriques.,,Megkaptad az elektromos nyilakat.,Hai preso dei dardi elettrificati ,エレクトリックボルト 入手。,전격 볼트를 받았습니다.,Je hebt de elektrische bouten.,Du har de elektriske boltene.,Masz elektryczne bełty.,Você pegou as setas elétricas,,Ai ridicat bolțurile electrice.,Вот твои электрические болты.,,Du fick elektriska bultar.,Elektrikli cıvatalar sende. +Ammo satchel,TXT_RPLY1_SCRIPT02_D15160_AMMOS,〃,,,Brašnu na munici,Ammotaske,Munitionstasche,,Sako da municioj,Bolso de municiones,,Ammusreppu,Sacoche de Munitions,,Lőszeres táska.,Sacca di munizioni ,弾薬鞄,탄약 배낭,Munitie tasje,Ammunisjonsveske,Torba z amunicją,Mochila de munição,,Sacoșă cu muniție,Ранец боеприпасов,,Ammunitionsväska,Cephane çantası No. You don't have what I want for the electric bolts!,TXT_RNO0_SCRIPT02_D15160_NOYOU,〃,,,"Ne. Nemáte, co za ně chci!","Nej. Du har ikke det, jeg vil have for de elektriske bolte!","Nein. Du hast nicht das, was ich für die elektrischen Pfeile haben möchte!",,"Ne, vi ne havas tiom, -kiom mi petas.","No, no tienes lo que pido.",,"Ei. Sinulla ei ole, mitä haluan sähkönuolista!","Non, vous n'avez pas ce qu'il me faut pour les carreaux électriques!","Nem. Neked nincs olyanod, ami nekem kéne az elektromos nyilakért.",No. Non hai quello che mi serve per i dardi elettrificati! ,いや。エレクトリックボルトに必要な物が足りない!,전격 볼트의 가격에 해당하는 게 전혀 없구먼!,Nee. Je hebt niet wat ik wil voor de elektrische bouten!,Nei. Du har ikke det jeg vil ha for de elektriske boltene!,"Nie. Nie masz tego co ja chcę, by dać ci elektryczne bełty.",Não. Você não tem o que eu quero pelas setas elétricas!,,Nu. Nu ai ceea ce doresc pentru bolțurile electrice!,Нет. У тебя нет денег на электрические болты!,,"Nej, du har inte det jag vill ha för elbultarna!",Hayır. Elektrikli cıvatalar için istediğim şey sizde yok! +kiom mi petas.","No, no tienes lo que pido.",,"Ei. Sinulla ei ole, mitä haluan sähkönuolista!","Non, vous n'avez pas ce qu'il me faut pour les carreaux électriques!",,"Nem. Neked nincs olyanod, ami nekem kéne az elektromos nyilakért.",No. Non hai quello che mi serve per i dardi elettrificati! ,いや。エレクトリックボルトに必要な物が足りない!,전격 볼트의 가격에 해당하는 게 전혀 없구먼!,Nee. Je hebt niet wat ik wil voor de elektrische bouten!,Nei. Du har ikke det jeg vil ha for de elektriske boltene!,"Nie. Nie masz tego co ja chcę, by dać ci elektryczne bełty.",Não. Você não tem o que eu quero pelas setas elétricas!,,Nu. Nu ai ceea ce doresc pentru bolțurile electrice!,Нет. У тебя нет денег на электрические болты!,,"Nej, du har inte det jag vill ha för elbultarna!",Hayır. Elektrikli cıvatalar için istediğim şey sizde yok! No. You don't have what I want for the electric bolts!,TXT_RNO0_SCRIPT02_D16676_NOYOU,〃,,,"Ne. Nemáte, co za ně chci!","Nej. Du har ikke det, jeg vil have til de elektriske bolte!","Nein. Du hast nicht das, was ich für die elektrischen Pfeile haben möchte!",,"Ne, vi ne havas tiom, -kiom mi petas.","No, no tienes lo que pido.",,"Ei. Sinulla ei ole, mitä haluan sähkönuolista!","Non, vous n'avez pas ce qu'il me faut pour les carreaux électriques!","Nem. Neked nincs olyanod, ami nekem kéne az elektromos nyilakért.",No. Non hai quello che mi serve per i dardi elettrificati! ,いや。エレクトリックボルトに必要な物が足りない!,전격 볼트의 가격에 맞춰서 흥정하시길.,Nee. Je hebt niet wat ik wil voor de elektrische bouten!,Nei. Du har ikke det jeg vil ha for de elektriske boltene!,"Nie. Nie masz tego co ja chcę, by dać ci elektryczne bełty.",Não. Você não tem o que eu quero pelas setas elétricas!,,Nu. Nu ai ceea ce doresc pentru bolțurile electrice!,Нет. У тебя нет денег на электрические болты!,,"Nej, du har inte det jag vill ha för elbultarna!",Hayır. Elektrikli cıvatalar için istediğim şey sizde yok! -Thank you. Anything else?,TXT_RYES1_SCRIPT02_D15160_THANK,〃,,,Děkuji. Něco dalšího?,Tak. Er der andet?,Danke. Sonst noch etwas?,,Dankon. Ĉu ion alian?,Gracias. ¿Algo más?,,Kiitos. Jotain muuta?,"Merci, Autre chose?",Köszönöm. Még valamit?,Grazie. Qualcos'altro? ,ありがとう。 他に何か?,감사합니다. 다른 건 없나요?,"Bedankt, nog iets anders?",Takk skal du ha. Var det noe mer?,Dziękuję. Coś jeszcze?,Agradeço. Mais alguma coisa?,,Mulțumesc. Mai dorești ceva?,Благодарю. Что-нибудь ещё?,,Tack. Något annat?,Teşekkür ederim. Başka bir şey var mı? +kiom mi petas.","No, no tienes lo que pido.",,"Ei. Sinulla ei ole, mitä haluan sähkönuolista!","Non, vous n'avez pas ce qu'il me faut pour les carreaux électriques!",,"Nem. Neked nincs olyanod, ami nekem kéne az elektromos nyilakért.",No. Non hai quello che mi serve per i dardi elettrificati! ,いや。エレクトリックボルトに必要な物が足りない!,전격 볼트의 가격에 맞춰서 흥정하시길.,Nee. Je hebt niet wat ik wil voor de elektrische bouten!,Nei. Du har ikke det jeg vil ha for de elektriske boltene!,"Nie. Nie masz tego co ja chcę, by dać ci elektryczne bełty.",Não. Você não tem o que eu quero pelas setas elétricas!,,Nu. Nu ai ceea ce doresc pentru bolțurile electrice!,Нет. У тебя нет денег на электрические болты!,,"Nej, du har inte det jag vill ha för elbultarna!",Hayır. Elektrikli cıvatalar için istediğim şey sizde yok! +Thank you. Anything else?,TXT_RYES1_SCRIPT02_D15160_THANK,〃,,,Děkuji. Něco dalšího?,Tak. Er der andet?,Danke. Sonst noch etwas?,,Dankon. Ĉu ion alian?,Gracias. ¿Algo más?,,Kiitos. Jotain muuta?,"Merci, Autre chose?",,Köszönöm. Még valamit?,Grazie. Qualcos'altro? ,ありがとう。 他に何か?,감사합니다. 다른 건 없나요?,"Bedankt, nog iets anders?",Takk skal du ha. Var det noe mer?,Dziękuję. Coś jeszcze?,Agradeço. Mais alguma coisa?,,Mulțumesc. Mai dorești ceva?,Благодарю. Что-нибудь ещё?,,Tack. Något annat?,Teşekkür ederim. Başka bir şey var mı? "You can't afford that, good day.",TXT_RNO1_SCRIPT02_D15160_YOUCA,〃,,,"To si nemůžete dovolit, přeji hezký den.","Det har du ikke råd til, god dag.",Das kannst du dir nicht leisten. Guten Tag.,,"Vi ne povas sen mono. Havu bonan tagon!","No te alcanza. -¡Ten un buen día!",,"Sinulla ei ole siihen varaa, hyvää päivänjatkoa.",Vous n'avez pas assez d'argent. Bonne journée.,Ezt most nem tudod kifizetni. Szép napot!,Non puoi permettertelo. Buona giornata. ,それを買える余裕は無い、また今度。,가질 수가 없는 것 같으니... 그럼 이만!,"Dat kun je je je niet veroorloven, goede dag.","Det har du ikke råd til, adjø.","Nie możesz tego kupić, miłego dnia.",Você não pode comprar isso. Tenha um bom dia.,,Nu îți permiți asta. O zi bună.,У тебя не хватает денег. Всего доброго.,,"Du har inte råd med det, god dag.","Bunu karşılayamazsınız, iyi günler." -What can I get for you?,TXT_DLG_SCRIPT02_D16676_WHATC,〃,,,Co vám mohu nabídnout?,Hvad kan jeg skaffe til dig?,Was darf es sein?,,Kion mi donu al vi?,¿Qué puedo ofrecerte?,,Mitä saisi olla?,Que puis-je faire pour vous?,Mivel szolgáhatok?,Che cosa posso darti? ,何か必要か?,"무엇을 구매하고 싶으신가요, 좋은 친구여?",Wat kan ik voor je halen?,Hva vil du ha?,Co mogę dla ciebie zrobić?,Como posso te ajudar?,,Ce pot să-ți aduc?,Чем могу быть полезен?,,Vad kan jag ge dig?,Sizin için ne alabilirim? -Electric bolts,TXT_RPLY0_SCRIPT02_D16676_ELECT,〃,,,Elektrické šípy,Elektriske bolte,Elektrische Bolzen,,Elektrajn sagojn,Flechas eléctricas,,Sähkönuolia,Carreaux électriques,Elektromos nyilak.,Dardi elettrificati ,エレクトリックボルト,전격 볼트,Elektrische bouten,Elektriske bolter.,Elektryczne bełty,Setas elétricas,,Bolțuri electrice,Электрические болты,,Elektriska bultar,Elektrikli cıvatalar. -You got the electric bolts.,TXT_RYES0_SCRIPT02_D16676_YOUGO,〃,,,Tady je máte.,Du fik de elektriske bolte.,Du hast die elektrischen Bolzen erhalten.,,Jen la sagoj.,Aquí están las flechas.,,Sait sähkönuolet.,Vous recevez les carreaux électriques.,Elektromos nyilakra tettél szert.,Hai preso dei dardi elettrificati ,エレクトリックボルト 入手。,전격 볼트를 구매했습니다.,Je hebt de elektrische bouten.,Du har elektriske bolter.,Masz elektryczne bełty.,Você pegou as setas elétricas,,Ai ridicat bolțurile electrice.,Вот твои электрические болты.,,Du har elektriska bultar.,Elektrikli cıvatalar sende. -Ammo satchel,TXT_RPLY1_SCRIPT02_D16676_AMMOS,〃,,,Brašnu na munici,Ammotaske.,Munitionstasche,,Sako da municioj,Bolso de municiones,,Ammusreppu,Sacoche de Munitions,Lőszeres hátizsák,Sacca di munizioni ,弾薬鞄,탄약 배낭,Munitie tasje,Ammunisjonsveske.,Torba z amunicją,Mochila de munição,,Sacoșă cu muniție,Ранец боеприпасов,,Ammunitionsväska,Cephane çantası -"Thank you, anything else?",TXT_RYES1_SCRIPT02_D16676_THANK,〃,,,Děkuji. Něco dalšího?,"Tak, andet?",Danke. Sonst noch etwas?,,Dankon. Ĉu ion alian?,Gracias. ¿Algo más?,,Kiitos. Jotain muuta?,"Merci, Autre chose?","Köszönöm, bármi mást?","Grazie, ti serve qualcos'altro?",ありがとう。 他に何か?,감사합니다. 다른 건 더 없나요?,"Bedankt, nog iets anders?","Takk, noe mer?","Dziękuję, coś jeszcze?",Agradeço. Mais alguma coisa?,,"Mulțumesc, mai dorești ceva?",Благодарю. Что-нибудь ещё?,,"Tack, något annat?","Teşekkürler, başka bir şey var mı?" +¡Ten un buen día!",,"Sinulla ei ole siihen varaa, hyvää päivänjatkoa.",Vous n'avez pas assez d'argent. Bonne journée.,,Ezt most nem tudod kifizetni. Szép napot!,Non puoi permettertelo. Buona giornata. ,それを買える余裕は無い、また今度。,가질 수가 없는 것 같으니... 그럼 이만!,"Dat kun je je je niet veroorloven, goede dag.","Det har du ikke råd til, adjø.","Nie możesz tego kupić, miłego dnia.",Você não pode comprar isso. Tenha um bom dia.,,Nu îți permiți asta. O zi bună.,У тебя не хватает денег. Всего доброго.,,"Du har inte råd med det, god dag.","Bunu karşılayamazsınız, iyi günler." +What can I get for you?,TXT_DLG_SCRIPT02_D16676_WHATC,〃,,,Co vám mohu nabídnout?,Hvad kan jeg skaffe til dig?,Was darf es sein?,,Kion mi donu al vi?,¿Qué puedo ofrecerte?,,Mitä saisi olla?,Que puis-je faire pour vous?,,Mivel szolgáhatok?,Che cosa posso darti? ,何か必要か?,"무엇을 구매하고 싶으신가요, 좋은 친구여?",Wat kan ik voor je halen?,Hva vil du ha?,Co mogę dla ciebie zrobić?,Como posso te ajudar?,,Ce pot să-ți aduc?,Чем могу быть полезен?,,Vad kan jag ge dig?,Sizin için ne alabilirim? +Electric bolts,TXT_RPLY0_SCRIPT02_D16676_ELECT,〃,,,Elektrické šípy,Elektriske bolte,Elektrische Bolzen,,Elektrajn sagojn,Flechas eléctricas,,Sähkönuolia,Carreaux électriques,,Elektromos nyilak.,Dardi elettrificati ,エレクトリックボルト,전격 볼트,Elektrische bouten,Elektriske bolter.,Elektryczne bełty,Setas elétricas,,Bolțuri electrice,Электрические болты,,Elektriska bultar,Elektrikli cıvatalar. +You got the electric bolts.,TXT_RYES0_SCRIPT02_D16676_YOUGO,〃,,,Tady je máte.,Du fik de elektriske bolte.,Du hast die elektrischen Bolzen erhalten.,,Jen la sagoj.,Aquí están las flechas.,,Sait sähkönuolet.,Vous recevez les carreaux électriques.,,Elektromos nyilakra tettél szert.,Hai preso dei dardi elettrificati ,エレクトリックボルト 入手。,전격 볼트를 구매했습니다.,Je hebt de elektrische bouten.,Du har elektriske bolter.,Masz elektryczne bełty.,Você pegou as setas elétricas,,Ai ridicat bolțurile electrice.,Вот твои электрические болты.,,Du har elektriska bultar.,Elektrikli cıvatalar sende. +Ammo satchel,TXT_RPLY1_SCRIPT02_D16676_AMMOS,〃,,,Brašnu na munici,Ammotaske.,Munitionstasche,,Sako da municioj,Bolso de municiones,,Ammusreppu,Sacoche de Munitions,,Lőszeres hátizsák,Sacca di munizioni ,弾薬鞄,탄약 배낭,Munitie tasje,Ammunisjonsveske.,Torba z amunicją,Mochila de munição,,Sacoșă cu muniție,Ранец боеприпасов,,Ammunitionsväska,Cephane çantası +"Thank you, anything else?",TXT_RYES1_SCRIPT02_D16676_THANK,〃,,,Děkuji. Něco dalšího?,"Tak, andet?",Danke. Sonst noch etwas?,,Dankon. Ĉu ion alian?,Gracias. ¿Algo más?,,Kiitos. Jotain muuta?,"Merci, Autre chose?",,"Köszönöm, bármi mást?","Grazie, ti serve qualcos'altro?",ありがとう。 他に何か?,감사합니다. 다른 건 더 없나요?,"Bedankt, nog iets anders?","Takk, noe mer?","Dziękuję, coś jeszcze?",Agradeço. Mais alguma coisa?,,"Mulțumesc, mai dorești ceva?",Благодарю. Что-нибудь ещё?,,"Tack, något annat?","Teşekkürler, başka bir şey var mı?" "You can't afford that, good day to you!",TXT_RNO1_SCRIPT02_D16676_YOUCA,〃,,,"To si nemůžete dovolit, přeji hezký den.","Det har du ikke råd til, god dag til dig!",Das kannst du dir nicht leisten. Guten Tag!,,"Vi ne povas sen mono. Havu bonan tagon!","No te alcanza. -¡Ten un buen día!",,"Sinulla ei ole siihen varaa, hyvää päivänjatkoa.",Vous n'avez pas assez d'argent. Bonne journée.,"Nincs elég pénzed arra, további jó napot neked!",Non puoi permettertelo. Buona giornata a te!,それを買える余裕は無い、また今度。,살 돈이 부족하신가요? 그럼 갈 길 가시길!,"Dat kunt u zich niet veroorloven, een goede dag voor je!","Det har du ikke råd til, ha en god dag!","Nie możesz tego kupić, życzę miłego dnia!",Você não pode comprar isso. Um bom dia pra você!,,Nu-ți poți permite asta. O zi bună îți doresc!,У тебя не хватает денег. Всего доброго!,,"Du har inte råd med det, god dag till dig!","Bunu karşılayamazsınız, size iyi günler!" -Welcome. What may I show you?,TXT_DLG_SCRIPT02_D18192_WELCO,MAP02: Armory.,,,Vítejte. Co vám mohu nabídnout?,Velkommen. Hvad må jeg vise dig?,Willkommen. Was kann ich dirZeigen.,,Bonvenon. Kion mi montru al vi?,Bienvenido. ¿Qué te muestro?,,Tervetuloa. Mitä haluaisitte vilkaista?,"Bienvenue, que souhaitez vous?",Üdvözletem! Miben segíthetek?,Benvenuto. Cosa posso mostrarti?,ようこそ、何を見ていきますか?,환영합니다! 보여드릴 게 아주 많아요.,Welkom. Wat kan ik je laten zien?,Velkommen. Hva kan jeg vise deg?,"Witaj. Co mogę ci pokazać? +¡Ten un buen día!",,"Sinulla ei ole siihen varaa, hyvää päivänjatkoa.",Vous n'avez pas assez d'argent. Bonne journée.,,"Nincs elég pénzed arra, további jó napot neked!",Non puoi permettertelo. Buona giornata a te!,それを買える余裕は無い、また今度。,살 돈이 부족하신가요? 그럼 갈 길 가시길!,"Dat kunt u zich niet veroorloven, een goede dag voor je!","Det har du ikke råd til, ha en god dag!","Nie możesz tego kupić, życzę miłego dnia!",Você não pode comprar isso. Um bom dia pra você!,,Nu-ți poți permite asta. O zi bună îți doresc!,У тебя не хватает денег. Всего доброго!,,"Du har inte råd med det, god dag till dig!","Bunu karşılayamazsınız, size iyi günler!" +Welcome. What may I show you?,TXT_DLG_SCRIPT02_D18192_WELCO,MAP02: Armory.,,,Vítejte. Co vám mohu nabídnout?,Velkommen. Hvad må jeg vise dig?,Willkommen. Was kann ich dirZeigen.,,Bonvenon. Kion mi montru al vi?,Bienvenido. ¿Qué te muestro?,,Tervetuloa. Mitä haluaisitte vilkaista?,"Bienvenue, que souhaitez vous?",,Üdvözletem! Miben segíthetek?,Benvenuto. Cosa posso mostrarti?,ようこそ、何を見ていきますか?,환영합니다! 보여드릴 게 아주 많아요.,Welkom. Wat kan ik je laten zien?,Velkommen. Hva kan jeg vise deg?,"Witaj. Co mogę ci pokazać? ",Saudações. O que posso te mostrar?,,Bun venit. Ce aș putea să-ți arăt?,Здравствуй. Что-нибудь интересует?,,Välkommen. Vad får jag visa dig?,Hoş geldiniz. Size ne gösterebilirim? -Environmental suit,TXT_RPLY0_SCRIPT02_D18192_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison hazmat,Természetálló öltözet,Tuta ambientale,耐環境スーツ,환경 방호복,Milieupak,Miljødrakt,Skafander Ochronny,Traje de proteção,,Costum de protecție,Защитный костюм,,Miljödräkt,Çevre kıyafeti. -"Well, here you are.",TXT_RYES0_SCRIPT02_D18192_WELLH,〃,,,"Tak, tady to je.","Nå, værsgo.",Bitte sehr.,,"Nu, jen.","Bueno, toma.",,"Kas tässä, olkaa hyvä.",Voilà pour vous.,"Nos, tessék.","Bene, ecco a te.",はい、これをどうぞ。,"자, 여기있습니다.","Nou, hier ben je dan.",Vær så god.,"Proszę, masz.","Muito bem, aqui está.",,Poftiți.,"Хорошо, бери.",,"Ja, här är du.",İşte buradasın. +Environmental suit,TXT_RPLY0_SCRIPT02_D18192_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison hazmat,,Természetálló öltözet,Tuta ambientale,耐環境スーツ,환경 방호복,Milieupak,Miljødrakt,Skafander Ochronny,Traje de proteção,,Costum de protecție,Защитный костюм,,Miljödräkt,Çevre kıyafeti. +"Well, here you are.",TXT_RYES0_SCRIPT02_D18192_WELLH,〃,,,"Tak, tady to je.","Nå, værsgo.",Bitte sehr.,,"Nu, jen.","Bueno, toma.",,"Kas tässä, olkaa hyvä.",Voilà pour vous.,,"Nos, tessék.","Bene, ecco a te.",はい、これをどうぞ。,"자, 여기있습니다.","Nou, hier ben je dan.",Vær så god.,"Proszę, masz.","Muito bem, aqui está.",,Poftiți.,"Хорошо, бери.",,"Ja, här är du.",İşte buradasın. I'm sorry but you don't have enough money for that.,TXT_RNO0_SCRIPT02_D18192_IMSOR,〃,,,"Promiňte, ale na ten nemáte dost peněz.","Jeg beklager, men du har ikke penge nok til det.","Es tut mir Leid, aber du hast nicht genug Geld dabei.",,"Pardonon, sed vi ne -havas sufiĉe da mono.","Lo siento, pero no te alcanza.",,Valitettavasti teillä ei ole siihen riittävästi rahaa.,Je suis désolé mais vous n'avez pas assez d'argent.,"Sajnálom, de nincs elég pénzed erre.","Mi spiace, ma non hai abbastanza soldi per questo.",すみませんが、貴方は十分なお金を持っていません。,"죄송합니다만, 그걸 사기엔 돈이 부족해 보입니다.","Het spijt me, maar daar heb je niet genoeg geld voor.","Beklager, men du har ikke nok penger til det.","Przepraszam, ale nie masz wystarczająco dużo monet, aby to kupić.","Sinto muito, mas você não tem dinheiro suficiente para isso.",,"Îmi pare rău, dar nu ai suficienți bani pentru asta.","Извини, но у тебя не хватает денег.",,Jag är ledsen men du har inte tillräckligt med pengar för det.,Üzgünüm ama bunun için yeterli paranız yok. -Leather armor,TXT_RPLY1_SCRIPT02_D18192_LEATH,〃,,Leather armour,Kožené brnění,Læderrustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure en cuir,Bőr páncél,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren pantser,Skinnpanser,Skórzany Pancerz,Armadura de couro,,Armură din piele,Кожаная броня,,Läderrustning,Deri zırh -Here you are.,TXT_RYES1_SCRIPT02_D18192_HEREY,〃,,,Tady máte.,Værsgo.,Bitte sehr.,,Jen.,Toma.,,"Tässä, olkaa hyvä.",Voilà pour vous.,Tessék.,Ecco qua.,これをどうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Держи.,,Här har du.,Buyurun. -Perhaps some other time?,TXT_RNO1_SCRIPT02_D18192_PERHA,〃,,,Možná někdy jindy?,Måske en anden gang?,Vielleicht ein anderes Mal?,,Ĉu eble alian fojon?,¿Quizás en otra ocasión?,¿Tal vez en otra ocasión?,Ehkä joskus toiste?,Peut être une autre fois?,Esetleg talán máskor?,"Magari un'altra volta, va bene?",また別の機会に?,아마 나중에 사야 할 것 같은데?,Misschien een andere keer?,Kanskje en annen gang?,Może innym razem?,Talvez uma outra hora?,,Poate altădată?,"Может, в следующий раз?",,Kanske en annan gång?,Belki başka bir zaman? -Metal armor,TXT_RPLY2_SCRIPT02_D18192_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure en Métal,Fémpáncél,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowy Pancerz,Armadura de metal,,Armură din metal,Металлическая броня,,Metallrustning,Metal zırh +havas sufiĉe da mono.","Lo siento, pero no te alcanza.",,Valitettavasti teillä ei ole siihen riittävästi rahaa.,Je suis désolé mais vous n'avez pas assez d'argent.,,"Sajnálom, de nincs elég pénzed erre.","Mi spiace, ma non hai abbastanza soldi per questo.",すみませんが、貴方は十分なお金を持っていません。,"죄송합니다만, 그걸 사기엔 돈이 부족해 보입니다.","Het spijt me, maar daar heb je niet genoeg geld voor.","Beklager, men du har ikke nok penger til det.","Przepraszam, ale nie masz wystarczająco dużo monet, aby to kupić.","Sinto muito, mas você não tem dinheiro suficiente para isso.",,"Îmi pare rău, dar nu ai suficienți bani pentru asta.","Извини, но у тебя не хватает денег.",,Jag är ledsen men du har inte tillräckligt med pengar för det.,Üzgünüm ama bunun için yeterli paranız yok. +Leather armor,TXT_RPLY1_SCRIPT02_D18192_LEATH,〃,,Leather armour,Kožené brnění,Læderrustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure en cuir,,Bőr páncél,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren pantser,Skinnpanser,Skórzany Pancerz,Armadura de couro,,Armură din piele,Кожаная броня,,Läderrustning,Deri zırh +Here you are.,TXT_RYES1_SCRIPT02_D18192_HEREY,〃,,,Tady máte.,Værsgo.,Bitte sehr.,,Jen.,Toma.,,"Tässä, olkaa hyvä.",Voilà pour vous.,,Tessék.,Ecco qua.,これをどうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Держи.,,Här har du.,Buyurun. +Perhaps some other time?,TXT_RNO1_SCRIPT02_D18192_PERHA,〃,,,Možná někdy jindy?,Måske en anden gang?,Vielleicht ein anderes Mal?,,Ĉu eble alian fojon?,¿Quizás en otra ocasión?,¿Tal vez en otra ocasión?,Ehkä joskus toiste?,Peut être une autre fois?,,Esetleg talán máskor?,"Magari un'altra volta, va bene?",また別の機会に?,아마 나중에 사야 할 것 같은데?,Misschien een andere keer?,Kanskje en annen gang?,Może innym razem?,Talvez uma outra hora?,,Poate altădată?,"Может, в следующий раз?",,Kanske en annan gång?,Belki başka bir zaman? +Metal armor,TXT_RPLY2_SCRIPT02_D18192_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure en Métal,,Fémpáncél,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowy Pancerz,Armadura de metal,,Armură din metal,Металлическая броня,,Metallrustning,Metal zırh Wear it in good health.,TXT_RYES2_SCRIPT02_D18192_WEARI,"〃 -(in good health = enjoy)",,,Noste jej ve zdraví.,Bær den ved godt helbred.,Trage sie mit Stolz.,,Ĝuu ĝin.,Disfrútala.,,Kaikin voimin pukeutukaa.,Portez la bien.,Viseld jó egészséggel!,Che possa esserti utile!,着ると安心しますよ。,건강하게 입으세요.,Draag het in goede gezondheid.,Bruk den med god helse.,Bądź zdrów nosząc go.,Vista ela com orgulho.,,Să o porți sănătos.,Носи на здоровье.,,Bär den vid god hälsa.,Sağlıkla giy. +(in good health = enjoy)",,,Noste jej ve zdraví.,Bær den ved godt helbred.,Trage sie mit Stolz.,,Ĝuu ĝin.,Disfrútala.,,Kaikin voimin pukeutukaa.,Portez la bien.,,Viseld jó egészséggel!,Che possa esserti utile!,着ると安心しますよ。,건강하게 입으세요.,Draag het in goede gezondheid.,Bruk den med god helse.,Bądź zdrów nosząc go.,Vista ela com orgulho.,,Să o porți sănătos.,Носи на здоровье.,,Bär den vid god hälsa.,Sağlıkla giy. Come back when you can afford to buy something you lout!,TXT_RNO2_SCRIPT02_D18192_COMEB,〃,,,"Vrať se, až si budeš moct něco dovolit, troubo!","Kom tilbage, når du har råd til at købe noget, din slyngel!","Komm zurück wenn du dir etwas leisten kannst, du Rüpel!",,"Revenu kiam vi povos aĉeti ion, stultulo!","¡Vuelve cuando puedas -comprar algo, zopenco! ",,"Palataan asiaan, kun teidän on mahdollista ostaa jotain himoitsemaanne.","Revenez quand vous avez de l'argent, rustre!","Majd akkor gyere vissza, ha lesz pénzed megvenni bármit is, te fajankó!","Ritorna quando potrai permetterti di comprare le cose, cafone!",余裕がある時にまたどうぞ!,뭔가를 살 여유가 있을 때 오세요!,Kom terug wanneer je het je kunt veroorloven om iets te kopen wat je louteren kunt!,"Kom tilbake når du har råd til å kjøpe noe, din lømmel!",Wróć kiedy będziesz mógł coś kupić prostaku!,"Volte quando você puder comprar algo, seu caloteiro!",,"Revin-o când o să ai bani să poți cumpăra ceva, secătură!","Возвращайся, когда сможешь позволить себе купить что-нибудь, придурок!",,"Kom tillbaka när du har råd att köpa något, din tölp!",Bir şeyler almaya gücün yettiğinde geri gel! -Welcome. What may I show you?,TXT_DLG_SCRIPT02_D19708_WELCO,,,,Vítejte. Co vám mohu nabídnout?,Velkommen. Hvad må jeg vise dig?,Willkommen. Was kann ich dir zeigen.,,Bonvenon. Kion mi montru al vi?,Bienvenido. ¿Qué te muestro?,,Tervetuloa. Mitä haluaisitte vilkaista?,"Bienvenue, que souhaitez vous?","Üdvözlet, mire volnál kíváncsi?",Benvenuto. Cosa posso mostrarti?,ようこそ、何をお探しで?,어서 오십시오. 어떤 걸 보여드릴까요?,Welkom. Wat kan ik je laten zien?,Velkommen. Hva kan jeg vise deg?,"Witaj. Co mogę ci pokazać? +comprar algo, zopenco! ",,"Palataan asiaan, kun teidän on mahdollista ostaa jotain himoitsemaanne.","Revenez quand vous avez de l'argent, rustre!",,"Majd akkor gyere vissza, ha lesz pénzed megvenni bármit is, te fajankó!","Ritorna quando potrai permetterti di comprare le cose, cafone!",余裕がある時にまたどうぞ!,뭔가를 살 여유가 있을 때 오세요!,Kom terug wanneer je het je kunt veroorloven om iets te kopen wat je louteren kunt!,"Kom tilbake når du har råd til å kjøpe noe, din lømmel!",Wróć kiedy będziesz mógł coś kupić prostaku!,"Volte quando você puder comprar algo, seu caloteiro!",,"Revin-o când o să ai bani să poți cumpăra ceva, secătură!","Возвращайся, когда сможешь позволить себе купить что-нибудь, придурок!",,"Kom tillbaka när du har råd att köpa något, din tölp!",Bir şeyler almaya gücün yettiğinde geri gel! +Welcome. What may I show you?,TXT_DLG_SCRIPT02_D19708_WELCO,,,,Vítejte. Co vám mohu nabídnout?,Velkommen. Hvad må jeg vise dig?,Willkommen. Was kann ich dir zeigen.,,Bonvenon. Kion mi montru al vi?,Bienvenido. ¿Qué te muestro?,,Tervetuloa. Mitä haluaisitte vilkaista?,"Bienvenue, que souhaitez vous?",,"Üdvözlet, mire volnál kíváncsi?",Benvenuto. Cosa posso mostrarti?,ようこそ、何をお探しで?,어서 오십시오. 어떤 걸 보여드릴까요?,Welkom. Wat kan ik je laten zien?,Velkommen. Hva kan jeg vise deg?,"Witaj. Co mogę ci pokazać? ",Saudações. O que posso te mostrar?,,Bun venit. Ce aș putea să-ți arăt?,Здравствуй. Что-нибудь интересует?,,Välkommen. Vad får jag visa dig?,Hoş geldiniz. Size ne gösterebilirim? -Environmental suit,TXT_RPLY0_SCRIPT02_D19708_ENVIR,,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison hazmat,Természetálló öltözet,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Skafander Ochronny,Traje de proteção,,Costum de protecție,Защитный костюм,,Miljödräkt,Çevre kıyafeti -"Well, here you are.",TXT_RYES0_SCRIPT02_D19708_WELLH,,,,"Tak, tady to je.","Nå, værsgo.",Bitte sehr.,,"Nu, jen.","Bueno, toma.",,"Kas tässä, olkaa hyvä.",Voilà pour vous.,"Nos, íme.","Bene, ecco a te.",では、これをどうぞ。,"자, 여기 있습니다.","Nou, hier ben je dan.",Vær så god.,"Proszę, masz.","Muito bem, aqui está.",,Poftiți.,"Хорошо, бери.",,"Ja, här är du.",İşte buradasın. +Environmental suit,TXT_RPLY0_SCRIPT02_D19708_ENVIR,,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison hazmat,,Természetálló öltözet,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Skafander Ochronny,Traje de proteção,,Costum de protecție,Защитный костюм,,Miljödräkt,Çevre kıyafeti +"Well, here you are.",TXT_RYES0_SCRIPT02_D19708_WELLH,,,,"Tak, tady to je.","Nå, værsgo.",Bitte sehr.,,"Nu, jen.","Bueno, toma.",,"Kas tässä, olkaa hyvä.",Voilà pour vous.,,"Nos, íme.","Bene, ecco a te.",では、これをどうぞ。,"자, 여기 있습니다.","Nou, hier ben je dan.",Vær så god.,"Proszę, masz.","Muito bem, aqui está.",,Poftiți.,"Хорошо, бери.",,"Ja, här är du.",İşte buradasın. I'm sorry but you don't have enough money for that.,TXT_RNO0_SCRIPT02_D19708_IMSOR,,,,"Promiňte, ale na ten nemáte dost peněz.","Jeg beklager, men du har ikke penge nok til det.","Es tut mir Leid, aber du hast nicht genug Geld dabei.",,"Pardonon, sed vi ne -havas sufiĉe da mono.","Lo siento, pero no te alcanza.",,Valitettavasti teillä ei ole siihen riittävästi rahaa.,Je suis désolé mais vous n'avez pas assez d'argent.,"Sajnálom, de Önnek nem áll módjában kifizetni ezt.","Mi spiace, ma non hai abbastanza soldi per questo.",すみませんが、貴方は十分なお金を持っていません。,"미안하지만, 구매하기 위한 돈이 부족하신 것 같군요.","Het spijt me, maar daar heb je niet genoeg geld voor.","Beklager, men du har ikke nok penger til det.","Przepraszam, ale nie masz wystarczająco dużo monet, aby to kupić.","Sinto muito, mas você não tem dinheiro suficiente para isso.",,"Îmi pare rău, dar nu ai suficienți bani pentru asta.","Извини, но у тебя не хватает денег.",,"Jag är ledsen, men du har inte tillräckligt med pengar för det.",Üzgünüm ama bunun için yeterli paranız yok. -Leather armor,TXT_RPLY1_SCRIPT02_D19708_LEATH,,,Leather armour,Kožené brnění,Læderrustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure en cuir,Bőr páncél,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Lær rustning,Skórzany Pancerz,Armadura de couro,,Armură din piele,Кожаная броня,,Läderrustning,Deri zırh -Here you are.,TXT_RYES1_SCRIPT02_D19708_HEREY,,,,Tady máte.,Værsgo.,Bitte sehr.,,Jen.,Toma.,,"Tässä, olkaa hyvä.",Voilà pour vous.,Tessék,Ecco qua.,これをどうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Держи.,,Här har du.,Buyurun. -Perhaps some other time?,TXT_RNO1_SCRIPT02_D19708_PERHA,,,,Možná někdy jindy?,Måske en anden gang?,Vielleicht ein anderes Mal?,,Ĉu eble alian fojon?,¿Quizás en otra ocasión?,¿Tal vez en otra ocasión?,Ehkä joskus toiste?,Peut être une autre fois?,Talán majd máskor?,"Magari un'altra volta, va bene?",また別の機会に?,나중에 돈을 모아서 구매하세요.,Misschien een andere keer?,Kanskje en annen gang?,Może innym razem?,Talvez uma outra hora?,,Poate altădată?,"Может, в следующий раз?",,Kanske en annan gång?,Belki başka bir zaman? -Metal armor,TXT_RPLY2_SCRIPT02_D19708_METAL,,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure en Métal,Fém páncél,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowy Pancerz,Armadura de metal,,Armură din metal,Металлическая броня,,Metallrustning,Metal zırh -Wear it in good health.,TXT_RYES2_SCRIPT02_D19708_WEARI,(in good health = enjoy),,,Noste jej ve zdraví.,Bær den ved godt helbred.,Trage sie mit Stolz.,,Ĝuu ĝin.,Disfrútala.,,Käyttäkää hyvällä omallatunnolla.,Portez la bien.,Viseld jó egészséggel!,Che possa esserti utile!,着ると安心しますよ。,믿고 입으셔도 됩니다.,Draag het in goede gezondheid.,Bruk den med god helse.,Bądź zdrów nosząc go.,Vista ela com orgulho.,,Să o porți sănătos.,Носи на здоровье.,,Bär den vid god hälsa.,Sağlıkla giy. +havas sufiĉe da mono.","Lo siento, pero no te alcanza.",,Valitettavasti teillä ei ole siihen riittävästi rahaa.,Je suis désolé mais vous n'avez pas assez d'argent.,,"Sajnálom, de Önnek nem áll módjában kifizetni ezt.","Mi spiace, ma non hai abbastanza soldi per questo.",すみませんが、貴方は十分なお金を持っていません。,"미안하지만, 구매하기 위한 돈이 부족하신 것 같군요.","Het spijt me, maar daar heb je niet genoeg geld voor.","Beklager, men du har ikke nok penger til det.","Przepraszam, ale nie masz wystarczająco dużo monet, aby to kupić.","Sinto muito, mas você não tem dinheiro suficiente para isso.",,"Îmi pare rău, dar nu ai suficienți bani pentru asta.","Извини, но у тебя не хватает денег.",,"Jag är ledsen, men du har inte tillräckligt med pengar för det.",Üzgünüm ama bunun için yeterli paranız yok. +Leather armor,TXT_RPLY1_SCRIPT02_D19708_LEATH,,,Leather armour,Kožené brnění,Læderrustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure en cuir,,Bőr páncél,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Lær rustning,Skórzany Pancerz,Armadura de couro,,Armură din piele,Кожаная броня,,Läderrustning,Deri zırh +Here you are.,TXT_RYES1_SCRIPT02_D19708_HEREY,,,,Tady máte.,Værsgo.,Bitte sehr.,,Jen.,Toma.,,"Tässä, olkaa hyvä.",Voilà pour vous.,,Tessék,Ecco qua.,これをどうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Poftiți.,Держи.,,Här har du.,Buyurun. +Perhaps some other time?,TXT_RNO1_SCRIPT02_D19708_PERHA,,,,Možná někdy jindy?,Måske en anden gang?,Vielleicht ein anderes Mal?,,Ĉu eble alian fojon?,¿Quizás en otra ocasión?,¿Tal vez en otra ocasión?,Ehkä joskus toiste?,Peut être une autre fois?,,Talán majd máskor?,"Magari un'altra volta, va bene?",また別の機会に?,나중에 돈을 모아서 구매하세요.,Misschien een andere keer?,Kanskje en annen gang?,Może innym razem?,Talvez uma outra hora?,,Poate altădată?,"Может, в следующий раз?",,Kanske en annan gång?,Belki başka bir zaman? +Metal armor,TXT_RPLY2_SCRIPT02_D19708_METAL,,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure en Métal,,Fém páncél,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowy Pancerz,Armadura de metal,,Armură din metal,Металлическая броня,,Metallrustning,Metal zırh +Wear it in good health.,TXT_RYES2_SCRIPT02_D19708_WEARI,(in good health = enjoy),,,Noste jej ve zdraví.,Bær den ved godt helbred.,Trage sie mit Stolz.,,Ĝuu ĝin.,Disfrútala.,,Käyttäkää hyvällä omallatunnolla.,Portez la bien.,,Viseld jó egészséggel!,Che possa esserti utile!,着ると安心しますよ。,믿고 입으셔도 됩니다.,Draag het in goede gezondheid.,Bruk den med god helse.,Bądź zdrów nosząc go.,Vista ela com orgulho.,,Să o porți sănătos.,Носи на здоровье.,,Bär den vid god hälsa.,Sağlıkla giy. Come back when you can afford to buy something you lout!,TXT_RNO2_SCRIPT02_D19708_COMEB,,,,"Vrať se, až si budeš moct něco dovolit, troubo!","Kom tilbage, når du har råd til at købe noget, din slyngel!","Komm zurück wenn du dir etwas leisten kannst, du Rüpel!",,"Revenu kiam vi povos aĉeti ion, stultulo!","¡Vuelve cuando puedas -comprar algo, zopenco! ",,"Palataan asiaan, kun teidän on mahdollista ostaa jotain himoitsemaanne.","Revenez quand vous avez de l'argent, rustre!","Majd akkor gyere vissza, ha lesz pénzed megvenni bármit is, te fajankó!","Ritorna quando potrai permetterti di comprare le cose, cafone!",余裕がある時にまたどうぞ!,이런 거래는 못 하겠습니다. 돈을 모아서 다시 찾아오시길!,Kom terug wanneer je het je kunt veroorloven om iets te kopen wat je louteren kunt!,"Kom tilbake når du har råd til å kjøpe noe, din lømmel!",Wróć kiedy będziesz mógł coś kupić prostaku!,"Volte quando você puder comprar algo, seu caloteiro!",,"Revin-o când o să ai bani să poți cumpăra ceva, secătură!","Возвращайся, когда сможешь позволить себе купить что-нибудь, придурок!",,"Kom tillbaka när du har råd att köpa något, din tölp!",Bir şeyler satın almaya gücün yettiğinde geri gel! -How may I assist you?,TXT_DLG_SCRIPT02_D21224_HOWMA,MAP02: Hospital.,,,Jak vám mohu pomoci?,Hvordan kan jeg hjælpe dig?,Wie kann ich dir helfen?,,Kiel mi helpu vin?,¿Cómo puedo ayudarte?,,Kuinka voin olla avuksi?,Comment puis-je vous assister?,Miben segíthetek?,Come posso aiutarti?,何かお困りですか?,제가 어떻게 도와드릴까요?,Hoe kan ik u helpen?,Hva kan jeg hjelpe deg med?,Jak mogę ci pomóc?,Como posso ajudar?,,Cu ce vă pot ajuta?,Чем могу помочь?,,Hur kan jag hjälpa dig?,Size nasıl yardımcı olabilirim? -Med patch,TXT_RPLY0_SCRIPT02_D21224_MEDPA,〃,,,Obvaz,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Trusă de Prim-Ajutor,Бинтами,,Medicinsk plåster,Tıbbi yama -Here's your patch.,TXT_RYES0_SCRIPT02_D21224_HERES,〃,,,Jeden obvaz.,Her er dit plaster.,Hier ist deine Bandage,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreenne.,Voilà votre pansement.,Itt a tapaszod,Ecco le bende.,これをどうぞ。,의료 붕대 여깄습니다.,Hier is je patch.,Her er medisinplasteret ditt.,Oto twój bandaż.,Aqui está sua compressa.,,Poftiți trusa.,Вот они.,,Här är ditt plåster.,İşte yamanız. -You need 10 gold for that.,TXT_RNO0_SCRIPT02_D21224_YOUNE,〃,,,Na ten potřebujete deset zlatých.,Du skal bruge 10 guld for det.,Dafür brauchst du 10 Gold.,,Vi bezonas dek da oro.,Necesitas diez de oro.,,Siihen tarvitset 10 kolikkoa.,Il vous faut 10 pièces pour cela.,10 Aranyra lesz szükséged ehhez.,Ti servono 10 pezzi d'oro per quello.,10 ゴールド必要です。,10 골드가 필요합니다.,Daar heb je 10 goud voor nodig.,Du trenger 10 gull for det.,Potrzebujesz 10 monet aby to kupić.,Você precisa de 10 de ouro para isso.,,Ai nevoie de 10 monezi de aur pentru asta.,Тебе не хватает 10 золотых.,,Du behöver 10 guld för den.,Bunun için 10 altına ihtiyacın var. -Medical kit,TXT_RPLY1_SCRIPT02_D21224_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit médical,Elsősegély készlet,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Apteczka,Kit médico,,Kit de Prim-Ajutor,Аптечкой,,Medicinsk utrustning,Tıbbi kit -Thank you.,TXT_RYES1_SCRIPT02_D21224_THANK,〃,,,Děkuji.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Köszönöm,Grazie.,ありがとうございます。,이용 감사드려요.,Bedankt.,Takk skal du ha.,Dziękuję.,Agradeço.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkür ederim. +comprar algo, zopenco! ",,"Palataan asiaan, kun teidän on mahdollista ostaa jotain himoitsemaanne.","Revenez quand vous avez de l'argent, rustre!",,"Majd akkor gyere vissza, ha lesz pénzed megvenni bármit is, te fajankó!","Ritorna quando potrai permetterti di comprare le cose, cafone!",余裕がある時にまたどうぞ!,이런 거래는 못 하겠습니다. 돈을 모아서 다시 찾아오시길!,Kom terug wanneer je het je kunt veroorloven om iets te kopen wat je louteren kunt!,"Kom tilbake når du har råd til å kjøpe noe, din lømmel!",Wróć kiedy będziesz mógł coś kupić prostaku!,"Volte quando você puder comprar algo, seu caloteiro!",,"Revin-o când o să ai bani să poți cumpăra ceva, secătură!","Возвращайся, когда сможешь позволить себе купить что-нибудь, придурок!",,"Kom tillbaka när du har råd att köpa något, din tölp!",Bir şeyler satın almaya gücün yettiğinde geri gel! +How may I assist you?,TXT_DLG_SCRIPT02_D21224_HOWMA,MAP02: Hospital.,,,Jak vám mohu pomoci?,Hvordan kan jeg hjælpe dig?,Wie kann ich dir helfen?,,Kiel mi helpu vin?,¿Cómo puedo ayudarte?,,Kuinka voin olla avuksi?,Comment puis-je vous assister?,,Miben segíthetek?,Come posso aiutarti?,何かお困りですか?,제가 어떻게 도와드릴까요?,Hoe kan ik u helpen?,Hva kan jeg hjelpe deg med?,Jak mogę ci pomóc?,Como posso ajudar?,,Cu ce vă pot ajuta?,Чем могу помочь?,,Hur kan jag hjälpa dig?,Size nasıl yardımcı olabilirim? +Med patch,TXT_RPLY0_SCRIPT02_D21224_MEDPA,〃,,,Obvaz,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement,,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Trusă de Prim-Ajutor,Бинтами,,Medicinsk plåster,Tıbbi yama +Here's your patch.,TXT_RYES0_SCRIPT02_D21224_HERES,〃,,,Jeden obvaz.,Her er dit plaster.,Hier ist deine Bandage,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreenne.,Voilà votre pansement.,,Itt a tapaszod,Ecco le bende.,これをどうぞ。,의료 붕대 여깄습니다.,Hier is je patch.,Her er medisinplasteret ditt.,Oto twój bandaż.,Aqui está sua compressa.,,Poftiți trusa.,Вот они.,,Här är ditt plåster.,İşte yamanız. +You need 10 gold for that.,TXT_RNO0_SCRIPT02_D21224_YOUNE,〃,,,Na ten potřebujete deset zlatých.,Du skal bruge 10 guld for det.,Dafür brauchst du 10 Gold.,,Vi bezonas dek da oro.,Necesitas diez de oro.,,Siihen tarvitset 10 kolikkoa.,Il vous faut 10 pièces pour cela.,,10 Aranyra lesz szükséged ehhez.,Ti servono 10 pezzi d'oro per quello.,10 ゴールド必要です。,10 골드가 필요합니다.,Daar heb je 10 goud voor nodig.,Du trenger 10 gull for det.,Potrzebujesz 10 monet aby to kupić.,Você precisa de 10 de ouro para isso.,,Ai nevoie de 10 monezi de aur pentru asta.,Тебе не хватает 10 золотых.,,Du behöver 10 guld för den.,Bunun için 10 altına ihtiyacın var. +Medical kit,TXT_RPLY1_SCRIPT02_D21224_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit médical,,Elsősegély készlet,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Apteczka,Kit médico,,Kit de Prim-Ajutor,Аптечкой,,Medicinsk utrustning,Tıbbi kit +Thank you.,TXT_RYES1_SCRIPT02_D21224_THANK,〃,,,Děkuji.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Köszönöm,Grazie.,ありがとうございます。,이용 감사드려요.,Bedankt.,Takk skal du ha.,Dziękuję.,Agradeço.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkür ederim. "I wish I could give them away, but they cost 25 gold.",TXT_RNO1_SCRIPT02_D21224_IWISH,〃,,,"Přál bych si je dávat zadarmo, ale stojí 25 zlatých.","Jeg ville ønske, jeg kunne give dem væk, men de koster 25 guld.","Ich wünschte ich könnte sie weggeben, aber sie kosten 25 Gold.",,"Mi donacus ĝin, sed ĝi kostas 25 da oro.","Ojalá pudiera regalarlo, -pero cuesta 25 de oro.",,"Mielelläni antaisin ilmaiseksi, mutta ne maksavat 25 kultakolikkoa.","J'aimerais vraiment les donner gratuitement, mais cela côute 25 pièces.","Bárcsak ingyen osztogathatnám, de 25 aranyba kerül.","Mi piacerebbe darli via, ma costano 25 pezzi d'oro.",譲渡したい所ですが、25 ゴールド必要です。,"주고 싶지만, 이것의 가격은 25 골드입니다.","Ik wou dat ik ze kon weggeven, maar ze kosten 25 goud.","Jeg skulle ønske jeg kunne gi dem bort, men de koster 25 gull.","Chciałbym móc je rozdać, ale one kosztują 25 monet.","Bem que eu queria poder dar de graça, mas custam 25 de ouro.",,"Mi-aș dori să le pot da pe gratis, dar costă 25 de monezi de aur.","С радостью бы отдал, но они по 25 золотых.",,"Jag önskar att jag kunde ge bort dem, men de kostar 25 guld.",Keşke onları verebilseydim ama 25 altına mal oluyorlar. -Field surgery kit,TXT_RPLY2_SCRIPT02_D21224_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Polowy zestaw chirurga,Kit de cirurgia,,Trusă de chirurgie de teren,Медкомплектом,,Fältkirurgisk utrustning,Saha ameliyat kiti -There you go. Take care now.,TXT_RYES2_SCRIPT02_D21224_THERE,〃,,,Tady máte. Buďte opatrný.,Værsgo. Pas godt på dig selv nu.,Bitte schön. Mach's gut.,,Jen. Estu atenta.,Toma. Cuídate.,,Olkaa hyvä. Pitäkää itsestänne huoli.,Voilà pour vous. Faites attention à vous maintenant.,"Tessék, minden jót!",Ecco qua. Stammi bene.,こちらになります、お気をつけて。,여기 있습니다. 잘 쓰세요.,Daar ga je. Pas goed op jezelf.,Vær så god. Ta vare på deg selv.,Proszę bardzo. Trzymaj się.,Aqui está. Se cuida.,,Poftiți. Aveți grijă.,Пожалуйста. Береги себя!,,Här har du det. Ta hand om dig nu.,Al bakalım. Kendine iyi bak. +pero cuesta 25 de oro.",,"Mielelläni antaisin ilmaiseksi, mutta ne maksavat 25 kultakolikkoa.","J'aimerais vraiment les donner gratuitement, mais cela côute 25 pièces.",,"Bárcsak ingyen osztogathatnám, de 25 aranyba kerül.","Mi piacerebbe darli via, ma costano 25 pezzi d'oro.",譲渡したい所ですが、25 ゴールド必要です。,"주고 싶지만, 이것의 가격은 25 골드입니다.","Ik wou dat ik ze kon weggeven, maar ze kosten 25 goud.","Jeg skulle ønske jeg kunne gi dem bort, men de koster 25 gull.","Chciałbym móc je rozdać, ale one kosztują 25 monet.","Bem que eu queria poder dar de graça, mas custam 25 de ouro.",,"Mi-aș dori să le pot da pe gratis, dar costă 25 de monezi de aur.","С радостью бы отдал, но они по 25 золотых.",,"Jag önskar att jag kunde ge bort dem, men de kostar 25 guld.",Keşke onları verebilseydim ama 25 altına mal oluyorlar. +Field surgery kit,TXT_RPLY2_SCRIPT02_D21224_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie,,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Polowy zestaw chirurga,Kit de cirurgia,,Trusă de chirurgie de teren,Медкомплектом,,Fältkirurgisk utrustning,Saha ameliyat kiti +There you go. Take care now.,TXT_RYES2_SCRIPT02_D21224_THERE,〃,,,Tady máte. Buďte opatrný.,Værsgo. Pas godt på dig selv nu.,Bitte schön. Mach's gut.,,Jen. Estu atenta.,Toma. Cuídate.,,Olkaa hyvä. Pitäkää itsestänne huoli.,Voilà pour vous. Faites attention à vous maintenant.,,"Tessék, minden jót!",Ecco qua. Stammi bene.,こちらになります、お気をつけて。,여기 있습니다. 잘 쓰세요.,Daar ga je. Pas goed op jezelf.,Vær så god. Ta vare på deg selv.,Proszę bardzo. Trzymaj się.,Aqui está. Se cuida.,,Poftiți. Aveți grijă.,Пожалуйста. Береги себя!,,Här har du det. Ta hand om dig nu.,Al bakalım. Kendine iyi bak. "Well, maybe you can afford some med patches?",TXT_RNO2_SCRIPT02_D21224_WELLM,〃,,,"No, spíš byste si mohl dovolit nějaké obvazy?","Nå, måske har du råd til nogle medicinske plastre?","Nun, vielleicht kannst du dir ein paar medizinische Bandagen leisten?",,"Nu, ĉu vi eble povas aĉeti kuracbendojn?","Bueno, ¿quizás tengas para comprar tiritas?","Bueno, ¿tal vez tengas -para comprar curitas?",Olisiko teillä kuitenkin sidekääreisiin ehkä varaa?,"Eh bien, peut être que vous pouvez vous acheter quelques pansements?",Talán némi ragtapaszra tudnál költeni?,"Niente da fare, ma forse puoi permetterti delle bende?",ところで、医薬パッチを買う余裕はありますか?,"글쎄요, 아마 의료 붕대 정돈 살 수 있을걸요?","Nou ja, misschien kunt je zich wat med-patches veroorloven?",Kanskje du har råd til noen medisinplaster?,"Cóż, może stać cię na jakieś bandaże?","Bem, talvez você possa comprar algumas compressas?",,"Păi, poate îți permiți niște truse de prim-ajutor?","Тогда, может быть, купишь несколько бинтов?",,Du kanske har råd med några medicinska plåster?,Belki ilaç yamalarını karşılayabilirsin? -"I hope Macil knows what he's doing. If the Order finds out I'm helping the Front I'm as good as dead... Not that this matters to you any. The Front's medic gave me an upgrade chip for you, are you ready? ",TXT_DLG_SCRIPT02_D22740_IHOPE,〃 (After destroying the crystal in the Power Station),,,"Doufám, že Macil ví, co dělá. Jestli Řád zjistí, že pomáhám Frontě, jsem mrtvý... Ne, že by vás to mělo trápit. Medik Fronty mi pro vás dal vylepšovací čip, připraven?","Jeg håber, at Macil ved, hvad han laver. Hvis Ordenen finder ud af, at jeg hjælper fronten, er jeg så godt som død... Ikke at det har nogen betydning for dig. Frontens læge gav mig en opgraderingschip til dig, er du klar?","Ich hoffe Macil weiß was er tut. Wenn der Orden herausfindet das ich der Front helfe, bin ich so gut wie tot... auch wenn es für dich keine Rolle spielt. Ein Sanitäter der Front hat mir einen Verbesserungschip für dich mitgegeben, bist du bereit?",,"Mi esperas, ke Macil scias tion, kion li faras. Se La Ordeno malkovras, ke mi helpas la Fronton, mi estos sufiĉe mortinta... Ne kvazaŭ vi zorgus pri tio. La kuracisto de la Fronto donis al mi plibonigan icon por vi. Ĉu vi estas preta?","Espero que Macil sepa lo que está haciendo. Si La Orden se entera de que estoy ayudando al Frente, estoy bien muerto... No es como si te importara. El médico del Frente me dio un chip de mejora para ti. ¿Estás listo?",,"Toivottavasti Macil tietää, mitä tekee. Jos Veljeskunta saa kuulla minun auttavan Rintamaa, olen mennyttä... Ei siinä, että tieto sinua mitenkään kiinnostaisi. Sain Rintaman lääkintämieheltä sinulle päivityssirun; oletko valmis?","J'espère que Macil sait ce qu'il fait. Si l'Ordre se rend compte que j'aide le Front, c'est comme si j'étais mort.. bon, cela ne vous importe pas. Le médecin du Front m'a donné une puce d'augmentation pour vous. Etes vous prêt?","Remélem Macil tudja, mit csinál. Ha a Rend rájön, hogy a Frontot segítem, alulról szagolom majd az ibolyát...Nem mintha ez számítana számodra. A Front orvosa egy fejlesztési chipet küldött neked. Készen állsz?","Spero che Macil sappia quello che sta facendo. Se l'Ordine scopre che sto aiutando il Fronte sarò bello che morto... Non che questo importi ormai. Il medico del Fronte mi ha dato un upgrade chip per te, sei pronto?","マシルの行いが正しければ良いですが。 +para comprar curitas?",Olisiko teillä kuitenkin sidekääreisiin ehkä varaa?,"Eh bien, peut être que vous pouvez vous acheter quelques pansements?",,Talán némi ragtapaszra tudnál költeni?,"Niente da fare, ma forse puoi permetterti delle bende?",ところで、医薬パッチを買う余裕はありますか?,"글쎄요, 아마 의료 붕대 정돈 살 수 있을걸요?","Nou ja, misschien kunt je zich wat med-patches veroorloven?",Kanskje du har råd til noen medisinplaster?,"Cóż, może stać cię na jakieś bandaże?","Bem, talvez você possa comprar algumas compressas?",,"Păi, poate îți permiți niște truse de prim-ajutor?","Тогда, может быть, купишь несколько бинтов?",,Du kanske har råd med några medicinska plåster?,Belki ilaç yamalarını karşılayabilirsin? +"I hope Macil knows what he's doing. If the Order finds out I'm helping the Front I'm as good as dead... Not that this matters to you any. The Front's medic gave me an upgrade chip for you, are you ready? ",TXT_DLG_SCRIPT02_D22740_IHOPE,〃 (After destroying the crystal in the Power Station),,,"Doufám, že Macil ví, co dělá. Jestli Řád zjistí, že pomáhám Frontě, jsem mrtvý... Ne, že by vás to mělo trápit. Medik Fronty mi pro vás dal vylepšovací čip, připraven?","Jeg håber, at Macil ved, hvad han laver. Hvis Ordenen finder ud af, at jeg hjælper fronten, er jeg så godt som død... Ikke at det har nogen betydning for dig. Frontens læge gav mig en opgraderingschip til dig, er du klar?","Ich hoffe Macil weiß was er tut. Wenn der Orden herausfindet das ich der Front helfe, bin ich so gut wie tot... auch wenn es für dich keine Rolle spielt. Ein Sanitäter der Front hat mir einen Verbesserungschip für dich mitgegeben, bist du bereit?",,"Mi esperas, ke Macil scias tion, kion li faras. Se La Ordeno malkovras, ke mi helpas la Fronton, mi estos sufiĉe mortinta... Ne kvazaŭ vi zorgus pri tio. La kuracisto de la Fronto donis al mi plibonigan icon por vi. Ĉu vi estas preta?","Espero que Macil sepa lo que está haciendo. Si La Orden se entera de que estoy ayudando al Frente, estoy bien muerto... No es como si te importara. El médico del Frente me dio un chip de mejora para ti. ¿Estás listo?",,"Toivottavasti Macil tietää, mitä tekee. Jos Veljeskunta saa kuulla minun auttavan Rintamaa, olen mennyttä... Ei siinä, että tieto sinua mitenkään kiinnostaisi. Sain Rintaman lääkintämieheltä sinulle päivityssirun; oletko valmis?","J'espère que Macil sait ce qu'il fait. Si l'Ordre se rend compte que j'aide le Front, c'est comme si j'étais mort.. bon, cela ne vous importe pas. Le médecin du Front m'a donné une puce d'augmentation pour vous. Etes vous prêt?",,"Remélem Macil tudja, mit csinál. Ha a Rend rájön, hogy a Frontot segítem, alulról szagolom majd az ibolyát...Nem mintha ez számítana számodra. A Front orvosa egy fejlesztési chipet küldött neked. Készen állsz?","Spero che Macil sappia quello che sta facendo. Se l'Ordine scopre che sto aiutando il Fronte sarò bello che morto... Non che questo importi ormai. Il medico del Fronte mi ha dato un upgrade chip per te, sei pronto?","マシルの行いが正しければ良いですが。 私がフロントを援助しているとオーダーが 知ったら、私は...これは貴方には関係無いか。 フロントのメディックが貴方へ @@ -10466,254 +10466,254 @@ para comprar curitas?",Olisiko teillä kuitenkin sidekääreisiin ehkä varaa?," 装着しますか? ",마실 사령관님이 하는 일이 무엇인지 알고 있기를... 만약 오더가 내가 프론트를 위해 일한다는 걸 눈치챈다면 절 죽일 거예요. 물론 당신이 알 바는 아니지만. 프론트 의무관님이 업그레이드 칩을 당신에게 이식하라고 여기까지 가져왔더군요. 준비되셨습니까?,"Ik hoop dat Macil weet wat hij doet. Als de Orde erachter komt dat ik het Front help, ben ik zo goed als dood.... Niet dat dit belangrijk voor je is. De dokter van het Front heeft me een upgradechip voor je gegeven, ben je er klaar voor?","Jeg håper Macil vet hva han gjør. Hvis Ordenen finner ut at jeg hjelper Fronten, er jeg så godt som død... Ikke at det betyr noe for deg. Frontens lege ga meg en oppgraderingsbrikke til deg. Er du klar?","Mam nadzieję, że Macil wie co robi. Jeśli Zakon odkryje, że pomagam Frontowi, będę martwy... Nie to, że kogokolwiek to obchodzi. Medyk frontu dał mi czip ulepszający dla ciebie, jesteś gotowy?","Espero que Macil saiba o que está fazendo. Se a Ordem descobrir que estou ajudando a Frente, estou morto... Não que isso importe para vocês. O médico da Frente me passou um chip de upgrade pra você, está preparado?",,"Sper că Macil știe ce face. Dacă Ordinul află că ajut Frontul sunt ca și mort. Nu-i ca și cum te-ar interesa asta. Medicul Frontului mi-a dat un cip pentru upgrade, ești pregătit?","Надеюсь, Мэйсил знает, что делает. Если Орден обнаружит, что я помогаю повстанцам, я не жилец... хотя тебе-то какое дело. Медик Сопротивления передал мне этот чип для тебя. Ты готов? ",,"Jag hoppas att Macil vet vad han gör. Om Orden får reda på att jag hjälper fronten är jag så gott som död... Inte för att det spelar någon roll för dig. Frontens läkare gav mig ett uppgraderingschip till dig, är du redo?","Umarım Macil ne yaptığını biliyordur. Tarikat Cephe'ye yardım ettiğimi öğrenirse ölmüş sayılırım. Bu senin için önemli değil. Cephe'nin doktoru bana senin için bir yükseltme çipi verdi, hazır mısın?" -"Yes, I'm ready.",TXT_RPLY0_SCRIPT02_D22740_YESIM,〃,,,"Ano, jsem připravený.","Ja, jeg er klar.","Ja, ich bin bereit.",,"Jes, mi estas preta.","Sí, estoy listo.",,"Kyllä, olen valmis.","Oui, je suis prêt.","Igen, készen állok.","Sì, sono pronto.",ああ、準備良しだ。,"좋아요, 준비 됐습니다.","Ja, ik ben er klaar voor.","Ja, jeg er klar.","Tak, jestem gotowy.","Sim, estou preparado.",,"Da, sunt pregătit.","Да, готов.",,"Ja, jag är redo.","Evet, hazırım." +"Yes, I'm ready.",TXT_RPLY0_SCRIPT02_D22740_YESIM,〃,,,"Ano, jsem připravený.","Ja, jeg er klar.","Ja, ich bin bereit.",,"Jes, mi estas preta.","Sí, estoy listo.",,"Kyllä, olen valmis.","Oui, je suis prêt.",,"Igen, készen állok.","Sì, sono pronto.",ああ、準備良しだ。,"좋아요, 준비 됐습니다.","Ja, ik ben er klaar voor.","Ja, jeg er klar.","Tak, jestem gotowy.","Sim, estou preparado.",,"Da, sunt pregătit.","Да, готов.",,"Ja, jag är redo.","Evet, hazırım." "Well then, this won't take but a second. There, done already.",TXT_RYES0_SCRIPT02_D22740_WELLT,〃,,,"Tak dobře, měla by to být jen vteřinka. Tak, a je hotovo.","Nå, så tager det kun et øjeblik. Sådan, det er allerede gjort.","Nun dann, das wird nicht mal eine Sekunde dauern. So, bereits erledigt.",,"Bone, mi bezonos nur unu sekundon... kaj finite.","Muy bien, solo un -segundo... Y listo.",,"Siinä tapauksessa tähän ei mene paria sekuntia pidempään. Kas näin, valmista jo.","Bon, cela ne prendra qu'une seconde. Voilà, c'est fait.","Jól van hát, nem fog csak egy pár másodpercig tartani... És kész is.","Bene, non ci vorrà molto. Ecco fatto.",それでは、これに時間は掛かりません。はい、完了しました。,"그럼 잠깐이면 됩니다. 자, 다 됐어요.","Nou dan, dit duurt maar een seconde. Daar, al klaar.","Da tar det bare et øyeblikk. Sånn, ferdig.","Dobrze więc, to zajmie tylko sekundę. Już, gotowe.","Muito bem, isso vai levar um segundo. Pronto, já terminei.",,"Bine atunci, va dura doar o secundă. Așa, e gata deja.","Хорошо. Секундочку... Всё, готово.",,"Då tar det här bara en sekund. Där, redan gjort.","O zaman bir saniye bile sürmez. İşte, bitti bile." -How may I assist you?,TXT_DLG_SCRIPT02_D24256_HOWMA,〃,,,Jak vám mohu pomoci?,Hvordan kan jeg hjælpe dig?,Wie kann ich dir helfen?,,Kiel mi helpu vin?,¿Cómo puedo ayudarte?,,Kuinka voin olla avuksi?,Comment puis-je vous assister?,Miben segíthetek?,Come posso aiutarti?,何かお困りですか?,어떻게 도와드릴까요?,Hoe kan ik je helpen?,Hva kan jeg hjelpe deg med?,Jak mogę ci pomóc?,Como posso ajudar?,,Cu ce vă pot ajuta?,Чем могу тебе помочь?,,Hur kan jag hjälpa dig?,Size nasıl yardımcı olabilirim? -Med patch,TXT_RPLY0_SCRIPT02_D24256_MEDPA,〃,,,Obvaz,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster.,Bandaż,Compressa médica,,Trusă de Prim-Ajutor,Бинтами,,Med patch,Tıbbi yama -Here's your patch.,TXT_RYES0_SCRIPT02_D24256_HERES,〃,,,Jeden obvaz.,Her er dit plaster.,Hier ist deine Bandage,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreenne.,Voilà votre pansement.,Itt a tapaszod.,Ecco le bende.,これをどうぞ。,여기 의료 붕대입니다.,Hier is je patch.,Her er plasteret ditt.,Oto twój bandaż.,Aqui está sua compressa.,,Poftiți trusa.,Вот они.,,Här är ditt plåster.,İşte yamanız. -You need 10 gold for that.,TXT_RNO0_SCRIPT02_D24256_YOUNE,〃,,,Na ten potřebujete deset zlatých.,Du skal bruge 10 guld for det.,Dafür brauchst du 10 Gold.,,Vi bezonas dek da oro.,Necesitas diez de oro.,,Tarvitset siihen 10 kolikkoa.,Il vous faut 10 pièces pour cela.,10 aranyra van szükséged ehhez.,Ti servono 10 pezzi d'oro per quello.,10 ゴールド必要です。,10 골드가 필요한데.,Daar heb je 10 goud voor nodig.,Du trenger 10 gull for det.,Potrzebujesz 10 monet aby to kupić.,Você precisa de 10 de ouro pra isso.,,Ai nevoie de 10 monezi de aur pentru asta.,Тебе не хватает 10 золотых.,,Du behöver 10 guld för det.,Bunun için 10 altına ihtiyacın var. -Medical kit,TXT_RPLY1_SCRIPT02_D24256_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit médical,Orvosi csomag.,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Apteczka,Kit médico,,Kit de Prim-Ajutor,Аптечкой,,Medicinsk utrustning,Tıbbi kit -Thank you.,TXT_RYES1_SCRIPT02_D24256_THANK,〃,,,Děkuji.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Köszönöm.,Grazie.,ありがとうございます。,또 오세요.,Bedankt.,Takk skal du ha.,Dziękuję.,Agradeço.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkür ederim. +segundo... Y listo.",,"Siinä tapauksessa tähän ei mene paria sekuntia pidempään. Kas näin, valmista jo.","Bon, cela ne prendra qu'une seconde. Voilà, c'est fait.",,"Jól van hát, nem fog csak egy pár másodpercig tartani... És kész is.","Bene, non ci vorrà molto. Ecco fatto.",それでは、これに時間は掛かりません。はい、完了しました。,"그럼 잠깐이면 됩니다. 자, 다 됐어요.","Nou dan, dit duurt maar een seconde. Daar, al klaar.","Da tar det bare et øyeblikk. Sånn, ferdig.","Dobrze więc, to zajmie tylko sekundę. Już, gotowe.","Muito bem, isso vai levar um segundo. Pronto, já terminei.",,"Bine atunci, va dura doar o secundă. Așa, e gata deja.","Хорошо. Секундочку... Всё, готово.",,"Då tar det här bara en sekund. Där, redan gjort.","O zaman bir saniye bile sürmez. İşte, bitti bile." +How may I assist you?,TXT_DLG_SCRIPT02_D24256_HOWMA,〃,,,Jak vám mohu pomoci?,Hvordan kan jeg hjælpe dig?,Wie kann ich dir helfen?,,Kiel mi helpu vin?,¿Cómo puedo ayudarte?,,Kuinka voin olla avuksi?,Comment puis-je vous assister?,,Miben segíthetek?,Come posso aiutarti?,何かお困りですか?,어떻게 도와드릴까요?,Hoe kan ik je helpen?,Hva kan jeg hjelpe deg med?,Jak mogę ci pomóc?,Como posso ajudar?,,Cu ce vă pot ajuta?,Чем могу тебе помочь?,,Hur kan jag hjälpa dig?,Size nasıl yardımcı olabilirim? +Med patch,TXT_RPLY0_SCRIPT02_D24256_MEDPA,〃,,,Obvaz,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement,,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster.,Bandaż,Compressa médica,,Trusă de Prim-Ajutor,Бинтами,,Med patch,Tıbbi yama +Here's your patch.,TXT_RYES0_SCRIPT02_D24256_HERES,〃,,,Jeden obvaz.,Her er dit plaster.,Hier ist deine Bandage,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreenne.,Voilà votre pansement.,,Itt a tapaszod.,Ecco le bende.,これをどうぞ。,여기 의료 붕대입니다.,Hier is je patch.,Her er plasteret ditt.,Oto twój bandaż.,Aqui está sua compressa.,,Poftiți trusa.,Вот они.,,Här är ditt plåster.,İşte yamanız. +You need 10 gold for that.,TXT_RNO0_SCRIPT02_D24256_YOUNE,〃,,,Na ten potřebujete deset zlatých.,Du skal bruge 10 guld for det.,Dafür brauchst du 10 Gold.,,Vi bezonas dek da oro.,Necesitas diez de oro.,,Tarvitset siihen 10 kolikkoa.,Il vous faut 10 pièces pour cela.,,10 aranyra van szükséged ehhez.,Ti servono 10 pezzi d'oro per quello.,10 ゴールド必要です。,10 골드가 필요한데.,Daar heb je 10 goud voor nodig.,Du trenger 10 gull for det.,Potrzebujesz 10 monet aby to kupić.,Você precisa de 10 de ouro pra isso.,,Ai nevoie de 10 monezi de aur pentru asta.,Тебе не хватает 10 золотых.,,Du behöver 10 guld för det.,Bunun için 10 altına ihtiyacın var. +Medical kit,TXT_RPLY1_SCRIPT02_D24256_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit médical,,Orvosi csomag.,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Apteczka,Kit médico,,Kit de Prim-Ajutor,Аптечкой,,Medicinsk utrustning,Tıbbi kit +Thank you.,TXT_RYES1_SCRIPT02_D24256_THANK,〃,,,Děkuji.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Köszönöm.,Grazie.,ありがとうございます。,또 오세요.,Bedankt.,Takk skal du ha.,Dziękuję.,Agradeço.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkür ederim. "I wish I could give them away, but they cost 25 gold.",TXT_RNO1_SCRIPT02_D24256_IWISH,〃,,,"Přál bych si je dávat zadarmo, ale stojí 25 zlatých.","Jeg ville ønske, jeg kunne give dem væk, men de koster 25 guld.","Ich wünschte ich könnte sie weggeben, aber sie kosten 25 Gold.",,"Mi donacus ĝin, sed ĝi kostas 25 da oro.","Ojalá pudiera regalarlo, -pero cuesta 25 de oro.",,"Kunpa voisinkin antaa niitä ilmaiseksi, mutta ne maksavat 25 kultakolikkoa.","J'aimerais vraiment les donner gratuitement, mais cela côute 25 pièces.","Bárcsak ingyen osztogathatnám, de 25 aranyba kerül.","Mi piacerebbe darli via, ma costano 25 pezzi d'oro.",譲渡したい所ですが、25 ゴールド必要です。,25 골드만 있다면 이건 당신 것인데 말이죠.,"Ik wou dat ik ze kon weggeven, maar ze kosten 25 goud.","Jeg skulle ønske jeg kunne gi dem bort, men de koster 25 gull.","Chciałbym móc je rozdać, ale one kosztują 25 monet.","Bem que eu queria poder dar de graça, mas custam 25 de ouro.",,"Mi-aș dori să le pot da pe gratis, dar costă 25 de monezi de aur.","С радостью бы отдал, но они по 25 золотых.",,"Jag önskar att jag kunde ge bort dem, men de kostar 25 guld.",Keşke onları verebilseydim ama 25 altına mal oluyorlar. -Field surgery kit,TXT_RPLY2_SCRIPT02_D24256_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Polowy zestaw chirurga,Kit de cirurgia,,Trusă de chirurgie de teren,Медкомплект,,Fältkirurgisk utrustning,Saha ameliyat kiti -There you go. Take care now.,TXT_RYES2_SCRIPT02_D24256_THERE,〃,,,Tady máte. Buďte opatrný.,Værsgo. Pas godt på dig selv nu.,Bitte schön. Mach's gut.,,Jen. Estu atenta.,Toma. Cuídate.,,Olkaa hyvä. Pitäkää itsestänne huoli.,Voilà pour vous. Faites attention à vous maintenant.,Parancsolj! Aztán vigyázz magadra!,Ecco qua. Stammi bene.,こちらになります、お気をつけて。,여기 있습니다. 잘 쓰세요.,Daar ga je. Pas goed op jezelf.,Vær så god. Ta vare på deg selv.,Proszę bardzo. Trzymaj się.,Aqui está. Se cuida.,,Poftiți. Aveți grijă.,Пожалуйста. Береги себя!,,Här har du det. Ta hand om dig nu.,Al bakalım. Kendine iyi bak. +pero cuesta 25 de oro.",,"Kunpa voisinkin antaa niitä ilmaiseksi, mutta ne maksavat 25 kultakolikkoa.","J'aimerais vraiment les donner gratuitement, mais cela côute 25 pièces.",,"Bárcsak ingyen osztogathatnám, de 25 aranyba kerül.","Mi piacerebbe darli via, ma costano 25 pezzi d'oro.",譲渡したい所ですが、25 ゴールド必要です。,25 골드만 있다면 이건 당신 것인데 말이죠.,"Ik wou dat ik ze kon weggeven, maar ze kosten 25 goud.","Jeg skulle ønske jeg kunne gi dem bort, men de koster 25 gull.","Chciałbym móc je rozdać, ale one kosztują 25 monet.","Bem que eu queria poder dar de graça, mas custam 25 de ouro.",,"Mi-aș dori să le pot da pe gratis, dar costă 25 de monezi de aur.","С радостью бы отдал, но они по 25 золотых.",,"Jag önskar att jag kunde ge bort dem, men de kostar 25 guld.",Keşke onları verebilseydim ama 25 altına mal oluyorlar. +Field surgery kit,TXT_RPLY2_SCRIPT02_D24256_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie,,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Polowy zestaw chirurga,Kit de cirurgia,,Trusă de chirurgie de teren,Медкомплект,,Fältkirurgisk utrustning,Saha ameliyat kiti +There you go. Take care now.,TXT_RYES2_SCRIPT02_D24256_THERE,〃,,,Tady máte. Buďte opatrný.,Værsgo. Pas godt på dig selv nu.,Bitte schön. Mach's gut.,,Jen. Estu atenta.,Toma. Cuídate.,,Olkaa hyvä. Pitäkää itsestänne huoli.,Voilà pour vous. Faites attention à vous maintenant.,,Parancsolj! Aztán vigyázz magadra!,Ecco qua. Stammi bene.,こちらになります、お気をつけて。,여기 있습니다. 잘 쓰세요.,Daar ga je. Pas goed op jezelf.,Vær så god. Ta vare på deg selv.,Proszę bardzo. Trzymaj się.,Aqui está. Se cuida.,,Poftiți. Aveți grijă.,Пожалуйста. Береги себя!,,Här har du det. Ta hand om dig nu.,Al bakalım. Kendine iyi bak. "Well, maybe you can afford some med patches?",TXT_RNO2_SCRIPT02_D24256_WELLM,〃,,,"No, spíš byste si mohl dovolit nějaké obvazy?","Nå, måske har du råd til nogle medicinske plastre?","Nun, vielleicht kannst du dir ein paar medizinische Bandagen leisten?",,"Nu, ĉu vi eble povas aĉeti kuracbendojn?","Bueno, ¿quizás tengas para comprar tiritas?","Bueno, ¿tal vez tengas -para comprar curitas?",Olisiko teillä ehkä varaa sidekääreisiin?,"Eh bien, peut être que vous pouvez vous acheter quelques pansements?","Nos, talán telik pár ragtapaszra is?","Niente da fare, ma forse puoi permetterti delle bende?",ところで、医薬パッチを買う余裕はありますか?,글쎄요... 의료 붕대는 어떻습니까?,"Nou ja, misschien kunt je zich wat med-patches veroorloven?",Kanskje du har råd til noen medisinplaster?,"Cóż, może stać cię na jakieś bandaże?","Bem, talvez você possa comprar algumas compressas?",,"Păi, poate îți permiți niște truse de prim-ajutor?","Тогда, может быть, купишь несколько бинтов?",,Du kanske har råd med några medicinska plåster?,Belki birkaç ilaç yamasını karşılayabilirsin? -"Hello stranger, I haven't seen you around here before. Let me give you a piece of free advice. I'd be careful if I were you. The Order does not tolerate free will, and their justice is swift.",TXT_DLG_SCRIPT02_D25772_HELLO,MAP02: Barkeep.,,,"Vítejte, cizinče, vás jsem tu ještě neviděl. Dám vám drobnou radu na začátek grátis: Být vámi, byl bych opatrný. Řád netoleruje svobodnou vůli a jejich spravedlnost je hbitá. ","Hej fremmede, jeg har ikke set dig her før. Lad mig give dig et gratis råd. Jeg ville være forsigtig, hvis jeg var dig. Ordenen tolererer ikke fri vilje, og deres retfærdighed er hurtig.","Hallo, Fremder. Ich habe dich hier vorher noch nie gesehen. Lass mich dir einen kostenlosen Rat geben. An deiner Stelle wäre ich vorsichtig. Der Orden duldet keinen freien Willen und sie greifen hart durch.",,"Saluton, fremdulo, mi ne vidis vin ĉi tie antaŭe. Jen senpaga konsilo: mi estus atenta se mi estus vi; La Ordeno ne toleras liberan volon kaj havas rapidan «juston».","Hola, extranjero, no te he visto por aquí antes. Te daré un consejo gratis: tendría cuidado si fuera tú; La Orden no tolera el libre albedrío y su justicia es veloz.","Hola, extranjero, es la primera vez que te veo por aquí. Te voy a dar un consejo gratis: tendría cuidado si fuera tú; La Orden no tolera el libre albedrío y su justicia es veloz.","Päivää. En olekaan nähnyt teitä täällä ennen. Teinä neuvoisin olemaan varuillanne. Veljeskunta ei suvaitse vapaata tahtoa, ja heidän tuomionsa ovat pikaiset.","Bien le bonjour, étranger. On ne vous a pas encore vu dans ce coin. Laissez-moi vous donner un petit conseil. Je ferais attention si j'étais vous. L'Ordre ne tolère pas le libre arbitre et leur justice est fulgurante.","Üdvözöllek idegen, nem láttalak még itt a környéken. Hadd adjak egy ingyen tanácsot. Én óvatos lennék a helyedben. A Rend nem tolerálja a szabad akaratot, és elég fürge az igazságszolgáltatás.","Salve straniero, non ti ho mai visto da queste parti prima. Lascia che ti dia un consiglio. Io starei attento se fossi in te. L'Ordine non tollera il libero arbitrio, e la loro ""giustizia"" è repentina.","どうも余所者、この辺では見かけない顔だな。 +para comprar curitas?",Olisiko teillä ehkä varaa sidekääreisiin?,"Eh bien, peut être que vous pouvez vous acheter quelques pansements?",,"Nos, talán telik pár ragtapaszra is?","Niente da fare, ma forse puoi permetterti delle bende?",ところで、医薬パッチを買う余裕はありますか?,글쎄요... 의료 붕대는 어떻습니까?,"Nou ja, misschien kunt je zich wat med-patches veroorloven?",Kanskje du har råd til noen medisinplaster?,"Cóż, może stać cię na jakieś bandaże?","Bem, talvez você possa comprar algumas compressas?",,"Păi, poate îți permiți niște truse de prim-ajutor?","Тогда, может быть, купишь несколько бинтов?",,Du kanske har råd med några medicinska plåster?,Belki birkaç ilaç yamasını karşılayabilirsin? +"Hello stranger, I haven't seen you around here before. Let me give you a piece of free advice. I'd be careful if I were you. The Order does not tolerate free will, and their justice is swift.",TXT_DLG_SCRIPT02_D25772_HELLO,MAP02: Barkeep.,,,"Vítejte, cizinče, vás jsem tu ještě neviděl. Dám vám drobnou radu na začátek grátis: Být vámi, byl bych opatrný. Řád netoleruje svobodnou vůli a jejich spravedlnost je hbitá. ","Hej fremmede, jeg har ikke set dig her før. Lad mig give dig et gratis råd. Jeg ville være forsigtig, hvis jeg var dig. Ordenen tolererer ikke fri vilje, og deres retfærdighed er hurtig.","Hallo, Fremder. Ich habe dich hier vorher noch nie gesehen. Lass mich dir einen kostenlosen Rat geben. An deiner Stelle wäre ich vorsichtig. Der Orden duldet keinen freien Willen und sie greifen hart durch.",,"Saluton, fremdulo, mi ne vidis vin ĉi tie antaŭe. Jen senpaga konsilo: mi estus atenta se mi estus vi; La Ordeno ne toleras liberan volon kaj havas rapidan «juston».","Hola, extranjero, no te he visto por aquí antes. Te daré un consejo gratis: tendría cuidado si fuera tú; La Orden no tolera el libre albedrío y su justicia es veloz.","Hola, extranjero, es la primera vez que te veo por aquí. Te voy a dar un consejo gratis: tendría cuidado si fuera tú; La Orden no tolera el libre albedrío y su justicia es veloz.","Päivää. En olekaan nähnyt teitä täällä ennen. Teinä neuvoisin olemaan varuillanne. Veljeskunta ei suvaitse vapaata tahtoa, ja heidän tuomionsa ovat pikaiset.","Bien le bonjour, étranger. On ne vous a pas encore vu dans ce coin. Laissez-moi vous donner un petit conseil. Je ferais attention si j'étais vous. L'Ordre ne tolère pas le libre arbitre et leur justice est fulgurante.",,"Üdvözöllek idegen, nem láttalak még itt a környéken. Hadd adjak egy ingyen tanácsot. Én óvatos lennék a helyedben. A Rend nem tolerálja a szabad akaratot, és elég fürge az igazságszolgáltatás.","Salve straniero, non ti ho mai visto da queste parti prima. Lascia che ti dia un consiglio. Io starei attento se fossi in te. L'Ordine non tollera il libero arbitrio, e la loro ""giustizia"" è repentina.","どうも余所者、この辺では見かけない顔だな。 では一杯アドバイスをおごろう。この付近が 自由な発言を許さないからって下手な真似は するなよ。オーダーという自警団がすぐに 駆けつけてくるぞ。","안녕하신가 이방인이여, 자네는 이곳에서 처음 보는 얼굴이군. 내가 자네에게 공짜 조언을 해주지. 내가 자네라면 조심할 거야. 오더는 자유의지를 용납하지 않아. 그리고 그들의 정의는 신속하지.","Hallo vreemdeling, ik heb je hier nog niet eerder gezien. Laat me je een stukje gratis advies geven. Ik zou voorzichtig zijn als ik jou was. De Orde tolereert geen vrije wil en hun gerechtigheid is snel.","Hei, fremmede, jeg har ikke sett deg her før. La meg gi deg et gratis råd. Jeg ville vært forsiktig hvis jeg var deg. Ordenen tolererer ikke fri vilje, og deres rettferdighet er rask.","Witaj nieznajomy, nigdy cie tu wcześniej nie widziałem. Dam ci darmową radę. Na twoim miejscu bym uważał. Zakon nie toleruje wolnej woli, a ich prawo działa prędko.","Olá, forasteiro. Nunca vi você por aqui antes. Deixa eu te dar um conselho de graça. Eu tomaria cuidado se eu fosse você. A Ordem não tolera livre arbítrio e a justiça deles é rápida.",,"Salutări străine, nu te-am mai văzut pe-aici. Permite-mi să-ți dau un sfat. Aș fi grijuliu în locul tău. Ordinul nu tolerează voința liberă, iar justiția lor e rapidă.","Привет, незнакомец. Что-то я не видел тебя тут раньше. Позволь дать тебе бесплатный совет: я на твоём месте был бы поосторожнее. Орден не терпит неповиновения, и они скоры на суд.",,"Hej främling, jag har inte sett dig här förut. Låt mig ge dig ett gratis råd. Jag skulle vara försiktig om jag var du. Orden tolererar inte fri vilja och deras rättvisa är snabb.","Merhaba yabancı, seni daha önce buralarda görmemiştim. Sana bedava bir tavsiye vereyim. Yerinde olsam dikkatli olurdum. Tarikat'ın özgür iradeye tahammülü yoktur ve adaletleri çok hızlıdır." -What's the word?,TXT_RPLY0_SCRIPT02_D25772_WHATS,〃,,,Nějaké zvěsti?,Hvad er ordet?,Was erzählt man sich so?,,Kion oni diras ĉi tie?,¿Qué se dice por aquí?,,Mikä on päivän sana?,C'est quoi la rumeur?,Mi a hír?,Che si dice in giro?,他には?,무슨 뜻이죠?,Wat is het woord?,Hva heter det?,Jakieś wieści?,Quais são as últimas?,,Ai vreo veste?,Есть новости?,,Vad heter det?,Neydi o kelime? +What's the word?,TXT_RPLY0_SCRIPT02_D25772_WHATS,〃,,,Nějaké zvěsti?,Hvad er ordet?,Was erzählt man sich so?,,Kion oni diras ĉi tie?,¿Qué se dice por aquí?,,Mikä on päivän sana?,C'est quoi la rumeur?,,Mi a hír?,Che si dice in giro?,他には?,무슨 뜻이죠?,Wat is het woord?,Hva heter det?,Jakieś wieści?,Quais são as últimas?,,Ai vreo veste?,Есть новости?,,Vad heter det?,Neydi o kelime? The word is... The sewers hold more than just rats and robots.,TXT_RYES0_SCRIPT02_D25772_THEWO,〃,,,Kolují zvěsti... že stoky ukrývají víc než jen krysy a roboty.,Ordet er... Kloakkerne rummer mere end bare rotter og robotter.,"Man erzählt sich, dass die Kanalisation mehr als Ratten und Roboter zu bieten hat.",,"Oni diras... ke en la kloako ne estas nur ratoj kaj robotoj.","Se dice... que en las alcantarillas -hay más que solo ratas y robots.",,Sana on... että viemärit pitävät sisällään muutakin kuin vain rottia ja robotteja.,La rumeur est.. Que les égouts cachent quelque chose de plus gros que des rats et des robots.,Az a hír...hogy a kanális nem csak patkányokat és robotokat rejteget.,In giro si dice che... Le fogne contengono molto di più che ratti e robot.,他は...下水道には鼠やロボが沢山だ。,"무슨 말이냐 하면, 하수도 안에는 시궁쥐만 있는 게 아니라 로봇들도 숨어 있다는 거지.",Het woord is.... De riolen bevatten meer dan alleen ratten en robots.,Ordet er... Kloakken rommer mer enn bare rotter og roboter.,"Wieści są takie, że... kanały skrywają coś więcej niż tylko szczury i roboty.",As últimas são... Que os esgotos abrigam mais do que apenas ratos e robôs.,,Vestea e că... Canalele ascund mai mult decât roboți și șoareci.,"Говорят, в канализации водятся не только крысы и роботы.",,Ordet är... Kloakerna innehåller mer än bara råttor och robotar.,Kelime şu. Lağımlarda fareler ve robotlardan daha fazlası var. -What can I do for you now?,TXT_DLG_SCRIPT02_D27288_WHATC,〃,,,Co pro vás můžu udělat teď?,Hvad kan jeg gøre for dig nu?,Was kann ich jetzt für dich tun?,,Kion mi faru por vi?,¿Qué puedo hacer por ti?,,"No niin, miten voin olla teille avuksi?",Que puis-je faire pour vous?,Mit tehetek ma Önért?,E ora cosa posso fare per te?,何か用か?,이제 자네에게 무엇을 해드릴까?,Wat kan ik nu voor je doen?,Hva kan jeg gjøre for deg nå?,Co mogę dla ciebie zrobić?,O que posso fazer por você agora?,,Cu ce te mai pot ajuta?,Тебе что-нибудь нужно?,,Vad kan jag göra för dig nu?,Şimdi senin için ne yapabilirim? -More info.,TXT_RPLY0_SCRIPT02_D27288_MOREI,〃,,,Další informace,Mere info.,Mehr Informationen.,,Pliaj informoj,Más información,,Muuta tietoa.,Plus d'infos.,Több információt.,Altre informazioni.,話のネタ。,더 많은 정보를 주세요.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multe informații.,Расскажи больше,,Mer information.,Daha fazla bilgi. +hay más que solo ratas y robots.",,Sana on... että viemärit pitävät sisällään muutakin kuin vain rottia ja robotteja.,La rumeur est.. Que les égouts cachent quelque chose de plus gros que des rats et des robots.,,Az a hír...hogy a kanális nem csak patkányokat és robotokat rejteget.,In giro si dice che... Le fogne contengono molto di più che ratti e robot.,他は...下水道には鼠やロボが沢山だ。,"무슨 말이냐 하면, 하수도 안에는 시궁쥐만 있는 게 아니라 로봇들도 숨어 있다는 거지.",Het woord is.... De riolen bevatten meer dan alleen ratten en robots.,Ordet er... Kloakken rommer mer enn bare rotter og roboter.,"Wieści są takie, że... kanały skrywają coś więcej niż tylko szczury i roboty.",As últimas são... Que os esgotos abrigam mais do que apenas ratos e robôs.,,Vestea e că... Canalele ascund mai mult decât roboți și șoareci.,"Говорят, в канализации водятся не только крысы и роботы.",,Ordet är... Kloakerna innehåller mer än bara råttor och robotar.,Kelime şu. Lağımlarda fareler ve robotlardan daha fazlası var. +What can I do for you now?,TXT_DLG_SCRIPT02_D27288_WHATC,〃,,,Co pro vás můžu udělat teď?,Hvad kan jeg gøre for dig nu?,Was kann ich jetzt für dich tun?,,Kion mi faru por vi?,¿Qué puedo hacer por ti?,,"No niin, miten voin olla teille avuksi?",Que puis-je faire pour vous?,,Mit tehetek ma Önért?,E ora cosa posso fare per te?,何か用か?,이제 자네에게 무엇을 해드릴까?,Wat kan ik nu voor je doen?,Hva kan jeg gjøre for deg nå?,Co mogę dla ciebie zrobić?,O que posso fazer por você agora?,,Cu ce te mai pot ajuta?,Тебе что-нибудь нужно?,,Vad kan jag göra för dig nu?,Şimdi senin için ne yapabilirim? +More info.,TXT_RPLY0_SCRIPT02_D27288_MOREI,〃,,,Další informace,Mere info.,Mehr Informationen.,,Pliaj informoj,Más información,,Muuta tietoa.,Plus d'infos.,,Több információt.,Altre informazioni.,話のネタ。,더 많은 정보를 주세요.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multe informații.,Расскажи больше,,Mer information.,Daha fazla bilgi. The Governor is a simple reminder to us that we aren't free people anymore.,TXT_RYES0_SCRIPT02_D27288_THEGO,〃,,,"Náš guvernér je hezkou přípomínkou toho, že už nejsme svobodní.","Guvernøren er en simpel påmindelse til os om, at vi ikke længere er frie mennesker.","Der Gouverneur ist eine einfache Erinnerung daran, das wir keine freien Menschen mehr sind.",,"La registo ekzistas nur por memorigi, ke ne plu estas libereco.","El gobernador solo es un recordatorio de -que ya no somos libres.",,"Kuvernööri toimii meille pienenä muistutuksena, ettemme ole enää vapaita ihmisiä.",Le gouverneur n'est qu'un exemple parmi d'autres pour nous montrer que ne nous somme plus un peuple libre.,"A Kormányzó egy egyszerű emlékeztető számunkra, hogy többé nem vagyunk szabad emberek.",Il governatore serve solo a farci ricordare che non siamo più delle persone libere.,知事は俺達に自由はないと思い出させる象徴さ。,모렐 총독은 우리들이 자유롭게 남들을 도울 수 없는 이유 중 하나이기도 하다네.,De gouverneur herinnert ons er eenvoudigweg aan dat we geen vrije mensen meer zijn.,Guvernøren er en enkel påminnelse om at vi ikke er frie mennesker lenger.,"Gubernator jest dla nas przypomnieniem, że już nie jesteśmy wolnymi ludźmi.",O Governador é um simples lembrete para nós de que não somos mais um povo livre.,,Guvernatorul e un simplu memento că nu mai suntem oameni liberi.,"Губернатор — живое напоминание, что мы больше не свободные люди.",,Guvernören är en enkel påminnelse om att vi inte längre är fria människor.,Vali bize artık özgür insanlar olmadığımızı hatırlatıyor. +que ya no somos libres.",,"Kuvernööri toimii meille pienenä muistutuksena, ettemme ole enää vapaita ihmisiä.",Le gouverneur n'est qu'un exemple parmi d'autres pour nous montrer que ne nous somme plus un peuple libre.,,"A Kormányzó egy egyszerű emlékeztető számunkra, hogy többé nem vagyunk szabad emberek.",Il governatore serve solo a farci ricordare che non siamo più delle persone libere.,知事は俺達に自由はないと思い出させる象徴さ。,모렐 총독은 우리들이 자유롭게 남들을 도울 수 없는 이유 중 하나이기도 하다네.,De gouverneur herinnert ons er eenvoudigweg aan dat we geen vrije mensen meer zijn.,Guvernøren er en enkel påminnelse om at vi ikke er frie mennesker lenger.,"Gubernator jest dla nas przypomnieniem, że już nie jesteśmy wolnymi ludźmi.",O Governador é um simples lembrete para nós de que não somos mais um povo livre.,,Guvernatorul e un simplu memento că nu mai suntem oameni liberi.,"Губернатор — живое напоминание, что мы больше не свободные люди.",,Guvernören är en enkel påminnelse om att vi inte längre är fria människor.,Vali bize artık özgür insanlar olmadığımızı hatırlatıyor. Come back when you get some gold.,TXT_RNO0_SCRIPT02_D27288_COMEB,〃,,,"Vrať se, až budeš mít trochu zlata.","Kom tilbage, når du får noget guld.","Komm zurück, wenn du etwas Gold hast.",,"Revenu kiam vi havos sufiĉe da oro.","Vuelve cuando -tengas suficiente oro.",,"Palatkaa takaisin, kun teillä on kultaa.",Revenez quand vous avez de l'argent.,"Majd akkor térj vissza, ha szeretél egy kis aranyat.",Ritorna quando avrai più oro.,銭を一杯分持って戻ってきな。,골드가 더 있다면 더 알려주지.,Kom terug als je wat goud krijgt.,Kom tilbake når du har gull.,Wróć kiedy będziesz miał więcej monet.,Volte quando tiver ouro.,,Revin-o când ai niște aur.,"Возвращайся, когда у тебя будет золото.",,Kom tillbaka när du får lite guld.,Biraz altın bulduğunda geri gel. -"Well, you're asking a lot of questions for someone who's not trying to die. Make sure you don't go and get yourself killed, or worse.",TXT_DLG_SCRIPT02_D28804_WELLY,〃,,,"Na někoho, kdo se nesnaží zemřít, se hodně ptáš. Dej si pozor a nenech se zabít, nebo něco horšího.","Du stiller mange spørgsmål af en, der ikke prøver at dø. Sørg for, at du ikke går hen og bliver dræbt, eller det der er værre.","Hmm, du stellst aber ziemlich viele Fragen für jemand der nicht versucht zu sterben. Lass dich nicht umbringen, oder schlimmeres.",,"Nu, vi faras multe da demandoj por esti iu, kiu ne intencas morti. Certiĝu, ke vi ne kaŭzos al vi mortigon... aŭ ion pli malbonan.","Bueno, estás haciendo muchas preguntas para ser alguien que no está tratando de morir. Asegúrate de que no vayas a hacer que te maten... o algo peor.",,"Kylläpäs te kysytte paljon ollaksenne joku, joka ei yritä tappaa itsensä. Pitäkää vain huoli, ettei niin edelleenkään käy, tai pahemmin.","Vous posez beaucoup de questions pour quelqu'un qui n'essaie pas de se faire tuer. Essayez donc de ne pas vous faire descendre, ou pire.","Figyelj, elég sok kérdést teszel fel, ahhoz képest, hogy elvileg nem akarsz meghalni. Igyekezz nem kinyiratni magad a továbbiakban, vagy rosszabb.","Lo sai, fai davvero tante domande per uno che cerca di sopravvivere. Fai attenzione a non farti uccidere, o peggio...","所で、アンタは死に行かない人達に +tengas suficiente oro.",,"Palatkaa takaisin, kun teillä on kultaa.",Revenez quand vous avez de l'argent.,,"Majd akkor térj vissza, ha szeretél egy kis aranyat.",Ritorna quando avrai più oro.,銭を一杯分持って戻ってきな。,골드가 더 있다면 더 알려주지.,Kom terug als je wat goud krijgt.,Kom tilbake når du har gull.,Wróć kiedy będziesz miał więcej monet.,Volte quando tiver ouro.,,Revin-o când ai niște aur.,"Возвращайся, когда у тебя будет золото.",,Kom tillbaka när du får lite guld.,Biraz altın bulduğunda geri gel. +"Well, you're asking a lot of questions for someone who's not trying to die. Make sure you don't go and get yourself killed, or worse.",TXT_DLG_SCRIPT02_D28804_WELLY,〃,,,"Na někoho, kdo se nesnaží zemřít, se hodně ptáš. Dej si pozor a nenech se zabít, nebo něco horšího.","Du stiller mange spørgsmål af en, der ikke prøver at dø. Sørg for, at du ikke går hen og bliver dræbt, eller det der er værre.","Hmm, du stellst aber ziemlich viele Fragen für jemand der nicht versucht zu sterben. Lass dich nicht umbringen, oder schlimmeres.",,"Nu, vi faras multe da demandoj por esti iu, kiu ne intencas morti. Certiĝu, ke vi ne kaŭzos al vi mortigon... aŭ ion pli malbonan.","Bueno, estás haciendo muchas preguntas para ser alguien que no está tratando de morir. Asegúrate de que no vayas a hacer que te maten... o algo peor.",,"Kylläpäs te kysytte paljon ollaksenne joku, joka ei yritä tappaa itsensä. Pitäkää vain huoli, ettei niin edelleenkään käy, tai pahemmin.","Vous posez beaucoup de questions pour quelqu'un qui n'essaie pas de se faire tuer. Essayez donc de ne pas vous faire descendre, ou pire.",,"Figyelj, elég sok kérdést teszel fel, ahhoz képest, hogy elvileg nem akarsz meghalni. Igyekezz nem kinyiratni magad a továbbiakban, vagy rosszabb.","Lo sai, fai davvero tante domande per uno che cerca di sopravvivere. Fai attenzione a non farti uccidere, o peggio...","所で、アンタは死に行かない人達に 聞き回ってる様だが。悪いことは言わねえ、 あんまし死に急ぐんじゃねえぞ。",죽지 않으려고 발버둥 치듯이 질문을 많이 하는구먼. 무장한 곳에 무모하게 가서 죽지나 말게.,"Nou, je stelt veel vragen voor iemand die niet probeert te sterven. Zorg ervoor dat je niet gaat en jezelf niet dood laat gaan, of erger nog.",Du stiller mange spørsmål til å være en som ikke prøver å dø. Pass på at du ikke blir drept eller det som verre er.,"Cóż, zadajesz dużo pytań jak na kogoś, kto próbuje nie zginąć. Upewnij się, że nie dasz się zabić jak pójdziesz. Lub gorzej.","Bom, você está fazendo um monte de perguntas pra alguém que não está tentando morrer. Procure não acabar sendo morto por aí, ou coisa pior.",,"Păi, pui multe întrebări pentru cineva care încearcă să nu moară. Ai grijă să nu ajungi un om mort, sau mai rău.","Ты задаёшь слишком много вопросов для того, кто не хочет сдохнуть. Убедись, что не идёшь на верную смерть или чего похуже.",,"Du ställer många frågor för någon som inte försöker dö. Se till att du inte går och blir dödad, eller värre.",Ölmeye çalışmayan biri için çok fazla soru soruyorsun. Gidip kendini öldürtmediğinden ya da daha kötüsünü yapmadığından emin ol. -More info.,TXT_RPLY0_SCRIPT02_D28804_MOREI,〃,,,Další informace,Mere info.,Mehr Informationen.,,Pliaj informoj,Más información,,Muuta tietoa.,Plus d'infos.,Több infót.,Altre informazioni.,話のネタ。,정보를 좀 더 알려주시오.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multe informații.,Говори дальше.,,Mer information.,Daha fazla bilgi. +More info.,TXT_RPLY0_SCRIPT02_D28804_MOREI,〃,,,Další informace,Mere info.,Mehr Informationen.,,Pliaj informoj,Más información,,Muuta tietoa.,Plus d'infos.,,Több infót.,Altre informazioni.,話のネタ。,정보를 좀 더 알려주시오.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multe informații.,Говори дальше.,,Mer information.,Daha fazla bilgi. There's more to the Order than meets the eye.,TXT_RYES0_SCRIPT02_D28804_THERE,〃,,,"Za Řádem se toho skrývá víc, než se zdá.","Der er mere i Ordenen, end man umiddelbart tror.",An dem Orden ist mehr dran als man auf den ersten Blick denkt.,,"Estas pli pri La Ordeno, ol kiom ili ŝajnigas.","Hay más de La Orden -de lo que aparenta.",,"Veljeskunta ei ole sitä, miltä päältä päin näyttää.",L'Ordre cache bien son jeu.,"Több van a Rend mögött, mint ami a külső sejtet.",C'è sotto molto di più sull'Ordine rispetto a come possa sembrare.,オーダーは見えてる以上に強大だ。,오더의 뒤에는 더 많은 것들이 숨겨져 있다네. 비밀 같은 것들 말일세.,De Orde heeft meer te bieden dan je op het eerste gezicht zou denken.,Det er mer ved Ordenen enn det som møter øyet.,"Zakonu jest więcej, niż się wydaje.",Há mais sobre a Ordem do que aparenta.,,Este ceva mai mult la Ordin decât ceea ce se poate vedea cu ochiul liber.,"Орден больше, чем кажется.",,Det finns mer i Orden än vad man kan tro.,Tarikat'ta göründüğünden daha fazlası var. +de lo que aparenta.",,"Veljeskunta ei ole sitä, miltä päältä päin näyttää.",L'Ordre cache bien son jeu.,,"Több van a Rend mögött, mint ami a külső sejtet.",C'è sotto molto di più sull'Ordine rispetto a come possa sembrare.,オーダーは見えてる以上に強大だ。,오더의 뒤에는 더 많은 것들이 숨겨져 있다네. 비밀 같은 것들 말일세.,De Orde heeft meer te bieden dan je op het eerste gezicht zou denken.,Det er mer ved Ordenen enn det som møter øyet.,"Zakonu jest więcej, niż się wydaje.",Há mais sobre a Ordem do que aparenta.,,Este ceva mai mult la Ordin decât ceea ce se poate vedea cu ochiul liber.,"Орден больше, чем кажется.",,Det finns mer i Orden än vad man kan tro.,Tarikat'ta göründüğünden daha fazlası var. We'll talk when you get gold!,TXT_RNO0_SCRIPT02_D28804_WELLT,〃,,,"Popovídáme si, když budeš mít zlato!","Vi taler sammen, når du får guld!","Wir werden reden, wenn du Gold hast!",,"Ni parolos kiam -vi alportos oron!",¡Hablamos cuando traigas oro!,,"Puhutaan, kun sinulla on kultaa.",On parlera quand tu auras des sous!,"Majd beszélünk, ha lesz aranyad.",Ne parleremo quando avrai più soldi!,銭を持ってたら話すさ!,골드를 더 가져오면 의논을 시작해보지.,We praten wel als je goud krijgt!,Vi snakkes når du får gull!,Pomówimy jeśli masz złoto.,Conversaremos quando você tiver ouro!,,Vorbim când aduci aur!,"Поговорим, когда принесёшь золото!",,Vi pratar när du får guld!,Altın aldığında konuşuruz! -"That's it friend, the well of knowledge has run dry. I've told you more than I should have anyway. Good luck... And don't come back.",TXT_DLG_SCRIPT02_D30320_THATS,〃,,,"A to je vše, příteli, studnice mé moudrosti vyschla. Stejně jsem ti řekl víc, než jsem měl. Hodně štěstí... a už se nevracej.","Det var det, ven, vidensbrønden er tørlagt. Jeg har alligevel fortalt dig mere, end jeg burde have gjort. Held og lykke... Og kom ikke tilbage.","Das war's mein Freund, der Brunnen der Weisheit ist versiegt. Ich habe dir sowieso mehr erzählt als ich sollte. Viel Glück... und komm nicht zurück.",,"Jen ĉio, amiko, la fonto de scio sekiĝis. Malgraŭ tio, mi diris al vi pli ol tiom, kiom mi devus. Ŝancon... kaj ne revenu.","Ya está, amigo, el pozo del conocimiento ya se ha secado. De todas formas ya te he dicho más de lo que debería. Suerte... y no vuelvas.","Ya está, amigo, el pozo del conocimiento ya se secó. De todas formas ya te dije más de lo que debería. Suerte... y no vuelvas.","Siinä kaikki, ystävä; tiedon lähde on ehtynyt. Olen kertonut sinulle enemmän kuin olisin edes saanutkaan. Onnea matkaan... äläkä tule takaisin.","Eh bien voilà, mon ami, le puits de la connaîssance s'est enfin asséché.. Je t'en ai dit plus que je n'aurai du, de toutes manières! Bonne chance.. Et ne reviens pas!","Ez az, barátom. A tudás kútja kiszáradt. Többször mondtam neked kelleténél amúgyis. Sok szerencsét... És ne gyere vissza.","È tutto, amico, ho esaurito le cose che avevo da dirti. Ti ho già detto più di quanto avrei dovuto. Buona fortuna... e non tornare più.","これはこれは親友、心得の瓶は切らしてるぞ。 +vi alportos oron!",¡Hablamos cuando traigas oro!,,"Puhutaan, kun sinulla on kultaa.",On parlera quand tu auras des sous!,,"Majd beszélünk, ha lesz aranyad.",Ne parleremo quando avrai più soldi!,銭を持ってたら話すさ!,골드를 더 가져오면 의논을 시작해보지.,We praten wel als je goud krijgt!,Vi snakkes når du får gull!,Pomówimy jeśli masz złoto.,Conversaremos quando você tiver ouro!,,Vorbim când aduci aur!,"Поговорим, когда принесёшь золото!",,Vi pratar när du får guld!,Altın aldığında konuşuruz! +"That's it friend, the well of knowledge has run dry. I've told you more than I should have anyway. Good luck... And don't come back.",TXT_DLG_SCRIPT02_D30320_THATS,〃,,,"A to je vše, příteli, studnice mé moudrosti vyschla. Stejně jsem ti řekl víc, než jsem měl. Hodně štěstí... a už se nevracej.","Det var det, ven, vidensbrønden er tørlagt. Jeg har alligevel fortalt dig mere, end jeg burde have gjort. Held og lykke... Og kom ikke tilbage.","Das war's mein Freund, der Brunnen der Weisheit ist versiegt. Ich habe dir sowieso mehr erzählt als ich sollte. Viel Glück... und komm nicht zurück.",,"Jen ĉio, amiko, la fonto de scio sekiĝis. Malgraŭ tio, mi diris al vi pli ol tiom, kiom mi devus. Ŝancon... kaj ne revenu.","Ya está, amigo, el pozo del conocimiento ya se ha secado. De todas formas ya te he dicho más de lo que debería. Suerte... y no vuelvas.","Ya está, amigo, el pozo del conocimiento ya se secó. De todas formas ya te dije más de lo que debería. Suerte... y no vuelvas.","Siinä kaikki, ystävä; tiedon lähde on ehtynyt. Olen kertonut sinulle enemmän kuin olisin edes saanutkaan. Onnea matkaan... äläkä tule takaisin.","Eh bien voilà, mon ami, le puits de la connaîssance s'est enfin asséché.. Je t'en ai dit plus que je n'aurai du, de toutes manières! Bonne chance.. Et ne reviens pas!",,"Ez az, barátom. A tudás kútja kiszáradt. Többször mondtam neked kelleténél amúgyis. Sok szerencsét... És ne gyere vissza.","È tutto, amico, ho esaurito le cose che avevo da dirti. Ti ho già detto più di quanto avrei dovuto. Buona fortuna... e non tornare più.","これはこれは親友、心得の瓶は切らしてるぞ。 とにかく俺が知ってる話はこれで全部だ。 頑張りな...それともう来なくていいぞ。","친구여... 안타깝게도 지식의 우물은 이제 고갈됐다네. 내가 알려줄 수 있는 걸 다 알려줬거든. 건투를 빌겠네, 그리고 다시 돌아오지는 말고.","Dat is het vriend, de bron van kennis is uitgeput. Ik heb je meer verteld dan ik zou moeten hebben. Veel succes.... En kom niet terug.","Det var det, min venn. Kunnskapens brønn har tørket ut. Jeg har fortalt deg mer enn jeg burde uansett. Lykke til... Og ikke kom tilbake.","To wszystko kolego, studnia wiedzy wyschła. Powiedziałem ci więcej niż powinienem. Powodzenia... I nie wracaj.","Isso é tudo, camarada. O poço de conhecimento está seco. Já te contei tudo o que eu deveria, de qualquer forma. Boa sorte... E não volte mais aqui.",,"Asta a fost prietene, fântâna cunoștiințelor a secat. Ți-am spus mai multe decât ar fi trebuit oricum. Baftă... Și nu te întoarce.","Это всё, дружище. Кладезь мудрости исчерпана. Я и так рассказал тебе больше, чем следовало. Удачи... и не возвращайся.",,"Det var det vän, kunskapsbrunnen har tagit slut. Jag har berättat mer än jag borde ha gjort i alla fall. Lycka till... Och kom inte tillbaka.","Bu kadar dostum, bilgi kuyusu kurudu. Zaten sana söylemem gerekenden fazlasını söyledim. İyi şanslar. Ve sakın geri gelme." -"Hey, I'm only here in case of an emergency. If the core breaches, then I make sure no one gets in... or out.",TXT_DLG_SCRIPT02_D31836_HEYIM,MAP02: Power Station guard.,,,"Hej, já jsem tu jen pro případ nouze. Jestli se něco stane s jádrem, jsem tu, abych zajistil, že se nikdo nedostane dovnitř... ani ven.","Hey, jeg er her kun i nødstilfælde. Hvis kernen bryder sammen, så sørger jeg for, at ingen kommer ind... eller ud.","Hey, ich bin nur für den Fall eines Notfalls hier. Im Falle eines Kernbruchs sorge ich dafür das niemand rein kommt... oder raus.",,"Mi nur estas krizokaza gardisto: se la kerno rompiĝus, mi certiĝus, ke neniu eniru... aŭ eliru.","Solo estoy aquí en caso de emergencia: si el núcleo se rompe, me aseguro de que nadie entre... o salga.",,"Hei, olen täällä vain hätätilanteen varalta. Jos ytimeen tulee murtuma, tehtäväni on varmistaa, ettei kukaan pääse sisään... tai ulos.","Hé, je ne suis là qu'en cas d'urgence. Si le coeur a une brèche, il faut que je fasse en sorte que rien ne rentre.. Ou ne sorte.","Hé, én csak vészhelyzet esetére vagyok itt. Ha a mag kitör, akkor elintézem, hogy senki ne jöjjön be... vagy ki.","Ehi, io sono qua solo in caso di emergenza. Se c'è una falla nel nucleo, allora mi assicuro che nessuno possa entrare... o uscire.","おう、俺は緊急時の為にここにいる。 +"Hey, I'm only here in case of an emergency. If the core breaches, then I make sure no one gets in... or out.",TXT_DLG_SCRIPT02_D31836_HEYIM,MAP02: Power Station guard.,,,"Hej, já jsem tu jen pro případ nouze. Jestli se něco stane s jádrem, jsem tu, abych zajistil, že se nikdo nedostane dovnitř... ani ven.","Hey, jeg er her kun i nødstilfælde. Hvis kernen bryder sammen, så sørger jeg for, at ingen kommer ind... eller ud.","Hey, ich bin nur für den Fall eines Notfalls hier. Im Falle eines Kernbruchs sorge ich dafür das niemand rein kommt... oder raus.",,"Mi nur estas krizokaza gardisto: se la kerno rompiĝus, mi certiĝus, ke neniu eniru... aŭ eliru.","Solo estoy aquí en caso de emergencia: si el núcleo se rompe, me aseguro de que nadie entre... o salga.",,"Hei, olen täällä vain hätätilanteen varalta. Jos ytimeen tulee murtuma, tehtäväni on varmistaa, ettei kukaan pääse sisään... tai ulos.","Hé, je ne suis là qu'en cas d'urgence. Si le coeur a une brèche, il faut que je fasse en sorte que rien ne rentre.. Ou ne sorte.",,"Hé, én csak vészhelyzet esetére vagyok itt. Ha a mag kitör, akkor elintézem, hogy senki ne jöjjön be... vagy ki.","Ehi, io sono qua solo in caso di emergenza. Se c'è una falla nel nucleo, allora mi assicuro che nessuno possa entrare... o uscire.","おう、俺は緊急時の為にここにいる。 コアが破壊されないか、誰が入っているかを 確認している...出ていくのもな。","이봐, 난 비상사태를 대비해서 여기에 있는 거라고. 만약 중심부가 파괴되면, 그 누구도 들어올 수 없게 막을 거야... 도망치는 사람도 포함해서.","Hé, ik ben hier alleen in geval van nood. Als de kern breekt, dan zorg ik ervoor dat er niemand binnenkomt... of buitenkomt.","Hei, jeg er bare her i nødstilfeller. Hvis kjernen brister, sørger jeg for at ingen kommer inn... eller ut.","Hej, jestem tu tylko w razie wypadku. Jeśli rdzeń zostanie naruszony, wtedy upewniam się, że nikt tam nie wejdzie... lub stamtąd nie wyjdzie.","Ei, só estou aqui em caso de uma emergência. Se o núcleo se romper, preciso garantir que ninguém entre... ou saia.",,"Hei, sunt aici doar în caz de urgență. Dacă apare o breșă în nucleu, mă asigur că nimeni nu intră... sau iese.","Слушай, меня сюда поставили на всякий случай. Если целостность ядра нарушится, я позабочусь, чтобы никто не вошёл... и не вышел.",,"Jag är bara här i nödfall. Om kärnan bryter igenom, ser jag till att ingen kommer in... eller ut.","Hey, ben sadece acil bir durumda buradayım. Çekirdek kırılırsa, kimsenin içeri girmediğinden emin olurum... ya da dışarı." "Watch your step, peasant!",TXT_DLG_SCRIPT02_D33352_WATCH,MAP02: Rust guards.,,,"Dávej si na sebe pozor, poddaný! -","Pas på hvor du træder, bonde!","Pass auf wo du hintrittst, Bauer!",,"Atentu tie, kie vi piediras, kampulo!","¡Cuida por donde caminas, campesino!","¡Cuidado por donde caminas, campesino!","Katso, mihin astut, maallikko!","Regarde où tu va, paysan!","Nézz a lábad elé, paraszt!",Guarda dove metti i piedi!,気を付けろ、田舎モン!,"똑바로 보고 다녀라, 시민!","Kijk uit waar je loopt, boer!","Se deg for, bonde!",Uważaj jak leziesz kmiocie!,"Cuida por onde anda, plebeu!",,"Ai grijă pe unde calci, plebeule!","Смотри, куда прёшь, холоп!",,"Se upp, bonde!","Adımına dikkat et, köylü!" -We're going to kill you! ,TXT_DLG_SCRIPT02_D34868_WEREG,MAP02: Gray guards.,,,Zabijeme tě!,Vi slår dig ihjel!,Wir werden dich umbringen!,,Ni mortigos vin!,¡Te vamos a matar!,,Tapamme sinut!,On va te descendre!,Megdöglesz!,Adesso ti ammazziamo!,お前を粛正する!,우린 널 죽일거야!,We gaan je vermoorden!,Vi skal drepe deg!,Zabijemy cię!,Vamos matar você!,,O să te omorâm!,Готовься к смерти!,,Vi kommer att döda dig!,Seni öldüreceğiz! -Who in the blazes are you? No one's supposed to be loitering about in this area!,TXT_DLG_SCRIPT02_D36384_WHOIN,MAP02: Green guard.,,,Kdo k čertu jsi? Tady se nikdo nemá potloukat!,Hvem i helvede er du? Ingen skal slentre rundt i dette område!,Wer zum Teufel bist du? Hier soll doch eigentlich niemand rumschnüffeln!,,Kiu diable vi estas? Neniu supozeble devas vagi ĉi tie!,¿Quién diantres eres tú? ¡Se supone que nadie tiene que estar merodeando por esta área!,¿Quién demonios eres tú? ¡Se supone que nadie tiene que estar curioseando por esta zona!,Kuka ihme sinä olet? Kenelläkään ei ole lupaa kuljeksia tällä alueella!,Qu'est ce que c'est ça? Que faites vous ici? Personne n'est sensé se trouver dans cette zone!,Te meg ki az Isten nyila vagy? Senki sem csavaroghat ebben a körzetben.,E tu chi diavolo saresti? Nessuno dovrebbe aggirarsi in quest'area!,"誰だお前は?この区域を立ち入ることは +","Pas på hvor du træder, bonde!","Pass auf wo du hintrittst, Bauer!",,"Atentu tie, kie vi piediras, kampulo!","¡Cuida por donde caminas, campesino!","¡Cuidado por donde caminas, campesino!","Katso, mihin astut, maallikko!","Regarde où tu va, paysan!",,"Nézz a lábad elé, paraszt!",Guarda dove metti i piedi!,気を付けろ、田舎モン!,"똑바로 보고 다녀라, 시민!","Kijk uit waar je loopt, boer!","Se deg for, bonde!",Uważaj jak leziesz kmiocie!,"Cuida por onde anda, plebeu!",,"Ai grijă pe unde calci, plebeule!","Смотри, куда прёшь, холоп!",,"Se upp, bonde!","Adımına dikkat et, köylü!" +We're going to kill you! ,TXT_DLG_SCRIPT02_D34868_WEREG,MAP02: Gray guards.,,,Zabijeme tě!,Vi slår dig ihjel!,Wir werden dich umbringen!,,Ni mortigos vin!,¡Te vamos a matar!,,Tapamme sinut!,On va te descendre!,,Megdöglesz!,Adesso ti ammazziamo!,お前を粛正する!,우린 널 죽일거야!,We gaan je vermoorden!,Vi skal drepe deg!,Zabijemy cię!,Vamos matar você!,,O să te omorâm!,Готовься к смерти!,,Vi kommer att döda dig!,Seni öldüreceğiz! +Who in the blazes are you? No one's supposed to be loitering about in this area!,TXT_DLG_SCRIPT02_D36384_WHOIN,MAP02: Green guard.,,,Kdo k čertu jsi? Tady se nikdo nemá potloukat!,Hvem i helvede er du? Ingen skal slentre rundt i dette område!,Wer zum Teufel bist du? Hier soll doch eigentlich niemand rumschnüffeln!,,Kiu diable vi estas? Neniu supozeble devas vagi ĉi tie!,¿Quién diantres eres tú? ¡Se supone que nadie tiene que estar merodeando por esta área!,¿Quién demonios eres tú? ¡Se supone que nadie tiene que estar curioseando por esta zona!,Kuka ihme sinä olet? Kenelläkään ei ole lupaa kuljeksia tällä alueella!,Qu'est ce que c'est ça? Que faites vous ici? Personne n'est sensé se trouver dans cette zone!,,Te meg ki az Isten nyila vagy? Senki sem csavaroghat ebben a körzetben.,E tu chi diavolo saresti? Nessuno dovrebbe aggirarsi in quest'area!,"誰だお前は?この区域を立ち入ることは 許されていないぞ! ",너는 누구지? 아무도 이 지역에서 어슬렁거릴 수 없다!,Wie ben jij in vredesnaam? Niemand wordt verondersteld op dit gebied rond te hangen!,Hvem i all verden er du? Ingen har lov til å drive rundt i dette området!,Kim u diaska jesteś? Nikt nie powinien się tu włóczyć!,Mas quem é você? Não pode ficar perambulando por aqui!,,Cine naiba mai ești tu? Nimeni nu ar trebui să zăbovească în zona asta!,"Кто ты, чёрт побери, такой? Никому не разрешено тут шляться!",,Vem i helvete är du? Det är inte meningen att någon ska gå omkring i det här området!,Sen de kimsin be? Kimsenin bu bölgede dolaşmaması gerekiyor! -"You there, nobody's allowed in here. Move along!",TXT_DLG_SCRIPT02_D37900_YOUTH,MAP02: Golden guards.,,,"Hej ty, sem nikdo nesmí. Jdi dál!","Du der, ingen må komme ind her. Af sted med jer!","Hey, du da. Hier darfst du nicht rein. Geh weiter!",,"He, neniu rajtas esti ĉi tie. Plue movu vin!","Oye, este lugar está restringido. ¡Sigue moviéndote!",,"Sinä siellä, tämä on kielletty alue. Tiehesi!","Vous, là, personne n'est autorisé à traîner ici, dégagez!","Te ott, ide senki sem jöhet be, kotródj!","Ehi, tu! A nessuno è permesso di stare qua. Vai via!",お前は許可していないぞ。立ち去れ!,"거기 너, 아무도 이곳에 지나갈 수 없다. 가던 길이나 가!","Jij daar, niemand mag hier naar binnen. Ga verder!","Du der, ingen har lov til å være her. Gå videre!","Ty tutaj, nikt nie ma prawa tu przebywać. Wynocha!","Ei, você, não pode ficar aqui. Vá embora!",,"Tu, nimeni nu are voie aici. Mișcă-te!","Эй, ты! Никому не позволено тут ошиваться. Проваливай!",,"Du där, ingen får komma in här. Flytta på er!","Sen oradaki, kimsenin buraya girmesine izin yok. İlerleyin!" -Irale will set you right up!,TXT_DLG_SCRIPT02_D39416_IRALE,MAP02: Irale's shop.,,,Irale tě hned vyzbrojí!,Irale vil sætte dig på plads!,Irale wird sich darum kümmern!,,"Irale vendos al vi ĉion, kion vi bezonas!",¡Irale te venderá lo necesario!,¡Irale te va a vender lo necesario!,Irale järkkää sinulle varusteet!,Irale a ce qu'il te faut!,Irale majd ellát.,Irale ti darà quello che ti serve!,イラールが貴方を手助けします!,여기 이롤리가 중요한 물품을 판매할 거야.,Irale zal je er goed in luizen!,Irale skal ordne opp for deg!,Irale dobrze cię przygotuje!,O Irale vai te ajudar!,,Irale te va pregăti adecvat!,Ирэйл снабдит тебя всем необходимым!,,Irale kommer att sätta dig på plats!,İrale seni hemen ayarlayacak! -I'm kinda a talent broker for the rebels. A guy who's as good as you could make a lot of gold... if you hooked up with the right people.,TXT_DLG_SCRIPT02_D40932_IMKIN,MAP02: Harris.,,,Jsem takový hledač talentů pro rebely. Někdo tak dobrý jako ty by si mohl vydělat hodně zlata... pokud by se spojil s těmi správnými lidmi.,"Jeg er en slags talentmægler for oprørerne. En fyr, der er lige så god som dig, kan tjene en masse guld ... hvis du kommer i kontakt med de rigtige folk.","Ich bin sowas wie ein Talentsucher für die Rebellen. Jemand, der so gut ist wie du kann hier eine Menge Gold verdienen... wenn du mit den richtigen Leuten in Verbindung stehst.",,"Mi estas speco de talentul-serĉanto por la ribelantoj. Iu tiel lerta, kiel vi povus gajni multe da oro… se vi ligas vin kun la ĝustaj homoj.",Soy algo así como un cazatalentos para los rebeldes. Alguien tan bueno como tú podría ganar mucho oro... Si te juntas con las personas adecuadas.,,Olen eräänlainen kykyjenvälittäjä kapinallisille. Kaltaisesi kaveri voisi tienata paljon kultaa... oikeiden kumppaneiden kanssa.,"Je suis une sorte de chasseur de têtes pour les rebelles. Un type comme toi pourrait se faire pas mal de fric... Avec les bons contacts, bien entendu.","Egyfajta toborzó vagyok a lázadóknál. Egy ürge aki ilyen jó mint te, elég sok aranyat kereshet...ha megfelelő emberekkel jösz össze.",Sono sempre alla ricerca di persone talentuose per i ribelli. Una persona come te potrebbe ricevere molto oro... se fosse in contatto con le persone giuste.,"俺は反乱者への斡旋屋さ。才能を生かして +"You there, nobody's allowed in here. Move along!",TXT_DLG_SCRIPT02_D37900_YOUTH,MAP02: Golden guards.,,,"Hej ty, sem nikdo nesmí. Jdi dál!","Du der, ingen må komme ind her. Af sted med jer!","Hey, du da. Hier darfst du nicht rein. Geh weiter!",,"He, neniu rajtas esti ĉi tie. Plue movu vin!","Oye, este lugar está restringido. ¡Sigue moviéndote!",,"Sinä siellä, tämä on kielletty alue. Tiehesi!","Vous, là, personne n'est autorisé à traîner ici, dégagez!",,"Te ott, ide senki sem jöhet be, kotródj!","Ehi, tu! A nessuno è permesso di stare qua. Vai via!",お前は許可していないぞ。立ち去れ!,"거기 너, 아무도 이곳에 지나갈 수 없다. 가던 길이나 가!","Jij daar, niemand mag hier naar binnen. Ga verder!","Du der, ingen har lov til å være her. Gå videre!","Ty tutaj, nikt nie ma prawa tu przebywać. Wynocha!","Ei, você, não pode ficar aqui. Vá embora!",,"Tu, nimeni nu are voie aici. Mișcă-te!","Эй, ты! Никому не позволено тут ошиваться. Проваливай!",,"Du där, ingen får komma in här. Flytta på er!","Sen oradaki, kimsenin buraya girmesine izin yok. İlerleyin!" +Irale will set you right up!,TXT_DLG_SCRIPT02_D39416_IRALE,MAP02: Irale's shop.,,,Irale tě hned vyzbrojí!,Irale vil sætte dig på plads!,Irale wird sich darum kümmern!,,"Irale vendos al vi ĉion, kion vi bezonas!",¡Irale te venderá lo necesario!,¡Irale te va a vender lo necesario!,Irale järkkää sinulle varusteet!,Irale a ce qu'il te faut!,,Irale majd ellát.,Irale ti darà quello che ti serve!,イラールが貴方を手助けします!,여기 이롤리가 중요한 물품을 판매할 거야.,Irale zal je er goed in luizen!,Irale skal ordne opp for deg!,Irale dobrze cię przygotuje!,O Irale vai te ajudar!,,Irale te va pregăti adecvat!,Ирэйл снабдит тебя всем необходимым!,,Irale kommer att sätta dig på plats!,İrale seni hemen ayarlayacak! +I'm kinda a talent broker for the rebels. A guy who's as good as you could make a lot of gold... if you hooked up with the right people.,TXT_DLG_SCRIPT02_D40932_IMKIN,MAP02: Harris.,,,Jsem takový hledač talentů pro rebely. Někdo tak dobrý jako ty by si mohl vydělat hodně zlata... pokud by se spojil s těmi správnými lidmi.,"Jeg er en slags talentmægler for oprørerne. En fyr, der er lige så god som dig, kan tjene en masse guld ... hvis du kommer i kontakt med de rigtige folk.","Ich bin sowas wie ein Talentsucher für die Rebellen. Jemand, der so gut ist wie du kann hier eine Menge Gold verdienen... wenn du mit den richtigen Leuten in Verbindung stehst.",,"Mi estas speco de talentul-serĉanto por la ribelantoj. Iu tiel lerta, kiel vi povus gajni multe da oro… se vi ligas vin kun la ĝustaj homoj.",Soy algo así como un cazatalentos para los rebeldes. Alguien tan bueno como tú podría ganar mucho oro... Si te juntas con las personas adecuadas.,,Olen eräänlainen kykyjenvälittäjä kapinallisille. Kaltaisesi kaveri voisi tienata paljon kultaa... oikeiden kumppaneiden kanssa.,"Je suis une sorte de chasseur de têtes pour les rebelles. Un type comme toi pourrait se faire pas mal de fric... Avec les bons contacts, bien entendu.",,"Egyfajta toborzó vagyok a lázadóknál. Egy ürge aki ilyen jó mint te, elég sok aranyat kereshet...ha megfelelő emberekkel jösz össze.",Sono sempre alla ricerca di persone talentuose per i ribelli. Una persona come te potrebbe ricevere molto oro... se fosse in contatto con le persone giuste.,"俺は反乱者への斡旋屋さ。才能を生かして 誰よりも儲けたいと思ってるなら... 相応しい人と関係を持つことさ。 ",난 반란군을 위한 일종의 재능 중개인이야. 당신만큼 좋은 사람이라면 많은 돈을 벌 수 있겠지... 당신이 제대로 된 사람들과 연결되어 있다면.,Ik ben een soort van een talent makelaar voor de rebellen. Een man die zo goed is als je zou kunnen maken veel goud .... als je aangesloten met de juiste mensen.,Jeg er en slags talentmegler for opprørerne. En fyr som er så god som deg kan tjene mye gull... hvis du kommer i kontakt med de rette folkene.,Jestem tak jakby pośrednikiem rebeliantów. Człowiek tak dobry jak ty może zarobić dużo pieniędzy... jeśli trzymasz z właściwymi ludźmi.,Sou tipo um olheiro de talentos para rebeldes. Um cara tão bom quanto você poderia fazer bastante grana... se você se juntar às pessoas certas.,,Sunt un fel de broker de talent pentru rebeli. Un tip la fel de priceput precum ești tu ar putea face bani frumoși... dacă s-ar lega de cine trebuie.,"Я, скажем так, вербовщик повстанцев. Такой парень, как ты, может неплохо заработать... если состыкуется с нужными людьми.",,Jag är en slags talangmäklare för rebellerna. En kille som är lika bra som du kan tjäna en massa guld... om du kopplar ihop dig med rätt personer.,Ben asiler için yetenek simsarı sayılırım. Senin kadar iyi bir adam çok altın kazanabilir... eğer doğru insanlarla bağlantı kurarsan. -I'm interested.,TXT_RPLY0_SCRIPT02_D40932_IMINT,〃,,,Mám zájem.,Jeg er interesseret.,Ich bin interessiert.,,Tio interesas min.,Me interesa.,,Olen kiinnostunut.,Je suis intéressé.,Érdekel.,Sono interessato.,興味ある。,흥미롭군.,Ik ben geïnteresseerd.,Jeg er interessert.,Jestem zainteresowany.,Tenho interesse.,,Sunt interesat.,Я заинтригован.,,Jag är intresserad.,İlgileniyorum. -Screw the rebels!,TXT_RPLY1_SCRIPT02_D40932_SCREW,〃,,,Kašlu na rebely!,Skide være med rebellerne!,Scheiß auf die Rebellen!,,Fi al la ribelantoj!,¡Al demonio los rebeldes!,¡Al carajo los rebeldes!,Paskat kapinallisista!,Je m'en fous des rebelles!,Francba a lázadókkal!,Fanculo i ribelli!,何が反逆だ!,반란군은 집어치워!,De pot op met de rebellen!,Til helvete med opprørerne!,Pieprzyć rebeliantów!,Que se danem os rebeldes!,,La naiba cu rebelii!,К чёрту повстанцев!,,Skit i rebellerna!,Asilerin canı cehenneme! -"No, no second chance. Oh guards, kill him.",TXT_DLG_SCRIPT02_D42448_NONOS,〃,,,"Druhou šanci už nedostaneš. Á, stráže, zabte ho.","Nej, ingen ny chance. Åh vagter, dræb ham.","Nein, keine zweite Chance. Oh, Wachen, tötet ihn.",,"Ne, ne estas alia ŝanco. Gardistoj, mortigu lin!","No, no hay otra oportunidad. ¡Guardias, matadlo!","No, no hay otra oportunidad. ¡Guardias, mátenlo!","Ei, ei toista mahdollisuutta. Vartijat, tappakaa hänet.","Non, non, pas de deuxième chance. Gardes, tuez-le.","Nem, nincs második esély. Őrök, intézzétek el!","Nessuna seconda chance. Guardie, uccidetelo.","次はねえな。おぅガードの旦那、 +I'm interested.,TXT_RPLY0_SCRIPT02_D40932_IMINT,〃,,,Mám zájem.,Jeg er interesseret.,Ich bin interessiert.,,Tio interesas min.,Me interesa.,,Olen kiinnostunut.,Je suis intéressé.,,Érdekel.,Sono interessato.,興味ある。,흥미롭군.,Ik ben geïnteresseerd.,Jeg er interessert.,Jestem zainteresowany.,Tenho interesse.,,Sunt interesat.,Я заинтригован.,,Jag är intresserad.,İlgileniyorum. +Screw the rebels!,TXT_RPLY1_SCRIPT02_D40932_SCREW,〃,,,Kašlu na rebely!,Skide være med rebellerne!,Scheiß auf die Rebellen!,,Fi al la ribelantoj!,¡Al demonio los rebeldes!,¡Al carajo los rebeldes!,Paskat kapinallisista!,Je m'en fous des rebelles!,,Francba a lázadókkal!,Fanculo i ribelli!,何が反逆だ!,반란군은 집어치워!,De pot op met de rebellen!,Til helvete med opprørerne!,Pieprzyć rebeliantów!,Que se danem os rebeldes!,,La naiba cu rebelii!,К чёрту повстанцев!,,Skit i rebellerna!,Asilerin canı cehenneme! +"No, no second chance. Oh guards, kill him.",TXT_DLG_SCRIPT02_D42448_NONOS,〃,,,"Druhou šanci už nedostaneš. Á, stráže, zabte ho.","Nej, ingen ny chance. Åh vagter, dræb ham.","Nein, keine zweite Chance. Oh, Wachen, tötet ihn.",,"Ne, ne estas alia ŝanco. Gardistoj, mortigu lin!","No, no hay otra oportunidad. ¡Guardias, matadlo!","No, no hay otra oportunidad. ¡Guardias, mátenlo!","Ei, ei toista mahdollisuutta. Vartijat, tappakaa hänet.","Non, non, pas de deuxième chance. Gardes, tuez-le.",,"Nem, nincs második esély. Őrök, intézzétek el!","Nessuna seconda chance. Guardie, uccidetelo.","次はねえな。おぅガードの旦那、 やっちゃってくだせえ。","안 돼, 두 번째 기회는 없어. 경비원, 저놈을 죽여.","Nee, geen tweede kans. Oh bewakers, dood hem.","Nei, ingen ny sjanse. Vakter, drep ham.","Nie, nie będzie drugiej szansy. Oh... strażnicy, zabijcie go.","Não, sem segundas chances. Ah, guardas, matem ele.",,"Nu, nici o altă șansă. Oh gardienilor, omorâți-l.","Нет, никакого второго шанса. Эй, стража, убейте его.",,"Nej, ingen andra chans. Åh vakter, döda honom.","Hayır, ikinci bir şans yok. Muhafızlar, öldürün onu." -Good choice. The Order's sanctuary by the river is their unofficial torture chamber. Hidden inside there's a golden chalice. You swipe it and reap your reward.,TXT_DLG_SCRIPT02_D43964_GOODC,〃,,,Dobrá volba. Svatyně Řádu u řeky je jejich tajná mučírna. Uvnitř je skrytý zlatý kalich. Ukradni ho a převezmi si svou odměnu.,Godt valg. Ordenens fristed ved floden er deres uofficielle torturkammer. Der er en gylden bæger gemt derinde. Du tager den og høster din belønning.,Gute Wahl. Das Heiligtum des Ordens bei dem Fluss ist ihre inoffiziele Folterkammer. Darin versteckt ist ein goldener Kelch. Du klaust ihn und erntest deinen Lohn.,,Bona elekto. La sanktejo de La Ordeno ĉe la rojo estas ĝia neoficiala torturejo. En ĝi estas kaŝita ora kaliko. Alportu ĝin al mi kaj vi havos rekompencon.,Buena elección. El santuario de La Orden junto al arroyo es su cámara de tortura extraoficial. Dentro hay un cáliz dorado escondido. Tráemelo y tendrás tu recompensa.,"Buena elección. El santuario de La Orden junto al río es su cámara de tortura extraoficial. Adentro hay un cáliz dorado escondido. Si me lo traes, tu recompensa.","Viisas päätös. Veljeskunnan pyhäkkö joen varrella on heidän epävirallinen kidutuskammionsa, jonka kätköissä piilee kultakalkki. Kähvellä se ja saat vaivannäöstäsi palkan.",Bon choix. Le sanctuaire de l'ordre près de la rivière est leur chambre torture.. officieusement. A l'intérieur se trouve un calice en or. Récupérez le et venez prendre votre récompense.,"Jó választás. A Rend Szentélye a folyónál a nem hivatalos kínzókamrájuk. Odabent elrejtve található egy arany kehely. Elcsened, és learatod a dicsőséged.",Ottima scelta. Il santuario dell'Ordine vicino al fiume è la loro camera della tortura. Vi è un calice d'oro nascosto là dentro. Prendilo e avrai una lauta ricompensa.,"良い判断だ。川沿いにあるオーダーの聖域は +Good choice. The Order's sanctuary by the river is their unofficial torture chamber. Hidden inside there's a golden chalice. You swipe it and reap your reward.,TXT_DLG_SCRIPT02_D43964_GOODC,〃,,,Dobrá volba. Svatyně Řádu u řeky je jejich tajná mučírna. Uvnitř je skrytý zlatý kalich. Ukradni ho a převezmi si svou odměnu.,Godt valg. Ordenens fristed ved floden er deres uofficielle torturkammer. Der er en gylden bæger gemt derinde. Du tager den og høster din belønning.,Gute Wahl. Das Heiligtum des Ordens bei dem Fluss ist ihre inoffiziele Folterkammer. Darin versteckt ist ein goldener Kelch. Du klaust ihn und erntest deinen Lohn.,,Bona elekto. La sanktejo de La Ordeno ĉe la rojo estas ĝia neoficiala torturejo. En ĝi estas kaŝita ora kaliko. Alportu ĝin al mi kaj vi havos rekompencon.,Buena elección. El santuario de La Orden junto al arroyo es su cámara de tortura extraoficial. Dentro hay un cáliz dorado escondido. Tráemelo y tendrás tu recompensa.,"Buena elección. El santuario de La Orden junto al río es su cámara de tortura extraoficial. Adentro hay un cáliz dorado escondido. Si me lo traes, tu recompensa.","Viisas päätös. Veljeskunnan pyhäkkö joen varrella on heidän epävirallinen kidutuskammionsa, jonka kätköissä piilee kultakalkki. Kähvellä se ja saat vaivannäöstäsi palkan.",Bon choix. Le sanctuaire de l'ordre près de la rivière est leur chambre torture.. officieusement. A l'intérieur se trouve un calice en or. Récupérez le et venez prendre votre récompense.,,"Jó választás. A Rend Szentélye a folyónál a nem hivatalos kínzókamrájuk. Odabent elrejtve található egy arany kehely. Elcsened, és learatod a dicsőséged.",Ottima scelta. Il santuario dell'Ordine vicino al fiume è la loro camera della tortura. Vi è un calice d'oro nascosto là dentro. Prendilo e avrai una lauta ricompensa.,"良い判断だ。川沿いにあるオーダーの聖域は あいつらの非公式の拷問室だ。中には黄金の 聖杯が隠してある。そいつを持ってくれば 報酬をやるぜ。 ",좋은 선택이야. 강가 근처에 있는 성소가 바로 오더의 비공식적인 고문실이야. 그리고 그 안에는 숨겨진 금색 성배가 있지. 넌 그것을 훔치고 보상을 받으면 돼.,Goede keuze. Het heiligdom van de Orde bij de rivier is hun onofficiële martelkamer. Verborgen in de kelk zit een gouden kelk. Je haalt hem weg en plukt je beloning.,Godt valg. Ordenens helligdom ved elven er deres uoffisielle torturkammer. Gjemt der inne er det et gyllent beger. Ta det og høste belønningen din.,Dobry wybór. Sanktuarium Zakonu nad rzeką to ich nieoficjalna sala tortur. Jest w niej ukryty złoty kielich. Zwijasz go i dostajesz swoją nagrodę.,Boa escolha. O santuário da Ordem perto do rio é a câmara de tortura não-oficial deles. Há um cálice dourado escondido dentro. Pegue-o e você recebe a sua recompensa.,,Bună alegere. Sanctuarul Ordinului de lângă râu e camera lor de tortură neoficială. Ascuns în interior e un potir auriu. Îl înhați și culegi recompensa.,Правильный выбор. В святилище Ордена у реки — там у них негласная камера пыток — спрятана золотая чаша. Ты крадёшь её и получаешь свою награду.,,Bra val. Ordens helgedom vid floden är deras inofficiella tortyrkammare. Gömd inuti finns en gyllene kalk. Du tar den och skördar din belöning.,İyi seçim. Tarikat'ın nehir kenarındaki sığınağı onların gayri resmi işkence odası. İçinde altın bir kadeh saklı. Onu araklarsın ve ödülünü alırsın. -How am I supposed to do that?,TXT_RPLY0_SCRIPT02_D43964_HOWAM,〃,,,Jak to mám udělat?,Hvordan skal jeg gøre det?,Wie soll ich das anstellen?,,Kiel mi supozeble faru tion?,¿Cómo se supone que debo hacer eso?,,Miten ihmeessä minä sen teen?,Comment est-ce que je suis sensé faire ça?,Mégis hogy kéne hozzálássak ehhez?,E come posso fare tutto ciò?,どうすればいい?,내가 그걸 어떻게 하지?,Hoe moet ik dat doen?,Hvordan skal jeg gjøre det?,Jak powinienem to zrobić?,E como eu vou fazer isso?,,Și cum ar trebui să fac asta?,И как я это сделаю?,,Hur ska jag göra det?,Bunu nasıl yapacağım? -"Here's a crossbow, just aim straight and --splat--. Remember, grab the fancy cup and get to the tavern.",TXT_DLG_SCRIPT02_D45480_HERES,〃,,,"Tady máš kuši, prostě zamiř rovně a --plesk--. Ještě jednou: popadni fešný hrnek a přijď do taverny.","Her er en armbrøst, bare sigt lige ud og -splat--. Husk, tag det fine bæger og gå til tavernaen.","Hier ist eine Armbust, einfach gerade zielen und --Platsch--. Denk dran, schnapp dir den schicken Kelch und dann ab zur Taverne.",,Jen arbalesto. Vi nur celu laŭ rekta linio kaj «pum». Ne forgesu preni la belan pokalon kaj tiam reveni al la taverno.,Aquí tengo una ballesta. Solo apunta en línea recta y «plaf». Recuerda: toma la bonita copa y luego vuelve aquí a la taberna.,,"Tässä sinulle jousipyssy; tähtää vain eteenpäin ja ""pläts""! Tärkeintä vain, että muistat kahmaista fiinin maljan ja sitten palata kapakkaan.",Voilà une arbalète. Vous avez juste à viser droit et paf! Souvenez-vous. Prenez le goblet et ramenez le à la taverne.,"Itt a számszeríj. Csak célozz előre és -placcs- . Vésd az eszedbe, fogd a pofás kis csészét és menj a fogadóba!","Ecco una balestra, basta mirare e --splat--. Ricorda, prendi il calice e ritorna alla taverna.","このクロスボウを使いな、狙いを定めて +How am I supposed to do that?,TXT_RPLY0_SCRIPT02_D43964_HOWAM,〃,,,Jak to mám udělat?,Hvordan skal jeg gøre det?,Wie soll ich das anstellen?,,Kiel mi supozeble faru tion?,¿Cómo se supone que debo hacer eso?,,Miten ihmeessä minä sen teen?,Comment est-ce que je suis sensé faire ça?,,Mégis hogy kéne hozzálássak ehhez?,E come posso fare tutto ciò?,どうすればいい?,내가 그걸 어떻게 하지?,Hoe moet ik dat doen?,Hvordan skal jeg gjøre det?,Jak powinienem to zrobić?,E como eu vou fazer isso?,,Și cum ar trebui să fac asta?,И как я это сделаю?,,Hur ska jag göra det?,Bunu nasıl yapacağım? +"Here's a crossbow, just aim straight and --splat--. Remember, grab the fancy cup and get to the tavern.",TXT_DLG_SCRIPT02_D45480_HERES,〃,,,"Tady máš kuši, prostě zamiř rovně a --plesk--. Ještě jednou: popadni fešný hrnek a přijď do taverny.","Her er en armbrøst, bare sigt lige ud og -splat--. Husk, tag det fine bæger og gå til tavernaen.","Hier ist eine Armbust, einfach gerade zielen und --Platsch--. Denk dran, schnapp dir den schicken Kelch und dann ab zur Taverne.",,Jen arbalesto. Vi nur celu laŭ rekta linio kaj «pum». Ne forgesu preni la belan pokalon kaj tiam reveni al la taverno.,Aquí tengo una ballesta. Solo apunta en línea recta y «plaf». Recuerda: toma la bonita copa y luego vuelve aquí a la taberna.,,"Tässä sinulle jousipyssy; tähtää vain eteenpäin ja ""pläts""! Tärkeintä vain, että muistat kahmaista fiinin maljan ja sitten palata kapakkaan.",Voilà une arbalète. Vous avez juste à viser droit et paf! Souvenez-vous. Prenez le goblet et ramenez le à la taverne.,,"Itt a számszeríj. Csak célozz előre és -placcs- . Vésd az eszedbe, fogd a pofás kis csészét és menj a fogadóba!","Ecco una balestra, basta mirare e --splat--. Ricorda, prendi il calice e ritorna alla taverna.","このクロスボウを使いな、狙いを定めて --シュッとな。覚えておけ、 ファンシーなカップを持ってここに戻ってこい。","여기 석궁이야, 똑바로 겨냥해, 그리고... '철퍼덕'. 기억해, 멋진 컵을 들고 선술집에 와.","Hier is een kruisboog, mik gewoon recht en --splat--. Vergeet niet, pak de mooie beker en ga naar de herberg.","Her er en armbrøst, bare sikt rett og --splat--. Husk å ta det fine begeret og gå til vertshuset.","Oto kusza, tylko wyceluj i --plask--. Pamiętaj, weź ozdobny puchar i wróć do tawerny.","Aqui está uma besta. Só mirar reto e --splat--. Lembre-se, pegue o copo bonito e vá pra taverna.",,"Uite o arbaletă, doar țintești drept și --pleoșc--. Ține minte, ia cana scumpă și du-te la tavernă.",Вот арбалет — просто прицеливаешься и «шлёп!» Запомни — хватаешь чашку и возвращаешься в таверну.,,"Här är ett armborst, sikta bara rakt och --splat--. Kom ihåg att ta den fina bägaren och gå till tavernan.","İşte bir arbalet, sadece düz nişan al ve --splat--. Unutma, süslü kupayı al ve tavernaya git." -Cool. I'll get it.,TXT_RPLY0_SCRIPT02_D45480_COOLI,〃,,,"Fajn, přinesu ho.",Det er fedt. Jeg henter den.,Cool. Ich werde ihn holen.,,Bonege. Mi trovos ĝin.,Genial. Ya lo traigo.,,Selvä. Saan sen.,Ok. Je m'en occupe.,Király. Meglesz majd.,Va bene. Vado a prenderlo.,良い物だ、貰っとく。,"멋지군, 이해 했어.",Cool. Ik zal het krijgen.,Kult. Jeg henter den.,Fajnie. Wchodzę w to.,Beleza. Vou lá pegar.,,Tare. O voi lua.,"Класс. Я достану её. +Cool. I'll get it.,TXT_RPLY0_SCRIPT02_D45480_COOLI,〃,,,"Fajn, přinesu ho.",Det er fedt. Jeg henter den.,Cool. Ich werde ihn holen.,,Bonege. Mi trovos ĝin.,Genial. Ya lo traigo.,,Selvä. Saan sen.,Ok. Je m'en occupe.,,Király. Meglesz majd.,Va bene. Vado a prenderlo.,良い物だ、貰っとく。,"멋지군, 이해 했어.",Cool. Ik zal het krijgen.,Kult. Jeg henter den.,Fajnie. Wchodzę w to.,Beleza. Vou lá pegar.,,Tare. O voi lua.,"Класс. Я достану её. ",,Coolt. Jag hämtar den.,Güzel. Ben alırım. -What are you waiting for? Bring me that chalice.,TXT_DLG_SCRIPT02_D46996_WHATA,〃,,,Na co čekáš? Přines mi ten kalich.,Hvad venter du på? Giv mig det bæger.,Worauf wartest du noch? Bring mir den Kelch.,,Kion vi atendas? Alportu tiun kalikon.,¿A qué estás esperando? Tráeme ese cáliz.,¿Qué estás esperando? Tráeme ese cáliz.,Mitä oikein jahkailet? Tuo minulle se kalkki.,Qu'attendez vous? Récupérez-moi ce calice.,Mire vársz? Hozd ide azt a kelyhet.,Cosa stai aspettando? Portami il calice.,何ボーっとしてんだ?とっとと聖杯を持ってこい。,뭘 기다리는 거야? 가서 성배를 찾아.,Waar wacht je nog op? Breng me die kelk.,Hva venter du på? Gi meg det begeret.,Na co czekasz? Przynieś mi ten kielich.,Está esperando o quê? Me traga o cálice.,,Ce mai aștepți? Adu-mi potirul acela.,Чего ты ждёшь? Принеси мне эту чашу.,,Vad väntar du på? Ge mig den där bägaren.,Ne bekliyorsun? Bana o kadehi getir. -"Hey, I know, kinda looks like a set-up. I would never do that to such a great killing machine. Got the item? Great! Now get ready, gold and glory just like I promised. Take this key and the Governor will reward you.",TXT_DLG_SCRIPT02_D48512_HEYIK,〃,,,"Hej, já vím, že tohle vypadá jako bouda. Takovému zabijákovi jako ty bych nikdy nic takového neudělal! Máš ten kalich? Fajn! Tak teď se připrav, zlato a sláva, jak jsem slíbil. Vem si tenhle klíč a samotný guvernér tě odmění.","Jeg ved det godt, det ligner en fælde. Jeg ville aldrig gøre det mod sådan en stor dræbermaskine. Har du genstanden? Fedt! Gør dig nu klar, guld og ære, som jeg lovede. Tag denne nøgle, og guvernøren vil belønne dig.","Hey, ich weiß, es sieht anscheinend wie eine Falle aus, aber so etwas würde ich einer so großeartigen Tötungsmaschine nicht antun. Hast du ddas Ding? Großartig! Nun mach dich bereit, Geld und Ruhm, genau wie ich es dir versprochen habe. Nimm diesen Schlüssel und der Gouverneur wird dich belohnen.",,"Jes, mi scias, ĉi tio ŝajnas trompo, sed mi neniam farus tion al bonega mortig-maŝino. Ĉu vi havas la kalikon? Bonege! Pretiĝu: oro kaj gloro, tiel, kiel mi promesis. Prenu ĉi tiun ŝlosilon kaj la registo rekompencos vin.","Sí, ya lo sé, esto parece un timo, pero nunca le haría eso a una gran máquina de matar. ¿Tienes el cáliz? ¡Genial! Ahora prepárate: oro y gloria, tal y como he prometido. Toma esta llave y el gobernador te recompensará.","Sí, ya lo sé, esto parece una estafa, pero nunca le haría eso a una gran máquina de matar. ¿Tienes el cáliz? ¡Genial! Ahora prepárate: oro y gloria, tal y como prometí. Toma esta llave y el gobernador te va a recompensar.","Joo joo, tiedän, että on vähän väijytyksen makua. En kuitenkaan ikinä tekisi sellaista niin kovalle tappokoneelle. Saitko tavaran? Loistavaa! No niin, valmistaudu kultaan ja kunniaan, juuri niin kuin lupasinkin. Ota tämä avain ja kuvernööri palkitsee sinut.","Hé, je sais que ça à l'air d'être un coup monté, mais je ne ferais jamais ça à une aussi bonne machine à tuer. Vous avez le butin? Excellent! Préparez vous, l'or et la gloire vous attend, comme promis. Prenez cette clé et le gouverneur vous récompensera.","Tudom, hogy olyan szaga van mint egy csapdának. Sosem tennék ilyet egy ilyen kiváló gyilkológéppel. Megvan a cuccos? Zsír! Most készülj fel, arany és hírnév, mint ahogy ígértem. Vidd ezt a kulcsot és a kormányzó megjutalmaz.","Ehi, so che può sembrare una trappola. Ma io non tradirei mai a un killer abile come te. Hai il calice? Benissimo! Ora preparati, oro e gloria ti aspettano come promesso. Prendi questa chiave e il Governatore in persona ti ricompenserà.","おう、罠みたいだと思ったか。 +What are you waiting for? Bring me that chalice.,TXT_DLG_SCRIPT02_D46996_WHATA,〃,,,Na co čekáš? Přines mi ten kalich.,Hvad venter du på? Giv mig det bæger.,Worauf wartest du noch? Bring mir den Kelch.,,Kion vi atendas? Alportu tiun kalikon.,¿A qué estás esperando? Tráeme ese cáliz.,¿Qué estás esperando? Tráeme ese cáliz.,Mitä oikein jahkailet? Tuo minulle se kalkki.,Qu'attendez vous? Récupérez-moi ce calice.,,Mire vársz? Hozd ide azt a kelyhet.,Cosa stai aspettando? Portami il calice.,何ボーっとしてんだ?とっとと聖杯を持ってこい。,뭘 기다리는 거야? 가서 성배를 찾아.,Waar wacht je nog op? Breng me die kelk.,Hva venter du på? Gi meg det begeret.,Na co czekasz? Przynieś mi ten kielich.,Está esperando o quê? Me traga o cálice.,,Ce mai aștepți? Adu-mi potirul acela.,Чего ты ждёшь? Принеси мне эту чашу.,,Vad väntar du på? Ge mig den där bägaren.,Ne bekliyorsun? Bana o kadehi getir. +"Hey, I know, kinda looks like a set-up. I would never do that to such a great killing machine. Got the item? Great! Now get ready, gold and glory just like I promised. Take this key and the Governor will reward you.",TXT_DLG_SCRIPT02_D48512_HEYIK,〃,,,"Hej, já vím, že tohle vypadá jako bouda. Takovému zabijákovi jako ty bych nikdy nic takového neudělal! Máš ten kalich? Fajn! Tak teď se připrav, zlato a sláva, jak jsem slíbil. Vem si tenhle klíč a samotný guvernér tě odmění.","Jeg ved det godt, det ligner en fælde. Jeg ville aldrig gøre det mod sådan en stor dræbermaskine. Har du genstanden? Fedt! Gør dig nu klar, guld og ære, som jeg lovede. Tag denne nøgle, og guvernøren vil belønne dig.","Hey, ich weiß, es sieht anscheinend wie eine Falle aus, aber so etwas würde ich einer so großeartigen Tötungsmaschine nicht antun. Hast du ddas Ding? Großartig! Nun mach dich bereit, Geld und Ruhm, genau wie ich es dir versprochen habe. Nimm diesen Schlüssel und der Gouverneur wird dich belohnen.",,"Jes, mi scias, ĉi tio ŝajnas trompo, sed mi neniam farus tion al bonega mortig-maŝino. Ĉu vi havas la kalikon? Bonege! Pretiĝu: oro kaj gloro, tiel, kiel mi promesis. Prenu ĉi tiun ŝlosilon kaj la registo rekompencos vin.","Sí, ya lo sé, esto parece un timo, pero nunca le haría eso a una gran máquina de matar. ¿Tienes el cáliz? ¡Genial! Ahora prepárate: oro y gloria, tal y como he prometido. Toma esta llave y el gobernador te recompensará.","Sí, ya lo sé, esto parece una estafa, pero nunca le haría eso a una gran máquina de matar. ¿Tienes el cáliz? ¡Genial! Ahora prepárate: oro y gloria, tal y como prometí. Toma esta llave y el gobernador te va a recompensar.","Joo joo, tiedän, että on vähän väijytyksen makua. En kuitenkaan ikinä tekisi sellaista niin kovalle tappokoneelle. Saitko tavaran? Loistavaa! No niin, valmistaudu kultaan ja kunniaan, juuri niin kuin lupasinkin. Ota tämä avain ja kuvernööri palkitsee sinut.","Hé, je sais que ça à l'air d'être un coup monté, mais je ne ferais jamais ça à une aussi bonne machine à tuer. Vous avez le butin? Excellent! Préparez vous, l'or et la gloire vous attend, comme promis. Prenez cette clé et le gouverneur vous récompensera.",,"Tudom, hogy olyan szaga van mint egy csapdának. Sosem tennék ilyet egy ilyen kiváló gyilkológéppel. Megvan a cuccos? Zsír! Most készülj fel, arany és hírnév, mint ahogy ígértem. Vidd ezt a kulcsot és a kormányzó megjutalmaz.","Ehi, so che può sembrare una trappola. Ma io non tradirei mai a un killer abile come te. Hai il calice? Benissimo! Ora preparati, oro e gloria ti aspettano come promesso. Prendi questa chiave e il Governatore in persona ti ricompenserà.","おう、罠みたいだと思ったか。 俺に暴れん坊みたいな芸当出来るわきゃねえ。 ブツはあるか?そりゃいい!じゃあ準備しな。 金と栄光は約束された。この鍵で知事に合えば 報酬をありったけくれるさ。 ","이봐, 알겠어. 확실히 뭔가 꾸며 놓은 것 같다는 거. 난 훌륭한 학살 기계에게 그런 짓을 할 사람이 아니야. 그래서 그걸 가져왔나? 좋아! 그럼 약속한 대로 골드와 영광을 줄 테니 준비해. 이 열쇠를 총독에게 가져다주면 보상해 줄 거야.","Hé, ik weet het, het ziet er een beetje uit als een valstrik. Dat zou ik nooit met zo'n grote moordmachine doen. Heb je het item? Geweldig! Maak je nu klaar, goud en glorie, net zoals ik beloofd heb. Neem deze sleutel en de gouverneur zal je belonen.","Jeg vet at det ser ut som en felle. Jeg ville aldri gjort det mot en så flott drapsmaskin. Har du gjenstanden? Flott! Gjør deg klar. Gull og ære, som jeg lovte. Ta denne nøkkelen, så vil guvernøren belønne deg.","Hej, wiem, wygląda to jak zasadzka. Nigdy bym czegoś takiego nie zrobił wspaniałej maszynie do zabijania. Masz przedmiot? Wspaniale! Przygotuj się teraz, złoto i chwała tak jak obiecywałem. Weź ten klucz, a Gubernator cię nagrodzi.","Olha, eu sei, meio que parece uma cilada. Eu nunca faria aquilo a uma grande máquina mortífera. Conseguiu o item? Ótimo! Agora se prepare, ouro e glória conforme prometido. Pegue esta chave e o Governador irá te recompensar.",,"Hei, știu că pare o capcană. Nu aș face așa ceva niciodată unei mașini ucigașe atât de tare. Ai obiectul? Perfect! Acum pregătește-te, aur și glorie cum ți-am promis. Ia cheia asta și Guvernatorul te va răsplătii.","Слушай, я знаю, о чём ты думаешь. Ты думаешь, что это подстава. Но я бы никогда не сделал этого с такой машиной для убийств, как ты. Достал то, что я просил? Отлично! Тебя ждёт золото и слава, как я и обещал. Возьми этот ключ — губернатор лично наградит тебя.",,"Jag vet, det ser ut som en uppställning. Jag skulle aldrig göra det mot en så stor mördarmaskin. Har du föremålet? Bra! Gör dig nu redo, guld och ära precis som jag lovade. Ta den här nyckeln och guvernören kommer att belöna dig.","Hey, biliyorum, biraz tuzağa benziyor. Böyle büyük bir ölüm makinesine bunu asla yapmazdım. Eşyayı aldın mı? Harika! Şimdi hazır ol, söz verdiğim gibi altın ve şan. Bu anahtarı al ve Vali seni ödüllendirecek." -He'd better. For your sake!,TXT_RPLY0_SCRIPT02_D48512_HEDBE,〃,,,"To by tedy měl, pro tvoje vlastní dobro!",Det har han bare at gøre. For din skyld!,Das macht er besser. Deinetwillen!,,Li devus. Por via bono!,Más le vale. ¡Por tu propio bien!,,Parasta palkitakin! Sinun kannaltasi!,"Il a intérêt, pour votre bien!",Jobban teszi. A Te érdekedben!,È meglio che lo faccia... per il tuo bene!,戻せ、お前の為だ!,"살고 싶으면, 이 말이 사실이야 할 거다!",Dat is hem maar beter gelukt. Voor uw eigen bestwil!,Det bør han. For din skyld!,Mam nadzieję. Dla twojego dobra!,Acho bom mesmo. Pro seu bem!,,Ar face bine. De dragul tău!,Надеюсь. Это в твоих интересах!,,Det är bäst att han gör det. För din skull!,Öyle olsa iyi olur. Senin hatırın için! -What! Where's my money?,TXT_RPLY1_SCRIPT02_D48512_WHATW,〃,,,Cože? Kde jsou moje peníze?,Hvad! Hvor er mine penge?,Was! Wo ist mein Geld?,,Kio!? Kie estas mia mono?,¿¡Qué!? ¿Y mi dinero?,,Mitä! Missä on rahani?,Quoi? Où est mon argent!,Mi a túró! Hol van a pénzem?,Aspetta! Dove sono i miei soldi?,何だと! 金はどこだ?,뭐라고! 내 돈은 어디있지?,Wat! Waar is mijn geld?,Hva! Hvor er pengene mine?,Co! Gdzie moje pieniądze?,Como é? Cadê o meu dinheiro?,,Ce! Unde sunt banii mei?,Что? Где мои деньги?,,Vad! Var är mina pengar?,Ne! Param nerede? -"Get lost kid, you bother me.",TXT_DLG_SCRIPT02_D50028_GETLO,〃,,,"Odprejskni, mladej, otravuješ mě.","Forsvind, knægt, du generer mig.","Verzieh dich Jungchen, du störst mich.",,"Foriru, junulo; vi ĝenas min.","Ya vete, chaval, que eres pesado.","Ya vete de una vez, que eres pesado.","Häivy nulikka, häiritset minua.","Dégage, gamin, tu m'agaces.","Kopj le kölyök, ne itt lábatlankodj.","Sparisci, ragazzo, mi stai infastidendo.",失せろ、うざってえ。,사라져. 신경 거슬리게 하지 말고.,"Rot op, jongen, je stoort me.","Forsvinn, gutt, du plager meg.","Spadaj mały, przeszkadzasz mi.","Some daqui, garoto. Você está me incomodando.",,"Cară-te puștiule, mă deranjezi.","Пропади, малой. Ты меня раздражаешь.",,"Stick, grabben, du stör mig.","Kaybol evlat, beni rahatsız ediyorsun." -"No second chance. Oh guards, kill him.",TXT_DLG_SCRIPT02_D51544_NOSEC,〃,,,"Žádná druhá šance. Á, stráže, zabte ho.","Ingen ny chance. Åh vagter, dræb ham.","Keine zweite Chance. Oh Wachen, tötet ihn.",,"Ne estas alia ŝanco. Gardistoj, mortigu lin!","No hay otra oportunidad. ¡Guardias, matadlo!","No hay otra oportunidad. ¡Guardias, mátenlo!","Ei uutta tilaisuutta. Vartijat, tappakaa hänet.","Pas de deuxième chance. Gardes, tuez-le.","Nincs második esély. Ó, őrök, öljétek meg.","Nessuna seconda chance. Guardie, uccidetelo.","次はねえな。おぅガードの旦那、 +He'd better. For your sake!,TXT_RPLY0_SCRIPT02_D48512_HEDBE,〃,,,"To by tedy měl, pro tvoje vlastní dobro!",Det har han bare at gøre. For din skyld!,Das macht er besser. Deinetwillen!,,Li devus. Por via bono!,Más le vale. ¡Por tu propio bien!,,Parasta palkitakin! Sinun kannaltasi!,"Il a intérêt, pour votre bien!",,Jobban teszi. A Te érdekedben!,È meglio che lo faccia... per il tuo bene!,戻せ、お前の為だ!,"살고 싶으면, 이 말이 사실이야 할 거다!",Dat is hem maar beter gelukt. Voor uw eigen bestwil!,Det bør han. For din skyld!,Mam nadzieję. Dla twojego dobra!,Acho bom mesmo. Pro seu bem!,,Ar face bine. De dragul tău!,Надеюсь. Это в твоих интересах!,,Det är bäst att han gör det. För din skull!,Öyle olsa iyi olur. Senin hatırın için! +What! Where's my money?,TXT_RPLY1_SCRIPT02_D48512_WHATW,〃,,,Cože? Kde jsou moje peníze?,Hvad! Hvor er mine penge?,Was! Wo ist mein Geld?,,Kio!? Kie estas mia mono?,¿¡Qué!? ¿Y mi dinero?,,Mitä! Missä on rahani?,Quoi? Où est mon argent!,,Mi a túró! Hol van a pénzem?,Aspetta! Dove sono i miei soldi?,何だと! 金はどこだ?,뭐라고! 내 돈은 어디있지?,Wat! Waar is mijn geld?,Hva! Hvor er pengene mine?,Co! Gdzie moje pieniądze?,Como é? Cadê o meu dinheiro?,,Ce! Unde sunt banii mei?,Что? Где мои деньги?,,Vad! Var är mina pengar?,Ne! Param nerede? +"Get lost kid, you bother me.",TXT_DLG_SCRIPT02_D50028_GETLO,〃,,,"Odprejskni, mladej, otravuješ mě.","Forsvind, knægt, du generer mig.","Verzieh dich Jungchen, du störst mich.",,"Foriru, junulo; vi ĝenas min.","Ya vete, chaval, que eres pesado.","Ya vete de una vez, que eres pesado.","Häivy nulikka, häiritset minua.","Dégage, gamin, tu m'agaces.",,"Kopj le kölyök, ne itt lábatlankodj.","Sparisci, ragazzo, mi stai infastidendo.",失せろ、うざってえ。,사라져. 신경 거슬리게 하지 말고.,"Rot op, jongen, je stoort me.","Forsvinn, gutt, du plager meg.","Spadaj mały, przeszkadzasz mi.","Some daqui, garoto. Você está me incomodando.",,"Cară-te puștiule, mă deranjezi.","Пропади, малой. Ты меня раздражаешь.",,"Stick, grabben, du stör mig.","Kaybol evlat, beni rahatsız ediyorsun." +"No second chance. Oh guards, kill him.",TXT_DLG_SCRIPT02_D51544_NOSEC,〃,,,"Žádná druhá šance. Á, stráže, zabte ho.","Ingen ny chance. Åh vagter, dræb ham.","Keine zweite Chance. Oh Wachen, tötet ihn.",,"Ne estas alia ŝanco. Gardistoj, mortigu lin!","No hay otra oportunidad. ¡Guardias, matadlo!","No hay otra oportunidad. ¡Guardias, mátenlo!","Ei uutta tilaisuutta. Vartijat, tappakaa hänet.","Pas de deuxième chance. Gardes, tuez-le.",,"Nincs második esély. Ó, őrök, öljétek meg.","Nessuna seconda chance. Guardie, uccidetelo.","次はねえな。おぅガードの旦那、 やっちゃってくだせえ。","너에게는 기회 따윈 없었어. 경비원, 저놈을 죽여.","Geen tweede kans. Oh bewakers, dood hem.","Ingen ny sjanse. Vakter, drep ham.","Nie będzie drugiej szansy. Oh... strażnicy, zabijcie go.","Sem segunda chance. Ah, guardas, matem ele.",,"Nicio altă șansă. Oh gardienilor, omorâți-l.","Нет, никакого второго шанса. Эй, стража, убейте его.",,"Ingen andra chans. Åh vakter, döda honom.","İkinci bir şans yok. Muhafızlar, öldürün onu." -"First they slaughter thousands, now they want all able-bodied peasants for unspecified 'tests'. How does the Order expect me to keep the peace? What the hell do you want?",TXT_DLG_SCRIPT02_D53060_FIRST,MAP02: Mourel.,,,"Tak oni nejdříve povraždí tisíce a teď po mě chtějí všechny schopné poddané pro neupřesněné 'testování'. Jak Řád očekává, že mám zachovat mír? Co ty sakra chceš?","Først slagter de tusinder, nu vil de have alle raske bønder til uspecificerede ""tests"". Hvordan forventer ordenen, at jeg skal opretholde freden? Hvad fanden vil du?",Zuerst metzeln sie Tausende nieder und nun wollen sie alle gesunden Bauern für unspezifierte „Tests“. Wie kann es der Orden nur so von mir verlangen Frieden zu bewahren? Was zum Teufel willst du?,,"Ili unue buĉis milojn, kaj nun volas ĉiujn sanegajn kamparanojn por nespecifaj «provoj». Kiel La Ordeno esperas, ke mi ankoraŭ povos teni la pacon?... Kion diable vi volas?",Primero matan a miles y ahora quieren a todos los campesinos sanos para «pruebas» no especificadas. ¿Cómo espera La Orden que yo pueda seguir manteniendo la paz?... ¿Y tú qué demonios quieres?,Primero matan a miles y ahora quieren a todos los campesinos sanos para «pruebas» no especificadas. ¿Cómo espera La Orden que yo pueda seguir manteniendo la paz?... ¿Y tú qué carajo quieres?,"Ensiksi ne lahtaavat tuhansia, nyt ne haluavat kaikki kynnelle kykenevät maallikot määrittelemättömiin ""kokeisiin""'. Miten veljeskunta odottaa minun pitävän järjestystä? Mitä helvettiä sinä haluat?","D'abord ils en massacrent des miliers, maintenant ils veulent tous les paysans en bonne santé pour leur « tests » dont personne ne sait rien. Comment est-ce que l'ordre veut que je garde la paix? Qu'est-ce que vous voulez?","Először ezreket kaszabolnak le, most meg minden ép testű jobbágyot ismeretlen ""kísérletekhez"" akarnak. Hogy várhatja el a Rend, hogy fenntartsam a békét? Mi a francot akarsz?","Prima massacrano migliaia di persone, poi vogliono cittadini in buona condizione fisica per ""test"" non meglio specificati. Come può l'Ordine aspettarsi che io riesca a mantenere la pace? E tu che diavolo vuoi?","あいつら散々大量虐殺しといて、今度は'実験' +"First they slaughter thousands, now they want all able-bodied peasants for unspecified 'tests'. How does the Order expect me to keep the peace? What the hell do you want?",TXT_DLG_SCRIPT02_D53060_FIRST,MAP02: Mourel.,,,"Tak oni nejdříve povraždí tisíce a teď po mě chtějí všechny schopné poddané pro neupřesněné 'testování'. Jak Řád očekává, že mám zachovat mír? Co ty sakra chceš?","Først slagter de tusinder, nu vil de have alle raske bønder til uspecificerede ""tests"". Hvordan forventer ordenen, at jeg skal opretholde freden? Hvad fanden vil du?",Zuerst metzeln sie Tausende nieder und nun wollen sie alle gesunden Bauern für unspezifierte „Tests“. Wie kann es der Orden nur so von mir verlangen Frieden zu bewahren? Was zum Teufel willst du?,,"Ili unue buĉis milojn, kaj nun volas ĉiujn sanegajn kamparanojn por nespecifaj «provoj». Kiel La Ordeno esperas, ke mi ankoraŭ povos teni la pacon?... Kion diable vi volas?",Primero matan a miles y ahora quieren a todos los campesinos sanos para «pruebas» no especificadas. ¿Cómo espera La Orden que yo pueda seguir manteniendo la paz?... ¿Y tú qué demonios quieres?,Primero matan a miles y ahora quieren a todos los campesinos sanos para «pruebas» no especificadas. ¿Cómo espera La Orden que yo pueda seguir manteniendo la paz?... ¿Y tú qué carajo quieres?,"Ensiksi ne lahtaavat tuhansia, nyt ne haluavat kaikki kynnelle kykenevät maallikot määrittelemättömiin ""kokeisiin""'. Miten veljeskunta odottaa minun pitävän järjestystä? Mitä helvettiä sinä haluat?","D'abord ils en massacrent des miliers, maintenant ils veulent tous les paysans en bonne santé pour leur « tests » dont personne ne sait rien. Comment est-ce que l'ordre veut que je garde la paix? Qu'est-ce que vous voulez?",,"Először ezreket kaszabolnak le, most meg minden ép testű jobbágyot ismeretlen ""kísérletekhez"" akarnak. Hogy várhatja el a Rend, hogy fenntartsam a békét? Mi a francot akarsz?","Prima massacrano migliaia di persone, poi vogliono cittadini in buona condizione fisica per ""test"" non meglio specificati. Come può l'Ordine aspettarsi che io riesca a mantenere la pace? E tu che diavolo vuoi?","あいつら散々大量虐殺しといて、今度は'実験' の為に健康な庶民を用意しろとか。オーダーは 本当に平和を維持してくれるのか? で、君は何用で来たのかね? ","먼저 오더가 수천 명을 죽여놓고, 이젠 힘 좋은 시민들을 불러서 생각지도 않은 시험을 하라고 시키는구먼. 그놈들이 나한테 바라는 게 뭔지 전혀 모르겠네. 넌 원하는 게 뭐야?","Eerst slachten ze duizenden mensen af, nu willen ze alle valide boeren voor ongespecificeerde 'tests'. Hoe verwacht de Orde dat ik de vrede bewaar? Wat wil je verdomme?","Først slakter de tusenvis, og nå vil de ha alle arbeidsføre bønder til uspesifiserte ""tester"". Hvordan forventer ordenen at jeg skal bevare freden? Hva i helvete vil du ha?","Najpierw mordują tysiące, a teraz chcą wszystkich krzepkich chłopów do nieokreślonych ""testów"". Jak Zakon oczekuje ode mnie abym utrzymywał pokój? Czego chcesz u diabła?","Primeiro eles massacram milhares, agora querem que todos os plebeus saudáveis façam ""provas"" não especificadas. Como que a Ordem quer que eu mantenha a paz? Que diabos você quer?",,"Mai întâi măcelăresc cu miile, apoi vor toți sărmanii capabili de muncă pentru 'teste' nespecificate. Cum se așteaptă Ordinul să mențin pacea? Ce naiba vrei?","Сначала они убивают людей тысячами, а теперь им нужны все пригодные рабочие для каких-то «экспериментов»! И Орден ещё хочет, чтобы я поддерживал мир? Какого чёрта тебе нужно?",,"Först slaktar de tusentals, nu vill de ha alla dugliga bönder för ospecificerade ""tester"". Hur förväntar sig orden att jag ska kunna upprätthålla freden? Vad i helvete vill ni?","Önce binlercesini katlettiler, şimdi de tüm sağlıklı köylüleri belirsiz 'testler' için istiyorlar. Tarikat benden barışı korumamı nasıl bekler? Ne halt istiyorsun?" -"A prison pass, let's deal.",TXT_RPLY0_SCRIPT02_D53060_APRIS,〃,,,"Propustku do vězení, udělejme dohodu.","Et fængselskort, lad os lave en aftale.",Ein Gefängnispass. Lassen Sie uns verhandeln.,,Malliberejan enirpermeson. Ni intertraktu.,Un pase a la prisión. Negociemos.,,Vankilan pääsyluvan; hierotaan diili.,Un passe de la prison. Faisons affaires.,Egy börtön belépő. Üzleteljünk.,"Un pass per la prigione, trattiamo.",刑務所の許可証だ、取引をしよう。,감옥 통행증만 있으면 돼.,"Een gevangenispasje, laten we dealen.","Et fengselspass, la oss gjøre en avtale.","Przepustkę do więzienia, ponegocjujmy.","Um passe da prisão, vamos negociar.",,O legitimație pentru închisoare. Să facem un târg.,Пропуск в тюрьму. Заключим сделку.,,"Ett fängelsepass, låt oss göra upp.","Bir hapishane izni, anlaşalım." -"I like you already. I have two chores that I don't want to do myself. One is messy, the other bloody.",TXT_DLG_SCRIPT02_D54576_ILIKE,〃,,,"Už teď se mi líbíš. Mám dvě prácičky, které nechci dělat sám. Jedna je špinavá, druhá je krvavá.","Jeg kan allerede godt lide dig. Jeg har to pligter, som jeg ikke selv vil gøre. Den ene er rodet, den anden er blodig.","Du gefällst mir bereits. Ich habe zwei lästige Angelegenheiten, um die ich mich nicht selber kümmern möchte. Die eine davon ist dreckig, die andere blutig.",,"Mi jam ŝatas vin. Estas du farotaĵoj, kiujn mi mem ne volas fari: unu estas malpura kaj la alia estas sanga.",Ya me caes bien. Hay dos tareas que no quiero hacer por mi cuenta: una es sucia y la otra sangrienta.,,"Minähän pidän sinusta. Minulla olisi kyllä pari askaretta, joita en itse haluaisi tehdä. Yksi niistä on sotkuinen, toinen hurmeinen.","Vous me plaisez déjà. J'ai deux corvées que je n'ai pas envie de faire. Une est.. Sale, l'autre est sanglante.","Kedvellek már most. Van két feladatom, amit nem akarok magam végezni. Az egyik a koszos, a másik a véres.","Già mi piaci. Ho due faccende da sbrigare che non voglio fare di persona. Una è un po' complicata, e l'altra da risolvere col sangue.","いいだろう。仕事は二つあるのだが +"A prison pass, let's deal.",TXT_RPLY0_SCRIPT02_D53060_APRIS,〃,,,"Propustku do vězení, udělejme dohodu.","Et fængselskort, lad os lave en aftale.",Ein Gefängnispass. Lassen Sie uns verhandeln.,,Malliberejan enirpermeson. Ni intertraktu.,Un pase a la prisión. Negociemos.,,Vankilan pääsyluvan; hierotaan diili.,Un passe de la prison. Faisons affaires.,,Egy börtön belépő. Üzleteljünk.,"Un pass per la prigione, trattiamo.",刑務所の許可証だ、取引をしよう。,감옥 통행증만 있으면 돼.,"Een gevangenispasje, laten we dealen.","Et fengselspass, la oss gjøre en avtale.","Przepustkę do więzienia, ponegocjujmy.","Um passe da prisão, vamos negociar.",,O legitimație pentru închisoare. Să facem un târg.,Пропуск в тюрьму. Заключим сделку.,,"Ett fängelsepass, låt oss göra upp.","Bir hapishane izni, anlaşalım." +"I like you already. I have two chores that I don't want to do myself. One is messy, the other bloody.",TXT_DLG_SCRIPT02_D54576_ILIKE,〃,,,"Už teď se mi líbíš. Mám dvě prácičky, které nechci dělat sám. Jedna je špinavá, druhá je krvavá.","Jeg kan allerede godt lide dig. Jeg har to pligter, som jeg ikke selv vil gøre. Den ene er rodet, den anden er blodig.","Du gefällst mir bereits. Ich habe zwei lästige Angelegenheiten, um die ich mich nicht selber kümmern möchte. Die eine davon ist dreckig, die andere blutig.",,"Mi jam ŝatas vin. Estas du farotaĵoj, kiujn mi mem ne volas fari: unu estas malpura kaj la alia estas sanga.",Ya me caes bien. Hay dos tareas que no quiero hacer por mi cuenta: una es sucia y la otra sangrienta.,,"Minähän pidän sinusta. Minulla olisi kyllä pari askaretta, joita en itse haluaisi tehdä. Yksi niistä on sotkuinen, toinen hurmeinen.","Vous me plaisez déjà. J'ai deux corvées que je n'ai pas envie de faire. Une est.. Sale, l'autre est sanglante.",,"Kedvellek már most. Van két feladatom, amit nem akarok magam végezni. Az egyik a koszos, a másik a véres.","Già mi piaci. Ho due faccende da sbrigare che non voglio fare di persona. Una è un po' complicata, e l'altra da risolvere col sangue.","いいだろう。仕事は二つあるのだが 一つは面倒で、もう一つは血を見ることになる。",이제야 말길이 가네. 지금 너에게 맡을 시험이 두 가지 있거든. 더러운 거랑... 잔인한 거.,"Ik vind je nu al leuk. Ik heb twee taken die ik zelf niet wil doen. De ene is rommelig, de andere bloedig.","Jeg liker deg allerede. Jeg har to plikter jeg ikke vil gjøre selv. Det ene er rotete, det andre blodig.","Już cię lubię. Mam dwa zadania, których sam nie chcę wykonać. Jedno jest brudne, a drugie krwawe.","Estou gostando de você. Tenho mais duas tarefas chatas que eu particularmente não estou a fim de fazer. Uma é suja, a outra sangrenta.",,"Deja îmi placi. Am două treburi nasoale pe care nu vreau să le fac eu însumi. Una e haotică, cealalta sângeroasă.","Мне нравится твой настрой! У меня есть два неприятных дела, которыми я не хочу заниматься сам. Одно грязное, а другое кровавое.",,"Jag gillar dig redan. Jag har två sysslor som jag inte vill göra själv. Den ena är smutsig, den andra är blodig.","Seni şimdiden sevdim. Kendi başıma yapmak istemediğim iki işim var. Biri pis, diğeri kanlı." -Call me the cleaner,TXT_RPLY0_SCRIPT02_D54576_CALLM,〃,,,Říkej mi pan uklízeč.,Kald mig rengøringsmanden.,Nennen Sie mich den Säuberer,,Purigado estas mia specialo.,Limpiar es mi especialidad.,,Olen siivoojasi,Appelez-moi le nettoyeur.,Hívj csak takarítónak.,Risolvere problemi è la mia specialità,まだ手は汚したくない,청소부라 불러줘.,Noem me de schoonmaakster,Kall meg renholderen.,Nazywaj mnie czyścicielem.,Pode me chamar de faxineiro,,Spune-mi curățătorul,Я — лучший чистильщик!,,Kalla mig städaren.,Bana temizlikçi de. -I'm not squeamish,TXT_RPLY1_SCRIPT02_D54576_IMNOT,〃,,,Mám silný žaludek.,Jeg er ikke squeamish,Ich bin nicht zimperlich.,,Sango estas nenio.,La sangre no es nada.,,En ole heikkohermoinen,J'ai pas peur de me tacher les mains.,Nem vagyok finnyás,Non mi impressiono facilmente,汚れ仕事でも構わない,나는 비위가 약하지 않아.,Ik ben niet katholiek.,Jeg er ikke pysete,Nie jestem wybredny.,Não sou muito escrupuloso,,Nu sunt mofturos,Я не боюсь крови.,,Jag är inte känslig.,Ben alıngan değilim. +Call me the cleaner,TXT_RPLY0_SCRIPT02_D54576_CALLM,〃,,,Říkej mi pan uklízeč.,Kald mig rengøringsmanden.,Nennen Sie mich den Säuberer,,Purigado estas mia specialo.,Limpiar es mi especialidad.,,Olen siivoojasi,Appelez-moi le nettoyeur.,,Hívj csak takarítónak.,Risolvere problemi è la mia specialità,まだ手は汚したくない,청소부라 불러줘.,Noem me de schoonmaakster,Kall meg renholderen.,Nazywaj mnie czyścicielem.,Pode me chamar de faxineiro,,Spune-mi curățătorul,Я — лучший чистильщик!,,Kalla mig städaren.,Bana temizlikçi de. +I'm not squeamish,TXT_RPLY1_SCRIPT02_D54576_IMNOT,〃,,,Mám silný žaludek.,Jeg er ikke squeamish,Ich bin nicht zimperlich.,,Sango estas nenio.,La sangre no es nada.,,En ole heikkohermoinen,J'ai pas peur de me tacher les mains.,,Nem vagyok finnyás,Non mi impressiono facilmente,汚れ仕事でも構わない,나는 비위가 약하지 않아.,Ik ben niet katholiek.,Jeg er ikke pysete,Nie jestem wybredny.,Não sou muito escrupuloso,,Nu sunt mofturos,Я не боюсь крови.,,Jag är inte känslig.,Ben alıngan değilim. One of my minions is stealing power with a tap on the mains somewhere. Find it and truncate his supply and I'll provide you with what you want. Bring me something as a token.,TXT_DLG_SCRIPT02_D56092_ONEOF,"〃 -(""messy"" chore)",,,"Jeden z mých poddaných stáčedlem někde z hlavního vedení krade energii. Najdi jej a odřízni dotyčného od zásoby a já ti dám, co chceš. Přines mi něco jako důkaz.","En af mine håndlangere stjæler strøm med en vandhane et sted. Find den og afbryd hans forsyning, så skal jeg give dig, hvad du vil have. Bring mig noget som et symbol.","Einer meiner Untertanen zapft irgendwo Strom ab. Finde die Anzapfung und kappe sie. Falls du Erfolg hast, kriegst du was du brauchst. Aber bring mir einen Beweis mit!",,"Unu el miaj sbiroj metis konektilon ien por ŝteli energion de la elektriza sistemo. Ĝin trovu kaj detruu, kaj mi donos al vi tion, kion vi petis. Alportu pruvon kiam vi finos.","Uno de mis secuaces puso en algún lado una toma en la red eléctrica para robar energía. Encuéntrala, trunca su suministro y te daré lo que pides. Tráeme algo como prueba una vez que termines.","Uno de mis secuaces puso en algún lado una toma en la red eléctrica para robar energía. Encuéntrala, destruye su suministro y te voy a dar lo que pides. Tráeme algo como prueba una vez que termines.","Yksi alamaisistani varastaa verkkovirtaa jossakin sijaitsevalla salaisella kytkennällä. Löydä se ja katkaise hänen jakelunsa, niin annan sinulle haluamasi. Tuo minulle jotain todisteeksi.",Un de mes larbins pompe de l'électricité avec une connection pirate dans les transformateurs là haut. Trouvez là et coupez sa connection. Je vous donnerai ce que vous voulez. Ramenez moi une preuve.,"Az egyik alattvalóm áramot lop egy dugasszal a központi hálózatnál valahol. Találd meg, majd válaszd el az ellátását, és én adok neked amit akarsz. Hozz nekem valamit bizonyítékként","Uno dei miei tirapiedi sta rubando energia con un suo aggeggio attaccato alla rete elettrica da qualche parte. Trova questo aggeggio e staccalo dalla rete, e ti darò quello che desideri. Portami qualcosa come prova.","私の手下の一人が水力発電から電力を盗んで +(""messy"" chore)",,,"Jeden z mých poddaných stáčedlem někde z hlavního vedení krade energii. Najdi jej a odřízni dotyčného od zásoby a já ti dám, co chceš. Přines mi něco jako důkaz.","En af mine håndlangere stjæler strøm med en vandhane et sted. Find den og afbryd hans forsyning, så skal jeg give dig, hvad du vil have. Bring mig noget som et symbol.","Einer meiner Untertanen zapft irgendwo Strom ab. Finde die Anzapfung und kappe sie. Falls du Erfolg hast, kriegst du was du brauchst. Aber bring mir einen Beweis mit!",,"Unu el miaj sbiroj metis konektilon ien por ŝteli energion de la elektriza sistemo. Ĝin trovu kaj detruu, kaj mi donos al vi tion, kion vi petis. Alportu pruvon kiam vi finos.","Uno de mis secuaces puso en algún lado una toma en la red eléctrica para robar energía. Encuéntrala, trunca su suministro y te daré lo que pides. Tráeme algo como prueba una vez que termines.","Uno de mis secuaces puso en algún lado una toma en la red eléctrica para robar energía. Encuéntrala, destruye su suministro y te voy a dar lo que pides. Tráeme algo como prueba una vez que termines.","Yksi alamaisistani varastaa verkkovirtaa jossakin sijaitsevalla salaisella kytkennällä. Löydä se ja katkaise hänen jakelunsa, niin annan sinulle haluamasi. Tuo minulle jotain todisteeksi.",Un de mes larbins pompe de l'électricité avec une connection pirate dans les transformateurs là haut. Trouvez là et coupez sa connection. Je vous donnerai ce que vous voulez. Ramenez moi une preuve.,,"Az egyik alattvalóm áramot lop egy dugasszal a központi hálózatnál valahol. Találd meg, majd válaszd el az ellátását, és én adok neked amit akarsz. Hozz nekem valamit bizonyítékként","Uno dei miei tirapiedi sta rubando energia con un suo aggeggio attaccato alla rete elettrica da qualche parte. Trova questo aggeggio e staccalo dalla rete, e ti darò quello che desideri. Portami qualcosa come prova.","私の手下の一人が水力発電から電力を盗んで いるらしい。それを見つけ供給を切って くれれば君の望む物をやろう。 その象徴となるのも持ってきてほしい。",내 부하 중 한 명이 어딘가에 있는 동력선에 추출기를 꽂아 동력을 훔치고 있다는군. 그것을 찾아내서 그의 공급을 자르면 네가 원하는 것을 제공하지. 증거가 될만한 그것을 가져와.,Een van mijn acolieten steelt stroom met een kraan op het lichtnet ergens. Zoek het en snoei zijn aansluiting in en ik zal je voorzien van wat je wilt. Breng me iets als teken.,"En av håndlangerne mine stjeler strøm med en kran på strømnettet et sted. Finn den og kutt forsyningen hans, så gir jeg deg det du vil ha. Gi meg noe som et symbol.","Jeden z moich sług kradnie gdzieś moc w przewodach za pomocą przełącznika. Znajdź go i odetnij jego dostawę mocy, a dam ci co chcesz. Przynieś mi coś jako dowód.",Um dos meus capangas está roubando energia por uma ligação clandestina em algum lugar. Encontre e corte essa ligação e conseguirei o que você quer. Traga algo como prova.,,"Unul dintre slujitorii mei fură electricitate cu robinetul pe undeva. Află cum face asta, distruge-i proviziile, și îți voi oferi ceea ce vrei. Adu-mi și ceva ca dovadă.","Кто-то из моих подчинённых отводит энергию откуда-то из питающей сети. Найди и отключи эту установку — тогда получишь то, за чем пришёл. И принеси мне что-нибудь в качестве доказательства.",,En av mina hantlangare stjäl ström med en kran på elnätet någonstans. Hitta den och avbryta hans leverans så ska jag förse dig med det du vill ha. Ta med dig något som ett tecken.,"Kölelerimden biri bir yerdeki şebekeden güç çalıyor. Onu bul ve kaynağını kes, ben de sana istediğini vereyim. Bana simge olarak bir şey getir." Where do I find this tap?,TXT_RPLY0_SCRIPT02_D56092_WHERE,"〃 -(〃)",,,Kde najdu to stáčedlo?,Hvor kan jeg finde denne vandhane?,Wo finde ich die Anzapfung?,,Kie estas la konektilo?,¿Dónde está la toma?,,Mistä tämä kytkentä löytyy?,Où est-ce que je trouve cette connection?,Hol találom ezt a dugaszt?,E dove lo trovo questo aggeggio?,どうやって突き止めたらいい?,그 추출기는 어디에 찾을 수 있지?,Waar vind ik deze kraan?,Hvor finner jeg denne kranen?,Gdzie znajdę ten przełącznik?,Onde encontro essa ligação clandestina?,,Unde-i găsesc robinetul?,Где может находиться эта установка?,,Var hittar jag den här kranen?,Bu musluğu nerede bulabilirim? +(〃)",,,Kde najdu to stáčedlo?,Hvor kan jeg finde denne vandhane?,Wo finde ich die Anzapfung?,,Kie estas la konektilo?,¿Dónde está la toma?,,Mistä tämä kytkentä löytyy?,Où est-ce que je trouve cette connection?,,Hol találom ezt a dugaszt?,E dove lo trovo questo aggeggio?,どうやって突き止めたらいい?,그 추출기는 어디에 찾을 수 있지?,Waar vind ik deze kraan?,Hvor finner jeg denne kranen?,Gdzie znajdę ten przełącznik?,Onde encontro essa ligação clandestina?,,Unde-i găsesc robinetul?,Где может находиться эта установка?,,Var hittar jag den här kranen?,Bu musluğu nerede bulabilirim? "If I knew, it wouldn't be a chore now would it? Use your charm, but shut off his supply.",TXT_DLG_SCRIPT02_D57608_IFIKN,"〃 (〃)",,,"Kdybych věděl, nebyla by to práce, ne? Použij svůj šarm, ale vypni dotyčnému přívod.","Hvis jeg vidste det, ville det ikke være så besværligt, vel? Brug din charme, men luk for hans forsyning.","Wenn ich das wüsste, wäre das keine lästige Angelegenheit, nicht wahr? Benutze deinen Charme, aber schalte seine Versorgung aus.",,"Se mi scius tion, mi ne petus ĉi tion al vi, ĉu ne? Uzu vian ĉarmon, sed interrompu lian provizadon.","Si lo supiera no te lo estaría pidiendo, ¿no? Usa tu encanto, pero corta su suministro. -",,"Jos tietäisin sen, eihän se silloin enää olisi askare, eihän? Käytä sulokkuutasi, mutta katkaise hänen sähkönsä.","Si je le savais, ce ne serait pas une corvée, non? Utiliser votre charme si il le faut, mais coupez cette connection.","Ha tudnám, nem lenne ez a feladat már. Használd a bájodat, de állítsd le az ellátást.","E se lo sapessi, non sarebbe mica una faccenda scomoda! Usa il tuo fascino, ma metti fine al suo schema.","私が知っていたら、こんな雑用はさせない +",,"Jos tietäisin sen, eihän se silloin enää olisi askare, eihän? Käytä sulokkuutasi, mutta katkaise hänen sähkönsä.","Si je le savais, ce ne serait pas une corvée, non? Utiliser votre charme si il le faut, mais coupez cette connection.",,"Ha tudnám, nem lenne ez a feladat már. Használd a bájodat, de állítsd le az ellátást.","E se lo sapessi, non sarebbe mica una faccenda scomoda! Usa il tuo fascino, ma metti fine al suo schema.","私が知っていたら、こんな雑用はさせない だろう?誰かをでっちあげるか、 聞き込みでもするんだ。","만약 내가 그 위치를 알았다면 지루한 심부름이 됐겠지, 그렇지 않아? 네 머리를 써! 그리고 그 추출기를 찾아. \cy배부른 돼지 같은 녀석. 난 이 추출기에 대해서 아무것도 몰라. 너무 급하게 하지 말자.","Als ik het wist, zou het nu geen karwei zijn, toch? Gebruik je charme, maar schakel zijn voorraad uit.","Hvis jeg visste det, ville det ikke være et ork, ville det vel? Bruk sjarmen din, men steng av tilførselen hans.","Gdybym wiedział, to nie byłby problem, prawda? Wykorzystaj swój spryt, ale pamiętaj by odciąć mu dostawę.","Se eu soubesse, não seria uma tarefa chata, não é mesmo? Use seu charme, mas corte essa ligação.",,"Dacă știam, n-ar mai fi fost o corvoadă, este? Folosește-ți farmecul, dar distruge-i proviziile.","Если бы я знал, то справился бы с этим сам, как считаешь? Пусти в ход свои таланты, но прекрати утечку энергии.",,"Om jag visste det skulle det inte vara så jobbigt, eller hur? Använd din charm, men stäng av hans förråd.","Eğer bilseydim, bu bir angarya olmazdı, değil mi? Cazibeni kullan ama onun kaynağını kapat." "Tell you what, there's a lying sack named Derwin who has been selling children to the Order. I won't tolerate that kind of depravity. Not without my cut. Derwin works in the warehouse. Kill him and bring me his, ear, and I'll see what I can do.",TXT_DLG_SCRIPT02_D59124_TELLY,"〃 -(""bloody"" chore)",,,"Mám problém s pupkáčem jménem Derwin, který Řádu prodává děti. Takovou odpornost nemůžu tolerovat, ne bez mého podílu. Derwin pracuje ve skladišti. Zab ho a přines mi jeho ucho a já uvidím, co pro tebe budu moci udělat.","Ved du hvad, der er en løgnagtig sæk ved navn Derwin, der har solgt børn til Ordenen. Jeg vil ikke tolerere den slags fordærv. Ikke uden min andel. Derwin arbejder i lageret. Dræb ham og giv mig hans øre, så skal jeg se, hvad jeg kan gøre.","Ich sag dir was, da gibt es so einen lügenden Kerl namens Derwin, der Kinder an den Orden verkauft hat. Ich kann so eine Verdorbenheit nicht tolerieren. Nicht ohne meinen Anteil. Derwin arbeitet im Lagerhaus. Töte ihn und bring mir sein Ohr und ich werde sehen was ich tun kann.",,"Aŭskultu ĉi tion. Estas fimensogulo nomata Derwin, kiu kutimas vendi infanojn al La Ordeno, kaj mi ne toleros tian perversecon: ne se li ne donos parton de la gajnoj. Derwin laboras en la magazeno. Mortigu lin, alportu lian orelon kaj mi vidos tion, kion mi povas fari.","A ver, te cuento. Hay un sucio mentiroso llamado Derwin que ha estado vendiendo niños a La Orden, y no toleraré ese tipo de perversión: no si no me da mi parte. Derwin trabaja en el almacén. Mátalo, tráeme su oreja y veré qué puedo hacer.","A ver, te cuento. Hay un sucio mentiroso llamado Derwin que ha estado vendiendo niños a La Orden, y no puedo tolerar ese tipo de perversión: no si no me da mi parte. Derwin trabaja en el almacén. Mátalo, tráeme su oreja y voy a ver qué puedo hacer.","Annapa, kun kerron valepukista nimeltä Derwin, joka myy lapsia Veljeskunnalle. En voi suvaita sellaista turmeltuneisuutta... jossa en pääse itse osingoille. Derwin työskentelee varastolla. Tapa hänet ja tuo minulle hänen... korvansa, ja katson sitten, jos voin olla avuksi.","Eh bien, il y a une raclure appelée Derwin qui vend des enfants à l'Ordre. Je ne tolère pas ce type d'atrocité, du moins pas sans ma part des frais. Derwin travaille dans l'entrepôt. Tuez-le et ramenez moi son oreille, je verrais ce que je peux faire pour vous.","Na figyusz, van egy Derwin nevű hazug genya, aki gyerekeket árul a Rend számára. Nem tolerálom az ilyen romlottságot. Legalábbis a részesedésem nélkül. Derwin a raktárban dolgozik. Intézd el, és hozdd el a fülét, meglátom mit tehetek érted.","Senti questa, ci sta questo sporco bugiardo chiamato Derwin che sta vendendo bambini all'Ordine. Non tollero queste azioni depravate. Non senza che io riceva una fetta dei soldi. Derwin lavora al magazzino. Fallo fuori e portami un suo, orecchio, e vedrò cosa posso fare.","教えよう、ダーウィンとかいう恥知らずが +(""bloody"" chore)",,,"Mám problém s pupkáčem jménem Derwin, který Řádu prodává děti. Takovou odpornost nemůžu tolerovat, ne bez mého podílu. Derwin pracuje ve skladišti. Zab ho a přines mi jeho ucho a já uvidím, co pro tebe budu moci udělat.","Ved du hvad, der er en løgnagtig sæk ved navn Derwin, der har solgt børn til Ordenen. Jeg vil ikke tolerere den slags fordærv. Ikke uden min andel. Derwin arbejder i lageret. Dræb ham og giv mig hans øre, så skal jeg se, hvad jeg kan gøre.","Ich sag dir was, da gibt es so einen lügenden Kerl namens Derwin, der Kinder an den Orden verkauft hat. Ich kann so eine Verdorbenheit nicht tolerieren. Nicht ohne meinen Anteil. Derwin arbeitet im Lagerhaus. Töte ihn und bring mir sein Ohr und ich werde sehen was ich tun kann.",,"Aŭskultu ĉi tion. Estas fimensogulo nomata Derwin, kiu kutimas vendi infanojn al La Ordeno, kaj mi ne toleros tian perversecon: ne se li ne donos parton de la gajnoj. Derwin laboras en la magazeno. Mortigu lin, alportu lian orelon kaj mi vidos tion, kion mi povas fari.","A ver, te cuento. Hay un sucio mentiroso llamado Derwin que ha estado vendiendo niños a La Orden, y no toleraré ese tipo de perversión: no si no me da mi parte. Derwin trabaja en el almacén. Mátalo, tráeme su oreja y veré qué puedo hacer.","A ver, te cuento. Hay un sucio mentiroso llamado Derwin que ha estado vendiendo niños a La Orden, y no puedo tolerar ese tipo de perversión: no si no me da mi parte. Derwin trabaja en el almacén. Mátalo, tráeme su oreja y voy a ver qué puedo hacer.","Annapa, kun kerron valepukista nimeltä Derwin, joka myy lapsia Veljeskunnalle. En voi suvaita sellaista turmeltuneisuutta... jossa en pääse itse osingoille. Derwin työskentelee varastolla. Tapa hänet ja tuo minulle hänen... korvansa, ja katson sitten, jos voin olla avuksi.","Eh bien, il y a une raclure appelée Derwin qui vend des enfants à l'Ordre. Je ne tolère pas ce type d'atrocité, du moins pas sans ma part des frais. Derwin travaille dans l'entrepôt. Tuez-le et ramenez moi son oreille, je verrais ce que je peux faire pour vous.",,"Na figyusz, van egy Derwin nevű hazug genya, aki gyerekeket árul a Rend számára. Nem tolerálom az ilyen romlottságot. Legalábbis a részesedésem nélkül. Derwin a raktárban dolgozik. Intézd el, és hozdd el a fülét, meglátom mit tehetek érted.","Senti questa, ci sta questo sporco bugiardo chiamato Derwin che sta vendendo bambini all'Ordine. Non tollero queste azioni depravate. Non senza che io riceva una fetta dei soldi. Derwin lavora al magazzino. Fallo fuori e portami un suo, orecchio, e vedrò cosa posso fare.","教えよう、ダーウィンとかいう恥知らずが 子供をオーダーへ売りつけているようだ。 私に分け前無しに、そんな恥ずべき行為を 許すわけには行かん。ダーウィンは倉庫で 勤務している。殺った証拠として奴の、耳を、 持ってきたまえ。","그렇담, 더윈이라는 뚱땡이가 지금 아이들을 붙잡아 오더에 팔아넘기는 짓을 일삼고 있어. 너무나도 괘씸해... 내게 이득이 전혀 없으니. 더윈은 발전소 주변 창고에서 일하고 있어. 그를 죽이고, 그의, 귀를 뜯어서 가져와. 그럼 거래를 진행하지.","Weet je wat, er is een leugenachtige zak genaamd Derwin die kinderen aan de Orde heeft verkocht. Dat soort verdorvenheid tolereer ik niet. Niet zonder mijn deel. Derwin werkt in het magazijn. Dood hem en breng me zijn oor, en ik zal zien wat ik kan doen.","Det er en løgnhals ved navn Derwin som har solgt barn til Ordenen. Jeg tolererer ikke den slags fordervelse. Ikke uten min andel. Derwin jobber på lageret. Drep ham og gi meg hans øre, så skal jeg se hva jeg kan gjøre.","Słuchaj, jest tu pewien worek kłamstw, który nazywa się Derwin. Sprzedaje on Zakonowi dzieci. Nie będę tolerował takiego zepsucia. Nie bez moich udziałów. Derwin pracuje w magazynie. Zabij go i przynieś mi jego... ucho, a zobaczę co da się zrobić.","É o seguinte, tem um mentiroso desgraçado chamado Derwin que anda vendendo crianças para a Ordem. Não vou tolerar esse tipo de depravação. Não sem a minha parte. Derwin trabalha no depósito. Mate-o e traga a...orelha dele e verei o que posso fazer.",,"Să-ți zic ceva, un gunoi mincinos pe nume Derwin vinde copii Ordinului. Nu tolerez ceva atât de depravat. Nu fără să primesc și eu ceva. Derwin lucrează în depozit. Omoară-l și adu-mi... urechea lui, și-o să văd ce pot face.","Лживый мешок дерьма по имени Дервин продаёт Ордену детей. Я не терплю такой безнравственности, особенно когда меня не берут в долю. Дервин работает в складе. Убей его и принеси мне его ухо, и я посмотрю, чем можно помочь.",,"Vet du vad, det finns en ljugande säck vid namn Derwin som har sålt barn till Orden. Jag tolererar inte den sortens fördärv. Inte utan min andel. Derwin arbetar i lagret. Döda honom och ge mig hans öra så ska jag se vad jag kan göra.","Bak ne diyeceğim, Tarikat'a çocuk satan Derwin adında yalancı bir çuval var. Bu tür bir ahlaksızlığa müsamaha göstermeyeceğim. Benim payım olmadan olmaz. Derwin depoda çalışıyor. Onu öldürüp kulağını bana getir, ne yapabileceğime bakarım." How do I get in?,TXT_RPLY0_SCRIPT02_D59124_HOWDO,"〃 -(〃)",,,Jak se dostanu dovnitř?,Hvordan kommer jeg ind?,Wie komme ich hinein?,,Kiel mi eniru tien?,¿Cómo entro?,,Miten pääsen sisään?,Comment j'y rentre?,Hogy jutok be?,Come ci arrivo?,どうすれば入れる?,어떻게 들어가지?,Hoe kom ik binnen?,Hvordan kommer jeg inn?,Jak się tam dostanę?,Como faço para entrar?,,Cum ajung înăuntru?,Как мне туда попасть?,,Hur kommer jag in?,İçeri nasıl gireceğim? +(〃)",,,Jak se dostanu dovnitř?,Hvordan kommer jeg ind?,Wie komme ich hinein?,,Kiel mi eniru tien?,¿Cómo entro?,,Miten pääsen sisään?,Comment j'y rentre?,,Hogy jutok be?,Come ci arrivo?,どうすれば入れる?,어떻게 들어가지?,Hoe kom ik binnen?,Hvordan kommer jeg inn?,Jak się tam dostanę?,Como faço para entrar?,,Cum ajung înăuntru?,Как мне туда попасть?,,Hur kommer jag in?,İçeri nasıl gireceğim? "This key will get you into the power station. On second thought, cut off the ear and then kill him. Much better.",TXT_DLG_SCRIPT02_D60640_THISK,"〃 -(〃)",,,"Tímhle klíčem se dostaneš do elektrárny. Víš ty co, nejprve mu uřízni ucho, až pak ho zabij. Mnohem lepší.","Med denne nøgle kan du komme ind i kraftværket. Ved nærmere eftertanke, skær øret af og dræb ham så. Det er meget bedre.","Dieser Schlüssel wird dich ins Kraftwerk bringen. Andererseits, schneide ihm erst das Ohr ab und dann töte ihn. Viel besser.",,"Jen ŝlosilo de la elektrocentralo. Repensante pri tio, fortranĉu lian orelon kaj tiam mortigu lin. Multe plibone.","Aquí tengo una llave de la central eléctrica. Pensándolo bien, córtale la oreja y luego mátalo. Mucho mejor.",,"Tällä avaimella pääset voimalaitokseen. Nyt, kun tarkemmin ajattelen, niin sivalla ensin hänen korvansa, ja sitten tapa hänet. Paljon parempi.","Cette clé vous laissera entrer dans la centrale électrique. Maintenant que j'y pense, coupez-lui l'oreille, puis tuez-le. Ca me plaît plus comme ça.","Ezzel a kulccsal bejuthatsz az erőműbe. Jobban átgondolva, vádg le a fülét és öld meg. Sokkal jobb. ","Questa chiave ti farà entrare nella centrale energetica. Ora che ci penso, prima tagliagli l'orecchio, e poi uccidilo. Molto meglio.","この鍵で発電所に入るんだ。出来れば、 +(〃)",,,"Tímhle klíčem se dostaneš do elektrárny. Víš ty co, nejprve mu uřízni ucho, až pak ho zabij. Mnohem lepší.","Med denne nøgle kan du komme ind i kraftværket. Ved nærmere eftertanke, skær øret af og dræb ham så. Det er meget bedre.","Dieser Schlüssel wird dich ins Kraftwerk bringen. Andererseits, schneide ihm erst das Ohr ab und dann töte ihn. Viel besser.",,"Jen ŝlosilo de la elektrocentralo. Repensante pri tio, fortranĉu lian orelon kaj tiam mortigu lin. Multe plibone.","Aquí tengo una llave de la central eléctrica. Pensándolo bien, córtale la oreja y luego mátalo. Mucho mejor.",,"Tällä avaimella pääset voimalaitokseen. Nyt, kun tarkemmin ajattelen, niin sivalla ensin hänen korvansa, ja sitten tapa hänet. Paljon parempi.","Cette clé vous laissera entrer dans la centrale électrique. Maintenant que j'y pense, coupez-lui l'oreille, puis tuez-le. Ca me plaît plus comme ça.",,"Ezzel a kulccsal bejuthatsz az erőműbe. Jobban átgondolva, vádg le a fülét és öld meg. Sokkal jobb. ","Questa chiave ti farà entrare nella centrale energetica. Ora che ci penso, prima tagliagli l'orecchio, e poi uccidilo. Molto meglio.","この鍵で発電所に入るんだ。出来れば、 先に耳を切り落としてから殺してくれ。 その方が良い。","이 열쇠만 있으면 발전소에 들어갈 수 있을 거야. 그리고 다시 생각해보니, 그 자식을 죽이기 전에, 먼저 귀를 뜯어. 그럼 더 나을 거 같군.","Met deze sleutel kom je in de centrale. Bij nader inzien, snij je het oor eraf en vermoord je hem. Veel beter.","Denne nøkkelen får deg inn i kraftstasjonen. Ved nærmere ettertanke, skjær av øret og drep ham. Mye bedre.","Ten klucz pozwoli ci wejść do elektrowni. Z drugiej strony, najpierw odetnij mu ucho, a potem go zabij. Tak będzie lepiej.","Esta chave vai te ajudar a entrar na usina de energia. Pensando melhor, corte fora a orelha e depois mate ele. Muito melhor.",,"Cheia asta îți va oferi acces la stația electrică. Dacă mă gândesc mai bine, mai întâi taie-i urechea și abia apoi omoară-l. Mult mai bine.","С этим ключом ты пройдёшь на электростанцию. А, да, я тут подумал — сначала отрежь ему ухо, а затем убей. Так будет намного лучше.",,"Den här nyckeln tar dig in i kraftverket. Vid närmare eftertanke, skär av örat och döda honom sedan. Mycket bättre.","Bu anahtar seni elektrik santraline sokacak. Bir daha düşündüm de, kulağını kes ve sonra onu öldür. Çok daha iyi olur." "Oh, I just love souvenirs. Here, this will get you into the prison. Talk to Warden Montag. Whatever you do after that, I don't want to know.",TXT_DLG_SCRIPT02_D62156_OHIJU,"〃 -(after completing ""messy"" chore)",,,"Ó, já prostě zbožňuju suvenýry. Tady, tohle tě dostane do vězení. Promluv si s dozorčím Montagem. Co máš v plánu dělat potom, to už vědět nechci.","Åh, jeg elsker souvenirs. Her, med den her kan du komme ind i fængslet. Tal med fængselsinspektør Montag. Hvad du end gør efter det, vil jeg ikke vide det.","Oh, ich liebe Souvenirs. Hier, damit kommst du in das Gefängnis. Sprich mit Direktor Montag. Was du danach machen musst, weiß ich nicht.",,"Ha, mi ŝategas memoraĵojn. Havu ĉi tion, kio ebligos al vi eniri la malliberejon. Parolu kun la provoso Montag. Tion ajn, kion vi faros poste, mi ne volas scii.","Ah, me encantan los recuerdos. Ten, con esto podrás entrar en la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Ah, me encantan los recuerdos. Toma, con esto vas a poder entrar a la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Minä siis niin rakastan matkamuistoja. Kas näin, pääset tällä vankilaan. Puhu vankilanjohtaja Montagin kanssa. Mitä teetkään sen jälkeen, en halua tietää.","Oh, j'adore les souvenirs. Voilà, ça vous laissera entrer dans la prison. Parlez au gardien Montag. Ce que vous faites après, je m'en fous complètement.","Oh, imádom az ajándékokat. Nesze, ezzel be fogsz tudni jutni a börtönbe. Beszélj Mondtag igazgatóval. Nem akarok tudni arról, mit teszel utána.","Ah, adoro i souvenir! Ecco qua, con questo potrai entrare nella prigione. Parla con Montag, il direttore del carcere. Quello che farai dopo, a me non interessa.","嬉しい手土産だ。では、これがあれば +(after completing ""messy"" chore)",,,"Ó, já prostě zbožňuju suvenýry. Tady, tohle tě dostane do vězení. Promluv si s dozorčím Montagem. Co máš v plánu dělat potom, to už vědět nechci.","Åh, jeg elsker souvenirs. Her, med den her kan du komme ind i fængslet. Tal med fængselsinspektør Montag. Hvad du end gør efter det, vil jeg ikke vide det.","Oh, ich liebe Souvenirs. Hier, damit kommst du in das Gefängnis. Sprich mit Direktor Montag. Was du danach machen musst, weiß ich nicht.",,"Ha, mi ŝategas memoraĵojn. Havu ĉi tion, kio ebligos al vi eniri la malliberejon. Parolu kun la provoso Montag. Tion ajn, kion vi faros poste, mi ne volas scii.","Ah, me encantan los recuerdos. Ten, con esto podrás entrar en la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Ah, me encantan los recuerdos. Toma, con esto vas a poder entrar a la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Minä siis niin rakastan matkamuistoja. Kas näin, pääset tällä vankilaan. Puhu vankilanjohtaja Montagin kanssa. Mitä teetkään sen jälkeen, en halua tietää.","Oh, j'adore les souvenirs. Voilà, ça vous laissera entrer dans la prison. Parlez au gardien Montag. Ce que vous faites après, je m'en fous complètement.",,"Oh, imádom az ajándékokat. Nesze, ezzel be fogsz tudni jutni a börtönbe. Beszélj Mondtag igazgatóval. Nem akarok tudni arról, mit teszel utána.","Ah, adoro i souvenir! Ecco qua, con questo potrai entrare nella prigione. Parla con Montag, il direttore del carcere. Quello che farai dopo, a me non interessa.","嬉しい手土産だ。では、これがあれば 刑務所に入れる。モンターグ所長と話すんだ。 君がそこで何をしようが、私の管轄外だ。","오오, 난 기념품이 정말 좋아. 여기, 네가 원했던 감옥 통행증이야. 감옥으로 가서 몬탕 간수장에게 이야기해봐. 네가 어떤 짓을 저지르든, 그 후엔 절대로 알고 싶지 않아!","Oh, ik hou gewoon van souvenirs. Hier, dit zal je in de gevangenis brengen. Spreek met directeur Montag. Wat je daarna ook doet, ik wil het niet weten.","Jeg elsker suvenirer. Denne får deg inn i fengselet. Snakk med fengselsdirektør Montag. Uansett hva du gjør etter det, vil jeg ikke vite det.","Oh, po prostu kocham pamiątki. Masz, to pozwoli ci wejść do więzienia. Pogadaj z Naczelnikiem Montagiem. Nie chcę wiedzieć co potem zrobisz.","Ah, eu simplesmente adoro suvenires. Tome, isto vai te ajudar a entrar na prisão. Fale com o carcereiro, Montag. O que você for fazer depois não me interessa.",,"Oh, ce mai ador suvenirurile. Aici, asta îți va permite să ajungi în interiorul închisorii. Vorbește cu gardianul Montag. Ce faci după aceea, nu vreau să știu.","О, как я люблю сувениры! Вот твой пропуск в тюрьму. Обратись к тюремщику Монтагу, а что ты будешь делать потом, я и знать не желаю.",,"Jag älskar souvenirer. Här, den här tar dig in i fängelset. Prata med fängelsedirektör Montag. Vad du än gör efter det vill jag inte veta.","Hatıra eşyalarına bayılırım. İşte, bu seni hapishaneye sokacak. Müdür Montag ile konuş. Ondan sonra ne yaparsan yap, bilmek istemiyorum." Thanks.,TXT_RPLY0_SCRIPT02_D62156_THANK,"〃 -(〃)",,,Díky.,Jeg vil ikke vide det. Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Kösz.,Grazie.,ありがとう。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Спасибо.,,Jag vill inte veta. Tack.,Teşekkürler. -"Give you a hint. When I stop talking to you, you leave.",TXT_DLG_SCRIPT02_D63672_GIVEY,〃,,,"Dám ti radu: Když s tebou přestanu mluvit, znamená to odchod.","Jeg giver dig et hint. Når jeg holder op med at tale med dig, går du.","Hier mal ein Tipp. Wenn ich aufgehört habe mit dir zu reden, dann gehst du.",,"Jen konsilo: Kiam mi ĉesas paroli al vi, vi foriras.","Un consejo: Cuando dejo de hablarte, te vas.",,"Pienenä vinkkinä, että kun lakkaan puhumasta sinulle, sinä lähdet.","Petit conseil. Quand j'arrète de vous parler, vous sortez d'ici.","Csak egy tanács. Amikor már nem beszélek hozzád, húzz el.","Ti do un consiglio. Quando io smetto di parlare, tu vai via.",ヒントを出そう。話すのを止めたら去りたまえ。,"힌트를 하나 주지. 나랑 대화가 끝났으면, 넌 떠나는 거야.","Ik geef je een hint. Als ik niet meer met je praat, ga je weg.","Jeg skal gi deg et hint. Når jeg slutter å snakke med deg, drar du.",Dam ci wskazówkę. Jak przestanę mówić to wyjdź.,"Uma dica. Quando eu terminar de falar contigo, você vai embora.",,"Îți dau un sfat. Când termin de discutat cu tine, pleci.","Дам тебе подсказку: когда я закончу говорить, ты уходишь.",,"Jag ger dig en ledtråd. När jag slutar prata med dig, går du.","Sana bir ipucu vereyim. Seninle konuşmayı bıraktığımda, gideceksin." +(〃)",,,Díky.,Jeg vil ikke vide det. Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Kösz.,Grazie.,ありがとう。,고마워.,Bedankt.,Takk skal du ha.,Dzięki.,Agradeço.,,Mulțumesc.,Спасибо.,,Jag vill inte veta. Tack.,Teşekkürler. +"Give you a hint. When I stop talking to you, you leave.",TXT_DLG_SCRIPT02_D63672_GIVEY,〃,,,"Dám ti radu: Když s tebou přestanu mluvit, znamená to odchod.","Jeg giver dig et hint. Når jeg holder op med at tale med dig, går du.","Hier mal ein Tipp. Wenn ich aufgehört habe mit dir zu reden, dann gehst du.",,"Jen konsilo: Kiam mi ĉesas paroli al vi, vi foriras.","Un consejo: Cuando dejo de hablarte, te vas.",,"Pienenä vinkkinä, että kun lakkaan puhumasta sinulle, sinä lähdet.","Petit conseil. Quand j'arrète de vous parler, vous sortez d'ici.",,"Csak egy tanács. Amikor már nem beszélek hozzád, húzz el.","Ti do un consiglio. Quando io smetto di parlare, tu vai via.",ヒントを出そう。話すのを止めたら去りたまえ。,"힌트를 하나 주지. 나랑 대화가 끝났으면, 넌 떠나는 거야.","Ik geef je een hint. Als ik niet meer met je praat, ga je weg.","Jeg skal gi deg et hint. Når jeg slutter å snakke med deg, drar du.",Dam ci wskazówkę. Jak przestanę mówić to wyjdź.,"Uma dica. Quando eu terminar de falar contigo, você vai embora.",,"Îți dau un sfat. Când termin de discutat cu tine, pleci.","Дам тебе подсказку: когда я закончу говорить, ты уходишь.",,"Jag ger dig en ledtråd. När jag slutar prata med dig, går du.","Sana bir ipucu vereyim. Seninle konuşmayı bıraktığımda, gideceksin." Do you have good news for me? I'm all ears.,TXT_DLG_SCRIPT02_D65188_DOYOU,"〃 -(after completing ""bloody"" chore)",,,Máš pro mě dobré zprávy? Uši mám nastražené.,Har du gode nyheder til mig? Jeg er lutter ører.,Hast du gute Neuigkeiten für mich? Ich bin ganz Ohr.,,Ĉu vi alportas bonajn novaĵojn? Mi estas tute aŭskultema.,¿Tienes buenas noticias para mí? Soy todo oídos.,,Onko sinulla minulle hyviä uutisia? Olen pelkkänä korvana.,De bonnes nouvelles? Mes oreilles sont à vous.,Van valami jó híred számomra? Csupa fül vagyok.,Hai buone notizie per me? Sono tutto orecchi...,私の耳に吉報を伝えに来たかね?,날 위한 좋은 소식이 있나? 열심히 듣고 있다구.,Heb je goed nieuws voor mij? Ik ben een en al oor.,Har du gode nyheter til meg? Jeg er lutter øre.,Masz dobre wieści dla mnie? Zamieniam się w słuch.,Alguma notícia boa pra mim? Sou todo ouvidos.,,Ai vești bune pentru mine? Sunt numai urechi.,Есть для меня хорошие новости? Слушаю во все уши.,,Har du goda nyheter till mig? Jag är alldeles nyfiken.,Benim için iyi haberlerin var mı? Can kulağıyla dinliyorum. +(after completing ""bloody"" chore)",,,Máš pro mě dobré zprávy? Uši mám nastražené.,Har du gode nyheder til mig? Jeg er lutter ører.,Hast du gute Neuigkeiten für mich? Ich bin ganz Ohr.,,Ĉu vi alportas bonajn novaĵojn? Mi estas tute aŭskultema.,¿Tienes buenas noticias para mí? Soy todo oídos.,,Onko sinulla minulle hyviä uutisia? Olen pelkkänä korvana.,De bonnes nouvelles? Mes oreilles sont à vous.,,Van valami jó híred számomra? Csupa fül vagyok.,Hai buone notizie per me? Sono tutto orecchi...,私の耳に吉報を伝えに来たかね?,날 위한 좋은 소식이 있나? 열심히 듣고 있다구.,Heb je goed nieuws voor mij? Ik ben een en al oor.,Har du gode nyheter til meg? Jeg er lutter øre.,Masz dobre wieści dla mnie? Zamieniam się w słuch.,Alguma notícia boa pra mim? Sou todo ouvidos.,,Ai vești bune pentru mine? Sunt numai urechi.,Есть для меня хорошие новости? Слушаю во все уши.,,Har du goda nyheter till mig? Jag är alldeles nyfiken.,Benim için iyi haberlerin var mı? Can kulağıyla dinliyorum. The deed is done!,TXT_RPLY0_SCRIPT02_D65188_THEDE,"〃 -(〃)",,,Skutek je dokonán!,Det er gjort!,Es ist geschehen!,,Interkonsento plenumita!,¡El trato está hecho!,,Se on tehty!,C'est bel est bien fait.,Véghezvittem a büntettet.,È fatta!,やることはヤった,임무 완료!,De daad is gedaan!,Gjerningen er utført!,Wszystko zrobione!,Está feito!,,Fapta e făcută.,Дело сделано!,,Det är gjort!,İş tamamdır! +(〃)",,,Skutek je dokonán!,Det er gjort!,Es ist geschehen!,,Interkonsento plenumita!,¡El trato está hecho!,,Se on tehty!,C'est bel est bien fait.,,Véghezvittem a büntettet.,È fatta!,やることはヤった,임무 완료!,De daad is gedaan!,Gjerningen er utført!,Wszystko zrobione!,Está feito!,,Fapta e făcută.,Дело сделано!,,Det är gjort!,İş tamamdır! "Oh, I just love souvenirs. Here, this will get you into the prison. Talk to Warden Montag. Whatever you do after that, I don't want to know.",TXT_DLG_SCRIPT02_D66704_OHIJU,"〃 -(〃)",,,"Ó, já prostě zbožňuju suvenýry. Tady, tohle tě dostane do vězení. Promluv si s dozorčím Montagem. Co máš v plánu dělat po tom, to už vědět nechci.","Åh, jeg elsker bare souvenirs. Her, det her vil få dig ind i fængslet. Tal med fængselsinspektør Montag. Hvad du end gør efter det, vil jeg ikke vide det.","Oh, ich liebe Souvenirs. Hier, damit kommst du in das Gefängnis. Sprich mit Direktor Montag. Was du danach machen musst, weiß ich nicht.",,"Ha, mi ŝategas memoraĵojn. Havu ĉi tion, kio ebligos al vi eniri la malliberejon. Parolu kun la provoso Montag. Tion ajn, kion vi faros poste, mi ne volas scii.","Ah, me encantan los recuerdos. Ten, con esto podrás entrar en la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Ah, me encantan los recuerdos. Toma, con esto vas a poder entrar a la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Voi, kun minä rakastan matkamuistoja. Kas näin, pääset tällä vankilaan. Puhu vankilanjohtaja Montagin kanssa. Mitä teetkään sen jälkeen, en halua tietää.","Oh, j'adore les souvenirs. Voilà, ça vous laissera entrer dans la prison. Parlez au gardien Montag. Ce que vous faites après, je m'en fous complètement.","Oh, imádom az ajándékokat. Nesze, ezzel be fogsz tudni jutni a börtönbe. Beszélj Mondtag igazgatóval. Nem akarok tudni arról, mit teszel utána.","Ah, adoro i souvenir! Ecco qua, con questo potrai entrare nella prigione. Parla con Montag, il direttore del carcere. Quello che farai dopo, a me non interessa.","嬉しい手土産だ。では、これがあれば +(〃)",,,"Ó, já prostě zbožňuju suvenýry. Tady, tohle tě dostane do vězení. Promluv si s dozorčím Montagem. Co máš v plánu dělat po tom, to už vědět nechci.","Åh, jeg elsker bare souvenirs. Her, det her vil få dig ind i fængslet. Tal med fængselsinspektør Montag. Hvad du end gør efter det, vil jeg ikke vide det.","Oh, ich liebe Souvenirs. Hier, damit kommst du in das Gefängnis. Sprich mit Direktor Montag. Was du danach machen musst, weiß ich nicht.",,"Ha, mi ŝategas memoraĵojn. Havu ĉi tion, kio ebligos al vi eniri la malliberejon. Parolu kun la provoso Montag. Tion ajn, kion vi faros poste, mi ne volas scii.","Ah, me encantan los recuerdos. Ten, con esto podrás entrar en la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Ah, me encantan los recuerdos. Toma, con esto vas a poder entrar a la prisión. Habla con el carcelero Montag. Lo que hagas después de eso no quiero saberlo.","Voi, kun minä rakastan matkamuistoja. Kas näin, pääset tällä vankilaan. Puhu vankilanjohtaja Montagin kanssa. Mitä teetkään sen jälkeen, en halua tietää.","Oh, j'adore les souvenirs. Voilà, ça vous laissera entrer dans la prison. Parlez au gardien Montag. Ce que vous faites après, je m'en fous complètement.",,"Oh, imádom az ajándékokat. Nesze, ezzel be fogsz tudni jutni a börtönbe. Beszélj Mondtag igazgatóval. Nem akarok tudni arról, mit teszel utána.","Ah, adoro i souvenir! Ecco qua, con questo potrai entrare nella prigione. Parla con Montag, il direttore del carcere. Quello che farai dopo, a me non interessa.","嬉しい手土産だ。では、これがあれば 刑務所に入れる。モンターグ所長と話すんだ。 君がそこで何をしようが、私の管轄外だ。","오오, 난 기념품이 정말 좋아. 여기, 네가 원했던 감옥 통행증이야. 감옥으로 가서 몬탕 간수장에게 이야기해봐. 네가 어떤 짓을 저지르든, 그 후엔 절대로 알고 싶지 않아!","Oh, ik hou gewoon van souvenirs. Hier, dit zal je in de gevangenis brengen. Praat met directeur Montag. Wat je daarna ook doet, ik wil het niet weten.","Jeg elsker suvenirer. Denne får deg inn i fengselet. Snakk med fengselsdirektør Montag. Uansett hva du gjør etter det, vil jeg ikke vite det.","Oh, po prostu kocham pamiątki. Masz, to pozwoli ci wejść do więzienia. Pogadaj z Naczelnikiem Montagiem. Nie chcę wiedzieć co potem zrobisz.","Ah, eu simplesmente adoro suvenires. Tome, isto vai te ajudar a entrar na prisão. Fale com o carcereiro, Montag. O que você for fazer depois não me interessa.",,"Oh, ce mai ador suvenirurile. Aici, asta îți va permite să ajungi în interiorul închisorii. Vorbește cu gardianul Montag. Ce faci după aceea, nu vreau să știu.","О, как я люблю сувениры! Вот твой пропуск в тюрьму. Обратись к тюремщику Монтагу, а что ты будешь делать потом, я и знать не желаю.",,"Jag älskar souvenirer. Här, den här tar dig in i fängelset. Prata med Warden Montag. Vad du än gör efter det vill jag inte veta.","Hatıra eşyalarına bayılırım. İşte, bu seni hapishaneye sokacak. Müdür Montag ile konuş. Ondan sonra ne yaparsan yap, bilmek istemiyorum." Fine by me.,TXT_RPLY0_SCRIPT02_D66704_FINEB,"〃 -(〃)",,,To je dobře.,Det er fint med mig.,Ist mir recht.,,Mi ne malkonsentas.,Por mí está bien.,,Sopii minulle.,Ca me convient.,Felőlem rendben van.,Per me va bene.,良好だ。,난 괜찮아.,Ik vind het prima.,Greit for meg.,"Jak dla mnie, w porządku.","Por mim, sem problemas.",,Mie-mi convine.,По рукам!,,Det är okej för mig.,Bana uyar. -"So you're the fool who stole the chalice? I'm going to have you arrested as a rebel thief... Thereby enhancing my position with the Order. How does it feel to be an unwitting pawn? I'll give you a hint, it's gonna hurt. ",TXT_DLG_SCRIPT02_D68220_SOYOU,〃,,,"Tak ty jsi ten blázen, který ukradl kalich? Teď tě nechám zatknout jako rebelského zloděje... a tím si upevním svou pozici s Řádem. Jaký je to pocit, být bezděčnou figurkou? Dám ti radu: Bude to bolet.","Så du er det fjols, der stjal bægeret? Jeg vil få dig arresteret som oprørstyv... og derved forbedre min position i ordenen. Hvordan føles det at være en uvidende brik? Jeg skal give dig et hint, det kommer til at gøre ondt.","So, du bist also der Narr der den Kelch gestohlen hat? Ich werde dich als Dieb der Rebellen verhaften lassen und dadurch meine Position im Orden verbessern. Wie fühlt es sich an als ahnungslose Schachfigur? Ich geb' dir einen Tipp: Es wird wehtun.",,"Vi do estas la stultulo, kiu ŝtelis la kalikon, ĉu? Mi kaptos vin kiel ribelan ŝteliston, tiel mi plibonigos mian statuson kun La Ordeno. Kiel vi sentas, ke vi estas nevola marioneto? Jen aludeto: tio doloros vin.","¿Así que tú eres el necio que ha robado el cáliz? Te capturaré como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario? Una pista: te dolerá.","¿Así que tú eres el tonto que se robó el cáliz? Te voy a capturar como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario? Una pista: te va a doler.","Vai sinä olet se houkka, joka varasti kalkin? Pidätytän sinut kapinallisvarkaana, siten parantaen asemaani Veljeskunnassa. Miltäpä tuntuu olla tahaton pelinappula? Annanpa vihjeen, se tulee sattumaan.","Vous êtes l'abruti qui a volé le calice? Maintenant il faut que je vous arrète comme voleur rebelle.. Ca va aider ma position dans l'Ordre. Comment ça fait d'être un pion ignorant? Petite idée, ça va faire mal.",Szóval te vagy az isten barma aki ellopta a kelyhet? Jól letartóztatlak mint lázadó tolvaj...ezzel megerősítve a pozíciómat a Rendben. Milyen érzés egy tudatlan parasztnak lenni? Adok egy tippet: marhára fájni fog.,"Quindi sei tu il folle che ha rubato il calice? Ti farò arrestare come un ladro ribelle... E così facendo salirò nei ranghi dell'Ordine. Come ci si sente ad essere un'inconsapevole pedina? Ti do un consiglio, farà male.","それで、お前が聖杯を盗んだ愚か者か? +(〃)",,,To je dobře.,Det er fint med mig.,Ist mir recht.,,Mi ne malkonsentas.,Por mí está bien.,,Sopii minulle.,Ca me convient.,,Felőlem rendben van.,Per me va bene.,良好だ。,난 괜찮아.,Ik vind het prima.,Greit for meg.,"Jak dla mnie, w porządku.","Por mim, sem problemas.",,Mie-mi convine.,По рукам!,,Det är okej för mig.,Bana uyar. +"So you're the fool who stole the chalice? I'm going to have you arrested as a rebel thief... Thereby enhancing my position with the Order. How does it feel to be an unwitting pawn? I'll give you a hint, it's gonna hurt. ",TXT_DLG_SCRIPT02_D68220_SOYOU,〃,,,"Tak ty jsi ten blázen, který ukradl kalich? Teď tě nechám zatknout jako rebelského zloděje... a tím si upevním svou pozici s Řádem. Jaký je to pocit, být bezděčnou figurkou? Dám ti radu: Bude to bolet.","Så du er det fjols, der stjal bægeret? Jeg vil få dig arresteret som oprørstyv... og derved forbedre min position i ordenen. Hvordan føles det at være en uvidende brik? Jeg skal give dig et hint, det kommer til at gøre ondt.","So, du bist also der Narr der den Kelch gestohlen hat? Ich werde dich als Dieb der Rebellen verhaften lassen und dadurch meine Position im Orden verbessern. Wie fühlt es sich an als ahnungslose Schachfigur? Ich geb' dir einen Tipp: Es wird wehtun.",,"Vi do estas la stultulo, kiu ŝtelis la kalikon, ĉu? Mi kaptos vin kiel ribelan ŝteliston, tiel mi plibonigos mian statuson kun La Ordeno. Kiel vi sentas, ke vi estas nevola marioneto? Jen aludeto: tio doloros vin.","¿Así que tú eres el necio que ha robado el cáliz? Te capturaré como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario? Una pista: te dolerá.","¿Así que tú eres el tonto que se robó el cáliz? Te voy a capturar como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario? Una pista: te va a doler.","Vai sinä olet se houkka, joka varasti kalkin? Pidätytän sinut kapinallisvarkaana, siten parantaen asemaani Veljeskunnassa. Miltäpä tuntuu olla tahaton pelinappula? Annanpa vihjeen, se tulee sattumaan.","Vous êtes l'abruti qui a volé le calice? Maintenant il faut que je vous arrète comme voleur rebelle.. Ca va aider ma position dans l'Ordre. Comment ça fait d'être un pion ignorant? Petite idée, ça va faire mal.",,Szóval te vagy az isten barma aki ellopta a kelyhet? Jól letartóztatlak mint lázadó tolvaj...ezzel megerősítve a pozíciómat a Rendben. Milyen érzés egy tudatlan parasztnak lenni? Adok egy tippet: marhára fájni fog.,"Quindi sei tu il folle che ha rubato il calice? Ti farò arrestare come un ladro ribelle... E così facendo salirò nei ranghi dell'Ordine. Come ci si sente ad essere un'inconsapevole pedina? Ti do un consiglio, farà male.","それで、お前が聖杯を盗んだ愚か者か? 私は反賊としてお前を逮捕するつもりだ... そうすればオーダーの地位は上がる。 捨て駒に成るというのはどんな感じだ? ヒントを教えよう、お前はもう助からない。","그래서 네가 그 성배를 훔친 바보로군? 반군 절도범으로 체포해주지... 오더에서의 내 위치도 올리는 겸. 모르는 사이에 장물아비가 된 기분이 어떤가? 힌트를 주지, 정말 아플 거야.","Dus jij bent de dwaas die de kelk heeft gestolen? Ik ga je laten arresteren als een rebellendief.... Daardoor verbeter ik mijn positie bij de Orde. Hoe voelt het om een onwetende pion te zijn? Ik zal je een hint geven, het gaat pijn doen.","Så du er idioten som stjal begeret? Jeg skal få deg arrestert som en opprørsk tyv... Og dermed styrke min posisjon i Ordenen. Hvordan føles det å være en uvitende brikke? Jeg skal gi deg et hint, det kommer til å gjøre vondt.","Więc... to ty jesteś tym głupcem, który ukradł kielich? Aresztuję cię jako złodzieja-buntownika... A tym samym zwiększając swe uznanie u Zakonu. Jakie to uczucie jak się jest nieświadomym pionkiem? Podpowiedź, będzie bolało.",Então você é o imbecil que roubou o cálice? Eu vou mandar prender você como um ladrão rebelde... E assim a minha posição na Ordem vai melhorar. Como se sente sendo um plebeu ignorante? Só pra te dar uma ideia: vai doer.,,"Deci tu ești prostul care a furat potirul? Te voi aresta, hoț rebel... Prin urmare avansând în rangurile Ordinului. Cum e să fii un pion neștiutor? Îți dau un indiciu, o șă doară.","Так это ты тот недоумок, что украл чашу? Я передам тебя Ордену, как вора повстанцев... Это укрепит мои отношения с ним. Каково чувствовать себя безмозглой пешкой? Дам тебе подсказку: очень больно! ",,"Så du är idioten som stal kalken? Jag ska låta arrestera dig som en upprorisk tjuv... och på så sätt förbättra min ställning i orden. Hur känns det att vara en ovetande bricka? Jag ska ge dig en ledtråd, det kommer att göra ont.","Demek kadehi çalan aptal sensin? Seni asi bir hırsız olarak tutuklatacağım. Böylece Tarikat'taki konumumu güçlendireceğim. Farkında olmadan bir piyon olmak nasıl bir duygu? Sana bir ipucu vereyim, acıtacak." -It sucks!,TXT_RPLY0_SCRIPT02_D68220_ITSUC,〃,,,Je to na hovno!,Det stinker!,Scheiße!,,Tio estas aĉa!,¡Apesta!,,Ihan syvältä!,Quelle merde!,Szopás!,È uno schifo!,クソが!,이거 정말 난감한데?,Het is klote!,Det suger!,Cholera!,Que merda!,,E nașpa!,Это отстой!,,Det suger!,Berbat bir şey! -For you it does.,TXT_RYES0_SCRIPT02_D68220_FORYO,〃,,,Pro tebe určitě.,For dig gør det.,Du steckst ganz tief drin.,,Por vi ja.,Para ti sí.,,"Kyllä, sinun tilanteesi.","Pour vous, en effet.","Igen, neked.",A te lo farà.,私もそう思う。,너한테는 더욱 그럴걸.,Voor jou wel.,For deg gjør det det.,Dla ciebie tak.,"Pra você, sim.",,"Pentru tine, cu siguranță.",Для тебя — да.,,För dig gör det det.,Senin için öyle. -Harris promised me money!,TXT_RPLY1_SCRIPT02_D68220_HARRI,〃,,,Harris mi slíbil peníze!,Harris lovede mig penge!,Harris hat mir Geld versprochen!,,Harris promesis monon al mi!,¡Harris me prometió dinero!,,Harris lupasi minulle rahaa!,Harris m'a promis de l'argent!,Harris pénzt igért!,Harris mi ha promesso dei soldi!,ハリスは俺に金を渡すと約束したのに!,해리스는 내게 돈을 약속했어!,Harris beloofde me geld!,Harris lovet meg penger!,Harris obiecał mi pieniądze!,O Harris prometeu me pagar!,,Harris mi-a promis bani!,Харрис обещал мне деньги!,,Harris lovade mig pengar!,Harris bana para sözü verdi! +It sucks!,TXT_RPLY0_SCRIPT02_D68220_ITSUC,〃,,,Je to na hovno!,Det stinker!,Scheiße!,,Tio estas aĉa!,¡Apesta!,,Ihan syvältä!,Quelle merde!,,Szopás!,È uno schifo!,クソが!,이거 정말 난감한데?,Het is klote!,Det suger!,Cholera!,Que merda!,,E nașpa!,Это отстой!,,Det suger!,Berbat bir şey! +For you it does.,TXT_RYES0_SCRIPT02_D68220_FORYO,〃,,,Pro tebe určitě.,For dig gør det.,Du steckst ganz tief drin.,,Por vi ja.,Para ti sí.,,"Kyllä, sinun tilanteesi.","Pour vous, en effet.",,"Igen, neked.",A te lo farà.,私もそう思う。,너한테는 더욱 그럴걸.,Voor jou wel.,For deg gjør det det.,Dla ciebie tak.,"Pra você, sim.",,"Pentru tine, cu siguranță.",Для тебя — да.,,För dig gör det det.,Senin için öyle. +Harris promised me money!,TXT_RPLY1_SCRIPT02_D68220_HARRI,〃,,,Harris mi slíbil peníze!,Harris lovede mig penge!,Harris hat mir Geld versprochen!,,Harris promesis monon al mi!,¡Harris me prometió dinero!,,Harris lupasi minulle rahaa!,Harris m'a promis de l'argent!,,Harris pénzt igért!,Harris mi ha promesso dei soldi!,ハリスは俺に金を渡すと約束したのに!,해리스는 내게 돈을 약속했어!,Harris beloofde me geld!,Harris lovet meg penger!,Harris obiecał mi pieniądze!,O Harris prometeu me pagar!,,Harris mi-a promis bani!,Харрис обещал мне деньги!,,Harris lovade mig pengar!,Harris bana para sözü verdi! Too bad. The only thing you're getting is dead!,TXT_RYES1_SCRIPT02_D68220_TOOBA,〃,,,"Smůla. Jediné, co dostaneš, je smrt.","Det var ærgerligt. Det eneste, du får, er død!",Jammerschade. Das Einzige was du bekommen wirst ist der Tod!,,"Kiel domaĝe. Ĉio, kion vi havos estas morto!","Qué mal. ¡Lo único que tendrás es la muerte!","Qué mal. ¡Lo único que -vas a tener es la muerte!","Voi voi. Sen kyllä voin sinulle luvata, että kuolet!","C'est dommage. Tout ce que vous gagnez, c'est une mort rapide!","Sajna, inkább ólmot kapsz helyette!",Peccato. L'unica cosa che otterrai è la morte!,残念だな、お前にやれるものは死のみだ!,그거 안됐네. 네가 얻는 거라곤 죽음뿐이니까!,Wat jammer. Het enige dat je zult krijgen is de dood!,"Synd for deg. Det eneste du får, er død!",Szkoda. Jedyne co dostaniesz to śmierć!,Que pena. A única coisa que você vai receber é a morte!,,Păcat. Tot ceea ce primești e moarte!,"Увы. Всё, что ты получишь — это смерть!",,Det var synd. Det enda du får är en död!,Çok yazık. Elde edeceğin tek şey ölüm! -"In a small world, word travels fast. I hear you just removed some obstacles from your path. Nice work. Are you interested in some more lucrative projects?",TXT_DLG_SCRIPT02_D69736_INASM,MAP02: Rowan.,,,"V malém světě se zprávy šíří rychle. Slyšel jsem, že sis právě odstranil z cesty pár překážek. Pěkná práce. Měl bys zájem o nějaké lukrativnější zakázky?","I en lille verden spreder ordet sig hurtigt. Jeg hører, at du lige har fjernet nogle forhindringer fra din vej. Godt arbejde. Er du interesseret i nogle mere lukrative projekter?","Mir sind da Gerüchte zu Ohren gekommen, dass du gerade ein paar Hindernisse aus dem Weg geräumt hast. Gute Arbeit. Bist du an lukrativeren Angeboten interessiert?",,"En malgranda mondo novaĵoj vojaĝas rapide. Mi aŭdis, ke vi ĵus forigis kelkajn obstaklojn de via vojo. Bone farite. Ĉu interesas vin partopreni pli lukrajn projektojn?",El mundo es un pañuelo y las noticias vuelan. He oido que acabas de quitarte un par de obstáculos de encima. Bien hecho. ¿Te interesaría participar en proyectos más lucrativos?,El mundo es un pañuelo y las noticias vuelan. Oí que acabas de quitarte un par de obstáculos de encima. Bien hecho. ¿Te interesaría participar en proyectos más lucrativos?,"Pienessä maailmassa sana kiirii nopeasti. Sana kuuluu, että olet juuri poistanut esteitä tieltäsi. Hyvin tehty. Olisitko kiinnostunut tuottoisammista projekteista?","Dans un petit monde, les rumeurs courent vite. J'entends que vous avez.. enlevé certains obstacles de votre chemin. Bon travail. Vous seriez intéressé par des projets plus lucratifs?",Ilyen kis helyen gyorsan terjednek a hírek. Úgy hírlik eltávolítottál pár akadályt az utadból. Szép munka. Nem érdekel valami jövedelmezőbb projekt?,"In un piccolo mondo, le voci si spargono in fretta... Ho sentito che hai appena rimosso alcuni ostacoli dal tuo percorso. Ottimo lavoro. Sei interessato a progetti un po' più lucrativi?","この小さな世界では噂が広まるのは早いもんだ。 +vas a tener es la muerte!","Voi voi. Sen kyllä voin sinulle luvata, että kuolet!","C'est dommage. Tout ce que vous gagnez, c'est une mort rapide!",,"Sajna, inkább ólmot kapsz helyette!",Peccato. L'unica cosa che otterrai è la morte!,残念だな、お前にやれるものは死のみだ!,그거 안됐네. 네가 얻는 거라곤 죽음뿐이니까!,Wat jammer. Het enige dat je zult krijgen is de dood!,"Synd for deg. Det eneste du får, er død!",Szkoda. Jedyne co dostaniesz to śmierć!,Que pena. A única coisa que você vai receber é a morte!,,Păcat. Tot ceea ce primești e moarte!,"Увы. Всё, что ты получишь — это смерть!",,Det var synd. Det enda du får är en död!,Çok yazık. Elde edeceğin tek şey ölüm! +"In a small world, word travels fast. I hear you just removed some obstacles from your path. Nice work. Are you interested in some more lucrative projects?",TXT_DLG_SCRIPT02_D69736_INASM,MAP02: Rowan.,,,"V malém světě se zprávy šíří rychle. Slyšel jsem, že sis právě odstranil z cesty pár překážek. Pěkná práce. Měl bys zájem o nějaké lukrativnější zakázky?","I en lille verden spreder ordet sig hurtigt. Jeg hører, at du lige har fjernet nogle forhindringer fra din vej. Godt arbejde. Er du interesseret i nogle mere lukrative projekter?","Mir sind da Gerüchte zu Ohren gekommen, dass du gerade ein paar Hindernisse aus dem Weg geräumt hast. Gute Arbeit. Bist du an lukrativeren Angeboten interessiert?",,"En malgranda mondo novaĵoj vojaĝas rapide. Mi aŭdis, ke vi ĵus forigis kelkajn obstaklojn de via vojo. Bone farite. Ĉu interesas vin partopreni pli lukrajn projektojn?",El mundo es un pañuelo y las noticias vuelan. He oido que acabas de quitarte un par de obstáculos de encima. Bien hecho. ¿Te interesaría participar en proyectos más lucrativos?,El mundo es un pañuelo y las noticias vuelan. Oí que acabas de quitarte un par de obstáculos de encima. Bien hecho. ¿Te interesaría participar en proyectos más lucrativos?,"Pienessä maailmassa sana kiirii nopeasti. Sana kuuluu, että olet juuri poistanut esteitä tieltäsi. Hyvin tehty. Olisitko kiinnostunut tuottoisammista projekteista?","Dans un petit monde, les rumeurs courent vite. J'entends que vous avez.. enlevé certains obstacles de votre chemin. Bon travail. Vous seriez intéressé par des projets plus lucratifs?",,Ilyen kis helyen gyorsan terjednek a hírek. Úgy hírlik eltávolítottál pár akadályt az utadból. Szép munka. Nem érdekel valami jövedelmezőbb projekt?,"In un piccolo mondo, le voci si spargono in fretta... Ho sentito che hai appena rimosso alcuni ostacoli dal tuo percorso. Ottimo lavoro. Sei interessato a progetti un po' più lucrativi?","この小さな世界では噂が広まるのは早いもんだ。 あんたが素早く厄介事を片付けたと聞いたぞ。 もっと儲かる仕事をやってみる気はないかね?","이처럼 작은 세상엔, 소문이 빨리 전해지지. 방금 자네가 장애물들을 처리한 걸 들었다네. 수고했어. 수익이 아주 짭짤한 일자리에 관심이 있나? ",In een kleine wereld gaat het woord snel. Ik hoor dat je net wat obstakels van je pad hebt verwijderd. Goed werk. Ben je geïnteresseerd in wat lucratievere projecten?,I en liten verden sprer rykter seg fort. Jeg hører du har fjernet noen hindringer fra veien din. Bra jobbet. Er du interessert i flere lukrative prosjekter?,"W małym świecie wieści szybko się rozchodzą. Usłyszałem, że właśnie usunąłeś parę rzeczy ze swojej drogi. Dobra robota. Jesteś zainteresowany jakimiś bardziej korzystnymi projektami?","Neste mundo pequeno, as notícias viajam rápido. Fiquei sabendo que você tirou alguns obstáculos de seu caminho. Bom trabalho. Está interessado em alguns projetos mais lucrativos?",,"Într-o lume mică, vorba circulă repede. Aud că tocmai ai înlăturat niște obstacole din drum. Bună treabă. Mai ești interesat de alte proiecte profitabile?","Мир тесен, и новости разлетаются быстро. Я слышал, как ты только что убрал пару препятствий со своего пути. Хорошая работа. Заинтересован в более прибыльных занятиях?",,I en liten värld går ryktet fort. Jag hörde att du just avlägsnade några hinder från din väg. Bra jobbat. Är du intresserad av några mer lukrativa projekt?,"Küçük bir dünyada, laf çabuk yayılır. Yolundaki bazı engelleri kaldırdığını duydum. İyi iş çıkardın. Daha kazançlı projelerle ilgileniyor musun?" -"Sure, why not.",TXT_RPLY0_SCRIPT02_D69736_SUREW,〃,,,"Klidně, proč ne.","Selvfølgelig, hvorfor ikke.","Sicher, warum nicht.",,"Jes, kial ne?","Por supuesto, ¿por qué no?","Claro, ¿por qué no?",Miksipä ei.,"Ouais, pourquoi pas.","Persze, miért is ne.","Certo, perché no.",ああ、もちろんだ。,그거 좋군요.,"Tuurlijk, waarom niet.","Ja, hvorfor ikke.","Jasne, czemu nie.","Claro, por que não?",,"Da, de ce nu.","Конечно, почему бы и нет.",,"Visst, varför inte.","Elbette, neden olmasın." -No thanks.,TXT_RPLY1_SCRIPT02_D69736_NOTHA,〃,,,"Ne, díky.",Nej tak.,Nein danke.,,"Ne, dankon.","No, gracias.",,Ei kiitos.,Non merci.,Nem kösz.,"No, grazie.",やめとくよ。,필요 없어요.,"Nee, dank je wel.",Nei takk.,"Nie, dziękuję.","Não, obrigado.",,Nu mulțumesc.,"Нет, спасибо.",,Nej tack.,"Hayır, teşekkürler." -Then get lost!,TXT_RYES1_SCRIPT02_D69736_THENG,,,,Tak vypadni!,Så forsvind!,Dann verzieh dich!,,Tiuokaze malaperu!,¡Entonces piérdete!,,Sitten häivy!,Alors dégage!,Akkor húzz el innen!,E allora sparisci!,じゃあ失せるんだな!,그럼 꺼져!,Dan verdwalen!,Så stikk!,W takim razie spadaj!,Então suma daqui!,,Atunci valea!,Тогда проваливай!,,Försvinn då!,O zaman kaybol! -"Fool! Guards, rid me of this meddlesome peon.",TXT_DLG_SCRIPT02_D71252_FOOLG,Rowan.,,,"Blázne! Stráže, zbavte se tohohle zbytečného nuzáka.","Fjols! Vagter, befri mig for denne uopmærksomme bondeknold.","Du Narr! Wachen, entledigt mich dieses lästigen Tagelöhners.",,"Stultulo! Gardistoj, liberigu min de ĉi tiu entrudiĝema peono.","¡Insensato! Guardias, libérenme de este entrometido peón.","¡Tonto! Guardias, libérenme de este entrometido peón.","Sinä mieletön! Vartijat, hankkiutukaa eroon tästä tungettelevasta moukasta.","Idiot! Gardes, débarassez-moi de ce pion embêtant!","Barom! Őrök, takarítsátok el a színem elől ezt a kotnyeleskedő pondrót!","Sciocco! Guardie, liberatemi da questo ficcanaso.","なんと愚かな! +"Sure, why not.",TXT_RPLY0_SCRIPT02_D69736_SUREW,〃,,,"Klidně, proč ne.","Selvfølgelig, hvorfor ikke.","Sicher, warum nicht.",,"Jes, kial ne?","Por supuesto, ¿por qué no?","Claro, ¿por qué no?",Miksipä ei.,"Ouais, pourquoi pas.",,"Persze, miért is ne.","Certo, perché no.",ああ、もちろんだ。,그거 좋군요.,"Tuurlijk, waarom niet.","Ja, hvorfor ikke.","Jasne, czemu nie.","Claro, por que não?",,"Da, de ce nu.","Конечно, почему бы и нет.",,"Visst, varför inte.","Elbette, neden olmasın." +No thanks.,TXT_RPLY1_SCRIPT02_D69736_NOTHA,〃,,,"Ne, díky.",Nej tak.,Nein danke.,,"Ne, dankon.","No, gracias.",,Ei kiitos.,Non merci.,,Nem kösz.,"No, grazie.",やめとくよ。,필요 없어요.,"Nee, dank je wel.",Nei takk.,"Nie, dziękuję.","Não, obrigado.",,Nu mulțumesc.,"Нет, спасибо.",,Nej tack.,"Hayır, teşekkürler." +Then get lost!,TXT_RYES1_SCRIPT02_D69736_THENG,,,,Tak vypadni!,Så forsvind!,Dann verzieh dich!,,Tiuokaze malaperu!,¡Entonces piérdete!,,Sitten häivy!,Alors dégage!,,Akkor húzz el innen!,E allora sparisci!,じゃあ失せるんだな!,그럼 꺼져!,Dan verdwalen!,Så stikk!,W takim razie spadaj!,Então suma daqui!,,Atunci valea!,Тогда проваливай!,,Försvinn då!,O zaman kaybol! +"Fool! Guards, rid me of this meddlesome peon.",TXT_DLG_SCRIPT02_D71252_FOOLG,Rowan.,,,"Blázne! Stráže, zbavte se tohohle zbytečného nuzáka.","Fjols! Vagter, befri mig for denne uopmærksomme bondeknold.","Du Narr! Wachen, entledigt mich dieses lästigen Tagelöhners.",,"Stultulo! Gardistoj, liberigu min de ĉi tiu entrudiĝema peono.","¡Insensato! Guardias, libérenme de este entrometido peón.","¡Tonto! Guardias, libérenme de este entrometido peón.","Sinä mieletön! Vartijat, hankkiutukaa eroon tästä tungettelevasta moukasta.","Idiot! Gardes, débarassez-moi de ce pion embêtant!",,"Barom! Őrök, takarítsátok el a színem elől ezt a kotnyeleskedő pondrót!","Sciocco! Guardie, liberatemi da questo ficcanaso.","なんと愚かな! 衛兵、この厄介な奴を始末してくれ。","멍청한 것! 경비병, 이 걸리적거리는 난동꾼을 치워라.","Dwaas! Bewakers, bevrijd me van deze bemoeizuchtige pioen.","Idiot! Vakter, kvitt meg med denne innpåslitne trellen.","Głupcze! Straż, uwolnijcie mnie od tego wścibskiego robola.","Idiota! Guardas, tirem esse peão intrometido daqui.",,"Prostule! Gardieni, scăpați-mă de acest pion băgăreț.","Глупец! Стража, избавьте меня от этого недоумка.",,"Dumbom! Vakter, gör mig av med den här besvärliga pingsten.","Aptal! Muhafızlar, beni bu işgüzar piyondan kurtarın." -"Good. Some uh, friends of mine need someone silenced. Beldin is being held by the Order in their sanctuary. There's a rarely used entrance by a small pier off the river which is unguarded. Get in, shut him up, and bring his ring back to me as proof.",TXT_DLG_SCRIPT02_D72768_GOODS,〃,,,"Dobře. Někteří mí... přátelé potřebují někoho umlčet. Beldin je držen Řádem v jejich svatyni. Na malém molu u řeky je málo používaný vchod, který nikdo nehlídá. Dostaň se dovnitř, umlč ho a přines mi jeho prsten jako důkaz.","Godt. Nogle af mine venner har brug for at få nogen til at tie stille. Beldin bliver tilbageholdt af Ordenen i deres fristed. Der er en sjældent brugt indgang ved en lille mole ud for floden, som er ubevogtet. Gå ind, luk munden på ham, og giv mig hans ring som bevis.","Gut. Einige, äh, Freunde von mir müssen zum Schweigen gebracht werden. Beldin wird vom Orden im Heiligtum gefangen gehalten. Es gibt dort einen selten benutzen Eingang bei einem kleinen Pier am Fluss, welcher unbewacht ist. Geh rein, mach ihn kalt und bringe mir seinen Ring als Beweis zurück.",,"Bone. Kelkaj... hm, amikoj bezonas «silentigi» iun. Beldin estas retenita en la sanktejo de La Ordeno. Estas malofte uzata enirejo ĉe malgranda kajo sen viglado apud la rojo. Eniru tien, silentigu lin kaj alportu lian ringon kiel pruvon.","Bien. Algunos... este, amigos míos necesitan «silenciar» a alguien. Beldin es retenido por La Orden en su santuario. Hay una entrada rara vez utilizada por un pequeño muelle junto al arroyo que está sin vigilancia. Entra, cállalo y tráeme su anillo como prueba.",,"Hyvä. Eräät, öh, ystäväni kaipaavat erään henkilön hiljentämistä. Veljeskunta pitää Beldiniä vankinaan pyhäkössään. Jokea vierustavalta vartioimattomalta pikkulaiturilta on harvoin käytetty sisäänkäynti. Mene sisään, vaienna hänet ja tuo hänen sormuksensa takaisin todisteena.","Bien. Certains... amis à moi demandent à ce que quelqu'un arrète de parler. Beldin est retenu par l'Ordre dans leur sanctuaire. Il y a une entrée rarement utilisée près d'un ponton près de la rivière qui n'est pas gardée. Entrez, coupez-lui le sifflet et ramenez moi son anneau comme preuve.","Kiváló. Néhány barátom el akar valakit némítani. Beldint a Rend szentélyében tartják fogva. Van egy ritkán használt bejárat egy kis mólónál, amit nem védenek katonák. Hatolj be, csitícsd el örökre, és hozdd el a gyűrűjét bizonyítékként.","Ottimo. Alcuni uh, amici miei hanno bisogno che qualcuno venga messo a tacere. Beldin è sotto custodia dell'Ordine nel loro santuario. C'è un ingresso poco utilizzato e non sorvegliato tramite un piccolo molo accanto al fiume. Entra, fallo tacere, e portami il suo anello come prova.","それでいい。ええと、私の友人がある人物を +"Good. Some uh, friends of mine need someone silenced. Beldin is being held by the Order in their sanctuary. There's a rarely used entrance by a small pier off the river which is unguarded. Get in, shut him up, and bring his ring back to me as proof.",TXT_DLG_SCRIPT02_D72768_GOODS,〃,,,"Dobře. Někteří mí... přátelé potřebují někoho umlčet. Beldin je držen Řádem v jejich svatyni. Na malém molu u řeky je málo používaný vchod, který nikdo nehlídá. Dostaň se dovnitř, umlč ho a přines mi jeho prsten jako důkaz.","Godt. Nogle af mine venner har brug for at få nogen til at tie stille. Beldin bliver tilbageholdt af Ordenen i deres fristed. Der er en sjældent brugt indgang ved en lille mole ud for floden, som er ubevogtet. Gå ind, luk munden på ham, og giv mig hans ring som bevis.","Gut. Einige, äh, Freunde von mir müssen zum Schweigen gebracht werden. Beldin wird vom Orden im Heiligtum gefangen gehalten. Es gibt dort einen selten benutzen Eingang bei einem kleinen Pier am Fluss, welcher unbewacht ist. Geh rein, mach ihn kalt und bringe mir seinen Ring als Beweis zurück.",,"Bone. Kelkaj... hm, amikoj bezonas «silentigi» iun. Beldin estas retenita en la sanktejo de La Ordeno. Estas malofte uzata enirejo ĉe malgranda kajo sen viglado apud la rojo. Eniru tien, silentigu lin kaj alportu lian ringon kiel pruvon.","Bien. Algunos... este, amigos míos necesitan «silenciar» a alguien. Beldin es retenido por La Orden en su santuario. Hay una entrada rara vez utilizada por un pequeño muelle junto al arroyo que está sin vigilancia. Entra, cállalo y tráeme su anillo como prueba.",,"Hyvä. Eräät, öh, ystäväni kaipaavat erään henkilön hiljentämistä. Veljeskunta pitää Beldiniä vankinaan pyhäkössään. Jokea vierustavalta vartioimattomalta pikkulaiturilta on harvoin käytetty sisäänkäynti. Mene sisään, vaienna hänet ja tuo hänen sormuksensa takaisin todisteena.","Bien. Certains... amis à moi demandent à ce que quelqu'un arrète de parler. Beldin est retenu par l'Ordre dans leur sanctuaire. Il y a une entrée rarement utilisée près d'un ponton près de la rivière qui n'est pas gardée. Entrez, coupez-lui le sifflet et ramenez moi son anneau comme preuve.",,"Kiváló. Néhány barátom el akar valakit némítani. Beldint a Rend szentélyében tartják fogva. Van egy ritkán használt bejárat egy kis mólónál, amit nem védenek katonák. Hatolj be, csitícsd el örökre, és hozdd el a gyűrűjét bizonyítékként.","Ottimo. Alcuni uh, amici miei hanno bisogno che qualcuno venga messo a tacere. Beldin è sotto custodia dell'Ordine nel loro santuario. C'è un ingresso poco utilizzato e non sorvegliato tramite un piccolo molo accanto al fiume. Entra, fallo tacere, e portami il suo anello come prova.","それでいい。ええと、私の友人がある人物を 黙らせて欲しいと望んでいるんだ。 ベルディンはオーダーの連中の聖域に 囚われている。建物への入り口は川に掛かった 桟橋の先にあり、そこは誰も警備してないし ほぼ使われていない。潜入してヤツを黙らせて、 仕事をした証拠としてヤツの指輪を見せてくれ。","좋구만... 그래서, 내 지인이 말하기를 벨딘이라는 사람의 입을 다물게 만들라는군. 그는 지금 오더에 의해 성소에 감금됐네. 그 근처 강가에 있는 작은 부두 옆에 자주 쓰이지 않는 입구가 있다네. 거기로 향해서, 그의 입을 막게. 그리고 그의 반지를 증거로 가져오게.","Goed. Sommige uh, vrienden van mij hebben iemand nodig die het zwijgen oplegt. Beldin wordt vastgehouden door de Orde in hun heiligdom. Er is een zelden gebruikte ingang bij een kleine pier van de rivier die onbewaakt is. Stap in, sluit hem op en breng zijn ring terug als bewijs.","Fint. Noen venner av meg trenger å få noen til å tie. Beldin holdes av Ordenen i deres helligdom. Det er en sjelden brukt inngang ved en liten brygge ved elven som er ubevoktet. Gå inn, få ham til å holde kjeft, og gi meg ringen hans som bevis.","Dobrze. Paru moich... ehmm... przyjaciół potrzebuje kogoś uciszyć. Beldin jest trzymany przez Zakon w ich sanktuarium. Jest tu gdzieś rzadko używane wejście przy małej przystani przy rzece, które jest niestrzeżone. Wejdź tam, ucisz go i przynieś mi jego pierścień jako dowód.","Ótimo. Alguns hã... amigos meus precisam silenciar alguém. Beldin foi detido pela Ordem no santuário deles. Há uma entrada pouco usada perto de um pequeno pier pelo rio que está sem guardas. Entre lá, cale a boca dele e traga o seu anel de volta pra mim como prova.",,"Bun. Niște um... prieteni de-ai mei au nevoie de cineva redus la tăcere. Beldin e ținut de Ordin în sanctuarul lor. E o intrare rar folosită pe niște chei lângă râu care e nepăzită. Intră, fă-l să tacă pe veci, și adu-mi inelul lui ca dovadă.","Хорошо. Некоторые мои, э-э-э, приятели, хотят, чтобы кое-кто замолчал. Орден держит Белдина в своём святилище. У небольшого пира рядом с рекой есть редко используемый вход, что не охраняется. Проберись внутрь, заставь его замолчать навсегда и принеси мне его кольцо в качестве доказательства.",,"Jag är glad att du är här. Några av mina vänner behöver få någon tystad. Beldin hålls av orden i deras helgedom. Det finns en sällan använd ingång vid en liten brygga vid floden som är obevakad. Gå in, få tyst på honom och ge mig hans ring som bevis.","Güzel. Bazı arkadaşlarımın birinin susturulmasına ihtiyacı var. Beldin, Tarikat tarafından sığınaklarında tutuluyor. Nehir kıyısındaki küçük iskelede korumasız, nadiren kullanılan bir giriş var. İçeri gir, onu sustur ve yüzüğünü kanıt olarak bana geri getir." -Will it be worth the effort?,TXT_RPLY0_SCRIPT02_D72768_WILLI,〃,,,Bude mi to stát za to?,Vil det være indsatsen værd?,Wird es die Mühe denn wert sein?,,Ĉu la strebo estos valora?,¿Valdrá la pena el esfuerzo?,¿Va a valer la pena el esfuerzo?,Onko väärti vaivannäköni?,Est-ce que ça en vaudra l'effort?,Megéri az erőfeszítést?,Ne varrà la pena?,苦労に見合った報酬だろうな?,노력할만한 가치가 있나요?,Zal het de moeite waard zijn?,Er det verdt innsatsen?,Czy będzie to warte moich starań?,Será que vale a pena o esforço?,,O să merite efortul?,Оно того стоит?,,Kommer det att vara värt besväret?,Bu çabaya değecek mi? -"I'll guarantee 50 gold and if you return without setting off every alarm in town, there's the chance to earn much, much more, and here's a little helper that should give you an edge.",TXT_DLG_SCRIPT02_D74284_ILLGU,〃,,,"Garantuji ti padesát zlatých a jestliže se vrátíš bez toho, abys spustil každý poplach ve městě, je tu šance vydělat si mnohem, mnohem víc. Tady je malý pomocník, který by ti měl pomoci.","Jeg garanterer dig 50 guld, og hvis du vender tilbage uden at udløse alle alarmer i byen, er der mulighed for at tjene meget, meget mere, og her er en lille hjælper, der burde give dig en fordel.","Ich garantiere dir 50 Gold und wenn du zurückkehrst ohne den Alarm in der Stadt ausgelöst zu haben, dann hast du noch die Chance, viel, viel mehr zu verdienen und hier ist noch ein kleiner Helfer der dir einen Vorteil verschaffen wird.",,"Mi garantias al vi 50 monerojn da oro, kaj se vi revenos ne ekagiginte ĉiun alarmon en la urbo, estas eblo gajni multe, multe pliajn. Kaj jen malgranda helpilo por faciligi vian takson.","Te garantizo 50 de oro, y si vuelves sin activar todas las alarmas del pueblo, existe la posibilidad de ganar mucho, mucho más. Y aquí hay un pequeño ayudante que debería darte una ventaja.",,"Takaan sinulle 50 kultakolikkoa, ja jos palaat ilman, että soitatat jokaista kaupungin hälytyskelloa, voit mahdollisesti tienata paljon paljon enemmän. Tässä vielä pikkuapuri, jonka pitäisi antaa sinulle pienen kilpailuedun.","Je vous garantis 50 pièces et si vous revenez sans déclencher toutes les alarmes de la ville, vous avez la possibilité de gagner bien plus. Voilà une petite avance qui pourra vous aider.","50 arany garantáltan a markodat üti, és ha nem indítod be a riasztót a városban, akkor esélyed van többet is kapni, sokkal többet. Itt van egy kis segítség, hogy előnyhöz juss.","Ti garantisco 50 pezzi d'oro e se ritorni qua senza far scattare ogni allarme in città, ci sarà l'opportunità di guadagnare molto, molto di più, ed ecco qua anche un piccolo aggeggio che ti aiuterà.","50ゴールドは保証するし街の警報を鳴らさず +Will it be worth the effort?,TXT_RPLY0_SCRIPT02_D72768_WILLI,〃,,,Bude mi to stát za to?,Vil det være indsatsen værd?,Wird es die Mühe denn wert sein?,,Ĉu la strebo estos valora?,¿Valdrá la pena el esfuerzo?,¿Va a valer la pena el esfuerzo?,Onko väärti vaivannäköni?,Est-ce que ça en vaudra l'effort?,,Megéri az erőfeszítést?,Ne varrà la pena?,苦労に見合った報酬だろうな?,노력할만한 가치가 있나요?,Zal het de moeite waard zijn?,Er det verdt innsatsen?,Czy będzie to warte moich starań?,Será que vale a pena o esforço?,,O să merite efortul?,Оно того стоит?,,Kommer det att vara värt besväret?,Bu çabaya değecek mi? +"I'll guarantee 50 gold and if you return without setting off every alarm in town, there's the chance to earn much, much more, and here's a little helper that should give you an edge.",TXT_DLG_SCRIPT02_D74284_ILLGU,〃,,,"Garantuji ti padesát zlatých a jestliže se vrátíš bez toho, abys spustil každý poplach ve městě, je tu šance vydělat si mnohem, mnohem víc. Tady je malý pomocník, který by ti měl pomoci.","Jeg garanterer dig 50 guld, og hvis du vender tilbage uden at udløse alle alarmer i byen, er der mulighed for at tjene meget, meget mere, og her er en lille hjælper, der burde give dig en fordel.","Ich garantiere dir 50 Gold und wenn du zurückkehrst ohne den Alarm in der Stadt ausgelöst zu haben, dann hast du noch die Chance, viel, viel mehr zu verdienen und hier ist noch ein kleiner Helfer der dir einen Vorteil verschaffen wird.",,"Mi garantias al vi 50 monerojn da oro, kaj se vi revenos ne ekagiginte ĉiun alarmon en la urbo, estas eblo gajni multe, multe pliajn. Kaj jen malgranda helpilo por faciligi vian takson.","Te garantizo 50 de oro, y si vuelves sin activar todas las alarmas del pueblo, existe la posibilidad de ganar mucho, mucho más. Y aquí hay un pequeño ayudante que debería darte una ventaja.",,"Takaan sinulle 50 kultakolikkoa, ja jos palaat ilman, että soitatat jokaista kaupungin hälytyskelloa, voit mahdollisesti tienata paljon paljon enemmän. Tässä vielä pikkuapuri, jonka pitäisi antaa sinulle pienen kilpailuedun.","Je vous garantis 50 pièces et si vous revenez sans déclencher toutes les alarmes de la ville, vous avez la possibilité de gagner bien plus. Voilà une petite avance qui pourra vous aider.",,"50 arany garantáltan a markodat üti, és ha nem indítod be a riasztót a városban, akkor esélyed van többet is kapni, sokkal többet. Itt van egy kis segítség, hogy előnyhöz juss.","Ti garantisco 50 pezzi d'oro e se ritorni qua senza far scattare ogni allarme in città, ci sarà l'opportunità di guadagnare molto, molto di più, ed ecco qua anche un piccolo aggeggio che ti aiuterà.","50ゴールドは保証するし街の警報を鳴らさず 戻ってこれたら、もっと金を得られる機会が あるぞ。それと、お前の力となる物も渡そう。","만약 이 마을의 경보를 울리지 않고 조용히 완수하면 50 골드를 보상으로 주지. 이 외에도 더 많은 보상을 받을 수 있는 일들이 아주 많이 있다네. 그리고 여기, 모험에 도움이 될 만한 무기를 가져가게.","Ik garandeer 50 goud en als je terugkeert zonder elke alarmbel in de stad af te laten gaan, is er de kans om veel, veel meer te verdienen, en hier is een kleine helper die je een voordeel zou moeten geven.","Jeg garanterer 50 gull, og hvis du kommer tilbake uten å utløse alle alarmer i byen, kan du tjene mye, mye mer, og her er en liten hjelper som bør gi deg en fordel.","Gwarantuję 50 monet, a jeśli wrócisz bez włączania wszystkich alarmów w mieście, jest szansa, że mógłbyś dostać więcej. Znacznie więcej. Oto mały pomocnik, który da ci przewagę.","Garanto que você receberá 50 de ouro e se você retornar sem ativar todos os alarmes na cidade haverá uma chance de ganhar muito, muito mais. E aqui tem algo que pode te ajudar um pouco.",,"Garantez 50 de monezi de aur, și dacă nu declanșezi vreo alarmă în oraș, e o șansă de câștig mult, mult mai mare, iar aici e un mic ajutător care să-ți facă treaba mai ușoară.","Я обещаю тебе 50 золотых. И ты сможешь заработать куда больше, если выполнишь задание, не переполошив всю стражу в городе. А чтобы у тебя было некоторое преимущество, вот тебе небольшой помощник. ",,"Jag garanterar 50 guld och om du återvänder utan att utlösa alla larm i staden finns chansen att tjäna mycket, mycket mer, och här är en liten hjälpreda som borde ge dig en fördel.","50 altın garanti ediyorum ve eğer kasabadaki tüm alarmları çalıştırmadan geri dönerseniz, çok daha fazlasını kazanma şansınız var ve işte size avantaj sağlayacak küçük bir yardımcı." -"Thanks, I'll need it.",TXT_RPLY0_SCRIPT02_D74284_THANK,〃,,,"Díky, budu ho potřebovat.","Tak, jeg får brug for den.","Danke, das werde ich brauchen.",,Dankon. Mi bezonos ĝin.,Gracias. Lo necesitaré.,Gracias. Lo voy a necesitar.,"Kiitos, tarvitsen sitä.","Merci, j'en aurais besoin.","Köszönöm, kelleni is fog.","Grazie, ne avrò bisogno.",ありがとよ、これは後々必要になるな。,고마워요. 도움이 될 것 같습니다.,"Bedankt, ik zal het nodig hebben.","Takk, jeg trenger det.",Dzięki. Będę go potrzebował.,"Obrigado, vou precisar.",,"Merci, voi avea nevoie de el.",Спасибо. Он мне пригодится.,,"Tack, jag kommer att behöva den.","Teşekkürler, ihtiyacım olacak." -"Good. Remember, his silence is golden.",TXT_DLG_SCRIPT02_D75800_GOODR,〃,,,"Dobře. Pamatuj, že jeho mlčení má cenu zlata.","Godt. Husk, at hans tavshed er guld.",Gut. Denke dran. Sein Schweigen ist Gold wert.,,Bone. Memoru: lia silento estas el oro.,Bien. Recuerda: su silencio es de oro.,,"Hyvä. Muista, että hänen vaikenemisensa on kultaa.",Bien. Souvenez-vous. Le silence est d'or.,"Remek, a hallgatása arany.","Bene. Ricorda, il suo silenzio è d'oro.",いいぞ。覚えておけ、彼が沈黙したら金だ。,천만에. 그리고 기억하게. 그를 입막음하는 게 유일한 희망일세.,"Goed. Vergeet niet, zijn stilte is goud waard.",Bra. Husk at hans taushet er gull verdt.,"Dobrze. Pamiętaj, jego cisza jest cenna.","Ótimo. Lembre-se, o silêncio dele vale ouro.",,"Bun. Reține, tăcerea e de aur.","Превосходно. Запомни, его молчание — золото.",,Bra. Kom ihåg att hans tystnad är av guld.,"Güzel. Unutma, onun sessizliği altındır." -I'll get him.,TXT_RPLY0_SCRIPT02_D75800_ILLGE,〃,,,Dostanu ho.,Jeg henter ham.,Ich krieg ihn.,,Mi trovos lin.,Lo encontraré.,Lo voy a encontrar.,Saan hänet.,Je m'occupe de lui.,Elintézem.,Lo vado a prendere.,始末してみせる。,그를 잡겠어요.,Ik krijg hem wel.,Jeg skal ta ham.,Dorwę go.,Vou pegá-lo.,,O să-l aduc.,Я прикончу его.,,Jag hämtar honom.,Onu yakalayacağım. -Mission accomplished? You have the ring of the traitor?,TXT_DLG_SCRIPT02_D77316_MISSI,〃,,,Mise splněna? Máš zrádcův prsten?,Mission fuldført? Har du forræderens ring?,Mission ausgeführt? Hast du den Ring des Verräters?,,Ĉu vi finis? Ĉu vi havas la ringon de la perfidulo?,¿Misión cumplida? ¿Tienes el anillo del traidor?,,Tehtävä suoritettu? Sinulla on petturin sormus?,Mission accomplie? Vous avez l'anneau du traître?,Sikeres küldetés? Nálad van az áruló gyűrűje?,Missione compiuta? Hai l'anello del traditore?,"任務完了か? +"Thanks, I'll need it.",TXT_RPLY0_SCRIPT02_D74284_THANK,〃,,,"Díky, budu ho potřebovat.","Tak, jeg får brug for den.","Danke, das werde ich brauchen.",,Dankon. Mi bezonos ĝin.,Gracias. Lo necesitaré.,Gracias. Lo voy a necesitar.,"Kiitos, tarvitsen sitä.","Merci, j'en aurais besoin.",,"Köszönöm, kelleni is fog.","Grazie, ne avrò bisogno.",ありがとよ、これは後々必要になるな。,고마워요. 도움이 될 것 같습니다.,"Bedankt, ik zal het nodig hebben.","Takk, jeg trenger det.",Dzięki. Będę go potrzebował.,"Obrigado, vou precisar.",,"Merci, voi avea nevoie de el.",Спасибо. Он мне пригодится.,,"Tack, jag kommer att behöva den.","Teşekkürler, ihtiyacım olacak." +"Good. Remember, his silence is golden.",TXT_DLG_SCRIPT02_D75800_GOODR,〃,,,"Dobře. Pamatuj, že jeho mlčení má cenu zlata.","Godt. Husk, at hans tavshed er guld.",Gut. Denke dran. Sein Schweigen ist Gold wert.,,Bone. Memoru: lia silento estas el oro.,Bien. Recuerda: su silencio es de oro.,,"Hyvä. Muista, että hänen vaikenemisensa on kultaa.",Bien. Souvenez-vous. Le silence est d'or.,,"Remek, a hallgatása arany.","Bene. Ricorda, il suo silenzio è d'oro.",いいぞ。覚えておけ、彼が沈黙したら金だ。,천만에. 그리고 기억하게. 그를 입막음하는 게 유일한 희망일세.,"Goed. Vergeet niet, zijn stilte is goud waard.",Bra. Husk at hans taushet er gull verdt.,"Dobrze. Pamiętaj, jego cisza jest cenna.","Ótimo. Lembre-se, o silêncio dele vale ouro.",,"Bun. Reține, tăcerea e de aur.","Превосходно. Запомни, его молчание — золото.",,Bra. Kom ihåg att hans tystnad är av guld.,"Güzel. Unutma, onun sessizliği altındır." +I'll get him.,TXT_RPLY0_SCRIPT02_D75800_ILLGE,〃,,,Dostanu ho.,Jeg henter ham.,Ich krieg ihn.,,Mi trovos lin.,Lo encontraré.,Lo voy a encontrar.,Saan hänet.,Je m'occupe de lui.,,Elintézem.,Lo vado a prendere.,始末してみせる。,그를 잡겠어요.,Ik krijg hem wel.,Jeg skal ta ham.,Dorwę go.,Vou pegá-lo.,,O să-l aduc.,Я прикончу его.,,Jag hämtar honom.,Onu yakalayacağım. +Mission accomplished? You have the ring of the traitor?,TXT_DLG_SCRIPT02_D77316_MISSI,〃,,,Mise splněna? Máš zrádcův prsten?,Mission fuldført? Har du forræderens ring?,Mission ausgeführt? Hast du den Ring des Verräters?,,Ĉu vi finis? Ĉu vi havas la ringon de la perfidulo?,¿Misión cumplida? ¿Tienes el anillo del traidor?,,Tehtävä suoritettu? Sinulla on petturin sormus?,Mission accomplie? Vous avez l'anneau du traître?,,Sikeres küldetés? Nálad van az áruló gyűrűje?,Missione compiuta? Hai l'anello del traditore?,"任務完了か? あの裏切り者の指輪は持っているんだろうな?",임무를 완수 한 건가? 배신자의 반지를 가지고 있어?,Missie volbracht? Heb je de ring van de verrader?,Oppdrag utført? Har du forræderens ring?,Misja ukończona? Masz pierścień zdrajcy?,Missão cumprida? Está com o anel do traidor?,,Misiune îndeplinită? Ai inelul trădătorului?,Задание выполнено? Ты принёс кольцо предателя?,,Uppdraget slutfört? Har du förrädarens ring?,Görev tamamlandı mı? Hainin yüzüğü sende mi? -"He's dead, where's my money?",TXT_RPLY0_SCRIPT02_D77316_HESDE,〃,,,"Je mrtvý, kde jsou moje peníze?","Han er død, hvor er mine penge?","Er ist tot, wo ist mein Geld?",,Mi mortigis lin. Kie estas mia mono?,Ya está muerto. ¿Y mi dinero?,,"Hän on kuollut, missä on rahani?","Il est mort, où est mon argent?","Meghalt, hol a pénzem?","Lui è morto, dove sono i miei soldi?",奴は死んだ、報酬はあるんだろうな?,"그는 죽었습니다, 제 보상은요?","Hij is dood, waar is mijn geld?","Han er død, hvor er pengene mine?",Jest martwy. Gdzie moje pieniądze?,"Ele está morto, cadê o meu dinheiro?",,"E mort, unde sunt banii?",Он мёртв. Где мои деньги?,,"Han är död, var är mina pengar?","O öldü, param nerede?" +"He's dead, where's my money?",TXT_RPLY0_SCRIPT02_D77316_HESDE,〃,,,"Je mrtvý, kde jsou moje peníze?","Han er død, hvor er mine penge?","Er ist tot, wo ist mein Geld?",,Mi mortigis lin. Kie estas mia mono?,Ya está muerto. ¿Y mi dinero?,,"Hän on kuollut, missä on rahani?","Il est mort, où est mon argent?",,"Meghalt, hol a pénzem?","Lui è morto, dove sono i miei soldi?",奴は死んだ、報酬はあるんだろうな?,"그는 죽었습니다, 제 보상은요?","Hij is dood, waar is mijn geld?","Han er død, hvor er pengene mine?",Jest martwy. Gdzie moje pieniądze?,"Ele está morto, cadê o meu dinheiro?",,"E mort, unde sunt banii?",Он мёртв. Где мои деньги?,,"Han är död, var är mina pengar?","O öldü, param nerede?" Liar! Go get the ring!,TXT_RNO0_SCRIPT02_D77316_LIARG,〃,,,Lháři! Jdi pro jeho prsten!,Løgner! Hent ringen!,Lügner! Hol' den Ring!,,"Ne mensongu! Forprenu lian ringon!","¡Mentiroso! ¡Ve a por el anillo!","¡Mentiroso! -¡Ve por el anillo!",Valehtelija! Mene hakemaan sormus!,Mensonges! Ramenez-moi l'anneau!,Hazug! Menj és szerezd meg a gyűrűt!,Bugiardo! Vai a prendere l'anello!,嘘をつくな、指輪を取ってこい!,거짓말쟁이! 가서 반지를 가져오게!,Leugenaar! Ga de ring halen!,Løgner! Hent ringen!,Kłamca! Idź po pierścień!,Mentiroso! Vá pegar o anel!,,Mincinos! Adu inelul!,Лжец! Принеси мне кольцо!,,Lögnare! Hämta ringen!,Yalancı! Git yüzüğü al! -"Here, you earned it. The traitor you killed was about to reveal the location of the Front. You saved lives. How would you like to earn more gold, and a future free from tyranny?",TXT_DLG_SCRIPT02_D78832_HEREY,〃,,,"Tady máš, zasloužil sis je. Zrádce, kterého jsi zabil, by vyzradil lokaci Fronty. Zachránil jsi životy. Jak by se ti líbilo vydělat si víc zlata spolu s budoucností bez tyranie?","Her, du har fortjent det. Den forræder, du dræbte, var ved at afsløre frontens placering. Du reddede liv. Hvad ville du sige til at tjene mere guld og en fremtid uden tyranni?","Hier, das hast du dir verdient. Der Verräter den du getötet hast war dabei über die Position der Front auszupacken. Du hast Leben gerettet. Wie würde es dir gefallen noch mehr Gold zu verdienen und eine tyrannenfreie Zukunft zu haben?",,"Jen ĝi, vi gajnis ĝin. La perfidulo, kiun vi mortigis, estis malkaŝonta la pozicion de la Fronto. Vi savis vivojn. Ĉu vi ŝatus gajni plian oron kaj estontecon liberan de tiranio?","Toma, te lo ganaste. El traidor que has matado estaba a punto de revelar la ubicación del Frente. Has salvado vidas. ¿Te gustaría ganar más oro y un futuro libre de tiranía?","Toma, te lo ganaste. El traidor que mataste estaba a punto de revelar la ubicación del Frente. Salvaste vidas. ¿Te gustaría ganar más oro y un futuro libre de tiranía?","Tässä, olet sen ansainnut. Tappamasi petturi oli lähellä paljastaa Rintaman sijainnin. Pelastit henkiä. Haluaisitko tienata lisää kultaa, ja tyranniasta vapaan tulevaisuuden?","Voilà, vous l'avez bien mérité. Ce traître que vous avez tué allait révéler la base du Front. Vous avez sauvé de nombreuses vies. Est-ce que ça vous intéresserait de vous faire plus d'argent et garantir un futur libre de la tyrannie?","Tessék, megérdemelted. Az áruló akit eltettél láb alól közel járt ahhoz, hogy felfedje a Front bázisát. Életeket mentettél. Mit szólnál ahhoz, ha még több arany is ütné a mancsod, és még egy zsarnok mentes jövőd is lenne?","Ecco qua, te li sei guadagnati. Il traditore che hai ucciso stava per rivelare il nascondiglio del Fronte. Hai salvato molte vite. Che ne diresti di guadagnare altro oro, e un futuro libero dalla tirannia?","よし、報酬はお前のものだ。お前が殺した +¡Ve por el anillo!",Valehtelija! Mene hakemaan sormus!,Mensonges! Ramenez-moi l'anneau!,,Hazug! Menj és szerezd meg a gyűrűt!,Bugiardo! Vai a prendere l'anello!,嘘をつくな、指輪を取ってこい!,거짓말쟁이! 가서 반지를 가져오게!,Leugenaar! Ga de ring halen!,Løgner! Hent ringen!,Kłamca! Idź po pierścień!,Mentiroso! Vá pegar o anel!,,Mincinos! Adu inelul!,Лжец! Принеси мне кольцо!,,Lögnare! Hämta ringen!,Yalancı! Git yüzüğü al! +"Here, you earned it. The traitor you killed was about to reveal the location of the Front. You saved lives. How would you like to earn more gold, and a future free from tyranny?",TXT_DLG_SCRIPT02_D78832_HEREY,〃,,,"Tady máš, zasloužil sis je. Zrádce, kterého jsi zabil, by vyzradil lokaci Fronty. Zachránil jsi životy. Jak by se ti líbilo vydělat si víc zlata spolu s budoucností bez tyranie?","Her, du har fortjent det. Den forræder, du dræbte, var ved at afsløre frontens placering. Du reddede liv. Hvad ville du sige til at tjene mere guld og en fremtid uden tyranni?","Hier, das hast du dir verdient. Der Verräter den du getötet hast war dabei über die Position der Front auszupacken. Du hast Leben gerettet. Wie würde es dir gefallen noch mehr Gold zu verdienen und eine tyrannenfreie Zukunft zu haben?",,"Jen ĝi, vi gajnis ĝin. La perfidulo, kiun vi mortigis, estis malkaŝonta la pozicion de la Fronto. Vi savis vivojn. Ĉu vi ŝatus gajni plian oron kaj estontecon liberan de tiranio?","Toma, te lo ganaste. El traidor que has matado estaba a punto de revelar la ubicación del Frente. Has salvado vidas. ¿Te gustaría ganar más oro y un futuro libre de tiranía?","Toma, te lo ganaste. El traidor que mataste estaba a punto de revelar la ubicación del Frente. Salvaste vidas. ¿Te gustaría ganar más oro y un futuro libre de tiranía?","Tässä, olet sen ansainnut. Tappamasi petturi oli lähellä paljastaa Rintaman sijainnin. Pelastit henkiä. Haluaisitko tienata lisää kultaa, ja tyranniasta vapaan tulevaisuuden?","Voilà, vous l'avez bien mérité. Ce traître que vous avez tué allait révéler la base du Front. Vous avez sauvé de nombreuses vies. Est-ce que ça vous intéresserait de vous faire plus d'argent et garantir un futur libre de la tyrannie?",,"Tessék, megérdemelted. Az áruló akit eltettél láb alól közel járt ahhoz, hogy felfedje a Front bázisát. Életeket mentettél. Mit szólnál ahhoz, ha még több arany is ütné a mancsod, és még egy zsarnok mentes jövőd is lenne?","Ecco qua, te li sei guadagnati. Il traditore che hai ucciso stava per rivelare il nascondiglio del Fronte. Hai salvato molte vite. Che ne diresti di guadagnare altro oro, e un futuro libero dalla tirannia?","よし、報酬はお前のものだ。お前が殺した あの裏切り者は、フロントの隠れ家をバラそうと していたんだ。おかげで大勢の命が救われた。 もっと多くの金と、奴等の支配から解放された 未来を得たいとは思わないか?",여기 보상일세. 그는 프론트의 비밀장소를 알리려던 참이었네. 자네가 우리들의 목숨을 구했어. 폭정을 타도해서 이처럼 더 많은 보상을 얻을 준비가 되어있나?,"Hier heb je het verdiend. De verrader die je vermoordde stond op het punt om de locatie van het Front te onthullen. Je hebt levens gered. Hoe zou je het vinden om meer goud te verdienen, en een toekomst vrij van tirannie?","Her, du har fortjent den. Forræderen du drepte var i ferd med å avsløre hvor Fronten er. Du reddet liv. Hva sier du til å tjene mer gull og en fremtid uten tyranni?","Masz, zasłużyłeś sobie. Zdrajca, którego zabiłeś zamierzał ujawnić gdzie znajduje się baza Frontu. Uratowałeś wiele żyć. Chcesz zarobić więcej pieniędzy i mieć przyszłość wolną od tyranii?","Tome, você merece. O traidor que você matou estava prestes a revelar a localização da Frente. Você salvou vidas. Que tal ganhar mais ouro e um futuro livre de tirania?",,"Aici, o meriți. Trădătorul pe care l-ai omorât urma să dezvăluie locația Frontului. Ai salvat vieți. Cum ai vrea să câștigi mai mult aur, și un viitor fără tiranie?","Вот, ты их заслужил. Убитый тобой предатель мог выдать Ордену местоположение базы Сопротивления. Ты спас много жизней. Тебе бы не хотелось ещё золота и будущего, свободного от тирании?",,"Här, du har förtjänat den. Förrädaren du dödade skulle avslöja var fronten finns. Du räddade liv. Hur skulle du vilja tjäna mer guld och en framtid fri från tyranni?","İşte, onu hak ettin. Öldürdüğün hain Cephe'nin yerini açıklamak üzereydi. Hayat kurtardın. Daha fazla altın ve zorbalıktan uzak bir gelecek kazanmaya ne dersin?" -Tell me more.,TXT_RPLY0_SCRIPT02_D78832_TELLM,〃,,,Řekni mi víc.,Fortæl mig mere.,Erzähl mir mehr.,,Mi aŭskultas vin.,Dime más.,,Kerro lisää.,Dites-moi en plus.,Mesélj még.,Dimmi di più.,もっと教えてくれ。,더 말해주시오.,Vertel me meer.,Fortell meg mer.,Mów dalej.,Me conte mais.,,Spune-mi mai multe.,Расскажи мне больше.,,Berätta mer.,Biraz daha anlat. -Not my style.,TXT_RPLY1_SCRIPT02_D78832_NOTMY,〃,,,To není můj styl.,Ikke min stil.,Nicht mein Stil.,,Tio ne estas mia stilo.,No es mi estilo.,,Ei kuulu tyyliini.,Pas mon genre.,Nem az Én stílusom.,Non fa per me.,俺の趣味じゃないな。,내 취향은 아닌데.,Niet mijn stijl.,Ikke min stil.,To nie w moim stylu.,Não faz o meu estilo.,,Nu-i genul meu.,Не в моём вкусе.,,Inte min stil.,Benim tarzım değil. -"I have a business relationship with the Front's leader, Macil. I know he needs an incisive fellow like yourself, and he pays well. Take this recovered com unit and you'll be led to, shall we say, opportunities.",TXT_DLG_SCRIPT02_D80348_IHAVE,〃,,,"Mám obchodní vztah s vůdcem Fronty, Macilem. Vím, že potřebuje schopného člověka jako ty a dobře platí. Vem si tenhle spravený komunikátor; zavede tě k, řekněme, příležitostem.","Jeg har et forretningsmæssigt forhold til frontens leder, Macil. Jeg ved, han har brug for en skarp fyr som dig, og han betaler godt. Tag denne genvundne com-enhed, og du vil blive ført til, skal vi sige, muligheder.","Ich habe Geschäftsbeziehungen mit dem Anführer der Front, Macil. Er braucht einen pfiffigen Typen wie dich und er bezahlt gut. Nimm dieses erbeutete Kommunikationsgerät und es wird dich zu, sagen wir mal, Möglichkeiten führen.",,"Mi havas negoco-ligon kun Macil la frontestro. Mi scias, ke li bezonas lertan kunulon kiel vi, aldone al tio, ke li pagas bone. Prenu ĉi tiun rekuperitan interfonon kaj vi havos la vojon al... ni diru, ŝancoj.","Tengo una relación de negocios con Macil el líder del Frente. Sé que necesita un compañero hábil como tú, además de que paga bien. Toma este intercomunicador recuperado para que te guíe a... digamos, oportunidades.",,"Minulla on liikesuhteita Rintaman johtaja Maciliin. Tiedän hänen tarvitsevan kaltaistasi terävää kaveria, ja hän maksaa hyvin. Ota tämä talteenkerätty viestintälaite, ja tiesi johtaa, sanottaisiinko, mahdollisuuksien äärelle.","J'ai une relation d'affaires avec le leader du Front, Macil. Je sais qu'il a besoin de quelqu'un d'incisif comme vous, et il paye bien. Prenez ce communicateur avec vous, et vous serez mené à des.. on va dire des opportunités.","Van egy üzleti megállapodásom Macil-lal, a Front vezetőjével. pont egy ilyen belevaló embert keres mint te, és kiváló fizetést is adna. Használd ezt a kommunikációs egységet és - mondjuk úgy - odavezet a lehetőségekhez.","Ho dei rapporti d'affari col capo del Fronte, Macil. So che è alla ricerca di una persona diretta e precisa come te, e lui paga molto bene. Tieni questa unità di comunicazione che abbiamo recuperato, e sarai condotto verso, come dire, nuove opportunità.","私はフロントのリーダー、マシルと取引を +Tell me more.,TXT_RPLY0_SCRIPT02_D78832_TELLM,〃,,,Řekni mi víc.,Fortæl mig mere.,Erzähl mir mehr.,,Mi aŭskultas vin.,Dime más.,,Kerro lisää.,Dites-moi en plus.,,Mesélj még.,Dimmi di più.,もっと教えてくれ。,더 말해주시오.,Vertel me meer.,Fortell meg mer.,Mów dalej.,Me conte mais.,,Spune-mi mai multe.,Расскажи мне больше.,,Berätta mer.,Biraz daha anlat. +Not my style.,TXT_RPLY1_SCRIPT02_D78832_NOTMY,〃,,,To není můj styl.,Ikke min stil.,Nicht mein Stil.,,Tio ne estas mia stilo.,No es mi estilo.,,Ei kuulu tyyliini.,Pas mon genre.,,Nem az Én stílusom.,Non fa per me.,俺の趣味じゃないな。,내 취향은 아닌데.,Niet mijn stijl.,Ikke min stil.,To nie w moim stylu.,Não faz o meu estilo.,,Nu-i genul meu.,Не в моём вкусе.,,Inte min stil.,Benim tarzım değil. +"I have a business relationship with the Front's leader, Macil. I know he needs an incisive fellow like yourself, and he pays well. Take this recovered com unit and you'll be led to, shall we say, opportunities.",TXT_DLG_SCRIPT02_D80348_IHAVE,〃,,,"Mám obchodní vztah s vůdcem Fronty, Macilem. Vím, že potřebuje schopného člověka jako ty a dobře platí. Vem si tenhle spravený komunikátor; zavede tě k, řekněme, příležitostem.","Jeg har et forretningsmæssigt forhold til frontens leder, Macil. Jeg ved, han har brug for en skarp fyr som dig, og han betaler godt. Tag denne genvundne com-enhed, og du vil blive ført til, skal vi sige, muligheder.","Ich habe Geschäftsbeziehungen mit dem Anführer der Front, Macil. Er braucht einen pfiffigen Typen wie dich und er bezahlt gut. Nimm dieses erbeutete Kommunikationsgerät und es wird dich zu, sagen wir mal, Möglichkeiten führen.",,"Mi havas negoco-ligon kun Macil la frontestro. Mi scias, ke li bezonas lertan kunulon kiel vi, aldone al tio, ke li pagas bone. Prenu ĉi tiun rekuperitan interfonon kaj vi havos la vojon al... ni diru, ŝancoj.","Tengo una relación de negocios con Macil el líder del Frente. Sé que necesita un compañero hábil como tú, además de que paga bien. Toma este intercomunicador recuperado para que te guíe a... digamos, oportunidades.",,"Minulla on liikesuhteita Rintaman johtaja Maciliin. Tiedän hänen tarvitsevan kaltaistasi terävää kaveria, ja hän maksaa hyvin. Ota tämä talteenkerätty viestintälaite, ja tiesi johtaa, sanottaisiinko, mahdollisuuksien äärelle.","J'ai une relation d'affaires avec le leader du Front, Macil. Je sais qu'il a besoin de quelqu'un d'incisif comme vous, et il paye bien. Prenez ce communicateur avec vous, et vous serez mené à des.. on va dire des opportunités.",,"Van egy üzleti megállapodásom Macil-lal, a Front vezetőjével. pont egy ilyen belevaló embert keres mint te, és kiváló fizetést is adna. Használd ezt a kommunikációs egységet és - mondjuk úgy - odavezet a lehetőségekhez.","Ho dei rapporti d'affari col capo del Fronte, Macil. So che è alla ricerca di una persona diretta e precisa come te, e lui paga molto bene. Tieni questa unità di comunicazione che abbiamo recuperato, e sarai condotto verso, come dire, nuove opportunità.","私はフロントのリーダー、マシルと取引を しているんだ。彼は君のような切れる人物を 必要としていて、金払いも良い。 この修理された無線機を持っていけば、 好機に出会えるだろう。","나는 프론트의 사령관, 마실과 깊은 관계를 가지고 있다네. 그리고 그는 자네를 비롯한 예리한 사람들을 원하고 말이지. 그리고 보상도 아주 잘 준다네. 이 수리된 통신기를 받고 이동하게나. 그럼 희망은 물론 기회가 아주 많아질 거야.","Ik heb een zakelijke relatie met de leider van het Front, Macil. Ik weet dat hij een scherpzinnige kerel als jij nodig heeft, en hij betaalt goed. Neem deze herstelde com-unit en u zult worden geleid tot, laten we zeggen, kansen.","Jeg har et forretningsforhold til Frontens leder, Macil. Jeg vet at han trenger en skarp fyr som deg, og han betaler godt. Ta denne gjenfunne kommunikasjonsenheten og du vil bli ledet til, skal vi si, muligheter.","Mam relacje biznesowe z dowódcą Frontu, Macilem. Wiem, że potrzebuje on kogoś z takim zapałem jak ty, i dobrze płaci. Weź ten komunikator, a poprowadzi cię do, powiedzmy, pewnych korzyści.","Tenho uma relação de negócios com o líder da Frente, Macil. Eu sei que ele anda precisando de um sujeito incisivo como você e ele paga bem. Leve este comunicador e você será conduzido para, digamos, oportunidades.",,"Fac afaceri cu liderul Frontului, Macil. Știu că are nevoie de băieți deștepți ca tine, și plătește bine. Ia acest emițător recuperat și vei fi dus, să zicem, spre oportunități.","Я веду дела c лидером повстанцев, Мэйсилом. Я знаю, что ему нужны толковые парни вроде тебя, и он неплохо платит. Возьми этот передатчик, и перед тобой откроются, скажем так, новые перспективы.",,"Jag har en affärsrelation med frontens ledare, Macil. Jag vet att han behöver en skarpsinnig kille som du, och han betalar bra. Ta den här återvunna kom-enheten och du kommer att ledas till, ska vi säga, möjligheter.","Cephe'nin lideri Macil ile bir iş ilişkim var. Senin gibi keskin zekalı bir adama ihtiyacı olduğunu biliyorum ve iyi para ödüyor. Bu kurtarılmış iletişim birimini alın ve size, diyelim ki, fırsatlar sunulacak." -Thanks.,TXT_RPLY0_SCRIPT02_D80348_THANK,〃,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Kösz.,Grazie.,ありがとう。,알겠어요.,Bedankt.,Takk skal du ha.,Dzięki.,Obrigado.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkürler. -"Get going. If you hang around here, we're both dead.",TXT_DLG_SCRIPT02_D81864_GETGO,〃,,,"Měl bys jít. Jestli se tu budeš potloukat, jsme mrtví oba.","Kom i gang. Hvis du bliver hængende her, er vi begge døde.","Beweg dich. Wenn wir beide hier rumhängen, dann sind wir beide tot.",,"Ekmovu vin. Se vi restos ĉi tie, ni ambaŭ mortos.","Ponte en marcha. Si te quedas por aquí, los dos estamos muertos.",,"Jatka matkaasi. Jos viivyttelet täällä, kuolemme molemmat.","Partez maintenant, si vous traînez ici, nous serons morts tous les deux.","Mozgás! Ha sokáig lébucolsz itt, mindkettőnket megölnek.","Ti conviene andartene. Se bazzichi troppo qua, siamo entrambi morti.","うまくやれよ。こんな所でもたもたしていると +Thanks.,TXT_RPLY0_SCRIPT02_D80348_THANK,〃,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Kösz.,Grazie.,ありがとう。,알겠어요.,Bedankt.,Takk skal du ha.,Dzięki.,Obrigado.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkürler. +"Get going. If you hang around here, we're both dead.",TXT_DLG_SCRIPT02_D81864_GETGO,〃,,,"Měl bys jít. Jestli se tu budeš potloukat, jsme mrtví oba.","Kom i gang. Hvis du bliver hængende her, er vi begge døde.","Beweg dich. Wenn wir beide hier rumhängen, dann sind wir beide tot.",,"Ekmovu vin. Se vi restos ĉi tie, ni ambaŭ mortos.","Ponte en marcha. Si te quedas por aquí, los dos estamos muertos.",,"Jatka matkaasi. Jos viivyttelet täällä, kuolemme molemmat.","Partez maintenant, si vous traînez ici, nous serons morts tous les deux.",,"Mozgás! Ha sokáig lébucolsz itt, mindkettőnket megölnek.","Ti conviene andartene. Se bazzichi troppo qua, siamo entrambi morti.","うまくやれよ。こんな所でもたもたしていると 二人揃ってお陀仏だ。","어서 가게. 여기에 계속 있으면, 우리 둘 다 죽는다네.","Ga aan de slag. Als je hier rondhangt, zijn we allebei dood.","Sett i gang. Hvis du blir her, er vi begge døde.",Rusz się. Jak będziesz się tu kręcił to obaj będziemy martwi.,"Ande logo. Se você ficar por aqui, nós dois seremos mortos.",,"Timpul să pleci. Dacă mai stai pe-aici, o să fim amândoi morți.","Двигай. Если продолжишь тут ошиваться, нас обоих убьют.",,Sätt igång. Om du stannar här är vi båda döda.,"Gidin hadi. Eğer burada takılırsan, ikimiz de ölürüz." -"A pity, but now that you know about my friends, I must kill you. Guards, take out this trash!",TXT_DLG_SCRIPT02_D83380_APITY,〃,,,"Škoda. Teď, když víš o mých známých, tě ale musím zabít. Stráže, zbavte mě tohohle smetí!","En skam, men nu hvor du kender til mine venner, må jeg slå dig ihjel. Vagter, tag det affald ud!","Ein Jammer, aber nun, da du über meine Freunde Bescheid weißt, muss ich dich umbringen. Wachen? Entsorgt ihn!",,"Nun kiam vi scias pri miaj amikoj, mi bedaŭrinde devas mortigi vin. Gardistoj, forprenu ĉi tiun rubon!","Una lástima, pero ahora que sabes de mis amigos, no me queda de otra que matarte. ¡Guardias, a sacar la basura!","Una pena, pero ahora que sabes de mis amigos, no me queda de otra que matarte. ¡Guardias, a sacar la basura!","Sääli, mutta nyt, kun tiedät ystävistäni, minun on tapettava sinut. Vartijat, heittäkää tämä roska ulos!","Dommage. Mais maintenant que vous savez qui sont mes amis, je dois me débarasser de vous. Garde, débarassez moi de mes ordures!","Kár érted, de sajnos miután kiderítetted a barátaim kilétét, meg kell hogy halj. Őrök, vigyétek ki ezt a szemetet!","Un vero peccato, ma ora che sai dei miei amici, non posso certo lasciarti vivo. Guardie, buttate via questa spazzatura!","残念だ、だがお前は私の友の事を知った以上 +"A pity, but now that you know about my friends, I must kill you. Guards, take out this trash!",TXT_DLG_SCRIPT02_D83380_APITY,〃,,,"Škoda. Teď, když víš o mých známých, tě ale musím zabít. Stráže, zbavte mě tohohle smetí!","En skam, men nu hvor du kender til mine venner, må jeg slå dig ihjel. Vagter, tag det affald ud!","Ein Jammer, aber nun, da du über meine Freunde Bescheid weißt, muss ich dich umbringen. Wachen? Entsorgt ihn!",,"Nun kiam vi scias pri miaj amikoj, mi bedaŭrinde devas mortigi vin. Gardistoj, forprenu ĉi tiun rubon!","Una lástima, pero ahora que sabes de mis amigos, no me queda de otra que matarte. ¡Guardias, a sacar la basura!","Una pena, pero ahora que sabes de mis amigos, no me queda de otra que matarte. ¡Guardias, a sacar la basura!","Sääli, mutta nyt, kun tiedät ystävistäni, minun on tapettava sinut. Vartijat, heittäkää tämä roska ulos!","Dommage. Mais maintenant que vous savez qui sont mes amis, je dois me débarasser de vous. Garde, débarassez moi de mes ordures!",,"Kár érted, de sajnos miután kiderítetted a barátaim kilétét, meg kell hogy halj. Őrök, vigyétek ki ezt a szemetet!","Un vero peccato, ma ora che sai dei miei amici, non posso certo lasciarti vivo. Guardie, buttate via questa spazzatura!","残念だ、だがお前は私の友の事を知った以上 生きて帰す事はできない。 衛兵、このゴミを片付けてくれ!","유감이군. 내 친구들을 이제 알고 있으니, 어쩔 수 없이 죽어줘야겠군. 경비병! 이 인간을 체포하라!","Jammer, maar nu je van mijn vrienden weet, moet ik je vermoorden. Bewakers, haal dit vuilnis eruit!","Synd, men nå som du vet om vennene mine, må jeg drepe deg. Vakter, ta ut dette søppelet!","Szkoda, ale skoro wiesz coś o moich przyjaciołach, muszę cię zabić. Straż, wyrzućcie tego śmiecia!","É uma pena, mas agora que você sabe sobre os meus amigos, preciso matar você. Guardas, levem esse lixo daqui!",,"Păcat, dar acum că-mi cunoști prietenii, voi fi nevoit să te omor. Gardieni, duceți gunoiul!","Жаль, но раз уж ты узнал о моих друзьях, мне придётся тебя убить. Стража, уберите его!",,"Synd, men nu när du vet om mina vänner måste jag döda dig. Vakter, ta ut det här skräpet!","Yazık, ama artık arkadaşlarımı bildiğine göre, seni öldürmeliyim. Muhafızlar, şu çöpü dışarı çıkarın!" -Fool. Guards! Rid me of meddlesome peon.,TXT_DLG_SCRIPT02_D84896_FOOLG,〃,,,"Blázne! Stráže, zbavte se tohohle zbytečného nuzáka.",Fjols. Vagter! Fjern den besværlige bondeknold fra mig.,Du Narr! Wachen! Entledigt mich von diesem lästigen Tagelöhner.,,"Stultulo! Gardistoj, liberigu min de ĉi tiu entrudiĝema peono.","¡Insensato! Guardias, libérenme de este entrometido peón.","¡Idiota! Guardias, libérenme de este entrometido peón.",Järjetöntä. Vartijat! Hankkiutukaa eroon tästä tungettelevasta moukasta.,"Idiot! Gardes, débarassez-moi de ce pion embêtant!","Barom! Őrök, takarítsátok el a színem elől ezt a kotnyeleskedő pondrót!","Sciocco! Guardie, liberatemi da questo ficcanaso.","愚かな。 +Fool. Guards! Rid me of meddlesome peon.,TXT_DLG_SCRIPT02_D84896_FOOLG,〃,,,"Blázne! Stráže, zbavte se tohohle zbytečného nuzáka.",Fjols. Vagter! Fjern den besværlige bondeknold fra mig.,Du Narr! Wachen! Entledigt mich von diesem lästigen Tagelöhner.,,"Stultulo! Gardistoj, liberigu min de ĉi tiu entrudiĝema peono.","¡Insensato! Guardias, libérenme de este entrometido peón.","¡Idiota! Guardias, libérenme de este entrometido peón.",Järjetöntä. Vartijat! Hankkiutukaa eroon tästä tungettelevasta moukasta.,"Idiot! Gardes, débarassez-moi de ce pion embêtant!",,"Barom! Őrök, takarítsátok el a színem elől ezt a kotnyeleskedő pondrót!","Sciocco! Guardie, liberatemi da questo ficcanaso.","愚かな。 衛兵!この厄介な奴を始末してくれ。","한심한 놈! 경비병, 이 소동피우는 불량배를 잡아라.",Dwaas. Bewakers! Verloste me van bemoeizuchtige pioen.,Idiot. Vakter! Kvitt meg med den innpåslitne bondetampen.,Głupcze! Straż! Uwolnijcie mnie od tego wścibskiego robola.,"Idiota! Guardas, tirem esse peão intrometido daqui.",,"Prostule! Gardieni, scăpați-mă de acest pion băgăreț.","Глупец! Стража, избавьте меня от этого недоумка.",,Dumbom. Vakter! Befria mig från den besvärliga pingsten.,Aptal. Muhafızlar! Beni işgüzar piyondan kurtarın. -"Walk away, boy, just walk away.",TXT_DLG_SCRIPT02_D86412_WALKA,Geoff.,,,"Jdi pryč, chlapče, prostě odejdi.","Gå væk, dreng, bare gå væk.","Geh weg Jungchen, geh einfach weg.",,"Foriru, ulo. Vi nur foriru.","Vete, chaval. Solo vete.","Vete, muchacho. Solo vete.","Kävele pois vain, poju, kävele pois.","Pars, gamin, pars.","Csak sétálj el innen, sétálj el szépen.","Muoviti, ragazzo, muoviti...",どっか行け、若造、とっとと行け。,"지나가라고 친구, 그냥 지나가.","Loop weg, jongen, loop gewoon weg.","Gå vekk, gutt, bare gå vekk.","Odejdź stąd mały, po prostu odejdź.","Suma daqui, garoto. Apenas suma daqui.",,"Pleacă, băiete, pleacă.","Иди своей дорогой, парень, иди.",,"Gå iväg, pojke, bara gå iväg.","Yürü git evlat, yürü git." -What are you doing here?,TXT_DLG_SCRIPT02_D87928_WHATA,〃,,,Co ty tu děláš?,Hvad laver du her?,Was machst du hier?,,Kion vi volas ĉi tie?,¿Qué es lo que quieres?,,Mitäs sinä täällä teet?,Qu'est-ce que vous foutez ici?,Mit művelsz itt?,Che cosa fai qua?,ここで何をしている?,여기서 뭘 하는거야?,Wat doe jij hier?,Hva gjør du her?,Co ty tu robisz?,O que você está fazendo aqui?,,Ce cauți aici?,Что ты тут делаешь?,,Vad gör du här?,Ne yapıyorsun burada? -"Hey, I need gold!",TXT_RPLY0_SCRIPT02_D87928_HEYIN,〃,,,"Hej, potřeboval bych zlato!","Hey, jeg har brug for guld!","Hey, ich brauche Gold!",,"Saluton, mi bezonas oron!","¡Buenas, necesito oro!",,"Hei, tarvitsen kultaa!","Hé, j'ai besoin de sous!","Héj, nekem arany kell!","Ehi, mi serve dell'oro!",よう、金が必要だ!,"이봐, 난 골드가 필요해!","Hé, ik heb goud nodig!",Jeg trenger gull!,"Hej, potrzebuję złota!","Ei, eu preciso de ouro!",,"Hei, am nevoie de aur!","Эй, мне нужно золото!",,Jag behöver guld!,"Hey, altına ihtiyacım var!" -"Blackbird told you the code, huh? Let me shut off the alarm. Macil is one flight down.",TXT_DLG_SCRIPT02_D89444_BLACK,〃,,,"Straka ti řekla heslo, co? Jen vypnu alarmy. Macil je o podlaží níž.","Blackbird fortalte dig koden, hva'? Lad mig slukke for alarmen. Macil er en etage længere nede.","Blackbird hat dir den Code gegeben, wie? Lass mich mal eben den Alarm abschalten. Macil ist eine Etage tiefer.",,"Merlo diris la pasfrazon al vi, ĉu? Tiuokaze mi sensonigos la alarmon. Macil estas malsupre.","Conque Blackbird te ha dado la clave, ¿eh? Ya apago la alarma, entonces. Macil está bajando las escaleras.","Así que Blackbird te dio la clave, ¿eh? Ya apago la alarma, entonces. Macil está bajando las escaleras.","Vai että Blackbird kertoi sinulle koodin? Anna, kun kytken hälyttimen pois päältä. Macil on yhdet rappuset alas.","Blackbird t'as donné le code, hein? Bon, laisse moi désactiver l'alarme. Macil est en bas des escaliers.","Feketerigó mondta el a kódot, mi? Hadd kapcosljam ki a riasztót. macil egy kőhajintásra van innen.","Blackbird ti ha detto qual'è il codice, eh? Fammi disattivare l'allarme. Macil è oltre le scale.","ブラックバードに教えてもらったんだな? +"Walk away, boy, just walk away.",TXT_DLG_SCRIPT02_D86412_WALKA,Geoff.,,,"Jdi pryč, chlapče, prostě odejdi.","Gå væk, dreng, bare gå væk.","Geh weg Jungchen, geh einfach weg.",,"Foriru, ulo. Vi nur foriru.","Vete, chaval. Solo vete.","Vete, muchacho. Solo vete.","Kävele pois vain, poju, kävele pois.","Pars, gamin, pars.",,"Csak sétálj el innen, sétálj el szépen.","Muoviti, ragazzo, muoviti...",どっか行け、若造、とっとと行け。,"지나가라고 친구, 그냥 지나가.","Loop weg, jongen, loop gewoon weg.","Gå vekk, gutt, bare gå vekk.","Odejdź stąd mały, po prostu odejdź.","Suma daqui, garoto. Apenas suma daqui.",,"Pleacă, băiete, pleacă.","Иди своей дорогой, парень, иди.",,"Gå iväg, pojke, bara gå iväg.","Yürü git evlat, yürü git." +What are you doing here?,TXT_DLG_SCRIPT02_D87928_WHATA,〃,,,Co ty tu děláš?,Hvad laver du her?,Was machst du hier?,,Kion vi volas ĉi tie?,¿Qué es lo que quieres?,,Mitäs sinä täällä teet?,Qu'est-ce que vous foutez ici?,,Mit művelsz itt?,Che cosa fai qua?,ここで何をしている?,여기서 뭘 하는거야?,Wat doe jij hier?,Hva gjør du her?,Co ty tu robisz?,O que você está fazendo aqui?,,Ce cauți aici?,Что ты тут делаешь?,,Vad gör du här?,Ne yapıyorsun burada? +"Hey, I need gold!",TXT_RPLY0_SCRIPT02_D87928_HEYIN,〃,,,"Hej, potřeboval bych zlato!","Hey, jeg har brug for guld!","Hey, ich brauche Gold!",,"Saluton, mi bezonas oron!","¡Buenas, necesito oro!",,"Hei, tarvitsen kultaa!","Hé, j'ai besoin de sous!",,"Héj, nekem arany kell!","Ehi, mi serve dell'oro!",よう、金が必要だ!,"이봐, 난 골드가 필요해!","Hé, ik heb goud nodig!",Jeg trenger gull!,"Hej, potrzebuję złota!","Ei, eu preciso de ouro!",,"Hei, am nevoie de aur!","Эй, мне нужно золото!",,Jag behöver guld!,"Hey, altına ihtiyacım var!" +"Blackbird told you the code, huh? Let me shut off the alarm. Macil is one flight down.",TXT_DLG_SCRIPT02_D89444_BLACK,〃,,,"Straka ti řekla heslo, co? Jen vypnu alarmy. Macil je o podlaží níž.","Blackbird fortalte dig koden, hva'? Lad mig slukke for alarmen. Macil er en etage længere nede.","Blackbird hat dir den Code gegeben, wie? Lass mich mal eben den Alarm abschalten. Macil ist eine Etage tiefer.",,"Merlo diris la pasfrazon al vi, ĉu? Tiuokaze mi sensonigos la alarmon. Macil estas malsupre.","Conque Blackbird te ha dado la clave, ¿eh? Ya apago la alarma, entonces. Macil está bajando las escaleras.","Así que Blackbird te dio la clave, ¿eh? Ya apago la alarma, entonces. Macil está bajando las escaleras.","Vai että Blackbird kertoi sinulle koodin? Anna, kun kytken hälyttimen pois päältä. Macil on yhdet rappuset alas.","Blackbird t'as donné le code, hein? Bon, laisse moi désactiver l'alarme. Macil est en bas des escaliers.",,"Feketerigó mondta el a kódot, mi? Hadd kapcosljam ki a riasztót. macil egy kőhajintásra van innen.","Blackbird ti ha detto qual'è il codice, eh? Fammi disattivare l'allarme. Macil è oltre le scale.","ブラックバードに教えてもらったんだな? 警報は切っておこう。マシルはこの先だ。","블랙버드가 암호를 알려줬나 보군? 흠, 그럼 경보를 꺼둬야겠군. 마실은 계단 저 밑에 있어.","Blackbird vertelde je de code, huh? Laat me de wekker uitzetten. Macil is een vlucht naar beneden.",Fortalte Blackbird deg koden? La meg slå av alarmen. Macil er en etasje ned.,"Blackbird podała ci hasło, co? Pozwól, że wyłączę alarm. Macil jest piętro niżej.","A Blackbird te passou o código, é? Deixa eu desligar o alarme. Macil está no andar debaixo.",,"Blackbird ți-a spus codul, huh? Permite-mi să opresc alarma, Macil e cu un etaj mai jos.","«Чёрный дрозд» сообщила тебе пароль, так? Давай я отключу сигнализацию. Мэйсил этажом ниже.",,"Blackbird berättade koden för dig, va? Låt mig stänga av larmet. Macil är en trappa ner.","Karatavuk sana kodu söyledi, ha? Alarmı kapatayım. Macil bir kat aşağıda." -Thanks.,TXT_RPLY0_SCRIPT02_D89444_THANK,〃,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,Kösz.,Grazie.,ありがとう。,고맙다.,Bedankt.,Takk skal du ha.,Dzięki.,Obrigado.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkürler. -"Walk away, boy, just walk away.",TXT_DLG_SCRIPT02_D90960_WALKA,〃,,,"Jdi pryč, chlapče, prostě odejdi.","Gå væk, knægt, bare gå væk.","Geh weg Jungchen, geh einfach weg.",,"Foriru, ulo. Vi nur foriru.","Vete, chaval. Solo vete.","Vete, muchacho. Solo vete.","Kävele pois vain, poju, kävele pois.","Pars, gamin, pars.","Csak sétálj el innen, sétálj el szépen.","Muoviti, ragazzo, muoviti...",向こうへ行け、新入り、急ぐんだ。,"지나가라고 친구, 그냥 지나가.","Loop weg, jongen, loop gewoon weg.","Gå vekk, gutt. Bare gå vekk.","Odejdź stąd mały, po prostu odejdź.","Suma daqui, garoto. Apenas suma daqui.",,"Pleacă, băiete, pleacă.","Иди своей дорогой, парень, иди.",,"Gå iväg, pojke, bara gå iväg.","Yürü git evlat, yürü git." -Do you have an appointment with the Governor? ,TXT_DLG_SCRIPT02_D92476_DOYOU,Arion.,,,Máte domluvený termín schůzky s guvernérem?,Har du en aftale med guvernøren?,Hast du einen Termin bei dem Gouverneur?,,Ĉu vi supozeble havas rendevuon kun la registo?,¿Acaso tienes una cita con el gobernador?,,Onko teillä varattu tapaaminen kuvernöörin kanssa?,Avez-vous un rendez-vous avec le gouverneur?,Van időpontod a kormányzóval?,Hai un appuntamento con il governatore?,知事とアポイントメントは取ってますか?,총독과 약속이 있으십니까?,Heb je een afspraak met de gouverneur?,Har du en avtale med guvernøren?,Masz spotkanie z Gubernatorem?,Você tem hora marcada com o Governador?,,Ai o programare cu Guvernatorul?,У Вас назначена встреча с губернатором?,,Har du ett möte med guvernören?,Vali ile randevunuz var mı? -Of course!,TXT_RPLY0_SCRIPT02_D92476_OFCOU,〃,,,Samozřejmě!,"Ja, selvfølgelig!",Natürlich!,,Kompreneble!,¡Por supuesto!,,Totta kai!,Bien sûr!,Persze!,Certo!,問題ない!,당연하지!,Natuurlijk!,Selvsagt!,Oczywiście!,Claro que sim!,,Desigur!,Конечно!,,Självklart!,Tabii ki var! -"No, and I don't need one!",TXT_RPLY1_SCRIPT02_D92476_NOAND,〃,,,Ne a žádný nepotřebuju!,"Nej, og jeg har ikke brug for en!","Nein, und ich brauche auch keinen!",,"Ne, kaj mi ne bezonas ĝin!",¡No y no la necesito!,,"Ei, enkä sellaista tarvitsekaan!","Non, et j'en ai pas besoin!","Nincs, és nem is kell!","No, e non ne ho bisogno!",いや、必要ない!,아니. 없는데?,"Nee, en die heb ik niet nodig!","Nei, og jeg trenger ingen!","Nie mam, i nie chcę mieć!",Não e eu não preciso de hora marcada!,,"Nu, nici n-am nevoie de una!","Нет, и я в ней не нуждаюсь!",,"Nej, och jag behöver ingen!","Hayır, ihtiyacım da yok!" -Sorry! I didn't mean... Please go right up.,TXT_DLG_SCRIPT02_D93992_SORRY,〃,,,"Pardon! Nechtěl jsem... jeďte tady nahoru, prosím.",Undskyld! Jeg mente ikke... Vær venlig at gå op.,Entschuldigung! Das war nicht so gemeint... Bitte geh durch.,,"Ha, pardonon, mi ne intencis... Uzu la lifton.","Ah, perdón, no quería... Ve al piso de arriba.",,"Pahoittelut! En tarkoittanut... Menkää suoraan ylös, olkaa hyvä.","Désolé, je.. Vous pouvez monter, bien sûr.",Elnézést! Nem akartam...kérem menjen fel az emeletre.,Scusa! Non intendevo... Vai al piano di sopra.,"すいません!知らずに... +Thanks.,TXT_RPLY0_SCRIPT02_D89444_THANK,〃,,,Díky.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitos.,Merci.,,Kösz.,Grazie.,ありがとう。,고맙다.,Bedankt.,Takk skal du ha.,Dzięki.,Obrigado.,,Mulțumesc.,Спасибо.,,Tack.,Teşekkürler. +"Walk away, boy, just walk away.",TXT_DLG_SCRIPT02_D90960_WALKA,〃,,,"Jdi pryč, chlapče, prostě odejdi.","Gå væk, knægt, bare gå væk.","Geh weg Jungchen, geh einfach weg.",,"Foriru, ulo. Vi nur foriru.","Vete, chaval. Solo vete.","Vete, muchacho. Solo vete.","Kävele pois vain, poju, kävele pois.","Pars, gamin, pars.",,"Csak sétálj el innen, sétálj el szépen.","Muoviti, ragazzo, muoviti...",向こうへ行け、新入り、急ぐんだ。,"지나가라고 친구, 그냥 지나가.","Loop weg, jongen, loop gewoon weg.","Gå vekk, gutt. Bare gå vekk.","Odejdź stąd mały, po prostu odejdź.","Suma daqui, garoto. Apenas suma daqui.",,"Pleacă, băiete, pleacă.","Иди своей дорогой, парень, иди.",,"Gå iväg, pojke, bara gå iväg.","Yürü git evlat, yürü git." +Do you have an appointment with the Governor? ,TXT_DLG_SCRIPT02_D92476_DOYOU,Arion.,,,Máte domluvený termín schůzky s guvernérem?,Har du en aftale med guvernøren?,Hast du einen Termin bei dem Gouverneur?,,Ĉu vi supozeble havas rendevuon kun la registo?,¿Acaso tienes una cita con el gobernador?,,Onko teillä varattu tapaaminen kuvernöörin kanssa?,Avez-vous un rendez-vous avec le gouverneur?,,Van időpontod a kormányzóval?,Hai un appuntamento con il governatore?,知事とアポイントメントは取ってますか?,총독과 약속이 있으십니까?,Heb je een afspraak met de gouverneur?,Har du en avtale med guvernøren?,Masz spotkanie z Gubernatorem?,Você tem hora marcada com o Governador?,,Ai o programare cu Guvernatorul?,У Вас назначена встреча с губернатором?,,Har du ett möte med guvernören?,Vali ile randevunuz var mı? +Of course!,TXT_RPLY0_SCRIPT02_D92476_OFCOU,〃,,,Samozřejmě!,"Ja, selvfølgelig!",Natürlich!,,Kompreneble!,¡Por supuesto!,,Totta kai!,Bien sûr!,,Persze!,Certo!,問題ない!,당연하지!,Natuurlijk!,Selvsagt!,Oczywiście!,Claro que sim!,,Desigur!,Конечно!,,Självklart!,Tabii ki var! +"No, and I don't need one!",TXT_RPLY1_SCRIPT02_D92476_NOAND,〃,,,Ne a žádný nepotřebuju!,"Nej, og jeg har ikke brug for en!","Nein, und ich brauche auch keinen!",,"Ne, kaj mi ne bezonas ĝin!",¡No y no la necesito!,,"Ei, enkä sellaista tarvitsekaan!","Non, et j'en ai pas besoin!",,"Nincs, és nem is kell!","No, e non ne ho bisogno!",いや、必要ない!,아니. 없는데?,"Nee, en die heb ik niet nodig!","Nei, og jeg trenger ingen!","Nie mam, i nie chcę mieć!",Não e eu não preciso de hora marcada!,,"Nu, nici n-am nevoie de una!","Нет, и я в ней не нуждаюсь!",,"Nej, och jag behöver ingen!","Hayır, ihtiyacım da yok!" +Sorry! I didn't mean... Please go right up.,TXT_DLG_SCRIPT02_D93992_SORRY,〃,,,"Pardon! Nechtěl jsem... jeďte tady nahoru, prosím.",Undskyld! Jeg mente ikke... Vær venlig at gå op.,Entschuldigung! Das war nicht so gemeint... Bitte geh durch.,,"Ha, pardonon, mi ne intencis... Uzu la lifton.","Ah, perdón, no quería... Ve al piso de arriba.",,"Pahoittelut! En tarkoittanut... Menkää suoraan ylös, olkaa hyvä.","Désolé, je.. Vous pouvez monter, bien sûr.",,Elnézést! Nem akartam...kérem menjen fel az emeletre.,Scusa! Non intendevo... Vai al piano di sopra.,"すいません!知らずに... そのまま上がって下さい。",이런! 기다리게 할 생각은 없었는데... 부디 위로 올라가시길 바랍니다.,Sorry! Ik bedoelde niet.... Ga alsjeblieft meteen naar boven.,Unnskyld! Unnskyld! Jeg mente ikke... Vær så snill å gå opp.,"Przepraszam! Nie chciałem... Proszę, idź na górę.",Desculpe! Eu não queria... Por favor pode subir.,,"Scuze! Te rog, poftește sus.","Простите! Я не думал... Пожалуйста, проходите наверх.",,Jag är ledsen! Jag menade inte... Var snäll och gå upp.,Özür dilerim! Öyle demek istemedim. Lütfen yukarı çıkın. -I knew you'd say that.,TXT_RPLY0_SCRIPT02_D93992_IKNEW,〃,,,"Věděl jsem, že to řekneš.","Jeg vidste, at du ville sige det.","Ich dachte mir schon, das du das sagen würdest.",,"Mi sciis, ke vi dirus tion.",Sabía que dirías eso.,Sabía que ibas a decir eso.,"Arvasin, että sanoisit noin.",Je savais que vous diriez ceci.,"Tudtam, hogy ezt mondod.",Sapevo che l'avresti detto.,そう言うと思った。,그렇게 말할 줄 알았어.,Ik wist dat je dat zou zeggen.,Jeg visste du ville si det.,"Wiedziałem, że to powiesz.",Eu sabia que você diria isso.,,Știam că vei spune asta.,"Я знал, что ты это скажешь.",,Jag visste att du skulle säga det.,Bunu söyleyeceğini biliyordum. -"If you're in such a hurry, don't waste your time with me.",TXT_DLG_SCRIPT02_D95508_IFYOU,〃,,,"Jestli tolik spěcháte, neztrácejte čas se mnou.","Hvis du har så travlt, skal du ikke spilde din tid med mig.","Wenn du so in Eile bist, dann verschwende deine Zeit nicht mit mir.",,"Se vi vere hastas renkonti lin, ne perdu vian tempo kun mi.","Si realmente tienes tanta prisa, no pierdas el tiempo conmigo.","Si realmente estás tan apurado, no pierdas el tiempo conmigo.","Jos kerta olet niin kovassa kiireessä, älä haaskaa aikaasi minun kanssani.","Si vous êtes tellement pressé, ne perdez pas votre temps avec moi.","Ha ennyire sietsz, ne pocsékold az idődet velem.","Se vai così di fretta, non sprecare il tuo tempo con me.","そんなに急いでいるなら、 +I knew you'd say that.,TXT_RPLY0_SCRIPT02_D93992_IKNEW,〃,,,"Věděl jsem, že to řekneš.","Jeg vidste, at du ville sige det.","Ich dachte mir schon, das du das sagen würdest.",,"Mi sciis, ke vi dirus tion.",Sabía que dirías eso.,Sabía que ibas a decir eso.,"Arvasin, että sanoisit noin.",Je savais que vous diriez ceci.,,"Tudtam, hogy ezt mondod.",Sapevo che l'avresti detto.,そう言うと思った。,그렇게 말할 줄 알았어.,Ik wist dat je dat zou zeggen.,Jeg visste du ville si det.,"Wiedziałem, że to powiesz.",Eu sabia que você diria isso.,,Știam că vei spune asta.,"Я знал, что ты это скажешь.",,Jag visste att du skulle säga det.,Bunu söyleyeceğini biliyordum. +"If you're in such a hurry, don't waste your time with me.",TXT_DLG_SCRIPT02_D95508_IFYOU,〃,,,"Jestli tolik spěcháte, neztrácejte čas se mnou.","Hvis du har så travlt, skal du ikke spilde din tid med mig.","Wenn du so in Eile bist, dann verschwende deine Zeit nicht mit mir.",,"Se vi vere hastas renkonti lin, ne perdu vian tempo kun mi.","Si realmente tienes tanta prisa, no pierdas el tiempo conmigo.","Si realmente estás tan apurado, no pierdas el tiempo conmigo.","Jos kerta olet niin kovassa kiireessä, älä haaskaa aikaasi minun kanssani.","Si vous êtes tellement pressé, ne perdez pas votre temps avec moi.",,"Ha ennyire sietsz, ne pocsékold az idődet velem.","Se vai così di fretta, non sprecare il tuo tempo con me.","そんなに急いでいるなら、 お互い時間を大切にしましょう。","아주 급하시다면, 저하고 예기하는 건 시간 낭비일 뿐이에요.","Als je zo'n haast hebt, verspil dan geen tijd met mij.","Hvis du har det så travelt, ikke kast bort tiden din på meg.","Jeśli się tak spieszysz, nie marnuj czasu tu ze mną.","Se você está com tanta pressa, não gaste seu tempo comigo.",,"Dacă te grăbești așa tare, nu-ți pierde vremea cu mine.","Если вы так торопитесь, не тратьте на меня время.",,"Om du har så bråttom, slösa inte bort din tid med mig.","Madem bu kadar aceleniz var, benimle vakit kaybetmeyin." -"Release me, leave an old man alone.",TXT_DLG_SCRIPT02_D97024_RELEA,MAP02: MacGuffin,,,"Drž se dál, nech starce na pokoji.","Slip mig fri, lad en gammel mand være i fred.","Pack mich nicht an, lass einen alten Mann in Ruhe",,"Sufiĉe, ne ĝenu maljunulon.",Déjame en paz. No molestes a un anciano.,,"Päästä minut, jätä vanha mies rauhaan.","Laissez moi tranquille, un vieil homme a le droit d'être seul.","Engedj el, hagyd békén öreg csontjaimat.","Lasciami stare, non inquietare un vecchio.",ほっといてくれ、年寄り一人にしてくれ。,부탁일세. 이 노인을 내버려 두게.,"Laat me vrij, laat een oude man met rust.","Slipp meg, la en gammel mann være i fred.","Nie zbliżaj się, zostaw starca w spokoju.","Me solte, deixe um velho em paz.",,"Lasă-mă, lasă bătrânii în pace.",Оставь старика в покое!,,"Släpp mig, låt en gammal man vara ifred.","Bırak beni, yaşlı bir adamı yalnız bırak." -"You seek wisdom, my son? The order has seen to it that we only ask one question, 'Why?'",TXT_DLG_SCRIPT02_D98540_YOUSE,"〃 (after accepting ""messy"" chore)",,,"Hledáš moudrost, chlapče? Řád dohlédl na to, abychom se ptali jen na jedno: „Proč?“","Søger du visdom, min søn? Ordenen har sørget for, at vi kun stiller ét spørgsmål: ""Hvorfor?","Du suchst Weisheit, mein Sohn? Der Orden hat zugesehen das wir nur noch eine Frage stellen, „Warum?“",,"Ĉu vi serĉas saĝon, filo? La Ordeno certiĝis, ke ni nur faru unu demandon: «Kial?».","¿Buscas sabiduría, hijo mío? La Orden se ha asegurado de que hagamos solo una pregunta: «¿Por qué?».",,"Etsitkö viisautta, poikani? Veljeskunta on pitänyt huolen, että ainoa kysymys, jonka kysymme, on ""Miksi"".","Vous cherchez ma sagesse, jeune homme? L'Ordre ne pose qu'une seule question: « Pourquoi? »","Tudásra vágsz, fiam? A Rend gondoskodott róla, hogy az egyetlen kérdés amit felteszünk a 'Miért?'","Cerchi saggezza, figliolo? L'Ordine ha fatto si che noi possiamo chiedere una sola domanda. ""Perché?""","知恵が欲しそうだな、ボウズ? +"Release me, leave an old man alone.",TXT_DLG_SCRIPT02_D97024_RELEA,MAP02: MacGuffin,,,"Drž se dál, nech starce na pokoji.","Slip mig fri, lad en gammel mand være i fred.","Pack mich nicht an, lass einen alten Mann in Ruhe",,"Sufiĉe, ne ĝenu maljunulon.",Déjame en paz. No molestes a un anciano.,,"Päästä minut, jätä vanha mies rauhaan.","Laissez moi tranquille, un vieil homme a le droit d'être seul.",,"Engedj el, hagyd békén öreg csontjaimat.","Lasciami stare, non inquietare un vecchio.",ほっといてくれ、年寄り一人にしてくれ。,부탁일세. 이 노인을 내버려 두게.,"Laat me vrij, laat een oude man met rust.","Slipp meg, la en gammel mann være i fred.","Nie zbliżaj się, zostaw starca w spokoju.","Me solte, deixe um velho em paz.",,"Lasă-mă, lasă bătrânii în pace.",Оставь старика в покое!,,"Släpp mig, låt en gammal man vara ifred.","Bırak beni, yaşlı bir adamı yalnız bırak." +"You seek wisdom, my son? The order has seen to it that we only ask one question, 'Why?'",TXT_DLG_SCRIPT02_D98540_YOUSE,"〃 (after accepting ""messy"" chore)",,,"Hledáš moudrost, chlapče? Řád dohlédl na to, abychom se ptali jen na jedno: „Proč?“","Søger du visdom, min søn? Ordenen har sørget for, at vi kun stiller ét spørgsmål: ""Hvorfor?","Du suchst Weisheit, mein Sohn? Der Orden hat zugesehen das wir nur noch eine Frage stellen, „Warum?“",,"Ĉu vi serĉas saĝon, filo? La Ordeno certiĝis, ke ni nur faru unu demandon: «Kial?».","¿Buscas sabiduría, hijo mío? La Orden se ha asegurado de que hagamos solo una pregunta: «¿Por qué?».",,"Etsitkö viisautta, poikani? Veljeskunta on pitänyt huolen, että ainoa kysymys, jonka kysymme, on ""Miksi"".","Vous cherchez ma sagesse, jeune homme? L'Ordre ne pose qu'une seule question: « Pourquoi? »",,"Tudásra vágsz, fiam? A Rend gondoskodott róla, hogy az egyetlen kérdés amit felteszünk a 'Miért?'","Cerchi saggezza, figliolo? L'Ordine ha fatto si che noi possiamo chiedere una sola domanda. ""Perché?""","知恵が欲しそうだな、ボウズ? オーダーが勘付かないよう一つだけ質問しよう、 '何故?'","지혜를 찾고 싶은가, 젊은이여? 오더도 이 사실을 알고 있어서 우리들을 '왜?' 하고 묻게 했다네. 자네도 '왜' 그러나?","Je zoekt wijsheid, mijn zoon? De orde heeft ervoor gezorgd dat we maar één vraag stellen: 'Waarom?","Søker du visdom, min sønn? Ordenen har sørget for at vi bare stiller ett spørsmål. Hvorfor?","Poszukujesz wiedzy mój synu? Zakon stara się dopilnować nas abyśmy zadawali sobie tylko jedno pytanie, ""Czemu?""","Está atrás de sabedoria, meu filho? A ordem se certificou de que a gente só fizesse uma única pergunta, ""por quê?""",,"Cauți înțelepciune, fiul meu? Ordinul a avut grijă ca noi să putem fi în stare să punem o singură întrebare: 'De ce?'","Ищешь совета, сын мой? Орден заботится о том, чтобы нас занимал только один вопрос: «За что?»",,"Du söker visdom, min son? Ordern har sett till att vi bara ställer en fråga: ""Varför?","Bilgelik mi istiyorsun, oğlum? Düzen sadece tek bir soru sormamızı sağladı, ""Neden?" -Where's the power coupling?,TXT_RPLY0_SCRIPT02_D98540_WHERE,〃 (〃),,,Kde je elektrická spojka?,Hvor er kraftkoblingen?,Wo ist der Stromabnehmer?,,Kie estas la elektra kuplado?,¿Dónde está el acoplamiento eléctrico?,,Missä virtaliitin on?,Où est le coupleur énergétique?,Hol van az áram kapcsoló?,Dov'è il giunto dell'impianto energetico?,配電機 は何処だ?,동력선은 어디있나요?,Waar is de krachtkoppeling?,Hvor er kraftkoblingen?,Gdzie jest odbierak prądu?,Cadê a conexão de energia?,,Unde e cuplajul energiei?,Где соединительная муфта?,,Var är kraftkopplingen?,Güç bağlantısı nerede? -Where's the Order's main?,TXT_RPLY1_SCRIPT02_D98540_WHERE,〃 (〃),,,Kde má Řád napájecí síť?,Hvor er ordenens vigtigste?,Wo ist die Stromleitung des Ordens?,,Kie estas la elektriza sistemo de La Ordeno?,¿Dónde está la red eléctrica de La Orden?,,Missä on Veljeskunnan pääsähkölinja?,Où est le transformateur de l'Ordre?,Hol a Rend fővonala?,Dov'è il giunto dell'Ordine?,オーダーの本管 は何処だ?,오더의 동력 공급 시설은 어디있나요?,Waar is de hoofdopdracht van de Orde?,Hvor er Ordenens hovedledning?,Gdzie jest przewód Zakonu?,Cadê o transformador da Ordem?,,Unde e linia electrică a Ordinului?,Где линия электропередачи Ордена?,,Var är orderns huvudledning?,Tarikat'ın ana hattı nerede? -Where's the illegal tap?,TXT_RPLY2_SCRIPT02_D98540_WHERE,〃 (〃),,,Kde je nelegální stáčedlo?,Hvor er den ulovlige aftapning?,Wo ist die illegale Anzapfung?,,Kie estas la kontraŭleĝa konektilo?,¿Dónde está la toma eléctrica ilegal?,,Missä laiton kytkentä on?,Où est la connection pirate?,Hol az illegális lék?,Dov'è l'aggeggio illegale che sta rubando l'energia?,違法供給源 は何処だ?,불법 추출기는 어디있나요?,Waar is de illegale kraan?,Hvor er den ulovlige kranen?,Gdzie jest nielegalny przełącznik prądu?,Cadê a ligação clandestina?,,Unde e conexiunea ilegală?,Где нелегальное подключение?,,Var är den olagliga kranen?,Yasadışı musluk nerede? -"I'll tell you where it is, but I don't know whose coupling you'll be tampering with. It's right here in the sewage plant.",TXT_DLG_SCRIPT02_D100056_ILLTE,〃 (〃),,,"Řeknu ti kde je, ale nevím s čí spojkou budeš manipulovat. Je přímo tady v čističce.","Jeg skal fortælle dig, hvor den er, men jeg ved ikke, hvis kobling du vil pille ved. Den er lige her i kloakanlægget.","Ich sage dir wo er ist, aber ich weiß nicht, an wessen Anzapfung du herummanipulieren willst. Er ist genau hier in der Kläranlage.",,"Mi respondos, sed mi ne scias, kies elektrizan sistemon vi intencas perturbi. Ĝi estas ĉi tie, en la kloakpurigejo.","Te diré donde, aunque no sé de quién será la red eléctrica que quieres manipular. Está justo aquí en la planta de aguas residuales.","Te voy a decir, aunque no sé de quién será la red eléctrica que quieres manipular. Está justo aquí en la planta de aguas residuales.","Kerron kyllä, missä se on, mutten tiedä, kenen kytkentään aiot sekaantua. Se on täällä jätelaitoksella.","Je peux vous dire où il est, mais je ne peux pas vous dire à qui il appartient. Il se trouve dans le traitement des égouts.","Elárom hol van, de pontosan nem tudom kinek a kapcsolójával fogsz babrálni. Itt van rögtön a szennyvíz tisztítóban.","Ti dirò dov'è, ma non so con quale giunto in particolare tu voglia maneggiare. Sta proprio qua nell'impianto fognario.","それが何処にあるかは話そう、だがオレには +Where's the power coupling?,TXT_RPLY0_SCRIPT02_D98540_WHERE,〃 (〃),,,Kde je elektrická spojka?,Hvor er kraftkoblingen?,Wo ist der Stromabnehmer?,,Kie estas la elektra kuplado?,¿Dónde está el acoplamiento eléctrico?,,Missä virtaliitin on?,Où est le coupleur énergétique?,,Hol van az áram kapcsoló?,Dov'è il giunto dell'impianto energetico?,配電機 は何処だ?,동력선은 어디있나요?,Waar is de krachtkoppeling?,Hvor er kraftkoblingen?,Gdzie jest odbierak prądu?,Cadê a conexão de energia?,,Unde e cuplajul energiei?,Где соединительная муфта?,,Var är kraftkopplingen?,Güç bağlantısı nerede? +Where's the Order's main?,TXT_RPLY1_SCRIPT02_D98540_WHERE,〃 (〃),,,Kde má Řád napájecí síť?,Hvor er ordenens vigtigste?,Wo ist die Stromleitung des Ordens?,,Kie estas la elektriza sistemo de La Ordeno?,¿Dónde está la red eléctrica de La Orden?,,Missä on Veljeskunnan pääsähkölinja?,Où est le transformateur de l'Ordre?,,Hol a Rend fővonala?,Dov'è il giunto dell'Ordine?,オーダーの本管 は何処だ?,오더의 동력 공급 시설은 어디있나요?,Waar is de hoofdopdracht van de Orde?,Hvor er Ordenens hovedledning?,Gdzie jest przewód Zakonu?,Cadê o transformador da Ordem?,,Unde e linia electrică a Ordinului?,Где линия электропередачи Ордена?,,Var är orderns huvudledning?,Tarikat'ın ana hattı nerede? +Where's the illegal tap?,TXT_RPLY2_SCRIPT02_D98540_WHERE,〃 (〃),,,Kde je nelegální stáčedlo?,Hvor er den ulovlige aftapning?,Wo ist die illegale Anzapfung?,,Kie estas la kontraŭleĝa konektilo?,¿Dónde está la toma eléctrica ilegal?,,Missä laiton kytkentä on?,Où est la connection pirate?,,Hol az illegális lék?,Dov'è l'aggeggio illegale che sta rubando l'energia?,違法供給源 は何処だ?,불법 추출기는 어디있나요?,Waar is de illegale kraan?,Hvor er den ulovlige kranen?,Gdzie jest nielegalny przełącznik prądu?,Cadê a ligação clandestina?,,Unde e conexiunea ilegală?,Где нелегальное подключение?,,Var är den olagliga kranen?,Yasadışı musluk nerede? +"I'll tell you where it is, but I don't know whose coupling you'll be tampering with. It's right here in the sewage plant.",TXT_DLG_SCRIPT02_D100056_ILLTE,〃 (〃),,,"Řeknu ti kde je, ale nevím s čí spojkou budeš manipulovat. Je přímo tady v čističce.","Jeg skal fortælle dig, hvor den er, men jeg ved ikke, hvis kobling du vil pille ved. Den er lige her i kloakanlægget.","Ich sage dir wo er ist, aber ich weiß nicht, an wessen Anzapfung du herummanipulieren willst. Er ist genau hier in der Kläranlage.",,"Mi respondos, sed mi ne scias, kies elektrizan sistemon vi intencas perturbi. Ĝi estas ĉi tie, en la kloakpurigejo.","Te diré donde, aunque no sé de quién será la red eléctrica que quieres manipular. Está justo aquí en la planta de aguas residuales.","Te voy a decir, aunque no sé de quién será la red eléctrica que quieres manipular. Está justo aquí en la planta de aguas residuales.","Kerron kyllä, missä se on, mutten tiedä, kenen kytkentään aiot sekaantua. Se on täällä jätelaitoksella.","Je peux vous dire où il est, mais je ne peux pas vous dire à qui il appartient. Il se trouve dans le traitement des égouts.",,"Elárom hol van, de pontosan nem tudom kinek a kapcsolójával fogsz babrálni. Itt van rögtön a szennyvíz tisztítóban.","Ti dirò dov'è, ma non so con quale giunto in particolare tu voglia maneggiare. Sta proprio qua nell'impianto fognario.","それが何処にあるかは話そう、だがオレには どれをイジるかまでは知らん。 配電機はここの下水処理場にある。",그게 어딨는지 말해주지. 왜 그 동력선에 손을 대려고 하는지는 모르겠지마는. 저 앞 하수도 안에 있다네.,"Ik zal je vertellen waar hij is, maar ik weet niet met wie je met de koppeling zult knoeien. Het is hier in de rioolwaterzuiveringsinstallatie.","Jeg skal si deg hvor den er, men jeg vet ikke hvem sin kobling du skal tukle med. Den er her i kloakkanlegget.","Powiem ci gdzie jest, ale nie wiem czyj to odbierak, przy którym będziesz majstrować. Jest w oczyszczalni ścieków.","Vou te dizer onde está, mas não sei em qual ligação você vai acabar mexendo. Fica bem aqui na usina de tratamento de esgoto.",,"Îți voi spune unde este, dar nu știu de care cuplaj te vei lega. Este chiar aici, în sistemul de canalizare.","Я скажу тебе, где она, но не знаю, которая тебе нужна. Она прямо здесь, в очистной системе.",,"Jag ska berätta var den är, men jag vet inte vems koppling du kommer att mixtra med. Den finns här i reningsverket.","Nerede olduğunu söyleyeceğim, ama kimin bağlantılarını kurcalayacağınızı bilmiyorum. Tam burada, kanalizasyon tesisinde." -Thanks,TXT_RPLY0_SCRIPT02_D100056_THANK,〃 (〃),,,Díky.,Tak,Danke,,Dankon.,Gracias.,,Kiitos,Merci.,Kösz.,Grazie,ありがとう。,그렇군요.,Bedankt,Takk skal du ha.,Dzięki,Obrigado,,Mulțumesc,Спасибо.,,Tack,Teşekkürler. +Thanks,TXT_RPLY0_SCRIPT02_D100056_THANK,〃 (〃),,,Díky.,Tak,Danke,,Dankon.,Gracias.,,Kiitos,Merci.,,Kösz.,Grazie,ありがとう。,그렇군요.,Bedankt,Takk skal du ha.,Dzięki,Obrigado,,Mulțumesc,Спасибо.,,Tack,Teşekkürler. That's right here in the sewage plant. But it's the Front's coupling. Whoever told you that it was the Order's was wrong.,TXT_DLG_SCRIPT02_D101572_THATS,〃 (〃),,,"Síť je přímo tady, v čističce. Ale je to spojka Fronty. Kdo ti řekl, že je Řádu, se mýlil.","Det er lige her i kloakanlægget. Men det er Fronts kobling. Den, der fortalte dig, at det var Ordenens, tog fejl.","Genau hier, in der Kläranlage. Aber sie gehört der Front. Wer auch immer dir gesagt hat, sie gehöre dem Orden, hat gelogen.",,"Ĝi estas ĉi tie, en la kloakpurigejo, sed ĝi estas la kuplado de la Fronto. Tiu ajn, kiu diris, ke ĝi estas de La Ordeno, eraris.","Está justo aquí en la planta de aguas residuales, pero es el acoplamiento del Frente. Quien te haya dicho que era de La Orden se ha equivocado. ","Está justo aquí en la planta de aguas residuales, pero es el acoplamiento del Frente. Quien te haya dicho que era de La Orden te dijo mal. -","Se on täällä jätelaitoksella. Mutta se on Rintaman kytkentä. Kuka sinulle kertoikaan sen kuuluvan Veljeskunnalle, oli väärässä.","Il se trouve ici dans le traitement des égouts, mais c'est le coupleur du Front . Celui qui vous a dit qu'il appartient à l'Ordre se plante.","Igen, jól hallottad, a szennyvíz tisztítóban. Ez azonban a Front kapcsolója. Akárki mondta, hogy a Rendé, hazudott neked.",È proprio qui nell'impianto fognario. Ma è il giunto del Fronte. Chiunque ti abbia detto che fosse il giunto dell'Ordine si sbagliava.,"正にここの下水処理場にあるさ。 +","Se on täällä jätelaitoksella. Mutta se on Rintaman kytkentä. Kuka sinulle kertoikaan sen kuuluvan Veljeskunnalle, oli väärässä.","Il se trouve ici dans le traitement des égouts, mais c'est le coupleur du Front . Celui qui vous a dit qu'il appartient à l'Ordre se plante.",,"Igen, jól hallottad, a szennyvíz tisztítóban. Ez azonban a Front kapcsolója. Akárki mondta, hogy a Rendé, hazudott neked.",È proprio qui nell'impianto fognario. Ma è il giunto del Fronte. Chiunque ti abbia detto che fosse il giunto dell'Ordine si sbagliava.,"正にここの下水処理場にあるさ。 だがそれはフロントにも繋いでいる。 そいつがオーダーの所有物と言われてたが、 そりゃ間違いだ。",저 앞 하수도 안에 있다네. 프론트가 설치한 동력선일세. 저게 오더 소유라고 우기던 사람은 거짓말을 한 게야.,"Dat is hier in de rioolwaterzuiveringsinstallatie. Maar het is de koppeling van de voorkant. Degene die je vertelde dat het de Order's waren, had het mis.","Det er her i kloakkanlegget. Men det er Fronts kobling. Den som sa at det var Ordenens, tok feil.","Jest w oczyszczalni ścieków. Ale to jest odbierak Frontu. Ktokolwiek ci powiedział, że należy do Zakonu, był w błędzie.",Fica bem aqui na usina de tratamento de esgoto. Mas é a ligação da Frente. Quem te falou que era da Ordem estava enganado.,,Este chiar aici în sistemul de canalizare. Dar este cuplajul Frontului. Oricine ți-a spus că e al Ordinului a greșit.,"Она прямо здесь, в очистном сооружении. Но это линия Сопротивления. Тот, кто сказал тебе, что она принадлежит Ордену, ошибся. ",,Det är precis här i reningsverket. Men det är Fronts koppling. Den som sa till dig att det var ordens koppling hade fel.,"Tam burada, kanalizasyon tesisinde. Ama bu Cephe'nin bağlantısı. Size kim Tarikat'ın olduğunu söylediyse yanılmış." -Thanks,TXT_RPLY0_SCRIPT02_D101572_THANK,〃 (〃),,,Díky.,Tak,Danke.,,Dankon.,Gracias.,,Kiitos,Merci.,Kösz.,Grazie,ありがとう。,고맙습니다.,Bedankt,Takk.,Dzięki,Obrigado,,Mulțumesc,Спасибо.,,Tack,Teşekkürler. -If you say it's illegal I want nothing to do with you. I have enough trouble as it is.,TXT_DLG_SCRIPT02_D103088_IFYOU,〃 (〃),,,"Jestli říkáš nelegální, nechci s tebou nic mít. Už tak mám svých problémů dost.","Hvis du siger, det er ulovligt, vil jeg ikke have noget med dig at gøre. Jeg har problemer nok i forvejen.","Wenn du sagst, es sei illegal, möchte ich nichts damit zu tun haben. Ich habe schon genug Probleme.",,"Se vi diras, ke ĝi estas kontraŭleĝa, mi volas nenian rilaton kun vi. Mi jam havas sufiĉe da problemoj.",Si dices que es ilegal no quiero tener nada que ver contigo. Ya tengo suficientes problemas.,,"Jos sanot sen olevan laiton, en halua olla kanssasi missään tekemisissä. On jo riitämiin pärjäämistä nykyhuolteni kanssa.","Si vous dites que c'est un truc illégal, alors je ne veux pas m'en mêler. J'ai déjà assez de problèmes.","Ha azt mondod, hogy illegális, nem akarok benne lenni. Van már így is elég bajom.","Se dici che è illegale, non voglio averci nulla a che fare. Ho già abbastanza problemi di mio.","それが違法だっつうんならオレには関係無い。 +Thanks,TXT_RPLY0_SCRIPT02_D101572_THANK,〃 (〃),,,Díky.,Tak,Danke.,,Dankon.,Gracias.,,Kiitos,Merci.,,Kösz.,Grazie,ありがとう。,고맙습니다.,Bedankt,Takk.,Dzięki,Obrigado,,Mulțumesc,Спасибо.,,Tack,Teşekkürler. +If you say it's illegal I want nothing to do with you. I have enough trouble as it is.,TXT_DLG_SCRIPT02_D103088_IFYOU,〃 (〃),,,"Jestli říkáš nelegální, nechci s tebou nic mít. Už tak mám svých problémů dost.","Hvis du siger, det er ulovligt, vil jeg ikke have noget med dig at gøre. Jeg har problemer nok i forvejen.","Wenn du sagst, es sei illegal, möchte ich nichts damit zu tun haben. Ich habe schon genug Probleme.",,"Se vi diras, ke ĝi estas kontraŭleĝa, mi volas nenian rilaton kun vi. Mi jam havas sufiĉe da problemoj.",Si dices que es ilegal no quiero tener nada que ver contigo. Ya tengo suficientes problemas.,,"Jos sanot sen olevan laiton, en halua olla kanssasi missään tekemisissä. On jo riitämiin pärjäämistä nykyhuolteni kanssa.","Si vous dites que c'est un truc illégal, alors je ne veux pas m'en mêler. J'ai déjà assez de problèmes.",,"Ha azt mondod, hogy illegális, nem akarok benne lenni. Van már így is elég bajom.","Se dici che è illegale, non voglio averci nulla a che fare. Ho già abbastanza problemi di mio.","それが違法だっつうんならオレには関係無い。 トラブルは御免だ。",저게 불법이라고 말한다면 난 이제 더는 모른다네. 관련 문제도 원치 않고 말일세.,"Als je zegt dat het illegaal is, wil ik niets met je te maken hebben. Ik heb al genoeg problemen.","Hvis du sier det er ulovlig, vil jeg ikke ha noe med deg å gjøre. Jeg har nok problemer som det er.","Jeśli mówisz, że jest nielegalny, to nie chcę mieć z tobą nic wspólnego. Mam wystarczająco dużo kłopotów.",Se você diz que isso é ilegal então eu não quero envolvimento nenhum contigo. Já tenho problemas o suficiente.,,"Dacă zici că e ilegal, nu vreau să am nimic de-aface cu tine. Am destule probleme deja.","Раз ты говоришь, что оно нелегально, я не хочу иметь с тобой дел. Мне и так хватает проблем.",,Om du säger att det är olagligt vill jag inte ha något med dig att göra. Jag har tillräckligt med problem som det är.,"Eğer bunun yasadışı olduğunu söylüyorsanız, sizinle hiçbir şey yapmak istemiyorum. Başımda yeterince bela var zaten." -Thanks,TXT_RPLY0_SCRIPT02_D103088_THANK,〃 (〃),,,Díky.,Tak,Danke,,Dankon.,Gracias.,,Kiitos,Merci.,Kösz,Grazie,ありがとう。,감사합니다.,Bedankt,Takk.,Dzięki,Obrigado,,Mulțumesc,Спасибо.,,Tack,Teşekkürler. -"Release me, leave an old man alone.",TXT_DLG_SCRIPT02_D104604_RELEA,〃 (〃),,,"Drž se dál, nech starce na pokoji.","Slip mig fri, lad en gammel mand være i fred.",Bitte lass einen alten Mann in Ruhe,,"Sufiĉe, ne ĝenu maljunulon.",Déjame en paz. No molestes a un anciano.,,"Päästä minut, jätä vanha mies rauhaan.","Laissez moi tranquille, un vieil homme a le droit d'être seul.","Engedj el, hagyd békén öreg csontjaimat.","Lasciami stare, non inquietare un vecchio.",ほっといてくれ、年寄り一人にしてくれ。,보내주게. 이 노인은 이제 아무것도 몰라.,"Laat me vrij, laat een oude man met rust.","Slipp meg fri, la en gammel mann være i fred.","Nie zbliżaj się, zostaw starca w spokoju.","Me solte, deixe um velho em paz.",,"Lasă-mă, lasă bătrânii în pace.",Оставь старика в покое!,,"Släpp mig, låt en gammal man vara ifred.","Bırakın beni, yaşlı bir adamı yalnız bırakın." -"Welcome to the last flicker of hope. Only we have the free will to oppose the Order. We have the sharpest scientific minds, and many able bodies, but we lack that one real, uh... Problemsolver, who will give us the edge we need. Help us.",TXT_DLG_SCRIPT03_D0_WELCO,MAP03: Macil.,,,"Vítej u posledního plamínku naděje. Jen my máme svobodnou vůli vzdorovat Řádu. Máme sice nejčilejší vědecké génie a mnoho schopných vojáků, ale chybí nám ten jeden... pomocník, který by nás posunul vpřed. Pomoz nám.","Velkommen til det sidste lille håb. Kun vi har den frie vilje til at modsætte os Ordenen. Vi har de skarpeste videnskabelige hjerner og mange dygtige kroppe, men vi mangler den ene rigtige, øh... Problemløser, som vil give os den fordel, vi har brug for. Hjælp os.","Wilkommen beim letzten Hoffnungsschimmer. Nur wir haben noch den freien Willen, um gegen den Orden zu arbeiten. Wir haben die besten Wissenschaftler und viele fähige Kämpfer aber was uns fehlt ist ein spezieller... äh... Problemlöser, der uns den nötigen Vorteil verschafft. Bitte hilf uns.",,"Bonvenon en la lasta fajrero da espero. Nur ni havas liberan volon por kontraŭstari al La Ordeno. Ni havas la plej inteligentajn mensojn kaj multe da kapablaj homoj, sed mankas tiu, kiu estus, hm... vera problem-solvanto, por ke li donu al ni la necesan avantaĝon. Helpu nin.","Bienvenido al último destello de esperanza. Solo nosotros tenemos el libre albedrío para oponernos a La Orden. Tenemos las mentes científicas más brillantes y muchas personas capaces, pero nos falta el que sería, este... todo un solucionador de problemas para que nos dé la ventaja que necesitamos. Ayúdanos.",,"Tervetuloa viimeisen toivonpilkahduksen äärelle. Ainoastaan meillä on vapaa tahto vastustaa Veljeskuntaa. Meillä on tieteen terävimmät mielet ja monia ruumiiltaan vahvoja, mutta meiltä puuttuu se yksi todellinen, sanottaisiinko, Ongelmanratkoja, joka antaisi meille kaipaamamme etulyöntiaseman. Auta meitä.","Bienvenue au dernier lieu d'espoir. Nous seuls avons la liberté d'esprit pour opposer l'Ordre. Nous avons les esprits scientifiques les plus aiguisés et de nombreux hommes habiles et sains.. Mais il nous manque quelqu'un qui pourrait.. résoudre nos problèmes. Nous donner un peu d'aide, nous permettre de prendre l'avantage.","Köszöntelek a remény utolsó pislákoló fényénél. Már csak mi merünk szembeszállni a Renddel. Itt vannak a legélesebb elmék, életerős emberek, de hiányzik egy igazi...probléma megoldó, aki előnyt szerez számunkra. Segíts nekünk!","Benvenuto nell'ultimo barlume di speranza. Noi siamo i soli ad avere la determinazione per combattere l'Ordine. Abbiamo brillanti scienziati e molti soldati capaci, ma ci manca quel vero e proprio... risolutore di problemi, che ci può dare quel vantaggio che cerchiamo. Aiutaci!","ようこそ、ここは我々の僅かな希望が集まる +Thanks,TXT_RPLY0_SCRIPT02_D103088_THANK,〃 (〃),,,Díky.,Tak,Danke,,Dankon.,Gracias.,,Kiitos,Merci.,,Kösz,Grazie,ありがとう。,감사합니다.,Bedankt,Takk.,Dzięki,Obrigado,,Mulțumesc,Спасибо.,,Tack,Teşekkürler. +"Release me, leave an old man alone.",TXT_DLG_SCRIPT02_D104604_RELEA,〃 (〃),,,"Drž se dál, nech starce na pokoji.","Slip mig fri, lad en gammel mand være i fred.",Bitte lass einen alten Mann in Ruhe,,"Sufiĉe, ne ĝenu maljunulon.",Déjame en paz. No molestes a un anciano.,,"Päästä minut, jätä vanha mies rauhaan.","Laissez moi tranquille, un vieil homme a le droit d'être seul.",,"Engedj el, hagyd békén öreg csontjaimat.","Lasciami stare, non inquietare un vecchio.",ほっといてくれ、年寄り一人にしてくれ。,보내주게. 이 노인은 이제 아무것도 몰라.,"Laat me vrij, laat een oude man met rust.","Slipp meg fri, la en gammel mann være i fred.","Nie zbliżaj się, zostaw starca w spokoju.","Me solte, deixe um velho em paz.",,"Lasă-mă, lasă bătrânii în pace.",Оставь старика в покое!,,"Släpp mig, låt en gammal man vara ifred.","Bırakın beni, yaşlı bir adamı yalnız bırakın." +"Welcome to the last flicker of hope. Only we have the free will to oppose the Order. We have the sharpest scientific minds, and many able bodies, but we lack that one real, uh... Problemsolver, who will give us the edge we need. Help us.",TXT_DLG_SCRIPT03_D0_WELCO,MAP03: Macil.,,,"Vítej u posledního plamínku naděje. Jen my máme svobodnou vůli vzdorovat Řádu. Máme sice nejčilejší vědecké génie a mnoho schopných vojáků, ale chybí nám ten jeden... pomocník, který by nás posunul vpřed. Pomoz nám.","Velkommen til det sidste lille håb. Kun vi har den frie vilje til at modsætte os Ordenen. Vi har de skarpeste videnskabelige hjerner og mange dygtige kroppe, men vi mangler den ene rigtige, øh... Problemløser, som vil give os den fordel, vi har brug for. Hjælp os.","Wilkommen beim letzten Hoffnungsschimmer. Nur wir haben noch den freien Willen, um gegen den Orden zu arbeiten. Wir haben die besten Wissenschaftler und viele fähige Kämpfer aber was uns fehlt ist ein spezieller... äh... Problemlöser, der uns den nötigen Vorteil verschafft. Bitte hilf uns.",,"Bonvenon en la lasta fajrero da espero. Nur ni havas liberan volon por kontraŭstari al La Ordeno. Ni havas la plej inteligentajn mensojn kaj multe da kapablaj homoj, sed mankas tiu, kiu estus, hm... vera problem-solvanto, por ke li donu al ni la necesan avantaĝon. Helpu nin.","Bienvenido al último destello de esperanza. Solo nosotros tenemos el libre albedrío para oponernos a La Orden. Tenemos las mentes científicas más brillantes y muchas personas capaces, pero nos falta el que sería, este... todo un apagafuegos para que nos dé la ventaja que necesitamos. Ayúdanos.",,"Tervetuloa viimeisen toivonpilkahduksen äärelle. Ainoastaan meillä on vapaa tahto vastustaa Veljeskuntaa. Meillä on tieteen terävimmät mielet ja monia ruumiiltaan vahvoja, mutta meiltä puuttuu se yksi todellinen, sanottaisiinko, Ongelmanratkoja, joka antaisi meille kaipaamamme etulyöntiaseman. Auta meitä.","Bienvenue au dernier lieu d'espoir. Nous seuls avons la liberté d'esprit pour opposer l'Ordre. Nous avons les esprits scientifiques les plus aiguisés et de nombreux hommes habiles et sains.. Mais il nous manque quelqu'un qui pourrait.. résoudre nos problèmes. Nous donner un peu d'aide, nous permettre de prendre l'avantage.",,"Köszöntelek a remény utolsó pislákoló fényénél. Már csak mi merünk szembeszállni a Renddel. Itt vannak a legélesebb elmék, életerős emberek, de hiányzik egy igazi...probléma megoldó, aki előnyt szerez számunkra. Segíts nekünk!","Benvenuto nell'ultimo barlume di speranza. Noi siamo i soli ad avere la determinazione per combattere l'Ordine. Abbiamo brillanti scienziati e molti soldati capaci, ma ci manca quel vero e proprio... risolutore di problemi, che ci può dare quel vantaggio che cerchiamo. Aiutaci!","ようこそ、ここは我々の僅かな希望が集まる 最後の場所だ。オーダーへと立ち向かう意思を 持っているのは我々くらいだ。 ここには素晴らしい頭脳を持つ学者たち、そして @@ -10721,483 +10721,483 @@ Thanks,TXT_RPLY0_SCRIPT02_D103088_THANK,〃 (〃),,,Díky.,Tak,Danke,,Dankon.,Gr だがしかし、我々には問題解決に優れた者、 つまり私達の力となる者が足りていないんだ。 我々に手を貸してくれ。","최후의 희망 한 가닥을 잡은 것을 환영합니다. 우리만이 오더를 거부할 수 있는 의지를 갖추고 있죠. 뛰어난 과학력과 전투력은 다 갖추고 있습니다만, 정작 '해결사' 몫을 해주는 인물이 없어서 말입니다... 부디 우리를 도와주시길 바랍니다.","Welkom bij het laatste sprankje hoop. Alleen wij hebben de vrije wil om ons te verzetten tegen de Orde. We hebben de scherpste wetenschappelijke geesten en veel bekwame lichamen, maar we missen die ene echte, uh.... probleemoplosser, die ons de voorsprong zal geven die we nodig hebben. Help ons.","Velkommen til det siste glimt av håp. Bare vi har den frie viljen til å motsette oss Ordenen. Vi har de skarpeste vitenskapelige hodene, og mange dyktige kropper, men vi mangler den ene virkelige... problemløseren, som vil gi oss det forspranget vi trenger. Hjelp oss.","Witaj w ostatniej iskierce nadziei. Tylko my mamy wolną wolę, aby sprzeciwić się Zakonowi. Mamy najmądrzejszych naukowców i wielu ludzi, ale brakuje nam kogoś porządnego by, ehmm... rozwiązać parę problemów, kogoś kto da nam przewagę, której potrzebujemy. Pomóż nam.","Seja bem-vindo à última ponta de esperança. Somente nós temos o livre arbítrio para combater a Ordem. Temos as mentes científicas mais afiadas e muitas pessoas capazes, mas nos falta aquele verdadeiro, hã... quebra-galho, que nos dará o impulso que precisamos. Ajude-nos.",,"Bun venit la ultima fărâmă de speranță. Numai noi avem voința liberă necesară pentru a ne opune Ordinului. Avem cele mai ascuțite minți științifice, și mulți oameni capabili de muncă, dar ne lipsește acel um... adevărat Salvator de la probleme, care să ne ofere avantajul de care avem nevoie. Ajută-ne.","Добро пожаловать в последний оплот надежды. Только мы обладаем свободной волей, чтобы противостоять Ордену. С нами лучшие учёные умы, и у нас есть много толковых людей, но нам не хватает одного-единственного, э... «решателя проблем», который поможет нам получить необходимое преимущество. Помоги нам.",,"Välkommen till den sista flimret av hopp. Endast vi har den fria viljan att motsätta oss Orden. Vi har de skarpaste vetenskapliga hjärnorna och många dugliga kroppar, men vi saknar den där riktiga... Problemlösaren, som kan ge oss det övertag vi behöver. Hjälp oss.","Son umut ışığına hoş geldiniz. Tarikat'a karşı koyacak özgür irade sadece bizde var. En keskin bilimsel zihinlere ve birçok yetenekli bedene sahibiz, ancak bize ihtiyacımız olan avantajı sağlayacak gerçek bir Problem Çözücüden yoksunuz. Bize yardım edin." -"All right, I accept.",TXT_RPLY0_SCRIPT03_D0_ALLRI,〃,,,"Dobře, příjimám.","Okay, jeg accepterer.","Klar, ich bin dabei.",,"Bone, mi akceptas.","Muy bien, acepto.",,"Hyvä on, suostun auttamaan.",Très bien. J'accepte.,"Rendben, elfogadom.","Va bene, accetto.",いいぞ、引き受けよう。,좋아요. 받아들이죠.,"Oké, ik accepteer het.","Greit, jeg aksepterer.","Dobrze, zgadzam się.","Tá certo, eu aceito.",,"În regulă, accept.",Хорошо. Я согласен.,,"Okej, jag accepterar.","Pekala, kabul ediyorum." -No thanks!,TXT_RPLY1_SCRIPT03_D0_NOTHA,〃,,,"Ne, díky.",Nej tak!,"Nein, danke!",,"Ne, dankon!","¡No, gracias!",,Ei kiitos!,Non merci.,Nem kösz!,"No, grazie!",断る!,사양할게요!,"Nee, dank je wel!",Nei takk!,"Nie, dziękuję!","Não, obrigado!",,Nu merci!,"Нет уж, спасибо!",,"Nej, tack!","Hayır, teşekkürler!" -"You might want to reconsider, seeing that you're surrounded by heavily armed angry rebels.",TXT_DLG_SCRIPT03_D1516_YOUMI,〃,,,"Možná bys o tom měl popřemýšlet, soudě podle toho, že jsi obklopen po zuby ozbrojenými, naštvanými rebely.","Du bør måske genoverveje det, når du er omgivet af tungt bevæbnede vrede oprørere.","Bitte überdenke das nochmal, angesichts der Tatsache, dass du von befaffneten und zornigen Rebellen umgeben bist.",,"Vi eble volos rekonsideri tion, se ni konsideras, ke vi estas ĉirkaŭita de ege armitaj kaj koleraj ribelantoj.","Puede que quieras reconsiderarlo, ya que estás rodeado de rebeldes ya hartos y bien armados.",,"Haluannet ehkä harkita uudelleen, ottaen huomioon, että ympärilläsi on vihainen joukko raskaasti aseistettuja kapinallisia.","J'espère que vous pouvez y réfléchir. Après tout, vous êtes entouré de rebelles lourdement armés et prêts à se défendre.","Azt ajánlanám, hogy gondold újra, lévén hogy mérges fegyveres lázadók vesznek körbe.","Forse faresti meglio a ripensarci, considerato che sei circondato da ribelli arrabbiati e armati.","少し考え直したほうが良さそうだぞ、 +"All right, I accept.",TXT_RPLY0_SCRIPT03_D0_ALLRI,〃,,,"Dobře, příjimám.","Okay, jeg accepterer.","Klar, ich bin dabei.",,"Bone, mi akceptas.","Muy bien, acepto.",,"Hyvä on, suostun auttamaan.",Très bien. J'accepte.,,"Rendben, elfogadom.","Va bene, accetto.",いいぞ、引き受けよう。,좋아요. 받아들이죠.,"Oké, ik accepteer het.","Greit, jeg aksepterer.","Dobrze, zgadzam się.","Tá certo, eu aceito.",,"În regulă, accept.",Хорошо. Я согласен.,,"Okej, jag accepterar.","Pekala, kabul ediyorum." +No thanks!,TXT_RPLY1_SCRIPT03_D0_NOTHA,〃,,,"Ne, díky.",Nej tak!,"Nein, danke!",,"Ne, dankon!","¡No, gracias!",,Ei kiitos!,Non merci.,,Nem kösz!,"No, grazie!",断る!,사양할게요!,"Nee, dank je wel!",Nei takk!,"Nie, dziękuję!","Não, obrigado!",,Nu merci!,"Нет уж, спасибо!",,"Nej, tack!","Hayır, teşekkürler!" +"You might want to reconsider, seeing that you're surrounded by heavily armed angry rebels.",TXT_DLG_SCRIPT03_D1516_YOUMI,〃,,,"Možná bys o tom měl popřemýšlet, soudě podle toho, že jsi obklopen po zuby ozbrojenými, naštvanými rebely.","Du bør måske genoverveje det, når du er omgivet af tungt bevæbnede vrede oprørere.","Bitte überdenke das nochmal, angesichts der Tatsache, dass du von befaffneten und zornigen Rebellen umgeben bist.",,"Vi eble volos rekonsideri tion, se ni konsideras, ke vi estas ĉirkaŭita de ege armitaj kaj koleraj ribelantoj.","Puede que quieras reconsiderarlo, ya que estás rodeado de rebeldes ya hartos y bien armados.",,"Haluannet ehkä harkita uudelleen, ottaen huomioon, että ympärilläsi on vihainen joukko raskaasti aseistettuja kapinallisia.","J'espère que vous pouvez y réfléchir. Après tout, vous êtes entouré de rebelles lourdement armés et prêts à se défendre.",,"Azt ajánlanám, hogy gondold újra, lévén hogy mérges fegyveres lázadók vesznek körbe.","Forse faresti meglio a ripensarci, considerato che sei circondato da ribelli arrabbiati e armati.","少し考え直したほうが良さそうだぞ、 君が重装備の怒れる兵士たちに 囲まれているのはわかるだろう?",다시... 생각을 해보는 게 좋을 것 같군요. 우리 병사들을 당황하게 만든 것 같은데 말이죠.,"Misschien wil je er nog eens over nadenken, aangezien je omringd wordt door zwaar bewapende, boze rebellen.","Du bør kanskje revurdere det, siden du er omringet av tungt bevæpnede, sinte opprørere.","Może zmienisz zdanie, kiedy zauważysz, że jesteś otoczony przez ciężko uzbrojonych, wściekłych rebeliantów.","Talvez você queira reconsiderar, já que está cercado de rebeldes furiosos armados até os dentes.",,"S-ar putea să vrei să reconsideri, având în vedere că ești înconjurat de rebeli nervoși înarmați până în dinți.","Возможно, при виде нервных и вооружённых до зубов повстанцев ты передумаешь.",,"Du kanske vill tänka om, eftersom du är omgiven av tungt beväpnade arga rebeller.",Etrafınız ağır silahlı kızgın asilerle çevrili olduğuna göre tekrar düşünmek isteyebilirsiniz. -"All right, I'm in!",TXT_RPLY0_SCRIPT03_D1516_ALLRI,〃,,,"Dobře, jdu do toho!","Okay, jeg er med!","Na gut, ich bin dabei.",,"Bone, mi aliĝos!","De acuerdo, ¡quiero entrar!",,"Hyvä on, olen messissä!","Ok, d'accord, j'accepte!","Rendben, benne vagyok!","Va bene, vi aiuterò!",わかった、乗ろう!,그럼 도와주도록 하죠.,"Oké, ik doe mee!","Greit, jeg er med!","Dobra, wchodzę w to!","Tá certo, estou dentro!",,"Bine, mă bag!","Хорошо, я с вами!",,"Okej, jag är med!","Pekala, ben varım!" -No thanks.,TXT_RPLY1_SCRIPT03_D1516_NOTHA,〃,,,"Ne, díky.",Nej tak.,"Nein, danke!",,"Ne, dankon.","No, gracias.",,Ei kiitos.,Non merci.,Nem kösz.,No grazie.,断る。,싫어요! 당신은 낯선 사람이잖아요!,"Nee, bedankt.",Nei takk.,"Nie, dziękuję.","Não, obrigado.",,Nu merci.,"Нет, спасибо.",,"Nej, tack.","Hayır, teşekkürler." -Then die in shame and dishonor.,TXT_DLG_SCRIPT03_D3032_THEND,〃,,Then die in shame and dishonour.,Pak zemři v hanbě a potupě!,Så dø i skam og vanære.,Dann wirst du in Schande und Unehre sterben.,,Tiuokaze mortu honte kaj senhonore.,Entonces muere en vergüenza y deshonra.,,Sitten kuole häpeässä vailla kunniaa.,Périssez dans la honte et le déshonneur.,Akkor szégyenteljes halál vár rád.,"E allora muori, con vergogna e disonore!",では、恥と不名誉と共に死ぬがいい。,그럼 불명예스럽고 초라하게 죽어버리시길!,Sterf dan in schaamte en oneer.,Så dø i skam og vanære.,Więc giń we wstydzie i hańbie.,Então morra com desonra e vergonha!,,Atunci mori în rușine și dezonoare.,Тогда умри в бесчестии и позоре.,,Dö då i skam och vanära.,O zaman utanç ve onursuzluk içinde öl. -"Good, Blackbird will continue to be your guide. She's taken quite a shine to you. Together you've got to unlock the secrets of the Order and their inhuman servants. Get inside and take them down.",TXT_DLG_SCRIPT03_D4548_GOODB,〃,,,"Dobře, Straka ti bude dále dávat pokyny. Docela ses jí zalíbil. Společně budete muset odkrýt tajemství Řádu a jeho nelidských služebníků. Pronikněte dovnitř a sejměte je.","Godt, Blackbird vil fortsat være din guide. Hun er blevet ret glad for dig. Sammen skal I løse hemmelighederne om Ordenen og deres umenneskelige tjenere. Kom ind og nedlæg dem.","Gut so! Blackbird wird weiter deine Leiterin sein, sie scheint dich zu mögen. Zusammen müsst ihr die Geheimnisse des Ordens und ihrer unmenschlichen Diener ergründen. Dann haben wir eine Chance, sie niederzuringen.",,"Bone. Merlo plue estos via gvidanto; ŝajnas, ke ŝi jam simpatias vin. Vi kune devas malkaŝi la sekretojn de La Ordeno kaj de ĝiaj nehomaj servantoj. Enŝoviĝu kaj detruu ilin.",Bien. Blackbird seguirá siendo tu guía; parece que ya le caes bien. Juntos debéis descubrir los secretos de La Orden y de sus sirvientes inhumanos. Infiltraos y acabad con ellos.,Bien. Blackbird va a seguir siendo tu guía; parece que ya le caes bien. Juntos deben descubrir los secretos de La Orden y de sus sirvientes inhumanos. Infíltrense y destrúyanlos.,Hyvä; Blackbird jatkaa opastajanasi. Hän vaikuttaa pitävän sinusta. Teidän on yhdessä paljastettava Veljeskunnan ja heidän epäinhimillisten palvelijoinsa salat. Murtaudu sisään ja aja heidät alas.,"Parfait. Blackbird continuera à être votre guide. Elle semble vous apprécier. Ensemble, vous allez découvrir les secrets de l'Ordre et leurs servants inhumains. Infiltrez-les et détruisez-les.","Helyes, Feketerigó továbbra is az irányítód lesz. Eléggé megtetszettél neki. Együtt meg fogjátok fejteni a Rend és kegyetlen szolgáinak titkait. Hatoljatok be és intézzétek el őket.",Bene. Blackbird continuerà ad essere la tua guida. Sembra ti abbia preso in simpatia. Insieme dovrete scoprire i segreti dell'Ordine e dei loro servi inumani. Bisognerà infiltrarlo e distruggerlo.,"よし、君のガイドをブラックバードが今後務める +"All right, I'm in!",TXT_RPLY0_SCRIPT03_D1516_ALLRI,〃,,,"Dobře, jdu do toho!","Okay, jeg er med!","Na gut, ich bin dabei.",,"Bone, mi aliĝos!","De acuerdo, ¡me uno!",,"Hyvä on, olen messissä!","Ok, d'accord, j'accepte!",,"Rendben, benne vagyok!","Va bene, vi aiuterò!",わかった、乗ろう!,그럼 도와주도록 하죠.,"Oké, ik doe mee!","Greit, jeg er med!","Dobra, wchodzę w to!","Tá certo, estou dentro!",,"Bine, mă bag!","Хорошо, я с вами!",,"Okej, jag är med!","Pekala, ben varım!" +No thanks.,TXT_RPLY1_SCRIPT03_D1516_NOTHA,〃,,,"Ne, díky.",Nej tak.,"Nein, danke!",,"Ne, dankon.","No, gracias.",,Ei kiitos.,Non merci.,,Nem kösz.,No grazie.,断る。,싫어요! 당신은 낯선 사람이잖아요!,"Nee, bedankt.",Nei takk.,"Nie, dziękuję.","Não, obrigado.",,Nu merci.,"Нет, спасибо.",,"Nej, tack.","Hayır, teşekkürler." +Then die in shame and dishonor.,TXT_DLG_SCRIPT03_D3032_THEND,〃,,Then die in shame and dishonour.,Pak zemři v hanbě a potupě!,Så dø i skam og vanære.,Dann wirst du in Schande und Unehre sterben.,,Tiuokaze mortu honte kaj senhonore.,Entonces muere en vergüenza y deshonra.,,Sitten kuole häpeässä vailla kunniaa.,Périssez dans la honte et le déshonneur.,,Akkor szégyenteljes halál vár rád.,"E allora muori, con vergogna e disonore!",では、恥と不名誉と共に死ぬがいい。,그럼 불명예스럽고 초라하게 죽어버리시길!,Sterf dan in schaamte en oneer.,Så dø i skam og vanære.,Więc giń we wstydzie i hańbie.,Então morra com desonra e vergonha!,,Atunci mori în rușine și dezonoare.,Тогда умри в бесчестии и позоре.,,Dö då i skam och vanära.,O zaman utanç ve onursuzluk içinde öl. +"Good, Blackbird will continue to be your guide. She's taken quite a shine to you. Together you've got to unlock the secrets of the Order and their inhuman servants. Get inside and take them down.",TXT_DLG_SCRIPT03_D4548_GOODB,〃,,,"Dobře, Straka ti bude dále dávat pokyny. Docela ses jí zalíbil. Společně budete muset odkrýt tajemství Řádu a jeho nelidských služebníků. Pronikněte dovnitř a sejměte je.","Godt, Blackbird vil fortsat være din guide. Hun er blevet ret glad for dig. Sammen skal I løse hemmelighederne om Ordenen og deres umenneskelige tjenere. Kom ind og nedlæg dem.","Gut so! Blackbird wird weiter deine Leiterin sein, sie scheint dich zu mögen. Zusammen müsst ihr die Geheimnisse des Ordens und ihrer unmenschlichen Diener ergründen. Dann haben wir eine Chance, sie niederzuringen.",,"Bone. Merlo plue estos via gvidanto; ŝajnas, ke ŝi jam simpatias vin. Vi kune devas malkaŝi la sekretojn de La Ordeno kaj de ĝiaj nehomaj servantoj. Enŝoviĝu kaj detruu ilin.",Bien. Blackbird seguirá siendo tu guía; parece que ya le caes bien. Juntos debéis descubrir los secretos de La Orden y de sus sirvientes inhumanos. Infiltraos y acabad con ellos.,Bien. Blackbird va a seguir siendo tu guía; parece que ya le caes bien. Juntos deben descubrir los secretos de La Orden y de sus sirvientes inhumanos. Infíltrense y destrúyanlos.,Hyvä; Blackbird jatkaa opastajanasi. Hän vaikuttaa pitävän sinusta. Teidän on yhdessä paljastettava Veljeskunnan ja heidän epäinhimillisten palvelijoinsa salat. Murtaudu sisään ja aja heidät alas.,"Parfait. Blackbird continuera à être votre guide. Elle semble vous apprécier. Ensemble, vous allez découvrir les secrets de l'Ordre et leurs servants inhumains. Infiltrez-les et détruisez-les.",,"Helyes, Feketerigó továbbra is az irányítód lesz. Eléggé megtetszettél neki. Együtt meg fogjátok fejteni a Rend és kegyetlen szolgáinak titkait. Hatoljatok be és intézzétek el őket.",Bene. Blackbird continuerà ad essere la tua guida. Sembra ti abbia preso in simpatia. Insieme dovrete scoprire i segreti dell'Ordine e dei loro servi inumani. Bisognerà infiltrarlo e distruggerlo.,"よし、君のガイドをブラックバードが今後務める 彼女は君に感心しているようだぞ。 君達の二人で、オーダーとその人間離れした 手下たちが持っている秘密を暴いてもらいたい。 奴等の基地に潜り込んで、倒すんだ。","좋군요. 블랙버드가 당신에게 지시를 계속 내려줄 겁니다. 당신을 꽤 신뢰하는 듯하더군요. 우리는 오더와 그들의 잔혹한 심복들의 실체를 파헤치고 폭로할 겁니다. 비밀을 헤집고 그들을 몰락시켜 버리세요. \cy듣기만 해도 꿈에 그리던 일만 같네, 그렇지?","Goed, Blackbird zal je gids blijven. Ze heeft een behoorlijke glans aan je genomen. Samen moeten jullie de geheimen van de Orde en hun onmenselijke dienaren ontrafelen. Ga naar binnen en haal ze naar beneden.","Bra, Blackbird vil fortsette å være din guide. Hun har blitt ganske betatt av deg. Sammen må dere avsløre hemmelighetene til Ordenen og deres umenneskelige tjenere. Gå inn og ta dem.","Dobrze, Blackbird dalej będzie twoją przewodniczką. Chyba przepada za tobą. Wspólnie musicie odkryć sekrety zakonu i ich nieludzkich sług. Idź tam i załatw ich.",Ótimo. Blackbird continuará sendo a sua guia. Parece que ela vai com a sua cara. Juntos vocês desvendarão os segredos da Ordem e de seus discípulos desumanos. Entre lá e elimine eles.,,"Bun, Blackbird va fi ghidul tău în continuare. A luat ceva înteres în tine. Împreună trebuie să descoperiți secretele Ordinului și slujitorii lor inumani. Dați buzna ți puneții la pământ.",Хорошо. Чёрный дрозд останется твоим проводником. Она тебе несколько симпатизирует. Вместе вы раскроете секреты Ордена и его нечеловеческих слуг. Проникни туда и покончи с ними! ,,"Bra, Blackbird kommer att fortsätta att vara din guide. Hon har blivit ganska förtjust i dig. Tillsammans måste ni avslöja hemligheterna om Orden och deras omänskliga tjänare. Gå in och ta ner dem.","Güzel, Karatavuk rehberiniz olmaya devam edecek. Senden oldukça hoşlandı. Birlikte Tarikat'ın ve insanlık dışı hizmetkârlarının sırlarını çözmelisiniz. İçeri gir ve onları alaşağı et." -Where do I start?,TXT_RPLY0_SCRIPT03_D4548_WHERE,〃,,,Kde mám začít?,Hvor skal jeg begynde?,Wo fange ich an?,,Kie mi komencu?,¿Por dónde empiezo?,,Mistä aloitan?,Où est-ce que je commence?,Hol kezdjem?,Da dove comincio?,どこから始めればいいんだ?,어디서부터 시작하면 되죠?,Waar moet ik beginnen?,Hvor skal jeg begynne?,Gdzie zaczynam?,Por onde eu começo?,,Unde încep?,С чего мне начать?,,Var börjar jag?,Nereden başlayacağım? -Frankly the situation is a mess. You must accomplish several missions to prepare the way for more attacks on the Order. Our last raid was a disaster and most of our troops were captured. I need you to free these prisoners.,TXT_DLG_SCRIPT03_D6064_FRANK,〃 (Prison mission),,,"Upřímně, současná situace je úděsná. Musíš splnit několik misí před dalšími útoky na Řád. Náš poslední nájezd byla katastrofa a většina našich vojáků byla zajata. Potřebuju, abys tyto vězně vysvobodil.","Helt ærligt, situationen er et rod. Du skal udføre flere missioner for at bane vejen for flere angreb på Ordenen. Vores sidste angreb var en katastrofe, og de fleste af vores tropper blev taget til fange. Jeg har brug for, at du befrier disse fanger.","Ehrlich gesagt, die Situation ist eine Sauerei. Du musst mehrere Aufgaben erfüllen um den Weg für weitere Angriffe vorzubereiten. Der letzte Überfall war ein Desaster und die meisten unserer Leute wurden gefangengenommen. Du musst sie wieder befreien.",,"Sincere la situacio estas malordo. Vi devas plenumi diversajn misiojn, por ke ni povu prepari pliajn atakojn kontraŭ La Ordeno. Ni malvenkis la lastan kaj tial La Ordeno kaptis la plimulton de niaj trupoj; mi bezonas, ke vi liberigu ilin.","La situación es un lío, a decir verdad. Debes completar varias misiones para poder preparar más ataques contra La Orden. Nuestra última incursión fue un desastre y la mayoría de nuestras tropas fueron capturadas; necesito que las liberes.",,"Rehellisesti sanoen tilanne on sekasortoinen. Sinun on suoritettava lukuisia tehtäviä valmistaaksesi tien lisähyökkäyksille Veljeskuntaa vastaan. Viimeisin hyökkäyksemme oli katastrofi, ja suurin osa joukoistamme vangittiin. Tarvitsen sinua vapauttamaan nämä vangit.","Franchement, nous sommes dans un bazar sans précédent. Vous devez accomplir de nombreuses missions pour préparer nos futures attaques contre l'Ordre. Notre dernier raid à été un désastre et la majorité de nos troupes ont été capturées. Il faut que vous les libérez.","Őszintén szólva a szituáció elég zűrzavaros. Több küldetést is véghez kell vinned, hogy előkészítsd a támadás következő hullámát a Rend ellen. A legutolsó portyánk egy óriási kudarc volt, és a legtöbb egységünket elfogták. Ki kell, hogy engedd őket!","Francamente, la situazione è critica. Dovrai completare diverse missioni per far si da poter preparare nuovi attacchi contro l'Ordine. La nostra ultima incursione è stata in disastro, e la maggiorparte delle nostre truppe sono state catturate. Ho bisogno che tu liberi questi prigionieri.","はっきり言えば、今の状況は全く良くない。 +Where do I start?,TXT_RPLY0_SCRIPT03_D4548_WHERE,〃,,,Kde mám začít?,Hvor skal jeg begynde?,Wo fange ich an?,,Kie mi komencu?,¿Por dónde empiezo?,,Mistä aloitan?,Où est-ce que je commence?,,Hol kezdjem?,Da dove comincio?,どこから始めればいいんだ?,어디서부터 시작하면 되죠?,Waar moet ik beginnen?,Hvor skal jeg begynne?,Gdzie zaczynam?,Por onde eu começo?,,Unde încep?,С чего мне начать?,,Var börjar jag?,Nereden başlayacağım? +Frankly the situation is a mess. You must accomplish several missions to prepare the way for more attacks on the Order. Our last raid was a disaster and most of our troops were captured. I need you to free these prisoners.,TXT_DLG_SCRIPT03_D6064_FRANK,〃 (Prison mission),,,"Upřímně, současná situace je úděsná. Musíš splnit několik misí před dalšími útoky na Řád. Náš poslední nájezd byla katastrofa a většina našich vojáků byla zajata. Potřebuju, abys tyto vězně vysvobodil.","Helt ærligt, situationen er et rod. Du skal udføre flere missioner for at bane vejen for flere angreb på Ordenen. Vores sidste angreb var en katastrofe, og de fleste af vores tropper blev taget til fange. Jeg har brug for, at du befrier disse fanger.","Ehrlich gesagt, die Situation ist eine Sauerei. Du musst mehrere Aufgaben erfüllen um den Weg für weitere Angriffe vorzubereiten. Der letzte Überfall war ein Desaster und die meisten unserer Leute wurden gefangengenommen. Du musst sie wieder befreien.",,"Sincere la situacio estas malordo. Vi devas plenumi diversajn misiojn, por ke ni povu prepari pliajn atakojn kontraŭ La Ordeno. Ni malvenkis la lastan kaj tial La Ordeno kaptis la plimulton de niaj trupoj; mi bezonas, ke vi liberigu ilin.","La situación es un lío, a decir verdad. Debes completar varias misiones para poder preparar más ataques contra La Orden. Nuestra última incursión fue un desastre y la mayoría de nuestras tropas fueron capturadas; necesito que las liberes.",,"Rehellisesti sanoen tilanne on sekasortoinen. Sinun on suoritettava lukuisia tehtäviä valmistaaksesi tien lisähyökkäyksille Veljeskuntaa vastaan. Viimeisin hyökkäyksemme oli katastrofi, ja suurin osa joukoistamme vangittiin. Tarvitsen sinua vapauttamaan nämä vangit.","Franchement, nous sommes dans un bazar sans précédent. Vous devez accomplir de nombreuses missions pour préparer nos futures attaques contre l'Ordre. Notre dernier raid à été un désastre et la majorité de nos troupes ont été capturées. Il faut que vous les libérez.",,"Őszintén szólva a szituáció elég zűrzavaros. Több küldetést is véghez kell vinned, hogy előkészítsd a támadás következő hullámát a Rend ellen. A legutolsó portyánk egy óriási kudarc volt, és a legtöbb egységünket elfogták. Ki kell, hogy engedd őket!","Francamente, la situazione è critica. Dovrai completare diverse missioni per far si da poter preparare nuovi attacchi contro l'Ordine. La nostra ultima incursione è stata in disastro, e la maggiorparte delle nostre truppe sono state catturate. Ho bisogno che tu liberi questi prigionieri.","はっきり言えば、今の状況は全く良くない。 君は複数の任務をこなし、オーダーへの 攻撃態勢を整える必要がある。 我々が行ったこの前の襲撃は大失敗で、 ほとんどの兵たちは捕らえられてしまった。 君にはその捕らえられた者たちを 救助してもらいたい。","애석하게도, 현재 상황은 엉망입니다. 우리가 오더를 공습하기 전에 당신이 수행해야 할 일이 몇 가지 있습니다. 몇 주 전 공습은 비참한 결과로 끝났고, 대부분의 병사가 감금당했습니다. 그들을 풀어주어야만 합니다.",Eerlijk gezegd is de situatie een puinhoop. Je moet verschillende missies volbrengen om de weg te bereiden voor meer aanvallen op de Orde. Onze laatste inval was een ramp en de meeste van onze troepen werden gevangen genomen. Ik heb je nodig om deze gevangenen te bevrijden.,"Ærlig talt er situasjonen et rot. Du må utføre flere oppdrag for å bane vei for flere angrep på Ordenen. Vårt siste angrep var en katastrofe, og de fleste av våre tropper ble tatt til fange. Du må befri disse fangene.","Szczerze to mamy tu bałagan. Musisz ukończyć kilka misji, by przygotować drogę na więcej ataków na Zakon. Nasz ostatni nalot był porażką i większość naszych żołnierzy została złapana. Potrzebuję cię, byś uwolnił tych więźniów.",Sinceramente a situação é uma bagunça. Você precisa cumprir algumas missões para preparar o caminho para mais ataques contra a Ordem. Nossa última invasão foi um desastre e muitas das nossas tropas foram capturadas. Preciso que você liberte esses prisioneiros.,,Sincer situația e nasoală. Trebuie să îndepliniți câteva misiune pentru a pregătii calea pentru mai multe atacuri asupra Ordinului. Ultimul nostru raid a fost un dezastru și majoritatea trupelor noastre au fost capturate. Am nevoie ca voi să eliberați prizonierii.,"Честно говоря, наши дела идут не лучшим образом. Тебе предстоит выполнить несколько заданий, чтобы подготовить почву для дальнейших атак на Орден. Наша последняя вылазка обернулась катастрофой, и большинство наших бойцов были схвачены. Мне нужно, чтобы ты освободил их.",,Ärligt talat är situationen en enda röra. Du måste utföra flera uppdrag för att bereda vägen för fler attacker mot Orden. Vår senaste räd var en katastrof och de flesta av våra trupper blev tillfångatagna. Jag behöver dig för att befria dessa fångar.,Açıkçası durum tam bir karmaşa. Tarikat'a daha fazla saldırının yolunu hazırlamak için birkaç görevi tamamlamalısınız. Son baskınımız bir felaketti ve askerlerimizin çoğu esir alındı. Bu esirleri serbest bırakmanı istiyorum. -I think I can handle it.,TXT_RPLY0_SCRIPT03_D6064_ITHIN,〃 (〃),,,"Myslím, že to zvládnu.","Jeg tror, jeg kan klare det.","Ich denke, das kann ich schaffen.",,"Mi pensas, ke mi povos fari tion.",Creo poder hacerlo.,,Eiköhän se onnistu.,Je pense pouvoir m'en occuper.,Azt hiszem el tudom intézni.,Penso di potercela fare.,俺ならできるはずだ。,아마도 제가 할 수 있을 것 같군요.,Ik denk dat ik het aankan.,Jeg tror jeg kan klare det.,"Myślę, że dam sobie z tym radę.",Acho que eu posso dar conta disso.,,Cred că mă pot descurca.,"Думаю, справлюсь.",,Jag tror att jag klarar av det.,Sanırım ben halledebilirim. -"Take this money and visit Irale who supplies our weapons. Then, this key will get you in to see the Governor. He's a corrupt puppet of the Order, but he loves to make deals. Do whatever you need to free our brothers in arms.",TXT_DLG_SCRIPT03_D7580_TAKET,〃 (〃),,,"Vem si tohle zlato a navštiv Iraleho, který nás zásobuje zbraněmi. Tento klíč tě pak dostane ke guvernérovi. Je to jen zkorumpovaná loutka Řádu, ale zbožňuje nabídky. Udělej cokoliv je třeba, abys osvobodil naše bratry ve zbrani.","Tag disse penge og besøg Irale, som leverer vores våben. Så vil denne nøgle give dig adgang til guvernøren. Han er en korrupt marionet af Ordenen, men han elsker at lave aftaler. Gør hvad du skal gøre for at befri vores våbenbrødre.","Nimm das Geld hier und geh zu Irale, der und mit Waffen versorgt. Und dieser Schlüssel erlaubt die Zutritt zum Haus des Gouverneurs. Er ist eine korrupte Marionette des Ordens aber er liebt es, Deals zu machen. Mach was nötig ist um unsere Waffenbrüder zu befreien.",,"Prenu ĉi tiun monon kaj renkontu Irale-n, la provizanto de niaj armiloj. Poste ĉi tiu ŝlosilo ebligos al vi renkonti la registon. Li estas koruptita marioneto de La Ordeno, sed li ŝategas intertraktadojn. Faru tion ajn, kion vi bezonas por liberigi niajn soldatojn.","Toma este dinero y ve a ver a Irale, que suministra nuestras armas. Después, esta llave te servirá para ver al gobernador. Es una marioneta corrupta de La Orden, pero le encantan los tratos. Haz lo que creas necesario para liberar a nuestros conmilitones.","Toma este dinero y ve a ver a Irale, que suministra nuestras armas. Después, esta llave te va a servir para ver al gobernador. Es una marioneta corrupta de La Orden, pero le encantan los tratos. Haz lo que creas necesario para liberar a nuestros conmilitones.","Ota tästä rahaa ja käväise Iralen luona, joka toimittaa meidän aseemme. Sitten tällä avaimella pääset tapaamaan kuvernööriä. Hän on Veljeskunnan läpimätä sätkynukke, mutta hän rakastaa tehdä kauppoja. Tee kaikkesi vapauttaaksesi aseveljemme.",Prenez cet argent et allez voir Irale qui nous approvisionne en armes. Utilisez ensuite cette clé pour aller voir le gouverneur. Il est un pantin de l'Ordre mais il adore faire affaires. Faites ce qu'il faut pour libérer nos compatriotes.,"Fogd ezt a pénzt, és látogasd meg Irale-t a fegyverellátónkat. Azután, ezzel a kulccsal be tudsz jutni a kormányzóhoz. Ő a Rend egy korrupt bábja, de imád üzletet kötni. Tegyél meg mindent, hogy kiszabadítsd a bajtársainkat.","Prendi questo denaro e vai da Irale, uno dei nostri fornitori d'armi. Dopodiché, con questa chiave potrai entrare nella dimora del governatore. È un pupazzo corrotto dell'Ordine, ma adora trattare sottobanco. Fai tutto il necessario per liberare i nostri compagni d'arme.","この金で、我らの武器を調達してくれている +I think I can handle it.,TXT_RPLY0_SCRIPT03_D6064_ITHIN,〃 (〃),,,"Myslím, že to zvládnu.","Jeg tror, jeg kan klare det.","Ich denke, das kann ich schaffen.",,"Mi pensas, ke mi povos fari tion.",Creo poder hacerlo.,,Eiköhän se onnistu.,Je pense pouvoir m'en occuper.,,Azt hiszem el tudom intézni.,Penso di potercela fare.,俺ならできるはずだ。,아마도 제가 할 수 있을 것 같군요.,Ik denk dat ik het aankan.,Jeg tror jeg kan klare det.,"Myślę, że dam sobie z tym radę.",Acho que eu posso dar conta disso.,,Cred că mă pot descurca.,"Думаю, справлюсь.",,Jag tror att jag klarar av det.,Sanırım ben halledebilirim. +"Take this money and visit Irale who supplies our weapons. Then, this key will get you in to see the Governor. He's a corrupt puppet of the Order, but he loves to make deals. Do whatever you need to free our brothers in arms.",TXT_DLG_SCRIPT03_D7580_TAKET,〃 (〃),,,"Vem si tohle zlato a navštiv Iraleho, který nás zásobuje zbraněmi. Tento klíč tě pak dostane ke guvernérovi. Je to jen zkorumpovaná loutka Řádu, ale zbožňuje nabídky. Udělej cokoliv je třeba, abys osvobodil naše bratry ve zbrani.","Tag disse penge og besøg Irale, som leverer vores våben. Så vil denne nøgle give dig adgang til guvernøren. Han er en korrupt marionet af Ordenen, men han elsker at lave aftaler. Gør hvad du skal gøre for at befri vores våbenbrødre.","Nimm das Geld hier und geh zu Irale, der und mit Waffen versorgt. Und dieser Schlüssel erlaubt die Zutritt zum Haus des Gouverneurs. Er ist eine korrupte Marionette des Ordens aber er liebt es, Deals zu machen. Mach was nötig ist um unsere Waffenbrüder zu befreien.",,"Prenu ĉi tiun monon kaj renkontu Irale-n, la provizanto de niaj armiloj. Poste ĉi tiu ŝlosilo ebligos al vi renkonti la registon. Li estas koruptita marioneto de La Ordeno, sed li ŝategas intertraktadojn. Faru tion ajn, kion vi bezonas por liberigi niajn soldatojn.","Toma este dinero y ve a ver a Irale, que suministra nuestras armas. Después, esta llave te servirá para ver al gobernador. Es una marioneta corrupta de La Orden, pero le encantan los tratos. Haz lo que creas necesario para liberar a nuestros conmilitones.","Toma este dinero y ve a ver a Irale, que suministra nuestras armas. Después, esta llave te va a servir para ver al gobernador. Es una marioneta corrupta de La Orden, pero le encantan los tratos. Haz lo que creas necesario para liberar a nuestros conmilitones.","Ota tästä rahaa ja käväise Iralen luona, joka toimittaa meidän aseemme. Sitten tällä avaimella pääset tapaamaan kuvernööriä. Hän on Veljeskunnan läpimätä sätkynukke, mutta hän rakastaa tehdä kauppoja. Tee kaikkesi vapauttaaksesi aseveljemme.",Prenez cet argent et allez voir Irale qui nous approvisionne en armes. Utilisez ensuite cette clé pour aller voir le gouverneur. Il est un pantin de l'Ordre mais il adore faire affaires. Faites ce qu'il faut pour libérer nos compatriotes.,,"Fogd ezt a pénzt, és látogasd meg Irale-t a fegyverellátónkat. Azután, ezzel a kulccsal be tudsz jutni a kormányzóhoz. Ő a Rend egy korrupt bábja, de imád üzletet kötni. Tegyél meg mindent, hogy kiszabadítsd a bajtársainkat.","Prendi questo denaro e vai da Irale, uno dei nostri fornitori d'armi. Dopodiché, con questa chiave potrai entrare nella dimora del governatore. È un pupazzo corrotto dell'Ordine, ma adora trattare sottobanco. Fai tutto il necessario per liberare i nostri compagni d'arme.","この金で、我らの武器を調達してくれている イラールの元を訪ねて行け。 その次に、この鍵を使って知事に会え。 知事はオーダーの腐敗した傀儡だが取引には 興味を持ってくれる。我々の仲間を助けるために どんな手でも使ってくれ。","이 돈을 가지고 마을의 무기상인 이롤리를 찾아가시길 바랍니다. 그리고 이 열쇠만 있으면 모렐 총독을 쉽게 만날 수 있을 겁니다. 그는 부패한 오더의 앞잡이지만, 거래에 미쳐있죠. 우리 요원들을 풀어줄 무슨 수단이든 강구해 보시길. \cy그리고 내가 너와 함께 있어 줄께.","Neem dit geld en bezoek Irale die onze wapens levert. Dan zal deze sleutel je naar binnen brengen om de Gouverneur te zien. Hij is een corrupte marionet van de Orde, maar hij houdt ervan om deals te sluiten. Doe alles wat je nodig hebt om onze broeders te bevrijden.","Ta disse pengene og besøk Irale som leverer våpnene våre. Med denne nøkkelen kommer du inn til guvernøren. Han er en korrupt nikkedukke for Ordenen, men han elsker å inngå avtaler. Gjør det du må for å befri våre våpenbrødre.","Weź te pieniądze i idź do Irale, który dostarcza nam bronie. Potem, ten klucz pozwoli ci spotkać się z Gubernatorem. Jest on skorumpowaną marionetką Zakonu, ale lubi robić interesy. Rób co musisz by uwolnić naszych towarzyszy broni.","Pegue este dinheiro e visite o Irale, nosso fornecedor de armas. Depois use esta chave para entrar e falar com o Governador. Ele é um fantoche corrupto da Ordem mas ele adora negociar. Faça o que for necessário para libertar os nossos irmãos de armas.",,"Ia acești bani și vizitează pe Irale, cel care ne aprovizionează cu arme. Apoi, cheia asta îți va permite să intri să îl vezi pe Guvernator. El este o marionetă coruptă a Ordinului, dar adoră să facă târguri. Fă orice e necesar pentru a ne putea elibera frații.","Возьми эти деньги и посети Ирэйла, нашего поставщика оружия. Затем, с этим ключом, ты пройдёшь к губернатору. Он продажная марионетка Ордена, но обожает торговаться. Делай всё, что сочтёшь нужным, но освободи наших братьев по оружию.",,"Ta de här pengarna och besök Irale som levererar våra vapen. Sedan kommer den här nyckeln att ge dig tillträde till guvernören. Han är en korrupt marionett för Orden, men han älskar att göra affärer. Gör vad du behöver för att befria våra vapenbröder.","Bu parayı al ve silahlarımızı tedarik eden İrale'yi ziyaret et. Sonra, bu anahtar seni valiyi görmeye götürecek. Tarikat'ın yozlaşmış bir kuklasıdır ama anlaşma yapmayı sever. Silah arkadaşlarımızı serbest bırakmak için ne gerekiyorsa yap." -I'll see to it.,TXT_RPLY0_SCRIPT03_D7580_ILLSE,〃 (〃),,,Dohlédnu na to.,Jeg skal nok sørge for det.,"Ich seh, was ich machen kann.",,"Mi vidos tion, kion mi faru.",Veré qué hacer.,Voy a ver qué hacer.,Hoidan asian.,Je m'y attelle.,Megteszem.,Mi darò da fare.,了解した。,한 번 확인하러 가보겠습니다.,Ik zal ervoor zorgen.,Jeg skal sørge for det.,Zajmę się tym.,Vou dar um jeito nisso.,,O să mă ocup.,Я позабочусь об этом.,,Jag ska se till det.,Ben halledeceğim. -Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D9096_FIGHT,〃 (〃),,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het Front en vrijheid. Verhuizen.,Kjemp for Fronten og friheten. Av sted.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. -"The prisoners have been welcomed back, thanks to you. Here's some gold, go visit the medic and the weapons trainer and then, I have higher goals for you.",TXT_DLG_SCRIPT03_D10612_THEPR,〃 (Crystal mission),,,"Vězně jsme, díky tobě, přivítali zpět. Tady je nějaké zlato, jdi navštívit zdravotníka a zbraňmistra. Pak mám pro tebe vyšší cíle.","Fangerne er blevet budt velkommen tilbage, takket være dig. Her er lidt guld, besøg lægen og våbentræneren, og så har jeg højere mål for dig.","Die Gefangenen sind zu uns zrückgekehrt, dank dir. Hier hast du etwas Gold, schau mal beim Sanitäter und beim Waffentrainer rein, danach sind höhere Ziele in Aussicht.",,"Ni povis rebonveni la ekskaptitojn danke al vi. Jen iom da oro; iru renkonti la kuraciston kaj la armilan trejniston, kaj tiam mi havas pli altajn celojn por vi.","Los prisioneros ya han sido bienvenidos de vuelta gracias a ti. Toma este oro, ve a ver al médico y al entrenador de armas, y después... tengo mayores metas para ti.","Los prisioneros ya fueron bienvenidos de vuelta gracias a ti. Toma este oro, ve a ver al médico y al entrenador de armas, y después... tengo mayores metas para ti.","Vangit on otettu takaisin vastaan, kiitos sinun. Tässä kultaa; mene tapaamaan lääkintämiestä ja asekouluttajaa, minkä jälkeen minulla on sinulle korkeampia tavoitteita.","Les prisonniers sont revenus à bon port, grâce à vous. Voici de l'argent, allez voir le médecin et le maître d'armes, puis j'aurais d'autres missions pour vous.","A foglyok visszatértek hála neked. Itt van valamennyi arany, látogasd meg a szanitécot és a fegyverkereskedőt, aztán térj vissza mert nagy céljaim vannak veled.","I prigionieri sono stati riportati sani e salvi, grazie a te. Ecco dell'oro. Visita il dottore e l'istruttore d'armi, e poi, ho altri obiettivi per te.","逃げ出した囚人たちを迎え入れた。 +I'll see to it.,TXT_RPLY0_SCRIPT03_D7580_ILLSE,〃 (〃),,,Dohlédnu na to.,Jeg skal nok sørge for det.,"Ich seh, was ich machen kann.",,"Mi vidos tion, kion mi faru.",Veré qué hacer.,Voy a ver qué hacer.,Hoidan asian.,Je m'y attelle.,,Megteszem.,Mi darò da fare.,了解した。,한 번 확인하러 가보겠습니다.,Ik zal ervoor zorgen.,Jeg skal sørge for det.,Zajmę się tym.,Vou dar um jeito nisso.,,O să mă ocup.,Я позабочусь об этом.,,Jag ska se till det.,Ben halledeceğim. +Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D9096_FIGHT,〃 (〃),,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het Front en vrijheid. Verhuizen.,Kjemp for Fronten og friheten. Av sted.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. +"The prisoners have been welcomed back, thanks to you. Here's some gold, go visit the medic and the weapons trainer and then, I have higher goals for you.",TXT_DLG_SCRIPT03_D10612_THEPR,〃 (Crystal mission),,,"Vězně jsme, díky tobě, přivítali zpět. Tady je nějaké zlato, jdi navštívit zdravotníka a zbraňmistra. Pak mám pro tebe vyšší cíle.","Fangerne er blevet budt velkommen tilbage, takket være dig. Her er lidt guld, besøg lægen og våbentræneren, og så har jeg højere mål for dig.","Die Gefangenen sind zu uns zrückgekehrt, dank dir. Hier hast du etwas Gold, schau mal beim Sanitäter und beim Waffentrainer rein, danach sind höhere Ziele in Aussicht.",,"Ni povis rebonveni la ekskaptitojn danke al vi. Jen iom da oro; iru renkonti la kuraciston kaj la armilan trejniston, kaj tiam mi havas pli altajn celojn por vi.","Los prisioneros ya han sido bienvenidos de vuelta gracias a ti. Toma este oro, ve a ver al médico y al entrenador de armas, y después... tengo mayores metas para ti.","Los prisioneros ya fueron bienvenidos de vuelta gracias a ti. Toma este oro, ve a ver al médico y al entrenador de armas, y después... tengo mayores metas para ti.","Vangit on otettu takaisin vastaan, kiitos sinun. Tässä kultaa; mene tapaamaan lääkintämiestä ja asekouluttajaa, minkä jälkeen minulla on sinulle korkeampia tavoitteita.","Les prisonniers sont revenus à bon port, grâce à vous. Voici de l'argent, allez voir le médecin et le maître d'armes, puis j'aurais d'autres missions pour vous.",,"A foglyok visszatértek hála neked. Itt van valamennyi arany, látogasd meg a szanitécot és a fegyverkereskedőt, aztán térj vissza mert nagy céljaim vannak veled.","I prigionieri sono stati riportati sani e salvi, grazie a te. Ecco dell'oro. Visita il dottore e l'istruttore d'armi, e poi, ho altri obiettivi per te.","逃げ出した囚人たちを迎え入れた。 君の活躍に感謝する。幾つか報酬を与えよう。 それとメディックと訓練師も訪ねるといい、 その後に頼みたいことがある。",감금된 병사들이 당신 덕에 다시 돌아왔습니다. 정말 감사드립니다! 이 보상을 받으시고 의무관이랑 무기 담당관을 찾아뵈시길 바랍니다. 또 다른 임무가 기다리고 있으니까요.,"De gevangenen zijn dankzij u weer welkom teruggekomen. Hier is wat goud, ga naar de dokter en de wapentrainer en dan heb ik hogere doelen voor je.","Fangene har blitt ønsket velkommen tilbake, takket være deg. Her er litt gull, gå og besøk saniteten og våpentreneren, og så har jeg høyere mål for deg.","Więźniowie zostali ponownie powitani, wszystko dzięki tobie. Masz tu trochę złota, idź do medyka i instruktora broni, a potem powiem ci jakie większe zadania mam dla ciebie.","Recebemos os prisioneiros de volta, graças a você. Pegue este dinheiro, visite o médico, o treinador de armas e depois eu vou te dar uns objetivos mais importantes.",,"Prizonierii au fost primiți înapoi, mulțumită ție. Uite niște aur, vizitează medicul și antrenorul de arme, după aceea, am planuri mai mărețe pentru tine.","Благодаря тебе, пленники вернулись к нам. Вот немного золота. Посети медика и инструктора по стрельбе, а потом тебя ждут ещё более ответственные задания.",,"Fångarna har välkomnats tillbaka, tack vare dig. Här är lite guld, besök läkaren och vapentränaren och sedan har jag högre mål för dig.","Sayende mahkumlar geri döndü. İşte biraz altın, sıhhiyeciyi ve silah eğitmenini ziyaret et ve sonra, senin için daha yüksek hedeflerim var." -I will. What's next?,TXT_RPLY0_SCRIPT03_D10612_IWILL,〃 (〃),,,Půjdu. Co dál?,Det vil jeg gøre. Hvad er det næste?,"Alles klar, was gibt's als Nächstes?",,Kompreneble. Kio sekvas?,Lo haré. ¿Qué sigue?,Claro. ¿Qué sigue?,Menen. Mitä seuraavaksi on luvassa?,"Très bien, quoi maintenant?",Így teszek. Mi a következő lépés?,Lo farò. Qual'è la prossima mossa?,次は何だ?,그렇군요. 그 다음은 뭐죠?,Dat zal ik doen. Wat is het volgende?,Det skal jeg gjøre. Hva er det neste?,Dobrze. Co dalej?,Farei isso. Qual a próxima missão?,,Mă voi conforma. Ce facem mai departe?,Хорошо. Что дальше?,,Det kommer jag att göra. Vad kommer härnäst?,Yapacağım. Sırada ne var? -"A single crystal runs the power grid which drives the Order's shields. Destroy that crystal and you will punch huge holes in the Order's defenses. Blackbird will lead you to a spy who has a way in, good luck.",TXT_DLG_SCRIPT03_D12128_ASING,〃 (〃),,,"Elektrická síť, kterou jsou poháněné štíty Řádu, je napájena z jednoho krystalu. Znič ten krystal a zasaď tak obří ránu obranám Řádu. Straka tě navede ke špiónovi, který zná cestu dovnitř. Hodně štěstí.","En enkelt krystal driver det kraftnet, der driver ordenens skjolde. Ødelæg det krystal, og du vil slå store huller i Ordenens forsvar. Blackbird vil føre dig til en spion, der har en vej ind, held og lykke.","Ein einziger Kristall kontrolliert das gesamte Energiesystem für die Kraftschilde des Ordens. Zerstöre diesen Kristall und du wirst riesige Löcher in die Verteidigungsanlagen des Ordens schlagen. Blackbird führt dich zu einem Spion, der dir Einlass verschaffen kann. Viel Glück.",,"Ununura kristalo nutras la elektrizan sistemon, kiu tenas la ŝildojn de la kastelo. Detruu ĝin por fari grandegan «breĉon» en la defendojn de La Ordeno. Merlo gvidos vin al spiono, kiu havas manieron eniri. Ŝancon.",Un único cristal alimenta la red eléctrica que mantiene los escudos del castillo. Destruye ese cristal para abrir grandes brechas en las defensas de La Orden. Blackbird te guiará hacia un espía que tiene una forma de entrar. Buena suerte.,Un único cristal alimenta la red eléctrica que mantiene los escudos del castillo. Destruye ese cristal para abrir grandes brechas en las defensas de La Orden. Blackbird te va a guiar hacia un espía que tiene una forma de entrar. Buena suerte.,"Kaupungin sähköverkon voimanlähteenä toimii yksittäinen kristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Tuhoamalla kristallin puhkot valtavia reikiä Veljeskunnan puolustuksiin. Blackbird opastaa sinut vakoojan luo, jolla on sisäänpääsykeino. Lykkyä tykö.",Un seul cristal fait fonctionner la grille énergétique qui alimente les boucliers de l'Ordre. Détruisez ce cristal et vous créez des énormes failles dans les défenses de l'Ordre. Blackbird va vous mener à un espion qui a un moyen de vous faire rentrer. Bonne chance.,"Egyetlen krisztály hajtja az energia hálózatot, erre van rákötve a Rend pajzsa. Semmisítsd meg ezt a kristályt, és hatalmas lyukakat fogsz vágni a Rend védelmébe. Feketerigó elvezet egy spionhoz, aki tudja hogyan kell bejutni, sok sikert.","Un singolo cristallo alimenta l'impianto energetico che controlla gli scudi dell'Ordine. Distruggendo quel cristallo causerai enormi danni alle difese dell'Ordine. Blackbird ti porterà da una spia che ha indicazioni su come accedere al cristallo, buona fortuna.","とあるパワークリスタルがオーダー基地の +I will. What's next?,TXT_RPLY0_SCRIPT03_D10612_IWILL,〃 (〃),,,Půjdu. Co dál?,Det vil jeg gøre. Hvad er det næste?,"Alles klar, was gibt's als Nächstes?",,Kompreneble. Kio sekvas?,Lo haré. ¿Qué sigue?,Claro. ¿Qué sigue?,Menen. Mitä seuraavaksi on luvassa?,"Très bien, quoi maintenant?",,Így teszek. Mi a következő lépés?,Lo farò. Qual'è la prossima mossa?,次は何だ?,그렇군요. 그 다음은 뭐죠?,Dat zal ik doen. Wat is het volgende?,Det skal jeg gjøre. Hva er det neste?,Dobrze. Co dalej?,Farei isso. Qual a próxima missão?,,Mă voi conforma. Ce facem mai departe?,Хорошо. Что дальше?,,Det kommer jag att göra. Vad kommer härnäst?,Yapacağım. Sırada ne var? +"A single crystal runs the power grid which drives the Order's shields. Destroy that crystal and you will punch huge holes in the Order's defenses. Blackbird will lead you to a spy who has a way in, good luck.",TXT_DLG_SCRIPT03_D12128_ASING,〃 (〃),,,"Elektrická síť, kterou jsou poháněné štíty Řádu, je napájena z jednoho krystalu. Znič ten krystal a zasaď tak obří ránu obranám Řádu. Straka tě navede ke špiónovi, který zná cestu dovnitř. Hodně štěstí.","En enkelt krystal driver det kraftnet, der driver ordenens skjolde. Ødelæg det krystal, og du vil slå store huller i Ordenens forsvar. Blackbird vil føre dig til en spion, der har en vej ind, held og lykke.","Ein einziger Kristall kontrolliert das gesamte Energiesystem für die Kraftschilde des Ordens. Zerstöre diesen Kristall und du wirst riesige Löcher in die Verteidigungsanlagen des Ordens schlagen. Blackbird führt dich zu einem Spion, der dir Einlass verschaffen kann. Viel Glück.",,"Ununura kristalo nutras la elektrizan sistemon, kiu tenas la ŝildojn de la kastelo. Detruu ĝin por fari grandegan «breĉon» en la defendojn de La Ordeno. Merlo gvidos vin al spiono, kiu havas manieron eniri. Ŝancon.",Un único cristal alimenta la red eléctrica que mantiene los escudos del castillo. Destruye ese cristal para abrir grandes brechas en las defensas de La Orden. Blackbird te guiará hacia un espía que tiene una forma de entrar. Buena suerte.,Un único cristal alimenta la red eléctrica que mantiene los escudos del castillo. Destruye ese cristal para abrir grandes brechas en las defensas de La Orden. Blackbird te va a guiar hacia un espía que tiene una forma de entrar. Buena suerte.,"Kaupungin sähköverkon voimanlähteenä toimii yksittäinen kristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Tuhoamalla kristallin puhkot valtavia reikiä Veljeskunnan puolustuksiin. Blackbird opastaa sinut vakoojan luo, jolla on sisäänpääsykeino. Lykkyä tykö.",Un seul cristal fait fonctionner la grille énergétique qui alimente les boucliers de l'Ordre. Détruisez ce cristal et vous créez des énormes failles dans les défenses de l'Ordre. Blackbird va vous mener à un espion qui a un moyen de vous faire rentrer. Bonne chance.,,"Egyetlen krisztály hajtja az energia hálózatot, erre van rákötve a Rend pajzsa. Semmisítsd meg ezt a kristályt, és hatalmas lyukakat fogsz vágni a Rend védelmébe. Feketerigó elvezet egy spionhoz, aki tudja hogyan kell bejutni, sok sikert.","Un singolo cristallo alimenta l'impianto energetico che controlla gli scudi dell'Ordine. Distruggendo quel cristallo causerai enormi danni alle difese dell'Ordine. Blackbird ti porterà da una spia che ha indicazioni su come accedere al cristallo, buona fortuna.","とあるパワークリスタルがオーダー基地の シールドを維持している。それを破壊して 奴等の防壁に巨大な穴を開けるのだ。 潜入する為の情報を持ったスパイを ブラックバードが導いてくれる。","오더의 방어막을 생성하는 수정체가 그들의 발전소 안에 있습니다. 그것을 파괴할 수만 있다면, 오더의 방어 체계를 약화할 수 있을 겁니다. 블랙버드가 길을 알려줄 첩자의 위치를 알려줄 것입니다. 건투를 빌어요. \cy워너는 우리가 모집한 첩자야. 그는 발전소 창고에 있어.","Een enkel kristal loopt over het elektriciteitsnet dat de schilden van de Orde aandrijft. Vernietig dat kristal en je zult grote gaten slaan in de verdediging van de Orde. Blackbird leidt je naar een spion die een weg naar binnen heeft, veel geluk.","En enkelt krystall driver kraftnettet som driver Ordenens skjold. Ødelegg den krystallen, og du vil slå store hull i Ordenens forsvar. Blackbird vil føre dere til en spion som har en vei inn. Lykke til.","Pojedynczy kryształ napędza sieć energetyczną, która zasila osłony Zakonu. Zniszcz kryształ, a Zakon będzie miał ogromne luki w ochronie. Blackbird zaprowadzi cię do szpiega, który ma sposób, aby się tam dostać, powodzenia.",Há um cristal que fornece energia à rede elétrica que mantém os escudos da Ordem em funcionamento. Destrua esse cristal e você abrirá brechas grandes nas defesas da Ordem. Blackbird guiará você a um espião que sabe como entrar lá. Boa sorte.,,"Un cristal unic alimentează grila de putere care acționează scuturile Ordiului. Distruge cristalul și veți provoca daune imense sistemului de apărare al Ordinului. Blackbird vă va introduce unui spion care să vă ofere o cale în interior, multă baftă.","Энергосеть, которая питает щиты Ордена, работает от одного кристалла. Уничтожь этот кристалл, и ты пробьёшь огромную брешь в их обороне. «Чёрный дрозд» приведёт тебя к шпиону, который знает, как проникнуть на станцию. Удачи!",,"En enda kristall driver kraftnätet som driver ordens sköldar. Förstör den kristallen och du kommer att slå enorma hål i ordens försvar. Blackbird kommer att leda dig till en spion som har en väg in, lycka till.","Tarikat'ın kalkanlarını çalıştıran güç şebekesini tek bir kristal çalıştırıyor. O kristali yok edersen Tarikat'ın savunmasında büyük delikler açacaksın. Karatavuk seni içeri girmenin bir yolunu bulan bir casusa götürecek, iyi şanslar." -We'll get it.,TXT_RPLY0_SCRIPT03_D12128_WELLG,〃 (〃),,,Zničíme jej.,Vi skal nok få fat i den.,Das werden wir hinkriegen.,,Ni sukcesos.,Lo conseguiremos.,Lo vamos a lograr.,Saamme sen.,Je m'en occupe.,Megszerezzük.,Ce la faremo.,すぐ始めよう。,그 수정체를 파괴하겠습니다.,We krijgen het wel.,Vi får tak i den.,Poradzimy sobie.,Vamos conseguir.,,Vom ajunge în interior.,Мы справимся.,,Vi kommer att hitta den.,Onu yakalayacağız. -Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D13644_FIGHT,〃 (〃),,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het front en vrijheid. Verhuizen.,Kjemp for Fronten og friheten. Av sted.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptați pentru Front și libertate. Acum plecați.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Çıkın. -"You've exceeded all of our expectations. Because of your daring our troops are on the move. I want you two to join the assault, with a specific target. Take out the Programmer. It's time to reveal what we've found out about this layer of the Order.",TXT_DLG_SCRIPT03_D15160_YOUVE,〃 (Progammer mission),,,"Překonal jsi všechny naše představy. Díky tvé odvaze se naše vojska vydala na pochod. Chci, abyste se vy dva připojili k útoku se zvláštním cílem: zabít Programátora. Je čas odhalit, co jsme se dozvěděli o Řádu.","Du har overgået alle vores forventninger. På grund af jeres mod er vores tropper på vej. Jeg vil have jer to til at deltage i angrebet, med et specifikt mål. Udrydd programmereren. Det er tid til at afsløre, hvad vi har fundet ud af om dette lag af Ordenen.","Du hast alle unsere Erwartungen übertroffen. Dank dir sind unsere Truppen auf dem Vormarsch. Ich möchte, dass du auch an dem Angriff teilnimmst, aber mit einer Spezialmission. Eliminiere den Programmierer. Es ist Zeit zu enthüllen, was wir über dien Teil des Ordens herausgefunden haben.",,"Vi superis ĉiujn niajn atendojn. Pro viaj heroaĵoj, niaj trupoj jam ekagis. Mi volas, ke vi ambaŭ aliĝu al la sturmo kun specifa celo: mortigi La Programiston. Estas tempo malkaŝi tion, kion ni malkovris pri tiu aspekto de La Ordeno.",Has superado todas nuestras expectativas. Por tu hazaña nuestras tropas ya están en movimiento. Quiero que los dos os unáis al asalto con un objetivo específico: acabar con el Programador. Ya es hora de revelar lo que hemos descubierto sobre ese lado de La Orden.,Superaste todas nuestras expectativas. Por tu hazaña nuestras tropas ya están en movimiento. Quiero que los dos se unan al asalto con un objetivo específico: matar al Programador. Ya es hora de revelar lo que descubrimos sobre ese lado de La Orden.,"Olet ylittänyt kaikki odotuksemme. Rohkeutesi ansiosta joukkomme ovat liikkeellä. Haluan teidän molempien osallistuvan hyökkäykseen erityistehtävällä: Tuhotkaa Ohjelmoitsija. On aika paljastaa, mitä olemme saaneet selville Veljeskunnan tästä kerroksesta.","Vous avez dépassé toutes nos attentes. Grâce à votre audace, nos troupes sont sur le pied de guerre. Je que vous rejoignez l'assaut tous les deux, avec une cible précise. Eliminez le Programmeur. Il est l'heure de révéler ce que nous avons découvert sur cette facette de l'Ordre.",Túltettetek az elvárásaimon. Merész tetteitek inspirálóan hatottak katonáinkra. Mindkettőtöket szánok egy speciális feladatot a roham során. Iktassátok ki a Programozót. Ideje világosságra hozni amit találtunk a Rend ezen ágáról.,"Hai superato tutte le nostre aspettative. Grazie al vostro coraggio, le nostre truppe sono in movimento. Voglio che voi due vi uniate all'assalto, con un obiettivo specifico. Elimina il Programmatore. È giunto il momento di rivelare quello che abbiamo scoperto di questo strato dell'Ordine.","君達は我々の期待を超える活躍を行ってくれた。 +We'll get it.,TXT_RPLY0_SCRIPT03_D12128_WELLG,〃 (〃),,,Zničíme jej.,Vi skal nok få fat i den.,Das werden wir hinkriegen.,,Ni sukcesos.,Lo conseguiremos.,Lo vamos a lograr.,Saamme sen.,Je m'en occupe.,,Megszerezzük.,Ce la faremo.,すぐ始めよう。,그 수정체를 파괴하겠습니다.,We krijgen het wel.,Vi får tak i den.,Poradzimy sobie.,Vamos conseguir.,,Vom ajunge în interior.,Мы справимся.,,Vi kommer att hitta den.,Onu yakalayacağız. +Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D13644_FIGHT,〃 (〃),,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het front en vrijheid. Verhuizen.,Kjemp for Fronten og friheten. Av sted.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptați pentru Front și libertate. Acum plecați.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Çıkın. +"You've exceeded all of our expectations. Because of your daring our troops are on the move. I want you two to join the assault, with a specific target. Take out the Programmer. It's time to reveal what we've found out about this layer of the Order.",TXT_DLG_SCRIPT03_D15160_YOUVE,〃 (Progammer mission),,,"Překonal jsi všechny naše představy. Díky tvé odvaze se naše vojska vydala na pochod. Chci, abyste se vy dva připojili k útoku se zvláštním cílem: zabít Programátora. Je čas odhalit, co jsme se dozvěděli o Řádu.","Du har overgået alle vores forventninger. På grund af jeres mod er vores tropper på vej. Jeg vil have jer to til at deltage i angrebet, med et specifikt mål. Udrydd programmereren. Det er tid til at afsløre, hvad vi har fundet ud af om dette lag af Ordenen.","Du hast alle unsere Erwartungen übertroffen. Dank dir sind unsere Truppen auf dem Vormarsch. Ich möchte, dass du auch an dem Angriff teilnimmst, aber mit einer Spezialmission. Eliminiere den Programmierer. Es ist Zeit zu enthüllen, was wir über dien Teil des Ordens herausgefunden haben.",,"Vi superis ĉiujn niajn atendojn. Pro viaj heroaĵoj, niaj trupoj jam ekagis. Mi volas, ke vi ambaŭ aliĝu al la sturmo kun specifa celo: mortigi La Programiston. Estas tempo malkaŝi tion, kion ni malkovris pri tiu aspekto de La Ordeno.",Has superado todas nuestras expectativas. Por tu hazaña nuestras tropas ya están en movimiento. Quiero que los dos os unáis al asalto con un objetivo específico: acabar con el Programador. Ya es hora de revelar lo que hemos descubierto sobre ese lado de La Orden.,Superaste todas nuestras expectativas. Por tu hazaña nuestras tropas ya están en movimiento. Quiero que los dos se unan al asalto con un objetivo específico: matar al Programador. Ya es hora de revelar lo que descubrimos sobre ese lado de La Orden.,"Olet ylittänyt kaikki odotuksemme. Rohkeutesi ansiosta joukkomme ovat liikkeellä. Haluan teidän molempien osallistuvan hyökkäykseen erityistehtävällä: Tuhotkaa Ohjelmoitsija. On aika paljastaa, mitä olemme saaneet selville Veljeskunnan tästä kerroksesta.","Vous avez dépassé toutes nos attentes. Grâce à votre audace, nos troupes sont sur le pied de guerre. Je que vous rejoignez l'assaut tous les deux, avec une cible précise. Eliminez le Programmeur. Il est l'heure de révéler ce que nous avons découvert sur cette facette de l'Ordre.",,Túltettetek az elvárásaimon. Merész tetteitek inspirálóan hatottak katonáinkra. Mindkettőtöket szánok egy speciális feladatot a roham során. Iktassátok ki a Programozót. Ideje világosságra hozni amit találtunk a Rend ezen ágáról.,"Hai superato tutte le nostre aspettative. Grazie al vostro coraggio, le nostre truppe sono in movimento. Voglio che voi due vi uniate all'assalto, con un obiettivo specifico. Elimina il Programmatore. È giunto il momento di rivelare quello che abbiamo scoperto di questo strato dell'Ordine.","君達は我々の期待を超える活躍を行ってくれた。 君の勇猛さに私の部隊が動き出した。 今度は君達二人にある目的の為、強襲部隊に 加わって欲しい。プログラマーを討ち取るのだ。 オーダーに纏わる様々な事情について 明らかにする時が来た。",당신의 성과는 우리가 예상했던 것보다 훨씬 굉장하더군요. 당신의 노고 덕에 이제 우리가 활동을 본격적으로 개시할 수 있게 되었습니다. 자네와 블랙버드가 이번 공격에 참여했으면 합니다. 그리고 프로그래머를 없애버리세요. 지금이야말로 오더의 실체가 어떠한지를 폭로할 절호의 기회입니다.,"Je hebt al onze verwachtingen overtroffen. Door jouw durf zijn onze troepen in beweging. Ik wil dat jullie twee zich bij de aanval aansluiten, met een specifiek doelwit. Schakel de programmeur uit. Het is tijd om te onthullen wat we hebben ontdekt over deze laag van de Orde.","Du har overgått alle våre forventninger. På grunn av deres dristighet er troppene våre i bevegelse. Jeg vil at dere to skal bli med på angrepet, med et spesifikt mål. Drep programmereren. Det er på tide å avsløre hva vi har funnet ut om dette laget av Ordenen.","Przekroczyłeś nasze wszelkie oczekiwania. Dzięki twej odwadze nasi żołnierze są w drodze. Chciałbym, abyście razem dołączyli do szturmu, mając konkretny cel. Zabijcie Programistę. Czas pokazać co odkryliśmy na temat tego pionka Zakonu.","Você superou todas as nossas expectativas. Graças à sua audácia as nossas tropas estão em movimento. Quero que vocês dois participem do ataque, com um alvo específico. Elimine o Programador. Já está na hora de revelar o que descobrimos a respeito dessa parte da Ordem. ",,"Ne-ați depășit toate așteptările. Datorită îndrăznelii voastre trupele noastre s-au putut pune în mișcare. Vreau să vă alăturați asaltului, cu o țintă specifică. Eliminați-l pe Programator. E timpul să dezvăluim ce am descoperit despre acest nivel al Ordinului.","Ты превзошёл все наши ожидания. Благодаря твоей отваге наши войска уже в пути. Я хочу, чтобы вы двое присоединились к атаке, с особой целью — уничтожить Программиста. Настало время рассказать всё, что мы смогли узнать об этом уровне власти в Ордене.",,"Du har överträffat alla våra förväntningar. På grund av er djärvhet är våra trupper på väg. Jag vill att ni två ansluter er till anfallet, med ett specifikt mål. Ta ut programmeraren. Det är dags att avslöja vad vi har kommit fram till om det här skiktet av Orden.","Tüm beklentilerimizi aştınız. Cesaretiniz sayesinde birliklerimiz harekete geçti. İkinizin saldırıya katılmanızı istiyorum, belirli bir hedefle. Programcıyı ortadan kaldırın. Tarikat'ın bu katmanı hakkında ne bulduğumuzu açıklamanın zamanı geldi." -Tell me what we know.,TXT_RPLY0_SCRIPT03_D15160_TELLM,〃 (〃),,,"Řekni mi, co víme.","Fortæl mig, hvad vi ved.",Sag mir was du weißt.,,"Diru tion, kion vi scias.",Dime lo que se sabe.,,"Kerro, mitä tiedämme.",Donnez-moi ce que vous savez.,Mondd el mit tudtunk meg.,Dimmi cosa sappiamo.,こちらに知っている事を教えてくれ。,그 비밀에 대해서 알려주세요.,Vertel me wat we weten.,Fortell meg hva vi vet.,Powiedz co wiadomo.,Conte-me o que sabemos.,,Spune-mi ce știi.,Расскажи мне всё.,,Berätta vad vi vet.,Bana ne bildiğimizi söyle. -"The Programmer's lair is in the castle. Now, see the medic, grab some ammo and go get him.",TXT_DLG_SCRIPT03_D16676_THEPR,〃 (〃),,,"Programátorovo doupě je v hradu. Jdi navštívit zdravotníka, vem si munici a jdi ho dostat.","Programmørens hule er i slottet. Gå hen til lægen, tag noget ammunition og hent ham.",Der Programmierer hät sich irgendwo in der Burg auf. Und nun gehe bitter zum Sanitäter und beschaff dir neue Munition - und dann mach ihn fertig.,,"La kaŝejo de la Programisto estas en la kastelo. Vi nun renkontu la kuraciston, prenu municiojn kaj iru mortigi lin.","La guarida del Programador está en el castillo. Ahora ve a ver al médico, coge munición y ve a por él.","La guarida del Programador está en el castillo. Ahora ve a ver al médico, toma munición y ve por él.","Ohjelmoitsijan piilopaikka on linnassa. Käy nyt tapaamassa lääkintämiestä, ota panoksia matkaan ja napatkaa hänet.","Le repaire du Programmeur est dans le château. Allez voir le médecin, rechargez vos armes, et allez vous occuper de lui.","A Programozó búvóhelye a kastélyban található. Látogasd meg a szanitécot, vegyél magadhoz egy kis ammot, és irány a kastély.","La tana del Programmatore è nel castello. Ora, fai una visita al medico, prendi un po' di munizione, e vallo a predendere.","プログラマーの居場所は城内だ。それと、 +Tell me what we know.,TXT_RPLY0_SCRIPT03_D15160_TELLM,〃 (〃),,,"Řekni mi, co víme.","Fortæl mig, hvad vi ved.",Sag mir was du weißt.,,"Diru tion, kion vi scias.",Dime lo que se sabe.,,"Kerro, mitä tiedämme.",Donnez-moi ce que vous savez.,,Mondd el mit tudtunk meg.,Dimmi cosa sappiamo.,こちらに知っている事を教えてくれ。,그 비밀에 대해서 알려주세요.,Vertel me wat we weten.,Fortell meg hva vi vet.,Powiedz co wiadomo.,Conte-me o que sabemos.,,Spune-mi ce știi.,Расскажи мне всё.,,Berätta vad vi vet.,Bana ne bildiğimizi söyle. +"The Programmer's lair is in the castle. Now, see the medic, grab some ammo and go get him.",TXT_DLG_SCRIPT03_D16676_THEPR,〃 (〃),,,"Programátorovo doupě je v hradu. Jdi navštívit zdravotníka, vem si munici a jdi ho dostat.","Programmørens hule er i slottet. Gå hen til lægen, tag noget ammunition og hent ham.",Der Programmierer hät sich irgendwo in der Burg auf. Und nun gehe bitter zum Sanitäter und beschaff dir neue Munition - und dann mach ihn fertig.,,"La kaŝejo de la Programisto estas en la kastelo. Vi nun renkontu la kuraciston, prenu municiojn kaj iru mortigi lin.","La guarida del Programador está en el castillo. Ahora ve a ver al médico, coge munición y ve a por él.","La guarida del Programador está en el castillo. Ahora ve a ver al médico, toma munición y ve por él.","Ohjelmoitsijan piilopaikka on linnassa. Käy nyt tapaamassa lääkintämiestä, ota panoksia matkaan ja napatkaa hänet.","Le repaire du Programmeur est dans le château. Allez voir le médecin, rechargez vos armes, et allez vous occuper de lui.",,"A Programozó búvóhelye a kastélyban található. Látogasd meg a szanitécot, vegyél magadhoz egy kis ammot, és irány a kastély.","La tana del Programmatore è nel castello. Ora, fai una visita al medico, prendi un po' di munizione, e vallo a predendere.","プログラマーの居場所は城内だ。それと、 メディックと訓練士に会い弾薬を補給したら 奴を倒せ。","프로그래머가 거주하는 곳은 성채 안에 있습니다. 의무관과 무기 담당관을 찾아뵈서 준비를 당당히 하시길 바랍니다. \cy일생일대의 격전에 대비해. 돈 아끼지 말고 있는 대로 다 써.","Het hol van de programmeur is in het kasteel. Ga nu naar de dokter, pak wat munitie en ga hem halen.","Programmererens skjulested er i slottet. Gå til legen, hent ammunisjon og hent ham.","Kryjówka Programisty jest w zamku. Teraz idź do medyka, weź trochę amunicji i załatw go.","O covil do Programador fica no castelo. Agora vá ver o médico, pegue munição e vá atrás dele.",,"Bârlogul Programatorului e în castel. Acum, dute la medic, ia niște muniție, și prindeți-l.","Программист устроил себе логово в замке. Теперь наведайся к врачу, пополни боезапас, и расправься с ним.",,"Programmerarens gömställe finns i slottet. Gå till läkaren, ta lite ammunition och hämta honom.","Programcı'nın sığınağı kalenin içinde. Şimdi, doktoru gör, biraz cephane al ve gidip onu getir." -Let me at 'em!,TXT_RPLY0_SCRIPT03_D16676_LETME,〃 (〃),,,Pusť mě na ně!,Lad mig tage dem!,Lass mich das nur machen.,,Mi faros tion!,¡Voy a por ellos!,¡Voy por ellos!,Päästä minut niiden kimppuun!,Je vais me le faire!,Elkapom mindet!,Lasciali a me!,任せろ!,한 번 저질러 봅시다!,Laat me er naartoe gaan!,La meg ta dem!,Niech ja go dorwę!,Pode deixar!,,Le voi arăta eu lor!,Я им покажу!,,Låt mig ta dem!,Bana bırakın! -Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D18192_FIGHT,〃 (〃),,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het front en vrijheid. Verhuizen.,Kjemp for Fronten og friheten. Kom igjen.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. -Remember what the town hall looked like? That's a gentle reminder of what they're willing to do to get at us. Be careful.,TXT_DLG_SCRIPT03_D19708_REMEM,MAP03: Barracks.,,,"Pamatuješ si, jak dřív vypadala radnice? To je jemná přípomínka toho, co jsou schopni nám udělat. Buď opatrný.","Kan du huske, hvordan rådhuset så ud? Det er en blid påmindelse om, hvad de er villige til at gøre for at få fat i os. Vær forsigtig.","Denk daran, wie unser Rathaus aussieht. Das ist nur ein Dankzettel dafür, wie weit sie gehen würden um uns zu finden. Sei vorsichtig.",,"Ĉu vi memoras, kiel la urbodomo aspektis antaŭe? Ĝi nun estas afabla ekzemplo de tio, kion ili estas pretaj fari por forigi nin. Estu atenta.",¿Recuerdas como era antes el ayuntamiento? Ahora es una muestra amable de lo que son capaces de hacer contra nosotros. Ten cuidado.,,"Muistatko, miltä kaupungintalo näytti? Se on hienovarainen muistutus siitä, mitä he ovat valmiita tekemään saadakseen meidät. Ole varuillasi.",Souvenez-vous de l'hôtel de ville avant tout cela? C'est une manière gentille de nous montrer ce qu'ils sont capables de faire pour se débarasser de nous. Faites attention.,"Emlékszel, hogy nézett ki a vársoháza? Jó példa arra, hogy mire képesek, hogy elintézzenek minket. Légy óvatos.",Ti ricordi com'era il municipio una volta? Adesso è un piccolo ricordo di cosa sono disposti a fare per attaccarci. Fai attenzione.,"市庁舎の外観を見たか?あれが我々に対する +Let me at 'em!,TXT_RPLY0_SCRIPT03_D16676_LETME,〃 (〃),,,Pusť mě na ně!,Lad mig tage dem!,Lass mich das nur machen.,,Mi faros tion!,¡Voy a por ellos!,¡Voy por ellos!,Päästä minut niiden kimppuun!,Je vais me le faire!,,Elkapom mindet!,Lasciali a me!,任せろ!,한 번 저질러 봅시다!,Laat me er naartoe gaan!,La meg ta dem!,Niech ja go dorwę!,Pode deixar!,,Le voi arăta eu lor!,Я им покажу!,,Låt mig ta dem!,Bana bırakın! +Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D18192_FIGHT,〃 (〃),,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het front en vrijheid. Verhuizen.,Kjemp for Fronten og friheten. Kom igjen.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. +Remember what the town hall looked like? That's a gentle reminder of what they're willing to do to get at us. Be careful.,TXT_DLG_SCRIPT03_D19708_REMEM,MAP03: Barracks.,,,"Pamatuješ si, jak dřív vypadala radnice? To je jemná přípomínka toho, co jsou schopni nám udělat. Buď opatrný.","Kan du huske, hvordan rådhuset så ud? Det er en blid påmindelse om, hvad de er villige til at gøre for at få fat i os. Vær forsigtig.","Denk daran, wie unser Rathaus aussieht. Das ist nur ein Dankzettel dafür, wie weit sie gehen würden um uns zu finden. Sei vorsichtig.",,"Ĉu vi memoras, kiel la urbodomo aspektis antaŭe? Ĝi nun estas afabla ekzemplo de tio, kion ili estas pretaj fari por forigi nin. Estu atenta.",¿Recuerdas como era antes el ayuntamiento? Ahora es una muestra amable de lo que son capaces de hacer contra nosotros. Ten cuidado.,,"Muistatko, miltä kaupungintalo näytti? Se on hienovarainen muistutus siitä, mitä he ovat valmiita tekemään saadakseen meidät. Ole varuillasi.",Souvenez-vous de l'hôtel de ville avant tout cela? C'est une manière gentille de nous montrer ce qu'ils sont capables de faire pour se débarasser de nous. Faites attention.,,"Emlékszel, hogy nézett ki a vársoháza? Jó példa arra, hogy mire képesek, hogy elintézzenek minket. Légy óvatos.",Ti ricordi com'era il municipio una volta? Adesso è un piccolo ricordo di cosa sono disposti a fare per attaccarci. Fai attenzione.,"市庁舎の外観を見たか?あれが我々に対する 奴等の所業を思い出させる。気をつけろ。",시청이 박살난 걸 보았지? 저건 오더의 심기를 무모하게 건드린 결과같은 거야. 그러니 조심해.,Weet je nog hoe het stadhuis eruit zag? Dat is een vriendelijke herinnering aan wat ze bereid zijn te doen om ons te pakken te krijgen. Wees voorzichtig.,Husker du hvordan rådhuset så ut? Det er en påminnelse om hva de er villige til å gjøre for å ta oss. Vær forsiktig.,"Pamiętasz jak ratusz wyglądał? To delikatne przypomnienie co chcą zrobić, aby nas dorwać. Uważaj na siebie.",Lembra como era a prefeitura? Aquilo é um simples lembrete do que eles estão dispostos a fazer para nos pegar. Tome cuidado.,,Mai ții minte cum arăta primăria? Asta e o reamintire ușoară de ceea ce sunt dispuși să facă pentru a ajunge la noi. Ai grijă.,"Видел, что стало с городской ратушей? Это мягкий намёк на то, что они сделают, если доберутся до нас. Будь осторожен.",,Minns du hur stadshuset såg ut? Det är en mild påminnelse om vad de är villiga att göra för att komma åt oss. Var försiktig.,Belediye binasının neye benzediğini hatırlıyor musun? Bu bize ulaşmak için neler yapabileceklerini hatırlatıyor. Dikkatli olun. -Talk to Macil. He'll be able to help you.,TXT_DLG_SCRIPT03_D21224_TALKT,"MAP03: Upstairs, corridor.",,,Promluv si s Macilem. On ti pomůže.,Tal med Macil. Han vil kunne hjælpe dig.,Rede mit Macil. Er kann dir helfen.,,Parolu kun Macil. Li povos helpi vin.,Habla con Macil. Él te podrá ayudar.,Habla con Macil. Él te va a poder ayudar.,Puhu Macilille. Hän pystyy auttamaan sinua.,Parlez à Macil. Il pourra vous aider.,Beszélj Macil-lal. Ő tud segíteni neked.,Parla con Macil. Sarà in grado di aiutarti.,マシルと話すんだ。彼から援助が得られるはず。,도움이 필요한가? 그럼 마실 사령관님을 찾아.,Praat met Macil. Hij zal je kunnen helpen.,Snakk med Macil. Han kan hjelpe deg.,Porozmawiaj z Macilem. Pomoże ci.,Fale com Macil. Ele vai poder te ajudar.,,Discută cu Macil. Te va ajuta el.,Поговори с Мэйсилом. Он сможет тебе помочь.,,Prata med Macil. Han kan hjälpa dig.,Macil ile konuş. Sana yardım edebilir. +Talk to Macil. He'll be able to help you.,TXT_DLG_SCRIPT03_D21224_TALKT,"MAP03: Upstairs, corridor.",,,Promluv si s Macilem. On ti pomůže.,Tal med Macil. Han vil kunne hjælpe dig.,Rede mit Macil. Er kann dir helfen.,,Parolu kun Macil. Li povos helpi vin.,Habla con Macil. Él te podrá ayudar.,Habla con Macil. Él te va a poder ayudar.,Puhu Macilille. Hän pystyy auttamaan sinua.,Parlez à Macil. Il pourra vous aider.,,Beszélj Macil-lal. Ő tud segíteni neked.,Parla con Macil. Sarà in grado di aiutarti.,マシルと話すんだ。彼から援助が得られるはず。,도움이 필요한가? 그럼 마실 사령관님을 찾아.,Praat met Macil. Hij zal je kunnen helpen.,Snakk med Macil. Han kan hjelpe deg.,Porozmawiaj z Macilem. Pomoże ci.,Fale com Macil. Ele vai poder te ajudar.,,Discută cu Macil. Te va ajuta el.,Поговори с Мэйсилом. Он сможет тебе помочь.,,Prata med Macil. Han kan hjälpa dig.,Macil ile konuş. Sana yardım edebilir. I've heard that Macil's got a plan to subvert the Order. It had better be good. One more failure and we're all just dead meat.,TXT_DLG_SCRIPT03_D22740_IVEHE,"MAP03: Barracks. -(dead meat = corpse)",,,"Slyšel jsem, že Macil má plán, jak porazit Řád. Doufejme, že dobrý. Ještě jeden nezdar a všichni jsme mrtví.","Jeg har hørt, at Macil har en plan om at undergrave Ordenen. Den har bare at være god. En fiasko mere, og vi er alle bare dødt kød.","Ich habe gehört, Macil hätte einen Plan um den Orden zu unterwandern. Ich hoffe mal, er taugt was. Noch ein Fehlschlag und wir können uns gleich begraben lassen.",,"Mi aŭdis, ke Macil havas planon por malstabiligi La Ordenon. Pli bone, ke ĝi estas bona. Unu plua eraro kaj ni estos kadavroj.",He oído que Macil tiene un plan para desestabilizar a La Orden. Más vale que sea bueno. Un fallo más y somos fiambres.,Oí que Macil tiene un plan para desestabilizar a La Orden. Más vale que sea bueno. Un fallo más y somos fiambres.,"Kuulin, että Macililla on suunnitelma kukistaa Veljeskunta. Parasta ollakin hyvä. Vielä yksikin epäonnistuminen, ja olemme kaikki mennyttä.",J'ai entendu que Macil a un plan pour repousser l'Ordre. Il a intérêt à être bon. Une erreur de plus et nous sommes tous morts.,"Úgy tudom Macilnak van valami terve a Rend felforgatására. Remélem valami ütős terv. Még egy kudarc, és nekünk lőttek.",Ho sentito che Macil ha un piano per sovvertire l'Ordine. E spero proprio che sia un buon piano. Un altro fallimento e saremo tutti carne morta.,"私はマシルがオーダーを転覆させる計画を +(dead meat = corpse)",,,"Slyšel jsem, že Macil má plán, jak porazit Řád. Doufejme, že dobrý. Ještě jeden nezdar a všichni jsme mrtví.","Jeg har hørt, at Macil har en plan om at undergrave Ordenen. Den har bare at være god. En fiasko mere, og vi er alle bare dødt kød.","Ich habe gehört, Macil hätte einen Plan um den Orden zu unterwandern. Ich hoffe mal, er taugt was. Noch ein Fehlschlag und wir können uns gleich begraben lassen.",,"Mi aŭdis, ke Macil havas planon por malstabiligi La Ordenon. Pli bone, ke ĝi estas bona. Unu plua eraro kaj ni estos kadavroj.",He oído que Macil tiene un plan para desestabilizar a La Orden. Más vale que sea bueno. Un fallo más y somos fiambres.,Oí que Macil tiene un plan para desestabilizar a La Orden. Más vale que sea bueno. Un fallo más y somos fiambres.,"Kuulin, että Macililla on suunnitelma kukistaa Veljeskunta. Parasta ollakin hyvä. Vielä yksikin epäonnistuminen, ja olemme kaikki mennyttä.",J'ai entendu que Macil a un plan pour repousser l'Ordre. Il a intérêt à être bon. Une erreur de plus et nous sommes tous morts.,,"Úgy tudom Macilnak van valami terve a Rend felforgatására. Remélem valami ütős terv. Még egy kudarc, és nekünk lőttek.",Ho sentito che Macil ha un piano per sovvertire l'Ordine. E spero proprio che sia un buon piano. Un altro fallimento e saremo tutti carne morta.,"私はマシルがオーダーを転覆させる計画を 持っていると聞いた。そうだと良かったが。 我々は一度大敗し全滅しかけた。",오더를 괴멸할 방법을 마실 사령관님이 찾아냈대. 잘 먹혀야 하는데 말이야... 안 그럼 우리들이 잡아먹힐 거라고.,Ik heb gehoord dat Macil een plan heeft om de Orde te ondermijnen. Het kan maar beter goed zijn. Nog een mislukking en we zijn allemaal gewoon dood vlees.,"Jeg har hørt at Macil har en plan for å undergrave Ordenen. Den bør være god. Én fiasko til, og vi er ferdige.","Słyszałem, że Macil ma plan obalenia Zakonu. Oby był dobry. Jeszcze jedna porażka, a będziemy martwi.",Fiquei sabendo que Macil tem um plano para desestabilizar a Ordem. Espero que seja bom. Mais um fracasso e estaremos todos mortos.,,Am auzit că Macil are un plan pentru a submina Ordinul. Ar face bine să fie grozav. Încă un eșec și vom fi toți carne ambalată.,"Я слышал, что Мэйсил разработал план свержения Ордена. Лучше бы он сработал. Ещё одна ошибка, и мы все покойники.",,Jag har hört att Macil har en plan för att omstörta Orden. Det är bäst att den är bra. Ett misslyckande till och vi är alla bara döda kött.,Macil'in Tarikat'ı yıkmak için bir planı olduğunu duydum. İyi olsa iyi olur. Bir başarısızlık daha olursa hepimiz ölürüz. -A few of these barrels dumped into their water supply should even the odds a little.,TXT_DLG_SCRIPT03_D24256_AFEWO,〃,,,Pár těhle sudů v jejich zásobách vody by nám mělo alespoň trochu pomoct.,Et par af disse tønder dumpet i deres vandforsyning burde udligne oddsene lidt.,"Wenn wir ein paar von diesen Fässern in die Wasserversorgung kippen, sollte das unsere Chancen etwas verbessern.",,Ĵeti kelkajn el ĉi tiuj bareloj en ilian akvo-provizadon devus egaligi iomete la eblojn.,Tirar unos cuantos de estos barriles a su suministro de agua debería igualar un poco las probabilidades.,,Muutaman tällaisen tynnyrin kaataminen heidän vedenjakeluunsa varmaankin hieman tasoittaisi tilannetta.,Quelques uns de ces tonneaux vidés dans leur réserve d'eau devrait équilibrer le terrain de jeu.,Ezzel a pár víztározóba borított hordóval kiegyenlítjük az erőviszonyokat.,Un paio di questi barili rovesciati dentro la loro fornitura d'acqua dovrebbero bilanciare un po' le cose.,"ここの樽は捨てられていた物で +A few of these barrels dumped into their water supply should even the odds a little.,TXT_DLG_SCRIPT03_D24256_AFEWO,〃,,,Pár těhle sudů v jejich zásobách vody by nám mělo alespoň trochu pomoct.,Et par af disse tønder dumpet i deres vandforsyning burde udligne oddsene lidt.,"Wenn wir ein paar von diesen Fässern in die Wasserversorgung kippen, sollte das unsere Chancen etwas verbessern.",,Ĵeti kelkajn el ĉi tiuj bareloj en ilian akvo-provizadon devus egaligi iomete la eblojn.,Tirar unos cuantos de estos barriles a su suministro de agua debería igualar un poco las probabilidades.,,Muutaman tällaisen tynnyrin kaataminen heidän vedenjakeluunsa varmaankin hieman tasoittaisi tilannetta.,Quelques uns de ces tonneaux vidés dans leur réserve d'eau devrait équilibrer le terrain de jeu.,,Ezzel a pár víztározóba borított hordóval kiegyenlítjük az erőviszonyokat.,Un paio di questi barili rovesciati dentro la loro fornitura d'acqua dovrebbero bilanciare un po' le cose.,"ここの樽は捨てられていた物で 彼らの給水を補っている。",그들의 배수관에서 버려진 이 통들 일부는 분명히 약간의 승산이 있을거야.,"Een paar van deze vaten die in hun waterleiding gedumpt zijn, zullen de kans dat ze een beetje gelijk zijn.",Et par av disse tønnene dumpet i vannforsyningen deres burde jevne ut oddsen litt.,Parę tych beczek wrzuconcyh do ich zapasu wody powinno narobić wiele kłopotów.,"Se despejarmos alguns destes barris no estoque de água deles, vamos igualar as chances um pouco. ",,Câteva butoaie vărsate în rezerva lor de apă ar trebui să echilibreze balanța.,"Несколько таких бочек, сброшенных в их водоснабжение, немного уровняют шансы.",,Några av de här tunnorna dumpade i deras vattenförsörjning borde jämna ut oddsen lite.,Bu varillerden birkaçı su kaynaklarına atılırsa ihtimaller biraz olsun eşitlenir. -"So you're the new operative? Thanks, without you, we'd all be dead right now.",TXT_DLG_SCRIPT03_D25772_SOYOU,〃,,,"Takže ty jsi ten nový agent? Díky, bez tebe bychom všichni byli mrtví.","Så du er den nye agent? Tak, uden dig ville vi alle være døde lige nu.","So, du bist der neue Agent? Danke, ohne dich wären wir schon alle tot.",,"Do ĉu vi estas la nova ano? Dankon. Sen vi, ni ĉiuj jam estus mortintaj.",¿O sea que tú eres el nuevo miembro? Gracias. Sin ti ya estaríamos todos muertos.,,Sinä siis olet se uusi agentti? Kiitos; ilman sinua olisimme nyt kaikki kuolleita.,"Vous êtes le nouvel agent? Merci, sans vous, nous serions tous morts.","Szóval te vagy az új kolléga? Köszi, nélküled már mind alulról szagolnánk az ibolyát.","Quindi sei tu il nuovo agente? Grazie, se non fosse per te, saremo tutti morti ora.","貴方が新しい工作員かい? それはありがたい、 +"So you're the new operative? Thanks, without you, we'd all be dead right now.",TXT_DLG_SCRIPT03_D25772_SOYOU,〃,,,"Takže ty jsi ten nový agent? Díky, bez tebe bychom všichni byli mrtví.","Så du er den nye agent? Tak, uden dig ville vi alle være døde lige nu.","So, du bist der neue Agent? Danke, ohne dich wären wir schon alle tot.",,"Do ĉu vi estas la nova ano? Dankon. Sen vi, ni ĉiuj jam estus mortintaj.",¿O sea que tú eres el nuevo miembro? Gracias. Sin ti ya estaríamos todos muertos.,,Sinä siis olet se uusi agentti? Kiitos; ilman sinua olisimme nyt kaikki kuolleita.,"Vous êtes le nouvel agent? Merci, sans vous, nous serions tous morts.",,"Szóval te vagy az új kolléga? Köszi, nélküled már mind alulról szagolnánk az ibolyát.","Quindi sei tu il nuovo agente? Grazie, se non fosse per te, saremo tutti morti ora.","貴方が新しい工作員かい? それはありがたい、 貴方がいなければ皆死んでいた所だ。","그래서, 네가 그 요원이지? 고맙다. 네가 없었으면 우리들은 이미 죽고 없었을걸.","Dus jij bent de nieuwe agent? Bedankt, zonder jou waren we nu allemaal dood geweest.","Så du er den nye agenten? Takk, uten deg ville vi alle vært døde nå.","Więc jesteś tu nowy? Dzięki, bez ciebie bylibyśmy już martwi.","Então você é o novo agente? Obrigado. Sem você, estaríamos todos mortos neste momento.",,"Deci tu ești noul operator? Merci, dacă nu erai tu, am fi fost cu toții morți deja.","Так это ты наш новый оперативник? Спасибо. Если бы не ты, мы бы все уже были мертвы.",,"Så du är den nya agenten? Tack, utan dig hade vi alla varit döda nu.","Demek yeni ajan sensin? Teşekkürler, sen olmasaydın şu anda hepimiz ölmüş olurduk." -I'm working on something that will give us an edge. It will increase your stamina and completely jack you up. I've almost got all the bugs worked out. Can I do something for you?,TXT_DLG_SCRIPT03_D27288_IMWOR,MAP03: Gerald (no implant),,,"Pracuju na něčem, co by nám mělo pomoci. Přidá ti to výdrž a naprosto tě to nakopne. Už jsem skoro vychytal všechny mouchy. Co pro tebe mohu udělat?","Jeg arbejder på noget, der vil give os en fordel. Det vil øge din udholdenhed og gøre dig helt oppe at køre. Jeg har næsten fået styr på alle fejlene. Må jeg gøre noget for dig?","Ich arbeite an etwas, das uns einen Vorteil verschaffen kann. Es würde deine Ausdauer erhöhen und dir Superkräfte verleihen. Kann ich was für dich tun?",,"Mi laboras super io, kio donos avantaĝon al ni: ĝi pliigos vian energion kaj korpan forton. Mi jam korektis la plimulton de la cimoj. Ĉu mi povas fari ion por vi?",Estoy trabajando en algo que nos dará una ventaja: aumentará tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,Estoy trabajando en algo que nos va a dar una ventaja: va a aumentar tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,"Olen paraikaa työstämässä jotain, joka antaa meille etulyöntiaseman. Se kasvattaa kuntoasi ja täydellisesti virittää lihaksesi. Olen melkein saanut hiottua kaikki viat. Voinko olla jotenkin avuksi?",Je travaille sur quelque chose qui nous donnera un peu d'avance. Ca devrait augmenter votre endurance et vous donner un sacré coup de jus. Je crois que j'ai corrigé presque tous les bugs. Je peux vous aider?,"Dolgozok valamin, ami egy jelentősebb előnyhöz juttat minket. Megerősíti az állóképességedet és teljesen felpumpálja a tested. Már majdnem kiküszöböltem a hibákat. Amúgy tudok valamiben segíteni?",Sto lavorando a qualcosa che ci darà un notevole vantaggio. Aumenterà la tua resistenza e ti farà sentire molto più forte. Ho quasi risolto tutti gli effetti collaterali. Posso fare qualcosa per te?,"私は研究にも取り組んでいる。貴方のスタミナを +I'm working on something that will give us an edge. It will increase your stamina and completely jack you up. I've almost got all the bugs worked out. Can I do something for you?,TXT_DLG_SCRIPT03_D27288_IMWOR,MAP03: Gerald (no implant),,,"Pracuju na něčem, co by nám mělo pomoci. Přidá ti to výdrž a naprosto tě to nakopne. Už jsem skoro vychytal všechny mouchy. Co pro tebe mohu udělat?","Jeg arbejder på noget, der vil give os en fordel. Det vil øge din udholdenhed og gøre dig helt oppe at køre. Jeg har næsten fået styr på alle fejlene. Må jeg gøre noget for dig?","Ich arbeite an etwas, das uns einen Vorteil verschaffen kann. Es würde deine Ausdauer erhöhen und dir Superkräfte verleihen. Kann ich was für dich tun?",,"Mi laboras super io, kio donos avantaĝon al ni: ĝi pliigos vian energion kaj korpan forton. Mi jam korektis la plimulton de la cimoj. Ĉu mi povas fari ion por vi?",Estoy trabajando en algo que nos dará una ventaja: aumentará tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,Estoy trabajando en algo que nos va a dar una ventaja: va a aumentar tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,"Olen paraikaa työstämässä jotain, joka antaa meille etulyöntiaseman. Se kasvattaa kuntoasi ja täydellisesti virittää lihaksesi. Olen melkein saanut hiottua kaikki viat. Voinko olla jotenkin avuksi?",Je travaille sur quelque chose qui nous donnera un peu d'avance. Ca devrait augmenter votre endurance et vous donner un sacré coup de jus. Je crois que j'ai corrigé presque tous les bugs. Je peux vous aider?,,"Dolgozok valamin, ami egy jelentősebb előnyhöz juttat minket. Megerősíti az állóképességedet és teljesen felpumpálja a tested. Már majdnem kiküszöböltem a hibákat. Amúgy tudok valamiben segíteni?",Sto lavorando a qualcosa che ci darà un notevole vantaggio. Aumenterà la tua resistenza e ti farà sentire molto più forte. Ho quasi risolto tutti gli effetti collaterali. Posso fare qualcosa per te?,"私は研究にも取り組んでいる。貴方のスタミナを 増強し完璧な体にすることも可能だ。 そのインプラントのバグも殆ど取り除かれている ところで何か必要かい?","지금 우리들에게 승산이 갈 만한 연구를 하고 있습니다. 지구력 향상 이식 칩인데, 이 것만 있으면 당신의 체력과 힘을 더 불어넣어줄 겁니다. 오류를 거의 잡기도 했구요. 이제, 뭘 도와드릴까요?",Ik werk aan iets dat ons een voorsprong geeft. Het zal je uithoudingsvermogen verhogen en je volledig opkrikken. Ik heb bijna alle bugs uitgewerkt. Kan ik iets voor je doen?,Jeg jobber med noe som vil gi oss en fordel. Det vil øke utholdenheten din og løfte deg helt opp. Jeg har nesten funnet ut av alle problemene. Kan jeg gjøre noe for deg?,"Pracuję nad czymś dla ciebie co da nam przewagę. Zwiększy ci to wytrzymałość i sprawi, że poczujesz się lepiej. Już prawie naprawiłem wszystkie błędy. Mogę coś dla ciebie zrobić?",Estou trabalhando em algo que vai nos dar um impulso. É algo que vai aumentar sua resistência e te deixar bem mais forte. Estou com quase todos os bugs resolvidos. Posso te ajudar com algo?,,Lucrez la ceva care ne va oferi un avantaj. Îți va mării rezistența fizică și întări. Aproape am rezolvat toate problemele. Pot face ceva pentru tine?,"Я работаю кое над чем, что может нам пригодиться. Оно увеличит твою выносливость и улучшит самочувствие. Я уже исправил почти все дефекты. Что тебе нужно?",,Jag jobbar på något som kommer att ge oss en fördel. Det kommer att öka din uthållighet och göra dig helt upprymd. Jag har nästan löst alla buggar. Kan jag göra något för dig?,Bize avantaj sağlayacak bir şey üzerinde çalışıyorum. Dayanıklılığını arttıracak ve seni tamamen uçuracak. Neredeyse tüm hataları çözdüm. Senin için bir şey yapabilir miyim? -Patch me up.,TXT_RPLY0_SCRIPT03_D27288_PATCH,〃 (〃),,,Dej mě dohromady.,Giv mig et plaster på såret.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Hoida minut kuntoon.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Bandajează-mă.,Подлатай меня.,,Laga mig.,Beni yamala. +Patch me up.,TXT_RPLY0_SCRIPT03_D27288_PATCH,〃 (〃),,,Dej mě dohromady.,Giv mig et plaster på såret.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Hoida minut kuntoon.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Bandajează-mă.,Подлатай меня.,,Laga mig.,Beni yamala. "Boy, you're a real mess. I'll see what I can do.",TXT_RYES0_SCRIPT03_D27288_BOYYO,〃 (〃),,,"Tebe teda zřídili, kluku. Uvidím, co s tebou.","Du er et rigtigt rod. Jeg skal se, hvad jeg kan gøre.","Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Ulo, vi estas iomege en malordo. Mi vidos tion, kion mi faru.","Tío, estás hecho un desastre. A ver qué puedo hacer.","Chico, estás hecho un desastre. -A ver qué puedo hacer.","Voi pojat, oletpa hajalla. Katsotaan, mihin pystyn.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.","Öregem, elég rossz passzban vagy. Megnézem mit tudok tenni.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,"당신, 정말 엉망이네요... 어떻게든 치료해줄게요.","Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du ser forferdelig ut. Jeg skal se hva jeg kan gjøre.","Chłopie, ależ ty jesteś poszarpany. Zobaczę co da się zrobić.","Rapaz, você está arrebentado. Vou ver o que posso fazer.",,"Măi să fie, ești un dezastru. O să văd ce pot face.","Парень, да на тебя смотреть страшно. Приступим...",,Du är en riktig röra. Jag ska se vad jag kan göra.,"Evlat, gerçekten berbat durumdasın. Ne yapabileceğime bir bakayım." -Stamina implant?,TXT_RPLY1_SCRIPT03_D27288_STAMI,〃 (〃),,,Implantát pro výdrž?,Udholdenhedsimplantat?,Ausdauerimplantat?,,Ĉu energidona enplantaĵo?,¿Implante de aguante?,,Kuntoistute?,Implant d'endurance?,Állóképesség implantátum?,Impianto stamina?,スタミナインプラント?,지구력 향상 이식?,Stamina implantaat?,Utholdenhetsimplantat?,Implant zwiększający wytrzymałość?,Implante de resistência?,,Implant pentru rezistență?,Выносливостный имплант?,,Ett uthållighetsimplantat?,Dayanıklılık implantı mı? +A ver qué puedo hacer.","Voi pojat, oletpa hajalla. Katsotaan, mihin pystyn.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.",,"Öregem, elég rossz passzban vagy. Megnézem mit tudok tenni.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,"당신, 정말 엉망이네요... 어떻게든 치료해줄게요.","Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du ser forferdelig ut. Jeg skal se hva jeg kan gjøre.","Chłopie, ależ ty jesteś poszarpany. Zobaczę co da się zrobić.","Rapaz, você está arrebentado. Vou ver o que posso fazer.",,"Măi să fie, ești un dezastru. O să văd ce pot face.","Парень, да на тебя смотреть страшно. Приступим...",,Du är en riktig röra. Jag ska se vad jag kan göra.,"Evlat, gerçekten berbat durumdasın. Ne yapabileceğime bir bakayım." +Stamina implant?,TXT_RPLY1_SCRIPT03_D27288_STAMI,〃 (〃),,,Implantát pro výdrž?,Udholdenhedsimplantat?,Ausdauerimplantat?,,Ĉu energidona enplantaĵo?,¿Implante de aguante?,,Kuntoistute?,Implant d'endurance?,,Állóképesség implantátum?,Impianto stamina?,スタミナインプラント?,지구력 향상 이식?,Stamina implantaat?,Utholdenhetsimplantat?,Implant zwiększający wytrzymałość?,Implante de resistência?,,Implant pentru rezistență?,Выносливостный имплант?,,Ett uthållighetsimplantat?,Dayanıklılık implantı mı? "All right, this won't take but a moment.",TXT_RYES1_SCRIPT03_D27288_ALLRI,〃 (〃),,,"Dobře, tohle potrvá jen chvilku.","Okay, det tager kun et øjeblik.","Alles klar, das haben wir sofort.",,"Bonege, ĉi tio estos rapidega.","Muy bien, solo tomará un momento.","Muy bien, solo va a -tomar un momento.","Hyvä on, tähän ei mene hetkeä pidempään.","Pas de problème, ça ne prendra qu'un moment.","Rendben, egy pillanat és kész.","Va bene, ci vorrà solo un momento.",いいでしょう、これは時間を取りません。,좋습니다. 시간이 오래 걸리진 않을 거예요.,"Oké, dit duurt maar een momentje.",Dette tar bare et øyeblikk.,"Dobra, to zajmie tylko chwilę.","Ok, só um momento.",,"În regulă, va dura doar un moment.","Отлично, это займёт всего пару секунд.",,"Okej, det här tar bara ett ögonblick.","Pekala, bu bir dakikadan fazla sürmez." +tomar un momento.","Hyvä on, tähän ei mene hetkeä pidempään.","Pas de problème, ça ne prendra qu'un moment.",,"Rendben, egy pillanat és kész.","Va bene, ci vorrà solo un momento.",いいでしょう、これは時間を取りません。,좋습니다. 시간이 오래 걸리진 않을 거예요.,"Oké, dit duurt maar een momentje.",Dette tar bare et øyeblikk.,"Dobra, to zajmie tylko chwilę.","Ok, só um momento.",,"În regulă, va dura doar un moment.","Отлично, это займёт всего пару секунд.",,"Okej, det här tar bara ett ögonblick.","Pekala, bu bir dakikadan fazla sürmez." It's not done yet.,TXT_RNO1_SCRIPT03_D27288_ITSNO,〃 (〃),,,Ještě není hotový.,Det er ikke færdigt endnu.,Es ist noch nicht soweit.,,"Mi ankoraŭ -prilaboras ĝin.",Aún no está listo.,,Se ei ole valmis vielä.,Ce n'est pas encore terminé.,Még nincs kész.,Non è ancora pronto.,まだ完成していません。,아직 완료되지는 않았어요.,Het is nog niet klaar.,Det er ikke ferdig ennå.,Jeszcze nie jest gotowy.,Ainda não terminei.,,Încă nu e gata.,Он ещё не готов.,,Det är inte klart än.,Henüz bitmedi. -"Hey, I'm working on an updated version of your implant. Is there anything else I can do?",TXT_DLG_SCRIPT03_D28804_HEYIM,〃 (one upgrade),,,"Hej, pracuju na vylepšené verzi tvého implantátu. Můžu pro tebe udělat něco jiného?","Jeg arbejder på en opdateret version af dit implantat. Er der andet, jeg kan gøre?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Mi laboras super plibonigita versio de via enplantaĵo. Ĉu estas io alia, kion mi povas fari por vi?",Estoy trabajando en una versión mejorada de tu implante. ¿Hay algo más que pueda hacer?,,"Hei, olen työstämässä päivitettyä versiota istutteestasi. Voinko olla muuten avuksi?","Hé, je travaille sur une version améliorée de l'implant. Qu'est-ce que je peux faire pour vous?",Az implantátum újabb verzióján dolgozok. Tudok még valamiben segíteni?,"Ehi, sto lavorando ad un aggiornamento per l'impianto stamina. Posso fare qualcos'altro per te?","どうも、私は今最新版のインプラントに +prilaboras ĝin.",Aún no está listo.,,Se ei ole valmis vielä.,Ce n'est pas encore terminé.,,Még nincs kész.,Non è ancora pronto.,まだ完成していません。,아직 완료되지는 않았어요.,Het is nog niet klaar.,Det er ikke ferdig ennå.,Jeszcze nie jest gotowy.,Ainda não terminei.,,Încă nu e gata.,Он ещё не готов.,,Det är inte klart än.,Henüz bitmedi. +"Hey, I'm working on an updated version of your implant. Is there anything else I can do?",TXT_DLG_SCRIPT03_D28804_HEYIM,〃 (one upgrade),,,"Hej, pracuju na vylepšené verzi tvého implantátu. Můžu pro tebe udělat něco jiného?","Jeg arbejder på en opdateret version af dit implantat. Er der andet, jeg kan gøre?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Mi laboras super plibonigita versio de via enplantaĵo. Ĉu estas io alia, kion mi povas fari por vi?",Estoy trabajando en una versión mejorada de tu implante. ¿Hay algo más que pueda hacer?,,"Hei, olen työstämässä päivitettyä versiota istutteestasi. Voinko olla muuten avuksi?","Hé, je travaille sur une version améliorée de l'implant. Qu'est-ce que je peux faire pour vous?",,Az implantátum újabb verzióján dolgozok. Tudok még valamiben segíteni?,"Ehi, sto lavorando ad un aggiornamento per l'impianto stamina. Posso fare qualcos'altro per te?","どうも、私は今最新版のインプラントに 取り組んでいる。何か用かな?","당신의 이식 칩을 위한 향상 개조가 준비되었습니다. 그런 이유로 온게 아니면, 무엇을 도와드릴까요?","Hé, ik ben bezig met een bijgewerkte versie van je implantaat. Is er nog iets anders dat ik kan doen?",Jeg jobber med en oppdatert versjon av implantatet ditt. Er det noe annet jeg kan gjøre?,"Hej, pracuję nad ulepszoną wersją twojego implantu. Mogę coś jeszcze dla ciebie zrobić?",E aí. Estou trabalhando numa versão aprimorada do seu implante. Posso te ajudar com algo?,,"Hei, lucrez la o variantă îmbunătățită a implantului tău. Mai pot să te ajut cu ceva?","Я работаю над улучшенной версией твоего импланта. А пока, что-нибудь ещё?",,Jag jobbar på en uppdaterad version av ditt implantat. Finns det något annat jag kan göra?,"Hey, implantının güncellenmiş bir versiyonu üzerinde çalışıyorum. Yapabileceğim başka bir şey var mı?" -Patch me up.,TXT_RPLY0_SCRIPT03_D28804_PATCH,〃 (〃),,,Dej mě dohromady.,Gør mig klar.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Pistä minut kuntoon.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Bandajează-mă.,Подлатай меня.,,Laga mig.,Yama yap. +Patch me up.,TXT_RPLY0_SCRIPT03_D28804_PATCH,〃 (〃),,,Dej mě dohromady.,Gør mig klar.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Pistä minut kuntoon.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Bandajează-mă.,Подлатай меня.,,Laga mig.,Yama yap. Well at least your seeing action.,TXT_RYES0_SCRIPT03_D28804_WELLA,〃 (〃),,,"No, alespoň se nenudíš.",I det mindste kan du se noget.,"Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Nu, almenaŭ vi ne havas enuigajn komisiojn.","Bueno, al menos estás -teniendo algo de acción.",,"No, ainakin näet toimintaa.","Eh bien, au moins vous en voyez, de l'action.",Legalább neked jut valami akció.,"Beh, almeno ti stai dando da fare.",貴方の働きは聞き届いてるよ。,이제 전장에 힘을 발휘해보세요!,"Nou ja, in ieder geval uw zien actie.",Du ser i det minste noe.,Przynajmniej będziesz mógł wrócić do akcji.,"Bem, pelo menos tá tendo um pouco de ação.",,"Eh, măcar tu ai parte de acțiune.","Что ж, зато ты участвуешь в операциях.",,Du får åtminstone se handling.,En azından hareket görüyorsun. -Implant upgrade?,TXT_RPLY1_SCRIPT03_D28804_IMPLA,〃 (〃),,,Vylepšený implantát?,Opgradering af implantater?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?,Implantatoppgradering?,Ulepszenie implantu?,Versão aprimorada do implante?,,Upgrade pentru implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant güncellemesi mi? +teniendo algo de acción.",,"No, ainakin näet toimintaa.","Eh bien, au moins vous en voyez, de l'action.",,Legalább neked jut valami akció.,"Beh, almeno ti stai dando da fare.",貴方の働きは聞き届いてるよ。,이제 전장에 힘을 발휘해보세요!,"Nou ja, in ieder geval uw zien actie.",Du ser i det minste noe.,Przynajmniej będziesz mógł wrócić do akcji.,"Bem, pelo menos tá tendo um pouco de ação.",,"Eh, măcar tu ai parte de acțiune.","Что ж, зато ты участвуешь в операциях.",,Du får åtminstone se handling.,En azından hareket görüyorsun. +Implant upgrade?,TXT_RPLY1_SCRIPT03_D28804_IMPLA,〃 (〃),,,Vylepšený implantát?,Opgradering af implantater?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?,Implantatoppgradering?,Ulepszenie implantu?,Versão aprimorada do implante?,,Upgrade pentru implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant güncellemesi mi? "Good thing, never can be too safe.",TXT_RYES1_SCRIPT03_D28804_GOODT,〃 (〃),,,"Dobrá věcička, nikdy si nemůžeš být moc jistý.","Godt nok, man kan aldrig være for sikker.","Alles klar, das haben wir sofort.",,"Bone. Neniam estas sufiĉe da sekureco.","Bien. Nunca se puede -estar del todo seguro.",,"Hyvä, koskaan ei voi olla liian turvallista.",Bonne idée. On ne peut jamais être trop sûr.,"Helyes, sosem lehetünk elég elővigyázatosak.","Ottimo, non si può mai essere troppo al sicuro.",良いことだ、安全すぎることはない。,좋은 선택입니다. 이거 없이는 안전할 수가 없죠.,"Goede zaak, kan nooit te veilig zijn.","Bra, man kan aldri være for sikker.","Dobra rzecz, nigdy za mało bezpieczeństwa.",Boa idéia. Segurança nunca é demais.,,"Recomand cu mare drag, nu poți fi niciodată prea sigur.","Очень советую, ни в чём нельзя быть уверенным до конца.",,"Bra, man kan aldrig vara för säker.","İyi bir şey, asla çok güvenli olamaz." +estar del todo seguro.",,"Hyvä, koskaan ei voi olla liian turvallista.",Bonne idée. On ne peut jamais être trop sûr.,,"Helyes, sosem lehetünk elég elővigyázatosak.","Ottimo, non si può mai essere troppo al sicuro.",良いことだ、安全すぎることはない。,좋은 선택입니다. 이거 없이는 안전할 수가 없죠.,"Goede zaak, kan nooit te veilig zijn.","Bra, man kan aldri være for sikker.","Dobra rzecz, nigdy za mało bezpieczeństwa.",Boa idéia. Segurança nunca é demais.,,"Recomand cu mare drag, nu poți fi niciodată prea sigur.","Очень советую, ни в чём нельзя быть уверенным до конца.",,"Bra, man kan aldrig vara för säker.","İyi bir şey, asla çok güvenli olamaz." "I'm almost finished, but not quite.",TXT_RNO1_SCRIPT03_D28804_IMALM,〃 (〃),,,"Už je skoro hotový, ale ne úplně.","Jeg er næsten færdig, men ikke helt.",Es ist noch nicht soweit.,,"Mi preskaŭ finis, sed ne tute.","Casi he terminado, -pero no del todo.",,"Olen melkein valmis, mutten ihan vielä.","Presque fini, mais pas encore.","Már majdnem végeztem, még egy kicsi híja van.","Ho quasi finito, ma non ancora.",もうすぐ出来上がる、それほど掛からない。,"거의 다 돼가지만, 아직 완성된 게 아니에요.","Ik ben bijna klaar, maar niet helemaal.","Jeg er nesten ferdig, men ikke helt.","Prawie skończyłem, ale nie do końca.",Estou quase terminando. Só mais um pouco.,,"Sunt aproape gata, dar nu tocmai.",Я почти закончил. Ещё немного.,,"Jag är nästan klar, men inte riktigt.",Neredeyse bitirdim ama tam olarak değil. -"All right, I've almost got everything working perfectly. There were a few problems left to get rid of. Do you need anything else? ",TXT_DLG_SCRIPT03_D30320_ALLRI,〃 (two upgrades),,,"Tak dobře, už mi skoro všechno perfektně funguje. Ještě tam bylo pár problémů. Potřebuješ ještě něco?","Okay, jeg har næsten fået det hele til at fungere perfekt. Der var et par problemer tilbage at slippe af med. Har du brug for noget andet?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Bone, preskaŭ ĉio funkcias perfekte. Restis nur kelkaj korektindaj problemoj. Ĉu vi bezonas ion alian?","Muy bien, tengo casi todo funcionando a la perfección. Solo quedaban algunos problemas que corregir. ¿Necesitas algo más?",,"No niin, olen melkein saanut kaiken toimimaan täydellisesti. Vain muutamia vikoja oli enää jäljellä. Tarvitsetko mitään muuta?","Très bien, je crois que j'ai réussi à tout faire marcher parfaitement. Il y avait quelques problèmes dont je devais me débarrasser. Vous voulez quelque chose?","Nos, már majdnem minden tökéletesen működik. Volt néhány kijavítandó hiba. Tudok még valamiben segíteni?","Allora, sono riuscito a far funzionare quasi tutto benissimo. C'erano giusto un paio di problemi rimasti da risolvere. Ti serve qualcos'altro?","大丈夫、全て順調だ。残っていた問題も +pero no del todo.",,"Olen melkein valmis, mutten ihan vielä.","Presque fini, mais pas encore.",,"Már majdnem végeztem, még egy kicsi híja van.","Ho quasi finito, ma non ancora.",もうすぐ出来上がる、それほど掛からない。,"거의 다 돼가지만, 아직 완성된 게 아니에요.","Ik ben bijna klaar, maar niet helemaal.","Jeg er nesten ferdig, men ikke helt.","Prawie skończyłem, ale nie do końca.",Estou quase terminando. Só mais um pouco.,,"Sunt aproape gata, dar nu tocmai.",Я почти закончил. Ещё немного.,,"Jag är nästan klar, men inte riktigt.",Neredeyse bitirdim ama tam olarak değil. +"All right, I've almost got everything working perfectly. There were a few problems left to get rid of. Do you need anything else? ",TXT_DLG_SCRIPT03_D30320_ALLRI,〃 (two upgrades),,,"Tak dobře, už mi skoro všechno perfektně funguje. Ještě tam bylo pár problémů. Potřebuješ ještě něco?","Okay, jeg har næsten fået det hele til at fungere perfekt. Der var et par problemer tilbage at slippe af med. Har du brug for noget andet?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Bone, preskaŭ ĉio funkcias perfekte. Restis nur kelkaj korektindaj problemoj. Ĉu vi bezonas ion alian?","Muy bien, tengo casi todo funcionando a la perfección. Solo quedaban algunos problemas que corregir. ¿Necesitas algo más?",,"No niin, olen melkein saanut kaiken toimimaan täydellisesti. Vain muutamia vikoja oli enää jäljellä. Tarvitsetko mitään muuta?","Très bien, je crois que j'ai réussi à tout faire marcher parfaitement. Il y avait quelques problèmes dont je devais me débarrasser. Vous voulez quelque chose?",,"Nos, már majdnem minden tökéletesen működik. Volt néhány kijavítandó hiba. Tudok még valamiben segíteni?","Allora, sono riuscito a far funzionare quasi tutto benissimo. C'erano giusto un paio di problemi rimasti da risolvere. Ti serve qualcos'altro?","大丈夫、全て順調だ。残っていた問題も 全て取り除かれた。他に何が必要かな?",연구가 거의 다 끝나갑니다. 연구 도중에 오류를 좀 잡았어요. 기다리는 동안 뭐 필요한 게 있나요?,"Oke, ik heb bijna alles wat perfect werkt. Er waren nog een paar problemen over om van af te komen. Heeft u nog iets anders nodig?",Jeg har nesten fått alt til å fungere perfekt. Det var et par problemer igjen å bli kvitt. Trenger du noe mer?,"Dobra, prawie wszystko działa dobrze. Zostało jeszcze parę rzeczy do zrobienia. Czy coś jeszcze potrzebujesz?","Ok, tenho quase tudo funcionando perfeitamente. Ainda faltam alguns probleminhas para tirar de você. Precisa de mais alguma coisa?",,"În regulă, totul funcționează aproape perfect. Au mai fost niște probleme care trebuiau rezolvate. Mai ai nevoie de altceva?","Итак, тут оставалась пара проблем, но теперь всё работает почти идеально. Что-нибудь ещё?",,"Okej, jag har nästan fått allt att fungera perfekt. Det fanns några problem kvar att bli av med. Behöver du något annat?","Pekala, neredeyse her şey mükemmel çalışıyor. Kurtulmam gereken birkaç sorun kaldı. Başka bir şeye ihtiyacın var mı?" -Patch me up.,TXT_RPLY0_SCRIPT03_D30320_PATCH,〃 (〃),,,Dej mě dohromady.,Lav mig om.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Paikkaa minut.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lapp meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Tratează-mă.,Подлатай меня.,,Laga mig.,Beni yamala. +Patch me up.,TXT_RPLY0_SCRIPT03_D30320_PATCH,〃 (〃),,,Dej mě dohromady.,Lav mig om.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Paikkaa minut.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lapp meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Tratează-mă.,Подлатай меня.,,Laga mig.,Beni yamala. What have you been trying to do? Go head to head with a Crusader?,TXT_RYES0_SCRIPT03_D30320_WHATH,〃 (〃),,,Co jsi dělal? Šel zmlátit Křižáka?,Hvad har du forsøgt at gøre? At gå i kamp mod en korsfarer?,"Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Kion vi intencis fari? Ĉu piki Kruciston?","¿Qué has intentado hacer? ¿Ir cara a cara con un Cruzado?","¿Qué anduviste haciendo? -¿Ir cara a cara con un Cruzado?",Mitä olet oikein yrittänyt tehdä? Mennä nokittain ristiretkeläisen kanssa?,Qu'est-ce que vous avez fait? Vous avez essayé de faire ami avec un Croisé?,Mi a francot képzeltél? Egymagad nekimész egy keresztesnek?,Ma cosa hai cercato di fare? Lottare da solo contro un Crociato?,"今度は何を始めるんだ? +¿Ir cara a cara con un Cruzado?",Mitä olet oikein yrittänyt tehdä? Mennä nokittain ristiretkeläisen kanssa?,Qu'est-ce que vous avez fait? Vous avez essayé de faire ami avec un Croisé?,,Mi a francot képzeltél? Egymagad nekimész egy keresztesnek?,Ma cosa hai cercato di fare? Lottare da solo contro un Crociato?,"今度は何を始めるんだ? クルセイダーと向かい合うのか?",뭘 하다 왔나요? 크루세이더랑 한판 뜨기라도 했나요?,Wat heb je geprobeerd te doen? Hoofd aan hoofd gaan met een kruisvaarder?,Hva har du prøvd å gjøre? Kjempe mot en korsfarer?,Co ty próbowałeś zrobić? Walczyć oko w oko z Krzyżowcem?,O que você andou tentando fazer? Partiu pro soco contra um Cruzado?,,Ce ai încercat să faci? Să dai cap în cap cu un Cruciat?,Что было у тебя на уме? Биться один на один с крестоносцем?,,Vad har du försökt göra? Gå mot en korsriddare?,Ne yapmaya çalışıyordun? Bir Haçlı ile kafa kafaya mı? -Implant upgrade?.,TXT_RPLY1_SCRIPT03_D30320_IMPLA,〃 (〃),,,Vylepšený implantát?,Implantat opgradering?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?,Implantatoppgradering?,Ulepszenie implantu?,Melhoria de implante?,,Upgrade pentru implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant yükseltmesi mi? -That should do it for you.,TXT_RYES1_SCRIPT03_D30320_THATS,〃 (〃),,,Tohle by mělo fungovat.,Det burde gøre det for dig.,"Alles klar, das haben wir sofort.",,Ĉi tio devus esti sufiĉa.,Con esto debería estar.,,Eiköhän tällä ala tepsiä.,Ca devrait faire l'affaire.,Ez már így jó lesz.,Questo dovrebbe andare.,今取り掛かっている。,이것만 있음 될 겁니다.,Dat zou het voor u moeten doen.,Det burde gjøre det for deg.,To powinno ci wystarczyć.,Isso deve funcionar.,,Ar trebui să fie bine acum.,Вот оно.,,Det borde göra det för dig.,Bu senin işini görür. +Implant upgrade?.,TXT_RPLY1_SCRIPT03_D30320_IMPLA,〃 (〃),,,Vylepšený implantát?,Implantat opgradering?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?,Implantatoppgradering?,Ulepszenie implantu?,Melhoria de implante?,,Upgrade pentru implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant yükseltmesi mi? +That should do it for you.,TXT_RYES1_SCRIPT03_D30320_THATS,〃 (〃),,,Tohle by mělo fungovat.,Det burde gøre det for dig.,"Alles klar, das haben wir sofort.",,Ĉi tio devus esti sufiĉa.,Con esto debería estar.,,Eiköhän tällä ala tepsiä.,Ca devrait faire l'affaire.,,Ez már így jó lesz.,Questo dovrebbe andare.,今取り掛かっている。,이것만 있음 될 겁니다.,Dat zou het voor u moeten doen.,Det burde gjøre det for deg.,To powinno ci wystarczyć.,Isso deve funcionar.,,Ar trebui să fie bine acum.,Вот оно.,,Det borde göra det för dig.,Bu senin işini görür. Let me run some more tests first.,TXT_RNO1_SCRIPT03_D30320_LETME,〃 (〃),,,Ještě ho musím dál otestovat.,Lad mig køre nogle flere tests først.,Es ist noch nicht soweit.,,"Unue mi faru kelkajn provojn.","Déjame hacer algunas -pruebas primero.",,Anna minun ajaa muutamia kokeita ensin.,Laissez moi faire quelques tests d'abord.,Hadd futtassak pár tesztet előtte.,Devo fare ancora qualche test.,もう少しテストしてからにしよう。,"우선, 시험을 좀 거쳐야 해요.",Laat me eerst nog wat testen doen.,La meg kjøre noen flere tester først.,Pozwól mi zrobić jeszcze parę testów.,Deixe eu fazer alguns testes primeiro.,,Lasă-mă să mai fac niște teste mai întâi.,Дай мне ещё времени на тесты.,,Låt mig köra några fler tester först.,Önce birkaç test daha yapayım. -That's all I can do on the implant right now. Maybe some healing?,TXT_DLG_SCRIPT03_D31836_THATS,〃 (?),,,"Tak, to je všechno co teď můžu s tím implantátem udělat. Potřebuješ léčení?","Det er alt, hvad jeg kan gøre på implantatet lige nu. Måske noget healing?","Das ist alles, was ich im Moment mit dem Implantat machen kann. Vielleicht etwas medizinische Versorgung?",,"Tio estas ĉio, kion mi momente povas fari super la enplantaĵo. Ĉu vi bezonas kuracon?",Eso es todo lo que puedo hacer con el implante por ahora. ¿Necesitas curarte?,,Tätä enempää en voi istutteelle enää juuri nyt tehdä. Mutta oletko hoidon tarpeessa?,C'est tout ce que je peux faire pour l'implant. Vous voulez que je vous soigne?,Csak ennyit tudok most kezdeni az implantátummal. Talán egy kis gyógyítás?,È tutto per quanto riguarda l'impianto. Però posso sempre curarti.,"インプラントはこれ以上ない程完成した。 +pruebas primero.",,Anna minun ajaa muutamia kokeita ensin.,Laissez moi faire quelques tests d'abord.,,Hadd futtassak pár tesztet előtte.,Devo fare ancora qualche test.,もう少しテストしてからにしよう。,"우선, 시험을 좀 거쳐야 해요.",Laat me eerst nog wat testen doen.,La meg kjøre noen flere tester først.,Pozwól mi zrobić jeszcze parę testów.,Deixe eu fazer alguns testes primeiro.,,Lasă-mă să mai fac niște teste mai întâi.,Дай мне ещё времени на тесты.,,Låt mig köra några fler tester först.,Önce birkaç test daha yapayım. +That's all I can do on the implant right now. Maybe some healing?,TXT_DLG_SCRIPT03_D31836_THATS,〃 (?),,,"Tak, to je všechno co teď můžu s tím implantátem udělat. Potřebuješ léčení?","Det er alt, hvad jeg kan gøre på implantatet lige nu. Måske noget healing?","Das ist alles, was ich im Moment mit dem Implantat machen kann. Vielleicht etwas medizinische Versorgung?",,"Tio estas ĉio, kion mi momente povas fari super la enplantaĵo. Ĉu vi bezonas kuracon?",Eso es todo lo que puedo hacer con el implante por ahora. ¿Necesitas curarte?,,Tätä enempää en voi istutteelle enää juuri nyt tehdä. Mutta oletko hoidon tarpeessa?,C'est tout ce que je peux faire pour l'implant. Vous voulez que je vous soigne?,,Csak ennyit tudok most kezdeni az implantátummal. Talán egy kis gyógyítás?,È tutto per quanto riguarda l'impianto. Però posso sempre curarti.,"インプラントはこれ以上ない程完成した。 それとも治療か?",지구력 향상 관련은 이게 다입니다. 이제 치료가 좀 필요하신가요?,Dat is alles wat ik nu kan doen op het implantaat. Misschien wat genezing?,Det er alt jeg kan gjøre med implantatet akkurat nå. Kanskje litt helbredelse?,To wszystko co mogę zrobić w sprawie implantu. Może chcesz się podleczyć?,Isso é tudo que posso fazer com o implante no momento. Não quer um tratamento nesses ferimentos?,,Asta e tot ce îi pot face implantului pentru moment. Poate niște tratament?,Пока что я больше ничего не могу сделать с имплантом. Как насчёт лечения?,,Det är allt jag kan göra med implantatet just nu. Kanske lite läkning?,Şu anda implant üzerinde yapabileceğim tek şey bu. Belki biraz iyileşme? -Yeah.,TXT_RPLY0_SCRIPT03_D31836_YEAH,〃 (〃),,,Jo.,Ja.,Ja.,,Jes.,Sí.,,Kyllä.,Ouais.,Igen.,Sì.,ああ。,네.,Ja.,Ja.,Pewnie.,Pode ser.,,Da.,Давай.,,"Ja, det är det.","Evet, belki." +Yeah.,TXT_RPLY0_SCRIPT03_D31836_YEAH,〃 (〃),,,Jo.,Ja.,Ja.,,Jes.,Sí.,,Kyllä.,Ouais.,,Igen.,Sì.,ああ。,네.,Ja.,Ja.,Pewnie.,Pode ser.,,Da.,Давай.,,"Ja, det är det.","Evet, belki." "Boy, you're a real mess. I'll see what I can do.",TXT_RYES0_SCRIPT03_D31836_BOYYO,〃 (〃),,,"Tebe teda zřídili, kluku. Uvidím, co s tebou.","Mand, du er et rigtigt rod. Jeg skal se, hvad jeg kan gøre.","Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Ulo, vi estas iomege en malordo. Mi vidos tion, kion mi faru.","Tío, estás hecho un desastre. A ver qué puedo hacer.","Chico, estás hecho un desastre. -A ver qué puedo hacer.","Kylläpä olet huonossa jamassa. Katsotaan, mitä voin tehdä.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.","Öregem, elég rossz passzban vagy. Megnézem mit tudok tenni.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,심각한 부상을 입은 것 같군요. 치료하겠습니다.,"Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du er et skikkelig rot. Jeg skal se hva jeg kan gjøre.","Chłopie, ależ ty jesteś poszarpany. Zobaczę co da się zrobić.","Rapaz, você está arrebentado. Vou ver o que posso fazer.",,"Mamă, ești un dezastru. O să văd ce pot face.","Парень, да на тебя смотреть страшно. Приступим...",,Du är en riktig röra. Jag ska se vad jag kan göra.,Çok dağınıksın. Ne yapabileceğime bir bakayım. -What can I do for you?,TXT_DLG_SCRIPT03_D33352_WHATC,MAP03: Feris (no training).,,,Co pro tebe můžu udělat?,Hvad kan jeg gøre for dig?,Was kann ich für dich tun?,,Kion mi faru por vi?,¿Qué puedo hacer por ti?,,Mitä voin tehdä sinulle?,Que puis-je faire pour vous?,Miben segíthetek?,Cosa posso fare per te?,どういったご用件で?,필요한 게 있으면 말씀하세요.,Wat kan ik voor je doen?,Hva kan jeg gjøre for deg?,Co mogę dla ciebie zrobić?,Como posso te ajudar?,,Ce pot face pentru tine?,Чем я могу тебе помочь?,,Vad kan jag göra för dig?,Senin için ne yapabilirim? -I'm out of bullets.,TXT_RPLY0_SCRIPT03_D33352_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on luodit loppu.,Je suis à cours de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Nie mam nabojów.,Estou sem balas.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. +A ver qué puedo hacer.","Kylläpä olet huonossa jamassa. Katsotaan, mitä voin tehdä.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.",,"Öregem, elég rossz passzban vagy. Megnézem mit tudok tenni.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,심각한 부상을 입은 것 같군요. 치료하겠습니다.,"Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du er et skikkelig rot. Jeg skal se hva jeg kan gjøre.","Chłopie, ależ ty jesteś poszarpany. Zobaczę co da się zrobić.","Rapaz, você está arrebentado. Vou ver o que posso fazer.",,"Mamă, ești un dezastru. O să văd ce pot face.","Парень, да на тебя смотреть страшно. Приступим...",,Du är en riktig röra. Jag ska se vad jag kan göra.,Çok dağınıksın. Ne yapabileceğime bir bakayım. +What can I do for you?,TXT_DLG_SCRIPT03_D33352_WHATC,MAP03: Feris (no training).,,,Co pro tebe můžu udělat?,Hvad kan jeg gøre for dig?,Was kann ich für dich tun?,,Kion mi faru por vi?,¿Qué puedo hacer por ti?,,Mitä voin tehdä sinulle?,Que puis-je faire pour vous?,,Miben segíthetek?,Cosa posso fare per te?,どういったご用件で?,필요한 게 있으면 말씀하세요.,Wat kan ik voor je doen?,Hva kan jeg gjøre for deg?,Co mogę dla ciebie zrobić?,Como posso te ajudar?,,Ce pot face pentru tine?,Чем я могу тебе помочь?,,Vad kan jag göra för dig?,Senin için ne yapabilirim? +I'm out of bullets.,TXT_RPLY0_SCRIPT03_D33352_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on luodit loppu.,Je suis à cours de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Nie mam nabojów.,Estou sem balas.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT03_D33352_HERES,〃 (〃),,,"Tady máš nějakou munici, neplýtvej s ní.",Her er noget ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä sinulle panoksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",Itt van egy kis muníció számodra. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,여기 조금의 탄약을 나눠줄게요. 낭비하지 마시길.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Nie zmarnuj jej.,Tome um pouco de munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,Al sana biraz mermi. Boşa harcama. -Teach me.,TXT_RPLY1_SCRIPT03_D33352_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Ucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä sinulle panoksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",,Itt van egy kis muníció számodra. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,여기 조금의 탄약을 나눠줄게요. 낭비하지 마시길.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Nie zmarnuj jej.,Tome um pouco de munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,Al sana biraz mermi. Boşa harcama. +Teach me.,TXT_RPLY1_SCRIPT03_D33352_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Ucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. "All right, I'll just show you a few little pointers.",TXT_RYES1_SCRIPT03_D33352_ALLRI,〃 (〃),,,"Dobře, ukážu ti pár triků.","Okay, jeg vil bare vise dig et par små tips.","Alles klar, ich zeige dir ein paar Kniffe.",,"Bone, jen kelkaj konsiletoj...","Muy bien, aquí van -un par de consejos...",,"Hyvä on, annan sinulle vain muutamia pikkuvinkkejä.",Pas de problème. Laissez moi vous montrer quelques trucs.,Akkor addok pár hasznos tanácsot.,"Va bene, ti darò un paio di dritte molto utili.",わかった、貴方にやり方を幾つか教えよう。,좋아요. 훈련에 도움이 될 만한 표적을 보여주겠습니다.,"Oké, ik zal je gewoon een paar kleine tips laten zien.","Greit, jeg skal bare vise deg noen små tips.","Dobrze, podam ci parę wskazówek.","Ok, vou te dar algumas dicas.",,"În regulă, o să îți arăt niște repere.",Хорошо. Покажу тебе пару приёмов.,,"Okej, jag ska bara visa dig några små tips.","Pekala, sana birkaç küçük ipucu göstereceğim." +un par de consejos...",,"Hyvä on, annan sinulle vain muutamia pikkuvinkkejä.",Pas de problème. Laissez moi vous montrer quelques trucs.,,Akkor addok pár hasznos tanácsot.,"Va bene, ti darò un paio di dritte molto utili.",わかった、貴方にやり方を幾つか教えよう。,좋아요. 훈련에 도움이 될 만한 표적을 보여주겠습니다.,"Oké, ik zal je gewoon een paar kleine tips laten zien.","Greit, jeg skal bare vise deg noen små tips.","Dobrze, podam ci parę wskazówek.","Ok, vou te dar algumas dicas.",,"În regulă, o să îți arăt niște repere.",Хорошо. Покажу тебе пару приёмов.,,"Okej, jag ska bara visa dig några små tips.","Pekala, sana birkaç küçük ipucu göstereceğim." You're not ready yet.,TXT_RNO1_SCRIPT03_D33352_YOURE,〃 (〃),,,Ještě nejsi připravený.,Du er ikke klar endnu.,Du bist noch nicht so weit.,,"Vi ankoraŭ -ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,Még nem állsz készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,아직 준비가 안 됐어요.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze gotowy.,Você ainda não está pronto.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. -Back again? What do you need?,TXT_DLG_SCRIPT03_D34868_BACKA,〃 (one training),,,Zase zpátky? Co potřebuješ?,Tilbage igen? Hvad har du brug for?,Scxhon zurück? Was brauchst du?,,Do vi revenis. Kion vi bezonas?,¿Ya de vuelta? ¿Qué necesitas?,,Täällä taas? Mitä tarvitset?,Déjà de retour? De quoi avez-vous besoin?,Már vissza is tértél? Mire van szükséged?,Già di ritorno? Che cosa ti serve?,もう戻りましたか?何が必要ですか?,또 왔네? 뭐가 필요합니까?,Weer terug? Wat heb je nodig?,Tilbake igjen? Hva trenger du?,Wróciłeś? Czego chcesz?,Você novamente? Do que precisa?,,Te-ai întors iar? De ce ai nevoie?,Ты вернулся? Что тебе нужно?,,Tillbaka igen? Vad behöver du?,Yine mi? Neye ihtiyacın var? -I'm out of bullets.,TXT_RPLY0_SCRIPT03_D34868_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on ammukset loppu.,Je suis à cours de munitions.,Kifogytam a golyókból.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Nie mam nabojów.,Estou sem balas.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. +ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,,Még nem állsz készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,아직 준비가 안 됐어요.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze gotowy.,Você ainda não está pronto.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. +Back again? What do you need?,TXT_DLG_SCRIPT03_D34868_BACKA,〃 (one training),,,Zase zpátky? Co potřebuješ?,Tilbage igen? Hvad har du brug for?,Scxhon zurück? Was brauchst du?,,Do vi revenis. Kion vi bezonas?,¿Ya de vuelta? ¿Qué necesitas?,,Täällä taas? Mitä tarvitset?,Déjà de retour? De quoi avez-vous besoin?,,Már vissza is tértél? Mire van szükséged?,Già di ritorno? Che cosa ti serve?,もう戻りましたか?何が必要ですか?,또 왔네? 뭐가 필요합니까?,Weer terug? Wat heb je nodig?,Tilbake igjen? Hva trenger du?,Wróciłeś? Czego chcesz?,Você novamente? Do que precisa?,,Te-ai întors iar? De ce ai nevoie?,Ты вернулся? Что тебе нужно?,,Tillbaka igen? Vad behöver du?,Yine mi? Neye ihtiyacın var? +I'm out of bullets.,TXT_RPLY0_SCRIPT03_D34868_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on ammukset loppu.,Je suis à cours de munitions.,,Kifogytam a golyókból.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Nie mam nabojów.,Estou sem balas.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT03_D34868_HERES,〃 (〃),,,"Tady máš nějakou munici, neplýtvej s ní.",Her er lidt ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä vähän lisää. Älä haaskaa niitä.,"En voilà pour vous, ne les gaspillez pas.",Itt van egy kis muníció számodra. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,뭘 하다 탄약을 낭비한 겁니까? 여기 조금 줄게요.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Nie zmarnuj jej.,Tome um pouco de munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. -You've got enough ammo.,TXT_RNO0_SCRIPT03_D34868_YOUVE,〃 (〃),,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,Van elég lőszered.,Ma veramente ne hai a sufficienza.,弾は十分に見えます。,당신은 충분한 탄약을 가졌어요.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz już wystarczająco dużo amunicji.,Você já tem munição o suficiente.,,Au destulă muniție.,У тебя их достаточно.,,Du har tillräckligt med ammunition.,Yeterince mermin var. -Teach me.,TXT_RPLY1_SCRIPT03_D34868_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Ucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä vähän lisää. Älä haaskaa niitä.,"En voilà pour vous, ne les gaspillez pas.",,Itt van egy kis muníció számodra. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,뭘 하다 탄약을 낭비한 겁니까? 여기 조금 줄게요.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Nie zmarnuj jej.,Tome um pouco de munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. +You've got enough ammo.,TXT_RNO0_SCRIPT03_D34868_YOUVE,〃 (〃),,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,,Van elég lőszered.,Ma veramente ne hai a sufficienza.,弾は十分に見えます。,당신은 충분한 탄약을 가졌어요.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz już wystarczająco dużo amunicji.,Você já tem munição o suficiente.,,Au destulă muniție.,У тебя их достаточно.,,Du har tillräckligt med ammunition.,Yeterince mermin var. +Teach me.,TXT_RPLY1_SCRIPT03_D34868_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Ucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. "All right, this should keep you going for a while.",TXT_RYES1_SCRIPT03_D34868_ALLRI,〃 (〃),,,"Dobře, tohle by ti mělo pomoct.","Okay, det her burde holde dig i gang et stykke tid.","Alles klar, das sollte fürs erste reichen.",,"Bone, ĉi tio devus esti sufiĉe utila nuntempe.","Muy bien, esto debería -servirte por el momento.",,"Selvä on, tällä sinun pitäisi pötkiä aika pitkälle.","Bien, ça devrait vous suffir pour un bon moment.","Rendben van, ezzel el leszel egy darabig.","Va bene, con questo dovresti andare sul sicuro per un po'.",わかりました、これで長くやり合えるでしょう。,그렇군요. 가능한 오래 싸울 수 있을겁니다.,"Oké, dit zou je een tijdje op de been moeten houden.","Greit, dette burde holde deg gående en stund.","Dobrze, to powinno ci pomóc na pewien czas.","Ok, isso deve te ajudar no momento.",,"În regulă, asta ar trebui să te ajute pentru moment.","Хорошо, это не раз спасёт тебе жизнь.",,"Okej, det här borde hålla dig igång ett tag.","Pekala, bu seni bir süre idare eder." +servirte por el momento.",,"Selvä on, tällä sinun pitäisi pötkiä aika pitkälle.","Bien, ça devrait vous suffir pour un bon moment.",,"Rendben van, ezzel el leszel egy darabig.","Va bene, con questo dovresti andare sul sicuro per un po'.",わかりました、これで長くやり合えるでしょう。,그렇군요. 가능한 오래 싸울 수 있을겁니다.,"Oké, dit zou je een tijdje op de been moeten houden.","Greit, dette burde holde deg gående en stund.","Dobrze, to powinno ci pomóc na pewien czas.","Ok, isso deve te ajudar no momento.",,"În regulă, asta ar trebui să te ajute pentru moment.","Хорошо, это не раз спасёт тебе жизнь.",,"Okej, det här borde hålla dig igång ett tag.","Pekala, bu seni bir süre idare eder." "Sorry, can't. I'm just following Macil's orders.",TXT_RNO1_SCRIPT03_D34868_SORRY,〃 (〃),,,"Promiň, nemůžu. Řídím se rozkazy od Macila.","Beklager, jeg kan ikke. Jeg følger bare Macils ordrer.","Tut mir leid, aber ich kann nicht. Ich folge nur Macils Befehlen.",,"Pardonon, mi ne rajtas. Mi nur observas Macil-on.","Lo siento, no puedo. -Solo sigo órdenes de Macil.",,Valitettavasti en voi. Noudatan vain Macilin käskyjä.,"Désolé, pas possible. Je ne fais que suivre les ordres de Macil.","Sajnálom, de nem tehetem. Macil utasítása.","Mi spiace, ma non posso. Ordini dall'alto.",すまないが、できません。マシルの命令です。,미안합니다. 마실 사령관님의 명령을 따라야해요.,"Sorry, dat kan niet. Ik volg gewoon de orders van Macil op.","Beklager, jeg kan ikke. Jeg følger bare Macils ordre.","Przepraszam, ale nie mogę. Ja tylko wykonuję rozkazy Macila.",Desculpe mas não posso. Estou apenas seguindo as ordens de Macil.,,"Scuze, nu merge. Doar urmez ordinele lui Macil.","Увы, не могу. Я подчиняюсь Мэйсилу.",,"Tyvärr, jag kan inte. Jag följer bara Macils order.","Üzgünüm, yapamam. Macil'in emirlerini uyguluyorum." -"Well which is it, bullets or training? I can't wait to get my hands on those new weapons we captured. A little bit of training and then a lot of revenge.",TXT_DLG_SCRIPT03_D36384_WELLW,〃 (two trainings),,,"Tak co to bude, náboje nebo trénink? Nemůžu se dočkat, až se dostanu k těm novým zbraním, které jsme zabavili. Trocha cvičení a pak hodně odplaty.","Nå, hvad er det, kugler eller træning? Jeg kan ikke vente med at få fingrene i de nye våben, vi har taget til fange. En lille smule træning og så en masse hævn.","Also, was willst du? Munition oder Training? Ich kann kaum erwarten, diese neuen Waffen, die wir erbeutet haben, in die Finger zu kriegen. ein bisschen Training und dann jede Menge Vergeltung.",,"Nu, ĉu kugloj aŭ trejnado ĉi-foje? Mi sopire atendas provi tiujn novajn kaptitajn armilojn. Iom da trejnado kaj tiam multe da venĝo.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que hemos capturado. Un poco de entrenamiento y luego mucha venganza.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que capturamos. Un poco de entrenamiento y luego mucha venganza.","No niin, kumpaa saisi olla: luoteja vai koulutusta? En voi malttaa olla tarttumasta vasta kaappaamiimme aseisiin. Hieman perehdytystä, ja sitten paljon kostamista.","Qu'est-ce qu'il vous faut? Des munitions ou de l'entraînement? J'ai hâte d'essayer ces nouvelles armes que l'on a capturé, un peu d'entraînement et beaucoup de vengeance.","Akkor döntsd el, lőszer vagy kiképzés? Már alig várom hogy rátegyem a kezem a lefoglalt fegyverekre. Egy kis kiképzés, és jó sok bosszú.","Bene, che cosa ti serve, munizioni o addestramento? Non vedo l'ora di mettere le mani su quelle nuove armi che abbiamo preso. Un po' di addestramento e poi molta vendetta.","弾薬と訓練、どっちの用件ですか? +Solo sigo órdenes de Macil.",,Valitettavasti en voi. Noudatan vain Macilin käskyjä.,"Désolé, pas possible. Je ne fais que suivre les ordres de Macil.",,"Sajnálom, de nem tehetem. Macil utasítása.","Mi spiace, ma non posso. Ordini dall'alto.",すまないが、できません。マシルの命令です。,미안합니다. 마실 사령관님의 명령을 따라야해요.,"Sorry, dat kan niet. Ik volg gewoon de orders van Macil op.","Beklager, jeg kan ikke. Jeg følger bare Macils ordre.","Przepraszam, ale nie mogę. Ja tylko wykonuję rozkazy Macila.",Desculpe mas não posso. Estou apenas seguindo as ordens de Macil.,,"Scuze, nu merge. Doar urmez ordinele lui Macil.","Увы, не могу. Я подчиняюсь Мэйсилу.",,"Tyvärr, jag kan inte. Jag följer bara Macils order.","Üzgünüm, yapamam. Macil'in emirlerini uyguluyorum." +"Well which is it, bullets or training? I can't wait to get my hands on those new weapons we captured. A little bit of training and then a lot of revenge.",TXT_DLG_SCRIPT03_D36384_WELLW,〃 (two trainings),,,"Tak co to bude, náboje nebo trénink? Nemůžu se dočkat, až se dostanu k těm novým zbraním, které jsme zabavili. Trocha cvičení a pak hodně odplaty.","Nå, hvad er det, kugler eller træning? Jeg kan ikke vente med at få fingrene i de nye våben, vi har taget til fange. En lille smule træning og så en masse hævn.","Also, was willst du? Munition oder Training? Ich kann kaum erwarten, diese neuen Waffen, die wir erbeutet haben, in die Finger zu kriegen. ein bisschen Training und dann jede Menge Vergeltung.",,"Nu, ĉu kugloj aŭ trejnado ĉi-foje? Mi sopire atendas provi tiujn novajn kaptitajn armilojn. Iom da trejnado kaj tiam multe da venĝo.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que hemos capturado. Un poco de entrenamiento y luego mucha venganza.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que capturamos. Un poco de entrenamiento y luego mucha venganza.","No niin, kumpaa saisi olla: luoteja vai koulutusta? En voi malttaa olla tarttumasta vasta kaappaamiimme aseisiin. Hieman perehdytystä, ja sitten paljon kostamista.","Qu'est-ce qu'il vous faut? Des munitions ou de l'entraînement? J'ai hâte d'essayer ces nouvelles armes que l'on a capturé, un peu d'entraînement et beaucoup de vengeance.",,"Akkor döntsd el, lőszer vagy kiképzés? Már alig várom hogy rátegyem a kezem a lefoglalt fegyverekre. Egy kis kiképzés, és jó sok bosszú.","Bene, che cosa ti serve, munizioni o addestramento? Non vedo l'ora di mettere le mani su quelle nuove armi che abbiamo preso. Un po' di addestramento e poi molta vendetta.","弾薬と訓練、どっちの用件ですか? 奪った新しい武器が届くのを待ち切れないです。 少しの訓練でデカい復讐を。","무엇을 원하십니까? 보급? 아니면 훈련? 방금 전달된 새로운 무기들을 만지고 싶습니다! 아무튼, 훈련을 거치면 복수를 멋지게 해내실 거에요.","Wat is het dan wel, kogels of training? Ik kan niet wachten om die nieuwe wapens in handen te krijgen die we gevangen genomen hebben. Een beetje training en dan veel wraak.","Hva er det, kuler eller trening? Jeg gleder meg til å få tak i de nye våpnene vi tok. Litt trening, og så mye hevn.","Więc czego chcesz, naboje czy trening? Nie mogę się doczekać, aż dostanę jedną z tych nowych broni, które udało nam się przejąć. Trochę treningu, a potem zemsta.","Bem, o que vai ser? Munição ou treinamento? Mal posso esperar para pegar nessas novas armas que capturamos. Um pouquinho de treinamento e depois muita vingança.",,"Deci ce alegi, gloanțe sau antrenament? Abia aștept să pun mâna pe noile arme pe care le-am capturat. Puțin antrenament, iar apoi multă răzbunare.","Что скажешь, патроны или тренировка? Мне не терпится опробовать это новое трофейное оружие. Небольшая подготовка, и они за всё заплатят.",,"Vad är det, kulor eller träning? Jag kan inte vänta på att få ta del av de nya vapnen som vi tog till fånga. Lite träning och sedan en massa hämnd.","Hangisi, mermi mi eğitim mi? Yakaladığımız yeni silahları elime almak için sabırsızlanıyorum. Biraz eğitim ve sonra bolca intikam." -I'm out of ammo.,TXT_RPLY0_SCRIPT03_D36384_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for ammunition.,Ich habe keine Munition mehr.,,Mi estas sen municio.,No me queda munición.,,Minulta on panokset loppu.,Je suis à cours de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 떨어졌어요.,Ik heb geen munitie meer.,Jeg er tom for ammunisjon.,Nie mam amunicji.,Estou sem munição.,,Nu mai am muniție.,У меня кончились боеприпасы.,,Jag har slut på ammunition.,Cephanem bitti. +I'm out of ammo.,TXT_RPLY0_SCRIPT03_D36384_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for ammunition.,Ich habe keine Munition mehr.,,Mi estas sen municio.,No me queda munición.,,Minulta on panokset loppu.,Je suis à cours de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 떨어졌어요.,Ik heb geen munitie meer.,Jeg er tom for ammunisjon.,Nie mam amunicji.,Estou sem munição.,,Nu mai am muniție.,У меня кончились боеприпасы.,,Jag har slut på ammunition.,Cephanem bitti. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT03_D36384_HERES,〃 (〃),,,"Tady máš nějakou munici, neplýtvej s ní.",Her er noget ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä ammuksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",Itt van egy kis muníció számodra. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,여기 탄약입니다. 부디 열심히 싸우고 정확하게 쏘시길.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Nie zmarnuj jej.,Tome um pouco de munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. -You've got enough ammo.,TXT_RNO0_SCRIPT03_D36384_YOUVE,〃 (〃),,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,Van elég lőszered.,Ma veramente ne hai a sufficienza.,弾は十分に見えます。,거짓말. 탄약을 충분히 가졌잖아요.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz już wystarczająco dużo amunicji.,Você já tem munição o suficiente.,,Ai destulă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. -Teach me.,TXT_RPLY1_SCRIPT03_D36384_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Ucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä ammuksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",,Itt van egy kis muníció számodra. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,여기 탄약입니다. 부디 열심히 싸우고 정확하게 쏘시길.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Nie zmarnuj jej.,Tome um pouco de munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. +You've got enough ammo.,TXT_RNO0_SCRIPT03_D36384_YOUVE,〃 (〃),,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,,Van elég lőszered.,Ma veramente ne hai a sufficienza.,弾は十分に見えます。,거짓말. 탄약을 충분히 가졌잖아요.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz już wystarczająco dużo amunicji.,Você já tem munição o suficiente.,,Ai destulă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. +Teach me.,TXT_RPLY1_SCRIPT03_D36384_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Ucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. O.K. Take what you've learned here and show those Order clods the way to hell.,TXT_RYES1_SCRIPT03_D36384_OKTAK,〃 (〃),,,"Oukej. Pamatuj, co ses tady naučil, a ukaž těm hajzlům z Řádu kudy do pekla.","O.K. Tag det, du har lært her, og vis de ordensklodser vejen til helvede.","OK. Nutze, was du hier gelernt hast um diesen Tölpeln vom Orden den Weg in die Hölle zu zeigen.",,"Bone. Uzu ĉi tion por gvidi tiujn aĉulojn de La Ordeno al la infero.","Bien. Usa lo aprendido para guiar a esos majaderos de La Orden al infierno.","Bien. Usa lo aprendido para guiar a esos -desgraciados de La Orden al infierno.","OK. Hyödynnä täällä oppimaasi, ja näytä niille Veljeskunnan valopäille tie helvettiin.",OK. Utilisez ce que vous avez appris et envoyez ces abrutis de l'Ordre en enfer.,Akkor rendben is vagyunk. Mutasd meg a Rend barmainak hol lakik az isten.,O.K. Usa ciò che hai imparato qua per mostrare all'Ordine la via dell'Inferno.,"オーケー、ここで学んだ事を生かして +desgraciados de La Orden al infierno.","OK. Hyödynnä täällä oppimaasi, ja näytä niille Veljeskunnan valopäille tie helvettiin.",OK. Utilisez ce que vous avez appris et envoyez ces abrutis de l'Ordre en enfer.,,Akkor rendben is vagyunk. Mutasd meg a Rend barmainak hol lakik az isten.,O.K. Usa ciò che hai imparato qua per mostrare all'Ordine la via dell'Inferno.,"オーケー、ここで学んだ事を生かして オーダー共を地獄に送って上げなさい。",좋아요! 훈련을 통해서 얻은 실력으로 저 오더 돌대가리들을 박살을 내버려요!,"Oké, neem wat je hier geleerd hebt en laat die Ordekluiten de weg naar de hel zien.","OK. Ta det du har lært her, og vis de ordenstullingene veien til helvete.",Ok. Bierz to czego się nauczyłeś i pokaż tym durniom z Zakonu drogę do piekła.,Ok. Use o que você aprendeu aqui para mostrar o caminho pro inferno a esses desgraçados da Ordem.,,În regulă. Folosește ce ai învățat aici si aratăle nătărăilor din Ordin calea spre infern.,"Запоминай внимательно, покажешь этим прихвостням Ордена быструю дорогу в ад.",,O.K. Ta det du lärt dig här och visa de där ordenskloddarna vägen till helvetet.,Tamam. Burada öğrendiklerini al ve o tarikatçılara cehenneme giden yolu göster. "Come back later, when Macil says it's time.",TXT_RNO1_SCRIPT03_D36384_COMEB,〃 (〃),,,"Přijď někdy jindy, až řekne Macil.","Kom tilbage senere, når Macil siger, det er tid.","Komm wieder, wenn Macil dir Bescheid gibt.",,"Revenu post kiam Macil ordonis tion.","Vuelve más tarde cuando -Macil diga que ya es la hora.",,"Palaa asiaan myöhemmin, kun Macil näyttää vihreää valoa.",Revenez plus tard quand Macil décide qu'il est temps.,"Gyere vissza akkor, ha azt mondja Macil hogy ideje van.","Ritorna più tardi, quando Macil dirà che è il momento.",マシルの命令を受けてから、また来なさい。,사령관님은 인내심이 많은 분입니다. 나중에 확인해주시길.,"Kom later terug, als Macil zegt dat het tijd is.","Kom tilbake senere, når Macil sier det er på tide.","Przyjdź później, kiedy Macil powie, że już czas.","Volte mais tarde, quando Macil disser que está na hora.",,"Revin-o mai târziu, când Macil spune că e timpul.","Приходи позже, когда прикажет Мэйсил.",,"Kom tillbaka senare, när Macil säger att det är dags.",Macil zamanı geldiğini söylediğinde geri gel. -I've taught you everything I can right now. Give me some time to put the new weapons through their paces. That is unless you're out of bullets.,TXT_DLG_SCRIPT03_D37900_IVETA,〃 (three trainings),,,"Naučil jsem tě vše, co teď můžu. Dej mi nějaký čas, abych vyzkoušel ty nové zbraně. Jedině, že bys potřeboval náboje.","Jeg har lært dig alt, hvad jeg kan lige nu. Giv mig lidt tid til at sætte de nye våben på prøve. Medmindre du er løbet tør for kugler.","Ich habe dir alles gezeigt, was ich momentan kann. Gib mir etwas Zeit um die neuen Waffen zu testen. Munition kriegst du natürlich auch so.",,"Mi instruis al vi ĉion, kion mi ĉi-momente povas. Donu tempon al mi por elprovi la novajn armilojn... krom se vi nur bezonas pliajn kuglojn.","Te he enseñado todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Ya te enseñé todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Olen opettanut sinulle kaiken, mitä itse juuri nyt osaan. Anna minulle vähän aikaa käydä läpi uusien aseiden askelkuvioita. Ellei sinulla sitten ole luodit lopussa.","Je vous ai enseigné tout ce que je sais. Laissez moi un peu de temps pour tester ces nouvelles armes. Sauf si vous n'avez plus de munitions, bien sûr.","Megtanítottam mindent amit jelenleg tudtam. Adj egy kis időt, hogy leteszteljem a fegyvereket. Kivétel persze ha lőszer kell.",Ti ho insegnato tutto quello che potevo per ora. Dammi dell'altro tempo per mettere le nuove armi alla prova. A meno che non ti servano altre munizioni.,"私が教えられる事はもうありません。 +Macil diga que ya es la hora.",,"Palaa asiaan myöhemmin, kun Macil näyttää vihreää valoa.",Revenez plus tard quand Macil décide qu'il est temps.,,"Gyere vissza akkor, ha azt mondja Macil hogy ideje van.","Ritorna più tardi, quando Macil dirà che è il momento.",マシルの命令を受けてから、また来なさい。,사령관님은 인내심이 많은 분입니다. 나중에 확인해주시길.,"Kom later terug, als Macil zegt dat het tijd is.","Kom tilbake senere, når Macil sier det er på tide.","Przyjdź później, kiedy Macil powie, że już czas.","Volte mais tarde, quando Macil disser que está na hora.",,"Revin-o mai târziu, când Macil spune că e timpul.","Приходи позже, когда прикажет Мэйсил.",,"Kom tillbaka senare, när Macil säger att det är dags.",Macil zamanı geldiğini söylediğinde geri gel. +I've taught you everything I can right now. Give me some time to put the new weapons through their paces. That is unless you're out of bullets.,TXT_DLG_SCRIPT03_D37900_IVETA,〃 (three trainings),,,"Naučil jsem tě vše, co teď můžu. Dej mi nějaký čas, abych vyzkoušel ty nové zbraně. Jedině, že bys potřeboval náboje.","Jeg har lært dig alt, hvad jeg kan lige nu. Giv mig lidt tid til at sætte de nye våben på prøve. Medmindre du er løbet tør for kugler.","Ich habe dir alles gezeigt, was ich momentan kann. Gib mir etwas Zeit um die neuen Waffen zu testen. Munition kriegst du natürlich auch so.",,"Mi instruis al vi ĉion, kion mi ĉi-momente povas. Donu tempon al mi por elprovi la novajn armilojn... krom se vi nur bezonas pliajn kuglojn.","Te he enseñado todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Ya te enseñé todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Olen opettanut sinulle kaiken, mitä itse juuri nyt osaan. Anna minulle vähän aikaa käydä läpi uusien aseiden askelkuvioita. Ellei sinulla sitten ole luodit lopussa.","Je vous ai enseigné tout ce que je sais. Laissez moi un peu de temps pour tester ces nouvelles armes. Sauf si vous n'avez plus de munitions, bien sûr.",,"Megtanítottam mindent amit jelenleg tudtam. Adj egy kis időt, hogy leteszteljem a fegyvereket. Kivétel persze ha lőszer kell.",Ti ho insegnato tutto quello che potevo per ora. Dammi dell'altro tempo per mettere le nuove armi alla prova. A meno che non ti servano altre munizioni.,"私が教えられる事はもうありません。 今後新しい武器は時間が掛かるが自分のペースで 学びなさい。弾切れでなければの話ですが。",제가 제공할 수 있을 만큼의 훈련을 배우셨습니다. 부디 무기를 다룰 시간을 주세요. 보급 때문에 찾아오신 게 아니라면 말이죠.,Ik heb je alles geleerd wat ik nu kan. Geef me wat tijd om de nieuwe wapens op de proef te stellen. Tenzij je geen kogels meer hebt.,Jeg har lært deg alt jeg kan nå. Gi meg litt tid til å teste de nye våpnene. Med mindre du er tom for kuler.,"Nauczyłem cię wszystkiego co mogę na chwilę obecną. Daj mi trochę czasu, aby przetestować nowe bronie. No chyba, że brakuje ci nabojów.",Já te ensinei tudo o que pude. Me dê um tempo para eu testar as novas armas. A não ser que você esteja sem munição.,,Te-am învățat tot ce stiu. Dă-mi niște timp să pun noile arme la treabă. Asta dacă nu ai rămas fără gloanțe.,Пока что я не могу научить тебя ничему новому. Дай мне время разобраться в этом новом оружии. Или у тебя закончились патроны?,,Jag har lärt dig allt jag kan just nu. Ge mig lite tid att sätta de nya vapnen på prov. Det vill säga om du inte har slut på kulor.,Şu anda sana öğretebileceğim her şeyi öğrettim. Yeni silahları denemem için bana biraz zaman ver. Tabii mermin bitmediyse. -Yes I am.,TXT_RPLY0_SCRIPT03_D37900_YESIA,〃 (〃),,,"Ano, potřebuju.","Ja, det er jeg.","Ja, bin ich.",,Ĝuste.,Eso mismo.,,Kyllä on.,"En effet, je le suis.","Igen, az vagyok.",Sì che mi servono.,ああ、そうだ。,알겠습니다. 그럼 탄약이라도?,"Ja, dat ben ik wel.","Ja, det er jeg.",Zgadza się.,"Sim, estou.",,"Da, am rămas fără.","Да, закончились.",,"Ja, det är jag.","Evet, bitti." -Here you go.,TXT_RYES0_SCRIPT03_D37900_HEREY,〃 (〃),,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,Parancsolj.,Ecco qua.,どうぞ。,여기 있어요!,Alsjeblieft.,Vær så god.,Masz.,Aqui está.,,Iată.,Держи.,,Här har du.,Al bakalım. -Don't get trigger happy in the town. You'll set off the alarm and they'll start sending in guards from the castle. ,TXT_DLG_SCRIPT03_D39416_DONTG,MAP03: Upstairs.,,,Ať tě nenapadne střílet ve městě. Spustil bys poplach a přivolal stráže z hradu.,"Bliv ikke skydeglad i byen. Du vil udløse alarmen, og de vil sende vagter fra slottet.","Fang nicht an, hier in der Stadt herumzuballern. Wenn du hier den Alarm auslöst, senden sie gleich die Truppen aus der Burg.",,Ne uzu pafilon en la urbo; vi ekagigus la alarmon kaj ili eksendus gardistojn el la kastelo.,"No te líes a tiros en el pueblo, que activarás la alarma y empezarán a enviar guardias desde el castillo.","No andes a los tiros en el pueblo, que vas a activar la alarma y van a empezar a mandar guardias desde el castillo.","Älä ala turhan liipaisinherkäksi kaupungilla. Aiheutat vielä hälytyksen, ja ne alkavat lähettää linnasta vartijoita.",Ne tirez pas partout en ville. Vous risquez de déclencher l'alarme et ils enverront tous les gardes du château à vos trousses.,"Ne keresd a bajt a városban. Beindítod a riasztót, és kiküldik érted a kastély őröket.",Non ti consiglio di avere il grilletto facile in città. Finiresti per attivare l'allarme e inizierebbero a mandare guardie dal castello.,"街の中で銃をバンバン撃ったりするんじゃないぞ +Yes I am.,TXT_RPLY0_SCRIPT03_D37900_YESIA,〃 (〃),,,"Ano, potřebuju.","Ja, det er jeg.","Ja, bin ich.",,Ĝuste.,Eso mismo.,,Kyllä on.,"En effet, je le suis.",,"Igen, az vagyok.",Sì che mi servono.,ああ、そうだ。,알겠습니다. 그럼 탄약이라도?,"Ja, dat ben ik wel.","Ja, det er jeg.",Zgadza się.,"Sim, estou.",,"Da, am rămas fără.","Да, закончились.",,"Ja, det är jag.","Evet, bitti." +Here you go.,TXT_RYES0_SCRIPT03_D37900_HEREY,〃 (〃),,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,,Parancsolj.,Ecco qua.,どうぞ。,여기 있어요!,Alsjeblieft.,Vær så god.,Masz.,Aqui está.,,Iată.,Держи.,,Här har du.,Al bakalım. +Don't get trigger happy in the town. You'll set off the alarm and they'll start sending in guards from the castle. ,TXT_DLG_SCRIPT03_D39416_DONTG,MAP03: Upstairs.,,,Ať tě nenapadne střílet ve městě. Spustil bys poplach a přivolal stráže z hradu.,"Bliv ikke skydeglad i byen. Du vil udløse alarmen, og de vil sende vagter fra slottet.","Fang nicht an, hier in der Stadt herumzuballern. Wenn du hier den Alarm auslöst, senden sie gleich die Truppen aus der Burg.",,Ne uzu pafilon en la urbo; vi ekagigus la alarmon kaj ili eksendus gardistojn el la kastelo.,"No te líes a tiros en el pueblo, que activarás la alarma y empezarán a enviar guardias desde el castillo.","No andes a los tiros en el pueblo, que vas a activar la alarma y van a empezar a mandar guardias desde el castillo.","Älä ala turhan liipaisinherkäksi kaupungilla. Aiheutat vielä hälytyksen, ja ne alkavat lähettää linnasta vartijoita.",Ne tirez pas partout en ville. Vous risquez de déclencher l'alarme et ils enverront tous les gardes du château à vos trousses.,,"Ne keresd a bajt a városban. Beindítod a riasztót, és kiküldik érted a kastély őröket.",Non ti consiglio di avere il grilletto facile in città. Finiresti per attivare l'allarme e inizierebbero a mandare guardie dal castello.,"街の中で銃をバンバン撃ったりするんじゃないぞ 警報を鳴らしてしまえば、奴等が衛兵共を 城から送り込んでくるぞ。","아무 마을에서나 총을 갈겨대지 마세요. 알람을 울릴 거고, 성안에 있는 병력을 다 끄집어내서라도 당신을 잡을 테니까요.",Laat de trekker niet gelukkig worden in de stad. Je laat het alarm afgaan en ze sturen bewakers van het kasteel naar binnen.,"Ikke bli skyteglad i byen. Du utløser alarmen, og de vil sende inn vakter fra slottet.",Nie bądź taki impulsywny na mieście. Włączysz alarm i zaczną po ciebie wysyłać straże z zamku.,Não fique atirando por toda parte na cidade. Você vai ativar o alarme e eles mandarão os guardas do castelo.,,Nu deveni încântat să apeși pe trăgaci în oraș. Vor declanșa alarma și vor trimite gardieni din castel.,"Когда будешь в городе, не стреляй направо и налево. Если ты поднимешь тревогу, они вызовут подкрепление из замка.",,Bli inte skjutglad i stan. Du kommer att utlösa larmet och de kommer att skicka in vakter från slottet.,Kasabada tetiğe basma. Alarmı çalıştırırsın ve kaleden muhafızlar göndermeye başlarlar. -"Welcome, we can always use more help.",TXT_DLG_SCRIPT03_D40932_WELCO,MAP03: Near Macil.,,,"Vítej, pomoc se nám vždycky hodí.","Velkommen, vi kan altid bruge mere hjælp.","Willkommen, wir können immer etwas Hilfe gebrauchen.",,Bonvenon. Plia helpo ĉiam estas utilega.,"Bienvenido, siempre nos viene bien algo más de ayuda.",,Tervetuloa; voisimme aina kaivata lisää apua.,Bienvenue. Nous apprécions toute l'aide que nous pouvons recevoir.,"Üdv nálunk, mindig jól jön a segítség.","Benvenuto, ci serve tutto l'aiuto che possiamo ottenere.",ようこそ、我々が貴方の助けに成ります。,환영합니다. 당신 같은 사람들이 더 있었더라면...,"Welkom, we kunnen altijd meer hulp gebruiken.","Velkommen, vi kan alltid trenge mer hjelp.","Witaj, każda pomoc się przyda.",Seja bem-vindo. Qualquer ajuda é sempre bem-vinda.,,"Bun venit, mereu putem primi o mână de ajutor.",Добро пожаловать. Нам всегда пригодится помощь.,,"Välkommen, vi kan alltid behöva mer hjälp.","Hoş geldiniz, her zaman daha fazla yardıma ihtiyacımız olabilir." -"When I was still in action we had the chance to examine an acolyte before the reinforcements arrived. Listen, they're not human.",TXT_DLG_SCRIPT03_D42448_WHENI,〃,,,"Když jsem byl ještě v akci, měli jsme možnost prozkoumat mrtvého akolytu předtím, než přišly posily. Poslyš, nejsou to lidé.","Da jeg stadig var i aktion, havde vi mulighed for at undersøge en akolyt, inden forstærkningerne ankom. Hør, de er ikke menneskelige.","Als ich noch aktiv war, hatten wir mal die Möglichkeit, einen der Ministranten zu untersuchen, bevor Verstärkung eintraf. Hör zu, sie sind nicht menschlich!",,"Kiam mi ankoraŭ estis en misio, ni havis okazon ekzameni akoliton antaŭ ol pliaj malamikoj alvenis. Aŭskultu, ili ne estas homoj.","Cuando aún estaba en acción tuvimos la oportunidad de examinar a un acólito antes de que llegaran los refuerzos. Escucha, no son humanos.",,"Kun itse olin vielä mukana taistelemassa, saimme tilaisuuden tutkia akoluuttia ennen lisäjoukkojen saapumista. Ja kuule tarkkaan, ne eivät ole ihmisiä.","Quand j'étais encore en service, j'ai eu l'opportunité d'examiner un acolyte avant que les renforts n'arrivent. Vous savez, ils ne sont pas humains.","A harc után volt alkalmunk megvizsgálni egy oltárszolgát még mielőtt megjelent volna az erősítés. Esküszöm, hogy ezek nem emberek.","Quando ero ancora sul campo di battaglia, abbiamo avuto l'occasione di esaminare uno degli accoliti prima che arrivassero i rinforzi. Ascoltami, non sono umani.","私がまだ活動していた時、我々が増援に +"Welcome, we can always use more help.",TXT_DLG_SCRIPT03_D40932_WELCO,MAP03: Near Macil.,,,"Vítej, pomoc se nám vždycky hodí.","Velkommen, vi kan altid bruge mere hjælp.","Willkommen, wir können immer etwas Hilfe gebrauchen.",,Bonvenon. Plia helpo ĉiam estas utilega.,"Bienvenido, siempre nos viene bien algo más de ayuda.",,Tervetuloa; voisimme aina kaivata lisää apua.,Bienvenue. Nous apprécions toute l'aide que nous pouvons recevoir.,,"Üdv nálunk, mindig jól jön a segítség.","Benvenuto, ci serve tutto l'aiuto che possiamo ottenere.",ようこそ、我々が貴方の助けに成ります。,환영합니다. 당신 같은 사람들이 더 있었더라면...,"Welkom, we kunnen altijd meer hulp gebruiken.","Velkommen, vi kan alltid trenge mer hjelp.","Witaj, każda pomoc się przyda.",Seja bem-vindo. Qualquer ajuda é sempre bem-vinda.,,"Bun venit, mereu putem primi o mână de ajutor.",Добро пожаловать. Нам всегда пригодится помощь.,,"Välkommen, vi kan alltid behöva mer hjälp.","Hoş geldiniz, her zaman daha fazla yardıma ihtiyacımız olabilir." +"When I was still in action we had the chance to examine an acolyte before the reinforcements arrived. Listen, they're not human.",TXT_DLG_SCRIPT03_D42448_WHENI,〃,,,"Když jsem byl ještě v akci, měli jsme možnost prozkoumat mrtvého akolytu předtím, než přišly posily. Poslyš, nejsou to lidé.","Da jeg stadig var i aktion, havde vi mulighed for at undersøge en akolyt, inden forstærkningerne ankom. Hør, de er ikke menneskelige.","Als ich noch aktiv war, hatten wir mal die Möglichkeit, einen der Ministranten zu untersuchen, bevor Verstärkung eintraf. Hör zu, sie sind nicht menschlich!",,"Kiam mi ankoraŭ estis en misio, ni havis okazon ekzameni akoliton antaŭ ol pliaj malamikoj alvenis. Aŭskultu, ili ne estas homoj.","Cuando aún estaba en acción tuvimos la oportunidad de examinar a un acólito antes de que llegaran los refuerzos. Escucha, no son humanos.",,"Kun itse olin vielä mukana taistelemassa, saimme tilaisuuden tutkia akoluuttia ennen lisäjoukkojen saapumista. Ja kuule tarkkaan, ne eivät ole ihmisiä.","Quand j'étais encore en service, j'ai eu l'opportunité d'examiner un acolyte avant que les renforts n'arrivent. Vous savez, ils ne sont pas humains.",,"A harc után volt alkalmunk megvizsgálni egy oltárszolgát még mielőtt megjelent volna az erősítés. Esküszöm, hogy ezek nem emberek.","Quando ero ancora sul campo di battaglia, abbiamo avuto l'occasione di esaminare uno degli accoliti prima che arrivassero i rinforzi. Ascoltami, non sono umani.","私がまだ活動していた時、我々が増援に 囲まれる前にアコライトを調べる機会が あったんだ。聞いてくれ、奴等は人間では なかったんだ。","제가 임무 수행 중이었을 때, 생포한 아콜라이트들을 조사한 적이 있었어요. 요점은, 그 들은 인간이 절대로 아닙니다.","Toen ik nog in actie was hadden we de kans om een acoliet te onderzoeken voordat de versterkingen kwamen. Luister, ze zijn niet menselijk.","Da jeg fortsatt var i tjeneste, fikk vi sjansen til å undersøke en akolytt før forsterkningene kom. Hør her, de er ikke mennesker.","Kiedy byłem jeszcze na chodzie, mieliśmy szansę się przyjrzeć akolitom zanim wezwano posiłki. Słuchaj, to nie są ludzie.","Quando eu estava na ativa, tivemos a oportunidade de examinar um acólito antes dos reforços chegarem. Ouça bem, eles não são humanos.",,"Când încă eram în acțiune am avut șansa de a examina un acolit până să apară întăririle. Ascultă, nu sunt oameni.","Пока я был в оперативной группе, нам удалось изучить одного из служителей, прежде чем прибыло подкрепление. Так вот, они не люди.",,"När jag fortfarande var i aktion hade vi chansen att undersöka en akolyt innan förstärkningarna kom. Lyssna, de är inte mänskliga.","Ben hala görevdeyken, takviye birlikler gelmeden önce bir yardımcı inceleme şansımız oldu. Dinle, onlar insan değil." -"We're trying to find where the castle gate mechanisms are, but so far we've had no luck.",TXT_DLG_SCRIPT03_D43964_WERET,MAP03: Downstairs.,,,"Snažíme se zjistit, kde jsou mechanismy hradní brány, ale zatím jsme nic nenašli.","Vi prøver at finde ud af hvor slottets portmekanismer er, men indtil videre har vi ikke haft held.","Wir versuchen herauszufinden, von wo das Burgtor kontrolliert wird, aber bisher hatten wir kein Glück.",,"Ni provas malkovri, kie troviĝas la mekanismoj de la pordo de la kastelo, sed ni ankoraŭ ne sukcesis.","Estamos intentando descubrir la ubicación de los mecanismos de la puerta del castillo, pero de momento no ha habido suerte.","Estamos tratando de descubrir la ubicación de los mecanismos de la puerta del castillo, pero por ahora no hubo suerte.","Yritämme löytää linnanportin koneistoa, mutta toistaiseksi laihoin tuloksin.","On essaie de trouver où se trouvent les contrôles de la porte du château, mais pour l'instant, on les a pas encore localisés.","Próbáljuk megtalálni a kastély kapu irányító mechanikáját, de eddig nem jártunk sikerrel.","Stiamo cercando di capire dove si trovano i meccanismi di apertura dell'entrata del castello, ma ancora niente.","我々は城門のメカニズムが何処にあるか +"We're trying to find where the castle gate mechanisms are, but so far we've had no luck.",TXT_DLG_SCRIPT03_D43964_WERET,MAP03: Downstairs.,,,"Snažíme se zjistit, kde jsou mechanismy hradní brány, ale zatím jsme nic nenašli.","Vi prøver at finde ud af hvor slottets portmekanismer er, men indtil videre har vi ikke haft held.","Wir versuchen herauszufinden, von wo das Burgtor kontrolliert wird, aber bisher hatten wir kein Glück.",,"Ni provas malkovri, kie troviĝas la mekanismoj de la pordo de la kastelo, sed ni ankoraŭ ne sukcesis.","Estamos intentando descubrir la ubicación de los mecanismos de la puerta del castillo, pero de momento no ha habido suerte.","Estamos tratando de descubrir la ubicación de los mecanismos de la puerta del castillo, pero por ahora no hubo suerte.","Yritämme löytää linnanportin koneistoa, mutta toistaiseksi laihoin tuloksin.","On essaie de trouver où se trouvent les contrôles de la porte du château, mais pour l'instant, on les a pas encore localisés.",,"Próbáljuk megtalálni a kastély kapu irányító mechanikáját, de eddig nem jártunk sikerrel.","Stiamo cercando di capire dove si trovano i meccanismi di apertura dell'entrata del castello, ma ancora niente.","我々は城門のメカニズムが何処にあるか 探し続けているが、あまり良い結果は出ていない","성의 정문이 어떻게 작동하는지, 어떻게 하면 열 수 있는지 연구를 했습니다만... 아직은 희망이 없어요.","We proberen te vinden waar de mechanismen van de kasteelpoort zich bevinden, maar tot nu toe hebben we geen geluk gehad.","Vi prøver å finne ut hvor slottets portmekanismer er, men så langt har vi ikke hatt noe hell.","Próbowaliśmy znaleźć mechanizm bramy zamku, ale nam się nie udało.","Estamos tentando localizar os mecanismos do portão do castelo, mas até agora não tivemos sorte.",,"Încercăm să găsim mecanismele castelului, dar până acum nu am avut noroc.","Мы ищем механизм управления воротами замка, но пока безуспешно.",,"Vi försöker ta reda på var slottets portmekanismer finns, men hittills har vi inte haft någon tur.",Kalenin kapı mekanizmalarının nerede olduğunu bulmaya çalışıyoruz ama şu ana kadar şansımız yaver gitmedi. -Don't get caught. I've heard horror stories about what they do to our people after they're imprisoned. They just disappear... Without a trace.,TXT_DLG_SCRIPT03_D45480_DONTG,〃,,,"Nenech se chytit. Slyšel jsem děsivé příběhy o tom, co dělají našim lidem, když je uvězní. Prostě zmizí... beze stopy.","Bliv ikke fanget. Jeg har hørt skrækhistorier om, hvad de gør ved vores folk, når de er blevet fængslet. De forsvinder bare... Uden et spor.","Lass dich nicht erwischen. Ich habe Horrorgeschichten darüber gehört, was sie unseren Leuten antun, die sie gefangengenommen haben. Sie verschwinden einfach... ohne jede Spur.",,"Oni ne kaptu vin. Mi aŭdis terurajn historiojn pri tio, kio okazas al niaj homoj post ilia aresto: ili simple malaperas, lasinte nenian restaĵon.",Que no te atrapen. He oído historias terroríficas de lo que hacen con nuestros hombres una vez detenidos: simplemente desaparecen sin dejar rastro alguno.,,"Älä jää kiinni. Olen kuullut kauhukertomuksia siitä, mitä ne tekevät meidän omillemme, kun he jäävät vangiksi. He yksinkertaisesti katoavat, jälkeä jättämättä.",Ne vous faites pas avoir. J'ai entendu des choses horribles sur ce qu'ils font à ceux qu'ils emprisonnent. Ils disparaîssent... Sans laisser de trace.,Csak ne fogasd el magad. Hallottam horror történténeteket azokról akiket mégis elfognak. Csak úgy eltünnek...mindenféle nyom nélkül.,Non farti prendere. Ho sentito storie orribili su quello che fanno alle persone dopo che le catturano. Spariscono... senza traccia.,"決して捕まるな。投獄されると奴等が +Don't get caught. I've heard horror stories about what they do to our people after they're imprisoned. They just disappear... Without a trace.,TXT_DLG_SCRIPT03_D45480_DONTG,〃,,,"Nenech se chytit. Slyšel jsem děsivé příběhy o tom, co dělají našim lidem, když je uvězní. Prostě zmizí... beze stopy.","Bliv ikke fanget. Jeg har hørt skrækhistorier om, hvad de gør ved vores folk, når de er blevet fængslet. De forsvinder bare... Uden et spor.","Lass dich nicht erwischen. Ich habe Horrorgeschichten darüber gehört, was sie unseren Leuten antun, die sie gefangengenommen haben. Sie verschwinden einfach... ohne jede Spur.",,"Oni ne kaptu vin. Mi aŭdis terurajn historiojn pri tio, kio okazas al niaj homoj post ilia aresto: ili simple malaperas, lasinte nenian restaĵon.",Que no te atrapen. He oído historias terroríficas de lo que hacen con nuestros hombres una vez detenidos: simplemente desaparecen sin dejar rastro alguno.,,"Älä jää kiinni. Olen kuullut kauhukertomuksia siitä, mitä ne tekevät meidän omillemme, kun he jäävät vangiksi. He yksinkertaisesti katoavat, jälkeä jättämättä.",Ne vous faites pas avoir. J'ai entendu des choses horribles sur ce qu'ils font à ceux qu'ils emprisonnent. Ils disparaîssent... Sans laisser de trace.,,Csak ne fogasd el magad. Hallottam horror történténeteket azokról akiket mégis elfognak. Csak úgy eltünnek...mindenféle nyom nélkül.,Non farti prendere. Ho sentito storie orribili su quello che fanno alle persone dopo che le catturano. Spariscono... senza traccia.,"決して捕まるな。投獄されると奴等が 何をしでかすか怪談として聞く程だ。 跡形もなく...消される。",절대로 붙잡히지 마세요. 그 녀석들이 수감된 사람들에게 한 일에 대한 무서운 이야기를 들었어요. 흔적도 없이 그냥 사라져 버린 겁니다.,Laat je niet vangen. Ik heb horrorverhalen gehoord over wat ze onze mensen na hun gevangenschap aandoen. Ze verdwijnen gewoon.... Zonder een spoor.,Ikke bli tatt. Jeg har hørt skrekkhistorier om hva de gjør med folket vårt etter at de blir fengslet. De bare forsvinner... Sporløst.,"Nie daj się złapać. Słyszałem straszne historie co robią naszym ludziom, kiedy ich złapią. Oni po prostu znikają... Bez śladu.",Não deixe eles te pegarem. Ouvi histórias de terror sobre o que eles fazem com o nosso pessoal depois que são aprisionados. Eles desaparecem... sem deixar rastros.,,Să nu te prindă. Am auzit povești de groază despre ce le fac oamenilor în închisoare. Dispar pur și simplu... fără nicio urmă.,"Не дай себя схватить. Я слышал ужасные истории о том, что они делают с арестованными. Те просто исчезают... без следа.",,Bli inte fångade. Jag har hört skräckhistorier om vad de gör med vårt folk efter att de blivit fängslade. De bara försvinner... Utan ett spår.,Sakın yakalanmayın. Hapsedildikten sonra insanlarımıza ne yaptıklarına dair korku hikayeleri duydum. Öylece ortadan kayboluyorlar. İz bırakmadan. -"Here's some advice, if you ever see any of the Order's Tinsoldiers go in the other direction. They're fast and brutal.",TXT_DLG_SCRIPT03_D46996_HERES,〃,,,"Dám ti radu: Jestli někdy uvidíš jednoho z plecháčků Řádu, otoč se a utíkej. Jsou rychlí a suroví.",Her er et godt råd: Hvis du nogensinde ser nogen af Ordenens Tinsoldater gå i den anden retning. De er hurtige og brutale.,"Hier ist ein guter Rat, falls du jemals einen dieser Zinnsoldaten des Ordens vorbeigehen siehst. Sie sind schnell und brutal. ",,Jen konsilo: estu ĉiam fore de la artefaritaj soldatoj de La Ordeno. Ili estas rapidaj kaj brutalaj.,Un consejo: mantente siempre alejado de los soldados artificiales de La Orden. Son rápidos y brutales.,,"Annan pienen vinkin: Jos koskaan näet Veljeskunnan tinasotilaita, mene toiseen suuntaan. Ne ovat nopeita ja raakoja.","Voilà un conseil. Si vous voyez un des soldats mécanisés de l'Ordre, retournez vous et courez. Ils sont rapides et brutaux.","Az a tanácsom számodra, hogy ha meglátod a Rend ólomkatonáit, vedd az utad az ellentétes irányba. Gyorsak és brutálisak.","Ecco un consiglio. Se vedi uno dei soldatini di latta dell'Ordine, vai nella direzione opposta. Sono veloci e brutali.","伝えておく、オーダーの錫兵は +"Here's some advice, if you ever see any of the Order's Tinsoldiers go in the other direction. They're fast and brutal.",TXT_DLG_SCRIPT03_D46996_HERES,〃,,,"Dám ti radu: Jestli někdy uvidíš jednoho z plecháčků Řádu, otoč se a utíkej. Jsou rychlí a suroví.",Her er et godt råd: Hvis du nogensinde ser nogen af Ordenens Tinsoldater gå i den anden retning. De er hurtige og brutale.,"Hier ist ein guter Rat, falls du jemals einen dieser Zinnsoldaten des Ordens vorbeigehen siehst. Sie sind schnell und brutal. ",,Jen konsilo: estu ĉiam fore de la artefaritaj soldatoj de La Ordeno. Ili estas rapidaj kaj brutalaj.,Un consejo: mantente siempre alejado de los soldados artificiales de La Orden. Son rápidos y brutales.,,"Annan pienen vinkin: Jos koskaan näet Veljeskunnan tinasotilaita, mene toiseen suuntaan. Ne ovat nopeita ja raakoja.","Voilà un conseil. Si vous voyez un des soldats mécanisés de l'Ordre, retournez vous et courez. Ils sont rapides et brutaux.",,"Az a tanácsom számodra, hogy ha meglátod a Rend ólomkatonáit, vedd az utad az ellentétes irányba. Gyorsak és brutálisak.","Ecco un consiglio. Se vedi uno dei soldatini di latta dell'Ordine, vai nella direzione opposta. Sono veloci e brutali.","伝えておく、オーダーの錫兵は 他方から呼び出され押し寄せてくる。 奴等は素早く残忍だ。","조언 하나 하겠습니다. 만약 오더 출신의 깡통로봇들이 당신에게 향하고 있다면, 얼른 피하세요. 그놈들은 훨씬 무섭고 잔혹합니다.","Hier is een advies, als je ooit een van de Tinsoldiers van de Orde de andere kant op ziet gaan. Ze zijn snel en wreed.","Her er noen råd, hvis du noen gang ser noen av Ordenens Tinsoldater gå i den andre retningen. De er raske og brutale.","Dam ci radę. Jeśli zobaczysz jakiegokolwiek Blaszanego Żołnierza Zakonu, idź w przeciwnym kierunku. Są szybcy i brutalni.","Tenho um conselho pra você. Se você ver algum soldadinho da Ordem, vá para outra direção. Eles são rápidos e brutais.",,Uite un sfat: Dacă vezi vreun soldat din staniu du-te în direcția opusă. Sunt rapizi și brutali.,"Небольшой совет: если увидишь «оловянных солдатиков» Ордена, сворачивай в другую сторону. Они быстры и жестоки.",,"Här är ett råd, om du någonsin ser någon av Ordens Tinsoldater gå åt andra hållet. De är snabba och brutala.","İşte size bir tavsiye, eğer Tarikat'ın teneke askerlerinden birini görürseniz diğer yöne gidin. Hızlı ve acımasızdırlar." -Leave me be. I'm doing something for Macil.,TXT_DLG_SCRIPT03_D48512_LEAVE,〃,,,"Teď mě nech, dělám něco pro Macila.",Lad mig være. Jeg gør noget for Macil.,Lass mich in Ruhe. Ich muss etwas für Macil erledigen.,,Lasu min. Mi faras ion por Macil.,"Déjame, que estoy haciendo algo para Macil.",,Anna minun olla. Palvelen parhaillani Macilia.,Laissez moi. Je suis en train de faire quelque chose pour Macil.,Hagyj békén. Épp macil számára csinálok valamit.,"Ora non ho tempo, sto sbrigando un incarico per Macil.","すまないが忙しい。 +Leave me be. I'm doing something for Macil.,TXT_DLG_SCRIPT03_D48512_LEAVE,〃,,,"Teď mě nech, dělám něco pro Macila.",Lad mig være. Jeg gør noget for Macil.,Lass mich in Ruhe. Ich muss etwas für Macil erledigen.,,Lasu min. Mi faras ion por Macil.,"Déjame, que estoy haciendo algo para Macil.",,Anna minun olla. Palvelen parhaillani Macilia.,Laissez moi. Je suis en train de faire quelque chose pour Macil.,,Hagyj békén. Épp macil számára csinálok valamit.,"Ora non ho tempo, sto sbrigando un incarico per Macil.","すまないが忙しい。 私はマシルの雑用を請け負っている。",방해하지 마세요. 사령관님을 위해 중요한 일을 하고 있으니.,Laat me met rust. Ik doe iets voor Macil.,La meg være i fred. Jeg gjør noe for Macil.,Zostaw mnie. Robię coś dla Macila.,Me deixe em paz. Estou fazendo algo pro Macil.,,Lasă-mă. Fac ceva pentru Macil.,"Не отвлекай меня. Я выполняю поручение Мэйсила. ",,Låt mig vara. Jag gör något för Macil.,Beni rahat bırak. Macil için bir şey yapıyorum. -"Sorry, no. You do not have clearance.",TXT_DLG_SCRIPT04_D0_SORRY,MAP04: Reactor Core red guard.,,,"Pardon, ne. Sem nemůžete.","Beklager, nej. Du har ikke tilladelse.","Tut mir leid, aber Sie haben keine Berechtigung.",,"Pardonon, sed ne, vi ne rajtas eniri.","Lo siento, pero no, no tienes permiso.",,"Anteeksi, ei. Sinulla ei ole kulkulupaa.","Non, désolé. Vous n'avez pas d'autorisation.",Sajnálom de nem. Nincs hozzá jogosultságod.,"Mi spiace, ma non hai l'autorizzazione.",すまないが、お前にクリアランスはない。,"유감이지만, 신분 휘장 없이는 보내줄 수 없어.","Sorry, nee. Je hebt geen toestemming.","Beklager, nei. Du har ikke klarering.","Wybacz, ale nie. Nie masz zezwolenia.",Desculpe mas não. Você não tem permissão.,,"Scuze, nu. Nu ai acces.","Увы, нет. У тебя нет пропуска.",,"Tyvärr, nej. Du har inget tillstånd.","Üzgünüm, olmaz. Yetkiniz yok." -Stop! Show me your ID badge.,TXT_DLG_SCRIPT04_D1516_STOPS,〃,,,Stát! Ukažte mi svůj identifikační průkaz.,Stop! Vis mig dit ID-skilt.,Halt. Zeigen Sie mir Ihre Identitätskarte.,,Haltu! Montru vian identigilon de la centralo.,¡Alto! Muéstrame tu identificación de la central.,,Seis! Näytä minulle henkilötunnisteesi.,Stop! Montrez moi votre carte d'identité.,Állj! Mutasd az igazolványod.,Fermo! Mostrami il tesserino d'identificazione.,待て! IDバッジを見せろ。,멈춰라! 너의 신분 휘장을 보여줘.,Stop! Laat me je ID-badge zien.,Stopp! Vis meg ID-kortet ditt.,Stój! Pokaż mi swoją odznakę identyfikacyjną.,Alto! Mostre a sua identificação.,,Stop! Arată-mi cardul de identitate.,Стой! Покажи мне своё удостоверение.,,Stopp! Visa mig din ID-bricka.,Dur! Bana kimliğini göster. -Here's my I.D.,TXT_RPLY0_SCRIPT04_D1516_HERES,〃,,,Tady je moje průkazka.,Her er mit id-kort.,Hier ist sie.,,Jen la identigilo.,Aquí está mi identificación.,,Tässä.,La voilà.,Itt az igazolványom.,Eccolo qua.,これだ。,"여기, 휘장.",Hier is mijn ID.,Her er legitimasjonen min.,Oto ona.,Aqui está ela.,,Aici e cardul.,Вот оно.,,Här är mitt ID-kort.,İşte kimliğim. -"Oh, ok. Sure go ahead. Have a nice day.",TXT_DLG_SCRIPT04_D3032_OHOKS,〃,,,"Aha, dobře. Jistě, jděte dál. Přeji hezký den.","Åh, okay. Selvfølgelig, værsgo. Hav en god dag.","Alles klar, ich wünsche einen schönen Tag.",,"Ha, bone. Kompreneble, eniru. Havu bonan tagon.","Ah, vale. Claro, adelante. Ten un buen día.","Ah, bueno. Claro, adelante. Ten un buen día.","Aa, hyvä. Selvä, voit mennä. Hyvää päivänjatkoa.","Bon, ok. Allez-y. Passez une bonne journée.","Oh, rendben. Mehetsz is tovább. További szép napot.","Ah, va bene. Vai pure avanti. Buona giornata.",あぁ、宜しい。通れ。良い一日を。,"오, 정말이네. 환영한다. 좋은 하루 보내고.","Oh, oké. Ga je gang. Nog een prettige dag.","Å, ok. Vær så god. Ha en fin dag.","Oh, ok. Proszę, wchodź. Miłego dnia.","Ah, ok. Pode passar. Tenha um bom dia.",,"Ah, în regulă. Mergi mai departe. O zi bună.","Ладно, проходи. Всего доброго.",,"Åh, okej. Visst, fortsätt. Ha en trevlig dag.","Oh, tamam. Tabii, devam edin. İyi günler dilerim." -"Derwin? Yeah, he's down in the warehouse, but you're not getting in unless you're cleared.",TXT_DLG_SCRIPT04_D4548_DERWI,MAP04: Warehouse red guard.,,,"Derwin? Jo, ten je dole ve skladu, ale ty nikam nejdeš jestliže nemáš povolení.","Derwin? Ja, han er nede i lageret, men du kommer ikke ind, medmindre du er godkendt.","Derwin? Ja, der ist unten im Lagerhaus, aber da kommst du nicht rein ohne Berechtigung.",,"Ĉu Derwin? Jes, li estas malsupre en la magazeno, sed vi ne rajtas iri tien, krom se vi havas paspermeson.","¿Derwin? Sí, está abajo en el almacén, pero no puedes entrar a menos que tengas permiso.",,"Derwin? Joo, hän on varastolla, muttet pääse sisään ilman kulkulupaa.","Derwin? Ouais, il est dans l'entrepôt. Vous ne pouvez pas y entrer sans autorisation.","Derwin? Igen, Ő épp a raktárban van, de jogosultság nélkül nem jutsz be oda.","Derwin? Sì, è giù nel magazzino, ma non puoi entrare senza autorizzazione.","ダーウィン? ああ、奴はこの倉庫内にいるが、 +"Sorry, no. You do not have clearance.",TXT_DLG_SCRIPT04_D0_SORRY,MAP04: Reactor Core red guard.,,,"Pardon, ne. Sem nemůžete.","Beklager, nej. Du har ikke tilladelse.","Tut mir leid, aber Sie haben keine Berechtigung.",,"Pardonon, sed ne, vi ne rajtas eniri.","Lo siento, pero no, no tienes permiso.",,"Anteeksi, ei. Sinulla ei ole kulkulupaa.","Non, désolé. Vous n'avez pas d'autorisation.",,Sajnálom de nem. Nincs hozzá jogosultságod.,"Mi spiace, ma non hai l'autorizzazione.",すまないが、お前にクリアランスはない。,"유감이지만, 신분 휘장 없이는 보내줄 수 없어.","Sorry, nee. Je hebt geen toestemming.","Beklager, nei. Du har ikke klarering.","Wybacz, ale nie. Nie masz zezwolenia.",Desculpe mas não. Você não tem permissão.,,"Scuze, nu. Nu ai acces.","Увы, нет. У тебя нет пропуска.",,"Tyvärr, nej. Du har inget tillstånd.","Üzgünüm, olmaz. Yetkiniz yok." +Stop! Show me your ID badge.,TXT_DLG_SCRIPT04_D1516_STOPS,〃,,,Stát! Ukažte mi svůj identifikační průkaz.,Stop! Vis mig dit ID-skilt.,Halt. Zeigen Sie mir Ihre Identitätskarte.,,Haltu! Montru vian identigilon de la centralo.,¡Alto! Muéstrame tu identificación de la central.,,Seis! Näytä minulle henkilötunnisteesi.,Stop! Montrez moi votre carte d'identité.,,Állj! Mutasd az igazolványod.,Fermo! Mostrami il tesserino d'identificazione.,待て! IDバッジを見せろ。,멈춰라! 너의 신분 휘장을 보여줘.,Stop! Laat me je ID-badge zien.,Stopp! Vis meg ID-kortet ditt.,Stój! Pokaż mi swoją odznakę identyfikacyjną.,Alto! Mostre a sua identificação.,,Stop! Arată-mi cardul de identitate.,Стой! Покажи мне своё удостоверение.,,Stopp! Visa mig din ID-bricka.,Dur! Bana kimliğini göster. +Here's my I.D.,TXT_RPLY0_SCRIPT04_D1516_HERES,〃,,,Tady je moje průkazka.,Her er mit id-kort.,Hier ist sie.,,Jen la identigilo.,Aquí está mi identificación.,,Tässä.,La voilà.,,Itt az igazolványom.,Eccolo qua.,これだ。,"여기, 휘장.",Hier is mijn ID.,Her er legitimasjonen min.,Oto ona.,Aqui está ela.,,Aici e cardul.,Вот оно.,,Här är mitt ID-kort.,İşte kimliğim. +"Oh, ok. Sure go ahead. Have a nice day.",TXT_DLG_SCRIPT04_D3032_OHOKS,〃,,,"Aha, dobře. Jistě, jděte dál. Přeji hezký den.","Åh, okay. Selvfølgelig, værsgo. Hav en god dag.","Alles klar, ich wünsche einen schönen Tag.",,"Ha, bone. Kompreneble, eniru. Havu bonan tagon.","Ah, vale. Claro, adelante. Ten un buen día.","Ah, bueno. Claro, adelante. Ten un buen día.","Aa, hyvä. Selvä, voit mennä. Hyvää päivänjatkoa.","Bon, ok. Allez-y. Passez une bonne journée.",,"Oh, rendben. Mehetsz is tovább. További szép napot.","Ah, va bene. Vai pure avanti. Buona giornata.",あぁ、宜しい。通れ。良い一日を。,"오, 정말이네. 환영한다. 좋은 하루 보내고.","Oh, oké. Ga je gang. Nog een prettige dag.","Å, ok. Vær så god. Ha en fin dag.","Oh, ok. Proszę, wchodź. Miłego dnia.","Ah, ok. Pode passar. Tenha um bom dia.",,"Ah, în regulă. Mergi mai departe. O zi bună.","Ладно, проходи. Всего доброго.",,"Åh, okej. Visst, fortsätt. Ha en trevlig dag.","Oh, tamam. Tabii, devam edin. İyi günler dilerim." +"Derwin? Yeah, he's down in the warehouse, but you're not getting in unless you're cleared.",TXT_DLG_SCRIPT04_D4548_DERWI,MAP04: Warehouse red guard.,,,"Derwin? Jo, ten je dole ve skladu, ale ty nikam nejdeš jestliže nemáš povolení.","Derwin? Ja, han er nede i lageret, men du kommer ikke ind, medmindre du er godkendt.","Derwin? Ja, der ist unten im Lagerhaus, aber da kommst du nicht rein ohne Berechtigung.",,"Ĉu Derwin? Jes, li estas malsupre en la magazeno, sed vi ne rajtas iri tien, krom se vi havas paspermeson.","¿Derwin? Sí, está abajo en el almacén, pero no puedes entrar a menos que tengas permiso.",,"Derwin? Joo, hän on varastolla, muttet pääse sisään ilman kulkulupaa.","Derwin? Ouais, il est dans l'entrepôt. Vous ne pouvez pas y entrer sans autorisation.",,"Derwin? Igen, Ő épp a raktárban van, de jogosultság nélkül nem jutsz be oda.","Derwin? Sì, è giù nel magazzino, ma non puoi entrare senza autorizzazione.","ダーウィン? ああ、奴はこの倉庫内にいるが、 片付かない限りお前は入れん。",더윈? 녀석은 저 창고 밑에 있다. 그러나 허가 없이는 못 보내준다.,"Derwin? Ja, hij is in het magazijn, maar je komt er niet in tenzij je vrij bent.","Derwin? Ja, han er nede på lageret, men du kommer ikke inn med mindre du er klarert.","Derwin? Tak, jest w magazynie, ale tam nie wejdziesz bez zgody.","Derwin? Sim, ele está lá embaixo no depósito, mas você não pode entrar enquanto não tiver permissão.",,"Darwin? Da, e în depozit, dar nu intri înăuntru dacă nu ai acces.","Дервин? Да, он внизу, на складе, но тебя туда не пустят, если у тебя нет пропуска.",,"Derwin? Ja, han är nere i lagret, men du kommer inte in om du inte har fått tillstånd.","Derwin? Evet, depoda ama izin almadan içeri giremezsin." -I've got clearance.,TXT_RPLY0_SCRIPT04_D4548_IVEGO,〃,,,Mám povolení.,Jeg har fået tilladelse.,Ich habe eine Berechtigung.,,Mi havas ĝin.,Tengo permiso.,,Minulla on lupa.,J'ai une autorisation.,Van jogosultságom.,Ce l'ho l'autorizzazione.,クリアランスはある。,허가를 받았어.,Ik heb toestemming.,Jeg har klarering.,Mam zezwolenie.,Eu tenho permissão.,,Am acces.,У меня есть пропуск.,,Jag har tillstånd.,İznim var. -Go on.,TXT_DLG_SCRIPT04_D6064_GOON,〃,,,Tak jdi.,Jeg har tilladelse.,Alles klar.,,Vi rajtas iri.,Entonces ve.,,Jatkakaa.,Allez-y.,Mesélj csak.,Va pure.,続けろ。,그럼 가도 좋다.,Ga door.,Jeg har klarering.,Wchodź.,Pode passar.,,Intră.,Проходи.,,Fortsätt.,Devam et. -Do you know where he is?,TXT_RPLY0_SCRIPT04_D6064_DOYOU,〃,,,"Nevíš, kde je?","Ved du, hvor han er?","Weißt du, wo er ist?",,"Ĉu vi scias, kie li estas?",¿Sabes dónde está?,,"Tiedätkö, missä hän on?",Vous savez où il est?,Tudod hol találom meg?,Sai dov'è?,ソイツが何処にいるか知っているか?,그가 어디 있는지 아는가?,Weet je waar hij is?,Vet du hvor han er?,Wiesz gdzie on jest?,Você sabe onde ele está?,,Știi unde e?,"Вы знаете, где Дервин?",,Vet du var han är?,Nerede olduğunu biliyor musun? -I don't know where anybody is. I just keep the lid on the rat trap.,TXT_DLG_SCRIPT04_D7580_IDONT,〃,,,Já nevím kde kdo je. Já jen dohlížím na pastičku na myši.,"Jeg ved ikke, hvor nogen er. Jeg holder bare låget på rottefælden.","Ich weiß von niemandem, wo er ist. Ich kümmere mich nur um die Rattenfalle.",,Mi scias nenies pozicion. Mi nur estas komisiito de la pordoj de ĉi tiu ratkaptilo.,No me sé la ubicación de nadie. Solo estoy a cargo de las puertas de esta ratonera.,,"En tiedä, missä kukaan on. Huolehdin vain rotanloukun kannesta.",Je ne sais pas où se trouve qui que ce soit. Je ne fais que garder le couvercle de ce trou à rats.,Ötletem sincs merre vannak az emberek. Én csak a patkány csapda tetejéért vagyok felelős.,Non so dove sia nessuno di quelli che stanno nel magazzino. A me interessa solo che non scappino.,"俺には何処にいるかは分からない。 +I've got clearance.,TXT_RPLY0_SCRIPT04_D4548_IVEGO,〃,,,Mám povolení.,Jeg har fået tilladelse.,Ich habe eine Berechtigung.,,Mi havas ĝin.,Tengo permiso.,,Minulla on lupa.,J'ai une autorisation.,,Van jogosultságom.,Ce l'ho l'autorizzazione.,クリアランスはある。,허가를 받았어.,Ik heb toestemming.,Jeg har klarering.,Mam zezwolenie.,Eu tenho permissão.,,Am acces.,У меня есть пропуск.,,Jag har tillstånd.,İznim var. +Go on.,TXT_DLG_SCRIPT04_D6064_GOON,〃,,,Tak jdi.,Jeg har tilladelse.,Alles klar.,,Vi rajtas iri.,Entonces ve.,,Jatkakaa.,Allez-y.,,Mesélj csak.,Va pure.,続けろ。,그럼 가도 좋다.,Ga door.,Jeg har klarering.,Wchodź.,Pode passar.,,Intră.,Проходи.,,Fortsätt.,Devam et. +Do you know where he is?,TXT_RPLY0_SCRIPT04_D6064_DOYOU,〃,,,"Nevíš, kde je?","Ved du, hvor han er?","Weißt du, wo er ist?",,"Ĉu vi scias, kie li estas?",¿Sabes dónde está?,,"Tiedätkö, missä hän on?",Vous savez où il est?,,Tudod hol találom meg?,Sai dov'è?,ソイツが何処にいるか知っているか?,그가 어디 있는지 아는가?,Weet je waar hij is?,Vet du hvor han er?,Wiesz gdzie on jest?,Você sabe onde ele está?,,Știi unde e?,"Вы знаете, где Дервин?",,Vet du var han är?,Nerede olduğunu biliyor musun? +I don't know where anybody is. I just keep the lid on the rat trap.,TXT_DLG_SCRIPT04_D7580_IDONT,〃,,,Já nevím kde kdo je. Já jen dohlížím na pastičku na myši.,"Jeg ved ikke, hvor nogen er. Jeg holder bare låget på rottefælden.","Ich weiß von niemandem, wo er ist. Ich kümmere mich nur um die Rattenfalle.",,Mi scias nenies pozicion. Mi nur estas komisiito de la pordoj de ĉi tiu ratkaptilo.,No me sé la ubicación de nadie. Solo estoy a cargo de las puertas de esta ratonera.,,"En tiedä, missä kukaan on. Huolehdin vain rotanloukun kannesta.",Je ne sais pas où se trouve qui que ce soit. Je ne fais que garder le couvercle de ce trou à rats.,,Ötletem sincs merre vannak az emberek. Én csak a patkány csapda tetejéért vagyok felelős.,Non so dove sia nessuno di quelli che stanno nel magazzino. A me interessa solo che non scappino.,"俺には何処にいるかは分からない。 俺はただネズミ捕りにフタを被せているだけだ。",그가 정확히 어디 있는지는 모른다. 난 도망자를 그냥 감시할 뿐이다.,Ik weet niet waar iemand is. Ik hou gewoon het deksel op de rattenval.,Jeg vet ikke hvor noen er. Jeg holder bare lokket på rottefella.,Nie wiem gdzie kto jest. Ja tylko plinuję tej pułapki na szczury.,Não sei onde ninguém está. Apenas mantenho a tampa neste bueiro.,,"Nu știu unde e nimeni, eu doar țin ochii pe capcana pentru șoareci.","Ничего я не знаю. Я просто слежу, чтобы никто из них не сбежал из западни.",,Jag vet inte var någon är. Jag håller bara locket på råttfällan.,Kimsenin nerede olduğunu bilmiyorum. Ben sadece fare kapanının kapağını tutuyorum. -You are an unpleasant distraction.,TXT_DLG_SCRIPT04_D9096_YOUAR,〃,,,Jsi nepříjemná otrava.,Du er en ubehagelig distraktion.,Du bist eine unerwünschte Ablenkung,,Vi estas malagrabla distraĵo.,Eres una distracción incómoda.,,Oletpa epämiellyttävä häiriötekijä.,Vous êtes une distraction déplaisante.,Egy kellemetlen zavaró tényező vagy.,Sei una sgradevole distazione.,お前は不快で目障りだ。,당신은 지금 내 감시일을 방해하고 있다.,Je bent een onaangename afleiding.,Du er en ubehagelig distraksjon.,Bardzo mnie rozpraszasz.,Você é uma distração bem incômoda.,,Ești o distragere neplăcută.,Ты — досадная помеха.,,Du är en obehaglig distraktion.,Hoş olmayan bir dikkat dağıtıcısın. -Move along or taste metal.,TXT_DLG_SCRIPT04_D10612_MOVEA,MAP04: Reactor Core gray guard.,,,"Jdi dál, nebo okus ocel.",Gå videre eller smag på metal.,Beweg dich oder du schmeckst Metall.,,Plue movu vin aŭ gustumu kuglojn.,Esfúmate o come plomo.,,"Ala vetää, tai maista metallia.",Circulez ou préparez vous à manger de l'acier.,"Haladj tovább, vagy ízleld meg a kardom.",Sparisci o ti finisce male.,同行か鉄を味わうかだ。,어서 움직여. 총알 먹기 싫으면.,Ga verder of proef metaal.,Gå videre eller smak på metall.,Odejdź stąd albo posmakujesz mojej pukawki.,Vá embora ou vai tomar chumbo grosso.,,Mșcă-te sau înghiți metal.,"Прочь, или отведаешь металла.",,Gå vidare eller smaka på metall.,İlerle yoksa metalin tadına bakarsın. -Pass your ID through here for access.,TXT_DLG_SCRIPT04_D12128_PASSY,,,,Pro přístup tady nahrajte svou legitimaci.,Giv dit ID her igennem for at få adgang.,Reichen Sie Ihre Identitätskarte hier durch!,,Ŝovu vian identigilon sur la legilon por eniri.,Pasa tu identificación por aquí para acceder.,,Vedä tunnisteesi tästä päästäksesi läpi.,Faites passer votre carte d'identité ici pour continuer.,Add le az igazolványod itt a belépéshez.,Mostra il tesserino per accedere.,彼方のI.D.をここに提示してください。,신분증을 보여줘. 입장하고 싶으면.,Geef je ID hier door voor toegang.,Før legitimasjonen din gjennom her for å få adgang.,"Pokaż tu swój identyfikator, aby otrzymać dostęp.",Passe a sua identificação por aqui para acessar.,,Trece cardul de acces pe aici.,"Покажи своё удостоверение, чтобы получить допуск.",,Ge ditt ID-kort här för att få tillträde.,Giriş için kimliğinizi buradan geçirin. -"Get back to work, now!",TXT_DLG_SCRIPT04_D13644_GETBA,MAP04: Green guard.,,,"Vrať se do práce, hned!","Tilbage til arbejdet, nu!",Gehen Sie sofort zurück an die Arbeit!,,"Reiru al via laborposteno, tuje!","Vuelve al trabajo, ¡ahora!",,"No niin, takaisin töihisi!","Retournez au boulot, maintenant!",Nyomás vissza dolgozni!,Ora torna a lavoro!,仕事へ戻れ、今すぐ!,당장 일해. 어서.,"Ga terug aan het werk, nu!","Tilbake til arbeidet, nå!","Do roboty, już!","Volte ao trabalho, agora!",,"Treci înapoi la muncă, acum!",Немедленно за работу!,,"Tillbaka till arbetet, nu!","İşinizin başına dönün, hemen!" -"Get back to work, now!",TXT_DLG_SCRIPT04_D15160_GETBA,〃,,,"Vrať se do práce, hned!","Tilbage til arbejdet, nu!",Gehen Sie sofort zurück an die Arbeit!,,"Reiru al via laborposteno, tuje!","Vuelve al trabajo, ¡ahora!",,"No niin, takaisin töihisi!","Retournez au boulot, maintenant!",Nyomás vissza dolgozni!,Ora torna a lavoro!,今すぐ仕事へ戻れ!,쉬면 알지? 어서 일해.,"Ga terug aan het werk, nu!","Tilbake til arbeidet, nå!","Do roboty, już!","Volte ao trabalho, agora!",,"Treci înapoi la muncă, acum!",Немедленно за работу!,,"Tillbaka till arbetet, nu!","İşinizin başına dönün, hemen!" -We've been running around the clock for weeks with no down time. I'd say that the Order is planning a suppression raid on the Front.,TXT_DLG_SCRIPT04_D16676_WEVEB,MAP04: Warehouse → Northeast (worker in red),,,"Celé týdny makáme bez přestávek. Řekl bych, že Řád má v plánu nějaký útok na Frontu.","Vi har kørt døgnet rundt i ugevis uden at have nogen pause. Jeg vil sige, at Ordenen planlægger et undertrykkelsesangreb på fronten.","Die Station hier läuft seit Wochen ohne Stillstand. Ich vermute mal, der Orden bereitet einen großen Schlag gegen die Front vor.",,"Ni senhalte laboras 24 horojn ĉiutage de antaŭ semajnoj. Mi dirus, ke La Ordeno planas atakon por subpremi la Fronton.",Llevamos semanas trabajando 24 horas al día sin parar. Diría que La Orden está planeando una incursión para suprimir al Frente.,,"Olemme työskennelleet viikkoja kellon ympäri ilman silmällistäkään. Sanoisin, että Veljeskunta on suunnittelemassa ehkäisevää iskua Rintamaa vastaan.",J'ai fait le tour de l'horloge depuis des semaines sans temps de repos. Je pense que l'Ordre prépare un raid de suppression sur le Front.,"A nap minden órájában dolgoztunk szünet nélkül. Az a gyanúm, hogy a Rend sorsdöntő támadást akar indítani a Front ellen.",Stiamo lavorando senza sosta per settimane oramai. Secondo me l'Ordine sta preparando un nuovo attacco contro il Fronte.,"もう数週間も休日返上で働いているんだ。 +You are an unpleasant distraction.,TXT_DLG_SCRIPT04_D9096_YOUAR,〃,,,Jsi nepříjemná otrava.,Du er en ubehagelig distraktion.,Du bist eine unerwünschte Ablenkung,,Vi estas malagrabla distraĵo.,Eres una distracción incómoda.,,Oletpa epämiellyttävä häiriötekijä.,Vous êtes une distraction déplaisante.,,Egy kellemetlen zavaró tényező vagy.,Sei una sgradevole distazione.,お前は不快で目障りだ。,당신은 지금 내 감시일을 방해하고 있다.,Je bent een onaangename afleiding.,Du er en ubehagelig distraksjon.,Bardzo mnie rozpraszasz.,Você é uma distração bem incômoda.,,Ești o distragere neplăcută.,Ты — досадная помеха.,,Du är en obehaglig distraktion.,Hoş olmayan bir dikkat dağıtıcısın. +Move along or taste metal.,TXT_DLG_SCRIPT04_D10612_MOVEA,MAP04: Reactor Core gray guard.,,,"Jdi dál, nebo okus ocel.",Gå videre eller smag på metal.,Beweg dich oder du schmeckst Metall.,,Plue movu vin aŭ gustumu kuglojn.,Esfúmate o come plomo.,,"Ala vetää, tai maista metallia.",Circulez ou préparez vous à manger de l'acier.,,"Haladj tovább, vagy ízleld meg a kardom.",Sparisci o ti finisce male.,同行か鉄を味わうかだ。,어서 움직여. 총알 먹기 싫으면.,Ga verder of proef metaal.,Gå videre eller smak på metall.,Odejdź stąd albo posmakujesz mojej pukawki.,Vá embora ou vai tomar chumbo grosso.,,Mșcă-te sau înghiți metal.,"Прочь, или отведаешь металла.",,Gå vidare eller smaka på metall.,İlerle yoksa metalin tadına bakarsın. +Pass your ID through here for access.,TXT_DLG_SCRIPT04_D12128_PASSY,,,,Pro přístup tady nahrajte svou legitimaci.,Giv dit ID her igennem for at få adgang.,Reichen Sie Ihre Identitätskarte hier durch!,,Ŝovu vian identigilon sur la legilon por eniri.,Pasa tu identificación por aquí para acceder.,,Vedä tunnisteesi tästä päästäksesi läpi.,Faites passer votre carte d'identité ici pour continuer.,,Add le az igazolványod itt a belépéshez.,Mostra il tesserino per accedere.,彼方のI.D.をここに提示してください。,신분증을 보여줘. 입장하고 싶으면.,Geef je ID hier door voor toegang.,Før legitimasjonen din gjennom her for å få adgang.,"Pokaż tu swój identyfikator, aby otrzymać dostęp.",Passe a sua identificação por aqui para acessar.,,Trece cardul de acces pe aici.,"Покажи своё удостоверение, чтобы получить допуск.",,Ge ditt ID-kort här för att få tillträde.,Giriş için kimliğinizi buradan geçirin. +"Get back to work, now!",TXT_DLG_SCRIPT04_D13644_GETBA,MAP04: Green guard.,,,"Vrať se do práce, hned!","Tilbage til arbejdet, nu!",Gehen Sie sofort zurück an die Arbeit!,,"Reiru al via laborposteno, tuje!","Vuelve al trabajo, ¡ahora!",,"No niin, takaisin töihisi!","Retournez au boulot, maintenant!",,Nyomás vissza dolgozni!,Ora torna a lavoro!,仕事へ戻れ、今すぐ!,당장 일해. 어서.,"Ga terug aan het werk, nu!","Tilbake til arbeidet, nå!","Do roboty, już!","Volte ao trabalho, agora!",,"Treci înapoi la muncă, acum!",Немедленно за работу!,,"Tillbaka till arbetet, nu!","İşinizin başına dönün, hemen!" +"Get back to work, now!",TXT_DLG_SCRIPT04_D15160_GETBA,〃,,,"Vrať se do práce, hned!","Tilbage til arbejdet, nu!",Gehen Sie sofort zurück an die Arbeit!,,"Reiru al via laborposteno, tuje!","Vuelve al trabajo, ¡ahora!",,"No niin, takaisin töihisi!","Retournez au boulot, maintenant!",,Nyomás vissza dolgozni!,Ora torna a lavoro!,今すぐ仕事へ戻れ!,쉬면 알지? 어서 일해.,"Ga terug aan het werk, nu!","Tilbake til arbeidet, nå!","Do roboty, już!","Volte ao trabalho, agora!",,"Treci înapoi la muncă, acum!",Немедленно за работу!,,"Tillbaka till arbetet, nu!","İşinizin başına dönün, hemen!" +We've been running around the clock for weeks with no down time. I'd say that the Order is planning a suppression raid on the Front.,TXT_DLG_SCRIPT04_D16676_WEVEB,MAP04: Warehouse → Northeast (worker in red),,,"Celé týdny makáme bez přestávek. Řekl bych, že Řád má v plánu nějaký útok na Frontu.","Vi har kørt døgnet rundt i ugevis uden at have nogen pause. Jeg vil sige, at Ordenen planlægger et undertrykkelsesangreb på fronten.","Die Station hier läuft seit Wochen ohne Stillstand. Ich vermute mal, der Orden bereitet einen großen Schlag gegen die Front vor.",,"Ni senhalte laboras 24 horojn ĉiutage de antaŭ semajnoj. Mi dirus, ke La Ordeno planas atakon por subpremi la Fronton.",Llevamos semanas currando 24 horas al día sin parar. Diría que La Orden está planeando una incursión para suprimir al Frente.,Llevamos semanas trabajando 24 horas al día sin parar. Diría que La Orden está planeando una incursión para suprimir al Frente.,"Olemme työskennelleet viikkoja kellon ympäri ilman silmällistäkään. Sanoisin, että Veljeskunta on suunnittelemassa ehkäisevää iskua Rintamaa vastaan.",J'ai fait le tour de l'horloge depuis des semaines sans temps de repos. Je pense que l'Ordre prépare un raid de suppression sur le Front.,,"A nap minden órájában dolgoztunk szünet nélkül. Az a gyanúm, hogy a Rend sorsdöntő támadást akar indítani a Front ellen.",Stiamo lavorando senza sosta per settimane oramai. Secondo me l'Ordine sta preparando un nuovo attacco contro il Fronte.,"もう数週間も休日返上で働いているんだ。 オーダーがまたフロントを攻撃する準備を しているんだろうな。","일주일 동안 쉬지도 않고 일하느라 정신이 날아갈 것 같아요... 아무튼, 오더가 프론트 저항군을 제압할 작전을 준비한다는군요.","We rennen al weken rond de klok, zonder uitvaltijd. Ik zou zeggen dat de Orde een onderdrukkingsinval aan de voorkant plant.",Vi har kjørt døgnet rundt i ukevis uten pause. Jeg vil si at Ordenen planlegger et undertrykkelsesangrep på Fronten.,"Od kilku tygodni pracujemy przez całą dobę bez przerwy. Powiedziałbym, że Zakon planuje zniszczyć Front.",Estamos trabalhando noite e dia por semanas sem descanso. Eu diria que a Ordem está planjeando um ataque para suprimir a Frente.,,Muncim non-stop de săptămăni fără niciun fel de pauză. Aș zice că Ordinul plănuiește un atac de reprimare asupra Frontului.,"Мы работаем круглые сутки без перерыва уже несколько недель. Мне кажется, Орден готовит решительный рейд, чтобы окончательно покончить с Сопротивлением.",,Vi har kört dygnet runt i flera veckor utan några avbrott. Jag skulle säga att Orden planerar en attack mot fronten.,Haftalardır hiç ara vermeden gece gündüz çalışıyoruz. Tarikat'ın Cephe'ye bir baskın planladığını söyleyebilirim. -"Oh, damn. The governor sent you. I was going to give him his cut, really I was. OK, listen. I've got a bundle stashed. It's yours if you look the other way.",TXT_DLG_SCRIPT04_D18192_OHDAM,MAP04: Derwin.,,,"A sakra. Guvernér tě poslal. Měl jsem v plánu dát mu jeho podíl, opravdu. Dobře, poslouchej. Mám schované nějaké zlaťáky, můžou být tvoje, když přimhouříš oko.","Åh, for pokker. Guvernøren har sendt dig. Jeg ville give ham sin andel, det ville jeg virkelig. Okay, hør her. Jeg har en bunke gemt. Det er dit, hvis du ser den anden vej.","Verdammt, der Gouverneur hat dich geschickt. Ich wollte ihm seinen Anteil geben - wirklich ich wollte das. Hör zu, ich habe hier was zur Seite geschafft, es gehört die wenn du die Sache auf sich beruhen läßt.",,"Ha, fek, la registo venigis vin; mi estis pagonta lin, serioze. Nu, aŭskultu, mi havas kelke da kaŝita mono; ĝi estas via se vi rigardos aliloken.","Ah, maldición, el gobernador te ha enviado; iba a darle su parte, en serio. Bueno, escucha, tengo un puñado escondido; es tuyo si miras para otro lado.","Ah, no puede ser, te manda el gobernador; iba a darle su parte, en serio. Bueno, escucha, tengo un puñado escondido; es tuyo si miras para otro lado.","Voi helvetti, kuvernööri on lähettänyt sinut. Meinasin antaa hänelle hänen siivunsa, ihan totta. Hei, kuuntele. Minulla on jemma kätkettynä. Se on sinun, jos katsot asiaa läpi sormiesi.","Oh, merde. Le gouverneur t'a envoyé? J'allais lui donner sa part, si, vraiment. Ok, écoute. J'en ai un paquet de mis de côté. Si tu veux, tu peux le prendre, si tu m'oublies.","Szóval a kormányzó küldött...francba. Oda akartam adni a megillető részét, hidd el tényleg. Figyelj, itt egy köteg eldugva. A tied ha képes vagy szemet hunyni felette.","Ah, dannazione... Ti ha mandato il governatore. Gli avrei dato la sua parte, giuro che l'avrei fatto. Ok, ascolta. Ho una parcella qua con me. È tua se chiudi un occhio.","クソッ、知事の回し者だな。 +"Oh, damn. The governor sent you. I was going to give him his cut, really I was. OK, listen. I've got a bundle stashed. It's yours if you look the other way.",TXT_DLG_SCRIPT04_D18192_OHDAM,MAP04: Derwin.,,,"A sakra. Guvernér tě poslal. Měl jsem v plánu dát mu jeho podíl, opravdu. Dobře, poslouchej. Mám schované nějaké zlaťáky, můžou být tvoje, když přimhouříš oko.","Åh, for pokker. Guvernøren har sendt dig. Jeg ville give ham sin andel, det ville jeg virkelig. Okay, hør her. Jeg har en bunke gemt. Det er dit, hvis du ser den anden vej.","Verdammt, der Gouverneur hat dich geschickt. Ich wollte ihm seinen Anteil geben - wirklich ich wollte das. Hör zu, ich habe hier was zur Seite geschafft, es gehört die wenn du die Sache auf sich beruhen läßt.",,"Ha, fek, la registo venigis vin; mi estis pagonta lin, serioze. Nu, aŭskultu, mi havas kelke da kaŝita mono; ĝi estas via se vi rigardos aliloken.","Ah, maldición, el gobernador te ha enviado; iba a darle su parte, en serio. Bueno, escucha, tengo un puñado escondido; es tuyo si miras para otro lado.","Ah, no puede ser, te manda el gobernador; iba a darle su parte, en serio. Bueno, escucha, tengo un puñado escondido; es tuyo si miras para otro lado.","Voi helvetti, kuvernööri on lähettänyt sinut. Meinasin antaa hänelle hänen siivunsa, ihan totta. Hei, kuuntele. Minulla on jemma kätkettynä. Se on sinun, jos katsot asiaa läpi sormiesi.","Oh, merde. Le gouverneur t'a envoyé? J'allais lui donner sa part, si, vraiment. Ok, écoute. J'en ai un paquet de mis de côté. Si tu veux, tu peux le prendre, si tu m'oublies.",,"Szóval a kormányzó küldött...francba. Oda akartam adni a megillető részét, hidd el tényleg. Figyelj, itt egy köteg eldugva. A tied ha képes vagy szemet hunyni felette.","Ah, dannazione... Ti ha mandato il governatore. Gli avrei dato la sua parte, giuro che l'avrei fatto. Ok, ascolta. Ho una parcella qua con me. È tua se chiudi un occhio.","クソッ、知事の回し者だな。 本当はあいつに分け前を渡そうとしてたんだがな。 よし、聞いてくれ。金はあるから、 見逃してくれりゃお前にも分けてやる。","이런 제길... 총독 새끼가 널 보낸 거지? 하필 그 녀석의 몫을 보내기 전에. 좋아, 잘 들어. 날 살려주면 내가 숨긴 비상금을 줄게!","Oh, verdomme. De gouverneur heeft je gestuurd. Ik wilde hem zijn deel geven, echt waar. Oké, luister. Ik heb een bundel verstopt. Het is van jou als je de andere kant op kijkt.","Å, pokker. Guvernøren sendte deg. Jeg skulle gi ham hans andel, det skulle jeg virkelig. OK, hør her. Jeg har gjemt en bunke. Den er din hvis du ser den andre veien.","Kurde. Przysłał cię gubernator. Chciałem się z nim podzielić udziałami, naprawdę. Ok, słuchaj. Mam tu ukryty pewien pakunek. Będzie twój jeśli zawrócisz.","Ah, merda. O governador enviou você. Eu ja ia passar a parte dele, sério mesmo. Ok, ouça. Eu tenho um pacote escondido aqui. Ele é seu se você deixar passar.",,"Of, firar. Guvernatorul te-a trimis. Urma să îi dau partea lui din câștig, chiar urma, pe cuvânt. În regulă, ascultă. Am un pachet ascuns. E al tău dacă alegi să ignori ceea ce s-a întâmplat.","Ох, чёрт. Ты от губернатора. Я собирался отдать ему его долю — нет, правда. Слушай, я поднакопил изрядно денег — они твои, если найдёшь иной выход из ситуации.",,"Fan också. Guvernören skickade dig. Jag tänkte ge honom hans andel, verkligen. Okej, lyssna. Jag har en bunt gömt. Det är ditt om du tittar åt andra hållet.","Oh, kahretsin. Seni vali gönderdi. Ona payını verecektim, gerçekten. Tamam, dinle. Sakladığım bir paket var. Diğer tarafa bakarsan senindir." -"All right, I'll let you go.",TXT_RPLY0_SCRIPT04_D18192_ALLRI,〃,,,"Dobře, nechám tě jít.","Okay, jeg lader dig gå.","Ok, ich lass dich gehen.",,"Bone, vi rajtas foriri.","Muy bien, te dejaré ir.","Muy bien, te dejo ir.","Hyvä on, päästän sinut.","D'accord, tu peux y aller.","Rendben, elengedlek.","Va bene, ti lascerò andare.",分かった、見逃そう。,좋아. 그럼 널 살려주지.,"Oké, ik laat je gaan.","Greit, jeg skal la deg gå.","Dobra, zostawię cię w spokoju.","Ok, vou te deixar em paz.",,"În regulă, te las în pace.","Ладно, я дам тебе уйти.",,"Okej, jag låter dig gå.","Pekala, gitmene izin vereceğim." -"Sorry, nothing personal.",TXT_RPLY1_SCRIPT04_D18192_SORRY,〃,,,"Promiň, nic osobního.","Undskyld, det er ikke personligt.","Tut mir leid, nimm es nicht persönlich",,"Pardonon, mi nur laboras.","Lo siento, no es nada personal.",,"Pahoittelut, ei mitään henkilökohtaista.","Désolé, rien de personnel.","Sajnálom, nem személyes.","Mi spiace, nulla di personale.",悪いが、仕事なんでね。,"미안해, 사적인 건 아니야.","Sorry, niets persoonlijks.","Unnskyld, ikke ta det personlig.","Wybacz, nic osobistego.",Desculpe. Não é nada pessoal.,,"Scuze, nimic personal.","Прости, ничего личного.",,"Ledsen, inget personligt.","Üzgünüm, kişisel bir şey değil." -"Nuts, if I'm going down, then so are you. Guards!!",TXT_DLG_SCRIPT04_D19708_NUTSI,〃,,,"K čertu, jestli mám zemřít, tak ty taky. Stráže!","Fandens, hvis jeg ryger ned, så ryger du også ned. Vagter!!","Scheiße, aber wenn ich dran bin, bist du es auch. Wärter!",,"Al mil diabloj. Se mi falos, ankaŭ vi. Gardistoj!!","A tomar por saco. Si yo caigo, tú también. ¡¡Guardias!!","Al carajo. Si yo caigo, tú también. ¡¡Guardias!!","Vittu, jos kuolen nyt, niin sinäkin. Vartijat!!","Putain, si je crève ici, alors tu y passe aussi! Gardes!","Őrület! Ha Én lebukok, akkor rántalak magammal. Őrök!","Al diavolo, se devo andare al fondo, ti porterò con me. Guardie!!","社会の厳しさを分けてやるよ、お前もそうなれ。 +"All right, I'll let you go.",TXT_RPLY0_SCRIPT04_D18192_ALLRI,〃,,,"Dobře, nechám tě jít.","Okay, jeg lader dig gå.","Ok, ich lass dich gehen.",,"Bone, vi rajtas foriri.","Muy bien, te dejaré ir.","Muy bien, te dejo ir.","Hyvä on, päästän sinut.","D'accord, tu peux y aller.",,"Rendben, elengedlek.","Va bene, ti lascerò andare.",分かった、見逃そう。,좋아. 그럼 널 살려주지.,"Oké, ik laat je gaan.","Greit, jeg skal la deg gå.","Dobra, zostawię cię w spokoju.","Ok, vou te deixar em paz.",,"În regulă, te las în pace.","Ладно, я дам тебе уйти.",,"Okej, jag låter dig gå.","Pekala, gitmene izin vereceğim." +"Sorry, nothing personal.",TXT_RPLY1_SCRIPT04_D18192_SORRY,〃,,,"Promiň, nic osobního.","Undskyld, det er ikke personligt.","Tut mir leid, nimm es nicht persönlich",,"Pardonon, mi nur laboras.","Lo siento, no es nada personal.",,"Pahoittelut, ei mitään henkilökohtaista.","Désolé, rien de personnel.",,"Sajnálom, nem személyes.","Mi spiace, nulla di personale.",悪いが、仕事なんでね。,"미안해, 사적인 건 아니야.","Sorry, niets persoonlijks.","Unnskyld, ikke ta det personlig.","Wybacz, nic osobistego.",Desculpe. Não é nada pessoal.,,"Scuze, nimic personal.","Прости, ничего личного.",,"Ledsen, inget personligt.","Üzgünüm, kişisel bir şey değil." +"Nuts, if I'm going down, then so are you. Guards!!",TXT_DLG_SCRIPT04_D19708_NUTSI,〃,,,"K čertu, jestli mám zemřít, tak ty taky. Stráže!","Fandens, hvis jeg ryger ned, så ryger du også ned. Vagter!!","Scheiße, aber wenn ich dran bin, bist du es auch. Wärter!",,"Al mil diabloj. Se mi falos, ankaŭ vi. Gardistoj!!","A tomar por saco. Si yo caigo, tú también. ¡¡Guardias!!","Al carajo. Si yo caigo, tú también. ¡¡Guardias!!","Vittu, jos kuolen nyt, niin sinäkin. Vartijat!!","Putain, si je crève ici, alors tu y passe aussi! Gardes!",,"Őrület! Ha Én lebukok, akkor rántalak magammal. Őrök!","Al diavolo, se devo andare al fondo, ti porterò con me. Guardie!!","社会の厳しさを分けてやるよ、お前もそうなれ。 ガード!","썅! 아니야, 네가 가질 수 있는 건 전혀 없어! 경비병!!","Noten, als ik naar beneden ga, dan ben jij dat ook. Bewakers!!","Faen, hvis jeg går ned, så gjør du det også. Vakter!","Szlag, jeśli mam zginąć, to ty też. Straże!!","Porra, se eu vou morrer então você também vai. Guardas!!",,"Nebunie - dacă o iau la vale, atunci o să te iau cu mine. Gardieni!!","К чёрту — раз уж я сдохну, то и ты со мной. Стража!",,"Nuts, om jag åker ner, så gör du det också. Vakter!","Fındık, eğer ben batıyorsam, sen de batacaksın. Gardiyanlar!!" -"Business my ass. Help, guards, I've got a live one.",TXT_DLG_SCRIPT04_D21224_BUSIN,〃,,,"Do hajzlu s nabídkami. Pomoc, stráže, mám tu živého!","Skide være med forretningen! Hjælp, vagter, jeg har en indtrængende.","Scheiß' aufs Geschäft. Wärter, ich habe hier einen Eindringling.",,"«Intertraktadoj», kia feka ŝerco. Helpu min, gardistoj, estas viva ribelanto!","«Negocios» mis cojones. ¡Ayuda, guardias, tengo uno vivo!","«Negocios» las pelotas. ¡Ayuda, guardias, tengo uno vivo!","Ja paskat mitään kauppoja. Vartijat, apua. Tämä elää vielä.","Une affaire, mon cul! Gardes, à l'aide, j'en ai un de vivant ici!","Francokat üzlet. Segítség, őrök, itt van egy.","Alla faccia degli affari. Aiuto, guardie, c'è un intruso.","クソ野郎が、タダでは死なねえ。 +"Business my ass. Help, guards, I've got a live one.",TXT_DLG_SCRIPT04_D21224_BUSIN,〃,,,"Do hajzlu s nabídkami. Pomoc, stráže, mám tu živého!","Skide være med forretningen! Hjælp, vagter, jeg har en indtrængende.","Scheiß' aufs Geschäft. Wärter, ich habe hier einen Eindringling.",,"«Intertraktadoj», kia feka ŝerco. Helpu min, gardistoj, estas viva ribelanto!","«Negocios» mis cojones. ¡Ayuda, guardias, tengo uno vivo!","«Negocios» las pelotas. ¡Ayuda, guardias, tengo uno vivo!","Ja paskat mitään kauppoja. Vartijat, apua. Tämä elää vielä.","Une affaire, mon cul! Gardes, à l'aide, j'en ai un de vivant ici!",,"Francokat üzlet. Segítség, őrök, itt van egy.","Alla faccia degli affari. Aiuto, guardie, c'è un intruso.","クソ野郎が、タダでは死なねえ。 助けてくれガード!イカれた奴がいる!","사적인 건 지랄하네. 경비병! 여기 노예가 도망친다! \cy실례지만, 이거 좀 골때리겠는데?","Zaken mijn kont. Help, bewakers, ik heb een levende.","Drit i forretningene. Hjelp, vakter, jeg har en inntrenger!","Do dupy z takim biznesem. Pomocy, straże, mamy tu kogoś żywego.","Negócios coisa nenhuma. Guardas, me ajudem, tenho um vivo aqui.",,"Afaceri pe naiba. Ajutor, gardieni, am prins unul.","Дело дрянь. Стража, на помощь! Тут живой повстанец.",,"Affärer i min röv. Hjälp, vakter, jag har en levande.","Kıçımın işi. Yardım edin gardiyanlar, canlı bir tane var." -"Ah, I got word from Macil that you'd be coming. I have a way to get you inside the power station, but it's on the risky side.",TXT_DLG_SCRIPT04_D22740_AHIGO,MAP04: Worner.,,,"Á, doneslo se mi od Macila, že přijdeš. Mám pro tebe cestu, jak se dostat do elektrárny, ale je trochu riskantní.","Jeg fik besked fra Macil om, at du ville komme. Jeg har en måde at få dig ind i kraftværket på, men det er lidt risikabelt.","Ah, Macil hat mir mitgeteilt, dass du kommst. Ich kenne einen Weg, um in das Werk reinzukommen, aber es ist etwas riskant.",,"Ha, Macil diris al mi, ke vi estis venonta. Mi havas manieron meti vin en la centralon, sed ĝi estas riska.","Ah, Macil me ha dicho que ibas a venir. Tengo una forma de meterte en la central eléctrica, pero es algo arriesgada.","Ah, Macil me dijo que ibas a venir. Tengo una forma de meterte a la central eléctrica, pero es algo arriesgada.","Aah, sainkin Macililta viestin, että olisit tulossa. Minulla on keino saada sinut sisään voimalaitokseen, mutta se ei ole varmimmasta päästä.","Ah, Macil m'a prévenu que vous viendriez. J'ai une entrée dans la centrale pour vous mais elle est un peu risquée.","Ah, kaptam infót Maciltól hogy érkezni fogsz. Igazából van egy mód bejutni az erőműbe, de elég rizikós.","Ah, ho sentito da Macil che saresti arrivato. Ho un modo per farti entrare nella centrale energetica, ma è rischioso.","ああ、マシルから話は聞いたよ。 +"Ah, I got word from Macil that you'd be coming. I have a way to get you inside the power station, but it's on the risky side.",TXT_DLG_SCRIPT04_D22740_AHIGO,MAP04: Worner.,,,"Á, doneslo se mi od Macila, že přijdeš. Mám pro tebe cestu, jak se dostat do elektrárny, ale je trochu riskantní.","Jeg fik besked fra Macil om, at du ville komme. Jeg har en måde at få dig ind i kraftværket på, men det er lidt risikabelt.","Ah, Macil hat mir mitgeteilt, dass du kommst. Ich kenne einen Weg, um in das Werk reinzukommen, aber es ist etwas riskant.",,"Ha, Macil diris al mi, ke vi estis venonta. Mi havas manieron meti vin en la centralon, sed ĝi estas riska.","Ah, Macil me ha dicho que ibas a venir. Tengo una forma de meterte en la central eléctrica, pero es algo arriesgada.","Ah, Macil me dijo que ibas a venir. Tengo una forma de meterte a la central eléctrica, pero es algo arriesgada.","Aah, sainkin Macililta viestin, että olisit tulossa. Minulla on keino saada sinut sisään voimalaitokseen, mutta se ei ole varmimmasta päästä.","Ah, Macil m'a prévenu que vous viendriez. J'ai une entrée dans la centrale pour vous mais elle est un peu risquée.",,"Ah, kaptam infót Maciltól hogy érkezni fogsz. Igazából van egy mód bejutni az erőműbe, de elég rizikós.","Ah, ho sentito da Macil che saresti arrivato. Ho un modo per farti entrare nella centrale energetica, ma è rischioso.","ああ、マシルから話は聞いたよ。 君を発電所に入れてやれるが かなりリスキーな方法だぞ。","아! 마실 사령관님으로부터 당신이 여기로 온다는 소식을 들었습니다. 발전소로 깊숙이 향하는 지름길을 알고 있어요. 다만, 좀 위험하답니다.","Ah, ik heb van Macil gehoord dat je zou komen. Ik heb een manier om je in de centrale te krijgen, maar het is aan de riskante kant.","Jeg fikk beskjed fra Macil om at du ville komme. Jeg har en måte å få deg inn i kraftverket på, men det er risikabelt.","Ah, słyszałem od Macila, że przyjdziesz. Mam sposób, aby cię przedostać do środka elektrowni, ale jest to ryzykowne.","Ah, Macil me contou que você viria. Tenho um jeito de fazer você entrar na usina elétrica, mas é bem arriscado.",,"Ah, am primit știrea de la Macil că urma să vii. Am o cale de a te infiltra în uzină, dar e riscantă.","А-а, мне сообщили, что ты от Мэйсила. Я знаю способ проникнуть на станцию, но он довольно рискованный.",,"Macil berättade att du skulle komma. Jag har ett sätt att få in dig i kraftverket, men det är lite riskabelt.",Macil'den geleceğin haberini aldım. Seni güç istasyonuna sokmanın bir yolunu buldum ama biraz riskli. -I'll take my chances.,TXT_RPLY0_SCRIPT04_D22740_ILLTA,〃,,,Já to zkusím.,Jeg tager mine chancer.,Ich riskiere es.,,Mi povas preni sur min la riskon.,Puedo asumir el riesgo.,,Kokeilen onneani.,Je suis prêt à prendre ces risques.,Vállalom a kockázatot.,Correrò il rischio.,大丈夫だ。,그 정도야 각오하고 있습니다.,Ik neem mijn kansen.,Jeg tar sjansen.,Zaryzykuję.,Estou disposto a arriscar.,,Voi risca.,Я рискну.,,Jag tar mina chanser.,Şansımı deneyeceğim. -"All right, I stole an I.D. from the corpse of some fool who fell into the reactor's coolant pit. --blat-- instant deep fry.",TXT_DLG_SCRIPT04_D24256_ALLRI,〃,,,"Tak dobře. Ukradl jsem identifikační kartu z mrtvoly nějakého chudáka, co spadl do reaktorové nádrže s chladivem. --Plesk--, okamžitě ho to upeklo.","Okay, jeg stjal et ID fra liget af et fjols, der faldt ned i reaktorens kølemiddelgrav. --blat-- øjeblikkelig friturestegning.","Alles klar. Ich habe hier die Identitätskarte von so 'nem Trottel, der in die Kühlanlage des Reaktors reingefallen ist. --platsch-- hat ihn schockgefrostet.",,"Bone. Mi ŝtelis la identigilon de la kadavro de stultulo, kiu falis en la malvarmigan truon de la reaktoro; «blat», tuje fritita.","Muy bien. He robado la identificación del cadáver de un inútil que cayó en el pozo refrigerante del reactor; «blat», frito al instante.","Muy bien. Me robé la identificación del cadáver de un inútil que se cayó al pozo refrigerante del reactor; «blat», frito al instante.","Hyvä on, varastin henkilötunnisteen joltain idiootilta, joka oli pudonnut reaktorin jäähdytyskuiluun. Pläts, pikauppopaisto.",Très vien. J'ai volé la carte d'identité d'un idiot qui est tombé dans le puits de refroidissement du réacteur. Plouf! Instantanément frit.,"Rendben van, elcsórtam egy szerencsétlen hullájáról az igazolványt aki beleesett a reaktor hűtőfolyadékába. --placcs-- rögtön ropogósra sült.","Molto bene allora, ho rubato una tessera d'identificazione da uno sciocco che è caduto nel pozzo refrigerante del reattore. --blat-- fritto instantaneamente.","わかった、このIDを受け取れ。 +I'll take my chances.,TXT_RPLY0_SCRIPT04_D22740_ILLTA,〃,,,Já to zkusím.,Jeg tager mine chancer.,Ich riskiere es.,,Mi povas preni sur min la riskon.,Puedo asumir el riesgo.,,Kokeilen onneani.,Je suis prêt à prendre ces risques.,,Vállalom a kockázatot.,Correrò il rischio.,大丈夫だ。,그 정도야 각오하고 있습니다.,Ik neem mijn kansen.,Jeg tar sjansen.,Zaryzykuję.,Estou disposto a arriscar.,,Voi risca.,Я рискну.,,Jag tar mina chanser.,Şansımı deneyeceğim. +"All right, I stole an I.D. from the corpse of some fool who fell into the reactor's coolant pit. --blat-- instant deep fry.",TXT_DLG_SCRIPT04_D24256_ALLRI,〃,,,"Tak dobře. Ukradl jsem identifikační kartu z mrtvoly nějakého chudáka, co spadl do reaktorové nádrže s chladivem. --Plesk--, okamžitě ho to upeklo.","Okay, jeg stjal et ID fra liget af et fjols, der faldt ned i reaktorens kølemiddelgrav. --blat-- øjeblikkelig friturestegning.","Alles klar. Ich habe hier die Identitätskarte von so 'nem Trottel, der in die Kühlanlage des Reaktors reingefallen ist. --platsch-- hat ihn schockgefrostet.",,"Bone. Mi ŝtelis la identigilon de la kadavro de stultulo, kiu falis en la malvarmigan truon de la reaktoro; «blat», tuje fritita.","Muy bien. He robado la identificación del cadáver de un inútil que cayó en el pozo refrigerante del reactor; «blat», frito al instante.","Muy bien. Me robé la identificación del cadáver de un inútil que se cayó al pozo refrigerante del reactor; «blat», frito al instante.","Hyvä on, varastin henkilötunnisteen joltain idiootilta, joka oli pudonnut reaktorin jäähdytyskuiluun. Pläts, pikauppopaisto.",Très vien. J'ai volé la carte d'identité d'un idiot qui est tombé dans le puits de refroidissement du réacteur. Plouf! Instantanément frit.,,"Rendben van, elcsórtam egy szerencsétlen hullájáról az igazolványt aki beleesett a reaktor hűtőfolyadékába. --placcs-- rögtön ropogósra sült.","Molto bene allora, ho rubato una tessera d'identificazione da uno sciocco che è caduto nel pozzo refrigerante del reattore. --blat-- fritto instantaneamente.","わかった、このIDを受け取れ。 これはリアクターの冷却炉に落ちた間抜けが 持っていたものだ。 バチッ!と一瞬で黒焦げになっちまったよ。",좋습니다. 이 신분증은 조심하지도 못하고 냉각 회로로 떨어진 한 불쌍한 녀석에게서 훔쳐온 겁니다. “뿌직”! 완전히 터졌죠.,"Oké, ik heb een I.D. gestolen van het lijk van een dwaas die in de koelvloeistofput van de reactor is gevallen. --Blat-- onmiddellijk frituren.",Jeg stjal et ID-kort fra liket til en idiot som falt ned i reaktorens kjølegrop. --...blat... øyeblikkelig frityrsteking.,"Dobra, ukradłem identyfikator ze zwłok pewnego durnia, który wpadł do chłodnicy reaktora. --puf-- i się usmażył.",Beleza. Eu roubei uma identificação do cadáver de algum otário que caiu no poço de refrigeração do reator. Pluft! Frito na hora. ,,Bine. Am furat un card de acces de pe cadavrul unui nătăfleț care a căzut în groapa sistemului de răcire al reactorului. --pleoșc--făcut scrum instant.,"Очень хорошо. Я украл удостоверение с трупа одного идиота, который упал прямо в охлаждающий бассейн реактора. «Шмяк!» — моментальное прожаривание до костей.",,Jag stal ett ID från en dåre som föll ner i reaktorns kylvattengrop. --blat-- omedelbar fritering.,"Pekala, reaktörün soğutucu çukuruna düşen bir aptalın cesedinden kimliğini çaldım. --Anında derin kızartma." -What should I do once I'm in?,TXT_RPLY0_SCRIPT04_D24256_WHATS,〃,,,Co mám udělat uvnitř?,"Hvad skal jeg gøre, når jeg er inde?","Was soll ich machen, wenn ich drin bin?",,Kion mi faru post mia eniro?,¿Qué debo hacer una vez dentro?,¿Qué hago una vez adentro?,Mitä teen päästyäni sisään?,Qu'est ce que je fais une fois que je suis rentré?,Mit tegyek amikor bejutottam?,E cosa devo fare una volta dentro?,中に入ったらどうすればいい?,그곳으로 들어간 후엔 뭘 해야 하죠?,Wat moet ik doen als ik eenmaal binnen ben?,Hva skal jeg gjøre når jeg er inne?,Co mam zrobić jak wejdę?,O que devo fazer depois de entrar?,,Ce trebuie să fac odată ce ajung în interior?,И что дальше?,,Vad ska jag göra när jag väl är inne?,İçeri girdiğimde ne yapmalıyım? -"Tell whoever asks that you're the replacement worker for Mr. Crispy. It's just dumb enough to work. Oh, and you might want to check out the storeroom that's right above us.",TXT_DLG_SCRIPT04_D25772_TELLW,〃,,,"Řekni komukoliv, kdo se zeptá, že jsi náhrada za pana Pečínku. Je to dost pitomé na to, aby to fungovalo. Jo, a možná bys mohl mít zájem podívat se do skladu, který je přímo nad námi.","Fortæl dem, der spørger, at du er afløseren for Mr Crispy. Det er lige dumt nok til at virke. Åh, og du vil måske tjekke lagerrummet lige over os.","Sage jedem, der dich fragt, dass du der Ersatz für Mister Crispy bist. Es ist idiotisch genug, um zu funktionieren. Oh, du solltest auch mal einen Blick in den Lagerraum auf der oberen Etage werfen.",,"Diru al tiu, kiu demandos, ke vi estas la anstataŭanto de la S-ro Krakulo; li estas sufiĉe stulta por kredi tion. Ha, kaj vi eble volas trarigardi la deponejon super ni.","A quien pregunte, dile que eres el sustituto del Sr. Crujiente; es lo bastante estúpido como para que funcione. Ah, y puede que quieras revisar el cuarto de almacenamiento que está justo sobre nosotros.",,"Jos joku kysyy, kerro olevasi herra Crispyn korvaaja. Saattaa olla jo niin tyhmä idea, että jopa toimii. Ai niin, ja saattanet haluta vilkaista varastohuonetta, joka sijaitsee suoraan yläpuolellamme.","Expliquez à qui veut l'entrendre que vous remplacez Mr. Frite. C'et suffisamment stupide pour marcher. Oh, et pensez à fouiller la salle de stockage au dessus de nous.","Akárki is kérdezi, mondd azt, hogy Kétszersült úr helyettesítése vagy. Akkora böszmeség, hogy még müködhet is. Ja, és érdemes lenne körbenézned a fölöttünk levő tárolóban.","Basta che tu dica a chiunque lo chieda che tu sei il rimpiazzo per il Signor Fritto. È abbastanza stupido da funzionare. Ah, e potrebbe anche interessarti il deposito che si trova proprio sopra di noi.","誰かに聞かれたら、クリスピーの代わりに来た +What should I do once I'm in?,TXT_RPLY0_SCRIPT04_D24256_WHATS,〃,,,Co mám udělat uvnitř?,"Hvad skal jeg gøre, når jeg er inde?","Was soll ich machen, wenn ich drin bin?",,Kion mi faru post mia eniro?,¿Qué debo hacer una vez dentro?,¿Qué hago una vez adentro?,Mitä teen päästyäni sisään?,Qu'est ce que je fais une fois que je suis rentré?,,Mit tegyek amikor bejutottam?,E cosa devo fare una volta dentro?,中に入ったらどうすればいい?,그곳으로 들어간 후엔 뭘 해야 하죠?,Wat moet ik doen als ik eenmaal binnen ben?,Hva skal jeg gjøre når jeg er inne?,Co mam zrobić jak wejdę?,O que devo fazer depois de entrar?,,Ce trebuie să fac odată ce ajung în interior?,И что дальше?,,Vad ska jag göra när jag väl är inne?,İçeri girdiğimde ne yapmalıyım? +"Tell whoever asks that you're the replacement worker for Mr. Crispy. It's just dumb enough to work. Oh, and you might want to check out the storeroom that's right above us.",TXT_DLG_SCRIPT04_D25772_TELLW,〃,,,"Řekni komukoliv, kdo se zeptá, že jsi náhrada za pana Pečínku. Je to dost pitomé na to, aby to fungovalo. Jo, a možná bys mohl mít zájem podívat se do skladu, který je přímo nad námi.","Fortæl dem, der spørger, at du er afløseren for Mr Crispy. Det er lige dumt nok til at virke. Åh, og du vil måske tjekke lagerrummet lige over os.","Sage jedem, der dich fragt, dass du der Ersatz für Mister Crispy bist. Es ist idiotisch genug, um zu funktionieren. Oh, du solltest auch mal einen Blick in den Lagerraum auf der oberen Etage werfen.",,"Diru al tiu, kiu demandos, ke vi estas la anstataŭanto de la S-ro Krakulo; li estas sufiĉe stulta por kredi tion. Ha, kaj vi eble volas trarigardi la deponejon super ni.","A quien pregunte, dile que eres el sustituto del Sr. Crujiente; es lo bastante estúpido como para que funcione. Ah, y puede que quieras revisar el cuarto de almacenamiento que está justo sobre nosotros.",,"Jos joku kysyy, kerro olevasi herra Crispyn korvaaja. Saattaa olla jo niin tyhmä idea, että jopa toimii. Ai niin, ja saattanet haluta vilkaista varastohuonetta, joka sijaitsee suoraan yläpuolellamme.","Expliquez à qui veut l'entrendre que vous remplacez Mr. Frite. C'et suffisamment stupide pour marcher. Oh, et pensez à fouiller la salle de stockage au dessus de nous.",,"Akárki is kérdezi, mondd azt, hogy Kétszersült úr helyettesítése vagy. Akkora böszmeség, hogy még müködhet is. Ja, és érdemes lenne körbenézned a fölöttünk levő tárolóban.","Basta che tu dica a chiunque lo chieda che tu sei il rimpiazzo per il Signor Fritto. È abbastanza stupido da funzionare. Ah, e potrebbe anche interessarti il deposito che si trova proprio sopra di noi.","誰かに聞かれたら、クリスピーの代わりに来た と言え。皆疑うことなく信じるだろうさ。 あと、上の階にある倉庫も行けるなら 見てみた方がいいぞ。","누군가가 물어보면 통구이 씨의 후임으로 들어왔다고 하시면 됩니다. 별로 어려운 일은 아닐 거에요. 아, 그리고 우리 바로 위에 있는 창고도 한번 확인해보세요. \cy으음. 왠지 무기 같은데. 화력이야 더 많으면 좋지.","Vertel degene die vraagt of jij de vervanger bent van Mr. Crispy. Het is net dom genoeg om te werken. Oh, en misschien wilt je eens kijken naar het magazijn dat vlak boven ons is.",Si til alle som spør at du er vikar for Mr. Crispy. Det er dumt nok til å fungere. Og du vil kanskje sjekke lageret som er rett over oss.,"Jak ktoś się będzie pytał, powiedz, że przyszedłeś na zastępstwo za Pana Chrupka. Jest to tak głupie, ale zadziała. Oh, i na pewno chciałbyś sprawdzić co jest w magazynie nad nami.","Diga pra quem perguntar que você é o substituto do Sr. Fritinho. É idiota o suficiente pra funcionar. Ah, e talvez você queira dar uma olhada no depósito lá em cima.",,"Spune-i oricui te întreabă că ești înlocuitorul dl. Crispy. E suficient de stupid cât să funcționeze. Ah, și probabil vrei să verifici depozitul care se află chiar deasupra noastră.","Говори всем, что тебя прислали заменить г-на Поджаренного. Это так глупо, что должно сработать. И ещё, наверное, тебе захочется наведаться на склад, прямо над нами.",,"Säg till den som frågar att du är ersättare för Mr Crispy. Det är tillräckligt dumt för att fungera. Åh, och du kanske vill kolla in förrådet som ligger precis ovanför oss.","Soran kişiye Bay Çıtır'ın yerine gelen işçi olduğunu söyle. İşe yarayacak kadar aptalca. Oh, ve hemen üstümüzdeki depoya bakmak isteyebilirsin." -Boy I hope this I.D. Works.,TXT_RPLY0_SCRIPT04_D25772_BOYIH,〃,,,Snad tahle karta funguje.,"Jeg håber, at det her ID virker.","Mann, ich hoffe, dass diese Karte auch funktioniert.",,Espereble ĉi tiu identigilo funkcios.,"Vaya, espero que esta identificación funcione.",,"Toivon todellakin, että tämä tunniste toimii.","Eh bien, j'espère que cette carte fonctionnera.",Merem remélni hogy ez az igazolvány működni fog.,Spero proprio che questo tesserino funzioni.,このIDで上手くいけばいいが。,이 방법이 통했으면 좋겠네요.,"Jongen, ik hoop dat deze I.D. werkt.",Jeg håper denne legitimasjonen virker.,"Mam nadzieję, że ten identyfikator zadziała.","Olha, espero que esta identificação funcione.",,Mamă frate sper ca legitimația să funcționeze.,"Ох. Надеюсь, это сработает.",,Jag hoppas att det här ID-kortet fungerar.,Umarım bu kimlik işe yarar. -"Get out of here, unless you want to end up Mr. Dead.",TXT_DLG_SCRIPT04_D27288_GETOU,〃,,,"Vypadni odsud, leda že by z tebe chtěl být pan Mrtvý.","Forsvind herfra, medmindre du vil ende som Mr. Død.","Und nun verschwinde, wenn du nicht als Mister Tot enden willst.",,"Foriru, krom se vi volas iĝi S-ro Mortinto.","Ya vete, a menos que quieras ser el Sr. Muerto.",,"Ala liikkua, ellet sitten mieluummin halua ryhtyä herra Kalmon korvaajaksi.","Sortez de là, sauf si vous voulez être Mr. Mort.","Na húzz innen, ha nem akarod úgy végezni mint Halott úr.","Ora ti conviene andare, a meno che tu non voglia diventare Signor Morto.","ここを離れた方がいい、君がミスターポックリに +Boy I hope this I.D. Works.,TXT_RPLY0_SCRIPT04_D25772_BOYIH,〃,,,Snad tahle karta funguje.,"Jeg håber, at det her ID virker.","Mann, ich hoffe, dass diese Karte auch funktioniert.",,Espereble ĉi tiu identigilo funkcios.,"Vaya, espero que esta identificación funcione.",,"Toivon todellakin, että tämä tunniste toimii.","Eh bien, j'espère que cette carte fonctionnera.",,Merem remélni hogy ez az igazolvány működni fog.,Spero proprio che questo tesserino funzioni.,このIDで上手くいけばいいが。,이 방법이 통했으면 좋겠네요.,"Jongen, ik hoop dat deze I.D. werkt.",Jeg håper denne legitimasjonen virker.,"Mam nadzieję, że ten identyfikator zadziała.","Olha, espero que esta identificação funcione.",,Mamă frate sper ca legitimația să funcționeze.,"Ох. Надеюсь, это сработает.",,Jag hoppas att det här ID-kortet fungerar.,Umarım bu kimlik işe yarar. +"Get out of here, unless you want to end up Mr. Dead.",TXT_DLG_SCRIPT04_D27288_GETOU,〃,,,"Vypadni odsud, leda že by z tebe chtěl být pan Mrtvý.","Forsvind herfra, medmindre du vil ende som Mr. Død.","Und nun verschwinde, wenn du nicht als Mister Tot enden willst.",,"Foriru, krom se vi volas iĝi S-ro Mortinto.","Ya vete, a menos que quieras ser el Sr. Muerto.",,"Ala liikkua, ellet sitten mieluummin halua ryhtyä herra Kalmon korvaajaksi.","Sortez de là, sauf si vous voulez être Mr. Mort.",,"Na húzz innen, ha nem akarod úgy végezni mint Halott úr.","Ora ti conviene andare, a meno che tu non voglia diventare Signor Morto.","ここを離れた方がいい、君がミスターポックリに 成らない為に。",어서 가세요. 여기 계속 있다간 고인이 될 겁니다.,"Maak dat je wegkomt, tenzij je wilt eindigen als meneer de Dood.","Kom deg ut herfra, med mindre du vil ende opp som Mr. Død.","Idź stąd, jeśli nie chcesz skończyć jako Pan Truposz.","Saia daqui, a não ser que você queria comer capim pela raiz.",,"Valea de aici, dacă nu vrei să devii dl. Mort.","Уходи сейчас же, если не хочешь стать «г-ном покойником».",,"Försvinn härifrån, om du inte vill bli herr Död.",Sonunun Bay Ölü olmasını istemiyorsan git buradan. -"Hey, leave me alone. If they catch us wasting time we get dead, or extra work.",TXT_DLG_SCRIPT04_D28804_HEYLE,MAP04: Warehouse → Dock Worker.,,,"Hej, nech mě bejt. Jestli nás chytěj ztrácet čas, dostanem kulku, nebo práci navíc.","Hey, lad mig være. Hvis de fanger os i at spilde tiden, bliver vi dræbt eller får ekstra arbejde.","Lass mich in Ruhe. Wenn sie uns beim Quatschen erwischen, sind wir entweder beide tot oder kriegen Extraarbeit aufgebrummt.",,"He, ne distru min. Se ili vidas, ke ni perdas tempon, ni estos mortigitaj... aŭ kun plia laboro.","Oye, déjame en paz. Si nos pillan perdiendo el tiempo nos matan... o nos dan más trabajo.","Oye, déjame en paz. Si nos ven perdiendo el tiempo nos matan... o nos dan más trabajo.","Hei, jätä minut rauhaan. Jos ne äkkäävät meidän tuhlaavan aikaa, saamme kuolla, tai lisää työtä.","Hé, foutez-moi la paix, si ils nous attrappent ici à nous tourner les pouces, on y passe où c'est le travail forcé.","Héj, hagyj engem békén. Ha meglátják, hogy itt lopjuk a napot, akkor vagy elintéznek vagy túlórát sóznak ránk.","Ehi, lasciami stare. Se ci beccano a perdere tempo ci ammazzano, o ci danno lavoro extra.","話しかけないでくれ、 +"Hey, leave me alone. If they catch us wasting time we get dead, or extra work.",TXT_DLG_SCRIPT04_D28804_HEYLE,MAP04: Warehouse → Dock Worker.,,,"Hej, nech mě bejt. Jestli nás chytěj ztrácet čas, dostanem kulku, nebo práci navíc.","Hey, lad mig være. Hvis de fanger os i at spilde tiden, bliver vi dræbt eller får ekstra arbejde.","Lass mich in Ruhe. Wenn sie uns beim Quatschen erwischen, sind wir entweder beide tot oder kriegen Extraarbeit aufgebrummt.",,"He, ne distru min. Se ili vidas, ke ni perdas tempon, ni estos mortigitaj... aŭ kun plia laboro.","Oye, déjame en paz. Si nos pillan perdiendo el tiempo nos matan... o nos dan más trabajo.","Oye, déjame en paz. Si nos ven perdiendo el tiempo nos matan... o nos dan más trabajo.","Hei, jätä minut rauhaan. Jos ne äkkäävät meidän tuhlaavan aikaa, saamme kuolla, tai lisää työtä.","Hé, foutez-moi la paix, si ils nous attrappent ici à nous tourner les pouces, on y passe où c'est le travail forcé.",,"Héj, hagyj engem békén. Ha meglátják, hogy itt lopjuk a napot, akkor vagy elintéznek vagy túlórát sóznak ránk.","Ehi, lasciami stare. Se ci beccano a perdere tempo ci ammazzano, o ci danno lavoro extra.","話しかけないでくれ、 奴等にバレたら処分されるか、残業させられる。","이봐, 나 좀 내버려 둬. 우리가 이렇게 농땡이 치는 걸 들키면 둘 다 죽는다고... 아님 추가 근무를 받는다든지!","Hé, laat me met rust. Als ze ons betrappen op tijdverspilling worden we dood, of extra werk.","Hei, la meg være i fred. Hvis de tar oss i å kaste bort tid, blir vi drept, eller får ekstraarbeid.","Hej, zostaw mnie. Jeśli nas przyłapią na marnowaniu czasu to nas zabiją lub dadzą więcej pracy.","Ei, me deixe em paz. Se eles pegarem a gente fazendo corpo mole, a gente vai morrer ou receber trabalho extra.",,"Hei, lasă-mă în pace. Dacă ne prind pierzând vremea fie primim muncă în plus, fie moarte.","Эй, оставь меня в покое. Если они увидят, что мы болтаем, нас убьют, или добавят работы.",,Lämna mig ifred. Om de kommer på oss med att slösa tid blir vi dödade eller får extra arbete.,"Hey, beni yalnız bırak. Bizi boşa zaman harcarken yakalarlarsa ya ölürüz ya da fazladan iş alırız." -"Such pressure, at this rate we'll be back to normal shifts soon. We're pumping tons of power to the castle and I'm almost finished logging those new weapons.",TXT_DLG_SCRIPT04_D30320_SUCHP,MAP04: Reactor Core → Northern alarm green door → Level 2 door,,,"Takový tlak, tímhle tempem brzy budeme zase pracovat normální směny. Lijeme takové množství energie do hradu a já už jsem skoro hotov se zapisováním těch nových zbraní.","Sikke et pres, i dette tempo er vi snart tilbage på normale vagter. Vi pumper tonsvis af strøm til slottet, og jeg er næsten færdig med at logge de nye våben.","So viel Druck. Wenn es so weiter geht, gibt es bald wieder normale Schichten. Wir pumpen Tonnen von Energie in die Burg und ich habe die neuen Waffen fast alle verstaut.",,"Kia premo. Laŭ ĉi tia kadenco, la normalaj deĵoroj baldaŭ revenos. Ni pumpas tunojn da energio al la kastelo kaj mi preskaŭ finis registri tiujn novajn armilojn.",Cuanta presión. A este ritmo volveremos pronto a turnos normales. Estamos dándole toneladas de energía al castillo y ya casi termino de registrar esas nuevas armas.,Cuanta presión. A este ritmo vamos a volver pronto a turnos normales. Estamos dándole toneladas de energía al castillo y ya casi termino de registrar esas nuevas armas.,"Kovat paineet. Tällä tahdilla palaamme tuota pikaa normaaleihin työvuoroihin. Pumppaamme rutkasti voimaa linnaan, ja olen melkein saanut kirjattua uudet aseet.","Quelle pression. Si ça continue, on devrait revenir au rhytme de travail de base. On pompe des tonnes d'énergies pour le château et j'ai presque fini d'enregistrer toutes ces nouvelles armes.","Micsoda nyomás, ezzel az irammal vissza fogunk tudni térni a régi műszakba. Iszonyat áramot pumpálunk a kastélyba, és majdnem végeztem az új fegyverek nyílvántartásával. is.","Che pressione, a questo punto ritorneremo presto ai normali turni di lavoro. Stiamo indirizzando molta energia verso il castello, e ho quasi finito di catalogare quelle nuove armi.","この圧力、この速さならすぐ通常のシフトに +"Such pressure, at this rate we'll be back to normal shifts soon. We're pumping tons of power to the castle and I'm almost finished logging those new weapons.",TXT_DLG_SCRIPT04_D30320_SUCHP,MAP04: Reactor Core → Northern alarm green door → Level 2 door,,,"Takový tlak, tímhle tempem brzy budeme zase pracovat normální směny. Lijeme takové množství energie do hradu a já už jsem skoro hotov se zapisováním těch nových zbraní.","Sikke et pres, i dette tempo er vi snart tilbage på normale vagter. Vi pumper tonsvis af strøm til slottet, og jeg er næsten færdig med at logge de nye våben.","So viel Druck. Wenn es so weiter geht, gibt es bald wieder normale Schichten. Wir pumpen Tonnen von Energie in die Burg und ich habe die neuen Waffen fast alle verstaut.",,"Kia premo. Laŭ ĉi tia kadenco, la normalaj deĵoroj baldaŭ revenos. Ni pumpas tunojn da energio al la kastelo kaj mi preskaŭ finis registri tiujn novajn armilojn.",Cuanta presión. A este ritmo volveremos pronto a turnos normales. Estamos dándole toneladas de energía al castillo y ya casi termino de registrar esas nuevas armas.,Cuanta presión. A este ritmo vamos a volver pronto a turnos normales. Estamos dándole toneladas de energía al castillo y ya casi termino de registrar esas nuevas armas.,"Kovat paineet. Tällä tahdilla palaamme tuota pikaa normaaleihin työvuoroihin. Pumppaamme rutkasti voimaa linnaan, ja olen melkein saanut kirjattua uudet aseet.","Quelle pression. Si ça continue, on devrait revenir au rhytme de travail de base. On pompe des tonnes d'énergies pour le château et j'ai presque fini d'enregistrer toutes ces nouvelles armes.",,"Micsoda nyomás, ezzel az irammal vissza fogunk tudni térni a régi műszakba. Iszonyat áramot pumpálunk a kastélyba, és majdnem végeztem az új fegyverek nyílvántartásával. is.","Che pressione, a questo punto ritorneremo presto ai normali turni di lavoro. Stiamo indirizzando molta energia verso il castello, e ho quasi finito di catalogare quelle nuove armi.","この圧力、この速さならすぐ通常のシフトに 戻るだろう。私達は城へ大量の電気を供給して いるし、新しい武器の切り出しも殆ど済んだ。","이런 압박감 속에 있다가는 다시 일반 교대 조로 복귀될 것 같아. 우린 지금 성 쪽으로 막대한 동력을 공급하고 있고, 난 저 신무기에 관한 일지를 거의 다 썼어.","Zulke druk, in dit tempo zullen we snel weer terug zijn bij normale diensten. We pompen tonnen energie naar het kasteel en ik ben bijna klaar met het kappen van die nieuwe wapens.","Med dette presset er vi snart tilbake til normale skift. Vi pumper masse strøm til slottet, og jeg er nesten ferdig med de nye våpnene.","Tyle nacisku, w ten sposób wkrótce będziemy mieli znów normalne zmiany. Pompujemy tony energii do zamku, a ja prawie skończyłem załadowywać te nowe bronie.",Quanta pressão. Desse jeito voltaremos a fazer turnos normais logo. Estamos mandando bastante energia para o castelo e estou quase terminando de registrar essas novas armas.,,"Ce presiuni, în ritmul ăsta o să revenim la turele obișnuite curând. Pompăm o tonă de energie către castel și aproape că am terminat să înregistrez aceste arme noi.","Такая нагрузка! С такими темпами мы вернёмся к нормальному графику совсем скоро. Мы направляем массу энергии в замок, и я почти закончил с погрузкой нового оружия.",,"Vilken press, i den här takten är vi snart tillbaka på normala skift. Vi pumpar tonvis med ström till slottet och jag är nästan klar med att logga de nya vapnen.","Ne baskı ama, bu gidişle yakında normal vardiyaya döneceğiz. Kaleye tonlarca güç pompalıyoruz ve yeni silahları kaydetmeyi neredeyse bitirdim." -Weapons?,TXT_RPLY0_SCRIPT04_D30320_WEAPO,〃,,,Zbraní?,Våben?,Waffen?,,Ĉu armiloj?,¿Armas?,,Aseet?,Des armes?,Fegyverek?,Armi?,武器?,신무기?,Wapens?,Våpen?,Bronie?,Armas?,,Arme?,Оружия?,,Vapen?,Silahlar mı? -"What do you think, we're backed up on socks?",TXT_DLG_SCRIPT04_D31836_WHATD,〃,,,"Co si myslíš, že ve zbrojnici máme ponožky?","Hvad tror du, vi er bagud med sokker?","Was dachtest du denn, glaubst du wir verteidigen uns mit Socken?",,Kion vi pensas? Ĉu ke ni agos per ŝtrumpetoj?,"¿Qué crees?, ¿que vamos con calcetines?","¿Qué crees?, ¿que vamos con medias o calcetines?","No mitä luulet meidän varastoineen, sukkia?",Vous croyez quoi? Qu'on a un surplus de chausettes?,"Mit gondolsz, zoknikkal vagyunk felfegyverkezve?","E che pensi, che ci difendiamo con dei calzini?",どう思う、ズボンがずり落ちないか?,"무슨 생각해? 양말 더 지급 받는 거? +Weapons?,TXT_RPLY0_SCRIPT04_D30320_WEAPO,〃,,,Zbraní?,Våben?,Waffen?,,Ĉu armiloj?,¿Armas?,,Aseet?,Des armes?,,Fegyverek?,Armi?,武器?,신무기?,Wapens?,Våpen?,Bronie?,Armas?,,Arme?,Оружия?,,Vapen?,Silahlar mı? +"What do you think, we're backed up on socks?",TXT_DLG_SCRIPT04_D31836_WHATD,〃,,,"Co si myslíš, že ve zbrojnici máme ponožky?","Hvad tror du, vi er bagud med sokker?","Was dachtest du denn, glaubst du wir verteidigen uns mit Socken?",,Kion vi pensas? Ĉu ke ni agos per ŝtrumpetoj?,"¿Qué crees?, ¿que vamos con calcetines?","¿Qué crees?, ¿que vamos con medias o calcetines?","No mitä luulet meidän varastoineen, sukkia?",Vous croyez quoi? Qu'on a un surplus de chausettes?,,"Mit gondolsz, zoknikkal vagyunk felfegyverkezve?","E che pensi, che ci difendiamo con dei calzini?",どう思う、ズボンがずり落ちないか?,"무슨 생각해? 양말 더 지급 받는 거? \cy쉬운 일은 아니겠지만, 일단 한번 해보자고.","Wat denk je, dat we op sokken staan?","Hva tror du, at vi har sokker?","Co ty myślisz, że wysyłamy skarpetki?","Ora, você acha que usamos só as nossas meias?",,"Ce crezi, că suntem apărați pe șosete?","А ты думал, мы носки грузим?",,"Vad tror du, vi har inte tillräckligt med strumpor?","Ne düşünüyorsun, çorapları yedekledik mi?" -What kind of weapons?,TXT_RPLY0_SCRIPT04_D31836_WHATK,〃,,,Jaké zbraně?,Hvilken slags våben?,Was für Waffen?,,Kiu speco de armiloj?,¿Qué clase de armas?,,Minkälaisia aseita?,Quel type d'armes?,Miféle fegyverek?,Che tipo di armi?,どんな武器だ?,어떤 신무기?,Wat voor wapens?,Hva slags våpen?,Jakie bronie?,Que tipo de armas?,,Ce fel de arme?,Какое оружие?,,Vilken typ av vapen?,Ne tür silahlar? -Are you deaf? I just told you how busy I am. Get back to work.,TXT_DLG_SCRIPT04_D33352_AREYO,〃,,,"Jsi hluchý? Už jsem ti řekl, jak jsem zaneprázdněný. Vrať se do práce.","Er du døv? Jeg har lige fortalt dig, hvor travlt jeg har. Kom tilbage til arbejdet.","Bist du taub? Ich hab dir dock gerade gesagt, wie beschäftigt ich bin. Geh zurück an die Arbeit.",,"Ĉu vi estas surda? Mi ĵus diris, kiel okupata mi estas. Reiru al via laboro.",¿Estás sordo? Ya te he dicho lo ocupado que estoy. Vuelve al trabajo.,¿Estás sordo? Ya te dije lo ocupado que estoy. Vuelve al trabajo.,"Kuuroko olet? Juurihan kerroin, kuinka kiire minulla on. Mene takaisin töihisi.","Vous êtes sourd? Je viens de vous dire que je suis occupé, retournez au travail!",Süket vagy? Most mondtam el mennyire elfoglalt vagyok. Húzz vissza dolgozni!,Ma sei sordo? Ti ho appena detto quanto sono occupato. Torna al lavoro.,難聴か? 私は、忙しい、から、仕事に、戻れ。,귀머거리야? 조금 전에 내가 얼마나 바쁜지 설명 했을 텐데? 일이나 해.,Ben je doof? Ik heb je net verteld hoe druk ik het heb. Ga terug aan het werk.,Er du døv? Jeg sa nettopp hvor opptatt jeg er. Tilbake til arbeidet.,"Głuchy jesteś? Mówiłem ci, że jestem zajęty. Wracaj do pracy.",Você é surdo? Já te disse que estou bem ocupado. Volte ao trabalho.,,Ești surd? Tocmai ți-am spus că sunt ocupat. Întoarce-te la muncă.,"Ты глухой, что ли? Я же сказал тебе, что я занят. Иди работать!",,Är du döv? Jag berättade precis hur upptagen jag är. Fortsätt jobba.,Sağır mısın sen? Sana ne kadar meşgul olduğumu söyledim. İşinin başına dön. -Who are you? Only clearance level two personnel are permitted in this area.,TXT_DLG_SCRIPT04_D34868_WHOAR,MAP04: Reactor Core → Southern alarm green door,,,Kdo jsi? Pouze pracovníci druhé úrovně sem mají povolen přístup.,Hvem er du? Kun personale på sikkerhedsniveau to har adgang til dette område.,Wer bist du? Nur Personal mit Zugangsstufe 2 hst hier Zutritt.,,Kiu vi estas? Nur dunivelaj laboristoj estas permesataj ĉi tie.,¿Quién eres? Solo el personal con permiso de nivel dos puede estar aquí.,,Kuka sinä olet? Vain kakkoskulkuluvan omaavalla henkilöstöllä on pääsy tälle alueelle.,Qui êtes vous? Seuls les personnes avec un niveau d'autorisation deux peuvent accéder à cette zone.,Te meg ki vagy? Csak kettes szintű engedéllyel rendekezők jöhetnek be ide.,Chi sei? Solo il personale con l'autorizzazione di livello due può stare in questa sezione.,"誰だ? レベル2のクリアランスを持たない者は +What kind of weapons?,TXT_RPLY0_SCRIPT04_D31836_WHATK,〃,,,Jaké zbraně?,Hvilken slags våben?,Was für Waffen?,,Kiu speco de armiloj?,¿Qué clase de armas?,,Minkälaisia aseita?,Quel type d'armes?,,Miféle fegyverek?,Che tipo di armi?,どんな武器だ?,어떤 신무기?,Wat voor wapens?,Hva slags våpen?,Jakie bronie?,Que tipo de armas?,,Ce fel de arme?,Какое оружие?,,Vilken typ av vapen?,Ne tür silahlar? +Are you deaf? I just told you how busy I am. Get back to work.,TXT_DLG_SCRIPT04_D33352_AREYO,〃,,,"Jsi hluchý? Už jsem ti řekl, jak jsem zaneprázdněný. Vrať se do práce.","Er du døv? Jeg har lige fortalt dig, hvor travlt jeg har. Kom tilbage til arbejdet.","Bist du taub? Ich hab dir dock gerade gesagt, wie beschäftigt ich bin. Geh zurück an die Arbeit.",,"Ĉu vi estas surda? Mi ĵus diris, kiel okupata mi estas. Reiru al via laboro.",¿Estás sordo? Ya te he dicho lo ocupado que estoy. Vuelve al trabajo.,¿Estás sordo? Ya te dije lo ocupado que estoy. Vuelve al trabajo.,"Kuuroko olet? Juurihan kerroin, kuinka kiire minulla on. Mene takaisin töihisi.","Vous êtes sourd? Je viens de vous dire que je suis occupé, retournez au travail!",,Süket vagy? Most mondtam el mennyire elfoglalt vagyok. Húzz vissza dolgozni!,Ma sei sordo? Ti ho appena detto quanto sono occupato. Torna al lavoro.,難聴か? 私は、忙しい、から、仕事に、戻れ。,귀머거리야? 조금 전에 내가 얼마나 바쁜지 설명 했을 텐데? 일이나 해.,Ben je doof? Ik heb je net verteld hoe druk ik het heb. Ga terug aan het werk.,Er du døv? Jeg sa nettopp hvor opptatt jeg er. Tilbake til arbeidet.,"Głuchy jesteś? Mówiłem ci, że jestem zajęty. Wracaj do pracy.",Você é surdo? Já te disse que estou bem ocupado. Volte ao trabalho.,,Ești surd? Tocmai ți-am spus că sunt ocupat. Întoarce-te la muncă.,"Ты глухой, что ли? Я же сказал тебе, что я занят. Иди работать!",,Är du döv? Jag berättade precis hur upptagen jag är. Fortsätt jobba.,Sağır mısın sen? Sana ne kadar meşgul olduğumu söyledim. İşinin başına dön. +Who are you? Only clearance level two personnel are permitted in this area.,TXT_DLG_SCRIPT04_D34868_WHOAR,MAP04: Reactor Core → Southern alarm green door,,,Kdo jsi? Pouze pracovníci druhé úrovně sem mají povolen přístup.,Hvem er du? Kun personale på sikkerhedsniveau to har adgang til dette område.,Wer bist du? Nur Personal mit Zugangsstufe 2 hst hier Zutritt.,,Kiu vi estas? Nur dunivelaj laboristoj estas permesataj ĉi tie.,¿Quién eres? Solo el personal con permiso de nivel dos puede estar aquí.,,Kuka sinä olet? Vain kakkoskulkuluvan omaavalla henkilöstöllä on pääsy tälle alueelle.,Qui êtes vous? Seuls les personnes avec un niveau d'autorisation deux peuvent accéder à cette zone.,,Te meg ki vagy? Csak kettes szintű engedéllyel rendekezők jöhetnek be ide.,Chi sei? Solo il personale con l'autorizzazione di livello due può stare in questa sezione.,"誰だ? レベル2のクリアランスを持たない者は ここに来てはいけないが。",넌 누구지? 이곳은 2급 인원만이 출입할 수 있다.,Wie ben jij? Alleen ontruimingsniveau twee personeel is toegestaan in dit gebied.,Hvem er du? Bare personell med klareringsnivå to har adgang til dette området.,Kim jesteś? Tylko personel posiadający zezwolenie poziomu drugiego może tu przebywać.,Quem é você? Só funcionários com permissão nível 2 podem entrar nesta área.,,Cine ești? Doar personalul cu nivel 2 de acces are voie în zona aceasta.,Ты кто такой? Только персоналу второго уровня допуска разрешено находиться в этой зоне.,,Vem är du? Endast personal på nivå två får vistas i det här området.,Kimsin sen? Bu bölgeye sadece ikinci seviye personel girebilir. -I'm the replacement worker.,TXT_RPLY0_SCRIPT04_D34868_IMTHE,〃,,,Jsem náhradník.,Jeg er afløseren.,Ich bin der Ersatzarbeiter.,,Mi estas la anstataŭanto.,Soy el sustituto.,,Olen täydennystyöntekijä.,Je suis le remplaçant.,Én vagyok a helyettes.,Sono il lavoratore sostitutivo.,代替要員だ。,후임 근무자로 왔습니다.,Ik ben de vervanger.,Jeg er vikaren.,Jestem tu na zastępstwo.,Eu sou o operário substituto.,,Sunt înlocuitorul muncitorului.,Я замещаю рабочего.,,Jag är ersättningsarbetaren.,Ben yedek işçiyim. -"About time you showed up. Go talk with Ketrick in the core. Oh, and take this key card. Don't want you getting shot on your first day, huh?",TXT_DLG_SCRIPT04_D36384_ABOUT,〃,,,"Už bylo na čase, aby ses objevil. Jdi si promluvit s Ketrickem v jádře. A vezmi si tuhle kartu. Přece by ses nechtěl nechat zastřelit hned svůj první den, ne?","Det var på tide, du dukkede op. Gå hen og snak med Ketrick i kernen. Åh, og tag dette nøglekort. Du skal ikke blive skudt på din første dag, hva'?","Wird auch Zeit, dass du hier erscheinst. Rede mit Ketrick im Reaktorkern, Und nimm diesen Schlüssel. Du willst ja wohl nicht gleich am ersten Tag erschossen werden, oder?",,"Vi finfine aperis. Iru paroli kun Ketrick en la kerno. Ha, kaj prenu ĉi tiun ŝlosil-karton; vi ne volas ricevi pafon dum via unua tago, ĉu?","Ya era hora. Ve a hablar con Ketrick en el núcleo. Ah, y toma esta tarjeta llave; no querrás que te peguen un tiro en tu primer día, ¿eh?",,"Jo oli aikakin ilmaantua. Mene ytimeen puhumaan Ketrickin kanssa. Ai niin, ja ota tämä avainkortti. Ei parane joutua ammutuksi heti ensimmäisenä työpäivänä, eikö niin?","Ah. Enfin. Il vous en a fallu, du temps! Allez parler avec Ketrick dans la section du cœur. Oh, et prenez ce passe. Vous ne voulez pas vous faire tirer dessus lors de votre premier jour, non?","Már ideje volt. Menj és beszélj Kettickkel a magban. Ja, és vidd magaddal ezt a mágneskártyát. Gondolom nem akarod magadat agyonlövetni az első napodon.","Finalmente sei arrivato. Vai a parlare a Ketrick nel nucleo. Ah, e prendi questa tessera chiave. Non è il caso di farsi sparare il primo giorno di lavoro, eh?","そろそろ来ると思っていたよ。コアにいる +I'm the replacement worker.,TXT_RPLY0_SCRIPT04_D34868_IMTHE,〃,,,Jsem náhradník.,Jeg er afløseren.,Ich bin der Ersatzarbeiter.,,Mi estas la anstataŭanto.,Soy el sustituto.,,Olen täydennystyöntekijä.,Je suis le remplaçant.,,Én vagyok a helyettes.,Sono il lavoratore sostitutivo.,代替要員だ。,후임 근무자로 왔습니다.,Ik ben de vervanger.,Jeg er vikaren.,Jestem tu na zastępstwo.,Eu sou o operário substituto.,,Sunt înlocuitorul muncitorului.,Я замещаю рабочего.,,Jag är ersättningsarbetaren.,Ben yedek işçiyim. +"About time you showed up. Go talk with Ketrick in the core. Oh, and take this key card. Don't want you getting shot on your first day, huh?",TXT_DLG_SCRIPT04_D36384_ABOUT,〃,,,"Už bylo na čase, aby ses objevil. Jdi si promluvit s Ketrickem v jádře. A vezmi si tuhle kartu. Přece by ses nechtěl nechat zastřelit hned svůj první den, ne?","Det var på tide, du dukkede op. Gå hen og snak med Ketrick i kernen. Åh, og tag dette nøglekort. Du skal ikke blive skudt på din første dag, hva'?","Wird auch Zeit, dass du hier erscheinst. Rede mit Ketrick im Reaktorkern, Und nimm diesen Schlüssel. Du willst ja wohl nicht gleich am ersten Tag erschossen werden, oder?",,"Vi finfine aperis. Iru paroli kun Ketrick en la kerno. Ha, kaj prenu ĉi tiun ŝlosil-karton; vi ne volas ricevi pafon dum via unua tago, ĉu?","Ya era hora. Ve a hablar con Ketrick en el núcleo. Ah, y toma esta tarjeta llave; no querrás que te peguen un tiro en tu primer día, ¿eh?",,"Jo oli aikakin ilmaantua. Mene ytimeen puhumaan Ketrickin kanssa. Ai niin, ja ota tämä avainkortti. Ei parane joutua ammutuksi heti ensimmäisenä työpäivänä, eikö niin?","Ah. Enfin. Il vous en a fallu, du temps! Allez parler avec Ketrick dans la section du cœur. Oh, et prenez ce passe. Vous ne voulez pas vous faire tirer dessus lors de votre premier jour, non?",,"Már ideje volt. Menj és beszélj Kettickkel a magban. Ja, és vidd magaddal ezt a mágneskártyát. Gondolom nem akarod magadat agyonlövetni az első napodon.","Finalmente sei arrivato. Vai a parlare a Ketrick nel nucleo. Ah, e prendi questa tessera chiave. Non è il caso di farsi sparare il primo giorno di lavoro, eh?","そろそろ来ると思っていたよ。コアにいる ケトリックに話しかけてくれ。 あとこのキーカードを受け取ってくれ。 初日で撃たれたくないならな。","마침 잘 와주었군. 중심부에 있는 케트릭에게 가서 얘기하라. 아, 그리고 여기 키카드를 받아라. 첫날부터 총에 맞고 싶지는 않겠지, 응?","Het werd tijd dat je kwam opdagen. Ga praten met Ketrick in de kern. Oh, en neem deze sleutelkaart. Wil je niet dat je op je eerste dag wordt neergeschoten, huh?",På tide du dukket opp. Gå og snakk med Ketrick i kjernen. Og ta dette nøkkelkortet. Du vil vel ikke bli skutt på din første dag?,"W końcu jesteś. Idź, porozmawiaj z Ketrickiem przy rdzeniu. Oh, weź tą kartę-klucz. Nie chcesz chyba być zastrzelony podczas pierwszego dnia w pracy, co?","Já era hora de você aparecer. Vá falar com o Ketrick lá no núcleo. Ah, e leve este cartão de acesso. Você não vai querer levar um tiro no primeiro dia, hein?",,"Era și timpul. Du-te și vorbește cu Ketrick în interiorul nucleului. Ah, și ia și cardul ăsta. Nu cred că vrei să fii împușcat în prima zi de lucru, eh?","Как раз вовремя. Иди поговори с Кетриком возле ядра реактора. О, и возьми эту карточку. Мы ведь не хотим, чтобы тебя подстрелили в первый же рабочий день?",,"Det var på tiden att du dök upp. Gå och prata med Ketrick i kärnan. Och ta det här nyckelkortet. Jag vill inte att du blir skjuten på din första dag, va?","Tam zamanında geldin. Git merkezdeki Ketrick ile konuş. Bu anahtar kartını da al. İlk gününde vurulmanı istemeyiz, değil mi?" -Where's the power crystal?,TXT_RPLY0_SCRIPT04_D36384_WHERE,〃,,,Kde je energetický krystal?,Hvor er kraftkrystallen?,Wo ist der Energiekristall?,,Kie estas la energia kristalo?,¿Dónde está el cristal de poder?,,Missä voimakristalli on?,Où se trouve le cristal du réacteur?,Hol van az erőkristály?,Dov'è il cristallo?,パワークリスタルは何処だ?,동력 수정체는 어디에 있죠?,Waar is het energiekristal?,Hvor er kraftkrystallen?,Gdzie jest kryształ mocy?,Onde fica o cristal de energia?,,Unde e cristalul de alimentare?,Где энергетический кристалл?,,Var är kraftkristallen?,Güç kristali nerede? -"If you don't get to work, you'll get shot anyway. Move your tunic.",TXT_DLG_SCRIPT04_D37900_IFYOU,〃,,,"Jestli se nepustíš do práce, zastřelí tě tak jako tak. Pohni tunikou!","Hvis du ikke går på arbejde, bliver du skudt alligevel. Flyt din kittel.","Wenn du nicht arbeitest, wirst du eh erschossen. Und nun beweg deinen Arsch!",,Vi ricevos pafon ankaŭ se vi ne eklaboras. Movu vian tunikon.,"Si no te pones a trabajar, te pegarán igual un tiro. Mueve el culo.","Si no te pones a trabajar, te van a pegar igual un tiro. Ya muévete.","Jos et ryhdy töihin, sinut ammutaan kumminkin. Liikuta sitä ruhoasi.","Si vous ne partez pas travailler, vous allez vous faire tirer dessus de toutes manières. Bougez-vous les miches.","Ha nem dolgozol így is, úgy is agyonlőnek. Haladj már!","Se non ti metti subito a lavorare, ti spareranno ugualmente. Muovi la tua tuta.","今すぐ作業しないと奴等にバレて撃たれるぞ。 +Where's the power crystal?,TXT_RPLY0_SCRIPT04_D36384_WHERE,〃,,,Kde je energetický krystal?,Hvor er kraftkrystallen?,Wo ist der Energiekristall?,,Kie estas la energia kristalo?,¿Dónde está el cristal de poder?,,Missä voimakristalli on?,Où se trouve le cristal du réacteur?,,Hol van az erőkristály?,Dov'è il cristallo?,パワークリスタルは何処だ?,동력 수정체는 어디에 있죠?,Waar is het energiekristal?,Hvor er kraftkrystallen?,Gdzie jest kryształ mocy?,Onde fica o cristal de energia?,,Unde e cristalul de alimentare?,Где энергетический кристалл?,,Var är kraftkristallen?,Güç kristali nerede? +"If you don't get to work, you'll get shot anyway. Move your tunic.",TXT_DLG_SCRIPT04_D37900_IFYOU,〃,,,"Jestli se nepustíš do práce, zastřelí tě tak jako tak. Pohni tunikou!","Hvis du ikke går på arbejde, bliver du skudt alligevel. Flyt din kittel.","Wenn du nicht arbeitest, wirst du eh erschossen. Und nun beweg deinen Arsch!",,Vi ricevos pafon ankaŭ se vi ne eklaboras. Movu vian tunikon.,"Si no te pones a currar, te pegarán igual un tiro. Mueve el culo.","Si no te pones a trabajar, te van a pegar igual un tiro. Ya muévete.","Jos et ryhdy töihin, sinut ammutaan kumminkin. Liikuta sitä ruhoasi.","Si vous ne partez pas travailler, vous allez vous faire tirer dessus de toutes manières. Bougez-vous les miches.",,"Ha nem dolgozol így is, úgy is agyonlőnek. Haladj már!","Se non ti metti subito a lavorare, ti spareranno ugualmente. Muovi la tua tuta.","今すぐ作業しないと奴等にバレて撃たれるぞ。 さあ行け。",근무하러 안 가면 어차피 총살이야. 어서 일하러 가!,"Als je niet aan het werk gaat, wordt je toch al neergeschoten. Verplaats je tuniek.","Hvis du ikke kommer deg på jobb, blir du skutt uansett. Flytt tunikaen din.","Jeśli się nie weźmiesz do roboty, to tak czy siak cię zastrzelą. Rusz się.","Se você não trabalhar, você vai levar um tiro de qualquer jeito. Mexa-se.",,"Dacă nu te apuci de muncă, o să fii împuscat oricum. Miscă-ți tunica.","Если ты не приступишь к работе, тебя всё равно пристрелят. Шевелись!",,Om du inte börjar jobba blir du skjuten ändå. Flytta din tunika.,İşe gitmezsen zaten vurulacaksın. Tuniğini çek. -"I don't mean to sound alarmist, but if they keep pushing the power crystal this hard it's gonna flaw, and then shatter, and then *boom*! ...Just a thought.",TXT_DLG_SCRIPT04_D39416_IDONT,MAP04: Reactor Core → Northern alarm green door,,,"Nechci plašit, ale jestli budou krystal dál takhle protěžovat, tak se nalomí a pak roztříští a pak BUM! ...Jen tak přemýšlím.","Jeg vil ikke lyde alarmerende, men hvis de bliver ved med at presse energikrystallen så hårdt, så vil den flække, og så splintre, og så *bum*! ...Bare en tanke.","Ich will ja nicht herumunken, aber wenn sie den Kristall weiter so überstrapazieren, nimmt er Schaden, und dann *bumm*! ...nur so ein Gedanke.",,"Mi ne intencas soni alarme, sed se ili plue superŝargas la energian kristalon tiel multe, ĝi misfunkcios, poste ĝi rompiĝos kaj tiam «Bum!»... Por ke vi havu ian ideon.","No quiero sonar alarmante, pero si siguen forzando tanto el cristal de poder, primero fallará, luego se partirá y luego «¡Pum!»... Para que te hagas una idea.","No quiero sonar alarmante, pero si siguen forzando tanto el cristal de poder, primero va a fallar, luego se va a partir y luego «¡Pum!»... Para que te hagas una idea.","En halua kuulostaa pelon lietsojalta, mutta jos ne vaan jatkavat voimakristallin ajamista näin lujille, se säröytyy, sitten pirstoutuu, ja sitten pam! Ihan vain heittona.","Je n'ai pas envie d'être alarmiste, mais si ils continuent de mettre autant de tension sur le cristal du réacteur, il risque d'être endommagé, éclater, et puis boum! Enfin, c'est juste ce que je pense.","Nem akarok vészmadár lenni, de ha ennyire hajtják az erőkristályt, akkor megreped és eltörik, aztán meg *bumm*!...csak egy gondolat.","Non voglio sembrare un allarmista, ma se continuano a sovraccaricare il cristallo così tanto, ci sarà un errore, e il cristallo si spaccherà, e poi *boom*! ...Solo un pensiero.","オーダーがもしパワークリスタルに負荷を +"I don't mean to sound alarmist, but if they keep pushing the power crystal this hard it's gonna flaw, and then shatter, and then *boom*! ...Just a thought.",TXT_DLG_SCRIPT04_D39416_IDONT,MAP04: Reactor Core → Northern alarm green door,,,"Nechci plašit, ale jestli budou krystal dál takhle protěžovat, tak se nalomí a pak roztříští a pak BUM! ...Jen tak přemýšlím.","Jeg vil ikke lyde alarmerende, men hvis de bliver ved med at presse energikrystallen så hårdt, så vil den flække, og så splintre, og så *bum*! ...Bare en tanke.","Ich will ja nicht herumunken, aber wenn sie den Kristall weiter so überstrapazieren, nimmt er Schaden, und dann *bumm*! ...nur so ein Gedanke.",,"Mi ne intencas soni alarme, sed se ili plue superŝargas la energian kristalon tiel multe, ĝi misfunkcios, poste ĝi rompiĝos kaj tiam «Bum!»... Por ke vi havu ian ideon.","No quiero sonar alarmante, pero si siguen forzando tanto el cristal de poder, primero fallará, luego se partirá y luego «¡Pum!»... Para que te hagas una idea.","No quiero sonar alarmante, pero si siguen forzando tanto el cristal de poder, primero va a fallar, luego se va a partir y luego «¡Pum!»... Para que te hagas una idea.","En halua kuulostaa pelon lietsojalta, mutta jos ne vaan jatkavat voimakristallin ajamista näin lujille, se säröytyy, sitten pirstoutuu, ja sitten pam! Ihan vain heittona.","Je n'ai pas envie d'être alarmiste, mais si ils continuent de mettre autant de tension sur le cristal du réacteur, il risque d'être endommagé, éclater, et puis boum! Enfin, c'est juste ce que je pense.",,"Nem akarok vészmadár lenni, de ha ennyire hajtják az erőkristályt, akkor megreped és eltörik, aztán meg *bumm*!...csak egy gondolat.","Non voglio sembrare un allarmista, ma se continuano a sovraccaricare il cristallo così tanto, ci sarà un errore, e il cristallo si spaccherà, e poi *boom*! ...Solo un pensiero.","オーダーがもしパワークリスタルに負荷を かけ続けていたら、いずれ限界でヒビが入って、 砕けて、*ボーン*!...だと思うよ。","불안감을 조장하긴 싫지만, 동력 수정체를 지금처럼 심하게 다루면, 갑자기 균열이 나고, 조각나면서, 그리고 '쾅!' ... 그냥 그렇다고.","Ik wil geen paniekzaaier zijn, maar als ze zo hard op het energiekristal blijven duwen, gaat het scheuren, en dan versplinteren, en dan *boom*! ...Gewoon een gedachte.","Jeg mener ikke å høres alarmistisk ut, men hvis de fortsetter å presse kraftkrystallen så hardt, vil den sprekke, og så *boom*! ...Bare en tanke.","Nie chcę brzmieć jak panikarz, ale jeśli dalej tak bardzo będą zużywać kryształ mocy, to się zepsuje, pęknie, a potem *bum*! ...Tak myślę.","Não quero parecer alarmista, mas se eles continuarem pressionando tanto esse cristal de energia ele vai falhar, depois vai quebrar e então bum! ...Só minha opinião.",,"Nu vreau să par alarmist, dar... dacă o să continui să împingi cristalul atât de tare o să se crape, apoi sparge, iar apoi *bum*! ...Doar ziceam.","Не хочу показаться паникёром, но если продолжать так же сильно нагружать кристалл, он треснет, потом расколется, а потом «бум!».. Просто подумалось.",,"Jag vill inte låta alarmistisk, men om de fortsätter att trycka på kraftkristallen så här hårt kommer den att flaga, och sedan splittras, och sedan *boom*! ...Bara en tanke.","Endişeli görünmek istemem ama güç kristalini bu kadar zorlamaya devam ederlerse kusurlu olacak, sonra paramparça olacak ve sonra *boom*! ...Sadece bir düşünce." -"Let me be quite clear. If this terminal locks up again, the coolant level will drop and we'll all have to answer to the Programmer. If we survive.",TXT_DLG_SCRIPT04_D40932_LETME,MAP04: Reactor Core → Southern alarm green door,,,"Vyjádřím se jasně: Jestli tenhle terminál znovu zamrzne, hladina chladiva poklesne a všichni se budeme muset zodpovídat Programátorovi. Pokud přežijeme.","Lad mig gøre det helt klart. Hvis denne terminal låser sig igen, vil kølevæskeniveauet falde, og vi vil alle skulle stå til ansvar over for programmøren. Hvis vi overlever.","Lass es mich klar und deutlich sagen. Wenn dieses Terminal nochmal abstürzt, sinkt der Kühlungsflüssigkeitspegel und wir dürfen uns vor dem Programmierer verantworten - wenn wir überleben.",,"Mi klarigu: se ĉi tiu terminalo paneas denove, la malvarmiga nivelo falos kaj ni ĉiuj devos respondeci pri tio al la Programisto... se ni supervivis.","Que quede claro: si esta terminal vuelve a colgarse, el nivel de refrigerante caerá y todos tendremos que dar la cara ante el Programador... si no morimos antes.","Que quede claro: si esta terminal vuelve a bloquearse, el nivel de refrigerante va a caer y todos vamos a tener que dar la cara ante el Programador... si no morimos antes.","Tehdäänpä asia selväksi. Jos tämä pääte vielä hyytyy, jäähdytysnestetaso laskee ja meillä on vähän selittelemistä Ohjelmoitsijalle. Sillä ehdolla, että selviämme.","Je vais être clair. Si ce terminal plante encore, les niveaux de liquide de refroidissement vont descendre et on aura tous à faire face au Programmeur. Si on survit, bien entendu.","Lényegretörő leszek. Ha a terminál még egyszer lezár, a hűtő folyadék szintje visszaesik, és felelülnek kell majd a Programozó színe előtt. Már ha túléljük.","Voglio essere chiaro su questo. Se questa console si blocca di nuovo, il livello di refrigerazione calerà bruscamente e dovremo risponderne di ciò al Programmtore. Se sopravviveremo.","万が一このターミナルがフリーズしたら、 +"Let me be quite clear. If this terminal locks up again, the coolant level will drop and we'll all have to answer to the Programmer. If we survive.",TXT_DLG_SCRIPT04_D40932_LETME,MAP04: Reactor Core → Southern alarm green door,,,"Vyjádřím se jasně: Jestli tenhle terminál znovu zamrzne, hladina chladiva poklesne a všichni se budeme muset zodpovídat Programátorovi. Pokud přežijeme.","Lad mig gøre det helt klart. Hvis denne terminal låser sig igen, vil kølevæskeniveauet falde, og vi vil alle skulle stå til ansvar over for programmøren. Hvis vi overlever.","Lass es mich klar und deutlich sagen. Wenn dieses Terminal nochmal abstürzt, sinkt der Kühlungsflüssigkeitspegel und wir dürfen uns vor dem Programmierer verantworten - wenn wir überleben.",,"Mi klarigu: se ĉi tiu terminalo paneas denove, la malvarmiga nivelo falos kaj ni ĉiuj devos respondeci pri tio al la Programisto... se ni supervivis.","Que quede claro: si esta terminal vuelve a colgarse, el nivel de refrigerante caerá y todos tendremos que dar la cara ante el Programador... si no morimos antes.","Que quede claro: si esta terminal vuelve a bloquearse, el nivel de refrigerante va a caer y todos vamos a tener que dar la cara ante el Programador... si no morimos antes.","Tehdäänpä asia selväksi. Jos tämä pääte vielä hyytyy, jäähdytysnestetaso laskee ja meillä on vähän selittelemistä Ohjelmoitsijalle. Sillä ehdolla, että selviämme.","Je vais être clair. Si ce terminal plante encore, les niveaux de liquide de refroidissement vont descendre et on aura tous à faire face au Programmeur. Si on survit, bien entendu.",,"Lényegretörő leszek. Ha a terminál még egyszer lezár, a hűtő folyadék szintje visszaesik, és felelülnek kell majd a Programozó színe előtt. Már ha túléljük.","Voglio essere chiaro su questo. Se questa console si blocca di nuovo, il livello di refrigerazione calerà bruscamente e dovremo risponderne di ciò al Programmtore. Se sopravviveremo.","万が一このターミナルがフリーズしたら、 冷却液の水位が下がってプログラマーと 対面しなければならないだろうな。 メルトダウンから生還すればの話だが。","이거 하나만 확실히 말하지. 이 시설이 또 고장 난다면, 냉각수 수치가 떨어질 거고 우리 둘 다 프로그래머에게 문책을 받을 거야. 만약 살아남는다면 말이지. \cy어쩌라고. 아무도 프로그래머들 이야기는 안 듣는데.","Laat ik heel duidelijk zijn. Als deze terminal weer vastloopt, zal het koelmiddelniveau dalen en zullen we ons allemaal moeten verantwoorden tegenover de programmeur. Als we het overleven.","La meg gjøre det helt klart. Hvis denne terminalen låser seg igjen, vil kjølevæskenivået synke, og vi må alle stå til ansvar for programmereren. Hvis vi overlever.","Wyrażę się jasno. Jeśli terminal znów się zablokuje, to poziom płynu w chłodnicy spadnie i będziemy musieli za to odpowiadać przed Programistą. Jeśli wogóle przeżyjemy.","Só pra ficar bem claro. Se este terminal travar de novo, o nível de refrigeração vai cair e vamos nos ver com o Programador. Se nós sobrevivermos.",,"Ca să fiu înțeles. Dacă terminalul ăsta se blochează iar, nivelul răcirii va scădea și vom fi trași la răspundere de Programator. Dacă supraviețuim.","Давай говорить начистоту. Если этот терминал опять заклинит, то уровень охлаждения упадёт, и нам всем придётся отвечать перед Программистом — если выживем.",,Låt mig vara helt tydlig. Om terminalen låser sig igen kommer kylvattennivån att sjunka och vi kommer alla att få stå till svars inför programmeraren. Om vi överlever.,"Açık konuşayım. Eğer bu terminal tekrar kilitlenirse, soğutma sıvısı seviyesi düşecek ve hepimiz Programcı'ya hesap vermek zorunda kalacağız. Eğer hayatta kalırsak." -"You! Yeah, you. You aren't cleared for this area. Let me have your key card, fast. I'm in such a bad mood!",TXT_DLG_SCRIPT04_D42448_YOUYE,MAP04: Ketrick.,,,"Ty! Jo, ty. Pro tuhle oblast nemáš povolení. Ukaž mi svou kartu, hned. Mám hodně špatnou náladu!","Dig! Ja, dig. Du er ikke godkendt til dette område. Giv mig dit nøglekort, hurtigt. Jeg er i så dårligt humør!","Du da! Ja, du. Du hast keine Berechtigung für diesen Bereich. Gib mir deine Schlüsselkarte, und zwar schnell! Ich bin ja sowas von sauer!",,"Vi! Jes, vi! Vi ne laboras en ĉi tiu sektoro. Montru vian ŝlosil-karton, rapide! Mi estas en tre malbona humoro!","¡Tú! Sí, tú. No tienes permiso en esta área. A ver tu tarjeta llave, ¡y rápido, que estoy de muy mal humor!",,"Sinä! Niin, sinä. Sinulla ei ole lupaa tälle alueelle. Anna minulle avainkorttisi, joutuin. Olen niin huonolla päällä!","Vous! Oui, vous, vous, vous n'avez pas l'autorisation d'être dans cette zone! Donnez moi votre passe maintenant, et vite, je suis de sale humeur aujourd'hui!","Te! Igen, Te. Nincs jogod itt lenni. Add csak ide az igazolványodat. Nem jó kedvemben találtál meg.","Tu! Si, tu. Non hai l'autorizzazione per quest'area. Dammi la tua chiave tessera, presto! Ho un diavolo per capello!","お前!そうだお前だ。ここは立入禁止だ。 +"You! Yeah, you. You aren't cleared for this area. Let me have your key card, fast. I'm in such a bad mood!",TXT_DLG_SCRIPT04_D42448_YOUYE,MAP04: Ketrick.,,,"Ty! Jo, ty. Pro tuhle oblast nemáš povolení. Ukaž mi svou kartu, hned. Mám hodně špatnou náladu!","Dig! Ja, dig. Du er ikke godkendt til dette område. Giv mig dit nøglekort, hurtigt. Jeg er i så dårligt humør!","Du da! Ja, du. Du hast keine Berechtigung für diesen Bereich. Gib mir deine Schlüsselkarte, und zwar schnell! Ich bin ja sowas von sauer!",,"Vi! Jes, vi! Vi ne laboras en ĉi tiu sektoro. Montru vian ŝlosil-karton, rapide! Mi estas en tre malbona humoro!","¡Tú! Sí, tú. No tienes permiso en esta área. A ver tu tarjeta llave, ¡y rápido, que estoy de muy mal humor!",,"Sinä! Niin, sinä. Sinulla ei ole lupaa tälle alueelle. Anna minulle avainkorttisi, joutuin. Olen niin huonolla päällä!","Vous! Oui, vous, vous, vous n'avez pas l'autorisation d'être dans cette zone! Donnez moi votre passe maintenant, et vite, je suis de sale humeur aujourd'hui!",,"Te! Igen, Te. Nincs jogod itt lenni. Add csak ide az igazolványodat. Nem jó kedvemben találtál meg.","Tu! Si, tu. Non hai l'autorizzazione per quest'area. Dammi la tua chiave tessera, presto! Ho un diavolo per capello!","お前!そうだお前だ。ここは立入禁止だ。 IDカードを見せろ、早く。今機嫌が悪いんだ!","너! 그래, 너 말이야. 넌 여기에 들어올 수 있는 권한이 없어. 당장 네 키카드를 내놔. 나 지금 기분 더럽다고!","Jij! Ja, jij. Je bent niet vrij voor dit gebied. Geef me je sleutelkaart, snel. Ik ben in zo'n slecht humeur!","Du! Ja, du. Du er ikke klarert for dette området. Gi meg nøkkelkortet ditt, fort. Jeg er i så dårlig humør!","Ty! Tak, ty. Nie masz pozwolenia, aby tu przebywać. Pokaż mi swoją kartę-klucz, szybko. Nie jestem dziś w dobrym nastroju!","Você aí! É, você mesmo. Você não tem permissão para estar aqui. Me passa esse cartão logo de uma vez. Estou de péssimo humor.",,"Tu! Da, tu! Nu ai acces în zona asta. Dă-mi cardul tău, rapid. Sunt extrem de indispus!","Ты! Да, ты. У тебя нет сюда допуска. Давай свою карточку, быстро. Я сегодня в плохом настроении!",,"Du! Ja, du. Du är inte godkänd för det här området. Ge mig ditt nyckelkort, snabbt. Jag är på så dåligt humör!","Sen! Evet, sen. Bu bölgeye giriş iznin yok. Anahtar kartını ver, çabuk. Çok kötü bir ruh halindeyim!" -"Here, here's my card.",TXT_RPLY0_SCRIPT04_D42448_HEREH,〃,,,"Tady, to je moje karta.","Her, her er mit kort.","Hier, hier ist meine Karte.",,Jen mia karto.,"Toma, aquí está mi tarjeta.",,Tässä on minun korttini.,Voilà mon passe.,"Parancsolj, itt a kártyám.",Ecco qua la mia tessera.,ほら、これがカードだ。,"자, 카드 여기 있어요.","Hier, hier is mijn kaart.","Her, her er kortet mitt.",Oto moja karta.,"Tome, aqui está o cartão.",,"Aici, aici e cardul.","Вот, вот моя карта.",,"Här, här är mitt kort.","İşte, işte kartım." -This is garbage! Wait here. Oh screw it. Guards kill this intruder!,TXT_DLG_SCRIPT04_D43964_THISI,〃,,,"Blbost! Počkej tady. Á, kašlu na to. Stráže, zabte tohohle vetřelce!","Det her er affald! Vent her. Åh, pis. Vagter dræber denne ubudne gæst!","Das ist ja wohl die Höhe! Warte hier. Ach was. Wärter, tötet hn!",,"Ĉi tio estas rubaĵo! Atendu ĉi tie... Ba, al mil diabloj. Gardistoj, mortigu ĉi tiun entrudiĝanton!","¡Esto es basura! Espera aquí... Bah, ¿que más da? ¡Guardias, maten a este intruso!","¡Esto es basura! Espera aquí... Bah, al carajo. ¡Guardias, maten a este intruso!","Mitä pötyä tämä on? Odota tässä. Äh, ja paskat. Vartijat, tappakaa tämä tunkeilija!","C'est quoi cette blague? Attendez ici. Non, en fait, Gardes! Descendez cet intrus!","Ez egy szemét! Várj meg itt. Najó, nem kínlódok vele. Őrök nyírjátok ki a behatolót!","Questa è spazzatura! Aspetta qui. Ah, dannazione. Guardie, uccidete questo intruso!","なんだこのゴミは! いや待て。ああ、畜生。 +"Here, here's my card.",TXT_RPLY0_SCRIPT04_D42448_HEREH,〃,,,"Tady, to je moje karta.","Her, her er mit kort.","Hier, hier ist meine Karte.",,Jen mia karto.,"Toma, aquí está mi tarjeta.",,Tässä on minun korttini.,Voilà mon passe.,,"Parancsolj, itt a kártyám.",Ecco qua la mia tessera.,ほら、これがカードだ。,"자, 카드 여기 있어요.","Hier, hier is mijn kaart.","Her, her er kortet mitt.",Oto moja karta.,"Tome, aqui está o cartão.",,"Aici, aici e cardul.","Вот, вот моя карта.",,"Här, här är mitt kort.","İşte, işte kartım." +This is garbage! Wait here. Oh screw it. Guards kill this intruder!,TXT_DLG_SCRIPT04_D43964_THISI,〃,,,"Blbost! Počkej tady. Á, kašlu na to. Stráže, zabte tohohle vetřelce!","Det her er affald! Vent her. Åh, pis. Vagter dræber denne ubudne gæst!","Das ist ja wohl die Höhe! Warte hier. Ach was. Wärter, tötet hn!",,"Ĉi tio estas rubaĵo! Atendu ĉi tie... Ba, al mil diabloj. Gardistoj, mortigu ĉi tiun entrudiĝanton!","¡Esto es basura! Espera aquí... Bah, ¿que más da? ¡Guardias, maten a este intruso!","¡Esto es basura! Espera aquí... Bah, al carajo. ¡Guardias, maten a este intruso!","Mitä pötyä tämä on? Odota tässä. Äh, ja paskat. Vartijat, tappakaa tämä tunkeilija!","C'est quoi cette blague? Attendez ici. Non, en fait, Gardes! Descendez cet intrus!",,"Ez egy szemét! Várj meg itt. Najó, nem kínlódok vele. Őrök nyírjátok ki a behatolót!","Questa è spazzatura! Aspetta qui. Ah, dannazione. Guardie, uccidete questo intruso!","なんだこのゴミは! いや待て。ああ、畜生。 ガード、侵入者を殺せ!","이게 뭐야?! 잠깐... 이런 젠장. 경비, 여기 침입자를 쏴버려!","Dit is vuilnis! Wacht hier. Oh, laat maar. Bewakers doden deze indringer!","Dette er søppel! Vent her. Drit i det. Vakter, drep inntrengeren!","To nie karta, to śmieć! Czekaj. Pieprzyć to. Straże zabijcie tego intruza!","Que merda é essa? Fique aqui. Ah, que se dane. Guardas, matem este intruso!",,"Ăsta e gunoi! Așteaptă aici. Oh las-o baltă. Gardieni, ucideți intrusul!","Этой карточкой можно только подтереться! Жди здесь. А, к чёрту. Стража, здесь нарушитель! Убейте его!",,"Det här är skräp! Vänta här. Åh, skit i det. Vakterna dödar den här inkräktaren!",Bu çöp! Burada bekle. Siktir et. Gardiyanlar bu davetsiz misafiri öldürün! -"Work, sleep, get tortured, what a life. Say, you the replacement for the careless pit diver?",TXT_DLG_SCRIPT04_D45480_WORKS,MAP04: Reactor Core → Sammis,,,"Práce, spánek, poležení si na skřipci, dobrej život. Hele, ty jsi ta náhrada za toho neopatrného skokana?","Arbejde, sove, blive tortureret. Sikke et liv. Er du afløseren for den skødesløse pit dykker?","Arbeiten, schlafen, gefoltert werden, was für ein Leben. Sag mal, bist du der Ersatz für diesen sorglosen Grubentaucher?",,"Labori, dormi, esti torturata; kia vivo. Do ĉu vi venis anstataŭi la senatentan tru-plonĝinton?","Trabajar, dormir, ser torturado; qué vida. A ver, ¿eres el sustituto del distraído que hizo un clavado al pozo?",,"Raada, nuku, joudu kidutetuksi, mikä elämä. Sanopa, sinäkö olet sen huolimattoman kuilusukeltajan korvaaja?","Travail, sommeil, torture, quelle vie! Dites, vous êtes le remplaçant de l'unfortuné plongeur?","Munka, alvás, kínzás, milyen jó kis élet is ez. Figyelj csak, Te nem a figyelmetlen akna búvár helyettese vagy?","Lavoro, dormire e venire torturati, che vita. Dì un po', sei tu il sostituto per l'incauto palombaro del pozzo?","働いて、寝て、処罰されて、なんて人生だ。 +"Work, sleep, get tortured, what a life. Say, you the replacement for the careless pit diver?",TXT_DLG_SCRIPT04_D45480_WORKS,MAP04: Reactor Core → Sammis,,,"Práce, spánek, poležení si na skřipci, dobrej život. Hele, ty jsi ta náhrada za toho neopatrného skokana?","Arbejde, sove, blive tortureret. Sikke et liv. Er du afløseren for den skødesløse pit dykker?","Arbeiten, schlafen, gefoltert werden, was für ein Leben. Sag mal, bist du der Ersatz für diesen sorglosen Grubentaucher?",,"Labori, dormi, esti torturata; kia vivo. Do ĉu vi venis anstataŭi la senatentan tru-plonĝinton?","Currar, dormir, ser torturado; qué vida. A ver, ¿eres el sustituto del distraído clavadista de pozos?","Trabajar, dormir, ser torturado; qué vida. A ver, ¿eres el sustituto del distraído clavadista de pozos?","Raada, nuku, joudu kidutetuksi, mikä elämä. Sanopa, sinäkö olet sen huolimattoman kuilusukeltajan korvaaja?","Travail, sommeil, torture, quelle vie! Dites, vous êtes le remplaçant de l'unfortuné plongeur?",,"Munka, alvás, kínzás, milyen jó kis élet is ez. Figyelj csak, Te nem a figyelmetlen akna búvár helyettese vagy?","Lavoro, dormire e venire torturati, che vita. Dì un po', sei tu il sostituto per l'incauto palombaro del pozzo?","働いて、寝て、処罰されて、なんて人生だ。 で、お前はあの冷却炉に落ちたアイツの 代替要員か?","일하고, 자고, 고문받고, 인생 참 멋지네. 자, 네가 그 부주의하게 추락사한 친구의 후임 맞지?","Werk, slaap, word gemarteld, wat een leven. Zeg, ben jij de vervanger van de onzorgvuldige pitduiker?","Jobbe, sove, bli torturert, for et liv! Er du avløseren for den uforsiktige dykkeren?","Spanie, praca, tortury, co za życie. Więc, jesteś tu na zastępstwo za tego co skoczył w przepaść?","Trabalhar, dormir, ser torturado. Que vida. Me diz uma coisa, você é o substituto daquele mergulhador de poço distraído?",,"Muncă, odihnă, tortură, ce mai viață. Și, zici că ești înlocuitorul înotătorului neatent?","Работа, сон и пытки, что за жизнь. Так ты заменяешь нашего беспечного ныряльщика?",,"Jobba, sova, bli torterad, vilket liv. Säg, är du ersättaren för den slarviga gropdykaren?","Çalış, uyu, işkence gör, ne hayat ama. Söylesene, dikkatsiz çukur dalgıcının yerine sen mi geldin?" -"Yeah, can't wait to start.",TXT_RPLY0_SCRIPT04_D45480_YEAHC,〃,,,"Jo, už se nemůžu dočkat.","Ja, jeg kan ikke vente med at begynde.","Ja, ich kanns kaum erwarten, hier anzufangen.",,"Yes, kaj mi vere volas komenci.","Sí, y tengo ganas de empezar.",,"Kyllä, en malta odottaa.","Oui, j'ai hâte de commencer.","Igen, már alig várom, hogy kezdhessek.","Sì, non vedo l'ora di iniziare.",そうだ、もう待てない。,"네, 일이 정말 기대됩니다.","Ja, ik kan niet wachten om te beginnen.","Ja, jeg gleder meg til å begynne.","Tak, nie mogę się już doczekać.","É, mal posso esperar pra começar.",,"Deah, abia aștept să încep.","Да, поскорей бы уже за дело.",,"Ja, jag längtar efter att få börja.","Evet, başlamak için sabırsızlanıyorum." -"Yeah, right. OK, get your ass to work.",TXT_DLG_SCRIPT04_D46996_YEAHR,〃,,,"Jo, jasně. Dobře, začni makat.","Ja, det er rigtigt. OK, få din røv på arbejde.","Na gut, schwing deinen Arsch zur Arbeit.",,"Jes, kompreneble. Nu, eklaboru.","Sí, claro. Bueno, ponte a trabajar.",,"Just joo. Selvä, raahaa ahterisi töiden ääreen.","Ouais, bien sûr. OK, allez bosser.","Ja persze már. Na, húzzál dolgozni inkább.","Già, certo. OK, muovi il culo e vai a lavorare.",わかった。さっさと働け。,"그래, 좋아. 일이나 하라고.","Ja, juist. Oké, ga aan het werk.","Ja, sikkert. OK, få ræva di på jobb.","Dobra. Ok, rusz swoją dupę do roboty.","Sim, sei. Tá, comece a trabalhar de uma vez.",,"Deah, sigur. Bine, hai, la muncă.","Да, конечно. Ладно, шуруй работать.",,"Ja, visst. Okej, sätt dig i arbete.","Evet, doğru. Tamam, kıçını kaldır da işe koyul." -Where's the crystal?,TXT_RPLY0_SCRIPT04_D46996_WHERE,〃,,,Kde je krystal?,Hvor er krystallen?,Wo ist der Kristall?,,Kie estas la kristalo?,¿Dónde está el cristal?,,Missä kristalli on?,Où est le cristal?,Hol van a kristály?,Dov'è il cristallo?,クリスタルは何処だ?,수정체는 어디에 있죠?,Waar is het kristal?,Hvor er krystallen?,Gdzie kryształ?,Onde fica o cristal?,,Unde e cristalul?,Где кристалл?,,Var är kristallen?,Kristal nerede? -"Go talk to Ketrick. Bring the walkway up using the switches, then use this I.D. For the elevator.",TXT_DLG_SCRIPT04_D48512_GOTAL,〃,,,Promluv si s Ketrickem. Tlačítkem zvedni schodiště a ve výtahu pak použij tuhle kartu.,"Gå hen og snak med Ketrick. Få gangbroen op ved hjælp af kontakterne, og brug så dette ID til elevatoren.","Rede mit Ketrick. Hebe den Steg mit den Schaltern an, dann benutze dies ID für den Lift.",,Parolu al Ketrick. Levu la ponton per ĉi tiuj ŝaltiloj kaj tiam ekagigu la lifton per ĉi tiu identigilo.,Habla con Ketrick. Usa estos interruptores para alzar la pasarela y luego esta identificación con el ascensor.,,Mene puhumaan Ketrickin kanssa. Tuo kulkusilta vivuilla ylös ja sitten käytä hissiin tätä tunnistetta.,"Parlez à Ketrick. Vous pouvez étendre la coursive avec les boutons, puis utilisez ce passe pour l'ascenseur.","Menj és beszélj Ketrickkel. A kapcoslókkal emeld meg a szerelőhidat, majd használd ezt az igazolványt a lifthez.","Devi parlare con Ketrick. Usa i pulsanti per alzare la passarella, dopodiché usa questa tessera d'identificazione per l'ascensore. ","ケトリックと話をしろ。 +"Yeah, can't wait to start.",TXT_RPLY0_SCRIPT04_D45480_YEAHC,〃,,,"Jo, už se nemůžu dočkat.","Ja, jeg kan ikke vente med at begynde.","Ja, ich kanns kaum erwarten, hier anzufangen.",,"Jes, kaj mi vere volas komenci.","Sí, y tengo ganas de empezar.",,"Kyllä, en malta odottaa.","Oui, j'ai hâte de commencer.",,"Igen, már alig várom, hogy kezdhessek.","Sì, non vedo l'ora di iniziare.",そうだ、もう待てない。,"네, 일이 정말 기대됩니다.","Ja, ik kan niet wachten om te beginnen.","Ja, jeg gleder meg til å begynne.","Tak, nie mogę się już doczekać.","É, mal posso esperar pra começar.",,"Deah, abia aștept să încep.","Да, поскорей бы уже за дело.",,"Ja, jag längtar efter att få börja.","Evet, başlamak için sabırsızlanıyorum." +"Yeah, right. OK, get your ass to work.",TXT_DLG_SCRIPT04_D46996_YEAHR,〃,,,"Jo, jasně. Dobře, začni makat.","Ja, det er rigtigt. OK, få din røv på arbejde.","Na gut, schwing deinen Arsch zur Arbeit.",,"Jes, kompreneble. Nu, eklaboru.","Sí, claro. Bueno, ponte a currar.","Sí, claro. Bueno, ponte a trabajar.","Just joo. Selvä, raahaa ahterisi töiden ääreen.","Ouais, bien sûr. OK, allez bosser.",,"Ja persze már. Na, húzzál dolgozni inkább.","Già, certo. OK, muovi il culo e vai a lavorare.",わかった。さっさと働け。,"그래, 좋아. 일이나 하라고.","Ja, juist. Oké, ga aan het werk.","Ja, sikkert. OK, få ræva di på jobb.","Dobra. Ok, rusz swoją dupę do roboty.","Sim, sei. Tá, comece a trabalhar de uma vez.",,"Deah, sigur. Bine, hai, la muncă.","Да, конечно. Ладно, шуруй работать.",,"Ja, visst. Okej, sätt dig i arbete.","Evet, doğru. Tamam, kıçını kaldır da işe koyul." +Where's the crystal?,TXT_RPLY0_SCRIPT04_D46996_WHERE,〃,,,Kde je krystal?,Hvor er krystallen?,Wo ist der Kristall?,,Kie estas la kristalo?,¿Dónde está el cristal?,,Missä kristalli on?,Où est le cristal?,,Hol van a kristály?,Dov'è il cristallo?,クリスタルは何処だ?,수정체는 어디에 있죠?,Waar is het kristal?,Hvor er krystallen?,Gdzie kryształ?,Onde fica o cristal?,,Unde e cristalul?,Где кристалл?,,Var är kristallen?,Kristal nerede? +"Go talk to Ketrick. Bring the walkway up using the switches, then use this I.D. For the elevator.",TXT_DLG_SCRIPT04_D48512_GOTAL,〃,,,Promluv si s Ketrickem. Tlačítkem zvedni schodiště a ve výtahu pak použij tuhle kartu.,"Gå hen og snak med Ketrick. Få gangbroen op ved hjælp af kontakterne, og brug så dette ID til elevatoren.","Rede mit Ketrick. Hebe den Steg mit den Schaltern an, dann benutze dies ID für den Lift.",,Parolu al Ketrick. Levu la ponton per ĉi tiuj ŝaltiloj kaj tiam ekagigu la lifton per ĉi tiu identigilo.,Habla con Ketrick. Usa estos interruptores para alzar la pasarela y luego esta identificación con el ascensor.,,Mene puhumaan Ketrickin kanssa. Tuo kulkusilta vivuilla ylös ja sitten käytä hissiin tätä tunnistetta.,"Parlez à Ketrick. Vous pouvez étendre la coursive avec les boutons, puis utilisez ce passe pour l'ascenseur.",,"Menj és beszélj Ketrickkel. A kapcoslókkal emeld meg a szerelőhidat, majd használd ezt az igazolványt a lifthez.","Devi parlare con Ketrick. Usa i pulsanti per alzare la passarella, dopodiché usa questa tessera d'identificazione per l'ascensore. ","ケトリックと話をしろ。 隣のスイッチで道を上げこのカードで エレベーターに乗るんだ。","케트릭에게 물어봐. 스위치를 눌러서 진입로를 올리고, 이 신분증을 써서 승강기를 타고 올라가.",Ga met Ketrick praten. Breng de loopbrug naar boven met behulp van de schakelaars en gebruik dan deze I.D. voor de lift.,"Snakk med Ketrick. Få gangbroen opp med bryterne, og bruk dette kortet til heisen.","Idź porozmawiać z Ketrickiem. Podnieś chodnik za pomocą przełączników, potem użyj tego identyfikatora do windy.",Fale com o Ketrick. Use os interruptores para fazer a passarela subir e depois use esta identificação para o elevador.,,"Discută cu Ketrick. Ridică pasarela cu ajutorul butoanelor, apoi folosește legitimația asta pentru lift.","Сходи поговори с Кетриком. Используй переключатели на стене, чтобы подняться наверх, потом запусти лифт этой карточкой.",,"Gå och prata med Ketrick. Ta upp gångvägen med hjälp av växlarna, använd sedan det här ID-kortet för hissen.","Git Ketrick'le konuş. Anahtarları kullanarak geçidi yukarı getir, sonra asansör için bu kimliği kullan." -Where's the crystal again?,TXT_RPLY0_SCRIPT04_D48512_WHERE,〃,,,"Můžeš mi znovu říct, kde je krystal?",Hvor er krystallen igen?,"Wo ist der Kristall, nochmal?",,"Mi demandis, kie estas la kristalo.","De nuevo, ¿dónde está el cristal?",,Missä kristalli olikaan?,Mais où est le cristal?,Hol is van a kristály?,E il cristallo dov'è?,いいからクリスタルは何処だ?,수정체가 어디에 있다고요?,Waar is het kristal ook alweer?,Hvor er krystallen igjen?,"Jeszcze raz, gdzie kryształ?",Onde fica o cristal mesmo?,,Unde ziceai că e cristalul?,Ещё раз: где кристалл?,,Var är kristallen igen?,Kristal yine nerede? -"None of your business, go talk to Ketrick.",TXT_DLG_SCRIPT04_D50028_NONEO,〃,,,"Do toho ti nic není, jdi si promluvit s Ketrickem.","Det rager ikke dig, gå hen og snak med Ketrick.","Geht dich nichts an, und jetzt rede mit Ketrick.",,Tio ne estas via afero. Iru paroli al Ketrick.,No es asunto tuyo. Ve a hablar con Ketrick.,,"Ei kuulu sinulle, puhu Ketrickille.",Ca ne vous concerne pas. Allez voir Ketrick.,"Semmi közöd hozzá, menj beszélj Ketrickkel.","Non sono affari tuoi, vai a parlare con Ketrick.",大きなお世話だ、ケトリックと話をしろ。,"상관 말고, 케트릭에게 물어봐.","Gaat je niets aan, ga met Ketrick praten.",Ikke din sak. Snakk med Ketrick.,"Nie twój interes, idź porozmawiać z Ketrickiem.",Não é da sua conta. Vá falar com o Ketrick.,,Nu-i treaba ta. Discută cu Ketrick.,Не твоё дело. Иди поговори с Кетриком.,,"Det angår inte dig, gå och prata med Ketrick.","Seni ilgilendirmez, git Ketrick'le konuş." -Ok.,TXT_RPLY0_SCRIPT04_D50028_OK,〃,,,Dobře.,,,,Bone.,Bueno.,,OK.,OK.,OK.,OK.,オーケー,알겠습니다.,OKÉ.,GREIT.,,,,Bine.,Понял.,,OKEJ.,TAMAM. +Where's the crystal again?,TXT_RPLY0_SCRIPT04_D48512_WHERE,〃,,,"Můžeš mi znovu říct, kde je krystal?",Hvor er krystallen igen?,"Wo ist der Kristall, nochmal?",,"Mi demandis, kie estas la kristalo.","De nuevo, ¿dónde está el cristal?",,Missä kristalli olikaan?,Mais où est le cristal?,,Hol is van a kristály?,E il cristallo dov'è?,いいからクリスタルは何処だ?,수정체가 어디에 있다고요?,Waar is het kristal ook alweer?,Hvor er krystallen igjen?,"Jeszcze raz, gdzie kryształ?",Onde fica o cristal mesmo?,,Unde ziceai că e cristalul?,Ещё раз: где кристалл?,,Var är kristallen igen?,Kristal yine nerede? +"None of your business, go talk to Ketrick.",TXT_DLG_SCRIPT04_D50028_NONEO,〃,,,"Do toho ti nic není, jdi si promluvit s Ketrickem.","Det rager ikke dig, gå hen og snak med Ketrick.","Geht dich nichts an, und jetzt rede mit Ketrick.",,Tio ne estas via afero. Iru paroli al Ketrick.,No es asunto tuyo. Ve a hablar con Ketrick.,,"Ei kuulu sinulle, puhu Ketrickille.",Ca ne vous concerne pas. Allez voir Ketrick.,,"Semmi közöd hozzá, menj beszélj Ketrickkel.","Non sono affari tuoi, vai a parlare con Ketrick.",大きなお世話だ、ケトリックと話をしろ。,"상관 말고, 케트릭에게 물어봐.","Gaat je niets aan, ga met Ketrick praten.",Ikke din sak. Snakk med Ketrick.,"Nie twój interes, idź porozmawiać z Ketrickiem.",Não é da sua conta. Vá falar com o Ketrick.,,Nu-i treaba ta. Discută cu Ketrick.,Не твоё дело. Иди поговори с Кетриком.,,"Det angår inte dig, gå och prata med Ketrick.","Seni ilgilendirmez, git Ketrick'le konuş." +Ok.,TXT_RPLY0_SCRIPT04_D50028_OK,〃,,,Dobře.,,,,Bone.,Bueno.,,OK.,OK.,,OK.,OK.,オーケー,알겠습니다.,OKÉ.,GREIT.,,,,Bine.,Понял.,,OKEJ.,TAMAM. "If it's busy work you want, go stare at that screen for a while, it'll bore you to tears.",TXT_DLG_SCRIPT04_D51544_IFITS,"〃 -(bored to tears = extremely bored)",,,"Jestli chceš tvrdou práci, jdi na chvíli zírat na tamtu obrazovku. Unudí tě to k pláči.","Hvis det er travlt arbejde du vil have, så gå hen og stirr på den skærm i et stykke tid, den vil kede dig til tårer.","Wenn du richtige Arbeit willst, dann starre mal für längere Zeit auf den Bildschirm. Das langweilt zu Tränen.",,"Se penigan laboron vi serĉas, iru rigardi tiun ekranon dum momento: vi mortos de enuo.","Si es trabajo duro lo que buscas, ve a mirar esa pantalla un rato: te morirás de aburrimiento.","Si es trabajo duro lo que buscas, ve a mirar esa pantalla un rato: te vas a morir de aburrimiento.","Jos puuhastelua kaipaat, niin mene tuijottamaan tuota ruutua joksikin aikaa. Eiköhän se ikävystytä sinut kuoliaaksi.","Si vous voulez un boulot éreintant, allez fixer cet écran pour quelques heures. Ca va vous ennuyer jusqu'a en pleurer.","Ha nagyon el akarod magad foglalni, akkor bámuld azt a monitort egy darabig. Halálra fog untatni.","Se vuoi un lavoro pesante, ti basta guardare quello schermo per un po', e ti annoierai a morte.","忙しい仕事を望んでいるなら、 +(bored to tears = extremely bored)",,,"Jestli chceš tvrdou práci, jdi na chvíli zírat na tamtu obrazovku. Unudí tě to k pláči.","Hvis det er travlt arbejde du vil have, så gå hen og stirr på den skærm i et stykke tid, den vil kede dig til tårer.","Wenn du richtige Arbeit willst, dann starre mal für längere Zeit auf den Bildschirm. Das langweilt zu Tränen.",,"Se penigan laboron vi serĉas, iru rigardi tiun ekranon dum momento: vi mortos de enuo.","Si es trabajo duro lo que buscas, ve a mirar esa pantalla un rato: te morirás de aburrimiento.","Si es trabajo duro lo que buscas, ve a mirar esa pantalla un rato: te vas a morir de aburrimiento.","Jos puuhastelua kaipaat, niin mene tuijottamaan tuota ruutua joksikin aikaa. Eiköhän se ikävystytä sinut kuoliaaksi.","Si vous voulez un boulot éreintant, allez fixer cet écran pour quelques heures. Ca va vous ennuyer jusqu'a en pleurer.",,"Ha nagyon el akarod magad foglalni, akkor bámuld azt a monitort egy darabig. Halálra fog untatni.","Se vuoi un lavoro pesante, ti basta guardare quello schermo per un po', e ti annoierai a morte.","忙しい仕事を望んでいるなら、 そのスクリーンをしばらく見ていなさい、 飽きて涙が浮かぶでしょう。",만약 더 쉬운 일을 원한다면 저 차단기를 계속 쳐다봐봐. 눈물 나도록 지루해 죽을걸.,"Als het druk werk is dat je wilt, ga dan een tijdje naar dat scherm staren, het zal je tot tranen toe vervelen.","Hvis du vil ha mye å gjøre, kan du stirre på skjermen en stund. Den kjeder deg i hjel.","Jeśli szukasz ciężkiej pracy, to idź pogapić się przez chwilę w ten ekran, zanudzi cię to na śmierć.","Se você quer ficar bem ocupado, fique olhando para essa tela por um tempo. Você vai morrer de tédio.",,"Dacă vrei treabă pe bune, du-te holbează-te la ecranul ăla o vreme, te va plictisii până la lacrimi.","Если ты хочешь работы от ушей до пят, попялься какое-то время на тот экран... Наскучит до слёз.",,"Om du vill ha ett arbete, gå och stirra på den där skärmen ett tag, den kommer att tråka ut dig till tårar.","Eğer meşgul olmak istiyorsan, git bir süre şu ekrana bak, seni gözyaşlarına boğacak." -The almighty Programmer is so paranoid of infiltration that he's locked up the computer core. How am I supposed to get my work done? The only way in is the suicide run.,TXT_DLG_SCRIPT04_D53060_THEAL,MAP04: Reactor Core → Southern alarm green door,,,"Náš všemocný Programátor je tak paranoidní, že uzamknul počítačové jádro. Jak mám takhle pracovat? Jediná cesta tam je skrz běh pro sebevrahy.","Den almægtige programmør er så paranoid over for infiltration, at han har låst computerkernen inde. Hvordan skal jeg få mit arbejde gjort? Den eneste vej ind er selvmordsruten.","Der allmächtige Programmierer ist so paranoid, dass er den Computer blockiert hat. Wie soll ich so meine Arbeit machen? Der einzige weg wäre über den Selbstmordpfad.",,"La ĉiopova Programisto estas tiel paranoja pri ebla enŝoviĝo, ke li ŝlosis la komputilan kernon. Kiel mi supozeble laboros? La ununura ŝlosilo estas la vivo-riska vojo.",El todopoderoso Programador tiene tanta paranoia de infiltración que hasta ha cerrado el núcleo del ordenador. ¿Cómo se supone que voy a hacer mi trabajo? La única forma es por la vía suicida.,El todopoderoso Programador tiene tanta paranoia de infiltración que hasta cerró el núcleo de la computadora. ¿Cómo se supone que voy a hacer mi trabajo? La única forma es por la vía suicida.,"Kaikkivoipa Ohjelmoitsija on niin vainoharhainen soluttautujista, että on lukinnut tietokoneen ytimen. Miten minä muka työni saan tehdyksi? Ainoa tie sisään on itsemurhareitti.","Ce tout-puissant Programmeur est tellement paranoïaque au sujet des infiltrations qu'il a mis le cœur informatique sous les verrous. Comment je peux faire mon travail maintenant? Si je veux essayer d'y entrer, faut que j'utilise le couloir du suicide!","A mindenható Programozó annyira tart a behatolóktól, hogy elzárta a számítógép magot. Hogy kéne így végeznem a munkámat. Az egyetlen lehetőség a halál inga.","L'onnipotente Programmatore è così paranoico per le infiltrazioni che ha bloccato l'ingresso al nucleo del computer. Come posso finire il mio lavoro? L'unico modo per entrare è tramite il ""percorso suicida"".","プログラマー様は潜入されるのを +The almighty Programmer is so paranoid of infiltration that he's locked up the computer core. How am I supposed to get my work done? The only way in is the suicide run.,TXT_DLG_SCRIPT04_D53060_THEAL,MAP04: Reactor Core → Southern alarm green door,,,"Náš všemocný Programátor je tak paranoidní, že uzamknul počítačové jádro. Jak mám takhle pracovat? Jediná cesta tam je skrz běh pro sebevrahy.","Den almægtige programmør er så paranoid over for infiltration, at han har låst computerkernen inde. Hvordan skal jeg få mit arbejde gjort? Den eneste vej ind er selvmordsruten.","Der allmächtige Programmierer ist so paranoid, dass er den Computer blockiert hat. Wie soll ich so meine Arbeit machen? Der einzige weg wäre über den Selbstmordpfad.",,"La ĉiopova Programisto estas tiel paranoja pri ebla enŝoviĝo, ke li ŝlosis la komputilan kernon. Kiel mi supozeble laboros? La ununura ŝlosilo estas la vivo-riska vojo.",El todopoderoso Programador tiene tanta paranoia de infiltración que hasta ha cerrado el núcleo del ordenador. ¿Cómo se supone que voy a currar así? La única forma es por la vía suicida.,El todopoderoso Programador tiene tanta paranoia de infiltración que hasta cerró el núcleo de la computadora. ¿Cómo se supone que voy a trabajar así? La única forma es por la vía suicida.,"Kaikkivoipa Ohjelmoitsija on niin vainoharhainen soluttautujista, että on lukinnut tietokoneen ytimen. Miten minä muka työni saan tehdyksi? Ainoa tie sisään on itsemurhareitti.","Ce tout-puissant Programmeur est tellement paranoïaque au sujet des infiltrations qu'il a mis le cœur informatique sous les verrous. Comment je peux faire mon travail maintenant? Si je veux essayer d'y entrer, faut que j'utilise le couloir du suicide!",,"A mindenható Programozó annyira tart a behatolóktól, hogy elzárta a számítógép magot. Hogy kéne így végeznem a munkámat. Az egyetlen lehetőség a halál inga.","L'onnipotente Programmatore è così paranoico per le infiltrazioni che ha bloccato l'ingresso al nucleo del computer. Come posso finire il mio lavoro? L'unico modo per entrare è tramite il ""percorso suicida"".","プログラマー様は潜入されるのを 非常に恐れているらしく、コンピューターコアの ロックを厳重にするよう命じたんだ。 どうやってあんな危ない所で仕事するんだ?",위대하신 프로그래머님이 침입에 대해 너무나도 불안해하셔서 컴퓨터 중심부를 락다운 시켰어. 일이 점점 더 어려워지고 있는 것 같아. 내 생각엔 자살기행을 또 해봐야겠어.,De almachtige Programmeur is zo paranoïde van infiltratie dat hij de computerkern heeft afgesloten. Hoe moet ik mijn werk gedaan krijgen? De enige manier om binnen te komen is de zelfmoordactie.,Den allmektige programmereren er så paranoid for infiltrasjon at han har låst datakjernen. Hvordan skal jeg få arbeidet mitt gjort? Den eneste veien inn er selvmordsløpet.,"Wszechmocny Programista ma paranoję na punkcie infiltracji tak bardzo, że zamknął rdzeń komputera. Jakim cudem mam skończyć pracę? Jedyną drogą, by tam się dostać jest ścieżka samobójców.",O todo-poderoso Programador é tão paranóico com infiltração que ele travou o núcleo de computação. Como que eu vou fazer o meu trabalho? A único jeito é a maneira suicida.,,Atotputernicul Programator e atât de paranoic în privința infiltrărilor încât a încuiat nucleul calculatorului. Cum mi-aș putea face treaba? Singura cale de intrare e sinucidere.,"Всемогущий Программист настолько боится проникновения, что закрыл компьютерную комнату. И как мне теперь выполнять свою работу? Есть один способ пройти туда, но это чистое самоубийство.",,Den allsmäktige programmeraren är så paranoid för infiltration att han har låst in datorkärnan. Hur ska jag kunna få mitt arbete gjort? Den enda vägen in är självmordsresan.,Yüce Programcı sızma konusunda o kadar paranoyak ki bilgisayar çekirdeğini kilitledi. İşimi nasıl yapacağım? İçeri girmenin tek yolu intihar koşusu. -Suicide run? What's that?,TXT_RPLY0_SCRIPT04_D53060_SUICI,〃,,,Běh pro sebevrahy? Co to je?,Selvmordsruten? Hvad er det?,"Selbstmordpfad, was ist das?",,Ĉu vivo-riska vojo? Kio estas tio?,¿Vía suicida? ¿Cómo es eso?,,Itsemurhareitti? Mikä se on?,Couloir du suicide? Comment ça?,Halál inga? Az meg mi a fene?,"""Percorso suicida""? Che roba è?",危ない?どういう事だ?,자살기행? 그건 뭡니까?,Zelfmoordactie? Wat is dat?,Selvmordsløp? Hva er det?,Ścieżka samobójców? Co to?,Maneira suicida? O que é isso?,,O cale sinucigașă? Cum așa?,Самоубийство? О чём ты?,,Självmordslopp? Vad är det för något?,İntihar koşusu mu? O da ne? -"It's a sure-fire way to get killed, but that's not important right now. Go down the lift if you're so inclined.",TXT_DLG_SCRIPT04_D54576_ITSAS,〃,,,"Je to zaručený způsob, jak zemřít, ale to teď není důležité. Sjeď výtahem dolů, jestli tě to tak zajímá.","Det er en sikker måde at blive dræbt på, men det er ikke vigtigt lige nu. Gå ned i elevatoren, hvis du har lyst til det.","Es ist ein todsicherer Weg um das Zeitliche zu segnen, aber das ist jetzt nicht wichtig. Nimm den Lift da drüben, wenn du Lust hast,und sieh selbst unten nach.",,"Ĝi estas neeraripova maniero morti, sed tio nun ne estas grava. Iru malsupren per la lifto se vi estas inklina al tio.","Es una forma segura de matarte, pero eso no importa ahora. Baja por el ascensor si te apetece.",,"Se on taattu keino tapattaa itsensä, mutta sillä ei ole nyt väliä. Mene hissillä alas, jos niin haluat.",C'est un moyen garanti de se tuer. Mais ce n'est pas important pour l'instant. Descendez avec l'acsenseur si vous voulez absolument essayer.,"Egy holtbiztos módja, hogy kinyírasd magadat, de ez most nem lényeges. Menj le a lifttel, ha annyira érdekel.","È un ottimo metodo per rimanere uccisi, ma questo non è importante al momento. Scendi con l'ascensore, se sei così incline.","下手に立ち入ると射殺されるが、 +Suicide run? What's that?,TXT_RPLY0_SCRIPT04_D53060_SUICI,〃,,,Běh pro sebevrahy? Co to je?,Selvmordsruten? Hvad er det?,"Selbstmordpfad, was ist das?",,Ĉu vivo-riska vojo? Kio estas tio?,¿Vía suicida? ¿Cómo es eso?,,Itsemurhareitti? Mikä se on?,Couloir du suicide? Comment ça?,,Halál inga? Az meg mi a fene?,"""Percorso suicida""? Che roba è?",危ない?どういう事だ?,자살기행? 그건 뭡니까?,Zelfmoordactie? Wat is dat?,Selvmordsløp? Hva er det?,Ścieżka samobójców? Co to?,Maneira suicida? O que é isso?,,O cale sinucigașă? Cum așa?,Самоубийство? О чём ты?,,Självmordslopp? Vad är det för något?,İntihar koşusu mu? O da ne? +"It's a sure-fire way to get killed, but that's not important right now. Go down the lift if you're so inclined.",TXT_DLG_SCRIPT04_D54576_ITSAS,〃,,,"Je to zaručený způsob, jak zemřít, ale to teď není důležité. Sjeď výtahem dolů, jestli tě to tak zajímá.","Det er en sikker måde at blive dræbt på, men det er ikke vigtigt lige nu. Gå ned i elevatoren, hvis du har lyst til det.","Es ist ein todsicherer Weg um das Zeitliche zu segnen, aber das ist jetzt nicht wichtig. Nimm den Lift da drüben, wenn du Lust hast,und sieh selbst unten nach.",,"Ĝi estas neeraripova maniero morti, sed tio nun ne estas grava. Malsupriĝu per la lifto se vi estas inklina al tio.","Es una forma segura de matarte, pero eso no importa ahora. Baja por el ascensor si te apetece.",,"Se on taattu keino tapattaa itsensä, mutta sillä ei ole nyt väliä. Mene hissillä alas, jos niin haluat.",C'est un moyen garanti de se tuer. Mais ce n'est pas important pour l'instant. Descendez avec l'acsenseur si vous voulez absolument essayer.,,"Egy holtbiztos módja, hogy kinyírasd magadat, de ez most nem lényeges. Menj le a lifttel, ha annyira érdekel.","È un ottimo metodo per rimanere uccisi, ma questo non è importante al momento. Scendi con l'ascensore, se sei così incline.","下手に立ち入ると射殺されるが、 今それどころではない。 そんなに行きたいならリフトを降りるんだな。","말 그대로 죽기 쉬운 방법인데, 더 알 필요는 없어. 궁금해 미치겠다면 밑으로 내려가 봐. \cy오, 내가 숨어있어서 다행이야. 무슨 뜻인지 알겠지?","Het is een zekere manier om gedood te worden, maar dat is nu niet belangrijk. Ga de lift af als je zo geneigd bent.","Det er en sikker måte å bli drept på, men det er ikke viktig akkurat nå. Ta heisen hvis du vil.","To jest niezawodna droga, by dać się zabić, ale to nie jest teraz ważne. Zjedź windą, jeśli jesteś w stanie to zrobić.","É uma forma garantida de ser morto, mas isso não importa agora. Desça pelo elevador se você está tão curioso.",,"E un mod garantat de a muri, dar nu contează acum. Ia liftul jos dacă ești curios.","Сунуться туда — верная гибель, но на данный момент это не важно. Спускайся на лифте, если не боишься.",,"Det är ett säkert sätt att bli dödad, men det är inte viktigt just nu. Gå ner i hissen om du vill.",Öldürülmek için kesin bir yol ama şu an bunun bir önemi yok. İstiyorsan asansörden aşağı in. -Halt. No one gets through here without authorization from the Warden or the Governor.,TXT_DLG_SCRIPT05_D0_HALTN,MAP05: Door Guard.,,,Stát. Nikdo tudy nesmí projít bez povolení dozorce nebo guvernéra.,Stop. Ingen kommer igennem her uden tilladelse fra direktøren eller guvernøren.,Halt. Niemand kommt hier ohne Autorisierung des Direktors durch.,,Haltu. Neniu eniras sen permeso el la provoso aŭ la registo.,Alto. Nadie entra aquí sin autorización del carcelero o del gobernador.,,Seis. Kukaan ei pääse tästä läpi ilman vankilanjohtajan tai kuvernöörin lupaa.,Halte! Personne ne passe sans autorisation du gardien ou du gouverneur.,Áljj! Nem haladhat át senki sem az Igazgató vagy Kormányzó engedélye nélkül.,Fermo lì. Nessuno passa qua senza l'autorizzazione del direttore o del governatore.,"止まれ。所長か知事の許可が無い限り +Halt. No one gets through here without authorization from the Warden or the Governor.,TXT_DLG_SCRIPT05_D0_HALTN,MAP05: Door Guard.,,,Stát. Nikdo tudy nesmí projít bez povolení dozorce nebo guvernéra.,Stop. Ingen kommer igennem her uden tilladelse fra direktøren eller guvernøren.,Halt. Niemand kommt hier ohne Autorisierung des Direktors durch.,,Haltu. Neniu eniras sen permeso el la provoso aŭ la registo.,Alto. Nadie entra aquí sin autorización del carcelero o del gobernador.,,Seis. Kukaan ei pääse tästä läpi ilman vankilanjohtajan tai kuvernöörin lupaa.,Halte! Personne ne passe sans autorisation du gardien ou du gouverneur.,,Áljj! Nem haladhat át senki sem az Igazgató vagy Kormányzó engedélye nélkül.,Fermo lì. Nessuno passa qua senza l'autorizzazione del direttore o del governatore.,"止まれ。所長か知事の許可が無い限り 立ち入る事は許さん。",멈춰라. 총독이나 간수장의 허락을 받지 않은 이상 그 누구도 입장할 수 없다.,Stop. Niemand komt hier door zonder toestemming van de directeur of de gouverneur.,Stopp. Ingen kommer gjennom her uten tillatelse fra direktøren eller guvernøren.,Stop. Nikt tu nie wejdzie bez zgody Naczelnika lub Gubernatora.,Alto. Ninguém passa por aqui sem autorização do Carcereiro ou do Governador.,,Stop. Nimeni nu trece pe aici fără autorizație de la Director sau Guvernator.,Стой. Никто не может пройти сюда без разрешения от тюремщика или губернатора.,,Halt. Ingen kommer igenom här utan tillstånd från föreståndaren eller guvernören.,Durun. Müdür ya da Vali'nin izni olmadan kimse buradan geçemez. -"Here's my pass, let me in.",TXT_RPLY0_SCRIPT05_D0_HERES,〃,,,"Tady je moje propustka, pusť mě dál.","Her er mit pas, luk mig ind.","Hier is mein Pass, lassen Sie mich rein.",,Jen mia enirpermeso; lasu min eniri.,Aquí está mi pase; déjeme entrar.,,Tässä lupani; päästäkää minut sisään.,Voilà mon passe. Laissez-moi entrer.,"Itt az igazolásom, engedj be.","Ecco la mia autorizzazione, fammi entrare.",これが許可証だ、入れてくれ。,여기 통행증입니다. 들여보내 주세요.,"Hier is mijn pas, laat me binnen.","Her er passet mitt, slipp meg inn.",Oto moja przepustka. Wpuść mnie.,Aqui está o meu passe. Deixe-me entrar.,,"Aici e legitimația, lasă-mă să intru.",Вот мой пропуск. Дай войти.,,"Här är mitt passerkort, släpp in mig.","İşte kartım, beni içeri alın." -"OK, but talk only to the Warden.",TXT_DLG_SCRIPT05_D1516_OKBUT,〃,,,"Dobře, ale mluvte pouze s dozorcem.","Okay, men tal kun med direktøren.","Ok, aber reden Sie nur mit dem Direktor.",,"Bone, sed limu vin paroli kun la provoso.","Entendido, pero limítate a hablar con el carcelero.",,"Selvä, mutta puhu ainoastaan vankilanjohtajan kanssa.","D'accord, mais vous ne vous pouvez parler qu'au gardien.","OK, de csak az igazgatóval beszélj.","OK, ma parla solo con il direttore.",良いだろう、ただし話すのは所長とだけだ。,"알겠다. 하지만 간수장에게만 대화해라. +"Here's my pass, let me in.",TXT_RPLY0_SCRIPT05_D0_HERES,〃,,,"Tady je moje propustka, pusť mě dál.","Her er mit pas, luk mig ind.","Hier is mein Pass, lassen Sie mich rein.",,Jen mia enirpermeso; lasu min eniri.,Aquí está mi pase; déjeme entrar.,,Tässä lupani; päästäkää minut sisään.,Voilà mon passe. Laissez-moi entrer.,,"Itt az igazolásom, engedj be.","Ecco la mia autorizzazione, fammi entrare.",これが許可証だ、入れてくれ。,여기 통행증입니다. 들여보내 주세요.,"Hier is mijn pas, laat me binnen.","Her er passet mitt, slipp meg inn.",Oto moja przepustka. Wpuść mnie.,Aqui está o meu passe. Deixe-me entrar.,,"Aici e legitimația, lasă-mă să intru.",Вот мой пропуск. Дай войти.,,"Här är mitt passerkort, släpp in mig.","İşte kartım, beni içeri alın." +"OK, but talk only to the Warden.",TXT_DLG_SCRIPT05_D1516_OKBUT,〃,,,"Dobře, ale mluvte pouze s dozorcem.","Okay, men tal kun med direktøren.","Ok, aber reden Sie nur mit dem Direktor.",,"Bone, sed limu vin paroli kun la provoso.","Entendido, pero limítate a hablar con el carcelero.",,"Selvä, mutta puhu ainoastaan vankilanjohtajan kanssa.","D'accord, mais vous ne vous pouvez parler qu'au gardien.",,"OK, de csak az igazgatóval beszélj.","OK, ma parla solo con il direttore.",良いだろう、ただし話すのは所長とだけだ。,"알겠다. 하지만 간수장에게만 대화해라. \cy뭐가 이리 불만이야. 나중에 얘 좀 꼭 처리해줘.","OK, maar praat alleen met de directeur.","OK, men snakk bare med direktøren.","Ok, ale rozmawiaj tylko z Naczelnikiem.","Ok, mas você só pode falar com o Carcereiro.",,"Bine, dar vorbești doar cu Directorul.","Проходи, но говори только с тюремщиком.",,"Okej, men prata bara med fängelsedirektören.","Tamam, ama sadece müdürle konuş." -"Do I look like the Warden to you? Keep moving, this area's off limits.",TXT_DLG_SCRIPT05_D3032_DOILO,〃 (After killing Montag),,,"Vypadám snad jako dozorce? Pokračuj dál, do této oblasti je vstup zakázán.","Ligner jeg direktøren? Fortsæt, dette område er forbudt område.","Sehe ich wie ein Direktor aus? Beweg dich, du hast hier nichts zu suchen.",,"Ĉu mi aspektas kiel la provoso laŭ vi? Foriru, ĉi tiu zono estas ekster la limoj.","¿Te parezco el carcelero? Ya vete, que esta área está fuera de los límites.",,Näytänkö minä sinulle vankilanjohtajalta? Jatka matkaasi; tähän alueeseen on pääsy kielletty.,"Je ressemble au gardien, à ton avis? Bouge, cette zone est hors-limites!","Úgy nézek ki, mint egy igazgató? Haladj tovább, ez a terület nem látogatható.","Ti sembro forse il direttore? Non stare fermo qua, quest'area è riservata al personale autorizzato.","俺がワーデンに見えるか? どっか行け、 +"Do I look like the Warden to you? Keep moving, this area's off limits.",TXT_DLG_SCRIPT05_D3032_DOILO,〃 (After killing Montag),,,"Vypadám snad jako dozorce? Pokračuj dál, do této oblasti je vstup zakázán.","Ligner jeg direktøren? Fortsæt, dette område er forbudt område.","Sehe ich wie ein Direktor aus? Beweg dich, du hast hier nichts zu suchen.",,"Ĉu mi aspektas kiel la provoso laŭ vi? Foriru, ĉi tiu zono estas ekster la limoj.","¿Te parezco el carcelero? Ya vete, que esta área está fuera de los límites.",,Näytänkö minä sinulle vankilanjohtajalta? Jatka matkaasi; tähän alueeseen on pääsy kielletty.,"Je ressemble au gardien, à ton avis? Bouge, cette zone est hors-limites!",,"Úgy nézek ki, mint egy igazgató? Haladj tovább, ez a terület nem látogatható.","Ti sembro forse il direttore? Non stare fermo qua, quest'area è riservata al personale autorizzato.","俺がワーデンに見えるか? どっか行け、 この区域は立入禁止だ。","내가 친히 나서서 간수장을 찾아야겠나? 어서 움직여. 이곳은 통행 금지야. \cy“이곳은 통행 금지야!” 웃기고 앉아있네.","Zie ik eruit als de directeur? Blijf bewegen, dit gebied is verboden terrein.","Ser jeg ut som direktøren? Gå videre, dette området er forbudt område.","Czy według ciebie wyglądam na Naczelnika? Rusz się, nikt nie ma wstępu na ten obszar.",Está achando que eu sou o Carcereiro? Suma daqui. Você não pode andar por aqui.,,"Ți se pare că eu sunt Directorul? Continuă să mergi, asta e o zonă fără acces.","Я что, похож на тюремщика? Двигай отсюда. Здесь закрытая территория!",,"Ser jag ut som fängelsedirektören? Fortsätt gå, det här området är förbjudet område.","Sana Müdür gibi mi görünüyorum? Devam edin, bu bölge yasak bölge." -The Order's wrath will rain down on these servants until they beg for death.,TXT_DLG_SCRIPT05_D4548_THEOR,MAP05: Prison Guard.,,,Hněv Řádu dopadne na ty služebníky dokud nebudou prosit o smrt.,"Ordenens vrede vil regne ned over disse tjenere, indtil de tigger om at dø.","Der Zorn des Ordens wird auf diese Untergebenen herabregnen, bis sie um den Tod betteln.",,La tondro de La Ordeno pluvos sur tiujn servantojn ĝis ili petegos pri morto.,La ira de La Orden caerá sobre estos sirvientes hasta que supliquen por su muerte.,La ira de La Orden va a caer sobre estos sirvientes hasta que supliquen por su muerte.,"Veljeskunnan viha säilyy näiden palvelijoiden yllä siihen asti, kunnes rukoilevat kuolemaa.",La colère de l'Ordre s'abattrera sur ces serviles miséreux jusqu'a ce qu'ils pleurent pour leur propre mort.,"A Rend haragja fog lesújtani ezekre a szolgákra, egészen addig amíg nem könyörögnek a halálért.",La furia dell'Ordine si riverserà su questi servi finché non chiederanno pietà!,"オーダーの怒りは、奴等が死を望むまで +The Order's wrath will rain down on these servants until they beg for death.,TXT_DLG_SCRIPT05_D4548_THEOR,MAP05: Prison Guard.,,,Hněv Řádu dopadne na ty služebníky dokud nebudou prosit o smrt.,"Ordenens vrede vil regne ned over disse tjenere, indtil de tigger om at dø.","Der Zorn des Ordens wird auf diese Untergebenen herabregnen, bis sie um den Tod betteln.",,La tondro de La Ordeno pluvos sur tiujn servantojn ĝis ili petegos pri morto.,La ira de La Orden caerá sobre estos sirvientes hasta que supliquen por su muerte.,La ira de La Orden va a caer sobre estos sirvientes hasta que supliquen por su muerte.,"Veljeskunnan viha säilyy näiden palvelijoiden yllä siihen asti, kunnes rukoilevat kuolemaa.",La colère de l'Ordre s'abattrera sur ces serviles miséreux jusqu'a ce qu'ils pleurent pour leur propre mort.,,"A Rend haragja fog lesújtani ezekre a szolgákra, egészen addig amíg nem könyörögnek a halálért.",La furia dell'Ordine si riverserà su questi servi finché non chiederanno pietà!,"オーダーの怒りは、奴等が死を望むまで 止む事はない。","이 죄인들이 죽음을 바라기 전까지는 오더의 심판과 응징을 받을 것이다. \cy아주 들떠있는 녀석이네.",De toorn van de Orde zal op deze bedienden neerdalen tot ze om de dood smeken.,Ordenens vrede vil regne over disse tjenerne til de trygler om å dø.,Gniew Zakonu spadnie jak deszcz na te sługi dopóki nie będą błagać o śmierć.,A ira da Ordem descerá a esses servos até eles implorarem pela morte.,,Furia Ordinului se va năpusti asupra servitorilor aceștia până vor cerși după moarte.,"Гнев Ордена обрушится на этих рабов, и они будут молить о смерти.",,Ordens vrede kommer att regna över dessa tjänare tills de ber om döden.,"Tarikat'ın gazabı, ölüm için yalvarana kadar bu hizmetkarların üzerine yağacak." -"I don't care if Mourel gave you a pass. This is my prison. My key is the only way in or out, and I'm not taking any chances. The Order does not tolerate mistakes.",TXT_DLG_SCRIPT05_D6064_IDONT,MAP05: Montag.,,,"Mě je jedno, že ti Mourel dal propustku. Tohle je moje vězení. Můj klíč je jediná cesta dovnitř a ven a já nehodlám nic riskovat. Řád netoleruje chyby.","Jeg er ligeglad med, om Mourel gav dig et fripas. Dette er mit fængsel. Min nøgle er den eneste vej ind eller ud, og jeg tager ingen chancer. Ordenen tolererer ikke fejltagelser.","Es ist mir egal ob Mourel Ihnen einen Pass gegeben hat. Das ist mein Gefängnis. Mein Schlüssel ist die einzige Möglichkeit, herein- oder herauszukommen, und ich riskiere da gar nichts. Der Orden toleriert keine Fehler.",,"Mi ne zorgas, ke Mourel donis enirpermeson al vi. Ĉi tiu estas mia malliberejo; mia ŝlosilo estas la ununura maniero eniri aŭ eliri, kaj mi ne riskos min. La Ordeno toleras nenian eraron.","No me importa que Mourel te haya dado un pase. Esta es mi prisión; mi llave es la única forma de entrar o salir, y no me arriesgaré. La Orden no tolera los fallos.","No me importa que Mourel te haya dado un pase. Esta es mi prisión; mi llave es la única forma de entrar o salir, y no me voy a arriesgar. La Orden no tolera los fallos.","En välitä mistään Mourelin luvista. Tämä on minun vankilani. Vain minun avaimellani pääsee sisään tai ulos, enkä aio ottaa yhtäkään riskiä. Veljeskunta ei suvaitse virheitä.","Je m'en fous que Mourel t'ai donné un passe. C'est ma prison. Ma clé est la seule façon d'entrer ou de sortir, et je ne prends pas de risques. L'Ordre ne tolère pas les erreurs.","Az sem érdekel ha Mourel adta a belépőt. Ez az Én börtönöm. Az Én kulcsom az egyetlen ami ki és bejutást enged, nem kockáztatok. A Rend nem igazán tolerálja a hibákat.","Non mi interessa se Mourel ti ha fatto entrare qua. Questa è la mia prigione. La mia chiave è l'unico modo per entrare o per uscire, e non ho intenzione di lasciare nulla al caso. L'Ordine non tollera errori.","モーレルが許可しようが構わん。 +"I don't care if Mourel gave you a pass. This is my prison. My key is the only way in or out, and I'm not taking any chances. The Order does not tolerate mistakes.",TXT_DLG_SCRIPT05_D6064_IDONT,MAP05: Montag.,,,"Mě je jedno, že ti Mourel dal propustku. Tohle je moje vězení. Můj klíč je jediná cesta dovnitř a ven a já nehodlám nic riskovat. Řád netoleruje chyby.","Jeg er ligeglad med, om Mourel gav dig et fripas. Dette er mit fængsel. Min nøgle er den eneste vej ind eller ud, og jeg tager ingen chancer. Ordenen tolererer ikke fejltagelser.","Es ist mir egal ob Mourel Ihnen einen Pass gegeben hat. Das ist mein Gefängnis. Mein Schlüssel ist die einzige Möglichkeit, herein- oder herauszukommen, und ich riskiere da gar nichts. Der Orden toleriert keine Fehler.",,"Mi ne zorgas, ke Mourel donis enirpermeson al vi. Ĉi tiu estas mia malliberejo; mia ŝlosilo estas la ununura maniero eniri aŭ eliri, kaj mi ne riskos min. La Ordeno toleras nenian eraron.","No me importa que Mourel te haya dado un pase. Esta es mi prisión; mi llave es la única forma de entrar o salir, y no me arriesgaré. La Orden no tolera los fallos.","No me importa que Mourel te haya dado un pase. Esta es mi prisión; mi llave es la única forma de entrar o salir, y no me voy a arriesgar. La Orden no tolera los fallos.","En välitä mistään Mourelin luvista. Tämä on minun vankilani. Vain minun avaimellani pääsee sisään tai ulos, enkä aio ottaa yhtäkään riskiä. Veljeskunta ei suvaitse virheitä.","Je m'en fous que Mourel t'ai donné un passe. C'est ma prison. Ma clé est la seule façon d'entrer ou de sortir, et je ne prends pas de risques. L'Ordre ne tolère pas les erreurs.",,"Az sem érdekel ha Mourel adta a belépőt. Ez az Én börtönöm. Az Én kulcsom az egyetlen ami ki és bejutást enged, nem kockáztatok. A Rend nem igazán tolerálja a hibákat.","Non mi interessa se Mourel ti ha fatto entrare qua. Questa è la mia prigione. La mia chiave è l'unico modo per entrare o per uscire, e non ho intenzione di lasciare nulla al caso. L'Ordine non tollera errori.","モーレルが許可しようが構わん。 ここは私の刑務所だ。この鍵でしか絶対出入りは 出来ないし、渡すつもりも無い。 オーダーは失敗を許さないからな。 ",모렐 녀석이 너에게 통행증을 줬다 해도 신경 안 써. 이곳은 이 몸이 통치하는 감옥이다! 내가 가지고 있는 열쇠만 있으면 죄인들의 자유를 맘껏 조종할 수 있지. 오더는 절대로 실수 같은걸 용납하지 않아!,Het kan me niet schelen of Mourel je een pasje heeft gegeven. Dit is mijn gevangenis. Mijn sleutel is de enige weg naar binnen of buiten en ik neem geen enkel risico. De Orde tolereert geen fouten.,"Jeg blåser i om Mourel ga deg et passerseddel. Dette er mitt fengsel. Min nøkkel er den eneste veien inn eller ut, og jeg tar ingen sjanser. Ordenen tolererer ikke feil.","Nie obchodzi mnie to, że Mourel dał ci przepustkę. To moje więzienie. Tylko mój klucz pozwala wejść lub wyjść, i nie mam zamiaru ryzykować. Zakon nie toleruje błędów.",Eu não estou nem aí se o Mourel te deu um passe. Esta é a minha prisão. A única forma de entrar ou sair é com a minha chave e eu não estou a fim de arriscar. A Ordem não tolera erros.,,"Nu-mi pasă că Mourel ți-a dat o legitimație. Asta e închisoarea mea. Cheia mea e singura cale de intrare sau ieșire, și nu risc nimic. Ordinul nu tolerează greșeli.","Мне плевать, дал ли тебе Морел пропуск или нет. Это моя тюрьма, и без моего ключа не войти и не выйти. И я не хочу рисковать — Орден не прощает ошибок!",,"Jag bryr mig inte om Mourel gav dig ett passerkort. Det här är mitt fängelse. Min nyckel är den enda vägen in eller ut, och jag tar inga risker. Orden tolererar inga misstag.",Mourel'in sana izin vermesi umurumda değil. Burası benim hapishanem. İçeri girip çıkmanın tek yolu benim anahtarım ve işimi şansa bırakmayacağım. Tarikatın hataya tahammülü yoktur. -Give me the damn key!,TXT_RPLY0_SCRIPT05_D6064_GIVEM,〃,,,Dej mi ten zatracený klíč!,Giv mig den forbandede nøgle!,Geben Sie mir den verdammten Schlüssel!,,Donu la fekan ŝlosilon!,¡Dame la maldita llave!,,Anna minulle se pahuksen avain!,Donne moi cette putain de clé!,Add ide az istenverte kulcsot!,Dammi quella dannata chiave!,いいからとっととキーを寄越せ!,그 망할 놈의 키를 건네!,Geef me die verdomde sleutel!,Gi meg den jævla nøkkelen!,Daj mi ten cholerny klucz!,Me dê a droga da chave!,,Dă-mi afurisita de cheie!,Дай мне чёртов ключ!,,Ge mig den förbannade nyckeln!,Ver şu lanet anahtarı bana! -Over my dead body!,TXT_DLG_SCRIPT05_D7580_OVERM,〃,,,Jen přes mou mrtvolu!,Over mit lig!,Nur über meine Leiche!,,Nur post mia morto!,¡Primero muerto!,,Vain kuolleen ruumiini yli!,Il faudra me passer sur le corps!,Csak a holttestemen át!,Sul mio cadavere!,欲しけりゃ取りに来い。,"내 시체를 밟고 얻어라! +Give me the damn key!,TXT_RPLY0_SCRIPT05_D6064_GIVEM,〃,,,Dej mi ten zatracený klíč!,Giv mig den forbandede nøgle!,Geben Sie mir den verdammten Schlüssel!,,Donu la fekan ŝlosilon!,¡Dame la maldita llave!,,Anna minulle se pahuksen avain!,Donne moi cette putain de clé!,,Add ide az istenverte kulcsot!,Dammi quella dannata chiave!,いいからとっととキーを寄越せ!,그 망할 놈의 키를 건네!,Geef me die verdomde sleutel!,Gi meg den jævla nøkkelen!,Daj mi ten cholerny klucz!,Me dê a droga da chave!,,Dă-mi afurisita de cheie!,Дай мне чёртов ключ!,,Ge mig den förbannade nyckeln!,Ver şu lanet anahtarı bana! +Over my dead body!,TXT_DLG_SCRIPT05_D7580_OVERM,〃,,,Jen přes mou mrtvolu!,Over mit lig!,Nur über meine Leiche!,,Nur post mia morto!,¡Primero muerto!,,Vain kuolleen ruumiini yli!,Il faudra me passer sur le corps!,,Csak a holttestemen át!,Sul mio cadavere!,欲しけりゃ取りに来い。,"내 시체를 밟고 얻어라! \cy아마 네가 “부탁”을 안 해서 이러나 봐.",Over mijn lijk!,Over mitt lik!,Po moim trupie!,Só sobre o meu cadáver!,,Doar peste cadavrul meu!,Только через мой труп!,,Över min döda kropp!,Cesedimi çiğneyin! -Great idea!,TXT_RPLY0_SCRIPT05_D7580_GREAT,〃,,,Skvělý nápad!,God idé!,Gute Idee!,,Bonega ideo!,¡Qué buena idea!,,Loistoidea!,Excellente idée!,Kiváló ötlet!,Ottima idea!,良い案だ!,좋은 생각이야!,Geweldig idee!,God idé!,Dobry pomysł!,Boa idéia!,,Grozavă idee!,Хорошая мысль!,,Bra idé!,Harika bir fikir! -"Shackles or chains, I want you to hang around.",TXT_DLG_SCRIPT05_D9096_SHACK,〃,,,"Pouta či řetězy, chci tě tu vidět viset.","Lænker eller kæder, jeg vil have dig til at blive hængende.",Fesseln oder Ketten - ich will dich hier herumhängen sehen.,,"Ĉu vi volas katenojn aŭ ŝeklojn? Mi volas, ke vi ĝuu vian restadon.",¿Grilletes o cadenas? Quiero que disfrutes de tu estancia.,,"Olipa sitten kahleissa tai ketjuissa, haluan sinun jäävän pysyäksesi.",Chaînes ou menottes? J'ai vraiment envie de vous retenir!,"Mindegy hogy béklyó vagy lánc, csak lógj itt szépen.","Ferri o catene, potrai starci benissimo qua!",鎖や手錠で、繋いだ方が良いな。,"동아줄, 아님 쇠사슬... 네 목에 잘 어울리겠네. 으하하하!","Sluitingen of kettingen, ik wil dat je blijft hangen.","Lenker eller lenker, jeg vil at du skal bli her.",Kajdany czy łańcuchy? Chcę byś na chwilę tu został.,Algemas ou correntes? Quero que você fique aqui por um tempo.,,"Cătușe sau lanțuri, vreau să rămăi pe-aici.","Кандалы или цепи? Я хочу, чтобы ты подольше тут задержался.",,"Fängsel eller kedjor, jag vill att du stannar kvar.","Kelepçe ya da zincir, buralarda olmanı istiyorum." -"I don't know how you managed to get past the guards and the Warden, but I hope you like the decor, because you just moved in.",TXT_DLG_SCRIPT05_D10612_IDONT,MAP05: Wolenick.,,,"Nemám tušení, jak se ti podařilo dostat se přes stráže a dozorce, ale doufám že se ti líbí naše výzdoba, protože jsi se právě nastěhoval.","Jeg ved ikke, hvordan det lykkedes dig at komme forbi vagterne og direktøren, men jeg håber, du kan lide indretningen, for du er lige flyttet ind.","Ich habe keine Ahnung, wie du an den Wachen und dem Direktor vorbeigekommen bist, aber ich hoffe du magst das Dekor, denn du bist gerade eingezogen.",,"Mi ne komprenas, kiel vi superis la gardistojn kaj la provoson, sed mi esperas, ke vi ŝatas la dekoracion, ĉar vi ĵus transloĝiĝis.","No sé cómo habrás pasado por los guardias y el carcelero, pero espero que te guste la decoración, porque te acabas de mudar aquí.",,"En tiedä, miten onnistuit pääsemään vartijoiden ja vankilanjohtajan läpi, mutta toivon, että pidät sisustuksesta; olethan sentään tänne juuri muuttanut.","Je ne sais pas comment vous êtes passé à travers les gardes et le gardien, mais j'espère que vous aimez le décor car ceci sera votre nouveau domicile.","Nem tudom, hogyan jutottál át az őrökön és az igazgatón, de remélem szimpatikus a hely, mert még sokáig leszel itt.","Non so come tu abbia fatto a superare il direttore o le guardie, ma spero che tu apprezzi l'ambiente, perché adesso questa sarà anche la tua prigione.","どうやってガードやセキュリティを +Great idea!,TXT_RPLY0_SCRIPT05_D7580_GREAT,〃,,,Skvělý nápad!,God idé!,Gute Idee!,,Bonega ideo!,¡Qué buena idea!,,Loistoidea!,Excellente idée!,,Kiváló ötlet!,Ottima idea!,良い案だ!,좋은 생각이야!,Geweldig idee!,God idé!,Dobry pomysł!,Boa idéia!,,Grozavă idee!,Хорошая мысль!,,Bra idé!,Harika bir fikir! +"Shackles or chains, I want you to hang around.",TXT_DLG_SCRIPT05_D9096_SHACK,〃,,,"Pouta či řetězy, chci tě tu vidět viset.","Lænker eller kæder, jeg vil have dig til at blive hængende.",Fesseln oder Ketten - ich will dich hier herumhängen sehen.,,"Ĉu vi volas katenojn aŭ ŝeklojn? Mi volas, ke vi ĝuu vian restadon.",¿Grilletes o cadenas? Quiero que disfrutes de tu estancia.,,"Olipa sitten kahleissa tai ketjuissa, haluan sinun jäävän pysyäksesi.",Chaînes ou menottes? J'ai vraiment envie de vous retenir!,,"Mindegy hogy béklyó vagy lánc, csak lógj itt szépen.","Ferri o catene, potrai starci benissimo qua!",鎖や手錠で、繋いだ方が良いな。,"동아줄, 아님 쇠사슬... 네 목에 잘 어울리겠네. 으하하하!","Sluitingen of kettingen, ik wil dat je blijft hangen.","Lenker eller lenker, jeg vil at du skal bli her.",Kajdany czy łańcuchy? Chcę byś na chwilę tu został.,Algemas ou correntes? Quero que você fique aqui por um tempo.,,"Cătușe sau lanțuri, vreau să rămăi pe-aici.","Кандалы или цепи? Я хочу, чтобы ты подольше тут задержался.",,"Fängsel eller kedjor, jag vill att du stannar kvar.","Kelepçe ya da zincir, buralarda olmanı istiyorum." +"I don't know how you managed to get past the guards and the Warden, but I hope you like the decor, because you just moved in.",TXT_DLG_SCRIPT05_D10612_IDONT,MAP05: Wolenick.,,,"Nemám tušení, jak se ti podařilo dostat se přes stráže a dozorce, ale doufám že se ti líbí naše výzdoba, protože jsi se právě nastěhoval.","Jeg ved ikke, hvordan det lykkedes dig at komme forbi vagterne og direktøren, men jeg håber, du kan lide indretningen, for du er lige flyttet ind.","Ich habe keine Ahnung, wie du an den Wachen und dem Direktor vorbeigekommen bist, aber ich hoffe du magst das Dekor, denn du bist gerade eingezogen.",,"Mi ne komprenas, kiel vi superis la gardistojn kaj la provoson, sed mi esperas, ke vi ŝatas la dekoracion, ĉar vi ĵus transloĝiĝis.","No sé cómo habrás pasado por los guardias y el carcelero, pero espero que te guste la decoración, porque te acabas de mudar aquí.",,"En tiedä, miten onnistuit pääsemään vartijoiden ja vankilanjohtajan läpi, mutta toivon, että pidät sisustuksesta; olethan sentään tänne juuri muuttanut.","Je ne sais pas comment vous êtes passé à travers les gardes et le gardien, mais j'espère que vous aimez le décor car ceci sera votre nouveau domicile.",,"Nem tudom, hogyan jutottál át az őrökön és az igazgatón, de remélem szimpatikus a hely, mert még sokáig leszel itt.","Non so come tu abbia fatto a superare il direttore o le guardie, ma spero che tu apprezzi l'ambiente, perché adesso questa sarà anche la tua prigione.","どうやってガードやセキュリティを 抜けてきたかは知らんが、私の部署に移れば、 この素晴らしい装飾を堪能できるぞ。","그 많은 경비와 간수장을 어떻게 해서 격파한 건지는 모르겠다만, 빠른 재판을 추천하겠네. 왜냐하면 자네는 헛수고했으니까.","Ik weet niet hoe je langs de bewakers en de directeur bent gekomen, maar ik hoop dat je het decor leuk vindt, want je bent er net ingetrokken.","Jeg vet ikke hvordan du kom deg forbi vaktene og direktøren, men jeg håper du liker innredningen, for du har nettopp flyttet inn.","Nie wiem jak ominąłeś strażników i Naczelnika, ale mam nadzieję, że podoba ci się wystrój, bo właśnie tu zostaniesz.","Eu não sei como você conseguiu passar pelos guardas e pelo Carcereiro, mas espero que goste da decoração, porque você acabou de se mudar pra cá.",,"Nu știu cum ai reușit să treci de gardieni și de Director, dar sper că îți place noul decor, pentru că tocmai te-ai mutat aici.","Не знаю, как тебе удалось миновать стражу и Монтага, но, я надеюсь, тебе нравится интерьер? Потому что отсюда ты уже не выйдешь.",,"Jag vet inte hur du lyckades ta dig förbi vakterna och fängelsedirektören, men jag hoppas att du gillar inredningen, för du har just flyttat in.",Muhafızları ve Müdür'ü nasıl atlattın bilmiyorum ama umarım dekoru beğenmişsindir çünkü yeni taşındın. -Free my comrades or die!,TXT_RPLY0_SCRIPT05_D10612_FREEM,〃,,,"Osvoboď mé druhy, nebo zemři!",Befri mine kammerater eller dø!,Befreien Sie meine Kameraden oder sterben Sie!,,Liberigu miajn samideanojn aŭ mortu!,¡Libera a mis camaradas o muere!,¡Libera a mis compañeros o muere!,Vapauta toverini tai kuole!,Libère mes camarades ou meurs!,"Engedd el a társaimat, vagy meghalsz!",Libera i miei compagni o muori!,命が惜しければ仲間を解放しろ!,"내 전우를 풀어주든지, 죽든지!",Bevrijd mijn kameraden of sterf!,Befri kameratene mine eller dø!,Uwolnij moich towarzyszy lub giń!,Liberte meus companheiros ou morra!,,"Eliberează-mi camarazii, sau mori!","Освободи моих товарищей, или ты умрёшь!",,Befria mina kamrater eller dö!,Yoldaşlarımı serbest bırak ya da öl! -Kill me and you'll never set anyone free. I possess the only pattern key that will unlock the cells.,TXT_DLG_SCRIPT05_D12128_KILLM,〃,,,"Zab mě a neosvobodíš nikoho. Jenom já mám vzor, který otevře cely.","Dræb mig, og du vil aldrig sætte nogen fri. Jeg besidder den eneste mønsternøgle, der kan låse cellerne op.","Töte mich und du befreist niemanden. Ich bin der einzige, der autorisiert ist, die Gefangenen freizulassen.",,"Vi liberigos neniun se vi mortigos min: mi havas la ununuran manspuron, kiu ebligas malŝlosi la ĉelojn.",Mátame y no liberarás a nadie: poseo la única huella digital que abre las celdas.,Mátame y no vas a liberar a nadie: poseo la única huella digital que abre las celdas.,Tappamalla minut et vapauta ketään. Vain minun käsissäni ovat avaimet sellien avaamiseen.,Tuez moi et personne ne sera libéré. Je suis le seul qui possède la clé qui peut ouvrir les cellules.,"Ha megölsz, akkor senkit sem fogsz tudni kiszabadítani. Az egyetlen biztonsági kulcs az Én tulajdonomban van.",Uccidi e non libererai proprio nessuno. Posseggo l'unica chiave d'identificazione che può aprire le celle.,"私を殺せば誰も助かる事はない。 +Free my comrades or die!,TXT_RPLY0_SCRIPT05_D10612_FREEM,〃,,,"Osvoboď mé druhy, nebo zemři!",Befri mine kammerater eller dø!,Befreien Sie meine Kameraden oder sterben Sie!,,Liberigu miajn samideanojn aŭ mortu!,¡Libera a mis camaradas o muere!,¡Libera a mis compañeros o muere!,Vapauta toverini tai kuole!,Libère mes camarades ou meurs!,,"Engedd el a társaimat, vagy meghalsz!",Libera i miei compagni o muori!,命が惜しければ仲間を解放しろ!,"내 전우를 풀어주든지, 죽든지!",Bevrijd mijn kameraden of sterf!,Befri kameratene mine eller dø!,Uwolnij moich towarzyszy lub giń!,Liberte meus companheiros ou morra!,,"Eliberează-mi camarazii, sau mori!","Освободи моих товарищей, или ты умрёшь!",,Befria mina kamrater eller dö!,Yoldaşlarımı serbest bırak ya da öl! +Kill me and you'll never set anyone free. I possess the only pattern key that will unlock the cells.,TXT_DLG_SCRIPT05_D12128_KILLM,〃,,,"Zab mě a neosvobodíš nikoho. Jenom já mám vzor, který otevře cely.","Dræb mig, og du vil aldrig sætte nogen fri. Jeg besidder den eneste mønsternøgle, der kan låse cellerne op.","Töte mich und du befreist niemanden. Ich bin der einzige, der autorisiert ist, die Gefangenen freizulassen.",,"Vi liberigos neniun se vi mortigos min: mi havas la ununuran manspuron, kiu ebligas malŝlosi la ĉelojn.",Mátame y no liberarás a nadie: poseo la única huella digital que abre las celdas.,Mátame y no vas a liberar a nadie: poseo la única huella digital que abre las celdas.,Tappamalla minut et vapauta ketään. Vain minun käsissäni ovat avaimet sellien avaamiseen.,Tuez moi et personne ne sera libéré. Je suis le seul qui possède la clé qui peut ouvrir les cellules.,,"Ha megölsz, akkor senkit sem fogsz tudni kiszabadítani. Az egyetlen biztonsági kulcs az Én tulajdonomban van.",Uccidi e non libererai proprio nessuno. Posseggo l'unica chiave d'identificazione che può aprire le celle.,"私を殺せば誰も助かる事はない。 私の指紋だけが檻を開けられるからな。",날 죽이면 일이 더 최악으로 변질될 것일세. 나에게 감옥 문을 열 수 있는 유일한 지문이 있으니 말이지.,Dood me en je zult nooit iemand vrijlaten. Ik bezit de enige patroonsleutel die de cellen zal ontsluiten.,"Dreper du meg, får du aldri satt noen fri. Jeg har den eneste mønsternøkkelen som låser opp cellene.","Zabij mnie, a już nigdy nikogo nie uwolnisz. Tylko ja mam klucz do ich cel.",Mate-me e você nunca libertará ninguém. Eu possuo a única chave que destranca as celas.,,Omoară-mă și nu vei elibera pe nimeni în veci. Eu posed singura cheie care poate deschide celulele.,"Убив меня, ты никого не освободишь. Только у меня есть ключ, которым можно открыть камеры.",,Om du dödar mig kommer du aldrig att befria någon. Jag besitter den enda mönsternyckeln som kan låsa upp cellerna.,Beni öldürürsen kimseyi özgür bırakamazsın. Hücrelerin kilidini açacak tek desen anahtarı bende. -Can you lend me a hand then?,TXT_RPLY0_SCRIPT05_D12128_CANYO,〃,,,Mohl bys mi tedy půjčit ruku?,Kan du så give mig en hånd med?,Können Sie mir Ihre Hand leihen?,,Tiuokaze mi «enmanigos» ilin al vi.,"¿Me echas una mano, entonces?","¿Me das una mano, entonces?",Voisitko sitten ojentaa auttavaa kättäsi?,"Tu peux me prêter main forte, alors?",Tudsz nekem segíteni?,"Che ne dici di darmi una mano, allora?",じゃあ 手を貸して くれるか?,그럼 네 손길이 좀 필요할 것 같아...,Kun je me dan een handje helpen?,"Kan du hjelpe meg, da?",Więc może podasz mi pomocną dłoń?,Pode me dar uma mão então?,,Poți da o mână de ajutor atunci?,"Может быть, ты протянешь мне руку помощи?",,Kan du ge mig en hand med det då?,O zaman bana yardım edebilir misin? -Move along or join your friends.,TXT_DLG_SCRIPT05_D13644_MOVEA,〃,,,"Jdi, nebo se přidej ke svým kamarádům.",Gå videre eller slut dig til dine venner.,Hau ab oder zieh bei deinen Freunden ein.,,Foriru aŭ alliĝu al viaj amikoj.,Vete o únete a tus amigos.,,"Jatka eteenpäin, tai liity ystäviesi joukkoon.",Bougez ou rejoignez vos amis.,"Mozogj tovább, vagy csatlakozz a barátaidhoz.","Togliti dai piedi, o ti unirai ai tuoi amici.",共に行こう友よ。,"무죄, 아니면 사형 선고. 정하시게.",Ga mee of sluit je aan bij je vrienden.,Gå videre eller bli med vennene dine.,Idź stąd lub dołączysz do swoich przyjaciół.,Suma daqui ou junte-se aos seus amigos.,,Cară-te sau te vei alătura prietenilor tăi.,"Не подходи ко мне, или присоединишься к своим друзьям.",,Gå vidare eller gå till dina vänner.,İlerleyin ya da arkadaşlarınıza katılın. -"Don't just stand there, get us out of here!",TXT_DLG_SCRIPT05_D15160_DONTJ,MAP05: Prisoner.,,,"Nestůj tam tak, dostaň nás odsud!","Stå ikke bare der, få os ud herfra!","Steh da nicht so rum, hol uns raus!",,"Ne staru tie, liberigu nin!","No te quedes ahí, ¡sácanos de aquí!",,Älä vain siinä seisoskele; päästä meidät ulos täältä!,"Ne vous tenez pas là, sortez nous d'ici!","Ne csak bámészkodj, szabadíts ki minket!","Non stare lì fermo, facci uscire da qui!",もう待てない、早くここを出よう!,"거기 서 있지 말고, 어서 우릴 내보내 줘!","Blijf daar niet staan, haal ons hier weg!","Ikke bare stå der, få oss ut herfra!","Nie stój tak, uwolnij nas stąd!",Não fique parado aí. Nos tire daqui!,,"Nu sta acolo, scoate-ne de aici!",Не стой просто так. Вытащи нас отсюда!,,"Stå inte bara där, ta oss härifrån!","Orada öylece durmayın, bizi buradan çıkarın!" -"The sky, I want to see the sky.",TXT_DLG_SCRIPT05_D16676_THESK,〃,,,"Nebe, chci vidět nebe.","Himlen, jeg vil se himlen.","Der Himmel, ich möchte den Himmel sehen.",,"La ĉielon, mi volas vidi la ĉielon.","El cielo, quiero ver el cielo.",,"Taivas, haluan nähdä taivaan.","Le ciel, je veux voir le ciel!","Az eget, szeretném újra látni az eget.","Il cielo, voglio vedere il cielo.",空を、空を見たい。,"하늘, 하늘을 보고 싶어.","De lucht, ik wil de lucht zien.","Himmelen, jeg vil se himmelen.",Niebo... tak bardzo chcę zobaczyć niebo.,O céu. Eu quero ver o céu.,,"Cerul, vreau să văd cerul!",Небо. Я хочу увидеть небо.,,"Himlen, jag vill se himlen.","Gökyüzü, gökyüzünü görmek istiyorum." +Can you lend me a hand then?,TXT_RPLY0_SCRIPT05_D12128_CANYO,〃,,,Mohl bys mi tedy půjčit ruku?,Kan du så give mig en hånd med?,Können Sie mir Ihre Hand leihen?,,Tiuokaze mi «enmanigos» ilin al vi.,"¿Me echas una mano, entonces?","¿Me das una mano, entonces?",Voisitko sitten ojentaa auttavaa kättäsi?,"Tu peux me prêter main forte, alors?",,Tudsz nekem segíteni?,"Che ne dici di darmi una mano, allora?",じゃあ 手を貸して くれるか?,그럼 네 손길이 좀 필요할 것 같아...,Kun je me dan een handje helpen?,"Kan du hjelpe meg, da?",Więc może podasz mi pomocną dłoń?,Pode me dar uma mão então?,,Poți da o mână de ajutor atunci?,"Может быть, ты протянешь мне руку помощи?",,Kan du ge mig en hand med det då?,O zaman bana yardım edebilir misin? +Move along or join your friends.,TXT_DLG_SCRIPT05_D13644_MOVEA,〃,,,"Jdi, nebo se přidej ke svým kamarádům.",Gå videre eller slut dig til dine venner.,Hau ab oder zieh bei deinen Freunden ein.,,Foriru aŭ alliĝu al viaj amikoj.,Vete o únete a tus amigos.,,"Jatka eteenpäin, tai liity ystäviesi joukkoon.",Bougez ou rejoignez vos amis.,,"Mozogj tovább, vagy csatlakozz a barátaidhoz.","Togliti dai piedi, o ti unirai ai tuoi amici.",共に行こう友よ。,"무죄, 아니면 사형 선고. 정하시게.",Ga mee of sluit je aan bij je vrienden.,Gå videre eller bli med vennene dine.,Idź stąd lub dołączysz do swoich przyjaciół.,Suma daqui ou junte-se aos seus amigos.,,Cară-te sau te vei alătura prietenilor tăi.,"Не подходи ко мне, или присоединишься к своим друзьям.",,Gå vidare eller gå till dina vänner.,İlerleyin ya da arkadaşlarınıza katılın. +"Don't just stand there, get us out of here!",TXT_DLG_SCRIPT05_D15160_DONTJ,MAP05: Prisoner.,,,"Nestůj tam tak, dostaň nás odsud!","Stå ikke bare der, få os ud herfra!","Steh da nicht so rum, hol uns raus!",,"Ne staru tie, liberigu nin!","No te quedes ahí, ¡sácanos de aquí!",,Älä vain siinä seisoskele; päästä meidät ulos täältä!,"Ne vous tenez pas là, sortez nous d'ici!",,"Ne csak bámészkodj, szabadíts ki minket!","Non stare lì fermo, facci uscire da qui!",もう待てない、早くここを出よう!,"거기 서 있지 말고, 어서 우릴 내보내 줘!","Blijf daar niet staan, haal ons hier weg!","Ikke bare stå der, få oss ut herfra!","Nie stój tak, uwolnij nas stąd!",Não fique parado aí. Nos tire daqui!,,"Nu sta acolo, scoate-ne de aici!",Не стой просто так. Вытащи нас отсюда!,,"Stå inte bara där, ta oss härifrån!","Orada öylece durmayın, bizi buradan çıkarın!" +"The sky, I want to see the sky.",TXT_DLG_SCRIPT05_D16676_THESK,〃,,,"Nebe, chci vidět nebe.","Himlen, jeg vil se himlen.","Der Himmel, ich möchte den Himmel sehen.",,"La ĉielon, mi volas vidi la ĉielon.","El cielo, quiero ver el cielo.",,"Taivas, haluan nähdä taivaan.","Le ciel, je veux voir le ciel!",,"Az eget, szeretném újra látni az eget.","Il cielo, voglio vedere il cielo.",空を、空を見たい。,"하늘, 하늘을 보고 싶어.","De lucht, ik wil de lucht zien.","Himmelen, jeg vil se himmelen.",Niebo... tak bardzo chcę zobaczyć niebo.,O céu. Eu quero ver o céu.,,"Cerul, vreau să văd cerul!",Небо. Я хочу увидеть небо.,,"Himlen, jag vill se himlen.","Gökyüzü, gökyüzünü görmek istiyorum." "Five feet by four feet, five feet by four feet, five feet by four feet.",TXT_DLG_SCRIPT05_D18192_FIVEF,〃,,,"Pět kroků, čtyři kroky, pět kroků, čtyři kroky, pět kroků, čtyři kroky.","Fem fod gange fire fod, fem fod gange fire fod, fem fod gange fire fod...","Fünf Fuß mal vier Fuß, fünf Fuß mal vier Fuß, fünf Fuß mal vier Fuß...",,"1,2 oble 1,5 metroj. 1,2 oble 1,5 metroj. 1,2 oble 1,5 metroj...","Un metro y medio por un metro veinte. Un metro y medio por un metro veinte. -Un metro y medio por un metro veinte...",,"Viisi kertaa neljä jalkaa, viisi kertaa neljä jalkaa, viisi kertaa neljä jalkaa.",Un mètre cinquante par un mètre trente. Un mètre cinquante par un mètre trente. Un mètre cinquante par un mètre trente.,"Öt lábszor négy láb, öt lábszor négy láb, öt lábszor négy láb.",Un metro e cinquanta per un metro e trenta. Un metro e cinquanta per un metro e trenta. Un metro e cinquanta per un metro e trenta.,"ファイブフィート バイ フォーフィート、 +Un metro y medio por un metro veinte...",,"Viisi kertaa neljä jalkaa, viisi kertaa neljä jalkaa, viisi kertaa neljä jalkaa.",Un mètre cinquante par un mètre trente. Un mètre cinquante par un mètre trente. Un mètre cinquante par un mètre trente.,,"Öt lábszor négy láb, öt lábszor négy láb, öt lábszor négy láb.",Un metro e cinquanta per un metro e trenta. Un metro e cinquanta per un metro e trenta. Un metro e cinquanta per un metro e trenta.,"ファイブフィート バイ フォーフィート、 ファイブフィート バイ フォーフィート、 ファイブフィート バイ フォーフィート。",나가려면 나갈 생각을 하고 나갈 준비를 해야 되는데 나갈 수가 없어 왜냐하면 나가는 걸 막는 놈들이...,"Vijf voet bij vier voet, vijf voet bij vier voet, vijf voet bij vier voet, vijf voet bij vier voet.","Fem fot ganger fire fot, fem fot ganger fire fot, fem fot ganger fire fot!","Pięć stóp na cztery, pięć stóp na cztery, pięć stóp na cztery.",Um metro e meio por um metro e vinte. Um metro e meio por um metro e vinte. Um metro e meio por um metro e vinte. ,,"Din 5 pași 4, din 5 pași 4, din 5 pași 4.","Пять футов на четыре, пять футов на четыре, пять футов на четыре.",,"Fem fot på fyra fot, fem fot på fyra fot, fem fot på fyra fot, fem fot på fyra fot.","Bir metreye bir metre, bir metreye bir metre, bir metreye bir metre." -Don't release me if the Order's still in charge. I can't stand the terror.,TXT_DLG_SCRIPT05_D19708_DONTR,〃,,,"Nevysvobozuj mě, jestli ještě vládne Řád. Tu hrůzu nemůžu snést.","Slip mig ikke fri, hvis Ordenen stadig har kommandoen. Jeg kan ikke klare terroren.","Bitte befreie mich nicht, wenn der Orden hier noch herrscht, ich halte den Horror nicht aus.",,Ne liberigu min se La Ordeno ankoraŭ regas: mi ne eltenas la teruron.,No me sueltes si La Orden sigue al mando: no soporto el terror.,,"Älä vapauta minua, jos Veljeskunta on vielä vallassa. En kestä enää sitä hirveyttä.",Laissez moi ici si l'Ordre est toujours au pouvoir. Je ne veux pas voir cette horreur.,Ne engedj ki míg a Rend hatalmon van. Nem bírom ezt az elnyomást.,Non liberarmi se l'Ordine è ancora al potere. Non voglio vedere questo orrore.,"まだオーダーがいる内は出たくない。 +Don't release me if the Order's still in charge. I can't stand the terror.,TXT_DLG_SCRIPT05_D19708_DONTR,〃,,,"Nevysvobozuj mě, jestli ještě vládne Řád. Tu hrůzu nemůžu snést.","Slip mig ikke fri, hvis Ordenen stadig har kommandoen. Jeg kan ikke klare terroren.","Bitte befreie mich nicht, wenn der Orden hier noch herrscht, ich halte den Horror nicht aus.",,Ne liberigu min se La Ordeno ankoraŭ regas: mi ne eltenas la teruron.,No me sueltes si La Orden sigue al mando: no soporto el terror.,,"Älä vapauta minua, jos Veljeskunta on vielä vallassa. En kestä enää sitä hirveyttä.",Laissez moi ici si l'Ordre est toujours au pouvoir. Je ne veux pas voir cette horreur.,,Ne engedj ki míg a Rend hatalmon van. Nem bírom ezt az elnyomást.,Non liberarmi se l'Ordine è ancora al potere. Non voglio vedere questo orrore.,"まだオーダーがいる内は出たくない。 恐怖に打ち拉がれそうだ。",오더 놈들이 아직도 설치고 있다면 절 내보내지 마세요. 죽을까 봐 두려워요...,Laat me niet los als de Orde nog steeds de leiding heeft. Ik kan niet tegen de terreur.,Ikke slipp meg ut hvis Ordenen fortsatt har kommandoen. Jeg holder ikke ut terroren.,Nie uwalniaj mnie jeśli Zakon jest wciąż u władzy. Nie mogę znieść tego terroru.,Não me solte se a Ordem ainda estiver no comando. Eu não suporto o horror.,,Nu mă elibera dacă Ordinul incă e tot la putere.,"Не освобождай меня, если Орден всё ещё у власти. Я не вынесу устрашения.",,Släpp inte ut mig om Orden fortfarande har befälet. Jag står inte ut med skräcken.,Tarikat hâlâ yetkiliyse beni bırakmayın. Dehşete dayanamıyorum. -"I don't want to bitch, but it's about time Macil sent someone to get us out.",TXT_DLG_SCRIPT05_D21224_IDONT,〃,,,"Nechci nadávat, ale už bylo na čase, aby Macil někoho poslal nás vysvobodit.","Jeg vil ikke brokke mig, men det er på tide, at Macil sender nogen ud for at få os ud.","Ich möchte ja nicht meckern, aber es wurde auch Zeit, dass Macil jemanden schickt, der uns hier rausholt",,"Mi ne intencas plendi, sed Macil finfine venigis iun por liberigi nin.","No es por quejarme, pero ya era hora de que Macil enviara alguien a sacarnos.",,"En halua ruikuttaa, mutta jo oli aikakin, että Macil lähetti jonkun päästämään meidät pois.","J'ai pas envie de me plaindre, mais Macil a vraiment pris son temps pour envoyer quelqu'un nous sortir d'ici!","Nem akarnék picsogni, de már ideje volt hogy Macil küldött értünk valakit.","Non è che voglio lamentarmi, però era ora che Macil mandasse qualcuno a liberarci.","意地が悪いな、だがマシルが解放の為に +"I don't want to bitch, but it's about time Macil sent someone to get us out.",TXT_DLG_SCRIPT05_D21224_IDONT,〃,,,"Nechci nadávat, ale už bylo na čase, aby Macil někoho poslal nás vysvobodit.","Jeg vil ikke brokke mig, men det er på tide, at Macil sender nogen ud for at få os ud.","Ich möchte ja nicht meckern, aber es wurde auch Zeit, dass Macil jemanden schickt, der uns hier rausholt",,"Mi ne intencas plendi, sed Macil finfine venigis iun por liberigi nin.","No es por quejarme, pero ya era hora de que Macil enviara alguien a sacarnos.",,"En halua ruikuttaa, mutta jo oli aikakin, että Macil lähetti jonkun päästämään meidät pois.","J'ai pas envie de me plaindre, mais Macil a vraiment pris son temps pour envoyer quelqu'un nous sortir d'ici!",,"Nem akarnék picsogni, de már ideje volt hogy Macil küldött értünk valakit.","Non è che voglio lamentarmi, però era ora che Macil mandasse qualcuno a liberarci.","意地が悪いな、だがマシルが解放の為に 誰か送ったのは大体わかる。","투정부리기는 싫지만, 드디어 사령관님이 구출작전을 실시한 것 같군요.","Ik wil niet zeuren, maar het wordt tijd dat Macil iemand stuurt om ons eruit te krijgen.","Jeg vil ikke klage, men det er på tide at Macil sender noen for å få oss ut.","Nie chcę psioczyć, ale najwyższa pora, aby Macil wysłał kogoś, by nas uwolnić.","Não quero encher o saco, mas já era hora do Macil enviar alguém para nos tirar daqui.",,"Nu vreau să mă smiorcăi, dar era și timpul ca Macil să trimită pe cineva să ne scoată afară.","Не хочу ныть, но Мэйсил мог бы и пораньше послать кого-нибудь освободить нас.",,"Jag vill inte vara taskig, men det är på tiden att Macil skickar någon för att få ut oss.",Şikâyet etmek istemiyorum ama Macil'in bizi çıkarması için birini göndermesinin zamanı gelmişti. -I'd give anything for just a crust of bread. I'm so hungry.,TXT_DLG_SCRIPT05_D22740_IDGIV,〃,,,Dal bych cokoliv jen za kůrku chleba. Mám takový hlad.,Jeg ville give alt for bare en brødskorpe. Jeg er så sulten.,Ich gäbe alles für eine Brotkruste. Ich habe so einen Hunger.,,Mi interŝanĝus ion ajn kontraŭ panero. Mi malsategas.,Daría lo que fuera por una migaja de pan. Tengo tanta hambre.,Daría lo que fuera por una miga de pan. Tengo tanta hambre.,Antaisin mitä vain yhdestäkin leivän murenesta. Minulla on niin nälkä.,Je donnerai n'importe quoi pour une bouchée de pain. J'ai tellement faim!,"Bármit megadnék egy falat kenyérért, annyira nagyon éhes vagyok.",Darei qualsiasi cosa per una crosta di pane. Ho una grande fame.,"いつもパンの耳ばかりだったんだ。 +I'd give anything for just a crust of bread. I'm so hungry.,TXT_DLG_SCRIPT05_D22740_IDGIV,〃,,,Dal bych cokoliv jen za kůrku chleba. Mám takový hlad.,Jeg ville give alt for bare en brødskorpe. Jeg er så sulten.,Ich gäbe alles für eine Brotkruste. Ich habe so einen Hunger.,,Mi interŝanĝus ion ajn kontraŭ panero. Mi malsategas.,Daría lo que fuera por una migaja de pan. Tengo tanta hambre.,Daría lo que fuera por una miga de pan. Tengo tanta hambre.,Antaisin mitä vain yhdestäkin leivän murenesta. Minulla on niin nälkä.,Je donnerai n'importe quoi pour une bouchée de pain. J'ai tellement faim!,,"Bármit megadnék egy falat kenyérért, annyira nagyon éhes vagyok.",Darei qualsiasi cosa per una crosta di pane. Ho una grande fame.,"いつもパンの耳ばかりだったんだ。 すごく腹減った。",빵 한 조각이라도 먹고 싶습니다... 너무 배고파요...,Ik zou alles geven voor een korstje brood. Ik heb zo'n honger.,Jeg ville gitt hva som helst for en brødskive. Jeg er så sulten.,Oddałbym wszystko za kromkę chleba. Jestem taki głodny.,Eu daria qualquer coisa por uma migalha de pão. Estou tão faminto.,,Aș da orice pentru o coajă de pâine. Sunt așa flămând.,Я бы всё отдал просто за ломоть хлеба. Я так голоден.,,Jag skulle ge vad som helst för bara en skorpa bröd. Jag är så hungrig.,Bir lokma ekmek için her şeyimi verirdim. Çok acıktım. -"Ah, a surfacer in need of a favor. Down here you do a favor to get a favor and I need the town entrance that is our path to food opened. The Order has it sealed and guarded.",TXT_DLG_SCRIPT06_D0_AHASU,MAP06: Weran.,,"Ah, a surfacer in need of a favour. Down here you do a favour to get a favour and I need the town entrance that is our path to food opened. The Order has it sealed and guarded.","Á, nadzemník, který potřebuje službu. Tady dole prokazuješ službu, abys dostal službu, a já potřebuju otevřít vchod do města, abychom měli cestu k jídlu. Řád ji nechal zapečetit a hlídat.","Ah, en overfladebeboer, der har brug for en tjeneste. Her nede gør man en tjeneste for at få en tjeneste, og jeg har brug for at få åbnet byens indgang, som er vores vej til mad. Ordenen har den forseglet og bevogtet.","Oh, ein Oberflächler, der Hilfe braucht. Hier unten musst du uns einen Gefallen erweisen, bevor wir dir helfen können. Der Ausgang zur Stadt, der unser Zugang zu Nahrung ist, muss wieder freigemacht werden. Der Orden hat ihn verschlossen und lässt ihn bewachen.",,"Ha, surfaco-loĝanto bezonas komplezon. Ĉi-malsupre oni faras servon por gajni reservon, kaj mi bezonas remalfermi la enirejon al la urbo, kiu estas nia fonto de manĝaĵoj: La Ordeno ĝin ŝlosis kaj gardas.","Ah, alguien de la superficie que necesita un favor. Aquí abajo se ofrece un favor a cambio de otro, y necesito abierta la entrada al pueblo que es nuestro camino a la comida: La Orden la tiene cerrada y con vigilancia.",,"Jaahas, maanpintalainen palveluksen tarpeessa. Täällä alhaalla on tapana tehdä palvelus palveluksesta, ja minä haluan, että kaupungin sisäänkäynti, tiemme ruuan pariin, avataan. Se on salvattu ja vartioitu Veljeskunnan toimesta.","Ah, quelqu'un de la surface qui a besoin d'une faveur. Ici, on en fait une pour en avoir une, et j'ai besoin que l'entrée de la ville qui est notre chemin pour les vivres ouverte. L'Ordre l'a scellée et mise sous garde.","Nahát, egy felszínlakó aki szívességet kér. Itt az a szokás, hogy egy szívességért cserébe szívesség dukál. Ahhoz, hogy elérhetővé válljon mindenki számára a élelem, kell egy biztonságos belépő a városba. A Rend nagy biztonságban őrzi.","Ah, un abitante della superficie che ha bisogno di un favore. Quaggiù tu fai un favore per ottenere un favore, e io ho bisogno che l'ingresso alla città venga aperto visto che è il nostro accesso al cibo. L'Ordine l'ha chiuso e lo sorveglia.","あー、何か用があって上から来たんだな。 +"Ah, a surfacer in need of a favor. Down here you do a favor to get a favor and I need the town entrance that is our path to food opened. The Order has it sealed and guarded.",TXT_DLG_SCRIPT06_D0_AHASU,MAP06: Weran.,,"Ah, a surfacer in need of a favour. Down here you do a favour to get a favour and I need the town entrance that is our path to food opened. The Order has it sealed and guarded.","Á, nadzemník, který potřebuje službu. Tady dole prokazuješ službu, abys dostal službu, a já potřebuju otevřít vchod do města, abychom měli cestu k jídlu. Řád ji nechal zapečetit a hlídat.","Ah, en overfladebeboer, der har brug for en tjeneste. Her nede gør man en tjeneste for at få en tjeneste, og jeg har brug for at få åbnet byens indgang, som er vores vej til mad. Ordenen har den forseglet og bevogtet.","Oh, ein Oberflächler, der Hilfe braucht. Hier unten musst du uns einen Gefallen erweisen, bevor wir dir helfen können. Der Ausgang zur Stadt, der unser Zugang zu Nahrung ist, muss wieder freigemacht werden. Der Orden hat ihn verschlossen und lässt ihn bewachen.",,"Ha, surfaco-loĝanto bezonas komplezon. Ĉi-malsupre oni faras servon por gajni reservon, kaj mi bezonas remalfermi la enirejon al la urbo, kiu estas nia fonto de manĝaĵoj: La Ordeno ĝin ŝlosis kaj gardas.","Ah, alguien de la superficie que necesita un favor. Aquí abajo se ofrece un favor a cambio de otro, y necesito abierta la entrada al pueblo que es nuestro camino a la comida: La Orden la tiene cerrada y con vigilancia.",,"Jaahas, maanpintalainen palveluksen tarpeessa. Täällä alhaalla on tapana tehdä palvelus palveluksesta, ja minä haluan, että kaupungin sisäänkäynti, tiemme ruuan pariin, avataan. Se on salvattu ja vartioitu Veljeskunnan toimesta.","Ah, quelqu'un de la surface qui a besoin d'une faveur. Ici, on en fait une pour en avoir une, et j'ai besoin que l'entrée de la ville qui est notre chemin pour les vivres ouverte. L'Ordre l'a scellée et mise sous garde.",,"Nahát, egy felszínlakó aki szívességet kér. Itt az a szokás, hogy egy szívességért cserébe szívesség dukál. Ahhoz, hogy elérhetővé válljon mindenki számára a élelem, kell egy biztonságos belépő a városba. A Rend nagy biztonságban őrzi.","Ah, un abitante della superficie che ha bisogno di un favore. Quaggiù tu fai un favore per ottenere un favore, e io ho bisogno che l'ingresso alla città venga aperto visto che è il nostro accesso al cibo. L'Ordine l'ha chiuso e lo sorveglia.","あー、何か用があって上から来たんだな。 だがここでは物々交換が常識だ、 オーダーが町の出口を封鎖しやがったから メシが手に入り辛くなったんだ。","아아... 도움이 필요한 지상인이구려. 도움을 받고 싶으면, 우리에게 도움이 되어야 할 것이야. 식량을 구할 수 있는 마을로 향하는 입구가 오더에 의해 막혔거단.","Ah, een verharder die een gunst nodig heeft. Hier beneden doe je een gunst om een gunst te krijgen en ik heb de stadstoegang nodig die onze weg naar eten is geopend. De Orde heeft het verzegeld en bewaakt.","Ah, en overflateboer som trenger en tjeneste. Her nede gjør man en tjeneste for å få en tjeneste, og jeg må få åpnet inngangen til byen som er vår vei til mat. Ordenen har den forseglet og bevoktet.","Ah, powierzchniowiec potrzebujący pomocy. Tutaj na dole robi się to tak: przysługa za przysługę, a ja potrzebuję otworzyć wyjście do miasta, które jest naszą jedyną drogą by zdobyć jedzenie. Zakon je zablokował i pilnie go strzeże.","Ah, um cara da superfície precisando de um favor. Aqui embaixo você faz um favor para conseguir um favor e eu preciso da entrada da cidade aberta para pegar a nossa comida. A Ordem mantém ela fechada e guardada.",,"Ah, un locuitor de la suprafață care are nevoie de o favoare. Aici jos faci o favoare, primești o favoare, iar eu am nevoie de o cale pentru a ajunge la intrarea din oraș, să putem avea acces la provizii. Ordinul a închis-o și acum e bine păzită.","А-а, гостю с поверхности нужно одолжение. Здесь, внизу, ты должен что-то сделать, прежде чем о чём-то попросить, и мне нужно, чтобы дверь в город, наш путь к пище, была открыта. Орден закрыл её и поставил охрану.",,"Ah, en ytmänniska i behov av en tjänst. Här nere gör man en tjänst för att få en tjänst och jag behöver öppna stadens ingång som är vår väg till mat. Orden har förseglat och bevakat den.",İyiliğe ihtiyacı olan bir yüzey araştırmacısı. Burada bir iyilik için bir iyilik yaparsın ve ben de yiyecek yolumuz olan kasaba girişinin açılmasını istiyorum. Tarikat orayı mühürledi ve koruyor. -Where is the gate mechanism?,TXT_RPLY0_SCRIPT06_D0_WHERE,〃,,,Kde je mechanismus brány?,Hvor er portmekanismen?,Wo ist der Tormechanismus?,,Kie estas la mekanismo de la pordo de la kastelo?,¿Dónde está el mecanismo de la puerta?,,Missä on portin koneisto?,Où se trouve le mécanisme d'ouverture de la porte?,Hol van a kapu szerkezet?,Dov'è il meccanismo per il cancello?,ゲートメカニズムは何処だ?,성문 관리 장치는 어딨지?,Waar is het poortmechanisme?,Hvor er portmekanismen?,Gdzie jest mechanizm sterujący bramą?,Onde fica o mecanismo do portão?,,Unde e mecanismul de acționare al porții?,Где механизм управления воротами?,,Var är grindmekanismen?,Kapı mekanizması nerede? -"Do my favor first, or you'll get squat from me.",TXT_DLG_SCRIPT06_D1516_DOMYF,〃,,"Do my favour first, or you'll get squat from me.","Prokaž mi službu, nebo ode mne nedostaneš nic.","Gør mig en tjeneste først, ellers får du ikke en skid af mig.",Tu erst mir einen Gefallen oder ich sage gar nichts.,,Vi unue faru mian komplezon se vi volas ricevi ion de mi.,Cumple mi favor primero o no tendrás nada de mí.,Cumple mi favor primero o no vas a tener nada de mí.,"Tee minun palveluspyyntöni ensin, tai et saa minulta mitään.",Faites moi une faveur ou vous n'aurez rien.,"Jobban jársz ha az én szívességemet teljesíted, mert különben lópikulát se kapsz.","Fai il mio favore prima, o da me non otterrai nulla.",俺の言った問題が先だ、でないと手助けできねえ。,"나를 도와주려, 아니면 너를 도륙할 거랴! +Where is the gate mechanism?,TXT_RPLY0_SCRIPT06_D0_WHERE,〃,,,Kde je mechanismus brány?,Hvor er portmekanismen?,Wo ist der Tormechanismus?,,Kie estas la mekanismo de la pordo de la kastelo?,¿Dónde está el mecanismo de la puerta?,,Missä on portin koneisto?,Où se trouve le mécanisme d'ouverture de la porte?,,Hol van a kapu szerkezet?,Dov'è il meccanismo per il cancello?,ゲートメカニズムは何処だ?,성문 관리 장치는 어딨지?,Waar is het poortmechanisme?,Hvor er portmekanismen?,Gdzie jest mechanizm sterujący bramą?,Onde fica o mecanismo do portão?,,Unde e mecanismul de acționare al porții?,Где механизм управления воротами?,,Var är grindmekanismen?,Kapı mekanizması nerede? +"Do my favor first, or you'll get squat from me.",TXT_DLG_SCRIPT06_D1516_DOMYF,〃,,"Do my favour first, or you'll get squat from me.","Prokaž mi službu, nebo ode mne nedostaneš nic.","Gør mig en tjeneste først, ellers får du ikke en skid af mig.",Tu erst mir einen Gefallen oder ich sage gar nichts.,,Vi unue faru mian komplezon se vi volas ricevi ion de mi.,Cumple mi favor primero o no tendrás nada de mí.,Cumple mi favor primero o no vas a tener nada de mí.,"Tee minun palveluspyyntöni ensin, tai et saa minulta mitään.",Faites moi une faveur ou vous n'aurez rien.,,"Jobban jársz ha az én szívességemet teljesíted, mert különben lópikulát se kapsz.","Fai il mio favore prima, o da me non otterrai nulla.",俺の言った問題が先だ、でないと手助けできねえ。,"나를 도와주려, 아니면 너를 도륙할 거랴! \cy다들 참 궁색하게 사네.","Doe me eerst een plezier, of je krijgt een hurkzitje van mij.","Gjør meg en tjeneste først, ellers får du ikke en dritt av meg.",Zrób najpierw to o co cię prosiłem lub figę dostaniesz.,"Faça o meu favor primeiro, ou você não recebe coisa nenhuma de mim.",,"Fă-mi favoarea mai întâi, sau nu-ți zic nimic.","Сначала выполни мою просьбу, или ты ничего не получишь.",,"Gör mig en tjänst först, annars får du inget från mig.","Önce benim iyiliğimi yap, yoksa benden hiçbir şey alamazsın." -How will you know it's open?,TXT_RPLY0_SCRIPT06_D1516_HOWWI,〃,,,"Jak budeš vědět, že je otevřená?","Hvordan vil du vide, at den er åben?","Wodurch wirst du wissen, ob er offen ist?",,Kiel vi scios ĉu mi malfermis ĝin?,¿Cómo sabrás si está abierta?,¿Cómo vas a comprobar si la abrí?,"Mistä tiedät, että se on auki?",Comment est-ce que je saurais qu'elle est ouverte?,"Honnan tudod, hogy nyitva lesz?",Come farai a sapere che è aperto?,開放を知らせるには?,어떻게 도와주면 방법을 알 수 있지?,Hoe weet je dat het open is?,Hvordan vet du at den er åpen?,"Skąd będziesz wiedział, że jest już otwarta?",Como você vai saber que ela está aberta?,,Cum vei știi că e deschisă?,"Как ты узнаешь, что дверь открыта?",,Hur vet du att den är öppen?,Açık olduğunu nereden bileceksin? -Bring me back the guard's uniform. That way one of my ratfellows can wear it and no one will try to shut the door again.,TXT_DLG_SCRIPT06_D3032_BRING,〃,,,"Přines mi uniformu stráže, pak ji jeden z mých krysaříků může nosit a nikdo se už nepokusí ty dveře zavřít.","Giv mig vagtens uniform tilbage. På den måde kan en af mine rottefæller bære den, og ingen vil forsøge at lukke døren igen.","Bring mir die Uniform des Wächters. So kann einer meiner Rattenkumpel sie tragen und niemand wird wieder versuchen, die Tür zu schließen.",,"Alportu la uniformon de la gardisto, tiel unu el miaj «kamaratoj» surhavos ĝin kaj tiam neniu provos reŝlosi la pordon.","Tráeme el uniforme del guardia, así uno de mis «camarratas» podrá ponérselo para que nadie intente cerrarla de nuevo.","Tráeme el uniforme del guardia, así uno de mis «camarratas» va a poder ponérselo para que nadie intente cerrarla de nuevo.","Tuo minulle vartijan univormu. Silloin yksi rottakumppaneistani voi pitää sitä yllään, eikä kukaan yritä sulkea ovea enää uudelleen.","Ramenez moi l'uniforme du garde. Comme ça, un de mes amis rats pourra le porter et personne n'essaiera de fermer cette porte.","Hozd nekem vissza az őr egyenruháját. Az egyik besúgom felveszi, és nem lesz többé zárt ajtó előtte.",Portami l'uniforme della guardia. In questo modo uno dei nostri può indossarla e nessuno proverà più a chiudere la porta.,"ガードの制服を持ってくればいい。 +How will you know it's open?,TXT_RPLY0_SCRIPT06_D1516_HOWWI,〃,,,"Jak budeš vědět, že je otevřená?","Hvordan vil du vide, at den er åben?","Wodurch wirst du wissen, ob er offen ist?",,Kiel vi scios ĉu mi malfermis ĝin?,¿Cómo sabrás si está abierta?,¿Cómo vas a comprobar si la abrí?,"Mistä tiedät, että se on auki?",Comment est-ce que je saurais qu'elle est ouverte?,,"Honnan tudod, hogy nyitva lesz?",Come farai a sapere che è aperto?,開放を知らせるには?,어떻게 도와주면 방법을 알 수 있지?,Hoe weet je dat het open is?,Hvordan vet du at den er åpen?,"Skąd będziesz wiedział, że jest już otwarta?",Como você vai saber que ela está aberta?,,Cum vei știi că e deschisă?,"Как ты узнаешь, что дверь открыта?",,Hur vet du att den är öppen?,Açık olduğunu nereden bileceksin? +Bring me back the guard's uniform. That way one of my ratfellows can wear it and no one will try to shut the door again.,TXT_DLG_SCRIPT06_D3032_BRING,〃,,,"Přines mi uniformu stráže, pak ji jeden z mých krysaříků může nosit a nikdo se už nepokusí ty dveře zavřít.","Giv mig vagtens uniform tilbage. På den måde kan en af mine rottefæller bære den, og ingen vil forsøge at lukke døren igen.","Bring mir die Uniform des Wächters. So kann einer meiner Rattenkumpel sie tragen und niemand wird wieder versuchen, die Tür zu schließen.",,"Alportu la uniformon de la gardisto, tiel unu el miaj «kamaratoj» surhavos ĝin kaj tiam neniu provos reŝlosi la pordon.","Tráeme el uniforme del guardia, así uno de mis «camarratas» podrá ponérselo para que nadie intente cerrarla de nuevo.","Tráeme el uniforme del guardia, así uno de mis «camarratas» va a poder ponérselo para que nadie intente cerrarla de nuevo.","Tuo minulle vartijan univormu. Silloin yksi rottakumppaneistani voi pitää sitä yllään, eikä kukaan yritä sulkea ovea enää uudelleen.","Ramenez moi l'uniforme du garde. Comme ça, un de mes amis rats pourra le porter et personne n'essaiera de fermer cette porte.",,"Hozd nekem vissza az őr egyenruháját. Az egyik besúgom felveszi, és nem lesz többé zárt ajtó előtte.",Portami l'uniforme della guardia. In questo modo uno dei nostri può indossarla e nessuno proverà più a chiudere la porta.,"ガードの制服を持ってくればいい。 そうすりゃ成り代わったラットの仲間が もう封鎖されないよう監視するだろうさ。 ","오더 병사가 입고 있는 전투복을 가져오려. 내 걸인 동료가 그걸 입고 입구를 걱정 없이 영원히 열 수 있게. \cy끝내준다. 이제 시궁쥐 왕의 심부름도 해야 한다니.",Breng me het uniform van de bewaker terug. Op die manier kan een van mijn rattenvrienden het dragen en niemand zal proberen de deur weer te sluiten.,"Gi meg vaktuniformen. På den måten kan en av mine rottekamerater ha den på seg, og ingen vil prøve å lukke døren igjen.",Przynieś mi mundur strażnika. Tym sposobem jeden z moich szczurokolegów będzie mógł go założyć i nikt nie spróbuje znowu zamknąć drzwi.,Me traga de volta o uniforme do guarda. Dessa forma um dos meus companheiros pode vestí-la e ninguém vai tentar fechar a porta novamente.,,"Adu-mi uniforma gardianului. Așa, unui dintre noi o va putea purta și nimeni nu va încerca să mai închidă poata vreodată.","Принеси мне униформу стражника. Тогда один из моих приятелей сможет носить её, и никто не попытается снова закрыть дверь.",,Ge mig vaktens uniform. På så sätt kan en av mina råttföljeslagare bära den och ingen kommer att försöka stänga dörren igen.,Bana muhafız üniformasını geri getir. Böylece hain dostlarımdan biri onu giyebilir ve kimse kapıyı tekrar kapatmaya çalışmaz. -You want his uniform?,TXT_RPLY0_SCRIPT06_D3032_YOUWA,〃,,,Ty chceš jeho uniformu?,Vil du have hans uniform?,Du möchtest seine Uniform haben?,,Ĉu vi volas lian uniformon?,¿Quieres su uniforme?,,Haluat siis tämän univormun?,Vous voulez son uniforme?,Kell az egyenruhája?,Vuoi la sua uniforme?,あんたに制服を渡せばいいか?,그 전투복이 정말로 필요한가?,Wil je zijn uniform?,Vil du ha uniformen hans?,Chcesz jego mundur?,Você quer o uniforme dele?,,Vrei uniforma lui?,Тебе нужна его форма?,,Vill du ha hans uniform?,Üniformasını mı istiyorsun? -"Open the door, bring me the uniform and we trade. Otherwise, piss off.",TXT_DLG_SCRIPT06_D4548_OPENT,〃,,,"Otevři dveře, přines mi uniformu a budeme obchodovat. Jinak se jdi vycpat.","Åbn døren, giv mig uniformen, og vi bytter. Ellers skal du gå ud.","Öffne die Tür, bring mir die Uniform und wir können handeln. Ansonsten verschwinde.",,"Malfermu la pordon, alportu la uniformon kaj tiam ni intertraktos. Alie, malaperu.","Abre la puerta, tráeme el uniforme y negociamos. Si no, pírate.","Abre la puerta, tráeme el uniforme y negociamos. Caso contrario, esfúmate.","Avaa ovi, tuo minulle univormu ja teemme vaihtokaupan. Muuten suksi suohon.","Ouvrez la porte, ramenez moi l'uniforme et nous ferons affaire. Sinon, barrez-vous.","Nyisd k iaz ajtót, add ide az egyenruhát és üzletelhetünk. Ha nem, akkor húzz a túróba.","Apri l'ingresso, portami l'uniforme e allora possiamo trattare. Altrimenti, non abbiamo nulla da dirci.","そうだ、ゲートを開いて制服を奪うんだ。 +You want his uniform?,TXT_RPLY0_SCRIPT06_D3032_YOUWA,〃,,,Ty chceš jeho uniformu?,Vil du have hans uniform?,Du möchtest seine Uniform haben?,,Ĉu vi volas lian uniformon?,¿Quieres su uniforme?,,Haluat siis tämän univormun?,Vous voulez son uniforme?,,Kell az egyenruhája?,Vuoi la sua uniforme?,あんたに制服を渡せばいいか?,그 전투복이 정말로 필요한가?,Wil je zijn uniform?,Vil du ha uniformen hans?,Chcesz jego mundur?,Você quer o uniforme dele?,,Vrei uniforma lui?,Тебе нужна его форма?,,Vill du ha hans uniform?,Üniformasını mı istiyorsun? +"Open the door, bring me the uniform and we trade. Otherwise, piss off.",TXT_DLG_SCRIPT06_D4548_OPENT,〃,,,"Otevři dveře, přines mi uniformu a budeme obchodovat. Jinak se jdi vycpat.","Åbn døren, giv mig uniformen, og vi bytter. Ellers skal du gå ud.","Öffne die Tür, bring mir die Uniform und wir können handeln. Ansonsten verschwinde.",,"Malfermu la pordon, alportu la uniformon kaj tiam ni intertraktos. Alie, malaperu.","Abre la puerta, tráeme el uniforme y negociamos. Si no, pírate.","Abre la puerta, tráeme el uniforme y negociamos. Caso contrario, esfúmate.","Avaa ovi, tuo minulle univormu ja teemme vaihtokaupan. Muuten suksi suohon.","Ouvrez la porte, ramenez moi l'uniforme et nous ferons affaire. Sinon, barrez-vous.",,"Nyisd k iaz ajtót, add ide az egyenruhát és üzletelhetünk. Ha nem, akkor húzz a túróba.","Apri l'ingresso, portami l'uniforme e allora possiamo trattare. Altrimenti, non abbiamo nulla da dirci.","そうだ、ゲートを開いて制服を奪うんだ。 それまで戻ってくるんじゃねえぞ。","입구를 열고, 전투복을 구해서, 교환 하자구려! 아님... 꺼지시라. \cy얘도 분명 냄새 하나는 죽여줄 거야.","Open de deur, breng me het uniform en we handelen. Anders, piss off.","Åpne døra, gi meg uniformen, så bytter vi. Ellers kan du dra til helvete.",Otwórz drzwi i przynieś mundur to się dogadamy. Jeśli nie to spadaj.,"Abra a porta, traga o uniforme e nós negociaremos. Caso contrário, vaza daqui.",,"Deschide poarta, adu-mi uniforma, și facem schimbul. Altfel, șterge-o de aici.","Открой эту дверь, принеси мне униформу и мы сторгуемся. Иначе, отвали.",,"Öppna dörren, ge mig uniformen och vi byter. Annars kan du dra åt helvete.","Kapıyı aç, bana üniformayı getir ve takas edelim. Yoksa defol git." -Have you brought me what I want?,TXT_DLG_SCRIPT06_D6064_HAVEY,〃,,,"Přinesl jsi mi, co chci?","Har du bragt mig det, jeg vil have?",Hast du mir was mitgebracht?,,"Ĉu vi alportis tion, kion mi volas?",¿Me has traído lo que quiero?,¿Trajiste lo que quiero?,"Oletko tuonut minulle sen, mitä haluan?",Avez-vous ramené ce dont j'ai besoin?,"Elhoztad, amit kértem?",Mi hai portato ciò che volevo?,必要な物は持ってきたか?,내가 원하는 것을 가지고 왔나랴?,Heb je me gebracht wat ik wil?,Har du det jeg vil ha?,Przyniosłeś to o co cię prosiłem?,Você trouxe o que eu quero?,,Mi-ai adus ceea ce doresc?,"Ты принёс мне то, что я просил?",,Har du gett mig det jag vill ha?,İstediğim şeyi getirdin mi? -How about this uniform?,TXT_RPLY0_SCRIPT06_D6064_HOWAB,〃,,,Co tahle uniforma?,Hvad med denne uniform?,Wie findest du diese Uniform?,,Kion pri ĉi tiu uniformo?,¿Qué tal este uniforme?,¿Qué hay de este uniforme?,Miten olisi tämä univormu?,"Il vous convient, cet uniforme?",És mi az újság ezzel az egyenruhával?,Che ne dici di questa uniforme?,この制服はどうだ?,이 전투복은 어때?,Hoe zit het met dit uniform?,Hva med denne uniformen?,Może być ten mundur?,Que tal este uniforme?,,Ce zici de uniforma asta?,Эта униформа подойдёт?,,Vad sägs om den här uniformen?,Bu üniformaya ne dersin? -Bring me the uniform.,TXT_RNO0_SCRIPT06_D6064_BRING,,,,Přines mi tu uniformu.,Giv mig hans uniform.,Bring mir seine Uniform.,,Alportu la uniformon.,Tráeme el uniforme.,,Tuo univormu minulle.,Amenez moi l'uniforme.,Hozdd ide az egyenruhát.,Portami l'uniforme.,制服を持ってこい。,전투복을 가져와랴...,Breng me het uniform.,Gi meg uniformen.,Przynieś mi mundur.,Me traga o uniforme.,,Adu-mi uniforma.,Принеси мне униформу.,,Ge mig uniformen.,Bana üniformayı getir. -"Good. Here's something extra. My fellows tore this off of a fallen Crusader, it's the parts that make up a flamethrower. Now Irale can make one for you. You can have such fun.",TXT_DLG_SCRIPT06_D7580_GOODH,MAP06: Weran.,,,"Dobře. Tady je něco navíc. Mí stoupenci tohle urvali ze zničeného Křižáka, jsou to části, ze kterých se skládá plamenomet. Teď ti jeden může Irale postavit. Můžeš mít takové legrace.","Godt. Her er noget ekstra. Mine kammerater rev den af en faldet korsfarer, det er de dele, der udgør en flammekaster. Nu kan Irale lave en til dig. Du kan have det så sjovt.",Gut so. Hier ist ein kleiner Bonus. Meine Kumpel haben das hier von einem gefallenen Ordensritter abgerissen. Es sind die Teile seines Flammenwerfers. Jetzt kann Irale dir auch einen machen. Du kannst so viel Spaß damit haben...,,Bone. Jen aldonaĵo; miaj kamaradoj deŝiris ĝin de venkita Krucisto: ili estas partoj de flamĵetilo; Irale nun povos krei unu por vi. Vi vere amuziĝos.,Genial. Aquí tienes algo extra; mis compañeros lo arrancaron de un Cruzado caído: son las partes de un lanzallamas; ahora Irale puede hacer uno para ti. Te vas a divertir cantidad.,,"Hyvä. Tässä vielä jotain vähän lisäksi. Toverini repivät tämän kaatuneesta ristiretkeläisestä. Ne ovat liekinheittimen osia. Nyt Irale voi väsätä sinulle seillaisen. Ajattele sitä, kuinka hauskaa sinulla tulee olemaan.",Bien. Voilà un petit bonus. Mes amis ont arraché ceci à un croisé. C'est les pièces nécessaires à monter un lance-flammes. Irale peut en assembler un pour vous. Vous allez vraiment vous amuser.,"Helyes. Itt van egy kis érdekesség. Egyik bajtársam letörte ezeket az egyik keresztesről, igazából egy lángszórót lehetne összerakni belőle. Irale össze tudna rakni egyet neked. Tuti örömteli pörkölő pillanatokat fog okozni.","Eccellente. Ecco, ho qualcosa per te. I miei compagni hanno staccato questo da un Crociato distrutto, sono le parti che costituiscono il lanciafiamme. Adesso Irale ne può creare uno per te. Ti potrai divertire un sacco.","良し。礼は果たそう。 +Have you brought me what I want?,TXT_DLG_SCRIPT06_D6064_HAVEY,〃,,,"Přinesl jsi mi, co chci?","Har du bragt mig det, jeg vil have?",Hast du mir was mitgebracht?,,"Ĉu vi alportis tion, kion mi volas?",¿Me has traído lo que quiero?,¿Trajiste lo que quiero?,"Oletko tuonut minulle sen, mitä haluan?",Avez-vous ramené ce dont j'ai besoin?,,"Elhoztad, amit kértem?",Mi hai portato ciò che volevo?,必要な物は持ってきたか?,내가 원하는 것을 가지고 왔나랴?,Heb je me gebracht wat ik wil?,Har du det jeg vil ha?,Przyniosłeś to o co cię prosiłem?,Você trouxe o que eu quero?,,Mi-ai adus ceea ce doresc?,"Ты принёс мне то, что я просил?",,Har du gett mig det jag vill ha?,İstediğim şeyi getirdin mi? +How about this uniform?,TXT_RPLY0_SCRIPT06_D6064_HOWAB,〃,,,Co tahle uniforma?,Hvad med denne uniform?,Wie findest du diese Uniform?,,Kion pri ĉi tiu uniformo?,¿Qué tal este uniforme?,¿Qué hay de este uniforme?,Miten olisi tämä univormu?,"Il vous convient, cet uniforme?",,És mi az újság ezzel az egyenruhával?,Che ne dici di questa uniforme?,この制服はどうだ?,이 전투복은 어때?,Hoe zit het met dit uniform?,Hva med denne uniformen?,Może być ten mundur?,Que tal este uniforme?,,Ce zici de uniforma asta?,Эта униформа подойдёт?,,Vad sägs om den här uniformen?,Bu üniformaya ne dersin? +Bring me the uniform.,TXT_RNO0_SCRIPT06_D6064_BRING,,,,Přines mi tu uniformu.,Giv mig hans uniform.,Bring mir seine Uniform.,,Alportu la uniformon.,Tráeme el uniforme.,,Tuo univormu minulle.,Amenez moi l'uniforme.,,Hozdd ide az egyenruhát.,Portami l'uniforme.,制服を持ってこい。,전투복을 가져와랴...,Breng me het uniform.,Gi meg uniformen.,Przynieś mi mundur.,Me traga o uniforme.,,Adu-mi uniforma.,Принеси мне униформу.,,Ge mig uniformen.,Bana üniformayı getir. +"Good. Here's something extra. My fellows tore this off of a fallen Crusader, it's the parts that make up a flamethrower. Now Irale can make one for you. You can have such fun.",TXT_DLG_SCRIPT06_D7580_GOODH,MAP06: Weran.,,,"Dobře. Tady je něco navíc. Mí stoupenci tohle urvali ze zničeného Křižáka, jsou to části, ze kterých se skládá plamenomet. Teď ti jeden může Irale postavit. Můžeš mít takové legrace.","Godt. Her er noget ekstra. Mine kammerater rev den af en faldet korsfarer, det er de dele, der udgør en flammekaster. Nu kan Irale lave en til dig. Du kan have det så sjovt.",Gut so. Hier ist ein kleiner Bonus. Meine Kumpel haben das hier von einem gefallenen Ordensritter abgerissen. Es sind die Teile seines Flammenwerfers. Jetzt kann Irale dir auch einen machen. Du kannst so viel Spaß damit haben...,,Bone. Jen aldonaĵo; miaj kamaradoj deŝiris ĝin de venkita Krucisto: ili estas partoj de flamĵetilo; Irale nun povos krei unu por vi. Vi vere amuziĝos.,Genial. Aquí tienes algo extra; mis compañeros lo arrancaron de un Cruzado caído: son las partes de un lanzallamas; ahora Irale puede hacer uno para ti. Te vas a divertir cantidad.,,"Hyvä. Tässä vielä jotain vähän lisäksi. Toverini repivät tämän kaatuneesta ristiretkeläisestä. Ne ovat liekinheittimen osia. Nyt Irale voi väsätä sinulle seillaisen. Ajattele sitä, kuinka hauskaa sinulla tulee olemaan.",Bien. Voilà un petit bonus. Mes amis ont arraché ceci à un croisé. C'est les pièces nécessaires à monter un lance-flammes. Irale peut en assembler un pour vous. Vous allez vraiment vous amuser.,,"Helyes. Itt van egy kis érdekesség. Egyik bajtársam letörte ezeket az egyik keresztesről, igazából egy lángszórót lehetne összerakni belőle. Irale össze tudna rakni egyet neked. Tuti örömteli pörkölő pillanatokat fog okozni.","Eccellente. Ecco, ho qualcosa per te. I miei compagni hanno staccato questo da un Crociato distrutto, sono le parti che costituiscono il lanciafiamme. Adesso Irale ne può creare uno per te. Ti potrai divertire un sacco.","良し。礼は果たそう。 それと仲間が倒れたクルセイダーからこれを 奪ってきた、火炎放射器の部品らしい。 イラールに渡せば作り上げるはずだ。 楽しみだろう。","아주 좋은 겨! 여기, 추가 보답을 받으라. 내 걸인 동료가 크루세이더의 잔해 속에서 이걸 구해냈다네에. 아주 좋은 화염방사기를 만들어낼 수 있을 거야. 이걸 들고 이롤리를 찾아가 바. 그리고... 요리를 즐기는 거쟈.","Goed. Hier is iets extra's. Mijn vrienden scheurden dit af van een gevallen kruisvaarder, het zijn de onderdelen die een vlammenwerper vormen. Nu kan Irale er een voor je maken. Je kunt zoveel plezier hebben.",Bra. Her er noe ekstra. Mine karer rev dette av en falne korsfarer. Det er delene til en flammekaster. Nå kan Irale lage en til deg. Du kan ha det så gøy.,"Dobrze. Oto mały bonus dla ciebie. Moi koledzy wyciągnęli to ze zniszczonego Krzyżowca, są to części do miotacza ognia. Teraz Irale będzie mógł taki dla ciebie zrobić. Będziesz miał dużo frajdy.",Muito bom. Aqui tem um brinde. Meus companheiros arrancaram isso de um Cruzado destruído. São peças para lança-chamas. Agora o Irale vai poder montar um pra você. Vai se divertir bastante.,,"Bun. Uite aici ceva în plus. Tovarășii mei au smuls asta de pe un Cruciat răpus, sunt părți ale unui aruncător de flăcări. Acum Irale îți poate construi unul. Te poți distra de minune.","Хорошо. Я могу предложить тебе кое-что сверх уговора. Мои приятели сняли это с подбитого крестоносца. Это детали огнемёта. Ирэйл соберёт его для тебя, и ты сможешь повеселиться от души.",,"Jag har den. Här är något extra. Mina kamrater slet av den här från en stupad korsriddare, det är delarna som utgör en flamkastare. Nu kan Irale göra en åt dig. Du kan ha så roligt.",Güzel. Burada ekstra bir şey var. Arkadaşlarım bunu düşmüş bir Haçlı'dan kopardılar. Alev silahını oluşturan parçalar. Şimdi İrale senin için bir tane yapabilir. Çok eğlenebilirsiniz. -Where's the gate mechanism?,TXT_RPLY0_SCRIPT06_D7580_WHERE,〃,,,Kde je mechanismus brány?,Hvor er portmekanismen?,Wo ist der Tormechanismus?,,Kie estas la mekanismo de la pordo de la kastelo?,¿Dónde está el mecanismo de la puerta?,,Missä portin koneisto on?,Où se trouve le mécanisme d'ouverture de la porte?,Hol van a kapu szerkezet?,Dov'è il meccanismo per il cancello?,ゲートメカニズムは何処だ?,관리 장치는 이제 어디있지?,Waar is het poortmechanisme?,Hvor er portmekanismen?,Gdzie jest mechanizm sterujący bramą?,Onde fica o mecanismo do portão?,,Unde e mecanismul de acționare al porții?,Где механизм управления воротами?,,Var är grindmekanismen?,Kapı mekanizması nerede? +Where's the gate mechanism?,TXT_RPLY0_SCRIPT06_D7580_WHERE,〃,,,Kde je mechanismus brány?,Hvor er portmekanismen?,Wo ist der Tormechanismus?,,Kie estas la mekanismo de la pordo de la kastelo?,¿Dónde está el mecanismo de la puerta?,,Missä portin koneisto on?,Où se trouve le mécanisme d'ouverture de la porte?,,Hol van a kapu szerkezet?,Dov'è il meccanismo per il cancello?,ゲートメカニズムは何処だ?,관리 장치는 이제 어디있지?,Waar is het poortmechanisme?,Hvor er portmekanismen?,Gdzie jest mechanizm sterujący bramą?,Onde fica o mecanismo do portão?,,Unde e mecanismul de acționare al porții?,Где механизм управления воротами?,,Var är grindmekanismen?,Kapı mekanizması nerede? "You have to enter another part of the sewers. To get there you must enter the castle from a sewer maintenance door and drain the fluid reclamation tank. At the bottom is the hidden entrance to sewers, and right beyond that is the manual gate control.",TXT_DLG_SCRIPT06_D9096_YOUHA,"〃 -https://en.wikipedia.org/wiki/Reclaimed_water",,,Musíš vejít do jiné části stok. K tomu se potřebuješ údržbovými dveřmi dostat do hradu a vypustit záchytnou nádrž. Na dně je schovaný vchod do stok a hned za ním je manuální ovládání brány.,"Du skal ind i en anden del af kloakkerne. For at komme derhen skal du gå ind i slottet fra en dør til vedligeholdelse af kloakken og tømme væskegenvindingsbeholderen. Nederst er den skjulte indgang til kloakkerne, og lige bagved er den manuelle portkontrol.","Du musst in einen anderen Teil der Kanalisation. Um dort hinzukommen, musst du durch einen Wartungsgang in die Burg und den Wasserrückgewinnungstank entleeren. Am Boden des Tanks ist der versteckte Eingang zur Kanalisation und gleich dahinter die manuelle Torkontrolle.",,"Vi devas iri al alia parto de la kloako. Por atingi tien, vi devas eniri la kastelon tra pordo de ĉambro pri kloaka bontenado kaj dreni la rezervujon de akvoreuzo; en ĝia fundo estas kaŝita enirejo al la kloako, kaj ie tie estas la mana regilo de la pordo.",Tienes que adentrarte en otra parte de las cloacas. Para llegar ahí debes entrar en el castillo por la puerta de mantenimiento de las cloacas y drenar el tanque de recuperación de agua; al fondo está la entrada oculta a las cloacas y por ahí mismo el control manual de la puerta.,Tienes que ir a otra parte de las cloacas. Para llegar ahí debes entrar al castillo por la puerta de mantenimiento de las cloacas y drenar el tanque de recuperación de agua; al fondo está la entrada oculta a las cloacas y por ahí mismo el control manual de la puerta.,"Sinun on mentävä viemäreiden eri osioon. Päästäksesi sinne sinun on mentävä linnaan viemäreiden huolto-oven kautta ja tyhjennettävä nesteentalteenottoallas. Altaan pohjalla on viemärin salainen sisäänkäynti, ja suoraan sen jäljessä on portin käsiohjain.","Vous devez entrer dans une autre section des égouts. Quand vous y êtes, vous devez entrer dans le château à partir de la porte de maintenance des égouts, et drainer le réservoir de recyclage d'eau. Au fond se trouve l'entrée cachée des égouts, et juste après elle, les contrôles manuels de la porte.","A kanális egy másik részébe kell menned. Ehhez egy szervízajtón keresztül kell behatolnod a kastélyba, úgy hogy leereszted a szárító tartályból. Az alján található a titkos kanális bejárat, és rögtön utána a kézi kapu irányító.","Devi andare in un'altra sezione delle fogne. Per raggiungerla, devi entrare nel castello da una porta di manutenzione delle fogne e svuotare la vasca di recupero fluidi. Al fondo di questa vasca c'è l'uscita nascosta per le fogne, e subito dopo c'è il controllo manuale dei cancelli.","下水道の別の部分に入る必要がある。 +https://en.wikipedia.org/wiki/Reclaimed_water",,,Musíš vejít do jiné části stok. K tomu se potřebuješ údržbovými dveřmi dostat do hradu a vypustit záchytnou nádrž. Na dně je schovaný vchod do stok a hned za ním je manuální ovládání brány.,"Du skal ind i en anden del af kloakkerne. For at komme derhen skal du gå ind i slottet fra en dør til vedligeholdelse af kloakken og tømme væskegenvindingsbeholderen. Nederst er den skjulte indgang til kloakkerne, og lige bagved er den manuelle portkontrol.","Du musst in einen anderen Teil der Kanalisation. Um dort hinzukommen, musst du durch einen Wartungsgang in die Burg und den Wasserrückgewinnungstank entleeren. Am Boden des Tanks ist der versteckte Eingang zur Kanalisation und gleich dahinter die manuelle Torkontrolle.",,"Vi devas iri al alia parto de la kloako. Por atingi tien, vi devas eniri la kastelon tra pordo de ĉambro pri kloaka bontenado kaj dreni la rezervujon de akvoreuzo; en ĝia fundo estas kaŝita enirejo al la kloako, kaj ie tie estas la mana regilo de la pordo.",Tienes que adentrarte en otra parte de las cloacas. Para llegar ahí debes entrar en el castillo por la puerta de mantenimiento de las cloacas y drenar el tanque de recuperación de agua; al fondo está la entrada oculta a las cloacas y por ahí mismo el control manual de la puerta.,Tienes que ir a otra parte de las cloacas. Para llegar ahí debes entrar al castillo por la puerta de mantenimiento de las cloacas y drenar el tanque de recuperación de agua; al fondo está la entrada oculta a las cloacas y por ahí mismo el control manual de la puerta.,"Sinun on mentävä viemäreiden eri osioon. Päästäksesi sinne sinun on mentävä linnaan viemäreiden huolto-oven kautta ja tyhjennettävä nesteentalteenottoallas. Altaan pohjalla on viemärin salainen sisäänkäynti, ja suoraan sen jäljessä on portin käsiohjain.","Vous devez entrer dans une autre section des égouts. Quand vous y êtes, vous devez entrer dans le château à partir de la porte de maintenance des égouts, et drainer le réservoir de recyclage d'eau. Au fond se trouve l'entrée cachée des égouts, et juste après elle, les contrôles manuels de la porte.",,"A kanális egy másik részébe kell menned. Ehhez egy szervízajtón keresztül kell behatolnod a kastélyba, úgy hogy leereszted a szárító tartályból. Az alján található a titkos kanális bejárat, és rögtön utána a kézi kapu irányító.","Devi andare in un'altra sezione delle fogne. Per raggiungerla, devi entrare nel castello da una porta di manutenzione delle fogne e svuotare la vasca di recupero fluidi. Al fondo di questa vasca c'è l'uscita nascosta per le fogne, e subito dopo c'è il controllo manuale dei cancelli.","下水道の別の部分に入る必要がある。 そこへ行くには下水道の整備室から 城の浄水施設に入りタンクを排水する必要がある その下には隠された入り口があり、 その先に手動ゲートコントロールがあるはずだ。","하수도로 통하는 또 다른 입구로 가야 혀. 들어가려면 성안에 위치한 하수도 정비소에서 수조에 있는 오물을 배출해야 해. 그 수조 밑에는 하수도로 향하는 숨겨진 입구가 있고, 그곳으로 향하면, 정문의 장치를 찾을 수 있을 게야. \cy또 하수도라... 끝내준다. 저 아래에 또 뭐가 살고 있을까?","Je moet een ander deel van de riolering betreden. Om daar te komen moet je het kasteel binnengaan via een deur voor het onderhoud van de riolering en de vloeistoftank aftappen. Onderaan is de verborgen toegang tot de riolering, en net daarachter is de handmatige poortbesturing.","Du må gå inn i en annen del av kloakken. For å komme dit må du gå inn i slottet fra en kloakkvedlikeholdsdør og tømme væskegjenvinningstanken. Nederst er den skjulte inngangen til kloakken, og rett bortenfor den er den manuelle portkontrollen.","Musisz wejść do innej części kanałów. Aby się tam dostać musisz wejść do zamku przez drzwi sekcji konserwacji ścieków i osuszyć zbiornik rekultywacyjny. Na dole znajduje się ukryte przejście do kanałów, a za nim jest mechanizm bramy.",Você precisa entrar em outra parte do esgoto. Para chegar até lá você deve entrar no castelo por uma porte de manutenção de esgoto e drenar o tanque de recuperação de fluído. Lá no fundo fica a entrada oculta do esgoto e logo adiante fica o controle manual do portão.,,"Va trebui să intrăm pe altă parte a canalelor. Ca să ajungi acolo trebuie să intri în castel printr-o ușa de mentenanță a canalului și să drenezi rezervorul. La bază e intrarea în canale, și imediat după aceea e controlul manual al porții.","Это в другой части канализации. Чтобы попасть туда, пройди в замок через дверь обслуживания канализации и слей жидкость из бака для переработки. На его дне есть скрытый вход в стоки, и прямо за ним — ручной механизм управления воротами.",,"Du måste gå in i en annan del av kloakerna. För att komma dit måste du gå in i slottet från en dörr för underhåll av kloakerna och tömma vätskereklamationstanken. Längst ner finns den dolda ingången till kloakerna, och precis bakom den finns den manuella grindmekanismen.",Kanalizasyonun başka bir bölümüne girmelisin. Oraya ulaşmak için kaleye bir kanalizasyon bakım kapısından girmeli ve sıvı geri kazanım tankını boşaltmalısınız. En altta kanalizasyonun gizli girişi ve onun hemen ötesinde de manuel kapı kontrolü var. -Anything else you can do?,TXT_RPLY0_SCRIPT06_D9096_ANYTH,〃,,,Mohl bys udělat ještě něco?,"Er der andet, du kan gøre?",Kannst du sonst noch was für mich tun?,,"Ĉu estas io alia, kion vi povas fari?",¿Algo más que puedas hacer?,,Voitko olla vielä jotenkin muuten avuksi?,Que pouvez vous faire d'autre?,Tudsz még valamit tenni?,C'è qualcos'altro che puoi fare?,他に出来ることは?,그 외에 당신이 할 수 있는 일은?,Kun je nog iets anders doen?,Noe annet du kan gjøre?,Czy coś jeszcze możesz zrobić?,Algo mais que você possa fazer?,,Mai poți face altceva?,Можешь помочь мне чем-нибудь ещё?,,Finns det något annat du kan göra?,Yapabileceğin başka bir şey var mı? +Anything else you can do?,TXT_RPLY0_SCRIPT06_D9096_ANYTH,〃,,,Mohl bys udělat ještě něco?,"Er der andet, du kan gøre?",Kannst du sonst noch was für mich tun?,,"Ĉu estas io alia, kion vi povas fari?",¿Algo más que puedas hacer?,,Voitko olla vielä jotenkin muuten avuksi?,Que pouvez vous faire d'autre?,,Tudsz még valamit tenni?,C'è qualcos'altro che puoi fare?,他に出来ることは?,그 외에 당신이 할 수 있는 일은?,Kun je nog iets anders doen?,Noe annet du kan gjøre?,Czy coś jeszcze możesz zrobić?,Algo mais que você possa fazer?,,Mai poți face altceva?,Можешь помочь мне чем-нибудь ещё?,,Finns det något annat du kan göra?,Yapabileceğin başka bir şey var mı? "Good luck. I've opened several of our tunnels for you. It should make your task easier. Oh, size ten, perfect! ...But dreadful colors.",TXT_DLG_SCRIPT06_D10612_GOODL,〃,,,"Hodně štěstí. Otevřel jsem pro tebe několik našich tunelů. To by ti mělo tvůj úkol usnadnit. Ó, velikost deset, perfektní! ...Ale barva je hrozná.","Held og lykke. Jeg har åbnet flere af vores tunneler for dig. Det burde gøre din opgave lettere. Åh, størrelse ti, perfekt! ...Men forfærdelige farver.","Viel Glück. Ich habe mehrere von unseren Tunnels für dich geöffnet. Es sollte deine Aufgabe vereinfachen. Oh, Größe 10. Perfekt! Aber scheußliche Farben...",,"Ŝancon. Mi malfermis diversajn el niaj tuneloj. Tio devus faciligi la taskon por vi. Ha, la uniformo havas M-an talion. Perfekte!... Sed aĉkolora.","Buena suerte. Te he abierto varios de nuestros túneles; eso debería facilitarte las cosas. Ah, es de talla 40. ¡Perfecto!... Aunque de colores espantosos.","Buena suerte. Te abrimos varios de nuestros túneles; eso debería facilitarte las cosas. -Ah, es de talle M. ¡Perfecto!... Aunque de colores espantosos.","Lykkyä tykö. Olen aukaissut useita tunneleistamme sinulle, minkä pitäisi helpottaa tehtävääsi. Kas, kokoa kymmenen, prikulleen sopiva! ...Mutta aivan hirveän värinen.","Bonne chance. J'ai ouvert plusieurs de nos tunnels pour vous. Ca devrait rendre votre travail plus facile. Oh! Taille dix? Parfait! Les couleurs sont immondes, par contre.","Sok sikert. Kinyitottam számos alagutat neked. Meg kell, hogy könnyítse a dolgodat. Oh, tízes méret, tökéletes!...de milyen okádék színek.","Buona fortuna. Ho aperto diversi dei nostri tunnel per te. Così dovrebbe essere più facile per te. Ah, taglia dieci, perfetto! ...Ma pessimi colori.","頑張れよ。それとアンタの為に俺達は幾つか +Ah, es de talle M. ¡Perfecto!... Aunque de colores espantosos.","Lykkyä tykö. Olen aukaissut useita tunneleistamme sinulle, minkä pitäisi helpottaa tehtävääsi. Kas, kokoa kymmenen, prikulleen sopiva! ...Mutta aivan hirveän värinen.","Bonne chance. J'ai ouvert plusieurs de nos tunnels pour vous. Ca devrait rendre votre travail plus facile. Oh! Taille dix? Parfait! Les couleurs sont immondes, par contre.",,"Sok sikert. Kinyitottam számos alagutat neked. Meg kell, hogy könnyítse a dolgodat. Oh, tízes méret, tökéletes!...de milyen okádék színek.","Buona fortuna. Ho aperto diversi dei nostri tunnel per te. Così dovrebbe essere più facile per te. Ah, taglia dieci, perfetto! ...Ma pessimi colori.","頑張れよ。それとアンタの為に俺達は幾つか トンネルを開けといた。多少はやり易くなるだろ。 おぅ、サイズは10型か、ピッタリだ! ...だが、おっかねえ色してんな。","행운을 빈다. 지름길을 좀 열어놨어야. 덕분에 과제가 좀 쉬워질 거다. 오, 딱맞는 치수구먼! 완벽해... 그런데 색상이 별로다.","Veel succes. Ik heb een aantal van onze tunnels voor u geopend. Het moet uw taak gemakkelijker maken. Oh, maat tien, perfect! ...Maar vreselijke kleuren.","Lykke til. Jeg har åpnet flere av tunnelene våre for deg. Det burde gjøre oppgaven din lettere. Å, størrelse ti, perfekt! ...men forferdelige farger.","Powodzenia. Otworzyłem kilka naszych tuneli dla ciebie. To powinno ci ułatwić zadanie. Oh, rozmiar dziesięć, idealnie! ...Ale paskudne kolory.","Boa sorte. Eu abri alguns de nossos túneis pra você. Acho que vai facilitar o seu trabalho. Ah, tamanho M, perfeito! ...Mas as cores são um horror.",,"Noroc. Am deschis câteva canale pentru tine. Ar trebui să îți ușureze munca. Ah, mărimea zece, perfect! ...Dar cumplite culori.","Разве что пожелать удачи. Я открыл для тебя несколько наших туннелей, это может сделать твою задачу чуть проще. О, десятый размер! Как раз впору!.. Но остойные цвета.",,"Lycka till. Jag har öppnat flera av våra tunnlar åt dig. Det borde göra din uppgift lättare. Åh, storlek tio, perfekt! ...men hemska färger.","İyi şanslar. Sizin için birkaç tünelimizi açtım. İşinizi kolaylaştıracaktır. Oh, 10 numara, mükemmel! ...Ama korkunç renkler." -Thanks for your help.,TXT_RPLY0_SCRIPT06_D10612_THANK,〃,,,Díky za pomoc.,Tak for din hjælp.,Danke für deine Hilfe.,,Dankon pro la helpo.,Gracias por la ayuda.,,Kiitos avustasi.,Merci pour votre aide.,Köszi a segítséget.,Grazie del tuo aiuto.,協力ありがとう。,도움 정말 고마워.,Bedankt voor je hulp.,Takk for hjelpen.,Dzięki za twoją pomoc.,Obrigado pela ajuda.,,Merci de ajutor.,Спасибо за помощь.,,Tack för hjälpen.,Yardımınız için teşekkürler. -"You give me nothing, you get nothing.",TXT_DLG_SCRIPT06_D12128_YOUGI,〃,,,"Ty mi nic nedáš, já ti nic nedám.","Hvis du ikke giver mig noget, får du intet.","Du gibst mir nichts, ich gebe dir nichts.",,"Se vi donos nenion, vi ricevos nenion.","No me das nada, no recibes nada.",,"Jos et anna minulle mitään, et vastavuoroin mitään saakaan.","Vous ne me donnez rien, je ne vous donne rien.","Nem adsz semmit, nem kapsz semmit.","Se non mi dai niente, non ricevi niente!",何も無ければ、何も渡すモンは無い。,헤헤... 아무 일도 없는 거니 괜찮야!,"Je geeft me niets, je krijgt niets.","Du gir meg ingenting, du får ingenting.","Nic mi nie dajesz, nic nie dostajesz.","Você não me dá nada, não ganha nada.",,"Nu dai nimic, primești nimic.",Ничего не даёшь — ничего не получаешь.,,"Du ger mig inget, du får inget.","Bana bir şey vermezsen, hiçbir şey alamazsın." -Weran will save us. He's never failed us yet.,TXT_DLG_SCRIPT06_D13644_WERAN,MAP06: Beggar.,,,Weran nás zachrání. Ještě nás nezklamal.,Weran vil redde os. Han har aldrig svigtet os endnu.,Weran wird uns retten. Er hat uns noch nie enttäuscht.,,Weran savos nin: li neniam desapontis nin.,Weran nos salvará: nunca nos ha fallado.,Weran nos va a salvar: nunca nos ha fallado.,Weran pelastaa meidät. Hän ei ole vielä kertaakaan pettänyt meitä.,Weran nous sauvera. Il ne nous a jamais failli.,Weran majd megment minket. Eddig sosem hagyott minket cserben.,Weran ci salverà. Non ci ha mai deluso fin'ora.,"ウェランは皆を保護してくれている。 +Thanks for your help.,TXT_RPLY0_SCRIPT06_D10612_THANK,〃,,,Díky za pomoc.,Tak for din hjælp.,Danke für deine Hilfe.,,Dankon pro la helpo.,Gracias por la ayuda.,,Kiitos avustasi.,Merci pour votre aide.,,Köszi a segítséget.,Grazie del tuo aiuto.,協力ありがとう。,도움 정말 고마워.,Bedankt voor je hulp.,Takk for hjelpen.,Dzięki za twoją pomoc.,Obrigado pela ajuda.,,Merci de ajutor.,Спасибо за помощь.,,Tack för hjälpen.,Yardımınız için teşekkürler. +"You give me nothing, you get nothing.",TXT_DLG_SCRIPT06_D12128_YOUGI,〃,,,"Ty mi nic nedáš, já ti nic nedám.","Hvis du ikke giver mig noget, får du intet.","Du gibst mir nichts, ich gebe dir nichts.",,"Se vi donos nenion, vi ricevos nenion.","No me das nada, no recibes nada.",,"Jos et anna minulle mitään, et vastavuoroin mitään saakaan.","Vous ne me donnez rien, je ne vous donne rien.",,"Nem adsz semmit, nem kapsz semmit.","Se non mi dai niente, non ricevi niente!",何も無ければ、何も渡すモンは無い。,헤헤... 아무 일도 없는 거니 괜찮야!,"Je geeft me niets, je krijgt niets.","Du gir meg ingenting, du får ingenting.","Nic mi nie dajesz, nic nie dostajesz.","Você não me dá nada, não ganha nada.",,"Nu dai nimic, primești nimic.",Ничего не даёшь — ничего не получаешь.,,"Du ger mig inget, du får inget.","Bana bir şey vermezsen, hiçbir şey alamazsın." +Weran will save us. He's never failed us yet.,TXT_DLG_SCRIPT06_D13644_WERAN,MAP06: Beggar.,,,Weran nás zachrání. Ještě nás nezklamal.,Weran vil redde os. Han har aldrig svigtet os endnu.,Weran wird uns retten. Er hat uns noch nie enttäuscht.,,Weran savos nin: li neniam desapontis nin.,Weran nos salvará: nunca nos ha fallado.,Weran nos va a salvar: nunca nos ha fallado.,Weran pelastaa meidät. Hän ei ole vielä kertaakaan pettänyt meitä.,Weran nous sauvera. Il ne nous a jamais failli.,,Weran majd megment minket. Eddig sosem hagyott minket cserben.,Weran ci salverà. Non ci ha mai deluso fin'ora.,"ウェランは皆を保護してくれている。 彼は誰も見捨てたことはない。",워렌이 우리들을 구원해 줄 겁니다. 그는 아직 믿어도 되니까요.,Weran zal ons redden. Hij heeft ons nog nooit teleurgesteld.,Weran vil redde oss. Han har aldri sviktet oss før.,Weran nas uratuje. Jeszcze nigdy nas nie zawiódł.,Weran vai nos salvar. Ele nunca nos deixou na mão.,,Weran ne va salva. Nu ne-a dezamăgit până acum.,Уэран поможет нам. Он ещё ни разу не подводил нас.,,Weran kommer att rädda oss. Han har aldrig svikit oss än.,Weran bizi kurtaracak. Şimdiye kadar bizi hiç hayal kırıklığına uğratmadı. -"If you seek an answer to your problem, find Weran. ",TXT_DLG_SCRIPT06_D15160_IFYOU,〃,,,"Jestli hledáš odpověď na svou otázku, najdi Werana.","Hvis du søger et svar på dit problem, så find Weran.","Wenn du Lösungen für deine Probleme suchst, frag Weran.",,"Se vi serĉas respondon al via problemo, renkontu Weran-on.","Si buscas una respuesta a tu problema, ve con Weran.",,"Jos haet vastausta ongelmaasi, etsi Weran.","Si vous avez besoin d'une réponse à vos problèmes, allez voir Weran.","Ha választ keresel a problémádra, akkor keresd fel Werant.","Se cerchi una soluzione al tuo problema, torva Weran.","君の問題の答えが欲しいなら、 +"If you seek an answer to your problem, find Weran. ",TXT_DLG_SCRIPT06_D15160_IFYOU,〃,,,"Jestli hledáš odpověď na svou otázku, najdi Werana.","Hvis du søger et svar på dit problem, så find Weran.","Wenn du Lösungen für deine Probleme suchst, frag Weran.",,"Se vi serĉas respondon al via problemo, renkontu Weran-on.","Si buscas una respuesta a tu problema, ve con Weran.",,"Jos haet vastausta ongelmaasi, etsi Weran.","Si vous avez besoin d'une réponse à vos problèmes, allez voir Weran.",,"Ha választ keresel a problémádra, akkor keresd fel Werant.","Se cerchi una soluzione al tuo problema, torva Weran.","君の問題の答えが欲しいなら、 ウェランに会うといい。","문제를 해결할 해답을 찾고 계신다면, 워렌을 찾아가세요.","Als je een antwoord zoekt op je probleem, vind Weran.","Hvis du søker et svar på problemet ditt, finn Weran.","Jeśli szukasz rozwiązania swojego problemu, poszukaj Werana.","Se você precisa de um resposta para o seu problema, procure Weran.",,"Dacă ești în căutarea unor răspunsuri, găsește-l pe Weran.",Тебе нужен ответ? Найди Уэрана.,,"Om du söker ett svar på ditt problem, hitta Weran.","Eğer sorununuza bir cevap arıyorsanız, Weran'ı bulun." -Long live the Front? That's all crap. We're all just waiting to die. ,TXT_DLG_SCRIPT06_D16676_LONGL,〃,,,Ať žije Fronta? To je blbost. Všichni jen čekáme na smrt.,Længe leve fronten? Det er alt sammen noget lort. Vi venter alle bare på at dø.,Lang lebe die Front? Was für ein Mist. Wir warten doch nur auf den Tod.,,Ĉu vivu la Fronto? Kia fekaĵo. Ni ĉiuj atendas morton.,¿Que viva el Frente? Menuda mierda. A todos nos espera la muerte.,¿Que viva el Frente? Pura mierda. A todos nos espera la muerte.,Kauan eläköön Rintama? Täyttä puppua. Me kaikki vain odotamme kuolemaa.,Longue vie au Front? Quelles conneries! On est tous en train d'attendre de mourir!,"Éljen a Front? Mekkora baromság. Csak arra várunk, hogy meghaljunk.",Lunga vita al Fronte? Sono tutte idiozie. Stiamo tutti in attesa di morire.,"フロントに入れ? 馬鹿げてる。 +Long live the Front? That's all crap. We're all just waiting to die. ,TXT_DLG_SCRIPT06_D16676_LONGL,〃,,,Ať žije Fronta? To je blbost. Všichni jen čekáme na smrt.,Længe leve fronten? Det er alt sammen noget lort. Vi venter alle bare på at dø.,Lang lebe die Front? Was für ein Mist. Wir warten doch nur auf den Tod.,,Ĉu vivu la Fronto? Kia fekaĵo. Ni ĉiuj atendas morton.,¿Que viva el Frente? Menuda mierda. A todos nos espera la muerte.,¿Que viva el Frente? Pura mierda. A todos nos espera la muerte.,Kauan eläköön Rintama? Täyttä puppua. Me kaikki vain odotamme kuolemaa.,Longue vie au Front? Quelles conneries! On est tous en train d'attendre de mourir!,,"Éljen a Front? Mekkora baromság. Csak arra várunk, hogy meghaljunk.",Lunga vita al Fronte? Sono tutte idiozie. Stiamo tutti in attesa di morire.,"フロントに入れ? 馬鹿げてる。 死ねと言ってるようなもんだ。",프론트와 자유를 향하여... 는 개뿔. 때문에 우리들만 죽게 생겼어요.,Lang leve het Front? Dat is allemaal onzin. We wachten allemaal op de dood.,Lenge leve Fronten? Det er bare tull. Vi venter bare på å dø.,Niech żyje Front? To wszystko to gówno. My po prostu czekamy na śmierć.,Viva a Frente? Isso é besteira. Todos nós estamos esperando a morte.,,Să trăiască Frontul? Aiureli. Doar așteptăm să murim.,Да здравствует Сопротивление? Это всё чушь. Мы все просто ждём смерти.,,Länge leve fronten? Det är bara skit. Vi väntar bara på att dö.,Cephe çok yaşa mı? Bunların hepsi saçmalık. Hepimiz ölmeyi bekliyoruz. -"With our passage to the surface sealed, we can't even feed ourselves.",TXT_DLG_SCRIPT06_D18192_WITHO,〃,,,"Když je cesta na povrch uzavřená, nemůžeme se ani nakrmit.","Med vores passage til overfladen forseglet, kan vi ikke engang brødføde os selv.","Da unser Zugang zur Oberfläche verschlossen ist, haben wir nichts mehr zu essen.",,"Ĉar nia irado al la surfaco estas ŝlosita, ni eĉ ne povas nutri nin.","Con nuestro pasaje a la superficie cerrado, no podemos ni alimentarnos.",,Pääsymme maanpinnalle ollessa salvattuna emme voi edes ruokkia itseämme.,"Avec notre passage vers la surface scellé, on ne peut même plus se nourrir.","Mivel a felszínre vezető átjáró el van zárva, még ételhez sem jutunk.","Con il passaggio verso la superfice chiuso, non possiamo neanche mangiare.","外への出入口が封鎖されてるから、 +"With our passage to the surface sealed, we can't even feed ourselves.",TXT_DLG_SCRIPT06_D18192_WITHO,〃,,,"Když je cesta na povrch uzavřená, nemůžeme se ani nakrmit.","Med vores passage til overfladen forseglet, kan vi ikke engang brødføde os selv.","Da unser Zugang zur Oberfläche verschlossen ist, haben wir nichts mehr zu essen.",,"Ĉar nia irado al la surfaco estas ŝlosita, ni eĉ ne povas nutri nin.","Con nuestro pasaje a la superficie cerrado, no podemos ni alimentarnos.",,Pääsymme maanpinnalle ollessa salvattuna emme voi edes ruokkia itseämme.,"Avec notre passage vers la surface scellé, on ne peut même plus se nourrir.",,"Mivel a felszínre vezető átjáró el van zárva, még ételhez sem jutunk.","Con il passaggio verso la superfice chiuso, non possiamo neanche mangiare.","外への出入口が封鎖されてるから、 飯が調達できないんだ。 ","오더가 지상으로 향하는 입구를 막은 이상, 우리는 굶어 죽어야 할 운명에 시달려야 해요.","Met onze doorgang naar de oppervlakte afgesloten, kunnen we onszelf niet eens voeden.","Nå som passasjen til overflaten er stengt, kan vi ikke engang få mat.",Z zamkniętą naszą drogą na powierzchnię nie możemy się nawet nakarmić.,"Com a nossa passagem para a superfície selada, não somos capazes nem de nos alimentar.",,"Cu calea spre suprafață sigilată, nici măcar nu ne putem hrănii.","Пока выход на поверхность закрыт, мы не можем даже прокормить себя.",,Med vår passage till ytan förseglad kan vi inte ens föda oss själva.,Yüzeye geçişimiz mühürlü olduğu için kendimizi bile besleyemiyoruz. -"Food, do you have any food? Please help us.",TXT_DLG_SCRIPT06_D19708_FOODD,〃,,,"Jídlo, nemáš nějaké jídlo? Pomoz nám, prosím.","Mad, har du noget mad? Vær sød at hjælpe os.","Essen, hast du was zu essen? Bitte hilf uns.",,Manĝaĵoj... Ĉu vi havas manĝaĵojn? Bonvolu helpi nin.,"Comida... ¿No tendrás algo de comida? Ayúdanos, por favor.",,"Ruokaa, onko sinulla yhtään ruokaa? Pyydän, auta meitä.","A manger, vous avez à manger? Aidez-nous, s'il vous plaît.","Étel, van nálad valami étel? Kérlek segíts nekünk.","Cibo, hai del cibo? Per favore aiutaci.",食い物、食い物を恵んでくれないか? 頼むよ。,굶어 죽을 것 같습니다... 부디 음식 찌꺼기라도 괜찮으니까 음식을...,"Eten, heb je eten? Help ons alstublieft.","Mat, har du noe mat? Vær så snill, hjelp oss.","Jedzenie, masz może jakieś jedzenie? Proszę pomóż nam.",Comida. Você tem alguma comida? Por favor nos ajude.,,"Mâncare, ai mâncare? Te rog ajută-ne.","Еда. У тебя есть еда? Пожалуйста, помоги нам.",,"Mat, har ni någon mat? Snälla, hjälp oss.","Yiyecek, hiç yiyeceğiniz var mı? Lütfen bize yardım edin." -"This is my reward for letting prisoners escape, guarding the sewers. If I ever find the guy who broke them out, I'll slaughter him.",TXT_DLG_SCRIPT06_D21224_THISI,MAP06: Gray acolyte.,,,"Tohle je má odměna za to, že jsem nechal utéct vězně: hlídání stok. Jestli někdy najdu toho hajzla, který je pustil, zabiju ho.","Dette er min belønning for at lade fanger flygte og bevogte kloakkerne. Hvis jeg nogensinde finder den fyr, der brød dem ud, vil jeg slagte ham.","Das ist meine Belohnung dafür, dass ich die Gefangenen entkommen lassen habe. Jetzt darf ich die Kanalisation bewachen. Wenn ich jemals den Kerl finde, der das gemacht hat, mache ich Hackfleisch aus ihm!",,"Jen mia rekompenco pro tio, ke mi ne evitis la liberigon de la ekskaptitoj: gardi la kloakon. Se mi iam trovas la liberiginton, mi mortigos lin.","Esta es mi recompensa por dejar escapar a los prisioneros: vigilar las cloacas. Si llego a encontrar al tío que los ha liberado, me lo cargo.","Esta es mi recompensa por dejar escapar a los prisioneros: vigilar las cloacas. Si llego a encontrar al tipo que los liberó, lo asesino.","Tämä on minun palkkani siitä hyvästä, että päästin vangit pakenemaan: viemäreiden vartiointi. Jos ikinä saan käsiini sen tyypin, joka päästi ne pakoon, lahtaan sen.","Voici ma récompense pour avoir laissé les prisonniers s'évader: garder les égouts. Si je trouve celui qui les a libéré, je l'étripe.","Ez a jutalmam amiért hagytam elszökni a foglyokat. Ha meglelem az ürgét aki kiszabadította őket, biztosan kicsinálom.","Ecco la mia ricompensa per aver fatto scappare i prigionieri, fare la guardia alle fogne. Se mai trovo chi li ha liberati, lo faccio a pezzi.","この下水道から囚人を脱走させた奴を探す為、 +"Food, do you have any food? Please help us.",TXT_DLG_SCRIPT06_D19708_FOODD,〃,,,"Jídlo, nemáš nějaké jídlo? Pomoz nám, prosím.","Mad, har du noget mad? Vær sød at hjælpe os.","Essen, hast du was zu essen? Bitte hilf uns.",,Manĝaĵoj... Ĉu vi havas manĝaĵojn? Bonvolu helpi nin.,"Comida... ¿No tendrás algo de comida? Ayúdanos, por favor.",,"Ruokaa, onko sinulla yhtään ruokaa? Pyydän, auta meitä.","A manger, vous avez à manger? Aidez-nous, s'il vous plaît.",,"Étel, van nálad valami étel? Kérlek segíts nekünk.","Cibo, hai del cibo? Per favore aiutaci.",食い物、食い物を恵んでくれないか? 頼むよ。,굶어 죽을 것 같습니다... 부디 음식 찌꺼기라도 괜찮으니까 음식을...,"Eten, heb je eten? Help ons alstublieft.","Mat, har du noe mat? Vær så snill, hjelp oss.","Jedzenie, masz może jakieś jedzenie? Proszę pomóż nam.",Comida. Você tem alguma comida? Por favor nos ajude.,,"Mâncare, ai mâncare? Te rog ajută-ne.","Еда. У тебя есть еда? Пожалуйста, помоги нам.",,"Mat, har ni någon mat? Snälla, hjälp oss.","Yiyecek, hiç yiyeceğiniz var mı? Lütfen bize yardım edin." +"This is my reward for letting prisoners escape, guarding the sewers. If I ever find the guy who broke them out, I'll slaughter him.",TXT_DLG_SCRIPT06_D21224_THISI,MAP06: Gray acolyte.,,,"Tohle je má odměna za to, že jsem nechal utéct vězně: hlídání stok. Jestli někdy najdu toho hajzla, který je pustil, zabiju ho.","Dette er min belønning for at lade fanger flygte og bevogte kloakkerne. Hvis jeg nogensinde finder den fyr, der brød dem ud, vil jeg slagte ham.","Das ist meine Belohnung dafür, dass ich die Gefangenen entkommen lassen habe. Jetzt darf ich die Kanalisation bewachen. Wenn ich jemals den Kerl finde, der das gemacht hat, mache ich Hackfleisch aus ihm!",,"Jen mia rekompenco pro tio, ke mi ne evitis la liberigon de la ekskaptitoj: gardi la kloakon. Se mi iam trovas la liberiginton, mi mortigos lin.","Esta es mi recompensa por dejar escapar a los prisioneros: vigilar las cloacas. Si llego a encontrar al tío que los ha liberado, me lo cargo.","Esta es mi recompensa por dejar escapar a los prisioneros: vigilar las cloacas. Si llego a encontrar al tipo que los liberó, lo asesino.","Tämä on minun palkkani siitä hyvästä, että päästin vangit pakenemaan: viemäreiden vartiointi. Jos ikinä saan käsiini sen tyypin, joka päästi ne pakoon, lahtaan sen.","Voici ma récompense pour avoir laissé les prisonniers s'évader: garder les égouts. Si je trouve celui qui les a libéré, je l'étripe.",,"Ez a jutalmam amiért hagytam elszökni a foglyokat. Ha meglelem az ürgét aki kiszabadította őket, biztosan kicsinálom.","Ecco la mia ricompensa per aver fatto scappare i prigionieri, fare la guardia alle fogne. Se mai trovo chi li ha liberati, lo faccio a pezzi.","この下水道から囚人を脱走させた奴を探す為、 下水道を監視している。首謀者を見つけたら、 その命を持って報いを受けてもらう。","수감자들의 탈옥을 막지 못해서 하수도를 지키게 되었어. 만약 탈옥하게 만든 녀석을 만난다면, 녀석이 죽을 때 까지 내장을 천천히 끄집어낼 거다.","Dit is mijn beloning voor het laten ontsnappen van gevangenen, het bewaken van de riolering. Als ik ooit de man vind die ze heeft uitgebroken, zal ik hem afslachten.","Dette er belønningen min for å la fanger rømme og vokte kloakken. Hvis jeg finner fyren som slapp dem ut, skal jeg slakte ham.","To moja nagroda za pozwolenie więźniom uciec, pilnowanie ścieków. Jeśli kiedyklowiek dorwę tego, kto pomógł im uciec, to go zamorduję.","Essa é a minha recompensa por deixar os prisioneiros escaparem. Vigiar o esgoto. Se algum dia eu encontrar o cara que soltou eles, eu vou arrancar os seus pedaços.",,"Asta e răsplata mea pentru că am lăsat prizonieri să scape, apărarea canalelor. Dacă îl prind pe cel care i-a lăsat să scape, îl masacrez.","Я отбываю наказание за то, что не остановил побег из тюрьмы: охраняю канализацию. Если я когда-нибудь найду того парня, что освободил пленников, я его на куски порву.",,Det här är min belöning för att jag lät fångarna rymma och vaktade kloakerna. Om jag någonsin hittar killen som bröt ut dem ska jag slakta honom.,"Mahkumların kaçmasına izin verip kanalizasyonları koruduğum için ödülüm bu. Eğer onları kaçıran adamı bulursam, onu katledeceğim." -"We've got those little beggars just where we want them. Few more days of this, and they'll have starved themselves into oblivion.",TXT_DLG_SCRIPT06_D22740_WEVEG,MAP06: Red acolyte.,,,"Máme ty žebráčky přesně tam, kde chceme. Ještě pár dní a vyhladoví se do zapomnění.","Vi har de små tiggere lige hvor vi vil have dem. Et par dage mere af dette, og de vil have sultet sig selv til ukendelighed.","Wir haben diese armseligen Bettler doch genau da, wo wir sie haben wollen. Noch ein paar Tage und sie wären verhungert.",,"Tiuj almozuloj estas precize tie, kie ni volas: ankoraŭ kelkajn tagojn en tia situo kaj ili ne plu eltenos la inanicion.",Tenemos a esos indigentes justo donde los queremos: unos cuantos días más así y se habrán consumido por el hambre.,Tenemos a esos mendigos justo donde los queremos: un par de días más así y ya no van a poder más del hambre.,"Olemme ajaneet ne pikku kerjäläiset juuri sinne, minne haluammekin. Vielä muutama päivä tätä, ja ovat varmaankin nääntyneet unholaan.",On a enfin ces sales clodos là où on veut qu'ils soient. Quelques jours de plus et il seront tous morts de faim.,"Pont ott vannak ezek a koldusok ahol akarjuk. Még néhány nap, és halálra fognak éhezni.","Abbiamo quei piccoli mendicanti proprio dove vogliamo. Un paio di altri giorni di questo trattamento, e saranno tutti morti di fame.","この辺の何処かに乞食共がいるはずだ。 +"We've got those little beggars just where we want them. Few more days of this, and they'll have starved themselves into oblivion.",TXT_DLG_SCRIPT06_D22740_WEVEG,MAP06: Red acolyte.,,,"Máme ty žebráčky přesně tam, kde chceme. Ještě pár dní a vyhladoví se do zapomnění.","Vi har de små tiggere lige hvor vi vil have dem. Et par dage mere af dette, og de vil have sultet sig selv til ukendelighed.","Wir haben diese armseligen Bettler doch genau da, wo wir sie haben wollen. Noch ein paar Tage und sie wären verhungert.",,"Tiuj almozuloj estas precize tie, kie ni volas: ankoraŭ kelkajn tagojn en tia situo kaj ili ne plu eltenos la inanicion.",Tenemos a esos indigentes justo donde los queremos: unos cuantos días más así y se habrán consumido por el hambre.,Tenemos a esos mendigos justo donde los queremos: un par de días más así y ya no van a poder más del hambre.,"Olemme ajaneet ne pikku kerjäläiset juuri sinne, minne haluammekin. Vielä muutama päivä tätä, ja ovat varmaankin nääntyneet unholaan.",On a enfin ces sales clodos là où on veut qu'ils soient. Quelques jours de plus et il seront tous morts de faim.,,"Pont ott vannak ezek a koldusok ahol akarjuk. Még néhány nap, és halálra fognak éhezni.","Abbiamo quei piccoli mendicanti proprio dove vogliamo. Un paio di altri giorni di questo trattamento, e saranno tutti morti di fame.","この辺の何処かに乞食共がいるはずだ。 数日もすれば忘れ去られ飢え死するだろうな。",저 빌어먹을 거지들이 밖으로 나가지 못하게 우리들이 입구를 꼼꼼히 막아뒀지. 천천히 굶어 죽는 순간을 재밌게 즐기고 있을걸?,We hebben die kleine bedelaars precies waar we ze willen hebben. Nog maar een paar dagen en ze zullen zich in de vergetelheid hebben laten hongeren.,"Vi har de små tiggerne akkurat der vi vil ha dem. Et par dager til, så har de sultet seg selv i hjel.","Trzymamy tych małych żebraków tam gdzie chcemy, żeby byli. Jeszcze kilka dni i zagłodzą się na śmierć.",Esses mendigos estão bem onde a gente quer que estejam. Só mais alguns dias e eles vão morrer de fome.,,"Îi avem pe sărmanii ăștia exact acolo unde vrem. Încă câteva zile, și vor muri de foame.","Мы загнали этих жалких нищих туда, где им самое место. Ещё несколько дней, и все они подохнут с голоду.",,"Vi har de små tiggarna precis där vi vill ha dem. Några dagar till av detta, och de kommer att ha svultit sig själva till glömska.","O küçük dilencileri tam istediğimiz yere getirdik. Birkaç gün daha böyle devam ederlerse, kendilerini açlıktan öldürmüş olacaklar." -What's your clearance? There's no unauthorized personnel allowed up here.,TXT_DLG_SCRIPT06_D24256_WHATS,MAP06: Near storage.,,,Máš oprávnění? Žádná nepovolená osoba tady nahoře nemá co dělat!,Hvad er din tilladelse? Der er ingen uautoriseret personale tilladt heroppe.,Wo ist deine Berechtigung? Unautorisiertes Personal darf hier nicht rein.,,Kiun paspermeson vi havas? Nerajtigita personaro ne estas permesata ĉi tie.,¿Qué permiso tienes? No se permite al personal no autorizado aquí.,,Mikä on kulkuoikeutesi? Henkilöstöllä ei ole tänne pääsyä ilman lupaa.,Où est votre autorisation? Aucun personnel non autorisé ne peut venir ici.,Milyen engedélyed van? Nem léphet be engedély nélkül ide egy alkalmazott sem.,Hai l'autorizzazione per essere qui? Non è assolutamente permesso al personale non autorizzato di stare qua sopra.,"お前のクリアランスは何だ? +What's your clearance? There's no unauthorized personnel allowed up here.,TXT_DLG_SCRIPT06_D24256_WHATS,MAP06: Near storage.,,,Máš oprávnění? Žádná nepovolená osoba tady nahoře nemá co dělat!,Hvad er din tilladelse? Der er ingen uautoriseret personale tilladt heroppe.,Wo ist deine Berechtigung? Unautorisiertes Personal darf hier nicht rein.,,Kiun paspermeson vi havas? Nerajtigita personaro ne estas permesata ĉi tie.,¿Qué permiso tienes? No se permite al personal no autorizado aquí.,,Mikä on kulkuoikeutesi? Henkilöstöllä ei ole tänne pääsyä ilman lupaa.,Où est votre autorisation? Aucun personnel non autorisé ne peut venir ici.,,Milyen engedélyed van? Nem léphet be engedély nélkül ide egy alkalmazott sem.,Hai l'autorizzazione per essere qui? Non è assolutamente permesso al personale non autorizzato di stare qua sopra.,"お前のクリアランスは何だ? ここは許可の無い者は立入を禁じている。",승인을 받지 않은 것 같은데. 여긴 출입금지 구역이다.,Wat is uw toelating? Er is hier geen onbevoegd personeel toegestaan.,Hva er din klarering? Uautorisert personell er ikke tillatt her oppe.,Gdzie twoje zezwolenie? Nieautoryzowany personel nie ma tu wstępu.,Onde está a sua permissão? Ninguém sem permissão pode ficar aqui.,,Care e nivelul tău de acces? Niciun personal neautorizat nu are voie aici.,Где твой пропуск? Здесь нечего делать неуполномоченным лицам.,,Vad har du för tillstånd? Ingen obehörig personal tillåts här uppe.,Yetkiniz nedir? Buraya yetkisiz personel giremez. -What the hell? Who opened the gates? Sound the alarm!!!,TXT_DLG_SCRIPT07_D0_WHATT,MAP07: Red acolyte at the main entrance.,,,Co to sakra? Kdo otevřel bránu? Volej na poplach!,Hvad fanden? Hvem åbnede portene? Slå alarm!!!!,Was zur Hölle? Wer hat die Tore geöffne? Alarm!,,Kio diable? Kiu malfermis la pordojn? Sonorigu la alarmon!!!,¿Qué demonios? ¿Quién ha abierto las puertas? ¡¡¡Activad la alarma!!!,¿Qué carajo? ¿Quién abrió las puertas? ¡¡¡Activen la alarma!!!,Mitä helvettiä? Kuka avasi portit? Laukaise hälytys!!!,Qu'est-ce que c'est que ce bordel? Qui a ouvert les portes? Faites sonner l'alarme!,Mi a franc? Ki nyitotta ki a kaput? Indítsátok be a riasztót!,Ma che diavolo? Chi ha aperto i cancelli? Suonate l'allarme!!!,"何をしやがった? +What the hell? Who opened the gates? Sound the alarm!!!,TXT_DLG_SCRIPT07_D0_WHATT,MAP07: Red acolyte at the main entrance.,,,Co to sakra? Kdo otevřel bránu? Volej na poplach!,Hvad fanden? Hvem åbnede portene? Slå alarm!!!!,Was zur Hölle? Wer hat die Tore geöffne? Alarm!,,Kio diable? Kiu malfermis la pordojn? Sonorigu la alarmon!!!,¿Qué demonios? ¿Quién ha abierto las puertas? ¡¡¡Activad la alarma!!!,¿Qué carajo? ¿Quién abrió las puertas? ¡¡¡Activen la alarma!!!,Mitä helvettiä? Kuka avasi portit? Laukaise hälytys!!!,Qu'est-ce que c'est que ce bordel? Qui a ouvert les portes? Faites sonner l'alarme!,,Mi a franc? Ki nyitotta ki a kaput? Indítsátok be a riasztót!,Ma che diavolo? Chi ha aperto i cancelli? Suonate l'allarme!!!,"何をしやがった? 誰がゲートを開けた? 警報を鳴らせ!",누가 성문을 열어놨어? 경보! 알람을 울려라!,Wat de hel? Wie heeft de poorten geopend? Laat alarm slaan!!!,Hva i helvete? Hvem åpnet porten? Slå alarm!,Co u diabła? Kto otworzył bramy? Włączyć alarm!!!,Mas que diabos? Quem abriu os portões? Ativem o alarme!!!,,Ce naiba? Cine a deschis porțile? Sună alarma!!!,Что за чертовщина? Кто открыл ворота? Бейте тревогу!,,Vad i helvete? Vem öppnade grindarna? Slå larm!,Ne oluyor be? Kapıları kim açtı? Alarmı çalın!!! -"There's another way into the sewers, throw that switch and then go up and purge the reclamation tank.",TXT_DLG_SCRIPT07_D1516_THERE,MAP07,,,"Do stok vede další cesta, zatáhni za tuhle páku a pak jdi nahoru a vypusť obnovnou nádrž.","Der er en anden vej ind i kloakkerne, smid kontakten og gå så op og tøm genvindingstanken.",Da ist ein anderer Weg in die Kanalisation. Drück den Schalter da und leere den Rückgewinnungstank.,,"Estas alia enirejo al la kloako: enŝaltu ĉi tiun ŝaltilon, tiam reiru supren laŭ la ŝtuparo kaj drenu la rezervujon de akvoreuzo.",Hay otra entrada a las cloacas: activa este interruptor y luego ve a drenar el tanque de recuperación de agua subiendo las escaleras.,,Viemäreihin on toinen reitti. Käännä tuota vipua ja mene sitten ylös tyhjentämään talteenottoallas.,Il y a une autre entrée pour les égouts. Utilisez ce bouton et montez purger le réservoir de recyclage.,"Van egy másik módja is bejutni a kanálisba. Kapcsold fel azt a kapcsolót, aztán menj fel és ereszd le a szárító tartályt.","C'è un altro ingresso per le fogne, attiva quella leva e poi sali per svuotare la vasca di recupero fluidi.","下水道に別の入り口がある、スイッチを入れ +"There's another way into the sewers, throw that switch and then go up and purge the reclamation tank.",TXT_DLG_SCRIPT07_D1516_THERE,MAP07,,,"Do stok vede další cesta, zatáhni za tuhle páku a pak jdi nahoru a vypusť obnovnou nádrž.","Der er en anden vej ind i kloakkerne, smid kontakten og gå så op og tøm genvindingstanken.",Da ist ein anderer Weg in die Kanalisation. Drück den Schalter da und leere den Rückgewinnungstank.,,"Estas alia enirejo al la kloako: enŝaltu ĉi tiun ŝaltilon, tiam reiru supren laŭ la ŝtuparo kaj drenu la rezervujon de akvoreuzo.",Hay otra entrada a las cloacas: activa este interruptor y luego ve a drenar el tanque de recuperación de agua subiendo las escaleras.,,Viemäreihin on toinen reitti. Käännä tuota vipua ja mene sitten ylös tyhjentämään talteenottoallas.,Il y a une autre entrée pour les égouts. Utilisez ce bouton et montez purger le réservoir de recyclage.,,"Van egy másik módja is bejutni a kanálisba. Kapcsold fel azt a kapcsolót, aztán menj fel és ereszd le a szárító tartályt.","C'è un altro ingresso per le fogne, attiva quella leva e poi sali per svuotare la vasca di recupero fluidi.","下水道に別の入り口がある、スイッチを入れ 次に昇って浄水タンクを空にするんだ。",하수도로 향하는 또 다른 길이 있어. 저 스위치를 켜고 위로 올라가서 수조의 오물을 비워봐.,"Er is nog een andere weg in de riolering, gooi die schakelaar naar boven en ga dan naar boven om de terugwinnings tank te zuiveren.","Det er en annen vei inn i kloakken, trykk på bryteren og gå opp og rens tanken.","Jest jeszcze inna droga do kanałów, wciśnij ten przełącznik, idź na górę i opróżnij zbiornik rekultywacyjny.","Há outra maneira de entrar no esgoto. Use esse interruptor, suba e esvazie o tanque de recuperação.",,"Mai e o cale de acces către canale, folosește butonul apoi du-te sus și scurge lichidul din rezervor.","Есть другой путь в канализацию. Переведи этот рычаг, затем иди наверх и слей жидность из бака для переработки.",,"Det finns en annan väg in i kloakerna, slå om den strömbrytaren och gå sedan upp och rensa återvinningstanken.","Kanalizasyona giden başka bir yol var, o düğmeyi at ve sonra yukarı çıkıp ıslah tankını temizle." -"What the hell's your problem. If the Programmer comes up from his audience chamber, you're dead.",TXT_DLG_SCRIPT07_D3032_WHATT,MAP07: Hospital.,,,"Co máš sakra za problém? Jestli Programátor vyjde ze svého sálu, jsi mrtvý.","Hvad fanden er dit problem? Hvis programmøren kommer op fra sit publikumskammer, er du død.","Was, verdammt, ist dein Problem? Wenn der Programmierer seine Audienzkammer verläßt, bist du tot.",,"Kion diable vi faras!? Se la Programisto revenos de sia juĝejo, vi mortos.","¿¡Qué demonios te pasa!? Si el Programador vuelve de su sala de audiencias, estás muerto.","¿¡Qué carajo te pasa!? Si el Programador vuelve de su sala de audiencias, estás muerto.","Mikä helvetti sinussa on vialla. Jos ohjelmoitsija tulee valtaistuinsaliltaan, olet mennyttä.","C'est quoi votre problème? Si le Programmeur sort de sa chambre d'audience, vous êtes mort.","Mi az isten bajod van? Ha a Programozó feljön a kihallgató kamrájábó, akkor neked annyi.","Ma quale diavolo è il tuo problema. Se il Programmatore arriva dalla sua camera delle udienze, sei morto.","一体何をしに来た。プログラマーが +"What the hell's your problem. If the Programmer comes up from his audience chamber, you're dead.",TXT_DLG_SCRIPT07_D3032_WHATT,MAP07: Hospital.,,,"Co máš sakra za problém? Jestli Programátor vyjde ze svého sálu, jsi mrtvý.","Hvad fanden er dit problem? Hvis programmøren kommer op fra sit publikumskammer, er du død.","Was, verdammt, ist dein Problem? Wenn der Programmierer seine Audienzkammer verläßt, bist du tot.",,"Kion diable vi faras!? Se la Programisto revenos de sia juĝejo, vi mortos.","¿¡Qué demonios te pasa!? Si el Programador vuelve de su sala de audiencias, estás muerto.","¿¡Qué carajo te pasa!? Si el Programador vuelve de su sala de audiencias, estás muerto.","Mikä helvetti sinussa on vialla. Jos ohjelmoitsija tulee valtaistuinsaliltaan, olet mennyttä.","C'est quoi votre problème? Si le Programmeur sort de sa chambre d'audience, vous êtes mort.",,"Mi az isten bajod van? Ha a Programozó feljön a kihallgató kamrájábó, akkor neked annyi.","Ma quale diavolo è il tuo problema. Se il Programmatore arriva dalla sua camera delle udienze, sei morto.","一体何をしに来た。プログラマーが オーディエンスチャンバーから来たら 死んでいた所だ。","너희들 제정신이야? 프로그래머님이 알현실에서 뛰쳐나오는 순간, 네 놈은 죽게 될 거라고!","Wat de hel is jouw probleem? Als de programmeur uit zijn publiekskamer komt, ben je dood.","Hva i helvete er problemet ditt? Hvis programmereren kommer opp fra audiensrommet, er du død.",Jaki masz problem do diaska? Jeśli Programista wyjdzie ze swojej sali audiencji będziesz martwy.,"Qual é o seu problema? Se o Programador vier até aqui de sua câmara de audiências, você estará morto.",,"Care mai e problema ta? Dacă Programatorul vine sus din camera sa de audiență, ești mort.","Проклятье, что с тобой не так? Если Программист поднимется из приёмного зала, ты покойник!",,Vad i helvete är ditt problem. Om Programmeraren kommer upp från sin publikrum är du död.,"Senin sorunun ne? Eğer Programcı seyirci odasından çıkarsa, öldün demektir." -"Hey, you're not cleared to go down there.",TXT_DLG_SCRIPT07_D4548_HEYYO,,,,"Hej, nemáš povolení jít tam dolů.",Du har ikke tilladelse til at gå derned.,"He, du darfst da nicht runtergehen.",,"He, vi ne rajtas iri malsupren.","Oye, no tienes permiso para bajar aquí.",,"Hei, sinulla ei ole lupaa mennä alas sinne.","Hé, vous n'avez pas le droit d'être ici.","Héj, nincs engedélyed oda lemenni.","Ehi, non hai l'autorizzazione per andare laggiù.","おい、あんたはここを降りる事は +"Hey, you're not cleared to go down there.",TXT_DLG_SCRIPT07_D4548_HEYYO,,,,"Hej, nemáš povolení jít tam dolů.",Du har ikke tilladelse til at gå derned.,"He, du darfst da nicht runtergehen.",,"He, vi ne rajtas iri malsupren.","Oye, no tienes permiso para bajar aquí.",,"Hei, sinulla ei ole lupaa mennä alas sinne.","Hé, vous n'avez pas le droit d'être ici.",,"Héj, nincs engedélyed oda lemenni.","Ehi, non hai l'autorizzazione per andare laggiù.","おい、あんたはここを降りる事は 許可されてないぞ。",잠깐. 너는 밑으로 내려갈 허가를 받지 않았다.,"Hé, je hebt geen toestemming om naar beneden te gaan.","Hei, du er ikke klarert til å gå ned dit.","Hej, nie masz zgody na zejście tam.","Ei, você não tem permissão para descer aí.",,"Hei, n-ai acces să mergi acolo jos.","Эй, у тебя нет разрешения спускаться туда.",,Du har inte tillstånd att gå ner dit.,"Hey, oraya inme iznin yok." -Programmer? Who told you that? There is no Programmer. That story was spread ages ago. Don't tell me the Front actually believed that crap. Idiots.,TXT_DLG_SCRIPT07_D6064_PROGR,MAP07: Computer room (northwest building).,,,"Programátor? Kdo ti to řekl? Není žádný Programátor. To je stará pověra. Neříkej mi, že tomu Fronta doopravdy věřila. Idioti.","Programmør? Hvem har fortalt dig det? Der er ingen programmør. Den historie blev spredt for længe siden. Fortæl mig ikke, at fronten troede på det lort. Idioter.","Programmierer? Wer hat dir das erzählt? Es gibt keinen Programmierer. Das ist eine alte Legende. Sag mir nicht, dass die Front an diesen Blödsinn glaubt. Idioten.",,"Ĉu Programisto? Kie vi aŭdis tion? Ne estas Programisto; tiu storio ekdisvastiĝis antaŭ jaroj. Ne diru, ke la Fronto kredis tian fekaĵon. Kiel stultaj.",¿Programador? ¿De dónde sacas eso? No hay Programador; esa historia se ha extendido desde hace años. No me digas que el Frente realmente se ha creído el cuentito. Qué idiotas.,,"Ohjelmoitsija? Kuka sinulle on kertonut? Ei ole mitään Ohjelmoitsijaa. Tarina oli laitettu liikkeelle ajat sitten. Älä vain kerro, että Rintama oikeasti uskoi siihen höpöpuheeseen. Mitä idiootteja.",Programmeur? Qui vous a raconté ça? Il n'y a pas de Programmeur. Cette rumeur a commencé il y a des années. J'arrive pas à croire que ces abrutis du Front y croient. Idiots.,"Programozó? Ki mondta ezt neked? Nincs semmiféle programozó. Ez egy ezer éves történet. Azt ne mondd már, hogy a Front elhitte ezt a maszlagot. Idióták.",Programmatore? Ma chi te l'ha detto? Non c'è nessun Programmatore. Quella storia è stata diffusa un sacco di tempo fa. Non dirmi che il Fronte ha creduto a queste scempiaggini. Che idioti.,"プログラマー?誰ガそんなことヲ言った? +Programmer? Who told you that? There is no Programmer. That story was spread ages ago. Don't tell me the Front actually believed that crap. Idiots.,TXT_DLG_SCRIPT07_D6064_PROGR,MAP07: Computer room (northwest building).,,,"Programátor? Kdo ti to řekl? Není žádný Programátor. To je stará pověra. Neříkej mi, že tomu Fronta doopravdy věřila. Idioti.","Programmør? Hvem har fortalt dig det? Der er ingen programmør. Den historie blev spredt for længe siden. Fortæl mig ikke, at fronten troede på det lort. Idioter.","Programmierer? Wer hat dir das erzählt? Es gibt keinen Programmierer. Das ist eine alte Legende. Sag mir nicht, dass die Front an diesen Blödsinn glaubt. Idioten.",,"Ĉu Programisto? Kie vi aŭdis tion? Ne estas Programisto; tiu storio ekdisvastiĝis antaŭ jaroj. Ne diru, ke la Fronto kredis tian fekaĵon. Kiel stultaj.",¿Programador? ¿De dónde sacas eso? No hay Programador; esa historia se ha extendido desde hace años. No me digas que el Frente realmente se ha creído el cuentito. Qué idiotas.,,"Ohjelmoitsija? Kuka sinulle on kertonut? Ei ole mitään Ohjelmoitsijaa. Tarina oli laitettu liikkeelle ajat sitten. Älä vain kerro, että Rintama oikeasti uskoi siihen höpöpuheeseen. Mitä idiootteja.",Programmeur? Qui vous a raconté ça? Il n'y a pas de Programmeur. Cette rumeur a commencé il y a des années. J'arrive pas à croire que ces abrutis du Front y croient. Idiots.,,"Programozó? Ki mondta ezt neked? Nincs semmiféle programozó. Ez egy ezer éves történet. Azt ne mondd már, hogy a Front elhitte ezt a maszlagot. Idióták.",Programmatore? Ma chi te l'ha detto? Non c'è nessun Programmatore. Quella storia è stata diffusa un sacco di tempo fa. Non dirmi che il Fronte ha creduto a queste scempiaggini. Che idioti.,"プログラマー?誰ガそんなことヲ言った? ここにプログラマーハいない。 その噂ハ何年も前ニ広まったものダ。 そんな下らない事ヲ未だニ信じていたとは。 白痴モいいとこだ。","프로그래머? 누가 알려준 거야? 프로그래머 따위는 존재하지 않아. 이 소문이 몇 년 동안 계속 퍼졌다는 게 믿기지 않아. 프론트도 그 잡소문을 아직도 믿고 있던 모양이었고. 한심하네. \cy여기가 아닌가 봐. 다른 곳을 찾아봐야겠어.",Programmeur? Wie heeft je dat verteld? Er is geen programmeur. Dat verhaal is eeuwen geleden verspreid. Vertel me niet dat het Front die onzin echt geloofde. Idioten.,Programmerer? Hvem har sagt det? Det finnes ingen programmerer. Den historien ble spredt for lenge siden. Ikke fortell meg at Fronten faktisk trodde på den dritten. Idioter.,"Programista? Kto ci to powiedział? Nie ma żadnego Programisty. Ta historia została wymyślona wiele lat temu. Tylko mi nie mów, że Front wierzy w te bzdury. Idioci.",Programador? Quem te disse isso? Não existe nenhum Programador. Essa história anda se espalhando desde muito tempo. Não me diga que a Frente acreditou mesmo nessa bobagem. Otários.,,Programator? Cine ți-a spus asta? Nu e niciun Programator. Povestea asta a fost răspândită acum multă vreme. Nu-mi spune că Frontul chiar a crezut prostia asta. Idioți.,"Программист? Кто тебе это сказал? Нет никакого программиста. Этой байке уже сто лет. Только не говори мне, что Сопротивление и правда поверило в эту чушь. Идиоты.",,Programmerare? Vem har sagt det? Det finns ingen programmerare. Den historien spreds för länge sedan. Säg inte att fronten verkligen trodde på den skiten. Idioter.,Programcı mı? Bunu sana kim söyledi? Programcı diye biri yok. Bu hikaye yıllar önce yayıldı. Bana Cephe'nin bu saçmalığa gerçekten inandığını söyleme. Aptallar. -"Well, what's the truth then?",TXT_RPLY0_SCRIPT07_D6064_WELLW,〃,,,Kde je tedy pravda?,"Nå, hvad er sandheden så?","Nun, was ist denn die Wahrheit?",,"Tiuokaze, kiu estas la vero?",¿Entonces cuál es la verdad?,,"No, mikä totuus sitten on?","Quelle est la vérité, alors?","Nos, mi az igazság akkor?",E allora qual'è la verità?,それなら、本当の事は何だ?,"그럼, 진실이 뭐야?","Nou, wat is de waarheid dan?","Hva er sannheten, da?",Więc co jest prawdą?,"Bem, qual é a verdade?",,"Păi, care e adevărul atunci?","Ладно, и что же тогда правда?",,Vad är sanningen då?,"Peki, gerçek ne o zaman?" -I told you all I know. You are wasting your time.,TXT_DLG_SCRIPT07_D7580_ITOLD,〃,,,"Řekl jsem ti vše, co vím. Ztrácíš tu čas.","Jeg har fortalt dig alt, hvad jeg ved. Du spilder din tid.","Ich habe alles gesagt, was ich weiß. Du verschwendest deine Zeit.",,"Mi diris ĉion, kion mi scias. Vi perdas tempon.",Te he dicho todo lo que sé. Estás perdiendo el tiempo.,Ya te dije todo lo que sé. Estás perdiendo el tiempo.,"Minä kerroin jo kaiken, mitä tiedän. Tuhlaat aikaasi.",Je t'ai dit tous ce que je sais. Tu perds ton temps.,"Elmondtam mindent, amit tudtam. Csak az idődet vesztegeted.",Ti ho detto tutto quello che so. Stai sprecando il tuo tempo.,"私ハ知っていることヲ教えた。 +"Well, what's the truth then?",TXT_RPLY0_SCRIPT07_D6064_WELLW,〃,,,Kde je tedy pravda?,"Nå, hvad er sandheden så?","Nun, was ist denn die Wahrheit?",,"Tiuokaze, kiu estas la vero?",¿Entonces cuál es la verdad?,,"No, mikä totuus sitten on?","Quelle est la vérité, alors?",,"Nos, mi az igazság akkor?",E allora qual'è la verità?,それなら、本当の事は何だ?,"그럼, 진실이 뭐야?","Nou, wat is de waarheid dan?","Hva er sannheten, da?",Więc co jest prawdą?,"Bem, qual é a verdade?",,"Păi, care e adevărul atunci?","Ладно, и что же тогда правда?",,Vad är sanningen då?,"Peki, gerçek ne o zaman?" +I told you all I know. You are wasting your time.,TXT_DLG_SCRIPT07_D7580_ITOLD,〃,,,"Řekl jsem ti vše, co vím. Ztrácíš tu čas.","Jeg har fortalt dig alt, hvad jeg ved. Du spilder din tid.","Ich habe alles gesagt, was ich weiß. Du verschwendest deine Zeit.",,"Mi diris ĉion, kion mi scias. Vi perdas tempon.",Te he dicho todo lo que sé. Estás perdiendo el tiempo.,Ya te dije todo lo que sé. Estás perdiendo el tiempo.,"Minä kerroin jo kaiken, mitä tiedän. Tuhlaat aikaasi.",Je t'ai dit tous ce que je sais. Tu perds ton temps.,,"Elmondtam mindent, amit tudtam. Csak az idődet vesztegeted.",Ti ho detto tutto quello che so. Stai sprecando il tuo tempo.,"私ハ知っていることヲ教えた。 これ以上ハ互いニ時間ノ無駄ダ。",다 알려줬어. 시간 낭비하지 마.,Ik heb je alles verteld wat ik weet. Je verspilt je tijd.,Jeg har sagt alt jeg vet. Dere kaster bort tiden deres.,Powiedziałem ci wszystko co wiem. Marnujesz swój czas.,Eu já contei tudo o que eu sei. Você está perdendo tempo.,,"Ți-am spus tot ce știu, îți pierzi vremea.","Я рассказал всё, что знаю. Ты попусту тратишь время.",,Jag har berättat allt jag vet. Du slösar bort din tid.,Size tüm bildiklerimi anlattım. Zamanınızı boşa harcıyorsunuz. -"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D9096_FIGHT,MAP07: Font soldier.,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 +"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D9096_FIGHT,MAP07: Font soldier.,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",,Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 この日は我々と共に在る!","같이 싸우자! 우리들이 이길 거고, 밝은 날이 찾아올 거야!","Vecht verder, we zullen zegevieren. Deze dag zal van ons zijn!","Kjemp videre, vi vil seire. Denne dagen vil tilhøre oss!","Walcz dalej, i tak zwyciężymy. Dzień należy do nas!","Continue lutando, nós iremos triunfar. Este dia pertence a nós!",,"Continuă lupta, vom triumfa. Ziua asta ne aparține!","Сражайся, и нас ждёт триумф. Сегодняшний день будет нашим!",,"Kämpa vidare, vi kommer att triumfera. Den här dagen kommer att tillhöra oss!","Savaşmaya devam edin, zafere ulaşacağız. Bu gün bize ait olacak!" -"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D10612_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 +"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D10612_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",,Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 この日は我々と共に在る!",오늘이야말로 결전의 시간이야. 우리들이 바랬던 날을 위해!!,"Vecht verder, we zullen zegevieren. Deze dag zal van ons zijn!","Kjemp videre, vi vil seire. Denne dagen vil tilhøre oss!","Walcz dalej, i tak zwyciężymy. Dzień należy do nas!","Continue lutando, nós iremos triunfar. Este dia pertence a nós!",,"Continuă lupta, vom triumfa. Ziua asta ne aparține!","Сражайся, и нас ждёт триумф. Сегодняшний день будет нашим!",,"Kämpa vidare, vi kommer att triumfera. Den här dagen kommer att tillhöra oss!","Savaşmaya devam edin, zafere ulaşacağız. Bu gün bize ait olacak!" -"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D12128_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 +"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D12128_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",,Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 この日は我々と共に在る!","우리들 중 한 명이 죽는다 해도, 승리는 확신해. 잃을 게 없어!","Vecht verder, we zullen zegevieren. Deze dag zal van ons zijn!","Kjemp videre, vi vil seire. Denne dagen vil tilhøre oss!","Walcz dalej, i tak zwyciężymy. Dzień należy do nas!","Continue lutando, nós iremos triunfar. Este dia pertence a nós!",,"Continuă lupta, vom triumfa. Ziua asta ne aparține!","Сражайся, и нас ждёт триумф. Сегодняшний день будет нашим!",,"Kämpa vidare, vi kommer att triumfera. Den här dagen kommer att tillhöra oss!","Savaşmaya devam edin, zafere ulaşacağız. Bu gün bize ait olacak!" -"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D13644_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 +"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D13644_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",,Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 この日は我々と共に在る!","오더에 패배와 몰락을, 프론트에 인류와 영원한 자유를!","Vecht verder, we zullen zegevieren. Deze dag zal van ons zijn!","Kjemp videre, vi vil seire. Denne dagen vil tilhøre oss!","Walcz dalej, i tak zwyciężymy. Dzień należy do nas!","Continue lutando, nós iremos triunfar. Este dia pertence a nós!",,"Continuă lupta, vom triumfa. Ziua asta ne aparține!","Сражайся, и нас ждёт триумф. Сегодняшний день будет нашим!",,"Kämpa vidare, vi kommer att triumfera. Den här dagen kommer att tillhöra oss!","Savaşmaya devam edin, zafere ulaşacağız. Bu gün bize ait olacak!" -"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D15160_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 +"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D15160_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",,Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 この日は我々と共に在る!",희망 한가닥 작전을 위해! 오더여! 내가 돌아왔다!!,"Vecht verder, we zullen zegevieren. Deze dag zal van ons zijn!","Kjemp videre, vi vil seire. Denne dagen vil tilhøre oss!","Walcz dalej, i tak zwyciężymy. Dzień należy do nas!","Continue lutando, nós iremos triunfar. Este dia pertence a nós!",,"Continuă lupta, vom triumfa. Ziua asta ne aparține!","Сражайся, и нас ждёт триумф. Сегодняшний день будет нашим!",,"Kämpa vidare, vi kommer att triumfera. Den här dagen kommer att tillhöra oss!","Savaşmaya devam edin, zafere ulaşacağız. Bu gün bize ait olacak!" -"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D16676_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 +"Fight on, we will triumph. This day will belong to us!",TXT_DLG_SCRIPT07_D16676_FIGHT,〃,,,"Bojuj dál, však my zvítězíme! Dnešek bude patřit nám!","Kæmp videre, vi vil triumfere. Denne dag vil tilhøre os!","Lass uns kämpfen, wir werden gewinnen. Dieser Tag gehört uns!",,La batalo daŭru; ni venkos. Ĉi tiu tago estas nia!,"A seguir peleando, que hoy vamos a triunfar. ¡Este día es nuestro!",,"Jatkakaa taistoa, voitto on meidän. Tämä päivä kuuluu meille!","Continuez à vous battre, nous allons triompher! Ce jour nous appartient!",,Előre a győzelembe! Mi leszünk a nap győztesei!,"Continuate a combattere, trionferemo. Questo è il nostro giorno!","我々は勝利を志し、戦う。 この日は我々と共に在る!","슬프지만, 이 것은 전쟁이잖아.","Vecht verder, we zullen zegevieren. Deze dag zal van ons zijn!","Kjemp videre, vi vil seire. Denne dagen vil tilhøre oss!","Walcz dalej, i tak zwyciężymy. Dzień należy do nas!","Continue lutando, nós iremos triunfar. Este dia pertence a nós!",,"Continuă lupta, vom triumfa. Ziua asta ne aparține!","Сражайся, и нас ждёт триумф. Сегодняшний день будет нашим!",,"Kämpa vidare, vi kommer att triumfera. Den här dagen kommer att tillhöra oss!","Savaşmaya devam edin, zafere ulaşacağız. Bu gün bize ait olacak!" -"You killed all the guards. Don't hurt me. I told him this was a dumb idea. The real Programmer's in the keep. Here, take this key.",TXT_DLG_SCRIPT08_D0_YOUKI,MAP08: Northeast room.,,,"Tys zabil všechny stráže! Neubližuj mi. Já mu říkal, že to je hloupý nápad. Skutečný Programátor je v pevnosti. Tady, vem si tenhle klíč.","Du dræbte alle vagterne. Gør mig ikke noget. Jeg sagde til ham, at det var en dum idé. Den rigtige programmør er i tårnet. Her, tag denne nøgle.","Du hast alle Wächter getötet. Bitte tu mir nichts. Ich habe ihm gesagt, es wäre eine dumme Idee. Der Programmierer ist in seiner Unterkunft. Hier nimm diesen Schlüssel.",,"Vi mortigis ĉiujn gardistojn. Ne vundu min. Mi diris al li, ke ĉi tiu estas stulta ideo; la vera Programisto estas en la ĉefturo. Jen la ŝlosilo.","Has matado a todos los guardias. No me hagas nada. Le dije que era una idea estúpida; el verdadero Programador está en el torreón. Ten, toma esta llave.","Mataste a todos los guardias. No me hagas nada. Le dije que era una idea estúpida; el verdadero Programador está en el torreón. Ten, toma esta llave.","Tapoit kaikki vartijat. Älä satuta minua. Sanoin hänelle, että tämä oli tyhmä idea. Oikea Ohjelmoitsija on linnakkeessa. Tässä, ota tämä avain.",Vous avez tué tous les gardes. Ne me faites pas de mal. Je lui ai dit que c'était une idée stupide. Le vrai Programmeur se trouve dans le donjon. Prenez cette clé.,"Te ölted meg az összes őrt. Kérlek ne bánts. Én megmondtam, hogy ez egy rossz ötlet. Az igazi Programozó a vártoronyban van. Vidd ezt a kulcsot.","Hai ucciso tutte le guardie. Ho cercato di fargli capire che era un'idea stupida. Il vero Programmatore è nella fortezza. Ecco, prendi questa chiave.","君がガードを全員殺したノカ。 +"You killed all the guards. Don't hurt me. I told him this was a dumb idea. The real Programmer's in the keep. Here, take this key.",TXT_DLG_SCRIPT08_D0_YOUKI,MAP08: Northeast room.,,,"Tys zabil všechny stráže! Neubližuj mi. Já mu říkal, že to je hloupý nápad. Skutečný Programátor je v pevnosti. Tady, vem si tenhle klíč.","Du dræbte alle vagterne. Gør mig ikke noget. Jeg sagde til ham, at det var en dum idé. Den rigtige programmør er i tårnet. Her, tag denne nøgle.","Du hast alle Wächter getötet. Bitte tu mir nichts. Ich habe ihm gesagt, es wäre eine dumme Idee. Der Programmierer ist in seiner Unterkunft. Hier nimm diesen Schlüssel.",,"Vi mortigis ĉiujn gardistojn. Ne vundu min. Mi diris al li, ke ĉi tiu estas stulta ideo; la vera Programisto estas en la ĉefturo. Jen la ŝlosilo.","Has matado a todos los guardias. No me hagas nada. Le dije que era una idea estúpida; el verdadero Programador está en el torreón. Ten, toma esta llave.","Mataste a todos los guardias. No me hagas nada. Le dije que era una idea estúpida; el verdadero Programador está en el torreón. Ten, toma esta llave.","Tapoit kaikki vartijat. Älä satuta minua. Sanoin hänelle, että tämä oli tyhmä idea. Oikea Ohjelmoitsija on linnakkeessa. Tässä, ota tämä avain.",Vous avez tué tous les gardes. Ne me faites pas de mal. Je lui ai dit que c'était une idée stupide. Le vrai Programmeur se trouve dans le donjon. Prenez cette clé.,,"Te ölted meg az összes őrt. Kérlek ne bánts. Én megmondtam, hogy ez egy rossz ötlet. Az igazi Programozó a vártoronyban van. Vidd ezt a kulcsot.","Hai ucciso tutte le guardie. Ho cercato di fargli capire che era un'idea stupida. Il vero Programmatore è nella fortezza. Ecco, prendi questa chiave.","君がガードを全員殺したノカ。 私ハ傷つけないでくれ。 私ハ望んでこんなふざけた事をしたワケではない。 本当のプログラマーはこのキーの場所ニいる。 ほら、受け取れ。",경비들을 모조리 죽이시다니! 해치지 말아주세요. 제가 그분께 어리석은 짓이라고 제안을 했었는데... 진짜 프로그래머님은 성채에 있습니다. 이 열쇠를 쓰세요.,"Je hebt alle bewakers gedood. Doe me geen pijn. Ik zei hem dat dit een dom idee was. De echte programmeur is in de donjon. Hier, pak deze sleutel.","Du drepte alle vaktene. Ikke gjør meg noe. Jeg sa at dette var en dum idé. Den virkelige programmereren er i borgen. Her, ta denne nøkkelen.","Zabiłeś wszystkich strażników. Nie krzywdź mnie. Mówiłem mu, że to głupi pomysł. Prawdziwy Programista jest w twierdzy. Masz, weź ten klucz.","Você matou todos os guardas. Não me machuque. Eu disse a ele que isso era uma idéia besta. O verdadeiro Programador está na fortaleza. Aqui, pegue esta chave.",,Ai omorât toți gardienii. Nu mă rănii. I-am spus că e o idee proastă. Adevăratul Programator e înăuntru. Ia cheia asta.,"Ты убил всех стражников. Не трогай меня! Я говорил ему, что это глупая идея. Настоящий Программист в цитадели. Вот, возьми этот ключ.",,"Du dödade alla vakter. Gör mig inte illa. Jag sa till honom att detta var en dum idé. Den riktiga programmeraren är i fängelset. Här, ta den här nyckeln.","Bütün muhafızları öldürdün. Bana zarar vermeyin. Ona bunun aptalca bir fikir olduğunu söyledim. Gerçek Programcı kalede. İşte, al şu anahtarı." -You're the Programmer!,TXT_RPLY0_SCRIPT08_D0_YOURE,〃,,,Ty jsi Programátor!,"Det er dig, der er programmøren!",Du bist der Programmierer!,,Vi estas la Programisto!,¡Tú eres el Programador!,,Sinä olet Ohjelmoitsija!,Vous êtes le Programmeur!,Te vagy a Programozó!,Sei tu il Programmatore!,アンタがプログラマーだろ!,넌 프로그래머잖아!,Jij bent de programmeur!,Du er programmereren!,To ty jesteś Programistą!,Você é o Programador!,,Tu ești Programatorul!,Ты Программист!,,Du är programmeraren!,Programcı sensin! -"Do I look like I wield ultimate power? The Order uses us all. Now go, I'm dead already.",TXT_DLG_SCRIPT08_D1516_DOILO,〃,,,"Vypadám snad jako bych se měl pyšnit nesmírnou mocí? Řád nás všechny využívá. Teď jdi, já jsem už teď mrtvý.","Ser jeg ud, som om jeg udøver den ultimative magt? Ordenen bruger os alle. Gå nu, jeg er allerede død.","Sehe ich so aus, als ob ich unendliche Macht hätte? Der Orden benutzt uns alle. Nun geh, ich bin ohnehin schon tot.",,"Ĉu mi aspektas kiel posedanto de absoluta povo? La Ordeno uzas nin ĉiujn. Foriru, mi jam estas mortinta.","¿Te parezco poseer el poder absoluto? La Orden nos usa a todos. Ya vete, que yo ya estoy muerto.",,"Näytänkö muka sellaiselta, joka pitää hallussaan täyttä valtaa? Veljeskunta käyttää hyväkseen meitä kaikkia. Mene, olen jo yhtä kuin kuollut.","Est-ce que j'ai l'air d'avoir le pouvoir suprême? L'Ordre nous utilise tous. Partez, je suis déjà mort.","Úgy nézek ki, mint aki mindenki felett erőt gyakorol? A Rend kihasznál mindannyiunkat. Menj tovább, Én már amúgyis halott vagyok.","Davvero ti sembro uno che possiede poteri sovrumani? L'Ordine ci usa tutti. Adesso vai, tanto io sono spacciato ormai.","私ガそんな凄まじい力ヲ振舞っていると思うか? +You're the Programmer!,TXT_RPLY0_SCRIPT08_D0_YOURE,〃,,,Ty jsi Programátor!,"Det er dig, der er programmøren!",Du bist der Programmierer!,,Vi estas la Programisto!,¡Tú eres el Programador!,,Sinä olet Ohjelmoitsija!,Vous êtes le Programmeur!,,Te vagy a Programozó!,Sei tu il Programmatore!,アンタがプログラマーだろ!,넌 프로그래머잖아!,Jij bent de programmeur!,Du er programmereren!,To ty jesteś Programistą!,Você é o Programador!,,Tu ești Programatorul!,Ты Программист!,,Du är programmeraren!,Programcı sensin! +"Do I look like I wield ultimate power? The Order uses us all. Now go, I'm dead already.",TXT_DLG_SCRIPT08_D1516_DOILO,〃,,,"Vypadám snad jako bych se měl pyšnit nesmírnou mocí? Řád nás všechny využívá. Teď jdi, já jsem už teď mrtvý.","Ser jeg ud, som om jeg udøver den ultimative magt? Ordenen bruger os alle. Gå nu, jeg er allerede død.","Sehe ich so aus, als ob ich unendliche Macht hätte? Der Orden benutzt uns alle. Nun geh, ich bin ohnehin schon tot.",,"Ĉu mi aspektas kiel posedanto de absoluta povo? La Ordeno uzas nin ĉiujn. Foriru, mi jam estas mortinta.","¿Te parezco poseer el poder absoluto? La Orden nos usa a todos. Ya vete, que yo ya estoy muerto.",,"Näytänkö muka sellaiselta, joka pitää hallussaan täyttä valtaa? Veljeskunta käyttää hyväkseen meitä kaikkia. Mene, olen jo yhtä kuin kuollut.","Est-ce que j'ai l'air d'avoir le pouvoir suprême? L'Ordre nous utilise tous. Partez, je suis déjà mort.",,"Úgy nézek ki, mint aki mindenki felett erőt gyakorol? A Rend kihasznál mindannyiunkat. Menj tovább, Én már amúgyis halott vagyok.","Davvero ti sembro uno che possiede poteri sovrumani? L'Ordine ci usa tutti. Adesso vai, tanto io sono spacciato ormai.","私ガそんな凄まじい力ヲ振舞っていると思うか? オーダーハ私達全員を利用している。 私ハもう死人同然だ。さあ行け。","제가 신적인 힘을 갖고 있다고 생각하나요? 오더는 어차피 모두를 부려먹습니다. 떠나세요, 전 이미 죽은 목숨이에요.","Zie ik eruit alsof ik de ultieme macht heb? De Orde gebruikt ons allemaal. Ga nu, ik ben al dood.","Ser jeg ut som om jeg har den ultimate makten? Ordenen bruker oss alle. Gå nå, jeg er allerede død.","Czy wyglądam jakbym był we władaniu niesamowitej mocy? Zakon wykorzystuje nas wszystkich. Idź stąd, i tak już jestem martwy.",Você acha que eu pareço alguém que possui um poder tremendo? A Ordem manipula a todos nós. Agora vá. Eu já estou morto.,,"Ți se pare că controlez puterea supremă? Ordinul ne folosește pe toți. Acum pleacă, sunt mort deja.",Разве я похож на обладателя невероятной мощи? Орден использует нас всех. Теперь иди. Я уже всё равно мёртв.,,"Ser jag ut som om jag har den ultimata makten? Orden använder oss alla. Gå nu, jag är redan död.","Nihai güce sahipmişim gibi mi görünüyorum? Tarikat hepimizi kullanır. Şimdi git, ben zaten ölüyüm." -Power is the key!,TXT_DLG_SCRIPT08_D3032_POWER,,,,Moc je tím klíčem!,Magt er nøglen!,Macht ist der Schlüssel!,,Povo estas la ŝlosilo!,¡El poder es la clave!,,Valta on avain!,Le pouvoir est la clé!,Az erő a kulcs!,Il potere è la chiave!,キーが力だ!,힘이 곧 열쇠다!,Kracht is de sleutel!,Makt er nøkkelen!,Moc jest kluczem!,O poder é a chave!,,Puterea e cheia!,В силе — всё!,,Makt är nyckeln!,Güç anahtardır! -"Good, you're conscious again. When you grabbed that item the Programmer dropped, you let loose some terrible secrets.",TXT_DLG_SCRIPT10_D0_GOODY,MAP10: Macil.,,,"Už jsi vzhůru, dobře. Když jsi sebral tu věc, kterou Programátor upustil, odhalil jsi děsivá tajemství.","Godt, du er ved bevidsthed igen. Da du greb den genstand, som programmøren tabte, slap du nogle frygtelige hemmeligheder løs.","Gut, du bist wieder wach. Als du das Ding, das der Programmierer fallengelassen hat, packtest, hast du einige schlimme Geheimnisse enthüllt.",,"Bone, vi jam rekonsciiĝis. Kelkaj teruraj sekretoj malkovriĝis kiam vi prenis tiun objekton, kiu elfalis el la Programisto.","Bien, ya has despertado. Se han revelado un par de secretos terribles en cuanto has cogido el objeto ese que se le ha caído al Programador.","Bien, ya despertaste. Se revelaron un par de secretos terribles en cuanto agarraste el objeto ese que se le cayó al Programador.","Hyvä, olet jälleen tajuissasi. Kaapattuasi esineen, jonka Ohjelmoitsija oli pudottanut, toit valoon kauhistuttavia salaisuuksia.","Bien. Vous êtes conscient. Quand vous avez pris ceci au Programmeur, vous avez libéré de terrible secrets.","Remek, magadhoz tértél. Amikor megmarkoltad a tárgyat amit a Programozó elejtett, elég sok titokra fény derült.","Meno male, sei di nuovo conscio. Quando hai preso quell'oggetto dal Programmatore, hai scoperchiato dei terribili segreti.","良し、意識が戻ったか。 +Power is the key!,TXT_DLG_SCRIPT08_D3032_POWER,,,,Moc je tím klíčem!,Magt er nøglen!,Macht ist der Schlüssel!,,Povo estas la ŝlosilo!,¡El poder es la clave!,,Valta on avain!,Le pouvoir est la clé!,,Az erő a kulcs!,Il potere è la chiave!,キーが力だ!,힘이 곧 열쇠다!,Kracht is de sleutel!,Makt er nøkkelen!,Moc jest kluczem!,O poder é a chave!,,Puterea e cheia!,В силе — всё!,,Makt är nyckeln!,Güç anahtardır! +"Good, you're conscious again. When you grabbed that item the Programmer dropped, you let loose some terrible secrets.",TXT_DLG_SCRIPT10_D0_GOODY,MAP10: Macil.,,,"Už jsi vzhůru, dobře. Když jsi sebral tu věc, kterou Programátor upustil, odhalil jsi děsivá tajemství.","Godt, du er ved bevidsthed igen. Da du greb den genstand, som programmøren tabte, slap du nogle frygtelige hemmeligheder løs.","Gut, du bist wieder wach. Als du das Ding, das der Programmierer fallengelassen hat, packtest, hast du einige schlimme Geheimnisse enthüllt.",,"Bone, vi jam rekonsciiĝis. Kelkaj teruraj sekretoj malkovriĝis kiam vi prenis tiun objekton, kiu elfalis el la Programisto.","Bien, ya has despertado. Se han revelado un par de secretos terribles en cuanto has cogido el objeto ese que se le ha caído al Programador.","Bien, ya despertaste. Se revelaron un par de secretos terribles en cuanto agarraste el objeto ese que se le cayó al Programador.","Hyvä, olet jälleen tajuissasi. Kaapattuasi esineen, jonka Ohjelmoitsija oli pudottanut, toit valoon kauhistuttavia salaisuuksia.","Bien. Vous êtes conscient. Quand vous avez pris ceci au Programmeur, vous avez libéré de terrible secrets.",,"Remek, magadhoz tértél. Amikor megmarkoltad a tárgyat amit a Programozó elejtett, elég sok titokra fény derült.","Meno male, sei di nuovo conscio. Quando hai preso quell'oggetto dal Programmatore, hai scoperchiato dei terribili segreti.","良し、意識が戻ったか。 君がプログラマーの遺品を拾った時に 恐ろしい秘密が解放されたのだ。","아, 드디어 깨어났군요. 프로그래머가 죽고 나서 얻은 저 물건을 쥐는 동안 우리는 그것에 대한 끔찍한 비밀을 밝혀냈습니다...","Goed, je bent weer bij bewustzijn. Toen je dat item pakte, liet de programmeur je een aantal vreselijke geheimen los.","Bra, du er ved bevissthet igjen. Da du tok den gjenstanden programmereren mistet, slapp du løs noen forferdelige hemmeligheter.","Dobrze, znów jesteś przytomny. Kiedy podniosłeś ten przedmiot, który upuścił Programista, uwolnniłeś wiele strasznych sekretów.","Ótimo, já está consciente de novo. Quando você pegou o item que o Programador largou você deixou escapar alguns segredos terríveis.",,"Bun, ești conștient din nou. Când ai pus mâna pe obiectul ăla Programatorul ți-a dat drumul ca să elibereze niște secrete oribile.","Хорошо, ты пришёл в себя. Взяв в руки артефакт, который выронил Программист, ты раскрыл страшные тайны.",,"Bra, du är vid medvetande igen. När du tog tag i föremålet som programmeraren tappade släppte du lös några hemska hemligheter.","Güzel, tekrar kendine geldin. Programcı'nın düşürdüğü o eşyayı aldığında, bazı korkunç sırları açığa çıkardın." -What kind of secrets. ,TXT_RPLY0_SCRIPT10_D0_WHATK,〃,,,Jaká tajemství?,Hvilken slags hemmeligheder?,Was für Geheimnisse?,,Kiaj sekretoj?,¿Qué clase de secretos?,,Minkälaisia salaisuuksia?,De quels secrets parlez-vous?,Miféle titkok?,Che tipo di segreti.,その秘密とは。,어떤 비밀인가요?,Wat voor geheimen.,Hva slags hemmeligheter?,Jakich sekretów?,Que tipos de segredos?,,Ce fel de secrete?,Какие тайны?,,Vad för slags hemligheter.,Ne tür sırlar? -"We have no idea where this weapon came from, but we must find out. You have wrested one from the Order, but we must have all five. We have reached the limits of my knowledge. Seek out the Oracle and ask it for help.",TXT_DLG_SCRIPT10_D1516_WEHAV,〃,,,"Nemáme tušení, odkud se tato zbraň vzala, ale musíme to zjistit. Jednu část jsi z rukou Řádu už umanul, ale musíme najít všech pět. Dosáhli jsme hranic mých vědomostí. Vyhledej Věštce a požádej jej o pomoc.","Vi har ingen anelse om, hvor dette våben kommer fra, men vi må finde ud af det. Du har vristet en fra Ordenen, men vi skal have alle fem. Vi har nået grænserne for min viden. Opsøg Oraklet og bed det om hjælp.","Wir haben keine Ahnung, wo diese Waffe herkommt, aber wir müssen es herausfinden. Du hast ein Teil dem Orden entrungen aber wir brauchen alle fünf. Wir haben die Grenzen meines Wissens erreicht. Suche das Orakel und frage es um Hilfe.",,"Ni ne konas la originon de ĉi tiu armilo, sed ni devas malkovri ĝin. Vi jam prenis pecon el La Ordeno kaj ni bezonas la aliajn kvar. Ĝis ĉi tie ĉio, kion mi scias. Serĉu la Orakolon kaj petu lin pri helpo.","No sabemos de dónde habrá salido esta arma, pero hay que averiguarlo. Ya le has quitado una pieza a La Orden y nos estarían faltando las otras cuatro. Hasta ahí todo lo que sé. Busca al Oráculo y pídele ayuda.","No sabemos de dónde habrá salido esta arma, pero hay que averiguarlo. Ya le quitaste una pieza a La Orden y nos estarían faltando las otras cuatro. Hasta ahí todo lo que sé. Busca al Oráculo y pídele ayuda.","Meillä ei ole aavistustakaan tämän aseen alkuperästä, mutta se on selvitettävä. Olet nyt riistänyt Veljeskunnan käsistä yhden, mutta meidän on saatava kaikki viisi. Oma tietämykseni päättyy tähän. Etsi apua Oraakkelilta.","Je n'ai aucune idée d'où vient cette arme, mais il faut que nous le découvrions. Vous en avez arraché une à l'Ordre, mais il faut trouver toutes les cinq. C'est tout ce que je sais pour l'instant. Allez voir l'Oracle et demandez son aide.","Nem tudjuk mi ennek a fegyvernek az eredete, de ki kell derítenünk. Elcsentél egyet a Rendtől, de meg kell szereznünk mind az ötöt. Elértük a tudásom határát. Keresd fel az Orákulumot, és kérdd a segítségét.","Non abbiamo alcuna idea su dove quest'arma provenga, ma dobbiamo scoprirlo. Ne hai sottratto una all'Ordine, ma dobbiamo ottenerle tutte e cinque. E qui abbiamo raggiunto il limite della mia conoscienza. Devi raggiungere l'Oracolo e chiedergli aiuto.","この武器が何処で造られたかは分からないが、 +What kind of secrets. ,TXT_RPLY0_SCRIPT10_D0_WHATK,〃,,,Jaká tajemství?,Hvilken slags hemmeligheder?,Was für Geheimnisse?,,Kiaj sekretoj?,¿Qué clase de secretos?,,Minkälaisia salaisuuksia?,De quels secrets parlez-vous?,,Miféle titkok?,Che tipo di segreti.,その秘密とは。,어떤 비밀인가요?,Wat voor geheimen.,Hva slags hemmeligheter?,Jakich sekretów?,Que tipos de segredos?,,Ce fel de secrete?,Какие тайны?,,Vad för slags hemligheter.,Ne tür sırlar? +"We have no idea where this weapon came from, but we must find out. You have wrested one from the Order, but we must have all five. We have reached the limits of my knowledge. Seek out the Oracle and ask it for help.",TXT_DLG_SCRIPT10_D1516_WEHAV,〃,,,"Nemáme tušení, odkud se tato zbraň vzala, ale musíme to zjistit. Jednu část jsi z rukou Řádu už umanul, ale musíme najít všech pět. Dosáhli jsme hranic mých vědomostí. Vyhledej Věštce a požádej jej o pomoc.","Vi har ingen anelse om, hvor dette våben kommer fra, men vi må finde ud af det. Du har vristet en fra Ordenen, men vi skal have alle fem. Vi har nået grænserne for min viden. Opsøg Oraklet og bed det om hjælp.","Wir haben keine Ahnung, wo diese Waffe herkommt, aber wir müssen es herausfinden. Du hast ein Teil dem Orden entrungen aber wir brauchen alle fünf. Wir haben die Grenzen meines Wissens erreicht. Suche das Orakel und frage es um Hilfe.",,"Ni ne konas la originon de ĉi tiu armilo, sed ni devas malkovri ĝin. Vi jam prenis pecon el La Ordeno kaj ni bezonas la aliajn kvar. Ĝis ĉi tie ĉio, kion mi scias. Serĉu la Orakolon kaj petu lin pri helpo.","No sabemos de dónde habrá salido esta arma, pero hay que averiguarlo. Ya le has quitado una pieza a La Orden y nos estarían faltando las otras cuatro. Hasta ahí todo lo que sé. Busca al Oráculo y pídele ayuda.","No sabemos de dónde habrá salido esta arma, pero hay que averiguarlo. Ya le quitaste una pieza a La Orden y nos estarían faltando las otras cuatro. Hasta ahí todo lo que sé. Busca al Oráculo y pídele ayuda.","Meillä ei ole aavistustakaan tämän aseen alkuperästä, mutta se on selvitettävä. Olet nyt riistänyt Veljeskunnan käsistä yhden, mutta meidän on saatava kaikki viisi. Oma tietämykseni päättyy tähän. Etsi apua Oraakkelilta.","Je n'ai aucune idée d'où vient cette arme, mais il faut que nous le découvrions. Vous en avez arraché une à l'Ordre, mais il faut trouver toutes les cinq. C'est tout ce que je sais pour l'instant. Allez voir l'Oracle et demandez son aide.",,"Nem tudjuk mi ennek a fegyvernek az eredete, de ki kell derítenünk. Elcsentél egyet a Rendtől, de meg kell szereznünk mind az ötöt. Elértük a tudásom határát. Keresd fel az Orákulumot, és kérdd a segítségét.","Non abbiamo alcuna idea su dove quest'arma provenga, ma dobbiamo scoprirlo. Ne hai sottratto una all'Ordine, ma dobbiamo ottenerle tutte e cinque. E qui abbiamo raggiunto il limite della mia conoscienza. Devi raggiungere l'Oracolo e chiedergli aiuto.","この武器が何処で造られたかは分からないが、 我々はそれを突き止める必要がある様だ。 どうやら全部で5つあり、君はオーダーから 1つ手に入れている。我々の理解を超える存在だ オラクルを探し何か情報を得なければ。","이 무기가 어디서 왔는지는 모르겠다만, 얼른 찾아내야만 합니다. 그 한 조각을 비롯한 나머지 '다섯' 조각도 필요합니다. 제가 알고 있는 건 이게 다입니다. 오라클이라는 자를 만나서 도움을 요청해보세요.","We hebben geen idee waar dit wapen vandaan komt, maar we moeten erachter komen. Je hebt er een uit de Orde weggehaald, maar we moeten ze alle vijf hebben. We hebben de grenzen van mijn kennis bereikt. Zoek het Orakel op en vraag het om hulp.","Vi aner ikke hvor våpenet kom fra, men vi må finne det ut. Du har vristet ett fra Ordenen, men vi må ha alle fem. Vi har nådd grensen for min kunnskap. Oppsøk oraklet og be det om hjelp.","Nie mamy pojęcia skąd ta broń pochodzi, ale musimy się dowiedzieć. Wyrwałeś jedną z łap Zakonu, ale musimy zdobyć wszystkie pięć. Osiągnęliśmy szczyt tego co wiem. Poszukaj Wyroczni i poproś ją o pomoc.","Não fazemos idéia de onde esta arma veio, mas precisamos descobrir. Você conseguiu roubar um deles da Ordem, mas precisamos de todos os cinco. Já atingimos os limites do meu conhecimento. Procure o Oráculo e peça a ajuda dele.",,"Nu avem nicio idee în legătură cu proveniența armei, dar trebuie să aflăm. Ai luat una de la Ordin, dar avem nevoie de toate 5. Am ajuns la capătul cunoștiințelor mele. Mergi în căutarea Oracolului, și cere-i ajutorul.","Мы понятия не имеем, откуда взялось это оружие, но обязаны выяснить. Ты отбил один фрагмент у Ордена, но нам нужны все пять. Я рассказал тебе всё, что знал. Найди Оракула и попроси его о помощи.",,"Vi har ingen aning om var det här vapnet kom ifrån, men vi måste ta reda på det. Du har vridit en från Orden, men vi måste få alla fem. Vi har nått gränsen för min kunskap. Sök upp Oraklet och be det om hjälp.",Bu silahın nereden geldiğini bilmiyoruz ama öğrenmeliyiz. Tarikat'tan bir tane aldınız ama beşini de almalıyız. Bilgimin sınırlarına ulaştık. Kahin'i ara ve ondan yardım iste. -I'm gonna need more supplies.,TXT_RPLY0_SCRIPT10_D1516_IMGON,〃,,,Budu potřebovat zásoby.,Jeg får brug for flere forsyninger.,Ich brauche mehr Ausrüstung.,,Mi bezonos pliajn provizojn.,Voy a necesitar más suministros.,,Tarvitsen lisää varusteita.,Il me faut de l'équipment.,Szükségem lesz még felszerelésre.,Mi serviranno più provviste.,それには補給がもっと必要だ。,물자가 좀 필요할 것 같은데.,Ik zal meer voorraden nodig hebben.,Jeg trenger flere forsyninger.,Będę potrzebować więcej zaopatrzenia.,Vou precisar de mais equipmento.,,O să am nevoie de mai multe provizii.,Мне потребуются ещё припасы.,,Jag kommer att behöva mer förnödenheter.,Daha fazla malzemeye ihtiyacım olacak. -"Here's some gold. Go visit the medic and the weapons trainer and then, move out!",TXT_DLG_SCRIPT10_D3032_HERES,〃,,,"Tady je nějaké zlato. Jdi navštívit zdravotníka a zbraňmistra, a pak odchod!","Her er noget guld. Besøg lægen og våbentræneren, og så af sted!",Hier ist etwas Gold. Geh zum Sanitäter und zum Waffentrainer und dann los!,,"Jen iom da oro. Iru renkonti la kuraciston kaj la armilan trejniston, kaj tiam ekagu!","Aquí tienes algo de oro. Ve a ver al médico y al entrenador de armas y luego, ¡en marcha!",,"Tässä vähän kultaa. Tapaa lääkintämiestä ja asekouluttajaa, ja sen jälkeen lähde matkaan!","Voilà de l'argent. Allez voir le médecin et le maître d'armes, puis partez!","Itt van egy kis arany. Keresd fel a szanitécot és a fegyvermestert, aztán indulás!","Ecco dell'oro. Visita il dottore e l'istruttore d'armi, e poi, è tempo di muoversi!","資金を提供しよう。 +I'm gonna need more supplies.,TXT_RPLY0_SCRIPT10_D1516_IMGON,〃,,,Budu potřebovat zásoby.,Jeg får brug for flere forsyninger.,Ich brauche mehr Ausrüstung.,,Mi bezonos pliajn provizojn.,Voy a necesitar más suministros.,,Tarvitsen lisää varusteita.,Il me faut de l'équipment.,,Szükségem lesz még felszerelésre.,Mi serviranno più provviste.,それには補給がもっと必要だ。,물자가 좀 필요할 것 같은데.,Ik zal meer voorraden nodig hebben.,Jeg trenger flere forsyninger.,Będę potrzebować więcej zaopatrzenia.,Vou precisar de mais equipmento.,,O să am nevoie de mai multe provizii.,Мне потребуются ещё припасы.,,Jag kommer att behöva mer förnödenheter.,Daha fazla malzemeye ihtiyacım olacak. +"Here's some gold. Go visit the medic and the weapons trainer and then, move out!",TXT_DLG_SCRIPT10_D3032_HERES,〃,,,"Tady je nějaké zlato. Jdi navštívit zdravotníka a zbraňmistra, a pak odchod!","Her er noget guld. Besøg lægen og våbentræneren, og så af sted!",Hier ist etwas Gold. Geh zum Sanitäter und zum Waffentrainer und dann los!,,"Jen iom da oro. Iru renkonti la kuraciston kaj la armilan trejniston, kaj tiam ekagu!","Aquí tienes algo de oro. Ve a ver al médico y al entrenador de armas y luego, ¡en marcha!",,"Tässä vähän kultaa. Tapaa lääkintämiestä ja asekouluttajaa, ja sen jälkeen lähde matkaan!","Voilà de l'argent. Allez voir le médecin et le maître d'armes, puis partez!",,"Itt van egy kis arany. Keresd fel a szanitécot és a fegyvermestert, aztán indulás!","Ecco dell'oro. Visita il dottore e l'istruttore d'armi, e poi, è tempo di muoversi!","資金を提供しよう。 そしてメディックと訓練士に会い装備を整えて、 向かいたまえ!",골드를 좀 받으세요. 의무관이랑 무기 담당관을 찾아뵈시고 이동하시길!,Hier is wat goud. Ga naar de dokter en de wapentrainer en ga dan weg!,"Her er litt gull. Gå til legen og våpentreneren, og så drar vi!","Masz tu trochę złota. Odwiedź medyka i trenera od broni, a potem wykonać!",Pegue este dinheiro. Vá ver o médico e o treinador de armas e depois parta para a missão.,,"Uite niște aur. Vizitează medicul și antrenorul de arme iar apoi, dă-i drumul!","Вот немного золота. Посети медика и инструктора по стрельбе, и выдвигайся!",,"Här är lite guld. Gå och besök läkaren och vapentränaren och sedan, sätt fart!",İşte biraz altın. Sıhhiyeciyi ve silah eğitmenini ziyaret et ve sonra yola çık! -Right!,TXT_RPLY0_SCRIPT10_D3032_RIGHT,〃,,,Ano!,Så går vi.,Ja.,,Kompreneble!,¡A la orden!,,Selvä!,Bien!,Igenis!,Sarà fatto!,わかった!,네!,Juist!,Skal bli!,Dobrze!,Certo!,,Într-adevăr!,Есть!,,Okej!,Tamamdır! -Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT10_D4548_FIGHT,〃,,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het front en vrijheid. Verhuizen.,Kjemp for fronten og friheten. Av sted med dere.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. -"What prompts your return? Are you hurt? There's no time to lose, continue with your mission. Complete the Sigil.",TXT_DLG_SCRIPT10_D6064_WHATP,MAP10: Macil → The Oracle said to kill him,,,"Co přimělo tvůj návrát? Jsi zraněný? Není času nazbyt, pokračuj ve své misi. Dokonči Pečeť.","Hvad får dig til at vende tilbage? Er du såret? Der er ingen tid at spilde, fortsæt med din mission. Færdiggør sigilet.","Warum kommst du zurück? Bist du verletzt? Wir haben keine Zeit zu verlieren, du musst deine Mission fortsetzen. Vervollständige das Sigil.",,"Kial vi revenis? Ĉu vi estas vundita? Ne estas perdinda tempo, reiru al via komisio: kompletigu la Sigelon.","¿A qué has vuelto?, ¿estás herido? No hay tiempo que perder, continúa con la misión: completa el Emblema.","¿A qué volviste?, ¿estás herido? No hay tiempo que perder, continúa con la misión: completa el Emblema.",Miksi olet palannut? Oletko loukkaantunut? Aikaa ei ole menetettävänä; jatka tehtävääsi. Kokoa Sinetti.,"Qu'est ce qui vous amène? Vous avez mal? Il n'y a pas de temps à perdre. Continuez votre mission, complétez le Sigil.","Hogyhogy ilyen hamar visszatértél? Megsebesültél? Nem vesztegethetjük az időt, folytasd a küldetésed. Fejezd be a pecsétet.","Come mai già di ritorno? Sei ferito? Non c'è tempo da perdere, continua la tua missione. Completa il Sigillo.","何が帰還を促した?怪我をしたのか? +Right!,TXT_RPLY0_SCRIPT10_D3032_RIGHT,〃,,,Ano!,Så går vi.,Ja.,,Kompreneble!,¡A la orden!,,Selvä!,Bien!,,Igenis!,Sarà fatto!,わかった!,네!,Juist!,Skal bli!,Dobrze!,Certo!,,Într-adevăr!,Есть!,,Okej!,Tamamdır! +Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT10_D4548_FIGHT,〃,,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het front en vrijheid. Verhuizen.,Kjemp for fronten og friheten. Av sted med dere.,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. +"What prompts your return? Are you hurt? There's no time to lose, continue with your mission. Complete the Sigil.",TXT_DLG_SCRIPT10_D6064_WHATP,MAP10: Macil → The Oracle said to kill him,,,"Co přimělo tvůj návrát? Jsi zraněný? Není času nazbyt, pokračuj ve své misi. Dokonči Pečeť.","Hvad får dig til at vende tilbage? Er du såret? Der er ingen tid at spilde, fortsæt med din mission. Færdiggør sigilet.","Warum kommst du zurück? Bist du verletzt? Wir haben keine Zeit zu verlieren, du musst deine Mission fortsetzen. Vervollständige das Sigil.",,"Kial vi revenis? Ĉu vi estas vundita? Ne estas perdinda tempo, reiru al via komisio: kompletigu la Sigelon.","¿A qué has vuelto?, ¿estás herido? No hay tiempo que perder, continúa con la misión: completa el Emblema.","¿A qué volviste?, ¿estás herido? No hay tiempo que perder, continúa con la misión: completa el Emblema.",Miksi olet palannut? Oletko loukkaantunut? Aikaa ei ole menetettävänä; jatka tehtävääsi. Kokoa Sinetti.,"Qu'est ce qui vous amène? Vous avez mal? Il n'y a pas de temps à perdre. Continuez votre mission, complétez le Sigil.",,"Hogyhogy ilyen hamar visszatértél? Megsebesültél? Nem vesztegethetjük az időt, folytasd a küldetésed. Fejezd be a pecsétet.","Come mai già di ritorno? Sei ferito? Non c'è tempo da perdere, continua la tua missione. Completa il Sigillo.","何が帰還を促した?怪我をしたのか? 屈している場合ではない。 シジルを完成させる使命を果たすんだ。",돌아왔습니까? 상처라도 입었나요? 시간이 없으니 임무를 속행하고 시질 조각을 마저 모으시길 바랍니다.,"Wat zet je ertoe aan om terug te keren? Ben je gewond? Er is geen tijd te verliezen, ga verder met je missie. Voltooi de Sigil.","Hvorfor kommer du tilbake? Er du såret? Det er ingen tid å miste, fortsett med oppdraget ditt. Fullfør sigillet.","Co skłoniło cię do powrotu? Jesteś ranny? Nie ma czasu do stracenia, kontynuuj swą misję. Uzupełnij Pieczęć.",O que fez você retornar? Você está ferido? Não há tempo a perder. Continue com a sua missão. Complete o Sigilo.,,"Ce te aduce înapoi? Nu avem timp de pierdut, continuă-ți misiunea. Asamblează Sigiliul.",С какой целью ты вернулся? Ты ранен? Нельзя терять ни минуты. Продолжай выполнение задания. Собери Печать!,,"Vad föranleder din återkomst? Är du skadad? Det finns ingen tid att förlora, fortsätt med ditt uppdrag. Slutför Sigillet.","Geri dönmene ne sebep oldu? Yaralandın mı? Kaybedecek zaman yok, görevinize devam edin. Sigil'i tamamla." -The Oracle says you must die!,TXT_RPLY0_SCRIPT10_D6064_THEOR,〃,,,"Věštec říká, že musíš zemřít!","Oraklet siger, at du skal dø!","Das Orakel sagt, du musst sterben.",,"La Orakolo diras, ke vi devas morti!",¡El Oráculo dice que debes morir!,,"Oraakkeli sanoo, että sinun pitää kuoleman!",L'Oracle dit que vous devez mourir!,"Az Orákulum azt üzeni, hogy meg kell halnod!",L'Oracolo mi ha detto che devi morire!,オラクルは死ぬべきだと言った!,오라클의 이름으로 넌 죽어야 해!,Het Orakel zegt dat je moet sterven!,Oraklet sier at du må dø!,Wyrocznia mówi że musisz zginąć!,O Oráculo diz que você deve morrer!,,Oracolul spune că trebuie să mori!,"Оракул сказал, что я должен убить тебя!",,Oraklet säger att du måste dö!,Kahin ölmen gerektiğini söylüyor! -I have sworn myself to freedom. It is the Oracle who holds the third piece. There's your traitor.,TXT_DLG_SCRIPT10_D7580_IHAVE,〃,,,"Já jsem zapřísáhnut svobodě! Věštec je ten, kdo má u sebe třetí díl. On je ten zrádce.","Jeg har svoret mig selv til frihed. Det er Oraklet, der har den tredje del. Der er din forræder.",Ich habe mich der Freiheit verpflichtet. Das Orakel besitzt das dritte Teilstück. Dort ist dein Verräter.,,"Mi faris ĵuron de libereco. La Orakolo estas tiu, kiu havas la trian pecon: tie estas via perfidulo.",Hice un juramento por la libertad. Es el Oráculo quien tiene la tercera pieza: ahí está tu traidor.,,Olen vannonut itseni vapauteen. Kolmas osanen on Oraakkelin hallussa. Siinä on petturisi.,J'ai juré donner ma vie à la liberté. C'est l'Oracle qui porte la troisième pièce. Voilà votre traître.,Felesküdtem a szabadságra. Az Orákulumnál van a harmadik darab. Ő lesz az árulód.,Io ho dedicato tutto me stesso alla libertà. È l'Oracolo che tiene il terzo pezzo. Ecco chi è il traditore.,"私は皆の自由を誓った。 +The Oracle says you must die!,TXT_RPLY0_SCRIPT10_D6064_THEOR,〃,,,"Věštec říká, že musíš zemřít!","Oraklet siger, at du skal dø!","Das Orakel sagt, du musst sterben.",,"La Orakolo diras, ke vi devas morti!",¡El Oráculo dice que debes morir!,,"Oraakkeli sanoo, että sinun pitää kuoleman!",L'Oracle dit que vous devez mourir!,,"Az Orákulum azt üzeni, hogy meg kell halnod!",L'Oracolo mi ha detto che devi morire!,オラクルは死ぬべきだと言った!,오라클의 이름으로 넌 죽어야 해!,Het Orakel zegt dat je moet sterven!,Oraklet sier at du må dø!,Wyrocznia mówi że musisz zginąć!,O Oráculo diz que você deve morrer!,,Oracolul spune că trebuie să mori!,"Оракул сказал, что я должен убить тебя!",,Oraklet säger att du måste dö!,Kahin ölmen gerektiğini söylüyor! +I have sworn myself to freedom. It is the Oracle who holds the third piece. There's your traitor.,TXT_DLG_SCRIPT10_D7580_IHAVE,〃,,,"Já jsem zapřísáhnut svobodě! Věštec je ten, kdo má u sebe třetí díl. On je ten zrádce.","Jeg har svoret mig selv til frihed. Det er Oraklet, der har den tredje del. Der er din forræder.",Ich habe mich der Freiheit verpflichtet. Das Orakel besitzt das dritte Teilstück. Dort ist dein Verräter.,,"Mi faris ĵuron de libereco. La Orakolo estas tiu, kiu havas la trian pecon: tie estas via perfidulo.",Hice un juramento por la libertad. Es el Oráculo quien tiene la tercera pieza: ahí está tu traidor.,,Olen vannonut itseni vapauteen. Kolmas osanen on Oraakkelin hallussa. Siinä on petturisi.,J'ai juré donner ma vie à la liberté. C'est l'Oracle qui porte la troisième pièce. Voilà votre traître.,,Felesküdtem a szabadságra. Az Orákulumnál van a harmadik darab. Ő lesz az árulód.,Io ho dedicato tutto me stesso alla libertà. È l'Oracolo che tiene il terzo pezzo. Ecco chi è il traditore.,"私は皆の自由を誓った。 三つ目の部品を持つのはオラクルだ。 君は裏切るつもりか。",전 자유를 지키겠다고 맹세했습니다. 오라클이 세 번째 조각을 가지고 있단 말입니다. 그자가 바로 배신자입니다!,Ik heb mezelf gezworen tot vrijheid. Het is het Orakel dat het derde deel vasthoudt. Daar is je verrader.,Jeg har sverget meg til frihet. Det er oraklet som har den tredje biten. Der er forræderen din.,Przysiągłem sobie wolność. To Wyrocznia ma trzeci fragment. Masz tu swego zdrajcę.,Eu fiz um juramento à liberdade. É o Oráculo que possui a terceira peça. Ele é o seu traidor.,,Am jurat pentru libertate. Oracolul deține a treia piesă. Iată trădătorul.,Я присягнул борьбе за свободу. Третий фрагмент хранится у Оракула. Он и есть предатель.,,Jag har svurit på frihet. Det är Oraklet som har den tredje delen. Där är din förrädare.,Özgürlük için yemin ettim. Üçüncü parça Kahin'de. İşte hainin. -The Oracle will die then!,TXT_RPLY0_SCRIPT10_D7580_THEOR,〃,,,Pak Věštec zemře!,Så dør Oraklet!,Dann wird das Orakel sterben.,,Tiuokaze la Orakolo mortos!,"¡El Oráculo morirá, entonces!","¡El Oráculo se muere, entonces!",Siinä tapauksessa Oraakkeli kuolkoon!,L'Oracle va donc mourir!,Akkor meghal az Orákulum!,E allora l'Oracolo morirà!,オラクルは後で仕留める!,그럼 오라클을 죽여야겠군.,Het Orakel zal dan sterven!,Da skal oraklet dø!,A więc to Wyrocznia zginie!,O Oráculo morrerá então!,,Oracolul va pieri atunci!,Тогда умрёт Оракул!,,Oraklet kommer att dö då!,O zaman Kahin ölecek! -I think you're the traitor!,TXT_RPLY1_SCRIPT10_D7580_ITHIN,〃,,,"Myslím, že ty jsi ten zrádce!","Jeg tror, du er forræderen!","Ich denke, du bist der Verräter.",,Eble vi estas la perfidulo!,¡Creo que tú eres el traidor!,,"Luulen, että petturi olet sinä!","Je pense que c'est vous, le traître!",Azt hiszem inkább te vagy az áruló!,Io penso che sia tu il traditore!,裏切り者はお前の方だ!,배신자는 바로 당신이야!,Ik denk dat jij de verrader bent!,Jeg tror du er forræderen!,Według mnie to ty jesteś zdrajcą!,Eu acho que você que é o traidor!,,Eu cred că tu ești trădătorul!,"Я думаю, что предатель — это ты!",,Jag tror att du är förrädaren!,Bence hain sensin! -Spirit of the One God avenge me and turn this world into dust.,TXT_DLG_SCRIPT10_D9096_SPIRI,MAP10: Macil → You chose to kill Macil,,,Duše Jednoho boha nechť mě pomstí a promění tento svět v prach!,Den ene Guds ånd hævner mig og gør denne verden til støv.,"Geist des einen Gottes, räche mich und verwandle diese Welt zu Staub.",,"Spirito de la Vera Dio, venĝu min kaj polvigu ĉi tiun mondon.","Espíritu del Dios Único, véngame y convierte este mundo en polvo.",,Yhden Ainoan Jumalan Henki kostakoon puolestani ja muuttakoon tämän maailman tuhaksi.,Que le Saint Esprit du Seul Dieu me venge et brûle ce monde jusqu'au cendres.,"Az egy igaz isten lelke bosszúljon meg, és zúzza porrá ezt a világot.","Spirito dell'Unico Dio, vendicami e trasforma questo mondo in cenere!","唯一神の魂が私を討てば +The Oracle will die then!,TXT_RPLY0_SCRIPT10_D7580_THEOR,〃,,,Pak Věštec zemře!,Så dør Oraklet!,Dann wird das Orakel sterben.,,Tiuokaze la Orakolo mortos!,"¡El Oráculo morirá, entonces!","¡El Oráculo se muere, entonces!",Siinä tapauksessa Oraakkeli kuolkoon!,L'Oracle va donc mourir!,,Akkor meghal az Orákulum!,E allora l'Oracolo morirà!,オラクルは後で仕留める!,그럼 오라클을 죽여야겠군.,Het Orakel zal dan sterven!,Da skal oraklet dø!,A więc to Wyrocznia zginie!,O Oráculo morrerá então!,,Oracolul va pieri atunci!,Тогда умрёт Оракул!,,Oraklet kommer att dö då!,O zaman Kahin ölecek! +I think you're the traitor!,TXT_RPLY1_SCRIPT10_D7580_ITHIN,〃,,,"Myslím, že ty jsi ten zrádce!","Jeg tror, du er forræderen!","Ich denke, du bist der Verräter.",,Eble vi estas la perfidulo!,¡Creo que tú eres el traidor!,,"Luulen, että petturi olet sinä!","Je pense que c'est vous, le traître!",,Azt hiszem inkább te vagy az áruló!,Io penso che sia tu il traditore!,裏切り者はお前の方だ!,배신자는 바로 당신이야!,Ik denk dat jij de verrader bent!,Jeg tror du er forræderen!,Według mnie to ty jesteś zdrajcą!,Eu acho que você que é o traidor!,,Eu cred că tu ești trădătorul!,"Я думаю, что предатель — это ты!",,Jag tror att du är förrädaren!,Bence hain sensin! +Spirit of the One God avenge me and turn this world into dust.,TXT_DLG_SCRIPT10_D9096_SPIRI,MAP10: Macil → You chose to kill Macil,,,Duše Jednoho boha nechť mě pomstí a promění tento svět v prach!,Den ene Guds ånd hævner mig og gør denne verden til støv.,"Geist des einen Gottes, räche mich und verwandle diese Welt zu Staub.",,"Spirito de la Vera Dio, venĝu min kaj polvigu ĉi tiun mondon.","Espíritu del Dios Único, véngame y convierte este mundo en polvo.",,Yhden Ainoan Jumalan Henki kostakoon puolestani ja muuttakoon tämän maailman tuhaksi.,Que le Saint Esprit du Seul Dieu me venge et brûle ce monde jusqu'au cendres.,,"Az egy igaz isten lelke bosszúljon meg, és zúzza porrá ezt a világot.","Spirito dell'Unico Dio, vendicami e trasforma questo mondo in cenere!","唯一神の魂が私を討てば この世界を塵に変えるだろう。","유일신의 혼이여, 이 세계를 잿더미로 만듦으로써 저를 위해 복수하심이!!",De geest van de Ene God wreekt me en maakt deze wereld tot stof.,"Ånd av den ene Gud, hevn meg og gjør denne verden til støv.",Duchu Jedynego Boga pomścij mnie i zrównaj ten świat z ziemią.,"Ó, Espírito do Deus Único. Vingue-me e transforme este mundo em pó.",,Spiritul Adevăratului Zeu să mă răzbune și să facă lumea asta cenușă.,Дух Единого Бога отомстит за меня и обратит этот мир в прах.,,Den ende gudens ande hämnas mig och förvandlar den här världen till stoft.,Tek Tanrı'nın Ruhu intikamımı al ve bu dünyayı toza çevir. -You have made the right decision. Its clear that the Oracle is controlled by whatever evil is driving the Order. Return to it and claim the third piece of the Sigil.,TXT_DLG_SCRIPT10_D10612_YOUHA,MAP10: Macil → You chose to kill the Oracle,,,"Učinil jsi správné rozhodnutí. Je zřejmé, že Věštec je ovládán tím zlem, které vede Řád. Vrať se k němu a přivlastni si třetí díl Pečetě.","Du har truffet den rigtige beslutning. Det er tydeligt, at Oraklet er kontrolleret af den ondskab, der driver ordenen. Vend tilbage til det og hæv den tredje del af sigilet.","Du hast die richtige Wahl getroffen. Es ist offensichtlich, dass das Orakel von demselben Übel kontrolliert wird, das den Orden antreibt. Kehre zu ihm zurück und hol dir das dritte Teilstück.",,"Vi prenis la ĝustan decidon. Estas evidente, ke la Orakolo estas regata per ia malbono de La Ordeno. Reiru al ĝi kaj akiru la trian pecon de la Sigelo.",Has tomado la decisión correcta. Está claro que el Oráculo está siendo controlado por el mal que está detrás de La Orden. Vuelve ante él y reclama la tercera pieza del Emblema.,Tomaste la decisión correcta. Está claro que el Oráculo está siendo controlado por el mal que está detrás de La Orden. Vuelve ante él y reclama la tercera pieza del Emblema.,"Olet tehnyt oikean päätöksen. Mikä tahansa paha vallitseekaan Veljeskuntaa, selvästi myös hallitsee Oraakkelia. Palaa sen luokse ja lunasta Sinetti.",Vous avez fait le bon choix. Il est clair que l'Oracle est contrôlé par le mal qui est derrière l'Ordre. Retournez le voir et récupérez la troisième pièce du Sigil.,"A megfelelő döntést hoztad. Biztos, hogy az Orákulumot is az a gonosz hajtja, ami a Rendet. Térj vissza hozzá, és követeld tőle a Pecsét harmadik darabját.",Hai fatto la scelta giusta. È chiaro che l'Oracolo è controllato dallo stesso male che guida l'Ordine. Ritorna dall'Oracolo e reclama il terzo pezzo del Sigillo.,"君は正しい決断をした。 +You have made the right decision. Its clear that the Oracle is controlled by whatever evil is driving the Order. Return to it and claim the third piece of the Sigil.,TXT_DLG_SCRIPT10_D10612_YOUHA,MAP10: Macil → You chose to kill the Oracle,,,"Učinil jsi správné rozhodnutí. Je zřejmé, že Věštec je ovládán tím zlem, které vede Řád. Vrať se k němu a přivlastni si třetí díl Pečetě.","Du har truffet den rigtige beslutning. Det er tydeligt, at Oraklet er kontrolleret af den ondskab, der driver ordenen. Vend tilbage til det og hæv den tredje del af sigilet.","Du hast die richtige Wahl getroffen. Es ist offensichtlich, dass das Orakel von demselben Übel kontrolliert wird, das den Orden antreibt. Kehre zu ihm zurück und hol dir das dritte Teilstück.",,"Vi prenis la ĝustan decidon. Estas evidente, ke la Orakolo estas regata per ia malbono de La Ordeno. Reiru al ĝi kaj akiru la trian pecon de la Sigelo.",Has tomado la decisión correcta. Está claro que el Oráculo está siendo controlado por el mal que está detrás de La Orden. Vuelve ante él y reclama la tercera pieza del Emblema.,Tomaste la decisión correcta. Está claro que el Oráculo está siendo controlado por el mal que está detrás de La Orden. Vuelve ante él y reclama la tercera pieza del Emblema.,"Olet tehnyt oikean päätöksen. Mikä tahansa paha vallitseekaan Veljeskuntaa, selvästi myös hallitsee Oraakkelia. Palaa sen luokse ja lunasta Sinetti.",Vous avez fait le bon choix. Il est clair que l'Oracle est contrôlé par le mal qui est derrière l'Ordre. Retournez le voir et récupérez la troisième pièce du Sigil.,,"A megfelelő döntést hoztad. Biztos, hogy az Orákulumot is az a gonosz hajtja, ami a Rendet. Térj vissza hozzá, és követeld tőle a Pecsét harmadik darabját.",Hai fatto la scelta giusta. È chiaro che l'Oracolo è controllato dallo stesso male che guida l'Ordine. Ritorna dall'Oracolo e reclama il terzo pezzo del Sigillo.,"君は正しい決断をした。 オラクルがオーダーに悪しき支配をしているのは 明白だ。戻って三番目のシジルを手に入れろ。","좋은 선택입니다. 아무래도 오더가 이끄는 악에서 오라클을 조종하는 것이 명백해졌으니, 녀석을 찾아가 시질의 세 번째 조각을 회수하세요. \cy어서 가자, 나의 영웅. 그 못생긴 녀석에게 본때를 보여주자고.",Je hebt de juiste keuze gemaakt. Het is duidelijk dat het Orakel wordt beheerst door het kwaad dat de Orde drijft. Keer ernaar terug en claim het derde deel van de Sigil.,Du har tatt den rette avgjørelsen. Det er tydelig at oraklet styres av den ondskapen som driver ordenen. Vend tilbake til det og gjør krav på den tredje delen av sigillet.,"Postąpiłeś słusznie. To oczywiste, że Wyrocznia jest kontrolowana przez to zło które rządzi Zakonem. Wróć tam i odbierz jej trzeci fragment Pieczęci.",Você fez a decisão certa. Está claro que o Oráculo está sendo controlado por alguma força maligna por trás da Ordem. Volte para lá e pegue a terceira peça do Sigilo.,,Ai făcut alegerea corectă. E limpede că Oracolul e controlat de orice rău conduce și Ordinul. Întoarce-te la el și pune mâna pe cea de-a treia piesă a Sigiliului.,"Ты сделал правильный выбор. Ясно, что Оракулом управляет то же самое зло, что стоит за Орденом. Вернись к Оракулу и потребуй отдать тебе третий фрагмент Печати!",,Du har fattat rätt beslut. Det är uppenbart att Oraklet kontrolleras av den ondska som driver Orden. Återvänd till det och kräv den tredje delen av Sigillet.,"Doğru kararı verdin. Kahin'in, Düzen'i yönlendiren şeytan tarafından kontrol edildiği çok açık. Ona dön ve Sigil'in üçüncü parçasını al." -"There seems no end to the horror we face. We have found out that the Order is not killing our people. It is transforming them, into bio-mechanical soldiers. Find the facility where this is being done and close it, permanently.",TXT_DLG_SCRIPT10_D12128_THERE,MAP10: Macil → After killing the Oracle,,,"Zdá se, že zlo, kterému čelíme, nemá konce. Zjistili jsme, že Řád nezabíjí naše lidi, ale přeměňuje je na biomechanické vojáky. Najdi továrnu, kde se tohle děje, a zavři ji, natrvalo.","Der synes ikke at være nogen ende på den rædsel, vi står over for. Vi har fundet ud af, at ordenen ikke dræber vores folk. Den forvandler dem til biomekaniske soldater. Find det anlæg, hvor dette sker, og luk det for altid.","Der Horror, dem wir ausgesetzt sind, scheint kein Ende zu nehmen. Wir haben herausgefunden, dass der Orden unsere Leute nicht tötet, sondern sie transformiert - int biomechanische Soldaten.Finde die Einrichtung, wo dies passiert und schließe sie - endgültig.",,"Ŝajnas, ke la teruraĵo, kiun ni alfrontas, estas senlima. Ni malkovris, ke La Ordeno ne nur mortigas niajn homojn: ĝi transformas ilin en biomekanikajn soldatojn. Trovu la instalaĵon, kie tio okazas, kaj fermu ĝin por ĉiam.","Parece que no hay fin para el horror al que nos enfrentamos. Hemos descubierto que La Orden no solo mata a nuestra gente, sino que la está transformando en soldados biomecánicos. Encuentra la instalación donde hacen eso y clausúrala permanentemente.","Parece que no hay fin para el horror al que nos enfrentamos. Descubrimos que La Orden no solo mata a nuestra gente, sino que la está transformando en soldados biomecánicos. Encuentra la instalación donde hacen eso y clausúrala permanentemente.","Meitä kohdanneelle kauhulle ei näytä olevan loppua. Olemme saaneet selville, että Veljeskunta ei tapa meidän omiamme, vaan muuntelee heitä biomekaanisiksi sotilaiksi. Etsi laitos, jossa tätä tehdään, ja lakkauta se, pysyvästi.","Il semble qu'il n'y ait pas de fin aux horreurs auxquelles nous devons faire face. Nous venons de découvrir que l'Ordre n'exécute pas notre peuple, il le transforme en soldats biomécaniques. Trouvez l'usine qui gère ce processus et fermez la pour toujours.","Úgy néz ki, már soha nem lesz vége ennek a horrornak. Mint kiderült, a Rend nem megöli az embereinket, hanem bio-mechanikus robotokká alakítják át. Keresd meg a létesítményt, ahol ez folyik, és azonnal zárdd be.","Sembra che non ci sia limite agli orrori che affrontiamo. Abbiamo scoperto che l'Ordine non solo uccide la nostra gente, ma li trasforma anche in soldati bio-meccanici. Devi trovare lo stabilimento dove questo sta avvenendo e chiuderlo, permanentemente.","どうやら我々の直面する恐怖は +"There seems no end to the horror we face. We have found out that the Order is not killing our people. It is transforming them, into bio-mechanical soldiers. Find the facility where this is being done and close it, permanently.",TXT_DLG_SCRIPT10_D12128_THERE,MAP10: Macil → After killing the Oracle,,,"Zdá se, že zlo, kterému čelíme, nemá konce. Zjistili jsme, že Řád nezabíjí naše lidi, ale přeměňuje je na biomechanické vojáky. Najdi továrnu, kde se tohle děje, a zavři ji, natrvalo.","Der synes ikke at være nogen ende på den rædsel, vi står over for. Vi har fundet ud af, at ordenen ikke dræber vores folk. Den forvandler dem til biomekaniske soldater. Find det anlæg, hvor dette sker, og luk det for altid.","Der Horror, dem wir ausgesetzt sind, scheint kein Ende zu nehmen. Wir haben herausgefunden, dass der Orden unsere Leute nicht tötet, sondern sie transformiert - int biomechanische Soldaten.Finde die Einrichtung, wo dies passiert und schließe sie - endgültig.",,"Ŝajnas, ke la teruraĵo, kiun ni alfrontas, estas senlima. Ni malkovris, ke La Ordeno ne nur mortigas niajn homojn: ĝi transformas ilin en biomekanikajn soldatojn. Trovu la instalaĵon, kie tio okazas, kaj fermu ĝin por ĉiam.","Parece que no hay fin para el horror al que nos enfrentamos. Hemos descubierto que La Orden no solo mata a nuestra gente, sino que la está transformando en soldados biomecánicos. Encuentra la instalación donde hacen eso y clausúrala permanentemente.","Parece que no hay fin para el horror al que nos enfrentamos. Descubrimos que La Orden no solo mata a nuestra gente, sino que la está transformando en soldados biomecánicos. Encuentra la instalación donde hacen eso y clausúrala permanentemente.","Meitä kohdanneelle kauhulle ei näytä olevan loppua. Olemme saaneet selville, että Veljeskunta ei tapa meidän omiamme, vaan muuntelee heitä biomekaanisiksi sotilaiksi. Etsi laitos, jossa tätä tehdään, ja lakkauta se, pysyvästi.","Il semble qu'il n'y ait pas de fin aux horreurs auxquelles nous devons faire face. Nous venons de découvrir que l'Ordre n'exécute pas notre peuple, il le transforme en soldats biomécaniques. Trouvez l'usine qui gère ce processus et fermez la pour toujours.",,"Úgy néz ki, már soha nem lesz vége ennek a horrornak. Mint kiderült, a Rend nem megöli az embereinket, hanem bio-mechanikus robotokká alakítják át. Keresd meg a létesítményt, ahol ez folyik, és azonnal zárdd be.","Sembra che non ci sia limite agli orrori che affrontiamo. Abbiamo scoperto che l'Ordine non solo uccide la nostra gente, ma li trasforma anche in soldati bio-meccanici. Devi trovare lo stabilimento dove questo sta avvenendo e chiuderlo, permanentemente.","どうやら我々の直面する恐怖は まだ終わらない様だ。オーダーが民を無意味に 殺害しているだけではなく、サイボーグ兵へ改造 していることが解かった。その施設を探し出し 機能を停止させるのだ。永久的に。 ","우리가 마주하는 공포의 끝이 없는 것 같군요... 최근 오더가 우리를 학살하는 게 아닌 일종의 강화 인간으로 개조시키고 있었던 것이라고 소식을 들었습니다. 개조가 시행되고 있는 시설을 찾아가서 그곳을 영구적으로 정지시키세요. \cy인간개조? 음, 이거 때문에 녀석들이 끊임없이 나오는 거였어! 녀석들 성질 더러운 것도 그렇고.","Er lijkt geen einde te komen aan de verschrikking waar we voor staan. We hebben ontdekt dat de Orde onze mensen niet doodt. Het transformeert hen, in bio-mechanische soldaten. Zoek de faciliteit waar dit gebeurt en sluit deze permanent.","Det ser ikke ut til å være noen ende på skrekken vi står overfor. Vi har funnet ut at Ordenen ikke dreper folket vårt. Den forvandler dem til biomekaniske soldater. Finn anlegget der dette gjøres og steng det, permanent.","Wygląda na to, że naszym koszmarom nie ma końca. Dowiedzieliśmy się, że Zakon nie zabija naszych ludzi. Tylko zmienia ich w biomechanicznych żołnierzy. Znajdź ośrodek, w którym to robią i zamknij go na dobre.","Parece que os horrores que enfrentamos não têm fim. Descobrimos que a Ordem não está matando o nosso pessoal. Está os transformando em soldados biomecânicos. Ache a instalação onde isso é feito e feche-a, de uma vez por todas.",,"Pare să nu existe limite pentru răul pe care îl înfruntăm. Îi transformă, în soldați bio-mecanici. Găsește fabrica unde se întâmplă asta și închide-o, permanent.","Иногда кажется, что эти ужасы никогда не закончатся. Мы узнали, что Орден не убивает наших людей. Он перерабатывает их в биомеханических солдат. Найди фабрику, где происходит это, и закрой её раз и навсегда!",,Det verkar inte finnas något slut på den skräck vi står inför. Vi har fått reda på att Orden inte dödar vårt folk. Den förvandlar dem till biomekaniska soldater. Hitta anläggningen där detta sker och stäng den för gott.,Karşılaştığımız dehşetin sonu yok gibi görünüyor. Tarikat'ın insanlarımızı öldürmediğini öğrendik. Onları biyo-mekanik askerlere dönüştürüyor. Bunun yapıldığı tesisi bulun ve kalıcı olarak kapatın. -Where is this located?,TXT_RPLY0_SCRIPT10_D12128_WHERE,〃,,,Kde ji najdu?,Hvor er det placeret?,Wo finde ich sie?,,Kie ĝi estas?,¿Dónde queda?,,Missä se sijaitsee?,Où se trouve-elle?,Hol van ez?,Dove si trova?,手掛かりは何処にある?,이 장소는 어디에 있죠?,Waar bevindt deze faciliteit zich?,Hvor ligger det?,Gdzie się znajduje?,Onde se encontra?,,Unde este localizată?,Где она находится?,,Var finns den?,Burası nerede? -"One of our captains, Richter, is waiting for you by the waterfall in the commons. He has seen the facility and can guide you inside. Stop this atrocity, now.",TXT_DLG_SCRIPT10_D13644_ONEOF,〃,,,"Jeden z našich kapitánů, Richter, na tebe čeká u vodopádů na návsi. Továrnu už viděl a může ti poradit, jak dovnitř. Zastav tuhle ohavnost, ihned.","En af vores kaptajner, Richter, venter på dig ved vandfaldet i fællesrummet. Han har set anlægget og kan guide dig indenfor. Stop denne grusomhed, nu.","Einer unserer Anführer, Rickter warted auf dich, am Wasserfall bei der Mensa. Er hat es gesehen und kann dich dort hinführen. Stope dieses Gräuel - sofort.",,"Unu el niaj kapitanoj, Rikter, atendas vin en la komunumo en la limlando. Li vidis la instalaĵon kaj scias eniri ĝin. Ĉesu tuj ĉi tiun teruraĵon.","Uno de nuestros capitanes, Richter, está esperándote en la comuna de las tierras fronterizas. Ha visto la instalación y sabe como entrar. Detén esta atrocidad ahora.","Uno de nuestros capitanes, Richter, está esperándote en la comuna de las tierras fronterizas. Vio la instalación y sabe como entrar. Detén esta atrocidad ahora.","Richter, yksi kapteeneistamme, odottaa sinua messissä vesiputouksen äärellä. Hän on nähnyt laitoksen ja voi opastaa sinut sisälle. Lopeta tämä kauhistus, heti paikalla.","Un de nos capitaines, Richter, vous attend près de la cascade dans le réfectoire. Il a vu l'usine et peut vous guider jusqu'a l'intérieur. Arrêtez cette atrocité maintenant.","Richter - az egyik kapitányunk - a vízesés melletti étkezdénél fog várni rád. Ő látta ezt a létesítményt, és be tud vinni. Állítsd meg ezt a borzalmat azonnal.","Uno dei nostri capitani, Richter, ti sta aspettando vicino alla cascata nei comuni. Lui ha visto la fabbrica e ti può guidare dentro. Devi fermare quest'atrocità al più presto.","キャプテンの一人、リヒターが +Where is this located?,TXT_RPLY0_SCRIPT10_D12128_WHERE,〃,,,Kde ji najdu?,Hvor er det placeret?,Wo finde ich sie?,,Kie ĝi estas?,¿Dónde queda?,,Missä se sijaitsee?,Où se trouve-elle?,,Hol van ez?,Dove si trova?,手掛かりは何処にある?,이 장소는 어디에 있죠?,Waar bevindt deze faciliteit zich?,Hvor ligger det?,Gdzie się znajduje?,Onde se encontra?,,Unde este localizată?,Где она находится?,,Var finns den?,Burası nerede? +"One of our captains, Richter, is waiting for you by the waterfall in the commons. He has seen the facility and can guide you inside. Stop this atrocity, now.",TXT_DLG_SCRIPT10_D13644_ONEOF,〃,,,"Jeden z našich kapitánů, Richter, na tebe čeká u vodopádů na návsi. Továrnu už viděl a může ti poradit, jak dovnitř. Zastav tuhle ohavnost, ihned.","En af vores kaptajner, Richter, venter på dig ved vandfaldet i fællesrummet. Han har set anlægget og kan guide dig indenfor. Stop denne grusomhed, nu.","Einer unserer Anführer, Rickter warted auf dich, am Wasserfall bei der Mensa. Er hat es gesehen und kann dich dort hinführen. Stope dieses Gräuel - sofort.",,"Unu el niaj kapitanoj, Rikter, atendas vin en la komunumo en la limlando. Li vidis la instalaĵon kaj scias eniri ĝin. Ĉesu tuj ĉi tiun teruraĵon.","Uno de nuestros capitanes, Richter, está esperándote en la comuna de las tierras fronterizas. Ha visto la instalación y sabe como entrar. Detén esta atrocidad ahora.","Uno de nuestros capitanes, Richter, está esperándote en la comuna de las tierras fronterizas. Vio la instalación y sabe como entrar. Detén esta atrocidad ahora.","Richter, yksi kapteeneistamme, odottaa sinua messissä vesiputouksen äärellä. Hän on nähnyt laitoksen ja voi opastaa sinut sisälle. Lopeta tämä kauhistus, heti paikalla.","Un de nos capitaines, Richter, vous attend près de la cascade dans le réfectoire. Il a vu l'usine et peut vous guider jusqu'a l'intérieur. Arrêtez cette atrocité maintenant.",,"Richter - az egyik kapitányunk - a vízesés melletti étkezdénél fog várni rád. Ő látta ezt a létesítményt, és be tud vinni. Állítsd meg ezt a borzalmat azonnal.","Uno dei nostri capitani, Richter, ti sta aspettando vicino alla cascata nei comuni. Lui ha visto la fabbrica e ti può guidare dentro. Devi fermare quest'atrocità al più presto.","キャプテンの一人、リヒターが コモンズの滝で待っている。 彼は施設を発見し生還した者だ。 早急にそのふざけた行為を止めさせろ。","우리 군의 한 대대장인 릭터가 식당가에 위치한 폭포 근처에서 당신을 기다리고 있습니다. 그는 그 끔찍한 시설을 보았다고 했으며, 침투할 수 있게 도와주고 싶다는군요. 부디 이 잔혹 행위를 멈출 수 있기를 바랍니다.","Een van onze kapiteins, Richter, wacht u op bij de waterval in het Lagerhuis. Hij heeft het gebouw gezien en kan je naar binnen leiden. Stop deze gruweldaad, nu.","En av våre kapteiner, Richter, venter på deg ved fossen i allmenningen. Han har sett anlegget og kan lede dere inn. Stopp denne grusomheten, nå.","Jeden z naszych kapitanów, Richter, czeka na ciebie przy wodospadzie przy błoniach. Widział ten ośrodek i pomoże ci się tam dostać. Skończ z tym okrucieństwem.","Um dos nossos capitães, Richter, está te esperando perto da cascata próxima ao refeitório. Ele conhece a instalação e pode te ajudar a infiltrá-la. Detenha essa atrocidade o quanto antes.",,"Unul dintre căpitanii noștri, Richter, te așteaptă lângă cascadă. A văzut fabrica și te poate conduce în interiorul ei. Încheie atrocitatea asta, acum.","Один из наших капитанов, Рихтер, ожидает тебя возле водопада в поселении Ордена. Он уже проникал на фабрику, и он скажет тебе, как туда попасть. Положи конец этим зверствам, немедленно!",,"En av våra kaptener, Richter, väntar på dig vid vattenfallet i allmänningen. Han har sett anläggningen och kan guida dig in. Stoppa denna grymhet, nu.","Kaptanlarımızdan biri, Richter, ortak kullanım alanındaki şelalenin yanında sizi bekliyor. Tesisi gördü ve size içeride rehberlik edebilir. Bu vahşeti durdurun, hemen." -They'll pay for this!,TXT_RPLY0_SCRIPT10_D13644_THEYL,〃,,,Za tohle budou pykat!,De vil betale for dette!,Dafür werden sie bezahlen.,,Ili pentos!,¡Se arrepentirán!,¡Se van a arrepentir!,Ne saavat maksaa tästä!,Ils paieront pour cela!,Megfizetnek ezért!,La pagheranno per questo!,奴等に対価を払わせてやるさ!,그놈들은 죗값을 치를 것입니다!,Zij zullen hiervoor betalen!,De skal få svi for dette!,Zapłacą za to!,Eles pagarão por isso!,,Vor plătii pentru asta!,Они за всё заплатят!,,De kommer att få betala för detta!,Bunun bedelini ödeyecekler! -Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT10_D15160_FIGHT,〃,,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het Front en vrijheid. Ga weg.,Kjemp for fronten og friheten. Av sted!,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. -"I am the One God... I need his spirit to be free so that I can leave my body, and join him in flight. You have no idea what you possess... And what terror you face... The One God must be free... And he will reward me... I will be one...",TXT_DLG_SCRIPT10_D16676_IAMTH,MAP10: Macil → After destroying the converter in MAP24.,,,"Já jsem Jedním bohem... Potřebuju jeho duši abych se osvobodil a opustil své tělo a mohl se k němu připojit na nebesích. Nemáš ani tušení, co držíš v rukách... a jaké hrůze čelíš... Jeden bůh musí být svobodný... odmění mě... Budu jeden...","Jeg er den eneste Gud... Jeg har brug for, at hans ånd bliver fri, så jeg kan forlade min krop og slutte mig til ham i flugten. Du har ingen idé om, hvad du besidder... Og hvilken terror du står over for... Den ene Gud skal være fri... Og han vil belønne mig... Jeg vil være én...","Ich bin der Eine Gott... Sein Geist muss frei sein so dass ich seinen Körper verlassen und mit ihm fliegen kann. Du hast keine Ahnung, was du besitzt... And welcher Terror die bevorsteht... Der Eine Gott muss frei sein... Und er wird mich belohnen... Ich werde eins...",,"Mi estas la Vera Dio. Mi bezonas liberigi lian spiriton, tiam mi povos forlasi mian korpon kaj aliĝi al li en la flugo! Vi ne havas ideon pri tio, kion vi posedas... nek pri la teruraĵo, kiun vi alfrontas. La Vera Dio devas esti libera! Kaj li rekompencos min... Ni estos la sama!",Soy el Dios Único. ¡Necesito liberar su espíritu para poder abandonar mi cuerpo y unirme a él en vuelo! No tienes ni idea de lo que posees... ni del terror al que te enfrentas. ¡El Dios Único debe ser libre! Y me recompensará... ¡Seremos el mismo!,Soy el Dios Único. ¡Necesito liberar su espíritu para poder abandonar mi cuerpo y unirme a él en vuelo! No tienes ni idea de lo que posees... ni del terror al que te enfrentas. ¡El Dios Único debe ser libre! Y me va a recompensar... ¡Vamos a ser el mismo!,"Minä olen Yksi Ainoa Jumala... Tarvitsen hänen henkeään ollakseni vapaa ja poistuakseni ruumiistani, jotta voisin paeta hänen kanssaan. Et käsitäkään, mitä omaat... ja mitä kauhua olet kohtaava... Yhden Ainoan Jumalan on päästävä vapaaksi... Ja hän palkitsee minut... Tulen olemaan yksi...","Je suis le Seul Dieu.. Il me faut libérer son esprit pour qu'il puisse sortir de mon corps, et le rejoindre dans sa fuite. Vous ne savez pas ce que vous possédez.. Et la terreur à laquelle vous devrez faire face... Le Seul Dieu doit être libre.. Et il me récompensera.. Je serais un avec lui..","Én vagyok az egy Igaz Isten...ki akarom szabadítani a lelkét, hogy elhagyhassam a testemet és társuljak mellé a harcban. Ötleted sincs miféle erővel rendelkezel...és miféle terroral nézel szemben...az egy Igaz Istennek szabadnak kell lennie...és majd megjutalmaz...eggyé válok majd...","Io sono l'Unico Dio... Ho bisogno che il suo spirito sia libero così che io possa lasciare il mio corpo, e unirmi a lui in volo. Non hai idea di cosa possiedi... E di quale terrore vai ad affrontare... L'Unico Dio deve essere libero... E mi ricompenserà... E sarò io...","我が唯一神だ...我は己の肉体を離れ +They'll pay for this!,TXT_RPLY0_SCRIPT10_D13644_THEYL,〃,,,Za tohle budou pykat!,De vil betale for dette!,Dafür werden sie bezahlen.,,Ili pentos!,¡Se arrepentirán!,¡Se van a arrepentir!,Ne saavat maksaa tästä!,Ils paieront pour cela!,,Megfizetnek ezért!,La pagheranno per questo!,奴等に対価を払わせてやるさ!,그놈들은 죗값을 치를 것입니다!,Zij zullen hiervoor betalen!,De skal få svi for dette!,Zapłacą za to!,Eles pagarão por isso!,,Vor plătii pentru asta!,Они за всё заплатят!,,De kommer att få betala för detta!,Bunun bedelini ödeyecekler! +Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT10_D15160_FIGHT,〃,,,Bojuj za Frontu a svobodu! Odchod.,Kæmp for fronten og friheden. Af sted.,Kämpfe für die Front und die Freiheit. Nun geh.,,Bataladu pro la Fronto kaj libereco. Ekagu.,Pelea por el Frente y la libertad. En marcha.,,Taistele Rintaman ja vapauden puolesta. Liikkeelle mars.,Battez vous pour le Front et pour la liberté. Repos.,,Együtt a Frontért és a szabadságért! Indulás!,"Lotta, per il Fronte e per la libertà! E ora, al lavoro.",フロントと自由の為の闘争を。さあ向かえ。,"프론트와 자유를 향하여, 전진하세요!",Vecht voor het Front en vrijheid. Ga weg.,Kjemp for fronten og friheten. Av sted!,Walcz dla Frontu i wolności. Wykonać.,Lute pela Frente e pela liberdade. Agora vá.,,Luptă pentru Front și libertate. Acum pleacă.,Сражайся за свободу и справедливость. Выдвигайся.,,Kämpa för fronten och friheten. Gå ut.,Cephe ve özgürlük için savaşın. Dışarı çıkın. +"I am the One God... I need his spirit to be free so that I can leave my body, and join him in flight. You have no idea what you possess... And what terror you face... The One God must be free... And he will reward me... I will be one...",TXT_DLG_SCRIPT10_D16676_IAMTH,MAP10: Macil → After destroying the converter in MAP24.,,,"Já jsem Jedním bohem... Potřebuju jeho duši abych se osvobodil a opustil své tělo a mohl se k němu připojit na nebesích. Nemáš ani tušení, co držíš v rukách... a jaké hrůze čelíš... Jeden bůh musí být svobodný... odmění mě... Budu jeden...","Jeg er den eneste Gud... Jeg har brug for, at hans ånd bliver fri, så jeg kan forlade min krop og slutte mig til ham i flugten. Du har ingen idé om, hvad du besidder... Og hvilken terror du står over for... Den ene Gud skal være fri... Og han vil belønne mig... Jeg vil være én...","Ich bin der Eine Gott... Sein Geist muss frei sein so dass ich seinen Körper verlassen und mit ihm fliegen kann. Du hast keine Ahnung, was du besitzt... And welcher Terror die bevorsteht... Der Eine Gott muss frei sein... Und er wird mich belohnen... Ich werde eins...",,"Mi estas la Vera Dio. Mi bezonas liberigi lian spiriton, tiam mi povos forlasi mian korpon kaj aliĝi al li en la flugo! Vi ne havas ideon pri tio, kion vi posedas... nek pri la teruraĵo, kiun vi alfrontas. La Vera Dio devas esti libera! Kaj li rekompencos min... Ni estos la sama!",Soy el Dios Único. ¡Necesito liberar su espíritu para poder abandonar mi cuerpo y unirme a él en vuelo! No tienes ni idea de lo que posees... ni del terror al que te enfrentas. ¡El Dios Único debe ser libre! Y me recompensará... ¡Seremos el mismo!,Soy el Dios Único. ¡Necesito liberar su espíritu para poder abandonar mi cuerpo y unirme a él en vuelo! No tienes ni idea de lo que posees... ni del terror al que te enfrentas. ¡El Dios Único debe ser libre! Y me va a recompensar... ¡Vamos a ser el mismo!,"Minä olen Yksi Ainoa Jumala... Tarvitsen hänen henkeään ollakseni vapaa ja poistuakseni ruumiistani, jotta voisin paeta hänen kanssaan. Et käsitäkään, mitä omaat... ja mitä kauhua olet kohtaava... Yhden Ainoan Jumalan on päästävä vapaaksi... Ja hän palkitsee minut... Tulen olemaan yksi...","Je suis le Seul Dieu.. Il me faut libérer son esprit pour qu'il puisse sortir de mon corps, et le rejoindre dans sa fuite. Vous ne savez pas ce que vous possédez.. Et la terreur à laquelle vous devrez faire face... Le Seul Dieu doit être libre.. Et il me récompensera.. Je serais un avec lui..",,"Én vagyok az egy Igaz Isten...ki akarom szabadítani a lelkét, hogy elhagyhassam a testemet és társuljak mellé a harcban. Ötleted sincs miféle erővel rendelkezel...és miféle terroral nézel szemben...az egy Igaz Istennek szabadnak kell lennie...és majd megjutalmaz...eggyé válok majd...","Io sono l'Unico Dio... Ho bisogno che il suo spirito sia libero così che io possa lasciare il mio corpo, e unirmi a lui in volo. Non hai idea di cosa possiedi... E di quale terrore vai ad affrontare... L'Unico Dio deve essere libero... E mi ricompenserà... E sarò io...","我が唯一神だ...我は己の肉体を離れ 自由となり、神の魂と共に飛び立てる。 貴様には何も分かりもしないだろう... そして垣間見る恐怖もな... @@ -11205,20 +11205,20 @@ Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT10_D15160_FIGHT,〃,,,B そして神は我を表彰するだろう... 我は一つとなる...","유일신... 그분의 영혼의 힘으로... 나의 육신을 버리고... 그분과 자유롭게 날아가리라... 그대가 소유한 것, 그대가 직면할 운명... 모두 모를 것이다... 유일신이 자유가 되면... 나에게 보답하시매, 그와 하나가 되리라!! \cy역겨운 자식... 죽여버려!","Ik ben de enige God.... Ik heb zijn geest nodig om vrij te zijn, zodat ik mijn lichaam kan verlaten en met hem mee kan vliegen. Je hebt geen idee wat je bezit.... En welke terreur je onder ogen ziet.... De Ene God moet vrij zijn.... En hij zal mij belonen.... Ik zal er een zijn....","Jeg er den ene Gud... Jeg trenger hans ånd for å være fri, så jeg kan forlate kroppen min og bli med ham på flukt. Du aner ikke hva du besitter... Og hvilken skrekk du står overfor... Den ene Gud må være fri... Og han vil belønne meg... Jeg vil bli en...",Jam jest Jedyny Bóg... potrzebuję uwolnić jego duszę abym opuścił swe ciało i dołączył do niego. Nie masz pojęcia co ty posiadłeś... I z jakim terrorem się spotykasz... Jedyny Bóg musi być wolny... I on mnie nagrodzi... To ja będę tym jednym...,"Eu sou o Deus Único... Eu preciso desse espírito para ser livre, poder abandonar este corpo e unir-me a ele na fuga. Você não tem idéia do que possui... E o horror que você enfrenta... O Deus Único deve ser livre... E ele me recompensará... Eu serei um...",,"Eu sunt adevăratul Zeu.... Am nevoie de sufletul lui ca să pot să-mi părăsesc corpul, și să mă alătur lui în zbor. Nu ai idee despre ceea ce posezi... Și ce teroare înfrunți... Adevăratul Zeu trebuie să fie liber... Și mă va răsplătii... Voi fi unul...","Я Единый Бог... Я должен высвободить его дух, тогда я смогу покинуть бренную оболочку моего тела и воссоединиться с ним в полёте. Ты и понятия не имеешь, чем обладаешь... и с какому кошмару смотришь в лицо... Единый Бог должен быть освобождён... И он вознаградит меня... Это сделаю я!",,Jag är den ende guden... Jag behöver att hans ande är fri så att jag kan lämna min kropp och ansluta mig till honom i flykten. Du har ingen aning om vad du äger... Och vilken skräck ni står inför... Den ende guden måste vara fri... Och han kommer att belöna mig... Jag kommer att bli en...,"Ben Tek Tanrı'yım. Onun ruhunun özgür olmasına ihtiyacım var, böylece bedenimi terk edebilir ve uçuşta ona katılabilirim. Neye sahip olduğunuz hakkında hiçbir fikriniz yok. Ve nasıl bir dehşetle karşı karşıya olduğunuzu. Tek Tanrı özgür olmalı. Ve o beni ödüllendirecek. Ben bir olacağım." -I will destroy you!,TXT_RPLY0_SCRIPT10_D16676_IWILL,〃,,,Zničím tě!,Jeg vil ødelægge dig!,Ich werde dich zerstören!,,Mi detruos vin!,¡Te destruiré!,¡Te voy a destruir!,Tuhoan sinut!,L'heure est venue de vous détruire!,Megsemmisítelek!,Ti distruggerò!,お前を滅ぼす!,당신을 처단하겠어!,Ik zal je vernietigen!,Jeg skal tilintetgjøre deg!,Zniszczę cię!,Eu vou destruir você!,,Te voi distruge!,Я уничтожу тебя!,,Jag ska förgöra dig!,Seni yok edeceğim! -Glad to see you made it. What do you need? ,TXT_DLG_SCRIPT10_D18192_GLADT,MAP10: Gerald (no upgrade).,,,"Jsem rád, žes to zvládnul. Co bys potřeboval?","Godt at se, at du klarede den. Hvad har du brug for?","Gut, dass du es geschafft hast. Was brauchst du?",,Feliĉe vi supervivis. Kion vi bezonas?,Me alegra verte en una pieza. ¿Qué necesitas?,,"Hienoa, että selvisit. Mitä tarvitset?",Ravi de voir que vous vous en êtes sorti. Que puis-je faire pour vous?,"Örömmel látom, hogy túlélted. Miben segíthetek?",Lieto di vederti qui. Di che hai bisogno?,お会いできて光栄です。何が必要ですか?,여기까지 오시다니 놀랍군요. 뭔가 필요한 게?,Blij te zien dat je het gehaald hebt. Wat heb je nodig?,Godt å se at du kom. Hva trenger du?,"Dobrze widzieć, że udało ci się. Czego ci potrzeba?",Que bom que você conseguiu. O que você precisa?,,Mă bucur să văd că ai reușit. De ce ai nevoie?,"Я рад, что ты справился. Чем могу помочь?",,Det gläder mig att se att du klarade dig. Vad behöver du?,Gelebilmene sevindim. Neye ihtiyacın var? -Heal me.,TXT_RPLY0_SCRIPT10_D18192_HEALM,〃,,,Potřebuju ošetřit.,Helbrede mig.,Mach mich gesund.,,Kuracu min.,Cúrame.,,Hoida minua.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료해주세요.,Genees me.,Helbred meg.,Ulecz mnie.,Me cure.,,Bandajează-mă.,Подлечи меня.,,Laga mig.,İyileştir beni. +I will destroy you!,TXT_RPLY0_SCRIPT10_D16676_IWILL,〃,,,Zničím tě!,Jeg vil ødelægge dig!,Ich werde dich zerstören!,,Mi detruos vin!,¡Te destruiré!,¡Te voy a destruir!,Tuhoan sinut!,L'heure est venue de vous détruire!,,Megsemmisítelek!,Ti distruggerò!,お前を滅ぼす!,당신을 처단하겠어!,Ik zal je vernietigen!,Jeg skal tilintetgjøre deg!,Zniszczę cię!,Eu vou destruir você!,,Te voi distruge!,Я уничтожу тебя!,,Jag ska förgöra dig!,Seni yok edeceğim! +Glad to see you made it. What do you need? ,TXT_DLG_SCRIPT10_D18192_GLADT,MAP10: Gerald (no upgrade).,,,"Jsem rád, žes to zvládnul. Co bys potřeboval?","Godt at se, at du klarede den. Hvad har du brug for?","Gut, dass du es geschafft hast. Was brauchst du?",,Feliĉe vi supervivis. Kion vi bezonas?,Me alegra verte en una pieza. ¿Qué necesitas?,,"Hienoa, että selvisit. Mitä tarvitset?",Ravi de voir que vous vous en êtes sorti. Que puis-je faire pour vous?,,"Örömmel látom, hogy túlélted. Miben segíthetek?",Lieto di vederti qui. Di che hai bisogno?,お会いできて光栄です。何が必要ですか?,여기까지 오시다니 놀랍군요. 뭔가 필요한 게?,Blij te zien dat je het gehaald hebt. Wat heb je nodig?,Godt å se at du kom. Hva trenger du?,"Dobrze widzieć, że udało ci się. Czego ci potrzeba?",Que bom que você conseguiu. O que você precisa?,,Mă bucur să văd că ai reușit. De ce ai nevoie?,"Я рад, что ты справился. Чем могу помочь?",,Det gläder mig att se att du klarade dig. Vad behöver du?,Gelebilmene sevindim. Neye ihtiyacın var? +Heal me.,TXT_RPLY0_SCRIPT10_D18192_HEALM,〃,,,Potřebuju ošetřit.,Helbrede mig.,Mach mich gesund.,,Kuracu min.,Cúrame.,,Hoida minua.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료해주세요.,Genees me.,Helbred meg.,Ulecz mnie.,Me cure.,,Bandajează-mă.,Подлечи меня.,,Laga mig.,İyileştir beni. "Well, lets get you fixed up.",TXT_RYES0_SCRIPT10_D18192_WELLL,〃,,,"Dobře, tak tě dáme dohromady.","Nå, lad os få dig ordnet.","Gut, das hier sollte helfen.",,"Bone, mi pretigu vin.","Bueno, hora de -arreglarte un poco.",,"Selvä, pistetään sinut kuntoon.","Allez, on va vous remettre sur pied.","Na, akkor pofozzunk helyre.","Molto bene, ti darò una sistemata.",では、すぐ治療しましょう。,그럼 긴급 치료하겠습니다.,"Nou, laten we je opknappen.","Vel, la oss få deg fikset opp.","Dobra, pozbieram cię do kupy.","Ok, vamos dar um jeito em você.",,"Păi, să te aranjăm.","Ну, давай приведём тебя в порядок.",,Vi får fixa till dig.,"Pekala, seni iyileştirelim." -You're fine.,TXT_RNO0_SCRIPT10_D18192_YOURE,〃,,,Jsi v pořádku.,Du har det fint.,Die geht es gut.,,Vi estas en ordo.,Estás bien.,,Olet kunnossa.,Vous allez bien.,Rendben is vagy.,Stai bene.,貴方は大丈夫です。,괜찮아 보이는데.,Je bent in orde.,Det går bra med deg.,Jesteś zdrowy.,Você está bem.,,Ești în regulă.,Ты здоров.,,Du är okej.,İyisin. -Anything new?,TXT_RPLY1_SCRIPT10_D18192_ANYTH,〃,,,Něco nového?,Noget nyt?,Irgend etwas Neues?,,Ĉu io nova?,¿Algo nuevo?,,Onko mitään uutta?,Quoi de neuf?,Valami újdonság?,Novità?,何か新しいのは?,특별한 거 없나요?,Iets nieuws?,Noe nytt?,Coś nowego?,Alguma novidade?,,Ceva nou?,Есть что-нибудь новое?,,Något nytt?,Yeni bir şey var mı? +arreglarte un poco.",,"Selvä, pistetään sinut kuntoon.","Allez, on va vous remettre sur pied.",,"Na, akkor pofozzunk helyre.","Molto bene, ti darò una sistemata.",では、すぐ治療しましょう。,그럼 긴급 치료하겠습니다.,"Nou, laten we je opknappen.","Vel, la oss få deg fikset opp.","Dobra, pozbieram cię do kupy.","Ok, vamos dar um jeito em você.",,"Păi, să te aranjăm.","Ну, давай приведём тебя в порядок.",,Vi får fixa till dig.,"Pekala, seni iyileştirelim." +You're fine.,TXT_RNO0_SCRIPT10_D18192_YOURE,〃,,,Jsi v pořádku.,Du har det fint.,Die geht es gut.,,Vi estas en ordo.,Estás bien.,,Olet kunnossa.,Vous allez bien.,,Rendben is vagy.,Stai bene.,貴方は大丈夫です。,괜찮아 보이는데.,Je bent in orde.,Det går bra med deg.,Jesteś zdrowy.,Você está bem.,,Ești în regulă.,Ты здоров.,,Du är okej.,İyisin. +Anything new?,TXT_RPLY1_SCRIPT10_D18192_ANYTH,〃,,,Něco nového?,Noget nyt?,Irgend etwas Neues?,,Ĉu io nova?,¿Algo nuevo?,,Onko mitään uutta?,Quoi de neuf?,,Valami újdonság?,Novità?,何か新しいのは?,특별한 거 없나요?,Iets nieuws?,Noe nytt?,Coś nowego?,Alguma novidade?,,Ceva nou?,Есть что-нибудь новое?,,Något nytt?,Yeni bir şey var mı? "Yes, I've got some new hardware for you.",TXT_RYES1_SCRIPT10_D18192_YESIV,〃,,,"Ano, mám pro tebe novou mašinku.","Ja, jeg har noget nyt hardware til dig.","Ja, ich habe neue Hardware für dich.",,"Jes, mi havas novan aparataron por vi.","Sí, tengo nuevo -«hardware» para ti.",,"Kyllä, minulla on sinulle uutta rautaa.","Ah, j'ai du nouveau matériel pour vous.","Igen, van pár új fegyverem számodra.","Si, ho delle nuove attrezzature per te.",貴方の為に幾つか新しいハードウェアを見つけました。,네! 사용 가능한 하드웨어가 하나 있습니다.,"Ja, ik heb wat nieuwe hardware voor je.","Ja, jeg har noe nytt utstyr til deg.","Tak, mam dla ciebie nowe oprogramowanie.","Sim, tenho equipamento novo pra você.",,"Da, am ceva hardware nou pentru tine.",Да. Новая аппаратура для тебя.,,"Ja, jag har lite ny hårdvara till dig.","Evet, senin için yeni bir donanımım var." +«hardware» para ti.",,"Kyllä, minulla on sinulle uutta rautaa.","Ah, j'ai du nouveau matériel pour vous.",,"Igen, van pár új fegyverem számodra.","Si, ho delle nuove attrezzature per te.",貴方の為に幾つか新しいハードウェアを見つけました。,네! 사용 가능한 하드웨어가 하나 있습니다.,"Ja, ik heb wat nieuwe hardware voor je.","Ja, jeg har noe nytt utstyr til deg.","Tak, mam dla ciebie nowe oprogramowanie.","Sim, tenho equipamento novo pra você.",,"Da, am ceva hardware nou pentru tine.",Да. Новая аппаратура для тебя.,,"Ja, jag har lite ny hårdvara till dig.","Evet, senin için yeni bir donanımım var." "Nope, I'm working on it though.",TXT_RNO1_SCRIPT10_D18192_NOPEI,〃,,,"Ne, ale pracuju na tom.","Nej, men jeg arbejder på det.","Nein, ich arbeite noch daran.",,"Ne, sed mi prilaboradas ĝin.","No, aunque estoy -trabajando en ello.",,Ei; on kyllä työn alla.,"Rien, mais j'y travaille.","Nem, de már dolgozom rajta.","No, ma ci sto lavorando.",いえ、只今探しています。,아뇨. 아직 작업 진행 중입니다.,"Nee, maar ik ben er wel mee bezig.","Nei, men jeg jobber med det.","Nie, jeszcze nad tym pracuję.","Não, mas estou trabalhando nisso.",,"Nu, încă lucrez la asta.","Нет, но я работаю над ним.",,"Nej, men jag jobbar på det.","Hayır, üzerinde çalışıyorum." -"What can I do for you now? Feris is decrypting some really complex files, but it's all worth it. There's already some information that I'll be able to apply to the next version of the stamina implant.",TXT_DLG_SCRIPT10_D19708_WHATC,〃 (one upgrade: Mission to talk to the Oracle),,,"Co pro tebe můžu udělat teď? Feris pracuje na dešifrování hodně složitých souborů, ale bude to stát za to. Už teď máme informace, které budu moct použít v nové verzi tvého implantátu.","Hvad kan jeg gøre for dig nu? Feris er ved at dekryptere nogle virkelig komplekse filer, men det er det hele værd. Der er allerede nogle oplysninger, som jeg vil kunne anvende til den næste version af udholdenhedsimplantatet.","Was kann ich für dich tun? Feris entschlüsselt gerade einige sehr komplexe Dateien, aber es ist den Aufwand wert. Einige dieser Informationen kann ich für die nächste Version deines Implantats anwenden.",,"Kion mi povas fari por vi? Feriso nun malĉifras kelkajn tre malsimplajn dosierojn, sed tio estos valora. Jam estas kelkaj informoj, kiujn mi povos apliki al la sekva versio de la energidona enplantaĵo.","¿Qué puedo hacer por ti? Feris está descifrando unos archivos bastante complejos, pero valdrá la pena. Ya hay algo de información que puedo aplicar a la próxima versión del implante de aguante.","¿Qué puedo hacer por ti? Feris está descifrando unos archivos bastante complejos, pero va a valer la pena. Ya hay algo de información que puedo aplicar a la próxima versión del implante de aguante.","Miten voin olla avuksi? Feris on purkamassa joidenkin todella monimutkaisten tiedostojen salausta, mutta se on sen vaivan väärti.","Que puis-je faire pour vous? Feris est en train de décrypter des fichiers très complexes, mais ça à l'air d'en valoir la peine. Il y a déjà des informations très intéressantes que l'on va pouvoir utiliser pour la prochaine version de l'implant d'endurance.","Mit tehetek érted most? Feris elég komplex fájlokat próbál épp dekódolni, de ha sikerül meg fogja érni. Már van pár információm, amit fel tudok használni az állóképesség implantátum fejlesztésére.","Che cosa posso fare per te ora? Feris sta decriptando alcuni file molto complessi, ma ne varrà la pena. Abbiamo già delle informazioni che potrò applicare nella prossima versione dell'impianto stamina.","何か御用かい?幾つかの複雑に複合化された +trabajando en ello.",,Ei; on kyllä työn alla.,"Rien, mais j'y travaille.",,"Nem, de már dolgozom rajta.","No, ma ci sto lavorando.",いえ、只今探しています。,아뇨. 아직 작업 진행 중입니다.,"Nee, maar ik ben er wel mee bezig.","Nei, men jeg jobber med det.","Nie, jeszcze nad tym pracuję.","Não, mas estou trabalhando nisso.",,"Nu, încă lucrez la asta.","Нет, но я работаю над ним.",,"Nej, men jag jobbar på det.","Hayır, üzerinde çalışıyorum." +"What can I do for you now? Feris is decrypting some really complex files, but it's all worth it. There's already some information that I'll be able to apply to the next version of the stamina implant.",TXT_DLG_SCRIPT10_D19708_WHATC,〃 (one upgrade: Mission to talk to the Oracle),,,"Co pro tebe můžu udělat teď? Feris pracuje na dešifrování hodně složitých souborů, ale bude to stát za to. Už teď máme informace, které budu moct použít v nové verzi tvého implantátu.","Hvad kan jeg gøre for dig nu? Feris er ved at dekryptere nogle virkelig komplekse filer, men det er det hele værd. Der er allerede nogle oplysninger, som jeg vil kunne anvende til den næste version af udholdenhedsimplantatet.","Was kann ich für dich tun? Feris entschlüsselt gerade einige sehr komplexe Dateien, aber es ist den Aufwand wert. Einige dieser Informationen kann ich für die nächste Version deines Implantats anwenden.",,"Kion mi povas fari por vi? Feriso nun malĉifras kelkajn tre malsimplajn dosierojn, sed tio estos valora. Jam estas kelkaj informoj, kiujn mi povos apliki al la sekva versio de la energidona enplantaĵo.","¿Qué puedo hacer por ti? Feris está descifrando unos archivos bastante complejos, pero valdrá la pena. Ya hay algo de información que puedo aplicar a la próxima versión del implante de aguante.","¿Qué puedo hacer por ti? Feris está descifrando unos archivos bastante complejos, pero va a valer la pena. Ya hay algo de información que puedo aplicar a la próxima versión del implante de aguante.","Miten voin olla avuksi? Feris on purkamassa joidenkin todella monimutkaisten tiedostojen salausta, mutta se on sen vaivan väärti.","Que puis-je faire pour vous? Feris est en train de décrypter des fichiers très complexes, mais ça à l'air d'en valoir la peine. Il y a déjà des informations très intéressantes que l'on va pouvoir utiliser pour la prochaine version de l'implant d'endurance.",,"Mit tehetek érted most? Feris elég komplex fájlokat próbál épp dekódolni, de ha sikerül meg fogja érni. Már van pár információm, amit fel tudok használni az állóképesség implantátum fejlesztésére.","Che cosa posso fare per te ora? Feris sta decriptando alcuni file molto complessi, ma ne varrà la pena. Abbiamo già delle informazioni che potrò applicare nella prossima versione dell'impianto stamina.","何か御用かい?幾つかの複雑に複合化された フェリスのファイルにはそれだけの価値はあった スタミナインプラントの次期バージョンに 適用できる情報を少しばかり見つけたんだ。","무엇을 도와드릴까요? 페리스가 아주 복잡한 파일들을 천천히 해독하는 중입니다만, 기다리는 보람이 많이 있을 거예요. 나머지 정보를 다 해독한 뒤면 진보된 지구력 향상 이식을 받으실 수 있을 겁니다.","Wat kan ik nu voor je doen? Feris ontcijfert enkele zeer complexe bestanden, maar het is het allemaal de moeite waard. Er is al wat informatie die ik kan toepassen op de volgende versie van het stamina implantaat.","Hva kan jeg gjøre for deg nå? Feris dekrypterer noen komplekse filer, men det er verdt det. Jeg har allerede informasjon som jeg kan bruke i neste versjon av utholdenhetsimplantatet.","Co mogę dla ciebie teraz zrobić? Feris @@ -11228,16 +11228,16 @@ Już mamy trochę informacji, które będę mógł wykorzystać w nowszej wersji implantu zwiększającego wytrzymałość.","Como posso te ajudar no momento? Feris está decriptando uns arquivos bem complexos, mas valerá a pena. Já temos informações que vou poder usar na próxima versão do implante de resistência.",,"Ce pot face pentru tine acum? Feris decriptează niște fișiere extrem de complexe, dar merită. Deja avem niște informații care le voi putea aplica urmatoarei versiuni ale implantului tău pentru rezistență.","Чем я могу тебе помочь? Ферис сейчас расшифровывает файлы Ордена. Это нелегко, но результат стоит того. Я уже получил кое-какие новые данные, которые помогут мне при разработке новой версии твоего импланта.",,"Vad kan jag göra för dig nu? Feris dekrypterar några riktigt komplicerade filer, men det är värt det. Det finns redan en del information som jag kommer att kunna tillämpa på nästa version av uthållighetsimplantatet.",Şimdi senin için ne yapabilirim? Feris bazı karmaşık dosyaların şifresini çözüyor ama buna değer. Dayanıklılık implantının bir sonraki versiyonuna uygulayabileceğim bazı bilgiler var. -Heal me.,TXT_RPLY0_SCRIPT10_D19708_HEALM,〃,,,Potřebuju ošetřit.,Helbred mig.,Mach mich gesund.,,Kuracu min.,Cúrame.,,Hoida minua.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료해주세요.,Genees mij.,Helbred meg.,Ulecz mnie.,Me cure.,,Bandajează-mă.,Подлечи меня.,,Laga mig.,İyileştir beni. +Heal me.,TXT_RPLY0_SCRIPT10_D19708_HEALM,〃,,,Potřebuju ošetřit.,Helbred mig.,Mach mich gesund.,,Kuracu min.,Cúrame.,,Hoida minua.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료해주세요.,Genees mij.,Helbred meg.,Ulecz mnie.,Me cure.,,Bandajează-mă.,Подлечи меня.,,Laga mig.,İyileştir beni. You should learn to be a little more careful.,TXT_RYES0_SCRIPT10_D19708_YOUSH,〃,,,Měl bys být trochu opatrnější.,Du burde lære at være lidt mere forsigtig.,Du solltest wirklich etwas vorsichtiger sein.,,"Vi devus lerni esti pli singardema.","Deberías aprender a tener -un poco más de cuidado.",,Sinun pitäisi oppia olemaan hieman varovaisempi.,Vous devriez faire plus attention à vous.,Meg kéne tanulnod óvatosabbnak lenni.,Dovresti imparare ad essere un po' più attento.,もう少し慎重にやるべきでは。,몸 간수 잘하시고 싸우세요.,Je moet leren om wat voorzichtiger te zijn.,Du burde lære deg å være litt mer forsiktig.,Powinieneś być bardziej ostrożny.,Você precisa aprender a tomar mais cuidado.,,Ar trebui să fii mai grijuliu.,В следующий раз тебе стоит быть поосторожнее.,,Du borde lära dig att vara lite mer försiktig.,Biraz daha dikkatli olmayı öğrenmelisin. -When will that be ready?,TXT_RPLY1_SCRIPT10_D19708_WHENW,〃,,,Kdy bude hotov?,Hvornår er den klar?,Wann ist es soweit?,,Kiam ĝi estos preta?,¿Cuándo estará listo?,¿Cuándo va a estar listo?,Milloin se on valmis?,Quand-est-ce que t'il sera prêt?,Mikor lesz kész?,Quando sarà pronto?,出来ているか?,이식 준비는 다 됐습니까?,Wanneer is dat klaar?,Når er det klart?,Kiedy to będzie gotowe?,Quando isso vai estar pronto?,,Când va fi gata?,Когда он будет готов?,,När kommer den att vara klar?,Ne zaman hazır olacak? +un poco más de cuidado.",,Sinun pitäisi oppia olemaan hieman varovaisempi.,Vous devriez faire plus attention à vous.,,Meg kéne tanulnod óvatosabbnak lenni.,Dovresti imparare ad essere un po' più attento.,もう少し慎重にやるべきでは。,몸 간수 잘하시고 싸우세요.,Je moet leren om wat voorzichtiger te zijn.,Du burde lære deg å være litt mer forsiktig.,Powinieneś być bardziej ostrożny.,Você precisa aprender a tomar mais cuidado.,,Ar trebui să fii mai grijuliu.,В следующий раз тебе стоит быть поосторожнее.,,Du borde lära dig att vara lite mer försiktig.,Biraz daha dikkatli olmayı öğrenmelisin. +When will that be ready?,TXT_RPLY1_SCRIPT10_D19708_WHENW,〃,,,Kdy bude hotov?,Hvornår er den klar?,Wann ist es soweit?,,Kiam ĝi estos preta?,¿Cuándo estará listo?,¿Cuándo va a estar listo?,Milloin se on valmis?,Quand-est-ce que t'il sera prêt?,,Mikor lesz kész?,Quando sarà pronto?,出来ているか?,이식 준비는 다 됐습니까?,Wanneer is dat klaar?,Når er det klart?,Kiedy to będzie gotowe?,Quando isso vai estar pronto?,,Când va fi gata?,Когда он будет готов?,,När kommer den att vara klar?,Ne zaman hazır olacak? It's ready now. This won't take but a moment.,TXT_RYES1_SCRIPT10_D19708_ITSRE,〃,,,Už je hotový. Nepotrvá to ani chvilku.,Det er klar nu. Det vil kun tage et øjeblik.,"Es ist fertig. Einen kurzen Moment, bitte.",,"Mi jam finis. Atendu nur unu momenton...","Ya lo está. Dame -solo un momento...",,Se on valmis nyt. Tähän ei mene kuin vain hetki.,"Il est déjà prêt, çe ne prendra qu'un moment.","Készen van, csak pár másodperc.",È pronto ora. Ci vorrà solo un momento.,用意出来ている。すぐ終わるさ。,다 됐습니다! 이제 이식을 시작하죠!,Het is nu klaar. Dit duurt niet langer dan een moment.,Det er klart nå. Dette tar bare et øyeblikk.,Już jest gotowe. To zajęło tylko chwilę.,Já está pronto. Isso não vai demorar.,,E gata. Va dura doar un moment.,Уже готово. Это не займёт много времени.,,Det är klart nu. Det här tar bara ett ögonblick.,Şimdi hazır. Bir dakika bile sürmez. -Soon.,TXT_RNO1_SCRIPT10_D19708_SOON,〃,,,Brzy.,Det er snart.,Bald.,,Baldaŭ.,Pronto.,,Pian.,Bientôt.,Hamarosan.,Presto.,間もなくだ。,곧 완성되요.,Binnenkort.,Snart.,Niedługo.,Logo logo.,,Curând.,Скоро.,,Snart.,Çok yakında. -I think I found a glitch in your implant hardware. Feris is helping me design a retrofit that will take care of it and boost the speed of your hardware a little. Is there something I can do for you?,TXT_DLG_SCRIPT10_D21224_ITHIN,〃 (two upgrades: Mission to decide between Macil or the Oracle),,,"Myslím, že jsem našel vadu v tvém implantátu. Feris mi pomáhá navrhnout doplněk, který se o ni postará a zvýší jeho výkon. Můžu pro tebe něco udělat?","Jeg tror, jeg har fundet en fejl i dit implantathardware. Feris hjælper mig med at designe en eftermontering, der vil løse problemet og øge hastigheden på din hardware en smule. Er der noget, jeg kan gøre for dig?","Ich glaube ich habe eine Fehlfunktion in deinem Implantat gefunden. Feris hilft mir, einen Nachrüstsatz zu bauen und seine Funktion nochmal zu verbessern. Gibt es sonst etwas, das ich für dich tun kann?",,"Ŝajnas, ke mi trovis cimeton en la aparataro de via enplantaĵo. Feriso helpas al mi dezajni modernigon por ripari ĝin kaj iomete pliigi ĝian rapidon. Ĉu mi povas fari ion por vi?",Creo haber encontrado un defecto en el «hardware» de tu implante. Feris me está ayudando a diseñar una modernización para arreglarlo y aumentarle un poco la velocidad. ¿Hay algo que pueda hacer por ti?,,"Luulen löytäneeni vian istutteesi laitteistossa. Feris auttaa minua kehittämään jälkiasennuskappaleen, joka korjaa vian ja nopeuttaa laitteistoasi vähäsen. Miten voin olla muuten avuksi?",Je crois que j'ai découvert un bug dans votre implant. Feris m'aide à concevoir une mise à jour qui la corrigera et rendra le matériel encore plus rapide. Je peux faire quelque chose pour vous?,"Azt hiszem találtam egy hibát az implantátumban. Feris segít nekem áttervezni, hogy kiküszöböljük a hibát, és kicsit fel is gyorsítsuk a hardvert. Segíthetek valami másban?",Credo di aver trovato un problema nel tuo impianto. Feris mi sta aiutando a creare un ammodernamento che lo sistemerà e migliorerà un poco la velocità del tuo impianto. C'è qualcosa che posso fare per te?,"インプラントハードウェアに不具合が見つかった +solo un momento...",,Se on valmis nyt. Tähän ei mene kuin vain hetki.,"Il est déjà prêt, çe ne prendra qu'un moment.",,"Készen van, csak pár másodperc.",È pronto ora. Ci vorrà solo un momento.,用意出来ている。すぐ終わるさ。,다 됐습니다! 이제 이식을 시작하죠!,Het is nu klaar. Dit duurt niet langer dan een moment.,Det er klart nå. Dette tar bare et øyeblikk.,Już jest gotowe. To zajęło tylko chwilę.,Já está pronto. Isso não vai demorar.,,E gata. Va dura doar un moment.,Уже готово. Это не займёт много времени.,,Det är klart nu. Det här tar bara ett ögonblick.,Şimdi hazır. Bir dakika bile sürmez. +Soon.,TXT_RNO1_SCRIPT10_D19708_SOON,〃,,,Brzy.,Det er snart.,Bald.,,Baldaŭ.,Pronto.,,Pian.,Bientôt.,,Hamarosan.,Presto.,間もなくだ。,곧 완성되요.,Binnenkort.,Snart.,Niedługo.,Logo logo.,,Curând.,Скоро.,,Snart.,Çok yakında. +I think I found a glitch in your implant hardware. Feris is helping me design a retrofit that will take care of it and boost the speed of your hardware a little. Is there something I can do for you?,TXT_DLG_SCRIPT10_D21224_ITHIN,〃 (two upgrades: Mission to decide between Macil or the Oracle),,,"Myslím, že jsem našel vadu v tvém implantátu. Feris mi pomáhá navrhnout doplněk, který se o ni postará a zvýší jeho výkon. Můžu pro tebe něco udělat?","Jeg tror, jeg har fundet en fejl i dit implantathardware. Feris hjælper mig med at designe en eftermontering, der vil løse problemet og øge hastigheden på din hardware en smule. Er der noget, jeg kan gøre for dig?","Ich glaube ich habe eine Fehlfunktion in deinem Implantat gefunden. Feris hilft mir, einen Nachrüstsatz zu bauen und seine Funktion nochmal zu verbessern. Gibt es sonst etwas, das ich für dich tun kann?",,"Ŝajnas, ke mi trovis cimeton en la aparataro de via enplantaĵo. Feriso helpas al mi dezajni modernigon por ripari ĝin kaj iomete pliigi ĝian rapidon. Ĉu mi povas fari ion por vi?",Creo haber encontrado un defecto en el «hardware» de tu implante. Feris me está ayudando a diseñar una modernización para arreglarlo y aumentarle un poco la velocidad. ¿Hay algo que pueda hacer por ti?,,"Luulen löytäneeni vian istutteesi laitteistossa. Feris auttaa minua kehittämään jälkiasennuskappaleen, joka korjaa vian ja nopeuttaa laitteistoasi vähäsen. Miten voin olla muuten avuksi?",Je crois que j'ai découvert un bug dans votre implant. Feris m'aide à concevoir une mise à jour qui la corrigera et rendra le matériel encore plus rapide. Je peux faire quelque chose pour vous?,,"Azt hiszem találtam egy hibát az implantátumban. Feris segít nekem áttervezni, hogy kiküszöböljük a hibát, és kicsit fel is gyorsítsuk a hardvert. Segíthetek valami másban?",Credo di aver trovato un problema nel tuo impianto. Feris mi sta aiutando a creare un ammodernamento che lo sistemerà e migliorerà un poco la velocità del tuo impianto. C'è qualcosa che posso fare per te?,"インプラントハードウェアに不具合が見つかった フェリスがそれを修正してハードウェアの性能を 上げる為の後付け機能を手伝ってくれた。 何か必要かい?","전에 이식한 지구력 향상 칩에 오류가 좀 발견되었더군요. 그 오류를 잡은 최근 버전을 페리스랑 같이 만드는 참입니다. 아무튼, 원하시는 게 있나요?",Ik denk dat ik een storing in uw implantaathardware heb gevonden. Feris helpt me bij het ontwerpen van een retrofit die de snelheid van uw hardware een beetje zal verhogen. Kan ik iets voor u doen?,Jeg tror jeg har funnet en feil i implantatets maskinvare. Feris hjelper meg med å designe en oppgradering som vil ta seg av det og øke hastigheten på maskinvaren din litt. Er det noe jeg kan gjøre for deg?,"Chyba znalazłem błąd w @@ -11247,15 +11247,15 @@ ulepszenie do niego, które naprawi ten błąd i ulepszy trochę twoją szybkość. Czy coś jeszcze mogę dla ciebie zrobić?",Acho que encontrei um defeito no seu implante. Feris está me ajudando a desenvolver um aprimoramento que resolverá esse problema e também vai aumentar um pouco a velocidade. Precisa de alguma coisa?,,Cred că am găsit o problemă în implantul tău. Feris mă ajută la implementarea unor îmbunătățiri care vor avea grijă de el și vor crește viteza puțin. E ceva ce pot face pentru tine?,"Кажется, я обнаружил неполадку в устройстве твоего импланта. Ферис помогает мне в разработке модификации, которая исправит её и немного ускорит работу устройства. Чем я могу тебе помочь?",,Jag tror att jag har hittat ett glapp i din implantathårdvara. Feris hjälper mig att utforma en eftermontering som kommer att ta hand om det och öka hastigheten på din hårdvara lite. Finns det något jag kan göra för dig?,Sanırım implant donanımında bir hata buldum. Feris bunu halledecek ve donanımınızın hızını biraz artıracak bir güçlendirme tasarlamama yardım ediyor. Senin için yapabileceğim bir şey var mı? -Patch me up.,TXT_RPLY0_SCRIPT10_D21224_PATCH,〃,,,Potřebuju ošetřit.,Giv mig en besked.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Kasaa minut takaisin kokoon.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Verbind me met elkaar.,Lappe meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Bandajează-mă.,Подлатай меня.,,Laga mig.,Bana yama yap. -"There, as good as new I guess.",TXT_RYES0_SCRIPT10_D21224_THERE,〃,,,"Tak, a jsi jako nový.","Sådan, så god som ny, tror jeg.","So, fast wie neu, würde ich sagen.",,"Farite, kiel nova, mi kredas.","Ya está, como nuevo, supongo.",,"Kas niin, kuin uudenveroinen, luulisin.","Voilà, comme neuf, je crois.","Parancsolj, jobb mint új korában.","Ecco qua, come nuovo.",ほら、新鮮な気分だろう。,"자, 갓 태어난 것처럼 멀쩡할 겁니다!","Daar, zo goed als nieuw denk ik.","Sånn, så god som ny, antar jeg.",Proszę. Jak nowy. Chyba.,"Pronto. Novinho em folha, eu acho.",,"Gata, ca și nou bănuiesc.","Ну вот, прям как новенький.",,"Så där, så gott som ny antar jag.","İşte, yeni kadar iyi sanırım." -Retrofit?,TXT_RPLY1_SCRIPT10_D21224_RETRO,〃,,,Doplněk?,Eftermontering?,Nachrüstsatz?,,Ĉu modernigo?,¿Modernización?,,Jälkiasennuskappale?,Mise à jour de l'implant?,Áttervezni?,Ammodernamento?,後付け?,향상 칩 최근 버전?,Retrofit?,Oppgradering?,Ulepszenie?,Aprimoramento?,,Îmbunătățiri?,Модернизация?,,Eftermontering?,Güçlendirme mi? -"Ah, now we're cooking.",TXT_RYES1_SCRIPT10_D21224_AHNOW,〃 (during sad/bad ending),,,"Ahá, a už to jede.","Ah, nu er vi i gang.","Ah, jetzt bist du bei der Sache.",,"Ha, ĉi tio iĝas serioza.","Ah, ahora sí que sí.",,No nyt päästiin asiaan.,"Ah, on va s'amuser.",Ez a beszéd!,"Ah, ora ci siamo.",ああ、早速取り掛かろう。,이제야 좀 멋져 보이는군요.,"Ah, nu zijn we aan het koken.",Nå er vi i gang.,"Ah, no i to rozumiem.","Ah, agora sim.",,"Ah, acum discutăm.",Да. Мы славно поработали над ней.,,"Ah, nu börjar det bli spännande.",İşte şimdi pişiyoruz. +Patch me up.,TXT_RPLY0_SCRIPT10_D21224_PATCH,〃,,,Potřebuju ošetřit.,Giv mig en besked.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Kasaa minut takaisin kokoon.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Verbind me met elkaar.,Lappe meg sammen.,Opatrz mnie.,Trate meus ferimentos.,,Bandajează-mă.,Подлатай меня.,,Laga mig.,Bana yama yap. +"There, as good as new I guess.",TXT_RYES0_SCRIPT10_D21224_THERE,〃,,,"Tak, a jsi jako nový.","Sådan, så god som ny, tror jeg.","So, fast wie neu, würde ich sagen.",,"Farite, kiel nova, mi kredas.","Ya está, como nuevo, supongo.",,"Kas niin, kuin uudenveroinen, luulisin.","Voilà, comme neuf, je crois.",,"Parancsolj, jobb mint új korában.","Ecco qua, come nuovo.",ほら、新鮮な気分だろう。,"자, 갓 태어난 것처럼 멀쩡할 겁니다!","Daar, zo goed als nieuw denk ik.","Sånn, så god som ny, antar jeg.",Proszę. Jak nowy. Chyba.,"Pronto. Novinho em folha, eu acho.",,"Gata, ca și nou bănuiesc.","Ну вот, прям как новенький.",,"Så där, så gott som ny antar jag.","İşte, yeni kadar iyi sanırım." +Retrofit?,TXT_RPLY1_SCRIPT10_D21224_RETRO,〃,,,Doplněk?,Eftermontering?,Nachrüstsatz?,,Ĉu modernigo?,¿Modernización?,,Jälkiasennuskappale?,Mise à jour de l'implant?,,Áttervezni?,Ammodernamento?,後付け?,향상 칩 최근 버전?,Retrofit?,Oppgradering?,Ulepszenie?,Aprimoramento?,,Îmbunătățiri?,Модернизация?,,Eftermontering?,Güçlendirme mi? +"Ah, now we're cooking.",TXT_RYES1_SCRIPT10_D21224_AHNOW,〃 (during sad/bad ending),,,"Ahá, a už to jede.","Ah, nu er vi i gang.","Ah, jetzt bist du bei der Sache.",,"Ha, ĉi tio iĝas serioza.","Ah, ahora sí que sí.",,No nyt päästiin asiaan.,"Ah, on va s'amuser.",,Ez a beszéd!,"Ah, ora ci siamo.",ああ、早速取り掛かろう。,이제야 좀 멋져 보이는군요.,"Ah, nu zijn we aan het koken.",Nå er vi i gang.,"Ah, no i to rozumiem.","Ah, agora sim.",,"Ah, acum discutăm.",Да. Мы славно поработали над ней.,,"Ah, nu börjar det bli spännande.",İşte şimdi pişiyoruz. I'll have it as soon as Feris finishes it.,TXT_RNO1_SCRIPT10_D21224_ILLHA,〃,,,"Budu ho mít hned, co ho Feris dokončí.","Jeg får den, så snart Feris er færdig.","Ich gebe es dir, sobald Feris fertig ist.",,"Mi havos ĝin tuj kiam Feriso finos.","La tendré lista en cuanto Feris la termine.","La voy a tener lista -en cuanto Feris la termine.","Asennan sen heti, kun Feris saa sen valmiiksi.",Je l'aurai dès que Feris l'a terminée.,"Meglesz egyből, amikor Feris végez vele.",Te lo farò avere non appena Feris lo finisce.,完了次第フェリスから私が送ろう。,페리스가 작업을 마치는 순간 보여드리겠습니다.,Ik heb het zodra Feris het klaar heeft.,Jeg får den så snart Feris er ferdig.,Będzie gotowe jak Feris je skończy.,Eu consigo ele assim que o Feris terminar.,,Îl voi avea imediat ce termină Feris cu el.,"Она будет у меня, как только Ферис закончит.",,Jag har den så snart Feris är klar.,Feris bitirir bitirmez getireceğim. -"How's it going? Man, some of this new technology is simply amazing. This should also help with your implant. I've got a couple ideas that I'm sketching out and I'll have them ready soon. What can I do for you, maybe some healing?",TXT_DLG_SCRIPT10_D22740_HOWSI,〃 (three upgrades: Mission to kill the Loremaster with the Oracle alive).,,,"Jak se vede? Sakra, některé tychle nové technologie jsou prostě úžasné. Mělo by ti to taky pomoct s tvým implantátem. Mám už pár nápadů, teď je dávám na papír a brzy by měly být hotové. Co pro tebe mohu udělat, nějaké ošetření?","Hvordan går det? Mand, noget af denne nye teknologi er simpelthen fantastisk. Det burde også hjælpe med dit implantat. Jeg har et par idéer, som jeg skitserer, og jeg har dem snart klar. Hvad kan jeg gøre for dig? Måske noget healing?","Wie läuft es? Mann, einiges von dieser Technologie ist einfach erstaunlich. Da sollte auch mit deinem Implantat helfen. Ich habe da schon einige Ideen, die ich noch ausarbeiten muss, aber sie werden bald fertig sein. Was kann ich sonst für dich tun?",,"Kiel vi fartas? Ulo, kelkaj el ĉi tiuj novaj teknologioj estas nekredeblaj; ili devus helpi al via enplantaĵo. Mi havas kelkajn planatajn ideojn, kiuj baldaŭ estos pretaj. Kion mi povas fari por vi? Ĉu eble kuraci vin?","¿Cómo te va? Tío, algunas de estas nuevas tecnologías son realmente sorprendentes; deberían ayudar con tu implante. Tengo unas cuantas ideas que voy planeando y las tendré listas pronto. ¿Qué puedo hacer por ti?, ¿tal vez curarte?","¿Cómo te va? Hombre, algunas de estas nuevas tecnologías son realmente sorprendentes; deberían ayudar con tu implante. Tengo unas cuantas ideas que voy planeando y las voy a tener listas pronto. ¿Qué puedo hacer por ti?, ¿tal vez curarte?","Kuinka sujuu? Ei hitsi, osa tästä uudesta teknologiasta on yksinkertaisesti hämmästyttävää. Sen pitäisi auttaa myös istutteesi kanssa. Luonnostelen tässä paria ideaa, jotka saan toteutettua pian. Mutta, miten voisin olla avuksi; sairaanhoidon tarpeessa kenties?","Comment ça va? La vache, cete nouvelle technologie est simplement géniale. Elle devrait également aider pour le dévelopment de votre implant. J'ai quelques idées que je suis en train de tester et elles devraient être bientôt prêtes. Que puis-je faire pour vous? Des soins, peut être?","Hogy ityeg? Némely új technológia egyszerűen csodálatos. Ez kicsit feljavítja az implantátumodat is ha minden igaz. Van pár ötletem amit még most jegyzetelek ki, de hamarosan meglesz. Node mit tehetek érted, esetleg valami gyógyítás?","Come ti va? Te lo devo dire, alcune di queste nuove tecnologie sono semplicemente fantastiche. Questo dovrebbe anche aiutarti con il tuo impianto. Ho un paio di idee che sto elaborando e dovrei averle pronte presto. Cosa posso fare nel frattempo, hai bisogno di cure?","調子はどうだ?この新技術は素晴らしいものだ。 +en cuanto Feris la termine.","Asennan sen heti, kun Feris saa sen valmiiksi.",Je l'aurai dès que Feris l'a terminée.,,"Meglesz egyből, amikor Feris végez vele.",Te lo farò avere non appena Feris lo finisce.,完了次第フェリスから私が送ろう。,페리스가 작업을 마치는 순간 보여드리겠습니다.,Ik heb het zodra Feris het klaar heeft.,Jeg får den så snart Feris er ferdig.,Będzie gotowe jak Feris je skończy.,Eu consigo ele assim que o Feris terminar.,,Îl voi avea imediat ce termină Feris cu el.,"Она будет у меня, как только Ферис закончит.",,Jag har den så snart Feris är klar.,Feris bitirir bitirmez getireceğim. +"How's it going? Man, some of this new technology is simply amazing. This should also help with your implant. I've got a couple ideas that I'm sketching out and I'll have them ready soon. What can I do for you, maybe some healing?",TXT_DLG_SCRIPT10_D22740_HOWSI,〃 (three upgrades: Mission to kill the Loremaster with the Oracle alive).,,,"Jak se vede? Sakra, některé tychle nové technologie jsou prostě úžasné. Mělo by ti to taky pomoct s tvým implantátem. Mám už pár nápadů, teď je dávám na papír a brzy by měly být hotové. Co pro tebe mohu udělat, nějaké ošetření?","Hvordan går det? Mand, noget af denne nye teknologi er simpelthen fantastisk. Det burde også hjælpe med dit implantat. Jeg har et par idéer, som jeg skitserer, og jeg har dem snart klar. Hvad kan jeg gøre for dig? Måske noget healing?","Wie läuft es? Mann, einiges von dieser Technologie ist einfach erstaunlich. Da sollte auch mit deinem Implantat helfen. Ich habe da schon einige Ideen, die ich noch ausarbeiten muss, aber sie werden bald fertig sein. Was kann ich sonst für dich tun?",,"Kiel vi fartas? Ulo, kelkaj el ĉi tiuj novaj teknologioj estas nekredeblaj; ili devus helpi al via enplantaĵo. Mi havas kelkajn planatajn ideojn, kiuj baldaŭ estos pretaj. Kion mi povas fari por vi? Ĉu eble kuraci vin?","¿Cómo te va? Tío, algunas de estas nuevas tecnologías son realmente sorprendentes; deberían ayudar con tu implante. Tengo unas cuantas ideas que voy planeando y las tendré listas pronto. ¿Qué puedo hacer por ti?, ¿tal vez curarte?","¿Cómo te va? Hombre, algunas de estas nuevas tecnologías son realmente sorprendentes; deberían ayudar con tu implante. Tengo unas cuantas ideas que voy planeando y las voy a tener listas pronto. ¿Qué puedo hacer por ti?, ¿tal vez curarte?","Kuinka sujuu? Ei hitsi, osa tästä uudesta teknologiasta on yksinkertaisesti hämmästyttävää. Sen pitäisi auttaa myös istutteesi kanssa. Luonnostelen tässä paria ideaa, jotka saan toteutettua pian. Mutta, miten voisin olla avuksi; sairaanhoidon tarpeessa kenties?","Comment ça va? La vache, cete nouvelle technologie est simplement géniale. Elle devrait également aider pour le dévelopment de votre implant. J'ai quelques idées que je suis en train de tester et elles devraient être bientôt prêtes. Que puis-je faire pour vous? Des soins, peut être?",,"Hogy ityeg? Némely új technológia egyszerűen csodálatos. Ez kicsit feljavítja az implantátumodat is ha minden igaz. Van pár ötletem amit még most jegyzetelek ki, de hamarosan meglesz. Node mit tehetek érted, esetleg valami gyógyítás?","Come ti va? Te lo devo dire, alcune di queste nuove tecnologie sono semplicemente fantastiche. Questo dovrebbe anche aiutarti con il tuo impianto. Ho un paio di idee che sto elaborando e dovrei averle pronte presto. Cosa posso fare nel frattempo, hai bisogno di cure?","調子はどうだ?この新技術は素晴らしいものだ。 そちらのインプラントにも役立つ様な アイディアも幾つか思いついてあるぞ。 すぐ準備しよう。それとも治療か何か必要かな?","별일 없으시죠? 세상에나, 오더의 과학력은 세계 제일이군요! 이식한 칩이랑 추가 설치가 가능한데, 성능을 향상해줄 거에요. 현재 부품을 더 설계하고 있습니다. 만약 준비가 되면 불러줄게요. 아무튼, 치료가 필요하신가요?","Hoe gaat het? Man, sommige van deze nieuwe technologie is gewoonweg verbazingwekkend. Dit zou ook moeten helpen bij uw implantaat. Ik heb een paar ideeën die ik aan het schetsen ben en ik zal ze binnenkort klaar hebben. Wat kan ik voor je doen, misschien wat genezing?","Hvordan går det? Noe av denne nye teknologien er helt utrolig. Dette burde også hjelpe med implantatet ditt. Jeg har et par ideer som jeg skisserer, og de er snart klare. Hva kan jeg gjøre for deg, kanskje litt healing?","Jak się masz? Człowieku... Te nowe @@ -11265,13 +11265,13 @@ Mam parę pomysłów w zanadrzu i niedługo postaram się je zrealizować. Co mogę dla ciebie zrobić? Może trochę podleczyć?","Qual é a boa? Cara, essa tecnologia nova é simplesmente incrível. Isto também deve ajudar com o seu implante. Estou projetando umas idéias novas e logo mais devo ter elas prontas. Precisa de alguma coisa? Talvez cura?",,"Cum merge? Frate, noua tehnologie e pur și simplu uimitoare. Asta ar trebui să îți ajute și implantul. Am câteva idei pe hârtie și le voi pune în aplicare curând. Ce pot face pentru tine, poate să te bandajez?","Как дела? О, среди этих новых технологий есть просто изумительные! Их можно применить при усовершенствовании твоего импланта. Я сейчас воплощаю в жизнь парочку идей, и скоро всё будет готово. Чем я могу тебе помочь, лечением?",,"Hur går det? En del av den här nya tekniken är helt enkelt fantastisk. Det här borde också hjälpa dig med ditt implantat. Jag har några idéer som jag skissar på och jag har dem klara snart. Vad kan jag göra för dig, kanske lite healing?","Nasıl gidiyor? Dostum, bu yeni teknolojinin bazıları tek kelimeyle inanılmaz. Bu implantına da yardımcı olacaktır. Taslağını çizdiğim birkaç fikir var, yakında hazır ederim. Senin için ne yapabilirim, belki biraz şifa?" -"Yes, heal me.",TXT_RPLY0_SCRIPT10_D22740_YESHE,〃,,,"Ano, ošetři mě.","Ja, helbrede mig.","Ja, mach mich gesund.",,"Jes, kuracu min.","Sí, cúrame.",,"Kyllä, paranna minut.","Oui, soignez-moi.","Igen, gyógyíts fel.","Sì, curami.",ああ、治してくれ。,네. 치료해주세요.,"Ja, genees me.","Ja, helbrede meg.","Tak, ulecz mnie.","Sim, me cure.",,"Da, bandajează-mă.","Да, полечи меня.",,"Ja, bota mig.","Evet, iyileştir beni." -"All right, here you go.",TXT_RYES0_SCRIPT10_D22740_ALLRI,〃,,,"Dobře, to by bylo.","Okay, værsgo.",Alles klar soweit.,,"Bone, farite.","Muy bien, ya está.",,"Hyvä on, tästä se lähtee.","Très bien, bous pouvez y aller.","Rendben, parancsolj.","Va bene, ecco fatto.",了解、始めましょう。,더욱 더 건강하게 치료했습니다.,"Oké, alsjeblieft.","Greit, vær så god.",Proszę bardzo.,"Ok, pronto.",,Gata.,Хорошо. Уже готово.,,"Okej, varsågod.","Pekala, al bakalım." -How about that new tech?,TXT_RPLY1_SCRIPT10_D22740_HOWAB,〃,,,Co ta nová technologie?,Hvad med den nye teknologi?,Was ist mit der neuen Technologie?,,Kio pri la nova teknologio?,¿Qué tal la nueva tecnología?,,Miten olisi se uusi teknologia?,Quoi de nouveau pour cette technologie?,Mi újság azzal az új technológiával?,E riguardo queste nuove technologie?,その新しい技術はどうだ?,세계 제일의 부품은 어떻습니까?,Hoe zit het met die nieuwe technologie?,Hva med den nye teknologien?,Co z tymi nowymi technologiami?,Me fale sobre essa nova tecnologia.,,Ce zici de tehnologia aceea nouă?,Как там с новыми технологиями?,,Vad sägs om den nya tekniken?,Şu yeni teknolojiye ne dersin? -Let me know how this works.,TXT_RYES1_SCRIPT10_D22740_LETME,〃,,,"Dej mi vědět, jak to funguje.","Lad mig vide, hvordan den virker.","Erklär mir, wie es funktioniert.",,Sciigu min vi mem.,Cuéntame que tal funciona.,,"Kerro sitten, miten se toimii.",Dites-moi si ça fonctionne.,"Majd mondd meg, hogy hogyan szuperál.",Fammi sapere come funziona.,これでどんな調子か教えてくれ。,잘 작동되면 알려주시길!,Laat me weten hoe dit werkt.,Fortell meg hvordan den virker.,Daj znać czy działa.,Me conte como funciona.,,Să-mi spui cum funcționează asta.,"Дай мне знать, если будут неполадки.",,Låt mig veta hur den fungerar.,Nasıl çalıştığını bana anlat. +"Yes, heal me.",TXT_RPLY0_SCRIPT10_D22740_YESHE,〃,,,"Ano, ošetři mě.","Ja, helbrede mig.","Ja, mach mich gesund.",,"Jes, kuracu min.","Sí, cúrame.",,"Kyllä, paranna minut.","Oui, soignez-moi.",,"Igen, gyógyíts fel.","Sì, curami.",ああ、治してくれ。,네. 치료해주세요.,"Ja, genees me.","Ja, helbrede meg.","Tak, ulecz mnie.","Sim, me cure.",,"Da, bandajează-mă.","Да, полечи меня.",,"Ja, bota mig.","Evet, iyileştir beni." +"All right, here you go.",TXT_RYES0_SCRIPT10_D22740_ALLRI,〃,,,"Dobře, to by bylo.","Okay, værsgo.",Alles klar soweit.,,"Bone, farite.","Muy bien, ya está.",,"Hyvä on, tästä se lähtee.","Très bien, bous pouvez y aller.",,"Rendben, parancsolj.","Va bene, ecco fatto.",了解、始めましょう。,더욱 더 건강하게 치료했습니다.,"Oké, alsjeblieft.","Greit, vær så god.",Proszę bardzo.,"Ok, pronto.",,Gata.,Хорошо. Уже готово.,,"Okej, varsågod.","Pekala, al bakalım." +How about that new tech?,TXT_RPLY1_SCRIPT10_D22740_HOWAB,〃,,,Co ta nová technologie?,Hvad med den nye teknologi?,Was ist mit der neuen Technologie?,,Kio pri la nova teknologio?,¿Qué tal la nueva tecnología?,,Miten olisi se uusi teknologia?,Quoi de nouveau pour cette technologie?,,Mi újság azzal az új technológiával?,E riguardo queste nuove technologie?,その新しい技術はどうだ?,세계 제일의 부품은 어떻습니까?,Hoe zit het met die nieuwe technologie?,Hva med den nye teknologien?,Co z tymi nowymi technologiami?,Me fale sobre essa nova tecnologia.,,Ce zici de tehnologia aceea nouă?,Как там с новыми технологиями?,,Vad sägs om den nya tekniken?,Şu yeni teknolojiye ne dersin? +Let me know how this works.,TXT_RYES1_SCRIPT10_D22740_LETME,〃,,,"Dej mi vědět, jak to funguje.","Lad mig vide, hvordan den virker.","Erklär mir, wie es funktioniert.",,Sciigu min vi mem.,Cuéntame que tal funciona.,,"Kerro sitten, miten se toimii.",Dites-moi si ça fonctionne.,,"Majd mondd meg, hogy hogyan szuperál.",Fammi sapere come funziona.,これでどんな調子か教えてくれ。,잘 작동되면 알려주시길!,Laat me weten hoe dit werkt.,Fortell meg hvordan den virker.,Daj znać czy działa.,Me conte como funciona.,,Să-mi spui cum funcționează asta.,"Дай мне знать, если будут неполадки.",,Låt mig veta hur den fungerar.,Nasıl çalıştığını bana anlat. I'm not done designing it yet.,TXT_RNO1_SCRIPT10_D22740_IMNOT,〃,,,Ještě s ní nejsem hotový.,Jeg er ikke færdig med at designe den endnu.,Ich bin noch nicht fertig damit.,,"Mi ankoraŭ -ne finis dezajni ĝin.",Aún no termino de diseñarla.,,Se on vielä kehitteillä.,Je n'ai pas fini mon concept pour l'instant.,Még nem végeztem a tervezéssel.,Non ho ancora finito il progetto.,まだ完成していない。,설계가 아직 끝나지 않았어요.,Ik ben nog niet klaar met het ontwerpen ervan.,Jeg er ikke ferdig med å designe den ennå.,Skończyłem już projektować.,Ainda não terminei de desenvolvê-la.,,Încă nu am terminat să o construiesc.,Я ещё не закончил с ними.,,Jag är inte klar med designen än.,Henüz tasarlamayı bitirmedim. -"Back again, don't you ever tire of this? I've got some good news, Feris found a way to increase the output of your implant. He gave the specs to me and I'm trying to get it to blend with your physiology. I'm force growing some tissue, totally new stuff here, I hope it takes. Do you need healing?",TXT_DLG_SCRIPT10_D24256_BACKA,〃 (four upgrades).,,,"Zase zpátky, nezmáhá tě to? Mám pro tebe dobrou zprávu, Feris našel způsob, jak zvýšit výkon tvého implantátu. Dal mi specifikace a snažím se je teď seřídit s tvou fyziologií. Nechávám růst nějaké tkáně, je to úplně nová technologie, snad to zabere. Potřebuješ ošetřit?","Tilbage igen, bliver du aldrig træt af det her? Jeg har gode nyheder. Feris har fundet en måde at øge dit implantats effekt på. Han gav mig specifikationerne, og jeg forsøger at få det til at passe ind i din fysiologi. Jeg tvinger noget væv til at vokse, helt nye ting her, jeg håber, det virker. Har du brug for healing?","Schon wieder zurück, wird das nicht langweilig? Ivh habe gute Nachrichten. Feris hat eine Methode gefunden, um dein Implantat zu optimieren. Er hat mir die Spezifikationen gegeben und ich versuche, sie mit deiner Physiologie zu kombinieren. Ich lasse hier etwas Gewebe wachsen, völlig neues Zeug. Brauchst du medizinische Versorgung?",,"Ĉu denove ĉi tie? Ĉu vi ne estas laca pri ĉi tio? Mi havas bonajn novaĵojn: Feriso trovis manieron pliigi la eligon de via enplantaĵo; li donis al mi la specifojn kaj mi provas miksi ĝin kun via fiziologio. Mi forcas kelkajn histojn, io tute nova, tio espereble prosperos. Ĉu vi bezonas kuraci vin?","¿De vuelta otra vez?, ¿no te cansas de esto? Tengo buenas noticias: Feris ha encontrado una forma de potenciar la salida de tu implante; me ha dado las especificaciones y estoy intentando mezclarlo con tu fisiología. Estoy forzando el crecimiento de algunos tejidos, algo totalmente nuevo, a ver si sirve. ¿Necesitas curarte?","¿De vuelta otra vez?, ¿no te cansas de esto? Tengo buenas noticias: Feris encontró una forma de potenciar la salida de tu implante; me dio las especificaciones y estoy tratando de mezclarlo con tu fisiología. Estoy forzando el crecimiento de algunos tejidos, algo totalmente nuevo, a ver si sirve. ¿Necesitas curarte?","Täällä taas? Eikö tämä ala jo kyllästyttää? No, minulla on hyviä uutisia: Feris keksi keinon parantaa istutteesi tehoa. Hän antoi minulle tekniset määritelmät, jotka yritän sovittaa sinun fysiologiaasi. Tehokasvatan tässä vähän kudosta; ihan huipputekniikasta siis kyse. Toivottavasti toimii. Tarvitsetko sairaanhoitoa?","Déjà de retour? Vous n'êtes jamais fatigué, hein? J'ai de bonnes nouvelles. Feris à trouvé un moyen d'augementer la capacité de votre implant. Il m'a donné les spécifications et j'essaie de les faire correspondre à votre physiologie. Je suis en train de forcer la croissance de tissus, quelque chose de totalement nouveau. J'espère que ça fonctionnera. Vous avez besoin de soins?","Máris visszajöttél...nem fáradtál még bele? Van amúgy jó hírem, Feris kitalálta, hogyan növeljük az implantátum hatékonyságát. Ide adta a specifikációkat, és most próbálom a testformádra szabni. Épp próbálok mesterségesen szövetet növeszteni, elég új ez nekem, remélem működni fog. Kell valami gyógyítás?","Di nuovo qua, non ti stanchi mai? Ho delle buone notizie, Feris ha trovato un modo per migliorare la performance del tuo impianto. Mi ha dato le schematiche, adesso devo adattarle alla tua fisiologia. Sto creando del nuovo tessuto qua nel laboratorio, spero vada bene. Comunque, hai bisogno di cure?","戻ったか、まだ疲れてないか?なら幾らか +ne finis dezajni ĝin.",Aún no termino de diseñarla.,,Se on vielä kehitteillä.,Je n'ai pas fini mon concept pour l'instant.,,Még nem végeztem a tervezéssel.,Non ho ancora finito il progetto.,まだ完成していない。,설계가 아직 끝나지 않았어요.,Ik ben nog niet klaar met het ontwerpen ervan.,Jeg er ikke ferdig med å designe den ennå.,Skończyłem już projektować.,Ainda não terminei de desenvolvê-la.,,Încă nu am terminat să o construiesc.,Я ещё не закончил с ними.,,Jag är inte klar med designen än.,Henüz tasarlamayı bitirmedim. +"Back again, don't you ever tire of this? I've got some good news, Feris found a way to increase the output of your implant. He gave the specs to me and I'm trying to get it to blend with your physiology. I'm force growing some tissue, totally new stuff here, I hope it takes. Do you need healing?",TXT_DLG_SCRIPT10_D24256_BACKA,〃 (four upgrades).,,,"Zase zpátky, nezmáhá tě to? Mám pro tebe dobrou zprávu, Feris našel způsob, jak zvýšit výkon tvého implantátu. Dal mi specifikace a snažím se je teď seřídit s tvou fyziologií. Nechávám růst nějaké tkáně, je to úplně nová technologie, snad to zabere. Potřebuješ ošetřit?","Tilbage igen, bliver du aldrig træt af det her? Jeg har gode nyheder. Feris har fundet en måde at øge dit implantats effekt på. Han gav mig specifikationerne, og jeg forsøger at få det til at passe ind i din fysiologi. Jeg tvinger noget væv til at vokse, helt nye ting her, jeg håber, det virker. Har du brug for healing?","Schon wieder zurück, wird das nicht langweilig? Ivh habe gute Nachrichten. Feris hat eine Methode gefunden, um dein Implantat zu optimieren. Er hat mir die Spezifikationen gegeben und ich versuche, sie mit deiner Physiologie zu kombinieren. Ich lasse hier etwas Gewebe wachsen, völlig neues Zeug. Brauchst du medizinische Versorgung?",,"Ĉu denove ĉi tie? Ĉu vi ne estas laca pri ĉi tio? Mi havas bonajn novaĵojn: Feriso trovis manieron pliigi la eligon de via enplantaĵo; li donis al mi la specifojn kaj mi provas miksi ĝin kun via fiziologio. Mi forcas kelkajn histojn, io tute nova, tio espereble prosperos. Ĉu vi bezonas kuraci vin?","¿De vuelta otra vez?, ¿no te cansas de esto? Tengo buenas noticias: Feris ha encontrado una forma de potenciar la salida de tu implante; me ha dado las especificaciones y estoy intentando mezclarlo con tu fisiología. Estoy forzando el crecimiento de algunos tejidos, algo totalmente nuevo, a ver si sirve. ¿Necesitas curarte?","¿De vuelta otra vez?, ¿no te cansas de esto? Tengo buenas noticias: Feris encontró una forma de potenciar la salida de tu implante; me dio las especificaciones y estoy tratando de mezclarlo con tu fisiología. Estoy forzando el crecimiento de algunos tejidos, algo totalmente nuevo, a ver si sirve. ¿Necesitas curarte?","Täällä taas? Eikö tämä ala jo kyllästyttää? No, minulla on hyviä uutisia: Feris keksi keinon parantaa istutteesi tehoa. Hän antoi minulle tekniset määritelmät, jotka yritän sovittaa sinun fysiologiaasi. Tehokasvatan tässä vähän kudosta; ihan huipputekniikasta siis kyse. Toivottavasti toimii. Tarvitsetko sairaanhoitoa?","Déjà de retour? Vous n'êtes jamais fatigué, hein? J'ai de bonnes nouvelles. Feris à trouvé un moyen d'augementer la capacité de votre implant. Il m'a donné les spécifications et j'essaie de les faire correspondre à votre physiologie. Je suis en train de forcer la croissance de tissus, quelque chose de totalement nouveau. J'espère que ça fonctionnera. Vous avez besoin de soins?",,"Máris visszajöttél...nem fáradtál még bele? Van amúgy jó hírem, Feris kitalálta, hogyan növeljük az implantátum hatékonyságát. Ide adta a specifikációkat, és most próbálom a testformádra szabni. Épp próbálok mesterségesen szövetet növeszteni, elég új ez nekem, remélem működni fog. Kell valami gyógyítás?","Di nuovo qua, non ti stanchi mai? Ho delle buone notizie, Feris ha trovato un modo per migliorare la performance del tuo impianto. Mi ha dato le schematiche, adesso devo adattarle alla tua fisiologia. Sto creando del nuovo tessuto qua nel laboratorio, spero vada bene. Comunque, hai bisogno di cure?","戻ったか、まだ疲れてないか?なら幾らか 良いニュースが届いた、フェリスが君の インプラント機能を増幅させる方法を見つけた。 彼がそのスペックを見せてくれたが、 @@ -11286,17 +11286,17 @@ fizjologii. Wymuszam tworzenie nowej tkanki. To zupełnie nowa technologia. Mam nadzieję, że zadziała. Potrzebujesz leczenia?","De volta mais uma vez. Você não se cansa disso? Tenho boas novas, Feris acho um jeito de aumentar o rendimento do seu implante. Ele me passou as especificações e estou tentando fazer ele se mesclar com a sua fisiologia. Estou criando tecidos novos, novidade total. Espero que sirva bem. Precisa de cura?",,"Te-ai întors din nou, nu te plictisești niciodată? Am niște vești bune, Feris a descoperit o metodă de a îți îmbunătății implantul. Mi-a dat specificațiile și acum încerc să îl combin cu fizicul tău. Cresc forțat niște țesut, ceva complet nou. Ai nevoie de asistență?","Ты снова ранен? Тебе самому ещё не надоело? У меня для тебя хорошие новости: Ферис нашёл способ увеличить эффективность твоего импланта. Он дал мне схемы, и я пытаюсь подогнать имплант под твою физиологию. Я сейчас выращиваю кое-какие ткани. Раньше я никогда этого не делал, но надеюсь, что это сработает. Итак, тебе нужно лечение?",,"Tillbaka igen, tröttnar du aldrig på det här? Jag har goda nyheter, Feris har hittat ett sätt att öka effekten av ditt implantat. Han gav specifikationerna till mig och jag försöker få det att smälta in i din fysiologi. Jag tvångsodlar lite vävnad, helt nya saker här, jag hoppas att det fungerar. Behöver du läkning?","Yine başladık, bundan hiç bıkmadın mı? İyi haberlerim var. Feris implantının gücünü arttırmanın bir yolunu buldu. Özellikleri bana verdi ve ben de senin fizyolojinle uyumlu hale getirmeye çalışıyorum. Biraz doku büyütmeye zorluyorum, tamamen yeni şeyler, umarım tutar. İyileşmeye ihtiyacın var mı?" -"Yes, heal me.",TXT_RPLY0_SCRIPT10_D24256_YESHE,〃,,,"Ano, ošetři mě.","Ja, helbrede mig.","Ja, mach mich gesund.",,"Jes, kuracu min.","Sí, cúrame.",,"Kyllä, paranna minut.","Oui, soignez-moi.","Igen, gyógyíts fel.","Sì, curami.",ああ、治してくれ。,네. 치료해주세요.,"Ja, genees me.","Ja, helbred meg.","Tak, ulecz mnie.","Sim, me cure.",,"Da, bandajează-mă.","Да, полечи меня.",,"Ja, bota mig.","Evet, iyileştir beni." -"Done, now take care of yourself.",TXT_RYES0_SCRIPT10_D24256_DONEN,〃,,,"Hotovo, dávej na sebe pozor.",Færdig. Pas nu på dig selv.,"Alles klar, und nun pass auf dich auf.",,"Farite, nun estu singarda.","Hecho, ahora ve con cuidado.",,Noin. Pidä itsestäsi huoli.,"Fini, faites attention à vous.","Kész is, vigyázz magadra.","Fatto, abbi cura di te.",完了した、御気を付けて。,치료 끝. 이제 가까이서 불장난하지 마시길!,"Klaar, zorg nu voor jezelf.","Ferdig, ta vare på deg selv.",Gotowe. Uważaj na siebie.,Pronto. Agora vê se toma cuidado.,,"Gata, acum ai grijă de tine.",Сделано. Береги себя.,,"Klart, ta hand om dig själv nu.","Bitti, şimdi kendine iyi bak." -When will you be done?,TXT_RPLY1_SCRIPT10_D24256_WHENW,〃,,,Kdy s tím budeš hotov?,Hvornår er du færdig?,Wann wird es fertig sein?,,Kiam vi finos?,¿Cuándo habrás terminado?,,Milloin kudos on valmis?,Quand aurez-vous fini?,Mikor leszel kész?,Quando avrai finito?,いつ増幅できる?,칩 조정이 언제 끝나는지요?,Wanneer ben je klaar?,Når er du ferdig?,Kiedy skończysz?,Quando você vai terminar?,,Când vei fi gata?,Когда он будет готов?,,När är du klar?,İşin ne zaman bitecek? +"Yes, heal me.",TXT_RPLY0_SCRIPT10_D24256_YESHE,〃,,,"Ano, ošetři mě.","Ja, helbrede mig.","Ja, mach mich gesund.",,"Jes, kuracu min.","Sí, cúrame.",,"Kyllä, paranna minut.","Oui, soignez-moi.",,"Igen, gyógyíts fel.","Sì, curami.",ああ、治してくれ。,네. 치료해주세요.,"Ja, genees me.","Ja, helbred meg.","Tak, ulecz mnie.","Sim, me cure.",,"Da, bandajează-mă.","Да, полечи меня.",,"Ja, bota mig.","Evet, iyileştir beni." +"Done, now take care of yourself.",TXT_RYES0_SCRIPT10_D24256_DONEN,〃,,,"Hotovo, dávej na sebe pozor.",Færdig. Pas nu på dig selv.,"Alles klar, und nun pass auf dich auf.",,"Farite, nun estu singarda.","Hecho, ahora ve con cuidado.",,Noin. Pidä itsestäsi huoli.,"Fini, faites attention à vous.",,"Kész is, vigyázz magadra.","Fatto, abbi cura di te.",完了した、御気を付けて。,치료 끝. 이제 가까이서 불장난하지 마시길!,"Klaar, zorg nu voor jezelf.","Ferdig, ta vare på deg selv.",Gotowe. Uważaj na siebie.,Pronto. Agora vê se toma cuidado.,,"Gata, acum ai grijă de tine.",Сделано. Береги себя.,,"Klart, ta hand om dig själv nu.","Bitti, şimdi kendine iyi bak." +When will you be done?,TXT_RPLY1_SCRIPT10_D24256_WHENW,〃,,,Kdy s tím budeš hotov?,Hvornår er du færdig?,Wann wird es fertig sein?,,Kiam vi finos?,¿Cuándo habrás terminado?,,Milloin kudos on valmis?,Quand aurez-vous fini?,,Mikor leszel kész?,Quando avrai finito?,いつ増幅できる?,칩 조정이 언제 끝나는지요?,Wanneer ben je klaar?,Når er du ferdig?,Kiedy skończysz?,Quando você vai terminar?,,Când vei fi gata?,Когда он будет готов?,,När är du klar?,İşin ne zaman bitecek? "Now. Hey great, it worked!",TXT_RYES1_SCRIPT10_D24256_NOWHE,〃,,,"Teď. No ne, funguje to skvěle!","Når du er færdig? Nu. Hej, godt, det virkede!","Oh, klasse. Es funktioniert.",,"Nun. Bonege, ĝi funkciis!","Ahora. Mira qué bien, ¡ha funcionado!","Ahora. Mira qué bien, -¡funcionó!","Nyt. Hei, sehän toimii; hienoa!","Maintenant. Hé, super, ça à fonctionné!","Épp most. Marha jó, működik!","Adesso. Ehi, fantastico, ha funzionato!",すぐにでも。素晴らしい、上手くいった!,"세상에나, 정말로 작동하는군요!","Nu. Hé, geweldig, het heeft gewerkt!","Nå. Flott, det virket!",Już. Hej! Udało się! Działa!,"Agora. Opa, beleza! Funcionou!",,"Acum. Hei grozav, a mers!","Секунду. Отлично, он работает!",,"Nu. Bra, det fungerade!","Şimdi. Hey harika, işe yaradı!" +¡funcionó!","Nyt. Hei, sehän toimii; hienoa!","Maintenant. Hé, super, ça à fonctionné!",,"Épp most. Marha jó, működik!","Adesso. Ehi, fantastico, ha funzionato!",すぐにでも。素晴らしい、上手くいった!,"세상에나, 정말로 작동하는군요!","Nu. Hé, geweldig, het heeft gewerkt!","Nå. Flott, det virket!",Już. Hej! Udało się! Działa!,"Agora. Opa, beleza! Funcionou!",,"Acum. Hei grozav, a mers!","Секунду. Отлично, он работает!",,"Nu. Bra, det fungerade!","Şimdi. Hey harika, işe yaradı!" I'm waiting on the tissue to finish its growth cycle.,TXT_RNO1_SCRIPT10_D24256_IMWAI,〃,,,"Čekám, než dorostou ty tkáně.","Jeg venter på, at vævet afslutter sin vækstcyklus.","Ich muss warten, bis das Gewebe fertig gewachsen ist. ",,"Mi atendas, ke la disvolviĝa ciklo de la histoj finiĝos.","Estoy esperando a que los tejidos -terminen su ciclo de desarrollo.",,Odotan kudoksen kasvusyklin päättymistä.,J'attends que le tissu ait fini son cycle de croissance.,"Épp arra várok, hogy a szövet a növekedési ütemet elérje.",Sto aspettando che i tessuti finiscano la crescita per questo ciclo.,生体組織が成長しきるまで待つんだ。,조직이 다 자라날 때까지 기다리는 중입니다.,Ik wacht op het weefsel om de groeicyclus af te ronden.,Jeg venter på at vevet skal fullføre vekstsyklusen.,Czekam aż cykl odrastania tkanki się skończy.,Estou esperando que o tecido termine seu ciclo de desenvolvimento.,,Aștept ca țesutul să își continue ciclul de dezvoltare.,Подожди. Я жду коца цикла роста клеток ткани.,,Jag väntar på att vävnaden ska avsluta sin tillväxtcykel.,Dokunun büyüme döngüsünü tamamlamasını bekliyorum. -"Well, I'm back up to my old tricks again, I'm still working on your implants. Did you know that Macil has now authorized them for everyone? No, huh? It's because you turned out so well. Anything I can do for you?",TXT_DLG_SCRIPT10_D25772_WELLI,〃 (five upgrades).,,,"Zase dělám to, co mi jde nejlépe, pracuju na tvých implantátech. Slyšel jsi, že Macil povolil jejich použití na všech vojácích? Ne? Je to protože u tebe fungují tak dobře. Můžu pro tebe něco udělat?","Nå, jeg er tilbage til mine gamle tricks igen, jeg arbejder stadig på dine implantater. Vidste du, at Macil nu har godkendt dem til alle? Nej, hva'? Det er fordi du blev så godt. Er der noget, jeg kan gøre for dig?","Ich arbeite immer noch an deinem Implantat. Wußtest du schon, dass Macil sie für alle autorisiert hat? Nein, was? Hat er getan, weil es bei dir so gut funktioniert hat. Kann ich sonst was für dich tun?",,"Nu, mi refalas miajn malnovajn trompojn: mi ankoraŭ prilaboras viajn enplantaĵojn. Ĉu vi sciiĝis, ke Macil nun rajtigis ilian uzadon al ĉiuj? Ne, ĉu? Danke al viaj bonegaj rezultoj. Ĉu mi povas fari ion por vi?","Bueno, vuelvo a las andadas otra vez: sigo trabajando en tus implantes. ¿Sabías que Macil ahora los ha autorizado para todos? No, ¿eh? Es por lo bien que te ha salido. ¿Algo que pueda hacer por ti?","Bueno, vuelvo a las andadas otra vez: sigo trabajando en tus implantes. ¿Sabías que Macil ahora los autorizó para todos? No, ¿eh? Es por lo bien que te ha salido. ¿Algo que pueda hacer por ti?","Olen taas palannut kyhäilyjeni pariin; työstän edelleenkin istutteitasi. Tiesitkö muuten, että Macil on valtuuttanut ne nyt kaikille? Ai et? No, ihan sen takia, kun sinä satuit onnistumaan niin hyvin. Mutta, mitä saisi olla?","Eh bien, je suis de retour à mes vieux violons, je suis toujours en train de travailler sur vos implants. Vous saviez que Macil les a autorisé pour tous les soldats? Non, hein? C'est parce que vous vous en êtes tellement bien sorti. Que puis-je faire pour vous?","Visszatértem a régi kerékvágásba, és újból fejlesztgetem az implantátumodat. Tudtad, hogy Macil mindenki számára engedélyezte őket? Nem, mi? Azért mert a Te esetedben nagyon jól bevállt. Segíthetek még neked valamiben?","Ebbene, sono di nuovo alle prese con questi impianti, inclusi i tuoi. Lo sapevi che Macil adesso li ha autorizzati per tutti? No, eh? È poiché sei venuto fuori così bene. Posso fare qualcosa per te?","さて、私は古い技術をバックアップして、 +terminen su ciclo de desarrollo.",,Odotan kudoksen kasvusyklin päättymistä.,J'attends que le tissu ait fini son cycle de croissance.,,"Épp arra várok, hogy a szövet a növekedési ütemet elérje.",Sto aspettando che i tessuti finiscano la crescita per questo ciclo.,生体組織が成長しきるまで待つんだ。,조직이 다 자라날 때까지 기다리는 중입니다.,Ik wacht op het weefsel om de groeicyclus af te ronden.,Jeg venter på at vevet skal fullføre vekstsyklusen.,Czekam aż cykl odrastania tkanki się skończy.,Estou esperando que o tecido termine seu ciclo de desenvolvimento.,,Aștept ca țesutul să își continue ciclul de dezvoltare.,Подожди. Я жду коца цикла роста клеток ткани.,,Jag väntar på att vävnaden ska avsluta sin tillväxtcykel.,Dokunun büyüme döngüsünü tamamlamasını bekliyorum. +"Well, I'm back up to my old tricks again, I'm still working on your implants. Did you know that Macil has now authorized them for everyone? No, huh? It's because you turned out so well. Anything I can do for you?",TXT_DLG_SCRIPT10_D25772_WELLI,〃 (five upgrades).,,,"Zase dělám to, co mi jde nejlépe, pracuju na tvých implantátech. Slyšel jsi, že Macil povolil jejich použití na všech vojácích? Ne? Je to protože u tebe fungují tak dobře. Můžu pro tebe něco udělat?","Nå, jeg er tilbage til mine gamle tricks igen, jeg arbejder stadig på dine implantater. Vidste du, at Macil nu har godkendt dem til alle? Nej, hva'? Det er fordi du blev så godt. Er der noget, jeg kan gøre for dig?","Ich arbeite immer noch an deinem Implantat. Wußtest du schon, dass Macil sie für alle autorisiert hat? Nein, was? Hat er getan, weil es bei dir so gut funktioniert hat. Kann ich sonst was für dich tun?",,"Nu, mi refalas miajn malnovajn trompojn: mi ankoraŭ prilaboras viajn enplantaĵojn. Ĉu vi sciiĝis, ke Macil nun rajtigis ilian uzadon al ĉiuj? Ne, ĉu? Danke al viaj bonegaj rezultoj. Ĉu mi povas fari ion por vi?","Bueno, vuelvo a las andadas otra vez: sigo trabajando en tus implantes. ¿Sabías que Macil ahora los ha autorizado para todos? No, ¿eh? Es por lo bien que te ha salido. ¿Algo que pueda hacer por ti?","Bueno, vuelvo a las andadas otra vez: sigo trabajando en tus implantes. ¿Sabías que Macil ahora los autorizó para todos? No, ¿eh? Es por lo bien que te ha salido. ¿Algo que pueda hacer por ti?","Olen taas palannut kyhäilyjeni pariin; työstän edelleenkin istutteitasi. Tiesitkö muuten, että Macil on valtuuttanut ne nyt kaikille? Ai et? No, ihan sen takia, kun sinä satuit onnistumaan niin hyvin. Mutta, mitä saisi olla?","Eh bien, je suis de retour à mes vieux violons, je suis toujours en train de travailler sur vos implants. Vous saviez que Macil les a autorisé pour tous les soldats? Non, hein? C'est parce que vous vous en êtes tellement bien sorti. Que puis-je faire pour vous?",,"Visszatértem a régi kerékvágásba, és újból fejlesztgetem az implantátumodat. Tudtad, hogy Macil mindenki számára engedélyezte őket? Nem, mi? Azért mert a Te esetedben nagyon jól bevállt. Segíthetek még neked valamiben?","Ebbene, sono di nuovo alle prese con questi impianti, inclusi i tuoi. Lo sapevi che Macil adesso li ha autorizzati per tutti? No, eh? È poiché sei venuto fuori così bene. Posso fare qualcosa per te?","さて、私は古い技術をバックアップして、 インプラントに更なる取り組みを試している。 マシルがそれを全員に着けるのを承認したのは 聞いたか?まだ?君が上手くやってくれたからな。 @@ -11308,18 +11308,18 @@ Nie wiesz? Wszystko dzięki temu, że sobie poradziłeś. Mogę coś jeszcze dla ciebie zrobić? ","Bem, estou de volta aos meus velhos truques novamente. Ainda estou trabalhando nos seus implantes. Você sabia que Macil os autorizou pra todo mundo? Ah não? É porque eles funcionaram muito bem em você. Precisa de alguma coisa?",,"Păi, m-am întors la treburile mele vechi, încă lucrez la implanturile tale. Știi că Macil a vrut să le autorizeze pentru toată lumea? Nu, așa-i? E din cauză că ai ieșit prea bine. Pot face ceva pentru tine?","Я снова вернулся к старым занятиям и по-прежнему работаю над твоим имплантом. Ты знаешь, что Мэйсил теперь всем разрешил использовать импланты? Нет? Это потому, что ты так хорошо показал себя. Могу я чем-нибудь тебе помочь?",,"Jag är tillbaka till mina gamla tricks igen, jag jobbar fortfarande på dina implantat. Visste du att Macil nu har godkänt dem för alla? Nej, va? Det är för att du blev så bra. Är det något jag kan göra för dig?","Yine eski numaralarıma döndüm. Hâlâ implantların üzerinde çalışıyorum. Macil'in artık herkes için onay verdiğini biliyor muydun? Hayır, ha? Bu kadar iyi olduğun için. Senin için yapabileceğim bir şey var mı?" -Help me out here.,TXT_RPLY0_SCRIPT10_D25772_HELPM,〃,,,Pomoz mi.,Hjælp mig lige her.,Hilf mir mal.,,Helpu min.,Ayúdame.,,Autatko vähän.,Aidez moi.,Segíts nekem egy kicsit.,Aiutami.,ここで治してくれ。,나 좀 치료해줘요.,Help me hier.,Hjelp meg her.,Pomóż mi.,Preciso de uma ajuda aqui.,,Dă-mi o mână de ajutor.,Помоги мне вот с этим.,,Hjälp mig här.,Bana yardım et. +Help me out here.,TXT_RPLY0_SCRIPT10_D25772_HELPM,〃,,,Pomoz mi.,Hjælp mig lige her.,Hilf mir mal.,,Helpu min.,Ayúdame.,,Autatko vähän.,Aidez moi.,,Segíts nekem egy kicsit.,Aiutami.,ここで治してくれ。,나 좀 치료해줘요.,Help me hier.,Hjelp meg her.,Pomóż mi.,Preciso de uma ajuda aqui.,,Dă-mi o mână de ajutor.,Помоги мне вот с этим.,,Hjälp mig här.,Bana yardım et. That's all I can do.,TXT_RYES0_SCRIPT10_D25772_THATS,〃,,,"To je vše, co mohu udělat.","Det er det eneste, jeg kan gøre.","Da ist alles, was ich tun kann.",,"Tio estas ĉio, kion mi povas fari.","Eso es todo -lo que puedo hacer.",,"Tässä kaikki, mitä voin tehdä.",C'est tout ce que je peux faire.,Csak ennyit tudtam tenni.,È tutto quello che posso fare.,私が出来る事はここまでだ。,좀 치료해줬습니다. 이제 어떠신가요?,Dat is alles wat ik kan doen.,Det er alt jeg kan gjøre.,To wszystko co mogę zrobić.,Isso é tudo o que posso fazer.,,Asta e tot ceea ce pot face.,"Это всё, что я могу сделать.",,Det är allt jag kan göra.,Tek yapabileceğim bu. -New implant?,TXT_RPLY1_SCRIPT10_D25772_NEWIM,〃,,,Nový implantát?,Nyt implantat?,Neues Implantat?,,Ĉu nova enplantaĵo?,¿Nuevo implante?,,Uusi istute?,Un nouvel implant?,Új implantátum?,Nuovo impianto?,新しいインプラントは?,새로운 이식 칩?,Een nieuw implantaat?,Nytt implantat?,Nowy implant?,Implante novo?,,Implant nou?,Новый имплант?,,Nytt implantat?,Yeni implant mı? +lo que puedo hacer.",,"Tässä kaikki, mitä voin tehdä.",C'est tout ce que je peux faire.,,Csak ennyit tudtam tenni.,È tutto quello che posso fare.,私が出来る事はここまでだ。,좀 치료해줬습니다. 이제 어떠신가요?,Dat is alles wat ik kan doen.,Det er alt jeg kan gjøre.,To wszystko co mogę zrobić.,Isso é tudo o que posso fazer.,,Asta e tot ceea ce pot face.,"Это всё, что я могу сделать.",,Det är allt jag kan göra.,Tek yapabileceğim bu. +New implant?,TXT_RPLY1_SCRIPT10_D25772_NEWIM,〃,,,Nový implantát?,Nyt implantat?,Neues Implantat?,,Ĉu nova enplantaĵo?,¿Nuevo implante?,,Uusi istute?,Un nouvel implant?,,Új implantátum?,Nuovo impianto?,新しいインプラントは?,새로운 이식 칩?,Een nieuw implantaat?,Nytt implantat?,Nowy implant?,Implante novo?,,Implant nou?,Новый имплант?,,Nytt implantat?,Yeni implant mı? "Yep, my best one yet.",TXT_RYES1_SCRIPT10_D25772_YEPMY,〃,,,"Jo, můj zatím nejlepší.","Ja, mit bedste endnu.","Ja, mein bestes bisher.",,"Jes, la plej bona, -kiun mi havas.","Sí, el mejor que tengo.",,"Jep, tähänastisista istutteistani paras.","Oui, le meilleur que j'ai jamais conçu.","Igen, az egyik legjobb változat eddig.","Si, il migliore che ho creato fin'ora.",よし、これは傑作だ。,있죠. 제 생각엔 아주 좋은 품질인 것 같아요.,"Ja, mijn beste tot nu toe.","Ja, mitt beste hittil.",Tak. Najlepszy jaki dotychczas zrobiłem.,Isso mesmo. O melhor que já fiz até agora.,,"Da, cel mai bun, momentan.",Да. Моё лучшее творение.,,"Japp, mitt bästa hittills.","Evet, şimdiye kadarki en iyisi." +kiun mi havas.","Sí, el mejor que tengo.",,"Jep, tähänastisista istutteistani paras.","Oui, le meilleur que j'ai jamais conçu.",,"Igen, az egyik legjobb változat eddig.","Si, il migliore che ho creato fin'ora.",よし、これは傑作だ。,있죠. 제 생각엔 아주 좋은 품질인 것 같아요.,"Ja, mijn beste tot nu toe.","Ja, mitt beste hittil.",Tak. Najlepszy jaki dotychczas zrobiłem.,Isso mesmo. O melhor que já fiz até agora.,,"Da, cel mai bun, momentan.",Да. Моё лучшее творение.,,"Japp, mitt bästa hittills.","Evet, şimdiye kadarki en iyisi." "Sorry, but you just have to wait.",TXT_RNO1_SCRIPT10_D25772_SORRY,〃,,,"Promiň, ještě budeš muset počkat.","Beklager, men du må bare vente.","Tut mir leid, du musst noch warten.",,"Pardonon, sed vi devas atendi.","Lo siento, pero tendrás que esperar.","Lo siento, pero -vas a tener que esperar.","Pahoittelen, sinun täytyy vain vielä vähän odottaa.","Désolé, il faudra attendre encore.","Sajnálom, de várnod kell egy kicsit.","Mi spiace, ma devi attendere un poco.",すまない、だがもうすぐ出来そうだ。,시간을 좀 더 주신다면...,"Sorry, maar je moet gewoon wachten.","Beklager, men du må bare vente.","Wybacz, ale musisz poczekać.","Desculpe, mas você vai ter que esperar.",,"Scuze, dar trebuie să mai aștepți.","Прости, но тебе придётся подождать.",,"Ledsen, men du måste vänta.",Üzgünüm ama beklemek zorundasın. -"This is it, Feris has managed to drain everything he could out of all the data we have, this will be the best, and last implant upgrade. It will be sort of depressing, seeing my best creation reach its peak. Well, at least the rest of this crew will keep me occupied.",TXT_DLG_SCRIPT10_D27288_THISI,〃 (six upgrades).,,,"A je to, Feris vyždímal všechno, co mohl, z dat, která máme. Tohle bude poslední a nejlepší implantátový upgrade. Bude mi trochu smutno, vidět můj výtvor dosáhnout vrcholu. No, alespoň budu zaneprázdněný zbytkem armády.","Det er nu, Feris har formået at dræne alt hvad han kunne ud af alle de data vi har, dette bliver den bedste, og sidste implantatopgradering. Det bliver lidt deprimerende at se min bedste skabelse nå sit højdepunkt. I det mindste vil resten af besætningen holde mig beskæftiget.","Das ist es, Feris hat aus den Daten alles herausgeholt, was möglich war. Das wird das beste und letzte Upgrade sein. Irgendwie deprimierend zu sehen, dass meine beste Erfindung ihren Höhepunkt erreicht hat. Nun ja, wenigstens wird der Rest dieser Truppe mich lange genug beschäftigen.",,"Jen ĉio, Feriso jam ekspluatis kiel eble plej multe de niaj havataj datenoj: tiu estis la lasta kaj plej bona versio de la enplantaĵo. Estas iom malfeliĉige vidi, ke mia plej bona kreaĵo atingis la supron. Nu, almenaŭ la resto de la personaro tenos min okupata.","Ya está, Feris ya ha exprimido todo lo que se podía de los datos que tenemos: esa ha sido la mejor y última versión del implante. Es un poco triste ver mi mejor creación llegar a su cima. Bueno, al menos el resto del personal me mantendrá ocupado.","Ya está, Feris ya exprimió todo lo que se podía de los datos que tenemos: esa fue la mejor y última versión del implante. Es un poco triste ver mi mejor creación llegar a su cima. Bueno, al menos el resto del personal me va a mantener ocupado.","Tässä se nyt on; Feriksen on onnistunut puristaa kaiken ulos kaikesta käsissämme olevasta datasta. Tämä tulee olemaan istutteen paras ja viimeinen kehitysaskel. Vähän jotenkin masentavaa nähdä parhaan luomuksensa saavuttavan huippunsa. No, saanpahan sentään edes puuhaa lopuista tästä miehistöstä.","C'est fini, Feris a réussi à tirer tout ce qu'on pouvait des données que l'on a récupéré. Ce sera la dernière, et meilleure mise à jour. C'est un peu déprimant, de savoir que ma meilleure invention à déjà atteint son pinnacle.. Bon, au moins, le reste de l'équipe me gardera occupé.","Ez lesz a végkifejlett, Ferisnek sikerült kipréselni minden adatot, ez lesz a legjobb és egyben utolsó implantátum fejlesztés. Kicsit hervasztó érzés látni munkám gyümölcsének végkifejlettségét. Na de legalább a csapat többi része le fog foglalni.","Ecco qua, Feris è riuscito ad estrarre tutto quello che poteva dai dati che possediamo, e questo sarà il migliore, nonché l'ultimo, aggiornamento dell'impianto. In un certo senso sarà un po' deprimente, vedere la mia migliore creazione raggiungere l'apice. Se non altro, il resto di questa squadra mi terrà occupato.","いよいよだ、フェリスが我々の保管していた +vas a tener que esperar.","Pahoittelen, sinun täytyy vain vielä vähän odottaa.","Désolé, il faudra attendre encore.",,"Sajnálom, de várnod kell egy kicsit.","Mi spiace, ma devi attendere un poco.",すまない、だがもうすぐ出来そうだ。,시간을 좀 더 주신다면...,"Sorry, maar je moet gewoon wachten.","Beklager, men du må bare vente.","Wybacz, ale musisz poczekać.","Desculpe, mas você vai ter que esperar.",,"Scuze, dar trebuie să mai aștepți.","Прости, но тебе придётся подождать.",,"Ledsen, men du måste vänta.",Üzgünüm ama beklemek zorundasın. +"This is it, Feris has managed to drain everything he could out of all the data we have, this will be the best, and last implant upgrade. It will be sort of depressing, seeing my best creation reach its peak. Well, at least the rest of this crew will keep me occupied.",TXT_DLG_SCRIPT10_D27288_THISI,〃 (six upgrades).,,,"A je to, Feris vyždímal všechno, co mohl, z dat, která máme. Tohle bude poslední a nejlepší implantátový upgrade. Bude mi trochu smutno, vidět můj výtvor dosáhnout vrcholu. No, alespoň budu zaneprázdněný zbytkem armády.","Det er nu, Feris har formået at dræne alt hvad han kunne ud af alle de data vi har, dette bliver den bedste, og sidste implantatopgradering. Det bliver lidt deprimerende at se min bedste skabelse nå sit højdepunkt. I det mindste vil resten af besætningen holde mig beskæftiget.","Das ist es, Feris hat aus den Daten alles herausgeholt, was möglich war. Das wird das beste und letzte Upgrade sein. Irgendwie deprimierend zu sehen, dass meine beste Erfindung ihren Höhepunkt erreicht hat. Nun ja, wenigstens wird der Rest dieser Truppe mich lange genug beschäftigen.",,"Jen ĉio, Feriso jam ekspluatis kiel eble plej multe de niaj havataj datenoj: tiu estis la lasta kaj plej bona versio de la enplantaĵo. Estas iom malfeliĉige vidi, ke mia plej bona kreaĵo atingis la supron. Nu, almenaŭ la resto de la personaro tenos min okupata.","Ya está, Feris ya ha exprimido todo lo que se podía de los datos que tenemos: esa ha sido la mejor y última versión del implante. Es un poco triste ver mi mejor creación llegar a su cima. Bueno, al menos el resto del personal me mantendrá ocupado.","Ya está, Feris ya exprimió todo lo que se podía de los datos que tenemos: esa fue la mejor y última versión del implante. Es un poco triste ver mi mejor creación llegar a su cima. Bueno, al menos el resto del personal me va a mantener ocupado.","Tässä se nyt on; Feriksen on onnistunut puristaa kaiken ulos kaikesta käsissämme olevasta datasta. Tämä tulee olemaan istutteen paras ja viimeinen kehitysaskel. Vähän jotenkin masentavaa nähdä parhaan luomuksensa saavuttavan huippunsa. No, saanpahan sentään edes puuhaa lopuista tästä miehistöstä.","C'est fini, Feris a réussi à tirer tout ce qu'on pouvait des données que l'on a récupéré. Ce sera la dernière, et meilleure mise à jour. C'est un peu déprimant, de savoir que ma meilleure invention à déjà atteint son pinnacle.. Bon, au moins, le reste de l'équipe me gardera occupé.",,"Ez lesz a végkifejlett, Ferisnek sikerült kipréselni minden adatot, ez lesz a legjobb és egyben utolsó implantátum fejlesztés. Kicsit hervasztó érzés látni munkám gyümölcsének végkifejlettségét. Na de legalább a csapat többi része le fog foglalni.","Ecco qua, Feris è riuscito ad estrarre tutto quello che poteva dai dati che possediamo, e questo sarà il migliore, nonché l'ultimo, aggiornamento dell'impianto. In un certo senso sarà un po' deprimente, vedere la mia migliore creazione raggiungere l'apice. Se non altro, il resto di questa squadra mi terrà occupato.","いよいよだ、フェリスが我々の保管していた 全てのデータから全力を尽くして編み出した、 これが最高で最後のインプラント アップグレードだ。が、私にこれ以上の創造に @@ -11331,10 +11331,10 @@ implantu. To trochę smutne, że moje dzieło tak szybko osiągnęło szczyt możliwości. Cóż... przynajmniej będę mógł zająć się resztą załogi.","É isso aí, Feris conseguiu tirar tudo que foi possível dos dados que temos. Este será a melhor e a última aprimoração do implante. Vai ser meio triste, vendo minha melhor criação chegar no seu ápice. Bom, pelo menos o resto do pessoal vai me manter ocupado.",,"Asta e, Feris a reușit să stoarcă tot din datele pe care le avem, acesta e ultimul, și cel mai bun upgrade pentru implant. Va fi oarecum deprimant, să-mi văd creația ajungând în vârf. Măcar restul echipajului mă va ține ocupat.","Вот и всё. Из тех данных, которыми мы располагаем, Ферису удалось вытянуть всё, что только можно. Это лучшая и последняя модификация импланта. Немного грустно видеть, что твоё творение достигло своего предела. Ну, по крайней мере, я всё ещё нужен остальной части команды.",,"Det här är det, Feris har lyckats dränera allt han kunde ur all data vi har, det här kommer att bli den bästa, och sista implantatuppgraderingen. Det kommer att bli lite deprimerande att se min bästa skapelse nå sin höjdpunkt. Tja, resten av besättningen kommer åtminstone att hålla mig sysselsatt.","İşte bu, Feris elimizdeki tüm verilerden çekebildiği her şeyi çekmeyi başardı, bu en iyi ve son implant güncellemesi olacak. En iyi eserimin zirveye ulaştığını görmek biraz iç karartıcı olacak. En azından bu mürettebatın geri kalanı beni meşgul edecek." -Could you heal me?,TXT_RPLY0_SCRIPT10_D27288_COULD,〃,,,Mohl bys mě ošetřit?,Kan du helbrede mig?,Kannst du mich gesund machen?,,Ĉu vi kuracus min?,¿Podrías curarme?,,Voisitko hoitaa minua?,Vous pouvez me soigner?,Fel tudnál gyógyítani?,Puoi curarmi?,治してくれるか?,절 치료해줄 수 있나요?,Kunt je me genezen?,Kan du helbrede meg?,Możesz mnie uleczyć?,Poderia me curar?,,Mă poți bandaja?,Вылечишь меня?,,Kan du läka mig?,Beni iyileştirebilir misin? +Could you heal me?,TXT_RPLY0_SCRIPT10_D27288_COULD,〃,,,Mohl bys mě ošetřit?,Kan du helbrede mig?,Kannst du mich gesund machen?,,Ĉu vi kuracus min?,¿Podrías curarme?,,Voisitko hoitaa minua?,Vous pouvez me soigner?,,Fel tudnál gyógyítani?,Puoi curarmi?,治してくれるか?,절 치료해줄 수 있나요?,Kunt je me genezen?,Kan du helbrede meg?,Możesz mnie uleczyć?,Poderia me curar?,,Mă poți bandaja?,Вылечишь меня?,,Kan du läka mig?,Beni iyileştirebilir misin? "There, you're all set now.",TXT_RYES0_SCRIPT10_D27288_THERE,〃,,,"Tak, a jsi hotov.","Sådan, du er klar nu.","So, das wär's dann.",,"Farite, vi nun -estas en ordo.","Ya está, listo.",,"Siinä, kaikki kunnossa.","Voilà, vous pouvez y aller.","Parancsolj, harcra kész vagy.","Certo, ora sei apposto.",これで、準備完了だ。,"자, 이제 안전할 겁니다.",Daar ben je nu helemaal klaar.,"Sånn, nå er du klar.",Proszę. Wszystko gotowe.,Feito. Tudo certo agora.,,"Gata, ești pregătit.",Конечно. Теперь ты в норме.,,"Så där, du är redo nu.","İşte, şimdi hazırsın." -It's the hero. Great job! What can I get for you? We've got a little larger selection now that we have all the ordinance from the castle. If you need to buy some ammo talk to Justin. He'll take care of you. ,TXT_DLG_SCRIPT10_D28804_ITSTH,MAP10: Feris (no training).,,,"Je to náš hrdina. Skvělá práce! Co ti můžu sehnat? Máme trochu větší výběr, když teď máme přístup ke všemu vybavení z hradu. Jestli potřebuješ munici, zeptej se Justina, on si s tebou poradí.","Det er helten. Godt gået! Hvad kan jeg skaffe til dig? Vi har et lidt større udvalg nu, hvor vi har alle ordinationerne fra slottet. Hvis du har brug for at købe noget ammunition, så tal med Justin. Han vil tage sig af dig.","Das ist der Held. Guter Job! Was kann ich für dich tun. Wir haben jetzt eine größere Auswahl nachdem wir die Burg geplündert haben. Wenn du noch Munition brauchst, wende dich an Justin. Er kümmert sich darum.",,"La heroo. Bonege farite! Kion mi donu al vi? Estas elektaĵo iomete pli granda nun kiam ni havas la tutan arsenalon de la kastelo. Se vi bezonas plian municion, parolu kun Justin: li solvos tion.","Es el héroe. ¡Muy bien hecho! ¿Qué puedo ofrecerte? Hay una selección un poco más amplia ahora que tenemos todo el arsenal del castillo. Si necesitas comprar munición, habla con Justin: él se ocupará de ti.","Es el héroe. ¡Muy bien hecho! ¿Qué puedo ofrecerte? Hay una selección un poco más amplia ahora que tenemos todo el arsenal del castillo. Si necesitas comprar munición, habla con Justin: él se va a ocupar de ti.","Sankarimmehan se siinä; hyvää työtä! Miten voin olla avuksi? Meillä on hieman suurempi valikoima nyt, kun olemme saaneet käsiimme linnan kaikki asetarvikkeet. Jos sinun tarvitsee ostaa ammuksia, puhu Justinille. Hän hoitaa tarpeesi.","Voilà notre héros! Fantastique travail! Que puis-je faire pour vous? Nous avons étendu notre séléction maintenant que nous avons l'arsenal du château à notre disposition. Si vous avez besoin de munitions, parlez à Justin. Il s'occupera de vous.","Itt a hősünk. Kiváló munka! Mit adhatok? Kicsivel nagyobb a választék, most hogy megvan az összes leírás a kastélyból. Ha akarsz lőszert venni, beszélj Justinnal. Majd Ő gondoskodik rólad.","È l'eroe, ottimo lavoro! Che posso procurarti? Abbiamo una selezione un po' più grande dopo aver saccheggiato i depositi del castello. Se ti servono altre munizioni parla con Justin. Ci penserà lui a te.","正に英雄、流石です! +estas en ordo.","Ya está, listo.",,"Siinä, kaikki kunnossa.","Voilà, vous pouvez y aller.",,"Parancsolj, harcra kész vagy.","Certo, ora sei apposto.",これで、準備完了だ。,"자, 이제 안전할 겁니다.",Daar ben je nu helemaal klaar.,"Sånn, nå er du klar.",Proszę. Wszystko gotowe.,Feito. Tudo certo agora.,,"Gata, ești pregătit.",Конечно. Теперь ты в норме.,,"Så där, du är redo nu.","İşte, şimdi hazırsın." +It's the hero. Great job! What can I get for you? We've got a little larger selection now that we have all the ordinance from the castle. If you need to buy some ammo talk to Justin. He'll take care of you. ,TXT_DLG_SCRIPT10_D28804_ITSTH,MAP10: Feris (no training).,,,"Je to náš hrdina. Skvělá práce! Co ti můžu sehnat? Máme trochu větší výběr, když teď máme přístup ke všemu vybavení z hradu. Jestli potřebuješ munici, zeptej se Justina, on si s tebou poradí.","Det er helten. Godt gået! Hvad kan jeg skaffe til dig? Vi har et lidt større udvalg nu, hvor vi har alle ordinationerne fra slottet. Hvis du har brug for at købe noget ammunition, så tal med Justin. Han vil tage sig af dig.","Das ist der Held. Guter Job! Was kann ich für dich tun. Wir haben jetzt eine größere Auswahl nachdem wir die Burg geplündert haben. Wenn du noch Munition brauchst, wende dich an Justin. Er kümmert sich darum.",,"La heroo. Bonege farite! Kion mi donu al vi? Estas elektaĵo iomete pli granda nun kiam ni havas la tutan arsenalon de la kastelo. Se vi bezonas plian municion, parolu kun Justin: li solvos tion.","Es el héroe. ¡Muy bien hecho! ¿Qué puedo ofrecerte? Hay una selección un poco más amplia ahora que tenemos todo el arsenal del castillo. Si necesitas comprar munición, habla con Justin: él se ocupará de ti.","Es el héroe. ¡Muy bien hecho! ¿Qué puedo ofrecerte? Hay una selección un poco más amplia ahora que tenemos todo el arsenal del castillo. Si necesitas comprar munición, habla con Justin: él se va a ocupar de ti.","Sankarimmehan se siinä; hyvää työtä! Miten voin olla avuksi? Meillä on hieman suurempi valikoima nyt, kun olemme saaneet käsiimme linnan kaikki asetarvikkeet. Jos sinun tarvitsee ostaa ammuksia, puhu Justinille. Hän hoitaa tarpeesi.","Voilà notre héros! Fantastique travail! Que puis-je faire pour vous? Nous avons étendu notre séléction maintenant que nous avons l'arsenal du château à notre disposition. Si vous avez besoin de munitions, parlez à Justin. Il s'occupera de vous.",,"Itt a hősünk. Kiváló munka! Mit adhatok? Kicsivel nagyobb a választék, most hogy megvan az összes leírás a kastélyból. Ha akarsz lőszert venni, beszélj Justinnal. Majd Ő gondoskodik rólad.","È l'eroe, ottimo lavoro! Che posso procurarti? Abbiamo una selezione un po' più grande dopo aver saccheggiato i depositi del castello. Se ti servono altre munizioni parla con Justin. Ci penserà lui a te.","正に英雄、流石です! 何か必要ですか?城の全兵器が揃っております。 弾薬が必要ならジャスティンに頼めば大丈夫ですよ",그 프론트의 인기 많은 영웅 아닌가요? 잘하셨습니다! 무엇을 도와드릴까요? 성안에서 특이하고 질 좋은 보급물자들을 긁어모아 왔어요. 만약 탄약 보급을 위해서 오신 거라면 저스틴에게 물어보세요.,"Het is de held. Goed werk! Wat kan ik voor je halen? We hebben een iets grotere selectie nu we alle verordeningen van het kasteel hebben. Als je wat munitie moet kopen, praat dan met Justin. Hij zal voor je zorgen.","Det er helten. Bra jobbet! Hva vil du ha? Vi har et litt større utvalg nå som vi har alle ordrene fra slottet. Hvis du trenger å kjøpe ammunisjon, snakk med Justin. Han tar seg av deg.","Oto bohater. Dobra robota! Co mogę dla ciebie zrobić? Mamy teraz większy @@ -11342,50 +11342,50 @@ wybór towaru dzięki rozporządzeniu z zamku. Jeśli potrzebujesz amunicji to porozmawiaj z Justinem. Zajmie się tobą.",Nosso herói. Bom trabalho! Como posso te ajudar? Temos uma seleção um pouco maior agora que conseguimos todo o equipamento do castelo. Se você precisar comprar munição é só falar com o Justin. Ele pode te ajudar.,,"E eroul. Bună treabă! Ce pot să-ți aduc? Avem o selecție mai largă acum, din moment ce am primit toate ordonanțele de la castel. Dacă ai nevoie de muniție vorbește cu Justin, se va ocupa de tine.","А вот и наш герой. Отлично сработано! Чем я могу тебе помочь? Теперь в нашем распоряжении всё оружие из замка, так что выбор стал побогаче. Если тебе нужны боеприпасы, обратись к Джастину: он тебе поможет.",,Det är hjälten. Bra jobbat! Vad kan jag ge dig? Vi har ett lite större urval nu när vi har alla ordinationer från slottet. Om du behöver köpa lite ammunition så prata med Justin. Han tar hand om dig.,Bu kahraman. İyi iş çıkardın! Size ne getireyim? Kaledeki tüm teçhizat elimizde olduğu için biraz daha geniş bir seçkimiz var. Cephane almak istersen Justin'le konuş. O seninle ilgilenir. -I'm out of bullets.,TXT_RPLY0_SCRIPT10_D28804_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Luodit on loppu.,Je suis à cours de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. +I'm out of bullets.,TXT_RPLY0_SCRIPT10_D28804_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Luodit on loppu.,Je suis à cours de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT10_D28804_HERES,〃,,,"Tady máš nějakou munici, neplýtvej s ní.",Her er noget ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä sinulle vähän ammuksia. Älä tuhlaa niitä.,Voilà des munitions. Ne les gaspillez pas.,Itt van egy kis lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,그렇게 계속 쏘아대면 탄약이 낭비됩니다. 여기 탄약이에요.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Tylko jej nie zmarnuj.,Leve um pouco desta munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Ziyan etme. -Teach me.,TXT_RPLY1_SCRIPT10_D28804_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä sinulle vähän ammuksia. Älä tuhlaa niitä.,Voilà des munitions. Ne les gaspillez pas.,,Itt van egy kis lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,그렇게 계속 쏘아대면 탄약이 낭비됩니다. 여기 탄약이에요.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Tylko jej nie zmarnuj.,Leve um pouco desta munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Ziyan etme. +Teach me.,TXT_RPLY1_SCRIPT10_D28804_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. "Now, a few tips on the big guns.",TXT_RYES1_SCRIPT10_D28804_NOWAF,〃,,,"Tak jo, pár tipů, jak na velké zbraně.",Nu et par tips om de store våben.,Nun einige Ratschläge für die großen Waffen,,"Nun kelkaj konsiloj pri pezaj armiloj...","Ahora unos cuantos consejos -sobre las armas pesadas...",,Voin antaa muutamia vinkkejä isojen aseiden käyttöön.,"Bon, voilà quelques conseils pour les armes plus grosses.","És most, pár tipp a nagyobb fegyverekhez.",Ecco qui un paio di consigli sulle armi pesanti.,では、大きい銃の扱い方を教えます。,중화기 다루는 훈련을 시작하겠습니다!,"Nu, een paar tips over de grote geweren.","Nå, noen tips om de store kanonene.",Proszę. Kilka wskazówek dotyczących używania większych broni.,"Ok, algumas dicas sobre as armas pesadas.",,"Acum, niște sfaturi pentru armele mari.",А теперь пара советов насчёт больших пушек.,,"Nu, några tips om de stora vapnen.","Şimdi, büyük silahlar hakkında birkaç ipucu." +sobre las armas pesadas...",,Voin antaa muutamia vinkkejä isojen aseiden käyttöön.,"Bon, voilà quelques conseils pour les armes plus grosses.",,"És most, pár tipp a nagyobb fegyverekhez.",Ecco qui un paio di consigli sulle armi pesanti.,では、大きい銃の扱い方を教えます。,중화기 다루는 훈련을 시작하겠습니다!,"Nu, een paar tips over de grote geweren.","Nå, noen tips om de store kanonene.",Proszę. Kilka wskazówek dotyczących używania większych broni.,"Ok, algumas dicas sobre as armas pesadas.",,"Acum, niște sfaturi pentru armele mari.",А теперь пара советов насчёт больших пушек.,,"Nu, några tips om de stora vapnen.","Şimdi, büyük silahlar hakkında birkaç ipucu." You're not ready yet.,TXT_RNO1_SCRIPT10_D28804_YOURE,〃,,,Ještě nejsi připraven.,Du er ikke klar endnu.,Du bist noch nicht soweit,,"Vi ankoraŭ -ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,준비가 아직 안됐습니다.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze na to gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. -"How's the war effort? Nevermind, if we're still here, it must be going fine. What can I do for you?",TXT_DLG_SCRIPT10_D30320_HOWST,〃 (one training),,,"Jak jde válečné úsilí? To je jedno, jestliže tu stále jsi, musí to jít dobře. Co pro tebe můžu udělat?","Hvordan går det med krigsindsatsen? Glem det, hvis vi stadig er her, må det gå fint. Hvad kan jeg gøre for dig?","Wie geht der Krieg voran? Egal, solange wir noch hier sind, kann es nicht schlecht laufen. Was kann ich für dich tun?",,"Kiel la milito iras? Nu, ne estas grave, ni estas ankoraŭ vivaj, do ĝi certe iras bone. Kion mi faru por vi?","¿Cómo va la guerra? Bueno, no importa, si seguimos aquí es porque debe de ir bien. ¿Qué puedo hacer por ti?",,"Kuinkas sotaponnistelut sujuvat? Tai ei mitään, varmaankin hyvin sujuvat, jos kerran vielä olemme tässä. Miten voin palvella?","Comment va l'effort de guerre? Non, oubliez. Si vous êtes ici, ça veut dire que tout va bien. Que puis-je faire pour vous?","Hogy áll a harc? Mindegyis, ha még mindig itt vagyunk, akkor jól haladunk. Mit tehetek érted?","Come sta procedendo la guerra? Vabbè, lascia stare, siamo ancora qua, quindi deve procedere bene. Cosa posso fare per te?","奮闘してますか?気にしないで、 +ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,준비가 아직 안됐습니다.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze na to gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. +"How's the war effort? Nevermind, if we're still here, it must be going fine. What can I do for you?",TXT_DLG_SCRIPT10_D30320_HOWST,〃 (one training),,,"Jak jde válečné úsilí? To je jedno, jestliže tu stále jsi, musí to jít dobře. Co pro tebe můžu udělat?","Hvordan går det med krigsindsatsen? Glem det, hvis vi stadig er her, må det gå fint. Hvad kan jeg gøre for dig?","Wie geht der Krieg voran? Egal, solange wir noch hier sind, kann es nicht schlecht laufen. Was kann ich für dich tun?",,"Kiel la milito iras? Nu, ne estas grave, ni estas ankoraŭ vivaj, do ĝi certe iras bone. Kion mi faru por vi?","¿Cómo va la guerra? Bueno, no importa, si seguimos aquí es porque debe de ir bien. ¿Qué puedo hacer por ti?",,"Kuinkas sotaponnistelut sujuvat? Tai ei mitään, varmaankin hyvin sujuvat, jos kerran vielä olemme tässä. Miten voin palvella?","Comment va l'effort de guerre? Non, oubliez. Si vous êtes ici, ça veut dire que tout va bien. Que puis-je faire pour vous?",,"Hogy áll a harc? Mindegyis, ha még mindig itt vagyunk, akkor jól haladunk. Mit tehetek érted?","Come sta procedendo la guerra? Vabbè, lascia stare, siamo ancora qua, quindi deve procedere bene. Cosa posso fare per te?","奮闘してますか?気にしないで、 ここにいるなら上手くやってるのは分かります。 どういうご用件ですか?",전쟁 상황은 어떻게 되어가나요? 상관은 없지만. 우리들이 아직 살아있는 한 물어볼 필요도 없죠. 무엇을 원하시나요?,"Hoe gaat het met de oorlogsinspanning? Maakt niet uit, als we hier nog steeds zijn, moet het wel goed gaan. Wat kan ik voor je doen?","Hvordan går det med krigsinnsatsen? Glem det, hvis vi fortsatt er her, må det gå bra. Hva kan jeg gjøre for deg?","Jak tam wojna idzie? Nieważne. Jeśli cały czas żyjemy to chyba dobrze. Co mogę dla ciebie zrobić?","Como está indo a guerra? Deixa pra lá, se nós ainda estamos aqui é porque deve estar indo bem. Como posso te ajudar?",,"Cum merge efortul de război? Nu mai contează, dacă suntem încă aici înseamnă că e bine. Ce pot face pentru tine?","Как дела на фронте? Впрочем, неважно. Наверняка всё хорошо, раз мы ещё живы. Что я могу для тебя сделать?",,"Hur går det med krigsinsatsen? Strunt samma, om vi fortfarande är här måste det gå bra. Vad kan jag göra för dig?","Savaş çabaları nasıl gidiyor? Boşver, hala burada olduğumuza göre, iyi gidiyor olmalı. Senin için ne yapabilirim?" -I ran out of bullets.,TXT_RPLY0_SCRIPT10_D30320_IRANO,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Mir ist die Munition ausgegangen.,,Mi eluzis la kuglojn.,Me he quedado sin balas.,Me quedé sin balas.,Minulta loppuivat luodit.,Je suis à court de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾を使い果たした。,탄약이 바닥났어요.,De kogels zijn op.,Jeg gikk tom for kuler.,Skończyły mi się naboje.,Fiquei sem munição.,,Am rămas fără gloanțe.,У меня кончились патроны.,,Jag fick slut på kulor.,Mermim bitti. -That should help.,TXT_RYES0_SCRIPT10_D30320_THATS,〃 (〃),,,Tohle by mělo pomoci.,Det burde hjælpe.,Das hier sollte helfen.,,Ĉi tiom devus helpi.,A ver si esto ayuda.,,Tämän pitäisi auttaa.,Cela devrait aider.,Ez majd segít.,Questo dovrebbe aiutarti.,これが助けになるでしょう。,좀 도움이 될 겁니다.,Dat zou moeten helpen.,Det burde hjelpe.,To powinno pomóc.,Isto deve ajudar.,,Asta ar trebui să ajute.,"Вот, пожалуйста.",,Det borde hjälpa.,Bunun yardımı olur. -You've got enough ammo.,TXT_RNO0_SCRIPT10_D30320_YOUVE,〃 (〃),,,Máš jich dost.,Du har nok ammunition.,Du hast genug Munition.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,Van elég lőszered.,Ne hai a sufficienza.,弾は十分に見えます。,탄약을 충분히 소지한 것 같은데.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você já tem munição suficiente.,,Ai destulă.,Вполне достаточно.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. -Teach me.,TXT_RPLY1_SCRIPT10_D30320_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +I ran out of bullets.,TXT_RPLY0_SCRIPT10_D30320_IRANO,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Mir ist die Munition ausgegangen.,,Mi eluzis la kuglojn.,Me he quedado sin balas.,Me quedé sin balas.,Minulta loppuivat luodit.,Je suis à court de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾を使い果たした。,탄약이 바닥났어요.,De kogels zijn op.,Jeg gikk tom for kuler.,Skończyły mi się naboje.,Fiquei sem munição.,,Am rămas fără gloanțe.,У меня кончились патроны.,,Jag fick slut på kulor.,Mermim bitti. +That should help.,TXT_RYES0_SCRIPT10_D30320_THATS,〃 (〃),,,Tohle by mělo pomoci.,Det burde hjælpe.,Das hier sollte helfen.,,Ĉi tiom devus helpi.,A ver si esto ayuda.,,Tämän pitäisi auttaa.,Cela devrait aider.,,Ez majd segít.,Questo dovrebbe aiutarti.,これが助けになるでしょう。,좀 도움이 될 겁니다.,Dat zou moeten helpen.,Det burde hjelpe.,To powinno pomóc.,Isto deve ajudar.,,Asta ar trebui să ajute.,"Вот, пожалуйста.",,Det borde hjälpa.,Bunun yardımı olur. +You've got enough ammo.,TXT_RNO0_SCRIPT10_D30320_YOUVE,〃 (〃),,,Máš jich dost.,Du har nok ammunition.,Du hast genug Munition.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,,Van elég lőszered.,Ne hai a sufficienza.,弾は十分に見えます。,탄약을 충분히 소지한 것 같은데.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você já tem munição suficiente.,,Ai destulă.,Вполне достаточно.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. +Teach me.,TXT_RPLY1_SCRIPT10_D30320_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. "Here, I'll show you a few tricks of the trade.",TXT_RYES1_SCRIPT10_D30320_HEREI,〃 (〃),,,Ukážu ti pár triků mého řemesla.,"Her, jeg skal vise dig et par tricks.","Hier, ich zeige dir mal ein paar Geheimtricks.",,"Nu, mi montros kelkajn trompojn por spertuloj...","Bien, te mostraré un par de trucos del oficio...","Bien, te voy a mostrar -un par de trucos del oficio.","No niin, valotan sinulle vähän alan saloja.",Voilà quelques conseils dont vous pouvez faire usage.,"Nézdd csak, mutatok neked pár trükköt.",Ora ti mostro un paio di trucchi del mestiere.,では、幾つかのコツを教えましょう。,저항군의 참된 기술들을 좀 가르쳐드리죠!,Hier zal ik je een paar trucjes van het vak laten zien.,Jeg skal vise deg noen triks.,Proszę. Oto kilka wskazówek o handlu.,"Certo, vou te mostrar alguns truques do ofício.",,"Iată, am să te învăț niște trucuri.","Давай, я покажу тебе пару секретных приёмчиков.",,"Här, jag ska visa dig några knep.",Sana işin birkaç püf noktasını göstereceğim. +un par de trucos del oficio.","No niin, valotan sinulle vähän alan saloja.",Voilà quelques conseils dont vous pouvez faire usage.,,"Nézdd csak, mutatok neked pár trükköt.",Ora ti mostro un paio di trucchi del mestiere.,では、幾つかのコツを教えましょう。,저항군의 참된 기술들을 좀 가르쳐드리죠!,Hier zal ik je een paar trucjes van het vak laten zien.,Jeg skal vise deg noen triks.,Proszę. Oto kilka wskazówek o handlu.,"Certo, vou te mostrar alguns truques do ofício.",,"Iată, am să te învăț niște trucuri.","Давай, я покажу тебе пару секретных приёмчиков.",,"Här, jag ska visa dig några knep.",Sana işin birkaç püf noktasını göstereceğim. You're not ready yet.,TXT_RNO1_SCRIPT10_D30320_YOURE,〃 (〃),,,Ještě nejsi připraven.,Du er ikke klar endnu.,Du bist noch nicht soweit,,"Vi ankoraŭ -ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,당신은 아직 준비가 안됐어요.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze na to gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. -Well have you come for tutelage or is it some ammo you're looking for? Don't think that I'm done with you yet. I've still got a few tricks up my sleeve.,TXT_DLG_SCRIPT10_D31836_WELLH,〃 (two trainings),,,"Tak co, přišel jsi sem kvůli další lekci nebo potřebuješ náboje? Nemysli si, že jsme tu skončili. Ještě mám pár triků v rukávu.","Er du kommet for at få undervisning, eller er det ammunition du leder efter? Du skal ikke tro, at jeg er færdig med dig endnu. Jeg har stadig et par tricks i ærmet.","Also, bist du zum Lernen gekommen, oder weil du mal wieder Munition brauchst? Denk bloß nicht, dass ich mit dir fertig bin. Ich habe noch ein paar Tricks auf Lager.",,"Nu, ĉu vi serĉas trejnadon aŭ municion? Ne kredu, ke mi finis kun vi: mi rezervas kelkajn sekretajn krizokazajn trompojn.","Bueno, ¿has venido a por tutela o por municiones? No creas que he terminado contigo: aún tengo un par de trucos bajo la manga.","Bueno, ¿viniste por tutela o por municiones? No creas que ya terminé contigo: aún tengo un par de trucos bajo la manga.","Oletko koulutuksen tarpeessa vai ammuksiako kaipaat? Älä luulekaan, etteikö hihassani olisi sinulle vielä muutamaa ässää jaettavana.","Vous êtes venu pour des leçons ou avez-vous besoin de munitions? Je n'ai pas encore fini avec vous, ne vous inquiétez-pas. J'ai encore des tours dans mon sac.","Valami kiképzés érdekel, vagy csak lőszerért jöttél? nehogy azt hidd, hogy végeztem veled. Még mindig rejt a tarsolyom új trükköket.","Allora, sei venuto per imparare qualcosa di nuovo o stai solo cercando munizioni? Non pensare che io abbia finito con te. Ho ancora qualche trucco da impartirti.","指導の受講か、弾薬の受け取りですか? +ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,당신은 아직 준비가 안됐어요.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze na to gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. +Well have you come for tutelage or is it some ammo you're looking for? Don't think that I'm done with you yet. I've still got a few tricks up my sleeve.,TXT_DLG_SCRIPT10_D31836_WELLH,〃 (two trainings),,,"Tak co, přišel jsi sem kvůli další lekci nebo potřebuješ náboje? Nemysli si, že jsme tu skončili. Ještě mám pár triků v rukávu.","Er du kommet for at få undervisning, eller er det ammunition du leder efter? Du skal ikke tro, at jeg er færdig med dig endnu. Jeg har stadig et par tricks i ærmet.","Also, bist du zum Lernen gekommen, oder weil du mal wieder Munition brauchst? Denk bloß nicht, dass ich mit dir fertig bin. Ich habe noch ein paar Tricks auf Lager.",,"Nu, ĉu vi serĉas trejnadon aŭ municion? Ne kredu, ke mi finis kun vi: mi rezervas kelkajn sekretajn krizokazajn trompojn.","Bueno, ¿has venido a por tutela o por municiones? No creas que he terminado contigo: aún tengo un par de trucos bajo la manga.","Bueno, ¿viniste por tutela o por municiones? No creas que ya terminé contigo: aún tengo un par de trucos bajo la manga.","Oletko koulutuksen tarpeessa vai ammuksiako kaipaat? Älä luulekaan, etteikö hihassani olisi sinulle vielä muutamaa ässää jaettavana.","Vous êtes venu pour des leçons ou avez-vous besoin de munitions? Je n'ai pas encore fini avec vous, ne vous inquiétez-pas. J'ai encore des tours dans mon sac.",,"Valami kiképzés érdekel, vagy csak lőszerért jöttél? nehogy azt hidd, hogy végeztem veled. Még mindig rejt a tarsolyom új trükköket.","Allora, sei venuto per imparare qualcosa di nuovo o stai solo cercando munizioni? Non pensare che io abbia finito con te. Ho ancora qualche trucco da impartirti.","指導の受講か、弾薬の受け取りですか? まだ全て終わったわけではありません。 私の袖口に若干技術を忍ばせております。","무엇을 원하시나요? 훈련? 아니면 탄약 보급? 그리고 훈련은 아직 끝난 게 아니니까 끝날 걱정도, 다칠 고민도 하지 마시길 바랍니다.",Ben je gekomen voor voogdij of ben je op zoek naar munitie? Denk niet dat ik nog niet klaar ben met jou. Ik heb nog een paar trucjes in mijn mouw.,"Har du kommet for å få veiledning, eller er det ammunisjon du er ute etter? Ikke tro at jeg er ferdig med deg ennå. Jeg har fortsatt noen triks i ermet.","Chcesz się czegoś nauczyć czy raczej przyszedłeś po trochę amunicji? Nie myśl, że z tobą skończyłem. Wciąż mam jeszcze parę sztuczek w zanadrzu.","Muito bem, você veio para aprender algo ou está precisando de munição? Não pense que aquilo é tudo, ainda tenho alguns truques na manga.",,"Ai venit pentru a învăța ceva sau doar pentru muniție? Să nu crezi că am terminat cu tine, încă mai am niste ași în mânecă.","Итак, ты пришёл за напутствием? Или тебе нужны боеприпасы? Не думай, что твоё обучение окончено. У меня ещё есть кое-какие козыри в рукаве!",,Har du kommit för att få undervisning eller är det ammunition du letar efter? Tro inte att jag är klar med dig än. Jag har fortfarande några knep i ärmen.,Özel ders için mi geldin yoksa cephane mi arıyorsun? Seninle işimin bittiğini sanma. Hala birkaç numaram var. -It's ammo for now.,TXT_RPLY0_SCRIPT10_D31836_ITSAM,〃 (〃),,,Teď tu jsem jen pro náboje.,Det er ammunition for nu.,Im Moment ist es Munition.,,"Ĉi-momente, municion.","Por ahora, munición.",,Ammuksia tähän hätään.,Munitions pour l'instant.,Csak lőszer lesz most.,"Per il momento, solo munizioni.",今のところ弾薬だ。,탄약이 필요하겠네요.,Het is voorlopig munitie.,Det er ammunisjon for nå.,Tym razem chodzi o amunicję.,No momento preciso de munição.,,Muniție pentru moment.,Мне нужны боеприпасы.,,Det är ammunition för tillfället.,Şimdilik cephane. +It's ammo for now.,TXT_RPLY0_SCRIPT10_D31836_ITSAM,〃 (〃),,,Teď tu jsem jen pro náboje.,Det er ammunition for nu.,Im Moment ist es Munition.,,"Ĉi-momente, municion.","Por ahora, munición.",,Ammuksia tähän hätään.,Munitions pour l'instant.,,Csak lőszer lesz most.,"Per il momento, solo munizioni.",今のところ弾薬だ。,탄약이 필요하겠네요.,Het is voorlopig munitie.,Det er ammunisjon for nå.,Tym razem chodzi o amunicję.,No momento preciso de munição.,,Muniție pentru moment.,Мне нужны боеприпасы.,,Det är ammunition för tillfället.,Şimdilik cephane. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT10_D31836_HERES,〃 (〃),,,"Tady nějaké máš, neplýtvej s nimi.",Her er lidt ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä sinulle vähän kuteja. Älä haaskaa niitä.,Voilà des munitions. Ne les gaspillez pas.,Itt van egy kis lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,"좋은 병사에겐, 좋은 품질의 탄약을.",Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Tylko jej nie zmarnuj.,Leve um pouco desta munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. -You've got enough ammo.,TXT_RNO0_SCRIPT10_D31836_YOUVE,〃 (〃),,,Máš jich dost.,Du har ammunition nok.,Du hast genug Munition.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,Van elég lőszered.,Ne hai a sufficienza.,弾は十分に見えます。,아직 당신에게 탄약이 남아있는 것 같습니다만...,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você já tem munição suficiente.,,Ai destulă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. -Teach me.,TXT_RPLY1_SCRIPT10_D31836_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä sinulle vähän kuteja. Älä haaskaa niitä.,Voilà des munitions. Ne les gaspillez pas.,,Itt van egy kis lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,"좋은 병사에겐, 좋은 품질의 탄약을.",Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Masz tu trochę amunicji. Tylko jej nie zmarnuj.,Leve um pouco desta munição. Não desperdice.,,Uite niște muniție. N-o risipi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. +You've got enough ammo.,TXT_RNO0_SCRIPT10_D31836_YOUVE,〃 (〃),,,Máš jich dost.,Du har ammunition nok.,Du hast genug Munition.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,,Van elég lőszered.,Ne hai a sufficienza.,弾は十分に見えます。,아직 당신에게 탄약이 남아있는 것 같습니다만...,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você já tem munição suficiente.,,Ai destulă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. +Teach me.,TXT_RPLY1_SCRIPT10_D31836_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. Time for the advanced lessons.,TXT_RYES1_SCRIPT10_D31836_TIMEF,〃 (〃),,,Čas na pokročilé lekce.,Tid til de avancerede lektioner.,Zeit für fortgeschrittene Lektionen.,,"Estas tempo por la superaj lecionoj...","Hora de las -lecciones avanzadas...",,Aika aloittaa syventävät opinnot.,Il est temps de passer à des leçons plus avancées.,Jöjjön valami komolyabb lecke.,È arrivato il momento delle lezioni avanzate.,上級レッスンの時間です。,심화학습을 할 시간이군요!,Tijd voor de gevorderde lessen voor gevorderden.,På tide med de avanserte leksjonene.,Czas na lekcje dla zaawansowanych.,Hora das aulas avançadas.,,Timpul pentru lecțiile avansate.,Пришло время для углублённого изучения оружия!,,Dags för avancerade lektioner.,İleri seviye ders zamanı. +lecciones avanzadas...",,Aika aloittaa syventävät opinnot.,Il est temps de passer à des leçons plus avancées.,,Jöjjön valami komolyabb lecke.,È arrivato il momento delle lezioni avanzate.,上級レッスンの時間です。,심화학습을 할 시간이군요!,Tijd voor de gevorderde lessen voor gevorderden.,På tide med de avanserte leksjonene.,Czas na lekcje dla zaawansowanych.,Hora das aulas avançadas.,,Timpul pentru lecțiile avansate.,Пришло время для углублённого изучения оружия!,,Dags för avancerade lektioner.,İleri seviye ders zamanı. You're not ready yet.,TXT_RNO1_SCRIPT10_D31836_YOURE,〃 (〃),,,Ještě nejsi připraven.,Du er ikke klar endnu.,Du bist noch nicht soweit.,,"Vi ankoraŭ -ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,넌 아직 준비가 안됐어.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze na to gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. -"Well, what is it now? Don't you ever take a break? I'm glad that you're still breathing. I'd hate for my favorite student to come back looking out from the inside of a body bag.",TXT_DLG_SCRIPT10_D33352_WELLW,〃 (three trainings),,"Well, what is it now? Don't you ever take a break? I'm glad that you're still breathing. I'd hate for my favourite student to come back looking out from the inside of a body bag.","Tak, o co jde teď? Nechceš si někdy dát oraz? Jsem rád, že ještě dýcháš. Nechtěl bych, aby se mi můj oblíbený student vrátil v rakvi.","Hvad er det så nu? Tager du aldrig en pause? Jeg er glad for, at du stadig trækker vejret. Jeg ville hade, hvis min yndlingselev skulle komme tilbage og se ud fra en ligpose.","Also, was ist es dieses Mal? Machst du jemals eine Pause? Bin ich froh, dass du noch atmest.Gefiele mir nicht, meinen Lieblingschüler in einem Leichensack zurückkommen zu sehen.",,"Nu, kion ĉi-foje? Ĉu vi neniam ripozas? Ĝojigas min, ke vi ankoraŭ spiras; mi malamus, ke mia plej ŝatata studanto revenus en kadavro-sako.","Bueno, ¿qué es ahora?, ¿es que nunca descansas? Me alegra que sigas respirando; odiaría ver a mi estudiante favorito volver asomándose en una bolsa para cadáveres.",,Mikä nyt on? Etkö koskaan pidä taukoa? Onneksi henki vielä pihisee. En haluaisi lempioppilaani palaavan takaisin ruumissäkissä.,"Eh bien, comment allez vous? Vous prenez une pause de temps en temps? Je suis content de voir que vous êtes toujours vivant, çe me ferait mal de voir mon apprenti préféré dans un sac mortuaire.","Már megint mi van? Te sosem tartasz szünetet? Örülök, hogy még mindig lélegzel. Nem örülnék neki ha a kedvenc tanoncomat egy hullazsákban látnám viszont.","Ah, e adesso cosa c'è? Non ti prendi mai una pausa? Mi fa piacere vederti ancora respirare. Sarebbe tragico vedere il mio studente preferito ritornare in una sacca per cadaveri.","さて、調子はどうですか?休憩しませんか? +ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,넌 아직 준비가 안됐어.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze na to gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. +"Well, what is it now? Don't you ever take a break? I'm glad that you're still breathing. I'd hate for my favorite student to come back looking out from the inside of a body bag.",TXT_DLG_SCRIPT10_D33352_WELLW,〃 (three trainings),,"Well, what is it now? Don't you ever take a break? I'm glad that you're still breathing. I'd hate for my favourite student to come back looking out from the inside of a body bag.","Tak, o co jde teď? Nechceš si někdy dát oraz? Jsem rád, že ještě dýcháš. Nechtěl bych, aby se mi můj oblíbený student vrátil v rakvi.","Hvad er det så nu? Tager du aldrig en pause? Jeg er glad for, at du stadig trækker vejret. Jeg ville hade, hvis min yndlingselev skulle komme tilbage og se ud fra en ligpose.","Also, was ist es dieses Mal? Machst du jemals eine Pause? Bin ich froh, dass du noch atmest.Gefiele mir nicht, meinen Lieblingschüler in einem Leichensack zurückkommen zu sehen.",,"Nu, kion ĉi-foje? Ĉu vi neniam ripozas? Ĝojigas min, ke vi ankoraŭ spiras; mi malamus, ke mia plej ŝatata studanto revenus en kadavro-sako.","Bueno, ¿qué es ahora?, ¿es que nunca descansas? Me alegra que sigas respirando; odiaría ver a mi estudiante favorito volver asomándose en una bolsa para cadáveres.",,Mikä nyt on? Etkö koskaan pidä taukoa? Onneksi henki vielä pihisee. En haluaisi lempioppilaani palaavan takaisin ruumissäkissä.,"Eh bien, comment allez vous? Vous prenez une pause de temps en temps? Je suis content de voir que vous êtes toujours vivant, çe me ferait mal de voir mon apprenti préféré dans un sac mortuaire.",,"Már megint mi van? Te sosem tartasz szünetet? Örülök, hogy még mindig lélegzel. Nem örülnék neki ha a kedvenc tanoncomat egy hullazsákban látnám viszont.","Ah, e adesso cosa c'è? Non ti prendi mai una pausa? Mi fa piacere vederti ancora respirare. Sarebbe tragico vedere il mio studente preferito ritornare in una sacca per cadaveri.","さて、調子はどうですか?休憩しませんか? 貴方がまだ息をしているのが喜ばしい事です。 お気に入りの生徒が死体袋から天を仰ぐ様に なるのは嫌なのです。",이번엔 또 뭔가요? 휴식을 제대로 취하지 않는 성격인가요? 그래도 몸은 멀쩡히 움직이는 것 같군요! 그토록 가르침을 받던 우수한 제자가 사체로 돌아오면 정말 슬플 테니.,"Nou, wat is het nu? Neem je nooit een pauze? Ik ben blij dat je nog steeds ademt. Ik zou het vreselijk vinden als mijn favoriete student terug zou komen met het oog op de binnenkant van een lijkzak.",Hva er det nå? Tar du aldri en pause? Jeg er glad for at du fortsatt puster. Jeg vil ikke at yndlingseleven min skal komme tilbake og se ut fra innsiden av en likpose.,"Dobra. Co tym razem? Czy ty w ogóle @@ -11393,259 +11393,259 @@ robisz sobie jakieś przerwy? Cieszę się, że wciąż żyjesz. Przykro by mi się zrobiło gdyby mój ulubiony uczeń wrócił w trumnie.","Bem, o que vai ser desta vez? Será que você não descansa nunca? Ainda bem que você ainda está respirando. Eu detestaria ver meu aluno favorito voltando num saco de cadáver.",,Ce mai este? Nu iei niciodată pauză? Mă bucur că încă mai respiri. Ar fi păcat dacă cel mai bun student al meu ar veni într-un sac.,"Итак, ты справился? У тебя было время передохнуть? Рад видеть, что ты всё ещё дышишь. Мне бы не хотелось, чтобы мой лучший ученик вернулся в мешке для трупов.",,Vad är det nu då? Tar du aldrig en paus? Jag är glad att du fortfarande andas. Jag vill inte att min favoritelev ska komma tillbaka och titta ut från insidan av en liksäck.,"Peki, şimdi ne var? Hiç ara vermez misin? Hâlâ nefes alıyor olmana sevindim. En sevdiğim öğrencimin bir ceset torbasının içinden bakarak geri gelmesini istemem." -I need some more bullets.,TXT_RPLY0_SCRIPT10_D33352_INEED,〃 (〃),,,Potřebuju nějaké další náboje.,Jeg har brug for flere kugler.,Ich brauche mehr Munition.,,Mi bezonas pliajn kuglojn.,Necesito más balas.,,Tarvitsen lisää luoteja.,J'ai besoin de munitions.,Még több lőszerre lesz szükségem.,Ho bisogno di altre munizioni.,もっと弾が必要だ。,총알이 좀 더 필요해.,Ik heb meer kogels nodig.,Jeg trenger flere kuler.,Potrzebuję trochę naboi.,Preciso de mais munição.,,Am nevoie de niște gloanțe.,Мне нужны патроны.,,Jag behöver fler kulor.,Biraz daha mermiye ihtiyacım var. -"There, don't waste it.",TXT_RYES0_SCRIPT10_D33352_THERE,〃 (〃),,,"Tady máš, neplýtvej s nimi.","Sådan, lad være med at spilde den.","Hier, verschwende sie nicht.",,"Jen, ne malŝparu ĝin.","Toma, no las desperdicies.",,"Kas tässä, älä tuhlaa niitä.","Voilà, ne les gaspillez pas.","Parancsolj, ne pazarold el.","Ecco qua, non sprecarle.",大切にして下さいね。,여기 있습니다. 낭비하지 말고 아껴 쓰세요.,"Daar, verspil het niet.","Sånn, ikke sløs dem bort.",Proszę. Nie zmarnuj ich.,Pegue. Não desperdice.,,"Iată, n-o risipi.",Вот. Не трать их попусту.,,Slösa inte bort den.,"İşte, boşa harcama." -You have enough.,TXT_RNO0_SCRIPT10_D33352_YOUHA,〃 (〃),,,Máš jich dost.,Du har nok.,Du hast genug.,,Vi havas sufiĉe.,Tienes suficientes.,,Sinulla on tarpeeksi.,Vous en avez assez.,Már van elég.,Ne hai a sufficienza.,十分そうです。,지금도 충분한 것 같은데요.,Je hebt genoeg.,Du har nok.,Masz już ich wystarczająco dużo.,Você já tem o suficiente.,,Ai destulă.,Тебе хватает.,,Du har tillräckligt.,Sende yeterince var. -What can you teach me?,TXT_RPLY1_SCRIPT10_D33352_WHATC,〃 (〃),,,Co mě můžeš naučit?,Hvad kan du lære mig?,Was kannst du mir beibringen?,,Kion vi povas instrui al mi?,¿Qué puedes enseñarme?,,Mitä voit opettaa minulle?,Que pouvez-vous m'apprendre.,Mit tudsz tanítani?,Che cosa mi puoi insegnare?,何か教えてくれないか?,나에게 뭘 가르쳐 줄 수 있죠?,Wat kun je me leren?,Hva kan du lære meg?,Czego możesz mnie nauczyć?,O que você tem pra me ensinar?,,Ce mă poți învăța?,Чему ты можешь меня научить?,,Vad kan du lära mig?,Bana ne öğretebilirsin? +I need some more bullets.,TXT_RPLY0_SCRIPT10_D33352_INEED,〃 (〃),,,Potřebuju nějaké další náboje.,Jeg har brug for flere kugler.,Ich brauche mehr Munition.,,Mi bezonas pliajn kuglojn.,Necesito más balas.,,Tarvitsen lisää luoteja.,J'ai besoin de munitions.,,Még több lőszerre lesz szükségem.,Ho bisogno di altre munizioni.,もっと弾が必要だ。,총알이 좀 더 필요해.,Ik heb meer kogels nodig.,Jeg trenger flere kuler.,Potrzebuję trochę naboi.,Preciso de mais munição.,,Am nevoie de niște gloanțe.,Мне нужны патроны.,,Jag behöver fler kulor.,Biraz daha mermiye ihtiyacım var. +"There, don't waste it.",TXT_RYES0_SCRIPT10_D33352_THERE,〃 (〃),,,"Tady máš, neplýtvej s nimi.","Sådan, lad være med at spilde den.","Hier, verschwende sie nicht.",,"Jen, ne malŝparu ĝin.","Toma, no las desperdicies.",,"Kas tässä, älä tuhlaa niitä.","Voilà, ne les gaspillez pas.",,"Parancsolj, ne pazarold el.","Ecco qua, non sprecarle.",大切にして下さいね。,여기 있습니다. 낭비하지 말고 아껴 쓰세요.,"Daar, verspil het niet.","Sånn, ikke sløs dem bort.",Proszę. Nie zmarnuj ich.,Pegue. Não desperdice.,,"Iată, n-o risipi.",Вот. Не трать их попусту.,,Slösa inte bort den.,"İşte, boşa harcama." +You have enough.,TXT_RNO0_SCRIPT10_D33352_YOUHA,〃 (〃),,,Máš jich dost.,Du har nok.,Du hast genug.,,Vi havas sufiĉe.,Tienes suficientes.,,Sinulla on tarpeeksi.,Vous en avez assez.,,Már van elég.,Ne hai a sufficienza.,十分そうです。,지금도 충분한 것 같은데요.,Je hebt genoeg.,Du har nok.,Masz już ich wystarczająco dużo.,Você já tem o suficiente.,,Ai destulă.,Тебе хватает.,,Du har tillräckligt.,Sende yeterince var. +What can you teach me?,TXT_RPLY1_SCRIPT10_D33352_WHATC,〃 (〃),,,Co mě můžeš naučit?,Hvad kan du lære mig?,Was kannst du mir beibringen?,,Kion vi povas instrui al mi?,¿Qué puedes enseñarme?,,Mitä voit opettaa minulle?,Que pouvez-vous m'apprendre.,,Mit tudsz tanítani?,Che cosa mi puoi insegnare?,何か教えてくれないか?,나에게 뭘 가르쳐 줄 수 있죠?,Wat kun je me leren?,Hva kan du lære meg?,Czego możesz mnie nauczyć?,O que você tem pra me ensinar?,,Ce mă poți învăța?,Чему ты можешь меня научить?,,Vad kan du lära mig?,Bana ne öğretebilirsin? "Don't get snippy, you've still some room to grow.",TXT_RYES1_SCRIPT10_D33352_DONTG,〃 (〃),,,Nebuď moc domýšlivý; ještě se máš co učit.,"Du skal ikke blive snerpet, du har stadig plads til at vokse.","Werd nicht leichtsinnig, du kannst noch einiges dazulernen.",,"Paciencon, vi ankoraŭ havas multajn lernotaĵojn.","Paciencia, que aún tienes -mucho que aprender.",,"Äläs rupea nokkavaksi, sinulla on vielä kasvun varaa.","Ne faites pas l'orgeuilleux, vous avez encore de quoi apprendre.","Ne hordd úgy fennt az orrod, van még mit tanulnod.","Non essere brusco, ci sono ancora cose che puoi imparare.",ぶっきらぼうにならないで、まだ成長の余地はあります。,너무 자만하지 마세요. 아직 더 배울 게 많으니까.,"Wordt niet snipperig, je hebt nog wat ruimte om te groeien.","Ikke vær frekk, du har fortsatt litt å gå på.",Nie wychylaj się. Przed tobą jeszcze długa droga.,"Vai devagar, rapaz. Você ainda tem muito o que aprender.",,"Nu fi impetinent, încă mai ai ce învăța.",Не задирай нос. Тебе ещё есть куда расти.,,"Bli inte snäsig, du har fortfarande utrymme att växa.","Kibirlenme, hala büyümek için yerin var." +mucho que aprender.",,"Äläs rupea nokkavaksi, sinulla on vielä kasvun varaa.","Ne faites pas l'orgeuilleux, vous avez encore de quoi apprendre.",,"Ne hordd úgy fennt az orrod, van még mit tanulnod.","Non essere brusco, ci sono ancora cose che puoi imparare.",ぶっきらぼうにならないで、まだ成長の余地はあります。,너무 자만하지 마세요. 아직 더 배울 게 많으니까.,"Wordt niet snipperig, je hebt nog wat ruimte om te groeien.","Ikke vær frekk, du har fortsatt litt å gå på.",Nie wychylaj się. Przed tobą jeszcze długa droga.,"Vai devagar, rapaz. Você ainda tem muito o que aprender.",,"Nu fi impetinent, încă mai ai ce învăța.",Не задирай нос. Тебе ещё есть куда расти.,,"Bli inte snäsig, du har fortfarande utrymme att växa.","Kibirlenme, hala büyümek için yerin var." Nothing until you're ready.,TXT_RNO1_SCRIPT10_D33352_NOTHI,〃 (〃),,,"Nic, dokud nebudeš připraven.","Intet, før du er klar.","Nichts, bevor diu nicht bereit bist.",,"Nenion ĝis -vi estos preta.",Nada hasta que estés listo.,,"Ei mitään, kunnes olet valmis.",Pas avant que vous ne soyez prêt.,"Semmi, míg nem állsz készen.","Nulla al momento, finché non sarai pronto",準備が整うまで何も出来ません。,준비가 안 된 것 같으니 나중에 배웁시다.,Niets totdat je er klaar voor bent.,Ingenting før du er klar.,Na razie nic póki nie jesteś gotowy.,Nada até que você esteja preparado.,,"Nimic, până nu ești pregătit.","Ничему, пока ты не готов.",,Ingenting förrän du är redo.,Hazır olana kadar hiçbir şey. -"Look who's back, what's on your mind? I know it's been hard, but all of us appreciate your efforts, believe me.",TXT_DLG_SCRIPT10_D34868_LOOKW,〃 (four trainings),,,"No ne, kdopak to je? Jak se vede? Vím, že je to těžké, ale všichni si tě vážíme, věř mi.","Se, hvem der er tilbage. Hvad har du på hjerte? Jeg ved, det har været svært, men vi sætter alle pris på din indsats, tro mig.","Sieh mal an, wer zurück ist. Was gibt es? Ich weiß, es ist schwierig, aber wir alle wissen deine Arbeit zu würdigen, glaub mir.",,"Vi revenis! Pri kio vi pensas? Mi scias, ke nenio estis facila, sed ni ĉiuj taksas viajn strebojn, kredu min.","Mira quien ha vuelto. ¿En qué estás pensando? Sé que son tiempos difíciles, pero todos apreciamos tus esfuerzos, créeme.","Mira quien volvió. ¿En qué estás pensando? Sé que son tiempos difíciles, pero todos apreciamos tus esfuerzos, créeme.","Kukas se siinä; mitä on mielessäsi? Tiedän, että sinulla on ollut rankkaa, mutta uskothan, että me kaikki arvostamme vaivannäköäsi.","Regardez qui revient! Comment ça va? Je sais que les temps sont durs mais nous apprécions vos efforts, vraiment.","Nézzenek oda kit látnak szemeim, mi újság van veled? Tudom, hogy nem könnyű, de hidd el mindannyian értékeljük a fáradozásaidat.","Guarda chi si vede, a cosa stai pensando? Lo so che son tempi duri, ma noi tutti apprezziamo i tuoi sforzi, credimi.","誰が戻って来たかについて、貴方の考えとは? +vi estos preta.",Nada hasta que estés listo.,,"Ei mitään, kunnes olet valmis.",Pas avant que vous ne soyez prêt.,,"Semmi, míg nem állsz készen.","Nulla al momento, finché non sarai pronto",準備が整うまで何も出来ません。,준비가 안 된 것 같으니 나중에 배웁시다.,Niets totdat je er klaar voor bent.,Ingenting før du er klar.,Na razie nic póki nie jesteś gotowy.,Nada até que você esteja preparado.,,"Nimic, până nu ești pregătit.","Ничему, пока ты не готов.",,Ingenting förrän du är redo.,Hazır olana kadar hiçbir şey. +"Look who's back, what's on your mind? I know it's been hard, but all of us appreciate your efforts, believe me.",TXT_DLG_SCRIPT10_D34868_LOOKW,〃 (four trainings),,,"No ne, kdopak to je? Jak se vede? Vím, že je to těžké, ale všichni si tě vážíme, věř mi.","Se, hvem der er tilbage. Hvad har du på hjerte? Jeg ved, det har været svært, men vi sætter alle pris på din indsats, tro mig.","Sieh mal an, wer zurück ist. Was gibt es? Ich weiß, es ist schwierig, aber wir alle wissen deine Arbeit zu würdigen, glaub mir.",,"Vi revenis! Pri kio vi pensas? Mi scias, ke nenio estis facila, sed ni ĉiuj taksas viajn strebojn, kredu min.","Mira quien ha vuelto. ¿En qué estás pensando? Sé que son tiempos difíciles, pero todos apreciamos tus esfuerzos, créeme.","Mira quien volvió. ¿En qué estás pensando? Sé que son tiempos difíciles, pero todos apreciamos tus esfuerzos, créeme.","Kukas se siinä; mitä on mielessäsi? Tiedän, että sinulla on ollut rankkaa, mutta uskothan, että me kaikki arvostamme vaivannäköäsi.","Regardez qui revient! Comment ça va? Je sais que les temps sont durs mais nous apprécions vos efforts, vraiment.",,"Nézzenek oda kit látnak szemeim, mi újság van veled? Tudom, hogy nem könnyű, de hidd el mindannyian értékeljük a fáradozásaidat.","Guarda chi si vede, a cosa stai pensando? Lo so che son tempi duri, ma noi tutti apprezziamo i tuoi sforzi, credimi.","誰が戻って来たかについて、貴方の考えとは? 困難な事だとわかっています。しかし私達全員は 貴方の努力には感謝しています。","다시 돌아오다니. 어쩐 일이십니까? 견디기 힘든 고역이었겠지만, 지금 당신은 우리들을 위해 잘 싸우고 계십니다. 믿어주세요!","Kijk eens wie er terug is, waar denk je aan? Ik weet dat het moeilijk is geweest, maar we waarderen allemaal je inspanningen, geloof me.","Se hvem som er tilbake. Hva har du på hjertet? Jeg vet at det har vært vanskelig, men vi setter pris på innsatsen din, tro meg.","Patrzcie, kto wrócił, co wam chodzi po głowie? Wiem, że było ciężko, ale wszyscy doceniamy twoje wysiłki, uwierz mi.","Olha só quem voltou. Como vai? Eu sei que tem sido difícil, mas todos nós agradecemos pelos seus esforços, vai por mim.",,"Uite cine s-a întors? La ce te gândești? Știu că a fost greu, dar toți îți apreciem eforturile, crede-mă.","Посмотрите-ка, кто вернулся. Что у тебя стряслось? Я знаю, твои задания сложны, но, поверь, мы все ценим твои усилия.",,"Titta vem som är tillbaka, vad tänker du på? Jag vet att det har varit svårt, men alla uppskattar dina ansträngningar, tro mig.","Bak kim gelmiş, aklında ne var? Zor olduğunu biliyorum ama hepimiz çabalarını takdir ediyoruz, inan bana." -I've run out of bullets.,TXT_RPLY0_SCRIPT10_D34868_IVERU,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Mir ist die Munition ausgegangen.,,Mi eluzis la kuglojn.,Me he quedado sin balas.,Me quedé sin balas.,Minulta on luodit loppu.,Je suis à court de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾が無くなった。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Fiquei sem munição.,,Am rămas fără gloanțe.,Мне нужны патроны.,,Jag har slut på kulor.,Mermim bitti. -"What else is new, here you go.",TXT_RYES0_SCRIPT10_D34868_WHATE,〃 (〃),,,Něco jiného nového? Tady máš.,"Hvad er der ellers nyt, værsgo.",Kennen wir das nicht? Hier hast du welche.,,Nenio nova. Jen.,Qué novedad. Toma.,,Olipas uutinen; kas tässä.,"Rien de nouveau, voilà pour vous.","Már meg sem lepődök, parancsolj.","Nulla di nuovo sotto il sole, ecco qua.",新しい試みですか、どうぞ。,여기 탄약. 그리고 더 필요한게?,"Wat is er nog meer nieuw, alsjeblieft.",Vær så god.,"Co jeszcze jest nowe, proszę bardzo.",Que novidade. Aqui está.,,"Ce mai e nou, iată.","Знаю, знаю. Вот, держи!",,"Vad mer är nytt, här har du.","Başka yeni ne var, al bakalım." +I've run out of bullets.,TXT_RPLY0_SCRIPT10_D34868_IVERU,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Mir ist die Munition ausgegangen.,,Mi eluzis la kuglojn.,Me he quedado sin balas.,Me quedé sin balas.,Minulta on luodit loppu.,Je suis à court de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾が無くなった。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Fiquei sem munição.,,Am rămas fără gloanțe.,Мне нужны патроны.,,Jag har slut på kulor.,Mermim bitti. +"What else is new, here you go.",TXT_RYES0_SCRIPT10_D34868_WHATE,〃 (〃),,,Něco jiného nového? Tady máš.,"Hvad er der ellers nyt, værsgo.",Kennen wir das nicht? Hier hast du welche.,,Nenio nova. Jen.,Qué novedad. Toma.,,Olipas uutinen; kas tässä.,"Rien de nouveau, voilà pour vous.",,"Már meg sem lepődök, parancsolj.","Nulla di nuovo sotto il sole, ecco qua.",新しい試みですか、どうぞ。,여기 탄약. 그리고 더 필요한게?,"Wat is er nog meer nieuw, alsjeblieft.",Vær så god.,"Co jeszcze jest nowe, proszę bardzo.",Que novidade. Aqui está.,,"Ce mai e nou, iată.","Знаю, знаю. Вот, держи!",,"Vad mer är nytt, här har du.","Başka yeni ne var, al bakalım." You have more than I can give you.,TXT_RNO0_SCRIPT10_D34868_YOUHA,〃 (〃),,,"Máš víc, než kolik ti můžu dát.","Du har mere, end jeg kan give dig.","Du hast mehr, als ich dir geben könnte.",,"Vi havas pli ol tiom, kiom mi povas doni.","Tienes más de -las que podría darte.",,Sinulla on enemmän kuin voin antaa.,Vous avez plus que je ne suis autorisé à vous donner.,"Több van nálad, mint amennyit tudnék adni.",Ne hai più di quante te ne possa dare.,今渡せる以上に持ってますよ。,내가 줄 수 있는 탄약의 양보다 큰데?,Je hebt meer dan ik je kan geven.,Du har mer enn jeg kan gi deg.,Masz więcej niż mogę ci dać.,Você tem o suficiente.,,Ai mai multe decât ți-aș putea oferi.,"Да у тебя их больше, чем на нашем складе.",,Du har mer än vad jag kan ge dig.,Sana verebileceğimden daha fazlasına sahipsin. -Teach me what you can.,TXT_RPLY1_SCRIPT10_D34868_TEACH,〃 (〃),,,"Uč mě, co můžeš.","Lær mig, hvad du kan.",Zeig mir was du weißt.,,Instruu ion ajn al mi.,Enséñame lo que puedas.,,"Opeta minulle, mitä voit.",Enseignez-moi ce que vous pouvez.,Tanítsd meg amit tudsz.,Potresti insegnarmi ciò che puoi.,可能な限り教えてくれ。,가르칠 수 있는 걸 가르쳐주세요.,Leer me wat je kunt.,Lær meg det du kan.,"Naucz mnie tego, co potrafisz.",O que você pode me ensinar?,,Învață-mă ce poți.,"Научи меня, чему можешь.",,Lär mig vad du kan.,Bana öğretebileceğin kadarını öğret. +las que podría darte.",,Sinulla on enemmän kuin voin antaa.,Vous avez plus que je ne suis autorisé à vous donner.,,"Több van nálad, mint amennyit tudnék adni.",Ne hai più di quante te ne possa dare.,今渡せる以上に持ってますよ。,내가 줄 수 있는 탄약의 양보다 큰데?,Je hebt meer dan ik je kan geven.,Du har mer enn jeg kan gi deg.,Masz więcej niż mogę ci dać.,Você tem o suficiente.,,Ai mai multe decât ți-aș putea oferi.,"Да у тебя их больше, чем на нашем складе.",,Du har mer än vad jag kan ge dig.,Sana verebileceğimden daha fazlasına sahipsin. +Teach me what you can.,TXT_RPLY1_SCRIPT10_D34868_TEACH,〃 (〃),,,"Uč mě, co můžeš.","Lær mig, hvad du kan.",Zeig mir was du weißt.,,Instruu ion ajn al mi.,Enséñame lo que puedas.,,"Opeta minulle, mitä voit.",Enseignez-moi ce que vous pouvez.,,Tanítsd meg amit tudsz.,Potresti insegnarmi ciò che puoi.,可能な限り教えてくれ。,가르칠 수 있는 걸 가르쳐주세요.,Leer me wat je kunt.,Lær meg det du kan.,"Naucz mnie tego, co potrafisz.",O que você pode me ensinar?,,Învață-mă ce poți.,"Научи меня, чему можешь.",,Lär mig vad du kan.,Bana öğretebileceğin kadarını öğret. "All right, here's some pointers.",TXT_RYES1_SCRIPT10_D34868_ALLRI,〃 (〃),,,"Dobře, tady je pár tipů.","Okay, her er nogle tips.","Ok, ich erklär dir ein paar Tricks.",,"Bone, jen kelkaj konsiloj...","Muy bien, ahí van -unos consejos...",,"Hyvä on, tässä muutama vinkki.",Voilà deux ou trois trucs.,"Rendben, itt van pár tanács.","Va bene, ecco qualche dritta.",わかりました、貴方に幾つかやり方を教ましょう。,알겠습니다. 여기 과녁을 보여주지.,"Oké, hier zijn wat aanwijzingen.","Greit, her har du noen tips.","W porządku, oto kilka wskazówek.","Tá legal, aqui vai algumas dicas.",,"În regulă, uite niște repere.",Ну хорошо. Вот пара советов.,,"Okej, här är några tips.","Pekala, işte birkaç ipucu." -Not right now.,TXT_RNO1_SCRIPT10_D34868_NOTRI,〃 (〃),,,Zrovna teď ne.,Ikke lige nu.,Nicht jetzt.,,Ne nun.,Ahora no.,,Ei juuri nyt.,Pas maintenant.,Most nem érek rá.,Non adesso.,今はまだです。,지금은 안 돼요.,Niet op dit moment.,Ikke akkurat nå.,Nie teraz.,Agora não.,,Nu chiar acum.,Не сейчас.,,Inte just nu.,Şimdi olmaz. -What is it you need? I hope that you're giving the Order a taste of the kind of pain that we have been feeling for years.,TXT_DLG_SCRIPT10_D36384_WHATI,〃 (five trainings),,,"Copak potřebuješ? Doufám, že oplácíš Řádu to, co nám celé ty roky dělali.","Hvad er det, du har brug for? Jeg håber, at du giver Ordenen en smagsprøve på den slags smerte, som vi har følt i årevis.","Was brauchst du? Ich hoffe, du gibst dem Orden etwas von dem Schmerz zurück, den sie und allen haben zukommen lassen.",,"Kion vi bezonas? Mi esperas, ke vi redonas al La Ordeno tian doloron, kian ni suferis dum jaroj.",¿Qué necesitas? Espero que le estés devolviendo a La Orden parte del dolor que hemos estado sufriendo durante años.,,"Mitä tarvitset? Toivottavasti annat Veljeskunnan maistaa sitä tuskaa, jota me olemme tunteneet vuosia.",De quoi avez-vous besoin? J'espère que vous donnez à l'Ordre une idée de la douleur que nous avons ressenti pendant des années.,"Miben segíthetek? Remélem megízlettetted a Rendet ugyanazzal a fájdalommal, amit mi éreztünk eddig.",Di che cosa hai bisogno? Spero che tu stia dando all'Ordine un assaggio del tipo di dolore che noi abbiamo tollerato per anni.,"必要な物は何ですか?私達が何年も前から感じた +unos consejos...",,"Hyvä on, tässä muutama vinkki.",Voilà deux ou trois trucs.,,"Rendben, itt van pár tanács.","Va bene, ecco qualche dritta.",わかりました、貴方に幾つかやり方を教ましょう。,알겠습니다. 여기 과녁을 보여주지.,"Oké, hier zijn wat aanwijzingen.","Greit, her har du noen tips.","W porządku, oto kilka wskazówek.","Tá legal, aqui vai algumas dicas.",,"În regulă, uite niște repere.",Ну хорошо. Вот пара советов.,,"Okej, här är några tips.","Pekala, işte birkaç ipucu." +Not right now.,TXT_RNO1_SCRIPT10_D34868_NOTRI,〃 (〃),,,Zrovna teď ne.,Ikke lige nu.,Nicht jetzt.,,Ne nun.,Ahora no.,,Ei juuri nyt.,Pas maintenant.,,Most nem érek rá.,Non adesso.,今はまだです。,지금은 안 돼요.,Niet op dit moment.,Ikke akkurat nå.,Nie teraz.,Agora não.,,Nu chiar acum.,Не сейчас.,,Inte just nu.,Şimdi olmaz. +What is it you need? I hope that you're giving the Order a taste of the kind of pain that we have been feeling for years.,TXT_DLG_SCRIPT10_D36384_WHATI,〃 (five trainings),,,"Copak potřebuješ? Doufám, že oplácíš Řádu to, co nám celé ty roky dělali.","Hvad er det, du har brug for? Jeg håber, at du giver Ordenen en smagsprøve på den slags smerte, som vi har følt i årevis.","Was brauchst du? Ich hoffe, du gibst dem Orden etwas von dem Schmerz zurück, den sie und allen haben zukommen lassen.",,"Kion vi bezonas? Mi esperas, ke vi redonas al La Ordeno tian doloron, kian ni suferis dum jaroj.",¿Qué necesitas? Espero que le estés devolviendo a La Orden parte del dolor que hemos estado sufriendo durante años.,,"Mitä tarvitset? Toivottavasti annat Veljeskunnan maistaa sitä tuskaa, jota me olemme tunteneet vuosia.",De quoi avez-vous besoin? J'espère que vous donnez à l'Ordre une idée de la douleur que nous avons ressenti pendant des années.,,"Miben segíthetek? Remélem megízlettetted a Rendet ugyanazzal a fájdalommal, amit mi éreztünk eddig.",Di che cosa hai bisogno? Spero che tu stia dando all'Ordine un assaggio del tipo di dolore che noi abbiamo tollerato per anni.,"必要な物は何ですか?私達が何年も前から感じた 多くの苦痛の味をオーダーに与えることを 願っています。",필요한 게 있습니까? 수 년 동안 고통을 안겨 온 오더 놈들에게 복수를 해줬으면 하는 바입니다. 끝날 때까지!,Wat heb je nodig? Ik hoop dat je de Orde een voorproefje geeft van het soort pijn dat we al jaren voelen.,Hva er det du trenger? Jeg håper du gir Ordenen en forsmak på den smerten vi har følt i årevis.,"Czego potrzebujesz? Mam nadzieję, że dajesz Zakonowi przedsmak bólu, który odczuwamy od lat.",O que está precisando? Espero que você esteja fazendo a Ordem sentir um pouco do sofrimento que nós estivemos passando por anos.,,De ce ai nevoie? Sper că îi dai Ordinului aceeași durere pe care și el ne-a oferit-o în toți acești ani.,"Что тебе нужно? Надеюсь, ты даёшь Ордену почувствовать ту боль, что мы терпели годами.",,Vad är det du behöver? Jag hoppas att du ger Orden en smak av den typ av smärta som vi har känt i åratal.,Neye ihtiyacın var? Umarım Tarikat'a yıllardır hissettiğimiz acıyı tattırıyorsundur. -Some ammo.,TXT_RPLY0_SCRIPT10_D36384_SOMEA,〃 (〃),,,Nějakou munici.,Lidt ammunition.,Etwas Munition.,,Iom da municio.,Algo de munición.,,Vähän ammuksia.,Des munitions.,Valamennyi lőszer.,Un poco di munizioni.,弾を幾つか。,탄약 좀...,Wat munitie.,Litt ammunisjon.,Trochę amunicji.,Um pouco de munição.,,Niște muniție.,Боеприпасы.,,Lite ammunition.,Biraz cephane. -"There you go, don't waste it.",TXT_RYES0_SCRIPT10_D36384_THERE,〃 (〃),,,"Tady máš, neplýtvej s ní.","Værsgo, lad være med at spilde den.",Hier hast du welche. Verschwende sie nicht.,,Jen. Ne malŝparu ĝin.,"Toma, no las desperdicies.",,"Ole hyvä, älä tuhlaa niitä.",Voilà pour vous. Ne les gaspillez pas.,"Parancsolj, ne pazarold el.","Ecco delle munizioni, non sprecarle.",はいどうぞ、無駄にしないように。,전장을 자주 누비나 보군요. 여기 탄약!,"Daar ga je, verspil het niet.","Vær så god, ikke sløs den bort.","Proszę bardzo, nie marnuj jej.",Aqui está. Não desperdice.,,"Iată, n-o risipi.",Вот. Не трать их попусту.,,"Varsågod, slösa inte bort den.","Al bakalım, boşa harcama." -You've got enough ammo.,TXT_RNO0_SCRIPT10_D36384_YOUVE,〃 (〃),,,Máš jí dost.,Du har nok ammunition.,Du hast genug Munition.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,Van elég lőszered.,Ne hai a sufficienza.,弾は十分に見えます。,당신의 남은 탄약이 눈에 보이는군요. 줄 수 없습니다!,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você tem munição suficiente.,,Ai destulă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. -Teach me.,TXT_RPLY1_SCRIPT10_D36384_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +Some ammo.,TXT_RPLY0_SCRIPT10_D36384_SOMEA,〃 (〃),,,Nějakou munici.,Lidt ammunition.,Etwas Munition.,,Iom da municio.,Algo de munición.,,Vähän ammuksia.,Des munitions.,,Valamennyi lőszer.,Un poco di munizioni.,弾を幾つか。,탄약 좀...,Wat munitie.,Litt ammunisjon.,Trochę amunicji.,Um pouco de munição.,,Niște muniție.,Боеприпасы.,,Lite ammunition.,Biraz cephane. +"There you go, don't waste it.",TXT_RYES0_SCRIPT10_D36384_THERE,〃 (〃),,,"Tady máš, neplýtvej s ní.","Værsgo, lad være med at spilde den.",Hier hast du welche. Verschwende sie nicht.,,Jen. Ne malŝparu ĝin.,"Toma, no las desperdicies.",,"Ole hyvä, älä tuhlaa niitä.",Voilà pour vous. Ne les gaspillez pas.,,"Parancsolj, ne pazarold el.","Ecco delle munizioni, non sprecarle.",はいどうぞ、無駄にしないように。,전장을 자주 누비나 보군요. 여기 탄약!,"Daar ga je, verspil het niet.","Vær så god, ikke sløs den bort.","Proszę bardzo, nie marnuj jej.",Aqui está. Não desperdice.,,"Iată, n-o risipi.",Вот. Не трать их попусту.,,"Varsågod, slösa inte bort den.","Al bakalım, boşa harcama." +You've got enough ammo.,TXT_RNO0_SCRIPT10_D36384_YOUVE,〃 (〃),,,Máš jí dost.,Du har nok ammunition.,Du hast genug Munition.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,,Van elég lőszered.,Ne hai a sufficienza.,弾は十分に見えます。,당신의 남은 탄약이 눈에 보이는군요. 줄 수 없습니다!,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você tem munição suficiente.,,Ai destulă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. +Teach me.,TXT_RPLY1_SCRIPT10_D36384_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. A few more lessons and you'll know all that I can teach.,TXT_RYES1_SCRIPT10_D36384_AFEWM,〃 (〃),,,"Pár dalších lekcí a budeš vědět všechno, co vím.","Et par lektioner mere, og du vil vide alt, hvad jeg kan lære dig.","Ein paar mehr Lektionen, und du weißt alles, was ich weiß.",,"Ankoraŭ unu leciono kaj vi lernis ĉion, kion mi scias.","Una lección más y sabrás todo lo que sé.","Una lección más y -vas a saber todo lo que sé.","Enää vain muutama oppitunti ja tiedät kaiken, mitä voin opettaa.",Quelque leçons en plus et vous saurez tout ce que je peux vous enseigner.,"Még pár lecke, és mindent tudni fogsz amit Én.",Tra un paio di lezioni saprai tutto quello che conosco.,もう少しで私の教えられる事が全てわかるはずです。,제가 가르칠 만한 훈련을 배우면 좀 똑똑해질 겁니다.,Nog een paar lessen en je weet alles wat ik je kan leren.,"Et par leksjoner til, så vet du alt jeg kan lære deg.","Jeszcze kilka lekcji i będziesz wiedział wszystko, czego mogę nauczyć.",Mais algumas aulas e você já saberá tudo o que consigo ensinar.,,"Câteva lecții, și vei știi tot ce știu si eu.","Ещё немного, и ты будешь знать всё, что знаю я.",,Några lektioner till och du kommer att veta allt jag kan lära dig.,Birkaç ders daha ve öğretebileceğim her şeyi öğreneceksin. +vas a saber todo lo que sé.","Enää vain muutama oppitunti ja tiedät kaiken, mitä voin opettaa.",Quelque leçons en plus et vous saurez tout ce que je peux vous enseigner.,,"Még pár lecke, és mindent tudni fogsz amit Én.",Tra un paio di lezioni saprai tutto quello che conosco.,もう少しで私の教えられる事が全てわかるはずです。,제가 가르칠 만한 훈련을 배우면 좀 똑똑해질 겁니다.,Nog een paar lessen en je weet alles wat ik je kan leren.,"Et par leksjoner til, så vet du alt jeg kan lære deg.","Jeszcze kilka lekcji i będziesz wiedział wszystko, czego mogę nauczyć.",Mais algumas aulas e você já saberá tudo o que consigo ensinar.,,"Câteva lecții, și vei știi tot ce știu si eu.","Ещё немного, и ты будешь знать всё, что знаю я.",,Några lektioner till och du kommer att veta allt jag kan lära dig.,Birkaç ders daha ve öğretebileceğim her şeyi öğreneceksin. You're not ready yet.,TXT_RNO1_SCRIPT10_D36384_YOURE,〃 (〃),,,Ještě nejsi připraven.,Du er ikke klar endnu.,Du bist noch nicht soweit.,,"Vi ankoraŭ -ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,훈련받기엔 가깝지만서도... 먼 것 같습니다.,Je bent er nog niet klaar voor.,Du er ikke klar ennå.,Nie jesteś jeszcze gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. -"I can't believe that we're still around, you and I. There's just too many of us that have passed since the beginning. What can I do for you friend?",TXT_DLG_SCRIPT10_D37900_ICANT,〃 (six trainings),,,"Nemůžu uvěřit, že tu my dva stále ještě jsme. Hrozně moc z nás za tu dobu zahynulo. Co pro tebe mohu udělat, příteli?","Jeg kan ikke tro, at vi stadig er her, du og jeg. Der er bare for mange af os, der er gået siden begyndelsen. Hvad kan jeg gøre for dig, min ven?","Ich kann kaum glauben, dass wir immer noch da sind, du und ich. Es sind so viele, die uns verlassen haben, seit alles anfing. Was kann ich für dich tun, Freund?",,"Estas nekredeble, ke vi kaj ni estas ankoraŭ vivaj. Ni perdis tiom multe da homoj de kiam ĉio ekis... Kion mi povas fari por vi, amiko?","No puedo creer que sigamos aquí tú y yo. Hemos perdidos a tantos desde que todo empezó... ¿Qué puedo hacer por ti, amigo?",,"En voi uskoa, että olemme vielä kuvioissa, sinä ja minä. Aivan liian moni on poistunut keskuudestamme sitten, kun kaikki tämä alkoi. Miten voin olla avuksi, ystäväni?","J'arrive pas a croire que vous êtes toujours avec nous. Tellement de nos camarades ont disparu depuis que tout a commencé. Que puis-je faire pour vous, mon ami?","Nem hiszem el, hogy eddig túléltük ezt. Sokan vesztették életüket a kezdetek óta. Mit tehetek érted barátom?","Non posso credere che siamo ancora vivi, tu e io. Ce ne sono così tanti che sono morti da quando è iniziata questa faccenda. Che cosa posso fare per te, amico?","私達はまだ貴方の護衛をし続けられるとは +ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,,Nem állsz még készen.,Non sei ancora pronto.,貴方の準備がまだ整ってないように思えます。,훈련받기엔 가깝지만서도... 먼 것 같습니다.,Je bent er nog niet klaar voor.,Du er ikke klar ennå.,Nie jesteś jeszcze gotowy.,Você ainda não está preparado.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. +"I can't believe that we're still around, you and I. There's just too many of us that have passed since the beginning. What can I do for you friend?",TXT_DLG_SCRIPT10_D37900_ICANT,〃 (six trainings),,,"Nemůžu uvěřit, že tu my dva stále ještě jsme. Hrozně moc z nás za tu dobu zahynulo. Co pro tebe mohu udělat, příteli?","Jeg kan ikke tro, at vi stadig er her, du og jeg. Der er bare for mange af os, der er gået siden begyndelsen. Hvad kan jeg gøre for dig, min ven?","Ich kann kaum glauben, dass wir immer noch da sind, du und ich. Es sind so viele, die uns verlassen haben, seit alles anfing. Was kann ich für dich tun, Freund?",,"Estas nekredeble, ke vi kaj ni estas ankoraŭ vivaj. Ni perdis tiom multe da homoj de kiam ĉio ekis... Kion mi povas fari por vi, amiko?","No puedo creer que sigamos aquí tú y yo. Hemos perdidos a tantos desde que todo empezó... ¿Qué puedo hacer por ti, amigo?",,"En voi uskoa, että olemme vielä kuvioissa, sinä ja minä. Aivan liian moni on poistunut keskuudestamme sitten, kun kaikki tämä alkoi. Miten voin olla avuksi, ystäväni?","J'arrive pas a croire que vous êtes toujours avec nous. Tellement de nos camarades ont disparu depuis que tout a commencé. Que puis-je faire pour vous, mon ami?",,"Nem hiszem el, hogy eddig túléltük ezt. Sokan vesztették életüket a kezdetek óta. Mit tehetek érted barátom?","Non posso credere che siamo ancora vivi, tu e io. Ce ne sono così tanti che sono morti da quando è iniziata questa faccenda. Che cosa posso fare per te, amico?","私達はまだ貴方の護衛をし続けられるとは 思えません。昔からの仲間は殆ど去って しまいました。貴方の友人の為に 何がしてあげられますか?",아직도 살아 숨 쉬고 있다니 믿기지 않네요... 당신이 싸우고 생존하는 동안 살아 돌아온 병사들은 그렇게 많지 않아요. 원하는 게 있습니까?,"Ik kan niet geloven dat we er nog steeds zijn, jij en ik. Er zijn er gewoon te veel van ons die sinds het begin zijn overleden. Wat kan ik voor je doen, vriend?","Jeg kan ikke tro at vi fortsatt er her, du og jeg. Det er for mange av oss som har gått bort siden begynnelsen. Hva kan jeg gjøre for deg, min venn?","Nie mogę uwierzyć, że jeszcze żyjemy, ty i ja. Zbyt wielu z nas przeszło od początku. Co mogę dla ciebie zrobić, przyjacielu?","Mal consigo acreditar que ainda estamos vivos, você e eu. Perdemos muitos companheiros desde o início. O que posso fazer por você, meu amigo?",,"Nu-mi vine că cred că încă mai rezistăm, tu și eu. Sunt prea mulți cei care au murit de la început. Ce pot face pentru tine, prietene?","Не могу поверить, что мы всё ещё живы, ты и я. За всё это время уже стольких из нас не стало. Что я могу сделать для тебя, дружище?",,"Jag kan inte tro att vi fortfarande finns kvar, du och jag. Det är bara för många av oss som har passerat sedan början. Vad kan jag göra för dig, min vän?","Hala buralarda olduğumuza inanamıyorum, sen ve ben. Başlangıçtan bu yana çok fazla insan geçti. Senin için ne yapabilirim dostum?" -I'm out of bullets.,TXT_RPLY0_SCRIPT10_D37900_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on luodit loppu.,Je suis à court de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się kule.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. +I'm out of bullets.,TXT_RPLY0_SCRIPT10_D37900_IMOUT,〃 (〃),,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on luodit loppu.,Je suis à court de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się kule.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. "Here, use them to keep you in good health.",TXT_RYES0_SCRIPT10_D37900_HEREU,"〃 (〃) (in good health = enjoy)",,,"Tady, používej je, abys zůstal ve zdraví.","Her, brug dem til at holde dig sund og rask.","Hier, benutze sie um gesund zu bleiben,",,"Jen iom da municio. Ŝancon kaj ĝuu ĝin.","Aquí tienes algo de munición. -Suerte y disfrútala.",,"Tässä, pidä niillä itsesi terveenä.","Voilà, gardez vous en bonne santé.","Parancsolj, használd őket az egészséged érdekében.","Ecco qua, usale per tenerti in buona salute.",どうぞ、これで体の調子を保って下さい。,건강하고 집중됬을 때 소모하시길.,"Hier, gebruik ze om je in goede gezondheid te houden.","Her, bruk dem til å holde deg ved god helse.","Użyj ich, by utrzymać cię w dobrym zdrowiu.",Pode pegar. Use essa munição para se manter saudável.,,"Aici, folosește-le ca să te menții în formă.","Вот. Используй их, чтобы сохранить себя.",,"Här, använd dem för att hålla dig vid god hälsa.","Al, onları sağlığını korumak için kullan." -You have enough.,TXT_RNO0_SCRIPT10_D37900_YOUHA,〃 (〃),,,Máš jich dost.,Du har nok.,Du hast genug.,,Vi havas sufiĉe.,Tienes suficientes.,,Sinulla on tarpeeksi.,Vous en avez assez.,Van elég.,Ne hai a sufficienza.,十分に持っています。,충분히 있으면 더 안 줘요.,Je hebt genoeg.,Du har nok.,Masz wystarczająco dużo.,Você tem o suficiente.,,Ai destule.,Тебе хватает.,,Du har tillräckligt.,Sende yeterince var. -Teach me.,TXT_RPLY1_SCRIPT10_D37900_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +Suerte y disfrútala.",,"Tässä, pidä niillä itsesi terveenä.","Voilà, gardez vous en bonne santé.",,"Parancsolj, használd őket az egészséged érdekében.","Ecco qua, usale per tenerti in buona salute.",どうぞ、これで体の調子を保って下さい。,건강하고 집중됬을 때 소모하시길.,"Hier, gebruik ze om je in goede gezondheid te houden.","Her, bruk dem til å holde deg ved god helse.","Użyj ich, by utrzymać cię w dobrym zdrowiu.",Pode pegar. Use essa munição para se manter saudável.,,"Aici, folosește-le ca să te menții în formă.","Вот. Используй их, чтобы сохранить себя.",,"Här, använd dem för att hålla dig vid god hälsa.","Al, onları sağlığını korumak için kullan." +You have enough.,TXT_RNO0_SCRIPT10_D37900_YOUHA,〃 (〃),,,Máš jich dost.,Du har nok.,Du hast genug.,,Vi havas sufiĉe.,Tienes suficientes.,,Sinulla on tarpeeksi.,Vous en avez assez.,,Van elég.,Ne hai a sufficienza.,十分に持っています。,충분히 있으면 더 안 줘요.,Je hebt genoeg.,Du har nok.,Masz wystarczająco dużo.,Você tem o suficiente.,,Ai destule.,Тебе хватает.,,Du har tillräckligt.,Sende yeterince var. +Teach me.,TXT_RPLY1_SCRIPT10_D37900_TEACH,〃 (〃),,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Mutasd meg.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. "Well, that's it, you're done. I can teach no more.",TXT_RYES1_SCRIPT10_D37900_WELLT,〃 (〃),,,"Tak, a je to, jsme hotovi. Víc tě naučit nemůžu.","Nå, det var det, du er færdig. Jeg kan ikke undervise mere.","So, das war's. Ich kann dir nicht mehr beibringen.",,"Nu, jen ĉio, vi estas preta. Mi havas nenion alian por instrui.","Bueno, eso es todo, estás listo. -No tengo más que enseñar.",,"No, se oli siinä, olet valmis. Minulla ei ole sinulle enää opetettavaa.","Eh bien, voilà. Vous savez tout. Je n'ai rien de plus pour vous!","Elérkeztünk oda, hogy nem tudok többet tanítani neked.","Beh, ecco fatto, oramai hai concluso. Non c'è null'altro che ti possa insegnare.",これで全てです。これ以上は教える事がありません。,"흐음, 이게 다입니다. 훈련을 다 마쳤어요.","Nou, dat is het dan, je bent klaar. Ik kan geen les meer geven.","Vel, det var det, du er ferdig. Jeg kan ikke lære deg mer.","No cóż, to już koniec. Nie mogę więcej uczyć.","Bom, é isso. Você já sabe de tudo. Não consigo ensinar mais nada.",,"Asta e, gata, nu mai am ce să te învăț.","Что ж, это всё. Твоё обучение закончено. Больше я ничему не могу тебя научить.",,"Det var det, du är klar. Jag kan inte undervisa mer.","Pekala, bu kadar, işin bitti. Daha fazla öğretemem." +No tengo más que enseñar.",,"No, se oli siinä, olet valmis. Minulla ei ole sinulle enää opetettavaa.","Eh bien, voilà. Vous savez tout. Je n'ai rien de plus pour vous!",,"Elérkeztünk oda, hogy nem tudok többet tanítani neked.","Beh, ecco fatto, oramai hai concluso. Non c'è null'altro che ti possa insegnare.",これで全てです。これ以上は教える事がありません。,"흐음, 이게 다입니다. 훈련을 다 마쳤어요.","Nou, dat is het dan, je bent klaar. Ik kan geen les meer geven.","Vel, det var det, du er ferdig. Jeg kan ikke lære deg mer.","No cóż, to już koniec. Nie mogę więcej uczyć.","Bom, é isso. Você já sabe de tudo. Não consigo ensinar mais nada.",,"Asta e, gata, nu mai am ce să te învăț.","Что ж, это всё. Твоё обучение закончено. Больше я ничему не могу тебя научить.",,"Det var det, du är klar. Jag kan inte undervisa mer.","Pekala, bu kadar, işin bitti. Daha fazla öğretemem." Return after Macil tells you it's time.,TXT_RNO1_SCRIPT10_D37900_RETUR,〃 (〃),,,"Vrať se až ti Macil řekne, že je čas.","Vend tilbage, når Macil siger, at det er tid.","Komm wieder, wenn Macil sagt, dass es Zeit ist.",,"Revenu kiam Macil diros, ke vi estas preta.","Vuelve cuando Macil -diga que es la hora.",,"Palaa sitten, kun Macil kertoo sinulle ajan koittaneen.",Revenez quand Macil vous dit qu'il est temps.,"Ha Macil szól hogy idő van, akkor fordulj vissza.",Ritorna quando Macil dice che è arrivato il momento.,マシルに許可を貰わないとなりません。,사령관님의 말씀을 듣고 찾아와주시길.,Keer terug nadat Macil je vertelt dat het tijd is.,Kom tilbake når Macil sier det er på tide.,"Wróć, gdy Macil powie ci, że już czas.",Volte depois que Macil te disser que está na hora.,,Întoarce-te după ce Macil îți spune că e vremea.,"Возвращайся, когда скажет Мэйсил.",,Återvänd när Macil säger att det är dags.,Macil sana zamanın geldiğini söylediğinde geri dön. -"I've taught you everything I can right now. I've given you all that you should ever need, unless you're out of bullets. Those I can still help you with.",TXT_DLG_SCRIPT10_D39416_IVETA,〃 (seven trainings),,,"Naučil jsem tě vše, co teď můžu. Dal jsem ti vše, co bys měl potřebovat, ledaže by ti došly náboje. S těmi ti stále můžu pomoci.","Jeg har lært dig alt, hvad jeg kan lige nu. Jeg har givet dig alt, hvad du nogensinde skulle få brug for, medmindre du er løbet tør for kugler. Dem kan jeg stadig hjælpe dig med.","Ich habe dir alles beigebracht, was ich weiß. Das sollte alles sein, was du brauchen wirst, es sei denn, du brauchst wieder mal Munition. Damit kann ich dir jederzeit helfen.",,"Mi instruis ĉion, kion mi scias, kaj mi donis ĉion, kion vi povus bezoni, krom se vi ne plu havas municion: mi certe ankoraŭ povas helpi pri tio.","Te he enseñado todo lo que puedo y te he dado todo lo que podrías necesitar, a menos que te hayas quedado sin balas, claro: con eso sí te puedo seguir ayudando.","Ya te enseñé todo lo que puedo y te di todo lo que podrías necesitar, a menos que te hayas quedado sin balas, claro: con eso sí te puedo seguir ayudando.","Olen opettanut sinulle kaiken osaamani. Olen antanut sinulle kaiken, mitä ikinä voisit tarvita, ellei sinulta sitten ole luodit loppu. Niiden suhteen voin vielä olla avuksi.","Je vous ai enseigné tout ce que je sais, et tout ce qu'il vous faudra, sauf si n'avez plus de munitions.. Et je peux vous aider pour ça, aussi.","Megtanítottam neked mindent amire most képes vagyok. Mindent megadtam neked amire valaha szükséged lehet, kivétel persze ha kifogysz a golyókból. Azt még mindig tudok adni.","Ti ho insegnato tutto quello che conosco. Ti ho dato tutto ciò di cui avrai mai bisogno, a meno che non hai finito le munizioni. Con quelle ti posso ancora essere d'aiuto.","私が教えられる事はもうありません。 +diga que es la hora.",,"Palaa sitten, kun Macil kertoo sinulle ajan koittaneen.",Revenez quand Macil vous dit qu'il est temps.,,"Ha Macil szól hogy idő van, akkor fordulj vissza.",Ritorna quando Macil dice che è arrivato il momento.,マシルに許可を貰わないとなりません。,사령관님의 말씀을 듣고 찾아와주시길.,Keer terug nadat Macil je vertelt dat het tijd is.,Kom tilbake når Macil sier det er på tide.,"Wróć, gdy Macil powie ci, że już czas.",Volte depois que Macil te disser que está na hora.,,Întoarce-te după ce Macil îți spune că e vremea.,"Возвращайся, когда скажет Мэйсил.",,Återvänd när Macil säger att det är dags.,Macil sana zamanın geldiğini söylediğinde geri dön. +"I've taught you everything I can right now. I've given you all that you should ever need, unless you're out of bullets. Those I can still help you with.",TXT_DLG_SCRIPT10_D39416_IVETA,〃 (seven trainings),,,"Naučil jsem tě vše, co teď můžu. Dal jsem ti vše, co bys měl potřebovat, ledaže by ti došly náboje. S těmi ti stále můžu pomoci.","Jeg har lært dig alt, hvad jeg kan lige nu. Jeg har givet dig alt, hvad du nogensinde skulle få brug for, medmindre du er løbet tør for kugler. Dem kan jeg stadig hjælpe dig med.","Ich habe dir alles beigebracht, was ich weiß. Das sollte alles sein, was du brauchen wirst, es sei denn, du brauchst wieder mal Munition. Damit kann ich dir jederzeit helfen.",,"Mi instruis ĉion, kion mi scias, kaj mi donis ĉion, kion vi povus bezoni, krom se vi ne plu havas municion: mi certe ankoraŭ povas helpi pri tio.","Te he enseñado todo lo que puedo y te he dado todo lo que podrías necesitar, a menos que te hayas quedado sin balas, claro: con eso sí te puedo seguir ayudando.","Ya te enseñé todo lo que puedo y te di todo lo que podrías necesitar, a menos que te hayas quedado sin balas, claro: con eso sí te puedo seguir ayudando.","Olen opettanut sinulle kaiken osaamani. Olen antanut sinulle kaiken, mitä ikinä voisit tarvita, ellei sinulta sitten ole luodit loppu. Niiden suhteen voin vielä olla avuksi.","Je vous ai enseigné tout ce que je sais, et tout ce qu'il vous faudra, sauf si n'avez plus de munitions.. Et je peux vous aider pour ça, aussi.",,"Megtanítottam neked mindent amire most képes vagyok. Mindent megadtam neked amire valaha szükséged lehet, kivétel persze ha kifogysz a golyókból. Azt még mindig tudok adni.","Ti ho insegnato tutto quello che conosco. Ti ho dato tutto ciò di cui avrai mai bisogno, a meno che non hai finito le munizioni. Con quelle ti posso ancora essere d'aiuto.","私が教えられる事はもうありません。 今後新しい武器は時間が掛かるが自分のペースで 学びなさい。弾切れでなければの話ですが。",모든 훈련을 배우고 마치셨잖아요. 당신이 알아둬야 할 건 그게 전부입니다. 그 외에는 탄약이 필요하신가요?,"Ik heb je nu alles geleerd wat ik kan. Ik heb je alles gegeven wat je ooit nodig zou moeten hebben, tenzij je geen kogels meer hebt. Degenen waarmee ik je nog steeds kan helpen.","Jeg har lært deg alt jeg kan akkurat nå. Jeg har gitt deg alt du trenger, med mindre du er tom for kuler. De kan jeg fortsatt hjelpe deg med.","Nauczyłem cię wszystkiego, co mogę teraz. Dałem ci wszystko, co powinno ci być potrzebne, chyba że zabraknie ci naboi. Z tymi mogę ci jeszcze pomóc.","Eu te ensinei tudo o que eu consigo neste momento. Já te passei tudo o que você pode precisar, a não ser que esteja sem munição. Ainda posso te ajudar com isso.",,"Te-am învățat tot ce știu pentru moment. Ți-am dat tot ceea ce ai putea avea avea nevoie vreodată, decât dacă nu ai rămas cumva fără gloanțe. Cu astea te pot ajuta încă.","Я обучил тебя всему, что умею сам. Всему, что тебе может когда-нибудь пригодиться. Больше я ничем не могу тебе помочь... если, конечно, у тебя патроны не кончились.",,"Jag har lärt dig allt jag kan just nu. Jag har gett dig allt du någonsin skulle behöva, om du inte har slut på kulor. De kan jag fortfarande hjälpa dig med.",Şu anda sana öğretebileceğim her şeyi öğrettim. Mermin bitmediği sürece ihtiyacın olan her şeyi verdim. Onlar için sana hala yardım edebilirim. -Yes I am.,TXT_RPLY0_SCRIPT10_D39416_YESIA,〃 (〃),,,"Ano, došly.","Ja, det er jeg.","Ja, bin ich.",,Vi trafis.,Has acertado.,Acertaste.,Kyllä on.,"Oui, j'en ai besoin.",Igen.,"Sì, ho bisogno di munizioni.",ああ、そうだ。,알겠습니다. 그럼 탄약이라도?,"Ja, dat ben ik wel.","Ja, det er jeg.","Tak, jestem.",Estou mesmo.,,Da sunt.,"Да, кончились.",,"Ja, det gör jag.","Evet, ediyorum." -Here you go. ,TXT_RYES0_SCRIPT10_D39416_HEREY,〃 (〃),,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,Parancsolj.,Ecco a te.,どうぞ。,탄약 대령이요!,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Iată.,Держи.,,Här har du.,Al bakalım. -"Check out what's new, the teleporter beacon. When you use the beacon, we'll track the signal and send help. Is there something I can get you?",TXT_DLG_SCRIPT10_D40932_CHECK,MAP10: Justin.,,,"Podívej se na tohle, teleportační maják. Když ho použiješ, vystopujeme jeho signál a pošleme pomoc. Co ti můžu nabídnout?","Se det nye, teleporterfyret. Når du bruger fyret, sporer vi signalet og sender hjælp. Er der noget, jeg kan skaffe dig?","Sieh mal, was ich Neues habe, das Teleportersignal. Wenn du es benutzt können wir das Signal anpeilen und dir Hilfe schicken. Gibt es sonst was, was ich tun kann?",,"Kia novaĵo: la teleportil-signalilo. Post kiam vi uzos ĝin, ni spuros la signalon kaj sendos helpotrupojn. Ĉu estas io, kion mi donu al vi?","Mira qué novedad: la baliza de teletransporte. Cuando la uses, rastrearemos la señal y enviaremos refuerzos. ¿Hay algo que pueda ofrecerte?","Mira qué novedad: la baliza de teletransporte. Cuando la uses, vamos a rastrear la señal y a mandarte refuerzos. ¿Hay algo que pueda ofrecerte?","Vilkaisepa tätä uutta kaukosiirrinmajakkaa. Kun käytät majakkaa, jäljitämme signaalin ja lähetämme apua. Saisiko sinulle olla jotain?","Regardez ce qu'on vient de sortir: L'antenne de téléporteur. Quand vous l'utilisez, on traque le signal et on envoie des renforts. Que puis-je faire pour vous?","Nézdd csak mit újítottunk be, egy teleport követőt. Amikor aktiválod, behatároljuk a jelet és kiküldjük a segítséget. Segítségedre lehetek még valamiben?","Guarda un po' questo nuovo aggeggio, il radiofaro per teletrasporto. Quando lo usi, identificheremo il tuo segnale e mandaremo rinforzi. C'è qualcosa che ti posso dare?","何を見つけたと思う、テレポータービーコンだ。 +Yes I am.,TXT_RPLY0_SCRIPT10_D39416_YESIA,〃 (〃),,,"Ano, došly.","Ja, det er jeg.","Ja, bin ich.",,Vi trafis.,Has acertado.,Acertaste.,Kyllä on.,"Oui, j'en ai besoin.",,Igen.,"Sì, ho bisogno di munizioni.",ああ、そうだ。,알겠습니다. 그럼 탄약이라도?,"Ja, dat ben ik wel.","Ja, det er jeg.","Tak, jestem.",Estou mesmo.,,Da sunt.,"Да, кончились.",,"Ja, det gör jag.","Evet, ediyorum." +Here you go. ,TXT_RYES0_SCRIPT10_D39416_HEREY,〃 (〃),,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,,Parancsolj.,Ecco a te.,どうぞ。,탄약 대령이요!,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Iată.,Держи.,,Här har du.,Al bakalım. +"Check out what's new, the teleporter beacon. When you use the beacon, we'll track the signal and send help. Is there something I can get you?",TXT_DLG_SCRIPT10_D40932_CHECK,MAP10: Justin.,,,"Podívej se na tohle, teleportační maják. Když ho použiješ, vystopujeme jeho signál a pošleme pomoc. Co ti můžu nabídnout?","Se det nye, teleporterfyret. Når du bruger fyret, sporer vi signalet og sender hjælp. Er der noget, jeg kan skaffe dig?","Sieh mal, was ich Neues habe, das Teleportersignal. Wenn du es benutzt können wir das Signal anpeilen und dir Hilfe schicken. Gibt es sonst was, was ich tun kann?",,"Kia novaĵo: la teleportil-signalilo. Post kiam vi uzos ĝin, ni spuros la signalon kaj sendos helpotrupojn. Ĉu estas io, kion mi donu al vi?","Mira qué novedad: la baliza de teletransporte. Cuando la uses, rastrearemos la señal y enviaremos refuerzos. ¿Hay algo que pueda ofrecerte?","Mira qué novedad: la baliza de teletransporte. Cuando la uses, vamos a rastrear la señal y a mandarte refuerzos. ¿Hay algo que pueda ofrecerte?","Vilkaisepa tätä uutta kaukosiirrinmajakkaa. Kun käytät majakkaa, jäljitämme signaalin ja lähetämme apua. Saisiko sinulle olla jotain?","Regardez ce qu'on vient de sortir: L'antenne de téléporteur. Quand vous l'utilisez, on traque le signal et on envoie des renforts. Que puis-je faire pour vous?",,"Nézdd csak mit újítottunk be, egy teleport követőt. Amikor aktiválod, behatároljuk a jelet és kiküldjük a segítséget. Segítségedre lehetek még valamiben?","Guarda un po' questo nuovo aggeggio, il radiofaro per teletrasporto. Quando lo usi, identificheremo il tuo segnale e mandaremo rinforzi. C'è qualcosa che ti posso dare?","何を見つけたと思う、テレポータービーコンだ。 ビーコンを使用すると信号を追跡して増援を送る ことができるぞ。必要な物はあるか?","이 녀석을 확인해보세요! 텔레포터 비컨이라는 건데, 사용해서 신호를 전송하면 병력을 보내겠습니다. 그 외에 원하는 게 있어요?","Kijk eens wat er nieuw is, het teleporterbaken. Als je het baken gebruikt, volgen we het signaal en sturen we hulp. Is er iets dat ik je kan krijgen?","Se hva som er nytt, teleportersignalet. Når du bruker den, sporer vi signalet og sender hjelp. Er det noe jeg kan hente til deg?","Zobaczcie, co nowego - teleporter. Kiedy użyjesz nadajnika, namierzymy sygnał i wyślemy pomoc. Czy jest coś, co mogę ci dać?","Veja só esta novidade, o sinalizador de teletransporte. Quando você usa o sinalizador, nós rastreamos o sinal e enviamos reforços. Posso te ajudar com alguma coisa?",,"Iată ce e nou, un far. Când folosești farul, ne ghidăm după el și trimitem întăriri. E ceva ce ți-aș putea aduce?","Посмотри на эту новинку: телепортационный маяк. Когда ты его включишь, мы проследим сигнал и вышлем подмогу. Итак, что я могу тебе предложить?",,"Kolla in vad som är nytt, teleporterfyren. När du använder fyren spårar vi signalen och skickar hjälp. Finns det något jag kan ge dig?","Yeni olan şeye bak, ışınlayıcı işaret. İşareti kullandığında, sinyali takip edip yardım göndereceğiz. Size getirebileceğim bir şey var mı?" -Box of rockets,TXT_RPLY0_SCRIPT10_D40932_BOXOF,〃,,,Bednu raket,En kasse med raketter,Kiste Raketen.,,Misilet-keston,Caja de minimisiles,,Rakettilaatikko.,Boîte de roquettes.,Egy doboz rakéta kellene.,Cassa di razzi,ロケット箱,미니 미사일 한 박스,Doos met raketten,En eske med raketter.,Pudełko z rakietami,Caixa de foguetes,,Cutie de rachete.,Коробку ракет,,En låda med raketer.,Roket kutusu -There you go.,TXT_RYES0_SCRIPT10_D40932_THERE,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,Parancsolj.,Ecco a te.,はい、どうぞ。,여기 있어!,Daar ga je.,Vær så god.,No i proszę.,Aqui está.,,Iată.,Бери.,,Här har du.,Al bakalım. -You can't afford that!,TXT_RNO0_SCRIPT10_D40932_YOUCA,〃,,,Tu si nemůžeš dovolit!,Det har du ikke råd til!,Das kannst du dir nicht leisten.,,Vi ne povas sen mono!,¡No te alcanza!,,Sinulla ei ole siihen varaa!,Vous n'avez pas assez d'argent.,Arra neked aztán nem tellik.,Non hai abbastanza soldi.,買うだけの余裕が無い!,돈이 부족한 것 같은데!,Dat kan je je niet betalen!,Det har du ikke råd til!,Nie stać cię na to!,Você não pode comprar isto!,,Nu-ți poți permite asta!,Ты не можешь себе этого позволить!,,Du har inte råd med det!,Bunu karşılayamazsın! -H-E grenades.,TXT_RPLY1_SCRIPT10_D40932_HEGRE,〃,,,Výbušné granáty,H-E granater.,HE-Granaten.,,Eksplodeg-povajn grenadojn,Granadas de conmoción,,Räjähdekranaatteja.,Grenades explosives.,Robbanó gránátot.,Granate ad alto potenziale esplosivo,HEグレネード,고폭 유탄,H-E-granaten.,H-E-granater.,Granaty H-E.,Granadas explosivas.,,Grenade.,Осколочные гранаты,,H-E-granater.,H-E el bombaları. -Here you go.,TXT_RYES1_SCRIPT10_D40932_HEREY,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,Parancsolj.,Eccole qua.,どうぞ。,거래 감사드립니다!,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Iată.,Держи.,,Varsågod.,Al bakalım. +Box of rockets,TXT_RPLY0_SCRIPT10_D40932_BOXOF,〃,,,Bednu raket,En kasse med raketter,Kiste Raketen.,,Misilet-keston,Caja de minimisiles,,Rakettilaatikko.,Boîte de roquettes.,,Egy doboz rakéta kellene.,Cassa di razzi,ロケット箱,미니 미사일 한 박스,Doos met raketten,En eske med raketter.,Pudełko z rakietami,Caixa de foguetes,,Cutie de rachete.,Коробку ракет,,En låda med raketer.,Roket kutusu +There you go.,TXT_RYES0_SCRIPT10_D40932_THERE,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,,Parancsolj.,Ecco a te.,はい、どうぞ。,여기 있어!,Daar ga je.,Vær så god.,No i proszę.,Aqui está.,,Iată.,Бери.,,Här har du.,Al bakalım. +You can't afford that!,TXT_RNO0_SCRIPT10_D40932_YOUCA,〃,,,Tu si nemůžeš dovolit!,Det har du ikke råd til!,Das kannst du dir nicht leisten.,,Vi ne povas sen mono!,¡No te alcanza!,,Sinulla ei ole siihen varaa!,Vous n'avez pas assez d'argent.,,Arra neked aztán nem tellik.,Non hai abbastanza soldi.,買うだけの余裕が無い!,돈이 부족한 것 같은데!,Dat kan je je niet betalen!,Det har du ikke råd til!,Nie stać cię na to!,Você não pode comprar isto!,,Nu-ți poți permite asta!,Ты не можешь себе этого позволить!,,Du har inte råd med det!,Bunu karşılayamazsın! +H-E grenades.,TXT_RPLY1_SCRIPT10_D40932_HEGRE,〃,,,Výbušné granáty,H-E granater.,HE-Granaten.,,Eksplodeg-povajn grenadojn,Granadas de conmoción,,Räjähdekranaatteja.,Grenades explosives.,,Robbanó gránátot.,Granate ad alto potenziale esplosivo,HEグレネード,고폭 유탄,H-E-granaten.,H-E-granater.,Granaty H-E.,Granadas explosivas.,,Grenade.,Осколочные гранаты,,H-E-granater.,H-E el bombaları. +Here you go.,TXT_RYES1_SCRIPT10_D40932_HEREY,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Ole hyvä.,Voilà pour vous.,,Parancsolj.,Eccole qua.,どうぞ。,거래 감사드립니다!,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Iată.,Держи.,,Varsågod.,Al bakalım. Come back when you have enough money.,TXT_RNO1_SCRIPT10_D40932_COMEB,〃,,,Vrať se až budeš mít dost peněz.,"Kom tilbage, når du har penge nok.","Komm wieder, wenn du genug Gold hast.",,"Revenu kiam vi havos sufiĉe da mono.","Vuelve cuando tengas -suficiente dinero.",,"Palataan asiaan sitten, kun sinulla on riittävästi rahaa.",Revenez quand vous avez assez d'argent.,"Gyere vissza, ha már van elég pénzed.",Ritorna quando avrai i soldi.,十分持ってたらまた来い。,돈이 충분할 때 다시와요.,Kom terug als je genoeg geld hebt.,Kom tilbake når du har nok penger.,"Wróć, gdy będziesz miał wystarczająco dużo pieniędzy.",Volte quando tiver dinheiro suficiente.,,Întoarce-te când ai destui bani.,"Возвращайся, когда у тебя будут деньги.",,Kom tillbaka när du har tillräckligt med pengar.,Yeterli paran olduğunda geri gel. -Energy pod,TXT_RPLY2_SCRIPT10_D40932_ENERG,〃,,,Energetický kokón,Energibælg,Energiezelle.,,Energi-kapsulon,Cápsula de energía,,Energia-akku.,Cellule énergétique.,Energia cella.,Nucleo energetico,エネルギーポッド,에너지 포드,Energiecapsule,Energikapsel,Statyw energetyczny.,Célula de energia.,,Capsulă energetică.,Энергоячейку,,Energipod.,Enerji kapsülü -Here's your energy pod,TXT_RYES2_SCRIPT10_D40932_HERES,〃,,,Tady ho máš.,Her er din energibælg.,Hier hast du deine Energiezele.,,Jen ĝi.,Aquí la tienes.,,Tässä energia-akkusi.,Voilà votre cellule.,Itt van az energia cellád.,Ecco il tuo nucleo energetico.,これがエネルギーポッドだ。,에너지 포드 한 개 대령이요!,Hier is je energiecapsule...,Her er energikapselen din.,Oto twój pojemnik na energię.,Aqui está a sua célula de energia.,,Iată capsula energetică.,Вот твоя энергоячейка.,,Här är din energipodd.,İşte enerji kapsülün. +suficiente dinero.",,"Palataan asiaan sitten, kun sinulla on riittävästi rahaa.",Revenez quand vous avez assez d'argent.,,"Gyere vissza, ha már van elég pénzed.",Ritorna quando avrai i soldi.,十分持ってたらまた来い。,돈이 충분할 때 다시와요.,Kom terug als je genoeg geld hebt.,Kom tilbake når du har nok penger.,"Wróć, gdy będziesz miał wystarczająco dużo pieniędzy.",Volte quando tiver dinheiro suficiente.,,Întoarce-te când ai destui bani.,"Возвращайся, когда у тебя будут деньги.",,Kom tillbaka när du har tillräckligt med pengar.,Yeterli paran olduğunda geri gel. +Energy pod,TXT_RPLY2_SCRIPT10_D40932_ENERG,〃,,,Energetický kokón,Energibælg,Energiezelle.,,Energi-kapsulon,Cápsula de energía,,Energia-akku.,Cellule énergétique.,,Energia cella.,Nucleo energetico,エネルギーポッド,에너지 포드,Energiecapsule,Energikapsel,Statyw energetyczny.,Célula de energia.,,Capsulă energetică.,Энергоячейку,,Energipod.,Enerji kapsülü +Here's your energy pod,TXT_RYES2_SCRIPT10_D40932_HERES,〃,,,Tady ho máš.,Her er din energibælg.,Hier hast du deine Energiezele.,,Jen ĝi.,Aquí la tienes.,,Tässä energia-akkusi.,Voilà votre cellule.,,Itt van az energia cellád.,Ecco il tuo nucleo energetico.,これがエネルギーポッドだ。,에너지 포드 한 개 대령이요!,Hier is je energiecapsule...,Her er energikapselen din.,Oto twój pojemnik na energię.,Aqui está a sua célula de energia.,,Iată capsula energetică.,Вот твоя энергоячейка.,,Här är din energipodd.,İşte enerji kapsülün. You don't have enough for that.,TXT_RNO2_SCRIPT10_D40932_YOUDO,〃,,,Na ten nemáš dost.,Du har ikke nok til det.,"Nein, du hast nicht genug Gold dafür.",,"Vi ne havas -sufiĉe da mono.",No te alcanza para eso.,,Sinulla ei ole tarpeeksi sitä varten.,Vous n'avez pas assez d'argent pour ça.,"Nincs elég nálad, hogy megvedd.",Non hai abbastanza soldi per quello.,それでは足りない。,이 물품은 비싸죠. 저도 압니다.,Daar heb je niet genoeg voor.,Du har ikke nok til det.,Nie masz na to wystarczająco dużo.,Você não tem o suficiente para isto.,,Nu ai suficiente fonduri pentru asta.,У тебя недостаточно денег.,,Du har inte tillräckligt för det.,Bunun için yeterince paran yok. -Teleporter beacon,TXT_RPLY3_SCRIPT10_D40932_TELEP,〃,,,Teleportační maják,Teleportørfyr,Teleportersignal.,,Teleportil-signalilon,Baliza de teletransporte,,Kaukosiirrinmajakka,Antenne de téléporteur.,Teleport követő,Radiofaro per teletrasporto.,テレポータービーコン,텔레포터 비콘,Teleporter baken,Teleporteringssignal,Teleporter beacon,Sinalizador de teletransporte,,Far pentru teleportare.,Телепортационный маяк,,Teleporterfyren,Işınlayıcı işaretçisi +sufiĉe da mono.",No te alcanza para eso.,,Sinulla ei ole tarpeeksi sitä varten.,Vous n'avez pas assez d'argent pour ça.,,"Nincs elég nálad, hogy megvedd.",Non hai abbastanza soldi per quello.,それでは足りない。,이 물품은 비싸죠. 저도 압니다.,Daar heb je niet genoeg voor.,Du har ikke nok til det.,Nie masz na to wystarczająco dużo.,Você não tem o suficiente para isto.,,Nu ai suficiente fonduri pentru asta.,У тебя недостаточно денег.,,Du har inte tillräckligt för det.,Bunun için yeterince paran yok. +Teleporter beacon,TXT_RPLY3_SCRIPT10_D40932_TELEP,〃,,,Teleportační maják,Teleportørfyr,Teleportersignal.,,Teleportil-signalilon,Baliza de teletransporte,,Kaukosiirrinmajakka,Antenne de téléporteur.,,Teleport követő,Radiofaro per teletrasporto.,テレポータービーコン,텔레포터 비콘,Teleporter baken,Teleporteringssignal,Teleporter beacon,Sinalizador de teletransporte,,Far pentru teleportare.,Телепортационный маяк,,Teleporterfyren,Işınlayıcı işaretçisi "Help, when and where you need it.",TXT_RYES3_SCRIPT10_D40932_HELPW,〃,,,Pomoc kdekoliv a kdykoliv je třeba.,"Hjælp, når og hvor du har brug for det.","Hilfe, wenn und wo sie gebraucht wird.",,"Helpo kiam kaj kie vi bezonos ĝin.","Refuerzos cuando y -donde los necesites.",,"Apua, missä ja milloin ikinä tarvitsetkaan.","De l'aide, quand il vous en faut.","Segítség, amikor és ahol akarod.",Con questo riceverai aiuto dove e quando ti servirà.,助けが必要になったら使うんだ。,위급한 상황에서만 사용하시길.,"Help, waar en wanneer je het nodig hebt.","Hjelp, når og hvor du trenger det.","Pomoc, kiedy i gdzie jej potrzebujesz.","Reforços, quando e onde você precisar.",,"Ajutor, acolo și când ai nevoie de el.",Теперь ты сможешь получить помощь всегда и везде.,,"Hjälp, när och var du behöver den.",İhtiyacınız olduğu zaman ve yerde yardım. +donde los necesites.",,"Apua, missä ja milloin ikinä tarvitsetkaan.","De l'aide, quand il vous en faut.",,"Segítség, amikor és ahol akarod.",Con questo riceverai aiuto dove e quando ti servirà.,助けが必要になったら使うんだ。,위급한 상황에서만 사용하시길.,"Help, waar en wanneer je het nodig hebt.","Hjelp, når og hvor du trenger det.","Pomoc, kiedy i gdzie jej potrzebujesz.","Reforços, quando e onde você precisar.",,"Ajutor, acolo și când ai nevoie de el.",Теперь ты сможешь получить помощь всегда и везде.,,"Hjälp, när och var du behöver den.",İhtiyacınız olduğu zaman ve yerde yardım. "Sorry, no charity.",TXT_RNO3_SCRIPT10_D40932_SORRY,〃,,,"Promiň, nejsme charita.","Beklager, ingen velgørenhed.","Tut mir leid, wir sind keine Wohltätigkeitsveranstaltung.",,"Pardonon, ĉi tio -ne estas almozulejo.","Lo siento, no es caridad.",,"Valitan, ei hyväntekeväisyyttä.","Désolé, on n'est pas une charité.","Sajnálom, ez nem jótékonyság.","Mi spiace, ma niente beneficienza.",すまない、チャリティーじゃないんだ。,"미안하지만, 여긴 자선단체가 아니에요.","Sorry, geen liefdadigheid.","Beklager, ingen veldedighet.","Przykro mi, ale nie ma mowy o dobroczynności.","Sinto muito, mas não fazemos caridade.",,"Scuze, nu e caritate.",Прости. Никакой благотворительности.,,"Tyvärr, ingen välgörenhet.","Üzgünüm, hayırseverlik yok." -"Now that we actually have the castle under control, we have to be extra vigilant to keep it. The Order's probably getting ready to strike back right now.",TXT_DLG_SCRIPT10_D42448_NOWTH,MAP10: Rebels in Macil's room.,,,"Teď když máme hrad pod kontrolou, musíme být ještě obezřetnější. Řád se pravděpodobně právě teď připravuje zaútočit.","Nu hvor vi faktisk har slottet under kontrol, skal vi være ekstra opmærksomme for at holde det. Ordenen er sikkert ved at gøre sig klar til at slå tilbage lige nu.","Jetzt, wo wir die Burg unter Kontrolle haben, müssen wir besonders wachsam sein, um sie nicht wieder zu verlieren. Der Orden bereitet womöglich gerade jetze einen Gegenschlag vor.",,"Nun kiam ni regas la kastelon, ni devas esti duoble atentaj por konservi ĝin; La Ordeno verŝajne pretiĝas kontraŭataki iam ajn.",Ahora que ya tenemos el castillo bajo control hay que estar el doble de alertas para cuidarlo; La Orden de seguro se está preparando para contraatacar en cualquier momento.,,"Nyt, kun linna on todellakin meidän hallinnassamme, meidän on oltava erityisen valppaita pitääksemme sen. Veljeskunta on luultavasti parhaillaan valmistautumassa vastahyökkäykseen.","Maintenant que le château est sous notre contrôle, nous devons être très vigilants pour le conserver. L'Ordre se prépare sans doute à riposter maintenant.","Most, hogy már az egész kastély az irányításunk alatt van, még szemfülesebbnek kell lennünk, hogy megtarthassuk. A Rend valószínű, hogy a visszavételre készül.","Adesso che abbiamo il castello sotto controllo, dobbiamo essere ancora più vigili per tenerlo sotto controllo. L'Ordine sicuramente starà preparando un contrattacco.","城が管理下に入った今、維持させるためには +ne estas almozulejo.","Lo siento, no es caridad.",,"Valitan, ei hyväntekeväisyyttä.","Désolé, on n'est pas une charité.",,"Sajnálom, ez nem jótékonyság.","Mi spiace, ma niente beneficienza.",すまない、チャリティーじゃないんだ。,"미안하지만, 여긴 자선단체가 아니에요.","Sorry, geen liefdadigheid.","Beklager, ingen veldedighet.","Przykro mi, ale nie ma mowy o dobroczynności.","Sinto muito, mas não fazemos caridade.",,"Scuze, nu e caritate.",Прости. Никакой благотворительности.,,"Tyvärr, ingen välgörenhet.","Üzgünüm, hayırseverlik yok." +"Now that we actually have the castle under control, we have to be extra vigilant to keep it. The Order's probably getting ready to strike back right now.",TXT_DLG_SCRIPT10_D42448_NOWTH,MAP10: Rebels in Macil's room.,,,"Teď když máme hrad pod kontrolou, musíme být ještě obezřetnější. Řád se pravděpodobně právě teď připravuje zaútočit.","Nu hvor vi faktisk har slottet under kontrol, skal vi være ekstra opmærksomme for at holde det. Ordenen er sikkert ved at gøre sig klar til at slå tilbage lige nu.","Jetzt, wo wir die Burg unter Kontrolle haben, müssen wir besonders wachsam sein, um sie nicht wieder zu verlieren. Der Orden bereitet womöglich gerade jetze einen Gegenschlag vor.",,"Nun kiam ni regas la kastelon, ni devas esti duoble atentaj por konservi ĝin; La Ordeno verŝajne pretiĝas kontraŭataki iam ajn.",Ahora que ya tenemos el castillo bajo control hay que estar el doble de alertas para cuidarlo; La Orden de seguro se está preparando para contraatacar en cualquier momento.,,"Nyt, kun linna on todellakin meidän hallinnassamme, meidän on oltava erityisen valppaita pitääksemme sen. Veljeskunta on luultavasti parhaillaan valmistautumassa vastahyökkäykseen.","Maintenant que le château est sous notre contrôle, nous devons être très vigilants pour le conserver. L'Ordre se prépare sans doute à riposter maintenant.",,"Most, hogy már az egész kastély az irányításunk alatt van, még szemfülesebbnek kell lennünk, hogy megtarthassuk. A Rend valószínű, hogy a visszavételre készül.","Adesso che abbiamo il castello sotto controllo, dobbiamo essere ancora più vigili per tenerlo sotto controllo. L'Ordine sicuramente starà preparando un contrattacco.","城が管理下に入った今、維持させるためには 更なる警戒網が必要になるだろう。オーダーは 反撃の準備をしているはずだ。",성을 공격해 점령한 이후로 화력과 병력 등을 많이 증가시킬 수 있게 되었습니다. 오더 놈들은 분명히 이를 대비한 역습을 준비하고 있을 거예요.,"Nu we het kasteel daadwerkelijk onder controle hebben, moeten we extra waakzaam zijn om het onder controle te houden. De Orde maakt zich waarschijnlijk klaar om nu meteen terug te slaan.","Nå som vi faktisk har slottet under kontroll, må vi være ekstra årvåkne for å beholde det. Ordenen gjør seg nok klar til å slå tilbake nå.","Teraz, gdy mamy zamek pod kontrolą, musimy być bardzo czujni, by go utrzymać. Zakon pewnie szykuje się do ataku.","Agora que temos o castelo sob controle, precisamos estar mais alertas para mantê-lo assim. A Ordem provavelmente está se preparando para contra-atacar neste momento.",,"Acum că avem castelul sub control, va trebui să fim și mai vigilenți pentru a-l păstra. Ordinul probabil se pregătește pentru un atac de recuperare chiar acum.","Замок теперь наш, но если хотим его удержать, нужно не терять бдительности. Быть может, именно сейчас Орден готовит контратаку.",,Nu när vi faktiskt har slottet under kontroll måste vi vara extra vaksamma för att behålla det. Ordern gör sig förmodligen redo att slå tillbaka just nu.,"Artık kaleyi kontrol altına aldığımıza göre, onu korumak için daha dikkatli olmalıyız. Tarikat muhtemelen şu anda geri saldırmaya hazırlanıyor." -Be careful out there.,TXT_DLG_SCRIPT10_D43964_BECAR,MAP10: Castle's entrance.,,,Buď tam venku opatrný.,Vær forsigtig derude.,Sei vorsichtig da draußen.,,Agu singarde tie ekstere.,Ten cuidado ahí fuera.,Ten cuidado ahí afuera.,Pidä varasi siellä.,Faites attention à vous.,Vigyázz magadra odakinnt.,Sii cauto là fuori.,外は気を付けろ。,부디 조심하시길.,Wees voorzichtig daarbuiten.,Vær forsiktig der ute.,Bądźcie ostrożni.,Tome cuidado.,,Ai grijă afară.,Будь настороже.,,Var försiktig där ute.,Dışarıda dikkatli olun. -"Keep up the great work, we couldn't have done it without you.",TXT_DLG_SCRIPT10_D45480_KEEPU,MAP10: Rebel in Hospital.,,,"Jen tak dál, bez tebe bychom to nedokázali.","Fortsæt det gode arbejde, vi kunne ikke have gjort det uden jer.","Großartige Arbeit, mach weiter so. Ohne dich hätten wir es nicht schaffen können.",,"Daŭrigu tiel, ni ne estus sukcesintaj sen vi.","Sigue así, no podríamos haberlo logrado sin ti.",,Jatka samaan malliin; emme olisi pärjänneet näin hyvin ilman sinua.,"Continuez votre magnifique travail, nous n'aurions jamais réussi sans vous.","Csak így tovább, nélküled sosem tudtuk volna véghezvinni.","Continua così, non ce l'avremmo fatta senza di te.","我々は貴方無くして成し遂げる事は出来なかった +Be careful out there.,TXT_DLG_SCRIPT10_D43964_BECAR,MAP10: Castle's entrance.,,,Buď tam venku opatrný.,Vær forsigtig derude.,Sei vorsichtig da draußen.,,Agu singarde tie ekstere.,Ten cuidado ahí fuera.,Ten cuidado ahí afuera.,Pidä varasi siellä.,Faites attention à vous.,,Vigyázz magadra odakinnt.,Sii cauto là fuori.,外は気を付けろ。,부디 조심하시길.,Wees voorzichtig daarbuiten.,Vær forsiktig der ute.,Bądźcie ostrożni.,Tome cuidado.,,Ai grijă afară.,Будь настороже.,,Var försiktig där ute.,Dışarıda dikkatli olun. +"Keep up the great work, we couldn't have done it without you.",TXT_DLG_SCRIPT10_D45480_KEEPU,MAP10: Rebel in Hospital.,,,"Jen tak dál, bez tebe bychom to nedokázali.","Fortsæt det gode arbejde, vi kunne ikke have gjort det uden jer.","Großartige Arbeit, mach weiter so. Ohne dich hätten wir es nicht schaffen können.",,"Daŭrigu tiel, ni ne estus sukcesintaj sen vi.","Sigue así, no podríamos haberlo logrado sin ti.",,Jatka samaan malliin; emme olisi pärjänneet näin hyvin ilman sinua.,"Continuez votre magnifique travail, nous n'aurions jamais réussi sans vous.",,"Csak így tovább, nélküled sosem tudtuk volna véghezvinni.","Continua così, non ce l'avremmo fatta senza di te.","我々は貴方無くして成し遂げる事は出来なかった 素晴らしい働きをしてくれてます。",부디 건투를 빕니다. 당신 덕에 희망을 잃지 않는 거니까!,"Ga zo door, we hadden het zonder jou niet kunnen doen.","Fortsett med det flotte arbeidet, vi kunne ikke ha gjort det uten deg.","Kontynuujcie wspaniałą pracę, bez was nie dalibyśmy rady.",Continue assim. Nós não teríamos conseguido sem você.,,"Continuă să faci treabă bună, n-am fi reușit fără tine.",Продолжай в том же духе. Без тебя мы бы не справились.,,"Fortsätt med ert fantastiska arbete, vi hade inte kunnat göra det utan er.","Harika iş çıkarmaya devam edin, siz olmadan bunu başaramazdık." -I'm the keymaster.,TXT_DLG_SCRIPT11_D0_IMTHE,MAP11: Commons (no token).,,,Já jsem tu klíčníkem.,Jeg er nøglemesteren.,Ich bin der Schlüsselmeister.,,Mi estas la ŝlosilestro.,Soy el amo de llaves.,,Olen avainmestari.,Je suis le maître des clés.,Én vagyok a kulcsmester.,Io sono il mastro delle chiavi.,僕がキーマスターだ。,전 열쇠지기에요.,Ik ben de sleutelbeheerder.,Jeg er nøkkelmesteren.,Jestem mistrzem kluczy.,Eu sou o mestre das chaves.,,Sunt stăpânul cheilor.,Я ключник.,,Jag är nyckelmästaren.,Ben anahtar yöneticisiyim. -"A lot of people would say this is a thankless and insignificant job. But it's not, in fact...",TXT_DLG_SCRIPT11_D1516_ALOTO,〃 (Oracle's token),,,"Většina lidí by řekla, že tohle je nevděčná a nedůležitá práce, ale není, naopak...","Mange ville sige, at det er et utaknemmeligt og ubetydeligt job. Men det er det ikke, faktisk...","Eine Menge Leute würden sagen, dies sei eine undankbare Aufgabe, aber das ist es nicht, in Wirklichkeit...",,"Multaj homoj dirus, ke ĉi tiu estas sendanka kaj sensignifa laboro, sed ne, fakte...","Mucha gente diría que este es un trabajo ingrato e insignificante, pero no, de hecho...",,Monet väittäisivät tehtäväni olevan epäkiitollinen ja vähäpätöinen. Mutta oikeasti se ei ole.,"Beaucoup de gens diraient que c'est un travail insignifiant et ingrat.. Mais en fait, ce n'est vraiment pas le cas.","Sokan azt mondják, hogy ez egy hálátlan és jelentéktelen munka. Ám nem is állhatnának messzebb az igazságtól...","Molte persone direbbero che questo è un lavoro ingrato e insignificante. Ma non lo è, infatti...","皆、この仕事が報われないと思っているが +I'm the keymaster.,TXT_DLG_SCRIPT11_D0_IMTHE,MAP11: Commons (no token).,,,Já jsem tu klíčníkem.,Jeg er nøglemesteren.,Ich bin der Schlüsselmeister.,,Mi estas la ŝlosilestro.,Soy el amo de llaves.,,Olen avainmestari.,Je suis le maître des clés.,,Én vagyok a kulcsmester.,Io sono il mastro delle chiavi.,僕がキーマスターだ。,전 열쇠지기에요.,Ik ben de sleutelbeheerder.,Jeg er nøkkelmesteren.,Jestem mistrzem kluczy.,Eu sou o mestre das chaves.,,Sunt stăpânul cheilor.,Я ключник.,,Jag är nyckelmästaren.,Ben anahtar yöneticisiyim. +"A lot of people would say this is a thankless and insignificant job. But it's not, in fact...",TXT_DLG_SCRIPT11_D1516_ALOTO,〃 (Oracle's token),,,"Většina lidí by řekla, že tohle je nevděčná a nedůležitá práce, ale není, naopak...","Mange ville sige, at det er et utaknemmeligt og ubetydeligt job. Men det er det ikke, faktisk...","Eine Menge Leute würden sagen, dies sei eine undankbare Aufgabe, aber das ist es nicht, in Wirklichkeit...",,"Multaj homoj dirus, ke ĉi tiu estas sendanka kaj sensignifa laboro, sed ne, fakte...","Mucha gente diría que este es un curro ingrato e insignificante, pero no, de hecho...","Mucha gente diría que este es un trabajo ingrato e insignificante, pero no, de hecho...",Monet väittäisivät tehtäväni olevan epäkiitollinen ja vähäpätöinen. Mutta oikeasti se ei ole.,"Beaucoup de gens diraient que c'est un travail insignifiant et ingrat.. Mais en fait, ce n'est vraiment pas le cas.",,"Sokan azt mondják, hogy ez egy hálátlan és jelentéktelen munka. Ám nem is állhatnának messzebb az igazságtól...","Molte persone direbbero che questo è un lavoro ingrato e insignificante. Ma non lo è, infatti...","皆、この仕事が報われないと思っているが 実際はそうでもないんだ...","많은 사람이 이 직업을 감사해야 하고 놀라운 일이라 말하겠죠. 하지만 아닌데, 사실은...","Veel mensen zouden zeggen dat dit een ondankbare en onbeduidende klus is. Maar dat is het niet, in feite....",Mange vil si at dette er en utakknemlig og ubetydelig jobb. Men det er det faktisk ikke...,"Wielu ludzi powiedziałoby, że to niewdzięczna i mało znacząca praca. Ale tak nie jest, w rzeczywistości...",Muita gente diria que este é um trabalho ingrato e insignificante. Mas na verdade não é...,,"O grămadă de oameni ar spune că e o muncă fără mulțumiri și insignifiantă. În realitate, nu este...","Многие скажут, что это неблагодарная и незначительная работа, но это не так. На самом деле...",,"Många skulle säga att det är ett otacksamt och obetydligt jobb. Men det är det inte, i själva verket...","Birçok insan bunun nankör ve önemsiz bir iş olduğunu söyleyebilir. Ama değil, aslında..." -Give me the key!,TXT_RPLY0_SCRIPT11_D1516_GIVEM,〃,,,Dej mi klíč!,Giv mig nøglen!,Gib mir den Schlüssel.,,Donu al mi la ŝlosilon!,¡Dame la llave!,,Anna minulle avain!,Donne moi la clé!,Add ide a kulcsot!,Dammi la chiave!,鍵をくれ!,그냥 망할 열쇠를 줘!,Geef me de sleutel!,Gi meg nøkkelen!,Daj mi klucz!,Me dê a chave!,,Dă-mi cheia!,Дай мне ключ!,,Ge mig nyckeln!,Anahtarı bana ver! -"OK, but remember, I'm the keymaster.",TXT_DLG_SCRIPT11_D3032_OKBUT,〃,,,"Dobře, ale nezapomeň, že klíčník jsem já.","OK, men husk, jeg er nøglemesteren.","Ok, aber vergiß nicht, dass ICH der Schlüsselmeister bin.",,"Bone, sed memoru: mi estas la ŝlosilestro.","Bueno, pero recuerda: soy el amo de llaves.",,"Selvä, mutta muista: minä olen avainmestari.","Ok, mais souviens-toi, je suis le maître des clés.","OK, de emlékezz arra, hogy Én vagyok a kulcsmester.","OK, ma ricorda, io sono il mastro delle chiavi.",オーケー、なんせ僕は、キーマスターだしな。,"좋아요, 하지만 기억해요. 전 열쇠지기랍니다!","Oké, maar onthoud, ik ben de sleutelbeheerder.","OK, men husk at jeg er nøkkelmesteren.","OK, ale pamiętaj, że to ja jestem klucznikiem.","Ok, mas lembre-se, eu sou o mestre das chaves.",,"Bine, dar ține minte, eu sunt stăpânul cheilor.","Держи, но помни: я ключник!",,"Okej, men kom ihåg att jag är nyckelmästaren.","Tamam, ama unutma, anahtar ustası benim." -"OK pal, whatever.",TXT_RPLY0_SCRIPT11_D3032_OKPAL,〃,,,"Jasně, kámo, klidně.","Okay, kammerat.","Was auch immer, Kumpel.",,"Jes, ulo, mi kredas vin.","Sí, colega, lo que tú digas.","Sí, amigo, como tú digas.","Joo joo, ihan sama.","Comme tu veux, mon ami.","OK öreg, nem hat meg.","Sì, certo, come no.",わかった、何なりと。,"그래, 알 게 뭐야...","Oké, vriend, wat dan ook.","OK, kompis, samme det.","OK kolego, nieważne.","Ok, amigo. Que seja.",,"Bine amice, cum spui tu.",Ага. Без проблем.,,"Okej kompis, vad som helst.","Tamam dostum, her neyse." -I'm the keymaster.,TXT_DLG_SCRIPT11_D4548_IMTHE,〃,,,Já jsem tu klíčníkem.,Jeg er nøglemesteren.,Ich bin der Schlüsselmeister.,,Mi estas la ŝlosilestro.,Soy el amo de llaves.,,Minä olen avainmestari.,Je suis le maître des clés.,Én vagyok a kulcsmester.,Io sono il mastro delle chiavi.,僕がキーマスターだ。,열쇠지기. 그게 바로 저죠!,Ik ben de sleutelbeheerder.,Jeg er nøkkelmesteren.,Ja jestem klucznikiem.,Eu sou o mestre das chaves.,,Sunt stăpânul cheilor.,Я ключник.,,Jag är nyckelmästaren.,Anahtar ustası benim. -Die traitor!,TXT_DLG_SCRIPT11_D6064_DIETR,MAP11: Red acolyte at temple's entrance.,,,"Zemři, zrádče!","Dø, forræder!","Stirb, Verräter.",,"Mortu, perfidulo!","¡Muere, traidor!",,"Kuole, petturi!","Meurs, traître!",Halál rád áruló!,Muori traditore!,死ね、反逆者!,"죽어라, 배신자!","Sterf, verrader.",Dø forræder!,Giń zdrajco!,"Morra, traidor!",,Mori trădătorule!,"Умри, предатель!",,"Dö, förrädare!",Geber hain! -Die traitor!,TXT_DLG_SCRIPT11_D7580_DIETR,〃,,,"Zemři, zrádče!","Dø, forræder!","Stirb, Verräter.",,"Mortu, perfidulo!","¡Muere, traidor!",,"Kuole, petturi!","Meurs, traître!",Halál rád áruló!,Muori traditore!,死ね、反逆者!,"뒈져라, 배신자!","Sterf, verrader.",Dø forræder!,Giń zdrajco!,"Morra, traidor!",,Mori trădătorule!,"Умри, предатель!",,"Dö, förrädare!",Geber hain! -"Have you come to gloat? Even though we're behind these bars, as long as we hold on, you still lose.",TXT_DLG_SCRIPT11_D9096_HAVEY,MAP11: Prisoner.,,,"Přišel ses nám vysmívat? I když jsme za mřížemi, dokud jsme na nohou, ty zůstáváš poražený.","Er du kommet for at fryde dig? Selvom vi er bag disse tremmer, så længe vi holder fast, taber du stadig.","Bist du zum Glotzen gekommen? Auch wenn wir hinter Gittern sind, solange wir nicht aufgeben wirst du immer noch verlieren.",,"Ĉu vi venis rikani? Eĉ se ni estas malliberaj, dum ni eltenos, vi perdos.","¿Has venido a regodearte? Aunque estemos entre rejas, mientras sigamos en pie, vosotros perdéis.","¿Viniste a burlarte? Aunque estemos entre rejas, mientras sigamos en pie, ustedes pierden.","Oletko tullut meitä pilkkaamaan? Vaikka olemmekin näiden kaltereiden takansa, niin kunhan vain pidämme pintamme, sinä silti häviät.","Vous êtes venu vous moquer de nous? Même si on est derrière les barreaux, du moment que l'on reste en vie, vous allez perdre.","Dicsekedni jöttél ide? Habár itt rohadunk a rács mögött, amíg kitartunk miénk a győzelem.","Sei venuto a gongolare? Anche se siamo dietro queste sbarre, finché resisteremo, voi perderete.","何睨んでるんだ?この棒が俺達を囲んでる限り、 +Give me the key!,TXT_RPLY0_SCRIPT11_D1516_GIVEM,〃,,,Dej mi klíč!,Giv mig nøglen!,Gib mir den Schlüssel.,,Donu al mi la ŝlosilon!,¡Dame la llave!,,Anna minulle avain!,Donne moi la clé!,,Add ide a kulcsot!,Dammi la chiave!,鍵をくれ!,그냥 망할 열쇠를 줘!,Geef me de sleutel!,Gi meg nøkkelen!,Daj mi klucz!,Me dê a chave!,,Dă-mi cheia!,Дай мне ключ!,,Ge mig nyckeln!,Anahtarı bana ver! +"OK, but remember, I'm the keymaster.",TXT_DLG_SCRIPT11_D3032_OKBUT,〃,,,"Dobře, ale nezapomeň, že klíčník jsem já.","OK, men husk, jeg er nøglemesteren.","Ok, aber vergiß nicht, dass ICH der Schlüsselmeister bin.",,"Bone, sed memoru: mi estas la ŝlosilestro.","Bueno, pero recuerda: soy el amo de llaves.",,"Selvä, mutta muista: minä olen avainmestari.","Ok, mais souviens-toi, je suis le maître des clés.",,"OK, de emlékezz arra, hogy Én vagyok a kulcsmester.","OK, ma ricorda, io sono il mastro delle chiavi.",オーケー、なんせ僕は、キーマスターだしな。,"좋아요, 하지만 기억해요. 전 열쇠지기랍니다!","Oké, maar onthoud, ik ben de sleutelbeheerder.","OK, men husk at jeg er nøkkelmesteren.","OK, ale pamiętaj, że to ja jestem klucznikiem.","Ok, mas lembre-se, eu sou o mestre das chaves.",,"Bine, dar ține minte, eu sunt stăpânul cheilor.","Держи, но помни: я ключник!",,"Okej, men kom ihåg att jag är nyckelmästaren.","Tamam, ama unutma, anahtar ustası benim." +"OK pal, whatever.",TXT_RPLY0_SCRIPT11_D3032_OKPAL,〃,,,"Jasně, kámo, klidně.","Okay, kammerat.","Was auch immer, Kumpel.",,"Jes, ulo, mi kredas vin.","Sí, colega, lo que tú digas.","Sí, amigo, como tú digas.","Joo joo, ihan sama.","Comme tu veux, mon ami.",,"OK öreg, nem hat meg.","Sì, certo, come no.",わかった、何なりと。,"그래, 알 게 뭐야...","Oké, vriend, wat dan ook.","OK, kompis, samme det.","OK kolego, nieważne.","Ok, amigo. Que seja.",,"Bine amice, cum spui tu.",Ага. Без проблем.,,"Okej kompis, vad som helst.","Tamam dostum, her neyse." +I'm the keymaster.,TXT_DLG_SCRIPT11_D4548_IMTHE,〃,,,Já jsem tu klíčníkem.,Jeg er nøglemesteren.,Ich bin der Schlüsselmeister.,,Mi estas la ŝlosilestro.,Soy el amo de llaves.,,Minä olen avainmestari.,Je suis le maître des clés.,,Én vagyok a kulcsmester.,Io sono il mastro delle chiavi.,僕がキーマスターだ。,열쇠지기. 그게 바로 저죠!,Ik ben de sleutelbeheerder.,Jeg er nøkkelmesteren.,Ja jestem klucznikiem.,Eu sou o mestre das chaves.,,Sunt stăpânul cheilor.,Я ключник.,,Jag är nyckelmästaren.,Anahtar ustası benim. +Die traitor!,TXT_DLG_SCRIPT11_D6064_DIETR,MAP11: Red acolyte at temple's entrance.,,,"Zemři, zrádče!","Dø, forræder!","Stirb, Verräter.",,"Mortu, perfidulo!","¡Muere, traidor!",,"Kuole, petturi!","Meurs, traître!",,Halál rád áruló!,Muori traditore!,死ね、反逆者!,"죽어라, 배신자!","Sterf, verrader.",Dø forræder!,Giń zdrajco!,"Morra, traidor!",,Mori trădătorule!,"Умри, предатель!",,"Dö, förrädare!",Geber hain! +Die traitor!,TXT_DLG_SCRIPT11_D7580_DIETR,〃,,,"Zemři, zrádče!","Dø, forræder!","Stirb, Verräter.",,"Mortu, perfidulo!","¡Muere, traidor!",,"Kuole, petturi!","Meurs, traître!",,Halál rád áruló!,Muori traditore!,死ね、反逆者!,"뒈져라, 배신자!","Sterf, verrader.",Dø forræder!,Giń zdrajco!,"Morra, traidor!",,Mori trădătorule!,"Умри, предатель!",,"Dö, förrädare!",Geber hain! +"Have you come to gloat? Even though we're behind these bars, as long as we hold on, you still lose.",TXT_DLG_SCRIPT11_D9096_HAVEY,MAP11: Prisoner.,,,"Přišel ses nám vysmívat? I když jsme za mřížemi, dokud jsme na nohou, ty zůstáváš poražený.","Er du kommet for at fryde dig? Selvom vi er bag disse tremmer, så længe vi holder fast, taber du stadig.","Bist du zum Glotzen gekommen? Auch wenn wir hinter Gittern sind, solange wir nicht aufgeben wirst du immer noch verlieren.",,"Ĉu vi venis rikani? Eĉ se ni estas malliberaj, dum ni eltenos, vi perdos.","¿Has venido a regodearte? Aunque estemos entre rejas, mientras sigamos en pie, vosotros perdéis.","¿Viniste a burlarte? Aunque estemos entre rejas, mientras sigamos en pie, ustedes pierden.","Oletko tullut meitä pilkkaamaan? Vaikka olemmekin näiden kaltereiden takansa, niin kunhan vain pidämme pintamme, sinä silti häviät.","Vous êtes venu vous moquer de nous? Même si on est derrière les barreaux, du moment que l'on reste en vie, vous allez perdre.",,"Dicsekedni jöttél ide? Habár itt rohadunk a rács mögött, amíg kitartunk miénk a győzelem.","Sei venuto a gongolare? Anche se siamo dietro queste sbarre, finché resisteremo, voi perderete.","何睨んでるんだ?この棒が俺達を囲んでる限り、 お前は未だに負けている。","거들먹거리러 온 거냐? 비록 우리가 이 철창에 갇히긴 했지만, 계속 여기 있으면 넌 아직도 질 거라고.","Ben je gekomen om je te verkneukelen? Ook al zitten we achter deze tralies, zolang we ons vasthouden, verlies je nog steeds.","Har du kommet for å hovere? Selv om vi er bak gitteret, taper du så lenge vi holder fast.","Przyszliście się napawać? Nawet jeśli jesteśmy za tymi kratami, to dopóki się trzymamy, ty wciąż przegrywasz.","Você veio se gabar? Mesmo que a gente esteja atrás destas grades, enquanto resistirmos, você ainda perde.",,"Ai venit să te lauzi? Chiar dacă suntem în spatele gratilor, cât timp rezistăm, tu pierzi.","Пришёл поглумиться? Пусть мы и за этими решётками, но пока мы живы, вам не победить.",,"Har du kommit för att skryta? Även om vi är bakom dessa galler, så länge vi håller ut, förlorar du ändå.","Kına yakmaya mı geldin? Bu parmaklıkların arkasında olsak bile, biz dayandığımız sürece siz kaybedersiniz." -Let us out of here!,TXT_DLG_SCRIPT11_D10612_LETUS,〃,,,Pusť nás odsud!,Lad os komme ud herfra!,Lass uns hier raus!,,Liberigu nin!,¡Sácanos de aquí!,,Päästä meidät pois täältä!,Sortez nous de là!,Engedj ki minket!,Facci uscire da qua!,ここから出してくれ!,우릴 여기서 내보내 줘!,Laat ons hier uit!,Slipp oss ut herfra!,Wypuść nas stąd!,Nos tire daqui!,,Scoate-ne de aici!,Выпусти нас отсюда!,,Släpp ut oss härifrån!,Çıkarın bizi buradan! -Leave me alone!,TXT_DLG_SCRIPT11_D12128_LEAVE,〃,,,Nech mě být!,Lad mig være i fred!,Lass mich in Ruhe!,,Ne ĝenu min!,¡Déjame en paz!,,Jätä minut rauhaan!,Foutez moi la paix!,Hagyj békén!,Lasciami in pace!,ほっといてくれ!,날 좀 내버려 둬!,Laat me met rust!,La meg være i fred!,Zostawcie mnie w spokoju!,Me deixe em paz!,,Lasă-mă în pace!,Оставь меня в покое!,,Lämna mig ifred!,Beni yalnız bırakın! -"What is the wisdom you seek, simple one?",TXT_DLG_SCRIPT12_D0_WHATI,MAP12: Oracle.,,,"Jaké moudro hledáš, jednoduchý?","Hvad er det for en visdom du søger, simple en?","Welche Weisheit suchst du, Menschling?",,"Kiun saĝecon vi serĉas, simplulo?","¿Qué sabiduría buscas, simplón?",,"Mitä viisautta etsit, sinä tietämätön?","Quelle est la sagesse que vous recherchez, simple humain?","Miféle bölcsességet kutatsz, egyszerű barátom?","Qual è la saggezza che cerchi, ottenebrato ?",迷える者よ、如何なる知識を求めに来た。,그대가 찾고 있는 지혜는 어떤 것인가? 평범한 자여?,"Wat is de wijsheid die je zoekt, eenvoudige wijsheid?","Hva er visdommen du søker, enfoldige?","Jakiej mądrości szukasz, prosty?","Qual é a sabedoria que você procura, simples criatura?",,"Ce întelepciune cauți, om simplu?","Какой мудрости ты ищешь, непосвящённый?",,"Vad är det för visdom du söker, enkla man?","Aradığın bilgelik nedir, basit olan?" -The Sigil of the One God.,TXT_RPLY0_SCRIPT12_D0_THESI,〃,,,Pečeť Jednoho boha.,Sigilet af den ene Gud.,Das Sigil des Einen Gottes.,,La Sigelon de la Vera Dio.,El Emblema del Dios Único.,,Yhden Ainoan Jumalan Sinettiä.,Le Sigil du Seul Dieu.,Az egy Igaz Isten pecsétjét.,Il Sigillo dell'Unico Dio.,唯一神のシジルだ。,"유일신의 인장, 시질이다.",De Sigil van de Ene God.,Den ene Guds sigill.,Sigil Jedynego Boga.,O Sigilo do Deus Único.,,Sigiliul Adevăratului Zeu.,Печать Единого Бога.,,Den ende gudens signum.,Tek Tanrı'nın Mührü. -"I feel one fragment resonate within you. The second lies at the heart of the crimson and obsidian tower. There you must combat the Bishop, who is aware, and awaits you. You will find him by following his symbol of power. Take this token to the keymaster. Return to me after you have slain the beast.",TXT_DLG_SCRIPT12_D1516_IFEEL,〃,,,"Cítím z tebe rezonovat jeden díl. Druhý leží v srdci věže karmíno-obsidiánové. Tam musíš poraziti Biskupa, který si je tě vědom a očekává tě. Najdeš ho následováním symbolu jeho moci. Přijmi tuto známku pro klíčníka. Vrať se ke mě, až skolíš bestii.","Jeg føler et fragment resonere i dig. Det andet ligger i hjertet af det purpurfarvede og obsidian tårn. Der skal du bekæmpe biskoppen, som er klar over det og venter på dig. Du finder ham ved at følge hans symbol for magt. Tag dette symbol med til nøglemesteren. Vend tilbage til mig, når du har dræbt udyret.","Ich fühle, wie ein Fragment in dir pulsiert, Das zweite Teilstück des Sigils befindet sich im Herzen des Turms aus Purpur und Obsidian. Dort wartet der Bischof auf dich, den du bekämpfen musst. Er weiß von dir und wartet. Du findest ihn, wenn du seinem Symbol der Macht folgst. Nimm dieses Zeichen und gebe es dem Schlüsselmeister. Kehr zu mir zurück, nachdem du die Bestie vernichtet hast.",,"Mi sentas, ke fragmento resonas en vi. La dua situas en la koro de la turo karmezina kaj obsidiankolora: tie vi devas batali kontraŭ la Episkopo, kiu antaŭsciis ĉi tion kaj atendas vin; vi trovos lin sekvante lian povsimbolon. Donu ĉi tiun paspermeson al la ŝlosilestro. Mortiginte la beston, revenu ĉi tien.",Siento un fragmento resonar en ti. El segundo se encuentra en el corazón de la torre carmesí y obsidiana: ahí debes combatir con el Obispo que sabe y espera tu llegada; lo encontrarás siguiendo su símbolo de poder. Llévale este pase al amo de llaves. Vuelve a mí después de matar a la bestia.,Siento un fragmento resonar en ti. El segundo se encuentra en el corazón de la torre carmesí y obsidiana: ahí debes combatir con el Obispo que sabe y espera tu llegada; lo vas a encontrar siguiendo su símbolo de poder. Llévale este pase al amo de llaves. Vuelve a mí después de matar a la bestia.,"Minä tunnen yhden osasen väräjävän sisälläsi. Toinen piilee purppuranpunaisen laavalasisen tornin sydämessä. Siellä pitää sinun taisteleman Piispaa vastaan, joka on tietoinen ja sinua odottava. Löydät hänet seuraamalla hänen valtansa tunnuskuvaa. Toimita tämä merkki avainmestarille. Palaa tyköni surmattuasi pedon.","Je sens un fragment résonner en toi. Le deuxième repose au cœur de la tour d'obsidienne et d'écarlate. Ici, vous devrez défaire l'évêque, qui connaît déjà votre statut, et vous attend patiemment. Vous le trouverez en suivant son symbole de pouvoir. Prenez ce jeton et amenez le au maître des clés. Retournez à moi après que vous ayez vaincu la bête.","Érzem rajta az egyik darabot. A másodikat a karmazsin és obszidián toronyban találod meg. Ott viszont már várni fog rád a Püspök. Meg fogod lelni őt, ha követed a jelét. Vidd ezt a zálogot a kulcsmesterhez. Térj vissza hozzám, ha legyűrted a szörnyet.","Avverto che possiedi uno dei frammenti. Il secondo si trova nel cuore della torre cremisina e ossidiana. Lì dovrai combattere contro il Vescovo, che già ti attende. Lo troverai seguendo il suo simbolo del potere. Prendi questo gettone per il mastro delle chiavi. Ritorna da me dopo che avrai ucciso la bestia.","お主の持つ欠片が共鳴しているのを感受出来る。 +Let us out of here!,TXT_DLG_SCRIPT11_D10612_LETUS,〃,,,Pusť nás odsud!,Lad os komme ud herfra!,Lass uns hier raus!,,Liberigu nin!,¡Sácanos de aquí!,,Päästä meidät pois täältä!,Sortez nous de là!,,Engedj ki minket!,Facci uscire da qua!,ここから出してくれ!,우릴 여기서 내보내 줘!,Laat ons hier uit!,Slipp oss ut herfra!,Wypuść nas stąd!,Nos tire daqui!,,Scoate-ne de aici!,Выпусти нас отсюда!,,Släpp ut oss härifrån!,Çıkarın bizi buradan! +Leave me alone!,TXT_DLG_SCRIPT11_D12128_LEAVE,〃,,,Nech mě být!,Lad mig være i fred!,Lass mich in Ruhe!,,Ne ĝenu min!,¡Déjame en paz!,,Jätä minut rauhaan!,Foutez moi la paix!,,Hagyj békén!,Lasciami in pace!,ほっといてくれ!,날 좀 내버려 둬!,Laat me met rust!,La meg være i fred!,Zostawcie mnie w spokoju!,Me deixe em paz!,,Lasă-mă în pace!,Оставь меня в покое!,,Lämna mig ifred!,Beni yalnız bırakın! +"What is the wisdom you seek, simple one?",TXT_DLG_SCRIPT12_D0_WHATI,MAP12: Oracle.,,,"Jaké moudro hledáš, jednoduchý?","Hvad er det for en visdom du søger, simple en?","Welche Weisheit suchst du, Menschling?",,"Kiun saĝecon vi serĉas, simplulo?","¿Qué sabiduría buscas, simplón?",,"Mitä viisautta etsit, sinä tietämätön?","Quelle est la sagesse que vous recherchez, simple humain?",,"Miféle bölcsességet kutatsz, egyszerű barátom?","Qual è la saggezza che cerchi, ottenebrato ?",迷える者よ、如何なる知識を求めに来た。,그대가 찾고 있는 지혜는 어떤 것인가? 평범한 자여?,"Wat is de wijsheid die je zoekt, eenvoudige wijsheid?","Hva er visdommen du søker, enfoldige?","Jakiej mądrości szukasz, prosty?","Qual é a sabedoria que você procura, simples criatura?",,"Ce întelepciune cauți, om simplu?","Какой мудрости ты ищешь, непосвящённый?",,"Vad är det för visdom du söker, enkla man?","Aradığın bilgelik nedir, basit olan?" +The Sigil of the One God.,TXT_RPLY0_SCRIPT12_D0_THESI,〃,,,Pečeť Jednoho boha.,Sigilet af den ene Gud.,Das Sigil des Einen Gottes.,,La Sigelon de la Vera Dio.,El Emblema del Dios Único.,,Yhden Ainoan Jumalan Sinettiä.,Le Sigil du Seul Dieu.,,Az egy Igaz Isten pecsétjét.,Il Sigillo dell'Unico Dio.,唯一神のシジルだ。,"유일신의 인장, 시질이다.",De Sigil van de Ene God.,Den ene Guds sigill.,Sigil Jedynego Boga.,O Sigilo do Deus Único.,,Sigiliul Adevăratului Zeu.,Печать Единого Бога.,,Den ende gudens signum.,Tek Tanrı'nın Mührü. +"I feel one fragment resonate within you. The second lies at the heart of the crimson and obsidian tower. There you must combat the Bishop, who is aware, and awaits you. You will find him by following his symbol of power. Take this token to the keymaster. Return to me after you have slain the beast.",TXT_DLG_SCRIPT12_D1516_IFEEL,〃,,,"Cítím z tebe rezonovat jeden díl. Druhý leží v srdci věže karmíno-obsidiánové. Tam musíš poraziti Biskupa, který si je tě vědom a očekává tě. Najdeš ho následováním symbolu jeho moci. Přijmi tuto známku pro klíčníka. Vrať se ke mě, až skolíš bestii.","Jeg føler et fragment resonere i dig. Det andet ligger i hjertet af det purpurfarvede og obsidian tårn. Der skal du bekæmpe biskoppen, som er klar over det og venter på dig. Du finder ham ved at følge hans symbol for magt. Tag dette symbol med til nøglemesteren. Vend tilbage til mig, når du har dræbt udyret.","Ich fühle, wie ein Fragment in dir pulsiert, Das zweite Teilstück des Sigils befindet sich im Herzen des Turms aus Purpur und Obsidian. Dort wartet der Bischof auf dich, den du bekämpfen musst. Er weiß von dir und wartet. Du findest ihn, wenn du seinem Symbol der Macht folgst. Nimm dieses Zeichen und gebe es dem Schlüsselmeister. Kehr zu mir zurück, nachdem du die Bestie vernichtet hast.",,"Mi sentas, ke fragmento resonas en vi. La dua situas en la koro de la turo karmezina kaj obsidiankolora: tie vi devas batali kontraŭ la Episkopo, kiu antaŭsciis ĉi tion kaj atendas vin; vi trovos lin sekvante lian povsimbolon. Donu ĉi tiun paspermeson al la ŝlosilestro. Mortiginte la beston, revenu ĉi tien.",Siento un fragmento resonar en ti. El segundo se encuentra en el corazón de la torre carmesí y obsidiana: ahí debes combatir con el Obispo que sabe y espera tu llegada; lo encontrarás siguiendo su símbolo de poder. Llévale este pase al amo de llaves. Vuelve a mí después de matar a la bestia.,Siento un fragmento resonar en ti. El segundo se encuentra en el corazón de la torre carmesí y obsidiana: ahí debes combatir con el Obispo que sabe y espera tu llegada; lo vas a encontrar siguiendo su símbolo de poder. Llévale este pase al amo de llaves. Vuelve a mí después de matar a la bestia.,"Minä tunnen yhden osasen väräjävän sisälläsi. Toinen piilee purppuranpunaisen laavalasisen tornin sydämessä. Siellä pitää sinun taisteleman Piispaa vastaan, joka on tietoinen ja sinua odottava. Löydät hänet seuraamalla hänen valtansa tunnuskuvaa. Toimita tämä merkki avainmestarille. Palaa tyköni surmattuasi pedon.","Je sens un fragment résonner en toi. Le deuxième repose au cœur de la tour d'obsidienne et d'écarlate. Ici, vous devrez défaire l'évêque, qui connaît déjà votre statut, et vous attend patiemment. Vous le trouverez en suivant son symbole de pouvoir. Prenez ce jeton et amenez le au maître des clés. Retournez à moi après que vous ayez vaincu la bête.",,"Érzem rajta az egyik darabot. A másodikat a karmazsin és obszidián toronyban találod meg. Ott viszont már várni fog rád a Püspök. Meg fogod lelni őt, ha követed a jelét. Vidd ezt a zálogot a kulcsmesterhez. Térj vissza hozzám, ha legyűrted a szörnyet.","Avverto che possiedi uno dei frammenti. Il secondo si trova nel cuore della torre cremisina e ossidiana. Lì dovrai combattere contro il Vescovo, che già ti attende. Lo troverai seguendo il suo simbolo del potere. Prendi questo gettone per il mastro delle chiavi. Ritorna da me dopo che avrai ucciso la bestia.","お主の持つ欠片が共鳴しているのを感受出来る。 二つ目の欠片は紅と黒曜の塔だ。 そこでお主を待ち構えているビショップと戦え。 その者が持つシンボルを辿れば見つかるだろう。 このトークンをキーマスターに渡せ。 魔物を討伐した後、此処へ戻るのだ。",그대에게서 시질의 조각 중 하나가 느껴지는군. 두 번째 조각은 진홍빛 흑요석 탑의 심장부에 있다. 거기서 기다리고 있는 비숍과 싸워야 한다. 그 자의 권력을 상징하는 문양을 따라가면 만날 수 있을 것이다. 열쇠지기에게 이 통행증을 전해주어라. 그리고 괴물을 처치하면 다시 나에게로 오라.,"Ik voel een fragment in je resoneren. Het tweede fragment ligt in het hart van de karmozijnrode en obsidiaan toren. Daar moet je de bisschop bestrijden, die zich bewust is van de situatie en op je wacht. Je zult hem vinden door zijn machtssymbool te volgen. Neem dit teken mee naar de sleutelbeheerder. Keer naar mij terug nadat je het beest hebt gedood.","Jeg føler et fragment resonere i deg. Det andre ligger i hjertet av det purpurfargede og obsidianske tårnet. Der må du bekjempe biskopen, som vet og venter på deg. Du finner ham ved å følge hans maktsymbol. Ta dette symbolet til nøkkelmesteren. Kom tilbake til meg etter at du har drept udyret.","Czuję, że jeden fragment rezonuje w tobie. Drugi leży w sercu karmazynowej i obsydianowej wieży. Tam musisz walczyć z Biskupem, który jest świadomy i czeka na ciebie. Znajdziesz go podążając za jego symbolem mocy. Zanieś ten żeton do klucznika. Wróć do mnie po zabiciu bestii.","Posso sentir um fragmento ressoar de dentro de você. O segundo está na torre carmesim e obsidiana. Lá você deverá combater o Bispo, que está acordado e te aguarda. Você o encontrará seguindo o seu símbolo de poder. Leve esta ensígnia ao mestre das chaves. Volte depois de eliminar a besta.",,"Simt un fragment care rezonează în tine. Al doilea e în inima turnului purpuriu, din obsidian. Acolo îl vei înfrunta pe Episcop, care e conștient, și în așteptare. Îl vei găsi urmându-i simbolul puterii. Du asta la stăpânul cheilor. Întoarce-te după ce ai înfrânt fiara.","Я чувствую один фрагмент, настроенный на тебя. Второй лежит в сердце багрово-обсидиановой башни. Там тебе предстоит сразиться с Епископом — он знает о тебе и ждёт твоего появления. Его символ власти приведёт тебя прямо к нему. Отнеси этот жетон ключнику. Срази чудовище и возвращайся ко мне. ",,"Jag känner ett fragment resonera inom dig. Det andra ligger i hjärtat av det karmosinröda och obsidianska tornet. Där måste du bekämpa biskopen, som är medveten och väntar på dig. Du hittar honom genom att följa hans maktsymbol. Ta den här symbolen till nyckelmästaren. Återvänd till mig när du har dödat odjuret.","Bir parçanın içinde yankılandığını hissediyorum. İkincisi kızıl ve obsidyen kulenin kalbinde yatıyor. Orada, farkında olan ve seni bekleyen Piskopos'la savaşmalısın. Onu güç sembolünü takip ederek bulacaksın. Bu simgeyi anahtar ustasına götür. Canavarı öldürdükten sonra bana dön." -I'll be back.,TXT_RPLY0_SCRIPT12_D1516_ILLBE,〃,,,Vrátím se.,Jeg kommer tilbage.,Ich werde zurückkommen.,,Mi revenos.,Volveré.,,Tulen takaisin.,Je reviendrai.,Visszatérek még.,Ritornerò.,すぐ戻ってくる。,금방 돌아올게.,Ik kom terug.,Jeg kommer tilbake.,Wrócę.,Eu voltarei.,,Mă voi întoarce.,Я вернусь.,,Jag kommer tillbaka.,Geri geleceğim. -"Although the Bishop is formidable, this quest is slight. Return to me when you possess the next fragment.",TXT_DLG_SCRIPT12_D3032_ALTHO,〃,,,"I přes Biskupovu hrozivost je tento úkol drobný. Vrať se, až budeš vlastnit další díl.","Selv om biskoppen er formidabel, er denne søgen let. Vend tilbage til mig, når du er i besiddelse af det næste fragment.","Auch wenn der Bischof ein schwerer Gegner ist, diese Aufgabe ist geringfügig. Komm zu mir zurück, wenn du das nächste Fragment besitzt.",,"Kvankam la Episkopo estas timindega, ĉi tiu tasko estas sensignifa. Revenu al mi kiam vi havos la sekvan fragmenton.","Aunque el Obispo es formidable, esta misión es leve. Vuelve a mí cuando poseas el siguiente fragmento.",,"Vaikka suuri onkin Piispa, pieni kuitenkin on tämä tehtävä. Palaa tyköni, kun seuraava osanen on hallussasi.","Bien que l'évêque soit un puissant adversaire, cette quête n'est qu'une courte aventure. Revenez à moi quand vous possédez le deuxième fragment.","Habár a Püspök méltó ellenfél lesz, a küldetésed könnyű. Térj vissza, ha megvan a következő darabka.","Anche se il Vescovo è formidabile, questa sfida è leggera. Ritorna da me non appena possiedi il prossimo frammento.","ビショップは手強く、この使命は困難であろう。 +I'll be back.,TXT_RPLY0_SCRIPT12_D1516_ILLBE,〃,,,Vrátím se.,Jeg kommer tilbage.,Ich werde zurückkommen.,,Mi revenos.,Volveré.,,Tulen takaisin.,Je reviendrai.,,Visszatérek még.,Ritornerò.,すぐ戻ってくる。,금방 돌아올게.,Ik kom terug.,Jeg kommer tilbake.,Wrócę.,Eu voltarei.,,Mă voi întoarce.,Я вернусь.,,Jag kommer tillbaka.,Geri geleceğim. +"Although the Bishop is formidable, this quest is slight. Return to me when you possess the next fragment.",TXT_DLG_SCRIPT12_D3032_ALTHO,〃,,,"I přes Biskupovu hrozivost je tento úkol drobný. Vrať se, až budeš vlastnit další díl.","Selv om biskoppen er formidabel, er denne søgen let. Vend tilbage til mig, når du er i besiddelse af det næste fragment.","Auch wenn der Bischof ein schwerer Gegner ist, diese Aufgabe ist geringfügig. Komm zu mir zurück, wenn du das nächste Fragment besitzt.",,"Kvankam la Episkopo estas timindega, ĉi tiu tasko estas sensignifa. Revenu al mi kiam vi havos la sekvan fragmenton.","Aunque el Obispo es formidable, esta misión es leve. Vuelve a mí cuando poseas el siguiente fragmento.",,"Vaikka suuri onkin Piispa, pieni kuitenkin on tämä tehtävä. Palaa tyköni, kun seuraava osanen on hallussasi.","Bien que l'évêque soit un puissant adversaire, cette quête n'est qu'une courte aventure. Revenez à moi quand vous possédez le deuxième fragment.",,"Habár a Püspök méltó ellenfél lesz, a küldetésed könnyű. Térj vissza, ha megvan a következő darabka.","Anche se il Vescovo è formidabile, questa sfida è leggera. Ritorna da me non appena possiedi il prossimo frammento.","ビショップは手強く、この使命は困難であろう。 次の欠片を手にしたら此処へ戻るのだ。 ","비숍은 만만치 않은 상대지만, 이보다 더한 일들이 기다리고 있다. 두 번째 조각을 찾고 다시 돌아오라.","Hoewel de bisschop formidabel is, is deze zoektocht gering. Keer terug naar mij als je het volgende fragment bezit.","Selv om biskopen er formidabel, er dette oppdraget lett. Kom tilbake til meg når du har det neste fragmentet.","Choć Biskup jest potężny, to zadanie jest niewielkie. Wróć do mnie, gdy posiądziesz kolejny fragment.","Embora o Bispo seja poderoso, esta missão é simples. Retorne para mim quando você possuir o próximo fragmento.",,"Deși Episocopul e formidabil, misiunea asta e ușoara. Întoarce-te când ai cel de-al doilea fragment.","Каким бы страшным Епископ ни был, это задание не доставит тебе хлопот. Достань следующий фрагмент и возвращайся ко мне.",,Även om biskopen är formidabel är detta uppdrag lätt. Återvänd till mig när du besitter nästa fragment.,"Piskopos zorlu olsa da, bu görev hafif. Bir sonraki parçayı ele geçirdiğinde bana geri dön." -Your next challenge will test your spirit. The third piece is held by your own leader. He is the same as that which he sends you to kill.,TXT_DLG_SCRIPT12_D4548_YOURN,MAP12: Oracle → After killing the Bishop,,,"Tvá další výzva pokusí tvou vůli. Třetí díl je držen tvým vlastním vůdcem. Je stejný, jako ti, které tě posílá zabít.","Din næste udfordring vil sætte din ånd på prøve. Det tredje stykke er i din egen leders besiddelse. Han er den samme som den, han sender dig ud for at dræbe.","Die nächste Herausforderung wird deinen Geist prüfen. Das dritte Teilstück wird von deinem eigenen Anführer, Macil, gehalten. Er ist das Gleiche, was er dich töten lässt.",,"Via sekva defio provos vian spiriton. Via propra estro posedas la trian pecon; li estas egala al tio, kion mortigi li sendas vin.",Tu próximo desafío pondrá a prueba tu espíritu. El tercer fragmento está en manos de tu propio líder; él es igual a aquello que te envía a matar.,Tu próximo desafío va a poner a prueba tu espíritu. El tercer fragmento está en manos de tu propio líder; él es igual a aquello que te manda a matar.,"Seuraava haasteesi koettelee sinua henkisesti. Kolmatta osasta pitää hallussaan oma päämiehesi. Hän on sama kuin se, jonka hän lähettää sinut surmaamaan.",Le prochain défi testera votre esprit. Le troisième fragment est possédé par votre leader. Il est le même que celui qu'il vous a envoyé tuer.,"A következő kihívás próbára fogja tenni a lelked. A harmadik darab a saját vezetődnél van. Ő maga ugyanaz, mint akiért elküldött.",La tua prossima sfida metterà alla prova il tuo spirito. Il terzo frammento è posseduto dal tuo stesso capo. Lui è uguale a quelli che ti manda ad uccidere.,"次の挑戦はお主の精神が試されるだろう。 +Your next challenge will test your spirit. The third piece is held by your own leader. He is the same as that which he sends you to kill.,TXT_DLG_SCRIPT12_D4548_YOURN,MAP12: Oracle → After killing the Bishop,,,"Tvá další výzva pokusí tvou vůli. Třetí díl je držen tvým vlastním vůdcem. Je stejný, jako ti, které tě posílá zabít.","Din næste udfordring vil sætte din ånd på prøve. Det tredje stykke er i din egen leders besiddelse. Han er den samme som den, han sender dig ud for at dræbe.","Die nächste Herausforderung wird deinen Geist prüfen. Das dritte Teilstück wird von deinem eigenen Anführer, Macil, gehalten. Er ist das Gleiche, was er dich töten lässt.",,"Via sekva defio provos vian spiriton. Via propra estro posedas la trian pecon; li estas egala al tio, kion mortigi li sendas vin.",Tu próximo desafío pondrá a prueba tu espíritu. El tercer fragmento está en manos de tu propio líder; él es igual a aquello que te envía a matar.,Tu próximo desafío va a poner a prueba tu espíritu. El tercer fragmento está en manos de tu propio líder; él es igual a aquello que te manda a matar.,"Seuraava haasteesi koettelee sinua henkisesti. Kolmatta osasta pitää hallussaan oma päämiehesi. Hän on sama kuin se, jonka hän lähettää sinut surmaamaan.",Le prochain défi testera votre esprit. Le troisième fragment est possédé par votre leader. Il est le même que celui qu'il vous a envoyé tuer.,,"A következő kihívás próbára fogja tenni a lelked. A harmadik darab a saját vezetődnél van. Ő maga ugyanaz, mint akiért elküldött.",La tua prossima sfida metterà alla prova il tuo spirito. Il terzo frammento è posseduto dal tuo stesso capo. Lui è uguale a quelli che ti manda ad uccidere.,"次の挑戦はお主の精神が試されるだろう。 三つ目の欠片はお主の指導者が所持している。 彼奴はお主の死を望むが為 戦場へ送り込んでいるのだ。",다음 도전은 그대의 정신을 시험할 것이다. 세 번째 조각은 바로 그대의 지도자가 가지고 있다. 그는 그대를 시켜서 죽였던 괴물들과 마찬가지인 존재다.,Je volgende uitdaging zal je geest testen. Het derde stuk is in handen van je eigen leider. Hij is hetzelfde als wat hij je stuurt om te doden.,Din neste utfordring vil sette din ånd på prøve. Den tredje brikken holdes av din egen leder. Han er den samme som han sender deg for å drepe.,"Twoje kolejne wyzwanie będzie testem dla twojego ducha. Trzeci kawałek jest w posiadaniu waszego przywódcy. Jest taki sam jak ten, którego wysyła, byś zabił.",Seu próximo desafio testará o seu espírito. A terceira peça está com o seu próprio líder. Ele é a mesma pessoa que ele quer que você mate.,,Următoarea provocare îți va testa spiritul. A treia piesă e deținută de liderul tău. A celași care te trimite să omori.,"Следующее задание испытает силу твоего духа. Третий фрагмент у вашего лидера. Он сам — один из тех, кого вы убиваете по его приказу.",,Din nästa utmaning kommer att sätta din själ på prov. Den tredje biten innehas av din egen ledare. Han är densamma som den som han skickar dig att döda.,Bir sonraki mücadeleniz ruhunuzu sınayacak. Üçüncü parça kendi lideriniz tarafından tutuluyor. Seni öldürmen için gönderdiğiyle aynı kişi. -Macil? A traitor?,TXT_RPLY0_SCRIPT12_D4548_MACIL,〃,,,Macil? Zrádce?,Macil? En forræder?,Macil? Ein Verräter?,,Ĉu Macil? Ĉu perfidulo?,"¿Macil?, ¿un traidor?",,Macil? Petturiko?,Macil? Un traître?,Macil? Egy áruló volna?,Macil? Un traditore?,マシル?彼が裏切者?,마실이 배신자라고?,Macil? Een verrader?,Macil? En forræder?,Macil? Zdrajca?,Macil? Um traidor?,,Macil? Un trădător?,Мэйсил? Предатель?,,Macil? En förrädare?,Macil mi? Bir hain mi? -Your blind faith has allowed him to advance to his goals with each piece you gain. Confront him and resolve your fate.,TXT_DLG_SCRIPT12_D6064_YOURB,〃,,,"Tvá slepá víra mu dovolila přiblížit se k jeho cíli s každým dalším dílem, jenž získáš. Postav se mu a rozhodni svůj osud.","Din blinde tro har gjort det muligt for ham at komme videre til sine mål med hver brik, du får. Konfronter ham, og afklar din skæbne.","Deine blinde Treue hat es ihm erlaubt, seine eigenen Ziele voranzutreiben - mit jedem Fragment, das du findest. Konfrontiere ihn und kläre dein Schicksal.",,"Via blinda fido ebligis al li progresi en siaj celoj per ĉiu peco, kiun vi gajnas. Alfrontu lin por solvi vian destinon.",Tu fe ciega le ha permitido avanzar en sus objetivos con cada pieza que ganas. Confróntalo y resuelve tu destino.,,Sokea uskosi on sallinut hänen edistää omia tavoitteitaan jokaisen saavuttamasi osasen myötä. Kohtaa hänet ja päätä kohtalosi.,"Votre dévotion aveugle lui a permis d'avancer vers ses fins. Avec chaque fragment que vous récupérez, il s'en rapproche encore. Confrontez le et faites-face à votre destinée.","A vakon belé vetett hited segített számára, hogy minden darabkával közelebb jusson a céljához. Szembesítsd vele, és tisztázd le magadban a hited.",La tua fede cieca gli ha permesso di raggiungere i suoi obiettivi con ogni pezzo che ottieni. Affrontalo e risolvi il tuo destino.,"彼を妄信するお主の活躍によって、 +Macil? A traitor?,TXT_RPLY0_SCRIPT12_D4548_MACIL,〃,,,Macil? Zrádce?,Macil? En forræder?,Macil? Ein Verräter?,,Ĉu Macil? Ĉu perfidulo?,"¿Macil?, ¿un traidor?",,Macil? Petturiko?,Macil? Un traître?,,Macil? Egy áruló volna?,Macil? Un traditore?,マシル?彼が裏切者?,마실이 배신자라고?,Macil? Een verrader?,Macil? En forræder?,Macil? Zdrajca?,Macil? Um traidor?,,Macil? Un trădător?,Мэйсил? Предатель?,,Macil? En förrädare?,Macil mi? Bir hain mi? +Your blind faith has allowed him to advance to his goals with each piece you gain. Confront him and resolve your fate.,TXT_DLG_SCRIPT12_D6064_YOURB,〃,,,"Tvá slepá víra mu dovolila přiblížit se k jeho cíli s každým dalším dílem, jenž získáš. Postav se mu a rozhodni svůj osud.","Din blinde tro har gjort det muligt for ham at komme videre til sine mål med hver brik, du får. Konfronter ham, og afklar din skæbne.","Deine blinde Treue hat es ihm erlaubt, seine eigenen Ziele voranzutreiben - mit jedem Fragment, das du findest. Konfrontiere ihn und kläre dein Schicksal.",,"Via blinda fido ebligis al li progresi en siaj celoj per ĉiu peco, kiun vi gajnas. Alfrontu lin por solvi vian destinon.",Tu fe ciega le ha permitido avanzar en sus objetivos con cada pieza que ganas. Confróntalo y resuelve tu destino.,,Sokea uskosi on sallinut hänen edistää omia tavoitteitaan jokaisen saavuttamasi osasen myötä. Kohtaa hänet ja päätä kohtalosi.,"Votre dévotion aveugle lui a permis d'avancer vers ses fins. Avec chaque fragment que vous récupérez, il s'en rapproche encore. Confrontez le et faites-face à votre destinée.",,"A vakon belé vetett hited segített számára, hogy minden darabkával közelebb jusson a céljához. Szembesítsd vele, és tisztázd le magadban a hited.",La tua fede cieca gli ha permesso di raggiungere i suoi obiettivi con ogni pezzo che ottieni. Affrontalo e risolvi il tuo destino.,"彼を妄信するお主の活躍によって、 彼奴の目的が果たされる間近だ。 彼奴に立ち向かい、運命を切り開くのだ。",그대의 맹목적인 믿음이 조각들을 하나하나 찾으면서 그자의 목표를 이뤄주고 있다. 그를 상대하고 구속된 운명에서 벗어나라.,Jouw blinde geloof heeft hem in staat gesteld om met elk stuk dat je wint zijn doelen te bereiken. Confronteer hem en los je lot op.,Din blinde tro har gjort det mulig for ham å nå sine mål for hver brikke du vinner. Konfronter ham og avgjør din skjebne.,Twoja ślepa wiara pozwoliła mu na osiągnięcie celu z każdym zdobytym kawałkiem. Skonfrontuj się z nim i rozstrzygnij swój los.,Sua fé cega permitiu que ele avance em suas metas com cada peça que você adquire. Vá confrontá-lo e resolva o seu destino.,,"Credința ta oarbă i-a permis să-și avanseze planurile, cu fiecare piesă pe care o obții. Înfruntă-l și împlinește-ți destinul.","Твоя слепая вера приближала его к цели каждый раз, как ты находил фрагмент. Сразись с ним и исполни своё предназначение.",,Din blinda tro har gjort det möjligt för honom att avancera mot sina mål med varje bit du vinner. Konfrontera honom och lös ditt öde.,"Kör inancınız, kazandığınız her parçayla hedeflerine ilerlemesine izin verdi. Onunla yüzleş ve kaderini çöz." -"All right, it is Macil.",TXT_RPLY0_SCRIPT12_D6064_ALLRI,〃,,,"Tak dobře, je to Macil.","Okay, det er Macil.","Na gut, es ist Macil.",,Komprenite: nun Macil.,"Muy bien, sigue Macil.",,"Niin se on, se on Macil.",Très bien. C'est le tour de Macil.,"Igazad volt, Macil az.","Va bene, è Macil.",わかった、それがマシルか。,역시... 마실이였군.,"Oké, het is Macil.","Greit, det er Macil.","W porządku, to Macil.",Certo. Então é o Macil.,,"Bine, Macil să fie.",Понятно. Я убью Мэйсила.,,"Okej, det är Macil.","Pekala, bu Macil." -It's you I don't trust.,TXT_RPLY1_SCRIPT12_D6064_ITSYO,〃,,,Ale já nevěřím tobě.,"Det er dig, jeg ikke stoler på.","Du bist es, dem ich nicht vertraue.",,"Vi estas tiu, kiun mi ne fidas.",Eres tú de quien no me fío.,Eres tú en quien no confío.,Sinuun en minä luota.,C'est vous à qui je ne fais pas confiance.,"Te vagy az, akiben nem bízok.",Sei tu quello di cui non mi fido.,信用できん。,내가 믿지 않는 건 네놈이다.,Ik vertrouw jou niet.,Det er deg jeg ikke stoler på.,To tobie nie ufam.,É você em quem eu não confio.,,Tu ești cel în care nu am încredere.,"Я думаю, что это ты лжешь!",,Det är dig jag inte litar på.,Güvenmediğim sensin. -Whatever choice you make your kind shall perish under the will of the One God.,TXT_DLG_SCRIPT12_D7580_WHATE,〃,,,"Nehledě na tvé rozhodnutí, tvůj druh skoná vůlí Jednoho boha.","Uanset hvilket valg du træffer, vil din slags gå under under den ene Guds vilje.","Welche Wahl du auch triffst, deine Spezies wird unter dem Willen des Einen Gottes zugrunde gehen.",,"Tio ajn, kion vi elektos, via specio malaperos laŭ la volo de la Vera Dio.",Cualquiera que sea tu elección tu especie perecerá bajo la voluntad del Dios Único.,Cualquiera que sea tu elección tu especie va a perecer bajo la voluntad del Dios Único.,"Teitpä minkä hyvänsä päätöksen, lajisi pitää hukkuman Yhden Ainoan Jumalan tahdon alle.","Quel que soit le choix que vous faites, votre espèce périra par la volonté du Seul Dieu.","Mindegy mire döntesz, az egy igaz isten szigora lesúlyt rád és fajtádra.","Qualunque scelta tu faccia, la tua specie perirà per il volere dell'Unico Dio.","如何なる選択でも、人類は大いなる神の元で +"All right, it is Macil.",TXT_RPLY0_SCRIPT12_D6064_ALLRI,〃,,,"Tak dobře, je to Macil.","Okay, det er Macil.","Na gut, es ist Macil.",,Komprenite: nun Macil.,"Muy bien, sigue Macil.",,"Niin se on, se on Macil.",Très bien. C'est le tour de Macil.,,"Igazad volt, Macil az.","Va bene, è Macil.",わかった、それがマシルか。,역시... 마실이였군.,"Oké, het is Macil.","Greit, det er Macil.","W porządku, to Macil.",Certo. Então é o Macil.,,"Bine, Macil să fie.",Понятно. Я убью Мэйсила.,,"Okej, det är Macil.","Pekala, bu Macil." +It's you I don't trust.,TXT_RPLY1_SCRIPT12_D6064_ITSYO,〃,,,Ale já nevěřím tobě.,"Det er dig, jeg ikke stoler på.","Du bist es, dem ich nicht vertraue.",,"Vi estas tiu, kiun mi ne fidas.",Eres tú de quien no me fío.,Eres tú en quien no confío.,Sinuun en minä luota.,C'est vous à qui je ne fais pas confiance.,,"Te vagy az, akiben nem bízok.",Sei tu quello di cui non mi fido.,信用できん。,내가 믿지 않는 건 네놈이다.,Ik vertrouw jou niet.,Det er deg jeg ikke stoler på.,To tobie nie ufam.,É você em quem eu não confio.,,Tu ești cel în care nu am încredere.,"Я думаю, что это ты лжешь!",,Det är dig jag inte litar på.,Güvenmediğim sensin. +Whatever choice you make your kind shall perish under the will of the One God.,TXT_DLG_SCRIPT12_D7580_WHATE,〃,,,"Nehledě na tvé rozhodnutí, tvůj druh skoná vůlí Jednoho boha.","Uanset hvilket valg du træffer, vil din slags gå under under den ene Guds vilje.","Welche Wahl du auch triffst, deine Spezies wird unter dem Willen des Einen Gottes zugrunde gehen.",,"Tio ajn, kion vi elektos, via specio malaperos laŭ la volo de la Vera Dio.",Cualquiera que sea tu elección tu especie perecerá bajo la voluntad del Dios Único.,Cualquiera que sea tu elección tu especie va a perecer bajo la voluntad del Dios Único.,"Teitpä minkä hyvänsä päätöksen, lajisi pitää hukkuman Yhden Ainoan Jumalan tahdon alle.","Quel que soit le choix que vous faites, votre espèce périra par la volonté du Seul Dieu.",,"Mindegy mire döntesz, az egy igaz isten szigora lesúlyt rád és fajtádra.","Qualunque scelta tu faccia, la tua specie perirà per il volere dell'Unico Dio.","如何なる選択でも、人類は大いなる神の元で 浄化されるだろう。","그대가 어떤 선택을 하더라도, 그대를 비롯한 종족은 유일신의 의지에 의해 멸망할 뿐이다.","Welke keuze je ook maakt, jouw soort zal vergaan onder de wil van de Ene God.","Uansett hvilket valg du tar, vil din art gå til grunne under den ene Guds vilje.","Jakiegokolwiek wyboru dokonasz, twój rodzaj zginie z woli Jedynego Boga.","Seja qual for a escolha que você fizer, sua espécie irá perecer sob a vontade do Deus Único.",,"Indiferent de alegerea ta, neamul tău va pieri sub voința Adevăratului Zeu.","Что бы ты ни выбрал, твой род исчезнет по воле Единого Бога.",,Vilket val du än gör kommer din sort att förgås under den ende Gudens vilja.,"Yaptığın seçim ne olursa olsun, türün Tek Tanrı'nın iradesi altında yok olacak." -I'll be back when Macil's dead.,TXT_RPLY0_SCRIPT12_D7580_ILLBE,MAP12: Choose to kill Macil.,,,"Vrátím se, až bude Macil mrtev.","Jeg kommer tilbage, når Macil er død.","Ich komme wieder, wenn Macil tot ist.",,Mi revenos kiam Macil estos mortinta.,Volveré cuando Macil esté muerto.,Voy a volver cuando Macil esté muerto.,"Tulen takaisin, kun Macil on kuollut.",Je reviendrai quand Macil sera mort.,"Visszajövök, ha Macil már halott.",Tornerò quando Macil sarà morto.,マシルの死と共に戻る。,마실을 죽이고 돌아오겠다.,Ik kom terug als Macil dood is.,Jeg kommer tilbake når Macil er død.,"Wrócę, gdy Macil będzie martwy.",Voltarei quando Macil estiver morto.,,Am să mă întorc odată ce Macil e mort.,Я вернусь после смерти Мэйсила.,,Jag kommer tillbaka när Macil är död.,Macil öldüğünde geri döneceğim. -I can't let that happen.,TXT_RPLY1_SCRIPT12_D7580_ICANT,MAP12: Choose to not kill Macil.,,,To nemůžu dopustit.,Jeg kan ikke lade det ske.,Das darf nicht passieren.,,Mi ne povas permesi tion.,No puedo permitirlo.,,En voi antaa sen tapahtua.,Je ne peux pas vous laisser faire ça.,Nem hagyhatom ezt.,Non posso permetterlo.,そうはさせん。,그렇게 할 순 없어.,Dat kan ik niet laten gebeuren.,Jeg kan ikke la det skje.,Nie mogę na to pozwolić.,Não posso deixar isso acontecer.,,Nu voi permite asta.,Я не могу этого допустить.,,Jag kan inte låta det hända.,Bunun olmasına izin veremem. -"The river of time moves forever onward, while you stand still.",TXT_DLG_SCRIPT12_D9096_THERI,MAP12: You chose to kill Macil.,,,Řeka času plyne stále vpřed zatímco ty zůstáváš stát.,"Tidens flod bevæger sig for evigt fremad, mens du står stille.","Der Fluss der Zeit bewegt sich immer vorwärts, während du stillstehst.",,La tempofluo eterne iras antaŭen dum vi restas senmova.,La corriente del tiempo sigue adelante mientras tú sigues quieto.,,"Ajan virta liikkuu alati eteenpäin, samalla kun itse pysyt aloillasi.","La rivière du temps continue à couler, tandis que vous restez immobile.","Az idő folyója folyamat halad tovább, miközben te csak álldogállsz.","Il fiume del tempo scorre inesorabilmente, mentre tu rimani fermo.",事を措いても、時の河は永遠の先に進む。,"그대가 가만히 있어도, 시간의 강은 계속 흐를 뿐이다.","De rivier van de tijd beweegt voor altijd verder, terwijl je stilstaat.","Tidens elv beveger seg evig videre, mens du står stille.","Rzeka czasu płynie wiecznie do przodu, podczas gdy ty stoisz w miejscu.","O corrente do tempo se movimenta sempre adiante, enquanto você fica imóvel.",,"Râul timpului curge în permanență, în timp ce tu stai pe loc.","Река времени непрестанно течёт вперёд, в то время как ты стоишь без движения.",,"Tidens flod rör sig för evigt framåt, medan du står stilla.","Sen dururken, zaman nehri sonsuza dek ilerliyor." -"You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people, the Loremaster. Stop him, and the next piece will be yours.",TXT_DLG_SCRIPT12_D10612_YOUHA,MAP12: Oracle → After killing Macil,,,"Vyřízl jsi rakovinu ze svého těla, tvé srdce však stále bije. Dále musíš najít doktora, jenž vraždí a ovládá tvé druhy, Dějepisce. Učiň mu přítrž a další díl bude tvůj.","Du har skåret kræften ud af din krop, men dit hjerte slår stadig. Nu skal du finde den kirurg, der slagter og kontrollerer dit folk, Loremesteren. Stop ham, og det næste stykke vil være dit.","Du hast das Geschwür aus deinem Körper entferrnt, aber dein Herz schlägt noch. Als Nächstes musst du den Wissensmeister finden, der deine Leute kontrolliert und abschlachtet. Stoppe ihn und das nächste Teilstück ist Dein.",,"Vi saniĝis de via kancero, sed via koro ankoraŭ batas. Vi nun devas trovi la kirurgon, kiu buĉas kaj regas viajn homojn: la Folkloristo; haltigu lin kaj la sekva peco estos via.","Te has curado del cáncer, pero tu corazón aún late. Ahora toca encontrar al cirujano que destroza y controla a tu gente: al Maestro del Conocimiento; detenlo y la próxima pieza será tuya.",,"Olet erottanut syövän ruumiistasi, mutta sydämesi silti sykkii. Seuraavaksi pitää sinun löytämän kirugin, joka teurastaa ja hallitsee kansaasi: Oppi-Isän. Pysäytä hänet, ja seuraava osanen on oleva sinun.","Vous avez arraché le cancer de votre corps, mais le cœur bat encore. Vous devez maintenant trouver le chirurgien qui massacre votre peuple, le Maître des traditions. Arrètez-le, et le fragment suivant sera le vôtre.","Kioperáltad a rákos sejteket a testedből, de a szíved még mindig ver. Most meg kell találnod azt a sebészt, aki lemészárolja és kontrollálja a néped. Ő nem más, mint a Tanmester. Állítsd meg, és a következő darabka a tied.","Hai eliminato il cancro dal tuo corpo, ma il tuo cuore batte ancora. Adesso devi trovare il chirurgo che macella e controlla la tua gente, il Sapiente. Fermalo e il prossimo pezzo sarà tuo.","心に動揺が見られるな、だがお主は己の体から +I'll be back when Macil's dead.,TXT_RPLY0_SCRIPT12_D7580_ILLBE,MAP12: Choose to kill Macil.,,,"Vrátím se, až bude Macil mrtev.","Jeg kommer tilbage, når Macil er død.","Ich komme wieder, wenn Macil tot ist.",,Mi revenos kiam Macil estos mortinta.,Volveré cuando Macil esté muerto.,Voy a volver cuando Macil esté muerto.,"Tulen takaisin, kun Macil on kuollut.",Je reviendrai quand Macil sera mort.,,"Visszajövök, ha Macil már halott.",Tornerò quando Macil sarà morto.,マシルの死と共に戻る。,마실을 죽이고 돌아오겠다.,Ik kom terug als Macil dood is.,Jeg kommer tilbake når Macil er død.,"Wrócę, gdy Macil będzie martwy.",Voltarei quando Macil estiver morto.,,Am să mă întorc odată ce Macil e mort.,Я вернусь после смерти Мэйсила.,,Jag kommer tillbaka när Macil är död.,Macil öldüğünde geri döneceğim. +I can't let that happen.,TXT_RPLY1_SCRIPT12_D7580_ICANT,MAP12: Choose to not kill Macil.,,,To nemůžu dopustit.,Jeg kan ikke lade det ske.,Das darf nicht passieren.,,Mi ne povas permesi tion.,No puedo permitirlo.,,En voi antaa sen tapahtua.,Je ne peux pas vous laisser faire ça.,,Nem hagyhatom ezt.,Non posso permetterlo.,そうはさせん。,그렇게 할 순 없어.,Dat kan ik niet laten gebeuren.,Jeg kan ikke la det skje.,Nie mogę na to pozwolić.,Não posso deixar isso acontecer.,,Nu voi permite asta.,Я не могу этого допустить.,,Jag kan inte låta det hända.,Bunun olmasına izin veremem. +"The river of time moves forever onward, while you stand still.",TXT_DLG_SCRIPT12_D9096_THERI,MAP12: You chose to kill Macil.,,,Řeka času plyne stále vpřed zatímco ty zůstáváš stát.,"Tidens flod bevæger sig for evigt fremad, mens du står stille.","Der Fluss der Zeit bewegt sich immer vorwärts, während du stillstehst.",,La tempofluo eterne iras antaŭen dum vi restas senmova.,La corriente del tiempo sigue adelante mientras tú sigues quieto.,,"Ajan virta liikkuu alati eteenpäin, samalla kun itse pysyt aloillasi.","La rivière du temps continue à couler, tandis que vous restez immobile.",,"Az idő folyója folyamat halad tovább, miközben te csak álldogállsz.","Il fiume del tempo scorre inesorabilmente, mentre tu rimani fermo.",事を措いても、時の河は永遠の先に進む。,"그대가 가만히 있어도, 시간의 강은 계속 흐를 뿐이다.","De rivier van de tijd beweegt voor altijd verder, terwijl je stilstaat.","Tidens elv beveger seg evig videre, mens du står stille.","Rzeka czasu płynie wiecznie do przodu, podczas gdy ty stoisz w miejscu.","O corrente do tempo se movimenta sempre adiante, enquanto você fica imóvel.",,"Râul timpului curge în permanență, în timp ce tu stai pe loc.","Река времени непрестанно течёт вперёд, в то время как ты стоишь без движения.",,"Tidens flod rör sig för evigt framåt, medan du står stilla.","Sen dururken, zaman nehri sonsuza dek ilerliyor." +"You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people, the Loremaster. Stop him, and the next piece will be yours.",TXT_DLG_SCRIPT12_D10612_YOUHA,MAP12: Oracle → After killing Macil,,,"Vyřízl jsi rakovinu ze svého těla, tvé srdce však stále bije. Dále musíš najít doktora, jenž vraždí a ovládá tvé druhy, Dějepisce. Učiň mu přítrž a další díl bude tvůj.","Du har skåret kræften ud af din krop, men dit hjerte slår stadig. Nu skal du finde den kirurg, der slagter og kontrollerer dit folk, Loremesteren. Stop ham, og det næste stykke vil være dit.","Du hast das Geschwür aus deinem Körper entferrnt, aber dein Herz schlägt noch. Als Nächstes musst du den Wissensmeister finden, der deine Leute kontrolliert und abschlachtet. Stoppe ihn und das nächste Teilstück ist Dein.",,"Vi saniĝis de via kancero, sed via koro ankoraŭ batas. Vi nun devas trovi la kirurgon, kiu buĉas kaj regas viajn homojn: la Folkloristo; haltigu lin kaj la sekva peco estos via.","Te has curado del cáncer, pero tu corazón aún late. Ahora toca encontrar al cirujano que destroza y controla a tu gente: al Maestro del Conocimiento; detenlo y la próxima pieza será tuya.",,"Olet erottanut syövän ruumiistasi, mutta sydämesi silti sykkii. Seuraavaksi pitää sinun löytämän kirugin, joka teurastaa ja hallitsee kansaasi: Oppi-Isän. Pysäytä hänet, ja seuraava osanen on oleva sinun.","Vous avez arraché le cancer de votre corps, mais le cœur bat encore. Vous devez maintenant trouver le chirurgien qui massacre votre peuple, le Maître des traditions. Arrètez-le, et le fragment suivant sera le vôtre.",,"Kioperáltad a rákos sejteket a testedből, de a szíved még mindig ver. Most meg kell találnod azt a sebészt, aki lemészárolja és kontrollálja a néped. Ő nem más, mint a Tanmester. Állítsd meg, és a következő darabka a tied.","Hai eliminato il cancro dal tuo corpo, ma il tuo cuore batte ancora. Adesso devi trovare il chirurgo che macella e controlla la tua gente, il Sapiente. Fermalo e il prossimo pezzo sarà tuo.","心に動揺が見られるな、だがお主は己の体から 癌を取り除いた。次の欠片は 人々を虐殺で支配するロアマスター外科医が 所持している。彼奴を止め、欠片を得るのだ。","그대 몸 안의 암 덩어리를 잘라냈건만, 심장은 여전히 뛰고 있구나. 다음은 네 종족의 도살과 지배를 책임졌던 로어마스터다. 그를 막아내면, 다음 조각은 너의 것이다.","Je hebt de kanker uit je lichaam gesneden, maar je hart klopt nog steeds. Vervolgens moet je de chirurg vinden die je volk afslacht en controleert, de Loremaster. Stop hem, en het volgende stuk zal van jou zijn.","Du har fjernet kreften fra kroppen din, men hjertet ditt slår fortsatt. Nå må du finne kirurgen som slakter og kontrollerer folket ditt, Loremesteren. Stopp ham, og det neste stykket blir ditt.","Wyciąłeś raka ze swojego ciała, ale twoje serce wciąż bije. Następnie musisz znaleźć chirurga, który rzeźbi i kontroluje twój lud, Loremastera. Powstrzymaj go, a następny kawałek będzie twój.","Você arrancou o câncer do seu corpo, mas seu coração ainda bate. Agora você deve encontrar o cirurgião que mutila e controla o seu povo, o Mestre do Conhecimento. Detenha-o e a próxima peça será sua.",,"Ai scăpat de cancerul din corp, dar inima ta încă bate. Mai departe, trebuie să îl găsești pe chirurgul care îți controlează și măcelărește oamenii, Stăpânul Învățăturilor. Oprește-l, și următoarea piesă va fi a ta.","Ты вырезал опухоль из своего тела, но твоё сердце всё ещё бьётся. Теперь тебе предстоит найти хирурга, который вскрывает твоих людей и управляет ими: Хранителя мудрости. Останови его, и следующий фрагмент твой.",,"Du har skurit bort cancern från din kropp, men ditt hjärta slår fortfarande. Nu måste du hitta kirurgen som slaktar och kontrollerar ditt folk, Läromästaren. Stoppa honom och nästa bit kommer att bli din.","Kanseri vücudunuzdan attınız ama kalbiniz hala atıyor. Şimdi halkını katleden ve kontrol eden cerrahı, Loremaster'ı bulmalısın. Onu durdurursan, bir sonraki parça senin olacak." -Where do I find him?,TXT_RPLY0_SCRIPT12_D10612_WHERE,〃,,,Kde ho najdu?,Hvor kan jeg finde ham?,Wo finde ich ihn?,,Kie mi trovos lin?,¿Dónde lo encuentro?,,Mistä löydän hänet?,Où puis-je le trouver?,Hol találom meg?,Dove lo trovo?,そいつはどうやって見つける?,어디를 가야 그를 발견할 수 있지?,Waar vind ik hem?,Hvor finner jeg ham?,Gdzie go znajdę?,Onde encontro ele?,,Unde îl găsesc?,Где мне искать его?,,Var hittar jag honom?,Onu nerede bulabilirim? -"Use the teleporter behind the door I just opened to reach the Loremaster. When he is dead, use the same device to return to me.",TXT_DLG_SCRIPT12_D12128_USETH,〃,,,"Dostaň se k Dějepisci pomocí teleportéru za dveřmi, které jsem právě otevřel. Když je mrtev, použij stejné zařízení k návratu ke mě.","Brug teleporteren bag den dør, jeg lige har åbnet, for at nå Loremesteren. Når han er død, skal du bruge den samme anordning til at vende tilbage til mig.","Benutze den Teleporter hinter der Tür, die ich gerade geöffnet habe. Wenn er tot ist, benutze dasselbe Gerät, um zu mir zurückzukehren.",,"Uzu la teleportilon tra la ĵus malfermita pordo maldekstre de vi por atingi la Folkloriston. Mortiginte lin, reuzu tiun aparaton por reveni ĉi tien.","Usa el teletransportador de la puerta que acabo de abrir a tu izquierda para llegar hasta el Maestro del Conocimiento. Una vez muerto, usa el mismo dispositivo para volver a mí.",,"Käytä juuri avaamani oven takana olevaa kaukosiirrintä tavoittaaksesi Oppi-Isän. Kun hän on kuollut, käytä samaa laitetta palataksesi tyköni.","Utilisez le téléporteur derrière la porte que je viens d'ouvrir pour trouver le Maître des traditions. Quand il sera mort, utilisez ce même téléporteur pour revenir ici.","Használd a kinyílt ajtó mögötti portált a Tanmesterhez. Ha meghalt, használd a visszaútra is.","Usa il teletrasporto dietro la porta che ho appena sbloccato per raggiungere il Sapiente. Quando è morto, usa lo stesso teletrasporto per tornare da me.","我の傍にあるテレポーターの扉を開いた。 +Where do I find him?,TXT_RPLY0_SCRIPT12_D10612_WHERE,〃,,,Kde ho najdu?,Hvor kan jeg finde ham?,Wo finde ich ihn?,,Kie mi trovos lin?,¿Dónde lo encuentro?,,Mistä löydän hänet?,Où puis-je le trouver?,,Hol találom meg?,Dove lo trovo?,そいつはどうやって見つける?,어디를 가야 그를 발견할 수 있지?,Waar vind ik hem?,Hvor finner jeg ham?,Gdzie go znajdę?,Onde encontro ele?,,Unde îl găsesc?,Где мне искать его?,,Var hittar jag honom?,Onu nerede bulabilirim? +"Use the teleporter behind the door I just opened to reach the Loremaster. When he is dead, use the same device to return to me.",TXT_DLG_SCRIPT12_D12128_USETH,〃,,,"Dostaň se k Dějepisci pomocí teleportéru za dveřmi, které jsem právě otevřel. Když je mrtev, použij stejné zařízení k návratu ke mě.","Brug teleporteren bag den dør, jeg lige har åbnet, for at nå Loremesteren. Når han er død, skal du bruge den samme anordning til at vende tilbage til mig.","Benutze den Teleporter hinter der Tür, die ich gerade geöffnet habe. Wenn er tot ist, benutze dasselbe Gerät, um zu mir zurückzukehren.",,"Uzu la teleportilon tra la ĵus malfermita pordo maldekstre de vi por atingi la Folkloriston. Mortiginte lin, reuzu tiun aparaton por reveni ĉi tien.","Usa el teletransportador de la puerta que acabo de abrir a tu izquierda para llegar hasta el Maestro del Conocimiento. Una vez muerto, usa el mismo dispositivo para volver a mí.",,"Käytä juuri avaamani oven takana olevaa kaukosiirrintä tavoittaaksesi Oppi-Isän. Kun hän on kuollut, käytä samaa laitetta palataksesi tyköni.","Utilisez le téléporteur derrière la porte que je viens d'ouvrir pour trouver le Maître des traditions. Quand il sera mort, utilisez ce même téléporteur pour revenir ici.",,"Használd a kinyílt ajtó mögötti portált a Tanmesterhez. Ha meghalt, használd a visszaútra is.","Usa il teletrasporto dietro la porta che ho appena sbloccato per raggiungere il Sapiente. Quando è morto, usa lo stesso teletrasporto per tornare da me.","我の傍にあるテレポーターの扉を開いた。 それがロアマスターの元に通ずる。 彼奴に死を伝えた後、再び扉を通るがよい。","내가 로어마스터로 향하는 순간이동 장치를 열어두었다. 그 자가 죽으면, 똑같은 장치를 써서 다시 나에게 오라. \cy못생기긴 했어도, 이 양반 우리 편인 것 같네.","Gebruik de teleporter achter de deur die ik net heb geopend om de Loremaster te bereiken. Als hij dood is, gebruik je hetzelfde apparaat om terug te keren naar mij.","Bruk teleporteren bak døren jeg nettopp åpnet for å nå Loremaster. Når han er død, bruk samme apparat for å komme tilbake til meg.","Użyj teleportera za drzwiami, które właśnie otworzyłem, aby dotrzeć do Loremastera. Gdy będzie martwy, użyj tego samego urządzenia, by wrócić do mnie.","Use o teletransportador atrás da porta que eu acabei de abrir para chegar até o Mestre do Conhecimento. Quando ele morrer, use o mesmo dispositivo e retorne a mim.",,"Folosește teleportoul din spatele ușii pe care tocmai am deschis-o. După ce e mort, folosește același dispozitiv pentru a te întoarce la mine.","Используй телепорт за той дверью, что я только что открыл, чтобы добраться до Хранителя. Когда он умрёт, найди другой телепорт, чтобы вернуться ко мне.",,Använd teleportern bakom dörren som jag just öppnade för att nå Läromästaren. När han är död använder du samma anordning för att återvända till mig.,"Loremaster'a ulaşmak için az önce açtığım kapının arkasındaki ışınlayıcıyı kullan. O öldüğünde, bana dönmek için aynı cihazı kullan." -"I'll be back, with his piece!",TXT_RPLY0_SCRIPT12_D12128_ILLBE,〃,,,Vrátím se s jeho dílem!,Jeg kommer tilbage med hans brik!,"Ich komme wieder, mit dem Teilstück.",,Mi revenos... kun lia peco!,Volveré... ¡con su pieza!,,Tulen takaisin hänen osasensa kanssa!,"Je reviendrai, avec son fragment!","Visszatérek, mégpedig a darabkájával!","Ritornerò, con il suo pezzo!",欠片を持ってすぐ戻る!,녀석의 조각을 가지고 다시 올게!,"Ik kom terug, met zijn stuk!","Jeg kommer tilbake, med hans del!",Wrócę z jego kawałkiem!,"Eu voltarei, com a peça dele!",,"Mă voi întoarce, cu piesa lui.",Я достану его фрагмент!,,Jag kommer tillbaka med hans pjäs!,Onun parçasıyla geri döneceğim! -"The river of time moves forever onward, while you stand still.",TXT_DLG_SCRIPT12_D13644_THERI,〃,,,Řeka času plyne stále vpřed zatímco ty zůstáváš stát.,"Tidens flod bevæger sig for evigt fremad, mens du står stille.","Der Fluss der Zeit bewegt sich immer vorwärts, während du stillstehst.",,La tempofluo eterne iras antaŭen dum vi restas senmova.,La corriente del tiempo sigue adelante mientras tú sigues quieto.,,"Ajan virta liikkuu alati eteenpäin, samalla kun itse pysyt aloillasi.","La rivière du temps continue à couler, tandis que vous restez immobile.","Az idő folyója folyamat halad tovább, miközben te csak álldogállsz.","Il fiume del tempo scorre inesorabilmente, mentre tu rimani fermo.",事を措いても、時の河は永遠の先に進む。,"발버둥을 친다해도, 시간의 강은 계속 흐를 뿐.","De rivier van de tijd beweegt voor altijd verder, terwijl je stilstaat.","Tidens elv beveger seg evig fremover, mens du står stille.","Rzeka czasu płynie wiecznie, podczas gdy ty stoisz w miejscu.","O corrente do tempo se movimenta sempre adiante, enquanto você fica imóvel.",,"Râul timpului curge în permanență, în timp ce tu stai pe loc.","Река времени непрестанно течёт вперёд, в то время как ты стоишь без движения.",,"Tidens flod rör sig för evigt framåt, medan du står stilla.",Zaman nehri sonsuza dek ilerlerken sen duruyorsun. -"Pitiful man, you have done what thousands have failed to do... You bring me the power of the Sigil, the voice of the One God.",TXT_DLG_SCRIPT12_D15160_PITIF,MAP12: Oracle → After killing the Loremaster with Macil dead.,,,"Ubohý člověče, dokázal jsi to, co tisíce před tebou ne... Přinášíš mi moc Pečetě, hlas Jednoho boha.","Ynkelige mand, du har gjort, hvad tusindvis af mennesker ikke har formået... Du bringer mig Sigilets kraft, den ene Guds stemme.","Armseliger Wurm, du hast getan woran Tausende gescheitert sind... Du brachtest mir die Macht des Sigils, die Stimme des Einen Gottes.",,"Malestiminda homo, vi faris tion, kion miloj ne povis: vi portas ĉe mi la povon de la Sigelo, la voĉo de la Vera Dio.","Despreciable humano, has hecho lo que miles no han podido: traes ante mí el poder del Emblema, la voz del Dios Único.","Despreciable humano, lograste lo que miles no han podido: traes ante mí el poder del Emblema, la voz del Dios Único.","Kurja ihminen, olet tehnyt sen, missä tuhannet ovat epäonnistuneet: Olet tuonut minulle Sinetin voiman, Yhden Ainoan Jumalan äänen.","Pathétique mortel, vous avez réussi là où des milliers ont failli.. Vous m'amenez le pouvoir du Sigil, la voix du Seul Dieu.","Szánalmas kis pondró, megtetted amit emberek ezrei sem tudtak megtenni...elhoztad számomra a Pecsét erejét, az egy igaz isten hangját.","Patetico umano, sei riuscito a fare ciò che in migliaia hanno fallito nel compiere... Mi hai portato il potere del Sigillo, la voce dell'Unico Dio.","気の毒な者よ、お主は幾千の者達が +"I'll be back, with his piece!",TXT_RPLY0_SCRIPT12_D12128_ILLBE,〃,,,Vrátím se s jeho dílem!,Jeg kommer tilbage med hans brik!,"Ich komme wieder, mit dem Teilstück.",,Mi revenos... kun lia peco!,Volveré... ¡con su pieza!,,Tulen takaisin hänen osasensa kanssa!,"Je reviendrai, avec son fragment!",,"Visszatérek, mégpedig a darabkájával!","Ritornerò, con il suo pezzo!",欠片を持ってすぐ戻る!,녀석의 조각을 가지고 다시 올게!,"Ik kom terug, met zijn stuk!","Jeg kommer tilbake, med hans del!",Wrócę z jego kawałkiem!,"Eu voltarei, com a peça dele!",,"Mă voi întoarce, cu piesa lui.",Я достану его фрагмент!,,Jag kommer tillbaka med hans pjäs!,Onun parçasıyla geri döneceğim! +"The river of time moves forever onward, while you stand still.",TXT_DLG_SCRIPT12_D13644_THERI,〃,,,Řeka času plyne stále vpřed zatímco ty zůstáváš stát.,"Tidens flod bevæger sig for evigt fremad, mens du står stille.","Der Fluss der Zeit bewegt sich immer vorwärts, während du stillstehst.",,La tempofluo eterne iras antaŭen dum vi restas senmova.,La corriente del tiempo sigue adelante mientras tú sigues quieto.,,"Ajan virta liikkuu alati eteenpäin, samalla kun itse pysyt aloillasi.","La rivière du temps continue à couler, tandis que vous restez immobile.",,"Az idő folyója folyamat halad tovább, miközben te csak álldogállsz.","Il fiume del tempo scorre inesorabilmente, mentre tu rimani fermo.",事を措いても、時の河は永遠の先に進む。,"발버둥을 친다해도, 시간의 강은 계속 흐를 뿐.","De rivier van de tijd beweegt voor altijd verder, terwijl je stilstaat.","Tidens elv beveger seg evig fremover, mens du står stille.","Rzeka czasu płynie wiecznie, podczas gdy ty stoisz w miejscu.","O corrente do tempo se movimenta sempre adiante, enquanto você fica imóvel.",,"Râul timpului curge în permanență, în timp ce tu stai pe loc.","Река времени непрестанно течёт вперёд, в то время как ты стоишь без движения.",,"Tidens flod rör sig för evigt framåt, medan du står stilla.",Zaman nehri sonsuza dek ilerlerken sen duruyorsun. +"Pitiful man, you have done what thousands have failed to do... You bring me the power of the Sigil, the voice of the One God.",TXT_DLG_SCRIPT12_D15160_PITIF,MAP12: Oracle → After killing the Loremaster with Macil dead.,,,"Ubohý člověče, dokázal jsi to, co tisíce před tebou ne... Přinášíš mi moc Pečetě, hlas Jednoho boha.","Ynkelige mand, du har gjort, hvad tusindvis af mennesker ikke har formået... Du bringer mig Sigilets kraft, den ene Guds stemme.","Armseliger Wurm, du hast getan woran Tausende gescheitert sind... Du brachtest mir die Macht des Sigils, die Stimme des Einen Gottes.",,"Malestiminda homo, vi faris tion, kion miloj ne povis: vi portas ĉe mi la povon de la Sigelo, la voĉo de la Vera Dio.","Despreciable humano, has hecho lo que miles no han podido: traes ante mí el poder del Emblema, la voz del Dios Único.","Despreciable humano, lograste lo que miles no han podido: traes ante mí el poder del Emblema, la voz del Dios Único.","Kurja ihminen, olet tehnyt sen, missä tuhannet ovat epäonnistuneet: Olet tuonut minulle Sinetin voiman, Yhden Ainoan Jumalan äänen.","Pathétique mortel, vous avez réussi là où des milliers ont failli.. Vous m'amenez le pouvoir du Sigil, la voix du Seul Dieu.",,"Szánalmas kis pondró, megtetted amit emberek ezrei sem tudtak megtenni...elhoztad számomra a Pecsét erejét, az egy igaz isten hangját.","Patetico umano, sei riuscito a fare ciò che in migliaia hanno fallito nel compiere... Mi hai portato il potere del Sigillo, la voce dell'Unico Dio.","気の毒な者よ、お主は幾千の者達が 遂げられなかった行いを果たした... お主は我にシジルの力を、唯一神の声を届けた。","애처로운 자여, 지금껏 수천 명이 이루지 못했던 일을 해내었다... 나에게 시질의 힘을, 유일신의 목소리를 전해주는구나.","Jammer man, je hebt gedaan wat duizenden mensen niet hebben gedaan.... Je brengt me de kracht van de Sigil, de stem van de Ene God.","Stakkars mann, du har gjort det tusener har mislyktes med... Du gir meg sigillets kraft, stemmen til den ene guden.","Żałosny człowieku, dokonałeś tego, czego nie udało się zrobić tysiącom... Przynosisz mi moc Sigil, głos Jedynego Boga.","Que homem patético. Você fez o que milhares não conseguiram... Você me trouxe o poder do Sigilo, a voz do Deus Único.",,"Om jalnic, ai reușit ceea ce nu a reușit nimeni să facă.... Îmi aduci puterea Sigiliului, vocea Adevăratului Zeu.","Ничтожный человечишка, тебе удалось сделать то, с чем не справились тысячи... Ты принёс мне мощь Печати, глас Единого Бога.",,"Du har gjort vad tusentals har misslyckats med att göra... Du ger mig Sigillets kraft, den ende Gudens röst.","Zavallı adam, binlerce kişinin yapamadığını yaptın. Bana Sigil'in gücünü, Tek Tanrı'nın sesini getirdin." -I don't understand.,TXT_RPLY0_SCRIPT12_D15160_IDONT,〃,,,Nerozumím ti.,Jeg forstår ikke.,Ich verstehe nicht.,,Mi ne komprenas.,No entiendo.,,En ymmärrä.,Je ne comprends pas.,Nem értem.,Non capisco.,わからないな。,무슨 소리야?,Ik begrijp het niet.,Jeg forstår ikke.,Nie rozumiem.,Eu não entendo.,,Nu înțeleg.,Я не понимаю.,,Jag förstår inte.,Anlamıyorum. -The Sigil will open the door and free the spirit which will cleanse this planet and let me live forever. I will strip this world of its energies and find new worlds to conquer.,TXT_DLG_SCRIPT12_D16676_THESI,〃,,,"Pečeť otevře brány a uvolní duši, která očistí tuto planetu a dovolí mi žít navěky. Vysaju tento svět jeho sil a najdu další světy k podmanutí.","Sigilet vil åbne døren og frigøre ånden, som vil rense denne planet og lade mig leve for evigt. Jeg vil fratage denne verden dens energier og finde nye verdener at erobre.","Das Sigil wird die Tür öffnen und den Geist befreien, den Planeten läutern und mich für immer leben lassen. Ich werde dieser Welt alle Energie entziehen und neue Welten finden, um sie zu erobern.",,"La Sigelo malfermos la pordon kaj liberigos la spiriton, kiu elpurigos ĉi tiun planedon kaj ebligos al mi vivi eterne. Mi senigos ĉi tiun mondon je ĝia energio kaj mi trovos aliajn konkerotajn.",El Emblema abrirá la puerta y liberará al espíritu que limpiará este planeta y me dejará vivir eternamente. Despojaré este mundo de su energía y buscaré otros que conquistar.,El Emblema va a abrir la puerta y a liberar al espíritu que va a limpiar este planeta y a dejarme vivir eternamente. Voy a despojar este mundo de su energía y a buscar otros que conquistar.,"Sinetti aukaisee portin ja vapauttaa hengen, joka puhdistaa tämän planeetan ja antaa minun elää ikuisesti. Riisun tämän maailman sen energioista ja etsin uusia maailmoja vallattavaksi.",Le Sigil ouvrira la porte et libérera l'âme qui purifiera cette planète et me donnera la vie éternelle. J'arracherai toutes les énergies de ce monde et en trouverai d'autres à conquérir.,"A pecsét kinyitja az ajtót a lélek előtt, ami megtisztítja ezt a bolygót és örök életet biztosít számomra. Megfosztom ezt a világot az energiáitól, és továbblépek más világokba ha végeztem vele.",Il Sigillo aprirà la porta e libererà lo spirito che purificherà questo pianeta e mi lascerà vivere per sempre. Spoglierò questo mondo delle sue energie e troverò nuovi mondi da conquistare.,"シジルは門を開き、この惑星の魂を浄化し +I don't understand.,TXT_RPLY0_SCRIPT12_D15160_IDONT,〃,,,Nerozumím ti.,Jeg forstår ikke.,Ich verstehe nicht.,,Mi ne komprenas.,No entiendo.,,En ymmärrä.,Je ne comprends pas.,,Nem értem.,Non capisco.,わからないな。,무슨 소리야?,Ik begrijp het niet.,Jeg forstår ikke.,Nie rozumiem.,Eu não entendo.,,Nu înțeleg.,Я не понимаю.,,Jag förstår inte.,Anlamıyorum. +The Sigil will open the door and free the spirit which will cleanse this planet and let me live forever. I will strip this world of its energies and find new worlds to conquer.,TXT_DLG_SCRIPT12_D16676_THESI,〃,,,"Pečeť otevře brány a uvolní duši, která očistí tuto planetu a dovolí mi žít navěky. Vysaju tento svět jeho sil a najdu další světy k podmanutí.","Sigilet vil åbne døren og frigøre ånden, som vil rense denne planet og lade mig leve for evigt. Jeg vil fratage denne verden dens energier og finde nye verdener at erobre.","Das Sigil wird die Tür öffnen und den Geist befreien, den Planeten läutern und mich für immer leben lassen. Ich werde dieser Welt alle Energie entziehen und neue Welten finden, um sie zu erobern.",,"La Sigelo malfermos la pordon kaj liberigos la spiriton, kiu elpurigos ĉi tiun planedon kaj ebligos al mi vivi eterne. Mi senigos ĉi tiun mondon je ĝia energio kaj mi trovos aliajn konkerotajn.",El Emblema abrirá la puerta y liberará al espíritu que limpiará este planeta y me dejará vivir eternamente. Despojaré este mundo de su energía y buscaré otros que conquistar.,El Emblema va a abrir la puerta y a liberar al espíritu que va a limpiar este planeta y a dejarme vivir eternamente. Voy a despojar este mundo de su energía y a buscar otros que conquistar.,"Sinetti aukaisee portin ja vapauttaa hengen, joka puhdistaa tämän planeetan ja antaa minun elää ikuisesti. Riisun tämän maailman sen energioista ja etsin uusia maailmoja vallattavaksi.",Le Sigil ouvrira la porte et libérera l'âme qui purifiera cette planète et me donnera la vie éternelle. J'arracherai toutes les énergies de ce monde et en trouverai d'autres à conquérir.,,"A pecsét kinyitja az ajtót a lélek előtt, ami megtisztítja ezt a bolygót és örök életet biztosít számomra. Megfosztom ezt a világot az energiáitól, és továbblépek más világokba ha végeztem vele.",Il Sigillo aprirà la porta e libererà lo spirito che purificherà questo pianeta e mi lascerà vivere per sempre. Spoglierò questo mondo delle sue energie e troverò nuovi mondi da conquistare.,"シジルは門を開き、この惑星の魂を浄化し 我に永遠の命を授け給うのだ。我はこの世の 生命力を剥ぎ取り、新たなる星への征服に 駆り出すのだ。","시질은 잠겨저 있던 문을 열고, 이 세상을 정화할 혼령을 깨울 것이며, 나에게 영생을 선사할 것이다. 내가 이 세상의 기운을 모두 쓸어 담아 새로 정복할 세계를 찾아 나설 힘을 모을 것이다.",De Sigil zal de deur openen en de geest bevrijden die deze planeet zal reinigen en me voor altijd zal laten leven. Ik zal deze wereld van zijn energie ontdoen en nieuwe werelden vinden om te veroveren.,Sigllet vil åpne døren og frigjøre ånden som vil rense denne planeten og la meg leve evig. Jeg vil strippe denne verden for dens energier og finne nye verdener å erobre.,"Sigil otworzy drzwi i uwolni ducha, który oczyści tę planetę i pozwoli mi żyć wiecznie. Pozbawię ten świat jego energii i znajdę nowe światy do podbicia.",O Sigilo abrirá a porta e libertará o espirito que purificará este planeta e permitirá que eu viva para sempre. Arrancarei as energias deste mundo e encontrar novos mundos para conquistar.,,Sigiuliul va deschide ușa și elibera spiritul care va curăța planeta și mă va face nemuritor. Voi stoarce energia din planetă iar apoi voi găsi alte lumi de cucerit.,"Печать распахнёт дверь и высвободит сущность, что очистит эту планету и дарует мне вечную жизнь. Я выкраду всю энергию этого мира и отправлюсь на завоевание следующих.",,Sigillet kommer att öppna dörren och frigöra anden som kommer att rena den här planeten och låta mig leva för evigt. Jag kommer att beröva den här världen dess energier och hitta nya världar att erövra.,Sigil kapıyı açacak ve bu gezegeni temizleyecek ruhu serbest bırakacak ve sonsuza dek yaşamama izin verecek. Bu dünyayı enerjilerinden arındırıp fethedecek yeni dünyalar bulacağım. -I can't let you do that.,TXT_RPLY0_SCRIPT12_D16676_ICANT,〃,,,To ti nemůžu dovolit.,Det kan jeg ikke lade dig gøre.,Ich kann das nicht erlauben.,,"Mi ne povas lasi, ke vi faru tion.",No puedo dejarte hacer eso.,,En voi antaa sinun tehdä sitä.,Je ne peux pas vous laisser faire ça.,Csak a holttestemen keresztül.,Non te lo posso permettere.,そんな真似はさせられないな。,네 놈의 음모를 막겠다!,Dat kan ik je niet laten doen.,Jeg kan ikke la deg gjøre det.,Nie mogę ci na to pozwolić.,Não vou deixar você fazer isso.,,Nu te pot lăsa să faci asta.,Я не могу этого допустить.,,Jag kan inte låta dig göra det.,Bunu yapmana izin veremem. -You can if you're dead.,TXT_DLG_SCRIPT12_D18192_YOUCA,MAP12: Oracle → Fight with the Oracle.,,,"Můžeš, když zemřeš.","Det kan du, hvis du er død.","Du kannst, wenn du tot bist.",,Vi povas... se vi estas mortinta.,Puedes... si estás muerto.,,"Kyllä voit, jos olet kuollut.","Vous pouvez, une fois que vous êtes mort.",Ez megoldható.,Puoi... se sei morto!,お主の破滅は免れぬぞ。,네가 죽으면 될 것이다...,Dat kan je wel als je dood bent.,Du kan hvis du er død.,"Możesz, jeśli będziesz martwy.",Deixará se você estiver morto.,,"Poți, dacă ești mort.","Сможешь, когда умрёшь.",,Det kan du om du är död.,Ölürsen izin verebilirsin. -"Are you here to free us? Because I've been good, they took my implant out. I still have to stay down here and wipe up the drool though.",TXT_DLG_SCRIPT14_D0_AREYO,MAP14: James,,,"Jsi tu, abys nás vysvobodil? Za dobré chování mi můj implantát vyndali. Stále tu ale musím zůstat a utírat sliny.","Er du her for at befri os? Fordi jeg har været god, tog de mit implantat ud. Jeg er dog stadig nødt til at blive hernede og tørre savlen op.","Bist du hier, um uns zu befreien? Ich war gut, sie haben mein Implasntat herasusgenommen. Ich muss aber hier bleiben und den Sabber aufwischen.",,"Ĉu vi venis liberigi nin? Ili forprenis la enplantaĵon de mi ĉar mi estis obeema. Malgraŭ tio, mi devas resti ĉi-malsupre purigi.","¿Has venido a liberarnos? Como he sido bueno, me quitaron el implante, pero aun así tengo que quedarme aquí abajo a limpiar.","¿Viniste a liberarnos? Como he sido bueno, me quitaron el implante, pero aun así tengo que quedarme aquí abajo a limpiar.","Oletko tullut vapauttamaan meidät? Koska olen käyttäytynyt kiltisti, he poistivat istutteeni. Minun kuitenkin on jäätävä tänne pyyhkimään kuolaa.","Vous êtes venus nous libérer? Je me suis bien comporté! Il m'on retiré mon implant, il faut que je reste ici et que j'essuie la bave, par contre.","Azért vagy itt, hogy felszabadíts minket? Jó voltam, és elvették az implantátumomat. Mégis itt kell rohadnom és takarítanom ezt a nyálkát.","Sei qui per liberarci? Dato che mi sono comportato bene, mi hanno tolto l'impianto. Però devo ancora restare quaggiù a pulire.","俺達を解放しに来たのか?あいつらに +I can't let you do that.,TXT_RPLY0_SCRIPT12_D16676_ICANT,〃,,,To ti nemůžu dovolit.,Det kan jeg ikke lade dig gøre.,Ich kann das nicht erlauben.,,"Mi ne povas lasi, ke vi faru tion.",No puedo dejarte hacer eso.,,En voi antaa sinun tehdä sitä.,Je ne peux pas vous laisser faire ça.,,Csak a holttestemen keresztül.,Non te lo posso permettere.,そんな真似はさせられないな。,네 놈의 음모를 막겠다!,Dat kan ik je niet laten doen.,Jeg kan ikke la deg gjøre det.,Nie mogę ci na to pozwolić.,Não vou deixar você fazer isso.,,Nu te pot lăsa să faci asta.,Я не могу этого допустить.,,Jag kan inte låta dig göra det.,Bunu yapmana izin veremem. +You can if you're dead.,TXT_DLG_SCRIPT12_D18192_YOUCA,MAP12: Oracle → Fight with the Oracle.,,,"Můžeš, když zemřeš.","Det kan du, hvis du er død.","Du kannst, wenn du tot bist.",,Vi povas... se vi estas mortinta.,Puedes... si estás muerto.,,"Kyllä voit, jos olet kuollut.","Vous pouvez, une fois que vous êtes mort.",,Ez megoldható.,Puoi... se sei morto!,お主の破滅は免れぬぞ。,네가 죽으면 될 것이다...,Dat kan je wel als je dood bent.,Du kan hvis du er død.,"Możesz, jeśli będziesz martwy.",Deixará se você estiver morto.,,"Poți, dacă ești mort.","Сможешь, когда умрёшь.",,Det kan du om du är död.,Ölürsen izin verebilirsin. +"Are you here to free us? Because I've been good, they took my implant out. I still have to stay down here and wipe up the drool though.",TXT_DLG_SCRIPT14_D0_AREYO,MAP14: James,,,"Jsi tu, abys nás vysvobodil? Za dobré chování mi můj implantát vyndali. Stále tu ale musím zůstat a utírat sliny.","Er du her for at befri os? Fordi jeg har været god, tog de mit implantat ud. Jeg er dog stadig nødt til at blive hernede og tørre savlen op.","Bist du hier, um uns zu befreien? Ich war gut, sie haben mein Implasntat herasusgenommen. Ich muss aber hier bleiben und den Sabber aufwischen.",,"Ĉu vi venis liberigi nin? Ili forprenis la enplantaĵon de mi ĉar mi estis obeema. Malgraŭ tio, mi devas resti ĉi-malsupre purigi.","¿Has venido a liberarnos? Como he sido bueno, me quitaron el implante, pero aun así tengo que quedarme aquí abajo a limpiar.","¿Viniste a liberarnos? Como he sido bueno, me quitaron el implante, pero aun así tengo que quedarme aquí abajo a limpiar.","Oletko tullut vapauttamaan meidät? Koska olen käyttäytynyt kiltisti, he poistivat istutteeni. Minun kuitenkin on jäätävä tänne pyyhkimään kuolaa.","Vous êtes venus nous libérer? Je me suis bien comporté! Il m'on retiré mon implant, il faut que je reste ici et que j'essuie la bave, par contre.",,"Azért vagy itt, hogy felszabadíts minket? Jó voltam, és elvették az implantátumomat. Mégis itt kell rohadnom és takarítanom ezt a nyálkát.","Sei qui per liberarci? Dato che mi sono comportato bene, mi hanno tolto l'impianto. Però devo ancora restare quaggiù a pulire.","俺達を解放しに来たのか?あいつらに インプラントを外されたが、俺は大丈夫だ。 まだ少し留まって涎を拭き取らないとならない。","저희를 구출하기 위해서 찾아오셨나요? 그들이 제가 성실하게 일을 한 사례로 세뇌 장치를 때어갔어요. 그런데... 아직도 위험한 것 같은데, 좀 흘린 침 자국을 좀 닦아야 할 것 같아요.","Ben je hier om ons te bevrijden? Omdat ik goed ben geweest, hebben ze mijn implantaat eruit gehaald. Ik moet nog steeds hier beneden blijven en de kwijl echter wegvegen.",Er du her for å befri oss? Fordi jeg har vært snill. De fjernet implantatet mitt. Men jeg må fortsatt bli her nede og tørke opp siklet.,"Jesteś tu, by nas uwolnić? Ponieważ byłem dobry, wyjęli mi implant. Ale nadal muszę tu zostać i wytrzeć ślinę.","Você está aqui para nos libertar? Por eu ter me comportado bem, eles tiraram o meu implante. Mas ainda tenho que ficar aqui para limpar a saliva.",,"Ai venit ca să ne eliberezi? Pentru că am fost cuminte, mi-au scos implantul. Dar tot trebuie să rămân aici și să fac curățenie însă.","Ты пришёл спасти нас? Я был послушным, так что они вынули мой имплант. И всё равно я вынужден оставаться тут, внизу, и подтирать слюни.",,Är du här för att befria oss? För att jag har varit snäll tog de bort mitt implantat. Jag måste ändå stanna här nere och torka upp dreglet.,Bizi özgür bırakmak için mi buradasın? İyi olduğum için implantımı çıkardılar. Yine de burada kalıp salyamı silmem gerekiyor. -"Yes, I'm here to free you.",TXT_RPLY0_SCRIPT14_D0_YESIM,〃,,,"Ano, jsem tu, abych vás osvobodil.","Ja, jeg er her for at befri jer.","Ja, ich werde eiuch befreien.",,"Jes, mi venis liberigi vin.","Sí, he venido a liberaros.","Sí, vine a liberarlos.","Kyllä, tulin vapauttamaan teidät.","Oui, je viens vous libérer.","Igen, azért jöttem hogy kiszabadítsalak.","Sì, sono qui per liberarvi.",そうだ、助けに来た。,"그래, 난 널 구하러 왔어.","Ja, ik ben hier om je te bevrijden.","Ja, jeg er her for å befri dere.","Tak, jestem tu, żeby was uwolnić.","Sim, estou aqui para libertar vocês.",,"Da, am venit să te eliberez.","Да, я здесь, чтобы спасти вас.",,"Ja, jag är här för att befria er.","Evet, sizi kurtarmak için buradayım." -You mean it?,TXT_RYES0_SCRIPT14_D0_YOUME,〃,,,To myslíš doopravdy?,Mener du det?,Wirklich?,,Ĉu vere?,¿En serio?,,Todellako?,Vraiment?,Tényleg?,Veramente?,そういう意味か?,정말인가요?,Je meent het?,Mener du det?,Mówisz poważnie?,Sério mesmo?,,Pe bune?,Правда?,,Menar du det?,Ciddi misin? +"Yes, I'm here to free you.",TXT_RPLY0_SCRIPT14_D0_YESIM,〃,,,"Ano, jsem tu, abych vás osvobodil.","Ja, jeg er her for at befri jer.","Ja, ich werde eiuch befreien.",,"Jes, mi venis liberigi vin.","Sí, he venido a liberaros.","Sí, vine a liberarlos.","Kyllä, tulin vapauttamaan teidät.","Oui, je viens vous libérer.",,"Igen, azért jöttem hogy kiszabadítsalak.","Sì, sono qui per liberarvi.",そうだ、助けに来た。,"그래, 난 널 구하러 왔어.","Ja, ik ben hier om je te bevrijden.","Ja, jeg er her for å befri dere.","Tak, jestem tu, żeby was uwolnić.","Sim, estou aqui para libertar vocês.",,"Da, am venit să te eliberez.","Да, я здесь, чтобы спасти вас.",,"Ja, jag är här för att befria er.","Evet, sizi kurtarmak için buradayım." +You mean it?,TXT_RYES0_SCRIPT14_D0_YOUME,〃,,,To myslíš doopravdy?,Mener du det?,Wirklich?,,Ĉu vere?,¿En serio?,,Todellako?,Vraiment?,,Tényleg?,Veramente?,そういう意味か?,정말인가요?,Je meent het?,Mener du det?,Mówisz poważnie?,Sério mesmo?,,Pe bune?,Правда?,,Menar du det?,Ciddi misin? I can't help nobody else. Not until you blow up the transmitter. That's what's behind the forcefield upstairs. My job is to check on the conveyors to make sure they aren't jammed. Not anymore!,TXT_DLG_SCRIPT14_D1516_ICANT,"〃 -(conveyors = conveyor belts)",,,"Nemůžu nikomu jinému pomoct, ne dokud neodpálíš vysílačku, to je ta věc nahoře za silovým polem. Já mám za úkol kontrolovat pásy a dávat pozor, aby se nezasekly. Teď už ani náhodou!","Jeg kan ikke hjælpe nogen andre. Ikke før du sprænger senderen i luften. Det er det, der er bag kraftfeltet ovenpå. Mit job er at tjekke transportbåndene for at sikre mig, at de ikke er blokeret. Ikke længere!","Ich kann niemandem helfen. Nich bevor jemand den Transmitter hochjagt. Er ist hinter dem Kraftfeld da oben. Meine Aufgabe ist es, die Förderbänder zu prüfen um sicherzustellen, dass sie nicht blockieren. Jetzt nicht mehr!",,"Mi povas helpi neniun alian, ne dum la transmisiilo ne estos detruita; ĝi estas post la supretaĝa fortokampo. Mia laboro estas kontroli la transportajn bendojn por certiĝi, ke ili ne blokiĝis. Ne plu!","No puedo ayudar a nadie más, no hasta que destruyas el transmisor; eso es lo que está tras el campo de fuerza del piso de arriba. Mi trabajo es revisar las cintas transportadoras para asegurarme de que no estén atoradas. ¡Ya no más!",,"En voi auttaa ketään muuta. En, ennen kuin räjäytät lähettimen. Se se on, joka sijaitsee yläkerran voimakentän takana. Työni on pitää silmällä ja varmistaa, etteivät liukuhihnat jumiudu, enää!","Je ne peux pas aider qui que ce soit d'autre, du moins pas avant que vous détruisez le transmetteur. C'est la chose derrière le champ de force à l'étage. Mon travail est de faire en sorte que les tapis roulants ne se coincent pas, mais plus maintenant!","Nem tudok már másnak segíteni. Legalábbis nem amíg nem robbantod fel az adóállomást. Ez áll az erőpajzs mögött. Az Én feladatom, hogy ellenőrizzem a futószalagot nem akadt e be. Többé aztán nem!",Non posso aiutare nessun'altro. Non finché non fai saltare in aria il trasmettitore. È questo che c'è dietro il campo di forza di sopra. Il mio compito è asicurarmi che i nastri trasportatori non si intoppino. Non più!,"まだ俺は手伝うことが出来ない。 +(conveyors = conveyor belts)",,,"Nemůžu nikomu jinému pomoct, ne dokud neodpálíš vysílačku, to je ta věc nahoře za silovým polem. Já mám za úkol kontrolovat pásy a dávat pozor, aby se nezasekly. Teď už ani náhodou!","Jeg kan ikke hjælpe nogen andre. Ikke før du sprænger senderen i luften. Det er det, der er bag kraftfeltet ovenpå. Mit job er at tjekke transportbåndene for at sikre mig, at de ikke er blokeret. Ikke længere!","Ich kann niemandem helfen. Nich bevor jemand den Transmitter hochjagt. Er ist hinter dem Kraftfeld da oben. Meine Aufgabe ist es, die Förderbänder zu prüfen um sicherzustellen, dass sie nicht blockieren. Jetzt nicht mehr!",,"Mi povas helpi neniun alian, ne dum la transmisiilo ne estos detruita; ĝi estas post la supretaĝa fortokampo. Mia laboro estas kontroli la transportajn bendojn por certiĝi, ke ili ne blokiĝis. Ne plu!","No puedo ayudar a nadie más, no hasta que destruyas el transmisor; eso es lo que está tras el campo de fuerza del piso de arriba. Mi trabajo es revisar las cintas transportadoras para asegurarme de que no estén atoradas. ¡Ya no más!",,"En voi auttaa ketään muuta. En, ennen kuin räjäytät lähettimen. Se se on, joka sijaitsee yläkerran voimakentän takana. Työni on pitää silmällä ja varmistaa, etteivät liukuhihnat jumiudu, enää!","Je ne peux pas aider qui que ce soit d'autre, du moins pas avant que vous détruisez le transmetteur. C'est la chose derrière le champ de force à l'étage. Mon travail est de faire en sorte que les tapis roulants ne se coincent pas, mais plus maintenant!",,"Nem tudok már másnak segíteni. Legalábbis nem amíg nem robbantod fel az adóállomást. Ez áll az erőpajzs mögött. Az Én feladatom, hogy ellenőrizzem a futószalagot nem akadt e be. Többé aztán nem!",Non posso aiutare nessun'altro. Non finché non fai saltare in aria il trasmettitore. È questo che c'è dietro il campo di forza di sopra. Il mio compito è asicurarmi che i nastri trasportatori non si intoppino. Non più!,"まだ俺は手伝うことが出来ない。 トランスミッターを壊さなければバレてしまう。 そいつは上の階のフォースフィールドを越えた所 にいる。コンベアーの詰まりをチェックする だけの仕事だったが、もう辞任だな!",전송기를 파괴하기 전까지는 세뇌된 사람들을 도와줄 수가 없어요. 저 위층에 방어막에 보호받고 있는 채로 있습니다. 제 원래 업무는 광석이 끼지 않게 운반 벨트를 확인하는 거였어요... 이젠 일할 필요도 없지만!,Ik kan niemand anders helpen. Niet voordat je de zender hebt opgeblazen. Dat is wat er achter het krachtveld boven is. Het is mijn taak om de transportbanden te controleren om er zeker van te zijn dat ze niet vastzitten. Nu niet meer!,Jeg kan ikke hjelpe noen andre. Ikke før du sprenger senderen. Det er det som er bak kraftfeltet der oppe. Jobben min er å sjekke at transportbåndene ikke er blokkert. Ikke nå lenger!,"Nie mogę pomóc nikomu innemu. Nie, dopóki nie wysadzisz nadajnika. To jest to, co jest za polem siłowym na górze. Moim zadaniem jest sprawdzanie, czy przenośniki nie są zablokowane. Już nie!",Não posso ajudar mais ninguém. Não até que você detone o transmissor. É isso que mantém o campo de força lá em cima. Meu trabalho é conferir as esteiras para que não fiquem emperradas. Nunca mais!,,"Nu pot ajuta pe nimeni. Nu până ce transmițătorul nu e aruncat în aer. Asta e la etaj, în spatele scuturilor. Treaba mea e să mă uit după conveioare, să mă asigur că nu sunt defecte. Numai!","Я не могу помочь другим, пока ты не взорвёшь передатчик. Он находится за силовым полем наверху. Моя работа — проверять, не заклинило ли конвейеры. Теперь уже нет!",,Jag kan inte hjälpa någon annan. Inte förrän du spränger sändaren. Det är det som finns bakom kraftfältet på övervåningen. Mitt jobb är att kontrollera transportörerna så att de inte fastnar. Inte längre!,"Başka kimseye yardım edemem. Vericiyi patlatana kadar olmaz. Üst kattaki güç alanının arkasında bu var. Benim işim, sıkışmadıklarından emin olmak için konveyörleri kontrol etmek. Artık değil!" -"That's right, you're saved!",TXT_RPLY0_SCRIPT14_D1516_THATS,〃,,,"Ano, jsi zachráněn!","Det er rigtigt, du er reddet!","Das ist richtig, du bist in Sicherheit!",,"Ĝuste, vi estas savitaj!","Correcto, ¡estáis a salvo!","Correcto, ¡están a salvo!","Näin on, olet pelastettu!","C'est ça, vous êtes sauvé!","Így van, meg van mentve.","Esatto, sei salvo!",そうだ、救われたぞ!,당연하지. 너는 자유야!,"Dat klopt, je bent gered!","Det stemmer, du er reddet!","Tak jest, jesteś uratowany!",Isso mesmo. Vocês estão salvos!,,"Așa e, ești salvat!","Да, это так! Вы спасены!",,"Det stämmer, du är räddad!","Bu doğru, kurtuldun!" -"Oh, thank you!",TXT_RYES0_SCRIPT14_D1516_OHTHA,〃,,,"Oh, děkuju!","Åh, tak!","Oh, danke sehr!",,"Ho, dankon!","¡Ah, gracias!",,"Voi, kiitos!","Oh, merci!","Oh, köszönöm!","Oh, grazie!",おう、ありがとよ!,"오, 고마워요!","Oh, dank je wel!",Takk skal du ha!,"Och, dziękuję!","Ah, muito obrigado!",,"Oh, mulțumesc!",Ура! Спасибо тебе!,,"Åh, tack!","Oh, teşekkürler!" -We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D3032_WEREF,〃,,,Jsme volní! Jsme volní! Jsme volní!,Vi er fri!! Vi er fri!! Vi er fri!!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,自由だ!!俺達は自由だ!!俺達は自由だ!!,우린 자유야! 우린 자유라고!,We zijn vrij!! We zijn vrij!! We zijn vrij!!,Vi er fri! Vi er fri!! Vi er fri!!,Jesteśmy wolni!!! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! -Must mine more ore!,TXT_DLG_SCRIPT14_D4548_MUSTM,MAP14: Drone,,,Muset těžit další rudu!,Vi må udvinde mere malm!,Muss Erz abbauen.,,Mi elfosu pliajn minaĵojn!,¡Debo picar más mineral!,,Täytyy louhia lisää malmia!,Faut que je trouve plus de minerai!,Még több ércet kell bányászni!,Devo estrarre più minerale!,もっと掘らねえといけねえんだ!,광석을... 캐내야 해...,Moet erts meer of meer ontginnen!,Må utvinne mer malm!,Musimy wydobyć więcej rudy!,Preciso minerar mais!,,Mai trebuie să minez încă o bucată de minereu.,Нужно добыть больше руды!,,Måste bryta mer malm!,Daha fazla maden çıkarmalıyız! -We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D6064_WEREF,MAP14: Peasant (ex-drone),,,Jsme volní! Jsme volní! Jsme volní!,Vi er frie!! Vi er frie!!! Vi er frie!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,自由だ!!オレらは自由だ!!オレらは自由だ!!,프론트가 해냈다! 자유를 거의 되찾았어!,We zijn vrij!!! We zijn vrij!!! We zijn vrij!!!,Vi er fri!! Vi er frie!! Vi er fri!!,Jesteśmy wolni! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria!! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! -Must mine more ore!,TXT_DLG_SCRIPT14_D7580_MUSTM,〃,,,Muset těžit další rudu!,Skal udvinde mere malm!,Muss Erz abbauen.,,Mi elfosu pliajn minaĵojn!,¡Debo picar más mineral!,,Täytyy louhia lisää malmia!,Faut que je trouve plus de minerai!,Még több ércet kell bányászni!,Devo estrarre più minerale!,鉱石がもっと必要なんだ!,광석... 데그닌... 캔다...,Moet meer erts ontginnen!,Må utvinne mer malm!,Musimy wydobyć więcej rudy!,Preciso minerar mais!,,Mai trebuie să minez încă o bucată de minereu.,Нужно добыть больше руды!,,Måste bryta mer malm!,Daha fazla maden çıkarmalıyız! -We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D9096_WEREF,〃,,,Jsme volní! Jsme volní! Jsme volní!,Vi er frie!!! Vi er frie!!! Vi er frie!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,自由だ!!私達は自由だ!!私達は自由だ!!,살았군요. 이제 저항군 기지로 향하는 일 밖엔 남지 않은 것 같아요.,We zijn vrij!!! We zijn vrij!!! We zijn vrij!!!,Vi er fri!! Vi er frie!! Vi er fri!!,Jesteśmy wolni!!! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria!! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! -Must mine more ore!,TXT_DLG_SCRIPT14_D10612_MUSTM,〃,,,Muset těžit další rudu!,Skal udvinde mere malm!,Muss Erz abbauen.,,Mi elfosu pliajn minaĵojn!,¡Debo picar más mineral!,,Täytyy louhia lisää malmia!,Faut que je trouve plus de minerai!,Még több ércet kell bányászni!,Devo estrarre più minerale!,いつまで採掘しなければならない!,캐고... 캐고... 또 캔다...,Moet meer erts ontginnen!,Må utvinne mer malm!,Musimy wydobyć więcej rudy!,Preciso minerar mais!,,Mai trebuie să minez încă o bucată de minereu.,Нужно добыть больше руды!,,Måste bryta mer malm!,Daha fazla maden çıkarmalıyız! -We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D12128_WEREF,〃,,,Jsme volní! Jsme volní! Jsme volní!,Vi er frie!!! Vi er frie!!! Vi er frie!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,僕らは自由だ!!僕らは自由だ!!僕らは自由だ!!,살았다! 이제 그 놈들이 죽이기 전에 도망쳐야해요!,We zijn vrij!!! We zijn vrij!!! We zijn vrij!!!,Vi er fri!! Vi er frie!! Vi er frie!!,Jesteśmy wolni!!! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria!! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! -What are you doing here?,TXT_DLG_SCRIPT15_D0_WHATA,MAP15: Red acolytes.,,,Co tady děláte?,Hvad laver du her?,Was machst du hier?,,Kial vi estas ĉi tie?,¿Qué haces aquí?,,Mitä teette täällä?,Qu'est ce que vous faites ici?,Mit csinálsz itt?,Che cosa fai qui?,ここで何をしている?,여기서 뭘 하는거지?,Wat doe je hier?,Hva gjør dere her?,Co ty tu robisz?,O que você está fazendo aqui?,,Ce cauți aici?,По какому делу ты здесь?,,Vad gör du här?,Ne yapıyorsunuz burada? -Routine inspection.,TXT_RPLY0_SCRIPT15_D0_ROUTI,〃,,,Rutinní kontrola.,Rutinemæssig inspektion.,Eine Routineinspektion.,,Rutina inspektado.,Inspección de rutina.,,Rutiinitarkastus.,Inspection de routine.,Rutin ellenőrzés.,Ispezione ordinaria.,見回りだ。,정기적 검사요.,Routine-inspectie.,Rutinemessig inspeksjon.,Rutynowa inspekcja.,Inspeção de rotina.,,Inspecție de rutină.,Плановая проверка.,,Rutininspektion.,Rutin teftiş. -"All right, carry on.",TXT_RYES0_SCRIPT15_D0_ALLRI,〃,,,"Dobře, pokračujte.","Okay, fortsæt.","In Ordnung, mach weiter.",,"Bone, daŭrigu.","Muy bien, continúa.",,"Selvä on, jatkakaa.","D'accord, continuez.","Renben, folytasd csak.","Va bene, vai pure avanti.",わかった、続けろ。,"좋아, 계속해.","Oké, ga door.","Greit, fortsett.","W porządku, kontynuuj.","Muito bem, continue.",,"Bine, mergi mai departe.",Понятно. Продолжай.,,"Okej, fortsätt.","Pekala, devam edin." -"Nothing to report here. Everything is working fine. If anything goes wrong, I'll be sure to report it.",TXT_DLG_SCRIPT15_D1516_NOTHI,MAP15: Red acolytes + Technician at the beginning.,,,"Tady nic k nahlášení není. Všechno funguje dobře. Pokud se něco pokazí, nahlásím to.","Der er intet at rapportere her. Alt fungerer fint. Hvis noget går galt, skal jeg nok rapportere det.","Keine besonderen Vorkommnisse. Alles funktioniert wie es soll. Wenn irgendetwas schief geht, werde ich es sofort melden.",,"Nenio raportinda ĉi tie; ĉio funkcias ĝuste. Se io ajn malsukcesos, mi certe raportos ĝin.","Nada que reportar aquí; todo está funcionando bien. Si algo sale mal, me aseguraré de reportarlo.","Nada que reportar aquí; todo está funcionando bien. Si algo sale mal, me voy a asegurar de reportarlo.","Ei mitään raportoitavaa. Kaikki toimii hyvin. Jo mikään menee vialle, raportoin siitä varmasti.","Rien à signaler ici. Tout fonctionne comme prévu. Si quelque chose tombe en panne, je ferai un rapport.","Nincs semmi bejelentenivaló. Minden prímán működik. Ha esetleg valami meghibásodik, rögtön jelezni fogom.","Nulla da riportare qua. Tutto funziona come dovrebbe. Se qualcosa non dovesse funzionare, lo riporterò subito.","報告することはない。全て順調だ。 +"That's right, you're saved!",TXT_RPLY0_SCRIPT14_D1516_THATS,〃,,,"Ano, jsi zachráněn!","Det er rigtigt, du er reddet!","Das ist richtig, du bist in Sicherheit!",,"Ĝuste, vi estas savitaj!","Correcto, ¡estáis a salvo!","Correcto, ¡están a salvo!","Näin on, olet pelastettu!","C'est ça, vous êtes sauvé!",,"Így van, meg van mentve.","Esatto, sei salvo!",そうだ、救われたぞ!,당연하지. 너는 자유야!,"Dat klopt, je bent gered!","Det stemmer, du er reddet!","Tak jest, jesteś uratowany!",Isso mesmo. Vocês estão salvos!,,"Așa e, ești salvat!","Да, это так! Вы спасены!",,"Det stämmer, du är räddad!","Bu doğru, kurtuldun!" +"Oh, thank you!",TXT_RYES0_SCRIPT14_D1516_OHTHA,〃,,,"Oh, děkuju!","Åh, tak!","Oh, danke sehr!",,"Ho, dankon!","¡Ah, gracias!",,"Voi, kiitos!","Oh, merci!",,"Oh, köszönöm!","Oh, grazie!",おう、ありがとよ!,"오, 고마워요!","Oh, dank je wel!",Takk skal du ha!,"Och, dziękuję!","Ah, muito obrigado!",,"Oh, mulțumesc!",Ура! Спасибо тебе!,,"Åh, tack!","Oh, teşekkürler!" +We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D3032_WEREF,〃,,,Jsme volní! Jsme volní! Jsme volní!,Vi er fri!! Vi er fri!! Vi er fri!!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,自由だ!!俺達は自由だ!!俺達は自由だ!!,우린 자유야! 우린 자유라고!,We zijn vrij!! We zijn vrij!! We zijn vrij!!,Vi er fri! Vi er fri!! Vi er fri!!,Jesteśmy wolni!!! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! +Must mine more ore!,TXT_DLG_SCRIPT14_D4548_MUSTM,MAP14: Drone,,,Muset těžit další rudu!,Vi må udvinde mere malm!,Muss Erz abbauen.,,Mi elfosu pliajn minaĵojn!,¡Debo picar más mineral!,,Täytyy louhia lisää malmia!,Faut que je trouve plus de minerai!,,Még több ércet kell bányászni!,Devo estrarre più minerale!,もっと掘らねえといけねえんだ!,광석을... 캐내야 해...,Moet erts meer of meer ontginnen!,Må utvinne mer malm!,Musimy wydobyć więcej rudy!,Preciso minerar mais!,,Mai trebuie să minez încă o bucată de minereu.,Нужно добыть больше руды!,,Måste bryta mer malm!,Daha fazla maden çıkarmalıyız! +We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D6064_WEREF,MAP14: Peasant (ex-drone),,,Jsme volní! Jsme volní! Jsme volní!,Vi er frie!! Vi er frie!!! Vi er frie!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,自由だ!!オレらは自由だ!!オレらは自由だ!!,프론트가 해냈다! 자유를 거의 되찾았어!,We zijn vrij!!! We zijn vrij!!! We zijn vrij!!!,Vi er fri!! Vi er frie!! Vi er fri!!,Jesteśmy wolni! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria!! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! +Must mine more ore!,TXT_DLG_SCRIPT14_D7580_MUSTM,〃,,,Muset těžit další rudu!,Skal udvinde mere malm!,Muss Erz abbauen.,,Mi elfosu pliajn minaĵojn!,¡Debo picar más mineral!,,Täytyy louhia lisää malmia!,Faut que je trouve plus de minerai!,,Még több ércet kell bányászni!,Devo estrarre più minerale!,鉱石がもっと必要なんだ!,광석... 데그닌... 캔다...,Moet meer erts ontginnen!,Må utvinne mer malm!,Musimy wydobyć więcej rudy!,Preciso minerar mais!,,Mai trebuie să minez încă o bucată de minereu.,Нужно добыть больше руды!,,Måste bryta mer malm!,Daha fazla maden çıkarmalıyız! +We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D9096_WEREF,〃,,,Jsme volní! Jsme volní! Jsme volní!,Vi er frie!!! Vi er frie!!! Vi er frie!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,自由だ!!私達は自由だ!!私達は自由だ!!,살았군요. 이제 저항군 기지로 향하는 일 밖엔 남지 않은 것 같아요.,We zijn vrij!!! We zijn vrij!!! We zijn vrij!!!,Vi er fri!! Vi er frie!! Vi er fri!!,Jesteśmy wolni!!! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria!! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! +Must mine more ore!,TXT_DLG_SCRIPT14_D10612_MUSTM,〃,,,Muset těžit další rudu!,Skal udvinde mere malm!,Muss Erz abbauen.,,Mi elfosu pliajn minaĵojn!,¡Debo picar más mineral!,,Täytyy louhia lisää malmia!,Faut que je trouve plus de minerai!,,Még több ércet kell bányászni!,Devo estrarre più minerale!,いつまで採掘しなければならない!,캐고... 캐고... 또 캔다...,Moet meer erts ontginnen!,Må utvinne mer malm!,Musimy wydobyć więcej rudy!,Preciso minerar mais!,,Mai trebuie să minez încă o bucată de minereu.,Нужно добыть больше руды!,,Måste bryta mer malm!,Daha fazla maden çıkarmalıyız! +We're free!! We're free!! We're free!!,TXT_DLG_SCRIPT14_D12128_WEREF,〃,,,Jsme volní! Jsme volní! Jsme volní!,Vi er frie!!! Vi er frie!!! Vi er frie!!,Wir sind frei! Wir sind frei! Wir sind frei!,,Ni estas liberaj!! Liberaj!! Liberaj!!,¡¡Somos libres!! ¡¡Somos libres!! ¡¡Somos libres!!,,Olemme vapaat!! Olemme vapaat!! Olemme vapaat!!,On est libres! Libres! Libres!,,Szabadok vagyunk!! Szabadok vagyunk!! Szabadok vagyunk!!,Siamo liberi!! Siamo liberi!! Siamo liberi!!,僕らは自由だ!!僕らは自由だ!!僕らは自由だ!!,살았다! 이제 그 놈들이 죽이기 전에 도망쳐야해요!,We zijn vrij!!! We zijn vrij!!! We zijn vrij!!!,Vi er fri!! Vi er frie!! Vi er frie!!,Jesteśmy wolni!!! Jesteśmy wolni!!! Jesteśmy wolni!!!,Estamos livres!! Estamos livres!! Estamos livres!!,,Suntem liberi!! Suntem liberi!! Suntem liberi!!,Мы свободны! Мы свободны! Мы свободны!,,Vi är fria!! Vi är fria!! Vi är fria!!,Özgürüz! Özgürüz! Özgürüz! +What are you doing here?,TXT_DLG_SCRIPT15_D0_WHATA,MAP15: Red acolytes.,,,Co tady děláte?,Hvad laver du her?,Was machst du hier?,,Kial vi estas ĉi tie?,¿Qué haces aquí?,,Mitä teette täällä?,Qu'est ce que vous faites ici?,,Mit csinálsz itt?,Che cosa fai qui?,ここで何をしている?,여기서 뭘 하는거지?,Wat doe je hier?,Hva gjør dere her?,Co ty tu robisz?,O que você está fazendo aqui?,,Ce cauți aici?,По какому делу ты здесь?,,Vad gör du här?,Ne yapıyorsunuz burada? +Routine inspection.,TXT_RPLY0_SCRIPT15_D0_ROUTI,〃,,,Rutinní kontrola.,Rutinemæssig inspektion.,Eine Routineinspektion.,,Rutina inspektado.,Inspección de rutina.,,Rutiinitarkastus.,Inspection de routine.,,Rutin ellenőrzés.,Ispezione ordinaria.,見回りだ。,정기적 검사요.,Routine-inspectie.,Rutinemessig inspeksjon.,Rutynowa inspekcja.,Inspeção de rotina.,,Inspecție de rutină.,Плановая проверка.,,Rutininspektion.,Rutin teftiş. +"All right, carry on.",TXT_RYES0_SCRIPT15_D0_ALLRI,〃,,,"Dobře, pokračujte.","Okay, fortsæt.","In Ordnung, mach weiter.",,"Bone, daŭrigu.","Muy bien, continúa.",,"Selvä on, jatkakaa.","D'accord, continuez.",,"Renben, folytasd csak.","Va bene, vai pure avanti.",わかった、続けろ。,"좋아, 계속해.","Oké, ga door.","Greit, fortsett.","W porządku, kontynuuj.","Muito bem, continue.",,"Bine, mergi mai departe.",Понятно. Продолжай.,,"Okej, fortsätt.","Pekala, devam edin." +"Nothing to report here. Everything is working fine. If anything goes wrong, I'll be sure to report it.",TXT_DLG_SCRIPT15_D1516_NOTHI,MAP15: Red acolytes + Technician at the beginning.,,,"Tady nic k nahlášení není. Všechno funguje dobře. Pokud se něco pokazí, nahlásím to.","Der er intet at rapportere her. Alt fungerer fint. Hvis noget går galt, skal jeg nok rapportere det.","Keine besonderen Vorkommnisse. Alles funktioniert wie es soll. Wenn irgendetwas schief geht, werde ich es sofort melden.",,"Nenio raportinda ĉi tie; ĉio funkcias ĝuste. Se io ajn malsukcesos, mi certe raportos ĝin.","Nada que reportar aquí; todo está funcionando bien. Si algo sale mal, me aseguraré de reportarlo.","Nada que reportar aquí; todo está funcionando bien. Si algo sale mal, me voy a asegurar de reportarlo.","Ei mitään raportoitavaa. Kaikki toimii hyvin. Jo mikään menee vialle, raportoin siitä varmasti.","Rien à signaler ici. Tout fonctionne comme prévu. Si quelque chose tombe en panne, je ferai un rapport.",,"Nincs semmi bejelentenivaló. Minden prímán működik. Ha esetleg valami meghibásodik, rögtön jelezni fogom.","Nulla da riportare qua. Tutto funziona come dovrebbe. Se qualcosa non dovesse funzionare, lo riporterò subito.","報告することはない。全て順調だ。 何か問題が起きたら報告する。","보고할 게 전혀 없어. 모든 장치, 시설, 인력 모두 이상 무. 만약 하나라도 문제가 생기면 나에게 알려줘.","Hier valt niets te melden. Alles werkt prima. Als er iets misgaat, zal ik het zeker melden.","Ingenting å rapportere her. Alt fungerer som det skal. Hvis noe går galt, skal jeg rapportere det.","Nie ma o czym mówić. Wszystko działa jak należy. Jeśli coś będzie nie tak, na pewno to zgłoszę.","Não há nada de errado aqui. Tudo está funcionando perfeitamente. Se algo parar de funcionar, pode ter certeza que eu vou avisar.",,"Nimic de raportat aici. Dacă e ceva, cu siguranță că voi da raportul.","Тут не о чём докладывать. Всё работает превосходно. Если что-нибудь пойдёт не так, я обязательно доложу об этом.",,Inget att rapportera här. Allt fungerar bra. Om något går fel ska jag rapportera det.,"Burada rapor edilecek bir şey yok. Her şey yolunda gidiyor. Eğer bir sorun çıkarsa, rapor edeceğimden emin olabilirsiniz." -"Sir, there was a problem earlier, but it was taken care of.",TXT_DLG_SCRIPT15_D3032_SIRTH,MAP15: Technician at the beginning.,,,"Pane, předtím tu byl problém, ale vyřešili jsme jej.","Sir, der var et problem tidligere, men det blev ordnet.","Vor kurzem gab es ein Problem, aber das wurde bereits gelöst.",,"Sinjoro, estis problemo, sed ni jam solvis ĝin.","Señor, ha habido un problema antes, pero ya lo hemos solucionado.","Señor, hubo un problema antes, pero ya lo solucionamos.","Tässä aiemmin oli ongelma, mutta se ratkaistiin.","Monsieur, il y a eu un problème récemment mais nous l'avons corrigé.","Uram, volt korábban egy probléma, de megoldásra került.","Signore, c'era un problema prima, ma è stato risolto.","上官殿、以前より問題があったが、 +"Sir, there was a problem earlier, but it was taken care of.",TXT_DLG_SCRIPT15_D3032_SIRTH,MAP15: Technician at the beginning.,,,"Pane, předtím tu byl problém, ale vyřešili jsme jej.","Sir, der var et problem tidligere, men det blev ordnet.","Vor kurzem gab es ein Problem, aber das wurde bereits gelöst.",,"Sinjoro, estis problemo, sed ni jam solvis ĝin.","Señor, ha habido un problema antes, pero ya lo hemos solucionado.","Señor, hubo un problema antes, pero ya lo solucionamos.","Tässä aiemmin oli ongelma, mutta se ratkaistiin.","Monsieur, il y a eu un problème récemment mais nous l'avons corrigé.",,"Uram, volt korábban egy probléma, de megoldásra került.","Signore, c'era un problema prima, ma è stato risolto.","上官殿、以前より問題があったが、 もう心配はいらない。",안녕하십니까. 조금 전에 문제가 있었습니다만 경마한 문제였고 지금 해결됐습니다.,"Meneer, er was eerder een probleem, maar het is opgelost.","Sir, det var et problem tidligere, men det ble tatt hånd om.","Sir, wcześniej był problem, ale już się nim zajęto.","Senhor, havia um problema antes, mas já foi resolvido.",,"Domnule, a fost o problemă adineauri, dar s-a rezolvat.","Сэр, тут была одна неполадка, но её уже устранили.",,"Sir, det var ett problem tidigare, men det har tagits om hand.","Efendim, daha önce bir sorun vardı, ama halledildi." -Move along or taste metal.,TXT_DLG_SCRIPT17_D0_MOVEA,MAP17: Bailey (if you don't have Order's key),,,"Jdi dál, nebo okus ocel.",Fortsæt eller smag på metal.,Beweg dich oder spüre meinen Stahl.,,Plue movu vin aŭ gustumu kuglojn.,Esfúmate o come plomo.,,"Jatka matkaasi, tai maista metallia.",Bougez ou préparez-vous à goûter de l'acier.,"Haladj tovább, vagy ízleld meg a kardom.",Sparisci o ti finisce male.,同行か鉄を味わうかだ。,탄창으로 맞고 싶지 않으면 움직여.,Ga verder of proef metaal.,Gå videre eller smak på metall.,Ruszaj się albo skosztuj metalu.,Vá embora ou vai tomar chumbo grosso.,,Mișcă-te sau mănânci metal.,"Прочь, или отведаешь металла.",,Gå vidare eller smaka på metall.,İlerleyin ya da metalin tadına bakın. -I.D. check.,TXT_DLG_SCRIPT17_D1516_IDCHE,〃 (if you have it),,,Doklady.,ID-tjek.,Ausweisüberprüfung.,,Kontrolo de identigilo.,Comprobación de identificación.,,Henkilöllisyystarkastus.,Vérification de carte d'identité.,Igazolvány ellenőrzés.,Verifica d'identità.,I.D.チェックだ。,신분증 확인.,I.D. check.,Legitimasjonskontroll.,Sprawdzenie tożsamości.,Verificação de identidade.,,Verificare card de identitate.,Ваши документы.,,ID-kontroll.,Kimlik kontrolü. -"Here, I'm in a hurry.",TXT_RPLY0_SCRIPT17_D1516_HEREI,〃 (〃),,,"Tady, spěchám.","Her, jeg har travlt.","Hier, ich hab's eilig.",,"Jen, mi hastas.","Toma, que tengo prisa.","Toma, que estoy apurado.","Tässä, minulla on kiire.","Voilà, je suis pressé.","Nesze, nem érek rá.","Ecco qua, vado di fretta.",ほら、急いでるんだ。,여기요. 급하니 빨리 확인해주세요.,Hier heb ik haast.,"Her, jeg har dårlig tid.",Spieszę się.,"Pegue, estou com pressa.",,"Aici, mă grăbesc.",Вот. Я тороплюсь.,,"Här, jag har bråttom.","Al, acelem var." -Stop waving your ID in my face and go in.,TXT_DLG_SCRIPT17_D3032_STOPW,〃 (〃),,,Přestaň mi tu mávat tou kartou a jdi dovnitř.,Hold op med at vifte med dit ID i mit ansigt og gå ind.,Hör auf mit deinem Ausweis vor meinem Gesicht herumzufuchteln und geh hinein.,,Ĉesu skui vian identigilon super mia vizaĝo kaj eniru.,Ya deja de sacudirme la identificación en la cara y entra.,,Lakkaa heiluttelemasta tunnistettasi päin naamaa ja mene sisään.,Arrêtez de l'agiter dans ma figure et passez.,Ne lobogtasd az igazolványodat az arcomba és menj be.,Smettila di sventolarmela in faccia e vai avanti.,目前まで近づけるな、さっさと行け。,얼굴 앞에서 신분증 그만 흔들고 얼른 들어가.,Stop met je ID in mijn gezicht te zwaaien en ga naar binnen.,Slutt å vifte med legitimasjonen og gå inn.,Przestań machać mi przed nosem swoim dowodem i wejdź.,Pare de sacudir a sua identificação e entre logo.,,Nu mai flutura cardul în fața mea și intră.,Прекрати махать своей карточкой перед моим лицом и проходи.,,Sluta vifta med ditt ID-kort i ansiktet på mig och gå in.,Kimliğini yüzüme karşı sallamayı bırak ve içeri gir. -Nothing to see here. Move along.,TXT_DLG_SCRIPT17_D4548_NOTHI,MAP17: Green guards.,,,Nic k vidění. Jdi dál.,Der er intet at se her. Gå videre.,Hier gibt es nichts zu sehen. Geh weiter.,,Nenio vidinda ĉi tie. Plue movu vin.,Nada que ver aquí. Sigue caminando.,,Täällä ei ole mitään nähtävää. Jatkakaa matkaa.,Rien à voir ici. Bougez.,Nincs itt semmi látnivaló. Mozgás tovább.,Non c'è niente da vedere qui. Gira al largo.,何事も無い。進め。,아무 일도 안 일어났다. 어서 움직여.,Hier is niets te zien. Ga verder.,Ingenting å se her. Gå videre.,Nie ma tu nic do oglądania. Ruszaj się.,Nada pra ver aqui. Vá embora.,,Nimic aici. Mișcă.,Тут не на что смотреть. Проваливай.,,Det finns inget att se här. Gå vidare.,Burada görecek bir şey yok. İlerleyin. -"What a healthy specimen. You don't need my help, do you?",TXT_DLG_SCRIPT17_D6064_WHATA,MAP17: Hospital → Quincy,,,"Takový zdravý exemplář! Moji pomoc nepotřebujete, že ne?","Sikke et sundt eksemplar. Du har ikke brug for min hjælp, vel?","Was für ein schönes Exemplar. Du brauchst meine Hilfe nicht, oder?",,"Kia sana specimeno. Vi ne bezonas mian helpon, ĉu?","Que espécimen más saludable. No necesitarás mi ayuda, ¿verdad?",,No siinäpä vasta mallitapaus. Et sattumoisin ole avun tarpeessa?,"Quel magnifique spécimen! Vous n'avez pas besoin de mon aide, si?","Micsoda jó erőben levő példány. Neked nem kell segítség, ugye?","Che esemplare sano. Non hai bisogno del mio aiuto, vero?","なんて活きの良い標本だ。 +Move along or taste metal.,TXT_DLG_SCRIPT17_D0_MOVEA,MAP17: Bailey (if you don't have Order's key),,,"Jdi dál, nebo okus ocel.",Fortsæt eller smag på metal.,Beweg dich oder spüre meinen Stahl.,,Plue movu vin aŭ gustumu kuglojn.,Esfúmate o come plomo.,,"Jatka matkaasi, tai maista metallia.",Bougez ou préparez-vous à goûter de l'acier.,,"Haladj tovább, vagy ízleld meg a kardom.",Sparisci o ti finisce male.,同行か鉄を味わうかだ。,탄창으로 맞고 싶지 않으면 움직여.,Ga verder of proef metaal.,Gå videre eller smak på metall.,Ruszaj się albo skosztuj metalu.,Vá embora ou vai tomar chumbo grosso.,,Mișcă-te sau mănânci metal.,"Прочь, или отведаешь металла.",,Gå vidare eller smaka på metall.,İlerleyin ya da metalin tadına bakın. +I.D. check.,TXT_DLG_SCRIPT17_D1516_IDCHE,〃 (if you have it),,,Doklady.,ID-tjek.,Ausweisüberprüfung.,,Kontrolo de identigilo.,Comprobación de identificación.,,Henkilöllisyystarkastus.,Vérification de carte d'identité.,,Igazolvány ellenőrzés.,Verifica d'identità.,I.D.チェックだ。,신분증 확인.,I.D. check.,Legitimasjonskontroll.,Sprawdzenie tożsamości.,Verificação de identidade.,,Verificare card de identitate.,Ваши документы.,,ID-kontroll.,Kimlik kontrolü. +"Here, I'm in a hurry.",TXT_RPLY0_SCRIPT17_D1516_HEREI,〃 (〃),,,"Tady, spěchám.","Her, jeg har travlt.","Hier, ich hab's eilig.",,"Jen, mi hastas.","Toma, que tengo prisa.","Toma, que estoy apurado.","Tässä, minulla on kiire.","Voilà, je suis pressé.",,"Nesze, nem érek rá.","Ecco qua, vado di fretta.",ほら、急いでるんだ。,여기요. 급하니 빨리 확인해주세요.,Hier heb ik haast.,"Her, jeg har dårlig tid.",Spieszę się.,"Pegue, estou com pressa.",,"Aici, mă grăbesc.",Вот. Я тороплюсь.,,"Här, jag har bråttom.","Al, acelem var." +Stop waving your ID in my face and go in.,TXT_DLG_SCRIPT17_D3032_STOPW,〃 (〃),,,Přestaň mi tu mávat tou kartou a jdi dovnitř.,Hold op med at vifte med dit ID i mit ansigt og gå ind.,Hör auf mit deinem Ausweis vor meinem Gesicht herumzufuchteln und geh hinein.,,Ĉesu skui vian identigilon super mia vizaĝo kaj eniru.,Ya deja de sacudirme la identificación en la cara y entra.,,Lakkaa heiluttelemasta tunnistettasi päin naamaa ja mene sisään.,Arrêtez de l'agiter dans ma figure et passez.,,Ne lobogtasd az igazolványodat az arcomba és menj be.,Smettila di sventolarmela in faccia e vai avanti.,目前まで近づけるな、さっさと行け。,얼굴 앞에서 신분증 그만 흔들고 얼른 들어가.,Stop met je ID in mijn gezicht te zwaaien en ga naar binnen.,Slutt å vifte med legitimasjonen og gå inn.,Przestań machać mi przed nosem swoim dowodem i wejdź.,Pare de sacudir a sua identificação e entre logo.,,Nu mai flutura cardul în fața mea și intră.,Прекрати махать своей карточкой перед моим лицом и проходи.,,Sluta vifta med ditt ID-kort i ansiktet på mig och gå in.,Kimliğini yüzüme karşı sallamayı bırak ve içeri gir. +Nothing to see here. Move along.,TXT_DLG_SCRIPT17_D4548_NOTHI,MAP17: Green guards.,,,Nic k vidění. Jdi dál.,Der er intet at se her. Gå videre.,Hier gibt es nichts zu sehen. Geh weiter.,,Nenio vidinda ĉi tie. Plue movu vin.,Nada que ver aquí. Sigue caminando.,,Täällä ei ole mitään nähtävää. Jatkakaa matkaa.,Rien à voir ici. Bougez.,,Nincs itt semmi látnivaló. Mozgás tovább.,Non c'è niente da vedere qui. Gira al largo.,何事も無い。進め。,아무 일도 안 일어났다. 어서 움직여.,Hier is niets te zien. Ga verder.,Ingenting å se her. Gå videre.,Nie ma tu nic do oglądania. Ruszaj się.,Nada pra ver aqui. Vá embora.,,Nimic aici. Mișcă.,Тут не на что смотреть. Проваливай.,,Det finns inget att se här. Gå vidare.,Burada görecek bir şey yok. İlerleyin. +"What a healthy specimen. You don't need my help, do you?",TXT_DLG_SCRIPT17_D6064_WHATA,MAP17: Hospital → Quincy,,,"Takový zdravý exemplář! Moji pomoc nepotřebujete, že ne?","Sikke et sundt eksemplar. Du har ikke brug for min hjælp, vel?","Was für ein schönes Exemplar. Du brauchst meine Hilfe nicht, oder?",,"Kia sana specimeno. Vi ne bezonas mian helpon, ĉu?","Que espécimen más saludable. No necesitarás mi ayuda, ¿verdad?",,No siinäpä vasta mallitapaus. Et sattumoisin ole avun tarpeessa?,"Quel magnifique spécimen! Vous n'avez pas besoin de mon aide, si?",,"Micsoda jó erőben levő példány. Neked nem kell segítség, ugye?","Che esemplare sano. Non hai bisogno del mio aiuto, vero?","なんて活きの良い標本だ。 手当なんて必要なさそうだな、で何だ?","정말 건강한 표본이군. 아마 넌 내 도움이 필요하지 않을 거야, 그렇지?","Wat een gezond exemplaar. Je hebt mijn hulp niet nodig, of wel?",For et sunt eksemplar. Du trenger vel ikke min hjelp?,"Co za zdrowy okaz. Nie potrzebujesz mojej pomocy, prawda?","Mas que espécime mais saudável. Você não precisa da minha ajuda, precisa?",,"Ce specimen sănătos. Nu ai nevoie de ajutorul meu, nu?","Какой прекрасный образец. Тебе не нужна моя помощь, или нужна?",,"Vilket friskt exemplar. Du behöver inte min hjälp, eller hur?","Ne kadar sağlıklı bir örnek. Yardımıma ihtiyacın yok, değil mi?" -"Well, yes. Macil sent me.",TXT_RPLY0_SCRIPT17_D6064_WELLY,〃,,,Potřebuju. Poslal mě Macil.,"Jo, jo. Macil har sendt mig.","Nun, doch. Macil hat mich geschickt.",,"Nu, jes. Macil venigis min.","Bueno, sí. Macil me ha enviado.","Bueno, sí. Me manda Macil.","Itse asiassa, kyllä. Macil lähetti minut.","Eh bien, si, Macil m'envoie.","Nos, igen. Macil küldött.","Ecco, si. Mi ha mandato Macil.",そうだ。マシルの使者だ。,"뭐, 그렇지. 마실이 날 보냈으니까.","Nou, ja. Macil heeft me gestuurd.",Jo. Macil sendte meg.,No tak. Macil mnie przysłał.,"Bem, sim. Macil me enviou.",,Ba da. Macil m-a trimis.,"Ну, нужна. Я от Мэйсила.",,"Jo, jo. Macil skickade mig.","Evet, var. Beni Macil gönderdi." -"Shhhh... Keep it quiet, unless you want us both killed. Now, what can I do for you?",TXT_DLG_SCRIPT17_D7580_SHHHH,〃,,,"Pššš... Buď potichu, leda že bys nás oba chtěl nechat popravit. Tak, co pro tebe můžu udělat?","Shhhh... Hold det stille, medmindre du vil have os begge dræbt. Hvad kan jeg gøre for dig?","Psst... sei leise, oder willst du uns beide umbringen? Nun, was kann ich für dich tun?",,"Ŝŝ! Ne tiel laŭte se vi ne intencas, ke ni ambaŭ estu mortigitaj. Nu, kion mi faru por vi?","Shhhh... No tan alto, a menos que quieras que nos maten a ambos. Y bueno, ¿qué puedo hacer por ti?",,"Hyss, suuta soukemmalle, ellet halua tapattaa meitä molempia. No niin, miten voin auttaa?","Silence! Baissez de ton, sauf si vous voulez que l'on se fasse descendre tous le deux.. Que puis-je faire pour vous?","Shhhh...csak csendben, különben mindkettőnket megöletsz. Akkor, miben is segíthetek?","Shhhh... Fai piano, a meno che non vuoi farci ammazzare tutti e due. Ora, che posso fare per te?","シーッ...静かに、 +"Well, yes. Macil sent me.",TXT_RPLY0_SCRIPT17_D6064_WELLY,〃,,,Potřebuju. Poslal mě Macil.,"Jo, jo. Macil har sendt mig.","Nun, doch. Macil hat mich geschickt.",,"Nu, jes. Macil venigis min.","Bueno, sí. Macil me ha enviado.","Bueno, sí. Me manda Macil.","Itse asiassa, kyllä. Macil lähetti minut.","Eh bien, si, Macil m'envoie.",,"Nos, igen. Macil küldött.","Ecco, si. Mi ha mandato Macil.",そうだ。マシルの使者だ。,"뭐, 그렇지. 마실이 날 보냈으니까.","Nou, ja. Macil heeft me gestuurd.",Jo. Macil sendte meg.,No tak. Macil mnie przysłał.,"Bem, sim. Macil me enviou.",,Ba da. Macil m-a trimis.,"Ну, нужна. Я от Мэйсила.",,"Jo, jo. Macil skickade mig.","Evet, var. Beni Macil gönderdi." +"Shhhh... Keep it quiet, unless you want us both killed. Now, what can I do for you?",TXT_DLG_SCRIPT17_D7580_SHHHH,〃,,,"Pššš... Buď potichu, leda že bys nás oba chtěl nechat popravit. Tak, co pro tebe můžu udělat?","Shhhh... Hold det stille, medmindre du vil have os begge dræbt. Hvad kan jeg gøre for dig?","Psst... sei leise, oder willst du uns beide umbringen? Nun, was kann ich für dich tun?",,"Ŝŝ! Ne tiel laŭte se vi ne intencas, ke ni ambaŭ estu mortigitaj. Nu, kion mi faru por vi?","Shhhh... No tan alto, a menos que quieras que nos maten a ambos. Y bueno, ¿qué puedo hacer por ti?",,"Hyss, suuta soukemmalle, ellet halua tapattaa meitä molempia. No niin, miten voin auttaa?","Silence! Baissez de ton, sauf si vous voulez que l'on se fasse descendre tous le deux.. Que puis-je faire pour vous?",,"Shhhh...csak csendben, különben mindkettőnket megöletsz. Akkor, miben is segíthetek?","Shhhh... Fai piano, a meno che non vuoi farci ammazzare tutti e due. Ora, che posso fare per te?","シーッ...静かに、 殺されるかもしれないんだぞ。それで何か用か?","쉿... 죽기 싫으면 조용히 해. 자, 내가 뭘 도와줄까?","Shhhhhh.... Hou het stil, tenzij je wilt dat we allebei gedood worden. Wat kan ik nu voor u doen?","Vær stille, hvis du ikke vil at vi begge skal bli drept. Hva kan jeg gjøre for deg?","Cicho, chyba że chcesz nas obu zabić. Co mogę dla ciebie zrobić?","Shhhh... Fale baixo, a não ser que queira que nos matem. Agora, como posso te ajudar?",,"Șhhhh... Mai încet, dacă nu vrei să murim amândoi. Acum, ce pot face pentru tine?","Тсс... Тише, если не хочешь, чтобы нас обоих убили. Итак, чем я могу тебе помочь?",,"Shhhh... Håll tyst, om du inte vill att vi båda ska dödas. Vad kan jag göra för dig?","İkimizin de ölmesini istemiyorsan sessiz ol. Şimdi, senin için ne yapabilirim?" -Tell me how to find the Bishop.,TXT_RPLY0_SCRIPT17_D7580_TELLM,〃,,,"Řekni mi, jak najít Biskupa.","Fortæl mig, hvordan jeg finder biskoppen.","Sage mir, wie ich den Bischof finde.",,Diru kiel mi trovu la Episkopon.,Dime como encontrar al Obispo.,,"Kerro, miten löydän Piispan.",Où puis-je trouver l'évêque?,"Áruld el, hol találom meg a Püspököt.",Dimmi dove trovare il Vescovo.,ビショップは何処か聞きたい。,비숍을 어떻게 찾아야 하는지 알려줘.,Vertel me hoe ik de bisschop kan vinden.,Fortell meg hvordan jeg finner biskopen.,Powiedz mi jak znaleźć biskupa.,Diga onde eu encontro o Bispo.,,Spune-mi cum găsesc Episcopul.,"Скажи, как мне найти Епископа.",,Berätta hur jag hittar biskopen.,Bana Piskopos'u nasıl bulacağımı söyle. -"Ohhh, I knew you would ask me for that. Look behind you. That's the entrance to the Bishop's citadel. It's guarded by a force field that is only shut off for official visitors, not you.",TXT_DLG_SCRIPT17_D9096_OHHHI,〃,,,"Ohó, já věděl, že se mě na tohle zeptáš. Podívej se za sebe. To je vchod do Biskupovy citadely. Je střežená silovým polem, které se vypíná pouze kvůli oficiálním návštěvám, ne tobě.","Jeg vidste, du ville spørge mig om det. Se bag dig. Det er indgangen til biskoppens citadel. Den er bevogtet af et kraftfelt, der kun er lukket for officielle besøgende, ikke dig.","Oh, hab ich's doch geahnt, dass du mich das fragen würdest. Schau mal hinter dich. Dort ist der Eingang zu der Festung des Bischofs. Er ist durch ein Kraftfeld geschützt, welches sich nur für offizielle Besucher abschaltet und nicht für dich.",,"Ho, mi sciis, ke vi estis petonta tion. Rigardu malantaŭen tra la fenestro: tie estas la enirejo al la citadelo de la Episkopo. Ĝin baras fortokampo malŝaltinda nur por oficialaj vizitantoj, ne vi, ekzemple.","Ah, imaginaba que me ibas a pedir eso. Mira detrás de ti por la ventana: ahí está la entrada a la ciudadela del Obispo. La bloquea un campo de fuerza que solo se apaga para visitas oficiales, no tú, por ejemplo.",,"Oo, arvasin, että kysyisit sitä minulta. Katso taaksesi. Siellä on sisäänkäynti Piispan linnoitukseen. Sitä turvaa voimakenttä, joka kytketään pois päältä ainoastaan virallisille vieraille, ei sinulle.","Ohh, je savais que vous me demanderiez cela. Regardez derrière vous. C'est l'entrée de la citadelle de l'évêque. Elle est gardée par un champ de force qui ne s'ouvre que pour les visites officielles, pas vous.","Ohhh, tudtam, hogy ezt fogod kérdezni. Nézz csak magad mögé. Ez a püspök fellegvárához a bejárat. Egy erőpajzs védi, és csak hivatalos látogatóknak nyitják ki, aminek valljuk be Te nem igazán felelsz meg.","Ohhh, sapevo che me l'avresti chiesto. Guarda dietro di te. Quello è l'ingresso per la cittadella del Vescovo. È protetta da un campo di forza che viene disattivato solo per le visite ufficiali, quindi non per la tua.","おおぅ、そういう事だろうと思った。 +Tell me how to find the Bishop.,TXT_RPLY0_SCRIPT17_D7580_TELLM,〃,,,"Řekni mi, jak najít Biskupa.","Fortæl mig, hvordan jeg finder biskoppen.","Sage mir, wie ich den Bischof finde.",,Diru kiel mi trovu la Episkopon.,Dime como encontrar al Obispo.,,"Kerro, miten löydän Piispan.",Où puis-je trouver l'évêque?,,"Áruld el, hol találom meg a Püspököt.",Dimmi dove trovare il Vescovo.,ビショップは何処か聞きたい。,비숍을 어떻게 찾아야 하는지 알려줘.,Vertel me hoe ik de bisschop kan vinden.,Fortell meg hvordan jeg finner biskopen.,Powiedz mi jak znaleźć biskupa.,Diga onde eu encontro o Bispo.,,Spune-mi cum găsesc Episcopul.,"Скажи, как мне найти Епископа.",,Berätta hur jag hittar biskopen.,Bana Piskopos'u nasıl bulacağımı söyle. +"Ohhh, I knew you would ask me for that. Look behind you. That's the entrance to the Bishop's citadel. It's guarded by a force field that is only shut off for official visitors, not you.",TXT_DLG_SCRIPT17_D9096_OHHHI,〃,,,"Ohó, já věděl, že se mě na tohle zeptáš. Podívej se za sebe. To je vchod do Biskupovy citadely. Je střežená silovým polem, které se vypíná pouze kvůli oficiálním návštěvám, ne tobě.","Jeg vidste, du ville spørge mig om det. Se bag dig. Det er indgangen til biskoppens citadel. Den er bevogtet af et kraftfelt, der kun er lukket for officielle besøgende, ikke dig.","Oh, hab ich's doch geahnt, dass du mich das fragen würdest. Schau mal hinter dich. Dort ist der Eingang zu der Festung des Bischofs. Er ist durch ein Kraftfeld geschützt, welches sich nur für offizielle Besucher abschaltet und nicht für dich.",,"Ho, mi sciis, ke vi estis petonta tion. Rigardu malantaŭen tra la fenestro: tie estas la enirejo al la citadelo de la Episkopo. Ĝin baras fortokampo malŝaltinda nur por oficialaj vizitantoj, ne vi, ekzemple.","Ah, imaginaba que me ibas a pedir eso. Mira detrás de ti por la ventana: ahí está la entrada a la ciudadela del Obispo. La bloquea un campo de fuerza que solo se apaga para visitas oficiales, no tú, por ejemplo.",,"Oo, arvasin, että kysyisit sitä minulta. Katso taaksesi. Siellä on sisäänkäynti Piispan linnoitukseen. Sitä turvaa voimakenttä, joka kytketään pois päältä ainoastaan virallisille vieraille, ei sinulle.","Ohh, je savais que vous me demanderiez cela. Regardez derrière vous. C'est l'entrée de la citadelle de l'évêque. Elle est gardée par un champ de force qui ne s'ouvre que pour les visites officielles, pas vous.",,"Ohhh, tudtam, hogy ezt fogod kérdezni. Nézz csak magad mögé. Ez a püspök fellegvárához a bejárat. Egy erőpajzs védi, és csak hivatalos látogatóknak nyitják ki, aminek valljuk be Te nem igazán felelsz meg.","Ohhh, sapevo che me l'avresti chiesto. Guarda dietro di te. Quello è l'ingresso per la cittadella del Vescovo. È protetta da un campo di forza che viene disattivato solo per le visite ufficiali, quindi non per la tua.","おおぅ、そういう事だろうと思った。 後ろを見ろ。そこがビショップの大聖堂だ。 しかし要人以外は入れないよう フォースフィールドが張ってある、 君には通れないな。","호오오, 난 네가 그걸 물어볼 줄 알았어. 뒤를 돌아봐. 저건 비숍의 성채로 향하는 입구야. 방어막으로 덮여있는데 저걸 끌 수 있는 건 허가된 방문자뿐이야. 네가 아니라.","Ohhhh, ik wist dat je me dat zou vragen. Kijk achter je. Dat is de ingang van de bisschopsburcht. Het wordt bewaakt door een krachtveld dat alleen afgesloten is voor officiële bezoekers, niet voor jou.","Jeg visste du ville spørre om det. Se bak deg. Det er inngangen til biskopens citadell. Den er bevoktet av et kraftfelt som bare er stengt for offisielle besøkende, ikke deg.","Ohhh, wiedziałem, że mnie o to poprosisz. Spójrz za siebie. To wejście do cytadeli biskupa. Jest strzeżone przez pole siłowe, które jest wyłączane tylko dla oficjalnych gości, nie dla ciebie.","Ahhh, eu sabia que você me perguntaria isso. Olhe atrás de você. Essa é a entrada para a cidadela do Bispo. Ela é protegida por um campo de força que é desligada somente para visitantes oficiais, para você não.",,"Ohhh, știam eu că asta urma să mă întrebi. Aia e intrarea către citadela Episcopului. E apărată de un scut care se oprește numai pentru vizitatorii autorizați, nu pentru tine.","А-а-а, я знал, что ты спросишь об этом. Оглянись: это вход в цитадель Епископа. Он защищён силовым полем, которое отключается только для официальных посетителей, не для тебя.",,"Jag visste att du skulle be mig om det. Titta bakom dig. Det är ingången till biskopens citadell. Den är bevakad av ett kraftfält som bara stängs av för officiella besökare, inte för dig.","Benden bunu isteyeceğini biliyordum. Arkana bak. Bu Piskopos'un kalesinin girişi. Sadece resmi ziyaretçiler için kapatılan bir güç alanı tarafından korunuyor, sen değil." -I must kill the Bishop.,TXT_RPLY0_SCRIPT17_D9096_IMUST,〃,,,Musím zabít Biskupa.,Jeg må dræbe biskoppen.,Ich muss den Bischof töten.,,Mi devas mortigi la Episkopon.,Tengo que matar al Obispo.,,Minun on tapettava Piispa.,Je dois tuer l'évêque.,Meg kell ölnöm a Püspököt.,Devo uccidere il Vescovo.,ビショップを殺さなければならないんだ。,난 비숍을 죽여야만 해.,Ik moet de bisschop vermoorden.,Jeg må drepe biskopen.,Muszę zabić biskupa.,Preciso matar o Bispo.,,Trebuie să-l omor pe Episcop.,Я должен убить Епископа.,,Jag måste döda biskopen.,Piskoposu öldürmeliyim. -"Oh, sure you do. First, fight your way into the security complex and use the teleporter. And this might be more to your liking, destroy the computer in central administration. No computer, no force field.",TXT_DLG_SCRIPT17_D10612_OHSUR,〃,,,"No jistě že! Nejprve se probojuj do bezpečnostního komplexu a použij teleportér. A tohle by se ti mohlo více zamlouvat: Znič počítač v ústřední administraci. Žádný počítač, žádné pole.","Selvfølgelig skal du det. Først skal du kæmpe dig ind i sikkerhedskomplekset og bruge teleporteren. Og dette er måske mere efter din smag, ødelæg computeren i centraladministrationen. Ingen computer, intet kraftfelt.","Oh, aber klar doch. Erst kämpf dich bis zum Sicherheitskomplex durch und benutze den Teleporter. Und er nächste Schritt dürfte dir gefallen: zerstöre den Computer in der Hauptverwaltung. Kein Computer, kein Kraftfeld.",,"Ho, vi certe devas. Vi unue trabatu al vi la vojon en la sekurkomplekso kaj uzu la teleportilon. Vi eble pli ŝatos la duan parton: detruu la komputilon en la centra administrejo. Sen komputilo ne estas fortokampo.","Ah, seguro que sí. Primero ábrete camino por el complejo de seguridad y usa el teletransportador. Lo segundo puede que sea más de tu agrado: destruye el ordenador en la oficina de la administración central. Sin ordenador no hay campo de fuerza.","Ah, seguro que sí. Primero ábrete camino por el complejo de seguridad y usa el teletransportador. Lo segundo puede que sea más de tu agrado: destruye la computadora en la oficina de la administración central. Sin computadora no hay campo de fuerza.","Niinpä tietysti. Ensiksi taistele tiesi turvallisuuskeskukseen ja käytä kaukosiirrintä. Ja tämä saattaa olla ehkä enemmän sinun mieleesi: tuhoa tietokone keskushallinnossa. Ei tietokonetta, ei voimakenttää.","Oh, oui, bien sûr que vous devez. D'abord il faudra forcer le chemin vers le complexe de sécurité, puis utiliser le téléporteur. Ce qui vous plaira aussi, détruisez l'ordinateur dans le centre d'administration. Pas d'ordinateur, pas de champ de force.","Oh, persze persze. Előszöris, küzdd magad át a biztonsági komplexumig és használd a teleportert. Aztán - ami talán jobban fog tetszeni - tedd tönkre a számítógépet a központi adminisztráción. Ha nincs számítógép, nincs erőpajzs.","Oh, come no. Per cominciare, devi andare nel complesso di sicurezza e usare il teletrasporto là. E questo penso ti piacerà, devi distruggere il computer nell'amministrazione centrale. Niente computer, niente campo di forza.","ああ、だろうな。先にまず複合警備施設を +I must kill the Bishop.,TXT_RPLY0_SCRIPT17_D9096_IMUST,〃,,,Musím zabít Biskupa.,Jeg må dræbe biskoppen.,Ich muss den Bischof töten.,,Mi devas mortigi la Episkopon.,Tengo que matar al Obispo.,,Minun on tapettava Piispa.,Je dois tuer l'évêque.,,Meg kell ölnöm a Püspököt.,Devo uccidere il Vescovo.,ビショップを殺さなければならないんだ。,난 비숍을 죽여야만 해.,Ik moet de bisschop vermoorden.,Jeg må drepe biskopen.,Muszę zabić biskupa.,Preciso matar o Bispo.,,Trebuie să-l omor pe Episcop.,Я должен убить Епископа.,,Jag måste döda biskopen.,Piskoposu öldürmeliyim. +"Oh, sure you do. First, fight your way into the security complex and use the teleporter. And this might be more to your liking, destroy the computer in central administration. No computer, no force field.",TXT_DLG_SCRIPT17_D10612_OHSUR,〃,,,"No jistě že! Nejprve se probojuj do bezpečnostního komplexu a použij teleportér. A tohle by se ti mohlo více zamlouvat: Znič počítač v ústřední administraci. Žádný počítač, žádné pole.","Selvfølgelig skal du det. Først skal du kæmpe dig ind i sikkerhedskomplekset og bruge teleporteren. Og dette er måske mere efter din smag, ødelæg computeren i centraladministrationen. Ingen computer, intet kraftfelt.","Oh, aber klar doch. Erst kämpf dich bis zum Sicherheitskomplex durch und benutze den Teleporter. Und er nächste Schritt dürfte dir gefallen: zerstöre den Computer in der Hauptverwaltung. Kein Computer, kein Kraftfeld.",,"Ho, vi certe devas. Vi unue trabatu al vi la vojon en la sekurkomplekso kaj uzu la teleportilon. Vi eble pli ŝatos la duan parton: detruu la komputilon en la centra administrejo. Sen komputilo ne estas fortokampo.","Ah, seguro que sí. Primero ábrete camino por el complejo de seguridad y usa el teletransportador. Lo segundo puede que sea más de tu agrado: destruye el ordenador en la oficina de la administración central. Sin ordenador no hay campo de fuerza.","Ah, seguro que sí. Primero ábrete camino por el complejo de seguridad y usa el teletransportador. Lo segundo puede que sea más de tu agrado: destruye la computadora en la oficina de la administración central. Sin computadora no hay campo de fuerza.","Niinpä tietysti. Ensiksi taistele tiesi turvallisuuskeskukseen ja käytä kaukosiirrintä. Ja tämä saattaa olla ehkä enemmän sinun mieleesi: tuhoa tietokone keskushallinnossa. Ei tietokonetta, ei voimakenttää.","Oh, oui, bien sûr que vous devez. D'abord il faudra forcer le chemin vers le complexe de sécurité, puis utiliser le téléporteur. Ce qui vous plaira aussi, détruisez l'ordinateur dans le centre d'administration. Pas d'ordinateur, pas de champ de force.",,"Oh, persze persze. Előszöris, küzdd magad át a biztonsági komplexumig és használd a teleportert. Aztán - ami talán jobban fog tetszeni - tedd tönkre a számítógépet a központi adminisztráción. Ha nincs számítógép, nincs erőpajzs.","Oh, come no. Per cominciare, devi andare nel complesso di sicurezza e usare il teletrasporto là. E questo penso ti piacerà, devi distruggere il computer nell'amministrazione centrale. Niente computer, niente campo di forza.","ああ、だろうな。先にまず複合警備施設を 制圧してそこにあるテレポーターを使え。 君に合った方法だと思うが、テレポーター先の 中央管理部にあるコンピューターを潰せ。 コンピューターが無けれは、フォースも無しだ。 ","아, 그렇겠지. 먼저 보안단지에 들어가서 텔레포터를 이용해. 그리고 어쩌면 이건 네 취향일지도 모르겠군. 중앙 관리소에서 컴퓨터를 파괴해. 컴퓨터도 없애고, 방어막도 없애버리라고. \cy최근 상황을 보건대, 잠입 작전은 힘들 것 같아.","Oh, zeker weten. Vecht je eerst een weg naar het veiligheidscomplex en gebruik de teleporter. En dit kan meer naar uw zin zijn, vernietig de computer in de centrale administratie. Geen computer, geen krachtveld.","Klart du må. Først må du kjempe deg inn i sikkerhetskomplekset og bruke teleporteren. Og dette er kanskje mer etter din smak. Ødelegg datamaskinen i sentraladministrasjonen. Ingen datamaskin, intet kraftfelt.","Oczywiście, że tak. Najpierw pokonaj drogę do kompleksu bezpieczeństwa i użyj teleportera. A to może bardziej ci się spodoba, zniszcz komputer w centralnej administracji. Nie ma komputera, nie ma pola siłowego.","Ah, mas é claro que precisa. Primeiro, lute até o complexo de segurança e use o teletransportador. E acho que você vai gostar disto: destrua o computador na administração central. Sem computador, sem campo de força.",,"Oh, normal. Mai întâi, trebuie să te zbați să ajungi în complexul de securitate și să folosești teleportorul. Și asta s-ar putea să îți placă mai mult, distruge calculatorul din camera de administrare centrală. Niciun calculator, niciun câmp de forță.","О, не сомневаюсь. Для начала проберись в охранный комплекс и используй телепорт. И, что тебе должно больше понравиться, уничтожь компьютер в центральной администрации. Нет компьютера — нет силового поля.",,"Javisst, det måste du. Kämpa dig först in i säkerhetskomplexet och använd teleportern. Och det här kanske är mer till din smak, förstör datorn i centralförvaltningen. Ingen dator, inget kraftfält.","Tabii ki öldürmelisin. İlk olarak, güvenlik kompleksine girmek için savaş ve ışınlayıcıyı kullan. Ve bu daha çok hoşuna gidebilir, merkezi yönetimdeki bilgisayarı yok et. Bilgisayar yoksa, güç alanı da yok." -"Great, that sounds easy.",TXT_RPLY0_SCRIPT17_D10612_GREAT,〃,,,"Super, to zní snadně.","Fint, det lyder nemt.","Großartig, das klingt doch einfach.",,"Bonege, tio ŝajnas facila.","Genial, suena fácil.",,"Loistavaa, kuulostaa helpolta.","Bien, ça à l'air facile.","Remek, ez könnyűnek hangzik.","Ottimo, sembra facile.",そりゃいい、簡単そうだな。,"좋아, 쉬운 일인 것 같군.","Geweldig, dat klinkt gemakkelijk.","Flott, det høres enkelt ut.","Wspaniale, to brzmi łatwo.",Ótimo. Isso parece fácil.,,"Grozav, sună simplu.","Здорово, звучит легко.",,"Bra, det låter enkelt.","Harika, kulağa kolay geliyor." +"Great, that sounds easy.",TXT_RPLY0_SCRIPT17_D10612_GREAT,〃,,,"Super, to zní snadně.","Fint, det lyder nemt.","Großartig, das klingt doch einfach.",,"Bonege, tio ŝajnas facila.","Genial, suena fácil.",,"Loistavaa, kuulostaa helpolta.","Bien, ça à l'air facile.",,"Remek, ez könnyűnek hangzik.","Ottimo, sembra facile.",そりゃいい、簡単そうだな。,"좋아, 쉬운 일인 것 같군.","Geweldig, dat klinkt gemakkelijk.","Flott, det høres enkelt ut.","Wspaniale, to brzmi łatwo.",Ótimo. Isso parece fácil.,,"Grozav, sună simplu.","Здорово, звучит легко.",,"Bra, det låter enkelt.","Harika, kulağa kolay geliyor." "There's an advantage to destroying the computer, that's where the plans to the tower are kept. Can you say, five finger discount? Heh heh!",TXT_DLG_SCRIPT17_D12128_THERE,"〃 -(five-finger discount = theft)",,,Zničení toho počítače má výhodu: Na tom samém místě jsou uschovány plány věže. Co říkáš na takovou koupi za pět prstů? Haha!,"Der er en fordel ved at ødelægge computeren, det er der, hvor planerne til tårnet opbevares. Kan du sige, fem fingre rabat? Heh heh!","Es hätte sein Gutes, den Computer zu zerstören, denn dort sind auch die Pläne für den Turm. Kannst du sagen: Mitgehen lassen? Hehe!",,"Detrui la komputilon havas profiton: en ĝi estas konservitaj la planoj de la turo. Estus bedaŭrinde, ke ili malaperus... Ha ha!","Hay una ventaja al destruir el ordenador: ahí se guardan los planos de la torre. Suena ideal para gente con las manos largas... ¡Je, je!","Hay una ventaja al destruir la computadora: ahí se guardan los planos de la torre. Suena ideal para gente con las manos largas... ¡Je, je!","Tietokoneen tuhoamisessa on etunsa; siinä pidetään tornin piirustuksia. Sanottaisiinko, kaupanpäällisinä? Hehheh!",Ce serait avantageux de détruire l'ordinateur car c'est là qu'ils gardent les plans de la tour. C'est facile d'avoir ça gratuitement quand on peut juste les prendre comme ça!,"Van amúgy egy előnye a számítógép szobának, ott tartják ugyanis a torony terveit ott tárolják. Mi lenne mondjuk ha véletlen magaddal hoznád őket? heh heh!",Sarebbe vantaggioso distruggere il computer perché è lì che tengono i piani per la torre. È facile ottenerli gratuitamente quando puoi prenderli in questo modo! Heh heh!,"コンピューターを潰す利点はな、 +(five-finger discount = theft)",,,Zničení toho počítače má výhodu: Na tom samém místě jsou uschovány plány věže. Co říkáš na takovou koupi za pět prstů? Haha!,"Der er en fordel ved at ødelægge computeren, det er der, hvor planerne til tårnet opbevares. Kan du sige, fem fingre rabat? Heh heh!","Es hätte sein Gutes, den Computer zu zerstören, denn dort sind auch die Pläne für den Turm. Kannst du sagen: Mitgehen lassen? Hehe!",,"Detrui la komputilon havas profiton: en ĝi estas konservitaj la planoj de la turo. Estus bedaŭrinde, ke ili malaperus... Ha ha!","Hay una ventaja al destruir el ordenador: ahí se guardan los planos de la torre. Suena ideal para gente con las manos largas... ¡Je, je!","Hay una ventaja al destruir la computadora: ahí se guardan los planos de la torre. Suena ideal para gente con las manos largas... ¡Je, je!","Tietokoneen tuhoamisessa on etunsa; siinä pidetään tornin piirustuksia. Sanottaisiinko, kaupanpäällisinä? Hehheh!",Ce serait avantageux de détruire l'ordinateur car c'est là qu'ils gardent les plans de la tour. C'est facile d'avoir ça gratuitement quand on peut juste les prendre comme ça!,,"Van amúgy egy előnye a számítógép szobának, ott tartják ugyanis a torony terveit ott tárolják. Mi lenne mondjuk ha véletlen magaddal hoznád őket? heh heh!",Sarebbe vantaggioso distruggere il computer perché è lì che tengono i piani per la torre. È facile ottenerli gratuitamente quando puoi prenderli in questo modo! Heh heh!,"コンピューターを潰す利点はな、 奴等の塔へ送られる情報もそれに保管されている。 それを万引き、とも言えるな?へヘッ!","컴퓨터를 파괴할 승산이 있을거야, 성채로 향하는 계획서가 있는 곳이니까. 물건 좀 빼돌려 본 적 있나? 헤헷!","Er is een voordeel aan het vernietigen van de computer, dat is waar de plannen om de toren te vernietigen worden bewaard. Kunt je zeggen, vijf vingers korting? Heh heh heh!","Det er en fordel med å ødelegge datamaskinen, det er der planene til tårnet er oppbevart. Kan du si, fem-finger-rabatt? Heh heh!","Jest jeszcze jedna zaleta zniszczenia komputera, to tam trzymane są plany wieży. Czy można powiedzieć, zniżka na pięć palców? Heh heh!","Há uma vantagem em destruir o computador. É nele onde ficam os planos da torre. É pegar e levar, hehehe!",,"Există un avantaj în distrugerea calculatorului, acolo sunt ținute schemele turnului. Poți spune, reducere la cinci degete? Ha ha!","В уничтожении компьютера есть ещё один плюс: планы башни хранятся там. Можно сказать, скидка на все сто? Хе-хе!",,"Det finns en fördel med att förstöra datorn, det är där ritningarna till tornet förvaras. Kan du säga femfingerrabatt? Heh heh!","Bilgisayarı yok etmenin bir avantajı var, kulenin planları orada tutuluyor. Beş parmak indirimi diyebilir misin? Heh heh!" -Anything else?,TXT_RPLY0_SCRIPT17_D12128_ANYTH,〃,,,Ještě něco dalšího?,Er der andet?,Noch etwas?,,Ĉu io alia?,¿Algo más?,,Onko jotain muuta?,Quoi d'autre?,Valami más még?,C'è dell'altro?,他にあるか?,뭐 다른건 없나?,Nog iets anders?,Noe annet?,Co jeszcze?,Mais alguma coisa?,,Altceva?,Что-нибудь ещё?,,Något annat?,Başka bir şey var mı? -"Oh well, word has it that the bailey's warehouse received a shipment of maulers, that's the weapon that vaporizes.",TXT_DLG_SCRIPT17_D13644_OHWEL,〃,,,"No, špitá se, že skladiště v opevnění obdrželo zásilku trhačů. To je ta zbraň, která vypařuje.","Nå ja, det siges, at Baileys lager har modtaget en sending maulers, det er det våben, der fordamper.","Nun, man sagt, dass im Lagerhaus eine Ladung Vernichter abgeliefert wurde, die Waffe die verdampft.",,"Nu, oni diras, ke la ĉi-loka magazeno ricevis mendon de polvigiloj, neniigaj armiloj.","Bueno, se dice que el almacén de por aquí ha recibido un envío de trituradores, que son unas armas que pulverizan.","Bueno, se dice que el almacén de por aquí recibió un envío de trituradores, que son unas armas que pulverizan.","No, tarina kertoo, että linnanpihan varastoon on saapunut erä moukareita; sitä asetta, joka haihduttaa.",Oh. La rumeur court que le dépôt du mur d'enceinte a reçu une cargaison de broyeurs. C'est l'arme qui vaporise les gens.,"Hát, az a hír járja, hogy érkezett pár közelharci fegyver a várfalnál levő raktárba. Ez az a fegyver ami rögtön elporlaszt.","Oh beh, ho sentito dire che il magazzino del bastione ha appena ricevuto un carico di Mauler, è l'arma che vaporizza.","そうだな、中庭の倉庫にマウラーが納品されたと +Anything else?,TXT_RPLY0_SCRIPT17_D12128_ANYTH,〃,,,Ještě něco dalšího?,Er der andet?,Noch etwas?,,Ĉu io alia?,¿Algo más?,,Onko jotain muuta?,Quoi d'autre?,,Valami más még?,C'è dell'altro?,他にあるか?,뭐 다른건 없나?,Nog iets anders?,Noe annet?,Co jeszcze?,Mais alguma coisa?,,Altceva?,Что-нибудь ещё?,,Något annat?,Başka bir şey var mı? +"Oh well, word has it that the bailey's warehouse received a shipment of maulers, that's the weapon that vaporizes.",TXT_DLG_SCRIPT17_D13644_OHWEL,〃,,,"No, špitá se, že skladiště v opevnění obdrželo zásilku trhačů. To je ta zbraň, která vypařuje.","Nå ja, det siges, at Baileys lager har modtaget en sending maulers, det er det våben, der fordamper.","Nun, man sagt, dass im Lagerhaus eine Ladung Vernichter abgeliefert wurde, die Waffe die verdampft.",,"Nu, oni diras, ke la ĉi-loka magazeno ricevis mendon de polvigiloj, neniigaj armiloj.","Bueno, se dice que el almacén de por aquí ha recibido un envío de trituradores, que son unas armas que pulverizan.","Bueno, se dice que el almacén de por aquí recibió un envío de trituradores, que son unas armas que pulverizan.","No, tarina kertoo, että linnanpihan varastoon on saapunut erä moukareita; sitä asetta, joka haihduttaa.",Oh. La rumeur court que le dépôt du mur d'enceinte a reçu une cargaison de broyeurs. C'est l'arme qui vaporise les gens.,,"Hát, az a hír járja, hogy érkezett pár közelharci fegyver a várfalnál levő raktárba. Ez az a fegyver ami rögtön elporlaszt.","Oh beh, ho sentito dire che il magazzino del bastione ha appena ricevuto un carico di Mauler, è l'arma che vaporizza.","そうだな、中庭の倉庫にマウラーが納品されたと 聞いた。その威力は相手を消滅させられる程だと。","음, 듣자 하니 성안 쪽 격납고에 마울러가 입고되었다더군. 뭐든지 날려버리는 무기 말이야. \cy흠. 이유 없이 그런 소문이 났을 리는 없을 테고... 나도 그 무기 하나만 가져다줘.","Nou ja, er wordt gezegd dat het magazijn van de bailey een zending maulers heeft ontvangen, dat is het wapen dat verdampt.",Ryktene sier at Borggårdens lager har fått en sending maulere. Det er våpenet som fordamper.,"Podobno do magazynu Bailey'a dotarła dostawa maulerów, czyli broni, która paruje.","Bem, dizem que o depósito recebeu um envio de desintegradores. Aquela arma que...desintegra.",,"Păi, vorba spune că depozitul din curtea interioară a primit un pachet de schiloditoare, asta e arma care vapozirează.","Скажем так: есть слух, что склад крепости получил партию Истязателей: оружия, которое «испепеляет».",,"Nåja, ryktet säger att Baileys lager har fått en leverans av maulers, det är vapnet som förångar.","Bailey'nin deposuna parçalayıcı sevkiyatı yapıldığı söyleniyor, buharlaştıran bir silah." -"Is that it, now?",TXT_RPLY0_SCRIPT17_D13644_ISTHA,〃,,,Je to už všechno?,Er det det nu?,War es das jetzt?,,"Temas pri tio, ĉu?","Conque eso es, ¿eh?",,Ja onko siinä nyt kaikki?,Vraiment?,Mi van már megint?,Tutto qui?,それはまだあるんだな?,이게 전부지?,"Is dat het, nu?",Er det alt?,"To wszystko, teraz?",Só isso?,,"Asta e, deci?",Теперь всё?,,Är det allt?,Bu kadar mı yani? -"Don't you know the meaning of the words ""get lost""?",TXT_DLG_SCRIPT17_D15160_DONTY,〃,,,Neznáš význam slova „zmizni“?,"Kender du ikke betydningen af ordene ""forsvind""?",Sagen dir die Worte „Verzieh dich“ etwas?,,Ĉu vi ne scias la signifon de «malaperu»?,¿No sabes lo que significa la palabra «esfúmate»?,,"Etkö tunne sanojen ""ala laputtaa"" merkitystä?",Vous ne connaîssez pas le sens du mot: « Dégage?»,"Melyik részét nem érted a ""húzz el""-nek?","Non conosci il significato delle parole, ""ora di andare""?",次の話はバレる前に'去れ'か?,"자네, “꺼져.”가 무슨 뜻인지는 알지?","Weet je niet wat de betekenis is van de woorden ""verdwalen""?","Vet du ikke hva som menes med ""stikk""?","Nie znasz znaczenia słowa ""zgubić się""?","Você não sabe o que significa a expressão ""se manda""?",,"Nu cunoști semnificația cuvântului ""dispari""?",Ты не знаешь значения слова «исчезни»?,,"Vet du inte vad ordet ""försvinna"" betyder?",Kaybol kelimesinin anlamını bilmiyor musun? -Talk to Quincy first. I'm not allowed to help anyone unless he says it's ok.,TXT_DLG_SCRIPT17_D16676_TALKT,MAP17: Hospital → Assistant,,,Promluvte si nejprve s Quincym. Já nemůžu nikomu pomáhat dokud to nepovolí.,"Tal med Quincy først. Jeg må ikke hjælpe nogen, medmindre han siger, at det er i orden.","Rede erst mit Quincy. Ich darf mit niemanden reden, solange er nicht sein OK gegeben hat.",,Vi unue parolu al Kvincio. Mi rajtas helpi neniun ĝis li aprobos tion.,Habla con Quincy primero. No se me permite ayudar a nadie a menos que él lo diga.,,"Puhu ensin Quincylle. En saa auttaa ketään, ellei hän anna siihen lupaa.",Parlez à Quincy d'abord. Je ne suis pas autorisé à aider qui que ce soit sans son autorisation.,"Beszélj Quincyvel először. Nem beszélhetek senkivel, amíg nem engedélyezi.",Parla con Quincy prima. Non sono autorizzato ad aiutare nessuno se prima lui non dà il permesso.,"先にクインシーと話を。彼から許可を +"Is that it, now?",TXT_RPLY0_SCRIPT17_D13644_ISTHA,〃,,,Je to už všechno?,Er det det nu?,War es das jetzt?,,"Temas pri tio, ĉu?","Conque eso es, ¿eh?",,Ja onko siinä nyt kaikki?,Vraiment?,,Mi van már megint?,Tutto qui?,それはまだあるんだな?,이게 전부지?,"Is dat het, nu?",Er det alt?,"To wszystko, teraz?",Só isso?,,"Asta e, deci?",Теперь всё?,,Är det allt?,Bu kadar mı yani? +"Don't you know the meaning of the words ""get lost""?",TXT_DLG_SCRIPT17_D15160_DONTY,〃,,,Neznáš význam slova „zmizni“?,"Kender du ikke betydningen af ordene ""forsvind""?",Sagen dir die Worte „Verzieh dich“ etwas?,,Ĉu vi ne scias la signifon de «malaperu»?,¿No sabes lo que significa la palabra «esfúmate»?,,"Etkö tunne sanojen ""ala laputtaa"" merkitystä?",Vous ne connaîssez pas le sens du mot: « Dégage?»,,"Melyik részét nem érted a ""húzz el""-nek?","Non conosci il significato delle parole, ""ora di andare""?",次の話はバレる前に'去れ'か?,"자네, “꺼져.”가 무슨 뜻인지는 알지?","Weet je niet wat de betekenis is van de woorden ""verdwalen""?","Vet du ikke hva som menes med ""stikk""?","Nie znasz znaczenia słowa ""zgubić się""?","Você não sabe o que significa a expressão ""se manda""?",,"Nu cunoști semnificația cuvântului ""dispari""?",Ты не знаешь значения слова «исчезни»?,,"Vet du inte vad ordet ""försvinna"" betyder?",Kaybol kelimesinin anlamını bilmiyor musun? +Talk to Quincy first. I'm not allowed to help anyone unless he says it's ok.,TXT_DLG_SCRIPT17_D16676_TALKT,MAP17: Hospital → Assistant,,,Promluvte si nejprve s Quincym. Já nemůžu nikomu pomáhat dokud to nepovolí.,"Tal med Quincy først. Jeg må ikke hjælpe nogen, medmindre han siger, at det er i orden.","Rede erst mit Quincy. Ich darf mit niemanden reden, solange er nicht sein OK gegeben hat.",,Vi unue parolu al Kvincio. Mi rajtas helpi neniun ĝis li aprobos tion.,Habla con Quincy primero. No se me permite ayudar a nadie a menos que él lo diga.,,"Puhu ensin Quincylle. En saa auttaa ketään, ellei hän anna siihen lupaa.",Parlez à Quincy d'abord. Je ne suis pas autorisé à aider qui que ce soit sans son autorisation.,,"Beszélj Quincyvel először. Nem beszélhetek senkivel, amíg nem engedélyezi.",Parla con Quincy prima. Non sono autorizzato ad aiutare nessuno se prima lui non dà il permesso.,"先にクインシーと話を。彼から許可を 得られない限りお助けすることは出来ません。",퀸시에게 먼저 물어보세요. 전 그가 괜찮다 하지 않는다면 아무것도 도울 수 없습니다.,"Praat eerst met Quincy. Ik mag niemand helpen, tenzij hij zegt dat het goed is.",Snakk med Quincy først. Jeg har ikke lov til å hjelpe noen med mindre han sier det er ok.,"Najpierw porozmawiaj z Quincy. Nie wolno mi nikomu pomagać, dopóki on nie powie, że to jest w porządku.",Fale com o Quincy primeiro. Não posso ajudar ninguém enquanto ele não autorizar.,,Vorbește cu Quincy mai întâi. Nu am permisiunea să ajut pe nimeni până nu spune că e în regulă.,"Сперва поговори с Куинси. Мне не позволено помогать кому-либо, пока он не разрешит.",,Prata med Quincy först. Jag får inte hjälpa någon om inte han säger att det är okej.,Önce Quincy ile konuş. O izin vermedikçe kimseye yardım edemem. -How how can I help you today?,TXT_DLG_SCRIPT17_D18192_HOWHO,〃,,,Jak vám mohu dnes pomoci?,Hvordan kan jeg hjælpe dig i dag?,Wie kann ich dir heute helfen?,,Kiel mi helpu vin hodiaŭ?,¿Cómo puedo ayudarte hoy?,,Miten voin olla avuksi tänään?,Comment puis-je vous aider aujourd'hui?,Ma miben segíthetek?,Come posso aiutarti oggi?,本日は何かお困りで?,오늘은 어떻게 도와드릴까요?,Hoe kan ik je vandaag helpen?,Hvordan kan jeg hjelpe deg i dag?,Jak mogę ci dzisiaj pomóc?,Como posso ajudá-lo hoje?,,Cu ce te pot ajuta azi?,Чем могу быть полезен?,,Hur kan jag hjälpa dig idag?,Bugün sana nasıl yardım edebilirim? -Med patch,TXT_RPLY0_SCRIPT17_D18192_MEDPA,〃,,,Obvazy,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekäärettä.,Pansement.,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Trusă de prim-ajutor.,Бинтами,,Medicinsk plåster,Med yama -Here's your patch.,TXT_RYES0_SCRIPT17_D18192_HERES,〃,,,Tady jsou.,Her er dit plaster.,Hier ist deine Bandage.,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreesi.,Voilà votre pansement.,Itt a tapaszod.,Ecco le tue bende.,これをどうぞ。,"의료 붕대 하나, 여기 있습니다.",Hier is je patch.,Her er lappen din.,Oto twój bandaż.,Aqui está sua compressa.,,Aici e trusa.,Вот твой набор бинтов.,,Här är ditt plåster.,İşte yaman. +How how can I help you today?,TXT_DLG_SCRIPT17_D18192_HOWHO,〃,,,Jak vám mohu dnes pomoci?,Hvordan kan jeg hjælpe dig i dag?,Wie kann ich dir heute helfen?,,Kiel mi helpu vin hodiaŭ?,¿Cómo puedo ayudarte hoy?,,Miten voin olla avuksi tänään?,Comment puis-je vous aider aujourd'hui?,,Ma miben segíthetek?,Come posso aiutarti oggi?,本日は何かお困りで?,오늘은 어떻게 도와드릴까요?,Hoe kan ik je vandaag helpen?,Hvordan kan jeg hjelpe deg i dag?,Jak mogę ci dzisiaj pomóc?,Como posso ajudá-lo hoje?,,Cu ce te pot ajuta azi?,Чем могу быть полезен?,,Hur kan jag hjälpa dig idag?,Bugün sana nasıl yardım edebilirim? +Med patch,TXT_RPLY0_SCRIPT17_D18192_MEDPA,〃,,,Obvazy,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekäärettä.,Pansement.,,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Trusă de prim-ajutor.,Бинтами,,Medicinsk plåster,Med yama +Here's your patch.,TXT_RYES0_SCRIPT17_D18192_HERES,〃,,,Tady jsou.,Her er dit plaster.,Hier ist deine Bandage.,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreesi.,Voilà votre pansement.,,Itt a tapaszod.,Ecco le tue bende.,これをどうぞ。,"의료 붕대 하나, 여기 있습니다.",Hier is je patch.,Her er lappen din.,Oto twój bandaż.,Aqui está sua compressa.,,Aici e trusa.,Вот твой набор бинтов.,,Här är ditt plåster.,İşte yaman. That is 15 gold my friend.,TXT_RNO0_SCRIPT17_D18192_THATI,〃,,,"To je patnáct zlatých, příteli.","Det er 15 guld, min ven.","Das macht 15 Gold, mein Freund.",,"Ili kostas dek kvin -da oro, amiko.","Son quince de oro, amigo.",,"Se saisi olla 15 kolikkoa, ystäväiseni.","15 pièces pour ça, mon ami.",Az bizony 15 arany lesz barátom.,Sono 15 pezzi d'oro amico mio.,15 ゴールド必要です。,"그건 15 골드입니다, 친구.","Dat is 15 goud, mijn vriend.","Det er 15 gull, min venn.","To jest 15 złota, mój przyjacielu.","Custa 15 moedas de ouro, meu amigo.",,Costă 15 monezi amice.,"Они стоят 15 золотых, друг.",,"Det är 15 guld, min vän.",Bu 15 altın dostum. -Medical kit,TXT_RPLY1_SCRIPT17_D18192_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku.,Kit médical.,Elsősegély doboz.,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Zestaw medyczny,Kit médico,,Kit de prim-ajutor.,Аптечкой,,Medicinsk utrustning,Tıbbi kit -Here's your medical kit.,TXT_RYES1_SCRIPT17_D18192_HERES,〃,,,Tady je.,Her er dit medicinske kit.,Hier ist dein Verbandskasten,,Jen via sukurkesto.,Aquí tienes tu botiquín.,,Tässä lääkintälaukkusi.,Voilà votre kit médical.,Itt az elsősegélydobozod.,Ecco il tuo kit medico.,こちらが 医療用キットです。,구급 키트입니다. 잘 쓰시길.,Hier is je medische uitrusting.,Her er førstehjelpsskrinet ditt.,Oto twój zestaw medyczny.,Aqui está o seu kit médico,,Aici e kitul.,Вот твоя аптечка.,,Här är ditt medicinska utrustning.,İşte tıbbi çantan. -You're a bit low on funds for that.,TXT_RNO1_SCRIPT17_D18192_YOURE,〃,,,Tu si nemůžete dovolit.,Du har lidt for få midler til det.,Du hast zu wenig Geld dafür.,,Mankas mono al vi.,Estás algo falto de dinero.,,Sinulla on varat hieman vähissä siihen.,Vous manquez d'argent pour ça.,Nincs elég pénzed ehhez.,Sei un po' a corto di fondi per quello.,その為の資金が少し足りません。,그거 사기엔 자금이 부족한 듯.,Je hebt daar een beetje weinig geld voor.,Du har litt lite penger til det.,Masz na to trochę mało funduszy.,Você está um pouco mal de dinheiro pra isso.,,Cam puțini bani pentru aia.,Тебе на это не хватает средств.,,Du har lite ont om pengar för det.,Bunun için biraz az paran var. -Field surgery kit,TXT_RPLY2_SCRIPT17_D18192_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku.,Kit de chirurgie.,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트.,Veld chirurgie kit,Kirurgisett,Zestaw do chirurgii polowej,Kit de cirurgia,,Kit chirurgical de teren.,Медкомплектом,,Fältkirurgisk utrustning,Saha ameliyat kiti -"One field surgery kit, done.",TXT_RYES2_SCRIPT17_D18192_ONEFI,〃,,,"Jedna souprava, zde.","Et kirurgisæt, færdig.","Ein Erste-Hilfe-Kasten, kommt sofort.",,Kirurgia kesto. Farite.,Un kit quirúrgico. Listo.,,"Yksi kirurgilaukku, noin.","Un kit de chirurgie, voilà.",Egy műtő felszerelés itt is van.,"Un kit chirurgico, eccolo qua.",野外用手術キット一丁。,수술 키트 하나 여기있습니다.,"Eén veldoperatiekit, klaar.","Ett kirurgisk sett, ferdig.","Jeden zestaw do chirurgii polowej, zrobione.",Um kit de cirurgia saindo,,"Un kit chirurgical de teren, gata.",Один медкомплект. Держи.,,"Ett fältkirurgiskt utrustning, klart.","Bir saha ameliyat kiti, tamamdır." +da oro, amiko.","Son quince de oro, amigo.",,"Se saisi olla 15 kolikkoa, ystäväiseni.","15 pièces pour ça, mon ami.",,Az bizony 15 arany lesz barátom.,Sono 15 pezzi d'oro amico mio.,15 ゴールド必要です。,"그건 15 골드입니다, 친구.","Dat is 15 goud, mijn vriend.","Det er 15 gull, min venn.","To jest 15 złota, mój przyjacielu.","Custa 15 moedas de ouro, meu amigo.",,Costă 15 monezi amice.,"Они стоят 15 золотых, друг.",,"Det är 15 guld, min vän.",Bu 15 altın dostum. +Medical kit,TXT_RPLY1_SCRIPT17_D18192_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku.,Kit médical.,,Elsősegély doboz.,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Zestaw medyczny,Kit médico,,Kit de prim-ajutor.,Аптечкой,,Medicinsk utrustning,Tıbbi kit +Here's your medical kit.,TXT_RYES1_SCRIPT17_D18192_HERES,〃,,,Tady je.,Her er dit medicinske kit.,Hier ist dein Verbandskasten,,Jen via sukurkesto.,Aquí tienes tu botiquín.,,Tässä lääkintälaukkusi.,Voilà votre kit médical.,,Itt az elsősegélydobozod.,Ecco il tuo kit medico.,こちらが 医療用キットです。,구급 키트입니다. 잘 쓰시길.,Hier is je medische uitrusting.,Her er førstehjelpsskrinet ditt.,Oto twój zestaw medyczny.,Aqui está o seu kit médico,,Aici e kitul.,Вот твоя аптечка.,,Här är ditt medicinska utrustning.,İşte tıbbi çantan. +You're a bit low on funds for that.,TXT_RNO1_SCRIPT17_D18192_YOURE,〃,,,Tu si nemůžete dovolit.,Du har lidt for få midler til det.,Du hast zu wenig Geld dafür.,,Mankas mono al vi.,Estás algo falto de dinero.,,Sinulla on varat hieman vähissä siihen.,Vous manquez d'argent pour ça.,,Nincs elég pénzed ehhez.,Sei un po' a corto di fondi per quello.,その為の資金が少し足りません。,그거 사기엔 자금이 부족한 듯.,Je hebt daar een beetje weinig geld voor.,Du har litt lite penger til det.,Masz na to trochę mało funduszy.,Você está um pouco mal de dinheiro pra isso.,,Cam puțini bani pentru aia.,Тебе на это не хватает средств.,,Du har lite ont om pengar för det.,Bunun için biraz az paran var. +Field surgery kit,TXT_RPLY2_SCRIPT17_D18192_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku.,Kit de chirurgie.,,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트.,Veld chirurgie kit,Kirurgisett,Zestaw do chirurgii polowej,Kit de cirurgia,,Kit chirurgical de teren.,Медкомплектом,,Fältkirurgisk utrustning,Saha ameliyat kiti +"One field surgery kit, done.",TXT_RYES2_SCRIPT17_D18192_ONEFI,〃,,,"Jedna souprava, zde.","Et kirurgisæt, færdig.","Ein Erste-Hilfe-Kasten, kommt sofort.",,Kirurgia kesto. Farite.,Un kit quirúrgico. Listo.,,"Yksi kirurgilaukku, noin.","Un kit de chirurgie, voilà.",,Egy műtő felszerelés itt is van.,"Un kit chirurgico, eccolo qua.",野外用手術キット一丁。,수술 키트 하나 여기있습니다.,"Eén veldoperatiekit, klaar.","Ett kirurgisk sett, ferdig.","Jeden zestaw do chirurgii polowej, zrobione.",Um kit de cirurgia saindo,,"Un kit chirurgical de teren, gata.",Один медкомплект. Держи.,,"Ett fältkirurgiskt utrustning, klart.","Bir saha ameliyat kiti, tamamdır." Come back when you have money!,TXT_RNO2_SCRIPT17_D18192_COMEB,〃,,,"Vrať se, až budeš mít peníze!","Kom tilbage, når du har penge!","Komm wieder, wenn du etwas Geld hast.",,"Revenu kiam vi havos monon!","¡Vuelve cuando -tengas dinero!",,"Tule takaisin, kun sinulla on rahaa!",Revenez quand vous avez des sous!,"Gyere vissza, ha már van elég pénzed.",Torna quando avrai del denaro!,余裕がある時にまたどうぞ!,돈이 좀 있을 때 돌아와요!,Kom terug als je geld hebt!,Kom tilbake når du har penger!,"Wróć, gdy będziesz miał pieniądze!",Volte quando tiver dinheiro!,,Întoarce-te când ai destui bani!,Возвращайся с деньгами!,,Kom tillbaka när du har pengar!,Paran olduğunda geri gel! -What is it?,TXT_DLG_SCRIPT18_D0_WHATI,MAP18: Yellow guard,,,Co je?,Hvad er det?,Was gibt es?,,Kio okazas?,¿Qué pasa?,,Mikä on?,Vous voulez quoi?,Az meg mi?,Che cos'è?,何事だ?,무슨 일이냐?,Wat is het?,Hva er det?,Co to jest?,O que foi?,,Ce e?,Что тебе нужно?,,Vad är det för nåt?,Ne oldu? -Just looking around.,TXT_RPLY0_SCRIPT18_D0_JUSTL,〃,,,Jen se poohlížím.,Jeg kigger bare rundt.,Ich schaue mich bloß um.,,Mi nur pririgardas.,Solo estoy mirando.,,Ihan vain katselen.,Je fais juste un tour.,Csak nézelődök.,Sto soltando guardando.,見周りしている。,그냥 둘러보는 중이었습니다.,Gewoon rondkijken.,Jeg ser meg bare rundt.,Rozglądam się.,Só dando uma olhada.,,Doar mă uit împrejur.,Просто осматриваюсь.,,Jag tittar bara runt.,Sadece etrafa bakıyorum. -Just keep out of the way.,TXT_RYES0_SCRIPT18_D0_JUSTK,〃,,,Prostě se drž z cesty.,Bare hold dig ude af vejen.,Sei einfach niemandem im Weg.,,Vi nur ne ĝenu nin.,Pero no nos estorbes.,,Kunhan vain pysyt pois tieltä.,Restez hors du chemin.,Csak ne legyél láb alatt.,Basta che non ti metti in mezzo.,この先は立入禁止だ。,그럼 방해하지마.,Blijf gewoon uit de weg.,Bare hold deg unna.,Trzymaj się z dala od drogi.,Apenas fique fora do caminho.,,Doar nu sta în cale.,Просто не путайся под ногами.,,Håll dig bara ur vägen.,Yoldan uzak dur. -The Templars will be here soon to pick up their new maulers. If you get in their way you're a dead man.,TXT_DLG_SCRIPT18_D1516_THETE,〃,,,"Templáři tu brzy budou vyzvednout si své nové trhače. Jestli se jim připleteš pod nohy, jsi mrtvý.","Tempelridderne kommer snart og henter deres nye maulere. Hvis du kommer i vejen for dem, er du en død mand.","Die Templer werden bald hier sein, um ihre neuen Vernichter abzuholen. Wenn du ihnen im Weg bist, dann bist du ein toter Mann.",,"La templanoj baldaŭ venos por ricevi siajn novajn polvigilojn; se vi miksos vin, vi mortos.",Los templarios estarán aquí pronto para recibir sus nuevos trituradores; si los molestas eres hombre muerto.,Los templarios van a estar aquí pronto para recibir sus nuevos trituradores; si los molestas eres hombre muerto.,"Temppeliherrat tulevat tänne pian noutamaan uudet moukarinsa. Jos menet heidän tielleen, olet mennyttä.","Les templiers vont venier chercher les nouveaux broyeurs. Si vous les gênez, vous êtes mort.","A Keresztesek rögtön itt lesznek a kézi fegyvereikért. Ha az utukba állsz, halál fia vagy.",I Templari arriveranno presto qui a prendere i loro nuovi Mauler. Se ti trovano qui sei un uomo morto.,"新しいマウラーズを得たテンプル騎士団が +tengas dinero!",,"Tule takaisin, kun sinulla on rahaa!",Revenez quand vous avez des sous!,,"Gyere vissza, ha már van elég pénzed.",Torna quando avrai del denaro!,余裕がある時にまたどうぞ!,돈이 좀 있을 때 돌아와요!,Kom terug als je geld hebt!,Kom tilbake når du har penger!,"Wróć, gdy będziesz miał pieniądze!",Volte quando tiver dinheiro!,,Întoarce-te când ai destui bani!,Возвращайся с деньгами!,,Kom tillbaka när du har pengar!,Paran olduğunda geri gel! +What is it?,TXT_DLG_SCRIPT18_D0_WHATI,MAP18: Yellow guard,,,Co je?,Hvad er det?,Was gibt es?,,Kio okazas?,¿Qué pasa?,,Mikä on?,Vous voulez quoi?,,Az meg mi?,Che cos'è?,何事だ?,무슨 일이냐?,Wat is het?,Hva er det?,Co to jest?,O que foi?,,Ce e?,Что тебе нужно?,,Vad är det för nåt?,Ne oldu? +Just looking around.,TXT_RPLY0_SCRIPT18_D0_JUSTL,〃,,,Jen se poohlížím.,Jeg kigger bare rundt.,Ich schaue mich bloß um.,,Mi nur pririgardas.,Solo estoy mirando.,,Ihan vain katselen.,Je fais juste un tour.,,Csak nézelődök.,Sto soltando guardando.,見周りしている。,그냥 둘러보는 중이었습니다.,Gewoon rondkijken.,Jeg ser meg bare rundt.,Rozglądam się.,Só dando uma olhada.,,Doar mă uit împrejur.,Просто осматриваюсь.,,Jag tittar bara runt.,Sadece etrafa bakıyorum. +Just keep out of the way.,TXT_RYES0_SCRIPT18_D0_JUSTK,〃,,,Prostě se drž z cesty.,Bare hold dig ude af vejen.,Sei einfach niemandem im Weg.,,Vi nur ne ĝenu nin.,Pero no nos estorbes.,,Kunhan vain pysyt pois tieltä.,Restez hors du chemin.,,Csak ne legyél láb alatt.,Basta che non ti metti in mezzo.,この先は立入禁止だ。,그럼 방해하지마.,Blijf gewoon uit de weg.,Bare hold deg unna.,Trzymaj się z dala od drogi.,Apenas fique fora do caminho.,,Doar nu sta în cale.,Просто не путайся под ногами.,,Håll dig bara ur vägen.,Yoldan uzak dur. +The Templars will be here soon to pick up their new maulers. If you get in their way you're a dead man.,TXT_DLG_SCRIPT18_D1516_THETE,〃,,,"Templáři tu brzy budou vyzvednout si své nové trhače. Jestli se jim připleteš pod nohy, jsi mrtvý.","Tempelridderne kommer snart og henter deres nye maulere. Hvis du kommer i vejen for dem, er du en død mand.","Die Templer werden bald hier sein, um ihre neuen Vernichter abzuholen. Wenn du ihnen im Weg bist, dann bist du ein toter Mann.",,"La templanoj baldaŭ venos por ricevi siajn novajn polvigilojn; se vi miksos vin, vi mortos.",Los templarios estarán aquí pronto para recibir sus nuevos trituradores; si los molestas eres hombre muerto.,Los templarios van a estar aquí pronto para recibir sus nuevos trituradores; si los molestas eres hombre muerto.,"Temppeliherrat tulevat tänne pian noutamaan uudet moukarinsa. Jos menet heidän tielleen, olet mennyttä.","Les templiers vont venier chercher les nouveaux broyeurs. Si vous les gênez, vous êtes mort.",,"A Keresztesek rögtön itt lesznek a kézi fegyvereikért. Ha az utukba állsz, halál fia vagy.",I Templari arriveranno presto qui a prendere i loro nuovi Mauler. Se ti trovano qui sei un uomo morto.,"新しいマウラーズを得たテンプル騎士団が すぐにでもここに来る。長生きしたければ 邪魔をしようと思わない方がいい。",템플러가 곧 새 마울러를 가지러 올 거야. 그들을 방해하면 넌 죽은 목숨이야.,"De Tempeliers zullen hier binnenkort zijn om hun nieuwe maulers op te halen. Als je hen in de weg staat, ben je een dode man.","Tempelridderne kommer snart for å hente sine nye maulere. Kommer du i veien for dem, er du en død mann.","Templariusze będą tu niedługo po swoje nowe maulery. Jeśli wejdziesz im w drogę, będziesz martwy.","Os Templários estarão aqui logo para pegar seus novos desintegradores. Se você se meter no caminho deles, você é um homem morto.",,Templierii vor fi curând aici pentru a ridica schiloditoarele. Dacă le stai în cale ești mort.,"Храмовники скоро придут сюда забрать свои новые истязатели. Если попадёшься им на пути, станешь покойником.",,Templarna kommer snart att vara här för att hämta sina nya maulers. Om du kommer i deras väg är du en död man.,Tapınakçılar yeni parçalayıcılarını almak için yakında burada olacaklar. Eğer yollarına çıkarsan ölürsün. -Maulers?,TXT_RPLY0_SCRIPT18_D1516_MAULE,〃,,,Trhače?,Maulers?,Vernichter?,,Ĉu polvigiloj?,¿Trituradores?,,Moukarit?,Des broyeurs?,Kézi fegyver?,Mauler?,マウラーズ?,마울러?,Maulers?,Maulere?,Maulery?,Desintegradores?,,Schiloditoare?,Истязатели?,,Maulers?,Parçalayıcılar? +Maulers?,TXT_RPLY0_SCRIPT18_D1516_MAULE,〃,,,Trhače?,Maulers?,Vernichter?,,Ĉu polvigiloj?,¿Trituradores?,,Moukarit?,Des broyeurs?,,Kézi fegyver?,Mauler?,マウラーズ?,마울러?,Maulers?,Maulere?,Maulery?,Desintegradores?,,Schiloditoare?,Истязатели?,,Maulers?,Parçalayıcılar? The Templar's favorite weapon.,TXT_RYES0_SCRIPT18_D1516_THETE,〃,,The templar's favourite weapon.,Oblíbená zbraň templářů.,Tempelriddernes yndlingsvåben.,Die Lieblingswaffe der Templer.,,"La preferata armilo de la templanoj.","El arma favorita -de los templarios.",,Temppeliherrojen lempiase.,L'arme favorite du templier.,A keresztesek kedvenc fegyvere.,È l'arma preferita dei Templari.,騎士団に人気の兵器だ。,템플러가 제일 좋아하는 무기야.,Het favoriete wapen van de Tempeliers.,Tempelriddernes favorittvåpen.,Ulubiona broń Templariuszy.,A arma favorita dos Templários.,,Arma preferată a Templierilor.,Их любимое оружие.,,Tempelriddarens favoritvapen.,Tapınakçıların en sevdiği silah. -They came in earlier. That's what all the security's about. I got a chance to look at them when I locked up. Nobody's supposed to go in or out of there until the rest of the platoon comes to claim their weapons.,TXT_DLG_SCRIPT18_D3032_THEYC,〃,,,"Dorazily už dřív, proto ta ochranka. Měl jsem možnost se na ně podívat, když jsem zamykal. Nikdo nesmí vejít dovnitř ani ven dokud si zbytek čety nepřijde pro zbraně.","De kom ind tidligere. Det er derfor, der er så meget sikkerhed. Jeg fik en chance for at se dem, da jeg låste af. Ingen må gå ind eller ud derfra, før resten af delingen kommer for at hente deres våben.","Die sind heute früh hier eingetroffen. Daher all die Wachen. Ich konnte aber mal einen Blick darauf werfen. Niemand darf da rein, bevor die Waffen an die Truppen verteilt worden sind.",,"Ili alvenis antaŭ nelonge, tial estas ĉi tiom da sekureco; mi havis la ŝancon vidi ilin kiam mi enŝlosis ilin. Neniu supozeble devas iri nek en tiun deponejon nek el ĝi ĝis la resto de la plotono venos peti siajn armilojn.","Han llegado hace poco, para eso toda esta seguridad; he tenido la oportunidad de verlos al cerrar el depósito. Se supone que nadie puede entrar o salir hasta que el resto del pelotón venga a pedir sus armas.","Llegaron hace poco, para eso toda esta seguridad; tuve la oportunidad de verlos al cerrar el depósito. Se supone que nadie puede entrar o salir hasta que el resto del pelotón venga a pedir sus armas.","He kävivät aiemmin. Siitä näissä kaikissa turvatoimissa on kyse. Sain mahdollisuuden vilkaista niitä, kun lukitsin paikkoja. Kukaan ei saa kulkea sisään eikä ulos, ennen kuin loput joukkueesta tulee noutamaan aseensa.",Ils sont passés plus tôt. C'est pour ça qu'il y a autant de personnel de sécurité. J'ai eu l'opportunité de les voire quand je suis parti verouiller les accès. Personne n'est sensé entrer ou sortir tant que la section n'a pas fini de récupérer leur armes.,"Most hamarabb jöttek. Emiatt van akkora biztonsági cécó. Jó megnéztem magamnak őket amikor bezártam. Senki nem mehet se ki se be, míg a szakasz be nem megy a fegyvereiért.",Sono arrivati da poco. Ecco perché c'è così tanta sicurezza. Ho avuto l'opportunità di vederli quando sono uscito per bloccare gli accessi. Nessuno dovrebbe entrare o uscire finché il plotone non ha finito di raccogliere le armi.,"以前所属したばかりだ。 +de los templarios.",,Temppeliherrojen lempiase.,L'arme favorite du templier.,,A keresztesek kedvenc fegyvere.,È l'arma preferita dei Templari.,騎士団に人気の兵器だ。,템플러가 제일 좋아하는 무기야.,Het favoriete wapen van de Tempeliers.,Tempelriddernes favorittvåpen.,Ulubiona broń Templariuszy.,A arma favorita dos Templários.,,Arma preferată a Templierilor.,Их любимое оружие.,,Tempelriddarens favoritvapen.,Tapınakçıların en sevdiği silah. +They came in earlier. That's what all the security's about. I got a chance to look at them when I locked up. Nobody's supposed to go in or out of there until the rest of the platoon comes to claim their weapons.,TXT_DLG_SCRIPT18_D3032_THEYC,〃,,,"Dorazily už dřív, proto ta ochranka. Měl jsem možnost se na ně podívat, když jsem zamykal. Nikdo nesmí vejít dovnitř ani ven dokud si zbytek čety nepřijde pro zbraně.","De kom ind tidligere. Det er derfor, der er så meget sikkerhed. Jeg fik en chance for at se dem, da jeg låste af. Ingen må gå ind eller ud derfra, før resten af delingen kommer for at hente deres våben.","Die sind heute früh hier eingetroffen. Daher all die Wachen. Ich konnte aber mal einen Blick darauf werfen. Niemand darf da rein, bevor die Waffen an die Truppen verteilt worden sind.",,"Ili alvenis antaŭ nelonge, tial estas ĉi tiom da sekureco; mi havis la ŝancon vidi ilin kiam mi enŝlosis ilin. Neniu supozeble devas iri nek en tiun deponejon nek el ĝi ĝis la resto de la plotono venos peti siajn armilojn.","Han llegado hace poco, para eso toda esta seguridad; he tenido la oportunidad de verlos al cerrar el depósito. Se supone que nadie puede entrar o salir hasta que el resto del pelotón venga a pedir sus armas.","Llegaron hace poco, para eso toda esta seguridad; tuve la oportunidad de verlos al cerrar el depósito. Se supone que nadie puede entrar o salir hasta que el resto del pelotón venga a pedir sus armas.","He kävivät aiemmin. Siitä näissä kaikissa turvatoimissa on kyse. Sain mahdollisuuden vilkaista niitä, kun lukitsin paikkoja. Kukaan ei saa kulkea sisään eikä ulos, ennen kuin loput joukkueesta tulee noutamaan aseensa.",Ils sont passés plus tôt. C'est pour ça qu'il y a autant de personnel de sécurité. J'ai eu l'opportunité de les voire quand je suis parti verouiller les accès. Personne n'est sensé entrer ou sortir tant que la section n'a pas fini de récupérer leur armes.,,"Most hamarabb jöttek. Emiatt van akkora biztonsági cécó. Jó megnéztem magamnak őket amikor bezártam. Senki nem mehet se ki se be, míg a szakasz be nem megy a fegyvereiért.",Sono arrivati da poco. Ecco perché c'è così tanta sicurezza. Ho avuto l'opportunità di vederli quando sono uscito per bloccare gli accessi. Nessuno dovrebbe entrare o uscire finché il plotone non ha finito di raccogliere le armi.,"以前所属したばかりだ。 彼等は全て警備に周るだろう。 門を閉める時に見る機会があったからな。 残りの小隊が兵器を請求するまで 誰も入れる事はできない。","최신 에너지 무기지. 이 무기를 보호하기 위해서 경비가 아주 삼엄하다고. 다만 시간 날 때 맨눈으로 보기는 했지만. 모든 템플러 분대가 이것들을 집어가기 전까지는 그 누구도 절대로 만질 수도, 볼 수도 없어.",Ze kwamen eerder binnen. Dat is waar de beveiliging over gaat. Ik kreeg de kans om naar ze te kijken toen ik ze opsloot. Niemand wordt verondersteld daar naar binnen of buiten te gaan totdat de rest van het peloton zijn wapens komt halen.,De kom inn tidligere. Det er det all sikkerheten handler om. Jeg fikk en sjanse til å se på dem da jeg låste meg inn. Ingen skal gå inn eller ut før resten av troppen kommer for å hente våpnene sine.,"Przyszły wcześniej. To o to chodzi w tej całej ochronie. Miałem okazję przyjrzeć się im przy zamykaniu. Nikt nie może tam wchodzić ani wychodzić, dopóki reszta plutonu nie przyjdzie po swoją broń.",Eles vieram aqui antes. Por isso toda essa segurança. Tive a oportunidade de dar uma olhada neles quando eu estava fechando. Ninguém pode entrar ou sair até que o resto do pelotão venha pegar suas armas.,,Au venit mai devreme. Asta e treaba cu toată securitatea. Am avut șansa să îi privesc când închideam. Nimeni nu intră sau iese până ce tot platonul vine să își ia armele.,"Его привезли раньше, поэтому здесь столько охраны. Я заглянул в хранилище, когда запирал его. Пока весь отряд храмовников не получит своё оружие, никому не позволено входить или выходить.",,De kom in tidigare. Det är det som är orsaken till all säkerhet. Jag fick en chans att titta på dem när jag låste in dem. Ingen får gå in eller ut därifrån förrän resten av plutonen kommer för att hämta sina vapen.,Daha erken geldiler. Bütün güvenlik bunun için. Kapıyı kilitlediğimde onlara bakma şansım oldu. Müfrezenin geri kalanı silahlarını almaya gelene kadar kimsenin oraya girip çıkmaması gerekiyor. -This is where you get the plans for the central administration.,TXT_DLG_SCRIPT19_D0_THISI,"Appears in MAP19 and is supposed to be spoken by the Peasant1 actor (named “Security Comple”). However, no such actor is spawned in the map, rendering this line unused.",,,Tady se nachází plány pro ústřední administraci.,"Det er her, du får planerne for den centrale administration.",Dort bekommst du die Pläne für die Hauptverwaltung.,,Ĉi tie oni akiras la planojn de la centra administrejo.,Aquí es donde se consiguen los planos de la administración central.,,Täältä saat keskushallinnon piirustukset.,C'est ici que vous pouvez récuperer les plans du centre d'administration.,"Ez az a rész, ahol megszerezheted a terveket a központi irányításhoz.",Qui è dove prendi i piani per l'amministrazione centrale,,이곳은 중앙 관리소에 전술이나 계획을 보고하기 위한 곳이야.,Hier krijg je de plannen voor de centrale administratie.,Det er her du får planene for sentraladministrasjonen.,To tutaj dostajecie plany dla administracji centralnej.,É aqui onde você pega os planos da administração central.,,De aici vei lua schemele pentru camera de administrare centrală.,Здесь ты добудешь схему центральной администрации.,,Det är här du får planerna för den centrala administrationen.,Burası merkezi yönetimin planlarını aldığınız yer. +This is where you get the plans for the central administration.,TXT_DLG_SCRIPT19_D0_THISI,"Appears in MAP19 and is supposed to be spoken by the Peasant1 actor (named “Security Comple”). However, no such actor is spawned in the map, rendering this line unused.",,,Tady se nachází plány pro ústřední administraci.,"Det er her, du får planerne for den centrale administration.",Dort bekommst du die Pläne für die Hauptverwaltung.,,Ĉi tie oni akiras la planojn de la centra administrejo.,Aquí es donde se consiguen los planos de la administración central.,,Täältä saat keskushallinnon piirustukset.,C'est ici que vous pouvez récuperer les plans du centre d'administration.,,"Ez az a rész, ahol megszerezheted a terveket a központi irányításhoz.",Qui è dove prendi i piani per l'amministrazione centrale,,이곳은 중앙 관리소에 전술이나 계획을 보고하기 위한 곳이야.,Hier krijg je de plannen voor de centrale administratie.,Det er her du får planene for sentraladministrasjonen.,To tutaj dostajecie plany dla administracji centralnej.,É aqui onde você pega os planos da administração central.,,De aici vei lua schemele pentru camera de administrare centrală.,Здесь ты добудешь схему центральной администрации.,,Det är här du får planerna för den centrala administrationen.,Burası merkezi yönetimin planlarını aldığınız yer. "I run this place. My job is to build the raw parts needed for the Loremaster's robot designs. If you're not here on official business, then I'm afraid I don't have time to talk.",TXT_DLG_SCRIPT22_D0_IRUNT,"SVE.WAD -MAP22: C-shaped building → Master Smithy.",,,"Já jsem ten, kdo to tu řídí. Mým úkolem je konstruovat části pro Dějepiscovy návrhy robotů. Jestli tu nejsi kvůli oficiálním záležitostem, pak se obávám, že nemám čas s tebou mluvit.","Jeg styrer stedet her. Mit job er at bygge de rådele, der er nødvendige for Loremesterens robotdesigns. Hvis du ikke er her i officielt ærinde, så har jeg desværre ikke tid til at tale.","Ich leite dieses Unternehmen. Meine Aufgabe ist es, die Teile für die neuen Roboterdesigns des Wissensmeisters zu konstruieren. Wenn du hier nicht dienstlich hier bist, habe ich keine Zeit für dich.",,"Mi estras ĉi tiun lokon. Mia laboro estas konstrui la necesajn partojn por la dezajnoj de la robotoj de la Folkloristo. Se vi ne venis por oficialaj aferoj, mi timas, ke mi ne havas tempon babili.","Yo manejo este sitio. Mi trabajo es contruir las partes necesarias para los diseños de los robots del Maestro del Conocimiento. Si no estás aquí por asuntos oficiales, entonces me temo que no tengo tiempo para hablar.",,"Minä vedän tätä paikkaa. Työni on valmistaa osat, joita tarvitaan Oppi-Isän robottikehitelmiin. Jos et ole täällä virallisilla asioilla, sitten minulla valitettavasti ei ole aikaa puhua.","Je suis le chef de cet endroit. Mon travail est de faire fabriquer les pièces brutes utilisées pour les robots du Maître des traditions. Si vous n'êtes pas ici en visite officielle, je n'ai pas le temps de vous parler.","Én vezetem ezt a kócerájt. Az én feladatom, hogy a Tanmester robotjának alkatrészeit összerakjam. Ha nem hivatalos ügyben jöttél, akkor sajnos nincs időm rád.","Sono io a gestire questo posto. Il mio lavoro è costruire i materiali necessari per i progetti dei robot del Sapiente. A meno che tu non sia qua per discutere affari, mi spiace ma non ho tempo per parlare.","私がこの場所の主任者だ。 +MAP22: C-shaped building → Master Smithy.",,,"Já jsem ten, kdo to tu řídí. Mým úkolem je konstruovat části pro Dějepiscovy návrhy robotů. Jestli tu nejsi kvůli oficiálním záležitostem, pak se obávám, že nemám čas s tebou mluvit.","Jeg styrer stedet her. Mit job er at bygge de rådele, der er nødvendige for Loremesterens robotdesigns. Hvis du ikke er her i officielt ærinde, så har jeg desværre ikke tid til at tale.","Ich leite dieses Unternehmen. Meine Aufgabe ist es, die Teile für die neuen Roboterdesigns des Wissensmeisters zu konstruieren. Wenn du hier nicht dienstlich hier bist, habe ich keine Zeit für dich.",,"Mi estras ĉi tiun lokon. Mia laboro estas konstrui la necesajn partojn por la dezajnoj de la robotoj de la Folkloristo. Se vi ne venis por oficialaj aferoj, mi timas, ke mi ne havas tempon babili.","Yo manejo este sitio. Mi trabajo es contruir las partes necesarias para los diseños de los robots del Maestro del Conocimiento. Si no estás aquí por asuntos oficiales, entonces me temo que no tengo tiempo para hablar.",,"Minä vedän tätä paikkaa. Työni on valmistaa osat, joita tarvitaan Oppi-Isän robottikehitelmiin. Jos et ole täällä virallisilla asioilla, sitten minulla valitettavasti ei ole aikaa puhua.","Je suis le chef de cet endroit. Mon travail est de faire fabriquer les pièces brutes utilisées pour les robots du Maître des traditions. Si vous n'êtes pas ici en visite officielle, je n'ai pas le temps de vous parler.",,"Én vezetem ezt a kócerájt. Az én feladatom, hogy a Tanmester robotjának alkatrészeit összerakjam. Ha nem hivatalos ügyben jöttél, akkor sajnos nincs időm rád.","Sono io a gestire questo posto. Il mio lavoro è costruire i materiali necessari per i progetti dei robot del Sapiente. A meno che tu non sia qua per discutere affari, mi spiace ma non ho tempo per parlare.","私がこの場所の主任者だ。 私の仕事は、ロアマスターのロボットの デザインに必要な原料パーツを生産することだ。 もしあなたが公用で来たのではないのなら、 申し訳ないが話すための時間はないのだ。","난 이곳의 책임자야. 로어마스터님의 로봇 설계를 돕기 위해 일하고 있지. 만약 공식 업무 외에 온 거라면, 바쁘니까 돌아가 줘야 되겠는걸?","Ik run deze plek. Mijn taak is om de ruwe onderdelen te bouwen die nodig zijn voor de robotontwerpen van de Kennismeester. Als je hier niet bent voor officiële zaken, dan ben ik bang dat ik geen tijd heb om te praten.","Jeg driver dette stedet. Min jobb er å bygge rådelene som trengs til Loremesterens robotdesign. Hvis du ikke er her i offisielt ærend, har jeg ikke tid til å snakke.","Ja prowadzę to miejsce. Moim zadaniem jest budowanie części potrzebnych do projektów robotów Loremastera. Jeśli nie jesteś tu w oficjalnej sprawie, to obawiam się, że nie mam czasu na rozmowę.","Eu sou o chefe daqui deste lugar. Meu trabalho é construir as peças necessárias para os robôs do Mestre do Conhecimento. Se você não está aqui para assuntos oficiais, então receio que não temos tempo para conversa.",,"Eu conduc locul ăsta. Treaba mea e să produc materia primă pentru designul roboților Stăpânului Cunoștiințelor. Dacă nu ești aici cu treabă oficială, atunci nu am timp de vorbă.","Я здесь главный. Моя работа — изготавливать детали роботов для Хранителя мудрости. Если ты здесь не по служебным делам, то, боюсь, мне некогда с тобой болтать.",,Jag styr det här stället. Mitt jobb är att bygga de rådelar som behövs för Läromästarens robotkonstruktioner. Om du inte är här i officiellt ärende har jag tyvärr inte tid att prata.,"Burayı ben yönetiyorum. Benim işim Loremaster'ın robot tasarımları için gereken ham parçaları üretmek. Eğer resmi bir iş için burada değilseniz, korkarım ki konuşacak vaktim yok." -I am on official business.,TXT_RPLY0_SCRIPT22_D0_IAMON,〃,,,Jsem tu kvůli oficiálním záležitostem.,Jeg er i officielt ærinde.,Ich bin dienstlich hier.,,Mi venis por oficialaj aferoj.,Estoy por asuntos oficiales.,,Olen virallisilla asioilla.,Je suis en visite officielle.,Hivatalos ügyben jöttem.,Sono qua per discutere affari.,私は公用で来た。,공식 업무로 왔어.,Ik ben voor officiële zaken.,Jeg er her i offisielt ærend.,Jestem w oficjalnej sprawie.,Estou aqui para tratar de assuntos oficiais.,,Sunt cu treburi oficiale.,Я по служебным делам.,,Jag är i officiellt ärende.,Resmi bir iş için buradayım. -"So you've spoken with Timothy, I see. He and I have worked together to try to unravel the mysteries of the Order, before it's too late for us all. Maybe you can help us. I've opened the door to the production sector.",TXT_DLG_SCRIPT22_D1516_SOYOU,〃 (After giving the blue chalice to Timothy).,,,"Vidím, že sis promluvil s Timothym. Pracovali jsme spolu na odkrytí tajemství Řádu, dřív, než pro nás bude pozdě. Možná nám můžeš pomoct. Otevřel jsem dveře do výrobního sektoru.","Så du har talt med Timothy, kan jeg se. Han og jeg har arbejdet sammen for at forsøge at løse ordenens mysterier, før det er for sent for os alle. Måske kan du hjælpe os. Jeg har åbnet døren til produktionssektoren.","Du hast mit Timothy gesprochen, ich verstehe. Er und ich haben zusammengearbeitet und versucht die Mysterien des Ordens ergründen, bevor es für uns alle zu spät ist. Vielleicht kannst du uns helfen. Ich habe die Tür zum Produktionsektor geöffnet.",,Do vi parolis kun Timoteo. Li kaj mi kunlaboris kun la intenco penetri la misterojn de La Ordeno. Vi eble povas helpi nin; mi malfermis la pordon de la produktejo.,"Así que has hablado con Timothy, ya veo. Él y yo hemos trabajado juntos para intentar desentrañar los misterios de La Orden antes de que sea demasiado tarde para todos nosotros. Tal vez puedas ayudarnos; he abierto la puerta al sector de producción.","Así que hablaste con Timothy, ya veo. Él y yo hemos trabajado juntos para tratar de descifrar los misterios de La Orden antes de que sea demasiado tarde para todos nosotros. Tal vez puedas ayudarnos; acabo de abrir la puerta al sector de producción.","Olet siis näköjään puhunut Timothyn kanssa. Olemme yhteistyössä koettaneet ratkoa Veljeskunnan saloja, ennen kuin on liian myöhäistä meidän kaikkien kannalta. Ehkä voit auttaa meitä. Avasin oven tuotantolaitokselle.",Je vois que vous avez parlé à Timothy. Nous avons travaillé ensemble pour dénouer les mystères de l'Ordre avant qu'il soit trop tard. Peut être que vous pouvez nous aider. J'ai ouvert l'accès vers le secteur de production.,"Úgy látom már beszéltél Timothyval. Ő és Én már korábban is próbáltuk felderíteni a Rend rejtélyét, mielőtt még mindannyiunknak túl késő nem lesz. Talán tudsz segíteni. Kinyitottam az ajtót a gyártó részleghez.",Vedo che hai parlato con Timothy. Io e lui abbiamo lavorato insieme per cercare di svelare i misteri dell'Ordine prima che sia troppo tardi per tutti noi. Forse ci puoi aiutare. Ho aperto la porta che conduce al settore di produzione.,"ということは、ティモシーと話したのだな。 +I am on official business.,TXT_RPLY0_SCRIPT22_D0_IAMON,〃,,,Jsem tu kvůli oficiálním záležitostem.,Jeg er i officielt ærinde.,Ich bin dienstlich hier.,,Mi venis por oficialaj aferoj.,Estoy por asuntos oficiales.,,Olen virallisilla asioilla.,Je suis en visite officielle.,,Hivatalos ügyben jöttem.,Sono qua per discutere affari.,私は公用で来た。,공식 업무로 왔어.,Ik ben voor officiële zaken.,Jeg er her i offisielt ærend.,Jestem w oficjalnej sprawie.,Estou aqui para tratar de assuntos oficiais.,,Sunt cu treburi oficiale.,Я по служебным делам.,,Jag är i officiellt ärende.,Resmi bir iş için buradayım. +"So you've spoken with Timothy, I see. He and I have worked together to try to unravel the mysteries of the Order, before it's too late for us all. Maybe you can help us. I've opened the door to the production sector.",TXT_DLG_SCRIPT22_D1516_SOYOU,〃 (After giving the blue chalice to Timothy).,,,"Vidím, že sis promluvil s Timothym. Pracovali jsme spolu na odkrytí tajemství Řádu, dřív, než pro nás bude pozdě. Možná nám můžeš pomoct. Otevřel jsem dveře do výrobního sektoru.","Så du har talt med Timothy, kan jeg se. Han og jeg har arbejdet sammen for at forsøge at løse ordenens mysterier, før det er for sent for os alle. Måske kan du hjælpe os. Jeg har åbnet døren til produktionssektoren.","Du hast mit Timothy gesprochen, ich verstehe. Er und ich haben zusammengearbeitet und versucht die Mysterien des Ordens ergründen, bevor es für uns alle zu spät ist. Vielleicht kannst du uns helfen. Ich habe die Tür zum Produktionsektor geöffnet.",,Do vi parolis kun Timoteo. Li kaj mi kunlaboris kun la intenco penetri la misterojn de La Ordeno. Vi eble povas helpi nin; mi malfermis la pordon de la produktejo.,"Así que has hablado con Timothy, ya veo. Él y yo hemos trabajado juntos para intentar desentrañar los misterios de La Orden antes de que sea demasiado tarde para todos nosotros. Tal vez puedas ayudarnos; he abierto la puerta al sector de producción.","Así que hablaste con Timothy, ya veo. Él y yo hemos trabajado juntos para tratar de descifrar los misterios de La Orden antes de que sea demasiado tarde para todos nosotros. Tal vez puedas ayudarnos; acabo de abrir la puerta al sector de producción.","Olet siis näköjään puhunut Timothyn kanssa. Olemme yhteistyössä koettaneet ratkoa Veljeskunnan saloja, ennen kuin on liian myöhäistä meidän kaikkien kannalta. Ehkä voit auttaa meitä. Avasin oven tuotantolaitokselle.",Je vois que vous avez parlé à Timothy. Nous avons travaillé ensemble pour dénouer les mystères de l'Ordre avant qu'il soit trop tard. Peut être que vous pouvez nous aider. J'ai ouvert l'accès vers le secteur de production.,,"Úgy látom már beszéltél Timothyval. Ő és Én már korábban is próbáltuk felderíteni a Rend rejtélyét, mielőtt még mindannyiunknak túl késő nem lesz. Talán tudsz segíteni. Kinyitottam az ajtót a gyártó részleghez.",Vedo che hai parlato con Timothy. Io e lui abbiamo lavorato insieme per cercare di svelare i misteri dell'Ordine prima che sia troppo tardi per tutti noi. Forse ci puoi aiutare. Ho aperto la porta che conduce al settore di produzione.,"ということは、ティモシーと話したのだな。 彼と私は、取り返しのつかない事態に陥る前に オーダーの秘密を解き明かすために 一緒に働いてきた。もしかすると、 君は私達に手を貸せるかもしれない。 私は今、生産セクターへの扉を開いたぞ。","티모시와 이야기를 나눴구나, 그렇지? 티모시랑 같이 한발 늦기 전에 오더의 비밀을 파헤치려고 열심히 노력했지. 아마도 우리들을 도와줄 수 있을 것 같은데 말이야. 방금 제조 공간의 문을 열어놨어.","Dus je hebt met Timothy gesproken, zie ik. Hij en ik hebben samengewerkt om te proberen de mysteries van de Orde te ontrafelen, voordat het voor ons allemaal te laat is. Misschien kunt u ons helpen. Ik heb de deur geopend naar de productiesector.","Så du har snakket med Timothy, ser jeg. Han og jeg har jobbet sammen for å løse Ordenens mysterier før det er for sent for oss alle. Kanskje du kan hjelpe oss. Jeg har åpnet døren til produksjonssektoren.","Widzę, że rozmawiałaś z Timothym. Razem z nim próbujemy rozwikłać tajemnice Zakonu, zanim będzie za późno dla nas wszystkich. Może ty możesz nam pomóc. Otworzyłem drzwi do sektora produkcyjnego.","Então você andou falando com o Timothy, pelo visto. Eu e ele trabalhamos juntos para tentar desvendar os mistérios da Ordem antes que seja tarde para todos nós. Talvez você possa nos ajudar. Eu abri a porta para o setor de produção.",,"Ai vorbit cu Timotei, să înțeleg. Noi am lucrat împreună în încercarea de a descoperii misterele Ordinului, înainte să fie prea târziu pentru noi toți. Poate ne poți ajuta. Am deschis ușa la sectorul de producție.","Итак, ты уже поговорил с Тимоти. Мы с ним вместе пытаемся раскрыть тайны Ордена, пока не стало слишком поздно. Возможно, ты сможешь нам помочь. Я открыл дверь в производственный сектор.",,"Så du har talat med Timothy, ser jag. Han och jag har arbetat tillsammans för att försöka lösa Ordens mysterier innan det är för sent för oss alla. Du kanske kan hjälpa oss. Jag har öppnat dörren till produktionssektorn.","Gördüğüm kadarıyla Timothy ile konuşmuşsunuz. O ve ben, hepimiz için çok geç olmadan Tarikat'ın gizemlerini çözmeye çalışmak için birlikte çalıştık. Belki bize yardım edebilirsin. Üretim sektörünün kapısını açtım." -Do you know what's inside?,TXT_RPLY0_SCRIPT22_D1516_DOYOU,〃,,,"Víš, co je uvnitř?","Ved du, hvad der er indenfor?",Weißt du was da drin ist?,,"Ĉu vi scias, kio estas en ĝi?",¿Sabes qué hay dentro?,¿Sabes qué hay adentro?,"Tiedätkö, mitä sisällä on?",Vous savez ce qu'il y à dedans?,Tudod mi van bent?,Che cosa c'è oltre la porta?,中に何があるのかを知っているのか?,그 안에 무엇이 있는지 아나?,Weet je wat er in zit?,Vet du hva som er der inne?,"Wiesz, co jest w środku?",Você sabe o que tem lá dentro?,,Știi cumva ce e înăuntru?,"Ты знаешь, что там?",,Vet du vad som finns där inne?,İçeride ne olduğunu biliyor musun? -"It's a top secret area. Not only is the Order breeding some kind of... creature in there, I've seen with my own eyes a strange artifact called a Talisman. nobody's allowed near it. Rumor is that it holds great power if united with two others of its kind.",TXT_DLG_SCRIPT22_D3032_ITSAT,〃,,,"Je to přísně tajná oblast. Nejenže se tam Řád snaží zplodit nějakou... příšeru, ale na vlastní oči jsem tam viděl zvláštní artefakt jménem Talisman. Nikdo k němu nesmí. Říká se, že skrývá nesmírnou moc pokud se spojí s dalšími dvěma svého druhu.","Det er et tophemmeligt område. Ikke alene avler Ordenen en slags... væsen derinde, jeg har også set med mine egne øjne en mærkelig artefakt kaldet en Talisman. Ingen må komme i nærheden af den. Rygterne siger, at den har stor magt, hvis den forenes med to andre af sin slags.","Das ist alles streng geheim. Dort wird nicht nur irgendeine Art von... Kreatur vom Orden gezüchtet, sondern es gibt dort auch ein merkwürdiges Artefakt, ein Talisman. Keiner darf in auch nur in die Nähe davon. Gerüchten zufolge erhält man große Macht, wenn man es mit zwei anderen vereint.",,"Ĝi estas tute konfidenca sektoro. Ne nur La Ordeno estigas specon de... vivaĵo tie, mi vidis per miaj propraj okuloj strangan artefakton nomatan talismano. Neniu rajtas aliri ĝin. Oni diras, ke ĝi posedas grandan povon se ĝi estas proksime de aliaj du el sia speco.","Es un área de alto secreto. No solo está La Orden criando a una especie de... criatura ahí, he visto con mis propios ojos un artefacto extraño llamado talismán. No se le permite a nadie acercarse a él. Se rumorea que posee un gran poder si se reúne con otros dos de su especie.",,"Se on huippusalainen alue. Vielä sen lisäksi, että Veljeskunta on luomassa siellä jonkinlaista... oliota, olen omin silmin nähnyt oudon esineen, jota kutsutaan Talismaaniksi. Ketään ei sallita sen lähelle. Huhutaan, että sen sisällä piilee suuri voima, jos sen yhdistää kahden toisen sen kaltaisen kanssa.",C'est une zone top secrète. L'Ordre essaie de.. faire une sorte de créature là dedans. J'ai vu avec mes yeux un artéfact étrange qu'ils appellent un Talisman. Personne n'a le droit de l'approcher. Les rumeurs disent qu'il contient un pouvoir phénoménal si il est réuni avec deux autres du même type.,"Egy totál titkos terület. Nem elég hogy valamiféle...lényeket tenyésztenek odabent, láttam valamiféle leletet is, amit Talizmán néven emlegettek. Senkit se engednek a közelébe. A legenda szerint hatalmas erő birtokosa lehet, aki egyesíti még két másik darabbal.","È un'area a cui quasi nessuno è permesso entrare. L'Ordine non solo sta crescendo una specie di... creatura là dentro, ma inoltre ho anche visto uno strano artefatto che chiamano Talismano. Nessuno ci si può avvicinare. Dicono che se unito a due altri talismani, sprigioni un enorme potere.","あの場所は極秘エリアだ。 +Do you know what's inside?,TXT_RPLY0_SCRIPT22_D1516_DOYOU,〃,,,"Víš, co je uvnitř?","Ved du, hvad der er indenfor?",Weißt du was da drin ist?,,"Ĉu vi scias, kio estas en ĝi?",¿Sabes qué hay dentro?,¿Sabes qué hay adentro?,"Tiedätkö, mitä sisällä on?",Vous savez ce qu'il y à dedans?,,Tudod mi van bent?,Che cosa c'è oltre la porta?,中に何があるのかを知っているのか?,그 안에 무엇이 있는지 아나?,Weet je wat er in zit?,Vet du hva som er der inne?,"Wiesz, co jest w środku?",Você sabe o que tem lá dentro?,,Știi cumva ce e înăuntru?,"Ты знаешь, что там?",,Vet du vad som finns där inne?,İçeride ne olduğunu biliyor musun? +"It's a top secret area. Not only is the Order breeding some kind of... creature in there, I've seen with my own eyes a strange artifact called a Talisman. nobody's allowed near it. Rumor is that it holds great power if united with two others of its kind.",TXT_DLG_SCRIPT22_D3032_ITSAT,〃,,,"Je to přísně tajná oblast. Nejenže se tam Řád snaží zplodit nějakou... příšeru, ale na vlastní oči jsem tam viděl zvláštní artefakt jménem Talisman. Nikdo k němu nesmí. Říká se, že skrývá nesmírnou moc pokud se spojí s dalšími dvěma svého druhu.","Det er et tophemmeligt område. Ikke alene avler Ordenen en slags... væsen derinde, jeg har også set med mine egne øjne en mærkelig artefakt kaldet en Talisman. Ingen må komme i nærheden af den. Rygterne siger, at den har stor magt, hvis den forenes med to andre af sin slags.","Das ist alles streng geheim. Dort wird nicht nur irgendeine Art von... Kreatur vom Orden gezüchtet, sondern es gibt dort auch ein merkwürdiges Artefakt, ein Talisman. Keiner darf in auch nur in die Nähe davon. Gerüchten zufolge erhält man große Macht, wenn man es mit zwei anderen vereint.",,"Ĝi estas tute konfidenca sektoro. Ne nur La Ordeno estigas specon de... vivaĵo tie, mi vidis per miaj propraj okuloj strangan artefakton nomatan talismano. Neniu rajtas aliri ĝin. Oni diras, ke ĝi posedas grandan povon se ĝi estas proksime de aliaj du el sia speco.","Es un área de alto secreto. No solo está La Orden criando a una especie de... criatura ahí, he visto con mis propios ojos un artefacto extraño llamado talismán. No se le permite a nadie acercarse a él. Se rumorea que posee un gran poder si se reúne con otros dos de su especie.",,"Se on huippusalainen alue. Vielä sen lisäksi, että Veljeskunta on luomassa siellä jonkinlaista... oliota, olen omin silmin nähnyt oudon esineen, jota kutsutaan Talismaaniksi. Ketään ei sallita sen lähelle. Huhutaan, että sen sisällä piilee suuri voima, jos sen yhdistää kahden toisen sen kaltaisen kanssa.",C'est une zone top secrète. L'Ordre essaie de.. faire une sorte de créature là dedans. J'ai vu avec mes yeux un artéfact étrange qu'ils appellent un Talisman. Personne n'a le droit de l'approcher. Les rumeurs disent qu'il contient un pouvoir phénoménal si il est réuni avec deux autres du même type.,,"Egy totál titkos terület. Nem elég hogy valamiféle...lényeket tenyésztenek odabent, láttam valamiféle leletet is, amit Talizmán néven emlegettek. Senkit se engednek a közelébe. A legenda szerint hatalmas erő birtokosa lehet, aki egyesíti még két másik darabbal.","È un'area a cui quasi nessuno è permesso entrare. L'Ordine non solo sta crescendo una specie di... creatura là dentro, ma inoltre ho anche visto uno strano artefatto che chiamano Talismano. Nessuno ci si può avvicinare. Dicono che se unito a due altri talismani, sprigioni un enorme potere.","あの場所は極秘エリアだ。 オーダーはある種の生物のようなものを そこで繁殖させているし、それだけではなく 私はタリスマンと呼ばれる奇妙な @@ -11653,518 +11653,518 @@ Do you know what's inside?,TXT_RPLY0_SCRIPT22_D1516_DOYOU,〃,,,"Víš, co je uv 誰もそれには近づくことが許されていないのだ。 噂では、タリスマンはほかの2つのタリスマンと つながることで強大なパワーを発揮できるらしい。",아주 중요한 기밀 공간이야. 난 오더가 거기에서 각종... 생물들을 만드는 거랑 부적이라는 희한한 유물을 보호하는 모습을 봤지. 그런 이유로 그 누구도 못 들어가. 그리고 이와 똑같은 다른 유물을 합치면 초월한 힘을 발휘한다는 소문도 들었어.,"Het is een topgeheim gebied. Niet alleen is de Orde daar een soort.... schepsel aan het kweken, ik heb met mijn eigen ogen een vreemd artefact gezien dat een Talisman wordt genoemd. niemand mag er in de buurt komen. Het gerucht gaat dat hij grote macht heeft als hij zich verenigt met twee anderen van zijn soort.","Det er et topphemmelig område. Ikke bare avler Ordenen en slags... skapning der inne, jeg har selv sett en merkelig gjenstand kalt en Talisman. Ingen får komme nær den. Ryktene sier at den har stor makt hvis den forenes med to andre av sitt slag.","To ściśle tajny obszar. Nie dość, że Zakon hoduje tam jakieś... stworzenia, to na własne oczy widziałem dziwny artefakt zwany Talizmanem. nikomu nie wolno się do niego zbliżać. Plotka głosi, że posiada on wielką moc, jeśli połączy się go z dwoma innymi tego rodzaju.","É uma área ultrassecreta. Não só a Ordem está criando um tipo de...criatura lá dentro, eu vi com meus próprios olhos um artefato estranho chamado de Talismã. Ninguém tem permissão para chegar perto. Dizem que ele tem um grande poder ao se unir com outros dois do mesmo tipo.",,"E o zonă secretă. Nu numai că Ordinul crește un fel de... creatură acolo, am văzut cu proprii mei ochi un fel de artefact numit Talisman, nimeni nu e lăsat să se apropie.. Zvonurile zic că e un artefact de o putere imensă dacă e unit cu celelalte două părți ale lui.","Это совершенно секретно. Во-первых, Орден разводит там каких-то... существ. Во-вторых, я своими глазами видел странный артефакт — «Талисман». К нему никого и близко не подпускают. Говорят, если объединить его с двумя другими, можно получить огромную силу.",,"Det är ett topphemligt område. Inte nog med att Orden föder upp någon sorts... varelse där inne, jag har med egna ögon sett en märklig artefakt som kallas för en Talisman. Ingen får komma i närheten av den. Ryktet säger att den har stor kraft om den förenas med två andra av samma slag.","Çok gizli bir bölge. Tarikat orada bir tür yaratık yetiştirmekle kalmıyor, Tılsım denen garip bir eseri kendi gözlerimle gördüm. Kimsenin ona yaklaşmasına izin verilmiyor. Söylentiye göre türünün diğer iki örneğiyle birleştiğinde büyük bir güce sahip oluyormuş." -I suppose you want this thing?,TXT_RPLY0_SCRIPT22_D3032_ISUPP,〃,,,"Předpokládám, že jej chceš?","Jeg formoder, at du vil have denne tingest?","Ich denke mal, du willst dieses Ding haben?",,"Mi supozas, ke vi volas ĝin.",Y supongo que lo quieres.,,Sinä varmaankin haluat tämän esineen?,Je suppose que vous le voulez?,Gondolom kell neked az a tárgy.,Immagino tu voglia questo?,それが欲しいということか?,내 생각엔 그걸 원하나 보지?,Ik neem aan dat je dit ding wilt?,Jeg antar at du vil ha den?,"Przypuszczam, że chcesz tego czegoś?",Imagino que você quer essa coisa?,,Presupun că vrei chestia asta?,"Похоже, ты и сам хочешь этот артефакт?",,Jag antar att du vill ha den här?,Sanırım bu şeyi istiyorsun? -"No! If you can find it, it's yours to keep. Maybe you can use it to help free us from our oppression. I'd wish you luck, but you're going to need a lot more than that if you go in there...",TXT_DLG_SCRIPT22_D4548_NOIFY,〃,,,"Ne! Jestli ho najdeš, je tvůj. Možná by ti mohl pomoct osvobodit nás od nadvlády. Přál bych ti štěstí, ale jestli tam půjdeš, budeš potřebovat mnohem víc než to...","Nej! Hvis du kan finde den, kan du beholde den. Måske kan du bruge den til at hjælpe os med at befri os fra vores undertrykkelse. Jeg ville ønske dig held og lykke, men du får brug for meget mere end det, hvis du går derind...","Nein! Wenn du es findest, darfst du es behalten. Vielleicht kannst du es benutzen, um uns von unserer Unterdrückung zu befreien. Ich würde dir Glück wünschen, aber du wirst viel mehr brauchen, wenn du dort hinein gehst.",,"Ne! Se vi trovos ĝin, konservu ĝin. Ĝi eble estos utila por ke vi liberigu nin ĉiujn de ĉi tiu opresado. Mi dezirus bonŝancon, sed vi bezonos multe pli ol tion se vi iros tien...","¡No! Si lo encuentras, quédatelo. Quizá te sirva para intentar librarnos de esta opresión. Te desearía suerte, pero necesitarás mucho más que eso si vas ahí...","¡No! Si lo encuentras, quédatelo. Puede que te sirva para tratar de librarnos de esta opresión. Te desearía suerte, pero vas a necesitar mucho más que eso si vas ahí...","Ei! Jos löydät sen, saat pitää omanasi. Voit ehkä käyttää sitä auttaaksesi vapauttamaan meidät sorrostamme. Toivottaisin sinulle onnea, mutta tarvitset paljon enemmän kuin sitä, jos menet sinne.","Non! Si vous le trouvez, gardez le pour vous. Peut être qu'il vous aidera à nous débarasser de nos oppresseurs.. Je vous souhaiterais bonne chance, mais vous allez avoir besoin de beaucoup plus que ça si vous y entrez..","Dehogyis! Ha megleled, a tied lehet. Talán fel tudod használni annak érdekében, hogy felszabadíts minket az elnyomás alól. Szerencsét kívánnék, de annál sokkal többre lesz szükséged odabent...","No! Se lo trovi, te lo puoi tenere. Forse lo puoi utilizzare per liberarci dalla nostra oppressione. Ti augurerei buona fortuna, ma ti servirebbe molto più che fortuna se vai là dentro...","そうではない!もし見つけたら +I suppose you want this thing?,TXT_RPLY0_SCRIPT22_D3032_ISUPP,〃,,,"Předpokládám, že jej chceš?","Jeg formoder, at du vil have denne tingest?","Ich denke mal, du willst dieses Ding haben?",,"Mi supozas, ke vi volas ĝin.",Y supongo que lo quieres.,,Sinä varmaankin haluat tämän esineen?,Je suppose que vous le voulez?,,Gondolom kell neked az a tárgy.,Immagino tu voglia questo?,それが欲しいということか?,내 생각엔 그걸 원하나 보지?,Ik neem aan dat je dit ding wilt?,Jeg antar at du vil ha den?,"Przypuszczam, że chcesz tego czegoś?",Imagino que você quer essa coisa?,,Presupun că vrei chestia asta?,"Похоже, ты и сам хочешь этот артефакт?",,Jag antar att du vill ha den här?,Sanırım bu şeyi istiyorsun? +"No! If you can find it, it's yours to keep. Maybe you can use it to help free us from our oppression. I'd wish you luck, but you're going to need a lot more than that if you go in there...",TXT_DLG_SCRIPT22_D4548_NOIFY,〃,,,"Ne! Jestli ho najdeš, je tvůj. Možná by ti mohl pomoct osvobodit nás od nadvlády. Přál bych ti štěstí, ale jestli tam půjdeš, budeš potřebovat mnohem víc než to...","Nej! Hvis du kan finde den, kan du beholde den. Måske kan du bruge den til at hjælpe os med at befri os fra vores undertrykkelse. Jeg ville ønske dig held og lykke, men du får brug for meget mere end det, hvis du går derind...","Nein! Wenn du es findest, darfst du es behalten. Vielleicht kannst du es benutzen, um uns von unserer Unterdrückung zu befreien. Ich würde dir Glück wünschen, aber du wirst viel mehr brauchen, wenn du dort hinein gehst.",,"Ne! Se vi trovos ĝin, konservu ĝin. Ĝi eble estos utila por ke vi liberigu nin ĉiujn de ĉi tiu opresado. Mi dezirus bonŝancon, sed vi bezonos multe pli ol tion se vi iros tien...","¡No! Si lo encuentras, quédatelo. Quizá te sirva para intentar librarnos de esta opresión. Te desearía suerte, pero necesitarás mucho más que eso si vas ahí...","¡No! Si lo encuentras, quédatelo. Puede que te sirva para tratar de librarnos de esta opresión. Te desearía suerte, pero vas a necesitar mucho más que eso si vas ahí...","Ei! Jos löydät sen, saat pitää omanasi. Voit ehkä käyttää sitä auttaaksesi vapauttamaan meidät sorrostamme. Toivottaisin sinulle onnea, mutta tarvitset paljon enemmän kuin sitä, jos menet sinne.","Non! Si vous le trouvez, gardez le pour vous. Peut être qu'il vous aidera à nous débarasser de nos oppresseurs.. Je vous souhaiterais bonne chance, mais vous allez avoir besoin de beaucoup plus que ça si vous y entrez..",,"Dehogyis! Ha megleled, a tied lehet. Talán fel tudod használni annak érdekében, hogy felszabadíts minket az elnyomás alól. Szerencsét kívánnék, de annál sokkal többre lesz szükséged odabent...","No! Se lo trovi, te lo puoi tenere. Forse lo puoi utilizzare per liberarci dalla nostra oppressione. Ti augurerei buona fortuna, ma ti servirebbe molto più che fortuna se vai là dentro...","そうではない!もし見つけたら それは自分のものにしてくれ。もしかすれば、 それを私達をオーダーから解放するために 使えるかもしれない。幸運を祈ってはいるが、 もしあの場所に行こうとしているなら、 もっと多くの力が必要となるぞ...","아니야! 만약 네가 가질 수만 있다면, 그건 네 거야. 아마도 우리들을 탄압으로부터 구해줄 수 있겠네. 부디 행운을 빌어. 왜냐하면 많은 걸 준비 한 뒤 각오하고 들어가야 하거든.","Nee, als je het kunt vinden, is het aan jou om het te houden. Misschien kunt je het gebruiken om ons te bevrijden van onze onderdrukking. Ik zou je veel geluk wensen, maar je zult veel meer nodig hebben als je daar naar binnen gaat....","Nei! Hvis du finner den, kan du beholde den. Kanskje du kan bruke den til å frigjøre oss fra undertrykkelsen. Jeg skulle ønske deg lykke til, men du trenger mer enn det hvis du går inn dit...","Nie! Jeśli go znajdziesz, zatrzymasz go dla siebie. Może użyjesz jej, by pomóc nam uwolnić się od ucisku. Życzyłbym ci szczęścia, ale będziesz potrzebował o wiele więcej, jeśli tam wejdziesz...","Não! Se você conseguir achá-lo, fique com ele. Talvez você possa usá-lo para nos libertar dessa opressão. Eu te desejaria sorte, mas você vai precisar de muito mais do que isso se você entrar lá dentro...",,"Nu! Dacă o găsești, e a ta. Poate o poți folosi ca să ne ajuți să scăpăm de oprimare. Ți-aș ura noroc, dar o să ai noroc de mult mai mult decât atât dacă mergi acolo...","Нет! Если ты его найдёшь, он твой. Может быть, он поможет тебе освободить нас от гнёта. Я бы пожелал тебе удачи, но, если ты пойдёшь туда, простой удачи будет недостаточно...",,"Nej! Om du kan hitta den, får du behålla den. Du kanske kan använda den för att befria oss från vårt förtryck. Jag skulle önska dig lycka till, men du kommer att behöva mycket mer än så om du går in där...","Hayır! Eğer onu bulabilirsen, sende kalabilir. Belki onu bizi zulmümüzden kurtarmak için kullanabilirsin. Sana şans dilerdim, ama oraya girersen bundan çok daha fazlasına ihtiyacın olacak..." -What's all this about the past?,TXT_RPLY0_SCRIPT22_D4548_WHATS,〃,,,Cos to říkal o minulosti?,Hvad er alt det her med fortiden?,Was ist dieses ganze Gerede über die Vergangenheit?,,"Kio pri tiuj misteroj, kiujn vi menciis?",¿Qué hay de esos misterios que has mencionado?,¿Qué hay de esos misterios que mencionaste?,Mistä tässä kaikessa menneessä oikein on kyse?,Qu'est-ce que j'entends au sujet du passé?,És mi köze ennek a múlthoz?,E che mi dici riguardo a tutte ste storie del passato?,過去に何があったというんだ?,그 과거에 대해서 뭐가 어떻길레?,Wat is dit alles over het verleden?,Hva er alt dette om fortiden?,O co chodzi z tą przeszłością?,Que história é essa sobre o passado?,,Care e treaba cu trecutul ăsta?,Что такого творилось здесь в прошлом?,,Vad är allt det här om det förflutna?,Geçmişle ilgili tüm bu şeyler de ne? -"You've surely seen the other ruins nearby. It seems that the Comet which crashed on our planet is actually a space ship, and believe it or not, it originated on this very world a long time ago.",TXT_DLG_SCRIPT22_D6064_YOUVE,〃,,,"Určitě jsi zahlédnul ty zříceniny tady v okolí. Zdá se, že ta kometa, která narazila do naší planety, je ve skutečnosti vesmírná loď, která, věř nebo ne, kdysi dávno pocházela z tohoto světa.","Du har sikkert set de andre ruiner i nærheden. Det ser ud til, at den komet, der styrtede ned på vores planet, faktisk er et rumskib, og tro det eller ej, men det stammer fra denne verden for længe siden.","Du hast doch sicherlich die Ruinen hier in der Nähe gesehen. Es scheint als wäre der Komet, der hier auf dem Planeten aufgeschlagen ist, eigentlich ein Raumschiff, und ob du es glaubst oder nicht, aber es kam vor langer Zeit sogar von dieser Welt.",,"Vi eble vidis la proksimajn ruinojn. Ŝajnas, ke la kometo, kiu koliziis kontraŭ nia planedo, fakte estas kosmoŝipo, kaj kredeble aŭ ne, ĝi originis en ĉi tiu sama mondo antaŭ longe.","De seguro habrás visto las ruinas cerca de aquí. Al parecer el cometa que se estrelló en nuestro planeta es en realidad una nave espacial, y lo creas o no, se originó en este mismo mundo hace mucho.",,"Olet varmastikin nähnyt lähistön muut rauniot. Vaikuttaa siltä, että komeetta, joka törmäsi planeettaamme, on oikeasti avaruusalus; ja usko tai älä, se on alkuaan peräisin tästä samaisesta maailmasta kauan sitten.","Vous avez sans doute vu toutes ces ruines aux alentours. Il semble que la comète qui s'est écrasée sur notre planète était en fait un vaisseau spatial, et.. du moins si vous y croyez, venait aussi de notre planète, il y a très, très longtemps.","Bizonyára láttad a többi romot is. Úgy néz ki, a lehulló üstökös valójában egy űrhajó volt, és hiszed vagy sem, eredetileg erről a bolygóról indult sok évvel ezelőtt.","Sicuramente avrai visto le rovine qua vicino. Sembra che la cometa dell'impatto verso il nostro pianeta fosse in realtà una navicella spaziale, e so che può sembrare incredibile, ma la nave è originaria di questo mondo, di molto tempo fa.","君はこの周りの廃墟群を見てきたはずだ。 +What's all this about the past?,TXT_RPLY0_SCRIPT22_D4548_WHATS,〃,,,Cos to říkal o minulosti?,Hvad er alt det her med fortiden?,Was ist dieses ganze Gerede über die Vergangenheit?,,"Kio pri tiuj misteroj, kiujn vi menciis?",¿Qué hay de esos misterios que has mencionado?,¿Qué hay de esos misterios que mencionaste?,Mistä tässä kaikessa menneessä oikein on kyse?,Qu'est-ce que j'entends au sujet du passé?,,És mi köze ennek a múlthoz?,E che mi dici riguardo a tutte ste storie del passato?,過去に何があったというんだ?,그 과거에 대해서 뭐가 어떻길레?,Wat is dit alles over het verleden?,Hva er alt dette om fortiden?,O co chodzi z tą przeszłością?,Que história é essa sobre o passado?,,Care e treaba cu trecutul ăsta?,Что такого творилось здесь в прошлом?,,Vad är allt det här om det förflutna?,Geçmişle ilgili tüm bu şeyler de ne? +"You've surely seen the other ruins nearby. It seems that the Comet which crashed on our planet is actually a space ship, and believe it or not, it originated on this very world a long time ago.",TXT_DLG_SCRIPT22_D6064_YOUVE,〃,,,"Určitě jsi zahlédnul ty zříceniny tady v okolí. Zdá se, že ta kometa, která narazila do naší planety, je ve skutečnosti vesmírná loď, která, věř nebo ne, kdysi dávno pocházela z tohoto světa.","Du har sikkert set de andre ruiner i nærheden. Det ser ud til, at den komet, der styrtede ned på vores planet, faktisk er et rumskib, og tro det eller ej, men det stammer fra denne verden for længe siden.","Du hast doch sicherlich die Ruinen hier in der Nähe gesehen. Es scheint als wäre der Komet, der hier auf dem Planeten aufgeschlagen ist, eigentlich ein Raumschiff, und ob du es glaubst oder nicht, aber es kam vor langer Zeit sogar von dieser Welt.",,"Vi eble vidis la proksimajn ruinojn. Ŝajnas, ke la kometo, kiu koliziis kontraŭ nia planedo, fakte estas kosmoŝipo, kaj kredeble aŭ ne, ĝi originis en ĉi tiu sama mondo antaŭ longe.","De seguro habrás visto las ruinas cerca de aquí. Al parecer el cometa que se estrelló en nuestro planeta es en realidad una nave espacial, y lo creas o no, se originó en este mismo mundo hace mucho.",,"Olet varmastikin nähnyt lähistön muut rauniot. Vaikuttaa siltä, että komeetta, joka törmäsi planeettaamme, on oikeasti avaruusalus; ja usko tai älä, se on alkuaan peräisin tästä samaisesta maailmasta kauan sitten.","Vous avez sans doute vu toutes ces ruines aux alentours. Il semble que la comète qui s'est écrasée sur notre planète était en fait un vaisseau spatial, et.. du moins si vous y croyez, venait aussi de notre planète, il y a très, très longtemps.",,"Bizonyára láttad a többi romot is. Úgy néz ki, a lehulló üstökös valójában egy űrhajó volt, és hiszed vagy sem, eredetileg erről a bolygóról indult sok évvel ezelőtt.","Sicuramente avrai visto le rovine qua vicino. Sembra che la cometa dell'impatto verso il nostro pianeta fosse in realtà una navicella spaziale, e so che può sembrare incredibile, ma la nave è originaria di questo mondo, di molto tempo fa.","君はこの周りの廃墟群を見てきたはずだ。 この星に衝突した彗星は、実は宇宙船だったのだ 信じられないかもしれないが、 それは遥か前のこの乱世の始まりとも言える。","주변을 돌아다니면서 각종 폐허를 봤을 거야. 믿기지는 않겠지만, 하늘에서 갑자기 추락한 혜성은 정말로 혜성이 아니라 외계인들이 타고 내려온 우주선이라는 거야. 그리고 더 놀라운 사실은, 이 녀석들은 다 이곳에서 태어났데.","Je hebt zeker de andere ruïnes in de buurt gezien. Het lijkt erop dat de komeet die op onze planeet is neergestort, eigenlijk een ruimteschip is, en geloof het of niet, het is al lang geleden op deze wereld ontstaan.","Du har sikkert sett de andre ruinene i nærheten. Det ser ut til at kometen som krasjet på planeten vår faktisk er et romskip, og tro det eller ei, det kom fra denne verdenen for lenge siden.","Na pewno widziałeś inne ruiny w pobliżu. Wygląda na to, że Kometa, która rozbiła się na naszej planecie jest tak naprawdę statkiem kosmicznym i wierzcie lub nie, pochodziła z tego właśnie świata dawno temu.","Você certamente viu as outras ruínas aqui perto. Parece que o Cometa que caiu neste planeta é na verdade uma espaçonave e, acredite se quiser, ela veio deste nosso mundo há muito tempo atrás.",,"Cu siguranță ai vazut ruinele din apropiere. Se pare că Cometa care a căzut e de fapt o navă spațială, și crezi sau nu, e originară din lumea asta, de acum mult timp.","Скорее всего, ты уже видел эти руины. Тот метеорит, который упал на нашу планету, — на самом деле это космический корабль. Веришь или нет, его построили на этой самой планете, давным-давно.",,"Du har säkert sett de andra ruinerna i närheten. Det verkar som om kometen som kraschade på vår planet faktiskt är ett rymdskepp, och tro det eller ej, den härstammar från just den här världen för länge sedan.","Yakındaki diğer kalıntıları görmüşsünüzdür. Görünüşe göre gezegenimize çarpan Kuyruklu Yıldız aslında bir uzay gemisi ve ister inanın ister inanmayın, uzun zaman önce tam da bu dünyada ortaya çıkmış." -"So the spectres, the One God...",TXT_RPLY0_SCRIPT22_D6064_SOTHE,〃,,,"Takže přízraky, Jeden bůh...","Så spøgelserne, den ene gud...","Also die Schemen, der Eine Gott...",,"Do la fantomoj, la Vera Dio...","O sea que los espectros, el Dios Único...",,"Joten aaveet, Yksi Ainoa Jumala...","Donc, les Spectres, le Seul Dieu..","Szóval a kísértetek, az egy isten...","Quindi gli spettri, l'Unico Dio..",だから霊の、唯一神...,그래서 그 스펙터들과 유일신이...,"Dus de schrikbeelden, de Ene God....","Så spøkelsene, den ene Gud...","Więc widma, Jedyny Bóg...","Então os espectros, o Deus Único...",,"Deci spectrele, Adevăratul Zeu...",Так фантомы и Единый Бог...,,"Så spökena, den enda guden...","Yani hayaletler, Tek Tanrı." -"They are creatures who once ruled this world and are bent on consuming its life. The ancients managed to seal them away, but gave their lives in the process. I'm afraid that's all I know.",TXT_DLG_SCRIPT22_D7580_THEYA,〃,,,"Jsou stvoření, která dříve vládla tomuto světu a teď usilují o zničení všeho živého. Kdosi před námi byl schopen je zapečetit a přišel během toho o život. To je vše, co vím.","De er væsener, der engang herskede over denne verden og er opsat på at fortære dens liv. Det lykkedes de gamle at forsegle dem, men de gav deres liv i processen. Jeg er bange for, at det er alt, hvad jeg ved.","Das sind Wesen, die einst diese Welt regiert haben und sie ausbeuten wollen. Die Alten haben es geschafft, sie wegzusperren aber verloren ihr Leben dabei. Tut mir leid, das ist alles, was ich weiß",,"Ili estas estaĵoj, kiuj iam dominis la mondon kaj insistas pri detrui ĝian vivon. La antikvuloj sukcese sigelfermis ilin koste de siaj vivoj. Mi timas, ke mi scias nenion plian.",Son criaturas que alguna vez dominaron el mundo e insisten en destruir toda forma de vida. Los antiguos lograron sellarlos a costa de sus vidas. Me temo que ya no sé más.,,"Ne ovat olentoja, jotka kerran hallitsivat tätä maailmaa ja ovat nyt päättäneet hävittää sen elämästä. Muinaisten onnistui teljetä heidät ulos, mutta siinä samassa uhrasivat henkensä. Valitettavasti en tiedä tämän enempää.","Ce sont des créatures qui régnaient sur cette planète il y a longtemps, et étaient bornées à détruire toute vie sur sa surface, mais les anciens ont réussi à les sceller. Ils sont morts pour cela, j'ai peur que ce soit tout ce que je sais.","Ezek olyan lények, akik korábban a világot uralták, és mindenek felett meg akarják enni a világ életerejét. Az ősöknek sikerült őket elzárni, de bele is pusztultak a procedúrába. Attól félek, csak ennyit tudok mondani.","Sono tutte creature che una volta controllavano questo mondo e hanno come obiettivo consumarne la vita. Gli antichi riuscirono a isolarli, al costo della loro vita. Purtroppo è tutto quello che so.","奴等はかつてこの世界を支配していた生物で +"So the spectres, the One God...",TXT_RPLY0_SCRIPT22_D6064_SOTHE,〃,,,"Takže přízraky, Jeden bůh...","Så spøgelserne, den ene gud...","Also die Schemen, der Eine Gott...",,"Do la fantomoj, la Vera Dio...","O sea que los espectros, el Dios Único...",,"Joten aaveet, Yksi Ainoa Jumala...","Donc, les Spectres, le Seul Dieu..",,"Szóval a kísértetek, az egy isten...","Quindi gli spettri, l'Unico Dio..",だから霊の、唯一神...,그래서 그 스펙터들과 유일신이...,"Dus de schrikbeelden, de Ene God....","Så spøkelsene, den ene Gud...","Więc widma, Jedyny Bóg...","Então os espectros, o Deus Único...",,"Deci spectrele, Adevăratul Zeu...",Так фантомы и Единый Бог...,,"Så spökena, den enda guden...","Yani hayaletler, Tek Tanrı." +"They are creatures who once ruled this world and are bent on consuming its life. The ancients managed to seal them away, but gave their lives in the process. I'm afraid that's all I know.",TXT_DLG_SCRIPT22_D7580_THEYA,〃,,,"Jsou stvoření, která dříve vládla tomuto světu a teď usilují o zničení všeho živého. Kdosi před námi byl schopen je zapečetit a přišel během toho o život. To je vše, co vím.","De er væsener, der engang herskede over denne verden og er opsat på at fortære dens liv. Det lykkedes de gamle at forsegle dem, men de gav deres liv i processen. Jeg er bange for, at det er alt, hvad jeg ved.","Das sind Wesen, die einst diese Welt regiert haben und sie ausbeuten wollen. Die Alten haben es geschafft, sie wegzusperren aber verloren ihr Leben dabei. Tut mir leid, das ist alles, was ich weiß",,"Ili estas estaĵoj, kiuj iam dominis la mondon kaj insistas pri detrui ĝian vivon. La antikvuloj sukcese sigelfermis ilin koste de siaj vivoj. Mi timas, ke mi scias nenion plian.",Son criaturas que alguna vez dominaron el mundo e insisten en destruir toda forma de vida. Los antiguos lograron sellarlos a costa de sus vidas. Me temo que ya no sé más.,,"Ne ovat olentoja, jotka kerran hallitsivat tätä maailmaa ja ovat nyt päättäneet hävittää sen elämästä. Muinaisten onnistui teljetä heidät ulos, mutta siinä samassa uhrasivat henkensä. Valitettavasti en tiedä tämän enempää.","Ce sont des créatures qui régnaient sur cette planète il y a longtemps, et étaient bornées à détruire toute vie sur sa surface, mais les anciens ont réussi à les sceller. Ils sont morts pour cela, j'ai peur que ce soit tout ce que je sais.",,"Ezek olyan lények, akik korábban a világot uralták, és mindenek felett meg akarják enni a világ életerejét. Az ősöknek sikerült őket elzárni, de bele is pusztultak a procedúrába. Attól félek, csak ennyit tudok mondani.","Sono tutte creature che una volta controllavano questo mondo e hanno come obiettivo consumarne la vita. Gli antichi riuscirono a isolarli, al costo della loro vita. Purtroppo è tutto quello che so.","奴等はかつてこの世界を支配していた生物で 生命力をひたすら吸収する存在だった。 古代人が辛うじて封印したが、 その過程で彼らの命は奪われた。 私が知っているのはそれだけだ。","한때 이 생물들은 이 세상을 지배했던 존재였어. 초월한 힘을 계속 유지하기 위해 온갖 생명력을 빨아먹어 왔던 거지. 태초의 사람들이 어떻게든 이 들을 봉인하긴 했지만, 많은 희생이 뒤따라야만 했지... 이게 내가 알고 있는 전부야.","Het zijn wezens die ooit over deze wereld heersten en die er op uit zijn om haar leven te consumeren. De Ouden slaagden erin om ze af te sluiten, maar gaven hun leven in het proces. Ik ben bang dat dat alles is wat ik weet.","De er vesener som en gang styrte denne verden og er oppsatt på å fortære dens liv. De gamle klarte å stenge dem inne, men ga sine liv i prosessen. Jeg er redd det er alt jeg vet.","To istoty, które kiedyś rządziły tym światem i mają zamiar pochłonąć jego życie. Starożytni zdołali je zapieczętować, ale oddali za to życie. Obawiam się, że to wszystko, co wiem.","São criaturas que uma vez dominavam este mundo e querem consumir toda a vida daqui. Os antigos conseguiram selá-los, mas deram suas vidas no processo. Infelizmente isso é tudo o que eu sei.",,"Sunt creaturi care au condus cândva lumea asta și sunt determinați să-i consume toată viața. Cei antici au reușit să-i alunge, dar și-au dat viața pentru a reuși. Mă tem că asta e tot ce știu.","Эти существа когда-то правили этим миром и стремились выжать из него все соки. Древние смогли запечатать и изгнать их, пожертвовав своими жизнями. Больше, боюсь, я ничего не знаю.",,"De är varelser som en gång styrde den här världen och är fast beslutna att förtära dess liv. De gamla lyckades försegla dem, men gav sina liv i processen. Jag är rädd att det är allt jag vet.",Onlar bir zamanlar bu dünyaya hükmetmiş ve yaşamı tüketmeye kararlı yaratıklar. Eskiler onları mühürlemeyi başardılar ama bu süreçte canlarını verdiler. Korkarım tüm bildiğim bu. -Thanks... I'll do what I can.,TXT_RPLY0_SCRIPT22_D7580_THANK,〃,,,"Díky... Uvidím, co budu moct.","Tak... Jeg vil gøre, hvad jeg kan.",Danke. Ich werde tun was ich kann.,,Dankon... Mi faros ĉion eblan.,Gracias... Haré lo que pueda.,Gracias... Voy a hacer lo que pueda.,"Kiitos; teen, minkä pystyn.",Merci.. Je vais faire ce que je peux.,Kösz...megteszem amit tudok.,Grazie... farò il possibile.,ありがとう...精一杯の事をしよう。,고... 고마워. 내가 할 수 있는 것을 찾아보지.,Bedankt... Ik zal doen wat ik kan.,Takk skal du ha... Jeg skal gjøre hva jeg kan.,"Dzięki... Zrobię, co w mojej mocy.",Obrigado... Farei o possível.,,Merci... O să fac ce pot.,"Спасибо... Я сделаю всё, что смогу.",,Tack... Jag ska göra vad jag kan.,Teşekkürler. Elimden geleni yapacağım. -"Godspeed, friend.",TXT_DLG_SCRIPT22_D9096_GODSP,〃,,,"Zlom vaz, příteli.","Held og lykke, min ven.","Viel Erfolg, Freund.",,"Ŝancon, amiko.","Buena suerte, amigo.",,"Onnea matkaan, ystävä.","Bonne chance, mon ami.","Isten veled, barátom.","Ti auguro davvero di farcela, amico mio.",急ぎたまえ、同志よ。,"행운을 비네, 친구.","Goeie reis, vriend.","Lykke til, min venn.","Powodzenia, przyjacielu.","Boa sorte, amigo.",,"Noroc, prietene.","Удачи, друг.",,"Lycka till, min vän.","Yolun açık olsun, dostum." +Thanks... I'll do what I can.,TXT_RPLY0_SCRIPT22_D7580_THANK,〃,,,"Díky... Uvidím, co budu moct.","Tak... Jeg vil gøre, hvad jeg kan.",Danke. Ich werde tun was ich kann.,,Dankon... Mi faros ĉion eblan.,Gracias... Haré lo que pueda.,Gracias... Voy a hacer lo que pueda.,"Kiitos; teen, minkä pystyn.",Merci.. Je vais faire ce que je peux.,,Kösz...megteszem amit tudok.,Grazie... farò il possibile.,ありがとう...精一杯の事をしよう。,고... 고마워. 내가 할 수 있는 것을 찾아보지.,Bedankt... Ik zal doen wat ik kan.,Takk skal du ha... Jeg skal gjøre hva jeg kan.,"Dzięki... Zrobię, co w mojej mocy.",Obrigado... Farei o possível.,,Merci... O să fac ce pot.,"Спасибо... Я сделаю всё, что смогу.",,Tack... Jag ska göra vad jag kan.,Teşekkürler. Elimden geleni yapacağım. +"Godspeed, friend.",TXT_DLG_SCRIPT22_D9096_GODSP,〃,,,"Zlom vaz, příteli.","Held og lykke, min ven.","Viel Erfolg, Freund.",,"Ŝancon, amiko.","Buena suerte, amigo.",,"Onnea matkaan, ystävä.","Bonne chance, mon ami.",,"Isten veled, barátom.","Ti auguro davvero di farcela, amico mio.",急ぎたまえ、同志よ。,"행운을 비네, 친구.","Goeie reis, vriend.","Lykke til, min venn.","Powodzenia, przyjacielu.","Boa sorte, amigo.",,"Noroc, prietene.","Удачи, друг.",,"Lycka till, min vän.","Yolun açık olsun, dostum." Talk to the master Smithy if you have questions. All I do is put labels on the crates.,TXT_DLG_SCRIPT22_D10612_TALKT,"SVE.WAD -MAP22: C-shaped building → Apprentice.",,,"Promluv si s mistrem Smithym, jestli se chceš na něco zeptat. Já jenom dávám štítky na krabice.","Tal med mester Smithy, hvis du har spørgsmål. Jeg sætter bare etiketter på kasserne.","Sprich mit dem Meister Smithy, wenn du Fragen hast. Ich versehe die Kisten nur mit Etiketten.",,Parolu kun la majstro Smithy se vi havas demandojn. Mi limas min etiketi skatolojn.,Habla con el maestro Smithy si tienes preguntas. Lo único que hago yo es etiquetar las cajas.,,"Puhu pajamestarin kanssa, jos sinulla on kysyttävää. Minä vain leimaan laatikoita.","Parlez au maître Smithy si vous avez des questions. Tout ce que je fais, c'est mettre des étiquettes sur des caisses.",Beszélj Smithy mesterrel ha van kérdésed. Én csak címkéket rakok a hordókra.,Parla con il mastro Smithy se hai delle domande. Il mio unico compito è catalogare gli scatoli.,"相談がある場合は鍛冶屋のマスターに仰って +MAP22: C-shaped building → Apprentice.",,,"Promluv si s mistrem Smithym, jestli se chceš na něco zeptat. Já jenom dávám štítky na krabice.","Tal med mester Smithy, hvis du har spørgsmål. Jeg sætter bare etiketter på kasserne.","Sprich mit dem Meister Smithy, wenn du Fragen hast. Ich versehe die Kisten nur mit Etiketten.",,Parolu kun la majstro Smithy se vi havas demandojn. Mi limas min etiketi skatolojn.,Habla con el maestro Smithy si tienes preguntas. Lo único que hago yo es etiquetar las cajas.,,"Puhu pajamestarin kanssa, jos sinulla on kysyttävää. Minä vain leimaan laatikoita.","Parlez au maître Smithy si vous avez des questions. Tout ce que je fais, c'est mettre des étiquettes sur des caisses.",,Beszélj Smithy mesterrel ha van kérdésed. Én csak címkéket rakok a hordókra.,Parla con il mastro Smithy se hai delle domande. Il mio unico compito è catalogare gli scatoli.,"相談がある場合は鍛冶屋のマスターに仰って 下さい。私は箱にラベルを張っているだけです。",궁금한 게 있으면 스미시 제조장관님에게 물어봐. 내 업무는 상자에 표를 붙이는 것밖엔 없어.,Praat met meester Smithy als je vragen hebt. Het enige wat ik doe is etiketten op de kratten plakken.,"Snakk med smedmesteren hvis du har spørsmål. Alt jeg gjør, er å sette etiketter på kassene.","Porozmawiaj z mistrzem Smithy, jeśli masz pytania. Ja tylko naklejam etykiety na skrzyniach.",Fale com o mestre Smithy se tiver dúvidas. Tudo o que eu faço aqui é colocar etiquetas nas caixas.,,Vorbește cu maestrul Smithy dacă ai întrebări. Tot ce fac eu e să pun embleme pe cutii.,"Если у тебя есть какие-то вопросы, обратись к мастеру-кузнецу. Я просто клею ярлыки на ящики.",,Prata med mästersmeden om du har frågor. Allt jag gör är att sätta etiketter på lådorna.,Sorunuz olursa Demirci Usta ile konuşun. Tek yaptığım kasaların üzerine etiket yapıştırmak. -"What can I get you, citizen?",TXT_DLG_SCRIPT23_D0_WHATC,MAP23: Weapons,,,"Co vám mohu nabídnout, občane?","Hvad kan jeg skaffe dig, borger?","Was darf es sein, Bürger?",,"Kion mi donu al vi, civitano?","¿Qué puedo ofrecerte, ciudadano?",,"Mitä saisi olla, kansalainen?","Qu'est-ce que je peux faire pour vous, citoyen?","Miben segíthetek, polgártárs?","Che ti serve, cittadino?",何が入り用だ、お客さん?,"무엇을 줄까요, 형씨?","Wat kan ik voor je halen, burger?","Hva vil du ha, borger?","Co mogę ci dać, obywatelu?","Como posso ajudá-lo, cidadão?",,"Ce pot să-ți aduc, cetățeanule?","Что я могу тебе предложить, гражданин?",,"Vad vill du ha, medborgare?","Sana ne verebilirim, vatandaş?" -Ammo box,TXT_RPLY0_SCRIPT23_D0_AMMOB,〃,,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Boîte de munitions.,Lőszer doboz,Scatola di munizioni,銃弾倉,돌격소총 탄약 박스,Munitiedoos,En ammunisjonskasse.,Skrzynia z amunicją,Caixa de munição,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu -Here's your ammo.,TXT_RYES0_SCRIPT23_D0_HERES,〃,,,Tady je.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,Itt a lőszered.,Ecco le tue munizioni.,これでソチラのブツだ。,탄약을 구매해줘서 고마워요.,Hier is je munitie.,Her er ammunisjonen din.,To twoja amunicja.,Aqui está a sua munição.,,Aici e muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. +"What can I get you, citizen?",TXT_DLG_SCRIPT23_D0_WHATC,MAP23: Weapons,,,"Co vám mohu nabídnout, občane?","Hvad kan jeg skaffe dig, borger?","Was darf es sein, Bürger?",,"Kion mi donu al vi, civitano?","¿Qué puedo ofrecerte, ciudadano?",,"Mitä saisi olla, kansalainen?","Qu'est-ce que je peux faire pour vous, citoyen?",,"Miben segíthetek, polgártárs?","Che ti serve, cittadino?",何が入り用だ、お客さん?,"무엇을 줄까요, 형씨?","Wat kan ik voor je halen, burger?","Hva vil du ha, borger?","Co mogę ci dać, obywatelu?","Como posso ajudá-lo, cidadão?",,"Ce pot să-ți aduc, cetățeanule?","Что я могу тебе предложить, гражданин?",,"Vad vill du ha, medborgare?","Sana ne verebilirim, vatandaş?" +Ammo box,TXT_RPLY0_SCRIPT23_D0_AMMOB,〃,,,Krabici nábojů,Ammo kasse,Munitionsschachtel,,Munici-keston,Caja de municiones,,Ammuslaatikko,Boîte de munitions.,,Lőszer doboz,Scatola di munizioni,銃弾倉,돌격소총 탄약 박스,Munitiedoos,En ammunisjonskasse.,Skrzynia z amunicją,Caixa de munição,,Cutie cu muniție,Коробку патронов,,Ammunitionslåda,Cephane kutusu +Here's your ammo.,TXT_RYES0_SCRIPT23_D0_HERES,〃,,,Tady je.,Her er din ammunition.,Hier ist deine Munition.,,Jen via municio.,Aquí está tu munición.,,Tässä ammuksesi.,Voilà vos munitions.,,Itt a lőszered.,Ecco le tue munizioni.,これでソチラのブツだ。,탄약을 구매해줘서 고마워요.,Hier is je munitie.,Her er ammunisjonen din.,To twoja amunicja.,Aqui está a sua munição.,,Aici e muniția.,Вот твои патроны.,,Här är din ammunition.,İşte cephanen. You don't have enough for that!,TXT_RNO0_SCRIPT23_D0_YOUDO,〃,,,Na tu nemáš dost peněz!,Du har ikke nok til det!,Du hast nich genug Gold!,,"Vi ne havas -sufiĉe da mono!",¡No te alcanza para eso!,,Sinulla ei riitä rahat sitä varten!,Vous n'avez pas assez d'argent.,Nincs elég ehhez nálad!,Non hai abbastanza soldi per quello!,そんだけの金持ってないぞ!,가격에 맞게 돈을 가져오세요!,Daar heb je niet genoeg voor!,Du har ikke nok til det!,Nie masz na to dość!,Você não tem o suficiente para isto.,,Nu ai suficiente fonduri pentru asta.,У тебя недостаточно денег!,,Du har inte tillräckligt med ammunition för det!,Bunun için yeterince cephanen yok! -Crate of missiles,TXT_RPLY1_SCRIPT23_D0_CRATE,〃,,,Bednu raket,Kasse med missiler,Raketenkiste,,Misilet-keston,Caja de minimisiles,,Ohjuslaatikko,Caisse de missiles.,Ládányi rakéta,Cassa di razzi,ミサイル箱,미니 미사일 박스,Krat van raketten,Kasse med raketter,Skrzynia z pociskami,Caixa de mísseis,,Cutie de rachete.,Коробку ракет,,Låda med missiler,Füze sandığı -"Here, citizen.",TXT_RYES1_SCRIPT23_D0_HEREC,〃,,,"Tady, občane.","Her, borger.","Hier, Bürger.",,"Jen, civitano.","Toma, ciudadano.",,"Tässä, kansalainen.","Voilà, citoyen.","Parancsolj, polgártárs.","Ecco qua, cittadino",どうぞ、お客さん。,여기 있습니다.,"Hier, burger.","Her, borger.","Proszę, obywatelu.","Aqui, cidadão.",,"Aici, orășene.","Вот, гражданин.",,"Här, medborgare.","Buyur, vatandaş." +sufiĉe da mono!",¡No te alcanza para eso!,,Sinulla ei riitä rahat sitä varten!,Vous n'avez pas assez d'argent.,,Nincs elég ehhez nálad!,Non hai abbastanza soldi per quello!,そんだけの金持ってないぞ!,가격에 맞게 돈을 가져오세요!,Daar heb je niet genoeg voor!,Du har ikke nok til det!,Nie masz na to dość!,Você não tem o suficiente para isto.,,Nu ai suficiente fonduri pentru asta.,У тебя недостаточно денег!,,Du har inte tillräckligt med ammunition för det!,Bunun için yeterince cephanen yok! +Crate of missiles,TXT_RPLY1_SCRIPT23_D0_CRATE,〃,,,Bednu raket,Kasse med missiler,Raketenkiste,,Misilet-keston,Caja de minimisiles,,Ohjuslaatikko,Caisse de missiles.,,Ládányi rakéta,Cassa di razzi,ミサイル箱,미니 미사일 박스,Krat van raketten,Kasse med raketter,Skrzynia z pociskami,Caixa de mísseis,,Cutie de rachete.,Коробку ракет,,Låda med missiler,Füze sandığı +"Here, citizen.",TXT_RYES1_SCRIPT23_D0_HEREC,〃,,,"Tady, občane.","Her, borger.","Hier, Bürger.",,"Jen, civitano.","Toma, ciudadano.",,"Tässä, kansalainen.","Voilà, citoyen.",,"Parancsolj, polgártárs.","Ecco qua, cittadino",どうぞ、お客さん。,여기 있습니다.,"Hier, burger.","Her, borger.","Proszę, obywatelu.","Aqui, cidadão.",,"Aici, orășene.","Вот, гражданин.",,"Här, medborgare.","Buyur, vatandaş." "It's 85 gold, citizen!",TXT_RNO1_SCRIPT23_D0_ITS85,〃,,,"Ta stojí 85 zlatých, občane!","Det koster 85 guld, borger!","Das macht 85 Gold, Bürger!",,"Ĝi kostas 85 da oro, -civitano!","¡Son 85 de oro, ciudadano!",,"Se maksaa 85 kolikkoa, kansalainen!","Cela coûte 85 pièces, citoyen!","85 arany lesz, polgártárs.","Sono 85 pezzi d'oro, cittadino!",85ゴールドだぜ、お客さん!,그건 85골드입니다.,"Het is 85 goud, burger!","Det er 85 gull, borger!","To 85 złotych, obywatelu!","Custa 85 moedas de ouro, cidadão!",,"E 85 de monezi, orășene!","Гражданин, это стоит 85 золотых!",,"Det är 85 guld, medborgare!","85 altın, vatandaş!" -H-E grenades,TXT_RPLY2_SCRIPT23_D0_HEGRE,〃,,,Výbušné granáty,H-E granater,HE-Granaten,,Eksplodeg-povajn grenadojn,Granadas de conmoción,,Räjähdekranaatteja,Grenades explosives.,Robbanó gránátok,Granate ad alto potenziale esplosivo,HEグレネード,고폭 유탄,H-E-granaten,H-E-granater,Granaty H-E,Granadas explosivas,,Grenade.,Осколочные гранаты,,H-E-granater,H-E el bombaları -Here are your grenades.,TXT_RYES2_SCRIPT23_D0_HEREA,〃,,,Tady jsou.,Her er dine granater.,Hier sind deine Granaten.,,Jen viaj grenadoj.,Aquí tienes tus granadas.,,Tässä kranaattisi.,Voilà vos grenades.,Itt vannak a gránátaid.,Ecco le tue granate.,これでソチラのブツだ。,여기 유탄입니다.,Hier zijn je granaten.,Her er granatene dine.,Oto twoje granaty.,Aqui estão as suas granadas,,Aici sunt grenadele.,Забирай свои гранаты.,,Här är dina granater.,İşte el bombaların. +civitano!","¡Son 85 de oro, ciudadano!",,"Se maksaa 85 kolikkoa, kansalainen!","Cela coûte 85 pièces, citoyen!",,"85 arany lesz, polgártárs.","Sono 85 pezzi d'oro, cittadino!",85ゴールドだぜ、お客さん!,그건 85골드입니다.,"Het is 85 goud, burger!","Det er 85 gull, borger!","To 85 złotych, obywatelu!","Custa 85 moedas de ouro, cidadão!",,"E 85 de monezi, orășene!","Гражданин, это стоит 85 золотых!",,"Det är 85 guld, medborgare!","85 altın, vatandaş!" +H-E grenades,TXT_RPLY2_SCRIPT23_D0_HEGRE,〃,,,Výbušné granáty,H-E granater,HE-Granaten,,Eksplodeg-povajn grenadojn,Granadas de conmoción,,Räjähdekranaatteja,Grenades explosives.,,Robbanó gránátok,Granate ad alto potenziale esplosivo,HEグレネード,고폭 유탄,H-E-granaten,H-E-granater,Granaty H-E,Granadas explosivas,,Grenade.,Осколочные гранаты,,H-E-granater,H-E el bombaları +Here are your grenades.,TXT_RYES2_SCRIPT23_D0_HEREA,〃,,,Tady jsou.,Her er dine granater.,Hier sind deine Granaten.,,Jen viaj grenadoj.,Aquí tienes tus granadas.,,Tässä kranaattisi.,Voilà vos grenades.,,Itt vannak a gránátaid.,Ecco le tue granate.,これでソチラのブツだ。,여기 유탄입니다.,Hier zijn je granaten.,Her er granatene dine.,Oto twoje granaty.,Aqui estão as suas granadas,,Aici sunt grenadele.,Забирай свои гранаты.,,Här är dina granater.,İşte el bombaların. "They are 100 gold, friend.",TXT_RNO2_SCRIPT23_D0_THEYA,〃,,,"Ty stojí sto zlatých, příteli.","De koster 100 guld, ven.","Sie kosten 100 Gold, mein Freund.",,"Ili kostas cent da oro, -amiko!","Son cien de oro, amigo.",,"Ne maksavat 100 kolikkoa, ystäväiseni.","Cela coûte 100 pièces, mon ami.",100 aranyba kerülnek polgártársam.,"Ti servono 100 pezzi d'oro, amico.",100ゴールドだぜ、旦那!,"그건 100 골드야, 친구.","Ze zijn 100 goud, vriend.","De koster 100 gull, min venn.","Kosztują 100 złota, przyjacielu.","Custam 100 moedas, amigo.",,"Costă 100 de monezi, prietene.","Они по 100 золотых, друг.",,"De kostar 100 guld, vän.","Onlar 100 altın, dostum." -Energy pod,TXT_RPLY3_SCRIPT23_D0_ENERG,〃,,,Energetický kokón,Energibælg,Energiezelle.,,Energi-kapsulon,Cápsula de energía,,Energia-akku,Cellule énergetique.,Energia cella,Nucleo energetico,エネルギーポッド,에너지 포드,Energiecapsule,Energikapsel,Strąk energii,Célula de energia.,,Capsulă energetică.,Энергоячейку,,Energipod,Enerji kapsülü -Here you are.,TXT_RYES3_SCRIPT23_D0_HEREY,〃,,,Tady je.,Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,Parancsolj.,Eccolo qua.,どうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici este.,Получай.,,Här är den.,Buyurun. +amiko!","Son cien de oro, amigo.",,"Ne maksavat 100 kolikkoa, ystäväiseni.","Cela coûte 100 pièces, mon ami.",,100 aranyba kerülnek polgártársam.,"Ti servono 100 pezzi d'oro, amico.",100ゴールドだぜ、旦那!,"그건 100 골드야, 친구.","Ze zijn 100 goud, vriend.","De koster 100 gull, min venn.","Kosztują 100 złota, przyjacielu.","Custam 100 moedas, amigo.",,"Costă 100 de monezi, prietene.","Они по 100 золотых, друг.",,"De kostar 100 guld, vän.","Onlar 100 altın, dostum." +Energy pod,TXT_RPLY3_SCRIPT23_D0_ENERG,〃,,,Energetický kokón,Energibælg,Energiezelle.,,Energi-kapsulon,Cápsula de energía,,Energia-akku,Cellule énergetique.,,Energia cella,Nucleo energetico,エネルギーポッド,에너지 포드,Energiecapsule,Energikapsel,Strąk energii,Célula de energia.,,Capsulă energetică.,Энергоячейку,,Energipod,Enerji kapsülü +Here you are.,TXT_RYES3_SCRIPT23_D0_HEREY,〃,,,Tady je.,Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,,Parancsolj.,Eccolo qua.,どうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici este.,Получай.,,Här är den.,Buyurun. "That's 135 gold, sorry.",TXT_RNO3_SCRIPT23_D0_THATS,〃,,,"Ten stojí 135 zlatých, je mi líto.","Den koster 135 guld, beklager.","Entschuldigung, aber das macht 135 Gold.",,"Ĝi kostas 135 da oro. -Pardonon.","Son 135 de oro, lo siento.",,"Se 135 kolikkoa, valitan.","Cela coûte 135 pièces, désolé.","Sajnálom, de az 135 arany.","Mi spiace, ma costa 135 pezzi d'oro.",135ゴールドなんだ、ワリィ!,"미안하지만, 그건 135 골드입니다.","Dat is 135 goud, sorry.","Det er 135 gull, beklager.","To 135 złota, przepraszam.",Custa 135 moedas. Sinto muito.,,"Costă 135 de monezi, scuze.",Она стоит 135 золотых. Извини.,,"Den kostar 135 guld, tyvärr.","Bu 135 altın, üzgünüm." -What can I assist you with?,TXT_DLG_SCRIPT23_D1516_WHATC,MAP23: Armory (with Tevick locked).,,,S čím vám mohu pomoci?,Hvad kan jeg hjælpe dig med?,Wie kann ich dir behilflich sein?,,Kion vi bezonas?,¿Con qué puedo ayudarte?,,Miten voin auttaa?,Commen puis-je vous assister?,Miben segíthetek?,Come posso esserti utile?,何か手伝いましょうか?,어떤 걸 도와드릴까요?,Waarmee kan ik je helpen?,Hva kan jeg hjelpe deg med?,W czym mogę ci pomóc?,Como posso ajudá-lo?,,Cu ce te pot ajuta?,Чем я могу тебе помочь?,,Vad kan jag hjälpa dig med?,Size nasıl yardımcı olabilirim? -Leather armor,TXT_RPLY0_SCRIPT23_D1516_LEATH,〃,,Leather armour,Kožené brnění,Læder rustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure de cuir.,Bőr vért,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Skinnrustning.,Skórzana zbroja.,Armadura de couro,,Armură de piele,Кожаной бронёй,,Läderrustning,Deri zırh -Here it is citizen.,TXT_RYES0_SCRIPT23_D1516_HEREI,〃,,,"Tady je, občane.","Her er den, borger.","Hier ist sie, Bürger.",,"Jen, civitano.","Toma, ciudadano.",,"Tässä on, kansalainen.","Voilà pour vous, citoyen.",Parancsolj.,"Ecco qua, cittadino.",どうぞ、お客さん。,"여기 있어요, 형씨.",Hier is het een burger.,"Her er den, borger.","Oto ona, obywatelu.","Aqui está, cidadão.",,Aici e orășene.,"Вот она, гражданин.",,"Här är den, medborgare.",İşte vatandaş. +Pardonon.","Son 135 de oro, lo siento.",,"Se 135 kolikkoa, valitan.","Cela coûte 135 pièces, désolé.",,"Sajnálom, de az 135 arany.","Mi spiace, ma costa 135 pezzi d'oro.",135ゴールドなんだ、ワリィ!,"미안하지만, 그건 135 골드입니다.","Dat is 135 goud, sorry.","Det er 135 gull, beklager.","To 135 złota, przepraszam.",Custa 135 moedas. Sinto muito.,,"Costă 135 de monezi, scuze.",Она стоит 135 золотых. Извини.,,"Den kostar 135 guld, tyvärr.","Bu 135 altın, üzgünüm." +What can I assist you with?,TXT_DLG_SCRIPT23_D1516_WHATC,MAP23: Armory (with Tevick locked).,,,S čím vám mohu pomoci?,Hvad kan jeg hjælpe dig med?,Wie kann ich dir behilflich sein?,,Kion vi bezonas?,¿Con qué puedo ayudarte?,,Miten voin auttaa?,Commen puis-je vous assister?,,Miben segíthetek?,Come posso esserti utile?,何か手伝いましょうか?,어떤 걸 도와드릴까요?,Waarmee kan ik je helpen?,Hva kan jeg hjelpe deg med?,W czym mogę ci pomóc?,Como posso ajudá-lo?,,Cu ce te pot ajuta?,Чем я могу тебе помочь?,,Vad kan jag hjälpa dig med?,Size nasıl yardımcı olabilirim? +Leather armor,TXT_RPLY0_SCRIPT23_D1516_LEATH,〃,,Leather armour,Kožené brnění,Læder rustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure de cuir.,,Bőr vért,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Skinnrustning.,Skórzana zbroja.,Armadura de couro,,Armură de piele,Кожаной бронёй,,Läderrustning,Deri zırh +Here it is citizen.,TXT_RYES0_SCRIPT23_D1516_HEREI,〃,,,"Tady je, občane.","Her er den, borger.","Hier ist sie, Bürger.",,"Jen, civitano.","Toma, ciudadano.",,"Tässä on, kansalainen.","Voilà pour vous, citoyen.",,Parancsolj.,"Ecco qua, cittadino.",どうぞ、お客さん。,"여기 있어요, 형씨.",Hier is het een burger.,"Her er den, borger.","Oto ona, obywatelu.","Aqui está, cidadão.",,Aici e orășene.,"Вот она, гражданин.",,"Här är den, medborgare.",İşte vatandaş. There's no charity given here!,TXT_RNO0_SCRIPT23_D1516_THERE,〃,,,Nejsme charita!,Der gives ingen velgørenhed her!,Hier gibt es nichts umsonst!,,"Ĉi tio ne estas -almozulejo!",¡Aquí no damos limosna!,,Täällä ei harrasteta hyväntekeväisyyttä!,On n'est pas une charité ici.,"Sajnálom, ez nem jótékonyság.",Non facciamo beneficienza!,これはチャリティーじゃない!,돈이 부족하면 다른 곳을 알아봐! 여긴 자선단체가 아니라고!,Er wordt hier geen liefdadigheid gegeven!,Det er ingen veldedighet her!,Nie ma tu żadnej dobroczynności!,Aqui não é local de caridade!,,Nu facem caritate aici!,Я благотворительностью не занимаюсь!,,Det finns ingen välgörenhet här!,Burada sadaka verilmez! -Metal armor,TXT_RPLY1_SCRIPT23_D1516_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure de métal.,Fém vért,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowa zbroja.,Armadura de metal,,Armură de metal,Металлической бронёй,,Metall rustning,Metal zırh +almozulejo!",¡Aquí no damos limosna!,,Täällä ei harrasteta hyväntekeväisyyttä!,On n'est pas une charité ici.,,"Sajnálom, ez nem jótékonyság.",Non facciamo beneficienza!,これはチャリティーじゃない!,돈이 부족하면 다른 곳을 알아봐! 여긴 자선단체가 아니라고!,Er wordt hier geen liefdadigheid gegeven!,Det er ingen veldedighet her!,Nie ma tu żadnej dobroczynności!,Aqui não é local de caridade!,,Nu facem caritate aici!,Я благотворительностью не занимаюсь!,,Det finns ingen välgörenhet här!,Burada sadaka verilmez! +Metal armor,TXT_RPLY1_SCRIPT23_D1516_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure de métal.,,Fém vért,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowa zbroja.,Armadura de metal,,Armură de metal,Металлической бронёй,,Metall rustning,Metal zırh An excellent choice citizen.,TXT_RYES1_SCRIPT23_D1516_ANEXC,〃,,,"Výborná volba, občane.","Et glimrende valg, borger.","Eine exzellente Wahl, Bürger.",,"Bonega elekto, civitano.","Excelente elección, -ciudadano.",,"Erinomainen valinta, kansalainen.","Un excellent choix, citoyen.",Kiváló választás polgártárs.,"Ottima scelta, cittadino.",良い選択です。,"탁월한 선택이십니다, 형씨.","Een uitstekende keuze, burger.","Et utmerket valg, borger.","Doskonały wybór, obywatelu.","Excelente escolha, cidadão.",,Excelentă alegere orășene.,"Отличный выбор, гражданин.",,"Ett utmärkt val, medborgare.",Mükemmel bir seçim vatandaş. +ciudadano.",,"Erinomainen valinta, kansalainen.","Un excellent choix, citoyen.",,Kiváló választás polgártárs.,"Ottima scelta, cittadino.",良い選択です。,"탁월한 선택이십니다, 형씨.","Een uitstekende keuze, burger.","Et utmerket valg, borger.","Doskonały wybór, obywatelu.","Excelente escolha, cidadão.",,Excelentă alegere orășene.,"Отличный выбор, гражданин.",,"Ett utmärkt val, medborgare.",Mükemmel bir seçim vatandaş. You don't have enough for this!,TXT_RNO1_SCRIPT23_D1516_YOUDO,〃,,,Na to nemáte dost peněz!,Du har ikke nok til dette!,Du hast nich genug Gold dafür!,,"Vi ne havas -sufiĉe da mono!",¡No te alcanza!,,Rahasi ei riitä siihen!,Vous n'avez pas assez d'argent.,Nincs elég ehhez nálad!,Non hai abbastanza soldi per questo!,これでは足りない!,이것을 구입하기엔 돈이 부족합니다!,Je hebt hier niet genoeg voor!,Du har ikke nok til dette!,Nie masz na to dość!,Você não tem o suficiente para isto!,,Nu ai suficiente fonduri pentru asta!,У тебя недостаточно денег!,,Du har inte tillräckligt för detta!,Bunun için yeterli değilsin! -Environmental suit,TXT_RPLY2_SCRIPT23_D1516_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat.,Védőruha,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Kombinezon ekologiczny,Traje de proteção,,Costum de Protecție împotriva Mediului,Защитным костюмом,,Miljödräkt,Çevre kıyafeti -Here you are.,TXT_RYES2_SCRIPT23_D1516_HEREY,〃,,,Tady máte.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Kas tässä.,Voilà pour vous.,"Itt van, parancsolj.",Eccola qua.,どうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici este.,Держи.,,Här är du.,İşte buradasın. +sufiĉe da mono!",¡No te alcanza!,,Rahasi ei riitä siihen!,Vous n'avez pas assez d'argent.,,Nincs elég ehhez nálad!,Non hai abbastanza soldi per questo!,これでは足りない!,이것을 구입하기엔 돈이 부족합니다!,Je hebt hier niet genoeg voor!,Du har ikke nok til dette!,Nie masz na to dość!,Você não tem o suficiente para isto!,,Nu ai suficiente fonduri pentru asta!,У тебя недостаточно денег!,,Du har inte tillräckligt för detta!,Bunun için yeterli değilsin! +Environmental suit,TXT_RPLY2_SCRIPT23_D1516_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat.,,Védőruha,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Kombinezon ekologiczny,Traje de proteção,,Costum de Protecție împotriva Mediului,Защитным костюмом,,Miljödräkt,Çevre kıyafeti +Here you are.,TXT_RYES2_SCRIPT23_D1516_HEREY,〃,,,Tady máte.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Kas tässä.,Voilà pour vous.,,"Itt van, parancsolj.",Eccola qua.,どうぞ。,여기 있습니다.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici este.,Держи.,,Här är du.,İşte buradasın. "No money, no suit.",TXT_RNO2_SCRIPT23_D1516_NOMON,〃,,,Bez peněz pro oděvy nelez.,"Ingen penge, ingen dragt.","Kein Geld, kein Anzug.",,"Sen mono -ne estas vesto.",Sin dinero no hay traje.,,"Ei rahaa, ei pukua.","Pas d'argent, pas de combi.","Ha nincs pénz, nincs védőruha.","Niente denaro, niente completo.",金が無いならスーツは無しだ。,돈이 없다면 방호복을 줄 수 없습니다.,"Geen geld, geen pak.","Ingen penger, ingen drakt.","Nie ma pieniędzy, nie ma kombinezonu.","Sem dinheiro, sem traje.",,"Niciun ban, niciun costum.","Нет денег, нет костюма.",,"Inga pengar, ingen dräkt.","Para yok, takım elbise yok." -Something different?,TXT_RPLY3_SCRIPT23_D1516_SOMET,〃,,,Něco jiného?,Noget andet?,Irgendetwas anderes?,,Ion alian...?,¿Algo distinto?,,Jotain erilaista?,Quelque chose d'autre?,Valami mást esetleg?,Qualcos'altro?,何か別のやつは?,뭔가 다른 거는?,Iets anders?,Noe annet?,Coś innego?,Algo diferente?,,Ceva diferit?,Что-нибудь ещё?,,Något annat?,Farklı bir şey mi var? +ne estas vesto.",Sin dinero no hay traje.,,"Ei rahaa, ei pukua.","Pas d'argent, pas de combi.",,"Ha nincs pénz, nincs védőruha.","Niente denaro, niente completo.",金が無いならスーツは無しだ。,돈이 없다면 방호복을 줄 수 없습니다.,"Geen geld, geen pak.","Ingen penger, ingen drakt.","Nie ma pieniędzy, nie ma kombinezonu.","Sem dinheiro, sem traje.",,"Niciun ban, niciun costum.","Нет денег, нет костюма.",,"Inga pengar, ingen dräkt.","Para yok, takım elbise yok." +Something different?,TXT_RPLY3_SCRIPT23_D1516_SOMET,〃,,,Něco jiného?,Noget andet?,Irgendetwas anderes?,,Ion alian...?,¿Algo distinto?,,Jotain erilaista?,Quelque chose d'autre?,,Valami mást esetleg?,Qualcos'altro?,何か別のやつは?,뭔가 다른 거는?,Iets anders?,Noe annet?,Coś innego?,Algo diferente?,,Ceva diferit?,Что-нибудь ещё?,,Något annat?,Farklı bir şey mi var? Go through the door down the hall.,TXT_RYES3_SCRIPT23_D1516_GOTHR,〃,,,Jděte dveřmi dole na chodbě.,Gå gennem døren nede ad gangen.,Geh durch die Tür zur Halle.,,"Iru ĉe Tevick en la dekstra ĉambro.","Con Tevick en la -habitación a la derecha.",,Mene ovesta käytävän päässä.,"Passez par la porte, vers le hall.",Menj át a csarnok végén levő ajtón.,Vai oltre la porta alla fine della stanza.,ホールのドアを通るんだ。,복도를 따라 문을 향해 가보세요.,Ga door de deur aan het einde van de gang.,Gå gjennom døren i gangen.,Przejdź przez drzwi na końcu korytarza.,Passe pela porta lá no salão.,,Intră pe ușa din josul holului.,"Дальше по коридору, за дверью.",,Gå genom dörren i korridoren.,Koridorun sonundaki kapıdan geç. -You must pay if you want to play.,TXT_RNO3_SCRIPT23_D1516_YOUMU,〃,,,Chceš si hrát? Zaplať.,"Du skal betale, hvis du vil spille.","Du musst bezahlen, wenn du spielen willst.",,Nenio estas senpaga.,Nada es gratis.,,"Ken leikkiin ryhtyy, se leikistä maksakoon.",Vous devez payer si vous voulez jouer.,Fizetned kell hogy játszhass.,Devi pagare se vuoi giocare.,プレイするなら支払うべきだ。,할려면 돈을 먼저 주세요.,Je moet betalen als je wilt spelen.,Du må betale hvis du vil spille.,"Musisz zapłacić, jeśli chcesz grać.",Você precisa pagar se quiser jogar.,,Trebuie să plătești dacă vrei să joci.,"Любишь играть, люби и платить!",,Du måste betala om du vill spela.,Oynamak istiyorsan ödeme yapmalısın. -What can I get you?,TXT_DLG_SCRIPT23_D3032_WHATC,MAP23: Armory (with Tevick unlocked).,,,Co vám mohu nabídnout?,Hvad kan jeg give dig?,Was darf es sein?,,Kion mi donu al vi?,¿Qué puedo ofrecerte?,,Mitä teille saisi olla?,Que puis-je pour vous?,Mit adhatok?,Cosa ti porto?,何をお求めで?,무엇을 드릴까요?,Wat kan ik voor je halen?,Hva vil du ha?,Co mogę ci dać?,O que gostaria?,,Ce pot să-ți aduc?,Что я могу тебе предложить?,,Vad kan jag ge dig?,Sana ne verebilirim? -Leather armor,TXT_RPLY0_SCRIPT23_D3032_LEATH,〃,,Leather armour,Kožené brnění,En læderrustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure de cuir.,Bőr vért,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,En skinnrustning.,Skórzaną zbroję.,Armadura de couro,,Armură de piele,Кожаную броню,,En läderrustning,Deri zırh. -"Here it is, citizen.",TXT_RYES0_SCRIPT23_D3032_HEREI,〃,,,"Tady je, občane.","Her er den, borger.","Hier ist sie, Bürger.",,"Jen, civitano.","Toma, ciudadano.",,"Tästä saat, kansalainen.","Voilà pour vous, citoyen.","Parancsolj, polgártárs.","Ecco qua, cittadino.",どうぞ、お客さん。,"적절히 입으세요, 시민.","Hier is het, burger.","Vær så god, borger.","Oto ona, obywatelu.","Aqui está, cidadão.",,"Aici este, orășene.","Вот она, гражданин.",,"Här är den, medborgare.","İşte burada, vatandaş." +habitación a la derecha.",,Mene ovesta käytävän päässä.,"Passez par la porte, vers le hall.",,Menj át a csarnok végén levő ajtón.,Vai oltre la porta alla fine della stanza.,ホールのドアを通るんだ。,복도를 따라 문을 향해 가보세요.,Ga door de deur aan het einde van de gang.,Gå gjennom døren i gangen.,Przejdź przez drzwi na końcu korytarza.,Passe pela porta lá no salão.,,Intră pe ușa din josul holului.,"Дальше по коридору, за дверью.",,Gå genom dörren i korridoren.,Koridorun sonundaki kapıdan geç. +You must pay if you want to play.,TXT_RNO3_SCRIPT23_D1516_YOUMU,〃,,,Chceš si hrát? Zaplať.,"Du skal betale, hvis du vil spille.","Du musst bezahlen, wenn du spielen willst.",,Nenio estas senpaga.,Nada es gratis.,,"Ken leikkiin ryhtyy, se leikistä maksakoon.",Vous devez payer si vous voulez jouer.,,Fizetned kell hogy játszhass.,Devi pagare se vuoi giocare.,プレイするなら支払うべきだ。,할려면 돈을 먼저 주세요.,Je moet betalen als je wilt spelen.,Du må betale hvis du vil spille.,"Musisz zapłacić, jeśli chcesz grać.",Você precisa pagar se quiser jogar.,,Trebuie să plătești dacă vrei să joci.,"Любишь играть, люби и платить!",,Du måste betala om du vill spela.,Oynamak istiyorsan ödeme yapmalısın. +What can I get you?,TXT_DLG_SCRIPT23_D3032_WHATC,MAP23: Armory (with Tevick unlocked).,,,Co vám mohu nabídnout?,Hvad kan jeg give dig?,Was darf es sein?,,Kion mi donu al vi?,¿Qué puedo ofrecerte?,,Mitä teille saisi olla?,Que puis-je pour vous?,,Mit adhatok?,Cosa ti porto?,何をお求めで?,무엇을 드릴까요?,Wat kan ik voor je halen?,Hva vil du ha?,Co mogę ci dać?,O que gostaria?,,Ce pot să-ți aduc?,Что я могу тебе предложить?,,Vad kan jag ge dig?,Sana ne verebilirim? +Leather armor,TXT_RPLY0_SCRIPT23_D3032_LEATH,〃,,Leather armour,Kožené brnění,En læderrustning,Lederrüstung,,Ledan armaĵon,Armadura de cuero,,Nahkasuojus,Armure de cuir.,,Bőr vért,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,En skinnrustning.,Skórzaną zbroję.,Armadura de couro,,Armură de piele,Кожаную броню,,En läderrustning,Deri zırh. +"Here it is, citizen.",TXT_RYES0_SCRIPT23_D3032_HEREI,〃,,,"Tady je, občane.","Her er den, borger.","Hier ist sie, Bürger.",,"Jen, civitano.","Toma, ciudadano.",,"Tästä saat, kansalainen.","Voilà pour vous, citoyen.",,"Parancsolj, polgártárs.","Ecco qua, cittadino.",どうぞ、お客さん。,"적절히 입으세요, 시민.","Hier is het, burger.","Vær så god, borger.","Oto ona, obywatelu.","Aqui está, cidadão.",,"Aici este, orășene.","Вот она, гражданин.",,"Här är den, medborgare.","İşte burada, vatandaş." There's no charity given here!,TXT_RNO0_SCRIPT23_D3032_THERE,〃,,,Nejsme charita!,Der gives ingen velgørenhed her!,Hier gibt es nichts umsonst!,,"Ĉi tio ne estas -almozulejo!",¡Aquí no damos limosna!,,Tämä ei ole mikään hyväntekeväisyyspulju!,On n'est pas une charité ici.,"Sajnálom, ez nem jótékonyság.",Non facciamo beneficienza!,これはチャリティーじゃない!,딴 데 가서 구걸하세요!,Er wordt hier geen liefdadigheid gegeven!,Det er ingen veldedighet her!,Nie ma tu dobroczynności!,Aqui não é local de caridade!,,Nu facem caritate aici!,Я благотворительностью не занимаюсь!,,Det finns ingen välgörenhet här!,Burada sadaka verilmez! -Metal armor,TXT_RPLY1_SCRIPT23_D3032_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure de métal.,Fém vért,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowa zbroja.,Armadura de metal,,Armură de metal,Металлическую броню,,Metallrustning,Metal zırh +almozulejo!",¡Aquí no damos limosna!,,Tämä ei ole mikään hyväntekeväisyyspulju!,On n'est pas une charité ici.,,"Sajnálom, ez nem jótékonyság.",Non facciamo beneficienza!,これはチャリティーじゃない!,딴 데 가서 구걸하세요!,Er wordt hier geen liefdadigheid gegeven!,Det er ingen veldedighet her!,Nie ma tu dobroczynności!,Aqui não é local de caridade!,,Nu facem caritate aici!,Я благотворительностью не занимаюсь!,,Det finns ingen välgörenhet här!,Burada sadaka verilmez! +Metal armor,TXT_RPLY1_SCRIPT23_D3032_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure de métal.,,Fém vért,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metall rustning,Metalowa zbroja.,Armadura de metal,,Armură de metal,Металлическую броню,,Metallrustning,Metal zırh An excellent choice citizen.,TXT_RYES1_SCRIPT23_D3032_ANEXC,〃,,,"Výborná volba, občane.","Et fremragende valg, borger.","Eine exzellente Wahl, Bürger.",,"Bonega elekto, civitano.","Excelente elección, -ciudadano.",,"Erinomainen valinta, kansalainen.","Un excellent choix, citoyen.",Kiváló választás polgártárs.,"Ottima scelta, cittadino.",良い選択だ。,탄탄한 게 잘 보호해준답니다.,Een uitstekende keuze voor de burger.,"Et utmerket valg, borger.",Doskonały wybór obywatelu.,"Excelente escolha, cidadão.",,Excelentă alegere orășene.,"Отличный выбор, гражданин.",,"Ett utmärkt val, medborgare.",Mükemmel bir seçim vatandaş. +ciudadano.",,"Erinomainen valinta, kansalainen.","Un excellent choix, citoyen.",,Kiváló választás polgártárs.,"Ottima scelta, cittadino.",良い選択だ。,탄탄한 게 잘 보호해준답니다.,Een uitstekende keuze voor de burger.,"Et utmerket valg, borger.",Doskonały wybór obywatelu.,"Excelente escolha, cidadão.",,Excelentă alegere orășene.,"Отличный выбор, гражданин.",,"Ett utmärkt val, medborgare.",Mükemmel bir seçim vatandaş. You don't have enough for this!,TXT_RNO1_SCRIPT23_D3032_YOUDO,〃,,,Na to nemáte dost peněz!,Du har ikke nok til dette!,Du hast nich genug Gold dafür!,,"Vi ne havas -sufiĉe da mono!",¡No te alcanza!,,Sinulla ei rahat riitä siihen!,Vous n'avez pas assez d'argent.,Nincs elég ehhez nálad!,Non hai abbastanza soldi per questo!,これでは足りない!,돈이 부족합니다. 다른 건 어떠신가요?,Je hebt hier niet genoeg voor!,Du har ikke nok til dette!,Nie masz na to dość!,Você não tem o suficiente para isto!,,Nu ai suficiente fonduri pentru asta!,У тебя недостаточно денег!,,Du har inte tillräckligt för detta!,Bunun için yeterli değilsin! -Environmental suit,TXT_RPLY2_SCRIPT23_D3032_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat.,Védő ruha,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Kombinezon ekologiczny,Traje de proteção,,Costum de Protecție împotriva Mediului,Защитный костюм,,Miljödräkt,Çevre kıyafeti -Here you are.,TXT_RYES2_SCRIPT23_D3032_HEREY,〃,,,Tady máte.,Her er du.,Bitteschön.,,Jen.,Toma.,,Olkaa hyvä.,Voilà pour vous.,Parancsolj.,Eccoti qui.,どうぞ。,여기 받으세요!,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici este.,Держи.,,Här är du.,İşte buradasın. +sufiĉe da mono!",¡No te alcanza!,,Sinulla ei rahat riitä siihen!,Vous n'avez pas assez d'argent.,,Nincs elég ehhez nálad!,Non hai abbastanza soldi per questo!,これでは足りない!,돈이 부족합니다. 다른 건 어떠신가요?,Je hebt hier niet genoeg voor!,Du har ikke nok til dette!,Nie masz na to dość!,Você não tem o suficiente para isto!,,Nu ai suficiente fonduri pentru asta!,У тебя недостаточно денег!,,Du har inte tillräckligt för detta!,Bunun için yeterli değilsin! +Environmental suit,TXT_RPLY2_SCRIPT23_D3032_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat.,,Védő ruha,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Kombinezon ekologiczny,Traje de proteção,,Costum de Protecție împotriva Mediului,Защитный костюм,,Miljödräkt,Çevre kıyafeti +Here you are.,TXT_RYES2_SCRIPT23_D3032_HEREY,〃,,,Tady máte.,Her er du.,Bitteschön.,,Jen.,Toma.,,Olkaa hyvä.,Voilà pour vous.,,Parancsolj.,Eccoti qui.,どうぞ。,여기 받으세요!,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici este.,Держи.,,Här är du.,İşte buradasın. "No money, no suit.",TXT_RNO2_SCRIPT23_D3032_NOMON,〃,,,Bez peněz pro oděvy nelez.,"Ingen penge, ingen dragt.","Kein Geld, kein Anzug.",,"Sen mono -ne estas vesto.",Sin dinero no hay traje.,,"Ei rahaa, ei pukua.","Pas d'argent, pas de combi.","Ha nincs pénz, nincs védőruha.","Niente denaro, niente completo.",金が無いならスーツは無しだ。,방호복을 사기엔 돈이 부족합니다.,"Geen geld, geen pak.","Ingen penger, ingen drakt.","Nie ma pieniędzy, nie ma kombinezonu.","Sem dinheiro, sem traje.",,"Niciun ban, niciun costum.","Нет денег, нет костюма.",,"Inga pengar, ingen dräkt.","Para yok, takım elbise yok." -How can I help you today?,TXT_DLG_SCRIPT23_D4548_HOWCA,MAP23: Hospital,,,S čím vám mohu dnes pomoci?,Hvordan kan jeg hjælpe dig i dag?,Wie kann ich dir heute weiterhelfen?,,Kiel mi helpu vin hodiaŭ?,¿Cómo puedo ayudarte hoy?,,Miten voin tänään olla avuksi?,Comment puis-je vous aider aujourd'hui?,Miben segíthetek ezen a szép napon?,Come posso aiutarti oggi?,本日は何の用で?,환영합니다. 뭔가 필요하신지요?,Hoe kan ik u vandaag helpen?,Hvordan kan jeg hjelpe deg i dag?,Jak mogę ci dziś pomóc?,Como posso ajudá-lo hoje?,,Cu ce te pot ajuta azi?,Чем я могу тебе помочь сегодня?,,Hur kan jag hjälpa dig i dag?,Bugün size nasıl yardımcı olabilirim? -Med patch,TXT_RPLY0_SCRIPT23_D4548_MEDPA,〃,,,Obvazy,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekäärettä,Pansement.,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Bandaj medical,Бинтами,,Medicinsk plåster,İlaç yaması -Here's your patch.,TXT_RYES0_SCRIPT23_D4548_HERES,〃,,,Tady jsou.,Her er dit plaster.,Hier ist deine Bandage.,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreesi.,Voilà votre pansement.,Itt a tapaszod.,Ecco le tue bende.,これが貴方のパッチです。,의료 붕대 하나. 경마한 부상에 쓰시길.,Hier is je patch.,Her er plasteret ditt.,Oto twój bandaż.,Aqui está sua compressa.,,Aici e bandajul.,Вот твой набор бинтов.,,Här är ditt plåster.,İşte yaman. +ne estas vesto.",Sin dinero no hay traje.,,"Ei rahaa, ei pukua.","Pas d'argent, pas de combi.",,"Ha nincs pénz, nincs védőruha.","Niente denaro, niente completo.",金が無いならスーツは無しだ。,방호복을 사기엔 돈이 부족합니다.,"Geen geld, geen pak.","Ingen penger, ingen drakt.","Nie ma pieniędzy, nie ma kombinezonu.","Sem dinheiro, sem traje.",,"Niciun ban, niciun costum.","Нет денег, нет костюма.",,"Inga pengar, ingen dräkt.","Para yok, takım elbise yok." +How can I help you today?,TXT_DLG_SCRIPT23_D4548_HOWCA,MAP23: Hospital,,,S čím vám mohu dnes pomoci?,Hvordan kan jeg hjælpe dig i dag?,Wie kann ich dir heute weiterhelfen?,,Kiel mi helpu vin hodiaŭ?,¿Cómo puedo ayudarte hoy?,,Miten voin tänään olla avuksi?,Comment puis-je vous aider aujourd'hui?,,Miben segíthetek ezen a szép napon?,Come posso aiutarti oggi?,本日は何の用で?,환영합니다. 뭔가 필요하신지요?,Hoe kan ik u vandaag helpen?,Hvordan kan jeg hjelpe deg i dag?,Jak mogę ci dziś pomóc?,Como posso ajudá-lo hoje?,,Cu ce te pot ajuta azi?,Чем я могу тебе помочь сегодня?,,Hur kan jag hjälpa dig i dag?,Bugün size nasıl yardımcı olabilirim? +Med patch,TXT_RPLY0_SCRIPT23_D4548_MEDPA,〃,,,Obvazy,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekäärettä,Pansement.,,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Bandaj medical,Бинтами,,Medicinsk plåster,İlaç yaması +Here's your patch.,TXT_RYES0_SCRIPT23_D4548_HERES,〃,,,Tady jsou.,Her er dit plaster.,Hier ist deine Bandage.,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä kääreesi.,Voilà votre pansement.,,Itt a tapaszod.,Ecco le tue bende.,これが貴方のパッチです。,의료 붕대 하나. 경마한 부상에 쓰시길.,Hier is je patch.,Her er plasteret ditt.,Oto twój bandaż.,Aqui está sua compressa.,,Aici e bandajul.,Вот твой набор бинтов.,,Här är ditt plåster.,İşte yaman. That is 15 gold my friend.,TXT_RNO0_SCRIPT23_D4548_THATI,〃,,,"Ty stojí patnáct zlatých, příteli.","Det er 15 guld, min ven.","Das macht 15 Gold, mein Freund.",,"Ili kostas dek kvin -da oro, amiko.","Son quince de oro, amigo.",,"Se maksaa 15 kolikkoa, ystäväiseni.","15 pièces pour ça, mon ami.",15 arany lesz barátocskám.,Sono 15 pezzi d'oro amico mio.,これは15ゴールドですよ。,15 골드가 없습니까? 유감이군요.,"Dat is 15 goud, mijn vriend.","Det er 15 gull, min venn.","To jest 15 złota, mój przyjacielu.","Custa 15 moedas de ouro, meu amigo.",,E 15 monezi prietene.,"Они стоят 15 монет, друг.",,"Det är 15 guld, min vän.",Bu 15 altın dostum. -Medical kit,TXT_RPLY1_SCRIPT23_D4548_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit médical.,Elsősegély doboz,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Zestaw medyczny,Kit médico,,Kit medical,Аптечкой,,Medicinsk utrustning,Tıbbi kit -Here's your medical kit.,TXT_RYES1_SCRIPT23_D4548_HERES,〃,,,Tady je.,Her er dit medicinske kit.,Hier ist dein Verbandskasten,,Jen via sukurkesto.,Aquí tienes tu botiquín.,,Tässä lääkintälaukkusi.,Voilà votre kit médical.,Itt az elsősegély dobozod.,Ecco il tuo kid medico.,これが貴方のキットです。,구급 키트는 아주 유용하죠. 잘 쓰시길!,Hier is je medische uitrusting.,Her er medisinskrinet ditt.,Oto twój zestaw medyczny.,Aqui está o seu kit médico,,Aici e kitul medical.,Вот твоя аптечка.,,Här är ditt medicinska utrustning.,İşte tıbbi çantan. -Your a bit low on funds for that.,TXT_RNO1_SCRIPT23_D4548_YOURA,〃,,,Na tu nemáte dost.,Du har lidt for få midler til det.,Du hast zu wenig Geld dafür.,,Mankas mono al vi.,Estás algo falto de dinero.,,Rahasi eivät ihan riitä siihen.,Vous manquez d'argent pour ça.,Kevés lesz a pénzed ehhez most.,Sei un po' a corto di fondi per quello.,お金が少し足りませんよ。,돈이 부족하군요. 못 줍니다!,Je hebt daar een beetje weinig geld voor.,Du har litt lite penger til det.,Trochę brakuje ci na to funduszy.,Você está um pouco mal de dinheiro pra isso.,,Cam puțini bani pentru aia.,Тебе на это не хватает средств.,,Du har inte så mycket pengar för det.,Bunun için biraz az paran var. -Field surgery kit,TXT_RPLY2_SCRIPT23_D4548_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie.,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Zestaw do chirurgii polowej,Kit de cirurgia,,Kit chirurgical de teren.,Медкомплектом,,Fältkirurgisk utrustning,Saha ameliyat kiti -One field surgery kit.,TXT_RYES2_SCRIPT23_D4548_ONEFI,〃,,,Jedna souprava.,Et kirurgisæt.,"Eine Erste-Hilfe-Kasten, kommt sofort.",,Kirurgia kesto. Farite.,Un kit quirúrgico. Listo.,,"Yksi kirurgilaukku, tässä.","Un kit de chirurgie, voilà.","Parancsolj, egy műtéti felszerelés.","Un kit chirurgico, eccolo qua.",手術キット一丁。,아주 위박한 상황에 쓰시길. 여기 수술 키트입니다!,Een veldoperatiekit.,Ett kirurgisk sett.,Jeden zestaw do chirurgii polowej.,Um kit de cirurgia.,,"Un kit chirurgical de teren, gata.",Один медкомплект. Держи.,,Ett fältkirurgiskt utrustning.,Bir saha ameliyat kiti. +da oro, amiko.","Son quince de oro, amigo.",,"Se maksaa 15 kolikkoa, ystäväiseni.","15 pièces pour ça, mon ami.",,15 arany lesz barátocskám.,Sono 15 pezzi d'oro amico mio.,これは15ゴールドですよ。,15 골드가 없습니까? 유감이군요.,"Dat is 15 goud, mijn vriend.","Det er 15 gull, min venn.","To jest 15 złota, mój przyjacielu.","Custa 15 moedas de ouro, meu amigo.",,E 15 monezi prietene.,"Они стоят 15 монет, друг.",,"Det är 15 guld, min vän.",Bu 15 altın dostum. +Medical kit,TXT_RPLY1_SCRIPT23_D4548_MEDIC,〃,,,Lékárničku,Medicinsk kit,Verbandskasten,,Sukurkesto,Botiquín,,Lääkintälaukku,Kit médical.,,Elsősegély doboz,Kit medico,医療用キット,구급 키트,Medische kit,Medisinsk utstyr,Zestaw medyczny,Kit médico,,Kit medical,Аптечкой,,Medicinsk utrustning,Tıbbi kit +Here's your medical kit.,TXT_RYES1_SCRIPT23_D4548_HERES,〃,,,Tady je.,Her er dit medicinske kit.,Hier ist dein Verbandskasten,,Jen via sukurkesto.,Aquí tienes tu botiquín.,,Tässä lääkintälaukkusi.,Voilà votre kit médical.,,Itt az elsősegély dobozod.,Ecco il tuo kid medico.,これが貴方のキットです。,구급 키트는 아주 유용하죠. 잘 쓰시길!,Hier is je medische uitrusting.,Her er medisinskrinet ditt.,Oto twój zestaw medyczny.,Aqui está o seu kit médico,,Aici e kitul medical.,Вот твоя аптечка.,,Här är ditt medicinska utrustning.,İşte tıbbi çantan. +Your a bit low on funds for that.,TXT_RNO1_SCRIPT23_D4548_YOURA,〃,,,Na tu nemáte dost.,Du har lidt for få midler til det.,Du hast zu wenig Geld dafür.,,Mankas mono al vi.,Estás algo falto de dinero.,,Rahasi eivät ihan riitä siihen.,Vous manquez d'argent pour ça.,,Kevés lesz a pénzed ehhez most.,Sei un po' a corto di fondi per quello.,お金が少し足りませんよ。,돈이 부족하군요. 못 줍니다!,Je hebt daar een beetje weinig geld voor.,Du har litt lite penger til det.,Trochę brakuje ci na to funduszy.,Você está um pouco mal de dinheiro pra isso.,,Cam puțini bani pentru aia.,Тебе на это не хватает средств.,,Du har inte så mycket pengar för det.,Bunun için biraz az paran var. +Field surgery kit,TXT_RPLY2_SCRIPT23_D4548_FIELD,〃,,,Chirurgickou soupravu,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie.,,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Zestaw do chirurgii polowej,Kit de cirurgia,,Kit chirurgical de teren.,Медкомплектом,,Fältkirurgisk utrustning,Saha ameliyat kiti +One field surgery kit.,TXT_RYES2_SCRIPT23_D4548_ONEFI,〃,,,Jedna souprava.,Et kirurgisæt.,"Eine Erste-Hilfe-Kasten, kommt sofort.",,Kirurgia kesto. Farite.,Un kit quirúrgico. Listo.,,"Yksi kirurgilaukku, tässä.","Un kit de chirurgie, voilà.",,"Parancsolj, egy műtéti felszerelés.","Un kit chirurgico, eccolo qua.",手術キット一丁。,아주 위박한 상황에 쓰시길. 여기 수술 키트입니다!,Een veldoperatiekit.,Ett kirurgisk sett.,Jeden zestaw do chirurgii polowej.,Um kit de cirurgia.,,"Un kit chirurgical de teren, gata.",Один медкомплект. Держи.,,Ett fältkirurgiskt utrustning.,Bir saha ameliyat kiti. Come back when you have money!,TXT_RNO2_SCRIPT23_D4548_COMEB,〃,,,"Vrať se, až budeš mít peníze!","Kom tilbage, når du har penge!","Komm wieder, wenn du etwas Geld hast.",,"Revenu kiam vi havos monon!","¡Vuelve cuando -tengas dinero!",,"Tule takaisin, kun sinulla on rahaa!",Revenez quand vous avez des sous?,"Akkor gyere vissza, ha pénzed is lesz!",Torna quando avrai del denaro!,お金が有る時にまた!,"돈이 많이 있으면 모를까, 살 수 없을겁니다!",Kom terug als je geld hebt!,Kom tilbake når du har penger!,"Wróć, gdy będziesz miał pieniądze!",Volte quando tiver dinheiro!,,Revino când o să ai bani!,Возвращайся с деньгами!,,Kom tillbaka när du har pengar!,Paran olduğunda geri gel! -"Hello friend, what can I get you?",TXT_DLG_SCRIPT23_D6064_HELLO,MAP23: Barkeep.,,,"Zdravím, příteli, co pro vás mohu udělat?","Hej ven, hvad kan jeg give dig?","Hallo Freund, was darf es sein?",,"Saluton, amiko. Kion mi donu al vi?","Hola, amigo. ¿Qué puedo ofrecerte?",,"Tervehdys, ystävä; miten voin olla avuksi?","Bienvenu, l'ami, que puis-je pour vous?","Szevasz barátom, miben segíthetek?","Salve amico, cosa posso darti?",よう旦那、何が必要だ?,좋은 하루! 뭐 필요한거라도?,"Hallo vriend, wat kan ik voor je halen?","Hei venn, hva kan jeg gi deg?","Witaj przyjacielu, co mogę ci dać?","Olá amigo, como posso te ajudar?",,"Bună prietene, ce pot să-ți aduc?","Привет, друг. Могу я тебе что-нибудь предложить?",,"Hej vän, vad vill du ha?","Merhaba arkadaşım, sana ne getirebilirim?" -Information,TXT_RPLY0_SCRIPT23_D6064_INFOR,〃,,,Informace,,Informationen,,Informojn,Información,,Tietoa.,Des infos.,Információ,Informazioni,情報,정보 있습니까?,Informatie,Informasjon.,Informacje,Informações,,Informație,Информацию,,,Bilgi +tengas dinero!",,"Tule takaisin, kun sinulla on rahaa!",Revenez quand vous avez des sous?,,"Akkor gyere vissza, ha pénzed is lesz!",Torna quando avrai del denaro!,お金が有る時にまた!,"돈이 많이 있으면 모를까, 살 수 없을겁니다!",Kom terug als je geld hebt!,Kom tilbake når du har penger!,"Wróć, gdy będziesz miał pieniądze!",Volte quando tiver dinheiro!,,Revino când o să ai bani!,Возвращайся с деньгами!,,Kom tillbaka när du har pengar!,Paran olduğunda geri gel! +"Hello friend, what can I get you?",TXT_DLG_SCRIPT23_D6064_HELLO,MAP23: Barkeep.,,,"Zdravím, příteli, co pro vás mohu udělat?","Hej ven, hvad kan jeg give dig?","Hallo Freund, was darf es sein?",,"Saluton, amiko. Kion mi donu al vi?","Hola, amigo. ¿Qué puedo ofrecerte?",,"Tervehdys, ystävä; miten voin olla avuksi?","Bienvenu, l'ami, que puis-je pour vous?",,"Szevasz barátom, miben segíthetek?","Salve amico, cosa posso darti?",よう旦那、何が必要だ?,좋은 하루! 뭐 필요한거라도?,"Hallo vriend, wat kan ik voor je halen?","Hei venn, hva kan jeg gi deg?","Witaj przyjacielu, co mogę ci dać?","Olá amigo, como posso te ajudar?",,"Bună prietene, ce pot să-ți aduc?","Привет, друг. Могу я тебе что-нибудь предложить?",,"Hej vän, vad vill du ha?","Merhaba arkadaşım, sana ne getirebilirim?" +Information,TXT_RPLY0_SCRIPT23_D6064_INFOR,〃,,,Informace,,Informationen,,Informojn,Información,,Tietoa.,Des infos.,,Információ,Informazioni,情報,정보 있습니까?,Informatie,Informasjon.,Informacje,Informações,,Informație,Информацию,,,Bilgi "I've never seen anyone go in or out of the factory, the forcefield's always up.",TXT_RYES0_SCRIPT23_D6064_IVENE,〃,,,Nikdy jsem nikoho neviděl vcházet do ani vycházet z továrny. Silové pole je vždycky zapnuté.,"Jeg har aldrig set nogen gå ind eller ud af fabrikken, kraftfeltet er altid oppe.","Ich habe noch niemanden gesehen, der die Fabrik betreten oder verlassen hat. Das Kraftfeld ist immer aktiv.",,"Mi neniam vidis, ke iu iris en la fabrikon aŭ el ĝi: la fortokampo ĉiam estas ŝaltita.","Jamás he visto a nadie entrar o salir -de la fábrica: nunca apagan la barrera.",,En ole nähnyt kenenkään koskaan menevän tai tulevan tehtaasta; voimakenttä on aina päällä.,Je n'ai jamais vu quelqu'un rentrer dans l'usine. Les champs de force sont toujours en ligne.,"Nem láttam még senkit ki- vagy be menni a gyárból, az erőpajzs mindig be van kapcsolva.","Non ho mai visto nessuno entrare o uscire dalla fabbrica, il campo di forza è sempre attivo.","誰も工場を出入りしている所を見ていない、 +de la fábrica: nunca apagan la barrera.",,En ole nähnyt kenenkään koskaan menevän tai tulevan tehtaasta; voimakenttä on aina päällä.,Je n'ai jamais vu quelqu'un rentrer dans l'usine. Les champs de force sont toujours en ligne.,,"Nem láttam még senkit ki- vagy be menni a gyárból, az erőpajzs mindig be van kapcsolva.","Non ho mai visto nessuno entrare o uscire dalla fabbrica, il campo di forza è sempre attivo.","誰も工場を出入りしている所を見ていない、 フォースフィールドがずっと付いてる。",공장에서 나오는 사람들을 전혀 못 봤어. 방어막이 꺼지는 일이 없었으니까.,"Ik heb nog nooit iemand in of uit de fabriek zien gaan, het krachtveld is altijd in orde.","Jeg har aldri sett noen gå inn eller ut av fabrikken, kraftfeltet er alltid oppe.","Nigdy nie widziałem nikogo wchodzącego ani wychodzącego z fabryki, pole siłowe jest zawsze podniesione.",Nunca vi alguém entrar ou sair da fábrica. O campo de força está sempre ativado.,,"N-am văzut niciodată pe cineva intrând sau ieșind din fabrică, câmpul de forță e mereu activ.","Никогда не видел, чтобы кто-нибудь приходил или уходил с фабрики. Поле всегда включено.",,"Jag har aldrig sett någon gå in eller ut ur fabriken, kraftfältet är alltid uppe.","Kimsenin fabrikaya girip çıktığını görmedim, güç alanı her zaman açık." -"No money, no info.",TXT_RNO0_SCRIPT23_D6064_NOMON,〃,,,"Žádné peníze, žádné informace.","Ingen penge, ingen info.","Kein Geld, keine Informationen.",,Sen mono ne estas informoj,Sin dinero no hay información.,,"Ei tuohta, ei tietoa.","Pas d'argent, pas d'infos.","Ha nincs pénz, nincs infó.","Niente denaro, niente informazioni.",金が無いなら情報は無しだ。,"돈 없으면, 정보도 없다네.","Geen geld, geen informatie.","Ingen penger, ingen informasjon.","Nie ma pieniędzy, nie ma informacji.","Sem grana, nada de informações.",,"Niciun ban, nicio informație.",Нет денег — нет сведений.,,"Inga pengar, ingen information.","Para yok, bilgi yok." -"Yes, what would you like?",TXT_DLG_SCRIPT23_D7580_YESWH,〃,,,"Ano, co byste si přál?","Ja, hvad vil du gerne have?","Ja, was darf es sein?",,"Jes, kion vi ŝatus?","Sí, ¿qué quieres?",,"Niin, mitä saisi olla?","Oui, que voulez-vous?","Igen, milyen érdekelne?","Sì, che posso darti?",はい、どうしたい?,"아, 무엇을 원하는가?","Ja, wat wil je graag?","Ja, hva vil du ha?","Tak, czego chcesz?","Sim, o que você gostaria?",,"Da, ce ai dori?",Да? Что ты хотел?,,"Ja, vad vill du ha?","Evet, ne istiyorsunuz?" -More info.,TXT_RPLY0_SCRIPT23_D7580_MOREI,〃 (dot not recommended),,,Další informace.,Mere info.,Mehr Informationen.,,Pliajn informojn,Más información,,Lisää tietoa.,Plus d'infos.,Több információ.,Più informazioni.,更なる情報,정보가 필요해요.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Ещё сведений.,,Mer information.,Daha fazla bilgi. +"No money, no info.",TXT_RNO0_SCRIPT23_D6064_NOMON,〃,,,"Žádné peníze, žádné informace.","Ingen penge, ingen info.","Kein Geld, keine Informationen.",,Sen mono ne estas informoj,Sin dinero no hay información.,,"Ei tuohta, ei tietoa.","Pas d'argent, pas d'infos.",,"Ha nincs pénz, nincs infó.","Niente denaro, niente informazioni.",金が無いなら情報は無しだ。,"돈 없으면, 정보도 없다네.","Geen geld, geen informatie.","Ingen penger, ingen informasjon.","Nie ma pieniędzy, nie ma informacji.","Sem grana, nada de informações.",,"Niciun ban, nicio informație.",Нет денег — нет сведений.,,"Inga pengar, ingen information.","Para yok, bilgi yok." +"Yes, what would you like?",TXT_DLG_SCRIPT23_D7580_YESWH,〃,,,"Ano, co byste si přál?","Ja, hvad vil du gerne have?","Ja, was darf es sein?",,"Jes, kion vi ŝatus?","Sí, ¿qué quieres?",,"Niin, mitä saisi olla?","Oui, que voulez-vous?",,"Igen, milyen érdekelne?","Sì, che posso darti?",はい、どうしたい?,"아, 무엇을 원하는가?","Ja, wat wil je graag?","Ja, hva vil du ha?","Tak, czego chcesz?","Sim, o que você gostaria?",,"Da, ce ai dori?",Да? Что ты хотел?,,"Ja, vad vill du ha?","Evet, ne istiyorsunuz?" +More info.,TXT_RPLY0_SCRIPT23_D7580_MOREI,〃 (dot not recommended),,,Další informace.,Mere info.,Mehr Informationen.,,Pliajn informojn,Más información,,Lisää tietoa.,Plus d'infos.,,Több információ.,Più informazioni.,更なる情報,정보가 필요해요.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Ещё сведений.,,Mer information.,Daha fazla bilgi. The factory's built on the comet's impact site. I don't think it's by chance.,TXT_RYES0_SCRIPT23_D7580_THEFA,〃,,,"Továrnu postavili na místě dopadu komety. Nemyslím si, že to je náhoda.","Fabrikken er bygget på kometens nedslagssted. Jeg tror ikke, det er tilfældigt.","Die Fabrik wurde dort gebaut, wo der Komet eingeschlagen ist. Ich denke nicht, dass das Zufall ist.",,"Ili konstruis la fabrikon en la kometa kratero, kvazaŭ tio estis hazarda koincido.","Construyeron la fábrica en el cráter -que dejó el cometa. No puede ser casualidad.",,"Tehdas on rakennettu komeetan törmäyspaikalle; enkä usko, että sattumalta.",L'usine est construite sur le site d'impact de la comète. Je ne crois pas que c'est une coïncidence.,A gyár a becsapódott üstökösre épült. Biztosan nem lehet véletlen.,La fabbrica è stata costruita sopra il sito d'impatto della cometa. Non credo sia una coincidenza.,"工場は彗星の衝突地点に建っている。 +que dejó el cometa. No puede ser casualidad.",,"Tehdas on rakennettu komeetan törmäyspaikalle; enkä usko, että sattumalta.",L'usine est construite sur le site d'impact de la comète. Je ne crois pas que c'est une coïncidence.,,A gyár a becsapódott üstökösre épült. Biztosan nem lehet véletlen.,La fabbrica è stata costruita sopra il sito d'impatto della cometa. Non credo sia una coincidenza.,"工場は彗星の衝突地点に建っている。 これは偶然だと思えない。",공장은 혜성이 충돌한 지점에서 건설되었다네. 우연으로 건설된 게 아니라고 생각해.,De fabriek is gebouwd op de impact van de komeet site. Ik denk niet dat het toeval is.,Fabrikken er bygget på kometens nedslagssted. Jeg tror ikke det er tilfeldig.,"Fabryka została zbudowana na miejscu uderzenia komety. Nie sądzę, żeby to był przypadek.",A fábrica foi construída no local de impacto do cometa. Não acho que tenha sido por acaso.,,Fabrica e construită pe locul de prăbușire al cometei. Nu cred că e o coincidență.,"Фабрика была построена в кратере от падения метеорита. Не думаю, что это случайность.",,Fabriken är byggd på kometens nedslagsplats. Jag tror inte att det är en slump.,Fabrika kuyruklu yıldızın çarpma alanına inşa edildi. Bunun tesadüf olduğunu sanmıyorum. "Come on, it's a measly 5 gold.",TXT_RNO0_SCRIPT23_D7580_COMEO,〃,,,"No tak, chci pouhých pět zlatých.","Kom nu, det er sølle 5 guld.","Komm schon, es sind doch nur 5 mickrige Goldstücke.",,"Ulo, mi petas nur kvin mizerajn monerojn.","Venga, solo cinco míseras monedas de oro.","Vamos, solo cinco míseras -monedas de oro.","Hei, antaisit nyt vaivaiset viisi kolikkoa.","Allez, ça ne coûte que 5 pièces!","Nemár, francos 5 arany.","Andiamo, sono solo 5 pezzi d'oro.",頼むぜ、たった5ゴールドだぞ。,5 골드 정도 하는데 말이지.,"Kom op, het is een miezerige 5 goud.","Kom igjen, det er sølle fem gull.","Daj spokój, to marne 5 złotych.","Vamos lá, custa só 5 moedinhas.",,"Haide, sunt 5 bănuți amărâți.","Ну же, всего-то 5 золотых.",,"Kom igen, det är bara 5 guld.","Hadi ama, sadece 5 altın." -"Hello again, what'll it be?",TXT_DLG_SCRIPT23_D9096_HELLO,〃,,,"Opět zdravím, co to bude?","Hej igen, hvad bliver det?",Willkommen zurück. Was darf es sein?,,Saluton denove. Kion vi petos?,Hola otra vez. ¿Qué va a ser?,,"Hei taas, mitä kaipaat?","Rebonjour, que puis-je pour vous?","Üdv újra itt, mit kérsz?","Chi si rivede, che cosa c'è?",また来たな、何か頼むか?,다시 만났군. 오늘은 어떤 걸?,"Hallo nogmaals, wat zal het zijn?","Hallo igjen, hva skal det være?","Witam ponownie, co to będzie?",Olá de novo. O que vai ser desta vez?,,"Bună din nou, ce dorești?",И снова привет. Что на этот раз?,,"Hej igen, vad vill du ha?","Tekrar merhaba, ne alırdınız?" -More info.,TXT_RPLY0_SCRIPT23_D9096_MOREI,〃 (dot not recommended),,,Další informace.,Mere info.,Mehr Informationen.,,Pliajn informojn,Más información,,Lisää tietoa.,Plus d'infos.,Több információ.,Altre informazioni,更なる情報,더 많은 정보를 원해요.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Ещё информацию.,,Mer information.,Daha fazla bilgi. +monedas de oro.","Hei, antaisit nyt vaivaiset viisi kolikkoa.","Allez, ça ne coûte que 5 pièces!",,"Nemár, francos 5 arany.","Andiamo, sono solo 5 pezzi d'oro.",頼むぜ、たった5ゴールドだぞ。,5 골드 정도 하는데 말이지.,"Kom op, het is een miezerige 5 goud.","Kom igjen, det er sølle fem gull.","Daj spokój, to marne 5 złotych.","Vamos lá, custa só 5 moedinhas.",,"Haide, sunt 5 bănuți amărâți.","Ну же, всего-то 5 золотых.",,"Kom igen, det är bara 5 guld.","Hadi ama, sadece 5 altın." +"Hello again, what'll it be?",TXT_DLG_SCRIPT23_D9096_HELLO,〃,,,"Opět zdravím, co to bude?","Hej igen, hvad bliver det?",Willkommen zurück. Was darf es sein?,,Saluton denove. Kion vi petos?,Hola otra vez. ¿Qué va a ser?,,"Hei taas, mitä kaipaat?","Rebonjour, que puis-je pour vous?",,"Üdv újra itt, mit kérsz?","Chi si rivede, che cosa c'è?",また来たな、何か頼むか?,다시 만났군. 오늘은 어떤 걸?,"Hallo nogmaals, wat zal het zijn?","Hallo igjen, hva skal det være?","Witam ponownie, co to będzie?",Olá de novo. O que vai ser desta vez?,,"Bună din nou, ce dorești?",И снова привет. Что на этот раз?,,"Hej igen, vad vill du ha?","Tekrar merhaba, ne alırdınız?" +More info.,TXT_RPLY0_SCRIPT23_D9096_MOREI,〃 (dot not recommended),,,Další informace.,Mere info.,Mehr Informationen.,,Pliajn informojn,Más información,,Lisää tietoa.,Plus d'infos.,,Több információ.,Altre informazioni,更なる情報,더 많은 정보를 원해요.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Ещё информацию.,,Mer information.,Daha fazla bilgi. The factory closed when the Order unveiled its new horror: the Inquisitor.,TXT_RYES0_SCRIPT23_D9096_THEFA,〃,,,Továrnu zavřeli když Řád odkryl svou novou hrůzu: Inkvizitora.,"Fabrikken lukkede, da Ordenen afslørede sin nye rædsel: Inquisitoren.","Die Fabrik wurde geschlossen, als der Orden seinen neuesten Horror enthült hat: Den Inquisitor.",,"La fabriko fermis post la malkaŝo de la lasta teruraĵo de La Ordeno: la Inkvizitoro.","La fábrica cerró cuando La Orden -reveló su nuevo horror: el Inquisidor.",,"Tehdas suljettiin, kun Veljeskunta paljasti sen uuden kauhistuksen: inkvisiittorin.","L'usine a été fermée quand l'Ordre a révélé sa nouvelle atrocité, L'inquisiteur.","A gyár bezárt, amikor a Rend leleplezte a nagyközönség előtt az új horrorát: az Inkvizítort.",La fabbrica è stata chiusa quando l'Ordine ha rivelato il suo nuovo orrore: l'Inquisitore,"工場はオーダーの「新審問官」が来てから +reveló su nuevo horror: el Inquisidor.",,"Tehdas suljettiin, kun Veljeskunta paljasti sen uuden kauhistuksen: inkvisiittorin.","L'usine a été fermée quand l'Ordre a révélé sa nouvelle atrocité, L'inquisiteur.",,"A gyár bezárt, amikor a Rend leleplezte a nagyközönség előtt az új horrorát: az Inkvizítort.",La fabbrica è stata chiusa quando l'Ordine ha rivelato il suo nuovo orrore: l'Inquisitore,"工場はオーダーの「新審問官」が来てから 恐ろしい雰囲気を纏った。",오더가 획기적이고 무서운 병기들을 생산한 후 공장의 문을 닫았다네. 그것들의 이름은 '인퀴지터'지.,De fabriek werd gesloten toen de Orde haar nieuwe horror onthulde: de inquisiteur.,Fabrikken stengte da Ordenen avduket sin nye skrekk: Inkvisitoren.,"Fabryka została zamknięta, gdy Zakon zaprezentował swój nowy horror: Inkwizytora.",A fábrica fechou quando a Ordem revelou o seu novo horror: o Inquisidor.,,Fabrica s-a închis când Ordinul a dezvăluit noua sa oroare: Inchizitorul.,"Фабрика закрылась, когда Орден показал своё новое страшилище — инквизитора.",,Fabriken stängdes när Orden presenterade sin nya skräck: Inkvisitorn.,"Fabrika, Tarikat yeni dehşeti Cezacı'yı tanıttığında kapandı." -5 gold please.,TXT_RNO0_SCRIPT23_D9096_5GOLD,〃,,,"Pět zlatých, prosim.","5 guld, tak.","5 Gold, bitte.",,"Kvin da oro, bonvolu.","Cinco de oro, por favor.",,"5 kolikkoa, kiitos.","5 pièces, s'il vous plaît.",5 arany lesz.,"Sono 5 pezzi d'oro, prego.",5ゴールドかかるぜ。,먼저 5 골드를 주게나.,5 goud alsjeblieft.,"5 gull, takk.",Proszę o 5 sztuk złota.,5 moedas por favor.,,5 bani te rog.,"5 золотых, пожалуйста.",,"5 guld, tack.",5 altın lütfen. +5 gold please.,TXT_RNO0_SCRIPT23_D9096_5GOLD,〃,,,"Pět zlatých, prosim.","5 guld, tak.","5 Gold, bitte.",,"Kvin da oro, bonvolu.","Cinco de oro, por favor.",,"5 kolikkoa, kiitos.","5 pièces, s'il vous plaît.",,5 arany lesz.,"Sono 5 pezzi d'oro, prego.",5ゴールドかかるぜ。,먼저 5 골드를 주게나.,5 goud alsjeblieft.,"5 gull, takk.",Proszę o 5 sztuk złota.,5 moedas por favor.,,5 bani te rog.,"5 золотых, пожалуйста.",,"5 guld, tack.",5 altın lütfen. "That's all I know. Even bartenders run out of stuff to say, sorry.",TXT_DLG_SCRIPT23_D10612_THATS,"STRIFE1.WAD -MAP23: Barkeep",,,"To je vše, co vím. I barmani občas nemají, co dál říct, promiňte.","Det er alt, hvad jeg ved. Selv bartendere løber tør for ting at sige, undskyld.","Das ist alles was ich weiß. Selbst ein Barkeeper hat irgendwann keine Neugikeiten mehr, tut mir Leid.",,Mi scias nenion plian. Eĉ drinkejestroj restas sen dirindaĵoj. Pardonon.,Eso es todo lo que sé. Incluso los taberneros se quedan sin cosas que decir. Lo siento.,,"Siinä kaikki, mitä tiedän. Jopa baarimikoilta loppuvat jutun aiheet, pahoittelen.","C'est tout ce que je sais. Même les barmans peuvent arriver à court d'infos, désolé.","Ennyit tudok. Még a bárpultos tudása sem végtelen, sajnálom.","È tutto ciò che so. Anche i baristi hanno un limite alla loro conoscienza, mi spiace.","知ってることはこれで全部だ。 +MAP23: Barkeep",,,"To je vše, co vím. I barmani občas nemají, co dál říct, promiňte.","Det er alt, hvad jeg ved. Selv bartendere løber tør for ting at sige, undskyld.","Das ist alles was ich weiß. Selbst ein Barkeeper hat irgendwann keine Neugikeiten mehr, tut mir Leid.",,Mi scias nenion plian. Eĉ drinkejestroj restas sen dirindaĵoj. Pardonon.,Eso es todo lo que sé. Incluso los taberneros se quedan sin cosas que decir. Lo siento.,,"Siinä kaikki, mitä tiedän. Jopa baarimikoilta loppuvat jutun aiheet, pahoittelen.","C'est tout ce que je sais. Même les barmans peuvent arriver à court d'infos, désolé.",,"Ennyit tudok. Még a bárpultos tudása sem végtelen, sajnálom.","È tutto ciò che so. Anche i baristi hanno un limite alla loro conoscienza, mi spiace.","知ってることはこれで全部だ。 バーテンダーの噂は売切れだ、すまない。",이 바텐더는 꺼낼 수 있는 모든 조언을 꺼냈다네. 미안.,"Dat is alles wat ik weet. Zelfs de barmannen hebben niet veel meer te zeggen, sorry.","Det er alt jeg vet. Selv bartendere går tom for ting å si, beklager.","To wszystko, co wiem. Nawet barmanom kończy się to, co można powiedzieć, przepraszam.","Isso é tudo o que eu sei. Até donos de bar acabam ficando sem algo pra dizer uma hora, sinto muito.",,"Asta e tot ce știu, până și barmanii rămân fără chestii de zis.","Это всё, что я знаю. Даже у хозяев таверн заканчиваются темы для болтовни, увы.",,"Det är allt jag vet. Till och med bartender får slut på saker att säga, tyvärr.","Tek bildiğim bu. Barmenlerin bile söyleyecek bir şeyleri kalmadı, üzgünüm." Hello.,TXT_DLG_SCRIPT23_D12128_HELLO,"STRIFE1.WAD -MAP23: Timothy",,,Ahoj.,Hej.,Hallo.,,Saluton.,Hola.,,Hei.,Bonjour.,Helló.,Ciao.,こんにちは。,안녕하세요.,Hallo.,Hallo.,Witam.,Olá.,,Salut.,Привет.,,Hej.,Merhaba. -What are you doing?,TXT_RPLY0_SCRIPT23_D12128_WHATA,〃,,,Co tady děláš?,Hvad laver du?,Was machst du?,,Kion vi faras?,¿Qué estás haciendo?,,Mitä teet?,Qu'est-ce que vous faites?,Mit csinálsz?,Che cosa stai facendo?,何してるんだ?,뭐하는 거죠?,Wat ben je aan het doen?,Hva driver du med?,Co robisz?,O que você está fazendo?,,Ce faci?,Чем ты занимаешься?,,Vad gör du?,Ne yapıyorsun? -"I'm doing stuff, go away!",TXT_RYES0_SCRIPT23_D12128_IMDOI,〃,,,"Dělám věci, vypadni!","Jeg laver noget, gå væk!","Ich mach' halt was, geh weg!",,Mi umas. Foriru!,Cosas. ¡Ya vete!,,"Teen juttuja, mene pois!","Je suis occupé, laissez-moi tranquille!","Épp elfoglalt vagyok, tünj innen!","Sto sbrigando delle cose, vattene!",今は立て込んでる、離れなさい!,별거 아닙니다. 방해하지 말고 저리 가세요!,"Ik doe dingen, ga weg!","Jeg gjør ting, gå vekk!","Robię różne rzeczy, odejdź!","Estou fazendo coisas, vá embora!",,"Am treabă, pleacă!",Ерундой всякой. Отвали!,,"Jag gör saker, försvinn!","Bir şeyler yapıyorum, git başımdan!" +MAP23: Timothy",,,Ahoj.,Hej.,Hallo.,,Saluton.,Hola.,,Hei.,Bonjour.,,Helló.,Ciao.,こんにちは。,안녕하세요.,Hallo.,Hallo.,Witam.,Olá.,,Salut.,Привет.,,Hej.,Merhaba. +What are you doing?,TXT_RPLY0_SCRIPT23_D12128_WHATA,〃,,,Co tady děláš?,Hvad laver du?,Was machst du?,,Kion vi faras?,¿Qué estás haciendo?,,Mitä teet?,Qu'est-ce que vous faites?,,Mit csinálsz?,Che cosa stai facendo?,何してるんだ?,뭐하는 거죠?,Wat ben je aan het doen?,Hva driver du med?,Co robisz?,O que você está fazendo?,,Ce faci?,Чем ты занимаешься?,,Vad gör du?,Ne yapıyorsun? +"I'm doing stuff, go away!",TXT_RYES0_SCRIPT23_D12128_IMDOI,〃,,,"Dělám věci, vypadni!","Jeg laver noget, gå væk!","Ich mach' halt was, geh weg!",,Mi umas. Foriru!,Cosas. ¡Ya vete!,,"Teen juttuja, mene pois!","Je suis occupé, laissez-moi tranquille!",,"Épp elfoglalt vagyok, tünj innen!","Sto sbrigando delle cose, vattene!",今は立て込んでる、離れなさい!,별거 아닙니다. 방해하지 말고 저리 가세요!,"Ik doe dingen, ga weg!","Jeg gjør ting, gå vekk!","Robię różne rzeczy, odejdź!","Estou fazendo coisas, vá embora!",,"Am treabă, pleacă!",Ерундой всякой. Отвали!,,"Jag gör saker, försvinn!","Bir şeyler yapıyorum, git başımdan!" "Now, what can I help you with?",TXT_DLG_SCRIPT23_D13644_NOWWH,"STRIFE1.WAD -MAP23: Tevick.",,,"Tak, s čím ti mohu pomoci?",Hvad kan jeg hjælpe dig med?,"Nun, wie kann ich dir weiterhelfen?",,"Nu, kion mi povas doni al vi?","Y bueno, ¿en qué puedo ayudarte?",,"No niin, miten voin palvella?","Bon, que puis-je pour vous?","Na, miben segíthetek?","E ora, come posso aiutarti?",今手伝ってくれるか?,"자, 제가 뭘 도와드릴까요?","Nu, waar kan ik je mee helpen?",Hva kan jeg hjelpe deg med?,"A teraz, w czym mogę ci pomóc?","Então, como posso ajudá-lo?",,"Acum, cu ce te pot ajuta?","Итак, чем я могу быть тебе полезен?",,Vad kan jag hjälpa dig med?,"Şimdi, sana nasıl yardımcı olabilirim?" -Shadow armor?,TXT_RPLY0_SCRIPT23_D13644_SHADO,〃,,Shadow armour?,Stínové brnění?,Skygge rustning?,Schattenrüstung?,,Ĉu ombran armaĵon?,¿Armadura de sombra?,,Varjohaarniska?,Armure des ombres?,Árnyék vért?,Armatura Ombra?,シャドウアーマー?,그림자 갑옷?,Schaduw harnas?,Skyggepanser?,Zbroja cieni?,Armadura das sombras?,,Armura umbrei?,Теневой бронёй?,,Skuggarmering?,Gölge zırhı mı? +MAP23: Tevick.",,,"Tak, s čím ti mohu pomoci?",Hvad kan jeg hjælpe dig med?,"Nun, wie kann ich dir weiterhelfen?",,"Nu, kion mi povas doni al vi?","Y bueno, ¿en qué puedo ayudarte?",,"No niin, miten voin palvella?","Bon, que puis-je pour vous?",,"Na, miben segíthetek?","E ora, come posso aiutarti?",今手伝ってくれるか?,"자, 제가 뭘 도와드릴까요?","Nu, waar kan ik je mee helpen?",Hva kan jeg hjelpe deg med?,"A teraz, w czym mogę ci pomóc?","Então, como posso ajudá-lo?",,"Acum, cu ce te pot ajuta?","Итак, чем я могу быть тебе полезен?",,Vad kan jag hjälpa dig med?,"Şimdi, sana nasıl yardımcı olabilirim?" +Shadow armor?,TXT_RPLY0_SCRIPT23_D13644_SHADO,〃,,Shadow armour?,Stínové brnění?,Skygge rustning?,Schattenrüstung?,,Ĉu ombran armaĵon?,¿Armadura de sombra?,,Varjohaarniska?,Armure des ombres?,,Árnyék vért?,Armatura Ombra?,シャドウアーマー?,그림자 갑옷?,Schaduw harnas?,Skyggepanser?,Zbroja cieni?,Armadura das sombras?,,Armura umbrei?,Теневой бронёй?,,Skuggarmering?,Gölge zırhı mı? "Ahh, to be heard, but not seen!",TXT_RYES0_SCRIPT23_D13644_AHHTO,〃,,,"Áha, být slyšen, ne viděn!","Ahh, at blive hørt, men ikke set!","Ah, um gehört zu werden, aber ungesehen zu bleiben.",,"Ha, por esti aŭdata, sed ne vidata!","Ah, ¡para ser oído, -pero no visto!",,"Aah, tulla kuulluksi, muttei nähdyksi!","Ah, pour se faire entendre, sans se faire voir!","Csak hallani, de nem látni.","Ahh, per essere sentiti, ma non visti!",ああ、声はすれど姿は見えず。,하하하... 아주 조용하고 보이지 않는 도구죠!,"Ahhh, om gehoord, maar niet gezien te worden!","Å bli hørt, men ikke sett!","Ahh, być słyszanym, ale nie widzianym!","Ahh, ser ouvido mas não ser visto!",,"Ahh, să fii auzit, dar nu văzut!","Ах, чтобы быть услышанным, но не увиденным!",,"Ahh, att höras men inte ses!","Ahh, duyulmak ama görülmemek!" +pero no visto!",,"Aah, tulla kuulluksi, muttei nähdyksi!","Ah, pour se faire entendre, sans se faire voir!",,"Csak hallani, de nem látni.","Ahh, per essere sentiti, ma non visti!",ああ、声はすれど姿は見えず。,하하하... 아주 조용하고 보이지 않는 도구죠!,"Ahhh, om gehoord, maar niet gezien te worden!","Å bli hørt, men ikke sett!","Ahh, być słyszanym, ale nie widzianym!","Ahh, ser ouvido mas não ser visto!",,"Ahh, să fii auzit, dar nu văzut!","Ах, чтобы быть услышанным, но не увиденным!",,"Ahh, att höras men inte ses!","Ahh, duyulmak ama görülmemek!" "Get out of here, come back when you have some cash.",TXT_RNO0_SCRIPT23_D13644_GETOU,〃,,,"Vypadni a vrať se, když budeš mít peníze.","Forsvind herfra, kom tilbage når du har nogle penge.","Verzieh dich, komm wieder, wenn du etwas Geld hast.",,"Foriru. Revenu kiam vi havos monon.","Vete. Vuelve cuando -tengas efectivo.",,"Antaa vetää; tule takaisin, kun sinulla on käteistä.","Sortez de là, revenez quand vous avez de l'argent!","Na kotródj innen, csak akkor lássalak ha van nálad pénz is.","Fuori di qui, ritorna quando avrai del denaro.",ここを出て、稼いでからまた来てくれ!,"저리 가, 돈이 있을 때나 여길 찾으라고요.","Ga hier weg, kom terug als je wat geld hebt.","Kom deg ut herfra, kom tilbake når du har penger.","Wynoś się stąd, wróć jak będziesz miał trochę kasy.",Vá embora daqui. Volte quando tiver dinheiro.,,"Cară-te, întoarce-te când ai bani.","Выметайся вон. Вернёшься, когда раздобудешь наличности.",,"Försvinn härifrån, kom tillbaka när du har lite pengar.","Git buradan, biraz paran olduğunda geri gel." +tengas efectivo.",,"Antaa vetää; tule takaisin, kun sinulla on käteistä.","Sortez de là, revenez quand vous avez de l'argent!",,"Na kotródj innen, csak akkor lássalak ha van nálad pénz is.","Fuori di qui, ritorna quando avrai del denaro.",ここを出て、稼いでからまた来てくれ!,"저리 가, 돈이 있을 때나 여길 찾으라고요.","Ga hier weg, kom terug als je wat geld hebt.","Kom deg ut herfra, kom tilbake når du har penger.","Wynoś się stąd, wróć jak będziesz miał trochę kasy.",Vá embora daqui. Volte quando tiver dinheiro.,,"Cară-te, întoarce-te când ai bani.","Выметайся вон. Вернёшься, когда раздобудешь наличности.",,"Försvinn härifrån, kom tillbaka när du har lite pengar.","Git buradan, biraz paran olduğunda geri gel." "Thank Deus you got here. To enter the factory you need a key. We stole it but our agent is missing in the web of catacombs under the Order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. Something is down there!",TXT_DLG_SCRIPT23_D15160_THANK,"STRIFE1.WAD -MAP23: Richter.",,,"Díky bohu, žes přišel. Aby ses dostal do továrny, potřebuješ klíč. Ten jsme ukradli, ale náš agent se ztratil v sítí katakomb pod pevností Řádu. Poslal jsem do těch tunelů deset dobrých mužů a žádný se nevrátil. Něco tam dole je!","Tak Deus for at du kom her. For at komme ind på fabrikken skal du bruge en nøgle. Vi stjal den, men vores agent er forsvundet i katakomberne under ordenens højborg. Jeg har sendt ti gode mænd ned i disse tunneller for at finde ham, men ingen er vendt tilbage. Der er noget dernede!","Deus sei dank bist du hier. Um die Fabrik zu betreten, brauchst du einen Schlüssel. Wir haben ihn gestohlen, aber unser Agent ist in den Irrwegen der Katakomben unter der Festung des Ordens verschollen. Ich habe zehn gute Männer da hinunter geschickt um ihn zu finden, aber niemand ist zurückgekehrt. Irgendetwas ist da unten!",,"Danke al Dio vi alvenis. Ŝlosilo estas necesa por eniri la fabrikon; ni ŝtelis ĝin, sed nia agento estas perdita en la katakomba sistemo sub la fortreso de La Ordeno. Mi sendis dek bonajn virojn al tiuj tuneloj por serĉi lin kaj neniu revenis. Estas io tie malsupre!","Gracias a Dios, has llegado. Para entrar en la fábrica se necesita una llave; la hemos robado, pero nuestro agente está perdido en la red de catacumbas debajo de la fortaleza de La Orden. He enviado a diez buenos hombres a esos túneles a buscarlo y ninguno ha regresado. ¡Hay algo ahí abajo!","Gracias a Dios, llegaste. Para entrar a la fábrica se necesita una llave; la robamos, pero nuestro agente se perdió en la red de catacumbas debajo de la fortaleza de La Orden. Mandé a diez buenos hombres a esos túneles a buscarlo y ninguno volvió. ¡Hay algo ahí abajo!","Luojan kiitos, että selvisit perille. Päästäksesi sisälle tehtaaseen tarvitset avaimen. Varastimme sen, mutta vakoojamme on eksynyt Veljeskunnan linnakkeen alapuolella sijaitsevaan katakombiverkostoon. Olen lähettänyt tunneleihin 10 kelpoa miestä etsimään häntä, eikä kukaan ole palannut. Jokin on siellä alla!","Merci Dieu, vous êtes là. Pour entrer dans l'usine, il vous faut une clé. On l'a volé, mais notre agent a disparu dans le dédale de catacombes sous la forteresse de l'Ordre. On a envoyé dix hommes dans ces tunnels pour le retrouver mais personne n'est revenu. Il doit y avoir quelque chose, là dedans!","Hála Deusnak, ideértél.Ahhoz, hogy bejuthass a gyárba kell majd egy kulcs. Habár sikerült ellopnunk a kulcsot, az ügynökünk elveszett a katakombák sűrűjében a Rend erődítménye alatt. Leküldtem tíz jó emberemet utána, de egyikük sem tért vissza. Valami borzasztó lehet ott lent!","Grazie a Dio sei arrivato. Per entrare nella fabbrica ti servirà una chiave. L'abbiamo rubata ma l'agente che l'ha presa è sparito nelle catacombe sotto la fortezza dell'Ordine. Ho mandato dieci uomini in quei tunnel a trovarlo, e nessuno è ritornato. C'è qualcosa là sotto!","ようやく来てくれたか。 +MAP23: Richter.",,,"Díky bohu, žes přišel. Aby ses dostal do továrny, potřebuješ klíč. Ten jsme ukradli, ale náš agent se ztratil v sítí katakomb pod pevností Řádu. Poslal jsem do těch tunelů deset dobrých mužů a žádný se nevrátil. Něco tam dole je!","Tak Deus for at du kom her. For at komme ind på fabrikken skal du bruge en nøgle. Vi stjal den, men vores agent er forsvundet i katakomberne under ordenens højborg. Jeg har sendt ti gode mænd ned i disse tunneller for at finde ham, men ingen er vendt tilbage. Der er noget dernede!","Deus sei dank bist du hier. Um die Fabrik zu betreten, brauchst du einen Schlüssel. Wir haben ihn gestohlen, aber unser Agent ist in den Irrwegen der Katakomben unter der Festung des Ordens verschollen. Ich habe zehn gute Männer da hinunter geschickt um ihn zu finden, aber niemand ist zurückgekehrt. Irgendetwas ist da unten!",,"Danke al Dio vi alvenis. Ŝlosilo estas necesa por eniri la fabrikon; ni ŝtelis ĝin, sed nia agento estas perdita en la katakomba sistemo sub la fortreso de La Ordeno. Mi sendis dek bonajn virojn al tiuj tuneloj por serĉi lin kaj neniu revenis. Estas io tie malsupre!","Gracias a Dios, has llegado. Para entrar en la fábrica se necesita una llave; la hemos robado, pero nuestro agente está perdido en la red de catacumbas debajo de la fortaleza de La Orden. He enviado a diez buenos hombres a esos túneles a buscarlo y ninguno ha regresado. ¡Hay algo ahí abajo!","Gracias a Dios, llegaste. Para entrar a la fábrica se necesita una llave; la robamos, pero nuestro agente se perdió en la red de catacumbas debajo de la fortaleza de La Orden. Mandé a diez buenos hombres a esos túneles a buscarlo y ninguno volvió. ¡Hay algo ahí abajo!","Luojan kiitos, että selvisit perille. Päästäksesi sisälle tehtaaseen tarvitset avaimen. Varastimme sen, mutta vakoojamme on eksynyt Veljeskunnan linnakkeen alapuolella sijaitsevaan katakombiverkostoon. Olen lähettänyt tunneleihin 10 kelpoa miestä etsimään häntä, eikä kukaan ole palannut. Jokin on siellä alla!","Merci Dieu, vous êtes là. Pour entrer dans l'usine, il vous faut une clé. On l'a volé, mais notre agent a disparu dans le dédale de catacombes sous la forteresse de l'Ordre. On a envoyé dix hommes dans ces tunnels pour le retrouver mais personne n'est revenu. Il doit y avoir quelque chose, là dedans!",,"Hála Deusnak, ideértél.Ahhoz, hogy bejuthass a gyárba kell majd egy kulcs. Habár sikerült ellopnunk a kulcsot, az ügynökünk elveszett a katakombák sűrűjében a Rend erődítménye alatt. Leküldtem tíz jó emberemet utána, de egyikük sem tért vissza. Valami borzasztó lehet ott lent!","Grazie a Dio sei arrivato. Per entrare nella fabbrica ti servirà una chiave. L'abbiamo rubata ma l'agente che l'ha presa è sparito nelle catacombe sotto la fortezza dell'Ordine. Ho mandato dieci uomini in quei tunnel a trovarlo, e nessuno è ritornato. C'è qualcosa là sotto!","ようやく来てくれたか。 工場に入るためには鍵が必要だ。 鍵は盗んだのだが、我々の密偵が砦地下にある 地下墓所で行方不明になった。 彼を探すため10名派遣したのだが、 誰一人帰ってこなかった。 地下墓地で何か異変が起こっているに違いない。","데우스님 감사합니다, 지원군이 왔군! 공장에 들어가려면 열쇠가 필요합니다. 그 열쇠를 가진 한 요원이 오더의 요새가 있는 고대 무덤에서 길을 잃었습니다. 지원군 10 명을 보내긴 했으나 돌아오지 못했습니다. 그곳에 무언가가 있는 것 같아요!","Bedankt Deus dat je hier bent gekomen. Om de fabriek binnen te komen heb je een sleutel nodig. We hebben het gestolen maar onze agent ontbreekt in het web van de catacomben onder het bolwerk van de Orde. Ik heb tien goede mannen in die tunnels gestuurd om hem te vinden, en niemand is teruggekomen. Er is daar beneden iets!","Takk Gud for at du kom hit. For å komme inn i fabrikken trenger du en nøkkel. Vi stjal den, men agenten vår er forsvunnet i katakombene under Ordenens festning. Jeg har sendt ti gode menn ned i tunnelene for å finne ham, men ingen har kommet tilbake. Det er noe der nede!","Dziękuję Deusowi, że tu trafiłeś. Aby wejść do fabryki potrzebny jest klucz. Ukradliśmy go, ale nasz agent zaginął w sieci katakumb pod twierdzą Zakonu. Wysłałem dziesięciu dobrych ludzi do tych tuneli, by go znaleźli, ale żaden nie wrócił. Coś jest tam na dole!",Graças a Deus que você está aqui. Para entrar na fábrica você precisa de uma chave. Nós a roubamos mas nosso agente desapareceu na rede de catacumbas debaixo da fortaleza da Ordem. Mandei dez homens capazes pra dentro desses túneis para encontrá-lo e ninguém retornou. Tem alguma coisa lá embaixo!,,"Slavă Domnului că ești aici. Ca să intri în fabrică ai nevoie de o cheie. Am furat-o dar agentul nostru a dispărut în rețeaua catacombelor fortăreței Ordinului. Am trimis zece oameni pricepuți după el, dar niciunul nu s-a întors. Ceva se întâmplă acolo!","Хвала господу, ты добрался сюда. Тебе нужен ключ, чтобы проникнуть на фабрику. Мы выкрали его, но наш агент пропал в сети катакомб под крепостью Ордена. Чтобы разыскать его, я послал в эти туннели десять хороших бойцов, и ни один не вернулся. Там внизу что-то есть!",,"Tacka Deus för att du kom hit. För att komma in i fabriken behöver du en nyckel. Vi stal den, men vår agent saknas i katakomberna under Ordensfästet. Jag har skickat tio goda män in i tunnlarna för att hitta honom, men ingen har återvänt. Något finns där nere!",Buraya geldiğin için Deus'a şükret. Fabrikaya girmek için bir anahtara ihtiyacınız var. Onu çaldık ama ajanımız Tarikat'ın kalesinin altındaki yeraltı mezarlarında kayıp. Onu bulmaları için o tünellere on iyi adam gönderdim ama hiçbiri geri dönmedi. Aşağıda bir şey var! -What is it? Human or... ?,TXT_RPLY0_SCRIPT23_D15160_WHATI,〃,,,"Co to je? Člověk, nebo...?",Hvad er det? Menneske eller... ?,Was ist es? Mensch oder...?,,Kia ĝi estas? Ĉu homa aŭ...?,"¿Qué es?, ¿humano o...?",,Mikä se on? Ihminen vai...,"Qu'est-ce que c'est? Un humain, où...",Mi lehet? Ember vagy...?,Che cosa è? Umano o... ?,それは一体?人間か...?,그게 뭐죠? 사람? 아니면... ?,Wat is het? Menselijk of.... ?,Hva er det? Menneskelig eller... ?,Co to jest? Człowiek czy... ?,O que é? É humano ou... ?,,Ce e? Uman sau... ?,Что это? Человек или...?,,Vad är det? Mänskligt eller... ?,Ne var orada? İnsan mı yoksa... ? -"Not. Definitely not. Whatever it is, you must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the factory is next to the mines. Hurry, each second counts.",TXT_DLG_SCRIPT23_D16676_NOTDE,〃,,,"Ne. Rozhodně ne. Ať je to cokoliv, musíš se s tím utkat, abys získal ten klíč zpět. Otevřu ti vchod do katakomb. Až ho budeš mít, továrna je vedle dolů. Pospěš si, každá vteřina se počítá.","Nej. Helt sikkert ikke. Uanset hvad det er, skal du kæmpe mod det for at få nøglen tilbage. Jeg åbner katakombernes indgang. Når du har fået den, er fabrikken ved siden af minerne. Skynd dig, hvert sekund tæller.","Nein. Definitiv nicht. Was auch immer es ist, du musst es bekämpfen, um an den Schlüssel zu kommen. Ich werde den Eingang zu den Katakomben öffnen. Wenn du ihn hast, die Fabrik ist direkt neben den Minen. Beeil dich, jede Sekunde zählt.",,"Ne, neniel. Tio ajn, kio ĝi estas, vi devas batali kontraŭ ĝi por rekuperi la ŝlosilon. Farinte tion, la fabriko estas flanke de la minejo. Hastu, ĉiu sekundo estas gravega.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; abriré la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Date prisa, que cada segundo cuenta.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; voy a abrir la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Apúrate, que cada segundo cuenta.","Ei, ei varmana. Mikä ikinä se onkaan, sinun on kohdattava se noutaaksesi avaimen. Avaan katakombien sisäänkäynnin. Kun se on hallussasi, tehdas on kaivoksen vieressä. Pidä kiirettä, jokainen sekunti merkitsee.","Non, absolument pas. Je ne sais pas ce que c'est, mais il faudra s'en débarasser pour récupérer la clé. Je vais ouvrir l'entrée des catacombes. Quand vous êtes à l'intérieur, l'usine est près des ruines. Vite, chaque seconde compte.","Nem. Biztos, hogy nem. Akármi is az, meg kell majd küzdened vele a kulcsért. Kinyitom a katakomba bejáratát. Ha megszerezted, a gyár ott lesz a bánya mellett. Siess, minden másodperc számít.","No. Sicuramente no. Qualsiasi cosa sia, dovrai lottare per riavere la chiave. Adesso aprirò l'entrata per le catacombe. Quando avrai ripreso la chiave, potrai accedere alla fabbrica, che si trova accanto alle miniere. Sbrigati, ogni secondo può fare la differenza.","いや。人間の仕業だとはとても思えない。 +What is it? Human or... ?,TXT_RPLY0_SCRIPT23_D15160_WHATI,〃,,,"Co to je? Člověk, nebo...?",Hvad er det? Menneske eller... ?,Was ist es? Mensch oder...?,,Kia ĝi estas? Ĉu homa aŭ...?,"¿Qué es?, ¿humano o...?",,Mikä se on? Ihminen vai...,"Qu'est-ce que c'est? Un humain, où...",,Mi lehet? Ember vagy...?,Che cosa è? Umano o... ?,それは一体?人間か...?,그게 뭐죠? 사람? 아니면... ?,Wat is het? Menselijk of.... ?,Hva er det? Menneskelig eller... ?,Co to jest? Człowiek czy... ?,O que é? É humano ou... ?,,Ce e? Uman sau... ?,Что это? Человек или...?,,Vad är det? Mänskligt eller... ?,Ne var orada? İnsan mı yoksa... ? +"Not. Definitely not. Whatever it is, you must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the factory is next to the mines. Hurry, each second counts.",TXT_DLG_SCRIPT23_D16676_NOTDE,〃,,,"Ne. Rozhodně ne. Ať je to cokoliv, musíš se s tím utkat, abys získal ten klíč zpět. Otevřu ti vchod do katakomb. Až ho budeš mít, továrna je vedle dolů. Pospěš si, každá vteřina se počítá.","Nej. Helt sikkert ikke. Uanset hvad det er, skal du kæmpe mod det for at få nøglen tilbage. Jeg åbner katakombernes indgang. Når du har fået den, er fabrikken ved siden af minerne. Skynd dig, hvert sekund tæller.","Nein. Definitiv nicht. Was auch immer es ist, du musst es bekämpfen, um an den Schlüssel zu kommen. Ich werde den Eingang zu den Katakomben öffnen. Wenn du ihn hast, die Fabrik ist direkt neben den Minen. Beeil dich, jede Sekunde zählt.",,"Ne, neniel. Tio ajn, kio ĝi estas, vi devas batali kontraŭ ĝi por rekuperi la ŝlosilon. Farinte tion, la fabriko estas flanke de la minejo. Hastu, ĉiu sekundo estas gravega.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; abriré la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Date prisa, que cada segundo cuenta.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; voy a abrir la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Apúrate, que cada segundo cuenta.","Ei, ei varmana. Mikä ikinä se onkaan, sinun on kohdattava se noutaaksesi avaimen. Avaan katakombien sisäänkäynnin. Kun se on hallussasi, tehdas on kaivoksen vieressä. Pidä kiirettä, jokainen sekunti merkitsee.","Non, absolument pas. Je ne sais pas ce que c'est, mais il faudra s'en débarasser pour récupérer la clé. Je vais ouvrir l'entrée des catacombes. Quand vous êtes à l'intérieur, l'usine est près des ruines. Vite, chaque seconde compte.",,"Nem. Biztos, hogy nem. Akármi is az, meg kell majd küzdened vele a kulcsért. Kinyitom a katakomba bejáratát. Ha megszerezted, a gyár ott lesz a bánya mellett. Siess, minden másodperc számít.","No. Sicuramente no. Qualsiasi cosa sia, dovrai lottare per riavere la chiave. Adesso aprirò l'entrata per le catacombe. Quando avrai ripreso la chiave, potrai accedere alla fabbrica, che si trova accanto alle miniere. Sbrigati, ogni secondo può fare la differenza.","いや。人間の仕業だとはとても思えない。 それが何であれ君は鍵を取り戻せ。 地下墓所への入り口は開けておこう。 鍵を手に入れたら、工場は採掘所の隣にある。 時間はあまり無いから急ぐのだ。","아냐. 사람 같은 건 절대로 아니라고. 그게 무엇이든, 당신은 어떻게든 싸워서 열쇠를 돌려받아야 합니다. 고대 무덤의 입구를 열어두겠습니다. 만약 열쇠를 얻으셨다면, 광산 옆에 있는 공장으로 향하시길 바랍니다. 시간이 얼마 남지 않았습니다!","Niet. Zeker niet. Wat het ook is, je moet ertegen vechten om de sleutel terug te krijgen. Ik zal de ingang van de catacomben openen. Als je hem hebt, staat de fabriek naast de mijnen. Schiet op, elke seconde telt.","Nei. Definitivt ikke. Uansett hva det er, må du kjempe mot det for å få tak i nøkkelen. Jeg åpner inngangen til katakombene. Når du har den, er fabrikken ved siden av gruvene. Skynd deg, hvert sekund teller.","Nie. Zdecydowanie nie. Cokolwiek to jest, musisz z tym walczyć, aby odzyskać klucz. Ja otworzę wejście do katakumb. Gdy go zdobędziesz, fabryka jest obok kopalni. Spiesz się, liczy się każda sekunda.","Não. Definitivamente não é. Seja lá o que for, você deve enfrentá-lo para recuperar a chave. Vou abrir a entrada das catacumbas. Quando você pegar a chave, vá para a fábrica próxima às minas. Depressa, cada segundo é importante.",,"Nu. Cu siguranță nu. Orice ar fi, va trebui să o înfrunți pentru a recupera cheia. Voi deschide intrarea catacombelor. Când o ai, fabrica e vizavi de mine. Grăbește-te, orice secundă contează.","Нет. Определённо нет. Что бы это ни было, ты должен сразиться с ним, чтобы заполучить ключ. Я открою вход в катакомбы. Когда добудешь его, направляйся на фабрику: она находится рядом со входом в шахты. Торопись! Дорога каждая секунда!",,"Inte. Definitivt inte. Vad det än är måste du slåss mot det för att få tag på nyckeln. Jag öppnar katakombernas ingång. När du har fått den är fabriken bredvid gruvorna. Skynda dig, varje sekund räknas.","İnsan değil. Kesinlikle değil. O her neyse, anahtarı almak için onunla savaşmalısın. Yeraltı mezarlarının girişini açacağım. Anahtarı aldığında, fabrika madenlerin yanında. Acele et, her saniye önemli." -"Something inhuman, eh?, great.",TXT_RPLY0_SCRIPT23_D16676_SOMET,〃,,,"Něco nelidského, co? Skvělý.","Noget umenneskeligt, hva'?, fedt.",Irgendetwas unmenschliches? Na großartig.,,"Nehomaĵo, ĉu? Bonege.","Algo inhumano, ¿eh? Genial.",,"Jotain epäinhimillistä, vai? Hienoa.","Quelque chose d'inhumain, hein? Parfait.","Valami nem emberi, mi? Csodás.","Qualcosa di inumano, eh? Fantastico.",非人道的な何か?流石だな。,비인간적인 녀석인가요? 좋군요.,"Iets onmenselijks, eh?, geweldig.","Noe umenneskelig, hva? Flott!","Coś nieludzkiego, ech, świetnie.","Algo não-humano, é? Que ótimo.",,"Ceva inuman, ei? Grozav.",Что-то иное? Просто отлично.,,"Något omänskligt, va?, bra.","İnsanlık dışı bir şey, ha? Harika." -You're wasting time and lives! Move!,TXT_DLG_SCRIPT23_D18192_YOURE,〃,,,Plýtváš časem i životy! Jdi!,Du spilder tid og liv! Af sted!,Du verschwendest Zeit und Leben! Beweg dich!,,Vi perdas tempon kaj vivojn! Agu!,¡Estás perdiendo tiempo y vidas! ¡Muévete!,,Haaskaat aikaa ja henkiä! Liikkuu jo!,Vous perdez votre temps et des vies! Bougez!,Időt és életeket pazarolsz! Mozgás!,"Stai sprecando tempo, e vite. Sbrigati!","こうしてる間にも君は時間と人命を +"Something inhuman, eh?, great.",TXT_RPLY0_SCRIPT23_D16676_SOMET,〃,,,"Něco nelidského, co? Skvělý.","Noget umenneskeligt, hva'?, fedt.",Irgendetwas unmenschliches? Na großartig.,,"Nehomaĵo, ĉu? Bonege.","Algo inhumano, ¿eh? Genial.",,"Jotain epäinhimillistä, vai? Hienoa.","Quelque chose d'inhumain, hein? Parfait.",,"Valami nem emberi, mi? Csodás.","Qualcosa di inumano, eh? Fantastico.",非人道的な何か?流石だな。,비인간적인 녀석인가요? 좋군요.,"Iets onmenselijks, eh?, geweldig.","Noe umenneskelig, hva? Flott!","Coś nieludzkiego, ech, świetnie.","Algo não-humano, é? Que ótimo.",,"Ceva inuman, ei? Grozav.",Что-то иное? Просто отлично.,,"Något omänskligt, va?, bra.","İnsanlık dışı bir şey, ha? Harika." +You're wasting time and lives! Move!,TXT_DLG_SCRIPT23_D18192_YOURE,〃,,,Plýtváš časem i životy! Jdi!,Du spilder tid og liv! Af sted!,Du verschwendest Zeit und Leben! Beweg dich!,,Vi perdas tempon kaj vivojn! Agu!,¡Estás perdiendo tiempo y vidas! ¡Muévete!,,Haaskaat aikaa ja henkiä! Liikkuu jo!,Vous perdez votre temps et des vies! Bougez!,,Időt és életeket pazarolsz! Mozgás!,"Stai sprecando tempo, e vite. Sbrigati!","こうしてる間にも君は時間と人命を 無駄にしている。行け!",시간과 생명이 위협받고 있다고! 서두르세요!!,Je verspilt tijd en levens! Vooruit!,Du kaster bort tid og liv! Skynd dere!,Marnujesz czas i życie! Ruszać się!,Você está desperdiçando tempo e vidas! Ande logo!,,"Pierzi timp și vieți, mișcă-te!",Ты тратишь время и жизни! Шевелись!,,Du slösar tid och liv! Flytta på dig!,Zamanınızı ve hayatlarınızı boşa harcıyorsunuz! Çekilin! Can I be of more help?,TXT_DLG_SCRIPT23_D10612_CANIB,"SVE.WAD -MAP23: Barkeep.",,,Můžu vám dál pomocI?,Kan jeg være til mere hjælp?,Kann ich dir sonst noch irgendwie helfen?,,Ĉu mi povas esti pli helpa?,¿Puedo ser de más ayuda?,,Voinko vielä olla avuksi?,Je peux vous aider?,Lehetek még a segítségedre?,Posso aiutarti ancora?,何かお困りでも?,당신의 도움이 더 되어줄 수 있겠습니까?,Kan ik meer hulp bieden?,Kan jeg være til mer hjelp?,Czy mogę być bardziej pomocny?,Posso ajudar com mais alguma coisa?,,Pot fi mai de ajutor?,Могу ли я чем-нибудь помочь?,,Kan jag vara till mer hjälp?,Daha fazla yardımcı olabilir miyim? -More info.,TXT_RPLY0_SCRIPT23_D10612_MOREI,〃 (dot not recommended),,,Další informace.,Mere info.,Mehr Informationen.,,Pliajn informojn,Más información,,Lisää tietoa.,Plus d'infos.,Több információ.,Più informazioni.,更なる情報。,정보 더 있습니까?,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Информацией.,,Mer information.,Daha fazla bilgi. +MAP23: Barkeep.",,,Můžu vám dál pomocI?,Kan jeg være til mere hjælp?,Kann ich dir sonst noch irgendwie helfen?,,Ĉu mi povas esti pli helpa?,¿Puedo ser de más ayuda?,,Voinko vielä olla avuksi?,Je peux vous aider?,,Lehetek még a segítségedre?,Posso aiutarti ancora?,何かお困りでも?,당신의 도움이 더 되어줄 수 있겠습니까?,Kan ik meer hulp bieden?,Kan jeg være til mer hjelp?,Czy mogę być bardziej pomocny?,Posso ajudar com mais alguma coisa?,,Pot fi mai de ajutor?,Могу ли я чем-нибудь помочь?,,Kan jag vara till mer hjälp?,Daha fazla yardımcı olabilir miyim? +More info.,TXT_RPLY0_SCRIPT23_D10612_MOREI,〃 (dot not recommended),,,Další informace.,Mere info.,Mehr Informationen.,,Pliajn informojn,Más información,,Lisää tietoa.,Plus d'infos.,,Több információ.,Più informazioni.,更なる情報。,정보 더 있습니까?,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Информацией.,,Mer information.,Daha fazla bilgi. Look for Timothy. I've heard he knows some of the Order's secrets.,TXT_RYES0_SCRIPT23_D10612_LOOKF,〃,,,"Najděte Timothyho. Slyšel jsem, že ví nějaká tajemství Řádu.","Kig efter Timothy. Jeg har hørt, at han kender nogle af Ordenens hemmeligheder.","Suche Timothy. Ich habe gehört, das er etwas über die Geheimnisse des Ordens weiß.",,"Serĉu Timoteon. Mi aŭdis, ke li scias ion pri La Ordeno.","Busca a Timothy. Oí que -sabe algo sobre La Orden.",,Etsi Timothy. Hän kuulemma tietää joitain Veljeskunnan salaisuuksia.,"Cherchez Timothy, j'entends qu'il sait des secrets de l'Ordre.","Keresd Timothyt. Azt hallotam, Ő tud pár Rend titkot.",Cerca Timothy. Ho sentito che conosce alcuni dei segreti dell'Ordine.,"ティモシーを探せ。彼がオーダーの秘密を +sabe algo sobre La Orden.",,Etsi Timothy. Hän kuulemma tietää joitain Veljeskunnan salaisuuksia.,"Cherchez Timothy, j'entends qu'il sait des secrets de l'Ordre.",,"Keresd Timothyt. Azt hallotam, Ő tud pár Rend titkot.",Cerca Timothy. Ho sentito che conosce alcuni dei segreti dell'Ordine.,"ティモシーを探せ。彼がオーダーの秘密を 知っていると聞いた。",티모시를 찾아보세요. 제가 듣기론 그가 오더의 비밀들을 알고 있다던데.,Zoek Timothy. Ik heb gehoord dat hij enkele van de geheimen van de Orde kent.,Se etter Timothy. Jeg har hørt at han kjenner noen av Ordenens hemmeligheter.,"Poszukaj Timothy'ego. Słyszałem, że zna niektóre sekrety Zakonu.",Procure por Timothy. Fiquei sabendo que ele conhece alguns segredos da Ordem.,,Uită-te după Timotei. Am auzit că ar cunoaște mai multe secrete ale Ordinului.,"Найди Тимоти. Я слышал, он знает какие-то секреты Ордена.",,Leta efter Timothy. Jag har hört att han känner till några av ordens hemligheter.,Timothy'i ara. Tarikat'ın bazı sırlarını bildiğini duydum. Just another 5 gold.,TXT_RNO0_SCRIPT23_D10612_JUSTA,〃,,,Jen dalších pět zlatých.,Bare 5 guld mere.,Nur 5 weitere Goldstücke.,,"Nur ankoraŭ -kvin da oro.",Solo otros cinco de oro.,,Vain 5 kolikkoa lisää.,Juste 5 pièces.,Még 5 arany kell.,Giusto altri 5 pezzi d'oro.,たった5ゴールドだぞ。,5 골드만 주세요.,Gewoon nog eens 5 goud.,Bare fem gull til.,Jeszcze tylko 5 złotych.,Só mais 5 moedas.,,Alte 5 monezi.,Всего лишь ещё 5 золотых!,,Bara ytterligare 5 guld.,Sadece 5 altın daha. -"That's all I know. Even bartenders run out of stuff to say, sorry.",TXT_DLG_SCRIPT23_D12128_THATS,〃,,,"To je vše, co vím. I barmani občas nemají, co dál říct, promiňte.","Det er alt, hvad jeg ved. Selv bartendere løber tør for ting at sige, undskyld.","Das ist alles was ich weiß. Selbst ein Wirt hat irgendwann keine Neugikeiten mehr, tut mir Leid.",,Mi scias nenion plian. Eĉ drinkejestroj restas sen dirindaĵoj. Pardonon.,Eso es todo lo que sé. Incluso los taberneros se quedan sin cosas que decir. Lo siento.,,"Siinä kaikki tietämäni. Jopa baarimikkojen sanaiset arkut ehtyvät, valitan.","C'est tout ce que je sais. Même les barmans peuvent arriver à court d'infos, désolé.","Ennyit tudok. Még a bárpultos tudása sem végtelen, sajnálom.","È tutto ciò che so. Anche i baristi hanno un limite alla loro conoscienza, mi spiace.","知ってることはこれで全部だ。 +kvin da oro.",Solo otros cinco de oro.,,Vain 5 kolikkoa lisää.,Juste 5 pièces.,,Még 5 arany kell.,Giusto altri 5 pezzi d'oro.,たった5ゴールドだぞ。,5 골드만 주세요.,Gewoon nog eens 5 goud.,Bare fem gull til.,Jeszcze tylko 5 złotych.,Só mais 5 moedas.,,Alte 5 monezi.,Всего лишь ещё 5 золотых!,,Bara ytterligare 5 guld.,Sadece 5 altın daha. +"That's all I know. Even bartenders run out of stuff to say, sorry.",TXT_DLG_SCRIPT23_D12128_THATS,〃,,,"To je vše, co vím. I barmani občas nemají, co dál říct, promiňte.","Det er alt, hvad jeg ved. Selv bartendere løber tør for ting at sige, undskyld.","Das ist alles was ich weiß. Selbst ein Wirt hat irgendwann keine Neugikeiten mehr, tut mir Leid.",,Mi scias nenion plian. Eĉ drinkejestroj restas sen dirindaĵoj. Pardonon.,Eso es todo lo que sé. Incluso los taberneros se quedan sin cosas que decir. Lo siento.,,"Siinä kaikki tietämäni. Jopa baarimikkojen sanaiset arkut ehtyvät, valitan.","C'est tout ce que je sais. Même les barmans peuvent arriver à court d'infos, désolé.",,"Ennyit tudok. Még a bárpultos tudása sem végtelen, sajnálom.","È tutto ciò che so. Anche i baristi hanno un limite alla loro conoscienza, mi spiace.","知ってることはこれで全部だ。 バーテンダーの噂は売切れだ、すまない。",내가 아는 건 그것뿐입니다. 바텐더라도 할 말이 떨어질 수 있다고. 미안해요.,"Dat is alles wat ik weet. Zelfs de barmannen hebben niet veel meer te zeggen, sorry.","Det er alt jeg vet. Selv bartendere går tom for ting å si, beklager.","To wszystko, co wiem. Nawet barmanom kończą się rzeczy do powiedzenia, przepraszam.","Isso é tudo o que eu sei. Até donos de bar acabam ficando sem algo pra dizer uma hora, sinto muito.",,"Asta e tot ce știu, până și barmanii rămân fără chestii de zis.","Это всё, что я знаю. Даже у хозяев таверн заканчиваются темы для болтовни, увы.",,"Det är allt jag vet. Till och med bartender får slut på saker att säga, tyvärr.","Tüm bildiğim bu. Barmenlerin bile söyleyecek şeyleri bitiyor, üzgünüm." Hello.,TXT_DLG_SCRIPT23_D13644_HELLO,"SVE.WAD -MAP23: Timothy (Talking with him for the very first time without the chalice).",,,Ahoj.,Hej.,Hallo.,,Saluton.,Hola.,,Hei.,Bonjour.,Helló.,Salve.,どうも。,안녕하세요.,Hallo.,Hallo.,Witam.,Olá.,,Salut.,Привет.,,Hej.,Merhaba. -What are you doing?,TXT_RPLY0_SCRIPT23_D13644_WHATA,〃,,,Co tady děláš?,Hvad laver du?,Was machst du?,,Kion vi faras?,¿Qué estás haciendo?,,Mitä teet?,Qu'est-ce que vous faites?,Mit művelsz?,Cosa stai facendo?,何してるんだ?,무슨 일을 하고 있는거죠?,Wat ben je aan het doen?,Hva holder du på med?,Co robisz?,O que você está fazendo?,,Ce faci?,Чем ты занимаешься?,,Vad gör du?,Ne yapıyorsun? -"I'm doing stuff, go away!",TXT_RYES0_SCRIPT23_D13644_IMDOI,〃,,,"Dělám věci, vypadni!","Jeg laver noget, gå væk!","Ich mach' halt was, geh weg!",,Mi umas. Foriru!,Cosas. ¡Ya vete!,,"Teen juttuja, mene pois!","Je suis occupé, laissez-moi tranquille!","Csinálom a dolgom, menj innen!","Sto sbrigando delle cose, vattene!",今は立て込んでる、離れろ!,그냥 뭘 하고 있습니다. 저리가세요!,"Ik doe dingen, ga weg!","Jeg gjør ting, gå vekk!","Robię różne rzeczy, odejdź!","Estou fazendo coisas, vá embora!",,"Am treabă, pleacă!",Ерундой всякой. Отвали!,,"Jag gör saker, försvinn!","Bir şeyler yapıyorum, git başımdan!" -"If you have this much time to waste, see if you can find the blue chalice. My studies on the Order suggest they have hidden it somewhere in the manufacturing sector of the factory. This artifact would be of great value to me, so, bring it to me, and I'll help you out.",TXT_DLG_SCRIPT23_D15160_IFYOU,〃,,,"Jestli máš takového volného času, zkus najít modrý kalich. Má pátraní o Řádu naznačují, že je schovaný někde ve výrobním sektoru továrny. Tenhle artifakt by pro mě byl nesmírně cenný, takže jestli mi ho přineseš, pomůžu ti.","Hvis du har så meget tid at spilde, så se om du kan finde den blå bæger. Mine undersøgelser af Ordenen tyder på, at de har gemt den et sted i fabrikkens produktionssektor. Denne artefakt ville være af stor værdi for mig, så bring den til mig, og jeg vil hjælpe dig.","Wenn du so viel Zeit zu verschwenden hast, dann sieh zu, dass du den blauen Kelch finden kannst. Meine Studien über den Orden deuten an, dass er irgendwo im Produktionssektor der Fabrik versteckt sein muss. Dieses Artefakt würde mir viel bedeuten, also bring es mir, und ich werde dir weiterhelfen.",,"Se vi estas tiel senokupa, provu trovi la bluan kalikon. Miaj studoj pri La Ordeno sugestas, ke ili kaŝis ĝin ien en la manufakturo de la fabriko. Tiu artefakto estus tre valora por mi, do alportu ĝin kaj mi helpos vin.","Si tan aburrido estás, ve a ver si puedes encontrar el cáliz azul. Mis estudios sobre La Orden sugieren que está oculto en alguna parte del sector de manufactura de la fábrica. Ese artefacto me sería de gran valor, así que tráemelo y te ayudaré.","Si tan aburrido estás, ve a ver si puedes encontrar el cáliz azul. Mis estudios sobre La Orden sugieren que está oculto en alguna parte del sector de manufactura de la fábrica. Ese artefacto me sería de gran valor, así que tráemelo y te voy a ayudar.","Jos sinulla on näin paljon aikaa tuhlattavana, pidä silmäsi auki sinisen uhrimaljan varalta. Tutkimukseni Veljeskunnasta viittaavat siihen, että he ovat kätkeneet sen jonnekin tehtaan tuotanto-osastolla. Esine olisi minulle hyvin arvokas, joten tuo se minulle, ja autan sinua.","Si vous avez autant de temps à perdre, allez voir si vous pouvez récupérer le Calice Bleu. Mes études sur l'Ordre suggèrent qu'ils l'ont caché dans le secteur de manufacture de l'usine. Cet artéfact serait de grande valeur pour moi, amenez-le moi et je vous aiderai.","Ha ilyen őrülten sok időd van, akkor próbáld megkeresni a kék serleget. A kutatásaim azt mutatják, hogy a gyár gyártósoránál van elrejtve. Ez az ereklye nagyon fontos lenne számomra, ha elhozod nekem segítek rajtad.","Se proprio hai così tanto tempo da perdere, vedi se riesci a trovare il calice blu. I miei studi sull'Ordine indiano che lo hanno nascosto da qualche parte del settore manufatturiero della Fabbrica. Questo artifatto mi sarebbe molto utile, quindi se me lo porti, ti potrò aiutare.","アンタがもし時間を浪費するつもりじゃないなら +MAP23: Timothy (Talking with him for the very first time without the chalice).",,,Ahoj.,Hej.,Hallo.,,Saluton.,Hola.,,Hei.,Bonjour.,,Helló.,Salve.,どうも。,안녕하세요.,Hallo.,Hallo.,Witam.,Olá.,,Salut.,Привет.,,Hej.,Merhaba. +What are you doing?,TXT_RPLY0_SCRIPT23_D13644_WHATA,〃,,,Co tady děláš?,Hvad laver du?,Was machst du?,,Kion vi faras?,¿Qué estás haciendo?,,Mitä teet?,Qu'est-ce que vous faites?,,Mit művelsz?,Cosa stai facendo?,何してるんだ?,무슨 일을 하고 있는거죠?,Wat ben je aan het doen?,Hva holder du på med?,Co robisz?,O que você está fazendo?,,Ce faci?,Чем ты занимаешься?,,Vad gör du?,Ne yapıyorsun? +"I'm doing stuff, go away!",TXT_RYES0_SCRIPT23_D13644_IMDOI,〃,,,"Dělám věci, vypadni!","Jeg laver noget, gå væk!","Ich mach' halt was, geh weg!",,Mi umas. Foriru!,Cosas. ¡Ya vete!,,"Teen juttuja, mene pois!","Je suis occupé, laissez-moi tranquille!",,"Csinálom a dolgom, menj innen!","Sto sbrigando delle cose, vattene!",今は立て込んでる、離れろ!,그냥 뭘 하고 있습니다. 저리가세요!,"Ik doe dingen, ga weg!","Jeg gjør ting, gå vekk!","Robię różne rzeczy, odejdź!","Estou fazendo coisas, vá embora!",,"Am treabă, pleacă!",Ерундой всякой. Отвали!,,"Jag gör saker, försvinn!","Bir şeyler yapıyorum, git başımdan!" +"If you have this much time to waste, see if you can find the blue chalice. My studies on the Order suggest they have hidden it somewhere in the manufacturing sector of the factory. This artifact would be of great value to me, so, bring it to me, and I'll help you out.",TXT_DLG_SCRIPT23_D15160_IFYOU,〃,,,"Jestli máš takového volného času, zkus najít modrý kalich. Má pátraní o Řádu naznačují, že je schovaný někde ve výrobním sektoru továrny. Tenhle artifakt by pro mě byl nesmírně cenný, takže jestli mi ho přineseš, pomůžu ti.","Hvis du har så meget tid at spilde, så se om du kan finde den blå bæger. Mine undersøgelser af Ordenen tyder på, at de har gemt den et sted i fabrikkens produktionssektor. Denne artefakt ville være af stor værdi for mig, så bring den til mig, og jeg vil hjælpe dig.","Wenn du so viel Zeit zu verschwenden hast, dann sieh zu, dass du den blauen Kelch finden kannst. Meine Studien über den Orden deuten an, dass er irgendwo im Produktionssektor der Fabrik versteckt sein muss. Dieses Artefakt würde mir viel bedeuten, also bring es mir, und ich werde dir weiterhelfen.",,"Se vi estas tiel senokupa, provu trovi la bluan kalikon. Miaj studoj pri La Ordeno sugestas, ke ili kaŝis ĝin ien en la manufakturo de la fabriko. Tiu artefakto estus tre valora por mi, do alportu ĝin kaj mi helpos vin.","Si tan aburrido estás, ve a ver si puedes encontrar el cáliz azul. Mis estudios sobre La Orden sugieren que está oculto en alguna parte del sector de manufactura de la fábrica. Ese artefacto me sería de gran valor, así que tráemelo y te ayudaré.","Si tan aburrido estás, ve a ver si puedes encontrar el cáliz azul. Mis estudios sobre La Orden sugieren que está oculto en alguna parte del sector de manufactura de la fábrica. Ese artefacto me sería de gran valor, así que tráemelo y te voy a ayudar.","Jos sinulla on näin paljon aikaa tuhlattavana, pidä silmäsi auki sinisen uhrimaljan varalta. Tutkimukseni Veljeskunnasta viittaavat siihen, että he ovat kätkeneet sen jonnekin tehtaan tuotanto-osastolla. Esine olisi minulle hyvin arvokas, joten tuo se minulle, ja autan sinua.","Si vous avez autant de temps à perdre, allez voir si vous pouvez récupérer le Calice Bleu. Mes études sur l'Ordre suggèrent qu'ils l'ont caché dans le secteur de manufacture de l'usine. Cet artéfact serait de grande valeur pour moi, amenez-le moi et je vous aiderai.",,"Ha ilyen őrülten sok időd van, akkor próbáld megkeresni a kék serleget. A kutatásaim azt mutatják, hogy a gyár gyártósoránál van elrejtve. Ez az ereklye nagyon fontos lenne számomra, ha elhozod nekem segítek rajtad.","Se proprio hai così tanto tempo da perdere, vedi se riesci a trovare il calice blu. I miei studi sull'Ordine indiano che lo hanno nascosto da qualche parte del settore manufatturiero della Fabbrica. Questo artifatto mi sarebbe molto utile, quindi se me lo porti, ti potrò aiutare.","アンタがもし時間を浪費するつもりじゃないなら 青の聖杯を見つけられるかどうかを確かめる。 その骨董品は俺にとって非常に価値がある。 持ってきたら協力しよう。","만약 시간이 남아돈다면, 푸른 성배를 찾아보러 가시는 게 어떤가요? 오더에 대한 제 연구가 맞아떨어진다면, 그것은 분명히 공장의 조립시설에 숨겨져 있을 겁니다. 그 보물은 더 할 말 없이 아주 진귀할 거에요. 그걸 찾아주면, 딱 맞는 보답을 해주지요.","Als je zoveel tijd te verliezen hebt, kijk dan of je de blauwe kelk kunt vinden. Mijn studies over de Orde suggereren dat ze het ergens in de productiesector van de fabriek verborgen hebben. Dit artefact zou van grote waarde zijn voor mij, dus, breng het naar mij, en ik zal je helpen.","Hvis du har så mye tid å kaste bort, se om du kan finne det blå begeret. Mine studier om Ordenen tyder på at de har gjemt det et sted i fabrikkens produksjonssektor. Denne gjenstanden vil være av stor verdi for meg, så ta den med til meg, så skal jeg hjelpe deg.","Jeśli masz tyle czasu do stracenia, sprawdź, czy znajdziesz niebieski kielich. Moje badania nad Zakonem sugerują, że ukryli go gdzieś w sektorze produkcyjnym fabryki. Ten artefakt miałby dla mnie ogromną wartość, więc, przynieś go do mnie, a pomogę ci.","Se você tem tanto tempo livre assim, veja se você consegue achar o cálice azul. Pelo que pesquisei sobre a Ordem, eles o esconderam em algum lugar no setor de manufatura da fábrica. Esse artefato seria de grande valor pra mim, então traga ele para mim e eu te ajudarei.",,"Dacă ai atât de mult timp de pierdut, vezi dacă poți găsi pocalul albastru. Studiile mele indică faptul că Ordinul l-a ascuns undeva în sectorul de manufactură al fabricii. Artefactul mi-ar fi de mare folos, așa că, adu-mi-l, și o să te ajut.","Если тебе не жаль времени, найди синюю чашу. Я изучал Орден и узнал, что они спрятали её где-то в обрабатывающем секторе фабрики. Мне очень нужен этот артефакт. Принеси его мне, и я помогу тебе.",,"Om du har så mycket tid att slösa, se om du kan hitta den blå bägaren. Mina studier om orden tyder på att de har gömt den någonstans i fabrikens tillverkningssektor. Denna artefakt skulle vara av stort värde för mig, så, ta med den till mig så ska jag hjälpa dig.","Kaybedecek bu kadar zamanın varsa, mavi kadehi bulmaya çalış. Tarikat üzerine yaptığım çalışmalar, onu fabrikanın üretim bölümünde bir yere sakladıklarını gösteriyor. Bu obje benim için çok değerli, bu yüzden onu bana getir, ben de sana yardım edeyim." -"You found the blue chalice! OK, give it to me first, and we'll trade.",TXT_DLG_SCRIPT23_D16676_YOUFO,〃,,,"Tys našel modrý kalich! Dobře, nejprv mi ho dej a vyrovnáme se.","Du har fundet den blå bæger! OK, giv mig den først, så kan vi bytte.","Du hast den blauen Kelch gefunden! Ok, erst gibst du ihn mir, dann handeln wir.",,"Vi trovis la bluan kalikon! Bone, vi unue donu ĝin kaj tiam ni interkonsentos.","¡Has encontrado el cáliz azul! Bueno, dámelo primero y negociamos.","¡Encontraste el cáliz azul! Bueno, dámelo primero y negociamos.","Löysit sinisen maljan! No niin, anna se ensin minulle, niin tehdään vaihtokaupat.","Vous avez le Calice Bleu! Ok, donnez le moi et nous échangerons.","Megszerezted a kék serleget! OK, add ide gyorsan először, aztán üzletelhetünk.","Hai trovato il calice blu! OK, dammelo, e poi possiamo trattare.","青の聖杯を見つけたのか! +"You found the blue chalice! OK, give it to me first, and we'll trade.",TXT_DLG_SCRIPT23_D16676_YOUFO,〃,,,"Tys našel modrý kalich! Dobře, nejprv mi ho dej a vyrovnáme se.","Du har fundet den blå bæger! OK, giv mig den først, så kan vi bytte.","Du hast den blauen Kelch gefunden! Ok, erst gibst du ihn mir, dann handeln wir.",,"Vi trovis la bluan kalikon! Bone, vi unue donu ĝin kaj tiam ni interkonsentos.","¡Has encontrado el cáliz azul! Bueno, dámelo primero y negociamos.","¡Encontraste el cáliz azul! Bueno, dámelo primero y negociamos.","Löysit sinisen maljan! No niin, anna se ensin minulle, niin tehdään vaihtokaupat.","Vous avez le Calice Bleu! Ok, donnez le moi et nous échangerons.",,"Megszerezted a kék serleget! OK, add ide gyorsan először, aztán üzletelhetünk.","Hai trovato il calice blu! OK, dammelo, e poi possiamo trattare.","青の聖杯を見つけたのか! 良し、それをくれたら取引に応じよう。",푸른 성배를 정말로 찾으셨군요! 저에게 주세요. 그럼 거래를 시작하죠!,"Je hebt de blauwe kelk gevonden! Oké, geef hem eerst aan mij, dan ruilen we hem.","Du fant det blå begeret! OK, gi det til meg først, så bytter vi.","Znalazłeś niebieski kielich! OK, daj mi go najpierw, a wymienimy się.","Você achou o cálice azul! Ok, me dê ele primeiro e aí a gente negocia.",,"Ai găsit pocalul albastru! OK, dă-mi-l, și o să facem schimb.","Ты нашёл синюю чашу! Отдай её мне, и я исполню свою часть договора.",,"Du har hittat den blå bägaren! Okej, ge den till mig först så byter vi.","Mavi kadehi bulmuşsun! Tamam, önce onu bana ver, sonra takas ederiz." -"Take it, it's bad luck anyway.",TXT_RPLY0_SCRIPT23_D16676_TAKEI,〃,,,"Vem si ho, stejně přináší jen smůlu.","Tag den, den bringer alligevel uheld.","Nimm ihn, er bringt sowieso Unglück.",,"Havu, ĝi alportas misfortunon.","Toma, de todos modos da mala suerte.",,"Ota se, epäonnenkalu se kuitenkin on.","Gardez le, je parie qu'il file malchance.","Vidd nyugodtan, rossz szerencsét hoz amúgyis.","Prendilo, tanto porta sfortuna.",渡そう、兎に角運が悪かった。,여기 받아요. 재수 없어 보이니까.,"Neem het, het is toch al pech.","Ta det, det bringer ulykke uansett.","Weź go, to i tak przynosi pecha.",Pode pegar. Isso atrai azar de qualquer forma.,,"Ia-l, poartă ghinion oricum.",Держи. Она всё равно приносит несчастье.,,"Ta den, den betyder ändå otur.","Al, zaten kötü şans getirir." -"Screw you, I'm keeping it.",TXT_RPLY1_SCRIPT23_D16676_SCREW,〃,,,"Jdi se vycpat, nechám si ho.","Rend mig, jeg beholder den.","Ach, was soll's. Ich behalte ihn.",,"Al la diablo, mi konservos ĝin.","Que te zurzan, me lo quedo.","Al diablo, me lo quedo.","Vedä käteen, pidän sen itselläni.","Allez vous faire voir, il est à moi maintenant.","Nagy francot, inkább megtartom.",E invece me lo tengo!,ふざけるな、俺の物だ。,"배 째시지, 이건 이제 제거에요.","Krijg de klere, ik hou het.","Faen ta deg, jeg beholder det.","Wal się, zatrzymuję go.","Vá se ferrar, ele é meu.",,"Du-te naibi, îl păstrez.",Пошёл ты! Я оставлю её себе.,,"Dra åt helvete, jag behåller den.","Siktir git, bende kalacak." +"Take it, it's bad luck anyway.",TXT_RPLY0_SCRIPT23_D16676_TAKEI,〃,,,"Vem si ho, stejně přináší jen smůlu.","Tag den, den bringer alligevel uheld.","Nimm ihn, er bringt sowieso Unglück.",,"Havu, ĝi alportas misfortunon.","Toma, de todos modos da mala suerte.",,"Ota se, epäonnenkalu se kuitenkin on.","Gardez le, je parie qu'il file malchance.",,"Vidd nyugodtan, rossz szerencsét hoz amúgyis.","Prendilo, tanto porta sfortuna.",渡そう、兎に角運が悪かった。,여기 받아요. 재수 없어 보이니까.,"Neem het, het is toch al pech.","Ta det, det bringer ulykke uansett.","Weź go, to i tak przynosi pecha.",Pode pegar. Isso atrai azar de qualquer forma.,,"Ia-l, poartă ghinion oricum.",Держи. Она всё равно приносит несчастье.,,"Ta den, den betyder ändå otur.","Al, zaten kötü şans getirir." +"Screw you, I'm keeping it.",TXT_RPLY1_SCRIPT23_D16676_SCREW,〃,,,"Jdi se vycpat, nechám si ho.","Rend mig, jeg beholder den.","Ach, was soll's. Ich behalte ihn.",,"Al la diablo, mi konservos ĝin.","Que te zurzan, me lo quedo.","Al diablo, me lo quedo.","Vedä käteen, pidän sen itselläni.","Allez vous faire voir, il est à moi maintenant.",,"Nagy francot, inkább megtartom.",E invece me lo tengo!,ふざけるな、俺の物だ。,"배 째시지, 이건 이제 제거에요.","Krijg de klere, ik hou het.","Faen ta deg, jeg beholder det.","Wal się, zatrzymuję go.","Vá se ferrar, ele é meu.",,"Du-te naibi, îl păstrez.",Пошёл ты! Я оставлю её себе.,,"Dra åt helvete, jag behåller den.","Siktir git, bende kalacak." Then I'm not giving you anything. Get lost!,TXT_RYES1_SCRIPT23_D16676_THENI,〃 (If you keep the chalice),,,Pak ti nic nedám. Zmizni!,Så giver jeg dig ikke noget. Forsvind!,Dann bekommst du auch nichts von mir. Verzieh dich!,,"Tiuokaze mi donos nenion al vi. Foriru!","Entonces -no te doy nada. ¡Vete!",,Sitten en anna sinulle mitään. Antaa vetää!,"Rien pour vous, alors, dégagez!",Akkor meg tudod mikor adok neked bármit is. Húzzál elfelé!,E allora non ti darò niente. Sparisci!,何もやるモンは無いぞ。失せな!,이런 식으로 나가시겠다? 그럼 거래를 취소하죠. 사라지세요!,Dan geef ik je niets. Donder op!,Da gir jeg deg ingenting. Forsvinn!,Więc nic ci nie dam. Spadaj!,Então não te darei nada. Se manda!,,Atunci nu îți dau nimic. Valea!,Тогда я тебе ничего не скажу. Убирайся!,,Då ger jag dig ingenting. Försvinn!,O zaman sana hiçbir şey vermiyorum. Kaybol! -Locate the forge. The information I just gave you should help you enter a secretive sector of the factory. One of the forge workers can open the door.,TXT_DLG_SCRIPT23_D18192_LOCAT,〃 (If you give the chalice away),,,"Najdi slévárnu. Informace, které jsem ti právě dal, ti pomůžou vstoupit do tajného sektoru továrny. Jeden z pracovníků slévárny ti otevře dveře.","Find smedjen. De oplysninger, jeg lige har givet dig, skulle hjælpe dig med at komme ind i en hemmelig sektor af fabrikken. En af smediearbejderne kan åbne døren.","Finde die Schmiede. Die Informationen, die ich dir gegeben habe, sollten dir helfen einen geheimen Sektor der Fabrik zu betreten. Einer der Schmiedearbeiter kann dir helfen die Tür zu öffnen.",,"Iru al la forĝejo. La informoj, kiujn mi donis, devus permesi al vi eniri sekretan sektoron en la fabriko. Unu el la laboristoj en la forĝejo povas malfermi la pordon.",Ve a la forja. La información que te he dado debería permitirte entrar en un sector secreto de la fábrica. Uno de los trabajadores de la forja puede abrir la puerta.,Ve a la forja. La información que te di debería permitirte entrar a un sector secreto de la fábrica. Uno de los trabajadores de la forja puede abrir la puerta.,Suunnista pajalle. Juuri antamani tiedon pitäisi auttaa sinua pääsemään salamyhkäiseen osastoon tehtaalla. Yksi pajan työntekijöistä voi avata oven.,Localisez la forge. L'information que je vous ai donnée devrait vous aider à entrer dans une section secrète de l'usine. L'un des travailleurs de la forge peut ouvrir la porte pour vous.,"Keresd meg a kohót. Az információ amit adtam, segíteni fog abban, hogy megleld a gyár titkos részét. Az egyik kohóban dolgozó ki tudja nyitni az ajtót.",Trova la fucina. Le informazioni che ti ho appena dato ti dovrebbero aiutare a trovare una sezione segreta della Fabbrica. Uno dei lavoratori della fucina ti potrà aprire la porta.,"工場の鉄工所を探せ。俺が与えた情報は +no te doy nada. ¡Vete!",,Sitten en anna sinulle mitään. Antaa vetää!,"Rien pour vous, alors, dégagez!",,Akkor meg tudod mikor adok neked bármit is. Húzzál elfelé!,E allora non ti darò niente. Sparisci!,何もやるモンは無いぞ。失せな!,이런 식으로 나가시겠다? 그럼 거래를 취소하죠. 사라지세요!,Dan geef ik je niets. Donder op!,Da gir jeg deg ingenting. Forsvinn!,Więc nic ci nie dam. Spadaj!,Então não te darei nada. Se manda!,,Atunci nu îți dau nimic. Valea!,Тогда я тебе ничего не скажу. Убирайся!,,Då ger jag dig ingenting. Försvinn!,O zaman sana hiçbir şey vermiyorum. Kaybol! +Locate the forge. The information I just gave you should help you enter a secretive sector of the factory. One of the forge workers can open the door.,TXT_DLG_SCRIPT23_D18192_LOCAT,〃 (If you give the chalice away),,,"Najdi slévárnu. Informace, které jsem ti právě dal, ti pomůžou vstoupit do tajného sektoru továrny. Jeden z pracovníků slévárny ti otevře dveře.","Find smedjen. De oplysninger, jeg lige har givet dig, skulle hjælpe dig med at komme ind i en hemmelig sektor af fabrikken. En af smediearbejderne kan åbne døren.","Finde die Schmiede. Die Informationen, die ich dir gegeben habe, sollten dir helfen einen geheimen Sektor der Fabrik zu betreten. Einer der Schmiedearbeiter kann dir helfen die Tür zu öffnen.",,"Iru al la forĝejo. La informoj, kiujn mi donis, devus permesi al vi eniri sekretan sektoron en la fabriko. Unu el la laboristoj en la forĝejo povas malfermi la pordon.",Ve a la forja. La información que te he dado debería permitirte entrar en un sector secreto de la fábrica. Uno de los trabajadores de la forja puede abrir la puerta.,Ve a la forja. La información que te di debería permitirte entrar a un sector secreto de la fábrica. Uno de los trabajadores de la forja puede abrir la puerta.,Suunnista pajalle. Juuri antamani tiedon pitäisi auttaa sinua pääsemään salamyhkäiseen osastoon tehtaalla. Yksi pajan työntekijöistä voi avata oven.,Localisez la forge. L'information que je vous ai donnée devrait vous aider à entrer dans une section secrète de l'usine. L'un des travailleurs de la forge peut ouvrir la porte pour vous.,,"Keresd meg a kohót. Az információ amit adtam, segíteni fog abban, hogy megleld a gyár titkos részét. Az egyik kohóban dolgozó ki tudja nyitni az ajtót.",Trova la fucina. Le informazioni che ti ho appena dato ti dovrebbero aiutare a trovare una sezione segreta della Fabbrica. Uno dei lavoratori della fucina ti potrà aprire la porta.,"工場の鉄工所を探せ。俺が与えた情報は そこの隠された区域に入る為に必要だ。 偽の作業員がドアを開けるだろう。",공장의 제련소로 찾아가세요. 제가 제공한 정보만 있으면 그곳으로 향하는 비밀구역을 쉽게 찾을 수 있을 겁니다. 제련소 직원 중 한 명이 그곳으로 향하는 문을 열 수 있어요.,Zoek de smederij. De informatie die ik je net heb gegeven zou je moeten helpen om een geheime sector van de fabriek te betreden. Een van de smidsewerkers kan de deur openen.,Finn smia. Informasjonen jeg nettopp ga deg bør hjelpe deg å komme inn i en hemmelig sektor av fabrikken. En av smiearbeiderne kan åpne døren.,"Zlokalizuj kuźnię. Informacje, które przed chwilą podałem, powinny pomóc ci wejść do tajnego sektora fabryki. Jeden z pracowników kuźni może otworzyć drzwi.",Localize a forja. A informação que acabei de te passar deve ajudar para entrar em um setor secreto da fábrica. Um dos operários da forja pode abrir a porta.,,Găsește forja. Informațiile pe care ți le-am oferit ar trebui să te ajute să intri într-un sector secret al fabricii. Unul dintre făurari poate deschide ușa.,"Найди кузню. Сведения, которые я передал тебе, помогут тебе пройти в секретный сектор фабрики. Один из работников в кузне откроет тебе дверь.",,Leta upp smedjan. Informationen jag just gav dig ska hjälpa dig att komma in i en hemlig sektor av fabriken. En av smidesarbetarna kan öppna dörren.,Demirhaneyi bulun. Sana verdiğim bilgiler fabrikanın gizli bir bölümüne girmene yardımcı olacaktır. Demirci işçilerinden biri kapıyı açabilir. -What can I find there?,TXT_RPLY0_SCRIPT23_D18192_WHATC,〃,,,Co tam můžu najít?,Hvad kan jeg finde der?,Was kann ich dort finden?,,Kion mi trovos tien?,¿Qué puedo encontrar allí?,,Mitä löydän sieltä?,Qu'est ce que je peux y trouver?,Mit fogok ott találni?,Che cosa troverò là?,そこには何がある?,그곳을 어떻게 찾을 수 있죠?,Wat kan ik daar vinden?,Hva kan jeg finne der?,Co mogę tam znaleźć?,O que vou encontrar lá?,,Ce pot găsi acolo?,Что там находится?,,Vad kan jag hitta där?,Orada ne bulabilirim? -My research suggests that some dark power from the ancient past is hidden there. Be careful!,TXT_DLG_SCRIPT23_D19708_MYRES,〃,,,"Můj výzkum naznačuje, že se tam schovává nějaká starověká temná síla. Buď opatrný!","Min forskning tyder på, at der er gemt en mørk magt fra den gamle fortid der. Vær forsigtig!","Meine Nachforschungen lassen vermuten, dass dort eine dunkle Macht aus längst vergangenen Zeiten versteckt ist. Sei vorsichtig!",,"Mia esplorado sugestas, ke malluma povo de la antikveco estas kaŝita tie. Gardu vin!",Mi investigación sugiere que un poder oscuro de la antigüedad se oculta allí. ¡Ten cuidado!,,"Tutkimukseni viittaa siihen, että jokin pimeä voima muinaismenneisyydestä on kätketty sinne. Ole varuillasi!",Mes recherches suggèrent qu'il y a un pouvoir sombre ancien qui s'y cache. Faites attention!,"A kutatásaim azt mutatják, hogy az ősidőkből maradt sötét erő bújik meg ott. Légy óvatos!","Dopo attente ricerche sul materiale che ho, ho stabilito che un oscuro e antico potere è nascosto lì. Fai attenzione!","俺の調査では、古代の災厄がそこに隠されている +What can I find there?,TXT_RPLY0_SCRIPT23_D18192_WHATC,〃,,,Co tam můžu najít?,Hvad kan jeg finde der?,Was kann ich dort finden?,,Kion mi trovos tien?,¿Qué puedo encontrar allí?,,Mitä löydän sieltä?,Qu'est ce que je peux y trouver?,,Mit fogok ott találni?,Che cosa troverò là?,そこには何がある?,그곳을 어떻게 찾을 수 있죠?,Wat kan ik daar vinden?,Hva kan jeg finne der?,Co mogę tam znaleźć?,O que vou encontrar lá?,,Ce pot găsi acolo?,Что там находится?,,Vad kan jag hitta där?,Orada ne bulabilirim? +My research suggests that some dark power from the ancient past is hidden there. Be careful!,TXT_DLG_SCRIPT23_D19708_MYRES,〃,,,"Můj výzkum naznačuje, že se tam schovává nějaká starověká temná síla. Buď opatrný!","Min forskning tyder på, at der er gemt en mørk magt fra den gamle fortid der. Vær forsigtig!","Meine Nachforschungen lassen vermuten, dass dort eine dunkle Macht aus längst vergangenen Zeiten versteckt ist. Sei vorsichtig!",,"Mia esplorado sugestas, ke malluma povo de la antikveco estas kaŝita tie. Gardu vin!",Mi investigación sugiere que un poder oscuro de la antigüedad se oculta allí. ¡Ten cuidado!,,"Tutkimukseni viittaa siihen, että jokin pimeä voima muinaismenneisyydestä on kätketty sinne. Ole varuillasi!",Mes recherches suggèrent qu'il y a un pouvoir sombre ancien qui s'y cache. Faites attention!,,"A kutatásaim azt mutatják, hogy az ősidőkből maradt sötét erő bújik meg ott. Légy óvatos!","Dopo attente ricerche sul materiale che ho, ho stabilito che un oscuro e antico potere è nascosto lì. Fai attenzione!","俺の調査では、古代の災厄がそこに隠されている という話だ。注意しろよ!","제가 연구를 좀 더 해봤는데, 그곳에서 사악한 고대의 기운이 솟아난다는군요. 조심하시길!",Mijn onderzoek suggereert dat daar een duistere kracht uit het oude verleden verborgen ligt. Wees voorzichtig!,Forskningen min tyder på at en mørk kraft fra fortiden er skjult der. Vær forsiktig!,"Moje badania sugerują, że ukryta jest tam jakaś mroczna moc z zamierzchłej przeszłości. Bądź ostrożny!",Minha pesquisa sugere que há algum poder sombrio do passado antigo escondido naquele lugar. Tome cuidado!,,Investigațiile mele indică faptul că ceva putere întunecată din trecutul antic e ascunsă acolo. Ai grijă!,"Судя по результатам исследования, какая-то тёмная сила из далёкого прошлого. Будь осторожен!",,Min forskning tyder på att någon mörk kraft från det forntida förflutna är gömd där. Var försiktig!,"Araştırmalarım, kadim geçmişten gelen karanlık bir gücün orada saklı olduğunu gösteriyor. Dikkatli ol!" "That blue chalice, how'd you come by it? I've been researching the Order and their links to the distant past, and that artifact would help me. Let's make a deal. Give me the chalice, and I'll give you some info.",TXT_DLG_SCRIPT23_D21224_THATB,"SVE.WAD -MAP23: Timothy (Talking with him for the very first time with the chalice).",,,"Ten modrý kalich, jak jsi k němu přišel? Zkoumal jsem Řád a jeho pojítka k dávné minulosti a ten artefakt by mi pomohl. Udělejme dohodu: Ty mi dáš ten kalich a já ti dám nějaké informace.","Den blå bæger, hvordan er du kommet til den? Jeg har forsket i Ordenen og deres forbindelser til den fjerne fortid, og denne artefakt ville hjælpe mig. Lad os lave en aftale. Giv mig bægeret, og jeg giver dig nogle oplysninger.","Dieser blaue Kelch, wie bist du da ran gekommen? Ich habe bereits über den Orden und deren Verbindung zur fernen Vergangenheit recherchiert, und dieses Artefakt könnte mir weiterhelfen. Ich schlage dir etwas vor: Gib mir den Kelch und ich gebe dir Informationen.",,"Tiu blua kaliko, kiel vi trovis ĝin? Mi esploradis La Ordenon kaj ĝiajn rilatojn kun la fora pasinteco, kaj tiu artefakto helpus min. Ni intertraktu: donu al mi la kalikon kaj mi donos informojn al vi.","Ese cáliz azul, ¿de dónde lo has sacado? He estado investigando a La Orden y sus conexiones con el pasado lejano, y ese artefacto me serviría. Hagamos un trato: dame el cáliz y te daré algo de información.","Ese cáliz azul, ¿de dónde lo sacaste? He estado investigando a La Orden y sus conexiones con el pasado lejano, y ese artefacto me serviría. Hagamos un trato: dame el cáliz y te doy algo de información.","Tuo sininen uhrimalja, miten onnistuit saamaan sen? Olen tutkinut Veljeskuntaa ja sen kytköksiä kaukaiseen menneisyyteen, ja tuo esine auttaisi minua. Tehdäänpä kauppa: Sinä annat minulle maljan, ja minä annan sinulle tietoa.","Ce calice bleu, comment l'avez vous trouvé? Je fais des recherches sur l'Ordre et leurs liens avec le passé. Cet artéfact m'aiderait beaucoup. Faisons affaires: donnez le moi et je vous aiderai.","Hogyan sikerült megszerened azt a kék serleget? Kutattam a Rendet és kapcsolatukat a messzi múlttal, és ez az ereklye nagy segítség lenne. Kössünk üzletet. Add ide a serleget, és cserébe kapsz információt.","Quel calice blu, come lo hai trovato? Ho passato molto tempo a ricercare l'Ordine e i suoi legami con il lontano passato, e quell'artifatto mi aiuterebbe. Facciamo una cosa. Se mi dai il calice, io ti darò delle informazioni.","その青い聖杯はどうした? +MAP23: Timothy (Talking with him for the very first time with the chalice).",,,"Ten modrý kalich, jak jsi k němu přišel? Zkoumal jsem Řád a jeho pojítka k dávné minulosti a ten artefakt by mi pomohl. Udělejme dohodu: Ty mi dáš ten kalich a já ti dám nějaké informace.","Den blå bæger, hvordan er du kommet til den? Jeg har forsket i Ordenen og deres forbindelser til den fjerne fortid, og denne artefakt ville hjælpe mig. Lad os lave en aftale. Giv mig bægeret, og jeg giver dig nogle oplysninger.","Dieser blaue Kelch, wie bist du da ran gekommen? Ich habe bereits über den Orden und deren Verbindung zur fernen Vergangenheit recherchiert, und dieses Artefakt könnte mir weiterhelfen. Ich schlage dir etwas vor: Gib mir den Kelch und ich gebe dir Informationen.",,"Tiu blua kaliko, kiel vi trovis ĝin? Mi esploradis La Ordenon kaj ĝiajn rilatojn kun la fora pasinteco, kaj tiu artefakto helpus min. Ni intertraktu: donu al mi la kalikon kaj mi donos informojn al vi.","Ese cáliz azul, ¿de dónde lo has sacado? He estado investigando a La Orden y sus conexiones con el pasado lejano, y ese artefacto me serviría. Hagamos un trato: dame el cáliz y te daré algo de información.","Ese cáliz azul, ¿de dónde lo sacaste? He estado investigando a La Orden y sus conexiones con el pasado lejano, y ese artefacto me serviría. Hagamos un trato: dame el cáliz y te doy algo de información.","Tuo sininen uhrimalja, miten onnistuit saamaan sen? Olen tutkinut Veljeskuntaa ja sen kytköksiä kaukaiseen menneisyyteen, ja tuo esine auttaisi minua. Tehdäänpä kauppa: Sinä annat minulle maljan, ja minä annan sinulle tietoa.","Ce calice bleu, comment l'avez vous trouvé? Je fais des recherches sur l'Ordre et leurs liens avec le passé. Cet artéfact m'aiderait beaucoup. Faisons affaires: donnez le moi et je vous aiderai.",,"Hogyan sikerült megszerened azt a kék serleget? Kutattam a Rendet és kapcsolatukat a messzi múlttal, és ez az ereklye nagy segítség lenne. Kössünk üzletet. Add ide a serleget, és cserébe kapsz információt.","Quel calice blu, come lo hai trovato? Ho passato molto tempo a ricercare l'Ordine e i suoi legami con il lontano passato, e quell'artifatto mi aiuterebbe. Facciamo una cosa. Se mi dai il calice, io ti darò delle informazioni.","その青い聖杯はどうした? 私はオーダーの遥か過去の関係について調査 していた、その骨董品が手掛かりになりそうだ。 取引しよう、聖杯をくれれば幾つか情報を渡す。","저 푸른 성배... 어떻게 찾으신 거죠? 오더와 그들의 과거를 좀 조사하던 참이었습니다. 저 보물만 있으면 아주 커다란 도움이 될 것입니다. 그 성배를 주신다면, 좋은 정보를 알려주겠습니다.","Die blauwe kelk, hoe kom je eraan? Ik heb de Orde en hun verbanden met het verre verleden onderzocht, en dat artefact zou me helpen. Laten we een deal sluiten. Geef me de kelk en ik zal je wat informatie geven.","Det blå begeret, hvordan fikk du tak i det? Jeg har forsket på Ordenen og deres forbindelser til en fjern fortid, og den gjenstanden kan hjelpe meg. La oss gjøre en avtale. Gi meg begeret, så gir jeg deg informasjon.","Ten niebieski kielich, skąd go masz? Badałem Zakon i ich powiązania z odległą przeszłością, a ten artefakt mógłby mi pomóc. Zawrzyjmy układ. Daj mi kielich, a ja dam ci trochę informacji.","Esse cálice azul, como você o encontrou? Estive pesquisando sobre a Ordem e o seu vínculo com o passado distante e esse artefato me ajudaria. Vamos fazer um trato. Me dê o cálice e eu te dou informações.",,"Acel potir albastru, cum l-ai găsit? Am cercetat Ordinul și legăturile lor cu trecutul, iar acel artefact mă poate ajuta. Să facem un târg, Îmi dai potirul, iar eu îți dau informații.","Эта синяя чаша... откуда она у тебя? Мои исследования Ордена связаны с событиями далёкого прошлого, и мне очень нужен этот артефакт. Давай заключим сделку: ты мне чашу, а я тебе — информацию.",,"Den blå kalken, hur kom du över den? Jag har forskat om orden och deras kopplingar till det förflutna, och den artefakten skulle hjälpa mig. Låt oss göra en överenskommelse. Ge mig bägaren, så ger jag dig lite information.","O mavi kadehi nereden buldun? Tarikat'ı ve uzak geçmişle bağlantılarını araştırıyordum ve bu eser bana yardımcı olabilir. Bir anlaşma yapalım. Kadehi bana ver, ben de sana biraz bilgi vereyim." -"Take it, it's bad luck anyway.",TXT_RPLY0_SCRIPT23_D21224_TAKEI,〃,,,"Vem si ho, stejně přináší jen smůlu.","Tag den, den bringer alligevel uheld.","Nimm ihn, er bringt sowieso Unglück.",,"Havu, ĝi alportas misfortunon.","Toma, de todos modos da mala suerte.",,"Ota se, epäonnenkalu se kuitenkin on.","Gardez le, je parie qu'il file malchance.","Vidd nyugodtan, rossz szerencsét hoz amúgyis.","Prendilo, tanto porta sfortuna.",渡そう、兎に角運が悪かった。,"값어치도 없을 것 같은데, 그냥 가져가세요.","Neem het, het is toch al pech.","Ta det, det bringer ulykke uansett.","Weź go, to i tak przynosi pecha.",Pode pegar. Isso atrai azar de qualquer forma.,,"Ia-l, poartă ghinion oricum.",Держи. Она всё равно приносит несчастье.,,"Ta den, den betyder ändå otur.","Al, zaten kötü şans getirir." -"Screw you, I'm keeping it.",TXT_RPLY1_SCRIPT23_D21224_SCREW,〃,,,"Jdi se vycpat, nechám si ho.","Rend mig, jeg beholder den.","Ach, was soll's. Ich behalte ihn.",,"Al la diablo, mi konservos ĝin.","Que te zurzan, me lo quedo.","Al diablo, me lo quedo.","Vedä käteen, pidän sen itselläni.","Allez vous faire voir, il est à moi maintenant.","Nagy francot, inkább megtartom.",E invece me lo tengo!,ふざけるな、俺の物だ。,뭔 개소리야? 이제 이건 내 것이라고!,"Krijg de klere, ik hou hem.","Faen ta deg, jeg beholder det.","Wal się, zatrzymam go.","Vá se ferrar, ele é meu.",,"Du-te naibi, îl păstrez.",Пошёл ты! Я оставлю её себе.,,"Dra åt helvete, jag behåller den.","Siktir git, bende kalacak." +"Take it, it's bad luck anyway.",TXT_RPLY0_SCRIPT23_D21224_TAKEI,〃,,,"Vem si ho, stejně přináší jen smůlu.","Tag den, den bringer alligevel uheld.","Nimm ihn, er bringt sowieso Unglück.",,"Havu, ĝi alportas misfortunon.","Toma, de todos modos da mala suerte.",,"Ota se, epäonnenkalu se kuitenkin on.","Gardez le, je parie qu'il file malchance.",,"Vidd nyugodtan, rossz szerencsét hoz amúgyis.","Prendilo, tanto porta sfortuna.",渡そう、兎に角運が悪かった。,"값어치도 없을 것 같은데, 그냥 가져가세요.","Neem het, het is toch al pech.","Ta det, det bringer ulykke uansett.","Weź go, to i tak przynosi pecha.",Pode pegar. Isso atrai azar de qualquer forma.,,"Ia-l, poartă ghinion oricum.",Держи. Она всё равно приносит несчастье.,,"Ta den, den betyder ändå otur.","Al, zaten kötü şans getirir." +"Screw you, I'm keeping it.",TXT_RPLY1_SCRIPT23_D21224_SCREW,〃,,,"Jdi se vycpat, nechám si ho.","Rend mig, jeg beholder den.","Ach, was soll's. Ich behalte ihn.",,"Al la diablo, mi konservos ĝin.","Que te zurzan, me lo quedo.","Al diablo, me lo quedo.","Vedä käteen, pidän sen itselläni.","Allez vous faire voir, il est à moi maintenant.",,"Nagy francot, inkább megtartom.",E invece me lo tengo!,ふざけるな、俺の物だ。,뭔 개소리야? 이제 이건 내 것이라고!,"Krijg de klere, ik hou hem.","Faen ta deg, jeg beholder det.","Wal się, zatrzymam go.","Vá se ferrar, ele é meu.",,"Du-te naibi, îl păstrez.",Пошёл ты! Я оставлю её себе.,,"Dra åt helvete, jag behåller den.","Siktir git, bende kalacak." Then I'm not giving you anything. Get lost!,TXT_RYES1_SCRIPT23_D21224_THENI,〃,,,Pak ti nic nedám. Zmizni!,Så giver jeg dig ikke noget. Forsvind!,Dann bekommst du auch nichts von mir. Verzieh dich!,,"Tiuokaze mi donos nenion al vi. Foriru!","Entonces -no te doy nada. ¡Vete!",,Sitten en anna sinulle mitään. Antaa vetää!,"Rien pour vous, alors, dégagez!",Akkor meg tudod mikor adok neked bármit is. Húzzál elfelé!,E allora non ti darò niente. Sparisci!,何もやるモンは無いぞ。失せな!,아주 좋은 기회를 다 날려버리시는군. 꺼져요!,Dan geef ik je niets. Donder op!,Da gir jeg deg ingenting. Forsvinn!,Więc nic ci nie dam. Spadaj!,Então não te darei nada. Se manda!,,Atunci nu îți dau nimic. Valea!,Тогда я тебе ничего не скажу. Убирайся!,,Då ger jag dig ingenting. Försvinn!,O zaman sana hiçbir şey vermiyorum. Kaybol! +no te doy nada. ¡Vete!",,Sitten en anna sinulle mitään. Antaa vetää!,"Rien pour vous, alors, dégagez!",,Akkor meg tudod mikor adok neked bármit is. Húzzál elfelé!,E allora non ti darò niente. Sparisci!,何もやるモンは無いぞ。失せな!,아주 좋은 기회를 다 날려버리시는군. 꺼져요!,Dan geef ik je niets. Donder op!,Da gir jeg deg ingenting. Forsvinn!,Więc nic ci nie dam. Spadaj!,Então não te darei nada. Se manda!,,Atunci nu îți dau nimic. Valea!,Тогда я тебе ничего не скажу. Убирайся!,,Då ger jag dig ingenting. Försvinn!,O zaman sana hiçbir şey vermiyorum. Kaybol! "Now, what can I help you with?",TXT_DLG_SCRIPT23_D22740_NOWWH,"SVE.WAD -MAP23: Tevick.",,,"Tak, s čím ti mohu pomoci?",Hvad kan jeg hjælpe dig med?,"Nun, wie kann ich dir weiterhelfen?",,"Nu, kion mi povas doni al vi?","Y bueno, ¿en qué puedo ayudarte?",,"No niin, miten voin palvella?","Bon, que puis-je pour vous?",Akkor miben segíthetek?,"E ora, come posso aiutarti?",今手伝ってくれるか?,"그럼, 뭘 더 도와드릴까요?","Nu, waar kan ik je mee helpen?",Hva kan jeg hjelpe deg med?,"A teraz, w czym mogę ci pomóc?","Então, como posso ajudá-lo?",,"Acum, cu ce te pot ajuta?","Итак, чем я могу быть тебе полезен?",,Vad kan jag hjälpa dig med?,"Şimdi, sana nasıl yardım edebilirim?" -Shadow armor?,TXT_RPLY0_SCRIPT23_D22740_SHADO,〃,,Shadow armour?,Stínové brnění?,Skygge rustning?,Schattenrüstung?,,Ĉu ombran armaĵon?,¿Armadura de sombra?,,Varjohaarniska?,Armure des ombres?,Árnyék vért?,Armatura Ombra?,シャドウアーマー?,그림자 갑옷?,Schaduw pantser?,Skyggepanser?,Zbroja cieni?,Armadura das sombras?,,Armura umbrei?,Теневой бронёй?,,Skuggarmering?,Gölge zırhı mı? +MAP23: Tevick.",,,"Tak, s čím ti mohu pomoci?",Hvad kan jeg hjælpe dig med?,"Nun, wie kann ich dir weiterhelfen?",,"Nu, kion mi povas doni al vi?","Y bueno, ¿en qué puedo ayudarte?",,"No niin, miten voin palvella?","Bon, que puis-je pour vous?",,Akkor miben segíthetek?,"E ora, come posso aiutarti?",今手伝ってくれるか?,"그럼, 뭘 더 도와드릴까요?","Nu, waar kan ik je mee helpen?",Hva kan jeg hjelpe deg med?,"A teraz, w czym mogę ci pomóc?","Então, como posso ajudá-lo?",,"Acum, cu ce te pot ajuta?","Итак, чем я могу быть тебе полезен?",,Vad kan jag hjälpa dig med?,"Şimdi, sana nasıl yardım edebilirim?" +Shadow armor?,TXT_RPLY0_SCRIPT23_D22740_SHADO,〃,,Shadow armour?,Stínové brnění?,Skygge rustning?,Schattenrüstung?,,Ĉu ombran armaĵon?,¿Armadura de sombra?,,Varjohaarniska?,Armure des ombres?,,Árnyék vért?,Armatura Ombra?,シャドウアーマー?,그림자 갑옷?,Schaduw pantser?,Skyggepanser?,Zbroja cieni?,Armadura das sombras?,,Armura umbrei?,Теневой бронёй?,,Skuggarmering?,Gölge zırhı mı? "Ahh, to be heard, but not seen!",TXT_RYES0_SCRIPT23_D22740_AHHTO,〃,,,"Áha, být slyšen, ne viděn!","Ahh, at blive hørt, men ikke set!","Ah, um gehört zu werden, aber ungesehen zu bleiben.",,"Ha, por esti aŭdata, sed ne vidata!","Ah, ¡para ser oído, -pero no visto!",,"Aah, tulla kuulluksi, muttei nähdyksi!","Ah, pour se faire entendre, sans se faire voir!","Csak hallani, de nem látni.","Ahh, per essere sentiti, ma non visti!",ああ、声はすれど姿は見えず。,들켜도 당신을 계속 맞추진 못할 거요!,"Ahhh, om gehoord, maar niet gezien te worden!","Å bli hørt, men ikke sett!","Ahh, być słyszanym, ale nie widzianym!","Ahh, ser ouvido mas não ser visto!",,"Ahh, să fii auzit, dar nu văzut!","Ах, чтобы быть услышанным, но не увиденным!",,"Ahh, att höras men inte ses!","Ahh, duyulmak ama görülmemek!" +pero no visto!",,"Aah, tulla kuulluksi, muttei nähdyksi!","Ah, pour se faire entendre, sans se faire voir!",,"Csak hallani, de nem látni.","Ahh, per essere sentiti, ma non visti!",ああ、声はすれど姿は見えず。,들켜도 당신을 계속 맞추진 못할 거요!,"Ahhh, om gehoord, maar niet gezien te worden!","Å bli hørt, men ikke sett!","Ahh, być słyszanym, ale nie widzianym!","Ahh, ser ouvido mas não ser visto!",,"Ahh, să fii auzit, dar nu văzut!","Ах, чтобы быть услышанным, но не увиденным!",,"Ahh, att höras men inte ses!","Ahh, duyulmak ama görülmemek!" "Get out of here, come back when you have some cash.",TXT_RNO0_SCRIPT23_D22740_GETOU,〃,,,"Vypadni a vrať se, když budeš mít peníze.","Forsvind herfra, og kom tilbage, når du har nogle penge.","Verzieh dich, komm wieder, wenn du etwas Geld hast.",,"Foriru. Revenu kiam vi havos monon.","Vete. Vuelve cuando -tengas efectivo.",,"Antaa vetää; tule takaisin, kun sinulla on käteistä.","Sortez de là, revenez quand vous avez de l'argent!","Na kotródj innen, csak akkor lássalak ha van nálad pénz is.","Fuori di qui, ritorna quando avrai del denaro.",ここを出て、稼いでからまた来てくれ!,이 유용한 도구를 공짜로 주기엔 영 그렇군요.,"Ga hier weg, kom terug als je wat geld hebt.","Kom deg ut herfra, og kom tilbake når du har penger.","Wynoś się stąd, wróć jak będziesz miał trochę kasy.",Vá embora daqui. Volte quando tiver dinheiro.,,"Cară-te, întoarce-te când ai bani.","Выметайся вон. Вернёшься, когда раздобудешь наличности.",,Stick härifrån och kom tillbaka när du har pengar.,"Git buradan, biraz paran olduğunda geri gel." +tengas efectivo.",,"Antaa vetää; tule takaisin, kun sinulla on käteistä.","Sortez de là, revenez quand vous avez de l'argent!",,"Na kotródj innen, csak akkor lássalak ha van nálad pénz is.","Fuori di qui, ritorna quando avrai del denaro.",ここを出て、稼いでからまた来てくれ!,이 유용한 도구를 공짜로 주기엔 영 그렇군요.,"Ga hier weg, kom terug als je wat geld hebt.","Kom deg ut herfra, og kom tilbake når du har penger.","Wynoś się stąd, wróć jak będziesz miał trochę kasy.",Vá embora daqui. Volte quando tiver dinheiro.,,"Cară-te, întoarce-te când ai bani.","Выметайся вон. Вернёшься, когда раздобудешь наличности.",,Stick härifrån och kom tillbaka när du har pengar.,"Git buradan, biraz paran olduğunda geri gel." "Thank Deus you got here. To enter the factory you need a key. We stole it but our agent is missing in the web of catacombs under the Order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. Something is down there!",TXT_DLG_SCRIPT23_D24256_THANK,"SVE.WAD -MAP23: Richter.",,,"Díky bohu, žes přišel. Aby ses dostal do továrny, potřebuješ klíč. Ten jsme ukradli, ale náš agent se ztratil v sítí katakomb pod pevností Řádu. Poslal jsem do těch tunelů deset dobrých mužů a žádný se nevrátil. Něco tam dole je!","Tak Deus for at du kom her. For at komme ind på fabrikken skal du bruge en nøgle. Vi stjal den, men vores agent er forsvundet i katakomberne under ordenens højborg. Jeg har sendt ti gode mænd ned i disse tunneller for at finde ham, men ingen er vendt tilbage. Der er noget dernede!","Deus sei dank bist du hier. Um die Fabrik zu betreten, brauchst du einen Schlüssel. Wir haben ihn gestohlen, aber unser Agent ist in den Irrwegen der Katakomben unter Festung des Ordens verschwunden. Ich habe zehn gute Männer da hinunter geschickt um ihn zu finden, aber niemand ist zurückgekehrt. Irgendetwas ist da unten!",,"Danke al Dio vi alvenis. Ŝlosilo estas necesa por eniri la fabrikon; ni ŝtelis ĝin, sed nia agento estas perdita en la katakomba sistemo sub la fortreso de La Ordeno. Mi sendis dek bonajn virojn al tiuj tuneloj por serĉi lin kaj neniu revenis. Estas io tie malsupre!","Gracias a Dios, has llegado. Para entrar en la fábrica se necesita una llave; la hemos rodado, pero nuestro agente está perdido en la red de catacumbas debajo de la fortaleza de La Orden. He enviado a diez buenos hombres a esos túneles a buscarlo y ninguno ha regresado. ¡Hay algo ahí abajo!","Gracias a Dios, llegaste. Para entrar a la fábrica se necesita una llave; la robamos, pero nuestro agente está perdido en la red de catacumbas debajo de la fortaleza de La Orden. Mandé a diez buenos hombres a esos túneles a buscarlo y ninguno volvió. ¡Hay algo ahí abajo!","Luojan kiitos, että selvisit perille. Päästäksesi sisälle tehtaaseen tarvitset avaimen. Varastimme sen, mutta vakoojamme on eksynyt Veljeskunnan linnakkeen alapuolella sijaitsevaan katakombiverkostoon. Olen lähettänyt tunneleihin 10 kelpoa miestä etsimään häntä, eikä kukaan ole palannut. Jokin on siellä alla!","Merci Dieu, vous êtes là. Pour entrer dans l'usine, il vous faut une clé. On l'a volé, mais notre agent a disparu dans le dédale de catacombes sous la forteresse de l'Ordre. On a envoyé dix hommes dans ces tunnels pour le retrouver mais personne n'est revenu. Il doit y avoir quelque chose, là dedans!","Hála Deusnak, ideértél.Ahhoz, hogy bejuthass a gyárba kell majd egy kulcs. Habár sikerült ellopnunk a kulcsot, az ügynökünk elveszett a katakombák sűrűjében a Rend erődítménye alatt. Leküldtem tíz jó emberemet utána, de egyikük sem tért vissza. Valami borzasztó lehet ott lent!","Grazie a Dio sei arrivato. Per entrare nella fabbrica ti servirà una chiave. L'abbiamo rubata ma l'agente che l'ha presa è sparito nelle catacombe sotto la fortezza dell'Ordine. Ho mandato dieci uomini in quei tunnel a trovarlo, e nessuno è ritornato. C'è qualcosa là sotto!","ようやく来てくれたか。 +MAP23: Richter.",,,"Díky bohu, žes přišel. Aby ses dostal do továrny, potřebuješ klíč. Ten jsme ukradli, ale náš agent se ztratil v sítí katakomb pod pevností Řádu. Poslal jsem do těch tunelů deset dobrých mužů a žádný se nevrátil. Něco tam dole je!","Tak Deus for at du kom her. For at komme ind på fabrikken skal du bruge en nøgle. Vi stjal den, men vores agent er forsvundet i katakomberne under ordenens højborg. Jeg har sendt ti gode mænd ned i disse tunneller for at finde ham, men ingen er vendt tilbage. Der er noget dernede!","Deus sei dank bist du hier. Um die Fabrik zu betreten, brauchst du einen Schlüssel. Wir haben ihn gestohlen, aber unser Agent ist in den Irrwegen der Katakomben unter Festung des Ordens verschwunden. Ich habe zehn gute Männer da hinunter geschickt um ihn zu finden, aber niemand ist zurückgekehrt. Irgendetwas ist da unten!",,"Danke al Dio vi alvenis. Ŝlosilo estas necesa por eniri la fabrikon; ni ŝtelis ĝin, sed nia agento estas perdita en la katakomba sistemo sub la fortreso de La Ordeno. Mi sendis dek bonajn virojn al tiuj tuneloj por serĉi lin kaj neniu revenis. Estas io tie malsupre!","Gracias a Dios, has llegado. Para entrar en la fábrica se necesita una llave; la hemos rodado, pero nuestro agente está perdido en la red de catacumbas debajo de la fortaleza de La Orden. He enviado a diez buenos hombres a esos túneles a buscarlo y ninguno ha regresado. ¡Hay algo ahí abajo!","Gracias a Dios, llegaste. Para entrar a la fábrica se necesita una llave; la robamos, pero nuestro agente está perdido en la red de catacumbas debajo de la fortaleza de La Orden. Mandé a diez buenos hombres a esos túneles a buscarlo y ninguno volvió. ¡Hay algo ahí abajo!","Luojan kiitos, että selvisit perille. Päästäksesi sisälle tehtaaseen tarvitset avaimen. Varastimme sen, mutta vakoojamme on eksynyt Veljeskunnan linnakkeen alapuolella sijaitsevaan katakombiverkostoon. Olen lähettänyt tunneleihin 10 kelpoa miestä etsimään häntä, eikä kukaan ole palannut. Jokin on siellä alla!","Merci Dieu, vous êtes là. Pour entrer dans l'usine, il vous faut une clé. On l'a volé, mais notre agent a disparu dans le dédale de catacombes sous la forteresse de l'Ordre. On a envoyé dix hommes dans ces tunnels pour le retrouver mais personne n'est revenu. Il doit y avoir quelque chose, là dedans!",,"Hála Deusnak, ideértél.Ahhoz, hogy bejuthass a gyárba kell majd egy kulcs. Habár sikerült ellopnunk a kulcsot, az ügynökünk elveszett a katakombák sűrűjében a Rend erődítménye alatt. Leküldtem tíz jó emberemet utána, de egyikük sem tért vissza. Valami borzasztó lehet ott lent!","Grazie a Dio sei arrivato. Per entrare nella fabbrica ti servirà una chiave. L'abbiamo rubata ma l'agente che l'ha presa è sparito nelle catacombe sotto la fortezza dell'Ordine. Ho mandato dieci uomini in quei tunnel a trovarlo, e nessuno è ritornato. C'è qualcosa là sotto!","ようやく来てくれたか。 工場に入るためには鍵が必要だ。 鍵は盗んだのだが、我々の密偵が砦地下にある 地下墓所で行方不明になった。 彼を探すため10名派遣したのだが、 誰一人帰ってこなかった。 地下墓地で何か異変が起こっているに違いない。","데우스님 감사합니다, 지원군이 왔군! 공장에 들어가려면 열쇠가 필요합니다. 그 열쇠를 가진 한 요원이 오더의 요새가 있는 고대 무덤에서 길을 잃었습니다. 지원군 10 명을 보내긴 했으나 돌아오지 못했습니다. 그곳에 무언가가 있는 것 같아요!","Bedankt deus dat je hier bent gekomen. Om de fabriek binnen te komen heb je een sleutel nodig. We hebben het gestolen maar onze agent ontbreekt in het web van de catacomben onder het bolwerk van de Orde. Ik heb tien goede mannen in die tunnels gestuurd om hem te vinden, en niemand is teruggekomen. Er is daar beneden iets!","Takk Gud for at du kom hit. For å komme inn i fabrikken trenger du en nøkkel. Vi stjal den, men agenten vår er forsvunnet i katakombene under Ordenens festning. Jeg har sendt ti gode menn ned i tunnelene for å finne ham, men ingen har kommet tilbake. Det er noe der nede!","Dzięki Deusowi, że tu trafiłeś. Aby wejść do fabryki potrzebny jest klucz. Ukradliśmy go, ale nasz agent zaginął w sieci katakumb pod twierdzą Zakonu. Wysłałem dziesięciu dobrych ludzi do tych tuneli, by go znaleźli, ale żaden nie wrócił. Coś jest tam na dole!",Graças a Deus que você está aqui. Para entrar na fábrica você precisa de uma chave. Nós a roubamos mas nosso agente desapareceu na rede de catacumbas debaixo da fortaleza da Ordem. Mandei dez homens capazes pra dentro desses túneis para encontrá-lo e ninguém retornou. Tem alguma coisa lá embaixo!,,"Slavă Domnului că ești aici. Ca să intri în fabrică ai nevoie de o cheie. Am furat-o dar agentul nostru a dispărut în rețeaua catacombelor fortăreței Ordinului. Am trimis zece oameni pricepuți după el, dar niciunul nu s-a întors. Ceva se întâmplă acolo!","Хвала господу, ты добрался сюда. Тебе нужен ключ, чтобы проникнуть на фабрику. Мы выкрали его, но наш агент пропал в сети катакомб под крепостью Ордена. Чтобы разыскать его, я послал в эти туннели десять хороших бойцов, и ни один не вернулся. Там внизу что-то есть!",,"Tacka Deus för att du kom hit. För att komma in i fabriken behöver du en nyckel. Vi stal den, men vår agent saknas i katakomberna under Ordensfästet. Jag har skickat tio goda män in i tunnlarna för att hitta honom, men ingen har återvänt. Något finns där nere!",Buraya geldiğin için Deus'a şükret. Fabrikaya girmek için bir anahtara ihtiyacınız var. Onu çaldık ama ajanımız Tarikat'ın kalesinin altındaki yeraltı mezarlarında kayıp. Onu bulmaları için o tünellere on iyi adam gönderdim ama hiçbiri geri dönmedi. Aşağıda bir şey var! -What is it? Human or... ?,TXT_RPLY0_SCRIPT23_D24256_WHATI,〃,,,"Co to je? Člověk, nebo...?",Hvad er det? Menneske eller... ?,Was ist es? Mensch oder...?,,Kia ĝi estas? Ĉu homa aŭ...?,"¿Qué es?, ¿humano o...?",,Mikä se on? Ihminen vai...,"Qu'est-ce que c'est? Un humain, où...",Mi lehet? Ember vagy...?,Che cosa è? Umano o... ?,それは一体?人間か...?,이게 뭐지? 사람? 아니면... ?,Wat is het? Menselijk of.... ?,Hva er det? Menneskelig eller... ?,Co to jest? Człowiek czy... ?,O que é? É humano ou... ?,,Ce e? Uman sau... ?,Что это? Человек или...?,,Vad är det? Människor eller... ?,Ne var orada? İnsan mı yoksa... ? -"Not. Definitely not. Whatever it is, you must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the factory is next to the mines. Hurry, each second counts.",TXT_DLG_SCRIPT23_D25772_NOTDE,〃,,,"Ne. Rozhodně ne. Ať je to cokoliv, musíš se s tím utkat, abys získal ten klíč zpět. Otevřu ti vchod do katakomb. Až ho budeš mít, továrna je vedle dolů. Pospěš si, každá vteřina se počítá.","Nej. Helt sikkert ikke. Uanset hvad det er, skal du kæmpe mod det for at få nøglen tilbage. Jeg åbner katakombernes indgang. Når du har fået den, er fabrikken ved siden af minerne. Skynd dig, hvert sekund tæller.","Nein. Definitiv nicht. Was auch immer es ist, du musst es bekämpfen, um an den Schlüssel zu kommen. Ich werde den Eingang zu den Katakomben öffnen. Wenn du ihn hast, die Fabrik ist direkt neben den Minen. Beeil dich, jede Sekunde zählt.",,"Ne, neniel. Tio ajn, kio ĝi estas, vi devas batali kontraŭ ĝi por rekuperi la ŝlosilon. Farinte tion, la fabriko estas flanke de la minejo. Hastu, ĉiu sekundo estas gravega.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; abriré la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Date prisa, que cada segundo cuenta.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; voy a abrir la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Apúrate, que cada segundo cuenta.","Ei, ei varmana. Mikä ikinä se onkaan, sinun on kohdattava se noutaaksesi avaimen. Avaan katakombien sisäänkäynnin. Kun se on hallussasi, tehdas on kaivoksen vieressä. Pidä kiirettä, jokainen sekunti merkitsee.","Non, absolument pas. Je ne sais pas ce que c'est, mais il faudra s'en débarasser pour récupérer la clé. Je vais ouvrir l'entrée des catacombes. Quand vous êtes à l'intérieur, l'usine est près des ruines. Vite, chaque seconde compte.","Nem. Biztos, hogy nem. Akármi is az, meg kell majd küzdened vele a kulcsért. Kinyitom a katakomba bejáratát. Ha megszerezted, a gyár ott lesz a bánya mellett. Siess, minden másodperc számít.","No. Sicuramente no. Qualsiasi cosa sia, dovrai lottare per riavere la chiave. Adesso aprirò l'entrata per le catacombe. Quando avrai ripreso la chiave, potrai accedere alla fabbrica, che si trova accanto alle miniere. Sbrigati, ogni secondo può fare la differenza.","いや。人間の仕業だとはとても思えない。 +What is it? Human or... ?,TXT_RPLY0_SCRIPT23_D24256_WHATI,〃,,,"Co to je? Člověk, nebo...?",Hvad er det? Menneske eller... ?,Was ist es? Mensch oder...?,,Kia ĝi estas? Ĉu homa aŭ...?,"¿Qué es?, ¿humano o...?",,Mikä se on? Ihminen vai...,"Qu'est-ce que c'est? Un humain, où...",,Mi lehet? Ember vagy...?,Che cosa è? Umano o... ?,それは一体?人間か...?,이게 뭐지? 사람? 아니면... ?,Wat is het? Menselijk of.... ?,Hva er det? Menneskelig eller... ?,Co to jest? Człowiek czy... ?,O que é? É humano ou... ?,,Ce e? Uman sau... ?,Что это? Человек или...?,,Vad är det? Människor eller... ?,Ne var orada? İnsan mı yoksa... ? +"Not. Definitely not. Whatever it is, you must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the factory is next to the mines. Hurry, each second counts.",TXT_DLG_SCRIPT23_D25772_NOTDE,〃,,,"Ne. Rozhodně ne. Ať je to cokoliv, musíš se s tím utkat, abys získal ten klíč zpět. Otevřu ti vchod do katakomb. Až ho budeš mít, továrna je vedle dolů. Pospěš si, každá vteřina se počítá.","Nej. Helt sikkert ikke. Uanset hvad det er, skal du kæmpe mod det for at få nøglen tilbage. Jeg åbner katakombernes indgang. Når du har fået den, er fabrikken ved siden af minerne. Skynd dig, hvert sekund tæller.","Nein. Definitiv nicht. Was auch immer es ist, du musst es bekämpfen, um an den Schlüssel zu kommen. Ich werde den Eingang zu den Katakomben öffnen. Wenn du ihn hast, die Fabrik ist direkt neben den Minen. Beeil dich, jede Sekunde zählt.",,"Ne, neniel. Tio ajn, kio ĝi estas, vi devas batali kontraŭ ĝi por rekuperi la ŝlosilon. Farinte tion, la fabriko estas flanke de la minejo. Hastu, ĉiu sekundo estas gravega.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; abriré la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Date prisa, que cada segundo cuenta.","No, definitivamente no. Sea lo que sea, debes pelear contra eso para recuperar la llave; voy a abrir la entrada a las catacumbas. Cuando la tengas, la fábrica está junto a la mina. Apúrate, que cada segundo cuenta.","Ei, ei varmana. Mikä ikinä se onkaan, sinun on kohdattava se noutaaksesi avaimen. Avaan katakombien sisäänkäynnin. Kun se on hallussasi, tehdas on kaivoksen vieressä. Pidä kiirettä, jokainen sekunti merkitsee.","Non, absolument pas. Je ne sais pas ce que c'est, mais il faudra s'en débarasser pour récupérer la clé. Je vais ouvrir l'entrée des catacombes. Quand vous êtes à l'intérieur, l'usine est près des ruines. Vite, chaque seconde compte.",,"Nem. Biztos, hogy nem. Akármi is az, meg kell majd küzdened vele a kulcsért. Kinyitom a katakomba bejáratát. Ha megszerezted, a gyár ott lesz a bánya mellett. Siess, minden másodperc számít.","No. Sicuramente no. Qualsiasi cosa sia, dovrai lottare per riavere la chiave. Adesso aprirò l'entrata per le catacombe. Quando avrai ripreso la chiave, potrai accedere alla fabbrica, che si trova accanto alle miniere. Sbrigati, ogni secondo può fare la differenza.","いや。人間の仕業だとはとても思えない。 それが何であれ君は鍵を取り戻せ。 地下墓所への入り口は開けておこう。 鍵を手に入れたら、工場は採掘所の隣にある。 時間はあまり無いから急ぐのだ。","아냐. 사람 같은 건 절대로 아니라고. 그게 무엇이든, 당신은 어떻게든 싸워서 열쇠를 돌려받아야 합니다. 고대 무덤의 입구를 열어두겠습니다. 만약 열쇠를 얻으셨다면, 광산 옆에 있는 공장으로 향하시길 바랍니다. 시간이 얼마 남지 않았습니다!","Niet. Zeker niet. Wat het ook is, je moet ertegen vechten om de sleutel terug te krijgen. Ik zal de ingang van de catacomben openen. Als je hem hebt, staat de fabriek naast de mijnen. Schiet op, elke seconde telt.","Nei. Definitivt ikke. Uansett hva det er, må du kjempe mot det for å få tak i nøkkelen. Jeg åpner inngangen til katakombene. Når du har den, er fabrikken ved siden av gruvene. Skynd deg, hvert sekund teller.","Nie. Zdecydowanie nie. Cokolwiek to jest, musisz z tym walczyć, aby odzyskać klucz. Ja otworzę wejście do katakumb. Gdy go zdobędziesz, fabryka jest obok kopalni. Spiesz się, liczy się każda sekunda.","Não. Definitivamente não é. Seja lá o que for, você deve enfrentá-lo para recuperar a chave. Vou abrir a entrada das catacumbas. Quando você pegar a chave, vá para a fábrica próxima às minas. Depressa, cada segundo é importante.",,"Nu. Cu siguranță nu. Orice ar fi, va trebui să o înfrunți pentru a recupera cheia. Voi deschide intrarea catacombelor. Când o ai, fabrica e vizavi de mine. Grăbește-te, orice secundă contează.","Нет. Определённо нет. Что бы это ни было, ты должен сразиться с ним, чтобы заполучить ключ. Я открою вход в катакомбы. Когда добудешь его, направляйся на фабрику: она находится рядом со входом в шахты. Торопись! Дорога каждая секунда!",,"Inte. Definitivt inte. Vad det än är måste du slåss mot det för att få tag på nyckeln. Jag öppnar katakombernas ingång. När du har fått den är fabriken bredvid gruvorna. Skynda dig, varje sekund räknas.","İnsan değil. Kesinlikle değil. O her neyse, anahtarı almak için onunla savaşmalısın. Yeraltı mezarlarının girişini açacağım. Anahtarı aldığında, fabrika madenlerin yanında. Acele et, her saniye önemli." -"Something inhuman, eh?, great.",TXT_RPLY0_SCRIPT23_D25772_SOMET,〃,,,"Něco nelidského, co? Skvělý.","Noget umenneskeligt, hva'?, fantastisk.",Irgendetwas unmenschliches? Na großartig.,,"Nehomaĵo, ĉu? Bonege.","Algo inhumano, ¿eh? Genial.",,"Jotain epäinhimillistä, vai? Hienoa.","Quelque chose d'inhumain, hein? Parfait.","Valami nem emberi, mi? Csodás.","Qualcosa di inumano, eh? Fantastico.",非人道的な何か?流石だな。,비인간적인 녀석인가요? 좋군요.,"Iets onmenselijks, eh?, geweldig.","Noe umenneskelig, hva? Flott!","Coś nieludzkiego, ech, świetnie.","Algo não-humano, é? Que ótimo.",,"Ceva inuman, ei? Grozav.",Что-то иное? Просто отлично.,,"Något omänskligt, va?, bra.","İnsanlık dışı bir şey, ha? Harika." -You're wasting time and lives! Move!,TXT_DLG_SCRIPT23_D27288_YOURE,〃,,,Plýtváš časem i životy! Jdi!,Du spilder tid og liv! Af sted!,Du verschwendest Zeit und Leben! Beweg dich!,,Vi perdas tempon kaj vivojn! Agu!,¡Estás perdiendo tiempo y vidas! ¡Muévete!,,Haaskaat aikaa ja henkiä! Liikkuu jo!,Vous perdez votre temps et des vies! Bougez!,Időt és életeket pazarolsz! Mozgás!,"Stai sprecando tempo, e vite. Sbrigati!","こうしてる間にも君は時間と人命を +"Something inhuman, eh?, great.",TXT_RPLY0_SCRIPT23_D25772_SOMET,〃,,,"Něco nelidského, co? Skvělý.","Noget umenneskeligt, hva'?, fantastisk.",Irgendetwas unmenschliches? Na großartig.,,"Nehomaĵo, ĉu? Bonege.","Algo inhumano, ¿eh? Genial.",,"Jotain epäinhimillistä, vai? Hienoa.","Quelque chose d'inhumain, hein? Parfait.",,"Valami nem emberi, mi? Csodás.","Qualcosa di inumano, eh? Fantastico.",非人道的な何か?流石だな。,비인간적인 녀석인가요? 좋군요.,"Iets onmenselijks, eh?, geweldig.","Noe umenneskelig, hva? Flott!","Coś nieludzkiego, ech, świetnie.","Algo não-humano, é? Que ótimo.",,"Ceva inuman, ei? Grozav.",Что-то иное? Просто отлично.,,"Något omänskligt, va?, bra.","İnsanlık dışı bir şey, ha? Harika." +You're wasting time and lives! Move!,TXT_DLG_SCRIPT23_D27288_YOURE,〃,,,Plýtváš časem i životy! Jdi!,Du spilder tid og liv! Af sted!,Du verschwendest Zeit und Leben! Beweg dich!,,Vi perdas tempon kaj vivojn! Agu!,¡Estás perdiendo tiempo y vidas! ¡Muévete!,,Haaskaat aikaa ja henkiä! Liikkuu jo!,Vous perdez votre temps et des vies! Bougez!,,Időt és életeket pazarolsz! Mozgás!,"Stai sprecando tempo, e vite. Sbrigati!","こうしてる間にも君は時間と人命を 無駄にしている。行け!",시간과 생명이 위협받고 있다고! 서두르세요!!,Je verspilt tijd en levens! Vooruit!,Du kaster bort tid og liv! Skynd dere!,Marnujesz czas i życie! Ruszać się!,Você está desperdiçando tempo e vidas! Ande logo!,,"Pierzi timp și vieți, mișcă-te!",Ты тратишь время и жизни! Вперёд!,,Du slösar bort tid och liv! Flytta på dig!,Zamanınızı ve hayatlarınızı boşa harcıyorsunuz! Çekilin! -"The master doesn't like visitors. He likes all of his work to remain undisturbed. I've got to go get fresh parts from the storage room. I think he said a leg and an arm. Oh, well no time to talk anymore. I'd leave before he finds you.",TXT_DLG_SCRIPT27_D0_THEMA,MAP27: Peasant → Northeastern room (after the lift).,,,"Pán nemá rád návštěvy. Má rád, když ho nic neruší od práce. Musím dojít pro čerstvé části ze skladu. Myslím, že chtěl nohu a ruku. Tak, na mluvení není čas. Být tebou, odešel bych dřív, než tě najde.","Mesteren kan ikke lide besøgende. Han kan lide, at alt hans arbejde forbliver uforstyrret. Jeg skal hente nye dele fra lagerrummet. Jeg tror, han sagde et ben og en arm. Nå, men vi har ikke tid til at snakke mere. Jeg ville gå, før han finder dig.","Der Meister mag keine Besucher. Er hat es gern, wenn er bei der Arbeit nicht gestört wird. Ich muss gehen und neue Teile aus dem Lagerraum holen. Ich glaube er sagte ein Bein und eine Arm. Naja, keine Zeit mehr zum Reden. Du solltest gehen, bevor er dich findet.",,"La majstro ne ŝatas vizitantojn; li ŝatas, ke ĉiu laboro estu seninterrompa. Mi devas serĉi freŝajn partojn en la deponejo: kruron kaj brakon laŭ tio, kion mi memoras. Ho, bone, ne estas tempo paroli. Se mi estus vi, mi forirus por ne esti trovita.","Al maestro no le gustan las visitas; le gusta que su trabajo permanezca ininterrumpido. Tengo que ir a buscar partes frescas al almacén: una pierna y un brazo, creo que ha dicho. Ah, bueno, no hay tiempo para hablar. Yo que tú me iría antes de que te encuentre.","Al maestro no le gustan las visitas; le gusta que su trabajo permanezca ininterrumpido. Tengo que ir a buscar partes frescas al almacén: una pierna y un brazo, creo que dijo. Ah, bueno, no hay tiempo para hablar. Yo que tú me iría antes de que te encuentre.","Mestari ei pidä vieraista. Hän haluaa kaikkien töittensä säilyä koskemattomina. Minun on mentävä noutamaan tuoreita osia varastosta. Hän taisi puhua jalasta ja käsivarresta. No, ei enempää aikaa puhua. Sinuna lähtisin, ennen kuin hän löytää sinut.","Le Maître n'aime pas les visiteurs. Il préfère que son travail se déroule dans le calme. Il faut que j'aille chercher des pièces dans la salle de stockage. Il m'a demandé une jambe et un bras, je crois. Bon, plus de temps pour parler. Je partirais si j'étais vous.","A gazda nem szereti a látogatókat. Úgy szereti, ha nem zavarja senki a munkájában. Mennem kell új darabokért a tárolóba. Azt hiszem egy lábat és egy kart említett. Hát, sajnos nincs időm beszélgetni már. A helyedben elmennék, mielőtt megtalál.","Al padrone non piacciono i visitatori. Vuole che tutto il suo lavoro rimanga indisturbato. Ho qua le parti nuove dal magazzino. Mi pare abbia detto una gamba e un braccio. Ah, non ho più tempo per parlare. Io me ne andrei prima che si accorga che tu sei qui.","マスターは訪問者ヲ嫌っている。 +"The master doesn't like visitors. He likes all of his work to remain undisturbed. I've got to go get fresh parts from the storage room. I think he said a leg and an arm. Oh, well no time to talk anymore. I'd leave before he finds you.",TXT_DLG_SCRIPT27_D0_THEMA,MAP27: Peasant → Northeastern room (after the lift).,,,"Pán nemá rád návštěvy. Má rád, když ho nic neruší od práce. Musím dojít pro čerstvé části ze skladu. Myslím, že chtěl nohu a ruku. Tak, na mluvení není čas. Být tebou, odešel bych dřív, než tě najde.","Mesteren kan ikke lide besøgende. Han kan lide, at alt hans arbejde forbliver uforstyrret. Jeg skal hente nye dele fra lagerrummet. Jeg tror, han sagde et ben og en arm. Nå, men vi har ikke tid til at snakke mere. Jeg ville gå, før han finder dig.","Der Meister mag keine Besucher. Er hat es gern, wenn er bei der Arbeit nicht gestört wird. Ich muss gehen und neue Teile aus dem Lagerraum holen. Ich glaube er sagte ein Bein und eine Arm. Naja, keine Zeit mehr zum Reden. Du solltest gehen, bevor er dich findet.",,"La majstro ne ŝatas vizitantojn; li ŝatas, ke ĉiu laboro estu seninterrompa. Mi devas serĉi freŝajn partojn en la deponejo: kruron kaj brakon laŭ tio, kion mi memoras. Ho, bone, ne estas tempo paroli. Se mi estus vi, mi forirus por ne esti trovita.","Al maestro no le gustan las visitas; le gusta que su trabajo permanezca ininterrumpido. Tengo que ir a buscar partes frescas al almacén: una pierna y un brazo, creo que ha dicho. Ah, bueno, no hay tiempo para hablar. Yo que tú me iría antes de que te encuentre.","Al maestro no le gustan las visitas; le gusta que su trabajo permanezca ininterrumpido. Tengo que ir a buscar partes frescas al almacén: una pierna y un brazo, creo que dijo. Ah, bueno, no hay tiempo para hablar. Yo que tú me iría antes de que te encuentre.","Mestari ei pidä vieraista. Hän haluaa kaikkien töittensä säilyä koskemattomina. Minun on mentävä noutamaan tuoreita osia varastosta. Hän taisi puhua jalasta ja käsivarresta. No, ei enempää aikaa puhua. Sinuna lähtisin, ennen kuin hän löytää sinut.","Le Maître n'aime pas les visiteurs. Il préfère que son travail se déroule dans le calme. Il faut que j'aille chercher des pièces dans la salle de stockage. Il m'a demandé une jambe et un bras, je crois. Bon, plus de temps pour parler. Je partirais si j'étais vous.",,"A gazda nem szereti a látogatókat. Úgy szereti, ha nem zavarja senki a munkájában. Mennem kell új darabokért a tárolóba. Azt hiszem egy lábat és egy kart említett. Hát, sajnos nincs időm beszélgetni már. A helyedben elmennék, mielőtt megtalál.","Al padrone non piacciono i visitatori. Vuole che tutto il suo lavoro rimanga indisturbato. Ho qua le parti nuove dal magazzino. Mi pare abbia detto una gamba e un braccio. Ah, non ho più tempo per parlare. Io me ne andrei prima che si accorga che tu sei qui.","マスターは訪問者ヲ嫌っている。 彼ハ自分ノ仕事ヲ邪魔されないノガ良いからダ。 私ハこれカラ倉庫に新品の部品を取りに行かねば 腕と足だったカナ。オット、モウ話ス時間ハ無イ マスターが君を見つける前ニ出発しなけれバ。","주인님은 방문자들을 싫어해. 반대로 그는 남들의 방해 없이 혼자서 일을 하는 걸 아주 좋아하지. 저장고에서 재료를 꺼내서 가져다주는 나 같은 사람들을 제외하면. 한 쌍의 팔다리가 필요하다고 들었는데... 오, 이런. 이제 이야기할 시간도 없어졌네. 그가 널 찾기 전에 도망치는 게 좋을걸?","De meester houdt niet van bezoekers. Hij houdt ervan dat al zijn werk ongestoord blijft. Ik moet verse onderdelen uit de opslagruimte halen. Ik denk dat hij een been en een arm zei. Oh, nou geen tijd meer om te praten. Ik zou weggaan voordat hij je vindt.",Mesteren liker ikke besøkende. Han vil ha arbeidet sitt uforstyrret. Jeg må gå og hente nye deler fra lageret. Jeg tror han sa et bein og en arm. Jeg har ikke tid til å prate mer. Jeg ville dratt før han finner deg.,"Mistrz nie lubi gości. Lubi, gdy cała jego praca pozostaje niezakłócona. Muszę iść po świeże części z magazynu. Chyba powiedział noga i ręka. Nie ma czasu na gadanie. Wyszedłbym, zanim cię znajdzie.","O mestre não gosta de visitantes. Ele gosta que seu trabalho não seja perturbado. Tenho que ir buscar peças novas no depósito. Bom, não tenho mais tempo para conversa. Eu iria embora antes que ele te ache.",,"Stăpânului nu îi plac vizitatorii. Îi place ca toată muncă să fie nederanjată. Trebuie să aduc părți noi din depozit. Cred că a zis un braț și un picior. Of, nu mai e timp de vorbă. O să plec înainte să te găsească.","Хранитель не любит гостей — он предпочитает, чтобы его никто не отвлекал от работы. Он послал меня на склад за свежими частями. Рукой и ногой, кажется... Ох, нет времени на разговоры. Лучше бы тебе уйти, пока он не вернулся.",,Mästaren gillar inte besökare. Han vill att allt arbete ska förbli ostört. Jag måste hämta nya delar från lagret. Jag tror att han sa ett ben och en arm. Vi har inte tid att prata längre. Jag skulle gå innan han hittar dig.,Efendi ziyaretçileri sevmez. Tüm çalışmalarının rahatsız edilmeden kalmasını ister. Gidip depodan yeni parçalar almalıyım. Sanırım bir bacak ve bir kol dedi. Artık konuşacak vakit yok. Ben olsam o seni bulmadan giderdim. -Why's that.,TXT_RPLY0_SCRIPT27_D0_WHYST,〃,,,A proč?,Hvorfor det?,Wieo das?,,Kial mi forirus?,¿Irme por qué?,,Miksi?,Pourquoi donc?,Miért tennék olyat?,E perché mai?,何故そんなことを。,그건 왜지?,Waarom is dat.,Hvorfor det?,Dlaczego tak jest?,Por quê?,,De ce.,Почему так?,,Varför det?,Nedenmiş o? +Why's that.,TXT_RPLY0_SCRIPT27_D0_WHYST,〃,,,A proč?,Hvorfor det?,Wieo das?,,Kial mi forirus?,¿Irme por qué?,,Miksi?,Pourquoi donc?,,Miért tennék olyat?,E perché mai?,何故そんなことを。,그건 왜지?,Waarom is dat.,Hvorfor det?,Dlaczego tak jest?,Por quê?,,De ce.,Почему так?,,Varför det?,Nedenmiş o? "Because, I told you he doesn't like visitors!",TXT_RYES0_SCRIPT27_D0_BECAU,〃,,,"Protože, jak už jsem řekl, nemá rád návštěvy!","Fordi jeg sagde jo, at han ikke kan lide besøgende!","Ich habe dir doch gesagt, dass er keine Besucher mag!",,"Mi diris, ke li ne ŝatas vizitantojn!","¡He dicho que no le gustan las visitas!","¡Te estoy diciendo que -no le gustan las visitas!","Koska minähän sanoin, ettei hän pidä vieraista!","Je vous ai dit, il n'aime pas les visiteurs!","Most mondtam, hogy nem szereti a látogatókat!","Perché, come ti ho appena detto, non gli piacciono i visitatori!",ナゼなら、マスターは訪問されたくナイからダ!,"왜냐하면, 그가 방문자들을 싫어한다고 내가 말했으니까!","Omdat hij niet van bezoekers houdt, zei ik toch!",Jeg sa jo at han ikke liker besøk!,"Bo mówiłem ci, że nie lubi gości!","Porque, como eu já te falei, ele não gosta de visitantes!",,"Pentru că, ți-am spus, nu-i plac vizitatorii!","Потому что, как я уже сказал тебе, он не любит посетителей!",,För att jag sa ju att han inte gillar besökare!,Çünkü sana ziyaretçileri sevmediğini söylemiştim! -"You know, you're about the right size for one of the acolyte's uniforms.",TXT_DLG_SCRIPT27_D1516_YOUKN,〃,,,"Hele, ty vypadáš, že by ti dobře sedla unforma akolytů.",Du har den rette størrelse til en af acolyternes uniformer.,"Weißt du, du hast genau die richtige Größe für die Uniform eines Missionars.",,"Interese, vi havas la ĝustan talion por surhavi akolitan uniformon.",¿Sabes? Tienes la talla justa para alguno de los uniformes de acólito.,¿Sabes? Tienes el talle justo para alguno de los uniformes de acólito.,"Hei kuules, olet suurin piirtein sopivan kokoinen akoluutin univormuun.","Vous savez, vous avez juste la taille qu'il faut pour un uniforme d'acolyte.","Tudod-e, hogy ránézésre pont jó rád a ministráns egyenruha.","Sai che ti dico, sei proprio della taglia perfetta per una delle uniforme degli accoliti.","知ッテるハズだ、アンタに合う +no le gustan las visitas!","Koska minähän sanoin, ettei hän pidä vieraista!","Je vous ai dit, il n'aime pas les visiteurs!",,"Most mondtam, hogy nem szereti a látogatókat!","Perché, come ti ho appena detto, non gli piacciono i visitatori!",ナゼなら、マスターは訪問されたくナイからダ!,"왜냐하면, 그가 방문자들을 싫어한다고 내가 말했으니까!","Omdat hij niet van bezoekers houdt, zei ik toch!",Jeg sa jo at han ikke liker besøk!,"Bo mówiłem ci, że nie lubi gości!","Porque, como eu já te falei, ele não gosta de visitantes!",,"Pentru că, ți-am spus, nu-i plac vizitatorii!","Потому что, как я уже сказал тебе, он не любит посетителей!",,För att jag sa ju att han inte gillar besökare!,Çünkü sana ziyaretçileri sevmediğini söylemiştim! +"You know, you're about the right size for one of the acolyte's uniforms.",TXT_DLG_SCRIPT27_D1516_YOUKN,〃,,,"Hele, ty vypadáš, že by ti dobře sedla unforma akolytů.",Du har den rette størrelse til en af acolyternes uniformer.,"Weißt du, du hast genau die richtige Größe für die Uniform eines Missionars.",,"Interese, vi havas la ĝustan talion por surhavi akolitan uniformon.",¿Sabes? Tienes la talla justa para alguno de los uniformes de acólito.,¿Sabes? Tienes el talle justo para alguno de los uniformes de acólito.,"Hei kuules, olet suurin piirtein sopivan kokoinen akoluutin univormuun.","Vous savez, vous avez juste la taille qu'il faut pour un uniforme d'acolyte.",,"Tudod-e, hogy ránézésre pont jó rád a ministráns egyenruha.","Sai che ti dico, sei proprio della taglia perfetta per una delle uniforme degli accoliti.","知ッテるハズだ、アンタに合う アコライトの制服一着のサイズについてサ。","어디보자... 당신의 치수, 경비 전투복 크기에 적당히 딱 맞는 것 같군!","Weet je, je bent ongeveer de juiste maat voor een van de uniformen van de acoliet.","Vet du, du har omtrent riktig størrelse for en av akolyttenes uniformer.","Wiesz, masz odpowiedni rozmiar na jeden z mundurków akolitów.","Sabe, você tem a altura perfeita para um dos uniformes de acólito.",,"Știi, eși marimea potrivită pentru o uniformă de acolit.","Знаешь, тебе бы как раз впору пошла униформа служителя.",,"Du vet, du är ungefär rätt storlek för en av akolyternas uniformer.","Biliyor musun, yardımcı üniformalarından biri için doğru bedensin." -"Oh no, I'm not the real Programmer, he's hiding. Continue past the guard training area, very tough. If you survive, you might be able to talk to him. Or kill him.",TXT_DLG_SCRIPT31_D0_OHNOI,MAP31: Programmer.,,,"Kdepak, já nejsem skutečný Programátor. Ten se schovává. Ale pokračuj skrz tréninkovou oblast, je velmi obtížná. Jestli přežiješ, mohl by sis s ním i promluvit. Nebo ho zabít.","Åh nej, jeg er ikke den rigtige programmør. Han gemmer sig. Fortsæt forbi vagttræningsområdet, meget hårdt. Hvis du overlever, kan du måske tale med ham. Eller slå ham ihjel.","O nein, ich bin nicht der echte Programmierer. Er versteckt sich. Ich glaube irgendwo jenseits des Trainingsbereichs für die Wächter. verdammt schwierig. Wenn du überlebst könntest du in finden. Oder töten.",,"Ha ha! Ne, mi ne estas la Programisto; la reala estas kaŝita. Daŭrigu trans la trejnejo por gardistoj; tre malfacila. Se vi supervivos, vi eble povos paroli kun li... aŭ mortigi lin.","¡Je, je! No, no soy el Programador; el verdadero está escondido. Continúa a traves del área de entrenamiento de guardias; muy difícil. Si sobrevives, tal vez puedas hablar con él... o matarlo.",,"Ehei, en ole oikea Ohjelmoitsija; hän piilottelee. Jatka vartijoiden koulutusalueen läpi; tulee olemaan haastavaa. Jos selviydyt, saatat ehkä pystyä puhumaan hänen kanssaan; tai tappaa hänet.","Oh non, je ne suis pas le vrai Programmeur. Il se cache. Continuez après la zone d'entraînement des gardes. C'est dangereux, mais si vous y arrivez, vous devriez pouvoir lui parler.. Ou le tuer.","Oh dehogy, nem Én vagyok az igazi Programozó, Ő most elbújt. Ha túléled az őrképző részleget, akkor rögtön utána megtalálod őt. Vagy éppen meg is ölheted.","Oh no, io non sono il vero Programmatore, lui si sta nascondendo. Procedi oltre l'area di addestramento delle guardie, molto tosta. Se sopravvivi, potresti riuscire a parlargli. O magari ad ucciderlo.","イヤイヤ、私ハ真ノプログラマーではない、 +"Oh no, I'm not the real Programmer, he's hiding. Continue past the guard training area, very tough. If you survive, you might be able to talk to him. Or kill him.",TXT_DLG_SCRIPT31_D0_OHNOI,MAP31: Programmer.,,,"Kdepak, já nejsem skutečný Programátor. Ten se schovává. Ale pokračuj skrz tréninkovou oblast, je velmi obtížná. Jestli přežiješ, mohl by sis s ním i promluvit. Nebo ho zabít.","Åh nej, jeg er ikke den rigtige programmør. Han gemmer sig. Fortsæt forbi vagttræningsområdet, meget hårdt. Hvis du overlever, kan du måske tale med ham. Eller slå ham ihjel.","O nein, ich bin nicht der echte Programmierer. Er versteckt sich. Ich glaube irgendwo jenseits des Trainingsbereichs für die Wächter. verdammt schwierig. Wenn du überlebst könntest du in finden. Oder töten.",,"Ha ha! Ne, mi ne estas la Programisto; la reala estas kaŝita. Daŭrigu trans la trejnejo por gardistoj; tre malfacila. Se vi supervivos, vi eble povos paroli kun li... aŭ mortigi lin.","¡Je, je! No, no soy el Programador; el verdadero está escondido. Continúa a traves del área de entrenamiento de guardias; muy difícil. Si sobrevives, tal vez puedas hablar con él... o matarlo.",,"Ehei, en ole oikea Ohjelmoitsija; hän piilottelee. Jatka vartijoiden koulutusalueen läpi; tulee olemaan haastavaa. Jos selviydyt, saatat ehkä pystyä puhumaan hänen kanssaan; tai tappaa hänet.","Oh non, je ne suis pas le vrai Programmeur. Il se cache. Continuez après la zone d'entraînement des gardes. C'est dangereux, mais si vous y arrivez, vous devriez pouvoir lui parler.. Ou le tuer.",,"Oh dehogy, nem Én vagyok az igazi Programozó, Ő most elbújt. Ha túléled az őrképző részleget, akkor rögtön utána megtalálod őt. Vagy éppen meg is ölheted.","Oh no, io non sono il vero Programmatore, lui si sta nascondendo. Procedi oltre l'area di addestramento delle guardie, molto tosta. Se sopravvivi, potresti riuscire a parlargli. O magari ad ucciderlo.","イヤイヤ、私ハ真ノプログラマーではない、 彼ハ隠れている。非常ニタフなガードノ 訓練場にダ、もし生き残れたら会えるだろう 或いハ彼を殺せるだろう。","하하. 아, 난 프로그래머님이 아니야. 그는 지금 숨고 있어. 경비 훈련소를 한번 체험해봐. 어렵겠지만, 한번 통과하면 너에게 말을 걸어줄지도 몰라. 아니면 널 죽이던가! \cy내가 사람들 죽이는 걸 지겨워할 것 같지만, 이 일이 모두 끝나면 아마 그리워할 거야.","Oh nee, ik ben niet de echte programmeur, hij verstopt zich. Ga verder langs de bewakingsopleiding, heel moeilijk. Als je het overleeft, kun je misschien met hem praten. Of dood hem.","Å nei, jeg er ikke den ekte programmereren. Han gjemmer seg. Fortsett forbi vaktenes treningsområde, veldig tøft. Hvis du overlever, kan du kanskje snakke med ham. Eller drepe ham.","O nie, nie jestem prawdziwym Programistą, on się ukrywa. Kontynuuj obok obszaru szkolenia strażników, bardzo trudnego. Jeśli przeżyjesz, może uda ci się z nim porozmawiać. Albo go zabić.","Ah não, eu não sou o verdadeiro Programador. Ele está escondido. Continue pela área de treinamento de guardas. É bem difícil. Se você sobreviver, talvez você possa falar com ele. Ou matar ele.",,"Oh nu, nu sunt adevăratul Programator. Continuă până dincolo de câmpul de antrenament. Dacă supraviețuiești, vei putea vorbi cu el. Sau să îl omori.","О, нет. Я не настоящий Программист. Он прячется. На твоём пути лежит зона тренировки стражи. Пройти её очень непросто. Если уцелеешь, то сможешь поговорить с ним... или убить его.",,"Åh nej, jag är inte den riktiga programmeraren, han gömmer sig. Fortsätt förbi vakternas träningsområde, mycket tufft. Om du överlever kanske du kan prata med honom. Eller döda honom.","Oh hayır, ben gerçek Programcı değilim, o saklanıyor. Muhafız eğitim alanını geçmeye devam et, çok zorlu. Eğer hayatta kalırsan, onunla konuşabilirsin. Ya da onu öldürebilirsin." -Who are you?,TXT_RPLY0_SCRIPT31_D0_WHOAR,〃,,,Kdo jsi?,Hvem er du?,Wer bist du?,,Kiu vi estas?,¿Quién eres?,,Kuka sinä olet?,Qui êtes vous?,Ki vagy te?,E tu chi sei?,お前は誰だ?,당신은 누구죠?,Wie ben jij?,Hvem er du?,Kim jesteś?,Quem é você?,,Cine ești?,Кто ты?,,Vem är du?,Kimsin sen? -You'll never find anything if you hang around here.,TXT_DLG_SCRIPT31_D1516_YOULL,〃,,,"Nic nenajdeš, když se tu budeš potloukat.","Du finder aldrig noget, hvis du bliver hængende her.","Du wirst niemals etwas finden, wenn du hier herumhängst.",,Vi trovos nenion se vi restas ĉi tie.,No encontrarás nada si sigues aquí.,No vas a encontrar nada si sigues aquí.,"Et saa ikinä mitään selville, jos jäät tänne oleilemaan.",Vous ne découvrerez rien si vous traînez ici.,"Nem fogsz semmit se találni, ha csak itt bóklászol.",Non troverai nulla se rimani fermo qui.,アンタがここをふらついても何も無いよ。,여기에 계속 머무르고 있으면 다 알지도 못할걸.,Je zult nooit iets vinden als je hier rondhangt.,Du finner aldri noe hvis du blir her.,"Nic nie znajdziesz, jeśli będziesz się tu kręcił.",Você nunca vai descobrir nada se ficar por aqui.,,N-o să aflii nimic dacă pierzi timpul aici.,"Ты ничего не добьёшься, если будешь ошиваться тут.",,Du kommer aldrig att hitta något om du hänger kvar här.,Buralarda takılırsan asla bir şey bulamazsın. -Piss off peasant!,TXT_DLG_SCRIPT32_D0_PISSO,MAP32: Red acolyte.,,,"Odprejskni, poddaný!",Pis af bonde!,"Verpiss dich, du Bauer!",,"Foriru, kampulo!","¡Esfúmate, campesino!",,"Suksi suohon, maallikko!","Dégage, paysan!",Takarodj a színem elől paraszt!,"Fuori dai piedi, cittadino!",イラつかせるな、田吾作が!,"저리 꺼져라, 시민!",Boer boer kwaad maken!,"Dra til helvete, bonde!",Odwal się chłopie!,"Suma daqui, plebeu!",,"Valea, sărmanule!","Вали отсюда, рабочий!",,Dra åt helvete bonde!,Defol köylü! -Die little man!,TXT_DLG_SCRIPT32_D1516_DIELI,"Appears in MAP32 and is supposed to be spoken by the AcolyteRust actor (named “Interrogator”). However, no such actor is spawned in the map, rendering this line unused.",,,"Zemři, mužíčku!","Dø, lille mand!","Stirb, kleiner Mann!",,"Mortu, nano!","¡Muere, enano!",,"Kuole, pikku mies!","Meurs, petite frappe!","Halál rád, te jöttment!","Muori, piccolo uomo!",,죽어라. 나약한 것!,Sterf kleine man!,"Dø, lille mann!",Giń mały człowieku!,"Morra, insignificante!",,"Mori, mititelule!","Сдохни, человечишка!",,"Dö, lilla man!",Geber küçük adam! -Finally I can get out of this cell.,TXT_DLG_SCRIPT32_D3032_FINAL,MAP32: Cell.,,,Konečně se můžu z téhle cely dostat.,Endelig kan jeg komme ud af denne celle.,Endlich kann ich aus dieser Zelle raus.,,Mi finfine estas libera.,Por fin puedo salir de esta celda.,,"Vihdoinkin, voin päästä pois tästä sellistä.","Enfin, je peux sortir de cette cellule.",Végre kiszabadulhatok ebből a cellából.,Finalmente posso uscire da questa cella.,遂に、この独房から抜け出せる。,드디어 이 감옥에서 벗어나는구나...,Eindelijk kan ik uit deze cel komen.,Endelig kan jeg komme ut av denne cella.,Wreszcie mogę się wydostać z tej celi.,Finalmente eu posso sair desta cela.,,În sfârșit pot părăsi celula asta.,Наконец-то я могу сбежать из этой камеры!,,Äntligen kan jag komma ut ur den här cellen.,Sonunda bu hücreden çıkabilirim. -Why are you in here?,TXT_RPLY0_SCRIPT32_D3032_WHYAR,〃,,,Proč tu jsi?,Hvorfor er du herinde?,Warum bist du da drin?,,Kial vi estas ĉi tie?,¿Y por que estás aquí?,,Miksi olet täällä?,Pourquoi êtes vous ici?,Miért vagy itt bent?,Perché ti trovi qui?,何でここにいる?,너가 왜 여기있지?,Waarom ben je hier binnen?,Hvorfor er du her?,Dlaczego tu jesteś?,Por que você está aqui?,,De ce ești închis?,Как ты здесь оказался?,,Varför är du här inne?,Sen neden buradasın? -I was framed.,TXT_RYES0_SCRIPT32_D3032_IWASF,〃,,,Podvedli mě.,Jeg er blevet snydt.,Ich wurde hereingelegt.,,Mi estis akuzita.,Me incriminaron.,,Minut lavastettiin.,J'ai été victime d'un coup monté.,Meggyanúsítottak.,Mi hanno incastrato.,私は無実だ。,저는 누명을 썼어요.,Ik werd erin geluisd.,Jeg ble lurt i en felle.,Zostałem wrobiony.,Eu caí numa cilada.,,Am fost înscenat.,Меня подставили.,,Jag blev lurad.,Bana komplo kuruldu. -Harris said that I was plotting to kill the Governor. I would never harm a soul.,TXT_DLG_SCRIPT32_D4548_HARRI,〃,,,"Harris řekl, že jsem prý měl v plánu zavraždit guvernéra. Ani mouše bych neublížil.","Harris sagde, at jeg planlagde at dræbe guvernøren. Jeg ville aldrig skade nogen.","Harris hat erzählt, das ich plante den Gouverneur zu ermorden. Ich könnte keiner Menschenseele etwas antun.",,"Harriso diris, ke mi planas mortigi la registon. Mi neniam vundus iun.","Harris dijo que yo estaba planeando matar al gobernador, y yo no podría hacerle nada a nadie.",,Harris väitti minun juonineen kuvernöörin salamurhaa. En ikinä satuttaisi ketään.,Harris a dit que j'avais un plan pour tuer le gouverneur. Je ne ferais pas de mal à qui que ce soit.,"Harris azt nyilatkozta, hogy a kormányzó életére akarok törni. Egy légynek sem ártanék.",Harris ha detto che progettavo di uccidere il governatore. Ma io non farei mai del male a nessuno.,"ハリスに知事の暗殺を企てていると言われた。 +Who are you?,TXT_RPLY0_SCRIPT31_D0_WHOAR,〃,,,Kdo jsi?,Hvem er du?,Wer bist du?,,Kiu vi estas?,¿Quién eres?,,Kuka sinä olet?,Qui êtes vous?,,Ki vagy te?,E tu chi sei?,お前は誰だ?,당신은 누구죠?,Wie ben jij?,Hvem er du?,Kim jesteś?,Quem é você?,,Cine ești?,Кто ты?,,Vem är du?,Kimsin sen? +You'll never find anything if you hang around here.,TXT_DLG_SCRIPT31_D1516_YOULL,〃,,,"Nic nenajdeš, když se tu budeš potloukat.","Du finder aldrig noget, hvis du bliver hængende her.","Du wirst niemals etwas finden, wenn du hier herumhängst.",,Vi trovos nenion se vi restas ĉi tie.,No encontrarás nada si sigues aquí.,No vas a encontrar nada si sigues aquí.,"Et saa ikinä mitään selville, jos jäät tänne oleilemaan.",Vous ne découvrerez rien si vous traînez ici.,,"Nem fogsz semmit se találni, ha csak itt bóklászol.",Non troverai nulla se rimani fermo qui.,アンタがここをふらついても何も無いよ。,여기에 계속 머무르고 있으면 다 알지도 못할걸.,Je zult nooit iets vinden als je hier rondhangt.,Du finner aldri noe hvis du blir her.,"Nic nie znajdziesz, jeśli będziesz się tu kręcił.",Você nunca vai descobrir nada se ficar por aqui.,,N-o să aflii nimic dacă pierzi timpul aici.,"Ты ничего не добьёшься, если будешь ошиваться тут.",,Du kommer aldrig att hitta något om du hänger kvar här.,Buralarda takılırsan asla bir şey bulamazsın. +Piss off peasant!,TXT_DLG_SCRIPT32_D0_PISSO,MAP32: Red acolyte.,,,"Odprejskni, poddaný!",Pis af bonde!,"Verpiss dich, du Bauer!",,"Foriru, kampulo!","¡Esfúmate, campesino!",,"Suksi suohon, maallikko!","Dégage, paysan!",,Takarodj a színem elől paraszt!,"Fuori dai piedi, cittadino!",イラつかせるな、田吾作が!,"저리 꺼져라, 시민!",Boer boer kwaad maken!,"Dra til helvete, bonde!",Odwal się chłopie!,"Suma daqui, plebeu!",,"Valea, sărmanule!","Вали отсюда, рабочий!",,Dra åt helvete bonde!,Defol köylü! +Die little man!,TXT_DLG_SCRIPT32_D1516_DIELI,"Appears in MAP32 and is supposed to be spoken by the AcolyteRust actor (named “Interrogator”). However, no such actor is spawned in the map, rendering this line unused.",,,"Zemři, mužíčku!","Dø, lille mand!","Stirb, kleiner Mann!",,"Mortu, nano!","¡Muere, enano!",,"Kuole, pikku mies!","Meurs, petite frappe!",,"Halál rád, te jöttment!","Muori, piccolo uomo!",,죽어라. 나약한 것!,Sterf kleine man!,"Dø, lille mann!",Giń mały człowieku!,"Morra, insignificante!",,"Mori, mititelule!","Сдохни, человечишка!",,"Dö, lilla man!",Geber küçük adam! +Finally I can get out of this cell.,TXT_DLG_SCRIPT32_D3032_FINAL,MAP32: Cell.,,,Konečně se můžu z téhle cely dostat.,Endelig kan jeg komme ud af denne celle.,Endlich kann ich aus dieser Zelle raus.,,Mi finfine estas libera.,Por fin puedo salir de esta celda.,,"Vihdoinkin, voin päästä pois tästä sellistä.","Enfin, je peux sortir de cette cellule.",,Végre kiszabadulhatok ebből a cellából.,Finalmente posso uscire da questa cella.,遂に、この独房から抜け出せる。,드디어 이 감옥에서 벗어나는구나...,Eindelijk kan ik uit deze cel komen.,Endelig kan jeg komme ut av denne cella.,Wreszcie mogę się wydostać z tej celi.,Finalmente eu posso sair desta cela.,,În sfârșit pot părăsi celula asta.,Наконец-то я могу сбежать из этой камеры!,,Äntligen kan jag komma ut ur den här cellen.,Sonunda bu hücreden çıkabilirim. +Why are you in here?,TXT_RPLY0_SCRIPT32_D3032_WHYAR,〃,,,Proč tu jsi?,Hvorfor er du herinde?,Warum bist du da drin?,,Kial vi estas ĉi tie?,¿Y por que estás aquí?,,Miksi olet täällä?,Pourquoi êtes vous ici?,,Miért vagy itt bent?,Perché ti trovi qui?,何でここにいる?,너가 왜 여기있지?,Waarom ben je hier binnen?,Hvorfor er du her?,Dlaczego tu jesteś?,Por que você está aqui?,,De ce ești închis?,Как ты здесь оказался?,,Varför är du här inne?,Sen neden buradasın? +I was framed.,TXT_RYES0_SCRIPT32_D3032_IWASF,〃,,,Podvedli mě.,Jeg er blevet snydt.,Ich wurde hereingelegt.,,Mi estis akuzita.,Me incriminaron.,,Minut lavastettiin.,J'ai été victime d'un coup monté.,,Meggyanúsítottak.,Mi hanno incastrato.,私は無実だ。,저는 누명을 썼어요.,Ik werd erin geluisd.,Jeg ble lurt i en felle.,Zostałem wrobiony.,Eu caí numa cilada.,,Am fost înscenat.,Меня подставили.,,Jag blev lurad.,Bana komplo kuruldu. +Harris said that I was plotting to kill the Governor. I would never harm a soul.,TXT_DLG_SCRIPT32_D4548_HARRI,〃,,,"Harris řekl, že jsem prý měl v plánu zavraždit guvernéra. Ani mouše bych neublížil.","Harris sagde, at jeg planlagde at dræbe guvernøren. Jeg ville aldrig skade nogen.","Harris hat erzählt, das ich plante den Gouverneur zu ermorden. Ich könnte keiner Menschenseele etwas antun.",,"Harriso diris, ke mi planas mortigi la registon. Mi neniam vundus iun.","Harris dijo que yo estaba planeando matar al gobernador, y yo no podría hacerle nada a nadie.",,Harris väitti minun juonineen kuvernöörin salamurhaa. En ikinä satuttaisi ketään.,Harris a dit que j'avais un plan pour tuer le gouverneur. Je ne ferais pas de mal à qui que ce soit.,,"Harris azt nyilatkozta, hogy a kormányzó életére akarok törni. Egy légynek sem ártanék.",Harris ha detto che progettavo di uccidere il governatore. Ma io non farei mai del male a nessuno.,"ハリスに知事の暗殺を企てていると言われた。 そんなこと心にも思ったことは無いのに。","해리스가 말하길, 제가 총독 암살을 꾀했데요. 난 파리 한마리도 못 죽이는데...",Harris zei dat ik van plan was om de gouverneur te vermoorden. Ik zou nooit een ziel kwaad doen.,Harris sa at jeg planla å drepe guvernøren. Jeg ville aldri skade noen.,"Harris powiedział, że spiskowałem, by zabić gubernatora. Nigdy nie skrzywdziłbym żadnej duszy.",O Harris disse que eu estava planejando matar o Governador. Eu nunca faria mal a qualquer pessoa.,,Harris a spus că plănuiam să-l omor pe Guvernator. N-aș răni un suflet niciodată.,"Харрис сказал, что я замышлял убийство губернатора. А я и мухи не обижу!",,Harris sa att jag planerade att döda guvernören. Jag skulle aldrig skada en själ.,"Harris, Vali'yi öldürmeyi planladığımı söyledi. Kimseye zarar vermem." -Be careful out there.,TXT_DLG_SCRIPT33_D0_BECAR,,,,Buď tam venku opatrný.,Vær forsigtig derude.,Sei vorsichtig dort draußen.,,Agu singarde tie ekstere.,Ten cuidado ahí fuera.,Ten cuidado ahí afuera.,Pidä itsestäsi huoli.,Faites attention à vous.,Légy óvatos odakint.,Stai attento là fuori.,外は気をつけろ。,조심해.,Wees voorzichtig daarbuiten.,Vær forsiktig der ute.,Bądź ostrożny.,Tome cuidado por aí.,,Ai grijă pe-acolo.,Будь поосторожнее.,,Var försiktig där ute.,Dışarıda dikkatli ol. -"Say friend, I'll help you, if you help me. Give me 5 gold and I'll tell you what I know.",TXT_DLG_SCRIPT33_D1516_SAYFR,MAP33: Guy next to Norwall Prison.,,,"Poslyš, příteli, pomůžu ti, když ti pomůžeš mě. Dej mi pět zlatých a já ti řeknu, co vím.","Sig ven, jeg vil hjælpe dig, hvis du hjælper mig. Giv mig 5 guld, så fortæller jeg dig, hvad jeg ved.","Sag, mein Freund. Ich helfe dir, wenn du mir hilst. Gib mir 5 Gold und ich sage dir was ich weiß.",,"Nu, amiko, mi helpos vin se vi helpas min. Donu 5 da oro kaj mi diros tion, kion mi scias.","A ver, amigo, te ayudo si tú me ayudas. Dame 5 de oro y te digo lo que sé.",,"Hei kuule; voin auttaa sinua, jos autat minua. Viidestä kultakolikosta kerron sinulle, mitä tiedän.","Dites, l'ami. Je vous aide si vous m'aidez. Donnez moi 5 pièces et je vous dirais ce que je sais.","Figyelj barátom, segítek rajtad ha te is segítesz. Adj szépen 5 aranyat és elárulom amit tudok.","Senti qua, amico, io aiuterò te se tu aiuterai me. Dammi 5 pezzi d'oro e ti dirò tutto quello che so.","助けてくれるなら援助する。 +Be careful out there.,TXT_DLG_SCRIPT33_D0_BECAR,,,,Buď tam venku opatrný.,Vær forsigtig derude.,Sei vorsichtig dort draußen.,,Agu singarde tie ekstere.,Ten cuidado ahí fuera.,Ten cuidado ahí afuera.,Pidä itsestäsi huoli.,Faites attention à vous.,,Légy óvatos odakint.,Stai attento là fuori.,外は気をつけろ。,조심해.,Wees voorzichtig daarbuiten.,Vær forsiktig der ute.,Bądź ostrożny.,Tome cuidado por aí.,,Ai grijă pe-acolo.,Будь поосторожнее.,,Var försiktig där ute.,Dışarıda dikkatli ol. +"Say friend, I'll help you, if you help me. Give me 5 gold and I'll tell you what I know.",TXT_DLG_SCRIPT33_D1516_SAYFR,MAP33: Guy next to Norwall Prison.,,,"Poslyš, příteli, pomůžu ti, když ti pomůžeš mě. Dej mi pět zlatých a já ti řeknu, co vím.","Sig ven, jeg vil hjælpe dig, hvis du hjælper mig. Giv mig 5 guld, så fortæller jeg dig, hvad jeg ved.","Sag, mein Freund. Ich helfe dir, wenn du mir hilst. Gib mir 5 Gold und ich sage dir was ich weiß.",,"Nu, amiko, mi helpos vin se vi helpas min. Donu 5 da oro kaj mi diros tion, kion mi scias.","A ver, amigo, te ayudo si tú me ayudas. Dame 5 de oro y te digo lo que sé.",,"Hei kuule; voin auttaa sinua, jos autat minua. Viidestä kultakolikosta kerron sinulle, mitä tiedän.","Dites, l'ami. Je vous aide si vous m'aidez. Donnez moi 5 pièces et je vous dirais ce que je sais.",,"Figyelj barátom, segítek rajtad ha te is segítesz. Adj szépen 5 aranyat és elárulom amit tudok.","Senti qua, amico, io aiuterò te se tu aiuterai me. Dammi 5 pezzi d'oro e ti dirò tutto quello che so.","助けてくれるなら援助する。 5ゴールドで知っている情報を全て教えよう","친구, 나는 너를 도와주고 싶어. 그러기 전에 나에게 5 골드를 줘. 그럼 내가 아는 걸 알려줄게.","Zeg vriend, ik zal je helpen, als je me helpt. Geef me 5 goud en ik zal je vertellen wat ik weet.","Jeg skal hjelpe deg, hvis du hjelper meg. Gi meg fem gull, så forteller jeg hva jeg vet.","Powiedz przyjacielu, pomogę ci, jeśli ty pomożesz mi. Daj mi 5 złotych, a powiem ci, co wiem.","Que tal, eu te ajudo se você me ajudar. Me dê 5 moedas de ouro e eu te digo o que eu sei.",,"Să zicem prietene, că te ajut, dacă și tu m-ajuți. Dă-mi 5 monezi și îți voi spune ce știu.","Дружище, я помогу тебе, если ты поможешь мне. Пять золотых, и я расскажу тебе всё, что знаю!",,"Säg vän, jag hjälper dig om du hjälper mig. Ge mig fem guld så berättar jag vad jag vet.","Dostum, sen bana yardım edersen ben de sana yardım ederim. Bana 5 altın ver, ben de sana bildiklerimi anlatayım." -Here's the gold.,TXT_RPLY0_SCRIPT33_D1516_HERES,〃,,,Tady máš to zlato.,Her er guldet.,Hier ist das Gold.,,Jen la oro.,Aquí tienes el oro.,,Tässä kulta.,Voilà votre argent.,Itt az arany.,Ecco l'oro.,金はこれだ。,여기 골드입니다.,Hier is het goud.,Her er gullet.,Oto złoto.,Tome estas moedas.,,Aici e aurul.,Вот монеты.,,Här är guldet.,İşte altın. +Here's the gold.,TXT_RPLY0_SCRIPT33_D1516_HERES,〃,,,Tady máš to zlato.,Her er guldet.,Hier ist das Gold.,,Jen la oro.,Aquí tienes el oro.,,Tässä kulta.,Voilà votre argent.,,Itt az arany.,Ecco l'oro.,金はこれだ。,여기 골드입니다.,Hier is het goud.,Her er gullet.,Oto złoto.,Tome estas moedas.,,Aici e aurul.,Вот монеты.,,Här är guldet.,İşte altın. "If you punch someone, you won't set off the alarms.",TXT_RYES0_SCRIPT33_D1516_IFYOU,〃,,,"Když někoho praštíš, nespustíš alarmy.","Hvis du slår nogen, vil du ikke udløse alarmen.","Wenn du jemanden schlägst, wirst du keinen Alarm auslösen.",,Piki iun ne ekagigas alarmojn.,"Acuchillar a alguien -no activa las alarmas.",,"Jos lyöt jotakuta nyrkillä, et laukaise hälyttimiä.","Si vous plantez quelqu'un avec votre dague de poing, vous n'activez pas les alarmes.","Ha behúzol valakinek, még nem indul be a riasztó.","Se usi i pugni, non attiverai l'allarme.",パンチならアラームを鳴らせることはない。,"만약 네가 누군가를 주먹으로 때린다면, 알람은 울리지 않을 거야.","Als je iemand slaat, zal je het alarm niet afgaan.","Hvis du slår noen, utløser du ikke alarmen.","Jeśli kogoś uderzysz, nie uruchomisz alarmów.","Se você der um soco em alguém, você não ativará os alarmes.",,"Dacă îi tragi un pumn cuiva, nu vei declanșa alarma.","Убивай холодным оружием, тогда ты не поднимешь тревогу.",,Om du slår någon så kommer du inte att utlösa larmet.,"Eğer birine yumruk atarsan, alarmları çalıştırmazsın." -I won't tell you anything for free!,TXT_RNO0_SCRIPT33_D1516_IWONT,〃,,,Zadarmo ti nic říkat nebudu!,Jeg vil ikke fortælle dig noget gratis!,Umsonst werde ich dir nichts sagen.,,Mi diros nenion senpage!,¡No te diré nada gratis!,¡No te voy a decir nada gratis!,En kerro mitään ilmaiseksi!,Je ne vous dirai rien gratuitement!,Nem árulok el ingyen semmit se!,Non ti dirò nulla se prima non vedo l'oro!,タダでは教えられないな!,무료로는 말 못 해!,Ik zal je niets gratis vertellen!,Jeg forteller deg ikke noe gratis!,Nie powiem ci nic za darmo!,Não te direi nada de graça!,,Nu-ți voi spune nimic pe gratis.,Бесплатно я не скажу ничего!,,Jag kommer inte att berätta något gratis!,Sana bedavaya bir şey söylemeyeceğim! -I've already told you what I know.,TXT_DLG_SCRIPT33_D3032_IVEAL,〃,,,"Už jsem ti řekl, co vím.","Jeg har allerede fortalt dig, hvad jeg ved.","Ich habe dir alles gesagt, was ich weiß.",,"Mi jam diris tion, kion mi scias.",Ya te he dicho lo que sé.,Ya te dije lo que sé.,"Olen jo kertonut sinulle, mitä tiedän.",Je vous ai dit tout ce que je sais.,Már elmondtam amit tudtam.,Ti ho già detto ciò che so.,俺が知っていることはこれで全部だ。,난 이미 내가 아는 걸 말해 줬어!,Ik heb je al verteld wat ik weet.,Jeg har allerede fortalt deg det jeg vet.,"Już ci powiedziałem, co wiem.",Já te disse o que eu sei.,,Ți-am spus deja tot ce știu.,"Я уже сказал тебе всё, что знал.",,Jag har redan berättat vad jag vet.,Sana bildiklerimi anlattım zaten. -Hello friend. What can I get for you?,TXT_DLG_SCRIPT33_D4548_HELLO,MAP33: Weapons.,,,"Zdravím, příteli, co ti mohu nabídnout?","Hej, min ven. Hvad kan jeg få for dig?","Hallo, Freund, was kann ich dir geben?",,"Saluton, amiko. Kion mi donu al vi?","Hola, amigo. ¿Qué puedo ofrecerte?",,"Terve, ystävä; miten voin olla avuksi?","Bonjour, l'ami, que puis-je pour vous?",Üdvözöllek barátom. Mit tehetek érted?,"Salve, amico. Cosa posso procurarti?",どうも同士よ。何か必要か?,"안녕하십니까, 친구여. 구매하고 싶은 게 있습니까?",Hallo vriend. Wat kan ik voor je halen?,"Hei, min venn. Hva vil du ha?",Witaj przyjacielu. Co mogę dla ciebie zdobyć?,"Olá amigo, como posso te ajudar?",,"Bună prietene, ce pot să-ți aduc?",Здравствуй. Что-нибудь интересует?,,"Hej, min vän. Vad kan jag få för dig?",Merhaba dostum. Senin için ne yapabilirim? -Electric bolts,TXT_RPLY0_SCRIPT33_D4548_ELECT,〃,,,Elektrické šípy,Elektriske bolte,Elektrische Pfeile,,Elektrajn sagojn,Flechas eléctricas,,Sähkönuolia,Carreaux électriques.,Elektromos nyilak,Dardi elettrificati ,エレクトリック ボルト,전격 볼트,Elektrische bouten,Elektriske bolter.,Elektryczne śruby.,Setas elétricas,,Bolțuri electrice,Электрические болты,,Elektriska bultar,Elektrikli cıvata. -One quarrel it is.,TXT_RYES0_SCRIPT33_D4548_ONEQU,〃,,,Jeden toulec.,Et skænderi bliver det.,Hier hast du sie.,,Jen sagoj.,Salen unas flechas.,,"Tässä, olkaa hyvä.",Un carquois pour vous.,Itt is van.,Eccoli qua.,クォーレル一本だ。,잔소리 없이 주겠습니다.,Eén ruzie is het.,En krangel blir det.,Jedna kłótnia to jest.,Está na mão.,,Aici sunt.,Один колчан.,,Ett gräl blir det.,Tek bir tartışma. -You're broke!,TXT_RNO0_SCRIPT33_D4548_YOURE,〃,,,Jseš švorc!,Du er flad!,Du bist pleite!,,Vi ne havas monon!,¡Estás sin blanca!,¡No traes dinero!,Olet peeaa!,Vous êtes à sec!,Nincs is nálad pénz!,Sei sul lastrico!,スッカラカンじゃないか!,돈이 한 푼도 없는 것 같은데.,Je bent blut!,Du er blakk!,Jesteście spłukani!,Você está sem grana!,,Ești falit!,"Друг, да ты на мели!",,Du är pank!,Beş parasızsın! -Clip of bullets,TXT_RPLY1_SCRIPT33_D4548_10ROU,〃,,,Zásobník s náboji,Et patron-klip,10-Kugeln-Magazin,,Magazenon,Un cargador,,Luotilipas,Chargeur de 10 cartouches.,Egy tárnyi töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler,Klips z kulami.,Carregador de balas,,Cartuș de gloanțe,Обойма патронов,,Klockan med kulor.,Mermi şarjörü -Here's your ammo,TXT_RYES1_SCRIPT33_D4548_HERES,〃,,,Tady je tvá munice.,Her er din ammunition,Hier ist deine Munition.,,Jen via municio.,Aquí tienes tu munición.,,Tässä panoksesi.,Voilà vos balles.,Itt a töltényed.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 탄약입니다.,Hier is je munitie....,Her er ammunisjonen din,Oto twoja amunicja.,Aqui está a sua munição.,,Aici e.,Вот твои патроны.,,Här är din ammunition.,İşte cephaneniz. +no activa las alarmas.",,"Jos lyöt jotakuta nyrkillä, et laukaise hälyttimiä.","Si vous plantez quelqu'un avec votre dague de poing, vous n'activez pas les alarmes.",,"Ha behúzol valakinek, még nem indul be a riasztó.","Se usi i pugni, non attiverai l'allarme.",パンチならアラームを鳴らせることはない。,"만약 네가 누군가를 주먹으로 때린다면, 알람은 울리지 않을 거야.","Als je iemand slaat, zal je het alarm niet afgaan.","Hvis du slår noen, utløser du ikke alarmen.","Jeśli kogoś uderzysz, nie uruchomisz alarmów.","Se você der um soco em alguém, você não ativará os alarmes.",,"Dacă îi tragi un pumn cuiva, nu vei declanșa alarma.","Убивай холодным оружием, тогда ты не поднимешь тревогу.",,Om du slår någon så kommer du inte att utlösa larmet.,"Eğer birine yumruk atarsan, alarmları çalıştırmazsın." +I won't tell you anything for free!,TXT_RNO0_SCRIPT33_D1516_IWONT,〃,,,Zadarmo ti nic říkat nebudu!,Jeg vil ikke fortælle dig noget gratis!,Umsonst werde ich dir nichts sagen.,,Mi diros nenion senpage!,¡No te diré nada gratis!,¡No te voy a decir nada gratis!,En kerro mitään ilmaiseksi!,Je ne vous dirai rien gratuitement!,,Nem árulok el ingyen semmit se!,Non ti dirò nulla se prima non vedo l'oro!,タダでは教えられないな!,무료로는 말 못 해!,Ik zal je niets gratis vertellen!,Jeg forteller deg ikke noe gratis!,Nie powiem ci nic za darmo!,Não te direi nada de graça!,,Nu-ți voi spune nimic pe gratis.,Бесплатно я не скажу ничего!,,Jag kommer inte att berätta något gratis!,Sana bedavaya bir şey söylemeyeceğim! +I've already told you what I know.,TXT_DLG_SCRIPT33_D3032_IVEAL,〃,,,"Už jsem ti řekl, co vím.","Jeg har allerede fortalt dig, hvad jeg ved.","Ich habe dir alles gesagt, was ich weiß.",,"Mi jam diris tion, kion mi scias.",Ya te he dicho lo que sé.,Ya te dije lo que sé.,"Olen jo kertonut sinulle, mitä tiedän.",Je vous ai dit tout ce que je sais.,,Már elmondtam amit tudtam.,Ti ho già detto ciò che so.,俺が知っていることはこれで全部だ。,난 이미 내가 아는 걸 말해 줬어!,Ik heb je al verteld wat ik weet.,Jeg har allerede fortalt deg det jeg vet.,"Już ci powiedziałem, co wiem.",Já te disse o que eu sei.,,Ți-am spus deja tot ce știu.,"Я уже сказал тебе всё, что знал.",,Jag har redan berättat vad jag vet.,Sana bildiklerimi anlattım zaten. +Hello friend. What can I get for you?,TXT_DLG_SCRIPT33_D4548_HELLO,MAP33: Weapons.,,,"Zdravím, příteli, co ti mohu nabídnout?","Hej, min ven. Hvad kan jeg få for dig?","Hallo, Freund, was kann ich dir geben?",,"Saluton, amiko. Kion mi donu al vi?","Hola, amigo. ¿Qué puedo ofrecerte?",,"Terve, ystävä; miten voin olla avuksi?","Bonjour, l'ami, que puis-je pour vous?",,Üdvözöllek barátom. Mit tehetek érted?,"Salve, amico. Cosa posso procurarti?",どうも同士よ。何か必要か?,"안녕하십니까, 친구여. 구매하고 싶은 게 있습니까?",Hallo vriend. Wat kan ik voor je halen?,"Hei, min venn. Hva vil du ha?",Witaj przyjacielu. Co mogę dla ciebie zdobyć?,"Olá amigo, como posso te ajudar?",,"Bună prietene, ce pot să-ți aduc?",Здравствуй. Что-нибудь интересует?,,"Hej, min vän. Vad kan jag få för dig?",Merhaba dostum. Senin için ne yapabilirim? +Electric bolts,TXT_RPLY0_SCRIPT33_D4548_ELECT,〃,,,Elektrické šípy,Elektriske bolte,Elektrische Pfeile,,Elektrajn sagojn,Flechas eléctricas,,Sähkönuolia,Carreaux électriques.,,Elektromos nyilak,Dardi elettrificati ,エレクトリック ボルト,전격 볼트,Elektrische bouten,Elektriske bolter.,Elektryczne śruby.,Setas elétricas,,Bolțuri electrice,Электрические болты,,Elektriska bultar,Elektrikli cıvata. +One quarrel it is.,TXT_RYES0_SCRIPT33_D4548_ONEQU,〃,,,Jeden toulec.,Et skænderi bliver det.,Hier hast du sie.,,Jen sagoj.,Salen unas flechas.,,"Tässä, olkaa hyvä.",Un carquois pour vous.,,Itt is van.,Eccoli qua.,クォーレル一本だ。,잔소리 없이 주겠습니다.,Eén ruzie is het.,En krangel blir det.,Jedna kłótnia to jest.,Está na mão.,,Aici sunt.,Один колчан.,,Ett gräl blir det.,Tek bir tartışma. +You're broke!,TXT_RNO0_SCRIPT33_D4548_YOURE,〃,,,Jseš švorc!,Du er flad!,Du bist pleite!,,Vi ne havas monon!,¡Estás sin blanca!,¡No traes dinero!,Olet peeaa!,Vous êtes à sec!,,Nincs is nálad pénz!,Sei sul lastrico!,スッカラカンじゃないか!,돈이 한 푼도 없는 것 같은데.,Je bent blut!,Du er blakk!,Jesteście spłukani!,Você está sem grana!,,Ești falit!,"Друг, да ты на мели!",,Du är pank!,Beş parasızsın! +Clip of bullets,TXT_RPLY1_SCRIPT33_D4548_10ROU,〃,,,Zásobník s náboji,Et patron-klip,10-Kugeln-Magazin,,Magazenon,Un cargador,,Luotilipas,Chargeur de 10 cartouches.,,Egy tárnyi töltény,Un caricatore di proiettili,銃弾倉,돌격소총 탄창,Klem van kogels,Et magasin med kuler,Klips z kulami.,Carregador de balas,,Cartuș de gloanțe,Обойма патронов,,Klockan med kulor.,Mermi şarjörü +Here's your ammo,TXT_RYES1_SCRIPT33_D4548_HERES,〃,,,Tady je tvá munice.,Her er din ammunition,Hier ist deine Munition.,,Jen via municio.,Aquí tienes tu munición.,,Tässä panoksesi.,Voilà vos balles.,,Itt a töltényed.,Ecco le tue munizioni.,これでアンタのブツだ。,여기 탄약입니다.,Hier is je munitie....,Her er ammunisjonen din,Oto twoja amunicja.,Aqui está a sua munição.,,Aici e.,Вот твои патроны.,,Här är din ammunition.,İşte cephaneniz. "Sorry, no money, no bullets.",TXT_RNO1_SCRIPT33_D4548_SORRY,〃,,,"Promiň. Žádné peníze, žádné náboje.","Beklager, ingen penge, ingen kugler.","Tut mir leid. Kein Geld, keine Munition.",,"Pardonon. Sen mono ne estas kugloj.","Lo siento, sin dinero -no hay balas.",,"Valitan, ei rahaa, ei luoteja.","Désolé, pas d'argent, pas de munitions.","Ha nincs pénz, nincs töltény.","Mi spiace, niente soldi, niente munizioni.",悪いが、金が無ければブツも無しだ。,돈 없으면 거래 못 합니다.,"Sorry, geen geld, geen kogels.","Beklager, ingen penger, ingen kuler.","Niestety, nie ma pieniędzy, nie ma naboi.","Desculpe. Sem grana, sem balas.",,"Scuze, niciun ban, niciun glonț.","Извини, нет денег — нет патронов!",,"Tyvärr, inga pengar, inga kulor.","Üzgünüm, para yoksa mermi de yok." -Ammo box,TXT_RPLY2_SCRIPT33_D4548_50ROU,〃,,,Krabici nábojů,Ammo kasse,50-Kugeln-Schachtel,,Munici-keston,Caja de municiones,,Luotilaatikko,Boîte de 50 balles.,Töltény doboz,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitiedoos,Ammunisjonsboks,Skrzynka z amunicją.,Caixa de munição,,Cutie cu muniție,Коробка патронов,,Ammunitionslåda,Cephane kutusu -Here you go,TXT_RYES2_SCRIPT33_D4548_HEREY,〃,,,Tu máš.,Værsgo.,Bitteschön.,,Jen,Aquí tienes,,Ole hyvä.,Voilà pour vous.,Parancsolj.,Ecco a te.,どうぞ。,거래 감사드립니다.,Alsjeblieft,Vær så god.,Proszę bardzo.,Aqui está,,Aici este,Держи.,,Varsågod.,Al bakalım. -You don't have enough gold!,TXT_RNO2_SCRIPT33_D4548_YOUDO,〃,,,Nemáš dost zlaťáků!,Du har ikke nok guld!,Du hast nicht genug Gold.,,Vi ne havas sufiĉe da oro!,¡No tienes suficiente oro!,,Sinulla ei ole riittävästi kultaa!,Vous n'avez pas assez d'argent.,Nincs elég aranyad.,Non hai abbastanza oro!,十分な額じゃない,골드가 충분치 않군요!,Je hebt niet genoeg goud!,Du har ikke nok gull!,Nie masz wystarczająco dużo złota!,Você não tem ouro suficiente!,,Nu ai suficient aur!,У тебя недостаточно золота!,,Du har inte tillräckligt med guld!,Yeterince altının yok! -Ammo satchel,TXT_RPLY3_SCRIPT33_D4548_AMMOS,〃,,,Brašnu na munici,Ammotaske,Munitionstasche.,,Munici-sakon,Mochila de municiones,,Ammuslaukku,Sacoche de munitions.,Lőszeres hátizsák,Sacca di munizioni,弾薬鞄,탄약 배낭,Munitie tasje,Ammunisjonsveske,Torba na amunicję,Mochila de munição,,Sac cu muniție,Ранец боеприпасов,,Ammunitionsväska,Cephane çantası -"Thank you, anything else?",TXT_RYES3_SCRIPT33_D4548_THANK,〃,,,Děkuji. Něco dalšího?,"Tak, er der andet?","Danke, sonst noch was?",,Dankon. Ĉu ion alian?,Gracias. ¿Algo más?,,Kiitos; vielä jotain muuta?,"Merci, quelque chose d'autre?","Köszönöm, még valami esetleg?","Grazie, serve qualcos'altro?",ありがとう。 他に何か?,좋습니다! 더 필요한 거라도?,"Bedankt, nog iets anders?","Takk, noe mer?","Dziękuję, coś jeszcze?",Obrigado. Mais alguma coisa?,,"Merci, altceva?",Благодарю. Что-нибудь ещё?,,"Tack, något annat?","Teşekkürler, başka bir şey var mı?" +no hay balas.",,"Valitan, ei rahaa, ei luoteja.","Désolé, pas d'argent, pas de munitions.",,"Ha nincs pénz, nincs töltény.","Mi spiace, niente soldi, niente munizioni.",悪いが、金が無ければブツも無しだ。,돈 없으면 거래 못 합니다.,"Sorry, geen geld, geen kogels.","Beklager, ingen penger, ingen kuler.","Niestety, nie ma pieniędzy, nie ma naboi.","Desculpe. Sem grana, sem balas.",,"Scuze, niciun ban, niciun glonț.","Извини, нет денег — нет патронов!",,"Tyvärr, inga pengar, inga kulor.","Üzgünüm, para yoksa mermi de yok." +Ammo box,TXT_RPLY2_SCRIPT33_D4548_50ROU,〃,,,Krabici nábojů,Ammo kasse,50-Kugeln-Schachtel,,Munici-keston,Caja de municiones,,Luotilaatikko,Boîte de 50 balles.,,Töltény doboz,Scatola di munizioni,銃弾倉箱,돌격소총 탄약 박스,Munitiedoos,Ammunisjonsboks,Skrzynka z amunicją.,Caixa de munição,,Cutie cu muniție,Коробка патронов,,Ammunitionslåda,Cephane kutusu +Here you go,TXT_RYES2_SCRIPT33_D4548_HEREY,〃,,,Tu máš.,Værsgo.,Bitteschön.,,Jen,Aquí tienes,,Ole hyvä.,Voilà pour vous.,,Parancsolj.,Ecco a te.,どうぞ。,거래 감사드립니다.,Alsjeblieft,Vær så god.,Proszę bardzo.,Aqui está,,Aici este,Держи.,,Varsågod.,Al bakalım. +You don't have enough gold!,TXT_RNO2_SCRIPT33_D4548_YOUDO,〃,,,Nemáš dost zlaťáků!,Du har ikke nok guld!,Du hast nicht genug Gold.,,Vi ne havas sufiĉe da oro!,¡No tienes suficiente oro!,,Sinulla ei ole riittävästi kultaa!,Vous n'avez pas assez d'argent.,,Nincs elég aranyad.,Non hai abbastanza oro!,十分な額じゃない,골드가 충분치 않군요!,Je hebt niet genoeg goud!,Du har ikke nok gull!,Nie masz wystarczająco dużo złota!,Você não tem ouro suficiente!,,Nu ai suficient aur!,У тебя недостаточно золота!,,Du har inte tillräckligt med guld!,Yeterince altının yok! +Ammo satchel,TXT_RPLY3_SCRIPT33_D4548_AMMOS,〃,,,Brašnu na munici,Ammotaske,Munitionstasche.,,Munici-sakon,Mochila de municiones,,Ammuslaukku,Sacoche de munitions.,,Lőszeres hátizsák,Sacca di munizioni,弾薬鞄,탄약 배낭,Munitie tasje,Ammunisjonsveske,Torba na amunicję,Mochila de munição,,Sac cu muniție,Ранец боеприпасов,,Ammunitionsväska,Cephane çantası +"Thank you, anything else?",TXT_RYES3_SCRIPT33_D4548_THANK,〃,,,Děkuji. Něco dalšího?,"Tak, er der andet?","Danke, sonst noch was?",,Dankon. Ĉu ion alian?,Gracias. ¿Algo más?,,Kiitos; vielä jotain muuta?,"Merci, quelque chose d'autre?",,"Köszönöm, még valami esetleg?","Grazie, serve qualcos'altro?",ありがとう。 他に何か?,좋습니다! 더 필요한 거라도?,"Bedankt, nog iets anders?","Takk, noe mer?","Dziękuję, coś jeszcze?",Obrigado. Mais alguma coisa?,,"Merci, altceva?",Благодарю. Что-нибудь ещё?,,"Tack, något annat?","Teşekkürler, başka bir şey var mı?" "You can't afford that, good day.",TXT_RNO3_SCRIPT33_D4548_YOUCA,〃,,,"To si nemůžeš dovolit, přeji hezký den.","Det har du ikke råd til, god dag.",Das kannst du dir nicht leisten. Guten Tag.,,"Vi ne povas sen mono. Havu bonan tagon!","No te alcanza. -¡Ten un buen día!",,Sinulla ei ole siihen varaa; hyvää päivänjatkoa.,Vous ne pouvez pas l'acheter. Au revoir.,"Erre neked nem tellik, szép napot.","Non te la puoi permettere, buona giornata.",それを買える余裕は無い、また今度。,제공할 수 없습니다. 유감이군요.,"Dat kan je je niet betalen, goede dag.",Det har du ikke råd til. Adjø.,"Nie stać cię na to, dzień dobry.",Você não pode comprar isto. Tenha um bom dia.,,"Nu ai bani, ziua bună.",У тебя не хватает денег. Всего доброго!,,"Du har inte råd med det, god dag.","Bunu karşılayamazsın, iyi günler." -Welcome. What may I show you?,TXT_DLG_SCRIPT33_D6064_WELCO,MAP33: Armory,,,Vítej. Co bych ti mohl nabídnout?,Velkommen. Hvad må jeg vise dig?,Willkommen. Was darf ich dir zeigen?,,Bonvenon. Kion mi montru al vi?,Bienvenido. ¿Qué puedo mostrarte?,,Tervetuloa. Mitä voin teille esitellä?,"Bienvenue, comment puis-je vous servir?",Üdvözöllek barátom. Mit tehetek érted?,Benvenuto. Cosa posso farti vedere?,ようこそ、何を見ていきますか?,어서 오세요! 무엇이 필요한지?,Welkom. Wat kan ik je laten zien?,Velkommen. Hva kan jeg vise deg?,Witam. Co mogę ci pokazać?,Seja bem-vindo. O que posso lhe mostrar?,,Bună. Cu ce te pot ajuta?,Здравствуй. Что-нибудь интересует?,,Välkommen. Vad får jag visa dig?,Hoş geldiniz. Size ne gösterebilirim? -Environmental suit,TXT_RPLY0_SCRIPT33_D6064_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat.,Védő ruha,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Kombinezon ekologiczny,Traje de proteção,,Costum de Protecție împotriva Mediului,Защитный костюм,,Miljödräkt,Çevre kıyafeti. -Here you are.,TXT_RYES0_SCRIPT33_D6064_HEREY,〃,,,"Tak, tady to je.",Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, olkaa hyvä.",Voilà pour vous.,Parancsolj.,Ecco a te.,はい、これをどうぞ。,받으세요!,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici e.,"Хорошо, бери.",,Varsågod.,Al bakalım. -You don't have enough money for that.,TXT_RNO0_SCRIPT33_D6064_YOUDO,〃,,,Na to nemáš dost peněz.,Du har ikke penge nok til det.,Dafür hast du nicht genug Geld.,,Vi ne havas sufiĉe da mono.,No tienes suficiente dinero.,,Teillä ei ole tarpeeksi rahaa sitä varten.,Vous n'avez pas assez d'argent.,"Sajnálom, de Önnek nem áll módjában kifizetni ezt.",Non hai abbastanza soldi per questo.,すみませんが、貴方は十分なお金を持っていません。,돈이 충분치 않아요.,Daar heb je niet genoeg geld voor.,Du har ikke nok penger til det.,Nie masz na to pieniędzy.,Você não tem dinheiro o suficiente para isto.,,N-ai suficienți bani.,"Извини, но у тебя не хватает денег.",,Du har inte tillräckligt med pengar för det.,Bunun için yeterli paran yok. -Leather armor.,TXT_RPLY1_SCRIPT33_D6064_LEATH,〃,,Leather armour,Kožené brnění,Læder rustning.,Lederrüstung,,Ledan armaĵon.,Armadura de cuero.,,Nahkasuojus,Armure de cuir.,Bőr vért.,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Lær rustning,Skórzana zbroja.,Armadura de couro.,,Armură de piele.,Кожаная броня,,Läderrustning.,Deri zırh. -Here you are.,TXT_RYES1_SCRIPT33_D6064_HEREY,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Olkaa hyvä.,Voilà pour vous.,Parancsolj.,Ecco a te.,これをどうぞ。,딱 맞는 치수의 갑옷이죠.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici e.,Держи.,,Här är den.,Al bakalım. -Perhaps some other time?,TXT_RNO1_SCRIPT33_D6064_PERHA,〃,,,Možná někdy jindy?,Måske en anden gang?,Vielleicht ein anderes Mal?,,Ĉu eble alian fojon?,¿Quizás en otra ocasión?,¿Tal vez en otra ocasión?,Ehkä jokin toinen kerta?,Peut être une autre fois?,Talán később?,Magari un'altra volta?,また別の機会に?,아마 나중에 사야겠는데요?,Misschien een andere keer?,Kanskje en annen gang?,Może innym razem?,Talvez outra hora?,,Poate altădată?,"Может, в следующий раз?",,Kanske en annan gång?,Belki başka bir zaman? -Metal armor,TXT_RPLY2_SCRIPT33_D6064_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure de métal.,Fém vért,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metallrustning.,Metalowa zbroja,Armadura de metal,,Armură de metal,Металлическая броня,,Metallrustning.,Metal zırh. -Wear it in good health.,TXT_RYES2_SCRIPT33_D6064_WEARI,〃,,,Nos ho ve zdraví.,Bær den ved godt helbred.,Trage sie und bleib gesund.,,Ĝuu ĝin.,Disfrútala.,,Pitäköön asu teidät terveenä.,Portez-la en bonne santé.,Használd egészséggel.,Che possa esserti utile!,着ると安心しますよ。,건강하게 착용하십시오.,Draag het in goede gezondheid.,Bruk den ved god helse.,Noś ją w dobrym zdrowiu.,Vista com orgulho.,,Să o porți sănătos.,Носи на здоровье.,,Bär den vid god hälsa.,Sağlıkla giy. +¡Ten un buen día!",,Sinulla ei ole siihen varaa; hyvää päivänjatkoa.,Vous ne pouvez pas l'acheter. Au revoir.,,"Erre neked nem tellik, szép napot.","Non te la puoi permettere, buona giornata.",それを買える余裕は無い、また今度。,제공할 수 없습니다. 유감이군요.,"Dat kan je je niet betalen, goede dag.",Det har du ikke råd til. Adjø.,"Nie stać cię na to, dzień dobry.",Você não pode comprar isto. Tenha um bom dia.,,"Nu ai bani, ziua bună.",У тебя не хватает денег. Всего доброго!,,"Du har inte råd med det, god dag.","Bunu karşılayamazsın, iyi günler." +Welcome. What may I show you?,TXT_DLG_SCRIPT33_D6064_WELCO,MAP33: Armory,,,Vítej. Co bych ti mohl nabídnout?,Velkommen. Hvad må jeg vise dig?,Willkommen. Was darf ich dir zeigen?,,Bonvenon. Kion mi montru al vi?,Bienvenido. ¿Qué puedo mostrarte?,,Tervetuloa. Mitä voin teille esitellä?,"Bienvenue, comment puis-je vous servir?",,Üdvözöllek barátom. Mit tehetek érted?,Benvenuto. Cosa posso farti vedere?,ようこそ、何を見ていきますか?,어서 오세요! 무엇이 필요한지?,Welkom. Wat kan ik je laten zien?,Velkommen. Hva kan jeg vise deg?,Witam. Co mogę ci pokazać?,Seja bem-vindo. O que posso lhe mostrar?,,Bună. Cu ce te pot ajuta?,Здравствуй. Что-нибудь интересует?,,Välkommen. Vad får jag visa dig?,Hoş geldiniz. Size ne gösterebilirim? +Environmental suit,TXT_RPLY0_SCRIPT33_D6064_ENVIR,〃,,,Ochranný oblek,Miljødragt,Schutzanzug.,,Medi-ŝirman veston,Traje NBQ,,Ympäristösuojapuku,Combinaison Hazmat.,,Védő ruha,Tuta ambientale,耐環境スーツ,환경 방호복,Beschermend Pak,Miljødrakt,Kombinezon ekologiczny,Traje de proteção,,Costum de Protecție împotriva Mediului,Защитный костюм,,Miljödräkt,Çevre kıyafeti. +Here you are.,TXT_RYES0_SCRIPT33_D6064_HEREY,〃,,,"Tak, tady to je.",Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, olkaa hyvä.",Voilà pour vous.,,Parancsolj.,Ecco a te.,はい、これをどうぞ。,받으세요!,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici e.,"Хорошо, бери.",,Varsågod.,Al bakalım. +You don't have enough money for that.,TXT_RNO0_SCRIPT33_D6064_YOUDO,〃,,,Na to nemáš dost peněz.,Du har ikke penge nok til det.,Dafür hast du nicht genug Geld.,,Vi ne havas sufiĉe da mono.,No tienes suficiente dinero.,,Teillä ei ole tarpeeksi rahaa sitä varten.,Vous n'avez pas assez d'argent.,,"Sajnálom, de Önnek nem áll módjában kifizetni ezt.",Non hai abbastanza soldi per questo.,すみませんが、貴方は十分なお金を持っていません。,돈이 충분치 않아요.,Daar heb je niet genoeg geld voor.,Du har ikke nok penger til det.,Nie masz na to pieniędzy.,Você não tem dinheiro o suficiente para isto.,,N-ai suficienți bani.,"Извини, но у тебя не хватает денег.",,Du har inte tillräckligt med pengar för det.,Bunun için yeterli paran yok. +Leather armor.,TXT_RPLY1_SCRIPT33_D6064_LEATH,〃,,Leather armour,Kožené brnění,Læder rustning.,Lederrüstung,,Ledan armaĵon.,Armadura de cuero.,,Nahkasuojus,Armure de cuir.,,Bőr vért.,Armatura di cuoio,レザーアーマー,가죽 갑옷,Leren harnas,Lær rustning,Skórzana zbroja.,Armadura de couro.,,Armură de piele.,Кожаная броня,,Läderrustning.,Deri zırh. +Here you are.,TXT_RYES1_SCRIPT33_D6064_HEREY,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,Olkaa hyvä.,Voilà pour vous.,,Parancsolj.,Ecco a te.,これをどうぞ。,딱 맞는 치수의 갑옷이죠.,Hier ben je dan.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici e.,Держи.,,Här är den.,Al bakalım. +Perhaps some other time?,TXT_RNO1_SCRIPT33_D6064_PERHA,〃,,,Možná někdy jindy?,Måske en anden gang?,Vielleicht ein anderes Mal?,,Ĉu eble alian fojon?,¿Quizás en otra ocasión?,¿Tal vez en otra ocasión?,Ehkä jokin toinen kerta?,Peut être une autre fois?,,Talán később?,Magari un'altra volta?,また別の機会に?,아마 나중에 사야겠는데요?,Misschien een andere keer?,Kanskje en annen gang?,Może innym razem?,Talvez outra hora?,,Poate altădată?,"Может, в следующий раз?",,Kanske en annan gång?,Belki başka bir zaman? +Metal armor,TXT_RPLY2_SCRIPT33_D6064_METAL,〃,,Metal armour,Kovové brnění,Metal rustning,Metallrüstung,,Metalan armaĵon,Armadura de metal,,Metallihaarniska,Armure de métal.,,Fém vért,Armatura di metallo,メタルアーマー,강철 갑옷,Metalen harnas,Metallrustning.,Metalowa zbroja,Armadura de metal,,Armură de metal,Металлическая броня,,Metallrustning.,Metal zırh. +Wear it in good health.,TXT_RYES2_SCRIPT33_D6064_WEARI,〃,,,Nos ho ve zdraví.,Bær den ved godt helbred.,Trage sie und bleib gesund.,,Ĝuu ĝin.,Disfrútala.,,Pitäköön asu teidät terveenä.,Portez-la en bonne santé.,,Használd egészséggel.,Che possa esserti utile!,着ると安心しますよ。,건강하게 착용하십시오.,Draag het in goede gezondheid.,Bruk den ved god helse.,Noś ją w dobrym zdrowiu.,Vista com orgulho.,,Să o porți sănătos.,Носи на здоровье.,,Bär den vid god hälsa.,Sağlıkla giy. Come back when you can afford it.,TXT_RNO2_SCRIPT33_D6064_COMEB,〃,,,"Vrať se, až si to budeš moct dovolit.","Kom tilbage, når du har råd til det.","Komme wieder, wenn du dir sie leisten kannst.",,"Revenu kiam vi povos aĉeti ĝin.","Vuelve cuando -puedas comprarla.",,"Palataan asiaa, kun teillä on siihen varaa.",Revenez quand vous pouvez l'acheter.,Gyere vissza ha tellik rá.,Ritorna quando potrai permettertela.,余裕がある時にまた。,돈이 좀 있을때 다시 찾아와주세요.,Kom terug wanneer je het je kunt veroorloven.,Kom tilbake når du har råd.,"Wróć, gdy będzie cię na to stać.",Volte quando puder comprar.,,Întoarce-te când ai destui bani!,"Вернёшься, когда поднакопишь на то, что хочешь!",,Kom tillbaka när du har råd.,Paranız yettiğinde geri gelin. -How may I assist you?,TXT_DLG_SCRIPT33_D7580_HOWMA,MAP33: Hospital,,,Jak ti mohu pomoci?,Hvordan kan jeg hjælpe dig?,Womit kann ich dienen?,,Kiel mi helpu vin?,¿Cómo puedo ayudarte?,,Miten voin teitä avustaa?,Comment puis-je vous aider aujourd'hui?,Miben lehetek a segítségedre?,Come posso aiutarti?,何かお困りですか?,반갑습니다. 어떻게 도와드릴까요?,Hoe kan ik u helpen?,Hvordan kan jeg hjelpe deg?,Jak mogę ci pomóc?,Como posso ajudá-lo?,,Cu ce te pot ajuta?,Чем могу помочь?,,Hur kan jag hjälpa dig?,Size nasıl yardımcı olabilirim? -Med patch,TXT_RPLY0_SCRIPT33_D7580_MEDPA,〃,,,Obvazy,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement.,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Bandaj medical,Бинтами,,Medicinsk plåster,Tıbbi yama -Here's your patch kit.,TXT_RYES0_SCRIPT33_D7580_HERES,〃,,,Tady je tvůj obvaz.,Her er dit patch-kit.,Hier ist deine Bandage.,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä käärepakettisi.,Voilà votre pansement.,Itt a tapaszod.,Ecco le tue bende.,これをどうぞ。,저렴한 가격의 의료 붕대입니다.,Hier is je patch.,Her er lappesettet ditt.,Oto twój bandaż.,Aqui está a sua compressa,,Aici este.,Вот они.,,Her er dit plaster.,İşte yama setiniz. -You need 10 gold for that.,TXT_RNO0_SCRIPT33_D7580_YOUNE,〃,,,Na ty potřebuješ deset zlatých.,Du skal bruge 10 guld for det.,Dafür brauchst du 10 Gold.,,Vi bezonas dek da oro.,Necesitas diez de oro.,,Tarvitset sitä varten 10 kolikkoa.,Il vous faut 10 pièces pour ça.,10 aranyba kerül.,Ti servono 10 pezzi d'oro per quello.,10 ゴールド必要です。,10 골드입니다. 설마 이 만한 양의 돈이 없으신가요?,Daar heb je 10 goud voor nodig.,Du trenger 10 gull for det.,Potrzebujesz na to 10 złota.,Você precisa de 10 moedas para isto.,,Ai nevoie de 10 monezi pentru aia.,Тебе не хватает 10 золотых.,,Du behöver 10 guld för den.,Bunun için 10 altına ihtiyacın var. -Field surgery kit,TXT_RPLY1_SCRIPT33_D7580_FIELD,〃,,,Lékárničku,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie.,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Zestaw do chirurgii polowej,Kit de cirurgia,,Kit chirurgical de teren.,Аптечкой,,Fältkirurgisk utrustning,Saha ameliyat kiti -Thank you.,TXT_RYES1_SCRIPT33_D7580_THANK,〃,,,Děkuji.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitoksia,Merci.,Köszönöm.,Grazie.,ありがとうございます。,말 없이 주겠습니다. 거래 고마워요!,Bedankt.,Takk skal du ha.,Dziękuję.,Obrigado.,,Merci.,Спасибо.,,Tack.,Teşekkür ederim. +puedas comprarla.",,"Palataan asiaa, kun teillä on siihen varaa.",Revenez quand vous pouvez l'acheter.,,Gyere vissza ha tellik rá.,Ritorna quando potrai permettertela.,余裕がある時にまた。,돈이 좀 있을때 다시 찾아와주세요.,Kom terug wanneer je het je kunt veroorloven.,Kom tilbake når du har råd.,"Wróć, gdy będzie cię na to stać.",Volte quando puder comprar.,,Întoarce-te când ai destui bani!,"Вернёшься, когда поднакопишь на то, что хочешь!",,Kom tillbaka när du har råd.,Paranız yettiğinde geri gelin. +How may I assist you?,TXT_DLG_SCRIPT33_D7580_HOWMA,MAP33: Hospital,,,Jak ti mohu pomoci?,Hvordan kan jeg hjælpe dig?,Womit kann ich dienen?,,Kiel mi helpu vin?,¿Cómo puedo ayudarte?,,Miten voin teitä avustaa?,Comment puis-je vous aider aujourd'hui?,,Miben lehetek a segítségedre?,Come posso aiutarti?,何かお困りですか?,반갑습니다. 어떻게 도와드릴까요?,Hoe kan ik u helpen?,Hvordan kan jeg hjelpe deg?,Jak mogę ci pomóc?,Como posso ajudá-lo?,,Cu ce te pot ajuta?,Чем могу помочь?,,Hur kan jag hjälpa dig?,Size nasıl yardımcı olabilirim? +Med patch,TXT_RPLY0_SCRIPT33_D7580_MEDPA,〃,,,Obvazy,Medicinsk plaster,Medizinische Bandage,,Kuracbendoj,Tiritas,Curitas,Sidekääre,Pansement.,,Ragtapasz,Bende,医薬パッチ,의료 붕대,Med-patch,Medisinplaster,Bandaż,Compressa médica,,Bandaj medical,Бинтами,,Medicinsk plåster,Tıbbi yama +Here's your patch kit.,TXT_RYES0_SCRIPT33_D7580_HERES,〃,,,Tady je tvůj obvaz.,Her er dit patch-kit.,Hier ist deine Bandage.,,Jen viaj kuracbendoj,Aquí tienes tus tiritas.,Aquí tienes tus curitas.,Tässä käärepakettisi.,Voilà votre pansement.,,Itt a tapaszod.,Ecco le tue bende.,これをどうぞ。,저렴한 가격의 의료 붕대입니다.,Hier is je patch.,Her er lappesettet ditt.,Oto twój bandaż.,Aqui está a sua compressa,,Aici este.,Вот они.,,Her er dit plaster.,İşte yama setiniz. +You need 10 gold for that.,TXT_RNO0_SCRIPT33_D7580_YOUNE,〃,,,Na ty potřebuješ deset zlatých.,Du skal bruge 10 guld for det.,Dafür brauchst du 10 Gold.,,Vi bezonas dek da oro.,Necesitas diez de oro.,,Tarvitset sitä varten 10 kolikkoa.,Il vous faut 10 pièces pour ça.,,10 aranyba kerül.,Ti servono 10 pezzi d'oro per quello.,10 ゴールド必要です。,10 골드입니다. 설마 이 만한 양의 돈이 없으신가요?,Daar heb je 10 goud voor nodig.,Du trenger 10 gull for det.,Potrzebujesz na to 10 złota.,Você precisa de 10 moedas para isto.,,Ai nevoie de 10 monezi pentru aia.,Тебе не хватает 10 золотых.,,Du behöver 10 guld för den.,Bunun için 10 altına ihtiyacın var. +Field surgery kit,TXT_RPLY1_SCRIPT33_D7580_FIELD,〃,,,Lékárničku,Kirurgisæt,Erste-Hilfe-Kasten,,Kirurgia kesto,Kit quirúrgico,,Kenttäkirurgilaukku,Kit de chirurgie.,,Harctéri műtéti felszerelés,Kit chirurgico,手術キット,수술 키트,Veld chirurgie kit,Kirurgisett,Zestaw do chirurgii polowej,Kit de cirurgia,,Kit chirurgical de teren.,Аптечкой,,Fältkirurgisk utrustning,Saha ameliyat kiti +Thank you.,TXT_RYES1_SCRIPT33_D7580_THANK,〃,,,Děkuji.,Tak.,Danke.,,Dankon.,Gracias.,,Kiitoksia,Merci.,,Köszönöm.,Grazie.,ありがとうございます。,말 없이 주겠습니다. 거래 고마워요!,Bedankt.,Takk skal du ha.,Dziękuję.,Obrigado.,,Merci.,Спасибо.,,Tack.,Teşekkür ederim. "I wish I could give them away, but they cost 25 gold.",TXT_RNO1_SCRIPT33_D7580_IWISH,〃,,,"Přál bych si je dávat zadarmo, ale stojí 25 zlatých.","Jeg ville ønske, jeg kunne give dem væk, men de koster 25 guld.","Ich wünschte, ich könnte sie verschenken, aber sie kosten 25 Gold.",,"Mi donacus ĝin, sed ĝi kostas 25 da oro.","Ojalá pudiera regalarlo, -pero cuesta 25 de oro.",,"Kunpa voisinkin antaa niitä lahjaksi, mutta ne maksavat 25 kolikkoa.","J'adorerais les donner gratuitement, mais non, ça coûte 25 pièces.","Bárcsak ingyen osztogathatnám, de 25 aranyba kerül.","Mi piacerebbe darli via, ma costano 25 pezzi d'oro.",譲渡したい所ですが、25 ゴールド必要です。,25 골드만 있으면 잔소리 말고 주겠습니다.,"Ik wou dat ik ze kon weggeven, maar ze kosten 25 goud.","Jeg skulle ønske jeg kunne gi dem bort, men de koster 25 gull.","Chciałbym móc je rozdać, ale kosztują 25 złota.","Bem que eu queria doar de graça, mas custa 25 moedas de ouro.",,"Aș vrea să le pot da pe gratis, dar costă 25 de monezi.","С радостью бы отдал, но они по 25 золотых.",,"Jag önskar att jag kunde ge bort dem, men de kostar 25 guld.",Keşke onları verebilseydim ama 25 altına mal oluyorlar. -Healing,TXT_RPLY2_SCRIPT33_D7580_HEALI,〃,,,Ošetření,Healing,Heilung,,Kuracado,Curación,,Sairaanhoitoa,Des soins.,Gyógyítás,Ho bisogno di essere curato.,治療だ,치료 중.,Genezing,Helbredelse,Uzdrawianie,Cura,,Vindecă-mă.,Медкомплектом,,Helande,Şifa -There you go. Take care now.,TXT_RYES2_SCRIPT33_D7580_THERE,〃,,,A je to. Buď opatrný.,Værsgo. Pas godt på dig selv nu.,Bitteschön. Aber sei vorsichtiger.,,Jen. Estu atenta.,Toma. Cuídate.,,Olkaa hyvä. Pitäkäähän nyt huoli itsestänne.,"Voilà pour vous, portez-vous-bien.",Meg is oldottam. Vigyázz magadra.,"Ecco fatto, stammi bene.",こちらになります、お気をつけて。,치료가 끝났어. 몸 조심하라고.,Daar ga je. Pas goed op jezelf.,Vær så god. Ta vare på deg selv.,No i proszę. Dbaj o siebie.,Pronto. Se cuida.,,Gata. Ai grijă acum.,Пожалуйста. Береги себя!,,Här har du. Ta hand om dig nu.,Al bakalım. Kendine iyi bak. +pero cuesta 25 de oro.",,"Kunpa voisinkin antaa niitä lahjaksi, mutta ne maksavat 25 kolikkoa.","J'adorerais les donner gratuitement, mais non, ça coûte 25 pièces.",,"Bárcsak ingyen osztogathatnám, de 25 aranyba kerül.","Mi piacerebbe darli via, ma costano 25 pezzi d'oro.",譲渡したい所ですが、25 ゴールド必要です。,25 골드만 있으면 잔소리 말고 주겠습니다.,"Ik wou dat ik ze kon weggeven, maar ze kosten 25 goud.","Jeg skulle ønske jeg kunne gi dem bort, men de koster 25 gull.","Chciałbym móc je rozdać, ale kosztują 25 złota.","Bem que eu queria doar de graça, mas custa 25 moedas de ouro.",,"Aș vrea să le pot da pe gratis, dar costă 25 de monezi.","С радостью бы отдал, но они по 25 золотых.",,"Jag önskar att jag kunde ge bort dem, men de kostar 25 guld.",Keşke onları verebilseydim ama 25 altına mal oluyorlar. +Healing,TXT_RPLY2_SCRIPT33_D7580_HEALI,〃,,,Ošetření,Healing,Heilung,,Kuracado,Curación,,Sairaanhoitoa,Des soins.,,Gyógyítás,Ho bisogno di essere curato.,治療だ,치료 중.,Genezing,Helbredelse,Uzdrawianie,Cura,,Vindecă-mă.,Медкомплектом,,Helande,Şifa +There you go. Take care now.,TXT_RYES2_SCRIPT33_D7580_THERE,〃,,,A je to. Buď opatrný.,Værsgo. Pas godt på dig selv nu.,Bitteschön. Aber sei vorsichtiger.,,Jen. Estu atenta.,Toma. Cuídate.,,Olkaa hyvä. Pitäkäähän nyt huoli itsestänne.,"Voilà pour vous, portez-vous-bien.",,Meg is oldottam. Vigyázz magadra.,"Ecco fatto, stammi bene.",こちらになります、お気をつけて。,치료가 끝났어. 몸 조심하라고.,Daar ga je. Pas goed op jezelf.,Vær så god. Ta vare på deg selv.,No i proszę. Dbaj o siebie.,Pronto. Se cuida.,,Gata. Ai grijă acum.,Пожалуйста. Береги себя!,,Här har du. Ta hand om dig nu.,Al bakalım. Kendine iyi bak. "Well, maybe you can afford some med patches?",TXT_RNO2_SCRIPT33_D7580_WELLM,〃,,,Možná si můžeš dovolit nějaké obvazy?,Måske har du råd til nogle medicinske plastre?,"Naja, vielleicht kannst du dir ein paar Bandagen leisten?",,"Nu, ĉu vi eble povas aĉeti kuracbendojn?","Bueno, ¿quizás tengas para comprar tiritas?","Bueno, ¿tal vez tengas -para comprar curitas?",Ehkä teillä olisi kuitenkin sidekääreisiin varaa?,"Eh bien, peut être pouvez-vous vous acheter quelques pansements?",Talán tellik pár tapaszra is?,"Beh, forse puoi permetterti delle bende?",ところで、医薬パッチを買う余裕はありますか?,의료 붕대는 어떠신가요? 이 건 저렴한데.,"Nou ja, misschien kunt u zich wat medische patches veroorloven?",Kanskje du har råd til noen medisinplaster?,Może stać cię na plastry?,"Bem, talvez você possa comprar algumas compressas?",,"Păi, poate îți permiți niște truse medicale?","Тогда, может быть, купишь несколько бинтов?",,Du kanske har råd med några medicinska plåster?,Belki birkaç ilaç yamasını karşılayabilirsin? -"Hello friend, I haven't seen you around here before. All I can say is that I'd be careful if I were you, there's a lot going on and it's better if you don't get in the way.",TXT_DLG_SCRIPT33_D9096_HELLO,MAP33: Barkeep.,,,"Ahoj, příteli, ještě jsem tě tady neviděl. Jediné, co můžu říct, je: Být tebou, byl bych opatrný. Děje se toho hodně a je lepší neplést se věcem do cesty.","Hej ven, jeg har ikke set dig her før. Alt jeg kan sige er, at jeg ville være forsigtig, hvis jeg var dig, der sker meget, og det er bedre, hvis du ikke kommer i vejen.","Hallo, Freund, ich habe dich hier noch nicht gesehen. Ich kann nur sagen, sei vorsichtig und wenn ich du wäre, würde ich es vorziehen, niemandem im Weg zu stehen.",,"Saluton, amiko, mi ne vidis vin ĉi tie antaŭe. Mi povas nur diri, ke mi estus atenta se mi estus vi: okazas multaj aferoj kaj estas pli bone, ke vi ne miksu vin.","Hola, amigo, no te he visto por aquí antes. Todo lo que puedo decir es que tendría cuidado si fuera tú: están pasando muchas cosas y es mejor que no te entrometas.","Hola, amigo, es la primera vez que te veo por aquí. Todo lo que puedo decir es que tendría cuidado si fuera tú: están pasando muchas cosas y es mejor que no te entrometas.","Tervehdys. En ole teitä täällä ennen nähnytkään. Teidän saappaissanne olisin varuillani. Paljon on meneillään, ja on parempi pysyä poissa tieltä.","Bienvenue, l'ami. Je ne vous ai pas vu ici avant. Tout ce que peux vous dire, c'est de faire attention à vous. Il se passe beaucoup de choses ici, et je pense que vous ne voulez pas vous en mêler.","Szervusz barátom, nem láttalak még itt eddig. Csak annyi jó tanácsot tudok adni, hogy légy óvatos. Felpörögtek az események az utóbbi időben, és a helydben nem keverednék bele.","Salve amico, non ti ho mai visto da queste parti prima. Posso solo dirti che farei molta attenzione se fossi in te. Stanno succedendo diverse cose, ed è meglio non immischiarsi.","どうも余所者、この辺では見かけない顔だな。 +para comprar curitas?",Ehkä teillä olisi kuitenkin sidekääreisiin varaa?,"Eh bien, peut être pouvez-vous vous acheter quelques pansements?",,Talán tellik pár tapaszra is?,"Beh, forse puoi permetterti delle bende?",ところで、医薬パッチを買う余裕はありますか?,의료 붕대는 어떠신가요? 이 건 저렴한데.,"Nou ja, misschien kunt u zich wat medische patches veroorloven?",Kanskje du har råd til noen medisinplaster?,Może stać cię na plastry?,"Bem, talvez você possa comprar algumas compressas?",,"Păi, poate îți permiți niște truse medicale?","Тогда, может быть, купишь несколько бинтов?",,Du kanske har råd med några medicinska plåster?,Belki birkaç ilaç yamasını karşılayabilirsin? +"Hello friend, I haven't seen you around here before. All I can say is that I'd be careful if I were you, there's a lot going on and it's better if you don't get in the way.",TXT_DLG_SCRIPT33_D9096_HELLO,MAP33: Barkeep.,,,"Ahoj, příteli, ještě jsem tě tady neviděl. Jediné, co můžu říct, je: Být tebou, byl bych opatrný. Děje se toho hodně a je lepší neplést se věcem do cesty.","Hej ven, jeg har ikke set dig her før. Alt jeg kan sige er, at jeg ville være forsigtig, hvis jeg var dig, der sker meget, og det er bedre, hvis du ikke kommer i vejen.","Hallo, Freund, ich habe dich hier noch nicht gesehen. Ich kann nur sagen, sei vorsichtig und wenn ich du wäre, würde ich es vorziehen, niemandem im Weg zu stehen.",,"Saluton, amiko, mi ne vidis vin ĉi tie antaŭe. Mi povas nur diri, ke mi estus atenta se mi estus vi: okazas multaj aferoj kaj estas pli bone, ke vi ne miksu vin.","Hola, amigo, no te he visto por aquí antes. Todo lo que puedo decir es que tendría cuidado si fuera tú: están pasando muchas cosas y es mejor que no te entrometas.","Hola, amigo, es la primera vez que te veo por aquí. Todo lo que puedo decir es que tendría cuidado si fuera tú: están pasando muchas cosas y es mejor que no te entrometas.","Tervehdys. En ole teitä täällä ennen nähnytkään. Teidän saappaissanne olisin varuillani. Paljon on meneillään, ja on parempi pysyä poissa tieltä.","Bienvenue, l'ami. Je ne vous ai pas vu ici avant. Tout ce que peux vous dire, c'est de faire attention à vous. Il se passe beaucoup de choses ici, et je pense que vous ne voulez pas vous en mêler.",,"Szervusz barátom, nem láttalak még itt eddig. Csak annyi jó tanácsot tudok adni, hogy légy óvatos. Felpörögtek az események az utóbbi időben, és a helydben nem keverednék bele.","Salve amico, non ti ho mai visto da queste parti prima. Posso solo dirti che farei molta attenzione se fossi in te. Stanno succedendo diverse cose, ed è meglio non immischiarsi.","どうも余所者、この辺では見かけない顔だな。 では一杯アドバイスをおごろう。 この付近が自由な発言を 許さないからって下手な真似をするなよ。 オーダーという自警団がすぐに駆けつけてくるぞ。","반갑네, 친구. 낯선 사람인 것 같은데, 조심하고 걸어 다니게나. 지금 이곳에서 꽤 많은 일이 일어났거든. 내가 하는 말을 들으면 이해가 될 걸세.","Hallo vriend, ik heb je hier nog niet eerder gezien. Ik kan alleen maar zeggen dat ik voorzichtig zou zijn als ik jou was, er is veel aan de hand en het is beter als je niet in de weg staat.","Hei, min venn. Jeg har ikke sett deg her tidligere. Alt jeg kan si er at jeg ville vært forsiktig hvis jeg var deg, det er mye som skjer, og det er bedre om du ikke kommer i veien.","Witaj przyjacielu, nie widziałem cię tu wcześniej. Mogę tylko powiedzieć, że na twoim miejscu uważałbym, dużo się dzieje i lepiej, żebyś nie wchodził w drogę.",Olá amigo. Acho que não te vi por aqui antes. Tudo o que posso dizer é que eu tomaria cuidado se eu fosse você. Há muita coisa acontecendo e é melhor não se envolver.,,"Bună prietene, nu te-am mai văzut pe-aici. Tot ce spune e că aș avea grijă pe unde merg, se întâmplă multe prin jur și e mai bine să nu te amesteci.","Привет, дружище. Что-то я не видел тебя тут раньше. Дам тебе один совет: я бы на твоём месте был поосторожнее. Сейчас здесь такое творится, что лучше не высовываться.",,"Hej vän, jag har inte sett dig här förut. Allt jag kan säga är att jag skulle vara försiktig om jag var du, det är mycket på gång och det är bättre om du inte kommer i vägen.","Merhaba dostum, seni daha önce buralarda görmemiştim. Tek söyleyebileceğim, yerinde olsam dikkatli olurdum, çok şey oluyor ve yoluna çıkmazsan daha iyi olur." -Information,TXT_RPLY0_SCRIPT33_D9096_INFOR,〃,,,Informace,,Informationen,,Informoj,Información,,Tietoa.,Des infos.,Információ.,Informazioni,情報,정보를 줘.,Informatie,Informasjon,Informacje,Informações,,Informație,Есть новости?,,,Bilgi +Information,TXT_RPLY0_SCRIPT33_D9096_INFOR,〃,,,Informace,,Informationen,,Informoj,Información,,Tietoa.,Des infos.,,Információ.,Informazioni,情報,정보를 줘.,Informatie,Informasjon,Informacje,Informações,,Informație,Есть новости?,,,Bilgi The sewers hold more than just rats and robots.,TXT_RYES0_SCRIPT33_D9096_THESE,〃,,,Stoky ukrývají víc než jen krysy a roboty.,Kloakkerne rummer mere end bare rotter og robotter.,Die Kanalisation hat mehr zu bieten als Ratten und Roboter.,,"En la kloako ne estas nur ratoj kaj robotoj.","En las alcantarillas hay más -que solo ratas y robots.",,Viemärit pitävät sisällään muutakin kuin vain rottia ja robotteja.,Les égouts contiennent plus que des rats et des robots.,A kanális nem csak patkányokat és robotokat rejteget.,Le fogne contengono molto di più che ratti e robot.,他は...下水道には鼠やロボが沢山だ。,"하수도엔 쥐도 있고, 오물도 있고, 그 중 위험한 로봇들도 있다네.",In het riool zijn meer dan alleen ratten en robots te vinden.,Kloakken rommer mer enn bare rotter og roboter.,Kanały kryją w sobie coś więcej niż tylko szczury i roboty.,Os esgotos abrigam mais do que ratos e robôs.,,Canalele găzduiesc mai mult decât roboți și șobolani.,В канализации водятся не только крысы и роботы.,,Kloakerna rymmer mer än bara råttor och robotar.,Lağımlarda fareler ve robotlardan daha fazlası var. +que solo ratas y robots.",,Viemärit pitävät sisällään muutakin kuin vain rottia ja robotteja.,Les égouts contiennent plus que des rats et des robots.,,A kanális nem csak patkányokat és robotokat rejteget.,Le fogne contengono molto di più che ratti e robot.,他は...下水道には鼠やロボが沢山だ。,"하수도엔 쥐도 있고, 오물도 있고, 그 중 위험한 로봇들도 있다네.",In het riool zijn meer dan alleen ratten en robots te vinden.,Kloakken rommer mer enn bare rotter og roboter.,Kanały kryją w sobie coś więcej niż tylko szczury i roboty.,Os esgotos abrigam mais do que ratos e robôs.,,Canalele găzduiesc mai mult decât roboți și șobolani.,В канализации водятся не только крысы и роботы.,,Kloakerna rymmer mer än bara råttor och robotar.,Lağımlarda fareler ve robotlardan daha fazlası var. Hey a guy's got to make some money. You think these jokers tip well?,TXT_RNO0_SCRIPT33_D9096_HEYAG,〃,,,"Hele, nějak si vydělávat musím. Myslíš, že tihle šašci dávají dobré spropitné?","Hey en fyr skal jo tjene nogle penge. Tror du, at de spassere giver gode drikkepenge?","Hey, mann muss auch sein Auskommen haben, glaubst du, diese Witzbolde geben einem Trinkgeld?",,"Homoj bezonas monon. Ĉu vi atendas bonajn trinkmonojn el ĉi tiaj klaŭnoj?","La gente tiene que comer, ¿o acaso crees que estos -bufones dan buena propina?",,"Hei, jollakin tavalla sitä pitää leipänsä ansaita. Luuletko, että nämä pellet antavat hyvin juomarahaa?","Hé, j'ai besoin de me faire de l'argent, vous savez? Vous croyez que ces salauds me paient bien?","Figyelj, nekem is élni kell valamiből. Azt hiszed ezek a pacákok sok borravalót hagynak itt?","Ehi, devo pure riuscire a mettere qualcosa da parte. Pensi che i clienti qua diano laute mance?","ちょっと男はお金を稼ぐんだ。 +bufones dan buena propina?",,"Hei, jollakin tavalla sitä pitää leipänsä ansaita. Luuletko, että nämä pellet antavat hyvin juomarahaa?","Hé, j'ai besoin de me faire de l'argent, vous savez? Vous croyez que ces salauds me paient bien?",,"Figyelj, nekem is élni kell valamiből. Azt hiszed ezek a pacákok sok borravalót hagynak itt?","Ehi, devo pure riuscire a mettere qualcosa da parte. Pensi che i clienti qua diano laute mance?","ちょっと男はお金を稼ぐんだ。 あなたはこれらのジョーカーがうまく傾くと 思いますか?",먹고 살려면 돈이 필요하다네. 이 손님들은 팁도 안 준다니까!,"Hé, een man moet wat geld verdienen. Denk je dat deze grappenmakers een goede fooi geven?","Hei, en fyr må tjene litt penger. Tror du disse jokerne gir bra med tips?","Hej facet musi zarobić trochę pieniędzy. Myślisz, że ci żartownisie dobrze dają napiwki?","Ei, preciso ganhar uma grana. Você acha que esses palhaços dão bastante gorjeta?",,Hei un om are nevoie și de bani. Crezi că glumeții ăștia au sfaturi bune?,"Заработай немного денег, парень. Или ты думаешь, что все эти шутники щедро платят?",,Hej en kille måste ju tjäna lite pengar. Tror du att de här skojarna ger bra dricks?,"Hey, bir adam biraz para kazanmalı. Bu şakacıların iyi bahşiş verdiğini mi düşünüyorsun?" -"Back again huh? Well, at least you know enough to keep your own skin intact. What can I do for you now?",TXT_DLG_SCRIPT33_D10612_BACKA,〃,,,"Zase zpátky, co? No, aspoň víš, jak si udržet kožich netknutý. Co pro tebe mohu udělat?","Tilbage igen, hva'? I det mindste ved du nok til at holde din egen hud intakt. Hvad kan jeg gøre for dig nu?","Schon wieder zurück, was? Na, wenigstens weißt du inzwischen, wie du das mit heiler Haut hinkriegst. Was kann ich jetzt für dich tun?",,"Do vi revenis. Nu, vi almenaŭ scias sufiĉe por eviti, ke vi estu vundita. Kion mi nun faru por vi?","De vuelta otra vez, ¿eh? Bueno, al menos sabes lo suficiente para mantener tu pellejo intacto. ¿Qué puedo ofrecerte ahora?",,"Kas, tulit takaisin? Näköjään sen verran älliä päässä, että kykenet itsesi hengissä pitämään. Mutta mitä saisi nyt olla?","Déjà de retour, hein? Au moins vous savez sauver votre peau. Que puis-je faire pour vous?","Már visszatértél, mi? Legalább tudsz vigyázni az irhádra. Mit tehetek érted?","Già di ritorno, eh? Beh, almeno ciò che sai ti sta tornando utile per rimanere vivo. Cosa posso fare per te ora?","また戻ってね? +"Back again huh? Well, at least you know enough to keep your own skin intact. What can I do for you now?",TXT_DLG_SCRIPT33_D10612_BACKA,〃,,,"Zase zpátky, co? No, aspoň víš, jak si udržet kožich netknutý. Co pro tebe mohu udělat?","Tilbage igen, hva'? I det mindste ved du nok til at holde din egen hud intakt. Hvad kan jeg gøre for dig nu?","Schon wieder zurück, was? Na, wenigstens weißt du inzwischen, wie du das mit heiler Haut hinkriegst. Was kann ich jetzt für dich tun?",,"Do vi revenis. Nu, vi almenaŭ scias sufiĉe por eviti, ke vi estu vundita. Kion mi nun faru por vi?","De vuelta otra vez, ¿eh? Bueno, al menos sabes lo suficiente para mantener tu pellejo intacto. ¿Qué puedo ofrecerte ahora?",,"Kas, tulit takaisin? Näköjään sen verran älliä päässä, että kykenet itsesi hengissä pitämään. Mutta mitä saisi nyt olla?","Déjà de retour, hein? Au moins vous savez sauver votre peau. Que puis-je faire pour vous?",,"Már visszatértél, mi? Legalább tudsz vigyázni az irhádra. Mit tehetek érted?","Già di ritorno, eh? Beh, almeno ciò che sai ti sta tornando utile per rimanere vivo. Cosa posso fare per te ora?","また戻ってね? まあ、少なくともあなたは自分の肌を 損なわないようにするのに十分知っています。 私は今あなたのために何ができますか?","다시 돌아온 건가? 뭐, 자기 몸 간수 잘하고 살아 돌아왔기에 망정이지. 뭘 원하나?","Weer terug, hè? Nou ja, je weet tenminste genoeg om je eigen huid intact te houden. Wat kan ik nu voor je doen?","Tilbake igjen, hva? Du vet i det minste nok til å holde ditt eget skinn intakt. Hva kan jeg gjøre for deg nå?","Znowu to samo? Przynajmniej wiesz wystarczająco dużo, aby zachować własną skórę w nienaruszonym stanie. Co mogę dla ciebie zrobić?","Já voltou, é? Bom, pelo menos você sabe o suficiente para manter sua pele intacta. O que mais posso fazer por você?",,"Te-ai întors din nou, hă? Păi, măcar cunoști destule cât să rămâi întreg. Ce pot face pentru tine?","Снова ты? Ну что ж, ты хотя бы знаешь, как шкуру сберечь. Что я могу тебе предложить?",,"Tillbaka igen, va? Du vet åtminstone tillräckligt för att hålla ditt eget skinn intakt. Vad kan jag göra för dig nu?",Yine mi döndün? En azından kendi derini sağlam tutacak kadar biliyorsun. Şimdi senin için ne yapabilirim? -More info,TXT_RPLY0_SCRIPT33_D10612_MOREI,〃,,,Další informace,Mere info,Mehr Informationen.,,Pliaj informoj,Más información,,Lisää tietoa.,Plus d'infos.,Több információ.,Altre informazioni,話のネタ。,그 외의 정보를 줘.,Meer info,Mer info,Więcej informacji,Mais informações.,,Mai multă informație,Расскажи больше,,Mer information,Daha fazla bilgi +More info,TXT_RPLY0_SCRIPT33_D10612_MOREI,〃,,,Další informace,Mere info,Mehr Informationen.,,Pliaj informoj,Más información,,Lisää tietoa.,Plus d'infos.,,Több információ.,Altre informazioni,話のネタ。,그 외의 정보를 줘.,Meer info,Mer info,Więcej informacji,Mais informações.,,Mai multă informație,Расскажи больше,,Mer information,Daha fazla bilgi The Governor is a simple reminder of the Order's influence.,TXT_RYES0_SCRIPT33_D10612_THEGO,〃,,,Guvernér je jednoduchou připomínkou vlivu Řádu.,Guvernøren er en simpel påmindelse om Ordenens indflydelse.,Der Gouverneur ist eine einfache Erinnering an die Macht des Ordens.,,"La registo estas nur simbolo pri la influo de La Ordeno.","El gobernador solo es un símbolo de la influencia -de La Orden.",,Kuvernööri on selvä muistutus Veljeskunnan vaikutusvallasta.,Le gouverneur d'est qu'un rappel de l'influence de l'ordre.,A Kormányzó csak a Rend hatalmának bábja.,Il governatore è solo un simbolo dell'influenza dell'Ordine.,知事は俺達に自由はないと思い出させる象徴さ。,모렐 총독은 부정하고 짜증 나는 오더의 정권의 예야.,De gouverneur is een eenvoudige herinnering aan de invloed van de Orde.,Guvernøren er en enkel påminnelse om ordenens innflytelse.,Gubernator to proste przypomnienie o wpływach Zakonu.,O governador é um simples lembrete da influência da Ordem.,,Guvernatorul e o simplă reamintire a influenței Ordinului.,Губернатор — живое напоминание о власти Ордена.,,Guvernören är en enkel påminnelse om ordens inflytande.,"Vali, Tarikat'ın etkisinin basit bir hatırlatıcısıdır." +de La Orden.",,Kuvernööri on selvä muistutus Veljeskunnan vaikutusvallasta.,Le gouverneur d'est qu'un rappel de l'influence de l'ordre.,,A Kormányzó csak a Rend hatalmának bábja.,Il governatore è solo un simbolo dell'influenza dell'Ordine.,知事は俺達に自由はないと思い出させる象徴さ。,모렐 총독은 부정하고 짜증 나는 오더의 정권의 예야.,De gouverneur is een eenvoudige herinnering aan de invloed van de Orde.,Guvernøren er en enkel påminnelse om ordenens innflytelse.,Gubernator to proste przypomnienie o wpływach Zakonu.,O governador é um simples lembrete da influência da Ordem.,,Guvernatorul e o simplă reamintire a influenței Ordinului.,Губернатор — живое напоминание о власти Ордена.,,Guvernören är en enkel påminnelse om ordens inflytande.,"Vali, Tarikat'ın etkisinin basit bir hatırlatıcısıdır." Come back if you change your mind.,TXT_RNO0_SCRIPT33_D10612_COMEB,〃,,,"Vrať se, pokud změníš názor.","Kom tilbage, hvis du skifter mening.","Komm zurück, wenn du deine Meinung geändert hast.",,"Revenu kiam -vi ŝanĝos ideon.",Vuelve si cambias de idea.,,"Puhutaan taas, jos tulet toisiin aatoksiin.",Revenez si vous changez d'avis.,Gyere vissza ha változik a véleményed.,Torna pure se cambi idea.,気が変わったら戻ってきな。,마음이 바뀌면 돌아와주게나.,Kom terug als u van gedachten verandert.,Kom tilbake hvis du ombestemmer deg.,"Wróć, jeśli zmienisz zdanie.",Volte quando mudar de idéia.,,Întoarce-te dacă te răzgândești.,Передумаешь — возвращайся.,,Kom tillbaka om du ändrar dig.,Fikrini değiştirirsen geri gel. -"Well, you're sure asking a lot of questions for someone who's lived this long. That's ok though, I'd rather talk to someone like you than most of this lot.",TXT_DLG_SCRIPT33_D12128_WELLY,〃,,,"Na někoho, kdo přežil takhle dlouho, se ptáš docela hodně. To je v pořádku, radši bych se bavil s tebou než s většinou těhle lidí.","Du stiller virkelig mange spørgsmål af en, der har levet så længe. Det er dog ok, jeg vil hellere tale med en som dig end med de fleste af dem her.","Du stellst eine Menge Fragen für jemanden, der schon so lange überlebt hat. Das ist ok, ich rede lieber mit jemandem wie dir als mit dem Rest der Typen da.",,"Nu, vi sendube faras multe da demandoj, kvankam vi vivis tiel longe. Mi ne plendas, mi preferus paroli kun iu kiel vi anstataŭ la ĉi-tiea plimulto.","Bueno, ciertamente estás haciendo muchas preguntas para alguien que ha vivido tanto. Aunque eso es bueno, preferiría hablar con alquien como tú que con la mayoría de esta gente.",,"No, kyllläpä paljon kyselet sellaiseksi, joka näin pitkään on hengissä säilynyt. Mutta ei se mitään; mieluummin puhun jonkun sinun kaltaisesi kuin suurimman osan kanssa tätä porukkaa.","Vous posez beacoup de questions pour quelqu'un qui a survécu aussi longtemps. Ca me convient, je préfère parler à quelqu'un comme vous qu'a la majorité de ces idiots.","Ahhoz képest, hogy eddig éltél, elég sok kédést teszel fel. Igazából nem probléma, szívesebben beszélek veled mint mással itt.","Beh, fai davvero tante domande, per uno che è ancora vivo. Ma a me sta bene, molto meglio parlare con te rispetto agli altri che stanno qui...","所で、アンタは死に行かない人達に +vi ŝanĝos ideon.",Vuelve si cambias de idea.,,"Puhutaan taas, jos tulet toisiin aatoksiin.",Revenez si vous changez d'avis.,,Gyere vissza ha változik a véleményed.,Torna pure se cambi idea.,気が変わったら戻ってきな。,마음이 바뀌면 돌아와주게나.,Kom terug als u van gedachten verandert.,Kom tilbake hvis du ombestemmer deg.,"Wróć, jeśli zmienisz zdanie.",Volte quando mudar de idéia.,,Întoarce-te dacă te răzgândești.,Передумаешь — возвращайся.,,Kom tillbaka om du ändrar dig.,Fikrini değiştirirsen geri gel. +"Well, you're sure asking a lot of questions for someone who's lived this long. That's ok though, I'd rather talk to someone like you than most of this lot.",TXT_DLG_SCRIPT33_D12128_WELLY,〃,,,"Na někoho, kdo přežil takhle dlouho, se ptáš docela hodně. To je v pořádku, radši bych se bavil s tebou než s většinou těhle lidí.","Du stiller virkelig mange spørgsmål af en, der har levet så længe. Det er dog ok, jeg vil hellere tale med en som dig end med de fleste af dem her.","Du stellst eine Menge Fragen für jemanden, der schon so lange überlebt hat. Das ist ok, ich rede lieber mit jemandem wie dir als mit dem Rest der Typen da.",,"Nu, vi sendube faras multe da demandoj, kvankam vi vivis tiel longe. Mi ne plendas, mi preferus paroli kun iu kiel vi anstataŭ la ĉi-tiea plimulto.","Bueno, ciertamente estás haciendo muchas preguntas para alguien que ha vivido tanto. Aunque eso es bueno, preferiría hablar con alquien como tú que con la mayoría de esta gente.",,"No, kyllläpä paljon kyselet sellaiseksi, joka näin pitkään on hengissä säilynyt. Mutta ei se mitään; mieluummin puhun jonkun sinun kaltaisesi kuin suurimman osan kanssa tätä porukkaa.","Vous posez beacoup de questions pour quelqu'un qui a survécu aussi longtemps. Ca me convient, je préfère parler à quelqu'un comme vous qu'a la majorité de ces idiots.",,"Ahhoz képest, hogy eddig éltél, elég sok kédést teszel fel. Igazából nem probléma, szívesebben beszélek veled mint mással itt.","Beh, fai davvero tante domande, per uno che è ancora vivo. Ma a me sta bene, molto meglio parlare con te rispetto agli altri che stanno qui...","所で、アンタは死に行かない人達に 聞き回ってる様だが。悪いことは言わねえ、 あんまし死に急ぐんじゃねえぞ。","아주 오래 살아서 배짱이 두둑한가, 다시 돌아와 줬구먼! 나야말로 괜찮다네. 이 주정부리들 보다 자네랑 대화하는 게 그나마 낫지.","Nou, je stelt zeker veel vragen aan iemand die zo lang heeft geleefd. Maar dat is niet erg, ik praat liever met iemand zoals jij dan met de meeste van deze mensen.","Du stiller mange spørsmål til å være en som har levd så lenge. Men det er greit, jeg vil heller snakke med en som deg enn de fleste av disse.","Zadajesz dużo pytań jak na kogoś, kto żyje tak długo. W porządku. Wolę rozmawiać z kimś takim jak ty niż z większością tych ludzi.","Bem, para alguém que conseguiu viver bastante você certamente faz muitas perguntas. Mas tudo bem, eu prefiro conversar com alguém como você do que com a maioria destes caras.",,"Păi, cu sigranță pui multe întrebări pentru cineva care a trăit atât. E în regulă însă, prefer să vorbesc cu cineva ca tine decât cu grămada asta.","Да, для человека, который прожил так долго, ты задаёшь многовато вопросов. Впрочем, это неплохо: я бы скорее предпочёл говорить с кем-то вроде тебя, чем с местными.",,"Du ställer verkligen många frågor för någon som har levt så här länge. Men det är okej, jag pratar hellre med någon som dig än med de flesta av de här.","Bu kadar uzun yaşamış biri için çok fazla soru soruyorsun. Yine de sorun değil, buradakilerin çoğuyla konuşmaktansa senin gibi biriyle konuşmayı tercih ederim." -More info.,TXT_RPLY0_SCRIPT33_D12128_MOREI,〃,,,Další informace,Mere info.,Mehr Informationen.,,Pliaj informoj.,Más información.,,Lisää tietoa.,Plus d'infos.,Több információ.,Altre informazioni,話のネタ。,더 많은 정보를 줘.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Говори дальше.,,Mer information.,Daha fazla bilgi. +More info.,TXT_RPLY0_SCRIPT33_D12128_MOREI,〃,,,Další informace,Mere info.,Mehr Informationen.,,Pliaj informoj.,Más información.,,Lisää tietoa.,Plus d'infos.,,Több információ.,Altre informazioni,話のネタ。,더 많은 정보를 줘.,Meer info.,Mer informasjon.,Więcej informacji.,Mais informações.,,Mai multă informație.,Говори дальше.,,Mer information.,Daha fazla bilgi. There's more to the Order than what goes on around here.,TXT_RYES0_SCRIPT33_D12128_THERE,〃,,,"Za Řádem se toho skrývá víc, než tady vidíš.","Der er mere i Ordenen end det, der foregår her.","Hinter dem Orden steckt mehr, als es den Anschein hat.",,"Estas pli pri La Ordeno ol tio, kio okazas ĉi tie.","Hay más de La Orden -que lo que pasa por aquí.",,"Veljeskunnan toiminta ei rajoitu vain siihen, mitä täällä tapahtuu.",L'Ordre cache beaucoup plus que ce qui ne se passe ici.,"A Rend mögött több áll, mint amit az emberek pletykálnak.",C'è sotto molto di più sull'Ordine rispetto a quello che succede qua.,オーダーは見えてる以上に強大だ。,여기저기 퍼지는 소문보다 오더가 지키는 비밀이 더 깊숙하다네.,De Orde heeft meer te bieden dan wat er hier gebeurt.,Ordenen er mer enn bare det som foregår her.,"Zakon to coś więcej niż to, co dzieje się tutaj.",Há mais sobre a Ordem do que acontece por aqui.,,Sunt mai multe lucruri care țin de Ordin decât ceea ce se petrece în jur.,"Орден — нечто большее, чем кажется.",,Det finns mer i Orden än vad som händer här.,Tarikat'ta burada olanlardan daha fazlası var. +que lo que pasa por aquí.",,"Veljeskunnan toiminta ei rajoitu vain siihen, mitä täällä tapahtuu.",L'Ordre cache beaucoup plus que ce qui ne se passe ici.,,"A Rend mögött több áll, mint amit az emberek pletykálnak.",C'è sotto molto di più sull'Ordine rispetto a quello che succede qua.,オーダーは見えてる以上に強大だ。,여기저기 퍼지는 소문보다 오더가 지키는 비밀이 더 깊숙하다네.,De Orde heeft meer te bieden dan wat er hier gebeurt.,Ordenen er mer enn bare det som foregår her.,"Zakon to coś więcej niż to, co dzieje się tutaj.",Há mais sobre a Ordem do que acontece por aqui.,,Sunt mai multe lucruri care țin de Ordin decât ceea ce se petrece în jur.,"Орден — нечто большее, чем кажется.",,Det finns mer i Orden än vad som händer här.,Tarikat'ta burada olanlardan daha fazlası var. Come back if you change your mind.,TXT_RNO0_SCRIPT33_D12128_COMEB,〃,,,"Vrať se, pokud změníš názor.","Kom tilbage, hvis du skifter mening.","Komm zurück, wenn du deine Meinung geändert hast.",,"Revenu kiam -vi ŝanĝos ideon.",Vuelve si cambias de idea.,,"Jos muutat mielesi, palataan asiaan.",Revenez si vous changez d'avis.,"Gyere vissza, ha meggondoltad magad.",Ritorna semmai cambi idea.,気が変わったら戻ってきな。,생각이 바뀌면 다시 돌아오게나.,Kom terug als je van gedachten verandert.,Kom tilbake hvis du ombestemmer deg.,"Wróć, jeśli zmienisz zdanie.",Volte quando mudar de idéia.,,Întoarce-te dacă te răzgândești.,Передумаешь — возвращайся.,,Kom tillbaka om du ändrar dig.,Fikrini değiştirirsen geri gel. -"That's it friend, the well of knowledge has been tapped. I've told you more than I should have anyway.",TXT_DLG_SCRIPT33_D13644_THATS,〃,,,"A to je vše, příteli, studnice mé moudrosti vyschla. Stejně jsem ti řekl víc, než jsem měl.","Det var det, min ven, vidensbrønden er blevet tappet. Jeg har alligevel fortalt dig mere, end jeg burde have gjort.","Das ist es, Freund, der Brunnen des Wissens ist versiegt. Ich habe dir schon mehr gesagt, als ich eigentlich sollte.",,"Jen ĉio, amiko, la fonto de scio sekiĝis. Malgraŭ tio, mi diris al vi pli ol tiom, kiom mi devus.","Ya está, amigo, el pozo del conocimiento ya se ha secado. De todas formas ya te he dicho más de lo que debería.","Ya está, amigo, el pozo del conocimiento ya se secó. De todas formas ya te dije más de lo que debería.","Siinä kaikki, ystävä. Tiedon lähde on ehtynyt. Olen kertonut sinulle joka tapauksessa enemmän kuin olisi pitänytkään.","C'est tout, mon ami. Le puits de la sagesse s'est tari. Je vous en ai trop dit de toutes manières.","Ennyi volt barátom, a tudás forrása elapadt. Már így is többet mondtam a kelleténél.","È tutto, amico, ho esaurito le cose che avevo da dirti. Ti ho già detto più di quanto avrei dovuto.","これはこれは親友、心得の瓶は切らしてるぞ。 +vi ŝanĝos ideon.",Vuelve si cambias de idea.,,"Jos muutat mielesi, palataan asiaan.",Revenez si vous changez d'avis.,,"Gyere vissza, ha meggondoltad magad.",Ritorna semmai cambi idea.,気が変わったら戻ってきな。,생각이 바뀌면 다시 돌아오게나.,Kom terug als je van gedachten verandert.,Kom tilbake hvis du ombestemmer deg.,"Wróć, jeśli zmienisz zdanie.",Volte quando mudar de idéia.,,Întoarce-te dacă te răzgândești.,Передумаешь — возвращайся.,,Kom tillbaka om du ändrar dig.,Fikrini değiştirirsen geri gel. +"That's it friend, the well of knowledge has been tapped. I've told you more than I should have anyway.",TXT_DLG_SCRIPT33_D13644_THATS,〃,,,"A to je vše, příteli, studnice mé moudrosti vyschla. Stejně jsem ti řekl víc, než jsem měl.","Det var det, min ven, vidensbrønden er blevet tappet. Jeg har alligevel fortalt dig mere, end jeg burde have gjort.","Das ist es, Freund, der Brunnen des Wissens ist versiegt. Ich habe dir schon mehr gesagt, als ich eigentlich sollte.",,"Jen ĉio, amiko, la fonto de scio sekiĝis. Malgraŭ tio, mi diris al vi pli ol tiom, kiom mi devus.","Ya está, amigo, el pozo del conocimiento ya se ha secado. De todas formas ya te he dicho más de lo que debería.","Ya está, amigo, el pozo del conocimiento ya se secó. De todas formas ya te dije más de lo que debería.","Siinä kaikki, ystävä. Tiedon lähde on ehtynyt. Olen kertonut sinulle joka tapauksessa enemmän kuin olisi pitänytkään.","C'est tout, mon ami. Le puits de la sagesse s'est tari. Je vous en ai trop dit de toutes manières.",,"Ennyi volt barátom, a tudás forrása elapadt. Már így is többet mondtam a kelleténél.","È tutto, amico, ho esaurito le cose che avevo da dirti. Ti ho già detto più di quanto avrei dovuto.","これはこれは親友、心得の瓶は切らしてるぞ。 とにかく俺が知ってる話はこれで全部だ。",이게 다일세. 내가 친히 줄 수 있는 조언이라는 이름의 술은 다 줬다네.,"Dat is het vriend, de bron van kennis is aangeboord. Ik heb je meer verteld dan ik toch al zou moeten hebben.","Det var det, min venn. Kunnskapens brønn er tappet. Jeg har fortalt deg mer enn jeg burde uansett.","To wszystko przyjacielu, studnia wiedzy została wyczerpana. I tak powiedziałem ci więcej niż powinienem.","É isso, amigo. O poço de conhecimento já secou. Já te contei mais do que eu deveria, de qualquer forma.",,"Gata prietene, fântâna a secat. Ți-am spus mai multe decât ar fi trebuit oricum.","Это всё, дружище. Кладезь мудрости исчерпан. Я и так рассказал тебе больше, чем следовало.",,"Det var allt, min vän, kunskapens källa har blivit tömd. Jag har berättat mer än jag borde ha gjort i alla fall.","Bu kadar dostum, bilgi kuyusu doldu. Zaten sana söylemem gerekenden fazlasını söyledim." -Hard to shop for new toys... when you're broke. Run a little errand for me and you'll get more than you could ever spend. I'll make you a rich man.,TXT_DLG_SCRIPT33_D15160_HARDT,MAP33: Harris (beginning).,,,"Nové hračky se shánějí jen těžko... když jsi švorc. Udělej pro mě malou prácičku a dostaneš víc, než kolik bys mohl kdy utratit. Udělám z tebe boháče.","Det er svært at købe nyt legetøj, når man er flad. Gør et lille ærinde for mig, og du vil få mere, end du nogensinde vil kunne bruge. Jeg vil gøre dig til en rig mand.","Ist es nicht schwierig, an neue Sachen zu kommen, wenn du pleite bist? Tu mir einen Gefallen und du kannst mehr Gold kriegen, als du jemals ausgeben kannst. Ich mache dich reich.",,"Estas malfacile aĉeti novajn ludilojn... kiam oni estas senmona. Plenumu simplan komision por mi kaj vi gajnos pli ol tiom, kiom oni povus eĉ elspezi: mi faros vin riĉulo.",Difícil comprarse nuevos juguetes... cuando se está sin blanca. Haz un recado para mí y ganarás más de lo que puedas gastarte: te haré un hombre rico.,Difícil comprarse nuevos juguetes... cuando se está pobre. Haz un encargo para mí y vas a ganar más de lo que puedas gastarte: te voy a hacer un hombre rico.,"Vaikea ostaa uusia leluja, kun on peeaa. Käytkö hoitamassa minulle yhden asian, niin tienaat enemmän kuin pystyt ikinä kuluttamaan. Teen sinusta kroisoksen.",Difficile de s'acheter de nouveaux joujous quand on n'a plus de sous. Faites-moi une petite course et vous aurez plus que vous ne pourrez jamais dépenser. Je vous rendrai riche.,"Nehéz úgy új játékszereket beszerezni, ha ennyire nincs pénzed. Viszont ha megteszel nekem egy szívességet, annyi pénzed lesz amit el se tudsz költeni. Gazdaggá teszlek.","È difficile comprare nuovi giocattoli... quando non hai la grana. Se fai un piccolo favore per me, potrai avere così tanti soldi da non sapere come spenderli. Ti renderò un uomo molto ricco.","新しい玩具も買えないぐらい...貧しそうだな +Hard to shop for new toys... when you're broke. Run a little errand for me and you'll get more than you could ever spend. I'll make you a rich man.,TXT_DLG_SCRIPT33_D15160_HARDT,MAP33: Harris (beginning).,,,"Nové hračky se shánějí jen těžko... když jsi švorc. Udělej pro mě malou prácičku a dostaneš víc, než kolik bys mohl kdy utratit. Udělám z tebe boháče.","Det er svært at købe nyt legetøj, når man er flad. Gør et lille ærinde for mig, og du vil få mere, end du nogensinde vil kunne bruge. Jeg vil gøre dig til en rig mand.","Ist es nicht schwierig, an neue Sachen zu kommen, wenn du pleite bist? Tu mir einen Gefallen und du kannst mehr Gold kriegen, als du jemals ausgeben kannst. Ich mache dich reich.",,"Estas malfacile aĉeti novajn ludilojn... kiam oni estas senmona. Plenumu simplan komision por mi kaj vi gajnos pli ol tiom, kiom oni povus eĉ elspezi: mi faros vin riĉulo.",Difícil comprarse nuevos juguetes... cuando se está sin blanca. Haz un recado para mí y ganarás más de lo que puedas gastarte: te haré un hombre rico.,Difícil comprarse nuevos juguetes... cuando se está pobre. Haz un encargo para mí y vas a ganar más de lo que puedas gastarte: te voy a hacer un hombre rico.,"Vaikea ostaa uusia leluja, kun on peeaa. Käytkö hoitamassa minulle yhden asian, niin tienaat enemmän kuin pystyt ikinä kuluttamaan. Teen sinusta kroisoksen.",Difficile de s'acheter de nouveaux joujous quand on n'a plus de sous. Faites-moi une petite course et vous aurez plus que vous ne pourrez jamais dépenser. Je vous rendrai riche.,,"Nehéz úgy új játékszereket beszerezni, ha ennyire nincs pénzed. Viszont ha megteszel nekem egy szívességet, annyi pénzed lesz amit el se tudsz költeni. Gazdaggá teszlek.","È difficile comprare nuovi giocattoli... quando non hai la grana. Se fai un piccolo favore per me, potrai avere così tanti soldi da non sapere come spenderli. Ti renderò un uomo molto ricco.","新しい玩具も買えないぐらい...貧しそうだな アンタ。良い儲け話があるぜ。 俺のちょっとした仕事でガッポガポだぞ。",여기저기 장난감을 살려면 돈이 필요하지. 세상에 공짜가 어디 있나? 내 심부름을 좀 하다 보면 용돈도 생기고 부자가 될 걸세. 어떤가?,Moeilijk om nieuw speelgoed te kopen.... als je blut bent. Doe een kleine boodschap voor me en je krijgt meer dan je ooit zou kunnen uitgeven. Ik zal je een rijk man maken.,"Vanskelig å kjøpe nye leker... når man er blakk. Gjør et lite ærend for meg, så får du mer enn du kan bruke. Jeg skal gjøre deg rik.","Trudno jest kupować nowe zabawki... kiedy jest się spłukanym. Zrób dla mnie małe zlecenie, a dostaniesz więcej niż mógłbyś kiedykolwiek wydać. Zrobię z ciebie bogatego człowieka.","É difícil comprar brinquedos novos... quando você está duro. Se você fizer um favor pra mim, você vai ganhar mais do que jamais conseguiria gastar. Vou fazer de você um homem rico.",,Greu să cumperi jucarii noi... când ești falit. Dar faci o mică treabă pentru mine și o să fii putred de bogat.,"Трудновато покупать игрушки, когда нет и гроша за душой... Выполни одно заданьице для меня, и ты заработаешь столько, сколько в твоих карманах сроду не водилось. Ты будешь богатым!",,Svårt att handla nya leksaker när man är pank. Gör ett litet ärende åt mig och du får mer än du någonsin kan spendera. Jag gör dig till en rik man.,"Beş parasızken yeni oyuncaklar için alışveriş yapmak zor. Benim için ufak bir iş yaparsan, harcayabileceğinden fazlasını alırsın. Seni zengin bir adam yapacağım." -I got nothing better to do.,TXT_RPLY0_SCRIPT33_D15160_IGOTN,〃,,,Nemám nic lepšího na práci.,Jeg har intet bedre at lave.,Ich habe nichts besseres zu tun.,,Mi havas nenian farindaĵon.,No tengo nada mejor que hacer.,,Ei minulla parempaakaan tekemistä ole.,Je n'ai rien de mieux à faire.,Nincs jobb dolgom úgy sem.,Non ho di meglio da fare.,何もしないよりはいいか。,저는 할 것이 아무것도 없어요.,Ik heb niets beters te doen.,Jeg har ikke noe bedre å gjøre.,Nie mam nic lepszego do roboty.,Não tenho nada melhor pra fazer.,,N-am nimic mai bun de făcut.,Заманчивое предложение.,,Jag har inget bättre att göra.,Yapacak daha iyi bir işim yok. -No thanks.,TXT_RPLY1_SCRIPT33_D15160_NOTHA,〃,,,"Ne, díky.",Nej tak.,"Nein, danke.",,"Ne, dankon.","No, gracias.",,Ei kiitos.,Non merci.,Nem kösz.,No grazie.,いらない。,아뇨 괜찮습니다.,"Nee, bedankt.",Ellers takk.,"Nie, dziękuję.","Não, obrigado.",,Nu merci.,"Нет, спасибо.",,Jag har inget bättre för mig.,"Hayır, teşekkürler." -Nobody walks away from me!,TXT_RYES1_SCRIPT33_D15160_NOBOD,〃,,,Ode mě nikdo neodchází!,Ingen går væk fra mig!,Niemand sagt Nein zu mir.,,Neniu preterpasas min!,¡Nadie pasa de mí!,,Kukaan ei käännä selkäänsä minulle!,Personne ne se barre après mon offre!,Senki sem sétál el előlem!,Nessuno fa l'impertinente con me!,俺から逃げられると思ってるのか!,그 누구도 나를 거절할 수 없어!,Niemand loopt weg van mij!,Ingen går fra meg!,Nikt ode mnie nie odchodzi!,Ninguém me ignora!,,Nimeni nu scapă de mine!,От меня ещё никто не уходил!,,Ingen går ifrån mig!,Kimse benden kaçamaz! -"Good choice. The Order's sanctuary by the river is their unofficial torture chamber. Hidden inside there's a golden chalice. You swipe it, you meet me at the tavern, and reap your reward.",TXT_DLG_SCRIPT33_D16676_GOODC,〃,,,"Dobrá volba. Svatyně Řádu u řeky je jejich neoficiální mučírna. Uvnitř je skrytý zlatý kalich. Sebereš ho, sejdeš se se mnou v taverně a vyzvedneš si svou odměnu.","Godt valg. Ordenens fristed ved floden er deres uofficielle torturkammer. Der er en gylden bæger gemt derinde. Du tager den, du møder mig på kroen og høster din belønning.",Gute Wahl. Das Heiligtum des Ordens bei dem Fluss ist ihre inoffiziele Folterkammer. Darin versteckt ist ein goldener Kelch. Du klaust ihn und erntest deinen Lohn.,,Bona elekto. La sanktejo de La Ordeno ĉe la rojo estas ĝia neoficiala torturejo. En ĝi estas kaŝita ora kaliko. Portu ĝin al mi en la taverno kaj vi havos rekompencon.,"Buena elección. El santuario de La Orden junto al arroyo es su cámara de tortura extraoficial. Dentro hay un cáliz dorado escondido. Cógelo, llévamelo a la taberna y tendrás tu recompensa.","Buena elección. El santuario de La Orden junto al río es su cámara de tortura extraoficial. Adentro hay un cáliz dorado escondido. Si lo tomas y me lo llevas a la taberna, tu recompensa.","Viisas päätös. Veljeskunnan pyhäkkö joen varrella on heidän epävirallinen kidutuskammionsa, jonka kätköissä piilee kultakalkki. Kähvellä se ja saat vaivannäöstäsi palkan.",Bon choix. Le sanctuaire de l'ordre près de la rivière est leur chambre torture.. officieusement. A l'intérieur se trouve un calice en or. Récupérez le et venez prendre votre récompense.,"Jó választás. A Rend folyó melletti szentélye valójában a nem hivatalos kínzó kamrájuk. Elrejtve belül található egy arany serleg. Csend el szépen, és a kocsmánál találkozunk, lepasszolom a jutalmad.",Ottima scelta. Il santuario dell'Ordine vicino al fiume è la loro camera della tortura. Vi è un calice d'oro nascosto là dentro. Prendilo e avrai una lauta ricompensa.,"良い判断だ。川沿いにある オーダーの聖域 は +I got nothing better to do.,TXT_RPLY0_SCRIPT33_D15160_IGOTN,〃,,,Nemám nic lepšího na práci.,Jeg har intet bedre at lave.,Ich habe nichts besseres zu tun.,,Mi havas nenian farindaĵon.,No tengo nada mejor que hacer.,,Ei minulla parempaakaan tekemistä ole.,Je n'ai rien de mieux à faire.,,Nincs jobb dolgom úgy sem.,Non ho di meglio da fare.,何もしないよりはいいか。,저는 할 것이 아무것도 없어요.,Ik heb niets beters te doen.,Jeg har ikke noe bedre å gjøre.,Nie mam nic lepszego do roboty.,Não tenho nada melhor pra fazer.,,N-am nimic mai bun de făcut.,Заманчивое предложение.,,Jag har inget bättre att göra.,Yapacak daha iyi bir işim yok. +No thanks.,TXT_RPLY1_SCRIPT33_D15160_NOTHA,〃,,,"Ne, díky.",Nej tak.,"Nein, danke.",,"Ne, dankon.","No, gracias.",,Ei kiitos.,Non merci.,,Nem kösz.,No grazie.,いらない。,아뇨 괜찮습니다.,"Nee, bedankt.",Ellers takk.,"Nie, dziękuję.","Não, obrigado.",,Nu merci.,"Нет, спасибо.",,Jag har inget bättre för mig.,"Hayır, teşekkürler." +Nobody walks away from me!,TXT_RYES1_SCRIPT33_D15160_NOBOD,〃,,,Ode mě nikdo neodchází!,Ingen går væk fra mig!,Niemand sagt Nein zu mir.,,Neniu preterpasas min!,¡Nadie pasa de mí!,,Kukaan ei käännä selkäänsä minulle!,Personne ne se barre après mon offre!,,Senki sem sétál el előlem!,Nessuno fa l'impertinente con me!,俺から逃げられると思ってるのか!,그 누구도 나를 거절할 수 없어!,Niemand loopt weg van mij!,Ingen går fra meg!,Nikt ode mnie nie odchodzi!,Ninguém me ignora!,,Nimeni nu scapă de mine!,От меня ещё никто не уходил!,,Ingen går ifrån mig!,Kimse benden kaçamaz! +"Good choice. The Order's sanctuary by the river is their unofficial torture chamber. Hidden inside there's a golden chalice. You swipe it, you meet me at the tavern, and reap your reward.",TXT_DLG_SCRIPT33_D16676_GOODC,〃,,,"Dobrá volba. Svatyně Řádu u řeky je jejich neoficiální mučírna. Uvnitř je skrytý zlatý kalich. Sebereš ho, sejdeš se se mnou v taverně a vyzvedneš si svou odměnu.","Godt valg. Ordenens fristed ved floden er deres uofficielle torturkammer. Der er en gylden bæger gemt derinde. Du tager den, du møder mig på kroen og høster din belønning.",Gute Wahl. Das Heiligtum des Ordens bei dem Fluss ist ihre inoffiziele Folterkammer. Darin versteckt ist ein goldener Kelch. Du klaust ihn und erntest deinen Lohn.,,Bona elekto. La sanktejo de La Ordeno ĉe la rojo estas ĝia neoficiala torturejo. En ĝi estas kaŝita ora kaliko. Portu ĝin al mi en la taverno kaj vi havos rekompencon.,"Buena elección. El santuario de La Orden junto al arroyo es su cámara de tortura extraoficial. Dentro hay un cáliz dorado escondido. Cógelo, llévamelo a la taberna y tendrás tu recompensa.","Buena elección. El santuario de La Orden junto al río es su cámara de tortura extraoficial. Adentro hay un cáliz dorado escondido. Si lo tomas y me lo llevas a la taberna, tu recompensa.","Viisas päätös. Veljeskunnan pyhäkkö joen varrella on heidän epävirallinen kidutuskammionsa, jonka kätköissä piilee kultakalkki. Kähvellä se ja saat vaivannäöstäsi palkan.",Bon choix. Le sanctuaire de l'ordre près de la rivière est leur chambre torture.. officieusement. A l'intérieur se trouve un calice en or. Récupérez le et venez prendre votre récompense.,,"Jó választás. A Rend folyó melletti szentélye valójában a nem hivatalos kínzó kamrájuk. Elrejtve belül található egy arany serleg. Csend el szépen, és a kocsmánál találkozunk, lepasszolom a jutalmad.",Ottima scelta. Il santuario dell'Ordine vicino al fiume è la loro camera della tortura. Vi è un calice d'oro nascosto là dentro. Prendilo e avrai una lauta ricompensa.,"良い判断だ。川沿いにある オーダーの聖域 は あいつらの非公式の拷問室だ。 中には黄金の聖杯が隠してある。 そいつを持ってくれば報酬をやるぜ。 ",좋은 선택이야. 강가 근처에 있는 성소가 바로 오더의 비공식적인 고문실이야. 그리고 그 안에는 숨겨진 금색 성배가 있지. 넌 그것을 훔치고 여기 선술집으로 와서 보상을 받으면 돼.,"Goede keuze. Het heiligdom van de Orde bij de rivier is hun onofficiële martelkamer. Verborgen in de kelk zit een gouden kelk. Je haalt hem weg, je komt me tegen in de herberg, en plukt je beloning.","Godt valg. Ordenens helligdom ved elven er deres uoffisielle torturkammer. Gjemt der inne er det et gyllent beger. Du stjeler det, møter meg på vertshuset og høster belønningen din.","Dobry wybór. Sanktuarium Zakonu nad rzeką jest ich nieoficjalną salą tortur. W środku jest ukryty złoty kielich. Machniesz nim, spotkasz się ze mną w tawernie i odbierzesz swoją nagrodę.","Boa escolha. O santuário da Ordem próximo ao rio é a câmara de tortura não oficial deles. Dentro dele há um cálice dourado. Pegue-o, me encontre na taverna e pegue sua recompensa.",,"Bună alegere. Sanctuarul Ordinului de lângă râu e lagărul lor neoficial. Ascuns înăuntru e un potir. Îl înșfaci, mă găsești la tavernă, și îți iei răsplata.","Правильный выбор. В святилище Ордена у реки — там у них негласная камера пыток — спрятана золотая чаша. Ты крадёшь её, возвращаешься ко мне в таверну и получаешь свою награду.",,"Bra val. Ordens helgedom vid floden är deras inofficiella tortyrkammare. Gömd inuti finns en gyllene bägare. Du tar den, möter mig på tavernan och skördar din belöning.","İyi seçim. Tarikat'ın nehir kenarındaki sığınağı onların gayri resmi işkence odası. İçinde altın bir kadeh saklı. Onu çalacaksın, benimle tavernada buluşacaksın ve ödülünü alacaksın." -How am I supposed to do that?,TXT_RPLY0_SCRIPT33_D16676_HOWAM,〃,,,Jak to mám udělat?,Hvordan skal jeg gøre det?,Wie soll ich das anstellen?,,Kiel mi supozeble faru tion?,¿Cómo se supone que debo hacer eso?,,Miten minä muka sen teen?,Comment est-ce que je suis sensé faire ça?,Hogyan kéne ezt véghezvinnem?,E come posso fare tutto ciò?,どうすればいいんだ?,어떻게 하면 되나요?,Hoe moet ik dat doen?,Hvordan skal jeg gjøre det?,Jak mam to zrobić?,Como vou conseguir fazer isso?,,Cum ar trebui să fac asta?,Как мне это сделать?,,Hur ska jag göra det?,Bunu nasıl yapacağım? -Let me think about it.,TXT_RPLY1_SCRIPT33_D16676_LETME,〃,,,Nech mě o tom popřemýšlet.,Lad mig tænke over det.,Lass mich darüber nachdenken.,,Mi pensu.,Déjame pensarlo.,,Anna minun pohtia asiaa.,Laissez-moi y réfléchir.,Hadd gondolkozzak.,Ci penso un po' su e poi ti farò sapere.,ちょっと考えとく。,좀 생각해 보겠습니다.,Laat me erover nadenken.,La meg tenke på det.,Pozwól mi się zastanowić.,Vou pensar sobre isso.,,Lasă-mă să mă gândesc.,Я подумаю над твоим предложением.,,Låt mig tänka på det.,Bir düşüneyim. -"Sorry, no second chances. Oh, guards, kill him!",TXT_RYES1_SCRIPT33_D16676_SORRY,〃,,,"Promiň, žádné druhé šance. A, stráže, zabte ho!","Beklager, ingen anden chance. Åh, vagter, dræb ham!","Keine zweite Chance. Oh Wachen, tötet ihn.",,"Pardonon, ne estas alia ŝanco. Gardistoj, mortigu lin!","Lo siento, no hay otra oportunidad. ¡Guardias, matadlo!","Lo siento, no hay otra oportunidad. ¡Guardias, mátenlo!","Pahoittelut, ei toista mahdollisuutta. Vartijat, tappakaa hänet.","Pas de deuxième chance. Gardes, tuez-le.","Bocs, de második esély már nincs. Őrök, végezzétek ki!","Nessuna seconda chance. Guardie, uccidetelo.","残念、次はねえよ。おぅガードの旦那、 +How am I supposed to do that?,TXT_RPLY0_SCRIPT33_D16676_HOWAM,〃,,,Jak to mám udělat?,Hvordan skal jeg gøre det?,Wie soll ich das anstellen?,,Kiel mi supozeble faru tion?,¿Cómo se supone que debo hacer eso?,,Miten minä muka sen teen?,Comment est-ce que je suis sensé faire ça?,,Hogyan kéne ezt véghezvinnem?,E come posso fare tutto ciò?,どうすればいいんだ?,어떻게 하면 되나요?,Hoe moet ik dat doen?,Hvordan skal jeg gjøre det?,Jak mam to zrobić?,Como vou conseguir fazer isso?,,Cum ar trebui să fac asta?,Как мне это сделать?,,Hur ska jag göra det?,Bunu nasıl yapacağım? +Let me think about it.,TXT_RPLY1_SCRIPT33_D16676_LETME,〃,,,Nech mě o tom popřemýšlet.,Lad mig tænke over det.,Lass mich darüber nachdenken.,,Mi pensu.,Déjame pensarlo.,,Anna minun pohtia asiaa.,Laissez-moi y réfléchir.,,Hadd gondolkozzak.,Ci penso un po' su e poi ti farò sapere.,ちょっと考えとく。,좀 생각해 보겠습니다.,Laat me erover nadenken.,La meg tenke på det.,Pozwól mi się zastanowić.,Vou pensar sobre isso.,,Lasă-mă să mă gândesc.,Я подумаю над твоим предложением.,,Låt mig tänka på det.,Bir düşüneyim. +"Sorry, no second chances. Oh, guards, kill him!",TXT_RYES1_SCRIPT33_D16676_SORRY,〃,,,"Promiň, žádné druhé šance. A, stráže, zabte ho!","Beklager, ingen anden chance. Åh, vagter, dræb ham!","Keine zweite Chance. Oh Wachen, tötet ihn.",,"Pardonon, ne estas alia ŝanco. Gardistoj, mortigu lin!","Lo siento, no hay otra oportunidad. ¡Guardias, matadlo!","Lo siento, no hay otra oportunidad. ¡Guardias, mátenlo!","Pahoittelut, ei toista mahdollisuutta. Vartijat, tappakaa hänet.","Pas de deuxième chance. Gardes, tuez-le.",,"Bocs, de második esély már nincs. Őrök, végezzétek ki!","Nessuna seconda chance. Guardie, uccidetelo.","残念、次はねえよ。おぅガードの旦那、 やっちゃってくだせえ。","유감. 두 번째 기회는 없어. 경비원, 저놈을 죽여.","Sorry, geen tweede kans. Oh, bewakers, dood hem!","Beklager, ingen nye sjanser. Vakter, drep ham!","Przykro mi, nie ma drugiej szansy. Och, strażnicy, zabijcie go!","Sinto muito, nada de segundas chances. Ah, guardas, matem-no!",,"Oh, nicio altă șansă. Gardienilor, omorâți-l.","Нет, никакого второго шанса. Эй, стража, убейте его.",,"Tyvärr, inga andra chanser. Vakter, döda honom!","Üzgünüm, ikinci bir şans yok. Muhafızlar, öldürün onu!" -"Here's a crossbow, just aim straight and -- splat!--. Remember, grab the fancy cup and meet me at the tavern.",TXT_DLG_SCRIPT33_D18192_HERES,〃,,,"Tady je kuše, prostě rovně zamiř a --plesk!--. Nezapomeň, vem fešný hrnek a najdi mě v taverně.","Her er en armbrøst, bare sigt lige ud og -- splat!--. Husk, tag den fine kop og mød mig på kroen.","Hier ist eine Armbust, einfach gerade zielen und --Platsch--. Denk dran, schnapp dir den schicken Kelch und dann ab zur Taverne.",,Jen arbalesto. Vi nur celu laŭ rekta linio kaj «pum». Ne forgesu preni la belan pokalon kaj tiam renkonti min en la taverno.,Aquí tengo una ballesta. Solo apunta en línea recta y «plaf». Recuerda: toma la bonita copa y luego ve a verme a la taberna.,,"Tässä sinulle jousipyssy; tähtää vain eteenpäin ja ""pläts""! Tärkeintä vain, että muistat kahmaista fiinin maljan ja sitten palata kapakkaan.",Voilà une arbalète. Vous avez juste à viser droit et paf! Souvenez-vous. Prenez le goblet et ramenez le à la taverne.,"Itt egy íj, csak célozz egyenesen és -- bumm!--. És emlékezz: hozdd el a díszes serleget nekem a kocsmába.","Ecco una balestra, basta mirare e --splat--. Ricorda, prendi il calice e ritorna alla taverna.","このクロスボウを使いな、狙いを定めて +"Here's a crossbow, just aim straight and -- splat!--. Remember, grab the fancy cup and meet me at the tavern.",TXT_DLG_SCRIPT33_D18192_HERES,〃,,,"Tady je kuše, prostě rovně zamiř a --plesk!--. Nezapomeň, vem fešný hrnek a najdi mě v taverně.","Her er en armbrøst, bare sigt lige ud og -- splat!--. Husk, tag den fine kop og mød mig på kroen.","Hier ist eine Armbust, einfach gerade zielen und --Platsch--. Denk dran, schnapp dir den schicken Kelch und dann ab zur Taverne.",,Jen arbalesto. Vi nur celu laŭ rekta linio kaj «pum». Ne forgesu preni la belan pokalon kaj tiam renkonti min en la taverno.,Aquí tengo una ballesta. Solo apunta en línea recta y «plaf». Recuerda: toma la bonita copa y luego ve a verme a la taberna.,,"Tässä sinulle jousipyssy; tähtää vain eteenpäin ja ""pläts""! Tärkeintä vain, että muistat kahmaista fiinin maljan ja sitten palata kapakkaan.",Voilà une arbalète. Vous avez juste à viser droit et paf! Souvenez-vous. Prenez le goblet et ramenez le à la taverne.,,"Itt egy íj, csak célozz egyenesen és -- bumm!--. És emlékezz: hozdd el a díszes serleget nekem a kocsmába.","Ecco una balestra, basta mirare e --splat--. Ricorda, prendi il calice e ritorna alla taverna.","このクロスボウを使いな、狙いを定めて --シュッとな。覚えておけ、 ファンシーなカップを持ってここに戻ってくると。","여기 석궁이야, 똑바로 겨냥해, 그리고... '철퍼덕'. 기억해, 멋진 컵을 들고 이 곳으로 다시 와.","Hier is een kruisboog, richt gewoon recht en -- splat! --. Vergeet niet, pak de mooie beker en ontmoet me in de herberg.","Her er en armbrøst, bare sikt rett og... plask! Husk, ta den fine koppen og møt meg på tavernaen.","Tu jest kusza, wyceluj prosto i... splat! Pamiętajcie, weźcie elegancki puchar i spotkajmy się w tawernie.","Pegue esta besta. Só mirar direito e splat! Lembre-se, pegue o copo bonitinho e me encontre na taverna.",,"Aici e o arbaletă, doar țintești și -- pleoșc! --. Ține minte, pune mâna pe potir și găsește-mă la tavernă.",Вот арбалет — просто прицеливаешься и «шлеп!» Запомни — хватаешь чашку и возвращаешься в таверну.,,"Här är ett armborst, sikta rakt och -- splat!--. Kom ihåg, ta den fina koppen och möt mig på tavernan.","İşte yaylı tüfek. Düz nişan al ve patlat! Unutma, süslü kupayı al ve benimle tavernada buluş." -I'll see you there.,TXT_RPLY0_SCRIPT33_D18192_ILLSE,〃,,,Uvidíme se tam.,Vi ses der.,Wir sehen uns dort.,,Mi estos tie.,Allí estaré.,Ahí voy a estar.,Tapaan sinut siellä.,Je vous y verrais.,Ott találkozunk.,Ci vediamo lì.,また会おう。,거기서 보자고.,Ik zie je daar.,Vi ses der.,Do zobaczenia.,Te vejo lá.,,Ne vedem acolo.,Я вернусь с чашей.,,Vi ses där.,Orada görüşürüz. -"What are you waiting for? Don't worry, I'll clean up the bodies, just bring me that chalice!",TXT_DLG_SCRIPT33_D19708_WHATA,〃,,,"Na co čekáš? Neboj, mrtvol se zbavím já, prostě mi přines ten kalich!","Hvad venter du på? Bare rolig, jeg skal nok rydde op efter ligene, bare giv mig bægeret!","Worauf wartest du noch? Keine Sorge, ich kümmere mich um die Leichen. Bring mir den Kelch.",,Kion vi atendas? Mi mem kaŝos la kadavrojn. Vi nur alportu tiun kalikon!,"¿A qué estás esperando? Yo me deshago de los cuerpos, así que tranquilo. ¡Tú solo tráeme ese cáliz!","¿Qué estás esperando? Yo me deshago de los cuerpos, así que tranquilo. ¡Tú solo tráeme ese cáliz!","Mitä oikein odottelet? Älä huoli, siivoan kyllä ruumiit. Tuo vaan minulle se kalkki.","Qu'attendez vous? Je m'occuperai des corps, ne vous inquiétez pas. Apportez-moi le calice!","Mire vársz? Ne aggódj, majd feltakarítom a hullákat, csak hozdd el a serleget.","Che cosa stai aspettando? Non ti preoccupare, ci penserò io a far sparire i corpi, tu pensa solo a portarmi quel calice!","何ボーっとしてんだ? 心配すんな、 +I'll see you there.,TXT_RPLY0_SCRIPT33_D18192_ILLSE,〃,,,Uvidíme se tam.,Vi ses der.,Wir sehen uns dort.,,Mi estos tie.,Allí estaré.,Ahí voy a estar.,Tapaan sinut siellä.,Je vous y verrais.,,Ott találkozunk.,Ci vediamo lì.,また会おう。,거기서 보자고.,Ik zie je daar.,Vi ses der.,Do zobaczenia.,Te vejo lá.,,Ne vedem acolo.,Я вернусь с чашей.,,Vi ses där.,Orada görüşürüz. +"What are you waiting for? Don't worry, I'll clean up the bodies, just bring me that chalice!",TXT_DLG_SCRIPT33_D19708_WHATA,〃,,,"Na co čekáš? Neboj, mrtvol se zbavím já, prostě mi přines ten kalich!","Hvad venter du på? Bare rolig, jeg skal nok rydde op efter ligene, bare giv mig bægeret!","Worauf wartest du noch? Keine Sorge, ich kümmere mich um die Leichen. Bring mir den Kelch.",,Kion vi atendas? Mi mem kaŝos la kadavrojn. Vi nur alportu tiun kalikon!,"¿A qué estás esperando? Yo me deshago de los cuerpos, así que tranquilo. ¡Tú solo tráeme ese cáliz!","¿Qué estás esperando? Yo me deshago de los cuerpos, así que tranquilo. ¡Tú solo tráeme ese cáliz!","Mitä oikein odottelet? Älä huoli, siivoan kyllä ruumiit. Tuo vaan minulle se kalkki.","Qu'attendez vous? Je m'occuperai des corps, ne vous inquiétez pas. Apportez-moi le calice!",,"Mire vársz? Ne aggódj, majd feltakarítom a hullákat, csak hozdd el a serleget.","Che cosa stai aspettando? Non ti preoccupare, ci penserò io a far sparire i corpi, tu pensa solo a portarmi quel calice!","何ボーっとしてんだ? 心配すんな、 チャッチャと片付けて聖杯を持ってこい!","뭘 기다리는 거야? 걱정하지 마, 내가 시체들을 치워줄 테니. 그냥 성배를 가져와!","Waar wacht je nog op? Maak je geen zorgen, ik ruim de lichamen op, breng me gewoon die kelk!","Hva venter du på? Slapp av, jeg skal rydde opp i likene, bare gi meg begeret!","Na co czekasz? Nie martw się, posprzątam ciała, tylko przynieś mi ten kielich!","O que está esperando? Não se preocupe, eu limpo os corpos. Apenas me traga aquele cálice!",,"Ce mai aștepți? Nu te teme, voi curăța eu cadavrele, tu doar adu-mi potirul.",Чего ты ждёшь? Не беспокойся: я сам избавлюсь от трупов. Просто принеси мне чашу!,,"Vad väntar du på? Oroa dig inte, jag städar upp kropparna, ge mig bara kalken!","Neyi bekliyorsun? Merak etme, cesetleri temizleyeceğim, sadece kadehi bana getir!" -Guards! Kill the traitor!,TXT_DLG_SCRIPT33_D21224_GUARD,〃,,,Stráže! Zabte toho zrádce!,Vagter! Dræb forræderen!,Wächter! Tötet den Verräter!,,Gardistoj! Mortigu la perfidulon!,¡Guardias! ¡Matad al traidor!,¡Guardias! ¡Maten al traidor!,Vartijat! Tappakaa petturi!,Gardes! Tuez ce traître!,Őrök! Öljétek meg az árulót!,Guardie! Uccidete il traditore!,ガード! 裏切者を殺せ!,경비! 반역자를 죽여라!,Bewakers! Dood de verrader!,Vakter! Drep forræderen!,Strażnicy! Zabić zdrajcę!,Guardas! Matem esse traidor!,,"Gardieni, omorâți trădătorul!",Стража! Убейте предателя!,,Vakter! Döda förrädaren!,Muhafızlar! Haini öldürün! -"Hey, I know what you're thinking, kinda looks like a setup, I would never do that to such a killing machine, I mean it. Whew, all this fuss over a cup, weird. Now get ready, gold and glory, like I promised. Take this key and the Governor himself will reward you.",TXT_DLG_SCRIPT33_D22740_HEYIK,MAP33: Harris (tavern).,,,"Hej, vím co si myslíš, tohle vypadá jako bouda. Takovému stroji na zabíjení bych nic takového neudělal, vážně! Páni, takový povyk kvůli hrnečku, divný. Tak teď se připrav, zlato a sláva, jak jsem slíbil. Vem si tenhle klíč a sám guvernér tě odmění.","Hey, jeg ved hvad du tænker, det ligner en fælde, jeg ville aldrig gøre det mod sådan en dræbermaskine, jeg mener det. Alt dette postyr over en kop, underligt. Gør dig klar, guld og ære, som jeg lovede. Tag denne nøgle, og guvernøren selv vil belønne dig.","Hey, ich weiß, es sieht anscheinend wie eine Falle aus, aber so etwas würde ich einer so großeartigen Tötungsmaschine nicht antun. Hast du ddas Ding? Großartig! Nun mach dich bereit, Geld und Ruhm, genau wie ich es dir versprochen habe. Nimm diesen Schlüssel und der Gouverneur wird dich belohnen.",,"Jes, mi scias, vi certe pensas, ke ĉi tio estas trompo, sed mi neniam farus tion al bonega mortig-maŝino, mi ĵuras tion. Ve, ĉi tiom da malordo pro pokalo, strange. Vi nun pretiĝu: oro kaj gloro, tiel, kiel mi promesis. Prenu ĉi tiun ŝlosilon kaj la registo mem rekompencos vin.","Sí, sé lo que estás pensando: esto parece un timo, pero nunca le haría eso una tal máquina de matar, lo juro. Uf, todo este lío por una copa, qué raro. Ahora prepárate: oro y gloria, tal y como he prometido. Toma esta llave y el mismísimo gobernador te recompensará.","Sí, sé lo que estás pensando: esto parece una estafa, pero nunca le haría eso una tal máquina de matar, lo juro. Uf, todo este lío por una copa, que raro. Ahora prepárate: oro y gloria, tal y como prometí. Toma esta llave y el mismísimo gobernador te va a recompensar.","Joo joo, tiedän, mitä ajattelet: vähän tuntuu väijytykseltä. En kuitenkaan ikinä tekisi sellaista niin kovalle tappokoneelle. Tarkoitan sitä. Huhhuh, kaikki tämä vouhotus yhdestä kupista; kummallista. No niin, valmistaudu kultaan ja kunniaan, niin kuin lupasinkin. Ota tämä avain ja itse kuvernööri palkitsee sinut.","Hé, je sais que ça à l'air d'être un coup monté, mais je ne ferais jamais ça à une aussi bonne machine à tuer. Tellement de bruit pour une coupe, franchement.. Préparez vous, l'or et la gloire vous attend, comme promis. Prenez cette clé et le gouverneur vous récompensera.","Tudom mire gondolsz, olyan ez mintha egy csapda lenne, de esküszöm soha nemm tennék ilyet egy jó gyilkológéppel. Nahát, ennyi hűhó egy francos serleg miatt. Node, állj aztán készen, eljön az a bizonyos pénz és hírnév mint ahogy ígértem. Tedd el ezt a kulcsot, és maga a kormányzó fog megjutalmazni.","Ehi, so che può sembrare una trappola. Ma io non tradirei mai a un killer abile come te. Mah, tutto questo per una coppa, che strano. Adesso preparati, oro e gloria, come ti avevo promesso. Prendi questa chiave e il governatore in persona ti ricompenserà.","よう。アンタが何を考えてるかわかるぜ、 +Guards! Kill the traitor!,TXT_DLG_SCRIPT33_D21224_GUARD,〃,,,Stráže! Zabte toho zrádce!,Vagter! Dræb forræderen!,Wächter! Tötet den Verräter!,,Gardistoj! Mortigu la perfidulon!,¡Guardias! ¡Matad al traidor!,¡Guardias! ¡Maten al traidor!,Vartijat! Tappakaa petturi!,Gardes! Tuez ce traître!,,Őrök! Öljétek meg az árulót!,Guardie! Uccidete il traditore!,ガード! 裏切者を殺せ!,경비! 반역자를 죽여라!,Bewakers! Dood de verrader!,Vakter! Drep forræderen!,Strażnicy! Zabić zdrajcę!,Guardas! Matem esse traidor!,,"Gardieni, omorâți trădătorul!",Стража! Убейте предателя!,,Vakter! Döda förrädaren!,Muhafızlar! Haini öldürün! +"Hey, I know what you're thinking, kinda looks like a setup, I would never do that to such a killing machine, I mean it. Whew, all this fuss over a cup, weird. Now get ready, gold and glory, like I promised. Take this key and the Governor himself will reward you.",TXT_DLG_SCRIPT33_D22740_HEYIK,MAP33: Harris (tavern).,,,"Hej, vím co si myslíš, tohle vypadá jako bouda. Takovému stroji na zabíjení bych nic takového neudělal, vážně! Páni, takový povyk kvůli hrnečku, divný. Tak teď se připrav, zlato a sláva, jak jsem slíbil. Vem si tenhle klíč a sám guvernér tě odmění.","Hey, jeg ved hvad du tænker, det ligner en fælde, jeg ville aldrig gøre det mod sådan en dræbermaskine, jeg mener det. Alt dette postyr over en kop, underligt. Gør dig klar, guld og ære, som jeg lovede. Tag denne nøgle, og guvernøren selv vil belønne dig.","Hey, ich weiß, es sieht anscheinend wie eine Falle aus, aber so etwas würde ich einer so großeartigen Tötungsmaschine nicht antun. Hast du ddas Ding? Großartig! Nun mach dich bereit, Geld und Ruhm, genau wie ich es dir versprochen habe. Nimm diesen Schlüssel und der Gouverneur wird dich belohnen.",,"Jes, mi scias, vi certe pensas, ke ĉi tio estas trompo, sed mi neniam farus tion al bonega mortig-maŝino, mi ĵuras tion. Ve, ĉi tiom da malordo pro pokalo, strange. Vi nun pretiĝu: oro kaj gloro, tiel, kiel mi promesis. Prenu ĉi tiun ŝlosilon kaj la registo mem rekompencos vin.","Sí, sé lo que estás pensando: esto parece un timo, pero nunca le haría eso una tal máquina de matar, lo juro. Uf, todo este lío por una copa, qué raro. Ahora prepárate: oro y gloria, tal y como he prometido. Toma esta llave y el mismísimo gobernador te recompensará.","Sí, sé lo que estás pensando: esto parece una estafa, pero nunca le haría eso una tal máquina de matar, lo juro. Uf, todo este lío por una copa, que raro. Ahora prepárate: oro y gloria, tal y como prometí. Toma esta llave y el mismísimo gobernador te va a recompensar.","Joo joo, tiedän, mitä ajattelet: vähän tuntuu väijytykseltä. En kuitenkaan ikinä tekisi sellaista niin kovalle tappokoneelle. Tarkoitan sitä. Huhhuh, kaikki tämä vouhotus yhdestä kupista; kummallista. No niin, valmistaudu kultaan ja kunniaan, niin kuin lupasinkin. Ota tämä avain ja itse kuvernööri palkitsee sinut.","Hé, je sais que ça à l'air d'être un coup monté, mais je ne ferais jamais ça à une aussi bonne machine à tuer. Tellement de bruit pour une coupe, franchement.. Préparez vous, l'or et la gloire vous attend, comme promis. Prenez cette clé et le gouverneur vous récompensera.",,"Tudom mire gondolsz, olyan ez mintha egy csapda lenne, de esküszöm soha nemm tennék ilyet egy jó gyilkológéppel. Nahát, ennyi hűhó egy francos serleg miatt. Node, állj aztán készen, eljön az a bizonyos pénz és hírnév mint ahogy ígértem. Tedd el ezt a kulcsot, és maga a kormányzó fog megjutalmazni.","Ehi, so che può sembrare una trappola. Ma io non tradirei mai a un killer abile come te. Mah, tutto questo per una coppa, che strano. Adesso preparati, oro e gloria, come ti avevo promesso. Prendi questa chiave e il governatore in persona ti ricompenserà.","よう。アンタが何を考えてるかわかるぜ、 まるで罠だと。 俺には暴れん坊みたいな芸当出来ねえしな。 おう、カップを巡って大騒ぎだろうなこりゃ、 怖い怖い。 だったら準備しな、金と名誉は、約束通り。 この鍵を取ったら知事が報酬を与えるだろうな。","이봐, 무슨 생각을 하는지 알겠어. 확실히 뭔가 꾸며 놓은 것 같다는 거. 난 훌륭한 학살 기계에게 그런 짓을 할 사람이 아니야. 휴... 그깟 컵 가지고. 이상해. 아무튼 준비해, 골드와 영광을. 이 열쇠를 총독에게 가져다주면 보상해 줄 거야.","Hé, ik weet wat je denkt, het lijkt een beetje op een valstrik, dat zou ik nooit met zo'n moordmachine doen, ik meen het. Whew, al deze ophef over een kopje, vreemd. Maak je nu klaar, goud en glorie, zoals ik heb beloofd. Neem deze sleutel en de Gouverneur zelf zal je belonen.","Jeg vet hva du tenker. Det ser ut som en felle. Jeg ville aldri gjort det mot en slik drapsmaskin. Alt dette oppstyret for en kopp. Merkelig. Gjør deg klar, gull og ære, som jeg lovet. Ta denne nøkkelen, så vil guvernøren selv belønne deg.","Hej, wiem co myślisz, wygląda to na ustawkę, nigdy nie zrobiłbym tego takiej maszynie do zabijania, mówię poważnie. Całe to zamieszanie z powodu kubka, dziwne. A teraz przygotuj się, złoto i chwała, jak obiecałem. Weź ten klucz, a sam gubernator cię nagrodzi.","Olha, eu sei o que você está pensando, que parece uma cilada. Eu nunca faria isso com uma máquina mortífera como você, sério mesmo. Nossa, todo esse escândalo por causa de um cálice, que esquisito. Agora se prepare, ouro e glória conforme prometido. Pegue esta chave e o governador vai te recompensar.",,"Hei, știu la ce te gândești, pare o capcană, dar nu aș face asta niciodată unei mașini ucigașe, serios. Atâta harababură pentru un potir, . Acum pregătește-te, aur și glorie, dupa cum ți-am promis. Ia cheia asta și însuși Guvernatorul te va răsplătii.","Слушай, я знаю, о чём ты думаешь. Ты думаешь, что это подстава. Но я бы никогда не сделал этого с такой машиной для убийств, как ты, правда-правда. Тем более, ради какой-то чаши. А теперь, тебя ждут золото и слава, как я и обещал. Возьми этот ключ, губернатор лично наградит тебя.",,"Jag vet vad du tänker, det ser ut som en fälla, jag skulle aldrig göra det mot en sådan dödsmaskin, jag menar det. Allt detta ståhej för en kopp, konstigt. Gör dig nu redo, guld och ära, som jag lovade. Ta den här nyckeln och guvernören själv kommer att belöna dig.","Hey, ne düşündüğünü biliyorum, biraz tuzak gibi görünüyor, böyle bir ölüm makinesine bunu asla yapmam, ciddiyim. Tüm bu yaygara bir fincan için, garip. Şimdi hazır ol, altın ve şan, söz verdiğim gibi. Bu anahtarı al ve Vali'nin kendisi seni ödüllendirecek." -"Great, I can't wait!",TXT_RPLY0_SCRIPT33_D22740_GREAT,〃,,,"Skvělý, nemůžu se dočkat!","Fedt, jeg kan ikke vente!","Toll, ich kann es kaum erwarten!",,"Bonege, mi sopire atendas!","Genial, ¡no puedo esperar!",,"Mahtavaa, en malta odottaa!","Parfait, je ne peux pas attendre!","Remek, már alig várom!","Ottimo, non vedo l'ora!",そりゃいいな、待ち遠しい!,좋았어! 기다릴 수 없는걸?,"Geweldig, ik kan niet wachten!","Flott, jeg gleder meg!","Świetnie, nie mogę się doczekać!","Ótimo, mal posso esperar!",,"Grozav, abia aștept.",Прекрасно. Мне уже не терпится!,,"Toppen, jag kan inte vänta!","Harika, sabırsızlanıyorum!" -"No chalice, no money!",TXT_RNO0_SCRIPT33_D22740_NOCHA,〃 (if accepting without having the chalice),,,"Žádný kalich, žádný prachy!","Ingen bæger, ingen penge!","Kein Kelch, kein Geld.",,Sen kaliko ne estas mono!,¡Sin cáliz no hay dinero!,,"Ei kalkkia, ei rahaa!","Pas de calice, pas d'argent!","Ha nincs serleg, nincs pénz!","Niente calice, niente soldi!",聖杯が無いなら、金も無しだ!,성배가 없다면 돈도 없어!,"Geen kelk, geen geld!","Ingen kalk, ingen penger!","Nie ma kielicha, nie ma pieniędzy!","Sem cálice, sem dinheiro!",,"Niciun potir, niciun ban!",Нет чаши — нет денег!,,"Ingen bägare, inga pengar!",Kadeh yoksa para da yok! -"I'll keep the chalice, thanks.",TXT_RPLY1_SCRIPT33_D22740_ILLKE,〃,,,"Nechám si ten kalich, díky.","Jeg beholder bægeret, tak.","Ich behalte den Kelch, danke.",,Mi konservos la kalikon. Dankon.,Me quedo con el cáliz. Gracias.,,"Pidän kalkin, kiitos.","Je le garde, merci.","Inkább megtartom a serleget, kösz.","Il calice lo terrò io, grazie.",聖杯は頂く、じゃあな。,"내가 성배를 가지고 있을게, 고마워.","Ik bewaar de kelk, bedankt.","Jeg beholder begeret, takk.","Zatrzymam kielich, dzięki.","Vou ficar com o cálice, obrigado.",,"Păstrez potirul, merci.","Спасибо, но я оставлю чашу себе.",,"Jag behåller bägaren, tack.","Kadeh bende kalsın, teşekkürler." +"Great, I can't wait!",TXT_RPLY0_SCRIPT33_D22740_GREAT,〃,,,"Skvělý, nemůžu se dočkat!","Fedt, jeg kan ikke vente!","Toll, ich kann es kaum erwarten!",,"Bonege, mi sopire atendas!","Genial, ¡no puedo esperar!",,"Mahtavaa, en malta odottaa!","Parfait, je ne peux pas attendre!",,"Remek, már alig várom!","Ottimo, non vedo l'ora!",そりゃいいな、待ち遠しい!,좋았어! 기다릴 수 없는걸?,"Geweldig, ik kan niet wachten!","Flott, jeg gleder meg!","Świetnie, nie mogę się doczekać!","Ótimo, mal posso esperar!",,"Grozav, abia aștept.",Прекрасно. Мне уже не терпится!,,"Toppen, jag kan inte vänta!","Harika, sabırsızlanıyorum!" +"No chalice, no money!",TXT_RNO0_SCRIPT33_D22740_NOCHA,〃 (if accepting without having the chalice),,,"Žádný kalich, žádný prachy!","Ingen bæger, ingen penge!","Kein Kelch, kein Geld.",,Sen kaliko ne estas mono!,¡Sin cáliz no hay dinero!,,"Ei kalkkia, ei rahaa!","Pas de calice, pas d'argent!",,"Ha nincs serleg, nincs pénz!","Niente calice, niente soldi!",聖杯が無いなら、金も無しだ!,성배가 없다면 돈도 없어!,"Geen kelk, geen geld!","Ingen kalk, ingen penger!","Nie ma kielicha, nie ma pieniędzy!","Sem cálice, sem dinheiro!",,"Niciun potir, niciun ban!",Нет чаши — нет денег!,,"Ingen bägare, inga pengar!",Kadeh yoksa para da yok! +"I'll keep the chalice, thanks.",TXT_RPLY1_SCRIPT33_D22740_ILLKE,〃,,,"Nechám si ten kalich, díky.","Jeg beholder bægeret, tak.","Ich behalte den Kelch, danke.",,Mi konservos la kalikon. Dankon.,Me quedo con el cáliz. Gracias.,,"Pidän kalkin, kiitos.","Je le garde, merci.",,"Inkább megtartom a serleget, kösz.","Il calice lo terrò io, grazie.",聖杯は頂く、じゃあな。,"내가 성배를 가지고 있을게, 고마워.","Ik bewaar de kelk, bedankt.","Jeg beholder begeret, takk.","Zatrzymam kielich, dzięki.","Vou ficar com o cálice, obrigado.",,"Păstrez potirul, merci.","Спасибо, но я оставлю чашу себе.",,"Jag behåller bägaren, tack.","Kadeh bende kalsın, teşekkürler." Keep it? I think not!,TXT_RYES1_SCRIPT33_D22740_KEEPI,〃,,,Necháš? Nemyslím si!,Beholde den? Det tror jeg ikke!,"Behalten? Ich glaube, nicht.",,"Ĉu konservi ĝin? Mi kredas, ke ne!","¿Quedártelo? -¡Me parece que no!",,Pidät sen? Enpä usko!,Le garder? Je ne pense pas!,Megtartod? Nem hinném öreg!,Davvero intendi tenerlo tu? Mi spiace ma non funziona così!,頂く? 有り得ねえな!,가지고 있겠다고? 내 생각은 아닌데?,Bewaren? Ik denk van niet!,Beholde det? Jeg tror ikke det!,Zatrzymać? Chyba nie!,Ficar com o cálice? Acho que não!,,Păstrezi? Ba nu cred!,Оставишь себе? Ещё чего!,,Behålla den? Jag tror inte det!,Saklamak mı? Hiç sanmıyorum! -What are you waiting for? The governor himself will reward you.,TXT_DLG_SCRIPT33_D24256_WHATA,〃,,,Na co čekáš? Sám guvernér tě odmění.,Hvad venter du på? Guvernøren selv vil belønne dig.,Worauf wartest du? Der Gouverneur wird dich belohnen.,,Kion vi atendas? La registo mem rekompencos vin.,¿A qué estás esperando? El mismísimo gobernador te recompensará.,¿Qué estás esperando? El mismísimo gobernador te va a recompensar.,Mitä oikein odotat? Kuvernööri itse palkitsee sinut.,Qu'attendez-vous? Le gouverneur vous récompensera lui même.,Mire vársz? Maga a kormányzó fog megjutalmazni.,Che cosa stai aspettando? Il governatore in persona ti ricompenserà.,何突っ立ってんだ? 知事に報酬を受けて来いよ。,꾸물거리지 말고 총독을 만나. 그가 너를 보답해줄 거야.,Waar wacht je nog op? De gouverneur zelf zal je belonen.,Hva venter du på? Guvernøren selv vil belønne deg.,Na co czekasz? Sam gubernator cię nagrodzi.,O que você está esperando? O governador em pessoa vai te recompensar.,,Ce mai aștepți? Guvernatorul însuși te va răsplătii.,Чего ты ждёшь? Губернатор лично наградит тебя.,,Vad väntar du på? Guvernören själv kommer att belöna dig.,Neyi bekliyorsun? Valinin kendisi seni ödüllendirecek. -Die traitor! ,TXT_DLG_SCRIPT33_D25772_DIETR,〃,,,"Zemři, zrádče!","Dø, forræder!","Stirb, Verräter!",,"Mortu, perfidulo!","¡Muere, traidor!",,"Kuole, petturi!","Meurs, traître!",Halál rád áruló!,Muori traditore!,くたばれ裏切者が!,죽어라. 배신자!,Sterf de verrader!,"Dø, forræder!",Giń zdrajco!,"Morra, traidor!",,Mori trădătorule!,"Умри, предатель!",,Dö förrädare!,Geber hain! -So you're the fool who stole the chalice? I'm going to have you arrested as a rebel thief... Thereby enhancing my position with the Order. How does it feel to be an unwitting pawn? ,TXT_DLG_SCRIPT33_D27288_SOYOU,MAP33: Mourel.,,,"Tak ty jsi ten blázen, který ukradl kalich? Teď tě nechám zatknout jako rebelského zloděj... a tím si upevním svou pozici s Řádem. Jaký je to pocit, být bezděčnou figurkou?","Så du er det fjols, der stjal bægeret? Jeg vil få dig arresteret som en oprørsk tyv... og derved forbedre min position i ordenen. Hvordan føles det at være en uvidende brik?","So, du bist also der Narr der den Kelch gestohlen hat? Ich werde dich als Dieb der Rebellen verhaften lassen und dadurch meine Position im Orden verbessern. Wie fühlt es sich an als ahnungslose Schachfigur?",,"Vi do estas la stultulo, kiu ŝtelis la kalikon, ĉu? Mi kaptos vin kiel ribelan ŝteliston, tiel mi plibonigos mian statuson kun La Ordeno. Kiel vi sentas, ke vi estas nevola marioneto?","¿Así que tú eres el necio que ha robado el cáliz? Te capturaré como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario?","¿Así que tú eres el tonto que se robó el cáliz? Te voy a capturar como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario?","Vai sinä olet se houkka, joka varasti kalkin? Pidätytän sinut kapinallisvarkaana, siten parantaen asemaani Veljeskunnassa. Miltäpä tuntuu olla tahaton pelinappula?","Vous êtes l'abruti qui a volé le calice? Maintenant il faut que je vous arrète comme voleur rebelle.. Ca va aider ma position dans l'Ordre. Comment ça fait d'être un pion ignorant? Petite idée, ça va faire mal.",Szóval te vagy az isten barma aki ellopta a kelyhet? Jól letartóztatlak mint lázadó tolvaj...ezzel megerősítve a pozíciómat a Rendben. Milyen érzés egy tudatlan parasztnak lenni?,Quindi sei tu il folle che ha rubato il calice? Ti farò arrestare come un ladro ribelle... E così facendo salirò nei ranghi dell'Ordine. Come ci si sente ad essere un'inconsapevole pedina?,"それで、お前が聖杯を盗んだ愚か者か? +¡Me parece que no!",,Pidät sen? Enpä usko!,Le garder? Je ne pense pas!,,Megtartod? Nem hinném öreg!,Davvero intendi tenerlo tu? Mi spiace ma non funziona così!,頂く? 有り得ねえな!,가지고 있겠다고? 내 생각은 아닌데?,Bewaren? Ik denk van niet!,Beholde det? Jeg tror ikke det!,Zatrzymać? Chyba nie!,Ficar com o cálice? Acho que não!,,Păstrezi? Ba nu cred!,Оставишь себе? Ещё чего!,,Behålla den? Jag tror inte det!,Saklamak mı? Hiç sanmıyorum! +What are you waiting for? The governor himself will reward you.,TXT_DLG_SCRIPT33_D24256_WHATA,〃,,,Na co čekáš? Sám guvernér tě odmění.,Hvad venter du på? Guvernøren selv vil belønne dig.,Worauf wartest du? Der Gouverneur wird dich belohnen.,,Kion vi atendas? La registo mem rekompencos vin.,¿A qué estás esperando? El mismísimo gobernador te recompensará.,¿Qué estás esperando? El mismísimo gobernador te va a recompensar.,Mitä oikein odotat? Kuvernööri itse palkitsee sinut.,Qu'attendez-vous? Le gouverneur vous récompensera lui même.,,Mire vársz? Maga a kormányzó fog megjutalmazni.,Che cosa stai aspettando? Il governatore in persona ti ricompenserà.,何突っ立ってんだ? 知事に報酬を受けて来いよ。,꾸물거리지 말고 총독을 만나. 그가 너를 보답해줄 거야.,Waar wacht je nog op? De gouverneur zelf zal je belonen.,Hva venter du på? Guvernøren selv vil belønne deg.,Na co czekasz? Sam gubernator cię nagrodzi.,O que você está esperando? O governador em pessoa vai te recompensar.,,Ce mai aștepți? Guvernatorul însuși te va răsplătii.,Чего ты ждёшь? Губернатор лично наградит тебя.,,Vad väntar du på? Guvernören själv kommer att belöna dig.,Neyi bekliyorsun? Valinin kendisi seni ödüllendirecek. +Die traitor! ,TXT_DLG_SCRIPT33_D25772_DIETR,〃,,,"Zemři, zrádče!","Dø, forræder!","Stirb, Verräter!",,"Mortu, perfidulo!","¡Muere, traidor!",,"Kuole, petturi!","Meurs, traître!",,Halál rád áruló!,Muori traditore!,くたばれ裏切者が!,죽어라. 배신자!,Sterf de verrader!,"Dø, forræder!",Giń zdrajco!,"Morra, traidor!",,Mori trădătorule!,"Умри, предатель!",,Dö förrädare!,Geber hain! +So you're the fool who stole the chalice? I'm going to have you arrested as a rebel thief... Thereby enhancing my position with the Order. How does it feel to be an unwitting pawn? ,TXT_DLG_SCRIPT33_D27288_SOYOU,MAP33: Mourel.,,,"Tak ty jsi ten blázen, který ukradl kalich? Teď tě nechám zatknout jako rebelského zloděj... a tím si upevním svou pozici s Řádem. Jaký je to pocit, být bezděčnou figurkou?","Så du er det fjols, der stjal bægeret? Jeg vil få dig arresteret som en oprørsk tyv... og derved forbedre min position i ordenen. Hvordan føles det at være en uvidende brik?","So, du bist also der Narr der den Kelch gestohlen hat? Ich werde dich als Dieb der Rebellen verhaften lassen und dadurch meine Position im Orden verbessern. Wie fühlt es sich an als ahnungslose Schachfigur?",,"Vi do estas la stultulo, kiu ŝtelis la kalikon, ĉu? Mi kaptos vin kiel ribelan ŝteliston, tiel mi plibonigos mian statuson kun La Ordeno. Kiel vi sentas, ke vi estas nevola marioneto?","¿Así que tú eres el necio que ha robado el cáliz? Te capturaré como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario?","¿Así que tú eres el tonto que se robó el cáliz? Te voy a capturar como ladrón rebelde, mejorando así mi posición con La Orden. ¿Qué se siente ser un peón involuntario?","Vai sinä olet se houkka, joka varasti kalkin? Pidätytän sinut kapinallisvarkaana, siten parantaen asemaani Veljeskunnassa. Miltäpä tuntuu olla tahaton pelinappula?","Vous êtes l'abruti qui a volé le calice? Maintenant il faut que je vous arrète comme voleur rebelle.. Ca va aider ma position dans l'Ordre. Comment ça fait d'être un pion ignorant? Petite idée, ça va faire mal.",,Szóval te vagy az isten barma aki ellopta a kelyhet? Jól letartóztatlak mint lázadó tolvaj...ezzel megerősítve a pozíciómat a Rendben. Milyen érzés egy tudatlan parasztnak lenni?,Quindi sei tu il folle che ha rubato il calice? Ti farò arrestare come un ladro ribelle... E così facendo salirò nei ranghi dell'Ordine. Come ci si sente ad essere un'inconsapevole pedina?,"それで、お前が聖杯を盗んだ愚か者か? 私は反賊としてお前を逮捕するつもりだ... そうすればオーダーでの地位が上がる。 無意味な駒だと思うか? ",그래서 네가 그 성배를 훔친 바보로군? 반군 절도범으로 체포해주지... 오더에서의 내 위치도 올리는 겸. 모르는 사이에 장물아비가 된 기분이 어떤가?,Dus jij bent de dwaas die de kelk heeft gestolen? Ik ga je laten arresteren als rebelse dief.... Daardoor verbeter ik mijn positie bij de Orde. Hoe voelt het om een onwetende pion te zijn?,Så du er tosken som stjal begeret? Jeg skal få deg arrestert som en opprørsk tyv... Og dermed styrke min posisjon i Ordenen. Hvordan føles det å være en uvitende brikke?,"Więc to ty jesteś tym głupcem, który ukradł kielich? Każę cię aresztować jako buntowniczego złodzieja... Tym samym wzmocnię swoją pozycję w Zakonie. Jakie to uczucie być nieświadomym pionkiem?",Então você é o idiota que roubou o cálice? Eu vou prender você por ser um ladrão rebelde... E assim vou melhorar minha posição com a Ordem. Como se sente sendo um plebeu ignorante?,,Deci tu ești tolomacul care a furat potirul? Am să te arestez drept un hoț rebel... Prin urmare crescând in rangurile Ordinului. Cum e să fii un pion?,"Так это ты тот недоумок, что украл чашу? Я передам тебя Ордену, как вора повстанцев... Это укрепит мои отношения с ним. Каково чувствовать себя безмозглой пешкой?",,Så du är dåren som stal kalken? Jag kommer att låta arrestera dig som en upprorisk tjuv... och därmed förbättra min ställning i orden. Hur känns det att vara en ovetande bricka?,Demek kadehi çalan aptal sensin? Seni asi bir hırsız olarak tutuklatacağım. Böylece Tarikat'taki konumumu güçlendireceğim. Farkında olmadan bir piyon olmak nasıl bir duygu? -It sucks!,TXT_RPLY0_SCRIPT33_D27288_ITSUC,〃,,,Je to na hovno!,Det stinker!,Scheiße!,,Tio estas aĉa!,¡Apesta!,,Ihan perseestä!,Quelle merde!,Ez szopás!,È uno schifo!,クソが!,기분이 아주 좆같아.,Het is klote!,Det suger!,Do dupy!,É uma merda!,,Nașpa!,Чтоб ты сдох!,,Det suger!,Berbat! -For you it does.,TXT_RYES0_SCRIPT33_D27288_FORYO,〃,,,Pro tebe určitě.,For dig gør det.,Du steckst ganz tief drin.,,Por vi ja.,Para ti sí.,,"Kyllä, sinun tilanteesi.","Pour vous, en effet.",...és a bráner rossz végén vagy.,Ti faccio vedere io!,私もそう思う。,더한 기분이 들게 해주지.,Voor jou wel.,For deg gjør det det.,Dla ciebie tak.,"Pra você, é mesmo.",,"Pentru tine, într-adevăr este.",Скоро сдохнешь ты.,,För dig gör det det.,Senin için öyle. -Harris promised me money!,TXT_RPLY1_SCRIPT33_D27288_HARRI,〃,,,Harris mi slíbil peníze!,Harris lovede mig penge!,Harris hat mir Geld versprochen!,,Harris promesis monon al mi!,¡Harris me prometió dinero!,,Harris lupasi minulle rahaa!,Harris m'a promis de l'argent!,Harris pénzt ígért nekem.,Harris mi ha promesso dei soldi!,ハリスは俺に金を渡すと約束したのに!,해리스가 날 배신했어... 이 새끼!,Harris beloofde me geld!,Harris lovet meg penger!,Harris obiecał mi pieniądze!,O Harris prometeu me pagar!,,Harris mi-a promis bani!,Харрис обещал мне деньги!,,Harris lovade mig pengar!,Harris bana para sözü verdi! +It sucks!,TXT_RPLY0_SCRIPT33_D27288_ITSUC,〃,,,Je to na hovno!,Det stinker!,Scheiße!,,Tio estas aĉa!,¡Apesta!,,Ihan perseestä!,Quelle merde!,,Ez szopás!,È uno schifo!,クソが!,기분이 아주 좆같아.,Het is klote!,Det suger!,Do dupy!,É uma merda!,,Nașpa!,Чтоб ты сдох!,,Det suger!,Berbat! +For you it does.,TXT_RYES0_SCRIPT33_D27288_FORYO,〃,,,Pro tebe určitě.,For dig gør det.,Du steckst ganz tief drin.,,Por vi ja.,Para ti sí.,,"Kyllä, sinun tilanteesi.","Pour vous, en effet.",,...és a bráner rossz végén vagy.,Ti faccio vedere io!,私もそう思う。,더한 기분이 들게 해주지.,Voor jou wel.,For deg gjør det det.,Dla ciebie tak.,"Pra você, é mesmo.",,"Pentru tine, într-adevăr este.",Скоро сдохнешь ты.,,För dig gör det det.,Senin için öyle. +Harris promised me money!,TXT_RPLY1_SCRIPT33_D27288_HARRI,〃,,,Harris mi slíbil peníze!,Harris lovede mig penge!,Harris hat mir Geld versprochen!,,Harris promesis monon al mi!,¡Harris me prometió dinero!,,Harris lupasi minulle rahaa!,Harris m'a promis de l'argent!,,Harris pénzt ígért nekem.,Harris mi ha promesso dei soldi!,ハリスは俺に金を渡すと約束したのに!,해리스가 날 배신했어... 이 새끼!,Harris beloofde me geld!,Harris lovet meg penger!,Harris obiecał mi pieniądze!,O Harris prometeu me pagar!,,Harris mi-a promis bani!,Харрис обещал мне деньги!,,Harris lovade mig pengar!,Harris bana para sözü verdi! Too bad. The only thing you're getting is death!,TXT_RYES1_SCRIPT33_D27288_TOOBA,〃,,,"Smůla. Jediné, co dostaneš, je smrt!","Det var ærgerligt. Det eneste, du får, er døden!",Jammerschade. Das Einzige was du bekommen wirst ist der Tod!,,"Kiel domaĝe. Ĉio, kion vi havos estas morto!","Qué mal. ¡Lo único que tendrás es la muerte!","Qué mal. ¡Lo único que -vas a tener es la muerte!","Voi voi. Sen kyllä voin sinulle luvata, että kuolet!","Dommage. Tout ce que vous allez recevoir, c'est votre mort!","Így jártál. Az egyetlen dolog amit kapsz, az a halál.",Peccato. L'unica cosa che otterrai è la morte.,残念だな、お前にやれるものは死のみだ!,안됐네. 넌 여기서 죽게 될테니까!,Jammer. Het enige wat je krijgt is de dood!,"Synd for deg. Det eneste du får, er døden!",Szkoda. Jedyne co dostaniesz to śmierć!,Que pena. A única coisa que você vai receber é a morte!,,Păcat. Tot ce vei primi e moarte!,"Увы. Всё, что ты получишь, — это смерть!",,Det var synd. Det enda du får är döden!,Çok yazık. Alacağın tek şey ölüm! -We're going to kill you!,TXT_DLG_SCRIPT33_D28804_WEREG,,,,Zabijeme tě!,Vi slår dig ihjel!,Wir werden euch töten!,,Ni mortigos vin!,¡Te vamos a matar!,,Tapamme sinut!,On va te buter!,Megölünk!,Adesso ti ammazziamo!,お前をぶっ殺す!,우린 널 죽일 거야!,We gaan je vermoorden!,Vi skal drepe deg!,Zabijemy cię!,Nós vamos te matar!,,Te vom omorâ!,Готовься к смерти!,,Vi ska döda dig!,Seni öldüreceğiz! -Get out of here!,TXT_DLG_SCRIPT33_D30320_GETOU,,,,Vypadni odsud!,Forsvind herfra!,Verschwinde von hier!,,Foriru!,¡Sal de aquí!,,Häivy täältä!,Sortez de là!,Pusztulj innen!,Fuori di qui!,ここから立ち去れ!,여길 나가!,Maak dat je hier wegkomt!,Forsvinn herfra!,Wynoś się stąd!,Saia daqui!,,Valea!,Убирайся отсюда!,,Stick härifrån!,Defolun buradan! -We're going to kill you!,TXT_DLG_SCRIPT33_D31836_WEREG,MAP33: Green acolytes (beginning).,,,Zabijeme tě!,Vi slår dig ihjel!,Wir werden euch töten!,,Ni mortigos vin!,¡Te vamos a matar!,,Tapamme sinut!,On va te buter!,Megölünk!,Adesso ti ammazziamo!,お前をぶっ殺す!,널 죽이는걸 즐길테다.,We gaan je vermoorden!,Vi skal drepe deg!,Zabijemy cię!,Nós vamos te matar!,,Te vom omorâ!,Готовься к смерти!,,Vi ska döda dig!,Seni öldüreceğiz! -Get out of here!,TXT_DLG_SCRIPT33_D33352_GETOU,MAP33: Yellow acolytes.,,,Vypadni odsud!,Kom ud herfra!,Verschwinde von hier!,,Foriru!,¡Sal de aquí!,,Häivy täältä!,Sortez de là!,Pusztulj innen!,Fuori di qui!,ここから立ち去れ!,여기서 뭐하는 거야? 꺼져!,Maak dat je wegkomt!,Forsvinn herfra!,Wynoś się stąd!,Saia daqui!,,Valea!,Убирайся отсюда!,,Stick härifrån!,Defolun buradan! -"What a perfect place for us, under the old town hall. The Order thinks they've wiped us out, but all it was is a reminder to us of what can happen when you become careless. ",TXT_DLG_SCRIPT34_D0_WHATA,MAP34: Barracks.,,,"Tady pod starou radnicí to je pro nás ideální místo. Řád si myslí, že nás vyhladil, ale pouze nám připomněl, co se může stát, když jsi neopatrný.","Sikke et perfekt sted for os, under det gamle rådhus. Ordenen tror, at de har udryddet os, men det var blot en påmindelse til os om, hvad der kan ske, når man bliver uforsigtig.","Was für ein Perfekter Ort für uns, unter dem alten Rathaus. Der Orden glaubt, er hätte uns vernichtet, aber es war nur ein Denkzettel für uns, was passieren kann wenn man unaufmerksam ist.",,"Kia perfekta kaŝejo por ni: sub la antikva urbodomo. La Ordeno kredas, ke ĝi ekstermis nin, sed ĉi tio estis nur memoraĵo pri tio, kio povas okazi kiam ni estas senatentaj.","Qué lugar tan perfecto para nosotros: bajo el antiguo ayuntamiento. La Orden cree habernos aniquilado, pero solo ha sido un recordatorio de lo que puede pasar al descuidarnos.",,"Tämähän on täydellinen paikka meille, vanhan kaupungintalon alla. Veljeskunta luulee hävittäneensä meidät, mutta se toimi meille ainoastaan muistutuksena siitä, mitä voi tapahtua, kun tulee varomattomaksi.","Quel endroit parafait pour nous, sous la mairie. L'Ordre pense qu'ils nous ont tous tués, mais ça leur servira de leçon, ils verront se qu'il se passe quand on ne fait pas attention..","A városháza alatt, micsoda tökéletes hely. A Rend azt hiszi kiírtott mindőnket, de ez csak egy emlékeztető volt arra, hogy mi történik ha felelőtlenek vagyunk.","È davvero un posto perfetto per noi, sotto il vecchio municipio. L'Ordine pensa di averci spazzato via, ma è stato solo un avvertimento di cosa può succederci se siamo troppo incauti.","旧市庁舎の下で、 +vas a tener es la muerte!","Voi voi. Sen kyllä voin sinulle luvata, että kuolet!","Dommage. Tout ce que vous allez recevoir, c'est votre mort!",,"Így jártál. Az egyetlen dolog amit kapsz, az a halál.",Peccato. L'unica cosa che otterrai è la morte.,残念だな、お前にやれるものは死のみだ!,안됐네. 넌 여기서 죽게 될테니까!,Jammer. Het enige wat je krijgt is de dood!,"Synd for deg. Det eneste du får, er døden!",Szkoda. Jedyne co dostaniesz to śmierć!,Que pena. A única coisa que você vai receber é a morte!,,Păcat. Tot ce vei primi e moarte!,"Увы. Всё, что ты получишь, — это смерть!",,Det var synd. Det enda du får är döden!,Çok yazık. Alacağın tek şey ölüm! +We're going to kill you!,TXT_DLG_SCRIPT33_D28804_WEREG,,,,Zabijeme tě!,Vi slår dig ihjel!,Wir werden euch töten!,,Ni mortigos vin!,¡Te vamos a matar!,,Tapamme sinut!,On va te buter!,,Megölünk!,Adesso ti ammazziamo!,お前をぶっ殺す!,우린 널 죽일 거야!,We gaan je vermoorden!,Vi skal drepe deg!,Zabijemy cię!,Nós vamos te matar!,,Te vom omorâ!,Готовься к смерти!,,Vi ska döda dig!,Seni öldüreceğiz! +Get out of here!,TXT_DLG_SCRIPT33_D30320_GETOU,,,,Vypadni odsud!,Forsvind herfra!,Verschwinde von hier!,,Foriru!,¡Sal de aquí!,,Häivy täältä!,Sortez de là!,,Pusztulj innen!,Fuori di qui!,ここから立ち去れ!,여길 나가!,Maak dat je hier wegkomt!,Forsvinn herfra!,Wynoś się stąd!,Saia daqui!,,Valea!,Убирайся отсюда!,,Stick härifrån!,Defolun buradan! +We're going to kill you!,TXT_DLG_SCRIPT33_D31836_WEREG,MAP33: Green acolytes (beginning).,,,Zabijeme tě!,Vi slår dig ihjel!,Wir werden euch töten!,,Ni mortigos vin!,¡Te vamos a matar!,,Tapamme sinut!,On va te buter!,,Megölünk!,Adesso ti ammazziamo!,お前をぶっ殺す!,널 죽이는걸 즐길테다.,We gaan je vermoorden!,Vi skal drepe deg!,Zabijemy cię!,Nós vamos te matar!,,Te vom omorâ!,Готовься к смерти!,,Vi ska döda dig!,Seni öldüreceğiz! +Get out of here!,TXT_DLG_SCRIPT33_D33352_GETOU,MAP33: Yellow acolytes.,,,Vypadni odsud!,Kom ud herfra!,Verschwinde von hier!,,Foriru!,¡Sal de aquí!,,Häivy täältä!,Sortez de là!,,Pusztulj innen!,Fuori di qui!,ここから立ち去れ!,여기서 뭐하는 거야? 꺼져!,Maak dat je wegkomt!,Forsvinn herfra!,Wynoś się stąd!,Saia daqui!,,Valea!,Убирайся отсюда!,,Stick härifrån!,Defolun buradan! +"What a perfect place for us, under the old town hall. The Order thinks they've wiped us out, but all it was is a reminder to us of what can happen when you become careless. ",TXT_DLG_SCRIPT34_D0_WHATA,MAP34: Barracks.,,,"Tady pod starou radnicí to je pro nás ideální místo. Řád si myslí, že nás vyhladil, ale pouze nám připomněl, co se může stát, když jsi neopatrný.","Sikke et perfekt sted for os, under det gamle rådhus. Ordenen tror, at de har udryddet os, men det var blot en påmindelse til os om, hvad der kan ske, når man bliver uforsigtig.","Was für ein Perfekter Ort für uns, unter dem alten Rathaus. Der Orden glaubt, er hätte uns vernichtet, aber es war nur ein Denkzettel für uns, was passieren kann wenn man unaufmerksam ist.",,"Kia perfekta kaŝejo por ni: sub la antikva urbodomo. La Ordeno kredas, ke ĝi ekstermis nin, sed ĉi tio estis nur memoraĵo pri tio, kio povas okazi kiam ni estas senatentaj.","Qué lugar tan perfecto para nosotros: bajo el antiguo ayuntamiento. La Orden cree habernos aniquilado, pero solo ha sido un recordatorio de lo que puede pasar al descuidarnos.",,"Tämähän on täydellinen paikka meille, vanhan kaupungintalon alla. Veljeskunta luulee hävittäneensä meidät, mutta se toimi meille ainoastaan muistutuksena siitä, mitä voi tapahtua, kun tulee varomattomaksi.","Quel endroit parafait pour nous, sous la mairie. L'Ordre pense qu'ils nous ont tous tués, mais ça leur servira de leçon, ils verront se qu'il se passe quand on ne fait pas attention..",,"A városháza alatt, micsoda tökéletes hely. A Rend azt hiszi kiírtott mindőnket, de ez csak egy emlékeztető volt arra, hogy mi történik ha felelőtlenek vagyunk.","È davvero un posto perfetto per noi, sotto il vecchio municipio. L'Ordine pensa di averci spazzato via, ma è stato solo un avvertimento di cosa può succederci se siamo troppo incauti.","旧市庁舎の下で、 私たちにとって何という完璧な場所です。 秩序は彼らが私たちを消滅させたと考 えていますが、それがすべてだったのは あなたが不注意になったときに起こり得ることを 私たちに思い出させるものです。","정말 경치 좋지? 이 박살 난 시청 주변에서. 오더 놈들이 우리들을 전멸했다고 자랑하는데, 우리들이 힘을 모아서 복수하기 전까진 그렇게 놓아두는 게 좋을 것 같아.","Wat een perfecte plek voor ons, onder het oude stadhuis. De Orde denkt dat ze ons hebben weggevaagd, maar het enige wat ons eraan herinnert is wat er kan gebeuren als je onzorgvuldig wordt.","For et perfekt sted for oss, under det gamle rådhuset. Ordenen tror de har utslettet oss, men det var bare en påminnelse om hva som kan skje når man er uforsiktig.","Co za idealne miejsce dla nas, pod starym ratuszem. Zakon myśli, że nas wymazał, ale to było tylko przypomnienie nam, co może się stać, gdy staniesz się nieostrożny.","Que lugar perfeito para nós, abaixo da antiga prefeitura. A Ordem pensa que nos aniquilou, mas aquilo tudo foi para lembrarmos do que pode acontecer quando você não é cauteloso.",,"Ce loc perfect pentru noi, exact sub vechea hală a orașului. Oridnul crede că ne-a ras pe toți, dar a fost doar o amintire pentru ceea ce se poate întâmpla când devi neglijent.","Здесь, под городской ратушей, такое чудесное место для нашей базы! Орден думает, что мы разгромлены, но мы всего лишь усвоили урок о цене беспечности.",,"Vilken perfekt plats för oss, under det gamla stadshuset. Orden tror att de har utplånat oss, men det var bara en påminnelse för oss om vad som kan hända när man blir oförsiktig.","Bizim için ne mükemmel bir yer, eski belediye binasının altı. Tarikat bizi yok ettiklerini sanıyor ama bu bize dikkatsiz davrandığımızda neler olabileceğini hatırlattı." -"Talk to Macil, he'll be able to help you.",TXT_DLG_SCRIPT34_D1516_TALKT,MAP34,,,Promluv si s Macilem. On ti pomůže.,"Tal med Macil, han vil kunne hjælpe dig.",Rede mit Macil. Er kann dir helfen.,,Parolu kun Macil. Li povos helpi vin.,Habla con Macil. Él te podrá ayudar.,Habla con Macil. Él te va a poder ayudar.,Puhu Macilille. Hän pystyy auttamaan sinua.,Parlez à Macil. Il pourra vous aider.,"Beszélj Macillal, majd ő segít.","Parla con Macil, lui sarà in grado di aiutarti.",マシルと話すんだ。彼から援助が得られるはず。,"마실 사령관님에게 말해, 그가 널 도울 수 있을 거야.","Praat met Macil, hij zal je kunnen helpen.",Snakk med Macil. Han kan hjelpe deg.,"Porozmawiaj z Macil, on będzie w stanie ci pomóc.",Fale com o Macil. Ele vai poder te ajudar.,,"Vorbește cu Macil, el te poate ajuta.",Обратись к Мэйсилу. Он поможет тебе.,,"Prata med Macil, han kommer att kunna hjälpa dig.","Macil'le konuş, sana yardım edebilir." -I've heard that Macil's going to start something again soon. We need a big hit after the last fiasco. One more like that and we'll be too weak to continue.,TXT_DLG_SCRIPT34_D3032_IVEHE,MAP34: Barracks.,,,"Slyšel jsem, že Macil má v plánu brzy něco znovu podniknout. Potřebujeme něco velkého po posledním fiasku. Ještě jednou něco takového a budeme příliš slabí pokračovat.","Jeg har hørt, at Macil snart vil starte noget igen. Vi har brug for et stort hit efter den sidste fiasko. En mere af den slags, og vi vil være for svage til at fortsætte.","Ich habe gehört, Macil hätte einen Plan um den Orden zu unterwandern. Ich hoffe mal, er taugt was. Noch ein Fehlschlag und wir können uns gleich begraben lassen.",,"Mi aŭdis, ke Macil baldaŭ komencos ion novan. Ni bezonas grandan trafon post la lasta fiasko: ankoraŭ unu kaj ni estos sufiĉe malfortaj por daŭrigi.",He oído que Macil va a empezar algo nuevo pronto. Necesitamos algo bueno después del último fiasco: uno más así y seremos demasiado débiles para continuar.,Oí que Macil va a empezar algo nuevo pronto. Necesitamos algo bueno después del último fracaso: uno más así y vamos a ser demasiado débiles para continuar.,"Kuulin, että Macil alkaa taas viritellä jotain. Tarvitsemme jättionnistumisen edellisen fiaskon jälkeen. Vielä yksikin samanlainen, ja olemme liian heikkoja jatkamaan.",J'entends que Macil va essayer de faire quelque chose bientôt. Il nous faut frapper un grand coup après le dernier fiasco. Encore un comme celui-ci et on sera trop affaibli pour continuer.,"Az a hír járja, hogy Macil újra készül valamire. Kell egy nagy fogás a múltkori fiaskó után. Még egy ilyen, és túl gyengék leszünk a folytatáshoz.",Ho sentito che Macil ha intenzione di partire all'attacco molto presto. Abbiamo bisogno di un grosso colpo dopo l'ultimo disastro. Se subiamo un'altra sconfitta del genere saremo troppo deboli per continuare.,"私はマシルがオーダーを転覆させる計画を +"Talk to Macil, he'll be able to help you.",TXT_DLG_SCRIPT34_D1516_TALKT,MAP34,,,Promluv si s Macilem. On ti pomůže.,"Tal med Macil, han vil kunne hjælpe dig.",Rede mit Macil. Er kann dir helfen.,,Parolu kun Macil. Li povos helpi vin.,Habla con Macil. Él te podrá ayudar.,Habla con Macil. Él te va a poder ayudar.,Puhu Macilille. Hän pystyy auttamaan sinua.,Parlez à Macil. Il pourra vous aider.,,"Beszélj Macillal, majd ő segít.","Parla con Macil, lui sarà in grado di aiutarti.",マシルと話すんだ。彼から援助が得られるはず。,"마실 사령관님에게 말해, 그가 널 도울 수 있을 거야.","Praat met Macil, hij zal je kunnen helpen.",Snakk med Macil. Han kan hjelpe deg.,"Porozmawiaj z Macil, on będzie w stanie ci pomóc.",Fale com o Macil. Ele vai poder te ajudar.,,"Vorbește cu Macil, el te poate ajuta.",Обратись к Мэйсилу. Он поможет тебе.,,"Prata med Macil, han kommer att kunna hjälpa dig.","Macil'le konuş, sana yardım edebilir." +I've heard that Macil's going to start something again soon. We need a big hit after the last fiasco. One more like that and we'll be too weak to continue.,TXT_DLG_SCRIPT34_D3032_IVEHE,MAP34: Barracks.,,,"Slyšel jsem, že Macil má v plánu brzy něco znovu podniknout. Potřebujeme něco velkého po posledním fiasku. Ještě jednou něco takového a budeme příliš slabí pokračovat.","Jeg har hørt, at Macil snart vil starte noget igen. Vi har brug for et stort hit efter den sidste fiasko. En mere af den slags, og vi vil være for svage til at fortsætte.","Ich habe gehört, Macil hätte einen Plan um den Orden zu unterwandern. Ich hoffe mal, er taugt was. Noch ein Fehlschlag und wir können uns gleich begraben lassen.",,"Mi aŭdis, ke Macil baldaŭ komencos ion novan. Ni bezonas grandan trafon post la lasta fiasko: ankoraŭ unu kaj ni estos sufiĉe malfortaj por daŭrigi.",He oído que Macil va a empezar algo nuevo pronto. Necesitamos algo bueno después del último fiasco: uno más así y seremos demasiado débiles para continuar.,Oí que Macil va a empezar algo nuevo pronto. Necesitamos algo bueno después del último fracaso: uno más así y vamos a ser demasiado débiles para continuar.,"Kuulin, että Macil alkaa taas viritellä jotain. Tarvitsemme jättionnistumisen edellisen fiaskon jälkeen. Vielä yksikin samanlainen, ja olemme liian heikkoja jatkamaan.",J'entends que Macil va essayer de faire quelque chose bientôt. Il nous faut frapper un grand coup après le dernier fiasco. Encore un comme celui-ci et on sera trop affaibli pour continuer.,,"Az a hír járja, hogy Macil újra készül valamire. Kell egy nagy fogás a múltkori fiaskó után. Még egy ilyen, és túl gyengék leszünk a folytatáshoz.",Ho sentito che Macil ha intenzione di partire all'attacco molto presto. Abbiamo bisogno di un grosso colpo dopo l'ultimo disastro. Se subiamo un'altra sconfitta del genere saremo troppo deboli per continuare.,"私はマシルがオーダーを転覆させる計画を 持っていると聞いた。そうだと良かったが。 我々は一度大敗し全滅しかけた。",마실 사령관이 또 다른 작전을 준비한데. 그전에 일어났던 대참사보다 훨씬 나은 작전이었으면 좋겠는데. 운이 나쁘면 많은 병력을 잃어버릴 것 같아.,Ik heb gehoord dat Macil binnenkort weer met iets gaat beginnen. We hebben een grote hit nodig na het laatste fiasco. Nog zo'n hit en dan zijn we te zwak om verder te gaan.,"Jeg har hørt at Macil skal starte noe igjen snart. Vi trenger en stor hit etter den siste fiaskoen. En til, så er vi for svake til å fortsette.","Słyszałem, że Macil ma zamiar wkrótce znowu coś zacząć. Potrzebujemy dużego uderzenia po ostatnim fiasku. Jeszcze jedno takie i będziemy zbyt słabi, by kontynuować.",Fiquei sabendo que o Macil planeja começar algo logo. Precisamos acertar um grande golpe depois do último fiasco. Se aquilo se repetir nós não teremos força para continuar.,,Am auzit că Macil va începe ceva curând. Trebuie să dăm lovitura după ultimul fiasco. Încă unul și vom fi prea slabi să continuăm.,"Я слышал, что Мэйсил готовит новую операцию после провала предыдущей. Она должна быть крайне успешной. После второго такого провала мы уже не оправимся.",,Jag har hört att Macil snart ska starta något igen. Vi behöver en stor succé efter det senaste fiaskot. En sån där till och vi blir för svaga för att fortsätta.,Macil'in yakında yeniden bir şeyler başlatacağını duydum. Son fiyaskodan sonra büyük bir vuruşa ihtiyacımız var. Bir daha böyle bir şey olursa devam edemeyecek kadar zayıf düşeriz. -A few of these barrels dumped into their water supply should even the odds a little. ,TXT_DLG_SCRIPT34_D4548_AFEWO,〃,,,Pár těhle sudů v jejich zásobách vody by nám mělo alespoň trochu pomoct.,Et par af disse tønder dumpet i deres vandforsyning burde udligne oddsene lidt.,"Wenn wir ein paar von diesen Fässern in die Wasserversorgung kippen, sollte das unsere Chancen etwas verbessern.",,Ĵeti kelkajn el ĉi tiuj bareloj en ilian akvo-provizadon devus egaligi iomete la eblojn.,Tirar unos cuantos de estos barriles a su suministro de agua debería igualar un poco las probabilidades.,,Muutaman tällaisen tynnyrin kaataminen heidän vedenjakeluunsa varmaankin hieman tasoittaisi tilannetta.,Quelques tonneaux vidés dans leur réserve d'eau devrait aplanir le terrain de jeu.,Kicsit kiegyenlíti az erőviszonyokat ha ezt a pár hordót beleöntjük a víztározójukba.,Un paio di questi barili rovesciati dentro la loro fornitura d'acqua dovrebbero bilanciare un po' le cose.,"ここの樽は捨てられていた物で +A few of these barrels dumped into their water supply should even the odds a little. ,TXT_DLG_SCRIPT34_D4548_AFEWO,〃,,,Pár těhle sudů v jejich zásobách vody by nám mělo alespoň trochu pomoct.,Et par af disse tønder dumpet i deres vandforsyning burde udligne oddsene lidt.,"Wenn wir ein paar von diesen Fässern in die Wasserversorgung kippen, sollte das unsere Chancen etwas verbessern.",,Ĵeti kelkajn el ĉi tiuj bareloj en ilian akvo-provizadon devus egaligi iomete la eblojn.,Tirar unos cuantos de estos barriles a su suministro de agua debería igualar un poco las probabilidades.,,Muutaman tällaisen tynnyrin kaataminen heidän vedenjakeluunsa varmaankin hieman tasoittaisi tilannetta.,Quelques tonneaux vidés dans leur réserve d'eau devrait aplanir le terrain de jeu.,,Kicsit kiegyenlíti az erőviszonyokat ha ezt a pár hordót beleöntjük a víztározójukba.,Un paio di questi barili rovesciati dentro la loro fornitura d'acqua dovrebbero bilanciare un po' le cose.,"ここの樽は捨てられていた物で 彼らの給水を補っている。","놈들의 상수도에서 내려온 이 통들, 이상하지 않아? 뭔가 승산이 있을 것 같아.","Een paar van deze vaten die in hun watertoevoer gedumpt worden, zullen de kans op een beetje gelijk zijn.",Et par av disse tønnene dumpet i vannforsyningen deres burde jevne ut oddsene litt.,Kilka tych beczek wrzuconych do ich wodociągów powinno trochę wyrównać szanse.,Alguns desses barris despejados no estoque de água deles deve melhorar um pouco as nossas chances.,,Câteva butoaie aruncate în rezerva lor de apă ar trebui să egaleze șansele.,"Несколько таких бочек, сброшенных в их водоснабжение, причинят немало неприятностей.",,Några av de här tunnorna dumpade i deras vattenförsörjning borde jämna ut oddsen lite.,Bu varillerden birkaçını su kaynaklarına boşaltmak olasılıkları biraz olsun eşitler. I'm working on something that will give us an edge. It will increase your stamina and completely jack you up. I've almost got all the bugs worked out. Can I do something for you? ,TXT_DLG_SCRIPT34_D6064_IMWOR,"MAP34: Gerald. -(Except for row 1335, everything in rows 1323-1343 is identical to 725-745)",,,"Pracuju na něčem, co by nám mělo pomoci. Přidá ti to výdrž a naprosto tě to napumpuje. Už jsem skoro vychytal všechny mouchy. Co pro tebe mohu udělat?","Jeg arbejder på noget, der vil give os en fordel. Det vil øge din udholdenhed og gøre dig helt oppe at køre. Jeg har næsten fået styr på alle fejlene. Må jeg gøre noget for dig?","Ich arbeite an etwas, das uns einen Vorteil verschaffen kann. Es würde deine Ausdauer erhöhen und dir Superkräfte verleihen. Kann ich was für dich tun?",,"Mi laboras super io, kio donos avantaĝon al ni: ĝi pliigos vian energion kaj korpan forton. Mi jam korektis la plimulton de la cimoj. Ĉu mi povas fari ion por vi?",Estoy trabajando en algo que nos dará una ventaja: aumentará tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,Estoy trabajando en algo que nos va a dar una ventaja: va a aumentar tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,"Olen paraikaa työstämässä jotain, joka antaa meille etulyöntiaseman. Se kasvattaa kuntoasi ja täydellisesti virittää lihaksesi. Olen melkein saanut hiottua kaikki viat. Voinko olla jotenkin avuksi?",Je travaille sur quelque chose qui nous donnera un peu d'avance. Ca devrait augmenter votre endurance et vous donner un sacré coup de jus. Je crois que j'ai corrigé presque tous les bugs. Je peux vous aider?,"Dolgozok valamin, ami egy jelentősebb előnyhöz juttat minket. Megerősíti az állóképességedet és teljesen felpumpálja a tested. Már majdnem kiküszöböltem a hibákat. Amúgy tudok valamiben segíteni?",Sto lavorando a qualcosa che ci darà un notevole vantaggio. Aumenterà la tua resistenza e ti farà sentire molto più forte. Ho quasi risolto tutti gli effetti collaterali. Posso fare qualcosa per te?,"私は研究にも取り組んでいる。貴方のスタミナを +(Except for row 1335, everything in rows 1323-1343 is identical to 725-745)",,,"Pracuju na něčem, co by nám mělo pomoci. Přidá ti to výdrž a naprosto tě to napumpuje. Už jsem skoro vychytal všechny mouchy. Co pro tebe mohu udělat?","Jeg arbejder på noget, der vil give os en fordel. Det vil øge din udholdenhed og gøre dig helt oppe at køre. Jeg har næsten fået styr på alle fejlene. Må jeg gøre noget for dig?","Ich arbeite an etwas, das uns einen Vorteil verschaffen kann. Es würde deine Ausdauer erhöhen und dir Superkräfte verleihen. Kann ich was für dich tun?",,"Mi laboras super io, kio donos avantaĝon al ni: ĝi pliigos vian energion kaj korpan forton. Mi jam korektis la plimulton de la cimoj. Ĉu mi povas fari ion por vi?",Estoy trabajando en algo que nos dará una ventaja: aumentará tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,Estoy trabajando en algo que nos va a dar una ventaja: va a aumentar tu aguante y fuerza física. Ya casi tengo todos los fallos corregidos. ¿Puedo hacer algo por ti?,"Olen paraikaa työstämässä jotain, joka antaa meille etulyöntiaseman. Se kasvattaa kuntoasi ja täydellisesti virittää lihaksesi. Olen melkein saanut hiottua kaikki viat. Voinko olla jotenkin avuksi?",Je travaille sur quelque chose qui nous donnera un peu d'avance. Ca devrait augmenter votre endurance et vous donner un sacré coup de jus. Je crois que j'ai corrigé presque tous les bugs. Je peux vous aider?,,"Dolgozok valamin, ami egy jelentősebb előnyhöz juttat minket. Megerősíti az állóképességedet és teljesen felpumpálja a tested. Már majdnem kiküszöböltem a hibákat. Amúgy tudok valamiben segíteni?",Sto lavorando a qualcosa che ci darà un notevole vantaggio. Aumenterà la tua resistenza e ti farà sentire molto più forte. Ho quasi risolto tutti gli effetti collaterali. Posso fare qualcosa per te?,"私は研究にも取り組んでいる。貴方のスタミナを 増強し完璧な体にすることも可能だ。 そのインプラントのバグも殆ど取り除かれている ところで何か必要かい?","아주 유용하고 승패를 가릴 수 있는 비장의 카드를 연구 중입니다. 바로 지구력 향상 이식 칩이죠. 이것만 있으면 체력과 힘을 증가시킵니다. 거의 완성되었어요. 이제, 뭘 도와드릴까요?",Ik werk aan iets dat ons een voorsprong geeft. Het zal je uithoudingsvermogen verhogen en je helemaal opkrikken. Ik heb bijna alle bugs uitgewerkt. Kan ik iets voor u doen?,Jeg jobber med noe som vil gi oss en fordel. Det vil øke utholdenheten din og løfte deg helt opp. Jeg har nesten løst alle problemene. Kan jeg gjøre noe for deg?,"Pracuję nad czymś, co da nam przewagę. Zwiększy to twoją wytrzymałość i całkowicie cię podnieci. Mam już prawie dopracowane wszystkie błędy. Mogę coś dla ciebie zrobić?",Estou trabalhando em algo que vai nos dar um impulso. É algo que vai aumentar sua resistência e te deixar bem mais forte. Estou com quase todos os bugs resolvidos. Posso te ajudar com algo?,,Lucrez la ceva ce ne va da un avantaj. Îți va crește rezistența și forța. Am rezolvat aproape toate problemele. Pot să te ajut cu ceva acum?,"Я работаю кое над чем, что может нам пригодиться. Оно увеличит твою выносливость и улучшит самочувствие. Я уже исправил почти все дефекты. Или тебе нужно что-то ещё?",,Jag arbetar på något som kommer att ge oss en fördel. Det kommer att öka din uthållighet och göra dig helt upprymd. Jag har nästan löst alla buggar. Kan jag göra något för dig?,Bize avantaj sağlayacak bir şey üzerinde çalışıyorum. Dayanıklılığınızı arttıracak ve sizi tamamen güçlendirecek. Neredeyse tüm hataları çözdüm. Senin için bir şey yapabilir miyim? -Patch me up.,TXT_RPLY0_SCRIPT34_D6064_PATCH,〃,,,Dej mě do hromady.,Løs mig op.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Hoida minut kuntoon.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Załataj mnie.,Trate meus ferimentos.,,Bandajează-mă.,Перебинтуй меня.,,Laga mig.,Beni yamala. +Patch me up.,TXT_RPLY0_SCRIPT34_D6064_PATCH,〃,,,Dej mě do hromady.,Løs mig op.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Hoida minut kuntoon.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Załataj mnie.,Trate meus ferimentos.,,Bandajează-mă.,Перебинтуй меня.,,Laga mig.,Beni yamala. "Boy, you're a real mess. I'll see what I can do.",TXT_RYES0_SCRIPT34_D6064_BOYYO,〃,,,"Tebe teda zřídili, kluku. Uvidím, co s tebou.","Mand, du er et rigtigt rod. Jeg skal se, hvad jeg kan gøre.","Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Ulo, vi estas iomege en malordo. Mi vidos tion, kion mi faru.","Tío, estás hecho un desastre. A ver qué puedo hacer.","Chico, estás hecho un desastre. -A ver qué puedo hacer.","Voi pojat, oletpa hajalla. Katsotaan, mihin pystyn.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.","Öregem, elég ramaty állapotban vagy. Megnézem mit tehetek.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,가능한 한 아프지 않게 치료하겠습니다.,"Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du ser forferdelig ut. Jeg skal se hva jeg kan gjøre.","Chłopcze, jesteś w niezłym stanie. Zobaczę, co da się zrobić.","Rapaz, você está arrebentado. Verei o que posso fazer.",,"Băiete, ești un dezastru. O să văd ce pot face.","Ты просто месиво. Посмотрим, что я смогу сделать.",,Du är en riktig röra. Jag ska se vad jag kan göra.,"Evlat, gerçekten berbat durumdasın. Ne yapabileceğime bir bakayım." -Stamina implant?,TXT_RPLY1_SCRIPT34_D6064_STAMI,〃,,,Implantát pro výdrž?,Udholdenhedsimplantat?,Ausdauerimplantat?,,Ĉu energidona enplantaĵo?,¿Implante de aguante?,,Kuntoistute?,Implant d'endurance?,Állóképesség implantátum?,Impianto stamina?,スタミナインプラント?,지구력 향상 이식?,Stamina implantaat?,Utholdenhetsimplantat?,Implant wytrzymałościowy?,Implante de resistência?,,Implant de rezistență?,Выносливостный имплант?,,Ett uthållighetsimplantat?,Dayanıklılık implantı mı? +A ver qué puedo hacer.","Voi pojat, oletpa hajalla. Katsotaan, mihin pystyn.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.",,"Öregem, elég ramaty állapotban vagy. Megnézem mit tehetek.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,가능한 한 아프지 않게 치료하겠습니다.,"Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du ser forferdelig ut. Jeg skal se hva jeg kan gjøre.","Chłopcze, jesteś w niezłym stanie. Zobaczę, co da się zrobić.","Rapaz, você está arrebentado. Verei o que posso fazer.",,"Băiete, ești un dezastru. O să văd ce pot face.","Ты просто месиво. Посмотрим, что я смогу сделать.",,Du är en riktig röra. Jag ska se vad jag kan göra.,"Evlat, gerçekten berbat durumdasın. Ne yapabileceğime bir bakayım." +Stamina implant?,TXT_RPLY1_SCRIPT34_D6064_STAMI,〃,,,Implantát pro výdrž?,Udholdenhedsimplantat?,Ausdauerimplantat?,,Ĉu energidona enplantaĵo?,¿Implante de aguante?,,Kuntoistute?,Implant d'endurance?,,Állóképesség implantátum?,Impianto stamina?,スタミナインプラント?,지구력 향상 이식?,Stamina implantaat?,Utholdenhetsimplantat?,Implant wytrzymałościowy?,Implante de resistência?,,Implant de rezistență?,Выносливостный имплант?,,Ett uthållighetsimplantat?,Dayanıklılık implantı mı? "All right, this won't take but a moment.",TXT_RYES1_SCRIPT34_D6064_ALLRI,〃,,,"Dobře, tohle potrvá jen chvilku.","Okay, det tager kun et øjeblik.","Alles klar, das haben wir sofort.",,"Bonege, ĉi tio estos rapidega.","Muy bien, solo tomará un momento.","Muy bien, solo va a -tomar un momento.","Hyvä on, tähän ei mene hetkeä pidempään.","Pas de problème, ça ne prendra qu'un moment.","Rendben, nem vesz igénybe többet pár másodpercnél.","Va bene, ci vorrà solo un momento.",大丈夫、すぐ終わります。,많이 걸리진 않을거에요...,"Oké, dit duurt maar een momentje.",Dette tar bare et øyeblikk.,"Dobra, to zajmie tylko chwilę.","Ok, isso não vai demorar.",,"În regulă, va dura doar un moment.","Отлично, это займёт всего пару секунд.",,"Okej, det här tar bara ett ögonblick.","Pekala, bu bir dakikadan fazla sürmez." +tomar un momento.","Hyvä on, tähän ei mene hetkeä pidempään.","Pas de problème, ça ne prendra qu'un moment.",,"Rendben, nem vesz igénybe többet pár másodpercnél.","Va bene, ci vorrà solo un momento.",大丈夫、すぐ終わります。,많이 걸리진 않을거에요...,"Oké, dit duurt maar een momentje.",Dette tar bare et øyeblikk.,"Dobra, to zajmie tylko chwilę.","Ok, isso não vai demorar.",,"În regulă, va dura doar un moment.","Отлично, это займёт всего пару секунд.",,"Okej, det här tar bara ett ögonblick.","Pekala, bu bir dakikadan fazla sürmez." It's not done yet.,TXT_RNO1_SCRIPT34_D6064_ITSNO,〃,,,Ještě není hotový.,Det er ikke færdigt endnu.,Es ist noch nicht soweit.,,"Mi ankoraŭ -prilaboras ĝin.",Aún no está listo.,,Se ei ole valmis vielä.,Ce n'est pas encore terminé.,Még nincs kész.,Non è ancora pronto.,まだ完成していません。,연구가 진행중입니다. 나중에.,Het is nog niet klaar.,Det er ikke ferdig ennå.,Jeszcze nie skończyłem.,Ainda não terminei.,,Încă nu e gata.,Он ещё не готов.,,Det är inte klart än.,Henüz bitmedi. -"Hey, I'm working on an updated version of your implant. Is there anything else I can do?",TXT_DLG_SCRIPT34_D7580_HEYIM,〃,,,"Hej, pracuju na vylepšené verzi tvého implantátu. Můžu pro tebe udělat něco jiného?","Jeg arbejder på en opdateret version af dit implantat. Er der andet, jeg kan gøre?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Mi laboras super plibonigita versio de via enplantaĵo. Ĉu estas io alia, kion mi povas fari por vi?",Estoy trabajando en una versión mejorada de tu implante. ¿Hay algo más que pueda hacer?,,"Hei, olen työstämässä päivitettyä versiota istutteestasi. Voinko olla muuten avuksi?","Hé, je travaille sur une version améliorée de l'implant. Qu'est-ce que je peux faire pour vous?",Az implantátum újabb verzióján dolgozok. Tudok még valamiben segíteni?,"Ehi, sto lavorando ad un aggiornamento per l'impianto stamina. Posso fare qualcos'altro per te?","どうも、私は今最新版のインプラントに +prilaboras ĝin.",Aún no está listo.,,Se ei ole valmis vielä.,Ce n'est pas encore terminé.,,Még nincs kész.,Non è ancora pronto.,まだ完成していません。,연구가 진행중입니다. 나중에.,Het is nog niet klaar.,Det er ikke ferdig ennå.,Jeszcze nie skończyłem.,Ainda não terminei.,,Încă nu e gata.,Он ещё не готов.,,Det är inte klart än.,Henüz bitmedi. +"Hey, I'm working on an updated version of your implant. Is there anything else I can do?",TXT_DLG_SCRIPT34_D7580_HEYIM,〃,,,"Hej, pracuju na vylepšené verzi tvého implantátu. Můžu pro tebe udělat něco jiného?","Jeg arbejder på en opdateret version af dit implantat. Er der andet, jeg kan gøre?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Mi laboras super plibonigita versio de via enplantaĵo. Ĉu estas io alia, kion mi povas fari por vi?",Estoy trabajando en una versión mejorada de tu implante. ¿Hay algo más que pueda hacer?,,"Hei, olen työstämässä päivitettyä versiota istutteestasi. Voinko olla muuten avuksi?","Hé, je travaille sur une version améliorée de l'implant. Qu'est-ce que je peux faire pour vous?",,Az implantátum újabb verzióján dolgozok. Tudok még valamiben segíteni?,"Ehi, sto lavorando ad un aggiornamento per l'impianto stamina. Posso fare qualcos'altro per te?","どうも、私は今最新版のインプラントに 取り組んでいる。何か用かな?","여어! 이식 칩을 향상할 개조를 받고 싶으신가요? 아니라면, 뭐가 필요합니까?","Hé, ik ben bezig met een bijgewerkte versie van je implantaat. Is er nog iets anders dat ik kan doen?",Jeg jobber med en oppdatert versjon av implantatet ditt. Er det noe annet jeg kan gjøre?,"Hej, pracuję nad unowocześnioną wersją twojego implantu. Czy mogę zrobić coś jeszcze?",E aí. Estou trabalhando numa versão aprimorada do seu implante. Posso te ajudar com mais alguma coisa?,,"Hei, lucrez la o variantă îmbunătățită a implantului tău. E ceva cu care pot să te ajut?","Я работаю над улучшенной версией твоего импланта. А пока, что-нибудь ещё?",,Jag jobbar på en uppdaterad version av ditt implantat. Finns det något annat jag kan göra?,"Hey, implantının güncellenmiş bir versiyonu üzerinde çalışıyorum. Yapabileceğim başka bir şey var mı?" -Patch me up.,TXT_RPLY0_SCRIPT34_D7580_PATCH,〃,,,Dej mě do hromady.,Gør mig klar.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Pistä minut kuntoon.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Załataj mnie.,Trate meus ferimentos.,,Bandajează-mă.,Перебинтуй меня.,,Laga mig.,Bana yama yap. +Patch me up.,TXT_RPLY0_SCRIPT34_D7580_PATCH,〃,,,Dej mě do hromady.,Gør mig klar.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Pistä minut kuntoon.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lappe meg sammen.,Załataj mnie.,Trate meus ferimentos.,,Bandajează-mă.,Перебинтуй меня.,,Laga mig.,Bana yama yap. Well at least you're seeing action.,TXT_RYES0_SCRIPT34_D7580_WELLA,〃,,,"No, alespoň jsi v akci.",I det mindste er du i gang.,"Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Nu, almenaŭ vi ne havas enuigajn komisiojn.","Bueno, al menos estás -teniendo algo de acción.",,"No, ainakin näet toimintaa.","Eh bien, au moins vous en voyez, de l'action.",Legalább ér valami izgalom.,"Beh, almeno ti stai dando da fare.",少なくとも行動を起こしているのです。,이제 마음껏 움직여보세요.,"Nou ja, je ziet in ieder geval actie.",Det skjer i det minste noe.,"Przynajmniej widzisz, że coś się dzieje.","Bem, pelo menos está tendo um pouco de ação.",,"Pă, măcar tu ai parte de niște acțiune.","Что ж, зато ты участвуешь в операциях.",,Du ser åtminstone till att det händer något.,En azından hareket görüyorsun. -Implant upgrade?,TXT_RPLY1_SCRIPT34_D7580_IMPLA,〃,,,Vylepšení implantátu?,Implantatopgradering?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?,Implantatoppgradering?,Aktualizacja implantu?,Versão aprimorada do implante?,,Upgrade la implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant güncellemesi mi? +teniendo algo de acción.",,"No, ainakin näet toimintaa.","Eh bien, au moins vous en voyez, de l'action.",,Legalább ér valami izgalom.,"Beh, almeno ti stai dando da fare.",少なくとも行動を起こしているのです。,이제 마음껏 움직여보세요.,"Nou ja, je ziet in ieder geval actie.",Det skjer i det minste noe.,"Przynajmniej widzisz, że coś się dzieje.","Bem, pelo menos está tendo um pouco de ação.",,"Pă, măcar tu ai parte de niște acțiune.","Что ж, зато ты участвуешь в операциях.",,Du ser åtminstone till att det händer något.,En azından hareket görüyorsun. +Implant upgrade?,TXT_RPLY1_SCRIPT34_D7580_IMPLA,〃,,,Vylepšení implantátu?,Implantatopgradering?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?,Implantatoppgradering?,Aktualizacja implantu?,Versão aprimorada do implante?,,Upgrade la implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant güncellemesi mi? "Good thing, never can be too safe.",TXT_RYES1_SCRIPT34_D7580_GOODT,〃,,,"Dobrá věcička, nikdy si nemůžeš být moc jistý.","Godt, man kan aldrig være for sikker.","Alles klar, das haben wir sofort.",,"Bone. Neniam estas sufiĉe da sekureco.","Bien. Nunca se puede -estar del todo seguro.",,"Hyvä, koskaan ei voi olla liian turvallista.",Bonne idée. On ne peut jamais être trop sûr.,"Még jó, soha nem lehetsz túl nagy biztonságban.","Ottimo, non si può mai essere troppo al sicuro.",良いことだ、安全すぎることはない。,위험 할 때도 있으니 지금 고치겠습니다.,"Goede zaak, kan nooit te veilig zijn.","Bra, man kan aldri være for sikker.","To dobrze, nigdy nie można być zbyt bezpiecznym.",Boa ideia. Segurança nunca é demais.,,"Bine zis, nu poți fi niciodată prea sigur.","Очень советую, ни в чём нельзя быть уверенным до конца.",,"Bra, man kan aldrig vara för säker.","İyi bir şey, asla çok güvenli olamaz." +estar del todo seguro.",,"Hyvä, koskaan ei voi olla liian turvallista.",Bonne idée. On ne peut jamais être trop sûr.,,"Még jó, soha nem lehetsz túl nagy biztonságban.","Ottimo, non si può mai essere troppo al sicuro.",良いことだ、安全すぎることはない。,위험 할 때도 있으니 지금 고치겠습니다.,"Goede zaak, kan nooit te veilig zijn.","Bra, man kan aldri være for sikker.","To dobrze, nigdy nie można być zbyt bezpiecznym.",Boa ideia. Segurança nunca é demais.,,"Bine zis, nu poți fi niciodată prea sigur.","Очень советую, ни в чём нельзя быть уверенным до конца.",,"Bra, man kan aldrig vara för säker.","İyi bir şey, asla çok güvenli olamaz." "I'm almost finished, but not quite.",TXT_RNO1_SCRIPT34_D7580_IMALM,〃,,,"Už je skoro hotový, ale ne úplně.","Jeg er næsten færdig, men ikke helt.",Es ist noch nicht soweit.,,"Mi preskaŭ finis, sed ne tute.","Casi he terminado, -pero no del todo.",,"Olen melkein valmis, mutten ihan vielä.","Presque fini, mais pas encore.","Majdnem végeztem, de még nem teljesen","Ho quasi finito, ma non ancora.",もうすぐ出来上がる、それほど掛からない。,거의 완성했는데... 아마도 다음 시간에?,"Ik ben bijna klaar, maar niet helemaal.","Jeg er nesten ferdig, men ikke helt.","Prawie skończyłem, ale nie do końca.",Está quase pronto.,,"Sunt aproape gata, dar nu chiar.",Я почти закончил. Ещё немного.,,"Jag är nästan klar, men inte riktigt.",Neredeyse bitirdim ama tam değil. -"All right, this is it. I've almost got everything working perfectly. There were a few problems left to fix, do you need anything else? ",TXT_DLG_SCRIPT34_D9096_ALLRI,〃,,,"Tak dobře, už mi skoro všechno perfektně funguje. Ještě tam bylo pár problémů. Potřebuješ ještě něco?","Okay, det er det. Jeg har næsten fået det hele til at fungere perfekt. Der var et par problemer tilbage at løse, har du brug for andet?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Bone, jen ĉio; preskaŭ ĉio funkcias perfekte. Restis nur kelkaj korektindaj problemoj. Ĉu vi bezonas ion alian?","Muy bien, ya está; tengo casi todo funcionando a la perfección. Solo quedaban algunos problemas que corregir. ¿Necesitas algo más?",,"No niin, olen melkein saanut kaiken toimimaan täydellisesti. Vain muutamia vikoja oli enää jäljellä. Tarvitsetko mitään muuta?","Très bien, je crois que j'ai réussi à tout faire marcher parfaitement. Il y avait quelques problèmes dont je devais me débarrasser. Vous voulez quelque chose?","Rendben, ez lesz az. Már majdnem mindent tökéletesre kidolgoztam. Már csak pár lehetőség van hátra, kell még valami esetleg?","Allora, sono riuscito a far funzionare quasi tutto benissimo. C'erano giusto un paio di problemi rimasti da risolvere. Ti serve qualcos'altro?","大丈夫、全て順調だ。残っていた問題も +pero no del todo.",,"Olen melkein valmis, mutten ihan vielä.","Presque fini, mais pas encore.",,"Majdnem végeztem, de még nem teljesen","Ho quasi finito, ma non ancora.",もうすぐ出来上がる、それほど掛からない。,거의 완성했는데... 아마도 다음 시간에?,"Ik ben bijna klaar, maar niet helemaal.","Jeg er nesten ferdig, men ikke helt.","Prawie skończyłem, ale nie do końca.",Está quase pronto.,,"Sunt aproape gata, dar nu chiar.",Я почти закончил. Ещё немного.,,"Jag är nästan klar, men inte riktigt.",Neredeyse bitirdim ama tam değil. +"All right, this is it. I've almost got everything working perfectly. There were a few problems left to fix, do you need anything else? ",TXT_DLG_SCRIPT34_D9096_ALLRI,〃,,,"Tak dobře, už mi skoro všechno perfektně funguje. Ještě tam bylo pár problémů. Potřebuješ ještě něco?","Okay, det er det. Jeg har næsten fået det hele til at fungere perfekt. Der var et par problemer tilbage at løse, har du brug for andet?","He, ich arbeite an einer verbesserten Version deines Implantats. Gibt es sonst etwas, das ich für dich tun kann?",,"Bone, jen ĉio; preskaŭ ĉio funkcias perfekte. Restis nur kelkaj korektindaj problemoj. Ĉu vi bezonas ion alian?","Muy bien, ya está; tengo casi todo funcionando a la perfección. Solo quedaban algunos problemas que corregir. ¿Necesitas algo más?",,"No niin, olen melkein saanut kaiken toimimaan täydellisesti. Vain muutamia vikoja oli enää jäljellä. Tarvitsetko mitään muuta?","Très bien, je crois que j'ai réussi à tout faire marcher parfaitement. Il y avait quelques problèmes dont je devais me débarrasser. Vous voulez quelque chose?",,"Rendben, ez lesz az. Már majdnem mindent tökéletesre kidolgoztam. Már csak pár lehetőség van hátra, kell még valami esetleg?","Allora, sono riuscito a far funzionare quasi tutto benissimo. C'erano giusto un paio di problemi rimasti da risolvere. Ti serve qualcos'altro?","大丈夫、全て順調だ。残っていた問題も 全て取り除かれた。他に何が必要かな?","정말 힘든 시간이었어요. 이식 칩의 문제들의 거의 다 고쳐가고 있습니다. 기다리는 동안, 무엇을 도와드릴까요?","Goed, dit is het. Ik heb bijna alles perfect werkend. Er waren nog een paar problemen op te lossen, heb je nog iets anders nodig?","Greit, nå gjelder det. Jeg har nesten fått alt til å fungere perfekt. Det var noen problemer igjen å fikse, trenger du noe mer?","W porządku, to jest to. Prawie wszystko działa idealnie. Zostało kilka problemów do naprawienia, potrzebujesz czegoś jeszcze?","Ok, é isso aí. Está quase tudo funcionando perfeitamente. Faltavam alguns problemas pra consertar. Precisa de mais algo?",,"În regulă, asta e tot. Acum aproape totul merge perfect. Au mai fost câteva probleme de rezolvat, mai ai nevoie de ceva?","Итак, тут оставалась пара проблем, но теперь всё работает почти идеально. Что-нибудь ещё?",,"Okej, nu är det dags. Jag har nästan fått allt att fungera perfekt. Det fanns några problem kvar att fixa, behöver du något mer?","Pekala, işte bu. Neredeyse her şey mükemmel çalışıyor. Düzeltmem gereken birkaç sorun kaldı, başka bir şeye ihtiyacın var mı?" -Patch me up.,TXT_RPLY0_SCRIPT34_D9096_PATCH,〃,,,Dej mě do hromady.,Lav mig om.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Paikkaa minut.,Soignez moi.,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lapp meg sammen.,Załataj mnie.,Trate meus ferimentos.,,Bandajează-mă.,Перебинтуй меня.,,Laga mig.,Beni yamala. +Patch me up.,TXT_RPLY0_SCRIPT34_D9096_PATCH,〃,,,Dej mě do hromady.,Lav mig om.,Flick mich zusammen.,,Kuracu min.,Cúrame.,,Paikkaa minut.,Soignez moi.,,Gyógyíts fel.,Curami.,治療してほしい。,치료가 필요합니다.,Patch me op.,Lapp meg sammen.,Załataj mnie.,Trate meus ferimentos.,,Bandajează-mă.,Перебинтуй меня.,,Laga mig.,Beni yamala. What have you been trying to do? Go head to head with a Crusader?,TXT_RYES0_SCRIPT34_D9096_WHATH,〃,,,Co jsi dělal? Šel zmlátit Křižáka?,Hvad har du forsøgt at gøre? Gå hoved mod hoved med en korsfarer?,"Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Kion vi intencis fari? Ĉu piki Kruciston?","¿Qué has intentado hacer? ¿Ir cara a cara con un Cruzado?","¿Qué anduviste haciendo? -¿Ir cara a cara con un Cruzado?",Mitä olet oikein yrittänyt tehdä? Mennä nokittain ristiretkeläisen kanssa?,Qu'est-ce que vous avez fait? Vous avez essayé de faire ami avec un Croisé?,Mit akartál tenni? Nekimenni egymagad egy keresztesnek?,Ma cosa hai cercato di fare? Lottare da solo contro un Crociato?,"今度は何を始めるんだ? +¿Ir cara a cara con un Cruzado?",Mitä olet oikein yrittänyt tehdä? Mennä nokittain ristiretkeläisen kanssa?,Qu'est-ce que vous avez fait? Vous avez essayé de faire ami avec un Croisé?,,Mit akartál tenni? Nekimenni egymagad egy keresztesnek?,Ma cosa hai cercato di fare? Lottare da solo contro un Crociato?,"今度は何を始めるんだ? クルセイダーと向かい合うのか?",아콜라이트와 근접전을 펼친 것 같군요... 아마도.,Wat heb je geprobeerd te doen? Hoofd aan hoofd gaan met een kruisvaarder?,Hva har du prøvd å gjøre? Kjempe mot en korsfarer?,Co ty próbowałeś zrobić? Walczyć oko w oko z Krzyżowcem?,O que andou tentando fazer? Sair na porrada com um Cruzado?,,Ce ai încercat să faci? Dai cap în cap cu un Cruciat?,"Ты что, бился один на один с крестоносцем?",,Vad har du försökt göra? Gå mot en korsriddare?,Ne yapmaya çalışıyordun? Bir Haçlı ile kafa kafaya mı? -Implant upgrade?,TXT_RPLY1_SCRIPT34_D9096_IMPLA,〃,,,Vylepšení implantátu?,Implantatopgradering?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?.,Implantatoppgradering?,Ulepszenie implantu?,Aprimoramento de implante?,,Upgrade la implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant yükseltmesi mi? -That should do it for you.,TXT_RYES1_SCRIPT34_D9096_THATS,〃,,,Tohle by mělo fungovat.,Det burde gøre det for dig.,"Alles klar, das haben wir sofort.",,Ĉi tio devus esti sufiĉa.,Con esto debería estar.,,Eiköhän tällä ala tepsiä.,Ca devrait faire l'affaire.,Ez szerintem megteszi.,Questo dovrebbe andare.,今取り掛かっている。,도움이 좀 될 거에요.,Dat zou het voor je moeten doen.,Det burde gjøre det for deg.,To powinno ci wystarczyć.,Isso deve funcionar pra você.,,Asta ar trebui să fie suficient.,Вот оно.,,Det borde göra det för dig.,Bu senin işini görür. +Implant upgrade?,TXT_RPLY1_SCRIPT34_D9096_IMPLA,〃,,,Vylepšení implantátu?,Implantatopgradering?,Implantatsupgrade?,,Ĉu plibonigo de enplantaĵo?,¿Mejora de implante?,,Istutteen päivitys?,Mise à jour de l'implant?,,Implantátum fejlesztés?,Aggiornamento dell'impianto?,インプラント アップグレード?,지구력 업그레이드?,Implantaat upgrade?.,Implantatoppgradering?,Ulepszenie implantu?,Aprimoramento de implante?,,Upgrade la implant?,Улучшение импланта?,,Implantatuppgradering?,İmplant yükseltmesi mi? +That should do it for you.,TXT_RYES1_SCRIPT34_D9096_THATS,〃,,,Tohle by mělo fungovat.,Det burde gøre det for dig.,"Alles klar, das haben wir sofort.",,Ĉi tio devus esti sufiĉa.,Con esto debería estar.,,Eiköhän tällä ala tepsiä.,Ca devrait faire l'affaire.,,Ez szerintem megteszi.,Questo dovrebbe andare.,今取り掛かっている。,도움이 좀 될 거에요.,Dat zou het voor je moeten doen.,Det burde gjøre det for deg.,To powinno ci wystarczyć.,Isso deve funcionar pra você.,,Asta ar trebui să fie suficient.,Вот оно.,,Det borde göra det för dig.,Bu senin işini görür. Let me run some more tests first.,TXT_RNO1_SCRIPT34_D9096_LETME,〃,,,Ještě ho musím dál otestovat.,Lad mig køre nogle flere tests først.,Es ist noch nicht soweit.,,"Unue mi faru kelkajn provojn.","Déjame hacer algunas -pruebas primero.",,Anna minun ajaa muutamia kokeita ensin.,Laissez moi faire quelques tests d'abord.,Hadd futtassak pár tesztet.,Devo fare ancora qualche test.,もう少しテストしてからにしよう。,시험단계를 좀 거치고 예기할게요.,Laat me eerst nog wat testen doen.,La meg kjøre noen flere tester først.,Pozwól mi najpierw przeprowadzić kilka testów.,Só deixa eu fazer mais alguns testes.,,Lasă-mă să fac niște teste mai întâi.,Дай мне ещё времени на тесты.,,Låt mig köra några fler tester först.,Önce birkaç test daha yapayım. -That's all I can do on the implant right now. Maybe some healing?,TXT_DLG_SCRIPT34_D10612_THATS,〃,,,"Tak, to je všechno co teď můžu s tím implantátem udělat. Potřebuješ léčení?","Det er alt, hvad jeg kan gøre på implantatet lige nu. Måske noget healing?","Das ist alles, was ich im Moment mit dem Implantat machen kann. Vielleicht etwas medizinische Versorgung?",,"Tio estas ĉio, kion mi momente povas fari super la enplantaĵo. Ĉu vi bezonas kuracon?",Eso es todo lo que puedo hacer con el implante por ahora. ¿Necesitas curarte?,,Tätä enempää en voi istutteelle enää juuri nyt tehdä. Mutta oletko hoidon tarpeessa?,C'est tout ce que je peux faire pour l'implant. Vous voulez que je vous soigne?,Ennyit tudtam kezdeni most az implantátummal. Esetleg valami gyógyítás?,È tutto per quanto riguarda l'impianto. Però posso sempre curarti.,"インプラントはこれ以上ない程完成した。 +pruebas primero.",,Anna minun ajaa muutamia kokeita ensin.,Laissez moi faire quelques tests d'abord.,,Hadd futtassak pár tesztet.,Devo fare ancora qualche test.,もう少しテストしてからにしよう。,시험단계를 좀 거치고 예기할게요.,Laat me eerst nog wat testen doen.,La meg kjøre noen flere tester først.,Pozwól mi najpierw przeprowadzić kilka testów.,Só deixa eu fazer mais alguns testes.,,Lasă-mă să fac niște teste mai întâi.,Дай мне ещё времени на тесты.,,Låt mig köra några fler tester först.,Önce birkaç test daha yapayım. +That's all I can do on the implant right now. Maybe some healing?,TXT_DLG_SCRIPT34_D10612_THATS,〃,,,"Tak, to je všechno co teď můžu s tím implantátem udělat. Potřebuješ léčení?","Det er alt, hvad jeg kan gøre på implantatet lige nu. Måske noget healing?","Das ist alles, was ich im Moment mit dem Implantat machen kann. Vielleicht etwas medizinische Versorgung?",,"Tio estas ĉio, kion mi momente povas fari super la enplantaĵo. Ĉu vi bezonas kuracon?",Eso es todo lo que puedo hacer con el implante por ahora. ¿Necesitas curarte?,,Tätä enempää en voi istutteelle enää juuri nyt tehdä. Mutta oletko hoidon tarpeessa?,C'est tout ce que je peux faire pour l'implant. Vous voulez que je vous soigne?,,Ennyit tudtam kezdeni most az implantátummal. Esetleg valami gyógyítás?,È tutto per quanto riguarda l'impianto. Però posso sempre curarti.,"インプラントはこれ以上ない程完成した。 それとも治療か?",이식 칩에 관한 모든 걸 해줬습니다. 더 필요한 게 있나요?,Dat is alles wat ik nu kan doen op het implantaat. Misschien wat genezing?,Det er alt jeg kan gjøre med implantatet akkurat nå. Kanskje litt helbredelse?,"To wszystko, co mogę zrobić z implantem w tej chwili. Może trochę uzdrowienia?",Isso é tudo o que posso fazer com o implante no momento. Vai uma cura aí?,,Asta e tot ce pot face implantului acum. Poate niște bandaje?,Пока что я больше ничего не могу сделать с имплантом. Как насчёт лечения?,,Det är allt jag kan göra med implantatet just nu. Kanske lite läkning?,Şu anda implant üzerinde yapabileceğim tek şey bu. Belki biraz iyileşme? -Yeah.,TXT_RPLY0_SCRIPT34_D10612_YEAH,〃,,,Jo.,Ja.,Ja.,,Jes.,Sí.,,Kyllä.,Ouais.,Igen.,Sì.,ああ。,그래.,Ja.,Ja.,Tak.,Sim.,,Da.,Давай.,,"Ja, det är det.",Evet. +Yeah.,TXT_RPLY0_SCRIPT34_D10612_YEAH,〃,,,Jo.,Ja.,Ja.,,Jes.,Sí.,,Kyllä.,Ouais.,,Igen.,Sì.,ああ。,그래.,Ja.,Ja.,Tak.,Sim.,,Da.,Давай.,,"Ja, det är det.",Evet. "Boy, you're a real mess. I'll see what I can do.",TXT_RYES0_SCRIPT34_D10612_BOYYO,〃,,,"Tebe teda zřídili, kluku. Uvidím, co s tebou.","Mand, du er et rigtigt rod. Jeg skal se, hvad jeg kan gøre.","Mann, du siehst aber gar nicht gut aus. Mal sehen, was ich machen kann.",,"Ulo, vi estas iomege en malordo. Mi vidos tion, kion mi faru.","Tío, estás hecho un desastre. A ver qué puedo hacer.","Chico, estás hecho un desastre. -A ver qué puedo hacer.","Kylläpä olet huonossa jamassa. Katsotaan, mitä voin tehdä.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.","Öregem, elég ramaty állapotban vagy. Megnézem mit tehetek.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,치료가 다 끝났습니다. 다 의료기술 덕입니다.,"Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du er et skikkelig rot. Jeg skal se hva jeg kan gjøre.","Chłopcze, masz niezły bałagan. Zobaczę, co da się zrobić.","Rapaz, você está arrebentado. Verei o que posso fazer.",,"Băiete, ești un dezastru. O să văd ce pot face.","Ты просто месиво. Посмотрим, что я смогу сделать.",,Du är en riktig röra. Jag ska se vad jag kan göra.,Gerçekten berbat durumdasın. Ne yapabileceğime bakacağım. -What can I do for you?,TXT_DLG_SCRIPT34_D12128_WHATC,"MAP34: Feris (identical to rows 746-768, except for row 1357).",,,Co pro tebe můžu udělat?,Hvad kan jeg gøre for dig?,Was kann ich für dich tun?,,Kion mi faru por vi?,¿Qué puedo hacer por ti?,,Mitä voin tehdä sinulle?,Que puis-je faire pour vous?,Mit tehetek érted?,Cosa posso fare per te?,それで何か用か?,무엇을 도와줄까.,Wat kan ik voor je doen?,Hva kan jeg gjøre for deg?,Co mogę zrobić dla ciebie?,Como posso te ajudar?,,Ce pot face pentru tine?,Чем я могу тебе помочь?,,Vad kan jag göra för dig?,Senin için ne yapabilirim? -I'm out of bullets.,TXT_RPLY0_SCRIPT34_D12128_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on luodit loppu.,Je suis à cours de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. +A ver qué puedo hacer.","Kylläpä olet huonossa jamassa. Katsotaan, mitä voin tehdä.","Mon petit, vous êtes dans un sale état. Je vais voir ce que je peux faire.",,"Öregem, elég ramaty állapotban vagy. Megnézem mit tehetek.","Ragazzo, sei messo proprio male. Vediamo cosa posso fare.",君、滅茶苦茶だな。なんとかしよう。,치료가 다 끝났습니다. 다 의료기술 덕입니다.,"Jongen, je bent een echte puinhoop. Ik zal zien wat ik kan doen.","Jøss, du er et skikkelig rot. Jeg skal se hva jeg kan gjøre.","Chłopcze, masz niezły bałagan. Zobaczę, co da się zrobić.","Rapaz, você está arrebentado. Verei o que posso fazer.",,"Băiete, ești un dezastru. O să văd ce pot face.","Ты просто месиво. Посмотрим, что я смогу сделать.",,Du är en riktig röra. Jag ska se vad jag kan göra.,Gerçekten berbat durumdasın. Ne yapabileceğime bakacağım. +What can I do for you?,TXT_DLG_SCRIPT34_D12128_WHATC,"MAP34: Feris (identical to rows 746-768, except for row 1357).",,,Co pro tebe můžu udělat?,Hvad kan jeg gøre for dig?,Was kann ich für dich tun?,,Kion mi faru por vi?,¿Qué puedo hacer por ti?,,Mitä voin tehdä sinulle?,Que puis-je faire pour vous?,,Mit tehetek érted?,Cosa posso fare per te?,それで何か用か?,무엇을 도와줄까.,Wat kan ik voor je doen?,Hva kan jeg gjøre for deg?,Co mogę zrobić dla ciebie?,Como posso te ajudar?,,Ce pot face pentru tine?,Чем я могу тебе помочь?,,Vad kan jag göra för dig?,Senin için ne yapabilirim? +I'm out of bullets.,TXT_RPLY0_SCRIPT34_D12128_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on luodit loppu.,Je suis à cours de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT34_D12128_HERES,〃,,,"Tady máš nějakou munici, neplýtvej s ní.",Her er lidt ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä sinulle panoksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",Itt van valamennyi lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,無駄遣いするなよ。,조금만 주겠습니다. 재고가 모자라거든요.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Tu jest trochę amunicji dla ciebie. Nie marnuj jej.,Leve esta munição. Não desperdice.,,Iată niște muniție. N-o irosi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,Al sana biraz mermi. Boşa harcama. -Teach me.,TXT_RPLY1_SCRIPT34_D12128_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Taníts.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä sinulle panoksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",,Itt van valamennyi lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,無駄遣いするなよ。,조금만 주겠습니다. 재고가 모자라거든요.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Tu jest trochę amunicji dla ciebie. Nie marnuj jej.,Leve esta munição. Não desperdice.,,Iată niște muniție. N-o irosi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,Al sana biraz mermi. Boşa harcama. +Teach me.,TXT_RPLY1_SCRIPT34_D12128_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Taníts.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. "All right, I'll just show you a few little pointers.",TXT_RYES1_SCRIPT34_D12128_ALLRI,〃,,,"Dobře, ukážu ti pár rad.","Okay, jeg vil bare vise dig et par små tips.","Alles klar, ich zeige dir ein paar Kniffe.",,"Bone, jen kelkaj konsiletoj...","Muy bien, aquí van -un par de consejos...",,"Hyvä on, annan sinulle vain muutamia pikkuvinkkejä.",Pas de problème. Laissez moi vous montrer quelques trucs.,Akkor addok pár hasznos tanácsot.,"Va bene, ti darò un paio di dritte molto utili.",わかった、幾つかやり方を教えよう。,좋습니다. 움직이는 과녁을 쏘세요!,"Oké, ik zal je gewoon een paar kleine tips laten zien.","Greit, jeg skal bare vise deg noen små tips.","W porządku, pokażę ci tylko kilka małych wskazówek.","Ok, vou te dar algumas dicas.",,"În regulă, am să-ți arăt niște repere.",Хорошо. Покажу тебе пару приёмов.,,"Okej, jag ska bara visa dig några små tips.","Pekala, sana birkaç küçük ipucu göstereceğim." +un par de consejos...",,"Hyvä on, annan sinulle vain muutamia pikkuvinkkejä.",Pas de problème. Laissez moi vous montrer quelques trucs.,,Akkor addok pár hasznos tanácsot.,"Va bene, ti darò un paio di dritte molto utili.",わかった、幾つかやり方を教えよう。,좋습니다. 움직이는 과녁을 쏘세요!,"Oké, ik zal je gewoon een paar kleine tips laten zien.","Greit, jeg skal bare vise deg noen små tips.","W porządku, pokażę ci tylko kilka małych wskazówek.","Ok, vou te dar algumas dicas.",,"În regulă, am să-ți arăt niște repere.",Хорошо. Покажу тебе пару приёмов.,,"Okej, jag ska bara visa dig några små tips.","Pekala, sana birkaç küçük ipucu göstereceğim." You're not ready yet.,TXT_RNO1_SCRIPT34_D12128_YOURE,〃,,,Ještě nejsi připravený.,Du er ikke klar endnu.,Du bist noch nicht so weit.,,"Vi ankoraŭ -ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,Nem állsz még készen.,Non sei ancora pronto.,そっちの準備がまだ整ってないようだな。,당신은 아직 준비가 안됐어요.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze gotowy.,Você não está preparado ainda.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. -Back again? What do you need?,TXT_DLG_SCRIPT34_D13644_BACKA,〃,,,Zase zpátky? Co potřebuješ?,Tilbage igen? Hvad har du brug for?,Scxhon zurück? Was brauchst du?,,Do vi revenis. Kion vi bezonas?,¿Ya de vuelta? ¿Qué necesitas?,,Täällä taas? Mitä tarvitset?,Déjà de retour? De quoi avez-vous besoin?,Már vissza is tértél? Mire van szükséged?,Già di ritorno? Che cosa ti serve?,もう戻ったか?何が必要だ?,다시 왔군요. 무엇이 필요하죠?,Weer terug? Wat heb je nodig?,Tilbake igjen? Hva trenger du?,Znowu? Czego potrzebujesz?,Já voltou? O que precisa?,,Te-ai întors? Ce mai dorești?,Ты вернулся? Что тебе нужно?,,Tillbaka igen? Vad behöver du?,Yine mi? Neye ihtiyacın var? -I'm out of bullets.,TXT_RPLY0_SCRIPT34_D13644_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on ammukset loppu.,Je suis à cours de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. +ne estas preta.",Aún no estás listo.,,Et ole vielä valmis.,Vous n'êtes pas encore prêt.,,Nem állsz még készen.,Non sei ancora pronto.,そっちの準備がまだ整ってないようだな。,당신은 아직 준비가 안됐어요.,Je bent nog niet klaar.,Du er ikke klar ennå.,Nie jesteś jeszcze gotowy.,Você não está preparado ainda.,,Nu ești pregătit încă.,Ты ещё не готов.,,Du är inte redo än.,Henüz hazır değilsin. +Back again? What do you need?,TXT_DLG_SCRIPT34_D13644_BACKA,〃,,,Zase zpátky? Co potřebuješ?,Tilbage igen? Hvad har du brug for?,Scxhon zurück? Was brauchst du?,,Do vi revenis. Kion vi bezonas?,¿Ya de vuelta? ¿Qué necesitas?,,Täällä taas? Mitä tarvitset?,Déjà de retour? De quoi avez-vous besoin?,,Már vissza is tértél? Mire van szükséged?,Già di ritorno? Che cosa ti serve?,もう戻ったか?何が必要だ?,다시 왔군요. 무엇이 필요하죠?,Weer terug? Wat heb je nodig?,Tilbake igjen? Hva trenger du?,Znowu? Czego potrzebujesz?,Já voltou? O que precisa?,,Te-ai întors? Ce mai dorești?,Ты вернулся? Что тебе нужно?,,Tillbaka igen? Vad behöver du?,Yine mi? Neye ihtiyacın var? +I'm out of bullets.,TXT_RPLY0_SCRIPT34_D13644_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for kugler.,Ich habe keine Munition mehr.,,Mi ne havas kuglojn.,No me quedan balas.,,Minulta on ammukset loppu.,Je suis à cours de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 바닥났어요.,Ik heb geen kogels meer.,Jeg er tom for kuler.,Skończyły mi się naboje.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились патроны.,,Jag har slut på kulor.,Mermim bitti. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT34_D13644_HERES,〃,,,"Tady máš nějakou munici, neplýtvej s ní.",Her er lidt ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä vähän lisää. Älä haaskaa niitä.,"En voilà pour vous, ne les gaspillez pas.",Itt van valamennyi lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾を使え、無駄遣いするなよ。,"적을 사살하려면, 역시 탄약을 소진해야만 하죠. 여기 탄약입니다.",Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Tu jest trochę amunicji dla ciebie. Nie marnuj jej.,Leve esta munição. Não desperdice.,,Iată niște muniție. N-o irosi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. -You've got enough ammo.,TXT_RNO0_SCRIPT34_D13644_YOUVE,〃,,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,Van elég lőszered.,Ma veramente ne hai a sufficienza.,もう十分に弾を持ってるようだぞ。,충분한 탄약을 가졌어. 다 소진하고 찾아오세요.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você já tem munição suficiente.,,Ai suficientă muniție.,У тебя их достаточно.,,Du har tillräckligt med ammunition.,Yeterince mermin var. -Teach me.,TXT_RPLY1_SCRIPT34_D13644_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Taníts.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä vähän lisää. Älä haaskaa niitä.,"En voilà pour vous, ne les gaspillez pas.",,Itt van valamennyi lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾を使え、無駄遣いするなよ。,"적을 사살하려면, 역시 탄약을 소진해야만 하죠. 여기 탄약입니다.",Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Tu jest trochę amunicji dla ciebie. Nie marnuj jej.,Leve esta munição. Não desperdice.,,Iată niște muniție. N-o irosi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,İşte sana biraz cephane. Boşa harcama. +You've got enough ammo.,TXT_RNO0_SCRIPT34_D13644_YOUVE,〃,,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,,Van elég lőszered.,Ma veramente ne hai a sufficienza.,もう十分に弾を持ってるようだぞ。,충분한 탄약을 가졌어. 다 소진하고 찾아오세요.,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczająco dużo amunicji.,Você já tem munição suficiente.,,Ai suficientă muniție.,У тебя их достаточно.,,Du har tillräckligt med ammunition.,Yeterince mermin var. +Teach me.,TXT_RPLY1_SCRIPT34_D13644_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Taníts.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. "All right, this should keep you going for a while.",TXT_RYES1_SCRIPT34_D13644_ALLRI,〃,,,"Dobře, tohle by ti mělo pomoct.","Okay, det her burde holde dig i gang et stykke tid.","Alles klar, das sollte fürs erste reichen.",,"Bone, ĉi tio devus esti sufiĉe utila nuntempe.","Muy bien, esto debería -servirte por el momento.",,"Selvä on, tällä sinun pitäisi pötkiä aika pitkälle.","Bien, ça devrait vous suffir pour un bon moment.","Rendben van, ezzel el leszel egy darabig.","Va bene, con questo dovresti andare sul sicuro per un po'.",わかった、これで長くやり合えるだろう。,"여기, 적병 일부를 충분히 죽일 수 있을 만큼의 탄약입니다.","Oké, dit zou je een tijdje op de been moeten houden.","Greit, dette burde holde deg gående en stund.","W porządku, to powinno ci wystarczyć na jakiś czas.","Ok, isso deve te ajudar por enquanto.",,"Bine, asta ar trebui să te ajute o vreme.","Хорошо, это не раз спасёт тебе жизнь.",,"Okej, det här borde hålla dig igång ett tag.","Pekala, bu seni bir süre idare eder." +servirte por el momento.",,"Selvä on, tällä sinun pitäisi pötkiä aika pitkälle.","Bien, ça devrait vous suffir pour un bon moment.",,"Rendben van, ezzel el leszel egy darabig.","Va bene, con questo dovresti andare sul sicuro per un po'.",わかった、これで長くやり合えるだろう。,"여기, 적병 일부를 충분히 죽일 수 있을 만큼의 탄약입니다.","Oké, dit zou je een tijdje op de been moeten houden.","Greit, dette burde holde deg gående en stund.","W porządku, to powinno ci wystarczyć na jakiś czas.","Ok, isso deve te ajudar por enquanto.",,"Bine, asta ar trebui să te ajute o vreme.","Хорошо, это не раз спасёт тебе жизнь.",,"Okej, det här borde hålla dig igång ett tag.","Pekala, bu seni bir süre idare eder." "Sorry, can't. I'm just following Macil's orders.",TXT_RNO1_SCRIPT34_D13644_SORRY,〃,,,"Promiň, nemůžu. Řídím se rozkazy od Macila.","Beklager, jeg kan ikke. Jeg følger bare Macils ordrer.","Tut mir leid, aber ich kann nicht. Ich folge nur Macils Befehlen.",,"Pardonon, mi ne rajtas. Mi nur observas Macil-on.","Lo siento, no puedo. -Solo sigo órdenes de Macil.",,Valitettavasti en voi. Noudatan vain Macilin käskyjä.,"Désolé, pas possible. Je ne fais que suivre les ordres de Macil.","Sajnálom, de nem tehetem. Macil utasítása.","Mi spiace, ma non posso. Ordini dall'alto.",すまないが、できない。マシルの命令だ。,마실 사령관님의 명령입니다. 그럴 수는 없어요.,"Sorry, dat kan niet. Ik volg gewoon de orders van Macil op.","Beklager, jeg kan ikke. Jeg følger bare Macils ordre.","Przepraszam, nie mogę. Wykonuję tylko rozkazy Macila.",Desculpe mas não posso. Só estou seguindo as ordens do Macil.,,"Scuze, nu pot. Eu doar umez ordinele lui Macil.","Увы, не могу. Я подчиняюсь Мэйсилу.",,"Tyvärr, jag kan inte. Jag följer bara Macils order.","Üzgünüm, yapamam. Macil'in emirlerini uyguluyorum." -"Well which is it, bullets or training? I can't wait to get my hands on those new weapons we captured. Once I get done with them, I'll be able to begin training everyone else.",TXT_DLG_SCRIPT34_D15160_WELLW,〃,,,"Tak co to bude, náboje nebo trénink? Nemůžu se dočkat, až se dostanu k těm novým zbraním, které jsme zabavili. Trocha cvičení a pak hodně odplaty.","Nå, hvad er det, kugler eller træning? Jeg kan ikke vente med at få fingrene i de nye våben, vi har taget til fange. Når jeg er færdig med dem, kan jeg begynde at træne alle de andre.","Also, was willst du? Munition oder Training? Ich kann kaum erwarten, diese neuen Waffen, die wir erbeutet haben, in die Finger zu kriegen. ein bisschen Training und dann jede Menge Vergeltung.",,"Nu, ĉu kugloj aŭ trejnado ĉi-foje? Mi sopire atendas provi tiujn novajn kaptitajn armilojn. Fininte tion, mi povos ektrejni la aliajn.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que hemos capturado. En cuanto termine, podré empezar a entrenar al resto.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que capturamos. En cuanto termine, voy a poder empezar a entrenar al resto.","No niin, kumpaa saisi olla: luoteja vai koulutusta? En voi malttaa olla tarttumasta vasta kaappaamiimme aseisiin. Hieman perehdytystä, ja sitten paljon kostamista.","Qu'est-ce qu'il vous faut? Des munitions ou de l'entraînement? J'ai hâte d'essayer ces nouvelles armes que l'on a capturé. Quand j'en aurai fini avec elles, je pourrai entraîner tout le monde.","Akkor mi lesz, ólom vagy tréning? Már alig várom, hogy kipróbáljam az újonnan zsákmányolt fegyvereket. Ha végeztem velük, mindenki mást is fel tudok készíteni.","Bene, che cosa ti serve, munizioni o addestramento? Non vedo l'ora di mettere le mani su quelle nuove armi che abbiamo preso. Un po' di addestramento e poi molta vendetta.","弾薬と訓練、どっちの用件だ? +Solo sigo órdenes de Macil.",,Valitettavasti en voi. Noudatan vain Macilin käskyjä.,"Désolé, pas possible. Je ne fais que suivre les ordres de Macil.",,"Sajnálom, de nem tehetem. Macil utasítása.","Mi spiace, ma non posso. Ordini dall'alto.",すまないが、できない。マシルの命令だ。,마실 사령관님의 명령입니다. 그럴 수는 없어요.,"Sorry, dat kan niet. Ik volg gewoon de orders van Macil op.","Beklager, jeg kan ikke. Jeg følger bare Macils ordre.","Przepraszam, nie mogę. Wykonuję tylko rozkazy Macila.",Desculpe mas não posso. Só estou seguindo as ordens do Macil.,,"Scuze, nu pot. Eu doar umez ordinele lui Macil.","Увы, не могу. Я подчиняюсь Мэйсилу.",,"Tyvärr, jag kan inte. Jag följer bara Macils order.","Üzgünüm, yapamam. Macil'in emirlerini uyguluyorum." +"Well which is it, bullets or training? I can't wait to get my hands on those new weapons we captured. Once I get done with them, I'll be able to begin training everyone else.",TXT_DLG_SCRIPT34_D15160_WELLW,〃,,,"Tak co to bude, náboje nebo trénink? Nemůžu se dočkat, až se dostanu k těm novým zbraním, které jsme zabavili. Trocha cvičení a pak hodně odplaty.","Nå, hvad er det, kugler eller træning? Jeg kan ikke vente med at få fingrene i de nye våben, vi har taget til fange. Når jeg er færdig med dem, kan jeg begynde at træne alle de andre.","Also, was willst du? Munition oder Training? Ich kann kaum erwarten, diese neuen Waffen, die wir erbeutet haben, in die Finger zu kriegen. ein bisschen Training und dann jede Menge Vergeltung.",,"Nu, ĉu kugloj aŭ trejnado ĉi-foje? Mi sopire atendas provi tiujn novajn kaptitajn armilojn. Fininte tion, mi povos ektrejni la aliajn.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que hemos capturado. En cuanto termine, podré empezar a entrenar al resto.","Bueno, ¿qué va a ser?, ¿balas o entrenamiento? No puedo esperar a poner mis manos en esas nuevas armas que capturamos. En cuanto termine, voy a poder empezar a entrenar al resto.","No niin, kumpaa saisi olla: luoteja vai koulutusta? En voi malttaa olla tarttumasta vasta kaappaamiimme aseisiin. Hieman perehdytystä, ja sitten paljon kostamista.","Qu'est-ce qu'il vous faut? Des munitions ou de l'entraînement? J'ai hâte d'essayer ces nouvelles armes que l'on a capturé. Quand j'en aurai fini avec elles, je pourrai entraîner tout le monde.",,"Akkor mi lesz, ólom vagy tréning? Már alig várom, hogy kipróbáljam az újonnan zsákmányolt fegyvereket. Ha végeztem velük, mindenki mást is fel tudok készíteni.","Bene, che cosa ti serve, munizioni o addestramento? Non vedo l'ora di mettere le mani su quelle nuove armi che abbiamo preso. Un po' di addestramento e poi molta vendetta.","弾薬と訓練、どっちの用件だ? 奪った新しい武器が届くのを待ち切れないです。 少しの訓練でデカい復讐を。",탄약보급? 훈련? 가능하면 모두 다 가능합니다! 그리고 방금 수송된 무기들을 만져보고 싶습니다. 조사가 끝난 뒤에는 모두가 특수 훈련을 받을 수 있을 거에요.,"Wat is het dan wel, kogels of training? Ik kan niet wachten om die nieuwe wapens in handen te krijgen die we gevangen genomen hebben. Als ik er klaar mee ben, kan ik beginnen met het trainen van alle anderen.","Hva er det, kuler eller trening? Jeg gleder meg til å få tak i de nye våpnene vi tok. Når jeg er ferdig med dem, kan jeg begynne å trene alle de andre.","Więc co to jest, kule czy trening? Nie mogę się doczekać, aż dostanę w swoje ręce tę nową broń, którą zdobyliśmy. Jak już się z nimi uporam, będę mógł zacząć szkolić wszystkich innych.","Bem, o que vai ser? Munição ou treinamento? Mal posso esperar pra pegar nessas novas armas que capturamos. Depois que eu terminar com eles, vou poder começar a treinar todo o pessoal.",,"Deci care e, gloanțe sau instruire? Abia aștept să pun mâna pe armele pe care le-am capturat. Odată ce termin cu ele îi voi putea instrui și pe ceilalți.","Что теперь, патроны или тренировка? Мне не терпится опробовать это новое трофейное оружие. Чуть-чуть тренировки, и они за всё заплатят.",,"Vad är det, kulor eller träning? Jag kan inte vänta på att få ta del av de nya vapnen som vi tog till fånga. När jag är klar med dem kan jag börja träna alla andra.","Hangisi, mermi mi eğitim mi? Yakaladığımız şu yeni silahları elime almak için sabırsızlanıyorum. Onlarla işim bittiğinde, diğer herkesi eğitmeye başlayabileceğim." -I'm out of ammo.,TXT_RPLY0_SCRIPT34_D15160_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for ammunition.,Ich habe keine Munition mehr.,,Mi estas sen municio.,No me queda munición.,,Minulta on panokset loppu.,Je suis à cours de munitions.,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 떨어졌어요.,Ik heb geen munitie meer.,Jeg er tom for ammunisjon.,Skończyła mi się amunicja.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились боеприпасы.,,Jag har slut på ammunition.,Mermim bitti. +I'm out of ammo.,TXT_RPLY0_SCRIPT34_D15160_IMOUT,〃,,,Došly mi náboje.,Jeg er løbet tør for ammunition.,Ich habe keine Munition mehr.,,Mi estas sen municio.,No me queda munición.,,Minulta on panokset loppu.,Je suis à cours de munitions.,,Kifogytam a lőszerből.,Ho finito le munizioni.,弾切れだ。,탄약이 떨어졌어요.,Ik heb geen munitie meer.,Jeg er tom for ammunisjon.,Skończyła mi się amunicja.,Estou sem munição.,,Nu mai am gloanțe.,У меня кончились боеприпасы.,,Jag har slut på ammunition.,Mermim bitti. Here's some ammo for you. Don't waste it.,TXT_RYES0_SCRIPT34_D15160_HERES,〃,,,"Tady máš nějakou munici, neplýtvej s ní.",Her er noget ammunition til dig. Spild det ikke.,Hier hast du welche. Verschwende sie nicht.,,"Jen iom da municio. Ne malŝparu ĝin.","Aquí tienes algo de munición. -No la desperdicies.",,Tässä ammuksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",Itt van valamennyi lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,조금 나눠주도록 하겠습니다. 부디 낭비하지 마시길.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Tu jest trochę amunicji dla ciebie. Nie marnuj jej.,Leve esta munição. Não desperdice.,,Iată niște muniție. N-o irosi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,Al sana biraz cephane. Boşa harcama. -You've got enough ammo.,TXT_RNO0_SCRIPT34_D15160_YOUVE,〃,,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,Van elég lőszered.,Ma veramente ne hai a sufficienza.,もう十分に弾を持ってるようだぞ。,충분한 탄약을 가졌군...,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczającą ilość amunicji.,Você já tem munição suficiente.,,Ai suficientă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. -Teach me.,TXT_RPLY1_SCRIPT34_D15160_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,Taníts.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. +No la desperdicies.",,Tässä ammuksia. Älä tuhlaa niitä.,"En voilà pour vous, ne les gaspillez pas.",,Itt van valamennyi lőszer. Ne pazarold el.,Ecco un po' di munizioni per te. Non sprecarle.,この弾をどうぞ、無駄遣いしないように。,조금 나눠주도록 하겠습니다. 부디 낭비하지 마시길.,Hier is wat munitie voor je. Verspil het niet.,Her er litt ammunisjon til deg. Ikke sløs den bort.,Tu jest trochę amunicji dla ciebie. Nie marnuj jej.,Leve esta munição. Não desperdice.,,Iată niște muniție. N-o irosi.,Можешь взять немного. Не трать их понапрасну.,,Här är lite ammunition till dig. Slösa inte bort den.,Al sana biraz cephane. Boşa harcama. +You've got enough ammo.,TXT_RNO0_SCRIPT34_D15160_YOUVE,〃,,,Vždyť jich máš dost.,Du har ammunition nok.,Du hast genug.,,Vi havas sufiĉe da municio.,Tienes suficiente munición.,,Sinulla on riittävästi ammuksia.,Vous avez assez de munitions.,,Van elég lőszered.,Ma veramente ne hai a sufficienza.,もう十分に弾を持ってるようだぞ。,충분한 탄약을 가졌군...,Je hebt genoeg munitie.,Du har nok ammunisjon.,Masz wystarczającą ilość amunicji.,Você já tem munição suficiente.,,Ai suficientă muniție.,У тебя хватает патронов.,,Du har tillräckligt med ammunition.,Yeterince cephanen var. +Teach me.,TXT_RPLY1_SCRIPT34_D15160_TEACH,〃,,,Uč mě.,Lær mig det.,Unterrichte mich.,,Trejnu min.,Entréname.,,Kouluta minua.,Apprenez-moi.,,Taníts.,Dammi dell'altro addestramento.,教えてくれ。,가르쳐 줘.,Leer het me.,Lær meg det.,Naucz mnie.,Me ensine.,,Învață-mă.,Обучи меня.,,Lär mig.,Öğret bana. O.K. Take what you've learned and show those Order bastards the way to hell.,TXT_RYES1_SCRIPT34_D15160_OKTAK,〃,,,"Oukej. Pamatuj, co ses tady naučil, a ukaž těm hajzlům z Řádu cestu do pekla.",O.K. Tag det du har lært og vis de ordens-svin vejen til helvede.,"OK. Nutze, was du hier gelernt hast um diesen Tölpeln vom Orden den Weg in die Hölle zu zeigen.",,"Bone. Uzu ĉi tion por gvidi tiujn aĉulojn de La Ordeno al la infero.","Bien. Usa lo aprendido para guiar a esos majaderos de La Orden al infierno.","Bien. Usa lo aprendido para guiar a esos -desgraciados de La Orden al infierno.","OK. Hyödynnä täällä oppimaasi, ja näytä niille Veljeskunnan valopäille tie helvettiin.",OK. Utilisez ce que vous avez appris et envoyez ces abrutis de l'Ordre en enfer.,"Rendben is vagyunk, mutasd meg a Rend kutyáknak a pokolba vezető utat!",O.K. Usa ciò che hai imparato qua per mostrare all'Ordine la via dell'Inferno.,"オーケー、ここで学んだ事を生かして +desgraciados de La Orden al infierno.","OK. Hyödynnä täällä oppimaasi, ja näytä niille Veljeskunnan valopäille tie helvettiin.",OK. Utilisez ce que vous avez appris et envoyez ces abrutis de l'Ordre en enfer.,,"Rendben is vagyunk, mutasd meg a Rend kutyáknak a pokolba vezető utat!",O.K. Usa ciò che hai imparato qua per mostrare all'Ordine la via dell'Inferno.,"オーケー、ここで学んだ事を生かして オーダー共を地獄に送って上げなさい。",이제 당신은 더 똑똑해졌습니다. 저 멍청한 오더 놈들에게 쓴맛을 보여주세요!,"Oké, neem wat je geleerd hebt en laat die ordeklootzakken de weg naar de hel zien.",OK. Ta det du har lært og vis de jævlene fra Ordenen veien til helvete.,"Weź to, czego się nauczyłeś i pokaż tym draniom z Zakonu drogę do piekła.",Ok. Use o que você aprendeu e mostre o caminho pro inferno para esses desgraçados da Ordem.,,"O.K. Cu ceea ce ai învățat, trimite-i pe nemernicii Ordinului către infern.","Запоминай внимательно, покажешь этим прихвостням Ордена быструю дорогу в ад.",,Okej. Ta det du lärt dig och visa de där orderjävlarna vägen till helvetet.,Tamam. Öğrendiklerini al ve o Tarikat piçlerine cehennemin yolunu göster. "Come back later, when Macil says it's time.",TXT_RNO1_SCRIPT34_D15160_COMEB,〃,,,"Přijď někdy jindy, až řekne Macil.","Kom tilbage senere, når Macil siger, det er tid.","Komm wieder, wenn Macil dir Bescheid gibt.",,"Revenu post kiam Macil ordonis tion.","Vuelve más tarde cuando -Macil diga que ya es la hora.",,"Palaa asiaan myöhemmin, kun Macil näyttää vihreää valoa.",Revenez plus tard quand Macil décide qu'il est temps.,"Gyere vissza akkor, ha azt mondja Macil hogy ideje van.","Ritorna più tardi, quando Macil dirà che è il momento.",マシルの命令を受けてから、また来い。,마실 사령관님이 준비되었다고 말했을 때 와주세요.,"Kom later terug, als Macil zegt dat het tijd is.","Kom tilbake senere, når Macil sier det er på tide.","Wróć później, kiedy Macil powie, że już czas.","Volte mais tarde, quando o Macil disser que é hora.",,"Revin-o mai încolo, când Macil zice că e timpul.","Приходи позже, когда прикажет Мэйсил.",,"Kom tillbaka senare, när Macil säger att det är dags.",Macil zamanı geldiğini söylediğinde geri gel. -I've taught you everything I can right now. Give me some time to put the new weapons through their paces. That is unless you're out of bullets.,TXT_DLG_SCRIPT34_D16676_IVETA,〃,,,"Naučil jsem tě vše, co teď můžu. Dej mi nějaký čas, abych vyzkoušel ty nové zbraně. Jedině, že bys potřeboval náboje.","Jeg har lært dig alt, hvad jeg kan lige nu. Giv mig lidt tid til at sætte de nye våben på prøve. Medmindre du er løbet tør for kugler.","Ich habe dir alles gezeigt, was ich momentan kann. Gib mir etwas Zeit um die neuen Waffen zu testen. Munition kriegst du natürlich auch so.",,"Mi instruis al vi ĉion, kion mi ĉi-momente povas. Donu tempon al mi por elprovi la novajn armilojn... krom se vi nur bezonas pliajn kuglojn.","Te he enseñado todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Ya te enseñé todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Olen opettanut sinulle kaiken, mitä itse juuri nyt osaan. Anna minulle vähän aikaa käydä läpi uusien aseiden askelkuvioita. Ellei sinulla sitten ole luodit lopussa.","Je vous ai enseigné tout ce que je sais. Laissez moi un peu de temps pour tester ces nouvelles armes. Sauf si vous n'avez plus de munitions, bien sûr.","Megtanítottam mindent amit jelenleg tudtam. Adj egy kis időt, hogy leteszteljem a fegyvereket. Kivétel persze ha lőszer kell.",Ti ho insegnato tutto quello che potevo per ora. Dammi dell'altro tempo per mettere le nuove armi alla prova. A meno che non ti servano altre munizioni.,"私が教えられる事はもう無い。 +Macil diga que ya es la hora.",,"Palaa asiaan myöhemmin, kun Macil näyttää vihreää valoa.",Revenez plus tard quand Macil décide qu'il est temps.,,"Gyere vissza akkor, ha azt mondja Macil hogy ideje van.","Ritorna più tardi, quando Macil dirà che è il momento.",マシルの命令を受けてから、また来い。,마실 사령관님이 준비되었다고 말했을 때 와주세요.,"Kom later terug, als Macil zegt dat het tijd is.","Kom tilbake senere, når Macil sier det er på tide.","Wróć później, kiedy Macil powie, że już czas.","Volte mais tarde, quando o Macil disser que é hora.",,"Revin-o mai încolo, când Macil zice că e timpul.","Приходи позже, когда прикажет Мэйсил.",,"Kom tillbaka senare, när Macil säger att det är dags.",Macil zamanı geldiğini söylediğinde geri gel. +I've taught you everything I can right now. Give me some time to put the new weapons through their paces. That is unless you're out of bullets.,TXT_DLG_SCRIPT34_D16676_IVETA,〃,,,"Naučil jsem tě vše, co teď můžu. Dej mi nějaký čas, abych vyzkoušel ty nové zbraně. Jedině, že bys potřeboval náboje.","Jeg har lært dig alt, hvad jeg kan lige nu. Giv mig lidt tid til at sætte de nye våben på prøve. Medmindre du er løbet tør for kugler.","Ich habe dir alles gezeigt, was ich momentan kann. Gib mir etwas Zeit um die neuen Waffen zu testen. Munition kriegst du natürlich auch so.",,"Mi instruis al vi ĉion, kion mi ĉi-momente povas. Donu tempon al mi por elprovi la novajn armilojn... krom se vi nur bezonas pliajn kuglojn.","Te he enseñado todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Ya te enseñé todo lo que puedo por ahora. Dame tiempo para probar al 100% las nuevas armas... a menos que solo necesites más balas, claro.","Olen opettanut sinulle kaiken, mitä itse juuri nyt osaan. Anna minulle vähän aikaa käydä läpi uusien aseiden askelkuvioita. Ellei sinulla sitten ole luodit lopussa.","Je vous ai enseigné tout ce que je sais. Laissez moi un peu de temps pour tester ces nouvelles armes. Sauf si vous n'avez plus de munitions, bien sûr.",,"Megtanítottam mindent amit jelenleg tudtam. Adj egy kis időt, hogy leteszteljem a fegyvereket. Kivétel persze ha lőszer kell.",Ti ho insegnato tutto quello che potevo per ora. Dammi dell'altro tempo per mettere le nuove armi alla prova. A meno che non ti servano altre munizioni.,"私が教えられる事はもう無い。 今後新しい武器は時間が掛かるが 自分のペースで学んだ方がいい。 弾切れでなければの話だが。","배울 수 있는 모든 것들을 배우셨습니다. 이제 보급할 시간을 좀 주세요. 말이 나와서 하는 말인데, 탄약이 필요하십니까?",Ik heb je alles geleerd wat ik nu kan. Geef me wat tijd om de nieuwe wapens op de proef te stellen. Tenzij je geen kogels meer hebt.,Jeg har lært deg alt jeg kan for øyeblikket. Gi meg litt tid til å teste de nye våpnene. Med mindre du er tom for kuler.,"Nauczyłem cię wszystkiego, co mogę teraz. Dajcie mi trochę czasu, żeby przetestować nową broń. Chyba, że skończyły ci się naboje.",Te ensinei tudo o que eu posso no momento. Me dê um tempo para testar as novas armas. A não ser que você esteja sem munição.,,Te-am învâțat tot ce știu. Dă-mi niște timp să învăț noile arme. Asta în cazul în care nu ai nevoie de gloanțe.,Пока что я не могу научить тебя ничему новому. Дай мне время разобраться в этом новом оружии. Или у тебя закончились патроны?,,Jag har lärt dig allt jag kan just nu. Ge mig lite tid att sätta de nya vapnen på prov. Det vill säga om du inte har slut på kulor.,Şu anda sana öğretebileceğim her şeyi öğrettim. Yeni silahları denemem için bana biraz zaman ver. Tabii mermin bitmediyse. -Yes I am.,TXT_RPLY0_SCRIPT34_D16676_YESIA,〃,,,"Ano, potřebuju.","Ja, det er jeg.","Ja, bin ich.",,Ĝuste.,Eso mismo.,,Kyllä on.,"En effet, je le suis.",Igen.,Sì che mi servono.,ああ、そうだ。,알겠습니다. 그럼 탄약이라도?,"Ja, dat ben ik wel.","Jo, det har jeg.",Tak.,"Sim, eu estou.",,Da sunt.,"Да, закончились.",,"Ja, det är jag.","Evet, bitti." -Here you go.,TXT_RYES0_SCRIPT34_D16676_HEREY,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,Parancsolj.,Ecco qua.,どうぞ。,여기요!,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici sunt.,Держи.,,Här har du.,Al bakalım. +Yes I am.,TXT_RPLY0_SCRIPT34_D16676_YESIA,〃,,,"Ano, potřebuju.","Ja, det er jeg.","Ja, bin ich.",,Ĝuste.,Eso mismo.,,Kyllä on.,"En effet, je le suis.",,Igen.,Sì che mi servono.,ああ、そうだ。,알겠습니다. 그럼 탄약이라도?,"Ja, dat ben ik wel.","Jo, det har jeg.",Tak.,"Sim, eu estou.",,Da sunt.,"Да, закончились.",,"Ja, det är jag.","Evet, bitti." +Here you go.,TXT_RYES0_SCRIPT34_D16676_HEREY,〃,,,Tady máš.,Værsgo.,Bitteschön.,,Jen.,Toma.,,"Tässä, ole hyvä.",Voilà pour vous.,,Parancsolj.,Ecco qua.,どうぞ。,여기요!,Alsjeblieft.,Vær så god.,Proszę bardzo.,Aqui está.,,Aici sunt.,Держи.,,Här har du.,Al bakalım. "Don't get trigger happy in the town, you'll set off the alarm and they will start sending in guards from the castle.",TXT_DLG_SCRIPT34_D18192_DONTG,"MAP34: Upstairs. -(Identical to row 769)",,,Ať tě nenapadne střílet ve městě. Spustil bys poplach a přivolal stráže z hradu.,"Bliv ikke skydeglad i byen, du vil udløse alarmen, og de vil begynde at sende vagter ind fra slottet.","Fang nicht an, hier in der Stadt herumzuballern. Wenn du hier den Alarm auslöst, senden sie gleich die Truppen aus der Burg.",,Ne uzu pafilon en la urbo; vi ekagigus la alarmon kaj ili eksendus gardistojn el la kastelo.,"No te líes a tiros en el pueblo, que activarás la alarma y empezarán a enviar guardias desde el castillo.","No andes a los tiros en el pueblo, que vas a activar la alarma y van a empezar a mandar guardias desde el castillo.","Älä ala turhan liipaisinherkäksi kaupungilla. Aiheutat vielä hälytyksen, ja ne alkavat lähettää linnasta vartijoita.",Ne tirez pas partout en ville. Vous risquez de déclencher l'alarme et ils enverront tous les gardes du château à vos trousses.,"Ne keresd a bajt a városban. Beindítod a riasztót, és kiküldik érted a kastély őröket.",Non ti consiglio di avere il grilletto facile in città. Finiresti per attivare l'allarme e inizierebbero a mandare guardie dal castello.,"街の中で銃をバンバン撃ったりするんじゃないぞ +(Identical to row 769)",,,Ať tě nenapadne střílet ve městě. Spustil bys poplach a přivolal stráže z hradu.,"Bliv ikke skydeglad i byen, du vil udløse alarmen, og de vil begynde at sende vagter ind fra slottet.","Fang nicht an, hier in der Stadt herumzuballern. Wenn du hier den Alarm auslöst, senden sie gleich die Truppen aus der Burg.",,Ne uzu pafilon en la urbo; vi ekagigus la alarmon kaj ili eksendus gardistojn el la kastelo.,"No te líes a tiros en el pueblo, que activarás la alarma y empezarán a enviar guardias desde el castillo.","No andes a los tiros en el pueblo, que vas a activar la alarma y van a empezar a mandar guardias desde el castillo.","Älä ala turhan liipaisinherkäksi kaupungilla. Aiheutat vielä hälytyksen, ja ne alkavat lähettää linnasta vartijoita.",Ne tirez pas partout en ville. Vous risquez de déclencher l'alarme et ils enverront tous les gardes du château à vos trousses.,,"Ne keresd a bajt a városban. Beindítod a riasztót, és kiküldik érted a kastély őröket.",Non ti consiglio di avere il grilletto facile in città. Finiresti per attivare l'allarme e inizierebbero a mandare guardie dal castello.,"街の中で銃をバンバン撃ったりするんじゃないぞ 警報を鳴らしてしまえば、奴等が衛兵共を 城から送り込んでくるぞ。",무턱대고 마을에서 총질하지 마세요. 경보가 울림과 동시에 당신을 잡기 위해서 모든 병력을 보낼 겁니다.,"Laat de trekker niet gelukkig worden in de stad, je laat de wekker afgaan en ze sturen bewakers van het kasteel naar binnen.","Ikke bli skyteglad i byen, da går alarmen, og de sender inn vakter fra slottet.","Nie daj się sprowokować w mieście, bo podniesiesz alarm i zaczną wysyłać strażników z zamku.","Não saia atirando pela cidade, você vai ativar o alarme e vão mandar os guardas do castelo.",,"Nu deveni prea entuziasmat în oraș, vei declanșa alarma și vor trimite gardieni din castel.","Когда будешь в городе, не стреляй направо и налево. Если ты поднимешь тревогу, они вызовут подкрепление из замка.",,"Bli inte skjutglad i staden, du sätter igång larmet och de börjar skicka in vakter från slottet.","Kasabada tetiğe basma, alarmı çalıştırırsın ve kaleden muhafızlar göndermeye başlarlar." "Welcome, we can always use more help.",TXT_DLG_SCRIPT34_D19708_WELCO,"〃 -(Identical to row 770)",,,"Vítej, pomoc se nám vždycky hodí.","Velkommen, vi kan altid bruge mere hjælp.","Willkommen, wir können immer etwas Hilfe gebrauchen.",,Bonvenon. Plia helpo ĉiam estas utilega.,"Bienvenido, siempre nos viene bien algo más de ayuda.",,Tervetuloa; voisimme aina kaivata lisää apua.,Bienvenue. Nous apprécions toute l'aide que nous pouvons recevoir.,"Üdv nálunk, mindig jól jön a segítség.","Benvenuto, ci serve tutto l'aiuto che possiamo ottenere.",ようこそ、我々が貴方の助けに成ります。,어서 오세요. 당신 같은 사람에게는 많은 도움이 필요합니다!,"Welkom, we kunnen altijd meer hulp gebruiken.","Velkommen, vi kan alltid trenge mer hjelp.","Witamy, zawsze przyda nam się więcej pomocy.",Seja bem-vindo. Qualquer ajuda também é sempre bem-vinda.,,"Bun-venit, ajutorul e bine-venit oricând.",Добро пожаловать. Нам всегда пригодится помощь.,,"Välkommen, vi kan alltid behöva mer hjälp.","Hoş geldiniz, her zaman daha fazla yardıma ihtiyacımız olabilir." +(Identical to row 770)",,,"Vítej, pomoc se nám vždycky hodí.","Velkommen, vi kan altid bruge mere hjælp.","Willkommen, wir können immer etwas Hilfe gebrauchen.",,Bonvenon. Plia helpo ĉiam estas utilega.,"Bienvenido, siempre nos viene bien algo más de ayuda.",,Tervetuloa; voisimme aina kaivata lisää apua.,Bienvenue. Nous apprécions toute l'aide que nous pouvons recevoir.,,"Üdv nálunk, mindig jól jön a segítség.","Benvenuto, ci serve tutto l'aiuto che possiamo ottenere.",ようこそ、我々が貴方の助けに成ります。,어서 오세요. 당신 같은 사람에게는 많은 도움이 필요합니다!,"Welkom, we kunnen altijd meer hulp gebruiken.","Velkommen, vi kan alltid trenge mer hjelp.","Witamy, zawsze przyda nam się więcej pomocy.",Seja bem-vindo. Qualquer ajuda também é sempre bem-vinda.,,"Bun-venit, ajutorul e bine-venit oricând.",Добро пожаловать. Нам всегда пригодится помощь.,,"Välkommen, vi kan alltid behöva mer hjälp.","Hoş geldiniz, her zaman daha fazla yardıma ihtiyacımız olabilir." "When I was still in action we had the chance to examine an acolyte before the reinforcements arrived, they're not human I tell you.",TXT_DLG_SCRIPT34_D21224_WHENI,"〃 -(Similar to row 771)",,,"Když jsem byl ještě v akci, měli jsme možnost prozkoumat mrtvého akolytu předtím, než přišly posily. Poslouchej, nejsou to lidé.","Da jeg stadig var i aktion havde vi mulighed for at undersøge en akolyt før forstærkningerne ankom, de er ikke menneskelige siger jeg jer.","Als ich noch aktiv war, hatten wir mal die Möglichkeit, einen der Ministranten zu untersuchen, bevor Verstärkung eintraf. Hör zu, sie sind nicht menschlich!",,"Kiam mi ankoraŭ estis en misio, ni havis okazon ekzameni akoliton antaŭ ol pliaj malamikoj alvenis, kaj ni malkovris, ke ili ne estas homoj.",Cuando aún estaba en acción tuvimos la oportunidad de examinar a un acólito antes de que llegaran los refuerzos y te digo que no son humanos.,,"Kun itse olin vielä mukana taistelemassa, saimme tilaisuuden tutkia akoluuttia ennen lisäjoukkojen saapumista. Ja kuule tarkkaan, ne eivät ole ihmisiä.","Quand j'étais encore en service, j'ai eu l'opportunité d'examiner un acolyte avant que les renforts n'arrivent. Vous savez, ils ne sont pas humains.","Amikor épp harcoltunk, alkalmunk adódott megvizsgálni egy ministránst amíg az erősítés meg nem érkezett volna. Bizony mondom neked, ezek nem emberek.","Quando ero ancora sul campo di battaglia, abbiamo avuto l'occasione di esaminare uno degli accoliti prima che arrivassero i rinforzi. Ascoltami, non sono umani.","私がまだ活動していた時、我々が増援に +(Similar to row 771)",,,"Když jsem byl ještě v akci, měli jsme možnost prozkoumat mrtvého akolytu předtím, než přišly posily. Poslouchej, nejsou to lidé.","Da jeg stadig var i aktion havde vi mulighed for at undersøge en akolyt før forstærkningerne ankom, de er ikke menneskelige siger jeg jer.","Als ich noch aktiv war, hatten wir mal die Möglichkeit, einen der Ministranten zu untersuchen, bevor Verstärkung eintraf. Hör zu, sie sind nicht menschlich!",,"Kiam mi ankoraŭ estis en misio, ni havis okazon ekzameni akoliton antaŭ ol pliaj malamikoj alvenis, kaj ni malkovris, ke ili ne estas homoj.",Cuando aún estaba en acción tuvimos la oportunidad de examinar a un acólito antes de que llegaran los refuerzos y te digo que no son humanos.,,"Kun itse olin vielä mukana taistelemassa, saimme tilaisuuden tutkia akoluuttia ennen lisäjoukkojen saapumista. Ja kuule tarkkaan, ne eivät ole ihmisiä.","Quand j'étais encore en service, j'ai eu l'opportunité d'examiner un acolyte avant que les renforts n'arrivent. Vous savez, ils ne sont pas humains.",,"Amikor épp harcoltunk, alkalmunk adódott megvizsgálni egy ministránst amíg az erősítés meg nem érkezett volna. Bizony mondom neked, ezek nem emberek.","Quando ero ancora sul campo di battaglia, abbiamo avuto l'occasione di esaminare uno degli accoliti prima che arrivassero i rinforzi. Ascoltami, non sono umani.","私がまだ活動していた時、我々が増援に 囲まれる前にアコライトを調べる機会が あったんだ。聞いてくれ、奴等は人間では なかったんだ。",제가 밖에서 근무했을 때 사살한 아콜라이트들을 자세히 들여다본 적이 있었어요. 그 들은 인간이 아니었습니다. 기억하세요.,"Toen ik nog in actie was hadden we de kans om een acoliet te onderzoeken voordat de versterkingen arriveerden, ze zijn niet menselijk, zeg ik je.","Da jeg fortsatt var i aksjon, fikk vi sjansen til å undersøke en akolytt før forsterkningene ankom. De er ikke menneskelige, sier jeg.","Kiedy byłem jeszcze w akcji, mieliśmy okazję zbadać akolitę przed przybyciem posiłków, nie są ludźmi, mówię wam.","Quando eu ainda estava na ativa nós tivemos a oportunidade de examinar um acólito antes dos reforços chegarem. Vai por mim, eles não são humanos.",,"Când încă luam parte la acțiune am avut ocazia să examinez un acolit. înaintă să ajungă întăririle, nu sunt umani.","Пока я был в оперативной группе, нам удалось вскрыть одного из служителей, прежде чем прибыло подкрепление. Так вот, они не люди.",,"När jag fortfarande var i aktion hade vi chansen att undersöka en akolyt innan förstärkningarna kom, de är inte mänskliga säger jag er.","Ben hala görevdeyken, takviye kuvvetler gelmeden önce bir yardımcı kişiyi inceleme şansımız oldu, size söylüyorum onlar insan değil." "We're trying to find where the castle gate mechanisms are, but so far we've had no luck.",TXT_DLG_SCRIPT34_D22740_WERET,"MAP34: Downstairs. -(Identical to row 772)",,,"Snažíme se zjistit, kde jsou mechanismy hradní brány, ale zatím jsme nic nenašli.","Vi prøver at finde ud af hvor slottets portmekanismer er, men indtil videre har vi ikke haft held.","Wir versuchen herauszufinden, von wo das Burgtor kontrolliert wird, aber bisher hatten wir kein Glück.",,"Ni provas malkovri, kie troviĝas la mekanismoj de la pordo de la kastelo, sed ni ankoraŭ ne sukcesis.","Estamos intentando descubrir la ubicación de los mecanismos de la puerta del castillo, pero de momento no ha habido suerte.","Estamos tratando de descubrir la ubicación de los mecanismos de la puerta del castillo, pero por ahora no hubo suerte.","Yritämme löytää linnanportin koneistoa, mutta toistaiseksi laihoin tuloksin.","On essaie de trouver où se trouvent les contrôles de la porte du château, mais pour l'instant, on les a pas encore localisés.","Próbáljuk megtalálni a kastély kapu irányító mechanikáját, de eddig nem jártunk sikerrel.","Stiamo cercando di capire dove si trovano i meccanismi di apertura dell'entrata del castello, ma ancora niente.","我々は城門のメカニズムが何処にあるか +(Identical to row 772)",,,"Snažíme se zjistit, kde jsou mechanismy hradní brány, ale zatím jsme nic nenašli.","Vi prøver at finde ud af hvor slottets portmekanismer er, men indtil videre har vi ikke haft held.","Wir versuchen herauszufinden, von wo das Burgtor kontrolliert wird, aber bisher hatten wir kein Glück.",,"Ni provas malkovri, kie troviĝas la mekanismoj de la pordo de la kastelo, sed ni ankoraŭ ne sukcesis.","Estamos intentando descubrir la ubicación de los mecanismos de la puerta del castillo, pero de momento no ha habido suerte.","Estamos tratando de descubrir la ubicación de los mecanismos de la puerta del castillo, pero por ahora no hubo suerte.","Yritämme löytää linnanportin koneistoa, mutta toistaiseksi laihoin tuloksin.","On essaie de trouver où se trouvent les contrôles de la porte du château, mais pour l'instant, on les a pas encore localisés.",,"Próbáljuk megtalálni a kastély kapu irányító mechanikáját, de eddig nem jártunk sikerrel.","Stiamo cercando di capire dove si trovano i meccanismi di apertura dell'entrata del castello, ma ancora niente.","我々は城門のメカニズムが何処にあるか 探し続けているが、あまり良い結果は出ていない","성문을 열려고 열심히 분석을 해보았습니다만, 결국엔 해답을 찾지 못했습니다.","We proberen te vinden waar de mechanismen van de kasteelpoort zich bevinden, maar tot nu toe hebben we geen geluk gehad.","Vi prøver å finne ut hvor slottets portmekanismer er, men så langt har vi ikke hatt noe hell.","Próbujemy znaleźć gdzie są mechanizmy bramy zamkowej, ale jak na razie nie mamy szczęścia.","Estamos tentando localizar os mecanismos do portão do castelo, mas até agora não tivemos sorte.",,"Încercăm să găsim unde sunt mecanismele castelului, dar n-am avut noroc până acum.","Мы пытаемся найти механизм управления воротами замка, но пока безуспешно. ",,"Vi försöker ta reda på var mekanismerna för slottets portar finns, men hittills har vi inte haft någon tur.",Kale kapısı mekanizmalarının nerede olduğunu bulmaya çalışıyoruz ama şu ana kadar şansımız yaver gitmedi. "Don't get caught. I've heard horror stories about what they do to our people after they're imprisoned. They just disappear, no traces, nothing. ",TXT_DLG_SCRIPT34_D24256_DONTG,"〃 -(Similar to row 773)",,,"Nenech se chytit. Slyšel jsem děsivé příběhy o tom, co dělají našim lidem, když je uvězní. Prostě zmizí... beze stopy.","Bliv ikke fanget. Jeg har hørt skrækhistorier om, hvad de gør ved vores folk, efter de er blevet fængslet. De forsvinder bare, ingen spor, ingenting.","Lass dich nicht erwischen. Ich habe Horrorgeschichten darüber gehört, was sie unseren Leuten antun, die sie gefangengenommen haben. Sie verschwinden einfach... ohne jede Spur.",,"Oni ne kaptu vin. Mi aŭdis terurajn historiojn pri tio, kio okazas al niaj homoj post ilia aresto: ili simple malaperas, nek restaĵoj nek io ajn.",Que no te atrapen. He oído historias terroríficas de lo que hacen con nuestros hombres una vez detenidos: simplemente desaparecen sin rastros ni nada.,,"Älä jää kiinni. Olen kuullut kauhukertomuksia siitä, mitä ne tekevät meidän omillemme, kun he jäävät vangiksi. He yksinkertaisesti katoavat, jälkeä jättämättä.",Ne vous faites pas avoir. J'ai entendu des choses horribles sur ce qu'ils font à ceux qu'ils emprisonnent. Ils disparaîssent... Sans laisser de trace.,"Csak ne kapjanak el. Borzasztó történeteket hallottam azokról akiket bebörtönöztek. Csak úgy nyomuk vész, semmi nyom, konkrétan semmi.","Non farti prendere. Ho sentito storie orribili su quello che fanno alle persone dopo che le catturano. Spariscono completamente, senza tracce, niente di niente.","決して捕まるな。投獄されると奴等が +(Similar to row 773)",,,"Nenech se chytit. Slyšel jsem děsivé příběhy o tom, co dělají našim lidem, když je uvězní. Prostě zmizí... beze stopy.","Bliv ikke fanget. Jeg har hørt skrækhistorier om, hvad de gør ved vores folk, efter de er blevet fængslet. De forsvinder bare, ingen spor, ingenting.","Lass dich nicht erwischen. Ich habe Horrorgeschichten darüber gehört, was sie unseren Leuten antun, die sie gefangengenommen haben. Sie verschwinden einfach... ohne jede Spur.",,"Oni ne kaptu vin. Mi aŭdis terurajn historiojn pri tio, kio okazas al niaj homoj post ilia aresto: ili simple malaperas, nek restaĵoj nek io ajn.",Que no te atrapen. He oído historias terroríficas de lo que hacen con nuestros hombres una vez detenidos: simplemente desaparecen sin rastros ni nada.,,"Älä jää kiinni. Olen kuullut kauhukertomuksia siitä, mitä ne tekevät meidän omillemme, kun he jäävät vangiksi. He yksinkertaisesti katoavat, jälkeä jättämättä.",Ne vous faites pas avoir. J'ai entendu des choses horribles sur ce qu'ils font à ceux qu'ils emprisonnent. Ils disparaîssent... Sans laisser de trace.,,"Csak ne kapjanak el. Borzasztó történeteket hallottam azokról akiket bebörtönöztek. Csak úgy nyomuk vész, semmi nyom, konkrétan semmi.","Non farti prendere. Ho sentito storie orribili su quello che fanno alle persone dopo che le catturano. Spariscono completamente, senza tracce, niente di niente.","決して捕まるな。投獄されると奴等が 何をしでかすか怪談として聞く程だ。 跡形もなく...消される。",오더에게 잡혀가면 절대로 안 됩니다. 수감자들에게 온갖 끔찍한 짓을 저지른다는 이야기를 들은 적이 있었으니까요. 흔적없이 조용히 끌고 간다네요...,"Laat je niet vangen. Ik heb horrorverhalen gehoord over wat ze onze mensen na hun gevangenschap aandoen. Ze verdwijnen gewoon, geen sporen, niets.","Ikke bli tatt. Jeg har hørt skrekkhistorier om hva de gjør med folket vårt etter at de blir fengslet. De bare forsvinner, ingen spor, ingenting.","Nie daj się złapać. Słyszałem przerażające historie o tym, co robią z naszymi ludźmi po uwięzieniu. Po prostu znikają, żadnych śladów, nic.","Não deixe eles te pegarem. Ouvi histórias de terror sobre o que eles fazem com o nosso pessoal depois que são aprisionados. Eles desaparecem, sem deixar rastros.",,Nu fii prins. Am auzit povești de groază legate de ce tratament primesc oamenii odată ce sunt închiși. Pur și simplu dispar fără niciun fel de urmă.,"Не дай себя схватить. Я слышал ужасные истории о том, что они делают с арестованными. Те просто исчезают... без следа.",,"Bli inte ertappad. Jag har hört skräckhistorier om vad de gör med vårt folk efter att de blivit fängslade. De bara försvinner, inga spår, ingenting.","Sakın yakalanmayın. Hapsedildikten sonra insanlarımıza ne yaptıklarına dair korku hikayeleri duydum. Öylece ortadan kayboluyorlar, ne bir iz ne de başka bir şey." "Here's some advice, if you ever see any of the Order's tin soldiers, run the other way. I especially don't like the Reavers, those things are just damned fast!",TXT_DLG_SCRIPT34_D25772_HERES,"〃 -(Similar to row 774)",,,"Dám ti radu: Jestli někdy uvidíš jednoho z plecháčků Řádu, otoč se a jdi. Jsou rychlí a suroví.","Her er et godt råd: Hvis du nogensinde ser nogen af Ordenens tinsoldater, så løb den anden vej. Jeg kan især ikke lide Reavers, de er bare forbandet hurtige!","Hier ist ein guter Rat, falls du jemals einen dieser Zinnsoldaten des Ordens vorbeigehen siehst. Sie sind schnell und brutal. ",,Jen konsilo: estu ĉiam fore de la artefaritaj soldatoj de La Ordeno. Mi plej malŝatas Lertulojn; ili estas rapidegaj!,Un consejo: mantente siempre alejado de los soldados artificiales de La Orden. Los Saqueadores son los peores; ¡esas cosas son jodidamente rápidas!,Un consejo: mantente siempre alejado de los soldados artificiales de La Orden. Los Saqueadores son los peores; ¡esos desgraciados son rápidos!,"Annan pienen vinkin: Jos koskaan näet Veljeskunnan tinasotilaita, juokse toiseen suuntaan. Inhoan varsinkin raastajia; ne ovat vaan niin pirun nopeita!","Voilà un conseil. Si vous voyez un des soldats mécanisés de l'Ordre, retournez vous et courez. Ils sont rapides et brutaux. J'aime surtout pas les Reavers, ces satanés trucs vont trop vite!","Az a tanácsom számodra, hogy ha meglátod a Rend ólomkatonáit, vedd az utad az ellentétes irányba. Különösen igaz ez a fosztogatókra, piszkosul gyorsak.","Ecco un consiglio. Se vedi uno dei soldatini di latta dell'Ordine, vai nella direzione opposta. In particolare temo i Reaver, quei dannati robot sono davvero veloci!","伝えておく、オーダーの錫兵は +(Similar to row 774)",,,"Dám ti radu: Jestli někdy uvidíš jednoho z plecháčků Řádu, otoč se a jdi. Jsou rychlí a suroví.","Her er et godt råd: Hvis du nogensinde ser nogen af Ordenens tinsoldater, så løb den anden vej. Jeg kan især ikke lide Reavers, de er bare forbandet hurtige!","Hier ist ein guter Rat, falls du jemals einen dieser Zinnsoldaten des Ordens vorbeigehen siehst. Sie sind schnell und brutal. ",,Jen konsilo: estu ĉiam fore de la artefaritaj soldatoj de La Ordeno. Mi plej malŝatas Lertulojn; ili estas rapidegaj!,Un consejo: mantente siempre alejado de los soldados artificiales de La Orden. Los Saqueadores son los peores; ¡esas cosas son jodidamente rápidas!,Un consejo: mantente siempre alejado de los soldados artificiales de La Orden. Los Saqueadores son los peores; ¡esos desgraciados son rápidos!,"Annan pienen vinkin: Jos koskaan näet Veljeskunnan tinasotilaita, juokse toiseen suuntaan. Inhoan varsinkin raastajia; ne ovat vaan niin pirun nopeita!","Voilà un conseil. Si vous voyez un des soldats mécanisés de l'Ordre, retournez vous et courez. Ils sont rapides et brutaux. J'aime surtout pas les Reavers, ces satanés trucs vont trop vite!",,"Az a tanácsom számodra, hogy ha meglátod a Rend ólomkatonáit, vedd az utad az ellentétes irányba. Különösen igaz ez a fosztogatókra, piszkosul gyorsak.","Ecco un consiglio. Se vedi uno dei soldatini di latta dell'Ordine, vai nella direzione opposta. In particolare temo i Reaver, quei dannati robot sono davvero veloci!","伝えておく、オーダーの錫兵は 他方から呼び出され押し寄せてくる。 奴等は素早く残忍だ。","충고 하나 해주죠. 오더의 로봇 병사들을 발견한다면, 조용히 피해가세요. 특히나 성가신 놈 중 하나가 리버인데, 그놈의 산탄총은 장난 아니에요!","Hier is een advies, als je ooit een van de tinnen soldaten van de Orde ziet, ren dan de andere kant op. Ik hou vooral niet van de Reavers, die dingen zijn gewoon verdomd snel!","Hvis du ser noen av Ordenens tinnsoldater, så løp den andre veien. Jeg liker spesielt ikke Reavers, de er så jævla raske!","Oto rada, jeśli kiedykolwiek zobaczysz któregoś z blaszanych żołnierzy Zakonu, uciekaj w drugą stronę. Szczególnie nie lubię Łupieżców, te rzeczy są cholernie szybkie!","Um conselho pra você: se você ver algum desses soldados de lata da Ordem, fuja para o lado oposto. Eu particularmente detesto os Saqueadores. Eles são rapidos pra caramba!",,"Iată un sfat, dacă vezi vreodată un soldat al Ordinului, fugi în direcția opusă. Îmi displac mai ales Războinicii, ăștia sunt pur și simplu rapizi!","Небольшой совет: если увидишь «оловянных солдатиков» Ордена, сворачивай в другую сторону. Я особенно не люблю похитителей — эти твари довольно быстрые!",,"Här är ett råd, om du någonsin ser någon av ordens tennsoldater, spring åt andra hållet. Jag gillar särskilt inte Reavers, de där sakerna är förbannat snabba!","Size bir tavsiye, Tarikat'ın teneke askerlerinden birini görürseniz, diğer tarafa kaçın. Özellikle Yağmacıları sevmiyorum, o şeyler çok hızlı!" -"Welcome to the last flicker of hope. Only we have the free will to oppose the Order. We have the sharpest scientific minds, and many able bodies. But we lack that one real problem solver, who will give us the edge we need.",TXT_DLG_SCRIPT34_D27288_WELCO,MAP34: Macil.,,,"Vítej u posledního plamínku naděje. Jen my máme svobodnou vůli vzdorovat Řádu. Máme sice nejčilejší vědecké génie a mnoho schopných vojáků, ale chybí nám ten jeden řešitel problémů, který by nás posunul vpřed.","Velkommen til det sidste lille håb. Kun vi har den frie vilje til at modsætte os Ordenen. Vi har de skarpeste videnskabelige hjerner og mange dygtige kroppe. Men vi mangler den ene rigtige problemløser, som vil give os den fordel, vi har brug for.","Wilkommen beim letzten Hoffnungsschimmer. Nur wir haben noch den freien Willen, um gegen den Orden zu arbeiten. Wir haben die besten Wissenschaftler und viele fähige Kämpfer aber was uns fehlt ist ein spezieller Problemlöser, der uns den nötigen Vorteil verschafft.",,"Bonvenon en la lasta fajrero da espero. Nur ni havas liberan volon por kontraŭstari al La Ordeno. Ni havas la plej inteligentajn mensojn kaj multe da kapablaj homoj, sed mankas tiu... tiu, kiu estus vera problem-solvanto, por ke li donu al ni la necesan avantaĝon.","Bienvenido al último destello de esperanza. Solo nosotros tenemos el libre albedrío para oponernos a La Orden. Tenemos las mentes científicas más brillantes y muchas personas capaces, pero nos falta el que... el que sería todo un solucionador de problemas para que nos dé la ventaja que necesitamos.",,"Tervetuloa viimeisen toivonpilkahduksen äärelle. Ainoastaan meillä on vapaa tahto vastustaa Veljeskuntaa. Meillä on tieteen terävimmät mielet ja monia ruumiiltaan vahvoja, mutta meiltä puuttuu se yksi todellinen ongelmanratkoja, joka antaisi meille kaipaamamme etulyöntiaseman.","Bienvenue au dernier lieu d'espoir. Nous seuls avons la liberté d'esprit pour opposer l'Ordre. Nous avons les esprits scientifiques les plus aiguisés et de nombreux hommes habiles et sains.. Mais il nous manque quelqu'un qui pourrait.. résoudre nos problèmes. Nous donner un peu d'aide, nous permettre de prendre l'avantage.","Köszöntelek a remény utolsó pislákoló fényénél. Már csak mi merünk szembeszállni a Renddel. Itt vannak a legélesebb elmék, életerős emberek, de hiányzik egy igazi...probléma megoldó, aki előnyt szerez számunkra. Segíts nekünk!","Benenuto nell'ultimo barlume di speranza. Noi siamo i soli ad avere la determinazione per combattere l'Ordine. Abbiamo brillanti scienziati e molti soldati capaci, ma ci manca quel vero e proprio risolutore di problemi, che ci può dare quel vantaggio che cerchiamo.","ようこそ、ここは我々の僅かな希望が集まる +"Welcome to the last flicker of hope. Only we have the free will to oppose the Order. We have the sharpest scientific minds, and many able bodies. But we lack that one real problem solver, who will give us the edge we need.",TXT_DLG_SCRIPT34_D27288_WELCO,MAP34: Macil.,,,"Vítej u posledního plamínku naděje. Jen my máme svobodnou vůli vzdorovat Řádu. Máme sice nejčilejší vědecké génie a mnoho schopných vojáků, ale chybí nám ten jeden řešitel problémů, který by nás posunul vpřed.","Velkommen til det sidste lille håb. Kun vi har den frie vilje til at modsætte os Ordenen. Vi har de skarpeste videnskabelige hjerner og mange dygtige kroppe. Men vi mangler den ene rigtige problemløser, som vil give os den fordel, vi har brug for.","Wilkommen beim letzten Hoffnungsschimmer. Nur wir haben noch den freien Willen, um gegen den Orden zu arbeiten. Wir haben die besten Wissenschaftler und viele fähige Kämpfer aber was uns fehlt ist ein spezieller Problemlöser, der uns den nötigen Vorteil verschafft.",,"Bonvenon en la lasta fajrero da espero. Nur ni havas liberan volon por kontraŭstari al La Ordeno. Ni havas la plej inteligentajn mensojn kaj multe da kapablaj homoj, sed mankas tiu... tiu, kiu estus vera problem-solvanto, por ke li donu al ni la necesan avantaĝon.","Bienvenido al último destello de esperanza. Solo nosotros tenemos el libre albedrío para oponernos a La Orden. Tenemos las mentes científicas más brillantes y muchas personas capaces, pero nos falta el que... el que sería todo un apagafuegos para que nos dé la ventaja que necesitamos.",,"Tervetuloa viimeisen toivonpilkahduksen äärelle. Ainoastaan meillä on vapaa tahto vastustaa Veljeskuntaa. Meillä on tieteen terävimmät mielet ja monia ruumiiltaan vahvoja, mutta meiltä puuttuu se yksi todellinen ongelmanratkoja, joka antaisi meille kaipaamamme etulyöntiaseman.","Bienvenue au dernier lieu d'espoir. Nous seuls avons la liberté d'esprit pour opposer l'Ordre. Nous avons les esprits scientifiques les plus aiguisés et de nombreux hommes habiles et sains.. Mais il nous manque quelqu'un qui pourrait.. résoudre nos problèmes. Nous donner un peu d'aide, nous permettre de prendre l'avantage.",,"Köszöntelek a remény utolsó pislákoló fényénél. Már csak mi merünk szembeszállni a Renddel. Itt vannak a legélesebb elmék, életerős emberek, de hiányzik egy igazi...probléma megoldó, aki előnyt szerez számunkra. Segíts nekünk!","Benenuto nell'ultimo barlume di speranza. Noi siamo i soli ad avere la determinazione per combattere l'Ordine. Abbiamo brillanti scienziati e molti soldati capaci, ma ci manca quel vero e proprio risolutore di problemi, che ci può dare quel vantaggio che cerchiamo.","ようこそ、ここは我々の僅かな希望が集まる 最後の場所だ。オーダーへと立ち向かう意思を 持っているのは我々くらいだ。 ここには素晴らしい頭脳を持つ学者たち、 @@ -12172,569 +12172,569 @@ Here you go.,TXT_RYES0_SCRIPT34_D16676_HEREY,〃,,,Tady máš.,Værsgo.,Bittesch だがしかし、我々には問題解決に優れた者、 つまり私達の力となる者が足りていないんだ。 我々に手を貸してくれ。","희미한 희망에 빛에 온 것을 환영합니다. 우리만이 오더를 처치할 자유의지를 가지고 있지요. 우수한 과학력에, 뛰어난 실력을 소유한 부대도 있으니까 말입니다. 하지만, 우리들에게도 부족한 게 하나 있습니다. 바로 시련을 해결해 줄 해결사죠. 부디 도와주세요.","Welkom bij het laatste sprankje hoop. Alleen wij hebben de vrije wil om ons te verzetten tegen de Orde. We hebben de scherpste wetenschappelijke geesten en veel bekwame lichamen. Maar we missen die ene echte probleemoplosser, die ons de voorsprong zal geven die we nodig hebben.","Velkommen til det siste glimt av håp. Bare vi har den frie viljen til å motsette oss Ordenen. Vi har de skarpeste vitenskapelige hodene, og mange dyktige kropper. Men vi mangler den ene virkelige problemløseren, som vil gi oss det forspranget vi trenger.","Witamy w ostatniej iskierce nadziei. Tylko my mamy wolną wolę, by przeciwstawić się Zakonowi. Mamy najbystrzejsze umysły naukowe i wiele sprawnych ciał. Ale brakuje nam tego jednego prawdziwego rozwiązania problemu, które da nam przewagę, której potrzebujemy.","Seja bem-vindo à última ponta de esperança. Somos os únicos que têm o livre arbítrio para combater a Ordem. Temos as mentes científicas mais afiadas e muitas pessoas capazes. Mas ainda nos falta aquele verdadeiro quebra-galho, que nos dará o impulso que precisamos.",,"Bun-venit la ultima speranță. Numai noi avem voința de a ne opune Ordinului. Avem cele mai strălucite minți științifice și multe corpuri capabile. Dar ne lipsește acea persoană capabilă să rezolve probleme, care o să ne dea avantajul de care avem nevoie.","Добро пожаловать в последний оплот надежды. Только мы обладаем свободной волей, чтобы противостоять Ордену. С нами лучшие учёные умы, и у нас есть много толковых людей, но нам не хватает одного-единственного, э... «разрешителя проблем», который поможет нам получить необходимое преимущество.",,Välkommen till den sista gnistan av hopp. Endast vi har den fria viljan att motsätta oss Orden. Vi har de skarpaste vetenskapliga hjärnorna och många dugliga kroppar. Men vi saknar en riktig problemlösare som kan ge oss det övertag vi behöver.,Son umut ışığına hoş geldiniz. Tarikat'a karşı çıkacak özgür irade sadece bizde var. En keskin bilimsel zihinlere ve birçok yetenekli bedene sahibiz. Ama bize ihtiyacımız olan avantajı sağlayacak gerçek bir sorun çözücüden yoksunuz. -What will I need to do? ,TXT_RPLY0_SCRIPT34_D27288_WHATW,〃,,,Co budu muset udělat?,Hvad skal jeg gøre?,Was muss ich tun?,,Kion mi bezonas fari?,¿Qué necesito hacer?,,Mitä minun tarvitsee tehdä?,Que dois-je faire?,Mit kell tennem?,Che cosa devo fare?,何をしたらいい?,무엇을 해야하죠?,Wat moet ik doen?,Hva må jeg gjøre?,Co będę musiał zrobić?,O que preciso fazer?,,Ce trebuie să fac?,Что я должен сделать?,,Vad måste jag göra?,Ne yapmam gerekecek? -Help us. Help us steal their technology. Free our comrades. Fight these twisted psychopaths to the death. I'm asking you to risk your life for the truth.,TXT_DLG_SCRIPT34_D28804_HELPU,〃,,,Pomoz nám. Pomoz nám ukrást jejich technologie. Osvobodit naše druhy. Bojovat s těmi šílenými psychopaty na smrt. Chci po tobě riskovat svůj život kvůli pravdě.,Hjælp os. Hjælp os med at stjæle deres teknologi. Befri vores kammerater. Bekæmp disse forvredne psykopater til døden. Jeg beder dig om at sætte dit liv på spil for sandheden.,"Hilf uns. Hilf uns ihre Technologie zu stehlen. Befreie unsere Kameraden. Bekämpfe diese verwirrten Psychopathen bis zum Tod. Ich bitte dich, dein Leben zu riskieren um die Wahrheit zu verteidigen.",,"Helpu nin: helpu al ni ŝteli ilian teknologion, liberigu niajn kamaradojn, bataladu ĝismorte kontraŭ tiuj malicaj psikopatoj. Mi petas, ke vi risku vian vivon pro la vero.","Ayúdanos: ayúdanos a robar su tecnología, libera a nuestros camaradas, pelea contra esos retorcidos psicopáticos hasta la muerte. Te estoy pidiendo que arriesgues la vida por la verdad.",,Auta meitä. Auta meitä kaappaamaan heidän teknologiaansa. Vapauta meidän toverimme. Taistele näitä kieroituneita psykopaatteja vastaan kuoloon asti. Pyydän sinua antamaan henkesi alttiiksi totuuden nimessä.,Aidez nous. Aidez nous à voler leur technologie. Libérer nos camarades. Combattre ces psychopathes jusqu'à la mort. Je vous demande de risquer votre vie pour la vérité.,"Segíts nekünk. Abban, hogy ellophassuk a technológiájukat. Kiszabadítani a társainkat. Halálunkig harcolni ezek a pszihopaták ellen. Azt kell kérjem tőled, hogy tedd kockára az életed az igazságérrt.",Aiutaci. Aiutaci a rubare la loro tecnologia. Libera i nostri compagni. Combatti questi maledetti psicopatici fino alla morte. Ti sto chiedendo di rischiare la tua vita per la verità.,"我々の援護だ。我々が奴等のテクノロジーを +What will I need to do? ,TXT_RPLY0_SCRIPT34_D27288_WHATW,〃,,,Co budu muset udělat?,Hvad skal jeg gøre?,Was muss ich tun?,,Kion mi bezonas fari?,¿Qué necesito hacer?,,Mitä minun tarvitsee tehdä?,Que dois-je faire?,,Mit kell tennem?,Che cosa devo fare?,何をしたらいい?,무엇을 해야하죠?,Wat moet ik doen?,Hva må jeg gjøre?,Co będę musiał zrobić?,O que preciso fazer?,,Ce trebuie să fac?,Что я должен сделать?,,Vad måste jag göra?,Ne yapmam gerekecek? +Help us. Help us steal their technology. Free our comrades. Fight these twisted psychopaths to the death. I'm asking you to risk your life for the truth.,TXT_DLG_SCRIPT34_D28804_HELPU,〃,,,Pomoz nám. Pomoz nám ukrást jejich technologie. Osvobodit naše druhy. Bojovat s těmi šílenými psychopaty na smrt. Chci po tobě riskovat svůj život kvůli pravdě.,Hjælp os. Hjælp os med at stjæle deres teknologi. Befri vores kammerater. Bekæmp disse forvredne psykopater til døden. Jeg beder dig om at sætte dit liv på spil for sandheden.,"Hilf uns. Hilf uns ihre Technologie zu stehlen. Befreie unsere Kameraden. Bekämpfe diese verwirrten Psychopathen bis zum Tod. Ich bitte dich, dein Leben zu riskieren um die Wahrheit zu verteidigen.",,"Helpu nin: helpu al ni ŝteli ilian teknologion, liberigu niajn kamaradojn, bataladu ĝismorte kontraŭ tiuj malicaj psikopatoj. Mi petas, ke vi risku vian vivon pro la vero.","Ayúdanos: ayúdanos a robar su tecnología, libera a nuestros camaradas, pelea contra esos retorcidos psicopáticos hasta la muerte. Te estoy pidiendo que arriesgues la vida por la verdad.",,Auta meitä. Auta meitä kaappaamaan heidän teknologiaansa. Vapauta meidän toverimme. Taistele näitä kieroituneita psykopaatteja vastaan kuoloon asti. Pyydän sinua antamaan henkesi alttiiksi totuuden nimessä.,Aidez nous. Aidez nous à voler leur technologie. Libérer nos camarades. Combattre ces psychopathes jusqu'à la mort. Je vous demande de risquer votre vie pour la vérité.,,"Segíts nekünk. Abban, hogy ellophassuk a technológiájukat. Kiszabadítani a társainkat. Halálunkig harcolni ezek a pszihopaták ellen. Azt kell kérjem tőled, hogy tedd kockára az életed az igazságérrt.",Aiutaci. Aiutaci a rubare la loro tecnologia. Libera i nostri compagni. Combatti questi maledetti psicopatici fino alla morte. Ti sto chiedendo di rischiare la tua vita per la verità.,"我々の援護だ。我々が奴等のテクノロジーを 盗むのを手伝って欲しい。同胞の解放の為だ。 イカレた奴等と戦闘する必要がある。 正義を取り戻すため君には危険の伴う任務を 受けてほしいのだ。","우릴 도와주세요. 놈들의 기술을 훔치고, 붙잡힌 동료들을 구출하고, 오더의 미치광이들을 타도하기 위해서 말이죠. 그리고 진실 어린 희망을 위해서 이렇게 묻는 겁니다.",Help ons. Help ons hun technologie te stelen. Bevrijd onze kameraden. Bestrijd deze verdraaide psychopaten tot de dood toe. Ik vraag je om je leven te riskeren voor de waarheid.,Hjelpe oss. Hjelp oss med å stjele teknologien deres. Befri kameratene våre. Kjemp mot disse forskrudde psykopatene til døden. Jeg ber deg om å risikere livet for sannheten.,"Pomóc nam. Pomóż nam wykraść ich technologię. Uwolnić naszych towarzyszy. Walczyć z tymi pokręconymi psychopatami na śmierć. Proszę cię, abyś zaryzykował swoje życie dla prawdy.",Nos ajudar. Ajude-nos a roubar a tecnologia deles. Liberte nossos companheiros. Lute contra esses psicopatas insanos até a morte. Estou te pedindo para arriscar a sua vida pela verdade.,,Ajută-ne. Ajută-ne să le furăm tehnologia. Să ne eliberăm compatrioții. Să luptăm cu acești psihopați suciți până la moarte. Îți cer să îți riști viața pentru adevăr.,Помочь нам. Помочь нам украсть их технологии. Освободить наших товарищей. Сразиться с этими извращёнными психопатами и убить их. Рискнуть своей жизнью ради правого дела.,,Hjälp oss. Hjälp oss att stjäla deras teknologi. Befria våra kamrater. Kämpa mot de här förvridna psykopaterna in i döden. Jag ber dig riskera ditt liv för sanningen.,Bize yardım et. Teknolojilerini çalmamıza yardım et. Yoldaşlarımızı serbest bırak. Bu sapkın psikopatlarla ölümüne savaş. Senden gerçek için hayatını riske atmanı istiyorum. -I'm with you!,TXT_RPLY0_SCRIPT34_D28804_IMWIT,〃,,,Jsem s tebou!,Jeg er med dig!,Ich bin dabei.,,Mi aliĝos al vi!,¡Estoy contigo!,,Olen kanssanne!,Je suis avec vous!,Veletek vagyok!,Sono con te!,同意した!,함께 하겠습니다!,Ik sta achter je!,Jeg er med deg!,Jestem z tobą!,Estou com vocês!,,Sunt cu tine!,Хорошо! Я с вами!,,Jag är med dig!,Seninleyim! -"Good. Blackbird will continue to be your guide. She's taken quite a shine to you. Together, you've got to unlock the secrets of the Order and their inhuman servants. There's a presence that lurks just outside our understanding which guides their terror. Get inside and take them down. ",TXT_DLG_SCRIPT34_D30320_GOODB,〃,,,"Dobře, Straka ti bude dále dávat pokyny. Docela ses jí zalíbil. Společně budete muset odkrýt tajemství Řádu a jeho nelidských služebníků. Někde mimo naše chápání je něco, co ovládá jejich řádění. Pronikněte dovnitř a sejměte je.","Jeg er med dig. Blackbird vil fortsat være din guide. Hun er blevet ret glad for dig. Sammen skal I løse hemmelighederne om Ordenen og deres umenneskelige tjenere. Der er en tilstedeværelse, der lurer lige uden for vores forståelse, som styrer deres terror. Kom ind og nedkæmp dem.","Gut so! Blackbird wird weiter deine Leiterin sein, sie scheint dich zu mögen. Zusammen müsst ihr die Geheimnisse des Ordens und ihrer unmenschlichen Diener ergründen. Dann haben wir eine Chance, sie niederzuringen. Da ist eine Präsenz außerhalb unseres Vorstellungsvermögens, das diesen Terror leitet. Wir müssen sie unterwandern und dann vernichten.",,"Bone. Merlo plue estos via gvidanto; ŝajnas, ke ŝi jam simpatias vin. Vi kune devas malkaŝi la sekretojn de La Ordeno kaj de ĝiaj nehomaj servantoj. Estas estaĵo trans homa kompreno, kiu gvatas kaj gvidas iliajn teruraĵojn. Enŝoviĝu kaj detruu ilin.",Bien. Blackbird seguirá siendo tu guía; parece que ya le caes bien. Juntos debéis descubrir los secretos de La Orden y de sus sirvientes inhumanos. Hay una presencia ultramundana observando y guiando su terror desde las sombras. Infiltraos y acabad con ellos.,Bien. Blackbird va a seguir siendo tu guía; parece que ya le caes bien. Juntos deben descubrir los secretos de La Orden y de sus sirvientes inhumanos. Hay una presencia ultramundana observando y guiando su terror desde las sombras. Infíltrense y destrúyanlos.,"Hyvä; Blackbird jatkaa opastajanasi. Hän vaikuttaa pitävän sinusta. Teidän on yhdessä paljastettava Veljeskunnan ja heidän epäinhimillisten palvelijoinsa salat. Heidän hirmuvaltaansa ohjaa läsnäolo, joka ylittää ymmärryksemme. Murtaudu sisään ja aja heidät alas.","Parfait. Blackbird continuera à être votre guide. Elle semble vous apprécier. Ensemble, vous allez découvrir les secrets de l'Ordre et leurs servants inhumains. Il existe une présece qui rôde juste au dehors de notre compréhension qui guide cette terreur. Infiltrez-les et détruisez-les.","Helyes, Feketerigó továbbra is az irányítód lesz. Eléggé megtetszettél neki. Együtt meg fogjátok fejteni a Rend és kegyetlen szolgáinak titkait. Egyfajta emberi ésszel fel nem fogható jelenlét kényszeríti őket a terrorizálásra. Hatoljatok be és intézzétek el őket.","Bene. Blackbird continuerà ad essere la tua guida. Sembra ti abbia preso in simpatia. Insieme dovrete scoprire i segreti dell'Ordine e dei loro servi inumani. C'è qualcosa di malefico, oltre la nostra comprensione, che guida il loro terrore. Bisognerà infiltrarlo e distruggerlo.","いいぞ、今後もブラックバードが君のガイドを +I'm with you!,TXT_RPLY0_SCRIPT34_D28804_IMWIT,〃,,,Jsem s tebou!,Jeg er med dig!,Ich bin dabei.,,Mi aliĝos al vi!,¡Estoy contigo!,,Olen kanssanne!,Je suis avec vous!,,Veletek vagyok!,Sono con te!,同意した!,함께 하겠습니다!,Ik sta achter je!,Jeg er med deg!,Jestem z tobą!,Estou com vocês!,,Sunt cu tine!,Хорошо! Я с вами!,,Jag är med dig!,Seninleyim! +"Good. Blackbird will continue to be your guide. She's taken quite a shine to you. Together, you've got to unlock the secrets of the Order and their inhuman servants. There's a presence that lurks just outside our understanding which guides their terror. Get inside and take them down. ",TXT_DLG_SCRIPT34_D30320_GOODB,〃,,,"Dobře, Straka ti bude dále dávat pokyny. Docela ses jí zalíbil. Společně budete muset odkrýt tajemství Řádu a jeho nelidských služebníků. Někde mimo naše chápání je něco, co ovládá jejich řádění. Pronikněte dovnitř a sejměte je.","Jeg er med dig. Blackbird vil fortsat være din guide. Hun er blevet ret glad for dig. Sammen skal I løse hemmelighederne om Ordenen og deres umenneskelige tjenere. Der er en tilstedeværelse, der lurer lige uden for vores forståelse, som styrer deres terror. Kom ind og nedkæmp dem.","Gut so! Blackbird wird weiter deine Leiterin sein, sie scheint dich zu mögen. Zusammen müsst ihr die Geheimnisse des Ordens und ihrer unmenschlichen Diener ergründen. Dann haben wir eine Chance, sie niederzuringen. Da ist eine Präsenz außerhalb unseres Vorstellungsvermögens, das diesen Terror leitet. Wir müssen sie unterwandern und dann vernichten.",,"Bone. Merlo plue estos via gvidanto; ŝajnas, ke ŝi jam simpatias vin. Vi kune devas malkaŝi la sekretojn de La Ordeno kaj de ĝiaj nehomaj servantoj. Estas estaĵo trans homa kompreno, kiu gvatas kaj gvidas iliajn teruraĵojn. Enŝoviĝu kaj detruu ilin.",Bien. Blackbird seguirá siendo tu guía; parece que ya le caes bien. Juntos debéis descubrir los secretos de La Orden y de sus sirvientes inhumanos. Hay una presencia ultramundana observando y guiando su terror desde las sombras. Infiltraos y acabad con ellos.,Bien. Blackbird va a seguir siendo tu guía; parece que ya le caes bien. Juntos deben descubrir los secretos de La Orden y de sus sirvientes inhumanos. Hay una presencia ultramundana observando y guiando su terror desde las sombras. Infíltrense y destrúyanlos.,"Hyvä; Blackbird jatkaa opastajanasi. Hän vaikuttaa pitävän sinusta. Teidän on yhdessä paljastettava Veljeskunnan ja heidän epäinhimillisten palvelijoinsa salat. Heidän hirmuvaltaansa ohjaa läsnäolo, joka ylittää ymmärryksemme. Murtaudu sisään ja aja heidät alas.","Parfait. Blackbird continuera à être votre guide. Elle semble vous apprécier. Ensemble, vous allez découvrir les secrets de l'Ordre et leurs servants inhumains. Il existe une présece qui rôde juste au dehors de notre compréhension qui guide cette terreur. Infiltrez-les et détruisez-les.",,"Helyes, Feketerigó továbbra is az irányítód lesz. Eléggé megtetszettél neki. Együtt meg fogjátok fejteni a Rend és kegyetlen szolgáinak titkait. Egyfajta emberi ésszel fel nem fogható jelenlét kényszeríti őket a terrorizálásra. Hatoljatok be és intézzétek el őket.","Bene. Blackbird continuerà ad essere la tua guida. Sembra ti abbia preso in simpatia. Insieme dovrete scoprire i segreti dell'Ordine e dei loro servi inumani. C'è qualcosa di malefico, oltre la nostra comprensione, che guida il loro terrore. Bisognerà infiltrarlo e distruggerlo.","いいぞ、今後もブラックバードが君のガイドを 務める。彼女は君に感心しているようだぞ。 君たちの二人で、オーダーと その人間離れした手下たちが持っている秘密を 暴いてもらいたい。 奴等の基地に潜り込んで、倒すんだ。","감사드립니다! 블랙버드가 당신을 위해 계속 안내를 할 것입니다. 같이 행동한다면 오더의 흉측한 비밀들을 밝혀내고, 그들의 잔혹한 존재들을 응징할 수 있을 겁니다. 우리들의 이해심 밑에 공포를 인도하는 그들의 숨겨진 존재가 있죠. 그곳으로 들어가서, 물리치세요.",Goed. Blackbird zal je gids blijven. Ze heeft je een behoorlijke glans gegeven. Samen moeten jullie de geheimen van de Orde en hun onmenselijke dienaren ontrafelen. Er is een aanwezigheid die net buiten ons begrip schuilt en die hun angst leidt. Ga naar binnen en neem ze mee naar beneden.,Bra. Blackbird vil fortsette å være din guide. Hun har blitt ganske betatt av deg. Sammen må dere avsløre hemmelighetene til Ordenen og deres umenneskelige tjenere. Det er en tilstedeværelse som lurer like utenfor vår forståelse som styrer deres terror. Gå inn og ta dem.,"Dobrze. Blackbird nadal będzie twoim przewodnikiem. Polubiła cię. Razem musicie odkryć tajemnice Zakonu i ich nieludzkich sług. Istnieje obecność, która czai się poza naszym rozumieniem, która kieruje ich terrorem. Dostań się do środka i zdejmij ich.","Ótimo. Blackbird continuará sendo a sua guia. Ela parece que vai com a sua cara. Juntos, vocês desvendarão os segredos da Ordem e seus discípulos desumanos. Há uma presença que está além do nosso entendimento que guia todo esse terror. Vá infiltrar a Ordem e elimine-os.",,"Bun. Blackbird va continua să fie ghidul tău. A început să ia un interes asupra ta. Împreună, va trebui să aflați secretele Ordinului și servitorilor lor inumani. Există o prezență care se târăște la marginea capacității noastre de înțelegere care le ghidează teroarea. Infiltrează-te și pune-i la pământ.",Хорошо. «Чёрный дрозд» останется твоим проводником. Она тебе несколько симпатизирует. Вместе вы раскроете секреты Ордена и его бесчеловечных слуг. За этим ужасом стоит нечто лежащее далеко за пределами нашего понимания. Проникни на их территорию и ударь по ним как следует!,,Jag är med dig. Blackbird kommer att fortsätta att vara din guide. Hon har blivit ganska förtjust i dig. Tillsammans måste ni avslöja hemligheterna om Orden och deras omänskliga tjänare. Det finns en närvaro som lurar utanför vår förståelse och som styr deras terror. Ta dig in och ta ner dem.,Güzel. Karatavuk rehberin olmaya devam edecek. Senden oldukça hoşlandı. Birlikte Tarikat'ın ve insanlık dışı hizmetkârlarının sırlarını açığa çıkarmalısınız. Anlayışımızın hemen dışında gizlenen ve onların terörüne rehberlik eden bir varlık var. İçeri gir ve onları alaşağı et. -Let me at 'em!,TXT_RPLY0_SCRIPT34_D30320_LETME,〃,,,Pusť mě na ně!,Lad mig tage dem!,Lass mich das nur machen.,,Mi faros tion!,¡Voy a por ellos!,¡Voy por ellos!,Päästä minut heidän kimppuunsa!,Laissez moi m'en occuper!,Szétcincálom mind!,Lasciali a me!,任せろ!,저만 믿으세요!,Laat me naar ze toe!,La meg ta dem!,Pozwól mi na nich!,Pode deixar!,,Lasă-mă să pun mâna pe ei!,Я им покажу!,,Låt mig ta dem!,Bırakın ben halledeyim! -That's the spirit.,TXT_RYES0_SCRIPT34_D30320_THATS,〃,,,Tak se mi to líbí.,Sådan er ånden.,Das ist die richtige Einstellung.,,Tiu estas la spirito.,Ese es el espíritu.,,Niin sitä pitää.,J'aime entendre ça.,Ez a beszéd!,Questo è lo spirito giusto.,良い心掛けだ。,좋은 마음가짐입니다.,Dat is de geest.,Sånn skal det låte.,To jest duch.,Esse é o espírito.,,Ăsta e spiritul.,Правильный настрой.,,Så ska det låta.,İşte ruh bu. -Welcome friend!,TXT_DLG_SCRIPT34_D31836_WELCO,〃,,,"Vítej, příteli!","Velkommen, min ven!","Wilkommen, Freund.",,"Bonvenon, amiko!","¡Bienvenido, amigo!",,"Tervetuloa, ystävä!","Bievenue, notre ami!",Üdvözöllek barátom.,Benvenuto amico!,よく来た、同志!,"어서오세요, 친구여!",Welkom vriend!,"Velkommen, min venn!",Witaj przyjacielu!,"Seja bem-vindo, amigo!",,Bun-venit prietene!,"Добро пожаловать, друг!",,"Välkommen, min vän!",Hoş geldin dostum! -,,Random dialogue,,,,,,,,,,,,,,,,,,,,,,,,, -Please don't hurt me.,TXT_RANDOM_PEASANT_01,,,,"Neubližuj mi, prosím.",Du må ikke gøre mig noget.,Bitte tu mir nicht weh.,,Bonvolu ne vundi min.,"No me hagas nada, por favor.",,"Pyydän, älä vahingoita minua.","S'il vous plaît, laissez-moi tranquille.",Kérlek ne bánts!,"Ti prego, non farmi del male.",私を傷つけないでくれ。,목숨만은 살려줘.,Doe me alsjeblieft geen pijn.,"Vær så snill, ikke skad meg.","Proszę, nie rób mi krzywdy.","Por favor, não me machuque.",,Te rog nu mă răni.,"Пожалуйста, не трогай меня.",,"Snälla, gör mig inte illa.",Lütfen bana zarar verme. -"If you're looking to hurt me, I'm not really worth the effort.",TXT_RANDOM_PEASANT_02,,,,"Jestli mi chceš ublížit, fakt za to nestojím.","Hvis du er ude på at såre mig, er jeg ikke rigtig besværet værd.","Falls du mir was antun willst, ich bin den Aufwand nicht wert.",,"Se vi intencas vundi min, vi vere gajnos nenion.","Si estás tratando de hacerme algo, no valdrá la pena, la verdad.","Si estás tratando de hacerme algo, no va a valer la pena, la verdad.","Jos aikomuksenasi on vahingoittaa minua, en todellakaan ole sen vaivan väärti.","Si vous cherchez à me faire mal, Je n'en mérite pas l'effort.","Ha bántani akarsz, nem éri meg a fáradozást.","Se hai intenzione di farmi del male, ti assicuro che non ne valgo la pena.","もしお前が私に暴力を振るいたいなら間違いだ、 +Let me at 'em!,TXT_RPLY0_SCRIPT34_D30320_LETME,〃,,,Pusť mě na ně!,Lad mig tage dem!,Lass mich das nur machen.,,Mi faros tion!,¡Voy a por ellos!,¡Voy por ellos!,Päästä minut heidän kimppuunsa!,Laissez moi m'en occuper!,,Szétcincálom mind!,Lasciali a me!,任せろ!,저만 믿으세요!,Laat me naar ze toe!,La meg ta dem!,Pozwól mi na nich!,Pode deixar!,,Lasă-mă să pun mâna pe ei!,Я им покажу!,,Låt mig ta dem!,Bırakın ben halledeyim! +That's the spirit.,TXT_RYES0_SCRIPT34_D30320_THATS,〃,,,Tak se mi to líbí.,Sådan er ånden.,Das ist die richtige Einstellung.,,Tiu estas la spirito.,Ese es el espíritu.,,Niin sitä pitää.,J'aime entendre ça.,,Ez a beszéd!,Questo è lo spirito giusto.,良い心掛けだ。,좋은 마음가짐입니다.,Dat is de geest.,Sånn skal det låte.,To jest duch.,Esse é o espírito.,,Ăsta e spiritul.,Правильный настрой.,,Så ska det låta.,İşte ruh bu. +Welcome friend!,TXT_DLG_SCRIPT34_D31836_WELCO,〃,,,"Vítej, příteli!","Velkommen, min ven!","Wilkommen, Freund.",,"Bonvenon, amiko!","¡Bienvenido, amigo!",,"Tervetuloa, ystävä!","Bievenue, notre ami!",,Üdvözöllek barátom.,Benvenuto amico!,よく来た、同志!,"어서오세요, 친구여!",Welkom vriend!,"Velkommen, min venn!",Witaj przyjacielu!,"Seja bem-vindo, amigo!",,Bun-venit prietene!,"Добро пожаловать, друг!",,"Välkommen, min vän!",Hoş geldin dostum! +,,Random dialogue,,,,,,,,,,,,,,,,,,,,,,,,,, +Please don't hurt me.,TXT_RANDOM_PEASANT_01,,,,"Neubližuj mi, prosím.",Du må ikke gøre mig noget.,Bitte tu mir nicht weh.,,Bonvolu ne vundi min.,"No me hagas nada, por favor.",,"Pyydän, älä vahingoita minua.","S'il vous plaît, laissez-moi tranquille.",,Kérlek ne bánts!,"Ti prego, non farmi del male.",私を傷つけないでくれ。,목숨만은 살려줘.,Doe me alsjeblieft geen pijn.,"Vær så snill, ikke skad meg.","Proszę, nie rób mi krzywdy.","Por favor, não me machuque.",,Te rog nu mă răni.,"Пожалуйста, не трогай меня.",,"Snälla, gör mig inte illa.",Lütfen bana zarar verme. +"If you're looking to hurt me, I'm not really worth the effort.",TXT_RANDOM_PEASANT_02,,,,"Jestli mi chceš ublížit, fakt za to nestojím.","Hvis du er ude på at såre mig, er jeg ikke rigtig besværet værd.","Falls du mir was antun willst, ich bin den Aufwand nicht wert.",,"Se vi intencas vundi min, vi vere gajnos nenion.","Si estás tratando de hacerme algo, no valdrá la pena, la verdad.","Si estás tratando de hacerme algo, no va a valer la pena, la verdad.","Jos aikomuksenasi on vahingoittaa minua, en todellakaan ole sen vaivan väärti.","Si vous cherchez à me faire mal, Je n'en mérite pas l'effort.",,"Ha bántani akarsz, nem éri meg a fáradozást.","Se hai intenzione di farmi del male, ti assicuro che non ne valgo la pena.","もしお前が私に暴力を振るいたいなら間違いだ、 私を殴る価値はないから。","날 괴롭히려고 여기까지 왔다면, 넌 헛수고를 한 거야.","Als je me pijn wilt doen, ben ik de moeite niet echt waard.","Hvis du er ute etter å skade meg, er jeg ikke verdt det.","Jeśli chcesz mnie skrzywdzić, nie jestem wart wysiłku.","Se pretende me machucar, te digo que não valerá a pena.",,"Dacă vrei să mă rănești, nu merit efortul.","Если ты хочешь ударить меня, то я не стою твоих усилий.",,Om du är ute efter att skada mig är jag inte värd besväret.,"Eğer beni incitmek istiyorsan, bu çabaya değmem." -I don't know anything.,TXT_RANDOM_PEASANT_03,,,,O ničem nevím.,Jeg ved ikke noget.,Ich weiß nichts.,,Mi scias nenion.,No sé nada.,,En tiedä mitään.,Je ne sais rien.,Én semmit sem tudok.,Non so niente.,私は何も知らないんだ。,난 정말 아무것도 몰라.,Ik weet niets.,Jeg vet ingenting.,Nic nie wiem.,Eu não sei de nada.,,Nu știu nimic.,Я ничего не знаю.,,Jag vet ingenting.,Ben bir şey bilmiyorum. -Go away or I'll call the guards!,TXT_RANDOM_PEASANT_04,,,,"Jdi pryč, nebo zavolám stráže!","Gå væk, eller jeg tilkalder vagterne!",Hau ab oder ich rufe die Wachen!,,Foriĝu aŭ mi vokos la gardistojn!,¡Vete o llamo a los guardias!,,"Mene pois, tai kutsun vartijat!",Allez vous en ou j'appelle les gardes!,"Tűnj innen, vagy hívom az őröket!",Vattene o chiamo le guardie!,離れろ、さもなくば衛兵を呼ぶぞ!,경비병 부르기 전에 얼른 사라져!,Ga weg of ik roep de bewakers!,"Gå vekk, ellers tilkaller jeg vaktene!",Odejdź albo zawołam strażników!,Vá embora antes que eu chame os guardas!,,Pleacă sau voi chema gardienii!,"Уходи, или я позову стражу!",,Gå härifrån eller så kallar jag på vakterna!,Git buradan yoksa muhafızları çağırırım! -I wish sometimes that all these rebels would just learn their place and stop this nonsense.,TXT_RANDOM_PEASANT_05,,,,"Občas si přeju, aby si ti rebelové uvědomili, kde jsou, a skončili s těmi svými nesmysly.","Nogle gange ville jeg ønske, at alle disse oprørere bare ville lære deres plads og stoppe dette nonsens.","Manchmal wünsche ich mir, dass diese Rebellen ihren Unsinn stoppen würden.",,"Mi iufoje deziras, ke ĉiu ribelanto simple lernu vivi kaj haltigu sian absurdon.",A veces deseo que todos los rebeldes simplemente aprendan a vivir y que paren con sus estupideces.,,Kunpa joskus kaikki nämä kapinalliset vain oppisivat paikkansa ja lopettaisivat tämän mielettömyyden.,"Je voudrais qu'a un moment, ces rebelles apprennent quelle est leur place et arrètent cette idiotie.","Néha azt kívánom, hogy ezek a lázadók bár megtanulnák, hol a helyük, és felhagynának ezzel az eszeveszett dologgal.",A volte vorrei solo che i ribelli imparassero a stare al loro posto e la smettessero con tutte queste follie.,"反乱軍がこんな出鱈目な状態をひっくり返すのを +I don't know anything.,TXT_RANDOM_PEASANT_03,,,,O ničem nevím.,Jeg ved ikke noget.,Ich weiß nichts.,,Mi scias nenion.,No sé nada.,,En tiedä mitään.,Je ne sais rien.,,Én semmit sem tudok.,Non so niente.,私は何も知らないんだ。,난 정말 아무것도 몰라.,Ik weet niets.,Jeg vet ingenting.,Nic nie wiem.,Eu não sei de nada.,,Nu știu nimic.,Я ничего не знаю.,,Jag vet ingenting.,Ben bir şey bilmiyorum. +Go away or I'll call the guards!,TXT_RANDOM_PEASANT_04,,,,"Jdi pryč, nebo zavolám stráže!","Gå væk, eller jeg tilkalder vagterne!",Hau ab oder ich rufe die Wachen!,,Foriĝu aŭ mi vokos la gardistojn!,¡Vete o llamo a los guardias!,,"Mene pois, tai kutsun vartijat!",Allez vous en ou j'appelle les gardes!,,"Tűnj innen, vagy hívom az őröket!",Vattene o chiamo le guardie!,離れろ、さもなくば衛兵を呼ぶぞ!,경비병 부르기 전에 얼른 사라져!,Ga weg of ik roep de bewakers!,"Gå vekk, ellers tilkaller jeg vaktene!",Odejdź albo zawołam strażników!,Vá embora antes que eu chame os guardas!,,Pleacă sau voi chema gardienii!,"Уходи, или я позову стражу!",,Gå härifrån eller så kallar jag på vakterna!,Git buradan yoksa muhafızları çağırırım! +I wish sometimes that all these rebels would just learn their place and stop this nonsense.,TXT_RANDOM_PEASANT_05,,,,"Občas si přeju, aby si ti rebelové uvědomili, kde jsou, a skončili s těmi svými nesmysly.","Nogle gange ville jeg ønske, at alle disse oprørere bare ville lære deres plads og stoppe dette nonsens.","Manchmal wünsche ich mir, dass diese Rebellen ihren Unsinn stoppen würden.",,"Mi iufoje deziras, ke ĉiu ribelanto simple lernu vivi kaj haltigu sian absurdon.",A veces deseo que todos los rebeldes simplemente aprendan a vivir y que paren con sus estupideces.,,Kunpa joskus kaikki nämä kapinalliset vain oppisivat paikkansa ja lopettaisivat tämän mielettömyyden.,"Je voudrais qu'a un moment, ces rebelles apprennent quelle est leur place et arrètent cette idiotie.",,"Néha azt kívánom, hogy ezek a lázadók bár megtanulnák, hol a helyük, és felhagynának ezzel az eszeveszett dologgal.",A volte vorrei solo che i ribelli imparassero a stare al loro posto e la smettessero con tutte queste follie.,"反乱軍がこんな出鱈目な状態をひっくり返すのを 切に願うよ。",저 저항군들이 가망이 없다는 걸 빨리 눈치챘으면 정말 좋겠군.,Ik wou soms dat al die rebellen gewoon hun plaats zouden leren kennen en deze onzin zouden stoppen.,Noen ganger skulle jeg ønske at alle disse opprørerne kunne lære seg sin plass og slutte med dette tullet.,"Chciałbym czasem, żeby ci wszyscy buntownicy nauczyli się, gdzie ich miejsce i skończyli z tymi bzdurami.",Às vezes eu queria que esses rebeldes cuidassem de suas próprias vidas e parassem com esse absurdo.,,Uneori îmi doresc ca rebelii ăștia să își vadă de treaba lor și să înceteze cu tâmpeniile.,"Иногда мне хочется, чтобы все эти повстанцы просто поняли своё место и прекратили эту пустую возню.",,Jag önskar ibland att alla dessa rebeller bara skulle lära sig sin plats och sluta med detta nonsens.,Bazen tüm bu isyancıların hadlerini bilmelerini ve bu saçmalığa bir son vermelerini diliyorum. -"Just leave me alone, OK?",TXT_RANDOM_PEASANT_06,,,,"Prostě mě nech být, jasný?","Bare lad mig være i fred, okay?","Lass mich bitte in Ruhe, ok?",,"Lasu min sola, ĉu?","Déjame en paz, ¿vale?","Déjame en paz, ¿sí?","Jätä minut vain rauhaan, onko selvä?","Laissez moi seul, OK?","Csak hagyj magamra, jó?","Lasciami in pace e basta, OK?",私に構わないでくれよ、頼むぞ?,그냥 날 내버려 둬. 부탁이야.,"Laat me gewoon met rust, oké?","Bare la meg være i fred, OK?","Zostaw mnie w spokoju, dobrze?","Apenas me deixe em paz, ok?",,"Doar lasă-mă în pace, OK?","Просто оставь меня в покое, хорошо?",,"Lämna mig bara ifred, okej?","Beni yalnız bırak, tamam mı?" -"I'm not sure, but sometimes I think that I know some of the acolytes.",TXT_RANDOM_PEASANT_07,,,,"Nejsem si jistý, ale občas se mi zdá, že znám některé z akolytů.","Jeg er ikke sikker, men nogle gange tror jeg, at jeg kender nogle af akolytterne.","Ich bin nicht ganz sicher, aber manchmal kommt es mir vor, als kenne ich diese Ministranten.",,"Mi ne estas certa, sed mi iufoje sentas, ke mi konas iujn el la akolitoj.","No estoy seguro, pero a veces siento que ya conozco a algunos de los acólitos.",,"En ole varma, mutta toisinaan jotkut akoluutit vaikuttavat tutuilta.","Je ne suis pas sûr, mais quelque fois je pense reconnaître certains des acolytes.","Nem vagyok benne bizonyos, de néha mintha ismerném némelyik ministránst.","Non ne sono sicuro, ma volte mi sembra di conoscere alcuni degli accoliti.","何か、アコライトの中で見覚えのある顔したのが +"Just leave me alone, OK?",TXT_RANDOM_PEASANT_06,,,,"Prostě mě nech být, jasný?","Bare lad mig være i fred, okay?","Lass mich bitte in Ruhe, ok?",,"Lasu min sola, ĉu?","Déjame en paz, ¿vale?","Déjame en paz, ¿sí?","Jätä minut vain rauhaan, onko selvä?","Laissez moi seul, OK?",,"Csak hagyj magamra, jó?","Lasciami in pace e basta, OK?",私に構わないでくれよ、頼むぞ?,그냥 날 내버려 둬. 부탁이야.,"Laat me gewoon met rust, oké?","Bare la meg være i fred, OK?","Zostaw mnie w spokoju, dobrze?","Apenas me deixe em paz, ok?",,"Doar lasă-mă în pace, OK?","Просто оставь меня в покое, хорошо?",,"Lämna mig bara ifred, okej?","Beni yalnız bırak, tamam mı?" +"I'm not sure, but sometimes I think that I know some of the acolytes.",TXT_RANDOM_PEASANT_07,,,,"Nejsem si jistý, ale občas se mi zdá, že znám některé z akolytů.","Jeg er ikke sikker, men nogle gange tror jeg, at jeg kender nogle af akolytterne.","Ich bin nicht ganz sicher, aber manchmal kommt es mir vor, als kenne ich diese Ministranten.",,"Mi ne estas certa, sed mi iufoje sentas, ke mi konas iujn el la akolitoj.","No estoy seguro, pero a veces siento que ya conozco a algunos de los acólitos.",,"En ole varma, mutta toisinaan jotkut akoluutit vaikuttavat tutuilta.","Je ne suis pas sûr, mais quelque fois je pense reconnaître certains des acolytes.",,"Nem vagyok benne bizonyos, de néha mintha ismerném némelyik ministránst.","Non ne sono sicuro, ma volte mi sembra di conoscere alcuni degli accoliti.","何か、アコライトの中で見覚えのある顔したのが いたんだが。","자세히는 모르지만, 내가 본 아콜라이트들 중에 아는 사람이 있는 것 같아.","Ik weet het niet zeker, maar soms denk ik dat ik sommige van de acolieten ken.","Jeg er ikke sikker, men noen ganger tror jeg at jeg kjenner noen av akolyttene.","Nie jestem pewien, ale czasem wydaje mi się, że znam niektórych akolitów.","Eu não tenho bem certeza, mas acho que conheco alguns dos acólitos.",,"Nu sunt sigur, dar uneori am impresia că cunosc pe unii acoliți.","Я не уверен, но порой мне кажется, что я узнаю некоторых служителей.",,"Jag är inte säker, men ibland tror jag att jag känner några av akoliterna.",Emin değilim ama bazen bazı yardımcıları tanıdığımı düşünüyorum. -The Order's got everything around here pretty well locked up tight.,TXT_RANDOM_PEASANT_08,,,,Řád to tu má všechno pod hodně přísným dohledem.,Ordenen har alting her omkring temmelig godt låst godt inde.,Der Orden hat hier alles ziemlich gut unter Kontrolle.,,La Ordeno havas ĉion tie ĉi sufiĉe bone blokita.,La Orden tiene todo por aquí fuertemente bloqueado.,,Veljeskunnalla on täällä aika lailla kaikki tiukassa otteessaan.,L'ordre maintient la sûreté aux alentours.,A Rend mindent jól elzárt előlünk.,L'Ordine si è dato parecchio da fare per chiudere e sbarrare un po' tutto qui in giro.,オーダー達はここいらを厳しく取り締まってる。,오더가 치안유지도 그렇고 단속을 아주 실감 나게 잘하던데?,De Orde heeft alles hier in de buurt vrij goed afgesloten.,Ordenen har alt her ganske godt låst.,Zakon ma tu wszystko pod ścisłą kontrolą.,A Ordem mantém tudo trancado a sete chaves.,,Ordinul a încuiat cam tot ce se poate pe aici.,Орден держит тут всё под замком.,,Ordern har allting här omkring ganska väl låst in ordentligt.,Tarikat buradaki her şeyi oldukça iyi kilitlemiş. -There's no way that this is just a security force.,TXT_RANDOM_PEASANT_09,,,,"Není možné, aby tohle byly jen bezpečnostní složky.","Det er umuligt, at det bare er en sikkerhedsstyrke.",Das sind niemals nur Sicherheitskräfte.,,"Ne estas maniero, ke ĉi tio estas nur «sekureca forto».",No hay manera de que esto sea solo una fuerza de seguridad.,,Ei tämä mitenkään voi olla pelkkä turvallisuusjoukko.,Ca ne peut pas être juste une escouade de sécurité...,Na ez már tutira nem lehet csak a biztonsági szolgálat.,"E' impossibile che questa sia solo una ""forza di sicurezza"".",お前がただの警備兵なんてことはなさそうだな。,저 녀석들은 단순히 치안을 유지하기 위해 온 게 아니라고 생각해.,Er is geen sprake van dat dit gewoon een veiligheidsdienst is.,Det er ikke mulig at dette bare er en sikkerhetsstyrke.,"Nie ma mowy, żeby to była tylko ochrona.",Não tem como isso ser apenas um força de segurança.,,Sub nicio formă nu e asta doar o forță de securitate.,Без разрешения стражей порядка и шагу ступить нельзя.,,Det är inte möjligt att det här bara är en säkerhetsstyrka.,Bunun sadece bir güvenlik gücü olmasına imkan yok. -I've heard that the Order is really nervous about the Front's actions around here.,TXT_RANDOM_PEASANT_10,,,,"Slyšel jsem, že je Řád prý dost nervózní z toho, co tu Fronta dělá.","Jeg har hørt, at Ordenen er meget nervøs over Frontens handlinger her.","Ich habe gehört, dass der Orden sehr beunruhigt über die Aktionen der Front ist.",,"Mi aŭdis, ke La Ordeno estas tre nervoza pro la agoj de la ĉirkaŭa Fronto.",He oído que La Orden está realmente nerviosa por las acciones del Frente en los alrededores.,,Veljeskunta on kuulemma tosi huolissaan Rintaman toimista täällä.,J'ai entendu dire que l'ordre était sur les nerfs à cause des actions du front.,Úgy hírlik A Rend nagyon ideges a Front munkálkodásai miatt mostanság.,Ho sentito che l'Ordine è parecchio nervoso riguardo le azioni del Fronte nei dintorni.,"私はオーダーがこの辺での反乱軍の行動を +The Order's got everything around here pretty well locked up tight.,TXT_RANDOM_PEASANT_08,,,,Řád to tu má všechno pod hodně přísným dohledem.,Ordenen har alting her omkring temmelig godt låst godt inde.,Der Orden hat hier alles ziemlich gut unter Kontrolle.,,La Ordeno havas ĉion tie ĉi sufiĉe bone blokita.,La Orden tiene todo por aquí fuertemente bloqueado.,,Veljeskunnalla on täällä aika lailla kaikki tiukassa otteessaan.,L'ordre maintient la sûreté aux alentours.,,A Rend mindent jól elzárt előlünk.,L'Ordine si è dato parecchio da fare per chiudere e sbarrare un po' tutto qui in giro.,オーダー達はここいらを厳しく取り締まってる。,오더가 치안유지도 그렇고 단속을 아주 실감 나게 잘하던데?,De Orde heeft alles hier in de buurt vrij goed afgesloten.,Ordenen har alt her ganske godt låst.,Zakon ma tu wszystko pod ścisłą kontrolą.,A Ordem mantém tudo trancado a sete chaves.,,Ordinul a încuiat cam tot ce se poate pe aici.,Орден держит тут всё под замком.,,Ordern har allting här omkring ganska väl låst in ordentligt.,Tarikat buradaki her şeyi oldukça iyi kilitlemiş. +There's no way that this is just a security force.,TXT_RANDOM_PEASANT_09,,,,"Není možné, aby tohle byly jen bezpečnostní složky.","Det er umuligt, at det bare er en sikkerhedsstyrke.",Das sind niemals nur Sicherheitskräfte.,,"Ne estas maniero, ke ĉi tio estas nur «sekureca forto».",No hay manera de que esto sea solo una fuerza de seguridad.,,Ei tämä mitenkään voi olla pelkkä turvallisuusjoukko.,Ca ne peut pas être juste une escouade de sécurité...,,Na ez már tutira nem lehet csak a biztonsági szolgálat.,"E' impossibile che questa sia solo una ""forza di sicurezza"".",お前がただの警備兵なんてことはなさそうだな。,저 녀석들은 단순히 치안을 유지하기 위해 온 게 아니라고 생각해.,Er is geen sprake van dat dit gewoon een veiligheidsdienst is.,Det er ikke mulig at dette bare er en sikkerhetsstyrke.,"Nie ma mowy, żeby to była tylko ochrona.",Não tem como isso ser apenas um força de segurança.,,Sub nicio formă nu e asta doar o forță de securitate.,Без разрешения стражей порядка и шагу ступить нельзя.,,Det är inte möjligt att det här bara är en säkerhetsstyrka.,Bunun sadece bir güvenlik gücü olmasına imkan yok. +I've heard that the Order is really nervous about the Front's actions around here.,TXT_RANDOM_PEASANT_10,,,,"Slyšel jsem, že je Řád prý dost nervózní z toho, co tu Fronta dělá.","Jeg har hørt, at Ordenen er meget nervøs over Frontens handlinger her.","Ich habe gehört, dass der Orden sehr beunruhigt über die Aktionen der Front ist.",,"Mi aŭdis, ke La Ordeno estas tre nervoza pro la agoj de la ĉirkaŭa Fronto.",He oído que La Orden está realmente nerviosa por las acciones del Frente en los alrededores.,,Veljeskunta on kuulemma tosi huolissaan Rintaman toimista täällä.,J'ai entendu dire que l'ordre était sur les nerfs à cause des actions du front.,,Úgy hírlik A Rend nagyon ideges a Front munkálkodásai miatt mostanság.,Ho sentito che l'Ordine è parecchio nervoso riguardo le azioni del Fronte nei dintorni.,"私はオーダーがこの辺での反乱軍の行動を 本当に厄介がってると聞いたぞ。",오더가 프론트 저항군의 공작에 정말 불안해하고 있더라고.,Ik heb gehoord dat de Orde echt nerveus is over de acties van het Front hier in de buurt.,Jeg har hørt at Ordenen er veldig nervøs for Frontens handlinger her.,"Słyszałem, że Zakon jest bardzo zdenerwowany działaniami Frontu w tym miejscu.",Ouvi falar que a Ordem anda bem nervosa por causa das ações da Frente por aqui.,,Am auzit că Ordinul e destul de stresat dorită acțiunilor Frontului pe-aici.,"Я слыхал, что Орден серьёзно обеспокоен действиями повстанцев в этом районе.",,Jag har hört att Orden är riktigt nervös över Fronts agerande här.,Tarikat'ın Cephe'nin buradaki eylemleri konusunda gerçekten gergin olduğunu duydum. -There's no way the Order will stand against us.,TXT_RANDOM_REBEL_01,,,,Řád se nám v žádném případě nemůže postavit.,Ordenen vil på ingen måde stå imod os.,Niemals wird sich der Orden gegen uns stellen!,,La Ordeno neniel povos rezisti al ni.,No hay forma de que La Orden aguante contra nosotros.,,Veljeskunta ei voi millään kestää meitä vastaan.,L'ordre n'a aucune chance contre nous.,A Rend labdába sem rúghat ellenünk!,Non è possibile che l'Ordine possa mettersi contro di noi.,オーダーが私達に立ち向かえるはずはない。,오더 녀석들이 우리를 이길 가능성은 전혀 없어.,De Orde zal op geen enkele manier tegen ons ingaan.,Det er ingen sjanse for at Ordenen vil gå imot oss.,"Nie ma mowy, by Zakon stanął przeciwko nam.",Nao ha como a Ordem ficar contra a gente.,,Nicio șansă ca Ordinul să ni se opună.,Ордену никак не устоять против нас.,,Det finns inte en chans att Orden kommer att stå emot oss.,Düzen'in bize karşı durmasına imkan yok. -We're almost ready to strike. Macil's plans are falling in place.,TXT_RANDOM_REBEL_02,,,,Jsme téměř připraveni zaútočit. Macilovy plány do sebe začínají zapadat.,Vi er næsten klar til at slå til. Macils planer er ved at falde på plads.,Wir sind zum großen Schlag bereit. Macils Plane werden bald umgesetzt.,,Ni estas preskaŭ pretaj ekataki. La planoj de Macil sukcesas perfekte.,Estamos casi listos para atacar. Los planes de Macil están saliendo a la perfección.,,Olemme melkein valmiit hyökkäämään. Macilin suunnitelmat loksahtavat paikalleen.,Nous sommes presque prêts à agir. Les plans de Macil se déroulent comme prévu.,"Már majdnem készen állunk, hogy lecsapjunk. Macil tervei kezdenek bejönni.",Siamo quasi pronti a colpire. I piani di Macil stanno andando lisci come l'olio.,"攻撃の準備は殆ど整った。 +There's no way the Order will stand against us.,TXT_RANDOM_REBEL_01,,,,Řád se nám v žádném případě nemůže postavit.,Ordenen vil på ingen måde stå imod os.,Niemals wird sich der Orden gegen uns stellen!,,La Ordeno neniel povos rezisti al ni.,No hay forma de que La Orden aguante contra nosotros.,,Veljeskunta ei voi millään kestää meitä vastaan.,L'ordre n'a aucune chance contre nous.,,A Rend labdába sem rúghat ellenünk!,Non è possibile che l'Ordine possa mettersi contro di noi.,オーダーが私達に立ち向かえるはずはない。,오더 녀석들이 우리를 이길 가능성은 전혀 없어.,De Orde zal op geen enkele manier tegen ons ingaan.,Det er ingen sjanse for at Ordenen vil gå imot oss.,"Nie ma mowy, by Zakon stanął przeciwko nam.",Nao ha como a Ordem ficar contra a gente.,,Nicio șansă ca Ordinul să ni se opună.,Ордену никак не устоять против нас.,,Det finns inte en chans att Orden kommer att stå emot oss.,Düzen'in bize karşı durmasına imkan yok. +We're almost ready to strike. Macil's plans are falling in place.,TXT_RANDOM_REBEL_02,,,,Jsme téměř připraveni zaútočit. Macilovy plány do sebe začínají zapadat.,Vi er næsten klar til at slå til. Macils planer er ved at falde på plads.,Wir sind zum großen Schlag bereit. Macils Plane werden bald umgesetzt.,,Ni estas preskaŭ pretaj ekataki. La planoj de Macil sukcesas perfekte.,Estamos casi listos para atacar. Los planes de Macil están saliendo a la perfección.,,Olemme melkein valmiit hyökkäämään. Macilin suunnitelmat loksahtavat paikalleen.,Nous sommes presque prêts à agir. Les plans de Macil se déroulent comme prévu.,,"Már majdnem készen állunk, hogy lecsapjunk. Macil tervei kezdenek bejönni.",Siamo quasi pronti a colpire. I piani di Macil stanno andando lisci come l'olio.,"攻撃の準備は殆ど整った。 マシルの計画は所定の位置に下す。",반격할 준비가 거의 다 돼가고 있어. 마실 사령관님의 계획이 잘 진행되고 있으니까.,We zijn bijna klaar om toe te slaan. Macil's plannen vallen op zijn plaats.,Vi er nesten klare til å slå til. Macils planer faller på plass.,Jesteśmy prawie gotowi do uderzenia. Plany Macila są coraz lepsze.,Estamos quase prontos para o ataque. Os planos de Macil estão fazendo efeito.,,Suntem aproape gata să dăm lovitura. Planurile lui Macil încep să se lege.,Мы почти готовы атаковать. Планы Мэйсила становятся ясны.,,Vi är nästan redo att slå till. Macils planer faller på plats.,Saldırmaya neredeyse hazırız. Macil'in planları yerine oturuyor. -"We're all behind you, don't worry.",TXT_RANDOM_REBEL_03,,,,"Všichni stojíme za tebou, neboj.","Vi står alle bag dig, bare rolig.","Wir stehen zu dir, keine Sorge.",,"Ni gardos vin dorse, vi do estu trankvila.","Nosotros te cubrimos la espalda, así que tranquilo.",,"Olemme kaikki tukenasi, älä huoli.","On couvre tes arrières, t'inquiète pas.","Mind itt vagyunk mögötted, ne aggódj!","Non preoccuparti, noi tutti ti copriamo le spalle.",後ろは見ているぞ、気にするな。,걱정 마. 무슨 일이 있어도 우리가 지켜줄게!,"We staan allemaal achter je, maak je geen zorgen.","Vi står bak deg, ikke vær redd.","Wszyscy jesteśmy za tobą, nie martw się.","Estamos todos te protegendo, não se preocupe.",,"Suntem toți în spatele tău, nu te teme.",Не беспокойся. Мы сразу за тобой.,,"Vi står alla bakom dig, oroa dig inte.","Hepimiz arkandayız, merak etme." -Don't get too close to any of those big robots. They'll melt you down for scrap!,TXT_RANDOM_REBEL_04,,,,Nepřibližuj se k těm velkým robotům. Usmaží tě na kaši!,Kom ikke for tæt på nogen af de store robotter. De vil smelte dig ned til skrot!,Komm diesen großen Robotern nicht zu nahe. Die schmelzen dich zu Schrott ein.,,Ne proksimiĝu tiel multe al tiuj robotegoj. Ili povus disigi vin je rubo!,No te acerques tanto a uno de esos robots grandes. ¡Podrían convertirte en chatarra!,,Älä mene liian lähelle mitään noista isoista roboteista. Ne sulattavat sinut kuonaksi.,Ne vous approchez pas trop des gros robots. Ils vous brûleront jusqu'à l'os!,Azokhoz a nagy robotokhoz ne nagyon menj közel. Felaprítanak tüzifának!,Non avvicinarti troppo a uno di quei grossi robot. Ti ridurrebbero in rottami!,"デカブツには近づくなよ。スクラップみたいに +"We're all behind you, don't worry.",TXT_RANDOM_REBEL_03,,,,"Všichni stojíme za tebou, neboj.","Vi står alle bag dig, bare rolig.","Wir stehen zu dir, keine Sorge.",,"Ni gardos vin dorse, vi do estu trankvila.","Nosotros te cubrimos la espalda, así que tranquilo.",,"Olemme kaikki tukenasi, älä huoli.","On couvre tes arrières, t'inquiète pas.",,"Mind itt vagyunk mögötted, ne aggódj!","Non preoccuparti, noi tutti ti copriamo le spalle.",後ろは見ているぞ、気にするな。,걱정 마. 무슨 일이 있어도 우리가 지켜줄게!,"We staan allemaal achter je, maak je geen zorgen.","Vi står bak deg, ikke vær redd.","Wszyscy jesteśmy za tobą, nie martw się.","Estamos todos te protegendo, não se preocupe.",,"Suntem toți în spatele tău, nu te teme.",Не беспокойся. Мы сразу за тобой.,,"Vi står alla bakom dig, oroa dig inte.","Hepimiz arkandayız, merak etme." +Don't get too close to any of those big robots. They'll melt you down for scrap!,TXT_RANDOM_REBEL_04,,,,Nepřibližuj se k těm velkým robotům. Usmaží tě na kaši!,Kom ikke for tæt på nogen af de store robotter. De vil smelte dig ned til skrot!,Komm diesen großen Robotern nicht zu nahe. Die schmelzen dich zu Schrott ein.,,Ne proksimiĝu tiel multe al tiuj robotegoj. Ili povus disigi vin je rubo!,No te acerques tanto a uno de esos robots grandes. ¡Podrían convertirte en chatarra!,,Älä mene liian lähelle mitään noista isoista roboteista. Ne sulattavat sinut kuonaksi.,Ne vous approchez pas trop des gros robots. Ils vous brûleront jusqu'à l'os!,,Azokhoz a nagy robotokhoz ne nagyon menj közel. Felaprítanak tüzifának!,Non avvicinarti troppo a uno di quei grossi robot. Ti ridurrebbero in rottami!,"デカブツには近づくなよ。スクラップみたいに 踏みつぶされるぞ!",저 커다란 로봇들에게 다가갈 생각은 하지 마. 너를 완전 발끝까지 녹여버릴 거라고.,Kom niet te dicht bij een van die grote robots. Ze zullen je laten smelten voor de schroothoop!,Ikke kom for nær noen av de store robotene. De smelter deg om til skrap!,Nie zbliżaj się zbytnio do tych wielkich robotów. Przetopią cię na złom!,Nem pense em ficar perto daqueles robôs. Vão te transformar em ferro velho num instante!,,Nu te apropia de roboți. Te vor topii!,Держись подальше от этих больших роботов. Они и мокрого места от тебя не оставят!,,Kom inte för nära någon av de stora robotarna. De kommer att smälta ner dig till skrot!,O büyük robotlara fazla yaklaşma. Sizi hurda için eritirler! -"The day of our glory will soon come, and those who oppose us will be crushed!",TXT_RANDOM_REBEL_05,,,,"Naše dny slávy brzy nadejdou a ti, kdo se nám postaví, budou rozdrceni!","Vores storhedsdag vil snart komme, og de, der modsætter sig os, vil blive knust!","Der Tag des Triumphes ist nahe, und die, die gegen uns sind, werden vernichtet.",,Nia glora tago baldaŭ alvenos kaj niaj kontraŭstarantoj estos detruitaj!,¡El día de nuestra gloria llegará pronto y aquellos que se opusieron a nosotros serán destruidos!,¡El día de nuestra gloria va a llegar pronto y aquellos que se opusieron a nosotros van a ser destruidos!,"Kunnian päivämme häämöttää, ja kaikki meitä vastustavat vihittäkööt tuhon omiksi!","Le jour de gloire arrivera bientôt, et ceux qui s'opposeront a nous seront écrasés!","Dicsőségünk napja hamarosan eljön, és akik ellenünk szegülnek, elkárhoznak.","Il giorno della nostra gloria verrà presto, e quelli che si oppongono a noi verranno schiacciati!","栄光の日は我々に訪れる、 +"The day of our glory will soon come, and those who oppose us will be crushed!",TXT_RANDOM_REBEL_05,,,,"Naše dny slávy brzy nadejdou a ti, kdo se nám postaví, budou rozdrceni!","Vores storhedsdag vil snart komme, og de, der modsætter sig os, vil blive knust!","Der Tag des Triumphes ist nahe, und die, die gegen uns sind, werden vernichtet.",,Nia glora tago baldaŭ alvenos kaj niaj kontraŭstarantoj estos detruitaj!,¡El día de nuestra gloria llegará pronto y aquellos que se opusieron a nosotros serán destruidos!,¡El día de nuestra gloria va a llegar pronto y aquellos que se opusieron a nosotros van a ser destruidos!,"Kunnian päivämme häämöttää, ja kaikki meitä vastustavat vihittäkööt tuhon omiksi!","Le jour de gloire arrivera bientôt, et ceux qui s'opposeront a nous seront écrasés!",,"Dicsőségünk napja hamarosan eljön, és akik ellenünk szegülnek, elkárhoznak.","Il giorno della nostra gloria verrà presto, e quelli che si oppongono a noi verranno schiacciati!","栄光の日は我々に訪れる、 そして反逆する者達は潰す!",영광스러운 새벽이 오고있어. 우리를 탄압한 녀석들에게 징벌을 내릴 새벽이!,"De dag van onze glorie zal snel komen, en degenen die zich tegen ons verzetten zullen worden verpletterd!","Dagen for vår herlighet vil snart komme, og de som motsetter seg oss vil bli knust!","Dzień naszej chwały wkrótce nadejdzie, a ci, którzy się nam sprzeciwią, zostaną zmiażdżeni!","O dia de nossa glória chegará, e aqueles que se opuserem contra nós serão destruídos!",,Ziua în care noi vom avea gloria va veni curând și toti vor fi striviți.,Близок день нашего триумфа. Скоро наши враги будут уничтожены!,,"Vår härlighets dag kommer snart, och de som motsätter sig oss kommer att krossas!",Zafer günümüz yakında gelecek ve bize karşı çıkanlar ezilecek! -Don't get too comfortable. We've still got our work cut out for us.,TXT_RANDOM_REBEL_06,,,,"Neusínej na vavřínech, stále máme před sebou hodně práce.",Lad være med at sætte dig for godt til rette. Vi har stadig vores arbejde foran os.,"Werd nicht leichtsinnig, es gibt noch eine Menge zu tun.",,"Ne agu tre pigre, ni ankoraŭ havas multe da laboro.","No te pongas muy cómodo, que aún queda un montón por hacer.",,Ei parane levätä laakereillaan; meillä on vielä paljon työsarkaa edessämme.,Ne vous reposez pas sur vos lauriers. Du travail nous attend encore.,Annyira azért ne érezd otthon magad. Nekünk még van némi munka kiosztva idelenn.,Non prendertela troppo comoda. Abbiamo ancora un sacco di lavoro da fare.,"あまり気楽でいるな。 +Don't get too comfortable. We've still got our work cut out for us.,TXT_RANDOM_REBEL_06,,,,"Neusínej na vavřínech, stále máme před sebou hodně práce.",Lad være med at sætte dig for godt til rette. Vi har stadig vores arbejde foran os.,"Werd nicht leichtsinnig, es gibt noch eine Menge zu tun.",,"Ne agu tre pigre, ni ankoraŭ havas multe da laboro.","No te pongas muy cómodo, que aún queda un montón por hacer.",,Ei parane levätä laakereillaan; meillä on vielä paljon työsarkaa edessämme.,Ne vous reposez pas sur vos lauriers. Du travail nous attend encore.,,Annyira azért ne érezd otthon magad. Nekünk még van némi munka kiosztva idelenn.,Non prendertela troppo comoda. Abbiamo ancora un sacco di lavoro da fare.,"あまり気楽でいるな。 我々にはまだやるべき事があるんだ。",게으름 피울 생각하지는 마. 아직 일이 잘 안 풀렸으니까.,Maak het je niet al te comfortabel. We hebben nog steeds werk voor de boeg.,Ikke bli for komfortabel. Vi har fortsatt en jobb å gjøre.,Nie czuj się zbyt komfortowo. Wciąż mamy przed sobą zadanie do wykonania.,Não fique muito confortável. Ainda temos trabalho a fazer.,,Nu te fă prea comfortabil. Încă mai avem treabă de făcut.,Не расслабляйся. У нас по-прежнему хватает дел.,,Gör det inte för bekvämt. Vi har fortfarande vårt arbete framför oss.,Fazla rahatlamayın. İşimiz hala bizim için biçilmiş kaftan. -Macil says that you're the new hope. Bear that in mind.,TXT_RANDOM_REBEL_07,,,,"Macil říká, že jsi naše nová naděje. Pamatuj na to.","Macil siger, at du er det nye håb. Husk det.",Macil nennt dich unsere neue Hoffnung. Vergiss das nicht.,,"Macil diras, ke vi estas la nova espero. Memoru tion.",Macil dice que eres la nueva esperanza. Ten eso en mente.,,Macil sanoo sinun olevan uusi toivomme. Pidä se mielessäsi.,Macil nous dit que tu es notre nouvel espoir. Garde ça à l'esprit.,Macil szerint te vagy az új reményünk. Ezt sose feledd!,Macil dice che tu sei la nuova speranza. Tienilo a mente.,"マシルは貴方が新しい希望だと言っている。 +Macil says that you're the new hope. Bear that in mind.,TXT_RANDOM_REBEL_07,,,,"Macil říká, že jsi naše nová naděje. Pamatuj na to.","Macil siger, at du er det nye håb. Husk det.",Macil nennt dich unsere neue Hoffnung. Vergiss das nicht.,,"Macil diras, ke vi estas la nova espero. Memoru tion.",Macil dice que eres la nueva esperanza. Ten eso en mente.,,Macil sanoo sinun olevan uusi toivomme. Pidä se mielessäsi.,Macil nous dit que tu es notre nouvel espoir. Garde ça à l'esprit.,,Macil szerint te vagy az új reményünk. Ezt sose feledd!,Macil dice che tu sei la nuova speranza. Tienilo a mente.,"マシルは貴方が新しい希望だと言っている。 心に留めておいてくれ。",마실 사령관님이 말하기를 네가 우리들의 유일한 희망이래. 명심해 둬.,Macil zegt dat jij de nieuwe hoop bent. Houd dat in gedachten.,Macil sier at du er det nye håpet. Husk det.,"Macil mówi, że jesteś nową nadzieją. Pamiętajcie o tym.",Macil disse que você é a nova esperança. Lembre-se disso.,,Macil spune că tu ești speranța. Ține minte asta.,"Мэйсил говорит, что на тебя сейчас вся надежда. Имей это в виду.",,Macil säger att du är det nya hoppet. Tänk på det.,Macil senin yeni umut olduğunu söylüyor. Bunu aklınızdan çıkarmayın. -"Once we've taken these charlatans down, we'll be able to rebuild this world as it should be.",TXT_RANDOM_REBEL_08,,,,"Jakmile sesadíme ty šarlatány, budeme moci znovu vybudovat svět tak, jaký by měl být.","Når vi først har nedlagt disse charlataner, vil vi kunne genopbygge denne verden, som den skal være.","Wenn wir diese Scharlatane entmachtet haben, können wir unsere Welt endlich neu aufbauen.",,"Foriginte tiujn ridindulojn, ni povos ĝuste rekonstrui ĉi tiun mondon.","Una vez eliminados esos charlatanes, podremos reconstruir este mundo como debe ser.","Una vez eliminados esos charlatanes, vamos a poder reconstruir este mundo como debe ser.","Sen jälkeen, kun olemme nujertaneet nämä puoskarit, voimme jälleenrakentaa tämän maailman sellaiseksi kuin pitääkin.","Une fois que nous nous serons débarassés de ces charlatans, nous serons capable de rebâtir le monde tel qu'il devrait être.","Amint lenyomtuk ezeket a sarlatánokat, végre újjáépíthetjük ezt a világot olyanra, amilyennek lennie kéne.","Una volta eliminati questi ciarlatani, potremo ricostruire questo mondo per come dovrebbe essere.","我々が一度こんな酷いハッタリを負かせば、 +"Once we've taken these charlatans down, we'll be able to rebuild this world as it should be.",TXT_RANDOM_REBEL_08,,,,"Jakmile sesadíme ty šarlatány, budeme moci znovu vybudovat svět tak, jaký by měl být.","Når vi først har nedlagt disse charlataner, vil vi kunne genopbygge denne verden, som den skal være.","Wenn wir diese Scharlatane entmachtet haben, können wir unsere Welt endlich neu aufbauen.",,"Foriginte tiujn ridindulojn, ni povos ĝuste rekonstrui ĉi tiun mondon.","Una vez eliminados esos charlatanes, podremos reconstruir este mundo como debe ser.","Una vez eliminados esos charlatanes, vamos a poder reconstruir este mundo como debe ser.","Sen jälkeen, kun olemme nujertaneet nämä puoskarit, voimme jälleenrakentaa tämän maailman sellaiseksi kuin pitääkin.","Une fois que nous nous serons débarassés de ces charlatans, nous serons capable de rebâtir le monde tel qu'il devrait être.",,"Amint lenyomtuk ezeket a sarlatánokat, végre újjáépíthetjük ezt a világot olyanra, amilyennek lennie kéne.","Una volta eliminati questi ciarlatani, potremo ricostruire questo mondo per come dovrebbe essere.","我々が一度こんな酷いハッタリを負かせば、 世界を本来の状態に建て直せるだろう。","저 허풍쟁이들을 다 물리칠 수만 있다면, 우리가 바랬던 평화로운 세상을 재건할 수 있을 거야.","Als we deze charlatans eenmaal hebben verwijderd, kunnen we deze wereld weer opbouwen zoals het hoort.","Når vi har tatt disse sjarlatanene, kan vi gjenoppbygge verden slik den burde være.","Kiedy obalimy tych szarlatanów, będziemy mogli odbudować ten świat tak, jak powinien być.","Assim que derrubarmos esses charlatões, poderemos reconstruir o mundo do jeito certo.",,"Dupa ce îi vom răpune pe șarlatanii ăștia, vom putea reconstrui lumea în ceea ce trebuie să fie.","Когда мы свергнем этих шарлатанов, то сможем воссоздать этот мир таким, каким он должен быть.",,När vi väl har slagit ner dessa charlataner kommer vi att kunna återuppbygga den här världen som den borde vara.,"Bu şarlatanları alaşağı ettikten sonra, bu dünyayı olması gerektiği gibi yeniden inşa edebileceğiz." -"Remember that you aren't fighting just for yourself, but for everyone here and outside.",TXT_RANDOM_REBEL_09,,,,"Nezapomeň, že nebojuješ jen kvůli sobě, ale kvůli všem tady a tam venku.","Husk, at du ikke kun kæmper for dig selv, men for alle her og udenfor.","Vergiß nicht, dass du nicht nur für dich selbst kämpfst, sondern für alle von uns da draußen.",,"Memoru, ke vi ne batalas nur por vi, sed por ĉiuj ĉi-ene kaj ele.","Recuerda que no estás peleando solo por ti, sino por todos aquí y fuera.","Recuerda que no estás peleando solo por ti, sino por todos aquí y afuera.","Muista, ettet taistele vain itsesi, vaan kaikkien täällä olevien sekä ulkopuolisten puolesta.","Souviens-toi, tu ne te bats pas seulement pour toi, mais pour tous le monde ici et ailleurs.","Ne feledd, nem csak magadért harcolsz, hanem mindnyájunkért idebent, és odakint.","Ricordati che non stai combattendo solo per te stesso, ma per tutti quelli che sono qui e fuori.","貴方は自分自身だけでなく、 +"Remember that you aren't fighting just for yourself, but for everyone here and outside.",TXT_RANDOM_REBEL_09,,,,"Nezapomeň, že nebojuješ jen kvůli sobě, ale kvůli všem tady a tam venku.","Husk, at du ikke kun kæmper for dig selv, men for alle her og udenfor.","Vergiß nicht, dass du nicht nur für dich selbst kämpfst, sondern für alle von uns da draußen.",,"Memoru, ke vi ne batalas nur por vi, sed por ĉiuj ĉi-ene kaj ele.","Recuerda que no estás peleando solo por ti, sino por todos aquí y fuera.","Recuerda que no estás peleando solo por ti, sino por todos aquí y afuera.","Muista, ettet taistele vain itsesi, vaan kaikkien täällä olevien sekä ulkopuolisten puolesta.","Souviens-toi, tu ne te bats pas seulement pour toi, mais pour tous le monde ici et ailleurs.",,"Ne feledd, nem csak magadért harcolsz, hanem mindnyájunkért idebent, és odakint.","Ricordati che non stai combattendo solo per te stesso, ma per tutti quelli che sono qui e fuori.","貴方は自分自身だけでなく、 国中の人の為に戦っている事を忘れないでくれよ。",너 혼자 위해서 싸우는 게 아니라 인류를 위해서 싸우고 있다는 걸 잊지 마.,"Onthoud dat je niet alleen voor jezelf vecht, maar voor iedereen hier en daarbuiten.","Husk at du ikke bare kjemper for deg selv, men for alle her og utenfor.","Pamiętaj, że nie walczysz tylko dla siebie, ale dla wszystkich tu i na zewnątrz.","Lembre-se que você não está lutando só por si mesmo, mas por todos nós.",,"Ține minte că nu lupți doar pentru tine, ci pentru toți de aici și de afară.","Помни, ты сражаешься не только за себя, но и за каждого здесь и снаружи.",,"Kom ihåg att du inte bara kämpar för dig själv, utan för alla här och utanför.","Sadece kendiniz için değil, buradaki ve dışarıdaki herkes için savaştığınızı unutmayın." -"As long as one of us still stands, we will win.",TXT_RANDOM_REBEL_10,,,,"Dokud je alespoň jeden z nás na nohou, vyhrajeme!","Så længe en af os stadig står tilbage, vil vi vinde.","Solange nur einer von uns steht, werden wir gewinnen.",,"Dum iu ajn el ni ankoraŭ povos stari, ni venkos.","Mientras uno de nosotros siga en pie, ganaremos.","Mientras uno de nosotros siga en pie, vamos a ganar.","Niin kauan kuin yksikin meistä vielä seisoo, voitto on meidän.","Aussi longtemps qu'un de nous est vivant, nous vaincrons.","Ha csak egy is marad meg közülünk, nyerni fogunk.","Finché uno di noi rimarrà in piedi, vinceremo.",我々が一人でも立っていれば、それが勝利。,"우리 중 한 명이 남아있는 한, 이길 수 있어.","Zolang één van ons nog staat, zullen we winnen.","Så lenge en av oss fortsatt står, vil vi vinne.","Tak długo jak jeden z nas nadal będzie stał, tak długo będziemy wygrywać.","Enquanto um de nós ainda estiver de pé, teremos chance de vencer.",,"Atâta timp cât unul din noi trăiește, vom triumfa.","Пока хотя бы один из нас ещё дышит, мы непобедимы.",,Så länge en av oss fortfarande står kvar kommer vi att vinna.,İçimizden biri ayakta kaldığı sürece kazanacağız. -"Move along, peasant.",TXT_RANDOM_AGUARD_01,,,,"Jdi dál, poddaný.","Gå videre, bonde.","Beweg dich, Bauer!",,"Ne haltu, kampulo.","No te detengas, campesino.",,"Jatka matkaa, maallikko.","Barre-toi, paysan!","Mozgás, paraszt. Egy kettő.","Muoviti, cittadino.",立ち去れ、百姓。,"어서 움직여, 이 자식아.","Ga verder, boer.","Gå videre, bonde.","Ruszaj w drogę, chłopie.","Continue andando, plebeu.",,"Mișcă, sărmanule.","Проходи, рабочий.",,"Gå vidare, bonde.",İlerle köylü. -"Follow the true faith, only then will you begin to understand.",TXT_RANDOM_AGUARD_02,,,,"Následuj pravou víru, jen tak začneš chápat.","Følg den sande tro, først da vil du begynde at forstå.",Folge dem wahren Glauben und du wirst verstehen.,,"Sekvu la veran kredon, nur tiel vi ekkomprenos.","Sigue la fe verdadera, solo entonces empezarás a entender.","Sigue la fe verdadera, solo así vas a entender.",Seuraa totista uskoa; vasta silloin alat käsittää.,"Suis la vraie foi, tu commençeras a comprendre.","Csak ha az igaz hitet követed, csakis akkor kezded majd megérteni.","Segui la vera fede, solo allora comincerai a capire.",真の信仰を求めよ、それしか理解に至る道はない。,참된 신앙이야말로 자기 자신을 깨우칠 수 있지.,"Volg het ware geloof, pas dan zul je het begrijpen.","Følg den sanne troen, først da vil du begynne å forstå.","Podążaj za prawdziwą wiarą, tylko wtedy zaczniesz rozumieć.",Siga a verdadeira fé. Só então você começará a entender.,,"Urmează crezul adevărat, doar atunci vei începe să înțelegi.",Следуй истинной вере. Только тогда ты начнёшь понимать.,,"Följ den sanna tron, först då kommer du att börja förstå.","Gerçek inancı takip et, ancak o zaman anlamaya başlarsın." -Only through death can one be truly reborn.,TXT_RANDOM_AGUARD_03,,,,Pouze skrz smrt lze dosáhnout znovuzrození.,Kun gennem døden kan man virkelig blive genfødt.,Nur durch den Tod kann man wirklich wiedergeboren werden.,,Nur per morto oni povas vere renaskiĝi.,Solo a través de la muerte uno puede realmente renacer.,,Vain kuoleman kautta voi totisesti uudestisyntyä.,C'est seulement a travers la mort que quelqu'un peut renaître.,Csak a halál útján lehet igazán újjászületni.,Solo attraverso la morte uno può rinascere per davvero.,人が真の意味で生まれ変われる方法は、死のみだ,죽음을 통해서만이 진정하게 환생할 수 있는 거다.,Alleen door de dood kan men echt herboren worden.,Bare gjennom døden kan man virkelig bli gjenfødt.,Tylko przez śmierć można się naprawdę odrodzić.,Somente através da morte que alguem poderá renascer de verdade.,,Doar prin moarte poate cineva să fie renăscut cu adevărat.,Истинное перерождение возможно только через смерть.,,Endast genom döden kan man verkligen återfödas.,İnsan ancak ölümle gerçekten yeniden doğabilir. -I'm not interested in your useless drivel.,TXT_RANDOM_AGUARD_04,,,,Nezajímají mě tvoje žvásty.,Jeg er ikke interesseret i dit ubrugelige sludder.,Dein nutzloses Geschwafel interessiert mich nicht.,,Ne interesas min aŭdi viajn sensencaĵojn.,No me interesa tu charlatanería.,No me interesa oír tus estupideces.,Joutava hölynpölysi ei minua kiinnosta.,Je ne suis pas intéressé par tes idioties inutiles.,Nem érdekel az értelmetlen hablatyolásod.,Non sono interessato alle tue ciance inutili.,お前の無益な戯言なぞ興味は無い。,네 잡담 따위는 듣고 싶지 않아.,Ik ben niet geïnteresseerd in je nutteloze gewauwel.,Jeg er ikke interessert i det unyttige vrøvlet ditt.,Nie interesują mnie twoje bezużyteczne brednie.,Não estou interessado em ouvir as suas bobagens inúteis.,,Nu sunt interesat de lipsa ta de sens.,Мне неинтересна твоя пустая болтовня.,,Jag är inte intresserad av ditt värdelösa dravel.,İşe yaramaz saçmalıklarınla ilgilenmiyorum. -If I had wanted to talk to you I would have told you so.,TXT_RANDOM_AGUARD_05,,,,"Kdybych s tebou chtěl mluvit, nařídil bych ti to.","Hvis jeg havde ønsket at tale med dig, ville jeg have sagt det til dig.","Wenn ich mich mit dir unterhalten wollte, hätte ich dir das gesagt.",,"Se mi volus paroli kun vi, mi unue dirus tion al vi.",Si quisiera hablar contigo te lo hubiera dicho.,,"Jos olisin halunnut puhua kanssasi, olisin sen sinulle ilmaissut.",Si j'avais voulu te parler je te l'aurais dit.,"Ha beszélni akartam volna veled, azt mondtam volna.","Se avessi voluto parlarti, te lo avrei detto.",話があったらこちらからする。,대화하고 싶었으면 내가 먼저 말을 걸었겠지. 안 그래?,"Als ik met je had willen praten, had ik je dat gezegd.","Hadde jeg villet snakke med deg, hadde jeg sagt det.","Gdybym chciał z tobą rozmawiać, powiedziałbym ci to.","Se eu quisesse falar com você, eu teria te dito.",,Dacă voiam să vorbim ți-aș fi spus.,"Если бы я хотел поговорить с тобой, то сказал бы об этом.",,Om jag hade velat prata med dig hade jag sagt det till dig.,"Seninle konuşmak isteseydim, bunu sana söylerdim." -Go and annoy someone else!,TXT_RANDOM_AGUARD_06,,,,Jdi otravovat někoho jiného!,Gå ud og irriter en anden!,Bitte nerve jemand anderen.,,Ĝenu aliulon!,¡Ve a molestar a otro!,,Mene ärsyttämään jotakuta toista!,Va ennuyer quelqu'un d'autre!,Menj és idegesíts valaki mást!,Vai a scocciare qualcun altro!,あまりイライラさせるな!,귀찮게 하지 말고 가서 딴 녀석이랑 놀아!,Ga iemand anders irriteren!,Gå og plag noen andre!,Idź i denerwuj kogoś innego!,Vá incomodar outra pessoa!,,Du-te și enervează pe altul.,Иди и надоедай кому-нибудь другому!,,Gå och irriter någon annan!,Git ve başkasını rahatsız et! -Keep moving!,TXT_RANDOM_AGUARD_07,,,,Nezastavuj se!,Fortsæt med at bevæge dig!,Beweg dich!,,Plue piediru!,¡Sigue caminando!,,Ala laputtaa!,Bouge!,Mozgás!,Continua a muoverti!,立ち去れ!,여어 움직여라!,Blijf in beweging!,Gå videre!,Ruszaj się!,Continue andando!,,Continuă să mergi!,Иди куда шёл!,,Fortsätt att röra på dig!,Yürümeye devam et! -"If the alarm goes off, just stay out of our way!",TXT_RANDOM_AGUARD_08,,,,"Jestli je vyhlášen poplach, jdi nám z cesty!","Hvis alarmen går i gang, så hold dig bare væk fra os!","Wenn der Alarm losgeht, steh uns nicht im Weg!",,"Se la alarmo eksonas, vi nur foriĝu de antaŭ ni!","¡Si la alarma se activa, solo quítate de nuestra vista!",,"Jos hälytys laukeaa, pysy vain pois meidät tieltämme!","Si l'alarme s'enclenche, reste en dehors de notre chemin!","Ha beindul a riasztó, csak ne állj az utunkba.","Se scatta l'allarme, stattene fuori dai piedi!",警報を鳴らされたくないなら、邪魔をするな!,"만약 알람이 작동된다면, 기도하고 도망치기나 해!","Als het alarm afgaat, blijf dan gewoon uit de weg!","Hvis alarmen går, bare hold deg unna oss!","Jeśli włączy się alarm, po prostu zejdź nam z drogi!","Se o alarme disparar, não fique no nosso caminho!",,"Dacă alarma e declanșată, pur și simplu nu ne sta în cale.","Если поднимется тревога, не попадайся нам под ноги!",,"Om larmet går, håll dig bara ur vägen!","Alarm çalarsa, yolumuzdan çekilin!" -The Order will cleanse the world and usher it into the new era.,TXT_RANDOM_AGUARD_09,,,,Řád pročistí náš svět a navede ho do nového věku.,Ordenen vil rense verden og føre den ind i den nye æra.,Der Orden wird die Welt läutern und in eine neue Ära führen.,,La Ordeno elpurigos la mondon kaj gvidos ĝin al la nova epoko.,La Orden limpiará el mundo y marcará el inicio de la nueva era.,La Orden va a limpiar el mundo y marcar el inicio de la nueva era.,Veljeskunta puhdistaa tämän maailman ja johdattaa sen uudelle aikakaudelle.,L'ordre nettoira le monde et le conduira dans une nouvelle ère.,"A Rend megtisztítja a világot, és egy új korszakba vezeti.",L'ordine ripulirà questo mondo e lo porterà verso una nuova era.,"オーダーは世界を浄化し、 +"As long as one of us still stands, we will win.",TXT_RANDOM_REBEL_10,,,,"Dokud je alespoň jeden z nás na nohou, vyhrajeme!","Så længe en af os stadig står tilbage, vil vi vinde.","Solange nur einer von uns steht, werden wir gewinnen.",,"Dum iu ajn el ni ankoraŭ povos stari, ni venkos.","Mientras uno de nosotros siga en pie, ganaremos.","Mientras uno de nosotros siga en pie, vamos a ganar.","Niin kauan kuin yksikin meistä vielä seisoo, voitto on meidän.","Aussi longtemps qu'un de nous est vivant, nous vaincrons.",,"Ha csak egy is marad meg közülünk, nyerni fogunk.","Finché uno di noi rimarrà in piedi, vinceremo.",我々が一人でも立っていれば、それが勝利。,"우리 중 한 명이 남아있는 한, 이길 수 있어.","Zolang één van ons nog staat, zullen we winnen.","Så lenge en av oss fortsatt står, vil vi vinne.","Tak długo jak jeden z nas nadal będzie stał, tak długo będziemy wygrywać.","Enquanto um de nós ainda estiver de pé, teremos chance de vencer.",,"Atâta timp cât unul din noi trăiește, vom triumfa.","Пока хотя бы один из нас ещё дышит, мы непобедимы.",,Så länge en av oss fortfarande står kvar kommer vi att vinna.,İçimizden biri ayakta kaldığı sürece kazanacağız. +"Move along, peasant.",TXT_RANDOM_AGUARD_01,,,,"Jdi dál, poddaný.","Gå videre, bonde.","Beweg dich, Bauer!",,"Ne haltu, kampulo.","No te detengas, campesino.",,"Jatka matkaa, maallikko.","Barre-toi, paysan!",,"Mozgás, paraszt. Egy kettő.","Muoviti, cittadino.",立ち去れ、百姓。,"어서 움직여, 이 자식아.","Ga verder, boer.","Gå videre, bonde.","Ruszaj w drogę, chłopie.","Continue andando, plebeu.",,"Mișcă, sărmanule.","Проходи, рабочий.",,"Gå vidare, bonde.",İlerle köylü. +"Follow the true faith, only then will you begin to understand.",TXT_RANDOM_AGUARD_02,,,,"Následuj pravou víru, jen tak začneš chápat.","Følg den sande tro, først da vil du begynde at forstå.",Folge dem wahren Glauben und du wirst verstehen.,,"Sekvu la veran kredon, nur tiel vi ekkomprenos.","Sigue la fe verdadera, solo entonces empezarás a entender.","Sigue la fe verdadera, solo así vas a entender.",Seuraa totista uskoa; vasta silloin alat käsittää.,"Suis la vraie foi, tu commençeras a comprendre.",,"Csak ha az igaz hitet követed, csakis akkor kezded majd megérteni.","Segui la vera fede, solo allora comincerai a capire.",真の信仰を求めよ、それしか理解に至る道はない。,참된 신앙이야말로 자기 자신을 깨우칠 수 있지.,"Volg het ware geloof, pas dan zul je het begrijpen.","Følg den sanne troen, først da vil du begynne å forstå.","Podążaj za prawdziwą wiarą, tylko wtedy zaczniesz rozumieć.",Siga a verdadeira fé. Só então você começará a entender.,,"Urmează crezul adevărat, doar atunci vei începe să înțelegi.",Следуй истинной вере. Только тогда ты начнёшь понимать.,,"Följ den sanna tron, först då kommer du att börja förstå.","Gerçek inancı takip et, ancak o zaman anlamaya başlarsın." +Only through death can one be truly reborn.,TXT_RANDOM_AGUARD_03,,,,Pouze skrz smrt lze dosáhnout znovuzrození.,Kun gennem døden kan man virkelig blive genfødt.,Nur durch den Tod kann man wirklich wiedergeboren werden.,,Nur per morto oni povas vere renaskiĝi.,Solo a través de la muerte uno puede realmente renacer.,,Vain kuoleman kautta voi totisesti uudestisyntyä.,C'est seulement a travers la mort que quelqu'un peut renaître.,,Csak a halál útján lehet igazán újjászületni.,Solo attraverso la morte uno può rinascere per davvero.,人が真の意味で生まれ変われる方法は、死のみだ,죽음을 통해서만이 진정하게 환생할 수 있는 거다.,Alleen door de dood kan men echt herboren worden.,Bare gjennom døden kan man virkelig bli gjenfødt.,Tylko przez śmierć można się naprawdę odrodzić.,Somente através da morte que alguem poderá renascer de verdade.,,Doar prin moarte poate cineva să fie renăscut cu adevărat.,Истинное перерождение возможно только через смерть.,,Endast genom döden kan man verkligen återfödas.,İnsan ancak ölümle gerçekten yeniden doğabilir. +I'm not interested in your useless drivel.,TXT_RANDOM_AGUARD_04,,,,Nezajímají mě tvoje žvásty.,Jeg er ikke interesseret i dit ubrugelige sludder.,Dein nutzloses Geschwafel interessiert mich nicht.,,Ne interesas min aŭdi viajn sensencaĵojn.,No me interesa tu charlatanería.,No me interesa oír tus estupideces.,Joutava hölynpölysi ei minua kiinnosta.,Je ne suis pas intéressé par tes idioties inutiles.,,Nem érdekel az értelmetlen hablatyolásod.,Non sono interessato alle tue ciance inutili.,お前の無益な戯言なぞ興味は無い。,네 잡담 따위는 듣고 싶지 않아.,Ik ben niet geïnteresseerd in je nutteloze gewauwel.,Jeg er ikke interessert i det unyttige vrøvlet ditt.,Nie interesują mnie twoje bezużyteczne brednie.,Não estou interessado em ouvir as suas bobagens inúteis.,,Nu sunt interesat de lipsa ta de sens.,Мне неинтересна твоя пустая болтовня.,,Jag är inte intresserad av ditt värdelösa dravel.,İşe yaramaz saçmalıklarınla ilgilenmiyorum. +If I had wanted to talk to you I would have told you so.,TXT_RANDOM_AGUARD_05,,,,"Kdybych s tebou chtěl mluvit, nařídil bych ti to.","Hvis jeg havde ønsket at tale med dig, ville jeg have sagt det til dig.","Wenn ich mich mit dir unterhalten wollte, hätte ich dir das gesagt.",,"Se mi volus paroli kun vi, mi unue dirus tion al vi.",Si quisiera hablar contigo te lo hubiera dicho.,,"Jos olisin halunnut puhua kanssasi, olisin sen sinulle ilmaissut.",Si j'avais voulu te parler je te l'aurais dit.,,"Ha beszélni akartam volna veled, azt mondtam volna.","Se avessi voluto parlarti, te lo avrei detto.",話があったらこちらからする。,대화하고 싶었으면 내가 먼저 말을 걸었겠지. 안 그래?,"Als ik met je had willen praten, had ik je dat gezegd.","Hadde jeg villet snakke med deg, hadde jeg sagt det.","Gdybym chciał z tobą rozmawiać, powiedziałbym ci to.","Se eu quisesse falar com você, eu teria te dito.",,Dacă voiam să vorbim ți-aș fi spus.,"Если бы я хотел поговорить с тобой, то сказал бы об этом.",,Om jag hade velat prata med dig hade jag sagt det till dig.,"Seninle konuşmak isteseydim, bunu sana söylerdim." +Go and annoy someone else!,TXT_RANDOM_AGUARD_06,,,,Jdi otravovat někoho jiného!,Gå ud og irriter en anden!,Bitte nerve jemand anderen.,,Ĝenu aliulon!,¡Ve a molestar a otro!,,Mene ärsyttämään jotakuta toista!,Va ennuyer quelqu'un d'autre!,,Menj és idegesíts valaki mást!,Vai a scocciare qualcun altro!,あまりイライラさせるな!,귀찮게 하지 말고 가서 딴 녀석이랑 놀아!,Ga iemand anders irriteren!,Gå og plag noen andre!,Idź i denerwuj kogoś innego!,Vá incomodar outra pessoa!,,Du-te și enervează pe altul.,Иди и надоедай кому-нибудь другому!,,Gå och irriter någon annan!,Git ve başkasını rahatsız et! +Keep moving!,TXT_RANDOM_AGUARD_07,,,,Nezastavuj se!,Fortsæt med at bevæge dig!,Beweg dich!,,Plue piediru!,¡Sigue caminando!,,Ala laputtaa!,Bouge!,,Mozgás!,Continua a muoverti!,立ち去れ!,여어 움직여라!,Blijf in beweging!,Gå videre!,Ruszaj się!,Continue andando!,,Continuă să mergi!,Иди куда шёл!,,Fortsätt att röra på dig!,Yürümeye devam et! +"If the alarm goes off, just stay out of our way!",TXT_RANDOM_AGUARD_08,,,,"Jestli je vyhlášen poplach, jdi nám z cesty!","Hvis alarmen går i gang, så hold dig bare væk fra os!","Wenn der Alarm losgeht, steh uns nicht im Weg!",,"Se la alarmo eksonas, vi nur foriĝu de antaŭ ni!","¡Si la alarma se activa, solo quítate de nuestra vista!",,"Jos hälytys laukeaa, pysy vain pois meidät tieltämme!","Si l'alarme s'enclenche, reste en dehors de notre chemin!",,"Ha beindul a riasztó, csak ne állj az utunkba.","Se scatta l'allarme, stattene fuori dai piedi!",警報を鳴らされたくないなら、邪魔をするな!,"만약 알람이 작동된다면, 기도하고 도망치기나 해!","Als het alarm afgaat, blijf dan gewoon uit de weg!","Hvis alarmen går, bare hold deg unna oss!","Jeśli włączy się alarm, po prostu zejdź nam z drogi!","Se o alarme disparar, não fique no nosso caminho!",,"Dacă alarma e declanșată, pur și simplu nu ne sta în cale.","Если поднимется тревога, не попадайся нам под ноги!",,"Om larmet går, håll dig bara ur vägen!","Alarm çalarsa, yolumuzdan çekilin!" +The Order will cleanse the world and usher it into the new era.,TXT_RANDOM_AGUARD_09,,,,Řád pročistí náš svět a navede ho do nového věku.,Ordenen vil rense verden og føre den ind i den nye æra.,Der Orden wird die Welt läutern und in eine neue Ära führen.,,La Ordeno elpurigos la mondon kaj gvidos ĝin al la nova epoko.,La Orden limpiará el mundo y marcará el inicio de la nueva era.,La Orden va a limpiar el mundo y marcar el inicio de la nueva era.,Veljeskunta puhdistaa tämän maailman ja johdattaa sen uudelle aikakaudelle.,L'ordre nettoira le monde et le conduira dans une nouvelle ère.,,"A Rend megtisztítja a világot, és egy új korszakba vezeti.",L'ordine ripulirà questo mondo e lo porterà verso una nuova era.,"オーダーは世界を浄化し、 我々を新しい時代へ導いてくれる。",우리 오더는 언젠간 이 세상을 정화하고 새로운 시대를 만들 것이다.,De orde zal de wereld zuiveren en het nieuwe tijdperk inluiden.,Ordenen vil rense verden og føre den inn i en ny æra.,Zakon oczyści świat i wprowadzi go w nową erę.,A Ordem purificará o mundo e o conduzirá para a nova era.,,Ordinul va curăța lumea și ne va propulsa într-o nouă eră.,"Орден очистит этот мир и положит начало новой эре! ",,Orden kommer att rena världen och föra in den i den nya eran.,Tarikat dünyayı temizleyecek ve yeni bir çağ başlatacak. -"Problem? No, I thought not.",TXT_RANDOM_AGUARD_10,,,,"Nějaký problém? Ne, není.","Problemer? Nej, det troede jeg ikke.","Hast du Probleme? Nein, ich glaube nicht.",,"Ĉu ia problemo? Ne, tiel, kiel mi jam pensis.","¿Algún problema? No, como ya me imaginaba.",,"Jokin ongelma? Ei, niin arvelinkin.",Un problème? Je pense que non.,Baj van? Nem? Én is így gondoltam.,"Qualche problema? No, come pensavo.",問題か? そうは思わないが。,문제가 있다고? 자. 이제 없지?,"Probleem? Nee, ik dacht van niet.","Problemer? Nei, jeg trodde ikke det.","Problem? Nie, nie sądziłem.",Algum problema? Imaginei que não.,,"Probleme? Nu, așa credeam și eu.",Что-то не так? Нет? Я так и думал.,,"Problem? Nej, det trodde jag inte.","Sorun mu var? Hayır, ben de öyle düşünmüştüm." -Alms for the poor?,TXT_RANDOM_BEGGAR_01,,,,Almužnu pro chudáka?,Almisser til de fattige?,Almosen für die Armen.,,Ĉu vi havas almozon por malriĉuloj?,¿Limosna para los pobres?,,Almuja köyhälle?,L'aumône pour les pauvres?,Alamizsna a szegényeknek?,Elemosina per i poveri?,貧民に何か恵んでくれるのか?,부디 빈민에게 구호를...,Aalmoezen voor de armen?,Almisser til de fattige?,Jałmużna dla biednych?,Uma ajuda para os pobres?,,Ceva pentru ce-i sărmani?,У тебя не найдётся мелочи для бедняка?,,Almosor till de fattiga?,Fakirler için sadaka mı? -"What are you looking at, surfacer?",TXT_RANDOM_BEGGAR_02,,,,"Na co koukáš, nadzemníku?","Hvad kigger du på, overfladeklipper?","Wonach suchst du, Oberflächler?",,"Kion vi rigardas, surfaco-loĝanto?","¿Que estás mirando, habitante de la superficie?",,"Mitä tuijotat, maanpintalainen?","Tu regarde qui, habitant de la surface?","Mit nézel, felszínlakó?","Cosa stai guardando, abitante della superficie?",何ジロジロ見てる、地上人。,"어딜 보고 있는 겁니까, 지상인씨?","Waar kijk je naar, oppervlaktebewoner? ","Hva glor du på, overflatebehandler?","Na co się patrzysz, surferze?","Tá olhando o quê, habitante da superfície?",,La ce te uiți?,"Что уставился, незнакомец?",,"Vad tittar du på, ytmänniska?","Neye bakıyorsun, sörfçü?" -"You wouldn't have any extra food, would you?",TXT_RANDOM_BEGGAR_03,,,,Neměl bys náhodou něco navíc k snědku?,"Du har vel ikke noget ekstra mad, vel?","Du hast nichts zu Essen übrig, oder?",,"Vi ne havas iom da restaj manĝaĵoj, ĉu?","No tendrás algo de comida que te sobre, ¿no?",,Ei sinulla sattuisi olemaan ylimääräistä ruokaa?,Aurais-tu de la nourriture en trop sur toi?,"Nincs egy kis felesleges ételed, ugye?",Tu non avresti del cibo avanzato da darci?,余ってる食べ物とかはないよな?,남은 식량 가지고 있습니까? 부디 있다고 말해주세요... 제발...,"Je zou toch geen extra eten hebben, of wel?",Du har vel ikke noe ekstra mat?,"Nie mielibyście żadnego dodatkowego jedzenia, prawda?","Por acaso você não tem comida sobrando, tem?",,"Nu ai mâncare în plus, nu-i așa?",У тебя случайно не найдётся немного лишней еды?,,"Du skulle inte ha någon extra mat, eller hur?","Fazladan yiyeceğin olmazdı, değil mi?" -You surface people will never understand us.,TXT_RANDOM_BEGGAR_04,,,,Vy lidi z povrchu nás nikdy nepochopíte.,I overflademennesker vil aldrig forstå os.,Ihr Oberflächenleute werdet uns nie verstehen.,,"Vi, surfaco-loĝantoj, neniam komprenos nin.","Vosotros, gente de la superficie, jamás nos entenderéis.","Ustedes, gente de la superficie, jamás nos van a entender.",Te maanpinnan asukit ette meitä koskaan tule ymmärtämään.,"Vous, les gens de la surface, vous ne comprendrez jamais.",Ti felszíniek sosem fogtok megérteni minket.,Voi abitanti della superficie non ci comprenderete mai.,"お前みたいな地上の連中には俺らのことなんて +"Problem? No, I thought not.",TXT_RANDOM_AGUARD_10,,,,"Nějaký problém? Ne, není.","Problemer? Nej, det troede jeg ikke.","Hast du Probleme? Nein, ich glaube nicht.",,"Ĉu ia problemo? Ne, tiel, kiel mi jam pensis.","¿Algún problema? No, como ya me imaginaba.",,"Jokin ongelma? Ei, niin arvelinkin.",Un problème? Je pense que non.,,Baj van? Nem? Én is így gondoltam.,"Qualche problema? No, come pensavo.",問題か? そうは思わないが。,문제가 있다고? 자. 이제 없지?,"Probleem? Nee, ik dacht van niet.","Problemer? Nei, jeg trodde ikke det.","Problem? Nie, nie sądziłem.",Algum problema? Imaginei que não.,,"Probleme? Nu, așa credeam și eu.",Что-то не так? Нет? Я так и думал.,,"Problem? Nej, det trodde jag inte.","Sorun mu var? Hayır, ben de öyle düşünmüştüm." +Alms for the poor?,TXT_RANDOM_BEGGAR_01,,,,Almužnu pro chudáka?,Almisser til de fattige?,Almosen für die Armen.,,Ĉu vi havas almozon por malriĉuloj?,¿Limosna para los pobres?,,Almuja köyhälle?,L'aumône pour les pauvres?,,Alamizsna a szegényeknek?,Elemosina per i poveri?,貧民に何か恵んでくれるのか?,부디 빈민에게 구호를...,Aalmoezen voor de armen?,Almisser til de fattige?,Jałmużna dla biednych?,Uma ajuda para os pobres?,,Ceva pentru ce-i sărmani?,У тебя не найдётся мелочи для бедняка?,,Almosor till de fattiga?,Fakirler için sadaka mı? +"What are you looking at, surfacer?",TXT_RANDOM_BEGGAR_02,,,,"Na co koukáš, nadzemníku?","Hvad kigger du på, overfladeklipper?","Wonach suchst du, Oberflächler?",,"Kion vi rigardas, surfaco-loĝanto?","¿Que estás mirando, habitante de la superficie?",,"Mitä tuijotat, maanpintalainen?","Tu regarde qui, habitant de la surface?",,"Mit nézel, felszínlakó?","Cosa stai guardando, abitante della superficie?",何ジロジロ見てる、地上人。,"어딜 보고 있는 겁니까, 지상인씨?","Waar kijk je naar, oppervlaktebewoner? ","Hva glor du på, overflatebehandler?","Na co się patrzysz, surferze?","Tá olhando o quê, habitante da superfície?",,La ce te uiți?,"Что уставился, незнакомец?",,"Vad tittar du på, ytmänniska?","Neye bakıyorsun, sörfçü?" +"You wouldn't have any extra food, would you?",TXT_RANDOM_BEGGAR_03,,,,Neměl bys náhodou něco navíc k snědku?,"Du har vel ikke noget ekstra mad, vel?","Du hast nichts zu Essen übrig, oder?",,"Vi ne havas iom da restaj manĝaĵoj, ĉu?","No tendrás algo de comida que te sobre, ¿no?",,Ei sinulla sattuisi olemaan ylimääräistä ruokaa?,Aurais-tu de la nourriture en trop sur toi?,,"Nincs egy kis felesleges ételed, ugye?",Tu non avresti del cibo avanzato da darci?,余ってる食べ物とかはないよな?,남은 식량 가지고 있습니까? 부디 있다고 말해주세요... 제발...,"Je zou toch geen extra eten hebben, of wel?",Du har vel ikke noe ekstra mat?,"Nie mielibyście żadnego dodatkowego jedzenia, prawda?","Por acaso você não tem comida sobrando, tem?",,"Nu ai mâncare în plus, nu-i așa?",У тебя случайно не найдётся немного лишней еды?,,"Du skulle inte ha någon extra mat, eller hur?","Fazladan yiyeceğin olmazdı, değil mi?" +You surface people will never understand us.,TXT_RANDOM_BEGGAR_04,,,,Vy lidi z povrchu nás nikdy nepochopíte.,I overflademennesker vil aldrig forstå os.,Ihr Oberflächenleute werdet uns nie verstehen.,,"Vi, surfaco-loĝantoj, neniam komprenos nin.","Vosotros, gente de la superficie, jamás nos entenderéis.","Ustedes, gente de la superficie, jamás nos van a entender.",Te maanpinnan asukit ette meitä koskaan tule ymmärtämään.,"Vous, les gens de la surface, vous ne comprendrez jamais.",,Ti felszíniek sosem fogtok megérteni minket.,Voi abitanti della superficie non ci comprenderete mai.,"お前みたいな地上の連中には俺らのことなんて わかりゃしない。",당신 같은 지상인들은 우리를 아예 도와주지도 않죠. 그렇지 않나요?,Je zult mensen ons nooit begrijpen.,Dere overflatefolk vil aldri forstå oss.,"Wy, ludzie powierzchni, nigdy nas nie zrozumiecie.",Vocês da superfície nunca nos entenderão.,,Voi oamenii de la suprafață nu veți înțelege niciodată.,"Вы, люди с поверхности, никогда не поймёте нас.",,Ni ytliga människor kommer aldrig att förstå oss.,Siz yüzey insanları bizi asla anlamayacaksınız. -"Ha, the guards can't find us. Those idiots don't even know we exist.",TXT_RANDOM_BEGGAR_05,,,,"Ha, stráže nás nenajdou. Ti idioti ani neví, že existujeme.","Ha, vagterne kan ikke finde os. De idioter ved ikke engang, at vi eksisterer.","Ha, die Wächter können uns nicht finden. Die Idioten ahnen nicht mal, dass wir existieren.",,"Ha, gardistoj ne trovas nin. Tiuj stultuloj eĉ ne scias, ke ni ekzistas.","Ja, los guardias no nos encuentran. Esos idiotas ni siquiera saben que existimos.",,"Hah, vartijat eivät pysty löytämään meitä. Ne idiootit eivät edes tiedä olemassaolostamme.","Ha, les gardes ne nous trouveront jamais, ces idiots ne savent même pas qu'on existe!","Ha! Az őrök az életben nem találnak meg minket. Azok a barmok azt sem tudják, hogy létezünk.","Ha, le guardie non ci trovano. Quegli idioti non sanno neppure della nostra esistenza.","衛兵共は俺らを見つけられない。 +"Ha, the guards can't find us. Those idiots don't even know we exist.",TXT_RANDOM_BEGGAR_05,,,,"Ha, stráže nás nenajdou. Ti idioti ani neví, že existujeme.","Ha, vagterne kan ikke finde os. De idioter ved ikke engang, at vi eksisterer.","Ha, die Wächter können uns nicht finden. Die Idioten ahnen nicht mal, dass wir existieren.",,"Ha, gardistoj ne trovas nin. Tiuj stultuloj eĉ ne scias, ke ni ekzistas.","Ja, los guardias no nos encuentran. Esos idiotas ni siquiera saben que existimos.",,"Hah, vartijat eivät pysty löytämään meitä. Ne idiootit eivät edes tiedä olemassaolostamme.","Ha, les gardes ne nous trouveront jamais, ces idiots ne savent même pas qu'on existe!",,"Ha! Az őrök az életben nem találnak meg minket. Azok a barmok azt sem tudják, hogy létezünk.","Ha, le guardie non ci trovano. Quegli idioti non sanno neppure della nostra esistenza.","衛兵共は俺らを見つけられない。 あのバカどもは俺らがここに居ることすら 知らないんだぞ。","하, 저 멍청한 경비들은 우리가 이 밑에 숨어있다는 걸 모르죠!","Ha, de bewakers kunnen ons niet vinden. Die idioten weten niet eens dat we bestaan.",Vaktene kan ikke finne oss. De idiotene vet ikke engang at vi eksisterer.,"Strażnicy nie mogą nas znaleźć. Ci idioci nawet nie wiedzą, że istniejemy.","Hah, os guardas não conseguem nos achar. Esses idiotas nem sabem que a gente existe.",,"Ha, gardienii nu ne pot găsi. Idioții ăștia nici măcar nu știu de existența noastră.","Ха! Эта глупая стража никогда не найдёт нас. Они даже не знают, что мы существуем.",,"Ha, vakterna kan inte hitta oss. De idioterna vet inte ens att vi finns.","Ha, muhafızlar bizi bulamaz. O aptallar varlığımızdan bile haberdar değiller." -One day everyone but those who serve the Order will be forced to join us.,TXT_RANDOM_BEGGAR_06,,,,"Jednoho dne se všichni, kdo neslouží Řádu, budou muset přidat k nám.","En dag vil alle undtagen dem, der tjener ordenen, blive tvunget til at slutte sig til os.","Eines Tages werden alle, die nicht dem Orden dienen, sich uns anschließen.",,"Ian tagon ĉiuj, krom la servantoj de La Ordeno, estos devigataj aliĝi al ni.","Algún día todos, excepto aquellos que sirven a La Orden, se verán forzados a unirse a nosotros.","Algún día todos, menos aquellos que le sirven a La Orden, se van a ver obligados a unirse a nosotros.",Jonain päivänä kaikkien paitsi Veljeskuntaa palvelevien on liityttävä meihin.,"Un jour, tous sauf les membres de l'ordre seront forcés de nous rejoindre.","Egy nap mindenki, kivéve a Rend szolgálói arra kényszerülnek majd, hogy hozzánk tartozzanak.","Un giorno tutti, salvo chi serve l'Ordine, sarà costretto ad unirsi a noi.","そのうち、オーダーに仕える者を除いて +One day everyone but those who serve the Order will be forced to join us.,TXT_RANDOM_BEGGAR_06,,,,"Jednoho dne se všichni, kdo neslouží Řádu, budou muset přidat k nám.","En dag vil alle undtagen dem, der tjener ordenen, blive tvunget til at slutte sig til os.","Eines Tages werden alle, die nicht dem Orden dienen, sich uns anschließen.",,"Ian tagon ĉiuj, krom la servantoj de La Ordeno, estos devigataj aliĝi al ni.","Algún día todos, excepto aquellos que sirven a La Orden, se verán forzados a unirse a nosotros.","Algún día todos, menos aquellos que le sirven a La Orden, se van a ver obligados a unirse a nosotros.",Jonain päivänä kaikkien paitsi Veljeskuntaa palvelevien on liityttävä meihin.,"Un jour, tous sauf les membres de l'ordre seront forcés de nous rejoindre.",,"Egy nap mindenki, kivéve a Rend szolgálói arra kényszerülnek majd, hogy hozzánk tartozzanak.","Un giorno tutti, salvo chi serve l'Ordine, sarà costretto ad unirsi a noi.","そのうち、オーダーに仕える者を除いて 全ての人間が私達のようになることを 強いられるだろう。",언젠가는 순종하는 사람들을 제외하고는 모두가 오더에 강제병합될지도 몰라요...,"Op een dag zal iedereen, behalve degenen die de Orde dienen, gedwongen worden om zich bij ons aan te sluiten.",En dag vil alle unntatt de som tjener Ordenen bli tvunget til å slutte seg til oss.,"Pewnego dnia wszyscy poza tymi, którzy służą Zakonowi, będą zmuszeni do przyłączenia się do nas.",Um dia todos exceto aqueles que servem à Ordem serão forçados a se juntarem a nós.,,Într-o bună zi toți în afară de cei care slujesc Ordinul vor fi nevoiți să ni se alăture.,"Однажды всем, кто не служит Ордену, придётся присоединиться к нам.",,En dag kommer alla utom de som tjänar Orden att tvingas ansluta sig till oss.,Bir gün Tarikat'a hizmet edenler dışında herkes bize katılmak zorunda kalacak. -"Stare now, but you know that this will be your own face one day.",TXT_RANDOM_BEGGAR_07,,,,"Teď zíráš, ale věz, že tohle bude jednou tvá tvář.","Stir nu, men du ved, at dette vil være dit eget ansigt en dag.","Glotz nur, aber irgendwann wirst du auch so aussehen.",,"Rigardu nun, sed vi scias, ke iam ĉi tiu estos via propra vizaĝo.","Observa ahora, pero ya sabes que esta será tu propia cara algún día.","Observa ahora, pero ya sabes que esta va a ser tu propia cara algún día.","Tuijotat nyt, mutta tiedä, että jonain päivänä nämä ovat sinun kasvosi.","Moque nous si tu veux, mais tu sais que ceci sera aussi ton sort un jour.","Bámulj csak, de tudd, hogy egy nap ez az arc a sajátod lesz.","Osservaci pure, ma tu sai bene che un giorno questa sarà la tua faccia.","今ジロジロ見てたみたいだが、 +"Stare now, but you know that this will be your own face one day.",TXT_RANDOM_BEGGAR_07,,,,"Teď zíráš, ale věz, že tohle bude jednou tvá tvář.","Stir nu, men du ved, at dette vil være dit eget ansigt en dag.","Glotz nur, aber irgendwann wirst du auch so aussehen.",,"Rigardu nun, sed vi scias, ke iam ĉi tiu estos via propra vizaĝo.","Observa ahora, pero ya sabes que esta será tu propia cara algún día.","Observa ahora, pero ya sabes que esta va a ser tu propia cara algún día.","Tuijotat nyt, mutta tiedä, että jonain päivänä nämä ovat sinun kasvosi.","Moque nous si tu veux, mais tu sais que ceci sera aussi ton sort un jour.",,"Bámulj csak, de tudd, hogy egy nap ez az arc a sajátod lesz.","Osservaci pure, ma tu sai bene che un giorno questa sarà la tua faccia.","今ジロジロ見てたみたいだが、 お前もいつかこんな顔になるだろうな。",배꼽 잡고 웃으시구려. 결국엔 당신도 이 모양 이 꼴이 될 테니까.,"Staar nu, maar je weet dat dit op een dag je eigen gezicht zal zijn.","Stirr nå, men du vet at dette vil bli ditt eget ansikt en dag.","Gap się teraz, ale wiesz, że to będzie kiedyś twoja własna twarz.","Pode ficar olhando, mas você sabe que este será o seu próprio rosto um dia.",,"Te holbezi acum, dar asta va fi soarta ta într-o zi.","Смотри сколько влезет, но знай, что когда-нибудь так будет выглядеть и твоё лицо.",,"Stirra nu, men du vet att detta kommer att vara ditt eget ansikte en dag.","Şimdi bak, ama biliyorsun ki bu bir gün senin de yüzün olacak." -There's nothing more annoying than a surfacer with an attitude!,TXT_RANDOM_BEGGAR_08,,,,Není nic otravnějšího než nadzemník s dobrou náladou!,Der er ikke noget mere irriterende end en overfladebeboer med en attitude!,Es gibt nichts nervigeres als einen Oberflächler mit Gesinnung.,,Estas nenio pli malagrabla ol surfaco-loĝanto kun tia sintenado!,¡No hay nada más irritante que una persona de la superficie con mala actitud!,,Ei ole mitään ärsyttävämpää kuin töykeä maanpintalainen!,Il n'y rien de plus barbant qu'un type de la surface et son orgeuil!,Nincs bosszantóbb egy felszíninél ilyen hozzáállással.,Non c'è nulla di più seccante di un abitante della superficie saccente!,腹立たしい地上人の態度は悩みの種だ!,버릇없는 지상인 보다 더 짜증 나는 건 없을 거예요!,Er is niets vervelender dan een verharder met een houding!,Det er ikke noe mer irriterende enn en overflatebehandler med en holdning!,Nie ma nic bardziej irytującego niż surfer z nastawieniem!,Não há nada mais irritante do que alguém da superfície cheio de si!,,Nu e nimic mai enervant decât o persoană de la suprafață cu fițe!,"Ничто так не выводит из себя, как болтун с поверхности!",,Det finns inget mer irriterande än en ytmänniska med attityd!,Tavırlı bir sörfçüden daha sinir bozucu bir şey yoktur! -The Order will make short work of your pathetic Front.,TXT_RANDOM_BEGGAR_09,,,,Řád s tou vaší patetickou Frontou udělá krátký proces.,Ordenen vil gøre kort proces med din patetiske front.,Der Orden wird eure armselige Front auseinandernehmen.,,La Ordeno detruos senprobleme vian ridindan Fronton.,La Orden acabará fácilmente con vuestro patético Frente.,La Orden va a destruir como si nada su patético Frente.,Veljeskunta tekee nopeasti selvän säälittävästä Rintamastanne.,L'ordre se débarrassera de vos soldats pathétiques.,A Rendnek gyerekjáték lesz a szánalmas kis Frontotok.,L'Ordine farà facilmente fuori il vostro patetico Fronte.,"オーダーはアンタの哀れなフロントに近付いてる +There's nothing more annoying than a surfacer with an attitude!,TXT_RANDOM_BEGGAR_08,,,,Není nic otravnějšího než nadzemník s dobrou náladou!,Der er ikke noget mere irriterende end en overfladebeboer med en attitude!,Es gibt nichts nervigeres als einen Oberflächler mit Gesinnung.,,Estas nenio pli malagrabla ol surfaco-loĝanto kun tia sintenado!,¡No hay nada más irritante que una persona de la superficie con mala actitud!,,Ei ole mitään ärsyttävämpää kuin töykeä maanpintalainen!,Il n'y rien de plus barbant qu'un type de la surface et son orgeuil!,,Nincs bosszantóbb egy felszíninél ilyen hozzáállással.,Non c'è nulla di più seccante di un abitante della superficie saccente!,腹立たしい地上人の態度は悩みの種だ!,버릇없는 지상인 보다 더 짜증 나는 건 없을 거예요!,Er is niets vervelender dan een verharder met een houding!,Det er ikke noe mer irriterende enn en overflatebehandler med en holdning!,Nie ma nic bardziej irytującego niż surfer z nastawieniem!,Não há nada mais irritante do que alguém da superfície cheio de si!,,Nu e nimic mai enervant decât o persoană de la suprafață cu fițe!,"Ничто так не выводит из себя, как болтун с поверхности!",,Det finns inget mer irriterande än en ytmänniska med attityd!,Tavırlı bir sörfçüden daha sinir bozucu bir şey yoktur! +The Order will make short work of your pathetic Front.,TXT_RANDOM_BEGGAR_09,,,,Řád s tou vaší patetickou Frontou udělá krátký proces.,Ordenen vil gøre kort proces med din patetiske front.,Der Orden wird eure armselige Front auseinandernehmen.,,La Ordeno detruos senprobleme vian ridindan Fronton.,La Orden acabará fácilmente con vuestro patético Frente.,La Orden va a destruir como si nada su patético Frente.,Veljeskunta tekee nopeasti selvän säälittävästä Rintamastanne.,L'ordre se débarrassera de vos soldats pathétiques.,,A Rendnek gyerekjáték lesz a szánalmas kis Frontotok.,L'Ordine farà facilmente fuori il vostro patetico Fronte.,"オーダーはアンタの哀れなフロントに近付いてる ってさ。",오더가 당신을 비롯한 한심한 프론트 저항군을 싹슬이할 겁니다.,De Orde zal kort werk maken van je zielige Front.,Ordenen vil gjøre kort prosess med din patetiske Front.,Zakon szybko rozprawi się z twoim żałosnym frontem.,A Ordem vai dar um jeito em vocês da Frente.,,Ordinul va face preș din Frontul tău.,Орден быстро расправится с твоим бессильным сопротивлением.,,Orden kommer att göra processen kort med din patetiska front.,Tarikat senin acınası cepheni kısa sürede halledecektir. -"Watch yourself, surfacer. We know our enemies!",TXT_RANDOM_BEGGAR_10,,,,"Dávej si pozor, nadzemníku. Známe své nepřátele!","Pas på dig selv, overfladebeboer. Vi kender vores fjender!","Pass nur auf, Oberflächler. Wir kennen unsere Feinde.",,"Atentu, surfaco-loĝanto. Ni konas niajn malamikojn!","Cuidado, habitante de la superficie. ¡Nosotros conocemos a nuestros enemigos!",,"Pidä varasi, maanpintalainen. Tunnemme vihollisemme!","Prend guarde a toi, habitant de la surface. Nous connaîssons nos ennemis!","Óvakodj, felszíni! Ismerjük az ellenségeinket!","Stai attento, abitante della superficie. Conosciamo i nostri nemici!",気を付けろ、地上人。敵はアンタを知ってるぞ。,"조심하시오, 지상인. 우리는 적이 누군지 알고 있으니!","Pas op, oppervlaktebewoner. We kennen onze vijanden!","Pass deg, overflatebehandler. Vi kjenner våre fiender!","Uważaj na siebie, surferze. Znamy naszych wrogów!","Cuidado, ô da superficie. Nós sabemos quem são os nossos inimigos!",,"Ai grijă, omule de la suprafață! Ne cunoaștem inamicii.","Поосторожнее, человек с поверхности. Мы знаем, кто наш враг!",,"Se upp, ytmänniska. Vi känner våra fiender!","Kendine dikkat et, sörfçü. Düşmanlarımızı tanıyoruz!" -We are the hands of fate. To earn our wrath is to find oblivion!,TXT_RANDOM_PGUARD_01,,,,Jsme rukama osudu. Získat si náš hněv je jako upadnout v zapomnění!,Vi er skæbnens hænder. At gøre sig fortjent til vores vrede er at finde glemsel!,Wir sind die Hände des Schicksals. Wer sich unseren Zorn verdient wird vernichtet!,,Ni estas la manoj de la destino. Furiozigi nin estas trovi forgeson!,Somos las manos del destino. ¡Despertar nuestra ira es encontrar el olvido!,,"Olemme kohtalon käsi. Joka yllyttää meidät vihaan, etsii turmiotaan.",Nous sommes les mains du destin. Apprendre notre colère est l'égal de trouver l'oubli!,"Mi vagyunk a sors keze. Kárhozatra ítéltetett, ki haragunkat elnyeri.",Siamo le mani del destino. Farci infuriare significa trovare l'oblio!,"運命は我々の手の中だ。 +"Watch yourself, surfacer. We know our enemies!",TXT_RANDOM_BEGGAR_10,,,,"Dávej si pozor, nadzemníku. Známe své nepřátele!","Pas på dig selv, overfladebeboer. Vi kender vores fjender!","Pass nur auf, Oberflächler. Wir kennen unsere Feinde.",,"Atentu, surfaco-loĝanto. Ni konas niajn malamikojn!","Cuidado, habitante de la superficie. ¡Nosotros conocemos a nuestros enemigos!",,"Pidä varasi, maanpintalainen. Tunnemme vihollisemme!","Prend guarde a toi, habitant de la surface. Nous connaîssons nos ennemis!",,"Óvakodj, felszíni! Ismerjük az ellenségeinket!","Stai attento, abitante della superficie. Conosciamo i nostri nemici!",気を付けろ、地上人。敵はアンタを知ってるぞ。,"조심하시오, 지상인. 우리는 적이 누군지 알고 있으니!","Pas op, oppervlaktebewoner. We kennen onze vijanden!","Pass deg, overflatebehandler. Vi kjenner våre fiender!","Uważaj na siebie, surferze. Znamy naszych wrogów!","Cuidado, ô da superficie. Nós sabemos quem são os nossos inimigos!",,"Ai grijă, omule de la suprafață! Ne cunoaștem inamicii.","Поосторожнее, человек с поверхности. Мы знаем, кто наш враг!",,"Se upp, ytmänniska. Vi känner våra fiender!","Kendine dikkat et, sörfçü. Düşmanlarımızı tanıyoruz!" +We are the hands of fate. To earn our wrath is to find oblivion!,TXT_RANDOM_PGUARD_01,,,,Jsme rukama osudu. Získat si náš hněv je jako upadnout v zapomnění!,Vi er skæbnens hænder. At gøre sig fortjent til vores vrede er at finde glemsel!,Wir sind die Hände des Schicksals. Wer sich unseren Zorn verdient wird vernichtet!,,Ni estas la manoj de la destino. Furiozigi nin estas trovi forgeson!,Somos las manos del destino. ¡Despertar nuestra ira es encontrar el olvido!,,"Olemme kohtalon käsi. Joka yllyttää meidät vihaan, etsii turmiotaan.",Nous sommes les mains du destin. Apprendre notre colère est l'égal de trouver l'oubli!,,"Mi vagyunk a sors keze. Kárhozatra ítéltetett, ki haragunkat elnyeri.",Siamo le mani del destino. Farci infuriare significa trovare l'oblio!,"運命は我々の手の中だ。 あまり歯向かわない方がいいぞ。","우리는 긍휼의 손길이며, 불신자들을 심판하는 검일지니!",Wij zijn de handen van het lot. Om onze toorn te verdienen is het vinden van de vergetelheid!,Vi er i skjebnens hender. Å fortjene vår vrede er å finne glemsel!,Jesteśmy rękami losu. Zasłużyć na nasz gniew to znaleźć zapomnienie!,Somos as mãos do destino. Quem despertar a nossa ira será destruído!,,Suntem mâinile destinului. Să ne câștigi furia e să găsești vidul!,Мы длани судьбы. Прогневить нас означает встретить забвение!,,Vi är ödets händer. Att förtjäna vår vrede är att finna glömska!,"Bizler kaderin elleriyiz. Gazabımızı kazanmak, unutulmayı bulmaktır!" -The Order will cleanse the world of the weak and corrupt!,TXT_RANDOM_PGUARD_02,,,,Řád vyčistí svět od slabých a zkažených!,Ordenen vil rense verden for de svage og korrupte!,Der Orden wird die Welt von allem Schwachen und Korrupten säubern.,,La Ordeno elpurigos la mondon je malfortuloj kaj koruptitoj!,¡La Orden limpiará el mundo de los débiles y los corruptos!,,Veljeskunta puhdistaa tämän maailman sen heikoista ja turmeltuneista!,L'ordre nettoira le monde des faibles et corrompus!,A Rend megtisztítja a világot a gyengéktől és a korruptaktól!,"L'Ordine ripulirà il mondo dai deboli e corrotti! +The Order will cleanse the world of the weak and corrupt!,TXT_RANDOM_PGUARD_02,,,,Řád vyčistí svět od slabých a zkažených!,Ordenen vil rense verden for de svage og korrupte!,Der Orden wird die Welt von allem Schwachen und Korrupten säubern.,,La Ordeno elpurigos la mondon je malfortuloj kaj koruptitoj!,¡La Orden limpiará el mundo de los débiles y los corruptos!,,Veljeskunta puhdistaa tämän maailman sen heikoista ja turmeltuneista!,L'ordre nettoira le monde des faibles et corrompus!,,A Rend megtisztítja a világot a gyengéktől és a korruptaktól!,"L'Ordine ripulirà il mondo dai deboli e corrotti! ","オーダーは浅ましく腐敗した世界を 浄化するだろう!",유일신님은 반드시 이 나약하고 부패한 세상을 정화할 것이니라!,De Orde zal de wereld zuiveren van de zwakken en corrupten!,Ordenen vil rense verden for de svake og korrupte!,Zakon oczyści świat ze słabych i skorumpowanych!,A Ordem purificará o mundo dos fracos e corruptos!,,Ordinul va curăța lumea de slabi și corupți!,Орден очистит мир от слабых и порочных!,,Orden kommer att rensa världen från de svaga och korrupta!,"Düzen, dünyayı zayıf ve yozlaşmış olanlardan temizleyecek!" -Obey the will of the masters!,TXT_RANDOM_PGUARD_03,,,,Podrob se vůli svých pánů!,Adlyd mændenes vilje!,Gehorche dem Willen der Meister.,,Obeu la volon de la mastroj!,¡Obedece la voluntad de los maestros!,,Tottele mestareiden tahtoa!,Obéissez à la volonté de vos maîtres!,Engedelmeskedj mestereink akaratának!,Obbedisci al volere dei maestri!,主の意志に従うのだ。,스승님들께서 너희에게 명령하신 도를 행하라!,Gehoorzaam de wil van de meesters!,Adlyd mesternes vilje!,Bądźcie posłuszni woli mistrzów!,Obedeça a lei dos mestres!,,Supune-te voinței stăpânilor!,Подчинись воле хозяев!,,Lyd mästarnas vilja!,Efendilerin iradesine itaat edin! -Long life to the brothers of the Order!,TXT_RANDOM_PGUARD_04,,,,Nechť žijí naši bratři Řádu!,Langt liv til ordenens brødre!,Lang lebe die Brüder des Ordens.,,Vivu la fratoj de La Ordeno!,¡Vivan los hermanos de La Orden!,,Pitkä ikä Veljeskunnan veljille!,Longue vie aux membres de l'Ordre!,Éljenek sokáig a Rend testvérei!,Lunga vita ai fratelli dell'Ordine.,オーダーの友に永久の命を!,"오더와 그의 동포들을 따르라, 그럼 영생을 얻을 지니!",Een lang leven voor de broeders van de Orde!,Lenge leve ordenens brødre!,Niech żyją bracia Zakonu!,Vida longa aos irmãos da Ordem!,,Viață lungă fraților Ordinului!,Да здравствуют братья Ордена!,,Länge liv till ordensbröderna!,Tarikat'ın kardeşlerine uzun ömürler! -Free will is an illusion that binds the weak minded.,TXT_RANDOM_PGUARD_05,,,,"Svobodná vůle je jen iluze, která váže ruce slabomyslným.","Den frie vilje er en illusion, der binder de svage sind.",Freier Wille ist eine Illusion die die Schwachen fesselt.,,"Libera volo estas iluzio, kiu ligas debiluloj.",El libre albedrío es una ilusión que une a los débiles de mente.,,"Vapaa tahto on harha, joka sitoo heikkomieliset.",La liberté de penser est l'illusion qui aveugle les faibles d'esprit.,"A Szabad akarat egy illúzió, ami csupán a gyengéknek mentsvára.",Il libero arbitrio è un'illusione che tiene legati i deboli di mente.,自由意志など、弱者を縛る幻想に過ぎぬ。,"자유의지는 나약함의 상징이요, 필멸의 꾐이라.",De vrije wil is een illusie die de zwakkeren bindt.,Fri vilje er en illusjon som binder de svake.,"Wolna wola to iluzja, która wiąże słabe umysły.",Livre arbítrio é uma ilusão para os fracos.,,Voința liberă e o iluzie care leagă mințile slabe.,"Свободная воля — лишь иллюзия, созданная для управления слабыми духом.",,Fri vilja är en illusion som binder de svaga sinnena.,"Özgür irade, zayıf zihinleri bağlayan bir yanılsamadır." -Power is the path to glory. To follow the Order is to walk that path!,TXT_RANDOM_PGUARD_06,,,,Moc je cesta ke slávě. Následovat Řád je chodit po té cestě!,Magt er vejen til ære. At følge Ordenen er at gå denne vej!,"Macht ist der Weg zum Ruhm. Dem Orden zu folgen bedeutet, diesen Weg zu gehen.",,Povo estas la vojo al gloro. Sekvi La Ordenon estas iri laŭ tiu vojo!,El poder es el camino a la gloria. ¡Seguir a La Orden es alcanzar ese camino!,,Valta on tie kunniaan. Veljeskunnan seuraaminen on vaeltaa sitä tietä!,le pouvoir est le chemin de la gloire. Suivre l'ordre c'est suivre ce chemin!,"A dicsőéghez vezető út az erő. Aki A Rendet követi, ezt az utat járja.",Il potere è il percorso verso la gloria. Seguire l'Ordine è come attraversare quel percorso!,"力は栄光への道だ。 +Obey the will of the masters!,TXT_RANDOM_PGUARD_03,,,,Podrob se vůli svých pánů!,Adlyd mændenes vilje!,Gehorche dem Willen der Meister.,,Obeu la volon de la mastroj!,¡Obedece la voluntad de los maestros!,,Tottele mestareiden tahtoa!,Obéissez à la volonté de vos maîtres!,,Engedelmeskedj mestereink akaratának!,Obbedisci al volere dei maestri!,主の意志に従うのだ。,스승님들께서 너희에게 명령하신 도를 행하라!,Gehoorzaam de wil van de meesters!,Adlyd mesternes vilje!,Bądźcie posłuszni woli mistrzów!,Obedeça a lei dos mestres!,,Supune-te voinței stăpânilor!,Подчинись воле хозяев!,,Lyd mästarnas vilja!,Efendilerin iradesine itaat edin! +Long life to the brothers of the Order!,TXT_RANDOM_PGUARD_04,,,,Nechť žijí naši bratři Řádu!,Langt liv til ordenens brødre!,Lang lebe die Brüder des Ordens.,,Vivu la fratoj de La Ordeno!,¡Vivan los hermanos de La Orden!,,Pitkä ikä Veljeskunnan veljille!,Longue vie aux membres de l'Ordre!,,Éljenek sokáig a Rend testvérei!,Lunga vita ai fratelli dell'Ordine.,オーダーの友に永久の命を!,"오더와 그의 동포들을 따르라, 그럼 영생을 얻을 지니!",Een lang leven voor de broeders van de Orde!,Lenge leve ordenens brødre!,Niech żyją bracia Zakonu!,Vida longa aos irmãos da Ordem!,,Viață lungă fraților Ordinului!,Да здравствуют братья Ордена!,,Länge liv till ordensbröderna!,Tarikat'ın kardeşlerine uzun ömürler! +Free will is an illusion that binds the weak minded.,TXT_RANDOM_PGUARD_05,,,,"Svobodná vůle je jen iluze, která váže ruce slabomyslným.","Den frie vilje er en illusion, der binder de svage sind.",Freier Wille ist eine Illusion die die Schwachen fesselt.,,"Libera volo estas iluzio, kiu ligas debiluloj.",El libre albedrío es una ilusión que une a los débiles de mente.,,"Vapaa tahto on harha, joka sitoo heikkomieliset.",La liberté de penser est l'illusion qui aveugle les faibles d'esprit.,,"A Szabad akarat egy illúzió, ami csupán a gyengéknek mentsvára.",Il libero arbitrio è un'illusione che tiene legati i deboli di mente.,自由意志など、弱者を縛る幻想に過ぎぬ。,"자유의지는 나약함의 상징이요, 필멸의 꾐이라.",De vrije wil is een illusie die de zwakkeren bindt.,Fri vilje er en illusjon som binder de svake.,"Wolna wola to iluzja, która wiąże słabe umysły.",Livre arbítrio é uma ilusão para os fracos.,,Voința liberă e o iluzie care leagă mințile slabe.,"Свободная воля — лишь иллюзия, созданная для управления слабыми духом.",,Fri vilja är en illusion som binder de svaga sinnena.,"Özgür irade, zayıf zihinleri bağlayan bir yanılsamadır." +Power is the path to glory. To follow the Order is to walk that path!,TXT_RANDOM_PGUARD_06,,,,Moc je cesta ke slávě. Následovat Řád je chodit po té cestě!,Magt er vejen til ære. At følge Ordenen er at gå denne vej!,"Macht ist der Weg zum Ruhm. Dem Orden zu folgen bedeutet, diesen Weg zu gehen.",,Povo estas la vojo al gloro. Sekvi La Ordenon estas iri laŭ tiu vojo!,El poder es el camino a la gloria. ¡Seguir a La Orden es alcanzar ese camino!,,Valta on tie kunniaan. Veljeskunnan seuraaminen on vaeltaa sitä tietä!,le pouvoir est le chemin de la gloire. Suivre l'ordre c'est suivre ce chemin!,,"A dicsőéghez vezető út az erő. Aki A Rendet követi, ezt az utat járja.",Il potere è il percorso verso la gloria. Seguire l'Ordine è come attraversare quel percorso!,"力は栄光への道だ。 オーダーに従えばその道を歩めるだろう。","힘은 영광이자 희망이며, 이를 간구함으로써 축복받을지어다!",Macht is de weg naar glorie. De Orde volgen is dat pad bewandelen!,Makt er veien til ære. Å følge Ordenen er å gå den veien!,Władza jest drogą do chwały. Podążanie za Zakonem to podążanie tą ścieżką!,O poder é o caminho para a glória. Siga a Ordem e andará por esse caminho!,,Puterea e calea spre glorie. Să urmezi Ordinul e să urmezi acea cale!,Сила — путь к величию. Вступить в ряды Ордена означает пойти этим путём!,,Makt är vägen till ära. Att följa Orden är att gå den vägen!,"Güç, zafere giden yoldur. Tarikat'ı takip etmek o yolda yürümektir!" -"Take your place among the righteous, join us!",TXT_RANDOM_PGUARD_07,,,,"Najdi své místo mezi spravedlivými, přidej se k nám!","Tag din plads blandt de retfærdige, slut dig til os!",Nimm deinen Platz unter den Gerechten ein. ,,Havu vian postenon inter ĝustuloj. Aliĝu al ni!,Toma tu lugar entre los justos. ¡Únete a nosotros!,,Ota paikkasi hurskaitten joukossa; liity meihin!,"Prend ta place parmi les justes, rejoins nous!","Foglalj helyet az igazak között, csatlakozz hozzánk!","Prendi il tuo posto tra i giusti, unisciti a noi!",正義は我等と共に在る、参加せよ!,"우리는 참됐으며 구원을 받았느니라, 함께 기도하면 두려울 것이 없을지니!","Neem je plaats in tussen de rechtvaardigen, sluit je aan bij ons!","Ta din plass blant de rettferdige, bli med oss!","Zajmij swoje miejsce wśród sprawiedliwych, dołącz do nas!",Tenha o seu lugar entre os justos. Junte-se a nós!,,Alătură-te celor drepți!,Займи своё место среди праведных. Присоединись к нам!,,"Ta din plats bland de rättfärdiga, anslut dig till oss!","Doğruların arasında yerinizi alın, bize katılın!" -The Order protects its own.,TXT_RANDOM_PGUARD_08,,,,Řád si své lidi chrání.,Ordenen beskytter sine egne.,Der Orden beschützt seine Jünger.,,La Ordeno defendas siajn anojn.,La Orden defiende a los suyos.,,Veljeskunta puolustaa omiaan.,L'ordre protège les siens.,A Rend a magáét védi.,L'Ordine protegge i suoi.,オーダーは我々を守護している。,오더는 신들을 향한 기도로 거룩하여짐이니라.,De Orde beschermt zijn discipelen. ,Ordenen beskytter sine egne.,Zakon chroni swoich.,A Ordem protege os seus discípulos.,,Ordinul îi protejează pe cei loiali.,Орден защищает своих.,,Orden skyddar sina egna.,Tarikat kendine ait olanları korur. -Acolytes? They have yet to see the full glory of the Order.,TXT_RANDOM_PGUARD_09,,,,Akolyté? Ti ještě neviděli Řád v celé své kráse.,Acolytes? De har endnu ikke set Ordenens fulde herlighed.,Ministranten? Die müssen erst noch die volle Macht des Ordens erfahren.,,Ĉu akolitoj? Ili ankoraŭ ne vidis la tutan gloron de La Ordeno.,¿Acólitos? Aún no han visto toda la gloria de La Orden.,¿Acólitos? Aún no vieron toda la gloria de La Orden.,Akoluutit? He eivät ole vielä nähneet Veljeskunnan täyttä kirkkautta.,Les Acolytes? Ils n'ont pas encore été témoins de la vraie gloire de l'ordre.,Ministránsok? Még nem látták A Rend igazi dicsőségét.,Gli accoliti? Devono ancora conoscere la vera gloria dell'Ordine.,"アコライト? +"Take your place among the righteous, join us!",TXT_RANDOM_PGUARD_07,,,,"Najdi své místo mezi spravedlivými, přidej se k nám!","Tag din plads blandt de retfærdige, slut dig til os!",Nimm deinen Platz unter den Gerechten ein. ,,Havu vian postenon inter ĝustuloj. Aliĝu al ni!,Toma tu lugar entre los justos. ¡Únete a nosotros!,,Ota paikkasi hurskaitten joukossa; liity meihin!,"Prend ta place parmi les justes, rejoins nous!",,"Foglalj helyet az igazak között, csatlakozz hozzánk!","Prendi il tuo posto tra i giusti, unisciti a noi!",正義は我等と共に在る、参加せよ!,"우리는 참됐으며 구원을 받았느니라, 함께 기도하면 두려울 것이 없을지니!","Neem je plaats in tussen de rechtvaardigen, sluit je aan bij ons!","Ta din plass blant de rettferdige, bli med oss!","Zajmij swoje miejsce wśród sprawiedliwych, dołącz do nas!",Tenha o seu lugar entre os justos. Junte-se a nós!,,Alătură-te celor drepți!,Займи своё место среди праведных. Присоединись к нам!,,"Ta din plats bland de rättfärdiga, anslut dig till oss!","Doğruların arasında yerinizi alın, bize katılın!" +The Order protects its own.,TXT_RANDOM_PGUARD_08,,,,Řád si své lidi chrání.,Ordenen beskytter sine egne.,Der Orden beschützt seine Jünger.,,La Ordeno defendas siajn anojn.,La Orden defiende a los suyos.,,Veljeskunta puolustaa omiaan.,L'ordre protège les siens.,,A Rend a magáét védi.,L'Ordine protegge i suoi.,オーダーは我々を守護している。,오더는 신들을 향한 기도로 거룩하여짐이니라.,De Orde beschermt zijn discipelen. ,Ordenen beskytter sine egne.,Zakon chroni swoich.,A Ordem protege os seus discípulos.,,Ordinul îi protejează pe cei loiali.,Орден защищает своих.,,Orden skyddar sina egna.,Tarikat kendine ait olanları korur. +Acolytes? They have yet to see the full glory of the Order.,TXT_RANDOM_PGUARD_09,,,,Akolyté? Ti ještě neviděli Řád v celé své kráse.,Acolytes? De har endnu ikke set Ordenens fulde herlighed.,Ministranten? Die müssen erst noch die volle Macht des Ordens erfahren.,,Ĉu akolitoj? Ili ankoraŭ ne vidis la tutan gloron de La Ordeno.,¿Acólitos? Aún no han visto toda la gloria de La Orden.,¿Acólitos? Aún no vieron toda la gloria de La Orden.,Akoluutit? He eivät ole vielä nähneet Veljeskunnan täyttä kirkkautta.,Les Acolytes? Ils n'ont pas encore été témoins de la vraie gloire de l'ordre.,,Ministránsok? Még nem látták A Rend igazi dicsőségét.,Gli accoliti? Devono ancora conoscere la vera gloria dell'Ordine.,"アコライト? 奴等はオーダーの爛漫なる未来を見ていない。",아콜라이트들이라... 애석하게도 이 들은 믿음이 아직 부족하다고 생각함이라.,Acolieten? Zij moeten de volle glorie van de Orde nog zien.,Akolytter? De har ennå ikke sett Ordenens fulle herlighet.,Akolitów? Oni jeszcze nie widzieli pełnej chwały Zakonu.,Acólitos? Eles ainda não viram toda a glória da Ordem.,,Acoliți? Încă nu au văzut gloria Ordinului.,Служители? Им ещё только предстоит узреть подлинное величие Ордена.,,Acolytes? De har ännu inte sett ordens fulla ära.,Yardımcıları mı? Henüz Tarikat'ın tüm ihtişamını görmediler. -"If there is any honor inside that pathetic shell of a body, you'll enter into the arms of the Order.",TXT_RANDOM_PGUARD_10,,,"If there is any honour inside that pathetic shell of a body, you'll enter into the arms of the Order.","Jestli ta tvoje žalostná tělesná schránka má v sobě kousek cti, dáš se do rukou Řádu.","Hvis der er nogen ære inden i denne ynkelige skal af en krop, vil du gå ind i Ordenens arme.","Wenn du noch einen Hauch von Ehre hast, wirst du dem Orden beitreten.",,"Se restas iom da honoro en tiu ridinda ŝelo nomata «korpo», vi iĝos unu el la brakoj de La Ordeno.","Si hay algo de honor dentro de ese patético cascarón llamado «cuerpo», La Orden te espera con los brazos abiertos.",,"Jos tuon säälittävän ruumiinhylyn sisällä on yhtään kunniakkuutta, otat itsesi Veljeskunnan huomaan.","Si il y a une once de gloire dans ce corps pathétique, ceux de l'ordre te prendront parmi les leurs.","Ha csak egy csipetnyi becsület is van testednek szánalmas páncéljában, A Rend katonáinak sorába fogsz beállni.","Se c'è un po' di onore rimasto dentro quel guscio patetico che chiami corpo, entrerai nelle braccia dell'Ordine.","その哀れな肉体の殻でも名誉の為ならば、 +"If there is any honor inside that pathetic shell of a body, you'll enter into the arms of the Order.",TXT_RANDOM_PGUARD_10,,,"If there is any honour inside that pathetic shell of a body, you'll enter into the arms of the Order.","Jestli ta tvoje žalostná tělesná schránka má v sobě kousek cti, dáš se do rukou Řádu.","Hvis der er nogen ære inden i denne ynkelige skal af en krop, vil du gå ind i Ordenens arme.","Wenn du noch einen Hauch von Ehre hast, wirst du dem Orden beitreten.",,"Se restas iom da honoro en tiu ridinda ŝelo nomata «korpo», vi iĝos unu el la brakoj de La Ordeno.","Si hay algo de honor dentro de ese patético cascarón llamado «cuerpo», La Orden te espera con los brazos abiertos.",,"Jos tuon säälittävän ruumiinhylyn sisällä on yhtään kunniakkuutta, otat itsesi Veljeskunnan huomaan.","Si il y a une once de gloire dans ce corps pathétique, ceux de l'ordre te prendront parmi les leurs.",,"Ha csak egy csipetnyi becsület is van testednek szánalmas páncéljában, A Rend katonáinak sorába fogsz beállni.","Se c'è un po' di onore rimasto dentro quel guscio patetico che chiami corpo, entrerai nelle braccia dell'Ordine.","その哀れな肉体の殻でも名誉の為ならば、 オーダーの兵器を携える事が出来るだろう。",육체라는 나약한 껍질에 갇힌 운명을 참회하는 자들이야말로 오더와 함께할 수 있을지어다. ,"Als er enige eer in dat zielige omhulsel van een lichaam zit, zul je in de armen van de Orde binnengaan.","Hvis det er noe ære i det patetiske skallet av en kropp, vil du gå inn i Ordenens armer.","Jeśli w tej żałosnej skorupie ciała jest choć odrobina honoru, wejdziesz w ramiona Zakonu.","Se ainda existe honra dentro da sua carne patética, você entrará para os braços da Ordem.",,"Dacă e o fărâmă de onoare în acel corp jalnic, vei putea intra în brațele Ordinului.","Если внутри этой бренной телесной оболочки есть хоть капля чести, ты присоединишься к Ордену.",,"Om det finns någon heder i det patetiska skalet av en kropp, kommer du att gå in i Ordens armar.","Eğer o zavallı bedenin içinde biraz onur varsa, Tarikat'ın kollarına gireceksin." -Bye!,TXT_RANDOMGOODBYE_1,,,,Tak ahoj!,Farvel!,Tschüss!,,Ĝis!,¡Adiós!,,Näkemiin!,Au revoir!,Szervusz!,Ciao!,じゃあな!,안녕!,Dag!,Adjø!,Pa!,Tchau!,,Pa!,Пока!,,Hej då!,Güle güle! -"Thanks, bye!",TXT_RANDOMGOODBYE_2,,,,"Díky, ahoj!","Tak, farvel!","Danke, tschüss!",,Dankon. Ĝis!,Gracias. ¡Adiós!,,"Kiitos, hei!","Merci, au revoir!","Köszi, szia!","Grazie, ciao!",どうも、じゃあ!,그렇군요. 그럼 안녕히!,"Bedankt, tot ziens!","Takk, ha det!","Dzięki, pa!",Obrigado. Até mais!,,"Merci, pa!","Спасибо, пока!",,"Tack, hej då!","Teşekkürler, güle güle!" -See you later!,TXT_RANDOMGOODBYE_3,,,,Uvidíme se později!,Vi ses senere!,Bis später!,,Ĝis la revido!,¡Nos vemos!,,Nähdään!,A plus tard!,Később találkozunk!,Ci vediamo dopo!,また今度!,다음에 봐요!,Tot ziens!,Vi ses senere!,Do zobaczenia później!,Até logo!,,Ne vedem mai încolo!,До встречи!,,Vi ses senare!,Sonra görüşürüz! -,,Strife logs,,,,,,,,,,,,,,,,,,,,,,,,, -"Hello? Command, a com unit has just been activated... Am receiving visuals and sound from... somebody... Hey you, get out of there now... and drop the chalice!",TXT_ILOG1,MAP33: After getting the hidden com unit in the tavern.,,,"Haló? Velení, právě byl aktivován komunikátor... příjimám obraz a zvuk od... někoho... Hej, ty, dostaň se odtaď... a zahoď ten kalich!","Hallo? Kommando, en kommunikationsenhed er lige blevet aktiveret... Jeg modtager billeder og lyd fra... en eller anden... Hey du, kom ud derfra nu... og smid bægeret!","Hallo, Kommandozentrale, eine Kommunikationseinheit wurde gerade aktiviert.... Ich empfange Bilder und Ton von... irgend jemandem... Hey, du, verschwinde da sofort... Und schmeiß den Kelch weg!",,Saluton?... Komandanto! Interfono ekagiĝis: mi ricevas bildojn kaj sonon el... iu. Hola! Eliru tuj el tie... kaj forĵetu la kalikon!,"¿Hola?... Comando, un intercomunicador acaba de ser activado: recibo imágenes y sonido de... alguien. Eh, tú, sal de ahí ahora mismo... ¡Y tira ese cáliz!",,"Haloo? Komentokeskus, äsken juuri kytkettiin päälle viestintälaite... Poimin... jonkun... videota ja ääntä... Hei sinä, häivy täältä heti paikalla... ja pudota kalkki!","Allô? Central, un communicateur à été activé.. Je recois visuel et son de.. quelqu'un.. Hé, vous, sortez de là! Et lâchez le calice!","Haló Központ! Egy jeladót aktiváltak...kép és hang jeleket veszek...valakitől...Hé Te ott, húzz ki onnan...és rakd le a serleget!","Pronto? Comando, un'unità di comunicazione è appena stata attivata... Sto ricevendo segnali audiovisivi da... qualcuno... Hey, tu, esci da là subito, e lascia stare quel calice!","もしもし? 司令部、comユニットが起動されました。 +Bye!,TXT_RANDOMGOODBYE_1,,,,Tak ahoj!,Farvel!,Tschüss!,,Ĝis!,¡Adiós!,,Näkemiin!,Au revoir!,,Szervusz!,Ciao!,じゃあな!,안녕!,Dag!,Adjø!,Pa!,Tchau!,,Pa!,Пока!,,Hej då!,Güle güle! +"Thanks, bye!",TXT_RANDOMGOODBYE_2,,,,"Díky, ahoj!","Tak, farvel!","Danke, tschüss!",,Dankon. Ĝis!,Gracias. ¡Adiós!,,"Kiitos, hei!","Merci, au revoir!",,"Köszi, szia!","Grazie, ciao!",どうも、じゃあ!,그렇군요. 그럼 안녕히!,"Bedankt, tot ziens!","Takk, ha det!","Dzięki, pa!",Obrigado. Até mais!,,"Merci, pa!","Спасибо, пока!",,"Tack, hej då!","Teşekkürler, güle güle!" +See you later!,TXT_RANDOMGOODBYE_3,,,,Uvidíme se později!,Vi ses senere!,Bis später!,,Ĝis la revido!,¡Nos vemos!,,Nähdään!,A plus tard!,,Később találkozunk!,Ci vediamo dopo!,また今度!,다음에 봐요!,Tot ziens!,Vi ses senere!,Do zobaczenia później!,Até logo!,,Ne vedem mai încolo!,До встречи!,,Vi ses senare!,Sonra görüşürüz! +,,Strife logs,,,,,,,,,,,,,,,,,,,,,,,,,, +"Hello? Command, a com unit has just been activated... Am receiving visuals and sound from... somebody... Hey you, get out of there now... and drop the chalice!",TXT_ILOG1,MAP33: After getting the hidden com unit in the tavern.,,,"Haló? Velení, právě byl aktivován komunikátor... příjimám obraz a zvuk od... někoho... Hej, ty, dostaň se odtaď... a zahoď ten kalich!","Hallo? Kommando, en kommunikationsenhed er lige blevet aktiveret... Jeg modtager billeder og lyd fra... en eller anden... Hey du, kom ud derfra nu... og smid bægeret!","Hallo, Kommandozentrale, eine Kommunikationseinheit wurde gerade aktiviert.... Ich empfange Bilder und Ton von... irgend jemandem... Hey, du, verschwinde da sofort... Und schmeiß den Kelch weg!",,Saluton?... Komandanto! Interfono ekagiĝis: mi ricevas bildojn kaj sonon el... iu. Hola! Eliru tuj el tie... kaj forĵetu la kalikon!,"¿Hola?... Comando, un intercomunicador acaba de ser activado: recibo imágenes y sonido de... alguien. Eh, tú, sal de ahí ahora mismo... ¡Y tira ese cáliz!",,"Haloo? Komentokeskus, äsken juuri kytkettiin päälle viestintälaite... Poimin... jonkun... videota ja ääntä... Hei sinä, häivy täältä heti paikalla... ja pudota kalkki!","Allô? Central, un communicateur à été activé.. Je recois visuel et son de.. quelqu'un.. Hé, vous, sortez de là! Et lâchez le calice!",,"Haló Központ! Egy jeladót aktiváltak...kép és hang jeleket veszek...valakitől...Hé Te ott, húzz ki onnan...és rakd le a serleget!","Pronto? Comando, un'unità di comunicazione è appena stata attivata... Sto ricevendo segnali audiovisivi da... qualcuno... Hey, tu, esci da là subito, e lascia stare quel calice!","もしもし? 司令部、comユニットが起動されました。 ...からビジュアルとサウンドを受け取っています ...誰かが...ちょっと、今そこから出て行ってください ...そして聖杯を捨ててください!","여보세요? 본부, 통신기가 막 작동되기 시작했다... 지금 어떤... 사람의 모습이 보이는데... 이봐, 거기서 당장 나와... 그리고 성배를 버려!","Hallo? Commando, een com-unit is zojuist geactiveerd.... Ontvang ik beelden en geluid van.... iemand... Hé jij, ga daar nu weg.... en laat de kelk vallen!","Hallo? Kommando, en kommunikasjonsenhet har nettopp blitt aktivert... Mottar bilder og lyd fra... noen... Hei du, kom deg ut derfra nå... og slipp begeret!","Halo? Dowództwo, jednostka komunikacyjna właśnie została aktywowana... Odbieram obraz i dźwięk od... kogoś... Hej ty, uciekaj stamtąd natychmiast... i rzuć kielich!","Alô? Comando, um comunicador acabou de ser ativado... Estou recebendo imagens e som de... alguém... Ei você, saia daí agora... e solte o cálice!",,"Alo? Centrul de comandă, o unitate tocmai a fost activată.... Primesc imagini și audio de la... cineva... Hei tu,pleacă de acolo și lasă potirul!","Алло? Штаб, передатчик только что включился... Я принимаю звук и картинку от... кого-то... Эй, ты, беги оттуда, сейчас же... и брось чашу!",,"Hallå? Kommando, en kom-enhet har just aktiverats... Får bild och ljud från... någon... Hallå där, kom ut därifrån nu... och släpp kalken!","Alo? Komuta, bir iletişim birimi az önce aktive edildi. Birinden görüntü ve ses alıyorum. Hey sen, hemen oradan çık... ve kadehi bırak!" -"Listen, this com unit tells me that you're 100% human. I've been ordered to bring you in, we're talking trust here. Betray me and pay. Oh, and by the way, you can call me Blackbird.",TXT_ILOG2,MAP02: After getting the com unit from Rowan and leaving his room.,,,"Poslyš, tento komunikátor mi říká, že jsi na sto procent člověkem. Dostala jsem rozkaz přivést tě k nám, jde o důvěryhodnou záležitost. Zraď mě a zaplatíš. Jo, a mimochodem, můžeš mi říkat Straka.","Hør, denne com-enhed fortæller mig, at du er 100% menneskelig. Jeg er blevet beordret til at bringe dig ind. Vi taler om tillid her. Forråd mig og betal. Åh, og forresten, du kan kalde mig Blackbird.","Hör zu, dieser Kommunikator sagt mit, dass du noch 100% menschlich bist. Mir wurde aufgetragen, dich zu unserer Zentrale zu führen. Wir reden über Vertrauen, wenn du mich verrätst, wirst du bezahlen. Übrigens, du kannst mich Blackbird nennen.",,"Nu, ĉi tiu interfono diras, ke vi estas centelcente homa. Mi estis ordonita lasi vin eniri, mi do fidos vin. Se vi perfidos min, vi pentos. Ha, parenteze, vi rajtas nomi min Merlo.","A ver, este intercomunicador me dice que eres 100% humano. Se me ha ordenado dejarte entrar, así que hablamos con confianza. Traicióname y te arrepentirás. Ah, por cierto, puedes llamarme Blackbird (Mirlo).","A ver, este intercomunicador me dice que eres 100% humano. Se ordenadó dejarte entrar, así que hablamos con confianza. Traicióname y te vas a arrepentir. Ah, por cierto, puedes llamarme Blackbird (Mirlo).","Kuule, tämä viestintälaite ilmaisee sinun olevan sataprosenttisesti ihminen. Minut on määrätty tuomaan sinut meidän joukkoomme; puhumme luottamuksellisesti. Petä minut ja saat luvan maksaa. Ja muuten, voit kutsua minua Blackbirdiksi.","Ecoute, ce communicateur me dit que tu est 100% humain. On m'a ordonnée de te ramener, c'est une question de confiance. Trahis-moi et tu paieras. Oh, et tu peux m'appeler Blackbird.","Figyelj, azt jelzi a jeladó, hogy 100%-ban ember vagy. Azt az utasítást kaptam ,hogy vigyelek be, de a bizalmammal játszol. Átversz és megfizetsz. Ja, és hívhatsz feketerigónak.","Ascolta, questa unità di comunicazione mi dice che sei 100% umano. Ho l'ordine di farti arrivare da noi, e quindi stiamo parlando di fiducia. Se mi tradisci la pagherai cara. Comunque, mi puoi chiamare Blackbird.","聞こえるか、この無線機がアナタは100%人間だと判断した。 +"Listen, this com unit tells me that you're 100% human. I've been ordered to bring you in, we're talking trust here. Betray me and pay. Oh, and by the way, you can call me Blackbird.",TXT_ILOG2,MAP02: After getting the com unit from Rowan and leaving his room.,,,"Poslyš, tento komunikátor mi říká, že jsi na sto procent člověkem. Dostala jsem rozkaz přivést tě k nám, jde o důvěryhodnou záležitost. Zraď mě a zaplatíš. Jo, a mimochodem, můžeš mi říkat Straka.","Hør, denne com-enhed fortæller mig, at du er 100% menneskelig. Jeg er blevet beordret til at bringe dig ind. Vi taler om tillid her. Forråd mig og betal. Åh, og forresten, du kan kalde mig Blackbird.","Hör zu, dieser Kommunikator sagt mit, dass du noch 100% menschlich bist. Mir wurde aufgetragen, dich zu unserer Zentrale zu führen. Wir reden über Vertrauen, wenn du mich verrätst, wirst du bezahlen. Übrigens, du kannst mich Blackbird nennen.",,"Nu, ĉi tiu interfono diras, ke vi estas centelcente homa. Mi estis ordonita lasi vin eniri, mi do fidos vin. Se vi perfidos min, vi pentos. Ha, parenteze, vi rajtas nomi min Merlo.","A ver, este intercomunicador me dice que eres 100% humano. Se me ha ordenado dejarte entrar, así que hablamos con confianza. Traicióname y te arrepentirás. Ah, por cierto, puedes llamarme Blackbird (Mirlo).","A ver, este intercomunicador me dice que eres 100% humano. Se ordenadó dejarte entrar, así que hablamos con confianza. Traicióname y te vas a arrepentir. Ah, por cierto, puedes llamarme Blackbird (Mirlo).","Kuule, tämä viestintälaite ilmaisee sinun olevan sataprosenttisesti ihminen. Minut on määrätty tuomaan sinut meidän joukkoomme; puhumme luottamuksellisesti. Petä minut ja saat luvan maksaa. Ja muuten, voit kutsua minua Blackbirdiksi.","Ecoute, ce communicateur me dit que tu est 100% humain. On m'a ordonnée de te ramener, c'est une question de confiance. Trahis-moi et tu paieras. Oh, et tu peux m'appeler Blackbird.",,"Figyelj, azt jelzi a jeladó, hogy 100%-ban ember vagy. Azt az utasítást kaptam ,hogy vigyelek be, de a bizalmammal játszol. Átversz és megfizetsz. Ja, és hívhatsz feketerigónak.","Ascolta, questa unità di comunicazione mi dice che sei 100% umano. Ho l'ordine di farti arrivare da noi, e quindi stiamo parlando di fiducia. Se mi tradisci la pagherai cara. Comunque, mi puoi chiamare Blackbird.","聞こえるか、この無線機がアナタは100%人間だと判断した。 私はアナタを信頼して良いとみて連れて来るよう命じられた、 反乱への報酬は期待して良いわ。ああ、それと、私の名はブラックバードよ。","잘 들어, 이 통신기에 따르면 넌 100% 인간이야. 너를 믿어도 될 거 같으니 우리 편으로 끌어모으라는 지시를 받았어. 배신했다간 대가를 치를 거야. 아, 그리고, 날 블랙버드라고 불러줘.","Luister, deze com-unit vertelt me dat je 100% menselijk bent. Ik heb opdracht gekregen om je binnen te halen, we hebben het hier over vertrouwen. Verraad me en betaal. Oh, en trouwens, je mag me Blackbird noemen.","Hør her, denne kommunikasjonsenheten forteller meg at du er 100% menneskelig. Jeg har fått ordre om å hente deg inn, vi snakker om tillit her. Forråd meg og betal. Og forresten, du kan kalle meg Blackbird.","Słuchaj, to urządzenie mówi mi, że jesteś w 100% człowiekiem. Dostałem rozkaz, żeby cię sprowadzić, mówimy tu o zaufaniu. Zdradź mnie i zapłać. Aha, i przy okazji, możesz mi mówić Blackbird.","Ouça, este comunicador me diz que você é 100% humano. Recebi ordens para te trazer até aqui. É melhor você ser de confiança. Se você me trair, você me paga. Ah, a propósito, pode me chamar de Blackbird.",,"Ascultă, unitatea asta îmi spune că ești 100% uman. Am primit ordin să te arestez. Trădează-mă și plătești. Oh, apropo, îmi poți spune Blackbird.","Слушай — судя по этому передатчику, ты на сто процентов человек. Я получила приказ показать тебе дорогу к нам. Как видишь, тебе доверяют, но если предашь меня — пожалеешь. И да, обращайся ко мне «Чёрный дрозд». ",,"Lyssna, den här kommunikationsenheten säger mig att du är 100% mänsklig. Jag har blivit beordrad att ta in dig, vi pratar om förtroende här. Förråda mig och betala. Och förresten, du kan kalla mig Blackbird.","Dinle, bu iletişim ünitesi bana senin %100 insan olduğunu söylüyor. Seni buraya getirmem emredildi, burada güvenden bahsediyoruz. Bana ihanet edersen bedelini ödersin. Bu arada, bana Karatavuk diyebilirsin." -"Listen, this com-unit tells me that you're 100% human. You might be one of us, and maybe we can try and trust each other. Consider this test, there's a flamethrower in the Governor's mansion. Get it, and I'll lead you to us.",TXT_ILOG2,MAP33: After getting the hidden com unit in the tavern.,strifeteaser,,"Poslyš, tento komunikátor mi říká, že jsi na sto procent člověkem. Mohl bys být jedním z nás a možná se můžeme pokusit navzájem si věřit. Ber tohle jako test: V guvernérově sídle je plamenomet. Najdi ho a zavedu tě k nám.","Hør, denne com-enhed fortæller mig, at du er 100% menneskelig. Du er måske en af os, og måske kan vi prøve at stole på hinanden. Overvej denne test: Der er en flammekaster i guvernørens palæ. Hent den, så fører jeg dig til os.","Hör zu, dieser Kommunikator sagt mit, dass du noch 100% menschlich bist. Du magst einer von uns sein und vielleicht können wir einander vertrauen. Betrachte dies als einen Test, da ist ein Flammenwerfer in der Villa des Gouverneurs. Hole ihn und ich führe dich zu uns.",,"Nu, ĉi tiu interfono diras, ke vi estas centelcente homa. Vi eble estas unu el ni, tial ni povus fidi nin reciproke. Mi provos vin: estas flamĵetilo en la domego de la registo; prenu ĝin kaj mi gvidos vin al ni.","A ver, este intercomunicador me dice que eres 100% humano. Podrías ser uno de nosotros y tal vez podamos intentar confiar el uno en el otro. Te pondré a prueba: hay un lanzallamas en la mansión del gobernador; cógelo y te guiaré a nosotros.","A ver, este intercomunicador me dice que eres 100% humano. Podrías ser uno de nosotros y tal vez podamos intentar confiar el uno en el otro. Te pongo a prueba: hay un lanzallamas en la mansión del gobernador; agárralo y te voy a guiar a nosotros.","Kuule, tämä viestintälaite ilmaisee sinun olevan sataprosenttisesti ihminen. Saatat olla yksi meistä, ja ehkä voimme yrittää luottaa toisiimme. Voit pitää tätä testinä: Kuvernöörin kartanossa on liekinheitin. Hanki se, ja johdatan sinut luoksemme.","Ecoute, ce communicateur me dit que tu est 100% humain. Il se peut que tu est l'un des nôtres, on pourrait se faire confiance. Considère cela comme un test. Il y a un lance-flammes dans le manoir du gouverneur. Récupère le et je te mènerai à nous.","Figyelj, azt jelzi a jeladó, hogy 100%-ban ember vagy. Talán tényleg egy vagy közülünk, és megpróbálhatunk bízni egymásban. Vedd a következőt tesztnek: kapj fel egy lángszórót a Kormányzó kúriájából. Ha megszerzed, elvezetlek hozzánk.","Ascolta, questa unità di comunicazione mi dice che sei 100% umano. Potresti essere uno di noi, e forse possiamo fidarci l'uno dell'altro. Ti metterò alla prova, c'è un lanciafiamme nel palazzo del governatore. Prendilo, e ti condurrò da noi.","聞いて、このcom-unitはあなたが100%人間だということを教えてくれます。 +"Listen, this com-unit tells me that you're 100% human. You might be one of us, and maybe we can try and trust each other. Consider this test, there's a flamethrower in the Governor's mansion. Get it, and I'll lead you to us.",TXT_ILOG2,MAP33: After getting the hidden com unit in the tavern.,strifeteaser,,"Poslyš, tento komunikátor mi říká, že jsi na sto procent člověkem. Mohl bys být jedním z nás a možná se můžeme pokusit navzájem si věřit. Ber tohle jako test: V guvernérově sídle je plamenomet. Najdi ho a zavedu tě k nám.","Hør, denne com-enhed fortæller mig, at du er 100% menneskelig. Du er måske en af os, og måske kan vi prøve at stole på hinanden. Overvej denne test: Der er en flammekaster i guvernørens palæ. Hent den, så fører jeg dig til os.","Hör zu, dieser Kommunikator sagt mit, dass du noch 100% menschlich bist. Du magst einer von uns sein und vielleicht können wir einander vertrauen. Betrachte dies als einen Test, da ist ein Flammenwerfer in der Villa des Gouverneurs. Hole ihn und ich führe dich zu uns.",,"Nu, ĉi tiu interfono diras, ke vi estas centelcente homa. Vi eble estas unu el ni, tial ni povus fidi nin reciproke. Mi provos vin: estas flamĵetilo en la domego de la registo; prenu ĝin kaj mi gvidos vin al ni.","A ver, este intercomunicador me dice que eres 100% humano. Podrías ser uno de nosotros y tal vez podamos intentar confiar el uno en el otro. Te pondré a prueba: hay un lanzallamas en la mansión del gobernador; cógelo y te guiaré a nosotros.","A ver, este intercomunicador me dice que eres 100% humano. Podrías ser uno de nosotros y tal vez podamos intentar confiar el uno en el otro. Te pongo a prueba: hay un lanzallamas en la mansión del gobernador; agárralo y te voy a guiar a nosotros.","Kuule, tämä viestintälaite ilmaisee sinun olevan sataprosenttisesti ihminen. Saatat olla yksi meistä, ja ehkä voimme yrittää luottaa toisiimme. Voit pitää tätä testinä: Kuvernöörin kartanossa on liekinheitin. Hanki se, ja johdatan sinut luoksemme.","Ecoute, ce communicateur me dit que tu est 100% humain. Il se peut que tu est l'un des nôtres, on pourrait se faire confiance. Considère cela comme un test. Il y a un lance-flammes dans le manoir du gouverneur. Récupère le et je te mènerai à nous.",,"Figyelj, azt jelzi a jeladó, hogy 100%-ban ember vagy. Talán tényleg egy vagy közülünk, és megpróbálhatunk bízni egymásban. Vedd a következőt tesztnek: kapj fel egy lángszórót a Kormányzó kúriájából. Ha megszerzed, elvezetlek hozzánk.","Ascolta, questa unità di comunicazione mi dice che sei 100% umano. Potresti essere uno di noi, e forse possiamo fidarci l'uno dell'altro. Ti metterò alla prova, c'è un lanciafiamme nel palazzo del governatore. Prendilo, e ti condurrò da noi.","聞いて、このcom-unitはあなたが100%人間だということを教えてくれます。 あなたは私たちのうちの一人であるかもしれません、 そしておそらく私たちは互いに試みて信頼することができます。 このテストを考えてください、知事の邸宅に火炎放射器があります。 それを手に入れてください","잘 들어, 이 통신기에 따르면 넌 100% 인간이야. 우리들은 너를 적극적으로 믿으니까 너도 같이 이해하고 신뢰했으면 좋겠어. 그러기 위해선 시험을 치러야 하는데, 총독의 건물 안에 화염방사기가 있어. 얻으면 우리들이 있는 곳을 알려줄게. ","Luister, deze com-unit vertelt me dat je 100% menselijk bent. Misschien bent u een van ons, en misschien kunnen we elkaar proberen te vertrouwen. Overweeg deze test, er is een vlammenwerper in het landhuis van de gouverneur. Haal het, en ik zal je naar ons toe leiden....","Denne kommunikasjonsenheten forteller meg at du er 100 % menneskelig. Du kan være en av oss, og kanskje vi kan prøve å stole på hverandre. Tenk på denne testen, det er en flammekaster i guvernørens hus. Ta den, så fører jeg deg til oss.","Słuchaj, ta jednostka mówi mi, że jesteś w 100% człowiekiem. Może jesteś jednym z nas i możemy spróbować sobie zaufać. Rozważ ten test, w rezydencji gubernatora jest miotacz ognia. Weź go, a zaprowadzę cię do nas.","Ouça, este comunicador me diz que você é 100% humano. Pode ser que você seja um de nós e talvez possamos tentar confiar um no outro. Considere isto um teste, há um lança-chamas na mansão do Governador. Entre lá e eu te guiarei até nós.",,"Ascultă, unitatea asta îmi spune că ești 100% uman. Poate putem avea încredere unii în ceilalți. Consideră acest test, e un aruncător de flăcări în complexul Guvernatorului. Ia-l, te va duce la noi.","Слушай — судя по этому передатчику, ты на сто процентов человек. Ты можешь присоединиться к нам, и мы должны доверять друг другу. Небольшое тебе испытание: в особняке губернатора есть огнемёт. Достань его, и я покажу тебе дорогу к нам.",,"Den här kommunikationsenheten säger mig att du är 100 procent mänsklig. Du kanske är en av oss och vi kanske kan försöka lita på varandra. Tänk på det här testet: Det finns en flamkastare i guvernörens herrgård. Hämta den, så leder jag dig till oss.","Dinle, bu iletişim birimi bana senin %100 insan olduğunu söylüyor. Bizden biri olabilirsin ve belki birbirimize güvenmeyi deneyebiliriz. Bu testi düşün, Vali'nin malikanesinde bir alev makinesi var. Onu al, ben de seni bize götüreyim." -Head over to the old town hall. Macil had a tunnel built that lets us get in and out without the acolytes' knowledge.,TXT_ILOG3,MAP02: On the bridge with the com unit.,,,"Zamiř ke staré radnici. Macil nechal postavit tunel, který nám dovoluje se dostat dovnitř a ven bez vědomí akolytů.","Gå over til det gamle rådhus. Macil har fået bygget en tunnel, der lader os komme ind og ud uden acolytes' viden.","Geh zum alten Rathaus. Macil hat einen Tunnel bauen lassen, durch den wir dort reinkommen, ohne dass die Ministranten das mitbekommen.",,Iru al la antikva urbodomo (Town Hall): Macil ordonis konstrui tunelon por kaj eniri kaj eliri senscie de la akolitoj.,Dirígete al antiguo ayuntamiento (Town Hall): Macil hizo construir un túnel para entrar y salir sin que los acólitos se enteren.,,"Suuntaa kohti vanhaa kaupungintaloa. Macil oli rakennuttanut tunnelin, jonka avulla voimme päästä sisään ja ulos akoluuttien tietämättä.",Dirige-toi vers l'ancienne mairie. Macil a fait construire un tunnel qui nous permet d'y entrer sans que l'Ordre nous remarque.,"Vedd az utad a régi városfalhoz. Macil épített egy föld alatti alagutat, amin keresztül a ministránsok tudta nélkül tudunk ki és be járkálni.",Raggiungi il vecchio Municipio. Macil ha fatto costruire un tunnel che ci fa entrare ed uscire senza che gli accoliti lo sappiano.,"旧市庁舎に入る。そこにはマシルがアコライトに関わる者を欺く為の +Head over to the old town hall. Macil had a tunnel built that lets us get in and out without the acolytes' knowledge.,TXT_ILOG3,MAP02: On the bridge with the com unit.,,,"Zamiř ke staré radnici. Macil nechal postavit tunel, který nám dovoluje se dostat dovnitř a ven bez vědomí akolytů.","Gå over til det gamle rådhus. Macil har fået bygget en tunnel, der lader os komme ind og ud uden acolytes' viden.","Geh zum alten Rathaus. Macil hat einen Tunnel bauen lassen, durch den wir dort reinkommen, ohne dass die Ministranten das mitbekommen.",,Iru al la antikva urbodomo (Town Hall): Macil ordonis konstrui tunelon por kaj eniri kaj eliri senscie de la akolitoj.,Dirígete al antiguo ayuntamiento (Town Hall): Macil hizo construir un túnel para entrar y salir sin que los acólitos se enteren.,,"Suuntaa kohti vanhaa kaupungintaloa. Macil oli rakennuttanut tunnelin, jonka avulla voimme päästä sisään ja ulos akoluuttien tietämättä.",Dirige-toi vers l'ancienne mairie. Macil a fait construire un tunnel qui nous permet d'y entrer sans que l'Ordre nous remarque.,,"Vedd az utad a régi városfalhoz. Macil épített egy föld alatti alagutat, amin keresztül a ministránsok tudta nélkül tudunk ki és be járkálni.",Raggiungi il vecchio Municipio. Macil ha fatto costruire un tunnel che ci fa entrare ed uscire senza che gli accoliti lo sappiano.,"旧市庁舎に入る。そこにはマシルがアコライトに関わる者を欺く為の 抜け道を用意している。",구 시청으로 향해. 오더가 이곳을 폭격한 후에 마실이 그곳에 아콜라이트들이 모르는 통행로를 만들어놨어.,Ga naar het oude stadhuis. Macil heeft een tunnel laten bouwen die ons zonder medeweten van de acolieten in en uit kan stappen.,Gå til det gamle rådhuset. Macil fikk bygget en tunnel som lar oss komme inn og ut uten at akolyttene vet om det.,"Udaj się do starego ratusza. Macil kazał wybudować tunel, który pozwoli nam wejść i wyjść bez wiedzy akolitów.",Vá até a antiga prefeitura. Macil construiu um túnel que permite que a gente entre e saia sem os acólitos perceberem.,,Du-te în vechia hală a orașului. Macil a construit un tunel care ne permite să ne deplasăm fără ca acoliții să știe.,"Отправляйся к старой ратуше. Мэйсил построил там туннель, который позволяет нам входить и выходить без ведома служителей.",,Gå till det gamla stadshuset. Macil lät bygga en tunnel som gör att vi kan ta oss in och ut utan acolytternas vetskap.,"Eski belediye binasına gidin. Macil, yardımcıların haberi olmadan girip çıkmamızı sağlayan bir tünel inşa ettirdi." -"Go through the door on your left, then the one on the right. The guard's name is Geoff. Tell him you need gold.",TXT_ILOG4,MAP02: In town hall with the com unit.,,,"Projdi dveřmi nalevo a pak napravo. Hlídač se jmenuje Geoff. Řekni mu, že potřebuješ zlato.","Gå gennem døren til venstre og derefter gennem den til højre. Vagtens navn er Geoff. Sig til ham, at du har brug for guld.","Geh durch die linke Tür, dann durch die rechte. Der Wächter heißt Geoff. Sag ihm du brauchst Gold.",,"Iru tra la maldekstra pordo kaj poste tra la dekstra. La nomo de la gardisto estas Geoff; diru al li, ke vi bezonas oron.",Ve por la puerta izquierda y luego por la derecha. El guardia se llama Geoff; dile que necesitas oro.,,"Kulje sinusta katsottuna vasemmalla puolella olevan oven läpi, sitten oikeanpuoleisesta ovesta. Vartijan nimi on Geoff. Kerro hänelle tarvitsevasi kultaa.",Passe par la porte à gauche puis celle à droite. Le garde s'appelle Geoff. Dis-lui que tu as besoin d'argent.,"Menj át a bal oldali ajtón, majd a jobb oldalin. Az őr neve Geoff. Mondd neki, hogy aranyra van szükséged.","Vai oltre la porta alla tua sinistra, e poi la porta alla tua destra. Il nome della guardia è Geoff. Digli che ti serve dell'oro.","すぐ左のドアを通り、右のドアから小部屋に入るんだ。 +"Go through the door on your left, then the one on the right. The guard's name is Geoff. Tell him you need gold.",TXT_ILOG4,MAP02: In town hall with the com unit.,,,"Projdi dveřmi nalevo a pak napravo. Hlídač se jmenuje Geoff. Řekni mu, že potřebuješ zlato.","Gå gennem døren til venstre og derefter gennem den til højre. Vagtens navn er Geoff. Sig til ham, at du har brug for guld.","Geh durch die linke Tür, dann durch die rechte. Der Wächter heißt Geoff. Sag ihm du brauchst Gold.",,"Iru tra la maldekstra pordo kaj poste tra la dekstra. La nomo de la gardisto estas Geoff; diru al li, ke vi bezonas oron.",Ve por la puerta izquierda y luego por la derecha. El guardia se llama Geoff; dile que necesitas oro.,,"Kulje sinusta katsottuna vasemmalla puolella olevan oven läpi, sitten oikeanpuoleisesta ovesta. Vartijan nimi on Geoff. Kerro hänelle tarvitsevasi kultaa.",Passe par la porte à gauche puis celle à droite. Le garde s'appelle Geoff. Dis-lui que tu as besoin d'argent.,,"Menj át a bal oldali ajtón, majd a jobb oldalin. Az őr neve Geoff. Mondd neki, hogy aranyra van szükséged.","Vai oltre la porta alla tua sinistra, e poi la porta alla tua destra. Il nome della guardia è Geoff. Digli che ti serve dell'oro.","すぐ左のドアを通り、右のドアから小部屋に入るんだ。 見張りの名はジェフ。金が必要だ と言えば通じる。","네 왼쪽의 문으로 들어간 후, 다시 오른쪽의 문으로 가. 경비의 이름은 제프야. 그에게 골드가 필요하다고 얘기해.","Ga door de deur links van je, dan de deur rechts. De bewaker heet Geoff. Zeg hem dat je goud nodig hebt.","Gå gjennom døren til venstre, så den til høyre. Vakten heter Geoff. Si at du trenger gull.","Przejdź przez drzwi po lewej, a następnie te po prawej. Strażnik ma na imię Geoff. Powiedz mu, że potrzebujesz złota.",Vá pela porta à sua esquerda e depois a da direita. O nome do guarda é Geoff. Diga a ele que você precisa de ouro.,,"Intră pe ușa din stânga, apoi cea din dreapta. Numele paznicului e Geoff. Spune-i că-ți trebuie aur.","Пройди за левую дверь, затем иди направо. Стражника зовут Джефф. Скажи ему, что тебе нужно золото.",,Gå genom dörren till vänster och sedan genom dörren till höger. Vaktens namn är Geoff. Säg till honom att du behöver guld.,"Solundaki kapıdan geç, sonra sağdakinden. Muhafızın adı Geoff. Ona altına ihtiyacın olduğunu söyle." -"Don't enter the town hall. It's not safe anymore, our cover's been blown. Kill all the big robots, the ""Crusaders"" and I'll guide you to us.",TXT_ILOG5,,strifeteaser,,"Nechoď do radnice, už není bezpečná. Byli jsme odhaleni. Zabij všechny ty velké roboty, Křižáky, a pak tě nasměruju k Macilovi.","Gå ikke ind på rådhuset. Det er ikke sikkert længere, vores dække er blevet afsløret. Dræb alle de store robotter, ""korsfarerne"", så viser jeg dig vej til os.","Geh nicht ins Rathaus. Da ist es nicht mehr sicher, unsere Tarnung ist aufgeflogen. Erledige die großen Roboter, die „Ordensritter“ und ich führe dich zu uns.",,"Ne eniru la urbodomon: ili detruis niajn kovrilojn, ĝi do ne plu estas sekura. Detruu ĉiujn robotegojn, alinome Krucistojn, kaj mi gvidos vin al ni.","No entres en el ayuntamiento: nos han descubierto, o sea que ya no es seguro. Mata a todos los robots grandes, o sea, a los Cruzados, y te guiaré a nosotros.","No entres al ayuntamiento: nos descubrieron, o sea que ya no es seguro. Mata a todos los robots grandes, o sea, a los Cruzados, y te guío a nosotros.","Älä mene kaupungintaloon. Se ei ole enää turvallista; olemme paljastuneet. Tuhoa kaikki isot robotit, ""ristiretkeläiset"", ja opastan sinut luoksemme.","N'entre pas dans la mairie, ce n'est plus sûr. Notre couverture ne marche plus. Détruis tous les gros robots, les « Croisés » et je te mènerai à nous.","Ne menj be a városházába. Már nem biztonságos, lelepleződtünk. Öldd meg az összes nagy robotot, a Kereszteseket, és elvezetlek hozzánk.","Non entrare nel municipio. Non è più sicuro, la nostra copertura è saltata. Distruggi tutti i grossi robot, i ""Crociati"", e ti condurrò a noi.","町にいるフロントへの武器供給者であるイラールの元を訪ねる。 +"Don't enter the town hall. It's not safe anymore, our cover's been blown. Kill all the big robots, the ""Crusaders"" and I'll guide you to us.",TXT_ILOG5,,strifeteaser,,"Nechoď do radnice, už není bezpečná. Byli jsme odhaleni. Zabij všechny ty velké roboty, Křižáky, a pak tě nasměruju k Macilovi.","Gå ikke ind på rådhuset. Det er ikke sikkert længere, vores dække er blevet afsløret. Dræb alle de store robotter, ""korsfarerne"", så viser jeg dig vej til os.","Geh nicht ins Rathaus. Da ist es nicht mehr sicher, unsere Tarnung ist aufgeflogen. Erledige die großen Roboter, die „Ordensritter“ und ich führe dich zu uns.",,"Ne eniru la urbodomon: ili detruis niajn kovrilojn, ĝi do ne plu estas sekura. Detruu ĉiujn robotegojn, alinome Krucistojn, kaj mi gvidos vin al ni.","No entres en el ayuntamiento: nos han descubierto, o sea que ya no es seguro. Mata a todos los robots grandes, o sea, a los Cruzados, y te guiaré a nosotros.","No entres al ayuntamiento: nos descubrieron, o sea que ya no es seguro. Mata a todos los robots grandes, o sea, a los Cruzados, y te guío a nosotros.","Älä mene kaupungintaloon. Se ei ole enää turvallista; olemme paljastuneet. Tuhoa kaikki isot robotit, ""ristiretkeläiset"", ja opastan sinut luoksemme.","N'entre pas dans la mairie, ce n'est plus sûr. Notre couverture ne marche plus. Détruis tous les gros robots, les « Croisés » et je te mènerai à nous.",,"Ne menj be a városházába. Már nem biztonságos, lelepleződtünk. Öldd meg az összes nagy robotot, a Kereszteseket, és elvezetlek hozzánk.","Non entrare nel municipio. Non è più sicuro, la nostra copertura è saltata. Distruggi tutti i grossi robot, i ""Crociati"", e ti condurrò a noi.","町にいるフロントへの武器供給者であるイラールの元を訪ねる。 彼は武器屋の隣のドアに居る。それで、知事と会う為にマシルから貰ったキーを使う。",아직 시청으로 가지 마. 우리가 발각된 상태라 위험하다고. 거대한 '크루세이더' 로봇들을 먼저 처리해. 그다음에 내가 안내해줄게.,"Ga het stadhuis niet binnen. Het is niet meer veilig, onze dekmantel is opgeblazen. Dood alle grote robots, de ""Kruisvaarders"" en ik zal je naar ons toe leiden.","Ikke gå inn i rådhuset. Det er ikke trygt lenger. Vi er avslørt. Drep alle de store robotene, ""korsfarerne"", så skal jeg lede dere til oss.","Nie wchodź do ratusza. To już nie jest bezpieczne, nasza przykrywka została zdmuchnięta. Zabij wszystkie duże roboty, ""krzyżowców"", a ja zaprowadzę cię do nas.","Não entre na prefeitura. Não é mais seguro, fomos descobertos. Mate esses robozões, os ""Cruzados"" e eu te guiarei até nós.",,"Nu intra în hala orașului. Nu mai e sigură, s-a dus acoperirea noastră. Distruge toți roboții mari, Cruciații te vor conduce la noi.","Не ходи к ратуше. Наше убежище было разгромлено, теперь там небезопасно. Перебей этих больших роботов, «крестоносцев», и я покажу тебе дорогу к нам. ",,"Gå inte in i stadshuset. Det är inte säkert längre, vår täckmantel har avslöjats. Döda alla stora robotar, ""Korsriddarna"", så ska jag guida dig till oss.","Belediye binasına girme. Artık güvenli değil, kimliğimiz açığa çıktı. Bütün büyük robotları, ""Haçlıları"" öldürün, ben de sizi bize yönlendireyim." -"The door next to the weapons shop will open once all the Crusaders are dead. Inside the store room there's a teleporter, use it, and it'll bring you to us",TXT_ILOG6,"MAP33: In front of ""Irale's shop"" with the com unit and the Crusaders dead.",strifeteaser,,"Dveře vedle obchodu se zbraněmi se otevřou když budou všichni Křižáci zničeni. Uvnitř je teleportér, použij ho a dostaneš se k nám.","Døren ved siden af våbenbutikken vil åbne sig, når alle korsfarerne er døde. Inde i lagerrummet er der en teleporter, brug den, og den vil føre dig til os.","Die Tür neben dem Waffengeschäft wird sich öffnen, wenn alle Ordensritter tot sind. Dahinter ist ein Teleporter. Benutze ihn, er bringt dich zu uns.",,Detrui la Krucistojn malfermis la pordon apud la armilvendejo. Estas teleportilo en tiu stokejo; uzu ĝin.,La puerta junto a la armería se ha abierto al matar a los cruzados. Dentro de ese almacén hay un teletransporte; úsalo.,La puerta junto a la armería se abrió al matar a los cruzados. Adentro de ese almacén hay un teletransporte; úsalo.,"Asekaupan viereinen ovi aukeaa, kun kaikki ristiretkeläiset on tuhottu. Varastohuoneessa on kaukosiirrin. Sitä käyttämällä pääset luoksemme.","La porte à côté du magasin d'armes s'ouvrira quand tous les croisés seront détruits. A l'intérieur de la salle de stockage se trouve un téléporteur, utilise-le pour nous rejoindre.","A fegyverbolt melletti ajtó ki fog nyílni, miután az összes Kresztes meghalt. Találsz a raktáron belül egy teleportot, ami ide fog hozni hozzánk.","La porta accanto al negozio delle armi si aprirà non appena tutti i Crociati sono distrutti. Oltre quella porta c'è un teletrasporto, usalo e ti porterà da noi.","私が知事について知っていることは、町の中央で双方を遊ばせてる様だ。 +"The door next to the weapons shop will open once all the Crusaders are dead. Inside the store room there's a teleporter, use it, and it'll bring you to us",TXT_ILOG6,"MAP33: In front of ""Irale's shop"" with the com unit and the Crusaders dead.",strifeteaser,,"Dveře vedle obchodu se zbraněmi se otevřou když budou všichni Křižáci zničeni. Uvnitř je teleportér, použij ho a dostaneš se k nám.","Døren ved siden af våbenbutikken vil åbne sig, når alle korsfarerne er døde. Inde i lagerrummet er der en teleporter, brug den, og den vil føre dig til os.","Die Tür neben dem Waffengeschäft wird sich öffnen, wenn alle Ordensritter tot sind. Dahinter ist ein Teleporter. Benutze ihn, er bringt dich zu uns.",,Detrui la Krucistojn malfermis la pordon apud la armilvendejo. Estas teleportilo en tiu stokejo; uzu ĝin.,La puerta junto a la armería se ha abierto al matar a los cruzados. Dentro de ese almacén hay un teletransporte; úsalo.,La puerta junto a la armería se abrió al matar a los cruzados. Adentro de ese almacén hay un teletransporte; úsalo.,"Asekaupan viereinen ovi aukeaa, kun kaikki ristiretkeläiset on tuhottu. Varastohuoneessa on kaukosiirrin. Sitä käyttämällä pääset luoksemme.","La porte à côté du magasin d'armes s'ouvrira quand tous les croisés seront détruits. A l'intérieur de la salle de stockage se trouve un téléporteur, utilise-le pour nous rejoindre.",,"A fegyverbolt melletti ajtó ki fog nyílni, miután az összes Kresztes meghalt. Találsz a raktáron belül egy teleportot, ami ide fog hozni hozzánk.","La porta accanto al negozio delle armi si aprirà non appena tutti i Crociati sono distrutti. Oltre quella porta c'è un teletrasporto, usalo e ti porterà da noi.","私が知事について知っていることは、町の中央で双方を遊ばせてる様だ。 ソイツがここいらを'マンション'と呼んでいる。",크루세이더들을 전부 처리하면 무기상 옆의 문이 열릴 거야. 그 안에 우리 기지로 통하는 텔레포터가 있으니 그걸 타.,"De deur naast de wapenwinkel gaat open als alle kruisvaarders dood zijn. In de opslagruimte staat een teleporter, gebruik die, en die brengt je naar ons toe.","Døren ved siden av våpenbutikken åpnes når alle korsfarerne er døde. Inne i lagerrommet er det en teleporter, bruk den, og den vil føre deg til oss...","Drzwi obok sklepu z bronią otworzą się, gdy wszyscy krzyżowcy będą martwi. Wewnątrz pomieszczenia ze sklepem jest teleporter, użyj go, a zaprowadzi cię do nas",A porta próxima à loja de armas abrirá assim que todos os Cruzados estiverem mortos. Dentro do depósito tem um teletransportador. Entre nele e ele o levará até nós.,,"Ușa de lângă magazinul de arme se va deschide odată ce toți Cruciații sunt morți. Înăuntru e un teleportor, ia-l, te va duce la noi.","Дверь возле оружейного магазина откроется, когда все крестоносцы будут уничтожены. На складе ты найдёшь телепорт. Используй его — он доставит тебя к нам.",,"Dörren bredvid vapenbutiken öppnas när alla korsriddare är döda. Inne i butiksrummet finns det en teleporter, använd den och den för dig till oss.","Tüm Haçlılar öldüğünde silah dükkanının yanındaki kapı açılacak. Dükkanın içinde bir ışınlayıcı var, onu kullan ve seni bize getirecek" -"The door next to the weapons shop will open once all the Crusaders are dead. Inside the store room there's a teleporter, use it, and it'll bring you to us.",TXT_ILOG7,"MAP33: In front of ""Irale's shop"" with the com unit and the Crusaders alive.",strifeteaser,,"Dveře vedle obchodu se zbraněmi se otevřou když budou všichni Křižáci zničeni. Uvnitř je teleportér, použij ho a dostaneš se k nám.","Døren ved siden af våbenbutikken åbnes, når alle korsfarerne er døde. Inde i lagerrummet er der en teleporter, brug den, og den vil bringe dig til os.","Die Tür neben dem Waffengeschäft wird sich öffnen, wenn alle Ordensritter tot sind. Dahinter ist ein Teleporter. Benutze ihn, er bringt dich zu uns.",,Detrui la Krucistojn malfermos la pordon apud la armilvendejo. Estas teleportilo en tiu stokejo; uzu ĝin.,La puerta junto a la armería se abrirá al matar a los cruzados. Dentro de ese almacén hay un teletransporte; úsalo.,La puerta junto a la armería se va a abrir al matar a los cruzados. Adentro de ese almacén hay un teletransporte; úsalo.,"Asekaupan viereinen ovi aukeaa, kun kaikki ristiretkeläiset on tuhottu. Varastohuoneessa on kaukosiirrin. Sitä käyttämällä pääset luoksemme.","La porte à côté du magasin d'armes s'ouvrira quand tous les croisés seront détruits. A l'intérieur de la salle de stockage se trouve un téléporteur, utilise-le pour nous rejoindre.","A fegyverbolt melletti ajtó ki fog nyílni, miután az összes Kresztes meghalt. Találsz a raktáron belül egy teleportot, ami ide fog hozni hozzánk.","La porta accanto al negozio delle armi si aprirà non appena tutti i Crociati sono distrutti. Oltre quella porta c'è un teletrasporto, usalo e ti porterà da noi.","私が知事について知っていることは、町の中央で双方を遊ばせてる様だ。 +"The door next to the weapons shop will open once all the Crusaders are dead. Inside the store room there's a teleporter, use it, and it'll bring you to us.",TXT_ILOG7,"MAP33: In front of ""Irale's shop"" with the com unit and the Crusaders alive.",strifeteaser,,"Dveře vedle obchodu se zbraněmi se otevřou když budou všichni Křižáci zničeni. Uvnitř je teleportér, použij ho a dostaneš se k nám.","Døren ved siden af våbenbutikken åbnes, når alle korsfarerne er døde. Inde i lagerrummet er der en teleporter, brug den, og den vil bringe dig til os.","Die Tür neben dem Waffengeschäft wird sich öffnen, wenn alle Ordensritter tot sind. Dahinter ist ein Teleporter. Benutze ihn, er bringt dich zu uns.",,Detrui la Krucistojn malfermos la pordon apud la armilvendejo. Estas teleportilo en tiu stokejo; uzu ĝin.,La puerta junto a la armería se abrirá al matar a los cruzados. Dentro de ese almacén hay un teletransporte; úsalo.,La puerta junto a la armería se va a abrir al matar a los cruzados. Adentro de ese almacén hay un teletransporte; úsalo.,"Asekaupan viereinen ovi aukeaa, kun kaikki ristiretkeläiset on tuhottu. Varastohuoneessa on kaukosiirrin. Sitä käyttämällä pääset luoksemme.","La porte à côté du magasin d'armes s'ouvrira quand tous les croisés seront détruits. A l'intérieur de la salle de stockage se trouve un téléporteur, utilise-le pour nous rejoindre.",,"A fegyverbolt melletti ajtó ki fog nyílni, miután az összes Kresztes meghalt. Találsz a raktáron belül egy teleportot, ami ide fog hozni hozzánk.","La porta accanto al negozio delle armi si aprirà non appena tutti i Crociati sono distrutti. Oltre quella porta c'è un teletrasporto, usalo e ti porterà da noi.","私が知事について知っていることは、町の中央で双方を遊ばせてる様だ。 ソイツがここいらを'マンション'と呼んでいる。",크루세이더들을 전부 처리하면 무기상 옆의 문이 열릴 거야. 그 안에 우리 기지로 통하는 텔레포터가 있으니 그걸 타.,"De deur naast de wapenwinkel gaat open als alle kruisvaarders dood zijn. In de opslagruimte staat een teleporter, gebruik die, en die brengt je naar ons toe.","Døren ved siden av våpenbutikken åpnes når alle korsfarerne er døde. Inne i lagerrommet er det en teleporter, bruk den, og den vil bringe deg til oss.","Drzwi obok sklepu z bronią otworzą się po śmierci wszystkich krzyżowców. Wewnątrz pomieszczenia sklepowego znajduje się teleporter, użyj go, a przeniesie cię do nas.",A porta próxima à loja de armas abrirá assim que todos os Cruzados estiverem mortos. Dentro do depósito tem um teletransportador. Entre nele e ele o levará até nós.,,"Ușa de lângă magazinul de arme se va deschide odată ce toți Cruciații sunt morți. Înăuntru e un teleportor, ia-l, te va duce la noi.","Дверь возле оружейного магазина откроется, когда все крестоносцы будут уничтожены. На складе ты найдёшь телепорт. Используй его — он доставит тебя к нам.",,"Dörren bredvid vapenbutiken öppnas när alla korsfarare är döda. Inne i butiksrummet finns en teleporter, använd den och den tar dig till oss.","Tüm Haçlılar öldüğünde silah dükkanının yanındaki kapı açılacak. Dükkanın içinde bir ışınlayıcı var, onu kullanın ve sizi bize getirecek." -"Kill as many of the big robots, Crusaders, as you can. When you're done, I'll guide you to Macil",TXT_ILOG8,MAP33: Room with the flamethrower.,strifeteaser,,"Znič tolik těch velkých robotů, Křižáků, kolik dokážeš. Až budeš hotov, dovedu tě k Macilovi.","Dræb så mange af de store robotter, korsfarerne, som du kan. Når du er færdig, vil jeg guide dig til Macil","Erledige so viele von den großen Robotern - „Ordensrittern“, wie möglich. Wann das erledigt ist, führe ich dich zu Macil.",,"Detruu tiom da robotegoj, alinome Krucistoj, kiom vi povas. Tiam mi gvidos vin al Macil.","Mata a tantos de los robots grandes, o sea, a los Cruzados, como puedas. Cuando termines, te guiaré hasta Macil.","Mata a tantos de los robots grandes, o sea, a los Cruzados, como puedas. Cuando termines, te guío hasta Macil.","Tuhoa jättiroboteista, ristiretkeläisistä, niin monta kuin pystyt. Kun olet valmis, opastan sinut Macilin luokse.","Détruis autant des gros robots, les croisés, que tu peux, et je te mènerai à Macil.","Ölj meg annyi nagy robotot és keresztest amennyit csak tudsz. Ha kész vagy, elvezetlek Macilhoz.","Distruggi tutti i Crociati che vedi. Non appena hai finito, ti condurrò da Macil.",,"저 거대한 '크루세이더' 로봇들을 최대한 처리해. 상황이 정리되면, 내가 너를 마실에게 데려다줄게.","Dood zoveel mogelijk van de grote robots, kruisvaarders, als je kunt. Als je klaar bent, begeleid ik je naar Macil...","Drep så mange av de store robotene, korsfarerne, som du kan. Når du er ferdig, skal jeg vise deg veien til Macil.","Zabij jak najwięcej dużych robotów, ""krzyżowców"", jak tylko możesz. Gdy skończysz, zaprowadzę cię do Macila","Mate o máximo desses robos possível. Quando terminar, eu te guiarei ao Macil.",,"Distruge cât mai mulți roboți, Cruciați, pe cât poți. Când ești gata, te voi duce la Macil.","Убей столько больших роботов, — крестоносцев, — сколько сможешь. Когда закончишь, я приведу тебя к Мэйсилу.",,"Döda så många av de stora robotarna, korsriddarna, som du kan. När du är klar kommer jag att guida dig till Macil.","Büyük robotlardan, Haçlılardan, öldürebildiğin kadarını öldür. İşiniz bittiğinde, sizi Macil'e götüreceğim." -"Go through the door, and talk to Macil.",TXT_ILOG9,MAP34: After leaving the teleporter.,strifeteaser,,Projdi dveřmi a promluv si s Macilem.,"Gå gennem døren, og tal med Macil.",Geh durch die Tür und rede mit Macil.,,Iru tra la pordo kaj parolu kun Macil.,Ve por la puerta y habla con Macil.,,Kulje ovesta ja puhu Macilille.,Traverse cette porte et va parler à Macil.,"Az ajtó mögött már vár Macil, beszélj vele.","Attraversa la porta, e vai a parlare con Macil.",ダーウィンを始末したら耳を知事に渡す。,저 문을 지나서 마실하고 대화를 해봐.,"Ga door de deur, en praat met Macil.",Gå gjennom døren og snakk med Macil.,Przejdź przez drzwi i porozmawiaj z Macil.,Passe pela porta e fale com o Macil.,,Intră pe ușă și du-te la Macil.,Обратись к Мэйсилу. Он за этой дверью.,,Gå in genom dörren och prata med Macil.,Kapıdan geçin ve Macil ile konuşun. -"Find the power tap on the mains, and shut it off. Bring something back to the Governor as proof. Find MacGuffin, and talk to him.",TXT_ILOG10,"MAP02: After accepting ""messy"" chore and leaving Mourel's room.",,,Najdi stáčedlo energie na elektrické síti a vypni jej. Přines něco guvernérovi jako důkaz. Najdi MacGuffina a promluv s ním.,"Find strømhanen på hovedledningen, og luk den. Tag noget med tilbage til guvernøren som bevis. Find MacGuffin, og tal med ham.",Finde die Stromanzapfung und schalte sie ab. Bringe einen Beweis zum Gouverneur. Finde MacGuffin und rede mit ihm. ,,"Trovu la konektilon en la elektriza sistemo, detruu ĝin kaj portu pruvon al la registo. Konsilo: Trovu Makgufinon kaj parolu kun li.","Encuentra la toma en la red eléctrica, destrúyela y llévale algo al gobernador como prueba. Para eso encuentra a MacGuffin y habla con él.",,Etsi verkkovirran piilokytkentä ja katkaise se. Tuo kuvernöörille jotain todisteeksi. Etsi MacGuffin ja puhu hänen kanssaan.,Trouve la connection pirate sur le transformateur et désactive la. Amène quelque chose au gouverneur comme preuve. Trouve MacGuffin et parle-lui.,"Keresd meg a fővonalon az áramkapcsolót, és kapcsold ki. Hozz vissza valamit a kormányzótól bizonyítékként. Keresd meg MacGuffint, és beszélj vele.","Trova l'aggeggio che sta venendo usato per rubare energia alla rete, e distruggilo. Porta dei resti al governatore come prova. Trova e parla con MacGuffin.","電力盗用の場所を見つけ、それを止める。 +"Kill as many of the big robots, Crusaders, as you can. When you're done, I'll guide you to Macil",TXT_ILOG8,MAP33: Room with the flamethrower.,strifeteaser,,"Znič tolik těch velkých robotů, Křižáků, kolik dokážeš. Až budeš hotov, dovedu tě k Macilovi.","Dræb så mange af de store robotter, korsfarerne, som du kan. Når du er færdig, vil jeg guide dig til Macil","Erledige so viele von den großen Robotern - „Ordensrittern“, wie möglich. Wann das erledigt ist, führe ich dich zu Macil.",,"Detruu tiom da robotegoj, alinome Krucistoj, kiom vi povas. Tiam mi gvidos vin al Macil.","Mata a tantos de los robots grandes, o sea, a los Cruzados, como puedas. Cuando termines, te guiaré hasta Macil.","Mata a tantos de los robots grandes, o sea, a los Cruzados, como puedas. Cuando termines, te guío hasta Macil.","Tuhoa jättiroboteista, ristiretkeläisistä, niin monta kuin pystyt. Kun olet valmis, opastan sinut Macilin luokse.","Détruis autant des gros robots, les croisés, que tu peux, et je te mènerai à Macil.",,"Ölj meg annyi nagy robotot és keresztest amennyit csak tudsz. Ha kész vagy, elvezetlek Macilhoz.","Distruggi tutti i Crociati che vedi. Non appena hai finito, ti condurrò da Macil.",,"저 거대한 '크루세이더' 로봇들을 최대한 처리해. 상황이 정리되면, 내가 너를 마실에게 데려다줄게.","Dood zoveel mogelijk van de grote robots, kruisvaarders, als je kunt. Als je klaar bent, begeleid ik je naar Macil...","Drep så mange av de store robotene, korsfarerne, som du kan. Når du er ferdig, skal jeg vise deg veien til Macil.","Zabij jak najwięcej dużych robotów, ""krzyżowców"", jak tylko możesz. Gdy skończysz, zaprowadzę cię do Macila","Mate o máximo desses robos possível. Quando terminar, eu te guiarei ao Macil.",,"Distruge cât mai mulți roboți, Cruciați, pe cât poți. Când ești gata, te voi duce la Macil.","Убей столько больших роботов, — крестоносцев, — сколько сможешь. Когда закончишь, я приведу тебя к Мэйсилу.",,"Döda så många av de stora robotarna, korsriddarna, som du kan. När du är klar kommer jag att guida dig till Macil.","Büyük robotlardan, Haçlılardan, öldürebildiğin kadarını öldür. İşiniz bittiğinde, sizi Macil'e götüreceğim." +"Go through the door, and talk to Macil.",TXT_ILOG9,MAP34: After leaving the teleporter.,strifeteaser,,Projdi dveřmi a promluv si s Macilem.,"Gå gennem døren, og tal med Macil.",Geh durch die Tür und rede mit Macil.,,Iru tra la pordo kaj parolu kun Macil.,Ve por la puerta y habla con Macil.,,Kulje ovesta ja puhu Macilille.,Traverse cette porte et va parler à Macil.,,"Az ajtó mögött már vár Macil, beszélj vele.","Attraversa la porta, e vai a parlare con Macil.",ダーウィンを始末したら耳を知事に渡す。,저 문을 지나서 마실하고 대화를 해봐.,"Ga door de deur, en praat met Macil.",Gå gjennom døren og snakk med Macil.,Przejdź przez drzwi i porozmawiaj z Macil.,Passe pela porta e fale com o Macil.,,Intră pe ușă și du-te la Macil.,Обратись к Мэйсилу. Он за этой дверью.,,Gå in genom dörren och prata med Macil.,Kapıdan geçin ve Macil ile konuşun. +"Find the power tap on the mains, and shut it off. Bring something back to the Governor as proof. Find MacGuffin, and talk to him.",TXT_ILOG10,"MAP02: After accepting ""messy"" chore and leaving Mourel's room.",,,Najdi stáčedlo energie na elektrické síti a vypni jej. Přines něco guvernérovi jako důkaz. Najdi MacGuffina a promluv s ním.,"Find strømhanen på hovedledningen, og luk den. Tag noget med tilbage til guvernøren som bevis. Find MacGuffin, og tal med ham.",Finde die Stromanzapfung und schalte sie ab. Bringe einen Beweis zum Gouverneur. Finde MacGuffin und rede mit ihm. ,,"Trovu la konektilon en la elektriza sistemo, detruu ĝin kaj portu pruvon al la registo. Konsilo: Trovu Makgufinon kaj parolu kun li.","Encuentra la toma en la red eléctrica, destrúyela y llévale algo al gobernador como prueba. Para eso encuentra a MacGuffin y habla con él.",,Etsi verkkovirran piilokytkentä ja katkaise se. Tuo kuvernöörille jotain todisteeksi. Etsi MacGuffin ja puhu hänen kanssaan.,Trouve la connection pirate sur le transformateur et désactive la. Amène quelque chose au gouverneur comme preuve. Trouve MacGuffin et parle-lui.,,"Keresd meg a fővonalon az áramkapcsolót, és kapcsold ki. Hozz vissza valamit a kormányzótól bizonyítékként. Keresd meg MacGuffint, és beszélj vele.","Trova l'aggeggio che sta venendo usato per rubare energia alla rete, e distruggilo. Porta dei resti al governatore come prova. Trova e parla con MacGuffin.","電力盗用の場所を見つけ、それを止める。 知事に渡す証拠も必要だ。マクガフィンと話をつける。",주 동력선 어딘가에 있는 추출기를 처리해. 총독에게 전할 증거물도 챙기고. 맥거핀을 찾아서 대화해 봐.,Zoek het stopcontact op het lichtnet en zet het uit. Breng iets terug naar de gouverneur als bewijs. Zoek MacGuffin en praat met hem.,"Finn strømkranen på strømnettet, og slå den av. Ta med noe tilbake til guvernøren som bevis. Finn MacGuffin, og snakk med ham.",Znajdź kurek z prądem w sieci i wyłącz go. Przynieś coś gubernatorowi jako dowód. Znajdź MacGuffina i porozmawiaj z nim.,Encontre a ligação pirata no transformador e desligue ela. Traga algo de volta para o Governador como prova. Encontre o MacGuffin e fale com ele.,,"Găsește comutatorul de energie, și oprește-l. Du ceva înapoi la Guvernator drept dovadă. Găsește-l pe MacGuffin, și vorbește cu el.",Найди нелегальное подключение к линии электропередачи и выведи его из строя. Принеси что-нибудь губернатору в качестве доказательства. Найди Макгаффина и поговори с ним.,,Leta reda på strömkranen på elnätet och stäng av den. Ta med dig något tillbaka till guvernören som bevis. Hitta MacGuffin och prata med honom.,Şebekedeki güç musluğunu bulun ve kapatın. Kanıt olarak Vali'ye bir şey getirin. MacGuffin'i bul ve onunla konuş. -"Find the power tap on the mains, and shut it off. Bring something back to the Governor as proof. Find MacGuffin, and talk to him. He's up by the sewage treatment plant, in the ""bum hole"", down the stairs.",TXT_ILOG11,"MAP02: After accepting ""messy"" chore and leaving Mourel's mansion.",,,"Najdi stáčedlo energie na elektrické síti a vypni jej. Přines něco guvernérovi jako důkaz. Najdi MacGuffina a promluv s ním. Je u čističky, v „zadnici“ pod schody.","Find strømhanen på hovedledningen, og luk den. Tag noget med tilbage til guvernøren som bevis. Find MacGuffin, og tal med ham. Han er oppe ved rensningsanlægget, i ""bum-hullet"", nede ad trappen.","Finde die Stromanzapfung und schalte sie ab. Bringe einen Beweis zum Gouverneur. Finde MacGuffin und rede mit ihm. Er ist in der Nähe der Kläranlage im „Pennerloch“, die Treppe runter.",,"Trovu la konektilon en la elektriza sistemo, detruu ĝin kaj portu pruvon al la registo. Konsilo: Trovu Makgufinon kaj parolu kun li. Li estas malsupre laŭ ŝtuparo en «la groto de la vagulo» en la purigejo de kloaka akvo.","Encuentra la toma en la red eléctrica, destrúyela y llévale algo al gobernador como prueba. Para eso encuentra a MacGuffin y habla con él. Está donde se depuran las aguas residuales en «la cueva del vagabundo» bajando unas escaleras.",,"Etsi verkkovirran piilokytkentä ja katkaise se. Tuo kuvernöörille jotain todisteeksi. Etsi MacGuffin ja puhu hänen kanssaan. Hän majailee jätelaitoksella ""pepunreiässä"" rappuset alas.","Trouve la connection pirate sur le transformateur et désactive la. Amène quelque chose au gouverneur comme preuve. Trouve MacGuffin et parle-lui. Il se trouve dans la centrale de traitement des eaux, dans le « trou à rats » en bas des escaliers.","Keresd meg a fővonalon az áramkapcsolót, és kapcsold ki. Hozz vissza valamit a kormányzótól bizonyítékként. Keresd fel MacGuffint és beszélj vele. Ott van a szennyvíz tisztítónál, ha lemész a lépcsőn, lent a ""kotorékban"".","Trova il marchingegno che sta venendo usato per rubare energia alla rete, e distruggilo. Porta dei resti al governatore come prova. Trova e parla con MacGuffin. Lui bazzica dalle parti dell'impianto fognario, oltre delle scale.","電力盗用の場所を見つけ、それを止める。 +"Find the power tap on the mains, and shut it off. Bring something back to the Governor as proof. Find MacGuffin, and talk to him. He's up by the sewage treatment plant, in the ""bum hole"", down the stairs.",TXT_ILOG11,"MAP02: After accepting ""messy"" chore and leaving Mourel's mansion.",,,"Najdi stáčedlo energie na elektrické síti a vypni jej. Přines něco guvernérovi jako důkaz. Najdi MacGuffina a promluv s ním. Je u čističky, v „zadnici“ pod schody.","Find strømhanen på hovedledningen, og luk den. Tag noget med tilbage til guvernøren som bevis. Find MacGuffin, og tal med ham. Han er oppe ved rensningsanlægget, i ""bum-hullet"", nede ad trappen.","Finde die Stromanzapfung und schalte sie ab. Bringe einen Beweis zum Gouverneur. Finde MacGuffin und rede mit ihm. Er ist in der Nähe der Kläranlage im „Pennerloch“, die Treppe runter.",,"Trovu la konektilon en la elektriza sistemo, detruu ĝin kaj portu pruvon al la registo. Konsilo: Trovu Makgufinon kaj parolu kun li. Li estas malsupre laŭ ŝtuparo en «la groto de la vagulo» en la purigejo de kloaka akvo.","Encuentra la toma en la red eléctrica, destrúyela y llévale algo al gobernador como prueba. Para eso encuentra a MacGuffin y habla con él. Está donde se depuran las aguas residuales en «la cueva del vagabundo» bajando unas escaleras.",,"Etsi verkkovirran piilokytkentä ja katkaise se. Tuo kuvernöörille jotain todisteeksi. Etsi MacGuffin ja puhu hänen kanssaan. Hän majailee jätelaitoksella ""pepunreiässä"" rappuset alas.","Trouve la connection pirate sur le transformateur et désactive la. Amène quelque chose au gouverneur comme preuve. Trouve MacGuffin et parle-lui. Il se trouve dans la centrale de traitement des eaux, dans le « trou à rats » en bas des escaliers.",,"Keresd meg a fővonalon az áramkapcsolót, és kapcsold ki. Hozz vissza valamit a kormányzótól bizonyítékként. Keresd fel MacGuffint és beszélj vele. Ott van a szennyvíz tisztítónál, ha lemész a lépcsőn, lent a ""kotorékban"".","Trova il marchingegno che sta venendo usato per rubare energia alla rete, e distruggilo. Porta dei resti al governatore come prova. Trova e parla con MacGuffin. Lui bazzica dalle parti dell'impianto fognario, oltre delle scale.","電力盗用の場所を見つけ、それを止める。 知事に渡す証拠も必要だ。マクガフィンと話をつける。 彼は下水処理場の傍にある'物乞いの巣'と呼ばれる場所にいる。",주 동력선 어딘가에 있는 추출기를 처리해. 총독에게 전할 증거물도 챙기고. 맥거핀을 찾아서 대화해 봐. 그는 하수처리장 근처 계단 밑 개구멍에 있어.,"Zoek het stopcontact op het lichtnet en zet het uit. Breng iets terug naar de gouverneur als bewijs. Zoek MacGuffin en praat met hem. Hij is boven bij de rioolwaterzuiveringsinstallatie, in het ""zwerfgat"", de trap af.","Finn strømbryteren på strømnettet, og slå den av. Ta med noe tilbake til guvernøren som bevis. Finn MacGuffin og snakk med ham. Han er oppe ved kloakkrenseanlegget, i ""rumpehullet"", ned trappen.","Znajdź kurek z prądem w sieci i wyłącz go. Zanieś coś gubernatorowi jako dowód. Znajdź MacGuffina i porozmawiaj z nim. Jest przy oczyszczalni ścieków, w ""dziurze"", po schodach.","Encontre a ligação pirata no transformador e desligue ela. Traga algo de volta para o Governador como prova. Encontre o MacGuffin e fale com ele. Ele está na usina de tratamento, na ""toca de rato"" descendo as escadas.",,"Găsește comutatorul de energie, și oprește-l. Du ceva înapoi la Guvernator drept dovadă. Găsește-l pe MacGuffin, și vorbește cu el, e lângă fabrica de tratament, în josul scărilor.","Найди нелегальное подключение к линии электропередачи и выведи его из строя. Принеси что-нибудь губернатору в качестве доказательства. Найди Макгаффина и поговори с ним. Он возле очистного сооружения, в «бомжевой норе», вниз по лестнице.",,"Leta reda på eluttaget på elnätet och stäng av det. Ta med dig något tillbaka till guvernören som bevis. Hitta MacGuffin och prata med honom. Han är uppe vid reningsverket, i ""bum-hålet"", nerför trappan.","Şebekedeki güç musluğunu bulun ve kapatın. Kanıt olarak Vali'ye bir şey getir. MacGuffin'i bul ve onunla konuş. Kanalizasyon arıtma tesisinin yanında, merdivenlerin aşağısındaki ""serseri deliğinde""." -"You idiot! You've shut off the power to the jamming circuits we use to conceal our base from the Order. Head to the town hall and take out the scanning crew, now! Then, go back to the Governor and give him the broken coupling.",TXT_ILOG13,MAP02: After destroying Front's power coupling.,,,"Ty debile! Odstřihnul jsi přívod proudu do rušiček, které používáme, abychom ukryli naší základnu před Řádem. Okamžitě si to zamiř k radnici a vybij průzkumnou četu! Pak se vrať ke guvernérovi a dej mu rozbitou spojku.","Din idiot! Du har slukket for strømmen til de støjkredsløb, som vi bruger til at skjule vores base for Ordenen. Gå hen til rådhuset og udryd scanningsholdet, nu! Gå derefter tilbage til guvernøren og giv ham den ødelagte kobling.","Du Idiot! Du hast die Energie für unsere Störsender unterbrochen, mit denen wir unsere Basis vor dem Orden verborgen haben. Geh schnell zum Rathaus und schalte den Suchtrupp aus. Geh danach zum Gouverneur und gib ihm den zerstörten Stromabnehmer.",,"Vi rompis la kuplilon, kiu kaŝis nian bazon de La Ordeno. Reiru al la urbodomo kaj mortigu la skoltojn. Tiam reiru ĉe la registo kaj donu al li la kuplilon, kiun vi rompis.",Has roto el acoplador que le ocultaba nuestra base a La Orden. Dirígete al ayuntamiento y elimina a la tropa de reconocimiento. Luego vuelve con el gobernador y dale el acoplador que has roto.,Rompiste el acoplador que le ocultaba nuestra base a La Orden. Dirígete al ayuntamiento y elimina a la tropa de reconocimiento. Luego vuelve con el gobernador y dale el acoplador que rompiste.,"Sinä idiootti! Olet katkaissut virran häirintäpiireihin, joilla piilotamme sijaintimme Veljeskunnalta. Suuntaa kaupungintalolle ja hoitele tiedusteluryhmä, heti paikalla! Palaa sitten kuvernöörin luo ja anna rikkinäinen virtaliitin hänelle.",Idiot! Tu as désactivé les circuits brouilleurs qui cachaient notre base des senseurs de l'Ordre. Retourne vite à la mairie et tue l'équipe de scan maintenant! Retourne ensuite au gouverneur et donne lui le coupleur cassé.,"Te idióta! Leállítottad a zavaró áramellátását, amivel lerejtjük magunkat a Rend elől. Menj azonnal a városházára, és iktasd ki a felderítő brigádot! Aztán menj vissza a kormányzóhoz, és add át az elrontott kapcsolóművet.","Idiota! Hai interrotto il flusso di energia dei circuiti che usavamo per nascondere la nostra base dall'Ordine. Ritorna subito al municipio e fai fuori il gruppo venuto a perlustare la zona, ora! Poi, torna dal governatore e dagli questo pezzo di ferraglia.","馬鹿者! お前はオーダーから我々の基地を隠す妨害回路を +"You idiot! You've shut off the power to the jamming circuits we use to conceal our base from the Order. Head to the town hall and take out the scanning crew, now! Then, go back to the Governor and give him the broken coupling.",TXT_ILOG13,MAP02: After destroying Front's power coupling.,,,"Ty debile! Odstřihnul jsi přívod proudu do rušiček, které používáme, abychom ukryli naší základnu před Řádem. Okamžitě si to zamiř k radnici a vybij průzkumnou četu! Pak se vrať ke guvernérovi a dej mu rozbitou spojku.","Din idiot! Du har slukket for strømmen til de støjkredsløb, som vi bruger til at skjule vores base for Ordenen. Gå hen til rådhuset og udryd scanningsholdet, nu! Gå derefter tilbage til guvernøren og giv ham den ødelagte kobling.","Du Idiot! Du hast die Energie für unsere Störsender unterbrochen, mit denen wir unsere Basis vor dem Orden verborgen haben. Geh schnell zum Rathaus und schalte den Suchtrupp aus. Geh danach zum Gouverneur und gib ihm den zerstörten Stromabnehmer.",,"Vi rompis la kuplilon, kiu kaŝis nian bazon de La Ordeno. Reiru al la urbodomo kaj mortigu la skoltojn. Tiam reiru ĉe la registo kaj donu al li la kuplilon, kiun vi rompis.",Has roto el acoplador que le ocultaba nuestra base a La Orden. Dirígete al ayuntamiento y elimina a la tropa de reconocimiento. Luego vuelve con el gobernador y dale el acoplador que has roto.,Rompiste el acoplador que le ocultaba nuestra base a La Orden. Dirígete al ayuntamiento y elimina a la tropa de reconocimiento. Luego vuelve con el gobernador y dale el acoplador que rompiste.,"Sinä idiootti! Olet katkaissut virran häirintäpiireihin, joilla piilotamme sijaintimme Veljeskunnalta. Suuntaa kaupungintalolle ja hoitele tiedusteluryhmä, heti paikalla! Palaa sitten kuvernöörin luo ja anna rikkinäinen virtaliitin hänelle.",Idiot! Tu as désactivé les circuits brouilleurs qui cachaient notre base des senseurs de l'Ordre. Retourne vite à la mairie et tue l'équipe de scan maintenant! Retourne ensuite au gouverneur et donne lui le coupleur cassé.,,"Te idióta! Leállítottad a zavaró áramellátását, amivel lerejtjük magunkat a Rend elől. Menj azonnal a városházára, és iktasd ki a felderítő brigádot! Aztán menj vissza a kormányzóhoz, és add át az elrontott kapcsolóművet.","Idiota! Hai interrotto il flusso di energia dei circuiti che usavamo per nascondere la nostra base dall'Ordine. Ritorna subito al municipio e fai fuori il gruppo venuto a perlustare la zona, ora! Poi, torna dal governatore e dagli questo pezzo di ferraglia.","馬鹿者! お前はオーダーから我々の基地を隠す妨害回路を 壊してしまった!市庁舎に調査隊が向かった、今すぐ片付けろ! ",이 멍청이야! 우리 기지를 오더로부터 은폐시켜주는 교란 장치의 동력을 끊어버렸잖아. 당장 시청으로 가서 탐색반들을 쓸어버려! 그다음에 총독에게 부서진 장치를 전해줘.,Idioot! Je hebt de stroom naar de stoorcircuits die we gebruiken om onze basis te verbergen voor de orde uitgeschakeld. Ga naar het stadhuis en haal de scanploeg er nu uit! Ga dan terug naar de Gouverneur en geef hem de kapotte koppeling.,"Din idiot! Du har slått av strømmen til blokkeringskretsene vi bruker for å skjule basen vår for Ordenen. Dra til rådhuset og drep skannermannskapet, nå! Gå tilbake til guvernøren og gi ham den ødelagte koblingen.","Ty idioto! Wyłączyłeś zasilanie obwodów zagłuszających, których używamy do ukrycia naszej bazy przed Zakonem. Idź do ratusza i zlikwiduj ekipę skanującą, natychmiast! Potem wróć do gubernatora i daj mu zepsute złącze.",Seu idiota! Você desligou a energia para os circuitos de interferência que usamos para esconder a nossa base dos sensores da Ordem. Vá até a prefeitura e tire a equipe de busca de lá imediatamente! Depois disso volte para o Governador e passe pra ele a conexão quebrada.,,"Idiotule! Ai oprit curentul circuitelor noastre care ne mascau prezența. Du-te în hala orașului și elimină echipajul! Apoi, du-te la Guvernator și dă-i cuplajul!","Идиот! Ты обесточил генератор радиопомех, с помощью которого мы скрывали местоположение нашей базы от Ордена. Возвращайся к ратуше и уничтожь разведывательную группу как можно скорее! Затем вернись к губернатору и отдай ему повреждённую муфту.",,"Din idiot! Du har stängt av strömmen till de störningskretsar som vi använder för att dölja vår bas för Orden. Gå till stadshuset och ta ut skanningspersonalen, nu! Gå sedan tillbaka till guvernören och ge honom den trasiga kopplingen.","Seni aptal! Üssümüzü Tarikat'tan gizlemek için kullandığımız sinyal bozucu devrelerin gücünü kestin. Belediye binasına git ve tarama ekibini yok et, hemen! Sonra Vali'ye geri dön ve ona kırık bağlantıyı ver." -"OK, ""Trust no one"" is the name of the game! Let's get that prison pass from the Governor. Take the broken coupling to him.",TXT_ILOG14,MAP02: After destroying Front's power coupling and killing all blue acolytes in the town hall.,,,"Dobře, „Nevěř nikomu“ je motto hry! Pojďme od guvernéra dostat tu propustku a osvoboďme ty vězně. Přines mu rozbitou spojku.","Okay, ""Stol ikke på nogen"" er spillets navn! Lad os få det fængselskort fra guvernøren. Tag den ødelagte kobling med til ham.","Ok, „Trau keinem“ heißt dieses Spiel. Lass uns den Gefängnispass vom Gouverneur holen. Bring ihm den Stromabnehmer.",,"Bone, la ludo estas «Fidu neniun»! Ni akiru la enirpermeson al la malliberejo: donu la rompitan kuplilon al la registo.","Vale, ¡«No te fies de nadie» se llama el juego! Ya es hora de conseguir el pase a la prisión: llévale el acoplador roto al gobernador.","Bueno, ¡«No confíes en nadie» se llama el juego! Ya es hora de conseguir el pase a la prisión: llévale el acoplador roto al gobernador.","Selvä, ""Älä luota kehenkään"" on näköjään pelin nimi! Hankitaan vankilan pääsylupa kuvernööriltä. Vie rikkinäinen virtaliitin hänelle.","Ok, « ne fais confiance à personne » est notre nouveau slogan. On va récupérer le passe de la prison chez le gouverneur. Amène lui le coupleur cassé.","Készülj fel, hogy senkiben sem bízhatsz. Gyerünk, szerezzük meg a kormányzótól a börtön belépőt. Vidd el hozzá az elrontott kapcsolóművet.","OK, ""Non fidarti di nessuno"" è il gioco che stiamo giocando qua! Prendiamo quel pass per la prigione dal governatore. Portagli quel pezzo di ferraglia.","よし、'信用しない'のが最も重要なことだ! +"OK, ""Trust no one"" is the name of the game! Let's get that prison pass from the Governor. Take the broken coupling to him.",TXT_ILOG14,MAP02: After destroying Front's power coupling and killing all blue acolytes in the town hall.,,,"Dobře, „Nevěř nikomu“ je motto hry! Pojďme od guvernéra dostat tu propustku a osvoboďme ty vězně. Přines mu rozbitou spojku.","Okay, ""Stol ikke på nogen"" er spillets navn! Lad os få det fængselskort fra guvernøren. Tag den ødelagte kobling med til ham.","Ok, „Trau keinem“ heißt dieses Spiel. Lass uns den Gefängnispass vom Gouverneur holen. Bring ihm den Stromabnehmer.",,"Bone, la ludo estas «Fidu neniun»! Ni akiru la enirpermeson al la malliberejo: donu la rompitan kuplilon al la registo.","Vale, ¡«No te fies de nadie» se llama el juego! Ya es hora de conseguir el pase a la prisión: llévale el acoplador roto al gobernador.","Bueno, ¡«No confíes en nadie» se llama el juego! Ya es hora de conseguir el pase a la prisión: llévale el acoplador roto al gobernador.","Selvä, ""Älä luota kehenkään"" on näköjään pelin nimi! Hankitaan vankilan pääsylupa kuvernööriltä. Vie rikkinäinen virtaliitin hänelle.","Ok, « ne fais confiance à personne » est notre nouveau slogan. On va récupérer le passe de la prison chez le gouverneur. Amène lui le coupleur cassé.",,"Készülj fel, hogy senkiben sem bízhatsz. Gyerünk, szerezzük meg a kormányzótól a börtön belépőt. Vidd el hozzá az elrontott kapcsolóművet.","OK, ""Non fidarti di nessuno"" è il gioco che stiamo giocando qua! Prendiamo quel pass per la prigione dal governatore. Portagli quel pezzo di ferraglia.","よし、'信用しない'のが最も重要なことだ! 壊れた配電機を渡して刑務所の許可証を知事から貰うんだ。","좋아, '아무도 믿지 말라'가 이 게임의 이름이겠군! 어서 총독에게 감옥 통행증이나 받자. 이 부서진 장치를 그에게 전해줘.","OK, ""Vertrouw niemand"" is de naam van het spel! Laten we die gevangenispas van de Gouverneur halen. Pak de kapotte koppeling naar hem toe.","OK, ""Stol ikke på noen"" er navnet på spillet! La oss få fengselspasset fra guvernøren. Gi ham den ødelagte koblingen.","OK, ""Nie ufaj nikomu"" to nazwa gry! Zdobądźmy tę przepustkę od Gubernatora. Zanieś mu zepsute złącze.","Ok, ""não confie em ninguém"" é o nome do jogo! Vamos pegar do Governador aquele passe da prisão. Leve a conexão quebrada a ele.",,"OK, 'Încrede-te în nimeni' e numele jocului. Să luam permisul închisorii de la Guvernator. Ia cuplajul defect și du-l lui.","Что ж, эта игра называется «не верь никому»! Давай получим у губернатора пропуск в тюрьму. Отнеси ему повреждённую муфту.",,"Okej, ""Lita inte på någon"" är vad som gäller! Låt oss få fängelsepasset från guvernören. Ta den trasiga kopplingen till honom.","Tamam, ""Kimseye güvenme"" oyunun adı! Vali'den şu hapishane kartını alalım. Kırık bağlantıyı ona götür." -Good move! The Governor is a liar. That's our power coupling. We're using it to hide the base from the Order. Take this broken coupling back to him and let's get that pass.,TXT_ILOG15,MAP02: After finding the broken power coupling.,,,"Dobrý tah! Guvernér je lhář, tohle je naše spojka. Používáme ji k ukrytí základny před Řádem. Přines mu tuhle rozbitou spojku a vezmi si od něj tu propustku.","Godt træk! Guvernøren er en løgner. Det er vores kraftkobling. Vi bruger den til at skjule basen for Ordenen. Tag den ødelagte kobling med tilbage til ham, og lad os få det pas.",Das war klasse! Der Gouverneur ist ein verdammter Lügner. Das war unsere Anzapfung. Wir benutzen sie um unsere Basis vor dem Orden zu verstecken. Und nun bring ihm den Stromabnehmer und hol den Gefängnispass.,,"La registo estas mensogema: tiu estis la kuplilo, kiu kaŝas nian bazon de La Ordeno. Donu al li la rompitan kuplilon por akiri la enirpermeson.",El gobernador es un mentiroso: ese era el acoplador de energía que le oculta nuestra base a La Orden. Llévale el acoplador roto para conseguir ese pase.,,"Hyvä veto! Kuvernööri on valehtelija. Se on meidän virtaliittimemme. Käytämme sitä piillottamaan tukikohtamme Veljeskunnalta. Toimita tämä rikkinäinen virtaliitin takaisin hänelle, ja hankitaan se pääsylupa.",Bonne idée! Le gouverneur est un menteur. Voilà notre coupleur. On l'utilise pour dissimuler notre présence à l'Ordre. Amène ce coupleur cassé à lui et récupère le passe.,"Ügyes lépés! A kormányzó egy hazug senkiházi. Ez a mi kapcsolóművünk. Arra használjuk, hogy elrejtsük a bázisunkat a Rend elől. Vidd vissza neki a tönkrevágott kapcsolóművet, és irány megszerezni a belépőt.","Ottima mossa! Il governatore è un bugiardo. Eravamo noi a utilizzare questo marchingegno collegato alla rete. Lo stiamo usando per nascondere la posizione della nostra base dall'Ordine. Prendi quest'altro rotto e vecchio e portalo da lui, e prendiamoci quel pass.","良い判断だ! 知事は嘘を付いている。 +Good move! The Governor is a liar. That's our power coupling. We're using it to hide the base from the Order. Take this broken coupling back to him and let's get that pass.,TXT_ILOG15,MAP02: After finding the broken power coupling.,,,"Dobrý tah! Guvernér je lhář, tohle je naše spojka. Používáme ji k ukrytí základny před Řádem. Přines mu tuhle rozbitou spojku a vezmi si od něj tu propustku.","Godt træk! Guvernøren er en løgner. Det er vores kraftkobling. Vi bruger den til at skjule basen for Ordenen. Tag den ødelagte kobling med tilbage til ham, og lad os få det pas.",Das war klasse! Der Gouverneur ist ein verdammter Lügner. Das war unsere Anzapfung. Wir benutzen sie um unsere Basis vor dem Orden zu verstecken. Und nun bring ihm den Stromabnehmer und hol den Gefängnispass.,,"La registo estas mensogema: tiu estis la kuplilo, kiu kaŝas nian bazon de La Ordeno. Donu al li la rompitan kuplilon por akiri la enirpermeson.",El gobernador es un mentiroso: ese era el acoplador de energía que le oculta nuestra base a La Orden. Llévale el acoplador roto para conseguir ese pase.,,"Hyvä veto! Kuvernööri on valehtelija. Se on meidän virtaliittimemme. Käytämme sitä piillottamaan tukikohtamme Veljeskunnalta. Toimita tämä rikkinäinen virtaliitin takaisin hänelle, ja hankitaan se pääsylupa.",Bonne idée! Le gouverneur est un menteur. Voilà notre coupleur. On l'utilise pour dissimuler notre présence à l'Ordre. Amène ce coupleur cassé à lui et récupère le passe.,,"Ügyes lépés! A kormányzó egy hazug senkiházi. Ez a mi kapcsolóművünk. Arra használjuk, hogy elrejtsük a bázisunkat a Rend elől. Vidd vissza neki a tönkrevágott kapcsolóművet, és irány megszerezni a belépőt.","Ottima mossa! Il governatore è un bugiardo. Eravamo noi a utilizzare questo marchingegno collegato alla rete. Lo stiamo usando per nascondere la posizione della nostra base dall'Ordine. Prendi quest'altro rotto e vecchio e portalo da lui, e prendiamoci quel pass.","良い判断だ! 知事は嘘を付いている。 あれはオーダーから基地を隠す為に使用している我々の配電機だ。 この壊れた配電機を渡して奴を騙し返せ。",참 잘했어! 총독이 거짓말을 했군. 이건 우리의 동력 장치야. 이걸 써서 우리 기지를 오더로부터 은폐시켜주지. 여기 있는 고장 난 장치를 전해주고 통행증이나 받자.,Goede zet! De Gouverneur is een leugenaar. Dat is onze stroomkoppeling. We gebruiken het om de basis te verbergen voor de Orde. Neem deze kapotte koppeling terug naar hem en laten we die pass pakken.,Godt trekk! Guvernøren er en løgner. Det er kraftkoblingen vår. Vi bruker den til å skjule basen for Ordenen. Ta denne ødelagte koblingen tilbake til ham og la oss få det passet.,"Dobry ruch! Gubernator to kłamca. To jest nasze sprzęgło mocy. Używamy go, by ukryć bazę przed Zakonem. Zabierz mu to zepsute sprzęgło i zdobądźmy tę przepustkę.",Boa! O Governador é um mentiroso . Essa é a nossa conexão. Vamos usá-la para esconder a base da Ordem. Leve esta conexão danificada de volta a ele e vamos pegar o passe.,,"Bună mutare! Guvernatorul e un mincins. Acela e cuplajul nostru. Îl folosim pentru a ne ascunde baza de Ordin. Ia cuplajul ăsta defect și du-l înapoi lui, să luăm permisul.","Отличный ход! Губернатор — лжец. Это наше подключение к силовой линии. Мы используем его, чтобы скрывать местоположение нашей базы от Ордена. Отнеси повреждённую муфту губернатору и получи пропуск.",,Bra gjort! Guvernören är en lögnare. Det är vår kraftkoppling. Vi använder den för att dölja basen för orden. Ta tillbaka den trasiga kopplingen till honom och låt oss få det där passet.,İyi hamle! Vali bir yalancı. Bu bizim güç bağlantımız. Üssü Tarikat'tan saklamak için kullanıyoruz. Bu kırık bağlantıyı ona geri götür ve şu geçiş iznini alalım. -Use the Warden's key to get into the prison cell blocks and find a way to free the prisoners.,TXT_ILOG18,MAP05: After crossing the alarm green door.,,,"Použij dozorcův klíč k dostání se do bloku s celami a najdi způsob, jak osvobodit vězně.",Brug fængselsdirektørens nøgle til at komme ind i fængselscelleblokkene og find en måde at befri fangerne på.,"Benutze den Schlüssel des Direktors um in die Zellenblöcke zu kommen und finde heraus, wie man die Gefangenen befreien kann.",,Uzu la ŝlosilon de la provoso por atingi la ĉelaron kaj trovu manieron liberigi la kaptitojn.,Usa la llave del carcelero para llegar a la galería y encuentra una forma de liberar a los prisioneros.,,Käytä vankilanjohtajan avainta päästäksesi vankilan selliosastoille ja keksi keino vapauttaa vangit.,Utilise la clé du gardien pour entrer dans le bloc de cellules et trouver une manière de libérer les prisonniers.,"Használd az igazgató kulcsát, hogy bejuss a börtön részlegbe, és kiszíbadíts mindenkit.",Usa la chiave del direttore per entrare nella sezione delle celle e trovare un modo per liberare i prigionieri.,"ワーデンの鍵で刑務所の独房区域に入って +Use the Warden's key to get into the prison cell blocks and find a way to free the prisoners.,TXT_ILOG18,MAP05: After crossing the alarm green door.,,,"Použij dozorcův klíč k dostání se do bloku s celami a najdi způsob, jak osvobodit vězně.",Brug fængselsdirektørens nøgle til at komme ind i fængselscelleblokkene og find en måde at befri fangerne på.,"Benutze den Schlüssel des Direktors um in die Zellenblöcke zu kommen und finde heraus, wie man die Gefangenen befreien kann.",,Uzu la ŝlosilon de la provoso por atingi la ĉelaron kaj trovu manieron liberigi la kaptitojn.,Usa la llave del carcelero para llegar a la galería y encuentra una forma de liberar a los prisioneros.,,Käytä vankilanjohtajan avainta päästäksesi vankilan selliosastoille ja keksi keino vapauttaa vangit.,Utilise la clé du gardien pour entrer dans le bloc de cellules et trouver une manière de libérer les prisonniers.,,"Használd az igazgató kulcsát, hogy bejuss a börtön részlegbe, és kiszíbadíts mindenkit.",Usa la chiave del direttore per entrare nella sezione delle celle e trovare un modo per liberare i prigionieri.,"ワーデンの鍵で刑務所の独房区域に入って 囚人を解放する方法を見つける。","간수장의 열쇠를 써서 감옥 안으로 진입하고, 수감자들을 풀어줄 방법을 찾아봐.",Gebruik de sleutel van de bewaker om in de celblokken van de gevangenis te komen en een manier te vinden om de gevangenen te bevrijden.,Bruk direktørens nøkkel til å komme inn i fengselsblokkene og finn en måte å befri fangene på.,"Użyj klucza naczelnika, aby dostać się do bloków więziennych i znajdź sposób na uwolnienie więźniów.",Use a chave do Carcereiro para entrar nos blocos de celas e ache uma maneira de libertar os prisioneiros.,,Folosește cheia Directorului pentru a intra în blocurile celulelor și găsește o cale să eliberezi prizonierii.,"Используй ключ тюремщика, чтобы пройти к камерам. Найди способ освободить пленников.",,Använd direktörens nyckel för att ta dig in i fängelsecellblocken och hitta ett sätt att befria fångarna.,Hapishane hücre bloklarına girmek için Müdür'ün anahtarını kullan ve mahkumları serbest bırakmanın bir yolunu bul. -Find a way to free the prisoners. Find a way to open the hand scanner switch.,TXT_ILOG19,MAP05: After getting to Main Control.,,,"Najdi způsob, jak osvobodit vězně. Najdi způsob, jak aktivovat skener otisků ruky.",Find en måde at befri fangerne på. Find en måde at åbne håndscannerkontakten.,"Finde heraus, wie man die Gefangenen befreien kann und wie du den Handscanner umgehen kannst.",,Trovu manieron agigi la manskanilon por liberigi la kaptitojn.,Encuentra como activar el escáner de mano para liberar a los prisioneros.,,Etsi keino vapauttaa vangit. Ratkaise tapa avata kädenjälkilukijan lukitus.,Trouve un moyen de libérer les prisonniers. Trouve une manière d'activer le scanner à empreinte digitale.,"Találd meg a módját, hogyan szabadíthatjuk ki a rabokat, és hogyan játszhatjuk ki a kézlenyomat olvasót.",Trova un modo per liberare i prigionieri. Trova un modo per attivare lo scanner della mano.,"囚人を解放する方法を見つける。 +Find a way to free the prisoners. Find a way to open the hand scanner switch.,TXT_ILOG19,MAP05: After getting to Main Control.,,,"Najdi způsob, jak osvobodit vězně. Najdi způsob, jak aktivovat skener otisků ruky.",Find en måde at befri fangerne på. Find en måde at åbne håndscannerkontakten.,"Finde heraus, wie man die Gefangenen befreien kann und wie du den Handscanner umgehen kannst.",,Trovu manieron agigi la manskanilon por liberigi la kaptitojn.,Encuentra como activar el escáner de mano para liberar a los prisioneros.,,Etsi keino vapauttaa vangit. Ratkaise tapa avata kädenjälkilukijan lukitus.,Trouve un moyen de libérer les prisonniers. Trouve une manière d'activer le scanner à empreinte digitale.,,"Találd meg a módját, hogyan szabadíthatjuk ki a rabokat, és hogyan játszhatjuk ki a kézlenyomat olvasót.",Trova un modo per liberare i prigionieri. Trova un modo per attivare lo scanner della mano.,"囚人を解放する方法を見つける。 ハンドスキャナーを開く方法を見つける。",수감자들을 풀어줄 방법을 찾자. 지문인식장치를 통과할 방법을 찾아봐.,Zoek een manier om de gevangenen te bevrijden. Zoek een manier om de handscanner schakelaar te openen.,Finn en måte å befri fangene på. Finn en måte å åpne håndskannerbryteren på.,Znajdź sposób na uwolnienie więźniów. Znajdź sposób na otwarcie przełącznika skanera ręcznego.,Encontre uma maneira de libertar os prisioneiros. Ache uma maneira de abrir o scanner de mão.,,Găsește o cale să eliberezi prizonierii. Găsește o cale să deschizi comutatorul scanner-ului de mâini.,Найди способ освободить пленников. Найди способ открыть замок со сканером отпечатка руки.,,Hitta ett sätt att befria fångarna. Hitta ett sätt att öppna handskanneromkopplaren.,Mahkûmları serbest bırakmanın bir yolunu bul. El tarayıcı anahtarını açmanın bir yolunu bulun. -Find a way to free the prisoners. Use the judge's hand to operate the hand scanner switch.,TXT_ILOG20,MAP05: After cutting Wolenick's hand off.,,,"Najdi způsob, jak osvobodit vězně. Použij soudcovu ruku k aktivaci skeneru otisků ruky.",Find en måde at befri fangerne på. Brug dommerens hånd til at betjene håndscannerkontakten.,"Finde heraus, wie man die Gefangenen befreien kann. Benutze die Hand des Richters um den Handscannerschalter zu betätigen.",,Uzu la manon de la juĝisto por agigi la skanilon kaj liberigi la kaptitojn.,Usa la mano del juez para activar el escáner y liberar a los prisioneros.,,Etsi keino vapauttaa vangit. Käytä tuomarin kättä kädenjälkilukijaan.,Trouve un moyen de libérer les prisonniers. Utilise la main du juge pour activer le scanner à empreinte digitale.,"Találd meg a módját, hogyan szabadíthatjuk ki a rabokat, használd a bíró kezét a kézleolvasóhoz.",Trova un modo per liberare i prigionieri. Usa la mano del giudice per operare lo scanner.,"囚人を解放する方法を見つける。 +Find a way to free the prisoners. Use the judge's hand to operate the hand scanner switch.,TXT_ILOG20,MAP05: After cutting Wolenick's hand off.,,,"Najdi způsob, jak osvobodit vězně. Použij soudcovu ruku k aktivaci skeneru otisků ruky.",Find en måde at befri fangerne på. Brug dommerens hånd til at betjene håndscannerkontakten.,"Finde heraus, wie man die Gefangenen befreien kann. Benutze die Hand des Richters um den Handscannerschalter zu betätigen.",,Uzu la manon de la juĝisto por agigi la skanilon kaj liberigi la kaptitojn.,Usa la mano del juez para activar el escáner y liberar a los prisioneros.,,Etsi keino vapauttaa vangit. Käytä tuomarin kättä kädenjälkilukijaan.,Trouve un moyen de libérer les prisonniers. Utilise la main du juge pour activer le scanner à empreinte digitale.,,"Találd meg a módját, hogyan szabadíthatjuk ki a rabokat, használd a bíró kezét a kézleolvasóhoz.",Trova un modo per liberare i prigionieri. Usa la mano del giudice per operare lo scanner.,"囚人を解放する方法を見つける。 裁判官の手を使用してハンドスキャナースイッチを操作する。",수감자들을 풀어줄 방법을 찾자. 판사의 손을 써서 지문인식장치를 통과하는 거야.,Zoek een manier om de gevangenen te bevrijden. Gebruik de hand van de rechter om de handscanner schakelaar te bedienen.,Finn en måte å befri fangene på. Bruk dommerens hånd til å betjene håndskannerbryteren.,"Znajdź sposób na uwolnienie więźniów. Użyj ręki sędziego, aby uruchomić przełącznik skanera ręcznego.",Encontre uma maneira de libertar os prisioneiros. Use a mão do juiz para operar o scanner.,,Găsește o cale să eliberezi prizonierii. Folosește mâna judecătorului să operezi scanner-ul de mâini.,"Найди способ освободить пленников. Используй руку судьи, чтобы открыть замок со сканером отпечатка руки.",,Hitta ett sätt att befria fångarna. Använd domarens hand för att använda handskannern.,Mahkûmları serbest bırakmanın bir yolunu bulun. El tarayıcı anahtarını çalıştırmak için yargıcın elini kullan. -Way to go my friend. Good work freeing the prisoners. Jump on one of the teleporters and it will bring you back to base.,TXT_ILOG21,MAP05: After setting the prisoners free.,,,"Jen tak dál, příteli, dobrá práce. Skoč na teleportér, dostane tě to zpět na základnu.","Godt gået, min ven. Godt arbejde med at befri fangerne. Hop på en af teleportørerne, så kommer du tilbage til basen.","Das war gute Arbeit, wie du die Gefangenen befreit hast. Benutze einen der Teleporter um zur Basis zurückzugelangen.",,Danke al vi niaj kamaradoj estas liberaj. Uzu la teleportilon en la ĉelaro por reiri al la bazo.,Buen trabajo liberando a los prisioneros. Usa el teletransportador de la galería para volver a la base.,,"Niin sitä pitää, ystäväni. Hyvin toimittu vankien vapauttamisessa. Hyppää johonkin kaukosiirtimistä, ja se tuo sinut takaisin tukikohtaan.",Bien joué mon ami! Bon travail avec ces prisonniers. Utilise l'un des téléporteurs pour revenir à la base.,"Remek volt. Szép munka volt a rabok kiszabadítása. Ugorj be valamelyik teleportba, és visszavisz a bázisba.","Ottimo lavoro, amico. Grazie a te i prigionieri sono stati liberati. Prendi uno dei teletrasporti e ti riporteremo alla base.","よくやった相棒。囚人を解放できたのは良い働きだ。 +Way to go my friend. Good work freeing the prisoners. Jump on one of the teleporters and it will bring you back to base.,TXT_ILOG21,MAP05: After setting the prisoners free.,,,"Jen tak dál, příteli, dobrá práce. Skoč na teleportér, dostane tě to zpět na základnu.","Godt gået, min ven. Godt arbejde med at befri fangerne. Hop på en af teleportørerne, så kommer du tilbage til basen.","Das war gute Arbeit, wie du die Gefangenen befreit hast. Benutze einen der Teleporter um zur Basis zurückzugelangen.",,Danke al vi niaj kamaradoj estas liberaj. Uzu la teleportilon en la ĉelaro por reiri al la bazo.,Buen trabajo liberando a los prisioneros. Usa el teletransportador de la galería para volver a la base.,,"Niin sitä pitää, ystäväni. Hyvin toimittu vankien vapauttamisessa. Hyppää johonkin kaukosiirtimistä, ja se tuo sinut takaisin tukikohtaan.",Bien joué mon ami! Bon travail avec ces prisonniers. Utilise l'un des téléporteurs pour revenir à la base.,,"Remek volt. Szép munka volt a rabok kiszabadítása. Ugorj be valamelyik teleportba, és visszavisz a bázisba.","Ottimo lavoro, amico. Grazie a te i prigionieri sono stati liberati. Prendi uno dei teletrasporti e ti riporteremo alla base.","よくやった相棒。囚人を解放できたのは良い働きだ。 いずれかのテレポーターに飛び込むと基地に戻る。","잘했어, 친구. 수감자들을 풀어주느라 고생했어. 저 텔레포터들 중 하나를 타면 우리 기지로 복귀할 수 있을 거야.","Goed gedaan, mijn vriend. Goed werk om de gevangenen te bevrijden. Spring op een van de teleporters en die brengt je terug naar de basis.","Sånn skal det gjøres, min venn. Godt jobbet med å befri fangene. Hopp på en av teleporterne, så kommer du tilbake til basen.","Brawo mój przyjacielu. Dobra robota z uwolnieniem więźniów. Wskocz na jeden z teleporterów, a przeniesie cię on z powrotem do bazy.","Boa, meu amigo. Bom trabalho ao libertar os prisioneiros. Entre num desses teletransportadores e você voltará pra base.",,Bună treabă prietene. Sari într-un teleportor și te va duce la baza noastră.,"Так держать, дружище. Ты отлично поработал и освободил пленников. Прыгай в любой телепорт, и он вернёт тебя на базу.",,"Bra jobbat, min vän. Bra jobbat med att befria fångarna. Hoppa på en av teleporterna så tar den dig tillbaka till basen.",Aferin dostum. Mahkûmları serbest bırakarak iyi iş çıkardın. Işınlayıcılardan birine atla ve seni üsse geri getirsin. -"Destroy the power crystal that runs the power grid which drives the Order's shields. Go visit Worner, a spy we recruited in the warehouse of the power station.",TXT_ILOG22,,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi navštívit Wornera, špióna, kterého jsme najali ve skladu elektrárny.","Ødelæg energikrystallen, der driver det strømnet, som driver Ordenens skjolde. Besøg Worner, en spion, som vi rekrutterede i lageret på kraftværket.","Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Suche Worner auf, einen Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben. ",,"Detruu la energian kristalon, kiu impulsas la elektrizan sistemon, kiu tenas la ŝildon de la kastelo. Renkontu nian spionon Worner en la magazeno (Warehouse) de la centralo (Power Station).","Destruye el cristal de poder que impulsa la red eléctrica que mantiene los escudos del castillo. Busca a Worner, un espía nuestro, en el almacén (Warehouse) de la central eléctrica (Power Station).",,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Mene tapaamaan Worneria, vakoojaa, jonka värväsimme voimalaitoksen varastolta.","Détruis le cristal qui contrôle la grille énergétique des boucliers de l'Ordre. Va voir Worner, un espion que l'on a recruté dans l'entrepôt de la centrale.","Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Keresd fel az erőműtől betoborzott kémünket, Wornert.","Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Trova Worner, una spia che abbiamo reclutato nel magazzino della centrale energetica.","送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止めろ。 +"Destroy the power crystal that runs the power grid which drives the Order's shields. Go visit Worner, a spy we recruited in the warehouse of the power station.",TXT_ILOG22,,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi navštívit Wornera, špióna, kterého jsme najali ve skladu elektrárny.","Ødelæg energikrystallen, der driver det strømnet, som driver Ordenens skjolde. Besøg Worner, en spion, som vi rekrutterede i lageret på kraftværket.","Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Suche Worner auf, einen Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben. ",,"Detruu la energian kristalon, kiu impulsas la elektrizan sistemon, kiu tenas la ŝildon de la kastelo. Renkontu nian spionon Worner en la magazeno (Warehouse) de la centralo (Power Station).","Destruye el cristal de poder que impulsa la red eléctrica que mantiene los escudos del castillo. Busca a Worner, un espía nuestro, en el almacén (Warehouse) de la central eléctrica (Power Station).",,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Mene tapaamaan Worneria, vakoojaa, jonka värväsimme voimalaitoksen varastolta.","Détruis le cristal qui contrôle la grille énergétique des boucliers de l'Ordre. Va voir Worner, un espion que l'on a recruté dans l'entrepôt de la centrale.",,"Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Keresd fel az erőműtől betoborzott kémünket, Wornert.","Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Trova Worner, una spia che abbiamo reclutato nel magazzino della centrale energetica.","送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止めろ。 発電所の倉庫に潜らせたスパイ、ワーナーを訪ねよ。","오더의 방어막을 유지하는 동력 망의 전력원인 수정체를 파괴하자. 우선, 발전소 창고에 있는 우리 쪽 첩자인 워너에게 찾아가 보자.","Vernietig het energiekristal dat het stroomnet dat de schilden van de Orde aandrijft. Ga op bezoek bij Worner, een spion die we gerekruteerd hebben in het magazijn van de centrale.","Ødelegg kraftkrystallen som driver kraftnettet som driver Ordenens skjold. Besøk Worner, en spion vi rekrutterte i kraftstasjonens lager.","Zniszcz kryształ mocy, który zasila sieć energetyczną napędzającą tarcze Zakonu. Idź odwiedzić Wornera, szpiega, którego zwerbowaliśmy w magazynie elektrowni.","Destrua o cristal de energia que alimenta a rede elétrica por trás dos escudos da Ordem. Visite o Worner, um espião que recrutamos no depósito da usina de energia.",,"Distruge cristalul de energie care alimentează scuturile Ordinului. Vizitează-l pe Worner, un spion recrutat în depozitul stației de energie.","Уничтожь кристалл, питающий энергосеть Ордена, от которой работают их щиты. Встреться с Уорнэром, нашим шпионом, на складе электростанции.",,"Förstör kraftkristallen som driver kraftnätet som driver Ordens sköldar. Gå och besök Worner, en spion som vi rekryterade i kraftverkets lager.",Tarikat'ın kalkanlarını çalıştıran güç şebekesini çalıştıran güç kristalini yok edin. Güç istasyonunun deposunda işe aldığımız casus Worner'ı ziyaret et. -Let's get lost. There's more fun to come.,TXT_ILOG24,MAP04: After leaving Reactor Core.,,,"Ztraťme se, za chvíli tu bude víc srandy.",Lad os fare vild. Der er mere sjov på vej.,Lass uns verschwinden. Hier wird's gleich ungemütlich.,,Ni devas eliri: la alarmo eksonis.,Hay que irse: la central está alerta.,,Häivytään. Lisää hupia on luvassa.,"Partons d'ici, il y a encore de quoi s'amuser.",Húzzunk innen. Most jön még az izgi rész.,Leviamoci di torno. C'è ancora da divertirsi.,迷子になったら、もっと楽しめるぞ。,어서 여길 떠나자. 녀석들이 오기 전에 말이야.,Laten we verdwalen. Er komt nog meer plezier.,La oss stikke. Det er mer moro i vente.,Zgubmy się. Czeka nas jeszcze więcej zabawy.,Então se manda. Tem mais diversão por vir.,,Să ne pierdem. O să mai fie distracții.,Давай-ка исчезнем отсюда. Скоро начнётся веселье.,,Låt oss gå vilse. Det finns mer kul att göra.,Hadi kaybolalım. Daha çok eğlence var. -"One more adventure before command feels it's safe to attack the castle. Macil's arranged for Irale to give you gold and some training. After you visit him, see the medic in town for strength.",TXT_ILOG25,MAP02: After destroying the crystal in the Power Station.,,,"Ještě jedno dobrodružství, než se velení rozhodne zaútočit. Macil sjednal u Iraleho zlato a trénink. Pak navštiv městského lékaře pro sílu.","Et eventyr mere, før kommandoen føler, at det er sikkert at angribe slottet. Macil har sørget for, at Irale giver dig guld og noget træning. Når du har besøgt ham, skal du gå til lægen i byen for at få styrke.","Eine weitere Aufgabe noch, bevor Macil es für sicher hält, die Burg anzugreifen. Macil hat Irale gebeten, dir Gold zu geben und Training zu organisieren. Nachdem du bei ihm warst, lass dir vom Sanitäter in der Stadt deine Ausdauer erhöhen.",,"Ankoraŭ unu komisio por ke la Fronto sentu, ke sturmi la kastelon estas sekure. Macil diris al Irale, ke li donu oron kaj trejnadon al vi. Post tio, iru ĉe la kuracisto (Hospital) de la urbo pro la enplantaĵo.","Una misión más para que el comando sienta que es seguro asaltar el castillo. Macil le ha dicho a Irale que te dé oro y entrenamiento. Tras visitarlo, ve con el médico del pueblo para cambiar el implante.","Una misión más para que el comando sienta que es seguro asaltar el castillo. Macil le dijo a Irale que te dé oro y entrenamiento. Tras visitarlo, ve con el médico del pueblo para cambiar el implante.","Vielä yksi seikkailu, ennen kuin komentokeskus katsoo tilanteen hyväksi hyökätä linnaa vastaan. Macil on järjestänyt Iralen antamaan sinulle kultaa ja koulutusta. Kun olet tavannut häntä, tapaa kaupungilla lääkintämiestä vahvistusta varten.","Encore une aventure avant que le commandement ne pense qu'il soit bon temps d'attaquer le château. Macil s'est arrangé pour qu'Irale te donne de l'argent et qu'il t'entraîne. Une fois que tu en as fini avec lui, va visiter le médecin en ville pour qu'il te rende des forces.","Még egy kaland, mielőtt az irányítás hatékony támadást indíthat a kastély ellen. Macil elintézte, hogy Irale ellásson arannyal és kiképzéssel. Utána keresd fel a szanitécet, hogy kicsit kipofozzon.","Un'ultima avventura prima dell'assedio al castello. Macil ha parlato ad Irale per farti avere dell'oro e un po' di addestramento. Dopo che gli hai fatto visita, parla anche dal medico in città per una marcia in più.","もう一つの任務をこなす前に戦力の増強が必要と考えられる。 +Let's get lost. There's more fun to come.,TXT_ILOG24,MAP04: After leaving Reactor Core.,,,"Ztraťme se, za chvíli tu bude víc srandy.",Lad os fare vild. Der er mere sjov på vej.,Lass uns verschwinden. Hier wird's gleich ungemütlich.,,Ni devas eliri: la alarmo eksonis.,Hay que irse: la central está alerta.,,Häivytään. Lisää hupia on luvassa.,"Partons d'ici, il y a encore de quoi s'amuser.",,Húzzunk innen. Most jön még az izgi rész.,Leviamoci di torno. C'è ancora da divertirsi.,迷子になったら、もっと楽しめるぞ。,어서 여길 떠나자. 녀석들이 오기 전에 말이야.,Laten we verdwalen. Er komt nog meer plezier.,La oss stikke. Det er mer moro i vente.,Zgubmy się. Czeka nas jeszcze więcej zabawy.,Então se manda. Tem mais diversão por vir.,,Să ne pierdem. O să mai fie distracții.,Давай-ка исчезнем отсюда. Скоро начнётся веселье.,,Låt oss gå vilse. Det finns mer kul att göra.,Hadi kaybolalım. Daha çok eğlence var. +"One more adventure before command feels it's safe to attack the castle. Macil's arranged for Irale to give you gold and some training. After you visit him, see the medic in town for strength.",TXT_ILOG25,MAP02: After destroying the crystal in the Power Station.,,,"Ještě jedno dobrodružství, než se velení rozhodne zaútočit. Macil sjednal u Iraleho zlato a trénink. Pak navštiv městského lékaře pro sílu.","Et eventyr mere, før kommandoen føler, at det er sikkert at angribe slottet. Macil har sørget for, at Irale giver dig guld og noget træning. Når du har besøgt ham, skal du gå til lægen i byen for at få styrke.","Eine weitere Aufgabe noch, bevor Macil es für sicher hält, die Burg anzugreifen. Macil hat Irale gebeten, dir Gold zu geben und Training zu organisieren. Nachdem du bei ihm warst, lass dir vom Sanitäter in der Stadt deine Ausdauer erhöhen.",,"Ankoraŭ unu komisio por ke la Fronto sentu, ke sturmi la kastelon estas sekure. Macil diris al Irale, ke li donu oron kaj trejnadon al vi. Post tio, iru ĉe la kuracisto (Hospital) de la urbo pro la enplantaĵo.","Una misión más para que el comando sienta que es seguro asaltar el castillo. Macil le ha dicho a Irale que te dé oro y entrenamiento. Tras visitarlo, ve con el médico del pueblo para cambiar el implante.","Una misión más para que el comando sienta que es seguro asaltar el castillo. Macil le dijo a Irale que te dé oro y entrenamiento. Tras visitarlo, ve con el médico del pueblo para cambiar el implante.","Vielä yksi seikkailu, ennen kuin komentokeskus katsoo tilanteen hyväksi hyökätä linnaa vastaan. Macil on järjestänyt Iralen antamaan sinulle kultaa ja koulutusta. Kun olet tavannut häntä, tapaa kaupungilla lääkintämiestä vahvistusta varten.","Encore une aventure avant que le commandement ne pense qu'il soit bon temps d'attaquer le château. Macil s'est arrangé pour qu'Irale te donne de l'argent et qu'il t'entraîne. Une fois que tu en as fini avec lui, va visiter le médecin en ville pour qu'il te rende des forces.",,"Még egy kaland, mielőtt az irányítás hatékony támadást indíthat a kastély ellen. Macil elintézte, hogy Irale ellásson arannyal és kiképzéssel. Utána keresd fel a szanitécet, hogy kicsit kipofozzon.","Un'ultima avventura prima dell'assedio al castello. Macil ha parlato ad Irale per farti avere dell'oro e un po' di addestramento. Dopo che gli hai fatto visita, parla anche dal medico in città per una marcia in più.","もう一つの任務をこなす前に戦力の増強が必要と考えられる。 マシルがイラールを介して資金と訓練の手配をしてくれるので会いなさい。 それと近所のメディックも支援してくれるわ。",본부가 공성전을 진행하기 전에 한 가지 해야 할 일이 있어. 마실이 이롤리에게 골드랑 훈련을 제공해달라고 부탁했대. 그리고 마을 병원에 가서 근력을 키워달라고 해.,"Nog een avontuur voor het commando het gevoel heeft dat het veilig is om het kasteel aan te vallen. Macil heeft geregeld dat Irale je goud en wat training geeft. Nadat je hem hebt bezocht, ga je naar de dokter in de stad voor kracht.","Ett eventyr til før kommandoen mener det er trygt å angripe slottet. Macil har sørget for at Irale gir deg gull og litt trening. Etter at du har besøkt ham, gå til legen i byen for å få styrke.","Jeszcze jedna przygoda, zanim dowództwo uzna, że można bezpiecznie zaatakować zamek. Macil umówił się z Irale, że da ci złoto i trochę treningu. Po wizycie u niego, udaj się do medyka w mieście po siłę.","Mais uma aventura antes que o comando ache que é seguro o bastante para atacar o castelo. Macil instruiu Irale a te passar ouro e treinamento. Após visitá-lo, vá ao médico para te dar uma força.",,"Încă o aventură până ce comanda e încrezătoare în atacarea castelului. Macil a aranjat ca Irale să îți ofere bani și antrenament. Dupa ce îț vizitezi, mergi la medicul din oraș pentru forță.","Ещё одно приключение, и штаб будет уверен в успешности атаки на замок. Мэйсил поручил Ирэйлу выплатить тебе награду и дать пару уроков. После встречи с ним, посети городского медика.",,Ett äventyr till innan kommandot känner att det är säkert att attackera slottet. Macil har ordnat så att Irale ger dig guld och lite träning. Efter att du besökt honom ska du gå till läkaren i staden för att få styrka.,"Komutanlık kaleye saldırmanın güvenli olduğunu düşünmeden önce bir macera daha. Macil, İrale'nin sana altın ve biraz eğitim vermesini ayarladı. Onu ziyaret ettikten sonra, güç için kasabadaki doktoru gör." -"Visit Irale and the medic in town for gold and training, then find the sewers. Head along the river across from the Governor's mansion.",TXT_ILOG26,〃,,,"Navštiv Iraleho a doktora pro zlato a trénink, pak najdi stoky. Jdi podél řeky naproti guvernérově sídlu.","Besøg Irale og lægen i byen for at få guld og træning, og find derefter kloakkerne. Gå langs floden over for guvernørens palæ.","Geh zu Irale und dem Sanitäter in der Stadt, um etwas Gold und Training zu bekommen, dann finde die Kanalisation. Folge dem Fluss auf der gegenüberliegenden Seite der Villa des Gouverneurs.",,"Iru ĉe Irale kaj ĉe la kuracisto (Hospital) de la urbo, tiam trovu la kloakon: serĉu enirejon inter la rojo kaj la urbodomo.","Visita a Irale y al médico del pueblo, luego encuentra las alcantarillas: busca una entrada entre el arroyo y el ayuntamiento.",,"Tapaa Iralea ja lääkintämiestä kaupungilla kultaa ja koulutusta varten, minkä jälkeen löydä viemärit. Kulje joen vartta kuvernöörin kartanoa vastapäätä.","Visite Irale et le médecin en ville pour de l'argent et de l'entraînement, puis trouve l'entrée des égouts. Descend le long de la rivière de l'autre côté du manoir du gouverneur.","Keresd fel Iralet és a szanitécet a városban egy kis aranyért és kiképzésért, aztán irány a kanáris. Menj a folyón ami átszeli a kormányzó kúriáját.","Visita Irale e il medico in città per oro e addestramento, dopodiché trova le fogne. Vi puoi accedere dal fiume vicino alla dimora del governatore.","イラールとメディックを尋ねて資金と訓練を受け、下水道に向かうんだ。 +"Visit Irale and the medic in town for gold and training, then find the sewers. Head along the river across from the Governor's mansion.",TXT_ILOG26,〃,,,"Navštiv Iraleho a doktora pro zlato a trénink, pak najdi stoky. Jdi podél řeky naproti guvernérově sídlu.","Besøg Irale og lægen i byen for at få guld og træning, og find derefter kloakkerne. Gå langs floden over for guvernørens palæ.","Geh zu Irale und dem Sanitäter in der Stadt, um etwas Gold und Training zu bekommen, dann finde die Kanalisation. Folge dem Fluss auf der gegenüberliegenden Seite der Villa des Gouverneurs.",,"Iru ĉe Irale kaj ĉe la kuracisto (Hospital) de la urbo, tiam trovu la kloakon: serĉu enirejon inter la rojo kaj la urbodomo.","Visita a Irale y al médico del pueblo, luego encuentra las alcantarillas: busca una entrada entre el arroyo y el ayuntamiento.",,"Tapaa Iralea ja lääkintämiestä kaupungilla kultaa ja koulutusta varten, minkä jälkeen löydä viemärit. Kulje joen vartta kuvernöörin kartanoa vastapäätä.","Visite Irale et le médecin en ville pour de l'argent et de l'entraînement, puis trouve l'entrée des égouts. Descend le long de la rivière de l'autre côté du manoir du gouverneur.",,"Keresd fel Iralet és a szanitécet a városban egy kis aranyért és kiképzésért, aztán irány a kanáris. Menj a folyón ami átszeli a kormányzó kúriáját.","Visita Irale e il medico in città per oro e addestramento, dopodiché trova le fogne. Vi puoi accedere dal fiume vicino alla dimora del governatore.","イラールとメディックを尋ねて資金と訓練を受け、下水道に向かうんだ。 入り口は知事のマンションの川を挟んだ向かい側だ。","이롤리와 마을 의무관에게 가서 골드와 훈련을 받고, 하수구를 찾아. 총독의 관저 건너편의 강을 따라서 가봐.","Bezoek Irale en de dokter in de stad voor goud en training, en zoek dan de riolen. Loop langs de rivier tegenover het landhuis van de gouverneur.","Besøk Irale og legen i byen for gull og trening, og finn deretter kloakken. Gå langs elven overfor guvernørens hus.","Odwiedź Irale i medyka w mieście po złoto i trening, a następnie znajdź kanały. Skieruj się wzdłuż rzeki naprzeciwko rezydencji gubernatora.",Visite o Irale e o médico na cidade para ouro e treinamento. Depois encontre o esgoto. Vá para o rio do outro lado da mansão do Governador.,,"Vizitează pe Irale și medicul din oraș pentru aur și antrenament, apoi găsește canalele. Urmează râul de lângă complexul Guvernatorului.","Зайди к Ирэйлу и городскому медику за золотом и обучением, потом спустись в канализацию. Иди вдоль берега реки, спуск прямо напротив особняка губернатора.",,Besök Irale och läkaren i staden för att få guld och träning och hitta sedan kloakerna. Gå längs floden mittemot guvernörens herrgård.,"Altın ve eğitim için İrale'yi ve kasabadaki doktoru ziyaret edin, ardından kanalizasyonları bulun. Valinin konağının karşısındaki nehir boyunca ilerleyin." -"We're looking for Weran, who calls himself the Rat King. I'm sure it's descriptive as well as colorful.",TXT_ILOG28,MAP06: Entrance.,,,"Hledáma Werana, který si říká Krysí král. Jsem si jistá, že to je jak barvité, tak přesné.","Vi leder efter Weran, som kalder sig selv Rottekongen. Det er sikkert både beskrivende og farverigt.","Wir suchen Weran, den man auch den Rattenkönig nennt. Ich bin sicher, dass dies ihn sehr anschaulich beschreibt.",,"Ni serĉas Weran-on, kiu proklamas sin mem la Rat-reĝo. Mi estas certa, ke tio estas tre fidela priskribo.","Estamos buscando a Weran, quien se autoproclama el Rey de las Ratas. Estoy segura de que es fielmente descriptivo.",,"Etsimme Werania, joka kutsuu itseään Rottakuninkaaksi. Varmastikin kuvaava titteli, mutta myös väritetty.","Cherche Weran, il se fait appeler le Roi des Rats. Je suis sur que c'est aussi descriptif que flatteur.","Werant keressük, aki magát csak a Patkány Királyként emlegeti. Biztos vagyok, hogy nem csak színes név, de valszeg hasonlít is hozzá.","Stiamo cercando Weran, che si fa chiamare il Re dei Ratti. Sono sicura che lo descrive appieno.","誰が呼んだかラットキングのウェランを探すんだ。 +"We're looking for Weran, who calls himself the Rat King. I'm sure it's descriptive as well as colorful.",TXT_ILOG28,MAP06: Entrance.,,,"Hledáma Werana, který si říká Krysí král. Jsem si jistá, že to je jak barvité, tak přesné.","Vi leder efter Weran, som kalder sig selv Rottekongen. Det er sikkert både beskrivende og farverigt.","Wir suchen Weran, den man auch den Rattenkönig nennt. Ich bin sicher, dass dies ihn sehr anschaulich beschreibt.",,"Ni serĉas Weran-on, kiu proklamas sin mem la Rat-reĝo. Mi estas certa, ke tio estas tre fidela priskribo.","Estamos buscando a Weran, quien se autoproclama el Rey de las Ratas. Estoy segura de que es fielmente descriptivo.",,"Etsimme Werania, joka kutsuu itseään Rottakuninkaaksi. Varmastikin kuvaava titteli, mutta myös väritetty.","Cherche Weran, il se fait appeler le Roi des Rats. Je suis sur que c'est aussi descriptif que flatteur.",,"Werant keressük, aki magát csak a Patkány Királyként emlegeti. Biztos vagyok, hogy nem csak színes név, de valszeg hasonlít is hozzá.","Stiamo cercando Weran, che si fa chiamare il Re dei Ratti. Sono sicura che lo descrive appieno.","誰が呼んだかラットキングのウェランを探すんだ。 それが叙述的でもあり派手な呼び名なのも定かだ。",우리는 자신을 시궁쥐 왕이라고 부르는 워렌을 찾아야 해. 알록달록해서 눈에 잘 띌 것 같은데 말이야.,"We zijn op zoek naar Weran, die zichzelf de rattenkoning noemt. Ik weet zeker dat het zowel beschrijvend als kleurrijk is.","Vi leter etter Weran, som kaller seg Rottekongen. Det er sikkert både beskrivende og fargerikt.","Szukamy Werana, który nazywa siebie Królem Szczurów. Na pewno jest to opisowe, jak i barwne.","Estamos procurando pelo Weran, que se autodenomina o Rato Rei. Imagino que isso seja tão descritivo quanto gracioso.",,"Îl căutam pe Weran, care ăși spune Regele Șobolanilor. Sunt sigur că e descriptiv și colorat.","Нам нужен Уэран — он называет себя Крысиным королём. Уверена, прозвище так же емко, как и красочно.",,Vi letar efter Weran som kallar sig för råttkungen. Jag är säker på att det är både beskrivande och färgstarkt.,Kendisine Fare Kral diyen Weran'ı arıyoruz. Renkli olduğu kadar açıklayıcı da olduğuna eminim. -"Take the flamethrower parts to Irale. Drain the reclamation tank. At the bottom is a hidden entrance to the sewers. The gate controls are down there, somewhere. Destroy them.",TXT_ILOG33,MAP06: After giving the guard's uniform to Weran.,,,Vezmi části plamenometu k Iralemu. Vypusť obnovovací nádrž. Na dně je skrytý vchod do stok. Někde tam je ovládání bran. Znič jej.,Tag flammekasterdelene med til Irale. Tøm genvindingstanken. I bunden er der en skjult indgang til kloakkerne. Kontrolelementerne til porten er dernede et sted. Ødelæg dem.,Bringe dir Flammenwerferteile zu Irale. Leere den Sammeltank. Am Boden ist ein versteckter Eingang zur Kanalisation. Dort ist die Steuerung für die Tore. Zerstöre sie.,,"Portu la partojn de la flamĵetilo al Irale. Drenu la rezervujon en la kastelo: en ĝia fundo estas kaŝita enirejo al la kloako, kaj ie tie estas la regilo de la pordo; detruu ĝin.",Llévale las partes del lanzallamas a Irale. Drena el tanque de recuperación del castillo: al fondo hay una entrada secreta a las alcantarillas y por ahí mismo el control de la puerta; destrúyelo.,,Toimita liekinheittimen osat Iralelle. Tyhjennä nesteentalteenottoallas. Sen pohjalla on viemärin salainen sisäänkäynti. Portin ohjaimet sijaitsevat jossakin siellä. Tuhoa ne.,Amène les pièces du lance-flamme à Irale. Fais vider le réservoir de recyclage. Au fond se trouve une entrée cachée vers les égouts. Les contrôles de la porte s'y trouvent. Détruis-les.,Vidd a lángszóró darabokat Iralehez. Ereszd le a szárító tartályt. Az alján megtalálod a titkos lejáratot a kanárisba. A kapu vezérlése ott van lent valahol. Semmisítsd meg őket.,"Porta i pezzi del lanciafiamme da Irale. Svuota la vasca di recupero fluidi. Nel fondo c'è un'entrata nascosta per le fogne. I controlli dei cancelli sono laggiù, da qualche parte. Distruggili.","火炎放射器の部品をイラールに持っていく。 +"Take the flamethrower parts to Irale. Drain the reclamation tank. At the bottom is a hidden entrance to the sewers. The gate controls are down there, somewhere. Destroy them.",TXT_ILOG33,MAP06: After giving the guard's uniform to Weran.,,,Vezmi části plamenometu k Iralemu. Vypusť obnovovací nádrž. Na dně je skrytý vchod do stok. Někde tam je ovládání bran. Znič jej.,Tag flammekasterdelene med til Irale. Tøm genvindingstanken. I bunden er der en skjult indgang til kloakkerne. Kontrolelementerne til porten er dernede et sted. Ødelæg dem.,Bringe dir Flammenwerferteile zu Irale. Leere den Sammeltank. Am Boden ist ein versteckter Eingang zur Kanalisation. Dort ist die Steuerung für die Tore. Zerstöre sie.,,"Portu la partojn de la flamĵetilo al Irale. Drenu la rezervujon en la kastelo: en ĝia fundo estas kaŝita enirejo al la kloako, kaj ie tie estas la regilo de la pordo; detruu ĝin.",Llévale las partes del lanzallamas a Irale. Drena el tanque de recuperación del castillo: al fondo hay una entrada secreta a las alcantarillas y por ahí mismo el control de la puerta; destrúyelo.,,Toimita liekinheittimen osat Iralelle. Tyhjennä nesteentalteenottoallas. Sen pohjalla on viemärin salainen sisäänkäynti. Portin ohjaimet sijaitsevat jossakin siellä. Tuhoa ne.,Amène les pièces du lance-flamme à Irale. Fais vider le réservoir de recyclage. Au fond se trouve une entrée cachée vers les égouts. Les contrôles de la porte s'y trouvent. Détruis-les.,,Vidd a lángszóró darabokat Iralehez. Ereszd le a szárító tartályt. Az alján megtalálod a titkos lejáratot a kanárisba. A kapu vezérlése ott van lent valahol. Semmisítsd meg őket.,"Porta i pezzi del lanciafiamme da Irale. Svuota la vasca di recupero fluidi. Nel fondo c'è un'entrata nascosta per le fogne. I controlli dei cancelli sono laggiù, da qualche parte. Distruggili.","火炎放射器の部品をイラールに持っていく。 浄化タンクを排水せよ。その下層に下水道への隠された入り口がある。 ゲートコントロールを探し出し、破壊せよ。",이 화염방사기 부품을 가지고 이롤리에게 말 걸어봐. 수조에 있는 물을 비우면 밑에 하수도로 향하는 비밀 입구가 보일 거야. 성문의 관리 장치가 여기 어딘가에 있을 거야. 찾으면 파괴해.,"Neem de vlammenwerperonderdelen mee naar Irale. Laat de terugwinnings tank leeglopen. Onderaan is een verborgen ingang naar de riolering. De poortbediening is daar beneden, ergens. Vernietig ze.","Ta flammekasterdelene til Irale. Tøm utvinningstanken. Nederst er det en skjult inngang til kloakken. Portkontrollene er der nede, et sted. Ødelegg dem.",Zabierz części miotacza ognia do Irale. Opróżnij zbiornik rekultywacyjny. Na dole jest ukryte wejście do kanałów. Sterowniki bramy są gdzieś tam na dole. Zniszcz je.,Leve as peças do lança-chamas ao Irale. Drene o tanque de recuperação. No fundo há uma entrada oculta para o esgoto. Os controles do portão estão lá embaixo em algum lugar. Destrua-os.,,"Du bucățiile aruncătorului la Irale. Drenează rezervorul recuperării. La fund e o intrare secretă către canale. Controlul porții e jos, undeva. Distruge-l.","Отнеси детали огнемёта Ирэйлу. Слей жидкость из бака для переработки. На его дне скрытый вход в канализацию. Механизм управления воротами где-то там, внизу. Сломай его.",,Ta med dig flamethrowerdelarna till Irale. Töm återvinningstanken. I botten finns en dold ingång till kloakerna. Grindkontrollerna finns där nere någonstans. Förstör dem.,Alev makinesi parçalarını İrale'ye götür. Islah tankını boşaltın. En altta kanalizasyona gizli bir giriş var. Kapı kontrolleri aşağıda bir yerde. Onları yok et. -"Command, he's done it! The gates are open. Send in the shock troops and tell Macil we're coming in! Let's get back to the Front base.",TXT_ILOG37,MAP06: After destroying the gate controls.,,,"Velení, dokázal to! Brány jsou otevřené. Pošlete tam úderníky a řekněte Macilovi, že přicházíme! Vrať se na základnu Fronty.","Kommando, han har gjort det! Portene er åbne. Send choktropperne ind og fortæl Macil, at vi kommer ind! Lad os komme tilbage til frontbasen.",Kommandozentrale: Er hat's geschafft! Die Tore sind offen. Schickt die Schocktruppen hinein und sagt Macil das wir auf dem Weg sind! Lass uns zur Frontbasis zurückkehren.,,"Fronto, li sukcesis! Li malfermis la pordojn. Sendu la sturmantojn kaj diru al Macil, ke estas tempo eniri! Ni reiru al la bazo de la Fronto.","¡Comando, lo ha conseguido! Las puertas ya están abiertas. ¡Enviad a las tropas de choque y decidle a Macil que ya es hora de entrar! Volvamos a la base del Frente.","¡Comando, lo logró! Las puertas ya están abiertas. ¡Manden a las tropas de choque y díganle a Macil que ya es hora de entrar! Volvamos a la base del Frente.","Komentokeskus, hän teki sen! Portit ovat auki; lähettäkää iskujoukot ja kertokaa Macilille, että vyörymme sisään! Palataan Rintaman tukikohtaan.","C'est bon, commandement, il a réussi! Les portes sont ouvertes, envoyez les soldats de choc et dites à Macil que l'on arrive! Retournons à la base du Front.","Irányítás, megcsinálta! A kpuk kinyíltak. Küldjétek be az elektromos egységeket, és értesítsd Macilt hogy jövünk! Irány vissza a homlokfronthoz.","Comando, ce l'ha fatta! I cancelli sono aperti. Mandate avanti le truppe e dite a Macil che stiamo arrivando! Torniamo alla base del Fronte.","司令官、彼はやったぞ! +"Command, he's done it! The gates are open. Send in the shock troops and tell Macil we're coming in! Let's get back to the Front base.",TXT_ILOG37,MAP06: After destroying the gate controls.,,,"Velení, dokázal to! Brány jsou otevřené. Pošlete tam úderníky a řekněte Macilovi, že přicházíme! Vrať se na základnu Fronty.","Kommando, han har gjort det! Portene er åbne. Send choktropperne ind og fortæl Macil, at vi kommer ind! Lad os komme tilbage til frontbasen.",Kommandozentrale: Er hat's geschafft! Die Tore sind offen. Schickt die Schocktruppen hinein und sagt Macil das wir auf dem Weg sind! Lass uns zur Frontbasis zurückkehren.,,"Fronto, li sukcesis! Li malfermis la pordojn. Sendu la sturmantojn kaj diru al Macil, ke estas tempo eniri! Ni reiru al la bazo de la Fronto.","¡Comando, lo ha conseguido! Las puertas ya están abiertas. ¡Enviad a las tropas de choque y decidle a Macil que ya es hora de entrar! Volvamos a la base del Frente.","¡Comando, lo logró! Las puertas ya están abiertas. ¡Manden a las tropas de choque y díganle a Macil que ya es hora de entrar! Volvamos a la base del Frente.","Komentokeskus, hän teki sen! Portit ovat auki; lähettäkää iskujoukot ja kertokaa Macilille, että vyörymme sisään! Palataan Rintaman tukikohtaan.","C'est bon, commandement, il a réussi! Les portes sont ouvertes, envoyez les soldats de choc et dites à Macil que l'on arrive! Retournons à la base du Front.",,"Irányítás, megcsinálta! A kpuk kinyíltak. Küldjétek be az elektromos egységeket, és értesítsd Macilt hogy jövünk! Irány vissza a homlokfronthoz.","Comando, ce l'ha fatta! I cancelli sono aperti. Mandate avanti le truppe e dite a Macil che stiamo arrivando! Torniamo alla base del Fronte.","司令官、彼はやったぞ! ゲートが開いた。突撃部隊を送って我々も続くとマシルに伝えてくれ!",본부! 그가 해냈습니다! 성문이 열렸습니다. 공습부대를 성문으로 이동시키고 사령관님께 우리들도 따라올 거라고 전해주세요. 이제 프론트 기지로 돌아가!,"Commando, hij heeft het gedaan! De poorten zijn open. Stuur de stoottroepen naar binnen en zeg Macil dat we binnenkomen! Laten we teruggaan naar de voorste basis.","Kommando, han har klart det! Portene er åpne. Send inn sjokktroppene og si til Macil at vi kommer inn! La oss dra tilbake til frontbasen.","Dowództwo, udało mu się! Wrota są otwarte. Wyślij oddziały uderzeniowe i powiedz Macilowi, że wchodzimy! Wracajmy do bazy frontowej.","Comando, ele conseguiu! Os portões estão abertos. Mande as tropas de choque e diga ao Macil que estamos entrando! Vamos voltar pra base da Frente.",,"Comandă, a reușit! Porțile sunt deschise. Trimite trupele de șoc și spune-i lui Macil că intrăm! Să ne întoarcem la baza Frontului.","Штаб, он выполнил задание! Ворота открыты. Посылайте ударный отряд и доложите Мэйсилу, что мы пробились! Возвращайся на базу Сопротивления.",,"Kommando, han har gjort det! Portarna är öppna. Skicka in chocktrupperna och säg till Macil att vi kommer in! Låt oss återvända till Frontbasen.","Komuta, başardı! Kapılar açıldı. Şok birliklerini gönderin ve Macil'e geldiğimizi söyleyin! Cephe üssüne geri dönelim." -"Join the assault on the castle. Find and take out the Programmer. We have conflicting reports about his location. One says he in a computer room, another hiding in a sub-level temple, and yet another at the end of a long hallway.",TXT_ILOG38,MAP07: Entrace.,,,"Připoj se k útoku na hrad. Najdi a zabij Programátora. Informace o jeho pozici se různí. Jedna mluví o místnosti s počítači, druhá o podzemním chrámu a třetí o konci dlouhé chodby.","Deltag i angrebet på slottet. Find og udslæt programmøren. Vi har modstridende rapporter om hans placering. En siger, at han er i et computerrum, en anden, at han gemmer sig i et tempel på et underliggende niveau, og endnu en anden for enden af en lang korridor.","Schließe dich dem Angriff auf die Burg an. Finde den Programmierer und schalte ihn aus. Wir haben widersprüchliche Angaben über seinen Aufenthaltsort. Eine sagt, in einem Computerraum, ein anderer, dass er sich in einem Tempelkeller versteckt und noch ein anderer sagt was vom Ende eines langen Flurs.",,Trovu kaj mortigu la Programiston. Estas kontraŭdiraj informoj pri lia pozicio: en komputila ĉambro aŭ en la subtera etaĝo de templo aŭ ĉe la fundo de longa koridoro.,"Encuentra y elimina al Programador. Tenemos informes contradictorios sobre su ubicación: uno que está en una sala de ordenadores, otro en el sótano de un templo y otro al final de un largo pasillo.","Encuentra y elimina al Programador. Tenemos informes contradictorios sobre su ubicación: uno que está en una sala de computadoras, otro en el sótano de un templo y otro al final de un largo pasillo.","Osallistu hyökkäykseen linnaa vastaan. Etsi ja kukista Ohjelmoitsija. Meillä on hänen sijainnistaan eriäviä tietoja: Yhden mukaan hän on tietokonehuoneessa, toisen mukaan maanalaisessa temppelissä ja vielä kolmannen mukaan pitkän käytävän päässä.","Rejoins l'assaut sur le château. Trouve et élimine le Programmeur. On a des rapports en conflit sur sa position. L'un d'entre eux nous dit qu'il se trouve dans la salle des ordinateurs, l'autre nous dit qu'il se cache dans un temple en sous sol, et un autre encore au bout d'un long couloir.","Csatlakozz a kastély ostromához. Keresd meg és iktasd ki a Programozót. Ellentmondó információink vannak a hollétéről. Az egyik szerint a számítógép szobában van, másik szerint egy föld alatti templomban, harmadik szerint egy hosszú folyosó végén.","Unisciti all'assalto sul castello. Trova e fai fuori il Programmatore. I rapporti che abbiamo sulla sua posizione si contraddicono. Uno lo piazza in una stanza di computer, un altro in un tempio di sottolivello, e un altro ancora alla fine di un lungo corridoio.","城に向かう突撃部隊に参加してプログラマーを探し出せ。 +"Join the assault on the castle. Find and take out the Programmer. We have conflicting reports about his location. One says he in a computer room, another hiding in a sub-level temple, and yet another at the end of a long hallway.",TXT_ILOG38,MAP07: Entrace.,,,"Připoj se k útoku na hrad. Najdi a zabij Programátora. Informace o jeho pozici se různí. Jedna mluví o místnosti s počítači, druhá o podzemním chrámu a třetí o konci dlouhé chodby.","Deltag i angrebet på slottet. Find og udslæt programmøren. Vi har modstridende rapporter om hans placering. En siger, at han er i et computerrum, en anden, at han gemmer sig i et tempel på et underliggende niveau, og endnu en anden for enden af en lang korridor.","Schließe dich dem Angriff auf die Burg an. Finde den Programmierer und schalte ihn aus. Wir haben widersprüchliche Angaben über seinen Aufenthaltsort. Eine sagt, in einem Computerraum, ein anderer, dass er sich in einem Tempelkeller versteckt und noch ein anderer sagt was vom Ende eines langen Flurs.",,Trovu kaj mortigu la Programiston. Estas kontraŭdiraj informoj pri lia pozicio: en komputila ĉambro aŭ en la subtera etaĝo de templo aŭ ĉe la fundo de longa koridoro.,"Encuentra y elimina al Programador. Tenemos informes contradictorios sobre su ubicación: uno que está en una sala de ordenadores, otro en el sótano de un templo y otro al final de un largo pasillo.","Encuentra y elimina al Programador. Tenemos informes contradictorios sobre su ubicación: uno que está en una sala de computadoras, otro en el sótano de un templo y otro al final de un largo pasillo.","Osallistu hyökkäykseen linnaa vastaan. Etsi ja kukista Ohjelmoitsija. Meillä on hänen sijainnistaan eriäviä tietoja: Yhden mukaan hän on tietokonehuoneessa, toisen mukaan maanalaisessa temppelissä ja vielä kolmannen mukaan pitkän käytävän päässä.","Rejoins l'assaut sur le château. Trouve et élimine le Programmeur. On a des rapports en conflit sur sa position. L'un d'entre eux nous dit qu'il se trouve dans la salle des ordinateurs, l'autre nous dit qu'il se cache dans un temple en sous sol, et un autre encore au bout d'un long couloir.",,"Csatlakozz a kastély ostromához. Keresd meg és iktasd ki a Programozót. Ellentmondó információink vannak a hollétéről. Az egyik szerint a számítógép szobában van, másik szerint egy föld alatti templomban, harmadik szerint egy hosszú folyosó végén.","Unisciti all'assalto sul castello. Trova e fai fuori il Programmatore. I rapporti che abbiamo sulla sua posizione si contraddicono. Uno lo piazza in una stanza di computer, un altro in un tempio di sottolivello, e un altro ancora alla fine di un lungo corridoio.","城に向かう突撃部隊に参加してプログラマーを探し出せ。 プログラマーの居場所について矛盾する報告もある。 ある人はコンピューター室にいる、別の人は保管室にいる、 また別の人は長い廊下にいるとも言っていた。","성을 공략할 공성전에 참여해. 침투해서 프로그래머를 죽일 수 있게. 그의 장소와 관련된 보고들이 뭔가 혼란스러운데, 컴퓨터실에 있다고 하고, 낮은 층 신전에 숨어 있다고 하고, 다른 한 명은 긴 복도 맨 끝에 서 있대.","Doe mee aan de aanval op het kasteel. Zoek en schakel de Programmeur uit. We hebben tegenstrijdige berichten over zijn locatie. De ene zegt dat hij in een computerkamer zit, de andere verstopt zich in een tempel op subniveau, en nog een andere aan het einde van een lange gang.","Bli med på angrepet på slottet. Finn og drep programmereren. Vi har motstridende rapporter om hvor han befinner seg. En sier at han er i et datarom, en annen at han gjemmer seg i et underjordisk tempel, og en tredje at han er i enden av en lang gang.","Dołącz do szturmu na zamek. Znajdźcie i zlikwidujcie Programistę. Mamy sprzeczne raporty na temat jego lokalizacji. Jeden mówi, że w sali komputerowej, inny, że ukrywa się w podpoziomowej świątyni, a jeszcze inny, że na końcu długiego korytarza.","Junte-se ao ataque no castelo. Ache e elimine o Programador. Temos relatos conflitantes sobre onde ele se encontra. Um deles diz que ele está na sala de informática, outro que ele está escondido num templo no subsolo e mais outro diz que ele está no fim de um longo corredor.",,"Alăturăte asaltului asupra castelului. Găsește-l și elimină-l pe Programator. Avem rapoarte diferite în ceea ce privește locația lui. Unul spune că e într-o sală de calculatoare, iar altul că se ascunde într-un subnivel al templului, și încă unul care spune că e în capătul unui coridor lung.","Присоединись к атаке на замок. Найди и уничтожь Программиста. Наши сведения о его местонахождении противоречивы. Одни говорят, что он в компьютерной комнате, другие — что он укрывается в подземном храме, а третьи — что он в конце длинного коридора.",,"Gå med i anfallet mot slottet. Hitta och ta ut programmeraren. Vi har motstridiga rapporter om var han befinner sig. En säger att han befinner sig i ett datorrum, en annan gömmer sig i ett tempel på en underliggande nivå och ytterligare en annan i slutet av en lång korridor.","Kaleye yapılan saldırıya katılın. Programcıyı bulup çıkarın. Yeri hakkında çelişkili raporlarımız var. Biri bilgisayar odasında, diğeri alt kattaki bir tapınakta, bir başkası da uzun bir koridorun sonunda saklandığını söylüyor." -Find the Programmer and kill him.,TXT_ILOG45,MAP09: Entrance.,,,Najdi Programátora a zabij ho.,Find programmøren og dræb ham.,Finde den Programmierer und töte ihn.,,Trovu la Programiston kaj mortigu lin.,Encuentra al Programador y mátalo.,,Etsi ja tapa Ohjelmoitsija.,Trouve le Programmeur et tue-le.,Keresd meg a Programozót és öld meg.,Trova il Programmatore e fallo fuori.,プログラマーを見つけて殺せ。,프로그래머를 찾아서 죽여.,Zoek de Programmeur en vermoord hem.,Finn programmereren og drep ham.,Znajdź Programistę i zabij go.,Encontre o Programador e mate-o.,,Găsește Programatorul și ucide-l.,Найди Программиста и убей его.,,Hitta programmeraren och döda honom.,Programcıyı bulun ve öldürün. -"Seek out the Oracle and ask it about the other Sigil pieces. The Oracle resides in the borderlands, just outside of town. Cross the river, head towards the castle and go left through the archway.",TXT_ILOG46,,,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Věštec přebývá v pohraničí, hned za městem. Překroč řeku, zamiř k hradu a jdi vlevo pod obloukem.","Opsøg Oraklet og spørg det om de andre Sigil-stykker. Oraklet befinder sig i grænselandet, lige uden for byen. Kryds floden, gå mod slottet og gå til venstre gennem buegangen.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Das Orakel ist in den Grenzgebieten zu finden, außerhalb der Stadt. Überquere den Fluss, gehe zur Burg und dann links durch das Tor.",,Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo. Li loĝas ekster la urbo en la limlando; ĝi estas apud la pordo de la kastelo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside fuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside afuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,"Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Oraakkeli asuu rajamailla aivan kaupungin liepeillä. Ylitä joki, kulje kohti linnaa ja mene vasemmalle kaarikäytävän läpi.","Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. L'Oracle se trouve dans les terrains vagues à l'extérieur de la ville. Traverse la rivière, va vers le château puis à gauche après l'arche.","Keresd fel az Orákulumot, és kérdezd ki a többi pecsét darabról. Az Orákulum a peremvidéken lakik, rögtön a város után. Elhagyva a folyót, vedd az utad a kastély felé, és balra a boltíves folyosónál.","Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. L'Oracolo risiede nelle terre di confine, subito dopo la città. Attraversa il fiume, vai nella direzione del castello e poi a sinistra oltre l'arco.","オラクルに会いシジルの欠片の場所を尋ねろ。 +Find the Programmer and kill him.,TXT_ILOG45,MAP09: Entrance.,,,Najdi Programátora a zabij ho.,Find programmøren og dræb ham.,Finde den Programmierer und töte ihn.,,Trovu la Programiston kaj mortigu lin.,Encuentra al Programador y mátalo.,,Etsi ja tapa Ohjelmoitsija.,Trouve le Programmeur et tue-le.,,Keresd meg a Programozót és öld meg.,Trova il Programmatore e fallo fuori.,プログラマーを見つけて殺せ。,프로그래머를 찾아서 죽여.,Zoek de Programmeur en vermoord hem.,Finn programmereren og drep ham.,Znajdź Programistę i zabij go.,Encontre o Programador e mate-o.,,Găsește Programatorul și ucide-l.,Найди Программиста и убей его.,,Hitta programmeraren och döda honom.,Programcıyı bulun ve öldürün. +"Seek out the Oracle and ask it about the other Sigil pieces. The Oracle resides in the borderlands, just outside of town. Cross the river, head towards the castle and go left through the archway.",TXT_ILOG46,,,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Věštec přebývá v pohraničí, hned za městem. Překroč řeku, zamiř k hradu a jdi vlevo pod obloukem.","Opsøg Oraklet og spørg det om de andre Sigil-stykker. Oraklet befinder sig i grænselandet, lige uden for byen. Kryds floden, gå mod slottet og gå til venstre gennem buegangen.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Das Orakel ist in den Grenzgebieten zu finden, außerhalb der Stadt. Überquere den Fluss, gehe zur Burg und dann links durch das Tor.",,Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo. Li loĝas ekster la urbo en la limlando; ĝi estas apud la pordo de la kastelo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside fuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside afuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,"Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Oraakkeli asuu rajamailla aivan kaupungin liepeillä. Ylitä joki, kulje kohti linnaa ja mene vasemmalle kaarikäytävän läpi.","Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. L'Oracle se trouve dans les terrains vagues à l'extérieur de la ville. Traverse la rivière, va vers le château puis à gauche après l'arche.",,"Keresd fel az Orákulumot, és kérdezd ki a többi pecsét darabról. Az Orákulum a peremvidéken lakik, rögtön a város után. Elhagyva a folyót, vedd az utad a kastély felé, és balra a boltíves folyosónál.","Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. L'Oracolo risiede nelle terre di confine, subito dopo la città. Attraversa il fiume, vai nella direzione del castello e poi a sinistra oltre l'arco.","オラクルに会いシジルの欠片の場所を尋ねろ。 オラクルは町外れの国境地帯にいる。 川の向こうにある城を目指しアーチウェイを左に曲がるのだ。","오라클을 찾아서 다른 시질 조각이 어디에 있는지 물어봐. 오라클은 도시 외곽에 있는 접경지 근처에 있어. 강을 넘은 뒤, 성 쪽으로 향하고 아치 밑의 통로를 통해 왼쪽으로 이동해.","Zoek het Orakel op en vraag het over de andere Sigil stukken. Het Orakel woont in de grensgebieden, net buiten de stad. Steek de rivier over, loop naar het kasteel en ga linksaf door de poort.","Oppsøk Orakelet og spør det om de andre Sigil-brikkene. Oraklet holder til i grenselandet, like utenfor byen. Kryss elven, gå mot slottet og gå til venstre gjennom buegangen.","Poszukaj Wyroczni i zapytaj ją o pozostałe kawałki Sigila. Wyrocznia rezyduje na pograniczu, tuż za miastem. Przejdź przez rzekę, skieruj się w stronę zamku i przejdź w lewo przez łuki.","Procure pelo Oráculo e pergunte a ele sobre as outras peças do Sigilo. O Oráculo mora nas fronteiras, no lado de fora da cidade. Atravesse o rio, vá em direção ao castelo e vá pela esquerda através do arco.",,"Găsește Oracolul și întreabă-l de piesele Sigiliului. Oracolul are reședința în mărginime, chiar la ieșirea din oraș. Trece râul, du-te spre castel și ia-o la stânga prin arcadă.","Найди Оракула и спроси его про другие фрагменты Печати. Резиденция Оракула находится в пограничье, сразу за городской чертой. Пересеки реку, иди в сторону крепости и сверни налево, пройдя через арку.",,"Sök upp Oraklet och fråga det om de andra Sigilbitarna. Oraklet befinner sig i gränslandet, strax utanför staden. Korsa floden, gå mot slottet och gå till vänster genom valvet.","Kahin'i bulun ve ona diğer Sigil parçalarını sorun. Kahin, şehrin hemen dışındaki sınır bölgelerinde bulunur. Nehri geçin, kaleye doğru gidin ve kemerden sola dönün." -"Seek out the Oracle and ask it about the other Sigil pieces. The Oracle's temple is in the borderlands, on the outskirts of town.",TXT_ILOG47,,,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Věštcův chrám je v pohraničí, na okraji města.","Opsøg Oraklet og spørg det om de andre Sigil stykker. Oraklets tempel ligger i grænselandet, i udkanten af byen.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Der Tempel des Orakels ist in den Grenzgebieten zu finden, in den Außenbezirken der Stadt.",,Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo. Li loĝas ekster la urbo en la limlando; ĝi estas apud la pordo de la kastelo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside fuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside afuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Oraakkelin temppeli sijaitsee rajaseudulla kaupungin laitamilla.,Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. Le temple de l'Oracle se trouve dans les terrains vagues à l'extérieur de la ville. ,"Keresd fel az Orákulumot, és kérdezd ki a többi pecsét darabról. Az Orákulum a peremvidéken lakik, rögtön a város után.","Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Il tempio dell'Oracolo è nelle terre di confine, fuori città.","オラクルに会いシジルの欠片の場所を尋ねろ。 +"Seek out the Oracle and ask it about the other Sigil pieces. The Oracle's temple is in the borderlands, on the outskirts of town.",TXT_ILOG47,,,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Věštcův chrám je v pohraničí, na okraji města.","Opsøg Oraklet og spørg det om de andre Sigil stykker. Oraklets tempel ligger i grænselandet, i udkanten af byen.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Der Tempel des Orakels ist in den Grenzgebieten zu finden, in den Außenbezirken der Stadt.",,Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo. Li loĝas ekster la urbo en la limlando; ĝi estas apud la pordo de la kastelo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside fuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Reside afuera del pueblo en las tierras fronterizas que están justo al lado de la puerta del castillo.,Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Oraakkelin temppeli sijaitsee rajaseudulla kaupungin laitamilla.,Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. Le temple de l'Oracle se trouve dans les terrains vagues à l'extérieur de la ville. ,,"Keresd fel az Orákulumot, és kérdezd ki a többi pecsét darabról. Az Orákulum a peremvidéken lakik, rögtön a város után.","Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Il tempio dell'Oracolo è nelle terre di confine, fuori città.","オラクルに会いシジルの欠片の場所を尋ねろ。 オラクルは町外れの国境地帯にいる。",오라클을 찾고 다른 시질 조각에 관해 물어봐. 오라클의 신전은 도시 외곽의 접경지 근처에 있어.,"Zoek het Orakel op en vraag het over de andere Sigil stukken. De tempel van het Orakel ligt in het grensgebied, aan de rand van de stad.","Oppsøk oraklet og spør det om de andre Sigil-brikkene. Orakelets tempel ligger i grenselandet, i utkanten av byen.","Odszukaj Wyrocznię i zapytaj ją o inne kawałki Sigila. Świątynia Wyroczni znajduje się na pograniczu, na obrzeżach miasta.","Procure pelo Oráculo e pergunte a ele sobre as outras peças do Sigilo. Seu tempo está nas fronteiras, no lado de fora da cidade.",,"Găsește Oracolul și întreabă-l de piesele Sigiliului. Oracolul are reședința în mărginime, la ieșirea din oraș.","Найди Оракула и спроси его про другие фрагменты Печати. Храм Оракула расположен в пограничье, на окраине города.",,"Sök upp Oraklet och fråga det om de andra Sigilbitarna. Oraklets tempel ligger i gränslandet, i utkanten av staden.","Kahin'i bul ve ona diğer Sigil parçalarını sor. Kahin'in tapınağı sınır bölgelerinde, şehrin eteklerinde." -"Seek out the Oracle and ask it about the other Sigil pieces. Take your reward and go across to the medic and weapons trainer for health and training. The Oracle's temple is in the borderlands, on the outskirts of town.",TXT_ILOG48,"MAP10: After killing the Programmer, talking to Macil and moving a bit.",,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Převezmi si svou odměnu a navštiv zdravotníka a učitele střelby pro zdraví a výcvik. Věštcův chrám je v pohraničí, na okraji města.","Opsøg Oraklet og spørg det om de andre Sigilstykker. Tag din belønning og gå over til lægen og våbentræneren for at få sundhed og træning. Oraklets tempel ligger i grænselandet, i udkanten af byen.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Nimm deine Belohnung und suche den Sanitäter und den Waffentrainer auf. Der Tempel des Orakels ist in den Grenzgebieten zu finden, in den Außenbezirken der Stadt.",,Parolu kun la kuracisto kaj la armila trejnisto en la malsanulejo (Hospital). Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo: lia templo estas ekster la urbo en la limlando.,Habla con el médico y el entrenador de armas en el hospital. Busca al Oráculo y pregúntale sobre las otras piezas del Emblema: su templo está fuera del pueblo en las tierras fronterizas.,,Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Kerää palkkiosi ja hakeudu lääkintämiehen ja asekouluttajan luo terveydenhoitoa ja koulutusta varten. Oraakkelin temppeli sijaitsee rajaseudulla kaupungin laitamilla.,Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. Va chercher ta récompense chez le médecin et le maître d'armes pour de la santé et de l'entraînement. Le temple de l'Oracle se trouve dans les terrains vagues à l'extérieur de la ville. ,"Keresd fel az Orákulumot, és kérdezd ki a többi pecsét darabról. Vedd fel a jutalmad, majd ugorj át a szanitéchez és kiképzőhöz. Az Orákulum temploma a peremvidéken található, a város külvárosában.","Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Prendi la tua ricompensa e visita il dottore e l'addestratore di armi. Il tempio dell'Oracolo è nelle terre di confine, fuori città.","オラクルに会いシジルの欠片の場所を尋ねろ。 +"Seek out the Oracle and ask it about the other Sigil pieces. Take your reward and go across to the medic and weapons trainer for health and training. The Oracle's temple is in the borderlands, on the outskirts of town.",TXT_ILOG48,"MAP10: After killing the Programmer, talking to Macil and moving a bit.",,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Převezmi si svou odměnu a navštiv zdravotníka a učitele střelby pro zdraví a výcvik. Věštcův chrám je v pohraničí, na okraji města.","Opsøg Oraklet og spørg det om de andre Sigilstykker. Tag din belønning og gå over til lægen og våbentræneren for at få sundhed og træning. Oraklets tempel ligger i grænselandet, i udkanten af byen.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Nimm deine Belohnung und suche den Sanitäter und den Waffentrainer auf. Der Tempel des Orakels ist in den Grenzgebieten zu finden, in den Außenbezirken der Stadt.",,Parolu kun la kuracisto kaj la armila trejnisto en la malsanulejo (Hospital). Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo: lia templo estas ekster la urbo en la limlando.,Habla con el médico y el entrenador de armas en el hospital. Busca al Oráculo y pregúntale sobre las otras piezas del Emblema: su templo está fuera del pueblo en las tierras fronterizas.,,Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Kerää palkkiosi ja hakeudu lääkintämiehen ja asekouluttajan luo terveydenhoitoa ja koulutusta varten. Oraakkelin temppeli sijaitsee rajaseudulla kaupungin laitamilla.,Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. Va chercher ta récompense chez le médecin et le maître d'armes pour de la santé et de l'entraînement. Le temple de l'Oracle se trouve dans les terrains vagues à l'extérieur de la ville. ,,"Keresd fel az Orákulumot, és kérdezd ki a többi pecsét darabról. Vedd fel a jutalmad, majd ugorj át a szanitéchez és kiképzőhöz. Az Orákulum temploma a peremvidéken található, a város külvárosában.","Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Prendi la tua ricompensa e visita il dottore e l'addestratore di armi. Il tempio dell'Oracolo è nelle terre di confine, fuori città.","オラクルに会いシジルの欠片の場所を尋ねろ。 メディックと武器トレーナーに会い訓練と体力を強化せよ。 オラクルは町外れの国境地帯にいる。",오라클을 찾아서 다른 시질 조각이 어디에 있는지 물어봐. 보상을 받고 치료와 훈련을 위해 의무관과 무기 담당관에게로 가. 오라클은 도시 외곽에 있는 접경지 근처에 있어.,"Zoek het Orakel op en vraag het over de andere Sigil stukken. Pak je beloning en ga naar de dokter en wapentrainer voor gezondheid en training. De tempel van het Orakel staat in de grensgebieden, aan de rand van de stad.","Oppsøk oraklet og spør det om de andre Sigil-brikkene. Ta belønningen din og gå over til medisineren og våpentreneren for helse og trening. Orakelets tempel ligger i grenselandet, i utkanten av byen.","Poszukaj Wyroczni i zapytaj ją o inne kawałki Sigila. Weź nagrodę i udaj się do medyka i trenera broni po zdrowie i trening. Świątynia Wyroczni znajduje się na pograniczu, na obrzeżach miasta.","Procure pelo Oráculo e pergunte a ele sobre as outras peças do Sigilo. Pegue a sua recompensa e visite o médico e o treinador de armas para saúde e treinamento. O templo do Oráculo se encontra nas fronteiras, do lado de fora da cidade.",,Găsește Oracolul și întreabă-l de piesele Sigiliului. Ia-ți recompensa ți du-te la medic și antrenorul de arme. Templul Oracolului e în mărginimea orașului.,"Найди Оракула и спроси его про другие фрагменты Печати. Возьми свою награду и зайди к медику и инструктору по стрельбе. Храм Оракула находится в пограничье, на окраине города.",,"Sök upp Oraklet och fråga det om de andra Sigilbitarna. Ta din belöning och gå över till läkaren och vapentränaren för hälsa och träning. Oraklets tempel ligger i gränslandet, i utkanten av staden.","Kahin'i bul ve ona diğer Sigil parçalarını sor. Ödülünüzü alın ve sağlık ve eğitim için sıhhiyeciye ve silah eğitmenine gidin. Kahin'in tapınağı sınır bölgelerinde, kasabanın eteklerinde." -Seek out the Oracle's temple and ask it about the other Sigil pieces. Here it is. I'm recording everything. It's not that I don't have faith that you'll survive. It's just that we can't let the Order control the Sigil.,TXT_ILOG50,MAP11: Entrance to cave.,,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Tady to je. Nahrávám všechno, ne že bych neměla důvěru v tvé přežití, ale prostě nemůžeme dovolit Řádu ovládat Pečeť.","Søg ud til Oraklets tempel og spørg det om de andre Sigil stykker. Her er det. Jeg optager alt. Det er ikke fordi jeg ikke tror på, at du vil overleve. Vi kan bare ikke lade Ordenen kontrollere Sigil.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Ich protokolliere alles. Ich glaube zwar schon daran, dass du überleben wirst, aber wir können es halt nicht zulassen, dass der Orden das Sigil kontrolliert.",,"Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo. Jen la enirejo. Mi videoregistras ĉion; mi ne malfidas pri via supervivado, sed ni ne devas ebligi, ke La Ordeno regu la Sigelon.","Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Aquí está la entrada. Lo estoy grabando todo; no es que no tenga fe en tu supervivencia, es solo que no podemos dejar que La Orden controle el Emblema.",,"Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Tässä se on. Tallennan kaiken. Tässä ei ole kyse siitä, etteikö minulla olisi täysi luotto, että selviäisit. Emme vain voi antaa Veljeskunnan hallita Sinettiä.","Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. Le voilà. J'enregistre tout, ce n'est pas que je n'ai pas confiance en ta capacité de survie, c'est juste que je ne peux pas laisser l'Ordre contrôler le Sigil.","Keresd fel az Orákulumot a templomában, és kérdezd meg a pecsét többi darabjáról. Itt is van. Felveszek mindent. Nem mintha nem bíznék meg benned, csak nem akarom, hogy a Rend kezébe kerüljön a pecsét.",Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Ecco qua. Sto registrando tutto. Non è che non penso che sopravviverai. È solo che non possiamo lasciare che l'Ordine controlli il Sigillo.,"オラクルに会いシジルの欠片の場所を尋ねろ。 +Seek out the Oracle's temple and ask it about the other Sigil pieces. Here it is. I'm recording everything. It's not that I don't have faith that you'll survive. It's just that we can't let the Order control the Sigil.,TXT_ILOG50,MAP11: Entrance to cave.,,,"Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Tady to je. Nahrávám všechno, ne že bych neměla důvěru v tvé přežití, ale prostě nemůžeme dovolit Řádu ovládat Pečeť.","Søg ud til Oraklets tempel og spørg det om de andre Sigil stykker. Her er det. Jeg optager alt. Det er ikke fordi jeg ikke tror på, at du vil overleve. Vi kan bare ikke lade Ordenen kontrollere Sigil.","Suche das Orakel auf und befrage es bezüglich der anderen Teile des Sigils. Ich protokolliere alles. Ich glaube zwar schon daran, dass du überleben wirst, aber wir können es halt nicht zulassen, dass der Orden das Sigil kontrolliert.",,"Serĉu la Orakolon kaj demandu al li pri la aliaj pecoj de la Sigelo. Jen la enirejo. Mi videoregistras ĉion; mi ne malfidas pri via supervivado, sed ni ne devas ebligi, ke La Ordeno regu la Sigelon.","Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Aquí está la entrada. Lo estoy grabando todo; no es que no tenga fe en tu supervivencia, es solo que no podemos dejar que La Orden controle el Emblema.",,"Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Tässä se on. Tallennan kaiken. Tässä ei ole kyse siitä, etteikö minulla olisi täysi luotto, että selviäisit. Emme vain voi antaa Veljeskunnan hallita Sinettiä.","Trouve l'Oracle et demande lui où se trouvent les autres pièces du Sigil. Le voilà. J'enregistre tout, ce n'est pas que je n'ai pas confiance en ta capacité de survie, c'est juste que je ne peux pas laisser l'Ordre contrôler le Sigil.",,"Keresd fel az Orákulumot a templomában, és kérdezd meg a pecsét többi darabjáról. Itt is van. Felveszek mindent. Nem mintha nem bíznék meg benned, csak nem akarom, hogy a Rend kezébe kerüljön a pecsét.",Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Ecco qua. Sto registrando tutto. Non è che non penso che sopravviverai. È solo che non possiamo lasciare che l'Ordine controlli il Sigillo.,"オラクルに会いシジルの欠片の場所を尋ねろ。 オラクルはこの場所にいる。私は全部記録している。 私は貴方が生き残る確証がないというわけではなく、 オーダーはシジルを操る事が出来ないというだけだ。 ","오라클의 신전을 찾아서 시질 조각이 어디에 있는지 물어봐. 그리고 지금 난 모든 걸 녹음하고 있어. 네가 살아남을 거라는 믿음을 버린게 아니라, 오더가 시질을 손에 잡게 내버려 둘 수가 없어서 말이야.",Zoek de tempel van het Orakel op en vraag het over de andere Sigil stukken. Hier is het. Ik ben alles aan het opnemen. Niet dat ik er niet op vertrouw dat je het zult overleven. Het is gewoon dat we de Orde de Sigil niet kunnen laten controleren door de Orde.,Oppsøk Orakelets tempel og spør det om de andre seglbitene. Her er det. Jeg tar opp alt. Det er ikke det at jeg ikke har tro på at du overlever. Men vi kan ikke la Ordenen kontrollere seglet.,"Poszukaj świątyni Wyroczni i zapytaj ją o inne kawałki Sigila. Oto on. Nagrywam wszystko. Nie chodzi o to, że nie wierzę, że przeżyjesz. Po prostu nie możemy pozwolić Zakonowi kontrolować Sigilu.","Procure pelo Oráculo e pergunte a ele sobre as outras peças do Sigilo. Certo, estou gravando tudo. Não é que eu não tenha fé de que você vá sobreviver. É só que não podemos deixar a Ordem controlar o Sigilo.",,"Găsește Oracolul și întreabă de celelalte piese ale Sigiliului. Aici este. Înregistrez totul. Nu e vorba că nu am încredere că vei supraviețui, dar nu putem lăsa Ordinul ca ia Sigiliul.","Найди храм Оракула и спроси его про другие фрагменты Печати. Так. Я всё записываю на плёнку. Это не потому, что я не верю, что ты уцелеешь. Просто мы не можем позволить Ордену заполучить Печать.",,Sök upp Orakelns tempel och fråga det om de andra Sigillbitarna. Här är den. Jag spelar in allting. Det är inte så att jag inte tror att du kommer att överleva. Det är bara det att vi inte kan låta Orden kontrollera Sigillet.,Kahin'in tapınağını bulun ve ona diğer Sigil parçalarını sorun. İşte burada. Her şeyi kaydediyorum. Hayatta kalacağınıza inanmadığımdan değil. Sadece Düzen'in Sigil'i kontrol etmesine izin veremeyiz. -The second piece lies at the heart of the crimson and obsidian tower. There you will find the Bishop. The Bishop is the Order's military leader. We off him and we score twice. Take the Oracle's token to the key master in the borderlands.,TXT_ILOG56,MAP12: After talking to the Oracle.,,,"Druhý díl leží v srdci věže karmínoobsidiánové. Tam najdeš Biskupa. Biskup je armádní vůdce Řádu. Plánuje jejich taktiky, velí jejich špiónům a má za úkol ovládat nás. Odděláme ho a zaskórujeme dvakrát.","Den anden del ligger i hjertet af det purpurfarvede og obsidianske tårn. Der vil du finde biskoppen. Biskoppen er ordenens militære leder. Hvis vi dræber ham, scorer vi to gange. Tag Oraklets token til nøglemesteren i grænselandet.","Das zweite Stück liegt im Zentrum des Turms aus Purpur und Obsidian. Dort wirst du den Bischof, den militärischen Anführer des Ordens, finden. Wenn wir ihn kalt machen, können wir zwei Fliegen mit einer Klappe schlagen. Nimm das Zeichen des Orakels und bringe es zum Schlüsselmeister in den Grenzgebieten.",,La dua peco situas en la koro de la turo karmezina kaj obsidiankolora: tie estas la Episkopo la militestro. Ni mortigu lin: du poentojn. Portu la paspermeson de la Orakolo al la ŝlosilestro en la limlando.,La segunda pieza está en el corazón de la torre carmesí y obsidiana: allí está el Obispo el líder militar de La Orden. Nos lo cargamos y marcamos dos puntos. Lleva el pase del Oráculo al amo de llaves en las tierras fronterizas.,La segunda pieza está en el corazón de la torre carmesí y obsidiana: allá está el Obispo el líder militar de La Orden. Lo matamos y premios dobles. Llévale el pase del Oráculo al amo de llaves en las tierras fronterizas.,"Toinen osanen piilee purppuranpunaisen laavalasisen tornin sydämessä. Löydät sieltä Piispan, Veljeskunnan sotapäällikön. Teemme hänestä lopun ja pokkaamme kaksi pistettä. Toimita Oraakkelin merkki avainmestarille rajaseudulla.","La deuxième pièce se trouve au cœur de la tour d'obsidienne et d'écarlate. Tu y trouvera l'évêque. L'évêque est le chef militaire de l'Ordre. Si on le tue, on marque deux points. Prends le jeton de l'Oracle et amène le au Mâitre des Clés dans les terrains vagues. ","A második darab a karmazsin és obszidián torony szívében található. Ott fogod megtalálni a Püspököt. A Püspök a Rend katonai vezetője. Ha kiiktatjuk, duplán nyerünk. Vidd az Orákulum zálogát a kulcsmesterhez, aki a peremvidéken van.",Il secondo pezzo si trova nel cuore della torre cremisina e ossidiana. Lì troverai il Vescovo. Il Vescovo è il capo militare dell'Ordine. Farlo fuori sarebbe un enorme vantaggio. Raggiungi il mastro delle chiavi nelle terre di confine con il pass che ti ha dato l'Oracolo.,"二つ目の欠片は深紅と黒曜石の塔にある。そこでビショップを見つけろ。 +The second piece lies at the heart of the crimson and obsidian tower. There you will find the Bishop. The Bishop is the Order's military leader. We off him and we score twice. Take the Oracle's token to the key master in the borderlands.,TXT_ILOG56,MAP12: After talking to the Oracle.,,,"Druhý díl leží v srdci věže karmínoobsidiánové. Tam najdeš Biskupa. Biskup je armádní vůdce Řádu. Plánuje jejich taktiky, velí jejich špiónům a má za úkol ovládat nás. Odděláme ho a zaskórujeme dvakrát.","Den anden del ligger i hjertet af det purpurfarvede og obsidianske tårn. Der vil du finde biskoppen. Biskoppen er ordenens militære leder. Hvis vi dræber ham, scorer vi to gange. Tag Oraklets token til nøglemesteren i grænselandet.","Das zweite Stück liegt im Zentrum des Turms aus Purpur und Obsidian. Dort wirst du den Bischof, den militärischen Anführer des Ordens, finden. Wenn wir ihn kalt machen, können wir zwei Fliegen mit einer Klappe schlagen. Nimm das Zeichen des Orakels und bringe es zum Schlüsselmeister in den Grenzgebieten.",,La dua peco situas en la koro de la turo karmezina kaj obsidiankolora: tie estas la Episkopo la militestro. Ni mortigu lin: du poentojn. Portu la paspermeson de la Orakolo al la ŝlosilestro en la limlando.,La segunda pieza está en el corazón de la torre carmesí y obsidiana: allí está el Obispo el líder militar de La Orden. Nos lo cargamos y marcamos dos puntos. Lleva el pase del Oráculo al amo de llaves en las tierras fronterizas.,La segunda pieza está en el corazón de la torre carmesí y obsidiana: allá está el Obispo el líder militar de La Orden. Lo matamos y premios dobles. Llévale el pase del Oráculo al amo de llaves en las tierras fronterizas.,"Toinen osanen piilee purppuranpunaisen laavalasisen tornin sydämessä. Löydät sieltä Piispan, Veljeskunnan sotapäällikön. Teemme hänestä lopun ja pokkaamme kaksi pistettä. Toimita Oraakkelin merkki avainmestarille rajaseudulla.","La deuxième pièce se trouve au cœur de la tour d'obsidienne et d'écarlate. Tu y trouvera l'évêque. L'évêque est le chef militaire de l'Ordre. Si on le tue, on marque deux points. Prends le jeton de l'Oracle et amène le au Mâitre des Clés dans les terrains vagues. ",,"A második darab a karmazsin és obszidián torony szívében található. Ott fogod megtalálni a Püspököt. A Püspök a Rend katonai vezetője. Ha kiiktatjuk, duplán nyerünk. Vidd az Orákulum zálogát a kulcsmesterhez, aki a peremvidéken van.",Il secondo pezzo si trova nel cuore della torre cremisina e ossidiana. Lì troverai il Vescovo. Il Vescovo è il capo militare dell'Ordine. Farlo fuori sarebbe un enorme vantaggio. Raggiungi il mastro delle chiavi nelle terre di confine con il pass che ti ha dato l'Oracolo.,"二つ目の欠片は深紅と黒曜石の塔にある。そこでビショップを見つけろ。 ビショップはオーダーの軍事指揮官だ。奴を討ち破り欠片を手に入れろ。 国境地帯のキーマスターにオラクルのトークンを見せよ。",두 번째 시질 조각은 진홍빛 흑요석 탑에 숨어있는 비숍에게 있어. 비숍은 그들의 잔혹한 군사 지도자이지. 거기에 녀석이 있을 거야. 그를 죽이면 두 배로 이득이 갈 거야. 이 통행증을 들고 접경지 안의 열쇠지기에게로 가봐.,Het tweede stuk ligt in het hart van de karmozijnrode en obsidiaan toren. Daar vindt u de bisschop. De bisschop is de militaire leider van de Orde. We gaan van hem af en we scoren twee keer. Neem de orakels van de Orakel mee naar de sleutelmeester in de grensgebieden.,"Den andre biten ligger i hjertet av det purpurfargede og obsidianske tårnet. Der finner du biskopen. Biskopen er Ordenens militære leder. Dreper vi ham, scorer vi to ganger. Ta oraklets symbol til nøkkelmesteren i grenselandene.",Drugi kawałek leży w sercu karmazynowej i obsydianowej wieży. Znajdziesz tam Biskupa. Biskup jest przywódcą wojskowym Zakonu. Wyłączamy go i zdobywamy dwa razy punkty. Zabierz żeton Wyroczni do mistrza kluczy na pograniczu.,A segunda peça está no coração da torre carmesin e obsidiana. Lá você encontrará o Bispo. Ele é o líder militar da Ordem. Nós apagamos ele e serão dois coelhos numa tacada só. Leve o emblema do Oráculo para o mestre das chaves nas fronteiras.,,A doua piesă e în inima turnului stăveziu din obsidian. Episcopul e liderul miltar ar Ordinului. Îl omorâm și înscriem de două ori. Ia semnul Oracolului la stăpânul cheii în mărginime.,Второй фрагмент лежит в сердце багрово-обсидиановой башни. Там ты сразишься с Епископом. Епископ — военный лидер Ордена. От его убийства мы выигрываем вдвойне. Отнеси жетон Оракула ключнику в пограничье.,,Den andra delen ligger i hjärtat av det karmosinröda och obsidianska tornet. Där hittar du biskopen. Biskopen är ordens militära ledare. Om vi dödar honom gör vi två poäng. Ta Orakelns token till nyckelmästaren i gränslandet.,İkinci parça kızıl ve obsidyen kulenin kalbinde yatıyor. Orada Piskopos'u bulacaksın. Piskopos Tarikat'ın askeri lideri. Onu yok edersek iki puan alırız. Kahin'in simgesini sınır bölgelerindeki anahtar ustasına götürün. -"The Bishop is going to be heavily guarded, so why don't we swipe a uniform and blend in? Locate the Bishop. Once you have destroyed him, return to the Oracle.",TXT_ILOG57,MAP11: Officer's uniform room.,,,"Biskup bude silně strážen, co takhle sebrat uniformu a splynout s davem? Najdi Biskupa. Až ho zabiješ, vrať se k Věštci.","Biskoppen vil være stærkt bevogtet, så hvorfor stjæler vi ikke en uniform og blander os i mængden? Find biskoppen. Når du har udslettet ham, vender du tilbage til Oraklet.","Der Bischof wird schwer bewacht sein, also warum besorgen wir uns nicht eine Uniform und mischen uns unter seine Leute? Finde den Bischof. Wenn du ihn vernichtet hast, kehre zum Orakel zurück.",,"La Episkopo havas multe da sekureco. Kio pri ŝteli uniformon kaj miksiĝi? Trovu la Episkopon, mortigu lin kaj reiru al la Orakolo.","El Obispo tiene mucha seguridad. ¿Y si robamos un uniforme y nos mezclamos? Encuentra al Obispo, mátalo y vuelve con el Oráculo.",,"Piispa on tarkoin vartioitu, joten kähvellettäisiinkö univormu ja sulauduttaisiin joukkoon? Paikallista Piispa. Tuhottuasi hänet palaa Oraakkelin luo.","L'évêque sera lourdement protégé. Pourquoi ne pas faire une entrée discrète avec un uniforme? Trouve l'évêque, une fois qu'il est mort, retourne à l'Oracle.","A Püspököt elég erősen védik, ezért ajánlott, hogy szerválj magadnak egy uniformist a beolvadás végett. Találd meg a Püspököt. Ha megölted, térj vissza az Orákulumhoz.","Il Vescovo sarà sicuramente ben protetto, quindi perché non camuffarsi con un'uniforme? Trova il Vescovo. Dopo averlo distrutto, ritorna dall'Oracolo.","ビショップのいる場所の警備は厳重なので、 +"The Bishop is going to be heavily guarded, so why don't we swipe a uniform and blend in? Locate the Bishop. Once you have destroyed him, return to the Oracle.",TXT_ILOG57,MAP11: Officer's uniform room.,,,"Biskup bude silně strážen, co takhle sebrat uniformu a splynout s davem? Najdi Biskupa. Až ho zabiješ, vrať se k Věštci.","Biskoppen vil være stærkt bevogtet, så hvorfor stjæler vi ikke en uniform og blander os i mængden? Find biskoppen. Når du har udslettet ham, vender du tilbage til Oraklet.","Der Bischof wird schwer bewacht sein, also warum besorgen wir uns nicht eine Uniform und mischen uns unter seine Leute? Finde den Bischof. Wenn du ihn vernichtet hast, kehre zum Orakel zurück.",,"La Episkopo havas multe da sekureco. Kio pri ŝteli uniformon kaj miksiĝi? Trovu la Episkopon, mortigu lin kaj reiru al la Orakolo.","El Obispo tiene mucha seguridad. ¿Y si robamos un uniforme y nos mezclamos? Encuentra al Obispo, mátalo y vuelve con el Oráculo.",,"Piispa on tarkoin vartioitu, joten kähvellettäisiinkö univormu ja sulauduttaisiin joukkoon? Paikallista Piispa. Tuhottuasi hänet palaa Oraakkelin luo.","L'évêque sera lourdement protégé. Pourquoi ne pas faire une entrée discrète avec un uniforme? Trouve l'évêque, une fois qu'il est mort, retourne à l'Oracle.",,"A Püspököt elég erősen védik, ezért ajánlott, hogy szerválj magadnak egy uniformist a beolvadás végett. Találd meg a Püspököt. Ha megölted, térj vissza az Orákulumhoz.","Il Vescovo sarà sicuramente ben protetto, quindi perché non camuffarsi con un'uniforme? Trova il Vescovo. Dopo averlo distrutto, ritorna dall'Oracolo.","ビショップのいる場所の警備は厳重なので、 奴等の制服を盗み紛れ込む方が良いのでは? ビショップを探し、始末したらオラクルの元へ戻ろう。","비숍은 군사 지도자니까, 삼엄한 경비에 의해 지켜질 거야. 그러니 전투복을 입고 잠입하는 게 어때? 비숍을 찾아서, 그를 파괴하고 오라클에게 찾아가 봐.","De bisschop zal zwaar bewaakt worden, dus waarom vegen we er niet een uniform overheen en mengen we ons in de bisschop? Zoek de bisschop. Als je hem hebt vernietigd, keer je terug naar het Orakel.","Biskopen kommer til å være tungt bevoktet, så hvorfor tar vi ikke en uniform og smelter inn? Finn biskopen. Når du har tilintetgjort ham, gå tilbake til oraklet.","Biskup będzie pilnie strzeżony, więc może weźmiemy mundur i wtopimy się w tłum? Zlokalizuj Bishopa. Kiedy już go zniszczysz, wróć do Wyroczni.","O Bispo estará protegido por vários guardas, então que tal roubar um uniforme e se mesclar a eles? Localize o Bispo. Assim que você destruí-lo, volte ao Oráculo.",,"Episcopul o să fie extrem de bine înarmat, deci de ce nu strecurăm o uniformă ca să ne camuflăm? Găsește Episcopul. Odată ce l-ai distrus, întoarce-te la Oracol.","Похоже, что Епископа неплохо охраняют, так что почему бы нам не стянуть униформу и прокрасться внутрь? Найди Епископа. После того, как ты уничтожишь его, возвращайся к Оракулу.",,"Biskopen kommer att vara tungt bevakad, så varför inte sno en uniform och smälta in? Leta upp biskopen. När du har förintat honom återvänder du till oraklet.","Piskopos çok sıkı korunuyor olacak, o yüzden neden bir üniforma çalıp aralarına karışmıyoruz? Piskoposu bulun. Onu yok ettikten sonra Kahin'e dönün." -"I just got word that we have an informer inside the fortress. Let's head for the hospital. He works there. After that, locate the Bishop and destroy him. Once he's dead return to the Oracle.",TXT_ILOG59,MAP17: Bailey → Upstairs.,,,"Právě jsem dostala zprávu, že máme v pevnosti informátora. Měli bychom zamířit k nemocnici, pracuje tam. Poté najdi Biskupa. Až ho zabiješ, vrať se k Věštci.","Jeg har lige fået at vide, at vi har en stikker inde i fæstningen. Lad os tage til hospitalet. Han arbejder der. Derefter skal du finde biskoppen og ødelægge ham. Når han er død, skal du vende tilbage til Oraklet.","Mir ist gerade zu Ohren gekommen, dass wir einen Informanten in der Festung haben. Lasst uns zum Krankenhaus gehen, er arbeitet dort. Danach finde den Bischof unz vernichte ihn. Sobald er tot ist kehre zum Orakel zurück.",,"Mi ĵus estis sciigita, ke ni havas informanton en la fortreso: ni iru al la malsanulejo (Hospital) lia laborejo. Vi tiam trovu la Episkopon, mortigu lin kaj reiru al la Orakolo.","Acaban de decirme que tenemos un informante dentro de la fortaleza: vayamos al hospital, que es donde trabaja. Luego encuentra al Obispo, mátalo y vuelve con el Oráculo.","Acaban de decirme que tenemos un informante adentro de la fortaleza: vayamos al hospital, que es donde trabaja. Luego encuentra al Obispo, mátalo y vuelve con el Oráculo.","Sain juuri tiedon ilmiantajasta linnoituksessa. Matkataan sairaalaan; hän työskentelee siellä. Sen jälkeen löydä Piispa ja tuhoa hänet. Kun hän on kuollut, palaa Oraakkelin luo.","Je viens d'avoir vent que l'on a un informant dans la forteresse. Allons à l'hôpital, il y travaille. Après ça, trouve l'évêque et tue-le, puis retourne à l'Oracle.","Most kaptam a hírt, hogy van egy belső emberünk az erődítményben. Menjünk a kórházba. Ott dolgozik. Azután találd meg a Püspököt, és öld meg. Ha meghalt, menj az Orákulumhoz.","Ho appena scoperto che abbiamo un informatore dentro la fortezza. Rechiamoci all'ospedale. Lui lavora là. Dopodiché, trova il Vescovo e distruggilo. Non appena è morto, torna dall'Oracolo.","要塞の中に情報提供者がいるという話を聞いた。 +"I just got word that we have an informer inside the fortress. Let's head for the hospital. He works there. After that, locate the Bishop and destroy him. Once he's dead return to the Oracle.",TXT_ILOG59,MAP17: Bailey → Upstairs.,,,"Právě jsem dostala zprávu, že máme v pevnosti informátora. Měli bychom zamířit k nemocnici, pracuje tam. Poté najdi Biskupa. Až ho zabiješ, vrať se k Věštci.","Jeg har lige fået at vide, at vi har en stikker inde i fæstningen. Lad os tage til hospitalet. Han arbejder der. Derefter skal du finde biskoppen og ødelægge ham. Når han er død, skal du vende tilbage til Oraklet.","Mir ist gerade zu Ohren gekommen, dass wir einen Informanten in der Festung haben. Lasst uns zum Krankenhaus gehen, er arbeitet dort. Danach finde den Bischof unz vernichte ihn. Sobald er tot ist kehre zum Orakel zurück.",,"Mi ĵus estis sciigita, ke ni havas informanton en la fortreso: ni iru al la malsanulejo (Hospital) lia laborejo. Vi tiam trovu la Episkopon, mortigu lin kaj reiru al la Orakolo.","Acaban de decirme que tenemos un informante dentro de la fortaleza: vayamos al hospital, que es donde trabaja. Luego encuentra al Obispo, mátalo y vuelve con el Oráculo.","Acaban de decirme que tenemos un informante adentro de la fortaleza: vayamos al hospital, que es donde trabaja. Luego encuentra al Obispo, mátalo y vuelve con el Oráculo.","Sain juuri tiedon ilmiantajasta linnoituksessa. Matkataan sairaalaan; hän työskentelee siellä. Sen jälkeen löydä Piispa ja tuhoa hänet. Kun hän on kuollut, palaa Oraakkelin luo.","Je viens d'avoir vent que l'on a un informant dans la forteresse. Allons à l'hôpital, il y travaille. Après ça, trouve l'évêque et tue-le, puis retourne à l'Oracle.",,"Most kaptam a hírt, hogy van egy belső emberünk az erődítményben. Menjünk a kórházba. Ott dolgozik. Azután találd meg a Püspököt, és öld meg. Ha meghalt, menj az Orákulumhoz.","Ho appena scoperto che abbiamo un informatore dentro la fortezza. Rechiamoci all'ospedale. Lui lavora là. Dopodiché, trova il Vescovo e distruggilo. Non appena è morto, torna dall'Oracolo.","要塞の中に情報提供者がいるという話を聞いた。 奴等が病院と呼んでいる場所に勤めているので向かいましょう。","요새 안에 우리들을 도울 정보원이 있다는 보고를 들었어. 그는 병원 안에 있는데, 그곳으로 찾아가 봐. 만난 뒤엔 비숍을 찾은 뒤 그를 파괴하고 오라클에게 찾아가 봐.","Ik heb net vernomen dat we een informant in het fort hebben. Laten we naar het ziekenhuis gaan. Hij werkt daar. Zoek daarna de bisschop en vernietig hem. Als hij dood is, ga dan terug naar het Orakel.","Jeg fikk nettopp beskjed om at vi har en informant inne i festningen. La oss dra til sykehuset. Han jobber der. Etter det, finn biskopen og drep ham. Når han er død, gå tilbake til Orakelet.","Właśnie dostałem wiadomość, że mamy informatora w twierdzy. Jedźmy do szpitala. On tam pracuje. Po tym zlokalizuj Bishopa i zniszcz go. Gdy będzie martwy, wróć do Wyroczni.","Acabei de saber que temos um informante dentro da fortaleza. Vamos ao hospital. Ele trabalha lá. Após isso, localize o Bispo e destrua-o. Assim que ele morrer retorne ao Oráculo.",,"Tocmai am primit informație că avem un informator în fortăreață. Să mergem către spital. Acolo lucrează. După aceea, să îl găsim pe Episcop și să-l eliminăm. Odată ce e mort întoarce-te la Oracol.","Мне только что сказали, что у нас есть информатор внутри крепости. Идём к госпиталю — он работает там. Затем найди Епископа и убей его. После его смерти вернись к Оракулу.",,Jag fick just veta att vi har en informatör inne i fästningen. Vi går till sjukhuset. Han jobbar där. Efter det ska du lokalisera biskopen och förgöra honom. När han är död återvänder du till oraklet.,"Az önce kalenin içinde bir muhbirimiz olduğu haberini aldım. Hastaneye gidelim. Orada çalışıyor. Ondan sonra, Piskoposu bulun ve onu yok edin. O öldükten sonra Kahin'e dönün." -"Don't give up. This is it. Straight ahead. Jump on the teleporter to central administration and destroy the computer core. This will kill the force field on the entrance to the Bishop's tower. Once he's dead, return to the Oracle.",TXT_ILOG64,MAP19: Last room (southwestern).,,,"Nevzdávej se, tohle je ono. Jdi rovně. Skoč na teleportér do centrálního velení a znič počítačové jádro. To zruší silové pole u vchodu do Biskupovy věže. Až ho zabiješ, vrať se k Věštci.","Du må ikke give op. Nu gælder det. Lige fremad. Hop på teleporteren til centraladministrationen og ødelæg computerkernen. Dette vil dræbe kraftfeltet ved indgangen til Bishop's tårn. Når han er død, skal du vende tilbage til Oraklet.",Nicht aufgeben. Da ist es. Direkt voraus. Springe auf den Teleporter zur Zentralverwaltung und zerstöre den Kern des Computers. Das wird das Kraftfeld zum Eingang des Turms des Bischofs lahmlegen. Sobald er tot ist kehre zum Orakel zurück.,,"Uzu la teleportilon al la centra administrejo kaj detruu la kernon de la komputilo, kiu tenas la fortokampon ĉe la enirejo de la turo de la Episkopo. Mortiginte lin, reiru al la Orakolo.","Entra en el teletransportador a la administración central y destruye el núcleo del ordenador que mantiene el campo de fuerza en la entrada de la torre del Obispo. Una vez muerto, vuelve con el Oráculo.","Entra al teletransportador a la administración central y destruye el núcleo de la computadora que mantiene el campo de fuerza en la entrada de la torre del Obispo. Una vez muerto, vuelve con el Oráculo.","Älä luovuta. Se on nyt tässä, suoraan edessä. Astu keskushallintoon johtavaan kaukosiirtimeen ja tuhoa keskustietokone. Se sammuttaa Piispan tornin voimakentän. Kun hän on kuollut, palaa Oraakkelin luo.","N'abandonne pas, on y est bientôt. Utilise le téléporteur vers le centre d'administration et détruis le cœur informatique. Cela désactivera le champ de force et l'entrée vers la tour de l'évêque. Une fois qu'il est mort, retourne voir l'Oracle.","Ne add fel. Már a célegyenesben vagyunk, rögtön előttünk van. A teleportot használva menj a központi irányításhoz és semmisítsd meg a számítógép magot. Ez majd kikapcsolja a Püspök tornyának bejárati erőpajzsát. Ha megölted, térj vissza az Orákulumhoz.","Non arrenderti. Siamo arrivati. Dritto in fronte a te. Entra in questo teletrasporto per l'amministrazione centrale e distruggi il nucleo del computer. Questo disattiverà il campo di forza per l'ingresso della torre del Vescovo. Non appena è morto, torna dall'Oracolo","諦めないで。これでいいんだ。真っ直ぐ行こう。 +"Don't give up. This is it. Straight ahead. Jump on the teleporter to central administration and destroy the computer core. This will kill the force field on the entrance to the Bishop's tower. Once he's dead, return to the Oracle.",TXT_ILOG64,MAP19: Last room (southwestern).,,,"Nevzdávej se, tohle je ono. Jdi rovně. Skoč na teleportér do centrálního velení a znič počítačové jádro. To zruší silové pole u vchodu do Biskupovy věže. Až ho zabiješ, vrať se k Věštci.","Du må ikke give op. Nu gælder det. Lige fremad. Hop på teleporteren til centraladministrationen og ødelæg computerkernen. Dette vil dræbe kraftfeltet ved indgangen til Bishop's tårn. Når han er død, skal du vende tilbage til Oraklet.",Nicht aufgeben. Da ist es. Direkt voraus. Springe auf den Teleporter zur Zentralverwaltung und zerstöre den Kern des Computers. Das wird das Kraftfeld zum Eingang des Turms des Bischofs lahmlegen. Sobald er tot ist kehre zum Orakel zurück.,,"Uzu la teleportilon al la centra administrejo kaj detruu la kernon de la komputilo, kiu tenas la fortokampon ĉe la enirejo de la turo de la Episkopo. Mortiginte lin, reiru al la Orakolo.","Entra en el teletransportador a la administración central y destruye el núcleo del ordenador que mantiene el campo de fuerza en la entrada de la torre del Obispo. Una vez muerto, vuelve con el Oráculo.","Entra al teletransportador a la administración central y destruye el núcleo de la computadora que mantiene el campo de fuerza en la entrada de la torre del Obispo. Una vez muerto, vuelve con el Oráculo.","Älä luovuta. Se on nyt tässä, suoraan edessä. Astu keskushallintoon johtavaan kaukosiirtimeen ja tuhoa keskustietokone. Se sammuttaa Piispan tornin voimakentän. Kun hän on kuollut, palaa Oraakkelin luo.","N'abandonne pas, on y est bientôt. Utilise le téléporteur vers le centre d'administration et détruis le cœur informatique. Cela désactivera le champ de force et l'entrée vers la tour de l'évêque. Une fois qu'il est mort, retourne voir l'Oracle.",,"Ne add fel. Már a célegyenesben vagyunk, rögtön előttünk van. A teleportot használva menj a központi irányításhoz és semmisítsd meg a számítógép magot. Ez majd kikapcsolja a Püspök tornyának bejárati erőpajzsát. Ha megölted, térj vissza az Orákulumhoz.","Non arrenderti. Siamo arrivati. Dritto in fronte a te. Entra in questo teletrasporto per l'amministrazione centrale e distruggi il nucleo del computer. Questo disattiverà il campo di forza per l'ingresso della torre del Vescovo. Non appena è morto, torna dall'Oracolo","諦めないで。これでいいんだ。真っ直ぐ行こう。 中央管理室のテレポーターに入りコンピューターコアを破壊せよ。 それはビショップのフォースフィールドを殺せる。 ビショップも殺したらオラクルの元へ戻れ。",포기하지 마. 이제 거의 다 왔어. 저 텔레포터를 올라타서 관리소로 가서 컴퓨터 중심부를 파괴해. 방어막을 완전히 꺼버리고 비숍을 죽일 수 있을 거야. 그를 파괴하고 오라클에게 찾아가 봐.,"Geef niet op. Dit is het. Rechtdoor. Spring op de teleporter naar de centrale administratie en vernietig de computerkern. Dit zal het krachtveld op de ingang van de Bisschopstoren doden. Als hij dood is, keer je terug naar het Orakel.","Ikke gi opp. Her er det. Rett frem. Hopp på teleporteren til sentraladministrasjonen og ødelegg datakjernen. Dette vil drepe kraftfeltet ved inngangen til biskopens tårn. Når han er død, gå tilbake til Oraklet.","Nie poddawaj się. To jest to. Prosto przed siebie. Wskocz na teleporter do centralnej administracji i zniszcz rdzeń komputera. To zabije pole siłowe przy wejściu do wieży biskupa. Gdy będzie już martwy, wróć do Oracle.",Não desista. A hora é agora. Siga reto adiante. Entre no teletransportador para a administração central e destrua o núcleo de computação. Isso vai derrubar o campo de força na entrada da torre do Bispo. Assim que ele morrer retorne ao Oráculo.,,"Nu te da bătut. Drept în față. Sari pe teleportorul către administrația centrală și distruge nucleul calculatoarelor. Asta va distruge câmpul de forță la intrarea în turnul Episcopului. Odată ce e mort, întoarce-te la Oracol.","Не падай духом. Вот оно. Прямо впереди. Прыгай в телепорт к центральной администрации и уничтожь центральный компьютер. Это отключит силовое поле на входе в башню Епископа. После его смерти, возвращайся к Оракулу.",,Ge inte upp. Det här är det. Rakt fram. Hoppa på teleportern till centraladministrationen och förstör datorkärnan. Detta kommer att döda kraftfältet vid ingången till biskopens torn. När han är död återvänder du till oraklet.,"Sakın pes etmeyin. İşte burası. Dümdüz ilerleyin. Merkezi yönetime giden ışınlayıcıya atla ve bilgisayar çekirdeğini yok et. Bu, Piskopos'un kulesinin girişindeki güç alanını yok edecek. O öldükten sonra Kahin'e dönün." -"Very impressive. Lets blow it up. That should take care of the force field. Let's get back to the bailey, then off to the tower and the Bishop.",TXT_ILOG70,MAP15: After pressing the switch to reveal the computer.,,,Velmi působivé. Co to nechat vybouchnout? To by se mělo postarat o silové pole. Vraťme se zpět do opevnění a tam do věže a k Biskupovi.,Meget imponerende. Lad os sprænge det i luften. Det burde tage sig af kraftfeltet. Lad os komme tilbage til borggården og derefter hen til tårnet og biskoppen.,"Sehr eindrucksvoll. Lass es uns in die Luft jagen. Damit sollte das Kraftfeld ausgeschaltet sein. Lass uns zum Vorhof zurückkehren, dann zum Turm und dem Bischof.",,"Detruu la komputilon; tio devus forigi la fortokampon. Reiru al la korto, eniru la turon kaj serĉu la Episkopon.","Destruye el ordenador; eso debería deshacerse del campo de fuerza. Volvamos al patio, luego directo a la torre y al Obispo.","Destruye la computadora; eso debería deshacerse del campo de fuerza. Volvamos al patio, luego directo a la torre y al Obispo.","Aika vaikuttava. Posautetaan se. Sillä voimakentän pitäisi hoitua. Palataan linnanpihaan, josta sitten torniin Piispan luo.","Excellent, maintenant, faisons tout sauter. Cela devrait nous débarasser du cœur informatique. Retourne au mur d'enceinte puis rentre dans la tour de l'évêque.","Felettébb lenyűgöző. Robbantsuk is fel. Ez majd gondoskodik az erőpajzsról. Menjünk vissza a várfalhoz, majd a toronyhoz és magához a Püspökhöz.",Davvero impressionante. Facciamolo saltare in aria. Ora il campo di forza dovrebbe essere disattivato. Ora raggiungiamo la torre e facciamo fuori il Vescovo.,"あら、見事な物ね。是非とも火薬を献上しましょう。 +"Very impressive. Lets blow it up. That should take care of the force field. Let's get back to the bailey, then off to the tower and the Bishop.",TXT_ILOG70,MAP15: After pressing the switch to reveal the computer.,,,Velmi působivé. Co to nechat vybouchnout? To by se mělo postarat o silové pole. Vraťme se zpět do opevnění a tam do věže a k Biskupovi.,Meget imponerende. Lad os sprænge det i luften. Det burde tage sig af kraftfeltet. Lad os komme tilbage til borggården og derefter hen til tårnet og biskoppen.,"Sehr eindrucksvoll. Lass es uns in die Luft jagen. Damit sollte das Kraftfeld ausgeschaltet sein. Lass uns zum Vorhof zurückkehren, dann zum Turm und dem Bischof.",,"Detruu la komputilon; tio devus forigi la fortokampon. Reiru al la korto, eniru la turon kaj serĉu la Episkopon.","Destruye el ordenador; eso debería deshacerse del campo de fuerza. Volvamos al patio, luego directo a la torre y al Obispo.","Destruye la computadora; eso debería deshacerse del campo de fuerza. Volvamos al patio, luego directo a la torre y al Obispo.","Aika vaikuttava. Posautetaan se. Sillä voimakentän pitäisi hoitua. Palataan linnanpihaan, josta sitten torniin Piispan luo.","Excellent, maintenant, faisons tout sauter. Cela devrait nous débarasser du cœur informatique. Retourne au mur d'enceinte puis rentre dans la tour de l'évêque.",,"Felettébb lenyűgöző. Robbantsuk is fel. Ez majd gondoskodik az erőpajzsról. Menjünk vissza a várfalhoz, majd a toronyhoz és magához a Püspökhöz.",Davvero impressionante. Facciamolo saltare in aria. Ora il campo di forza dovrebbe essere disattivato. Ora raggiungiamo la torre e facciamo fuori il Vescovo.,"あら、見事な物ね。是非とも火薬を献上しましょう。 それでベイリーに戻ってフォースフィールドが守っていたビショップの塔へ向かおう。",아주 인상 깊은데? 어서 파괴하자고. 그러면 방어막을 끌 수 있을 거야. 그 후에 안뜰로 향해서 성으로 찾아가. 그리고 비숍을 죽여버려.,"Zeer indrukwekkend. Laten we het opblazen. Dat zou voor het krachtveld moeten zorgen. Laten we teruggaan naar de bailey, dan naar de toren en de bisschop.","Veldig imponerende. La oss sprenge det. Det burde ta seg av kraftfeltet. La oss gå tilbake til borggården, og så til tårnet og biskopen.","Bardzo efektowne. Wysadźmy ją w powietrze. To powinno załatwić sprawę pola siłowego. Wracajmy na podzamcze, a potem do wieży i biskupa.",Impressionante mesmo. Vamos detoná-lo. Isso deve dar um jeito no campo de força. Volte para a fortaleza e depois vá para a torre encontrar o Bispo.,,"Foarte impresionant. Să-l aruncăm în aer. Asta va rezolva problema câmpului de forță. Să ne întoarcem la alee, apoi către turn și Episcop.","Очень впечатляюще. Давай взорвём. Это должно избавить нас от проблем с силовым полем. Возвращаемся во внутренний двор, затем к башне и Епископу.",,Mycket imponerande. Låt oss spränga det i luften. Det borde ta hand om kraftfältet. Vi går tillbaka till borggården och sedan vidare till tornet och biskopen.,"Çok etkileyici. Hadi onu havaya uçuralım. Bu güç alanının icabına bakacaktır. Dış avluya geri dönelim, sonra kuleye ve Piskopos'a gidelim." -"Bravo, another piece of the Sigil! Did you see that weird spectre that came out of the Bishop's body? Where have I seen that before? Let's get back to the Oracle.",TXT_ILOG74,MAP16: After killing the Bishop.,,,"Bravo, další díl Pečetě! Viděl jsi ten divný přízrak, který vyšel z Biskupova těla? Kde jsem ho jen předtím viděla? Vraťme se k Věštci.","Bravo, endnu et stykke af Sigil! Så du det underlige spøgelse, der kom ud af biskoppens krop? Hvor har jeg set det før? Lad os gå tilbage til Oraklet.","Gratulation, ein weiteres Teil des Sigils! Hast du den merkwürdigen Schemen gesehen, der aus dem Körper des Bischofs herauskam? Wo habe ich ihn bloß schon einmal gesehen? Lass uns zum Orakel zurückkehren.",,"Brave, alia peco de la Sigelo! Kia stranga fantomo eliris el la korpo de la Episkopo. De kie ĝi ŝajnis konata al mi? Reiru al la Orakolo.","¡Bravo, otra pieza del Emblema! ¿Has visto ese extraño espectro que había salido del cuerpo del Obispo?, ¿de dónde me sonará? Volvamos con el Oráculo.","¡Bravo, otra pieza del Emblema! ¿Viste ese extraño espectro que había salido del cuerpo del Obispo?, ¿de dónde me sonará? Volvamos con el Oráculo.","Bravo, toinen Sinetin osanen! Näitkö tuon oudon aaveen, joka nousi Piispan ruumiista? Missä olen nähnyt sen aiemmin? Palataan Oraakkelin luokse.","Bravo, encore une pièce du Sigil! Tu a vu ce spectre étrange qui est sorti du corps de l'évêque? Je crois l'avoir vu avant, retournons à l'Oracle.","Bravó, egy újabb pecsét darab! Láttad azt a fura kísértetet ami a Püspök teteméből eltávozott? Hol is láttam hasonlót? Menjünk vissza az Orákulumhoz.","Bravo, un altro pezzo del Sigillo! Hai visto quello strano spettro che è uscito dal corpo del Vescovo? Dove l'ho già visto prima? Torniamo dall'Oracolo.","ブラボー!新たなるシジルの欠片だ! +"Bravo, another piece of the Sigil! Did you see that weird spectre that came out of the Bishop's body? Where have I seen that before? Let's get back to the Oracle.",TXT_ILOG74,MAP16: After killing the Bishop.,,,"Bravo, další díl Pečetě! Viděl jsi ten divný přízrak, který vyšel z Biskupova těla? Kde jsem ho jen předtím viděla? Vraťme se k Věštci.","Bravo, endnu et stykke af Sigil! Så du det underlige spøgelse, der kom ud af biskoppens krop? Hvor har jeg set det før? Lad os gå tilbage til Oraklet.","Gratulation, ein weiteres Teil des Sigils! Hast du den merkwürdigen Schemen gesehen, der aus dem Körper des Bischofs herauskam? Wo habe ich ihn bloß schon einmal gesehen? Lass uns zum Orakel zurückkehren.",,"Brave, alia peco de la Sigelo! Kia stranga fantomo eliris el la korpo de la Episkopo. De kie ĝi ŝajnis konata al mi? Reiru al la Orakolo.","¡Bravo, otra pieza del Emblema! ¿Has visto ese extraño espectro que había salido del cuerpo del Obispo?, ¿de dónde me sonará? Volvamos con el Oráculo.","¡Bravo, otra pieza del Emblema! ¿Viste ese extraño espectro que había salido del cuerpo del Obispo?, ¿de dónde me sonará? Volvamos con el Oráculo.","Bravo, toinen Sinetin osanen! Näitkö tuon oudon aaveen, joka nousi Piispan ruumiista? Missä olen nähnyt sen aiemmin? Palataan Oraakkelin luokse.","Bravo, encore une pièce du Sigil! Tu a vu ce spectre étrange qui est sorti du corps de l'évêque? Je crois l'avoir vu avant, retournons à l'Oracle.",,"Bravó, egy újabb pecsét darab! Láttad azt a fura kísértetet ami a Püspök teteméből eltávozott? Hol is láttam hasonlót? Menjünk vissza az Orákulumhoz.","Bravo, un altro pezzo del Sigillo! Hai visto quello strano spettro che è uscito dal corpo del Vescovo? Dove l'ho già visto prima? Torniamo dall'Oracolo.","ブラボー!新たなるシジルの欠片だ! ビショップの体から出てきたあの奇妙な幽体を見た? 以前に何処かで見た気がするけど?",브라보! 두 번째 시질 조각을 얻었어! 그나저나 비숍 몸에서 튀어나왔던 검은 물체 봤어? 전에 본 적이 있나? 오라클에게 돌아가자.,"Bravo, nog een stukje van de Sigil! Zag je dat rare spook dat uit het lichaam van de bisschop kwam? Waar heb ik dat eerder gezien? Laten we teruggaan naar het Orakel.","Bravo, enda en bit av sigillet! Så du det rare spøkelset som kom ut av biskopens kropp? Hvor har jeg sett det før? La oss gå tilbake til oraklet.","Brawo, kolejny kawałek Sigilu! Widziałeś to dziwne widmo, które wyszło z ciała biskupa? Gdzie ja to już widziałem? Wróćmy do Wyroczni.",Bravo! Outra peça do Sigilo! Você viu aquele espectro estranho que saiu do corpo do Bispo? Onde foi que eu já vi aquilo antes? Vamos voltar para o Oráculo.,,"Bravo, încă o bucată din Sigiliu! Ai văzut spectrul ciudat ce a ieșit din corpul Episcopului? Unde am mai văzut asta oare? Să ne întoarcem la Oracol.","Браво, ещё один фрагмент Печати! Видел тот странный фантом, вышедший из тела Епископа? Где я могла видеть такое раньше? Давай вернёмся к Оракулу.",,"Bravo, ännu en del av Sigillet! Såg du det konstiga spöket som kom ut ur biskopens kropp? Var har jag sett det förut? Låt oss gå tillbaka till oraklet.","Bravo, Sigil'in bir parçası daha! Piskopos'un bedeninden çıkan garip hayaleti gördün mü? Bunu daha önce nerede görmüştüm? Kahin'e geri dönelim." -"I have a report that the spectral energy we found near the Bishop is also present by the Oracle, let's be careful.",TXT_ILOG76,MAP11: After killing the Bishop and going to MAP12's entrance.,,,"Mám hlašení, že stejná přízračná energie, kterou jsme našli u Biskupa, se nachází také u Věštce, měli bychom být opatrní.","Jeg har en rapport om, at den spektrale energi, vi fandt nær biskoppen, også er til stede ved Oraklet, lad os være forsigtige.","Ich habe einen Report, dass die spektrale Energie, die wir beim Bischof vorfanden, auch in der Nähe des Orakels vorhanden ist. Wir sollten vorsichtig sein.",,"Laŭ informo, la fantoma energio trovita proksime de la Episkopo estas ankaŭ apud la Orakolo. Ni estu atentaj.",Tengo un informe de que la energía espectral que habíamos encontrado cerca del Obispo también está junto al Oráculo. Tengamos cuidado.,,"Sain tiedon, että aave-energiaa, jota löysimme Piispan läheltä, on läsnä myös Oraakkelin luona. Ollaan varovaisia.","Je recois un rapport que l'énergie spectrale qui possédait l'évêque se trouve aussi aux alentours de l'Oracle, fais attention.","Kaptam egy jelentést, hogy a Püspök körül érzékelt kísérteties energia észlelhető az Orákulum körül is. Vigyázzunk vele.","Ho qua un rapporto che ci informa che l'energia spettrale che abbiamo trovato vicino il Vescovo è anche presente vicino l'Oracolo, dobbiamo essere attenti.","ビショップにもあったスペクトラルエネルギーがオラクルにも宿っているという +"I have a report that the spectral energy we found near the Bishop is also present by the Oracle, let's be careful.",TXT_ILOG76,MAP11: After killing the Bishop and going to MAP12's entrance.,,,"Mám hlašení, že stejná přízračná energie, kterou jsme našli u Biskupa, se nachází také u Věštce, měli bychom být opatrní.","Jeg har en rapport om, at den spektrale energi, vi fandt nær biskoppen, også er til stede ved Oraklet, lad os være forsigtige.","Ich habe einen Report, dass die spektrale Energie, die wir beim Bischof vorfanden, auch in der Nähe des Orakels vorhanden ist. Wir sollten vorsichtig sein.",,"Laŭ informo, la fantoma energio trovita proksime de la Episkopo estas ankaŭ apud la Orakolo. Ni estu atentaj.",Tengo un informe de que la energía espectral que habíamos encontrado cerca del Obispo también está junto al Oráculo. Tengamos cuidado.,,"Sain tiedon, että aave-energiaa, jota löysimme Piispan läheltä, on läsnä myös Oraakkelin luona. Ollaan varovaisia.","Je recois un rapport que l'énergie spectrale qui possédait l'évêque se trouve aussi aux alentours de l'Oracle, fais attention.",,"Kaptam egy jelentést, hogy a Püspök körül érzékelt kísérteties energia észlelhető az Orákulum körül is. Vigyázzunk vele.","Ho qua un rapporto che ci informa che l'energia spettrale che abbiamo trovato vicino il Vescovo è anche presente vicino l'Oracolo, dobbiamo essere attenti.","ビショップにもあったスペクトラルエネルギーがオラクルにも宿っているという 報告があるわ、気を付けて。","지금 보고를 받았는데, 비숍을 죽인 뒤에 나온 혼령의 기운이 오라클에게도 있데. 조심하자.","Ik heb een bericht dat de spectrale energie die we in de buurt van de bisschop vonden ook aanwezig is bij het Orakel, laten we voorzichtig zijn.","Jeg har en rapport om at den spektrale energien vi fant nær biskopen også er til stede ved oraklet, la oss være forsiktige.","Mam raport, że energia widmowa, którą znaleźliśmy w pobliżu Bishopa, jest również obecna przy Wyroczni, bądźmy ostrożni.",Recebi um relatório de que a energia espectral que encontramos perto do Bispo também está presente pelo Oráculo. Precisamos tomar cuidado.,,"Am un raport care spune că energia spectrală a Episcopului a prezentă și în Oracol, s-avem grijă.","Мне доложили, что спектральная энергия, найденная нами возле Епископа, также исходит от Оракула. Будь начеку.",,"Jag har en rapport om att den spektrala energin som vi hittade nära biskopen också finns vid oraklet, låt oss vara försiktiga.","Piskoposun yanında bulduğumuz spektral enerjinin Kahin tarafından da mevcut olduğuna dair bir rapor aldım, dikkatli olalım." -Richter has taken over command of our forces. It looks like Macil has been deceiving us all along. His true allegiance was to the Order. What a snake. Let's get back to the Oracle.,TXT_ILOG79,MAP10: After killing Macil (Spectre) without having destroyed the converter in MAP24.,,,"Richter převzal velení našich sil. Zdá se, že nás Macil celou dobu klamal. Ve skutečnosti byl věrný Řádu. Slizák jeden. Vraťme se k Věštci.","Richter har overtaget kommandoen over vores styrker. Det ser ud til, at Macil har bedraget os hele tiden. Hans sande loyalitet var over for ordenen. Sikke en slange. Lad os gå tilbage til Oraklet.",Richter hat das Kommando über unsere Streitkräfte übernommen. Es scheint als hätte Macil uns die ganze Zeit über getäuscht. Sein wahre Loyalität gehörte dem Orden. Was für eine Ratte. Lass uns zum Orakel zurückkehren.,,"Rikter iĝis la nova frontestro. Ŝajnas, ke Macil trompis nin de la komenco: lia vera fidelo estis al La Ordeno. Kia serpento. Reiru al la Orakolo.",Richter ha tomado el mando del Frente. Parece que Macil nos ha estado engañando todo este tiempo: su verdadera lealtad era a La Orden. Menuda víbora. Volvamos con el Oráculo.,Richter tomó el mando del Frente. Parece que Macil nos ha estado engañando todo este tiempo: su verdadera lealtad era a La Orden. Tremenda víbora. Volvamos con el Oráculo.,"Richter on ottanut joukkomme komentoonsa. Näyttää siltä, että Macil on pettänyt meitä alusta alkaen. Hänen todellinen uskollisuutensa on ollut Veljeskunnalle; mikä käärme. Palataan Oraakkelin luokse.","Richter a pris le contrôle de nos forces. Il semble que Macil nous a menti tout du long. Sa vraie allégiance était avec l'Ordre, quel serpent! Retournous à l'Oracle.",Richter átvette az írányítást a csapataink fölött. Úgy tűnik Macil mindvégig megtévesztett minket. Valójában mindvégig a Rend oldalán volt. micsoda kígyó. Menjünk vissza az Orákulumhoz.,Richter ha assunto il comando delle nostre forze. Sembra che Macil ci avesse ingannato fin dall'inizio. In realtà è sempre stato alleato con l'Ordine. Che serpente. Ritorniamo dall'Oracolo.,"リヒターが指揮官の任を引き継いだ。マシルはずっと私達を騙していたなんて。 +Richter has taken over command of our forces. It looks like Macil has been deceiving us all along. His true allegiance was to the Order. What a snake. Let's get back to the Oracle.,TXT_ILOG79,MAP10: After killing Macil (Spectre) without having destroyed the converter in MAP24.,,,"Richter převzal velení našich sil. Zdá se, že nás Macil celou dobu klamal. Ve skutečnosti byl věrný Řádu. Slizák jeden. Vraťme se k Věštci.","Richter har overtaget kommandoen over vores styrker. Det ser ud til, at Macil har bedraget os hele tiden. Hans sande loyalitet var over for ordenen. Sikke en slange. Lad os gå tilbage til Oraklet.",Richter hat das Kommando über unsere Streitkräfte übernommen. Es scheint als hätte Macil uns die ganze Zeit über getäuscht. Sein wahre Loyalität gehörte dem Orden. Was für eine Ratte. Lass uns zum Orakel zurückkehren.,,"Rikter iĝis la nova frontestro. Ŝajnas, ke Macil trompis nin de la komenco: lia vera fidelo estis al La Ordeno. Kia serpento. Reiru al la Orakolo.",Richter ha tomado el mando del Frente. Parece que Macil nos ha estado engañando todo este tiempo: su verdadera lealtad era a La Orden. Menuda víbora. Volvamos con el Oráculo.,Richter tomó el mando del Frente. Parece que Macil nos ha estado engañando todo este tiempo: su verdadera lealtad era a La Orden. Tremenda víbora. Volvamos con el Oráculo.,"Richter on ottanut joukkomme komentoonsa. Näyttää siltä, että Macil on pettänyt meitä alusta alkaen. Hänen todellinen uskollisuutensa on ollut Veljeskunnalle; mikä käärme. Palataan Oraakkelin luokse.","Richter a pris le contrôle de nos forces. Il semble que Macil nous a menti tout du long. Sa vraie allégiance était avec l'Ordre, quel serpent! Retournous à l'Oracle.",,Richter átvette az írányítást a csapataink fölött. Úgy tűnik Macil mindvégig megtévesztett minket. Valójában mindvégig a Rend oldalán volt. micsoda kígyó. Menjünk vissza az Orákulumhoz.,Richter ha assunto il comando delle nostre forze. Sembra che Macil ci avesse ingannato fin dall'inizio. In realtà è sempre stato alleato con l'Ordine. Che serpente. Ritorniamo dall'Oracolo.,"リヒターが指揮官の任を引き継いだ。マシルはずっと私達を騙していたなんて。 あの人がオーダーに真の忠誠を誓っていたなんて、とんだ蛇神憑きだわ。",릭터가 저항군의 새로운 지도자가 될 거야. 내 생각엔 마실이 오랫동안 우리들을 속인 것 같아... 뱀 같은 자식. 오라클에게 돌아가자.,Richter heeft het bevel over onze troepen overgenomen. Het lijkt erop dat Macil ons al die tijd heeft bedrogen. Zijn ware trouw was aan de Orde. Wat een slang. Laten we teruggaan naar het Orakel.,Richter har overtatt kommandoen over styrkene våre. Det ser ut til at Macil har lurt oss hele tiden. Hans sanne lojalitet var til Ordenen. For en slange. La oss gå tilbake til orakelet.,"Richter przejął dowodzenie nad naszymi siłami. Wygląda na to, że Macil cały czas nas zwodził. Jego prawdziwa wierność była dla Zakonu. Co za wąż. Wracajmy do Wyroczni.",O Richter assumiu o comando de nossas forças. Parece que o Macil esteve nos enganando durante todo esse tempo. Sua verdadeira lealdade era à Ordem. Que traíra! Vamos voltar para o Oráculo.,,Richter a preluat controlul asupra forțelor noastre. Se pare că Macil ne-a mințit tot timpul. A fost loial cu adevărat doar Ordinului. Ce șarpe. Să ne întoarcem la Oracol.,"Рихтер принял на себя командование нашими силами. Похоже, что Мэйсил обманывал всех нас с самого начала. На самом деле он был предан Ордену. Подлец. Давай вернёмся к Оракулу.",,Richter har tagit över befälet över våra styrkor. Det verkar som om Macil har lurat oss hela tiden. Hans sanna lojalitet var till Orden. Vilken orm. Låt oss gå tillbaka till Oraklet.,Richter kuvvetlerimizin komutasını devraldı. Görünüşe göre Macil başından beri bizi kandırıyormuş. Gerçek bağlılığı Tarikat'a imiş. Ne yılan ama. Kahin'e geri dönelim. -Another Sigil piece. We are one step closer to freedom. And you are one step closer to me. Let's get back to the Oracle!,TXT_ILOG83,MAP27: After killing the Loremaster with either Macil or the Oracle alive.,,,Další díl Pečeti. Jsme o krok blíž ke svobodě. A ty jsi o krok blíž ke mě. Vraťme se k Věštci.,Endnu et Sigil-stykke. Vi er et skridt nærmere friheden. Og du er et skridt tættere på mig. Lad os komme tilbage til Oraklet!,Ein weiteres Teilstück des Sigils. Wir sind der Freiheit einen Schritt näher gekommen. Lass uns zurückgehen zum Orakel.,,Alia peco de la Sigelo. Ni estas unu paŝo pli proksime de la libereco... kaj ankaŭ vi de mi. Reiru al la Orakolo!,Otra pieza del Emblema. Estamos a un paso más cerca de la libertad... y también tú de mí. ¡Volvamos con el Oráculo!,,Jälleen uusi Sinetin osanen. Olemme taas askeleen lähempänä vapautta. Ja sinä askeleen lähempänä minua. Palataan Oraakkelin luo!,"Encore une pièce du Sigil. Nous nous rapprochons de la liberté, et tu te rapproche aussi de moi. Retournons à l'Oracle!",Még egy pecsét darab. Egy lépéssel közelebb állunk a szabadsághoz. Te pedig egy lépéssel közelebb vagy hozzám. menjünk vissza az orákulumhoz.,Un altro pezzo del Sigillo. Siamo ancora più vicini alla libertà. E tu sei ancora più vicino a me. Ritorniamo all'Oracolo!,"更なるシジルの欠片だ。私達の自由にまた一歩近づいたわ。 +Another Sigil piece. We are one step closer to freedom. And you are one step closer to me. Let's get back to the Oracle!,TXT_ILOG83,MAP27: After killing the Loremaster with either Macil or the Oracle alive.,,,Další díl Pečeti. Jsme o krok blíž ke svobodě. A ty jsi o krok blíž ke mě. Vraťme se k Věštci.,Endnu et Sigil-stykke. Vi er et skridt nærmere friheden. Og du er et skridt tættere på mig. Lad os komme tilbage til Oraklet!,Ein weiteres Teilstück des Sigils. Wir sind der Freiheit einen Schritt näher gekommen. Lass uns zurückgehen zum Orakel.,,Alia peco de la Sigelo. Ni estas unu paŝo pli proksime de la libereco... kaj ankaŭ vi de mi. Reiru al la Orakolo!,Otra pieza del Emblema. Estamos a un paso más cerca de la libertad... y también tú de mí. ¡Volvamos con el Oráculo!,,Jälleen uusi Sinetin osanen. Olemme taas askeleen lähempänä vapautta. Ja sinä askeleen lähempänä minua. Palataan Oraakkelin luo!,"Encore une pièce du Sigil. Nous nous rapprochons de la liberté, et tu te rapproche aussi de moi. Retournons à l'Oracle!",,Még egy pecsét darab. Egy lépéssel közelebb állunk a szabadsághoz. Te pedig egy lépéssel közelebb vagy hozzám. menjünk vissza az orákulumhoz.,Un altro pezzo del Sigillo. Siamo ancora più vicini alla libertà. E tu sei ancora più vicino a me. Ritorniamo all'Oracolo!,"更なるシジルの欠片だ。私達の自由にまた一歩近づいたわ。 そして私にも一歩近づいている。",또 다른 시질 조각이야. 자유로 향하는 길이 거의 얼마 남지 않았어. 그리고 나와 만날 순간도 얼마 남지 않았고. 오라클을 만나러 가자!,Nog een Sigil-peijsje. We zijn een stap dichter bij de vrijheid. En je bent een stap dichter bij mij. Laten we teruggaan naar het Orakel!,Enda en Sigil-brikke. Vi er ett skritt nærmere friheten. Og du er ett skritt nærmere meg. La oss gå tilbake til Orakelet!,Kolejny kawałek Sigil. Jesteśmy o krok bliżej wolności. A ty jesteś o krok bliżej mnie. Wracajmy do Wyroczni!,Outra peça do Sigilo. Estamos nos aproximando da liberdade. E você está ficando mais próximo de mim. Vamos voltar para o Oráculo!,,Altă piesă din Sigiliu. Suntem cu un pas mai aproape de libertate. Și tu ești cu un pas mai aproape de mne. Să ne întoarcem la Oracol.,Очередной фрагмент Печати. Теперь мы ещё на шаг ближе к освобождению. А ты — ещё на шаг ближе ко мне. Давай возвращаться к Оракулу!,,Ännu en Sigil-bit. Vi är ett steg närmare friheten. Och du är ett steg närmare mig. Låt oss gå tillbaka till Oraklet!,Başka bir Sigil parçası. Özgürlüğe bir adım daha yaklaştık. Ve sen de bana bir adım daha yaklaştın. Kahin'e geri dönelim! -You wield the power of the complete Sigil. What do you say we get some closure. Let's see what the Loremaster's been protecting.,TXT_ILOG85,MAP27/MAP12: Remark at TXT_SUB_LOG85,,,"Vládneš mocí složené Pečetě. Co říkáš na to, jít s tím vším skončit? Pojďme se podívat, co to Dějepisec bránil.","Du har magten af det komplette Sigil. Hvad siger du til, at vi får en afslutning? Lad os se, hvad Loremesteren har beskyttet.","Du hältst die Kraft des kompletten Sigils in deinen Händen. Meinst du nicht auch, wir sollten die Sache jetzt zu Ende bringen? Lass und nachsehen, was der Wissensmeister beschützt hat.",,"Vi tenas la povon de la tuta Sigelo. Kio pri fini ĉi tiun ĉapitron? Ni vidu tion, kion la Folkloristo kaŝadis.",Empuñas el poder del Emblema completo. ¿Que te parece ponerle un cierre a todo? Vamos a ver lo que el Maestro del Conocimiento se ha estado guardando.,,"Täyden Sinetin voima on hallussasi. Mitäpä jos hakisimme päätöstä. Katsotaan, mitä Oppi-Isä oikein on varjellut.",Tu as maintenant le plein pouvoir du Sigil. Je pense qu'il est l'heure d'en finir. Allons voir ce que le Maître des Traditions cachait.,"A kompett pecsét hatalma a kezedben van. Mit szólsz ahhoz, hogy lezárjuk végleg ezt a harcot. Nézzük meg mit is védelmez a Tanmester valójában.",Hai il potere del Sigillo completo. Che ne dici di finire questa storia. Vediamo un po' cosa il Sapiente stava proteggendo.,"貴方はもはや完全なシジルの力を行使できるわけね。 +You wield the power of the complete Sigil. What do you say we get some closure. Let's see what the Loremaster's been protecting.,TXT_ILOG85,MAP27/MAP12: Remark at TXT_SUB_LOG85,,,"Vládneš mocí složené Pečetě. Co říkáš na to, jít s tím vším skončit? Pojďme se podívat, co to Dějepisec bránil.","Du har magten af det komplette Sigil. Hvad siger du til, at vi får en afslutning? Lad os se, hvad Loremesteren har beskyttet.","Du hältst die Kraft des kompletten Sigils in deinen Händen. Meinst du nicht auch, wir sollten die Sache jetzt zu Ende bringen? Lass und nachsehen, was der Wissensmeister beschützt hat.",,"Vi tenas la povon de la tuta Sigelo. Kio pri fini ĉi tiun ĉapitron? Ni vidu tion, kion la Folkloristo kaŝadis.",Empuñas el poder del Emblema completo. ¿Que te parece ponerle un cierre a todo? Vamos a ver lo que el Maestro del Conocimiento se ha estado guardando.,,"Täyden Sinetin voima on hallussasi. Mitäpä jos hakisimme päätöstä. Katsotaan, mitä Oppi-Isä oikein on varjellut.",Tu as maintenant le plein pouvoir du Sigil. Je pense qu'il est l'heure d'en finir. Allons voir ce que le Maître des Traditions cachait.,,"A kompett pecsét hatalma a kezedben van. Mit szólsz ahhoz, hogy lezárjuk végleg ezt a harcot. Nézzük meg mit is védelmez a Tanmester valójában.",Hai il potere del Sigillo completo. Che ne dici di finire questa storia. Vediamo un po' cosa il Sapiente stava proteggendo.,"貴方はもはや完全なシジルの力を行使できるわけね。 後は言いがかりでもしてここを閉鎖させましょう。",시질의 완전한 힘은 이제 네 손에 있어. 종지부를 찍을 준비 됐어? 로어마스터가 그토록 지키던 게 무엇인지 확인하자고.,Je gebruikt de kracht van de volledige Sigil. Wat zeg je ervan als we de zaak afsluiten. Laten we eens kijken wat de Kennismeester heeft beschermd.,Du har makten til hele sigillet. Hva sier du til at vi får en avslutning? La oss se hva Loremaster har beskyttet.,"Władasz mocą kompletnego Sigilu. Co powiesz na to, żebyśmy się zamknęli. Zobaczmy, co Loremaster chronił.",Você tem o poder do Sigilo completo nas suas mãos. O que acha de termos um desfecho? Vamos ver o que o Mestre do Conhecimento andou protegendo.,,Ai puterea întregului Sigiliu. Ce zici dacă avem parte de un sfârșit. Să vedem ce poate prezice Maestrul Cunoștiințelor.,"Теперь ты владеешь мощью завершённой Печати. Мы уже близко — давай покончим с этим. Посмотрим, что же охранял Хранитель мудрости.",,Du har makten över hela Sigil. Vad sägs om att vi får ett avslut. Låt oss se vad Läromästaren har skyddat.,"Sigil'in tamamının gücüne sahipsin. Ne dersin, biraz kapanış yapalım mı? Loremaster'ın neyi koruduğunu görelim." -"Well, so much for prognostication. Hold it, Macil is calling us back. Let's get out of here in one piece.",TXT_ILOG87,MAP12: After killing the Oracle with Macil alive.,,,"No, tak to by bylo pro předpovědi. Počkej, Macil nás volá zpět. Vypadněme odsud vcelku.","Nå, så meget for prognoser. Vent, Macil kalder os tilbage. Lad os komme ud herfra i ét stykke.","Soviel zum Thema Vorhersagen. Warte, Macil ruft uns zurück. Lass uns hier heile herauskommen.",,"Nu, kia antaŭsento. Atendu, Macil vokas nin; ni eliru el ĉi tie senvundaj.","Vaya con los presentimientos. Momento, Macil nos está llamando; salgamos de aquí de una pieza.",,"No, se siitä ennustelusta. Odota, Macil kutsuu meitä takaisin. Häivytään täältä ehjin nahoin.","Bon, je pense que l'heure n'est plus au pronostics.. Attends, Macil nous appelle. Sortons d'ici en vie, si possible.","Hát, ennyit a jóslatról. Várj, Macil visszahív minket. Húzzunk innen míg egy darabban vagyunk.","Alla faccia dei prognostici... Aspetta, Macil ci sta richiamando. Meglio uscire da qua tutti interi.","まあ予言なんてそんなものでしょ。 +"Well, so much for prognostication. Hold it, Macil is calling us back. Let's get out of here in one piece.",TXT_ILOG87,MAP12: After killing the Oracle with Macil alive.,,,"No, tak to by bylo pro předpovědi. Počkej, Macil nás volá zpět. Vypadněme odsud vcelku.","Nå, så meget for prognoser. Vent, Macil kalder os tilbage. Lad os komme ud herfra i ét stykke.","Soviel zum Thema Vorhersagen. Warte, Macil ruft uns zurück. Lass uns hier heile herauskommen.",,"Nu, kia antaŭsento. Atendu, Macil vokas nin; ni eliru el ĉi tie senvundaj.","Vaya con los presentimientos. Momento, Macil nos está llamando; salgamos de aquí de una pieza.",,"No, se siitä ennustelusta. Odota, Macil kutsuu meitä takaisin. Häivytään täältä ehjin nahoin.","Bon, je pense que l'heure n'est plus au pronostics.. Attends, Macil nous appelle. Sortons d'ici en vie, si possible.",,"Hát, ennyit a jóslatról. Várj, Macil visszahív minket. Húzzunk innen míg egy darabban vagyunk.","Alla faccia dei prognostici... Aspetta, Macil ci sta richiamando. Meglio uscire da qua tutti interi.","まあ予言なんてそんなものでしょ。 ちょっと待って、マシルが帰還するように言ったわ。ここから抜け出しましょう。","웃기네. 이딴 예언 따위. 잠깐만, 마실이 우리들을 부르고 있어. 이제 안전하게 기지로 돌아가자.","Nou, tot zover de prognose. Wacht even, Macil belt ons terug. Laten we hier heelhuids weggaan.","Så mye for spådommer. Vent, Macil kaller oss tilbake. La oss komme oss helskinnet ut herfra.","Cóż, to tyle jeśli chodzi o prognozowanie. Czekajcie, Macil nas wzywa. Wydostańmy się stąd w jednym kawałku.","Bem, acho que ainda não é hora de previsões. Espera, o Macil está nos chamando de volta. Vamos tentar sair daqui inteiros.",,"Atât a fost cu prognoza. Stai, Macil ne sună înapoi. Să ieșim de aici întregi.","Да, это превзошло все наши ожидания. Успокойся, Мэйсил вызывает нас назад. Давай выбираться отсюда.",,"Tja, så mycket för prognoser. Vänta, Macil kallar oss tillbaka. Låt oss komma härifrån i ett stycke.","Kehanet için çok fazla. Durun, Macil bizi geri çağırıyor. Buradan tek parça halinde çıkalım." -"The factory is next to the mines. Richter must mean the mines of Degnin. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields. Let's get that key from the catacombs, and then off to the mines for some ore.",TXT_ILOG89,MAP23: After talking with Richter and leaving his room.,,,"Továrna je vedle dolů. Richter musí mít na mysli doly degninu. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Pojďme z katakomb dostat ten klíč a pak do dolů pro trochu rudy.","Fabrikken ligger ved siden af minerne. Richter må mene Degnin-minerne. Degnin malmen er magnetisk og eksplosiv, lige til at lukke kraftfelter ned med. Lad os hente nøglen fra katakomberne og så til minerne efter malm.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Lass uns den Schlüssel aus den Katakomben holen, und dann ab in die Minen für etwas Erz.",,"La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Ni rekuperu tiun ŝlosilon en la katakombo kaj tiam ni serĉu tiajn minaĵojn en la minejo.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. A recuperar esa llave en las catacumbas y luego a la mina a buscar de ese mineral.",,"Tehdas on kaivoksen vieressä. Richter varmastikin tarkoittaa Degninin kaivosta. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Noudetaan avain katakombeista ja sitten matkataan kaivokselle hakemaan malmia.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Récupérons la clé dans les catacombes, puis partons pour les mines pour récupérer du minerai.","A gyár a bánya mellett van. Richter valószínűleg Degnin bányáira gondolt. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Menjünk és szerezzük meg azt a kulcsot a katakombákból, és aztán a bányába egy kis ércért.","La Fabbrica si trova accanto alle miniere. Richter starà parlando delle miniere di Degnin. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Prendiamo quella chiave dalle catacombe, e poi andiamo alle miniere a prendere un po' di quei minerali.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 +"The factory is next to the mines. Richter must mean the mines of Degnin. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields. Let's get that key from the catacombs, and then off to the mines for some ore.",TXT_ILOG89,MAP23: After talking with Richter and leaving his room.,,,"Továrna je vedle dolů. Richter musí mít na mysli doly degninu. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Pojďme z katakomb dostat ten klíč a pak do dolů pro trochu rudy.","Fabrikken ligger ved siden af minerne. Richter må mene Degnin-minerne. Degnin malmen er magnetisk og eksplosiv, lige til at lukke kraftfelter ned med. Lad os hente nøglen fra katakomberne og så til minerne efter malm.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Lass uns den Schlüssel aus den Katakomben holen, und dann ab in die Minen für etwas Erz.",,"La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Ni rekuperu tiun ŝlosilon en la katakombo kaj tiam ni serĉu tiajn minaĵojn en la minejo.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. A recuperar esa llave en las catacumbas y luego a la mina a buscar de ese mineral.",,"Tehdas on kaivoksen vieressä. Richter varmastikin tarkoittaa Degninin kaivosta. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Noudetaan avain katakombeista ja sitten matkataan kaivokselle hakemaan malmia.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Récupérons la clé dans les catacombes, puis partons pour les mines pour récupérer du minerai.",,"A gyár a bánya mellett van. Richter valószínűleg Degnin bányáira gondolt. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Menjünk és szerezzük meg azt a kulcsot a katakombákból, és aztán a bányába egy kis ércért.","La Fabbrica si trova accanto alle miniere. Richter starà parlando delle miniere di Degnin. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Prendiamo quella chiave dalle catacombe, e poi andiamo alle miniere a prendere un po' di quei minerali.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 デグニン石は綺麗だが可燃性で、フォースフィールドを消すにはうってつけよ。 そこへのキーを地下墓所から取り、鉱山に向かおう。","공장은 광산 옆에 있어. 아마도 릭터는 데그닌 갱도를 예기한 것 같아. 데그닌 광석은 폭발성이 있는 자기력이 감도는 물질이야. 방어막을 끌 중요한 도구이기도 하지. 고대 무덤에서 그 열쇠를 얻고, 광석을 얻을 광산으로 향하자.","De fabriek ligt naast de mijnen. Richter moet de mijnen van Degnin bedoelen. Het Degnin-erts is magnetisch en explosief, precies het ding voor het afsluiten van krachtvelden. Laten we die sleutel uit de catacomben halen, en dan naar de mijnen gaan voor wat erts.","Fabrikken ligger ved siden av gruvene. Richter må mene gruvene i Degnin. Degnin-malmen er magnetisk og eksplosiv, akkurat det som skal til for å slå ut kraftfelt. La oss hente nøkkelen fra katakombene, og så dra til gruvene etter malm.","Fabryka jest obok kopalni. Richter musi mieć na myśli kopalnie w Degnin. Ruda Degnin jest magnetyczna i wybuchowa, w sam raz do wyłączania pól siłowych. Zdobądźmy ten klucz z katakumb, a potem ruszajmy do kopalni po rudę.","A fábrica fica próxima às minas. O Richter deve estar se referindo às minas de Degnin. O minério de Degnin é magnético e explosivo, o ideal para derrubar campos de força. Vamos pegar aquela chave das catacumbas e depois vamos para as minas pegar esse minério.",,"Fabrica e lângă mine, Richter se referă la minele din Degnin. Minereul de Degni e magnetic și exploziv, exact ceea ce ne trebuie pentru a opri câmpul de forță. Să luăm cheia aceea din catacombe și să ne îndreptăm înspre mine.","Вход на фабрику — рядом со спуском в шахты. Рихтер, должно быть, имел в виду шахты Дегнина. Дегнинская руда магнитна и взрывоопасна — то, что надо, если хочешь отключить силовое поле. Достань ключ из катакомб, а потом спустись в шахты за рудой.",,"Fabriken ligger bredvid gruvorna. Richter måste mena Degnins gruvor. Degninmalmen är magnetisk och explosiv, precis vad man behöver för att stänga av kraftfält. Låt oss hämta nyckeln från katakomberna och sedan iväg till gruvorna för att hämta malm.","Fabrika madenlerin yanında. Richter, Degnin madenlerini kastediyor olmalı. Degnin cevheri manyetik ve patlayıcıdır, tam da güç alanlarını kapatmak için. Hadi şu anahtarı yeraltı mezarlarından alalım, sonra da biraz cevher için madenlere gidelim." -"The factory is next to the mines. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields. Let's get that key from the catacombs, and then we go down for some ore. This must be the ruins Richter's agents were searching for, be careful.",TXT_ILOG93,MAP25: Entrance.,,,"Továrna je vedle dolů. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Pojďme z katakomb dostat ten klíč a pak do dolů pro trochu rudy. Tohle musí být ty ruiny, které Richterovi agenti hledali, buď opatrný.","Fabrikken ligger ved siden af minerne. Degnin-malmen er magnetisk og eksplosiv og er lige til at lukke kraftfelter ned med. Lad os hente nøglen fra katakomberne, og så går vi ned efter noget malm. Dette må være ruinerne, som Richters agenter ledte efter, vær forsigtig.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Lass uns den Schlüssel aus den Katakomben holen, und dann ab in die Minen für etwas Erz. Dies müssen die Ruinen sein, die Richters Agenten gesucht haben. Sei vorsichtig.",,"La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Ĉi tiuj verŝajne estas la ruinoj, kie malaperis la agentoj de Rikter dum ili serĉis la ŝlosilon de la minejo.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Estas deben de ser las ruinas donde los agentes de Richter han desaparecido al buscar al llave de la mina.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Estas deben de ser las ruinas donde los agentes de Richter desaparecieron al buscar al llave de la mina.","Tehdas on kaivoksen vieressä. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Noudetaan avain katakombeista ja mennään sitten alas hakemaan malmia. Nämä ovat varmaankin ne rauniot, joita Richterin joukot olivat etsineet; ole varovainen.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Récupérons la clé dans les catacombes, puis partons pour les mines pour récupérer du minerai. Cela doit être les ruines que les agent de Richter cherchaient. Fais attention.","A gyár a bánya mellett van. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Menjünk és szerezzük meg azt a kulcsot a katakombákból, és aztán a bányába egy kis ércért. Valószínű, hogy ezek azok a romok, amelyeket Richter ügynökei kerestek, légy óvatos.","La Fabbrica si trova accanto alle miniere. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Prendiamo quella chiave dalle catacombe, e poi andiamo alle miniere a prendere un po' di quei minerali. Devono essere queste le rovine che gli agenti di Richter stavano esplorando, fai attenzione.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 +"The factory is next to the mines. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields. Let's get that key from the catacombs, and then we go down for some ore. This must be the ruins Richter's agents were searching for, be careful.",TXT_ILOG93,MAP25: Entrance.,,,"Továrna je vedle dolů. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Pojďme z katakomb dostat ten klíč a pak do dolů pro trochu rudy. Tohle musí být ty ruiny, které Richterovi agenti hledali, buď opatrný.","Fabrikken ligger ved siden af minerne. Degnin-malmen er magnetisk og eksplosiv og er lige til at lukke kraftfelter ned med. Lad os hente nøglen fra katakomberne, og så går vi ned efter noget malm. Dette må være ruinerne, som Richters agenter ledte efter, vær forsigtig.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Lass uns den Schlüssel aus den Katakomben holen, und dann ab in die Minen für etwas Erz. Dies müssen die Ruinen sein, die Richters Agenten gesucht haben. Sei vorsichtig.",,"La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Ĉi tiuj verŝajne estas la ruinoj, kie malaperis la agentoj de Rikter dum ili serĉis la ŝlosilon de la minejo.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Estas deben de ser las ruinas donde los agentes de Richter han desaparecido al buscar al llave de la mina.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Estas deben de ser las ruinas donde los agentes de Richter desaparecieron al buscar al llave de la mina.","Tehdas on kaivoksen vieressä. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Noudetaan avain katakombeista ja mennään sitten alas hakemaan malmia. Nämä ovat varmaankin ne rauniot, joita Richterin joukot olivat etsineet; ole varovainen.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Récupérons la clé dans les catacombes, puis partons pour les mines pour récupérer du minerai. Cela doit être les ruines que les agent de Richter cherchaient. Fais attention.",,"A gyár a bánya mellett van. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Menjünk és szerezzük meg azt a kulcsot a katakombákból, és aztán a bányába egy kis ércért. Valószínű, hogy ezek azok a romok, amelyeket Richter ügynökei kerestek, légy óvatos.","La Fabbrica si trova accanto alle miniere. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Prendiamo quella chiave dalle catacombe, e poi andiamo alle miniere a prendere un po' di quei minerali. Devono essere queste le rovine che gli agenti di Richter stavano esplorando, fai attenzione.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 デグニン石は綺麗だが可燃性で、フォースフィールドを消すにはうってつけよ。 そこへのキーを地下墓所から取り、鉱山に向かおう。 ここがリヒターのエージェントが探していた遺跡のはず。気を付けて。",공장은 광산 옆에 있어. 데그닌 광석은 폭발성이 있는 자기력이 감도는 물질이야. 방어막을 끌 중요한 도구이기도 하지. 고대 묘지에 가서 열쇠를 얻고 광석을 좀 구하자. 릭터의 요원들이 정찰하다 사라진 폐허인 것 같아. 조심해.,"De fabriek is naast de mijnen. Het Degnin-erts is magnetisch en explosief, precies het ding voor het afsluiten van krachtvelden. Laten we die sleutel uit de catacomben halen, en dan gaan we naar beneden voor wat erts. Dit moeten de ruïnes zijn waar Richter's agenten naar op zoek waren, wees voorzichtig.","Fabrikken ligger ved siden av gruvene. Degnin-malmen er magnetisk og eksplosiv, akkurat tingen for å stenge ned kraftfelt. Vi henter nøkkelen i katakombene, og så går vi ned etter malm. Dette må være ruinene Richters agenter lette etter. Vær forsiktig.","Fabryka jest obok kopalni. Ruda Degnin jest magnetyczna i wybuchowa, idealna do wyłączania pól siłowych. Zdobądźmy ten klucz z katakumb, a potem zejdźmy na dół po rudę. To muszą być ruiny, których szukali agenci Richtera, bądźcie ostrożni.","A fábrica fica próxima às minas. O minério de Degnin é magnético e explosivo, o ideal para derrubar campos de força. Vamos pegar aquela chave das catacumbas e ir atrás desse minério. Essas devem ser as ruínas que os agentes do Richter estavam procurando. Tome cuidado.",,"Fabrica e lângă mine, Richter se referă la minele din Degnin. Minereul de Degni e magnetic și exploziv, exact ceea ce ne trebuie pentru a opri câmpul de forță. Să luăm cheia aceea din catacombe și să ne îndreptăm înspre mine.","Вход на фабрику — рядом со спуском в шахты. Дегнинская руда магнитна и взрывоопасна — то, что надо, если хочешь отключить силовое поле. Достань ключ в катакомбах, а потом спустись за рудой. Должно быть, именно эти руины искали агенты Рихтера. Будь осторожен.",,"Fabriken ligger bredvid gruvorna. Degninmalmen är magnetisk och explosiv, precis vad man behöver för att stänga av kraftfält. Vi hämtar nyckeln från katakomberna och går sedan ner för att hämta malm. Detta måste vara ruinerna som Richters agenter sökte efter, var försiktig.","Fabrika madenlerin yanında. Degnin cevheri manyetik ve patlayıcıdır, güç alanlarını kapatmak için birebirdir. Hadi şu anahtarı yeraltı mezarlarından alalım, sonra da biraz cevher için aşağı inelim. Burası Richter'in ajanlarının aradığı kalıntılar olmalı, dikkatli ol." -"The factory is next to the mines. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields. My friend, whatever it is we're fighting, it's more than just the Order. Back to the commons then off to the mines. We need ore.",TXT_ILOG95,MAP25: After killing the Spectre.,,,"Továrna je vedle dolů. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Příteli, ať už bojujeme s čímkoliv, jde o víc než jen Řád. Zpátky na náves a pak do dolů. Potřebujeme rudu.","Fabrikken ligger ved siden af minerne. Degnin-malmen er magnetisk og eksplosiv, lige til at lukke kraftfelter ned med. Min ven, hvad det end er, vi kæmper imod, er det mere end bare Ordenen. Tilbage til fællesrummet og så til minerne. Vi har brug for malm.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Mein Freund, was immer wir hier bekämpfen, es ist mehr als der Orden. Zurück zur Mensa, und dann ab in die Minen. Wir brauchen Erz.",,"Tio ajn, kion ni alfrontas, es pli ol La Ordeno. La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Ni reiru al la komunumo kaj tiam ni serĉu tiajn minaĵojn en la minejo.","Lo que sea a los que nos enfrentamos es más que solo La Orden. La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Volvamos a la comuna y luego a la mina a buscar de ese mineral.",,"Tehdas on kaivoksen vieressä. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Ystäväni, mitä vastaan me taistelemmekaan, se on suurempi kuin pelkkä Veljeskunta. Palatkaamme messiin, josta sitten kaivokseen. Tarvitsemme malmia.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Mon ami, c'est clair que l'on se bat contre plus que juste l'Ordre. Retournons au réfectoire puis aux mines. Il nous faut du minerai.","A gyár a bánya mellett van. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Barátom, akármi ellen is harcolunk, több mint a Rend maga. Irány vissza a menzára, aztán a bánya. Szükségünk van ércre.","La Fabbrica si trova accanto alle miniere. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Amico mio, qualsiasi cosa stiamo combattendo, è molto di più del solo Ordine. Ritorniamo ai comuni e poi alle miniere. Ci serve quel minerale.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 +"The factory is next to the mines. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields. My friend, whatever it is we're fighting, it's more than just the Order. Back to the commons then off to the mines. We need ore.",TXT_ILOG95,MAP25: After killing the Spectre.,,,"Továrna je vedle dolů. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Příteli, ať už bojujeme s čímkoliv, jde o víc než jen Řád. Zpátky na náves a pak do dolů. Potřebujeme rudu.","Fabrikken ligger ved siden af minerne. Degnin-malmen er magnetisk og eksplosiv, lige til at lukke kraftfelter ned med. Min ven, hvad det end er, vi kæmper imod, er det mere end bare Ordenen. Tilbage til fællesrummet og så til minerne. Vi har brug for malm.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Mein Freund, was immer wir hier bekämpfen, es ist mehr als der Orden. Zurück zur Mensa, und dann ab in die Minen. Wir brauchen Erz.",,"Tio ajn, kion ni alfrontas, es pli ol La Ordeno. La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Ni reiru al la komunumo kaj tiam ni serĉu tiajn minaĵojn en la minejo.","Lo que sea a los que nos enfrentamos es más que solo La Orden. La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Volvamos a la comuna y luego a la mina a buscar de ese mineral.",,"Tehdas on kaivoksen vieressä. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Ystäväni, mitä vastaan me taistelemmekaan, se on suurempi kuin pelkkä Veljeskunta. Palatkaamme messiin, josta sitten kaivokseen. Tarvitsemme malmia.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Mon ami, c'est clair que l'on se bat contre plus que juste l'Ordre. Retournons au réfectoire puis aux mines. Il nous faut du minerai.",,"A gyár a bánya mellett van. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Barátom, akármi ellen is harcolunk, több mint a Rend maga. Irány vissza a menzára, aztán a bánya. Szükségünk van ércre.","La Fabbrica si trova accanto alle miniere. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Amico mio, qualsiasi cosa stiamo combattendo, è molto di più del solo Ordine. Ritorniamo ai comuni e poi alle miniere. Ci serve quel minerale.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 デグニン石は綺麗だが可燃性で、フォースフィールドを消すにはうってつけよ。 友よ、私達が戦う相手が何であろうとも、オーダー以上のものはない。 鉱山から離れましょう!","공장은 광산 옆에 있어. 데그닌 광석은 폭발성이 있는 자기력이 감도는 물질이야. 방어막을 끌 중요한 도구이기도 하지. 싸우는 상대가 무엇인지는 모르겠지만, 오더보다 더한 존재인 것 같아. 식당가로 향한 뒤 광산으로 들어가. 광석이 필요하니까.","De fabriek ligt naast de mijnen. Het Degnin-erts is magnetisch en explosief, precies het ding voor het afsluiten van krachtvelden. Mijn vriend, wat het ook is waar we tegen vechten, het is meer dan alleen de Orde. Terug naar de commons en dan naar de mijnen. We hebben erts nodig.","Fabrikken ligger ved siden av gruvene. Degnin-malmen er magnetisk og eksplosiv, perfekt til å slå ut kraftfelt. Min venn, hva det enn er vi kjemper mot, er det mer enn bare Ordenen. Tilbake til allmenningen, og så til gruvene. Vi trenger malm.","Fabryka znajduje się obok kopalni. Ruda Degnin jest magnetyczna i wybuchowa. Nadaje się do wyłączania pól siłowych. Mój przyjacielu, cokolwiek to jest, z czym walczymy, to nie tylko Zakon. Wracamy do komnat, a potem do kopalni. Potrzebujemy rudy.","A fábrica fica próxima às minas. O minério de Degnin é magnético e explosivo, o ideal para derrubar campos de força. Meu amigo, seja lá o que estiver combatendo, é mais do que somente a Ordem. Volte ao refeitório e depois vá para as minas. Precisamos desse minério.",,"Fabrica e lângă mine, Richter se referă la minele din Degnin. Minereul de Degni e magnetic și exploziv, exact ceea ce ne trebuie pentru a opri câmpul de forță. Prietene, orice ar fi, ne luptăm cu ceva mai mult decât Ordinul. Înapoi la comune și dupaia, mine. Ne trebuie minereu.","Вход на фабрику — рядом со спуском в шахты. Дегнинская руда магнитна и взрывоопасна — то, что надо, если хочешь отключить силовое поле. Друг мой, с чем бы мы не сражались, это нечто большее, чем просто Орден. Вернись назад в поселение и спустись в шахты. Нам нужна руда.",,"Fabriken ligger bredvid gruvorna. Degninmalmen är magnetisk och explosiv, precis vad man behöver för att stänga av kraftfält. Min vän, vad det än är vi slåss mot så är det mer än bara Orden. Tillbaka till allmänningen och sedan till gruvorna. Vi behöver malm.","Fabrika madenlerin yanında. Degnin cevheri manyetik ve patlayıcıdır, tam da güç alanlarını kapatmak için. Dostum, savaştığımız şey her neyse, Düzen'den daha fazlası. Avam kamarasına dönüp madenlere gidelim. Cevhere ihtiyacımız var." -"The factory is next to the mines. The degnin ore is magnetic and explosive, just the thing for shutting down force fields. Without letting down your guard, look for deposits of ore.",TXT_ILOG96,MAP14: Entrance.,,,"Továrna je vedle dolů. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Opatrně se podívej po ložiscích rudy.","Fabrikken ligger ved siden af minerne. Degninmalmen er magnetisk og eksplosiv, lige det rigtige til at lukke kraftfelter. Uden at sænke din vagt, skal du lede efter forekomster af malm.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Lass uns nach Erz suchen, aber wir müssen vorsichtig sein.",,"La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Serĉu kolektojn de tiaj minaĵoj.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Busca depósitos de ese mineral.",,"Tehdas on kaivoksen vieressä. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Etsi malmiesiintymiä varuillasi pysyen.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Cherche des veines de minerai, mais fais attention.","A gyár a bánya mellett van. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Figyelj az érc lerakódásokra, de közben figyelj magadra is.","La Fabbrica si trova accanto alle miniere. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 +"The factory is next to the mines. The degnin ore is magnetic and explosive, just the thing for shutting down force fields. Without letting down your guard, look for deposits of ore.",TXT_ILOG96,MAP14: Entrance.,,,"Továrna je vedle dolů. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole. Opatrně se podívej po ložiscích rudy.","Fabrikken ligger ved siden af minerne. Degninmalmen er magnetisk og eksplosiv, lige det rigtige til at lukke kraftfelter. Uden at sænke din vagt, skal du lede efter forekomster af malm.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Dasa Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten. Lass uns nach Erz suchen, aber wir müssen vorsichtig sein.",,"La fabriko estas apud la minejo de Degnin; ĝiaj minaĵoj estas magnetaj kaj eksplodpovaj, sufiĉe por detrui fortokampojn. Serĉu kolektojn de tiaj minaĵoj.","La fábrica está junto a la mina de Degnin; su mineral es magnético y explosivo, justo como para destruir campos de fuerza. Busca depósitos de ese mineral.",,"Tehdas on kaivoksen vieressä. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä. Etsi malmiesiintymiä varuillasi pysyen.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. Cherche des veines de minerai, mais fais attention.",,"A gyár a bánya mellett van. A degnini érc mágneses és robbanékony, pont tökéletes lesz az erőpajzs kiiktatásához. Figyelj az érc lerakódásokra, de közben figyelj magadra is.","La Fabbrica si trova accanto alle miniere. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza. Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 デグニン石は綺麗だが可燃性で、フォースフィールドを消すにはうってつけよ。 警戒を緩めることなく、鉱石の堆積所を探しましょう。","공장은 광산 옆에 있어. 데그닌 광석은 폭발성이 있는 자기력이 감도는 물질이야. 방어막을 끌 중요한 도구이기도 하지. 자신을 지킬 준비 단단히 하고, 캔 광석을 두는 곳을 찾아.","De fabriek ligt naast de mijnen. Het degnin-erts is magnetisch en explosief, precies het ding voor het afsluiten van krachtvelden. Zonder je waakzaamheid te laten verslappen, zoek je naar ertsafzettingen.","Fabrikken er ved siden av gruvene. Degnin-malmen er magnetisk og eksplosiv, akkurat det vi trenger for å slå ut kraftfeltene. Uten å senke guarden, se etter forekomster av malm.","Fabryka jest obok kopalni. Ruda degnin jest magnetyczna i wybuchowa, w sam raz do wyłączania pól siłowych. Nie tracąc czujności, szukajcie złóż rudy.","A fábrica fica próxima às minas. O minério de Degnin é magnético e explosivo, o ideal para derrubar campos de força. Não baixe a sua guarda e procure pelos depósitos de minério.",,"Fabrica e lângă mine. Minereul de Degnin e magnetic și exploziv, exact ceea ce ne trebuie pentru câmpul de forță. Fără a lăsa garda jos, uită-te după depozite de minereu.","Вход на фабрику — рядом со спуском в шахты. Дегнинская руда магнитна и взрывоопасна — то, что надо, если хочешь отключить силовое поле. Поищи залежи руды, но не теряй бдительности!",,"Fabriken ligger bredvid gruvorna. Degninmalmen är magnetisk och explosiv, precis vad vi behöver för att stänga av kraftfält. Utan att sänka garden, leta efter malmfyndigheter.","Fabrika madenlerin yanında. Degnin cevheri manyetik ve patlayıcıdır, tam da güç alanlarını kapatmak için. Gardınızı düşürmeden, cevher yataklarını arayın." "Without letting down your guard, look for deposits of ore. These poor souls are drones. Their synaptic functions are being jammed by RC implants. We destroy the transmitter, and they're free.",TXT_ILOG97,"MAP14: After crossing the entrance yard. -(drone ≈ slave)",,,"Opatrně se podívej po ložiscích rudy. Tihle chudáci jsou trubcové, jejich synaptické funkce jsou narušené na dálku ovládanými implantáty. Když zničíme vysílačku, budou svobodní!","Uden at sænke paraderne, skal du lede efter malmforekomster. Disse stakkels sjæle er droner. Deres synaptiske funktioner bliver blokeret af RC-implantater. Vi ødelægger senderen, og så er de frie.","Lass uns nach Erz suchen, aber wir müssen vorsichtig sein. Diese armen Seelen sind wie Drohnen. Ihre Gehirnfunktionen werden von Implantaten blockiert. Wir müssen den Transmitter ausschalten, dann sind sie befreit.",,Serĉu kolektojn de degninaj minaĵoj. Estas sklavigitaj elfosantoj kun siaj sinapsoj barataj de teleregataj enplantaĵoj. Detrui la transmisiilon liberigos ilin.,Busca depósitos del mineral de Degnin. Hay mineros esclavizados con sus funciones sinápticas bloqueadas con implantes por mando a distancia. Destruir el transmisor los liberará.,Busca depósitos del mineral de Degnin. Hay mineros esclavizados con sus funciones sinápticas bloqueadas con implantes a control remoto. Destruir el transmisor los va a liberar.,"Etsi malmiesiintymiä, kuitenkin valppautesi säilyttäen. Nämä sieluparat ovat kuhnureita: Heidän synaptisia toimintojaan häiritään radio-ohjattavilla istutteilla. Me tuhoamme lähettimen, ja he ovat vapaat.","Cherche des veines de minerai, mais fais attention. Ces pauvres esclaves sont des drones. Leurs fonctions synaptiques sont brouillées par des implants radiocommandés. Détruisons le transmetteur pour les libérer.","Figyelj az érc lerakódásokra, de közben figyelj magadra is. Ezek a szerencsétlen lelkek csak drónok. A szinaptikus funkcióikat zavarják távolról irányítható implantátumokkal. Szétromboljuk a jeladókat, és szabaddá vállnak.","Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali. Questi poveracci sono degli schiavi. Le loro funzioni cerebrali stanno venendo bloccate da degli impianti. Se distruggiamo il trasmettitore, saranno liberi.","警戒を緩めることなく、鉱石の堆積所を探しましょう。 +(drone ≈ slave)",,,"Opatrně se podívej po ložiscích rudy. Tihle chudáci jsou trubcové, jejich synaptické funkce jsou narušené na dálku ovládanými implantáty. Když zničíme vysílačku, budou svobodní!","Uden at sænke paraderne, skal du lede efter malmforekomster. Disse stakkels sjæle er droner. Deres synaptiske funktioner bliver blokeret af RC-implantater. Vi ødelægger senderen, og så er de frie.","Lass uns nach Erz suchen, aber wir müssen vorsichtig sein. Diese armen Seelen sind wie Drohnen. Ihre Gehirnfunktionen werden von Implantaten blockiert. Wir müssen den Transmitter ausschalten, dann sind sie befreit.",,Serĉu kolektojn de degninaj minaĵoj. Estas sklavigitaj elfosantoj kun siaj sinapsoj barataj de teleregataj enplantaĵoj. Detrui la transmisiilon liberigos ilin.,Busca depósitos del mineral de Degnin. Hay mineros esclavizados con sus funciones sinápticas bloqueadas con implantes por mando a distancia. Destruir el transmisor los liberará.,Busca depósitos del mineral de Degnin. Hay mineros esclavizados con sus funciones sinápticas bloqueadas con implantes a control remoto. Destruir el transmisor los va a liberar.,"Etsi malmiesiintymiä, kuitenkin valppautesi säilyttäen. Nämä sieluparat ovat kuhnureita: Heidän synaptisia toimintojaan häiritään radio-ohjattavilla istutteilla. Me tuhoamme lähettimen, ja he ovat vapaat.","Cherche des veines de minerai, mais fais attention. Ces pauvres esclaves sont des drones. Leurs fonctions synaptiques sont brouillées par des implants radiocommandés. Détruisons le transmetteur pour les libérer.",,"Figyelj az érc lerakódásokra, de közben figyelj magadra is. Ezek a szerencsétlen lelkek csak drónok. A szinaptikus funkcióikat zavarják távolról irányítható implantátumokkal. Szétromboljuk a jeladókat, és szabaddá vállnak.","Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali. Questi poveracci sono degli schiavi. Le loro funzioni cerebrali stanno venendo bloccate da degli impianti. Se distruggiamo il trasmettitore, saranno liberi.","警戒を緩めることなく、鉱石の堆積所を探しましょう。 ここの精神の乏しい労働者達は、RCインプラントでシナプス機能を妨害している。 私達が送信機を破壊し、皆を解放しよう。","자신을 지킬 준비 단단히 하고, 캔 광석을 두는 곳을 찾아. 저 사람들은 불쌍한 광산의 노예들이야. 오더가 이식한 세뇌 장치 때문에 정상적인 뇌 기능을 잃었지. 전송기만 파괴한다면, 그들은 자유를 되찾을 수 있을 거야.","Zonder je waakzaamheid te laten verslappen, zoek je naar ertsafzettingen. Deze arme zielen zijn drones. Hun synaptische functies worden geblokkeerd door RC-implantaten. We vernietigen de zender en ze zijn vrij.","Uten å senke guarden, se etter malmforekomster. Disse stakkarene er droner. Deres synaptiske funksjoner blokkeres av RC-implantater. Vi ødelegger senderen, og de er fri.","Nie opuszczając gardy, szukaj złóż rudy. Te biedne dusze to drony. Ich funkcje synaptyczne są zagłuszane przez implanty RC. Zniszczymy nadajnik, a oni będą wolni.",Não baixe a sua guarda e procure por depósitos de minério. Esses pobres coitados são escravos. Suas funções sinápticas estão sendo bloqueadas por implantes de controle remoto. Se destruirmos o transmissor eles estarão livres.,,"Fără a lăsa garda jos, uită-te după minereu. Sufletele ăstea sărmane sunt drone. Funcțiile lor sinaptice primesc interferență de la implanturile RC. Distrugem transmițătoarele și sunt libere.","Поищи залежи руды, но не теряй бдительности. Эти несчастные души — дроны. Сигнал, поступающий на импланты, полностью подавляет их сознание. Если мы уничтожим передатчик, они свободны.",,Utan att sänka garden letar du efter malmfyndigheter. Dessa stackars själar är drönare. Deras synaptiska funktioner blockeras av RC-implantat. Vi förstör sändaren och de är fria.,"Gardınızı düşürmeden, cevher yataklarını arayın. Bu zavallı ruhlar dron. Sinaptik fonksiyonları RC implantları tarafından engelleniyor. Vericiyi yok edersek özgür kalırlar." -"The factory is next to the mines. Without letting down your guard, look for deposits of ore. My suggestion is, toss the ore at the force field and then blast it, the resulting compression should create a magnetic blanket and turn off the lights.",TXT_ILOG99,MAP14: After James's room.,,,"Továrna je vedle dolů. Opatrně se podívej po ložiscích rudy. Můj návrh je, hoď rudu na to silové pole a pak ji odstřel. Výsledná komprese by měla vytvořit magnetický povlak a vypnout pole.","Fabrikken ligger ved siden af minerne. Uden at sænke din vagt, skal du lede efter malmforekomster. Mit forslag er, at kaste malmen mod kraftfeltet og derefter sprænge det, den resulterende kompression skulle skabe et magnetisk tæppe og slukke lyset.","Die Fabrik liegt neben den Minen. Lass uns nach Erz suchen, aber wir müssen vorsichtig sein. Ich schlage vor, wir werfen das Erz vor das Krsftfeld und sprengen es dann. Die Druckwelle sollte einen Magnetpuls erzeugen, und die Lichter ausschalten.",,Serĉu kolektojn de degninaj minaĵoj. Mi sugestus meti minaĵon ĉe la fortokampo kaj tiam pafi al ĝi: la rezultinta premo devus krei magnetan kampon kaj malŝalti ĝin.,Busca depósitos del mineral de Degnin. Yo diría de poner un mineral junto al campo de fuerza y luego dispararle: la presión resultante debería crear un campo magnético que lo desactive.,,"Tehdas on kaivoksen vieressä. Etsi malmiesiintymiä, kuitenkin valppautesi säilyttäen. Ehdotukseni on, että heität malmin voimakentään ja sitten posautat sen. Syntyvän paineaallon pitäisi muodostaa magneettinen peitto ja sammuttaa valot.","L'usine est près des mines. Cherche des veines de minerai, mais fais attention. Je suggère que tu lance du minerai sur le champ de force et que tu tire dessus. Le champ magnétique que l'explosion causera désactivera les lumières.","A gyár a bánya mellett van. Figyelj az érc lerakódásokra, de közben figyelj magadra is. Azt javaslom, hogy dobd az ércet az erőpajzsra, és robbantsd fel. A robbanástól létrejött kompresszió létre kell hogy hozzon egy mágneses palástot, és ezáltal kikapcsolja a lámpákat.","La Fabbrica si trova accanto alle miniere. Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali. Il mio consiglio è, lancia uno dei minerali al campo di forza e poi fallo saltare in aria. Questo dovrebbe sprigionare l'energia sufficiente a disattivare il campo di forza.","工場は鉱山の隣にあるわ。警戒を緩めることなく、鉱石の堆積所を探しましょう。 +"The factory is next to the mines. Without letting down your guard, look for deposits of ore. My suggestion is, toss the ore at the force field and then blast it, the resulting compression should create a magnetic blanket and turn off the lights.",TXT_ILOG99,MAP14: After James's room.,,,"Továrna je vedle dolů. Opatrně se podívej po ložiscích rudy. Můj návrh je, hoď rudu na to silové pole a pak ji odstřel. Výsledná komprese by měla vytvořit magnetický povlak a vypnout pole.","Fabrikken ligger ved siden af minerne. Uden at sænke din vagt, skal du lede efter malmforekomster. Mit forslag er, at kaste malmen mod kraftfeltet og derefter sprænge det, den resulterende kompression skulle skabe et magnetisk tæppe og slukke lyset.","Die Fabrik liegt neben den Minen. Lass uns nach Erz suchen, aber wir müssen vorsichtig sein. Ich schlage vor, wir werfen das Erz vor das Krsftfeld und sprengen es dann. Die Druckwelle sollte einen Magnetpuls erzeugen, und die Lichter ausschalten.",,Serĉu kolektojn de degninaj minaĵoj. Mi sugestus meti minaĵon ĉe la fortokampo kaj tiam pafi al ĝi: la rezultinta premo devus krei magnetan kampon kaj malŝalti ĝin.,Busca depósitos del mineral de Degnin. Yo diría de poner un mineral junto al campo de fuerza y luego dispararle: la presión resultante debería crear un campo magnético que lo desactive.,,"Tehdas on kaivoksen vieressä. Etsi malmiesiintymiä, kuitenkin valppautesi säilyttäen. Ehdotukseni on, että heität malmin voimakentään ja sitten posautat sen. Syntyvän paineaallon pitäisi muodostaa magneettinen peitto ja sammuttaa valot.","L'usine est près des mines. Cherche des veines de minerai, mais fais attention. Je suggère que tu lance du minerai sur le champ de force et que tu tire dessus. Le champ magnétique que l'explosion causera désactivera les lumières.",,"A gyár a bánya mellett van. Figyelj az érc lerakódásokra, de közben figyelj magadra is. Azt javaslom, hogy dobd az ércet az erőpajzsra, és robbantsd fel. A robbanástól létrejött kompresszió létre kell hogy hozzon egy mágneses palástot, és ezáltal kikapcsolja a lámpákat.","La Fabbrica si trova accanto alle miniere. Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali. Il mio consiglio è, lancia uno dei minerali al campo di forza e poi fallo saltare in aria. Questo dovrebbe sprigionare l'energia sufficiente a disattivare il campo di forza.","工場は鉱山の隣にあるわ。警戒を緩めることなく、鉱石の堆積所を探しましょう。 私の案はフォースフィールドの近くに鉱石を置き撃って爆発させる方法よ。 その結果、圧縮されていた磁場の反動で光を打ち消すわ。","공장은 광산 옆에 있어. 자신을 지킬 준비 단단히 하고, 캔 광석을 두는 곳을 찾아. 조언을 찾는다면, 광석을 방어막에 가까이 놔둔 뒤 쏴봐. 광석이 커다란 자기장을 만들 테고, 방어막을 완전히 무력화 시킬 거야.","De fabriek ligt naast de mijnen. Zonder je waakzaamheid te laten verslappen, zoek je naar ertsafzettingen. Mijn suggestie is om het erts naar het krachtveld te gooien en het vervolgens op te blazen, de resulterende compressie zou een magnetische deken moeten creëren en de lichten uit moeten doen.","Fabrikken ligger ved siden av gruvene. Uten å senke garden, se etter malmforekomster. Mitt forslag er å kaste malmen mot kraftfeltet og deretter sprenge den, den resulterende kompresjonen bør skape et magnetisk teppe og slå av lysene.","Fabryka jest obok kopalni. Nie spuszczając gardy, szukajcie złóż rudy. Moja propozycja to, podrzuć rudę na pole siłowe, a następnie wysadź je, powstała kompresja powinna stworzyć koc magnetyczny i wyłączyć światła.",A fábrica fica próxima às minas. Não baixe a sua guarda e procure pelos depósitos de minério. Sugiro que você arremesse o minério ao campo de força e detone ele. A explosão deve gerar um campo magnético que vai apagar as luzes.,,"Fabrica e lăngă mine. Fără a lăsa garda jos uită-te dupa depozite de minereu. Sugestia mea e, aruncă minereul la câmpul de forță și aruncă-l în aer, comprimarea ce va rezulta în urma ei ar trebui să creeze o încărcătură magnetică care va distruge luminile.","Вход на фабрику — рядом со спуском в шахты. Поищи залежи руды, но не теряй бдительности. Мой план: бросить руду поближе к силовому полю и взорвать её. Взрыв создаст магнитное поле, которое накроет электронику и отрубит её.",,"Fabriken ligger bredvid gruvorna. Utan att sänka garden, leta efter malmfyndigheter. Mitt förslag är att kasta malmen mot kraftfältet och sedan spränga det, den resulterande kompressionen bör skapa en magnetisk filt och släcka ljuset.","Fabrika madenlerin yanında. Gardınızı düşürmeden, cevher yataklarını arayın. Benim önerim, cevheri güç alanına fırlatın ve sonra patlatın, ortaya çıkan sıkıştırma manyetik bir örtü oluşturmalı ve ışıkları kapatmalıdır." -Now on to the factory. Exit the mines and you can't miss it. Let's find that machine and shut it down!,TXT_ILOG100,MAP14: After destroying the transmitter.,,,A teď do továrny. Vyjdi z dolů a nemůžeš to minout. Pojďme najít ten stroj a vypnout ho!,"Nu videre til fabrikken. Forlad minerne, og du kan ikke undgå at se den. Lad os finde den maskine og lukke den ned!","Und jetzt zur Fabrik. Verlasse die Minen, du kannst sie nicht verpassen. Lass uns die Maschine finden und abschalten.",,"Nun al la fabriko, tuj tra la elirejo de la minejo. Trovu kaj malŝaltu tiun maŝinon!","Ahora a la fábrica, justo saliendo de la mina. ¡Encontremos esa máquina y apaguémosla!",,"Nyt sitten tehtaaseen. Poistu kaivoksesta, ja löydät sen varmasti. Etsitään ja sammutetaan se kone!","C'est parti pour l'usine. Sors des mines, tu ne peux pas la rater. Trouvons cette machine et détruisons-la!","Most pedig a gyár. Rögtön szembe van veled ahogy kilépsz a bányából, nem tudod eltéveszteni. Keressük meg azt a gépet, és állítsuk le!",Ora entriamo nella Fabbrica. Uscendo dalle miniere non puoi sbagliare. Troviamo quella macchina e disattiviamola!,"工場へ今すぐ入ろう。鉱山の出口はすぐわかる。 +Now on to the factory. Exit the mines and you can't miss it. Let's find that machine and shut it down!,TXT_ILOG100,MAP14: After destroying the transmitter.,,,A teď do továrny. Vyjdi z dolů a nemůžeš to minout. Pojďme najít ten stroj a vypnout ho!,"Nu videre til fabrikken. Forlad minerne, og du kan ikke undgå at se den. Lad os finde den maskine og lukke den ned!","Und jetzt zur Fabrik. Verlasse die Minen, du kannst sie nicht verpassen. Lass uns die Maschine finden und abschalten.",,"Nun al la fabriko, tuj tra la elirejo de la minejo. Trovu kaj malŝaltu tiun maŝinon!","Ahora a la fábrica, justo saliendo de la mina. ¡Encontremos esa máquina y apaguémosla!",,"Nyt sitten tehtaaseen. Poistu kaivoksesta, ja löydät sen varmasti. Etsitään ja sammutetaan se kone!","C'est parti pour l'usine. Sors des mines, tu ne peux pas la rater. Trouvons cette machine et détruisons-la!",,"Most pedig a gyár. Rögtön szembe van veled ahogy kilépsz a bányából, nem tudod eltéveszteni. Keressük meg azt a gépet, és állítsuk le!",Ora entriamo nella Fabbrica. Uscendo dalle miniere non puoi sbagliare. Troviamo quella macchina e disattiviamola!,"工場へ今すぐ入ろう。鉱山の出口はすぐわかる。 機械を探してシャットダウンさせろ!",이제 공장으로 향하자. 광산을 나가봐. 이 순간을 놓치면 안 돼. 얼른 그 기계를 찾아서 작동을 멈추자!,Nu naar de fabriek. Verlaat de mijnen en je kunt het niet missen. Laten we die machine vinden en hem uitschakelen!,"Nå videre til fabrikken. Gå ut av gruvene, og du kan ikke gå glipp av den. La oss finne den maskinen og slå den av!",Teraz przejdź do fabryki. Wyjdź z kopalni i nie możesz jej przegapić. Znajdźmy tę maszynę i wyłączmy ją!,"Agora vá para a fábrica. Ao sair das minas você vai encontrá-la, não tem como errar. Vamos achar essa máquina e desligá-la de vez!",,"Acum înspre fabrică. Ieși din mine, nu o poți rata. Să găsim mașina aia și să o oprim!","Теперь — на фабрику. Выйди из шахты, и ты сразу увидишь вход. Найди эту машину и останови её!",,Nu fortsätter vi till fabriken. Gå ut ur gruvorna och du kan inte missa den. Låt oss hitta den där maskinen och stänga av den!,Şimdi fabrikaya gidelim. Madenlerden çıkın ve onu kaçırmayın. Hadi şu makineyi bulup kapatalım! I'm reading massive neural wave distortions from straight ahead. I think we've found it. Let's get in there and shut it down!,TXT_ILOG102,"MAP20: Path to Conversion Chapel (MAP24). -(""neural oscillation"" or ""brainwave"")",,,"Detekuju obří rušení nervových vln přímo před námi. Myslím, že jsme to našli. Pojďme tam a vypněme to!","Jeg kan se massive neurale bølgeforvrængninger lige forude. Jeg tror, vi har fundet den. Lad os komme ind og lukke den ned!","Ich empfange massive neurale Verzerrungen direkt voraus. Ich denke, wir haben sie gefunden. Lass uns reingehen und sie abschalten.",,"Mi legas amasajn distordojn de cerbaj ondoj antaŭ vi. Ŝajnas, ke ni trovis ĝin. Ni eniru kaj malŝaltu ĝin!",Estoy leyendo distorsiones masivas de ondas cerebrales delante. Parece que la hemos encontrado. ¡Entremos ahí y apaguémosla!,Estoy leyendo distorsiones masivas de ondas cerebrales adelante. Parece que la encontramos. ¡Entremos ahí y apaguémosla!,Havaitsen massivisia hermoaaltovääristymiä suoraan edessä. Luulen löytäneemme sen. Mennään sisään ja sammutetaan se!,Je recois des distorsions neurales colossales devant nous. Je crois que nous l'avons trouvé. Détruisons-la!,Erős ideghullám zavaró jeleket fogok. Azt hiszem megtaláltuk. Menjünk be és állítsuk le!,Sto ricevendo potenti segnali distorti proprio davanti a te. Penso che l'abbiamo trovata. Entriamo e spegnamo questa macchina!,重い神経波歪曲が直に届いたわ。私達はそれを見つけたという事よ。,앞쪽에서 거대한 신경교란 파장이 감지되고 있어. 우리가 찾아낸 것 같아. 어서 들어가서 꺼버리자!,Ik lees enorme neurale golfvervormingen van rechtdoor. Ik denk dat we hem gevonden hebben. Laten we naar binnen gaan en de machine stilleggen!,Jeg leser massive nevrale bølgeforvrengninger rett fram. Jeg tror vi har funnet den. La oss gå inn og slå den av!,Odczytuję potężne zniekształcenia fal neuronowych z prostej drogi. Chyba ją znaleźliśmy. Wejdźmy tam i wyłączmy ją!,Estou vendo distorções enormes de ondas neurais. Acho que encontramos. Vamos entrar lá e desligar!,,"Citesc distorsiune neurale masive drept din față, cred că am găsit-o. Să intrăm și să o oprim.","Я вижу мощный источник помех прямо по курсу. Похоже, мы нашли конвертер. Войди и останови его!",,Jag läser massiva neurala vågförvrängningar från rakt fram. Jag tror att vi har hittat den. Låt oss gå in där och stänga av den!,Tam karşıdan büyük sinir dalgası bozulmaları okuyorum. Sanırım onu bulduk. Oraya girelim ve onu kapatalım! -Just when I think we've seen it all! They go in human and come out... I dont even want to think about it. Destroy this horror!,TXT_ILOG103,MAP24: Converter room.,,Just when I think we've seen it all! They go in human and come out... I don't even want to think about it. Destroy this horror!,"Zrovna, když jsem myslela, že jsme to všechno viděli! Dovnitř jdou jako lidé a vyjdou... ani na to nechci myslet. Znič tu hrůzu!","Lige når jeg tror, vi har set det hele! De går ind i et menneske og kommer ud... Jeg vil ikke engang tænke på det. Ødelæg denne rædsel!","Und da denkt man, man hätte schon alles gesehen. Die kommen als Menschen rein und kommen raus als... Ich möchte gar nicht drüber nachdenken. Zerstöre diesen Horror.",,"Kaj mi kredis, ke mi jam vidis ĉiajn aferojn! Ili eniras kiel homojn kaj eliras... Mi eĉ ne volas pensi pri tio. Haltigu ĉi tiun teruraĵon!",¡Justo cuando creía haberlo visto todo! Entran humanos y salen... No quiero ni pensarlo. ¡Detén este horror!,,Juuri kun luulen nähneemme kaiken! He menevät sisään ihmisinä ja tulevat ulos... En halua edes ajatellakaan sitä. Tuhoa tämä kauhistus!,"Et quand je pense avoir tout vu.. Des humains entrent, et puis.. Non, je ne veux pas y penser. Détruis cette horreur!","Amikor azt hittem, hogy mindent láttunk. Emberként mennek be, és úgy jönnek ki mint egy...nem is akarok rá gondolni. Semmisítsd meg ezt a horrort!",E io che pensavo di averle viste tutte! Entrano umani ed escono fuori... Non ci voglio neanche pensare. Distruggi questo orrore!,"今まで見てきたことについて考えている! +(""neural oscillation"" or ""brainwave"")",,,"Detekuju obří rušení nervových vln přímo před námi. Myslím, že jsme to našli. Pojďme tam a vypněme to!","Jeg kan se massive neurale bølgeforvrængninger lige forude. Jeg tror, vi har fundet den. Lad os komme ind og lukke den ned!","Ich empfange massive neurale Verzerrungen direkt voraus. Ich denke, wir haben sie gefunden. Lass uns reingehen und sie abschalten.",,"Mi legas amasajn distordojn de cerbaj ondoj antaŭ vi. Ŝajnas, ke ni trovis ĝin. Ni eniru kaj malŝaltu ĝin!",Estoy leyendo distorsiones masivas de ondas cerebrales delante. Parece que la hemos encontrado. ¡Entremos ahí y apaguémosla!,Estoy leyendo distorsiones masivas de ondas cerebrales adelante. Parece que la encontramos. ¡Entremos ahí y apaguémosla!,Havaitsen massivisia hermoaaltovääristymiä suoraan edessä. Luulen löytäneemme sen. Mennään sisään ja sammutetaan se!,Je recois des distorsions neurales colossales devant nous. Je crois que nous l'avons trouvé. Détruisons-la!,,Erős ideghullám zavaró jeleket fogok. Azt hiszem megtaláltuk. Menjünk be és állítsuk le!,Sto ricevendo potenti segnali distorti proprio davanti a te. Penso che l'abbiamo trovata. Entriamo e spegnamo questa macchina!,重い神経波歪曲が直に届いたわ。私達はそれを見つけたという事よ。,앞쪽에서 거대한 신경교란 파장이 감지되고 있어. 우리가 찾아낸 것 같아. 어서 들어가서 꺼버리자!,Ik lees enorme neurale golfvervormingen van rechtdoor. Ik denk dat we hem gevonden hebben. Laten we naar binnen gaan en de machine stilleggen!,Jeg leser massive nevrale bølgeforvrengninger rett fram. Jeg tror vi har funnet den. La oss gå inn og slå den av!,Odczytuję potężne zniekształcenia fal neuronowych z prostej drogi. Chyba ją znaleźliśmy. Wejdźmy tam i wyłączmy ją!,Estou vendo distorções enormes de ondas neurais. Acho que encontramos. Vamos entrar lá e desligar!,,"Citesc distorsiune neurale masive drept din față, cred că am găsit-o. Să intrăm și să o oprim.","Я вижу мощный источник помех прямо по курсу. Похоже, мы нашли конвертер. Войди и останови его!",,Jag läser massiva neurala vågförvrängningar från rakt fram. Jag tror att vi har hittat den. Låt oss gå in där och stänga av den!,Tam karşıdan büyük sinir dalgası bozulmaları okuyorum. Sanırım onu bulduk. Oraya girelim ve onu kapatalım! +Just when I think we've seen it all! They go in human and come out... I dont even want to think about it. Destroy this horror!,TXT_ILOG103,MAP24: Converter room.,,Just when I think we've seen it all! They go in human and come out... I don't even want to think about it. Destroy this horror!,"Zrovna, když jsem myslela, že jsme to všechno viděli! Dovnitř jdou jako lidé a vyjdou... ani na to nechci myslet. Znič tu hrůzu!","Lige når jeg tror, vi har set det hele! De går ind i et menneske og kommer ud... Jeg vil ikke engang tænke på det. Ødelæg denne rædsel!","Und da denkt man, man hätte schon alles gesehen. Die kommen als Menschen rein und kommen raus als... Ich möchte gar nicht drüber nachdenken. Zerstöre diesen Horror.",,"Kaj mi kredis, ke mi jam vidis ĉiajn aferojn! Ili eniras kiel homojn kaj eliras... Mi eĉ ne volas pensi pri tio. Haltigu ĉi tiun teruraĵon!",¡Justo cuando creía haberlo visto todo! Entran humanos y salen... No quiero ni pensarlo. ¡Detén este horror!,,Juuri kun luulen nähneemme kaiken! He menevät sisään ihmisinä ja tulevat ulos... En halua edes ajatellakaan sitä. Tuhoa tämä kauhistus!,"Et quand je pense avoir tout vu.. Des humains entrent, et puis.. Non, je ne veux pas y penser. Détruis cette horreur!",,"Amikor azt hittem, hogy mindent láttunk. Emberként mennek be, és úgy jönnek ki mint egy...nem is akarok rá gondolni. Semmisítsd meg ezt a horrort!",E io che pensavo di averle viste tutte! Entrano umani ed escono fuori... Non ci voglio neanche pensare. Distruggi questo orrore!,"今まで見てきたことについて考えている! 奴は人の内部から出てくる...それについて考えたくないわ。 この恐怖を打ち消すんだ!",이렇게 끔찍한 모습을 보게 되다니! 멀쩡한 사람이 저곳에 들어갔다 나온 모습을... 차마 생각하기도 싫어. 저 경악스러운 것을 파괴해!,Net nu ik denk dat we alles hebben gezien! Ze gaan menselijk naar binnen en komen eruit.... Ik wil er niet eens over nadenken. Vernietig deze verschrikking!,Akkurat når jeg tror vi har sett alt! De går inn som mennesker og kommer ut... Jeg vil ikke engang tenke på det. Ødelegg denne grusomheten!,"Właśnie wtedy, gdy myślę, że widzieliśmy już wszystko! Wchodzą w człowieka i wychodzą... Nie chcę nawet o tym myśleć. Zniszczyć ten horror!",E eu pensei que já tinha visto de tudo! Eles entram humanos e saem... Eu não quero nem pensar nisso. Destrua essa coisa horripilante!,,Exact când credeam că am văzut tot. Intră oameni și ies...Nici nu vreau să mă gândesc. Distruge-o!,"А я-то думала, что хуже уже не будет! Они входят людьми, а выходят... Не хочу даже думать об этом. Покончи с этим кошмаром!",,Precis när jag tror att vi har sett allt! De går in som människor och kommer ut... Jag vill inte ens tänka på det. Förstör denna skräck!,Tam da her şeyi gördüğümüzü düşündüğüm anda! İnsana giriyorlar ve çıkıyorlar. Bunu düşünmek bile istemiyorum. Bu dehşeti yok edin! -Macil's gone nuts. He just knowingly sent 200 men to their deaths. I want vengeance! For the dead and for the living dead! Let's get back and find out what's going on.,TXT_ILOG104,MAP24: After destroying the converter.,,,"Macil zešílel. Jen tak poslal dvě stě mužů na smrt. Chci odplatu - za mrtvé i živé mrtvé! Vraťme se a pojďme zjistit, co se stalo.","Macil er blevet skør. Han har lige bevidst sendt 200 mænd i døden. Jeg vil have hævn! For de døde og for de levende døde! Lad os tage tilbage og finde ud af, hvad der foregår.","Macil hat den Verstand verloren. Er hat gerade absichtlich 200 unserer Leute in den Tod geschickt. Ich will Rache! Für die Toten und für die lebenden Toten. Lass uns zurückgehen und herausfinden, was da los ist.",,Macil freneziĝis: li intence sendis 200 homojn al la morto. Reiru al li por malkaŝi la veron.,Macil se ha vuelto loco: ha enviado intencionalmente a 200 hombres directo a la muerte. Regresemos a ver que está pasando.,Macil se volvió loco: mandó intencionalmente a 200 hombres directo a la muerte. Regresemos a ver qué está pasando.,"Macil on tullut hulluksi: Hän juuri lähetti tietoisesti 200 miestä surmaansa. Vaadin kostoa, sekä kuolleitten että elävien kuolleitten puolesta! Palataan ja selvitetään, mitä oikein on meneillään.","Macil a complètement perdu les pédales! Il a envoyé 200 hommes se faire tuer, et il le savait! Il faut les venger, pour eux et pour leurs camarades! On retourne à la base et on va trouver ce qu'il se passe.","Macil megőrült. 200 embert küldött a halálába szándékosan. Bosszút akarok! A halottakért, és az élőhalottakért! Húzzunk vissza és derítsük ki mi folyik.",Macil deve essere impazzito. Ha mandato consciamente 200 uomini verso la morte. Voglio vendetta! Per i morti e per i morti viventi! Ritorniamo alla base e scopriamo cosa sta succedendo.,"オラクルが正しかった。マシルはイカれていたなんて。 +Macil's gone nuts. He just knowingly sent 200 men to their deaths. I want vengeance! For the dead and for the living dead! Let's get back and find out what's going on.,TXT_ILOG104,MAP24: After destroying the converter.,,,"Macil zešílel. Jen tak poslal dvě stě mužů na smrt. Chci odplatu - za mrtvé i živé mrtvé! Vraťme se a pojďme zjistit, co se stalo.","Macil er blevet skør. Han har lige bevidst sendt 200 mænd i døden. Jeg vil have hævn! For de døde og for de levende døde! Lad os tage tilbage og finde ud af, hvad der foregår.","Macil hat den Verstand verloren. Er hat gerade absichtlich 200 unserer Leute in den Tod geschickt. Ich will Rache! Für die Toten und für die lebenden Toten. Lass uns zurückgehen und herausfinden, was da los ist.",,Macil freneziĝis: li intence sendis 200 homojn al la morto. Reiru al li por malkaŝi la veron.,Macil se ha vuelto loco: ha enviado intencionalmente a 200 hombres directo a la muerte. Regresemos a ver que está pasando.,Macil se volvió loco: mandó intencionalmente a 200 hombres directo a la muerte. Regresemos a ver qué está pasando.,"Macil on tullut hulluksi: Hän juuri lähetti tietoisesti 200 miestä surmaansa. Vaadin kostoa, sekä kuolleitten että elävien kuolleitten puolesta! Palataan ja selvitetään, mitä oikein on meneillään.","Macil a complètement perdu les pédales! Il a envoyé 200 hommes se faire tuer, et il le savait! Il faut les venger, pour eux et pour leurs camarades! On retourne à la base et on va trouver ce qu'il se passe.",,"Macil megőrült. 200 embert küldött a halálába szándékosan. Bosszút akarok! A halottakért, és az élőhalottakért! Húzzunk vissza és derítsük ki mi folyik.",Macil deve essere impazzito. Ha mandato consciamente 200 uomini verso la morte. Voglio vendetta! Per i morti e per i morti viventi! Ritorniamo alla base e scopriamo cosa sta succedendo.,"オラクルが正しかった。マシルはイカれていたなんて。 彼は故意に200人以上の人々を死に追いやっていた。 復讐しなくては。死んだ人達の為、そして今生きている人達の為にも! 戻って何が起きているかも調べるんだ。",마실이 정신 나갔나 봐. 모든 것을 알면서도 200 명이나 되는 병력을 보내서 죽게 했어. 과부들과 망령들을 위한 복수를 할 시간이야! 기지로 돌아가서 한번 그에게 여쭤봐.,Macil is gek geworden. Hij heeft net bewust 200 mannen naar hun dood gestuurd. Ik wil wraak! Voor de doden en voor de levende doden! Laten we teruggaan en uitzoeken wat er aan de hand is.,Macil har gått fra vettet. Han sendte 200 menn i døden med viten og vilje. Jeg vil ha hevn! For de døde og for de levende døde! La oss dra tilbake og finne ut hva som foregår.,"Macilowi odbiło. Właśnie świadomie wysłał 200 ludzi na śmierć. Chcę zemsty! Za zmarłych i za żywych zmarłych! Wracajmy i dowiedzmy się, co się dzieje.",O Macil enlouqueceu. Ele acabou de mandar 200 homens para as suas mortes e ele sabia disso. Eu quero vingança! Pelos mortos e pelos mortos-vivos! Vamos voltar e descobrir o que está acontecendo.,,Macil a înnebunit. A trimis intenționat 200 oameni la moarte. Vreau răzbunare! Pentru morți și morții vii! Să ne întoarcem și să vedem despre ce e vorba.,"Мэйсил озверел. Он намеренно послал двести человек на верную смерть. Я жажду мести! За убитых и за живых мертвецов! Давай вернёмся и выясним, что происходит.",,Macil har blivit galen. Han skickade just medvetet 200 män i döden. Jag vill ha hämnd! För de döda och för de levande döda! Låt oss återvända och ta reda på vad som pågår.,Macil çıldırdı. Bile bile 200 adamı ölüme gönderdi. İntikam istiyorum! Ölüler ve yaşayan ölüler için! Geri dönüp neler olduğunu öğrenelim. -"The factory leads to a ""lab"", and they're getting a Sigil piece power signature from within. Back to the factory and our next step to freedom.",TXT_ILOG106,MAP10: After killing Macil while having destroyed the converter in MAP24.,,,"Továrna vede do „laboratoře“, a z ní detekují energii Pečeťe. Zpátky do továrny a našemu dalšímu kroku ke svobodě.","Fabrikken fører til et ""laboratorium"", og de får en signatur af en Sigil-styks kraft fra det indre. Tilbage til fabrikken og vores næste skridt mod frihed.","In der Fabrik gibt es ein „Labor“, und dort gibt es eine Sigil-Signatur. Zurück zur Fabrik und dem nächsten Schritt zu unserer Freiheit.",,"La fabriko kondukas al «laboratorio» de kie ni malkovris signon de la povo de la Sigelo. Reiru al la fabriko, nia sekva paŝo al la libereco.","La fábrica lleva a un «laboratorio» en donde detectamos una señal del poder del Emblema. De vuelta a la fábrica, nuestro siguiente paso a la libertad.",,"Tehdas johtaa ""laboratorioon"", ja he lukevat sisältä Sinettiosasen energiajälkiä. Takaisin tehtaaseen ja kohti seuraavaa askeltamme vapauteen.","L'usine mène à un « laboratoire », et je reçois le signal d'une pièce du Sigil à l'intérieur. Retournons à l'usine pour prendre le prochain pas vers la liberté.","A gyár egy laboratúriumba vezet, és pecsét erő sugárzást észlelünk belülről. Forduljunk vissza a gyárhoz, ezzel közelebb kerülve a szabadsághoz.","La Fabbrica porta a un ""laboratorio"", ed al suo interno è stato identificato un segnale di un pezzo del Sigillo. Ritorniamo alla fabbrica e il nostro prossimo passo per la libertà.","リヒターの報告では我々が破壊した工場は'研究所'に繋がっていて、 +"The factory leads to a ""lab"", and they're getting a Sigil piece power signature from within. Back to the factory and our next step to freedom.",TXT_ILOG106,MAP10: After killing Macil while having destroyed the converter in MAP24.,,,"Továrna vede do „laboratoře“, a z ní detekují energii Pečeťe. Zpátky do továrny a našemu dalšímu kroku ke svobodě.","Fabrikken fører til et ""laboratorium"", og de får en signatur af en Sigil-styks kraft fra det indre. Tilbage til fabrikken og vores næste skridt mod frihed.","In der Fabrik gibt es ein „Labor“, und dort gibt es eine Sigil-Signatur. Zurück zur Fabrik und dem nächsten Schritt zu unserer Freiheit.",,"La fabriko kondukas al «laboratorio» de kie ni malkovris signon de la povo de la Sigelo. Reiru al la fabriko, nia sekva paŝo al la libereco.","La fábrica lleva a un «laboratorio» en donde detectamos una señal del poder del Emblema. De vuelta a la fábrica, nuestro siguiente paso a la libertad.",,"Tehdas johtaa ""laboratorioon"", ja he lukevat sisältä Sinettiosasen energiajälkiä. Takaisin tehtaaseen ja kohti seuraavaa askeltamme vapauteen.","L'usine mène à un « laboratoire », et je reçois le signal d'une pièce du Sigil à l'intérieur. Retournons à l'usine pour prendre le prochain pas vers la liberté.",,"A gyár egy laboratúriumba vezet, és pecsét erő sugárzást észlelünk belülről. Forduljunk vissza a gyárhoz, ezzel közelebb kerülve a szabadsághoz.","La Fabbrica porta a un ""laboratorio"", ed al suo interno è stato identificato un segnale di un pezzo del Sigillo. Ritorniamo alla fabbrica e il nostro prossimo passo per la libertà.","リヒターの報告では我々が破壊した工場は'研究所'に繋がっていて、 奴等はシジルの調印を内部から得ている。工場に戻って自由への次の段階に進みましょう",이 공장은 '연구소'로 연결돼. 그리고 지금 오더가 그 안에서 시질의 힘을 빌릴 조짐이 보여. 공장으로 돌아가서 자유 투쟁을 계속 진행해!,"De fabriek leidt naar een ""lab"", en ze krijgen een Sigil stuk macht handtekening van binnenuit. Terug naar de fabriek en onze volgende stap naar vrijheid.","Fabrikken fører til et ""laboratorium"", og de får en Sigil-kraftsignatur fra innsiden. Tilbake til fabrikken og vårt neste skritt mot frihet.","Fabryka prowadzi do ""laboratorium"", a z jego wnętrza wydobywa się sygnatura mocy kawałka Sigil. Powrót do fabryki i nasz kolejny krok do wolności.","A fábrica leva a um ""laboratório"" e é de lá de onde eles estão recebendo um sinal da energia de uma peça do Sigilo. De volta à fábrica e ao próximo passo à liberdade.",,"Fabrica duce înspre un laborator, și primesc putere de la o piesă din Sigiliu. Înapoi la fabrică și încă un pas spre libertate.","За фабрикой находится «лаборатория», и мы засекли характерную энергию фрагмента Печати, исходящую оттуда. Вернись на фабрику и сделай ещё один шаг к нашему освобождению.",,"Fabriken leder till ett ""labb"", och de får en Sigil piece power signatur inifrån. Tillbaka till fabriken och vårt nästa steg mot frihet.","Fabrika bir ""laboratuvara"" açılıyor ve içeriden bir Sigil parçası güç imzası alıyorlar. Fabrikaya geri dönelim ve özgürlüğe bir sonraki adımımızı atalım." -"Find the Bishop and destroy him! Once he's dead, return to the Oracle.",TXT_ILOG120,MAP16: Entrance → Central door.,,,"Najdi Biskupa a znič ho! Až ho zabiješ, vrať se k Věštci.","Find biskoppen og ødelæg ham! Når han er død, skal du vende tilbage til Oraklet.","Finde den Bischof und vernichte ihn. Sobald er tot ist, kehre zum Orakel zurück.",,Trovu kaj mortigu la Episkopon! Tiam reiru al la Orakolo.,¡Encuentra al Obispo y mátalo! Luego regresa con el Oráculo.,,"Löydä Piispa ja tuhoa hänet! Kun hän on kuollut, palaa Oraakkelin luokse.","Trouve l'évêque et tues-le! Une fois qu'il est mort, retourne à l'Oracle.","Találd meg a Püspököt és öld meg! Ha meghalt, menj az Orákulumhoz.","Trova il Vescovo e distruggilo! Una volta ucciso, ritorna dall'Oracolo.",ビショップを見つけて殺したらオラクルの元へ戻れ。,비숍을 찾아서 그를 파괴해! 시질 조각을 얻은 뒤 오라클에게 돌아가.,"Vind de bisschop en vernietig hem! Als hij dood is, keer je terug naar het Orakel.","Finn biskopen og tilintetgjør ham! Når han er død, gå tilbake til Oraklet.","Znajdź Bishopa i zniszcz go! Gdy już będzie martwy, wróć do Oracle.",Encontre o Bispo e destrua ele! Assim que ele morrer volte ao Oráculo.,,"Găsește Episcopul și distruge-l! Odată ce e mort, întoarce-te la Oracol.","Найди Епископа и уничтожь его! После, вернись к Оракулу.",,Hitta biskopen och förgöra honom! När han är död återvänder du till oraklet.,Piskoposu bulun ve onu yok edin! O öldükten sonra Kahin'e dönün. -The Loremaster's lab is beyond the teleporter that just opened. Let's go find out what he was just yapping about. And our next step to freedom.,TXT_ILOG122,MAP12?,,,"Dějepiscova laboratoř je za teleportérem, který se právě otevřel. Pojďme se podívat, o čem to blábolil. A k našemu dalšímu kroku ke svobodě.","Loremesterens laboratorium ligger bag teleporteren, der lige er åbnet. Lad os finde ud af, hvad han lige pludrede om. Og vores næste skridt til frihed.","Das Labor des Wissensmeisters ist jenseits des Teleporters, der gerade geöffnet wurde. Lass uns herausfinden, worüber er da gerade geschwafelt hat. Und zum nächsten Schritt für unsere Freiheit.",,"La ĵus malfermiĝinta teleportilo kondukas al la laboratorio de la Folkloristo. Ni iru malkaŝi tion, pri kio li blablais.",El teletransportador que acaba de abrirse lleva al laboratorio del Maestro del Conocimiento. Vayamos a ver de qué tanto parloteaba.,,"Oppi-Isän laboratorio on juuri avautuneen kaukosiirtimen tuolla puolen. Mennään ottamaan selvää, mistä hän juuri oikein pälätti, ja kohti seuraavaa askeltamme vapauteen.","Le laboratoire du Maître des Traditions est de l'autre côté du téléporteur que nous venons d'ouvrir. Allons voir pourquoi il était en train de brailler, et prendre le prochain pas vers la liberté.",A Tanmester laborja a most megnyílt teleport túloldalán van. Derítsük ki miről is hadovált az imént. Még egy lépés a szabadság irányába.,Il laboratorio del Sapiente si trova giusto oltre questo teletrasporto. Andiamo a vedere di cosa stava blaterando. E verso il nostro prossimo passo per la libertà.,"ロアマスター研究所は開いたばかりのテレポーターを越えた先だ。 +"Find the Bishop and destroy him! Once he's dead, return to the Oracle.",TXT_ILOG120,MAP16: Entrance → Central door.,,,"Najdi Biskupa a znič ho! Až ho zabiješ, vrať se k Věštci.","Find biskoppen og ødelæg ham! Når han er død, skal du vende tilbage til Oraklet.","Finde den Bischof und vernichte ihn. Sobald er tot ist, kehre zum Orakel zurück.",,Trovu kaj mortigu la Episkopon! Tiam reiru al la Orakolo.,¡Encuentra al Obispo y mátalo! Luego regresa con el Oráculo.,,"Löydä Piispa ja tuhoa hänet! Kun hän on kuollut, palaa Oraakkelin luokse.","Trouve l'évêque et tues-le! Une fois qu'il est mort, retourne à l'Oracle.",,"Találd meg a Püspököt és öld meg! Ha meghalt, menj az Orákulumhoz.","Trova il Vescovo e distruggilo! Una volta ucciso, ritorna dall'Oracolo.",ビショップを見つけて殺したらオラクルの元へ戻れ。,비숍을 찾아서 그를 파괴해! 시질 조각을 얻은 뒤 오라클에게 돌아가.,"Vind de bisschop en vernietig hem! Als hij dood is, keer je terug naar het Orakel.","Finn biskopen og tilintetgjør ham! Når han er død, gå tilbake til Oraklet.","Znajdź Bishopa i zniszcz go! Gdy już będzie martwy, wróć do Oracle.",Encontre o Bispo e destrua ele! Assim que ele morrer volte ao Oráculo.,,"Găsește Episcopul și distruge-l! Odată ce e mort, întoarce-te la Oracol.","Найди Епископа и уничтожь его! После, вернись к Оракулу.",,Hitta biskopen och förgöra honom! När han är död återvänder du till oraklet.,Piskoposu bulun ve onu yok edin! O öldükten sonra Kahin'e dönün. +The Loremaster's lab is beyond the teleporter that just opened. Let's go find out what he was just yapping about. And our next step to freedom.,TXT_ILOG122,MAP12?,,,"Dějepiscova laboratoř je za teleportérem, který se právě otevřel. Pojďme se podívat, o čem to blábolil. A k našemu dalšímu kroku ke svobodě.","Loremesterens laboratorium ligger bag teleporteren, der lige er åbnet. Lad os finde ud af, hvad han lige pludrede om. Og vores næste skridt til frihed.","Das Labor des Wissensmeisters ist jenseits des Teleporters, der gerade geöffnet wurde. Lass uns herausfinden, worüber er da gerade geschwafelt hat. Und zum nächsten Schritt für unsere Freiheit.",,"La ĵus malfermiĝinta teleportilo kondukas al la laboratorio de la Folkloristo. Ni iru malkaŝi tion, pri kio li blablais.",El teletransportador que acaba de abrirse lleva al laboratorio del Maestro del Conocimiento. Vayamos a ver de qué tanto parloteaba.,,"Oppi-Isän laboratorio on juuri avautuneen kaukosiirtimen tuolla puolen. Mennään ottamaan selvää, mistä hän juuri oikein pälätti, ja kohti seuraavaa askeltamme vapauteen.","Le laboratoire du Maître des Traditions est de l'autre côté du téléporteur que nous venons d'ouvrir. Allons voir pourquoi il était en train de brailler, et prendre le prochain pas vers la liberté.",,A Tanmester laborja a most megnyílt teleport túloldalán van. Derítsük ki miről is hadovált az imént. Még egy lépés a szabadság irányába.,Il laboratorio del Sapiente si trova giusto oltre questo teletrasporto. Andiamo a vedere di cosa stava blaterando. E verso il nostro prossimo passo per la libertà.,"ロアマスター研究所は開いたばかりのテレポーターを越えた先だ。 奴が何をやらかしているか調べろ。次の自由を解放するために。",로어마스터의 연구소는 방금 열린 텔레포터를 통해서 입장이 가능해. 어떤 예언을 지껄이는지 한번 확인하러 가봐. 그리고 자유 투쟁을 계속 진행해!,Het lab van de Kennismeester is voorbij de teleporter die net geopend is. Laten we gaan uitzoeken waar hij net over aan het zeuren was. En onze volgende stap naar vrijheid.,Loremesterens laboratorium er bortenfor teleporteren som nettopp åpnet seg. La oss finne ut hva han snakket om. Og vårt neste skritt mot frihet.,"Laboratorium Loremastera jest za teleporterem, który właśnie się otworzył. Dowiedzmy się, o czym on właśnie gadał. I nasz następny krok do wolności.",O laboratório do Mestre do Conhecimento está depois desse teletransportador que acaba de abrir. Vamos lá descobrir sobre o que ele estava tagarelando. E ao nosso próximo passo à liberdade.,,Laboratorul Maestrului Cunoștiințelor e dincolo de teleportorul care tocmai s-a deschis. Să mergem și să vedem despre ce tot bolborosea. Și următorul nostru pas spre libertate.,"Телепорт, который ты нашёл, приведёт тебя в лабораторию Хранителя мудрости. Давай узнаем, о чём он там бормотал, и сделаем ещё один шаг к освобождению.",,Läromästarens labb ligger bortom teleportern som just öppnades. Nu går vi och tar reda på vad han just babblade om. Och vårt nästa steg till frihet.,Loremaster'ın laboratuvarı az önce açılan ışınlayıcının ötesinde. Gidip neden bahsettiğini öğrenelim. Ve özgürlüğe giden bir sonraki adımımızı. -"Come on, let's get the hell out of here. The force field is down, off to the Bishop's tower. Once he's dead, get back to the Oracle.",TXT_ILOG211,MAP15: Computer destroyed + Room 1,,,"No tak, dostaňme se sakra odsud. Silové pole je kaput, jdeme do Biskupovy věže. Až ho zabiješ, vrať se k Věštci.","Kom nu, lad os komme væk herfra. Kraftfeltet er nede, af sted til biskoppens tårn. Når han er død, så gå tilbage til Oraklet.","Komm schon, lass uns von hier verschwinden. Das Kraftfeld ist abgeschaltet, also ab zum Turm des Bischofs. Sobald er tot ist, geht es zurück zum Orakel",,"Nu, ni eliru. Vi malŝaltis la fortokampon ĉe la turo de la Episkopo. Mortiginte lin, reiru al la Orakolo.","Venga, larguémonos de aquí. Ya se ha desactivado el campo de fuerza en la torre del Obispo. En cuanto lo mates, vuelve con el Oráculo.","Vamos, salgamos de aquí. Ya se desactivó el campo de fuerza en la torre del Obispo. En cuanto lo mates, vuelve con el Oráculo.","Mennään, häivytään täältä hittoon. Voimakenttä on nurin; suunnatkaamme siis kohti Piispan tornia. Kun hän on kuollut, palaa Oraakkelin luokse.","Allez, il faut qu'on se barre d'ici. Le champ de force est hors-ligne. Entre dans la tour de l'évêque. Quand il sera mort, retourne à l'Oracle.","Na gyerünk, húzzunk innen. Az erőpajzs deaktiválva, irány a Püspök tornya. Ha meghalt menj vissza az Orákulumhoz.","Avanti, andiamo via da qui. Il campo di forza è disattivato, quindi andiamo alla torre del Vescovo. Una volta che è morto, ritorna dall'Oracolo.","頼むからこんな所さっさと出よう。 +"Come on, let's get the hell out of here. The force field is down, off to the Bishop's tower. Once he's dead, get back to the Oracle.",TXT_ILOG211,MAP15: Computer destroyed + Room 1,,,"No tak, dostaňme se sakra odsud. Silové pole je kaput, jdeme do Biskupovy věže. Až ho zabiješ, vrať se k Věštci.","Kom nu, lad os komme væk herfra. Kraftfeltet er nede, af sted til biskoppens tårn. Når han er død, så gå tilbage til Oraklet.","Komm schon, lass uns von hier verschwinden. Das Kraftfeld ist abgeschaltet, also ab zum Turm des Bischofs. Sobald er tot ist, geht es zurück zum Orakel",,"Nu, ni eliru. Vi malŝaltis la fortokampon ĉe la turo de la Episkopo. Mortiginte lin, reiru al la Orakolo.","Venga, larguémonos de aquí. Ya se ha desactivado el campo de fuerza en la torre del Obispo. En cuanto lo mates, vuelve con el Oráculo.","Vamos, salgamos de aquí. Ya se desactivó el campo de fuerza en la torre del Obispo. En cuanto lo mates, vuelve con el Oráculo.","Mennään, häivytään täältä hittoon. Voimakenttä on nurin; suunnatkaamme siis kohti Piispan tornia. Kun hän on kuollut, palaa Oraakkelin luokse.","Allez, il faut qu'on se barre d'ici. Le champ de force est hors-ligne. Entre dans la tour de l'évêque. Quand il sera mort, retourne à l'Oracle.",,"Na gyerünk, húzzunk innen. Az erőpajzs deaktiválva, irány a Püspök tornya. Ha meghalt menj vissza az Orákulumhoz.","Avanti, andiamo via da qui. Il campo di forza è disattivato, quindi andiamo alla torre del Vescovo. Una volta che è morto, ritorna dall'Oracolo.","頼むからこんな所さっさと出よう。 フォースフィールドは切った、ビショップの塔へ向かおう。 ビショップを殺したらオラクルの元へ戻れ。 ","이제 이곳을 당장 떠나. 방어막이 꺼졌으니! 비숍의 성으로 이동해서 비숍을 죽이고, 오라클을 만나러 가.","Kom op, laten we hier als de sodemieter weggaan. Het krachtveld is naar beneden, op weg naar de bisschopstoren. Als hij dood is, ga dan terug naar het Orakel.","Kom igjen, la oss komme oss vekk herfra. Kraftfeltet er nede, av gårde til biskopens tårn. Når han er død, gå tilbake til oraklet.","Chodź, wynośmy się stąd. Pole siłowe wyłączone, idziemy do wieży biskupa. Kiedy będzie martwy, wróć do Wyroczni.","Vamos dar o fora daqui. O campo de força está desligado. Vamos para a torre do Bispo. Assim que ele morrer, volte ao oráculo.",,"Hai, să ieșim de aici. Câmpul de forță e la pământ, către turnul Episcopului. Odată ce e mort, întoarce-te la Oracol.","Ну же, двигаем отсюда. Силовое поле отключено, пора двигаться к башне Епископа. Когда он умрёт, возвращайся к Оракулу.",,"Kom igen, vi sticker härifrån. Kraftfältet är nere, vi går till biskopens torn. När han är död, återvänder vi till Oraklet.","Hadi, buradan defolup gidelim. Güç alanı kapandı, Piskopos'un kulesine gidiyoruz. O öldüğünde, Kahin'e geri dönün." -Find the sanctuary by the river. Steal the chalice from inside. Bring it to Harris in the tavern.,TXT_ILOG1001,MAP33?,,,Najdi svatyni u řeky. Zevnitř ukradni kalich. Přines ho Harrisovi do taverny.,Find helligdommen ved floden. Stjæl bægeret indefra. Bring den til Harris på tavernaen.,"Finde das Heiligtum am Fluss. Stehle den Kelch, der dort aufbewahrt wird und bringe ihn zu Harris in der Taverne.",,"Trovu la sanktejon apud la rojo, ŝtelu la kalikon kaj portu ĝin al Harriso en la taverno.","Encuentra el santuario junto al arroyo, roba el cáliz de dentro y llévaselo a Harris en la taberna (Tavern).","Encuentra el santuario junto al arroyo, roba el cáliz de adentro y llévaselo a Harris a la taberna (Tavern).",Löydä pyhäkkö joen varrella. Varasta kalkki sisältä. Vie se Harrisille kapakkaan.,Trouve le sanctuaire près de la rivière. Prends le Calice qui s'y trouve et amène le à Harris dans la taverne.,A szentély a folyó mellett van. Lopd el a serleget bentről. Vidd travishez a kocsmába.,Trova il santuario accanto al fiume. Ruba il calice al suo interno. Portalo ad Harris nella taverna.,"川沿いの 聖域 を探し、中にある聖杯を盗む。 +Find the sanctuary by the river. Steal the chalice from inside. Bring it to Harris in the tavern.,TXT_ILOG1001,MAP33?,,,Najdi svatyni u řeky. Zevnitř ukradni kalich. Přines ho Harrisovi do taverny.,Find helligdommen ved floden. Stjæl bægeret indefra. Bring den til Harris på tavernaen.,"Finde das Heiligtum am Fluss. Stehle den Kelch, der dort aufbewahrt wird und bringe ihn zu Harris in der Taverne.",,"Trovu la sanktejon apud la rojo, ŝtelu la kalikon kaj portu ĝin al Harriso en la taverno.","Encuentra el santuario junto al arroyo, roba el cáliz de dentro y llévaselo a Harris en la taberna (Tavern).","Encuentra el santuario junto al arroyo, roba el cáliz de adentro y llévaselo a Harris a la taberna (Tavern).",Löydä pyhäkkö joen varrella. Varasta kalkki sisältä. Vie se Harrisille kapakkaan.,Trouve le sanctuaire près de la rivière. Prends le Calice qui s'y trouve et amène le à Harris dans la taverne.,,A szentély a folyó mellett van. Lopd el a serleget bentről. Vidd travishez a kocsmába.,Trova il santuario accanto al fiume. Ruba il calice al suo interno. Portalo ad Harris nella taverna.,"川沿いの 聖域 を探し、中にある聖杯を盗む。 酒場にいるハリスに渡す。",강 근처에 있는 성소를 찾아서 안에 보관되어있는 성배를 훔치고 선술집으로 향해.,Zoek het heiligdom bij de rivier. Steel de kelk van binnenuit. Breng het naar Harris in de herberg.,Finn helligdommen ved elven. Stjel begeret fra innsiden. Ta det med til Harris i vertshuset.,Znajdź sanktuarium nad rzeką. Ukradnij ze środka kielich. Zanieś go Harrisowi w tawernie.,Encontre o santuário perto do rio. Roube o cálice que está lá dentro. Leve-o para o Harris na taverna.,,Găsește sanctuarul de lângă râu. Fură potirul din interior. Du-l la Harris în tavernă.,Найди святилище возле реки. Проникни туда и выкради чашу. Принеси её Харрису в таверну.,,Hitta helgedomen vid floden. Stjäl kalken från insidan. Ta med den till Harris i tavernan.,Nehir kenarındaki tapınağı bulun. İçeriden kadehi çalın. Tavernadaki Harris'e götür. -Find the Governor. Talk to him about your reward.,TXT_ILOG1002,MAP33?,,,Najdi guvernéra. Promluv si s ním o své odměně.,Find guvernøren. Tal med ham om din belønning.,Finde den Gouverneur. Rede mit ihm über deine Belohnung.,,Trovu la registon kaj parolu al li pri via rekompenco.,Encuentra al Gobernador y háblale de tu recompensa.,,Löydä kuvernööri. Puhu hänen kanssaan palkkiostasi.,Trouve le gouverneur et demande ta récompense.,Keresd meg a Kormányzót. Beszélj vele a jutalomról.,Trova il governatore. Parlargli della tua ricompensa.,知事を探せ。彼と話して報酬を貰う。,총독을 만나서 보상에 대해 예기해.,Vind de Gouverneur. Spreek met hem over je beloning.,Finn guvernøren. Snakk med ham om belønningen din.,Znajdź gubernatora. Porozmawiaj z nim o swojej nagrodzie.,Encontre o Governador. Fale com ele sobre a sua recompensa.,,Găsește Guvernatorul. Vorbește cu el despre recompensa ta.,Найди губернатора. Обсуди с ним свою награду.,,Hitta guvernören. Prata med honom om din belöning.,Vali'yi bul. Onunla ödülün hakkında konuş. -"Find the sanctuary by the river. Inside someone called Beldin is being held. Shut him up, and bring his ring back to Rowan as proof.",TXT_ILOG1003,MAP02: After accepting Rowan's chore.,,,Najdi svatyni u řeky. Uvnitř je držen jakýsi Beldin. Umlč ho a přines Rowanovi jeho prsten jako důkaz.,"Find helligdommen ved floden. Indenfor bliver en person ved navn Beldin holdt fanget. Få ham til at lukke munden på ham, og giv Rowan hans ring tilbage som bevis.",Finde das Heiligtum am Fluss. Dort drinnen wird jemand namens Beldin festgehalten. Bringe ihn zum Schweigen und gebe Rowan seinen Ring als Beweis.,,Trovu la sanktejon apud la rojo. Iu nomata Beldin estas retenita en ĝi. Silentigu lin kaj donu lian ringon kiel pruvon al Rowan.,Encuentra el santuario junto al arroyo. Alguien llamado Beldin está retenido dentro. Siléncialo y dale su anillo a Rowan como prueba.,Encuentra el santuario junto al arroyo. Alguien llamado Beldin está retenido adentro. Siléncialo y dale su anillo a Rowan como prueba.,"Löydä pyhäkkö joen varrella. Sisällä on vangittuna joku nimeltään Beldin. Vaienna hänet, ja tuo hänen sormuksensa takaisin Rowanille todisteena.","Trouve le sanctuaire près de la rivière. Quelqu'un qui s'appelle Beldin s'y trouve emprisonné. Cloue-lui le bec, et ramène son anneau à Rowan comme preuve.","Megtalálod a szentélyt a folyó mellett. Egy Beldin nevű figurát tartanak fogva. Halgattasd el örökre, és hozd vissza a gyűrűjét Rowannak bizonyítékként.","Trova il santuario accanto al fiume. Dentro, qualcuno chiamato Beldin è sotto chiave. Fallo tacere per sempre, e riporta il suo anello a Rowan come prova.","川沿いの 聖域 を探せ。中にいるベルディンと +Find the Governor. Talk to him about your reward.,TXT_ILOG1002,MAP33?,,,Najdi guvernéra. Promluv si s ním o své odměně.,Find guvernøren. Tal med ham om din belønning.,Finde den Gouverneur. Rede mit ihm über deine Belohnung.,,Trovu la registon kaj parolu al li pri via rekompenco.,Encuentra al Gobernador y háblale de tu recompensa.,,Löydä kuvernööri. Puhu hänen kanssaan palkkiostasi.,Trouve le gouverneur et demande ta récompense.,,Keresd meg a Kormányzót. Beszélj vele a jutalomról.,Trova il governatore. Parlargli della tua ricompensa.,知事を探せ。彼と話して報酬を貰う。,총독을 만나서 보상에 대해 예기해.,Vind de Gouverneur. Spreek met hem over je beloning.,Finn guvernøren. Snakk med ham om belønningen din.,Znajdź gubernatora. Porozmawiaj z nim o swojej nagrodzie.,Encontre o Governador. Fale com ele sobre a sua recompensa.,,Găsește Guvernatorul. Vorbește cu el despre recompensa ta.,Найди губернатора. Обсуди с ним свою награду.,,Hitta guvernören. Prata med honom om din belöning.,Vali'yi bul. Onunla ödülün hakkında konuş. +"Find the sanctuary by the river. Inside someone called Beldin is being held. Shut him up, and bring his ring back to Rowan as proof.",TXT_ILOG1003,MAP02: After accepting Rowan's chore.,,,Najdi svatyni u řeky. Uvnitř je držen jakýsi Beldin. Umlč ho a přines Rowanovi jeho prsten jako důkaz.,"Find helligdommen ved floden. Indenfor bliver en person ved navn Beldin holdt fanget. Få ham til at lukke munden på ham, og giv Rowan hans ring tilbage som bevis.",Finde das Heiligtum am Fluss. Dort drinnen wird jemand namens Beldin festgehalten. Bringe ihn zum Schweigen und gebe Rowan seinen Ring als Beweis.,,Trovu la sanktejon apud la rojo. Iu nomata Beldin estas retenita en ĝi. Silentigu lin kaj donu lian ringon kiel pruvon al Rowan.,Encuentra el santuario junto al arroyo. Alguien llamado Beldin está retenido dentro. Siléncialo y dale su anillo a Rowan como prueba.,Encuentra el santuario junto al arroyo. Alguien llamado Beldin está retenido adentro. Siléncialo y dale su anillo a Rowan como prueba.,"Löydä pyhäkkö joen varrella. Sisällä on vangittuna joku nimeltään Beldin. Vaienna hänet, ja tuo hänen sormuksensa takaisin Rowanille todisteena.","Trouve le sanctuaire près de la rivière. Quelqu'un qui s'appelle Beldin s'y trouve emprisonné. Cloue-lui le bec, et ramène son anneau à Rowan comme preuve.",,"Megtalálod a szentélyt a folyó mellett. Egy Beldin nevű figurát tartanak fogva. Halgattasd el örökre, és hozd vissza a gyűrűjét Rowannak bizonyítékként.","Trova il santuario accanto al fiume. Dentro, qualcuno chiamato Beldin è sotto chiave. Fallo tacere per sempre, e riporta il suo anello a Rowan come prova.","川沿いの 聖域 を探せ。中にいるベルディンと 呼ばれている捕獲された者を見つけ彼を黙らせる。 指輪をロワンに渡す。","강 근처에 있는 성소를 찾아서 벨딘이라는 사람을 찾고, 입을 다물게 해. 그 후에 그의 반지를 얻어서 로완에게 그를 죽였다고 증명해.","Zoek het heiligdom bij de rivier. Binnenin wordt iemand met de naam Beldin vastgehouden. Laat hem zwijgen, en breng zijn ring terug naar Rowan als bewijs.","Finn helligdommen ved elven. Der inne holdes en som heter Beldin fanget. Få ham til å holde kjeft, og ta med ringen hans tilbake til Rowan som bevis.",Znajdź sanktuarium nad rzeką. W środku przetrzymywany jest ktoś o imieniu Beldin. Ucisz go i przynieś jego pierścień Rowanowi jako dowód.,Encontre o santuário perto do rio. Dentro há alguém chamado Beldin sendo detido. Cale a boca dele e traga o seu anel de volta ao Rowan como prova.,,Găsește sanctuarul de lângă râu. Înăuntru cineva numit Beldin e reținut. Redu-l la tăcere și întoarce-te cu inelul la Rowan drept dovadă.,"Найди святилище возле реки. Внутри содержится пленник по имени Белдин. Заставь его замолчать, и принеси его кольцо Роуэну в качестве доказательства.",,Hitta helgedomen vid floden. Där inne hålls någon som heter Beldin fången. Få tyst på honom och ta med dig hans ring tillbaka till Rowan som bevis.,Nehir kenarındaki sığınağı bul. İçeride Beldin adında biri tutuluyor. Onu susturun ve yüzüğünü kanıt olarak Rowan'a geri getirin. -Find the location of the Front and talk to Macil.,TXT_ILOG1004,MAP02: After getting the com unit from Rowan.,,,Najdi umístění Fronty a promluv si s Macilem.,Find placeringen af fronten og tal med Macil.,Finde die Basis der Front und rede mit Macil.,,,Encuentra la localización del Frente y habla con Macil.,,Löydä Rintaman olinpaikka ja keskustele Macilin kanssa.,Trouve où se cache le Front et parle à Macil.,"Keresd meg a Front központját, és beszélj Macillal.",Trova il quartier generale del Fronte e parla a Macil.,フロントの場所を見つけ、マシルと会話する。,프론트의 기지를 찾아서 마실과 대화해봐.,Zoek de locatie van het Front en praat met Macil.,Finn plasseringen til Fronten og snakk med Macil.,Znajdź lokalizację Frontu i porozmawiaj z Macil.,Ache a localização da Frente e fale com o Macil.,,Găsește locația Frontului și vorbește cu Macil.,Найди базу Сопротивления и поговори с Мэйсилом.,,Hitta platsen för fronten och prata med Macil.,Cephe'nin yerini bulun ve Macil ile konuşun. -"Go down the stairs, find and talk to Macil.",TXT_ILOG1005,MAP02?,,,Jdi dolů po schodech a najdi a promluv si s Macilem.,"Gå ned ad trappen, find og tal med Macil.",Geh die Treppe runter und rede mit Macil.,,,Baja por las escaleras. Encuentra y habla con Macil.,,"Kulje portaat alas, löydä Macil ja keskustele hänen kanssaan.","Descends les escaliers, trouve et parle à Macil.","Menj le a lépcsőn, és keresd meg Macilt.","Scendi le scale, e trova e parla con Macil.",階段を降り、マシルと会話する。,계단 밑으로 내려가서 마실과 대화해봐.,"Ga de trap af, zoek en praat met Macil.","Gå ned trappene, finn og snakk med Macil.","Zejdź na dół po schodach, znajdź i porozmawiaj z Macil.","Desça as escadas, encontre e fale com o Macil.",,"Du-te în josul scărilor, găsește-l și vorbește cu Macil.","Спустись на этаж ниже, найди Мэйсила и поговори с ним.",,"Gå ner för trapporna, hitta och prata med Macil.","Merdivenlerden aşağı inin, Macil'i bulun ve onunla konuşun." -"Visit Irale, the Front's weapons supplier in town. He's behind the door next to the weapons shop. Then, use the key Macil gave you to talk to the Governor.",TXT_ILOG1006,MAP03: After joining the Front.,,,"Navštiv Iraleho, dodavatele zbraní pro Frontu ve městě. Je za dveřmi vedle obchodu se zbraněmi. Pak použij klíč od Macila, aby sis promluvil s guvernérem.","Besøg Irale, Frontens våbenleverandør i byen. Han befinder sig bag døren ved siden af våbenbutikken. Brug derefter den nøgle, som Macil gav dig, til at tale med guvernøren.","Suche Irale auf, den Waffenbeschaffer der Front in der Stadr. Er hält sich in dem Gebäude neben dem Waffengeschäft auf. Danach benutze den Schlüssel, den Macil dir gegeben hat, um mit dem Gouverneur zu reden",,,"Visita a Irale, el proveedor de armamento del Frente; está pasando la puerta junto a la tienda de armas (Weapons). Luego usa la llave que te dio Macil para hablar con el Gobernador.",,"Tapaa Iralea, joka on Rintaman asetoimittaja kaupungissa. Hän on asekaupan viereisen oven takana. Käytä sen jälkeen Macilin antamaa avainta puhuaksesi kuvernöörin kanssa.","Va voir Irale, le chef de l'arsenal du Front, en ville. Il se trouve derrière la porte à côté du marchand d'armes. Utilise la clé que Macil t'a donné pour parler au gouverneur.","Keresd fel Iralet, a Front fegyver beszállítóját a városban. A fegyverbolt melletti ajtó mögött vár rád. Utána használd a maciltól kapott kulcsot, hogy tudj beszélni a Kormányzóval.","Visita Irale, il fornitore di armi del Fronte in città. Si trova dietro la porta accanto al negozio di armi. Dopodiché, usa la chiave che Macil ti ha dato per andare a parlare al governatore.","町にいるフロントへの武器供給者であるイラールの元を訪ねる。 +Find the location of the Front and talk to Macil.,TXT_ILOG1004,MAP02: After getting the com unit from Rowan.,,,Najdi umístění Fronty a promluv si s Macilem.,Find placeringen af fronten og tal med Macil.,Finde die Basis der Front und rede mit Macil.,,,Encuentra la localización del Frente y habla con Macil.,,Löydä Rintaman olinpaikka ja keskustele Macilin kanssa.,Trouve où se cache le Front et parle à Macil.,,"Keresd meg a Front központját, és beszélj Macillal.",Trova il quartier generale del Fronte e parla a Macil.,フロントの場所を見つけ、マシルと会話する。,프론트의 기지를 찾아서 마실과 대화해봐.,Zoek de locatie van het Front en praat met Macil.,Finn plasseringen til Fronten og snakk med Macil.,Znajdź lokalizację Frontu i porozmawiaj z Macil.,Ache a localização da Frente e fale com o Macil.,,Găsește locația Frontului și vorbește cu Macil.,Найди базу Сопротивления и поговори с Мэйсилом.,,Hitta platsen för fronten och prata med Macil.,Cephe'nin yerini bulun ve Macil ile konuşun. +"Go down the stairs, find and talk to Macil.",TXT_ILOG1005,MAP02?,,,Jdi dolů po schodech a najdi a promluv si s Macilem.,"Gå ned ad trappen, find og tal med Macil.",Geh die Treppe runter und rede mit Macil.,,,Baja por las escaleras. Encuentra y habla con Macil.,,"Kulje portaat alas, löydä Macil ja keskustele hänen kanssaan.","Descends les escaliers, trouve et parle à Macil.",,"Menj le a lépcsőn, és keresd meg Macilt.","Scendi le scale, e trova e parla con Macil.",階段を降り、マシルと会話する。,계단 밑으로 내려가서 마실과 대화해봐.,"Ga de trap af, zoek en praat met Macil.","Gå ned trappene, finn og snakk med Macil.","Zejdź na dół po schodach, znajdź i porozmawiaj z Macil.","Desça as escadas, encontre e fale com o Macil.",,"Du-te în josul scărilor, găsește-l și vorbește cu Macil.","Спустись на этаж ниже, найди Мэйсила и поговори с ним.",,"Gå ner för trapporna, hitta och prata med Macil.","Merdivenlerden aşağı inin, Macil'i bulun ve onunla konuşun." +"Visit Irale, the Front's weapons supplier in town. He's behind the door next to the weapons shop. Then, use the key Macil gave you to talk to the Governor.",TXT_ILOG1006,MAP03: After joining the Front.,,,"Navštiv Iraleho, dodavatele zbraní pro Frontu ve městě. Je za dveřmi vedle obchodu se zbraněmi. Pak použij klíč od Macila, aby sis promluvil s guvernérem.","Besøg Irale, Frontens våbenleverandør i byen. Han befinder sig bag døren ved siden af våbenbutikken. Brug derefter den nøgle, som Macil gav dig, til at tale med guvernøren.","Suche Irale auf, den Waffenbeschaffer der Front in der Stadr. Er hält sich in dem Gebäude neben dem Waffengeschäft auf. Danach benutze den Schlüssel, den Macil dir gegeben hat, um mit dem Gouverneur zu reden",,,"Visita a Irale, el proveedor de armamento del Frente; está pasando la puerta junto a la tienda de armas (Weapons). Luego usa la llave que te dio Macil para hablar con el Gobernador.",,"Tapaa Iralea, joka on Rintaman asetoimittaja kaupungissa. Hän on asekaupan viereisen oven takana. Käytä sen jälkeen Macilin antamaa avainta puhuaksesi kuvernöörin kanssa.","Va voir Irale, le chef de l'arsenal du Front, en ville. Il se trouve derrière la porte à côté du marchand d'armes. Utilise la clé que Macil t'a donné pour parler au gouverneur.",,"Keresd fel Iralet, a Front fegyver beszállítóját a városban. A fegyverbolt melletti ajtó mögött vár rád. Utána használd a maciltól kapott kulcsot, hogy tudj beszélni a Kormányzóval.","Visita Irale, il fornitore di armi del Fronte in città. Si trova dietro la porta accanto al negozio di armi. Dopodiché, usa la chiave che Macil ti ha dato per andare a parlare al governatore.","町にいるフロントへの武器供給者であるイラールの元を訪ねる。 彼は武器屋の隣のドアに居る。それで、知事と会う為にマシルから貰ったキーを使う。","프론트의 무기상인 이롤리를 마을에서 찾아. 무기 상점 근처에 문이 있을 거야. 마실이 준 열쇠로 문을 열고 방문한 뒤, 총독과 대화해.","Bezoek Irale, de wapenleverancier van het Front in de stad. Hij zit achter de deur naast de wapenwinkel. Gebruik dan de sleutel die Macil je gaf om met de Gouverneur te praten.","Besøk Irale, Frontens våpenleverandør i byen. Han er bak døren ved siden av våpenbutikken. Bruk nøkkelen Macil ga deg til å snakke med guvernøren.","Odwiedź w mieście Irale, dostawcę broni dla Frontu. Jest on za drzwiami obok sklepu z bronią. Następnie użyj klucza, który dał ci Macil, by porozmawiać z gubernatorem.","Visite o Irale, o fornecedor de armas da Frente. Ele está atrás da porta perto da loja de armas. Depois, use a chave que o Macil te deu para falar com o Governador.",,"Vizitează pe Irale, distribuitorul de arme alFrontului în oraș. E dincolo de ușa de lângă magazinul de arme. Apoi, folosește cheia pe care Macil ți-a dat-o și vorbește cu Guvernatorul.","Посети Ирэйла, поставщика оружия Сопротивления в городе. Он за следующей после оружейного магазина дверью. Затем, воспользуйся ключом, который тебе дал Мэйсил, чтобы поговорить с губернатором.",,"Besök Irale, frontens vapenleverantör i staden. Han befinner sig bakom dörren bredvid vapenbutiken. Använd sedan nyckeln som Macil gav dig för att prata med guvernören.","Kasabada Cephe'nin silah tedarikçisi İrale'yi ziyaret edin. Silah dükkanının yanındaki kapının arkasında. Sonra, Vali ile konuşmak için Macil'in size verdiği anahtarı kullanın." -"Find the power tap on the mains, and shut it off. Bring something back to the Governor as proof.",TXT_ILOG1007,"MAP02: After accepting ""messy"" chore.",,,Najdi stáčedlo energie na síti a vypni jej. Přines guvernérovi něco zpět jako důkaz.,"Find elhanen på hovedledningen, og luk den. Tag noget med tilbage til guvernøren som bevis.",Finde die Energieanzapfung und schalte sie aus. Bringe dem Gouverneur irgend etwas als Beweis.,,,Encuentra la toma en la red eléctrica y destrúyela. Tráele algo al Gobernador como prueba.,,Etsi verkkovirran piilokytkentä ja katkaise se. Tuo kuvernöörille jotain todisteeksi.,Trouve la connection pirate sur le transformateur et enlève la. Amène quelque chose au gouverneur comme preuve.,"Keresd meg a fővonalon az áramkapcsolót, és kapcsold ki. Hozz vissza valamit a kormányzótól bizonyítékként.","Trova il marchingegno che sta venendo usato per rubare energia alla rete, e distruggilo. Porta dei resti al governatore come prova.","電力盗用の場所を見つけ、それを止める。 +"Find the power tap on the mains, and shut it off. Bring something back to the Governor as proof.",TXT_ILOG1007,"MAP02: After accepting ""messy"" chore.",,,Najdi stáčedlo energie na síti a vypni jej. Přines guvernérovi něco zpět jako důkaz.,"Find elhanen på hovedledningen, og luk den. Tag noget med tilbage til guvernøren som bevis.",Finde die Energieanzapfung und schalte sie aus. Bringe dem Gouverneur irgend etwas als Beweis.,,,Encuentra la toma en la red eléctrica y destrúyela. Tráele algo al Gobernador como prueba.,,Etsi verkkovirran piilokytkentä ja katkaise se. Tuo kuvernöörille jotain todisteeksi.,Trouve la connection pirate sur le transformateur et enlève la. Amène quelque chose au gouverneur comme preuve.,,"Keresd meg a fővonalon az áramkapcsolót, és kapcsold ki. Hozz vissza valamit a kormányzótól bizonyítékként.","Trova il marchingegno che sta venendo usato per rubare energia alla rete, e distruggilo. Porta dei resti al governatore come prova.","電力盗用の場所を見つけ、それを止める。 知事に渡す証拠も必要だ。",주 동력선 어딘가에 있는 추출기를 처리해. 그 잔해를 총독에게 들고 가서 증명해.,"Zoek het kraantje op het lichtnet, en zet het uit. Breng iets terug naar de Gouverneur als bewijs.","Finn strømbryteren på strømnettet, og slå den av. Ta med noe tilbake til guvernøren som bevis.",Znajdź kurek z prądem w sieci i wyłącz go. Przynieś coś gubernatorowi jako dowód.,Encontre a ligação clandestina no transformador e desligue-a. Traga algo de volta para o Governador como prova.,,Găsește cuplul de putere și oprește-l. Adu ceva drept dovadă Guvernatorului.,Найди нелегальное подключение к энергосети и выведи его из строя. Принеси что-нибудь губернатору в качестве доказательства.,,Leta reda på strömkranen på elnätet och stäng av den. Ta med dig något tillbaka till guvernören som bevis.,Şebekedeki güç musluğunu bulun ve kapatın. Kanıt olarak Vali'ye bir şey getirin. -"Find Derwin in the warehouse of the power station. Kill him, and bring Mourel his ear.",TXT_ILOG1008,"MAP02: After accepting ""bloody"" chore.",,,Najdi Derwina ve skladu elektrárny. Zabij ho a přines Mourelovi jeho ucho.,"Find Derwin i lageret på kraftværket. Dræb ham, og giv Mourel hans øre.",Finde Derwin im Lagerhaus des Kraftwerks. Töte ihn und bringe Mourel sein Ohr.,,,Encuentra a Derwin en el almacén (Warehouse) de la central eléctrica (Power Station). Mátalo y llévale su oreja a Mourel.,,"Etsi Derwin voimalaitoksen varastolta. Tapa hänet, ja tuo Mourelille hänen korvansa.","Trouve Derwin dans l'entrepôt de la centrale électrique. Tue-le, et amène son oreille à Mourel.","Keresd meg Derwint az erőmű raktárjában. öld meg, és vidd vissza Mourelnek a fülét.","Trova Derwin nel magazzino della centrale energetica. Uccidilo, e porta il suo orecchio a Mourel.","発電所の倉庫にいるダーウィンを見つける。 +"Find Derwin in the warehouse of the power station. Kill him, and bring Mourel his ear.",TXT_ILOG1008,"MAP02: After accepting ""bloody"" chore.",,,Najdi Derwina ve skladu elektrárny. Zabij ho a přines Mourelovi jeho ucho.,"Find Derwin i lageret på kraftværket. Dræb ham, og giv Mourel hans øre.",Finde Derwin im Lagerhaus des Kraftwerks. Töte ihn und bringe Mourel sein Ohr.,,,Encuentra a Derwin en el almacén (Warehouse) de la central eléctrica (Power Station). Mátalo y llévale su oreja a Mourel.,,"Etsi Derwin voimalaitoksen varastolta. Tapa hänet, ja tuo Mourelille hänen korvansa.","Trouve Derwin dans l'entrepôt de la centrale électrique. Tue-le, et amène son oreille à Mourel.",,"Keresd meg Derwint az erőmű raktárjában. öld meg, és vidd vissza Mourelnek a fülét.","Trova Derwin nel magazzino della centrale energetica. Uccidilo, e porta il suo orecchio a Mourel.","発電所の倉庫にいるダーウィンを見つける。 始末したら、そいつの耳をモーレルに渡す。",발전소 창고 주변에 있는 더윈을 찾아. 그를 죽인 뒤 귀를 뜯어서 모렐 총독에게 건네줘.,"Vind Derwin in het magazijn van de centrale. Dood hem, en breng Mourel zijn oor.","Finn Derwin i lageret på kraftstasjonen. Drep ham, og gi Mourel øret hans.",Znajdź Derwina w magazynie elektrowni. Zabij go i przynieś Mourelowi jego ucho.,Encontre o Derwin no depósito da usina elétrica. Mate-o e leve a sua orelha para o Mourel.,,Găsește-l pe Derwin în depozit. Omoară-l și adu-i urechea lui Mourel.,Найди Дервина на складе электростанции. Убей его и принеси Морелу его ухо.,,Hitta Derwin i lagret i kraftverket. Döda honom och ge Mourel hans öra.,Elektrik santralinin deposunda Derwin'i bulun. Onu öldürün ve Mourel'e kulağını getirin. -"Use the pass Mourel gave you to get into the prison. Once inside, talk to Warden Montag. Find a way to free the prisoners.",TXT_ILOG1009,MAP03: After completing Mourel's chore.,,,"Použij propustku od Mourela pro vstup do vězení. Uvnitř si promluv s dozorčím Montagem. Najdi způsob, jak vysvobodit vězně.","Brug det adgangskort, som Mourel gav dig, til at komme ind i fængslet. Når du er inde, skal du tale med direktør Montag. Find en måde at befri fangerne på.","Benutze den Pass, den Mourel dir gegeben hat um in das Gefängnis hereinzukommen. Wenn du drin bist, rede mit Direktor Montag. Finde einen Weg um die Gefangenen zu befreien.",,,"Usa el pase que Mourel te dió para entrar en la prisión. Una vez dentro, habla con el Carcelero Montag. Encuentra una forma de liberar a los prisioneros.",,Käytä Mourelin antamaa pääsylupaa päästäksesi vankilaan. Päästyäsi sisälle puhu vankilanjohtaja Montagin kanssa. Keksi keino vapauttaa vangit.,"Utilise le passe que Mourel t'a donné pour entrer dans la prison. Une fois à l'intérieur, parle au gardien Montag. Trouve un moyen de libérer les prisonniers.","Használd a Mourel által adott belépőt, hogy bejuss a börtönbe. Ha bent vagy, beszélj Montag börtön igazgatóval. Találd meg a módját, hogy kiszabadítsd a rabokat.","Usa il tesserino che Mourel ti ha dato per entrare nella prigione. Una volta dentro, parla con il direttore Montag. Trova un modo per liberare i prigionieri.","モーレルからもらった刑務所の許可証を使って入る。 +"Use the pass Mourel gave you to get into the prison. Once inside, talk to Warden Montag. Find a way to free the prisoners.",TXT_ILOG1009,MAP03: After completing Mourel's chore.,,,"Použij propustku od Mourela pro vstup do vězení. Uvnitř si promluv s dozorčím Montagem. Najdi způsob, jak vysvobodit vězně.","Brug det adgangskort, som Mourel gav dig, til at komme ind i fængslet. Når du er inde, skal du tale med direktør Montag. Find en måde at befri fangerne på.","Benutze den Pass, den Mourel dir gegeben hat um in das Gefängnis hereinzukommen. Wenn du drin bist, rede mit Direktor Montag. Finde einen Weg um die Gefangenen zu befreien.",,,"Usa el pase que Mourel te dió para entrar en la prisión. Una vez dentro, habla con el Carcelero Montag. Encuentra una forma de liberar a los prisioneros.",,Käytä Mourelin antamaa pääsylupaa päästäksesi vankilaan. Päästyäsi sisälle puhu vankilanjohtaja Montagin kanssa. Keksi keino vapauttaa vangit.,"Utilise le passe que Mourel t'a donné pour entrer dans la prison. Une fois à l'intérieur, parle au gardien Montag. Trouve un moyen de libérer les prisonniers.",,"Használd a Mourel által adott belépőt, hogy bejuss a börtönbe. Ha bent vagy, beszélj Montag börtön igazgatóval. Találd meg a módját, hogy kiszabadítsd a rabokat.","Usa il tesserino che Mourel ti ha dato per entrare nella prigione. Una volta dentro, parla con il direttore Montag. Trova un modo per liberare i prigionieri.","モーレルからもらった刑務所の許可証を使って入る。 入ったらモンターグと話し、囚人を解放する方法を探す。 ",총독이 준 감옥 통행증을 이용해서 감옥으로 들어가. 들어간 후에 수감자들을 해방하기 위해 몬탕 간수장과 대화해. ,"Gebruik de pas die Mourel je gaf om in de gevangenis te komen. Eenmaal binnen, praat je met Warden Montag. Zoek een manier om de gevangenen te bevrijden.","Bruk passet Mourel ga deg for å komme inn i fengselet. Når du er inne, snakk med fengselsdirektør Montag. Finn en måte å befri fangene på.","Użyj przepustki, którą dał ci Mourel, aby dostać się do więzienia. Po wejściu do środka porozmawiaj z naczelnikiem Montagiem. Znajdź sposób na uwolnienie więźniów.","Use o passe que o Mourel te deu para entrar na prisão. Após entrar, fale com o Carcereiro Montag. Encontre uma maneira de libertar os prisioneiros.",,"Folosește parola pe care ți-a dat-o Mourel pentru a intra în închisoare. Odată înăuntru, vorbește cu Directorul Montag. Găsește o cale să eliberezi prizonierii.","Используй пропуск, полученный у Морела, чтобы пройти в тюрьму. Когда ты будешь внутри, поговори с тюремщиком Монтагом. Найди способ освободить пленников.",,Använd passet som Mourel gav dig för att komma in i fängelset. När du väl är inne pratar du med fängelsedirektör Montag. Hitta ett sätt att befria fångarna.,Hapishaneye girmek için Mourel'in size verdiği kartı kullanın. İçeri girdikten sonra Müdür Montag ile konuşun. Mahkûmları serbest bırakmanın bir yolunu bulun. -Use the Warden's key to get into the prison cell blocks and find a way to free the prisoners.,TXT_ILOG1010,MAP05,,,"Použij dozorčího klíč k dostání se do vězeňského bloku s celami a najdi způsob, jak vysvobodit vězně.",Brug fængselsdirektørens nøgle til at komme ind i fængselscelleblokkene og find en måde at befri fangerne på.,"Benutze den Schlüssel des Direktors um in die Zellenblöcke zu kommen und finde heraus, wie man die Gefangenen befreien kann.",,,Usa la llave del Carcelero para entrar en los bloques de celdas y encuentra una forma de liberar a los prisioneros.,Usa la llave del Carcelero para entrar a los bloques de celdas y encuentra una forma de liberar a los prisioneros.,Käytä vankilanjohtajan avainta päästäksesi vankilan selliosastoille ja keksi keino vapauttaa vangit.,Utilisé la clé du Gardien pour entrer dans les blocs de cellules et trouve un moyen de libérer les prisonners.,"Használd a börtön igazgató kulcsát, hogy bejuss a cella blokkba, és szabadítsd ki a foglyokat.",Usa la chiave del direttore per entrare nella sezione delle celle e trovare un modo per liberare i prigionieri.,ワーデンから鍵を奪って内部に入れ。,"간수장의 열쇠를 써서 감옥 안으로 진입하고, 수감자들을 풀어줄 방법을 찾아봐.",Gebruik de sleutel van de bewaker om in de celblokken van de gevangenis te komen en een manier te vinden om de gevangenen te bevrijden.,Bruk fengselsdirektørens nøkkel for å komme deg inn i fengselsblokkene og finn en måte å befri fangene på.,"Użyj klucza naczelnika, aby dostać się do bloków więziennych i znajdź sposób na uwolnienie więźniów.",Use a chave do Carcereiro para entrar nos blocos de celas e ache uma maneira de libertar os prisioneiros.,,Folosește cheia pe care ți-a dat-o Guvernatorul și găsește o cale să eliberezi prizonierii.,"Используй ключ тюремщика, чтобы пройти к камерам, и найди способ освободить пленников.",,Använd fängelsedirektörens nyckel för att ta dig in i fängelsets cellblock och hitta ett sätt att befria fångarna.,Hapishane hücre bloklarına girmek için Müdürün anahtarını kullanın ve mahkûmları serbest bırakmanın bir yolunu bulun. -"Destroy the power crystal that runs the power grid which drives the Order's shields. Go visit Worner, a spy we recruited in the warehouse of the power station. Don't forget to visit the medic and the weapons trainer before you go.",TXT_ILOG1011,MAP03: After accepting Macil's second mission.,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi navštívit Wornera, špióna, kterého jsme najali ve skladu elektrárny. Nezapomeň navštívit zdravotníka a učitele střelby, než půjdeš.","Ødelæg energikrystallen, der driver det strømnet, som driver Ordenens skjolde. Besøg Worner, en spion, som vi rekrutterede i lageret på kraftværket. Glem ikke at besøge lægen og våbentræneren, før du går.","Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Suche Worner auf, einen Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben. Vergiß nicht, den Sanitäter und den Waffentrainer aufzusuchen, bevor du gehst.",,,"Destruye el cristal de poder que impulsa la red eléctrica que alimenta los escudos de La Orden. Busca a Worner, un espía que reclutamos en el almacén de la central eléctrica. Recuerda visitar al médico y al entrenador de armas.",,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Mene tapaamaan Worneria, vakoojaa, jonka värväsimme voimalaitoksen varastolta. Älä unohda vierailla lääkintämiehen ja asekouluttajan luona, ennen kuin lähdet.","Détruis le cristal qui alimente la grille énergétique des boucliers de l'Ordre. Va voir Worner, un espion que nous avons recruté dans l'entrepôt de la centrale éléctrique. N'oublie pas d'aller voir le maître d'armes et le médecin avant d'y aller.","Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Keresd fel az erőműtől betoborzott kémünket, Wornert. Ne felejtsd el meglátogatni a szanitécet és a fegyvermestert mielőtt nekiindulsz.","Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Trova Worner, una spia che abbiamo reclutato nel magazzino della centrale energetica. Non scordarti di passare dal medico e dall'addestratore di armi prima di andare.","送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止める。 +Use the Warden's key to get into the prison cell blocks and find a way to free the prisoners.,TXT_ILOG1010,MAP05,,,"Použij dozorčího klíč k dostání se do vězeňského bloku s celami a najdi způsob, jak vysvobodit vězně.",Brug fængselsdirektørens nøgle til at komme ind i fængselscelleblokkene og find en måde at befri fangerne på.,"Benutze den Schlüssel des Direktors um in die Zellenblöcke zu kommen und finde heraus, wie man die Gefangenen befreien kann.",,,Usa la llave del Carcelero para entrar en los bloques de celdas y encuentra una forma de liberar a los prisioneros.,Usa la llave del Carcelero para entrar a los bloques de celdas y encuentra una forma de liberar a los prisioneros.,Käytä vankilanjohtajan avainta päästäksesi vankilan selliosastoille ja keksi keino vapauttaa vangit.,Utilisé la clé du Gardien pour entrer dans les blocs de cellules et trouve un moyen de libérer les prisonners.,,"Használd a börtön igazgató kulcsát, hogy bejuss a cella blokkba, és szabadítsd ki a foglyokat.",Usa la chiave del direttore per entrare nella sezione delle celle e trovare un modo per liberare i prigionieri.,ワーデンから鍵を奪って内部に入れ。,"간수장의 열쇠를 써서 감옥 안으로 진입하고, 수감자들을 풀어줄 방법을 찾아봐.",Gebruik de sleutel van de bewaker om in de celblokken van de gevangenis te komen en een manier te vinden om de gevangenen te bevrijden.,Bruk fengselsdirektørens nøkkel for å komme deg inn i fengselsblokkene og finn en måte å befri fangene på.,"Użyj klucza naczelnika, aby dostać się do bloków więziennych i znajdź sposób na uwolnienie więźniów.",Use a chave do Carcereiro para entrar nos blocos de celas e ache uma maneira de libertar os prisioneiros.,,Folosește cheia pe care ți-a dat-o Guvernatorul și găsește o cale să eliberezi prizonierii.,"Используй ключ тюремщика, чтобы пройти к камерам, и найди способ освободить пленников.",,Använd fängelsedirektörens nyckel för att ta dig in i fängelsets cellblock och hitta ett sätt att befria fångarna.,Hapishane hücre bloklarına girmek için Müdürün anahtarını kullanın ve mahkûmları serbest bırakmanın bir yolunu bulun. +"Destroy the power crystal that runs the power grid which drives the Order's shields. Go visit Worner, a spy we recruited in the warehouse of the power station. Don't forget to visit the medic and the weapons trainer before you go.",TXT_ILOG1011,MAP03: After accepting Macil's second mission.,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi navštívit Wornera, špióna, kterého jsme najali ve skladu elektrárny. Nezapomeň navštívit zdravotníka a učitele střelby, než půjdeš.","Ødelæg energikrystallen, der driver det strømnet, som driver Ordenens skjolde. Besøg Worner, en spion, som vi rekrutterede i lageret på kraftværket. Glem ikke at besøge lægen og våbentræneren, før du går.","Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Suche Worner auf, einen Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben. Vergiß nicht, den Sanitäter und den Waffentrainer aufzusuchen, bevor du gehst.",,,"Destruye el cristal de poder que impulsa la red eléctrica que alimenta los escudos de La Orden. Busca a Worner, un espía que reclutamos en el almacén de la central eléctrica. Recuerda visitar al médico y al entrenador de armas.",,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Mene tapaamaan Worneria, vakoojaa, jonka värväsimme voimalaitoksen varastolta. Älä unohda vierailla lääkintämiehen ja asekouluttajan luona, ennen kuin lähdet.","Détruis le cristal qui alimente la grille énergétique des boucliers de l'Ordre. Va voir Worner, un espion que nous avons recruté dans l'entrepôt de la centrale éléctrique. N'oublie pas d'aller voir le maître d'armes et le médecin avant d'y aller.",,"Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Keresd fel az erőműtől betoborzott kémünket, Wornert. Ne felejtsd el meglátogatni a szanitécet és a fegyvermestert mielőtt nekiindulsz.","Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Trova Worner, una spia che abbiamo reclutato nel magazzino della centrale energetica. Non scordarti di passare dal medico e dall'addestratore di armi prima di andare.","送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止める。 発電所の倉庫に潜らせたスパイ、ワーナーを訪ねる。 その前にメディックと武器トレーナーに会うのを忘れるな。","오더의 방어막을 유지하는 동력 망의 전력원인 수정체를 파괴하자. 우선, 발전소 창고에 있는 우리 쪽 첩자인 워너에게 찾아가 보자. 가기 전에 의무관이랑 무기 담당관을 만나는 것도 잊지 말고!","Vernietig het energiekristal dat het stroomnet dat de schilden van de Orde aandrijft. Ga naar Worner, een spion die we in het magazijn van de centrale hebben gerekruteerd. Vergeet niet om de dokter en de wapentrainer te bezoeken voor je vertrekt.","Ødelegg kraftkrystallen som driver kraftnettet som driver ordenens skjold. Besøk Worner, en spion vi rekrutterte i lageret til kraftstasjonen. Ikke glem å besøke medisineren og våpentreneren før du går.","Zniszcz kryształ mocy, który zasila sieć energetyczną napędzającą tarcze Zakonu. Idź odwiedzić Wornera, szpiega, którego zwerbowaliśmy w magazynie elektrowni. Nie zapomnij przed wyjściem odwiedzić medyka i trenera broni.","Destrua o cristal de energia que alimenta a rede elétrica por trás dos escudos da Ordem. Visite o Worner, um espião que recrutamos no depósito da usina de energia. Não se esqueça de visitar o médico e o treinador de armas antes de ir.",,"Distruge cristalul de nergie care alimentează câmpurile Ordinului. Vizitează pe Worner, un spion recrutat în depozitul stației. Nu uita să vorbești cu medicul și antrenorul de arme înainte.","Уничтожь кристалл, питающий энергосеть, от которой работают щиты Ордена. Поговори с Уорнэром, шпионом Сопротивления, на складе электростанции. Не забудь перед уходом посетить медика и инструктора по стрельбе.",,"Förstör kraftkristallen som driver kraftnätet som driver ordens sköldar. Gå och besök Worner, en spion som vi rekryterade i kraftverkets lager. Glöm inte att besöka läkaren och vapentränaren innan du går.",Tarikat'ın kalkanlarını çalıştıran güç şebekesini çalıştıran güç kristalini yok edin. Güç istasyonunun deposunda işe aldığımız casus Worner'ı ziyaret edin. Gitmeden önce sıhhiyeciyi ve silah eğitmenini ziyaret etmeyi unutmayın. -Destroy the power crystal that runs the power grid which drives the Order's shields. Use the I.D. to get into the power station. You may want to check out the storeroom above Worner.,TXT_ILOG1012,MAP04: After talking to Worner.,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Použij získanou legitimaci pro přístup do elektrárny. Možná by stálo za to podívat se do skladištní místnosti nad Wornerem.","Ødelæg energikrystallen, der driver det kraftnet, som driver Ordenens skjolde. Brug identifikationskortet til at komme ind i kraftværket. Du kan tjekke lagerrummet over Worner.",Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Benutze die Identitätskarte. um in das Kraftwerk zu gelangen. Du solltest den Abstellraum beim Lagerhaus mal inspizieren.,,,Destruye el cristal de poder que impulsa la red eléctrica que alimenta los escudos de La Orden. Usa la identificación para entrar a la central eléctrica. Quizás quieras revisar el cuarto de almacenamiento encima de Worner.,,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Käytä henkilötunnistetta päästäksesi voimalaitokselle. Saatat haluta vilkaista varastohuonetta Wornerin yläpuolella.",Détruis le cristal qui alimente la grille énergétique des boucliers de l'Ordre. Utilise la carte d'identité pour entrer dans la centrale. Il faudrait que tu aille voir la salle de stockage au dessus de Worner.,"Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Használd az igazolványt, hogy bejuss az erőműbe. Jobban jársz, ha benézel a Worner fölötti tárolószobába.",Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Usa il tesserino d'identificazione per entrare nella centrale energetica. Ti conviene controllare il deposito che si trova sopra Worner.,"送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止める。 +Destroy the power crystal that runs the power grid which drives the Order's shields. Use the I.D. to get into the power station. You may want to check out the storeroom above Worner.,TXT_ILOG1012,MAP04: After talking to Worner.,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Použij získanou legitimaci pro přístup do elektrárny. Možná by stálo za to podívat se do skladištní místnosti nad Wornerem.","Ødelæg energikrystallen, der driver det kraftnet, som driver Ordenens skjolde. Brug identifikationskortet til at komme ind i kraftværket. Du kan tjekke lagerrummet over Worner.",Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Benutze die Identitätskarte. um in das Kraftwerk zu gelangen. Du solltest den Abstellraum beim Lagerhaus mal inspizieren.,,,Destruye el cristal de poder que impulsa la red eléctrica que alimenta los escudos de La Orden. Usa la identificación para entrar a la central eléctrica. Quizás quieras revisar el cuarto de almacenamiento encima de Worner.,,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Käytä henkilötunnistetta päästäksesi voimalaitokselle. Saatat haluta vilkaista varastohuonetta Wornerin yläpuolella.",Détruis le cristal qui alimente la grille énergétique des boucliers de l'Ordre. Utilise la carte d'identité pour entrer dans la centrale. Il faudrait que tu aille voir la salle de stockage au dessus de Worner.,,"Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Használd az igazolványt, hogy bejuss az erőműbe. Jobban jársz, ha benézel a Worner fölötti tárolószobába.",Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Usa il tesserino d'identificazione per entrare nella centrale energetica. Ti conviene controllare il deposito che si trova sopra Worner.,"送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止める。 手に入れたI.D.を使って発電所に入る。 ワーナーの言う上階の部屋も余裕があったら調べる。",오더의 방어막을 유지하는 동력 망의 전력원인 수정체를 파괴하자. 신분증을 이용해서 발전소 안으로 들어가. 그리고 워너 위에 창고도 확인하는 거 잊지 마!,Vernietig het energiekristal dat het elektriciteitsnet dat de schilden van de Orde aandrijft. Gebruik de I.D. om in de centrale te komen. Je kunt het magazijn boven Worner bekijken.,Ødelegg kraftkrystallen som driver kraftnettet som driver Ordenens skjold. Bruk I.D. for å komme inn i kraftstasjonen. Det kan være lurt å sjekke ut lagerrommet over Worner.,"Zniszcz kryształ mocy, który zasila sieć energetyczną napędzającą tarcze Zakonu. Użyj I.D., aby dostać się do elektrowni. Możesz chcieć sprawdzić magazyn nad Wornerem.",Destrua o cristal de energia que alimenta a rede elétrica por trás dos escudos da Ordem. Use a identificação para infiltrar a usina de energia. Você pode querer dar uma olhada no depósito acima do Worner.,,Distruge critalul energetic care alimentează scuturile Ordinului. Folosește cardul pentru a intra în stația de alimentare. Ai putea verifica și depozitul de deasupra lui Worner.,"Уничтожь кристалл, питающий энергосеть, от которой работают щиты Ордена. Пройди на электростанцию по удостоверению. Возможно, ты захочешь проверить склад на втором этаже, о котором говорил Уорнэр.",,Förstör kraftkristallen som driver kraftnätet som driver Ordens sköldar. Använd ID-kortet för att ta dig in i kraftstationen. Du kanske vill kolla in förrådet ovanför Worner.,Tarikat'ın kalkanlarını çalıştıran güç şebekesini çalıştıran güç kristalini yok edin. Güç istasyonuna girmek için kimliği kullanın. Worner'ın üstündeki depoyu kontrol etmek isteyebilirsiniz. -Destroy the power crystal that runs the power grid which drives the Order's shields. Go talk to Ketrick in the core area.,TXT_ILOG1013,"MAP04: After talking to ""Mr. Crispy"".",,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi za Ketrickem u jádra.","Ødelæg kraftkrystallen, der driver det kraftnet, som driver Ordenens skjolde. Gå hen og tal med Ketrick i kerneområdet.","Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Suche Worner auf, einen Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben. Vergiß nicht, den Sanitäter und den Waffentrainer aufzusuchen, bevor du gehst.",,,Destruye el cristal de poder que impulsa la red eléctrica que alimenta los escudos de La Orden. Habla con Ketrick en el área del núcleo.,,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Puhu Ketrickin kanssa reaktorisydämen alueella.",Détruis le cristal qui alimente la grille énergétique des boucliers de l'Ordre. Va parler à Ketrick dans la zone du cœur.,"Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Megleled Ketricket a mag térségben.",Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Vai a parlare con Ketrick nell'area del nucleo.,"送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止める。 +Destroy the power crystal that runs the power grid which drives the Order's shields. Go talk to Ketrick in the core area.,TXT_ILOG1013,"MAP04: After talking to ""Mr. Crispy"".",,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi za Ketrickem u jádra.","Ødelæg kraftkrystallen, der driver det kraftnet, som driver Ordenens skjolde. Gå hen og tal med Ketrick i kerneområdet.","Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Suche Worner auf, einen Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben. Vergiß nicht, den Sanitäter und den Waffentrainer aufzusuchen, bevor du gehst.",,,Destruye el cristal de poder que impulsa la red eléctrica que alimenta los escudos de La Orden. Habla con Ketrick en el área del núcleo.,,"Tuhoa kaupungin sähköverkon voimanlähteenä toimiva voimakristalli, jonka voimaa Veljeskunnan kilvet käyttävät. Puhu Ketrickin kanssa reaktorisydämen alueella.",Détruis le cristal qui alimente la grille énergétique des boucliers de l'Ordre. Va parler à Ketrick dans la zone du cœur.,,"Semmisítsd meg az erő kristályt, ami a Rend külső védőpajzsát hajtja az elektromos hálózaton keresztül. Megleled Ketricket a mag térségben.",Distruggi il cristallo che fornisce energia agli scudi dell'Ordine. Vai a parlare con Ketrick nell'area del nucleo.,"送電網を動かしているパワークリスタルを破壊してオーダーのシールドを止める。 コアエリアでケトリックと話す。",오더의 방어막을 유지하는 동력 망의 전력원인 수정체를 파괴하자. 중심부에 있는 케트릭과 대화해.,Vernietig het energiekristal dat het elektriciteitsnet dat de schilden van de Orde aandrijft. Ga in het kerngebied met Ketrick praten.,Ødelegg kraftkrystallen som driver kraftnettet som driver Ordenens skjold. Snakk med Ketrick i kjerneområdet.,"Zniszcz kryształ mocy, który uruchamia sieć energetyczną napędzającą tarcze Zakonu. Idź porozmawiać z Ketrickiem w obszarze rdzenia.",Destrua o cristal de energia que alimenta a rede elétrica por trás dos escudos da Ordem. Fale com o Ketrick na área do núcleo.,,Distruge cristalul de energie care alimentează scuturile Ordinului. Vorbește cu Ketrick în zona nucleului.,"Уничтожь кристалл, питающий энергосеть Ордена и их щиты. Поговори с Кетриком возле реактора.",,Förstör kraftkristallen som driver kraftnätet som driver ordens sköldar. Gå och prata med Ketrick i kärnområdet.,Tarikat'ın kalkanlarını çalıştıran güç şebekesini çalıştıran güç kristalini yok edin. Çekirdek alanda Ketrick ile konuş. -"Destroy the power crystal. Go talk to Ketrick, bring the walkway up using the switches, then use this id for the elevator.",TXT_ILOG1014,MAP04: After talking to Sammis.,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi si promluvit s Ketrickem, vyzvedni schodiště pomocí tlačítek a pak ve výtahu použij tuhle kartu.","Ødelæg kraftkrystallen. Gå hen og tal med Ketrick, bring gangbroen op ved hjælp af kontakterne, og brug derefter dette id til elevatoren.",Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Gehe zu Ketrick im Reaktorkern.,,,"Destruye el cristal de poder. Habla con Ketrick, alza la pasarela usando los interruptores, luego usa esta identificación para el ascensor.",,Tuhoa voimakristalli. Mene puhumaan Ketrickin kanssa. Tuo kulkusilta vivuilla ylös ja sitten käytä tätä tunnistetta hissiin.,"Détruis le cristal. Va parler à Ketrick. Fais monter la coursive en utilisant les boutons, puis utilise ta carte d'identité pour accéder à l'ascenseur.","Semmisítsd meg az erő kristályt. Menj és beszélj Kedrickkel, a kapcsolóval emeld meg a hidat, aztán használd az igazolványt a lifthez.","Distruggi il cristallo. Parla con Ketrick, fai alzare la passerella con i pulsanti, e poi usa questo tesserino per l'ascensore.","パワークリスタルを破壊してオーダーのシールドを止める。 +"Destroy the power crystal. Go talk to Ketrick, bring the walkway up using the switches, then use this id for the elevator.",TXT_ILOG1014,MAP04: After talking to Sammis.,,,"Znič energetický krystal, který napájí elektrickou síť, kterou jsou poháněné štíty Řádu. Jdi si promluvit s Ketrickem, vyzvedni schodiště pomocí tlačítek a pak ve výtahu použij tuhle kartu.","Ødelæg kraftkrystallen. Gå hen og tal med Ketrick, bring gangbroen op ved hjælp af kontakterne, og brug derefter dette id til elevatoren.",Zerstöre den Energiekristall der die Energieversorgung für die Kraftschilde kontrolliert. Gehe zu Ketrick im Reaktorkern.,,,"Destruye el cristal de poder. Habla con Ketrick, alza la pasarela usando los interruptores, luego usa esta identificación para el ascensor.",,Tuhoa voimakristalli. Mene puhumaan Ketrickin kanssa. Tuo kulkusilta vivuilla ylös ja sitten käytä tätä tunnistetta hissiin.,"Détruis le cristal. Va parler à Ketrick. Fais monter la coursive en utilisant les boutons, puis utilise ta carte d'identité pour accéder à l'ascenseur.",,"Semmisítsd meg az erő kristályt. Menj és beszélj Kedrickkel, a kapcsolóval emeld meg a hidat, aztán használd az igazolványt a lifthez.","Distruggi il cristallo. Parla con Ketrick, fai alzare la passerella con i pulsanti, e poi usa questo tesserino per l'ascensore.","パワークリスタルを破壊してオーダーのシールドを止める。 ケトリックと話し、スイッチを動かし通路を上げ、エレベーターにIDを使う。",수정체를 파괴해. 케트릭과 대화하고 나서 스위치를 눌러서 진입로를 작동시켜. 그리고 이 신분증을 이용해서 승강기를 올라타.,"Vernietig het energiekristal. Ga met Ketrick praten, breng de gang naar boven met behulp van de schakelaars, gebruik dan deze id voor de lift.","Ødelegg kraftkrystallen. Snakk med Ketrick, få gangbroen opp ved hjelp av bryterne, og bruk denne id-en til heisen.","Zniszcz kryształ mocy. Idź porozmawiać z Ketrickiem, podnieś chodnik używając przełączników, a następnie użyj tego id do windy.","Destrua o cristal de energia. Fale com o Ketrick, faça a passarela subir usando os interruptores e depois use esta identificação para o elevador.",,"Distruge cristalul energetic. Vorbește cu Ketrick, redă pasarela folosind butoanele, apoi folosește cardul pentru lift.","Уничтожь кристалл. Поговори с Кетриком, пройди наверх с помощью переключателей, затем используй удостоверение для доступа к лифту.",,"Förstör kraftkristallen. Gå och prata med Ketrick, ta upp gångvägen med hjälp av brytarna och använd sedan denna id för hissen.","Güç kristalini yok et. Ketrick ile konuşun, anahtarları kullanarak geçidi yukarı getirin, sonra asansör için bu kimliği kullanın." -Find the town entrance that the Order has guarded. Open the door and bring the guard's uniform back to Weran.,TXT_ILOG1015,,,,"Najdi vchod do města, který Řád hlídá. Otevři dveře a přines hlídačovu uniformu Weranovi.","Find byens indgang, som Ordenen har bevogtet. Åbn døren og bring vagtens uniform tilbage til Weran.","Finde den Ausgang zur Stadt, der vom Orden bewacht wird. Öffne dir Tür und bringe die Uniform des Wächters zu Weran.",,,Encuentra la entrada al pueblo que La Orden tiene guardada. Abre la puerta y tráele de vuelta a Weran el uniforme del guardia.,,Löydä Veljeskunnan vartioima kaupungin sisäänkäynti. Avaa ovi ja tuo vartijan univormu Weranille.,Trouve l'entrée de la ville que L'Ordre garde fermée. Ouvre-la et amène l'uniforme du garde à Weran.,"Keresd meg a város bejáratot, amit a Rend őrzött. Nyisd ki az ajtót, és vidd vissza az uniformist Weranhoz.",Trova l'entrata verso la città che l'Ordine ha chiuso. Apri l'ingresso e riporta l'uniforme della guardia a Weran.,"オーダーが封鎖している町への入り口を見つける。 +Find the town entrance that the Order has guarded. Open the door and bring the guard's uniform back to Weran.,TXT_ILOG1015,,,,"Najdi vchod do města, který Řád hlídá. Otevři dveře a přines hlídačovu uniformu Weranovi.","Find byens indgang, som Ordenen har bevogtet. Åbn døren og bring vagtens uniform tilbage til Weran.","Finde den Ausgang zur Stadt, der vom Orden bewacht wird. Öffne dir Tür und bringe die Uniform des Wächters zu Weran.",,,Encuentra la entrada al pueblo que La Orden tiene guardada. Abre la puerta y tráele de vuelta a Weran el uniforme del guardia.,,Löydä Veljeskunnan vartioima kaupungin sisäänkäynti. Avaa ovi ja tuo vartijan univormu Weranille.,Trouve l'entrée de la ville que L'Ordre garde fermée. Ouvre-la et amène l'uniforme du garde à Weran.,,"Keresd meg a város bejáratot, amit a Rend őrzött. Nyisd ki az ajtót, és vidd vissza az uniformist Weranhoz.",Trova l'entrata verso la città che l'Ordine ha chiuso. Apri l'ingresso e riporta l'uniforme della guardia a Weran.,"オーダーが封鎖している町への入り口を見つける。 ドアを開け、ガードの制服をウェランに持って帰る。",오더의 경비가 지키고 있는 마을의 입구를 찾아. 문을 연 뒤 그 경비의 전투복을 챙겨서 워렌에게 전해줘.,Zoek de stadstoegang die de Orde heeft bewaakt. Open de deur en breng het uniform van de bewaker terug naar Weran.,Finn inngangen til byen som Ordenen har bevoktet. Åpne døren og ta med vaktens uniform tilbake til Weran.,"Znajdź wejście do miasta, którego pilnuje Zakon. Otwórz drzwi i przynieś Weranowi mundur strażnika.",Encontre a entrada da cidade que a Ordem está vigiando. Abra a porta e leve o uniforme do guarda de volta para o Weran.,,Găsește intrarea orașului pe care Ordinul a păzit-o. Deschide ușa și du uniforma paznicului la Weran.,"Найди выход в город, охраняемый Орденом. Открой дверь и принеси униформу стражника Уэрану.",,Hitta stadens ingång som ordern har bevakat. Öppna dörren och ta med dig vaktuniformen tillbaka till Weran.,Tarikatın koruduğu kasaba girişini bulun. Kapıyı açın ve muhafız üniformasını Weran'a geri getirin. -"Take the flamethrower parts to Irale. Find the sewer maintenance door. Find and drain the reclamation tank inside the castle. At the bottom is a hidden entrance to the sewers. Down that entrance is where the gate controls are, somewhere.",TXT_ILOG1016,,,,Přines součásti plamenometu k Iralemu. Najdi kanálové údržbové dveře. Najdi a vypusť vodní nádrž uvnitř hradu. Na dně je skrytý vchod do dalších stok. Někde uvnitř je ovládání bran.,"Tag flammekasterens dele med til Irale. Find døren til vedligeholdelse af kloakken. Find og tøm genvindingstanken inde på slottet. I bunden er der en skjult indgang til kloakkerne. Nede ved denne indgang er der et sted, hvor kontrolelementerne til porten er.",Bringe dir Flammenwerferteile zu Irale. Finde die Wartungstür in der Kanalisation. Finde und leere den Sammeltank in der Burg. Am Boden ist ein versteckter Eingang zur Kanalisation. Dort ist die Steuerung für die Tore. Zerstöre sie.,,,"Llévale las partes de lanzallamas a Irale. Encuentra la puerta de mantenimiento de las alcantarillas. Encuentra y drena el tanque de reclamación dentro del castillo. Al fondo hay una entrada oculta a las alcantarillas. Bajando por esa entrada es donde se encuentran los controles de la puerta, en algún lugar.","Llévale las partes del lanzallamas a Irale. Encuentra la puerta de mantenimiento de la alcantarilla. Encuentra y drena el tanque de recuperación adentro del castillo. En el fondo de esa entrada están los controles de las puertas, en algún lugar.","Toimita liekinheittimen osat Iralelle. Etsi viemärin huolto-ovi. Etsi ja tyhjennä nesteentalteenottoallas linnan sisällä. Sen pohjalla on viemärin salainen sisäänkäynti, jonka sisältä portin ohjaimet jostakin löytyvät.",Amène les pièces du lance-flamme à Irale. Trouve l'entrée de maintenance des égouts. Fais vider le réservoir de recyclage du château. Au fond se trouve une entrée cachée vers les égouts. Les contrôles de la porte s'y trouvent.,Vidd a lángszóró darabokat Iralehez. Keresd meg a kanális szervíz ajtaját. Keresd meg a lefolyót és szárító tartályt a kastélyban. Az alján található egy titkos bejárat a kanálishoz. Túl ezen a bejáraton fogod megtalálni a kapu irányítópultot.,"Porta i pezzi del lanciafiamme da Irale. Trova l'entrata di manutenzione per le fogne. Svuota la vasca di recupero fluidi. Nel fondo c'è un'entrata nascosta per le fogne. I controlli dei cancelli sono laggiù, da qualche parte.","火炎放射器の部品をイラールに持っていく。 +"Take the flamethrower parts to Irale. Find the sewer maintenance door. Find and drain the reclamation tank inside the castle. At the bottom is a hidden entrance to the sewers. Down that entrance is where the gate controls are, somewhere.",TXT_ILOG1016,,,,Přines součásti plamenometu k Iralemu. Najdi kanálové údržbové dveře. Najdi a vypusť vodní nádrž uvnitř hradu. Na dně je skrytý vchod do dalších stok. Někde uvnitř je ovládání bran.,"Tag flammekasterens dele med til Irale. Find døren til vedligeholdelse af kloakken. Find og tøm genvindingstanken inde på slottet. I bunden er der en skjult indgang til kloakkerne. Nede ved denne indgang er der et sted, hvor kontrolelementerne til porten er.",Bringe dir Flammenwerferteile zu Irale. Finde die Wartungstür in der Kanalisation. Finde und leere den Sammeltank in der Burg. Am Boden ist ein versteckter Eingang zur Kanalisation. Dort ist die Steuerung für die Tore. Zerstöre sie.,,,"Llévale las partes de lanzallamas a Irale. Encuentra la puerta de mantenimiento de las alcantarillas. Encuentra y drena el tanque de reclamación dentro del castillo. Al fondo hay una entrada oculta a las alcantarillas. Bajando por esa entrada es donde se encuentran los controles de la puerta, en algún lugar.","Llévale las partes del lanzallamas a Irale. Encuentra la puerta de mantenimiento de la alcantarilla. Encuentra y drena el tanque de recuperación adentro del castillo. En el fondo de esa entrada están los controles de las puertas, en algún lugar.","Toimita liekinheittimen osat Iralelle. Etsi viemärin huolto-ovi. Etsi ja tyhjennä nesteentalteenottoallas linnan sisällä. Sen pohjalla on viemärin salainen sisäänkäynti, jonka sisältä portin ohjaimet jostakin löytyvät.",Amène les pièces du lance-flamme à Irale. Trouve l'entrée de maintenance des égouts. Fais vider le réservoir de recyclage du château. Au fond se trouve une entrée cachée vers les égouts. Les contrôles de la porte s'y trouvent.,,Vidd a lángszóró darabokat Iralehez. Keresd meg a kanális szervíz ajtaját. Keresd meg a lefolyót és szárító tartályt a kastélyban. Az alján található egy titkos bejárat a kanálishoz. Túl ezen a bejáraton fogod megtalálni a kapu irányítópultot.,"Porta i pezzi del lanciafiamme da Irale. Trova l'entrata di manutenzione per le fogne. Svuota la vasca di recupero fluidi. Nel fondo c'è un'entrata nascosta per le fogne. I controlli dei cancelli sono laggiù, da qualche parte.","火炎放射器の部品をイラールに持っていく。 下水道のメンテナンス室を見つけ、 城内の貯水タンクを見つけて排水。 その下には下水道への隠された入り口があり、その奥にゲートコントロールがある。","이 화염방사기 부품을 들고 이롤리에게 가져가. 하수도 정비소로 향하는 문을 찾은 뒤, 성안에 있는 수조를 찾고 내용물을 배출해. 그 밑에는 하수도로 향하는 숨겨진 통로가 있어. 그 안에는 분명히 성문 관리 장치가 있을 거야.","Neem de vlammenwerper delen naar Irale. Zoek de deur voor het rioolonderhoud. Zoek en laat de inpolderingstank in het kasteel leeglopen. Onderin is een verborgen ingang naar de riolering. Onderaan die ingang is waar de poortbediening is, ergens.","Ta flammekasterdelene til Irale. Finn vedlikeholdsdøren til kloakken. Finn og tøm gjenvinningstanken inne i slottet. Nederst er det en skjult inngang til kloakken. Ned den inngangen er hvor portkontrollene er, et eller annet sted.",Zabierz części miotacza ognia do Irale. Znajdź drzwi do konserwacji kanałów. Znajdź i osusz zbiornik rekultywacyjny wewnątrz zamku. Na dole jest ukryte wejście do kanałów. Na dole tego wejścia jest gdzieś sterowanie bramą.,Leve as peças do lança-chamas ao Irale. Ache a porta de manutenção do esgoto. Encontre e drene o tanque de recuperação dentro do castelo. No fundo há uma entrada oculta para o esgoto. Entre lá e encontre os controles do portão.,,"Du bucățiile aruncătorului de flăcări la Irale. Găsește ușa de mentenanță de la canale. Găsește și drenează rezervorul de recuperare din interiorul castelului. La fund e o intrare secretă către canale. Jos, se pot acționa porțiile, de undeva.",Отнеси детали огнемёта Ирэйлу. Найди дверь техобслуживания канализации. Найди бак для переработки и слей из него жидкость. На его дне находится потайной вход в стоки. Где-то за ним находится механизм управления воротами.,,Ta med dig flamethrowerdelarna till Irale. Hitta dörren till underhållet av kloakerna. Hitta och töm återvinningstanken inne i slottet. I botten finns en dold ingång till avloppen. Nere vid den ingången finns portkontrollerna någonstans.,Alev makinesi parçalarını İrale'ye götürün. Kanalizasyon bakım kapısını bulun. Kalenin içindeki ıslah tankını bulun ve boşaltın. En altta kanalizasyona giden gizli bir giriş var. O girişin aşağısında kapı kontrollerinin olduğu yer var. -Join the assault on the castle. Find and take out the Programmer. See the medic and the weapons trainer. Spend everything you've got. This is going to be a hell of a fight.,TXT_ILOG1017,MAP03: After destroying the gate controls and talking to Macil.,,,"Připoj se k útoku na hrad. Najdi a zabij Programátora. Zajdi si ke zdravotníkovi a učiteli střelby. Utrať vše, co máš. Tohle bude tvrdý boj.","Deltag i angrebet på slottet. Find og dræb programmøren. Se lægen og våbentræneren. Brug alt, hvad du har. Dette bliver en helvedes kamp.","Schließe dich dem Angriff auf die Burg an. Finde den Programmierer und schalte ihn aus. Suche den Sanitäter und den Waffentrainer auf. Kaufe was immer du kannst, das wird ein höllischer Kampf.",,,Únete al asalto en el castillo. Encuentra y elimina al Programador. Ve a ver al médico y entrenador de armas. Gasta todo lo que tengas. Esto va a ser una batalla tremenda.,Únete al asalto en el castillo. Encuentra y elimina al Programador. Ve al médico y al entrenador de armas. Gasta todo lo que tengas. Esta será una tremenda batalla.,Osallistu hyökkäykseen linnaa vastaan. Etsi ja kukista Ohjelmoitsija. Tapaa lääkintämiestä ja asekouluttajaa. Käytä kaikki varasi; tästä tulee hitonmoinen taistelu.,"Rejoins l'assaut sur le château. Trouve et tue le Programmeur. Va voir le médecin et le maître d'armes. Dépense tout ce que tu as, ça va être un sacré bain de sang!",Csatlakozz a kastély ostromához. Keresd meg és iktasd ki a Programozót. Menj a szanitéchoz és a fegyver kiképzőhöz. Költs el mindent amit csak tudsz. Gigászi csata előtt állunk.,"Unisciti all'assalto sul castello. Trova e fai fuori il Programmatore. Passa dal medico e dall'addestratore di armi. Ti conviene spendere più che puoi, sarà una dura battaglia.","城内への突撃部隊に加入し、プログラマーを探す。 +Join the assault on the castle. Find and take out the Programmer. See the medic and the weapons trainer. Spend everything you've got. This is going to be a hell of a fight.,TXT_ILOG1017,MAP03: After destroying the gate controls and talking to Macil.,,,"Připoj se k útoku na hrad. Najdi a zabij Programátora. Zajdi si ke zdravotníkovi a učiteli střelby. Utrať vše, co máš. Tohle bude tvrdý boj.","Deltag i angrebet på slottet. Find og dræb programmøren. Se lægen og våbentræneren. Brug alt, hvad du har. Dette bliver en helvedes kamp.","Schließe dich dem Angriff auf die Burg an. Finde den Programmierer und schalte ihn aus. Suche den Sanitäter und den Waffentrainer auf. Kaufe was immer du kannst, das wird ein höllischer Kampf.",,,Únete al asalto en el castillo. Encuentra y elimina al Programador. Ve a ver al médico y entrenador de armas. Gasta todo lo que tengas. Esto va a ser una batalla tremenda.,Únete al asalto en el castillo. Encuentra y elimina al Programador. Ve al médico y al entrenador de armas. Gasta todo lo que tengas. Esta será una tremenda batalla.,Osallistu hyökkäykseen linnaa vastaan. Etsi ja kukista Ohjelmoitsija. Tapaa lääkintämiestä ja asekouluttajaa. Käytä kaikki varasi; tästä tulee hitonmoinen taistelu.,"Rejoins l'assaut sur le château. Trouve et tue le Programmeur. Va voir le médecin et le maître d'armes. Dépense tout ce que tu as, ça va être un sacré bain de sang!",,Csatlakozz a kastély ostromához. Keresd meg és iktasd ki a Programozót. Menj a szanitéchoz és a fegyver kiképzőhöz. Költs el mindent amit csak tudsz. Gigászi csata előtt állunk.,"Unisciti all'assalto sul castello. Trova e fai fuori il Programmatore. Passa dal medico e dall'addestratore di armi. Ti conviene spendere più che puoi, sarà una dura battaglia.","城内への突撃部隊に加入し、プログラマーを探す。 メディックと武器トレーナーに会っておく。 この戦いは激しいものになるだろう、使えるものは全て使うつもりで行け。",성을 공략할 공성전에 참여해. 침투해서 프로그래머를 죽일 수 있게. 의무관이랑 무기 담당관을 만나고 네가 살 수 있는 걸 충분히 사. 왜냐하면 이 교전은 끔찍할 테니까.,Doe mee aan de aanval op het kasteel. Zoek en haal de Programmeur eruit. Zie de dokter en de wapentrainer. Geef alles uit wat je hebt. Dit wordt een hels gevecht.,Bli med i angrepet på slottet. Finn og drep programmereren. Gå til legen og våpentreneren. Bruk alt du har. Dette kommer til å bli litt av en kamp.,"Dołącz do szturmu na zamek. Znajdź i zlikwiduj Programistę. Zobacz medyka i trenera broni. Wydaj wszystko, co masz. To będzie piekielnie trudna walka.",Junte-se ao ataque no castelo. Ache e elimine o Programador. Visite o médico e o treinador de armas. Gaste tudo o que você tem. Essa vai ser uma briga das grandes.,,Alătură-te asaltului asupra castelului. Vezi medicul și antrenorul de arme. Cheltuie tot ce ai. O să fie o luptă pe cnste.,Присоединись к атаке на замок. Найди и убей Программиста. Посети медика и инструктора по стрельбе. Не жалей золота: битва будет чертовски жаркой.,,Gå med i anfallet mot slottet. Hitta och ta ut programmeraren. Se till sjukvårdaren och vapentränaren. Spendera allt du har. Det här kommer att bli en jäkla kamp.,Kaleye yapılan saldırıya katıl. Programcıyı bul ve etkisiz hale getir. Sıhhiyeciyi ve silah eğitmenini gör. Elinizdeki her şeyi harcayın. Bu cehennem gibi bir savaş olacak. -Use the key the false Programmer gave you to open an entrance to the Programmer's keep. It has to be where he's hiding. Find the Programmer and kill him.,TXT_ILOG1018,,,,Použij klíč od falešného Programátora pro otevření vchodu do Programátorova doupěte. Tam se musí nacházet. Najdi Programátora a zabij ho.,"Brug den nøgle, som den falske programmør gav dig, til at åbne en indgang til programmørens tårn. Det må være der, hvor han gemmer sig. Find programmøren og dræb ham.","Benutze den Schlüssel des falschen Programmierers um in die Unterkunft des Programmierers einzudringen. Das ist der Ort, wo er sich verstecken dürfte. Finde und töte ihn.",,,Usa la llave que el falso Programador te dió para abrir una entrada a la guarida del Programador. Tiene que ser ahí donde se oculta. Encuentra al Programador y mátalo.,Usa la llave que el falso Programador te dió para abrir la entrada a la güarida del Programador. Debe ser donde está escondido. Encuentra al Programador y mátalo.,Käytä Valeohjelmoitsijan antamaa avainta avataksesi sisäänkäynnin Ohjelmoitsijan linnakkeeseen. Siellä hän varmastikin piilottelee. Etsi Ohjelmoitsija ja tapa hänet.,Utilise la clé que le faux Programmeur t'a donné pour entrer dans le donjon du Programmeur. Il doit s'y cacher. Trouve-le et tues-le.,"Használd az ál-programozótól kapott kulcsot, hogy bejuss a Programozó tornyába. Minden bizonnyal ott bújkál. Keresd meg a Programozót, és öld meg.",Usa la chiave che il falso Programmatore ti ha dato per entrare nella fortezza del Programmatore. Deve essere là che si nasconde. Trova il Programmatore e uccidilo.,"偽プログラマーから貰ったキーを使って本物がいるはずの砦を開く。 +Use the key the false Programmer gave you to open an entrance to the Programmer's keep. It has to be where he's hiding. Find the Programmer and kill him.,TXT_ILOG1018,,,,Použij klíč od falešného Programátora pro otevření vchodu do Programátorova doupěte. Tam se musí nacházet. Najdi Programátora a zabij ho.,"Brug den nøgle, som den falske programmør gav dig, til at åbne en indgang til programmørens tårn. Det må være der, hvor han gemmer sig. Find programmøren og dræb ham.","Benutze den Schlüssel des falschen Programmierers um in die Unterkunft des Programmierers einzudringen. Das ist der Ort, wo er sich verstecken dürfte. Finde und töte ihn.",,,Usa la llave que el falso Programador te dió para abrir una entrada a la guarida del Programador. Tiene que ser ahí donde se oculta. Encuentra al Programador y mátalo.,Usa la llave que el falso Programador te dió para abrir la entrada a la güarida del Programador. Debe ser donde está escondido. Encuentra al Programador y mátalo.,Käytä Valeohjelmoitsijan antamaa avainta avataksesi sisäänkäynnin Ohjelmoitsijan linnakkeeseen. Siellä hän varmastikin piilottelee. Etsi Ohjelmoitsija ja tapa hänet.,Utilise la clé que le faux Programmeur t'a donné pour entrer dans le donjon du Programmeur. Il doit s'y cacher. Trouve-le et tues-le.,,"Használd az ál-programozótól kapott kulcsot, hogy bejuss a Programozó tornyába. Minden bizonnyal ott bújkál. Keresd meg a Programozót, és öld meg.",Usa la chiave che il falso Programmatore ti ha dato per entrare nella fortezza del Programmatore. Deve essere là che si nasconde. Trova il Programmatore e uccidilo.,"偽プログラマーから貰ったキーを使って本物がいるはずの砦を開く。 奴はそこに隠れなければならないはず。プログラマーを見つけて殺す。","프로그래머 더미가 준 열쇠를 이용해서 프로그래머의 거주지로 향하는 문을 열어. 안에는 분명히 그가 있을 거야. 프로그래머를 찾으면, 일이 더 나빠지기 전에 죽여.",Gebruik de sleutel die de valse Programmer je gaf om een ingang te openen naar de wacht van de Programmeur. Het moet zijn waar hij zich verbergt. Zoek de Programmeur en vermoord hem.,Bruk nøkkelen den falske programmereren ga deg til å åpne en inngang til programmererens borg. Det må være der han gjemmer seg. Finn programmereren og drep ham.,"Użyj klucza, który dał ci fałszywy Programista, aby otworzyć wejście do kryjówki Programisty. To musi być miejsce, gdzie on się ukrywa. Znajdź Programistę i zabij go.",Use a chave que o falso Programador te deu para abrir uma entrada à fortaleza do Programador. Tem que ser onde ele está escondido. Encontre o Programador e mate-o.,,Folosește cheia pe care Programator fals ți-a dat-o pentru a deschide intrarea către curtea Programatorului. Trebuie să fie locul în care se ascunde. Găsește Programatorul și ucide-l.,"Используй ключ, полученный от фальшивого Программиста, чтобы открыть вход в цитадель. Скорее всего, именно там прячется настоящий Программист. Найди и убей его.",,Använd nyckeln som den falska programmeraren gav dig för att öppna en ingång till programmerarens borg. Det måste vara där han gömmer sig. Hitta Programmeraren och döda honom.,Sahte Programcı'nın size verdiği anahtarı kullanarak Programcı'nın kalesine bir giriş açın. Saklandığı yer orası olmalı. Programcıyı bul ve öldür. -Seek out the Oracle and ask it about the other Sigil pieces. Take your reward and go across to the medic and weapons trainer for health and training.,TXT_ILOG1019,MAP10: After killing the Programmer and talking to Macil.,,,Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Převezmi si svou odměnu a navštiv zdravotníka a učitele střelby pro zdraví a výcvik.,Opsøg Oraklet og spørg det om de andre Sigil stykker. Tag din belønning og gå over til lægen og våbentræneren for at få sundhed og træning.,Suche das Orakel auf und frage es nach den anderen Sigil-Teilen. Nimm deine Belohnung und suche den Sanitäter und den Waffentrainer auf.,,,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Ve al médico y al entrenador de armas para salud y entrenamiento.,,Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Vastaanota palkkiosi ja käy lääkintämiehen ja asekouluttajan luona terveydenhoitoa ja koulutusta varten.,"Trouve l'Oracle et demande lui où se trouve les autres pièces du Sigil. Récupère ta récompense, et va voir le médecin et le maître d'armes pour te soigner et t'entraîner.","Kutasd fel az Orákulumot, és érdeklődj a Pecsét további darabjairól. Zsebeld be a jutalmad, és költsd is el szépen a szanitécnál és a fegyvermesternél.",Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Prendi la tua ricompensa e visita il dottore e l'addestratore di armi.,"オラクルに会いシジルの欠片について尋ねる。 +Seek out the Oracle and ask it about the other Sigil pieces. Take your reward and go across to the medic and weapons trainer for health and training.,TXT_ILOG1019,MAP10: After killing the Programmer and talking to Macil.,,,Najdi Věštce a zeptej se ho na ostatní díly Pečetě. Převezmi si svou odměnu a navštiv zdravotníka a učitele střelby pro zdraví a výcvik.,Opsøg Oraklet og spørg det om de andre Sigil stykker. Tag din belønning og gå over til lægen og våbentræneren for at få sundhed og træning.,Suche das Orakel auf und frage es nach den anderen Sigil-Teilen. Nimm deine Belohnung und suche den Sanitäter und den Waffentrainer auf.,,,Busca al Oráculo y pregúntale sobre las otras piezas del Emblema. Ve al médico y al entrenador de armas para salud y entrenamiento.,,Etsi Oraakkeli ja kysy häneltä muista Sinetin osista. Vastaanota palkkiosi ja käy lääkintämiehen ja asekouluttajan luona terveydenhoitoa ja koulutusta varten.,"Trouve l'Oracle et demande lui où se trouve les autres pièces du Sigil. Récupère ta récompense, et va voir le médecin et le maître d'armes pour te soigner et t'entraîner.",,"Kutasd fel az Orákulumot, és érdeklődj a Pecsét további darabjairól. Zsebeld be a jutalmad, és költsd is el szépen a szanitécnál és a fegyvermesternél.",Raggiungi l'Oracolo e chiedigli degli altri pezzi del Sigillo. Prendi la tua ricompensa e visita il dottore e l'addestratore di armi.,"オラクルに会いシジルの欠片について尋ねる。 強化のためメディックと武器トレーナーに会っておく。",오라클을 찾아서 다른 시질 조각이 어디에 있는지 물어봐. 보상을 받고 치료와 훈련을 위해 의무관과 무기 담당관에게로 가.,Zoek het Orakel op en vraag het over de andere Sigil stukken. Pak je beloning en ga naar de dokter en wapentrainer voor gezondheid en training.,Oppsøk oraklet og spør det om de andre sigil-brikke. Ta belønningen din og gå over til medisineren og våpentreneren for helse og trening.,Poszukaj Wyroczni i zapytaj ją o pozostałe kawałki Sigila. Odbierz nagrodę i przejdź do medyka i trenera broni po zdrowie i trening.,Procure o Oráculo e pergunte o sobre as outras peças do Sigilo. Pegue a sua recompensa e visite o médico e o treinador de armas para recuperar saúde e receber treinamento.,,Caută Oracolul și întreabă de celelalte piese de Sigiliu. Ia-ți recompensa și du-te la medic și antrenorul de arme.,Найди Оракула и спроси у него про другие фрагменты Печати. Возьми свою награду и посети медика и инструктора по стрельбе.,,Sök upp Oraklet och fråga det om de andra Sigilbitarna. Ta din belöning och gå över till läkaren och vapentränaren för hälsa och träning.,Kahin'i bulun ve ona diğer Sigil parçalarını sorun. Ödülünüzü alın ve sağlık ve eğitim için sıhhiyeciye ve silah eğitmenine gidin. -"The second piece lies at the heart of the crimson and obsidian tower. There you must find the Bishop, who awaits you. Take the Oracle's token to the key master in the borderlands. Once you have destroyed the Bishop, return to the Oracle.",TXT_ILOG1020,,,,"Druhý díl leží v srdci věže karmíno-obsidiánové. Tam musíš najít Biskupa, který tě očekává. Vezmi Věštcův pas ke klíčníkovi v pohraničí. Až zabiješ Biskupa, vrať se k Věštci.","Den anden brik ligger i hjertet af det purpurfarvede og obsidianske tårn. Der skal du finde biskoppen, som venter på dig. Tag Oraklets token til nøglemesteren i grænselandet. Når du har udslettet biskoppen, skal du vende tilbage til Oraklet.","Das zweite Teilstück befindet sich im Turm aus Purpur und Obsidian. Dort musst du den Bischof finden, der dich erwartet. Bringe das Symbol des Orakels zum Schlüsselmeister in den Grenzgebieten. Wenn der Bischof ausgeschaltet ist, kehre zum Orakel zurück.",,,"La segunda pieza se encuentra en el corazón e la torre carmesí y obsidiana. Ahí debes encontrar al Obispo, quien espera por ti. Lleva el vale del Oráculo al amo de llaves en las fronteras. En cuanto hayas destruido al Obispo, regresa con el Oráculo.","La segunda pieza está en el corazón de la torre carmesí y obsidiana. Ahí deberás encontrar al Obispo, que te está esperando. Lleva el símbolo del Oráculo al Amo de Llaves en las fronteras. Cuando hayas destruido al Obispo, regresa con el Oráculo.","Toinen osanen piilee purppuranpunaisen laavalasisen tornin sydämessä. Sieltä sinun on löydettävä Piispa, joka odottaa sinua. Toimita Oraakkelin merkki avainmestarille rajaseudulla. Tuhottuasi Piispan palaa Oraakkelin luokse.","La deuxième pièce se trouve au cœur de la tour d'obsidienne et d'écarlate. Tu y trouveras l'évêque, qui t'attend. Amène le jeton de l'Oracle au maître des clés dans les terrains vagues. Quand tu as tué l'évêque, retourne voir l'Oracle.","A második darab a karmazsin és obszidián torony szívében található. Ott fogsz találkozni a már rád váró Püspökre. Vidd az Orákulum zálogát a peremvidéken élő kulcsmesterhez. Amint megölted a Püspököt, irány vissza az orákulumhoz.","Il secondo pezzo si trova nel cuore della torre cremisina e ossidiana. Lì troverai il Vescovo, che ti sta aspettando. Raggiungi il mastro delle chiavi nelle terre di confine. Quando hai distrutto il Vescovo, ritorna dall'Oracolo.","二つ目の欠片は深紅と黒曜石の塔の中心部にある。そこのビショップを討伐せよ。 +"The second piece lies at the heart of the crimson and obsidian tower. There you must find the Bishop, who awaits you. Take the Oracle's token to the key master in the borderlands. Once you have destroyed the Bishop, return to the Oracle.",TXT_ILOG1020,,,,"Druhý díl leží v srdci věže karmíno-obsidiánové. Tam musíš najít Biskupa, který tě očekává. Vezmi Věštcův pas ke klíčníkovi v pohraničí. Až zabiješ Biskupa, vrať se k Věštci.","Den anden brik ligger i hjertet af det purpurfarvede og obsidianske tårn. Der skal du finde biskoppen, som venter på dig. Tag Oraklets token til nøglemesteren i grænselandet. Når du har udslettet biskoppen, skal du vende tilbage til Oraklet.","Das zweite Teilstück befindet sich im Turm aus Purpur und Obsidian. Dort musst du den Bischof finden, der dich erwartet. Bringe das Symbol des Orakels zum Schlüsselmeister in den Grenzgebieten. Wenn der Bischof ausgeschaltet ist, kehre zum Orakel zurück.",,,"La segunda pieza se encuentra en el corazón e la torre carmesí y obsidiana. Ahí debes encontrar al Obispo, quien espera por ti. Lleva el vale del Oráculo al amo de llaves en las fronteras. En cuanto hayas destruido al Obispo, regresa con el Oráculo.","La segunda pieza está en el corazón de la torre carmesí y obsidiana. Ahí deberás encontrar al Obispo, que te está esperando. Lleva el símbolo del Oráculo al Amo de Llaves en las fronteras. Cuando hayas destruido al Obispo, regresa con el Oráculo.","Toinen osanen piilee purppuranpunaisen laavalasisen tornin sydämessä. Sieltä sinun on löydettävä Piispa, joka odottaa sinua. Toimita Oraakkelin merkki avainmestarille rajaseudulla. Tuhottuasi Piispan palaa Oraakkelin luokse.","La deuxième pièce se trouve au cœur de la tour d'obsidienne et d'écarlate. Tu y trouveras l'évêque, qui t'attend. Amène le jeton de l'Oracle au maître des clés dans les terrains vagues. Quand tu as tué l'évêque, retourne voir l'Oracle.",,"A második darab a karmazsin és obszidián torony szívében található. Ott fogsz találkozni a már rád váró Püspökre. Vidd az Orákulum zálogát a peremvidéken élő kulcsmesterhez. Amint megölted a Püspököt, irány vissza az orákulumhoz.","Il secondo pezzo si trova nel cuore della torre cremisina e ossidiana. Lì troverai il Vescovo, che ti sta aspettando. Raggiungi il mastro delle chiavi nelle terre di confine. Quando hai distrutto il Vescovo, ritorna dall'Oracolo.","二つ目の欠片は深紅と黒曜石の塔の中心部にある。そこのビショップを討伐せよ。 国境地帯のコモンズ側にいるキーマスターにオラクルのトークンを見せる。 ビショップを仕留めたらオラクルの元に戻る。","두 번째 시질 조각은 진홍빛 흑요석 탑에 숨어있는 비숍에게 있어. 거기에서 너를 기다리고 있는 비숍을 찾아내야만 해. 오라클의 통행증을 들고 접경지 안의 열쇠지기에게로 가봐. 비숍을 파괴했다면, 오라클에게 돌아가.","Het tweede stuk ligt in het hart van de karmozijnrode en obsidiaan toren. Daar moet je de bisschop vinden, die op je wacht. Breng de orakels naar de belangrijkste meester in de grensgebieden. Als je de bisschop hebt vernietigd, keer je terug naar het Orakel.","Den andre brikken ligger i hjertet av det purpurfargede og obsidianske tårnet. Der må du finne biskopen, som venter på deg. Ta orakelets symbol til nøkkelmesteren i grenselandene. Når du har tilintetgjort biskopen, gå tilbake til oraklet.","Drugi kawałek leży w sercu karmazynowej i obsydianowej wieży. Musisz tam odnaleźć biskupa, który czeka na Ciebie. Zabierz żeton wyroczni do mistrza kluczy na pograniczu. Po zniszczeniu Biskupa wróć do Wyroczni.","A segunda peça está no coração da torre carmesim e obsidiana. Lá você encontrará o Bispo, que está te aguardando. Leve o emblema do Oráculo para o mestre das chaves nas fronteiras. Após destruir o Bispo, volte ao Oráculo.",,A doua piesă e în inima turnului stăveziu din obsidian. Episcopul te va aștepta. Ia semnul Oracolului la stăpânul cheii în mărginime. După ce ai eliminat Episcopul întoarce-te la Oracol.,"Второй фрагмент лежит в сердце багрово-обсидиановой башни. Там ты встретишь Епископа, который ожидает тебя. Отнеси жетон Оракула ключнику в пограничье. Когда уничтожишь Епископа, возвращайся к Оракулу.",,Den andra biten finns i hjärtat av det karmosinröda och obsidianiska tornet. Där måste du hitta biskopen som väntar på dig. Ta Orakelns token till nyckelmästaren i gränslandet. När du har förintat biskopen ska du återvända till oraklet.,İkinci parça kızıl ve obsidyen kulenin kalbinde yatıyor. Orada sizi bekleyen Piskopos'u bulmalısınız. Kahin'in jetonunu sınır bölgelerindeki anahtar ustasına götürün. Piskoposu yok ettikten sonra Kahin'e geri dönün. -"Find the crimson and obsidian tower. Use the id key the key master gave you to enter the tower. Once inside you must locate the Bishop. Once you have destroyed the Bishop, return to the Oracle.",TXT_ILOG1021,MAP11: After getting the Military ID from the keymaster.,,,"Najdi karmíno-obsidiánovou věž. Použij legitimaci, kterou ti dal klíčník, pro vstup do věže. Uvnitř musíš najít Biskupa. Až zabiješ Biskupa, vrať se k Věštci.","Find det purpurfarvede og obsidianske tårn. Brug den id-nøgle, som nøglemesteren gav dig, til at komme ind i tårnet. Når du er inde, skal du finde biskoppen. Når du har ødelagt biskoppen, skal du vende tilbage til Oracle.","Finde den Turm aus Purpur und Obsidian. Benutze den Schlüssel des Schlüsselmeisters um in den Turm hereinzukommen. In seinem Inneren musst du den Bischof finden. Wenn er ausgeschaltet ist, kehre zum Orakel zurück.",,,"Encuentra la torre carmesí y obsidiana. Usa la llabe que te dio el amo de llaves para entrar en la torre. Una vez dentro debes localizar al Obispo. Una vez hayas destruido al Obispo, regresa con el Oráculo.","Encuentra la torre carmesí y obsidiana. Usa la llave que te dio el Amo de Llaves para entrar en la torre. Una vez adentro localiza al Obispo. Una vez destruido el Obispo, regresa con el Oráculo.",Löydä purppuranpunainen laavalasinen torni. Käytä avainmestarin luovuttamaa tunnusta päästäksesi torniin. Sisään päästyäsi sinun on paikallistettava Piispa. Tuhottuasi hänet palaa Oraakkelin luokse.,"Trouve la tour d'obsidienne et d'écarlate. Utilise la carte magnétique que le maître des clés t'a donnée pour y entrer. A l'intérieur, trouve et tue l'évêque, puis retourne à l'Oracle.","Keresd fel a karamzsin és obszidián tornyot. A bejutáshoz használd az igazolványt amit a kulcsmester adott. Ha bejutottál, kutasd fel a Püspököt. Ha kiiktattad a Püspököt, menj vissza az Orákulumhoz.","Trova la torre cremisina e ossidiana. Con la chiave che ti ha dato il mastro delle chiavi, entra nella torre. Quando sei dentro, devi trovare il Vescovo. Dopo averlo distrutto, ritorna dall'Oracolo.","二つ目の欠片は深紅と黒曜石の塔の中心部にある。そこのビショップを討伐せよ。 +"Find the crimson and obsidian tower. Use the id key the key master gave you to enter the tower. Once inside you must locate the Bishop. Once you have destroyed the Bishop, return to the Oracle.",TXT_ILOG1021,MAP11: After getting the Military ID from the keymaster.,,,"Najdi karmíno-obsidiánovou věž. Použij legitimaci, kterou ti dal klíčník, pro vstup do věže. Uvnitř musíš najít Biskupa. Až zabiješ Biskupa, vrať se k Věštci.","Find det purpurfarvede og obsidianske tårn. Brug den id-nøgle, som nøglemesteren gav dig, til at komme ind i tårnet. Når du er inde, skal du finde biskoppen. Når du har ødelagt biskoppen, skal du vende tilbage til Oracle.","Finde den Turm aus Purpur und Obsidian. Benutze den Schlüssel des Schlüsselmeisters um in den Turm hereinzukommen. In seinem Inneren musst du den Bischof finden. Wenn er ausgeschaltet ist, kehre zum Orakel zurück.",,,"Encuentra la torre carmesí y obsidiana. Usa la llabe que te dio el amo de llaves para entrar en la torre. Una vez dentro debes localizar al Obispo. Una vez hayas destruido al Obispo, regresa con el Oráculo.","Encuentra la torre carmesí y obsidiana. Usa la llave que te dio el Amo de Llaves para entrar en la torre. Una vez adentro localiza al Obispo. Una vez destruido el Obispo, regresa con el Oráculo.",Löydä purppuranpunainen laavalasinen torni. Käytä avainmestarin luovuttamaa tunnusta päästäksesi torniin. Sisään päästyäsi sinun on paikallistettava Piispa. Tuhottuasi hänet palaa Oraakkelin luokse.,"Trouve la tour d'obsidienne et d'écarlate. Utilise la carte magnétique que le maître des clés t'a donnée pour y entrer. A l'intérieur, trouve et tue l'évêque, puis retourne à l'Oracle.",,"Keresd fel a karamzsin és obszidián tornyot. A bejutáshoz használd az igazolványt amit a kulcsmester adott. Ha bejutottál, kutasd fel a Püspököt. Ha kiiktattad a Püspököt, menj vissza az Orákulumhoz.","Trova la torre cremisina e ossidiana. Con la chiave che ti ha dato il mastro delle chiavi, entra nella torre. Quando sei dentro, devi trovare il Vescovo. Dopo averlo distrutto, ritorna dall'Oracolo.","二つ目の欠片は深紅と黒曜石の塔の中心部にある。そこのビショップを討伐せよ。 キーマスターから貰ったIDキーを使って塔に入る。 ビショップを仕留めたらオラクルの元に戻る。","진홍빛 흑요석 탑을 찾아. 열쇠지기가 준 신분증을 이용해서 탑으로 들어가. 탑 안으로 들어가서 비숍을 찾아야 해. 비숍을 파괴했다면, 오라클에게 돌아가.","Vind de karmozijnrode en obsidiaan toren. Gebruik de id-toets die de sleutelmeester je gaf om de toren te betreden. Eenmaal binnen moet je de bisschop lokaliseren. Als je de bisschop hebt vernietigd, ga je terug naar het Orakel.","Finn det purpurfargede og obsidianske tårnet. Bruk id-nøkkelen nøkkelmesteren ga deg for å komme inn i tårnet. Når du er inne, må du finne biskopen. Når du har ødelagt biskopen, gå tilbake til oraklet.","Znajdź wieżę z karmazynu i obsydianu. Użyj klucza id, który dał ci mistrz kluczy, aby wejść do wieży. Po wejściu do środka musisz zlokalizować Bishopa. Po zniszczeniu Bishopa wróć do Oracle.","Encontre a torre carmesim e obsidiana. Use a chave de identificação que o mestre da chaves te deu para entrar na torre. Após entrar, você deve localizar o Bispo. Após destruir o Bispo, volte ao Oráculo.",,"Găsește turnul străveziu din obsidian. Folosește cardul pe care ți l-a dat stăpânul cheilor pentru a intra. După aceea, găsește-l pe Episcop. Odată ce l-ai distrus, întoarce-te la Oracol.","Найди багрово-обсидиановую башню. Используй пропуск, полученный у ключника, чтобы войти внутрь. Там ты должен найти Епископа. Когда уничтожишь его, возвращайся к Оракулу.",,Hitta det karmosinröda och obsidianska tornet. Använd id-nyckeln som nyckelmästaren gav dig för att komma in i tornet. När du väl är inne måste du lokalisera biskopen. När du har förstört biskopen återvänder du till oraklet.,Kızıl ve obsidyen kuleyi bulun. Kuleye girmek için anahtar ustasının size verdiği kimlik anahtarını kullanın. İçeri girdikten sonra Piskoposu bulmalısınız. Piskoposu yok ettikten sonra Kahin'e geri dönün. -"Find the security complex, fight through there and use the teleporter to central administration. Destroy the computer core in central administration. This will kill the force field on the Bishop's tower. Once the Bishop's dead, return to the Oracle.",TXT_ILOG1022,MAP17: After talking to Quincy.,,,"Najdi bezpečnostní komplex, probij se skrz a použij teleportér do ústřední administrace. Znič počítačové jádro v ústřední administraci. To zničí silové pole v Biskupově věži. Až zabiješ Biskupa, vrať se k Věštci.","Find sikkerhedskomplekset, kæmp dig igennem der og brug teleporteren til centraladministrationen. Ødelæg computerkernen i centraladministrationen. Dette vil dræbe kraftfeltet på Bishop's tårn. Når biskoppen er død, skal du vende tilbage til Oracle.","Finde den Sicherheitskomplex, kämpfe dich durch und benutze den Teleporter zur Zentralverwaltung. Zerstöre den Computer in der Verwaltung. Das wird alle Kraftfelder am Turm des Bischofs ausschalten. Wenn der Bischof ausgeschaltet ist, kehre zum Orakel zurück.",,,"Encuentra el complejo de seguridad, pelea a través de ahí y usa el teletransporte a administración central. Destruye el núcleo de la computadora en administración central. Esto apagará el campo de fuerza en la torre del Obispo. En cuanto el Obispo esté muerto, regresa con el Oráculo.",,"Löydä turvallisuuskeskus, taistele sen läpi ja kulje kaukosiirtimellä keskushallintoon. Tuhoa siellä keskustietokone. Se sammuttaa Piispan tornin voimakentän. Kun Piispa on kuollut, palaa Oraakkelin luo.","Trouve le complexe de sécurité. Bats-toi pour atteindre le téléporteur vers le centre d'administration. Détruis le cœur informatique qui s'y trouve. Cela désactivera le chap de force de la tour de l'évêque. Un fois qu'il est mort, retourne voir l'Oracle.","Keresd meg a biztonsági központot, harcold magad keresztül rajta, és használd a teleportot a központi adminisztrációhoz. Semmisítsd meg a számítógép magot a központi adminisztrációnál. Ez majd deaktiválja a Püspök tornyának az erőpajzsát. Ha meghalt a Püspök térj vissza az Orákulumhoz.","Trova il complesso di sicurezza, elimina chiunque ti sbarri la strada e trova il teletrasporto per l'amministrazione centrale. Distruggi il nucleo del computer nell'amministrazione centrale. Questo disattiverà il campo di forza nella torre del Vescovo. Quando il Vescovo sarà morto, ritorna dall'Oracolo.","複合警備所を見つけ、そこを制圧し中央管理所へのテレポーターを使う。 +"Find the security complex, fight through there and use the teleporter to central administration. Destroy the computer core in central administration. This will kill the force field on the Bishop's tower. Once the Bishop's dead, return to the Oracle.",TXT_ILOG1022,MAP17: After talking to Quincy.,,,"Najdi bezpečnostní komplex, probij se skrz a použij teleportér do ústřední administrace. Znič počítačové jádro v ústřední administraci. To zničí silové pole v Biskupově věži. Až zabiješ Biskupa, vrať se k Věštci.","Find sikkerhedskomplekset, kæmp dig igennem der og brug teleporteren til centraladministrationen. Ødelæg computerkernen i centraladministrationen. Dette vil dræbe kraftfeltet på Bishop's tårn. Når biskoppen er død, skal du vende tilbage til Oracle.","Finde den Sicherheitskomplex, kämpfe dich durch und benutze den Teleporter zur Zentralverwaltung. Zerstöre den Computer in der Verwaltung. Das wird alle Kraftfelder am Turm des Bischofs ausschalten. Wenn der Bischof ausgeschaltet ist, kehre zum Orakel zurück.",,,"Encuentra el complejo de seguridad, pelea a través de ahí y usa el teletransporte a administración central. Destruye el núcleo de la computadora en administración central. Esto apagará el campo de fuerza en la torre del Obispo. En cuanto el Obispo esté muerto, regresa con el Oráculo.",,"Löydä turvallisuuskeskus, taistele sen läpi ja kulje kaukosiirtimellä keskushallintoon. Tuhoa siellä keskustietokone. Se sammuttaa Piispan tornin voimakentän. Kun Piispa on kuollut, palaa Oraakkelin luo.","Trouve le complexe de sécurité. Bats-toi pour atteindre le téléporteur vers le centre d'administration. Détruis le cœur informatique qui s'y trouve. Cela désactivera le chap de force de la tour de l'évêque. Un fois qu'il est mort, retourne voir l'Oracle.",,"Keresd meg a biztonsági központot, harcold magad keresztül rajta, és használd a teleportot a központi adminisztrációhoz. Semmisítsd meg a számítógép magot a központi adminisztrációnál. Ez majd deaktiválja a Püspök tornyának az erőpajzsát. Ha meghalt a Püspök térj vissza az Orákulumhoz.","Trova il complesso di sicurezza, elimina chiunque ti sbarri la strada e trova il teletrasporto per l'amministrazione centrale. Distruggi il nucleo del computer nell'amministrazione centrale. Questo disattiverà il campo di forza nella torre del Vescovo. Quando il Vescovo sarà morto, ritorna dall'Oracolo.","複合警備所を見つけ、そこを制圧し中央管理所へのテレポーターを使う。 そして管理所のコンピューターコアを破壊する。 そうすればビショップの塔へのフォースフィールドを消せる。 ビショップを仕留めたらオラクルの元に戻る。","보안 담당 기지를 찾고, 경비와 싸워가면서 중앙 처리 본부로 향하는 텔레포터를 사용해. 그곳에서 컴퓨터 중심부를 파괴해. 그러면 비숍의 탑의 보호막을 끌 수 있을 거야. 비숍을 죽이면, 오라클에게 돌아가.","Vind het veiligheidscomplex, vecht daar doorheen en gebruik de teleporter om de centrale administratie te besturen. Vernietig de computerkern in de centrale administratie. Dit zal het krachtveld op de Bisschopstoren doden. Zodra de bisschop dood is, keer je terug naar het Orakel.","Finn sikkerhetskomplekset, kjemp deg gjennom der og bruk teleporteren til sentraladministrasjonen. Ødelegg datakjernen i sentraladministrasjonen. Dette vil drepe kraftfeltet på biskopens tårn. Når biskopen er død, gå tilbake til Orakelet.","Znajdź kompleks bezpieczeństwa, walcz tam i użyj teleportera do centralnej administracji. Zniszcz rdzeń komputera w centralnej administracji. To zabije pole siłowe na wieży Bishopa. Gdy Bishop będzie już martwy, wróć do Oracle.","Encontre o complexo de segurança, lute através de lá e use o teletransportador na administração central. Destrua o núcleo de computação na administração central. Isso vai derrubar o campo de força na torre do Bispo. Após matar o Bispo, volte ao Oráculo.",,"Găsește complexul de securitate, intră în luptă, și folosește teleportorul către administrația centrală. Distruge nucleul calculatorului. Asta va distruge scutul din turnul Episcopului. Odată ce e mort, întoarce-te la Oracol.","Найди охранный комлекс, пробейся внутрь и используй телепорт до центральной администрации. Уничтожь компьютер. Это должно отключить силовое поле башни Епископа. Когда убьёшь Епископа, возвращайся к Оракулу.",,"Hitta säkerhetskomplexet, kämpa dig igenom där och använd teleportern till centraladministrationen. Förstör datorkärnan i centralförvaltningen. Detta kommer att döda kraftfältet på biskopens torn. När biskopen är död återvänder du till oraklet.","Güvenlik kompleksini bulun, orada savaşın ve merkezi yönetime giden ışınlayıcıyı kullanın. Merkezi yönetimdeki bilgisayar çekirdeğini yok edin. Bu, Piskopos'un kulesindeki güç alanını öldürecektir. Piskopos öldükten sonra Kahin'e geri dönün." -Your next challenge will test your spirit. The third piece is held by your own leader. He is the same as that which he sends you to kill. Confront him and resolve your fate.,TXT_ILOG1023,,,,"Tvá další výzva pokusí tvou vůli. Třetí díl je držen tvým vlastním vůdcem. Je stejný, jako ti, které tě posílá zabít. Postav se mu a rozhodni svůj osud.","Din næste udfordring vil teste din ånd. Den tredje brik holdes af din egen leder. Han er den samme som den, som han sender dig til at dræbe. Konfronter ham og løser din skæbne.","Die nächste Herausforderung wird deinen Geist prüfen. Das dritte Teilstück wird von deinem eigenen Anführer, Macil, gehalten. Er ist das Gleiche, was er dich töten lässt. Konfrontiere ihn und kläre dein Schicksal.",,,Tu siguiente desafío pondrá a prueba tu espíritu. La tercera pieza está en manos de tu propio líder. Él es lo mismo que te envía a matar. Confróntalo y resuelve tu destino.,Tú siguiente desafío probará tú espíritu. La tercera pieza la tiene tú propio líder. Él es igual que aquello que te envía a matar. Confróntalo y resuelve tú destino.,"Seuraava haasteesi koettelee sinua henkisesti. Kolmatta osasta pitää hallussaan oma päämiehesi. Hän on sama kuin se, jonka hän lähettää sinut surmaamaan. Kohtaa hänet ja päätä kohtalosi.",Le prochain défi testera votre esprit. Le troisième fragment est possédé par votre leader. Il est le même que celui qu'il vous a envoyé tuer. Confrontez-le et faites face à votre destinée.,"A következő próbatétel próbára teszi a lelkedet. A harmadik darab a saját vezérednél található. Egy és ugyanazon személy akit meg akar öletni veled. Szembesítsd vele, és dönts a sorsod felett.",La tua prossima sfida metterà alla prova il tuo spirito. Il terzo frammento è posseduto dal tuo stesso capo. Lui è uguale a quelli che ti manda ad uccidere. Affrontalo e risolvi il tuo destino.,"次の挑戦は己の精神が試される。三つ目の欠片は我々のリーダーが保持している。 +Your next challenge will test your spirit. The third piece is held by your own leader. He is the same as that which he sends you to kill. Confront him and resolve your fate.,TXT_ILOG1023,,,,"Tvá další výzva pokusí tvou vůli. Třetí díl je držen tvým vlastním vůdcem. Je stejný, jako ti, které tě posílá zabít. Postav se mu a rozhodni svůj osud.","Din næste udfordring vil teste din ånd. Den tredje brik holdes af din egen leder. Han er den samme som den, som han sender dig til at dræbe. Konfronter ham og løser din skæbne.","Die nächste Herausforderung wird deinen Geist prüfen. Das dritte Teilstück wird von deinem eigenen Anführer, Macil, gehalten. Er ist das Gleiche, was er dich töten lässt. Konfrontiere ihn und kläre dein Schicksal.",,,Tu siguiente desafío pondrá a prueba tu espíritu. La tercera pieza está en manos de tu propio líder. Él es lo mismo que te envía a matar. Confróntalo y resuelve tu destino.,Tú siguiente desafío probará tú espíritu. La tercera pieza la tiene tú propio líder. Él es igual que aquello que te envía a matar. Confróntalo y resuelve tú destino.,"Seuraava haasteesi koettelee sinua henkisesti. Kolmatta osasta pitää hallussaan oma päämiehesi. Hän on sama kuin se, jonka hän lähettää sinut surmaamaan. Kohtaa hänet ja päätä kohtalosi.",Le prochain défi testera votre esprit. Le troisième fragment est possédé par votre leader. Il est le même que celui qu'il vous a envoyé tuer. Confrontez-le et faites face à votre destinée.,,"A következő próbatétel próbára teszi a lelkedet. A harmadik darab a saját vezérednél található. Egy és ugyanazon személy akit meg akar öletni veled. Szembesítsd vele, és dönts a sorsod felett.",La tua prossima sfida metterà alla prova il tuo spirito. Il terzo frammento è posseduto dal tuo stesso capo. Lui è uguale a quelli che ti manda ad uccidere. Affrontalo e risolvi il tuo destino.,"次の挑戦は己の精神が試される。三つ目の欠片は我々のリーダーが保持している。 彼は貴方を殺すために送ったのと同等だと。彼に立ち向かい、己の運命を決断せよ。",다음 도전은 너의 정신을 시험할 거야. 세 번째 조각은 바로 우리의 지도자가 가지고 있어. 그는 너를 시켜서 죽였던 괴물들과 마찬가지인 존재지.,Je volgende uitdaging zal je geest testen. Het derde stuk wordt vastgehouden door je eigen leider. Hij is dezelfde die hij je stuurt om te doden. Confronteer hem en los je lot op.,Din neste utfordring vil sette din ånd på prøve. Den tredje brikken holdes av din egen leder. Han er den samme som han sender deg for å drepe. Konfronter ham og avgjør skjebnen din.,"Twoje kolejne wyzwanie przetestuje twojego ducha. Trzeci element jest w posiadaniu twojego własnego przywódcy. Jest on taki sam jak ten, którego wysyła do zabicia. Zmierz się z nim i rozstrzygnij swój los.",Seu próximo desafio testará o seu espírito. A terceira peça está com o seu próprio líder. Ele é a mesma pessoa que ele quer que você mate. Confronte-o e resolva o seu destino.,,Următoarea provocare îți va testa spiritul. A treia pieșă e ținută de propriul vostru lider. E același ca cel care vă trimite să ucideți. Înfruntă-l și împlinește-ți destinul.,"Следующее задание испытает силу твоего духа. Третий фрагмент у вашего лидера. Он сам — один из тех, кого вы убиваете по его приказу. Сразись с ним и исполни своё предназначение.",,Din nästa utmaning kommer att sätta din anda på prov. Den tredje biten innehas av din egen ledare. Han är densamma som den som han skickar dig att döda. Konfrontera honom och lös ditt öde.,Bir sonraki göreviniz ruhunuzu sınayacak. Üçüncü parça kendi lideriniz tarafından tutuluyor. Sizi öldürmeniz için gönderdiği kişiyle aynı. Onunla yüzleşin ve kaderinizi belirleyin. -"It is the Oracle who holds the third piece. There's your traitor. Return to the Oracle, and take him down. Return to me when it's dead.",TXT_ILOG1024,MAP10: You chose to kill the Oracle.,,,"Věštec je ten, kdo má u sebe třetí díl. On je ten zrádce. Vrať se k němu a zabij ho. Vrať se ke mě, až bude mrtvý.","Det er Oraklet, der har den tredje brik. Der er din forræder. Vend tilbage til Oraklet, og nedlæg ham. Vend tilbage til mig, når det er dødt.","Es ist das Orakel, das das dritte Teilstück besitzt. Es ist der Verräter. Kehre zu ihm zurück und schalte es aus. Kehre zurück, wenn es tot ist.",,,Es el Oráculo quien tiene la tercera pieza. Ahí está tu traidor. Regresa al Oráculo y acaba con él. Regresa a mí cuando esté muerto.,,Kolmas osanen on Oraakkelin hallussa. Siinä on petturisi. Palaa Oraakkelin luo ja poista hänet päiväjärjestyksestä. Palaa luokseni hänen kuoltuaan.,"C'est l'Oracle qui détient la troisième pièce, est c'est lui qui est le traître. Retourne le voir et détruis-le. Retourne à la base quand il est mort.","Az Orákulumnál található a harmadik darab. Ő lesz az árulód. Térj vissza az Orákulumhoz, és tedd el láb alól. Ha megtörtént, gyere vissza.","È l'Oracolo che tiene il terzo pezzo. Ecco chi è il traditore. Ritorna dall'Oracolo, e fallo fuori. Ritorna da me quando lo hai ucciso.","三つ目の欠片を持つのはオラクルだ。あいつが裏切者だ。 +"It is the Oracle who holds the third piece. There's your traitor. Return to the Oracle, and take him down. Return to me when it's dead.",TXT_ILOG1024,MAP10: You chose to kill the Oracle.,,,"Věštec je ten, kdo má u sebe třetí díl. On je ten zrádce. Vrať se k němu a zabij ho. Vrať se ke mě, až bude mrtvý.","Det er Oraklet, der har den tredje brik. Der er din forræder. Vend tilbage til Oraklet, og nedlæg ham. Vend tilbage til mig, når det er dødt.","Es ist das Orakel, das das dritte Teilstück besitzt. Es ist der Verräter. Kehre zu ihm zurück und schalte es aus. Kehre zurück, wenn es tot ist.",,,Es el Oráculo quien tiene la tercera pieza. Ahí está tu traidor. Regresa al Oráculo y acaba con él. Regresa a mí cuando esté muerto.,,Kolmas osanen on Oraakkelin hallussa. Siinä on petturisi. Palaa Oraakkelin luo ja poista hänet päiväjärjestyksestä. Palaa luokseni hänen kuoltuaan.,"C'est l'Oracle qui détient la troisième pièce, est c'est lui qui est le traître. Retourne le voir et détruis-le. Retourne à la base quand il est mort.",,"Az Orákulumnál található a harmadik darab. Ő lesz az árulód. Térj vissza az Orákulumhoz, és tedd el láb alól. Ha megtörtént, gyere vissza.","È l'Oracolo che tiene il terzo pezzo. Ecco chi è il traditore. Ritorna dall'Oracolo, e fallo fuori. Ritorna da me quando lo hai ucciso.","三つ目の欠片を持つのはオラクルだ。あいつが裏切者だ。 オラクルの所に戻り討ち倒せ。終わったらマシルの元に戻る。",오라클이 세 번째 조각을 가지고 있어. 그가 배신자야! 오라클을 찾아서 혼쭐을 낸 뒤 마실에게 돌아와.,"Het is het Orakel dat het derde deel vasthoudt. Daar is je verrader. Ga terug naar het Orakel, en neem hem mee naar beneden. Keer terug naar mij als het dood is.",Det er oraklet som har den tredje brikken. Der er forræderen din. Gå tilbake til oraklet og drep ham. Kom tilbake til meg når den er død.,"To Wyrocznia jest w posiadaniu trzeciego kawałka. Oto twój zdrajca. Wróć do Wyroczni i załatw go. Wróć do mnie, gdy będzie martwy.",É o Oráculo que possui a terceira peça. Esse é o seu traidor. Volte ao Oráculo e elimine-o. Volte para mim quando ele estiver morto.,,"E Oracolul cel care deține ultima piesă. Acolo e trădătorul. Întoarce-te la Oracol, și răpune-l. Întoarce-te la mine când ai terminat.",Третий фрагмент хранится у Оракула. Так и кто же из нас предатель? Вернись к Оракулу и расправься с ним. Доложи мне о его смерть.,,Det är oraklet som innehar den tredje biten. Där har du din förrädare. Återvänd till Oraklet och ta ner honom. Återvänd till mig när den är död.,Üçüncü parçayı elinde tutan Kahin. İşte haininiz. Kahin'e dön ve onu indir. Öldüğünde bana geri dön. -"You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people.... The Loremaster. Stop him, and the next piece will be yours.",TXT_ILOG1025,,,,"Vyřízl jsi rakovinu ze svého těla, tvé srdce však stále bije. Dále musíš najít doktora, jenž vraždí a ovládá tvé druhy, Dějepisce. Učiň mu přítrž a další díl bude tvůj.","Du har fjernet kræften fra din krop, men dit hjerte slår stadig. Nu skal du finde den kirurg, der slagter og kontrollerer dit folk.... Loremesteren. Stop ham, og det næste stykke vil blive dit.","Du hast das Geschwür aus deinem Körper entferrnt, aber dein Herz schlägt noch. Als Nächstes musst du den Wissensmeister finden, der deine Leute kontrolliert und abschlachtet. Stoppe ihn und das nächste Teilstück ist Dein.",,,"Has cortado el cáncer de tu cuerpo, pero tu corazón aún late. Ahora debes encontrar al cirujano que destroza y controla a tu gente... El Maestro del Conocimiento. Detenlo, y la siguiente pieza será tuya.","Haz cortado el cáncer de tu cuerpo, pero tú corazón todavía late. Ahora debes encontrar al cirujano que encarniza y controla a tú gente... El Maestro del Conocimiento. Deténlo y la siguiente pieza será tuya.","Olet erottanut syövän ruumiistasi, mutta sydämesi silti sykkii. Seuraavaksi pitää sinun löytämän kirugin, joka teurastaa ja hallitsee kansaasi: Oppi-Isän. Pysäytä hänet, ja seuraava osanen on oleva sinun.","Vous avez arraché le cancer de votre corps, mais le cœur bat encore. Vous devez maintenant trouver le chirurgien qui massacre votre peuple, le Maître des traditions. Arrètez-le, et le fragment suivant sera le vôtre.","Kivágtad a rákos részt a szívedből, de az még mindig ver. A következő lépés, hogy felkutatod a sebészt aki lemészárolja és irányítja a néped...a Tanmestert. Állítsd meg , és a következő darab a tied.","Hai eliminato il cancro dal tuo corpo, ma il tuo cuore batte ancora. Adesso devi trovare il chirurgo che macella e controlla la tua gente, il Sapiente. Fermalo e il prossimo pezzo sarà tuo.","己の癌は切除したが動揺は隠せないままだ。 +"You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people.... The Loremaster. Stop him, and the next piece will be yours.",TXT_ILOG1025,,,,"Vyřízl jsi rakovinu ze svého těla, tvé srdce však stále bije. Dále musíš najít doktora, jenž vraždí a ovládá tvé druhy, Dějepisce. Učiň mu přítrž a další díl bude tvůj.","Du har fjernet kræften fra din krop, men dit hjerte slår stadig. Nu skal du finde den kirurg, der slagter og kontrollerer dit folk.... Loremesteren. Stop ham, og det næste stykke vil blive dit.","Du hast das Geschwür aus deinem Körper entferrnt, aber dein Herz schlägt noch. Als Nächstes musst du den Wissensmeister finden, der deine Leute kontrolliert und abschlachtet. Stoppe ihn und das nächste Teilstück ist Dein.",,,"Has cortado el cáncer de tu cuerpo, pero tu corazón aún late. Ahora debes encontrar al cirujano que destroza y controla a tu gente... El Maestro del Conocimiento. Detenlo, y la siguiente pieza será tuya.","Haz cortado el cáncer de tu cuerpo, pero tú corazón todavía late. Ahora debes encontrar al cirujano que encarniza y controla a tú gente... El Maestro del Conocimiento. Deténlo y la siguiente pieza será tuya.","Olet erottanut syövän ruumiistasi, mutta sydämesi silti sykkii. Seuraavaksi pitää sinun löytämän kirugin, joka teurastaa ja hallitsee kansaasi: Oppi-Isän. Pysäytä hänet, ja seuraava osanen on oleva sinun.","Vous avez arraché le cancer de votre corps, mais le cœur bat encore. Vous devez maintenant trouver le chirurgien qui massacre votre peuple, le Maître des traditions. Arrètez-le, et le fragment suivant sera le vôtre.",,"Kivágtad a rákos részt a szívedből, de az még mindig ver. A következő lépés, hogy felkutatod a sebészt aki lemészárolja és irányítja a néped...a Tanmestert. Állítsd meg , és a következő darab a tied.","Hai eliminato il cancro dal tuo corpo, ma il tuo cuore batte ancora. Adesso devi trovare il chirurgo che macella e controlla la tua gente, il Sapiente. Fermalo e il prossimo pezzo sarà tuo.","己の癌は切除したが動揺は隠せないままだ。 次の欠片は人々を虐殺で支配する外科医... ロアマスターが所持している。奴を止め、欠片を自分の物にする。","네 몸 안의 암 덩어리를 잘라냈지만, 심장은 여전히 뛰고 있네. 다음은 우리를 향한 도살과 지배를 책임졌던 과학자, 로어마스터를 찾아내야 해. 그를 막아내면, 다음 조각을 얻을 수 있을 거야.","Je hebt de kanker uit je lichaam gesneden, maar je hart klopt nog steeds. Vervolgens moet je de chirurg vinden die je mensen afmaakt en controleert....... De Kennismeester. Stop hem, en het volgende stuk zal van jou zijn.","Du har fjernet kreften fra kroppen din, men hjertet ditt slår fortsatt. Nå må du finne kirurgen som slakter og kontrollerer folket ditt...... .... Loremesteren. Stopp ham, og det neste stykket blir ditt.","Wyciąłeś raka ze swojego ciała, ale twoje serce wciąż bije. Następnie musisz znaleźć chirurga, który rzeźbi i kontroluje twoich ludzi.... Loremaster. Powstrzymaj go, a następny kawałek będzie twój.","Você arrancou o câncer do seu corpo, mas seu coração ainda bate. Agora você deve encontrar o cirurgião que mutila e controla o seu povo... o Mestre do Conhecimento. Detenha-o e a próxima peça será sua.",,"Ai tăiat cancerul din corp, dar inima ta încă bate. Mai departe trebuie să găsești pe chirurgul care vă masacrează oamenii.... Maestrul Cunoștiințelor. Oprește-l, și următoarea piesă va fii a ta.","Ты вырезал опухоль из своего тела, но твоё сердце всё ещё бьётся. Теперь тебе предстоит найти вивисектора, который вскрывает твоих людей и управляет ими — Хранителя мудрости. Останови его, и следующий фрагмент твой.",,"Du har skurit bort cancern från din kropp, men ditt hjärta slår fortfarande. Nu måste du hitta kirurgen som slaktar och kontrollerar ditt folk.... Läromästaren. Stoppa honom och nästa del blir din.","Kanseri vücudundan attın ama kalbin hala atıyor. Şimdi insanlarını kesen ve kontrol eden cerrahı bulmalısın.... Loremaster. Onu durdurursan, bir sonraki parça senin olacak." -"Next you must find the surgeon who butchers and controls your people.... The Loremaster. Stop him, and the next piece will be yours. Use the teleporter I opened to reach him. When he's dead, use the same device to return to me.",TXT_ILOG1026,,,,"Vyřízl jsi rakovinu ze svého těla, tvé srdce však stále bije. Dále musíš najít doktora, jenž vraždí a ovládá tvé druhy, Dějepisce. Učiň mu přítrž a další díl bude tvůj. Použij teleportér, který jsem otevřel, aby ses k němu dostal. Když je mrtev, použij stejné zařízení k návratu ke mě.","Dernæst skal du finde den kirurg, der slagter og kontrollerer dit folk.... Loremesteren. Stop ham, og den næste del bliver din. Brug teleporteren, som jeg åbnede for at nå ham. Når han er død, skal du bruge den samme anordning til at vende tilbage til mig.","Als Nächstes musst du den Wissensmeister finden, der deine Leute kontrolliert und abschlachtet. Stoppe ihn und das nächste Teilstück ist Dein. Benutze den Teleporter, den ich geöffnet habe, um zu ihm zu gelangen. Wenn er tot ist kehre auf dem gleichen Weg zurück.",,,"Ahora debes encontrar al cirujano que destroza y controla a tu gente... El Maestro del Conocimiento. Detenlo, y la siguiente pieza será tuya. Usa el teletransporte que he abierto para alcanzarlo. Cuando esté muerto, usa el mismo dispositivo para regresar a mí.","Ahora debes encontrar al cirujano que encarniza y controla a tú gente... El Maestro del Conocimiento. Deténlo y la siguiente pieza será tuya. Usa el teleporte que he abierto para alcanzarlo. Cuando esté muerto, usa el mismo dispositivo para regresar conmigo.","Seuraavaksi pitää sinun löytämän kirugin, joka teurastaa ja hallitsee kansaasi: Oppi-Isän. Pysäytä hänet, ja seuraava osanen on oleva sinun. Käytä avaamaani kaukosiirrintä tavoittaaksesi hänet. Kun hän on kuollut, käytä samaa laitetta palataksesi tyköni.","Vous devez maintenant trouver le chirurgien qui massacre votre peuple, le Maître des traditions. Arrètez-le, et le fragment suivant sera le vôtre. Utilisez le téléporter qui s'est ouvert pour l'atteindre. Quand il est mort, utilisez le même téléporteur pour retourner à l'Oracle.","A következő lépés, hogy felkutatod a sebészt aki lemészárolja és irányítja a néped...a Tanmestert. Állítsd meg és a következő darab a tied. Most nyitottam ki ezt a teleportot, használd hogy eljuss hozzá. Ha meghalt, használd ugyanezt a visszaútra is.","Adesso devi trovare il chirurgo che macella e controlla la tua gente, il Sapiente. Fermalo e il prossimo pezzo sarà tuo. Usa il teletrasporto che ho sbloccato per raggiungere il Sapiente. Quando è morto, usa lo stesso teletrasporto per tornare da me.","次の欠片は人々を虐殺で支配する外科医... +"Next you must find the surgeon who butchers and controls your people.... The Loremaster. Stop him, and the next piece will be yours. Use the teleporter I opened to reach him. When he's dead, use the same device to return to me.",TXT_ILOG1026,,,,"Vyřízl jsi rakovinu ze svého těla, tvé srdce však stále bije. Dále musíš najít doktora, jenž vraždí a ovládá tvé druhy, Dějepisce. Učiň mu přítrž a další díl bude tvůj. Použij teleportér, který jsem otevřel, aby ses k němu dostal. Když je mrtev, použij stejné zařízení k návratu ke mě.","Dernæst skal du finde den kirurg, der slagter og kontrollerer dit folk.... Loremesteren. Stop ham, og den næste del bliver din. Brug teleporteren, som jeg åbnede for at nå ham. Når han er død, skal du bruge den samme anordning til at vende tilbage til mig.","Als Nächstes musst du den Wissensmeister finden, der deine Leute kontrolliert und abschlachtet. Stoppe ihn und das nächste Teilstück ist Dein. Benutze den Teleporter, den ich geöffnet habe, um zu ihm zu gelangen. Wenn er tot ist kehre auf dem gleichen Weg zurück.",,,"Ahora debes encontrar al cirujano que destroza y controla a tu gente... El Maestro del Conocimiento. Detenlo, y la siguiente pieza será tuya. Usa el teletransporte que he abierto para alcanzarlo. Cuando esté muerto, usa el mismo dispositivo para regresar a mí.","Ahora debes encontrar al cirujano que encarniza y controla a tú gente... El Maestro del Conocimiento. Deténlo y la siguiente pieza será tuya. Usa el teleporte que he abierto para alcanzarlo. Cuando esté muerto, usa el mismo dispositivo para regresar conmigo.","Seuraavaksi pitää sinun löytämän kirugin, joka teurastaa ja hallitsee kansaasi: Oppi-Isän. Pysäytä hänet, ja seuraava osanen on oleva sinun. Käytä avaamaani kaukosiirrintä tavoittaaksesi hänet. Kun hän on kuollut, käytä samaa laitetta palataksesi tyköni.","Vous devez maintenant trouver le chirurgien qui massacre votre peuple, le Maître des traditions. Arrètez-le, et le fragment suivant sera le vôtre. Utilisez le téléporter qui s'est ouvert pour l'atteindre. Quand il est mort, utilisez le même téléporteur pour retourner à l'Oracle.",,"A következő lépés, hogy felkutatod a sebészt aki lemészárolja és irányítja a néped...a Tanmestert. Állítsd meg és a következő darab a tied. Most nyitottam ki ezt a teleportot, használd hogy eljuss hozzá. Ha meghalt, használd ugyanezt a visszaútra is.","Adesso devi trovare il chirurgo che macella e controlla la tua gente, il Sapiente. Fermalo e il prossimo pezzo sarà tuo. Usa il teletrasporto che ho sbloccato per raggiungere il Sapiente. Quando è morto, usa lo stesso teletrasporto per tornare da me.","次の欠片は人々を虐殺で支配する外科医... ロアマスターが所持している。奴を止め、欠片を自分の物にする。 近辺へのテレポーターを使い、奴が死んだら再びテレポーターから戻る。","우리를 향한 도살과 지배를 책임졌던 과학자, 로어마스터를 찾아내야 해. 그를 막아내면, 다음 조각을 얻을 수 있을 거야. 오라클이 열어준 텔레포터를 이용해서 그를 찾아. 그가 죽으면 같은 장치를 이용해서 오라클에게 돌아와.","Vervolgens moet u de chirurg vinden die uw mensen afslacht en onder controle heeft....... De Kennismeester. Stop hem, en het volgende stuk zal van jou zijn. Gebruik de teleporter die ik geopend heb om hem te bereiken. Als hij dood is, gebruik dan hetzelfde apparaat om terug te keren naar mij.","Deretter må du finne kirurgen som slakter og kontrollerer folket ditt.... Loremesteren. Stopp ham, og den neste brikken blir din. Bruk teleporteren jeg åpnet for å nå ham. Når han er død, bruk samme apparat for å komme tilbake til meg.","Następnie musisz znaleźć chirurga, który rzeźbi i kontroluje twoich ludzi.... Loremaster. Zatrzymaj go, a następny kawałek będzie twój. Użyj teleportera, który otworzyłem, aby do niego dotrzeć. Gdy będzie martwy, użyj tego samego urządzenia, by wrócić do mnie.","Agora você deve encontrar o cirurgião que mutila e controla o seu povo... o Mestre do Conhecimento. Detenha-o e a próxima peça será sua. Use o teletransportador que eu abri para chegar até ele. Quando ele estiver morto, use o mesmo dispositivo e volte até mim.",,"Mai departe trebuie să găsești chirurgul care vă masacrează oameni.... Maestrul Cunoștiințelor. Oprește-l, și următoarea piesă va fii a ta.","Тебе предстоит найти вивисектора, который вскрывает твоих людей и управляет ими — Хранителя мудрости. Останови его, и следующий фрагмент твой. Используй открытый мной телепорт, чтобы добраться до него. Когда он умрёт, найди другой телепорт и вернись ко мне.",,Nästa steg är att hitta kirurgen som slaktar och kontrollerar ditt folk.... Läromästaren. Stoppa honom och nästa del blir din. Använd teleportern som jag öppnade för att nå honom. När han är död använder du samma apparat för att återvända till mig.,"Şimdi halkını katleden ve kontrol eden cerrahı bulmalısın.... Loremaster. Onu durdurun ve bir sonraki parça sizin olsun. Ona ulaşmak için açtığım ışınlayıcıyı kullan. O öldüğünde, bana dönmek için aynı cihazı kullan." -You have chosen wisely. The third piece is held by your own leader. Destroy that which hides within your heart and return to me.,TXT_ILOG1027,MAP12: You chose to kill Macil.,,,"Rozhodl ses moudře. Třetí díl je držen tvým vlastním vůdcem. Znič to, co se skrývá v tvém srdci, a vrať se ke mně.","Du har truffet et klogt valg. Den tredje brik er i hænderne på din egen leder. Ødelæg det, der gemmer sig i dit hjerte, og vend tilbage til mig.","Du hast weise entschieden. as dritte Teilstück wird von deinem eigenen Anführer, Macil, gehalten. Vernichte, was sich in eurem Herzen versteckt und kehre zu mir zurück.",,,Has elegido sabiamente. La tercera pieza está en manos de tu propio líder. Destroye lo que se esconde en tu corazón y regresa a mí.,,"Olet valinnut viisaasti. Kolmatta osasta pitää hallussaan oma päämiehesi. Tuhoa se, mikä piilee sisällä sydämessäsi ja palaa tyköni.",Vous avez sagement choisi. La troisième pièce est détenue par votre propre leader. Détruisez ce qui se tapit dans son cœur et revenez à moi.,"Bölcsen döntöttél. A harmadik darab a saját vezérednél található. Semmisítsd meg a szíved mélyén megbúvó sötétséget, és térj vissza.",Hai fatto la scelta giusta. Il terzo pezzo è in possesso del tuo stesso capo. Distruggi ciò che si nasconde dentro il tuo cuore e ritorna da me.,"貴方は賢い判断をした。三つ目の欠片は我々のリーダーが保持している。 +You have chosen wisely. The third piece is held by your own leader. Destroy that which hides within your heart and return to me.,TXT_ILOG1027,MAP12: You chose to kill Macil.,,,"Rozhodl ses moudře. Třetí díl je držen tvým vlastním vůdcem. Znič to, co se skrývá v tvém srdci, a vrať se ke mně.","Du har truffet et klogt valg. Den tredje brik er i hænderne på din egen leder. Ødelæg det, der gemmer sig i dit hjerte, og vend tilbage til mig.","Du hast weise entschieden. as dritte Teilstück wird von deinem eigenen Anführer, Macil, gehalten. Vernichte, was sich in eurem Herzen versteckt und kehre zu mir zurück.",,,Has elegido sabiamente. La tercera pieza está en manos de tu propio líder. Destroye lo que se esconde en tu corazón y regresa a mí.,,"Olet valinnut viisaasti. Kolmatta osasta pitää hallussaan oma päämiehesi. Tuhoa se, mikä piilee sisällä sydämessäsi ja palaa tyköni.",Vous avez sagement choisi. La troisième pièce est détenue par votre propre leader. Détruisez ce qui se tapit dans son cœur et revenez à moi.,,"Bölcsen döntöttél. A harmadik darab a saját vezérednél található. Semmisítsd meg a szíved mélyén megbúvó sötétséget, és térj vissza.",Hai fatto la scelta giusta. Il terzo pezzo è in possesso del tuo stesso capo. Distruggi ciò che si nasconde dentro il tuo cuore e ritorna da me.,"貴方は賢い判断をした。三つ目の欠片は我々のリーダーが保持している。 貴方の胸中に隠れているものを払い彼の元に戻る。 ",좋은 판단이야. 세 번째 시질 조각은 마실이 가지고 있어. 그를 죽여서 조각을 얻은 뒤 오라클에게 돌아와.,Je hebt verstandig gekozen. Het derde stuk wordt vastgehouden door je eigen leider. Vernietig datgene wat zich in je hart verbergt en keer terug naar mij.,"Du har valgt klokt. Den tredje brikken holdes av din egen leder. Ødelegg det som skjuler seg i hjertet ditt, og vend tilbake til meg.","Mądrze wybrałeś. Trzeci kawałek jest w posiadaniu twojego własnego przywódcy. Zniszcz to, co kryje się w twoim sercu i wróć do mnie.",Você escolheu sabiamente. A terceira peça está com o seu próprio líder. Destrua aquilo que se esconde em seu coração e volte a mim.,,Ai ales înțelept. A treia piesă e deținută de liderul vostru. Distruge ceea ce se ascunde în inima ta și întoarce-te la mine.,"Мудрый выбор. Третий фрагмент у вашего лидера. Уничтожь то, что закралось в твоё сердце, и возвращайся ко мне.",,Du har valt klokt. Den tredje biten innehas av din egen ledare. Förstör det som gömmer sig i ditt hjärta och återvänd till mig.,Akıllıca bir seçim yaptın. Üçüncü parça kendi liderinizin elinde. Kalbinde sakladığın şeyi yok et ve bana dön. -"We've found out that the Order is transforming our people into bio-mechanical soldiers. Find the facility where this is being done and close it, permanently! Find Richter in the commons, near the waterfall and he'll tell you how to stop this atrocity.",TXT_ILOG1028,MAP10: After killing the Oracle and talking to Macil.,,,"Zjistili jsme, že Řád přeměňuje naše lidi na biomechanické vojáky. Najdi továrnu, kde se tohle odehrává, a zavři ji, natrvalo. Najdi Richtera na návsi u vodopádů. Řekne ti, jak zastavit tuto ohavnost.","Vi har fundet ud af, at Ordenen forvandler vores folk til biomekaniske soldater. Find det sted, hvor det sker, og luk det for altid! Find Richter i fællesarealerne, nær vandfaldet, og han vil fortælle dig, hvordan du kan stoppe denne grusomhed.","Wir haben herausgefunden, dass der Orden unsere Leute nicht tötet, sondern sie transformiert - int biomechanische Soldaten.Finde die Einrichtung, wo dies passiert und schließe sie - endgültig. Suche Richter beim Wasserfall bei der Mensa. Er wird dir sagen, wie du diese Abscheulichkeit abschaklten kannst.",,,"Hemos descubierto que la Orden está transformando a nuestra gente en soldados biomecánicos. Encuentra la instalación donde esto se está haciendo y ciérrala, ¡Permanentemente! Encuentra a Richter en los comunes, junto a la cascada y te dirá como detener esta atrocidad.",,"Olemme saaneet selville, että Veljeskunta muuntelee meidän omiamme biomekaanisiksi sotilaiksi. Etsi laitos, jossa tätä tehdään, ja lakkauta se, pysyvästi! Etsi Richter messistä vesiputouksen läheltä, ja hän kertoo sinulle, miten lopettaa tämä kauhistus.",Nous avons découvert que l'Ordre transforme notre peuple en soldats biomécaniques. Trouve l'usine où cela se déroule et détruis-la pour toujours! Trouve Richter dans le Réfectoire près de la cascade et il t'expliquera comment stopper cette atrocité.,"Kiderítettük, hogy a Rend bio-mechanikus katonákká alakítja az embertársainkat. Keresd meg a létesítményt ahol ezt csinálják, és zárd be örökre! Keresd fel Richtert a vízesés melletti étkezdénél, Ő majd elmondja hogyan tudod megállítani ezt a borzalmat.","Abbiamo scoperto che l'Ordine sta trasformando la nostra gente in soldati bio-meccanici. Trova lo stabilimento dove questo sta avvenendo e chiuderlo, permanentemente. Trova Richter nei comuni, accanto alla cascata, e ti spiegherà come fermare questa atrocità.","我等はオーダーが人々をサイボーグ兵に改造しつつある事を発見した。 +"We've found out that the Order is transforming our people into bio-mechanical soldiers. Find the facility where this is being done and close it, permanently! Find Richter in the commons, near the waterfall and he'll tell you how to stop this atrocity.",TXT_ILOG1028,MAP10: After killing the Oracle and talking to Macil.,,,"Zjistili jsme, že Řád přeměňuje naše lidi na biomechanické vojáky. Najdi továrnu, kde se tohle odehrává, a zavři ji, natrvalo. Najdi Richtera na návsi u vodopádů. Řekne ti, jak zastavit tuto ohavnost.","Vi har fundet ud af, at Ordenen forvandler vores folk til biomekaniske soldater. Find det sted, hvor det sker, og luk det for altid! Find Richter i fællesarealerne, nær vandfaldet, og han vil fortælle dig, hvordan du kan stoppe denne grusomhed.","Wir haben herausgefunden, dass der Orden unsere Leute nicht tötet, sondern sie transformiert - int biomechanische Soldaten.Finde die Einrichtung, wo dies passiert und schließe sie - endgültig. Suche Richter beim Wasserfall bei der Mensa. Er wird dir sagen, wie du diese Abscheulichkeit abschaklten kannst.",,,"Hemos descubierto que la Orden está transformando a nuestra gente en soldados biomecánicos. Encuentra la instalación donde esto se está haciendo y ciérrala, ¡Permanentemente! Encuentra a Richter en los comunes, junto a la cascada y te dirá como detener esta atrocidad.",,"Olemme saaneet selville, että Veljeskunta muuntelee meidän omiamme biomekaanisiksi sotilaiksi. Etsi laitos, jossa tätä tehdään, ja lakkauta se, pysyvästi! Etsi Richter messistä vesiputouksen läheltä, ja hän kertoo sinulle, miten lopettaa tämä kauhistus.",Nous avons découvert que l'Ordre transforme notre peuple en soldats biomécaniques. Trouve l'usine où cela se déroule et détruis-la pour toujours! Trouve Richter dans le Réfectoire près de la cascade et il t'expliquera comment stopper cette atrocité.,,"Kiderítettük, hogy a Rend bio-mechanikus katonákká alakítja az embertársainkat. Keresd meg a létesítményt ahol ezt csinálják, és zárd be örökre! Keresd fel Richtert a vízesés melletti étkezdénél, Ő majd elmondja hogyan tudod megállítani ezt a borzalmat.","Abbiamo scoperto che l'Ordine sta trasformando la nostra gente in soldati bio-meccanici. Trova lo stabilimento dove questo sta avvenendo e chiuderlo, permanentemente. Trova Richter nei comuni, accanto alla cascata, e ti spiegherà come fermare questa atrocità.","我等はオーダーが人々をサイボーグ兵に改造しつつある事を発見した。 これが行われている施設を見つけ永久に停止させる。 コモンズの滝近くにいるリヒターに会い、この残虐な行為を止める方法を聞く。","오더가 우리 사람들을 생체병기로 개조한다는 사실을 알았어. 끔찍한 일이 일어나는 이 시설을 찾아서 작동을 중단시켜, 영원히! 폭포와 가까운 식당가에 있는 릭터를 찾아서 어떻게 하면 중단시킬 수 있는지를 물어봐.","We hebben ontdekt dat de Orde onze mensen transformeert in bio-mechanische soldaten. Vind de faciliteit waar dit gebeurt en sluit deze permanent! Vind Richter in de commons, vlakbij de waterval, en hij zal je vertellen hoe je deze gruweldaad kunt stoppen.","Vi har funnet ut at Ordenen forvandler vårt folk til biomekaniske soldater. Finn anlegget der dette gjøres og steng det, permanent! Finn Richter i allmenningen, nær fossen, og han vil fortelle deg hvordan du kan stoppe denne grusomheten.","Odkryliśmy, że Zakon przekształca naszych ludzi w bio-mechanicznych żołnierzy. Znajdźcie placówkę, w której to się odbywa i zamknijcie ją, na stałe! Znajdź Richtera w komnatach, w pobliżu wodospadu, a on powie ci, jak powstrzymać to okrucieństwo.","Descobrimos que a Ordem está transformando o nosso pessoal em soldados biomecânicos. Encontre a instalação onde isso está sendo feito e feche-a, de uma vez por todas! Encontre o Richter no refeitório próximo à cascata e ele te dirá como parar com essa atrocidade.",,"Am aflat că Ordinul ne transformă oamenii în soldați bio-mecanici. Găsește fabrica unde se întâmplă asta și închide-o, permanent! Găsește-l pe Richter la comune, lângă cascadă și îți va spune cum să oprești atrocitatea.","Мы выяснили, что Орден превращает наших людей в биомеханических солдат. Найди фабрику, где это происходит, и закрой её, навсегда! Найди Рихтера в поселении Ордена, возле водопада — он расскажет тебе, как остановить эти зверства.",,"Vi har fått reda på att Orden förvandlar vårt folk till biomekaniska soldater. Hitta anläggningen där detta görs och stäng den, för gott! Hitta Richter i allmänningen, nära vattenfallet, så berättar han hur du ska stoppa denna grymhet.","Tarikat'ın insanlarımızı biyo-mekanik askerlere dönüştürdüğünü öğrendik. Bunun yapıldığı tesisi bulun ve kalıcı olarak kapatın! Ortak alanda, şelalenin yanında Richter'i bulun ve size bu vahşeti nasıl durduracağınızı anlatsın." -"To enter the factory, you need a key. We stole one, but the agent who had it is missing in the catacombs underneath the commons. There's something down there taking our men. Whatever it is, you have to find it and retrieve the key. When you've got it, the factory is next to the mines.",TXT_ILOG1029,MAP23: After talking with Richter.,,,"Aby ses dostal do továrny, potřebuješ klíč. Ten jsme ukradli, ale náš agent se ztratil v sítí katakomb pod návsí. Něco je tam dole a zabíjí to naše lidi. Ať je to cokoliv, musíme to najít a získat ten klíč. Až ho získáš, továrna je vedle dolů.","For at komme ind på fabrikken skal du bruge en nøgle. Vi stjal en, men agenten, der havde den, er forsvundet i katakomberne under fællesarealerne. Der er noget dernede, der tager vores mænd. Uanset hvad det er, skal du finde det og hente nøglen. Når du har den, er fabrikken ved siden af minerne.","Um die Fabrik zu betreten, brauchst du einen Schlüssel. Wir haben ihn gestohlen, aber unser Agent ist in den Irrwegen der Katakomben unter der Festung des Ordens verschollen. Irgendetwas ist da unten, das unsere Leute ausschaltet. Was auch immer es ist, du musst es finden und den Schlüssel zurückholen. Wenn du ihn hast - die Fabrik ist direkt neben den Minen.",,,"Para entrar en la fábrica, necesitas una llave. Robamos una, pero el agente que la tiene está perdido en las catacumbas bajo los comunes. Hay algo ahí abajo tomando a nuestros hombres. Sea lo que sea, tienes que encontrarlo y recuperar la llave. Cuando la tengas, la fábrica está junto a las minas.",,"Päästäksesi sisälle tehtaaseen tarvitset avaimen. Varastimme sellaisen, mutta vakooja, joka sen sai, on kadoksissa katakombeissa messin alapuolella. Jokin siellä alla vie miehiämme. Mikä ikinä se onkaan, sinun on löydettävä se ja noudettava avain. Kun se on hallussasi, tehdas on kaivoksen vieressä.","Pour entrer dans l'usine, il te faura une clé. On en a volé une, mais l'agent qui la possède a disparu dans les catacombes sous le réfectoire. Il y a quelque chose à l'intérieur qui tue nos hommes. Trouve la et récupère la clé. Quand tu l'as, l'usine est près des mines.","Ahhoz, hogy bejuss a gyárba, kell szerezned egy kulcsot. Sikerült lopnunk egyet, de az ügynökünk akinél volt eltünt az étkezde alatti katakombákban. Van valami lent, ami sorra öli a katonáinkat. Akármi is vár lent, meg kell szerezned a kulcsot. Ha végeztél a gyárat megleled a bánya mellett.","Per entrare nella fabbrica ti servirà una chiave. L'abbiamo rubata ma l'agente che l'ha presa è sparito nelle catacombe sotto i comuni. C'è qualcosa là sotto che sta prendendo i nostri uomini. Qualsiasi cosa sia, devi andare laggiù e recuperare la chiave. Quando l'hai presa, la Fabbrica si trova accanto le miniere.","工場に入るにはキーが必要だ。持っていた代理人はコモンズの地下墓所にはいない。 +"To enter the factory, you need a key. We stole one, but the agent who had it is missing in the catacombs underneath the commons. There's something down there taking our men. Whatever it is, you have to find it and retrieve the key. When you've got it, the factory is next to the mines.",TXT_ILOG1029,MAP23: After talking with Richter.,,,"Aby ses dostal do továrny, potřebuješ klíč. Ten jsme ukradli, ale náš agent se ztratil v sítí katakomb pod návsí. Něco je tam dole a zabíjí to naše lidi. Ať je to cokoliv, musíme to najít a získat ten klíč. Až ho získáš, továrna je vedle dolů.","For at komme ind på fabrikken skal du bruge en nøgle. Vi stjal en, men agenten, der havde den, er forsvundet i katakomberne under fællesarealerne. Der er noget dernede, der tager vores mænd. Uanset hvad det er, skal du finde det og hente nøglen. Når du har den, er fabrikken ved siden af minerne.","Um die Fabrik zu betreten, brauchst du einen Schlüssel. Wir haben ihn gestohlen, aber unser Agent ist in den Irrwegen der Katakomben unter der Festung des Ordens verschollen. Irgendetwas ist da unten, das unsere Leute ausschaltet. Was auch immer es ist, du musst es finden und den Schlüssel zurückholen. Wenn du ihn hast - die Fabrik ist direkt neben den Minen.",,,"Para entrar en la fábrica, necesitas una llave. Robamos una, pero el agente que la tiene está perdido en las catacumbas bajo los comunes. Hay algo ahí abajo tomando a nuestros hombres. Sea lo que sea, tienes que encontrarlo y recuperar la llave. Cuando la tengas, la fábrica está junto a las minas.",,"Päästäksesi sisälle tehtaaseen tarvitset avaimen. Varastimme sellaisen, mutta vakooja, joka sen sai, on kadoksissa katakombeissa messin alapuolella. Jokin siellä alla vie miehiämme. Mikä ikinä se onkaan, sinun on löydettävä se ja noudettava avain. Kun se on hallussasi, tehdas on kaivoksen vieressä.","Pour entrer dans l'usine, il te faura une clé. On en a volé une, mais l'agent qui la possède a disparu dans les catacombes sous le réfectoire. Il y a quelque chose à l'intérieur qui tue nos hommes. Trouve la et récupère la clé. Quand tu l'as, l'usine est près des mines.",,"Ahhoz, hogy bejuss a gyárba, kell szerezned egy kulcsot. Sikerült lopnunk egyet, de az ügynökünk akinél volt eltünt az étkezde alatti katakombákban. Van valami lent, ami sorra öli a katonáinkat. Akármi is vár lent, meg kell szerezned a kulcsot. Ha végeztél a gyárat megleled a bánya mellett.","Per entrare nella fabbrica ti servirà una chiave. L'abbiamo rubata ma l'agente che l'ha presa è sparito nelle catacombe sotto i comuni. C'è qualcosa là sotto che sta prendendo i nostri uomini. Qualsiasi cosa sia, devi andare laggiù e recuperare la chiave. Quando l'hai presa, la Fabbrica si trova accanto le miniere.","工場に入るにはキーが必要だ。持っていた代理人はコモンズの地下墓所にはいない。 何処かへ連れて行かれたと思われる。それが何であれキーを見つけなければならない。 キーを手に入れたら工場の隣の鉱山に向かう。","공장으로 들어가기 위해서는 열쇠가 필요해. 열쇠를 훔치기는 했지만, 소유했던 요원이 식당가 밑 고대 무덤 안에서 행방불명 되었데. 우리 병사들을 끌고 가는 무언가가 있는 것 같아. 그게 무엇이든, 파괴해서 열쇠를 얻어. 그리고 광산 옆에 있는 공장을 열쇠로 열어서 들어가.","Om de fabriek binnen te komen, heb je een sleutel nodig. We hebben er een gestolen, maar de agent die hem had, wordt vermist in de catacomben onder de commons. Er is daar beneden iets dat onze mannen meeneemt. Wat het ook is, je moet het vinden en de sleutel ophalen. Als je hem hebt, staat de fabriek naast de mijnen.","For å komme inn i fabrikken trenger du en nøkkel. Vi stjal en, men agenten som hadde den er savnet i katakombene under allmenningen. Det er noe der nede som tar våre menn. Hva det enn er, må du finne det og hente nøkkelen. Når du har den, er fabrikken ved siden av gruvene.","Aby wejść do fabryki, potrzebujesz klucza. Ukradliśmy jeden, ale agent, który go miał, zaginął w katakumbach pod commons. Coś tam jest, co zabiera naszych ludzi. Cokolwiek to jest, musisz to znaleźć i odzyskać klucz. Gdy go zdobędziesz, fabryka znajduje się obok kopalni.","Para entrar na fábrica você precisa de uma chave. Nós roubamos uma, mas o agente que tinha ela desapareceu nas catacumbas sob o refeitório. Há algo lá embaixo que está pegando os nossos homens. Seja lá o que for, você precisa achar e recuperar a chave. Quando conseguir, a fábrica fica próxima às minas.",,"Pentru a intra în fabrică ai nevoie de cheie. Noi am furat una, dar agentul care a luat-o e undeva în caverne, sub comune. E ceva acolo care ne răpește oamenii. Orice ar fi, găsește-l și ia cheia. Când o ai, fabrica e lângă mine.","Тебе нужен ключ, чтобы проникнуть на фабрику. Мы украли один, но наш агент пропал без вести в катакомбах под поселением. Там, внизу, сидит что-то, что убивает наших людей. Что бы это ни было, тебе придётся сразиться с ним. Когда заполучишь ключ, вход на фабрику рядом со спуском в шахты.",,"För att komma in i fabriken behöver du en nyckel. Vi stal en, men agenten som hade den är försvunnen i katakomberna under allmänningen. Det är något där nere som tar våra män. Vad det än är måste du hitta det och hämta nyckeln. När du har fått den är fabriken bredvid gruvorna.","Fabrikaya girmek için bir anahtara ihtiyacınız var. Bir tane çaldık, ama anahtarı alan ajan avlunun altındaki yeraltı mezarlarında kayıp. Aşağıda adamlarımızı kaçıran bir şey var. O her neyse, onu bulup anahtarı almalısın. Anahtarı aldığında, fabrika madenlerin yanında olacak." -Find the chalice in the sanctuary chapel and bring it to Harris upstairs in the tavern.,TXT_ILOG1101,,,,Najdi kalich v kapli svatyně a přines ho Harrisovi v patře taverny.,Find bægeret i helligkapellet og bring det til Harris ovenpå i tavernaen.,Finde den Kelch im Heiligtum und bringe ihn zu Harris im Obergeschoss der Taverne.,,,Encuentra el cáliz en la capilla del santuario y tráeselo a Harris arriba en la taberna.,,Löydä kalkki pyhäkön kappelista ja tuo se Harrisille kapakan yläkertaan.,Trouve le calice dans la chapelle du sanctuaire et amène la à Harris à l'étage de la taverne.,"Keresd meg a serleget a szent kápolnánál, és vidd Harrishez a kocsma emeletére.",Trova il calice nella cappella del santuario e portalo ad Harris al piano di sopra della Taverna.,聖域でチャリスを探しバーの二階にいるハリスに渡す,"성소에 있는 성배를 찾은 뒤, 선술집에 있는 헤리스에게 전달해.",Vind de kelk in de kapel van het heiligdom en breng hem naar Harris boven in de taverne.,Finn kalken i helligdomskapellet og ta den med til Harris oppe i tavernaen.,Znajdź kielich w kaplicy sanktuarium i zanieś go Harrisowi na górę w tawernie.,Encontre o cálice na capela do santuário e leve ao Harris no andar de cima da taverna.,,Găsește potirul în sanctuarul capelei și du-l lui Harris sus în tavernă.,Найди чашу в святилище и принеси её Харрису на второй этаж таверны.,,Hitta kalken i helgedomens kapell och ta med den till Harris uppe i tavernan.,Kutsal şapeldeki kadehi bul ve tavernanın üst katındaki Harris'e getir. -Find the Governor's mansion and talk to the Governor to get your reward,TXT_ILOG1102,,,,Najdi guvernérovo sídlo a promluv si s ním pro svou odměnu.,Find guvernørens palæ og tal med guvernøren for at få din belønning,Finde die Villa des Gouverneurs und rede mit ihm über deine Belohnung.,,,Encuentra la mansión del Gobernador y habla con él para obtener tu recompensa,,Löydä kuvernöörin kartano ja puhu kuvernöörin kanssa saadaksesi palkkiosi.,Trouve le manoir du Gouverneur et parle-lui pour réclamer ta récompense.,"Keresd fel a Kormányzót a kúriájában, hogy megkapd a jutalmad.",Trova la dimora del governatore e parlagli della tua ricompensa.,知事のマンションで知事と話し報酬を得る,총독의 거주지를 찾은 뒤 총독을 만나서 보상에 대해 예기해.,Zoek het herenhuis van de Gouverneur en praat met de Gouverneur om je beloning te krijgen.,Finn guvernørens herskapshus og snakk med guvernøren for å få belønningen.,"Znajdź rezydencję gubernatora i porozmawiaj z nim, aby otrzymać nagrodę",Encontre a mansão do Governador e fale com ele para pegar a sua recompensa.,,Găsește complexul Guvernatorului și vorbește cu el pentru a-ți lua recompensa.,Пройди в особняк губернатора и обсуди с Морелом своё вознаграждение.,,Hitta guvernörens herrgård och prata med guvernören för att få din belöning.,Vali'nin konağını bulun ve ödülünüzü almak için Vali ile konuşun -Congratulations! You have earned our gratitude. Visit the medic and weapons trainer and they will get you ready for what lies ahead. Feel free to wander around within the base.,TXT_ILOG1201,,,,"Gratulujeme! Získal sis naši vděčnost. Navštiv lékaře a učitele střelby a oni tě připraví na to, co číhá dál. Klidně se potloukej po základně.","Tillykke med det! Du har fortjent vores taknemmelighed. Besøg lægen og våbentræneren, og de vil gøre dig klar til det, der venter forude. Du er velkommen til at vandre rundt i basen.","Gratulation. Du hast dir unsere Dankbarkeit verdient. Suche den Sanitäter und den Waffentrainer auf, sie werden dich auf das was vor dir liegt, vorbereiten. Wenn du willst, schau dich in der Basis um.",,,¡Enhorabuena! Te has ganado nuestra gratitud. Visita al médico y al entrenador de armas y te prepararán para lo que viene en adelante. Sé libre de dar un paseo por la base.,¡Felicitaciones! Te ganaste nuestra gratitud. Visita al médico y al entrenador de armas y ellos te dejarán listo para lo que sigue. Sientete libre de andar através de la base.,"Onneksi olkoon! Olet ansainnut kiitollisuutemme. Vieraile lääkintämiehen ja asekouluttajan luona, ja he valmistavat sinut tuleviin koitoksiin. Saat vapaasti kulkea tukikohdan sisällä.",Félicitations! Vous méritez notre gratitude. Allez voir le médecin et le maître d'armes et ils pourront vous préparer pour ce qu'il va suivre. Vous pouvez faire le tour de la base si vous le souhaitez.,"Gratulálok! Kiérdemled a hálánkat! keresd fel a szanitécet és a fegyvermestert, és felkészítenek az előtted álló harcra. Nyugodtan nézz körbe a bázisban.",Congratulazioni! Meriti appieno la nostra gratitudine. Visita il medico e l'addestratore di armi e ti prepareranno per ciò che ci aspetta. Sii anche libero di andare in giro per la base.,"おめでとう!私達は貴方に感謝している。 +Find the chalice in the sanctuary chapel and bring it to Harris upstairs in the tavern.,TXT_ILOG1101,,,,Najdi kalich v kapli svatyně a přines ho Harrisovi v patře taverny.,Find bægeret i helligkapellet og bring det til Harris ovenpå i tavernaen.,Finde den Kelch im Heiligtum und bringe ihn zu Harris im Obergeschoss der Taverne.,,,Encuentra el cáliz en la capilla del santuario y tráeselo a Harris arriba en la taberna.,,Löydä kalkki pyhäkön kappelista ja tuo se Harrisille kapakan yläkertaan.,Trouve le calice dans la chapelle du sanctuaire et amène la à Harris à l'étage de la taverne.,,"Keresd meg a serleget a szent kápolnánál, és vidd Harrishez a kocsma emeletére.",Trova il calice nella cappella del santuario e portalo ad Harris al piano di sopra della Taverna.,聖域でチャリスを探しバーの二階にいるハリスに渡す,"성소에 있는 성배를 찾은 뒤, 선술집에 있는 헤리스에게 전달해.",Vind de kelk in de kapel van het heiligdom en breng hem naar Harris boven in de taverne.,Finn kalken i helligdomskapellet og ta den med til Harris oppe i tavernaen.,Znajdź kielich w kaplicy sanktuarium i zanieś go Harrisowi na górę w tawernie.,Encontre o cálice na capela do santuário e leve ao Harris no andar de cima da taverna.,,Găsește potirul în sanctuarul capelei și du-l lui Harris sus în tavernă.,Найди чашу в святилище и принеси её Харрису на второй этаж таверны.,,Hitta kalken i helgedomens kapell och ta med den till Harris uppe i tavernan.,Kutsal şapeldeki kadehi bul ve tavernanın üst katındaki Harris'e getir. +Find the Governor's mansion and talk to the Governor to get your reward,TXT_ILOG1102,,,,Najdi guvernérovo sídlo a promluv si s ním pro svou odměnu.,Find guvernørens palæ og tal med guvernøren for at få din belønning,Finde die Villa des Gouverneurs und rede mit ihm über deine Belohnung.,,,Encuentra la mansión del Gobernador y habla con él para obtener tu recompensa,,Löydä kuvernöörin kartano ja puhu kuvernöörin kanssa saadaksesi palkkiosi.,Trouve le manoir du Gouverneur et parle-lui pour réclamer ta récompense.,,"Keresd fel a Kormányzót a kúriájában, hogy megkapd a jutalmad.",Trova la dimora del governatore e parlagli della tua ricompensa.,知事のマンションで知事と話し報酬を得る,총독의 거주지를 찾은 뒤 총독을 만나서 보상에 대해 예기해.,Zoek het herenhuis van de Gouverneur en praat met de Gouverneur om je beloning te krijgen.,Finn guvernørens herskapshus og snakk med guvernøren for å få belønningen.,"Znajdź rezydencję gubernatora i porozmawiaj z nim, aby otrzymać nagrodę",Encontre a mansão do Governador e fale com ele para pegar a sua recompensa.,,Găsește complexul Guvernatorului și vorbește cu el pentru a-ți lua recompensa.,Пройди в особняк губернатора и обсуди с Морелом своё вознаграждение.,,Hitta guvernörens herrgård och prata med guvernören för att få din belöning.,Vali'nin konağını bulun ve ödülünüzü almak için Vali ile konuşun +Congratulations! You have earned our gratitude. Visit the medic and weapons trainer and they will get you ready for what lies ahead. Feel free to wander around within the base.,TXT_ILOG1201,,,,"Gratulujeme! Získal sis naši vděčnost. Navštiv lékaře a učitele střelby a oni tě připraví na to, co číhá dál. Klidně se potloukej po základně.","Tillykke med det! Du har fortjent vores taknemmelighed. Besøg lægen og våbentræneren, og de vil gøre dig klar til det, der venter forude. Du er velkommen til at vandre rundt i basen.","Gratulation. Du hast dir unsere Dankbarkeit verdient. Suche den Sanitäter und den Waffentrainer auf, sie werden dich auf das was vor dir liegt, vorbereiten. Wenn du willst, schau dich in der Basis um.",,,¡Enhorabuena! Te has ganado nuestra gratitud. Visita al médico y al entrenador de armas y te prepararán para lo que viene en adelante. Sé libre de dar un paseo por la base.,¡Felicitaciones! Te ganaste nuestra gratitud. Visita al médico y al entrenador de armas y ellos te dejarán listo para lo que sigue. Sientete libre de andar através de la base.,"Onneksi olkoon! Olet ansainnut kiitollisuutemme. Vieraile lääkintämiehen ja asekouluttajan luona, ja he valmistavat sinut tuleviin koitoksiin. Saat vapaasti kulkea tukikohdan sisällä.",Félicitations! Vous méritez notre gratitude. Allez voir le médecin et le maître d'armes et ils pourront vous préparer pour ce qu'il va suivre. Vous pouvez faire le tour de la base si vous le souhaitez.,,"Gratulálok! Kiérdemled a hálánkat! keresd fel a szanitécet és a fegyvermestert, és felkészítenek az előtted álló harcra. Nyugodtan nézz körbe a bázisban.",Congratulazioni! Meriti appieno la nostra gratitudine. Visita il medico e l'addestratore di armi e ti prepareranno per ciò che ci aspetta. Sii anche libero di andare in giro per la base.,"おめでとう!私達は貴方に感謝している。 メディックと武器トレーナーに訪れれば手助けを施せる。 基地内部も自由に回ってよい。",축하해! 우리 모두 너에게 고마워하고 있어. 의무관과 무기 담당관을 찾아가면 너에게 보답을 할 준비를 할 거야. 그 후엔 기지를 마음껏 돌아다녀 봐!,Gefeliciteerd! Je hebt onze dankbaarheid verdiend. Bezoek de medicus- en wapentrainer en zij zullen je klaarstomen voor wat je te wachten staat. Voel je vrij om rond te dwalen in de basis.,"Gratulerer! Du har fortjent vår takknemlighet. Besøk medisineren og våpentreneren, og de vil gjøre deg klar for det som ligger foran deg. Føl deg fri til å vandre rundt i basen.","Gratulacje!!! Zasłużyłeś na naszą wdzięczność. Odwiedź medyka i trenera broni, a oni przygotują Cię na to, co Cię czeka. Możesz swobodnie poruszać się po bazie.",Parabéns! Você conquistou a nossa gratidão. Visite o médico e o treinador de armas e eles vão te preparar para o que vem adiante. Sinta-se livre para passear pela base.,,Felicitări! Ne-ai câștigat recunoștiința. Vizitează medicul și antrenorul de arme și te vor pregătii pentru ceea ce urmează mai departe. Simte-te liber să te plimbi prin bază.,"Поздравляем! Ты заслужил нашу благодарность. Зайди к медику и инструктору по стрельбе, и они подготовят тебя к тому, что ждёт тебя впереди. Теперь ты можешь свободно передвигаться по нашей базе.",,Gratulerar! Du har förtjänat vår tacksamhet. Besök sjukvårdaren och vapentränaren och de kommer att göra dig redo för vad som väntar dig. Du får gärna vandra runt i basen.,"Tebrikler! Minnettarlığımızı kazandınız. Sıhhiyeyi ve silah eğitmenini ziyaret edin, onlar sizi ileride olacaklara hazırlayacaktır. Üs içinde dolaşmaktan çekinmeyin." -,,Strife characters,,,,,,,,,,,,,,,,,,,,,,,,, -Order Sergeant,TXT_SPEAKER_ORDER_SERGEANT,,,,Seržant Řádu,Ordenens sergent,Soldat des Ordens,,Serĝento de La Ordeno,Sargento de La Orden,,Veljeskunnan kersantti,Sergeant de l'Ordre,Rendi Törzsőrmester,Sergente dell'Ordine,オーダー軍曹,오더 장교,Soldaat van de orde,Ordenssersjant,Sierżant Zakonu,Sargento da Ordem,,Sergent al Ordinului,Сержант Ордена,,Sergeant på orden,Emir Çavuşu -Rowan,TXT_SPEAKER_ROWAN,,,,,,,,,,,,,,,ロワン,로언,,,,,,,Роуэн,,, -Feris,TXT_SPEAKER_FERIS,,,,,,,,Feriso,,,,,,,フェリス,페리스,,,,,,,Ферис,,, -Prison Guard,TXT_SPEAKER_PRISON_GUARD,,,,Vězeňská stráž,Fængselsbetjent,Gefängniswache,,Mallibereja gardisto,Guardia de la prisión,,Vanginvartija,Garde de la Prison,Börtönőr,Guardia della Prigione,刑務官,간수,Gevangenisbewaker,Fengselsvakt,Strażnik Więzienny,Guarda da Prisão,,Gardian Închisoare,"Страж тюрьмы +,,Strife characters,,,,,,,,,,,,,,,,,,,,,,,,,, +Order Sergeant,TXT_SPEAKER_ORDER_SERGEANT,,,,Seržant Řádu,Ordenens sergent,Soldat des Ordens,,Serĝento de La Ordeno,Sargento de La Orden,,Veljeskunnan kersantti,Sergeant de l'Ordre,,Rendi Törzsőrmester,Sergente dell'Ordine,オーダー軍曹,오더 장교,Soldaat van de orde,Ordenssersjant,Sierżant Zakonu,Sargento da Ordem,,Sergent al Ordinului,Сержант Ордена,,Sergeant på orden,Emir Çavuşu +Rowan,TXT_SPEAKER_ROWAN,,,,,,,,,,,,,,,,ロワン,로언,,,,,,,Роуэн,,, +Feris,TXT_SPEAKER_FERIS,,,,,,,,Feriso,,,,,,,,フェリス,페리스,,,,,,,Ферис,,, +Prison Guard,TXT_SPEAKER_PRISON_GUARD,,,,Vězeňská stráž,Fængselsbetjent,Gefängniswache,,Mallibereja gardisto,Guardia de la prisión,,Vanginvartija,Garde de la Prison,,Börtönőr,Guardia della Prigione,刑務官,간수,Gevangenisbewaker,Fengselsvakt,Strażnik Więzienny,Guarda da Prisão,,Gardian Închisoare,"Страж тюрьмы ",,Fångvakt,Hapishane Gardiyanı -Justin,TXT_SPEAKER_JUSTIN,,,,,,,,,,,,,,,ジャスティン,저스틴,,,,,,,Джастин,,, -Macil,TXT_SPEAKER_MACIL,,,,,,,,,,,,,,,マシル,마실,,,,,,,Мэйсил,,, -Assistant,TXT_SPEAKER_ASSISTANT,,,,Asistent,Assistent,Assistent,,Asistanto,Asistente,,Avustaja,,Asszisztens,Assistente,アシスタント,조수,Assistent,Assistent,Asystent,Assistente,,Asistent,Ассистент,,Assistent,Asistan -Key Master,TXT_SPEAKER_KEY_MASTER,,,,Klíčník,Nøglemester,Schlüsselmeister,,Ŝlosilestro,Amo de llaves,,Avainmestari,Maître des Clés,Kulcsmester,Mastro delle chiavi,キーマスター,열쇠지기,Zeer belangrijke Meester,Nøkkelmester,Klucznik,Mestre das Chaves,,Stăpân al Cheilor,Ключник,,Nyckelmästare,Anahtar Ustası -Bodyguard,TXT_SPEAKER_BODYGUARD,,,,Osobní stráž,Livvagt,Leibwächter,,Korpogardisto,Guardaespaldas,,Henkivartija,Garde du corps,Testőr,Guardia del corpo,ボディガード,경호원,Lijfwacht,Livvakt,Ochroniarz,Guarda-costas,,Gardă de Corp,Телохранитель,,Livvakt, -Interrogator,TXT_SPEAKER_INTERROGATOR,"Intended to appear in MAP01 of the Strife teaser, but does not spawn.",,,Vyslýchač,Forhørsleder,Befrager,,Pridemandisto,Interrogador,,Kuulustelija,Interrogateur,Kihallgató,Interrogatore,,심문자,Ondervrager,Avhører,Śledczy,Interrogador,,Interogator,Дознаватель,,Förhörsledare,Sorgulayıcı -Warden Montag,TXT_SPEAKER_WARDEN_MONTAG,,,,Dozorce Montag,Direktør Montag,Direktor Montag,,Provoso Montag,Carcelero Montag,,Vankilanjohtaja Montag,Gardien Montag,Montag börtönigazgató,Direttore Montag,モンターグ刑務所長,몬탕 간수장,Directeur Montag,Direktør Montag,Naczelnik Montag,Carcereiro Montag,,Directorul Montag,Тюремщик Монтаг,,Direktör Montag,Müdür Montag -Richter,TXT_SPEAKER_RICHTER,,,,,,,,Rikter,,,,,,,リヒター,릭터,,,,,,,Рихтер,,, -Macil's Advisor,TXT_SPEAKER_MACIL_S_ADVISOR,,,Macil's Adviser,Macilův rádce,Macils rådgiver,Macils Berater,,Konsilisto de Macil,Consejero de Macil,,Macilin neuvonantaja,Conseiller de Macil,Macil tanácsosa,Consigliere di Macil,マシルの補佐官,마실의 조언자,Macil's adviseur,Macils rådgiver,Doradca Macila,Conselheiro de Macil,,Sfetnicul lui Macil,Советник Мэйсила,,Macils rådgivare,Macil'in Danışmanı -Judge Wolenick,TXT_SPEAKER_JUDGE_WOLENICK,,,,Soudce Wolenick,Dommer Wolenick,Richter Wolenick,,Juĝisto Wolenick,Juez Wolenick,,Tuomari Wolenick,Juge Wolenick,Wolenick bíró,Giudice Wolenick,ウォレニック裁判官,울레닉 판사,Rechter Wolenick,Dommer Wolenick,Sędzia Wolenick,Juiz Wolenick,,Judecătorul Wolenick,Судья Уолник,,Domare Wolenick,Yargıç Wolenick -Tevick,TXT_SPEAKER_TEVICK,,,,,,,,,,,,,,,テビック,테빅,,,,,,,Тевик,,,Tevak -Harris,TXT_SPEAKER_HARRIS,,,,,,,,Harriso,,,,,,,ハリス,해리스,,,,,,,Харрис,,, -Foreman,TXT_SPEAKER_FOREMAN,,,,Předák,Formand,Vormann,,Submastro,Capataz,,Työnjohtaja,Contremaître,Művezető,Caposquadra,フォアマン,감시원,Voorman,Formann,Brygadzista,Capataz,,,Бригадир,,Förman,Ustabaşı -Prisoner,TXT_SPEAKER_PRISONER,,,,Vězeň,Fange,Gefangener,,Kaptito,Prisionero,,Vanki,Prisonnier,Rab,Prigioniero,囚人,죄수,Gevangene,Fange,Więzień,Prisioneiro,,Prizonier,Пленник,,Fånge,Mahkum -Sammis,TXT_SPEAKER_SAMMIS,,,,,,,,,,,,,,,サムミス,새미스,,,,,,,Сэммис,,, -Weapon Smith,TXT_SPEAKER_WEAPON_SMITH,,,,Zbrojíř,Våbensmed,Waffenschmied,,Armilforĝisto,Forjador de armas,,Aseseppä,Armurier,Fegyverkovács,Fabbro d'Armi,武器工,무기제조인,Wapen Smith,Våpensmed,Wytwórca Broni,Armeiro,,Făurar Arme,Оружейник,,Vapen Smith,Silah Ustası -Reactor Guard,TXT_SPEAKER_REACTOR_GUARD,,,,Stráž reaktoru,Reaktorvagt,Reaktorwache,,Reaktora gardisto,Guardia del reactor,,Reaktorinvartija,Garde du réacteur,Reaktor Őr,Guardia del Reattore,リアクターガード,발전소 경비원,Reactor bewaker,Reaktorvakt,Strażnik Reaktora,Guarda do Reator,,Gardian Reactor,Страж реактора,,Reaktorvakt,Reaktör Muhafızı -Apprentice,TXT_SPEAKER_APPRENTICE,,,,Učeň,Lærling,Lehrling,,Komencanto,Aprendiz,,Kisälli,Apprenti,Tanonc,Apprendista,見習い,도제,Leerling,Lærling,Uczeń,Aprendiz,,Ucenic,Подмастерье,,Lärling,Çırak -Door Guard,TXT_SPEAKER_DOOR_GUARD,,,,Dveřní stráž,Dørvagt,Türwache,,Pordisto,Portero,,Ovenvartija,Garde de la porte,Ajtónálló,Guardia della Porta,ドアガード,문지기,Deurwacht,Dørvakt,Strażnik Drzwi,Guarda da Porta,,Paznic,Страж входа,,Dörrvakt,Kapı Koruması -Master Smithy,TXT_SPEAKER_MASTER_SMITHY,,,,Mistr Smithy,Mester Smithy,Meister Smithy,,Majstro Smithy,Maestro Smithy,,Pajamestari,Maître Forgeron,Smithy mester,Maestro Smithy,マスター スミシー,스미시 제조장관,Meester Smithy,Mester Smithy,Mistrz Smithy,Mestre Smithy,,Maestrul Smithy,Мастер-кузнец,,Mästersmeden,Demirci Usta -Warehouse Guard,TXT_SPEAKER_WAREHOUSE_GUARD,,,,Stráž skladu,Lagervagt,Lagerhaus-Wache,,Magazena gardisto,Guardia del almacén,,Varastonvartija,Garde de l'entrepôt,Raktár Őr,Guardia del Magazzino,倉庫のガード,격납고 감시장,Magazijnwachter,Lagervakt,Strażnik Magazynu,Guarda do Depósito,,Paznic Depozit,Охранник склада,,Lagervakt,Depo Görevlisi -Barkeep,TXT_SPEAKER_BARKEEP,,,,Barman,Bartender,Wirt,,Drinkejestro,Tabernero,,Baarimikko,Barman,Bárpultos,Barman,バーテンダー,바텐더,Barman,Bartender,Barman,Taberneiro,,Barman,Хозяин таверны,,Bartender,Barmen -Timothy,TXT_SPEAKER_TIMOTHY,,,,,,,,Timoteo,,,,,,,ティモシー,티모시,,,,,,Timotei,Тимоти,,,Timothy -James,TXT_SPEAKER_JAMES,,,,,,,,,,,,,,,ジェームス,제임스,,,,,,,Джеймс,,, -Worner,TXT_SPEAKER_WORNER,,,,,,,,,,,,,,,ワーナー,워너,,,,,,,Уорнэр,,, -Bailey Guard,TXT_SPEAKER_BAILEY_GUARD,,,,Stráž opevnění,Bailey-vagt,Vorhof-Wache,,Gardisto de la fortresa korto,Guardia del patio cerrado,,Ulkomuurinvartija,Garde d'enceinte,Várfal Őr,Guardia del Bastione,ベイリー ガード,외벽 파수병,,Borggården vakt,Strażnik Murów,Guarda da Fortaleza,,Gardian Bailey,Страж крепости,,Bailey-vakt,Dış avlu bekçisi -Drone,TXT_SPEAKER_DRONE,drone ≈ slave,,,Trubec,,Drohne,,Sklavo,Esclavo,,Kuhnuri,,Drón,Schiavo,労働者,노예,,,Dron,Escravo,,Dronă,Дрон,,Drönare, -Front Guard,TXT_SPEAKER_FRONT_GUARD,,,,Stráž Fronty,Front vagt,Frontwache,,Gardisto de la Fronto,Guardia del Frente,,Rintaman vartija,Garde du Front,Front Őr,Guardia del Fronte,フロント ガード,프론트 파수꾼,Voorwacht,,Strażnik Frontu,Guarda da Frente,,Gandian Front,Повстанец,,Frontvakt,Ön Koruma -Quincy,TXT_SPEAKER_QUINCY,,,,,,,,Kvincio,,,,,,,クインシー,퀸시,,,,,,,Куинси,,,Quincy -Sergeant,TXT_SPEAKER_SERGEANT,,,,Seržant,Sergent,Feldwebel,,Serĝento,Sargento,,Kersantti,,Törzsőrmester,Sergente,軍曹,하사관,,Sersjant,Sierżant,Sargento,,Sergent,Сержант,,Sergeant,Çavuş -Temple Guard,TXT_SPEAKER_TEMPLE_GUARD,,,,Stráž chrámu,Tempelvagt,Tempelwache,,Gardisto de la templo,Guardia del templo,,Temppelinvartija,Garde du Temple,Templom Őr,Guardia del Tempio,テンプル ガード,신전 파수병,Tempelwacht,Tempelvakten,Strażnik Świątyni,Guarda do Templo,,Gardian Templu,Страж храма,,Tempelvakt,Tapınak Muhafızı -Oracle,TXT_SPEAKER_ORACLE,,,,Věštec,Orakel,Orakel,,Orakolo,Oráculo,,Oraakkeli,,Orákulum,Oracolo,オラクル,오라클,Orakel,Orakel,Wyrocznia,Oráculo,,Oracol,Оракул,,Orakel,Kahin -Ulaine,TXT_SPEAKER_ULAINE,,,,,,,,,,,,,,,ウレーヌ,울레인,,,,,,,Улейн,,,Ulane -Front Soldier,TXT_SPEAKER_FRONT_SOLDIER,,,,Voják Fronty,Frontsoldat,Front-Soldat,,Soldato de la Fronto,Soldado del Frente,,Rintaman sotilas,Soldat du Front,Front Katona,Soldato del Fronte,フロント ソルジャー,프론트 저항군,,Frontsoldat,Żołnierz Frontu,Soldado da Frente,,Soldat Front,Повстанец,,Frontsoldat,Ön Asker -Programmer,TXT_SPEAKER_PROGRAMMER,,,,Programátor,Programmør,Programmierer,,Programisto,Programador,,Ohjelmoitsija,Programmeur,Programozó,Programmatore,プログラマー,프로그래머,Programmeur,Programmerer,Programista,Programador,,Programator,Программист,,Programmerare,Programcı -Medic,TXT_SPEAKER_MEDIC,,,,Zdravotník,Læge,Sanitäter,,Kuracisto,Médico,,Lääkintämies,Médecin,Szanitéc,Medico,メディック,의무병,Paramedicus,Sanitetssoldat,Medyk,Médico,,,Медик,,Sjukvårdare, -Watchman,TXT_SPEAKER_WATCHMAN,,,,Hlídač,Vagtmand,Wächter,,Gardisto,Guardia,,Vahti,Vigie,Őrszem,Vigilante,警備員,감시병,Waker,Vaktmann,Stróż,Vigia,,Străjer,Караульный,,Väktare,Bekçi -Ketrick,TXT_SPEAKER_KETRICK,,,,,,,,,,,,,,,ケトリック,케트릭,,,,,,,Кетрик,,, -Weran,TXT_SPEAKER_WERAN,,,,,,,,,,,,,,,ウェラン,워렌,,,,,,,Уэран,,, -Advisor,TXT_SPEAKER_ADVISOR,,,Adviser,Rádce,Rådgiver,Berater,,Konsilisto,Consejero,,Neuvonantaja,Conseiller,Tanácsadó,Consigliere,補佐官,조언자,Adviseur,Rådgiver,Doradca,Conselheiro,,Sfetnic,Советник,,Rådgivare,Danışman -Geoff,TXT_SPEAKER_GEOFF,,,,,,,,,,,,,,,ジェフ,제프,,,,,,,Джефф,,,Geoff -Overseer,TXT_SPEAKER_OVERSEER,,,,Dozorčí,Tilsynsførende,Aufseher,,Inspektisto,Supervisor,,Valvoja,Superviseur,Munkavezető,Supervisore,監視人,현장 감독,Opziener,Oppsynsmann,Nadzorca,Supervisor,,Supraveghetor,Надсмотрщик,,Övervakare,Gözetmen +Justin,TXT_SPEAKER_JUSTIN,,,,,,,,,,,,,,,,ジャスティン,저스틴,,,,,,,Джастин,,, +Macil,TXT_SPEAKER_MACIL,,,,,,,,,,,,,,,,マシル,마실,,,,,,,Мэйсил,,, +Assistant,TXT_SPEAKER_ASSISTANT,,,,Asistent,Assistent,Assistent,,Asistanto,Asistente,,Avustaja,,,Asszisztens,Assistente,アシスタント,조수,Assistent,Assistent,Asystent,Assistente,,Asistent,Ассистент,,Assistent,Asistan +Key Master,TXT_SPEAKER_KEY_MASTER,,,,Klíčník,Nøglemester,Schlüsselmeister,,Ŝlosilestro,Amo de llaves,,Avainmestari,Maître des Clés,,Kulcsmester,Mastro delle chiavi,キーマスター,열쇠지기,Zeer belangrijke Meester,Nøkkelmester,Klucznik,Mestre das Chaves,,Stăpân al Cheilor,Ключник,,Nyckelmästare,Anahtar Ustası +Bodyguard,TXT_SPEAKER_BODYGUARD,,,,Osobní stráž,Livvagt,Leibwächter,,Korpogardisto,Guardaespaldas,,Henkivartija,Garde du corps,,Testőr,Guardia del corpo,ボディガード,경호원,Lijfwacht,Livvakt,Ochroniarz,Guarda-costas,,Gardă de Corp,Телохранитель,,Livvakt, +Interrogator,TXT_SPEAKER_INTERROGATOR,"Intended to appear in MAP01 of the Strife teaser, but does not spawn.",,,Vyslýchač,Forhørsleder,Befrager,,Pridemandisto,Interrogador,,Kuulustelija,Interrogateur,,Kihallgató,Interrogatore,,심문자,Ondervrager,Avhører,Śledczy,Interrogador,,Interogator,Дознаватель,,Förhörsledare,Sorgulayıcı +Warden Montag,TXT_SPEAKER_WARDEN_MONTAG,,,,Dozorce Montag,Direktør Montag,Direktor Montag,,Provoso Montag,Carcelero Montag,,Vankilanjohtaja Montag,Gardien Montag,,Montag börtönigazgató,Direttore Montag,モンターグ刑務所長,몬탕 간수장,Directeur Montag,Direktør Montag,Naczelnik Montag,Carcereiro Montag,,Directorul Montag,Тюремщик Монтаг,,Direktör Montag,Müdür Montag +Richter,TXT_SPEAKER_RICHTER,,,,,,,,Rikter,,,,,,,,リヒター,릭터,,,,,,,Рихтер,,, +Macil's Advisor,TXT_SPEAKER_MACIL_S_ADVISOR,,,Macil's Adviser,Macilův rádce,Macils rådgiver,Macils Berater,,Konsilisto de Macil,Consejero de Macil,,Macilin neuvonantaja,Conseiller de Macil,,Macil tanácsosa,Consigliere di Macil,マシルの補佐官,마실의 조언자,Macil's adviseur,Macils rådgiver,Doradca Macila,Conselheiro de Macil,,Sfetnicul lui Macil,Советник Мэйсила,,Macils rådgivare,Macil'in Danışmanı +Judge Wolenick,TXT_SPEAKER_JUDGE_WOLENICK,,,,Soudce Wolenick,Dommer Wolenick,Richter Wolenick,,Juĝisto Wolenick,Juez Wolenick,,Tuomari Wolenick,Juge Wolenick,,Wolenick bíró,Giudice Wolenick,ウォレニック裁判官,울레닉 판사,Rechter Wolenick,Dommer Wolenick,Sędzia Wolenick,Juiz Wolenick,,Judecătorul Wolenick,Судья Уолник,,Domare Wolenick,Yargıç Wolenick +Tevick,TXT_SPEAKER_TEVICK,,,,,,,,,,,,,,,,テビック,테빅,,,,,,,Тевик,,,Tevak +Harris,TXT_SPEAKER_HARRIS,,,,,,,,Harriso,,,,,,,,ハリス,해리스,,,,,,,Харрис,,, +Foreman,TXT_SPEAKER_FOREMAN,,,,Předák,Formand,Vormann,,Submastro,Capataz,,Työnjohtaja,Contremaître,,Művezető,Caposquadra,フォアマン,감시원,Voorman,Formann,Brygadzista,Capataz,,,Бригадир,,Förman,Ustabaşı +Prisoner,TXT_SPEAKER_PRISONER,,,,Vězeň,Fange,Gefangener,,Kaptito,Prisionero,,Vanki,Prisonnier,,Rab,Prigioniero,囚人,죄수,Gevangene,Fange,Więzień,Prisioneiro,,Prizonier,Пленник,,Fånge,Mahkum +Sammis,TXT_SPEAKER_SAMMIS,,,,,,,,,,,,,,,,サムミス,새미스,,,,,,,Сэммис,,, +Weapon Smith,TXT_SPEAKER_WEAPON_SMITH,,,,Zbrojíř,Våbensmed,Waffenschmied,,Armilforĝisto,Forjador de armas,,Aseseppä,Armurier,,Fegyverkovács,Fabbro d'Armi,武器工,무기제조인,Wapen Smith,Våpensmed,Wytwórca Broni,Armeiro,,Făurar Arme,Оружейник,,Vapen Smith,Silah Ustası +Reactor Guard,TXT_SPEAKER_REACTOR_GUARD,,,,Stráž reaktoru,Reaktorvagt,Reaktorwache,,Reaktora gardisto,Guardia del reactor,,Reaktorinvartija,Garde du réacteur,,Reaktor Őr,Guardia del Reattore,リアクターガード,발전소 경비원,Reactor bewaker,Reaktorvakt,Strażnik Reaktora,Guarda do Reator,,Gardian Reactor,Страж реактора,,Reaktorvakt,Reaktör Muhafızı +Apprentice,TXT_SPEAKER_APPRENTICE,,,,Učeň,Lærling,Lehrling,,Komencanto,Aprendiz,,Kisälli,Apprenti,,Tanonc,Apprendista,見習い,도제,Leerling,Lærling,Uczeń,Aprendiz,,Ucenic,Подмастерье,,Lärling,Çırak +Door Guard,TXT_SPEAKER_DOOR_GUARD,,,,Dveřní stráž,Dørvagt,Türwache,,Pordisto,Portero,,Ovenvartija,Garde de la porte,,Ajtónálló,Guardia della Porta,ドアガード,문지기,Deurwacht,Dørvakt,Strażnik Drzwi,Guarda da Porta,,Paznic,Страж входа,,Dörrvakt,Kapı Koruması +Master Smithy,TXT_SPEAKER_MASTER_SMITHY,,,,Mistr Smithy,Mester Smithy,Meister Smithy,,Majstro Smithy,Maestro Smithy,,Pajamestari,Maître Forgeron,,Smithy mester,Maestro Smithy,マスター スミシー,스미시 제조장관,Meester Smithy,Mester Smithy,Mistrz Smithy,Mestre Smithy,,Maestrul Smithy,Мастер-кузнец,,Mästersmeden,Demirci Usta +Warehouse Guard,TXT_SPEAKER_WAREHOUSE_GUARD,,,,Stráž skladu,Lagervagt,Lagerhaus-Wache,,Magazena gardisto,Guardia del almacén,,Varastonvartija,Garde de l'entrepôt,,Raktár Őr,Guardia del Magazzino,倉庫のガード,격납고 감시장,Magazijnwachter,Lagervakt,Strażnik Magazynu,Guarda do Depósito,,Paznic Depozit,Охранник склада,,Lagervakt,Depo Görevlisi +Barkeep,TXT_SPEAKER_BARKEEP,,,,Barman,Bartender,Wirt,,Drinkejestro,Tabernero,,Baarimikko,Barman,,Bárpultos,Barman,バーテンダー,바텐더,Barman,Bartender,Barman,Taberneiro,,Barman,Хозяин таверны,,Bartender,Barmen +Timothy,TXT_SPEAKER_TIMOTHY,,,,,,,,Timoteo,,,,,,,,ティモシー,티모시,,,,,,Timotei,Тимоти,,,Timothy +James,TXT_SPEAKER_JAMES,,,,,,,,,,,,,,,,ジェームス,제임스,,,,,,,Джеймс,,, +Worner,TXT_SPEAKER_WORNER,,,,,,,,,,,,,,,,ワーナー,워너,,,,,,,Уорнэр,,, +Bailey Guard,TXT_SPEAKER_BAILEY_GUARD,,,,Stráž opevnění,Bailey-vagt,Vorhof-Wache,,Gardisto de la fortresa korto,Guardia del patio cerrado,,Ulkomuurinvartija,Garde d'enceinte,,Várfal Őr,Guardia del Bastione,ベイリー ガード,외벽 파수병,,Borggården vakt,Strażnik Murów,Guarda da Fortaleza,,Gardian Bailey,Страж крепости,,Bailey-vakt,Dış avlu bekçisi +Drone,TXT_SPEAKER_DRONE,drone ≈ slave,,,Trubec,,Drohne,,Sklavo,Esclavo,,Kuhnuri,,,Drón,Schiavo,労働者,노예,,,Dron,Escravo,,Dronă,Дрон,,Drönare, +Front Guard,TXT_SPEAKER_FRONT_GUARD,,,,Stráž Fronty,Front vagt,Frontwache,,Gardisto de la Fronto,Guardia del Frente,,Rintaman vartija,Garde du Front,,Front Őr,Guardia del Fronte,フロント ガード,프론트 파수꾼,Voorwacht,,Strażnik Frontu,Guarda da Frente,,Gandian Front,Повстанец,,Frontvakt,Ön Koruma +Quincy,TXT_SPEAKER_QUINCY,,,,,,,,Kvincio,,,,,,,,クインシー,퀸시,,,,,,,Куинси,,,Quincy +Sergeant,TXT_SPEAKER_SERGEANT,,,,Seržant,Sergent,Feldwebel,,Serĝento,Sargento,,Kersantti,,,Törzsőrmester,Sergente,軍曹,하사관,,Sersjant,Sierżant,Sargento,,Sergent,Сержант,,Sergeant,Çavuş +Temple Guard,TXT_SPEAKER_TEMPLE_GUARD,,,,Stráž chrámu,Tempelvagt,Tempelwache,,Gardisto de la templo,Guardia del templo,,Temppelinvartija,Garde du Temple,,Templom Őr,Guardia del Tempio,テンプル ガード,신전 파수병,Tempelwacht,Tempelvakten,Strażnik Świątyni,Guarda do Templo,,Gardian Templu,Страж храма,,Tempelvakt,Tapınak Muhafızı +Oracle,TXT_SPEAKER_ORACLE,,,,Věštec,Orakel,Orakel,,Orakolo,Oráculo,,Oraakkeli,,,Orákulum,Oracolo,オラクル,오라클,Orakel,Orakel,Wyrocznia,Oráculo,,Oracol,Оракул,,Orakel,Kahin +Ulaine,TXT_SPEAKER_ULAINE,,,,,,,,,,,,,,,,ウレーヌ,울레인,,,,,,,Улейн,,,Ulane +Front Soldier,TXT_SPEAKER_FRONT_SOLDIER,,,,Voják Fronty,Frontsoldat,Front-Soldat,,Soldato de la Fronto,Soldado del Frente,,Rintaman sotilas,Soldat du Front,,Front Katona,Soldato del Fronte,フロント ソルジャー,프론트 저항군,,Frontsoldat,Żołnierz Frontu,Soldado da Frente,,Soldat Front,Повстанец,,Frontsoldat,Ön Asker +Programmer,TXT_SPEAKER_PROGRAMMER,,,,Programátor,Programmør,Programmierer,,Programisto,Programador,,Ohjelmoitsija,Programmeur,,Programozó,Programmatore,プログラマー,프로그래머,Programmeur,Programmerer,Programista,Programador,,Programator,Программист,,Programmerare,Programcı +Medic,TXT_SPEAKER_MEDIC,,,,Zdravotník,Læge,Sanitäter,,Kuracisto,Médico,,Lääkintämies,Médecin,,Szanitéc,Medico,メディック,의무병,Paramedicus,Sanitetssoldat,Medyk,Médico,,,Медик,,Sjukvårdare, +Watchman,TXT_SPEAKER_WATCHMAN,,,,Hlídač,Vagtmand,Wächter,,Gardisto,Guardia,,Vahti,Vigie,,Őrszem,Vigilante,警備員,감시병,Waker,Vaktmann,Stróż,Vigia,,Străjer,Караульный,,Väktare,Bekçi +Ketrick,TXT_SPEAKER_KETRICK,,,,,,,,,,,,,,,,ケトリック,케트릭,,,,,,,Кетрик,,, +Weran,TXT_SPEAKER_WERAN,,,,,,,,,,,,,,,,ウェラン,워렌,,,,,,,Уэран,,, +Advisor,TXT_SPEAKER_ADVISOR,,,Adviser,Rádce,Rådgiver,Berater,,Konsilisto,Consejero,,Neuvonantaja,Conseiller,,Tanácsadó,Consigliere,補佐官,조언자,Adviseur,Rådgiver,Doradca,Conselheiro,,Sfetnic,Советник,,Rådgivare,Danışman +Geoff,TXT_SPEAKER_GEOFF,,,,,,,,,,,,,,,,ジェフ,제프,,,,,,,Джефф,,,Geoff +Overseer,TXT_SPEAKER_OVERSEER,,,,Dozorčí,Tilsynsførende,Aufseher,,Inspektisto,Supervisor,,Valvoja,Superviseur,,Munkavezető,Supervisore,監視人,현장 감독,Opziener,Oppsynsmann,Nadzorca,Supervisor,,Supraveghetor,Надсмотрщик,,Övervakare,Gözetmen Security Comple,TXT_SPEAKER_SECURITY_COMPLE,"Intended to appear in MAP19, but does not spawn. -",,,,Sikkerhedskomplet,Wache,,Gardisto de la sekurkomplekso,Guardia del complejo,,Turvamies,Sécurité,Védelmi Kvártély,Guardia del Complesso di Sicurezza,,경비원,Bewaker,Security Comple,Ochroniarz Kompleksu,Vigia,,Paznic Complex de Securitate,Охранник комплекса,,Säkerhetskompetens,Güvenlik Comple -Computer Tech,TXT_SPEAKER_COMPUTER_TECH,,,,Počítačový technik,,Computertechniker,,Komputilisto,Técnico de sistemas,,Tietokoneteknikko,Technicien Informatique,Számítógép Tech,Tecnico Informatico,機械技術者,컴퓨터 기술자,Computertechniek,Datatekniker,Technik Komputerowy,Técnico de Informática,,Tehnician Calculatoare,Компьютерный техник,,Datortekniker,Bilgisayar Teknolojisi -MacGuffin,TXT_SPEAKER_MACGUFFIN,,,,,,,,Makgufino,,,,,,,マクガフィン,맥거핀,,,,,,,Макгаффин,,, -Arion,TXT_SPEAKER_ARION,,,,,,,,,,,,,,,アリオン,아리온,,,,,,,Арион,,,Aron -Dock Worker,TXT_SPEAKER_DOCK_WORKER,,,,Přístavní dělník,Dokarbejder,Dockarbeiter,,Stivisto,Estibador,,Ahtaaja,Docker,Dokk munkás,Operaio Portuale,港湾労働者,항구 일꾼,Dokwerker,Havnearbeider,Pracownik Doku,Operário da Doca,,Muncitor Docuri,Рабочий дока,,Hamnarbetare,Liman İşçisi -Irale,TXT_SPEAKER_IRALE,,,,,,,,,,,,,,,イラール,이롤리,,,,,,,Ирэйл,,,İrale -Core Guard,TXT_SPEAKER_CORE_GUARD,,,,Stráž jádra,Kernevagt,Wache,,Gardisto de la kerno,Guardia del núcleo,,Ytimenvartija,Garde du cœur,Mag Őr,Guardia del Cuore,コア ガード,코어 경비병,Kernwacht,Kjernevakt,Strażnik Rdzenia,Guarda do Núcleo,,Gardian Nucleu,Страж ядра,,Kärnvårdsvakt,Çekirdek Koruma -Sewer Guard,TXT_SPEAKER_SEWER_GUARD,,,,Kanální stráž,Kloakvagt,Kanalisationswächter,,Gardisto de la kloako,Guardia de las alcantarillas,,Viemärinvartija,Garde des égouts,Kanális Őr,Guardia della Fogna,下水道ガード,하수도 보초병,Rioolwacht,Kloakkvakt,Strażnik Kanałów,Guarda do Esgoto,,Gardian Canal,Страж канализации,,Avloppsvakt,Kanalizasyon Görevlisi -Technician,TXT_SPEAKER_TECHNICIAN,,,,Technik,Tekniker,Techniker,,Teknikisto,Técnico,,Teknikko,Technicien,Technikus,Tecnico,技術者,기술자,Technicus,Tekniker,Technik,Técnico,,Tehnician,Техник,,Tekniker,Teknisyen -Guard,TXT_SPEAKER_GUARD,,,,Stráž,Vagt,Wache,,Gardisto,Guardia,,Vartija,Garde,Őr,Guardia,ガード,경비병,Bewaker,Vakt,Strażnik,Guarda,,Gardian,Стражник,,Väktare,Muhafız -Peasant,TXT_SPEAKER_PEASANT,,,,Rolník,Bonde,Einwohner,,Kamparano,Campesino,,Maallikko,Paysan,Jobbágy,Cittadino,庶民,민간인,Boer,Bonde,Kmiot,Cidadão,,Sărman,Работник,,Bonde,Köylü -Armorer,TXT_SPEAKER_ARMORER,,,Armourer,Kovář,Våbenmekaniker,Waffenmeister,,Armilisto,Armero,,Asemestari,Armurier,Fegyverkovács,Armiere,兵器係,병기공,Pantser,Væpner,Płatnerz,Forjador de Armaduras,,Armurier,Бронник,,Rusthållare,Zırhçı -Beldin,TXT_SPEAKER_BELDIN,,,,,,,,,,,,,,,ベルディン,벨딘,,,,,,,Белдин,,, -Gerard,TXT_SPEAKER_GERARD,,,,,,,,Gerardo,,,,,,,ジェラルド,제랄드,,,,,,,Джерард,,, -Governor Mourel,TXT_SPEAKER_GOVERNOR_MOUREL,,,,Guvernér Mourel,Guvernør Mourel,Gouverneur Mourel,,Registo Mourel,Gobernador Mourel,,Kuvernööri Mourel,Gouverneur Mourel,Mourel kormányzó,Governatore Mourel,モーレル知事,모렐 총독,Gouverneur Mourel,Guvernør Mourel,Gubernator Mourel,Governador Mourel,,Guvernatorul Mourel,Губернатор Морел,,Guvernör Mourel,Vali Mourel -Bowyer,TXT_SPEAKER_BOWYER,,,,,,,,,,,,,,,ボウヤー,보여,,,,,,,Лучник,,, -Derwin,TXT_SPEAKER_DERWIN,,,,,,,,,,,,,,,ダーウィン,더윈,,,,,,,Дервин,,, -,,Strife subtitles,,,,,,,,,,,,,,,,,,,,,,,,, -The comet struck our planet without warning. We lost our paradise in a single violent stroke.,TXT_SUB_INTRO1,Menu's intro.,,,"Kometa bez varování narazila do naší planety. Jediným, brutálním úderem jsme přišli o náš ráj.",Kometen ramte vores planet uden varsel. Vi mistede vores paradis i et enkelt voldsomt slag.,Der Komet hat unsen Planeten ohne Vorwarnung getroffen. Wir haben unser Paradies in einem einzelnen brutalen Schlag verloren.,,,El cometa se estrelló en nuestro planeta sin previo aviso. Perdimos nuestro paraíso en un único y violento golpe.,,Komeetta iski planeettaamme varoittamatta. Menetimme paratiisimme rajulla kertarysäyksellä.,"La comète frappa notre monde sans prévenir. En un seul moment de violence, nous avons perdu notre paradis.",Egy üstökös csapódott be a bolygónkba minden előjel nélkül. Egy heves vágással elveszítettük az addigi paradicsomi életünket.,"La cometa colpì il nostro pianeta senza preavviso. Perdemmo il nostro paradiso, in un solo violento colpo.",彗星がこの星に突然衝突した。私達の楽園はこの一撃で失われた。,혜성 하나가 아무런 경고도 없이 우리 행성에 충돌했다. 그 강력한 한 방으로 우리의 낙원을 잃어버렸다.,De komeet raakte onze planeet zonder waarschuwing. We verloren ons paradijs in een enkele gewelddadige beroerte.,Kometen traff planeten vår uten forvarsel. Vi mistet paradiset vårt med ett voldsomt slag.,Kometa uderzyła w naszą planetę bez ostrzeżenia. Straciliśmy nasz raj w jednym gwałtownym uderzeniu.,"O cometa atingiu o nosso planeta sem aviso prévio. Num único e violento golpe, nós perdemos o nosso paraíso.",,Cometa ne-a izbit planeta în mod violent. Ne-am pierdut paradisul într-o clipă.,"Никто не ожидал, что на нашу планету обрушится метеорит. Земной рай был разрушен единственным безжалостным ударом.",,Kometen träffade vår planet utan förvarning. Vi förlorade vårt paradis i ett enda våldsamt slag.,Kuyruklu yıldız gezegenimize uyarı vermeden çarptı. Cennetimizi tek bir şiddetli darbeyle kaybettik. -"The impact released a virus, which swept through the land and killed millions. They turned out to be the lucky ones.",TXT_SUB_INTRO2,〃,,,"Náraz vypustil virus, který se začal šířit krajem a zabil miliony lidí. Ukázalo se, že to byli ti šťastnější.","Sammenstødet frigjorde en virus, som fejede gennem landet og dræbte millioner af mennesker. De viste sig at være de heldige.","Der Einschlag setzte einen Virus frei, der durch das Land fegte und Millionen tötete. Sie hatten Glück.",,,"El impacto liberó un virus, el cual barrió la tierra y mató a millones. Resultaron ser los más afortunados.",,"Törmäys päästi valloilleen viruksen, joka pyyhkäisi halki maan ja tappoi miljoonia. He osoittautuivat kuuluneensa onnekkaiden joukkoon.","L'impact libéra un virus, qui traversa les contrées et tua des millions. Ceux qui moururent furent les plus chanceux.","A becsapódás egy vírust eresztett a világra, mely milliókat ölt meg. Ők voltak a szerencsésebbek.","L'impatto rilasciò un virus, spargendosi ovunque e uccidendo milioni. Quelli che morirono furono i più fortunati.","彗星の衝突によりウィルスが世界中に放たれ、数えきれないほどの人々が死んだ。 +",,,,Sikkerhedskomplet,Wache,,Gardisto de la sekurkomplekso,Guardia del complejo,,Turvamies,Sécurité,,Védelmi Kvártély,Guardia del Complesso di Sicurezza,,경비원,Bewaker,Security Comple,Ochroniarz Kompleksu,Vigia,,Paznic Complex de Securitate,Охранник комплекса,,Säkerhetskompetens,Güvenlik Comple +Computer Tech,TXT_SPEAKER_COMPUTER_TECH,,,,Počítačový technik,,Computertechniker,,Komputilisto,Técnico de sistemas,,Tietokoneteknikko,Technicien Informatique,,Számítógép Tech,Tecnico Informatico,機械技術者,컴퓨터 기술자,Computertechniek,Datatekniker,Technik Komputerowy,Técnico de Informática,,Tehnician Calculatoare,Компьютерный техник,,Datortekniker,Bilgisayar Teknolojisi +MacGuffin,TXT_SPEAKER_MACGUFFIN,,,,,,,,Makgufino,,,,,,,,マクガフィン,맥거핀,,,,,,,Макгаффин,,, +Arion,TXT_SPEAKER_ARION,,,,,,,,,,,,,,,,アリオン,아리온,,,,,,,Арион,,,Aron +Dock Worker,TXT_SPEAKER_DOCK_WORKER,,,,Přístavní dělník,Dokarbejder,Dockarbeiter,,Stivisto,Estibador,,Ahtaaja,Docker,,Dokk munkás,Operaio Portuale,港湾労働者,항구 일꾼,Dokwerker,Havnearbeider,Pracownik Doku,Operário da Doca,,Muncitor Docuri,Рабочий дока,,Hamnarbetare,Liman İşçisi +Irale,TXT_SPEAKER_IRALE,,,,,,,,,,,,,,,,イラール,이롤리,,,,,,,Ирэйл,,,İrale +Core Guard,TXT_SPEAKER_CORE_GUARD,,,,Stráž jádra,Kernevagt,Wache,,Gardisto de la kerno,Guardia del núcleo,,Ytimenvartija,Garde du cœur,,Mag Őr,Guardia del Cuore,コア ガード,코어 경비병,Kernwacht,Kjernevakt,Strażnik Rdzenia,Guarda do Núcleo,,Gardian Nucleu,Страж ядра,,Kärnvårdsvakt,Çekirdek Koruma +Sewer Guard,TXT_SPEAKER_SEWER_GUARD,,,,Kanální stráž,Kloakvagt,Kanalisationswächter,,Gardisto de la kloako,Guardia de las alcantarillas,,Viemärinvartija,Garde des égouts,,Kanális Őr,Guardia della Fogna,下水道ガード,하수도 보초병,Rioolwacht,Kloakkvakt,Strażnik Kanałów,Guarda do Esgoto,,Gardian Canal,Страж канализации,,Avloppsvakt,Kanalizasyon Görevlisi +Technician,TXT_SPEAKER_TECHNICIAN,,,,Technik,Tekniker,Techniker,,Teknikisto,Técnico,,Teknikko,Technicien,,Technikus,Tecnico,技術者,기술자,Technicus,Tekniker,Technik,Técnico,,Tehnician,Техник,,Tekniker,Teknisyen +Guard,TXT_SPEAKER_GUARD,,,,Stráž,Vagt,Wache,,Gardisto,Guardia,,Vartija,Garde,,Őr,Guardia,ガード,경비병,Bewaker,Vakt,Strażnik,Guarda,,Gardian,Стражник,,Väktare,Muhafız +Peasant,TXT_SPEAKER_PEASANT,,,,Rolník,Bonde,Einwohner,,Kamparano,Campesino,,Maallikko,Paysan,,Jobbágy,Cittadino,庶民,민간인,Boer,Bonde,Kmiot,Cidadão,,Sărman,Работник,,Bonde,Köylü +Armorer,TXT_SPEAKER_ARMORER,,,Armourer,Kovář,Våbenmekaniker,Waffenmeister,,Armilisto,Armero,,Asemestari,Armurier,,Fegyverkovács,Armiere,兵器係,병기공,Pantser,Væpner,Płatnerz,Forjador de Armaduras,,Armurier,Бронник,,Rusthållare,Zırhçı +Beldin,TXT_SPEAKER_BELDIN,,,,,,,,,,,,,,,,ベルディン,벨딘,,,,,,,Белдин,,, +Gerard,TXT_SPEAKER_GERARD,,,,,,,,Gerardo,,,,,,,,ジェラルド,제랄드,,,,,,,Джерард,,, +Governor Mourel,TXT_SPEAKER_GOVERNOR_MOUREL,,,,Guvernér Mourel,Guvernør Mourel,Gouverneur Mourel,,Registo Mourel,Gobernador Mourel,,Kuvernööri Mourel,Gouverneur Mourel,,Mourel kormányzó,Governatore Mourel,モーレル知事,모렐 총독,Gouverneur Mourel,Guvernør Mourel,Gubernator Mourel,Governador Mourel,,Guvernatorul Mourel,Губернатор Морел,,Guvernör Mourel,Vali Mourel +Bowyer,TXT_SPEAKER_BOWYER,,,,,,,,,,,,,,,,ボウヤー,보여,,,,,,,Лучник,,, +Derwin,TXT_SPEAKER_DERWIN,,,,,,,,,,,,,,,,ダーウィン,더윈,,,,,,,Дервин,,, +,,Strife subtitles,,,,,,,,,,,,,,,,,,,,,,,,,, +The comet struck our planet without warning. We lost our paradise in a single violent stroke.,TXT_SUB_INTRO1,Menu's intro.,,,"Kometa bez varování narazila do naší planety. Jediným, brutálním úderem jsme přišli o náš ráj.",Kometen ramte vores planet uden varsel. Vi mistede vores paradis i et enkelt voldsomt slag.,Der Komet hat unsen Planeten ohne Vorwarnung getroffen. Wir haben unser Paradies in einem einzelnen brutalen Schlag verloren.,,,El cometa se estrelló en nuestro planeta sin previo aviso. Perdimos nuestro paraíso en un único y violento golpe.,,Komeetta iski planeettaamme varoittamatta. Menetimme paratiisimme rajulla kertarysäyksellä.,"La comète frappa notre monde sans prévenir. En un seul moment de violence, nous avons perdu notre paradis.",,Egy üstökös csapódott be a bolygónkba minden előjel nélkül. Egy heves vágással elveszítettük az addigi paradicsomi életünket.,"La cometa colpì il nostro pianeta senza preavviso. Perdemmo il nostro paradiso, in un solo violento colpo.",彗星がこの星に突然衝突した。私達の楽園はこの一撃で失われた。,혜성 하나가 아무런 경고도 없이 우리 행성에 충돌했다. 그 강력한 한 방으로 우리의 낙원을 잃어버렸다.,De komeet raakte onze planeet zonder waarschuwing. We verloren ons paradijs in een enkele gewelddadige beroerte.,Kometen traff planeten vår uten forvarsel. Vi mistet paradiset vårt med ett voldsomt slag.,Kometa uderzyła w naszą planetę bez ostrzeżenia. Straciliśmy nasz raj w jednym gwałtownym uderzeniu.,"O cometa atingiu o nosso planeta sem aviso prévio. Num único e violento golpe, nós perdemos o nosso paraíso.",,Cometa ne-a izbit planeta în mod violent. Ne-am pierdut paradisul într-o clipă.,"Никто не ожидал, что на нашу планету обрушится метеорит. Земной рай был разрушен единственным безжалостным ударом.",,Kometen träffade vår planet utan förvarning. Vi förlorade vårt paradis i ett enda våldsamt slag.,Kuyruklu yıldız gezegenimize uyarı vermeden çarptı. Cennetimizi tek bir şiddetli darbeyle kaybettik. +"The impact released a virus, which swept through the land and killed millions. They turned out to be the lucky ones.",TXT_SUB_INTRO2,〃,,,"Náraz vypustil virus, který se začal šířit krajem a zabil miliony lidí. Ukázalo se, že to byli ti šťastnější.","Sammenstødet frigjorde en virus, som fejede gennem landet og dræbte millioner af mennesker. De viste sig at være de heldige.","Der Einschlag setzte einen Virus frei, der durch das Land fegte und Millionen tötete. Sie hatten Glück.",,,"El impacto liberó un virus, el cual barrió la tierra y mató a millones. Resultaron ser los más afortunados.",,"Törmäys päästi valloilleen viruksen, joka pyyhkäisi halki maan ja tappoi miljoonia. He osoittautuivat kuuluneensa onnekkaiden joukkoon.","L'impact libéra un virus, qui traversa les contrées et tua des millions. Ceux qui moururent furent les plus chanceux.",,"A becsapódás egy vírust eresztett a világra, mely milliókat ölt meg. Ők voltak a szerencsésebbek.","L'impatto rilasciò un virus, spargendosi ovunque e uccidendo milioni. Quelli che morirono furono i più fortunati.","彗星の衝突によりウィルスが世界中に放たれ、数えきれないほどの人々が死んだ。 今から考えれば、彼らはまだ運がいい方だった。","충돌의 여파로 바이러스가 사방에 퍼졌고, 이로 인해 수백만명이 목숨을 잃었다. 죽은 자들은 운이 좋은 자들이었다.","Door de inslag kwam er een virus vrij, dat door het land veegde en miljoenen doden veroorzaakte. Zij bleken de gelukkigen te zijn.",Nedslaget utløste et virus som feide gjennom landet og drepte millioner. De viste seg å være de heldige.,"Uderzenie uwolniło wirusa, który przetoczył się przez ziemię i zabił miliony. Okazało się, że byli to ci, którzy mieli szczęście.","O impacto liberou um vírus, que se espalhou pela terra e matou milhões. Esses foram os que tiveram sorte.",,"Impactul a lansat un virus, care a măturat pământul și omorât milioane. Aparent ei au fost cei norocoși.","Удар метеорита выпустил вирус, который пронёсся по землям и истребил миллионы людей. Умершие оказались счастливчиками.",,Genom nedslaget frigjordes ett virus som svepte genom landet och dödade miljontals människor. De visade sig vara de lyckligt lottade.,Çarpışmanın etkisiyle bir virüs salındı ve bu virüs tüm dünyayı kasıp kavurarak milyonları öldürdü. Onlar şanslı olanlardı. -"For those who did not die became mutations of humanity. Some became fanatics who heard the voice of a malignant god in their heads and called themselves ""the Order"".",TXT_SUB_INTRO3,〃,,,"Ti, kteří nezemřeli, se totiž stali lidskými mutanty. Někteří se proměnili ve fanatiky, kteří v hlavě začali slyšet hlas zlého boha, a začali si říkat „Řád“.","For de, der ikke døde, blev til mutationer af menneskeheden. Nogle blev fanatikere, der hørte en ondskabsfuld guds stemme i deres hoveder og kaldte sig selv ""Ordenen"".","Diejenigen, die nicht starben, wurden zu Mutanten der Menschheit. Einige wurden Fanatiker, die die Stimme eines bösartigen Gottes in ihrem Kopf hörten und sie nannten sich „Der Orden“.",,,"Ya que aquellos que no murieron se convirtieron en mutaciones de humanidad. Algunos se volvieron fanáticos que oían la voz de un dios maligno en sus cabezas y se hicieron llamar ""la Orden"".",,"Sillä niistä, jotka eivät kuolleet, tuli ihmiskunnan mutaatioita. Joistakin tuli kiihkoilijoita, jotka kuulivat päässään pahansuovan jumalan äänen ja kutsuivat itseään ""Veljeskunnaksi"".","Ceux qui survécurent devinrent les mutants de l'humanité. Certains devinrent des fanatiques qui écoutent la voix d'un dieu maléfique dans leur tête, et se nommèrent « L'Ordre ».","Akik nem haltak meg, emberi mutánsokká válltak. Voltak akik fanatikussá válltak, fejükbe hallották egy gonosz isten szavait, és a ""Rend"" néven hívták magukat.","Coloro che sopravvissero divennero i mutanti dell'umanità. Alcuni sono diventati fanatici che hanno ascoltato la voce di un dio malvagio nelle loro teste e si sono fatti chiamare ""L'Ordine"".","死ななかった人々は、人間から変異して別の物となった。 +"For those who did not die became mutations of humanity. Some became fanatics who heard the voice of a malignant god in their heads and called themselves ""the Order"".",TXT_SUB_INTRO3,〃,,,"Ti, kteří nezemřeli, se totiž stali lidskými mutanty. Někteří se proměnili ve fanatiky, kteří v hlavě začali slyšet hlas zlého boha, a začali si říkat „Řád“.","For de, der ikke døde, blev til mutationer af menneskeheden. Nogle blev fanatikere, der hørte en ondskabsfuld guds stemme i deres hoveder og kaldte sig selv ""Ordenen"".","Diejenigen, die nicht starben, wurden zu Mutanten der Menschheit. Einige wurden Fanatiker, die die Stimme eines bösartigen Gottes in ihrem Kopf hörten und sie nannten sich „Der Orden“.",,,"Ya que aquellos que no murieron se convirtieron en mutaciones de humanidad. Algunos se volvieron fanáticos que oían la voz de un dios maligno en sus cabezas y se hicieron llamar ""la Orden"".",,"Sillä niistä, jotka eivät kuolleet, tuli ihmiskunnan mutaatioita. Joistakin tuli kiihkoilijoita, jotka kuulivat päässään pahansuovan jumalan äänen ja kutsuivat itseään ""Veljeskunnaksi"".","Ceux qui survécurent devinrent les mutants de l'humanité. Certains devinrent des fanatiques qui écoutent la voix d'un dieu maléfique dans leur tête, et se nommèrent « L'Ordre ».",,"Akik nem haltak meg, emberi mutánsokká válltak. Voltak akik fanatikussá válltak, fejükbe hallották egy gonosz isten szavait, és a ""Rend"" néven hívták magukat.","Coloro che sopravvissero divennero i mutanti dell'umanità. Alcuni sono diventati fanatici che hanno ascoltato la voce di un dio malvagio nelle loro teste e si sono fatti chiamare ""L'Ordine"".","死ななかった人々は、人間から変異して別の物となった。 一部の人々は、頭の中に邪悪な神の声を伝えられた狂信者となり、 自らの集団を'オーダー'と呼んだ。","죽지 않은 자들에겐 큰 변화가 일어났다. 몇몇은 머릿속으로 악독한 신의 목소리를 듣기 시작했고, 이 광신도들은 그들 자신을 “오더”라고 지칭했다.","Voor degenen die niet stierven werden mutaties van de mensheid. Sommigen werden fanatiekelingen die de stem van een kwaadaardige god in hun hoofd hoorden en zichzelf ""de Orde"" noemden.","For de som ikke døde, ble mutasjoner av menneskeheten. Noen ble fanatikere som hørte stemmen til en ondartet gud i hodet og kalte seg ""Ordenen"".","Ci bowiem, którzy nie zginęli, stali się mutacjami ludzkości. Niektórzy stali się fanatykami, którzy słyszeli w swoich głowach głos złośliwego boga i nazywali siebie ""Zakonem"".","Aqueles que sobreviveram se tornaram mutações de humanidade. Alguns se tornaram fanáticos que ouviam em suas cabeças a voz de um deus malígno e passaram a se chamar ""a Ordem"".",,"Pentru că cei care nu au murit au ajuns mutanți. Unii au devenit fanatici care au auzit vocea unui zeu perfid în capul lor și s-au numit ""Ordinul"".","Выжившие сформировали уродливое подобие прежнего общества. Некоторые услышали голос зловещего бога и стали фанатиками, называющими себя «Орденом».",,"För de som inte dog blev mutationer av mänskligheten. Några blev fanatiker som hörde en ondskefull guds röst i sina huvuden och kallade sig själva för ""Orden"".","Ölmeyenler ise insanlığın mutasyonları oldular. Bazıları kafalarının içinde kötücül bir tanrının sesini duyan ve kendilerine ""Düzen"" diyen fanatikler haline geldi." -Those of us who are deaf to this voice suffer horribly and are forced to serve these ruthless psychotics who wield weapons more powerful than anything we can muster.,TXT_SUB_INTRO4,〃,,,"Ti z nás, kdo jsou vůči tomuto hlasu hluší, příšerně trpí a jsou nuceni sloužit těmto bezcitným šílencům, kteří vládnou zbraněmi, proti kterým nemáme šanci se bránit.","De af os, der er døve for denne stemme, lider forfærdeligt og er tvunget til at tjene disse hensynsløse psykopater, der svinger våben, der er stærkere end alt, hvad vi kan mønstre.","Jene, die dieser Stimme gegenüber taub sind, leiden schrecklich und sind gezwungen diesen unbarmherzigen Irren zu dienen. Sie haben Waffen die stärker sind als das, was wir aufbringen können.",,,Aquellos incapaces de oír esa voz sufrimos horriblemente y somos forzados a servir a estos psicopáticos despiadados que poseen armas más poderosas que cualesquiera que podamos conseguir.,,"Meistä ne, jotka ovat kuuroja tälle äänelle, kärsivät valtavasti ja joutuvat palvelemaan näitä häikäilemättömiä sekopäitä, jotka pitävät hallussaan voimakkaampia aseita kuin me ikinä kykenemme käsiimme saamaan.",Ceux sourds à sa voix souffrent horriblement et sont forcés à vivre au services de ces vicieux psychopathes qui utilisent des armes plus puissantes que tout ce que nous avons.,"Azok akik nem hallják ezeket a hangokat megszenvedik azt, és arra vannak kárhoztatva, hogy ezeket az isten feletti fegyverekkel rendelkező kegyetlen elmebetegeket szolgálják.",Quelli sordi alla sua voce soffrono orribilmente e sono costretti a vivere al servizio di questi malvagi psicopatici che usano armi più potenti di ogni cosa che noi abbiamo.,"その神の声を聞き取れなかった私達は苦しんだ挙げ句、 +Those of us who are deaf to this voice suffer horribly and are forced to serve these ruthless psychotics who wield weapons more powerful than anything we can muster.,TXT_SUB_INTRO4,〃,,,"Ti z nás, kdo jsou vůči tomuto hlasu hluší, příšerně trpí a jsou nuceni sloužit těmto bezcitným šílencům, kteří vládnou zbraněmi, proti kterým nemáme šanci se bránit.","De af os, der er døve for denne stemme, lider forfærdeligt og er tvunget til at tjene disse hensynsløse psykopater, der svinger våben, der er stærkere end alt, hvad vi kan mønstre.","Jene, die dieser Stimme gegenüber taub sind, leiden schrecklich und sind gezwungen diesen unbarmherzigen Irren zu dienen. Sie haben Waffen die stärker sind als das, was wir aufbringen können.",,,Aquellos incapaces de oír esa voz sufrimos horriblemente y somos forzados a servir a estos psicopáticos despiadados que poseen armas más poderosas que cualesquiera que podamos conseguir.,,"Meistä ne, jotka ovat kuuroja tälle äänelle, kärsivät valtavasti ja joutuvat palvelemaan näitä häikäilemättömiä sekopäitä, jotka pitävät hallussaan voimakkaampia aseita kuin me ikinä kykenemme käsiimme saamaan.",Ceux sourds à sa voix souffrent horriblement et sont forcés à vivre au services de ces vicieux psychopathes qui utilisent des armes plus puissantes que tout ce que nous avons.,,"Azok akik nem hallják ezeket a hangokat megszenvedik azt, és arra vannak kárhoztatva, hogy ezeket az isten feletti fegyverekkel rendelkező kegyetlen elmebetegeket szolgálják.",Quelli sordi alla sua voce soffrono orribilmente e sono costretti a vivere al servizio di questi malvagi psicopatici che usano armi più potenti di ogni cosa che noi abbiamo.,"その神の声を聞き取れなかった私達は苦しんだ挙げ句、 この無慈悲な狂人どもに仕えるのを強いられた。 そして奴等は、私達のどんな武器とも比べ物にならないほど強力な兵器を持っているのだ。","신의 목소리를 듣지 못하는 자들은 끔찍한 고통에 시달렸고, 우리가 가진 어떤 무기들보다 강력한 무장을 한 이 무자비한 광신도들을 강제로 섬기게 되었다.","Degenen onder ons die doof zijn voor deze stem lijden vreselijk en worden gedwongen om deze meedogenloze psychoten te dienen, die wapens gebruiken die krachtiger zijn dan alles wat we kunnen verzamelen.","De av oss som er døve for denne stemmen, lider forferdelig og er tvunget til å tjene disse hensynsløse psykotiske som bruker våpen som er kraftigere enn noe vi kan mønstre.","Ci z nas, którzy są głusi na ten głos, cierpią okropnie i są zmuszeni służyć tym bezwzględnym psychotom, którzy władają bronią potężniejszą niż wszystko, co jesteśmy w stanie zebrać.",Nós que não ouvimos essa voz sofremos terrívelmente e somos forçados a servir a esses psicopatas impiedosos que possuem armas mais poderosas do que qualquer coisa ao nosso alcance.,,Noi cei care suntem surzi și nu auzim vocea suferim oribil și suntem forțați să servin pe acești psihopați care cârmuie arme mai puternice decat orice avem.,"Другие — те, кто не слышал этого голоса, — терпели лишения. Их заставили прислуживать этим безжалостным психопатам, чьё оружие превосходило любое наше.",,De av oss som är döva för denna röst lider fruktansvärt och tvingas tjäna dessa hänsynslösa psykopater som svingar vapen som är kraftfullare än allt vi kan uppbåda.,Bu sese kulaklarını tıkayan bizler ise korkunç acılar çekiyor ve ellerinde toplayabileceğimiz her şeyden daha güçlü silahlar olan bu acımasız psikopatlara hizmet etmek zorunda kalıyoruz. -They destroy our women and children so that we must hide them underground and live like animals in constant fear for our lives.,TXT_SUB_INTRO5,〃,,,"Zabíjí naše ženy a děti, takže je musíme ukrývat v podzemí a nechávat je žít jako zvířata v neutrvajícím strachu o naše životy.","De ødelægger vores kvinder og børn, så vi må gemme dem under jorden og leve som dyr i konstant frygt for vores liv.","Sie zerstören unsere Frauen und Kinder, sodass wir uns im Untergrund verstecken müssen, wie die Tiere leben und ständig um unser Leben zu bangen.",,,Destruyen a nuestras mujeres y niños por lo que debemos esconderlos bajo tierra y vivir como animales temiendo constantemente por nuestras vidas.,,"He tuhoavat naisemme ja lapsemme, niin että joudumme kätkemään heidät maan alle ja elämään kuin elukat jatkuvassa pelossa henkemme puolesta.","Ils ont anéanti nos femmes et nos enfants et nous ont forcés à vivre sous terre comme des animaux, terrifiés de perdre nos vies.","Megölik a nőinket és gyermekeinket, ezért a föld alatt kell rejtegetnünk őket, és úgy kell élnünk mint az életét féltő állatoknak.","Distruggono le nostre donne e bambini, per cui li dobbiamo nascondere nel sottosuolo e vivere come animali in una paura costante per le nostre vite.","奴等は女性や子供を殺害していくため、私達はそういった人々を地下に隠さなければならなかった。 +They destroy our women and children so that we must hide them underground and live like animals in constant fear for our lives.,TXT_SUB_INTRO5,〃,,,"Zabíjí naše ženy a děti, takže je musíme ukrývat v podzemí a nechávat je žít jako zvířata v neutrvajícím strachu o naše životy.","De ødelægger vores kvinder og børn, så vi må gemme dem under jorden og leve som dyr i konstant frygt for vores liv.","Sie zerstören unsere Frauen und Kinder, sodass wir uns im Untergrund verstecken müssen, wie die Tiere leben und ständig um unser Leben zu bangen.",,,Destruyen a nuestras mujeres y niños por lo que debemos esconderlos bajo tierra y vivir como animales temiendo constantemente por nuestras vidas.,,"He tuhoavat naisemme ja lapsemme, niin että joudumme kätkemään heidät maan alle ja elämään kuin elukat jatkuvassa pelossa henkemme puolesta.","Ils ont anéanti nos femmes et nos enfants et nous ont forcés à vivre sous terre comme des animaux, terrifiés de perdre nos vies.",,"Megölik a nőinket és gyermekeinket, ezért a föld alatt kell rejtegetnünk őket, és úgy kell élnünk mint az életét féltő állatoknak.","Distruggono le nostre donne e bambini, per cui li dobbiamo nascondere nel sottosuolo e vivere come animali in una paura costante per le nostre vite.","奴等は女性や子供を殺害していくため、私達はそういった人々を地下に隠さなければならなかった。 我々は動物のように暮らすのを強いられ、命は常に危険に晒されている。","그들은 우리의 여자와 아이들을 죽였고, 우리는 살아남은 자들을 지하로 대피시켜 죽음의 공포 속에서 짐승처럼 살아가야 했다.",Ze vernietigen onze vrouwen en kinderen zodat we ze ondergronds moeten verbergen en als dieren moeten leven in voortdurende angst voor ons leven.,De ødelegger våre kvinner og barn slik at vi må gjemme dem under jorden og leve som dyr i konstant frykt for våre liv.,"Niszczą nasze kobiety i dzieci tak, że musimy ukrywać je pod ziemią i żyć jak zwierzęta w ciągłym strachu o nasze życie.","Eles destroem nossas mulheres e crianças e por isso nós temos que escondê-las no subterrâneo e viver como animais, temendo constantemente por nossas vidas.",,"Ne distrug femeile și copiii pentru ca noi să ne ascundem sub pământ și să trăim ca animalele, constant în teamă pentru virțiile noastre.","Они истребляют наших женщин и детей, и нам приходится прятать их в подземелье. Мы живём в постоянном страхе за свою жизнь, как животные.",,De förstör våra kvinnor och barn så att vi måste gömma dem under jorden och leva som djur i ständig rädsla för våra liv.,"Kadınlarımızı ve çocuklarımızı yok ediyorlar, böylece onları yeraltına saklamak ve hayatlarımız için sürekli korku içinde hayvanlar gibi yaşamak zorunda kalıyoruz." -"But there are whispers of discontent. If we organize, can we defeat our masters? Weapons are being stolen, soldiers are being trained. A movement is born: born of lifelong strife!",TXT_SUB_INTRO6,〃,,,"Vynořují se však nesouhlasná šeptání. Pokud se seskupíme, můžeme porazit naše pány? Kradou se zbraně, cvičí se vojáci. Zrodilo se hnutí, zrozené z věčného sváru!","Men der er hvisken af utilfredshed. Hvis vi organiserer os, kan vi så besejre vores herrer? Våben bliver stjålet, soldater bliver uddannet. En bevægelse er født: født af livslange stridigheder!","Aber es gibt Zeichen der Unzufriedenheit. Wenn wir uns organisieren, können wir unsere Meister besiegen? Waffen werden gestohlen, Soldaten ausgebildet. Eine Bewegung wurde geboren: Geboren aus dem ewigen Konflikt!",,,"Pero hay susurros de descontento. Si nos organizamos, ¿podemos derrotar a nuestros maestros? Se están robando armas, se entrenan soldados. Un movimiento nace - ¡nacido de una lucha de por vida!",,"Mutta tyytymättömyyden äänet kuiskailevat. Jos järjestäydymme, kykenemmekö päihittämään valtiaamme? Aseita anastetaan, sotilaita koulutetaan. Liike on syntynyt, syntynyt elinikäisestä taistelusta!","Mais il y a des murmures de colère qui subsistent. Si nous nous organisons, pouvons nous nous défaire de nos maîtres? Des armes sont volées, des soldats entraînés. Un mouvement est né, né d'un combat sans fin!","Azonban zúgolódó sutyorgásokat hallani. Ha összefogunk vajon legyőzhetjük elnyomóinkat? Fegyvereket lopkodunk, katonákat képzünk. Egy mozgalom születik: az emberöltőnyi küzdelem születik!","Ma ci sono voci di discontento. Se ci organizzassimo, potremmo sconfiggere i nostri padroni? Vengono rubate le armi, vengono addestrati i soldati. È nato un movimento: nato da un eterno conflitto!","だが不満のささやきは常にある。もし私達が力を合わせれば、 +"But there are whispers of discontent. If we organize, can we defeat our masters? Weapons are being stolen, soldiers are being trained. A movement is born: born of lifelong strife!",TXT_SUB_INTRO6,〃,,,"Vynořují se však nesouhlasná šeptání. Pokud se seskupíme, můžeme porazit naše pány? Kradou se zbraně, cvičí se vojáci. Zrodilo se hnutí, zrozené z věčného sváru!","Men der er hvisken af utilfredshed. Hvis vi organiserer os, kan vi så besejre vores herrer? Våben bliver stjålet, soldater bliver uddannet. En bevægelse er født: født af livslange stridigheder!","Aber es gibt Zeichen der Unzufriedenheit. Wenn wir uns organisieren, können wir unsere Meister besiegen? Waffen werden gestohlen, Soldaten ausgebildet. Eine Bewegung wurde geboren: Geboren aus dem ewigen Konflikt!",,,"Pero hay susurros de descontento. Si nos organizamos, ¿podemos derrotar a nuestros maestros? Se están robando armas, se entrenan soldados. Un movimiento nace - ¡nacido de una lucha de por vida!",,"Mutta tyytymättömyyden äänet kuiskailevat. Jos järjestäydymme, kykenemmekö päihittämään valtiaamme? Aseita anastetaan, sotilaita koulutetaan. Liike on syntynyt, syntynyt elinikäisestä taistelusta!","Mais il y a des murmures de colère qui subsistent. Si nous nous organisons, pouvons nous nous défaire de nos maîtres? Des armes sont volées, des soldats entraînés. Un mouvement est né, né d'un combat sans fin!",,"Azonban zúgolódó sutyorgásokat hallani. Ha összefogunk vajon legyőzhetjük elnyomóinkat? Fegyvereket lopkodunk, katonákat képzünk. Egy mozgalom születik: az emberöltőnyi küzdelem születik!","Ma ci sono voci di discontento. Se ci organizzassimo, potremmo sconfiggere i nostri padroni? Vengono rubate le armi, vengono addestrati i soldati. È nato un movimento: nato da un eterno conflitto!","だが不満のささやきは常にある。もし私達が力を合わせれば、 支配者たちを倒すことができるだろうか? 奴等の武器は盗まれ続けていて、 我らの兵士たちは訓練され続けている。 革命への動きは生まれたのだ- 終わりなき闘争(Strife)から!","그러나 불만의 목소리가 커졌다. 우리가 단결하면, 우리의 주인을 물리칠 수 있을까? 그들의 무기를 훔치고, 병사들을 훈련해서 우리의 평생을 바칠 투쟁이 시작된 것이다!","Maar er wordt gefluisterd van ontevredenheid. Als we ons organiseren, kunnen we dan onze meesters verslaan? Wapens worden gestolen, soldaten worden getraind. Een beweging is geboren: geboren uit levenslange strijd!","Men det hviskes om misnøye. Hvis vi organiserer oss, kan vi beseire våre herrer? Våpen blir stjålet, soldater blir trent. En bevegelse er født: født av livslang strid!","Ale są szepty niezadowolenia. Jeśli się zorganizujemy, czy uda nam się pokonać naszych panów? Broń jest kradziona, żołnierze są szkoleni. Rodzi się ruch: zrodzony z życiowej walki!","Mas há sussurros de descontentamento. Se nós nos organizarmos, será que podemos derrotar os nossos mestres? Armas estão sendo roubadas, soldados estão sendo treinados. Um movimento está nascendo. Nascendo por meio de um conflito sem fim!",,"Dar există șoapte ale neliniștii. Dacă ne organizam, am putea să ne înfrângem stăpânii? Armele sunt furate, soldații antrenați. O mișcare se naște: născută din suferința de o viață!","Но шёпот недовольства растёт. Сможем ли мы свергнуть их господство, если объединимся? Мы крадём их оружие, и наши бойцы проходят подготовку. Движение родилось — родилось из борьбы длиною в жизнь!",,"Men det finns viskningar av missnöje. Om vi organiserar oss kan vi besegra våra herrar? Vapen stjäls, soldater utbildas. En rörelse är född: född av livslång strid!","Ama hoşnutsuzluk fısıltıları var. Eğer örgütlenirsek, efendilerimizi yenebilir miyiz? Silahlar çalınıyor, askerler eğitiliyor. Bir hareket doğuyor: yaşam boyu süren mücadeleden doğuyor!" -"Attention, all troops of the Front: he's done it! It's over. Blackbird's soldier has killed the Evil. The Order is no more. Blackbird, do you read me?",TXT_SUB_GOOD1,Best ending.,,,"Pozor, všechny jednotky Fronty: On to dokázal! Je konec. Straččin voják zabil Zlo. Řád už není. Strako, slyšíš mě?","Hør efter, alle fronttropper: Han har gjort det! Det er slut. Blackbird's soldat har dræbt Ondskaben. Ordenen er ikke mere. Blackbird, kan du høre mig?","Achtung, alle Truppen der Front: Er hat es getan! Es ist vorbei.Blackbirds Soldat hat das Böse vernichtet. Den Orden gibt es nicht mehr. Blackbird, kannst du mich hören?",,,"Atención, todas las tropas del Frente: ¡lo ha hecho! Se acabó. El soldado de Blackbird ha matado al Mal. Es el fin de la Orden. Blackbird, ¿me recibes?",,"Huomio, kaikki Rintaman joukot: Hän teki sen! Se on ohi; Blackbirdin sotilas on tappanut Pahan. Veljeskuntaa ei enää ole. Blackbird, kuuletko minua?","Attention à toutes les troupes du Front: Nous avons réussi! C'est fini, le soldat de Blackbird a anéanti le mal. L'Ordre est sur le point de s'effondrer. Blackbird, me recevez-vous?","Figyelem a Front összes katonájának: megcsinálta! Vége van. Feketerigó katonája megölte magát a gonoszt. A rend nincs többé. Feketerigó, veszed az adást?","Attenzione a tutte le truppe del Fronte: ce l'ha fatta! È finita. Il soldato di Blackbird ha ucciso il Male. L'Ordine non esiste più. Blackbird, mi senti?","フロントの兵士たちよ、聞きたまえ! 彼がすべてを終わらせたのだ。 +"Attention, all troops of the Front: he's done it! It's over. Blackbird's soldier has killed the Evil. The Order is no more. Blackbird, do you read me?",TXT_SUB_GOOD1,Best ending.,,,"Pozor, všechny jednotky Fronty: On to dokázal! Je konec. Straččin voják zabil Zlo. Řád už není. Strako, slyšíš mě?","Hør efter, alle fronttropper: Han har gjort det! Det er slut. Blackbird's soldat har dræbt Ondskaben. Ordenen er ikke mere. Blackbird, kan du høre mig?","Achtung, alle Truppen der Front: Er hat es getan! Es ist vorbei.Blackbirds Soldat hat das Böse vernichtet. Den Orden gibt es nicht mehr. Blackbird, kannst du mich hören?",,,"Atención, todas las tropas del Frente: ¡lo ha hecho! Se acabó. El soldado de Blackbird ha matado al Mal. Es el fin de la Orden. Blackbird, ¿me recibes?",,"Huomio, kaikki Rintaman joukot: Hän teki sen! Se on ohi; Blackbirdin sotilas on tappanut Pahan. Veljeskuntaa ei enää ole. Blackbird, kuuletko minua?","Attention à toutes les troupes du Front: Nous avons réussi! C'est fini, le soldat de Blackbird a anéanti le mal. L'Ordre est sur le point de s'effondrer. Blackbird, me recevez-vous?",,"Figyelem a Front összes katonájának: megcsinálta! Vége van. Feketerigó katonája megölte magát a gonoszt. A rend nincs többé. Feketerigó, veszed az adást?","Attenzione a tutte le truppe del Fronte: ce l'ha fatta! È finita. Il soldato di Blackbird ha ucciso il Male. L'Ordine non esiste più. Blackbird, mi senti?","フロントの兵士たちよ、聞きたまえ! 彼がすべてを終わらせたのだ。 もうこれで何もかも終わりだ。ブラックバードの兵士が悪を滅ぼしたのだ。 オーダーはもう存在しない。ブラックバード、聞こえるか?","프론트의 모든 병사는 주목하라. 그가 해냈다! 모든 것이 끝났다. 블랙버드의 병사가 악을 물리치고, 오더는 끝장이 났다. 블랙버드, 내 말 듣고 있나?","Opgelet, alle troepen van het Front: hij heeft het gedaan! Het is voorbij. Blackbird's soldaat heeft het Kwaad gedood. De Orde is niet meer. Blackbird, hoort jou mij?","Oppmerksomhet, alle tropper fra fronten: han har gjort det! Det er over. Blackbirds soldat har drept Ondskapen. Ordenen eksisterer ikke lenger. Blackbird, hører du meg?","Uwaga, wszystkie oddziały Frontu: udało mu się! To już koniec. Żołnierz Blackbird zabił Zło. Nie ma już Zakonu. Blackbird, czy mnie słyszysz?","Atenção, todas as tropas da Frente: ele conseguiu! Está tudo acabado. O soldado de Blackbird matou o Mal. A Ordem não existe mais. Blackbird, consegue me ouvir?",,"Atenție, toate trupele Frontului: e gata! S-a terminat. Soldatul lui Blackbird a distrus Răul. Ordinul nu mai există. Blackbird, m-auzi?","Внимание, всем войскам Фронта! Он справился! Всё кончено! Солдат «Чёрного дрозда» покончил со злом! Ордена больше нет! «Чёрный дрозд», как слышите?",,"Lystring, alla fronttrupper: han har gjort det! Det är över. Blackbirds soldat har dödat ondskan. Orden finns inte längre. Blackbird, hör du mig?","Cephe'nin tüm askerlerinin dikkatine: Başardı! Her şey bitti. Karabatak'ın askeri Şeytan'ı öldürdü. Tarikat artık yok. Karatavuk, beni duyuyor musun?" -"I knew you would win, my gallant hero. All fighting has stopped. Your victory will allow us to create a vaccine to purge the virus from our bodies.",TXT_SUB_GOOD2,〃,,,"Já věděla, že vyhraješ, můj statečný hrdino. Všechen boj ustal. Tvé vítězství nám umožní vyrobit vakcínu, která naše těla vyčistí od viru.","Jeg vidste, du ville vinde, min tapper helt. Alle kampe er stoppet. Din sejr vil give os mulighed for at skabe en vaccine, der kan rense vores kroppe for virussen.","Ich wusste, dass du gewinnen würdest, mein edler Held. Die Kämpfe haben aufgehört. Dein Sieg wird es uns erlauben einen Impfstoff herzustellen, mit dem wir den Virus in unseren Körper bekämpfen können.",,,"Sabía que ganarías, mi valiente héroe. La lucha ha terminado. Tu victoria nos permitirá crear una vacuna para purgar el virus de nuestros cuerpos.",,"Tiesin, että voittaisit, uljas sankarini. Kaikki taistelu on tauonnut. Voittosi myötä meidän on mahdollista luoda rokote viruksen poistamiseksi kehoistamme.","Je savais que tu gagnerais, mon vaillant héros. Les combats ont cessé, ta victoire nous permettrera de créer un vaccin et purger le virus de nos corps.","Tudtam, hogy nyerni fogsz vitéz hősöm. Megszűntek a csaták. A győzelmed lehetővé fogja tenni, hogy egy vakcinával kiírtsuk a testünkből ezt a vírust.","Lo sapevo che potevi vincere, mio galante eroe. Tutto il combattimento è cessato. La tua vittoria ci consentirà di creare un vaccino per estirpare il virus dai nostri corpi.","あなたが勝つことは分かっていたわ、私の勇敢なヒーロー。 +"I knew you would win, my gallant hero. All fighting has stopped. Your victory will allow us to create a vaccine to purge the virus from our bodies.",TXT_SUB_GOOD2,〃,,,"Já věděla, že vyhraješ, můj statečný hrdino. Všechen boj ustal. Tvé vítězství nám umožní vyrobit vakcínu, která naše těla vyčistí od viru.","Jeg vidste, du ville vinde, min tapper helt. Alle kampe er stoppet. Din sejr vil give os mulighed for at skabe en vaccine, der kan rense vores kroppe for virussen.","Ich wusste, dass du gewinnen würdest, mein edler Held. Die Kämpfe haben aufgehört. Dein Sieg wird es uns erlauben einen Impfstoff herzustellen, mit dem wir den Virus in unseren Körper bekämpfen können.",,,"Sabía que ganarías, mi valiente héroe. La lucha ha terminado. Tu victoria nos permitirá crear una vacuna para purgar el virus de nuestros cuerpos.",,"Tiesin, että voittaisit, uljas sankarini. Kaikki taistelu on tauonnut. Voittosi myötä meidän on mahdollista luoda rokote viruksen poistamiseksi kehoistamme.","Je savais que tu gagnerais, mon vaillant héros. Les combats ont cessé, ta victoire nous permettrera de créer un vaccin et purger le virus de nos corps.",,"Tudtam, hogy nyerni fogsz vitéz hősöm. Megszűntek a csaták. A győzelmed lehetővé fogja tenni, hogy egy vakcinával kiírtsuk a testünkből ezt a vírust.","Lo sapevo che potevi vincere, mio galante eroe. Tutto il combattimento è cessato. La tua vittoria ci consentirà di creare un vaccino per estirpare il virus dai nostri corpi.","あなたが勝つことは分かっていたわ、私の勇敢なヒーロー。 全ての戦いは終結した。あなたがもたらした勝利のおかげで、 私達の体からウィルスを根絶するためのワクチンを作ることができる。","나의 용감한 영웅이 이길 줄 알았어. 모든 싸움이 끝이 났고, 당신의 승리 덕분에 우리 몸에 남은 바이러스를 퇴치할 백신을 만들 수 있을 거야.","Ik wist dat je zou winnen, mijn dappere held. Alle gevechten zijn gestopt. Uw overwinning zal ons in staat stellen om een vaccin te creëren om het virus uit ons lichaam te zuiveren.","Jeg visste at du ville vinne, min tapre helt. Alle kampene er over. Din seier vil tillate oss å lage en vaksine for å fjerne viruset fra kroppene våre.","Wiedziałem, że wygrasz, mój dzielny bohaterze. Wszystkie walki zostały przerwane. Twoje zwycięstwo pozwoli nam stworzyć szczepionkę, która usunie wirusa z naszych ciał.","Eu sabia que você conseguiria vencer, meu herói valente. Todo esse conflito chegou ao fim. Sua vitória nos permitirá que criemos uma vacina para eliminar o vírus de nossos corpos.",,"Știam că vei câștiga, eroul meu galant. Lupta a încetat. Vitoria ta ne permite să creăm un vaccin care va elimina virusul din corpul nostru.","Я знала, что ты победишь, мой отважный герой. Война окончена. Твоя победа позволила нам создать вакцину против вируса.",,"Jag visste att du skulle vinna, min tappre hjälte. Alla strider har upphört. Din seger kommer att göra det möjligt för oss att skapa ett vaccin för att rensa ut viruset från våra kroppar.","Kazanacağını biliyordum, benim cesur kahramanım. Tüm savaşlar durdu. Zaferin, virüsü vücutlarımızdan temizlemek için bir aşı yaratmamızı sağlayacak." -"You have saved our planet and set us free. Now I'd like to thank you... personally. Oh, and by the way: the name is Shauna.",TXT_SUB_GOOD3,〃,,,Zachránil jsi naši planetu a osvobodil nás. Teď bych ti chtěla poděkovat... osobně. A mimochodem: Mé jméno je Shauna.,"Du har reddet vores planet og befriet os. Nu vil jeg gerne takke dig... personligt. Åh, og forresten: Navnet er Shauna.","Du hast unseren Planeten gerettet und uns befreit. Nun würde ich mich gerne bei dir bedanken... persönlich. Oh, so nebenbei: Mein Name ist Shauna.",,,"Has salvado nuestro planeta y nos has hecho libres. Ahora me gustaría agradecértelo... personalmente. Oh, y por cierto: mi nombre es Shauna.",,"Olet pelastanut planeettamme ja vapauttanut meidät. Tahtoisin nyt kiittää sinua... henkilökohtaisesti. Ja muuten, nimeni on Shauna.","Tu as sauvé notre planète et tu nous as tous libérés. Je veux te récompenser.. Personellement. Oh, et je m'appelle Shauna.","Megmentetted a bolygót, és felszabadítottál minket. Meg akarom ezt köszönni...személyesen. Ja, és a nevem Shauna.","Hai salvato il nostro pianeta e ci hai reso liberi. Ora vorrei ringraziarti ... di persona. Ah, comunque: mi chiamo Shauna.","あなたはこの星を救い、そして自由を取り戻した。さあ、 +"You have saved our planet and set us free. Now I'd like to thank you... personally. Oh, and by the way: the name is Shauna.",TXT_SUB_GOOD3,〃,,,Zachránil jsi naši planetu a osvobodil nás. Teď bych ti chtěla poděkovat... osobně. A mimochodem: Mé jméno je Shauna.,"Du har reddet vores planet og befriet os. Nu vil jeg gerne takke dig... personligt. Åh, og forresten: Navnet er Shauna.","Du hast unseren Planeten gerettet und uns befreit. Nun würde ich mich gerne bei dir bedanken... persönlich. Oh, so nebenbei: Mein Name ist Shauna.",,,"Has salvado nuestro planeta y nos has hecho libres. Ahora me gustaría agradecértelo... personalmente. Oh, y por cierto: mi nombre es Shauna.",,"Olet pelastanut planeettamme ja vapauttanut meidät. Tahtoisin nyt kiittää sinua... henkilökohtaisesti. Ja muuten, nimeni on Shauna.","Tu as sauvé notre planète et tu nous as tous libérés. Je veux te récompenser.. Personellement. Oh, et je m'appelle Shauna.",,"Megmentetted a bolygót, és felszabadítottál minket. Meg akarom ezt köszönni...személyesen. Ja, és a nevem Shauna.","Hai salvato il nostro pianeta e ci hai reso liberi. Ora vorrei ringraziarti ... di persona. Ah, comunque: mi chiamo Shauna.","あなたはこの星を救い、そして自由を取り戻した。さあ、 あなたにお礼をするときが来たわね、個人的な意味で... ああ、それはそうと、私の本名はシャウナよ。","당신이 우리의 행성을 구하고 우리를 자유롭게 해줬어. 이제... 개인적으로 당신에게 감사하고 싶어. 아, 그리고... 내 이름은 샤나야.","Jullie hebben onze planeet gered en ons bevrijd. Nu wil ik je persoonlijk bedanken.... persoonlijk. Oh, en trouwens: de naam is Shauna.",Du har reddet planeten vår og satt oss fri. Nå vil jeg takke deg... personlig. Og forresten: navnet er Shauna.,"Uratowałeś naszą planetę i uwolniłeś nas. Teraz chciałbym ci podziękować... osobiście. Aha, i przy okazji: mam na imię Shauna.","Você salvou o nosso planeta e nos libertou. Agora, eu gostaria de te agradecer...pessoalmente. Ah, a propósito: meu nome é Shauna.",,"Ai salvat planeta și ne-ai eliberat. Aș vrea să îți mulțumesc, personal... Oh, și apropo: numele e Shauna.","Ты спас нашу планету и освободил нас. Так что я бы хотела поблагодарить тебя... лично. Кстати, меня зовут Шона.",,"Du har räddat vår planet och befriat oss. Nu vill jag tacka dig... personligen. Åh, och förresten: namnet är Shauna.",Gezegenimizi kurtardın ve bizi özgür bıraktın. Şimdi size şahsen teşekkür etmek istiyorum. Bu arada adım Shauna. -"Yes, the evil was gone, but our future was uncertain and clouded with doubt.",TXT_SUB_SAD1,Sad ending.,,,"Ano, zlo bylo pryč, ale naše budoucnost byla nejistá a zahalená pochybami.","Ja, ondskaben var væk, men vores fremtid var usikker og omgærdet af tvivl.","Ja, das Böse war fort, aber unsere Zukunft war ungewiss und von Zweifeln getrübt.",,,"Sí, el mal desapareció, pero nuestro futuro fue incierto y oscurecido por dudas.",,"Niin, paha oli kyllä mennyttä, mutta tulevaisuutemme oli epävarma ja hämärän peitossa.","Oui, le mal a disparu, mais notre futur reste incertain et le doute pèse sur nous.","Habár a gonosz eltávozott, a jövőnk mégis bizonytalan és ködös.","Si, il male fu sconfitto, ma il nostro futuro fu incerto e offuscato dal dubbio.","ええ、悪は消え去ったわ。だけども私達の未来は +"Yes, the evil was gone, but our future was uncertain and clouded with doubt.",TXT_SUB_SAD1,Sad ending.,,,"Ano, zlo bylo pryč, ale naše budoucnost byla nejistá a zahalená pochybami.","Ja, ondskaben var væk, men vores fremtid var usikker og omgærdet af tvivl.","Ja, das Böse war fort, aber unsere Zukunft war ungewiss und von Zweifeln getrübt.",,,"Sí, el mal desapareció, pero nuestro futuro fue incierto y oscurecido por dudas.",,"Niin, paha oli kyllä mennyttä, mutta tulevaisuutemme oli epävarma ja hämärän peitossa.","Oui, le mal a disparu, mais notre futur reste incertain et le doute pèse sur nous.",,"Habár a gonosz eltávozott, a jövőnk mégis bizonytalan és ködös.","Si, il male fu sconfitto, ma il nostro futuro fu incerto e offuscato dal dubbio.","ええ、悪は消え去ったわ。だけども私達の未来は まだ不安と疑念に満ちている。","그래, 악은 이제 사라졌어. 하지만 우리의 불확실한 앞날은 여전히 근심의 먹구름으로 가득 찼지.","Ja, het kwaad was weg, maar onze toekomst was onzeker en vertroebeld met twijfel.","Ja, ondskapen var borte, men fremtiden vår var usikker og full av tvil.","Tak, zło zniknęło, ale nasza przyszłość była niepewna i spowita wątpliwościami.","Sim, o mal se foi, mas o nosso futuro ainda era incerto e coberto de dúvidas.",,"Da, răul s-a dus dar viitorul nostru era în ceață și neclar.","Да, зло было повержено, но наше будущее было туманно и омрачено тенью сомнений...",,"Ja, ondskan var borta, men vår framtid var osäker och grumlad av tvivel.","Evet, kötülük gitmişti ama geleceğimiz belirsizdi ve şüpheyle doluydu." -It would take generations to purge the virus from our people. If we survived that long.,TXT_SUB_SAD2,〃,,,"Trvalo by to věky, než bychom virus z našeho lidu vypudili. Pokud bychom tak dlouho přežili.",Det ville tage generationer at udrense virussen fra vores folk. Hvis vi overlevede så længe.,"Es würde Generationen dauern, bis wir unser Volk von dem Virus befreien können. Wenn wir so lange überleben...",,,Llevaría generaciones purgar el virus de nuestra gente. Si sobrevivieramos tanto tiempo.,,"Kestäisi sukupolvia hävittää virus keskuudestamme, jos selviäisimme niin pitkälle.","Il faudra des générations pour purger le virus de nos corps, si nous survivons suffisament longtemps.","Generációkba fog kerülni, hogy teljesen kiírtsuk a vírust. Márha élünk addig.",Ci sarebbero volute generazioni per eliminare il virus dalle nostre persone. Se fossimo sopravvissuti così a lungo.,"人間たちからウィルスを根絶するには、あと何世代もかかって +It would take generations to purge the virus from our people. If we survived that long.,TXT_SUB_SAD2,〃,,,"Trvalo by to věky, než bychom virus z našeho lidu vypudili. Pokud bychom tak dlouho přežili.",Det ville tage generationer at udrense virussen fra vores folk. Hvis vi overlevede så længe.,"Es würde Generationen dauern, bis wir unser Volk von dem Virus befreien können. Wenn wir so lange überleben...",,,Llevaría generaciones purgar el virus de nuestra gente. Si sobrevivieramos tanto tiempo.,,"Kestäisi sukupolvia hävittää virus keskuudestamme, jos selviäisimme niin pitkälle.","Il faudra des générations pour purger le virus de nos corps, si nous survivons suffisament longtemps.",,"Generációkba fog kerülni, hogy teljesen kiírtsuk a vírust. Márha élünk addig.",Ci sarebbero volute generazioni per eliminare il virus dalle nostre persone. Se fossimo sopravvissuti così a lungo.,"人間たちからウィルスを根絶するには、あと何世代もかかって しまうはず。私達がそこまで生き延びられたとしても。",우리 몸속의 바이러스를 퇴치하려면 수 세대의 시간이 걸릴 거야. 우리가 그때까지 살아남는다면.,Het zou generaties vergen om het virus uit ons volk te zuiveren. Als we het zo lang zouden overleven.,Det ville ta generasjoner å fjerne viruset fra folket vårt. Hvis vi overlevde så lenge.,"Potrzeba było pokoleń, by oczyścić nasz lud z wirusa. Jeśli przeżyjemy tak długo.",Levaria gerações para eliminar o vírus de nosso povo. Se sobrevivessemos por todo esse tempo.,,Va dura generații până vom elimina virusul din oamenii noștri. Dacă vom trăi suficient.,"Десятилетия потребуются, чтобы исцелить наших людей от вируса... если нам удастся просуществовать так долго.",,Det skulle ta generationer att rensa ut viruset från vårt folk. Om vi överlevde så länge.,Virüsü insanlarımızdan temizlemek nesiller alacaktı. Tabii o kadar uzun süre hayatta kalabilirsek. -"Whatever the evil wanted, it drained from us the one thing we needed: it left us without hope.",TXT_SUB_SAD3,〃,,,"Ať chtělo zlo cokoliv, vysálo z nás tu jednu věc, kterou jsme potřebovali: Nechalo nás bez naděje.","Uanset hvad ondskaben ville, drænede den os for den eneste ting, vi havde brug for: den efterlod os uden håb.","Was auch immer das Böse wollte, es hat uns das genommen, was wir am meisten brauchten: Es hat uns ohne Hoffnung gelassen.",,,"Sea lo que sea que quisiera el mal, nos despojó de aquello que necesitábamos: la esperanza.",,"Mitä tahansa paha halusikaan, se riisti meiltä sen yhden ainoan asian, jota tarvitsimme: se jätti meidät ilman toivoa.","Quel que soit ce que le mal voulait de nous, il a tout de même pris la dernière chose qui nous restait: notre espoir.",A gonosz megkaparintotta amit akart: megfosztott minket a reményünktől.,"Qualunque cosa il male volesse, ci ha drenato dell'unica cosa di cui avevamo bisogno: ci ha lasciato senza speranza.","あの邪悪な存在が何を求めていたかはともかく、 +"Whatever the evil wanted, it drained from us the one thing we needed: it left us without hope.",TXT_SUB_SAD3,〃,,,"Ať chtělo zlo cokoliv, vysálo z nás tu jednu věc, kterou jsme potřebovali: Nechalo nás bez naděje.","Uanset hvad ondskaben ville, drænede den os for den eneste ting, vi havde brug for: den efterlod os uden håb.","Was auch immer das Böse wollte, es hat uns das genommen, was wir am meisten brauchten: Es hat uns ohne Hoffnung gelassen.",,,"Sea lo que sea que quisiera el mal, nos despojó de aquello que necesitábamos: la esperanza.",,"Mitä tahansa paha halusikaan, se riisti meiltä sen yhden ainoan asian, jota tarvitsimme: se jätti meidät ilman toivoa.","Quel que soit ce que le mal voulait de nous, il a tout de même pris la dernière chose qui nous restait: notre espoir.",,A gonosz megkaparintotta amit akart: megfosztott minket a reményünktől.,"Qualunque cosa il male volesse, ci ha drenato dell'unica cosa di cui avevamo bisogno: ci ha lasciato senza speranza.","あの邪悪な存在が何を求めていたかはともかく、 奴は人間たちから一番大切な物、希望を奪い去った。","악이 원한 것이 무엇이었든, 그들은 우리에게 필요한 한 가지를 뺏어갔어: 희망이라는 미래지...","Wat het kwaad ook wilde, het heeft ons datgene ontnomen wat we nodig hadden: het heeft ons zonder hoop achtergelaten.","Uansett hva ondskapen ville, tok den fra oss det eneste vi trengte: Den etterlot oss uten håp.","Cokolwiek chciało zło, wyssało z nas jedyną rzecz, której potrzebowaliśmy: pozostawiło nas bez nadziei.","Seja lá o que o mal queria, conseguiu tirar de nós algo que precisávamos: nossas esperanças.",,"Orice ar fi vrut răul, ne-a stors de ceea ce am avut cea mai mare nevoie: speranță.","Чего бы зло ни желало, оно отняло у нас то, в чём мы нуждались больше всего — оно лишило нас надежды.",,Vad ondskan än ville så tog den från oss det enda vi behövde: den lämnade oss utan hopp.,"Kötülük her ne istediyse, ihtiyacımız olan tek şeyi bizden çekip aldı: bizi umutsuz bıraktı." -"The sentient virus hit us like a tidal wave, driving us all mad. We heard the siren's song of death and we danced.",TXT_SUB_BAD1,Worst ending.,,,"Žijící virus nás ochromil jako povodeň, ze které jsme všichni zešíleli. Uslyšeli jsme siréninu píseň smrti a začali tančit.","Den følende virus ramte os som en flodbølge og drev os alle til vanvid. Vi hørte sirenens sang om døden, og vi dansede.",Der Virus traf uns wie eine Flutwelle und machte uns verrückt. Wir hörten den Sirenengesang des Todes - und wir tanzten.,,,"El virus consciente nos golpeó como una marea, volviéndonos a todos locos. Escuchamos la canción de sirena de la muerte y bailamos.",,Tietoinen virus iski meihin kuin hyökyaalto syösten meidät hulluuteen. Kuulimme seireenin kuoleman veisuun ja tanssimme sen tahtiin.,"Le virus devenu intelligent nous a emporté comme un tsunami, nous plongeant dans la folie. Entendant le doux chant de la mort, nous dancions en choeur.","A tudatára ébredt vírus hullámként verte le népünket és őrjített meg minket. Hallottuk a szirének tébolyító halál énekét, és táncolni kezdtünk.","Il virus intelligente ci ha colpito come uno tsunami, immergendoci nella follia. Sentimmo il canto delle sirene della morte, e ci misimo a ballare.","センティエント・ウィルスは私達を津波のように襲い、 +"The sentient virus hit us like a tidal wave, driving us all mad. We heard the siren's song of death and we danced.",TXT_SUB_BAD1,Worst ending.,,,"Žijící virus nás ochromil jako povodeň, ze které jsme všichni zešíleli. Uslyšeli jsme siréninu píseň smrti a začali tančit.","Den følende virus ramte os som en flodbølge og drev os alle til vanvid. Vi hørte sirenens sang om døden, og vi dansede.",Der Virus traf uns wie eine Flutwelle und machte uns verrückt. Wir hörten den Sirenengesang des Todes - und wir tanzten.,,,"El virus consciente nos golpeó como una marea, volviéndonos a todos locos. Escuchamos la canción de sirena de la muerte y bailamos.",,Tietoinen virus iski meihin kuin hyökyaalto syösten meidät hulluuteen. Kuulimme seireenin kuoleman veisuun ja tanssimme sen tahtiin.,"Le virus devenu intelligent nous a emporté comme un tsunami, nous plongeant dans la folie. Entendant le doux chant de la mort, nous dancions en choeur.",,"A tudatára ébredt vírus hullámként verte le népünket és őrjített meg minket. Hallottuk a szirének tébolyító halál énekét, és táncolni kezdtünk.","Il virus intelligente ci ha colpito come uno tsunami, immergendoci nella follia. Sentimmo il canto delle sirene della morte, e ci misimo a ballare.","センティエント・ウィルスは私達を津波のように襲い、 全ての人間を狂気に陥れた。セイレーンの死の歌声を聞いたように なり、死ぬまで踊り続けたのだ。","자각심을 가진 바이러스가 온 땅을 휩쓸었고, 우리 모두를 미치게 했다. 우리는 악이 들려주는 죽음의 노래에 맞춰 춤을 추었다.","Het virus met gevoel raakte ons als een vloedgolf, waardoor we allemaal gek werden. We hoorden het lied van de sirene van de dood en we dansten.",Det følende viruset traff oss som en flodbølge og gjorde oss alle gale. Vi hørte sirenenes dødssang og vi danset.,"Czujący wirus uderzył w nas jak fala pływowa, doprowadzając nas wszystkich do szaleństwa. Słyszeliśmy syreni śpiew śmierci i tańczyliśmy.","O vírus senciente nos atingiu como uma onda gigante, deixando todos nós loucos. Ouviamos a canção da morte da sirene e dançávamos.",,"Virusul viu ne-a lovit ca un val, făcându-ne să o luăm razna. Am auzit cântecul de moarte al sirenelor și am dansat.","Эпидемия захлестнула нас подобно гигантской волне, лишив рассудка каждого. Мы услышали сладкую песнь смерти и подчинились ей.",,Det kännande viruset drabbade oss som en flodvåg och drev oss alla till vansinne. Vi hörde sirenens sång av döden och vi dansade.,Duyarlı virüs bizi bir gelgit dalgası gibi vurdu ve hepimizi delirtti. Sirenin ölüm şarkısını duyduk ve dans ettik. -"This evil drained us of all human life and, scornful of procreation, recycled our families.",TXT_SUB_BAD2,〃,,,"Toto zlo z nás vysálo všechen život a, bez možnosti se rozmnožovat, vyhladilo naše rodiny.","Denne ondskab drænede os for alt menneskeligt liv, og foragtede for forplantning og genbrugte vores familier.",Das Böse entzog uns alles menschliche und als Verhöhnung der Fortpflanzung recycelte es unsere Familien.,,,"Este mal nos despojó de nuestra humanidad y despreciando la procreación, recicló nuestras familias.",,Paha imi meistä kaiken ihmiselämän ja lisääntymistä ylenkatsoen kierrätti perheemme.,"La mal nous a drainé de toute vie et haïssant toute procréation, recycla nos familles.","Ez a gonosz tömegével csapolta le az emberi életeket, és egyfajta gúnyos teremtőként újrahasznosította családainkat.","Questo male ci ha drenato di tutta la vita umana e, sprezzante della procreazione, riciclò le nostre famiglie.","この邪悪な存在は人間たちの命と繁殖能力を奪い去り、 +"This evil drained us of all human life and, scornful of procreation, recycled our families.",TXT_SUB_BAD2,〃,,,"Toto zlo z nás vysálo všechen život a, bez možnosti se rozmnožovat, vyhladilo naše rodiny.","Denne ondskab drænede os for alt menneskeligt liv, og foragtede for forplantning og genbrugte vores familier.",Das Böse entzog uns alles menschliche und als Verhöhnung der Fortpflanzung recycelte es unsere Familien.,,,"Este mal nos despojó de nuestra humanidad y despreciando la procreación, recicló nuestras familias.",,Paha imi meistä kaiken ihmiselämän ja lisääntymistä ylenkatsoen kierrätti perheemme.,"La mal nous a drainé de toute vie et haïssant toute procréation, recycla nos familles.",,"Ez a gonosz tömegével csapolta le az emberi életeket, és egyfajta gúnyos teremtőként újrahasznosította családainkat.","Questo male ci ha drenato di tutta la vita umana e, sprezzante della procreazione, riciclò le nostre famiglie.","この邪悪な存在は人間たちの命と繁殖能力を奪い去り、 我々の家族を再利用した。","악은 우리에게서 인간적인 삶을 빼앗았고, 우리 인류를 유지해온 생식을 억제했다.","Dit kwaad heeft ons van alle mensenlevens ontdaan en, verachtelijk van voortplanting, onze families gerecycled.",Denne ondskapen tømte oss for alt menneskelig liv og resirkulerte familiene våre med forakt for forplantning.,"To zło pozbawiało nas wszelkiego ludzkiego życia, a gardząc prokreacją, utylizowało nasze rodziny.","O mal tirou de nós toda a vida humana e, deprezando a procriação, reciclou nossas famílias.",,"Acest rău ne-a stors de toată viața umană, detestând procreerea, reciclandu-ne familiile.","Зло истребляло в нас всё человеческое. Не задумываясь о завтрашнем дне, оно перерабатывало целые семьи.",,"Denna ondska tömde oss på allt mänskligt liv och, med förakt för fortplantning, återanvände våra familjer.",Bu kötülük bizi tüm insan yaşamından mahrum bıraktı ve üremeyi küçümseyerek ailelerimizi geri dönüştürdü. -"Then one day, the evil left. There was simply nothing for it to feed on. We were extinct.",TXT_SUB_BAD3,〃,,,"A pak, jednoho dne, zlo odešlo. Nemělo se prostě už na čem pást. Vyhynuli jsme.",Så en dag forlod ondskaben os. Der var simpelthen ikke noget for den at spise. Vi var uddøde.,"Dann, eines Tages, war das Böse fort. Es war nichts mehr da, wovon es zehren konnte. Wir waren ausgestorben.",,,"Entonces un día, el mal se fue. Simplemente ya no quedaba nada con que alimentarse: nos extinguimos.",,"Sitten eräänä päivänä paha kaikkosi; mitään yksinkertaisesti ei enää ollut, mistä elää. Olimme kuolleet sukupuuttoon.","Puis, un jour, le mal disparut. Il ne restait plus rien d'utile pour lui, nous nous sommes éteints.",Egy napon a gonosz eltűnt. Nem tudott már min táplálkozni. Kipusztultunk.,"Così un giorno, il male se ne andò. Semplicemente non rimase nulla su cui cibarsi. Noi siamo estinti.","そしてある時、邪悪な存在はこの星を後にした。単に、 +"Then one day, the evil left. There was simply nothing for it to feed on. We were extinct.",TXT_SUB_BAD3,〃,,,"A pak, jednoho dne, zlo odešlo. Nemělo se prostě už na čem pást. Vyhynuli jsme.",Så en dag forlod ondskaben os. Der var simpelthen ikke noget for den at spise. Vi var uddøde.,"Dann, eines Tages, war das Böse fort. Es war nichts mehr da, wovon es zehren konnte. Wir waren ausgestorben.",,,"Entonces un día, el mal se fue. Simplemente ya no quedaba nada con que alimentarse: nos extinguimos.",,"Sitten eräänä päivänä paha kaikkosi; mitään yksinkertaisesti ei enää ollut, mistä elää. Olimme kuolleet sukupuuttoon.","Puis, un jour, le mal disparut. Il ne restait plus rien d'utile pour lui, nous nous sommes éteints.",,Egy napon a gonosz eltűnt. Nem tudott már min táplálkozni. Kipusztultunk.,"Così un giorno, il male se ne andò. Semplicemente non rimase nulla su cui cibarsi. Noi siamo estinti.","そしてある時、邪悪な存在はこの星を後にした。単に、 奴の糧となる者が一人もいなくなったからだ。我々は滅びたのだ。","그리고 어느 날, 악은 사라졌다. 그들에게 먹을 것이 없었기 때문이다. 우리들이 멸종했기에...",Op een dag vertrok het kwaad. Er was gewoonweg niets om zich op te voeden. We waren uitgestorven.,Så en dag forsvant ondskapen. Det fantes rett og slett ikke noe å livnære seg på. Vi var utryddet.,"Pewnego dnia, zło odeszło. Nie było nic, czym mogłoby się żywić. Wyginęliśmy.","E então um dia, o mal foi embora. Não sobrou mais nada para ele consumir. Estávamos extintos.",,"Apoi, într-o zi, răul a plecat. Pur și simplu nu a mai rămas nimic din care să se hrănească. Eram dispăruți.","Настал день, когда зло ушло. Не осталось ничего, чем оно могло бы питаться. Мы вымерли.",,En dag lämnade ondskan oss. Det fanns helt enkelt ingenting för den att livnära sig på. Vi var utdöda.,"Sonra bir gün, kötülük gitti. Beslenebileceği hiçbir şey kalmamıştı. Neslimiz tükenmişti." -"The genetic mutations caused by the virus not only warped the psyches of the Order, but caused their bodies to decay.",TXT_SUB_MAP03_1,MAP03: After destroying the gate controls.,,,"Genetické mutace způsobené virem nejenže pokřivily mysli Řádu, ale také způsobily rozklad jejich těl.","De genetiske mutationer forårsaget af virussen forvrængede ikke kun ordensmændenes psyke, men fik også deres kroppe til at forfalde.","Die genetischen Mutationen, die durch den Virus verursacht wurden, haben nicht nur die Psyche des Ordens beeinflusst, sondern brachten auch ihre Körper zum Verfallen.",,,"Las mutaciones genéticas causadas por el virus no solo retorcieron las mentes de la Orden, sino que también causaron el deterioro de sus cuerpos.",,Viruksen aiheuttamat geneettiset mutaatiot eivät vain vääristäneet Veljeskunnan mieliä vaan myös rappeuttivat heidän ruumiitaan.,"Les mutations géntiques du virus ont non seulement tordu l'esprit de L'Ordre, mais a aussi rendu leur corps invivables.","A vírus genetikai mutációi nem csak a Rend tagjainak elméjét rontotta meg, de testüket is bomlásnak indította.","Le mutazioni genetiche causate dal virus non solo turbavano la psiche dei seguaci dell'Ordine, ma portava i loro corpi a decomporre.","ウィルスからもたらされた遺伝子変異はオーダーの者たちの精神だけではなく、 +"The genetic mutations caused by the virus not only warped the psyches of the Order, but caused their bodies to decay.",TXT_SUB_MAP03_1,MAP03: After destroying the gate controls.,,,"Genetické mutace způsobené virem nejenže pokřivily mysli Řádu, ale také způsobily rozklad jejich těl.","De genetiske mutationer forårsaget af virussen forvrængede ikke kun ordensmændenes psyke, men fik også deres kroppe til at forfalde.","Die genetischen Mutationen, die durch den Virus verursacht wurden, haben nicht nur die Psyche des Ordens beeinflusst, sondern brachten auch ihre Körper zum Verfallen.",,,"Las mutaciones genéticas causadas por el virus no solo retorcieron las mentes de la Orden, sino que también causaron el deterioro de sus cuerpos.",,Viruksen aiheuttamat geneettiset mutaatiot eivät vain vääristäneet Veljeskunnan mieliä vaan myös rappeuttivat heidän ruumiitaan.,"Les mutations géntiques du virus ont non seulement tordu l'esprit de L'Ordre, mais a aussi rendu leur corps invivables.",,"A vírus genetikai mutációi nem csak a Rend tagjainak elméjét rontotta meg, de testüket is bomlásnak indította.","Le mutazioni genetiche causate dal virus non solo turbavano la psiche dei seguaci dell'Ordine, ma portava i loro corpi a decomporre.","ウィルスからもたらされた遺伝子変異はオーダーの者たちの精神だけではなく、 肉体すらも蝕んだ。","바이러스로 인한 유전적 변화는 오더의 광신도들을 만들었을 뿐만 아니라, 그들의 육신을 썩어 문드러지게 했습니다.","De genetische mutaties die door het virus werden veroorzaakt, vervormden niet alleen de psyche van de Orde, maar veroorzaakten ook het verval van hun lichaam.","De genetiske mutasjonene forårsaket av viruset forvrengte ikke bare ordenens psyke, men fikk kroppene deres til å forfalle.","Mutacje genetyczne spowodowane przez wirusa nie tylko wypaczyły psychikę Zakonu, ale spowodowały rozkład ich ciał.","As mutações genéticas causadas pelo vírus não somente distorceu as mentes da Ordem, mas também deterioraram nossos corpos.",,"Mutațiile genetice nu numai că au sucit psihicul Ordinului, dar le-a făcut corpul să se deterioreze.","Генетические мутации, которые возникали из-за вируса, не только извращали психику членов Ордена, но и вызывали гниение их тел.",,"De genetiska mutationer som viruset orsakade förvrängde inte bara ordens psykiska tillstånd, utan fick deras kroppar att förfalla.","Virüsün neden olduğu genetik mutasyonlar sadece Tarikat'ın psikolojisini bozmakla kalmadı, aynı zamanda bedenlerinin de çürümesine neden oldu." -"Without procreation, the Order found that biomechanical enhancements were the only way to maintain their strengths and numbers.",TXT_SUB_MAP03_2,〃,,,"Řádu došlo, že bez rozmnožování jsou biomechanická vylepšení jediná možnost, jak zachovat své počty a sílu.","Uden forplantning fandt Ordenen ud af, at biomekaniske forbedringer var den eneste måde at bevare deres styrke og antal på.","Ohne die Möglichkeit der Fortpflanzung fand der Orden heraus, dass biomechanische Erweiterungen der einzige Weg waren, um ihre Kräfe und eine hohe Anzahl beizubehalten.",,,"Sin procreación, la Orden se encontró con que las mejoras biomecánicas eran la única forma de mantener sus fuerzas y números.",,Ilman lisääntymistä Veljeskunta katsoi biomekaanisen parantelun ainoaksi tavakseen ylläpitää vahvuuttaan.,"Sans procréation, l'Ordre découvrirent que les modifications bioméchaniques était leur seule chance de conserver leur force et leur nombre.",A szaporodás nélkül a Rendnek csak egyetlen esélye volt az erejük és számuk megtartására: a biomechanikus testi tuningolás.,"Senza la procreazione, l'Ordine trovò che gli apparati biomeccanici erano l'unico modo per mantenere la loro forza e i loro numeri.","繁殖行為という選択肢がないオーダーは、 +"Without procreation, the Order found that biomechanical enhancements were the only way to maintain their strengths and numbers.",TXT_SUB_MAP03_2,〃,,,"Řádu došlo, že bez rozmnožování jsou biomechanická vylepšení jediná možnost, jak zachovat své počty a sílu.","Uden forplantning fandt Ordenen ud af, at biomekaniske forbedringer var den eneste måde at bevare deres styrke og antal på.","Ohne die Möglichkeit der Fortpflanzung fand der Orden heraus, dass biomechanische Erweiterungen der einzige Weg waren, um ihre Kräfe und eine hohe Anzahl beizubehalten.",,,"Sin procreación, la Orden se encontró con que las mejoras biomecánicas eran la única forma de mantener sus fuerzas y números.",,Ilman lisääntymistä Veljeskunta katsoi biomekaanisen parantelun ainoaksi tavakseen ylläpitää vahvuuttaan.,"Sans procréation, l'Ordre découvrirent que les modifications bioméchaniques était leur seule chance de conserver leur force et leur nombre.",,A szaporodás nélkül a Rendnek csak egyetlen esélye volt az erejük és számuk megtartására: a biomechanikus testi tuningolás.,"Senza la procreazione, l'Ordine trovò che gli apparati biomeccanici erano l'unico modo per mantenere la loro forza e i loro numeri.","繁殖行為という選択肢がないオーダーは、 彼らのパワーと数を保つには生体工学による人体改造しかないと判断したのだ。","생식능력이 사라지자, 오더에게 남은 존속 방법은 생체에 기계를 접목한 기술을 발전시키는 것 뿐이었죠.","Zonder voortplanting, vond de Orde dat biomechanische verbeteringen de enige manier waren om hun sterke punten en aantallen te behouden.",Uten forplantning fant ordenen ut at biomekaniske forbedringer var den eneste måten å opprettholde sin styrke og antall på.,"Bez prokreacji Zakon odkrył, że biomechaniczne ulepszenia są jedynym sposobem na utrzymanie siły i liczebności.","Sem procriação, a Ordem descobriu que as modificações biomecânicas eram a única maneira de manter sua força e seus números.",,"Fără procreere, Ordinul a descoperit că îmbunătățirile lor bio-mecanice erau tot ce îi ținea.","Орден обнаружил, что биомеханические улучшения — единственный способ поддержания их численного превосходства при отсутствии деторождения.",,Utan fortplantning fann orden att biomekaniska förbättringar var det enda sättet att behålla sin styrka och sitt antal.,"Üreme olmadan, Düzen güçlerini ve sayılarını korumanın tek yolunun biyomekanik geliştirmeler olduğunu gördü." -The decay has advanced so that most of the troops we face are more machine than man but we believe that their collective consciousness is controlled by one source...,TXT_SUB_MAP03_3,〃,,,"Rozklad pokročil tak daleko, že většina nepřátel, kterým čelíme, jsou spíše stroje než lidé, ale věříme, že jejich kolektivní vědomí je řízené z jednoho zdroje...","Forfaldet er fremskredet, så de fleste af de tropper, vi står over for, er mere maskiner end mennesker, men vi tror, at deres kollektive bevidsthed styres af én kilde...","Der Verfall ist so weit fortgeschritten, dass die meisten Truppen, denen wir begegnen mehr Maschine als Mensch sind, aber wir glauben, dass ihr kollektives Bewusstsein von einer Quelle kontrolliert wird...",,,El deterioro ha avanzado tanto que la mayoría de tropas a las que nos enfrentamos son más máquina que hombre pero creemos que su consciencia colectiva es controlada por una única fuente...,,"Rappeutuminen on edennyt niin pitkälle, että suurin osa kohtaamistamme joukoista on enemmän koneita kuin ihmisiä, mutta me uskomme, että heidän yhteistä tietoisuuttaan ohjaa yksi lähde...","Les dégradations étaient si avancées que les troupes auxquelles nous faisions face étaient plus machine qu'humains, mais nous pensons que leur conscience collective est contrôlée par une seule source..","A bomlás annyira előrehaladott, hogy a harctéren látott egységek nagyobb részben robotok mint emberek, de úgy gondoljuk hogy az elméjüket egy központi tudat irányítja...","La decomposizione è avanzata a tal punto che molte delle truppe che vediamo sono più macchine che uomini, ma noi crediamo che la loro coscienza collettiva sia controllata da un'unica fonte...","彼らの肉体へのダメージは深刻で、我らが遭遇した兵士たちは人間と言うよりは +The decay has advanced so that most of the troops we face are more machine than man but we believe that their collective consciousness is controlled by one source...,TXT_SUB_MAP03_3,〃,,,"Rozklad pokročil tak daleko, že většina nepřátel, kterým čelíme, jsou spíše stroje než lidé, ale věříme, že jejich kolektivní vědomí je řízené z jednoho zdroje...","Forfaldet er fremskredet, så de fleste af de tropper, vi står over for, er mere maskiner end mennesker, men vi tror, at deres kollektive bevidsthed styres af én kilde...","Der Verfall ist so weit fortgeschritten, dass die meisten Truppen, denen wir begegnen mehr Maschine als Mensch sind, aber wir glauben, dass ihr kollektives Bewusstsein von einer Quelle kontrolliert wird...",,,El deterioro ha avanzado tanto que la mayoría de tropas a las que nos enfrentamos son más máquina que hombre pero creemos que su consciencia colectiva es controlada por una única fuente...,,"Rappeutuminen on edennyt niin pitkälle, että suurin osa kohtaamistamme joukoista on enemmän koneita kuin ihmisiä, mutta me uskomme, että heidän yhteistä tietoisuuttaan ohjaa yksi lähde...","Les dégradations étaient si avancées que les troupes auxquelles nous faisions face étaient plus machine qu'humains, mais nous pensons que leur conscience collective est contrôlée par une seule source..",,"A bomlás annyira előrehaladott, hogy a harctéren látott egységek nagyobb részben robotok mint emberek, de úgy gondoljuk hogy az elméjüket egy központi tudat irányítja...","La decomposizione è avanzata a tal punto che molte delle truppe che vediamo sono più macchine che uomini, ma noi crediamo che la loro coscienza collettiva sia controllata da un'unica fonte...","彼らの肉体へのダメージは深刻で、我らが遭遇した兵士たちは人間と言うよりは もはや機械に近いと言える。だが、彼らの集合意識はたった一人によってコントロールされていると 我々は考えている。","부패가 많이 진행되었기에 우리는 사람보다 기계에 가까운 적들과 싸웠고, 우리는 그들의 집단의식이 어떤 하나의 존재가 통제하는 것이라고 생각하고 있습니다...","Het verval is zo ver gevorderd dat de meeste van de troepen die we tegenkomen meer machine zijn dan de mens, maar we geloven dat hun collectieve bewustzijn wordt gecontroleerd door één bron....","Forfallet har gått så langt at de fleste av troppene vi står overfor er mer maskin enn menneske, men vi tror at deres kollektive bevissthet styres av én kilde...","Rozkład postępuje tak, że większość oddziałów, z którymi mamy do czynienia, to bardziej maszyny niż ludzie, ale wierzymy, że ich zbiorowa świadomość jest kontrolowana przez jedno źródło...",A deterioração avançou de tal forma que a maioria dos soldados que enfrentamos são mais máquina do que humano. Mas acreditamos que a consciência coletiva deles é controlada por uma só fonte... ,,Deteriorarea a avansat în așa fel încăt majoritatea soldațiilor pe care îi înfruntăm să fie mai mult mașini decât oameni dar credem că subconștientul lor colectiv e controlat de o singură sursă...,"Гниение распространялось, поэтому большинство их солдат скорее машины, чем люди. Но мы полагаем, что их коллективное сознание управляется из единого центра...",,"Förfallet har gått framåt så att de flesta av de trupper vi möter är mer maskiner än människor, men vi tror att deras kollektiva medvetande styrs av en enda källa...","Çürüme o kadar ilerledi ki, karşılaştığımız birliklerin çoğu insandan çok makine ama biz onların kolektif bilincinin tek bir kaynak tarafından kontrol edildiğine inanıyoruz..." -"...the Programmer: creator of the AI which controls the Acolytes. Destroy the Programmer, and we may cripple the Order's troops with a single blow. But caution: we have reports he can vaporize attackers.",TXT_SUB_MAP03_4,〃,,,"...Programátor: tvůrce umělé inteligence, která ovládá akolyty. Znič Programátora a dost možná zasadíme vojskům Řádu mocnou ránu. Ale buď opatrný: Máme zprávy, že umí nechat své útočníky vypařit.","...programmøren: Skaberen af den AI, der styrer akolytterne. Hvis vi ødelægger programmøren, kan vi lamme ordenens tropper med et enkelt slag. Men pas på: Vi har rapporter om, at han kan fordampe angribere.","...der Programmierer: Entwickler der KI, die die Ministranten kontrolliert. Vernichte den Programmierer, und wir könnten die Truppen des Ordens mit einem einzigen Schlag lahmlegen. Aber sieh dich vor. Wir haben Meldungen, dass er Angreifer vaporisieren kann.",,,... el Programador - creador de la IA que controla a los Acólitos. Destruye al Programador y podremos herir a las tropas de la Orden de un solo golpe. Pero cuidado: tenemos informes de que puede vaporizar a atacantes.,,"Ohjelmoitsija: akoluutteja ohjaavan tekoälyn luoja. Tuhoa Ohjelmoitsija, ja saatamme rampauttaa Veljeskunnan joukot yhdellä iskulla. Mutta ole varovainen: tietojemme mukaan hän kykenee haihduttamaan vastustajansa.",Le Programmeur: Créateur de l'IA qui contrôle les Acolytes. Détruisez le Programmeur et nous pourrons paralyser les troupes de l'Ordre d'un seul coup. Faites attentions: des rapports nous disent qu'il peut vaporiser ceux qui l'attaquent.,...maga a Programozó: a ministránsokat irányító MI megalkotója. A Programozót megölve megbéníthatjuk a Rend seregét egy csapással. Azonban vigyázz: a jelentések szerint instant el tudja porlasztani támadóit.,"...il Programmatore: creatore dell'Intelligenza Artificiale che controlla gli Accoliti. Distruggi il Programmatore, e noi potremmo rendere inefficienti i soldati dell'Ordine con un colpo solo. Ma attento: i nostri rapporti indicano che può vaporizzare gli aggressori.","その者の名はプログラマーだ。 +"...the Programmer: creator of the AI which controls the Acolytes. Destroy the Programmer, and we may cripple the Order's troops with a single blow. But caution: we have reports he can vaporize attackers.",TXT_SUB_MAP03_4,〃,,,"...Programátor: tvůrce umělé inteligence, která ovládá akolyty. Znič Programátora a dost možná zasadíme vojskům Řádu mocnou ránu. Ale buď opatrný: Máme zprávy, že umí nechat své útočníky vypařit.","...programmøren: Skaberen af den AI, der styrer akolytterne. Hvis vi ødelægger programmøren, kan vi lamme ordenens tropper med et enkelt slag. Men pas på: Vi har rapporter om, at han kan fordampe angribere.","...der Programmierer: Entwickler der KI, die die Ministranten kontrolliert. Vernichte den Programmierer, und wir könnten die Truppen des Ordens mit einem einzigen Schlag lahmlegen. Aber sieh dich vor. Wir haben Meldungen, dass er Angreifer vaporisieren kann.",,,... el Programador - creador de la IA que controla a los Acólitos. Destruye al Programador y podremos herir a las tropas de la Orden de un solo golpe. Pero cuidado: tenemos informes de que puede vaporizar a atacantes.,,"Ohjelmoitsija: akoluutteja ohjaavan tekoälyn luoja. Tuhoa Ohjelmoitsija, ja saatamme rampauttaa Veljeskunnan joukot yhdellä iskulla. Mutta ole varovainen: tietojemme mukaan hän kykenee haihduttamaan vastustajansa.",Le Programmeur: Créateur de l'IA qui contrôle les Acolytes. Détruisez le Programmeur et nous pourrons paralyser les troupes de l'Ordre d'un seul coup. Faites attentions: des rapports nous disent qu'il peut vaporiser ceux qui l'attaquent.,,...maga a Programozó: a ministránsokat irányító MI megalkotója. A Programozót megölve megbéníthatjuk a Rend seregét egy csapással. Azonban vigyázz: a jelentések szerint instant el tudja porlasztani támadóit.,"...il Programmatore: creatore dell'Intelligenza Artificiale che controlla gli Accoliti. Distruggi il Programmatore, e noi potremmo rendere inefficienti i soldati dell'Ordine con un colpo solo. Ma attento: i nostri rapporti indicano che può vaporizzare gli aggressori.","その者の名はプログラマーだ。 彼はアコライト達を操作している人工知能の作成者だ。 プログラマーを殺害すれば、それによってオーダーの兵士たちを無力化できるはずだ。 だが気をつけておけ、ヤツは熱で敵を蒸発させられるとの報告があるからな。","... 프로그래머: 아콜라이트들을 통제하는 인공지능의 창조자 말입니다. 그를 파괴하면 일격으로 오더의 군대를 무력화시킬 수 있을 겁니다. 하지만 조심하세요, 보고에 의하면 그는 자기 상대를 가루로 만들어 버린다는군요.","...de programmeur: maker van de AI die de Acolieten bestuurt. Vernietig de programmeur, en we kunnen de troepen van de Orde met een enkele klap verlammen. Maar opgelet: we hebben meldingen dat hij aanvallers kan verdampen.","...programmereren: skaperen av AI-en som kontrollerer akolyttene. Ødelegger vi Programmereren, kan vi lamme Ordenens tropper med ett slag. Men forsiktighet: Vi har rapporter om at han kan pulverisere angripere.","...Programista: twórca SI, która kontroluje Akolitów. Zniszcz Programistę, a możemy sparaliżować wojska Zakonu jednym uderzeniem. Ale uwaga: mamy doniesienia, że potrafi on wyparować napastników.","...o Programador: o criador da inteligência artificial que controla os Acólitos. Destrua o programador e, assim, poderemos prejudicar as tropas da Ordem com um único golpe. Mas cuidado: temos relatos de que ele pode vaporizar aqueles que atacam.",,"...Programatorul: creatorul inteligenței artificiale care controlează Acoliții. Distruge-l, și vom nimicii trupele Ordinului cu o singură lovitură: avem rapoarte care spun că poate vaporiza atacatorii.","...Программистом — создателем ИИ, контролирующего служителей. Уничтожь Программиста, и мы разделаемся с войсками Ордена одним ударом. Но осторожнее — нам докладывали, что он умеет... испепелять нападающих.",,...Programmeraren: skaparen av den intelligenta intelligens som kontrollerar akoliterna. Förstör Programmeraren och vi kan lamslå ordens trupper med ett enda slag. Men var försiktig: vi har rapporterat att han kan förånga angripare.,"...Programcı: Yardımcıları kontrol eden yapay zekanın yaratıcısı. Programcı'yı yok edersek, Tarikat'ın birliklerini tek bir darbeyle etkisiz hale getirebiliriz. Ama dikkat: Saldırganları buharlaştırabildiğine dair raporlarımız var." -"Fragments assembled from the Programmers files tell us that the Order is worshipping an intelligent weapon. They call it ""the Sigil"".",TXT_SUB_MAP10_1,MAP10: Macil.,,,"Útržky poskládané z Programátorových souborů nám říkají, že Řád uctívá inteligentní zbraň. Říkají jí „Pečeť“.","Fragmenter, der er samlet fra Programmerens filer, fortæller os, at Ordenen tilbeder et intelligent våben. De kalder det ""Sigil"".","Fragmente, zusammengestellt aus den Dateien des Programmierers, sagen uns, dass der Orden eine intelligente Waffe verehrt. Sie nennen sie „Das Sigil“.",,,"Fragmentos reunidos de los archivos del Programador nos dicen que la Orden adora un arma inteligente. La llaman ""el Emblema"".",,Ohjelmoitsijan tiedostoista kerättyjen pirstaleiden mukaan Veljeskunta palvoo älykästä asetta. He kutsuvat sitä Sinetiksi.,"Des fragments des fichiers du Programmeur que nous avons assemblés nous disent que l'Ordre vénère une arme intelligente. Ils l'appelent le ""Sigil"".","A Programozó fájljainak töredékeiből kiderítettük, hogy a Rend egy intelligens fegyverhez imádkozik. Csak ""Pecsét"" néven említik.","Frammenti dei file del Programmatore che abbiamo assemblato ci dicono che l'Ordine venera un'arma intelligente. La chiamano ""il Sigillo"".","プログラマーの資料を要約するとその欠片はオーダー達が崇拝する知性を持った武器、 +"Fragments assembled from the Programmers files tell us that the Order is worshipping an intelligent weapon. They call it ""the Sigil"".",TXT_SUB_MAP10_1,MAP10: Macil.,,,"Útržky poskládané z Programátorových souborů nám říkají, že Řád uctívá inteligentní zbraň. Říkají jí „Pečeť“.","Fragmenter, der er samlet fra Programmerens filer, fortæller os, at Ordenen tilbeder et intelligent våben. De kalder det ""Sigil"".","Fragmente, zusammengestellt aus den Dateien des Programmierers, sagen uns, dass der Orden eine intelligente Waffe verehrt. Sie nennen sie „Das Sigil“.",,,"Fragmentos reunidos de los archivos del Programador nos dicen que la Orden adora un arma inteligente. La llaman ""el Emblema"".",,Ohjelmoitsijan tiedostoista kerättyjen pirstaleiden mukaan Veljeskunta palvoo älykästä asetta. He kutsuvat sitä Sinetiksi.,"Des fragments des fichiers du Programmeur que nous avons assemblés nous disent que l'Ordre vénère une arme intelligente. Ils l'appelent le ""Sigil"".",,"A Programozó fájljainak töredékeiből kiderítettük, hogy a Rend egy intelligens fegyverhez imádkozik. Csak ""Pecsét"" néven említik.","Frammenti dei file del Programmatore che abbiamo assemblato ci dicono che l'Ordine venera un'arma intelligente. La chiamano ""il Sigillo"".","プログラマーの資料を要約するとその欠片はオーダー達が崇拝する知性を持った武器、 'シジル'だ。","프로그래머의 파괴된 기록들을 복원해보니, 오더가 자아를 가진 한 무기를 숭배하고 있다는군요. 그들은 이걸 “시질”이라고 부릅니다.","Fragmenten uit de Programmers bestanden vertellen ons dat de Orde een intelligent wapen aanbidt. Ze noemen het ""de Sigil"".","Fragmenter fra Programmererens filer forteller oss at Ordenen tilber et intelligent våpen. De kaller det ""Sigil"".","Fragmenty zebrane z akt Programistów mówią nam, że Zakon czci inteligentną broń. Nazywają ją ""Sigil"".","Os fragmentos dos relatórios sobre o Programador que conseguimos juntar dizem que a Ordem está venerando uma arma inteligente. Eles a chamam de ""Sigilo"".",,"Fragmentele asamblate din fișierele Programatorului ne spun că Ordinul venerează o armă inteligentă. O numesc ""Sigiliul"".","Мы собирали информацию по крупицам из обрывков файлов Программиста и выяснили, что Орден поклоняется разумному оружию. Они называют его «Печатью».",,"Fragment som samlats ihop från Programmerarens filer säger oss att Orden dyrkar ett intelligent vapen. De kallar det ""Sigil"".","Programcıların dosyalarından toplanan parçalar bize Tarikat'ın akıllı bir silaha taptığını söylüyor. Ona ""Sigil"" diyorlar." -"The piece you touched and recovered is one of five. It wields power drawn from the user's own life force. While you live, you control its power.",TXT_SUB_MAP10_2,〃,,,"Díl, kterého jsi se dotknul a ponechal si je jeden z pěti. Mocní se silou, napájenou ze životní energie jejího majitele. Dokud žiješ, ovládáš jeho sílu.","Det stykke, du rørte og fandt, er et af fem. Det udøver kraft fra brugerens egen livskraft. Mens du lever, kontrollerer du dens kraft.","Das Teil, das du berührt und gefunden hast, ist eines von fünf. Es bezieht die Kraft von der Lebensenergie des Benutzers. So lange du lebst, kontrollierst du seine Kraft.",,,"La pieza que has tocado y recuperado es una de cinco. Esgrime poder tomado de la propia fuerza de vida del usuario. Mientras vivas, controlas su poder.",,"Koskettamasi osanen, jonka otit talteen, on yksi viidestä. Se saa voimansa käyttäjänsä omasta elämänvoimasta. Niin kauan kuin sinä elät, hallitset sen voimaa.","La pièce que vous avez touché et récupéré n'est qu'une parmi cinq. Elle utilise la force vitale de son utilisateur. Tant que vous êtes en vie, vous son pouvoir sous votre contrôle.","A darabka amit megérintettél és visszaszereztél csak egy az ötből. Erejét a hordozója életerejéből meríti. Amíg tehát élsz, tudod irányítani.","Il pezzo che hai toccato e recuperato è solo uno di cinque. Utilizza la forza vitale dell'utilizzatore. Finchè sei vivo, hai il potere sotto il tuo controllo.","君が欠片を取り戻したがそれは5つある内の1つだ。 +"The piece you touched and recovered is one of five. It wields power drawn from the user's own life force. While you live, you control its power.",TXT_SUB_MAP10_2,〃,,,"Díl, kterého jsi se dotknul a ponechal si je jeden z pěti. Mocní se silou, napájenou ze životní energie jejího majitele. Dokud žiješ, ovládáš jeho sílu.","Det stykke, du rørte og fandt, er et af fem. Det udøver kraft fra brugerens egen livskraft. Mens du lever, kontrollerer du dens kraft.","Das Teil, das du berührt und gefunden hast, ist eines von fünf. Es bezieht die Kraft von der Lebensenergie des Benutzers. So lange du lebst, kontrollierst du seine Kraft.",,,"La pieza que has tocado y recuperado es una de cinco. Esgrime poder tomado de la propia fuerza de vida del usuario. Mientras vivas, controlas su poder.",,"Koskettamasi osanen, jonka otit talteen, on yksi viidestä. Se saa voimansa käyttäjänsä omasta elämänvoimasta. Niin kauan kuin sinä elät, hallitset sen voimaa.","La pièce que vous avez touché et récupéré n'est qu'une parmi cinq. Elle utilise la force vitale de son utilisateur. Tant que vous êtes en vie, vous son pouvoir sous votre contrôle.",,"A darabka amit megérintettél és visszaszereztél csak egy az ötből. Erejét a hordozója életerejéből meríti. Amíg tehát élsz, tudod irányítani.","Il pezzo che hai toccato e recuperato è solo uno di cinque. Utilizza la forza vitale dell'utilizzatore. Finchè sei vivo, hai il potere sotto il tuo controllo.","君が欠片を取り戻したがそれは5つある内の1つだ。 使用者の生命を吸い上げ激しい力を引き出す。 ただ制御下におけるのは生きている間だけだ。","당신이 건져낸 조각은 다섯 개의 조각 중 하나입니다. 이것은 사용자의 생명력을 빨아들여 위력을 발휘합니다. 당신이 살아있는 동안, 녀석의 힘은 당신의 것입니다.","Het stuk dat je hebt aangeraakt en teruggevonden is een van de vijf. Het heeft kracht die getrokken wordt uit de eigen levenskracht van de gebruiker. Terwijl je leeft, heb je de macht ervan in handen.","Brikken du berørte og gjenopprettet er en av fem. Den har kraft hentet fra brukerens egen livskraft. Mens du lever, kontrollerer du dens kraft.","Kawałek, który dotknąłeś i odzyskałeś, jest jednym z pięciu. Włada mocą czerpaną z własnej siły życiowej użytkownika. Póki żyjesz, kontrolujesz jego moc.","A peça que você tocou e recuperou é uma das cinco peças. Seu poder vem da própria energia de vida de quem a usa. Enquanto você viver, você controla o poder dela.",,"Piesa pe care ai atins-o și recuperat-o e una din cinci. Își trage puterea din deținător. Cât trăiești, o controlezi.","Тот фрагмент, что ты подобрал и активировал, — один из пяти. Он использует мощь, которую черпает из жизненных сил владельца. Пока ты жив, она подвластна тебе.",,Den bit som du rörde vid och återfann är en av fem. Den använder kraft som hämtas från användarens egen livskraft. Så länge du lever kontrollerar du dess kraft.,"Dokunduğunuz ve kurtardığınız parça beş taneden biri. Kullanıcının kendi yaşam gücünden alınan gücü kullanıyor. Yaşadığın sürece, onun gücünü kontrol ediyorsun." -"The shock which knocked you out was the Sigil piece tuning itself to you, your pulse and brain waves. You can wield it, but at a cost: it will drain you dry.",TXT_SUB_MAP10_3,〃,,,"Ránu, která tě uspala, způsobil ten díl Pečeti, ladící sám sebe k tobě, tvému pulzu a mozkovým vlnám. Můžeš jej používat, ale za určitou cenu: Bude tě vysilovat.","Det chok, der slog dig bevidstløs, var Sigilstykket, der indstillede sig på dig, din puls og dine hjernebølger. Du kan bruge det, men det har en pris: det vil dræne dig for energi.","Der Schock, durch den du das Bewusstsein verloren hast, wurde verursacht, als das Sigilteil sich auf dich, deinen Puls und deine Gehirnwellen eingestellt hat. Du kannst es benutzen, aber es wird dich austrocknen.",,,"El choque que te derribó fue la pieza del Emblema sintonizándose contigo, con tu pulso y ondas cerebrales. Puedes empuñarla, pero con un precio: Te dejará seco.",,"Kokemasi sysäys, joka tyrmäsi sinut, oli Sinetin virittäytymistä sinuun, sinun sykkeeseesi ja aivoaaltoihisi. Hallitset sitä, mutta sillä hinnalla, että se imee sinut kuiviin.","Le choc qui vous a rendu inconscient venait de la pièce du Sigil qui s'est alignée sur votre énergie vitale, votre pouls et vos ondes cérébrales. Vous pouvez l'utiliser, mais au coût de votre vie.","A sokk ami kiütött nem volt más, mint maga a Pecsét ráhangolódása a pulzusodra és agyhullámodra. Forgathatod mint egy kardot, de ára van: kiszívja az életerődet.","Lo schock che ti ha fatto perdere i sensi era un pezzo del Sigillo che si è allineato con la tua energia vitale, il tuo polso e le tue onde cerebrali. Puoi utilizzarlo, ma ad un costo: ti prosciugherà in pieno.","君を気絶させた衝撃は、シジルの欠片が脈拍と脳波を同期させた際に起こした様だ。 +"The shock which knocked you out was the Sigil piece tuning itself to you, your pulse and brain waves. You can wield it, but at a cost: it will drain you dry.",TXT_SUB_MAP10_3,〃,,,"Ránu, která tě uspala, způsobil ten díl Pečeti, ladící sám sebe k tobě, tvému pulzu a mozkovým vlnám. Můžeš jej používat, ale za určitou cenu: Bude tě vysilovat.","Det chok, der slog dig bevidstløs, var Sigilstykket, der indstillede sig på dig, din puls og dine hjernebølger. Du kan bruge det, men det har en pris: det vil dræne dig for energi.","Der Schock, durch den du das Bewusstsein verloren hast, wurde verursacht, als das Sigilteil sich auf dich, deinen Puls und deine Gehirnwellen eingestellt hat. Du kannst es benutzen, aber es wird dich austrocknen.",,,"El choque que te derribó fue la pieza del Emblema sintonizándose contigo, con tu pulso y ondas cerebrales. Puedes empuñarla, pero con un precio: Te dejará seco.",,"Kokemasi sysäys, joka tyrmäsi sinut, oli Sinetin virittäytymistä sinuun, sinun sykkeeseesi ja aivoaaltoihisi. Hallitset sitä, mutta sillä hinnalla, että se imee sinut kuiviin.","Le choc qui vous a rendu inconscient venait de la pièce du Sigil qui s'est alignée sur votre énergie vitale, votre pouls et vos ondes cérébrales. Vous pouvez l'utiliser, mais au coût de votre vie.",,"A sokk ami kiütött nem volt más, mint maga a Pecsét ráhangolódása a pulzusodra és agyhullámodra. Forgathatod mint egy kardot, de ára van: kiszívja az életerődet.","Lo schock che ti ha fatto perdere i sensi era un pezzo del Sigillo che si è allineato con la tua energia vitale, il tuo polso e le tue onde cerebrali. Puoi utilizzarlo, ma ad un costo: ti prosciugherà in pieno.","君を気絶させた衝撃は、シジルの欠片が脈拍と脳波を同期させた際に起こした様だ。 それを振り回す時は気を付けろ、代償で体が干上がってしまうらしい。","당신을 기절시킨 충격은 시질이 당신의 심박과 뇌파와 반응하면서 비롯되었습니다. 이 무기를 써도 되지만, 조심하세요: 당신을 말려 죽일 수도 있으니까.","De schok die je bewusteloos maakte, was de Sigil die zich op jou, je pols en hersengolven, afstemde. Je kunt het gebruiken, maar tegen een prijs: het zal je droog laten vallen.","Sjokket som slo deg ut var Sigil-brikken som innstilte seg på deg, pulsen din og hjernebølgene dine. Du kan bruke det, men det koster: det vil tappe deg for krefter.","Wstrząs, który cię znokautował, to kawałek Sigilu, który dostroił się do ciebie, twojego pulsu i fal mózgowych. Możesz nim władać, ale za pewną cenę: wyczerpie cię do cna.","O choque que te derrubou foi da peça do Sigilo se calibrando a você, com o seu pulso e suas ondas cerebrais. Você pode usá-la, mas tem um custo: ela vai te drenar por completo.",,"Șocul care te-a lăsat inconștient a fost piesa care s-a întors asupra ta. O controlezi, dar cu un preț: o să te sece.","Ты потерял сознание, потому что фрагмент Печати подстраивался под тебя, под твоё сердцебиение и мозговые ритмы. Теперь ты сможешь им пользоваться, но он будет взымать свою плату, иссушая тебя.",,"Den chock som slog dig medvetslös var att Sigilstycket anpassade sig till dig, din puls och dina hjärnvågor. Du kan använda den, men till ett pris: den kommer att tömma dig på vatten.","Sizi bayıltan şok, Sigil parçasının kendisini size, nabzınıza ve beyin dalgalarınıza göre ayarlamasıydı. Onu kullanabilirsin ama bir bedeli var: Seni kurutacak." -One piece constitutes awesome power. Possession of all five pieces would be devastating and would give the user total control of the planet.,TXT_SUB_MAP10_4,〃,,,Jen jeden díl obsahuje ohromnou sílu. Vlastnictví všech pěti dílů by bylo devastující a jeho majitel by byl schopen ovládat celou planetu.,Et stykke udgør en fantastisk kraft. Besiddelse af alle fem stykker ville være ødelæggende og ville give brugeren total kontrol over planeten.,"Ein Teil stellt große Macht dar. Der Besitz aller fünf Teile wäre verheerend, und der Nutzer hätte die totale Kontrolle über den Planeten.",,,"Una pieza constituye un poder impresionante, poseer las cinco piezas sería devastador y daría al usuario control total del planeta.",,Jo yhdessä osasessa piilee valtava mahti. Kaikkien viiden osasen hallitseminen olisi tuhoisaa ja antaisi käyttäjälleen täydellisen otteen planeetasta.,Une pièce représente un pouvoir phénoménal. Posséder toutes les cinq serait dévastateur: cela donnerait à l'utilisateur le contrôle total sur la planète.,"Egy darab nagy hatalmat biztosít hordozójának. Azonban mind az öt darabka együtt emberfeletti erővel ruházná fel, és az egész bolygó felett átvenné a hatalmat.",Un pezzo costituisce un potere fenomenale. Il possesso di tutti i cinque pezzi sarebbe devastante: darebbe all'utilizzatore il controllo totale sul pianeta.,"だがたった一つでも相当な力を放つ。 +One piece constitutes awesome power. Possession of all five pieces would be devastating and would give the user total control of the planet.,TXT_SUB_MAP10_4,〃,,,Jen jeden díl obsahuje ohromnou sílu. Vlastnictví všech pěti dílů by bylo devastující a jeho majitel by byl schopen ovládat celou planetu.,Et stykke udgør en fantastisk kraft. Besiddelse af alle fem stykker ville være ødelæggende og ville give brugeren total kontrol over planeten.,"Ein Teil stellt große Macht dar. Der Besitz aller fünf Teile wäre verheerend, und der Nutzer hätte die totale Kontrolle über den Planeten.",,,"Una pieza constituye un poder impresionante, poseer las cinco piezas sería devastador y daría al usuario control total del planeta.",,Jo yhdessä osasessa piilee valtava mahti. Kaikkien viiden osasen hallitseminen olisi tuhoisaa ja antaisi käyttäjälleen täydellisen otteen planeetasta.,Une pièce représente un pouvoir phénoménal. Posséder toutes les cinq serait dévastateur: cela donnerait à l'utilisateur le contrôle total sur la planète.,,"Egy darab nagy hatalmat biztosít hordozójának. Azonban mind az öt darabka együtt emberfeletti erővel ruházná fel, és az egész bolygó felett átvenné a hatalmat.",Un pezzo costituisce un potere fenomenale. Il possesso di tutti i cinque pezzi sarebbe devastante: darebbe all'utilizzatore il controllo totale sul pianeta.,"だがたった一つでも相当な力を放つ。 それが5つ揃った時は圧倒的な力で世界をも支配下に置けるだろう。","하나의 조각으로도 엄청난 위력을 가지게 되고, 다섯 조각 모두를 얻으면 이 세상을 평정할 만큼 강력한 위력을 발휘할 것입니다.",Een stuk vormt ontzagwekkende kracht. Het bezit van alle vijf de stukken zou verwoestend zijn en zou de gebruiker de volledige controle over de planeet geven.,Ett stykke utgjør en fantastisk kraft. Besittelse av alle fem brikkene ville være ødeleggende og gi brukeren total kontroll over planeten.,Jeden kawałek stanowi niesamowitą moc. Posiadanie wszystkich pięciu kawałków byłoby niszczące i dałoby użytkownikowi całkowitą kontrolę nad planetą.,Uma das peças possui um poder tremendo. Possuir todas as cinco peças seria devastador e daria controle total do planeta ao utilizador.,,O piesă constituie putere uimitoare. Posesiunea tuturor pieselor ar fi devastatore și ar da deținătorului control asupra întregii planete.,Один фрагмент — уже немалая сила. Пять фрагментов будут опустошающей силой. Их владелец получит полную власть над планетой.,,Ett stycke utgör en fantastisk kraft. Att äga alla fem delar skulle vara förödande och ge användaren total kontroll över planeten.,Tek bir parça müthiş bir güç demektir. Beş parçaya birden sahip olmak yıkıcı olur ve kullanıcıya gezegenin kontrolünü tamamen verir. -"Listen, this com unit tells me that you're 100% human. I've been ordered to bring you in, we're talking trust here. Betray me and pay. Oh, and by the way, you can call me Blackbird.",TXT_SUB_LOG2,MAP02: After getting the com unit from Rowan and leaving his room.,,,"Poslyš, tento komunikátor mi říká, že jsi na sto procent člověkem. Dostala jsem rozkaz tě přivést tě k nám; jde o důvěryhodnou záležitost - zraď mě a zaplatíš. Jo, a mimochodem, můžeš mi říkat Straka.","Hør, denne com-enhed fortæller mig, at du er 100 % menneskelig. Jeg er blevet beordret til at bringe dig ind, vi taler om tillid her. Forråd mig og betal. Og forresten, du kan kalde mig Blackbird.","Hör zu, dieser Kommunikator sagt mit, dass du noch 100% menschlich bist. Mir wurde aufgetragen, dich zu unserer Zentrale zu führen. Wir reden über Vertrauen, wenn du mich verrätst, wirst du bezahlen. Übrigens, du kannst mich Blackbird nennen.",,,"Escucha, este intercomunicador me dice que eres 100% humano. Se me ha ordenado dejarte entrar, así que hablamos en confianza. Traicióname y pagarás. Ah, por cierto, puedes llamarme BlackBird.","Escucha, este intercomunicador me dice que eres 100% humano. Se ordenadó dejarte entrar, así que hablamos en confianza. Traicióname y te vas a arrepentir. Ah, por cierto, puedes llamarme BlackBird.","Kuule, tämä viestintälaite ilmaisee sinun olevan sataprosenttisesti ihminen. Minut on määrätty tuomaan sinut meidän joukkoomme; puhumme luottamuksellisesti. Petä minut ja saat luvan maksaa. Ja muuten, voit kutsua minua Blackbirdiksi.","Ecoute, ce communicateur me dit que tu est 100% humain. On m'a ordonnée de te ramener, c'est une question de confiance. Trahis-moi et tu paieras. Oh, et tu peux m'appeler Blackbird.","Figyelj csak, azt mutatja ez a kommunikációs egység hogy 100%-ban ember vagy. Azt az utasítást kaptam, hogy hozzalak be. Vakon beléd vetjük a bizalmunkat, de tudd, hogy ha elárulsz minket meglakolsz. Ja, és hívhatsz Feketerigónak.","Ascolta, questa unità di comunicazione mi dice che sei 100% umano. Ho l'ordine di farti arrivare da noi, e quindi stiamo parlando di fiducia. Se mi tradisci la pagherai cara. Comunque, mi puoi chiamare Blackbird.","聞こえるか、この無線機がアナタは100%人間だと判断した。 +"Listen, this com unit tells me that you're 100% human. I've been ordered to bring you in, we're talking trust here. Betray me and pay. Oh, and by the way, you can call me Blackbird.",TXT_SUB_LOG2,MAP02: After getting the com unit from Rowan and leaving his room.,,,"Poslyš, tento komunikátor mi říká, že jsi na sto procent člověkem. Dostala jsem rozkaz tě přivést tě k nám; jde o důvěryhodnou záležitost - zraď mě a zaplatíš. Jo, a mimochodem, můžeš mi říkat Straka.","Hør, denne com-enhed fortæller mig, at du er 100 % menneskelig. Jeg er blevet beordret til at bringe dig ind, vi taler om tillid her. Forråd mig og betal. Og forresten, du kan kalde mig Blackbird.","Hör zu, dieser Kommunikator sagt mit, dass du noch 100% menschlich bist. Mir wurde aufgetragen, dich zu unserer Zentrale zu führen. Wir reden über Vertrauen, wenn du mich verrätst, wirst du bezahlen. Übrigens, du kannst mich Blackbird nennen.",,,"Escucha, este intercomunicador me dice que eres 100% humano. Se me ha ordenado dejarte entrar, así que hablamos en confianza. Traicióname y pagarás. Ah, por cierto, puedes llamarme BlackBird.","Escucha, este intercomunicador me dice que eres 100% humano. Se ordenadó dejarte entrar, así que hablamos en confianza. Traicióname y te vas a arrepentir. Ah, por cierto, puedes llamarme BlackBird.","Kuule, tämä viestintälaite ilmaisee sinun olevan sataprosenttisesti ihminen. Minut on määrätty tuomaan sinut meidän joukkoomme; puhumme luottamuksellisesti. Petä minut ja saat luvan maksaa. Ja muuten, voit kutsua minua Blackbirdiksi.","Ecoute, ce communicateur me dit que tu est 100% humain. On m'a ordonnée de te ramener, c'est une question de confiance. Trahis-moi et tu paieras. Oh, et tu peux m'appeler Blackbird.",,"Figyelj csak, azt mutatja ez a kommunikációs egység hogy 100%-ban ember vagy. Azt az utasítást kaptam, hogy hozzalak be. Vakon beléd vetjük a bizalmunkat, de tudd, hogy ha elárulsz minket meglakolsz. Ja, és hívhatsz Feketerigónak.","Ascolta, questa unità di comunicazione mi dice che sei 100% umano. Ho l'ordine di farti arrivare da noi, e quindi stiamo parlando di fiducia. Se mi tradisci la pagherai cara. Comunque, mi puoi chiamare Blackbird.","聞こえるか、この無線機がアナタは100%人間だと判断した。 私はアナタを信頼して良いとみて連れて来るよう命じられた、 反乱への報酬は期待して良いわ。ああ、それと、私の名はブラックバードよ。","잘 들어, 이 통신기에 따르면 넌 100% 인간이야. 너를 믿어도 될 거 같으니 우리 편으로 끌어모으라는 지시를 받았어. 배신했다간 대가를 치를 거야. 아, 그리고, 날 블랙버드라고 불러줘.","Luister, deze com-unit zegt me dat je 100% menselijk bent. Ik heb opdracht gekregen om je binnen te halen, we hebben het hier over vertrouwen. Verraad me en betaal. Oh, en trouwens, je mag me Blackbird noemen.","Denne kommunikasjonsenheten forteller meg at du er 100 % menneskelig. Jeg har fått ordre om å hente deg inn, vi snakker om tillit her. Forråd meg og betal. Og forresten, du kan kalle meg Blackbird.","Słuchaj, to urządzenie mówi mi, że jesteś w 100% człowiekiem. Otrzymałem rozkaz sprowadzenia cię, mówimy tu o zaufaniu. Zdradzisz mnie i zapłacisz. Aha, i przy okazji, możesz mi mówić Blackbird.","Ouça, este comunicador me diz que você é 100% humano. Recebi ordens para te trazer até aqui. É melhor você ser de confiança. Se você me trair, você me paga. Ah, a propósito, pode me chamar de Blackbird.",,"Ascultă, unitatea asta îmi spune că ești 100% uman. Am primit ordin să te aduc, vorbim de încredere aici. Trădează-mă și plătești. Oh, și apropo, îmi poți spune Blackbird.","Слушай — судя по этому передатчику, ты на сто процентов человек. Я получила приказ показать тебе дорогу к нам. Как видишь, тебе доверяют, но если предашь меня — пожалеешь. И да, обращайся ко мне «Чёрный дрозд». ",,"Lyssna, den här kommunikationsenheten säger mig att du är 100 % mänsklig. Jag har fått order att ta in dig, vi pratar om förtroende här. Förråda mig och betala. Och förresten, du kan kalla mig Blackbird.","Dinle, bu iletişim birimi bana senin %100 insan olduğunu söylüyor. Seni getirmem emredildi, burada güvenden bahsediyoruz. Bana ihanet edersen bedelini ödersin. Bu arada bana Karatavuk diyebilirsin." -"Head over to the old town hall. After the Order bombed it, Macil had a tunnel built that lets us get in and out without the acolytes' knowledge.",TXT_SUB_LOG3,MAP02: On the bridge with the com unit.,,,"Zamiř ke staré radnici. Když ji Řád vybombardoval, Macil nechal postavit tunel, který nám umožňuje bez vědomí akolytů dostat se dovnitř a ven.","Gå over til det gamle rådhus. Efter at Ordenen bombede det, fik Macil bygget en tunnel, som lader os komme ind og ud uden acolytes' viden.","Geh zum alten Rathaus. Macil hat einen Tunnel bauen lassen, durch den wir dort reinkommen, ohne dass die Ministranten das mitbekommen.",,,"Dirígete al antiguo ayuntamiento. Después de que lo bombardeara La Orden, Macil hizo construir un túnel que nos permite entrar y salir sin que los acólitos lo sepan.",,"Suuntaa kohti vanhaa kaupungintaloa. Sen jälkeen kun Veljeskunta oli pommittanut sen, Macil rakennutti tunnelin, jonka avulla voimme päästä sisään ja ulos akoluuttien tietämättä.",Dirige-toi vers l'ancienne mairie. Macil a fait construire un tunnel après que L'Ordre l'ait bombardée. Il nous permet d'y entrer sans que l'Ordre nous remarque.,"Menj a régi városközpontba. Miután a Rend lebombázta, Macil építtetett egy titkos alagutat, amin észrevétlenül tudunk ki- és bemenni a ministránsok tudta nélkül.",Raggiungi il vecchio Municipio. Macil ha fatto costruire un tunnel che ci fa entrare ed uscire senza che gli accoliti lo sappiano.,"旧市庁舎に向かうんだ。オーダーに爆撃された後 +"Head over to the old town hall. After the Order bombed it, Macil had a tunnel built that lets us get in and out without the acolytes' knowledge.",TXT_SUB_LOG3,MAP02: On the bridge with the com unit.,,,"Zamiř ke staré radnici. Když ji Řád vybombardoval, Macil nechal postavit tunel, který nám umožňuje bez vědomí akolytů dostat se dovnitř a ven.","Gå over til det gamle rådhus. Efter at Ordenen bombede det, fik Macil bygget en tunnel, som lader os komme ind og ud uden acolytes' viden.","Geh zum alten Rathaus. Macil hat einen Tunnel bauen lassen, durch den wir dort reinkommen, ohne dass die Ministranten das mitbekommen.",,,"Dirígete al antiguo ayuntamiento. Después de que lo bombardeara La Orden, Macil hizo construir un túnel que nos permite entrar y salir sin que los acólitos lo sepan.",,"Suuntaa kohti vanhaa kaupungintaloa. Sen jälkeen kun Veljeskunta oli pommittanut sen, Macil rakennutti tunnelin, jonka avulla voimme päästä sisään ja ulos akoluuttien tietämättä.",Dirige-toi vers l'ancienne mairie. Macil a fait construire un tunnel après que L'Ordre l'ait bombardée. Il nous permet d'y entrer sans que l'Ordre nous remarque.,,"Menj a régi városközpontba. Miután a Rend lebombázta, Macil építtetett egy titkos alagutat, amin észrevétlenül tudunk ki- és bemenni a ministránsok tudta nélkül.",Raggiungi il vecchio Municipio. Macil ha fatto costruire un tunnel che ci fa entrare ed uscire senza che gli accoliti lo sappiano.,"旧市庁舎に向かうんだ。オーダーに爆撃された後 そこにマシルがアコライトに関わる者を欺く為の抜け道を用意している。",구 시청으로 향해. 오더가 이곳을 폭격한 후에 마실이 그곳에 아콜라이트들이 모르는 통행로를 만들어놨어.,"Ga naar het oude stadhuis. Nadat de Orde het gebombardeerd had, liet Macil een tunnel bouwen die ons in en uit laat stappen zonder dat de acolieten het wisten.","Dra til det gamle rådhuset. Etter at Ordenen bombet det, fikk Macil bygget en tunnel som lar oss komme inn og ut uten at akolyttene vet om det.","Udaj się do starego ratusza. Po zbombardowaniu go przez Zakon, Macil kazał wybudować tunel, który pozwala nam wejść i wyjść bez wiedzy akolitów.","Vá até à antiga prefeitura. Depois que a Ordem a bombardeou, Macil mandou construir um túnel que nos leva e tira de lá sem os acólitos perceberem.",,"Du-te la vechea hală a orașului, Macil a construit un tunel care permite trecerea fără a fi detectat.","Отправляйся к старой ратуше. После того, как Орден взорвал её, Мэйсил построил там туннель, который позволяет нам входить и выходить без ведома служителей.",,Gå till det gamla stadshuset. Efter att Orden bombade det lät Macil bygga en tunnel som gör att vi kan ta oss in och ut utan acolytternas vetskap.,"Eski belediye binasına git. Tarikat orayı bombaladıktan sonra Macil, yardımcıların haberi olmadan girip çıkmamızı sağlayan bir tünel inşa ettirdi." -"Go through the door on your left, then the one on the right. The guard's name is Geoff. Tell him you need gold.",TXT_SUB_LOG4,MAP02: In hall town with the com unit.,,,"Projdi dveřmi nalevo a pak napravo. Hlídač se jmenuje Geoff. Řekni mu, že potřebuješ zlato.","Gå gennem døren til venstre og derefter gennem den til højre. Vagtens navn er Geoff. Sig til ham, at du har brug for guld.","Geh durch die linke Tür, dann durch die rechte. Der Wächter heißt Geoff. Sag ihm du brauchst Gold.",,"Iru tra la maldekstra pordo kaj poste tra la dekstra. La nomo de la gardisto estas Geoff; diru al li «Saluton, mi bezonas oron».","Ve por la puerta izquierda y luego por la derecha. El guardia se llama Geoff; dile «Buenas, necesito oro».",,"Kulje sinusta katsottuna vasemmalla puolella olevan oven läpi, sitten oikeanpuoleisesta ovesta. Vartijan nimi on Geoff. Kerro hänelle tarvitsevasi kultaa.",Passe par la porte à gauche puis celle à droite. Le garde s'appelle Geoff. Dis-lui que tu as besoin d'argent.,"Menj át a bal oldali ajtón, majd a jobb oldalin. Az őr neve Geoff. Mond neki, hogy aranyra van szükséged.","Vai oltre la porta alla tua sinistra, e poi la porta alla tua destra. Il nome della guardia è Geoff. Digli che ti serve dell'oro.","すぐ左のドアを通り、右のドアから小部屋に入るんだ。 +"Go through the door on your left, then the one on the right. The guard's name is Geoff. Tell him you need gold.",TXT_SUB_LOG4,MAP02: In hall town with the com unit.,,,"Projdi dveřmi nalevo a pak napravo. Hlídač se jmenuje Geoff. Řekni mu, že potřebuješ zlato.","Gå gennem døren til venstre og derefter gennem den til højre. Vagtens navn er Geoff. Sig til ham, at du har brug for guld.","Geh durch die linke Tür, dann durch die rechte. Der Wächter heißt Geoff. Sag ihm du brauchst Gold.",,"Iru tra la maldekstra pordo kaj poste tra la dekstra. La nomo de la gardisto estas Geoff; diru al li «Saluton, mi bezonas oron».","Ve por la puerta izquierda y luego por la derecha. El guardia se llama Geoff; dile «Buenas, necesito oro».",,"Kulje sinusta katsottuna vasemmalla puolella olevan oven läpi, sitten oikeanpuoleisesta ovesta. Vartijan nimi on Geoff. Kerro hänelle tarvitsevasi kultaa.",Passe par la porte à gauche puis celle à droite. Le garde s'appelle Geoff. Dis-lui que tu as besoin d'argent.,,"Menj át a bal oldali ajtón, majd a jobb oldalin. Az őr neve Geoff. Mond neki, hogy aranyra van szükséged.","Vai oltre la porta alla tua sinistra, e poi la porta alla tua destra. Il nome della guardia è Geoff. Digli che ti serve dell'oro.","すぐ左のドアを通り、右のドアから小部屋に入るんだ。 見張りの名はジェフ。金が必要だ と言えば通じる。","네 왼쪽의 문으로 들어간 후, 다시 오른쪽의 문으로 가. 경비의 이름은 제프야. 그에게 골드가 필요하다고 얘기해.","Ga door de deur links van je, dan die rechts van je. De bewaker heet Geoff. Zeg hem dat je goud nodig hebt.","Gå gjennom døren til venstre, så den til høyre. Vakten heter Geoff. Si at du trenger gull.","Przejdź przez drzwi po lewej, a potem przez te po prawej. Strażnik ma na imię Geoff. Powiedz mu, że potrzebujesz złota.",Vá pela porta à sua esquerda e depois a da direita. O nome do guarda é Geoff. Diga a ele que você precisa de ouro.,,"Du-te prin ușa la stânga, apoi dreapta. Numele gardianului e Geoff. Spune-i că ai nevoie de aur.","Пройди за левую дверь, затем иди направо. Стражника зовут Джефф. Скажи ему, что тебе нужно золото.",,Gå genom dörren till vänster och sedan genom dörren till höger. Vaktens namn är Geoff. Säg till honom att du behöver guld.,"Solundaki kapıdan geç, sonra sağdakinden. Muhafızın adı Geoff. Ona altına ihtiyacın olduğunu söyle." -"Irale is the Front's ""fixer"". He's behind the unmarked door next to the weapons shop.",TXT_SUB_LOG5,MAP03: After joining the Front.,,,Irale je „kutil“ Fronty. Je za neoznačenými dveřmi vedle obchodu se zbraněmi.,"Irale er frontens ""fixer"". Han befinder sig bag den umærkede dør ved siden af våbenbutikken.",Irale ist der „Bastler“ der Front. Er ist hinter der unmarkierten Tür neben dem Waffengeschäft.,,,Irale es el «apañador» del Frente. Está pasando la puerta sin cartel junto a la tienda de armas.,Irale es el «soluccionador» del Frente. Está pasando la puerta sin cartel junto a la tienda de armas.,"Irale on Rintaman ""järkkäri"". Hänet löytää merkkaamattoman oven takaa asekaupan vierestä.",Irale est le receleur du front. Il est derrière la porte non marquée à côté du magasin d'armes.,"Irale a Front ""ezermestere"". A jelöletlen ajtó mögött lesz a fegyverbolt mellett.",Irale è un fornitore di armi per il Fronte. Si trova dietro la porta accanto al negozio di armi.,"イラールとはフロントの'仲介者'よ。彼は武器屋の隣のマークされてないドアに居る。 +"Irale is the Front's ""fixer"". He's behind the unmarked door next to the weapons shop.",TXT_SUB_LOG5,MAP03: After joining the Front.,,,Irale je „kutil“ Fronty. Je za neoznačenými dveřmi vedle obchodu se zbraněmi.,"Irale er frontens ""fixer"". Han befinder sig bag den umærkede dør ved siden af våbenbutikken.",Irale ist der „Bastler“ der Front. Er ist hinter der unmarkierten Tür neben dem Waffengeschäft.,,,Irale es el «apañador» del Frente. Está pasando la puerta sin cartel junto a la tienda de armas.,Irale es el «soluccionador» del Frente. Está pasando la puerta sin cartel junto a la tienda de armas.,"Irale on Rintaman ""järkkäri"". Hänet löytää merkkaamattoman oven takaa asekaupan vierestä.",Irale est le receleur du front. Il est derrière la porte non marquée à côté du magasin d'armes.,,"Irale a Front ""ezermestere"". A jelöletlen ajtó mögött lesz a fegyverbolt mellett.",Irale è un fornitore di armi per il Fronte. Si trova dietro la porta accanto al negozio di armi.,"イラールとはフロントの'仲介者'よ。彼は武器屋の隣のマークされてないドアに居る。 発電所に近い所だ。",이롤리는 프론트의 수리공이기도 해. 무기상점 근처에 그의 가게로 향하는 문이 있을 거야.,"Irale is de ""fixer"" van de Front. Hij zit achter de ongemarkeerde deur naast de wapenwinkel.","Irale er Frontens ""fikser"". Han er bak den umerkede døren ved siden av våpenbutikken.","Irale to ""załatwiacz"" Frontu. Jest za nieoznakowanymi drzwiami obok sklepu z bronią.","Irale é o ""quebra-galho"" da Frente. Ele está atrás da porta desmarcada próxima ao depósito de armas.",,"Irale e ""reparatorul"" Frontului. E în spatele ușii fără însemn lângă magazinul de arme.",Ирэйл — «наладчик» Сопротивления. Ты найдёшь его за дверью без вывески возле оружейного магазина.,,"Irale är frontens ""fixare"". Han finns bakom den omärkta dörren bredvid vapenbutiken.","İrale, Cephe'nin ""iş bitiricisi"". Silah dükkanının yanındaki işaretlenmemiş kapının arkasında." -Remember: kill with stealth instead of force. You won't set off the alarms.,TXT_SUB_LOG6,MAP02,,,Pamatuj: Zabíjej potichu. Nespustíš poplach.,Husk: Dræb med list i stedet for med magt. Du vil ikke udløse alarmen.,Denk daran: Töte lautlos und du wirst den Alarm nicht auslösen.,,,Recuerda: mata con sigilo y no con fuerza para no activar las alarmas.,,Muista: tapa huomaamattomasti voiman sijasta. Niin vältät hälytyksen.,"Souviens-toi: Tue avec discrétion, pas avec force, et tu n'activeras pas les alarmes.","Figyelj arra, hogy lopakodva ölj, ne erővel. Így nem indítod be a riasztót.",Ricorda: uccidi silenziosamente invece di usare la forza. Così facendo non attiverai gli allarmi.,覚えておいて:静かに殺す時はナイフか毒矢だ。警報を鳴らすと厄介なことになる。,기억해: 소음 없이 조용히 죽여. 그럼 경보를 울리지 않을 테니까.,Onthoud: dood met heimelijke in plaats van met geweld. Je laat de alarmen niet afgaan.,"Husk: drep i det skjulte, ikke med makt. Du vil ikke utløse alarmen.","Pamiętaj: zabijaj ukradkiem, a nie siłą. Nie uruchomisz w ten sposób alarmów.",Lembre-se: mate com cautela ao invés de força. Assim você não ativará os alarmes.,,Ține minte: ucide subtil în loc de forță brută. Nu vei declanșa alarma.,"Запомни: убивай бесшумно, не лезь на рожон, и ты не поднимешь тревогу.",,Kom ihåg: döda med smygande i stället för med våld. Du kommer inte att utlösa larmen.,Unutmayın: güç yerine gizlilikle öldürün. Alarmları çalıştırmazsın. -"All I know about the governor is that he's playing both sides to the middle. Here's his so-called ""mansion.""",TXT_SUB_LOG7,MAP03: After joining the Front and going to Mourel's mansion.,,,"O guvernérovi vím jen to, že se snaží uhrávat sympatie obou stran. Tohle je jeho rádoby „sídlo“.","Alt jeg ved om guvernøren er, at han spiller begge sider til midten. Her er hans såkaldte ""palæ"".","Vom Gouverneur weiß ich nur, dass er beide Seiten gegeneinander ausspielt. Hier ist seine sogenannte „Villa.“",,,Todo lo que sé del gobernador es que juega entre ambos bandos. Aquí está su supesta «mansión».,,"Tiedän kuvernööristä vain sen, että hän pelaa keskellä molemmilla puolilla. Tässä on hänen niin sanottu ""kartanonsa"".","Tout ce que je sais au sujet du gouverneur est qu'il est un agent double de chaque côté. Voilà son soi-disant ""manoir"".","Csak annyit tudok a kormányzóról, hogy mindenkét oldalnak dolgozik. Itt az úgynevezett ""kúriája"".",Tutto ciò che so sul governatore è che cerca di mettere gli uni contro gli altri per beneficio personale. Ecco la sua cosidetta dimora.,"私が知事について知っていることは、町の中央で双方を遊ばせてる様だ。 +Remember: kill with stealth instead of force. You won't set off the alarms.,TXT_SUB_LOG6,MAP02,,,Pamatuj: Zabíjej potichu. Nespustíš poplach.,Husk: Dræb med list i stedet for med magt. Du vil ikke udløse alarmen.,Denk daran: Töte lautlos und du wirst den Alarm nicht auslösen.,,,Recuerda: mata con sigilo y no con fuerza para no activar las alarmas.,,Muista: tapa huomaamattomasti voiman sijasta. Niin vältät hälytyksen.,"Souviens-toi: Tue avec discrétion, pas avec force, et tu n'activeras pas les alarmes.",,"Figyelj arra, hogy lopakodva ölj, ne erővel. Így nem indítod be a riasztót.",Ricorda: uccidi silenziosamente invece di usare la forza. Così facendo non attiverai gli allarmi.,覚えておいて:静かに殺す時はナイフか毒矢だ。警報を鳴らすと厄介なことになる。,기억해: 소음 없이 조용히 죽여. 그럼 경보를 울리지 않을 테니까.,Onthoud: dood met heimelijke in plaats van met geweld. Je laat de alarmen niet afgaan.,"Husk: drep i det skjulte, ikke med makt. Du vil ikke utløse alarmen.","Pamiętaj: zabijaj ukradkiem, a nie siłą. Nie uruchomisz w ten sposób alarmów.",Lembre-se: mate com cautela ao invés de força. Assim você não ativará os alarmes.,,Ține minte: ucide subtil în loc de forță brută. Nu vei declanșa alarma.,"Запомни: убивай бесшумно, не лезь на рожон, и ты не поднимешь тревогу.",,Kom ihåg: döda med smygande i stället för med våld. Du kommer inte att utlösa larmen.,Unutmayın: güç yerine gizlilikle öldürün. Alarmları çalıştırmazsın. +"All I know about the governor is that he's playing both sides to the middle. Here's his so-called ""mansion.""",TXT_SUB_LOG7,MAP03: After joining the Front and going to Mourel's mansion.,,,"O guvernérovi vím jen to, že se snaží uhrávat sympatie obou stran. Tohle je jeho rádoby „sídlo“.","Alt jeg ved om guvernøren er, at han spiller begge sider til midten. Her er hans såkaldte ""palæ"".","Vom Gouverneur weiß ich nur, dass er beide Seiten gegeneinander ausspielt. Hier ist seine sogenannte „Villa.“",,,Todo lo que sé del gobernador es que juega entre ambos bandos. Aquí está su supesta «mansión».,,"Tiedän kuvernööristä vain sen, että hän pelaa keskellä molemmilla puolilla. Tässä on hänen niin sanottu ""kartanonsa"".","Tout ce que je sais au sujet du gouverneur est qu'il est un agent double de chaque côté. Voilà son soi-disant ""manoir"".",,"Csak annyit tudok a kormányzóról, hogy mindenkét oldalnak dolgozik. Itt az úgynevezett ""kúriája"".",Tutto ciò che so sul governatore è che cerca di mettere gli uni contro gli altri per beneficio personale. Ecco la sua cosidetta dimora.,"私が知事について知っていることは、町の中央で双方を遊ばせてる様だ。 ソイツがここいらを'マンション'と呼んでいる。",내가 알기로는 모렐 총독은 두 세력을 가지고 노는 걸 좋아한대. 여기는 그의 '저택'이라는 곳이야.,"Het enige wat ik van de gouverneur weet is dat hij beide kanten van de gouverneur naar het midden speelt. Hier is zijn zogenaamde ""herenhuis"".","Alt jeg vet om guvernøren, er at han spiller på begge sider. Her er hans såkalte ""herskapshus"".","O gubernatorze wiem tylko tyle, że gra na dwie strony. Oto jego tak zwana ""rezydencja"".","Tudo o que eu sei sobre o governador é que ele está jogando entre dois lados. Aqui fica a sua suposta ""mansão"".",,"Tot ce știu despre Guvernator e că plătește ambele tabere. Aici e așa-zisul lui ""complex"".","Я знаю о губернаторе только то, что он пытается подыграть обеим сторонам, оставаясь посередине. Вот его так называемый «особняк».",,"Allt jag vet om guvernören är att han spelar båda sidor till mitten. Här är hans så kallade ""herrgård"".","Vali hakkında bildiğim tek şey, iki tarafı da ortada oynaması. İşte onun sözde ""malikanesi""." -Ugh. The dregs of humanity have certainly found a home.,TXT_SUB_LOG8,,,,Fuj. Spodina lidstva si rozhodně našla domov.,Ugh. Menneskehedens bundfald har bestemt fundet et hjem.,Ugh. Der Bodensatz der Menschheit hat definitiv ein Zuhause gefunden.,,,Ugh. La basura humana ciertamente ha encontrado un hogar.,,"Yöh, ihmiskunnan pohjasakka on selvästikin löytänyt kodin.","Eugh, les loques de l'humanité ont trouvé leur maison, on dirait.",Fúj. Az emberiség söpredéke csak talált magának egy otthont.,Ugh. La feccia dell'umanità ha certamente trovato una casa adatta.,,"으윽, 우리 중 나쁜 놈들만 보금자리를 구한 것 같네.",Ugh. De bezinksels van de mensheid hebben zeker een thuis gevonden.,Ugh. Menneskehetens bunnfall har virkelig funnet et hjem.,Ugh. Resztki ludzkości na pewno znalazły dom.,Urgh. A escória da humanidade certamente encontrou um lar.,,Ugh. Scursurile umanității și-au găsit o casă cu siguranță.,Фу. Самое место для отбросов человечества.,,Usch. Mänsklighetens avskum har verkligen hittat ett hem.,Ugh. İnsanlığın tortuları kesinlikle bir yuva bulmuş. -Calling Mourel sleazy is paying him a compliment. He's mongrel turd on a stick.,TXT_SUB_LOG9,"MAP02: After accepting ""bloody"" chore.",,,"Nazývat Mourela slizákem by mu lichotilo, svinský parchant jeden prohnilý.",At kalde Mourel sleazy er at give ham en kompliment. Han er en mongolsk lort på en pind.,"Mourel als 'verschlagen' zu bezeichnen wäre, ihm ein Kompliment zu machen. Er ist ein Haufen Hundescheiße.",,,Decirle «sucio» a Mourel es un halago. Es mierda de perro callejero en un palo.,,"Viheliäiseksi nimitteleminen olisi Mourelille vain kohteliaisuus. Hän on kapinen koira, iljettävä paskiainen.",Appeler Mourel un rat serait être gentil. Il est une sacrée brochette de merde.,Mourelt mocskosnak hívni egyfajta bók. Én egy alávaló pálcára húzott szarnak hívnám.,Chiamare Mourel squallido significa fargli un complimento. È uno stronzo bastardo su un palo.,"モーレルにとって汚職議員は誉め言葉だ。 +Ugh. The dregs of humanity have certainly found a home.,TXT_SUB_LOG8,,,,Fuj. Spodina lidstva si rozhodně našla domov.,Ugh. Menneskehedens bundfald har bestemt fundet et hjem.,Ugh. Der Bodensatz der Menschheit hat definitiv ein Zuhause gefunden.,,,Ugh. La basura humana ciertamente ha encontrado un hogar.,,"Yöh, ihmiskunnan pohjasakka on selvästikin löytänyt kodin.","Eugh, les loques de l'humanité ont trouvé leur maison, on dirait.",,Fúj. Az emberiség söpredéke csak talált magának egy otthont.,Ugh. La feccia dell'umanità ha certamente trovato una casa adatta.,,"으윽, 우리 중 나쁜 놈들만 보금자리를 구한 것 같네.",Ugh. De bezinksels van de mensheid hebben zeker een thuis gevonden.,Ugh. Menneskehetens bunnfall har virkelig funnet et hjem.,Ugh. Resztki ludzkości na pewno znalazły dom.,Urgh. A escória da humanidade certamente encontrou um lar.,,Ugh. Scursurile umanității și-au găsit o casă cu siguranță.,Фу. Самое место для отбросов человечества.,,Usch. Mänsklighetens avskum har verkligen hittat ett hem.,Ugh. İnsanlığın tortuları kesinlikle bir yuva bulmuş. +Calling Mourel sleazy is paying him a compliment. He's mongrel turd on a stick.,TXT_SUB_LOG9,"MAP02: After accepting ""bloody"" chore.",,,"Nazývat Mourela slizákem by mu lichotilo, svinský parchant jeden prohnilý.",At kalde Mourel sleazy er at give ham en kompliment. Han er en mongolsk lort på en pind.,"Mourel als 'verschlagen' zu bezeichnen wäre, ihm ein Kompliment zu machen. Er ist ein Haufen Hundescheiße.",,,Decirle «sucio» a Mourel es un halago. Es mierda de perro callejero en un palo.,,"Viheliäiseksi nimitteleminen olisi Mourelille vain kohteliaisuus. Hän on kapinen koira, iljettävä paskiainen.",Appeler Mourel un rat serait être gentil. Il est une sacrée brochette de merde.,,Mourelt mocskosnak hívni egyfajta bók. Én egy alávaló pálcára húzott szarnak hívnám.,Chiamare Mourel squallido significa fargli un complimento. È uno stronzo bastardo su un palo.,"モーレルにとって汚職議員は誉め言葉だ。 ソイツはクソを漏らした'駄犬'でしかないからな。",모렐에게 행실이 지저분하다고 말하는 건 칭찬에 불과해. 저놈은 이기적인 똥개새끼라고.,Mourel slordig noemen is een compliment voor hem. Hij is een bastaard op een stokje.,Å kalle Mourel snuskete er å gi ham en kompliment. Han er en kjøterbæsj på en pinne.,Nazwanie Mourela obskurnym to komplement. On jest kundlem na patyku.,Chamar o Mourel de picareta é elogio. Ele é um total desgraçado de merda.,,Numindu-l pe Mourel zgârcit e un compliment. E o corcitură de rahat pe băț.,"Назвать Моурела подлым, значит сделать ему комплимент. Кусок дерьма на палочке...",,Att kalla Mourel sliskig är en komplimang. Han är en mongolisk skit på en pinne.,Mourel'e adi demek ona iltifat etmektir. O bir sopa üzerindeki melez bok. -We need to speak with someone who knows the old town and where this coupling is. Command says: find MacGuffin. ,TXT_SUB_LOG10,"MAP02: After accepting ""messy"" chore and leaving Mourel's room.",,,"Musíme si promluvit s někým, kdo zná staré město a ví, kde se tahle spojka nalézá. Vedení říká najít MacGuffina.","Vi må tale med nogen, der kender den gamle by og ved, hvor denne kobling er. Kommandoen siger: Find MacGuffin.","Wir müssen mit jemandem reden, der die alte Stadt kennt und weiß, wo diese Anzapfung it. Die Kommandozentrale sagt, finde MacGuffin.",,,Necesitamos hablar con alguien que conozca el viejo pueblo y donde se encuentra el acoplamiento. El Comando dice: encuentra a MacGuffin.,,"Meidän täytyy puhua jollekulle, joka tietää vanhan kaupungin ja missä tämä liitin on. Komentokeskus käskee etsiä MacGuffinia.",On doit parler à quelqu'un qui connaît la vieille ville et où se trouve le coupleur. Le commandement me dit qu'il faut trouver MacGuffin.,"Beszélnünk kell valakivel aki ismeri a régi várost, és tudja hol ez az elágazás. A központ szerint fel kell keresnünk MacGuffin-t.",Dobbiamo parlare con qualcuno che conosce la vecchia città e sa dove poter trovare questo aggeggio. Il comando dice: trovate MacGuffin.,"我々は何処にあるかについてはオールドタウンに知っている者がいる。 +We need to speak with someone who knows the old town and where this coupling is. Command says: find MacGuffin. ,TXT_SUB_LOG10,"MAP02: After accepting ""messy"" chore and leaving Mourel's room.",,,"Musíme si promluvit s někým, kdo zná staré město a ví, kde se tahle spojka nalézá. Vedení říká najít MacGuffina.","Vi må tale med nogen, der kender den gamle by og ved, hvor denne kobling er. Kommandoen siger: Find MacGuffin.","Wir müssen mit jemandem reden, der die alte Stadt kennt und weiß, wo diese Anzapfung it. Die Kommandozentrale sagt, finde MacGuffin.",,,Necesitamos hablar con alguien que conozca el viejo pueblo y donde se encuentra el acoplamiento. El Comando dice: encuentra a MacGuffin.,,"Meidän täytyy puhua jollekulle, joka tietää vanhan kaupungin ja missä tämä liitin on. Komentokeskus käskee etsiä MacGuffinia.",On doit parler à quelqu'un qui connaît la vieille ville et où se trouve le coupleur. Le commandement me dit qu'il faut trouver MacGuffin.,,"Beszélnünk kell valakivel aki ismeri a régi várost, és tudja hol ez az elágazás. A központ szerint fel kell keresnünk MacGuffin-t.",Dobbiamo parlare con qualcuno che conosce la vecchia città e sa dove poter trovare questo aggeggio. Il comando dice: trovate MacGuffin.,"我々は何処にあるかについてはオールドタウンに知っている者がいる。 指令が言うには マクガフィンに会え。",동력선의 위치를 알 수 있을 만한 토박이 주민과 이야기해봐. 본부가 말하길: 맥거핀을 찾으래.,We moeten met iemand spreken die de oude stad kent en waar deze koppeling is. Het commando zegt: zoek MacGuffin.,Vi må snakke med noen som kjenner gamlebyen og vet hvor koblingen er. Kommandoen sier: Finn MacGuffin.,"Musimy porozmawiać z kimś, kto zna stare miasto i wie, gdzie jest to sprzęgło. Rozkaz mówi: znaleźć MacGuffina.",Precisamos falar com alguém que conheça a velha cidade e onde fica essa conexão. O comando diz: encontre MacGuffin.,,Avem nevoie să vorbim cu cineva care cunoaște vechiul oraș și unde e cuplajul. Centrul de comandă zice: găsește-l pe MacGuffin.,"Нам нужен кто-то, кто знает старый город и может подсказать, где эта муфта. В штабе говорят, что тебе поможет Макгаффин.",,Vi måste tala med någon som känner till den gamla staden och vet var den här kopplingen finns. Kommandot säger: hitta MacGuffin.,Eski şehri ve bu kuplajın nerede olduğunu bilen biriyle konuşmalıyız. Komuta diyor ki: MacGuffin'i bulun. -"He's in what's politely called the ""bum hole"". Take the walkway by the sewage plant and head down the stairs.",TXT_SUB_LOG11,"MAP02: After accepting ""messy"" chore and leaving Mourel's mansion.",,,"Najdeš ho na místě, kterému zdvořile říkají „zadnice“. Jdi přes chodník u čističky a sejdi schody.","Han er i det, der høfligt kaldes ""bumshullet"". Tag gangen ved kloakanlægget og gå ned ad trappen.","Er ist, was höflich gesagt, das „Pennerloch“ genannt wird. Gehe zum Weg zur Kläranlage und von dort die Treppe herunter.",,,Está en lo que se conoce educadamente como «la cueva del vagabundo». Toma la pasarela junto a la planta de aguas residuales y baja por las escaleras.,,"Hän majailee kiltisti sanottuna ""pepunreiässä"". Kulje jätelaitoksen viereistä kulkukäytävää pitkin ja portaat alas.","Il se trouve dans ce qu'on appelle poliment le ""trou à rats"", suis la coursive près de la centrale de traitement des égouts et descend les escaliers.","Ott van az udvariasan csak ""kotoréknak"" nevezett helyen. Gyalogolj végig a szennyvíz tisztító hídján, majd le a lépcsőkön.","Si trova in quello che viene affeziosamente chiamato ""il buco dei barboni"". Prendi la passerella dell'impianto fognario e vai sotto le scale.","彼は行儀よく'バムホール'と呼ばれる場所に居る。 +"He's in what's politely called the ""bum hole"". Take the walkway by the sewage plant and head down the stairs.",TXT_SUB_LOG11,"MAP02: After accepting ""messy"" chore and leaving Mourel's mansion.",,,"Najdeš ho na místě, kterému zdvořile říkají „zadnice“. Jdi přes chodník u čističky a sejdi schody.","Han er i det, der høfligt kaldes ""bumshullet"". Tag gangen ved kloakanlægget og gå ned ad trappen.","Er ist, was höflich gesagt, das „Pennerloch“ genannt wird. Gehe zum Weg zur Kläranlage und von dort die Treppe herunter.",,,Está en lo que se conoce educadamente como «la cueva del vagabundo». Toma la pasarela junto a la planta de aguas residuales y baja por las escaleras.,,"Hän majailee kiltisti sanottuna ""pepunreiässä"". Kulje jätelaitoksen viereistä kulkukäytävää pitkin ja portaat alas.","Il se trouve dans ce qu'on appelle poliment le ""trou à rats"", suis la coursive près de la centrale de traitement des égouts et descend les escaliers.",,"Ott van az udvariasan csak ""kotoréknak"" nevezett helyen. Gyalogolj végig a szennyvíz tisztító hídján, majd le a lépcsőkön.","Si trova in quello che viene affeziosamente chiamato ""il buco dei barboni"". Prendi la passerella dell'impianto fognario e vai sotto le scale.","彼は行儀よく'バムホール'と呼ばれる場所に居る。 下水処理場の側の階段を下りた小さい部屋だ。",겸손하게 말하자면 그는 “노숙자 굴”에 살아. 하수도에서 보도를 지나간 뒤 계단을 건너.,"Hij zit in wat beleefd het ""kontje"" wordt genoemd. Neem de loopbrug bij de rioolwaterzuiveringsinstallatie en ga de trap af.","Han er i det som høflig kalles ""rumpehullet"". Ta gangveien ved kloakkanlegget og gå ned trappene.","Jest w miejscu, które grzecznie nazywa się ""bum hole"". Skorzystaj z przejścia przy oczyszczalni ścieków i skieruj się w dół po schodach.","Ele está num lugar chamado ""toca de rato"". Vá pela passarela perto da usina de tratamento e desça as escadas.",,"E în ceea ce se cheamă politicos ""groapa de ardere"". Ia pasarela de lângă fabrica de deșeuri și coboară scările.","Он в том месте, что вежливо называют «бомжевая нора». Пройди к очистным сооружениям и спустись по лестнице.",,"Han är i det som artigt kallas ""bum-hålet"". Ta gången vid avloppsanläggningen och gå ner för trapporna.","Kibarca ""serseri deliği"" denilen yerde. Lağım tesisinin yanındaki geçidi kullanın ve merdivenlerden aşağı inin." -Take your time with this mission. I can't get intel on this from Command.,TXT_SUB_LOG12,"MAP02: During ""messy"" chore.",,,Dej si s touhle misí na čas. Nemůžu z velení dostat žádné informace.,Tag dig god tid med denne mission. Jeg kan ikke få oplysninger om dette fra Command.,Nimm dir Zeit für diese Mission. Ich erhalte keine Informationen aus der Kommandozentrale.,,,Tómate tu tiempo en esta misión. No consigo información de esto con el Comando.,,Ei mitään kiirettä tämän tehtävän kanssa; komentokeskuksella ei ole antaa tiedustelutietoja.,"Prends ton temps, le commandement n'a rien à me donner au niveau informations.",Ne siesd el a küldetést. Nem tudtam kideríteni semmi érdemlegeset az Irányítástól.,Prenditi il tempo che ti serve per questa missione. Non mi stanno dando molte informazioni dal comando.,この任務は時間が掛かりそうだ。私は司令部からこれ以上の情報は得る事は出来ない。,느긋하게 수행해도 좋아. 본부에도 이 정보를 모으는 데 문제가 있데.,Neem je tijd met deze missie. Ik kan hier geen informatie over krijgen van de Commandant.,Ta deg god tid med dette oppdraget. Jeg kan ikke få informasjon om dette fra kommandoen.,Nie spiesz się z tą misją. Nie mogę uzyskać informacji na ten temat od dowództwa.,Não tenha pressa nesta missão. Não estou conseguindo obter inteligência sobre isso pelo Comando.,,Poți să petreci mai mult timp cu misiunea. Nu pot găsi mai multe informații de la Centru.,Не торопись с выполнением этого задания. Я не могу получить разведданные от штаба.,,Ta god tid på dig med det här uppdraget. Jag kan inte få information om detta från kommandot.,Bu görevde acele etmeyin. Komuta'dan bu konuda bilgi alamıyorum. -"You idiot! You've shut off the power to the jamming circuits we use to conceal our base from the Order. Head over to the town hall and take out the scanning crew, now!",TXT_SUB_LOG13,MAP02: After destroying Front's power coupling.,,,"Ty debile! Odstřihnul jsi přívod proudu do rušiček, které používáme, abychom ukryli naší základnu před Řádem. Okamžitě si to zamiř k radnici a vybij průzkumnou četu!","Din idiot! Du har slukket for strømmen til de jamming-kredsløb, vi bruger til at skjule vores base for Ordenen. Gå over til rådhuset og udryd scanningsholdet, nu!","Du Idiot! Du hast die Energie für unsere Störsender unterbrochen, mit denen wir unsere Basis vor dem Orden verborgen haben. Geh schnell zum Rathaus und schalte den Suchtrupp aus. ",,,"¡Idiota! Has apagado la energía de los circuitos de interferencia que usamos para ocultarle nuestra base a La Orden. Dirígete al ayuntamiento y elimina al equipo de escaneo, ¡ya!","¡Idiota! Apagaste la energía de los circuitos de interferencia que usamos para ocultarle nuestra base a La Orden. Dirígete al ayuntamiento y elimina al equipo de escaneo, ¡ya!","Sinä idiootti! Olet katkaissut virran häirintäpiireihin, joilla piilotamme sijaintimme Veljeskunnalta. Suuntaa kaupungintalolle ja hoitele tiedusteluryhmä, heti paikalla!",Idiot! Tu as désactivé les circuits brouilleurs qui cachaient notre base des senseurs de l'Ordre. Retourne vite à la mairie et tue l'équipe de scan maintenant!,"Te idióta! Lelőtted az áramot a zavaró áramkörökhöz, amivel a Rend elől rejtettük el a bázist. Menj a városházára, és iktasd ki a szkennelő legénységet azonnal!","Idiota! Hai interrotto il flusso di energia dei circuiti che usavamo per nascondere la nostra base dall'Ordine. Ritorna subito al municipio e fai fuori il gruppo venuto a perlustare la zona, ora!","馬鹿者!お前はオーダーから我々の基地を隠す妨害回路を壊してしまった! +Take your time with this mission. I can't get intel on this from Command.,TXT_SUB_LOG12,"MAP02: During ""messy"" chore.",,,Dej si s touhle misí na čas. Nemůžu z velení dostat žádné informace.,Tag dig god tid med denne mission. Jeg kan ikke få oplysninger om dette fra Command.,Nimm dir Zeit für diese Mission. Ich erhalte keine Informationen aus der Kommandozentrale.,,,Tómate tu tiempo en esta misión. No consigo información de esto con el Comando.,,Ei mitään kiirettä tämän tehtävän kanssa; komentokeskuksella ei ole antaa tiedustelutietoja.,"Prends ton temps, le commandement n'a rien à me donner au niveau informations.",,Ne siesd el a küldetést. Nem tudtam kideríteni semmi érdemlegeset az Irányítástól.,Prenditi il tempo che ti serve per questa missione. Non mi stanno dando molte informazioni dal comando.,この任務は時間が掛かりそうだ。私は司令部からこれ以上の情報は得る事は出来ない。,느긋하게 수행해도 좋아. 본부에도 이 정보를 모으는 데 문제가 있데.,Neem je tijd met deze missie. Ik kan hier geen informatie over krijgen van de Commandant.,Ta deg god tid med dette oppdraget. Jeg kan ikke få informasjon om dette fra kommandoen.,Nie spiesz się z tą misją. Nie mogę uzyskać informacji na ten temat od dowództwa.,Não tenha pressa nesta missão. Não estou conseguindo obter inteligência sobre isso pelo Comando.,,Poți să petreci mai mult timp cu misiunea. Nu pot găsi mai multe informații de la Centru.,Не торопись с выполнением этого задания. Я не могу получить разведданные от штаба.,,Ta god tid på dig med det här uppdraget. Jag kan inte få information om detta från kommandot.,Bu görevde acele etmeyin. Komuta'dan bu konuda bilgi alamıyorum. +"You idiot! You've shut off the power to the jamming circuits we use to conceal our base from the Order. Head over to the town hall and take out the scanning crew, now!",TXT_SUB_LOG13,MAP02: After destroying Front's power coupling.,,,"Ty debile! Odstřihnul jsi přívod proudu do rušiček, které používáme, abychom ukryli naší základnu před Řádem. Okamžitě si to zamiř k radnici a vybij průzkumnou četu!","Din idiot! Du har slukket for strømmen til de jamming-kredsløb, vi bruger til at skjule vores base for Ordenen. Gå over til rådhuset og udryd scanningsholdet, nu!","Du Idiot! Du hast die Energie für unsere Störsender unterbrochen, mit denen wir unsere Basis vor dem Orden verborgen haben. Geh schnell zum Rathaus und schalte den Suchtrupp aus. ",,,"¡Idiota! Has apagado la energía de los circuitos de interferencia que usamos para ocultarle nuestra base a La Orden. Dirígete al ayuntamiento y elimina al equipo de escaneo, ¡ya!","¡Idiota! Apagaste la energía de los circuitos de interferencia que usamos para ocultarle nuestra base a La Orden. Dirígete al ayuntamiento y elimina al equipo de escaneo, ¡ya!","Sinä idiootti! Olet katkaissut virran häirintäpiireihin, joilla piilotamme sijaintimme Veljeskunnalta. Suuntaa kaupungintalolle ja hoitele tiedusteluryhmä, heti paikalla!",Idiot! Tu as désactivé les circuits brouilleurs qui cachaient notre base des senseurs de l'Ordre. Retourne vite à la mairie et tue l'équipe de scan maintenant!,,"Te idióta! Lelőtted az áramot a zavaró áramkörökhöz, amivel a Rend elől rejtettük el a bázist. Menj a városházára, és iktasd ki a szkennelő legénységet azonnal!","Idiota! Hai interrotto il flusso di energia dei circuiti che usavamo per nascondere la nostra base dall'Ordine. Ritorna subito al municipio e fai fuori il gruppo venuto a perlustare la zona, ora!","馬鹿者!お前はオーダーから我々の基地を隠す妨害回路を壊してしまった! 市庁舎に調査隊が向かった、今すぐ片付けろ!",이 멍청이야! 우리 기지를 오더로부터 은폐시켜주는 교란 장치의 동력을 끊어버렸잖아. 당장 시청으로 가서 탐색반들을 쓸어버려! 그다음에 총독에게 부서진 장치를 전해. 당장!,"Idioot! Je hebt de stroom naar de stoorcircuits die we gebruiken om onze basis te verbergen voor de Orde uitgeschakeld. Ga naar het stadhuis en haal de scannende bemanning eruit, nu!","Din idiot! Du har slått av strømmen til blokkeringskretsene vi bruker for å skjule basen vår for Ordenen. Dra til rådhuset og drep skannerne, nå!","Ty idioto! Wyłączyłeś zasilanie obwodów zagłuszających, których używamy do ukrycia naszej bazy przed Zakonem. Idź do ratusza i zdejmij ekipę skanującą, natychmiast!",Seu idiota! Você desligou a energia para os circuitos de interferência que usamos para esconder a nossa base dos sensores da Ordem. Vá até a prefeitura e tire a equipe de busca de lá imediatamente!,,"Idiotule! Ai oprit energia către circuitele noastre care ne permiteau să ne ascundem de Ordin. Du-te în hala vechiului oraș și elimină echipajul, acum!","Идиот! Ты обесточил генератор радиопомех, с помощью которого мы скрывали местоположение нашей базы от Ордена. Возвращайся к ратуше и уничтожь разведывательную группу как можно скорее!",,"Din idiot! Du har stängt av strömmen till störningskretsarna som vi använder för att dölja vår bas för Orden. Gå över till stadshuset och ta ut skanningspersonalen, nu!","Seni salak! Üssümüzü Düzen'den gizlemek için kullandığımız sinyal bozucu devrelerin gücünü kesmişsin. Belediye binasına git ve tarama ekibini indir, hemen!" -"OK, ""Trust no one"" is the name of the game! Let's get that pass from the Governor and free those prisoners.",TXT_SUB_LOG14,MAP02: After destroying Front's power coupling and killing all blue acolytes in the town hall.,,,"Dobře, „Nevěř nikomu“ je motto hry! Pojďme od guvernéra dostat tu propustku a osvoboďme ty vězně.","Okay, ""Stol ikke på nogen"" er det, der gælder! Lad os få den tilladelse fra guvernøren og befri de fanger.","Ok, „Trau keinem“ heißt dieses Spiel. Lass uns den Gefängnispass vom Gouverneur holen und die Gefangenen befreien.",,,"Vale, ¡«No te fies de nadie» se llama el juego! Ya es hora de conseguir ese pase del Gobernador y liberar a esos prisioneros.","Bueno, ¡«No confíes en nadie» se llama el juego! Ya es hora de conseguir ese pase del Gobernador y liberar a esos prisioneros.","Selvä, ""Älä luota kehenkään"" on näköjään pelin nimi! Hankitaan pääsylupa kuvernööriltä ja vapautetaan ne vangit.","Ok, ""ne fais confiance à personne"" est le thème du jour. Récupérons le passe du gouverneur et libérons les prisonniers.","Rendben, a ""ne bízz senkiben"" elv szerint játszunk. Akkor vegyük el a kormányzótól a belépőt, és szabadítsuk ki a rabokat.","OK, ""Non fidarti di nessuno"" è il gioco che stiamo giocando qua! Prendiamo quel pass per la prigione dal governatore.",よし、'信用しない'のが最も重要なことだ!壊れた配電機を渡して囚人を解放するんだ。,"좋아, '아무도 믿지 말라'가 이 게임의 이름이겠군! 그냥 총독과 대화하고 수감자들을 구출하자.","OK, ""Vertrouw niemand"" is de naam van het spel! Laten we die pas van de gouverneur halen en die gevangenen vrijlaten.","OK, ""Stol ikke på noen"" er navnet på spillet! La oss få det passet fra guvernøren og befri fangene.","OK, ""Nie ufaj nikomu"" to nazwa gry! Zdobądźmy tę przepustkę od gubernatora i uwolnijmy tych więźniów.","Ok, ""não confie em ninguém"" é o nome do jogo! Vamos pegar aquele passe do Governador e libertar esses prisioneiros.",,"OK, ""N-ai încredere în nimeni"" e numele jocului. Să luăm acea parolă de la guvernator și să eliberăm prizonierii.","Что ж, эта игра называется «не верь никому»! Давай получим у губернатора пропуск в тюрьму и освободим пленников.",,"Okej, ""Lita inte på någon"" är vad som gäller! Låt oss få det där passet från guvernören och befria fångarna.","Tamam, ""Kimseye güvenme"" oyunun adı! Vali'den o izni alalım ve mahkumları serbest bırakalım." -Good move! The Governor is a lousy liar. That's our power coupling. Now let's get that pass.,TXT_SUB_LOG15,MAP02: After finding the broken power coupling.,,,"Dobrý tah! Guvernér je mizerný lhář, tohle je naše spojka. Tak si pojďme pro tu propustku.",Godt gået! Guvernøren er en elendig løgner. Det er vores kraftkobling. Lad os nu få fat i det pas.,Das war klasse! Der Gouverneur ist ein lausiger Lügner. Das war unsere Anzapfung. Nun lass uns den Pass holen.,,,¡Buen ojo! El gobernador es un mentiroso: ese era nuestro acoplador de energía. Ahora consigamos ese pase.,,Hyvä veto! Kuvernööri on surkea valehtelija. Se on meidän virtaliittimemme. Nyt sitten hankitaan se pääsylupa.,Bien joué! Le gouverneur est un menteur. Voilà notre coupleur. Allons récupérer le passe.,Jól tetted! A Kormányzó egy hazug disznó. Az a mi áramcsatolónk. Most pedig irány a belépő.,Ottima mossa! Il governatore è un bugiardo. Eravamo noi a utilizzare questo marchingegno collegato alla rete. Ora andiamo a prendere quel pass.,"良い判断よ!知事は粗末な嘘を付いている。 +"OK, ""Trust no one"" is the name of the game! Let's get that pass from the Governor and free those prisoners.",TXT_SUB_LOG14,MAP02: After destroying Front's power coupling and killing all blue acolytes in the town hall.,,,"Dobře, „Nevěř nikomu“ je motto hry! Pojďme od guvernéra dostat tu propustku a osvoboďme ty vězně.","Okay, ""Stol ikke på nogen"" er det, der gælder! Lad os få den tilladelse fra guvernøren og befri de fanger.","Ok, „Trau keinem“ heißt dieses Spiel. Lass uns den Gefängnispass vom Gouverneur holen und die Gefangenen befreien.",,,"Vale, ¡«No te fies de nadie» se llama el juego! Ya es hora de conseguir ese pase del Gobernador y liberar a esos prisioneros.","Bueno, ¡«No confíes en nadie» se llama el juego! Ya es hora de conseguir ese pase del Gobernador y liberar a esos prisioneros.","Selvä, ""Älä luota kehenkään"" on näköjään pelin nimi! Hankitaan pääsylupa kuvernööriltä ja vapautetaan ne vangit.","Ok, ""ne fais confiance à personne"" est le thème du jour. Récupérons le passe du gouverneur et libérons les prisonniers.",,"Rendben, a ""ne bízz senkiben"" elv szerint játszunk. Akkor vegyük el a kormányzótól a belépőt, és szabadítsuk ki a rabokat.","OK, ""Non fidarti di nessuno"" è il gioco che stiamo giocando qua! Prendiamo quel pass per la prigione dal governatore.",よし、'信用しない'のが最も重要なことだ!壊れた配電機を渡して囚人を解放するんだ。,"좋아, '아무도 믿지 말라'가 이 게임의 이름이겠군! 그냥 총독과 대화하고 수감자들을 구출하자.","OK, ""Vertrouw niemand"" is de naam van het spel! Laten we die pas van de gouverneur halen en die gevangenen vrijlaten.","OK, ""Stol ikke på noen"" er navnet på spillet! La oss få det passet fra guvernøren og befri fangene.","OK, ""Nie ufaj nikomu"" to nazwa gry! Zdobądźmy tę przepustkę od gubernatora i uwolnijmy tych więźniów.","Ok, ""não confie em ninguém"" é o nome do jogo! Vamos pegar aquele passe do Governador e libertar esses prisioneiros.",,"OK, ""N-ai încredere în nimeni"" e numele jocului. Să luăm acea parolă de la guvernator și să eliberăm prizonierii.","Что ж, эта игра называется «не верь никому»! Давай получим у губернатора пропуск в тюрьму и освободим пленников.",,"Okej, ""Lita inte på någon"" är vad som gäller! Låt oss få det där passet från guvernören och befria fångarna.","Tamam, ""Kimseye güvenme"" oyunun adı! Vali'den o izni alalım ve mahkumları serbest bırakalım." +Good move! The Governor is a lousy liar. That's our power coupling. Now let's get that pass.,TXT_SUB_LOG15,MAP02: After finding the broken power coupling.,,,"Dobrý tah! Guvernér je mizerný lhář, tohle je naše spojka. Tak si pojďme pro tu propustku.",Godt gået! Guvernøren er en elendig løgner. Det er vores kraftkobling. Lad os nu få fat i det pas.,Das war klasse! Der Gouverneur ist ein lausiger Lügner. Das war unsere Anzapfung. Nun lass uns den Pass holen.,,,¡Buen ojo! El gobernador es un mentiroso: ese era nuestro acoplador de energía. Ahora consigamos ese pase.,,Hyvä veto! Kuvernööri on surkea valehtelija. Se on meidän virtaliittimemme. Nyt sitten hankitaan se pääsylupa.,Bien joué! Le gouverneur est un menteur. Voilà notre coupleur. Allons récupérer le passe.,,Jól tetted! A Kormányzó egy hazug disznó. Az a mi áramcsatolónk. Most pedig irány a belépő.,Ottima mossa! Il governatore è un bugiardo. Eravamo noi a utilizzare questo marchingegno collegato alla rete. Ora andiamo a prendere quel pass.,"良い判断よ!知事は粗末な嘘を付いている。 あれはオーダーから基地を隠す為に使用している我々の配電機だ。 この壊れた配電機を渡して彼を騙し返そう。",참 잘했어! 총독이 거짓말을 했군. 이건 우리의 동력 장치야. 어서 전해주자!,Goede zet! De Gouverneur is een slechte leugenaar. Dat is onze krachtkoppeling. Laten we nu die pas pakken.,Godt trekk! Guvernøren er en elendig løgner. Det er kraftkoblingen vår. La oss få tak i passet.,Dobry ruch! Gubernator to kiepski kłamca. To nasze połączenie sił. Teraz zdobądźmy tę przepustkę.,"Boa! O Governador é um mentiroso desgraçado. Esse é a nossa conexão. Agora, vamos pegar aquele passe.",,Bună mutare! Gvuvernatorul e un mincinos prost. Acela e cuplajul nostru. Acum să luăm parola.,Отличный ход! Губернатор — мерзкий лжец. Это наше подключение к силовой линии. Теперь получи пропуск.,,Bra gjort! Guvernören är en usel lögnare. Det är vår maktkoppling. Nu ska vi få det där passet.,İyi hamle! Vali berbat bir yalancı. Bu bizim güç birleşimimiz. Şimdi şu izni alalım. -The warehouse is in the power station. Let's make this short and sweet.,TXT_SUB_LOG16,"MAP02: After accepting ""bloody"" chore.",,,"Skladiště je uvnitř elektrárny. Pojďme na to, ať to máme rychle za sebou.",Lageret er i kraftværket. Lad os gøre det kort og godt.,Das Lagerhaus ist im Kraftwerk. Lass uns das schnell erledigen.,,,El almacén está en la central eléctrica. Hagamos esto bien rápido.,,Varasto on voimalaitoksella. Hoidetaan tämä nätisti ja pikaisesti.,L'entrepôt se trouve dans la centrale électrique. On va faire ça rapidement et proprement.,A raktár egy erőmű. Oldjuk meg gyorsan és hatékonyan.,Il magazzino si trova nella centrale energetica. Cerchiamo di essere rapidi e puliti.,倉庫は発電所にある。さっさと済ませよう。,창고는 발전소 근처에 있어. 어서 신속하고 죽여주게 끝내자.,Het magazijn is in de energiecentrale. Laten we dit kort en bondig houden.,Lageret er i kraftstasjonen. La oss gjøre det kort og godt.,Magazyn jest w elektrowni. Niech to będzie krótkie i słodkie.,O depósito fica na usina de energia. Vamos fazer isso bem rápido.,,Depozitul e în stația de energie. Scurt și dulce.,Речь идёт о складе в электростанции. Давай сделаем это быстро и с огоньком.,,Magasinet finns i kraftstationen. Låt oss göra det här kort och gott.,Depo elektrik santralinde. Bunu kısa ve tatlı tutalım. -I never thought I'd break into prison...,TXT_SUB_LOG17,MAP02: About to enter Norwall Prison.,,,"Nikdy by mě nenapadlo, že se budu vkrádat do vězení...","Jeg troede aldrig, at jeg skulle bryde ind i et fængsel...","Ich hätte nie gedacht, in ein Gefängnis einzubrechen...",,"Mi neniam pensis, ke mi invadus malliberejon...",Nunca imaginé que irrumpiría en una prisión...,,En olisi ikinä uskonut murtautuvani vankilaan...,J'aurais jamais cru entrer de force dans une prison..,"Sosem gondoltam volna, hogy betörök egy börtönbe...",Non avrei mai pensato di entrare in prigione...,刑務所にお勤めになるなぞ考えた事もないぞ...,"감옥을 뚫고 들어가다니, 생각도 못 했는데?",Ik had nooit gedacht dat ik zou inbreken in de gevangenis....,Jeg trodde aldri jeg skulle bryte meg inn i et fengsel...,"Nigdy nie sądziłem, że włamię się do więzienia...",Nunca achei que eu invadiria uma prisão...,,N-am crezut că o să intru într-o închisoare...,"Никогда не думала, что приду в тюрьму добровольно...",,Jag trodde aldrig att jag skulle bryta mig in i ett fängelse...,Hapishaneye gireceğimi hiç düşünmemiştim. -Guess there's no free lunch. Time to lock and load.,TXT_SUB_LOG18,MAP05: After crossing the alarm green door.,,,Holt nic není zadarmo. Nabij zbraň a jdi do toho.,Der er vist ingen gratis frokost. Tid til at låse og læsse.,Es gibt wohl keine freie Mahlzeit. Ran an die Action.,,,Supongo que no hay comida gratis. Hora de la acción.,,Ilmaista lounasta ei kai olekaan. Aika laittaa kovat piippuun.,"On dirait qu'il n'y a pas de repas gratuit, il est temps de se préparer au combat.",Úgy néz ki nincs ingyen ebéd. Akkor idő felfegyverkezni.,Immagino non ci sia del pranzo gratuito. È ora di dargli una lezione.,まあタダでは済まないか。派手に暴れてやれ。,급식 먹을 시간은 없겠네. 요리할 시간이야.,Ik denk dat er geen gratis lunch is. Tijd om te sluiten en te laden.,Man får visst ikke noe gratis. På tide å låse og laste.,Chyba nie ma darmowego lunchu. Czas zamknąć i załadować.,Parece que não existe almoço grátis. É hora da ação.,,Presupun că nu e niciun prânz gratuit. Timpul să ne pregătim.,"Что ж, бесплатный сыр бывает только в мышеловке. Оружие к бою! ",,Det finns ingen gratis lunch. Dags att låsa och ladda.,Sanırım bedava öğle yemeği yok. Kilitleme ve yükleme zamanı. -"OK. You've pleased the Governor, splattered the Warden... Now it looks like we got to have to do a little surgery.",TXT_SUB_LOG19,MAP05: After getting to Main Control.,,,"Dobrá. Uspokojil jsi guvernéra, rozmetal dozorčího... Vypadá to, že teď budeme muset provést menší operaci.","OKAY. Du har tilfredsstillet guvernøren, plettet fængselsinspektøren... Nu ser det ud til, at vi må foretage en lille operation.","Ok, du hast den Gouverneur zufriedengestellt, den Direktor abgemetzelt... Und jetzt sieht es aus als ob eine kleine Operation nötig ist.",,,"Bueno, has satisfecho al Gobernador, despedazado al Carcelero... Y ahora parece que tendremos que hacer algo de cirugía.",,"No niin, olet tehnyt kuvernöörille mieliksi: suolannut vankilanjohtajan... Mutta näyttää siltä, että meidän täytyy harrastaa vähän kirurgiaa.","OK. Le gouverneur est satisfait, le gardien est en bouillie... Maintenant il va falloir faire un peu de chirurgie.","Ok. Elégedetté tetted a Kormányzót, kiloccsantottad az Igazgató fejét...Úgy tűnik ideje végezni egy kis műtétet.","OK. Hai reso il governatore contento, hai fatto a pezzi il direttore... Adesso sembra che ci toccherà fare un po' di chirurgia.","よし、知事は喜ばせ刑務所長はぶちのめした... +The warehouse is in the power station. Let's make this short and sweet.,TXT_SUB_LOG16,"MAP02: After accepting ""bloody"" chore.",,,"Skladiště je uvnitř elektrárny. Pojďme na to, ať to máme rychle za sebou.",Lageret er i kraftværket. Lad os gøre det kort og godt.,Das Lagerhaus ist im Kraftwerk. Lass uns das schnell erledigen.,,,El almacén está en la central eléctrica. Hagamos esto bien rápido.,,Varasto on voimalaitoksella. Hoidetaan tämä nätisti ja pikaisesti.,L'entrepôt se trouve dans la centrale électrique. On va faire ça rapidement et proprement.,,A raktár egy erőmű. Oldjuk meg gyorsan és hatékonyan.,Il magazzino si trova nella centrale energetica. Cerchiamo di essere rapidi e puliti.,倉庫は発電所にある。さっさと済ませよう。,창고는 발전소 근처에 있어. 어서 신속하고 죽여주게 끝내자.,Het magazijn is in de energiecentrale. Laten we dit kort en bondig houden.,Lageret er i kraftstasjonen. La oss gjøre det kort og godt.,Magazyn jest w elektrowni. Niech to będzie krótkie i słodkie.,O depósito fica na usina de energia. Vamos fazer isso bem rápido.,,Depozitul e în stația de energie. Scurt și dulce.,Речь идёт о складе в электростанции. Давай сделаем это быстро и с огоньком.,,Magasinet finns i kraftstationen. Låt oss göra det här kort och gott.,Depo elektrik santralinde. Bunu kısa ve tatlı tutalım. +I never thought I'd break into prison...,TXT_SUB_LOG17,MAP02: About to enter Norwall Prison.,,,"Nikdy by mě nenapadlo, že se budu vkrádat do vězení...","Jeg troede aldrig, at jeg skulle bryde ind i et fængsel...","Ich hätte nie gedacht, in ein Gefängnis einzubrechen...",,"Mi neniam pensis, ke mi invadus malliberejon...",Nunca imaginé que irrumpiría en una prisión...,,En olisi ikinä uskonut murtautuvani vankilaan...,J'aurais jamais cru entrer de force dans une prison..,,"Sosem gondoltam volna, hogy betörök egy börtönbe...",Non avrei mai pensato di entrare in prigione...,刑務所にお勤めになるなぞ考えた事もないぞ...,"감옥을 뚫고 들어가다니, 생각도 못 했는데?",Ik had nooit gedacht dat ik zou inbreken in de gevangenis....,Jeg trodde aldri jeg skulle bryte meg inn i et fengsel...,"Nigdy nie sądziłem, że włamię się do więzienia...",Nunca achei que eu invadiria uma prisão...,,N-am crezut că o să intru într-o închisoare...,"Никогда не думала, что приду в тюрьму добровольно...",,Jag trodde aldrig att jag skulle bryta mig in i ett fängelse...,Hapishaneye gireceğimi hiç düşünmemiştim. +Guess there's no free lunch. Time to lock and load.,TXT_SUB_LOG18,MAP05: After crossing the alarm green door.,,,Holt nic není zadarmo. Nabij zbraň a jdi do toho.,Der er vist ingen gratis frokost. Tid til at låse og læsse.,Es gibt wohl keine freie Mahlzeit. Ran an die Action.,,,Supongo que no hay comida gratis. Hora de la acción.,,Ilmaista lounasta ei kai olekaan. Aika laittaa kovat piippuun.,"On dirait qu'il n'y a pas de repas gratuit, il est temps de se préparer au combat.",,Úgy néz ki nincs ingyen ebéd. Akkor idő felfegyverkezni.,Immagino non ci sia del pranzo gratuito. È ora di dargli una lezione.,まあタダでは済まないか。派手に暴れてやれ。,급식 먹을 시간은 없겠네. 요리할 시간이야.,Ik denk dat er geen gratis lunch is. Tijd om te sluiten en te laden.,Man får visst ikke noe gratis. På tide å låse og laste.,Chyba nie ma darmowego lunchu. Czas zamknąć i załadować.,Parece que não existe almoço grátis. É hora da ação.,,Presupun că nu e niciun prânz gratuit. Timpul să ne pregătim.,"Что ж, бесплатный сыр бывает только в мышеловке. Оружие к бою! ",,Det finns ingen gratis lunch. Dags att låsa och ladda.,Sanırım bedava öğle yemeği yok. Kilitleme ve yükleme zamanı. +"OK. You've pleased the Governor, splattered the Warden... Now it looks like we got to have to do a little surgery.",TXT_SUB_LOG19,MAP05: After getting to Main Control.,,,"Dobrá. Uspokojil jsi guvernéra, rozmetal dozorčího... Vypadá to, že teď budeme muset provést menší operaci.","OKAY. Du har tilfredsstillet guvernøren, plettet fængselsinspektøren... Nu ser det ud til, at vi må foretage en lille operation.","Ok, du hast den Gouverneur zufriedengestellt, den Direktor abgemetzelt... Und jetzt sieht es aus als ob eine kleine Operation nötig ist.",,,"Bueno, has satisfecho al Gobernador, despedazado al Carcelero... Y ahora parece que tendremos que hacer algo de cirugía.",,"No niin, olet tehnyt kuvernöörille mieliksi: suolannut vankilanjohtajan... Mutta näyttää siltä, että meidän täytyy harrastaa vähän kirurgiaa.","OK. Le gouverneur est satisfait, le gardien est en bouillie... Maintenant il va falloir faire un peu de chirurgie.",,"Ok. Elégedetté tetted a Kormányzót, kiloccsantottad az Igazgató fejét...Úgy tűnik ideje végezni egy kis műtétet.","OK. Hai reso il governatore contento, hai fatto a pezzi il direttore... Adesso sembra che ci toccherà fare un po' di chirurgia.","よし、知事は喜ばせ刑務所長はぶちのめした... 私達が少々手術を施す必要が出来たわ。","좋아, 총독과 놀았고, 간수장도 죽었으니... 이제 관련 인간을 손 좀 봐 줘야겠네!","Oké. Je hebt de gouverneur tevreden gesteld, de directeur verpletterd... Nu lijkt het erop dat we een kleine operatie moeten doen.","GREIT. Du har tilfredsstilt guvernøren, skjemt ut direktøren... Nå ser det ut til at vi må gjøre en liten operasjon.","W PORZĄDKU. Zadowoliłeś gubernatora, sponiewierałeś naczelnika... Teraz wygląda na to, że będziemy musieli przeprowadzić małą operację.","Ok, você agradou o Governador, estourou os miolos do carcereiro... Agora parece que temos que fazer uma pequena cirurgia.",,"OK. L-ai mulțumit pe Guvernator, împrăștiat pe Director... acum se pare că trebuie să faci niște chirurgie.","Хорошо. Ты доставил удовольствие губернатору, забрызгал стены мозгами тюремщика... Теперь нам предстоит небольшое хирургическое вмешательство.",,"OKEJ, DÅ ÄR DET DAGS ATT LÅSA OCH LÅSA. Du har nöjt guvernören, kladdat på fängelsedirektören... Nu ser det ut som om vi måste göra en liten operation.","TAMAMDIR. Vali'yi memnun ettiniz, Müdür'ün canına okudunuz. Şimdi küçük bir ameliyat yapmamız gerekecek gibi görünüyor." -Oh you cut off his hand! And I thought you were a nice guy... kinda. Let's go.,TXT_SUB_LOG20,MAP05: After cutting Wolenick's hand off.,,,"Oh, tys mu uříznul ruku! A já myslela že jsi hodný chlap... jakž takž. Pojďme.","Du skar hans hånd af! Og jeg troede, du var en flink fyr... på en måde. Lad os gå.","Oh, du hast seine Hand abgeschnitten! Und ich dachte du wärest ein netter Typ... oder so. Lass uns gehen.",,,"¡Uh, le cortaste la mano! Y yo pensaba que eras un buen tío... más o menos. Bueno, vamos.","¡Uh, le cortaste la mano! Y yo creía que eras una buena persona... más o menos. Bueno, vamos.","Jaa, sinä katkaisit hänen kätensä! Ja minä kun luulin, että olit kiva kundi... jokseenkin. Mennään.","Oh, tu a coupé sa main? Je croyais que tu étais un type sympa.. Plus où moins. Allons-y.","Oh, levágtad a kezét! És azt hittem egy jó fiú vagy...vagy olyasmi. Na menjünk.","Ah, gli hai tagliato la mano! E io che pensavo fossi un bravo ragazzo... più o meno. Andiamo.","おいおい手を切り取ったのかよ! +Oh you cut off his hand! And I thought you were a nice guy... kinda. Let's go.,TXT_SUB_LOG20,MAP05: After cutting Wolenick's hand off.,,,"Oh, tys mu uříznul ruku! A já myslela že jsi hodný chlap... jakž takž. Pojďme.","Du skar hans hånd af! Og jeg troede, du var en flink fyr... på en måde. Lad os gå.","Oh, du hast seine Hand abgeschnitten! Und ich dachte du wärest ein netter Typ... oder so. Lass uns gehen.",,,"¡Uh, le cortaste la mano! Y yo pensaba que eras un buen tío... más o menos. Bueno, vamos.","¡Uh, le cortaste la mano! Y yo creía que eras una buena persona... más o menos. Bueno, vamos.","Jaa, sinä katkaisit hänen kätensä! Ja minä kun luulin, että olit kiva kundi... jokseenkin. Mennään.","Oh, tu a coupé sa main? Je croyais que tu étais un type sympa.. Plus où moins. Allons-y.",,"Oh, levágtad a kezét! És azt hittem egy jó fiú vagy...vagy olyasmi. Na menjünk.","Ah, gli hai tagliato la mano! E io che pensavo fossi un bravo ragazzo... più o meno. Andiamo.","おいおい手を切り取ったのかよ! ただのナイスガイってわけじゃないのね...まあいい、行こうか。","손을 뜯어버리다니! 아주 좋은 사람인 줄 알았는데... 귀엽네! 후훗, 가자구.","Oh, je hebt zijn hand eraf gesneden! En ik vond je een aardige kerel.... een beetje. Laten we gaan.",Du kappet av ham hånden! Og jeg som trodde du var en hyggelig fyr... på en måte. La oss gå.,"Odciąłeś mu rękę! A ja myślałam, że jesteś miłym facetem... w pewnym sensie. Chodźmy.","Ai, você cortou fora a mão dele! Eu achava que você era um cara bonzinho... talvez. Vamos lá.",,Oh i-ai tăiat mâna! Și credeam că ești de treabă... oarecum. Să mergem.,"О ч-чёрт, ты отрезал ему руку! Я думала, ты добрый парень... в некотором роде. Ладно, не бери в голову.",,"Åh, du skar av hans hand! Och jag som trodde att du var en trevlig kille... typ. Nu går vi.",Elini kesmişsin! Ben de senin iyi bir adam olduğunu sanıyordum. Hadi gidelim. -"Way to go, my friend. Jump on one of the teleporters and it will bring you back to base.",TXT_SUB_LOG21,MAP05: After setting the prisoners free.,,,"Jen tak dál, příteli. Skoč na teleportér, dostane tě zpět na základnu.","Godt gået, min ven. Hop på en af teleportørerne, og den bringer dig tilbage til basen.",Das war gute Arbeit. Benutze einen der Teleporter um zur Basis zurückzugelangen.,,,Así se hace amigo. Ponte en uno de los teletransportes y te traerá de vuelta a la base.,,"Niin sitä pitää, ystäväni. Hyppää johonkin kaukosiirtimistä, ja se tuo sinut takaisin tukikohtaan.",Bien joué mon ami! Utilise l'un des téléporteurs pour revenir à la base.,"Szép munka barátom. Ugorj bele az egyik teleportba, és visszavisz a bázisra.","Ben fatto, amico mio. Recati in uno dei teletrasporti e ti riporterà alla base.",行きましょう、相棒。牢屋奥のテレポーターに飛び込めば基地にすぐ着くわ。,"정말 잘했어, 친구. 저 텔레포터들 중 하나를 타면 기지로 복귀할 수 있을 거야.","Goed gedaan, mijn vriend. Spring op een van de teleporters en het brengt je terug naar de basis.","Sånn skal det gjøres, min venn. Hopp på en av teleporterne, så kommer du tilbake til basen.","Dobra robota, przyjacielu. Wskocz na jeden z teleporterów, a przeniesie cię do bazy.","Boa, meu amigo. Entre num desses teletransportadores e você voltará para a base.",,Bună treabă prietene. Sari într-unul din teleportoare și ne vom întoarce acasă.,"Так держать, дружище. Прыгай в любой телепорт, и он вернёт тебя на базу.",,"Bra jobbat, min vän. Hoppa på en av teleporterna så kommer du tillbaka till basen.","Aferin dostum. Işınlayıcılardan birine atla, seni üsse geri getirecek." -Worner is a spy we recruited in the warehouse of the power station.,TXT_SUB_LOG22,,,,"Worner je špión, kterého jsme najali ve skladišti elektrárny.","Worner er en spion, som vi rekrutterede i lageret på kraftværket.","Worner ist ein Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben.",,,Worner es un espía que reclutamos en el almacén de la estación eléctrica.,,Worner on värväämämme vakooja voimalaitoksen varastolta.,Worner est un espion que nous avons recruté dans l'entrepôt de la centrale éléctrique.,Worner egy spion akit az erőmű raktárjában toboroztunk.,Worner è una spia che abbiamo reclutato nel magazzino della centrale energetica.,,워너는 우리가 모집한 첩자야. 그는 발전소 창고에 있어.,Worner is een spion die we in het magazijn van de centrale hebben gerekruteerd.,Worner er en spion vi rekrutterte i lageret på kraftstasjonen.,"Worner to szpieg, którego zwerbowaliśmy w magazynie elektrowni.",Worner é um espião que recrutamos no depósito da usina de energia.,,Worner e un spion pe care l-am recrutat în depozitul stației de energie.,"Уорнэр — шпион, которого мы завербовали на складе электростанции.",,Worner är en spion som vi rekryterade i kraftverkets lager.,"Worner, güç istasyonunun deposunda işe aldığımız bir casus." -"Word from the boss is stand back when you whack the crystal, or else you'll end up mesquite-flavored too.",TXT_SUB_LOG23,MAP04: After entering Ketrick's room.,,,"Velení radí, aby ses držel dál až rozbiješ krystal, jinak taky skončíš jako pečínka.","Ordet fra chefen er, at du skal holde dig tilbage, når du slår krystallen, ellers ender du også som mesquite-flavored.","Der Ratschlag vom Boss ist, in Deckung zu gehen, wenn du den Kristall plattmachst. Andernfalls könntest du als Omelett enden.",,,"Dice el jefe que te eches atrás cuando le des al cristal, o si no también acabaras frito.",,"Viesti pomolta, että pysy loitolla, kun suolaat kristallin, tai muuten alat itse maistua suolalta.","Le boss me raconte que tu as intérêt à prendre tes distances avant de péter le cristal, sinon tu va aussi te retrouver cuit à la sauce barbecue au plasma.","Ha hihetünk a főnök szavainak, akkor érdemes tisztes távolból szétverni a kristályt, ha nem akarunk elszenesedni.","Il capo dice di tenersi lontani quando fai esplodere il cristallo, altrimenti rischi di saltare in aria pure tu.","上司が言うには、クリスタルを破壊する瞬間には隠れる必要があるな、 +"Way to go, my friend. Jump on one of the teleporters and it will bring you back to base.",TXT_SUB_LOG21,MAP05: After setting the prisoners free.,,,"Jen tak dál, příteli. Skoč na teleportér, dostane tě zpět na základnu.","Godt gået, min ven. Hop på en af teleportørerne, og den bringer dig tilbage til basen.",Das war gute Arbeit. Benutze einen der Teleporter um zur Basis zurückzugelangen.,,,Así se hace amigo. Ponte en uno de los teletransportes y te traerá de vuelta a la base.,,"Niin sitä pitää, ystäväni. Hyppää johonkin kaukosiirtimistä, ja se tuo sinut takaisin tukikohtaan.",Bien joué mon ami! Utilise l'un des téléporteurs pour revenir à la base.,,"Szép munka barátom. Ugorj bele az egyik teleportba, és visszavisz a bázisra.","Ben fatto, amico mio. Recati in uno dei teletrasporti e ti riporterà alla base.",行きましょう、相棒。牢屋奥のテレポーターに飛び込めば基地にすぐ着くわ。,"정말 잘했어, 친구. 저 텔레포터들 중 하나를 타면 기지로 복귀할 수 있을 거야.","Goed gedaan, mijn vriend. Spring op een van de teleporters en het brengt je terug naar de basis.","Sånn skal det gjøres, min venn. Hopp på en av teleporterne, så kommer du tilbake til basen.","Dobra robota, przyjacielu. Wskocz na jeden z teleporterów, a przeniesie cię do bazy.","Boa, meu amigo. Entre num desses teletransportadores e você voltará para a base.",,Bună treabă prietene. Sari într-unul din teleportoare și ne vom întoarce acasă.,"Так держать, дружище. Прыгай в любой телепорт, и он вернёт тебя на базу.",,"Bra jobbat, min vän. Hoppa på en av teleporterna så kommer du tillbaka till basen.","Aferin dostum. Işınlayıcılardan birine atla, seni üsse geri getirecek." +Worner is a spy we recruited in the warehouse of the power station.,TXT_SUB_LOG22,,,,"Worner je špión, kterého jsme najali ve skladišti elektrárny.","Worner er en spion, som vi rekrutterede i lageret på kraftværket.","Worner ist ein Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben.",,,Worner es un espía que reclutamos en el almacén de la estación eléctrica.,,Worner on värväämämme vakooja voimalaitoksen varastolta.,Worner est un espion que nous avons recruté dans l'entrepôt de la centrale éléctrique.,,Worner egy spion akit az erőmű raktárjában toboroztunk.,Worner è una spia che abbiamo reclutato nel magazzino della centrale energetica.,,워너는 우리가 모집한 첩자야. 그는 발전소 창고에 있어.,Worner is een spion die we in het magazijn van de centrale hebben gerekruteerd.,Worner er en spion vi rekrutterte i lageret på kraftstasjonen.,"Worner to szpieg, którego zwerbowaliśmy w magazynie elektrowni.",Worner é um espião que recrutamos no depósito da usina de energia.,,Worner e un spion pe care l-am recrutat în depozitul stației de energie.,"Уорнэр — шпион, которого мы завербовали на складе электростанции.",,Worner är en spion som vi rekryterade i kraftverkets lager.,"Worner, güç istasyonunun deposunda işe aldığımız bir casus." +"Word from the boss is stand back when you whack the crystal, or else you'll end up mesquite-flavored too.",TXT_SUB_LOG23,MAP04: After entering Ketrick's room.,,,"Velení radí, aby ses držel dál až rozbiješ krystal, jinak taky skončíš jako pečínka.","Ordet fra chefen er, at du skal holde dig tilbage, når du slår krystallen, ellers ender du også som mesquite-flavored.","Der Ratschlag vom Boss ist, in Deckung zu gehen, wenn du den Kristall plattmachst. Andernfalls könntest du als Omelett enden.",,,"Dice el jefe que te eches atrás cuando le des al cristal, o si no también acabaras frito.",,"Viesti pomolta, että pysy loitolla, kun suolaat kristallin, tai muuten alat itse maistua suolalta.","Le boss me raconte que tu as intérêt à prendre tes distances avant de péter le cristal, sinon tu va aussi te retrouver cuit à la sauce barbecue au plasma.",,"Ha hihetünk a főnök szavainak, akkor érdemes tisztes távolból szétverni a kristályt, ha nem akarunk elszenesedni.","Il capo dice di tenersi lontani quando fai esplodere il cristallo, altrimenti rischi di saltare in aria pure tu.","上司が言うには、クリスタルを破壊する瞬間には隠れる必要があるな、 でないと唐揚げになるわ。",대장 말로는 수정체를 부술 때 멀리 피해있으라고 했어. 너도 노릇노릇하게 구워지기 싫다면 말이지.,"Het woord van de baas is een stapje terug als je het kristal slaat, of anders kom je ook nog eens met een mesquite-smaakje terecht.","Ordet fra sjefen er stå tilbake når du slår krystallen, ellers vil du også ende opp med mesquite-smak.","Szef powiedział, żebyś się odsunął, gdy będziesz walił w kryształ, bo inaczej też skończysz z mesquitem.","A chefe me contou que você deve manter distância quando você arrebentar o cristal, senão você vira churrasco.",,"Vorba de la șef e să stai deoparte când spargi cristalul, altfel o să te faci terci.","Босс говорит, чтобы ты держался подальше от кристалла, когда он рванёт. Иначе тебя тоже прожарит до хрустящей корочки.",,"Ord från chefen är att hålla sig undan när du slår kristallen, annars slutar du också med mesquite-smak.","Patronun söylediğine göre kristale vururken geri çekilin, yoksa siz de mesquite aromalı olursunuz." -One more adventure before command feels it's safe to attack. Macil's arranged for Irale to give you gold and some training. And visit the medic for strength.,TXT_SUB_LOG25,MAP02: After destroying the crystal in the Power Station.,,,"Ještě jedno dobrodružství, než se velení rozhodne zaútočit. Macil sjednal u Iraleho zlato a trénink. Taky navštiv lékaře nabrat síly.","Et eventyr mere, før kommandoen føler, at det er sikkert at angribe. Macil har sørget for, at Irale giver dig guld og noget træning. Og besøg lægen for at få styrke.","Eine weitere Aufgabe noch, bevor Macil es für sicher hält, anzugreifen. Macil hat Irale gebeten, dir Gold zu geben und Training zu organisieren. Und lass dir vom Sanitäter deine Ausdauer erhöhen.",,,Una aventura más antes de que el comando sienta que es seguro atacar el castillo. Macil ha acordado con Irale que te dé oro y algo de entrenamiento. Y ver al médico en el pueblo para ganar fuerza.,,"Vielä yksi seikkailu, ennen kuin komentokeskus katsoo tilanteen hyväksi hyökätä. Macil on järjestänyt Iralen antamaan sinulle kultaa ja koulutusta. Ja tapaa lääkintämiestä vahvistusta varten.",Encore une aventure avant le commandement pense qu'il soit l'heure d'attaquer. Macil s'est arrangé pour qu'Irale te donne de l'argent et un peu d'entraînement en plus. Va voir le médecin pour plus de forces.,"Még egy kaland mielőtt az irányítás biztonságosnak érzi az tusoló rohamot. Macil elintézte, hogy kapj Iraletől aranyat és kiképzést. Keresd fel a szanitácet is, hogy felgyógyítson.","Un'ultima avventura prima dell'assedio al castello. Macil ha parlato ad Irale per farti avere dell'oro e un po' di addestramento. Dopo che gli hai fatto visita, parla anche dal medico in città per una marcia in più.","もう一つの任務をこなす前に戦力の増強が必要と考えられる。 +One more adventure before command feels it's safe to attack. Macil's arranged for Irale to give you gold and some training. And visit the medic for strength.,TXT_SUB_LOG25,MAP02: After destroying the crystal in the Power Station.,,,"Ještě jedno dobrodružství, než se velení rozhodne zaútočit. Macil sjednal u Iraleho zlato a trénink. Taky navštiv lékaře nabrat síly.","Et eventyr mere, før kommandoen føler, at det er sikkert at angribe. Macil har sørget for, at Irale giver dig guld og noget træning. Og besøg lægen for at få styrke.","Eine weitere Aufgabe noch, bevor Macil es für sicher hält, anzugreifen. Macil hat Irale gebeten, dir Gold zu geben und Training zu organisieren. Und lass dir vom Sanitäter deine Ausdauer erhöhen.",,,Una aventura más antes de que el comando sienta que es seguro atacar el castillo. Macil ha acordado con Irale que te dé oro y algo de entrenamiento. Y ver al médico en el pueblo para ganar fuerza.,,"Vielä yksi seikkailu, ennen kuin komentokeskus katsoo tilanteen hyväksi hyökätä. Macil on järjestänyt Iralen antamaan sinulle kultaa ja koulutusta. Ja tapaa lääkintämiestä vahvistusta varten.",Encore une aventure avant le commandement pense qu'il soit l'heure d'attaquer. Macil s'est arrangé pour qu'Irale te donne de l'argent et un peu d'entraînement en plus. Va voir le médecin pour plus de forces.,,"Még egy kaland mielőtt az irányítás biztonságosnak érzi az tusoló rohamot. Macil elintézte, hogy kapj Iraletől aranyat és kiképzést. Keresd fel a szanitácet is, hogy felgyógyítson.","Un'ultima avventura prima dell'assedio al castello. Macil ha parlato ad Irale per farti avere dell'oro e un po' di addestramento. Dopo che gli hai fatto visita, parla anche dal medico in città per una marcia in più.","もう一つの任務をこなす前に戦力の増強が必要と考えられる。 マシルがイラールを介して資金と訓練の手配をしてくれるので会いなさい。 それと近所のメディックも支援してくれるわ。","본부가 공성전을 진행하기 전에 한 가지 해야 할 일이 있어. 마실이 이롤리에게 골드랑 훈련을 제공해달라고 부탁했대. 그다음에는, 마을 병원에 가서 근력을 키워달라고 해.",Nog één avontuur voordat het commando het gevoel heeft dat het veilig is om aan te vallen. Macil heeft ervoor gezorgd dat Irale je goud en wat training kan geven. En bezoek de dokter voor kracht.,Ett eventyr til før kommandoen mener det er trygt å angripe. Macil har sørget for at Irale gir deg gull og litt trening. Og besøk legen for å få styrke.,"Jeszcze jedna przygoda, zanim dowództwo uzna, że można bezpiecznie zaatakować. Macil załatwił, że Irale da ci złoto i trochę treningu. I odwiedź medyka, żeby nabrać sił.",Mais uma aventura antes do comando achar que é seguro o suficiente para atacar. Macil deu instruções para o Irale te passar ouro e um pouco de treinamento. E visite o médico para te dar uma força.,,Încă o aventură înainte de atacarea centrului de comandă. Macil a aranjat cu Irale ca tu să primești aur și niște antrenament. Și vizitează medicul pentru forță.,"Ещё одно приключение, и штаб будет уверен в успешности атаки на замок. Мэйсил поручил Ирэйлу выплатить тебе награду и дать пару уроков. И зайди на всякий случай к медику.",,Ett äventyr till innan befälet känner att det är säkert att attackera. Macil har ordnat så att Irale ger dig guld och lite träning. Och besök läkaren för att få styrka.,"Komuta saldırmanın güvenli olduğunu düşünmeden önce bir macera daha. Macil, İrale'nin sana altın ve biraz eğitim vermesini ayarladı. Ve güç için doktoru ziyaret et." -"The Order thinks it's secure in its castle. Wrong! If you open the gates, they'll be easy pickings. And for that, you'll have to go down into the sewers. Head along the river across the Governor's mansion. ",TXT_SUB_LOG26,〃,,,"Řád si myslí, že je uvnitř hradu v bezpečí. Špatně! Pokud otevřeš brány, nebudou proti nám mít šanci. A kvůli tomu musíme do stok. Zamiř si to podél řeky naproti guvernérově sídlu.","Ordenen tror, at den er sikker i sit slot. Det er forkert! Hvis du åbner portene, bliver de et let bytte. Og til det skal du ned i kloakkerne. Gå langs floden over for guvernørens palæ.","Der Orden glaubt, er sei in seiner Burg sicher. Falsch! Wenn du die Tore öffnest werden sie ein leichtes Ziel sein. Und dafür müssen wir in die Kanalisation runter. Geh runter zum Fluss, auf der anderen Seite von der Villa des Gouverneurs.",,,"La Orden cree que está segura en su castillo. ¡Se equivocan! Si abres las puertas, serán cosecha fácil. Y para eso, tienes que bajar a las alcantarillas. Dirígete por el río al lado de la mansión del Gobernador.",,"Veljeskunta luulee olevansa turvassa linnassaan. Väärin! Jos avaat portit, he ovat helppoa saalista. Ja sitä varten sinun on mentävä alas viemäreihin. Kulje joen vartta kuvernöörin kartanoa vastapäätä.","L'Ordre se pense en sécurité dans son château, faux! Si tu ouvre les portes, il seront faciles à flinguer. Oh, et pour ça il faut que tu descende dans les égouts. Suis la rivière de l'autre côté du manoir du gouverneur.",A Rend azt hiszi biztonságban vannak a kastélyban. Tévedés! Ha sikerül kinyitni a kaput könnyen le tudjuk őket szedni. Ezért azonban le kell menni a kanálisba. Menj a folyó nyomán a kormányzó kúriájával szemben.,"L'Ordine pensa di essere al sicuro dentro il suo castello. Sbagliato! Se apri i cancelli, saranno facili bersagli. E per aprirli, dovremo scendere nelle fogne. L'ingresso si trova vicino al fiume verso dove c'è la dimora del governatore.","オーダーは封鎖した城内が安全だと思っている。大した自信だな! +"The Order thinks it's secure in its castle. Wrong! If you open the gates, they'll be easy pickings. And for that, you'll have to go down into the sewers. Head along the river across the Governor's mansion. ",TXT_SUB_LOG26,〃,,,"Řád si myslí, že je uvnitř hradu v bezpečí. Špatně! Pokud otevřeš brány, nebudou proti nám mít šanci. A kvůli tomu musíme do stok. Zamiř si to podél řeky naproti guvernérově sídlu.","Ordenen tror, at den er sikker i sit slot. Det er forkert! Hvis du åbner portene, bliver de et let bytte. Og til det skal du ned i kloakkerne. Gå langs floden over for guvernørens palæ.","Der Orden glaubt, er sei in seiner Burg sicher. Falsch! Wenn du die Tore öffnest werden sie ein leichtes Ziel sein. Und dafür müssen wir in die Kanalisation runter. Geh runter zum Fluss, auf der anderen Seite von der Villa des Gouverneurs.",,,"La Orden cree que está segura en su castillo. ¡Se equivocan! Si abres las puertas, serán cosecha fácil. Y para eso, tienes que bajar a las alcantarillas. Dirígete por el río al lado de la mansión del Gobernador.",,"Veljeskunta luulee olevansa turvassa linnassaan. Väärin! Jos avaat portit, he ovat helppoa saalista. Ja sitä varten sinun on mentävä alas viemäreihin. Kulje joen vartta kuvernöörin kartanoa vastapäätä.","L'Ordre se pense en sécurité dans son château, faux! Si tu ouvre les portes, il seront faciles à flinguer. Oh, et pour ça il faut que tu descende dans les égouts. Suis la rivière de l'autre côté du manoir du gouverneur.",,A Rend azt hiszi biztonságban vannak a kastélyban. Tévedés! Ha sikerül kinyitni a kaput könnyen le tudjuk őket szedni. Ezért azonban le kell menni a kanálisba. Menj a folyó nyomán a kormányzó kúriájával szemben.,"L'Ordine pensa di essere al sicuro dentro il suo castello. Sbagliato! Se apri i cancelli, saranno facili bersagli. E per aprirli, dovremo scendere nelle fogne. L'ingresso si trova vicino al fiume verso dove c'è la dimora del governatore.","オーダーは封鎖した城内が安全だと思っている。大した自信だな! 容易く侵入を許すとも知らずに。それでゲートを開けるには下水道を通る必要がある。 知事邸の川を挟んだ所にその入り口がある。","오더는 성안 쪽에 지켜져 있는 거로 알겠지만, 틀렸어! 성문을 열기만 한다면 나머지는 쉬운 일일 거야. 일단 그러려면, 하수구 아래로 내려가야 해. 총독 관저 너머의 강을 지나가 봐.","De Orde denkt dat het veilig is in zijn kasteel. Fout! Als je de poorten opent, zijn het gemakkelijke keuzes. En daarvoor moet je de riolering in. Loop langs de rivier over het landhuis van de gouverneur.","Ordenen tror den er trygg i sitt slott. Feil! Hvis du åpner portene, blir de et lett bytte. Og da må du gå ned i kloakken. Gå langs elven på den andre siden av guvernørens hus.","Zakon myśli, że jest bezpieczny w swoim zamku. Mylisz się! Jeśli otworzysz bramy, będą łatwym łupem. A w tym celu będziesz musiał zejść do kanałów. Kieruj się wzdłuż rzeki, naprzeciwko rezydencji gubernatora.","A Ordem acha que está segura dentro do castelo. Se enganaram! Se você abrir os portões, vai ser fácil pegá-los. E, para isso, você terá que ir até o esgoto. Vá pelo rio do outro lado da mansão do Governador.",,"Ordinul crede că e în siguranță în castel. Greșit! Dacă deschizi porțile, vor fi victime ușoare. Pentru asta, va trebui să mergi în canale. Urmează râul până la complexul Guvernatorului.","Орден думает, что замок неприступен. Большая ошибка! Он будет лёгкой добычей, когда ты откроешь врата. Спустись в канализацию, чтобы найти механизм. Иди вдоль берега реки — спуск прямо напротив особняка губернатора.",,Orden tror att den är säker i sitt slott. Fel! Om du öppnar portarna blir de lätta att plocka. Och för det måste du gå ner i kloakerna. Gå längs floden över guvernörens herrgård.,"Tarikat kalesinde güvende olduğunu düşünüyor. Yanılıyorlar! Eğer kapıları açarsanız, kolay lokma olacaklar. Bunun için de kanalizasyona inmeniz gerekecek. Valinin konağının karşısındaki nehir boyunca ilerleyin." -"OK, duck in here. The sewer dwellers are horrible mutants, but their network of tunnels gives them access to secrets. Hold your nose... We're going down.",TXT_SUB_LOG27,〃,,,"Dobře, zalez sem. Obyvatelé kanálů jsou příšerní mutanti, ale pomocí své sítě tunelů mají přístup k informacím. Drž si nos... Jdeme dolů.","OK, duk dig herind. Kloakbeboerne er forfærdelige mutanter, men deres netværk af tunneler giver dem adgang til hemmeligheder. Hold dig for næsen... Vi går ned.","OK, kriech hier rein. Die Kanalisationsbewohner sind fürchterliche Mutanten, aber ihr Tunnelnetzwerk gibt ihnen Zugang zu Geheimräumen. Halt die Nase zu, wir gehen runter.",,,"Hay un interrumptor por aquí abajo. La gente de las alcantarillas son mutantes horribles, pero su red de túneles les da acceso a secretos. Tápate la nariz... Vamos abajo.",,"No niin, kumarru tässä. Viemärin asukit ovat kauhistuttavia mutantteja, mutta heidän tunneliverkkonsa antaa heille pääsyn salaisiin paikkoihin. Pidä kiinni nenästäsi, menemme alas.","Ok, accroupis-toi ici. Les habitants des égouts sont d'affreux mutants mais leur réseau de tunnels leur donne accès à beaucoup de secrets. Retient ton souffle, par contre.. On va descendre.","Ok, gugolj itt le. A kanális lakók szörnyű mutánsok, de az általuk kiépített alagút hálózat mindenféle titokhoz hozzásegíti őket. Fogd be az orrod...lemerülünk.","OK, entra qua dentro. Gli abitanti delle fogne sono orribili mutanti, ma la serie di tunnel che gestiscono permette di raggiungere diversi segreti. Tappati il naso... Stiamo scendendo.","下水道の住民は恐ろしい変異体だ。だが彼らのトンネル網には秘密の通路も含まれる。 +"OK, duck in here. The sewer dwellers are horrible mutants, but their network of tunnels gives them access to secrets. Hold your nose... We're going down.",TXT_SUB_LOG27,〃,,,"Dobře, zalez sem. Obyvatelé kanálů jsou příšerní mutanti, ale pomocí své sítě tunelů mají přístup k informacím. Drž si nos... Jdeme dolů.","OK, duk dig herind. Kloakbeboerne er forfærdelige mutanter, men deres netværk af tunneler giver dem adgang til hemmeligheder. Hold dig for næsen... Vi går ned.","OK, kriech hier rein. Die Kanalisationsbewohner sind fürchterliche Mutanten, aber ihr Tunnelnetzwerk gibt ihnen Zugang zu Geheimräumen. Halt die Nase zu, wir gehen runter.",,,"Hay un interrumptor por aquí abajo. La gente de las alcantarillas son mutantes horribles, pero su red de túneles les da acceso a secretos. Tápate la nariz... Vamos abajo.",,"No niin, kumarru tässä. Viemärin asukit ovat kauhistuttavia mutantteja, mutta heidän tunneliverkkonsa antaa heille pääsyn salaisiin paikkoihin. Pidä kiinni nenästäsi, menemme alas.","Ok, accroupis-toi ici. Les habitants des égouts sont d'affreux mutants mais leur réseau de tunnels leur donne accès à beaucoup de secrets. Retient ton souffle, par contre.. On va descendre.",,"Ok, gugolj itt le. A kanális lakók szörnyű mutánsok, de az általuk kiépített alagút hálózat mindenféle titokhoz hozzásegíti őket. Fogd be az orrod...lemerülünk.","OK, entra qua dentro. Gli abitanti delle fogne sono orribili mutanti, ma la serie di tunnel che gestiscono permette di raggiungere diversi segreti. Tappati il naso... Stiamo scendendo.","下水道の住民は恐ろしい変異体だ。だが彼らのトンネル網には秘密の通路も含まれる。 良し、ここから降りる前に鼻はつまんどけよ...","좋아, 바로 여기야. 하수구 거주민들은 끔찍한 돌연변이들이지만, 그들의 땅굴 망이 숨겨진 장소들로 인도할 거야. 숨 잘 참아... 아래로 내려간다.","Oké, bukken hier naar binnen. De rioolbewoners zijn verschrikkelijke mutanten, maar hun netwerk van tunnels geeft hen toegang tot geheimen. Hou je neus vast.... We gaan naar beneden.","OK, dukk her inne. Kloakkboerne er fæle mutanter, men deres nettverk av tunneler gir dem tilgang til hemmeligheter. Hold for nesen... Vi går ned.","Dobra, schowaj się tutaj. Mieszkańcy kanałów to straszne mutanty, ale ich sieć tuneli daje im dostęp do sekretów. Trzymaj się... Schodzimy na dół.","Ok, fique abaixado aqui. Os habitantes do esgoto são mutantes horríveis, mas a sua rede de túneis os dá acesso para áreas secretas. Segure a respiração... Vamos descer.",,"OK, ghemuiește-te aici. Locuitorii canalelor sunt mutanți oribili, dar rețeaua lor de tunele le dă acces la secrete.... Mergem înăuntru.","Да, это здесь. Обитатели канализации — жуткие уроды, но они знают все секреты благодаря своим системам туннелей. Зажми нос — мы спускаемся!",,"Okej, ducka in här. Kloakborna är hemska mutanter, men deras nätverk av tunnlar ger dem tillgång till hemligheter. Håll dig för näsan... Vi går ner.","Tamam, buraya gir. Lağım sakinleri korkunç mutantlardır, ama tünel ağları onlara sırlara erişim sağlar. Burnunu tut. Aşağı iniyoruz." -"We're looking for Weran, who calls himself the Rat King. I'm sure it's descriptive as well as colorful.",TXT_SUB_LOG28,MAP06: Entrance.,,,"Hledáma Werana, který si říká Krysí král. Jsem si jistá, že je to jak barvité, tak přesné.","Vi leder efter Weran, som kalder sig rottekongen. Jeg er sikker på, at det er både beskrivende og farverigt.",,,,"Estamos buscando a Weran, quien se autoproclama el Rey de las Ratas. Estoy segura de que es tanto descriptivo como vistoso.",,"Etsimme Werania, joka kutsuu itseään Rottakuninkaaksi. Varmastikin kuvaava titteli, mutta myös väritetty.",,"Werant keressük, aki csak Patkány Királyként emlegeti magát. Minden bizonnyal találó a név.","Stiamo cercando Weran, che si fa chiamare il Re dei Ratti. Sono sicura che lo descrive appieno.","ウェランを探すんだ、誰が呼んだかラットキングでもある。 +"We're looking for Weran, who calls himself the Rat King. I'm sure it's descriptive as well as colorful.",TXT_SUB_LOG28,MAP06: Entrance.,,,"Hledáma Werana, který si říká Krysí král. Jsem si jistá, že je to jak barvité, tak přesné.","Vi leder efter Weran, som kalder sig rottekongen. Jeg er sikker på, at det er både beskrivende og farverigt.",,,,"Estamos buscando a Weran, quien se autoproclama el Rey de las Ratas. Estoy segura de que es tanto descriptivo como vistoso.",,"Etsimme Werania, joka kutsuu itseään Rottakuninkaaksi. Varmastikin kuvaava titteli, mutta myös väritetty.",,,"Werant keressük, aki csak Patkány Királyként emlegeti magát. Minden bizonnyal találó a név.","Stiamo cercando Weran, che si fa chiamare il Re dei Ratti. Sono sicura che lo descrive appieno.","ウェランを探すんだ、誰が呼んだかラットキングでもある。 私はそれが叙述的でもあり派手な呼び名なのも定かだ。",우리는 자신을 시궁쥐 왕이라고 부르는 워렌을 찾아야 해. 알록달록해서 눈에 잘 띌 것 같은데 말이야.,"We zijn op zoek naar Weran, die zichzelf de rattenkoning noemt. Ik weet zeker dat het zowel beschrijvend als kleurrijk is.","Vi leter etter Weran, som kaller seg Rottekongen. Det er sikkert både beskrivende og fargerikt.","Szukamy Werana, który nazywa siebie Królem Szczurów. Jestem pewien, że jest to opisowe jak i barwne.","Estamos procurando pelo Weran, que se autodenomina o Rato Rei. Imagino que isso seja tão descritivo quanto gracioso.",,"Îl căutăm pe Weran, care-și spune Regele Sobolanilor. Sunt sigur că e și descripti și colorat.","Нам нужен Уэран — он называет себя Крысиным королём. Уверена, прозвище так же емко, как и красочно.",,"Vi letar efter Weran, som kallar sig för råttkungen. Jag är säker på att det är både beskrivande och färgstarkt.",Kendine Fare Kral diyen Weran'ı arıyoruz. Renkli olduğu kadar açıklayıcı da olduğuna eminim. -"Oh, yuck. I don't even want to think about what you are stepping in!",TXT_SUB_LOG29,MAP06: Down → Left.,,,"Ó, fuj, nechci ani pomýšlet na to, do čeho teď šlapeš!","Åh, føj. Jeg vil ikke engang tænke på, hvad du træder i!","Igitt! Ich möchte gar nicht darüber nachdenken, wo du gerade durchwatest.",,,"Oh, puaj. ¡No quiero ni pensar en lo que estás pisando!",,"Äh, yäk. En halua edes kuvitella, missä oikein astelet!","Oh, beurk! J'ai pas envie de savoir dans quoi tu marche!","Oh, fúj. Nem is akarom tudni miben lépkedsz.","Oh, dannazione... Non voglio neanche pensare a cosa stai calpestando!",オェッ。君が足を踏み入れてるモノの事など考えたくないわ!,웩. 네가 밟고 있는 게 뭔지 상상조차 하기 싫어!,"Oh, ja. Ik wil er niet eens aan denken wat je doet!","Å, æsj. Jeg vil ikke engang tenke på hva du tråkker i!","Oh, fuj. Nawet nie chcę myśleć, w co wdepniesz!","Argh, eca. Não quero nem saber no que você está pisando!",,"Oh, yuck. Nu vreau să știu în ce calci!","Ох, фу. Даже знать не хочу, во что ты наступил!",,"Åh, äckligt. Jag vill inte ens tänka på vad du trampar i!","Oh, iğrenç. Neye bastığınızı düşünmek bile istemiyorum!" -Just what I need. More brown goo!,TXT_SUB_LOG30,MAP06: Down → Left → Upstairs → Left.,,,"Přesně, co potřebuju. Další hnědá břečka!",Lige hvad jeg har brug for. Mere brunt klamphug!,"Genau das, was ich brauchte. Mehr brauner Schlamm!",,,Justo lo que necesito. ¡Más lodo marrón!,,"Juuri, mitä tarvitsen: lisää ruskeaa mönjää!","Juste ce qu'il me fallait, encore de la crasse marron!",Pont ez hiányzott. Még több barna trutymák.,Proprio quello che volevo vedere. Altro liquido marrone!,万事休すだ。更に茶色いモノだ!,"또 시궁창이라니, 정말 보기 좋네!",Precies wat ik nodig heb. Meer bruine drab!,Akkurat det jeg trenger. Mer brunt gjørme!,Właśnie tego mi trzeba. Więcej brązowej mazi!,Justo o que eu precisava. Mais meleca marrom!,,Exact ce îmi trebuie. Mai multă mâzgă maro!,"То, что надо. Ещё больше коричневой жижи!",,Precis vad jag behöver. Mer brunt kladd!,Tam da ihtiyacım olan şey. Daha fazla kahverengi yapışkan! -"Hey, look! I think that's the door Weran wants ajar!",TXT_SUB_LOG31,,,,"Hele, podívej! Myslím, že to jsou ty dveře, které chce Weran nechat otevřené!","Hey, se! Jeg tror, det er døren, som Weran vil have på klem!","Sieh dort! Ich glaube, das ist die Tür, die Weran geöffnet haben möchte.",,,"¡Eh, mira! ¡Creo que esa es la puerta que Weran quiere entreabierta!",,"Hei, katso! Tuo on varmaankin se ovi, jonka Weran haluaa raolleen!","Hé, regarde! On dirait que c'est la porte que Weran veut qu'on coince!",Nézz oda! Azt hiszem ez az az ajtó amit félig ki akar nyitni Weran.,"Ehi, guarda! Credo quella sia la porta che Weran vuole aprire!",,저기야! 저게 워렌이 열어줬으면 하는 문일 거야.,"Hé, kijk! Ik denk dat dat de deur is die Weran op een kier wil hebben!","Hei, se! Jeg tror det er døra Weran vil ha på gløtt!","Hej, patrzcie! To chyba te drzwi, które Weran chce uchylić!",Olha! Acho que essa é a porta que o Weran quer que fique aberta!,,"Hei, uite! Acolo cred că e ușa pe care o vrea Weran!","О, смотри! Похоже, это та самая дверь, которую хочет приоткрыть Уэран!",,Titta! Jag tror att det är dörren som Weran vill ha på glänt!,"Hey, bakın! Sanırım Weran'ın aralık kalmasını istediği kapı bu!" -"Shut your eyes! I don't wanna see! Oh, too late... Yuck. That doesn't look like a human body. What has the Order done? I gotta report this to command.",TXT_SUB_LOG32,,,,"Zavři oči! Nechci to vidět! Ah, moc pozdě... Fuj. To ani nevypadá jako lidské tělo. Co to Řád provedl? Musím tohle nahlásit velení.","Luk øjnene! Jeg vil ikke se! Åh, for sent... Yuck. Det ligner ikke et menneskeligt lig. Hvad har Ordenen gjort? Jeg må rapportere det til kommandoen.","Mach die Augen zu! Ich will das nicht sehen. Zu spät... Igitt, das sieht gar nicht aus wie ein menschlicher Körper. Was hat der Orden getan? Ich muss das an die Kommandozentrale weitergeben.",,,"¡Cierra los ojos! ¡No quiero ver! Oh, demasiado tarde... Puaj. Eso no parece un cuerpo humano. ¿Que ha hecho la Orden? Tengo que reportar esto al comando.",,"Sulje silmäsi! En halua nähdä! Äh, myöhäistä... yäk. Tuo ei näytä ihmisruumiilta. Mitä Veljeskunta oikein on tehnyt? Minun on ilmoitettava tästä komentokeskukselle.","Ferme tes yeux, je ne veux pas voire ça! Oh, trop tard.. Beurk, on dirait pas un corps humain, qu'est-ce que l'ordre à fait? Il faut que je rapporte ça au commandement.",Csukd be a szemed! Nem akarom látni! Ó túl késő...fúj. Ez nem úgy néz ki mint egy emberi tetem. Mit tett a Rend? Ezt jeleznem kell az irányításnak.,"Chiudi gli occhi! Non voglio vedere! Ah, troppo tardi... Non sembra un corpo umano. Che cosa ha fatto l'Ordine? Devo riportare questo al comando.",,"눈 감아! 보고 싶지 않아! 오, 너무 늦었네... 역겨워. 전혀 사람 몸 같지 않던데, 대체 오더가 무슨 짓을 한 거지? 본부에 이걸 보고해야겠어.","Sluit je ogen! Ik wil het niet zien! Oh, te laat.... Yuck. Dat ziet er niet uit als een menselijk lichaam. Wat heeft de Orde gedaan? Ik moet dit aan het commando melden.","Lukk øynene! Jeg vil ikke se! Å, for sent... Æsj. Det ser ikke ut som en menneskekropp. Hva har Ordenen gjort? Jeg må rapportere dette til kommandoen.","Zamknij oczy! Nie chcę widzieć! Och, za późno... Fuj. To nie wygląda jak ludzkie ciało. Co zrobił Zakon? Muszę to zgłosić do dowództwa.","Feche os olhos! Eu não quero ver! Ai, tarde demais... Eca. Isso não parece um corpo humano. O que foi que a Ordem fez? Preciso relatar isso ao comando.",,Închide ochii! Nu vreau să văd! Oh... prea târziu... Yuck. Nu pare un cadavru uman. Ce a făcut Ordinul? Trebuie să raportez asta.,"Зажмурься! Я не хочу это видеть! Ох, уже поздно... Какая дрянь. Это даже не выглядит как человеческое тело. Что творит этот Орден! Я немедленно доложу в штаб.",,"Håll ögonen! Jag vill inte se! Åh, för sent... Usch. Det ser inte ut som en människokropp. Vad har Orden gjort? Jag måste rapportera det här till befälet.","Kapa gözlerini! Görmek istemiyorum! Oh, çok geç... İğrenç. Bu bir insan vücuduna benzemiyor. Tarikat ne yaptı? Bunu komutaya rapor etmeliyim." -Why can't we do a mission in a field of flowers for once?,TXT_SUB_LOG33,MAP06: After giving the guard's uniform.,,,Nemůžeme někdy mít misi na poli plném kvítí?,Hvorfor kan vi ikke for en gangs skyld udføre en mission i en blomstermark?,Warum können wir nicht mal eine Mission in einem Blumenfeld haben? ,,,¿Por que no podemos hacer una misión en un campo de flores por una vez?,,Miksei meillä kerrankin voisi olla tehtävä kukkakedolla?,"Pourquoi est-ce qu'on ne peut pas avoir une mission dans un champ de fleurs, pour une fois?",Miért nem mehetünk legalább egyszer egy virágmezős misszióra?,Perché non possiamo fare una missione in un campo di fiori per una volta?,どうして私達は綺麗な場所で一度でも任務遂行が出来ないんだ?,왜 우리는 딱 한 번이라도 꽃밭에서 작전을 수행할 수 없는 걸까?,Waarom kunnen we niet een keer een missie doen in een bloemenveld?,Hvorfor kan vi ikke gjøre et oppdrag i en blomstereng for en gangs skyld?,Dlaczego nie możemy choć raz wykonać misji na polu kwiatów?,Por que é que a gente não faz uma missão num campo florido pelo menos uma vez?,,De ce nu putem avea o misiune pe un câmp de flori măcar odată?,Ну почему наши задания не могут разворачиваться на цветочном лугу?,,Varför kan vi inte göra ett uppdrag på ett blomsterfält för en gångs skull?,Neden bir kez olsun çiçek tarlasında görev yapamıyoruz? -I hate to say it but this reminds me of home. I'm underground not that far from here.,TXT_SUB_LOG34,MAP06: Weran's hideout.,,,"Říká se mi to těžko, ale tohle mi připomíná domov. Jsem v podzemí ne tak daleko odsud.","Jeg hader at sige det, men det her minder mig om mit hjem. Jeg er under jorden ikke så langt herfra.","Ich sage es nicht gerne, aber das erinnert mich an Zuhause. Ich bin auch im Untergrund, nicht weit von hier.",,,Odio decirlo pero esto me recuerda a mi hogar. Estoy bajo tierra no muy lejos de aquí.,,"Inhottaa sanoa, mutta tästä tulee koti mieleen: Olen maan alla, en niin kaukana täältä.","J'ai vraiment pas envie de l'admettre, mais ça me rappelle ma maison.. Je suis sous terre pas loin d'ici.","Nem szívesen mondom ezt, de ez az otthonomra emlékeztet. Föld alatt van az is nem túl messze innen.","Mi duole dirlo, ma tutto ciò mi ricorda casa. Anche io mi trovo sottoterra, non troppo lontano da qui.","言いたくないが私の家の事を思い出させるわ。 +"Oh, yuck. I don't even want to think about what you are stepping in!",TXT_SUB_LOG29,MAP06: Down → Left.,,,"Ó, fuj, nechci ani pomýšlet na to, do čeho teď šlapeš!","Åh, føj. Jeg vil ikke engang tænke på, hvad du træder i!","Igitt! Ich möchte gar nicht darüber nachdenken, wo du gerade durchwatest.",,,"Oh, puaj. ¡No quiero ni pensar en lo que estás pisando!",,"Äh, yäk. En halua edes kuvitella, missä oikein astelet!","Oh, beurk! J'ai pas envie de savoir dans quoi tu marche!",,"Oh, fúj. Nem is akarom tudni miben lépkedsz.","Oh, dannazione... Non voglio neanche pensare a cosa stai calpestando!",オェッ。君が足を踏み入れてるモノの事など考えたくないわ!,웩. 네가 밟고 있는 게 뭔지 상상조차 하기 싫어!,"Oh, ja. Ik wil er niet eens aan denken wat je doet!","Å, æsj. Jeg vil ikke engang tenke på hva du tråkker i!","Oh, fuj. Nawet nie chcę myśleć, w co wdepniesz!","Argh, eca. Não quero nem saber no que você está pisando!",,"Oh, yuck. Nu vreau să știu în ce calci!","Ох, фу. Даже знать не хочу, во что ты наступил!",,"Åh, äckligt. Jag vill inte ens tänka på vad du trampar i!","Oh, iğrenç. Neye bastığınızı düşünmek bile istemiyorum!" +Just what I need. More brown goo!,TXT_SUB_LOG30,MAP06: Down → Left → Upstairs → Left.,,,"Přesně, co potřebuju. Další hnědá břečka!",Lige hvad jeg har brug for. Mere brunt klamphug!,"Genau das, was ich brauchte. Mehr brauner Schlamm!",,,Justo lo que necesito. ¡Más lodo marrón!,,"Juuri, mitä tarvitsen: lisää ruskeaa mönjää!","Juste ce qu'il me fallait, encore de la crasse marron!",,Pont ez hiányzott. Még több barna trutymák.,Proprio quello che volevo vedere. Altro liquido marrone!,万事休すだ。更に茶色いモノだ!,"또 시궁창이라니, 정말 보기 좋네!",Precies wat ik nodig heb. Meer bruine drab!,Akkurat det jeg trenger. Mer brunt gjørme!,Właśnie tego mi trzeba. Więcej brązowej mazi!,Justo o que eu precisava. Mais meleca marrom!,,Exact ce îmi trebuie. Mai multă mâzgă maro!,"То, что надо. Ещё больше коричневой жижи!",,Precis vad jag behöver. Mer brunt kladd!,Tam da ihtiyacım olan şey. Daha fazla kahverengi yapışkan! +"Hey, look! I think that's the door Weran wants ajar!",TXT_SUB_LOG31,,,,"Hele, podívej! Myslím, že to jsou ty dveře, které chce Weran nechat otevřené!","Hey, se! Jeg tror, det er døren, som Weran vil have på klem!","Sieh dort! Ich glaube, das ist die Tür, die Weran geöffnet haben möchte.",,,"¡Eh, mira! ¡Creo que esa es la puerta que Weran quiere entreabierta!",,"Hei, katso! Tuo on varmaankin se ovi, jonka Weran haluaa raolleen!","Hé, regarde! On dirait que c'est la porte que Weran veut qu'on coince!",,Nézz oda! Azt hiszem ez az az ajtó amit félig ki akar nyitni Weran.,"Ehi, guarda! Credo quella sia la porta che Weran vuole aprire!",,저기야! 저게 워렌이 열어줬으면 하는 문일 거야.,"Hé, kijk! Ik denk dat dat de deur is die Weran op een kier wil hebben!","Hei, se! Jeg tror det er døra Weran vil ha på gløtt!","Hej, patrzcie! To chyba te drzwi, które Weran chce uchylić!",Olha! Acho que essa é a porta que o Weran quer que fique aberta!,,"Hei, uite! Acolo cred că e ușa pe care o vrea Weran!","О, смотри! Похоже, это та самая дверь, которую хочет приоткрыть Уэран!",,Titta! Jag tror att det är dörren som Weran vill ha på glänt!,"Hey, bakın! Sanırım Weran'ın aralık kalmasını istediği kapı bu!" +"Shut your eyes! I don't wanna see! Oh, too late... Yuck. That doesn't look like a human body. What has the Order done? I gotta report this to command.",TXT_SUB_LOG32,,,,"Zavři oči! Nechci to vidět! Ah, moc pozdě... Fuj. To ani nevypadá jako lidské tělo. Co to Řád provedl? Musím tohle nahlásit velení.","Luk øjnene! Jeg vil ikke se! Åh, for sent... Yuck. Det ligner ikke et menneskeligt lig. Hvad har Ordenen gjort? Jeg må rapportere det til kommandoen.","Mach die Augen zu! Ich will das nicht sehen. Zu spät... Igitt, das sieht gar nicht aus wie ein menschlicher Körper. Was hat der Orden getan? Ich muss das an die Kommandozentrale weitergeben.",,,"¡Cierra los ojos! ¡No quiero ver! Oh, demasiado tarde... Puaj. Eso no parece un cuerpo humano. ¿Que ha hecho la Orden? Tengo que reportar esto al comando.",,"Sulje silmäsi! En halua nähdä! Äh, myöhäistä... yäk. Tuo ei näytä ihmisruumiilta. Mitä Veljeskunta oikein on tehnyt? Minun on ilmoitettava tästä komentokeskukselle.","Ferme tes yeux, je ne veux pas voire ça! Oh, trop tard.. Beurk, on dirait pas un corps humain, qu'est-ce que l'ordre à fait? Il faut que je rapporte ça au commandement.",,Csukd be a szemed! Nem akarom látni! Ó túl késő...fúj. Ez nem úgy néz ki mint egy emberi tetem. Mit tett a Rend? Ezt jeleznem kell az irányításnak.,"Chiudi gli occhi! Non voglio vedere! Ah, troppo tardi... Non sembra un corpo umano. Che cosa ha fatto l'Ordine? Devo riportare questo al comando.",,"눈 감아! 보고 싶지 않아! 오, 너무 늦었네... 역겨워. 전혀 사람 몸 같지 않던데, 대체 오더가 무슨 짓을 한 거지? 본부에 이걸 보고해야겠어.","Sluit je ogen! Ik wil het niet zien! Oh, te laat.... Yuck. Dat ziet er niet uit als een menselijk lichaam. Wat heeft de Orde gedaan? Ik moet dit aan het commando melden.","Lukk øynene! Jeg vil ikke se! Å, for sent... Æsj. Det ser ikke ut som en menneskekropp. Hva har Ordenen gjort? Jeg må rapportere dette til kommandoen.","Zamknij oczy! Nie chcę widzieć! Och, za późno... Fuj. To nie wygląda jak ludzkie ciało. Co zrobił Zakon? Muszę to zgłosić do dowództwa.","Feche os olhos! Eu não quero ver! Ai, tarde demais... Eca. Isso não parece um corpo humano. O que foi que a Ordem fez? Preciso relatar isso ao comando.",,Închide ochii! Nu vreau să văd! Oh... prea târziu... Yuck. Nu pare un cadavru uman. Ce a făcut Ordinul? Trebuie să raportez asta.,"Зажмурься! Я не хочу это видеть! Ох, уже поздно... Какая дрянь. Это даже не выглядит как человеческое тело. Что творит этот Орден! Я немедленно доложу в штаб.",,"Håll ögonen! Jag vill inte se! Åh, för sent... Usch. Det ser inte ut som en människokropp. Vad har Orden gjort? Jag måste rapportera det här till befälet.","Kapa gözlerini! Görmek istemiyorum! Oh, çok geç... İğrenç. Bu bir insan vücuduna benzemiyor. Tarikat ne yaptı? Bunu komutaya rapor etmeliyim." +Why can't we do a mission in a field of flowers for once?,TXT_SUB_LOG33,MAP06: After giving the guard's uniform.,,,Nemůžeme někdy mít misi na poli plném kvítí?,Hvorfor kan vi ikke for en gangs skyld udføre en mission i en blomstermark?,Warum können wir nicht mal eine Mission in einem Blumenfeld haben? ,,,¿Por que no podemos hacer una misión en un campo de flores por una vez?,,Miksei meillä kerrankin voisi olla tehtävä kukkakedolla?,"Pourquoi est-ce qu'on ne peut pas avoir une mission dans un champ de fleurs, pour une fois?",,Miért nem mehetünk legalább egyszer egy virágmezős misszióra?,Perché non possiamo fare una missione in un campo di fiori per una volta?,どうして私達は綺麗な場所で一度でも任務遂行が出来ないんだ?,왜 우리는 딱 한 번이라도 꽃밭에서 작전을 수행할 수 없는 걸까?,Waarom kunnen we niet een keer een missie doen in een bloemenveld?,Hvorfor kan vi ikke gjøre et oppdrag i en blomstereng for en gangs skyld?,Dlaczego nie możemy choć raz wykonać misji na polu kwiatów?,Por que é que a gente não faz uma missão num campo florido pelo menos uma vez?,,De ce nu putem avea o misiune pe un câmp de flori măcar odată?,Ну почему наши задания не могут разворачиваться на цветочном лугу?,,Varför kan vi inte göra ett uppdrag på ett blomsterfält för en gångs skull?,Neden bir kez olsun çiçek tarlasında görev yapamıyoruz? +I hate to say it but this reminds me of home. I'm underground not that far from here.,TXT_SUB_LOG34,MAP06: Weran's hideout.,,,"Říká se mi to těžko, ale tohle mi připomíná domov. Jsem v podzemí ne tak daleko odsud.","Jeg hader at sige det, men det her minder mig om mit hjem. Jeg er under jorden ikke så langt herfra.","Ich sage es nicht gerne, aber das erinnert mich an Zuhause. Ich bin auch im Untergrund, nicht weit von hier.",,,Odio decirlo pero esto me recuerda a mi hogar. Estoy bajo tierra no muy lejos de aquí.,,"Inhottaa sanoa, mutta tästä tulee koti mieleen: Olen maan alla, en niin kaukana täältä.","J'ai vraiment pas envie de l'admettre, mais ça me rappelle ma maison.. Je suis sous terre pas loin d'ici.",,"Nem szívesen mondom ezt, de ez az otthonomra emlékeztet. Föld alatt van az is nem túl messze innen.","Mi duole dirlo, ma tutto ciò mi ricorda casa. Anche io mi trovo sottoterra, non troppo lontano da qui.","言いたくないが私の家の事を思い出させるわ。 私はこの地下から遠くない場所にいたのよ。","말하긴 싫지만, 여긴 꼭 내 집을 보는 것 같아... 난 여기서 멀지 않은 지하에 있어.","Ik haat het om het te zeggen, maar dit doet me denken aan thuis. Ik ben niet zo ver van hier ondergronds.","Jeg hater å si det, men dette minner meg om hjemme. Jeg er under jorden ikke så langt herfra.","Nie chcę tego mówić, ale to przypomina mi dom. Jestem pod ziemią, nie tak daleko stąd.",Odeio dizer isso mas isso lembra a minha casa. Estou sob o solo não muito longe daqui.,,Îmi pare rău s-o spun dar asta îmi aduce aminte de casă. Stau sub pământ nu departe de aici.,"Не хотела говорить, но это место напоминает мне о доме. Сейчас я в подземелье, которое не так уж далеко отсюда.",,"Jag hatar att säga det, men det här påminner mig om mitt hem. Jag är underjordisk inte så långt härifrån.","Bunu söylemekten nefret ediyorum ama bu bana evimi hatırlatıyor. Yeraltındayım, buradan çok uzakta değilim." -"Don't ask me where we are. I'm lost, too. Sorry.",TXT_SUB_LOG35,MAP06: Exit of the secret entrance.,,,"Neptej se mě, kde jsme. Taky jsem ztracená. Promiň.","Spørg mig ikke, hvor vi er. Jeg er også faret vild. Jeg er også fortabt. Undskyld.","Frag mich nicht, wo wir sind, ich habe keine Ahnung. Tut mir leid.",,,"No me preguntes en dónde estamos, que yo también estoy perdida. Perdón.",,"Älä kysy minulta, missä olemme. Olen myös eksyksissä; pahoittelut.","Me demande pas où on est, je suis aussi perdue que toi, désolée..","Ne kérdezd hol vagyunk. Én is el vagyok veszve, sajnálom.",Non chiedermi dove siamo. Mi sono persa anche io. Mi spiace...,今いる場所について私に聞かないでくれ。私も迷った。すまない。,"여기가 어딘지 묻지 마. 나도 길을 잃었거든, 미안해.",Vraag me niet waar we zijn. Ik ben ook verdwaald. Sorry.,Ikke spør meg hvor vi er. Jeg har også gått meg vill. Unnskyld meg.,"Nie pytaj mnie, gdzie jesteśmy. Ja też się zgubiłem. Przepraszam.",Não me pergunte onde estamos. Já me perdi. Desculpe.,,"Numă întreba unde suntem, și eu sunt pierdut. Scuze.","Даже не спрашивай, где мы. Я сама не знаю, извини.",,Fråga mig inte var vi är. Jag är också vilse. Jag är också vilse.,Bana nerede olduğumuzu sorma. Ben de kayboldum. Özür dilerim. -That brick... Didn't we pass that brick? No...,TXT_SUB_LOG36,MAP06: Secret entrance from the castle.,,,Ta cihla... Neminuli jsme tamtu cihlu? Ne...,Den mursten... Har vi ikke passeret den mursten? Nej...,Der Stein... Sind wir nicht an dem Stein vorbeigekommen? Nein...,,,"Ese ladrillo... ¿No habíamos pasado ya por ese ladrillo? Ah, no...",,Tuo tiilenmurikka... Emmekö jo menneet sen ohitse? Ei kun...,Cette brique.. On n'a pas passé cette brique avant? Non..,Az a tégla...Nem hagytuk már el azt a téglát egyszer? Nem...,Quel mattone... Abbiamo già superato quel mattone? No...,あの煉瓦...前通ったレンガか?いや...,저 벽... 아까 저 벽을 지나가지 않았던가? 아닌데...,Die steen.... Hebben we die steen niet gepasseerd? Nee....,Den mursteinen... Passerte vi ikke den mursteinen? Nei...,Ta cegła... Czy nie minęliśmy tej cegły? Nie...,Aquele tijolo... Já não passamos daquele tijolo? Não...,,Cărpmida aceea... Nu am trecut de ea? Nu...,Этот кирпич... Разве мы здесь не были? Нет...,,Den där tegelstenen... Passerade vi inte den stenen? Nej...,Şu tuğla. O tuğlayı geçmemiş miydik? Hayır. -"Command, he's done it! The gates are open. Send in the shock troops and tell Macil we're coming in! ",TXT_SUB_LOG37,MAP06: After destroying the gate controls.,,,"Velení, dokázal to! Brány jsou otevřené. Pošlete tam úderníky a řekněte Macilovi, že přicházíme!","Kommando, han har gjort det! Portene er åbne. Send choktropperne ind og fortæl Macil, at vi kommer ind!",Kommandozentrale: Er hat's geschafft! Die Tore sind offen. Schickt die Schocktruppen hinein und sagt Macil das wir auf dem Weg sind! Lass uns zur Frontbasis zurückkehren.,,"Fronto, li sukcesis! Li malfermis la pordojn. Sendu la sturmantojn kaj diru al Macil, ke estas tempo eniri!","¡Comando, lo ha conseguido! Las puertas ya están abiertas. ¡Enviad a las tropas de choque y decidle a Macil que ya es hora de entrar!","¡Comando, lo logró! Las puertas ya están abiertas. ¡Manden a las tropas de choque y díganle a Macil que ya es hora de entrar!","Komentokeskus, hän teki sen! Portit ovat auki; lähettäkää iskujoukot ja kertokaa Macilille, että vyörymme sisään!","C'est bon, commandement, il a réussi! Les portes sont ouvertes, envoyez les soldats de choc et dites à Macil que l'on arrive!","Irányítás, sikerült neki! A kapuk nyitva állnak. Küldjétek be a sokkolós egységeket, és mondjátok meg Macilnak, hogy behatolunk!","Comando, ce l'ha fatta! I cancelli sono aperti. Mandate avanti le truppe e dite a Macil che stiamo arrivando!","司令官、彼はやったぞ! +"Don't ask me where we are. I'm lost, too. Sorry.",TXT_SUB_LOG35,MAP06: Exit of the secret entrance.,,,"Neptej se mě, kde jsme. Taky jsem ztracená. Promiň.","Spørg mig ikke, hvor vi er. Jeg er også faret vild. Jeg er også fortabt. Undskyld.","Frag mich nicht, wo wir sind, ich habe keine Ahnung. Tut mir leid.",,,"No me preguntes en dónde estamos, que yo también estoy perdida. Perdón.",,"Älä kysy minulta, missä olemme. Olen myös eksyksissä; pahoittelut.","Me demande pas où on est, je suis aussi perdue que toi, désolée..",,"Ne kérdezd hol vagyunk. Én is el vagyok veszve, sajnálom.",Non chiedermi dove siamo. Mi sono persa anche io. Mi spiace...,今いる場所について私に聞かないでくれ。私も迷った。すまない。,"여기가 어딘지 묻지 마. 나도 길을 잃었거든, 미안해.",Vraag me niet waar we zijn. Ik ben ook verdwaald. Sorry.,Ikke spør meg hvor vi er. Jeg har også gått meg vill. Unnskyld meg.,"Nie pytaj mnie, gdzie jesteśmy. Ja też się zgubiłem. Przepraszam.",Não me pergunte onde estamos. Já me perdi. Desculpe.,,"Numă întreba unde suntem, și eu sunt pierdut. Scuze.","Даже не спрашивай, где мы. Я сама не знаю, извини.",,Fråga mig inte var vi är. Jag är också vilse. Jag är också vilse.,Bana nerede olduğumuzu sorma. Ben de kayboldum. Özür dilerim. +That brick... Didn't we pass that brick? No...,TXT_SUB_LOG36,MAP06: Secret entrance from the castle.,,,Ta cihla... Neminuli jsme tamtu cihlu? Ne...,Den mursten... Har vi ikke passeret den mursten? Nej...,Der Stein... Sind wir nicht an dem Stein vorbeigekommen? Nein...,,,"Ese ladrillo... ¿No habíamos pasado ya por ese ladrillo? Ah, no...",,Tuo tiilenmurikka... Emmekö jo menneet sen ohitse? Ei kun...,Cette brique.. On n'a pas passé cette brique avant? Non..,,Az a tégla...Nem hagytuk már el azt a téglát egyszer? Nem...,Quel mattone... Abbiamo già superato quel mattone? No...,あの煉瓦...前通ったレンガか?いや...,저 벽... 아까 저 벽을 지나가지 않았던가? 아닌데...,Die steen.... Hebben we die steen niet gepasseerd? Nee....,Den mursteinen... Passerte vi ikke den mursteinen? Nei...,Ta cegła... Czy nie minęliśmy tej cegły? Nie...,Aquele tijolo... Já não passamos daquele tijolo? Não...,,Cărpmida aceea... Nu am trecut de ea? Nu...,Этот кирпич... Разве мы здесь не были? Нет...,,Den där tegelstenen... Passerade vi inte den stenen? Nej...,Şu tuğla. O tuğlayı geçmemiş miydik? Hayır. +"Command, he's done it! The gates are open. Send in the shock troops and tell Macil we're coming in! ",TXT_SUB_LOG37,MAP06: After destroying the gate controls.,,,"Velení, dokázal to! Brány jsou otevřené. Pošlete tam úderníky a řekněte Macilovi, že přicházíme!","Kommando, han har gjort det! Portene er åbne. Send choktropperne ind og fortæl Macil, at vi kommer ind!",Kommandozentrale: Er hat's geschafft! Die Tore sind offen. Schickt die Schocktruppen hinein und sagt Macil das wir auf dem Weg sind! Lass uns zur Frontbasis zurückkehren.,,"Fronto, li sukcesis! Li malfermis la pordojn. Sendu la sturmantojn kaj diru al Macil, ke estas tempo eniri!","¡Comando, lo ha conseguido! Las puertas ya están abiertas. ¡Enviad a las tropas de choque y decidle a Macil que ya es hora de entrar!","¡Comando, lo logró! Las puertas ya están abiertas. ¡Manden a las tropas de choque y díganle a Macil que ya es hora de entrar!","Komentokeskus, hän teki sen! Portit ovat auki; lähettäkää iskujoukot ja kertokaa Macilille, että vyörymme sisään!","C'est bon, commandement, il a réussi! Les portes sont ouvertes, envoyez les soldats de choc et dites à Macil que l'on arrive!",,"Irányítás, sikerült neki! A kapuk nyitva állnak. Küldjétek be a sokkolós egységeket, és mondjátok meg Macilnak, hogy behatolunk!","Comando, ce l'ha fatta! I cancelli sono aperti. Mandate avanti le truppe e dite a Macil che stiamo arrivando!","司令官、彼はやったぞ! ゲートが開いた。突撃部隊を送って我々も続くとマシルに伝えてくれ!","본부, 그가 해냈습니다! 성문이 열렸습니다. 공습부대를 성문으로 이동시키고 사령관님께 우리들도 따라올 거라고 전해주세요.","Commando, hij heeft het gedaan! De poorten zijn open. Stuur de stoottroepen naar binnen en zeg Macil dat we binnenkomen!","Kommando, han har klart det! Portene er åpne. Send inn sjokktroppene og si til Macil at vi kommer inn!","Dowództwo, on to zrobił! Brama jest otwarta. Wyślijcie oddziały uderzeniowe i powiedzcie Macilowi, że wchodzimy!","Comando, ele conseguiu! Os portões estão abertos. Enviem as tropas de choque e digam ao Macil que estamos entrando!",,"Centru, am reușit! Porțile sunt deschise. Trimite trupele de șoc si spune-i lui Macil că intrăm!","Штаб, он выполнил задание! Ворота открыты. Посылайте ударный отряд и доложите Мэйсилу, что мы пробились!",,"Kommando, han har gjort det! Portarna är öppna. Skicka in chocktrupperna och säg till Macil att vi kommer in!","Komuta, başardı! Kapılar açıldı. Şok birliklerini gönderin ve Macil'e geldiğimizi söyleyin!" -"We have conflicting reports about the Programmer's location. One say he's in a computer room, another that he's in a keep and yet another that mentions a long hallway. Sorry. ",TXT_SUB_LOG38,MAP07: Entrace.,,,"Máme rozcházející se zprávy o Programátorově pozici. Jedna mluví o místnosti s počítači, druhá, že je v nějaké pevnosti a třetí zmiňuje dlouhou chodbu. Promiň.","Vi har modstridende rapporter om programmørens placering. En siger, at han er i et computerrum, en anden, at han er i et tårn og endnu en anden, der nævner en lang gang. Undskyld.","Wir haben widersprüchliche Angaben über seinen Aufenthaltsort. Eine sagt, in einem Computerraum, ein anderer, dass er sich in einem Tempelkeller versteckt und noch ein anderer sagt was vom Ende eines langen Flurs.",,,"Tenemos informes contradictorios sobre la ubicación del Programador: uno dice que está en una sala de ordenadores, otro que está en un torreón y otro más menciona un pasillo largo. Perdón.","Tenemos informes contradictorios sobre la ubicación del Programador: uno dice que está en una sala de computadoras, otro que está en un torreón y otro más menciona un pasillo largo. Perdón.","Meillä eriäviä tietoja Ohjelmoitsijan sijainnista: Yhden mukaan hän on tietokonehuoneessa, toisen mukaan linnakkeessa ja vielä kolmas, joka mainitsee pitkän käytävän. Valitan.","On a des rapports contradictoires au sujet d'où se trouve le programmeur. On me dit d'un côté qu'il est dans une salle des ordinateurs, un autre me dit qu'il est dans un donjon, et un autre me dit qu'il est dans un long couloir.. Désolé.","Ellentmondásos jelentéseink vannak a Programozó hollétéről. Egy szerint a számítógép szobában van, másik szerint a vártoronyban, harmadik egy hosszú folyosót említ. Sajnálom.","I rapporti che abbiamo sulla sua posizione si contraddicono. Uno lo piazza in una stanza di computer, un altro in un tempio di sottolivello, e un altro ancora alla fine di un lungo corridoio.","プログラマーの居場所について矛盾する報告もあるわ。 +"We have conflicting reports about the Programmer's location. One say he's in a computer room, another that he's in a keep and yet another that mentions a long hallway. Sorry. ",TXT_SUB_LOG38,MAP07: Entrace.,,,"Máme rozcházející se zprávy o Programátorově pozici. Jedna mluví o místnosti s počítači, druhá, že je v nějaké pevnosti a třetí zmiňuje dlouhou chodbu. Promiň.","Vi har modstridende rapporter om programmørens placering. En siger, at han er i et computerrum, en anden, at han er i et tårn og endnu en anden, der nævner en lang gang. Undskyld.","Wir haben widersprüchliche Angaben über seinen Aufenthaltsort. Eine sagt, in einem Computerraum, ein anderer, dass er sich in einem Tempelkeller versteckt und noch ein anderer sagt was vom Ende eines langen Flurs.",,,"Tenemos informes contradictorios sobre la ubicación del Programador: uno dice que está en una sala de ordenadores, otro que está en un torreón y otro más menciona un pasillo largo. Perdón.","Tenemos informes contradictorios sobre la ubicación del Programador: uno dice que está en una sala de computadoras, otro que está en un torreón y otro más menciona un pasillo largo. Perdón.","Meillä eriäviä tietoja Ohjelmoitsijan sijainnista: Yhden mukaan hän on tietokonehuoneessa, toisen mukaan linnakkeessa ja vielä kolmas, joka mainitsee pitkän käytävän. Valitan.","On a des rapports contradictoires au sujet d'où se trouve le programmeur. On me dit d'un côté qu'il est dans une salle des ordinateurs, un autre me dit qu'il est dans un donjon, et un autre me dit qu'il est dans un long couloir.. Désolé.",,"Ellentmondásos jelentéseink vannak a Programozó hollétéről. Egy szerint a számítógép szobában van, másik szerint a vártoronyban, harmadik egy hosszú folyosót említ. Sajnálom.","I rapporti che abbiamo sulla sua posizione si contraddicono. Uno lo piazza in una stanza di computer, un altro in un tempio di sottolivello, e un altro ancora alla fine di un lungo corridoio.","プログラマーの居場所について矛盾する報告もあるわ。 ある人はコンピューター室にいる、別の人は保管室にいる、 また別の人は長い廊下にいるとも言っていたわ。何とも言えない。","프로그래머의 위치에 관한 보고들이 전부 제각각이야. 하나는 컴퓨터실에, 또 하나는 성채에, 다른 하나는 긴 복도에 있대. 정말 유감이야.","We hebben tegenstrijdige berichten over de locatie van de programmeur. De een zegt dat hij in een computerkamer is, de ander dat hij in een donjon zit en weer een ander die een lange gang noemt. Sorry.","Vi har motstridende rapporter om hvor programmereren befinner seg. En sier at han er i et datarom, en annen at han er i en borg og en tredje nevner en lang korridor. Unnskyld.","Mamy sprzeczne raporty na temat lokalizacji Programisty. Jeden mówi, że jest w sali komputerowej, inny, że w magazynie, a jeszcze inny, że wspomina o długim korytarzu. Przepraszam.","Temos relatos conflitantes sobre onde o Programador se encontra. Um deles diz que ele está na sala de informática, outro que ele está na fortaleza e outro diz que ele está no fim de um longo corredor. Desculpe.",,"Avem rapoarte conflictuale în privința locației Programatorului. Unul zice că e într-o sală de calculatoare, altul într-o curte, iar altul că e intr-un hol lung. Scuze.","Наши сведения о местонахождении Программиста противоречивы. Одни говорят, что он в компьютерной комнате, другие, что он укрывается в цитадели, а третьи, что он в конце длинного коридора. Извини.",,"Vi har motstridiga rapporter om var programmeraren befinner sig. En säger att han är i ett datorrum, en annan att han är i ett torn och ytterligare en annan nämner en lång korridor. Jag är ledsen.","Programcının yeri hakkında çelişkili raporlarımız var. Biri bir bilgisayar odasında olduğunu söylüyor, diğeri bir mahzende ve bir başkası da uzun bir koridordan bahsediyor. Özür dilerim." -"Ah, it's good to be on the offensive again. Give 'em hell, guys!",TXT_SUB_LOG39,MAP07: Near the crusaders.,,,"Á, je to fajn být zase na straně ofenzívy. Jen jim dejte, chlapi!","Ah, det er godt at være i offensiven igen. Giv dem en røvfuld, gutter!","Ah, es ist gut, wieder in der Offensive zu sein. Macht sie fertig, Leute!",,,"Ah, sienta bien estar a la ofensiva de nuevo. ¡Dadles caña, chicos!",,"Aah, tekeepä hyvää olla taas vaihteeksi hyökkäävänä osapuolena. Hakkaa päälle, pojat!","Ah, ça fait du bien d'être sur l'offensive une fois de plus! Foutez leur la misère, les gars!","Áh, jó újra támadásba lendülni. Leckéztessétek meg őket!","Ah, che bello essere di nuovo all'offensiva! Mostrategli la via per l'inferno, ragazzi!",再襲撃するには良い機会だ。地獄に送ってやれ、皆!,"아, 이렇게 다시 공격적으로 나가니 좋다. 맛 좀 보여줘, 얘들아!","Ah, het is goed om weer in de aanval te zijn. Geef ze de hel, jongens!","Ah, det er godt å være på offensiven igjen. Gi dem helvete, folkens!","Dobrze jest być znowu w ofensywie. Zróbcie im piekło, chłopaki!","Ah, é bom estar na ofensiva mais uma vez. Chumbo neles, pessoal!",,"Ah, e bine că mă regăsesc din nou pe partea ofensivă. Dați-le bătaie!","Наконец-то, мы снова переходим в наступление! Всыпьте им как следует, парни!",,"Ah, det är skönt att vara på offensiven igen. Ge dem ett helvete, killar!",Tekrar saldırıya geçmek güzel. Canlarına okuyun çocuklar! -This looks good. Computers... Programmer... What do you think?,TXT_SUB_LOG40,MAP07: Computer room.,,,Tohle vypadá dobře. Počítače... Programátor... Co myslíš?,Det ser godt ud. Computere... Programmør... Hvad synes du?,Das sieht gut aus. Computer... Programmierer... Was denkst du?,,,Esto pinta bien. Computadoras... Programador... ¿Tú que crees?,,"Tämä näyttää hyvältä. Tietokoneita, ohjelmoitsija... Mitä tuumit?","Tout à l'air bien. Ordinateurs, Programmeur, tu en pense quoi?",Ez jól néz ki. Számítógépek... Programozó... Mit gondolsz?,Promette bene. Computer... Programmatore... Che ne pensi?,"これは良い。コンピューター... +"Ah, it's good to be on the offensive again. Give 'em hell, guys!",TXT_SUB_LOG39,MAP07: Near the crusaders.,,,"Á, je to fajn být zase na straně ofenzívy. Jen jim dejte, chlapi!","Ah, det er godt at være i offensiven igen. Giv dem en røvfuld, gutter!","Ah, es ist gut, wieder in der Offensive zu sein. Macht sie fertig, Leute!",,,"Ah, sienta bien estar a la ofensiva de nuevo. ¡Dadles caña, chicos!",,"Aah, tekeepä hyvää olla taas vaihteeksi hyökkäävänä osapuolena. Hakkaa päälle, pojat!","Ah, ça fait du bien d'être sur l'offensive une fois de plus! Foutez leur la misère, les gars!",,"Áh, jó újra támadásba lendülni. Leckéztessétek meg őket!","Ah, che bello essere di nuovo all'offensiva! Mostrategli la via per l'inferno, ragazzi!",再襲撃するには良い機会だ。地獄に送ってやれ、皆!,"아, 이렇게 다시 공격적으로 나가니 좋다. 맛 좀 보여줘, 얘들아!","Ah, het is goed om weer in de aanval te zijn. Geef ze de hel, jongens!","Ah, det er godt å være på offensiven igjen. Gi dem helvete, folkens!","Dobrze jest być znowu w ofensywie. Zróbcie im piekło, chłopaki!","Ah, é bom estar na ofensiva mais uma vez. Chumbo neles, pessoal!",,"Ah, e bine că mă regăsesc din nou pe partea ofensivă. Dați-le bătaie!","Наконец-то, мы снова переходим в наступление! Всыпьте им как следует, парни!",,"Ah, det är skönt att vara på offensiven igen. Ge dem ett helvete, killar!",Tekrar saldırıya geçmek güzel. Canlarına okuyun çocuklar! +This looks good. Computers... Programmer... What do you think?,TXT_SUB_LOG40,MAP07: Computer room.,,,Tohle vypadá dobře. Počítače... Programátor... Co myslíš?,Det ser godt ud. Computere... Programmør... Hvad synes du?,Das sieht gut aus. Computer... Programmierer... Was denkst du?,,,Esto pinta bien. Computadoras... Programador... ¿Tú que crees?,,"Tämä näyttää hyvältä. Tietokoneita, ohjelmoitsija... Mitä tuumit?","Tout à l'air bien. Ordinateurs, Programmeur, tu en pense quoi?",,Ez jól néz ki. Számítógépek... Programozó... Mit gondolsz?,Promette bene. Computer... Programmatore... Che ne pensi?,"これは良い。コンピューター... プログラマー...アンタはどう思う?",이거 괜찮아 보이네. 컴퓨터들과... 프로그래머... 어떻게 생각해?,Dit ziet er goed uit. Computers.... Programmeur.... Wat vind je ervan?,Dette ser bra ut. Datamaskiner... Programmerer... Hva syns du?,To wygląda dobrze. Komputery... Programista... Co o tym sądzisz?,Isto parece bom. Computadores... Programador... O que você acha?,,Arată bine. Calculatoare... Programator... Ce zici?,"Похоже, это здесь. Компьютеры... Программист... Что скажешь?",,Det här ser bra ut. Datorer... Programmerare... Vad tycker du?,Bu iyi görünüyor. Bilgisayarlar. Programcı. Ne düşünüyorsun? -This must be the long hallway. Either that or my sense of scale is shot to hell.,TXT_SUB_LOG41,MAP07: Building before the brigde.,,,"Tohle musí být ta dlouhá chodba. Buď, a nebo už špatně vidím.","Dette må være den lange gang. Enten det, eller også er min fornemmelse for skalaer skudt ad helvede til.","Das muss der lange Flur sein. Entweder das, oder mein Sinn für Größe ist nicht in Ordnung.",,,Este debe ser el pasillo largo. O es eso o mi sentido de la escala está fastidiado.,,"Tämä on varmaankin se pitkä käytävä. Joko niin, tai sitten olen ihan pihalla mittasuhteista.","Ca doit être le long couloir, ça où ma perception des choses est un peu foutue..","Ez lehet a hosszú folyosó. Vagy ez, vagy a térérzékem tropára ment.",Questo deve essere il lungo corridoio. Oppure il mio senso della prospettiva è proprio andato a farsi benedire.,この長い廊下に違いない。それか私のスケール感とどちらかが撃ち落されるな。,"여기가 바로 긴 복도겠네. 아주 길다고 생각해, 아니면 내 머리가 이상하겠지.",Dit moet de lange gang zijn. Of dat of mijn gevoel voor schaalvergroting is naar de hel geschoten.,"Dette må være den lange gangen. Enten det, eller så er målestokkfølelsen min ødelagt.","To musi być ten długi korytarz. Albo to, albo moje wyczucie skali jest do dupy.",Esse deve ser o longo corredor. Ou isso ou o meu senso de escala foi pro saco.,,"Ăsta trebuie să fie holul lung. Fie asta, fie capacitatea mea de a aprecia scara e varză.","Должно быть, длинный коридор — это здесь. Ну или у меня всё плохо с глазомером.",,Det här måste vara den långa korridoren. Antingen det eller så är min skalförståelse helt borta.,Burası uzun koridor olmalı. Ya öyle ya da benim ölçek algım cehenneme döndü. -"This is all the hallmarks of a temple of evil. Severe architecture, big banner... I'd say bingo!",TXT_SUB_LOG42,MAP07: Northeast bulding.,,,"Tohle jsou všechno puncy chrámu zla - hrubá architektura, velký prapor... řekla bych, že bingo!","Dette er alle kendetegnene på et ondskabens tempel. Alvorlig arkitektur, stort banner... Jeg ville sige bingo!","Das sind alles die Zeichen für einen Tempel des Bösen. Strenge Architektur, große Banner... Ich würde sagen: „Bingo!“",,,"Esto tiene toda la pinta de un templo maligno. Arquitectura austera, gran estandarte... ¡Yo diría bingo!",,"Tämä täyttää pahuuden temppelin kaikki tunnusmerkit: tuima arkkitehtuuri, suuri tunnuslippu... Sanoisin, että bingo!","Ca a le décor d'un temple maléfique.. Architecture sinistre, énorme bannière, je dis bingo!","Ha gonosz templom lennék, így néznék ki. Kimért architektúra, óriási lobogó... amondó vagyok megleltük.","Questo ha proprio tutti i tratti di un tempio del male. Architettura minacciosa, grosso stemma... Io direi che abbiamo fatto centro!","これら全部悪の神殿の特徴だ。重苦しい建築物、デカいバナー... +This must be the long hallway. Either that or my sense of scale is shot to hell.,TXT_SUB_LOG41,MAP07: Building before the brigde.,,,"Tohle musí být ta dlouhá chodba. Buď, a nebo už špatně vidím.","Dette må være den lange gang. Enten det, eller også er min fornemmelse for skalaer skudt ad helvede til.","Das muss der lange Flur sein. Entweder das, oder mein Sinn für Größe ist nicht in Ordnung.",,,Este debe ser el pasillo largo. O es eso o mi sentido de la escala está fastidiado.,,"Tämä on varmaankin se pitkä käytävä. Joko niin, tai sitten olen ihan pihalla mittasuhteista.","Ca doit être le long couloir, ça où ma perception des choses est un peu foutue..",,"Ez lehet a hosszú folyosó. Vagy ez, vagy a térérzékem tropára ment.",Questo deve essere il lungo corridoio. Oppure il mio senso della prospettiva è proprio andato a farsi benedire.,この長い廊下に違いない。それか私のスケール感とどちらかが撃ち落されるな。,"여기가 바로 긴 복도겠네. 아주 길다고 생각해, 아니면 내 머리가 이상하겠지.",Dit moet de lange gang zijn. Of dat of mijn gevoel voor schaalvergroting is naar de hel geschoten.,"Dette må være den lange gangen. Enten det, eller så er målestokkfølelsen min ødelagt.","To musi być ten długi korytarz. Albo to, albo moje wyczucie skali jest do dupy.",Esse deve ser o longo corredor. Ou isso ou o meu senso de escala foi pro saco.,,"Ăsta trebuie să fie holul lung. Fie asta, fie capacitatea mea de a aprecia scara e varză.","Должно быть, длинный коридор — это здесь. Ну или у меня всё плохо с глазомером.",,Det här måste vara den långa korridoren. Antingen det eller så är min skalförståelse helt borta.,Burası uzun koridor olmalı. Ya öyle ya da benim ölçek algım cehenneme döndü. +"This is all the hallmarks of a temple of evil. Severe architecture, big banner... I'd say bingo!",TXT_SUB_LOG42,MAP07: Northeast bulding.,,,"Tohle jsou všechno puncy chrámu zla - hrubá architektura, velký prapor... řekla bych, že bingo!","Dette er alle kendetegnene på et ondskabens tempel. Alvorlig arkitektur, stort banner... Jeg ville sige bingo!","Das sind alles die Zeichen für einen Tempel des Bösen. Strenge Architektur, große Banner... Ich würde sagen: „Bingo!“",,,"Esto tiene toda la pinta de un templo maligno. Arquitectura austera, gran estandarte... ¡Yo diría bingo!",,"Tämä täyttää pahuuden temppelin kaikki tunnusmerkit: tuima arkkitehtuuri, suuri tunnuslippu... Sanoisin, että bingo!","Ca a le décor d'un temple maléfique.. Architecture sinistre, énorme bannière, je dis bingo!",,"Ha gonosz templom lennék, így néznék ki. Kimért architektúra, óriási lobogó... amondó vagyok megleltük.","Questo ha proprio tutti i tratti di un tempio del male. Architettura minacciosa, grosso stemma... Io direi che abbiamo fatto centro!","これら全部悪の神殿の特徴だ。重苦しい建築物、デカいバナー... ビンゴだわ!","악당 같은 요소가 모인 건물이네! 엄격한 건물 구조, 커다란 기... 완전 만장일치야.","Dit zijn alle kenmerken van een tempel van het kwaad. Strenge architectuur, grote spandoeken.... Ik zou zeggen bingo!","Dette er alle kjennetegnene på et ondskapens tempel. Streng arkitektur, stort banner... Jeg vil si bingo!","To wszystko ma znamiona świątyni zła. Surowa architektura, wielki baner... Powiedziałbym, że bingo!","Isso tem bem cara de templo malígno. Arquitetura sinístra, estandarte grande... Acho que acertamos na mosca!",,"Ăsta e însemnul unui templu malefic. Arhitectura, steagurile... Eu zic bingo!","Всё это очень похоже на зловещий храм. Строгая архитектура, огромное знамя... Да, это определённо он!",,"Det här har alla kännetecken på ett ondskans tempel. Stark arkitektur, stora banderoller... Jag skulle säga bingo!","Burası bir şeytan tapınağının tüm özelliklerini taşıyor. Sert mimari, büyük afiş. Bingo derdim!" -This is the almighty Programmer? No way!,TXT_SUB_LOG43,,,,Tohle je ten všemocný Programátor? To není možné!,Er dette den almægtige programmør? Det kan ikke passe!,Das ist der allmächtige Programmierer? Niemals!,,,¿Este es el todopoderoso Programador? ¡Ni hablar!,,Tämäkö muka kaikkivoipa Ohjelmoitsija? Ei todellakaan!,Ca c'est le surpuissant Programmeur? Vraiment?,Ez a hírhedt Progamozó? Nincs az az isten!,Sarebbe questo il potente Programmatore? Non è possibile!,,저게 위대한 프로그래머라고? 말도 안 돼!,Dit is de almachtige programmeur? Echt niet!,Er dette den allmektige programmereren? Aldri i livet!,To jest wszechmocny Programista? Nie ma mowy!,Esse é o Programador todo-poderoso? Tá de sacanagem comigo!,,Ăsta e marele Programator? Nici vorbă!,Вот это — всемогущий Программист? Быть не может!,,Är detta den allsmäktige programmeraren? Inte en chans!,Bu yüce Programcı mı? Yok artık! -"I don't know what to believe anymore. The only thing that says ""keep"" to me is that huge monstrosity to the left. But I have no idea how to get in. ",TXT_SUB_LOG44,,,,"Už nevím, čemu věřit. Jediné, co mi říká „pevnost“, je tamta obří hrůza nalevo. Ale nemám tušení, jak se dostat dovnitř.","Jeg ved ikke længere, hvad jeg skal tro. Det eneste, der siger mig ""beholde"", er det store uhyre til venstre. Men jeg har ingen idé om, hvordan jeg kommer ind.","Ich weiß nicht mehr, was ich glauben soll. Das einzige, was ein „Tempel“ sein könnte, ist diese riesige Monströsität da drüben links. Aber ich wüßte nicht wie wir da rein kämen. ",,,"Ya no sé qué creer. Lo único que me dice ""torreón"" es esa monstruosidad enorme a la izquierda. Pero no tengo ni idea de como entrar.",,"En tiedä enää, mitä uskoa. Ainoa asia, joka näyttäytyy minulle ""linnakkeena"", on tuo valtava rumilus vasemmalla. Mutta minulla ei ole aavistustakaan, miten päästä sisään.","Je ne sais pas quoi penser maintenant. Le seul truc qui sonne comme ""donjon"" pour moi c'est l'énorme monstrosité à gauche, mais je ne sais pas comment y entrer.",Nem tudom mit kéne hinnem már. Az egyetlen vártorony szerűség a bal oldalt levő szörnyűség. Ötletem sincs hogy juthatnánk be.,"Non so più a cosa credere. L'unica cosa che mi dice ""fortezza"" è quell'enorme mostruosità alla sinistra, ma non so come entrarvi.",,이젠 누가 맞는 건지 생각이 전혀 안나. “성채”라고 말하는 곳은 분명히 저 왼쪽에 있는 커다란 건물일 거야. 그런데 그곳으로 어떻게 들어가야 하지?,"Ik weet niet meer wat ik moet geloven. Het enige dat tegen mij zegt ""houd"" is dat grote gedrocht aan de linkerkant. Maar ik heb geen idee hoe ik binnen kan komen.","Jeg vet ikke hva jeg skal tro lenger. Det eneste som sier ""hold"" til meg er den enorme monstrøsiteten til venstre. Men jeg aner ikke hvordan jeg skal komme meg inn.","Już nie wiem, w co wierzyć. Jedyne co mówi mi ""trzymaj"" to ta ogromna potworność po lewej stronie. Ale nie mam pojęcia, jak się tam dostać.",Eu não sei mais no que acreditar. A única coisa que parece uma fortaleza pra mim é aquela monstrosidade à esquerda. Mas não faço a menor idéia de como entrar.,,"Nu știu ce să mai cred. Singurul lucru care îmi spune ""curte"" e acea monstruozitate la stânga. Dar n-am idee cum să intrăm.","Не знаю, кому и верить. По-моему, «Цитаделью» можно назвать только ту уродливую громадину слева. Но как туда попасть, я понятия не имею.",,"Jag vet inte vad jag ska tro längre. Det enda som säger ""behåll"" för mig är det enorma monstret till vänster. Men jag har ingen aning om hur jag ska ta mig in.","Artık neye inanacağımı bilmiyorum. Bana ""kalsın"" diyen tek şey soldaki devasa canavar. Ama nasıl gireceğimi bilmiyorum." +This is the almighty Programmer? No way!,TXT_SUB_LOG43,,,,Tohle je ten všemocný Programátor? To není možné!,Er dette den almægtige programmør? Det kan ikke passe!,Das ist der allmächtige Programmierer? Niemals!,,,¿Este es el todopoderoso Programador? ¡Ni hablar!,,Tämäkö muka kaikkivoipa Ohjelmoitsija? Ei todellakaan!,Ca c'est le surpuissant Programmeur? Vraiment?,,Ez a hírhedt Progamozó? Nincs az az isten!,Sarebbe questo il potente Programmatore? Non è possibile!,,저게 위대한 프로그래머라고? 말도 안 돼!,Dit is de almachtige programmeur? Echt niet!,Er dette den allmektige programmereren? Aldri i livet!,To jest wszechmocny Programista? Nie ma mowy!,Esse é o Programador todo-poderoso? Tá de sacanagem comigo!,,Ăsta e marele Programator? Nici vorbă!,Вот это — всемогущий Программист? Быть не может!,,Är detta den allsmäktige programmeraren? Inte en chans!,Bu yüce Programcı mı? Yok artık! +"I don't know what to believe anymore. The only thing that says ""keep"" to me is that huge monstrosity to the left. But I have no idea how to get in. ",TXT_SUB_LOG44,,,,"Už nevím, čemu věřit. Jediné, co mi říká „pevnost“, je tamta obří hrůza nalevo. Ale nemám tušení, jak se dostat dovnitř.","Jeg ved ikke længere, hvad jeg skal tro. Det eneste, der siger mig ""beholde"", er det store uhyre til venstre. Men jeg har ingen idé om, hvordan jeg kommer ind.","Ich weiß nicht mehr, was ich glauben soll. Das einzige, was ein „Tempel“ sein könnte, ist diese riesige Monströsität da drüben links. Aber ich wüßte nicht wie wir da rein kämen. ",,,"Ya no sé qué creer. Lo único que me dice ""torreón"" es esa monstruosidad enorme a la izquierda. Pero no tengo ni idea de como entrar.",,"En tiedä enää, mitä uskoa. Ainoa asia, joka näyttäytyy minulle ""linnakkeena"", on tuo valtava rumilus vasemmalla. Mutta minulla ei ole aavistustakaan, miten päästä sisään.","Je ne sais pas quoi penser maintenant. Le seul truc qui sonne comme ""donjon"" pour moi c'est l'énorme monstrosité à gauche, mais je ne sais pas comment y entrer.",,Nem tudom mit kéne hinnem már. Az egyetlen vártorony szerűség a bal oldalt levő szörnyűség. Ötletem sincs hogy juthatnánk be.,"Non so più a cosa credere. L'unica cosa che mi dice ""fortezza"" è quell'enorme mostruosità alla sinistra, ma non so come entrarvi.",,이젠 누가 맞는 건지 생각이 전혀 안나. “성채”라고 말하는 곳은 분명히 저 왼쪽에 있는 커다란 건물일 거야. 그런데 그곳으로 어떻게 들어가야 하지?,"Ik weet niet meer wat ik moet geloven. Het enige dat tegen mij zegt ""houd"" is dat grote gedrocht aan de linkerkant. Maar ik heb geen idee hoe ik binnen kan komen.","Jeg vet ikke hva jeg skal tro lenger. Det eneste som sier ""hold"" til meg er den enorme monstrøsiteten til venstre. Men jeg aner ikke hvordan jeg skal komme meg inn.","Już nie wiem, w co wierzyć. Jedyne co mówi mi ""trzymaj"" to ta ogromna potworność po lewej stronie. Ale nie mam pojęcia, jak się tam dostać.",Eu não sei mais no que acreditar. A única coisa que parece uma fortaleza pra mim é aquela monstrosidade à esquerda. Mas não faço a menor idéia de como entrar.,,"Nu știu ce să mai cred. Singurul lucru care îmi spune ""curte"" e acea monstruozitate la stânga. Dar n-am idee cum să intrăm.","Не знаю, кому и верить. По-моему, «Цитаделью» можно назвать только ту уродливую громадину слева. Но как туда попасть, я понятия не имею.",,"Jag vet inte vad jag ska tro längre. Det enda som säger ""behåll"" för mig är det enorma monstret till vänster. Men jag har ingen aning om hur jag ska ta mig in.","Artık neye inanacağımı bilmiyorum. Bana ""kalsın"" diyen tek şey soldaki devasa canavar. Ama nasıl gireceğimi bilmiyorum." "When the going gets weird, the weird get going. Watch yourself.",TXT_SUB_LOG45,"MAP09: Entrance. -(Probably a reference to Hunter S. Thompson’s quote, “When the going gets weird, the weird turn pro.”)",,,Divné klima lahodí podivínům. Dávej si na sebe pozor.,"Når det bliver mærkeligt, så bliver det mærkelige også mærkeligt. Pas på dig selv.",Die ganze Sache kommt mir spanisch vor. Pass auf dich auf.,,,La cosa se está poniendo fea. Ten cuidado.,Esto se va a poner feo. Ve con cuidado.,"Kun meininki muuttuu kummaksi, kummat alkavat meinata. Pidä varasi.","Quand les choses tournent au pire, le pire se tourne vers nous.. Fais attention à toi.",Egy fura világban furának kell lenned. Vigyázz magadra.,"Quando il gioco si fa strano, quelli strani si mettono in gioco. Fai attenzione.",怪しい状況では怪しい影が映る。気を付けて。,"상황이 이상해지면, 이상한 일이 계속 일어난다니까... 부디 조심해.","Als het gaat raar wordt, gaat het vreemde aan de slag. Kijk uit.","Når det blir merkelig, blir det merkelige merkelig. Vær forsiktig.","Kiedy robi się dziwnie, dziwacy zaczynają się ruszać. Uważaj na siebie.",A coisa tá ficando feia. Toma cuidado.,,"Cand lucrurile devin ciudate, ai grija.","Если видишь, что что-то не так, остановись и подумай. Будь осторожен.",,"När det blir konstigt, blir det konstiga som går. Se upp för dig själv.","İşler garipleştiğinde, garipler de gider. Kendine dikkat et." -"The Oracle resides in the borderlands, just outside of town. Cross the river, head towards the castle and go left through the archway.",TXT_SUB_LOG46,,,,"Věštec přebývá v pohraničí, hned za městem. Překroč řeku, zamiř k hradu a jdi vlevo pod obloukem.","Oraklet befinder sig i grænselandet, lige uden for byen. Kryds floden, gå mod slottet og gå til venstre gennem buegangen.","Das Orakel hält sich in den Grenzgebieten auf, direkt vor der Stadt. Überquere den Fluss, gehe in Richtung Burg und dann links durchs Tor.",,,"El Oráculo reside en las fronteras, justo fuera del pueblo. Cruza el río, dirígete al castillo y ve a la izquierda a través del arco.",,"Oraakkeli asuu rajamailla aivan kaupungin liepeillä. Ylitä joki, kulje kohti linnaa ja mene vasemmalle kaarikäytävän läpi.","L'Oracle se trouve dans les terrains vagues, à l'extérieur de la ville. Traverse la rivière, va vers le château et à gauche à travers l'arche.","Az Orákulum a peremvidéken tartózkodik, rögtön a városhatárokon túl. Elhagyva a folyót, menj a kastély irányába és fordulj balra a boltívnél.","L'Oracolo risiede nelle terre di confine, subito dopo la città. Attraversa il fiume, vai nella direzione del castello e poi a sinistra oltre l'arco.",,"오라클은 도시 외곽에 있는 접경지 근처에 있어. 강을 넘은 뒤, 성 쪽으로 향하고 아치 밑의 통로를 통해 왼쪽으로 이동해.","Het Orakel woont in de grensgebieden, net buiten de stad. Steek de rivier over, ga naar het kasteel en ga linksaf door de poort.","Orakelet ligger i grenselandet, like utenfor byen. Kryss elven, gå mot slottet og gå til venstre gjennom buegangen.","Wyrocznia mieszka na pograniczu, tuż za miastem. Przejdź przez rzekę, skieruj się w stronę zamku i przejdź w lewo przez łuki.","O Oráculo reside nas fronteiras do lado de fora da cidade. Atravesse o rio, vá em direção ao catelo e vá para a esquerda através do arco.",,"Oracolul locuiește în mărginime, chiar la ieșirea orașului. Treci râul, du-te spre castle, și treci prin arcadă.","Резиденция Оракула находится в пограничье, сразу за городской чертой. Пересеки реку, иди в сторону крепости и сверни налево, пройдя через арку.",,"Oraklet bor i gränslandet, strax utanför staden. Korsa floden, gå mot slottet och gå till vänster genom valvet.","Kahin, kasabanın hemen dışındaki sınır bölgesinde bulunuyor. Nehri geç, kaleye doğru git ve kemerden sola dön." -The Oracle is a supposedly sympathetic high priest who operates outside the Order.,TXT_SUB_LOG47,MAP02: Castle's entrance (MAP10).,,,"Věštec je údajně sympatizující velekněz, operující mimo samotný Řád.","Oraklet er en formodet sympatisk ypperstepræst, der opererer uden for ordenen.","Das Orakel ist ein angeblich verständnisvoller Hohepriester, der außerhalb des Ordens tätig ist.",,,El Oráculo es supuestamente un amable alto sacerdote que opera fuera de la Orden.,,"Oraakkeli on tiettävästi aatteellemme myötämielinen ylipappi, joka toimii Veljeskunnan vaikutuspiirin ulkopuolella.",L'Oracle est supposément un grand prêtre bienveillant qui opère hors du domaine de l'Ordre.,"Az Orákulum állítólag egy megértő főpap, aki nem tartozik a Rend rendjéhez.",L'Oracolo è un alto sacerdote apparentemente approciabile che opera al di fuori dell'Ordine.,オラクルはオーダーとは別の活動をしている同情的な大司祭よ。,"오라클은 인류에 동정을 가지고 있다고 하고, 오더의 바깥에서 활동하는 대사제야.",Het Orakel is een zogenaamd sympathieke hogepriester die buiten de Orde opereert.,Oraklet er en angivelig sympatisk yppersteprest som opererer utenfor ordenen.,"Wyrocznia jest rzekomo sympatycznym arcykapłanem, który działa poza Zakonem.",O Oráculo é supostamente um grande sacerdote benevolente que opera fora da Ordem.,,"Oracolul e un preot care simpatizează cu noi, și care se spune că operează din afara Ordinului.","Похоже, этот Оракул — сочувствующий Сопротивлению верховный жрец, который действует без ведома Ордена.",,Oraklet är en förmodat sympatisk överstepräst som verkar utanför orden.,"Kahin, Düzen'in dışında faaliyet gösteren sözde sempatik bir baş rahiptir." -"The Oracle's temple is in the Borderlands, on the outskirts of town.",TXT_SUB_LOG48,MAP10: After talking to Macil and moving a bit.,,,"Věštcův chrám je v pohraničí, na okraji města.","Oraklets tempel ligger i grænselandet, i udkanten af byen.","Der Tempel des Orakels ist in den Grenzgebieten, direkt vor der Stadt.",,,"El templo del Oráculo está en las Fronteras, a las afueras del pueblo.",,Oraakkelin temppeli sijaitsee rajaseudulla kaupungin laitamilla.,Le temple de l'Oracle se trouve dans les terrains vagues à l'extérieur de la ville.,Az Orákulum temploma a határvidéken található a külvárosban.,"Il tempio dell'Oracolo è nelle terre di confine, fuori città.",オラクルの寺院は町の郊外にある国境地帯の西側にあるわ。,오라클은 도시 외곽에 있는 접경지 근처에 있어.,"De tempel van het Orakel staat in de grensstreek van Nederland, aan de rand van de stad.","Orakelets tempel ligger i Grenselandene, i utkanten av byen.","Świątynia Wyroczni znajduje się na Kresach, na obrzeżach miasta.","O tempo do Oráculo está nas fronteiras, fora da cidade.",,"Templul Oracolului e în Mărginime, la ieșirea din oraș.","Храм Оракула находится в пограничье, на окраине города.",,"Oraklets tempel ligger i gränslandet, i utkanten av staden.","Kahin'in tapınağı Sınır Toprakları'nda, şehrin eteklerinde." -The Order has taken our beautiful planet and turned it into a dump.,TXT_SUB_LOG49,MAP11: Entrance.,,,Řád vzal naši krásnou planetu a proměnil ji ve skládku.,Ordenen har taget vores smukke planet og forvandlet den til en losseplads.,Der Orden hat unseren schönen Planeten in einen Müllplatz verwandelt.,,,La Orden ha tomado nuestro bello planeta y lo ha convertido en un vertedero.,,Veljeskunta on riistänyt planeettamme ja tehnyt siitä kaatopaikan.,L'Ordre a pris notre belle planète et la transformée en dépotoir.,"A Rend kizsigerelte ezt a gyönyörű bolygót, és egy lepratelepet csinált belőle.",L'Ordine ha preso il nostro bellissimo pianeta e l'ha trasformato in una discarica.,オーダーは我々の立つこの惑星を奪い、それをゴミへと変えた。,오더가 이 이쁘고 푸른 행성을 완전 쓰레기장으로 만들어버렸어...,De Orde heeft onze mooie planeet in beslag genomen en er een vuilnisbelt van gemaakt.,Ordenen har tatt vår vakre planet og gjort den til en søppelplass.,Zakon zabrał naszą piękną planetę i zamienił ją w wysypisko śmieci.,A Ordem transformou este lindo planeta em um depósito de lixo.,,Ordinul ne-a luat planeta minunată și a transformat-o într-o groapă de gunoi.,Орден превратил нашу прекрасную планету в помойку.,,Orden har tagit vår vackra planet och förvandlat den till en soptipp.,Tarikat güzel gezegenimizi aldı ve onu bir çöplüğe çevirdi. -"Here it is. I'm recording everything, it's not that I don't have faith that you'll survive, it's just that we can't let the Order control the Sigil.",TXT_SUB_LOG50,MAP11: Entrance to cave.,,,"Tady to je. Všechno nahrávám, ne že bych neměla důvěru v tvé přežití, ale prostě nemůžeme dovolit Řádu ovládat Pečeť.","Her er den. Jeg optager alt, det er ikke fordi jeg ikke tror på, at I vil overleve, men vi kan ikke lade Ordenen kontrollere Sigil.","Hier ist es. Ich zeichne alles auf, nicht dass ich kein Vertrauen in dich habe, aber wir können nicht erlauben, dass der Orden das Sigil kontrolliert.",,,"Aquí está. Lo estoy grabando todo, no es que tenga fe en que sobrevivas, es solo que no puedo dejar que la Orden controle el Emblema.",,"Tässä se on. Tallennan kaiken. Tässä ei ole kyse siitä, etteikö minulla olisi täysi luotto, että selviäisit. Emme vain voi antaa Veljeskunnan hallita Sinettiä.","Voilà, j'enregistre tout. C'est pas qu'on a pas confiance en toi, c'est juste que on ne peut pas laisser l'Ordre contrôler le Sigil.","Itt is van. Minden felveszek, nem azért mert nem bíznék benned, csak ne kerüljön a Rend kezébe a pecsét.",Ecco qua. Sto registrando tutto. Non è che non penso che sopravviverai. È solo che non possiamo lasciare che l'Ordine controlli il Sigillo.,"ここよ。私は全て記録している、貴方が生き残れる可能性が無いわけではなく、 +(Probably a reference to Hunter S. Thompson’s quote, “When the going gets weird, the weird turn pro.”)",,,Divné klima lahodí podivínům. Dávej si na sebe pozor.,"Når det bliver mærkeligt, så bliver det mærkelige også mærkeligt. Pas på dig selv.",Die ganze Sache kommt mir spanisch vor. Pass auf dich auf.,,,La cosa se está poniendo fea. Ten cuidado.,Esto se va a poner feo. Ve con cuidado.,"Kun meininki muuttuu kummaksi, kummat alkavat meinata. Pidä varasi.","Quand les choses tournent au pire, le pire se tourne vers nous.. Fais attention à toi.",,Egy fura világban furának kell lenned. Vigyázz magadra.,"Quando il gioco si fa strano, quelli strani si mettono in gioco. Fai attenzione.",怪しい状況では怪しい影が映る。気を付けて。,"상황이 이상해지면, 이상한 일이 계속 일어난다니까... 부디 조심해.","Als het gaat raar wordt, gaat het vreemde aan de slag. Kijk uit.","Når det blir merkelig, blir det merkelige merkelig. Vær forsiktig.","Kiedy robi się dziwnie, dziwacy zaczynają się ruszać. Uważaj na siebie.",A coisa tá ficando feia. Toma cuidado.,,"Cand lucrurile devin ciudate, ai grija.","Если видишь, что что-то не так, остановись и подумай. Будь осторожен.",,"När det blir konstigt, blir det konstiga som går. Se upp för dig själv.","İşler garipleştiğinde, garipler de gider. Kendine dikkat et." +"The Oracle resides in the borderlands, just outside of town. Cross the river, head towards the castle and go left through the archway.",TXT_SUB_LOG46,,,,"Věštec přebývá v pohraničí, hned za městem. Překroč řeku, zamiř k hradu a jdi vlevo pod obloukem.","Oraklet befinder sig i grænselandet, lige uden for byen. Kryds floden, gå mod slottet og gå til venstre gennem buegangen.","Das Orakel hält sich in den Grenzgebieten auf, direkt vor der Stadt. Überquere den Fluss, gehe in Richtung Burg und dann links durchs Tor.",,,"El Oráculo reside en las fronteras, justo fuera del pueblo. Cruza el río, dirígete al castillo y ve a la izquierda a través del arco.",,"Oraakkeli asuu rajamailla aivan kaupungin liepeillä. Ylitä joki, kulje kohti linnaa ja mene vasemmalle kaarikäytävän läpi.","L'Oracle se trouve dans les terrains vagues, à l'extérieur de la ville. Traverse la rivière, va vers le château et à gauche à travers l'arche.",,"Az Orákulum a peremvidéken tartózkodik, rögtön a városhatárokon túl. Elhagyva a folyót, menj a kastély irányába és fordulj balra a boltívnél.","L'Oracolo risiede nelle terre di confine, subito dopo la città. Attraversa il fiume, vai nella direzione del castello e poi a sinistra oltre l'arco.",,"오라클은 도시 외곽에 있는 접경지 근처에 있어. 강을 넘은 뒤, 성 쪽으로 향하고 아치 밑의 통로를 통해 왼쪽으로 이동해.","Het Orakel woont in de grensgebieden, net buiten de stad. Steek de rivier over, ga naar het kasteel en ga linksaf door de poort.","Orakelet ligger i grenselandet, like utenfor byen. Kryss elven, gå mot slottet og gå til venstre gjennom buegangen.","Wyrocznia mieszka na pograniczu, tuż za miastem. Przejdź przez rzekę, skieruj się w stronę zamku i przejdź w lewo przez łuki.","O Oráculo reside nas fronteiras do lado de fora da cidade. Atravesse o rio, vá em direção ao catelo e vá para a esquerda através do arco.",,"Oracolul locuiește în mărginime, chiar la ieșirea orașului. Treci râul, du-te spre castle, și treci prin arcadă.","Резиденция Оракула находится в пограничье, сразу за городской чертой. Пересеки реку, иди в сторону крепости и сверни налево, пройдя через арку.",,"Oraklet bor i gränslandet, strax utanför staden. Korsa floden, gå mot slottet och gå till vänster genom valvet.","Kahin, kasabanın hemen dışındaki sınır bölgesinde bulunuyor. Nehri geç, kaleye doğru git ve kemerden sola dön." +The Oracle is a supposedly sympathetic high priest who operates outside the Order.,TXT_SUB_LOG47,MAP02: Castle's entrance (MAP10).,,,"Věštec je údajně sympatizující velekněz, operující mimo samotný Řád.","Oraklet er en formodet sympatisk ypperstepræst, der opererer uden for ordenen.","Das Orakel ist ein angeblich verständnisvoller Hohepriester, der außerhalb des Ordens tätig ist.",,,El Oráculo es supuestamente un amable alto sacerdote que opera fuera de la Orden.,,"Oraakkeli on tiettävästi aatteellemme myötämielinen ylipappi, joka toimii Veljeskunnan vaikutuspiirin ulkopuolella.",L'Oracle est supposément un grand prêtre bienveillant qui opère hors du domaine de l'Ordre.,,"Az Orákulum állítólag egy megértő főpap, aki nem tartozik a Rend rendjéhez.",L'Oracolo è un alto sacerdote apparentemente approciabile che opera al di fuori dell'Ordine.,オラクルはオーダーとは別の活動をしている同情的な大司祭よ。,"오라클은 인류에 동정을 가지고 있다고 하고, 오더의 바깥에서 활동하는 대사제야.",Het Orakel is een zogenaamd sympathieke hogepriester die buiten de Orde opereert.,Oraklet er en angivelig sympatisk yppersteprest som opererer utenfor ordenen.,"Wyrocznia jest rzekomo sympatycznym arcykapłanem, który działa poza Zakonem.",O Oráculo é supostamente um grande sacerdote benevolente que opera fora da Ordem.,,"Oracolul e un preot care simpatizează cu noi, și care se spune că operează din afara Ordinului.","Похоже, этот Оракул — сочувствующий Сопротивлению верховный жрец, который действует без ведома Ордена.",,Oraklet är en förmodat sympatisk överstepräst som verkar utanför orden.,"Kahin, Düzen'in dışında faaliyet gösteren sözde sempatik bir baş rahiptir." +"The Oracle's temple is in the Borderlands, on the outskirts of town.",TXT_SUB_LOG48,MAP10: After talking to Macil and moving a bit.,,,"Věštcův chrám je v pohraničí, na okraji města.","Oraklets tempel ligger i grænselandet, i udkanten af byen.","Der Tempel des Orakels ist in den Grenzgebieten, direkt vor der Stadt.",,,"El templo del Oráculo está en las Fronteras, a las afueras del pueblo.",,Oraakkelin temppeli sijaitsee rajaseudulla kaupungin laitamilla.,Le temple de l'Oracle se trouve dans les terrains vagues à l'extérieur de la ville.,,Az Orákulum temploma a határvidéken található a külvárosban.,"Il tempio dell'Oracolo è nelle terre di confine, fuori città.",オラクルの寺院は町の郊外にある国境地帯の西側にあるわ。,오라클은 도시 외곽에 있는 접경지 근처에 있어.,"De tempel van het Orakel staat in de grensstreek van Nederland, aan de rand van de stad.","Orakelets tempel ligger i Grenselandene, i utkanten av byen.","Świątynia Wyroczni znajduje się na Kresach, na obrzeżach miasta.","O tempo do Oráculo está nas fronteiras, fora da cidade.",,"Templul Oracolului e în Mărginime, la ieșirea din oraș.","Храм Оракула находится в пограничье, на окраине города.",,"Oraklets tempel ligger i gränslandet, i utkanten av staden.","Kahin'in tapınağı Sınır Toprakları'nda, şehrin eteklerinde." +The Order has taken our beautiful planet and turned it into a dump.,TXT_SUB_LOG49,MAP11: Entrance.,,,Řád vzal naši krásnou planetu a proměnil ji ve skládku.,Ordenen har taget vores smukke planet og forvandlet den til en losseplads.,Der Orden hat unseren schönen Planeten in einen Müllplatz verwandelt.,,,La Orden ha tomado nuestro bello planeta y lo ha convertido en un vertedero.,,Veljeskunta on riistänyt planeettamme ja tehnyt siitä kaatopaikan.,L'Ordre a pris notre belle planète et la transformée en dépotoir.,,"A Rend kizsigerelte ezt a gyönyörű bolygót, és egy lepratelepet csinált belőle.",L'Ordine ha preso il nostro bellissimo pianeta e l'ha trasformato in una discarica.,オーダーは我々の立つこの惑星を奪い、それをゴミへと変えた。,오더가 이 이쁘고 푸른 행성을 완전 쓰레기장으로 만들어버렸어...,De Orde heeft onze mooie planeet in beslag genomen en er een vuilnisbelt van gemaakt.,Ordenen har tatt vår vakre planet og gjort den til en søppelplass.,Zakon zabrał naszą piękną planetę i zamienił ją w wysypisko śmieci.,A Ordem transformou este lindo planeta em um depósito de lixo.,,Ordinul ne-a luat planeta minunată și a transformat-o într-o groapă de gunoi.,Орден превратил нашу прекрасную планету в помойку.,,Orden har tagit vår vackra planet och förvandlat den till en soptipp.,Tarikat güzel gezegenimizi aldı ve onu bir çöplüğe çevirdi. +"Here it is. I'm recording everything, it's not that I don't have faith that you'll survive, it's just that we can't let the Order control the Sigil.",TXT_SUB_LOG50,MAP11: Entrance to cave.,,,"Tady to je. Všechno nahrávám, ne že bych neměla důvěru v tvé přežití, ale prostě nemůžeme dovolit Řádu ovládat Pečeť.","Her er den. Jeg optager alt, det er ikke fordi jeg ikke tror på, at I vil overleve, men vi kan ikke lade Ordenen kontrollere Sigil.","Hier ist es. Ich zeichne alles auf, nicht dass ich kein Vertrauen in dich habe, aber wir können nicht erlauben, dass der Orden das Sigil kontrolliert.",,,"Aquí está. Lo estoy grabando todo, no es que tenga fe en que sobrevivas, es solo que no puedo dejar que la Orden controle el Emblema.",,"Tässä se on. Tallennan kaiken. Tässä ei ole kyse siitä, etteikö minulla olisi täysi luotto, että selviäisit. Emme vain voi antaa Veljeskunnan hallita Sinettiä.","Voilà, j'enregistre tout. C'est pas qu'on a pas confiance en toi, c'est juste que on ne peut pas laisser l'Ordre contrôler le Sigil.",,"Itt is van. Minden felveszek, nem azért mert nem bíznék benned, csak ne kerüljön a Rend kezébe a pecsét.",Ecco qua. Sto registrando tutto. Non è che non penso che sopravviverai. È solo che non possiamo lasciare che l'Ordine controlli il Sigillo.,"ここよ。私は全て記録している、貴方が生き残れる可能性が無いわけではなく、 オーダー如きにシジルを制御できるわけがないという事だ。","여기야. 난 지금 모든 걸 녹음하고 있어. 네가 살아남을 거라는 믿음을 버린게 아니라, 오더가 시질을 손에 잡게 내버려 둘 수가 없어서 말이야.","Hier is het. Ik ben alles aan het opnemen, het is niet dat ik geen vertrouwen heb dat je het zult overleven, maar het is gewoon dat we de Orde de Sigil niet kunnen laten controleren door de Orde.","Her er det. Jeg tar opp alt, det er ikke det at jeg ikke har tro på at du vil overleve, men vi kan ikke la Ordenen kontrollere sigillet.","Oto ona. Nagrywam wszystko, to nie tak, że nie mam wiary, że przeżyjesz, po prostu nie możemy pozwolić, by Zakon kontrolował Sigil.","Certo, estou gravando tudo. Não é que eu não tenha fé de que você vá sobreviver, mas não podemos deixar a Ordem controlar o Sigilo.",,"Aici e. Înregistrez totul. Nu e vorba c nu vei supraviețui, dar nu putem permite Ordinului să controleze Sigiliul.","Так. Я всё записываю на плёнку. Это не потому, что я не верю, что ты уцелеешь. Просто мы не можем позволить Ордену заполучить Печать.",,"Här är den. Jag spelar in allting, det är inte så att jag inte tror på att du kommer att överleva, det är bara det att vi inte kan låta Orden kontrollera Sigil.","İşte burası. Her şeyi kaydediyorum, hayatta kalacağınıza inanmadığımdan değil, sadece Düzen'in Sigil'i kontrol etmesine izin veremeyiz." -"You are brave, my comrade. I'm proud to be along for the ride.",TXT_SUB_LOG51,MAP12: Bridge to sanctum's normal entrance.,,,"Jsi statečný, můj příteli. Jsem pyšná, že u tohohle můžu být.","Du er modig, min kammerat. Jeg er stolt af at være med på turen.","Du bist tapfer, mein Kamerad. Ich bin stolz darauf, mit von der Partie zu sein.",,,"Eres valiente, mi camarada. Estoy orgullosa de acompañarte.",,"Olet urhea, toverini. Olen ylpeä, että saan olla matkassa mukana.","Tu est courageux, mon camarade, je suis fière de te suivre.","Felettébb bátor vagy bajtárs. Büszke vagyok, hogy veled harcolhatok.","Sei coraggioso, compagno. Sono orgogliosa di essere insieme a te in questo viaggio.",貴方は勇敢で、私の同志。貴方に就けた事を私は誇りに思ってるわ。,"넌 정말 용맹해, 동지. 너랑 같이 일할 수 있는 게 정말 자랑스러워.","Je bent dapper, mijn kameraad. Ik ben er trots op dat ik meega voor de rit.","Du er modig, min kamerat. Jeg er stolt over å være med på turen.","Jesteś odważny, mój towarzyszu. Jestem dumny, że mogę być przy tobie.","Você é corajoso, meu companheiro. Tenho orgulho de estar junto com você.",,"Ești viteaz, soldatul meu. Sunt mândru să lupt alături de tne.","Я хотела сказать тебе, что ты очень храбрый. Я так счастлива, что мне с тобой по пути.",,"Du är modig, min kamrat. Jag är stolt över att vara med på resan.","Cesursun, yoldaşım. Seninle birlikte olmaktan gurur duyuyorum." +"You are brave, my comrade. I'm proud to be along for the ride.",TXT_SUB_LOG51,MAP12: Bridge to sanctum's normal entrance.,,,"Jsi statečný, můj příteli. Jsem pyšná, že u tohohle můžu být.","Du er modig, min kammerat. Jeg er stolt af at være med på turen.","Du bist tapfer, mein Kamerad. Ich bin stolz darauf, mit von der Partie zu sein.",,,"Eres valiente, mi camarada. Estoy orgullosa de acompañarte.",,"Olet urhea, toverini. Olen ylpeä, että saan olla matkassa mukana.","Tu est courageux, mon camarade, je suis fière de te suivre.",,"Felettébb bátor vagy bajtárs. Büszke vagyok, hogy veled harcolhatok.","Sei coraggioso, compagno. Sono orgogliosa di essere insieme a te in questo viaggio.",貴方は勇敢で、私の同志。貴方に就けた事を私は誇りに思ってるわ。,"넌 정말 용맹해, 동지. 너랑 같이 일할 수 있는 게 정말 자랑스러워.","Je bent dapper, mijn kameraad. Ik ben er trots op dat ik meega voor de rit.","Du er modig, min kamerat. Jeg er stolt over å være med på turen.","Jesteś odważny, mój towarzyszu. Jestem dumny, że mogę być przy tobie.","Você é corajoso, meu companheiro. Tenho orgulho de estar junto com você.",,"Ești viteaz, soldatul meu. Sunt mândru să lupt alături de tne.","Я хотела сказать тебе, что ты очень храбрый. Я так счастлива, что мне с тобой по пути.",,"Du är modig, min kamrat. Jag är stolt över att vara med på resan.","Cesursun, yoldaşım. Seninle birlikte olmaktan gurur duyuyorum." Could you pause for a second? I'm getting a little sick.,TXT_SUB_LOG52,"(Strife: Veteran Edition) -Random comment when the player dies with Classic Mode turned off",,,Mohl by ses na chvíli zastavit? Bude mi zle.,Kan du holde en pause et øjeblik? Jeg er ved at få det lidt dårligt.,Kannst du mal kurz warten? Mir wird etwas übel.,,,¿Puedes parar un segundo? Que me estoy mareando.,,Voisitko pysähtyä hetkeksi? Alan voida hieman pahoin.,Tu peux t'arrêter pour un moment? J'ai l'impression d'avoir la nausée.,Meg tudnál állni egy pillanatra? Elég rosszul vagyok.,Puoi fermarti per un secondo? Mi sento un po' nauseata.,ちょっと待ってもらえる?少しばかりうんざりしてるわ。,잠깐만 멈춰줄래? 속이 울렁거려...,Kun je even pauzeren? Ik word een beetje ziek.,Kan du ta en pause? Jeg begynner å bli litt kvalm.,Możesz się zatrzymać na chwilę? Robi mi się trochę niedobrze.,Pode parar por um minuto? Estou ficando com enjôo.,,Poți să te opreși un moment? Mi se face rău.,Мы можем остановиться на секунду? Что-то мне дурно.,,Kan du stanna upp en stund? Jag börjar bli lite sjuk.,Bir saniye durabilir misin? Biraz midem bulanıyor. -Why do we have to spend so much time underground? I've seen underground.,TXT_SUB_LOG53,MAP12: Downstairs.,,,Proč musíme tolik času strávit v podzemí? Podzemí jsem viděla.,Hvorfor skal vi tilbringe så meget tid under jorden? Jeg har set under jorden.,Warum müssen wir so viel Zeit im Untergrund verbringen.? Ich kenne den Untergrund.,,,¿Por que tenemos que pasar tanto tiempo bajo tierra? Ya lo tengo muy visto.,,Miksi olemme niin paljon maan alla? Nähty juttu.,Pourquoi on passe tout notre temps sous terre? J'ai déja tout vu sous terre.,Miért kell ilyen sok időt föld alatt töltenünk? Már láttam elég föld alatti részt.,Ma perché passiamo così tanto tempo sotto terra? Già conosco molto bene posti come questo.,何故私達は地下に長居せねばならないの?地下はもうわかったから。,왜 지하에서 시간을 낭비해야 되는 거지? 난 이미 지하에 있다고.,Waarom moeten we zoveel tijd onder de grond doorbrengen? Ik heb ondergronds gezien.,Hvorfor må vi tilbringe så mye tid under jorden? Jeg har sett undergrunnen.,Dlaczego musimy spędzać tyle czasu pod ziemią? Widziałem już podziemia.,Por que a gente tem que ficar tanto tempo no subterrâneo? Já vi bastante do subterrâneo.,,De ce trebuie să petrecem atâta timp sub pământ? Am văzut subteranul.,Почему нам приходится проводить кучу времени под землёй? Я на десять лет вперед насмотрелась на подземелья.,,Varför måste vi tillbringa så mycket tid under jord? Jag har sett underjorden.,Neden yeraltında bu kadar çok vakit geçirmek zorundayız? Yeraltını gördüm. -Are we really supposed to trust a guy whose inner sanctum is green?,TXT_SUB_LOG54,MAP12: Sanctum's normal entrance.,,,"Fakt máme věřit chlápkovi, jehož svatyně je zelená?","Skal vi virkelig stole på en fyr, hvis indre helligdom er grøn?","Sollen wir wirklich einem Typen vertrauen, dessen Räume grün sind?",,"Ĉu ni vere devas fidi al iu, kies sekreta templo estas verda?",¿En serio hay que fiarse de un tío cuyo templo secreto es verde?,¿En serio hay que confiar en un tipo cuyo templo secreto es verde?,"Tuleeko meidän todella luottaa kaveriin, jolla on vihreä pyhäkkö?",On est vraiment obligé de faire confiance à un type qui a un sanctuaire peint en vert?,"Egy olyan ürgében kéne megbíznunk, akinek zöld színű a szentélye?",Davvero dovremmo fidarci di qualcuno che ha un santuario verde?,聖域内部と全身が緑色の者を信用するべきなの?,성소가 더럽게 초록색인데 이 녀석을 정말 믿어야 해?,Moeten we echt vertrouwen hebben in een man wiens innerlijke heiligdom groen is?,Skal vi virkelig stole på en fyr hvis indre er grønt?,"Czy naprawdę mamy ufać facetowi, którego wewnętrzne sanktuarium jest zielone?",Será que a gente deve mesmo confiar num cara cujo grande santuário é verde?,,Chiar ar trebui să avem încredere în cineva în cineva al cărui sanctuar e verde?,"Мы точно можем доверять парню, чьи внутренние покои зелёного цвета?",,Är det verkligen meningen att vi ska lita på en kille vars inre helgedom är grön?,Kutsal alanı yeşil olan bir adama gerçekten güvenmemiz mi gerekiyor? -Crimson and Obsidian? Why can't he say red and black.,TXT_SUB_LOG55,MAP12: After talking to the Oracle.,,,Karmíno-obsidiánová? Proč nemůže říct červeno-černá?,Purpur og Obsidian? Hvorfor kan han ikke sige rød og sort.,Purpur und Obsidian? Warum kann er nicht Rot und Schwarz sagen?,,Ĉu «karmezina kaj obsidiankolora»? Ĉu li ne scias diri «ruĝa kaj nigra»?,"¿«Carmesí y obsidiana»?, ¿tanto le cuesta decir «roja y negra»?",,Purppuranpunainen ja laavalasinen? Miksei hän voi sanoa punainen ja musta?,Cramoisi et obsidienne? Il peut pas dire juste rouge et noir?,"Karmazsin és obszidián? Miért nem tudja azt mondani, hogy piros és fekete.",Cremisina e ossidiana? Non bastava dire rossa e nera?,深紅と黒曜石?何故彼は赤と黒と言わないの。,진홍빛 흑요석? 빨간 검은색이라고 말하면 어디 덧나나?,Crimson en Obsidian? Waarom kan hij niet rood en zwart zeggen.,Purpur og Obsidian? Hvorfor kan han ikke si rødt og svart?,Karmazyn i Obsydian? Dlaczego nie może powiedzieć: czerwony i czarny.,Carmesim e Obsidiana? Por que ele não diz logo vermelho e preto?,,Străveziu și Obsidian? De ce nu poate spune roșu și negru.,Багрово-обсидиановая? Почему бы не сказать просто — «красно-чёрная»!,,Karminrött och Obsidian? Varför kan han inte säga röd och svart.,Crimson ve Obsidian? Neden kırmızı ve siyah diyemiyor? -"The Bishop is the Order's military leader. He plots their tactics, runs their spies and is charged with controlling us. We off him and we score twice.",TXT_SUB_LOG56,MAP11: Afther talking to the Oracle and leaving the cave.,,,"Biskup velí armádě Řádu. Plánuje jejich taktiky, velí jejich špiónům a má za úkol ovládat nás. Odděláme ho a zabodujeme dvakrát.","Biskoppen er ordenens militære leder. Han udtænker deres taktik, leder deres spioner og har til opgave at kontrollere os. Hvis vi dræber ham, scorer vi to gange.","Der Bischof ist der militärische Anführer des Ordens. Er plant die Strategien, beaufsichtigt die Spione und ist beauftragt, uns zu kontrollieren. Wenn wir ihn ausschalten, gewinnen wir doppelt.",,,"El Obispo es el líder militar de La Orden: planea sus tácticas, maneja a sus espías y está al cargo de controlarnos. Nos lo cargamos y ganamos dos puntos.","El Obispo es el líder militar de La Orden: planea sus tácticas, maneja a sus espías y está al cargo de controlarnos. Lo matamos y premios dobles.","Piispa on Veljeskunnan sotapäällikkö. Hän laatii heidän taktiikkansa, johtaa heidän vakoojiaan ja vastaa meidän hallinnasta. Teemme hänestä lopun ja pokkaamme kaksi pistettä. ","L'évèque est le leader militaire de l'Ordre. C'est lui qui s'occupe de leur tactiques, gère leurs espions, et est en charge de nous contrôler. On l'élimine, on marque deux points.","A Püspök a Rend katonai vezetője. Ő agyalja ki a taktikákat, irányítja a kémeket, és rá van bízva a mi irányításunk is. A kiiktatásával két legyet ütünk egy csapásra.",Il Vescovo è il capo militare dell'Ordine. È lui a pianificare le loro tattiche e gestire le loro spie al fine di controllarci tutti. Farlo fuori sarebbe un enorme vantaggio.,"ビショップはオーダーの軍事指揮官よ。 +Random comment when the player dies with Classic Mode turned off",,,Mohl by ses na chvíli zastavit? Bude mi zle.,Kan du holde en pause et øjeblik? Jeg er ved at få det lidt dårligt.,Kannst du mal kurz warten? Mir wird etwas übel.,,,¿Puedes parar un segundo? Que me estoy mareando.,,Voisitko pysähtyä hetkeksi? Alan voida hieman pahoin.,Tu peux t'arrêter pour un moment? J'ai l'impression d'avoir la nausée.,,Meg tudnál állni egy pillanatra? Elég rosszul vagyok.,Puoi fermarti per un secondo? Mi sento un po' nauseata.,ちょっと待ってもらえる?少しばかりうんざりしてるわ。,잠깐만 멈춰줄래? 속이 울렁거려...,Kun je even pauzeren? Ik word een beetje ziek.,Kan du ta en pause? Jeg begynner å bli litt kvalm.,Możesz się zatrzymać na chwilę? Robi mi się trochę niedobrze.,Pode parar por um minuto? Estou ficando com enjôo.,,Poți să te opreși un moment? Mi se face rău.,Мы можем остановиться на секунду? Что-то мне дурно.,,Kan du stanna upp en stund? Jag börjar bli lite sjuk.,Bir saniye durabilir misin? Biraz midem bulanıyor. +Why do we have to spend so much time underground? I've seen underground.,TXT_SUB_LOG53,MAP12: Downstairs.,,,Proč musíme tolik času strávit v podzemí? Podzemí jsem viděla.,Hvorfor skal vi tilbringe så meget tid under jorden? Jeg har set under jorden.,Warum müssen wir so viel Zeit im Untergrund verbringen.? Ich kenne den Untergrund.,,,¿Por que tenemos que pasar tanto tiempo bajo tierra? Ya lo tengo muy visto.,,Miksi olemme niin paljon maan alla? Nähty juttu.,Pourquoi on passe tout notre temps sous terre? J'ai déja tout vu sous terre.,,Miért kell ilyen sok időt föld alatt töltenünk? Már láttam elég föld alatti részt.,Ma perché passiamo così tanto tempo sotto terra? Già conosco molto bene posti come questo.,何故私達は地下に長居せねばならないの?地下はもうわかったから。,왜 지하에서 시간을 낭비해야 되는 거지? 난 이미 지하에 있다고.,Waarom moeten we zoveel tijd onder de grond doorbrengen? Ik heb ondergronds gezien.,Hvorfor må vi tilbringe så mye tid under jorden? Jeg har sett undergrunnen.,Dlaczego musimy spędzać tyle czasu pod ziemią? Widziałem już podziemia.,Por que a gente tem que ficar tanto tempo no subterrâneo? Já vi bastante do subterrâneo.,,De ce trebuie să petrecem atâta timp sub pământ? Am văzut subteranul.,Почему нам приходится проводить кучу времени под землёй? Я на десять лет вперед насмотрелась на подземелья.,,Varför måste vi tillbringa så mycket tid under jord? Jag har sett underjorden.,Neden yeraltında bu kadar çok vakit geçirmek zorundayız? Yeraltını gördüm. +Are we really supposed to trust a guy whose inner sanctum is green?,TXT_SUB_LOG54,MAP12: Sanctum's normal entrance.,,,"Fakt máme věřit chlápkovi, jehož svatyně je zelená?","Skal vi virkelig stole på en fyr, hvis indre helligdom er grøn?","Sollen wir wirklich einem Typen vertrauen, dessen Räume grün sind?",,"Ĉu ni vere devas fidi al iu, kies sekreta templo estas verda?",¿En serio hay que fiarse de un tío cuyo templo secreto es verde?,¿En serio hay que confiar en un tipo cuyo templo secreto es verde?,"Tuleeko meidän todella luottaa kaveriin, jolla on vihreä pyhäkkö?",On est vraiment obligé de faire confiance à un type qui a un sanctuaire peint en vert?,,"Egy olyan ürgében kéne megbíznunk, akinek zöld színű a szentélye?",Davvero dovremmo fidarci di qualcuno che ha un santuario verde?,聖域内部と全身が緑色の者を信用するべきなの?,성소가 더럽게 초록색인데 이 녀석을 정말 믿어야 해?,Moeten we echt vertrouwen hebben in een man wiens innerlijke heiligdom groen is?,Skal vi virkelig stole på en fyr hvis indre er grønt?,"Czy naprawdę mamy ufać facetowi, którego wewnętrzne sanktuarium jest zielone?",Será que a gente deve mesmo confiar num cara cujo grande santuário é verde?,,Chiar ar trebui să avem încredere în cineva în cineva al cărui sanctuar e verde?,"Мы точно можем доверять парню, чьи внутренние покои зелёного цвета?",,Är det verkligen meningen att vi ska lita på en kille vars inre helgedom är grön?,Kutsal alanı yeşil olan bir adama gerçekten güvenmemiz mi gerekiyor? +Crimson and Obsidian? Why can't he say red and black.,TXT_SUB_LOG55,MAP12: After talking to the Oracle.,,,Karmíno-obsidiánová? Proč nemůže říct červeno-černá?,Purpur og Obsidian? Hvorfor kan han ikke sige rød og sort.,Purpur und Obsidian? Warum kann er nicht Rot und Schwarz sagen?,,Ĉu «karmezina kaj obsidiankolora»? Ĉu li ne scias diri «ruĝa kaj nigra»?,"¿«Carmesí y obsidiana»?, ¿tanto le cuesta decir «roja y negra»?",,Purppuranpunainen ja laavalasinen? Miksei hän voi sanoa punainen ja musta?,Cramoisi et obsidienne? Il peut pas dire juste rouge et noir?,,"Karmazsin és obszidián? Miért nem tudja azt mondani, hogy piros és fekete.",Cremisina e ossidiana? Non bastava dire rossa e nera?,深紅と黒曜石?何故彼は赤と黒と言わないの。,진홍빛 흑요석? 빨간 검은색이라고 말하면 어디 덧나나?,Crimson en Obsidian? Waarom kan hij niet rood en zwart zeggen.,Purpur og Obsidian? Hvorfor kan han ikke si rødt og svart?,Karmazyn i Obsydian? Dlaczego nie może powiedzieć: czerwony i czarny.,Carmesim e Obsidiana? Por que ele não diz logo vermelho e preto?,,Străveziu și Obsidian? De ce nu poate spune roșu și negru.,Багрово-обсидиановая? Почему бы не сказать просто — «красно-чёрная»!,,Karminrött och Obsidian? Varför kan han inte säga röd och svart.,Crimson ve Obsidian? Neden kırmızı ve siyah diyemiyor? +"The Bishop is the Order's military leader. He plots their tactics, runs their spies and is charged with controlling us. We off him and we score twice.",TXT_SUB_LOG56,MAP11: Afther talking to the Oracle and leaving the cave.,,,"Biskup velí armádě Řádu. Plánuje jejich taktiky, velí jejich špiónům a má za úkol ovládat nás. Odděláme ho a zabodujeme dvakrát.","Biskoppen er ordenens militære leder. Han udtænker deres taktik, leder deres spioner og har til opgave at kontrollere os. Hvis vi dræber ham, scorer vi to gange.","Der Bischof ist der militärische Anführer des Ordens. Er plant die Strategien, beaufsichtigt die Spione und ist beauftragt, uns zu kontrollieren. Wenn wir ihn ausschalten, gewinnen wir doppelt.",,,"El Obispo es el líder militar de La Orden: planea sus tácticas, maneja a sus espías y está al cargo de controlarnos. Nos lo cargamos y ganamos dos puntos.","El Obispo es el líder militar de La Orden: planea sus tácticas, maneja a sus espías y está al cargo de controlarnos. Lo matamos y premios dobles.","Piispa on Veljeskunnan sotapäällikkö. Hän laatii heidän taktiikkansa, johtaa heidän vakoojiaan ja vastaa meidän hallinnasta. Teemme hänestä lopun ja pokkaamme kaksi pistettä. ","L'évèque est le leader militaire de l'Ordre. C'est lui qui s'occupe de leur tactiques, gère leurs espions, et est en charge de nous contrôler. On l'élimine, on marque deux points.",,"A Püspök a Rend katonai vezetője. Ő agyalja ki a taktikákat, irányítja a kémeket, és rá van bízva a mi irányításunk is. A kiiktatásával két legyet ütünk egy csapásra.",Il Vescovo è il capo militare dell'Ordine. È lui a pianificare le loro tattiche e gestire le loro spie al fine di controllarci tutti. Farlo fuori sarebbe un enorme vantaggio.,"ビショップはオーダーの軍事指揮官よ。 奴等の戦術を企てスパイを駆り立て私達の支配が管轄だ。 奴を仕留めれば得点は倍額でしょう。","비숍은 그들의 잔혹한 군사 지도자이지. 그는 전술을 획책하고, 첩자를 부리고, 우리들을 통제하고 있어. 그를 죽이면 두 배로 이득이 갈 거야.","De bisschop is de militaire leider van de Orde. Hij zet hun tactiek uit, leidt hun spionnen en heeft de opdracht ons te controleren. We gaan van hem af en we scoren twee keer.","Biskopen er ordenens militære leder. Han planlegger taktikken deres, styrer spionene deres og har ansvaret for å kontrollere oss. Dreper vi ham, scorer vi to ganger.","Biskup jest przywódcą wojskowym Zakonu. Tworzy ich taktykę, prowadzi ich szpiegów i ma za zadanie kontrolować nas. Zdejmiemy go i zdobędziemy dwa punkty.","O Bispo é o líder militar da Ordem. Ele planeja suas táticas, comanda seus espiões e é encarregado de nos controlar. Eliminamos ele e é dois coelhos numa tacada só.",,"Episcopul e liderul militar al Ordinului. Le planifică schemele, tacticile, spionează, și ne controlează. Îl eliminăm și înscriem de două ori.","Епископ — военный лидер Ордена. Он обучает их тактике, управляет их шпионами и жаждет контроля над нами. От его убийства мы выигрываем вдвойне.",,"Biskopen är ordens militära ledare. Han planerar deras taktik, leder deras spioner och har till uppgift att kontrollera oss. Om vi dödar honom får vi två poäng.","Piskopos, Tarikat'ın askeri lideridir. Taktiklerini planlar, casuslarını yönetir ve bizi kontrol etmekle görevlidir. Ondan kurtulursak iki kere kazanırız." -The Bishop is going to be heavily guarded so why don't we swipe a uniform and blend in?,TXT_SUB_LOG57,MAP11: Officer's uniform room.,,,"Biskup bude silně strážen, co takhle sebrat uniformu a splynout s davem?","Biskoppen vil være stærkt bevogtet, så hvorfor tager vi ikke en uniform og falder ind i mængden?","Der Bischof wird schwer bewacht sein, so warum stibitzen wir nicht eine Uniform um uns besser anzupassen?",,,El Obispo estará bien guardado asi que ¿por que no pillamos un uniforme y nos mezclamos?,,"Piispa on taatusti tarkoin vartioitu, joten miksemme kähveltäisi univormua ja sulautuisi joukkoon?","L'évèque sera lourdement protégé, pourquoi ne pas trouver un uniforme et se mêler à la foule?","A Püspök elég izmos védelmet élvez, érdemes lesz lopnunk egy uniformist a beilleszkedés jegyében.","Il Vescovo sarà sicuramente ben protetto, quindi perché non camuffarsi con un'uniforme?",ビショップのいる場所の警備は厳重なので、奴等の制服を盗み紛れ込む方が良いのでは?,"비숍은 군사 지도자니까, 삼엄한 경비에 의해 지켜질 거야. 그러니 전투복을 입고 잠입하는 게 어때?","De bisschop zal zwaar bewaakt worden, dus waarom vegen we er niet een uniform overheen en mengen we ons in de bisschop?","Biskopen kommer til å være tungt bevoktet, så hvorfor tar vi ikke en uniform og smelter inn?","Biskup będzie pilnie strzeżony, więc czemu nie weźmiemy munduru i nie wtopimy się w tłum?","O Bispo está protegido por vários guardas, então que tal roubar um uniforme e se mesclar?",,Episcopul o să fie extrem de bine păzit deci de ce nu luăm o uniformă și ne camuflăm?,"Похоже, что Епископа неплохо охраняют. Предлагаю стянуть униформу и прокрасться внутрь.",,Biskopen kommer att vara tungt bevakad så varför tar vi inte en uniform och smälter in?,"Piskopos çok sıkı korunuyor olacak, neden bir üniforma çalıp aralarına karışmıyoruz?" -"Remind me, we win this thing and I'll call in a decorator.",TXT_SUB_LOG58,,,,"Připomeň mi až vyhrajeme, abych zavolala malíře.","Mind mig om, at hvis vi vinder det her, så tilkalder jeg en dekoratør.","Bitte erinnere mich daran, dass wir einen Dekorateur bestellen, nachdem wir gewonnen haben.",,,"Recuérdame, nos ganamos esto y llamo a un decorador.",,"Muistuta minua, että jos voitamme tämän, niin kutsun paikalle sisustussuunnittelijan.","Rappelle-moi, quand on a fini, il faut que j'appelle un décorateur.","Emlékeztess rá, hogy ha túlvagyunk ezen hívjak egy szobafestőt.","Ricordamelo, appena vinciamo questa battaglia bisogna chiamare qualcuno per ridecorare.",,"우리가 이길 수만 있다면, 축제 분위기 나게 장식할 사람을 부를 거야.","Herinner me eraan, we winnen dit ding en ik zal een decorateur inschakelen.","Minn meg på at hvis vi vinner, ringer jeg etter en dekoratør.","Przypomnij mi, że jak wygramy to wezwę dekoratora.","Não deixa eu esquecer, depois de vencermos vou chamar um decorador.",,"Adu-mi aminte, câștigăm și chem să ne decoreze.","Напомни мне позвать декоратора после того, как мы победим.",,Påminn mig om att om vi vinner det här så ska jag kalla in en dekoratör.,"Hatırlat bana, bu şeyi kazanırsak bir dekoratör çağıracağım." -"I just got word we got an informer inside the fortress. Let's head toward what they call the hospital, he works there.",TXT_SUB_LOG59,MAP17: Bailey → Upstairs.,,,"Právě jsem dostala zprávu, že máme v pevnosti informátora. Měli bychom zamířit k nemocnici, pracuje tam.","Jeg har lige hørt, at vi har en stikker inde i fæstningen. Lad os gå mod det, de kalder hospitalet. Han arbejder der.","Ich habe gerade gehört, dass wir einen Informanten in der Festung haben. Geh rüber um Hospital, dort arbeitet er.",,"Mi ĵus estis sciigita, ke ni havas informanton en la fortreso. Ni iru al tio, kion ili nomas «la malsanulejo» lia laborejo.","Acaban de decirme que tenemos un informante dentro de la fortaleza. Vayamos a lo que llaman «el hospital», que es donde trabaja.","Acaban de decirme que tenemos un informante adentro de la fortaleza. Vayamos a lo que le dicen «el hospital», que es donde trabaja.","Sain juuri tiedon ilmiantajasta linnoituksessa. Suunnataan kohti paikkaa, jota he kutsuvat sairaalaksi; hän työskentelee siellä.","J'entends qu'un de nos informants se trouve dans la forteresse. Allons dans ce qu'ils appellent l'hôpital, il y travaille.","Most kaptam a hírt, hogy van egy besúgónk az erődítményben. Menjünk a kórháznak nevezett részlegbe, ott dolgozik.","Ho appena scoperto che abbiamo un informatore dentro la fortezza. Rechiamoci verso ciò che chiamano l'ospedale, lui lavora là.","要塞の中に情報提供者がいるという話を聞いた。 +The Bishop is going to be heavily guarded so why don't we swipe a uniform and blend in?,TXT_SUB_LOG57,MAP11: Officer's uniform room.,,,"Biskup bude silně strážen, co takhle sebrat uniformu a splynout s davem?","Biskoppen vil være stærkt bevogtet, så hvorfor tager vi ikke en uniform og falder ind i mængden?","Der Bischof wird schwer bewacht sein, so warum stibitzen wir nicht eine Uniform um uns besser anzupassen?",,,El Obispo estará bien guardado asi que ¿por que no pillamos un uniforme y nos mezclamos?,,"Piispa on taatusti tarkoin vartioitu, joten miksemme kähveltäisi univormua ja sulautuisi joukkoon?","L'évèque sera lourdement protégé, pourquoi ne pas trouver un uniforme et se mêler à la foule?",,"A Püspök elég izmos védelmet élvez, érdemes lesz lopnunk egy uniformist a beilleszkedés jegyében.","Il Vescovo sarà sicuramente ben protetto, quindi perché non camuffarsi con un'uniforme?",ビショップのいる場所の警備は厳重なので、奴等の制服を盗み紛れ込む方が良いのでは?,"비숍은 군사 지도자니까, 삼엄한 경비에 의해 지켜질 거야. 그러니 전투복을 입고 잠입하는 게 어때?","De bisschop zal zwaar bewaakt worden, dus waarom vegen we er niet een uniform overheen en mengen we ons in de bisschop?","Biskopen kommer til å være tungt bevoktet, så hvorfor tar vi ikke en uniform og smelter inn?","Biskup będzie pilnie strzeżony, więc czemu nie weźmiemy munduru i nie wtopimy się w tłum?","O Bispo está protegido por vários guardas, então que tal roubar um uniforme e se mesclar?",,Episcopul o să fie extrem de bine păzit deci de ce nu luăm o uniformă și ne camuflăm?,"Похоже, что Епископа неплохо охраняют. Предлагаю стянуть униформу и прокрасться внутрь.",,Biskopen kommer att vara tungt bevakad så varför tar vi inte en uniform och smälter in?,"Piskopos çok sıkı korunuyor olacak, neden bir üniforma çalıp aralarına karışmıyoruz?" +"Remind me, we win this thing and I'll call in a decorator.",TXT_SUB_LOG58,,,,"Připomeň mi až vyhrajeme, abych zavolala malíře.","Mind mig om, at hvis vi vinder det her, så tilkalder jeg en dekoratør.","Bitte erinnere mich daran, dass wir einen Dekorateur bestellen, nachdem wir gewonnen haben.",,,"Recuérdame, nos ganamos esto y llamo a un decorador.",,"Muistuta minua, että jos voitamme tämän, niin kutsun paikalle sisustussuunnittelijan.","Rappelle-moi, quand on a fini, il faut que j'appelle un décorateur.",,"Emlékeztess rá, hogy ha túlvagyunk ezen hívjak egy szobafestőt.","Ricordamelo, appena vinciamo questa battaglia bisogna chiamare qualcuno per ridecorare.",,"우리가 이길 수만 있다면, 축제 분위기 나게 장식할 사람을 부를 거야.","Herinner me eraan, we winnen dit ding en ik zal een decorateur inschakelen.","Minn meg på at hvis vi vinner, ringer jeg etter en dekoratør.","Przypomnij mi, że jak wygramy to wezwę dekoratora.","Não deixa eu esquecer, depois de vencermos vou chamar um decorador.",,"Adu-mi aminte, câștigăm și chem să ne decoreze.","Напомни мне позвать декоратора после того, как мы победим.",,Påminn mig om att om vi vinner det här så ska jag kalla in en dekoratör.,"Hatırlat bana, bu şeyi kazanırsak bir dekoratör çağıracağım." +"I just got word we got an informer inside the fortress. Let's head toward what they call the hospital, he works there.",TXT_SUB_LOG59,MAP17: Bailey → Upstairs.,,,"Právě jsem dostala zprávu, že máme v pevnosti informátora. Měli bychom zamířit k nemocnici, pracuje tam.","Jeg har lige hørt, at vi har en stikker inde i fæstningen. Lad os gå mod det, de kalder hospitalet. Han arbejder der.","Ich habe gerade gehört, dass wir einen Informanten in der Festung haben. Geh rüber um Hospital, dort arbeitet er.",,"Mi ĵus estis sciigita, ke ni havas informanton en la fortreso. Ni iru al tio, kion ili nomas «la malsanulejo» lia laborejo.","Acaban de decirme que tenemos un informante dentro de la fortaleza. Vayamos a lo que llaman «el hospital», que es donde trabaja.","Acaban de decirme que tenemos un informante adentro de la fortaleza. Vayamos a lo que le dicen «el hospital», que es donde trabaja.","Sain juuri tiedon ilmiantajasta linnoituksessa. Suunnataan kohti paikkaa, jota he kutsuvat sairaalaksi; hän työskentelee siellä.","J'entends qu'un de nos informants se trouve dans la forteresse. Allons dans ce qu'ils appellent l'hôpital, il y travaille.",,"Most kaptam a hírt, hogy van egy besúgónk az erődítményben. Menjünk a kórháznak nevezett részlegbe, ott dolgozik.","Ho appena scoperto che abbiamo un informatore dentro la fortezza. Rechiamoci verso ciò che chiamano l'ospedale, lui lavora là.","要塞の中に情報提供者がいるという話を聞いた。 奴等が病院と呼んでいる場所に勤めているので向かいましょう。","요새 안에 우리들을 도울 정보원이 있다는 보고를 들었어. 그는 오더가 병원이라고 부르는 곳 안에 있는데, 그곳으로 찾아가 봐.","Ik heb net gehoord dat we een informant in het fort hebben. Laten we naar wat ze het ziekenhuis noemen gaan, hij werkt daar.",Jeg hørte nettopp at vi har en informant inne i festningen. La oss dra til det de kaller sykehuset. Han jobber der.,"Właśnie dostałem wiadomość, że mamy informatora w twierdzy. Kierujmy się w stronę tego, co nazywają szpitalem, on tam pracuje.","Acabei de receber a informação de que temos um informante dentro da fortaleza. Vamos para onde eles chamam de ""hospital"". Ele trabalha lá.",,"Tocmai am primit ceva de la un informator din interiorul fortăreței. Să merge înspre ceea ce ei numesc spital, lucrează acolo.","Мне только что сказали, что у нас есть информатор внутри крепости. Нам нужно место, которое они называют госпиталем — он работает там.",,"Jag fick just höra att vi har en informatör inne i fästningen. Vi går mot det som de kallar sjukhuset, han arbetar där.","Az önce kalenin içinde bir muhbirimiz olduğu haberini aldım. Hastane dedikleri yere doğru gidelim, orada çalışıyor." -"Grab the plans and knock out the computer, ok?",TXT_SUB_LOG60,MAP17: Security Complex,,,"Seber plány a znič počítač, dobře?","Tag tegningerne og slå computeren ud, okay?","Nimm die Plane und schalte den Computer aus, ok?",,,"Coge los planos y destruye el ordenador, ¿sí?","Toma los planos y destruye la computadora, ¿sí?","Nappaa suunnitelmat ja hajota tietokone, eikö niin?","Récupère les plans et détruis l'ordinateur, ok?","Kapd fel a terveket, és nyírd ki a számítógépet, rendben?","Prendi i piani e distruggi il computer, ok?",計画を奪いにコンピューターを破壊する、いけるわね?,계획서를 집고 컴퓨터를 파괴해. 간단하지?,"Pak de plannen en sla de computer eruit, oké?","Ta tegningene og slå ut datamaskinen, ok?","Weź plany i wywal komputer, ok?","Pegue os planos e destrua o computador, ok?",,"Ia planurile și distruge calculatorul, ok?","Хватаем планы и ломаем компьютер, лады?",,"Ta ritningarna och slå ut datorn, okej?","Planları al ve bilgisayarı devre dışı bırak, tamam mı?" +"Grab the plans and knock out the computer, ok?",TXT_SUB_LOG60,MAP17: Security Complex,,,"Seber plány a znič počítač, dobře?","Tag tegningerne og slå computeren ud, okay?","Nimm die Plane und schalte den Computer aus, ok?",,,"Coge los planos y destruye el ordenador, ¿sí?","Toma los planos y destruye la computadora, ¿sí?","Nappaa suunnitelmat ja hajota tietokone, eikö niin?","Récupère les plans et détruis l'ordinateur, ok?",,"Kapd fel a terveket, és nyírd ki a számítógépet, rendben?","Prendi i piani e distruggi il computer, ok?",計画を奪いにコンピューターを破壊する、いけるわね?,계획서를 집고 컴퓨터를 파괴해. 간단하지?,"Pak de plannen en sla de computer eruit, oké?","Ta tegningene og slå ut datamaskinen, ok?","Weź plany i wywal komputer, ok?","Pegue os planos e destrua o computador, ok?",,"Ia planurile și distruge calculatorul, ok?","Хватаем планы и ломаем компьютер, лады?",,"Ta ritningarna och slå ut datorn, okej?","Planları al ve bilgisayarı devre dışı bırak, tamam mı?" "Alright, I'm not complaining, but next time we might try the way that isn't buckets of blood.",TXT_SUB_LOG61,"(Strife: Veteran Edition) -Random comment when the player dies with Classic Mode turned off",,,"Dobře, nestěžuju si, ale příště bychom mohli zkusit způsob, po kterém nezůstanou kýble krve.","Okay, jeg klager ikke, men næste gang kan vi måske prøve den måde, der ikke er spandevis af blod.","Ok, ich will nicht meckern, aber beim nächsten Mal sollte das mit weniger Blutvergießen vonstatten gehen.",,,"Muy bien, no me quejo, pero la próxima vez deberíamos probar el método que no sea una masacre.",,"Hyvä on, en minä mitään valita, mutta ensi kerralla voisimme kokeilla tapaa, joka ei sisällä ämpärikaupalla verta.","Bon, je ne me plains pas, mais la prochaine fois, essayons de faire sans foutre du sang partout?","Igazából nem akarok panaszkodni, de legközelebb próbáljunk meg egy kevsébé véres módszert.","Va bene, non che voglia lamentarmi, ma magari la prossima volta ",大丈夫、次は血のバケツをぶち撒けない方法を試した方がいい。,"이런... 비꼬는 건 아닌데, 다음번엔 유혈사태를 일으키지 않고 일을 해결해보자.","Oké, ik klaag niet, maar de volgende keer kunnen we misschien de manier proberen waarop dat geen emmers bloed is.","Greit, jeg klager ikke, men neste gang kan vi prøve en vei som ikke er bøtter med blod.","Dobra, nie narzekam, ale następnym razem może spróbujemy drogi, która nie jest wiadrami krwi.","Tá bem, não estou reclamando. Mas da próxima vez vamos tentar de um jeito que não seja sangue jorrando pra tudo que é lado.",,"În regulă, nu mă plâng, dar data viitoare încercăm calea care nu duce la găleți de sânge.","Я не жалуюсь, но, может, в следующий раз попробуем не проливать реки крови?",,"Okej, jag klagar inte, men nästa gång kanske vi ska försöka på det sätt som inte innebär hinkar med blod.","Pekala, şikayet etmiyorum ama bir dahaki sefere kova kova kan olmayan yolu deneyebiliriz." -"We've been through endless hallways before, but I swear, these walls are moving as we pass.",TXT_SUB_LOG62,MAP19: Cross-shaped room at the beginning.,,,"Už jsme předtím byli v nekonečných chodbách, ale přísahám, že tyhle stěny se hýbou.","Vi har været igennem endeløse gange før, men jeg sværger, at disse vægge bevæger sig, mens vi passerer.","Wir sind ja schon durch endlose Flure gegangen, aber ich könnte schwören, dass sich die Wände hier bewegen.",,,"Ya hemos pasado por pasillos sin fin otras veces, pero juro que estas paredes se están moviendo a nuestro paso.",,"Olemme ennenkin kulkeneet loputtomia käytäviä pitkin, mutta voisin melkein vannoa näiden seinien liikkuvan sitä mukaa kun läpi käymme.","J'ai déja fais un tour dans un couloir sans fin comme ça, mais je jure que les murs bougent avec nous.","Volt már dolgunk végtelen hosszú folyosóval, de esküszöm olyan érzésem van, mintha velünk együtt mozognának a falak.","Abbiamo superato chissà quanti corridoi fino ad ora, ma ti giuro, questi muri si muovono mentre camminiamo.","以前に私達は無限へ通じる玄関を通ったかと思うが、誓おう、 +Random comment when the player dies with Classic Mode turned off",,,"Dobře, nestěžuju si, ale příště bychom mohli zkusit způsob, po kterém nezůstanou kýble krve.","Okay, jeg klager ikke, men næste gang kan vi måske prøve den måde, der ikke er spandevis af blod.","Ok, ich will nicht meckern, aber beim nächsten Mal sollte das mit weniger Blutvergießen vonstatten gehen.",,,"Muy bien, no me quejo, pero la próxima vez deberíamos probar el método que no sea una masacre.",,"Hyvä on, en minä mitään valita, mutta ensi kerralla voisimme kokeilla tapaa, joka ei sisällä ämpärikaupalla verta.","Bon, je ne me plains pas, mais la prochaine fois, essayons de faire sans foutre du sang partout?",,"Igazából nem akarok panaszkodni, de legközelebb próbáljunk meg egy kevsébé véres módszert.","Va bene, non che voglia lamentarmi, ma magari la prossima volta ",大丈夫、次は血のバケツをぶち撒けない方法を試した方がいい。,"이런... 비꼬는 건 아닌데, 다음번엔 유혈사태를 일으키지 않고 일을 해결해보자.","Oké, ik klaag niet, maar de volgende keer kunnen we misschien de manier proberen waarop dat geen emmers bloed is.","Greit, jeg klager ikke, men neste gang kan vi prøve en vei som ikke er bøtter med blod.","Dobra, nie narzekam, ale następnym razem może spróbujemy drogi, która nie jest wiadrami krwi.","Tá bem, não estou reclamando. Mas da próxima vez vamos tentar de um jeito que não seja sangue jorrando pra tudo que é lado.",,"În regulă, nu mă plâng, dar data viitoare încercăm calea care nu duce la găleți de sânge.","Я не жалуюсь, но, может, в следующий раз попробуем не проливать реки крови?",,"Okej, jag klagar inte, men nästa gång kanske vi ska försöka på det sätt som inte innebär hinkar med blod.","Pekala, şikayet etmiyorum ama bir dahaki sefere kova kova kan olmayan yolu deneyebiliriz." +"We've been through endless hallways before, but I swear, these walls are moving as we pass.",TXT_SUB_LOG62,MAP19: Cross-shaped room at the beginning.,,,"Už jsme předtím byli v nekonečných chodbách, ale přísahám, že tyhle stěny se hýbou.","Vi har været igennem endeløse gange før, men jeg sværger, at disse vægge bevæger sig, mens vi passerer.","Wir sind ja schon durch endlose Flure gegangen, aber ich könnte schwören, dass sich die Wände hier bewegen.",,,"Ya hemos pasado por pasillos sin fin otras veces, pero juro que estas paredes se están moviendo a nuestro paso.",,"Olemme ennenkin kulkeneet loputtomia käytäviä pitkin, mutta voisin melkein vannoa näiden seinien liikkuvan sitä mukaa kun läpi käymme.","J'ai déja fais un tour dans un couloir sans fin comme ça, mais je jure que les murs bougent avec nous.",,"Volt már dolgunk végtelen hosszú folyosóval, de esküszöm olyan érzésem van, mintha velünk együtt mozognának a falak.","Abbiamo superato chissà quanti corridoi fino ad ora, ma ti giuro, questi muri si muovono mentre camminiamo.","以前に私達は無限へ通じる玄関を通ったかと思うが、誓おう、 通り過ぎた時に壁が動いていたからだと。","난감한 곳들을 다녀갔지만, 여기는 뭔가 새로워. 걸어갈 때마다 벽이 움직이는 것 같거든...","We zijn al eens door eindeloze gangen geweest, maar ik zweer het, deze muren bewegen zich in de loop van de tijd.","Vi har gått gjennom endeløse korridorer før, men disse veggene beveger seg når vi går forbi.","Przechodziliśmy już przez nieskończone korytarze, ale przysięgam, że te ściany się ruszają, gdy przechodzimy.","Já passamos por inúmeros corredores antes, mas eu juro, essas paredes ficam se mexendo enquanto a gente passa.",,Am mai fost prin holuri nesfârșite dar jur că zidurile ăstea se mișcă odată cu noi.,"Мы уже повидали достаточно бесконечных коридоров, но я готова поклясться: эти стены передвигаются, когда мы на них не смотрим.",,"Vi har gått igenom ändlösa korridorer förut, men jag svär att de här väggarna rör sig när vi passerar.","Daha önce de sonsuz koridorlardan geçtik, ama yemin ederim, bu duvarlar biz geçerken hareket ediyor." -"Well, you gotta figure. Military leader equals lots of bad guys.",TXT_SUB_LOG63,MAP16,,,"No, dává to smysl. Armádní vůdce rovná se hodně padouchů.",Det må man regne ud. Militær leder er lig med masser af skurke.,Das war ja klar. Militärischer Anführer bedeutet jede Menge Bösewichte.,,"Nu, ĉi tio estis divenebla: «Militestro» estas egala al multaj malbonuloj.","Bueno, era de imaginar: «Líder militar» equivale a muchos tipos malos.",,Mietipä sitä; sotapäällikkö vastaa monta pahista.,"Bon, fallait y penser. Chef militaire, ça veut dire beaucoup de types armés.","Ki gondolta volna, hogy egy katonai vezetőt egy rakás rossz fiú fog védeni.","Beh, c'era da aspettarselo. Capo militare significa un sacco di cattivi.",さて、貴方はフィギュアを得た。軍隊指揮者は大勢の悪人に匹敵するわ。,이거 정말 뻔하네. 군대 우두머리의 심복들은 다 난폭하고 둔하지.,"Nou ja, je moet het wel beseffen. Militair leider is gelijk aan veel slechteriken.","Vel, du må skjønne. Militærleder er lik mange skurker.","No cóż, trzeba to sobie wyobrazić. Przywódca wojskowy równa się wielu złym ludziom.","Olha só, quem diria. Líder militar é igual a um monte de caras malvados.",,"Ei, dă-ți seama. Lider militar înseamnă mulți băieți răi.",Сам понимаешь. Военный лидер — всё равно что куча плохих парней.,,Det måste man räkna ut. Militär ledare är lika med många skurkar.,Bunu anlamalısın. Askeri lider eşittir bir sürü kötü adam. -Don't give up. This is it. Straight ahead.,TXT_SUB_LOG64,MAP19: Last room (southwestern).,,,"Nevzdávej se, tohle je ono. Jdi rovně.",Du må ikke give op. Det er nu. Lige fremad.,Gib nicht auf. Direkt voraus.,,,No te rindas. Vas bien: justo adelante.,,"Älä luovuta. So nyt tässä, suoraan edessä.","Abandonne pas, on y est. Juste devant.",Ne add fel. Ez lesz az. Éppen előttünk.,Non arrenderti. Siamo arrivati. Dritto in fronte a te.,諦めないで。これでいいんだ。真っ直ぐ行こう。,포기하지 마. 거의 다 왔어. 가까이 왔다고.,Geef niet op. Dit is het. Rechtdoor.,Ikke gi opp. Her er det. Rett fram.,Nie poddawaj się. To jest to. Prosto przed siebie.,Não desista. Esta é a hora. Siga reto adiante.,,Nu te da bătut. Asta e. Drept înainte.,Не падай духом. Вот оно. Впереди.,,Ge inte upp. Det här är det. Rakt fram.,Sakın pes etme. İşte burası. Dümdüz ilerle. -"Next time, we stop at a gas station and ask for directions.",TXT_SUB_LOG65,,,,Příště se zastavíme na benzince a zeptáme se na cestu.,Næste gang stopper vi ved en tankstation og spørger om vej.,Nächstes Mal halten wir an einer Tankstelle und fragen nach der Richtung.,,,A la próxima paramos en una gasolinera y preguntamos la dirección.,,Ensi kerralla pysähdytään huoltoasemalle kysymään suuntaneuvoja.,"La prochaine fois, on s'arrète à une station-service et on demande notre chemin.","Legközelebb amikor megállunk egy benzinkútnál, körbekérdezünk az irányzékkal kapcsolatban.","La prossima volta, ci fermiamo ad una stazione di servizio per chiedere indicazioni.",,다음엔 편의점 같은 건물에 들러서 그냥 방향을 묻자.,De volgende keer stoppen we bij een tankstation en vragen we de weg.,Neste gang stopper vi på en bensinstasjon og spør om veien.,Następnym razem zatrzymamy się na stacji benzynowej i zapytamy o drogę.,Da próxima vez vamos parar num posto de gasolina e perguntar onde fica.,,Data viitoare ne oprim la o benzinărie și întrebăm despre repere.,В следующий раз остановимся на заправке и спросим дорогу.,,Nästa gång stannar vi vid en bensinstation och frågar efter vägen.,Bir dahaki sefere benzin istasyonunda durup yol sorarız. -Oh no! More bells and whistles and nasty guys chasing us.,TXT_SUB_LOG66,MAP19: After coming across an alarm green door.,,,"Ale ne! Další fešné vymoženosti a zmetci, co nás pronásledují.","Åh nej! Flere klokker og fløjter og grimme fyre, der jagter os.",Oh nein. Noch mehr Lärm und Bösewichte auf unseren Fersen.,,,¡No puede ser! Más bombos y platillos y tipos malos persiguiéndonos.,,Voi ei! Lisää härpäkkeitä ja pahiksia jahtaamassa meitä.,Oh non! Encore des trucs et des choses et des sales types qui nous prennent en chasse.,"Jaj ne! Még több csicsás rész, és még annál is több gonosz a nyomunkban.",Oh no! Campane e fischietti e altri cattivi che ci inseguono.,あーらら!鐘と笛で更に厄介な奴等を呼び込んできたな。,"오, 안 돼! 삼엄한 경비에 피할 수도 없는 선택지라니.",Oh nee! Nog meer toeters en bellen en vervelende jongens die ons achterna zitten.,"Å, nei! Flere bjeller og fløyter og ekle fyrer som jager oss.","O nie! Więcej dzwonków i gwizdków i wrednych facetów, którzy nas gonią.",Ai não! Mais bugigangas e capangas vindo atrás de nós.,,Oh nu! Mai mulți băieți răi ne urmăresc!,"О, нет! Ещё больше свистелок, перделок и плохих парней, которые за нами гонятся.",,Åh nej! Fler klockor och visselpipor och otäcka killar som jagar oss.,Olamaz! Daha fazla zil ve düdük ve bizi kovalayan kötü adamlar. -"You know, from the outside, this place looks tiny.",TXT_SUB_LOG67,MAP15: After using a big lift next to a Reaver.,,,Zvenku tohle místo vypadalo drobounké.,Udefra ser det her sted lille ud.,Von außen sieht das hier irgendwie mickrig aus.,,"Nu, ĉi tiu loko aspektis malgranda de ekstere.","O sea, este lugar se veía enano desde fuera.","O sea, este lugar se veía enano desde afuera.","Oletko muuten huomannut, että ulkopuolelta katsottuna tämä paikka näyttää tosi pieneltä.","Tu sais, de l'extérieur, cet endroit à l'air super petit.","Azt hinné az ember, hogy sokkal kisebb ez a hely a kinti kinézet alapján.","Lo sai, da fuori, questo posto sembra piccolo.",外から見ると、此処は小さいみたいね。,"궁금한 게 있는데, 왜 안에 들어가면 커지는 걸까?","Weet je, van buitenaf ziet deze plek er klein uit.","Du vet, fra utsiden ser dette stedet lite ut.","Wiesz, z zewnątrz to miejsce wygląda na malutkie.","Sabe, vendo de longe esse lugar parece minúsculo.",,"Știi, din afară, locul ăsta arată mărunt.","Знаешь, снаружи это место кажется крошечным.",,"Du vet, från utsidan ser det här stället pyttelitet ut.",Dışarıdan bakınca burası çok küçük görünüyor. -"I'm getting a new enemy reading. Don't stop and stare, just waste 'em.",TXT_SUB_LOG68,,,,Zaznamenávám nového nepřítele. Nestůj tam a znič ho!,"Jeg får en ny fjendeudlæsning. Lad være med at stoppe op og stirre, bare smadr dem.","Ich habe eine neue Feindortung. Warum wartest du, mach sie alle!",,,"Tengo señales de un nuevo enemigo. No te pares a mirar, solo cárgatelo.",,Saan uuden lukeman vihollisista. Älä siihen jää töllöttämään; listi ne!,"J'ai un ping ennemi sur mon radar. Ne t'arrète pas, flingue-les.","Új ellenséget észlelek. Ne állj meg nézelődni, hanem nyírd ki őket.","Sto ricevendo segnali di altri nemici. Non fermarti a guardare, distruggili.",,네 주변에 적이 포착됐어. 그냥 쳐다보지 말고 어떻게든 해봐.,"Ik krijg een nieuwe vijandelijke lezing. Niet stoppen en staren, maar ze gewoon verspillen.","Jeg får en ny fiende på skjermen. Ikke stopp og stir, bare skyt dem.","Dostaję nowy odczyt wroga. Nie zatrzymuj się i nie gap, po prostu je zmarnuj.","Estou recebendo sinais de um novo inimigo. Nâo fique parado olhando, mete bala neles.",,"Citesc inamici în apropiere. Nu te oprii și holba, fă-i bucăți.","Вижу врагов. Не стой столбом, мочи их!",,"Jag får en ny fiende som läser av. Stanna inte och stirra, bara döda dem.","Yeni bir düşman okuması alıyorum. Durup bakma, sadece harca onları." -"I hate these forcefields. Look for the shut-off switch, it's gotta be nearby.",TXT_SUB_LOG69,STRIFE1.WAD: MAP15,,,"Nesnáším tahle silová pole. Porozhlédni se po nějakém vypínači, měl by být nablízku.",Jeg hader disse kraftfelter. Se efter slukkontakten. Den må være i nærheden.,"Ich hasse diese Kraftfelder. Such nach einem Schalter, er müsste in der Nähe sein.",,,"Odio estos campos de fuerza. Busca el interruptor de apagado, tiene que estar cerca.",,Vihaan näitä voimakenttiä. Etsi virtakatkaisinta; sen on pakko olla jossain lähettyvillä.,"Je déteste les champs de force. Trouve leur commandes, elles ne doivent pas être loin.","Utálom ezket az erőpajzsokat. Keresd egy kikapcsoló gombot, itt kell lennie valahol.","Odio questi campi di forza. Cerca il pulsante per disattivarlo, deve essere vicino.",私はフォースフィールドが憎いわ。遮断させるスイッチが近くにあるはずだわ。,이런 방어막들 정말 싫다니까. 저걸 끌 스위치를 찾아봐. 가까이에 있을 거야.,"Ik haat deze krachtvelden. Zoek naar de afsluitschakelaar, die moet in de buurt zijn.",Jeg hater disse kraftfeltene. Se etter bryteren. Den må være i nærheten.,"Nienawidzę tych pól siłowych. Szukajcie wyłącznika, musi być w pobliżu.","Odeio esses campos de força. Procure pelo interruptor de desligar, deve estar por perto.",,"Urăsc compurile de forță. Uită-te după un buton de oprire, trebuie să fie în apropiere.","Ненавижу эти силовые поля. Поищи выключатель, он где-то неподалёку.",,"Jag hatar de här kraftfälten. Leta efter avstängningsknappen, den måste vara i närheten.","Bu güç alanlarından nefret ediyorum. Kapatma düğmesini ara, yakında olmalı." -"Ooh, very impressive. Let's blow it up!",TXT_SUB_LOG70,MAP15: Pressing the switch to reveal the PC.,,,"Ó, velmi působivé. Co to nechat vybouchnout?",Meget imponerende. Lad os sprænge den i luften!,"Oh, sehr imposant. Jag ihn hoch!",,,Muy impresionante. ¡Destruyámoslo!,Muy impresionante. ¡Vamos a destruirla!,"Oo, aika vaikuttava. Posautetaan se!","Oooh, très impressionant! Faisons tout péter!",Felettébb lenyűgöző. Robbantsuk is fel!,"Aah, molto impressionante! Facciamolo saltare in aria!",あら、見事な物ね。是非とも火薬を献上しましょう。,"오우, 정말 이쁘네! 이제 터뜨리자!","Ooh, heel indrukwekkend. Laten we hem opblazen!",Veldig imponerende. La oss sprenge den!,"Ooh, bardzo imponujące. Wysadźmy to w powietrze!","Oohh, que impressionante! Vamos detoná-lo.",,"ooh, foarte impresionant. Să-l aruncăm în aer!",Очень впечатляюще. Давай взорвём!,,"Ooh, väldigt imponerande. Vi spränger den!","Ooh, çok etkileyici. Hadi havaya uçuralım!" -"Jump on the teleporter, let's blow this pop stand.",TXT_SUB_LOG71,,,,Skoč na teleportér a odpalme tenhle stánek se zmrzlinou.,"Hop på teleporteren, lad os sprænge denne popstand.",Spring in den Teleporter und jag das Ding hoch.,,,"Súbete al teletransporte, carguémonos este tinglado.",,Loikkaa kaukosiirtimelle; häivytään tästä mestasta.,"Saute dans le téléporteur, cassons nous d'ici.","Ugrás a teleportba, és robbantsuk az égig ezt a kuplerájt.","Salta sul teletrasporto, facciamo esplodere questo mortorio.",,텔레포터를 타고 이 놀이터를 벗어나자.,"Spring op de teleporter, laten we deze popstandaard opblazen.","Hopp på teleporteren, la oss sprenge denne kiosken.","Wskakuj do teleportera, wysadźmy to stoisko z popem.","Entre no teletransportador, vamos explodir este muquifo.",,"Sari în teleportor, să aruncăm în aer totul.",Прыгай в телепорт. Пора валить отсюда.,,"Hoppa på teleportern, låt oss spränga det här popståndet.","Işınlayıcıya atla, hadi şu pop standını havaya uçuralım." -"Wait, the Oracle said we would know him by his symbol of power. Are you thinking what I'm thinking?",TXT_SUB_LOG72,MAP16: Entrance.,,,"Počkat, Věštec říkal, že ho poznáme podle jeho symbolu moci. Myslíš na to samé, co já?","Vent, Oraklet sagde, at vi ville kende ham på hans kraftsymbol. Tænker du det samme som mig?","Warte, das Orakel sagte wir würden ihn an seinem Machtsymbol erkennen. Denkst du, was ich denke?",,,"Momento, el Oráculo ha dicho que lo reconoceríamos por su símbolo de poder. ¿Estás pensando lo mismo que yo?","Momento, el Oráculo dijo que lo reconoceríamos por su símbolo de poder. ¿Estás pensando lo mismo que yo?","Odota; Oraakkeli sanoi, että tunnistaisimme hänet hänen valtansa merkistä. Mietitkö samaa mitä minäkin?","Attend, l'Oracle nous a dit qu'on le reconnaitrerait de par son symbole de pouvoir.. Tu pense à la même chose que moi?","Várjunk csak, azt mondta az Orákulum, hogy felismerjük a jeléről. Te is arra gondolsz amire Én?","Aspetta, l'Oracolo aveva detto che lo avremmo riconosciuto tramite il suo simbolo del potere. Stai pensando quello che penso io?","ちょっと待って、オラクルは私達に彼のシンボルを辿ればわかると述べたか。 +"Well, you gotta figure. Military leader equals lots of bad guys.",TXT_SUB_LOG63,MAP16,,,"No, dává to smysl. Armádní vůdce rovná se hodně padouchů.",Det må man regne ud. Militær leder er lig med masser af skurke.,Das war ja klar. Militärischer Anführer bedeutet jede Menge Bösewichte.,,"Nu, ĉi tio estis divenebla: «Militestro» estas egala al multaj malbonuloj.","Bueno, era de imaginar: «Líder militar» equivale a muchos tipos malos.",,Mietipä sitä; sotapäällikkö vastaa monta pahista.,"Bon, fallait y penser. Chef militaire, ça veut dire beaucoup de types armés.",,"Ki gondolta volna, hogy egy katonai vezetőt egy rakás rossz fiú fog védeni.","Beh, c'era da aspettarselo. Capo militare significa un sacco di cattivi.",さて、貴方はフィギュアを得た。軍隊指揮者は大勢の悪人に匹敵するわ。,이거 정말 뻔하네. 군대 우두머리의 심복들은 다 난폭하고 둔하지.,"Nou ja, je moet het wel beseffen. Militair leider is gelijk aan veel slechteriken.","Vel, du må skjønne. Militærleder er lik mange skurker.","No cóż, trzeba to sobie wyobrazić. Przywódca wojskowy równa się wielu złym ludziom.","Olha só, quem diria. Líder militar é igual a um monte de caras malvados.",,"Ei, dă-ți seama. Lider militar înseamnă mulți băieți răi.",Сам понимаешь. Военный лидер — всё равно что куча плохих парней.,,Det måste man räkna ut. Militär ledare är lika med många skurkar.,Bunu anlamalısın. Askeri lider eşittir bir sürü kötü adam. +Don't give up. This is it. Straight ahead.,TXT_SUB_LOG64,MAP19: Last room (southwestern).,,,"Nevzdávej se, tohle je ono. Jdi rovně.",Du må ikke give op. Det er nu. Lige fremad.,Gib nicht auf. Direkt voraus.,,,No te rindas. Vas bien: justo adelante.,,"Älä luovuta. So nyt tässä, suoraan edessä.","Abandonne pas, on y est. Juste devant.",,Ne add fel. Ez lesz az. Éppen előttünk.,Non arrenderti. Siamo arrivati. Dritto in fronte a te.,諦めないで。これでいいんだ。真っ直ぐ行こう。,포기하지 마. 거의 다 왔어. 가까이 왔다고.,Geef niet op. Dit is het. Rechtdoor.,Ikke gi opp. Her er det. Rett fram.,Nie poddawaj się. To jest to. Prosto przed siebie.,Não desista. Esta é a hora. Siga reto adiante.,,Nu te da bătut. Asta e. Drept înainte.,Не падай духом. Вот оно. Впереди.,,Ge inte upp. Det här är det. Rakt fram.,Sakın pes etme. İşte burası. Dümdüz ilerle. +"Next time, we stop at a gas station and ask for directions.",TXT_SUB_LOG65,,,,Příště se zastavíme na benzince a zeptáme se na cestu.,Næste gang stopper vi ved en tankstation og spørger om vej.,Nächstes Mal halten wir an einer Tankstelle und fragen nach der Richtung.,,,A la próxima paramos en una gasolinera y preguntamos la dirección.,,Ensi kerralla pysähdytään huoltoasemalle kysymään suuntaneuvoja.,"La prochaine fois, on s'arrète à une station-service et on demande notre chemin.",,"Legközelebb amikor megállunk egy benzinkútnál, körbekérdezünk az irányzékkal kapcsolatban.","La prossima volta, ci fermiamo ad una stazione di servizio per chiedere indicazioni.",,다음엔 편의점 같은 건물에 들러서 그냥 방향을 묻자.,De volgende keer stoppen we bij een tankstation en vragen we de weg.,Neste gang stopper vi på en bensinstasjon og spør om veien.,Następnym razem zatrzymamy się na stacji benzynowej i zapytamy o drogę.,Da próxima vez vamos parar num posto de gasolina e perguntar onde fica.,,Data viitoare ne oprim la o benzinărie și întrebăm despre repere.,В следующий раз остановимся на заправке и спросим дорогу.,,Nästa gång stannar vi vid en bensinstation och frågar efter vägen.,Bir dahaki sefere benzin istasyonunda durup yol sorarız. +Oh no! More bells and whistles and nasty guys chasing us.,TXT_SUB_LOG66,MAP19: After coming across an alarm green door.,,,"Ale ne! Další fešné vymoženosti a zmetci, co nás pronásledují.","Åh nej! Flere klokker og fløjter og grimme fyre, der jagter os.",Oh nein. Noch mehr Lärm und Bösewichte auf unseren Fersen.,,,¡No puede ser! Más bombos y platillos y tipos malos persiguiéndonos.,,Voi ei! Lisää härpäkkeitä ja pahiksia jahtaamassa meitä.,Oh non! Encore des trucs et des choses et des sales types qui nous prennent en chasse.,,"Jaj ne! Még több csicsás rész, és még annál is több gonosz a nyomunkban.",Oh no! Campane e fischietti e altri cattivi che ci inseguono.,あーらら!鐘と笛で更に厄介な奴等を呼び込んできたな。,"오, 안 돼! 삼엄한 경비에 피할 수도 없는 선택지라니.",Oh nee! Nog meer toeters en bellen en vervelende jongens die ons achterna zitten.,"Å, nei! Flere bjeller og fløyter og ekle fyrer som jager oss.","O nie! Więcej dzwonków i gwizdków i wrednych facetów, którzy nas gonią.",Ai não! Mais bugigangas e capangas vindo atrás de nós.,,Oh nu! Mai mulți băieți răi ne urmăresc!,"О, нет! Ещё больше свистелок, перделок и плохих парней, которые за нами гонятся.",,Åh nej! Fler klockor och visselpipor och otäcka killar som jagar oss.,Olamaz! Daha fazla zil ve düdük ve bizi kovalayan kötü adamlar. +"You know, from the outside, this place looks tiny.",TXT_SUB_LOG67,MAP15: After using a big lift next to a Reaver.,,,Zvenku tohle místo vypadalo drobounké.,Udefra ser det her sted lille ud.,Von außen sieht das hier irgendwie mickrig aus.,,"Nu, ĉi tiu loko aspektis malgranda de ekstere.","O sea, este lugar se veía enano desde fuera.","O sea, este lugar se veía enano desde afuera.","Oletko muuten huomannut, että ulkopuolelta katsottuna tämä paikka näyttää tosi pieneltä.","Tu sais, de l'extérieur, cet endroit à l'air super petit.",,"Azt hinné az ember, hogy sokkal kisebb ez a hely a kinti kinézet alapján.","Lo sai, da fuori, questo posto sembra piccolo.",外から見ると、此処は小さいみたいね。,"궁금한 게 있는데, 왜 안에 들어가면 커지는 걸까?","Weet je, van buitenaf ziet deze plek er klein uit.","Du vet, fra utsiden ser dette stedet lite ut.","Wiesz, z zewnątrz to miejsce wygląda na malutkie.","Sabe, vendo de longe esse lugar parece minúsculo.",,"Știi, din afară, locul ăsta arată mărunt.","Знаешь, снаружи это место кажется крошечным.",,"Du vet, från utsidan ser det här stället pyttelitet ut.",Dışarıdan bakınca burası çok küçük görünüyor. +"I'm getting a new enemy reading. Don't stop and stare, just waste 'em.",TXT_SUB_LOG68,,,,Zaznamenávám nového nepřítele. Nestůj tam a znič ho!,"Jeg får en ny fjendeudlæsning. Lad være med at stoppe op og stirre, bare smadr dem.","Ich habe eine neue Feindortung. Warum wartest du, mach sie alle!",,,"Tengo señales de un nuevo enemigo. No te pares a mirar, solo cárgatelo.",,Saan uuden lukeman vihollisista. Älä siihen jää töllöttämään; listi ne!,"J'ai un ping ennemi sur mon radar. Ne t'arrète pas, flingue-les.",,"Új ellenséget észlelek. Ne állj meg nézelődni, hanem nyírd ki őket.","Sto ricevendo segnali di altri nemici. Non fermarti a guardare, distruggili.",,네 주변에 적이 포착됐어. 그냥 쳐다보지 말고 어떻게든 해봐.,"Ik krijg een nieuwe vijandelijke lezing. Niet stoppen en staren, maar ze gewoon verspillen.","Jeg får en ny fiende på skjermen. Ikke stopp og stir, bare skyt dem.","Dostaję nowy odczyt wroga. Nie zatrzymuj się i nie gap, po prostu je zmarnuj.","Estou recebendo sinais de um novo inimigo. Nâo fique parado olhando, mete bala neles.",,"Citesc inamici în apropiere. Nu te oprii și holba, fă-i bucăți.","Вижу врагов. Не стой столбом, мочи их!",,"Jag får en ny fiende som läser av. Stanna inte och stirra, bara döda dem.","Yeni bir düşman okuması alıyorum. Durup bakma, sadece harca onları." +"I hate these forcefields. Look for the shut-off switch, it's gotta be nearby.",TXT_SUB_LOG69,STRIFE1.WAD: MAP15,,,"Nesnáším tahle silová pole. Porozhlédni se po nějakém vypínači, měl by být nablízku.",Jeg hader disse kraftfelter. Se efter slukkontakten. Den må være i nærheden.,"Ich hasse diese Kraftfelder. Such nach einem Schalter, er müsste in der Nähe sein.",,,"Odio estos campos de fuerza. Busca el interruptor de apagado, tiene que estar cerca.",,Vihaan näitä voimakenttiä. Etsi virtakatkaisinta; sen on pakko olla jossain lähettyvillä.,"Je déteste les champs de force. Trouve leur commandes, elles ne doivent pas être loin.",,"Utálom ezket az erőpajzsokat. Keresd egy kikapcsoló gombot, itt kell lennie valahol.","Odio questi campi di forza. Cerca il pulsante per disattivarlo, deve essere vicino.",私はフォースフィールドが憎いわ。遮断させるスイッチが近くにあるはずだわ。,이런 방어막들 정말 싫다니까. 저걸 끌 스위치를 찾아봐. 가까이에 있을 거야.,"Ik haat deze krachtvelden. Zoek naar de afsluitschakelaar, die moet in de buurt zijn.",Jeg hater disse kraftfeltene. Se etter bryteren. Den må være i nærheten.,"Nienawidzę tych pól siłowych. Szukajcie wyłącznika, musi być w pobliżu.","Odeio esses campos de força. Procure pelo interruptor de desligar, deve estar por perto.",,"Urăsc compurile de forță. Uită-te după un buton de oprire, trebuie să fie în apropiere.","Ненавижу эти силовые поля. Поищи выключатель, он где-то неподалёку.",,"Jag hatar de här kraftfälten. Leta efter avstängningsknappen, den måste vara i närheten.","Bu güç alanlarından nefret ediyorum. Kapatma düğmesini ara, yakında olmalı." +"Ooh, very impressive. Let's blow it up!",TXT_SUB_LOG70,MAP15: Pressing the switch to reveal the PC.,,,"Ó, velmi působivé. Co to nechat vybouchnout?",Meget imponerende. Lad os sprænge den i luften!,"Oh, sehr imposant. Jag ihn hoch!",,,Muy impresionante. ¡Destruyámoslo!,Muy impresionante. ¡Vamos a destruirla!,"Oo, aika vaikuttava. Posautetaan se!","Oooh, très impressionant! Faisons tout péter!",,Felettébb lenyűgöző. Robbantsuk is fel!,"Aah, molto impressionante! Facciamolo saltare in aria!",あら、見事な物ね。是非とも火薬を献上しましょう。,"오우, 정말 이쁘네! 이제 터뜨리자!","Ooh, heel indrukwekkend. Laten we hem opblazen!",Veldig imponerende. La oss sprenge den!,"Ooh, bardzo imponujące. Wysadźmy to w powietrze!","Oohh, que impressionante! Vamos detoná-lo.",,"ooh, foarte impresionant. Să-l aruncăm în aer!",Очень впечатляюще. Давай взорвём!,,"Ooh, väldigt imponerande. Vi spränger den!","Ooh, çok etkileyici. Hadi havaya uçuralım!" +"Jump on the teleporter, let's blow this pop stand.",TXT_SUB_LOG71,,,,Skoč na teleportér a odpalme tenhle stánek se zmrzlinou.,"Hop på teleporteren, lad os sprænge denne popstand.",Spring in den Teleporter und jag das Ding hoch.,,,"Súbete al teletransporte, carguémonos este tinglado.",,Loikkaa kaukosiirtimelle; häivytään tästä mestasta.,"Saute dans le téléporteur, cassons nous d'ici.",,"Ugrás a teleportba, és robbantsuk az égig ezt a kuplerájt.","Salta sul teletrasporto, facciamo esplodere questo mortorio.",,텔레포터를 타고 이 놀이터를 벗어나자.,"Spring op de teleporter, laten we deze popstandaard opblazen.","Hopp på teleporteren, la oss sprenge denne kiosken.","Wskakuj do teleportera, wysadźmy to stoisko z popem.","Entre no teletransportador, vamos explodir este muquifo.",,"Sari în teleportor, să aruncăm în aer totul.",Прыгай в телепорт. Пора валить отсюда.,,"Hoppa på teleportern, låt oss spränga det här popståndet.","Işınlayıcıya atla, hadi şu pop standını havaya uçuralım." +"Wait, the Oracle said we would know him by his symbol of power. Are you thinking what I'm thinking?",TXT_SUB_LOG72,MAP16: Entrance.,,,"Počkat, Věštec říkal, že ho poznáme podle jeho symbolu moci. Myslíš na to samé, co já?","Vent, Oraklet sagde, at vi ville kende ham på hans kraftsymbol. Tænker du det samme som mig?","Warte, das Orakel sagte wir würden ihn an seinem Machtsymbol erkennen. Denkst du, was ich denke?",,,"Momento, el Oráculo ha dicho que lo reconoceríamos por su símbolo de poder. ¿Estás pensando lo mismo que yo?","Momento, el Oráculo dijo que lo reconoceríamos por su símbolo de poder. ¿Estás pensando lo mismo que yo?","Odota; Oraakkeli sanoi, että tunnistaisimme hänet hänen valtansa merkistä. Mietitkö samaa mitä minäkin?","Attend, l'Oracle nous a dit qu'on le reconnaitrerait de par son symbole de pouvoir.. Tu pense à la même chose que moi?",,"Várjunk csak, azt mondta az Orákulum, hogy felismerjük a jeléről. Te is arra gondolsz amire Én?","Aspetta, l'Oracolo aveva detto che lo avremmo riconosciuto tramite il suo simbolo del potere. Stai pensando quello che penso io?","ちょっと待って、オラクルは私達に彼のシンボルを辿ればわかると述べたか。 貴方今、私と同じ事考えてる?","잠깐, 오라클이 전에 권력을 상징하는 문양을 따라가면 만날 수 있다고 했지? 너 나랑 같은 생각 하고 있지?","Wacht, het Orakel zei dat we hem zouden kennen aan zijn machtssymbool. Denk jij wat ik denk?","Vent, oraklet sa at vi ville kjenne ham igjen på maktsymbolet hans. Tenker du det samme som meg?","Czekaj, Wyrocznia powiedziała, że poznamy go po symbolu mocy. Myślisz o tym, co ja myślę?","Peraí, o Oráculo disse que reconheceríamos ele pelo seu símbolo de poder. Você está pensando o mesmo que eu?",,"Stai, Oracolul zicea că îl vom cunoaște după însemnul lui. Te gândeștila același lucru?","Подожди — Оракул сказал, что мы найдём его по символу власти. Ты думаешь о том же, о чём и я?",,"Vänta, Oraklet sa att vi skulle känna igen honom på hans kraftsymbol. Tänker du samma sak som jag?","Bekle, Kahin onu güç sembolünden tanıyacağımızı söylemişti. Sen de benim düşündüğümü mü düşünüyorsun?" -"These guys got a decorating idea that works, and they just beat it to death.",TXT_SUB_LOG73,,,,Tihle lidi dostali dobrý nápad na výzdobu a pak ho zadupali do země.,"Disse fyre har en dekorativ idé, som virker, og de slår den bare ihjel.","Diese Typen haben ein Design das funktioniert, aber sie haben es total übertrieben.",,,"Estos tipos tuvieron una idea de decoración que funciona, y la han matado a palos.",,"Näille tyypeille välähti yksi toimiva sisustusidea, ja he vain kuluttivat sen loppuun.",Cest types avaient une super bonne idée déco et ils ont fait n'importe quoi avec.,"Ezeknek az embereknek volt egy jó dekorációs ötlete, csak némileg túlzásba vitték.","Questi qua hanno avuto una buona idea di come decorare, e poi ci sono andati ben troppo oltre.",,"저놈들은 도움이 되는 생각을 가지고 있기는 한데, 다 쓸데없이 망치고 있어.","Deze jongens hebben een decoratief idee dat werkt, en ze hebben het gewoon doodgeslagen.","De har en dekorasjonsidé som funker, og så slår de den i hjel.","Ci kolesie mają pomysł na wystrój, który działa, a oni go po prostu zepsuli na śmierć.",Esses caras tinham uma idéia de decoração que funcionava e depois mandaram tudo pro saco.,,Tipii ăștia au o idee despre decorații în aplicare.,"У этих ребят была отличная идея декора, но они загубили её на корню.",,"De här killarna har en dekorationsidé som fungerar, och de bara slår ihjäl den.",Bu adamların işe yarayan bir dekorasyon fikri var ve onu öldüresiye dövüyorlar. -Did you see that weird spectre that came out of the Bishop's body? Where have I seen that before?,TXT_SUB_LOG74,MAP16: After killing the Bishop,,,"Viděl jsi ten divný přízrak, který vyšel z Biskupova těla? Kde jsem ho jen předtím viděla?","Så du det underlige spøgelse, der kom ud af biskoppens krop? Hvor har jeg set det før?","Hast du diesen seltsamen Schemen gesehen, der aus seinem Körper herauskam? Wo haben wir das schonmal gesehen?",,,¿Viste ese extraño espectro que salió del cuerpo del Obispo? ¿Donde lo he visto antes?,,"Näitkö tuon oudon aaveen, joka nousi Piispan ruumiista? Missä olen nähnyt sen aiemmin?",Tu a vu ce spectre bizarre qui est sorti du corps de l'évèque? On a pas vu ça quelque part avant?,Láttad azt a fura szellemet ami kijött a Püspök teteméből? Hol láttam én már azt?,Hai visto quello strano spettro che è uscito dal corpo del Vescovo? Dove l'ho già visto prima?,"ビショップの体から出てきたあの奇妙な幽体を見た? +"These guys got a decorating idea that works, and they just beat it to death.",TXT_SUB_LOG73,,,,Tihle lidi dostali dobrý nápad na výzdobu a pak ho zadupali do země.,"Disse fyre har en dekorativ idé, som virker, og de slår den bare ihjel.","Diese Typen haben ein Design das funktioniert, aber sie haben es total übertrieben.",,,"Estos tipos tuvieron una idea de decoración que funciona, y la han matado a palos.",,"Näille tyypeille välähti yksi toimiva sisustusidea, ja he vain kuluttivat sen loppuun.",Cest types avaient une super bonne idée déco et ils ont fait n'importe quoi avec.,,"Ezeknek az embereknek volt egy jó dekorációs ötlete, csak némileg túlzásba vitték.","Questi qua hanno avuto una buona idea di come decorare, e poi ci sono andati ben troppo oltre.",,"저놈들은 도움이 되는 생각을 가지고 있기는 한데, 다 쓸데없이 망치고 있어.","Deze jongens hebben een decoratief idee dat werkt, en ze hebben het gewoon doodgeslagen.","De har en dekorasjonsidé som funker, og så slår de den i hjel.","Ci kolesie mają pomysł na wystrój, który działa, a oni go po prostu zepsuli na śmierć.",Esses caras tinham uma idéia de decoração que funcionava e depois mandaram tudo pro saco.,,Tipii ăștia au o idee despre decorații în aplicare.,"У этих ребят была отличная идея декора, но они загубили её на корню.",,"De här killarna har en dekorationsidé som fungerar, och de bara slår ihjäl den.",Bu adamların işe yarayan bir dekorasyon fikri var ve onu öldüresiye dövüyorlar. +Did you see that weird spectre that came out of the Bishop's body? Where have I seen that before?,TXT_SUB_LOG74,MAP16: After killing the Bishop,,,"Viděl jsi ten divný přízrak, který vyšel z Biskupova těla? Kde jsem ho jen předtím viděla?","Så du det underlige spøgelse, der kom ud af biskoppens krop? Hvor har jeg set det før?","Hast du diesen seltsamen Schemen gesehen, der aus seinem Körper herauskam? Wo haben wir das schonmal gesehen?",,,¿Viste ese extraño espectro que salió del cuerpo del Obispo? ¿Donde lo he visto antes?,,"Näitkö tuon oudon aaveen, joka nousi Piispan ruumiista? Missä olen nähnyt sen aiemmin?",Tu a vu ce spectre bizarre qui est sorti du corps de l'évèque? On a pas vu ça quelque part avant?,,Láttad azt a fura szellemet ami kijött a Püspök teteméből? Hol láttam én már azt?,Hai visto quello strano spettro che è uscito dal corpo del Vescovo? Dove l'ho già visto prima?,"ビショップの体から出てきたあの奇妙な幽体を見た? 以前に何処かで見た気がするけど?",그나저나 비숍 몸에서 튀어나왔던 검은 물체 봤어? 전에 본 적이 있나?,Zag je dat rare spook dat uit het lichaam van de bisschop kwam? Waar heb ik dat eerder gezien?,Så du det rare spøkelset som kom ut av biskopens kropp? Hvor har jeg sett det før?,"Widziałeś to dziwne widmo, które wyszło z ciała biskupa? Gdzie ja to już widziałem?",Você viu aquele espectro estranho que saiu do corpo do BIspo? Onde foi que eu já vi isso antes?,,Ai văzut acel spectru ieșind din Episcop? Unde am mai văzut asta?,"Видел тот странный фантом, вышедший из тела Епископа? Где я могла видеть такое раньше?",,Såg du det konstiga spöket som kom ut ur biskopens kropp? Var har jag sett det förut?,Piskoposun bedeninden çıkan o garip hayaleti gördün mü? Bunu daha önce nerede görmüştüm? -Judgment call time. Now that we got two pieces we might wanna return to base. What does your instinct tell you?,TXT_SUB_LOG75,,,,"Čas se rozhodnout. Teď, když máme dva díly, bychom se možná měli vrátit na základnu. Co ti říká intuice?","Det er tid til at dømme. Nu hvor vi har to stykker, bør vi måske vende tilbage til basen. Hvad siger dit instinkt dig?","Zeit für eine Gewissensentscheidung. Jetzt wo wir zwei Teile haben, sollten wir zur Basis zurückkehren. Was denkst du?",,,Hora del Juicio. Ahora que tienes dos piezas podríamos regresar a la base. ¿Qué te dice tú instinto?,,"Aika tehdä päätös: Nyt, kun meillä on kaksi osasta, saattaisimme haluta palata tukikohtaan. Mitä vaistosi sanoo?","C'est l'heure du jugement, on a deux pièce, il est temps de retourner à la base. Que te dit ton instinct?","Kupaktanács. Most, hogy megszereztün két darabot, vissza is térhetünk a bázisba. mit mond az ösztönöd?",È l'ora di decidere. Adesso che abbiamo due pezzi sarebbe il caso di tornare alla base. Cosa dice il tuo istinto?,,심판의 시간이야. 시질 두 조각을 모았으니 본부로 돌아가자. 이제 너의 본능은 무슨 해답을 내놓을까?,"Oordeel roep tijd. Nu we twee stukken hebben, willen we misschien terug naar de basis. Wat zegt je instinct je?","Tid for domsavsigelse. Nå som vi har to stykker, bør vi kanskje dra tilbake til basen. Hva sier instinktet ditt?","Czas na osąd. Teraz, kiedy mamy dwa kawałki, możemy chcieć wrócić do bazy. Co mówi ci twój instynkt?","Hora do julgamento. Agora que temos duas peças, talvez a gente queira voltar pra base. O que o seu instinto diz?",,Timpul să judecăm. Acum că avem două piese ne putem întoarce la bază. Ce-ți zice instinctul?,"Время решать. Теперь, когда у нас есть две части, мы можем вернуться на базу. Что твоя интуиция подсказывает тебе?",,Det är dags att döma. Nu när vi har två delar kanske vi borde återvända till basen. Vad säger din instinkt dig?,Karar verme zamanı. Elimizde iki parça olduğuna göre üsse dönmek isteyebiliriz. İçgüdülerin sana ne söylüyor? -"I have a report that the spectral energy we found near the Bishop is also present by the Oracle, let's be careful.",TXT_SUB_LOG76,MAP11: After killing the Bishop and going to MAP12's entrance,,,"Mám hlášení, že stejná přízračná energie, kterou jsme našli u Biskupa, se nachází také u Věštce. Měli bychom být opatrní.","Jeg har en rapport om, at den spektrale energi, vi fandt i nærheden af biskoppen, også er til stede ved oraklet, så lad os være forsigtige.","Ich habe einen Report, dass die spektrale Energie, die wir beim Bischof gefunden haben, auch beim Orakel präsent ist. Sei vorsichtig.",,,"Tengo un informe de que la energía espectral que encontramos cerca del Obispo también está presente junto al Oráculo, vayamos con cuidado",,"Sain tiedon, että aave-energiaa, jota löysimme Piispan läheltä, on läsnä myös Oraakkelin luona. Ollaan varovaisia.",J'ai un rapport que l'énergie spectrale que l'on a trouvé près de l'évèque est aussi près de l'Oracle. Faisons attention.,Egy beszámoló szerint az Orákulum körülötti lelki színkép megegyezik a Püspökével. Legyünk tehát óvatosak.,"Ho qua un rapporto che ci informa che l'energia spettrale che abbiamo trovato vicino il Vescovo è anche presente vicino l'Oracolo, dobbiamo essere attenti.","ビショップにもあったスペクトラルエネルギーがオラクルにも宿っているという +Judgment call time. Now that we got two pieces we might wanna return to base. What does your instinct tell you?,TXT_SUB_LOG75,,,,"Čas se rozhodnout. Teď, když máme dva díly, bychom se možná měli vrátit na základnu. Co ti říká intuice?","Det er tid til at dømme. Nu hvor vi har to stykker, bør vi måske vende tilbage til basen. Hvad siger dit instinkt dig?","Zeit für eine Gewissensentscheidung. Jetzt wo wir zwei Teile haben, sollten wir zur Basis zurückkehren. Was denkst du?",,,Hora del Juicio. Ahora que tienes dos piezas podríamos regresar a la base. ¿Qué te dice tú instinto?,,"Aika tehdä päätös: Nyt, kun meillä on kaksi osasta, saattaisimme haluta palata tukikohtaan. Mitä vaistosi sanoo?","C'est l'heure du jugement, on a deux pièce, il est temps de retourner à la base. Que te dit ton instinct?",,"Kupaktanács. Most, hogy megszereztün két darabot, vissza is térhetünk a bázisba. mit mond az ösztönöd?",È l'ora di decidere. Adesso che abbiamo due pezzi sarebbe il caso di tornare alla base. Cosa dice il tuo istinto?,,심판의 시간이야. 시질 두 조각을 모았으니 본부로 돌아가자. 이제 너의 본능은 무슨 해답을 내놓을까?,"Oordeel roep tijd. Nu we twee stukken hebben, willen we misschien terug naar de basis. Wat zegt je instinct je?","Tid for domsavsigelse. Nå som vi har to stykker, bør vi kanskje dra tilbake til basen. Hva sier instinktet ditt?","Czas na osąd. Teraz, kiedy mamy dwa kawałki, możemy chcieć wrócić do bazy. Co mówi ci twój instynkt?","Hora do julgamento. Agora que temos duas peças, talvez a gente queira voltar pra base. O que o seu instinto diz?",,Timpul să judecăm. Acum că avem două piese ne putem întoarce la bază. Ce-ți zice instinctul?,"Время решать. Теперь, когда у нас есть две части, мы можем вернуться на базу. Что твоя интуиция подсказывает тебе?",,Det är dags att döma. Nu när vi har två delar kanske vi borde återvända till basen. Vad säger din instinkt dig?,Karar verme zamanı. Elimizde iki parça olduğuna göre üsse dönmek isteyebiliriz. İçgüdülerin sana ne söylüyor? +"I have a report that the spectral energy we found near the Bishop is also present by the Oracle, let's be careful.",TXT_SUB_LOG76,MAP11: After killing the Bishop and going to MAP12's entrance,,,"Mám hlášení, že stejná přízračná energie, kterou jsme našli u Biskupa, se nachází také u Věštce. Měli bychom být opatrní.","Jeg har en rapport om, at den spektrale energi, vi fandt i nærheden af biskoppen, også er til stede ved oraklet, så lad os være forsigtige.","Ich habe einen Report, dass die spektrale Energie, die wir beim Bischof gefunden haben, auch beim Orakel präsent ist. Sei vorsichtig.",,,"Tengo un informe de que la energía espectral que encontramos cerca del Obispo también está presente junto al Oráculo, vayamos con cuidado",,"Sain tiedon, että aave-energiaa, jota löysimme Piispan läheltä, on läsnä myös Oraakkelin luona. Ollaan varovaisia.",J'ai un rapport que l'énergie spectrale que l'on a trouvé près de l'évèque est aussi près de l'Oracle. Faisons attention.,,Egy beszámoló szerint az Orákulum körülötti lelki színkép megegyezik a Püspökével. Legyünk tehát óvatosak.,"Ho qua un rapporto che ci informa che l'energia spettrale che abbiamo trovato vicino il Vescovo è anche presente vicino l'Oracolo, dobbiamo essere attenti.","ビショップにもあったスペクトラルエネルギーがオラクルにも宿っているという 報告があるわ、気を付けて。","지금 보고를 받았는데, 비숍을 죽인 뒤에 나온 혼령의 기운이 오라클에게도 있데. 조심하자.","Ik heb een verslag dat de spectrale energie die we in de buurt van de bisschop vonden ook aanwezig is bij het Orakel, laten we voorzichtig zijn.","Jeg har en rapport om at den spektrale energien vi fant nær biskopen også er til stede ved oraklet, la oss være forsiktige.","Mam raport, że energia widmowa, którą znaleźliśmy przy Bishopie, jest również obecna przy Wyroczni. Bądźmy ostrożni.",Tenho relatos de que a energia espectral que encontramos perto do Bispo também está presente pelo Oráculo. Vamos com cuidado.,,"Am un raport care spune că energia spectrală a Episcopului e aceeași de pe Oracol, să fim atenți.","Мне доложили, что от Оракула исходит та же энергия, что и от того фантома, которого мы видели у Епископа. Будь начеку!",,"Jag har en rapport om att den spektrala energin som vi hittade nära biskopen också finns hos oraklet, vi måste vara försiktiga.","Piskopos'un yanında bulduğumuz spektral enerjinin Kahin'de de olduğuna dair bir rapor aldım, dikkatli olalım." -Macil? Part of this mess? I don't know what to think. I hope you make the right decision.,TXT_SUB_LOG77,,,,"Macil? Částí tohohle bordelu? Nevím, co si o tom mám myslet. Doufám, že se rozhodneš správně.","Macil? En del af dette rod? Jeg ved ikke, hvad jeg skal tro. Jeg håber, du træffer den rigtige beslutning.","Macil? Ein Teil dieser Schweinerei? Ich weiß nicht, was ich denken soll. Hoffentlich triffst du die richtige Entscheidung.",,,¿Macil? ¿Parte de este lío? No sé que pensar. Espero que tomes la decisión correcta.,,"Macil osa tätä sotkua? En tiedä, mitä ajatella. Toivon, että teet oikean päätöksen.","Macil fait partie de tout ce bordel? Je ne sais pas quoi penser, j'espère que tu feras le bon choix..",Macil? Benne lenne ebben a zűrzavarban? nem tudom mit higgyek. Remélem a jó döntést fogod hozni.,Macil? Parte di questa follia? Non so cosa pensare. Spero farai la decisione giusta.,,마실? 이 문제의 장본인 중 한 명이라고? 정말이지 모르겠어. 부디 현명한 판단을 내리길 바래.,Macil? Een deel van deze puinhoop? Ik weet niet wat ik moet denken. Ik hoop dat je de juiste beslissing neemt.,Macil? En del av dette rotet? Jeg vet ikke hva jeg skal tro. Jeg håper du tar den rette avgjørelsen.,"Macil? Część tego bałaganu? Nie wiem, co myśleć. Mam nadzieję, że podejmiesz właściwą decyzję.",O Macil? Fazendo parte dessa confusão toda? Eu não sei o que pensar. Espero que você tome a decisão certa.,,Macil? Parte la dezastrul ăsta? Nu știu ce să cred. Sper să iei decizia bună.,"Мэйсил? Замешан в этом дерьме? Я даже не знаю, что и думать. Я надеюсь, ты сделаешь правильный выбор.",,Macil? En del av den här röran? Jag vet inte vad jag ska tro. Jag hoppas att du fattar rätt beslut.,Macil mi? Bu karmaşanın bir parçası mı? Ne düşüneceğimi bilmiyorum. Umarım doğru kararı verirsiniz. -"Do I trust Macil, who has risked his life for the Front, or some ugly spook? I don't know. But you I trust.",TXT_SUB_LOG78,,,,"Mám věřit Macilovi, který riskoval svůj život kvůli Frontě, nebo nějakému ošklivovi? Já nevím. Ale tobě věřím.","Skal jeg stole på Macil, som har risikeret sit liv for fronten, eller på en grim spøgelse? Jeg ved det ikke. Men jeg stoler på dig.","Ob ich Macil vertraue, der sein Leben für die Front riskiert hat, oder einer hässlichen Schreckgestalt? Ich weiß nicht - aber dir vertraue ich. ",,,"¿Confío en Macil, que ha arriesgado su vida por el Frente, o en un espectro feo? No lo sé. Pero en ti sí confío.",,"Luotanko Maciliin, joka on antanut henkensä alttiiksi Rintamalle, vai johonkin rumaan kummitukseen? En tiedä. Mutta sinuun minä luotan.","Et ce que je fais confiance à Macil qui a risqué sa vie pour le Front, où un affreux jojo? J'en sais rien, mais je fais confiance à toi.","Macilnak hiszek aki kockára tette az életét a Frontért, vagy egy semmirekellőnek? Nem is tudom...de neked biztosan hiszek.","Di chi mi posso fidare, di Macil, che ha rischiato la vita per il Fronte, o di questo essere spettrale? Non lo so. Ma di te mi fido.",,"마실은 프론트를 위해 싸워온 사람이라 의심할 수가 없어. 저 못난이가 거짓말을 하는 걸까? 모르지만, 난 너 만을 믿어.","Vertrouw ik Macil, die zijn leven heeft geriskeerd voor het Front, of een lelijke spook? Ik weet het niet. Maar jij vertrouw ik.","Stoler jeg på Macil, som har risikert livet for Fronten, eller et stygt spøkelse? Jeg vet ikke. Men deg stoler jeg på.","Czy ufać Macilowi, który ryzykował życie dla Frontu, czy jakiemuś brzydkiemu upiorowi? Nie wiem. Ale tobie ufam.","Se eu confio no Macil, que arriscou a sua vida pela Frente, ou num fantasma horroroso? Eu não sei, mas eu você eu confio.",,"Dacă îl cred pe Macil, care și-a riscat viața pentru Front, sau un tip în armură? Nu știu. Dar în tine, cred.","Кому верить: Мэйсилу, который не щадил своей жизни ради Сопротивления, или какому-то уродливому пугалу? Не знаю. Но я доверяю тебе. ",,"Ska jag lita på Macil, som har riskerat sitt liv för fronten, eller på något fult spöke? Jag vet inte. Men dig litar jag på.","Cephe için hayatını riske atan Macil'e mi güveneyim, yoksa çirkin bir hortlağa mı? Bilmiyorum. Ama sana güveniyorum." -Richter has taken over command of our forces. It looks like Macil has been deceiving us all along. His true allegiance was to the Order. What a snake.,TXT_SUB_LOG79,MAP10: After killing Macil (Spectre) without having destroyed the converter in MAP24.,,,"Richter převzal velení našich sil. Zdá se, že nás Macil celou dobu klamal. Ve skutečnosti byl věrný Řádu. Slizák jeden.","Richter har overtaget kommandoen over vores styrker. Det ser ud til, at Macil har bedraget os hele tiden. Hans sande loyalitet var over for Ordenen. Sikke en slange.","Richter hat das Kommando über unsere Truppen übernommen. Es sieh aus, als ob Macil uns alle hintergangen hat und die ganze Zeit für den Orden arbeitete. Was für eine Ratte.",,,Richter ha tomado el mando de nuestras fuerzas. Parece que Macil nos ha estado engañando todo este tiempo. Su verdadera lealtad era a la Orden. Menuda víbora.,,"Richter on ottanut joukkomme komentoonsa. Näyttää siltä, että Macil on pettänyt meitä alusta alkaen. Hänen todellinen uskollisuutensa on ollut Veljeskunnalle; mikä käärme.","Richter à pris le contrôle de nos forces. Il semble que Macil nous a trompé tout ce temps. Sa vraie allégiance appartenait à l'Ordre, quel ordure..",Richter átvette az irányítást az egységeink felett. Úgy néz ki Macil mindvégig átvert minket. Igazából a Rend embere volt. Micsoda álnok kígyó.,Richter ha assunto il comando delle nostre forze. Sembra che Macil ci avesse ingannato fin dall'inizio. In realtà è sempre stato alleato con l'Ordine. Che serpente.,"リヒターが指揮官の任を引き継いだ。マシルはずっと私達を騙していたなんて。 +Macil? Part of this mess? I don't know what to think. I hope you make the right decision.,TXT_SUB_LOG77,,,,"Macil? Částí tohohle bordelu? Nevím, co si o tom mám myslet. Doufám, že se rozhodneš správně.","Macil? En del af dette rod? Jeg ved ikke, hvad jeg skal tro. Jeg håber, du træffer den rigtige beslutning.","Macil? Ein Teil dieser Schweinerei? Ich weiß nicht, was ich denken soll. Hoffentlich triffst du die richtige Entscheidung.",,,¿Macil? ¿Parte de este lío? No sé que pensar. Espero que tomes la decisión correcta.,,"Macil osa tätä sotkua? En tiedä, mitä ajatella. Toivon, että teet oikean päätöksen.","Macil fait partie de tout ce bordel? Je ne sais pas quoi penser, j'espère que tu feras le bon choix..",,Macil? Benne lenne ebben a zűrzavarban? nem tudom mit higgyek. Remélem a jó döntést fogod hozni.,Macil? Parte di questa follia? Non so cosa pensare. Spero farai la decisione giusta.,,마실? 이 문제의 장본인 중 한 명이라고? 정말이지 모르겠어. 부디 현명한 판단을 내리길 바래.,Macil? Een deel van deze puinhoop? Ik weet niet wat ik moet denken. Ik hoop dat je de juiste beslissing neemt.,Macil? En del av dette rotet? Jeg vet ikke hva jeg skal tro. Jeg håper du tar den rette avgjørelsen.,"Macil? Część tego bałaganu? Nie wiem, co myśleć. Mam nadzieję, że podejmiesz właściwą decyzję.",O Macil? Fazendo parte dessa confusão toda? Eu não sei o que pensar. Espero que você tome a decisão certa.,,Macil? Parte la dezastrul ăsta? Nu știu ce să cred. Sper să iei decizia bună.,"Мэйсил? Замешан в этом дерьме? Я даже не знаю, что и думать. Я надеюсь, ты сделаешь правильный выбор.",,Macil? En del av den här röran? Jag vet inte vad jag ska tro. Jag hoppas att du fattar rätt beslut.,Macil mi? Bu karmaşanın bir parçası mı? Ne düşüneceğimi bilmiyorum. Umarım doğru kararı verirsiniz. +"Do I trust Macil, who has risked his life for the Front, or some ugly spook? I don't know. But you I trust.",TXT_SUB_LOG78,,,,"Mám věřit Macilovi, který riskoval svůj život kvůli Frontě, nebo nějakému ošklivovi? Já nevím. Ale tobě věřím.","Skal jeg stole på Macil, som har risikeret sit liv for fronten, eller på en grim spøgelse? Jeg ved det ikke. Men jeg stoler på dig.","Ob ich Macil vertraue, der sein Leben für die Front riskiert hat, oder einer hässlichen Schreckgestalt? Ich weiß nicht - aber dir vertraue ich. ",,,"¿Confío en Macil, que ha arriesgado su vida por el Frente, o en un espectro feo? No lo sé. Pero en ti sí confío.",,"Luotanko Maciliin, joka on antanut henkensä alttiiksi Rintamalle, vai johonkin rumaan kummitukseen? En tiedä. Mutta sinuun minä luotan.","Et ce que je fais confiance à Macil qui a risqué sa vie pour le Front, où un affreux jojo? J'en sais rien, mais je fais confiance à toi.",,"Macilnak hiszek aki kockára tette az életét a Frontért, vagy egy semmirekellőnek? Nem is tudom...de neked biztosan hiszek.","Di chi mi posso fidare, di Macil, che ha rischiato la vita per il Fronte, o di questo essere spettrale? Non lo so. Ma di te mi fido.",,"마실은 프론트를 위해 싸워온 사람이라 의심할 수가 없어. 저 못난이가 거짓말을 하는 걸까? 모르지만, 난 너 만을 믿어.","Vertrouw ik Macil, die zijn leven heeft geriskeerd voor het Front, of een lelijke spook? Ik weet het niet. Maar jij vertrouw ik.","Stoler jeg på Macil, som har risikert livet for Fronten, eller et stygt spøkelse? Jeg vet ikke. Men deg stoler jeg på.","Czy ufać Macilowi, który ryzykował życie dla Frontu, czy jakiemuś brzydkiemu upiorowi? Nie wiem. Ale tobie ufam.","Se eu confio no Macil, que arriscou a sua vida pela Frente, ou num fantasma horroroso? Eu não sei, mas eu você eu confio.",,"Dacă îl cred pe Macil, care și-a riscat viața pentru Front, sau un tip în armură? Nu știu. Dar în tine, cred.","Кому верить: Мэйсилу, который не щадил своей жизни ради Сопротивления, или какому-то уродливому пугалу? Не знаю. Но я доверяю тебе. ",,"Ska jag lita på Macil, som har riskerat sitt liv för fronten, eller på något fult spöke? Jag vet inte. Men dig litar jag på.","Cephe için hayatını riske atan Macil'e mi güveneyim, yoksa çirkin bir hortlağa mı? Bilmiyorum. Ama sana güveniyorum." +Richter has taken over command of our forces. It looks like Macil has been deceiving us all along. His true allegiance was to the Order. What a snake.,TXT_SUB_LOG79,MAP10: After killing Macil (Spectre) without having destroyed the converter in MAP24.,,,"Richter převzal velení našich sil. Zdá se, že nás Macil celou dobu klamal. Ve skutečnosti byl věrný Řádu. Slizák jeden.","Richter har overtaget kommandoen over vores styrker. Det ser ud til, at Macil har bedraget os hele tiden. Hans sande loyalitet var over for Ordenen. Sikke en slange.","Richter hat das Kommando über unsere Truppen übernommen. Es sieh aus, als ob Macil uns alle hintergangen hat und die ganze Zeit für den Orden arbeitete. Was für eine Ratte.",,,Richter ha tomado el mando de nuestras fuerzas. Parece que Macil nos ha estado engañando todo este tiempo. Su verdadera lealtad era a la Orden. Menuda víbora.,,"Richter on ottanut joukkomme komentoonsa. Näyttää siltä, että Macil on pettänyt meitä alusta alkaen. Hänen todellinen uskollisuutensa on ollut Veljeskunnalle; mikä käärme.","Richter à pris le contrôle de nos forces. Il semble que Macil nous a trompé tout ce temps. Sa vraie allégiance appartenait à l'Ordre, quel ordure..",,Richter átvette az irányítást az egységeink felett. Úgy néz ki Macil mindvégig átvert minket. Igazából a Rend embere volt. Micsoda álnok kígyó.,Richter ha assunto il comando delle nostre forze. Sembra che Macil ci avesse ingannato fin dall'inizio. In realtà è sempre stato alleato con l'Ordine. Che serpente.,"リヒターが指揮官の任を引き継いだ。マシルはずっと私達を騙していたなんて。 あの人がオーダーに真の忠誠を誓っていたなんて、とんだ蛇神憑きだわ。",릭터가 저항군의 새로운 지도자가 될 거야. 내 생각엔 마실이 오랫동안 우리들을 속인 것 같아... 뱀 같은 자식.,Richter heeft het bevel over onze troepen overgenomen. Het lijkt erop dat Macil ons de hele tijd heeft bedrogen. Zijn ware trouw was aan de Orde. Wat een slang.,Richter har overtatt kommandoen over styrkene våre. Det ser ut til at Macil har lurt oss hele tiden. Hans sanne lojalitet var til Ordenen. For en slange.,"Richter przejął dowodzenie nad naszymi siłami. Wygląda na to, że Macil cały czas nas zwodził. Jego prawdziwa wierność była dla Zakonu. Co za wąż.",O Richter assumiu o comando de nossas forças. Parece que o Macil nos enganou esse tempo todo. Sua verdadeira lealdade era à Ordem. Que traíra!,,Richter a preluat controlul asupra forțelor noastre. Se pare că Macil ne-a înșelat în tot acest timp. Aderărata lui loialitate era față de Ordin. Ce șarpe.,"Рихтер принял на себя командование нашими силами. Похоже, что Мэйсил обманывал всех нас с самого начала. На самом деле он был предан Ордену. Подлец.",,Richter har tagit över befälet över våra styrkor. Det verkar som om Macil har lurat oss hela tiden. Hans sanna lojalitet var till Orden. Vilken orm.,Richter kuvvetlerimizin komutasını devraldı. Görünüşe göre Macil başından beri bizi kandırıyormuş. Onun gerçek bağlılığı Tarikat'a imiş. Ne yılan ama. -Damned impressing entranceway. But what we are searching for is on another level. Head down.,TXT_SUB_LOG80,MAP26: Entrance.,,,"Zatraceně působivý vchod. Ale to, co hledáme, je na jiném patře. Jdi dolů.","Forbandede imponerende indgang. Men det, vi leder efter, er på et andet niveau. Hovedet nedad.",Verdammt eindrucksvoller Eingang. Aber was wir suchen ist woanders. Lass uns runtergehen.,,,Una entrada tremendamente impresionante. Pero lo que buscamos está en otro nivel. Ve abajo.,,Pahuksen vaikuttava sisäänkäynti. Mutta etsimämme on eri kerroksessa. Suuntaa alas.,"Une entrée sérieusement impressionante. Ce que l'on cherche est à un autre étage, descends.","Elég menő bejárat. Azonban másik emeleten van, amit keresünk. Irány lefelé.",Come ingresso è davvero notevole. Ma quello che cerchiamo si trova su un altro piano. Vai giù.,威風堂々とした玄関ね。でも私達が調べるのは別の階よ。慎重にね。,또 전형적인 멋진 입구네. 하지만 우리가 찾는 것은 또 다른 구역에 있어. 밑으로 향해.,Vervloekt indrukwekkende toegangsweg. Maar wat we zoeken is op een ander niveau. Hoofd naar beneden.,Imponerende inngangsparti. Men det vi leter etter er på et annet nivå. Ned med hodet.,"Cholernie imponujące wejście. Ale to, czego szukamy, jest na innym poziomie. Głowa w dół.",Que entrada bem impressionante. Mas o que procuramos está em outro nível. Desça.,,Impresionantă intrare. Dar ceea ce căutăm e la alt nivel. Mergi jos.,Этот чёртов фасад впечатляет! Но нам нужно на другой этаж. Не высовывайся!,,Jävligt imponerande entré. Men det vi söker är på en annan nivå. Huvudet neråt.,Etkileyici bir giriş yolu. Ama aradığımız şey başka bir seviyede. Baş aşağı. -What a shame. Our technology is being wasted on torture instead of life.,TXT_SUB_LOG81,MAP24: Hall to converter room.,,,Taková škoda. Naše technologie je plýtvána na mučení místo života.,Sikke en skam. Vores teknologi bliver spildt på tortur i stedet for liv.,Was für eine Schande. Unsere Technologie wird für Folter anstatt für Leben verschwendet.,,,Que pena. Nuestra tecnología se está desperdiciando en tortura en vez de vida.,,"Mikä häpeä: Teknologiaamme tuhlataan kidutukseen, sen sijaan että parantaisimme elämää.","C'est tellement dommage. Notre technologie est gâchée, utilisée pour la torture plutôt que sauver des vies.",Milyen kár. A technológiánkat kínzásra pazarolják az élet helyett.,Che peccato. La nostra tecnologia viene sprecata per la tortura invece che per la vita.,残念だな。我々の技術が拷問の為だけに浪費されるとは。,비극적이야. 우리 기술이 생명을 살리는 데 쓰이기는 커녕 고문하는 데 쓰이고 있잖아.,Wat jammer. Onze technologie wordt verspild aan marteling in plaats van leven.,For en skam. Teknologien vår kastes bort på tortur i stedet for liv.,Co za wstyd. Nasza technologia jest marnowana na tortury zamiast na życie.,É uma pena. Nossa tecnologia sendo desperdiçada com tortura ao invés de salvar vidas.,,Ce rușine. Tehnologia noastră e risipită pentru tortură în loc de a crea viață.,"Какой кошмар. Наша технология используется для пыток, а не для жизни.",,Vilken skam. Vår teknik slösas bort på tortyr i stället för liv.,Ne utanç verici. Teknolojimiz yaşam yerine işkence için harcanıyor. -"Being vain as hell, they mark their temples with big banners.",TXT_SUB_LOG82,MAP21: Entrance to MAP26 near to an Inquisitor's banner.,,,"S takovou ješitností není divu, že si své chrámy značí velkými prapory.","Fordi de er forfængelige som helvede, markerer de deres templer med store bannere.","Eitel wie sie sind, markieren sie ihre Tempel mit riesigen Bannern.",,,"Siendo tan malditamente engreídos, marcan sus templos con grandes estandartes.",,"Läpeensä turhamaisia kun ovat, he vuoraavat temppelinsä suurin tunnuslipuin.","Avec leur orgeuil à la noix, je me ne doutais pas un instant qu'ils allaient mettre d'énormes bannières partout.","Miután felettébb hiúk, ezért hatalmas zászlókkal díszítik a templomaikat.","Essendo vanitosi come pochi, marchiano i loro templi con degli stemmi.",うぬぼれが酷いな、あいつらの寺院はデカいバナーが目に付く。,"고통을 더하자면, 자기네 신전에 커다란 기를 세웠어.","Tevergeefs als de hel, markeren ze hun tempels met grote spandoeken.","Forfengelige som faen, markerer de templene sine med store bannere.","Próżni jak diabli, oznaczają swoje świątynie wielkimi transparentami.",Esses caras são vaidosos pra caramba. Eles marcam os seus templos com esses grandes estandartes.,,"Vanitate la maxim, își marchează templele cu steaguri imense.","Они спесивы до ужаса, раз украшают свои храмы большими флагами.",,Eftersom de är fåfänga som fan markerar de sina tempel med stora banderoller.,"Cehennem kadar kibirli oldukları için, tapınaklarını büyük pankartlarla işaretliyorlar." -Another Sigil piece. We are one step closer to freedom. And you are one step closer to me.,TXT_SUB_LOG83,MAP27: After killing the Loremaster with either Macil or the Oracle alive.,,,Další díl Pečeti. Jsme o krok blíž ke svobodě. A ty jsi o krok blíž ke mě.,Endnu et Sigil-stykke. Vi er et skridt nærmere friheden. Og du er et skridt tættere på mig.,Noch ein Sigil-Teil. Wir sind der Freiheit einen Schritt näher. Und du bist mir einen Schritt näher.,,,Otra pieza del emblema. Estamos un paso más cerca de la libertad. Y tú un paso más cerca de mí.,,Jälleen uusi Sinetin osanen. Olemme taas askeleen lähempänä vapautta. Ja sinä askeleen lähempänä minua.,"Encore une pièce du Sigil. Un pas de plus vers la liberté, et un pas de plus vers moi.",Egy másik pecsét darab. Egy lépéssel közelebb vagyunk a szabadsághoz. Te pedig egy lépéssel közelebb hozzám.,Un altro pezzo del Sigillo. Siamo ancora più vicini alla libertà. E tu sei ancora più vicino a me.,"更なるシジルの欠片だ。私達の自由にまた一歩近づいたわ。 +Damned impressing entranceway. But what we are searching for is on another level. Head down.,TXT_SUB_LOG80,MAP26: Entrance.,,,"Zatraceně působivý vchod. Ale to, co hledáme, je na jiném patře. Jdi dolů.","Forbandede imponerende indgang. Men det, vi leder efter, er på et andet niveau. Hovedet nedad.",Verdammt eindrucksvoller Eingang. Aber was wir suchen ist woanders. Lass uns runtergehen.,,,Una entrada tremendamente impresionante. Pero lo que buscamos está en otro nivel. Ve abajo.,,Pahuksen vaikuttava sisäänkäynti. Mutta etsimämme on eri kerroksessa. Suuntaa alas.,"Une entrée sérieusement impressionante. Ce que l'on cherche est à un autre étage, descends.",,"Elég menő bejárat. Azonban másik emeleten van, amit keresünk. Irány lefelé.",Come ingresso è davvero notevole. Ma quello che cerchiamo si trova su un altro piano. Vai giù.,威風堂々とした玄関ね。でも私達が調べるのは別の階よ。慎重にね。,또 전형적인 멋진 입구네. 하지만 우리가 찾는 것은 또 다른 구역에 있어. 밑으로 향해.,Vervloekt indrukwekkende toegangsweg. Maar wat we zoeken is op een ander niveau. Hoofd naar beneden.,Imponerende inngangsparti. Men det vi leter etter er på et annet nivå. Ned med hodet.,"Cholernie imponujące wejście. Ale to, czego szukamy, jest na innym poziomie. Głowa w dół.",Que entrada bem impressionante. Mas o que procuramos está em outro nível. Desça.,,Impresionantă intrare. Dar ceea ce căutăm e la alt nivel. Mergi jos.,Этот чёртов фасад впечатляет! Но нам нужно на другой этаж. Не высовывайся!,,Jävligt imponerande entré. Men det vi söker är på en annan nivå. Huvudet neråt.,Etkileyici bir giriş yolu. Ama aradığımız şey başka bir seviyede. Baş aşağı. +What a shame. Our technology is being wasted on torture instead of life.,TXT_SUB_LOG81,MAP24: Hall to converter room.,,,Taková škoda. Naše technologie je plýtvána na mučení místo života.,Sikke en skam. Vores teknologi bliver spildt på tortur i stedet for liv.,Was für eine Schande. Unsere Technologie wird für Folter anstatt für Leben verschwendet.,,,Que pena. Nuestra tecnología se está desperdiciando en tortura en vez de vida.,,"Mikä häpeä: Teknologiaamme tuhlataan kidutukseen, sen sijaan että parantaisimme elämää.","C'est tellement dommage. Notre technologie est gâchée, utilisée pour la torture plutôt que sauver des vies.",,Milyen kár. A technológiánkat kínzásra pazarolják az élet helyett.,Che peccato. La nostra tecnologia viene sprecata per la tortura invece che per la vita.,残念だな。我々の技術が拷問の為だけに浪費されるとは。,비극적이야. 우리 기술이 생명을 살리는 데 쓰이기는 커녕 고문하는 데 쓰이고 있잖아.,Wat jammer. Onze technologie wordt verspild aan marteling in plaats van leven.,For en skam. Teknologien vår kastes bort på tortur i stedet for liv.,Co za wstyd. Nasza technologia jest marnowana na tortury zamiast na życie.,É uma pena. Nossa tecnologia sendo desperdiçada com tortura ao invés de salvar vidas.,,Ce rușine. Tehnologia noastră e risipită pentru tortură în loc de a crea viață.,"Какой кошмар. Наша технология используется для пыток, а не для жизни.",,Vilken skam. Vår teknik slösas bort på tortyr i stället för liv.,Ne utanç verici. Teknolojimiz yaşam yerine işkence için harcanıyor. +"Being vain as hell, they mark their temples with big banners.",TXT_SUB_LOG82,MAP21: Entrance to MAP26 near to an Inquisitor's banner.,,,"S takovou ješitností není divu, že si své chrámy značí velkými prapory.","Fordi de er forfængelige som helvede, markerer de deres templer med store bannere.","Eitel wie sie sind, markieren sie ihre Tempel mit riesigen Bannern.",,,"Siendo tan malditamente engreídos, marcan sus templos con grandes estandartes.",,"Läpeensä turhamaisia kun ovat, he vuoraavat temppelinsä suurin tunnuslipuin.","Avec leur orgeuil à la noix, je me ne doutais pas un instant qu'ils allaient mettre d'énormes bannières partout.",,"Miután felettébb hiúk, ezért hatalmas zászlókkal díszítik a templomaikat.","Essendo vanitosi come pochi, marchiano i loro templi con degli stemmi.",うぬぼれが酷いな、あいつらの寺院はデカいバナーが目に付く。,"고통을 더하자면, 자기네 신전에 커다란 기를 세웠어.","Tevergeefs als de hel, markeren ze hun tempels met grote spandoeken.","Forfengelige som faen, markerer de templene sine med store bannere.","Próżni jak diabli, oznaczają swoje świątynie wielkimi transparentami.",Esses caras são vaidosos pra caramba. Eles marcam os seus templos com esses grandes estandartes.,,"Vanitate la maxim, își marchează templele cu steaguri imense.","Они спесивы до ужаса, раз украшают свои храмы большими флагами.",,Eftersom de är fåfänga som fan markerar de sina tempel med stora banderoller.,"Cehennem kadar kibirli oldukları için, tapınaklarını büyük pankartlarla işaretliyorlar." +Another Sigil piece. We are one step closer to freedom. And you are one step closer to me.,TXT_SUB_LOG83,MAP27: After killing the Loremaster with either Macil or the Oracle alive.,,,Další díl Pečeti. Jsme o krok blíž ke svobodě. A ty jsi o krok blíž ke mě.,Endnu et Sigil-stykke. Vi er et skridt nærmere friheden. Og du er et skridt tættere på mig.,Noch ein Sigil-Teil. Wir sind der Freiheit einen Schritt näher. Und du bist mir einen Schritt näher.,,,Otra pieza del emblema. Estamos un paso más cerca de la libertad. Y tú un paso más cerca de mí.,,Jälleen uusi Sinetin osanen. Olemme taas askeleen lähempänä vapautta. Ja sinä askeleen lähempänä minua.,"Encore une pièce du Sigil. Un pas de plus vers la liberté, et un pas de plus vers moi.",,Egy másik pecsét darab. Egy lépéssel közelebb vagyunk a szabadsághoz. Te pedig egy lépéssel közelebb hozzám.,Un altro pezzo del Sigillo. Siamo ancora più vicini alla libertà. E tu sei ancora più vicino a me.,"更なるシジルの欠片だ。私達の自由にまた一歩近づいたわ。 そして私にも一歩近づいている。",또 다른 시질 조각이야. 자유를 향한 길이 거의 얼마 안 남았어. 나와 만나는 길도 얼마 안 남았고.,Nog een Sigil stuk. We zijn een stap dichter bij de vrijheid. En jij bent een stap dichter bij mij.,Enda en Sigil-brikke. Vi er ett skritt nærmere friheten. Og du er ett skritt nærmere meg.,Kolejny kawałek Sigil. Jesteśmy o krok bliżej wolności. A ty jesteś o krok bliżej mnie.,Mais uma peça do Sigilo. Estamos cada vez mais próximos da liberdade. E você cada vez mais próximo de mim.,,Altă piesă de Sigiul. Suntem cu un pas mai aproape de libertate. Și tu ești cu un pas mai aproape de mine.,Очередной фрагмент Печати. Теперь мы ещё на шаг ближе к освобождению. А ты — ещё на шаг ближе ко мне.,,Ännu ett Sigil-stycke. Vi är ett steg närmare friheten. Och du är ett steg närmare mig.,Başka bir Sigil parçası. Özgürlüğe bir adım daha yaklaştık. Ve sen de bana bir adım daha yaklaştın. -"From the looks of it, we need the full Sigil to unlock this puppy. Something tells me this is the end of the rainbow.",TXT_SUB_LOG84,MAP27: Button to MAP28.,,,"Vypadá to, že tohohle mazlíčka jde otevřít pouze s úplnou Pečetí. Něco mi říká, že jsme našli konec duhy.","Som det ser ud nu, skal vi bruge hele Sigil'en for at låse denne hvalp op. Noget siger mig, at dette er enden af regnbuen.","Wie es aussieht brauchen wir das komplette Sigil um das Ding hier zu öffnen. Etwas sagt mir, dass wir am Ende unserer Reise angekommen sind.",,,Parece que necesitamos el Emblema completo para abrir este pequeñín. Algo me dice que este es el final del arcoiris.,,"Näyttää siltä, että tarvitsemme täyden Sinetin tämän veijarin avaamiseksi. Jotenkin tuntuu siltä, että sateenkaari päätyy tänne.",On dirait qu'il nous faut toutes les pièces du Sigil pour ouvrir ce joujou. Quelque chose me dit que c'est là que l'arc-en-ciel finit.,"Úgy néz ki az egész pecsét kell, hogy bejussunk itt. Azt sugallja nekem, hogy ez lesz valószínűleg a végkifejlett.","Da quel che sembra, abbiamo bisogno del Sigillo intero per accedere qua. Qualcosa mi dice che siamo alla fine del tunnel.","この形状を見た所、解除するには完成したシジルを持って、ちっこい台座に乗るんだわ。 +"From the looks of it, we need the full Sigil to unlock this puppy. Something tells me this is the end of the rainbow.",TXT_SUB_LOG84,MAP27: Button to MAP28.,,,"Vypadá to, že tohohle mazlíčka jde otevřít pouze s úplnou Pečetí. Něco mi říká, že jsme našli konec duhy.","Som det ser ud nu, skal vi bruge hele Sigil'en for at låse denne hvalp op. Noget siger mig, at dette er enden af regnbuen.","Wie es aussieht brauchen wir das komplette Sigil um das Ding hier zu öffnen. Etwas sagt mir, dass wir am Ende unserer Reise angekommen sind.",,,Parece que necesitamos el Emblema completo para abrir este pequeñín. Algo me dice que este es el final del arcoiris.,,"Näyttää siltä, että tarvitsemme täyden Sinetin tämän veijarin avaamiseksi. Jotenkin tuntuu siltä, että sateenkaari päätyy tänne.",On dirait qu'il nous faut toutes les pièces du Sigil pour ouvrir ce joujou. Quelque chose me dit que c'est là que l'arc-en-ciel finit.,,"Úgy néz ki az egész pecsét kell, hogy bejussunk itt. Azt sugallja nekem, hogy ez lesz valószínűleg a végkifejlett.","Da quel che sembra, abbiamo bisogno del Sigillo intero per accedere qua. Qualcosa mi dice che siamo alla fine del tunnel.","この形状を見た所、解除するには完成したシジルを持って、ちっこい台座に乗るんだわ。 誰もが雨上がりの虹を見るために。","열쇠 구멍의 모습을 보아하니, 완성된 시질이 있어야만 열 수 있는 것 같아. 이 모든 모험의 도착지점인 것 같기도 하고.","Zoals het er nu uitziet, hebben we de volledige Sigil nodig om deze pup te ontgrendelen. Iets zegt me dat dit het einde van de regenboog is.",Det ser ut til at vi trenger hele sigillet for å låse opp denne valpen. Noe sier meg at dette er enden på regnbuen.,"Wygląda na to, że potrzebujemy pełnego Sigilu, aby odblokować tego szczeniaka. Coś mi mówi, że to koniec tęczy.","Pelo que parece, precisamos do Sigilo completo para destrancar essa belezinha. Algo me diz que este é o fim do arco-íris.",,"Din câte se pare, aven nevoie de întreg Sigiliul pentru a deschide puiul. Ceva îmi spune că ăsta e capătul curcubeului.","Судя по всему, открыть этот замок сможет только завершённая Печать. Что-то мне подсказывает, что мы достигли конца радуги!",,Som det ser ut nu behöver vi hela Sigil för att låsa upp den här valpen. Något säger mig att det här är slutet på regnbågen.,"Görünüşe göre, bu yavruyu açmak için Sigil'in tamamına ihtiyacımız var. İçimden bir ses bunun gökkuşağının sonu olduğunu söylüyor." You wield the power of the complete Sigil. What do you say we go get some closure.,TXT_SUB_LOG85,"STRIFE1.WAD: MAP12 @@ -12744,53 +12744,53 @@ OR MAP27 -(After defeating the Loremaster and collecting the final Sigil piece with Macil and the Oracle dead)",,,"Vládneš mocí složené Pečetě. Co říkáš na to, završit to tady?","Du har magten af det komplette sigil. Hvad siger du til, at vi får en afslutning?","Du hast die Macht des kompletten Sigils. Was hälst du davon, wenn wir das hier beenden?",,,Empuñas el poder del Emblema completo. Que te parece si conseguimos algo de clausura.,,Täyden Sinetin voima on hallussasi. Mitäpä jos hakisimme päätöstä. ,Tu possède le pouvoir du Sigil complet. Ca te dit qu'on aille finir tout ça?,"Tied a Pecsét teljes ereje. Mit szólnál ahhoz, ha rövidre zárnánk a dolgokat.",Hai il potere del Sigillo completo. Che ne dici di mettere fine a questa faccenda.,"貴方はもはや完全なシジルの力を行使できるわけね。 +(After defeating the Loremaster and collecting the final Sigil piece with Macil and the Oracle dead)",,,"Vládneš mocí složené Pečetě. Co říkáš na to, završit to tady?","Du har magten af det komplette sigil. Hvad siger du til, at vi får en afslutning?","Du hast die Macht des kompletten Sigils. Was hälst du davon, wenn wir das hier beenden?",,,Empuñas el poder del Emblema completo. Que te parece si conseguimos algo de clausura.,,Täyden Sinetin voima on hallussasi. Mitäpä jos hakisimme päätöstä. ,Tu possède le pouvoir du Sigil complet. Ca te dit qu'on aille finir tout ça?,,"Tied a Pecsét teljes ereje. Mit szólnál ahhoz, ha rövidre zárnánk a dolgokat.",Hai il potere del Sigillo completo. Che ne dici di mettere fine a questa faccenda.,"貴方はもはや完全なシジルの力を行使できるわけね。 後は言いがかりでもしてここを閉鎖させましょう。 ",시질의 완전한 힘은 이제 네 손에 있어. 종지부를 찍을 준비 됐어?,Je gebruikt de kracht van de hele Sigil. Wat zeg je ervan als we de zaak gaan afsluiten.,"Du har kraften til hele sigillet, og du kan bruke det. Hva sier du til å få en avslutning?","Władasz mocą kompletnego Sigilu. Co powiesz na to, żebyśmy się zamknęli.",Você tem o poder do Sigilo completo em suas mãos. Que tal a gente ir atrás de um desfecho?,,Ai puterea întregului Sigiliu. Ce zici dacă primim o încheiere?,Теперь ты владеешь мощью завершённой Печати. Мы уже близко — давай покончим с этим.,,Du har makten över hela Sigil. Vad sägs om att vi går och avslutar det hela.,"Sigil'in tamamının gücüne sahipsin. Ne dersin, gidip biraz kapanış yapalım mı?" -"High noon, my hero. Prepare to embrace glory.",TXT_SUB_LOG86,,,,"Souboj v pravé poledne, můj hrdino. Připrav se přijmout slávu.","Klokken tolv, min helt. Gør dig klar til at omfavne æren.","Die Stunde ist gekommen, mein Held. Bereite dich auf Ruhm vor.",,,"Es la hora final, mi héroe. Prepárate para la gloria.",,"Ratkaisun hetki, sankarini. Valmistaudu pukeutumaan kunniaan.","Le soleil est au zénith, mon héros. Prépare toi à rencontrer ta gloire.",Eljött az idő hősöm. Ragadd meg a lehetőséget.,"Mezzogiorno di fuoco, mio eroe. Preparati ad abbracciare la gloria.",いい気分でしょ、私の英雄。栄光を受け入れる準備をしなさい。,"석양이 지고 있어, 나의 영웅. 영광을 누릴 준비해!","Hoog middaguur, mijn held. Bereid je voor om de glorie te omarmen.","Klokka er tolv, min helt. Forbered deg på å omfavne æren.","W samo południe, mój bohaterze. Przygotuj się na przyjęcie chwały.","Chegou a hora, meu herói. Se prepare para abraçar a glória.",,"Timpul pentru glorie, eroul meu.","Самое время, мой герой! Ты будешь купаться в славе.",,"Klockan tolv, min hjälte. Förbered dig på att omfamna ära.","Öğle vakti, kahramanım. Zaferi kucaklamaya hazırlan." -"Well, so much for prognostication. Hold it, Macil is calling us back. Let's get out of here in one piece.",TXT_SUB_LOG87,MAP12: After killing the Oracle with Macil alive.,,,"No, to by bylo pro prorokování. Počkat, Macil nás volá zpět. Vypadněme odsud vcelku.","Så meget for prognoser. Vent, Macil kalder os tilbage. Lad os komme ud herfra i ét stykke.","Nun, so viel zu Vorraussagungen. Moment, Macil ruft uns zurück. Lass uns hier heile heraus kommen.",,,"Bueno, tanto por un presentimiento. Espera, Macil nos reclama. Salgamos de aquí de una pieza.",,"No, se siitä ennustelusta. Odota, Macil kutsuu meitä takaisin. Häivytään täältä ehjin nahoin.","Bon, tant pis pour les pronostics. Attends, Macil nous demande de revenir. Rentrons un seul morceau.","Ennyit az előrejelzésről. Várj, Macil visszahív minket. Húzzunk el, míg egy darabban vagyunk.","Alla faccia dei prognostici... Aspetta, Macil ci sta richiamando. Meglio uscire da qua tutti interi.","まあ予言なんてそんなものでしょ。 +"High noon, my hero. Prepare to embrace glory.",TXT_SUB_LOG86,,,,"Souboj v pravé poledne, můj hrdino. Připrav se přijmout slávu.","Klokken tolv, min helt. Gør dig klar til at omfavne æren.","Die Stunde ist gekommen, mein Held. Bereite dich auf Ruhm vor.",,,"Es la hora final, mi héroe. Prepárate para la gloria.",,"Ratkaisun hetki, sankarini. Valmistaudu pukeutumaan kunniaan.","Le soleil est au zénith, mon héros. Prépare toi à rencontrer ta gloire.",,Eljött az idő hősöm. Ragadd meg a lehetőséget.,"Mezzogiorno di fuoco, mio eroe. Preparati ad abbracciare la gloria.",いい気分でしょ、私の英雄。栄光を受け入れる準備をしなさい。,"석양이 지고 있어, 나의 영웅. 영광을 누릴 준비해!","Hoog middaguur, mijn held. Bereid je voor om de glorie te omarmen.","Klokka er tolv, min helt. Forbered deg på å omfavne æren.","W samo południe, mój bohaterze. Przygotuj się na przyjęcie chwały.","Chegou a hora, meu herói. Se prepare para abraçar a glória.",,"Timpul pentru glorie, eroul meu.","Самое время, мой герой! Ты будешь купаться в славе.",,"Klockan tolv, min hjälte. Förbered dig på att omfamna ära.","Öğle vakti, kahramanım. Zaferi kucaklamaya hazırlan." +"Well, so much for prognostication. Hold it, Macil is calling us back. Let's get out of here in one piece.",TXT_SUB_LOG87,MAP12: After killing the Oracle with Macil alive.,,,"No, to by bylo pro prorokování. Počkat, Macil nás volá zpět. Vypadněme odsud vcelku.","Så meget for prognoser. Vent, Macil kalder os tilbage. Lad os komme ud herfra i ét stykke.","Nun, so viel zu Vorraussagungen. Moment, Macil ruft uns zurück. Lass uns hier heile heraus kommen.",,,"Bueno, tanto por un presentimiento. Espera, Macil nos reclama. Salgamos de aquí de una pieza.",,"No, se siitä ennustelusta. Odota, Macil kutsuu meitä takaisin. Häivytään täältä ehjin nahoin.","Bon, tant pis pour les pronostics. Attends, Macil nous demande de revenir. Rentrons un seul morceau.",,"Ennyit az előrejelzésről. Várj, Macil visszahív minket. Húzzunk el, míg egy darabban vagyunk.","Alla faccia dei prognostici... Aspetta, Macil ci sta richiamando. Meglio uscire da qua tutti interi.","まあ予言なんてそんなものでしょ。 ちょっと待って、マシルが帰還するように言ったわ。ここから抜け出しましょう。","웃기네. 이딴 예언 따위. 잠깐만, 마실이 우리들을 부르고 있어. 이제 여기를 나가자.","Nou, tot zover de prognose. Wacht even, Macil roept ons terug. Laten we hier heelhuids weggaan.","Så mye for spådommer. Vent, Macil kaller oss tilbake. La oss komme oss helskinnet ut herfra.","Cóż, to tyle jeśli chodzi o prognozowanie. Czekajcie, Macil nas wzywa. Wynośmy się stąd w jednym kawałku.","Bem, parece que não é hora de previsões. Peraí, o Macil está nos chamando de volta. Vamos tentar sair daqui inteiros.",,"Atât a fost cu prognosticul. Stai, Macil ne sună înapoi. Să ieșim întregi de aici.","Да, это превзошло все наши ожидания. Подожди — Мэйсил вызывает нас назад. Давай выбираться отсюда.",,"Så mycket för prognoser. Vänta, Macil kallar oss tillbaka. Låt oss komma härifrån i ett stycke.","Kehanet buraya kadarmış. Durun, Macil bizi geri çağırıyor. Buradan tek parça halinde çıkalım." -"I'm sorry, after up to my hips in blood I can't think of anything witty to say right now. Let's get back to Macil.",TXT_SUB_LOG88,,,,"Je mi líto; když jsem po boky v krvi, nemám nic co vtipného říct. Vraťme se k Macilovi.","Jeg er ked af det, men efter at have stået op til hofterne i blod kan jeg ikke finde på noget vittigt at sige lige nu. Lad os gå tilbage til Macil.","Tut mir leid, aber bei so viel Blut fällt mir nicht Flapsiges mehr ein. Lass uns zu Macil zurückgehen.",,,,,Anteeksi; oltuani lanteitani myöten veressä en keksi juuri nyt mitään nokkelaa sanottavaa. Palataan Macilin luokse.,"Désolée, après m'être retrouvée jusqu'au hanches dans le sang, je n'ai rien de malin à dire. Rentrons voir Macil.","Bocs, de miután nyakig vérben úsztam, semmi szellemes nem jut az eszembe. Irány vissza Macilhoz.","Mi spiace, ma dopo essere nel sangue fino alle caviglie non ho in mente nulla di interessante di dire al momento. Ritorniamo da Macil.",,미안. 피칠갑을 한 너의 모습을 보느라 할 말을 잃었어. 그냥 마실에게로 돌아가자.,"Het spijt me, na tot aan mijn heupen in bloed kan ik nu niets geestigs bedenken om te zeggen. Laten we teruggaan naar Macil.","Beklager, etter å ha stått i blod til hoftene kommer jeg ikke på noe vittig å si akkurat nå. La oss gå tilbake til Macil.","Przepraszam, ale po tym, jak jestem po biodra we krwi, nie mam teraz nic dowcipnego do powiedzenia. Wracajmy do Macil.",Desculpa. Após ficar coberta de sangue não consigo pensar em nada interessante pra dizer agora. Vamos voltar pro Macil.,,"Îmi pare rău, dar nu mă pot gândi să zic nimic acum. Să ne întoarcem la Macil.","Извини, после того, как я по бёдра в крови, я не могу придумать ничего остроумного, чтобы сказать сейчас. Давай вернёмся к Мэйсилу.",,"Jag är ledsen, men efter att ha varit upp till höfterna i blod kan jag inte komma på något roligt att säga just nu. Vi återvänder till Macil.","Üzgünüm, kalçalarıma kadar kana bulandıktan sonra şu anda söyleyecek esprili bir şey bulamıyorum. Macil'e geri dönelim." -"The factory is next to the mines. Richter must mean the mines of Degnin. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields.",TXT_SUB_LOG89,MAP23: After talking with Richter and leaving his room.,,,"Továrna je vedle dolů. Richter musí mít na mysli doly degninu. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole.","Fabrikken ligger ved siden af minerne. Richter må mene Degnin-minerne. Degnin-malmen er magnetisk og eksplosiv, lige til at lukke kraftfelter ned med.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Das Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten.",,,"La fábrica está junto a las minas. Richter debe referirse a las minas de Degnin. El mineral Degnin es magnético y explosivo, justo para apagar campos de fuerza. ",,"Tehdas on kaivoksen vieressä. Richter varmastikin tarkoittaa Degninin kaivosta. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. ","A gyár a bánya mellett van. Richter valószínűleg a Degnin bányákra utalt. A degnini érc mágneses és robbanékony, egy tökéletes megoldás az erőpajzs kiiktatására.","La Fabbrica si trova accanto alle miniere. Richter starà parlando delle miniere di Degnin. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 +"I'm sorry, after up to my hips in blood I can't think of anything witty to say right now. Let's get back to Macil.",TXT_SUB_LOG88,,,,"Je mi líto; když jsem po boky v krvi, nemám nic co vtipného říct. Vraťme se k Macilovi.","Jeg er ked af det, men efter at have stået op til hofterne i blod kan jeg ikke finde på noget vittigt at sige lige nu. Lad os gå tilbage til Macil.","Tut mir leid, aber bei so viel Blut fällt mir nicht Flapsiges mehr ein. Lass uns zu Macil zurückgehen.",,,,,Anteeksi; oltuani lanteitani myöten veressä en keksi juuri nyt mitään nokkelaa sanottavaa. Palataan Macilin luokse.,"Désolée, après m'être retrouvée jusqu'au hanches dans le sang, je n'ai rien de malin à dire. Rentrons voir Macil.",,"Bocs, de miután nyakig vérben úsztam, semmi szellemes nem jut az eszembe. Irány vissza Macilhoz.","Mi spiace, ma dopo essere nel sangue fino alle caviglie non ho in mente nulla di interessante di dire al momento. Ritorniamo da Macil.",,미안. 피칠갑을 한 너의 모습을 보느라 할 말을 잃었어. 그냥 마실에게로 돌아가자.,"Het spijt me, na tot aan mijn heupen in bloed kan ik nu niets geestigs bedenken om te zeggen. Laten we teruggaan naar Macil.","Beklager, etter å ha stått i blod til hoftene kommer jeg ikke på noe vittig å si akkurat nå. La oss gå tilbake til Macil.","Przepraszam, ale po tym, jak jestem po biodra we krwi, nie mam teraz nic dowcipnego do powiedzenia. Wracajmy do Macil.",Desculpa. Após ficar coberta de sangue não consigo pensar em nada interessante pra dizer agora. Vamos voltar pro Macil.,,"Îmi pare rău, dar nu mă pot gândi să zic nimic acum. Să ne întoarcem la Macil.","Извини, после того, как я по бёдра в крови, я не могу придумать ничего остроумного, чтобы сказать сейчас. Давай вернёмся к Мэйсилу.",,"Jag är ledsen, men efter att ha varit upp till höfterna i blod kan jag inte komma på något roligt att säga just nu. Vi återvänder till Macil.","Üzgünüm, kalçalarıma kadar kana bulandıktan sonra şu anda söyleyecek esprili bir şey bulamıyorum. Macil'e geri dönelim." +"The factory is next to the mines. Richter must mean the mines of Degnin. The Degnin ore is magnetic and explosive, just the thing for shutting down force fields.",TXT_SUB_LOG89,MAP23: After talking with Richter and leaving his room.,,,"Továrna je vedle dolů. Richter musí mít na mysli doly degninu. Degninská ruda je magnetická a výbušná, perfektní pro vypnutí silového pole.","Fabrikken ligger ved siden af minerne. Richter må mene Degnin-minerne. Degnin-malmen er magnetisk og eksplosiv, lige til at lukke kraftfelter ned med.","Die Fabrik liegt neben den Minen. Richter muss von den Degnin-Minen reden. Das Degnin-Erz ist magnetisch und explosiv., genau das, was wir brauchen, um die Kraftfelder auszuschalten.",,,"La fábrica está junto a las minas. Richter debe referirse a las minas de Degnin. El mineral Degnin es magnético y explosivo, justo para apagar campos de fuerza. ",,"Tehdas on kaivoksen vieressä. Richter varmastikin tarkoittaa Degninin kaivosta. Degnin-malmi on magneettista ja räjähdysherkkää, juuri omiaan purkamaan voimakenttiä.","L'usine est près des mines. Richter doit parler des mines de degnin. Le minérai de degnin est magnétisé et explosif, c'est parfait pour désactiver les champs de force. ",,"A gyár a bánya mellett van. Richter valószínűleg a Degnin bányákra utalt. A degnini érc mágneses és robbanékony, egy tökéletes megoldás az erőpajzs kiiktatására.","La Fabbrica si trova accanto alle miniere. Richter starà parlando delle miniere di Degnin. I minerali di Degnin sono magnetici ed esplosivi, giusto ciò che ci serve per disattivare i campi di forza.","工場は鉱山の隣にあるわ。リヒターはデグニン鉱山とも呼んでいる。 デグニン石は綺麗だが可燃性で、フォースフィールドを消すにはうってつけよ。",공장은 광산 옆에 있어. 릭터가 데그닌 광산을 이야기한 것 같아. 데그닌 광석은 폭발성이 있는 자기력이 감도는 물질이야. 방어막을 끌 중요한 도구이기도 하지.,"De fabriek ligt naast de mijnen. Richter moet de mijnen van Degnin bedoelen. Het Degnin-erts is magnetisch en explosief, precies het ding voor het afsluiten van krachtvelden.","Fabrikken ligger ved siden av gruvene. Richter må mene gruvene i Degnin. Degnin-malmen er magnetisk og eksplosiv, som skapt for å slå ut kraftfelt.","Fabryka jest obok kopalni. Richter musi mieć na myśli kopalnie w Degnin. Ruda Degnin jest magnetyczna i wybuchowa, w sam raz do wyłączania pól siłowych.","A fábrica fica próxima às minas. O Richter provavelmente se refere às minas de Degnin. O minério de Degnin é magnético e explosivo, perfeito para derrubar os campos de força.",,"Fabrica e lângă mine. Richter probabil s-a referit la minele de Degnin. Mineralul de Degnin e magnetic și exploziv, exact ce ne trebuie pentru scuturi.","Вход на фабрику — рядом со спуском в шахты. Рихтер, должно быть, имел в виду шахты Дегнина. Дегнинская руда магнитна и взрывоопасна — то, что надо, если хочешь отключить силовое поле. ",,"Fabriken ligger bredvid gruvorna. Richter måste mena Degnins gruvor. Degninmalmen är magnetisk och explosiv, precis vad man behöver för att stänga av kraftfält.","Fabrika madenlerin yanında. Richter, Degnin madenlerini kastediyor olmalı. Degnin cevheri manyetik ve patlayıcıdır, tam da güç alanlarını kapatmak için." -"Mines, catacombs, sewers... What a first date!",TXT_SUB_LOG90,MAP13: Entrance.,,,"Doly, kobky, stoky... skvělé první rande!","Minerne, katakomberne, kloakkerne... Sikke en første date!","Minen, Katakomben, Kanalisationen... was für ein erstes Date!",,,"Minas, catacumbas, alcantarillas... ¡Menuda primera cita!",,"Kaivoksia, katakombeja, viemäreitä... Mitkä ensitreffit!","Mines, catacombes, égouts.. Super premier rendez-vous!","Bányák, katakombák, kanálisok... Micsoda első randi!","Miniere, catacombe, fogne... Che primo appuntamento!",鉱山、地下墓所、下水道...とんだ初デートだな!,"광산, 고대 묘지, 하수도. 데이트하기엔 딱 맞는 장소들이네!","Mijnen, catacomben, rioleringen.... Wat een eerste afspraakje!","Gruver, katakomber, kloakker... For en første date!","Kopalnie, katakumby, kanały... Co za pierwsza randka!","Minas, catacumbas, esgotos... Que belo primeiro encontro!",,"Mine, catacombe, canale... Ce întâlnire!","Шахты, катакомбы, канализации... Замечательное первое свидание!",,"Gruvor, katakomber, kloaker... Vilken första träff!","Madenler, yeraltı mezarları, kanalizasyonlar. Ne ilk randevu ama!" -"I wish Richter had been a touch more specific. Hm, let's try over here.",TXT_SUB_LOG91,MAP13: West (entrance with parkour to the northwest).,,,"Přála bych si, aby byl Richter trochu přesnější. Hm, zkusme to tadyhle.","Jeg ville ønske, Richter havde været lidt mere specifik. Hm, lad os prøve herovre.","Ich wünschte mir, dass Richter etwas präziser gewesen wäre. Hmm, lass es uns mal hier versuchen.",,,"Ojalá Richter hubiera sido un pelín más específico. Hm, probemos por aquí.",,"Kunpa Richter olisi ollut hivenen tarkempi. Hm, kokeillaan täältä.",J'aurais bien voulu que Richter soit un peu plus spécifique. Hm.. Essayons ici.,"Nem bántam volna, ha Richter egy csöppnyivel pontosabb leírást ad. Hm, próbáljuk meg itt.","Vorrei che Richter fosse stato un poco più preciso. Mh, vediamo di là.","リヒターがもっと具体的な部分に触れてくれて欲しいが。 +"Mines, catacombs, sewers... What a first date!",TXT_SUB_LOG90,MAP13: Entrance.,,,"Doly, kobky, stoky... skvělé první rande!","Minerne, katakomberne, kloakkerne... Sikke en første date!","Minen, Katakomben, Kanalisationen... was für ein erstes Date!",,,"Minas, catacumbas, alcantarillas... ¡Menuda primera cita!",,"Kaivoksia, katakombeja, viemäreitä... Mitkä ensitreffit!","Mines, catacombes, égouts.. Super premier rendez-vous!",,"Bányák, katakombák, kanálisok... Micsoda első randi!","Miniere, catacombe, fogne... Che primo appuntamento!",鉱山、地下墓所、下水道...とんだ初デートだな!,"광산, 고대 묘지, 하수도. 데이트하기엔 딱 맞는 장소들이네!","Mijnen, catacomben, rioleringen.... Wat een eerste afspraakje!","Gruver, katakomber, kloakker... For en første date!","Kopalnie, katakumby, kanały... Co za pierwsza randka!","Minas, catacumbas, esgotos... Que belo primeiro encontro!",,"Mine, catacombe, canale... Ce întâlnire!","Шахты, катакомбы, канализации... Замечательное первое свидание!",,"Gruvor, katakomber, kloaker... Vilken första träff!","Madenler, yeraltı mezarları, kanalizasyonlar. Ne ilk randevu ama!" +"I wish Richter had been a touch more specific. Hm, let's try over here.",TXT_SUB_LOG91,MAP13: West (entrance with parkour to the northwest).,,,"Přála bych si, aby byl Richter trochu přesnější. Hm, zkusme to tadyhle.","Jeg ville ønske, Richter havde været lidt mere specifik. Hm, lad os prøve herovre.","Ich wünschte mir, dass Richter etwas präziser gewesen wäre. Hmm, lass es uns mal hier versuchen.",,,"Ojalá Richter hubiera sido un pelín más específico. Hm, probemos por aquí.",,"Kunpa Richter olisi ollut hivenen tarkempi. Hm, kokeillaan täältä.",J'aurais bien voulu que Richter soit un peu plus spécifique. Hm.. Essayons ici.,,"Nem bántam volna, ha Richter egy csöppnyivel pontosabb leírást ad. Hm, próbáljuk meg itt.","Vorrei che Richter fosse stato un poco più preciso. Mh, vediamo di là.","リヒターがもっと具体的な部分に触れてくれて欲しいが。 あー、私らが試してみようか。","릭터가 좀 더 자세히 설명해 줬으면 좋았을 텐데. 흠, 여기서 해보자.","Ik wou dat Richter een beetje specifieker was geweest. Hm, laten we het hier eens proberen.","Skulle ønske Richter hadde vært litt mer spesifikk. Hm, la oss prøve her borte.","Szkoda, że Richter nie był bardziej konkretny. Hm, spróbujmy tutaj.","Bem que o Richter podia ter sido um pouco mais específico. Hmm, vamos tentar por alí.",,Îmi doresc ca Richter să fii fost mai specific. Să încercăm acolo.,"Я надеялась, что Рихтер будет чуть более конкретным. Ладно, давай посмотрим, что там.",,"Jag önskar att Richter hade varit lite mer specifik. Hm, vi försöker här borta.",Keşke Richter biraz daha spesifik olsaydı. Şurayı deneyelim. -"I think we're... Oh, crap. I have no idea where we are.",TXT_SUB_LOG92,MAP13: Northwest (hall to the parkour room).,,,"Myslím, že jsme... sakra. Nemám tušení, kde jsme.","Jeg tror, vi er... Åh, pis. Jeg har ingen idé om, hvor vi er.","Ich glaube wir sind... Oh, Mist. Ich habe keine Ahnung wo wir sind.",,,"Creo que estamos... Oh, mierda. No tengo ni idea de donde estamos.",,"Luulen, että olemme... Perhana, minulla ei ole aavistustakaan, missä olemme.","Je crois que.. Non, merde, j'ai aucune idée d'où on est!","Azt hiszem éppen...Oh, franc. Ötletem sincs hol vagyunk.","Credo che siamo... Ah, merda, non ne ho proprio idea.","私が思うに...ああ、クソ。 +"I think we're... Oh, crap. I have no idea where we are.",TXT_SUB_LOG92,MAP13: Northwest (hall to the parkour room).,,,"Myslím, že jsme... sakra. Nemám tušení, kde jsme.","Jeg tror, vi er... Åh, pis. Jeg har ingen idé om, hvor vi er.","Ich glaube wir sind... Oh, Mist. Ich habe keine Ahnung wo wir sind.",,,"Creo que estamos... Oh, mierda. No tengo ni idea de donde estamos.",,"Luulen, että olemme... Perhana, minulla ei ole aavistustakaan, missä olemme.","Je crois que.. Non, merde, j'ai aucune idée d'où on est!",,"Azt hiszem éppen...Oh, franc. Ötletem sincs hol vagyunk.","Credo che siamo... Ah, merda, non ne ho proprio idea.","私が思うに...ああ、クソ。 何処にあるかさっぱりわからないわ。",우리는 지금... 이런 제길. 여기가 어딘지 모르겠어.,"Ik denk dat we.... Oh, shit. Ik heb geen idee waar we zijn.","Jeg tror vi... Å, pokker. Jeg aner ikke hvor vi er.","Chyba jesteśmy... O, cholera. Nie mam pojęcia, gdzie jesteśmy.","Acho que estamos... Ah, merda. Não faço a menor idéia onde estamos.",,"Cred că suntem... Oh, la naiba. Nu știu unde suntem.","Я думаю, мы... О, чёрт. Я понятия не имею, где мы.",,"Jag tror att vi är... Åh, skit. Jag har ingen aning om var vi är.","Sanırım biz... Oh, kahretsin. Nerede olduğumuz hakkında hiçbir fikrim yok." -"This must be the ruins Richter's agents were searching for. Oh, watch out! Crusaders!",TXT_SUB_LOG93,MAP25: Entrance.,,,"Tohle musí být ty ruiny, které Richterovi agenti hledali. A, bacha! Křižáci!","Det må være ruinerne, som Richters agenter ledte efter. Åh, pas på! Korsfarere!","Dies müssen die Ruinen sein, die Richters Agent gesucht hat. Oh, aufpassen! Ordensritter!",,,"Estas deben ser las ruinas que el agente de Richter estaba buscando. Oh, ¡cuidado! ¡Cruzados!",,"Nämä ovat varmaankin ne rauniot, joita Richterin joukot olivat etsineet. Oho, varo: ristiretkeläisiä!","Ca doit être les ruines que les agents de Richter cherchaient. Attention, des croisés!","Ezek lehetnek a romok, amit Richter ügynökei kerestek. Vigyázz! Keresztesek!","Queste devono essere le rovine che gli agenti di Richter stavano cercando. Ah, attento! Crociati!","ここがリヒターのエージェントが探していた遺跡のはず。 +"This must be the ruins Richter's agents were searching for. Oh, watch out! Crusaders!",TXT_SUB_LOG93,MAP25: Entrance.,,,"Tohle musí být ty ruiny, které Richterovi agenti hledali. A, bacha! Křižáci!","Det må være ruinerne, som Richters agenter ledte efter. Åh, pas på! Korsfarere!","Dies müssen die Ruinen sein, die Richters Agent gesucht hat. Oh, aufpassen! Ordensritter!",,,"Estas deben ser las ruinas que el agente de Richter estaba buscando. Oh, ¡cuidado! ¡Cruzados!",,"Nämä ovat varmaankin ne rauniot, joita Richterin joukot olivat etsineet. Oho, varo: ristiretkeläisiä!","Ca doit être les ruines que les agents de Richter cherchaient. Attention, des croisés!",,"Ezek lehetnek a romok, amit Richter ügynökei kerestek. Vigyázz! Keresztesek!","Queste devono essere le rovine che gli agenti di Richter stavano cercando. Ah, attento! Crociati!","ここがリヒターのエージェントが探していた遺跡のはず。 あっと、気を付けて!クルセイダーよ!","릭터의 요원이 수색하던 유적지인가봐... 잠깐, 조심해! 크루세이더야!","Dit moet de ruïnes zijn waar de agenten van Richter naar op zoek waren. Oh, kijk uit! Kruisvaarders!",Dette må være ruinene Richters agenter lette etter. Se opp! Korsfarere!,"To muszą być ruiny, których szukali agenci Richtera. Och, uważaj! Krzyżowcy!","Estas devem ser as ruínas que o agente de Richter estava procurando. Ah, cuidado! Cruzados!",,Ăstea ar trebui să fie ruinele pe care le căutau agenții lui Richter. Ai grijă! Cruciați!,"Возможно, это те самые руины, которые искали агенты Рихтера... Осторожно! Крестоносцы!",,"Det här måste vara ruinerna som Richters agenter sökte efter. Åh, se upp! Korsfarare!","Richter'in ajanlarının aradığı harabeler burası olmalı. Oh, dikkat et! Haçlılar!" -"Ugh, it's trying to regenerate. Blast it before I throw up!",TXT_SUB_LOG94,,,,"Fuj, snaží se to oživit. Odstřel to, než začnu zvracet!","Ugh, den prøver at regenerere. Skyd den, før jeg kaster op!","Ugh, es versucht, sich zu regenerieren. Mach es fertig, bevor ich anfange zu kotzen.",,,"Ugh, está intentando regenerarse. ¡Reviéntalo antes de que vomite!",,"Yöh, se yrittää uusiutua. Posauta se, ennen kuin laattaan!","Beurk, il essaie de se régénérer, incinère le avant que je ne vomisse!","Fúj, regenerálódni próbál. Lődd szét mielőtt ide hányok!","Dannazione, sta cercando di rigenerarsi! Distruggilo prima che mi venga da vomitare.",,"으윽, 이게 재생하기 시작했어. 내가 토하기 전에 파괴해!","Ugh, het probeert te regenereren. Blast het voordat ik overgeven!",Den prøver å regenerere. Spreng den før jeg spyr!,"Ugh, próbuje się zregenerować. Rozwal to, zanim zwymiotuję!","Argh, está tentando se regenerar. Detona essa coisa antes que eu vomite!",,"Ugh, încearcă să se regenereze. Aruncă-l în aer înainte să vomit.","О-о, оно пытается восстановиться. Добей его, пока меня не стошнило!",,"Ugh, den försöker att regenerera. Skjut den innan jag spyr!",Yenilenmeye çalışıyor. Kusmadan önce patlat şunu! -"My friend, whatever it is we're fighting, it's more than the Order. Off to the mines!",TXT_SUB_LOG95,MAP25: After killing the Spectre.,,,"Příteli, ať už bojujeme s čímkoliv, jde o víc než jen Řád. Do dolů!","Min ven, hvad det end er, vi kæmper imod, er det mere end Ordenen. Af sted til minerne!","Mein Freund, was auch immer es ist, dass wir bekämpfen, es ist mehr als der Orden. Ab zu den Minen!",,,"Amigo mío, lo que sea contra que estemos luchando, es más que la Orden. ¡A las minas!",,"Ystäväni, mitä vastaan me taistelemmekaan, se on suurempi kuin Veljeskunta. Matkatkaamme kaivokselle!","Mon ami, je ne sais ce contre quoi on se bat, mais c'est plus que l'Ordre. Allons dans les mines!","Nos barátom, bármivel is állunk szemben, több az mint maga a Rend. Irány a bánya!","Amico mio, qualsiasi cosa stiamo combattendo, è molto più dell'Ordine. Alle miniere!","友よ、私達が戦う相手が何であろうとも、オーダー以上のものはない。 +"Ugh, it's trying to regenerate. Blast it before I throw up!",TXT_SUB_LOG94,,,,"Fuj, snaží se to oživit. Odstřel to, než začnu zvracet!","Ugh, den prøver at regenerere. Skyd den, før jeg kaster op!","Ugh, es versucht, sich zu regenerieren. Mach es fertig, bevor ich anfange zu kotzen.",,,"Ugh, está intentando regenerarse. ¡Reviéntalo antes de que vomite!",,"Yöh, se yrittää uusiutua. Posauta se, ennen kuin laattaan!","Beurk, il essaie de se régénérer, incinère le avant que je ne vomisse!",,"Fúj, regenerálódni próbál. Lődd szét mielőtt ide hányok!","Dannazione, sta cercando di rigenerarsi! Distruggilo prima che mi venga da vomitare.",,"으윽, 이게 재생하기 시작했어. 내가 토하기 전에 파괴해!","Ugh, het probeert te regenereren. Blast het voordat ik overgeven!",Den prøver å regenerere. Spreng den før jeg spyr!,"Ugh, próbuje się zregenerować. Rozwal to, zanim zwymiotuję!","Argh, está tentando se regenerar. Detona essa coisa antes que eu vomite!",,"Ugh, încearcă să se regenereze. Aruncă-l în aer înainte să vomit.","О-о, оно пытается восстановиться. Добей его, пока меня не стошнило!",,"Ugh, den försöker att regenerera. Skjut den innan jag spyr!",Yenilenmeye çalışıyor. Kusmadan önce patlat şunu! +"My friend, whatever it is we're fighting, it's more than the Order. Off to the mines!",TXT_SUB_LOG95,MAP25: After killing the Spectre.,,,"Příteli, ať už bojujeme s čímkoliv, jde o víc než jen Řád. Do dolů!","Min ven, hvad det end er, vi kæmper imod, er det mere end Ordenen. Af sted til minerne!","Mein Freund, was auch immer es ist, dass wir bekämpfen, es ist mehr als der Orden. Ab zu den Minen!",,,"Amigo mío, lo que sea contra que estemos luchando, es más que la Orden. ¡A las minas!",,"Ystäväni, mitä vastaan me taistelemmekaan, se on suurempi kuin Veljeskunta. Matkatkaamme kaivokselle!","Mon ami, je ne sais ce contre quoi on se bat, mais c'est plus que l'Ordre. Allons dans les mines!",,"Nos barátom, bármivel is állunk szemben, több az mint maga a Rend. Irány a bánya!","Amico mio, qualsiasi cosa stiamo combattendo, è molto più dell'Ordine. Alle miniere!","友よ、私達が戦う相手が何であろうとも、オーダー以上のものはない。 鉱山から離れましょう!","친구야, 우리가 싸우는 상대가 무엇인지는 모르겠지만, 오더보다 더한 존재인 것 같아. 광산으로 향하자!","Mijn vriend, wat het ook is waar we tegen vechten, het is meer dan de Orde. Naar de mijnen!","Min venn, hva det enn er vi kjemper mot, så er det mer enn Ordenen. Av sted til gruvene!","Mój przyjacielu, cokolwiek to jest, z czym walczymy, to coś więcej niż Zakon. Do kopalni!","Meu amigo, seja lá o que estamos combatendo, é mais do que somente a Ordem. Vamos para as minas!",,"Prietene, orice ar fi ceea ce înfruntăm, e mai mult decât Ordinul. Către mine!","Друг мой, с чем бы мы ни сражались, это нечто большее, чем просто Орден. К шахтам!",,"Min vän, vad det än är vi slåss mot, så är det mer än Orden. Iväg till gruvorna!","Dostum, savaştığımız şey her neyse, Tarikat'tan daha fazlası. Madenlere!" -"Without letting down your guard, look for deposits of ore.",TXT_SUB_LOG96,MAP14: Entrance.,,,Opatrně se zkus podívat po ložiscích rudy.,"Uden at sænke din vagt, skal du lede efter malmforekomster.",Sei vorsichtig und halte Ausschau nach Erzvorkommen.,,,"Sin bajar la guardia, busca depósitos de mineral.",,"Etsi malmiesiintymiä, kuitenkin valppautesi säilyttäen.","Sans arrêter de faire attention, cherche des veines de minerai.","Keress érceket, de figyelj a hátad mögé közben.","Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali.",警戒を緩めることなく、鉱石の堆積所を探しましょう。,"조심해가면서, 그들이 캔 광석을 두는 곳을 찾아.","Zonder je waakzaamheid te laten verslappen, zoek je naar ertsafzettingen.","Uten å senke garden, let etter malmforekomster.","Nie spuszczając gardy, szukajcie złóż rudy.",Não baixe a sua guarda. Vamos procurar por depósitos de minério.,,"Fără a lăsa garda jos, uită-te dupa depozite de minereu.","Поищи залежи руды, но не теряй бдительности!",,"Utan att sänka garden, leta efter malmfyndigheter.","Gardınızı düşürmeden, maden yataklarını arayın." -"These poor souls are drones, their synaptic functions are jammed by RC implants. We destroy the transmitter and they are free!",TXT_SUB_LOG97,MAP14: After crossing the entrance's yard.,,,"Tihle chudáci jsou trubci, jejich synaptické funkce jsou narušené na dálku ovládanými implantáty. Když zničíme vysílačku, budou svobodní!","Disse stakkels sjæle er droner, deres synaptiske funktioner er blokeret af RC-implantater. Vi ødelægger senderen, og de er frie!","Diese armen Seelen sind Drohnen, ihre synaptischen Funktionen werden von Implantaten blockiert. Wenn wir den Transmitter zerstören, sind sie frei.",,,"Estas pobres almas son zánganos. Sus funciones sinápticas están bloqueadas por implantes de control remoto. ¡Destruimos el transmisor, y son libres!",,"Nämä sieluparat ovat kuhnureita: Heidän synaptisia toimintojaan häiritään radio-ohjattavilla istutteilla. Me tuhoamme lähettimen, ja he ovat vapaat!","Ces pauvres âmes sont des drones, leurs fonctions synaptiques sont brouillées par des implants radiocommandés. On détruit le transmetteur et ils sont libres!","Ezek a szerencsétlen lelkek csak drónok. A szinaptikus funkcióikat zavarják távolról irányítható implantátumokkal. Szétromboljuk a jeladókat, és szabaddá vállnak.","Questi poveracci sono degli schiavi. Le loro funzioni cerebrali stanno venendo bloccate da degli impianti. Se distruggiamo il trasmettitore, saranno liberi!","これら精神の乏しい労働者達は、シナプス機能をRCインプラントで妨害している。 +"Without letting down your guard, look for deposits of ore.",TXT_SUB_LOG96,MAP14: Entrance.,,,Opatrně se zkus podívat po ložiscích rudy.,"Uden at sænke din vagt, skal du lede efter malmforekomster.",Sei vorsichtig und halte Ausschau nach Erzvorkommen.,,,"Sin bajar la guardia, busca depósitos de mineral.",,"Etsi malmiesiintymiä, kuitenkin valppautesi säilyttäen.","Sans arrêter de faire attention, cherche des veines de minerai.",,"Keress érceket, de figyelj a hátad mögé közben.","Senza abbassare la guardia, cerca di trovare alcuni depositi di minerali.",警戒を緩めることなく、鉱石の堆積所を探しましょう。,"조심해가면서, 그들이 캔 광석을 두는 곳을 찾아.","Zonder je waakzaamheid te laten verslappen, zoek je naar ertsafzettingen.","Uten å senke garden, let etter malmforekomster.","Nie spuszczając gardy, szukajcie złóż rudy.",Não baixe a sua guarda. Vamos procurar por depósitos de minério.,,"Fără a lăsa garda jos, uită-te dupa depozite de minereu.","Поищи залежи руды, но не теряй бдительности!",,"Utan att sänka garden, leta efter malmfyndigheter.","Gardınızı düşürmeden, maden yataklarını arayın." +"These poor souls are drones, their synaptic functions are jammed by RC implants. We destroy the transmitter and they are free!",TXT_SUB_LOG97,MAP14: After crossing the entrance's yard.,,,"Tihle chudáci jsou trubci, jejich synaptické funkce jsou narušené na dálku ovládanými implantáty. Když zničíme vysílačku, budou svobodní!","Disse stakkels sjæle er droner, deres synaptiske funktioner er blokeret af RC-implantater. Vi ødelægger senderen, og de er frie!","Diese armen Seelen sind Drohnen, ihre synaptischen Funktionen werden von Implantaten blockiert. Wenn wir den Transmitter zerstören, sind sie frei.",,,"Estas pobres almas son zánganos. Sus funciones sinápticas están bloqueadas por implantes de control remoto. ¡Destruimos el transmisor, y son libres!",,"Nämä sieluparat ovat kuhnureita: Heidän synaptisia toimintojaan häiritään radio-ohjattavilla istutteilla. Me tuhoamme lähettimen, ja he ovat vapaat!","Ces pauvres âmes sont des drones, leurs fonctions synaptiques sont brouillées par des implants radiocommandés. On détruit le transmetteur et ils sont libres!",,"Ezek a szerencsétlen lelkek csak drónok. A szinaptikus funkcióikat zavarják távolról irányítható implantátumokkal. Szétromboljuk a jeladókat, és szabaddá vállnak.","Questi poveracci sono degli schiavi. Le loro funzioni cerebrali stanno venendo bloccate da degli impianti. Se distruggiamo il trasmettitore, saranno liberi!","これら精神の乏しい労働者達は、シナプス機能をRCインプラントで妨害している。 私達が送信機を破壊し皆を解放するんだ!","저 사람들은 불쌍한 광산의 노예들이야. 오더가 이식한 세뇌 장치 때문에 정상적인 뇌 기능을 잃었지. 전송기만 파괴한다면, 그들은 자유를 되찾을 수 있을 거야!","Deze arme zielen zijn drones, hun synaptische functies worden verstoord door RC-implantaten. We vernietigen de zender en ze zijn vrij!","Disse stakkarene er droner, deres synaptiske funksjoner er blokkert av RC-implantater. Vi ødelegger senderen, og de er fri!","Te biedne dusze są dronami, ich funkcje synaptyczne są zagłuszane przez implanty RC. Zniszczymy nadajnik i są wolne!",Esses pobres coitados são escravos. Suas funções sinápticas estão sendo bloqueadas por implantes de controle remoto. Se destruirmos o transmissor eles estarão livres!,,Sufletele ăstea sărmane sunt drone. Funcțiile lor sinaptice sunt întrerupte de implanturi RC. Distrugem transmițătorul și sunt libere!,"Эти несчастные души — дроны. Сигнал, поступающий на импланты, полностью подавляет их сознание. Давай уничтожим передатчик и освободим их!",,"Dessa stackars själar är drönare, deras synaptiska funktioner är blockerade av RC-implantat. Vi förstör sändaren och de är fria!","Bu zavallı ruhlar dron, sinaptik fonksiyonları RC implantları tarafından engellenmiş. Vericiyi yok edersek özgür kalırlar!" -"Command says the transmitter is shielded by a force field. So two birds, one stone, free the drones and practice with the ore.",TXT_SUB_LOG98,MAP14: After the entrance's yard and before going down.,,,"Velení říká, že vysílačka je chráněná silovým polem. Dvě mouchy jednou ranou: osvobodíme vězně a vyzkoušíme si, jak s tou rudou.","Kommandocentralen siger, at senderen er beskyttet af et kraftfelt. Så to fluer i et smæk, befri dronerne og øv dig med malmen.","Die Kommandozentale sagt, der Transmitter sei von einem Kraftfeld geschützt. So, zwei Fliegen, eine Klatsche, befreie die Drohnen und übe mit dem Erz.",,,"El Comando dice que el transmisor está protegido por un campo de fuerza. Dos pájaros de un tiro, libera a los zánganos y practica con el mineral.",,"Komentokeskus sanoo, että lähetin on voimakentän suojaama. Siispä kaksi kärpästä yhdellä iskulla: vapautamme kuhnurit ja samalla harjoittelemme malmilla.","La commandement me dit que le transmetteur est protégé par un champ de force. Ca fait d'une pierre de coups. On libère les drones, et on s'entraîne avec le minerai.",Az irányítás szerint a jeladó el van szeparálva egy erőpajzzsal. Tehát két légy és egy csapás: szabadítsuk ki a drónokat és gyakoroljunk az érccel.,"Il comando dice che il trasmettitore è protetto da un campo di forza. Quindi, due piccioni con una fava. Liberiamo gli schiavi e facciamo pratica con il minerale.","司令官は送信機がフォースフィールドに守られていると言っていた。 +"Command says the transmitter is shielded by a force field. So two birds, one stone, free the drones and practice with the ore.",TXT_SUB_LOG98,MAP14: After the entrance's yard and before going down.,,,"Velení říká, že vysílačka je chráněná silovým polem. Dvě mouchy jednou ranou: osvobodíme vězně a vyzkoušíme si, jak s tou rudou.","Kommandocentralen siger, at senderen er beskyttet af et kraftfelt. Så to fluer i et smæk, befri dronerne og øv dig med malmen.","Die Kommandozentale sagt, der Transmitter sei von einem Kraftfeld geschützt. So, zwei Fliegen, eine Klatsche, befreie die Drohnen und übe mit dem Erz.",,,"El Comando dice que el transmisor está protegido por un campo de fuerza. Dos pájaros de un tiro, libera a los zánganos y practica con el mineral.",,"Komentokeskus sanoo, että lähetin on voimakentän suojaama. Siispä kaksi kärpästä yhdellä iskulla: vapautamme kuhnurit ja samalla harjoittelemme malmilla.","La commandement me dit que le transmetteur est protégé par un champ de force. Ca fait d'une pierre de coups. On libère les drones, et on s'entraîne avec le minerai.",,Az irányítás szerint a jeladó el van szeparálva egy erőpajzzsal. Tehát két légy és egy csapás: szabadítsuk ki a drónokat és gyakoroljunk az érccel.,"Il comando dice che il trasmettitore è protetto da un campo di forza. Quindi, due piccioni con una fava. Liberiamo gli schiavi e facciamo pratica con il minerale.","司令官は送信機がフォースフィールドに守られていると言っていた。 そこを潰せば鉱山と労働者を解放、一石二鳥だな。",본부가 말하길 전송기는 방어막에 의해 보호받고 있대. 광석을 사용하는 방법을 연습하면서 노예들을 해방한다면 일석이조일 거야.,"Het commando zegt dat de zender is afgeschermd door een krachtveld. Dus twee vogels, een steen, bevrijden de drones en oefenen met het erts.","Kommandoen sier at senderen er beskyttet av et kraftfelt. Så to fluer i en smekk, frigjør dronene og øv med malmen.","Dowództwo mówi, że nadajnik jest osłonięty przez pole siłowe. Więc dwie pieczenie na jednym ogniu, uwolnić drony i poćwiczyć z rudą.",O comando diz que o transmissor está protegido por um campo de força. Dois coelhos numa tacada só. Liberte os escravos e teste o minério.,,"Centrul de comandă e prtejat de un câmp de forță. Deci, două păsări, o piatră.","Штаб говорит, что передатчик защищён силовым полем. Ты освободишь дронов и испытаешь руду — одним выстрелом двух зайцев!",,"Ledningen säger att sändaren är skyddad av ett kraftfält. Så två flugor i en smäll, frigör drönarna och öva med malmen.","Komuta vericinin bir güç alanı tarafından korunduğunu söylüyor. Yani bir taşla iki kuş, dronları serbest bırak ve cevherle pratik yap." -"My suggestion is, toss the ore at the forcefield and then blast it. The resulting compression should create a magnetic blanket and turn off the lights.",TXT_SUB_LOG99,MAP14: After James's room.,,,"Můj návrh je, hoď rudu na to silové pole a pak ji odstřel. Výsledná komprese by měla vytvořit magnetický povlak a vypnout pole.","Mit forslag er, at kaste malmen mod kraftfeltet og derefter sprænge det. Den resulterende kompression skulle skabe et magnetisk tæppe og slukke lyset.","Mein Vorschlag wäre, das Erz vor das Kraftfeld zu legen und dann explodieren zu lassen. Die resultierende Kompression sollte ein Magnetfeld erzeugen und die Lichter ausgehen lassen.",,,"Mi sugerencia es, tirar el mineral hacia el campo de fuerza y luego reventarlo, la presión resultante debería crear un manto magnético y apagar las luces.",,"Ehdotukseni on, että heität malmin voimakentään ja sitten posautat sen. Syntyvän paineaallon pitäisi muodostaa magneettinen peitto ja sammuttaa valot.",Ma suggestion: jette le minerai sur le champ de force puis tire dessus. La compression qui en résulte devrait créer un champ magnétique qui va désactiver les lumières.,"Az a tanácsom, hogy dobd az ércet az erőpajzsra, és robbantsd fel. A keletkező kompresszió egy mágneses takarót kéne hogy képezzen, így kikapcsolva a fényeket.","Il mio consiglio è, lancia uno dei minerali al campo di forza e poi fallo saltare in aria. Questo dovrebbe sprigionare l'energia sufficiente a disattivare il campo di forza.","私の案はフォースフィールドの近くに鉱石を置き撃って爆発させる方法よ。 +"My suggestion is, toss the ore at the forcefield and then blast it. The resulting compression should create a magnetic blanket and turn off the lights.",TXT_SUB_LOG99,MAP14: After James's room.,,,"Můj návrh je, hoď rudu na to silové pole a pak ji odstřel. Výsledná komprese by měla vytvořit magnetický povlak a vypnout pole.","Mit forslag er, at kaste malmen mod kraftfeltet og derefter sprænge det. Den resulterende kompression skulle skabe et magnetisk tæppe og slukke lyset.","Mein Vorschlag wäre, das Erz vor das Kraftfeld zu legen und dann explodieren zu lassen. Die resultierende Kompression sollte ein Magnetfeld erzeugen und die Lichter ausgehen lassen.",,,"Mi sugerencia es, tirar el mineral hacia el campo de fuerza y luego reventarlo, la presión resultante debería crear un manto magnético y apagar las luces.",,"Ehdotukseni on, että heität malmin voimakentään ja sitten posautat sen. Syntyvän paineaallon pitäisi muodostaa magneettinen peitto ja sammuttaa valot.",Ma suggestion: jette le minerai sur le champ de force puis tire dessus. La compression qui en résulte devrait créer un champ magnétique qui va désactiver les lumières.,,"Az a tanácsom, hogy dobd az ércet az erőpajzsra, és robbantsd fel. A keletkező kompresszió egy mágneses takarót kéne hogy képezzen, így kikapcsolva a fényeket.","Il mio consiglio è, lancia uno dei minerali al campo di forza e poi fallo saltare in aria. Questo dovrebbe sprigionare l'energia sufficiente a disattivare il campo di forza.","私の案はフォースフィールドの近くに鉱石を置き撃って爆発させる方法よ。 その結果、圧縮されていた磁場の反動で光を打ち消すわ。","조언을 찾는다면, 광석을 방어막에 가까이 놔둔 뒤 쏴봐. 광석이 커다란 자기장을 만들 테고, 방어막을 완전히 무력화 시킬 거야. 불 끄는거지!",Mijn suggestie is om het erts naar het krachtveld te gooien en het vervolgens op te blazen. De resulterende compressie zou een magnetische deken moeten creëren en de lichten moeten doven.,Mitt forslag er å kaste malmen mot kraftfeltet og sprenge det. Den resulterende kompresjonen bør skape et magnetisk teppe og slå av lysene.,Proponuję rzucić rudę w pole siłowe i wysadzić je. Powstała kompresja powinna stworzyć koc magnetyczny i wyłączyć światła.,Minha sugestão é que você arremesse o minério no campo de força e o detone. A explosão vai criar um campo magnético e apagar as luzes.,,"Sugstia mea e, aruncă minereul în scut și aruncă-l în aer. Comprimarea rezultată ar trebui să creeze un câmp magnetic care sp oprească luminile.","Мой план: бросить руду поближе к силовому полю и взорвать её. Взрыв создаст магнитное поле, которое накроет электронику и отрубит её.",,Mitt förslag är att kasta malmen mot kraftfältet och sedan spränga det. Den resulterande kompressionen bör skapa ett magnetiskt täcke och släcka ljuset.,"Benim önerim, cevheri güç alanına fırlatın ve sonra patlatın. Ortaya çıkan sıkıştırma manyetik bir örtü oluşturmalı ve ışıkları kapatmalı." -Now on to the factory. Exit the mines and you can't miss it!,TXT_SUB_LOG100,MAP14: After destroying the transmitter.,,,A teď do továrny. Vyjdi z dolů a nemůžeš to minout.,"Nu videre til fabrikken. Gå ud af minerne, og du kan ikke undgå at se den!",Und nun zur Fabrik. Verlasse die Minen und du kannst sie nicht verpassen.,,,Ahora vamos a la fábrica. ¡Sal de las minas y no puedes perderlo!,,"Nyt sitten tehtaaseen. Poistu kaivoksesta, ja löydät sen varmasti!","Bon, maintenant, l'usine! Sors des mines et tu peux pas la rater!",Most pedig irány a gyár. Kilépve a bányából nem tudod eltéveszteni.,Ora entriamo nella Fabbrica. Uscendo dalle miniere non puoi sbagliare.,今すぐ工場へ向かおう。鉱山を出たら見逃すなよ!,이제 공장으로 향하자. 광산을 나가면 더 재밌는 모험이 펼쳐질 거야!,Nu naar de fabriek. Verlaat de mijnen en je kunt het niet missen!,"Nå videre til fabrikken. Gå ut av gruvene, og du kan ikke gå glipp av den!",Teraz przejdź do fabryki. Wyjdź z kopalni i nie możesz jej przegapić!,"Agora, para a fábrica. Saia das minas e não vai ter como errar.",,Acum către fabrică. Ieși din mine și nu o poți rata.,"Теперь — на фабрику. Выйди из шахты, и ты сразу увидишь вход!",,Nu till fabriken. Gå ut ur gruvorna och du kan inte missa den!,Şimdi fabrikaya gidelim. Madenlerden çıkın ve onu kaçırmayın! -"Sorry, hero, this is all new to me.",TXT_SUB_LOG101,MAP20: Exit to Commons (MAP23).,,,"Promiň, hrdino, tohle všechno je pro mě nové.","Undskyld, helt, det er alt sammen nyt for mig.","Entschuldigung, mein Held, das ist alles neu für mich.",,,"Lo siento, héroe, esto es nuevo para mí.",,"Pahoittelut, sankari; tämä kaikki on uutta minulle.","Désolé, héros, tout cela est nouveau pour moi.","Sajnálom hősöm, ez mind rendkívűl új számomra.","Mi spiace, eroe, ma tutto ciò è nuovo per me.",ごめんなさい、これは初耳なの。,"미안, 영웅 친구... 이런 곳은 처음 봐.","Sorry, held, dit is allemaal nieuw voor mij.","Beklager, helt, dette er nytt for meg.","Wybacz, bohaterze, to wszystko jest dla mnie nowe.","Foi mal, meu herói, tudo isso é novo pra mim.","Desculpa, meu herói, tudo isto é novo para mim.","Scuze, eroule, asta e nou pentru mine.","Извини, герой. Для меня это всё в новинку.",,"Ledsen, hjälte, allt detta är nytt för mig.","Üzgünüm kahraman, bunların hepsi benim için yeni." -I'm reading massive neural wave distortions from straight ahead. I think we've found it.,TXT_SUB_LOG102,MAP20: Path to Conversion Chapel (MAP24).,,,"Detekuju obří rušení nervových vln přímo před námi. Myslím, že jsme to našli.","Jeg læser massive neurale bølgeforvridninger lige forude. Jeg tror, vi har fundet det.","Ich empfange massive neurale Verzerrungen direkt voraus. Ich denke, wir haben sie gefunden.",,,Estoy leyendo distorsiones de ondas neuronales masivas adelante. Creo que la hemos encontrado.,Estoy leyendo distorsiones neuronales masivas adelante. Creo que la hemos encontrado.,Havaitsen massivisia hermoaaltovääristymiä suoraan edessä. Luulen löytäneemme sen.,Je recois des distorsions neurales colossales devant nous. Je crois que nous l'avons trouvé. ,Erős ideghullám zavaró jeleket fogok. Azt hiszem megtaláltuk.,Sto ricevendo potenti segnali distorti proprio davanti a te. Penso che l'abbiamo trovata.,重い神経波の歪曲が直に届いたわ。私達はそれを見つけたという事よ。,앞쪽에서 거대한 신경교란 파장이 감지되고 있어. 우리가 찾아낸 것 같아.,Ik lees enorme neurale golfvervormingen van rechtdoor. Ik denk dat we het gevonden hebben.,Jeg leser massive nevrale bølgeforvrengninger rett fram. Jeg tror vi har funnet den.,Odczytuję masywne zakłócenia fal neuronowych z prostej drogi. Chyba to znaleźliśmy.,Estou captando enormes distorções de rede neural mais adiante. Acho que encontramos.,,Citesc distorsiuni neurale masive drept din față. Cred că am găsit-o.,"Я вижу мощный источник помех прямо по курсу. Похоже, мы нашли конвертер.",,Jag läser massiva neurala vågförvrängningar rakt fram. Jag tror att vi har hittat den.,Tam karşıdan büyük sinirsel dalga bozulmaları okuyorum. Sanırım onu bulduk. -Just when I think we've seen it all! They go in human and come out... I dont even want to think about it.,TXT_SUB_LOG103,MAP24: Converter room.,,,"Zrovna, když jsem myslela, že jsme už viděli všechno! Dovnitř jdou jako lidé a ven vyjdou... ani na to nechci myslet.","Lige når jeg tror, vi har set det hele! De går ind i et menneske og kommer ud... Jeg vil ikke engang tænke på det.","Und da denkt man, man hätte schon alles gesehen. Die kommen als Menschen rein und kommen raus als... Ich möchte gar nicht drüber nachdenken.",,,¡Justo cuando creía haberlo visto todo! Entran humanos y salen... No quiero ni pensarlo. ,,Juuri kun luulen nähneemme kaiken! He menevät sisään ihmisinä ja tulevat ulos... En halua edes ajatellakaan sitä.,"Et quand je pense avoir tout vu.. Des humains entrent, et puis.. Non, je ne veux pas y penser. ","Amikor azt hittem, hogy mindent láttunk. Emberként mennek be, és úgy jönnek ki mint egy...nem is akarok rá gondolni.",E io che pensavo di averle viste tutte! Entrano umani ed escono fuori... Non ci voglio neanche pensare.,"今まで見てきたことについて考えている! +Now on to the factory. Exit the mines and you can't miss it!,TXT_SUB_LOG100,MAP14: After destroying the transmitter.,,,A teď do továrny. Vyjdi z dolů a nemůžeš to minout.,"Nu videre til fabrikken. Gå ud af minerne, og du kan ikke undgå at se den!",Und nun zur Fabrik. Verlasse die Minen und du kannst sie nicht verpassen.,,,Ahora vamos a la fábrica. ¡Sal de las minas y no puedes perderlo!,,"Nyt sitten tehtaaseen. Poistu kaivoksesta, ja löydät sen varmasti!","Bon, maintenant, l'usine! Sors des mines et tu peux pas la rater!",,Most pedig irány a gyár. Kilépve a bányából nem tudod eltéveszteni.,Ora entriamo nella Fabbrica. Uscendo dalle miniere non puoi sbagliare.,今すぐ工場へ向かおう。鉱山を出たら見逃すなよ!,이제 공장으로 향하자. 광산을 나가면 더 재밌는 모험이 펼쳐질 거야!,Nu naar de fabriek. Verlaat de mijnen en je kunt het niet missen!,"Nå videre til fabrikken. Gå ut av gruvene, og du kan ikke gå glipp av den!",Teraz przejdź do fabryki. Wyjdź z kopalni i nie możesz jej przegapić!,"Agora, para a fábrica. Saia das minas e não vai ter como errar.",,Acum către fabrică. Ieși din mine și nu o poți rata.,"Теперь — на фабрику. Выйди из шахты, и ты сразу увидишь вход!",,Nu till fabriken. Gå ut ur gruvorna och du kan inte missa den!,Şimdi fabrikaya gidelim. Madenlerden çıkın ve onu kaçırmayın! +"Sorry, hero, this is all new to me.",TXT_SUB_LOG101,MAP20: Exit to Commons (MAP23).,,,"Promiň, hrdino, tohle všechno je pro mě nové.","Undskyld, helt, det er alt sammen nyt for mig.","Entschuldigung, mein Held, das ist alles neu für mich.",,,"Lo siento, héroe, esto es nuevo para mí.",,"Pahoittelut, sankari; tämä kaikki on uutta minulle.","Désolé, héros, tout cela est nouveau pour moi.",,"Sajnálom hősöm, ez mind rendkívűl új számomra.","Mi spiace, eroe, ma tutto ciò è nuovo per me.",ごめんなさい、これは初耳なの。,"미안, 영웅 친구... 이런 곳은 처음 봐.","Sorry, held, dit is allemaal nieuw voor mij.","Beklager, helt, dette er nytt for meg.","Wybacz, bohaterze, to wszystko jest dla mnie nowe.","Foi mal, meu herói, tudo isso é novo pra mim.","Desculpa, meu herói, tudo isto é novo para mim.","Scuze, eroule, asta e nou pentru mine.","Извини, герой. Для меня это всё в новинку.",,"Ledsen, hjälte, allt detta är nytt för mig.","Üzgünüm kahraman, bunların hepsi benim için yeni." +I'm reading massive neural wave distortions from straight ahead. I think we've found it.,TXT_SUB_LOG102,MAP20: Path to Conversion Chapel (MAP24).,,,"Detekuju obří rušení nervových vln přímo před námi. Myslím, že jsme to našli.","Jeg læser massive neurale bølgeforvridninger lige forude. Jeg tror, vi har fundet det.","Ich empfange massive neurale Verzerrungen direkt voraus. Ich denke, wir haben sie gefunden.",,,Estoy leyendo distorsiones de ondas neuronales masivas adelante. Creo que la hemos encontrado.,Estoy leyendo distorsiones neuronales masivas adelante. Creo que la hemos encontrado.,Havaitsen massivisia hermoaaltovääristymiä suoraan edessä. Luulen löytäneemme sen.,Je recois des distorsions neurales colossales devant nous. Je crois que nous l'avons trouvé. ,,Erős ideghullám zavaró jeleket fogok. Azt hiszem megtaláltuk.,Sto ricevendo potenti segnali distorti proprio davanti a te. Penso che l'abbiamo trovata.,重い神経波の歪曲が直に届いたわ。私達はそれを見つけたという事よ。,앞쪽에서 거대한 신경교란 파장이 감지되고 있어. 우리가 찾아낸 것 같아.,Ik lees enorme neurale golfvervormingen van rechtdoor. Ik denk dat we het gevonden hebben.,Jeg leser massive nevrale bølgeforvrengninger rett fram. Jeg tror vi har funnet den.,Odczytuję masywne zakłócenia fal neuronowych z prostej drogi. Chyba to znaleźliśmy.,Estou captando enormes distorções de rede neural mais adiante. Acho que encontramos.,,Citesc distorsiuni neurale masive drept din față. Cred că am găsit-o.,"Я вижу мощный источник помех прямо по курсу. Похоже, мы нашли конвертер.",,Jag läser massiva neurala vågförvrängningar rakt fram. Jag tror att vi har hittat den.,Tam karşıdan büyük sinirsel dalga bozulmaları okuyorum. Sanırım onu bulduk. +Just when I think we've seen it all! They go in human and come out... I dont even want to think about it.,TXT_SUB_LOG103,MAP24: Converter room.,,,"Zrovna, když jsem myslela, že jsme už viděli všechno! Dovnitř jdou jako lidé a ven vyjdou... ani na to nechci myslet.","Lige når jeg tror, vi har set det hele! De går ind i et menneske og kommer ud... Jeg vil ikke engang tænke på det.","Und da denkt man, man hätte schon alles gesehen. Die kommen als Menschen rein und kommen raus als... Ich möchte gar nicht drüber nachdenken.",,,¡Justo cuando creía haberlo visto todo! Entran humanos y salen... No quiero ni pensarlo. ,,Juuri kun luulen nähneemme kaiken! He menevät sisään ihmisinä ja tulevat ulos... En halua edes ajatellakaan sitä.,"Et quand je pense avoir tout vu.. Des humains entrent, et puis.. Non, je ne veux pas y penser. ",,"Amikor azt hittem, hogy mindent láttunk. Emberként mennek be, és úgy jönnek ki mint egy...nem is akarok rá gondolni.",E io che pensavo di averle viste tutte! Entrano umani ed escono fuori... Non ci voglio neanche pensare.,"今まで見てきたことについて考えている! 奴は人の内部から出てくる...それについて考えたくないわ。",이렇게 끔찍한 모습을 보게 되다니! 멀쩡한 사람이 저곳에 들어갔다 나온 모습을... 차마 생각하기도 싫어.,Net nu ik denk dat we het allemaal hebben gezien! Ze gaan in de mens en komen eruit.... Ik wil er niet eens over nadenken.,Akkurat når jeg tror vi har sett alt! De går inn som mennesker og kommer ut... Jeg vil ikke engang tenke på det.,"Właśnie wtedy, gdy myślałem, że widzieliśmy już wszystko! Wchodzą w człowieka i wychodzą... Nawet nie chcę o tym myśleć.",E eu achei que já tinha visto de tudo! Eles entram humanos e saem... eu não quero nem pensar nisso.,,Tocmai când credeam că am văzut tot! Intră oameni și ies... nici nu vreau să mă gândesc.,"А я-то думала, что хуже уже не будет! Они входят людьми, а выходят... Не хочу даже думать об этом.",,Precis när jag tror att vi har sett allt! De går in i en människa och kommer ut... Jag vill inte ens tänka på det.,Tam da her şeyi gördüğümüzü düşündüğüm anda! İnsana giriyorlar ve çıkıyorlar. Bunu düşünmek bile istemiyorum. -The Oracle was right. Macil's gone nuts. He just knowingly sent 200 men to their death. I want vengeance. For the dead and for the living dead!,TXT_SUB_LOG104,MAP24: After destroying the converter.,,,Věštec měl pravdu. Macil zešílel. Vědomě poslal dvě stě mužů na smrt. Chci odplatu - za mrtvé i živé mrtvé!,Oraklet havde ret. Macil er blevet skør. Han har lige bevidst sendt 200 mænd i døden. Jeg vil have hævn. For de døde og for de levende døde!,Das Orakel hatte Recht. Macil hat den Verstand verloren. Er hat gerade absichtlich 200 unserer Leute in den Tod geschickt. Ich will Rache! Für die Toten und für die lebenden Toten.,,,"El Oráculo tenía razón. Macil se ha vuelto loco: ha enviado intencionalmente a 200 hombres directo a la muerte. Quiero venganza, ¡por los muertos y los muertos vivientes!","El Oráculo tenía razón. Macil se volvió loco: mandó intencionalmente a 200 hombres directo a la muerte. Quiero venganza, ¡por los muertos y los muertos vivientes!","Oraakkeli oli oikeassa: Macil on tullut hulluksi. Hän juuri lähetti tietoisesti 200 miestä surmaansa. Vaadin kostoa, sekä kuolleitten että elävien kuolleitten puolesta!","Macil a complètement perdu les pédales! Il a envoyé 200 hommes se faire tuer, et il le savait! Il faut les venger, pour eux et pour leurs camarades!",Az Orákulumnak igaza volt. macil megőrült. Szándékosan küldött 200 emberünket a halálába. Meg akarom bosszúlni a halottak és az élő halottak nevében!,L'Oracolo aveva ragione. Macil deve essere impazzito. Ha mandato consciamente 200 uomini verso la morte. Voglio vendetta! Per i morti e per i morti viventi!,"オラクルが正しかった。マシルはイカれていたなんて。 +The Oracle was right. Macil's gone nuts. He just knowingly sent 200 men to their death. I want vengeance. For the dead and for the living dead!,TXT_SUB_LOG104,MAP24: After destroying the converter.,,,Věštec měl pravdu. Macil zešílel. Vědomě poslal dvě stě mužů na smrt. Chci odplatu - za mrtvé i živé mrtvé!,Oraklet havde ret. Macil er blevet skør. Han har lige bevidst sendt 200 mænd i døden. Jeg vil have hævn. For de døde og for de levende døde!,Das Orakel hatte Recht. Macil hat den Verstand verloren. Er hat gerade absichtlich 200 unserer Leute in den Tod geschickt. Ich will Rache! Für die Toten und für die lebenden Toten.,,,"El Oráculo tenía razón. Macil se ha vuelto loco: ha enviado intencionalmente a 200 hombres directo a la muerte. Quiero venganza, ¡por los muertos y los muertos vivientes!","El Oráculo tenía razón. Macil se volvió loco: mandó intencionalmente a 200 hombres directo a la muerte. Quiero venganza, ¡por los muertos y los muertos vivientes!","Oraakkeli oli oikeassa: Macil on tullut hulluksi. Hän juuri lähetti tietoisesti 200 miestä surmaansa. Vaadin kostoa, sekä kuolleitten että elävien kuolleitten puolesta!","Macil a complètement perdu les pédales! Il a envoyé 200 hommes se faire tuer, et il le savait! Il faut les venger, pour eux et pour leurs camarades!",,Az Orákulumnak igaza volt. macil megőrült. Szándékosan küldött 200 emberünket a halálába. Meg akarom bosszúlni a halottak és az élő halottak nevében!,L'Oracolo aveva ragione. Macil deve essere impazzito. Ha mandato consciamente 200 uomini verso la morte. Voglio vendetta! Per i morti e per i morti viventi!,"オラクルが正しかった。マシルはイカれていたなんて。 彼は故意に200人以上の人々を死に追いやっていた。 復讐しなくては。死んだ人達の為、そして今生きている人達の為にも!",마실이 정신 나갔나 봐. 모든 것을 알면서도 200 명이나 되는 병력을 보내서 죽게 했어. 과부들과 망령들을 위한 복수를 할 시간이야!,Het Orakel had gelijk. Macil is gek geworden. Hij stuurde gewoon bewust 200 mannen naar hun dood. Ik wil wraak. Voor de doden en voor de levende doden!,Oraklet hadde rett. Macil har gått fra vettet. Han sendte 200 menn i døden med viten og vilje. Jeg vil ha hevn. For de døde og for de levende døde!,Wyrocznia miała rację. Macilowi odbiło. Właśnie świadomie wysłał 200 ludzi na śmierć. Chcę zemsty. Za zmarłych i za żywych zmarłych!,O Oráculo estava certo. O Macil enlouqueceu. Ele mandou 200 homens para as suas mortes sabendo disso. Eu quero vingança. Pelos mortos e pelos mortos-vivos!,,Oracolul avea dreptate. Macil a înnebunit. A trimis în mod voit 200 oameni la moarte. Vreau răzbunare! Pentru morți și morții vii!,Оракул сказал правду: Мэйсил озверел. Он намеренно послал двести человек на верную смерть. Я жажду мести! За убитых и за живых мертвецов!,,Oraklet hade rätt. Macil har blivit galen. Han skickade just medvetet 200 män i döden. Jag vill ha hämnd. För de döda och för de levande döda!,Kahin haklıydı. Macil delirmiş. Bile bile 200 adamı ölüme gönderdi. İntikam istiyorum. Ölüler ve yaşayan ölüler için! -"Macil? Infected and with a Sigil piece. All these years of believing in him, in the cause. And for what?",TXT_SUB_LOG105,,,,"Macil? Nakažený a s dílem Pečeti? Všechny ty roky, kdy jsme mu a naší věci důvěřovali. A k čemu?","Macil? Inficeret og med et Sigil stykke. I alle disse år har jeg troet på ham, på sagen. Og for hvad?","Macil? Infiziert und mit einen Sigli-Teil? All diese Jahre, die ich an ihn geglaubt habe - an die Sache. Und für was?",,,¿Macil infectado con una pieza del Emblema? Y todos estos años de creer en el... en la causa... ¿Y todo para qué?,,"Macil, tartunnan saanut ja pitää hallussaan Sinetin osasta? Kaikki nämä vuodet uskoen häneen, aatteeseen. Ja minkä tähden?",Macil? Infecté par une pièce du Sigil. Toutes ces années où je lui ai fait confiance.. à la cause.. Et pour quoi à la fin?,"Macil? Meg van fertőzve, és van nála egy Pecsét darab is. Én pedig hittem neki évekig, hittem az ügyben. És miért?","Macil? Infettato e con un pezzo del Sigillo. Tutti questi anni passati a credere in lui, e alla causa. E per cosa?",,마실? 시질 조각에 의해 오염됬어. 수 년 동안 믿어온 우리가 바보인가? 아니면 이 운명을 피할 수 없었던 걸까?,"Macil? Geïnfecteerd en met een Sigil stuk. Al die jaren van geloof in hem, in de oorzaak. En waarvoor?","Macil? Infisert og med en Sigil-brikke. I alle disse årene har jeg trodd på ham, på saken... Og for hva?","Macil? Zainfekowany i z kawałkiem Sigil. Przez te wszystkie lata wierzyłem w niego, w sprawę. I po co?","Macil? Infectado e com uma peça do Sigilo. Todos esses anos acreditando nele, acreditando na causa. E pra quê?",,"Macil? Infectat și cu o bucată de Sigiliu. Toți anii crezând în cauza lui, și pentru ce?","Мэйсил? Заражённый... И у него фрагмент Печати. Все эти годы я верила ему, верила в нашу миссию. А теперь?",,"Macil? Infekterad och med en Sigil-bit. Under alla dessa år har jag trott på honom, på saken. Och för vad?","Macil mi? Enfekte olmuş ve bir Sigil parçasıyla. Bunca yıl ona inandım, davaya inandım. Peki ne için?" -"Richter reports that the factory we destroyed leads to a ""lab"", and they're getting a Sigil power signature from within. Back to the factory and our next step to freedom.",TXT_SUB_LOG106,MAP10: After killing Macil while having destroyed the converter in MAP24.,,,"Richter hlásí, že továrna, kterou jsme zničili, vede do „laboratoře“ a detekují z ní energii Pečetě. Zpátky do továrny a našemu dalšímu kroku ke svobodě.","Richter rapporterer, at den fabrik, vi ødelagde, fører til et ""laboratorium"", og at de får en Sigil-kraftsignatur derindefra. Tilbage til fabrikken og vores næste skridt mod frihed.","Richter sagt, in der Fabrik, die wir zerstört haben, gäbe es ein „Labor“, und dort gibt es eine Sigil-Signatur. Zurück zur Fabrik und dem nächsten Schritt zu unserer Freiheit.",,,"Richter informa de que la fábrica que destruimos conduce a un ""laboratorio"", y están recibiendo una señal de poder del Emblema de adentro. De vuelta a la fábrica y nuestro siguiente paso a la libertad.",,"Richter ilmoittaa, että tuhoamamme tehdas johtaa ""laboratorioon"", ja he lukevat sisältä Sinettiosasen energiajälkiä. Takaisin tehtaaseen ja kohti seuraavaa askeltamme vapauteen.","Richter rapporte que l'usine que l'on a détruit mène à un ""laboratoire"" et qu'il s'y trouve une signature de pièce du Sigil à l'intérieur. Retourne à l'usine et on fera un autre pas vers la liberté.","Richter jelentése szerint a felrobbantott gyár egy ""laboratóriumba"" vezet, és a Pecsét jelét sugározza belülről. Tehát a szabadságunk felé teendő következő lépés a gyárnál kezdődik.","Richter ci comunica che la Fabbrica che abbiamo distrutto porta a un ""laboratorio"", ed al suo interno è stato identificato un segnale di un pezzo del Sigillo. Ritorniamo alla fabbrica e il nostro prossimo passo per la libertà.","リヒターの報告では我々が破壊した工場は'研究所'に繋がっていて、 +"Macil? Infected and with a Sigil piece. All these years of believing in him, in the cause. And for what?",TXT_SUB_LOG105,,,,"Macil? Nakažený a s dílem Pečeti? Všechny ty roky, kdy jsme mu a naší věci důvěřovali. A k čemu?","Macil? Inficeret og med et Sigil stykke. I alle disse år har jeg troet på ham, på sagen. Og for hvad?","Macil? Infiziert und mit einen Sigli-Teil? All diese Jahre, die ich an ihn geglaubt habe - an die Sache. Und für was?",,,¿Macil infectado con una pieza del Emblema? Y todos estos años de creer en el... en la causa... ¿Y todo para qué?,,"Macil, tartunnan saanut ja pitää hallussaan Sinetin osasta? Kaikki nämä vuodet uskoen häneen, aatteeseen. Ja minkä tähden?",Macil? Infecté par une pièce du Sigil. Toutes ces années où je lui ai fait confiance.. à la cause.. Et pour quoi à la fin?,,"Macil? Meg van fertőzve, és van nála egy Pecsét darab is. Én pedig hittem neki évekig, hittem az ügyben. És miért?","Macil? Infettato e con un pezzo del Sigillo. Tutti questi anni passati a credere in lui, e alla causa. E per cosa?",,마실? 시질 조각에 의해 오염됬어. 수 년 동안 믿어온 우리가 바보인가? 아니면 이 운명을 피할 수 없었던 걸까?,"Macil? Geïnfecteerd en met een Sigil stuk. Al die jaren van geloof in hem, in de oorzaak. En waarvoor?","Macil? Infisert og med en Sigil-brikke. I alle disse årene har jeg trodd på ham, på saken... Og for hva?","Macil? Zainfekowany i z kawałkiem Sigil. Przez te wszystkie lata wierzyłem w niego, w sprawę. I po co?","Macil? Infectado e com uma peça do Sigilo. Todos esses anos acreditando nele, acreditando na causa. E pra quê?",,"Macil? Infectat și cu o bucată de Sigiliu. Toți anii crezând în cauza lui, și pentru ce?","Мэйсил? Заражённый... И у него фрагмент Печати. Все эти годы я верила ему, верила в нашу миссию. А теперь?",,"Macil? Infekterad och med en Sigil-bit. Under alla dessa år har jag trott på honom, på saken. Och för vad?","Macil mi? Enfekte olmuş ve bir Sigil parçasıyla. Bunca yıl ona inandım, davaya inandım. Peki ne için?" +"Richter reports that the factory we destroyed leads to a ""lab"", and they're getting a Sigil power signature from within. Back to the factory and our next step to freedom.",TXT_SUB_LOG106,MAP10: After killing Macil while having destroyed the converter in MAP24.,,,"Richter hlásí, že továrna, kterou jsme zničili, vede do „laboratoře“ a detekují z ní energii Pečetě. Zpátky do továrny a našemu dalšímu kroku ke svobodě.","Richter rapporterer, at den fabrik, vi ødelagde, fører til et ""laboratorium"", og at de får en Sigil-kraftsignatur derindefra. Tilbage til fabrikken og vores næste skridt mod frihed.","Richter sagt, in der Fabrik, die wir zerstört haben, gäbe es ein „Labor“, und dort gibt es eine Sigil-Signatur. Zurück zur Fabrik und dem nächsten Schritt zu unserer Freiheit.",,,"Richter informa de que la fábrica que destruimos conduce a un ""laboratorio"", y están recibiendo una señal de poder del Emblema de adentro. De vuelta a la fábrica y nuestro siguiente paso a la libertad.",,"Richter ilmoittaa, että tuhoamamme tehdas johtaa ""laboratorioon"", ja he lukevat sisältä Sinettiosasen energiajälkiä. Takaisin tehtaaseen ja kohti seuraavaa askeltamme vapauteen.","Richter rapporte que l'usine que l'on a détruit mène à un ""laboratoire"" et qu'il s'y trouve une signature de pièce du Sigil à l'intérieur. Retourne à l'usine et on fera un autre pas vers la liberté.",,"Richter jelentése szerint a felrobbantott gyár egy ""laboratóriumba"" vezet, és a Pecsét jelét sugározza belülről. Tehát a szabadságunk felé teendő következő lépés a gyárnál kezdődik.","Richter ci comunica che la Fabbrica che abbiamo distrutto porta a un ""laboratorio"", ed al suo interno è stato identificato un segnale di un pezzo del Sigillo. Ritorniamo alla fabbrica e il nostro prossimo passo per la libertà.","リヒターの報告では我々が破壊した工場は'研究所'に繋がっていて、 奴等はシジルの調印を内部から得ている。工場に戻って自由への次の段階に進みましょう",릭터가 말하길 우리가 파괴한 공장은 연구소로 향하는 길이 있대. 그리고 그곳에는 시질 특유의 힘이 감지됐어. 공장으로 돌아가서 자유를 위해 계속 투쟁을 하자.,"Richter meldt dat de fabriek die we vernietigd hebben, leidt naar een ""lab"", en ze krijgen een Sigil power signatuur van binnenuit. Terug naar de fabriek en onze volgende stap naar vrijheid.","Richter rapporterer at fabrikken vi ødela fører til en ""lab"", og at de får en Sigil-kraftsignatur innenfra. Tilbake til fabrikken og vårt neste skritt mot frihet.","Richter donosi, że zniszczona przez nas fabryka prowadzi do ""laboratorium"", a oni otrzymują z niego sygnaturę mocy Sigil. Wracamy do fabryki i naszego kolejnego kroku do wolności.","O Richter disse que a fábrica que destruímos leva a um ""laboratório"" e eles estão captando um sinal de energia lá de dentro. De volta à fábrica e ao nosso próximo passo à liberdade.",,"Richter raportează că fabrica duce către un laborator, și sunt alimentați e puterea unui Sigiliu din interior. Înapoi la fabrică și următorul pas spre libertate.","Рихтер сообщает, что за разрушенной нами фабрикой лежит «лаборатория», и мы засекли характерную энергию фрагмента Печати, исходящую оттуда. Возвращайся на фабрику — сделаем ещё один шаг к нашему освобождению.",,"Richter rapporterar att fabriken som vi förstörde leder till ett ""labb"" och att de får en Sigil-kraftsignatur därifrån. Tillbaka till fabriken och vårt nästa steg mot frihet.","Richter, yok ettiğimiz fabrikanın bir laboratuvara çıktığını ve oradan Sigil gücü sinyali aldıklarını bildirdi. Fabrikaya ve özgürlüğe giden bir sonraki adımımıza dönelim." -Who dares to defy me and enter my fortress? A worthless human? Face me and die!,TXT_SUB_LOG120,MAP16: Entrance → Central door.,,,Kdo se to opovažuje mi vzdorovat a vkročit do mé pevnosti? Bezcenný člověk? Postav se mi a zemři!,Hvem vover at trodse mig og gå ind i min fæstning? Et værdiløst menneske? Se mig i øjnene og dø!,Wer wagt es mir zu trotzen und meine Festung zu betreten? Ein wertloser Mensch? Stelle dich mir und stirb!,,,¿Quién se atreve a desafiarme y entrar en mi fortaleza? ¿Un insignificante humano? ¡Enfréntate a mí y muere!,¿Quién se atreve a desafiarme y entrar a mi fortaleza? ¿Un insignificante humano? ¡Enfréntate a mí y muere!,Kuka kehtaa uhmata minua ja astua sisään linnoitukseeni? Arvoton ihminen? Kohtaa minut ja kuole!,Qui ose me défier et pénétrer ma forteresse? Un humain sans valeur? Faites face à moi et mourrez!,"Ki mer belépni az erődítményebe és ellenszegülni nekem? Egy jelentéktelen ember? Gyere állj ki ellenem, had szedjelek szét!",Chi osa sfidarmi ed entrare nella mia fortezza? Un inutile umano? Affrontami e muori!,"我に歯向かう為に敢えて私の要塞に来たのか?無価値な人間よ? +Who dares to defy me and enter my fortress? A worthless human? Face me and die!,TXT_SUB_LOG120,MAP16: Entrance → Central door.,,,Kdo se to opovažuje mi vzdorovat a vkročit do mé pevnosti? Bezcenný člověk? Postav se mi a zemři!,Hvem vover at trodse mig og gå ind i min fæstning? Et værdiløst menneske? Se mig i øjnene og dø!,Wer wagt es mir zu trotzen und meine Festung zu betreten? Ein wertloser Mensch? Stelle dich mir und stirb!,,,¿Quién se atreve a desafiarme y entrar en mi fortaleza? ¿Un insignificante humano? ¡Enfréntate a mí y muere!,¿Quién se atreve a desafiarme y entrar a mi fortaleza? ¿Un insignificante humano? ¡Enfréntate a mí y muere!,Kuka kehtaa uhmata minua ja astua sisään linnoitukseeni? Arvoton ihminen? Kohtaa minut ja kuole!,Qui ose me défier et pénétrer ma forteresse? Un humain sans valeur? Faites face à moi et mourrez!,,"Ki mer belépni az erődítményebe és ellenszegülni nekem? Egy jelentéktelen ember? Gyere állj ki ellenem, had szedjelek szét!",Chi osa sfidarmi ed entrare nella mia fortezza? Un inutile umano? Affrontami e muori!,"我に歯向かう為に敢えて私の要塞に来たのか?無価値な人間よ? 死をくれてやろう!",감히 어떤 자가 이 몸을 반역하고 요새를 침입한 것이더냐? 나약한 인간이구나. 이 몸의 의해 소멸당해라.,Wie durft mij uit te dagen en mijn vesting binnen te gaan? Een waardeloos mens? Kijk me aan en sterf!,Hvem våger å trosse meg og gå inn i festningen min? Et verdiløst menneske? Møt meg og dø!,Kto ośmieli się przeciwstawić mi i wejść do mojej twierdzy? Bezwartościowy człowiek? Zmierz się ze mną i zgiń!,Quem ousa me desafiar e entrar na minha fortaleza? Um humano insignificante? Enfrente-me e morra!,,Cine îndrăznește să mă înfrunte? Un om jalnic? Înfruntă-mă și mori!,Кто смеет бросать мне вызов и вторгаться в мою крепость? Жалкий человечишка? Сразись со мной и умри!,,Vem vågar trotsa mig och gå in i min fästning? En värdelös människa? Ställ dig inför mig och dö!,Kim bana meydan okuyup kaleme girmeye cüret eder? Değersiz bir insan mı? Benimle yüzleş ve öl! -You cannot kill me. You are just human. And I am more than human.,TXT_SUB_LOG121,MAP16: Boss room unlocked → Bishop,,,Nemůžeš mě zabít. Jsi jen člověk a já jsem víc než člověk.,Du kan ikke dræbe mig. Du er bare et menneske. Og jeg er mere end et menneske.,Du kannst mich nicht töten. Du bist nur ein Mensch. Und ich bin mehr als das.,,,No puedes matarme. Eres solo humano. Y yo soy más que humano.,,"Et voi tappaa minua. Sinä olet vain ihminen, ja minä olen enemmän kuin ihminen.",Vous ne pouvez me tuer. Vous n'êtes qu'un humain. Je suis plus qu'un humain.,Nem tudsz megölni. Csak egy ember vagy. Én pedig már több vagyok mint ember.,Non puoi uccidermi. Tu sei solo umano. E io sono più che umano.,我を殺すことはできまい。貴様は人間。そして私は人間を超えし者だ。,"이 몸은 너에게 사살 당할 수 없다. 이 몸은 초월한 존재, 인간 따위를 넘었기에!",Je kunt me niet doden. Je bent gewoon een mens. En ik ben meer dan een mens.,Du kan ikke drepe meg. Du er bare et menneske. Og jeg er mer enn et menneske.,Nie możesz mnie zabić. Jesteś tylko człowiekiem. A ja jestem czymś więcej niż człowiekiem.,Você não pode me matar. Você é apenas humano. E eu sou mais do que humano.,,"Nu mă poți ucide. Ești doar un om, iar eu sunt mai mult decât atât.","Тебе не убить меня. Ты всего лишь человек. А я нечто большее, чем человек!",,Du kan inte döda mig. Du är bara en människa. Och jag är mer än människa.,Beni öldüremezsin. Sen sadece insansın. Ve ben insandan daha fazlasıyım. +You cannot kill me. You are just human. And I am more than human.,TXT_SUB_LOG121,MAP16: Boss room unlocked → Bishop,,,Nemůžeš mě zabít. Jsi jen člověk a já jsem víc než člověk.,Du kan ikke dræbe mig. Du er bare et menneske. Og jeg er mere end et menneske.,Du kannst mich nicht töten. Du bist nur ein Mensch. Und ich bin mehr als das.,,,No puedes matarme. Eres solo humano. Y yo soy más que humano.,,"Et voi tappaa minua. Sinä olet vain ihminen, ja minä olen enemmän kuin ihminen.",Vous ne pouvez me tuer. Vous n'êtes qu'un humain. Je suis plus qu'un humain.,,Nem tudsz megölni. Csak egy ember vagy. Én pedig már több vagyok mint ember.,Non puoi uccidermi. Tu sei solo umano. E io sono più che umano.,我を殺すことはできまい。貴様は人間。そして私は人間を超えし者だ。,"이 몸은 너에게 사살 당할 수 없다. 이 몸은 초월한 존재, 인간 따위를 넘었기에!",Je kunt me niet doden. Je bent gewoon een mens. En ik ben meer dan een mens.,Du kan ikke drepe meg. Du er bare et menneske. Og jeg er mer enn et menneske.,Nie możesz mnie zabić. Jesteś tylko człowiekiem. A ja jestem czymś więcej niż człowiekiem.,Você não pode me matar. Você é apenas humano. E eu sou mais do que humano.,,"Nu mă poți ucide. Ești doar un om, iar eu sunt mai mult decât atât.","Тебе не убить меня. Ты всего лишь человек. А я нечто большее, чем человек!",,Du kan inte döda mig. Du är bara en människa. Och jag är mer än människa.,Beni öldüremezsin. Sen sadece insansın. Ve ben insandan daha fazlasıyım. "No death, eternal life and more. Much more! This is my task: cyborgs, half flesh, half steel, all to serve the One God. You do not serve? You die! This putz has another piece of the Sigil.",TXT_SUB_LOG122,"SVE.WAD MAP12: If the player first kills Macil and then the Oracle's spectre before killing the Loremaster with Classic Mode turned off. It talks the Loremaster and BlackBird.",,,"- Žádná smrt, nekonečný život a více, mnohem více! To je mé poslání: kyborgové, napůl tělo, napůl ocel, obojí sloužící Jednomu bohu. Nesloužíš? Zemřeš! - Ten hajzl má další díl Pečeti.","Ingen død, evigt liv og mere. Meget mere! Dette er min opgave: Cyborgs, halvt kød, halvt stål, alt sammen for at tjene den ene Gud. Du tjener ikke? Du dør! Denne idiot har endnu et stykke af sigilet.","Kein Tod, ewiges Leben und mehr. Viel mehr! Dies ist meine Aufgabe: Cyborgs, halb Fleisch, halb Stahl, alle um einen Gott zu dienen. Du dienst nicht? Du stirbst! Dieser Idiot hat ein weiteres Teil des Sigils.",,,"No muerte, vida eterna y más. ¡Mucho más! Esta es mi tarea: cyborgs, mitad carne, mitad acero, todo para servir al Dios Único. ¿Tú no lo sirves? ¡Tú mueres! Este zoquete tiene otra pieza del emblema.",,"Ei kuolemaa, vaan ikuinen elämä ja enemmän, paljon enemmän! Tämä on tehtäväni: Kyborgit, puoliksi lihaa, puoliksi terästä; kaikkien tehtävänä palvellla Yhtä Jumalaa. Et palvele? Kuolet! -Tällä kahjolla on toinen Sinetin osanen.","Pas de mort: la vie éternelle et plus, bien plus! Cela est mon but: cyborgs, moitié chair, moitié acier, un tout pour servir le Seul Dieu. Vous ne servez pas? Vous mourrez! Ce dégénéré a une autre pièce du Sigil.","Semmi halál, halhatatlanság és még sok más. Sok-sok más! A következő a feladatom: kiborgok gyártása, félig ember félig gép aki az Egy Igaz Istent szolgálja. Te nem Őt szolgálod? Akkor meglakolsz! Ennél a pancsernél van egy pecsét darab.","Nessuna morte, vita eterna ed altro ancora. Molto altro! Questo è il mio compito: cyborg, metà carne, metà acciaio, tutti per servire l'Unico Dio. Tu non lo servi! Tu muori! Questo imbecille ha un altro pezzo del Sigillo.","不死、更に永遠の命なぞない! +Tällä kahjolla on toinen Sinetin osanen.","Pas de mort: la vie éternelle et plus, bien plus! Cela est mon but: cyborgs, moitié chair, moitié acier, un tout pour servir le Seul Dieu. Vous ne servez pas? Vous mourrez! Ce dégénéré a une autre pièce du Sigil.",,"Semmi halál, halhatatlanság és még sok más. Sok-sok más! A következő a feladatom: kiborgok gyártása, félig ember félig gép aki az Egy Igaz Istent szolgálja. Te nem Őt szolgálod? Akkor meglakolsz! Ennél a pancsernél van egy pecsét darab.","Nessuna morte, vita eterna ed altro ancora. Molto altro! Questo è il mio compito: cyborg, metà carne, metà acciaio, tutti per servire l'Unico Dio. Tu non lo servi! Tu muori! Questo imbecille ha un altro pezzo del Sigillo.","不死、更に永遠の命なぞない! これが私の任務だ:サイボーグ達、半人間半機械、全ては唯一神に従うため。 お前は従わないと?では死ね!この愚か者がシジルの欠片を持っている。","영생, 불사, 뛰어난 지능, 이 몸은 많은 걸 지니고 있소! 강화인간, 생채병기, 반신반체, 오더를 위하여 더욱이 연구해야 하오. 이 몸의 의지에 반역하는 것이라면, 사라지시오! \cy이 미친놈은 시질 조각을 가지고 있어.","Geen dood, eeuwig leven en meer. Veel meer! Dit is mijn taak: cyborgs, half vlees, half staal, half staal, allemaal om de Ene God te dienen. Jullie dienen niet? Je sterft! @@ -12802,7 +12802,7 @@ Esse imbecil possui outra peça do Sigilo.",,"Nu moarte, viață eternă, și ma ",,"Ingen död, evigt liv och mycket mer. Mycket mer! Detta är min uppgift: cyborgs, halvt kött, halvt stål, allt för att tjäna den ende Guden. Du tjänar inte? Du dör! Den här idioten har ytterligare en bit av Sigillet.","Ölüm yok, sonsuz yaşam ve daha fazlası. Çok daha fazlası! Benim görevim bu: Cyborglar, yarı et, yarı çelik, hepsi Tek Tanrı'ya hizmet etmek için. Hizmet etmiyor musun? Ölürsünüz! Bu salakta Sigil'in bir parçası daha var." -"Ha ha! Welcome. I have waited for this moment. I have waited for a fool like you to bring me my freedom. Your tiny planet is mine, and you will wish you were never born! ",TXT_SUB_LOG128,MAP29: Entity (If the player is progressing through the mediocre ending),,,"Ha há! Vítej. Čekala jsem na tento okamžik. Čekala jsem na blázna jako ty, který by mi přinesl svobodu. Tvá drobná planeta je moje a ty si budeš přát, že ses nikdy nenarodil!","Ha ha! Velkommen. Jeg har ventet på dette øjeblik. Jeg har ventet på at et fjols som dig skulle bringe mig min frihed. Din lille planet er min, og du vil ønske, at du aldrig var blevet født!","Ha ha! Willkommen. Ich habe auf diesen Moment gewartet, dass ein Narr wie du mir meine Freiheit bringt. Dein kleiner Planet ist mein, und du wirst dir wünschen nie geboren worden zu sein!",,,"¡Ha ha! Bienvenido. He estado esperando este momento. He estado esperando a un necio como tú para traerme mi libertad. ¡Tu pequeño planeta es mío, y desearás no haber nacido!",,"Hahaa! Tervetuloa, olen odottanut tätä hetkeä. Olen odottanut kaltaistasi hölmöä tuomaan minulle minun vapauteni. Pikkuinen planeettanne on minun, ja tulet toivomaan, ettet olisi ikinä syntynytkään!","Ha ha! Bienvenue, j'ai attendu ce moment. J'ai attendu qu'un idiot comme vous me rende ma liberté. Votre pathétique planète m'appartient, et bientôt, vous allez tous regretter d'être nés!","Há há! Nincs mit. Erre a pillanatra vágytam. Arra vártom, hogy egy bolond elhozza nekem a szabadságot. A kicsike bolygód immáron az enyém, és azt fogod kívánni hogy bárcsak meg se születtél volna.","Ha ha! Benvenuto. Ho aspettato questo momento. Ho aspettato uno stolto come te per ridarmi la libertà. Il tuo patetico pianeta è nelle mie mani, e tu presto rimpiangerai di essere nato.","ハッハッハ!ようこそ。私はこの瞬間を待ってイタ。 +"Ha ha! Welcome. I have waited for this moment. I have waited for a fool like you to bring me my freedom. Your tiny planet is mine, and you will wish you were never born! ",TXT_SUB_LOG128,MAP29: Entity (If the player is progressing through the mediocre ending),,,"Ha há! Vítej. Čekala jsem na tento okamžik. Čekala jsem na blázna jako ty, který by mi přinesl svobodu. Tvá drobná planeta je moje a ty si budeš přát, že ses nikdy nenarodil!","Ha ha! Velkommen. Jeg har ventet på dette øjeblik. Jeg har ventet på at et fjols som dig skulle bringe mig min frihed. Din lille planet er min, og du vil ønske, at du aldrig var blevet født!","Ha ha! Willkommen. Ich habe auf diesen Moment gewartet, dass ein Narr wie du mir meine Freiheit bringt. Dein kleiner Planet ist mein, und du wirst dir wünschen nie geboren worden zu sein!",,,"¡Ha ha! Bienvenido. He estado esperando este momento. He estado esperando a un necio como tú para traerme mi libertad. ¡Tu pequeño planeta es mío, y desearás no haber nacido!",,"Hahaa! Tervetuloa, olen odottanut tätä hetkeä. Olen odottanut kaltaistasi hölmöä tuomaan minulle minun vapauteni. Pikkuinen planeettanne on minun, ja tulet toivomaan, ettet olisi ikinä syntynytkään!","Ha ha! Bienvenue, j'ai attendu ce moment. J'ai attendu qu'un idiot comme vous me rende ma liberté. Votre pathétique planète m'appartient, et bientôt, vous allez tous regretter d'être nés!",,"Há há! Nincs mit. Erre a pillanatra vágytam. Arra vártom, hogy egy bolond elhozza nekem a szabadságot. A kicsike bolygód immáron az enyém, és azt fogod kívánni hogy bárcsak meg se születtél volna.","Ha ha! Benvenuto. Ho aspettato questo momento. Ho aspettato uno stolto come te per ridarmi la libertà. Il tuo patetico pianeta è nelle mie mani, e tu presto rimpiangerai di essere nato.","ハッハッハ!ようこそ。私はこの瞬間を待ってイタ。 自由を得る為、アンタの様な愚か者を待っていたノダ。 キサマのワクセイはワタシのモノだ、ソシテ生マレタコトニ後悔スルデアロウ。 ","하하, 이 순간만을 기다리고 있었노라. 그대와 같은 어리석은 자가 짐을 풀어줄 순간을. 그대의 조그만 행성은 이제 짐의 것이고, 그대는 태어난 것을 후회하게 될 것이니라!","Ha ha! Welkom. Ik heb op dit moment gewacht. Ik heb gewacht op een dwaas als jij om mij mijn vrijheid te brengen. Jouw kleine planeet is de mijne, en je zult wensen dat je nooit geboren was!","Ha ha! Velkommen. Jeg har ventet på dette øyeblikket. Jeg har ventet på dette øyeblikket. Jeg har ventet på at en tosk som deg skulle gi meg min frihet. Din lille planet er min, og du vil ønske at du aldri ble født!","Ha ha! Witam. Czekałem na tę chwilę. Czekałem, aż taki głupiec jak ty przyniesie mi wolność. Twoja mała planeta jest moja, a ty będziesz żałował, że się nie urodziłeś!",Ha ha! Bem-vindo. Eu esperei por este momento. Esperei por um tolo como você trazer a minha liberdade. O seu planeta insignificante é meu e você vai desejar nunca ter nascido!,,"Ha ha! Bun-venit. Am așteptat momentul. Am așteptat pentru un prost ca tine să îmi aducă libertatea. Planeta la minusculă e a mea, și tu îți vei dori să nu te fii născut!","Ха-ха! Приветствую. Я так долго ждала! Я ждала, что идиот вроде тебя освободит меня. Эта крошечная планета моя, и сейчас ты пожалеешь, что родился на свет!",,"Ha ha! Välkommen. Jag har väntat på det här ögonblicket. Jag har väntat på att en idiot som du ska ge mig min frihet. Din lilla planet är min, och du kommer att önska att du aldrig föddes!",Ha ha! Hoş geldiniz. Bu anı bekledim. Senin gibi bir aptalın bana özgürlüğümü getirmesini bekledim. Küçük gezegenin benim olacak ve sen hiç doğmamış olmayı dileyeceksin! @@ -12813,7 +12813,7 @@ Jeg er træt af denne mystiske dobbelttale.","Die Warheit kann nur universell ge Ich habe genug von diesem mystischen Rumgeschwafel.",,,"La verdad solo puede ser encontrada en la voluntad universal. Te arrodillarás en frente del Dios Único, la Luz Única. Únete a mi y completaré el Emblema. Estoy cansado de habladuría mística.",,"Totuus löytyy ainoastaan maailmankaikkeuden yleistahdosta. Lankeat polvillesi Totisen Jumalan, Yhden Valon, edessä. Liity minuun, ja täytän Sinetin. Olen korviani myöten täynnä tätä mystistä hölynpölyä.","La vérité se trouve seulement dans la volonté universelle. Vous allez vous prosterner devant le Seul Dieu, la Seule Lumière. Rejoins-moi et je complèterai le Sigil. -J'en ai eu assez de ce charabia mystique.","Az igazság az univerzum akaratától függ. Térdre fogsz rogyni az Egy Igaz isten, az Egy Fény előtt. Csatlakozz hozzám, és összerakjuk a Pecsétet. Elegem van a misztikus dupla értelmű tanmesékből.","La verità è solo nella volontà universale. Ti inchinerai all'Unico Dio, la sola luce. Vieni con me e io completerò il Sigillo. +J'en ai eu assez de ce charabia mystique.",,"Az igazság az univerzum akaratától függ. Térdre fogsz rogyni az Egy Igaz isten, az Egy Fény előtt. Csatlakozz hozzám, és összerakjuk a Pecsétet. Elegem van a misztikus dupla értelmű tanmesékből.","La verità è solo nella volontà universale. Ti inchinerai all'Unico Dio, la sola luce. Vieni con me e io completerò il Sigillo. Ne ho abbastanza di questo mistico messaggio senza senso.","真実は普遍的な意志でしか見つけられない。 お前は唯一神の前に跪くのだ、希望の光よ。 私の元に着き、シジルを完成させるのだ。この神秘的な戯言もうんざりする。","초월적인 힘을 가짐으로써 진정한 진실을 찾을 수가 있소. 당신은 이 세계의 유일신, 진정한 빛의 막강함에 의해 무릎을 꿇을 것이오. 종지부를 피하려면 시질을 건네고, 우리를 따르시오! @@ -12825,102 +12825,102 @@ Já estou cansada de toda essa ladainha mística.",,"Adevărul poate fi găsit d — Меня тошнит от этой таинственной двуличной болтовни!",,"Sanningen kan bara hittas i den universella viljan. Ni kommer att falla på knä framför den sanna guden, det enda ljuset. Gör mig sällskap och jag kommer att fullborda Sigillet. Jag är trött på detta mystiska dubbelprat.","Gerçek sadece evrensel iradede bulunabilir. Gerçek Tanrı'nın, Tek Işık'ın önünde diz çökeceksin. Bana katılın ve ben de Sigil'i tamamlayayım. Bu mistik ikili konuşmalardan bıktım." -"You... You have crushed my Order, torn through my ruses and threatened centuries of desire. But I will prevail, I will infect you and twist you to my will...",TXT_SUB_LOG130,MAP29: Entity (If the player is progressing through the good ending),,,"Ty... Tys rozdrtil můj Řád, proskočil mými lstmi a ohrozil staletí chtíče. Ale já přetrvám. Já tě nakazím a zkazím, tak, jak chci...","Du... Du har knust min orden, revet mine kneb igennem og truet århundreders begær. Men jeg vil sejre, jeg vil inficere dig og dreje dig til min vilje...","Du... du hast meinen Orden zerstört, meine Fallen überwunden und jahrelange Wünsche gefährdet. Aber ich werde siegen, ich werde dich infizieren und dich meinem Willen beugen...",,,"Tú... Tú has aplastado mi Orden, destrozado mis engaños y amenazado siglos de deseo. Pero yo prevareceré, te infectaré y retorceré a mi voluntad...",,"Sinä... Sinä olet murskannut Veljeskuntani, tunkenut läpi ansojeni ja uhannut vuosisatoja palanutta halua. Mutta olen vielä voittava; tartutan sinut ja väännän sinut tahtooni...","Vous.. Vous avez anéanti mon Ordre, percé à travers le voile de mes ruses et menacé des siècle de désirs. Mais je gagnerai, je vous infecterai et vous plierai à ma volonté...","Te...Te voltál aki szétmorzsolta a Rendemet, letépted a trükkök palástyát, és évszázadok kívánatát borítottad fel. Akkor is győzedelmeskedni fogok, megferzőzlek és az akaratomnak megfelelően foglak torzítani...","Tu... hai schiacciato il mio Ordine, hai rovinato i miei piani e minacciato secoli di desideri. Ma io vincerò, ti infetterò e ti piegherò alla mia volontà...","キサマ...キサマハ我ガオーダーヲ破壊シニシタ、 +"You... You have crushed my Order, torn through my ruses and threatened centuries of desire. But I will prevail, I will infect you and twist you to my will...",TXT_SUB_LOG130,MAP29: Entity (If the player is progressing through the good ending),,,"Ty... Tys rozdrtil můj Řád, proskočil mými lstmi a ohrozil staletí chtíče. Ale já přetrvám. Já tě nakazím a zkazím, tak, jak chci...","Du... Du har knust min orden, revet mine kneb igennem og truet århundreders begær. Men jeg vil sejre, jeg vil inficere dig og dreje dig til min vilje...","Du... du hast meinen Orden zerstört, meine Fallen überwunden und jahrelange Wünsche gefährdet. Aber ich werde siegen, ich werde dich infizieren und dich meinem Willen beugen...",,,"Tú... Tú has aplastado mi Orden, destrozado mis engaños y amenazado siglos de deseo. Pero yo prevareceré, te infectaré y retorceré a mi voluntad...",,"Sinä... Sinä olet murskannut Veljeskuntani, tunkenut läpi ansojeni ja uhannut vuosisatoja palanutta halua. Mutta olen vielä voittava; tartutan sinut ja väännän sinut tahtooni...","Vous.. Vous avez anéanti mon Ordre, percé à travers le voile de mes ruses et menacé des siècle de désirs. Mais je gagnerai, je vous infecterai et vous plierai à ma volonté...",,"Te...Te voltál aki szétmorzsolta a Rendemet, letépted a trükkök palástyát, és évszázadok kívánatát borítottad fel. Akkor is győzedelmeskedni fogok, megferzőzlek és az akaratomnak megfelelően foglak torzítani...","Tu... hai schiacciato il mio Ordine, hai rovinato i miei piani e minacciato secoli di desideri. Ma io vincerò, ti infetterò e ti piegherò alla mia volontà...","キサマ...キサマハ我ガオーダーヲ破壊シニシタ、 我ノ詭謀ヲ截チ何世紀ニモワタル望ミヲ脅カシタ。 ダガマダ終ワリデハナイ、キサマニ憑キ意志ヲヒネリ出セバ... ","그대... 짐의 명령을 거부하고, 많은 것을 빼앗았고, 수 백 년 동안의 욕망을 위협했느니라. 그러나 짐은, 그대를 침식하여 짐의 의지에 복종하도록 만들 것이니라...","Jullie hebben mijn Orde verpletterd, door mijn listen heen gescheurd en eeuwen van verlangen bedreigd. Maar ik zal zegevieren, ik zal je besmetten en je naar mijn wil draaien....","Du... Du har knust min Orden, gjennomskuet mine knep og truet århundrer av begjær. Men jeg vil seire, jeg vil infisere deg og vri deg til min vilje...","Ty... Zmiażdżyłeś mój Zakon, przedarłeś się przez moje podstępy i zagroziłeś wiekom pożądania. Ale ja zwyciężę, zainfekuję cię i zmienię na swoją wolę...","Você... você destruiu a minha Ordem, destroçou meus truques e ameaçou séculos de desejo. Mas eu vou prevalecer. Infectarei você e vou manipulá-lo à minha vontade...",,"Tu... Tu mi-ai strivit Ordinul, și mi-ai amenințat secole de dorință. Dar voi învinge, te voi infecta și îți voi pervertii voința...","Ты... Ты разгромил мой Орден, прорвался через мои ловушки и сделал столетия ожидания напрасными. Но тебе не победить — я заражу тебя и подчиню своей воле!",,"Du... Du har krossat min ordning, slitit igenom mina knep och hotat århundraden av begär. Men jag kommer att segra, jag kommer att infektera dig och vrida dig till min vilja...","Sen... Düzenimi yıktın, hilelerimi parçaladın ve yüzyıllardır süren arzularımı tehdit ettin. Ama ben galip geleceğim, sana bulaşacağım ve seni kendi isteğime dönüştüreceğim." -"Sounds like a dream job, doesn't it?",TXT_SUB_LOG200,,,,"Zní jako práce snů, ne?","Det lyder som et drømmejob, ikke sandt?","Hört sich wie ein Traumjob an, nicht wahr?",,,"Suena a un trabajo ideal, ¿no?",,Eikö kuulostakin unelmapestiltä?,"Le job de vos rêves, non?","Úgy tűnik mint egy álam meló, ugye?","Sembra un lavoro da sogno, no?",,바라던 일 같네. 그렇지 않아?,"Klinkt als een droombaan, nietwaar?","Høres ut som en drømmejobb, ikke sant?","Brzmi jak praca marzeń, prawda?","Parece ser o emprego ideal, não é mesmo?",,"Sună a vis, nu?","Звучит как работа мечты, не так ли?",,"Låter som ett drömjobb, eller hur?","Rüya gibi bir iş, değil mi?" -"You've seen too much. Ice him, Macil!",TXT_SUB_LOG201,,,,"Viděl jsi moc. Zab ho, Macile!","Du har set for meget. Islæg ham, Macil!","Du hast genug gesehen. Mach ihn kalt, Macil!",,,"Has visto demasiado. ¡Acaba con él, Macil!",,"Olet nähnyt liikaa. Murskaa hänet, Macil!","Vous en avez trop vu. Descend-le, Macil!",Túl sokat láttál. öld meg Macil!,"Hai visto troppo. Fallo fuori, Macil!",,"넌 많은 걸 봤어. 얼려버려, 마실!","Je hebt te veel gezien. Ijs hem, Macil!","Du har sett for mye. Legg ham på is, Macil!","Widziałeś już zbyt wiele. Lód, Macil!","Você já viu demais. Acaba com ele, Macil!",,"Ai văzut prea mult. Îngheață-l, Macil!","Ты слишком много видел. Заморозь его, Мэйсил!",,"Du har sett för mycket. Isa honom, Macil!","Çok fazla şey gördün. Buzla onu, Macil!" +"Sounds like a dream job, doesn't it?",TXT_SUB_LOG200,,,,"Zní jako práce snů, ne?","Det lyder som et drømmejob, ikke sandt?","Hört sich wie ein Traumjob an, nicht wahr?",,,"Suena a un trabajo ideal, ¿no?",,Eikö kuulostakin unelmapestiltä?,"Le job de vos rêves, non?",,"Úgy tűnik mint egy álam meló, ugye?","Sembra un lavoro da sogno, no?",,바라던 일 같네. 그렇지 않아?,"Klinkt als een droombaan, nietwaar?","Høres ut som en drømmejobb, ikke sant?","Brzmi jak praca marzeń, prawda?","Parece ser o emprego ideal, não é mesmo?",,"Sună a vis, nu?","Звучит как работа мечты, не так ли?",,"Låter som ett drömjobb, eller hur?","Rüya gibi bir iş, değil mi?" +"You've seen too much. Ice him, Macil!",TXT_SUB_LOG201,,,,"Viděl jsi moc. Zab ho, Macile!","Du har set for meget. Islæg ham, Macil!","Du hast genug gesehen. Mach ihn kalt, Macil!",,,"Has visto demasiado. ¡Acaba con él, Macil!",,"Olet nähnyt liikaa. Murskaa hänet, Macil!","Vous en avez trop vu. Descend-le, Macil!",,Túl sokat láttál. öld meg Macil!,"Hai visto troppo. Fallo fuori, Macil!",,"넌 많은 걸 봤어. 얼려버려, 마실!","Je hebt te veel gezien. Ijs hem, Macil!","Du har sett for mye. Legg ham på is, Macil!","Widziałeś już zbyt wiele. Lód, Macil!","Você já viu demais. Acaba com ele, Macil!",,"Ai văzut prea mult. Îngheață-l, Macil!","Ты слишком много видел. Заморозь его, Мэйсил!",,"Du har sett för mycket. Isa honom, Macil!","Çok fazla şey gördün. Buzla onu, Macil!" "Next time, you'll listen to me.",TXT_SUB_LOG202,"(Strife: Veteran Edition) -Random comment when the player dies with Classic Mode turned off",,,Příště budeš poslouchat mě.,Næste gang vil du lytte til mig.,Nächstes Mal hörst du auf mich.,,,"La próxima vez, me harás caso.",,Ensi kerralla saat luvan kuunnella minua.,"La prochaine fois, tu m'écouteras.",Majd legközelebb hallgatsz rám.,"La prossima volta, mi ascolterai.",今度は、私の言う事を聞きなさいよ。,"다음번엔, 내 말을 좀 들어. ",Volgende keer luister je naar me.,Neste gang hører du på meg.,Następnym razem mnie posłuchasz.,"Da próxima vez, você vai me ouvir.",,"Data viitoare, o să mă asculți.","Будешь знать, как меня не слушать.",,Nästa gång lyssnar du på mig.,Bir dahaki sefere beni dinlersin. -"Ugh, these post-apocalyptic prices...",TXT_SUB_LOG203,,,,"Uf, tyhle postapokalyptické ceny...",Disse post-apokalyptiske priser...,"Ugh, diese postapokalyptischen Preise...",,,"Ugh, estos precios post-apocalípticos...",,"Ääh, näitä maailmanlopun jälkeisiä hintoja...","Eugh, ces prix post-apocalyptiques..","Fú, ezek az apokalipszis utáni árak...","Ugh, questi prezzi post-apocalittici...",,"으윽, 세기말 가격이네.","Ugh, deze post-apocalyptische prijzen....",Disse postapokalyptiske prisene...,"Ugh, te postapokaliptyczne ceny...","Urgh, esses preços pós-apocalípticos...",,"Ugh, prețurile ăstea post-apocaliptice...","Ух, эти цены после апокалипсиса...",,De här postapokalyptiska priserna...,Bu kıyamet sonrası fiyatları. -Take the big one. He won't stop you.,TXT_SUB_LOG204,,,,Rozdej si to s tím velkým. Nezastaví tě.,Tag den store. Han vil ikke stoppe dig.,"Nimm das große, Er wird dich nicht stoppen.",,,Toma el grande. No te detendrá.,,Ota iso. Hän ei estä sinua.,"Prends le gros, il ne t'arrètera pas.",Vidd el a nagyot. Nem fog beléd kötni.,Prendi quello più grande. Non ti fermerà.,,커다란 놈을 막아. 둔하니까.,Neem de grote. Hij zal je niet tegenhouden.,Ta den store. Han vil ikke stoppe deg.,Weź dużą. Nie zatrzyma cię.,Leve o grandão. Ele não vai te deter.,,"Ia-l pe cel mare, nu te va opri.",Бери самую крупную. Он тебя не остановит.,,Ta den stora. Han kommer inte att stoppa dig.,Büyük olanı al. Seni durdurmayacak. -Don't dawdle. Straight ahead!,TXT_SUB_LOG205,,,,Neloudej se. Jdi rovně!,Du skal ikke tøve. Lige fremad!,Trödel nicht rum. Direkt voraus!,,,No te pares. ¡Sigue adelante!,,Älä vitkastele. Suoraan eteenpäin!,"Ne traîne pas, tout devant!",Ne vesztegesd az időt. Csak egyenesen!,Non indulgiare. Vai avanti!,,꾸물거리지 말고 빨리 움직여야 해! ,Niet treuzelen. Rechtdoor!,Ikke somle. Rett fram!,Nie ociągaj się. Prosto przed siebie!,Não pare. Siga adiante!,,Nu te lenevi. Drept în față!,Не мешкай. Прямо вперёд!,,Tröna inte. Rakt fram!,Oyalanma. Dümdüz ilerle! -You ever notice how these corridors look the same?,TXT_SUB_LOG206,,,,"Všimnul sis, jak všechny to chodby vypadají stejně?","Har du nogensinde lagt mærke til, at disse korridorer ser ens ud?","Ist dir schon mal aufgefallen, dass diese Flure alle gleich aussehen?",,,¿Alguna vez te has fijado en como estos pasillos parecen iguales?,,"Oletko koskaan huomannut, miten samanlaisilta nämä käyttävät näyttävät?",T'as pas l'impression que ces couloirs ont tous la même tête?,"Feltűnt, hogy minden folyosó ugyanúgy néz ki?",Ti sei mai accorto come tutti questi corridoi si assomiglino?,,갈 때마다 보이는 복도가 다 똑같다고 생각해본 적 있어? ,Heb je ooit gemerkt hoe deze gangen er hetzelfde uitzien?,Har du lagt merke til at korridorene ser like ut?,"Zauważyłeś, że te korytarze wyglądają tak samo?",Você já reparou como esses corredores parecem todos iguais?,,Nu observi cum coridoarele ăstea arată mereu la fel?,"Ты когда-нибудь замечал, что эти коридоры выглядят одинаково?",,Har du någonsin lagt märke till att korridorerna ser likadana ut?,Bu koridorların nasıl aynı göründüğünü hiç fark ettin mi? -"Hey, sometimes I have to guess too!",TXT_SUB_LOG207,,,,"Hej, já taky musím někdy hádat!",Nogle gange er jeg også nødt til at gætte!,"Hey, manchmal muss auch ich raten!",,,"¡Eh, a veces tambien tengo que adivinar!",,"Hei, joskus minunkin täytyy arvata!","Hé, il y a des fois où il faut aussi que je devine!",Nekem is néha találgatnom kell.,"Ehi, a volte anche io devo tirare a indovinare!",,"야, 어쩔 때는 나도 추측을 해본다고! ","Hé, soms moet ik ook raden!",Noen ganger må jeg også gjette!,"Hej, czasami ja też muszę zgadywać!","Ei, as vezes tenho que adivinhar também!",,"Hei, uneori și eu ghicesc!","Эй, иногда мне тоже приходится угадывать!",,Ibland måste jag också gissa!,"Hey, bazen ben de tahmin etmek zorunda kalıyorum!" -"Oh, and watch out for the alarm.",TXT_SUB_LOG208,,,,"Oh, a dávej pozor na alarm.","Åh, og pas på alarmen.","Oh, und achte auf den Alarm.",,,"Ah, y ten cuidado con la alarma.",,"Ja muuten, varo hälytystä.","Oh, et fais attention à l'alarme.","Ja, és vigyázz a riasztóval.","Oh, e fai attenzione all'allarme.",,"오, 그리고 경보를 조심해.","Oh, en kijk uit voor het alarm.",Se opp for alarmen.,"Aha, i uważaj na alarm.","Ah, e cuidado com o alarme.",,"Oh, și ai grijă la alarmă!",И остерегайся сигнализации.,,"Åh, och se upp för larmet.","Oh, ve alarma dikkat et." +Random comment when the player dies with Classic Mode turned off",,,Příště budeš poslouchat mě.,Næste gang vil du lytte til mig.,Nächstes Mal hörst du auf mich.,,,"La próxima vez, me harás caso.",,Ensi kerralla saat luvan kuunnella minua.,"La prochaine fois, tu m'écouteras.",,Majd legközelebb hallgatsz rám.,"La prossima volta, mi ascolterai.",今度は、私の言う事を聞きなさいよ。,"다음번엔, 내 말을 좀 들어. ",Volgende keer luister je naar me.,Neste gang hører du på meg.,Następnym razem mnie posłuchasz.,"Da próxima vez, você vai me ouvir.",,"Data viitoare, o să mă asculți.","Будешь знать, как меня не слушать.",,Nästa gång lyssnar du på mig.,Bir dahaki sefere beni dinlersin. +"Ugh, these post-apocalyptic prices...",TXT_SUB_LOG203,,,,"Uf, tyhle postapokalyptické ceny...",Disse post-apokalyptiske priser...,"Ugh, diese postapokalyptischen Preise...",,,"Ugh, estos precios post-apocalípticos...",,"Ääh, näitä maailmanlopun jälkeisiä hintoja...","Eugh, ces prix post-apocalyptiques..",,"Fú, ezek az apokalipszis utáni árak...","Ugh, questi prezzi post-apocalittici...",,"으윽, 세기말 가격이네.","Ugh, deze post-apocalyptische prijzen....",Disse postapokalyptiske prisene...,"Ugh, te postapokaliptyczne ceny...","Urgh, esses preços pós-apocalípticos...",,"Ugh, prețurile ăstea post-apocaliptice...","Ух, эти цены после апокалипсиса...",,De här postapokalyptiska priserna...,Bu kıyamet sonrası fiyatları. +Take the big one. He won't stop you.,TXT_SUB_LOG204,,,,Rozdej si to s tím velkým. Nezastaví tě.,Tag den store. Han vil ikke stoppe dig.,"Nimm das große, Er wird dich nicht stoppen.",,,Toma el grande. No te detendrá.,,Ota iso. Hän ei estä sinua.,"Prends le gros, il ne t'arrètera pas.",,Vidd el a nagyot. Nem fog beléd kötni.,Prendi quello più grande. Non ti fermerà.,,커다란 놈을 막아. 둔하니까.,Neem de grote. Hij zal je niet tegenhouden.,Ta den store. Han vil ikke stoppe deg.,Weź dużą. Nie zatrzyma cię.,Leve o grandão. Ele não vai te deter.,,"Ia-l pe cel mare, nu te va opri.",Бери самую крупную. Он тебя не остановит.,,Ta den stora. Han kommer inte att stoppa dig.,Büyük olanı al. Seni durdurmayacak. +Don't dawdle. Straight ahead!,TXT_SUB_LOG205,,,,Neloudej se. Jdi rovně!,Du skal ikke tøve. Lige fremad!,Trödel nicht rum. Direkt voraus!,,,No te pares. ¡Sigue adelante!,,Älä vitkastele. Suoraan eteenpäin!,"Ne traîne pas, tout devant!",,Ne vesztegesd az időt. Csak egyenesen!,Non indulgiare. Vai avanti!,,꾸물거리지 말고 빨리 움직여야 해! ,Niet treuzelen. Rechtdoor!,Ikke somle. Rett fram!,Nie ociągaj się. Prosto przed siebie!,Não pare. Siga adiante!,,Nu te lenevi. Drept în față!,Не мешкай. Прямо вперёд!,,Tröna inte. Rakt fram!,Oyalanma. Dümdüz ilerle! +You ever notice how these corridors look the same?,TXT_SUB_LOG206,,,,"Všimnul sis, jak všechny to chodby vypadají stejně?","Har du nogensinde lagt mærke til, at disse korridorer ser ens ud?","Ist dir schon mal aufgefallen, dass diese Flure alle gleich aussehen?",,,¿Alguna vez te has fijado en como estos pasillos parecen iguales?,,"Oletko koskaan huomannut, miten samanlaisilta nämä käyttävät näyttävät?",T'as pas l'impression que ces couloirs ont tous la même tête?,,"Feltűnt, hogy minden folyosó ugyanúgy néz ki?",Ti sei mai accorto come tutti questi corridoi si assomiglino?,,갈 때마다 보이는 복도가 다 똑같다고 생각해본 적 있어? ,Heb je ooit gemerkt hoe deze gangen er hetzelfde uitzien?,Har du lagt merke til at korridorene ser like ut?,"Zauważyłeś, że te korytarze wyglądają tak samo?",Você já reparou como esses corredores parecem todos iguais?,,Nu observi cum coridoarele ăstea arată mereu la fel?,"Ты когда-нибудь замечал, что эти коридоры выглядят одинаково?",,Har du någonsin lagt märke till att korridorerna ser likadana ut?,Bu koridorların nasıl aynı göründüğünü hiç fark ettin mi? +"Hey, sometimes I have to guess too!",TXT_SUB_LOG207,,,,"Hej, já taky musím někdy hádat!",Nogle gange er jeg også nødt til at gætte!,"Hey, manchmal muss auch ich raten!",,,"¡Eh, a veces tambien tengo que adivinar!",,"Hei, joskus minunkin täytyy arvata!","Hé, il y a des fois où il faut aussi que je devine!",,Nekem is néha találgatnom kell.,"Ehi, a volte anche io devo tirare a indovinare!",,"야, 어쩔 때는 나도 추측을 해본다고! ","Hé, soms moet ik ook raden!",Noen ganger må jeg også gjette!,"Hej, czasami ja też muszę zgadywać!","Ei, as vezes tenho que adivinhar também!",,"Hei, uneori și eu ghicesc!","Эй, иногда мне тоже приходится угадывать!",,Ibland måste jag också gissa!,"Hey, bazen ben de tahmin etmek zorunda kalıyorum!" +"Oh, and watch out for the alarm.",TXT_SUB_LOG208,,,,"Oh, a dávej pozor na alarm.","Åh, og pas på alarmen.","Oh, und achte auf den Alarm.",,,"Ah, y ten cuidado con la alarma.",,"Ja muuten, varo hälytystä.","Oh, et fais attention à l'alarme.",,"Ja, és vigyázz a riasztóval.","Oh, e fai attenzione all'allarme.",,"오, 그리고 경보를 조심해.","Oh, en kijk uit voor het alarm.",Se opp for alarmen.,"Aha, i uważaj na alarm.","Ah, e cuidado com o alarme.",,"Oh, și ai grijă la alarmă!",И остерегайся сигнализации.,,"Åh, och se upp för larmet.","Oh, ve alarma dikkat et." "Oh, jeez. Now look what you've done!",TXT_SUB_LOG209,"(Strife: Veteran Edition) -Random comment when the player dies with Classic Mode turned off",,,"No sakra. Koukej, cos udělal!","Åh, for pokker. Se nu, hvad du har gjort!","Oh je. Sieh nur, was du getan hast.",,,Joder. ¡Mira lo que has hecho!,Dios. ¡Mira lo que hiciste!,"Voi hemmetti. Katso nyt, mitä olet tehnyt!","Oh, zut, regarde ce que tu as fait!","Jézusom, nézd mit műveltél!","Ah, dannazione. Guarda che cosa hai fatto!",ああ、そうね。今貴方の仕出かした事を見直しなさい。,"맙소사, 무슨 짓을 저질렀는지 알기나 해?","Oh, jeez. Kijk nu wat je hebt gedaan!","Å, jøss. Se hva du har gjort!","Oh, jeezu. Zobacz, co zrobiłeś!","Ai, caramba. Olha só o que você fez!",,"Oh, vai. Ia uite ce ai făcut.","Ну блин. Только посмотри, что ты наделал!",,"Åh, herregud. Se vad du har gjort!","Oh, Tanrım. Bak ne yaptın!" +Random comment when the player dies with Classic Mode turned off",,,"No sakra. Koukej, cos udělal!","Åh, for pokker. Se nu, hvad du har gjort!","Oh je. Sieh nur, was du getan hast.",,,Joder. ¡Mira lo que has hecho!,Dios. ¡Mira lo que hiciste!,"Voi hemmetti. Katso nyt, mitä olet tehnyt!","Oh, zut, regarde ce que tu as fait!",,"Jézusom, nézd mit műveltél!","Ah, dannazione. Guarda che cosa hai fatto!",ああ、そうね。今貴方の仕出かした事を見直しなさい。,"맙소사, 무슨 짓을 저질렀는지 알기나 해?","Oh, jeez. Kijk nu wat je hebt gedaan!","Å, jøss. Se hva du har gjort!","Oh, jeezu. Zobacz, co zrobiłeś!","Ai, caramba. Olha só o que você fez!",,"Oh, vai. Ia uite ce ai făcut.","Ну блин. Только посмотри, что ты наделал!",,"Åh, herregud. Se vad du har gjort!","Oh, Tanrım. Bak ne yaptın!" Shit. Now you've blown it!,TXT_SUB_LOG210,"(Strife: Veteran Edition) -Random comment when the player dies with Classic Mode turned off",,,Do prdele. Teď jsi to podělal!,Pis. Nu har du ødelagt det!,"Mist, du hast es verbockt.",,,Mierda. ¡Ya la has liado!,Carajo. ¡Ya metiste la pata!,"Vittu, nyt meni ihan reisille!","Merde, t'as vraiment tout foutu en l'air!",Francba. Lebuktattál minket!,Merda. Ora hai davvero rovinato tutto!,クソが。アンタ今、台無しにしたぞ!,"제길, 다 망쳐 놓았네!",Shit. Nu heb je het verpest!,Pokker... Nå har du ødelagt det!,Cholera. Teraz to spieprzyłeś!,Merda. Agora você ferrou tudo!,,Rahat. Acum ai distrus totul!,"Чёрт, ты всё испортил!",,Fan också. Nu har du förstört det!,Kahretsin. Şimdi de sen mahvettin! -Come on! Let's get the hell out of here.,TXT_SUB_LOG211,MAP15: Computer destroyed + Room 1,,,No tak! Dostaňme se sakra odsud.,Kom nu! Lad os komme væk herfra.,Komm schon! Lass uns auf der Stelle von hier verschwinden.,,,¡Venga! Larguémonos de aquí.,¡Vamos! Vayámonos de aquí.,Mennään! Häivytään täältä hittoon.,Allez! Sortons d'ici!,Gyerünk húzzunk innen a francba!,Avanti! Andiamocene da qui!,頼むぞ!こっからとっとと失せろ!,빨리! 여길 어서 벗어나야 해!,Kom op! Laten we hier als de sodemieter weggaan.,Nå har du ødelagt det! Kom igjen! La oss komme oss til helvete ut herfra.,No dalej! Wynośmy się stąd.,Vem! Vamos vazar daqui.,,"Haide, să ieșim de aici.",Ну же! Двигаем отсюда!,,Kom igen! Nu sticker vi härifrån.,"Hadi, hadi! Buradan defolup gidelim." -Ooh. You don't mess around.,TXT_SUB_LOG212,,,,"Hmm, ty se nepáráš.",Ooh. Du laver ikke sjov.,Oh. Du lässt nichts anbrennen.,,,Ooh. No pierdes el tiempo.,,"Ooh, et turhia pelleile.","Oooh, tu n'y va pas de main morte.","Ajaj, látom nem tökölsz.",Ooh. Non sei uno che scherza.,,"오, 너 이 일에 정말 진지하구나?",Ooh. Je rotzooit niet.,Ooh. Du tuller ikke.,Ooh. Nie wygłupiaj się.,Oooh. Você não perde tempo mesmo.,,Ooh. Nu te joci.,Ооо. Ты знаешь своё дело.,,Ooh. Du är inte en sån jävel.,Ooh. Hiç oyalanmıyorsun. -You're going to mount them on the wall! Keep going!,TXT_SUB_LOG213,,,,Takhle je přišpendlíš ke zdi! Pokračuj a jdi dál!,Du skal montere dem på væggen! Fortsæt!,Willst du sie an der Wand anmontieren? Geh weiter!,,,¡Vas a montarlos en la pared! ¡Sigue!,,Ripustat heidät seinälle! Jatka vain!,Tu vas les clouer au mur! Continue!,Majd szépen kirakod a fejüket trófeának. Csak így tovább!,Li incollerai al muro! Continua così!,,저 녀석들을 모두 벽에 처박아놓자. 힘내! ,Je gaat ze aan de muur bevestigen! Ga door!,Du skal montere dem på veggen! Fortsett!,Zamierzasz je zamontować na ścianie! Dalej!,Você vai montá-los na parede! Continua!,,O să le pună pe zid! Continuă să mergi!,Тебе нужно закрепить их на стене! Продолжай в том же духе!,,Du ska montera dem på väggen! Fortsätt!,Onları duvara monte edeceksin! Devam et! -Mm. You are a brute.,TXT_SUB_LOG214,,,,"Mhm, ty jsi ale surovec.",Mm. Du er en brutal mand.,Hm. Du bist aber ein Rohling.,,,Mm. Eres un bruto.,,"Mm, olet julma peto.","Mm, tu est une brute.",Hm. Egy állat vagy.,Mm. Sei un bruto.,,"음, 넌 괴물이야.",Mm. Je bent een bruut.,Mm. Du er et råskinn.,Mm. Jesteś brutalem.,"Hmm, seu brutamontes.",,Mm. Ești o brută.,Мм. Ты грубиян.,,Mm. Du är ett vilddjur.,Mm. Sen bir hayvansın. -Got a nice rhythm going here.,TXT_SUB_LOG215,,,,Máme tu teď hezký rytmus.,Du har en god rytme her.,Wir haben hier einen netten Rhythmus drauf.,,,Estás siguiendo un buen ritmo.,,Ehti kiva rytmi muodostua.,On a un bon rythme là.,Jó ütemben haladunk.,Siamo entrati in un bel ritmo qua.,,생각보다 박자가 잘 맞는데?,Ik heb hier een mooi ritme.,Har en fin rytme her.,Mamy tu ładny rytm.,Tá rolando um rítmo bom.,,Mișto ritm.,У тебя хороший ритм.,,Du har en bra rytm.,Burada güzel bir ritim var. -Ooh. Love that boom-boom stick.,TXT_SUB_LOG216,,,,"Oh, pěkná brokáda.",Ooh. Jeg elsker den boom-boom-pind.,Ooh. Tolles Schießeisen.,,,Ooh. Me encanta.,,"Ooh, rakastan tuota tussaria.","Ooh, j'adore ce truc qui fait boum.","Áhh, imádom a söri-sörétest.",Ooh. Adoro quel fucile.,,저 빵야-빵야 막대기 너무나도 좋은걸? ,Ooh. Ik hou van die boom-boom stok.,Ooh. Elsker den boom-boom pinnen.,Ooh. Kocham ten boom-boom stick.,"Oooh, adoro.",,Ooh. Îmi place arma aceea nimicitoare.,О. Обожаю эту палку-взрывалку.,,Ooh. Jag älskar den där boom-boom-pinnen.,Ooh. Bu bum-bum sopasını seviyorum. -Mm. I like the way you carry yourself.,TXT_SUB_LOG217,,,,"Mhm, líbí se mi, jak se neseš.","Jeg elsker denne boom-boom-boom. Jeg kan godt lide den måde, du bærer dig selv på.","Hm. Ich finde es toll, wie du dich präsentierst.",,,Mm. Me gusta como te lo montas.,,"Mm, pidän käytöksestäsi.","Mm, j'aime comment tu te porte.",Hm. Tetszik a magabiztosságod.,Mi piace il modo in cui ti comporti.,,너 스스로 챙기는 모습이 정말 보기 좋아. ,Mm. Ik hou van de manier waarop je jezelf draagt.,Mm. Jeg liker måten du bærer deg selv på.,"Mm. Lubię sposób, w jaki się nosisz.","Hmm, estou gostando de como você está indo.",,Ooh. Îmi place cum te descuri.,"Мм. Мне нравится, как ты ведёшь дело.",,Jag gillar den här bommen. Jag gillar ditt sätt att bära dig själv.,Mm. Kendini taşıma şeklini seviyorum. -Blast away! They're not human!,TXT_SUB_LOG218,,,,Jen střílej! Nejsou to lidé!,Blast away! De er ikke menneskelige!,Mach sie alle! Das sind keine Menschen!,,,¡Reviéntalos! ¡No son humanos!,,Antaa palaa! Ne eivät ole ihmisiä!,"Eclate-les, ils ne sont pas humains!",Meghalsz! Nem is vagy ember!,Falli fuori! Non sono umani!,,날려버려! 저놈들은 인간이 아니야! ,Blast away! Ze zijn niet menselijk!,Skyt i vei! De er ikke mennesker!,Do dzieła! To nie są ludzie!,Arrebenta neles! Eles não são humanos!,,La naiba! Nu sunt umane!,Взрывай! Они не люди!,,Blast away! De är inte mänskliga!,Patlat! Onlar insan değil! +Random comment when the player dies with Classic Mode turned off",,,Do prdele. Teď jsi to podělal!,Pis. Nu har du ødelagt det!,"Mist, du hast es verbockt.",,,Mierda. ¡Ya la has liado!,Carajo. ¡Ya metiste la pata!,"Vittu, nyt meni ihan reisille!","Merde, t'as vraiment tout foutu en l'air!",,Francba. Lebuktattál minket!,Merda. Ora hai davvero rovinato tutto!,クソが。アンタ今、台無しにしたぞ!,"제길, 다 망쳐 놓았네!",Shit. Nu heb je het verpest!,Pokker... Nå har du ødelagt det!,Cholera. Teraz to spieprzyłeś!,Merda. Agora você ferrou tudo!,,Rahat. Acum ai distrus totul!,"Чёрт, ты всё испортил!",,Fan också. Nu har du förstört det!,Kahretsin. Şimdi de sen mahvettin! +Come on! Let's get the hell out of here.,TXT_SUB_LOG211,MAP15: Computer destroyed + Room 1,,,No tak! Dostaňme se sakra odsud.,Kom nu! Lad os komme væk herfra.,Komm schon! Lass uns auf der Stelle von hier verschwinden.,,,¡Venga! Larguémonos de aquí.,¡Vamos! Vayámonos de aquí.,Mennään! Häivytään täältä hittoon.,Allez! Sortons d'ici!,,Gyerünk húzzunk innen a francba!,Avanti! Andiamocene da qui!,頼むぞ!こっからとっとと失せろ!,빨리! 여길 어서 벗어나야 해!,Kom op! Laten we hier als de sodemieter weggaan.,Nå har du ødelagt det! Kom igjen! La oss komme oss til helvete ut herfra.,No dalej! Wynośmy się stąd.,Vem! Vamos vazar daqui.,,"Haide, să ieșim de aici.",Ну же! Двигаем отсюда!,,Kom igen! Nu sticker vi härifrån.,"Hadi, hadi! Buradan defolup gidelim." +Ooh. You don't mess around.,TXT_SUB_LOG212,,,,"Hmm, ty se nepáráš.",Ooh. Du laver ikke sjov.,Oh. Du lässt nichts anbrennen.,,,Ooh. No pierdes el tiempo.,,"Ooh, et turhia pelleile.","Oooh, tu n'y va pas de main morte.",,"Ajaj, látom nem tökölsz.",Ooh. Non sei uno che scherza.,,"오, 너 이 일에 정말 진지하구나?",Ooh. Je rotzooit niet.,Ooh. Du tuller ikke.,Ooh. Nie wygłupiaj się.,Oooh. Você não perde tempo mesmo.,,Ooh. Nu te joci.,Ооо. Ты знаешь своё дело.,,Ooh. Du är inte en sån jävel.,Ooh. Hiç oyalanmıyorsun. +You're going to mount them on the wall! Keep going!,TXT_SUB_LOG213,,,,Takhle je přišpendlíš ke zdi! Pokračuj a jdi dál!,Du skal montere dem på væggen! Fortsæt!,Willst du sie an der Wand anmontieren? Geh weiter!,,,¡Vas a montarlos en la pared! ¡Sigue!,,Ripustat heidät seinälle! Jatka vain!,Tu vas les clouer au mur! Continue!,,Majd szépen kirakod a fejüket trófeának. Csak így tovább!,Li incollerai al muro! Continua così!,,저 녀석들을 모두 벽에 처박아놓자. 힘내! ,Je gaat ze aan de muur bevestigen! Ga door!,Du skal montere dem på veggen! Fortsett!,Zamierzasz je zamontować na ścianie! Dalej!,Você vai montá-los na parede! Continua!,,O să le pună pe zid! Continuă să mergi!,Тебе нужно закрепить их на стене! Продолжай в том же духе!,,Du ska montera dem på väggen! Fortsätt!,Onları duvara monte edeceksin! Devam et! +Mm. You are a brute.,TXT_SUB_LOG214,,,,"Mhm, ty jsi ale surovec.",Mm. Du er en brutal mand.,Hm. Du bist aber ein Rohling.,,,Mm. Eres un bruto.,,"Mm, olet julma peto.","Mm, tu est une brute.",,Hm. Egy állat vagy.,Mm. Sei un bruto.,,"음, 넌 괴물이야.",Mm. Je bent een bruut.,Mm. Du er et råskinn.,Mm. Jesteś brutalem.,"Hmm, seu brutamontes.",,Mm. Ești o brută.,Мм. Ты грубиян.,,Mm. Du är ett vilddjur.,Mm. Sen bir hayvansın. +Got a nice rhythm going here.,TXT_SUB_LOG215,,,,Máme tu teď hezký rytmus.,Du har en god rytme her.,Wir haben hier einen netten Rhythmus drauf.,,,Estás siguiendo un buen ritmo.,,Ehti kiva rytmi muodostua.,On a un bon rythme là.,,Jó ütemben haladunk.,Siamo entrati in un bel ritmo qua.,,생각보다 박자가 잘 맞는데?,Ik heb hier een mooi ritme.,Har en fin rytme her.,Mamy tu ładny rytm.,Tá rolando um rítmo bom.,,Mișto ritm.,У тебя хороший ритм.,,Du har en bra rytm.,Burada güzel bir ritim var. +Ooh. Love that boom-boom stick.,TXT_SUB_LOG216,,,,"Oh, pěkná brokáda.",Ooh. Jeg elsker den boom-boom-pind.,Ooh. Tolles Schießeisen.,,,Ooh. Me encanta.,,"Ooh, rakastan tuota tussaria.","Ooh, j'adore ce truc qui fait boum.",,"Áhh, imádom a söri-sörétest.",Ooh. Adoro quel fucile.,,저 빵야-빵야 막대기 너무나도 좋은걸? ,Ooh. Ik hou van die boom-boom stok.,Ooh. Elsker den boom-boom pinnen.,Ooh. Kocham ten boom-boom stick.,"Oooh, adoro.",,Ooh. Îmi place arma aceea nimicitoare.,О. Обожаю эту палку-взрывалку.,,Ooh. Jag älskar den där boom-boom-pinnen.,Ooh. Bu bum-bum sopasını seviyorum. +Mm. I like the way you carry yourself.,TXT_SUB_LOG217,,,,"Mhm, líbí se mi, jak se neseš.","Jeg elsker denne boom-boom-boom. Jeg kan godt lide den måde, du bærer dig selv på.","Hm. Ich finde es toll, wie du dich präsentierst.",,,Mm. Me gusta como te lo montas.,,"Mm, pidän käytöksestäsi.","Mm, j'aime comment tu te porte.",,Hm. Tetszik a magabiztosságod.,Mi piace il modo in cui ti comporti.,,너 스스로 챙기는 모습이 정말 보기 좋아. ,Mm. Ik hou van de manier waarop je jezelf draagt.,Mm. Jeg liker måten du bærer deg selv på.,"Mm. Lubię sposób, w jaki się nosisz.","Hmm, estou gostando de como você está indo.",,Ooh. Îmi place cum te descuri.,"Мм. Мне нравится, как ты ведёшь дело.",,Jag gillar den här bommen. Jag gillar ditt sätt att bära dig själv.,Mm. Kendini taşıma şeklini seviyorum. +Blast away! They're not human!,TXT_SUB_LOG218,,,,Jen střílej! Nejsou to lidé!,Blast away! De er ikke menneskelige!,Mach sie alle! Das sind keine Menschen!,,,¡Reviéntalos! ¡No son humanos!,,Antaa palaa! Ne eivät ole ihmisiä!,"Eclate-les, ils ne sont pas humains!",,Meghalsz! Nem is vagy ember!,Falli fuori! Non sono umani!,,날려버려! 저놈들은 인간이 아니야! ,Blast away! Ze zijn niet menselijk!,Skyt i vei! De er ikke mennesker!,Do dzieła! To nie są ludzie!,Arrebenta neles! Eles não são humanos!,,La naiba! Nu sunt umane!,Взрывай! Они не люди!,,Blast away! De är inte mänskliga!,Patlat! Onlar insan değil! Wow! Blackened Acolyte! The new taste sensation...,TXT_SUB_LOG219,"(Strife: Veteran Edition) -When obtaining the “Spontaneous Combustion” achievement",,,Wow! Zčernalý akolyta! Nové kulinářské šílenství...,Wow! Sorte Acolyt! Den nye smagsoplevelse...,Wow! Geschmorter Ministrant! Neue Geschmackssensation...,,,¡Guau! ¡Acólito ennegrecido! La nueva sensación de sabor...,,Vau! Mustaa akoluuttia! Uutuusmakuelämys!,Wow! Acolyte noirci! Goûte à la nouvelle saveur sensationelle!,Wow! Pörkölt ministráns! A szezon új íze...,Wow! Accolito scuro! Il nuovo sensazionale sapore!,うぉう!黒ずんだアコライト!新しい趣味に目覚めそうだわ...,숯 빛깔 아콜라이트라! 맛과 감각을 잘 살렸는데? ,Wow! Zwarte acoliet! De nieuwe smaaksensatie....,Jøss! Svertet akolytt! Den nye smakssensasjonen...,Wow! Czarnoskóry akolita! Nowe doznanie smakowe...,Uau! Acólito assado! Uma nova sensação de sabor...,,"Wow, Acolit Înegrit! Noua senzație...","Ух ты, обугленный служитель! Совсем другое ощущение...",,Wow! Svartklädd akolyt! Den nya smaksensationen...,Vay canına! Karartılmış yardımcı! Yeni tat hissi... -Keep doing that and you'll go blind... but I like it.,TXT_SUB_LOG220,,,,Pokračuj s tím a oslepneš... ale líbí se mi to.,"Bliv ved med det, og du bliver blind... men jeg kan lide det.",Mach so weiter und du wirst blind... aber ich finde es toll.,,,Sigue haciendo eso y te quedarás ciego... pero me gusta.,,Jatka tuota samaan malliin ja sokeudut... mutta pidän siitä.,Continue et tu vas te rendre aveugle.. j'aime bien par contre.,Ha tovább csinálod megvakulsz...mondjuk bejön.,Se continui così diventerai cieco... ma a me piace.,,이 걸 하다보면 네 눈이 좀 멀겠지만... 아찔하고 재밌는 것 같아.,Blijf dat doen en je wordt blind.... maar ik vind het leuk.,"Fortsett med det, og du blir blind... men jeg liker det.","Rób tak dalej, a oślepniesz... ale mi się podoba.",Continua fazendo isso e você ficará cego... mas eu gosto.,,Continuă să faci asta și o să orbești... dar îmi place.,Продолжай в том же духе и ты ослепнешь... но мне это нравится.,,Fortsätt med det där och du blir blind... men jag gillar det.,Bunu yapmaya devam edersen kör olacaksın... ama hoşuma gitti. -Guess they won't be inviting us back to dinner!,TXT_SUB_LOG221,,,,"Hádám, že tihle nás už na večeři zvát nebudou!","Jeg tror ikke, de inviterer os tilbage til middag!","Ich glaube nicht, dass sie uns nochmal einladen werden...",,,¡Supongo que no nos invitarán a cenar!,,Eivät varmaankaan kutsu meitä takaisin illalliselle!,Je pense qu'ils ne vont pas nous inviter à diner!,Szerintem nem hívnak vissza vacsorára.,Mi sa che non ci riinviteranno per cena!,,보답으로 저녁에 초대하지 않을 것 같아서 아쉽네! ,Ik denk dat ze ons niet meer zullen uitnodigen om terug te komen eten!,Antar de ikke vil invitere oss på middag igjen!,Chyba nie zaproszą nas z powrotem na kolację!,Acho que não vão nos convidar para jantar!,,Cred că n-o să ne invite la cină!,"Думаю, они не пригласят нас на ужин!",,Jag antar att de inte kommer att bjuda oss på middag igen!,Sanırım bizi tekrar yemeğe davet etmeyecekler! -We need to get to the top floor.,TXT_SUB_LOG222,,,,Musíme se dostat na vrchní podlaží.,Vi må op på øverste etage.,Wir müssen in die oberste Etage gelangen.,,,Necesitamos llegar a la planta más alta.,,Meidän tarvitsee päästä ylimmälle kerrokselle.,Il faut que l'on aille au dernier étage.,Fel kell jutnunk a legfelső szintre.,Dobbiamo andare al piano di sopra.,,최상층으로 올라가야 해. ,We moeten naar de bovenste verdieping.,Vi må komme oss til øverste etasje.,Musimy dostać się na ostatnie piętro.,Precisamos chegar até o último andar.,,Trebuie să ajungem la ultimul etaj.,Нам нужно попасть на верхний этаж.,,Vi måste ta oss till översta våningen.,En üst kata çıkmalıyız. -Wait... This looks interesting. Check it out.,TXT_SUB_LOG223,,,,Počkej... Tohle vypadá zajímavě. Pojďme to omrknout.,Vent... Det her ser interessant ud. Tjek det ud.,Warte... Das sieht interessant aus. Sieh mal nach.,,,Espera... Esto parece interesante. Échale un vistazo.,,Odota... Tämä näyttää mielenkiintoiselta. Vilkaisepa.,"Attends.. Ca à l'air intéressant, va voir.",Várjunk csak... érdekesen néz ki. Nézd csak meg.,Aspetta... Questo sembra interessante. Guarda qua.,,잠깐... 저거 뭔가 흥미로워. 확인해보자.,Wacht..... Dit ziet er interessant uit. Kijk maar eens.,Vent litt... Dette ser interessant ut. Sjekk det ut.,Czekaj... To wygląda ciekawie. Sprawdźcie to.,Peraí.... Isso parece interessante. Dá só uma olhada.,,"Stai, asta pare interesant. Ia uite.",Подожди... Выглядит интересно. Проверь.,,Vänta lite... Det här ser intressant ut. Kolla in det.,Bekle. Bu ilginç görünüyor. Şuna bir bak. -Ugh. That guy gives me the creeps. Let's steer clear.,TXT_SUB_LOG224,,,,"Brr, z toho chlápka mi mrazí v zádech. Radši se mu vyhněme.",Ugh. Den fyr giver mig myrekryb. Lad os holde os væk.,Ugh. da kriegt man ja 'ne Gänsehaut. ,,,Ugh. Ese tipo me da mala espina. Alejémonos.,,"Yöh, onpa puistattava kaveri. Pysytään loitolla.","Eugh, ce type me fout les jetons. Evite le.",Rámjön a frász attól az ürgétől. Húzzunk innen.,Ugh. Quel tizio mi fa venire la pelle d'oca. Stiamogli alla larga.,,"윽, 정말 혐오스러운 녀석들. 청소할 준비를 하자.",Ugh. Die kerel geeft me de kriebels. Laten we wegblijven.,Æsj. Den fyren gir meg frysninger. La oss holde oss unna.,Ugh. Ten facet przyprawia mnie o dreszcze. Odsuńmy się od niego.,Urgh. Esse cara me dá arrepios. Vamos passar longe.,,Ugh. Tipul ăla mă sperie.,Ух. У меня от этого парня мурашки по коже. Давай держаться от него подальше.,,Usch. Den killen ger mig kalla kårar. Vi håller oss undan.,Ugh. Bu adam beni ürpertiyor. Uzak duralım. -"Left! Turn left!... Oh, other left!",TXT_SUB_LOG225,,,,"Doleva! Jdi doleva...! Aha, další doleva!","Til venstre! Drej til venstre!... Åh, anden venstre!",Links! Geh nach links... Zur anderen Seite - links!,,,"¡Izquierda! ¡Gira a la izquierda!... Oh, ¡la otra izquierda!",,"Vasemmalle! Käänny vasemmalle! Aa, toinen vasen!",Gauche! A Gauche... L'autre gauche!,"Balra! Fordulj balra!... Áh, a másik balra!","Sinistra! Vai a sinistra!... Oh, l'altra sinistra!",,"왼쪽! 왼쪽으로 이동해!... 잠깐, 다른 왼쪽!","Links! Sla linksaf!...... Oh, andere links!","Til venstre! Sving til venstre!... Å, andre venstre!","W lewo! Skręć w lewo!... Och, inna lewa!","Esquerda! Vira à esquerda!... Ai, a outra esquerda!",,"Stânga! Stânga!... Oh, cealaltă stânga!","Налево! Поверни налево!... Ой, другое лево!",,"Vänster! Sväng vänster!... Åh, en annan vänster!","Sola dön! Sola dön!... Oh, diğer sol!" -Typical stubborn pig-headed male!... Unless you're a girl.,TXT_SUB_LOG226,,,,"Typický, tvrdohlavý, paličatý muž! ...Leda že bys byla holka.","Typisk stædig, stædig mand!... Medmindre du er en pige.",Typischer sturer Mann... Sofern du kein Mädchen bist.,,,Típico hombre cabezotan con cara de cerdo!... A menos que seas chica.,,Tyypillinen itsepäinen uppiniskainen mies! Ellet sitten ole tyttö.,"Typique d'un mec borné comme un porc- Sauf si tu est une fille, bien entendu.",Tipikus csökönyös férfi!... Kivétel ha nő vagy.,Tipico testardo maschio dalla testa di maiale!... A meno che tu non sia una ragazza.,,"뻔뻔한 고집불통 남충 놈!... 걱정 마, 너 말고.",Typisch koppig koppig mannetje!...... Tenzij je een meisje bent.,Typisk sta og sta mann!.... Med mindre du er en jente.,"Typowy uparty świniopas!... Chyba, że jesteś dziewczyną.",Típico macho teimoso com cara de porco!... A não ser que você seja menina.,,Bărbat încăpățânat tipic... Asta dacă nu ești femeie.,Типичный упрямый свинопас!... Если только ты не девушка.,,Typiskt en envis svinhuvudman!... Om du inte är en tjej.,Tipik inatçı domuz kafalı erkek!... Tabii kız değilsen. -"Strong, brutal and silent. My kind of partner.",TXT_SUB_LOG227,,,,"Silný, hrubý a tichý. Přesně můj typ.","Stærk, brutal og tavs. Min type partner.","Stark, brutal und leise. Mein Typ von Partner.",,,"Fuerte, brutal y callado. Mi tipo de compañero.",,"Vahva, raaka ja hiljainen. Mieleiseni kumppani.","Fort, brutal et silencieux. Mon type préféré.","Erős , brutális és csendes. Nekem való partner.","Forte, brutale e silenzioso. Il mio tipo di partner.",,"크고, 아름답고, 과묵하네. 같이 있고 싶은 타입이야.","Sterk, wreed en stil. Mijn soort partner.","Sterk, brutal og stille. Min type partner.","Silny, brutalny i milczący. Mój typ partnera.","Forte, bruto e silencioso. Meu tipo de parceiro.",,"Puternic, brutal și silențios. Genul meu de partener.","Сильный, брутальный и молчаливый. Мой типаж.",,"Stark, brutal och tyst. Min typ av partner.","Güçlü, acımasız ve sessiz. Tam bana göre bir partner." -Okay! I was wrong!,TXT_SUB_LOG228,,,,Dobře! Mýlila jsem se!,Okay! Jeg tog fejl!,"Ok, ich habe mich geirrt.",,,¡OK! ¡Estaba equivocada!,,"Okei, olin väärässä!","Ok, j'avais tort!",Jólvan na! Tévedtem!,Okay! Mi sbagliavo!,,아마도 아니었던 것 같네! ,Oké! Ik had het mis!,Okay! Jeg tok feil!,Dobra! Myliłem się!,Ok! Eu estava errada!,,Bine! Am greșit!,Хорошо! Я была неправа!,,Okej! Jag hade fel!,"Tamam, tamam! Yanılmışım!" +When obtaining the “Spontaneous Combustion” achievement",,,Wow! Zčernalý akolyta! Nové kulinářské šílenství...,Wow! Sorte Acolyt! Den nye smagsoplevelse...,Wow! Geschmorter Ministrant! Neue Geschmackssensation...,,,¡Guau! ¡Acólito ennegrecido! La nueva sensación de sabor...,,Vau! Mustaa akoluuttia! Uutuusmakuelämys!,Wow! Acolyte noirci! Goûte à la nouvelle saveur sensationelle!,,Wow! Pörkölt ministráns! A szezon új íze...,Wow! Accolito scuro! Il nuovo sensazionale sapore!,うぉう!黒ずんだアコライト!新しい趣味に目覚めそうだわ...,숯 빛깔 아콜라이트라! 맛과 감각을 잘 살렸는데? ,Wow! Zwarte acoliet! De nieuwe smaaksensatie....,Jøss! Svertet akolytt! Den nye smakssensasjonen...,Wow! Czarnoskóry akolita! Nowe doznanie smakowe...,Uau! Acólito assado! Uma nova sensação de sabor...,,"Wow, Acolit Înegrit! Noua senzație...","Ух ты, обугленный служитель! Совсем другое ощущение...",,Wow! Svartklädd akolyt! Den nya smaksensationen...,Vay canına! Karartılmış yardımcı! Yeni tat hissi... +Keep doing that and you'll go blind... but I like it.,TXT_SUB_LOG220,,,,Pokračuj s tím a oslepneš... ale líbí se mi to.,"Bliv ved med det, og du bliver blind... men jeg kan lide det.",Mach so weiter und du wirst blind... aber ich finde es toll.,,,Sigue haciendo eso y te quedarás ciego... pero me gusta.,,Jatka tuota samaan malliin ja sokeudut... mutta pidän siitä.,Continue et tu vas te rendre aveugle.. j'aime bien par contre.,,Ha tovább csinálod megvakulsz...mondjuk bejön.,Se continui così diventerai cieco... ma a me piace.,,이 걸 하다보면 네 눈이 좀 멀겠지만... 아찔하고 재밌는 것 같아.,Blijf dat doen en je wordt blind.... maar ik vind het leuk.,"Fortsett med det, og du blir blind... men jeg liker det.","Rób tak dalej, a oślepniesz... ale mi się podoba.",Continua fazendo isso e você ficará cego... mas eu gosto.,,Continuă să faci asta și o să orbești... dar îmi place.,Продолжай в том же духе и ты ослепнешь... но мне это нравится.,,Fortsätt med det där och du blir blind... men jag gillar det.,Bunu yapmaya devam edersen kör olacaksın... ama hoşuma gitti. +Guess they won't be inviting us back to dinner!,TXT_SUB_LOG221,,,,"Hádám, že tihle nás už na večeři zvát nebudou!","Jeg tror ikke, de inviterer os tilbage til middag!","Ich glaube nicht, dass sie uns nochmal einladen werden...",,,¡Supongo que no nos invitarán a cenar!,,Eivät varmaankaan kutsu meitä takaisin illalliselle!,Je pense qu'ils ne vont pas nous inviter à diner!,,Szerintem nem hívnak vissza vacsorára.,Mi sa che non ci riinviteranno per cena!,,보답으로 저녁에 초대하지 않을 것 같아서 아쉽네! ,Ik denk dat ze ons niet meer zullen uitnodigen om terug te komen eten!,Antar de ikke vil invitere oss på middag igjen!,Chyba nie zaproszą nas z powrotem na kolację!,Acho que não vão nos convidar para jantar!,,Cred că n-o să ne invite la cină!,"Думаю, они не пригласят нас на ужин!",,Jag antar att de inte kommer att bjuda oss på middag igen!,Sanırım bizi tekrar yemeğe davet etmeyecekler! +We need to get to the top floor.,TXT_SUB_LOG222,,,,Musíme se dostat na vrchní podlaží.,Vi må op på øverste etage.,Wir müssen in die oberste Etage gelangen.,,,Necesitamos llegar a la planta más alta.,,Meidän tarvitsee päästä ylimmälle kerrokselle.,Il faut que l'on aille au dernier étage.,,Fel kell jutnunk a legfelső szintre.,Dobbiamo andare al piano di sopra.,,최상층으로 올라가야 해. ,We moeten naar de bovenste verdieping.,Vi må komme oss til øverste etasje.,Musimy dostać się na ostatnie piętro.,Precisamos chegar até o último andar.,,Trebuie să ajungem la ultimul etaj.,Нам нужно попасть на верхний этаж.,,Vi måste ta oss till översta våningen.,En üst kata çıkmalıyız. +Wait... This looks interesting. Check it out.,TXT_SUB_LOG223,,,,Počkej... Tohle vypadá zajímavě. Pojďme to omrknout.,Vent... Det her ser interessant ud. Tjek det ud.,Warte... Das sieht interessant aus. Sieh mal nach.,,,Espera... Esto parece interesante. Échale un vistazo.,,Odota... Tämä näyttää mielenkiintoiselta. Vilkaisepa.,"Attends.. Ca à l'air intéressant, va voir.",,Várjunk csak... érdekesen néz ki. Nézd csak meg.,Aspetta... Questo sembra interessante. Guarda qua.,,잠깐... 저거 뭔가 흥미로워. 확인해보자.,Wacht..... Dit ziet er interessant uit. Kijk maar eens.,Vent litt... Dette ser interessant ut. Sjekk det ut.,Czekaj... To wygląda ciekawie. Sprawdźcie to.,Peraí.... Isso parece interessante. Dá só uma olhada.,,"Stai, asta pare interesant. Ia uite.",Подожди... Выглядит интересно. Проверь.,,Vänta lite... Det här ser intressant ut. Kolla in det.,Bekle. Bu ilginç görünüyor. Şuna bir bak. +Ugh. That guy gives me the creeps. Let's steer clear.,TXT_SUB_LOG224,,,,"Brr, z toho chlápka mi mrazí v zádech. Radši se mu vyhněme.",Ugh. Den fyr giver mig myrekryb. Lad os holde os væk.,Ugh. da kriegt man ja 'ne Gänsehaut. ,,,Ugh. Ese tipo me da mala espina. Alejémonos.,,"Yöh, onpa puistattava kaveri. Pysytään loitolla.","Eugh, ce type me fout les jetons. Evite le.",,Rámjön a frász attól az ürgétől. Húzzunk innen.,Ugh. Quel tizio mi fa venire la pelle d'oca. Stiamogli alla larga.,,"윽, 정말 혐오스러운 녀석들. 청소할 준비를 하자.",Ugh. Die kerel geeft me de kriebels. Laten we wegblijven.,Æsj. Den fyren gir meg frysninger. La oss holde oss unna.,Ugh. Ten facet przyprawia mnie o dreszcze. Odsuńmy się od niego.,Urgh. Esse cara me dá arrepios. Vamos passar longe.,,Ugh. Tipul ăla mă sperie.,Ух. У меня от этого парня мурашки по коже. Давай держаться от него подальше.,,Usch. Den killen ger mig kalla kårar. Vi håller oss undan.,Ugh. Bu adam beni ürpertiyor. Uzak duralım. +"Left! Turn left!... Oh, other left!",TXT_SUB_LOG225,,,,"Doleva! Jdi doleva...! Aha, další doleva!","Til venstre! Drej til venstre!... Åh, anden venstre!",Links! Geh nach links... Zur anderen Seite - links!,,,"¡Izquierda! ¡Gira a la izquierda!... Oh, ¡la otra izquierda!",,"Vasemmalle! Käänny vasemmalle! Aa, toinen vasen!",Gauche! A Gauche... L'autre gauche!,,"Balra! Fordulj balra!... Áh, a másik balra!","Sinistra! Vai a sinistra!... Oh, l'altra sinistra!",,"왼쪽! 왼쪽으로 이동해!... 잠깐, 다른 왼쪽!","Links! Sla linksaf!...... Oh, andere links!","Til venstre! Sving til venstre!... Å, andre venstre!","W lewo! Skręć w lewo!... Och, inna lewa!","Esquerda! Vira à esquerda!... Ai, a outra esquerda!",,"Stânga! Stânga!... Oh, cealaltă stânga!","Налево! Поверни налево!... Ой, другое лево!",,"Vänster! Sväng vänster!... Åh, en annan vänster!","Sola dön! Sola dön!... Oh, diğer sol!" +Typical stubborn pig-headed male!... Unless you're a girl.,TXT_SUB_LOG226,,,,"Typický, tvrdohlavý, paličatý muž! ...Leda že bys byla holka.","Typisk stædig, stædig mand!... Medmindre du er en pige.",Typischer sturer Mann... Sofern du kein Mädchen bist.,,,Típico hombre cabezotan con cara de cerdo!... A menos que seas chica.,,Tyypillinen itsepäinen uppiniskainen mies! Ellet sitten ole tyttö.,"Typique d'un mec borné comme un porc- Sauf si tu est une fille, bien entendu.",,Tipikus csökönyös férfi!... Kivétel ha nő vagy.,Tipico testardo maschio dalla testa di maiale!... A meno che tu non sia una ragazza.,,"뻔뻔한 고집불통 남충 놈!... 걱정 마, 너 말고.",Typisch koppig koppig mannetje!...... Tenzij je een meisje bent.,Typisk sta og sta mann!.... Med mindre du er en jente.,"Typowy uparty świniopas!... Chyba, że jesteś dziewczyną.",Típico macho teimoso com cara de porco!... A não ser que você seja menina.,,Bărbat încăpățânat tipic... Asta dacă nu ești femeie.,Типичный упрямый свинопас!... Если только ты не девушка.,,Typiskt en envis svinhuvudman!... Om du inte är en tjej.,Tipik inatçı domuz kafalı erkek!... Tabii kız değilsen. +"Strong, brutal and silent. My kind of partner.",TXT_SUB_LOG227,,,,"Silný, hrubý a tichý. Přesně můj typ.","Stærk, brutal og tavs. Min type partner.","Stark, brutal und leise. Mein Typ von Partner.",,,"Fuerte, brutal y callado. Mi tipo de compañero.",,"Vahva, raaka ja hiljainen. Mieleiseni kumppani.","Fort, brutal et silencieux. Mon type préféré.",,"Erős , brutális és csendes. Nekem való partner.","Forte, brutale e silenzioso. Il mio tipo di partner.",,"크고, 아름답고, 과묵하네. 같이 있고 싶은 타입이야.","Sterk, wreed en stil. Mijn soort partner.","Sterk, brutal og stille. Min type partner.","Silny, brutalny i milczący. Mój typ partnera.","Forte, bruto e silencioso. Meu tipo de parceiro.",,"Puternic, brutal și silențios. Genul meu de partener.","Сильный, брутальный и молчаливый. Мой типаж.",,"Stark, brutal och tyst. Min typ av partner.","Güçlü, acımasız ve sessiz. Tam bana göre bir partner." +Okay! I was wrong!,TXT_SUB_LOG228,,,,Dobře! Mýlila jsem se!,Okay! Jeg tog fejl!,"Ok, ich habe mich geirrt.",,,¡OK! ¡Estaba equivocada!,,"Okei, olin väärässä!","Ok, j'avais tort!",,Jólvan na! Tévedtem!,Okay! Mi sbagliavo!,,아마도 아니었던 것 같네! ,Oké! Ik had het mis!,Okay! Jeg tok feil!,Dobra! Myliłem się!,Ok! Eu estava errada!,,Bine! Am greșit!,Хорошо! Я была неправа!,,Okej! Jag hade fel!,"Tamam, tamam! Yanılmışım!" Too bad we never met... face-to-face.,TXT_SUB_LOG229,"(Strife: Veteran Edition) -Random comment when the player dies with Classic Mode turned off",,,"Škoda, že jsme se nikdy nepotkali... tváří v tvář.",Ærgerligt at vi aldrig mødtes... ansigt til ansigt.,"Schade, dass wir uns noch nie begegnet sind...",,,Una pena que nunca nos conocieramos... cara a cara.,,"Sääli, ettemme koskaan tavanneet... kasvokkain.",C'est dommage qu'on s'est jamais rencontré.. En face à face.,"Kár, hogy sohasem találkoztunk... szemtől szembe.",Peccato che non ci siamo mai incontrati... faccia a faccia.,私達はもう会えなくなったわ...面と向かって。,만나지 못한 게 유감스럽네... 가까이서. ,Jammer dat we elkaar nooit ontmoet hebben..... persoonlijk.,Synd vi aldri møttes... ansikt til ansikt.,"Szkoda, że nigdy nie spotkaliśmy się... twarzą w twarz.",Pena que nunca nos encontramos... cara a cara.,,Păcat că nu ne-am întâlnit... față în față.,"Жаль, мы раньше не встречались... лицом к лицу.",,Synd att vi aldrig träffades... ansikte mot ansikte.,Hiç tanışmamış olmamız çok kötü... yüz yüze. +Random comment when the player dies with Classic Mode turned off",,,"Škoda, že jsme se nikdy nepotkali... tváří v tvář.",Ærgerligt at vi aldrig mødtes... ansigt til ansigt.,"Schade, dass wir uns noch nie begegnet sind...",,,Una pena que nunca nos conocieramos... cara a cara.,,"Sääli, ettemme koskaan tavanneet... kasvokkain.",C'est dommage qu'on s'est jamais rencontré.. En face à face.,,"Kár, hogy sohasem találkoztunk... szemtől szembe.",Peccato che non ci siamo mai incontrati... faccia a faccia.,私達はもう会えなくなったわ...面と向かって。,만나지 못한 게 유감스럽네... 가까이서. ,Jammer dat we elkaar nooit ontmoet hebben..... persoonlijk.,Synd vi aldri møttes... ansikt til ansikt.,"Szkoda, że nigdy nie spotkaliśmy się... twarzą w twarz.",Pena que nunca nos encontramos... cara a cara.,,Păcat că nu ne-am întâlnit... față în față.,"Жаль, мы раньше не встречались... лицом к лицу.",,Synd att vi aldrig träffades... ansikte mot ansikte.,Hiç tanışmamış olmamız çok kötü... yüz yüze. I had dreams for you... Tough shit.,TXT_SUB_LOG230,"(Strife: Veteran Edition) -Random comment when the player dies with Classic Mode turned off",,,Snila jsem o tobě... Kurva.,Jeg havde drømme om dig... Det er sgu hårdt.,Ich hatte Träume für dich. Scheiße.,,,Tenía sueños para ti... Lástima.,,Elättelin toiveita sinusta... Paska mäihä.,J'avais des grands rêves pour toi.. Franchement dommage.,Álmodtam számodra valamit... Szar ügy.,Ho fatto sogni per te... Che peccato.,私は貴方に希望を抱いていた...クソ世知辛いわ。,너를 꿈꿔왔어... 꿈은 꿈이였나봐.,Ik had dromen voor je.... Moeilijke shit.,Jeg hadde drømmer for deg... Synd for deg.,Miałem dla ciebie marzenia... Twarde gówno.,Eu tinha uma grande expectativa sobre você... Que merda.,,Aveam visuri pentru tine... Rahatule...,Я так надеялся на тебя... Упрямый засранец.,,Jag hade drömmar om dig... Det är jobbigt.,Senin için hayallerim vardı. Zor iş. -"No. Don't enter the town hall. It's not safe anymore. Our cover's been blown. That's why it's raining heavy metal. Kill as many of those big boys as you can. They're called ""Crusaders"". When you're done, I'll guide you to Macil.",TXT_SUB_LOG231,,,,"Ne. Nechoď do radnice, už není bezpečná. Byli jsme odhaleni, proto nám prší olovo na hlavu. Zabij kolik těch velkých kluků můžeš. Říká se jim Křižáci. Když jsi hotový, nasměruju tě k Macilovi.","Nej. Du må ikke gå ind på rådhuset. Det er ikke sikkert længere. Vores dække er blevet afsløret. Det er derfor, det regner heavy metal. Dræb så mange af de store drenge, som du kan. De kaldes ""korsfarere"". Når I er færdige, fører jeg jer til Macil.","Nein, betrete das Rathaus nicht. Es ist nicht mehr sicher. Unsere Tarnung ist aufgeflogen. Darum regnet es Schwermetall. Erledige so viele von den großen Robotern, wie du kannst. Sie werden „Ordensritter“ genannt. Wenn du das erledigt hast führe ich dich zu Macil.",,,"No. No entres en el ayuntamiento. Ya no es seguro. Nuestra tapadera ha sido descubierta. Por eso está lloviendo metal. Mata a tantos de esos grandotes como puedas. Se llaman ""Cruzados"". Cuando hayas terminado, te guiaré hasta Macil.",,"Ei, älä mene kaupungintaloon. Se ei ole enää turvallista; olemme paljastuneet. Sen takia sataa metallia. Tapa noita isoja poikia niin monta kuin pysyt. Niitä kutsutaan ""ristiretkeläisiksi"". Kun olet valmis, johdatan sinut Macilin luokse.","Non, n'entre pas dans la mairie, notre couverture est foutue. C'est pour ça que tout est en train de péter. Détruis tous les gros machins que tu croise, on les appelle les ""Croisés"". Quand tu as fini, je te dirais où se trouve Macil.","Ne menj be a városházára. Már nem biztonságos. Lelepleződtünk. Ezért ennyire sűrű az ólomeső. Ölj meg annyi nagy fiút, amennyit csak tudsz. ""Keresztes"" névre hallgatnak. Ha kész vagy, elvezetlek macilhoz.","No. Non entrare nel municipio. Non è più sicuro. La nostra copertura è saltata. È per questo che sta piovendo piombo. Distruggi più di questi grossi robot che puoi. Si chiamano ""Crociati"". Quando hai finito, di guiderò da Macil.",,"잠깐, 시청으로 가지 마. 이미 발각되어서 이젠 안전하지 않아. 아마도 총알의 비가 내리는 유일한 이유일 거야. 최선을 다해서 저 커다란 친구들을 격파해봐. 저놈들은 ""크루세이더"" 라고 해. 이 일을 끝마치면, 마실이 있는 곳으로 안내해줄게. ","Nee. Ga het stadhuis niet binnen. Het is niet meer veilig. Onze dekmantel is opgeblazen. Daarom regent het zwaar metaal. Dood zoveel mogelijk van die grote jongens als je kunt. Ze worden ""Kruisvaarders"" genoemd. Als je klaar bent, begeleid ik je naar Macil.","Nei. Ikke gå inn i rådhuset. Det er ikke trygt lenger. Vi er avslørt. Det er derfor det regner heavy metal. Drep så mange av de store gutta du kan. De kalles ""korsfarere"". Når du er ferdig, viser jeg deg veien til Macil.","Nie. Nie wchodź do ratusza. To już nie jest bezpieczne. Nasza przykrywka została zdmuchnięta. To dlatego pada heavy metal. Zabij jak najwięcej tych wielkich chłopców. Nazywają się ""krzyżowcami"". Kiedy skończysz, zaprowadzę cię do Macil.","Não. Não entre na prefeitura. Não é mais seguro. Fomos descobertos. É por isso que está vindo chumbo grosso pra todo lado. Mate o máximo possível desses grandalhões. São chamados de ""Cruzados"". Quando você terminar, eu te levo pro Macil.",,"Nu. Nu intra în oraș. Ni s-a dus acoperirea. De asta plouă cu metale grele. Omoară cât de mulți băieți duri poți. Se cheamă ""Cruciați"". Când ești gata o să te îndrum spre Macil.","Нет. Не входи в ратушу. Там небезопасно. Наше прикрытие сорвано. Вот почему идёт дождь из тяжёлого металла. Убей как можно больше этих здоровяков. Они называются «Крестоносцы». Когда закончишь, я отведу тебя к Мэйсилу.",,"Nej. Gå inte in i stadshuset. Det är inte säkert längre. Vår täckmantel är avslöjad. Det är därför det regnar heavy metal. Döda så många av de stora pojkarna som du kan. De kallas ""korsfarare"". När du är klar guidar jag dig till Macil.","Hayır. Belediye binasına girme. Artık güvenli değil. Kimliğimiz açığa çıktı. Bu yüzden heavy metal yağıyor. O koca oğlanlardan öldürebildiğiniz kadarını öldürün. Onlara ""Haçlılar"" deniyor. İşiniz bittiğinde, sizi Macil'e götüreceğim." -"Good work, friend! It's time to bring you inside.",TXT_SUB_LOG232,,,,"Dobrá práce, kamaráde! Je čas přivést tě dovnitř.","Godt arbejde, min ven! Det er tid til at bringe dig indenfor.","Gute Arbeit, mein Freund. Es ist Zeit dich hereinzubringen.",,,"¡Buen trabajo, amigo! Es hora de traerte adentro.",,"Hyvää työtä, ystävä! On aika tuoda sinut sisälle.","Bien joué, mon ami! Il est temps de te faire rentrer.",Szép munka barátom! Ideje bevinnelek.,"Ottimo lavoro, amico! È ora di farti entrare.",,"건투를 빌어, 친구! 안으로 들여보내 줄게. ","Goed werk, vriend! Het is tijd om je binnen te brengen.","Godt jobbet, min venn! Det er på tide å få deg inn.","Dobra robota, przyjacielu! Czas wprowadzić cię do środka.","Bom trabalho, amigo! Hora de trazê-lo pra dentro.",,"Bună treabă, prietene! E timpul să te aduc înăuntru!","Хорошая работа, друг! Пришло время впустить тебя внутрь.",,"Bra jobbat, min vän! Det är dags att ta in dig.","İyi iş, dostum! Seni içeri götürme vakti geldi." -"Watch out for those Crusaders. They're big, hunking robots, and mean as hell. We don't know jack about their weapons, but odds are... you're outmatched. Careful.",TXT_SUB_LOG233,,,,"Pozor na ty Křižáky. Jsou to velcí, mohutní roboti a zatraceně zlí. Nevíme nic o jejich zbraních. Vypadá to že... jsou v přesile. Opatrně.","Pas på de korsfarere. De er store, store robotter, og onde som bare fanden. Vi ved ikke noget om deres våben, men oddsene er... at I er underlegne. Pas på.",Sieh dich vor den Ordensrittern vor. Das sind große und mächtige Roboter und höllisch gefährlich. Wir wissen nichts über ihre Waffen aber sie übertreffen deine bei weitem. Vorsicht!,,,"Ten cuidado con esos Cruzados. Son unos robots enormes y despiadados. No sabemos nada sobre sus armas, pero lo probable es... que te lleven ventaja. Cuidado.",,"Varo noita ristiretkeläisiä. Ne ovat isoja järkälemäisiä robotteja ja helvetin häijyjä. Emme tiedä yhtikäs mitään niiden aseista, mutta todennäköisyys on... että olet heikoilla. Varovaisesti.","Fais attention aux croisés, ce sont des sacrément grosses machines, et salement méchantes, aussi. On ne sait pas quelles armes ils utilisent, mais il est probable qu'ils en ont.. Plus que toi. Fais attention.","Vigyázz azokkal a keresztesekkel. Nagy, testes robotok, és morcosok is. nem sokat tudunk a fegyvereikről, de az esélyied... nem túl fényesek. Vigyázz magadra.","Attento a questi Crociati. Sono grossi, potenti robot e davvero pericolosi. Non sappiamo nulla sulle loro armi ma è molto probabile... che tu sia surclassato. Attento.",,"크루세이더를 조심해. 저놈들은 커다랗고 강력한 기동 병기야. 난폭하기도 하지. 놈들의 무장이 뭔지 모르지만, 중요한 점은 넌 포위됐다는 거지. 조심해. ","Kijk uit voor die kruisvaarders. Het zijn grote, hangende robots, en gemeen als de hel. We weten niet hoe het met hun wapens zit, maar de kans is groot dat je niet bij elkaar past. Voorzichtig.","Se opp for korsfarerne. De er store, kjekke roboter, og slemme som faen. Vi vet ingenting om våpnene deres, men det er sannsynlig at dere er underlegne. Forsiktig.","Uważaj na tych Krzyżowców. To wielkie, potężne roboty i wredne jak diabli. Nie wiemy nic o ich broni, ale prawdopodobnie... nie macie szans. Ostrożnie.","Cuidado com esses Cruzados. São robôs grandes e perigosos pra caramba. Não sabemos merda nenhuma sobre as suas armas, mas as chances são de que... você está em desvantagem. Cuidado.",,"Ai grijă la Cruciați. Sunt roboți imenși, și duri ca naiba. Nu știm absolut nimic despre armamentul lor, dar șansele sunt... nu ești pe măsura lor. Grijă.","Остерегайся крестоносцев. Они большие, громадные роботы, и чертовски злые. Мы не знаем ничего об их оружии, но, скорее всего... ты не справишься. Будь осторожен.",,"Se upp för de där korsfararna. De är stora, jättelika robotar och elaka som fan. Vi vet inget om deras vapen, men oddsen är... att ni är underlägsna. Var försiktig.","Şu Haçlılara dikkat et. Onlar büyük, iri robotlar ve çok acımasızlar. Silahları hakkında bir şey bilmiyoruz, ama ihtimaller... rakibiniz yok. Dikkatli olun." -"Great job. You're my idea of a good time. Now, without anyone seeing you, go through the door on the right, head on upstairs and meet the man.",TXT_SUB_LOG234,,,,"Skvělá práce. Vypadáš jako člověk do nepohody. A teď, bez toho, aby tě někdo uviděl, projdi dveřmi napravo, jdi po schodech nahoru a setkej se s ním.","Godt gået. Du er min idé om en god tid. Gå nu, uden at nogen ser dig, gennem døren til højre, gå op ad trappen og mød manden.","Gute Arbeit. Das macht mir richtig Freude. Nun gehe - ohne dass man dich sieht - durch die Tür da rechts, und treffe den Mann.",,,"Buen trabajo. Eres mi idea de una buena juerga. Ahora, sin que te vean, ve por la puerta a la derecha, sube las escaleras y conoce al hombre.",,"Hyvää työtä. Vastaat mielikuvaani hyvästä ajanvietteestä. Mene nyt kenenkään näkemättä oikeanpuoleisen oven läpi, kulje yläkertaan ja tapaa mies.","Bien joué, tu connaîs bien mon idée d'une bonne fête. Maintenant, sans que personne ne te voie, passe par la porte à droite, monte à l'étage et rencontre le type.","Remek munka. Te vagy a jól eltöltött idő definíciója. Most pedig anélkül, hogy bárki meglátna, menj a jobb oldalon levő ajtóhoz, majd az emeleten találkozz az emberünkkel.","Ottimo lavoro. Tu si che mi fai divertire. Ora, senza che nessuno ti veda, attraversa la porta alla tua destra, vai di sopra e incontralo.",,"잘 싸웠어. 내가 생각지도 못한 기발한 생각을 많이 하네. 이제, 모두가 너를 보지 않는 동안 오른쪽 문으로 들어가서 계단을 올라가고 남자를 만나.","Goed werk. Jij bent mijn idee van een goede tijd. Nu, zonder dat iemand je ziet, ga door de deur aan de rechterkant, ga naar boven en ontmoet de man.","Bra jobbet. Du er min idé om en god tid. Nå, uten at noen ser deg, gå gjennom døren til høyre, gå ovenpå og møt mannen.","Świetna robota. Jesteś moim pomysłem na dobrą zabawę. Przejdź przez drzwi po prawej, wejdź na górę i spotkaj się z tym człowiekiem.","Muito bom. Você sabe mesmo como entreter alguém. Agora, sem ninguém te ver, entre pela porta à direita, suba as escadas e encontre o cara.",,"Bună treabă. Acum, fără nimeni care să te vadă, du-te prin ușa de la dreapta, la etaj, și întâlnește-l.","Отличная работа. Ты - мой способ хорошо провести время. Теперь, чтобы никто тебя не увидел, пройди через дверь справа, поднимись наверх и встреться с мужчиной.",,"Bra jobbat. Du är min idé om att ha roligt. Nu, utan att någon ser dig, gå genom dörren till höger, gå upp på övervåningen och möt mannen.","İyi iş çıkardın. Sen benim iyi vakit geçirme anlayışımsın. Şimdi, kimse seni görmeden, sağdaki kapıdan geç, yukarı çık ve adamla buluş." -"You let anyone see you, we'll have your head.",TXT_SUB_LOG235,,,,"Dovolíš, aby tě někdo uviděl, a budeme mít tvou hlavu.","Hvis du lader nogen se dig, får vi dit hoved.","Wenn man dich sieht, machen wir dich alle.",,,"Si dejas que te vean, tomaremos tu cabeza.",,"Jos annat kenenkään nähdä sinut, pääsi on vadilla.","Si qui que ce soit te voit, on aura ta tête.","Ha bárki meglát, levesszük a fejed.","Se ti vede qualcuno, avremo la tua testa.",,결국엔 사람들이 너를 보았네. 사적인 건 아니지만 넌 죽어줘야겠어. ,"Als je iemand je laat zien, hebben we je hoofd.","Hvis noen ser deg, tar vi hodet ditt.","Jeśli ktoś cię zobaczy, dostaniesz głowę.","Se você deixar alguém te ver, a sua cabeça é nossa.",,Lași pe cineva să te vadă și-ți luăm capul.,"Если ты позволишь кому-нибудь увидеть себя, мы получим твою голову.",,"Om någon ser dig, så tar vi ditt huvud.","Birinin seni görmesine izin verirsen, kelleni alırız." -"You stupid, stumbling, club-footed hunchback imbecile! You've given us away!",TXT_SUB_LOG236,,,,"Ty hloupý, klopýtavý, těžkopádný idiotský hrbáči! Prozradils nás!","Din dumme, snublende, klumpfodede, pukkelryggede idiot! Du har afsløret os!","Du dummer, ungeschickter, klumpfüßiger, buckliger Trottel. Du hast uns verraten.",,,¡Estúpido patán! ¡Nos has traicionado!,,"Sinä typerä, kömpelö, kampurajalkainen imbesilli! Olet paljastanut meidät!","Espèce d'abruti, crétin bossu pas foutu de marcher droit! Tu fait foirer notre couverture!",Te hülye botladozó kétballábú púpos állat! Észrevettek minket miattad!,"Stupido, impiastro, gobbo imbecille! Ci hai fatto scoprire!",,"이 어리석은, 멍청한, 짜리몽땅한 말미잘 얼간이! 우리 곁을 떠나다니!","Jij stomme, struikelende, knotsvoetige bochelende imbeciel! Je hebt ons weggegeven!","Din dumme, klumpfotete, pukkelryggede idiot! Du har avslørt oss!","Ty głupi, potykający się, garbaty imbecylu! Wydałeś nas!",Seu imbecil idiota estúpido duma figa! Você nos entregou!,,Imbecilule! Ne-ai dat de gol!,"Ты тупой, неуклюжий, косолапый горбатый имбецил! Ты нас выдал!",,"Din dumma, snubblande, klumpfotade puckelryggiga idiot! Du har avslöjat oss!","Seni aptal, tökezleyen, sopa ayaklı, kambur embesil! Bizi ele verdin!" -"I wish I was waiting for you behind that door... but I've got to stay underground. It's time for you to meet our leader, Macil.",TXT_SUB_LOG237,,,,"Přála bych si, abych to byla já, kdo bude čekat za těmi dveřmi... ale musím zůstat v podzemí. Je čas setkat se s naším vůdcem, Macilem.","Jeg ville ønske, jeg ventede på dig bag den dør ... men jeg må blive under jorden. Det er tid til at du skal møde vores leder, Macil.","Ich wünschte, ich würde hinter der Tür dort warten... aber ich muss im Untergrund bleiben. Es ist Zeit, unseren Anführer, Macil, zu treffen.",,,"Ojalá fuera yo esperando tras esa puerta... Pero debo mantenerme bajo tierra. Es hora de que conozcas a nuestro lider, Macil.",,"Kunpa olisin voinut olla sinua ovella vastassa, mutta minun on pysyttävä maan alla. Sinun on aika tavata johtajamme, Macilin.","J'aurais adoré être de l'autre côté de cette porte.. Mais il faut que je reste sous terre. Il est temps que tu rencontre notre leader, Macil.","Bárcsak Én várhatnálak az ajtó mögött... de a föld alatt kell maradnom. Itt az ideje, hogy megismerd a vezetőnket, Macilt.","Vorrei esserci io ad attenderti dietro la porta... ma devo rimanere sottoterra. È tempo per te di incontrare il nostro leader, Macil.",,저 문 앞에서 내가 기다리고 있었으면 얼마나 좋을까... 하지만 난 지하에서 임무를 수행해야 해. 마실 사령관을 만날 준비를 해.,Ik wou dat ik achter die deur op je zat te wachten.... maar ik moet ondergronds blijven. Het is tijd om onze leider Macil te ontmoeten.,"Jeg skulle ønske jeg ventet på deg bak den døra, men jeg må holde meg under jorden. Det er på tide at du møter lederen vår, Macil.","Chciałbym czekać na ciebie za tymi drzwiami... ale muszę zostać pod ziemią. Czas, byś poznał naszego przywódcę, Macila.","Eu queria estar te esperando por trás daquela porta... mas eu tenho que ficar no subterrâneo. É hora de você conhecer o nosso líder, Macil.",,"Speram ca eu să te aștept în spatele ușii... dar trebuie să rămân în subteran. E timpul să ne cunoști liderul, Macil.","Хотела бы я ждать тебя за этой дверью... но я должна оставаться под землёй. Пришло время познакомить тебя с нашим лидером, Мэйсилом.",,"Jag önskar att jag väntade på er bakom den dörren... men jag måste stanna under jorden. Det är dags för dig att träffa vår ledare, Macil.",Keşke o kapının arkasında seni bekliyor olsaydım... ama yeraltında kalmalıyım. Liderimiz Macil ile tanışma vaktin geldi. -,,Blackbird's remarks embedded in other conversations,,,,,,,,,,,,,,,,,,,,,,,,, -"Bloated pig. I know nothing about this so-called power coupling, so let's go slow.",TXT_BBSUB_SCRIPT02_D57608_IFIKN,MAP02: Mourel.,,,"Prohnilá svině. O téhle jakési spojce nic nevím, tak na to pojďme pomalu.","Oppustet gris. Jeg ved intet om denne såkaldte kraftkobling, så lad os gå langsomt frem.",Aufgeblasener Mistkerl. Ich weiß nichts über diese sogenannte Anzapfung so lass uns vorsichtig sein.,,,"Qué cerdo hinchado. No sé nada sobre ese supuesto acoplamiento de energía, así que vayamos con calma.",,"Pöhöttynyt sika. En tiedä mitään tästä niin sanotusta virtaliittimestä, joten otetaan rauhallisesti.","Quel porc. Je ne sais rien sur ce coupleur énergétique, allons-y doucement.","Te dagadt disznó. Nem tudok semmit erről az úgynevezett áramelosztóról, szóval menjünk csak lassan.","Che pallone gonfiato. Non so nulla su questo aggeggio, quindi andiamoci piano.","慢心してた。私はこの配電機と言われている物について何も知らない。 +Random comment when the player dies with Classic Mode turned off",,,Snila jsem o tobě... Kurva.,Jeg havde drømme om dig... Det er sgu hårdt.,Ich hatte Träume für dich. Scheiße.,,,Tenía sueños para ti... Lástima.,,Elättelin toiveita sinusta... Paska mäihä.,J'avais des grands rêves pour toi.. Franchement dommage.,,Álmodtam számodra valamit... Szar ügy.,Ho fatto sogni per te... Che peccato.,私は貴方に希望を抱いていた...クソ世知辛いわ。,너를 꿈꿔왔어... 꿈은 꿈이였나봐.,Ik had dromen voor je.... Moeilijke shit.,Jeg hadde drømmer for deg... Synd for deg.,Miałem dla ciebie marzenia... Twarde gówno.,Eu tinha uma grande expectativa sobre você... Que merda.,,Aveam visuri pentru tine... Rahatule...,Я так надеялся на тебя... Упрямый засранец.,,Jag hade drömmar om dig... Det är jobbigt.,Senin için hayallerim vardı. Zor iş. +"No. Don't enter the town hall. It's not safe anymore. Our cover's been blown. That's why it's raining heavy metal. Kill as many of those big boys as you can. They're called ""Crusaders"". When you're done, I'll guide you to Macil.",TXT_SUB_LOG231,,,,"Ne. Nechoď do radnice, už není bezpečná. Byli jsme odhaleni, proto nám prší olovo na hlavu. Zabij kolik těch velkých kluků můžeš. Říká se jim Křižáci. Když jsi hotový, nasměruju tě k Macilovi.","Nej. Du må ikke gå ind på rådhuset. Det er ikke sikkert længere. Vores dække er blevet afsløret. Det er derfor, det regner heavy metal. Dræb så mange af de store drenge, som du kan. De kaldes ""korsfarere"". Når I er færdige, fører jeg jer til Macil.","Nein, betrete das Rathaus nicht. Es ist nicht mehr sicher. Unsere Tarnung ist aufgeflogen. Darum regnet es Schwermetall. Erledige so viele von den großen Robotern, wie du kannst. Sie werden „Ordensritter“ genannt. Wenn du das erledigt hast führe ich dich zu Macil.",,,"No. No entres en el ayuntamiento. Ya no es seguro. Nuestra tapadera ha sido descubierta. Por eso está lloviendo metal. Mata a tantos de esos grandotes como puedas. Se llaman ""Cruzados"". Cuando hayas terminado, te guiaré hasta Macil.",,"Ei, älä mene kaupungintaloon. Se ei ole enää turvallista; olemme paljastuneet. Sen takia sataa metallia. Tapa noita isoja poikia niin monta kuin pysyt. Niitä kutsutaan ""ristiretkeläisiksi"". Kun olet valmis, johdatan sinut Macilin luokse.","Non, n'entre pas dans la mairie, notre couverture est foutue. C'est pour ça que tout est en train de péter. Détruis tous les gros machins que tu croise, on les appelle les ""Croisés"". Quand tu as fini, je te dirais où se trouve Macil.",,"Ne menj be a városházára. Már nem biztonságos. Lelepleződtünk. Ezért ennyire sűrű az ólomeső. Ölj meg annyi nagy fiút, amennyit csak tudsz. ""Keresztes"" névre hallgatnak. Ha kész vagy, elvezetlek macilhoz.","No. Non entrare nel municipio. Non è più sicuro. La nostra copertura è saltata. È per questo che sta piovendo piombo. Distruggi più di questi grossi robot che puoi. Si chiamano ""Crociati"". Quando hai finito, di guiderò da Macil.",,"잠깐, 시청으로 가지 마. 이미 발각되어서 이젠 안전하지 않아. 아마도 총알의 비가 내리는 유일한 이유일 거야. 최선을 다해서 저 커다란 친구들을 격파해봐. 저놈들은 ""크루세이더"" 라고 해. 이 일을 끝마치면, 마실이 있는 곳으로 안내해줄게. ","Nee. Ga het stadhuis niet binnen. Het is niet meer veilig. Onze dekmantel is opgeblazen. Daarom regent het zwaar metaal. Dood zoveel mogelijk van die grote jongens als je kunt. Ze worden ""Kruisvaarders"" genoemd. Als je klaar bent, begeleid ik je naar Macil.","Nei. Ikke gå inn i rådhuset. Det er ikke trygt lenger. Vi er avslørt. Det er derfor det regner heavy metal. Drep så mange av de store gutta du kan. De kalles ""korsfarere"". Når du er ferdig, viser jeg deg veien til Macil.","Nie. Nie wchodź do ratusza. To już nie jest bezpieczne. Nasza przykrywka została zdmuchnięta. To dlatego pada heavy metal. Zabij jak najwięcej tych wielkich chłopców. Nazywają się ""krzyżowcami"". Kiedy skończysz, zaprowadzę cię do Macil.","Não. Não entre na prefeitura. Não é mais seguro. Fomos descobertos. É por isso que está vindo chumbo grosso pra todo lado. Mate o máximo possível desses grandalhões. São chamados de ""Cruzados"". Quando você terminar, eu te levo pro Macil.",,"Nu. Nu intra în oraș. Ni s-a dus acoperirea. De asta plouă cu metale grele. Omoară cât de mulți băieți duri poți. Se cheamă ""Cruciați"". Când ești gata o să te îndrum spre Macil.","Нет. Не входи в ратушу. Там небезопасно. Наше прикрытие сорвано. Вот почему идёт дождь из тяжёлого металла. Убей как можно больше этих здоровяков. Они называются «Крестоносцы». Когда закончишь, я отведу тебя к Мэйсилу.",,"Nej. Gå inte in i stadshuset. Det är inte säkert längre. Vår täckmantel är avslöjad. Det är därför det regnar heavy metal. Döda så många av de stora pojkarna som du kan. De kallas ""korsfarare"". När du är klar guidar jag dig till Macil.","Hayır. Belediye binasına girme. Artık güvenli değil. Kimliğimiz açığa çıktı. Bu yüzden heavy metal yağıyor. O koca oğlanlardan öldürebildiğiniz kadarını öldürün. Onlara ""Haçlılar"" deniyor. İşiniz bittiğinde, sizi Macil'e götüreceğim." +"Good work, friend! It's time to bring you inside.",TXT_SUB_LOG232,,,,"Dobrá práce, kamaráde! Je čas přivést tě dovnitř.","Godt arbejde, min ven! Det er tid til at bringe dig indenfor.","Gute Arbeit, mein Freund. Es ist Zeit dich hereinzubringen.",,,"¡Buen trabajo, amigo! Es hora de traerte adentro.",,"Hyvää työtä, ystävä! On aika tuoda sinut sisälle.","Bien joué, mon ami! Il est temps de te faire rentrer.",,Szép munka barátom! Ideje bevinnelek.,"Ottimo lavoro, amico! È ora di farti entrare.",,"건투를 빌어, 친구! 안으로 들여보내 줄게. ","Goed werk, vriend! Het is tijd om je binnen te brengen.","Godt jobbet, min venn! Det er på tide å få deg inn.","Dobra robota, przyjacielu! Czas wprowadzić cię do środka.","Bom trabalho, amigo! Hora de trazê-lo pra dentro.",,"Bună treabă, prietene! E timpul să te aduc înăuntru!","Хорошая работа, друг! Пришло время впустить тебя внутрь.",,"Bra jobbat, min vän! Det är dags att ta in dig.","İyi iş, dostum! Seni içeri götürme vakti geldi." +"Watch out for those Crusaders. They're big, hunking robots, and mean as hell. We don't know jack about their weapons, but odds are... you're outmatched. Careful.",TXT_SUB_LOG233,,,,"Pozor na ty Křižáky. Jsou to velcí, mohutní roboti a zatraceně zlí. Nevíme nic o jejich zbraních. Vypadá to že... jsou v přesile. Opatrně.","Pas på de korsfarere. De er store, store robotter, og onde som bare fanden. Vi ved ikke noget om deres våben, men oddsene er... at I er underlegne. Pas på.",Sieh dich vor den Ordensrittern vor. Das sind große und mächtige Roboter und höllisch gefährlich. Wir wissen nichts über ihre Waffen aber sie übertreffen deine bei weitem. Vorsicht!,,,"Ten cuidado con esos Cruzados. Son unos robots enormes y despiadados. No sabemos nada sobre sus armas, pero lo probable es... que te lleven ventaja. Cuidado.",,"Varo noita ristiretkeläisiä. Ne ovat isoja järkälemäisiä robotteja ja helvetin häijyjä. Emme tiedä yhtikäs mitään niiden aseista, mutta todennäköisyys on... että olet heikoilla. Varovaisesti.","Fais attention aux croisés, ce sont des sacrément grosses machines, et salement méchantes, aussi. On ne sait pas quelles armes ils utilisent, mais il est probable qu'ils en ont.. Plus que toi. Fais attention.",,"Vigyázz azokkal a keresztesekkel. Nagy, testes robotok, és morcosok is. nem sokat tudunk a fegyvereikről, de az esélyied... nem túl fényesek. Vigyázz magadra.","Attento a questi Crociati. Sono grossi, potenti robot e davvero pericolosi. Non sappiamo nulla sulle loro armi ma è molto probabile... che tu sia surclassato. Attento.",,"크루세이더를 조심해. 저놈들은 커다랗고 강력한 기동 병기야. 난폭하기도 하지. 놈들의 무장이 뭔지 모르지만, 중요한 점은 넌 포위됐다는 거지. 조심해. ","Kijk uit voor die kruisvaarders. Het zijn grote, hangende robots, en gemeen als de hel. We weten niet hoe het met hun wapens zit, maar de kans is groot dat je niet bij elkaar past. Voorzichtig.","Se opp for korsfarerne. De er store, kjekke roboter, og slemme som faen. Vi vet ingenting om våpnene deres, men det er sannsynlig at dere er underlegne. Forsiktig.","Uważaj na tych Krzyżowców. To wielkie, potężne roboty i wredne jak diabli. Nie wiemy nic o ich broni, ale prawdopodobnie... nie macie szans. Ostrożnie.","Cuidado com esses Cruzados. São robôs grandes e perigosos pra caramba. Não sabemos merda nenhuma sobre as suas armas, mas as chances são de que... você está em desvantagem. Cuidado.",,"Ai grijă la Cruciați. Sunt roboți imenși, și duri ca naiba. Nu știm absolut nimic despre armamentul lor, dar șansele sunt... nu ești pe măsura lor. Grijă.","Остерегайся крестоносцев. Они большие, громадные роботы, и чертовски злые. Мы не знаем ничего об их оружии, но, скорее всего... ты не справишься. Будь осторожен.",,"Se upp för de där korsfararna. De är stora, jättelika robotar och elaka som fan. Vi vet inget om deras vapen, men oddsen är... att ni är underlägsna. Var försiktig.","Şu Haçlılara dikkat et. Onlar büyük, iri robotlar ve çok acımasızlar. Silahları hakkında bir şey bilmiyoruz, ama ihtimaller... rakibiniz yok. Dikkatli olun." +"Great job. You're my idea of a good time. Now, without anyone seeing you, go through the door on the right, head on upstairs and meet the man.",TXT_SUB_LOG234,,,,"Skvělá práce. Vypadáš jako člověk do nepohody. A teď, bez toho, aby tě někdo uviděl, projdi dveřmi napravo, jdi po schodech nahoru a setkej se s ním.","Godt gået. Du er min idé om en god tid. Gå nu, uden at nogen ser dig, gennem døren til højre, gå op ad trappen og mød manden.","Gute Arbeit. Das macht mir richtig Freude. Nun gehe - ohne dass man dich sieht - durch die Tür da rechts, und treffe den Mann.",,,"Buen trabajo. Eres mi idea de una buena juerga. Ahora, sin que te vean, ve por la puerta a la derecha, sube las escaleras y conoce al hombre.",,"Hyvää työtä. Vastaat mielikuvaani hyvästä ajanvietteestä. Mene nyt kenenkään näkemättä oikeanpuoleisen oven läpi, kulje yläkertaan ja tapaa mies.","Bien joué, tu connaîs bien mon idée d'une bonne fête. Maintenant, sans que personne ne te voie, passe par la porte à droite, monte à l'étage et rencontre le type.",,"Remek munka. Te vagy a jól eltöltött idő definíciója. Most pedig anélkül, hogy bárki meglátna, menj a jobb oldalon levő ajtóhoz, majd az emeleten találkozz az emberünkkel.","Ottimo lavoro. Tu si che mi fai divertire. Ora, senza che nessuno ti veda, attraversa la porta alla tua destra, vai di sopra e incontralo.",,"잘 싸웠어. 내가 생각지도 못한 기발한 생각을 많이 하네. 이제, 모두가 너를 보지 않는 동안 오른쪽 문으로 들어가서 계단을 올라가고 남자를 만나.","Goed werk. Jij bent mijn idee van een goede tijd. Nu, zonder dat iemand je ziet, ga door de deur aan de rechterkant, ga naar boven en ontmoet de man.","Bra jobbet. Du er min idé om en god tid. Nå, uten at noen ser deg, gå gjennom døren til høyre, gå ovenpå og møt mannen.","Świetna robota. Jesteś moim pomysłem na dobrą zabawę. Przejdź przez drzwi po prawej, wejdź na górę i spotkaj się z tym człowiekiem.","Muito bom. Você sabe mesmo como entreter alguém. Agora, sem ninguém te ver, entre pela porta à direita, suba as escadas e encontre o cara.",,"Bună treabă. Acum, fără nimeni care să te vadă, du-te prin ușa de la dreapta, la etaj, și întâlnește-l.","Отличная работа. Ты - мой способ хорошо провести время. Теперь, чтобы никто тебя не увидел, пройди через дверь справа, поднимись наверх и встреться с мужчиной.",,"Bra jobbat. Du är min idé om att ha roligt. Nu, utan att någon ser dig, gå genom dörren till höger, gå upp på övervåningen och möt mannen.","İyi iş çıkardın. Sen benim iyi vakit geçirme anlayışımsın. Şimdi, kimse seni görmeden, sağdaki kapıdan geç, yukarı çık ve adamla buluş." +"You let anyone see you, we'll have your head.",TXT_SUB_LOG235,,,,"Dovolíš, aby tě někdo uviděl, a budeme mít tvou hlavu.","Hvis du lader nogen se dig, får vi dit hoved.","Wenn man dich sieht, machen wir dich alle.",,,"Si dejas que te vean, tomaremos tu cabeza.",,"Jos annat kenenkään nähdä sinut, pääsi on vadilla.","Si qui que ce soit te voit, on aura ta tête.",,"Ha bárki meglát, levesszük a fejed.","Se ti vede qualcuno, avremo la tua testa.",,결국엔 사람들이 너를 보았네. 사적인 건 아니지만 넌 죽어줘야겠어. ,"Als je iemand je laat zien, hebben we je hoofd.","Hvis noen ser deg, tar vi hodet ditt.","Jeśli ktoś cię zobaczy, dostaniesz głowę.","Se você deixar alguém te ver, a sua cabeça é nossa.",,Lași pe cineva să te vadă și-ți luăm capul.,"Если ты позволишь кому-нибудь увидеть себя, мы получим твою голову.",,"Om någon ser dig, så tar vi ditt huvud.","Birinin seni görmesine izin verirsen, kelleni alırız." +"You stupid, stumbling, club-footed hunchback imbecile! You've given us away!",TXT_SUB_LOG236,,,,"Ty hloupý, klopýtavý, těžkopádný idiotský hrbáči! Prozradils nás!","Din dumme, snublende, klumpfodede, pukkelryggede idiot! Du har afsløret os!","Du dummer, ungeschickter, klumpfüßiger, buckliger Trottel. Du hast uns verraten.",,,¡Estúpido patán! ¡Nos has traicionado!,,"Sinä typerä, kömpelö, kampurajalkainen imbesilli! Olet paljastanut meidät!","Espèce d'abruti, crétin bossu pas foutu de marcher droit! Tu fait foirer notre couverture!",,Te hülye botladozó kétballábú púpos állat! Észrevettek minket miattad!,"Stupido, impiastro, gobbo imbecille! Ci hai fatto scoprire!",,"이 어리석은, 멍청한, 짜리몽땅한 말미잘 얼간이! 우리 곁을 떠나다니!","Jij stomme, struikelende, knotsvoetige bochelende imbeciel! Je hebt ons weggegeven!","Din dumme, klumpfotete, pukkelryggede idiot! Du har avslørt oss!","Ty głupi, potykający się, garbaty imbecylu! Wydałeś nas!",Seu imbecil idiota estúpido duma figa! Você nos entregou!,,Imbecilule! Ne-ai dat de gol!,"Ты тупой, неуклюжий, косолапый горбатый имбецил! Ты нас выдал!",,"Din dumma, snubblande, klumpfotade puckelryggiga idiot! Du har avslöjat oss!","Seni aptal, tökezleyen, sopa ayaklı, kambur embesil! Bizi ele verdin!" +"I wish I was waiting for you behind that door... but I've got to stay underground. It's time for you to meet our leader, Macil.",TXT_SUB_LOG237,,,,"Přála bych si, abych to byla já, kdo bude čekat za těmi dveřmi... ale musím zůstat v podzemí. Je čas setkat se s naším vůdcem, Macilem.","Jeg ville ønske, jeg ventede på dig bag den dør ... men jeg må blive under jorden. Det er tid til at du skal møde vores leder, Macil.","Ich wünschte, ich würde hinter der Tür dort warten... aber ich muss im Untergrund bleiben. Es ist Zeit, unseren Anführer, Macil, zu treffen.",,,"Ojalá fuera yo esperando tras esa puerta... Pero debo mantenerme bajo tierra. Es hora de que conozcas a nuestro lider, Macil.",,"Kunpa olisin voinut olla sinua ovella vastassa, mutta minun on pysyttävä maan alla. Sinun on aika tavata johtajamme, Macilin.","J'aurais adoré être de l'autre côté de cette porte.. Mais il faut que je reste sous terre. Il est temps que tu rencontre notre leader, Macil.",,"Bárcsak Én várhatnálak az ajtó mögött... de a föld alatt kell maradnom. Itt az ideje, hogy megismerd a vezetőnket, Macilt.","Vorrei esserci io ad attenderti dietro la porta... ma devo rimanere sottoterra. È tempo per te di incontrare il nostro leader, Macil.",,저 문 앞에서 내가 기다리고 있었으면 얼마나 좋을까... 하지만 난 지하에서 임무를 수행해야 해. 마실 사령관을 만날 준비를 해.,Ik wou dat ik achter die deur op je zat te wachten.... maar ik moet ondergronds blijven. Het is tijd om onze leider Macil te ontmoeten.,"Jeg skulle ønske jeg ventet på deg bak den døra, men jeg må holde meg under jorden. Det er på tide at du møter lederen vår, Macil.","Chciałbym czekać na ciebie za tymi drzwiami... ale muszę zostać pod ziemią. Czas, byś poznał naszego przywódcę, Macila.","Eu queria estar te esperando por trás daquela porta... mas eu tenho que ficar no subterrâneo. É hora de você conhecer o nosso líder, Macil.",,"Speram ca eu să te aștept în spatele ușii... dar trebuie să rămân în subteran. E timpul să ne cunoști liderul, Macil.","Хотела бы я ждать тебя за этой дверью... но я должна оставаться под землёй. Пришло время познакомить тебя с нашим лидером, Мэйсилом.",,"Jag önskar att jag väntade på er bakom den dörren... men jag måste stanna under jorden. Det är dags för dig att träffa vår ledare, Macil.",Keşke o kapının arkasında seni bekliyor olsaydım... ama yeraltında kalmalıyım. Liderimiz Macil ile tanışma vaktin geldi. +,,Blackbird's remarks embedded in other conversations,,,,,,,,,,,,,,,,,,,,,,,,,, +"Bloated pig. I know nothing about this so-called power coupling, so let's go slow.",TXT_BBSUB_SCRIPT02_D57608_IFIKN,MAP02: Mourel.,,,"Prohnilá svině. O téhle jakési spojce nic nevím, tak na to pojďme pomalu.","Oppustet gris. Jeg ved intet om denne såkaldte kraftkobling, så lad os gå langsomt frem.",Aufgeblasener Mistkerl. Ich weiß nichts über diese sogenannte Anzapfung so lass uns vorsichtig sein.,,,"Qué cerdo hinchado. No sé nada sobre ese supuesto acoplamiento de energía, así que vayamos con calma.",,"Pöhöttynyt sika. En tiedä mitään tästä niin sanotusta virtaliittimestä, joten otetaan rauhallisesti.","Quel porc. Je ne sais rien sur ce coupleur énergétique, allons-y doucement.",,"Te dagadt disznó. Nem tudok semmit erről az úgynevezett áramelosztóról, szóval menjünk csak lassan.","Che pallone gonfiato. Non so nulla su questo aggeggio, quindi andiamoci piano.","慢心してた。私はこの配電機と言われている物について何も知らない。 まあゆっくりやろう。",배부른 돼지 같은 녀석. 난 이 추출기에 대해서 아무것도 몰라. 일단 성급하지 말자.,"Opgeblazen varken. Ik weet niets van deze zogenaamde stroomkoppeling, dus laten we langzaam gaan.","Oppblåste gris. Jeg vet ingenting om denne såkalte kraftkoblingen, så la oss ta det rolig.","Nadęta świnia. Nie wiem nic o tym tak zwanym sprzężeniu mocy, więc chodźmy powoli.","Que porco nojento. Eu não sei nada sobre essa tal ligação de energia, então vamos devagar.",,"Porcule. Nu știu nimic despre așa-zisul cuplaj de putere, așa că să mergem încet.",Жирная свинья. Я ничего не знаю об этой «соединительной муфте». Давай не будем торопиться.,,"Uppblåsta gris. Jag vet inget om den här så kallade maktkopplingen, så vi går långsamt fram.","Şişirilmiş domuz. Bu sözde güç birleşmesi hakkında hiçbir şey bilmiyorum, o yüzden yavaş gidelim." -"Sounds like a dream job, doesn't it?",TXT_BBSUB_SCRIPT03_D4548_GOODB,MAP03: Macil.,,,"To zní jako práce snů, ne?","Det lyder som et drømmejob, ikke sandt?","Hört sich an wie ein Traumjob, nicht wahr?",,,"Suena a un trabajo ideal, ¿no?",,Eikö kuulostakin unelmapestiltä?,"On dirait que c'est le boulot idéal, non?","Olyan mint egy álom meló, ugye?","Sembra un lavoro da sogno, no?",夢の様な仕事ね、そう思わない?,"듣기만 해도 꿈에 그리던 일만 같네, 그렇지?","Klinkt als een droombaan, nietwaar?","Høres ut som en drømmejobb, ikke sant?","Brzmi jak praca marzeń, prawda?","Parece ser o emprego dos sonhos, não é mesmo?",,"Sună ca un vis, nu?","Это же работа мечты, разве нет?",,"Låter som ett drömjobb, eller hur?","Rüya gibi bir iş, değil mi?" -And I'll be right there with you.,TXT_BBSUB_SCRIPT03_D7580_TAKET,〃,,,A já tam budu s tebou.,Og jeg vil være lige der sammen med dig.,Und ich werde bei deiner Seite sein.,,,Y estaré justo ahí contigo.,,Ja olen kanssasi koko ajan.,Et je serais là pour toi.,Mindig ott leszek neked.,E io sarò lì con te.,それで貴方のすぐ傍にいるわ。,그리고 내가 너와 함께 있어 줄께.,En ik zal er zo bij je zijn.,Og jeg blir med deg.,A ja będę tam z tobą.,E eu vou estar bem alí do seu lado.,,O să fie alături de tine.,А я буду рядом с тобой.,,Och jag kommer att vara där med dig.,Ben de senin yanında olacağım. -Worner's a spy we recruited in the warehouse of the power station.,TXT_BBSUB_SCRIPT03_D12128_ASING,〃,,,"Worner je špión, kterého jsme najali ve skladišti elektrárny.","Worner er en spion, som vi rekrutterede i lageret på kraftværket.","Worner ist ein Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben.",,,Worner es un espía que reclutamos en el almacén de la central eléctrica.,,Worner on värväämämme vakooja voimalaitoksen varastolta.,Worner est un espion que l'on a recruté dans l'entrepôt de la centrale électrique.,"Worner egy spion, akit átállítottunk az oldalunkra az erőmű raktárjában.",Worner è una spia che noi avevamo reclutato nel magazzino della centrale elettrica.,ワーナーは発電所の倉庫に送った我々のスパイよ。,워너는 우리가 모집한 첩자야. 그는 발전소 창고에 있어.,Worner is een spion die we in het magazijn van de centrale hebben gerekruteerd.,Worner er en spion vi rekrutterte på lageret til kraftstasjonen.,"Worner to szpieg, którego zwerbowaliśmy w magazynie elektrowni.",O Worner é um espião que recrutamos no depósito da usina elétrica.,,Worner e un spion pe care l-am recrutat în depozitul stației de energie.,"Уорнэр — шпион, которого мы завербовали на складе электростанции.",,Worner är en spion som vi rekryterade i kraftverkets lager.,"Worner, güç istasyonunun deposunda işe aldığımız bir casus." -Make sure you're ready for the fight of your life. No scrimping. Spend everything you've got.,TXT_BBSUB_SCRIPT03_D16676_THEPR,〃,,,"Ujisti se, že jsi připraven na souboj svého života. Žádné škudlení. Utrať všechno, co máš.","Sørg for, at du er klar til dit livs kamp. Ingen spareøvelser. Brug alt, hvad du har.","Bereite dich auf den Kampf deines Lebens vor. Kein falsche Sparsamkeit, benutze alles, was du hast.",,,Asegúrate de estar preparado para la pelea de tu vida. No escatimes. Gástate todo lo que tengas.,,"Pidä huoli, että olet valmis taisteluun elämästäsi. Ei pihistelyä, käytä kaikki varasi.","Sois sûr que tu est prêt pour le combat le plus brutal de ta vie. Pas d'avarice, dépense tout ce que tu as.","Remélem készen állsz életed harcára. Ne kicsinyeskedj, költsd el minden pénzed.",Preparati per la lotta della tua vita. Non risparmiare. Spendi tutto ciò che hai.,"己の命の為に戦う準備が出来ているか確認して。 +"Sounds like a dream job, doesn't it?",TXT_BBSUB_SCRIPT03_D4548_GOODB,MAP03: Macil.,,,"To zní jako práce snů, ne?","Det lyder som et drømmejob, ikke sandt?","Hört sich an wie ein Traumjob, nicht wahr?",,,"Suena a un trabajo ideal, ¿no?",,Eikö kuulostakin unelmapestiltä?,"On dirait que c'est le boulot idéal, non?",,"Olyan mint egy álom meló, ugye?","Sembra un lavoro da sogno, no?",夢の様な仕事ね、そう思わない?,"듣기만 해도 꿈에 그리던 일만 같네, 그렇지?","Klinkt als een droombaan, nietwaar?","Høres ut som en drømmejobb, ikke sant?","Brzmi jak praca marzeń, prawda?","Parece ser o emprego dos sonhos, não é mesmo?",,"Sună ca un vis, nu?","Это же работа мечты, разве нет?",,"Låter som ett drömjobb, eller hur?","Rüya gibi bir iş, değil mi?" +And I'll be right there with you.,TXT_BBSUB_SCRIPT03_D7580_TAKET,〃,,,A já tam budu s tebou.,Og jeg vil være lige der sammen med dig.,Und ich werde bei deiner Seite sein.,,,Y estaré justo ahí contigo.,,Ja olen kanssasi koko ajan.,Et je serais là pour toi.,,Mindig ott leszek neked.,E io sarò lì con te.,それで貴方のすぐ傍にいるわ。,그리고 내가 너와 함께 있어 줄께.,En ik zal er zo bij je zijn.,Og jeg blir med deg.,A ja będę tam z tobą.,E eu vou estar bem alí do seu lado.,,O să fie alături de tine.,А я буду рядом с тобой.,,Och jag kommer att vara där med dig.,Ben de senin yanında olacağım. +Worner's a spy we recruited in the warehouse of the power station.,TXT_BBSUB_SCRIPT03_D12128_ASING,〃,,,"Worner je špión, kterého jsme najali ve skladišti elektrárny.","Worner er en spion, som vi rekrutterede i lageret på kraftværket.","Worner ist ein Spion, den wir im Lagerhaus des Kraftwerks rekrutiert haben.",,,Worner es un espía que reclutamos en el almacén de la central eléctrica.,,Worner on värväämämme vakooja voimalaitoksen varastolta.,Worner est un espion que l'on a recruté dans l'entrepôt de la centrale électrique.,,"Worner egy spion, akit átállítottunk az oldalunkra az erőmű raktárjában.",Worner è una spia che noi avevamo reclutato nel magazzino della centrale elettrica.,ワーナーは発電所の倉庫に送った我々のスパイよ。,워너는 우리가 모집한 첩자야. 그는 발전소 창고에 있어.,Worner is een spion die we in het magazijn van de centrale hebben gerekruteerd.,Worner er en spion vi rekrutterte på lageret til kraftstasjonen.,"Worner to szpieg, którego zwerbowaliśmy w magazynie elektrowni.",O Worner é um espião que recrutamos no depósito da usina elétrica.,,Worner e un spion pe care l-am recrutat în depozitul stației de energie.,"Уорнэр — шпион, которого мы завербовали на складе электростанции.",,Worner är en spion som vi rekryterade i kraftverkets lager.,"Worner, güç istasyonunun deposunda işe aldığımız bir casus." +Make sure you're ready for the fight of your life. No scrimping. Spend everything you've got.,TXT_BBSUB_SCRIPT03_D16676_THEPR,〃,,,"Ujisti se, že jsi připraven na souboj svého života. Žádné škudlení. Utrať všechno, co máš.","Sørg for, at du er klar til dit livs kamp. Ingen spareøvelser. Brug alt, hvad du har.","Bereite dich auf den Kampf deines Lebens vor. Kein falsche Sparsamkeit, benutze alles, was du hast.",,,Asegúrate de estar preparado para la pelea de tu vida. No escatimes: gástate todo lo que tengas.,,"Pidä huoli, että olet valmis taisteluun elämästäsi. Ei pihistelyä, käytä kaikki varasi.","Sois sûr que tu est prêt pour le combat le plus brutal de ta vie. Pas d'avarice, dépense tout ce que tu as.",,"Remélem készen állsz életed harcára. Ne kicsinyeskedj, költsd el minden pénzed.",Preparati per la lotta della tua vita. Non risparmiare. Spendi tutto ciò che hai.,"己の命の為に戦う準備が出来ているか確認して。 ケチケチせずに。持ってる物全て使うのよ。",일생일대의 격전에 대비해. 돈 아끼지 말고 있는 대로 다 써.,Zorg ervoor dat je klaar bent voor de strijd van je leven. Geen krassen. Besteed alles wat je hebt.,Sørg for at du er klar for ditt livs kamp. Ikke spar på noe. Bruk alt du har.,"Upewnij się, że jesteś gotowy na walkę swojego życia. Nie oszczędzaj. Wydajcie wszystko, co macie.",Tenha certeza de que você estará preparado para lutar pela sua vida. Não poupa nada. Vai com tudo.,,Pregătește-te pentru lupta vieții tale. Cheltuie tot ce ai.,Приготовься к главному бою в своей жизни. Не скупись. Потрать на подготовку всё золото.,,Se till att du är redo för ditt livs kamp. Ingen snålhet. Spendera allt du har.,Hayatının savaşına hazır olduğundan emin ol. Cimrilik yok. Sahip olduğun her şeyi harca. -"Excuse me, I'm gonna be sick.",TXT_BBSUB_SCRIPT04_D21224_BUSIN,MAP04: Derwin.,,,"Omluv mě, budu zvracet.","Undskyld mig, jeg bliver syg.","Entschuldige, aber mir wird übel.",,,"Disculpa, pero me voy a poner mala.","Disculpa, pero me voy a enfermar.","Suo anteeksi, kohta lentää laatta.","Pardon, je crois que je vais vomir.","Bocs, de mindjárt rosszul leszek.","Scusami, sto per sentirmi male.",失礼ながら、しゃくに障るわ。,"실례지만, 이거 좀 골때리겠는데?","Excuseer me, ik word ziek.","Unnskyld meg, jeg må kaste opp.","Przepraszam, będę chory.","Desculpa, estou passando mal.",,"Scuză-mă, o să mi se facă rău.","Прости, меня сейчас вырвет.",,"Ursäkta mig, jag måste spy.","Affedersiniz, hasta olacağım." -Mmm. Sounds like weapons. We can always use more firepower.,TXT_BBSUB_SCRIPT04_D25772_TELLW,MAP04: Worner.,,,"Mhmm, to zní jako zbraně. Palebná síla se nám vždycky hodí.",Jeg er syg. Lyder som våben. Vi kan altid bruge mere ildkraft.,Hm... Klingt wie Waffen. Mehr Feuerkraft können wir immer gebrauchen.,,,Mmm. Suena a armas. Siempre nos viene bien más potencia de fuego.,,"Mmm, kuulostaa aseilta. Lisätulivoima aina kelpaa.",Mmmh. On dirait des armes. On peut toujours faire avec plus de puissance de feu.,Hmmm. Még több fegyvernek hangzik. Sosem lehet elég fegyverünk.,Mm. Sembrano delle armi. Ci fanno sempre comodo armi pesanti.,フーム。聞く限り武器の様ね。いつも以上の火力を出せそうだ。,으음. 왠지 무기 같은데. 화력이야 더 많으면 좋지.,Mmm. Klinkt als wapens. We kunnen altijd meer vuurkracht gebruiken.,Mmm. Høres ut som våpen. Vi kan alltids bruke mer ildkraft.,Mmm. Brzmi jak broń. Zawsze możemy użyć więcej siły ognia.,Hmmm. Sinto cheiro de armas. Poder de fogo a mais é sempre bem-vindo.,,Mmm. Sună a arme. Putem folosi mai multă putere de foc oricând.,"М-м-м. Похоже, там оружие. Лишняя огневая мощь не помешает.",,"Jag är sjuk, jag måste bli sjuk. Låter som vapen. Vi kan alltid behöva mer eldkraft.",Mmm. Silahlara benziyor. Her zaman daha fazla ateş gücü kullanabiliriz. -"This sounds too easy, but let's give it a shot.",TXT_BBSUB_SCRIPT04_D31836_WHATD,MAP04: Reactor Core → Northern alarm door,,,"To zní až moc snadně, ale zkusme to.","Det lyder for nemt, men lad os prøve.","Das klingt zu einfach, aber lass es uns versuchen.",,,"Esto suena muy fácil, pero intentémoslo.",,"Kuulostaa liian helpolta, mutta yritetään.",Ca à l'air trop facile mais ça vaut le coup d'essayer.,"Túl könnyűnek hangzik, de próbálkozzunk meg vele.","Sembra troppo facile, ma proviamoci.",簡単すぎるけど、一発かましてみましょうか。,"쉬운 일 같지만, 일단 한번 해보자고.","Dit klinkt te gemakkelijk, maar laten we het eens proberen.","Dette høres for enkelt ut, men la oss prøve.","To brzmi zbyt łatwo, ale spróbujmy.","Tá parecendo fácil demais, mas vamos tentar.",,"Sună ușor, dar să încercăm.",Слишком уж заманчиво. Хотя давай попытаемся.,,"Det här låter för enkelt, men vi gör ett försök.",Kulağa çok kolay geliyor ama bir deneyelim. -Who cares. Nobody listens to programmers anyway.,TXT_BBSUB_SCRIPT04_D40932_LETME,MAP04: Reactor Core → Southern alarm door,,,"Koho to zajímá, programátory stejně nikdo neposlouchá.",Det er ligegyldigt. Ingen lytter til programmører alligevel.,Egal! Wer hört schon auf Programmierer.,,,¿A quién le importa? Si nadie escucha a los programadores.,,Mitä väliä. Kukaan ei muutenkaan kuuntele ohjelmoijia.,"On s'en fout, personne n'écoute les programmeurs de toute manières.",Kit érdekel. Senki sem hallgat a programozókra.,A chi importa. Tanto nessuno sta a sentire i programmatori.,面倒ね。プログラマーについて知ってるのは誰もいないわ。,어쩌라고. 아무도 프로그래머들 이야기는 안 듣는데.,Wat maakt het uit. Niemand luistert sowieso naar programmeurs.,Hvem bryr seg? Ingen hører på programmerere uansett.,Kogo to obchodzi. I tak nikt nie słucha programistów.,Quem liga? Ninguém dá bola pros programadores mesmo.,,Cui îi pasă. Nimeni nu ascultă de programatori oricum.,Какая разница? Программистов всё равно никто не слушает.,,Vem bryr sig? Ingen lyssnar på programmerare ändå.,Kimin umurunda. Kimse programcıları dinlemiyor zaten. -"Ooh. Glad I'm in hiding, if you know what I mean.",TXT_BBSUB_SCRIPT04_D54576_ITSAS,〃,,,"Ou, jsem ráda, že se schovávám, jestli víš, co tím myslím.","Ooh. Jeg er glad for, at jeg gemmer mig, hvis du forstår, hvad jeg mener.","Uh. Wie gut, dass ich mich verstecke - du weißt schon was ich meine.",,,"Ooh. Menos mal que estoy escondida, si sabes a lo que me refiero.",,"Oo, onneksi olen piilossa, tiedätkö.","Ooh, je suis contente d'être cachée, si tu vois ce que je veux dire.","Óh. Még jó hogy ebújtam, már ha érted mire gondolok.","Ooh. Per fortuna che sono nascosta, se capisci cosa intendo.",オオゥ。私が言わなくてもわかるけど、隠れた方がいいわね。,"오, 내가 숨어있어서 다행이야. 무슨 뜻인지 알겠지?","Ooh. Blij dat ik ondergedoken zit, als je begrijpt wat ik bedoel.","Ooh. Jeg er glad jeg er i skjul, hvis du skjønner hva jeg mener.","Ooh. Cieszę się, że się ukrywam, jeśli wiesz, co mam na myśli.","Oooh. Ainda bem que estou escondida, se é que você me entende.",,"Ooh. Mă bucur că mă ascund, dacă știi ce zic.","Ой. Хорошо, что я в укрытии, если ты понимаешь, о чём я.",,"Ooh. Jag är glad att jag gömmer mig, om du förstår vad jag menar.","Ooh. Saklandığıma sevindim, ne demek istediğimi anlıyorsan." -What a grouch. I hope you get to kill him later.,TXT_BBSUB_SCRIPT05_D1516_OKBUT,MAP05: Door Guard.,,,"Takový mrzout. Doufám, že ho pak zabijeme.","Sikke en gnavpot. Jeg håber, du får lov til at dræbe ham senere.",Was für ein Ekel. Hoffentlich kannst du ihn später mal erledigen.,,"Kiel grumblema. Mi esperas, ke vi mortigos lin poste.",Qué gruñón. Espero que lo mates luego.,,Mikä hapannaama. Toivottavasti pääset tappamaan hänet myöhemmin.,Quel grincheux. J'espère qu'on va le buter plus tard.,Micsoda mogorva barom. Remélem később lehetőséged lesz megölni.,Che brontolone. Spero che ti ritrovi a ucciderlo dopo.,なに拗ねてるの。後で彼を殺すのを期待してるわ。,뭐가 이리 불만이야. 나중에 얘 좀 꼭 처리해줘.,Wat een humeur. Ik hoop dat je hem later kunt vermoorden.,For en grinebiter. Jeg håper du får drepe ham senere.,"Co za zrzęda. Mam nadzieję, że będziesz mógł go później zabić.",Que rabugento! Espero que você mate ele depois.,,Ce dobitoc. Sper să îl omori mai târziu.,"Ну и зануда. Надеюсь, ты потом вернёшься и снесёшь ему башку.",,Vilken gnällspik. Jag hoppas att du får döda honom senare.,Ne huysuz. Umarım onu daha sonra öldürürsün. -"""This area's off limits!"" Pompous so-and-so.",TXT_BBSUB_SCRIPT05_D3032_DOILO,〃,,,„Do této oblasti je vstup zakázán!“ Pompézní hajzl.,Dette område er forbudt område! Opblæste sådan-og-så.,„Zutritt verboten!“ Elendiger Wichtigtuer.,,,«Istí firi di lis límitis». Pero qué estirado.,«Istí firi di lis límitis». Pero qué creído.,"""Alueeseen on pääsy kielletty!"" Tärkeilevä mitäänsanomattomuus.","""Cette zone est à accès restreint!"" Pompeux anonyme, va.","""Tiltott a belépés!"" Persze már.","""Quest'area è ad accesso riservato!"" Pomposo miserabile.",この区域は立入禁止!'そんなワザとらしい。,“이곳은 통행 금지야!” 웃기고 앉아있네.,Dit gebied is verboden terrein! Pompous zo-en-zo.,Dette området er forbudt område! Pompøse så-og-så.,Ten teren jest niedostępny! Nadęty taki i taki.,"""Proibido entrar nessa área!"" Que miserável prepotente.",,"""Zona asta e interzisă!"" Pompos așa-și-așa.",«Здесь закрытая территория!» Надутый индюк.,,Det här området är förbjudet område! Pompösa sån och sån.,Burası yasak bölge! Kendini beğenmiş herif. -What an up guy.,TXT_BBSUB_SCRIPT05_D4548_THEOR,MAP05: Prison Guard.,,,Takový veselý chlapík!,Sikke en opblæst fyr.,Was für ein Blödmann.,,,Menudo idiota.,Qué «agradable» sujeto.,Mikä höhlä.,Quel type honnête.,De egy hülye.,Che idiota.,あら、いい男。,아주 들떠있는 녀석이네.,Wat een geweldige kerel.,For en oppblåst fyr.,Co za gość.,Que imbecil.,,Ce tip.,Какой хороший мальчик!,,Vilken uppkäftig kille.,Ne adam ama. -"Maybe it's because you didn't say ""please"".",TXT_BBSUB_SCRIPT05_D7580_OVERM,MAP05: Montag.,,,"Možná to je tím, žes neřekl „prosím“.","Måske er det fordi du ikke sagde ""tak"".",Vielleicht hättest du „Bitte“ sagen sollen.,,Eble ĉar vi ne diris «bonvole».,Habrá sido porque no has dicho «por favor».,Habrá sido porque no dijiste «por favor».,"Ehkä, koska et pyytänyt riittävän nätisi.","Peut être, c'est parce que tu n'a pas dit ""s'il vous plaît.""","Lehet mert nem mondtad hogy ""kérem szépen"".","Forse perché non hai detto ""per favore"".",多分貴方が'お願いします'と言わなかったからよ。,아마 네가 “부탁”을 안 해서 이러나 봐.,"Misschien is het omdat je niet ""alsjeblieft"" hebt gezegd.","Kanskje det er fordi du ikke sa ""vær så snill""?","Może to dlatego, że nie powiedziałeś ""proszę"".","Deve ser porque você não disse ""por favor"".",,"Poate pentru nu ai spus ""te rog"".","Наверное, ты забыл сказать «пожалуйста»?",,"Kanske är det för att du inte sa ""snälla"".","Belki de ""lütfen"" demediğin içindir." +"Excuse me, I'm gonna be sick.",TXT_BBSUB_SCRIPT04_D21224_BUSIN,MAP04: Derwin.,,,"Omluv mě, budu zvracet.","Undskyld mig, jeg bliver syg.","Entschuldige, aber mir wird übel.",,,"Disculpa, pero me voy a poner mala.","Disculpa, pero me voy a enfermar.","Suo anteeksi, kohta lentää laatta.","Pardon, je crois que je vais vomir.",,"Bocs, de mindjárt rosszul leszek.","Scusami, sto per sentirmi male.",失礼ながら、しゃくに障るわ。,"실례지만, 이거 좀 골때리겠는데?","Excuseer me, ik word ziek.","Unnskyld meg, jeg må kaste opp.","Przepraszam, będę chory.","Desculpa, estou passando mal.",,"Scuză-mă, o să mi se facă rău.","Прости, меня сейчас вырвет.",,"Ursäkta mig, jag måste spy.","Affedersiniz, hasta olacağım." +Mmm. Sounds like weapons. We can always use more firepower.,TXT_BBSUB_SCRIPT04_D25772_TELLW,MAP04: Worner.,,,"Mhmm, to zní jako zbraně. Palebná síla se nám vždycky hodí.",Jeg er syg. Lyder som våben. Vi kan altid bruge mere ildkraft.,Hm... Klingt wie Waffen. Mehr Feuerkraft können wir immer gebrauchen.,,,Mmm. Suena a armas. Siempre nos viene bien más potencia de fuego.,,"Mmm, kuulostaa aseilta. Lisätulivoima aina kelpaa.",Mmmh. On dirait des armes. On peut toujours faire avec plus de puissance de feu.,,Hmmm. Még több fegyvernek hangzik. Sosem lehet elég fegyverünk.,Mm. Sembrano delle armi. Ci fanno sempre comodo armi pesanti.,フーム。聞く限り武器の様ね。いつも以上の火力を出せそうだ。,으음. 왠지 무기 같은데. 화력이야 더 많으면 좋지.,Mmm. Klinkt als wapens. We kunnen altijd meer vuurkracht gebruiken.,Mmm. Høres ut som våpen. Vi kan alltids bruke mer ildkraft.,Mmm. Brzmi jak broń. Zawsze możemy użyć więcej siły ognia.,Hmmm. Sinto cheiro de armas. Poder de fogo a mais é sempre bem-vindo.,,Mmm. Sună a arme. Putem folosi mai multă putere de foc oricând.,"М-м-м. Похоже, там оружие. Лишняя огневая мощь не помешает.",,"Jag är sjuk, jag måste bli sjuk. Låter som vapen. Vi kan alltid behöva mer eldkraft.",Mmm. Silahlara benziyor. Her zaman daha fazla ateş gücü kullanabiliriz. +"This sounds too easy, but let's give it a shot.",TXT_BBSUB_SCRIPT04_D31836_WHATD,MAP04: Reactor Core → Northern alarm door,,,"To zní až moc snadně, ale zkusme to.","Det lyder for nemt, men lad os prøve.","Das klingt zu einfach, aber lass es uns versuchen.",,,"Esto suena muy fácil, pero intentémoslo.",,"Kuulostaa liian helpolta, mutta yritetään.",Ca à l'air trop facile mais ça vaut le coup d'essayer.,,"Túl könnyűnek hangzik, de próbálkozzunk meg vele.","Sembra troppo facile, ma proviamoci.",簡単すぎるけど、一発かましてみましょうか。,"쉬운 일 같지만, 일단 한번 해보자고.","Dit klinkt te gemakkelijk, maar laten we het eens proberen.","Dette høres for enkelt ut, men la oss prøve.","To brzmi zbyt łatwo, ale spróbujmy.","Tá parecendo fácil demais, mas vamos tentar.",,"Sună ușor, dar să încercăm.",Слишком уж заманчиво. Хотя давай попытаемся.,,"Det här låter för enkelt, men vi gör ett försök.",Kulağa çok kolay geliyor ama bir deneyelim. +Who cares. Nobody listens to programmers anyway.,TXT_BBSUB_SCRIPT04_D40932_LETME,MAP04: Reactor Core → Southern alarm door,,,"Koho to zajímá, programátory stejně nikdo neposlouchá.",Det er ligegyldigt. Ingen lytter til programmører alligevel.,Egal! Wer hört schon auf Programmierer.,,,¿A quién le importa? Si nadie escucha a los programadores.,,Mitä väliä. Kukaan ei muutenkaan kuuntele ohjelmoijia.,"On s'en fout, personne n'écoute les programmeurs de toute manières.",,Kit érdekel. Senki sem hallgat a programozókra.,A chi importa. Tanto nessuno sta a sentire i programmatori.,面倒ね。プログラマーについて知ってるのは誰もいないわ。,어쩌라고. 아무도 프로그래머들 이야기는 안 듣는데.,Wat maakt het uit. Niemand luistert sowieso naar programmeurs.,Hvem bryr seg? Ingen hører på programmerere uansett.,Kogo to obchodzi. I tak nikt nie słucha programistów.,Quem liga? Ninguém dá bola pros programadores mesmo.,,Cui îi pasă. Nimeni nu ascultă de programatori oricum.,Какая разница? Программистов всё равно никто не слушает.,,Vem bryr sig? Ingen lyssnar på programmerare ändå.,Kimin umurunda. Kimse programcıları dinlemiyor zaten. +"Ooh. Glad I'm in hiding, if you know what I mean.",TXT_BBSUB_SCRIPT04_D54576_ITSAS,〃,,,"Ou, jsem ráda, že se schovávám, jestli víš, co tím myslím.","Ooh. Jeg er glad for, at jeg gemmer mig, hvis du forstår, hvad jeg mener.","Uh. Wie gut, dass ich mich verstecke - du weißt schon was ich meine.",,,"Ooh. Menos mal que estoy escondida, si sabes a lo que me refiero.",,"Oo, onneksi olen piilossa, tiedätkö.","Ooh, je suis contente d'être cachée, si tu vois ce que je veux dire.",,"Óh. Még jó hogy ebújtam, már ha érted mire gondolok.","Ooh. Per fortuna che sono nascosta, se capisci cosa intendo.",オオゥ。私が言わなくてもわかるけど、隠れた方がいいわね。,"오, 내가 숨어있어서 다행이야. 무슨 뜻인지 알겠지?","Ooh. Blij dat ik ondergedoken zit, als je begrijpt wat ik bedoel.","Ooh. Jeg er glad jeg er i skjul, hvis du skjønner hva jeg mener.","Ooh. Cieszę się, że się ukrywam, jeśli wiesz, co mam na myśli.","Oooh. Ainda bem que estou escondida, se é que você me entende.",,"Ooh. Mă bucur că mă ascund, dacă știi ce zic.","Ой. Хорошо, что я в укрытии, если ты понимаешь, о чём я.",,"Ooh. Jag är glad att jag gömmer mig, om du förstår vad jag menar.","Ooh. Saklandığıma sevindim, ne demek istediğimi anlıyorsan." +What a grouch. I hope you get to kill him later.,TXT_BBSUB_SCRIPT05_D1516_OKBUT,MAP05: Door Guard.,,,"Takový mrzout. Doufám, že ho pak zabijeme.","Sikke en gnavpot. Jeg håber, du får lov til at dræbe ham senere.",Was für ein Ekel. Hoffentlich kannst du ihn später mal erledigen.,,"Kiel grumblema. Mi esperas, ke vi mortigos lin poste.",Qué gruñón. Espero que lo mates luego.,,Mikä hapannaama. Toivottavasti pääset tappamaan hänet myöhemmin.,Quel grincheux. J'espère qu'on va le buter plus tard.,,Micsoda mogorva barom. Remélem később lehetőséged lesz megölni.,Che brontolone. Spero che ti ritrovi a ucciderlo dopo.,なに拗ねてるの。後で彼を殺すのを期待してるわ。,뭐가 이리 불만이야. 나중에 얘 좀 꼭 처리해줘.,Wat een humeur. Ik hoop dat je hem later kunt vermoorden.,For en grinebiter. Jeg håper du får drepe ham senere.,"Co za zrzęda. Mam nadzieję, że będziesz mógł go później zabić.",Que rabugento! Espero que você mate ele depois.,,Ce dobitoc. Sper să îl omori mai târziu.,"Ну и зануда. Надеюсь, ты потом вернёшься и снесёшь ему башку.",,Vilken gnällspik. Jag hoppas att du får döda honom senare.,Ne huysuz. Umarım onu daha sonra öldürürsün. +"""This area's off limits!"" Pompous so-and-so.",TXT_BBSUB_SCRIPT05_D3032_DOILO,〃,,,„Do této oblasti je vstup zakázán!“ Pompézní hajzl.,Dette område er forbudt område! Opblæste sådan-og-så.,„Zutritt verboten!“ Elendiger Wichtigtuer.,,,«Istí firi di lis límitis». Pero qué estirado.,«Istí firi di lis límitis». Pero qué creído.,"""Alueeseen on pääsy kielletty!"" Tärkeilevä mitäänsanomattomuus.","""Cette zone est à accès restreint!"" Pompeux anonyme, va.",,"""Tiltott a belépés!"" Persze már.","""Quest'area è ad accesso riservato!"" Pomposo miserabile.",この区域は立入禁止!'そんなワザとらしい。,“이곳은 통행 금지야!” 웃기고 앉아있네.,Dit gebied is verboden terrein! Pompous zo-en-zo.,Dette området er forbudt område! Pompøse så-og-så.,Ten teren jest niedostępny! Nadęty taki i taki.,"""Proibido entrar nessa área!"" Que miserável prepotente.",,"""Zona asta e interzisă!"" Pompos așa-și-așa.",«Здесь закрытая территория!» Надутый индюк.,,Det här området är förbjudet område! Pompösa sån och sån.,Burası yasak bölge! Kendini beğenmiş herif. +What an up guy.,TXT_BBSUB_SCRIPT05_D4548_THEOR,MAP05: Prison Guard.,,,Takový veselý chlapík!,Sikke en opblæst fyr.,Was für ein Blödmann.,,,Menudo idiota.,Qué «agradable» sujeto.,Mikä höhlä.,Quel type honnête.,,De egy hülye.,Che idiota.,あら、いい男。,아주 들떠있는 녀석이네.,Wat een geweldige kerel.,For en oppblåst fyr.,Co za gość.,Que imbecil.,,Ce tip.,Какой хороший мальчик!,,Vilken uppkäftig kille.,Ne adam ama. +"Maybe it's because you didn't say ""please"".",TXT_BBSUB_SCRIPT05_D7580_OVERM,MAP05: Montag.,,,"Možná to je tím, žes neřekl „prosím“.","Måske er det fordi du ikke sagde ""tak"".",Vielleicht hättest du „Bitte“ sagen sollen.,,Eble ĉar vi ne diris «bonvole».,Habrá sido porque no has dicho «por favor».,Habrá sido porque no dijiste «por favor».,"Ehkä, koska et pyytänyt riittävän nätisi.","Peut être, c'est parce que tu n'a pas dit ""s'il vous plaît.""",,"Lehet mert nem mondtad hogy ""kérem szépen"".","Forse perché non hai detto ""per favore"".",多分貴方が'お願いします'と言わなかったからよ。,아마 네가 “부탁”을 안 해서 이러나 봐.,"Misschien is het omdat je niet ""alsjeblieft"" hebt gezegd.","Kanskje det er fordi du ikke sa ""vær så snill""?","Może to dlatego, że nie powiedziałeś ""proszę"".","Deve ser porque você não disse ""por favor"".",,"Poate pentru nu ai spus ""te rog"".","Наверное, ты забыл сказать «пожалуйста»?",,"Kanske är det för att du inte sa ""snälla"".","Belki de ""lütfen"" demediğin içindir." "Everybody is so needy. ",TXT_BBSUB_SCRIPT06_D1516_DOMYF,MAP06: Weran.,,,Každý toho tolik potřebuje.,"Alle er så trængende. -",Jeder hier ist so bedürftig!,,Ĉiuj estas tiel tropetemaj.,Cuánta gente interesada.,,Kylläpä sitä nyt ollaan niin kaiken tarpeessa.,Tout le monde est tellement demandant.,Mindenkinek kell valami.,Tutti sono così bisognosi.,誰もがとても貧しいのよ。,다들 참 궁색하게 사네.,Iedereen is zo behoeftig.,"Alle er så trengende. +",Jeder hier ist so bedürftig!,,Ĉiuj estas tiel tropetemaj.,Cuánta gente interesada.,,Kylläpä sitä nyt ollaan niin kaiken tarpeessa.,Tout le monde est tellement demandant.,,Mindenkinek kell valami.,Tutti sono così bisognosi.,誰もがとても貧しいのよ。,다들 참 궁색하게 사네.,Iedereen is zo behoeftig.,"Alle er så trengende. ","Wszyscy są tacy potrzebujący. ",Por que todo mundo é tão mimimizento?,,Toată lumea e așa neajutorată!,Тут все такие нуждающиеся!,,"Alla är så behövande. ","Herkes çok muhtaç. " -Great. Now we're shopping for the Rat King.,TXT_BBSUB_SCRIPT06_D3032_BRING,〃,,,"Super, teď máme nakupovat pro Krysího krále.",Alle er så trængende. Nu skal vi købe ind til rottekongen.,"Klasse, jetzt machen wir die Arbeit für den Rattenkönig.",,,Genial. Ahora vamos de compras para el Rey de las Ratas.,,"Loistavaa, hoidamme nyt Rottakuninkaan ostoksia.","Parfait, maintenant on fait du shopping pour le roi des rats.",Kiváló. A Patkány Király bevásárlói lettünk.,Grandioso. Adesso stiamo facendo shopping con il re dei ratti.,素敵ね。私達がラットキングのために買い物とか。,끝내준다. 이제 시궁쥐 왕의 심부름도 해야 한다니.,Geweldig. Nu zijn we aan het winkelen voor de rattenkoning.,Flott. Nå handler vi til Rottekongen.,Świetnie. Teraz robimy zakupy dla Króla Szczurów.,Que beleza. Agora estamos fazendo comprinhas pro Rato-Rei.,,Grozav. Acum facem cumpărături pentru Regele Șobolanilor.,Классно. Мы идём за покупками для Крысиного короля.,,Toppen. Nu ska vi shoppa för råttkungen.,Harika. Şimdi de Fare Kral için alışveriş yapıyoruz. -"I bet this guy smells really bad, too.",TXT_BBSUB_SCRIPT06_D4548_OPENT,〃,,,"Hádám, že tenhle chlápek taky pěkně smrdí.","Jeg vil vædde med, at han også lugter rigtig dårligt.","Ich wette, dieser Kerl riecht auch übel.",,,"Apuesto a que este tipo huele muy mal, también.",,"Lyön vetoa, että tämä tyyppi myös haisee tosi pahalta.","Je parie que ce type sent salement mauvais, aussi.","Le merném fogadni, hogy ez a pacák is büdös.",Scommetto che questo tizio ha pure un cattivo odore.,この男も酷い悪臭がすると賭けるわ。,얘도 분명 냄새 하나는 죽여줄 거야.,Ik durf te wedden dat deze kerel ook heel erg stinkt.,Jeg vedder på at denne fyren også lukter fælt.,"Założę się, że ten facet też bardzo śmierdzi.",Aposto que esse cara fede pra caramba também.,,Pun pariu că tipul ăsta mai și pute.,"Уверена, этот парень воняет особенно ужасно.",,Jag slår vad om att den här killen luktar riktigt illa också.,Eminim bu adam da çok kötü kokuyordur. -More sewers... Great. Wonder what lives down there.,TXT_BBSUB_SCRIPT06_D9096_YOUHA,〃,,,"Další stoky... skvělý. Zajímalo by mě, co tam dole žije.",Flere kloakker... Fedt. Gad vide hvad der bor dernede.,"Mehr Kanäle, toll... Ich frage mich, was da unten lebt.",,,Más alcantarillas... Genial. Me pregunto qué vivirá ahí abajo.,,Lisää viemäreitä... Mahtavaa. Kukakohan elää täällä alhaalla.,Plus d'égouts.. Youpi. Je me demande qui vit là dedans.,Még több kanális... kiváló. Mi lakhat odalent?,Altre fogne... fantastico. Mi domando cosa vive qua giù.,更なる下水道...ヤッバ。下に何が住んでるのか不思議に思うわ。,또 하수도라... 끝내준다. 저 아래에 또 뭐가 살고 있을까?,Meer riolering.... Geweldig. Ik vraag me af wat daar beneden leeft.,Mer kloakk... Flott. Lurer på hva som bor der nede.,Więcej kanałów... Świetnie. Ciekawe co tam mieszka.,Mais esgotos... Que legal. O que será que vive lá embaixo?,,Mai multe canale... Grozav. Mă întreb ce-o mai trăi jos aici.,"Снова канализация... Замечательно. Интересно, кого мы там встретим?",,Mer kloaker... Toppen. Undrar vad som bor där nere.,Daha fazla kanalizasyon. Harika. Acaba orada ne yaşıyor? -Dead end here. We'd better keep looking.,TXT_BBSUB_SCRIPT07_D6064_PROGR,MAP07: Computer room.,,,Tudy cesta nevede. Měli bychom se podívat dál.,Det er en blindgyde her. Vi må hellere lede videre.,Sackgasse. Wir sollten es woanders versuchen.,,,Un callejón sin salida. Deberíamos seguir buscando.,,Umpikuja tässä. Parasta jatkaa etsintää.,"Une impasse. Bon, on continue de chercher.",Zsákutca. Folytatnunk kell a keresést.,Qui c'è un vicolo cieco. Meglio continuare a guardare.,行き止まりだ。私達はまだこの景色を楽しめるわ。,여기가 아닌가 봐. 다른 곳을 찾아봐야겠어.,Doodlopend hier. We kunnen maar beter blijven zoeken.,Blindvei her. Vi får lete videre.,Tu jest ślepy zaułek. Lepiej szukajmy dalej.,Sem saída aqui. Melhor seguirmos procurando.,,Capăt de linie. Mai bine ne mai uităm împrejur.,Тупик. Давай продолжать поиски.,,Det är en återvändsgränd här. Det är bäst att fortsätta leta.,Burası çıkmaz sokak. Aramaya devam etsek iyi olur. +Great. Now we're shopping for the Rat King.,TXT_BBSUB_SCRIPT06_D3032_BRING,〃,,,"Super, teď máme nakupovat pro Krysího krále.",Alle er så trængende. Nu skal vi købe ind til rottekongen.,"Klasse, jetzt machen wir die Arbeit für den Rattenkönig.",,,Genial. Ahora vamos de compras para el Rey de las Ratas.,,"Loistavaa, hoidamme nyt Rottakuninkaan ostoksia.","Parfait, maintenant on fait du shopping pour le roi des rats.",,Kiváló. A Patkány Király bevásárlói lettünk.,Grandioso. Adesso stiamo facendo shopping con il re dei ratti.,素敵ね。私達がラットキングのために買い物とか。,끝내준다. 이제 시궁쥐 왕의 심부름도 해야 한다니.,Geweldig. Nu zijn we aan het winkelen voor de rattenkoning.,Flott. Nå handler vi til Rottekongen.,Świetnie. Teraz robimy zakupy dla Króla Szczurów.,Que beleza. Agora estamos fazendo comprinhas pro Rato-Rei.,,Grozav. Acum facem cumpărături pentru Regele Șobolanilor.,Классно. Мы идём за покупками для Крысиного короля.,,Toppen. Nu ska vi shoppa för råttkungen.,Harika. Şimdi de Fare Kral için alışveriş yapıyoruz. +"I bet this guy smells really bad, too.",TXT_BBSUB_SCRIPT06_D4548_OPENT,〃,,,"Hádám, že tenhle chlápek taky pěkně smrdí.","Jeg vil vædde med, at han også lugter rigtig dårligt.","Ich wette, dieser Kerl riecht auch übel.",,,"Apuesto a que este tipo huele muy mal, también.",,"Lyön vetoa, että tämä tyyppi myös haisee tosi pahalta.","Je parie que ce type sent salement mauvais, aussi.",,"Le merném fogadni, hogy ez a pacák is büdös.",Scommetto che questo tizio ha pure un cattivo odore.,この男も酷い悪臭がすると賭けるわ。,얘도 분명 냄새 하나는 죽여줄 거야.,Ik durf te wedden dat deze kerel ook heel erg stinkt.,Jeg vedder på at denne fyren også lukter fælt.,"Założę się, że ten facet też bardzo śmierdzi.",Aposto que esse cara fede pra caramba também.,,Pun pariu că tipul ăsta mai și pute.,"Уверена, этот парень воняет особенно ужасно.",,Jag slår vad om att den här killen luktar riktigt illa också.,Eminim bu adam da çok kötü kokuyordur. +More sewers... Great. Wonder what lives down there.,TXT_BBSUB_SCRIPT06_D9096_YOUHA,〃,,,"Další stoky... skvělý. Zajímalo by mě, co tam dole žije.",Flere kloakker... Fedt. Gad vide hvad der bor dernede.,"Mehr Kanäle, toll... Ich frage mich, was da unten lebt.",,,Más alcantarillas... Genial. Me pregunto qué vivirá ahí abajo.,,Lisää viemäreitä... Mahtavaa. Kukakohan elää täällä alhaalla.,Plus d'égouts.. Youpi. Je me demande qui vit là dedans.,,Még több kanális... kiváló. Mi lakhat odalent?,Altre fogne... fantastico. Mi domando cosa vive qua giù.,更なる下水道...ヤッバ。下に何が住んでるのか不思議に思うわ。,또 하수도라... 끝내준다. 저 아래에 또 뭐가 살고 있을까?,Meer riolering.... Geweldig. Ik vraag me af wat daar beneden leeft.,Mer kloakk... Flott. Lurer på hva som bor der nede.,Więcej kanałów... Świetnie. Ciekawe co tam mieszka.,Mais esgotos... Que legal. O que será que vive lá embaixo?,,Mai multe canale... Grozav. Mă întreb ce-o mai trăi jos aici.,"Снова канализация... Замечательно. Интересно, кого мы там встретим?",,Mer kloaker... Toppen. Undrar vad som bor där nere.,Daha fazla kanalizasyon. Harika. Acaba orada ne yaşıyor? +Dead end here. We'd better keep looking.,TXT_BBSUB_SCRIPT07_D6064_PROGR,MAP07: Computer room.,,,Tudy cesta nevede. Měli bychom se podívat dál.,Det er en blindgyde her. Vi må hellere lede videre.,Sackgasse. Wir sollten es woanders versuchen.,,,Un callejón sin salida. Deberíamos seguir buscando.,,Umpikuja tässä. Parasta jatkaa etsintää.,"Une impasse. Bon, on continue de chercher.",,Zsákutca. Folytatnunk kell a keresést.,Qui c'è un vicolo cieco. Meglio continuare a guardare.,行き止まりだ。私達はまだこの景色を楽しめるわ。,여기가 아닌가 봐. 다른 곳을 찾아봐야겠어.,Doodlopend hier. We kunnen maar beter blijven zoeken.,Blindvei her. Vi får lete videre.,Tu jest ślepy zaułek. Lepiej szukajmy dalej.,Sem saída aqui. Melhor seguirmos procurando.,,Capăt de linie. Mai bine ne mai uităm împrejur.,Тупик. Давай продолжать поиски.,,Det är en återvändsgränd här. Det är bäst att fortsätta leta.,Burası çıkmaz sokak. Aramaya devam etsek iyi olur. "Onward, my champion. Let's make Mr. Ugly twist and shout. ",TXT_BBSUB_SCRIPT10_D10612_YOUHA,MAP10: Macil (Possible reference to a song of The Beatles).,,,"Kupředu, můj šampióne. Pojďme pana Ošklivu hezky nakopat.","Fremad, min mester. Lad os få hr. Grimme til at vride sig og skrige. -",Und weiter gehts. Lass die Hackfresse zittern!,,,"Adelante, mi campeón. Hagamos al Sr. Feo retorcerse y gritar.",,"Eteenpäin, sotaurhoni. Pannaan Herra Rumilus vääntelehtimään ja huutamaan.",Allons-y mon champion. Allons tordre de douleur Monsieur Sale-geule.,Gyerünk bajnokom. Ne várakoztassuk meg Ocsmány urat.,"Vai avanti, mio campione. Facciamo agitare e urlare il signor Brutto.",進み出よ、わがチャンピオン。ミスター生塵を捻りつぶしてやれ。,"어서 가자, 나의 영웅. 그 못생긴 녀석에게 본때를 보여주자고.","Voorwaarts, mijn kampioen. Laten we Mr Lelijk laten draaien en schreeuwen.","Fremad, min mester. La oss få herr Stygg til å vri seg og rope.","Naprzód, mój mistrzu. Sprawmy, by Pan Brzydki skręcał się i krzyczał. +",Und weiter gehts. Lass die Hackfresse zittern!,,,"Adelante, mi campeón. Hagamos al Sr. Feo retorcerse y gritar.",,"Eteenpäin, sotaurhoni. Pannaan Herra Rumilus vääntelehtimään ja huutamaan.",Allons-y mon champion. Allons tordre de douleur Monsieur Sale-geule.,,Gyerünk bajnokom. Ne várakoztassuk meg Ocsmány urat.,"Vai avanti, mio campione. Facciamo agitare e urlare il signor Brutto.",進み出よ、わがチャンピオン。ミスター生塵を捻りつぶしてやれ。,"어서 가자, 나의 영웅. 그 못생긴 녀석에게 본때를 보여주자고.","Voorwaarts, mijn kampioen. Laten we Mr Lelijk laten draaien en schreeuwen.","Fremad, min mester. La oss få herr Stygg til å vri seg og rope.","Naprzód, mój mistrzu. Sprawmy, by Pan Brzydki skręcał się i krzyczał. ","Vai em frente, meu campeão. Vamos fazer o Sr. Feioso soltar a franga.",,"Drept în față, campionul meu. Să-l facem pe dl. Urât să țipe.","Вперёд, мой защитник. Заставим Г-на Урода сплясать и спеть.",,"Framåt, min mästare. Låt oss få herr Ful att vrida sig och skrika.","İleri, şampiyonum. Bay Çirkin'i döndürelim ve bağırtalım. " "Biomechanical? Well, that explains their seemingly endless supply of troops! And their bad attitude. ",TXT_BBSUB_SCRIPT10_D12128_THERE,,,,Biomechanické? Tak to vysvětluje jejich zdánlivě nekonečné zásoby vojáků! A jejich špatnou náladu.,"Biomekanisk? Nå, det forklarer deres tilsyneladende uendelige forsyning af tropper! Og deres dårlige indstilling. -",Biomechanisch? Das erklärt ihren anscheinend endlosen Nachschub an Truppen. Und ihre miese Gesinnung.,,,"¿Biomecánicos? Bueno, ¡eso explicaría su suministro de tropas aparentemente infinito! Y su mal carácter.",,Biomekaanisia? No se selittää heidän joukkojensa näennäisen ehtymättömän lähteen! Ja heidän pahan asenteensa.,"Biomécanique? Et bien, ça explique pourquoi ils en ont une infinité, de troupes! Ca, et leur sale heumeur.","Biomechanikus? Nos, ez megmagyarázza a majdnem végtelen számukat. És a viselkedésüket is.","Biomeccanici? Beh, questo spiegherebbe la fornitura apparentemente infinita di truppe! Ed il loro brutto carattere.","生体工学'?どうやら奴等は軍隊を無限供給しているという訳だ! +",Biomechanisch? Das erklärt ihren anscheinend endlosen Nachschub an Truppen. Und ihre miese Gesinnung.,,,"¿Biomecánicos? Bueno, ¡eso explicaría su suministro de tropas aparentemente infinito! Y su mal carácter.",,Biomekaanisia? No se selittää heidän joukkojensa näennäisen ehtymättömän lähteen! Ja heidän pahan asenteensa.,"Biomécanique? Et bien, ça explique pourquoi ils en ont une infinité, de troupes! Ca, et leur sale heumeur.",,"Biomechanikus? Nos, ez megmagyarázza a majdnem végtelen számukat. És a viselkedésüket is.","Biomeccanici? Beh, questo spiegherebbe la fornitura apparentemente infinita di truppe! Ed il loro brutto carattere.","生体工学'?どうやら奴等は軍隊を無限供給しているという訳だ! それと態度が悪いことも。 ","인간개조? 음, 이거 때문에 녀석들이 끊임없이 나오는 거였어! 녀석들 성질 더러운 것도 그렇고.","Biomechanisch? Nou, dat verklaart hun schijnbaar eindeloze voorraad aan troepen! En hun slechte houding.","Biomekanisk? Vel, det forklarer deres tilsynelatende endeløse tilførsel av tropper! Og den dårlige holdningen deres. ","Biomechaniczne? To wyjaśnia ich pozornie nieskończoną ilość żołnierzy! I ich złe nastawienie. ","Biomecânicos? Bom, deve ser por isso que o número de soldados parece não ter fim! Deve explicar os péssimos comportamentos também.",,Biomecanic? Asta explică rezerva lor de trupe aproape infinită! Și atitudinea lor oribilă.,"Биомеханических? Что ж, теперь ясно, почему их солдаты не заканчиваются! И почему они так отвратительно себя ведут.",,"Biomekaniskt? Det förklarar deras till synes oändliga tillgång på trupper! Och deras dåliga attityd. ","Biyomekanik mi? Bu onların görünüşte sonsuz asker kaynağını açıklıyor! Ve kötü tutumlarını. " -Sick fuck... Waste him!,TXT_BBSUB_SCRIPT10_D16676_IAMTH,,,,Podlý sráč... Zab ho!,Syge svin... Smid ham ud!,Der Typ ist doch krank. Mach ihn alle.,,,Maldito enfermo... ¡Cárgatelo!,,Sairas kusipää... Listi hänet!,"Quel salaud, bute le!",Beteg állat... Nyírd ki!,È malato marcio... Fallo fuori!,クソ腹立つ...!野郎を消せ!,역겨운 자식... 죽여버려!,Zieke klootzakken.... Verspil hem!,Syke jævel... Drep ham!,Chory skurwiel... Zmarnuj go!,Doente do caralho... Acaba com ele!,,Dobitoc bolnav... Nimicește-l!,Больной ублюдок... Мочи его!,,Sjuka jävlar... Slå honom ihjäl!,Hasta herif. Harca onu! -"He may be ugly, but it seems like he's on our side.",TXT_BBSUB_SCRIPT12_D12128_USETH,,,,"Možná je ošklivý, ale zdá se, že je na naší straně.","Han er måske grim, men det ser ud til, at han er på vores side.","Er mag ja hässlich sein, aber es sieht aus als ob er auf unserer Seite sei.",,,"Podrá ser feo, pero parece estar de nuestro lado.",,"Hän on ehkä ruma, mutta hän vaikuttaa olevan meidän puolellamme.","Il est hideux, mais il semble qu'il soit de notre côté.","Lehet hogy igen ronda szegény, de legalább a mi oldalunkon áll.","Può essere brutto, ma sembra che sia dalla nostra parte.",彼は醜いだろうが、我々に味方している。,"이 양반 못생기긴 했어도, 우리 편인 것 같네.","Hij is misschien lelijk, maar het lijkt erop dat hij aan onze kant staat.","Han er kanskje stygg, men det virker som om han er på vår side.","Może i jest brzydki, ale wygląda na to, że jest po naszej stronie.","Ele pode ser feio, mas parece que ele está no nosso lado.",,"O fi urât, dar pare să fie de partea noastră.","Пусть он и урод, но, похоже, он на нашей стороне.",,"Han må vara ful, men det verkar som om han är på vår sida.",Çirkin olabilir ama bizim tarafımızda gibi görünüyor. -"Judging by recent history, I guess stealth is out.",TXT_BBSUB_SCRIPT17_D10612_OHSUR,,,,"Soudě podle naší nedávné historie hádám, že pokradmu to nepůjde.","At dømme ud fra den seneste historie, så er det vist ikke muligt at gå i smug.","Nach den jüngsten Geschehnissen zu urteilen, ist Tarnung nicht drin.",,,"Juzgando nuestro historial reciente, supongo que el sigilo queda descartado.",,Lähimenneisyyden perusteella hiiviskely ei varmaankaan tule kysymykseen.,"En se basant sur ce qui vient de se passer, je pense que la discrétion n'est pas une option.",A rövidmúltból kiindulva a lopakodás nem lehetőség.,"A giudicare dalla storia recente, suppongo che essere furtivi sia da scartare.",最近の記録から判断すると、秘密は公になると私は思う。,"최근 상황을 보건대, 잠입 작전은 힘들 것 같아.","Te oordelen naar de recente geschiedenis, denk ik dat heimelijkheid uit is.","Å dømme etter det som har skjedd, er det visst slutt på å snike.","Sądząc po ostatniej historii, chyba nie ma mowy o ukrywaniu się.","Julgando pelo nosso histórico recente, acho que cautela está fora de questão.",,"Uitându-ne la istoria recentă, cred că silențiozitatea iese din ecuație.","Судя по недавним событиям, можно больше не прятаться.",,"Att döma av den senaste historien, antar jag att smygande är uteslutet.","Yakın geçmişe bakılırsa, sanırım gizlilik devre dışı." +Sick fuck... Waste him!,TXT_BBSUB_SCRIPT10_D16676_IAMTH,,,,Podlý sráč... Zab ho!,Syge svin... Smid ham ud!,Der Typ ist doch krank. Mach ihn alle.,,,Maldito enfermo... ¡Cárgatelo!,,Sairas kusipää... Listi hänet!,"Quel salaud, bute le!",,Beteg állat... Nyírd ki!,È malato marcio... Fallo fuori!,クソ腹立つ...!野郎を消せ!,역겨운 자식... 죽여버려!,Zieke klootzakken.... Verspil hem!,Syke jævel... Drep ham!,Chory skurwiel... Zmarnuj go!,Doente do caralho... Acaba com ele!,,Dobitoc bolnav... Nimicește-l!,Больной ублюдок... Мочи его!,,Sjuka jävlar... Slå honom ihjäl!,Hasta herif. Harca onu! +"He may be ugly, but it seems like he's on our side.",TXT_BBSUB_SCRIPT12_D12128_USETH,,,,"Možná je ošklivý, ale zdá se, že je na naší straně.","Han er måske grim, men det ser ud til, at han er på vores side.","Er mag ja hässlich sein, aber es sieht aus als ob er auf unserer Seite sei.",,,"Podrá ser feo, pero parece estar de nuestro lado.",,"Hän on ehkä ruma, mutta hän vaikuttaa olevan meidän puolellamme.","Il est hideux, mais il semble qu'il soit de notre côté.",,"Lehet hogy igen ronda szegény, de legalább a mi oldalunkon áll.","Può essere brutto, ma sembra che sia dalla nostra parte.",彼は醜いだろうが、我々に味方している。,"이 양반 못생기긴 했어도, 우리 편인 것 같네.","Hij is misschien lelijk, maar het lijkt erop dat hij aan onze kant staat.","Han er kanskje stygg, men det virker som om han er på vår side.","Może i jest brzydki, ale wygląda na to, że jest po naszej stronie.","Ele pode ser feio, mas parece que ele está no nosso lado.",,"O fi urât, dar pare să fie de partea noastră.","Пусть он и урод, но, похоже, он на нашей стороне.",,"Han må vara ful, men det verkar som om han är på vår sida.",Çirkin olabilir ama bizim tarafımızda gibi görünüyor. +"Judging by recent history, I guess stealth is out.",TXT_BBSUB_SCRIPT17_D10612_OHSUR,,,,"Soudě podle naší nedávné historie hádám, že pokradmu to nepůjde.","At dømme ud fra den seneste historie, så er det vist ikke muligt at gå i smug.","Nach den jüngsten Geschehnissen zu urteilen, ist Tarnung nicht drin.",,,"Juzgando nuestro historial reciente, supongo que el sigilo queda descartado.",,Lähimenneisyyden perusteella hiiviskely ei varmaankaan tule kysymykseen.,"En se basant sur ce qui vient de se passer, je pense que la discrétion n'est pas une option.",,A rövidmúltból kiindulva a lopakodás nem lehetőség.,"A giudicare dalla storia recente, suppongo che essere furtivi sia da scartare.",最近の記録から判断すると、秘密は公になると私は思う。,"최근 상황을 보건대, 잠입 작전은 힘들 것 같아.","Te oordelen naar de recente geschiedenis, denk ik dat heimelijkheid uit is.","Å dømme etter det som har skjedd, er det visst slutt på å snike.","Sądząc po ostatniej historii, chyba nie ma mowy o ukrywaniu się.","Julgando pelo nosso histórico recente, acho que cautela está fora de questão.",,"Uitându-ne la istoria recentă, cred că silențiozitatea iese din ecuație.","Судя по недавним событиям, можно больше не прятаться.",,"Att döma av den senaste historien, antar jag att smygande är uteslutet.","Yakın geçmişe bakılırsa, sanırım gizlilik devre dışı." "Hmm. No fuss, no muss, nothing for mom to clean up... Get me one, please. ",TXT_BBSUB_SCRIPT17_D13644_OHWEL,This remark is for information about the maulers in the warehouse.,,,"Hmm. Žádný rámus, žádný bordel, maminka nemusí nic uklízet... Taky mi jeden vem, prosím!","Hmm. Ingen ballade, ingen ballade, intet for mor at rydde op... Giv mig en, tak. -",Hmm. Lass nichts anbrennen. Hol mir bitte so ein Ding.,,,"Hmm. Sin dejar restos, nada que mamá tenga que limpiar... Dame uno, por favor.",,"Hmm, pulinat pois, ei jätetä äidille mitään siivottavaa... Saisinko yhden, kiitos.","Hmm. Pas de boucan, pas de bordel, rien que maman ait besoin de nettoyer après.. Récupère en un pour moi, s'il te plaît.",Hmm. Könnyen ment mint az ágybavizelés... Hozz nekem egyet kérlek.,"Mm. Non protesta, fa zero residui, nulla da far pulire a mamma... Dammene uno, per favore.","うーむ。慌てず、騒がず、ママの掃除も無し... +",Hmm. Lass nichts anbrennen. Hol mir bitte so ein Ding.,,,"Hmm. Sin dejar restos, nada que mamá tenga que limpiar... Dame uno, por favor.",,"Hmm, pulinat pois, ei jätetä äidille mitään siivottavaa... Saisinko yhden, kiitos.","Hmm. Pas de boucan, pas de bordel, rien que maman ait besoin de nettoyer après.. Récupère en un pour moi, s'il te plaît.",,Hmm. Könnyen ment mint az ágybavizelés... Hozz nekem egyet kérlek.,"Mm. Non protesta, fa zero residui, nulla da far pulire a mamma... Dammene uno, per favore.","うーむ。慌てず、騒がず、ママの掃除も無し... 何か一杯お願い。",흠. 이유 없이 그런 소문이 났을 리는 없을 테고... 나도 그 무기 하나만 가져다줘.,"Hmm. Geen gedoe, geen muss, niets voor mama om op te ruimen... Haal me er een, alsjeblieft.","Ikke noe oppstyr, ikke noe for mamma å rydde opp... Gi meg en, er du snill. ","Hmm. Żadnego zamieszania, żadnego bałaganu, nic dla mamy do sprzątania... Daj mi jeden, proszę. ","Hmm. Sem choradeira, nem sujeira, nada pra mamãe ter que limpar... Pega um pra mim, por favor.",,"Hmm. Nu-i deranj, nu mizerie, nu nimic... Adu-mi unul, te rog.","Хм-м. Ни шума, ни пыли, мама не заставит убираться... Достань мне одно такое, пожалуйста!",,"Hmm. Inget krångel, inget krångel, inget för mamma att städa upp... Ge mig en, tack. @@ -12928,7 +12928,7 @@ Sick fuck... Waste him!,TXT_BBSUB_SCRIPT10_D16676_IAMTH,,,,Podlý sráč... Zab " "You think I'd get tired of all this killing everyone stuff, but I know I'm going to miss it when it's over. ",TXT_BBSUB_SCRIPT31_D0_OHNOI,MAP31,,,"Řekl bys, že by mě všechno tohle zabíjení začalo unavovat, ale stejně vím, že mi to bude chybět, až tohle všechno skončí.","Man skulle tro, at jeg ville blive træt af alt det her med at dræbe alle, men jeg ved, at jeg kommer til at savne det, når det er slut. -","Man könnte denken, dass man von dieser „alle töten“-Sache müde wird, aber ich weiß, ich werde es vermissen, wenn alles vorbei ist.",,,"Pensarás que me cansaría de esto de matar a todo el mundo, pero sé que lo echaré de menos cuando se acabe.",,"Sitä luulisi, että kyllästyisin tähän ""tapan kaikki""-touhuun, mutta tiedän, että jään kaipaamaan sitä, kun tämä on ohi.","On pensrai que j'en aurai marre de cette routine de ""tue tout le monde"", mais je crois que ça va me manquer quand on en aura fini.","Azt hinné az ember, hogy belefáradok ebbe a gyilkolászósdiba, de tudom hogy hiányozni fog ha mind ennek vége.","Potresti pensare che io mi stia stancando di questa routine di ""uccidere tutti"", ma so già che mi mancherà quando tutto sarà finito.","貴方は全ての人々が殺害される事にうんざりしていると思うわ、 +","Man könnte denken, dass man von dieser „alle töten“-Sache müde wird, aber ich weiß, ich werde es vermissen, wenn alles vorbei ist.",,,"Pensarás que me cansaría de esto de matar a todo el mundo, pero sé que lo echaré de menos cuando se acabe.",,"Sitä luulisi, että kyllästyisin tähän ""tapan kaikki""-touhuun, mutta tiedän, että jään kaipaamaan sitä, kun tämä on ohi.","On pensrai que j'en aurai marre de cette routine de ""tue tout le monde"", mais je crois que ça va me manquer quand on en aura fini.",,"Azt hinné az ember, hogy belefáradok ebbe a gyilkolászósdiba, de tudom hogy hiányozni fog ha mind ennek vége.","Potresti pensare che io mi stia stancando di questa routine di ""uccidere tutti"", ma so già che mi mancherà quando tutto sarà finito.","貴方は全ての人々が殺害される事にうんざりしていると思うわ、 でも私は全てが終わったら見逃すと知っている。","내가 사람들 죽이는 걸 지겨워할 것 같지만, 이 일이 모두 끝나면 아마 그리워할 거야.","Je denkt dat ik moe zou worden van al deze moorden, maar ik weet dat ik het ga missen als het voorbij is.","Man skulle tro jeg ville bli lei av å drepe alle, men jeg kommer til å savne det når det er over. ","Myślisz, że znudzi mnie to całe zabijanie wszystkich, ale wiem, że będzie mi tego brakowało, kiedy to się skończy. ","Você deve achar que fico cansada de toda essa matança, mas sei que vou sentir falta disso quando acabar.",,"Crezi că m-am săturat de toată chestia asta de a ucide totul, dar îmi va lipsi odată ce totul se va termina.","Ты думаешь, что я устану от всех этих убийств? Нет, на самом деле мне их будет не хватать.",,"Man tror att jag skulle tröttna på allt det här med att döda alla, men jag vet att jag kommer att sakna det när det är över. From e562111a514d41cb237c968b891f9d3a5ede9528 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 12 Oct 2024 01:24:57 -0400 Subject: [PATCH 375/414] - don't show iwad box if priority iwad has been located for the currently loaded mods gameinfo --- src/d_iwad.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 3ad6ed004..1eb0c0ea0 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -59,6 +59,8 @@ EXTERN_CVAR(Bool, autoloadbrightmaps) EXTERN_CVAR(Bool, autoloadwidescreen) EXTERN_CVAR(String, language) +bool foundprio = false; // global to prevent iwad box from appearing + //========================================================================== // // Parses IWAD definitions @@ -695,6 +697,7 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char picks.Clear(); picks.Push(found); pickedprio = mIWadInfos[found.mInfoIndex].prio; + foundprio = true; } } } @@ -750,7 +753,7 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char int pick = 0; // Present the IWAD selection box. - bool alwaysshow = (queryiwad && !Args->CheckParm("-iwad")); + bool alwaysshow = (queryiwad && !Args->CheckParm("-iwad") && !foundprio); if (alwaysshow || picks.Size() > 1) { From 1a699c08af6f68b1ff3c1179fcf3b4ce680d6909 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 12 Oct 2024 01:28:09 -0400 Subject: [PATCH 376/414] - this is version 4.13.0 --- src/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/version.h b/src/version.h index 21d2247e6..73b81091c 100644 --- a/src/version.h +++ b/src/version.h @@ -41,11 +41,11 @@ const char *GetVersionString(); /** Lots of different version numbers **/ -#define VERSIONSTR "4.13pre" +#define VERSIONSTR "4.13.0" // The version as seen in the Windows resource -#define RC_FILEVERSION 4,12,9999,0 -#define RC_PRODUCTVERSION 4,12,9999,0 +#define RC_FILEVERSION 4,13,0,0 +#define RC_PRODUCTVERSION 4,13,0,0 #define RC_PRODUCTVERSION2 VERSIONSTR // These are for content versioning. #define VER_MAJOR 4 From 992e01de05e6ebf85e040675639539746d5a6547 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 12 Oct 2024 04:22:45 -0400 Subject: [PATCH 377/414] - define dither shader in a way that is compatible with Apple's GLSL-to-metal compiler --- wadsrc/static/shaders/glsl/main.fp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index 95f248d69..eb4685084 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -891,7 +891,7 @@ void main() #ifdef DITHERTRANS int index = (int(pixelpos.x) % 8) * 8 + int(pixelpos.y) % 8; const float DITHER_THRESHOLDS[64] = - { + float[64]( 1.0 / 65.0, 33.0 / 65.0, 9.0 / 65.0, 41.0 / 65.0, 3.0 / 65.0, 35.0 / 65.0, 11.0 / 65.0, 43.0 / 65.0, 49.0 / 65.0, 17.0 / 65.0, 57.0 / 65.0, 25.0 / 65.0, 51.0 / 65.0, 19.0 / 65.0, 59.0 / 65.0, 27.0 / 65.0, 13.0 / 65.0, 45.0 / 65.0, 5.0 / 65.0, 37.0 / 65.0, 15.0 / 65.0, 47.0 / 65.0, 7.0 / 65.0, 39.0 / 65.0, @@ -900,7 +900,7 @@ void main() 52.0 / 65.0, 20.0 / 65.0, 60.0 / 65.0, 28.0 / 65.0, 50.0 / 65.0, 18.0 / 65.0, 58.0 / 65.0, 26.0 / 65.0, 16.0 / 65.0, 48.0 / 65.0, 8.0 / 65.0, 40.0 / 65.0, 14.0 / 65.0, 46.0 / 65.0, 6.0 / 65.0, 38.0 / 65.0, 64.0 / 65.0, 32.0 / 65.0, 56.0 / 65.0, 24.0 / 65.0, 62.0 / 65.0, 30.0 / 65.0, 54.0 / 65.0, 22.0 /65.0 - }; + ); vec3 fragHSV = rgb2hsv(FragColor.rgb); float brightness = clamp(1.5*fragHSV.z, 0.1, 1.0); From 078503812056fa5af7d992dbd5bedc2dd7101f72 Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Sat, 12 Oct 2024 11:52:07 +0200 Subject: [PATCH 378/414] Resolve compiler warning about destructor syntax gcc-14 warns: tarray.h:927:9: warning: template-id not allowed for destructor in C++20 [-Wtemplate-id-cdtor] 927 | ~TDeletingArray () --- src/common/utility/tarray.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/utility/tarray.h b/src/common/utility/tarray.h index 3445bd484..25d6e0e7f 100644 --- a/src/common/utility/tarray.h +++ b/src/common/utility/tarray.h @@ -924,7 +924,7 @@ public: return *this; } - ~TDeletingArray () + ~TDeletingArray() { for (unsigned int i = 0; i < TArray::Size(); ++i) { From 2f30f720a4471ebcf4e9a5a8d5b9f1ff4450466b Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 14 Oct 2024 03:39:26 -0400 Subject: [PATCH 379/414] - simplify and deconstruct logic for applying sector damage - also fixes voodoo doll sector damage in TNT MAP30 --- src/playsim/p_mobj.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 5dff4a0be..32f650ca5 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -4436,7 +4436,11 @@ void AActor::Tick () if (ObjectFlags & OF_EuthanizeMe) return; } //[inkoalawetrust] Genericized level damage handling that makes sector, 3D floor, and TERRAIN flat damage affect monsters and other NPCs too. - if ((!(flags9 & MF9_NOSECTORDAMAGE) || flags9 & MF9_FORCESECTORDAMAGE) && (player || (player == nullptr && (Sector->MoreFlags & SECMF_HURTMONSTERS || flags9 & MF9_FORCESECTORDAMAGE)))) + bool afsdnope = !!(flags9 & MF9_NOSECTORDAMAGE); + bool afsdforce = !!(flags9 & MF9_FORCESECTORDAMAGE); + bool sfhurtmonsters = !!(Sector->MoreFlags & SECMF_HURTMONSTERS); + bool isplayer = (player != nullptr) && (this == player->mo); + if ((!afsdnope || afsdforce) && (isplayer || sfhurtmonsters || afsdforce)) { P_ActorOnSpecial3DFloor(this); P_ActorInSpecialSector(this,Sector); From cca1946201571b2a5f9026879abc7f7abe1797cd Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Mon, 14 Oct 2024 14:15:30 -0500 Subject: [PATCH 380/414] Added (SPF_)STRETCHPIXELS. This counteracts the squaring implied by rolling sprites. --- src/playsim/actor.h | 3 ++- src/playsim/p_effect.h | 1 + src/rendering/hwrenderer/scene/hw_sprites.cpp | 4 ++-- wadsrc/static/zscript/constants.zs | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index eba4011a2..708e06f4c 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -506,7 +506,8 @@ enum ActorRenderFlag2 RF2_CAMFOLLOWSPLAYER = 0x0040, // Matches the cam's base position and angles to the main viewpoint. RF2_NOMIPMAP = 0x0080, // [Nash] forces no mipmapping on sprites. Useful for tiny sprites that need to remain visually crisp RF2_ISOMETRICSPRITES = 0x0100, - RF2_SQUAREPIXELS = 0x0200, // apply +ROLLSPRITE scaling math so that non rolling sprites get the same scaling + RF2_SQUAREPIXELS = 0x0200, // apply +ROLLSPRITE scaling math so that non rolling sprites get the same scaling + RF2_STRETCHPIXELS = 0x0400, // don't apply SQUAREPIXELS for ROLLSPRITES }; // This translucency value produces the closest match to Heretic's TINTTAB. diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index 5eafdcd4b..4884739f2 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -70,6 +70,7 @@ enum EParticleFlags SPF_NOFACECAMERA = 1 << 12, SPF_ROLLCENTER = 1 << 13, SPF_NOMIPMAP = 1 << 14, + SPF_STRETCHPIXELS = 1 << 15, }; class DVisualThinker; diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 61c120f31..91125b750 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -1038,7 +1038,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t r.Scale(sprscale.X, isSpriteShadow ? sprscale.Y * 0.15 * thing->isoscaleY : sprscale.Y * thing->isoscaleY); - if ((thing->renderflags & RF_ROLLSPRITE) || (thing->renderflags2 & RF2_SQUAREPIXELS)) + if (((thing->renderflags & RF_ROLLSPRITE) || (thing->renderflags2 & RF2_SQUAREPIXELS)) && !(thing->renderflags2 & RF2_STRETCHPIXELS)) { double ps = di->Level->pixelstretch; double mult = 1.0 / sqrt(ps); // shrink slightly @@ -1621,7 +1621,7 @@ void HWSprite::AdjustVisualThinker(HWDrawInfo* di, DVisualThinker* spr, sector_t auto r = spi.GetSpriteRect(); r.Scale(spr->Scale.X, spr->Scale.Y); - if (spr->PT.flags & SPF_ROLL) + if ((spr->PT.flags & SPF_ROLL) && !(spr->PT.flags & SPF_STRETCHPIXELS)) { double ps = di->Level->pixelstretch; double mult = 1.0 / sqrt(ps); // shrink slightly diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index 641d90a12..7ab58204f 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -723,6 +723,7 @@ enum EParticleFlags SPF_NOFACECAMERA = 1 << 12, SPF_ROLLCENTER = 1 << 13, SPF_NOMIPMAP = 1 << 14, + SPF_STRETCHPIXELS = 1 << 15, SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG }; From ffcce790de3b93a37fa603072586ecdb804db94e Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 14 Oct 2024 17:30:59 -0400 Subject: [PATCH 381/414] - Actor.GetSpecies() is a non-destructive function --- src/rendering/hwrenderer/hw_entrypoint.cpp | 2 +- wadsrc/static/zscript/actors/actor.zs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index bfa0d8b1c..e55c041a6 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -362,7 +362,7 @@ sector_t* RenderView(player_t* player) // Draw all canvases that changed for (FCanvas* canvas : AllCanvases) { - if (canvas->Tex->CheckNeedsUpdate()) + if (canvas->Tex && canvas->Tex->CheckNeedsUpdate()) { screen->RenderTextureView(canvas->Tex, [=](IntRect& bounds) { diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 5c4dc376e..93a9b7da6 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -853,7 +853,7 @@ class Actor : Thinker native native bool LookForPlayers(bool allaround, LookExParams params = null); native bool TeleportMove(Vector3 pos, bool telefrag, bool modifyactor = true); native clearscope double DistanceBySpeed(Actor other, double speed) const; - native name GetSpecies(); + native clearscope name GetSpecies(); native void PlayActiveSound(); native void Howl(); native void DrawSplash (int count, double angle, int kind); From 9a9440a6f7f16ca60c5d0cdf2a4dec719dfbaa41 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Tue, 15 Oct 2024 10:50:04 -0400 Subject: [PATCH 382/414] - enable console subsystem processing for Windows, enable runtime detection --- src/CMakeLists.txt | 7 +++++ src/common/platform/win32/i_main.cpp | 41 +++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 789bea954..987f53dc0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1359,6 +1359,13 @@ else() endif() if( MSVC ) + option ( CONSOLE_MODE "Compile as a console application" OFF ) + if ( CONSOLE_MODE ) + set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE /ENTRY:wWinMainCRTStartup" ) + else() + set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:wWinMainCRTStartup" ) + endif() + option( ZDOOM_GENERATE_MAPFILE "Generate .map file for debugging." OFF ) set( LINKERSTUFF "/MANIFEST:NO" ) diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index acadc2dc8..64c74e808 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -134,6 +134,28 @@ void I_SetIWADInfo() { } +//========================================================================== +// +// isConsoleApp() +// +// runtime detection to detect if this is a console subsystem app. +// +// the reason for doing this is because it is possible to edit a binary directly and change its subsystem +// type via hexedit so in order to gain flexibility it makes no sense to just compile out the unused code. +// +// we may plan to publish tools to allow users to do this manually on their own. +// +//========================================================================== + +bool isConsoleApp() +{ + DWORD pids[2]; + DWORD num_pids = GetConsoleProcessList(pids, 2); + bool win32con_is_exclusive = (num_pids <= 1); + + return GetConsoleWindow() != NULL && !win32con_is_exclusive; +} + //========================================================================== // // DoMain @@ -158,7 +180,24 @@ int DoMain (HINSTANCE hInstance) Args->AppendArg(FString(wargv[i])); } - if (Args->CheckParm("-stdout") || Args->CheckParm("-norun")) + if (isConsoleApp()) + { + StdOut = GetStdHandle(STD_OUTPUT_HANDLE); + BY_HANDLE_FILE_INFORMATION info; + + if (!GetFileInformationByHandle(StdOut, &info) && StdOut != nullptr) + { + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + DWORD mode; + if (GetConsoleMode(StdOut, &mode)) + { + if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) + FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. + } + } + } + else if (Args->CheckParm("-stdout") || Args->CheckParm("-norun")) { // As a GUI application, we don't normally get a console when we start. // If we were run from the shell and are on XP+, we can attach to its From 44e69451cf8fb6b16fd2bdcf50b3127c00cf8f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 15 Oct 2024 13:24:00 -0300 Subject: [PATCH 383/414] Hook up 3d floor updates to the level mesh --- src/g_level.cpp | 1 + src/g_levellocals.h | 2 + src/gamedata/r_defs.h | 1 + src/levelmeshhelper.cpp | 102 +++++++++++++++++--- src/levelmeshhelper.h | 40 +++++--- src/maploader/specials.cpp | 7 ++ src/rendering/hwrenderer/doom_levelmesh.cpp | 22 ++--- src/rendering/hwrenderer/doom_levelmesh.h | 22 ++--- 8 files changed, 153 insertions(+), 44 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index d3d76b2bf..ab4fa15c0 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1866,6 +1866,7 @@ void FLevelLocals::Init() musicorder = info->musicorder; MusicVolume = 1.f; HasHeightSecs = false; + SecCorrelations.Clear(); LevelName = info->LookupLevelName(); NextMap = info->NextMap; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index b54a91ea0..277849111 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -680,6 +680,8 @@ public: bool HasDynamicLights; // Another render optimization for maps with no lights at all. int frozenstate; + TMap> SecCorrelations; // links sectors to a list of sectors it provides fake height/3d floors for + double teamdamage; // former OpenGL-exclusive properties that should also be usable by the true color software renderer. diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index 50b491ece..b6526cc62 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -729,6 +729,7 @@ struct sector_t int ibocount; // number of indices per plane (identical for all planes.) If this is -1 the index buffer is not in use. bool HasLightmaps = false; // Sector has lightmaps, each subsector vertex needs its own unique lightmap UV data + bool Sec3dControlUseMidTex = false; // Below are all properties which are not used by the renderer. diff --git a/src/levelmeshhelper.cpp b/src/levelmeshhelper.cpp index d5906094a..04e4b8b2a 100644 --- a/src/levelmeshhelper.cpp +++ b/src/levelmeshhelper.cpp @@ -1,23 +1,103 @@ #include "levelmeshhelper.h" +#include "r_defs.h" +#include "g_levellocals.h" + +#define PROPAGATE_CORRELATIONS_SECTOR(func)\ + func(sector);\ + TArray* c = sector->Level->SecCorrelations.CheckKey(sector->Index());\ + if(c) for(int index : *c) func(§or->Level->sectors[index]); + +#define PROPAGATE_CORRELATIONS_SECTOR2(func, arg2)\ + func(sector, arg2);\ + TArray* c = sector->Level->SecCorrelations.CheckKey(sector->Index());\ + if(c) for(int index : *c) func(§or->Level->sectors[index], arg2); + +void UpdateLevelMesh::FloorHeightChanged(sector_t* sector) +{ + PROPAGATE_CORRELATIONS_SECTOR(OnFloorHeightChanged); +} + +void UpdateLevelMesh::CeilingHeightChanged(sector_t* sector) +{ + PROPAGATE_CORRELATIONS_SECTOR(OnCeilingHeightChanged); +} + +void UpdateLevelMesh::MidTex3DHeightChanged(sector_t* sector) +{ + PROPAGATE_CORRELATIONS_SECTOR(OnMidTex3DHeightChanged); +} + +void UpdateLevelMesh::FloorTextureChanged(sector_t* sector) +{ + PROPAGATE_CORRELATIONS_SECTOR(OnFloorTextureChanged); +} +void UpdateLevelMesh::CeilingTextureChanged(sector_t* sector) +{ + PROPAGATE_CORRELATIONS_SECTOR(OnCeilingTextureChanged); +} + +void UpdateLevelMesh::SectorChangedOther(sector_t* sector) +{ + PROPAGATE_CORRELATIONS_SECTOR(OnSectorChangedOther); +} + +void UpdateLevelMesh::SideTextureChanged(side_t* side, int section) +{ + OnSideTextureChanged(side, section); + + TArray* c = side->sector->Level->SecCorrelations.CheckKey(side->sector->Index()); + // if midtex changed, and is a 3d floor that should use the midtexture (and not the line itself's upper/lower), propagate change to all lines in affected sectors + if(c && section == 1 && side->sector->Sec3dControlUseMidTex) + { + for(int index : *c) + { + for(auto line : side->sector->Level->sectors[index].Lines) + { + OnSideTextureChanged(line->sidedef[0], section); // should only need the first side? + // OnSideTextureChanged(&line->sidedef[1], section); + } + } + } +} + +void UpdateLevelMesh::SideDecalsChanged(side_t* side) +{ // Decals shouldn't propagate + return OnSideDecalsChanged(side); +} + +void UpdateLevelMesh::SectorLightChanged(sector_t* sector) +{ + PROPAGATE_CORRELATIONS_SECTOR(OnSectorLightChanged); +} + +void UpdateLevelMesh::SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) +{ + PROPAGATE_CORRELATIONS_SECTOR2(OnSectorLightThinkerCreated, lightthinker); +} + +void UpdateLevelMesh::SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) +{ + PROPAGATE_CORRELATIONS_SECTOR2(OnSectorLightThinkerDestroyed, lightthinker); +} struct NullLevelMeshUpdater : UpdateLevelMesh { - void FloorHeightChanged(sector_t* sector) override {} - void CeilingHeightChanged(sector_t* sector) override {} - void MidTex3DHeightChanged(sector_t* sector) override {} + void OnFloorHeightChanged(sector_t* sector) override {} + void OnCeilingHeightChanged(sector_t* sector) override {} + void OnMidTex3DHeightChanged(sector_t* sector) override {} - void FloorTextureChanged(sector_t* sector) override {} - void CeilingTextureChanged(sector_t* sector) override {} + void OnFloorTextureChanged(sector_t* sector) override {} + void OnCeilingTextureChanged(sector_t* sector) override {} - void SectorChangedOther(sector_t* sector) override {} + void OnSectorChangedOther(sector_t* sector) override {} - void SideTextureChanged(side_t* side, int section) override {} - void SideDecalsChanged(side_t* side) override {} + void OnSideTextureChanged(side_t* side, int section) override {} + void OnSideDecalsChanged(side_t* side) override {} - void SectorLightChanged(sector_t* sector) override {} - void SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) override {} - void SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) override {} + void OnSectorLightChanged(sector_t* sector) override {} + void OnSectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) override {} + void OnSectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) override {} }; static NullLevelMeshUpdater nullUpdater; diff --git a/src/levelmeshhelper.h b/src/levelmeshhelper.h index 3ba0b2cde..89611cfca 100644 --- a/src/levelmeshhelper.h +++ b/src/levelmeshhelper.h @@ -8,21 +8,39 @@ class DLighting; struct UpdateLevelMesh { - virtual void FloorHeightChanged(sector_t *sector) = 0; - virtual void CeilingHeightChanged(sector_t *sector) = 0; - virtual void MidTex3DHeightChanged(sector_t *sector) = 0; + //3d floor-aware + void FloorHeightChanged(sector_t *sector); + void CeilingHeightChanged(sector_t *sector); + void MidTex3DHeightChanged(sector_t *sector); - virtual void FloorTextureChanged(sector_t *sector) = 0; - virtual void CeilingTextureChanged(sector_t *sector) = 0; + void FloorTextureChanged(sector_t *sector); + void CeilingTextureChanged(sector_t *sector); - virtual void SectorChangedOther(sector_t *sector) = 0; + void SectorChangedOther(sector_t *sector); - virtual void SideTextureChanged(side_t *side, int section) = 0; - virtual void SideDecalsChanged(side_t* side) = 0; + void SideTextureChanged(side_t *side, int section); + void SideDecalsChanged(side_t* side); - virtual void SectorLightChanged(sector_t* sector) = 0; - virtual void SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) = 0; - virtual void SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) = 0; + void SectorLightChanged(sector_t* sector); + void SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker); + void SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker); + + //raw + virtual void OnFloorHeightChanged(sector_t *sector) = 0; + virtual void OnCeilingHeightChanged(sector_t *sector) = 0; + virtual void OnMidTex3DHeightChanged(sector_t *sector) = 0; + + virtual void OnFloorTextureChanged(sector_t *sector) = 0; + virtual void OnCeilingTextureChanged(sector_t *sector) = 0; + + virtual void OnSectorChangedOther(sector_t *sector) = 0; + + virtual void OnSideTextureChanged(side_t *side, int section) = 0; + virtual void OnSideDecalsChanged(side_t* side) = 0; + + virtual void OnSectorLightChanged(sector_t* sector) = 0; + virtual void OnSectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) = 0; + virtual void OnSectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) = 0; }; extern UpdateLevelMesh* LevelMeshUpdater; diff --git a/src/maploader/specials.cpp b/src/maploader/specials.cpp index 47663e812..d2311ab27 100644 --- a/src/maploader/specials.cpp +++ b/src/maploader/specials.cpp @@ -721,6 +721,7 @@ void MapLoader::SpawnSpecials () auto itr = Level->GetSectorTagIterator(line.args[0]); while ((s = itr.Next()) >= 0) { + Level->SecCorrelations[sec->Index()].Push(s); Level->sectors[s].heightsec = sec; sec->e->FakeFloor.Sectors.Push(&Level->sectors[s]); Level->sectors[s].MoreFlags |= (sec->MoreFlags & SECMF_IGNOREHEIGHTSEC); // copy this to the destination sector for easier checking. @@ -1008,6 +1009,12 @@ int MapLoader::Set3DFloor(line_t * line, int param, int param2, int alpha) } P_Add3DFloor(ss, sec, line, flags, alpha); + Level->SecCorrelations[sec->Index()].Push(s); + + if(!(flags & (FF_UPPERTEXTURE | FF_LOWERTEXTURE))) + { + sec->Sec3dControlUseMidTex = true; + } } // To be 100% safe this should be done even if the alpha by texture value isn't used. if (!line->sidedef[0]->GetTexture(side_t::top).isValid()) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index f988ebefa..ddcf1dccb 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -610,7 +610,7 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) Flats[sectorIndex].Uniforms.Clear(); } -void DoomLevelMesh::FloorHeightChanged(sector_t* sector) +void DoomLevelMesh::OnFloorHeightChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); for (line_t* line : sector->Lines) @@ -622,7 +622,7 @@ void DoomLevelMesh::FloorHeightChanged(sector_t* sector) } } -void DoomLevelMesh::CeilingHeightChanged(sector_t* sector) +void DoomLevelMesh::OnCeilingHeightChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); for (line_t* line : sector->Lines) @@ -634,37 +634,37 @@ void DoomLevelMesh::CeilingHeightChanged(sector_t* sector) } } -void DoomLevelMesh::MidTex3DHeightChanged(sector_t* sector) +void DoomLevelMesh::OnMidTex3DHeightChanged(sector_t* sector) { // UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::FloorTextureChanged(sector_t* sector) +void DoomLevelMesh::OnFloorTextureChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::CeilingTextureChanged(sector_t* sector) +void DoomLevelMesh::OnCeilingTextureChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::SectorChangedOther(sector_t* sector) +void DoomLevelMesh::OnSectorChangedOther(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::SideTextureChanged(side_t* side, int section) +void DoomLevelMesh::OnSideTextureChanged(side_t* side, int section) { UpdateSide(side->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::SideDecalsChanged(side_t* side) +void DoomLevelMesh::OnSideDecalsChanged(side_t* side) { UpdateSide(side->Index(), SurfaceUpdateType::Full); } -void DoomLevelMesh::SectorLightChanged(sector_t* sector) +void DoomLevelMesh::OnSectorLightChanged(sector_t* sector) { UpdateFlat(sector->Index(), SurfaceUpdateType::LightsOnly); for (line_t* line : sector->Lines) @@ -676,11 +676,11 @@ void DoomLevelMesh::SectorLightChanged(sector_t* sector) } } -void DoomLevelMesh::SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) +void DoomLevelMesh::OnSectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) { } -void DoomLevelMesh::SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) +void DoomLevelMesh::OnSectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) { } diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index b1271fa10..d8a15d0c5 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -113,17 +113,17 @@ public: void DeleteLightmapLump(FLevelLocals& doomMap); static FString GetMapFilename(FLevelLocals& doomMap); - void FloorHeightChanged(sector_t* sector) override; - void CeilingHeightChanged(sector_t* sector) override; - void MidTex3DHeightChanged(sector_t* sector) override; - void FloorTextureChanged(sector_t* sector) override; - void CeilingTextureChanged(sector_t* sector) override; - void SectorChangedOther(sector_t* sector) override; - void SideTextureChanged(side_t* side, int section) override; - void SideDecalsChanged(side_t* side) override; - void SectorLightChanged(sector_t* sector) override; - void SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) override; - void SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) override; + void OnFloorHeightChanged(sector_t* sector) override; + void OnCeilingHeightChanged(sector_t* sector) override; + void OnMidTex3DHeightChanged(sector_t* sector) override; + void OnFloorTextureChanged(sector_t* sector) override; + void OnCeilingTextureChanged(sector_t* sector) override; + void OnSectorChangedOther(sector_t* sector) override; + void OnSideTextureChanged(side_t* side, int section) override; + void OnSideDecalsChanged(side_t* side) override; + void OnSectorLightChanged(sector_t* sector) override; + void OnSectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) override; + void OnSectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) override; void Reset(const LevelMeshLimits& limits) override { From 8bddbea0bd4082e88b07bd2361d85dc7e887319d Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 15 Oct 2024 19:33:54 +0200 Subject: [PATCH 384/414] Turn off softshadow for bounces --- wadsrc/static/shaders/lightmap/frag_raytrace.glsl | 2 +- wadsrc/static/shaders/lightmap/frag_viewer.glsl | 2 +- wadsrc/static/shaders/lightmap/trace_bounce.glsl | 2 +- wadsrc/static/shaders/lightmap/trace_light.glsl | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/wadsrc/static/shaders/lightmap/frag_raytrace.glsl b/wadsrc/static/shaders/lightmap/frag_raytrace.glsl index 6607b1142..89474ce67 100644 --- a/wadsrc/static/shaders/lightmap/frag_raytrace.glsl +++ b/wadsrc/static/shaders/lightmap/frag_raytrace.glsl @@ -31,7 +31,7 @@ void main() for (uint j = LightStart; j < LightEnd; j++) { - incoming += TraceLight(origin, normal, lights[lightIndexes[j]], 0.0); + incoming += TraceLight(origin, normal, lights[lightIndexes[j]], 0.0, false); } #if defined(USE_BOUNCE) diff --git a/wadsrc/static/shaders/lightmap/frag_viewer.glsl b/wadsrc/static/shaders/lightmap/frag_viewer.glsl index d77d6ae2b..14e8d536d 100644 --- a/wadsrc/static/shaders/lightmap/frag_viewer.glsl +++ b/wadsrc/static/shaders/lightmap/frag_viewer.glsl @@ -29,7 +29,7 @@ void main() uint LightEnd = surface.LightEnd; for (uint j = LightStart; j < LightEnd; j++) { - incoming += TraceLight(surfacepos, surface.Normal, lights[lightIndexes[j]], 0.0); + incoming += TraceLight(surfacepos, surface.Normal, lights[lightIndexes[j]], 0.0, false); } // incoming *= TraceAmbientOcclusion(surfacepos, surface.Normal); diff --git a/wadsrc/static/shaders/lightmap/trace_bounce.glsl b/wadsrc/static/shaders/lightmap/trace_bounce.glsl index 09b14b310..3c00a1208 100644 --- a/wadsrc/static/shaders/lightmap/trace_bounce.glsl +++ b/wadsrc/static/shaders/lightmap/trace_bounce.glsl @@ -38,7 +38,7 @@ vec3 TraceBounceLight(vec3 origin, vec3 normal) for (uint j = LightStart; j < LightEnd; j++) { - incoming += TraceLight(surfacepos, surface.Normal, lights[lightIndexes[j]], result.t) * angleAttenuation; + incoming += TraceLight(surfacepos, surface.Normal, lights[lightIndexes[j]], result.t, true) * angleAttenuation; } } return incoming / float(SampleCount); diff --git a/wadsrc/static/shaders/lightmap/trace_light.glsl b/wadsrc/static/shaders/lightmap/trace_light.glsl index 1265909bb..08c62d4a7 100644 --- a/wadsrc/static/shaders/lightmap/trace_light.glsl +++ b/wadsrc/static/shaders/lightmap/trace_light.glsl @@ -3,7 +3,7 @@ vec3 TracePointLightRay(vec3 origin, vec3 lightpos, float tmin, vec3 rayColor); -vec3 TraceLight(vec3 origin, vec3 normal, LightInfo light, float extraDistance) +vec3 TraceLight(vec3 origin, vec3 normal, LightInfo light, float extraDistance, bool noSoftShadow) { const float minDistance = 0.01; vec3 incoming = vec3(0.0); @@ -29,7 +29,7 @@ vec3 TraceLight(vec3 origin, vec3 normal, LightInfo light, float extraDistance) #if defined(USE_SOFTSHADOWS) - if (light.SoftShadowRadius != 0.0) + if (!noSoftShadow && light.SoftShadowRadius != 0.0) { vec3 v = (abs(dir.x) > abs(dir.y)) ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0); vec3 xdir = normalize(cross(dir, v)); From 38b8c7bed928d6a5f5bf5488bd459fb81fbb94d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 15 Oct 2024 14:32:41 -0300 Subject: [PATCH 385/414] switch defines to template --- src/levelmeshhelper.cpp | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/levelmeshhelper.cpp b/src/levelmeshhelper.cpp index 04e4b8b2a..dbe7f3a31 100644 --- a/src/levelmeshhelper.cpp +++ b/src/levelmeshhelper.cpp @@ -3,43 +3,50 @@ #include "r_defs.h" #include "g_levellocals.h" -#define PROPAGATE_CORRELATIONS_SECTOR(func)\ - func(sector);\ - TArray* c = sector->Level->SecCorrelations.CheckKey(sector->Index());\ - if(c) for(int index : *c) func(§or->Level->sectors[index]); +template +void PropagateCorrelations(Self self, Fn fn, sector_t *sector, Args... args) +{ + (self->*fn)(sector, args...); + + TArray* c = sector->Level->SecCorrelations.CheckKey(sector->Index()); -#define PROPAGATE_CORRELATIONS_SECTOR2(func, arg2)\ - func(sector, arg2);\ - TArray* c = sector->Level->SecCorrelations.CheckKey(sector->Index());\ - if(c) for(int index : *c) func(§or->Level->sectors[index], arg2); + if(c) + { + for(int index : *c) + { + (self->*fn)(§or->Level->sectors[index], args...); + } + } + +} void UpdateLevelMesh::FloorHeightChanged(sector_t* sector) { - PROPAGATE_CORRELATIONS_SECTOR(OnFloorHeightChanged); + PropagateCorrelations(this, &UpdateLevelMesh::OnFloorHeightChanged, sector); } void UpdateLevelMesh::CeilingHeightChanged(sector_t* sector) { - PROPAGATE_CORRELATIONS_SECTOR(OnCeilingHeightChanged); + PropagateCorrelations(this, &UpdateLevelMesh::OnCeilingHeightChanged, sector); } void UpdateLevelMesh::MidTex3DHeightChanged(sector_t* sector) { - PROPAGATE_CORRELATIONS_SECTOR(OnMidTex3DHeightChanged); + PropagateCorrelations(this, &UpdateLevelMesh::OnMidTex3DHeightChanged, sector); } void UpdateLevelMesh::FloorTextureChanged(sector_t* sector) { - PROPAGATE_CORRELATIONS_SECTOR(OnFloorTextureChanged); + PropagateCorrelations(this, &UpdateLevelMesh::OnFloorTextureChanged, sector); } void UpdateLevelMesh::CeilingTextureChanged(sector_t* sector) { - PROPAGATE_CORRELATIONS_SECTOR(OnCeilingTextureChanged); + PropagateCorrelations(this, &UpdateLevelMesh::OnCeilingTextureChanged, sector); } void UpdateLevelMesh::SectorChangedOther(sector_t* sector) { - PROPAGATE_CORRELATIONS_SECTOR(OnSectorChangedOther); + PropagateCorrelations(this, &UpdateLevelMesh::OnSectorChangedOther, sector); } void UpdateLevelMesh::SideTextureChanged(side_t* side, int section) @@ -68,17 +75,17 @@ void UpdateLevelMesh::SideDecalsChanged(side_t* side) void UpdateLevelMesh::SectorLightChanged(sector_t* sector) { - PROPAGATE_CORRELATIONS_SECTOR(OnSectorLightChanged); + PropagateCorrelations(this, &UpdateLevelMesh::OnSectorLightChanged, sector); } void UpdateLevelMesh::SectorLightThinkerCreated(sector_t* sector, DLighting* lightthinker) { - PROPAGATE_CORRELATIONS_SECTOR2(OnSectorLightThinkerCreated, lightthinker); + PropagateCorrelations(this, &UpdateLevelMesh::OnSectorLightThinkerCreated, sector, lightthinker); } void UpdateLevelMesh::SectorLightThinkerDestroyed(sector_t* sector, DLighting* lightthinker) { - PROPAGATE_CORRELATIONS_SECTOR2(OnSectorLightThinkerDestroyed, lightthinker); + PropagateCorrelations(this, &UpdateLevelMesh::OnSectorLightThinkerDestroyed, sector, lightthinker); } struct NullLevelMeshUpdater : UpdateLevelMesh From 2d400551760cba9856d9272d6d5d8722993d1a63 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Wed, 16 Oct 2024 02:33:21 +0800 Subject: [PATCH 386/414] Reapplication of https://github.com/ZDoom/gzdoom/commit/992e01de05e6ebf85e040675639539746d5a6547 (Apple-GLSL fix for the dither shader) --- wadsrc/static/shaders/scene/frag_main.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index 8f8acc813..873299775 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -44,7 +44,7 @@ void main() #ifdef DITHERTRANS int index = (int(pixelpos.x) % 8) * 8 + int(pixelpos.y) % 8; const float DITHER_THRESHOLDS[64] = - { + float[64]( 1.0 / 65.0, 33.0 / 65.0, 9.0 / 65.0, 41.0 / 65.0, 3.0 / 65.0, 35.0 / 65.0, 11.0 / 65.0, 43.0 / 65.0, 49.0 / 65.0, 17.0 / 65.0, 57.0 / 65.0, 25.0 / 65.0, 51.0 / 65.0, 19.0 / 65.0, 59.0 / 65.0, 27.0 / 65.0, 13.0 / 65.0, 45.0 / 65.0, 5.0 / 65.0, 37.0 / 65.0, 15.0 / 65.0, 47.0 / 65.0, 7.0 / 65.0, 39.0 / 65.0, @@ -53,7 +53,7 @@ void main() 52.0 / 65.0, 20.0 / 65.0, 60.0 / 65.0, 28.0 / 65.0, 50.0 / 65.0, 18.0 / 65.0, 58.0 / 65.0, 26.0 / 65.0, 16.0 / 65.0, 48.0 / 65.0, 8.0 / 65.0, 40.0 / 65.0, 14.0 / 65.0, 46.0 / 65.0, 6.0 / 65.0, 38.0 / 65.0, 64.0 / 65.0, 32.0 / 65.0, 56.0 / 65.0, 24.0 / 65.0, 62.0 / 65.0, 30.0 / 65.0, 54.0 / 65.0, 22.0 /65.0 - }; + ); vec3 fragHSV = rgb2hsv(FragColor.rgb); float brightness = clamp(1.5*fragHSV.z, 0.1, 1.0); From 86cd212d7f4946543777a346fe26fc1b2f207f13 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 16 Oct 2024 05:57:58 -0400 Subject: [PATCH 387/414] - fix isolated console mode (i.e. launching from explorer.exe) --- src/CMakeLists.txt | 2 +- src/common/platform/win32/i_main.cpp | 43 ++++++++++++++++---------- src/common/platform/win32/i_system.cpp | 2 ++ 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 987f53dc0..95b67a2d8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1361,7 +1361,7 @@ endif() if( MSVC ) option ( CONSOLE_MODE "Compile as a console application" OFF ) if ( CONSOLE_MODE ) - set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE /ENTRY:wWinMainCRTStartup" ) + set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE /ENTRY:wmainCRTStartup" ) else() set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:wWinMainCRTStartup" ) endif() diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index 64c74e808..aa1f6271e 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -45,6 +45,11 @@ #include #include +#include +#include +#include +#include + #ifdef _MSC_VER #pragma warning(disable:4244) #endif @@ -149,11 +154,22 @@ void I_SetIWADInfo() bool isConsoleApp() { - DWORD pids[2]; - DWORD num_pids = GetConsoleProcessList(pids, 2); - bool win32con_is_exclusive = (num_pids <= 1); + static bool alreadychecked = false; + static bool returnvalue; - return GetConsoleWindow() != NULL && !win32con_is_exclusive; + if (!alreadychecked) + { + DWORD pids[2]; + DWORD num_pids = GetConsoleProcessList(pids, 2); + bool win32con_is_exclusive = (num_pids <= 1); + + returnvalue = ((GetConsoleWindow() != NULL && !win32con_is_exclusive) || (GetStdHandle(STD_OUTPUT_HANDLE) != NULL)); + alreadychecked = true; + } + + //printf("isConsoleApp is %i\n", returnvalue); + + return returnvalue; } //========================================================================== @@ -183,19 +199,7 @@ int DoMain (HINSTANCE hInstance) if (isConsoleApp()) { StdOut = GetStdHandle(STD_OUTPUT_HANDLE); - BY_HANDLE_FILE_INFORMATION info; - - if (!GetFileInformationByHandle(StdOut, &info) && StdOut != nullptr) - { - SetConsoleCP(CP_UTF8); - SetConsoleOutputCP(CP_UTF8); - DWORD mode; - if (GetConsoleMode(StdOut, &mode)) - { - if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) - FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. - } - } + FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. } else if (Args->CheckParm("-stdout") || Args->CheckParm("-norun")) { @@ -514,6 +518,11 @@ CUSTOM_CVAR(Bool, disablecrashlog, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // //========================================================================== +int wmain() +{ + return wWinMain(GetModuleHandle(0), 0, GetCommandLineW(), SW_SHOW); +} + int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE nothing, LPWSTR cmdline, int nCmdShow) { g_hInst = hInstance; diff --git a/src/common/platform/win32/i_system.cpp b/src/common/platform/win32/i_system.cpp index 71a4ded12..caed820b0 100644 --- a/src/common/platform/win32/i_system.cpp +++ b/src/common/platform/win32/i_system.cpp @@ -102,6 +102,7 @@ // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- void DestroyCustomCursor(); +bool isConsoleApp(); // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- @@ -306,6 +307,7 @@ static void PrintToStdOut(const char *cpt, HANDLE StdOut) else break; } } + DWORD bytes_written; WriteFile(StdOut, printData.GetChars(), (DWORD)printData.Len(), &bytes_written, NULL); if (terminal) From e242330c9675b9ded87772529ded6313dff7e701 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 16 Oct 2024 06:01:24 -0400 Subject: [PATCH 388/414] - we don't need these includes anymore --- src/common/platform/win32/i_main.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index aa1f6271e..0f7bec82c 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -45,11 +45,6 @@ #include #include -#include -#include -#include -#include - #ifdef _MSC_VER #pragma warning(disable:4244) #endif From 3af3b2e742c3958c3796cc204c3d93ad94bfb7b1 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Wed, 16 Oct 2024 06:03:26 -0400 Subject: [PATCH 389/414] - keep ENABLE_VIRTUAL_TERMINAL_PROCESSING mode in isolated console mode --- src/common/platform/win32/i_main.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index 0f7bec82c..ce2fabe60 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -194,7 +194,13 @@ int DoMain (HINSTANCE hInstance) if (isConsoleApp()) { StdOut = GetStdHandle(STD_OUTPUT_HANDLE); - FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. + + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + DWORD mode; + + if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) + FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. } else if (Args->CheckParm("-stdout") || Args->CheckParm("-norun")) { From bb1174172ad3e2577eaf53d5c8d7096652377199 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 16 Oct 2024 15:01:37 +0200 Subject: [PATCH 390/414] Don't render the lightmap lights as dynlights in gl_levelmesh --- src/rendering/hwrenderer/doom_levelmesh.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index ddcf1dccb..d2437dd17 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -298,9 +298,12 @@ void DoomLevelMesh::UploadDynLights(FLevelLocals& doomMap) lightdata.Clear(); for (auto light = doomMap.lights; light; light = light->next) { - int portalGroup = 0; // What value should this have? - AddLightToList(lightdata, portalGroup, light, false); - CurFrameStats.DynLights++; + if (!light->Trace()) // Skip lightmap lights + { + int portalGroup = 0; // What value should this have? + AddLightToList(lightdata, portalGroup, light, false); + CurFrameStats.DynLights++; + } } // All meaasurements here are in vec4's. From fee5e3a58b42222b6202ae89ea3c4999791f60a6 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 16 Oct 2024 21:38:30 +0200 Subject: [PATCH 391/414] Fix lightmap lights not updating --- .../hwrenderer/data/hw_levelmesh.cpp | 11 +- .../rendering/hwrenderer/data/hw_levelmesh.h | 40 +++- src/rendering/hwrenderer/doom_levelmesh.cpp | 198 ++++++++---------- src/rendering/hwrenderer/doom_levelmesh.h | 14 +- 4 files changed, 145 insertions(+), 118 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 62c9203ab..0c1b0ad33 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -31,9 +31,12 @@ void LevelMesh::Reset(const LevelMeshLimits& limits) Mesh.LightUniforms.Resize(limits.MaxUniforms); Mesh.Materials.Resize(limits.MaxUniforms); - Mesh.Lights.Resize(16); - Mesh.LightIndexes.Resize(16); - Mesh.DynLights.Resize(50'000 * 4); + int maxLights = 20'000; + int maxDynlights = 50'000; + + Mesh.Lights.Resize(maxLights); + Mesh.LightIndexes.Resize(limits.MaxSurfaces * 10); + Mesh.DynLights.Resize(maxDynlights * 4); Mesh.Indexes.Resize(limits.MaxIndexes); Mesh.SurfaceIndexes.Resize(limits.MaxIndexes / 3 + 1); @@ -45,6 +48,8 @@ void LevelMesh::Reset(const LevelMeshLimits& limits) FreeLists.Uniforms.Clear(); FreeLists.Uniforms.Push({ 0, limits.MaxUniforms }); FreeLists.Surface.Clear(); FreeLists.Surface.Push({ 0, limits.MaxSurfaces }); FreeLists.DrawIndex.Clear(); FreeLists.DrawIndex.Push({ 0, limits.MaxIndexes }); + FreeLists.LightIndex.Clear(); FreeLists.LightIndex.Push({ 0, limits.MaxSurfaces * 10 }); + FreeLists.Light.Clear(); FreeLists.Light.Push({ 0, maxLights }); } void LevelMesh::AddEmptyMesh() diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 3749370cc..f1d187a7d 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -52,6 +52,13 @@ struct LightAllocInfo int Index = 0; }; +struct LightListAllocInfo +{ + int32_t* List = nullptr; + int Start = 0; + int Count = 0; +}; + struct MeshBufferRange { int Start = 0; @@ -96,10 +103,13 @@ public: GeometryAllocInfo AllocGeometry(int vertexCount, int indexCount); UniformsAllocInfo AllocUniforms(int count); SurfaceAllocInfo AllocSurface(); + LightAllocInfo AllocLight(); + LightListAllocInfo AllocLightList(int count); void FreeGeometry(int vertexStart, int vertexCount, int indexStart, int indexCount); void FreeUniforms(int start, int count); void FreeSurface(unsigned int surfaceIndex); + void FreeLightList(int start, int count); // Sets the sizes of all the GPU buffers and empties the mesh virtual void Reset(const LevelMeshLimits& limits); @@ -149,8 +159,8 @@ public: TArray LightUniforms; TArray Portals; TArray Light; - TArray DynLight; TArray LightIndex; + TArray DynLight; TArray DrawIndex; } UploadRanges; @@ -161,6 +171,8 @@ public: TArray Index; TArray Uniforms; TArray Surface; + TArray Light; + TArray LightIndex; TArray DrawIndex; } FreeLists; @@ -242,6 +254,25 @@ inline UniformsAllocInfo LevelMesh::AllocUniforms(int count) return info; } +inline LightListAllocInfo LevelMesh::AllocLightList(int count) +{ + LightListAllocInfo info; + info.Start = RemoveRange(FreeLists.LightIndex, count); + info.Count = count; + info.List = &Mesh.LightIndexes[info.Start]; + AddRange(UploadRanges.LightIndex, { info.Start, info.Start + info.Count }); + return info; +} + +inline LightAllocInfo LevelMesh::AllocLight() +{ + LightAllocInfo info; + info.Index = RemoveRange(FreeLists.Light, 1); + info.Light = &Mesh.Lights[info.Index]; + AddRange(UploadRanges.Light, { info.Index, info.Index + 1 }); + return info; +} + inline SurfaceAllocInfo LevelMesh::AllocSurface() { SurfaceAllocInfo info; @@ -269,10 +300,13 @@ inline void LevelMesh::FreeUniforms(int start, int count) AddRange(FreeLists.Uniforms, { start, start + count }); } +inline void LevelMesh::FreeLightList(int start, int count) +{ + AddRange(FreeLists.LightIndex, { start, start + count }); +} + inline void LevelMesh::FreeSurface(unsigned int surfaceIndex) { - // To do: remove the surface from the surface tile, if attached - AddRange(FreeLists.Surface, { (int)surfaceIndex, (int)surfaceIndex + 1 }); } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index d2437dd17..d85288331 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -194,6 +194,13 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) CreatePortals(doomMap); CreateSurfaces(doomMap); + // This is a bit of a hack. Lights aren't available until BeginFrame is called. + // Unfortunately we need a surface list already at this point for our Mesh.MaxNodes calculation + for (unsigned int i = 0; i < Sides.Size(); i++) + UpdateSide(i, SurfaceUpdateType::Full); + for (unsigned int i = 0; i < Flats.Size(); i++) + UpdateFlat(i, SurfaceUpdateType::Full); + UpdateCollision(); Mesh.MaxNodes = std::max(Collision->get_nodes().size() * 2, (size_t)10000); @@ -284,7 +291,6 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) } FlatUpdateList.Clear(); - CreateLights(doomMap); UpdateWallPortals(); UploadDynLights(doomMap); @@ -298,7 +304,11 @@ void DoomLevelMesh::UploadDynLights(FLevelLocals& doomMap) lightdata.Clear(); for (auto light = doomMap.lights; light; light = light->next) { - if (!light->Trace()) // Skip lightmap lights + if (light->Trace()) + { + UpdateLight(light); + } + else { int portalGroup = 0; // What value should this have? AddLightToList(lightdata, portalGroup, light, false); @@ -377,91 +387,6 @@ void DoomLevelMesh::ProcessDecals(HWDrawInfo* di, FRenderState& state) } } -void DoomLevelMesh::CreateLights(FLevelLocals& doomMap) -{ - if (LightsCreated) - return; - - for (const SideSurfaceBlock& side : Sides) - { - int index = side.FirstSurface; - while (index != -1) - { - CreateLightList(doomMap, index); - index = DoomSurfaceInfos[index].NextSurface; - } - } - - for (const FlatSurfaceBlock& flat : Flats) - { - int index = flat.FirstSurface; - while (index != -1) - { - CreateLightList(doomMap, index); - index = DoomSurfaceInfos[index].NextSurface; - } - } - - LightsCreated = true; -} - -void DoomLevelMesh::CreateLightList(FLevelLocals& doomMap, int surfaceIndex) -{ - Mesh.Surfaces[surfaceIndex].LightList.Pos = Mesh.LightIndexes.Size(); - Mesh.Surfaces[surfaceIndex].LightList.Count = 0; - - std::pair nodePortalGroup = GetSurfaceLightNode(surfaceIndex); - FLightNode* node = nodePortalGroup.first; - int portalgroup = nodePortalGroup.second; - if (!node) - return; - - int listpos = 0; - while (node) - { - FDynamicLight* light = node->lightsource; - if (light && light->Trace()) - { - int lightindex = GetLightIndex(light, portalgroup); - if (lightindex >= 0) - { - AddRange(UploadRanges.LightIndex, { (int)Mesh.LightIndexes.Size(), (int)Mesh.LightIndexes.Size() + 1 }); - Mesh.LightIndexes.Push(lightindex); - Mesh.Surfaces[surfaceIndex].LightList.Count++; - } - } - node = node->nextLight; - } -} - -std::pair DoomLevelMesh::GetSurfaceLightNode(int surfaceIndex) -{ - auto doomsurf = &DoomSurfaceInfos[surfaceIndex]; - FLightNode* node = nullptr; - int portalgroup = 0; - if (doomsurf->Type == ST_FLOOR || doomsurf->Type == ST_CEILING) - { - node = doomsurf->Subsector->section->lighthead; - portalgroup = doomsurf->Subsector->sector->PortalGroup; - } - else if (doomsurf->Type == ST_MIDDLESIDE || doomsurf->Type == ST_UPPERSIDE || doomsurf->Type == ST_LOWERSIDE) - { - bool isPolyLine = !!(doomsurf->Side->Flags & WALLF_POLYOBJ); - if (isPolyLine) - { - subsector_t* subsector = level.PointInRenderSubsector((doomsurf->Side->V1()->fPos() + doomsurf->Side->V2()->fPos()) * 0.5); - node = subsector->section->lighthead; - portalgroup = subsector->sector->PortalGroup; - } - else - { - node = doomsurf->Side->lighthead; - portalgroup = doomsurf->Side->sector->PortalGroup; - } - } - return { node, portalgroup }; -} - int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) { int index; @@ -473,9 +398,30 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) if (index == FDynamicLight::max_levelmesh_entries) return 0; + + LightAllocInfo info = AllocLight(); + CopyToMeshLight(light, *info.Light, portalgroup); + + light->levelmesh[index].index = info.Index + 1; + light->levelmesh[index].portalgroup = portalgroup; + return info.Index; +} + +void DoomLevelMesh::UpdateLight(FDynamicLight* light) +{ + for (int index = 0; index < FDynamicLight::max_levelmesh_entries && light->levelmesh[index].index != 0; index++) + { + int lightindex = light->levelmesh[index].index - 1; + int portalgroup = light->levelmesh[index].portalgroup; + CopyToMeshLight(light, Mesh.Lights[lightindex], portalgroup); + AddRange(UploadRanges.Light, { lightindex, lightindex + 1 }); + } +} + +void DoomLevelMesh::CopyToMeshLight(FDynamicLight* light, LevelMeshLight& meshlight, int portalgroup) +{ DVector3 pos = light->PosRelative(portalgroup); - LevelMeshLight meshlight; meshlight.Origin = { (float)pos.X, (float)pos.Y, (float)pos.Z }; meshlight.RelativeOrigin = meshlight.Origin; meshlight.Radius = (float)light->GetRadius(); @@ -510,13 +456,6 @@ int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) meshlight.SectorGroup = sectorGroup[light->Sector->Index()]; else meshlight.SectorGroup = 0; - - int lightindex = Mesh.Lights.Size(); - light->levelmesh[index].index = lightindex + 1; - light->levelmesh[index].portalgroup = portalgroup; - AddRange(UploadRanges.Light, { (int)Mesh.Lights.Size(), (int)Mesh.Lights.Size() + 1 }); - Mesh.Lights.Push(meshlight); - return lightindex; } bool DoomLevelMesh::TraceSky(const FVector3& start, FVector3 direction, float dist) @@ -572,6 +511,9 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) } Sides[sideIndex].FirstSurface = -1; + FreeLightList(Sides[sideIndex].Lights.Start, Sides[sideIndex].Lights.Count); + Sides[sideIndex].Lights.Count = 0; + for (auto& geo : Sides[sideIndex].Geometries) FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); Sides[sideIndex].Geometries.Clear(); @@ -601,6 +543,10 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) } Flats[sectorIndex].FirstSurface = -1; + for (auto& list : Flats[sectorIndex].Lights) + FreeLightList(list.Start, list.Count); + Flats[sectorIndex].Lights.Clear(); + for (auto& geo : Flats[sectorIndex].Geometries) FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); Flats[sectorIndex].Geometries.Clear(); @@ -705,6 +651,39 @@ void DoomLevelMesh::UpdateFlat(unsigned int sectorIndex, SurfaceUpdateType updat } } +LightListAllocInfo DoomLevelMesh::CreateLightList(FLightNode* node, int portalgroup) +{ + int lightcount = 0; + FLightNode* cur = node; + while (cur) + { + FDynamicLight* light = cur->lightsource; + if (light && light->Trace() && GetLightIndex(light, portalgroup) >= 0) + { + lightcount++; + } + cur = cur->nextLight; + } + + LightListAllocInfo info = AllocLightList(lightcount); + int i = 0; + cur = node; + while (cur) + { + FDynamicLight* light = cur->lightsource; + if (light && light->Trace()) + { + int lightindex = GetLightIndex(light, portalgroup); + if (lightindex >= 0) + { + info.List[i++] = lightindex; + } + } + cur = cur->nextLight; + } + return info; +} + void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) { CurFrameStats.SidesUpdated++; @@ -717,6 +696,8 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) if (!seg) return; + auto& sideBlock = Sides[sideIndex]; + sector_t* front; sector_t* back; subsector_t* sub; @@ -727,12 +708,14 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) return; front = sub->sector; back = nullptr; + sideBlock.Lights = CreateLightList(sub->section->lighthead, sub->sector->PortalGroup); } else { sub = seg->Subsector; front = side->sector; back = (side->linedef->frontsector == front) ? side->linedef->backsector : side->linedef->frontsector; + sideBlock.Lights = CreateLightList(side->lighthead, side->sector->PortalGroup); } HWMeshHelper result; @@ -741,8 +724,6 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) wall.sub = sub; wall.Process(&disp, state, seg, front, back); - auto& sideBlock = Sides[sideIndex]; - // Grab the decals generated if (result.decals.Size() != 0 && !sideBlock.InSideDecalsList) { @@ -758,7 +739,7 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) state.EnableTexture(true); state.EnableBrightmap(true); state.AlphaFunc(Alpha_GEqual, 0.f); - CreateWallSurface(side, disp, state, result.list, back ? LevelMeshDrawType::Masked : LevelMeshDrawType::Opaque, true, sideIndex); + CreateWallSurface(side, disp, state, result.list, back ? LevelMeshDrawType::Masked : LevelMeshDrawType::Opaque, true, sideIndex, sideBlock.Lights); if (result.portals.Size() != 0 && !sideBlock.InSidePortalsList) { @@ -772,7 +753,7 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) sideBlock.WallPortals.Push(portal); } - CreateWallSurface(side, disp, state, result.portals, LevelMeshDrawType::Portal, false, sideIndex); + CreateWallSurface(side, disp, state, result.portals, LevelMeshDrawType::Portal, false, sideIndex, sideBlock.Lights); /* // final pass: translucent stuff @@ -793,6 +774,9 @@ void DoomLevelMesh::CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) sector_t* sector = &doomMap.sectors[sectorIndex]; for (FSection& section : doomMap.sections.SectionsForSector(sectorIndex)) { + Flats[sectorIndex].Lights.Push(CreateLightList(section.lighthead, section.sector->PortalGroup)); + const auto& lightlist = Flats[sectorIndex].Lights.Last(); + HWFlatMeshHelper result; HWFlatDispatcher disp(&doomMap, &result, getRealLightmode(&doomMap, true)); @@ -805,16 +789,16 @@ void DoomLevelMesh::CreateFlat(FLevelLocals& doomMap, unsigned int sectorIndex) state.ClearDepthBias(); state.EnableTexture(true); state.EnableBrightmap(true); - CreateFlatSurface(disp, state, result.list, LevelMeshDrawType::Opaque, false, sectorIndex); + CreateFlatSurface(disp, state, result.list, LevelMeshDrawType::Opaque, false, sectorIndex, lightlist); - CreateFlatSurface(disp, state, result.portals, LevelMeshDrawType::Portal, false, sectorIndex); + CreateFlatSurface(disp, state, result.portals, LevelMeshDrawType::Portal, false, sectorIndex, lightlist); // final pass: translucent stuff state.AlphaFunc(Alpha_GEqual, gl_mask_sprite_threshold); state.SetRenderStyle(STYLE_Translucent); - CreateFlatSurface(disp, state, result.translucentborder, LevelMeshDrawType::Translucent, true, sectorIndex); + CreateFlatSurface(disp, state, result.translucentborder, LevelMeshDrawType::Translucent, true, sectorIndex, lightlist); state.SetDepthMask(false); - CreateFlatSurface(disp, state, result.translucent, LevelMeshDrawType::Translucent, true, sectorIndex); + CreateFlatSurface(disp, state, result.translucent, LevelMeshDrawType::Translucent, true, sectorIndex, lightlist); state.AlphaFunc(Alpha_GEqual, 0.f); state.SetDepthMask(true); state.SetRenderStyle(STYLE_Normal); @@ -896,7 +880,7 @@ void DoomLevelMesh::SetFlatLights(FLevelLocals& doomMap, unsigned int sectorInde } } -void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sideIndex) +void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sideIndex, const LightListAllocInfo& lightlist) { for (HWWall& wallpart : list) { @@ -1038,6 +1022,8 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh sinfo.Surface->IsSky = (drawType == LevelMeshDrawType::Portal) ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; sinfo.Surface->Bounds = GetBoundsFromSurface(*sinfo.Surface); sinfo.Surface->LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, *sinfo.Surface, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; + sinfo.Surface->LightList.Pos = lightlist.Start; + sinfo.Surface->LightList.Count = lightlist.Count; SetSideLightmap(sinfo.Index); @@ -1199,7 +1185,7 @@ int DoomLevelMesh::GetSampleDimension(uint16_t sampleDimension) return sampleDimension; } -void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex) +void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex, const LightListAllocInfo& lightlist) { for (HWFlat& flatpart : list) { @@ -1375,6 +1361,8 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state surf.MeshLocation.NumElements = (sub->numlines - 2) * 3; surf.Bounds = GetBoundsFromSurface(surf); surf.LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, surf, sampleDimension, !!(flatpart.sector->Flags & SECF_LM_DYNAMIC)) : -1; + surf.LightList.Pos = lightlist.Start; + surf.LightList.Count = lightlist.Count; info.NextSurface = Flats[sectorIndex].FirstSurface; Flats[sectorIndex].FirstSurface = sinfo.Index; diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index d8a15d0c5..974fa1726 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -73,6 +73,7 @@ struct SideSurfaceBlock bool InSideDecalsList = false; TArray DrawRanges; SurfaceUpdateType UpdateType = SurfaceUpdateType::None; + LightListAllocInfo Lights; }; struct FlatSurfaceBlock @@ -82,6 +83,7 @@ struct FlatSurfaceBlock TArray Uniforms; TArray DrawRanges; SurfaceUpdateType UpdateType = SurfaceUpdateType::None; + TArray Lights; }; class DoomLevelMesh : public LevelMesh, public UpdateLevelMesh @@ -107,8 +109,6 @@ public: TArray sectorPortals[2]; // index is sector+plane, value is index into the portal list TArray linePortals; // index is linedef, value is index into the portal list - void CreateLights(FLevelLocals& doomMap); - void SaveLightmapLump(FLevelLocals& doomMap); void DeleteLightmapLump(FLevelLocals& doomMap); static FString GetMapFilename(FLevelLocals& doomMap); @@ -146,7 +146,6 @@ private: void SetLimits(FLevelLocals& doomMap); void CreateSurfaces(FLevelLocals& doomMap); - void CreateLightList(FLevelLocals& doomMap, int surfaceIndex); void UpdateSide(unsigned int sideIndex, SurfaceUpdateType updateType); void UpdateFlat(unsigned int sectorIndex, SurfaceUpdateType updateType); @@ -165,8 +164,8 @@ private: void SetSubsectorLightmap(int surfaceIndex); void SetSideLightmap(int surfaceIndex); - void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex); - void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex); + void CreateWallSurface(side_t* side, HWWallDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex, const LightListAllocInfo& lightlist); + void CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state, TArray& list, LevelMeshDrawType drawType, bool translucent, unsigned int sectorIndex, const LightListAllocInfo& lightlist); BBox GetBoundsFromSurface(const LevelMeshSurface& surface) const; @@ -174,9 +173,11 @@ private: int GetSampleDimension(uint16_t sampleDimension); void CreatePortals(FLevelLocals& doomMap); - std::pair GetSurfaceLightNode(int surfaceIndex); + LightListAllocInfo CreateLightList(FLightNode* node, int portalgroup); int GetLightIndex(FDynamicLight* light, int portalgroup); + void UpdateLight(FDynamicLight* light); + void CopyToMeshLight(FDynamicLight* light, LevelMeshLight& meshlight, int portalgroup); void AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, LevelMeshDrawType drawType); void RemoveFromDrawList(const TArray& drawRanges); @@ -195,5 +196,4 @@ private: std::map bindings; MeshBuilder state; - bool LightsCreated = false; }; From bf84d8152b840deb38e02b42699a6e578c7188bc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 16 Oct 2024 16:54:15 +0200 Subject: [PATCH 392/414] do not set console mode from an uninitialized variable. --- src/common/platform/win32/i_main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/platform/win32/i_main.cpp b/src/common/platform/win32/i_main.cpp index ce2fabe60..c68b5a7aa 100644 --- a/src/common/platform/win32/i_main.cpp +++ b/src/common/platform/win32/i_main.cpp @@ -197,10 +197,14 @@ int DoMain (HINSTANCE hInstance) SetConsoleCP(CP_UTF8); SetConsoleOutputCP(CP_UTF8); + DWORD mode; - if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) - FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. + if (GetConsoleMode(StdOut, &mode)) + { + if (SetConsoleMode(StdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) + FancyStdOut = IsWindows10OrGreater(); // Windows 8.1 and lower do not understand ANSI formatting. + } } else if (Args->CheckParm("-stdout") || Args->CheckParm("-norun")) { From 92dd53703b1d32225386e12e6e560131477d0144 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 17 Oct 2024 00:29:25 +0200 Subject: [PATCH 393/414] Increase the bounce sample count --- wadsrc/static/shaders/lightmap/trace_bounce.glsl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/shaders/lightmap/trace_bounce.glsl b/wadsrc/static/shaders/lightmap/trace_bounce.glsl index 3c00a1208..0aaed43f0 100644 --- a/wadsrc/static/shaders/lightmap/trace_bounce.glsl +++ b/wadsrc/static/shaders/lightmap/trace_bounce.glsl @@ -5,7 +5,7 @@ vec3 TraceBounceLight(vec3 origin, vec3 normal) { const float minDistance = 0.01; const float maxDistance = 1000.0; - const int SampleCount = 8; + const int SampleCount = 64; vec3 N = normal; vec3 up = abs(N.x) < abs(N.y) ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0); @@ -13,9 +13,11 @@ vec3 TraceBounceLight(vec3 origin, vec3 normal) vec3 bitangent = cross(N, tangent); vec3 incoming = vec3(0.0); + int fragoffset = int(gl_FragCoord.x * 13.37 + gl_FragCoord.y * 6.66) % 9; + for (uint i = 0; i < SampleCount; i++) { - vec2 Xi = Hammersley(i, SampleCount); + vec2 Xi = Hammersley(i * 9 + fragoffset, SampleCount * 9); vec3 H = normalize(vec3(Xi.x * 2.0f - 1.0f, Xi.y * 2.0f - 1.0f, 1.5 - length(Xi))); vec3 L = H.x * tangent + H.y * bitangent + H.z * N; From 7907c27c7cbfaea30fbceff8d528c2c9abefcafe Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 17 Oct 2024 00:42:08 +0200 Subject: [PATCH 394/414] Reduce AO sample count from 128 to 16 --- wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl b/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl index 76e64aab2..bf8d5899c 100644 --- a/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl +++ b/wadsrc/static/shaders/lightmap/trace_ambient_occlusion.glsl @@ -7,17 +7,19 @@ float TraceAmbientOcclusion(vec3 origin, vec3 normal) { const float minDistance = 0.01; const float aoDistance = 100; - const int SampleCount = 128; + const int SampleCount = 16; vec3 N = normal; vec3 up = abs(N.x) < abs(N.y) ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0); vec3 tangent = normalize(cross(up, N)); vec3 bitangent = cross(N, tangent); + int fragoffset = int(gl_FragCoord.x * 13.37 + gl_FragCoord.y * 6.66) % 9; + float ambience = 0.0f; for (uint i = 0; i < SampleCount; i++) { - vec2 Xi = Hammersley(i, SampleCount); + vec2 Xi = Hammersley(i * 9 + fragoffset, SampleCount * 9); vec3 H = normalize(vec3(Xi.x * 2.0f - 1.0f, Xi.y * 2.0f - 1.0f, 1.5 - length(Xi))); vec3 L = H.x * tangent + H.y * bitangent + H.z * N; ambience += clamp(TraceAORay(origin, minDistance, L, aoDistance) / aoDistance, 0.0, 1.0); From 7baa25e993c813bb97972623efe2543f342b281c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Thu, 17 Oct 2024 16:25:47 -0300 Subject: [PATCH 395/414] allow getting checksum for current map --- src/g_dumpinfo.cpp | 62 +++++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 227b98f50..fcca4ed5b 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -141,30 +141,58 @@ CCMD (spray) CCMD (mapchecksum) { - MapData *map; - uint8_t cksum[16]; - - if (argv.argc() < 2) + if (argv.argc() == 1) + { //current map + const char *wadname = fileSystem.GetResourceFileName(fileSystem.GetFileContainer(level.lumpnum)); + + for (size_t i = 0; i < 16; ++i) + { + Printf("%02X", level.md5[i]); + } + + Printf(" // %s %s\n", wadname, level.MapName.GetChars()); + } + else if (argv.argc() < 2) { Printf("Usage: mapchecksum ...\n"); } - for (int i = 1; i < argv.argc(); ++i) + else { - map = P_OpenMapData(argv[i], true); - if (map == NULL) + MapData *map; + uint8_t cksum[16]; + + for (int i = 1; i < argv.argc(); ++i) { - Printf("Cannot load %s as a map\n", argv[i]); - } - else - { - map->GetChecksum(cksum); - const char *wadname = fileSystem.GetResourceFileName(fileSystem.GetFileContainer(map->lumpnum)); - delete map; - for (size_t j = 0; j < sizeof(cksum); ++j) + if(argv[i] == "*") { - Printf("%02X", cksum[j]); + const char *wadname = fileSystem.GetResourceFileName(fileSystem.GetFileContainer(level.lumpnum)); + + for (size_t i = 0; i < 16; ++i) + { + Printf("%02X", level.md5[i]); + } + + Printf(" // %s %s\n", wadname, level.MapName.GetChars()); + } + else + { + map = P_OpenMapData(argv[i], true); + if (map == NULL) + { + Printf("Cannot load %s as a map\n", argv[i]); + } + else + { + map->GetChecksum(cksum); + const char *wadname = fileSystem.GetResourceFileName(fileSystem.GetFileContainer(map->lumpnum)); + delete map; + for (size_t j = 0; j < sizeof(cksum); ++j) + { + Printf("%02X", cksum[j]); + } + Printf(" // %s %s\n", wadname, argv[i]); + } } - Printf(" // %s %s\n", wadname, argv[i]); } } } From 7a4a7146f5bb5664b535f1ac324faf22b73b78d3 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 17 Oct 2024 21:29:07 -0400 Subject: [PATCH 396/414] Revert "- Actor.GetSpecies() is a non-destructive function" This reverts commit ee5442c06b200163811ad23287ac98330201ecf0. --- src/rendering/hwrenderer/hw_entrypoint.cpp | 2 +- wadsrc/static/zscript/actors/actor.zs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index e55c041a6..bfa0d8b1c 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -362,7 +362,7 @@ sector_t* RenderView(player_t* player) // Draw all canvases that changed for (FCanvas* canvas : AllCanvases) { - if (canvas->Tex && canvas->Tex->CheckNeedsUpdate()) + if (canvas->Tex->CheckNeedsUpdate()) { screen->RenderTextureView(canvas->Tex, [=](IntRect& bounds) { diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index 93a9b7da6..5c4dc376e 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -853,7 +853,7 @@ class Actor : Thinker native native bool LookForPlayers(bool allaround, LookExParams params = null); native bool TeleportMove(Vector3 pos, bool telefrag, bool modifyactor = true); native clearscope double DistanceBySpeed(Actor other, double speed) const; - native clearscope name GetSpecies(); + native name GetSpecies(); native void PlayActiveSound(); native void Howl(); native void DrawSplash (int count, double angle, int kind); From 48b23bdfae30ac7e8fbb818a15826376c8b67ef4 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Thu, 17 Oct 2024 23:45:09 -0400 Subject: [PATCH 397/414] - readd canvas check --- src/rendering/hwrenderer/hw_entrypoint.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index bfa0d8b1c..e55c041a6 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -362,7 +362,7 @@ sector_t* RenderView(player_t* player) // Draw all canvases that changed for (FCanvas* canvas : AllCanvases) { - if (canvas->Tex->CheckNeedsUpdate()) + if (canvas->Tex && canvas->Tex->CheckNeedsUpdate()) { screen->RenderTextureView(canvas->Tex, [=](IntRect& bounds) { From ee16e47b11725b506f9cf2cd2b78147f73bb1fb7 Mon Sep 17 00:00:00 2001 From: dileepvr Date: Tue, 15 Oct 2024 21:29:21 -0600 Subject: [PATCH 398/414] FOV scales ortho up to 180 degrees One line change in r_utility.cpp affecting a custom field. Orthographic projection sees "more" of the sceen as fov increases, but only up to 180 degrees, after which it will have no effect. Orthographic projection has no meaning for fov since there is no Frustum. But since this is fundamental to the engine, I am reinterpreting it. Cherno wanted this too. I'll update the wiki if this gets in. --- src/rendering/r_utility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/r_utility.cpp b/src/rendering/r_utility.cpp index 3e40c3a0c..b7b6b452b 100644 --- a/src/rendering/r_utility.cpp +++ b/src/rendering/r_utility.cpp @@ -704,7 +704,7 @@ void FRenderViewpoint::SetViewAngle(const FViewWindow& viewWindow) HWAngles.Yaw = FAngle::fromDeg(270.0 - Angles.Yaw.Degrees()); if (IsOrtho() && (camera->ViewPos->Offset.XY().Length() > 0.0)) - ScreenProj = 1.34396 / camera->ViewPos->Offset.Length(); // [DVR] Estimated. +/-1 should be top/bottom of screen. + ScreenProj = 1.34396 / camera->ViewPos->Offset.Length() / tan (FieldOfView.Radians()*0.5); // [DVR] Estimated. +/-1 should be top/bottom of screen. } From 131ce183dbfcdf1587f1bbf3c27fb7d0e4170970 Mon Sep 17 00:00:00 2001 From: dileepvr Date: Wed, 16 Oct 2024 07:46:32 -0600 Subject: [PATCH 399/414] Missed a line in RenderOrthoNoFog Tying up the fov fix. --- src/rendering/hwrenderer/scene/hw_bsp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index 0904a0207..82f90a3ba 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -990,7 +990,7 @@ void HWDrawInfo::RenderOrthoNoFog() double vxdbl = Viewpoint.camera->X(); double vydbl = Viewpoint.camera->Y(); double ext = Viewpoint.camera->ViewPos->Offset.Length() ? - 3.0 * Viewpoint.camera->ViewPos->Offset.Length() : 100.0; + 3.0 * Viewpoint.camera->ViewPos->Offset.Length() * tan (Viewpoint.FieldOfView.Radians()*0.5) : 100.0; FBoundingBox viewbox(vxdbl, vydbl, ext); for (unsigned int kk = 0; kk < Level->subsectors.Size(); kk++) From 6921bf18ce5aff984fe1abfdcef2c4de043e4de8 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 19 Oct 2024 13:11:48 +0200 Subject: [PATCH 400/414] do not open resource files from non-open file readers. --- src/common/filesystem/source/resourcefile.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp index 81e2b7850..00a5234ca 100644 --- a/src/common/filesystem/source/resourcefile.cpp +++ b/src/common/filesystem/source/resourcefile.cpp @@ -162,6 +162,7 @@ static int nulPrintf(FSMessageLevel msg, const char* fmt, ...) FResourceFile *FResourceFile::DoOpenResourceFile(const char *filename, FileReader &file, bool containeronly, LumpFilterInfo* filter, FileSystemMessageFunc Printf, StringPool* sp) { + if (!file.isOpen()) return nullptr; if (Printf == nullptr) Printf = nulPrintf; for(auto func : funcs) { From b5fdd6deff2378a8a18fe68e69cbb277efe687f8 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 19 Oct 2024 13:13:11 +0200 Subject: [PATCH 401/414] fix bad string comparison. --- src/g_dumpinfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index fcca4ed5b..99c4b6adf 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -163,7 +163,7 @@ CCMD (mapchecksum) for (int i = 1; i < argv.argc(); ++i) { - if(argv[i] == "*") + if(!strcmp(argv[i], "*")) { const char *wadname = fileSystem.GetResourceFileName(fileSystem.GetFileContainer(level.lumpnum)); From 769274656efb4131374dd431a0e79b6902cc9007 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 19 Oct 2024 13:22:30 +0200 Subject: [PATCH 402/414] made FCommandLine::operator[] return a const char * and fixed two places where this triggered a compile error. --- src/common/console/c_commandline.cpp | 2 +- src/common/console/c_commandline.h | 2 +- src/common/rendering/r_videoscale.cpp | 2 +- src/gamedata/keysections.cpp | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/common/console/c_commandline.cpp b/src/common/console/c_commandline.cpp index 4f500ffe6..7fa9d1ff2 100644 --- a/src/common/console/c_commandline.cpp +++ b/src/common/console/c_commandline.cpp @@ -193,7 +193,7 @@ int FCommandLine::argc () return _argc; } -char *FCommandLine::operator[] (int i) +const char *FCommandLine::operator[] (int i) { if (_argv == NULL) { diff --git a/src/common/console/c_commandline.h b/src/common/console/c_commandline.h index dc5466df1..4886aa9c7 100644 --- a/src/common/console/c_commandline.h +++ b/src/common/console/c_commandline.h @@ -44,7 +44,7 @@ public: FCommandLine (const char *commandline, bool no_escapes = false); ~FCommandLine (); int argc (); - char *operator[] (int i); + const char *operator[] (int i); const char *args () { return cmd; } void Shift(); diff --git a/src/common/rendering/r_videoscale.cpp b/src/common/rendering/r_videoscale.cpp index 705fe905f..bfed3ec73 100644 --- a/src/common/rendering/r_videoscale.cpp +++ b/src/common/rendering/r_videoscale.cpp @@ -248,7 +248,7 @@ CCMD (vid_scaletoheight) } } -inline bool atob(char* I) +inline bool atob(const char* I) { if (stricmp (I, "true") == 0 || stricmp (I, "1") == 0) return true; diff --git a/src/gamedata/keysections.cpp b/src/gamedata/keysections.cpp index bcde05edd..25b71671b 100644 --- a/src/gamedata/keysections.cpp +++ b/src/gamedata/keysections.cpp @@ -100,12 +100,11 @@ CCMD (addkeysection) } // Limit the ini name to 32 chars - if (strlen (argv[2]) > 32) - argv[2][32] = 0; + FString name(argv[2], 32); for (unsigned i = 0; i < KeySections.Size(); i++) { - if (KeySections[i].mTitle.CompareNoCase(argv[2]) == 0) + if (KeySections[i].mTitle.CompareNoCase(name) == 0) { CurrentKeySection = i; return; From 3b07747af42940bffb138ad49f7c50c57bd82900 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 19 Oct 2024 10:17:01 -0400 Subject: [PATCH 403/414] Revert "- simplify and deconstruct logic for applying sector damage - also fixes voodoo doll sector damage in TNT MAP30" This reverts commit 3e33e31d1961f366229d5b4848fa29d2d797b8c3. Revert "Added MF9_FORCESECTORDAMAGE." This reverts commit 61bd3a739a0ca7509db46ddabbff1fc35bfd8908. --- src/playsim/actor.h | 1 - src/playsim/p_mobj.cpp | 6 +----- src/scripting/thingdef_data.cpp | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 708e06f4c..759d9d262 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -445,7 +445,6 @@ enum ActorFlag9 MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states MF9_NOSECTORDAMAGE = 0x00000020, // [inkoalawetrust] Actor ignores any sector-based damage (i.e damaging floors, NOT crushers) MF9_ISPUFF = 0x00000040, // [AA] Set on actors by P_SpawnPuff - MF9_FORCESECTORDAMAGE = 0x00000080, // [inkoalawetrust] Actor ALWAYS takes hurt floor damage if there's any. Even if the floor doesn't have SECMF_HURTMONSTERS. }; // --- mobj.renderflags --- diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 32f650ca5..8d34e6c73 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -4436,11 +4436,7 @@ void AActor::Tick () if (ObjectFlags & OF_EuthanizeMe) return; } //[inkoalawetrust] Genericized level damage handling that makes sector, 3D floor, and TERRAIN flat damage affect monsters and other NPCs too. - bool afsdnope = !!(flags9 & MF9_NOSECTORDAMAGE); - bool afsdforce = !!(flags9 & MF9_FORCESECTORDAMAGE); - bool sfhurtmonsters = !!(Sector->MoreFlags & SECMF_HURTMONSTERS); - bool isplayer = (player != nullptr) && (this == player->mo); - if ((!afsdnope || afsdforce) && (isplayer || sfhurtmonsters || afsdforce)) + if (!(flags9 & MF9_NOSECTORDAMAGE) && (player || (player == nullptr && Sector->MoreFlags & SECMF_HURTMONSTERS))) { P_ActorOnSpecial3DFloor(this); P_ActorInSpecialSector(this,Sector); diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 90ba65f00..129c06b78 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -353,7 +353,6 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF9, DECOUPLEDANIMATIONS, AActor, flags9), DEFINE_FLAG(MF9, NOSECTORDAMAGE, AActor, flags9), DEFINE_PROTECTED_FLAG(MF9, ISPUFF, AActor, flags9), //[AA] was spawned by SpawnPuff - DEFINE_FLAG(MF9, FORCESECTORDAMAGE, AActor, flags9), // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), From 5fb83d47621e9fb044de73bfc472245a7d4f58bd Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sat, 19 Oct 2024 10:25:03 -0400 Subject: [PATCH 404/414] Revert "Added SECMF_HURTMONSTERS, SECMF_HARMINAIR and NOSECTORDAMAGE." This reverts commit 391f4965128f2f5e2c07d764d42f363c67d9ed1c. --- specs/udmf_zdoom.txt | 2 - src/gamedata/r_defs.h | 2 - src/maploader/udmf.cpp | 8 ---- src/namedef_custom.h | 2 - src/playsim/actor.h | 3 +- src/playsim/p_3dfloors.cpp | 18 ++++----- src/playsim/p_3dfloors.h | 3 +- src/playsim/p_mobj.cpp | 8 ---- src/playsim/p_spec.cpp | 65 +++++++++++++++++--------------- src/playsim/p_spec.h | 4 +- src/playsim/p_user.cpp | 9 +++++ src/scripting/thingdef_data.cpp | 1 - wadsrc/static/zscript/mapdata.zs | 8 ---- 13 files changed, 58 insertions(+), 75 deletions(-) diff --git a/specs/udmf_zdoom.txt b/specs/udmf_zdoom.txt index 9e4df5472..4f73fa9bd 100644 --- a/specs/udmf_zdoom.txt +++ b/specs/udmf_zdoom.txt @@ -307,8 +307,6 @@ Note: All fields default to false unless mentioned otherwise. leakiness = ; // Probability of leaking through radiation suit (0 = never, 256 = always), default = 0. damageterraineffect = ; // Will spawn a terrain splash when damage is inflicted. Default = false. damagehazard = ; // Changes damage model to Strife's delayed damage for the given sector. Default = false. - hurtmonsters = ; // Non-players like monsters and decorations are hurt by this sector in the same manner as player. Doesn't work with damagehazard. - harminair = ; // Actors in this sector are harmed by the damage effects of the floor even if they aren't touching it. floorterrain = ; // Sets the terrain for the sector's floor. Default = 'use the flat texture's terrain definition.' ceilingterrain = ; // Sets the terrain for the sector's ceiling. Default = 'use the flat texture's terrain definition.' floor_reflect = ; // reflectiveness of floor (OpenGL only, not functional on sloped sectors) diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index d6453b6f8..943893c66 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -504,8 +504,6 @@ enum SECMF_OVERLAPPING = 512, // floor and ceiling overlap and require special renderer action. SECMF_NOSKYWALLS = 1024, // Do not draw "sky walls" SECMF_LIFT = 2048, // For MBF monster AI - SECMF_HURTMONSTERS = 4096, // Monsters in this sector are hurt like players. - SECMF_HARMINAIR = 8192, // Actors in this sector are also hurt mid-air. }; enum diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 1fd9869c3..9748e082f 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -1979,14 +1979,6 @@ public: Flag(sec->Flags, SECF_HAZARD, key); break; - case NAME_hurtmonsters: - Flag(sec->MoreFlags, SECMF_HURTMONSTERS, key); - break; - - case NAME_harminair: - Flag(sec->MoreFlags, SECMF_HARMINAIR, key); - break; - case NAME_floorterrain: sec->terrainnum[sector_t::floor] = P_FindTerrain(CheckString(key)); break; diff --git a/src/namedef_custom.h b/src/namedef_custom.h index dbf94dbaf..dd2e0066d 100644 --- a/src/namedef_custom.h +++ b/src/namedef_custom.h @@ -810,8 +810,6 @@ xx(damageinterval) xx(leakiness) xx(damageterraineffect) xx(damagehazard) -xx(hurtmonsters) -xx(harminair) xx(floorterrain) xx(ceilingterrain) xx(floor_reflect) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 759d9d262..d472decad 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -442,8 +442,7 @@ enum ActorFlag9 MF9_DOSHADOWBLOCK = 0x00000002, // [inkoalawetrust] Should the monster look for SHADOWBLOCK actors ? MF9_SHADOWBLOCK = 0x00000004, // [inkoalawetrust] Actors in the line of fire with this flag trigger the MF_SHADOW aiming penalty. MF9_SHADOWAIMVERT = 0x00000008, // [inkoalawetrust] Monster aim is also offset vertically when aiming at shadow actors. - MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states - MF9_NOSECTORDAMAGE = 0x00000020, // [inkoalawetrust] Actor ignores any sector-based damage (i.e damaging floors, NOT crushers) + MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states MF9_ISPUFF = 0x00000040, // [AA] Set on actors by P_SpawnPuff }; diff --git a/src/playsim/p_3dfloors.cpp b/src/playsim/p_3dfloors.cpp index 505bfa794..dd5a2bb0a 100644 --- a/src/playsim/p_3dfloors.cpp +++ b/src/playsim/p_3dfloors.cpp @@ -198,15 +198,15 @@ void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags, int //========================================================================== // -// P_ActorOnSpecial3DFloor -// Checks to see if an actor is standing on or is inside a 3D floor (water) +// P_PlayerOnSpecial3DFloor +// Checks to see if a player is standing on or is inside a 3D floor (water) // and applies any specials.. // //========================================================================== -void P_ActorOnSpecial3DFloor(AActor* victim) +void P_PlayerOnSpecial3DFloor(player_t* player) { - for(auto rover : victim->Sector->e->XFloor.ffloors) + for(auto rover : player->mo->Sector->e->XFloor.ffloors) { if (!(rover->flags & FF_EXISTS)) continue; if (rover->flags & FF_FIX) continue; @@ -215,22 +215,22 @@ void P_ActorOnSpecial3DFloor(AActor* victim) if(rover->flags & FF_SOLID) { // Player must be on top of the floor to be affected... - if(victim->Z() != rover->top.plane->ZatPoint(victim)) continue; + if(player->mo->Z() != rover->top.plane->ZatPoint(player->mo)) continue; } else { //Water and DEATH FOG!!! heh if ((rover->flags & FF_NODAMAGE) || - victim->Z() > rover->top.plane->ZatPoint(victim) || - victim->Top() < rover->bottom.plane->ZatPoint(victim)) + player->mo->Z() > rover->top.plane->ZatPoint(player->mo) || + player->mo->Top() < rover->bottom.plane->ZatPoint(player->mo)) continue; } // Apply sector specials - P_ActorInSpecialSector(victim, rover->model); + P_PlayerInSpecialSector(player, rover->model); // Apply flat specials (using the ceiling!) - P_ActorOnSpecialFlat(victim, rover->model->GetTerrain(rover->top.isceiling)); + P_PlayerOnSpecialFlat(player, rover->model->GetTerrain(rover->top.isceiling)); break; } diff --git a/src/playsim/p_3dfloors.h b/src/playsim/p_3dfloors.h index 2dba7f713..05d222137 100644 --- a/src/playsim/p_3dfloors.h +++ b/src/playsim/p_3dfloors.h @@ -113,7 +113,8 @@ struct lightlist_t -void P_ActorOnSpecial3DFloor(AActor* victim); +class player_t; +void P_PlayerOnSpecial3DFloor(player_t* player); bool P_CheckFor3DFloorHit(AActor * mo, double z, bool trigger); bool P_CheckFor3DCeilingHit(AActor * mo, double z, bool trigger); diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 8d34e6c73..72251ec79 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -4435,14 +4435,6 @@ void AActor::Tick () // must have been removed if (ObjectFlags & OF_EuthanizeMe) return; } - //[inkoalawetrust] Genericized level damage handling that makes sector, 3D floor, and TERRAIN flat damage affect monsters and other NPCs too. - if (!(flags9 & MF9_NOSECTORDAMAGE) && (player || (player == nullptr && Sector->MoreFlags & SECMF_HURTMONSTERS))) - { - P_ActorOnSpecial3DFloor(this); - P_ActorInSpecialSector(this,Sector); - if (!isAbove(Sector->floorplane.ZatPoint(this)) || waterlevel) // Actor must be touching the floor for TERRAIN flats. - P_ActorOnSpecialFlat(this, P_GetThingFloorType(this)); - } if (tics != -1) { diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index 9c3fde6f4..ab52f285a 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -100,7 +100,7 @@ #include "c_console.h" #include "p_spec_thinkers.h" -static FRandom pr_actorinspecialsector ("ActorInSpecialSector"); +static FRandom pr_playerinspecialsector ("PlayerInSpecialSector"); EXTERN_CVAR(Bool, cl_predict_specials) EXTERN_CVAR(Bool, forcewater) @@ -419,18 +419,21 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType) } // -// P_ActorInSpecialSector +// P_PlayerInSpecialSector // Called every tic frame -// that the actor origin is in a special sector +// that the player origin is in a special sector // -void P_ActorInSpecialSector (AActor *victim, sector_t * sector) +void P_PlayerInSpecialSector (player_t *player, sector_t * sector) { if (sector == NULL) - sector = victim->Sector; - - // Falling, not all the way down yet? - if (!(sector->MoreFlags & SECMF_HARMINAIR) && !victim->isAtZ(sector->LowestFloorAt(victim)) && !victim->waterlevel) - return; + { + // Falling, not all the way down yet? + sector = player->mo->Sector; + if (!player->mo->isAtZ(sector->LowestFloorAt(player->mo)) + && !player->mo->waterlevel) + { + return; + } // Has hit ground. @@ -441,7 +444,7 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) if (sector->damageinterval <= 0) sector->damageinterval = 32; // repair invalid damageinterval values - if (victim->player && sector->Flags & (SECF_EXIT1 | SECF_EXIT2)) + if (sector->Flags & (SECF_EXIT1 | SECF_EXIT2)) { for (int i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) @@ -460,7 +463,7 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) // different damage types yet, so that's not happening for now. // [MK] account for subclasses that may have "Full" protection (i.e.: prevent leaky damage) int ironfeet = 0; - for (auto i = victim->Inventory; i != NULL; i = i->Inventory) + for (auto i = player->mo->Inventory; i != NULL; i = i->Inventory) { if (i->IsKindOf(NAME_PowerIronFeet)) { @@ -472,28 +475,28 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) } } - if (victim->player && sector->Flags & SECF_ENDGODMODE) victim->player->cheats &= ~CF_GODMODE; - if ((ironfeet == 0 || (ironfeet < 2 && pr_actorinspecialsector() < sector->leakydamage))) + if (sector->Flags & SECF_ENDGODMODE) player->cheats &= ~CF_GODMODE; + if ((ironfeet == 0 || (ironfeet < 2 && pr_playerinspecialsector() < sector->leakydamage))) { - if (victim->player && sector->Flags & SECF_HAZARD) + if (sector->Flags & SECF_HAZARD) { - victim->player->hazardcount += sector->damageamount; - victim->player->hazardtype = sector->damagetype; - victim->player->hazardinterval = sector->damageinterval; + player->hazardcount += sector->damageamount; + player->hazardtype = sector->damagetype; + player->hazardinterval = sector->damageinterval; } else if (Level->time % sector->damageinterval == 0) { - if (!(victim->player && victim->player->cheats & (CF_GODMODE | CF_GODMODE2))) + if (!(player->cheats & (CF_GODMODE | CF_GODMODE2))) { - P_DamageMobj(victim, NULL, NULL, sector->damageamount, sector->damagetype); + P_DamageMobj(player->mo, NULL, NULL, sector->damageamount, sector->damagetype); } - if (victim->player && (sector->Flags & SECF_ENDLEVEL) && victim->player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) + if ((sector->Flags & SECF_ENDLEVEL) && player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) { Level->ExitLevel(0, false); } if (sector->Flags & SECF_DMGTERRAINFX) { - P_HitWater(victim, victim->Sector, victim->Pos(), false, true, true); + P_HitWater(player->mo, player->mo->Sector, player->mo->Pos(), false, true, true); } } } @@ -502,14 +505,14 @@ void P_ActorInSpecialSector (AActor *victim, sector_t * sector) { if (Level->time % sector->damageinterval == 0) { - P_GiveBody(victim, -sector->damageamount, 100); + P_GiveBody(player->mo, -sector->damageamount, 100); } } - if (victim->player && sector->isSecret()) + if (sector->isSecret()) { sector->ClearSecret(); - P_GiveSecret(Level, victim, true, true, sector->Index()); + P_GiveSecret(Level, player->mo, true, true, sector->Index()); } } @@ -648,13 +651,13 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GiveSecret) //============================================================================ // -// P_ActorOnSpecialFlat +// P_PlayerOnSpecialFlat // //============================================================================ -void P_ActorOnSpecialFlat (AActor *victim, int floorType) +void P_PlayerOnSpecialFlat (player_t *player, int floorType) { - auto Level = victim->Level; + auto Level = player->mo->Level; if (Terrains[floorType].DamageAmount && !(Level->time % (Terrains[floorType].DamageTimeMask+1))) @@ -664,7 +667,7 @@ void P_ActorOnSpecialFlat (AActor *victim, int floorType) if (Terrains[floorType].AllowProtection) { auto pitype = PClass::FindActor(NAME_PowerIronFeet); - for (ironfeet = victim->Inventory; ironfeet != NULL; ironfeet = ironfeet->Inventory) + for (ironfeet = player->mo->Inventory; ironfeet != NULL; ironfeet = ironfeet->Inventory) { if (ironfeet->IsKindOf (pitype)) break; @@ -674,18 +677,20 @@ void P_ActorOnSpecialFlat (AActor *victim, int floorType) int damage = 0; if (ironfeet == NULL) { - damage = P_DamageMobj (victim, NULL, NULL, Terrains[floorType].DamageAmount, + damage = P_DamageMobj (player->mo, NULL, NULL, Terrains[floorType].DamageAmount, Terrains[floorType].DamageMOD); } if (damage > 0 && Terrains[floorType].Splash != -1) { - S_Sound (victim, CHAN_AUTO, 0, + S_Sound (player->mo, CHAN_AUTO, 0, Splashes[Terrains[floorType].Splash].NormalSplashSound, 1, ATTN_IDLE); } } } + + // // P_UpdateSpecials // Animate planes, scroll walls, etc. diff --git a/src/playsim/p_spec.h b/src/playsim/p_spec.h index ebb5d93f9..cc7d990a9 100644 --- a/src/playsim/p_spec.h +++ b/src/playsim/p_spec.h @@ -90,8 +90,8 @@ bool P_ActivateLine (line_t *ld, AActor *mo, int side, int activationType, DVect bool P_TestActivateLine (line_t *ld, AActor *mo, int side, int activationType, DVector3 *optpos = NULL); bool P_PredictLine (line_t *ld, AActor *mo, int side, int activationType); -void P_ActorInSpecialSector (AActor *victim, sector_t * sector=NULL); -void P_ActorOnSpecialFlat (AActor *victim, int floorType); +void P_PlayerInSpecialSector (player_t *player, sector_t * sector=NULL); +void P_PlayerOnSpecialFlat (player_t *player, int floorType); void P_SectorDamage(FLevelLocals *Level, int tag, int amount, FName type, PClassActor *protectClass, int flags); void P_SetSectorFriction (FLevelLocals *level, int tag, int amount, bool alterFlag); double FrictionToMoveFactor(double friction); diff --git a/src/playsim/p_user.cpp b/src/playsim/p_user.cpp index a98a7c523..d3294ffd6 100644 --- a/src/playsim/p_user.cpp +++ b/src/playsim/p_user.cpp @@ -1204,6 +1204,15 @@ DEFINE_ACTION_FUNCTION(APlayerPawn, CheckMusicChange) void P_CheckEnvironment(player_t *player) { + P_PlayerOnSpecial3DFloor(player); + P_PlayerInSpecialSector(player); + + if (!player->mo->isAbove(player->mo->Sector->floorplane.ZatPoint(player->mo)) || + player->mo->waterlevel) + { + // Player must be touching the floor + P_PlayerOnSpecialFlat(player, P_GetThingFloorType(player->mo)); + } if (player->mo->Vel.Z <= -player->mo->FloatVar(NAME_FallingScreamMinSpeed) && player->mo->Vel.Z >= -player->mo->FloatVar(NAME_FallingScreamMaxSpeed) && player->mo->alternative == nullptr && player->mo->waterlevel == 0) diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 129c06b78..be7c299ed 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -351,7 +351,6 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF9, SHADOWBLOCK, AActor, flags9), DEFINE_FLAG(MF9, SHADOWAIMVERT, AActor, flags9), DEFINE_FLAG(MF9, DECOUPLEDANIMATIONS, AActor, flags9), - DEFINE_FLAG(MF9, NOSECTORDAMAGE, AActor, flags9), DEFINE_PROTECTED_FLAG(MF9, ISPUFF, AActor, flags9), //[AA] was spawned by SpawnPuff // Effect flags diff --git a/wadsrc/static/zscript/mapdata.zs b/wadsrc/static/zscript/mapdata.zs index 06a7bf3ea..5d45563eb 100644 --- a/wadsrc/static/zscript/mapdata.zs +++ b/wadsrc/static/zscript/mapdata.zs @@ -435,11 +435,6 @@ struct Sector native play SECMF_UNDERWATERMASK = 32+64, SECMF_DRAWN = 128, // sector has been drawn at least once SECMF_HIDDEN = 256, // Do not draw on textured automap - SECMF_OVERLAPPING = 512, // floor and ceiling overlap and require special renderer action. - SECMF_NOSKYWALLS = 1024, // Do not draw "sky walls" - SECMF_LIFT = 2048, // For MBF monster AI - SECMF_HURTMONSTERS = 4096, // Monsters in this sector are hurt like players. - SECMF_HARMINAIR = 8192, // Actors in this sector are also hurt mid-air. } native uint16 MoreFlags; @@ -457,9 +452,6 @@ struct Sector native play SECF_ENDLEVEL = 512, // ends level when health goes below 10 SECF_HAZARD = 1024, // Change to Strife's delayed damage handling. SECF_NOATTACK = 2048, // monsters cannot start attacks in this sector. - SECF_EXIT1 = 4096, - SECF_EXIT2 = 8192, - SECF_KILLMONSTERS = 16384,// Monsters in this sector are instantly killed. SECF_WASSECRET = 1 << 30, // a secret that was discovered SECF_SECRET = 1 << 31, // a secret sector From a45bf49616f93cdd0654107f6beb3ae65c011909 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Fri, 18 Oct 2024 21:36:16 +0800 Subject: [PATCH 405/414] Move no-mipmapping from actor renderflag/particle flag, to a material property in GLDEFS, where it makes more sense. The feature was introduced in the short-lived engine version of 4.13 which was deemed too broken and needed to be replaced with a newer version anyway, so might as well perform an API-breaking change at this point in time. Note that this currently only works for sprites (its primary targeted use case) -- walls, flats and models can be patched in later. --- src/common/textures/gametexture.h | 4 ++++ src/playsim/actor.h | 7 +++---- src/playsim/p_effect.h | 3 +-- src/r_data/gldefs.cpp | 14 ++++++++++++++ src/rendering/hwrenderer/scene/hw_drawstructs.h | 2 -- src/rendering/hwrenderer/scene/hw_sprites.cpp | 10 ++++++---- src/scripting/thingdef_data.cpp | 1 - wadsrc/static/zscript/constants.zs | 3 +-- 8 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/common/textures/gametexture.h b/src/common/textures/gametexture.h index 3eb3740a9..a55616e66 100644 --- a/src/common/textures/gametexture.h +++ b/src/common/textures/gametexture.h @@ -62,6 +62,7 @@ enum EGameTexFlags GTexf_OffsetsNotForFont = 512, // The offsets must be ignored when using this texture in a font. GTexf_NoTrim = 1024, // Don't perform trimming on this texture. GTexf_Seen = 2048, // Set to true when the texture is being used for rendering. Must be cleared manually if the check is needed. + GTexf_NoMipmap = 4096, // Disable mipmapping for this texture }; struct FMaterialLayers @@ -265,6 +266,9 @@ public: void SetGlowing(PalEntry color) { flags = (flags & ~GTexf_AutoGlowing) | GTexf_Glowing; GlowColor = color; } void SetDisableBrightmap() { flags |= GTexf_BrightmapChecked; Brightmap = nullptr; } + bool isNoMipmap() const { return !!(flags & GTexf_NoMipmap); } + void SetNoMipmap(bool set) { if (set) flags |= GTexf_NoMipmap; else flags &= ~GTexf_NoMipmap; } + bool isUserContent() const; int CheckRealHeight() { return xs_RoundToInt(Base->CheckRealHeight() / ScaleY); } void SetSize(int x, int y) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index d472decad..4fb96c952 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -502,10 +502,9 @@ enum ActorRenderFlag2 RF2_FLIPSPRITEOFFSETX = 0x0010, RF2_FLIPSPRITEOFFSETY = 0x0020, RF2_CAMFOLLOWSPLAYER = 0x0040, // Matches the cam's base position and angles to the main viewpoint. - RF2_NOMIPMAP = 0x0080, // [Nash] forces no mipmapping on sprites. Useful for tiny sprites that need to remain visually crisp - RF2_ISOMETRICSPRITES = 0x0100, - RF2_SQUAREPIXELS = 0x0200, // apply +ROLLSPRITE scaling math so that non rolling sprites get the same scaling - RF2_STRETCHPIXELS = 0x0400, // don't apply SQUAREPIXELS for ROLLSPRITES + RF2_ISOMETRICSPRITES = 0x0080, + RF2_SQUAREPIXELS = 0x0100, // apply +ROLLSPRITE scaling math so that non rolling sprites get the same scaling + RF2_STRETCHPIXELS = 0x0200, // don't apply SQUAREPIXELS for ROLLSPRITES }; // This translucency value produces the closest match to Heretic's TINTTAB. diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index 4884739f2..735a87e81 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -69,8 +69,7 @@ enum EParticleFlags SPF_FACECAMERA = 1 << 11, SPF_NOFACECAMERA = 1 << 12, SPF_ROLLCENTER = 1 << 13, - SPF_NOMIPMAP = 1 << 14, - SPF_STRETCHPIXELS = 1 << 15, + SPF_STRETCHPIXELS = 1 << 14, }; class DVisualThinker; diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index 9b5be0e25..d92b9daf6 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -1270,6 +1270,7 @@ class GLDefsParser bool disable_fullbright_specified = false; bool thiswad = false; bool iwad = false; + bool no_mipmap = false; UserShaderDesc usershader; TArray texNameList; @@ -1319,6 +1320,10 @@ class GLDefsParser // only affects textures defined in the IWAD. iwad = true; } + else if (sc.Compare("nomipmap")) + { + no_mipmap = true; + } else if (sc.Compare("glossiness")) { sc.MustGetFloat(); @@ -1422,6 +1427,8 @@ class GLDefsParser if (!useme) return; } + tex->SetNoMipmap(no_mipmap); + FGameTexture **bindings[6] = { &mlay.Brightmap, @@ -1681,6 +1688,7 @@ class GLDefsParser bool disable_fullbright = false; bool thiswad = false; bool iwad = false; + bool no_mipmap = false; int maplump = -1; UserShaderDesc desc; desc.shaderType = SHADER_Default; @@ -1723,6 +1731,10 @@ class GLDefsParser if (!found) sc.ScriptError("Unknown material type '%s' specified\n", sc.String); } + else if (sc.Compare("nomipmap")) + { + no_mipmap = true; + } else if (sc.Compare("speed")) { sc.MustGetFloat(); @@ -1784,6 +1796,8 @@ class GLDefsParser return; } + tex->SetNoMipmap(no_mipmap); + int firstUserTexture; switch (desc.shaderType) { diff --git a/src/rendering/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h index b364128de..903806c67 100644 --- a/src/rendering/hwrenderer/scene/hw_drawstructs.h +++ b/src/rendering/hwrenderer/scene/hw_drawstructs.h @@ -393,8 +393,6 @@ public: TArray *lightlist; DRotator Angles; - bool nomipmap; // force the sprite to have no mipmaps (ensures tiny sprites in the distance stay crisp) - void SplitSprite(HWDrawInfo *di, sector_t * frontsector, bool translucent); void PerformSpriteClipAdjustment(AActor *thing, const DVector2 &thingpos, float spriteheight); bool CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp); diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 91125b750..cbca1a90d 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -224,7 +224,12 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.SetFog(0, 0); } - int clampmode = nomipmap ? CLAMP_XY_NOMIP : CLAMP_XY; + int clampmode = CLAMP_XY; + + if (texture && texture->isNoMipmap()) + { + clampmode = CLAMP_XY_NOMIP; + } uint32_t spritetype = actor? uint32_t(actor->renderflags & RF_SPRITETYPEMASK) : 0; if (texture) state.SetMaterial(texture, UF_Sprite, (spritetype == RF_FACESPRITE) ? CTF_Expand : 0, clampmode, translation, OverrideShader); @@ -786,8 +791,6 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t return; } - nomipmap = (thing->renderflags2 & RF2_NOMIPMAP); - // check renderrequired vs ~r_rendercaps, if anything matches we don't support that feature, // check renderhidden vs r_rendercaps, if anything matches we do support that feature and should hide it. if ((!r_debug_disable_vis_filter && !!(thing->RenderRequired & ~r_renderercaps)) || @@ -1420,7 +1423,6 @@ void HWSprite::ProcessParticle(HWDrawInfo *di, particle_t *particle, sector_t *s actor = nullptr; this->particle = particle; fullbright = particle->flags & SPF_FULLBRIGHT; - nomipmap = particle->flags & SPF_NOMIPMAP; if (di->isFullbrightScene()) { diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index be7c299ed..dc7fcacc3 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -383,7 +383,6 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(RF2, FLIPSPRITEOFFSETX, AActor, renderflags2), DEFINE_FLAG(RF2, FLIPSPRITEOFFSETY, AActor, renderflags2), DEFINE_FLAG(RF2, CAMFOLLOWSPLAYER, AActor, renderflags2), - DEFINE_FLAG(RF2, NOMIPMAP, AActor, renderflags2), DEFINE_FLAG(RF2, ISOMETRICSPRITES, AActor, renderflags2), DEFINE_FLAG(RF2, SQUAREPIXELS, AActor, renderflags2), diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index 7ab58204f..5fcebf6e1 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -722,8 +722,7 @@ enum EParticleFlags SPF_FACECAMERA = 1 << 11, SPF_NOFACECAMERA = 1 << 12, SPF_ROLLCENTER = 1 << 13, - SPF_NOMIPMAP = 1 << 14, - SPF_STRETCHPIXELS = 1 << 15, + SPF_STRETCHPIXELS = 1 << 14, SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG }; From 689dc61fa8a58a5df0bcc3c9a785e93151351641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 19 Oct 2024 11:30:04 -0300 Subject: [PATCH 406/414] Fully revert #2479 --- src/playsim/actor.h | 2 +- src/playsim/p_enemy.cpp | 6 ------ src/playsim/p_spec.cpp | 1 + 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 4fb96c952..98e4d88b7 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -442,7 +442,7 @@ enum ActorFlag9 MF9_DOSHADOWBLOCK = 0x00000002, // [inkoalawetrust] Should the monster look for SHADOWBLOCK actors ? MF9_SHADOWBLOCK = 0x00000004, // [inkoalawetrust] Actors in the line of fire with this flag trigger the MF_SHADOW aiming penalty. MF9_SHADOWAIMVERT = 0x00000008, // [inkoalawetrust] Monster aim is also offset vertically when aiming at shadow actors. - MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states + MF9_DECOUPLEDANIMATIONS = 0x00000010, // [RL0] Decouple model animations from states MF9_ISPUFF = 0x00000040, // [AA] Set on actors by P_SpawnPuff }; diff --git a/src/playsim/p_enemy.cpp b/src/playsim/p_enemy.cpp index 55f501488..f87c28654 100644 --- a/src/playsim/p_enemy.cpp +++ b/src/playsim/p_enemy.cpp @@ -464,12 +464,6 @@ static int P_IsUnderDamage(AActor* actor) dir |= cl->getDirection(); } // Q: consider crushing 3D floors too? - // [inkoalawetrust] Check for sectors that can harm the actor. - if (!(actor->flags9 & MF9_NOSECTORDAMAGE) && seclist->m_sector->damageamount > 0) - { - if (seclist->m_sector->MoreFlags & SECMF_HARMINAIR || actor->isAtZ(seclist->m_sector->LowestFloorAt(actor)) || actor->waterlevel) - return (actor->player || (actor->player == nullptr && seclist->m_sector->MoreFlags & SECMF_HURTMONSTERS)) ? -1 : 0; - } } return dir; } diff --git a/src/playsim/p_spec.cpp b/src/playsim/p_spec.cpp index ab52f285a..6ffc2d9af 100644 --- a/src/playsim/p_spec.cpp +++ b/src/playsim/p_spec.cpp @@ -434,6 +434,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) { return; } + } // Has hit ground. From 4a425c4493a9238afe7a7acec11c70b7efdaf922 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Sun, 20 Oct 2024 23:54:15 +0200 Subject: [PATCH 407/414] Add support for updating the CPU-side accelstruct used for actor tracing --- .../hwrenderer/data/hw_collision.cpp | 823 ++++++++---------- .../rendering/hwrenderer/data/hw_collision.h | 143 +-- .../hwrenderer/data/hw_levelmesh.cpp | 15 +- .../rendering/hwrenderer/data/hw_levelmesh.h | 15 +- src/common/rendering/vulkan/vk_levelmesh.cpp | 19 +- src/common/rendering/vulkan/vk_levelmesh.h | 12 - src/rendering/hwrenderer/doom_levelmesh.cpp | 7 +- 7 files changed, 441 insertions(+), 593 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_collision.cpp b/src/common/rendering/hwrenderer/data/hw_collision.cpp index eddf6ca37..182a07c77 100644 --- a/src/common/rendering/hwrenderer/data/hw_collision.cpp +++ b/src/common/rendering/hwrenderer/data/hw_collision.cpp @@ -21,6 +21,7 @@ */ #include "hw_collision.h" +#include "hw_levelmesh.h" #include #include #include @@ -28,73 +29,347 @@ #include #endif -TriangleMeshShape::TriangleMeshShape(const FFlatVertex *vertices, int num_vertices, const unsigned int *elements, int num_elements) +CPUAccelStruct::CPUAccelStruct(LevelMesh* mesh) : Mesh(mesh) +{ + // Find out how many segments we should split the map into + DynamicBLAS.resize(32); + IndexesPerBLAS = ((Mesh->Mesh.Indexes.size() + 2) / 3 / DynamicBLAS.size() + 1) * 3; + InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; + + // Create a BLAS for each segment in use + for (int instance = 0; instance < InstanceCount; instance++) + { + int indexStart = instance * IndexesPerBLAS; + int indexEnd = std::min(indexStart + IndexesPerBLAS, Mesh->Mesh.IndexCount); + DynamicBLAS[instance] = CreateBLAS(indexStart, indexEnd - indexStart); + } + + CreateTLAS(); + Upload(); +} + +CPUAccelStruct::~CPUAccelStruct() +{ +} + +TraceHit CPUAccelStruct::FindFirstHit(const FVector3& rayStart, const FVector3& rayEnd) +{ + RayBBox ray(rayStart, rayEnd); + TraceHit hit; + FindFirstHit(ray, TLAS.Root, &hit); + return hit; +} + +void CPUAccelStruct::FindFirstHit(const RayBBox& ray, int a, TraceHit* hit) +{ + if (IntersectionTest::ray_aabb(ray, TLAS.Nodes[a].aabb) == IntersectionTest::overlap) + { + if (TLAS.Nodes[a].IsLeaf()) + { + int blasIndex = TLAS.Nodes[a].blas_index; + TraceHit blasHit = DynamicBLAS[blasIndex]->FindFirstHit(ray.start, ray.end); + if (blasHit.fraction < hit->fraction) + { + hit->fraction = blasHit.fraction; + hit->triangle = (IndexesPerBLAS * blasIndex) / 3 + blasHit.triangle; + hit->b = blasHit.b; + hit->c = blasHit.c; + } + } + else + { + FindFirstHit(ray, TLAS.Nodes[a].left, hit); + FindFirstHit(ray, TLAS.Nodes[a].right, hit); + } + } +} + +void CPUAccelStruct::Update() +{ + if (Mesh->UploadRanges.Index.Size() == 0) + return; + + InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; + + bool needsUpdate[32] = {}; + for (const MeshBufferRange& range : Mesh->UploadRanges.Index) + { + int start = range.Start / IndexesPerBLAS; + int end = (range.End + IndexesPerBLAS - 1) / IndexesPerBLAS; + for (int i = start; i < end; i++) + { + needsUpdate[i] = true; + } + } + + for (int instance = 0; instance < InstanceCount; instance++) + { + if (needsUpdate) + { + int indexStart = instance * IndexesPerBLAS; + int indexEnd = std::min(indexStart + IndexesPerBLAS, Mesh->Mesh.IndexCount); + DynamicBLAS[instance] = CreateBLAS(indexStart, indexEnd - indexStart); + } + } + + CreateTLAS(); + Upload(); +} + +std::unique_ptr CPUAccelStruct::CreateBLAS(int indexStart, int indexCount) +{ + return std::make_unique(Mesh->Mesh.Vertices.Data(), Mesh->Mesh.Vertices.Size(), &Mesh->Mesh.Indexes[indexStart], indexCount, Scratch); +} + +static FVector3 SwapYZ(const FVector3& v) +{ + return FVector3(v.X, v.Z, v.Y); +} + +void CPUAccelStruct::Upload() +{ + // To do: don't bother with this if rayquery is available as it won't be used + + unsigned int count = (unsigned int)TLAS.Nodes.size(); + for (auto& blas : DynamicBLAS) + { + if (blas) + { + count += (unsigned int)blas->GetNodes().size(); + } + } + + if (Mesh->Mesh.Nodes.Size() < count) + { + Mesh->Mesh.Nodes.Resize(std::max(count * 2, (unsigned int)10000)); + } + + Mesh->Mesh.RootNode = TLAS.Root; + + auto& destnodes = Mesh->Mesh.Nodes; + + // Copy the BLAS nodes to the mesh node list and remember their locations + int offset = TLAS.Nodes.size(); + int instance = 0; + int blasOffsets[32] = {}; + for (auto& blas : DynamicBLAS) + { + if (blas) + { + int blasStart = offset; + int indexStart = instance * IndexesPerBLAS; + blasOffsets[instance] = blasStart; + + for (const auto& node : blas->GetNodes()) + { + CollisionNode& info = destnodes[offset]; + info.center = SwapYZ(node.aabb.Center); + info.extents = SwapYZ(node.aabb.Extents); + info.left = blasStart + node.left; + info.right = blasStart + node.right; + info.element_index = indexStart + node.element_index; + offset++; + } + instance++; + } + } + + // Copy the TLAS nodes and redirect the leafs to the BLAS roots + offset = 0; + for (const auto& node : TLAS.Nodes) + { + CollisionNode& info = destnodes[offset]; + info.center = SwapYZ(node.aabb.Center); + info.extents = SwapYZ(node.aabb.Extents); + + if (node.left != -1 && TLAS.Nodes[node.left].blas_index != -1) + { + info.left = blasOffsets[TLAS.Nodes[node.left].blas_index]; + } + else + { + info.left = node.left; + } + + if (node.right != -1 && TLAS.Nodes[node.right].blas_index != -1) + { + info.right = blasOffsets[TLAS.Nodes[node.right].blas_index]; + } + else + { + info.right = node.right; + } + + info.element_index = -1; + offset++; + } + + Mesh->UploadRanges.Node.Clear(); + Mesh->UploadRanges.Node.Push({ 0, (int)count }); +} + +void CPUAccelStruct::CreateTLAS() +{ + Scratch.leafs.clear(); + Scratch.leafs.reserve(InstanceCount); + Scratch.centroids.clear(); + Scratch.centroids.reserve(DynamicBLAS.size()); + for (int i = 0; i < InstanceCount; i++) + { + Scratch.leafs.push_back(i); + Scratch.centroids.push_back(DynamicBLAS[i]->GetBBox().Center); + } + + size_t neededbuffersize = InstanceCount * 2; + if (Scratch.workbuffer.size() < neededbuffersize) + Scratch.workbuffer.resize(neededbuffersize); + + TLAS.Nodes.clear(); + TLAS.Root = Subdivide(Scratch.leafs.data(), (int)Scratch.leafs.size(), Scratch.centroids.data(), Scratch.workbuffer.data()); +} + +int CPUAccelStruct::Subdivide(int* instances, int numInstances, const FVector3* centroids, int* workBuffer) +{ + if (numInstances == 0) + return -1; + + // Find bounding box and median of the instance centroids + FVector3 median; + FVector3 min = DynamicBLAS[0]->GetBBox().min; + FVector3 max = DynamicBLAS[0]->GetBBox().max; + for (int i = 0; i < numInstances; i++) + { + const CollisionBBox& bbox = DynamicBLAS[i]->GetBBox(); + + min.X = std::min(min.X, bbox.min.X); + min.Y = std::min(min.Y, bbox.min.Y); + min.Z = std::min(min.Z, bbox.min.Z); + + max.X = std::max(max.X, bbox.max.X); + max.Y = std::max(max.Y, bbox.max.Y); + max.Z = std::max(max.Z, bbox.max.Z); + + median += centroids[instances[i]]; + } + median /= (float)numInstances; + + if (numInstances == 1) // Leaf node + { + TLAS.Nodes.push_back(Node(min, max, instances[0])); + return (int)TLAS.Nodes.size() - 1; + } + + // Find the longest axis + float axis_lengths[3] = + { + max.X - min.X, + max.Y - min.Y, + max.Z - min.Z + }; + + int axis_order[3] = { 0, 1, 2 }; + std::sort(axis_order, axis_order + 3, [&](int a, int b) { return axis_lengths[a] > axis_lengths[b]; }); + + // Try split at longest axis, then if that fails the next longest, and then the remaining one + int left_count, right_count; + FVector3 axis; + for (int attempt = 0; attempt < 3; attempt++) + { + // Find the split plane for axis + switch (axis_order[attempt]) + { + default: + case 0: axis = FVector3(1.0f, 0.0f, 0.0f); break; + case 1: axis = FVector3(0.0f, 1.0f, 0.0f); break; + case 2: axis = FVector3(0.0f, 0.0f, 1.0f); break; + } + FVector4 plane(axis, -(median | axis)); // plane(axis, -dot(median, axis)); + + // Split instances into two + left_count = 0; + right_count = 0; + for (int i = 0; i < numInstances; i++) + { + int instance = instances[i]; + + float side = (FVector4(centroids[instance], 1.0f) | plane); + if (side >= 0.0f) + { + workBuffer[left_count] = instance; + left_count++; + } + else + { + workBuffer[numInstances + right_count] = instance; + right_count++; + } + } + + if (left_count != 0 && right_count != 0) + break; + } + + // Check if something went wrong when splitting and do a random split instead + if (left_count == 0 || right_count == 0) + { + left_count = numInstances / 2; + right_count = numInstances - left_count; + } + else + { + // Move result back into instances list: + for (int i = 0; i < left_count; i++) + instances[i] = workBuffer[i]; + for (int i = 0; i < right_count; i++) + instances[i + left_count] = workBuffer[numInstances + i]; + } + + // Create child nodes: + int left_index = -1; + int right_index = -1; + if (left_count > 0) + left_index = Subdivide(instances, left_count, centroids, workBuffer); + if (right_count > 0) + right_index = Subdivide(instances + left_count, right_count, centroids, workBuffer); + + TLAS.Nodes.push_back(Node(min, max, left_index, right_index)); + return (int)TLAS.Nodes.size() - 1; +} + +///////////////////////////////////////////////////////////////////////////// + +CPUBottomLevelAccelStruct::CPUBottomLevelAccelStruct(const FFlatVertex *vertices, int num_vertices, const unsigned int *elements, int num_elements, AccelStructScratchBuffer& scratch) : vertices(vertices), num_vertices(num_vertices), elements(elements), num_elements(num_elements) { int num_triangles = num_elements / 3; if (num_triangles <= 0) return; - std::vector triangles; - std::vector centroids; - triangles.reserve(num_triangles); - centroids.reserve(num_triangles); + scratch.leafs.clear(); + scratch.leafs.reserve(num_triangles); + scratch.centroids.clear(); + scratch.centroids.reserve(num_triangles); for (int i = 0; i < num_triangles; i++) { - triangles.push_back(i); + scratch.leafs.push_back(i); int element_index = i * 3; FVector3 centroid = (vertices[elements[element_index + 0]].fPos() + vertices[elements[element_index + 1]].fPos() + vertices[elements[element_index + 2]].fPos()) * (1.0f / 3.0f); - centroids.push_back(centroid); + scratch.centroids.push_back(centroid); } - std::vector work_buffer(num_triangles * 2); + size_t neededbuffersize = num_triangles * 2; + if (scratch.workbuffer.size() < neededbuffersize) + scratch.workbuffer.resize(neededbuffersize); - root = subdivide(&triangles[0], (int)triangles.size(), ¢roids[0], &work_buffer[0]); + root = Subdivide(&scratch.leafs[0], (int)scratch.leafs.size(), &scratch.centroids[0], scratch.workbuffer.data()); } -float TriangleMeshShape::sweep(TriangleMeshShape *shape1, SphereShape *shape2, const FVector3 &target) -{ - if (shape1->root == -1) - return 1.0f; - return sweep(shape1, shape2, shape1->root, target); -} - -bool TriangleMeshShape::find_any_hit(TriangleMeshShape *shape1, TriangleMeshShape *shape2) -{ - if (shape1->root == -1) - return false; - return find_any_hit(shape1, shape2, shape1->root, shape2->root); -} - -bool TriangleMeshShape::find_any_hit(TriangleMeshShape *shape1, SphereShape *shape2) -{ - if (shape1->root == -1) - return false; - return find_any_hit(shape1, shape2, shape1->root); -} - -std::vector TriangleMeshShape::find_all_hits(TriangleMeshShape* shape1, SphereShape* shape2) -{ - std::vector hits; - if (shape1->root != -1) - find_all_hits(shape1, shape2, shape1->root, hits); - return hits; -} - -bool TriangleMeshShape::find_any_hit(TriangleMeshShape *shape, const FVector3 &ray_start, const FVector3 &ray_end) -{ - if (shape->root == -1) - return false; - - return find_any_hit(shape, RayBBox(ray_start, ray_end), shape->root); -} - -TraceHit TriangleMeshShape::find_first_hit(TriangleMeshShape *shape, const FVector3 &ray_start, const FVector3 &ray_end) +TraceHit CPUBottomLevelAccelStruct::FindFirstHit(const FVector3 &ray_start, const FVector3 &ray_end) { TraceHit hit; - if (shape->root == -1) + if (root == -1) return hit; // Perform segmented tracing to keep the ray AABB box smaller @@ -107,7 +382,7 @@ TraceHit TriangleMeshShape::find_first_hit(TriangleMeshShape *shape, const FVect float segstart = t / tracedist; float segend = std::min(t + segmentlen, tracedist) / tracedist; - find_first_hit(shape, RayBBox(ray_start + ray_dir * segstart, ray_start + ray_dir * segend), shape->root, &hit); + FindFirstHit(RayBBox(ray_start + ray_dir * segstart, ray_start + ray_dir * segend), root, &hit); if (hit.fraction < 1.0f) { hit.fraction = segstart * (1.0f - hit.fraction) + segend * hit.fraction; @@ -118,171 +393,39 @@ TraceHit TriangleMeshShape::find_first_hit(TriangleMeshShape *shape, const FVect return hit; } -float TriangleMeshShape::sweep(TriangleMeshShape *shape1, SphereShape *shape2, int a, const FVector3 &target) +void CPUBottomLevelAccelStruct::FindFirstHit(const RayBBox &ray, int a, TraceHit *hit) { - if (sweep_overlap_bv_sphere(shape1, shape2, a, target)) + if (IntersectionTest::ray_aabb(ray, nodes[a].aabb) == IntersectionTest::overlap) { - if (shape1->is_leaf(a)) - { - return sweep_intersect_triangle_sphere(shape1, shape2, a, target); - } - else - { - return std::min(sweep(shape1, shape2, shape1->nodes[a].left, target), sweep(shape1, shape2, shape1->nodes[a].right, target)); - } - } - return 1.0f; -} - -bool TriangleMeshShape::find_any_hit(TriangleMeshShape *shape1, SphereShape *shape2, int a) -{ - if (overlap_bv_sphere(shape1, shape2, a)) - { - if (shape1->is_leaf(a)) - { - return overlap_triangle_sphere(shape1, shape2, a); - } - else - { - if (find_any_hit(shape1, shape2, shape1->nodes[a].left)) - return true; - else - return find_any_hit(shape1, shape2, shape1->nodes[a].right); - } - } - return false; -} - -void TriangleMeshShape::find_all_hits(TriangleMeshShape* shape1, SphereShape* shape2, int a, std::vector& hits) -{ - if (overlap_bv_sphere(shape1, shape2, a)) - { - if (shape1->is_leaf(a)) - { - if (overlap_triangle_sphere(shape1, shape2, a)) - { - hits.push_back(shape1->nodes[a].element_index / 3); - } - } - else - { - find_all_hits(shape1, shape2, shape1->nodes[a].left, hits); - find_all_hits(shape1, shape2, shape1->nodes[a].right, hits); - } - } -} - -bool TriangleMeshShape::find_any_hit(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b) -{ - bool leaf_a = shape1->is_leaf(a); - bool leaf_b = shape2->is_leaf(b); - if (leaf_a && leaf_b) - { - return overlap_triangle_triangle(shape1, shape2, a, b); - } - else if (!leaf_a && !leaf_b) - { - if (overlap_bv(shape1, shape2, a, b)) - { - if (shape1->volume(a) > shape2->volume(b)) - { - if (find_any_hit(shape1, shape2, shape1->nodes[a].left, b)) - return true; - else - return find_any_hit(shape1, shape2, shape1->nodes[a].right, b); - } - else - { - if (find_any_hit(shape1, shape2, a, shape2->nodes[b].left)) - return true; - else - return find_any_hit(shape1, shape2, a, shape2->nodes[b].right); - } - } - return false; - } - else if (leaf_a) - { - if (overlap_bv_triangle(shape2, shape1, b, a)) - { - if (find_any_hit(shape1, shape2, a, shape2->nodes[b].left)) - return true; - else - return find_any_hit(shape1, shape2, a, shape2->nodes[b].right); - } - return false; - } - else - { - if (overlap_bv_triangle(shape1, shape2, a, b)) - { - if (find_any_hit(shape1, shape2, shape1->nodes[a].left, b)) - return true; - else - return find_any_hit(shape1, shape2, shape1->nodes[a].right, b); - } - return false; - } -} - -bool TriangleMeshShape::find_any_hit(TriangleMeshShape *shape, const RayBBox &ray, int a) -{ - if (overlap_bv_ray(shape, ray, a)) - { - if (shape->is_leaf(a)) + if (nodes[a].IsLeaf()) { float baryB, baryC; - return intersect_triangle_ray(shape, ray, a, baryB, baryC) < 1.0f; - } - else - { - if (find_any_hit(shape, ray, shape->nodes[a].left)) - return true; - else - return find_any_hit(shape, ray, shape->nodes[a].right); - } - } - return false; -} - -void TriangleMeshShape::find_first_hit(TriangleMeshShape *shape, const RayBBox &ray, int a, TraceHit *hit) -{ - if (overlap_bv_ray(shape, ray, a)) - { - if (shape->is_leaf(a)) - { - float baryB, baryC; - float t = intersect_triangle_ray(shape, ray, a, baryB, baryC); + float t = IntersectTriangleRay(ray, a, baryB, baryC); if (t < hit->fraction) { hit->fraction = t; - hit->triangle = shape->nodes[a].element_index / 3; + hit->triangle = nodes[a].element_index / 3; hit->b = baryB; hit->c = baryC; } } else { - find_first_hit(shape, ray, shape->nodes[a].left, hit); - find_first_hit(shape, ray, shape->nodes[a].right, hit); + FindFirstHit(ray, nodes[a].left, hit); + FindFirstHit(ray, nodes[a].right, hit); } } } -bool TriangleMeshShape::overlap_bv_ray(TriangleMeshShape *shape, const RayBBox &ray, int a) +float CPUBottomLevelAccelStruct::IntersectTriangleRay(const RayBBox &ray, int a, float &barycentricB, float &barycentricC) { - return IntersectionTest::ray_aabb(ray, shape->nodes[a].aabb) == IntersectionTest::overlap; -} - -float TriangleMeshShape::intersect_triangle_ray(TriangleMeshShape *shape, const RayBBox &ray, int a, float &barycentricB, float &barycentricC) -{ - const int start_element = shape->nodes[a].element_index; + const int start_element = nodes[a].element_index; FVector3 p[3] = { - shape->vertices[shape->elements[start_element]].fPos(), - shape->vertices[shape->elements[start_element + 1]].fPos(), - shape->vertices[shape->elements[start_element + 2]].fPos() + vertices[elements[start_element]].fPos(), + vertices[elements[start_element + 1]].fPos(), + vertices[elements[start_element + 2]].fPos() }; // Moeller-Trumbore ray-triangle intersection algorithm: @@ -338,255 +481,7 @@ float TriangleMeshShape::intersect_triangle_ray(TriangleMeshShape *shape, const return t; } -bool TriangleMeshShape::sweep_overlap_bv_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int a, const FVector3 &target) -{ - // Convert to ray test by expanding the AABB: - - CollisionBBox aabb = shape1->nodes[a].aabb; - aabb.Extents.X += shape2->radius; - aabb.Extents.Y += shape2->radius; - aabb.Extents.Z += shape2->radius; - - return IntersectionTest::ray_aabb(RayBBox(shape2->center, target), aabb) == IntersectionTest::overlap; -} - -float TriangleMeshShape::sweep_intersect_triangle_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int a, const FVector3 &target) -{ - const int start_element = shape1->nodes[a].element_index; - - FVector3 p[3] = - { - shape1->vertices[shape1->elements[start_element]].fPos(), - shape1->vertices[shape1->elements[start_element + 1]].fPos(), - shape1->vertices[shape1->elements[start_element + 2]].fPos() - }; - - FVector3 c = shape2->center; - FVector3 e = target; - float r = shape2->radius; - - // Dynamic intersection test between a ray and the minkowski sum of the sphere and polygon: - - FVector3 n = ((p[1] - p[0]) ^ (p[2] - p[0])).Unit(); // normalize(cross(p[1] - p[0], p[2] - p[0])); - FVector4 plane(n, -(n | p[0])); // plane(n, -dot(n, p[0])); - - // Step 1: Plane intersect test - - float sc = (plane | FVector4(c, 1.0f)); // dot(plane, FVector4(c, 1.0f)); - float se = (plane | FVector4(e, 1.0f)); // dot(plane, FVector4(e, 1.0f)); - bool same_side = sc * se > 0.0f; - - if (same_side && std::abs(sc) > r && std::abs(se) > r) - return 1.0f; - - // Step 1a: Check if point is in polygon (using crossing ray test in 2d) - { - float t = (sc - r) / (sc - se); - - FVector3 vt = c + (e - c) * t; - - FVector3 u0 = p[1] - p[0]; - FVector3 u1 = p[2] - p[0]; - - FVector2 v_2d[3] = - { - FVector2(0.0f, 0.0f), - FVector2((u0 | u0), 0.0f), // FVector2(dot(u0, u0), 0.0f), - FVector2(0.0f, (u1 | u1)) // FVector2(0.0f, dot(u1, u1)) - }; - - FVector2 point((u0 | vt), (u1 | vt)); // point(dot(u0, vt), dot(u1, vt)); - - bool inside = false; - FVector2 e0 = v_2d[2]; - bool y0 = e0.Y >= point.Y; - for (int i = 0; i < 3; i++) - { - FVector2 e1 = v_2d[i]; - bool y1 = e1.Y >= point.Y; - - if (y0 != y1 && ((e1.Y - point.Y) * (e0.X - e1.X) >= (e1.X - point.X) * (e0.Y - e1.Y)) == y1) - inside = !inside; - - y0 = y1; - e0 = e1; - } - - if (inside) - return t; - } - - // Step 2: Edge intersect test - - FVector3 ke[3] = - { - p[1] - p[0], - p[2] - p[1], - p[0] - p[2], - }; - - FVector3 kg[3] = - { - p[0] - c, - p[1] - c, - p[2] - c, - }; - - FVector3 ks = e - c; - - float kgg[3]; - float kgs[3]; - float kss[3]; - - for (int i = 0; i < 3; i++) - { - float kee = (ke[i] | ke[i]); // dot(ke[i], ke[i]); - float keg = (ke[i] | kg[i]); // dot(ke[i], kg[i]); - float kes = (ke[i] | ks); // dot(ke[i], ks); - kgg[i] = (kg[i] | kg[i]); // dot(kg[i], kg[i]); - kgs[i] = (kg[i] | ks); // dot(kg[i], ks); - kss[i] = (ks | ks); // dot(ks, ks); - - float aa = kee * kss[i] - kes * kes; - float bb = 2 * (keg * kes - kee * kgs[i]); - float cc = kee * (kgg[i] - r * r) - keg * keg; - - float sign = (bb >= 0.0f) ? 1.0f : -1.0f; - float q = -0.5f * (bb + sign * std::sqrt(bb * bb - 4 * aa * cc)); - float t0 = q / aa; - float t1 = cc / q; - - float t; - if (t0 < 0.0f || t0 > 1.0f) - t = t1; - else if (t1 < 0.0f || t1 > 1.0f) - t = t0; - else - t = std::min(t0, t1); - - if (t >= 0.0f && t <= 1.0f) - { - FVector3 ct = c + ks * t; - float d = ((ct - p[i]) | ke[i]); // dot(ct - p[i], ke[i]); - if (d >= 0.0f && d <= kee) - return t; - } - } - - // Step 3: Point intersect test - - for (int i = 0; i < 3; i++) - { - float aa = kss[i]; - float bb = -2.0f * kgs[i]; - float cc = kgg[i] - r * r; - - float sign = (bb >= 0.0f) ? 1.0f : -1.0f; - float q = -0.5f * (bb + sign * std::sqrt(bb * bb - 4 * aa * cc)); - float t0 = q / aa; - float t1 = cc / q; - - float t; - if (t0 < 0.0f || t0 > 1.0f) - t = t1; - else if (t1 < 0.0f || t1 > 1.0f) - t = t0; - else - t = std::min(t0, t1); - - if (t >= 0.0f && t <= 1.0f) - return t; - } - - return 1.0f; -} - -bool TriangleMeshShape::overlap_bv(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b) -{ - return IntersectionTest::aabb(shape1->nodes[a].aabb, shape2->nodes[b].aabb) == IntersectionTest::overlap; -} - -bool TriangleMeshShape::overlap_bv_triangle(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b) -{ - return false; -} - -bool TriangleMeshShape::overlap_bv_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int a) -{ - return IntersectionTest::sphere_aabb(shape2->center, shape2->radius, shape1->nodes[a].aabb) == IntersectionTest::overlap; -} - -bool TriangleMeshShape::overlap_triangle_triangle(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b) -{ - return false; -} - -bool TriangleMeshShape::overlap_triangle_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int shape1_node_index) -{ - // http://realtimecollisiondetection.net/blog/?p=103 - - int element_index = shape1->nodes[shape1_node_index].element_index; - - FVector3 P = shape2->center; - FVector3 A = shape1->vertices[shape1->elements[element_index]].fPos() - P; - FVector3 B = shape1->vertices[shape1->elements[element_index + 1]].fPos() - P; - FVector3 C = shape1->vertices[shape1->elements[element_index + 2]].fPos() - P; - float r = shape2->radius; - float rr = r * r; - - // Testing if sphere lies outside the triangle plane - FVector3 V = ((B - A) ^ (C - A)); // cross(B - A, C - A); - float d = A | V; // dot(A, V); - float e = V | V; // dot(V, V); - bool sep1 = d * d > rr * e; - - // Testing if sphere lies outside a triangle vertex - float aa = A | A; // dot(A, A); - float ab = A | B; // dot(A, B); - float ac = A | C; // dot(A, C); - float bb = B | B; // dot(B, B); - float bc = B | C; // dot(B, C); - float cc = C | C; // dot(C, C); - bool sep2 = (aa > rr) && (ab > aa) && (ac > aa); - bool sep3 = (bb > rr) && (ab > bb) && (bc > bb); - bool sep4 = (cc > rr) && (ac > cc) && (bc > cc); - - // Testing if sphere lies outside a triangle edge - FVector3 AB = B - A; - FVector3 BC = C - B; - FVector3 CA = A - C; - float d1 = ab - aa; - float d2 = bc - bb; - float d3 = ac - cc; - float e1 = (AB | AB); // dot(AB, AB) - float e2 = (BC | BC); // dot(BC, BC) - float e3 = (CA | CA); // dot(CA, CA) - FVector3 Q1 = A * e1 - AB * d1; - FVector3 Q2 = B * e2 - BC * d2; - FVector3 Q3 = C * e3 - CA * d3; - FVector3 QC = C * e1 - Q1; - FVector3 QA = A * e2 - Q2; - FVector3 QB = B * e3 - Q3; - bool sep5 = ((Q1 | Q1) > rr * e1 * e1) && ((Q1 | QC) > 0.0f); // (dot(Q1, Q1) > rr * e1 * e1) && (dot(Q1, QC) > 0.0f); - bool sep6 = ((Q2 | Q2) > rr * e2 * e2) && ((Q2 | QA) > 0.0f); // (dot(Q2, Q2) > rr * e2 * e2) && (dot(Q2, QA) > 0.0f); - bool sep7 = ((Q3 | Q3) > rr * e3 * e3) && ((Q3 | QB) > 0.0f); // (dot(Q3, Q3) > rr * e3 * e3) && (dot(Q3, QB) > 0.0f); - - bool separated = sep1 || sep2 || sep3 || sep4 || sep5 || sep6 || sep7; - return (!separated); -} - -bool TriangleMeshShape::is_leaf(int node_index) -{ - return nodes[node_index].element_index != -1; -} - -float TriangleMeshShape::volume(int node_index) -{ - const FVector3 &extents = nodes[node_index].aabb.Extents; - return extents.X * extents.Y * extents.Z; -} - -int TriangleMeshShape::get_min_depth() const +int CPUBottomLevelAccelStruct::GetMinDepth() const { std::function visit; visit = [&](int level, int node_index) -> int { @@ -599,7 +494,7 @@ int TriangleMeshShape::get_min_depth() const return visit(1, root); } -int TriangleMeshShape::get_max_depth() const +int CPUBottomLevelAccelStruct::GetMaxDepth() const { std::function visit; visit = [&](int level, int node_index) -> int { @@ -612,7 +507,7 @@ int TriangleMeshShape::get_max_depth() const return visit(1, root); } -float TriangleMeshShape::get_average_depth() const +float CPUBottomLevelAccelStruct::GetAverageDepth() const { std::function visit; visit = [&](int level, int node_index) -> float { @@ -627,12 +522,12 @@ float TriangleMeshShape::get_average_depth() const return depth_sum / leaf_count; } -float TriangleMeshShape::get_balanced_depth() const +float CPUBottomLevelAccelStruct::GetBalancedDepth() const { return std::log2((float)(num_elements / 3)); } -int TriangleMeshShape::subdivide(int *triangles, int num_triangles, const FVector3 *centroids, int *work_buffer) +int CPUBottomLevelAccelStruct::Subdivide(int *triangles, int num_triangles, const FVector3 *centroids, int *work_buffer) { if (num_triangles == 0) return -1; @@ -738,9 +633,9 @@ int TriangleMeshShape::subdivide(int *triangles, int num_triangles, const FVecto int left_index = -1; int right_index = -1; if (left_count > 0) - left_index = subdivide(triangles, left_count, centroids, work_buffer); + left_index = Subdivide(triangles, left_count, centroids, work_buffer); if (right_count > 0) - right_index = subdivide(triangles + left_count, right_count, centroids, work_buffer); + right_index = Subdivide(triangles + left_count, right_count, centroids, work_buffer); nodes.push_back(Node(min, max, left_index, right_index)); return (int)nodes.size() - 1; @@ -748,38 +643,6 @@ int TriangleMeshShape::subdivide(int *triangles, int num_triangles, const FVecto ///////////////////////////////////////////////////////////////////////////// -IntersectionTest::OverlapResult IntersectionTest::sphere_aabb(const FVector3 ¢er, float radius, const CollisionBBox &aabb) -{ - FVector3 a = aabb.min - center; - FVector3 b = center - aabb.max; - a.X = std::max(a.X, 0.0f); - a.Y = std::max(a.Y, 0.0f); - a.Z = std::max(a.Z, 0.0f); - b.X = std::max(b.X, 0.0f); - b.Y = std::max(b.Y, 0.0f); - b.Z = std::max(b.Z, 0.0f); - FVector3 e = a + b; - float d = (e | e); // dot(e, e); - if (d > radius * radius) - return disjoint; - else - return overlap; -} - -IntersectionTest::OverlapResult IntersectionTest::aabb(const CollisionBBox& a, const CollisionBBox& b) -{ - if (a.min.X > b.max.X || b.min.X > a.max.X || - a.min.Y > b.max.Y || b.min.Y > a.max.Y || - a.min.Z > b.max.Z || b.min.Z > a.max.Z) - { - return disjoint; - } - else - { - return overlap; - } -} - static const uint32_t clearsignbitmask[] = { 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff }; IntersectionTest::OverlapResult IntersectionTest::ray_aabb(const RayBBox &ray, const CollisionBBox &aabb) diff --git a/src/common/rendering/hwrenderer/data/hw_collision.h b/src/common/rendering/hwrenderer/data/hw_collision.h index 911fe947e..a1860a6e5 100644 --- a/src/common/rendering/hwrenderer/data/hw_collision.h +++ b/src/common/rendering/hwrenderer/data/hw_collision.h @@ -26,16 +26,10 @@ #include "flatvertices.h" #include #include +#include -class SphereShape -{ -public: - SphereShape() { } - SphereShape(const FVector3 ¢er, float radius) : center(center), radius(radius) { } - - FVector3 center; - float radius = 0.0f; -}; +class LevelMesh; +class CPUBottomLevelAccelStruct; struct TraceHit { @@ -45,12 +39,24 @@ struct TraceHit float c = 0.0f; }; +struct CollisionNode +{ + FVector3 center; + float padding1; + FVector3 extents; + float padding2; + int left; + int right; + int element_index; + int padding3; +}; + class CollisionBBox { public: CollisionBBox() = default; - CollisionBBox(const FVector3 &aabb_min, const FVector3 &aabb_max) + CollisionBBox(const FVector3& aabb_min, const FVector3& aabb_max) { min = aabb_min; max = aabb_max; @@ -70,7 +76,7 @@ public: class RayBBox { public: - RayBBox(const FVector3 &ray_start, const FVector3 &ray_end) : start(ray_start), end(ray_end) + RayBBox(const FVector3& ray_start, const FVector3& ray_end) : start(ray_start), end(ray_end) { c = (ray_start + ray_end) * 0.5f; w = ray_end - c; @@ -84,27 +90,72 @@ public: float ssePadding = 0.0f; // Needed to safely load v directly into a sse register }; -class TriangleMeshShape +class AccelStructScratchBuffer { public: - TriangleMeshShape(const FFlatVertex *vertices, int num_vertices, const unsigned int *elements, int num_elements); + std::vector leafs; + std::vector centroids; + std::vector workbuffer; +}; - int get_min_depth() const; - int get_max_depth() const; - float get_average_depth() const; - float get_balanced_depth() const; +class CPUAccelStruct +{ +public: + CPUAccelStruct(LevelMesh* mesh); + ~CPUAccelStruct(); - const CollisionBBox &get_bbox() const { return nodes[root].aabb; } + void Update(); + TraceHit FindFirstHit(const FVector3& rayStart, const FVector3& rayEnd); - static float sweep(TriangleMeshShape *shape1, SphereShape *shape2, const FVector3 &target); +private: + void FindFirstHit(const RayBBox& ray, int a, TraceHit* hit); + void CreateTLAS(); + int Subdivide(int* instances, int numInstances, const FVector3* centroids, int* workBuffer); + std::unique_ptr CreateBLAS(int indexStart, int indexCount); + void Upload(); - static bool find_any_hit(TriangleMeshShape *shape1, TriangleMeshShape *shape2); - static bool find_any_hit(TriangleMeshShape *shape1, SphereShape *shape2); - static bool find_any_hit(TriangleMeshShape *shape, const FVector3 &ray_start, const FVector3 &ray_end); + LevelMesh* Mesh = nullptr; - static std::vector find_all_hits(TriangleMeshShape* shape1, SphereShape* shape2); + struct Node + { + Node() = default; + Node(const FVector3& aabb_min, const FVector3& aabb_max, int blas_index) : aabb(aabb_min, aabb_max), blas_index(blas_index) { } + Node(const FVector3& aabb_min, const FVector3& aabb_max, int left, int right) : aabb(aabb_min, aabb_max), left(left), right(right) { } - static TraceHit find_first_hit(TriangleMeshShape *shape, const FVector3 &ray_start, const FVector3 &ray_end); + bool IsLeaf() const { return blas_index != -1; } + + CollisionBBox aabb; + int left = -1; + int right = -1; + int blas_index = -1; + }; + + struct + { + std::vector Nodes; + int Root = 0; + } TLAS; + + std::vector> DynamicBLAS; + int IndexesPerBLAS = 0; + int InstanceCount = 0; + + AccelStructScratchBuffer Scratch; +}; + +class CPUBottomLevelAccelStruct +{ +public: + CPUBottomLevelAccelStruct(const FFlatVertex *vertices, int num_vertices, const unsigned int *elements, int num_elements, AccelStructScratchBuffer& scratch); + + int GetMinDepth() const; + int GetMaxDepth() const; + float GetAverageDepth() const; + float GetBalancedDepth() const; + + const CollisionBBox &GetBBox() const { return nodes[root].aabb; } + + TraceHit FindFirstHit(const FVector3 &ray_start, const FVector3 &ray_end); struct Node { @@ -112,14 +163,16 @@ public: Node(const FVector3 &aabb_min, const FVector3 &aabb_max, int element_index) : aabb(aabb_min, aabb_max), element_index(element_index) { } Node(const FVector3 &aabb_min, const FVector3 &aabb_max, int left, int right) : aabb(aabb_min, aabb_max), left(left), right(right) { } + bool IsLeaf() const { return element_index != -1; } + CollisionBBox aabb; int left = -1; int right = -1; int element_index = -1; }; - const std::vector& get_nodes() const { return nodes; } - int get_root() const { return root; } + const std::vector& GetNodes() const { return nodes; } + int GetRoot() const { return root; } private: const FFlatVertex* vertices = nullptr; @@ -130,51 +183,19 @@ private: std::vector nodes; int root = -1; - static float sweep(TriangleMeshShape *shape1, SphereShape *shape2, int a, const FVector3 &target); - - static bool find_any_hit(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b); - static bool find_any_hit(TriangleMeshShape *shape1, SphereShape *shape2, int a); - static bool find_any_hit(TriangleMeshShape *shape1, const RayBBox &ray, int a); - - static void find_all_hits(TriangleMeshShape* shape1, SphereShape* shape2, int a, std::vector& hits); - - static void find_first_hit(TriangleMeshShape *shape1, const RayBBox &ray, int a, TraceHit *hit); - - inline static bool overlap_bv_ray(TriangleMeshShape *shape, const RayBBox &ray, int a); - inline static float intersect_triangle_ray(TriangleMeshShape *shape, const RayBBox &ray, int a, float &barycentricB, float &barycentricC); - - inline static bool sweep_overlap_bv_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int a, const FVector3 &target); - inline static float sweep_intersect_triangle_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int a, const FVector3 &target); - - inline static bool overlap_bv(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b); - inline static bool overlap_bv_triangle(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b); - inline static bool overlap_bv_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int a); - inline static bool overlap_triangle_triangle(TriangleMeshShape *shape1, TriangleMeshShape *shape2, int a, int b); - inline static bool overlap_triangle_sphere(TriangleMeshShape *shape1, SphereShape *shape2, int a); - - inline bool is_leaf(int node_index); - inline float volume(int node_index); - - int subdivide(int *triangles, int num_triangles, const FVector3 *centroids, int *work_buffer); + void FindFirstHit(const RayBBox& ray, int a, TraceHit* hit); + float IntersectTriangleRay(const RayBBox &ray, int a, float &barycentricB, float &barycentricC); + int Subdivide(int *triangles, int num_triangles, const FVector3 *centroids, int *work_buffer); }; class IntersectionTest { public: - enum Result - { - outside, - inside, - intersecting, - }; - enum OverlapResult { disjoint, overlap }; - static OverlapResult sphere_aabb(const FVector3 ¢er, float radius, const CollisionBBox &aabb); - static OverlapResult aabb(const CollisionBBox &a, const CollisionBBox &b); static OverlapResult ray_aabb(const RayBBox &ray, const CollisionBBox &box); }; diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 0c1b0ad33..4ba833eef 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -16,9 +16,12 @@ LevelMesh::LevelMesh() Portals.Push(portal); AddEmptyMesh(); - UpdateCollision(); + CreateCollision(); +} - Mesh.MaxNodes = (int)std::max(Collision->get_nodes().size() * 2, (size_t)10000); +void LevelMesh::CreateCollision() +{ + Collision = std::make_unique(this); } void LevelMesh::Reset(const LevelMeshLimits& limits) @@ -92,7 +95,7 @@ LevelMeshSurface* LevelMesh::Trace(const FVector3& start, FVector3 direction, fl { FVector3 end = origin + direction * maxDist; - TraceHit hit = TriangleMeshShape::find_first_hit(Collision.get(), origin, end); + TraceHit hit = Collision->FindFirstHit(origin, end); if (hit.triangle < 0) { @@ -142,12 +145,6 @@ LevelMeshTileStats LevelMesh::GatherTilePixelStats() return stats; } -void LevelMesh::UpdateCollision() -{ - Collision = std::make_unique(Mesh.Vertices.Data(), Mesh.Vertices.Size(), Mesh.Indexes.Data(), Mesh.IndexCount); - UploadCollision(); -} - struct LevelMeshPlaneGroup { FVector4 plane = FVector4(0, 0, 1, 0); diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index f1d187a7d..ea4e77a01 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -143,7 +143,8 @@ public: TArray DrawIndexes; // GPU buffer size for collision nodes - int MaxNodes = 0; + TArray Nodes; + int RootNode = 0; } Mesh; // Ranges in mesh that have changed since last upload @@ -177,7 +178,7 @@ public: } FreeLists; // Data structure for doing mesh traces on the CPU - std::unique_ptr Collision; + std::unique_ptr Collision; // Draw index ranges for rendering the level mesh, grouped by pipeline std::unordered_map> DrawList[(int)LevelMeshDrawType::NumDrawTypes]; @@ -194,14 +195,13 @@ public: uint32_t AtlasPixelCount() const { return uint32_t(LMTextureCount * LMTextureSize * LMTextureSize); } - void UpdateCollision(); void SetupTileTransforms(); void PackLightmapAtlas(int lightmapStartIndex); void AddEmptyMesh(); void UploadPortals(); - void UploadCollision(); + void CreateCollision(); void AddRange(TArray& ranges, MeshBufferRange range); void RemoveRange(TArray& ranges, MeshBufferRange range); @@ -316,13 +316,6 @@ inline void LevelMesh::UploadPortals() AddRange(UploadRanges.Portals, { 0, (int)Portals.Size() }); } -inline void LevelMesh::UploadCollision() -{ - UploadRanges.Node.Clear(); - if (Collision) - UploadRanges.Node.Push({ 0, (int)Collision->get_nodes().size() }); -} - inline void LevelMesh::AddRange(TArray& ranges, MeshBufferRange range) { // Empty range? diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index 413cdff93..fc25f7f33 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -269,7 +269,7 @@ void VkLevelMesh::CreateBuffers() NodeBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT) - .Size(sizeof(CollisionNodeBufferHeader) + Mesh->Mesh.MaxNodes * sizeof(CollisionNode)) + .Size(sizeof(CollisionNodeBufferHeader) + Mesh->Mesh.Nodes.Size() * sizeof(CollisionNode)) .DebugName("NodeBuffer") .Create(fb->GetDevice()); @@ -789,7 +789,7 @@ void VkLevelMeshUploader::UploadNodes() if (Mesh->Mesh->UploadRanges.Node.Size() > 0) { CollisionNodeBufferHeader nodesHeader; - nodesHeader.root = Mesh->Mesh->Collision->get_root(); + nodesHeader.root = Mesh->Mesh->Mesh.RootNode; *((CollisionNodeBufferHeader*)(data + datapos)) = nodesHeader; copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, 0, sizeof(CollisionNodeBufferHeader)); @@ -800,21 +800,8 @@ void VkLevelMeshUploader::UploadNodes() // Copy collision nodes for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Node) { - const auto& srcnodes = Mesh->Mesh->Collision->get_nodes(); - CollisionNode* nodes = (CollisionNode*)(data + datapos); - for (int i = 0, count = range.Count(); i < count; i++) - { - const auto& node = srcnodes[range.Start + i]; - CollisionNode info; - info.center = SwapYZ(node.aabb.Center); - info.extents = SwapYZ(node.aabb.Extents); - info.left = node.left; - info.right = node.right; - info.element_index = node.element_index; - *(nodes++) = info; - } - size_t copysize = range.Count() * sizeof(CollisionNode); + memcpy(data + datapos, Mesh->Mesh->Mesh.Nodes.Data() + range.Start, copysize); if (copysize > 0) copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, sizeof(CollisionNodeBufferHeader) + range.Start * sizeof(CollisionNode), copysize); datapos += copysize; diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index 1a70de15f..05e61d2ac 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -18,18 +18,6 @@ struct CollisionNodeBufferHeader int padding3; }; -struct CollisionNode -{ - FVector3 center; - float padding1; - FVector3 extents; - float padding2; - int left; - int right; - int element_index; - int padding3; -}; - struct SurfaceInfo { FVector3 Normal; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index d85288331..4a35e5956 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -201,11 +201,8 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) for (unsigned int i = 0; i < Flats.Size(); i++) UpdateFlat(i, SurfaceUpdateType::Full); - UpdateCollision(); - Mesh.MaxNodes = std::max(Collision->get_nodes().size() * 2, (size_t)10000); - + CreateCollision(); UploadPortals(); - SortDrawLists(); r_viewpoint.extralight = oldextralight; @@ -295,6 +292,8 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) UploadDynLights(doomMap); + Collision->Update(); + r_viewpoint.extralight = oldextralight; r_viewpoint.camera = oldcamera; } From 1073bcfa6940ce425a3f2d08dc84e735e86052bd Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 21 Oct 2024 00:09:47 +0200 Subject: [PATCH 408/414] Fix TLAS bug --- src/common/rendering/hwrenderer/data/hw_collision.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_collision.cpp b/src/common/rendering/hwrenderer/data/hw_collision.cpp index 182a07c77..8ebc247d4 100644 --- a/src/common/rendering/hwrenderer/data/hw_collision.cpp +++ b/src/common/rendering/hwrenderer/data/hw_collision.cpp @@ -235,11 +235,11 @@ int CPUAccelStruct::Subdivide(int* instances, int numInstances, const FVector3* // Find bounding box and median of the instance centroids FVector3 median; - FVector3 min = DynamicBLAS[0]->GetBBox().min; - FVector3 max = DynamicBLAS[0]->GetBBox().max; + FVector3 min = DynamicBLAS[instances[0]]->GetBBox().min; + FVector3 max = DynamicBLAS[instances[0]]->GetBBox().max; for (int i = 0; i < numInstances; i++) { - const CollisionBBox& bbox = DynamicBLAS[i]->GetBBox(); + const CollisionBBox& bbox = DynamicBLAS[instances[i]]->GetBBox(); min.X = std::min(min.X, bbox.min.X); min.Y = std::min(min.Y, bbox.min.Y); From 8cbef52626e19f2c720ad739fb2baedafba7e9f6 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Mon, 21 Oct 2024 00:52:33 +0200 Subject: [PATCH 409/414] Fix typo making it rebuild every BLAS if level changes --- src/common/rendering/hwrenderer/data/hw_collision.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/rendering/hwrenderer/data/hw_collision.cpp b/src/common/rendering/hwrenderer/data/hw_collision.cpp index 8ebc247d4..d6b676f56 100644 --- a/src/common/rendering/hwrenderer/data/hw_collision.cpp +++ b/src/common/rendering/hwrenderer/data/hw_collision.cpp @@ -104,7 +104,7 @@ void CPUAccelStruct::Update() for (int instance = 0; instance < InstanceCount; instance++) { - if (needsUpdate) + if (needsUpdate[instance]) { int indexStart = instance * IndexesPerBLAS; int indexEnd = std::min(indexStart + IndexesPerBLAS, Mesh->Mesh.IndexCount); From 9bf6e60021308d714ca1c01061fd6712a18971f0 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Mon, 21 Oct 2024 01:38:23 +0200 Subject: [PATCH 410/414] Fix TLAS to BLAS links not pointing at the root node of the BLAS --- src/common/rendering/hwrenderer/data/hw_collision.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_collision.cpp b/src/common/rendering/hwrenderer/data/hw_collision.cpp index d6b676f56..1acd2738c 100644 --- a/src/common/rendering/hwrenderer/data/hw_collision.cpp +++ b/src/common/rendering/hwrenderer/data/hw_collision.cpp @@ -184,7 +184,8 @@ void CPUAccelStruct::Upload() if (node.left != -1 && TLAS.Nodes[node.left].blas_index != -1) { - info.left = blasOffsets[TLAS.Nodes[node.left].blas_index]; + int blas_index = TLAS.Nodes[node.left].blas_index; + info.left = blasOffsets[blas_index] + DynamicBLAS[blas_index]->GetRoot(); } else { @@ -193,7 +194,8 @@ void CPUAccelStruct::Upload() if (node.right != -1 && TLAS.Nodes[node.right].blas_index != -1) { - info.right = blasOffsets[TLAS.Nodes[node.right].blas_index]; + int blas_index = TLAS.Nodes[node.right].blas_index; + info.right = blasOffsets[blas_index] + DynamicBLAS[blas_index]->GetRoot(); } else { From e7c271619179423f1ab0ec1b77f7be3362552435 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Mon, 21 Oct 2024 02:03:09 +0200 Subject: [PATCH 411/414] Remove old node header node from upload code --- src/common/rendering/vulkan/vk_levelmesh.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index fc25f7f33..95cb185e8 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -782,20 +782,15 @@ static FVector3 SwapYZ(const FVector3& v) void VkLevelMeshUploader::UploadNodes() { - if (Mesh->useRayQuery) + if (Mesh->useRayQuery || Mesh->Mesh->UploadRanges.Node.Size() == 0) return; // Always update the header struct of the collision storage buffer block if something changed - if (Mesh->Mesh->UploadRanges.Node.Size() > 0) - { - CollisionNodeBufferHeader nodesHeader; - nodesHeader.root = Mesh->Mesh->Mesh.RootNode; - - *((CollisionNodeBufferHeader*)(data + datapos)) = nodesHeader; - copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, 0, sizeof(CollisionNodeBufferHeader)); - - datapos += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); - } + CollisionNodeBufferHeader nodesHeader; + nodesHeader.root = Mesh->Mesh->Mesh.RootNode; + *((CollisionNodeBufferHeader*)(data + datapos)) = nodesHeader; + copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, 0, sizeof(CollisionNodeBufferHeader)); + datapos += sizeof(CollisionNodeBufferHeader); // Copy collision nodes for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Node) @@ -942,7 +937,7 @@ size_t VkLevelMeshUploader::GetTransferSize() size_t transferBufferSize = 0; if (!Mesh->useRayQuery) { - if (Mesh->Mesh->UploadRanges.Node.Size() > 0) transferBufferSize += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); + if (Mesh->Mesh->UploadRanges.Node.Size() > 0) transferBufferSize += sizeof(CollisionNodeBufferHeader); for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Node) transferBufferSize += range.Count() * sizeof(CollisionNode); } for (const MeshBufferRange& range : Mesh->Mesh->UploadRanges.Vertex) transferBufferSize += range.Count() * sizeof(FFlatVertex); From c866937262db4e148b840652f9e9ac4a1f2ae682 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 21 Oct 2024 20:50:25 +0200 Subject: [PATCH 412/414] Fix upload bug and skip upload when RT cores are available --- src/common/rendering/hwrenderer/data/hw_collision.cpp | 10 ++++++---- src/common/rendering/v_video.h | 1 + src/common/rendering/vulkan/vk_renderdevice.h | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_collision.cpp b/src/common/rendering/hwrenderer/data/hw_collision.cpp index 1acd2738c..9f29dbabb 100644 --- a/src/common/rendering/hwrenderer/data/hw_collision.cpp +++ b/src/common/rendering/hwrenderer/data/hw_collision.cpp @@ -22,6 +22,7 @@ #include "hw_collision.h" #include "hw_levelmesh.h" +#include "v_video.h" #include #include #include @@ -128,7 +129,8 @@ static FVector3 SwapYZ(const FVector3& v) void CPUAccelStruct::Upload() { - // To do: don't bother with this if rayquery is available as it won't be used + if (screen->IsRayQueryEnabled()) + return; unsigned int count = (unsigned int)TLAS.Nodes.size(); for (auto& blas : DynamicBLAS) @@ -165,9 +167,9 @@ void CPUAccelStruct::Upload() CollisionNode& info = destnodes[offset]; info.center = SwapYZ(node.aabb.Center); info.extents = SwapYZ(node.aabb.Extents); - info.left = blasStart + node.left; - info.right = blasStart + node.right; - info.element_index = indexStart + node.element_index; + info.left = node.left != -1 ? blasStart + node.left : -1; + info.right = node.right != -1 ? blasStart + node.right : -1; + info.element_index = node.element_index != -1 ? indexStart + node.element_index : -1; offset++; } instance++; diff --git a/src/common/rendering/v_video.h b/src/common/rendering/v_video.h index 1a34170a0..c3971c8c4 100644 --- a/src/common/rendering/v_video.h +++ b/src/common/rendering/v_video.h @@ -136,6 +136,7 @@ public: virtual void InitializeState() = 0; // For stuff that needs 'screen' set. virtual bool IsVulkan() { return false; } virtual bool IsPoly() { return false; } + virtual bool IsRayQueryEnabled() const { return false; } virtual bool CompileNextShader() { return true; } virtual void SetLevelMesh(LevelMesh *mesh) { } virtual void UpdateLightmaps(const TArray& tiles) {} diff --git a/src/common/rendering/vulkan/vk_renderdevice.h b/src/common/rendering/vulkan/vk_renderdevice.h index df2868c07..07859ed06 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.h +++ b/src/common/rendering/vulkan/vk_renderdevice.h @@ -47,7 +47,7 @@ public: VkRenderBuffers *GetBuffers() { return mActiveRenderBuffers; } FRenderState* RenderState() override; - bool IsRayQueryEnabled() const { return mUseRayQuery; } + bool IsRayQueryEnabled() const override { return mUseRayQuery; } bool IsVulkan() override { return true; } void Update() override; From dfbef085e63c3cd18a68bf4adbbb419978455d34 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Tue, 22 Oct 2024 02:29:12 +0200 Subject: [PATCH 413/414] Group lightmap variables and put polyobj walls in a dynamic lightmap atlas --- .../hwrenderer/data/hw_levelmesh.cpp | 116 +++++++++--------- .../rendering/hwrenderer/data/hw_levelmesh.h | 31 ++--- .../rendering/vulkan/vk_renderdevice.cpp | 4 +- src/maploader/maploader.cpp | 22 ++-- src/rendering/hwrenderer/doom_levelmesh.cpp | 73 +++++++---- src/rendering/hwrenderer/hw_vertexbuilder.cpp | 4 +- src/rendering/hwrenderer/scene/hw_decal.cpp | 8 +- .../hwrenderer/scene/hw_drawinfo.cpp | 2 +- src/rendering/hwrenderer/scene/hw_drawinfo.h | 8 +- .../hwrenderer/scene/hw_walls_vertex.cpp | 10 +- 10 files changed, 149 insertions(+), 129 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 4ba833eef..5cf31b846 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -129,7 +129,7 @@ LevelMeshSurface* LevelMesh::Trace(const FVector3& start, FVector3 direction, fl LevelMeshTileStats LevelMesh::GatherTilePixelStats() { LevelMeshTileStats stats; - for (const LightmapTile& tile : LightmapTiles) + for (const LightmapTile& tile : Lightmap.Tiles) { auto area = tile.AtlasLocation.Area(); @@ -141,7 +141,7 @@ LevelMeshTileStats LevelMesh::GatherTilePixelStats() stats.pixels.dirty += area; } } - stats.tiles.total += LightmapTiles.Size(); + stats.tiles.total += Lightmap.Tiles.Size(); return stats; } @@ -152,40 +152,36 @@ struct LevelMeshPlaneGroup std::vector surfaces; }; -void LevelMesh::SetupTileTransforms() +void LevelMesh::PackStaticLightmapAtlas() { - for (auto& tile : LightmapTiles) - { - tile.SetupTileTransform(LMTextureSize); - } -} + Lightmap.StaticAtlasPacked = true; + Lightmap.DynamicTilesStart = Lightmap.Tiles.Size(); -void LevelMesh::PackLightmapAtlas(int lightmapStartIndex) -{ - LMAtlasPacked = true; + for (auto& tile : Lightmap.Tiles) + { + if (tile.NeedsUpdate) // false for tiles loaded from lump + tile.SetupTileTransform(Lightmap.TextureSize); + } std::vector sortedTiles; - sortedTiles.reserve(LightmapTiles.Size()); - - for (auto& tile : LightmapTiles) - { + sortedTiles.reserve(Lightmap.Tiles.Size()); + for (auto& tile : Lightmap.Tiles) sortedTiles.push_back(&tile); - } std::sort(sortedTiles.begin(), sortedTiles.end(), [](LightmapTile* a, LightmapTile* b) { return a->AtlasLocation.Height != b->AtlasLocation.Height ? a->AtlasLocation.Height > b->AtlasLocation.Height : a->AtlasLocation.Width > b->AtlasLocation.Width; }); // We do not need to add spacing here as this is already built into the tile size itself. - RectPacker packer(LMTextureSize, LMTextureSize, RectPacker::Spacing(0), RectPacker::Padding(0)); + RectPacker packer(Lightmap.TextureSize, Lightmap.TextureSize, RectPacker::Spacing(0), RectPacker::Padding(0)); for (LightmapTile* tile : sortedTiles) { auto result = packer.insert(tile->AtlasLocation.Width, tile->AtlasLocation.Height); tile->AtlasLocation.X = result.pos.x; tile->AtlasLocation.Y = result.pos.y; - tile->AtlasLocation.ArrayIndex = lightmapStartIndex + (int)result.pageIndex; + tile->AtlasLocation.ArrayIndex = (int)result.pageIndex; } - LMTextureCount = (int)packer.getNumPages(); + Lightmap.TextureCount = (int)packer.getNumPages(); // Calculate final texture coordinates for (int i = 0, count = Mesh.Surfaces.Size(); i < count; i++) @@ -193,61 +189,67 @@ void LevelMesh::PackLightmapAtlas(int lightmapStartIndex) auto surface = &Mesh.Surfaces[i]; if (surface->LightmapTileIndex >= 0) { - const LightmapTile& tile = LightmapTiles[surface->LightmapTileIndex]; + const LightmapTile& tile = Lightmap.Tiles[surface->LightmapTileIndex]; for (int i = 0; i < surface->MeshLocation.NumVerts; i++) { auto& vertex = Mesh.Vertices[surface->MeshLocation.StartVertIndex + i]; - FVector2 uv = tile.ToUV(vertex.fPos(), (float)LMTextureSize); + FVector2 uv = tile.ToUV(vertex.fPos(), (float)Lightmap.TextureSize); vertex.lu = uv.X; vertex.lv = uv.Y; vertex.lindex = (float)tile.AtlasLocation.ArrayIndex; } } } +} -#if 0 // Debug atlas tile locations: - float colors[30] = +void LevelMesh::ClearDynamicLightmapAtlas() +{ + for (int surfIndex : Lightmap.DynamicSurfaces) { - 1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 1.0f, 1.0f, 0.0f, - 0.0f, 1.0f, 1.0f, - 1.0f, 0.0f, 1.0f, - 0.5f, 0.0f, 0.0f, - 0.0f, 0.5f, 0.0f, - 0.5f, 0.5f, 0.0f, - 0.0f, 0.5f, 0.5f, - 0.5f, 0.0f, 0.5f - }; - LMTextureData.Resize(LMTextureSize * LMTextureSize * LMTextureCount * 3); - uint16_t* pixels = LMTextureData.Data(); - for (LightmapTile& tile : LightmapTiles) + Mesh.Surfaces[surfIndex].LightmapTileIndex = -1; + } + Lightmap.DynamicSurfaces.Clear(); + Lightmap.Tiles.Resize(Lightmap.DynamicTilesStart); +} + +void LevelMesh::PackDynamicLightmapAtlas() +{ + std::vector sortedTiles; + sortedTiles.reserve(Lightmap.Tiles.Size() - Lightmap.DynamicTilesStart); + + for (unsigned int i = Lightmap.DynamicTilesStart; i < Lightmap.Tiles.Size(); i++) { - tile.NeedsUpdate = false; + Lightmap.Tiles[i].SetupTileTransform(Lightmap.TextureSize); + sortedTiles.push_back(&Lightmap.Tiles[i]); + } - int index = tile.Binding.TypeIndex; - float* color = colors + (index % 10) * 3; + std::sort(sortedTiles.begin(), sortedTiles.end(), [](LightmapTile* a, LightmapTile* b) { return a->AtlasLocation.Height != b->AtlasLocation.Height ? a->AtlasLocation.Height > b->AtlasLocation.Height : a->AtlasLocation.Width > b->AtlasLocation.Width; }); - int x = tile.AtlasLocation.X; - int y = tile.AtlasLocation.Y; - int w = tile.AtlasLocation.Width; - int h = tile.AtlasLocation.Height; - for (int yy = y; yy < y + h; yy++) + // We do not need to add spacing here as this is already built into the tile size itself. + RectPacker packer(Lightmap.TextureSize, Lightmap.TextureSize, RectPacker::Spacing(0), RectPacker::Padding(0)); + + for (LightmapTile* tile : sortedTiles) + { + auto result = packer.insert(tile->AtlasLocation.Width, tile->AtlasLocation.Height); + tile->AtlasLocation.X = result.pos.x; + tile->AtlasLocation.Y = result.pos.y; + tile->AtlasLocation.ArrayIndex = Lightmap.TextureCount; // (int)result.pageIndex; + } + + for (int surfIndex : Lightmap.DynamicSurfaces) + { + auto surface = &Mesh.Surfaces[surfIndex]; + if (surface->LightmapTileIndex >= 0) { - uint16_t* line = pixels + tile.AtlasLocation.ArrayIndex * LMTextureSize * LMTextureSize + yy * LMTextureSize * 3; - for (int xx = x; xx < x + w; xx++) + const LightmapTile& tile = Lightmap.Tiles[surface->LightmapTileIndex]; + for (int i = 0; i < surface->MeshLocation.NumVerts; i++) { - float gray = (yy - y) / (float)h; - line[xx * 3] = floatToHalf(color[0] * gray); - line[xx * 3 + 1] = floatToHalf(color[1] * gray); - line[xx * 3 + 2] = floatToHalf(color[2] * gray); + auto& vertex = Mesh.Vertices[surface->MeshLocation.StartVertIndex + i]; + FVector2 uv = tile.ToUV(vertex.fPos(), (float)Lightmap.TextureSize); + vertex.lu = uv.X; + vertex.lv = uv.Y; + vertex.lindex = (float)tile.AtlasLocation.ArrayIndex; } } } - for (int i = 0, count = GetSurfaceCount(); i < count; i++) - { - auto surface = GetSurface(i); - surface->AlwaysUpdate = false; - } -#endif } diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index ea4e77a01..d06442a9b 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -142,7 +142,7 @@ public: // Indexes sorted by pipeline TArray DrawIndexes; - // GPU buffer size for collision nodes + // Acceleration structure nodes for when the GPU doesn't support rayquery TArray Nodes; int RootNode = 0; } Mesh; @@ -183,20 +183,23 @@ public: // Draw index ranges for rendering the level mesh, grouped by pipeline std::unordered_map> DrawList[(int)LevelMeshDrawType::NumDrawTypes]; - // Lightmap atlas - int LMTextureCount = 0; - int LMTextureSize = 1024; - TArray LMTextureData; + // Lightmap tiles and their locations in the texture atlas + struct + { + int TextureCount = 0; + int TextureSize = 1024; + TArray TextureData; + uint16_t SampleDistance = 8; + TArray Tiles; + bool StaticAtlasPacked = false; + int DynamicTilesStart = 0; + TArray DynamicSurfaces; + } Lightmap; - uint16_t LightmapSampleDistance = 8; - - TArray LightmapTiles; - bool LMAtlasPacked = false; // Tile sizes can't be changed anymore - - uint32_t AtlasPixelCount() const { return uint32_t(LMTextureCount * LMTextureSize * LMTextureSize); } - - void SetupTileTransforms(); - void PackLightmapAtlas(int lightmapStartIndex); + uint32_t AtlasPixelCount() const { return uint32_t(Lightmap.TextureCount * Lightmap.TextureSize * Lightmap.TextureSize); } + void PackStaticLightmapAtlas(); + void ClearDynamicLightmapAtlas(); + void PackDynamicLightmapAtlas(); void AddEmptyMesh(); diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index c4f9f485a..d26232adf 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -522,9 +522,9 @@ void VulkanRenderDevice::BeginFrame() levelMeshChanged = false; mLevelMesh->SetLevelMesh(levelMesh); - if (levelMesh && levelMesh->LMTextureCount > 0) + if (levelMesh && levelMesh->Lightmap.TextureCount > 0) { - GetTextureManager()->CreateLightmap(levelMesh->LMTextureSize, levelMesh->LMTextureCount, std::move(levelMesh->LMTextureData)); + GetTextureManager()->CreateLightmap(levelMesh->Lightmap.TextureSize, levelMesh->Lightmap.TextureCount, std::move(levelMesh->Lightmap.TextureData)); GetLightmapper()->SetLevelMesh(levelMesh); } } diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 3ea84000c..914274271 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3018,8 +3018,7 @@ void MapLoader::InitLevelMesh(MapData* map) { if (Level->lightmaps) { - Level->levelMesh->SetupTileTransforms(); - Level->levelMesh->PackLightmapAtlas(0); + Level->levelMesh->PackStaticLightmapAtlas(); } } } @@ -3101,11 +3100,11 @@ bool MapLoader::LoadLightmap(MapData* map) uint8_t* data = (uint8_t*)&textureData[0]; fr.Read(data, numTexPixels * 3 * sizeof(uint16_t)); - const auto textureSize = Level->levelMesh->LMTextureSize; + const auto textureSize = Level->levelMesh->Lightmap.TextureSize; // Create lookup for finding tiles std::map levelTiles; - for (LightmapTile& tile : Level->levelMesh->LightmapTiles) + for (LightmapTile& tile : Level->levelMesh->Lightmap.Tiles) { levelTiles[tile.Binding] = &tile; } @@ -3147,19 +3146,12 @@ bool MapLoader::LoadLightmap(MapData* map) foundBindings.Push({ &entry, tile }); } - // Setup the tile transform for any tile missing in the lump (shouldn't be any, but if there are we let the lightmapper bake them) - for (auto& tile : Level->levelMesh->LightmapTiles) - { - if (tile.NeedsUpdate) - tile.SetupTileTransform(Level->levelMesh->LMTextureSize); - } - // Place all tiles in atlas textures - Level->levelMesh->PackLightmapAtlas(0); + Level->levelMesh->PackStaticLightmapAtlas(); // Start with empty lightmap textures - Level->levelMesh->LMTextureData.Resize(Level->levelMesh->LMTextureCount * textureSize * textureSize * 3); - memset(Level->levelMesh->LMTextureData.Data(), 0, Level->levelMesh->LMTextureData.Size() * sizeof(uint16_t)); + Level->levelMesh->Lightmap.TextureData.Resize(Level->levelMesh->Lightmap.TextureCount * textureSize * textureSize * 3); + memset(Level->levelMesh->Lightmap.TextureData.Data(), 0, Level->levelMesh->Lightmap.TextureData.Size() * sizeof(uint16_t)); // Copy tile pixels to the texture for (auto& binding : foundBindings) @@ -3168,7 +3160,7 @@ bool MapLoader::LoadLightmap(MapData* map) LightmapTile* tile = binding.second; const uint16_t* src = textureData.Data() + entry->pixelsOffset; - uint16_t* dst = &Level->levelMesh->LMTextureData[tile->AtlasLocation.ArrayIndex * textureSize * textureSize * 3]; + uint16_t* dst = &Level->levelMesh->Lightmap.TextureData[tile->AtlasLocation.ArrayIndex * textureSize * textureSize * 3]; int destx = tile->AtlasLocation.X; int desty = tile->AtlasLocation.Y; int width = tile->AtlasLocation.Width; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 4a35e5956..060a9116c 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -85,13 +85,13 @@ CCMD(invalidatelightmap) if (!RequireLightmap()) return; int count = 0; - for (auto& tile : level.levelMesh->LightmapTiles) + for (auto& tile : level.levelMesh->Lightmap.Tiles) { if (!tile.NeedsUpdate) ++count; tile.NeedsUpdate = true; } - Printf("Marked %d out of %d tiles for update.\n", count, level.levelMesh->LightmapTiles.Size()); + Printf("Marked %d out of %d tiles for update.\n", count, level.levelMesh->Lightmap.Tiles.Size()); } CCMD(savelightmap) @@ -120,7 +120,7 @@ void DoomLevelMesh::PrintSurfaceInfo(const LevelMeshSurface* surface) Printf("Surface %d (%p)\n Type: %d, TypeIndex: %d, ControlSector: %d\n", surfaceIndex, surface, info.Type, info.TypeIndex, info.ControlSector ? info.ControlSector->Index() : -1); if (surface->LightmapTileIndex >= 0) { - LightmapTile* tile = &LightmapTiles[surface->LightmapTileIndex]; + LightmapTile* tile = &Lightmap.Tiles[surface->LightmapTileIndex]; Printf(" Atlas page: %d, x:%d, y:%d\n", tile->AtlasLocation.ArrayIndex, tile->AtlasLocation.X, tile->AtlasLocation.Y); Printf(" Pixels: %dx%d (area: %d)\n", tile->AtlasLocation.Width, tile->AtlasLocation.Height, tile->AtlasLocation.Area()); Printf(" Sample dimension: %d\n", tile->SampleDimension); @@ -181,7 +181,7 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) SunColor = doomMap.SunColor; // TODO keep only one copy? SunDirection = doomMap.SunDirection; - LightmapSampleDistance = doomMap.LightmapSampleDistance; + Lightmap.SampleDistance = doomMap.LightmapSampleDistance; // HWWall and HWFlat still looks at r_viewpoint when doing calculations, // but we aren't rendering a specific viewpoint when this function gets called @@ -254,7 +254,8 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) r_viewpoint.extralight = 0; r_viewpoint.camera = nullptr; - // To do: we don't need to always do this. UpdateLevelMesh should tell us when polyobjs move. + ClearDynamicLightmapAtlas(); + for (side_t* side : PolySides) { UpdateSide(side->Index(), SurfaceUpdateType::Full); @@ -288,8 +289,8 @@ void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap) } FlatUpdateList.Clear(); + PackDynamicLightmapAtlas(); UpdateWallPortals(); - UploadDynLights(doomMap); Collision->Update(); @@ -1020,10 +1021,32 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh sinfo.Surface->PortalIndex = (drawType == LevelMeshDrawType::Portal) ? linePortals[side->linedef->Index()] : 0; sinfo.Surface->IsSky = (drawType == LevelMeshDrawType::Portal) ? (wallpart.portaltype == PORTALTYPE_SKY || wallpart.portaltype == PORTALTYPE_SKYBOX || wallpart.portaltype == PORTALTYPE_HORIZON) : false; sinfo.Surface->Bounds = GetBoundsFromSurface(*sinfo.Surface); - sinfo.Surface->LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, *sinfo.Surface, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; sinfo.Surface->LightList.Pos = lightlist.Start; sinfo.Surface->LightList.Count = lightlist.Count; + if (side->Flags & WALLF_POLYOBJ) // Polyobjects gets a new tile every frame + { + LightmapTileBinding binding; + binding.Type = info.Type; + binding.TypeIndex = info.TypeIndex; + binding.ControlSector = info.ControlSector ? info.ControlSector->Index() : (int)0xffffffffUL; + + LightmapTile tile; + tile.Binding = binding; + tile.Bounds = sinfo.Surface->Bounds; + tile.Plane = sinfo.Surface->Plane; + tile.SampleDimension = GetSampleDimension(sampleDimension); + tile.AlwaysUpdate = true; + + sinfo.Surface->LightmapTileIndex = Lightmap.Tiles.Size(); + Lightmap.Tiles.Push(tile); + Lightmap.DynamicSurfaces.Push(sinfo.Index); + } + else + { + sinfo.Surface->LightmapTileIndex = disp.Level->lightmaps ? AddSurfaceToTile(info, *sinfo.Surface, sampleDimension, !!(side->sector->Flags & SECF_LM_DYNAMIC)) : -1; + } + SetSideLightmap(sinfo.Index); for (int i = ginfo.IndexStart / 3, end = (ginfo.IndexStart + ginfo.IndexCount) / 3; i < end; i++) @@ -1129,9 +1152,9 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMesh { int index = it->second; - if (!LMAtlasPacked) + if (!Lightmap.StaticAtlasPacked) { - LightmapTile& tile = LightmapTiles[index]; + LightmapTile& tile = Lightmap.Tiles[index]; tile.Bounds.min.X = std::min(tile.Bounds.min.X, surf.Bounds.min.X); tile.Bounds.min.Y = std::min(tile.Bounds.min.Y, surf.Bounds.min.Y); tile.Bounds.min.Z = std::min(tile.Bounds.min.Z, surf.Bounds.min.Z); @@ -1145,10 +1168,10 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMesh } else { - if (LMAtlasPacked) + if (Lightmap.StaticAtlasPacked) return -1; - int index = LightmapTiles.Size(); + int index = Lightmap.Tiles.Size(); LightmapTile tile; tile.Binding = binding; @@ -1157,7 +1180,7 @@ int DoomLevelMesh::AddSurfaceToTile(const DoomSurfaceInfo& info, const LevelMesh tile.SampleDimension = GetSampleDimension(sampleDimension); tile.AlwaysUpdate = alwaysUpdate; - LightmapTiles.Push(tile); + Lightmap.Tiles.Push(tile); bindings[binding] = index; return index; } @@ -1167,7 +1190,7 @@ int DoomLevelMesh::GetSampleDimension(uint16_t sampleDimension) { if (sampleDimension <= 0) { - sampleDimension = LightmapSampleDistance; + sampleDimension = Lightmap.SampleDistance; } sampleDimension = uint16_t(max(int(roundf(float(sampleDimension) / max(1.0f / 4, float(lm_scale)))), 1)); @@ -1569,7 +1592,7 @@ void DoomLevelMesh::DumpMesh(const FString& objFilename, const FString& mtlFilen if (surface.LightmapTileIndex >= 0) { - auto& tile = LightmapTiles[surface.LightmapTileIndex]; + auto& tile = Lightmap.Tiles[surface.LightmapTileIndex]; fprintf(f, "usemtl lightmap%d\n", tile.AtlasLocation.ArrayIndex); if (tile.AtlasLocation.ArrayIndex > highestUsedAtlasPage) @@ -1960,19 +1983,19 @@ void DoomLevelMesh::SaveLightmapLump(FLevelLocals& doomMap) }; */ - LMTextureData.Resize(LMTextureSize * LMTextureSize * LMTextureCount * 4); - for (int arrayIndex = 0; arrayIndex < LMTextureCount; arrayIndex++) + Lightmap.TextureData.Resize(Lightmap.TextureSize * Lightmap.TextureSize * Lightmap.TextureCount * 4); + for (int arrayIndex = 0; arrayIndex < Lightmap.TextureCount; arrayIndex++) { - screen->DownloadLightmap(arrayIndex, LMTextureData.Data() + arrayIndex * LMTextureSize * LMTextureSize * 4); + screen->DownloadLightmap(arrayIndex, Lightmap.TextureData.Data() + arrayIndex * Lightmap.TextureSize * Lightmap.TextureSize * 4); } // Calculate size of lump uint32_t tileCount = 0; uint32_t pixelCount = 0; - for (unsigned int i = 0; i < LightmapTiles.Size(); i++) + for (unsigned int i = 0; i < Lightmap.Tiles.Size(); i++) { - LightmapTile* tile = &LightmapTiles[i]; + LightmapTile* tile = &Lightmap.Tiles[i]; if (tile->AtlasLocation.ArrayIndex != -1) { tileCount++; @@ -1998,9 +2021,9 @@ void DoomLevelMesh::SaveLightmapLump(FLevelLocals& doomMap) // Write tiles uint32_t pixelsOffset = 0; - for (unsigned int i = 0; i < LightmapTiles.Size(); i++) + for (unsigned int i = 0; i < Lightmap.Tiles.Size(); i++) { - LightmapTile* tile = &LightmapTiles[i]; + LightmapTile* tile = &Lightmap.Tiles[i]; if (tile->AtlasLocation.ArrayIndex == -1) continue; @@ -2030,19 +2053,19 @@ void DoomLevelMesh::SaveLightmapLump(FLevelLocals& doomMap) } // Write surface pixels - for (unsigned int i = 0; i < LightmapTiles.Size(); i++) + for (unsigned int i = 0; i < Lightmap.Tiles.Size(); i++) { - LightmapTile* tile = &LightmapTiles[i]; + LightmapTile* tile = &Lightmap.Tiles[i]; if (tile->AtlasLocation.ArrayIndex == -1) continue; - const uint16_t* pixels = LMTextureData.Data() + tile->AtlasLocation.ArrayIndex * LMTextureSize * LMTextureSize * 4; + const uint16_t* pixels = Lightmap.TextureData.Data() + tile->AtlasLocation.ArrayIndex * Lightmap.TextureSize * Lightmap.TextureSize * 4; int width = tile->AtlasLocation.Width; int height = tile->AtlasLocation.Height; for (int y = 0; y < height; y++) { - const uint16_t* srcline = pixels + (tile->AtlasLocation.X + (tile->AtlasLocation.Y + y) * LMTextureSize) * 4; + const uint16_t* srcline = pixels + (tile->AtlasLocation.X + (tile->AtlasLocation.Y + y) * Lightmap.TextureSize) * 4; for (int x = 0; x < width; x++) { lumpFile.Write16(*(srcline++)); diff --git a/src/rendering/hwrenderer/hw_vertexbuilder.cpp b/src/rendering/hwrenderer/hw_vertexbuilder.cpp index 8db2dacee..03f9b569e 100644 --- a/src/rendering/hwrenderer/hw_vertexbuilder.cpp +++ b/src/rendering/hwrenderer/hw_vertexbuilder.cpp @@ -246,8 +246,8 @@ static int CreateIndexedSectorVerticesLM(sector_t* sec, const secplane_t& plane, int lightmap = sub->LightmapTiles[h].Size() > lightmapIndex ? sub->LightmapTiles[h][lightmapIndex] : -1; if (lightmap >= 0) // tile may be missing if the subsector is degenerate triangle { - const auto& tile = level.levelMesh->LightmapTiles[lightmap]; - float textureSize = (float)level.levelMesh->LMTextureSize; + const auto& tile = level.levelMesh->Lightmap.Tiles[lightmap]; + float textureSize = (float)level.levelMesh->Lightmap.TextureSize; float lindex = (float)tile.AtlasLocation.ArrayIndex; for (unsigned int j = 0, end = sub->numlines; j < end; j++) { diff --git a/src/rendering/hwrenderer/scene/hw_decal.cpp b/src/rendering/hwrenderer/scene/hw_decal.cpp index d7b358bf5..90dc5946a 100644 --- a/src/rendering/hwrenderer/scene/hw_decal.cpp +++ b/src/rendering/hwrenderer/scene/hw_decal.cpp @@ -427,12 +427,12 @@ void HWWall::ProcessDecal(HWDrawInfo* di, FRenderState& state, DBaseDecal *decal if (!(decal->RenderFlags & RF_FULLBRIGHT) && lightmaptile >= 0) { - LightmapTile* tile = &di->Level->levelMesh->LightmapTiles[lightmaptile]; + LightmapTile* tile = &di->Level->levelMesh->Lightmap.Tiles[lightmaptile]; float lightmapindex = (float)tile->AtlasLocation.ArrayIndex; for (i = 0; i < 4; i++) { - FVector2 lightmapuv = tile->ToUV(FVector3(dv[i].x, dv[i].y, dv[i].z), di->Level->levelMesh->LMTextureSize); + FVector2 lightmapuv = tile->ToUV(FVector3(dv[i].x, dv[i].y, dv[i].z), di->Level->levelMesh->Lightmap.TextureSize); verts.first[i].Set(dv[i].x, dv[i].z, dv[i].y, dv[i].u, dv[i].v, lightmapuv.X, lightmapuv.Y, lightmapindex); } } @@ -680,12 +680,12 @@ void HWDecalCreateInfo::ProcessDecal(HWDrawInfo* di, FRenderState& state, int dy if (!(decal->RenderFlags & RF_FULLBRIGHT) && lightmaptile >= 0) { - LightmapTile* tile = &di->Level->levelMesh->LightmapTiles[lightmaptile]; + LightmapTile* tile = &di->Level->levelMesh->Lightmap.Tiles[lightmaptile]; float lightmapindex = (float)tile->AtlasLocation.ArrayIndex; for (i = 0; i < 4; i++) { - FVector2 lightmapuv = tile->ToUV(FVector3(dv[i].x, dv[i].y, dv[i].z), di->Level->levelMesh->LMTextureSize); + FVector2 lightmapuv = tile->ToUV(FVector3(dv[i].x, dv[i].y, dv[i].z), di->Level->levelMesh->Lightmap.TextureSize); verts.first[i].Set(dv[i].x, dv[i].z, dv[i].y, dv[i].u, dv[i].v, lightmapuv.X, lightmapuv.Y, lightmapindex); } } diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 836d68611..22c172cfa 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -687,7 +687,7 @@ void HWDrawInfo::UpdateLightmaps() { if (!outer && VisibleTiles.Size() < unsigned(lm_background_updates)) { - for (auto& e : level.levelMesh->LightmapTiles) + for (auto& e : level.levelMesh->Lightmap.Tiles) { if (e.NeedsUpdate) { diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index ce6f7836e..effcf933c 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -229,16 +229,16 @@ public: void PushVisibleTile(int tileIndex) { + if (tileIndex < 0) + return; + if (outer) { outer->PushVisibleTile(tileIndex); return; } - if (tileIndex < 0) - return; - - LightmapTile* tile = &Level->levelMesh->LightmapTiles[tileIndex]; + LightmapTile* tile = &Level->levelMesh->Lightmap.Tiles[tileIndex]; if (lm_always_update || tile->AlwaysUpdate) { tile->NeedsUpdate = true; diff --git a/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp b/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp index abace2bb3..957d22421 100644 --- a/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp @@ -197,11 +197,11 @@ int HWWall::CreateVertices(FFlatVertex *&ptr, bool split) { if (lightmaptile >= 0) { - LightmapTile* tile = &level.levelMesh->LightmapTiles[lightmaptile]; - FVector2 lolft = tile->ToUV(FVector3(glseg.x1, glseg.y1, zbottom[0]), level.levelMesh->LMTextureSize); - FVector2 uplft = tile->ToUV(FVector3(glseg.x1, glseg.y1, ztop[0]), level.levelMesh->LMTextureSize); - FVector2 uprgt = tile->ToUV(FVector3(glseg.x2, glseg.y2, ztop[1]), level.levelMesh->LMTextureSize); - FVector2 lorgt = tile->ToUV(FVector3(glseg.x2, glseg.y2, zbottom[1]), level.levelMesh->LMTextureSize); + LightmapTile* tile = &level.levelMesh->Lightmap.Tiles[lightmaptile]; + FVector2 lolft = tile->ToUV(FVector3(glseg.x1, glseg.y1, zbottom[0]), level.levelMesh->Lightmap.TextureSize); + FVector2 uplft = tile->ToUV(FVector3(glseg.x1, glseg.y1, ztop[0]), level.levelMesh->Lightmap.TextureSize); + FVector2 uprgt = tile->ToUV(FVector3(glseg.x2, glseg.y2, ztop[1]), level.levelMesh->Lightmap.TextureSize); + FVector2 lorgt = tile->ToUV(FVector3(glseg.x2, glseg.y2, zbottom[1]), level.levelMesh->Lightmap.TextureSize); lightuv[LOLFT] = { lolft.X, lolft.Y }; lightuv[UPLFT] = { uplft.X, uplft.Y }; lightuv[UPRGT] = { uprgt.X, uprgt.Y }; From 4fee895c2b953a0bc57ac175d480319036d0d5ac Mon Sep 17 00:00:00 2001 From: dpjudas Date: Tue, 22 Oct 2024 02:30:18 +0200 Subject: [PATCH 414/414] Remove unused struct --- src/common/rendering/hwrenderer/data/hw_levelmesh.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index 5cf31b846..fb8df47ef 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -145,13 +145,6 @@ LevelMeshTileStats LevelMesh::GatherTilePixelStats() return stats; } -struct LevelMeshPlaneGroup -{ - FVector4 plane = FVector4(0, 0, 1, 0); - int sectorGroup = 0; - std::vector surfaces; -}; - void LevelMesh::PackStaticLightmapAtlas() { Lightmap.StaticAtlasPacked = true;

      %$Ko;X$Wmx6=yG0Va=e-s>=Tr}3`|5tGM7-a3X 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 G2>}2zGJoa( literal 0 HcmV?d00001 From 2e4bf697b83871a269a6dddcee142115093284c9 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Mon, 17 Jun 2024 01:19:58 +0800 Subject: [PATCH 113/414] Add X, Y and Z offsets for VOXELDEF. Needed for voxelized weapons which would typically be very large and take up the majority of the 256x256x256 canvas, therefore making precise positioning of the models relative to the screen pretty much impossible without tweakable offsets. --- src/common/models/voxels.h | 3 ++ src/r_data/models.cpp | 3 ++ src/r_data/voxeldef.cpp | 54 +++++++++++++++++++++ src/rendering/swrenderer/things/r_voxel.cpp | 3 ++ 4 files changed, 63 insertions(+) diff --git a/src/common/models/voxels.h b/src/common/models/voxels.h index 52299434a..fe583fd93 100644 --- a/src/common/models/voxels.h +++ b/src/common/models/voxels.h @@ -73,6 +73,9 @@ struct FVoxelDef int VoxeldefIndex; // Needed by GZDoom double Scale; DAngle AngleOffset;// added to actor's angle to compensate for wrong-facing voxels + double xoffset; + double yoffset; + double zoffset; bool PitchFromMomentum; bool UseActorPitch; bool UseActorRoll; diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index c2268cef8..f63a15ef6 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -616,6 +616,9 @@ void InitModels() smf.animationIDs[0] = -1; smf.xscale = smf.yscale = smf.zscale = VoxelDefs[i]->Scale; smf.angleoffset = VoxelDefs[i]->AngleOffset.Degrees(); + smf.xoffset = VoxelDefs[i]->xoffset; + smf.yoffset = VoxelDefs[i]->yoffset; + smf.zoffset = VoxelDefs[i]->zoffset; // this helps catching uninitialized data. assert(VoxelDefs[i]->PitchFromMomentum == true || VoxelDefs[i]->PitchFromMomentum == false); if (VoxelDefs[i]->PitchFromMomentum) smf.flags |= MDL_PITCHFROMMOMENTUM; diff --git a/src/r_data/voxeldef.cpp b/src/r_data/voxeldef.cpp index 35037158b..a2eee3c35 100644 --- a/src/r_data/voxeldef.cpp +++ b/src/r_data/voxeldef.cpp @@ -58,6 +58,9 @@ struct VoxelOptions int PlacedSpin = 0; double Scale = 1; DAngle AngleOffset = DAngle90; + double xoffset = 0.0; + double yoffset = 0.0; + double zoffset = 0.0; bool OverridePalette = false; bool PitchFromMomentum = false; bool UseActorPitch = false; @@ -177,6 +180,54 @@ static void VOX_ReadOptions(FScanner &sc, VoxelOptions &opts) } opts.AngleOffset = DAngle::fromDeg(mul * sc.Float + 90.); } + else if (sc.Compare("xoffset")) + { + int mul = 1; + sc.MustGetToken('='); + if (sc.CheckToken('-')) mul = -1; + sc.MustGetAnyToken(); + if (sc.TokenType == TK_IntConst) + { + sc.Float = sc.Number; + } + else + { + sc.TokenMustBe(TK_FloatConst); + } + opts.xoffset = sc.Float * mul; + } + else if (sc.Compare("yoffset")) + { + int mul = 1; + sc.MustGetToken('='); + if (sc.CheckToken('-')) mul = -1; + sc.MustGetAnyToken(); + if (sc.TokenType == TK_IntConst) + { + sc.Float = sc.Number; + } + else + { + sc.TokenMustBe(TK_FloatConst); + } + opts.yoffset = sc.Float * mul; + } + else if (sc.Compare("zoffset")) + { + int mul = 1; + sc.MustGetToken('='); + if (sc.CheckToken('-')) mul = -1; + sc.MustGetAnyToken(); + if (sc.TokenType == TK_IntConst) + { + sc.Float = sc.Number; + } + else + { + sc.TokenMustBe(TK_FloatConst); + } + opts.zoffset = sc.Float * mul; + } else if (sc.Compare("overridepalette")) { opts.OverridePalette = true; @@ -262,6 +313,9 @@ void R_InitVoxels() def->DroppedSpin = opts.DroppedSpin; def->PlacedSpin = opts.PlacedSpin; def->AngleOffset = opts.AngleOffset; + def->xoffset = opts.xoffset; + def->yoffset = opts.yoffset; + def->zoffset = opts.zoffset; def->PitchFromMomentum = opts.PitchFromMomentum; def->UseActorPitch = opts.UseActorPitch; def->UseActorRoll = opts.UseActorRoll; diff --git a/src/rendering/swrenderer/things/r_voxel.cpp b/src/rendering/swrenderer/things/r_voxel.cpp index 28d8921f0..a75b66e31 100644 --- a/src/rendering/swrenderer/things/r_voxel.cpp +++ b/src/rendering/swrenderer/things/r_voxel.cpp @@ -148,6 +148,9 @@ namespace swrenderer vis->depth = (float)tz; vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z }; + vis->gpos.X += (float)voxel->xoffset; + vis->gpos.Y += (float)voxel->yoffset; + vis->gpos.Z += (float)voxel->zoffset; vis->gzb = (float)gzb; // [RH] use gzb, not thing->z vis->gzt = (float)gzt; // killough 3/27/98 vis->deltax = float(pos.X - thread->Viewport->viewpoint.Pos.X); From c56d70f2b16dc7853049ae93e0910f8fa9e49c31 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Sun, 23 Jun 2024 09:05:45 -0500 Subject: [PATCH 114/414] Added SPF_(NO)FACECAMERA flagst for specifying camera facing on particles and visual thinkers. - This also adds ensures facing camera is applied to these via the option menu. --- src/playsim/p_effect.h | 2 ++ src/rendering/hwrenderer/scene/hw_sprites.cpp | 5 +++-- wadsrc/static/zscript/constants.zs | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index c87aa2c7d..d22438f10 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -66,6 +66,8 @@ enum EParticleFlags SPF_NO_XY_BILLBOARD = 1 << 8, SPF_LOCAL_ANIM = 1 << 9, SPF_NEGATIVE_FADESTEP = 1 << 10, + SPF_FACECAMERA = 1 << 11, + SPF_NOFACECAMERA = 1 << 12, }; class DVisualThinker; diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index c06812858..41112a411 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -400,8 +400,9 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) && (gl_billboard_mode == 1 || (actor && actor->renderflags & RF_FORCEXYBILLBOARD)))); const bool drawBillboardFacingCamera = hw_force_cambbpref ? gl_billboard_faces_camera : - (gl_billboard_faces_camera && (actor && !(actor->renderflags2 & RF2_BILLBOARDNOFACECAMERA))) - || !!(actor && actor->renderflags2 & RF2_BILLBOARDFACECAMERA); + gl_billboard_faces_camera + && ((actor && (!(actor->renderflags2 & RF2_BILLBOARDNOFACECAMERA) || (actor->renderflags2 & RF2_BILLBOARDFACECAMERA))) + || (particle && particle->texture.isValid() && (!(particle->flags & SPF_NOFACECAMERA) || (particle->flags & SPF_FACECAMERA)))); // [Nash] has +ROLLSPRITE const bool drawRollSpriteActor = (actor != nullptr && actor->renderflags & RF_ROLLSPRITE); diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index 8e36a5516..6f9d5027a 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -715,6 +715,8 @@ enum EParticleFlags SPF_NO_XY_BILLBOARD = 1 << 8, SPF_LOCAL_ANIM = 1 << 9, SPF_NEGATIVE_FADESTEP = 1 << 10, + SPF_FACECAMERA = 1 << 11, + SPF_NOFACECAMERA = 1 << 12, SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG }; From dab624b8b562d8f16c1a205bb4c341a4e04fc779 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 23 Jun 2024 16:59:26 +0200 Subject: [PATCH 115/414] Fix compile error for gcc 14 --- src/common/filesystem/source/resourcefile.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp index 7a6085d2f..8ba320f7f 100644 --- a/src/common/filesystem/source/resourcefile.cpp +++ b/src/common/filesystem/source/resourcefile.cpp @@ -43,6 +43,7 @@ #include "fs_findfile.h" #include "fs_decompress.h" #include "wildcards.hpp" +#include namespace FileSys { From 5fc3d44ba54f18d62ed1e2ef4fe6d3fc240ecfd2 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Sun, 23 Jun 2024 09:44:13 -0500 Subject: [PATCH 116/414] Added SPF_ROLLCENTER for particles and visual thinkers. --- src/playsim/p_effect.h | 1 + src/rendering/hwrenderer/scene/hw_sprites.cpp | 2 +- wadsrc/static/zscript/constants.zs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index d22438f10..29f1cb720 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -68,6 +68,7 @@ enum EParticleFlags SPF_NEGATIVE_FADESTEP = 1 << 10, SPF_FACECAMERA = 1 << 11, SPF_NOFACECAMERA = 1 << 12, + SPF_ROLLCENTER = 1 << 13, }; class DVisualThinker; diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 41112a411..9340839b9 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -415,7 +415,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo* di, FVector3* v, DVector3* vp) // [Nash] is a flat sprite const bool isWallSprite = (actor != nullptr) && (spritetype == RF_WALLSPRITE); - const bool useOffsets = (actor != nullptr) && !(actor->renderflags & RF_ROLLCENTER); + const bool useOffsets = ((actor != nullptr) && !(actor->renderflags & RF_ROLLCENTER)) || (particle && !(particle->flags & SPF_ROLLCENTER)); FVector2 offset = FVector2( offx, offy ); float xx = -center.X + x; diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index 6f9d5027a..bd92db9b8 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -717,6 +717,7 @@ enum EParticleFlags SPF_NEGATIVE_FADESTEP = 1 << 10, SPF_FACECAMERA = 1 << 11, SPF_NOFACECAMERA = 1 << 12, + SPF_ROLLCENTER = 1 << 13, SPF_RELATIVE = SPF_RELPOS|SPF_RELVEL|SPF_RELACCEL|SPF_RELANG }; From 3e91d3858202012e07b75395d2b5367802d2a9b7 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Sun, 23 Jun 2024 18:18:05 -0500 Subject: [PATCH 117/414] Fixed Pre(Un)Morph being called out of order. - This had broken several mods that relied on the inventory being in place before the switch, which was the intended way to begin with. --- src/playsim/p_mobj.cpp | 36 +++++++++++++++++++ wadsrc/static/zscript/actors/morph.zs | 1 + .../zscript/actors/player/player_morph.zs | 6 ---- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 9c0b99c88..728f1a56d 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -5345,6 +5345,42 @@ int MorphPointerSubstitution(AActor* from, AActor* to) return false; } + // [MC] Had to move this here since ObtainInventory was also moved as well. Should be called + // before any transference of items since that's what was intended when introduced. + if (!from->alternative) // Morphing into + { + { + IFVIRTUALPTR(from, AActor, PreMorph) + { + VMValue params[] = { from, to, false }; + VMCall(func, params, 3, nullptr, 0); + } + } + { + IFVIRTUALPTR(to, AActor, PreMorph) + { + VMValue params[] = { to, from, true }; + VMCall(func, params, 3, nullptr, 0); + } + } + } + else // Unmorphing back + { + { + IFVIRTUALPTR(from, AActor, PreUnmorph) + { + VMValue params[] = { from, to, false }; + VMCall(func, params, 3, nullptr, 0); + } + } + { + IFVIRTUALPTR(to, AActor, PreUnmorph) + { + VMValue params[] = { to, from, true }; + VMCall(func, params, 3, nullptr, 0); + } + } + } // Since the check is good, move the inventory items over. This should always be done when // morphing to emulate Heretic/Hexen's behavior since those stored the inventory in their // player structs. diff --git a/wadsrc/static/zscript/actors/morph.zs b/wadsrc/static/zscript/actors/morph.zs index 9cd21287a..5ebbb59f0 100644 --- a/wadsrc/static/zscript/actors/morph.zs +++ b/wadsrc/static/zscript/actors/morph.zs @@ -99,6 +99,7 @@ extend class Actor } // [MC] Called when an actor morphs, on both the previous form (!current) and present form (current). + // Due to recent changes, these are now called internally instead of within the virtuals. virtual void PreMorph(Actor mo, bool current) {} virtual void PostMorph(Actor mo, bool current) {} virtual void PreUnmorph(Actor mo, bool current) {} diff --git a/wadsrc/static/zscript/actors/player/player_morph.zs b/wadsrc/static/zscript/actors/player/player_morph.zs index 25858dd7c..435d61cdf 100644 --- a/wadsrc/static/zscript/actors/player/player_morph.zs +++ b/wadsrc/static/zscript/actors/player/player_morph.zs @@ -129,9 +129,6 @@ extend class PlayerPawn return false; } - PreMorph(morphed, false); - morphed.PreMorph(self, true); - morphed.EndAllPowerupEffects(); if ((style & MRF_TRANSFERTRANSLATION) && !morphed.bDontTranslate) @@ -259,9 +256,6 @@ extend class PlayerPawn if (!MorphInto(alt)) return false; - PreUnmorph(alt, false); // This body's about to be left. - alt.PreUnmorph(self, true); // This one's about to become current. - alt.EndAllPowerupEffects(); // Remove the morph power if the morph is being undone prematurely. From 2eab98b4fbbfb7cc700adcc5eda7d70dba090f8b Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 24 Jun 2024 16:57:10 +0200 Subject: [PATCH 118/414] Fix level mesh upload crash if too large textures gets uploaded --- src/common/rendering/vulkan/vk_levelmesh.cpp | 27 ++++++++++++-------- src/common/rendering/vulkan/vk_levelmesh.h | 15 ++++++++++- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/common/rendering/vulkan/vk_levelmesh.cpp b/src/common/rendering/vulkan/vk_levelmesh.cpp index e985578fd..71d5620ca 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.cpp +++ b/src/common/rendering/vulkan/vk_levelmesh.cpp @@ -478,6 +478,16 @@ void VkLevelMeshUploader::Upload() UploadLights(); EndTransfer(transferBufferSize); + + // We can't add these as we go because UploadUniforms might load textures, which may invalidate the transfer command buffer. + VulkanCommandBuffer* cmdbuffer = Mesh->fb->GetCommands()->GetTransferCommands(); + for (const CopyCommand& copy : copyCommands) + { + cmdbuffer->copyBuffer(copy.srcBuffer, copy.dstBuffer, copy.srcOffset, copy.dstOffset, copy.size); + } + copyCommands.clear(); + Mesh->fb->GetCommands()->TransferDeleteList->Add(std::move(transferBuffer)); + ClearRanges(); } @@ -497,7 +507,6 @@ void VkLevelMeshUploader::ClearRanges() void VkLevelMeshUploader::BeginTransfer(size_t transferBufferSize) { - cmdbuffer = Mesh->fb->GetCommands()->GetTransferCommands(); transferBuffer = BufferBuilder() .Usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY) .Size(transferBufferSize) @@ -511,9 +520,7 @@ void VkLevelMeshUploader::BeginTransfer(size_t transferBufferSize) void VkLevelMeshUploader::EndTransfer(size_t transferBufferSize) { assert(datapos == transferBufferSize); - transferBuffer->Unmap(); - Mesh->fb->GetCommands()->TransferDeleteList->Add(std::move(transferBuffer)); } static FVector3 SwapYZ(const FVector3& v) @@ -530,7 +537,7 @@ void VkLevelMeshUploader::UploadNodes() nodesHeader.root = Mesh->Mesh->Collision->get_root(); *((CollisionNodeBufferHeader*)(data + datapos)) = nodesHeader; - cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, 0, sizeof(CollisionNodeBufferHeader)); + copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, 0, sizeof(CollisionNodeBufferHeader)); datapos += sizeof(CollisionNodeBufferHeader) + sizeof(CollisionNode); } @@ -554,7 +561,7 @@ void VkLevelMeshUploader::UploadNodes() size_t copysize = range.Size * sizeof(CollisionNode); if (copysize > 0) - cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, sizeof(CollisionNodeBufferHeader) + range.Offset * sizeof(CollisionNode), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->NodeBuffer.get(), datapos, sizeof(CollisionNodeBufferHeader) + range.Offset * sizeof(CollisionNode), copysize); datapos += copysize; } } @@ -567,7 +574,7 @@ void VkLevelMeshUploader::UploadRanges(const TArray& ranges, co size_t copysize = range.Size * sizeof(T); memcpy(data + datapos, srcbuffer + range.Offset, copysize); if (copysize > 0) - cmdbuffer->copyBuffer(transferBuffer.get(), destbuffer, datapos, range.Offset * sizeof(T), copysize); + copyCommands.emplace_back(transferBuffer.get(), destbuffer, datapos, range.Offset * sizeof(T), copysize); datapos += copysize; } } @@ -603,7 +610,7 @@ void VkLevelMeshUploader::UploadSurfaces() size_t copysize = range.Size * sizeof(SurfaceInfo); if (copysize > 0) - cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->SurfaceBuffer.get(), datapos, range.Offset * sizeof(SurfaceInfo), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->SurfaceBuffer.get(), datapos, range.Offset * sizeof(SurfaceInfo), copysize); datapos += copysize; } } @@ -632,7 +639,7 @@ void VkLevelMeshUploader::UploadUniforms() size_t copysize = range.Size * sizeof(SurfaceUniforms); memcpy(uniforms, Mesh->Mesh->Mesh.Uniforms.Data(), copysize); if (copysize > 0) - cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->UniformsBuffer.get(), datapos, range.Offset * sizeof(SurfaceUniforms), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->UniformsBuffer.get(), datapos, range.Offset * sizeof(SurfaceUniforms), copysize); datapos += copysize; } } @@ -652,7 +659,7 @@ void VkLevelMeshUploader::UploadPortals() size_t copysize = range.Size * sizeof(PortalInfo); if (copysize > 0) - cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->PortalBuffer.get(), datapos, range.Offset * sizeof(PortalInfo), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->PortalBuffer.get(), datapos, range.Offset * sizeof(PortalInfo), copysize); datapos += copysize; } } @@ -680,7 +687,7 @@ void VkLevelMeshUploader::UploadLights() size_t copysize = range.Size * sizeof(LightInfo); if (copysize > 0) - cmdbuffer->copyBuffer(transferBuffer.get(), Mesh->LightBuffer.get(), datapos, range.Offset * sizeof(LightInfo), copysize); + copyCommands.emplace_back(transferBuffer.get(), Mesh->LightBuffer.get(), datapos, range.Offset * sizeof(LightInfo), copysize); datapos += copysize; } } diff --git a/src/common/rendering/vulkan/vk_levelmesh.h b/src/common/rendering/vulkan/vk_levelmesh.h index b7d5f04b0..fdd053077 100644 --- a/src/common/rendering/vulkan/vk_levelmesh.h +++ b/src/common/rendering/vulkan/vk_levelmesh.h @@ -187,6 +187,19 @@ private: VkLevelMesh* Mesh = nullptr; uint8_t* data = nullptr; size_t datapos = 0; - VulkanCommandBuffer* cmdbuffer = nullptr; std::unique_ptr transferBuffer; + + struct CopyCommand + { + CopyCommand() = default; + CopyCommand(VulkanBuffer* srcBuffer, VulkanBuffer* dstBuffer, VkDeviceSize srcOffset = 0, VkDeviceSize dstOffset = 0, VkDeviceSize size = VK_WHOLE_SIZE) + : srcBuffer(srcBuffer), dstBuffer(dstBuffer), srcOffset(srcOffset), dstOffset(dstOffset), size(size) { } + + VulkanBuffer* srcBuffer = nullptr; + VulkanBuffer* dstBuffer = nullptr; + VkDeviceSize srcOffset = 0; + VkDeviceSize dstOffset = 0; + VkDeviceSize size = VK_WHOLE_SIZE; + }; + std::vector copyCommands; }; From 02305f02b94da5767d620855a1deef72aac42c41 Mon Sep 17 00:00:00 2001 From: dpjudas Date: Fri, 15 Mar 2024 09:41:25 +0100 Subject: [PATCH 119/414] Turn on the output limiter --- src/common/audio/sound/oalsound.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/common/audio/sound/oalsound.cpp b/src/common/audio/sound/oalsound.cpp index 511a89fbd..8b20fb9c1 100644 --- a/src/common/audio/sound/oalsound.cpp +++ b/src/common/audio/sound/oalsound.cpp @@ -598,6 +598,7 @@ OpenALSoundRenderer::OpenALSoundRenderer() ALC.EXT_disconnect = !!alcIsExtensionPresent(Device, "ALC_EXT_disconnect"); ALC.SOFT_HRTF = !!alcIsExtensionPresent(Device, "ALC_SOFT_HRTF"); ALC.SOFT_pause_device = !!alcIsExtensionPresent(Device, "ALC_SOFT_pause_device"); + ALC.SOFT_output_limiter = !!alcIsExtensionPresent(Device, "ALC_SOFT_output_limiter"); const ALCchar *current = NULL; if(alcIsExtensionPresent(Device, "ALC_ENUMERATE_ALL_EXT")) @@ -634,6 +635,11 @@ OpenALSoundRenderer::OpenALSoundRenderer() else attribs.Push(ALC_DONT_CARE_SOFT); } + if(ALC.SOFT_output_limiter) + { + attribs.Push(ALC_OUTPUT_LIMITER_SOFT); + attribs.Push(ALC_TRUE); + } // Other attribs..? attribs.Push(0); From 35f66c5cc2082cdd01c4af1039fd4f8b6e179485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Mon, 10 Jun 2024 16:54:38 -0300 Subject: [PATCH 120/414] add COMPATF2_NOACSARGCHECK to disable ACS function argument count checks --- src/doomdef.h | 1 + src/gamedata/g_mapinfo.cpp | 1 + src/maploader/compatibility.cpp | 1 + src/playsim/p_acs.cpp | 8 +++++++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/doomdef.h b/src/doomdef.h index 811b4fa5e..f1f4f352e 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -242,6 +242,7 @@ enum : unsigned int COMPATF2_NOMBF21 = 1 << 14, // disable MBF21 features that may clash with certain maps COMPATF2_VOODOO_ZOMBIES = 1 << 15, // [RL0] allow playerinfo, playerpawn, and voodoo health to all be different, and skip killing the player's mobj if a voodoo doll dies to allow voodoo zombies COMPATF2_FDTELEPORT = 1 << 16, // Emulate Final Doom's teleporter z glitch. + COMPATF2_NOACSARGCHECK = 1 << 17, // Disable arg count checking for ACS }; diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 0e6a5fe6f..748d7cacd 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -1867,6 +1867,7 @@ MapFlagHandlers[] = { "compat_stayonlift", MITYPE_COMPATFLAG, 0, COMPATF2_STAYONLIFT }, { "compat_nombf21", MITYPE_COMPATFLAG, 0, COMPATF2_NOMBF21 }, { "compat_voodoozombies", MITYPE_COMPATFLAG, 0, COMPATF2_VOODOO_ZOMBIES }, + { "compat_noacsargcheck", MITYPE_COMPATFLAG, 0, COMPATF2_NOACSARGCHECK }, { "cd_start_track", MITYPE_EATNEXT, 0, 0 }, { "cd_end1_track", MITYPE_EATNEXT, 0, 0 }, { "cd_end2_track", MITYPE_EATNEXT, 0, 0 }, diff --git a/src/maploader/compatibility.cpp b/src/maploader/compatibility.cpp index 7caddc90a..1ba18d444 100644 --- a/src/maploader/compatibility.cpp +++ b/src/maploader/compatibility.cpp @@ -174,6 +174,7 @@ static FCompatOption Options[] = { "nombf21", COMPATF2_NOMBF21, SLOT_COMPAT2 }, { "voodoozombies", COMPATF2_VOODOO_ZOMBIES, SLOT_COMPAT2 }, { "fdteleport", COMPATF2_FDTELEPORT, SLOT_COMPAT2 }, + { "noacsargcheck", COMPATF2_NOACSARGCHECK, SLOT_COMPAT2 }, { NULL, 0, 0 } }; diff --git a/src/playsim/p_acs.cpp b/src/playsim/p_acs.cpp index b464ed2a5..1d4e90d1e 100644 --- a/src/playsim/p_acs.cpp +++ b/src/playsim/p_acs.cpp @@ -5323,7 +5323,13 @@ int DLevelScript::SwapActorTeleFog(AActor *activator, int tid) } // Macro for CallFunction. Checks passed number of arguments with minimum required. Sets needCount and returns if not enough. -#define MIN_ARG_COUNT(minCount) do { if (argCount < minCount) { needCount = minCount; return 0; } } while(0) +#define MIN_ARG_COUNT(minCount) \ + do { \ + if (argCount < minCount && !(Level->i_compatflags2 & COMPATF2_NOACSARGCHECK)) { \ + needCount = minCount; \ + return 0; \ + } \ + } while(0) int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args, int &needCount) { From ddbf90389b34c926aee11dea92f8cf0787198f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 11 Jun 2024 00:28:19 -0300 Subject: [PATCH 121/414] add total chaos retro and full maps to compatibility.txt --- wadsrc/static/compatibility.txt | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/wadsrc/static/compatibility.txt b/wadsrc/static/compatibility.txt index f8c3fe453..21946aa17 100644 --- a/wadsrc/static/compatibility.txt +++ b/wadsrc/static/compatibility.txt @@ -337,3 +337,50 @@ BA2247ED1465C8107192AC4215B2A5F3 // saturnia.wad map10 { fdteleport } + +// Total Chaos Directors Cut 1.40 +1C9D1306F76EA85558C4BD3BC4C7363C // TITLEMAP - retro & full +5138C10892976F7F8D58E73DF9BD1D35 // MADNESS - retro +EA96F1D692B354B2388F34CD9F0E4CDC // MADNESS - full +F7658930D904959FF43BE0A374E1E356 // MAP01 - retro & full +7C5508701E4AC3D1A00985409EC45EFD // NG1 - retro +C4C2CBACCF08F68AFC341557AEE6A727 // NG2 - retro +37853C2D108A56241E51C785CF0857D4 // NG3 - retro +0B14A4C8223F410816292E7EC578C625 // NG4 - retro +04F3D083D787DE15ACE8661163A6CA14 // NG5 - retro +F52D8B176EEFD374F342F3D9B3DEFC61 // NG6 - retro +A4D6321677AA6E7BA5CD93B39D1D063B // NG1 - full +3B4BAD71CFD7C9C1B860FB66363AEDF2 // NG2 - full +DD660C6E6E3F6F7A615D7234B7A56F59 // NG3 - full +74C68D18E6BD94B386163C4F672D3BFD // NG4 - full +835052B4078B33206675A4BB240333C8 // NG5 - full +0D3A15105CC16BCA0D06CA864AF0B58D // NG6 - full +0E186784223C02A19420BB49081FB734 // NG7 - retro & full +B57F6841E4E5C3989AA58ADDE9812762 // NGD1 - retro +A979225DED3F99E22B50FC6D9CE0355F // NGD2 - retro +95CE0EA31B85BA4D65A189B2D86D69A3 // NGD3 - retro +C1DB8E3B014A548383FDF95D999DF948 // NGD1 - full +6DB1AF715DA54226DC8D958B07FEC7DA // NGD2 - full +E6386D98F733E8D965865859E6056AFA // NGD3 - full +62958B31FB86C109B91BF2DDB9E93D2E // REGRESS - retro +84B499C6179E845265DF4BBF0D3AD361 // RESOLVE - retro +CC4D0C838C0EC5F710E220F3D77A1509 // SURFACE - retro +9FB4164A268007D7D1A630A4460C1CBB // ARRIVAL - retro +0F6AFE40771DCF448C77B6028CB53336 // REGRESS - full +B6E841EC4E5B45D90E3D4CFF805D192E // RESOLVE - full +80098CA75B3FCDE714E10832A8A08185 // SURFACE - full +EF8AA935168FED4393D68DAE04613106 // ARRIVAL - full +60C9D10D3FFDEF25E3131839FC50E1AD // CHAOS - retro +37325C08B6466A1760CA25D0D4176A64 // CROSS - retro +4F032EA6B61A5A42B1B6A7EDC8D5667B // CHAOS - full +D08C3FED35FE0489CFFAB6088FE79B3A // CROSS - full +859662ADA3A4CF634E8B7CE32B8ACB80 // CTEST - retro & full +1A3D2981D32783FED2BE7BA1587809E5 // DECAY - retro +2903FAAB2FBCD516F0559F5799EEEF14 // DECAY - full +A7898E72ED8D2C679DF18D6BC5DCC485 // FINALE - retro +EBD9BB5E7719F6E5042F12B3AE670104 // FORGOT - retro +A318D63145AA0A454475FBE426567896 // FINALE - full +C58AA89A5ACDC7F16BDA68428E31C555 // FORGOT - full +{ + noacsargcheck +} From 128f78bee4b0e50855996b373b128b30ed65c04c Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Sun, 30 Jun 2024 20:01:18 +0800 Subject: [PATCH 122/414] Generate proper multi-sized icons for both Windows and Mac, and actually change the Linux icon too --- src/posix/osx/zdoom.icns | Bin 80444 -> 49305 bytes src/posix/zdoom.xpm | 9382 ++++---------------------------------- src/win32/icon1.ico | Bin 1453926 -> 32805 bytes 3 files changed, 770 insertions(+), 8612 deletions(-) diff --git a/src/posix/osx/zdoom.icns b/src/posix/osx/zdoom.icns index ad89dfc5063b5c184bbcc394349a7692402bd18c..5c2cf50803566b8ab86a7c53cf1c76b433a7bbc1 100644 GIT binary patch literal 49305 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�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 VwByHr#>H+PcYo)H{6*e=1OTi$DiZ(z diff --git a/src/posix/zdoom.xpm b/src/posix/zdoom.xpm index daf54d701..8e3946f0b 100644 --- a/src/posix/zdoom.xpm +++ b/src/posix/zdoom.xpm @@ -1,8613 +1,771 @@ /* XPM */ -static char * zdoom_xpm[] = { -"256 256 8354 2", -" c None", -". c #161616", -"+ c #000000", -"@ c #111111", -"# c #656565", -"$ c #434343", -"% c #282828", -"& c #0D0D0D", -"* c #080808", -"= c #222222", -"- c #3D3D3D", -"; c #5F5F5F", -"> c #444444", -", c #262626", -"' c #0F0F0F", -") c #0A0A0A", -"! c #202020", -"~ c #373737", -"{ c #4B4B4B", -"] c #141414", -"^ c #1E1E1E", -"/ c #0E0E0E", -"( c #050505", -"_ c #171717", -": c #060606", -"< c #040404", -"[ c #070707", -"} c #121212", -"| c #000001", -"1 c #000002", -"2 c #000003", -"3 c #1C1C1C", -"4 c #010105", -"5 c #02020C", -"6 c #020412", -"7 c #040618", -"8 c #05081D", -"9 c #060821", -"0 c #060925", -"a c #060A28", -"b c #080B2B", -"c c #080C2E", -"d c #080C2F", -"e c #080D31", -"f c #090D33", -"g c #090D34", -"h c #080D2F", -"i c #060A25", -"j c #060922", -"k c #030513", -"l c #02030D", -"m c #010207", -"n c #303030", -"o c #333333", -"p c #02020B", -"q c #030514", -"r c #05081E", -"s c #070A28", -"t c #080D30", -"u c #090E35", -"v c #0A0F39", -"w c #0B103E", -"x c #0B1142", -"y c #0C1246", -"z c #0D1349", -"A c #0D144C", -"B c #0D144E", -"C c #0E154D", -"D c #0D144B", -"E c #0D144A", -"F c #0E154E", -"G c #0D144D", -"H c #0D134A", -"I c #0C1243", -"J c #0B103F", -"K c #0A0F3A", -"L c #090E36", -"M c #090D31", -"N c #070A2A", -"O c #050821", -"P c #040617", -"Q c #03040D", -"R c #000102", -"S c #3C3C3C", -"T c #000104", -"U c #02020A", -"V c #060923", -"W c #080C30", -"X c #0A103B", -"Y c #0C1245", -"Z c #0D1348", -"` c #0D1347", -" . c #0C1346", -".. c #0C1244", -"+. c #0B113F", -"@. c #0A103C", -"#. c #090E34", -"$. c #060A26", -"%. c #04071A", -"&. c #02030C", -"*. c #010104", -"=. c #1F1F1F", -"-. c #02030E", -";. c #070B2B", -">. c #090F39", -",. c #0C1142", -"'. c #0C1347", -"). c #0B103D", -"!. c #080C2D", -"~. c #05071E", -"{. c #020310", -"]. c #010209", -"^. c #151515", -"/. c #040619", -"(. c #070B29", -"_. c #0C1349", -":. c #080B2D", -"<. c #05071C", -"[. c #030410", -"}. c #212121", -"|. c #030512", -"1. c #080C31", -"2. c #0B1040", -"3. c #0E144D", -"4. c #090D35", -"5. c #060926", -"6. c #040616", -"7. c #03030F", -"8. c #0C1141", -"9. c #0C1143", -"0. c #0C1144", -"a. c #090F38", -"b. c #070B2A", -"c. c #010208", -"d. c #060820", -"e. c #0A0F37", -"f. c #0C1041", -"g. c #0B0F40", -"h. c #0C1042", -"i. c #0C1145", -"j. c #0D1448", -"k. c #0C1448", -"l. c #0B1345", -"m. c #0C1549", -"n. c #0E1A53", -"o. c #0F1F5C", -"p. c #0F215D", -"q. c #0F225F", -"r. c #0F2260", -"s. c #112869", -"t. c #102764", -"u. c #0E245B", -"v. c #0E245A", -"w. c #102965", -"x. c #0F265F", -"y. c #0E2355", -"z. c #0E275E", -"A. c #0F2760", -"B. c #102862", -"C. c #0F255C", -"D. c #0F235A", -"E. c #102663", -"F. c #112868", -"G. c #0F2664", -"H. c #112668", -"I. c #0F205E", -"J. c #0F1D59", -"K. c #0D174F", -"L. c #0C1043", -"M. c #0B1041", -"N. c #010106", -"O. c #030515", -"P. c #0B1141", -"Q. c #0B0F3E", -"R. c #0B0F3F", -"S. c #0C1247", -"T. c #0D154B", -"U. c #0D184F", -"V. c #0D1850", -"W. c #102262", -"X. c #12286A", -"Y. c #122A6B", -"Z. c #102A68", -"`. c #0F2860", -" + c #10285D", -".+ c #102A5F", -"++ c #12316D", -"@+ c #102C62", -"#+ c #0F285B", -"$+ c #102B62", -"%+ c #12306B", -"&+ c #102A5E", -"*+ c #102D61", -"=+ c #112D64", -"-+ c #122F68", -";+ c #0F2A5D", -">+ c #0F295B", -",+ c #112F68", -"'+ c #112D66", -")+ c #102B60", -"!+ c #102D64", -"~+ c #133574", -"{+ c #133473", -"]+ c #112F6A", -"^+ c #11306A", -"/+ c #112E66", -"(+ c #12306D", -"_+ c #12306E", -":+ c #13316F", -"<+ c #102962", -"[+ c #102A65", -"}+ c #112C6D", -"|+ c #102668", -"1+ c #10215F", -"2+ c #0D1A52", -"3+ c #0C174D", -"4+ c #0E174E", -"5+ c #0D154D", -"6+ c #0C1248", -"7+ c #0B0E3F", -"8+ c #0B0E3E", -"9+ c #02030A", -"0+ c #0A0D3B", -"a+ c #0B0F43", -"b+ c #0E1752", -"c+ c #0F1B56", -"d+ c #0E1D53", -"e+ c #0E1E55", -"f+ c #102867", -"g+ c #112E6F", -"h+ c #123271", -"i+ c #123371", -"j+ c #112F69", -"k+ c #102D65", -"l+ c #102B61", -"m+ c #102C65", -"n+ c #102C63", -"o+ c #11316E", -"p+ c #112D65", -"q+ c #102B5F", -"r+ c #0F295D", -"s+ c #113270", -"t+ c #0F2C61", -"u+ c #0E2858", -"v+ c #0E2656", -"w+ c #0F2B61", -"x+ c #12306C", -"y+ c #102C61", -"z+ c #122F6A", -"A+ c #102E67", -"B+ c #112E67", -"C+ c #112E68", -"D+ c #102D62", -"E+ c #102E65", -"F+ c #102D66", -"G+ c #102963", -"H+ c #0F2765", -"I+ c #0D2059", -"J+ c #0E1B56", -"K+ c #0E1850", -"L+ c #0C1249", -"M+ c #030411", -"N+ c #2C2C2C", -"O+ c #060A29", -"P+ c #0B1140", -"Q+ c #0E144C", -"R+ c #0C0E3F", -"S+ c #0D154C", -"T+ c #102766", -"U+ c #122C6E", -"V+ c #122E6C", -"W+ c #0F2C62", -"X+ c #0E2958", -"Y+ c #11316B", -"Z+ c #12336F", -"`+ c #12316E", -" @ c #112E6A", -".@ c #133170", -"+@ c #0F295C", -"@@ c #122F69", -"#@ c #123270", -"$@ c #102E66", -"%@ c #0E2658", -"&@ c #0E2859", -"*@ c #102E68", -"=@ c #0E2757", -"-@ c #0D2655", -";@ c #133476", -">@ c #112C63", -",@ c #0F2A60", -"'@ c #112F6B", -")@ c #0E2758", -"!@ c #0F2959", -"~@ c #0F2C5F", -"{@ c #123472", -"]@ c #112F6D", -"^@ c #112A67", -"/@ c #0E235A", -"(@ c #0E1E56", -"_@ c #0E1E59", -":@ c #0D1650", -"<@ c #0B0F42", -"[@ c #0C1040", -"}@ c #070C2F", -"|@ c #272727", -"1@ c #080C32", -"2@ c #0B1243", -"3@ c #0B1143", -"4@ c #0C164E", -"5@ c #102363", -"6@ c #0F2663", -"7@ c #112B66", -"8@ c #14367B", -"9@ c #14397F", -"0@ c #133776", -"a@ c #12336C", -"b@ c #112E64", -"c@ c #133576", -"d@ c #11306B", -"e@ c #12326E", -"f@ c #133475", -"g@ c #11306C", -"h@ c #112C64", -"i@ c #12316C", -"j@ c #0D2451", -"k@ c #0F2859", -"l@ c #12326F", -"m@ c #0E2655", -"n@ c #10306C", -"o@ c #11306D", -"p@ c #0F295E", -"q@ c #0E285A", -"r@ c #0F2B62", -"s@ c #0E285B", -"t@ c #102B63", -"u@ c #112F66", -"v@ c #102E64", -"w@ c #102E63", -"x@ c #112F6C", -"y@ c #102A67", -"z@ c #0F255D", -"A@ c #0E1A56", -"B@ c #0A0E36", -"C@ c #04071C", -"D@ c #1B1B1B", -"E@ c #080D33", -"F@ c #0B1144", -"G@ c #0C1044", -"H@ c #0E1851", -"I@ c #0E2260", -"J@ c #0E2762", -"K@ c #0F2B63", -"L@ c #12377A", -"M@ c #123574", -"N@ c #11316D", -"O@ c #113472", -"P@ c #133980", -"Q@ c #133679", -"R@ c #102F6A", -"S@ c #10306B", -"T@ c #0F2D63", -"U@ c #11316C", -"V@ c #10316D", -"W@ c #13377A", -"X@ c #13397D", -"Y@ c #123576", -"Z@ c #10306E", -"`@ c #0E295E", -" # c #0E295C", -".# c #0F2D65", -"+# c #0F2D62", -"@# c #0E2B60", -"## c #0E2A5F", -"$# c #0F2C63", -"%# c #0F2B60", -"&# c #0E295B", -"*# c #0E2A60", -"=# c #102F69", -"-# c #11326F", -";# c #0F2A5F", -"># c #0F2A5E", -",# c #102F68", -"'# c #0F2D64", -")# c #0F2D66", -"!# c #0F2E65", -"~# c #0F2C60", -"{# c #123473", -"]# c #102E6B", -"^# c #102D6E", -"/# c #0F2465", -"(# c #0C0F40", -"_# c #0A0F38", -":# c #080D32", -"<# c #0B1245", -"[# c #0C103F", -"}# c #0B0D3D", -"|# c #0C134A", -"1# c #0C164C", -"2# c #0D1F5C", -"3# c #112E70", -"4# c #102F6B", -"5# c #103068", -"6# c #11326D", -"7# c #10306A", -"8# c #10306D", -"9# c #10316E", -"0# c #123676", -"a# c #113373", -"b# c #123677", -"c# c #0E2A5D", -"d# c #0F2F69", -"e# c #113576", -"f# c #133A81", -"g# c #12377B", -"h# c #113475", -"i# c #0E2A5E", -"j# c #0F2E68", -"k# c #0D2757", -"l# c #0F2B5F", -"m# c #11316F", -"n# c #113370", -"o# c #10326F", -"p# c #0E2C62", -"q# c #0F2E66", -"r# c #102E69", -"s# c #0E2B62", -"t# c #0F2C64", -"u# c #0F2E67", -"v# c #113371", -"w# c #0F2E69", -"x# c #0F2A68", -"y# c #0E225F", -"z# c #0D184E", -"A# c #0B0F41", -"B# c #04071B", -"C# c #242424", -"D# c #080B2F", -"E# c #0C0F3D", -"F# c #0E205E", -"G# c #102B70", -"H# c #113477", -"I# c #10326B", -"J# c #0E2959", -"K# c #123374", -"L# c #0E2B5E", -"M# c #113474", -"N# c #113271", -"O# c #10316C", -"P# c #113372", -"Q# c #0D2A5D", -"R# c #0D2756", -"S# c #0D295D", -"T# c #0D2758", -"U# c #0D285A", -"V# c #0E2C60", -"W# c #113473", -"X# c #102F67", -"Y# c #12367A", -"Z# c #0F2F68", -"`# c #0E2B5F", -" $ c #103370", -".$ c #123476", -"+$ c #10326E", -"@$ c #112E72", -"#$ c #0D205C", -"$$ c #0E1952", -"%$ c #0C0F41", -"&$ c #0B0E3C", -"*$ c #090F36", -"=$ c #040516", -"-$ c #01030C", -";$ c #0B1043", -">$ c #0E1A55", -",$ c #0F2564", -"'$ c #0F2D6D", -")$ c #11377A", -"!$ c #113673", -"~$ c #0B2450", -"{$ c #0D2A5C", -"]$ c #0F2F66", -"^$ c #0F316D", -"/$ c #0F306B", -"($ c #0E2D65", -"_$ c #103371", -":$ c #0E2C63", -"<$ c #0E2D64", -"[$ c #0D2858", -"}$ c #0D2B5F", -"|$ c #0D2A5E", -"1$ c #0E2E66", -"2$ c #0F2F6A", -"3$ c #10326D", -"4$ c #0D295E", -"5$ c #0D2859", -"6$ c #0E2C61", -"7$ c #102F6C", -"8$ c #10336E", -"9$ c #0F326E", -"0$ c #103276", -"a$ c #102A6D", -"b$ c #0E1C59", -"c$ c #0C1146", -"d$ c #0C0F3F", -"e$ c #101010", -"f$ c #0D1E5B", -"g$ c #0D265F", -"h$ c #103274", -"i$ c #123A80", -"j$ c #0F326C", -"k$ c #0F316B", -"l$ c #0B234E", -"m$ c #103373", -"n$ c #0F306C", -"o$ c #103576", -"p$ c #103472", -"q$ c #0E3068", -"r$ c #0F316E", -"s$ c #0E2F68", -"t$ c #0E2B61", -"u$ c #0E2F69", -"v$ c #0E306A", -"w$ c #103475", -"x$ c #0E2D63", -"y$ c #0D2C62", -"z$ c #0E2F6A", -"A$ c #0F3371", -"B$ c #113676", -"C$ c #0F2F67", -"D$ c #0F306A", -"E$ c #0D2B60", -"F$ c #0C2756", -"G$ c #0D2C5F", -"H$ c #0D2C61", -"I$ c #0E2C64", -"J$ c #0D2B5E", -"K$ c #0C2758", -"L$ c #113678", -"M$ c #0F3270", -"N$ c #0E2E67", -"O$ c #113677", -"P$ c #0E2E65", -"Q$ c #0B2552", -"R$ c #10316F", -"S$ c #0F336F", -"T$ c #0F3069", -"U$ c #103372", -"V$ c #0F326F", -"W$ c #103473", -"X$ c #11387A", -"Y$ c #11357A", -"Z$ c #0F2C6C", -"`$ c #0F2262", -" % c #070B2D", -".% c #0F2366", -"+% c #0F2B69", -"@% c #0F3370", -"#% c #0F336E", -"$% c #0D2B61", -"%% c #0D2D64", -"&% c #0C2654", -"*% c #0B234F", -"=% c #0E2D66", -"-% c #0E2E64", -";% c #0F316C", -">% c #103574", -",% c #0E2F67", -"'% c #0C2857", -")% c #0C2858", -"!% c #0D295B", -"~% c #0F3271", -"{% c #113679", -"]% c #0C2859", -"^% c #0F316F", -"/% c #0F2F6B", -"(% c #0E306B", -"_% c #103270", -":% c #113779", -"<% c #103575", -"[% c #0F3472", -"}% c #12347B", -"|% c #0F2567", -"1% c #0D1750", -"2% c #050820", -"3% c #000103", -"4% c #353535", -"5% c #070C2D", -"6% c #0C144B", -"7% c #0E205B", -"8% c #11337B", -"9% c #0D2C60", -"0% c #0E3069", -"a% c #0D2A5F", -"b% c #0C2653", -"c% c #103679", -"d% c #103474", -"e% c #103374", -"f% c #11397E", -"g% c #0D2E67", -"h% c #0D295A", -"i% c #0F2F6C", -"j% c #0C295B", -"k% c #0C295C", -"l% c #0E326E", -"m% c #103577", -"n% c #11367A", -"o% c #103677", -"p% c #113278", -"q% c #102768", -"r% c #0B0D3A", -"s% c #020202", -"t% c #0B1242", -"u% c #0D1449", -"v% c #0D215B", -"w% c #11347D", -"x% c #0D2D63", -"y% c #113575", -"z% c #0D2A60", -"A% c #0B2554", -"B% c #0C2552", -"C% c #0D295C", -"D% c #0E316D", -"E% c #11377C", -"F% c #113778", -"G% c #0E306C", -"H% c #0C285B", -"I% c #11387E", -"J% c #0C2655", -"K% c #0C2759", -"L% c #0D2C63", -"M% c #0D2E66", -"N% c #0C285A", -"O% c #11377B", -"P% c #113578", -"Q% c #0F3372", -"R% c #11387D", -"S% c #12397D", -"T% c #103778", -"U% c #103478", -"V% c #112A6F", -"W% c #0E1A57", -"X% c #0C1348", -"Y% c #060A27", -"Z% c #000105", -"`% c #0D134C", -" & c #0E215E", -".& c #103072", -"+& c #113776", -"@& c #0F306D", -"#& c #10377A", -"$& c #12397E", -"%& c #103678", -"&& c #0E2E68", -"*& c #0E3067", -"=& c #11387C", -"-& c #11397F", -";& c #0B2452", -">& c #133A83", -",& c #0F3471", -"'& c #0B2757", -")& c #0D2D65", -"!& c #0F326D", -"~& c #0F3473", -"{& c #12397F", -"]& c #133D88", -"^& c #123B81", -"/& c #123B83", -"(& c #103675", -"_& c #13418E", -":& c #11357C", -"<& c #0E2667", -"[& c #0C0F3E", -"}& c #090F3A", -"|& c #232323", -"1& c #181818", -"2& c #0D1E5C", -"3& c #0F2D6E", -"4& c #113A82", -"5& c #103779", -"6& c #0E316E", -"7& c #0E306D", -"8& c #10387B", -"9& c #0F3576", -"0& c #103980", -"a& c #0E316C", -"b& c #123E8B", -"c& c #10377B", -"d& c #123C85", -"e& c #0E3371", -"f& c #0F3574", -"g& c #0C2B60", -"h& c #0D2F68", -"i& c #0E326F", -"j& c #0F3272", -"k& c #0C2C62", -"l& c #0D2F69", -"m& c #0F3475", -"n& c #0F3373", -"o& c #0F3474", -"p& c #0F3577", -"q& c #10377C", -"r& c #10397E", -"s& c #113980", -"t& c #10387D", -"u& c #113C87", -"v& c #10387A", -"w& c #0E2F70", -"x& c #0D2262", -"y& c #0B1244", -"z& c #010107", -"A& c #0D1B57", -"B& c #0F2E73", -"C& c #10397F", -"D& c #10397D", -"E& c #0D306B", -"F& c #0E3472", -"G& c #0C2C60", -"H& c #0D306A", -"I& c #0D306C", -"J& c #0D326D", -"K& c #10387C", -"L& c #0F3679", -"M& c #0D2F67", -"N& c #0F387B", -"O& c #0D316C", -"P& c #0E3474", -"Q& c #103B81", -"R& c #0E316B", -"S& c #0C2A5D", -"T& c #0E3473", -"U& c #0E3471", -"V& c #0E326D", -"W& c #0C2D64", -"X& c #0C2D63", -"Y& c #0F377A", -"Z& c #0F3678", -"`& c #0E3370", -" * c #0D2F66", -".* c #0D3069", -"+* c #0D2F6A", -"@* c #0F3575", -"#* c #0E336F", -"$* c #0F3677", -"%* c #103C84", -"&* c #113A7F", -"** c #113B83", -"=* c #10387E", -"-* c #113D86", -";* c #113E88", -">* c #10337A", -",* c #0B1044", -"'* c #0A0E37", -")* c #020410", -"!* c #0A103D", -"~* c #0D164E", -"{* c #0F2666", -"]* c #0F3374", -"^* c #123F89", -"/* c #134494", -"(* c #0F3676", -"_* c #0E3270", -":* c #103A81", -"<* c #123E8A", -"[* c #0E3576", -"}* c #0F387D", -"|* c #0E3676", -"1* c #103578", -"2* c #0C2B5F", -"3* c #0C2A5E", -"4* c #0C2B5E", -"5* c #0F3778", -"6* c #0C2B61", -"7* c #0E3373", -"8* c #113C85", -"9* c #103A80", -"0* c #113C86", -"a* c #13408F", -"b* c #12408E", -"c* c #134495", -"d* c #102C72", -"e* c #0D164C", -"f* c #0C0D3E", -"g* c #0C1345", -"h* c #050822", -"i* c #0C1F5C", -"j* c #0E2F71", -"k* c #0F3476", -"l* c #0D2F6B", -"m* c #113D87", -"n* c #123F8F", -"o* c #123F8D", -"p* c #0E3476", -"q* c #0E3271", -"r* c #0D316D", -"s* c #0E316F", -"t* c #103A83", -"u* c #0A2759", -"v* c #0A2451", -"w* c #0D306D", -"x* c #10377D", -"y* c #0E3372", -"z* c #0B2A5D", -"A* c #0B2A5F", -"B* c #0E3272", -"C* c #0E3475", -"D* c #0F377C", -"E* c #0F367A", -"F* c #0F3477", -"G* c #0E3171", -"H* c #0F387F", -"I* c #0D316E", -"J* c #11387F", -"K* c #0B295C", -"L* c #0C2C63", -"M* c #0F387E", -"N* c #0B2C62", -"O* c #0B295E", -"P* c #0E3374", -"Q* c #0D316F", -"R* c #0C2E67", -"S* c #0C2E68", -"T* c #0C2D65", -"U* c #0F3578", -"V* c #0C2E66", -"W* c #0C2C64", -"X* c #0C306D", -"Y* c #0E3375", -"Z* c #0E3679", -"`* c #113B85", -" = c #0F3980", -".= c #0F397F", -"+= c #103C86", -"@= c #103B84", -"#= c #0F3579", -"$= c #113C88", -"%= c #124191", -"&= c #113E89", -"*= c #12418F", -"== c #123D8D", -"-= c #0F276B", -";= c #0B0C3A", -">= c #404040", -",= c #0E2868", -"'= c #0E3577", -")= c #0D3370", -"!= c #0F387C", -"~= c #0E387D", -"{= c #0D3272", -"]= c #0F3A83", -"^= c #0C2D67", -"/= c #103F8D", -"(= c #103E8C", -"_= c #0F377D", -":= c #0D3374", -"<= c #0C2F6B", -"[= c #0C306C", -"}= c #0E3678", -"|= c #0D3270", -"1= c #0B2B5F", -"2= c #0A295C", -"3= c #0B2B61", -"4= c #0B285B", -"5= c #0A2655", -"6= c #0A2756", -"7= c #092655", -"8= c #103A82", -"9= c #0E377A", -"0= c #0D3271", -"a= c #0D326F", -"b= c #0C316D", -"c= c #0B2D64", -"d= c #0B2B60", -"e= c #0F367B", -"f= c #0B2D65", -"g= c #0C2F68", -"h= c #0F397E", -"i= c #0D3474", -"j= c #0D3373", -"k= c #0B295D", -"l= c #0B2A60", -"m= c #0B2658", -"n= c #0B2A5E", -"o= c #0C316B", -"p= c #0C2F6A", -"q= c #0C2F69", -"r= c #0E3578", -"s= c #0E3575", -"t= c #0F377B", -"u= c #0B285C", -"v= c #0C2D66", -"w= c #0D3372", -"x= c #103C87", -"y= c #113F8C", -"z= c #0E367A", -"A= c #0F3A81", -"B= c #0E397F", -"C= c #10408D", -"D= c #114191", -"E= c #11388B", -"F= c #0D1D5E", -"G= c #0C0E3E", -"H= c #3F3F3F", -"I= c #0A0F3C", -"J= c #0D205E", -"K= c #0D3274", -"L= c #0E3A81", -"M= c #0F3B85", -"N= c #0E377B", -"O= c #0C306A", -"P= c #0B2859", -"Q= c #082048", -"R= c #081F47", -"S= c #0A2553", -"T= c #0D326E", -"U= c #113E8B", -"V= c #0E3579", -"W= c #0E3779", -"X= c #0C2C65", -"Y= c #0C2D68", -"Z= c #0D3371", -"`= c #0E377C", -" - c #0E377D", -".- c #0F3B82", -"+- c #0F3C85", -"@- c #0F3A7E", -"#- c #114291", -"$- c #103A86", -"%- c #0E286E", -"&- c #0D134B", -"*- c #05071B", -"=- c #0E144A", -"-- c #0C154D", -";- c #102D74", -">- c #0F3A7F", -",- c #0E367B", -"'- c #0F3A84", -")- c #0C2B62", -"!- c #0D3475", -"~- c #0C306B", -"{- c #0C316E", -"]- c #0A2858", -"^- c #0A285A", -"/- c #0B295B", -"(- c #0A2656", -"_- c #092451", -":- c #0B2C61", -"<- c #0F3981", -"[- c #0D2E68", -"}- c #0C3270", -"|- c #0B2C64", -"1- c #0E387C", -"2- c #0E387F", -"3- c #0F3B83", -"4- c #103D8A", -"5- c #0E397E", -"6- c #0F3A80", -"7- c #0F3C86", -"8- c #103685", -"9- c #0D1A55", -"0- c #090909", -"a- c #060823", -"b- c #0D1E5F", -"c- c #0E3277", -"d- c #103E89", -"e- c #0B2D63", -"f- c #0D3170", -"g- c #0B2F6A", -"h- c #0D3476", -"i- c #0C3069", -"j- c #0A2B60", -"k- c #0A2554", -"l- c #0A285B", -"m- c #103D88", -"n- c #103D87", -"o- c #0D3473", -"p- c #0D3577", -"q- c #0E3677", -"r- c #0B2C63", -"s- c #0B2D66", -"t- c #0C2B63", -"u- c #0B2E68", -"v- c #0D3576", -"w- c #0F3D88", -"x- c #0F3B86", -"y- c #103982", -"z- c #103F8A", -"A- c #0F3B80", -"B- c #0E367E", -"C- c #0E2569", -"D- c #191919", -"E- c #0C1147", -"F- c #0D266A", -"G- c #103B87", -"H- c #0B2B62", -"I- c #0A2758", -"J- c #09224E", -"K- c #0A2350", -"L- c #0D367A", -"M- c #103E8A", -"N- c #0F3A82", -"O- c #103B85", -"P- c #0D3678", -"Q- c #0C3370", -"R- c #0D3575", -"S- c #0A2859", -"T- c #0C2E69", -"U- c #0F3C87", -"V- c #103F8C", -"W- c #0F3B84", -"X- c #0D2868", -"Y- c #0D154E", -"Z- c #020209", -"`- c #0D1751", -" ; c #0D2F76", -".; c #0F3F8C", -"+; c #0D3778", -"@; c #0C3576", -"#; c #0F3D8B", -"$; c #103E8B", -"%; c #0B2E67", -"&; c #0B2D67", -"*; c #092351", -"=; c #0D387C", -"-; c #0C3371", -";; c #0B306B", -">; c #0C316F", -",; c #0A2A5D", -"'; c #104090", -"); c #0B2F6C", -"!; c #0C3271", -"~; c #0D3579", -"{; c #0D3679", -"]; c #0E387E", -"^; c #124599", -"/; c #0C3474", -"(; c #0D377A", -"_; c #104192", -":; c #0A2A5F", -"<; c #0B306A", -"[; c #0C3374", -"}; c #0E3981", -"|; c #0D3779", -"1; c #0B2E69", -"2; c #0C326F", -"3; c #0B2F69", -"4; c #0B326E", -"5; c #0D387D", -"6; c #0A295B", -"7; c #0A295A", -"8; c #0E3B85", -"9; c #0F3E8C", -"0; c #0E3B84", -"a; c #0E3980", -"b; c #0F3D89", -"c; c #0F3D8C", -"d; c #0B3069", -"e; c #0C2A6A", -"f; c #0D1E5E", -"g; c #0B0F3D", -"h; c #03040F", -"i; c #030303", -"j; c #0D1E5A", -"k; c #0D347B", -"l; c #0F418E", -"m; c #10408F", -"n; c #0E3C86", -"o; c #0F3E8A", -"p; c #0D397F", -"q; c #0F3F8D", -"r; c #0D3A81", -"s; c #0C3472", -"t; c #0A2C62", -"u; c #08224D", -"v; c #0C316C", -"w; c #0B316D", -"x; c #0D377B", -"y; c #104293", -"z; c #09285A", -"A; c #0A2C63", -"B; c #0C3373", -"C; c #0B316C", -"D; c #0C3577", -"E; c #0E3C88", -"F; c #0C3372", -"G; c #0D387F", -"H; c #0C3779", -"I; c #092A5E", -"J; c #0B306D", -"K; c #0C326E", -"L; c #0A2B61", -"M; c #0B2F66", -"N; c #0A2A5E", -"O; c #0B306C", -"P; c #0B316E", -"Q; c #09295C", -"R; c #0A2E65", -"S; c #0A2E67", -"T; c #0C3272", -"U; c #0F3F8E", -"V; c #0D3980", -"W; c #0B2F68", -"X; c #0D3478", -"Y; c #0D2669", -"Z; c #0B0E40", -"`; c #0C205F", -" > c #0E3A80", -".> c #0F3E8B", -"+> c #0E3A7F", -"@> c #092757", -"#> c #0A295E", -"$> c #0E3B81", -"%> c #0E3A82", -"&> c #0F408F", -"*> c #0F408D", -"=> c #104190", -"-> c #0D3677", -";> c #0B3371", -">> c #0E3D87", -",> c #0B2E66", -"'> c #0B2E6A", -")> c #0D3578", -"!> c #0D3880", -"~> c #0C3575", -"{> c #0A2B62", -"]> c #0A2B5F", -"^> c #09285B", -"/> c #0F3D87", -"(> c #0C3477", -"_> c #0E3B82", -":> c #0D397E", -"<> c #0E3A84", -"[> c #0E3D88", -"}> c #0D3A80", -"|> c #0B3270", -"1> c #0B2460", -"2> c #0C0E3D", -"3> c #0C1242", -"4> c #02030F", -"5> c #0C2565", -"6> c #0F4190", -"7> c #0C397D", -"8> c #0F4191", -"9> c #0C377B", -"0> c #0B316F", -"a> c #0F3E89", -"b> c #0C3677", -"c> c #0F4293", -"d> c #0E3B83", -"e> c #0B3372", -"f> c #0C377C", -"g> c #0C3473", -"h> c #0A2D65", -"i> c #0D367B", -"j> c #0D3B82", -"k> c #0A2D64", -"l> c #0C3475", -"m> c #0B306E", -"n> c #0C3679", -"o> c #0A2A5C", -"p> c #0C3678", -"q> c #092A5C", -"r> c #0B336F", -"s> c #092A5F", -"t> c #0D377D", -"u> c #092B5F", -"v> c #0B2E65", -"w> c #0F408E", -"x> c #0B3373", -"y> c #0E3F8C", -"z> c #0D2C70", -"A> c #0E1957", -"B> c #313131", -"C> c #0A2763", -"D> c #0C397C", -"E> c #0E3F8D", -"F> c #0E3E88", -"G> c #0B3474", -"H> c #0B3678", -"I> c #0C3676", -"J> c #0B326F", -"K> c #0D3C85", -"L> c #0D3E8A", -"M> c #0E408E", -"N> c #0C387C", -"O> c #0F4292", -"P> c #0C3578", -"Q> c #0A2E69", -"R> c #0A316E", -"S> c #082759", -"T> c #0E418F", -"U> c #0B3370", -"V> c #09295A", -"W> c #0A2F67", -"X> c #0B3575", -"Y> c #0C367B", -"Z> c #0C377A", -"`> c #0B3472", -" , c #0B3574", -"., c #0A316C", -"+, c #0A306B", -"@, c #0C3A81", -"#, c #0C3A80", -"$, c #0B3271", -"%, c #0D397D", -"&, c #0B3473", -"*, c #092D65", -"=, c #0A2D66", -"-, c #0C387F", -";, c #0A2E66", -">, c #0A306A", -",, c #0A2C61", -"', c #092D63", -"), c #0A2D62", -"!, c #0A2C65", -"~, c #092A5D", -"{, c #0A306C", -"], c #092C61", -"^, c #072149", -"/, c #092B60", -"(, c #0A3069", -"_, c #0D3D86", -":, c #0D3F8A", -"<, c #0E4190", -"[, c #0D3B85", -"}, c #0D3B83", -"|, c #0D377C", -"1, c #0B3576", -"2, c #0D3B84", -"3, c #092D64", -"4, c #0E408B", -"5, c #0F3A88", -"6, c #0C1A55", -"7, c #0B0E3D", -"8, c #0C2E73", -"9, c #0D3D85", -"0, c #0D3A82", -"a, c #0C3A7F", -"b, c #0C397F", -"c, c #0D3D88", -"d, c #0D3981", -"e, c #0A3270", -"f, c #0B3475", -"g, c #082858", -"h, c #0A2F69", -"i, c #0A2E68", -"j, c #0A326E", -"k, c #0B3577", -"l, c #0E3C85", -"m, c #0F459B", -"n, c #0B3578", -"o, c #0D387B", -"p, c #0A2E64", -"q, c #0B3679", -"r, c #0C3574", -"s, c #0D3C86", -"t, c #092B61", -"u, c #08285A", -"v, c #09295B", -"w, c #08244F", -"x, c #0E3E8A", -"y, c #0C387D", -"z, c #0E408F", -"A, c #0C397E", -"B, c #0D3D89", -"C, c #0F4496", -"D, c #0B367A", -"E, c #0F418F", -"F, c #0E3F8B", -"G, c #0C397A", -"H, c #0C357B", -"I, c #0C1B56", -"J, c #0B0D3E", -"K, c #1A1A1A", -"L, c #0E144B", -"M, c #0C0D3B", -"N, c #0D1B55", -"O, c #0C347B", -"P, c #0D418E", -"Q, c #0D3C84", -"R, c #0C3B84", -"S, c #0D3E87", -"T, c #0C3A83", -"U, c #0F469A", -"V, c #0B377B", -"W, c #0A316B", -"X, c #0A326F", -"Y, c #0C3C86", -"Z, c #0C387A", -"`, c #0C387B", -" ' c #0B3677", -".' c #0B3779", -"+' c #0C3B82", -"@' c #092C62", -"#' c #0C3980", -"$' c #0A2F68", -"%' c #082859", -"&' c #092C5F", -"*' c #092C64", -"=' c #082756", -"-' c #092859", -";' c #082654", -">' c #082552", -",' c #082755", -"'' c #092C63", -")' c #0E3E89", -"!' c #0B377A", -"~' c #0F4395", -"{' c #0A326B", -"]' c #0B357A", -"^' c #0C2060", -"/' c #0C0D3D", -"(' c #0D1C5B", -"_' c #0D3782", -":' c #0E3F8A", -"<' c #0E408D", -"[' c #0C3B81", -"}' c #0A2F6A", -"|' c #072452", -"1' c #0A316D", -"2' c #0C387E", -"3' c #0C377D", -"4' c #092E65", -"5' c #0B3374", -"6' c #0A306D", -"7' c #092E66", -"8' c #072047", -"9' c #08295C", -"0' c #0A2D63", -"a' c #092E67", -"b' c #0B316B", -"c' c #0F4497", -"d' c #0E3D89", -"e' c #0E4394", -"f' c #0E4293", -"g' c #0B3471", -"h' c #092E63", -"i' c #07234D", -"j' c #0B3676", -"k' c #0C205C", -"l' c #0C0F42", -"m' c #454545", -"n' c #01030A", -"o' c #0C0D3C", -"p' c #0D1F5F", -"q' c #0D3C8A", -"r' c #0C3778", -"s' c #0D3A7F", -"t' c #0F4396", -"u' c #0D3E89", -"v' c #0B3675", -"w' c #0C3B83", -"x' c #0D3B81", -"y' c #0A2F66", -"z' c #0C3A7E", -"A' c #0D3D87", -"B' c #0A326D", -"C' c #0C3C85", -"D' c #0B387A", -"E' c #092C60", -"F' c #082757", -"G' c #0A3371", -"H' c #0F469B", -"I' c #0C3C84", -"J' c #0F469C", -"K' c #0D3F8B", -"L' c #0D3E88", -"M' c #092D61", -"N' c #092F69", -"O' c #08234F", -"P' c #0C2668", -"Q' c #0C1344", -"R' c #0B1E5C", -"S' c #0D3B86", -"T' c #0C3D84", -"U' c #0A3372", -"V' c #0F479C", -"W' c #0D3F8D", -"X' c #0B387C", -"Y' c #092C65", -"Z' c #082655", -"`' c #0B397D", -" ) c #0B377C", -".) c #092F68", -"+) c #0D4190", -"@) c #0A3370", -"#) c #09306A", -"$) c #0A3473", -"%) c #0A3475", -"&) c #0A3576", -"*) c #0B3476", -"=) c #0A316F", -"-) c #082A5E", -";) c #092F67", -">) c #09306B", -",) c #0E459A", -"') c #104AA5", -")) c #0C3E89", -"!) c #0E4292", -"~) c #092E68", -"{) c #082A5F", -"]) c #0A3676", -"^) c #0A205C", -"/) c #030412", -"() c #0E3F90", -"_) c #0B3A7D", -":) c #0B3B83", -"<) c #092F6A", -"[) c #0B397E", -"}) c #0C3B85", -"|) c #0D418F", -"1) c #0D4497", -"2) c #0B3C86", -"3) c #0B3C84", -"4) c #0B397F", -"5) c #0B3D88", -"6) c #09326F", -"7) c #082C62", -"8) c #082B5F", -"9) c #0A3472", -"0) c #0E4395", -"a) c #0C3D89", -"b) c #0B387D", -"c) c #0B387B", -"d) c #0A3577", -"e) c #0A3373", -"f) c #0A3574", -"g) c #0B3980", -"h) c #0C3D87", -"i) c #0B3A80", -"j) c #0B387E", -"k) c #0A377A", -"l) c #093270", -"m) c #0A3474", -"n) c #0A3678", -"o) c #0B3A81", -"p) c #0A3677", -"q) c #09306C", -"r) c #082D65", -"s) c #082B60", -"t) c #082C60", -"u) c #0C3A82", -"v) c #093370", -"w) c #08295B", -"x) c #0C418F", -"y) c #0E479C", -"z) c #0D408E", -"A) c #0B3B82", -"B) c #0D4293", -"C) c #0D4395", -"D) c #0C408E", -"E) c #08295A", -"F) c #082A5C", -"G) c #09326E", -"H) c #0B2466", -"I) c #02040E", -"J) c #343434", -"K) c #0C0C3C", -"L) c #0B1D5A", -"M) c #0C3981", -"N) c #0D408D", -"O) c #0D4090", -"P) c #0C3F8C", -"Q) c #0D4191", -"R) c #0D4192", -"S) c #0C3E8C", -"T) c #0B3C85", -"U) c #072653", -"V) c #072859", -"W) c #0A3575", -"X) c #0C3E8B", -"Y) c #0C3D88", -"Z) c #0F4AA5", -"`) c #0A377B", -" ! c #082B5E", -".! c #082C61", -"+! c #072757", -"@! c #082A5B", -"#! c #0A2F6B", -"$! c #0A3778", -"%! c #0A3679", -"&! c #093069", -"*! c #0B3981", -"=! c #0D408F", -"-! c #0B3375", -";! c #093371", -">! c #092D66", -",! c #0C3F8A", -"'! c #0D3E8B", -")! c #09326D", -"!! c #0A1F5A", -"~! c #0D1145", -"{! c #0C1E5C", -"]! c #0B3780", -"^! c #0A3675", -"/! c #0B387F", -"(! c #0B3579", -"_! c #0C3C87", -":! c #0D4499", -"~ c #0B3E8C", -",~ c #07295C", -"'~ c #0C3C88", -")~ c #0A397F", -"!~ c #093170", -"~~ c #0B3F8C", -"{~ c #0A3982", -"]~ c #0D4294", -"^~ c #0D47A2", -"/~ c #093577", -"(~ c #093575", -"_~ c #08326F", -":~ c #082F69", -"<~ c #093475", -"[~ c #0B3880", -"}~ c #093679", -"|~ c #09306E", -"1~ c #0A1C56", -"2~ c #030516", -"3~ c #0D1A54", -"4~ c #0B3376", -"5~ c #093470", -"6~ c #0C4396", -"7~ c #0A397D", -"8~ c #0C4395", -"9~ c #0E4DAC", -"0~ c #0A3B84", -"a~ c #0C3F8B", -"b~ c #0B3F8B", -"c~ c #0A387C", -"d~ c #0B3D87", -"e~ c #082E69", -"f~ c #0B3C88", -"g~ c #07295E", -"h~ c #072552", -"i~ c #0B408F", -"j~ c #093473", -"k~ c #093576", -"l~ c #0A3C85", -"m~ c #082C64", -"n~ c #07295D", -"o~ c #08316D", -"p~ c #0A3A81", -"q~ c #0A3579", -"r~ c #0A3779", -"s~ c #0C4292", -"t~ c #0D449A", -"u~ c #0B3D89", -"v~ c #0A3A83", -"w~ c #0A3D88", -"x~ c #0C2162", -"y~ c #050823", -"z~ c #0C1750", -"A~ c #0B3278", -"B~ c #08336F", -"C~ c #08316C", -"D~ c #0C4295", -"E~ c #0D469D", -"F~ c #0A3B85", -"G~ c #0A3B83", -"H~ c #082F6B", -"I~ c #082E65", -"J~ c #07285B", -"K~ c #07295B", -"L~ c #06285A", -"M~ c #072B60", -"N~ c #082D66", -"O~ c #09316C", -"P~ c #0A3B82", -"Q~ c #0A3C83", -"R~ c #0A3C86", -"S~ c #062756", -"T~ c #093678", -"U~ c #08295E", -"V~ c #062149", -"W~ c #093476", -"X~ c #0A3B86", -"Y~ c #0C459A", -"Z~ c #0B4090", -"`~ c #0B3F8D", -" { c #093578", -".{ c #0D4396", -"+{ c #0A3A7E", -"@{ c #0B3984", -"#{ c #0B1952", -"${ c #090E37", -"%{ c #0B2D71", -"&{ c #093A7F", -"*{ c #0E4AA5", -"={ c #0B3C87", -"-{ c #0C408F", -";{ c #09377B", -">{ c #093778", -",{ c #0D459A", -"'{ c #072759", -"){ c #062552", -"!{ c #072A5D", -"~{ c #0C4293", -"{{ c #0B3F8A", -"]{ c #082D63", -"^{ c #08306A", -"/{ c #0A387B", -"({ c #09387B", -"_{ c #0A3A80", -":{ c #0C4497", -"<{ c #0C4394", -"[{ c #0B3F8E", -"}{ c #0A3A84", -"|{ c #072A5E", -"1{ c #093573", -"2{ c #0B3781", -"3{ c #0C0E3C", -"4{ c #0A2868", -"5{ c #09387A", -"6{ c #0A3F8C", -"7{ c #0C4498", -"8{ c #0B4190", -"9{ c #0A3C87", -"0{ c #0B3E8B", -"a{ c #0A3C84", -"b{ c #0A3A7F", -"c{ c #093677", -"d{ c #072B5F", -"e{ c #082F67", -"f{ c #082758", -"g{ c #062655", -"h{ c #083270", -"i{ c #083371", -"j{ c #0B4191", -"k{ c #0B3D8B", -"l{ c #083372", -"m{ c #072A60", -"n{ c #09377A", -"o{ c #0C4192", -"p{ c #09387D", -"q{ c #0A397E", -"r{ c #072C63", -"s{ c #0C4493", -"t{ c #0D3A8B", -"u{ c #05081C", -"v{ c #0A2668", -"w{ c #073574", -"x{ c #072F68", -"y{ c #072C62", -"z{ c #072E67", -"A{ c #09397E", -"B{ c #0A4191", -"C{ c #093981", -"D{ c #0A3E8B", -"E{ c #0D4DAB", -"F{ c #093B84", -"G{ c #09397F", -"H{ c #0B4599", -"I{ c #0B408D", -"J{ c #093779", -"K{ c #093676", -"L{ c #0A3F8D", -"M{ c #0A3C88", -"N{ c #07306C", -"O{ c #083473", -"P{ c #08326E", -"Q{ c #072D64", -"R{ c #072D65", -"S{ c #062A5F", -"T{ c #093579", -"U{ c #08316F", -"V{ c #072F69", -"W{ c #09387F", -"X{ c #07316D", -"Y{ c #083373", -"Z{ c #09377D", -"`{ c #0A3D86", -" ] c #0B4293", -".] c #0B459A", -"+] c #09377C", -"@] c #083575", -"#] c #083679", -"$] c #083678", -"%] c #083271", -"&] c #09387E", -"*] c #08316B", -"=] c #072D66", -"-] c #072C61", -";] c #082F68", -">] c #09387C", -",] c #093980", -"'] c #0A408F", -")] c #0A3D89", -"!] c #0B459C", -"~] c #083474", -"{] c #093273", -"]] c #093A82", -"^] c #072C64", -"/] c #083577", -"(] c #072D62", -"_] c #0A3D87", -":] c #0D3484", -"<] c #03030D", -"[] c #0B2160", -"}] c #083472", -"|] c #0C4499", -"1] c #093C87", -"2] c #0A4090", -"3] c #0A408D", -"4] c #093D86", -"5] c #0C489F", -"6] c #072F6A", -"7] c #07306D", -"8] c #062859", -"9] c #072F6B", -"0] c #07316C", -"a] c #072B61", -"b] c #083370", -"c] c #083475", -"d] c #0C4091", -"e] c #093F8C", -"f] c #093C85", -"g] c #083677", -"h] c #083779", -"i] c #0D53B8", -"j] c #093B83", -"k] c #07306A", -"l] c #072E66", -"m] c #093B85", -"n] c #072D63", -"o] c #083576", -"p] c #093A81", -"q] c #08367A", -"r] c #0C48A1", -"s] c #0B4294", -"t] c #093574", -"u] c #08397D", -"v] c #062B5F", -"w] c #083476", -"x] c #0A418F", -"y] c #0B276A", -"z] c #04061A", -"A] c #1D1D1D", -"B] c #090E38", -"C] c #0C1D59", -"D] c #083272", -"E] c #072F67", -"F] c #093A7E", -"G] c #0B4394", -"H] c #0B469C", -"I] c #093B82", -"J] c #093A80", -"K] c #083374", -"L] c #05234E", -"M] c #083069", -"N] c #0A4292", -"O] c #0A3F8B", -"P] c #0A3E88", -"Q] c #09397D", -"R] c #093C84", -"S] c #072B62", -"T] c #0A3E8D", -"U] c #083574", -"V] c #062E65", -"W] c #0A3E89", -"X] c #08397E", -"Y] c #062A60", -"Z] c #0A3E8C", -"`] c #0A205E", -" ^ c #0A1041", -".^ c #0C1449", -"+^ c #092C6C", -"@^ c #08397B", -"#^ c #08377B", -"$^ c #0A3E8A", -"%^ c #093A83", -"&^ c #0A4294", -"*^ c #07316E", -"=^ c #072B5E", -"-^ c #072756", -";^ c #062758", -">^ c #062C62", -",^ c #072E65", -"'^ c #07326F", -")^ c #0A3B81", -"!^ c #072E68", -"~^ c #062858", -"{^ c #062A5E", -"]^ c #0B4396", -"^^ c #0A3F8A", -"/^ c #072A5F", -"(^ c #062E63", -"_^ c #072C65", -":^ c #040515", -"<^ c #0A2663", -"[^ c #093D88", -"}^ c #08326D", -"|^ c #06295B", -"1^ c #083578", -"2^ c #0C469D", -"3^ c #083170", -"4^ c #083375", -"5^ c #062A5D", -"6^ c #062657", -"7^ c #07306B", -"8^ c #0A3D8A", -"9^ c #0A4190", -"0^ c #0B3E89", -"a^ c #073067", -"b^ c #0A3278", -"c^ c #050922", -"d^ c #0A0E3B", -"e^ c #0D1042", -"f^ c #0B2263", -"g^ c #073373", -"h^ c #08377C", -"i^ c #093E8A", -"j^ c #093F8B", -"k^ c #093982", -"l^ c #06295C", -"m^ c #07316B", -"n^ c #062C63", -"o^ c #062D64", -"p^ c #062B61", -"q^ c #052451", -"r^ c #06295A", -"s^ c #0A4192", -"t^ c #083573", -"u^ c #07306E", -"v^ c #08387D", -"w^ c #0A3F8E", -"x^ c #093D89", -"y^ c #093E8B", -"z^ c #08397F", -"A^ c #0A4293", -"B^ c #073576", -"C^ c #0B4598", -"D^ c #08387C", -"E^ c #052551", -"F^ c #083E85", -"G^ c #092869", -"H^ c #02040F", -"I^ c #0D1041", -"J^ c #0C1A56", -"K^ c #073070", -"L^ c #063068", -"M^ c #08387E", -"N^ c #073371", -"O^ c #073271", -"P^ c #0A4396", -"Q^ c #093D8A", -"R^ c #09408C", -"S^ c #093E8C", -"T^ c #083980", -"U^ c #083A7F", -"V^ c #083A81", -"W^ c #083A82", -"X^ c #0A4498", -"Y^ c #083C86", -"Z^ c #083B84", -"`^ c #08377A", -" / c #062E68", -"./ c #062D65", -"+/ c #062B60", -"@/ c #052755", -"#/ c #052552", -"$/ c #052654", -"%/ c #05234F", -"&/ c #062E66", -"*/ c #062F68", -"=/ c #062F6A", -"-/ c #073069", -";/ c #073474", -">/ c #08387B", -",/ c #073577", -"'/ c #093C86", -")/ c #083B82", -"!/ c #09408E", -"~/ c #093D87", -"{/ c #08387F", -"]/ c #073473", -"^/ c #062D63", -"// c #073677", -"(/ c #062C64", -"_/ c #052C61", -":/ c #073372", -"( c #06316D", -",( c #073778", -"'( c #07397D", -")( c #083C87", -"!( c #094293", -"~( c #083E88", -"{( c #08408E", -"]( c #07377B", -"^( c #073679", -"/( c #083E89", -"(( c #083B85", -"_( c #073A7F", -":( c #083F8C", -"<( c #06306B", -"[( c #062F69", -"}( c #052C63", -"|( c #052A5F", -"1( c #052959", -"2( c #052758", -"3( c #042756", -"4( c #052A5D", -"5( c #052554", -"6( c #05295C", -"7( c #062E64", -"8( c #052B5F", -"9( c #063576", -"0( c #073A80", -"a( c #073676", -"b( c #073B82", -"c( c #073A82", -"d( c #083E8A", -"e( c #073B81", -"f( c #0A469C", -"g( c #062C61", -"h( c #063373", -"i( c #063371", -"j( c #07387C", -"k( c #073A81", -"l( c #083F8B", -"m( c #062F67", -"n( c #062F66", -"o( c #06316B", -"p( c #07397F", -"q( c #052A5C", -"r( c #063270", -"s( c #05295A", -"t( c #0A4BA7", -"u( c #07387B", -"v( c #063474", -"w( c #052858", -"x( c #063069", -"y( c #093C83", -"z( c #07367A", -"A( c #063574", -"B( c #0A2769", -"C( c #08337A", -"D( c #06326F", -"E( c #073C83", -"F( c #094497", -"G( c #073578", -"H( c #094393", -"I( c #052757", -"J( c #052B5E", -"K( c #042654", -"L( c #06336F", -"M( c #063271", -"N( c #063370", -"O( c #07397C", -"P( c #08408C", -"Q( c #07377D", -"R( c #09408D", -"S( c #073C85", -"T( c #073B85", -"U( c #07377C", -"V( c #09479D", -"W( c #052C60", -"X( c #062C5E", -"Y( c #06326E", -"Z( c #052A5B", -"`( c #073A7E", -" _ c #063573", -"._ c #06316A", -"+_ c #083F8A", -"@_ c #084190", -"#_ c #08408F", -"$_ c #073675", -"%_ c #0B1953", -"&_ c #0C0E3B", -"*_ c #05071A", -"=_ c #0C0E42", -"-_ c #09296B", -";_ c #063A7F", -">_ c #073573", -",_ c #083E8B", -"'_ c #084192", -")_ c #07387E", -"!_ c #063372", -"~_ c #05295D", -"{_ c #062B62", -"]_ c #052C5F", -"^_ c #063473", -"/_ c #063578", -"(_ c #094192", -"__ c #083F8D", -":_ c #05285C", -"<_ c #063575", -"[_ c #083C83", -"}_ c #083D8A", -"|_ c #0A48A0", -"1_ c #073C86", -"2_ c #063475", -"3_ c #0A479E", -"4_ c #08479C", -"5_ c #0B419D", -"6_ c #0D0E3D", -"7_ c #0B1B56", -"8_ c #07357C", -"9_ c #073C87", -"0_ c #063272", -"a_ c #07387F", -"b_ c #083A84", -"c_ c #094395", -"d_ c #094396", -"e_ c #09408F", -"f_ c #073982", -"g_ c #09459A", -"h_ c #084293", -"i_ c #094295", -"j_ c #073B84", -"k_ c #05295E", -"l_ c #062C65", -"m_ c #052453", -"n_ c #06306D", -"o_ c #063170", -"p_ c #063679", -"q_ c #073477", -"r_ c #083982", -"s_ c #094190", -"t_ c #073880", -"u_ c #062E69", -"v_ c #073171", -"w_ c #063374", -"x_ c #073981", -"y_ c #073A83", -"z_ c #073A84", -"A_ c #093E8D", -"B_ c #063577", -"C_ c #06377A", -"D_ c #084191", -"E_ c #094498", -"F_ c #083E8C", -"G_ c #0B2365", -"H_ c #090E39", -"I_ c #063B82", -"J_ c #084090", -"K_ c #073980", -"L_ c #083F8E", -"M_ c #09469B", -"N_ c #0A49A4", -"O_ c #073579", -"P_ c #052E66", -"Q_ c #052A5E", -"R_ c #052B60", -"S_ c #094294", -"T_ c #09469D", -"U_ c #093F8E", -"V_ c #052F69", -"W_ c #073B83", -"X_ c #06316F", -"Y_ c #052C62", -"Z_ c #052A60", -"`_ c #052D64", -" : c #094193", -".: c #083B86", -"+: c #05316E", -"@: c #0A4BA8", -"#: c #052F67", -"$: c #09367E", -"%: c #0C1953", -"&: c #091E59", -"*: c #05326E", -"=: c #08377D", -"-: c #0948A2", -";: c #09479F", -">: c #084498", -",: c #084396", -"': c #052555", -"): c #052B62", -"!: c #06306E", -"~: c #09469E", -"{: c #0A4AA5", -"]: c #08377E", -"^: c #073E8D", -"/: c #063476", -"(: c #05306D", -"_: c #052F68", -":: c #052759", -"<: c #04234E", -"[: c #052C64", -"}: c #042452", -"|: c #052859", -"1: c #052C65", -"2: c #073E8B", -"3: c #084294", -"4: c #0A50B2", -"5: c #07418F", -"6: c #0A2C73", -"7: c #0B164D", -"8: c #063274", -"9: c #073D86", -"0: c #06387F", -"a: c #083F8F", -"b: c #08469B", -"c: c #0948A4", -"d: c #073D88", -"e: c #063B83", -"f: c #063678", -"g: c #084292", -"h: c #073E8A", -"i: c #06387E", -"j: c #06377B", -"k: c #07408E", -"l: c #05306C", -"m: c #04316E", -"n: c #053271", -"o: c #053579", -"p: c #063A82", -"q: c #04387D", -"r: c #042E66", -"s: c #042B60", -"t: c #03295D", -"u: c #032554", -"v: c #03295E", -"w: c #04306B", -"x: c #022E6A", -"y: c #042E68", -"z: c #032A5E", -"A: c #032C63", -"B: c #042D67", -"C: c #04306D", -"D: c #043272", -"E: c #043271", -"F: c #04306A", -"G: c #05377A", -"H: c #042F6B", -"I: c #032B60", -"J: c #032D66", -"K: c #04306C", -"L: c #032D67", -"M: c #04316F", -"N: c #053578", -"O: c #043679", -"P: c #053779", -"Q: c #053679", -"R: c #05367A", -"S: c #043473", -"T: c #05387E", -"U: c #043577", -"V: c #05377C", -"W: c #053B84", -"X: c #053A82", -"Y: c #053981", -"Z: c #05397F", -"`: c #053D88", -" < c #053C86", -".< c #06408E", -"+< c #053A83", -"@< c #07459B", -"#< c #053F8C", -"$< c #05377D", -"%< c #053B86", -"&< c #053E8A", -"*< c #063E8C", -"=< c #05387C", -"-< c #05377B", -";< c #053C85", -">< c #053D86", -",< c #064293", -"'< c #063E8D", -")< c #053478", -"!< c #042E67", -"~< c #043474", -"{< c #053980", -"]< c #043576", -"^< c #043270", -"/< c #053373", -"(< c #04326F", -"_< c #063E8A", -":< c #043372", -"<< c #032F6A", -"[< c #032F69", -"}< c #043374", -"|< c #053476", -"1< c #053475", -"2< c #064193", -"3< c #04397F", -"4< c #063A83", -"5< c #074292", -"6< c #021E43", -"7< c #022450", -"8< c #043475", -"9< c #042C64", -"0< c #04316D", -"a< c #022859", -"b< c #03285B", -"c< c #042F68", -"d< c #032859", -"e< c #042C63", -"f< c #032E67", -"g< c #022351", -"h< c #042D65", -"i< c #032E66", -"j< c #042B62", -"k< c #043373", -"l< c #032E65", -"m< c #042B61", -"n< c #03316D", -"o< c #04316C", -"p< c #042A5D", -"q< c #063980", -"r< c #073D8B", -"s< c #074191", -"t< c #073C88", -"u< c #073E89", -"v< c #074291", -"w< c #073983", -"x< c #0D1346", -"y< c #092B72", -"z< c #06377C", -"A< c #06377D", -"B< c #084295", -"C< c #08469D", -"D< c #073D8A", -"E< c #073E8C", -"F< c #06387C", -"G< c #05326D", -"H< c #073F8C", -"I< c #06387D", -"J< c #043578", -"K< c #083273", -"L< c #0C3476", -"M< c #0C367A", -"N< c #0D3A83", -"O< c #0C3982", -"P< c #0D3C88", -"Q< c #0D3C87", -"R< c #0C3579", -"S< c #074396", -"T< c #06367A", -"U< c #073D89", -"V< c #093786", -"W< c #0B1C58", -"X< c #063D88", -"Y< c #08479F", -"Z< c #074193", -"`< c #06397F", -" [ c #063981", -".[ c #08489E", -"+[ c #073D87", -"@[ c #123A82", -"#[ c #133C85", -"$[ c #153B86", -"%[ c #153B85", -"&[ c #163B84", -"*[ c #173C86", -"=[ c #173C85", -"-[ c #173D87", -";[ c #173D88", -">[ c #173D89", -",[ c #173E89", -"'[ c #173E8A", -")[ c #173C87", -"![ c #183E8A", -"~[ c #183E89", -"{[ c #183E8B", -"][ c #173C88", -"^[ c #173D8A", -"/[ c #173E8B", -"([ c #173F8D", -"_[ c #173B83", -":[ c #173F8C", -"<[ c #173B84", -"[[ c #173A82", -"}[ c #183D8A", -"|[ c #183F8C", -"1[ c #173E8C", -"2[ c #18408E", -"3[ c #173F8E", -"4[ c #183E8C", -"5[ c #173B85", -"6[ c #183D89", -"7[ c #183F8D", -"8[ c #183C84", -"9[ c #153B84", -"0[ c #08479D", -"a[ c #052F6A", -"b[ c #073C89", -"c[ c #053270", -"d[ c #063D89", -"e[ c #0C2A74", -"f[ c #0C0F43", -"g[ c #082C6F", -"h[ c #063B84", -"i[ c #063677", -"j[ c #05387F", -"k[ c #063F8D", -"l[ c #063C87", -"m[ c #063E8B", -"n[ c #063A81", -"o[ c #063B86", -"p[ c #073F8B", -"q[ c #07408F", -"r[ c #07459A", -"s[ c #133B86", -"t[ c #153D87", -"u[ c #193E8A", -"v[ c #183D88", -"w[ c #183D87", -"x[ c #193D88", -"y[ c #153F8D", -"z[ c #052F6B", -"A[ c #05316F", -"B[ c #063D86", -"C[ c #074296", -"D[ c #063D85", -"E[ c #083783", -"F[ c #0C154E", -"G[ c #000101", -"H[ c #3A3A3A", -"I[ c #0C0C3A", -"J[ c #0B1D5C", -"K[ c #053B81", -"L[ c #053473", -"M[ c #053576", -"N[ c #074090", -"O[ c #063D8A", -"P[ c #064192", -"Q[ c #07469B", -"R[ c #063C84", -"S[ c #053474", -"T[ c #063D87", -"U[ c #04387C", -"V[ c #113B84", -"W[ c #163E89", -"X[ c #143C85", -"Y[ c #063A84", -"Z[ c #05326F", -"`[ c #064397", -" } c #0848A3", -".} c #08469C", -"+} c #06408F", -"@} c #0A286D", -"#} c #0D0C3B", -"$} c #070926", -"%} c #0D1246", -"&} c #072B6B", -"*} c #03326E", -"=} c #06397E", -"-} c #08479E", -";} c #074395", -">} c #074598", -",} c #053677", -"'} c #074293", -")} c #063C85", -"!} c #063676", -"~} c #04397E", -"{} c #143D87", -"]} c #184090", -"^} c #184191", -"/} c #184192", -"(} c #053472", -"_} c #074294", -":} c #0848A0", -"<} c #062E72", -"[} c #0C0C3B", -"}} c #0A1F5D", -"|} c #053575", -"1} c #074394", -"2} c #074393", -"3} c #05397E", -"4} c #063F8B", -"5} c #06418F", -"6} c #053B85", -"7} c #0749A3", -"8} c #053A7F", -"9} c #05397D", -"0} c #153980", -"a} c #143577", -"b} c #133271", -"c} c #112C62", -"d} c #15397E", -"e} c #183F8B", -"f} c #153C86", -"g} c #054190", -"h} c #063A80", -"i} c #063779", -"j} c #084DAB", -"k} c #074496", -"l} c #07469C", -"m} c #063E89", -"n} c #063C86", -"o} c #053F89", -"p} c #0A276A", -"q} c #0D0E40", -"r} c #060924", -"s} c #07317A", -"t} c #06387B", -"u} c #074498", -"v} c #05306B", -"w} c #06397D", -"x} c #074295", -"y} c #153A80", -"z} c #0E2551", -"A} c #0D224C", -"B} c #0C2047", -"C} c #0C1F44", -"D} c #0B1D41", -"E} c #0B1C3E", -"F} c #0B1C3D", -"G} c #0B1A39", -"H} c #143473", -"I} c #153E8A", -"J} c #05387D", -"K} c #07469A", -"L} c #0748A1", -"M} c #053577", -"N} c #064290", -"O} c #073B8A", -"P} c #0B1750", -"Q} c #0C0E40", -"R} c #0A1E5D", -"S} c #063F8C", -"T} c #06408D", -"U} c #053F8D", -"V} c #06418E", -"W} c #053678", -"X} c #064190", -"Y} c #053C84", -"Z} c #043E8B", -"`} c #043C85", -" | c #143E8B", -".| c #193D89", -"+| c #163B83", -"@| c #0F2757", -"#| c #0D2149", -"$| c #0B1D40", -"%| c #0B1D3F", -"&| c #0C1E41", -"*| c #0C1E42", -"=| c #0C1F43", -"-| c #0C1E40", -";| c #143575", -">| c #18408F", -",| c #143C86", -"'| c #043B83", -")| c #063B85", -"!| c #053E87", -"~| c #064191", -"{| c #043C83", -"]| c #0A286E", -"^| c #04061B", -"/| c #09337D", -"(| c #053B80", -"_| c #05408E", -":| c #053D87", -"<| c #053B83", -"[| c #064497", -"}| c #063F8E", -"|| c #064292", -"1| c #064597", -"2| c #05408F", -"3| c #054294", -"4| c #044395", -"5| c #163D89", -"6| c #153A82", -"7| c #0D234C", -"8| c #0B1E41", -"9| c #0C1F45", -"0| c #0D224A", -"a| c #0E234D", -"b| c #0E234E", -"c| c #0D224B", -"d| c #043E89", -"e| c #064396", -"f| c #0649A2", -"g| c #064496", -"h| c #053E88", -"i| c #064498", -"j| c #083E93", -"k| c #070A27", -"l| c #0B1C57", -"m| c #053A80", -"n| c #042F6A", -"o| c #053D8A", -"p| c #06459A", -"q| c #05459B", -"r| c #0749A2", -"s| c #074CAB", -"t| c #07489F", -"u| c #064599", -"v| c #064395", -"w| c #054396", -"x| c #104292", -"y| c #163D87", -"z| c #0A204A", -"A| c #041942", -"B| c #001136", -"C| c #000828", -"D| c #00011F", -"E| c #000013", -"F| c #000010", -"G| c #00000F", -"H| c #00000C", -"I| c #00000B", -"J| c #00000A", -"K| c #000011", -"L| c #00000D", -"M| c #000009", -"N| c #000008", -"O| c #000007", -"P| c #000006", -"Q| c #000005", -"R| c #000822", -"S| c #0D2247", -"T| c #0C2045", -"U| c #143C88", -"V| c #053D89", -"W| c #053D85", -"X| c #074DAC", -"Y| c #053E8B", -"Z| c #064394", -"`| c #0B2771", -" 1 c #0C113F", -".1 c #2F2F2F", -"+1 c #09317C", -"@1 c #054499", -"#1 c #053E8C", -"$1 c #064090", -"%1 c #064294", -"&1 c #074FB1", -"*1 c #074AA7", -"=1 c #053E89", -"-1 c #053F8A", -";1 c #113D88", -">1 c #183C86", -",1 c #143678", -"'1 c #0D2552", -")1 c #0B1B3C", -"!1 c #0C1D3F", -"~1 c #0A1F47", -"{1 c #061A41", -"]1 c #000C2A", -"^1 c #071225", -"/1 c #242B38", -"(1 c #393E47", -"_1 c #4B4D52", -":1 c #5C5C5E", -"<1 c #5F5D5A", -"[1 c #605D58", -"}1 c #65625C", -"|1 c #6F6D67", -"11 c #726F69", -"21 c #75726C", -"31 c #787570", -"41 c #7A7772", -"51 c #6F6D68", -"61 c #6E6C68", -"71 c #6A6A66", -"81 c #595A56", -"91 c #575856", -"01 c #565755", -"a1 c #555654", -"b1 c #5B5B58", -"c1 c #585855", -"d1 c #575754", -"e1 c #595956", -"f1 c #5F5F5C", -"g1 c #5D5C59", -"h1 c #5A5A56", -"i1 c #5B5B57", -"j1 c #5E5D5A", -"k1 c #676662", -"l1 c #6D6C67", -"m1 c #696863", -"n1 c #6C6B67", -"o1 c #6C6A65", -"p1 c #716E69", -"q1 c #726F6A", -"r1 c #74726D", -"s1 c #76736E", -"t1 c #7A7872", -"u1 c #716E68", -"v1 c #797771", -"w1 c #7D7A74", -"x1 c #6F6D66", -"y1 c #7B7872", -"z1 c #797671", -"A1 c #77746F", -"B1 c #7C7973", -"C1 c #7D7A75", -"D1 c #807D78", -"E1 c #7F7D77", -"F1 c #817F79", -"G1 c #85827D", -"H1 c #84817C", -"I1 c #87857F", -"J1 c #8A8781", -"K1 c #87847E", -"L1 c #8A8782", -"M1 c #827F7A", -"N1 c #888680", -"O1 c #83807B", -"P1 c #898781", -"Q1 c #86847E", -"R1 c #817E78", -"S1 c #898681", -"T1 c #8B8883", -"U1 c #888580", -"V1 c #82807A", -"W1 c #85827C", -"X1 c #7F7C77", -"Y1 c #86837D", -"Z1 c #83807A", -"`1 c #807D77", -" 2 c #827F79", -".2 c #84817B", -"+2 c #817E79", -"@2 c #7B7973", -"#2 c #807E78", -"$2 c #7C7974", -"%2 c #7F7C76", -"&2 c #7E7B76", -"*2 c #7E7B75", -"=2 c #84827C", -"-2 c #7D7B75", -";2 c #918D85", -">2 c #36383E", -",2 c #040C2F", -"'2 c #0D2147", -")2 c #04387E", -"!2 c #06489F", -"~2 c #053F8B", -"{2 c #05387B", -"]2 c #06469B", -"^2 c #074CA7", -"/2 c #064495", -"(2 c #054598", -"_2 c #08419B", -":2 c #0B1954", -"<2 c #053A86", -"[2 c #054394", -"}2 c #06479F", -"|2 c #054192", -"12 c #043D88", -"22 c #054090", -"32 c #05418F", -"42 c #054395", -"52 c #043F8C", -"62 c #113B86", -"72 c #0C1E43", -"82 c #0A1E45", -"92 c #061A40", -"02 c #06193C", -"a2 c #0E1B31", -"b2 c #343842", -"c2 c #5B5D5F", -"d2 c #787774", -"e2 c #888681", -"f2 c #8F8D8A", -"g2 c #9D9B99", -"h2 c #B3B2B0", -"i2 c #B8B7B7", -"j2 c #BABABA", -"k2 c #BFBFBF", -"l2 c #D5D5D5", -"m2 c #DADADA", -"n2 c #E2E2E2", -"o2 c #DBDBDC", -"p2 c #D2D5D7", -"q2 c #C0C4C8", -"r2 c #AEB4B9", -"s2 c #A6ACB1", -"t2 c #A1A8AD", -"u2 c #AAB1B7", -"v2 c #A4AAAF", -"w2 c #A4ABAF", -"x2 c #B0B7BB", -"y2 c #B3BABE", -"z2 c #B4B9BE", -"A2 c #B0B4B8", -"B2 c #B4B9BC", -"C2 c #BABFC2", -"D2 c #C2C5C8", -"E2 c #C1C4C7", -"F2 c #CFD3D5", -"G2 c #CDD1D3", -"H2 c #CBCDCF", -"I2 c #D0D2D3", -"J2 c #DEE0E1", -"K2 c #E2E3E4", -"L2 c #D6D7D8", -"M2 c #DEDFDF", -"N2 c #E5E4E5", -"O2 c #DBDBDB", -"P2 c #DDDDDD", -"Q2 c #EBEBEA", -"R2 c #E9E9E8", -"S2 c #E3E3E3", -"T2 c #DBDADA", -"U2 c #E3E2E2", -"V2 c #EBEBEB", -"W2 c #F3F3F3", -"X2 c #EEEEEE", -"Y2 c #F0F0F0", -"Z2 c #F6F6F6", -"`2 c #F5F5F5", -" 3 c #F8F8F8", -".3 c #F9F9F9", -"+3 c #FFFFFF", -"@3 c #FEFEFE", -"#3 c #FCFCFC", -"$3 c #FBFBFB", -"%3 c #F2F2F2", -"&3 c #FAFAFA", -"*3 c #F1F1F1", -"=3 c #ECECEC", -"-3 c #F4F4F4", -";3 c #F7F7F7", -">3 c #EFEFEF", -",3 c #EDEDED", -"'3 c #666C75", -")3 c #000020", -"!3 c #03377D", -"~3 c #04377A", -"{3 c #043B82", -"]3 c #043678", -"^3 c #054498", -"/3 c #054497", -"(3 c #054295", -"_3 c #064499", -":3 c #064CA9", -"<3 c #06469D", -"[3 c #0B2468", -"}3 c #0D0D3C", -"|3 c #08296E", -"13 c #043A80", -"23 c #04397D", -"33 c #054292", -"43 c #043E8A", -"53 c #064AA5", -"63 c #043677", -"73 c #044396", -"83 c #044090", -"93 c #103C88", -"03 c #0C1D41", -"a3 c #0B1F46", -"b3 c #02173F", -"c3 c #06193D", -"d3 c #1E283C", -"e3 c #4F5053", -"f3 c #7C7C7B", -"g3 c #8B8986", -"h3 c #939290", -"i3 c #9B9A9A", -"j3 c #9F9F9F", -"k3 c #959595", -"l3 c #949494", -"m3 c #969696", -"n3 c #9C9C9C", -"o3 c #ABABAB", -"p3 c #B5B5B5", -"q3 c #C4C4C4", -"r3 c #C0C0C0", -"s3 c #CACACA", -"t3 c #D1D1D1", -"u3 c #C0C1C2", -"v3 c #B0B2B4", -"w3 c #A3A8AA", -"x3 c #9A9EA2", -"y3 c #92989D", -"z3 c #8E9499", -"A3 c #888E92", -"B3 c #898F93", -"C3 c #959CA0", -"D3 c #A0A7AA", -"E3 c #9BA1A5", -"F3 c #969CA0", -"G3 c #A0A5A8", -"H3 c #A8ADAF", -"I3 c #B2B6B9", -"J3 c #AEB2B4", -"K3 c #B1B4B7", -"L3 c #B9BCBE", -"M3 c #BBBEC0", -"N3 c #BBBDBE", -"O3 c #C1C3C4", -"P3 c #C5C7C7", -"Q3 c #C0C1C1", -"R3 c #C2C2C3", -"S3 c #C6C6C6", -"T3 c #C5C4C4", -"U3 c #C5C5C6", -"V3 c #C5C5C4", -"W3 c #C7C7C6", -"X3 c #CECECD", -"Y3 c #D0CFCF", -"Z3 c #C1C1C0", -"`3 c #CBCCCB", -" 4 c #D3D3D3", -".4 c #D6D6D6", -"+4 c #D8D8D8", -"@4 c #E1E1E1", -"#4 c #E8E8E8", -"$4 c #E4E4E4", -"%4 c #D9D9D9", -"&4 c #DFDFDF", -"*4 c #E0E0E0", -"=4 c #E5E5E5", -"-4 c #D7D7D7", -";4 c #CFCFCF", -">4 c #D2D2D2", -",4 c #DEDEDE", -"'4 c #DCDCDC", -")4 c #D0D0D0", -"!4 c #D4D4D4", -"~4 c #F3F1EE", -"{4 c #5D626B", -"]4 c #000023", -"^4 c #084395", -"/4 c #044190", -"(4 c #053B82", -"_4 c #054291", -":4 c #05459A", -"<4 c #0752B8", -"[4 c #0549A2", -"}4 c #054599", -"|4 c #0650AF", -"14 c #083582", -"24 c #0D164F", -"34 c #063173", -"44 c #043D83", -"54 c #05397A", -"64 c #064BA2", -"74 c #064392", -"84 c #053A7E", -"94 c #0649A0", -"04 c #064AA3", -"a4 c #05408D", -"b4 c #054391", -"c4 c #054290", -"d4 c #064AA2", -"e4 c #074EAA", -"f4 c #064CA6", -"g4 c #06499D", -"h4 c #053C82", -"i4 c #053F88", -"j4 c #043572", -"k4 c #03408D", -"l4 c #163A83", -"m4 c #0E2552", -"n4 c #081C44", -"o4 c #00133B", -"p4 c #16233C", -"q4 c #4C4E52", -"r4 c #858381", -"s4 c #908F8E", -"t4 c #8C8B8B", -"u4 c #8C8C8C", -"v4 c #888888", -"w4 c #8F8F8F", -"x4 c #979797", -"y4 c #929292", -"z4 c #9B9B9B", -"A4 c #A5A5A5", -"B4 c #B0B0B0", -"C4 c #BEBEBE", -"D4 c #C3C3C3", -"E4 c #C2C3C3", -"F4 c #BBBEBF", -"G4 c #ABAFB2", -"H4 c #8E9498", -"I4 c #8A9094", -"J4 c #8C9397", -"K4 c #939A9E", -"L4 c #989FA3", -"M4 c #979CA1", -"N4 c #949A9E", -"O4 c #9CA1A5", -"P4 c #A8ADB0", -"Q4 c #A9AEB0", -"R4 c #AEB2B5", -"S4 c #AFB3B6", -"T4 c #B0B3B5", -"U4 c #B6B8B9", -"V4 c #C4C6C7", -"W4 c #C4C7C9", -"X4 c #BEBFC0", -"Y4 c #B6B7B7", -"Z4 c #C5C5C5", -"`4 c #C9C9C9", -" 5 c #D2D1D1", -".5 c #EAEAEA", -"+5 c #E7E7E7", -"@5 c #E6E6E6", -"#5 c #CDCDCD", -"$5 c #F9F7F4", -"%5 c #143D89", -"&5 c #044492", -"*5 c #064595", -"=5 c #053E86", -"-5 c #05428E", -";5 c #06489C", -">5 c #06479B", -",5 c #064291", -"'5 c #0749A1", -")5 c #0756BC", -"!5 c #0753B5", -"~5 c #074BA3", -"{5 c #064393", -"]5 c #054696", -"^5 c #0749A4", -"/5 c #0C0D39", -"(5 c #0D0C38", -"_5 c #092367", -":5 c #033785", -"<5 c #023987", -"[5 c #033C90", -"}5 c #03429B", -"|5 c #033885", -"15 c #02347C", -"25 c #033E93", -"35 c #033B8E", -"45 c #033783", -"55 c #033276", -"65 c #023379", -"75 c #033781", -"85 c #03357B", -"95 c #034098", -"05 c #0343A0", -"a5 c #033F94", -"b5 c #033C8D", -"c5 c #033A8B", -"d5 c #02357E", -"e5 c #03347D", -"f5 c #02367F", -"g5 c #01357F", -"h5 c #0D234D", -"i5 c #0D2044", -"j5 c #071B44", -"k5 c #05173A", -"l5 c #363D4B", -"m5 c #757370", -"n5 c #8F8F8E", -"o5 c #858585", -"p5 c #808080", -"q5 c #848484", -"r5 c #868686", -"s5 c #878787", -"t5 c #989898", -"u5 c #939393", -"v5 c #9E9E9E", -"w5 c #A0A0A0", -"x5 c #A4A4A4", -"y5 c #A3A3A3", -"z5 c #BCBCBC", -"A5 c #CECECE", -"B5 c #CCCCCC", -"C5 c #C5C6C6", -"D5 c #BBBCBE", -"E5 c #ADB0B3", -"F5 c #979C9F", -"G5 c #8B9195", -"H5 c #989FA4", -"I5 c #959BA1", -"J5 c #8D9296", -"K5 c #93999C", -"L5 c #989EA2", -"M5 c #A7ADB0", -"N5 c #AAADB0", -"O5 c #B4B7BA", -"P5 c #B8BDBE", -"Q5 c #B1B5B5", -"R5 c #BEC0C3", -"S5 c #C6C9CB", -"T5 c #C0C2C3", -"U5 c #C2C3C4", -"V5 c #CDCDCE", -"W5 c #BDBDBD", -"X5 c #C2C2C2", -"Y5 c #D2D0D0", -"Z5 c #CBCACA", -"`5 c #E9E9E9", -" 6 c #F6F4F1", -".6 c #60656E", -"+6 c #143A83", -"@6 c #053781", -"#6 c #02337A", -"$6 c #033378", -"%6 c #02357D", -"&6 c #023279", -"*6 c #033E94", -"=6 c #023885", -"-6 c #03367D", -";6 c #033A8A", -">6 c #0449AD", -",6 c #0447A6", -"'6 c #033F97", -")6 c #033B8C", -"!6 c #034096", -"~6 c #033C8C", -"{6 c #033E92", -"]6 c #072972", -"^6 c #0D0D3A", -"/6 c #020207", -"(6 c #0D1141", -"_6 c #022670", -":6 c #003793", -"<6 c #003086", -"[6 c #003083", -"}6 c #002A78", -"|6 c #00276E", -"16 c #002B78", -"26 c #00276F", -"36 c #002D7E", -"46 c #002D7A", -"56 c #002B76", -"66 c #002A74", -"76 c #002466", -"86 c #002973", -"96 c #003289", -"06 c #002B7A", -"a6 c #002C7A", -"b6 c #002971", -"c6 c #00276C", -"d6 c #002873", -"e6 c #05307F", -"f6 c #173B86", -"g6 c #0D234E", -"h6 c #13223E", -"i6 c #595C60", -"j6 c #8C8A85", -"k6 c #8B8A8A", -"l6 c #7A7A7A", -"m6 c #7D7D7D", -"n6 c #818181", -"o6 c #909090", -"p6 c #919191", -"q6 c #9A9A9A", -"r6 c #A1A1A1", -"s6 c #B8B8B8", -"t6 c #CBCBCB", -"u6 c #CDCECE", -"v6 c #B5B7B9", -"w6 c #A3A6A9", -"x6 c #94989C", -"y6 c #94999E", -"z6 c #969DA1", -"A6 c #8E959A", -"B6 c #91979B", -"C6 c #999FA2", -"D6 c #A1A7AB", -"E6 c #A6ABAE", -"F6 c #A6ABAD", -"G6 c #A9ACB0", -"H6 c #B0B3B6", -"I6 c #BABEBF", -"J6 c #B5B8BA", -"K6 c #B8BABB", -"L6 c #C6C8C8", -"M6 c #CDCDCF", -"N6 c #CBCCCD", -"O6 c #C0C0C1", -"P6 c #FFFEFB", -"Q6 c #61666F", -"R6 c #000022", -"S6 c #193E89", -"T6 c #143B87", -"U6 c #02296C", -"V6 c #002363", -"W6 c #00266D", -"X6 c #002A76", -"Y6 c #002B77", -"Z6 c #003084", -"`6 c #002C79", -" 7 c #003087", -".7 c #00328A", -"+7 c #00338E", -"@7 c #00338F", -"#7 c #002F85", -"$7 c #002E7F", -"%7 c #003187", -"&7 c #003286", -"*7 c #002F86", -"=7 c #091753", -"-7 c #0E103D", -";7 c #05071D", -">7 c #0E0F3B", -",7 c #071A5A", -"'7 c #00318A", -")7 c #002F7D", -"!7 c #00286B", -"~7 c #003081", -"{7 c #003185", -"]7 c #00307F", -"^7 c #002F7E", -"/7 c #002B74", -"(7 c #002E7D", -"_7 c #003288", -":7 c #002F80", -"<7 c #003184", -"[7 c #002A72", -"}7 c #002B73", -"|7 c #002F7F", -"17 c #003082", -"27 c #002C78", -"37 c #002A71", -"47 c #023287", -"57 c #143B8A", -"67 c #163C85", -"77 c #0E2553", -"87 c #0A1E43", -"97 c #00153F", -"07 c #232F4A", -"a7 c #717170", -"b7 c #8F8D89", -"c7 c #838383", -"d7 c #7B7B7B", -"e7 c #7C7C7C", -"f7 c #828282", -"g7 c #898989", -"h7 c #AFAFAF", -"i7 c #B6B6B6", -"j7 c #CCCCCD", -"k7 c #B5B7B8", -"l7 c #949B9F", -"m7 c #8A8F94", -"n7 c #888D92", -"o7 c #878D90", -"p7 c #979DA1", -"q7 c #969C9F", -"r7 c #A2A7AA", -"s7 c #A7ACAF", -"t7 c #A4A7AA", -"u7 c #A5A8AB", -"v7 c #B4B7B9", -"w7 c #B8BBBD", -"x7 c #BABCBE", -"y7 c #BABBBC", -"z7 c #CDCECF", -"A7 c #C3C3C4", -"B7 c #BFC0BF", -"C7 c #C3C4C4", -"D7 c #D3D3D2", -"E7 c #D6D6D5", -"F7 c #FAF8F5", -"G7 c #143A84", -"H7 c #032E77", -"I7 c #002A75", -"J7 c #002E7C", -"K7 c #003287", -"L7 c #002C77", -"M7 c #003A9D", -"N7 c #003A9B", -"O7 c #00348E", -"P7 c #00358F", -"Q7 c #003183", -"R7 c #002D78", -"S7 c #00338A", -"T7 c #003BA1", -"U7 c #061F64", -"V7 c #0E0D39", -"W7 c #0D0E3E", -"X7 c #042168", -"Y7 c #003690", -"Z7 c #00348B", -"`7 c #003388", -" 8 c #003080", -".8 c #002D7B", -"+8 c #002E7A", -"@8 c #003182", -"#8 c #002E79", -"$8 c #002B75", -"%8 c #0F3989", -"&8 c #193E88", -"*8 c #102A5D", -"=8 c #00133D", -"-8 c #2A3751", -";8 c #848383", -">8 c #959391", -",8 c #797979", -"'8 c #7F7F7F", -")8 c #8D8D8D", -"!8 c #8E8E8E", -"~8 c #9D9D9D", -"{8 c #A6A6A6", -"]8 c #B3B3B3", -"^8 c #BDBEBD", -"/8 c #BEBEC0", -"(8 c #B7BBBE", -"_8 c #A2A7AB", -":8 c #8B9094", -"<8 c #94999D", -"[8 c #9AA0A4", -"}8 c #989DA1", -"|8 c #A3A8AB", -"18 c #ABB0B2", -"28 c #B1B5B8", -"38 c #B1B5B7", -"48 c #BEC0C1", -"58 c #C9CBCC", -"68 c #C9CBCB", -"78 c #BEBFBF", -"88 c #C1C1C2", -"98 c #C4C4C3", -"08 c #D2D2D1", -"a8 c #D3D3D1", -"b8 c #CFCFCE", -"c8 c #5C616A", -"d8 c #000024", -"e8 c #143C8B", -"f8 c #03307E", -"g8 c #002D79", -"h8 c #003389", -"i8 c #002E7B", -"j8 c #003284", -"k8 c #00358D", -"l8 c #00358E", -"m8 c #003999", -"n8 c #003A99", -"o8 c #022B80", -"p8 c #0B1248", -"q8 c #0D1140", -"r8 c #040512", -"s8 c #0D103F", -"t8 c #0A154E", -"u8 c #002978", -"v8 c #00348A", -"w8 c #003792", -"x8 c #003387", -"y8 c #00348C", -"z8 c #00307E", -"A8 c #003C9F", -"B8 c #002970", -"C8 c #002A6F", -"D8 c #002C76", -"E8 c #002768", -"F8 c #083586", -"G8 c #183F8E", -"H8 c #00133C", -"I8 c #2D3B55", -"J8 c #9C9C9A", -"K8 c #8B8B8B", -"L8 c #767676", -"M8 c #737373", -"N8 c #A8A8A8", -"O8 c #B7B7B7", -"P8 c #C1C1C1", -"Q8 c #C7C7C7", -"R8 c #C4C7C8", -"S8 c #898F94", -"T8 c #8C9297", -"U8 c #9A9FA4", -"V8 c #93989C", -"W8 c #A9ADB2", -"X8 c #ADB0B1", -"Y8 c #B9BBBC", -"Z8 c #C6C8CA", -"`8 c #C6C8C9", -" 9 c #BDBEBF", -".9 c #C3C3C2", -"+9 c #F5F3F0", -"@9 c #5E636C", -"#9 c #143B86", -"$9 c #03317D", -"%9 c #002F7C", -"&9 c #003285", -"*9 c #00348D", -"=9 c #003B9D", -"-9 c #003893", -";9 c #003698", -">9 c #091855", -",9 c #0D0F3C", -"'9 c #060921", -")9 c #091851", -"!9 c #00368F", -"~9 c #003794", -"{9 c #003894", -"]9 c #003998", -"^9 c #00358C", -"/9 c #00296E", -"(9 c #002A70", -"_9 c #022B73", -":9 c #193F8A", -"<9 c #143578", -"[9 c #0B1E44", -"}9 c #0B1E40", -"|9 c #0D2045", -"19 c #01163E", -"29 c #273551", -"39 c #A09E9D", -"49 c #8A8A8A", -"59 c #7E7E7E", -"69 c #999999", -"79 c #B2B2B2", -"89 c #D5D6D5", -"99 c #C1C3C5", -"09 c #A3A7AA", -"a9 c #9BA1A4", -"b9 c #919699", -"c9 c #9CA2A6", -"d9 c #A5A9AD", -"e9 c #A8ACAF", -"f9 c #A6A9AC", -"g9 c #B2B5B7", -"h9 c #BBBDBD", -"i9 c #BDBDBE", -"j9 c #DCDCDB", -"k9 c #DBDBDA", -"l9 c #D1D0D1", -"m9 c #143B85", -"n9 c #03358A", -"o9 c #002A73", -"p9 c #003A98", -"q9 c #003DA1", -"r9 c #062169", -"s9 c #03246F", -"t9 c #00399B", -"u9 c #003592", -"v9 c #00348F", -"w9 c #00389B", -"x9 c #003691", -"y9 c #002669", -"z9 c #003795", -"A9 c #00338B", -"B9 c #0D3784", -"C9 c #1A3F8A", -"D9 c #04183F", -"E9 c #172949", -"F9 c #909195", -"G9 c #AFADAB", -"H9 c #777777", -"I9 c #747474", -"J9 c #D1D2D2", -"K9 c #B9B9BB", -"L9 c #A8ACAE", -"M9 c #9FA5AA", -"N9 c #979DA2", -"O9 c #8E969B", -"P9 c #8E9599", -"Q9 c #9BA0A4", -"R9 c #ADB0B2", -"S9 c #BFC2C5", -"T9 c #BABCBD", -"U9 c #B9BBBB", -"V9 c #C3C4C3", -"W9 c #C8C8C8", -"X9 c #F4F2EF", -"Y9 c #5F646D", -"Z9 c #032F7C", -"`9 c #002F81", -" 0 c #003AA1", -".0 c #003897", -"+0 c #003692", -"@0 c #002D85", -"#0 c #0B1349", -"$0 c #0240A2", -"%0 c #004CB3", -"&0 c #00439D", -"*0 c #003E95", -"=0 c #00439F", -"-0 c #0045A2", -";0 c #00419A", -">0 c #003F94", -",0 c #00357E", -"'0 c #00347B", -")0 c #003A89", -"!0 c #003C8C", -"~0 c #003F95", -"{0 c #003B8B", -"]0 c #003C8F", -"^0 c #003C8E", -"/0 c #00367F", -"(0 c #003783", -"_0 c #003988", -":0 c #043783", -"<0 c #17408E", -"[0 c #102D63", -"}0 c #0B1B3B", -"|0 c #06183F", -"10 c #071A41", -"20 c #808590", -"30 c #C2C0BC", -"40 c #B0AFAF", -"50 c #A7A7A7", -"60 c #AAAEB1", -"70 c #979DA0", -"80 c #91969B", -"90 c #A0A6AA", -"00 c #A1A6A9", -"a0 c #B4B8BA", -"b0 c #AFB2B4", -"c0 c #B3B5B7", -"d0 c #D0D1D1", -"e0 c #CCCBCB", -"f0 c #D9D9DA", -"g0 c #FBF9F6", -"h0 c #03367E", -"i0 c #004098", -"j0 c #0049AE", -"k0 c #003E94", -"l0 c #004095", -"m0 c #003F96", -"n0 c #003B8C", -"o0 c #003E91", -"p0 c #003884", -"q0 c #003A88", -"r0 c #003379", -"s0 c #003986", -"t0 c #0044A3", -"u0 c #003C8D", -"v0 c #003A8D", -"w0 c #0A164E", -"x0 c #0548A2", -"y0 c #044CA7", -"z0 c #044FAF", -"A0 c #0450B1", -"B0 c #03479C", -"C0 c #0451B2", -"D0 c #0449A2", -"E0 c #033E89", -"F0 c #033676", -"G0 c #04469C", -"H0 c #034497", -"I0 c #044598", -"J0 c #034191", -"K0 c #03469A", -"L0 c #044599", -"M0 c #04418F", -"N0 c #033D86", -"O0 c #033C84", -"P0 c #02397E", -"Q0 c #091C42", -"R0 c #000D36", -"S0 c #5C6679", -"T0 c #CBC9C4", -"U0 c #B6B6B5", -"V0 c #ADAEAE", -"W0 c #787878", -"X0 c #A9A9A9", -"Y0 c #B4B4B4", -"Z0 c #B9B9B9", -"`0 c #C7C7C9", -" a c #969B9F", -".a c #878C91", -"+a c #8B9296", -"@a c #B3B7BA", -"#a c #AFB2B3", -"$a c #B4B5B6", -"%a c #C1C2C2", -"&a c #D4D5D4", -"*a c #D4D4D3", -"=a c #5B6069", -"-a c #0349A2", -";a c #044CA6", -">a c #044BA4", -",a c #034599", -"'a c #044497", -")a c #034393", -"!a c #034496", -"~a c #044494", -"{a c #03408F", -"]a c #033F8A", -"^a c #04489E", -"/a c #04479F", -"(a c #04479D", -"_a c #0449A1", -":a c #03418F", -"b c #003078", -",b c #003586", -"'b c #003A93", -")b c #003382", -"!b c #00317D", -"~b c #003484", -"{b c #00307A", -"]b c #003890", -"^b c #133374", -"/b c #05193F", -"(b c #0B1D43", -"_b c #898E97", -":b c #C6C4C1", -"c c #003995", -",c c #002E78", -"'c c #00296B", -")c c #003180", -"!c c #002E77", -"~c c #003487", -"{c c #0E3883", -"]c c #152649", -"^c c #9DA0A4", -"/c c #BEBDBB", -"(c c #727272", -"_c c #CBCACB", -":c c #8E9398", -"d c #9BA0A3", -",d c #9DA1A4", -"'d c #A4A7A9", -")d c #B4B6B6", -"!d c #BCBCBD", -"~d c #D8D7D7", -"{d c #E3E2DF", -"]d c #565B64", -"^d c #000225", -"/d c #143C8A", -"(d c #033180", -"_d c #003A96", -":d c #003B9C", -"e c #02408E", -",e c #024396", -"'e c #023D8A", -")e c #023D8C", -"!e c #0249A2", -"~e c #024AA5", -"{e c #024091", -"]e c #024191", -"^e c #024092", -"/e c #023F8E", -"(e c #023D88", -"_e c #02408F", -":e c #023F8D", -"f c #E9E8E4", -",f c #E5E4E0", -"'f c #E8E7E3", -")f c #EAE9E6", -"!f c #F4F3F0", -"~f c #EFEDEA", -"{f c #F9F8F4", -"]f c #F5F4F0", -"^f c #E7E6E3", -"/f c #D6D5D2", -"(f c #D3D1CE", -"_f c #E0DEDB", -":f c #E7E6E2", -"g c #666970", -",g c #696C74", -"'g c #6E7179", -")g c #787B82", -"!g c #7A7D84", -"~g c #84878E", -"{g c #9A9DA4", -"]g c #A2A5AC", -"^g c #8C929B", -"/g c #767F89", -"(g c #7A838D", -"_g c #7A818B", -":g c #7E848D", -"h c #0E0C3A", -",h c #0E0D3A", -"'h c #082063", -")h c #003591", -"!h c #003898", -"~h c #002E7E", -"{h c #003896", -"]h c #07368C", -"^h c #133372", -"/h c #384560", -"(h c #ACAAA7", -"_h c #989693", -":h c #505663", -"i c #022C7F", -",i c #0D1040", -"'i c #3E3E3E", -")i c #032878", -"!i c #003B97", -"~i c #003B9B", -"{i c #013488", -"]i c #123A87", -"^i c #0D244F", -"/i c #18294B", -"(i c #9C9EA3", -"_i c #BBBBBA", -":i c #C1C0BD", -"j c #0D0E3B", -",j c #030310", -"'j c #091853", -")j c #003BA2", -"!j c #003EA5", -"~j c #0C3A8C", -"{j c #0B1E42", -"]j c #8D93A1", -"^j c #DEDDDC", -"/j c #9B9A97", -"(j c #32373E", -"_j c #19408F", -":j c #194294", -"k c #0156BD", -",k c #0153B7", -"'k c #014BA6", -")k c #014FAE", -"!k c #0155BB", -"~k c #0151B3", -"{k c #133F8B", -"]k c #283859", -"^k c #DADBDD", -"/k c #ECEBEA", -"(k c #A6A5A5", -"_k c #5A5B5C", -":k c #05132C", -"l c #D6D4D0", -",l c #8A8F98", -"'l c #172749", -")l c #133370", -"!l c #1A3C85", -"~l c #154291", -"{l c #044DAC", -"]l c #004EAC", -"^l c #014EAB", -"/l c #014CA8", -"(l c #014294", -"_l c #01469C", -":l c #013F8B", -"m c #003DA2", -",m c #0040A9", -"'m c #0044B4", -")m c #003A9C", -"!m c #083B95", -"~m c #001239", -"{m c #9198A6", -"]m c #E8E8E6", -"^m c #E1E1E0", -"/m c #1C1D1F", -"(m c #001033", -"_m c #0C234D", -":m c #113F93", -"n c #E1E0DE", -",n c #E2E0DC", -"'n c #273651", -")n c #000C36", -"!n c #081B41", -"~n c #1A3E89", -"{n c #123984", -"]n c #03388D", -"^n c #003E9F", -"/n c #002A6C", -"(n c #0042AA", -"_n c #0044AF", -":n c #0040A4", -"o c #093582", -",o c #00327F", -"'o c #002C72", -")o c #02287C", -"!o c #04071D", -"~o c #092266", -"{o c #0053BC", -"]o c #0058C8", -"^o c #0053BE", -"/o c #004CAD", -"(o c #0050B7", -"_o c #00469E", -":o c #0054BF", -"p c #0051AE", -",p c #0050AD", -"'p c #014BA3", -")p c #133F8C", -"!p c #153779", -"~p c #56627A", -"{p c #D8D8D6", -"]p c #C4C3C2", -"^p c #1D1E20", -"/p c #0E4496", -"(p c #0054B5", -"_p c #0050AE", -":p c #004AA1", -"

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 a8t1II^`k8A3D|dAKE583MmC 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'ySgZz(J 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®xs7f4YmTd-|3k0- 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 Ay8r+H literal 0 HcmV?d00001 diff --git a/bin/windows/zmusic/arm64/zmusic.dll b/bin/windows/zmusic/arm64/zmusic.dll new file mode 100644 index 0000000000000000000000000000000000000000..0efcc605b2dc89132ff7ff7dd82fec2e5ef89382 GIT binary patch literal 2298880 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